Merge "API: Check for nosuchsection in all code paths"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 24 Sep 2013 22:46:01 +0000 (22:46 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 24 Sep 2013 22:46:01 +0000 (22:46 +0000)
234 files changed:
.jshintignore
RELEASE-NOTES-1.22
docs/hooks.txt
includes/Action.php
includes/Article.php
includes/AutoLoader.php
includes/ChangeTags.php
includes/DefaultSettings.php
includes/Exception.php
includes/GitInfo.php
includes/GlobalFunctions.php
includes/HTMLForm.php
includes/HtmlFormatter.php [new file with mode: 0644]
includes/IP.php
includes/MagicWord.php
includes/OutputPage.php
includes/Preferences.php
includes/Sanitizer.php
includes/Skin.php
includes/SkinTemplate.php
includes/StringUtils.php
includes/StubObject.php
includes/Title.php
includes/User.php
includes/WebRequest.php
includes/WebStart.php
includes/Wiki.php
includes/api/ApiFeedContributions.php
includes/api/ApiQueryBacklinks.php
includes/clientpool/RedisConnectionPool.php
includes/db/DatabaseOracle.php
includes/db/DatabaseSqlite.php
includes/diff/DifferenceEngine.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/installer/DatabaseUpdater.php
includes/installer/InstallDocFormatter.php
includes/installer/Installer.i18n.php
includes/installer/MysqlInstaller.php
includes/job/jobs/RefreshLinksJob.php
includes/libs/CSSMin.php
includes/libs/lessc.inc.php [new file with mode: 0644]
includes/logging/LogPager.php
includes/parser/CoreParserFunctions.php
includes/parser/Parser.php
includes/parser/Preprocessor_DOM.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/revisiondelete/RevisionDelete.php
includes/revisiondelete/RevisionDeleteAbstracts.php
includes/revisiondelete/RevisionDeleter.php
includes/search/SearchEngine.php
includes/site/SiteSQLStore.php
includes/specials/SpecialBlock.php
includes/specials/SpecialImport.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialTags.php
includes/specials/SpecialUnblock.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUploadStash.php
languages/Language.php
languages/classes/LanguageEo.php
languages/messages/MessagesAf.php
languages/messages/MessagesAr.php
languages/messages/MessagesAs.php
languages/messages/MessagesBcl.php
languages/messages/MessagesBg.php
languages/messages/MessagesBn.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesCa.php
languages/messages/MessagesCe.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCs.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDv.php
languages/messages/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesEu.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFo.php
languages/messages/MessagesFr.php
languages/messages/MessagesHe.php
languages/messages/MessagesHu.php
languages/messages/MessagesId.php
languages/messages/MessagesIlo.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesKa.php
languages/messages/MessagesKo.php
languages/messages/MessagesLa.php
languages/messages/MessagesLb.php
languages/messages/MessagesLt.php
languages/messages/MessagesLv.php
languages/messages/MessagesMg.php
languages/messages/MessagesMs.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesOc.php
languages/messages/MessagesPa.php
languages/messages/MessagesPdc.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesRu.php
languages/messages/MessagesSah.php
languages/messages/MessagesScn.php
languages/messages/MessagesSi.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesSv.php
languages/messages/MessagesTh.php
languages/messages/MessagesTl.php
languages/messages/MessagesTr.php
languages/messages/MessagesTyv.php
languages/messages/MessagesUk.php
languages/messages/MessagesVep.php
languages/messages/MessagesVmf.php
languages/messages/MessagesWuu.php
languages/messages/MessagesYi.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
maintenance/Maintenance.php
maintenance/dictionary/mediawiki.dic
maintenance/doMaintenance.php
maintenance/language/messageTypes.inc
maintenance/language/messages.inc
maintenance/mctest.php
maintenance/mssql/tables.sql
maintenance/oracle/tables.sql
maintenance/postgres/tables.sql
maintenance/tidyUpBug37714.php [new file with mode: 0644]
maintenance/update.php
maintenance/userDupes.inc
resources/Resources.php
resources/jquery.chosen/chosen-sprite@2x.png
resources/jquery.tipsy/images/tipsy.png
resources/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png
resources/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png
resources/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png
resources/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png
resources/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png
resources/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png
resources/jquery.ui/themes/vector/images/titlebar-fade.png
resources/jquery/images/jquery.arrowSteps.divider-ltr.png
resources/jquery/images/jquery.arrowSteps.divider-rtl.png
resources/jquery/images/jquery.arrowSteps.head-ltr.png
resources/jquery/images/jquery.arrowSteps.head-rtl.png
resources/jquery/images/jquery.arrowSteps.tail-ltr.png
resources/jquery/images/marker.png
resources/jquery/images/mask.png
resources/jquery/jquery.makeCollapsible.js
resources/jquery/jquery.suggestions.js
resources/jquery/jquery.tablesorter.js
resources/mediawiki.api/mediawiki.api.category.js
resources/mediawiki.api/mediawiki.api.edit.js
resources/mediawiki.api/mediawiki.api.parse.js
resources/mediawiki.api/mediawiki.api.watch.js
resources/mediawiki.less/mediawiki.mixins.less [new file with mode: 0644]
resources/mediawiki.special/images/glyph-people-large.png
resources/mediawiki.special/images/icon-contributors.png
resources/mediawiki.special/images/icon-edits.png
resources/mediawiki.special/images/icon-lock.png
resources/mediawiki.special/images/icon-pages.png
resources/mediawiki/images/arrow-collapsed-ltr.png
resources/mediawiki/images/arrow-collapsed-rtl.png
resources/mediawiki/images/arrow-expanded.png
resources/mediawiki/mediawiki.user.js
resources/mediawiki/mediawiki.util.js
skins/common/images/Arr_u.png
skins/common/images/ar/button_headline.png
skins/common/images/ar/button_nowiki.png
skins/common/images/arrow_disabled_left_25.png
skins/common/images/arrow_disabled_right_25.png
skins/common/images/arrow_right_25.png
skins/common/images/button_hr.png
skins/common/images/button_nowiki.png
skins/common/images/button_sig.png
skins/common/images/button_template.png
skins/common/images/critical-32.png
skins/common/images/fa/button_nowiki.png
skins/common/images/feed-icon.png
skins/common/images/magnify-clip-rtl.png
skins/common/images/question-small.png
skins/common/images/tick-32.png
skins/common/images/warning-32.png
skins/common/protect.js
skins/common/upload.js
skins/common/wikiprintable.css [deleted file]
skins/modern/external.png
skins/modern/main.css
skins/monobook/IE60Fixes.css
skins/monobook/external-ltr.png
skins/monobook/external-rtl.png
skins/monobook/main.css
skins/vector/images/edit-icon.png
skins/vector/images/external-link-ltr-icon.png
skins/vector/images/external-link-rtl-icon.png
skins/vector/images/mail-icon.png
skins/vector/images/news-icon.png
skins/vector/images/page-fade.png
skins/vector/images/portal-break-ltr.png
skins/vector/images/preferences-break.png
skins/vector/images/tab-break.png
skins/vector/images/talk-icon.png
skins/vector/images/video-icon.png
skins/vector/screen.css
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/data/less/common/test.common.mixins.less [new file with mode: 0644]
tests/phpunit/data/less/module/dependency.less [new file with mode: 0644]
tests/phpunit/data/less/module/styles.css [new file with mode: 0644]
tests/phpunit/data/less/module/styles.less [new file with mode: 0644]
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/HtmlFormatterTest.php [new file with mode: 0644]
tests/phpunit/includes/ResourceLoaderTest.php
tests/phpunit/includes/StringUtilsTest.php
tests/phpunit/includes/db/DatabaseTest.php
tests/phpunit/includes/installer/InstallDocFormatterTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
thumb.php

index ad5e959..bc10ad8 100644 (file)
@@ -28,8 +28,6 @@ resources/jquery.chosen/chosen.jquery.js
 # legacy scripts
 skins/common/IEFixes.js
 skins/common/config.js
-skins/common/protect.js
-skins/common/upload.js
 
 # github.com/jshint/jshint/issues/729
 tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
index a2a53e0..957ee64 100644 (file)
@@ -54,6 +54,8 @@ production.
   $wgRCFeeds configuration array. $wgRCFeeds makes both the format and
   destination of recent change notifications customizable, and allows for
   multiple destinations to be specified.
+* (bug 53862) portal-url, currentevents-url and helppage have been removed from the
+  default Sidebar.
 
 === New features in 1.22 ===
 * (bug 44525) mediawiki.jqueryMsg can now parse (whitelisted) HTML elements and attributes.
@@ -212,6 +214,24 @@ production.
 * IPv6 addresses in X-Forwarded-For headers are now normalised before checking
   against allowed proxy lists.
 * Add deferrable update support for callback/closure
+* Add TitleMove hook before page renames
+* Revision deletion backend code is moved out of SpecialRevisiondelete
+* Add a variable (wgRedactedFunctionArguments) to redact the values sent as certain function
+  parameters from exception stack traces.
+* Added {{REVISIONSIZE}} variable to get the current size of a revision.
+* Add support for the LESS stylesheet language to ResourceLoader. LESS is a
+  stylesheet language that compiles into CSS. ResourceLoader file modules may
+  include LESS style files; ResourceLoader will compile these files into CSS
+  before sending them to the client.
+** The $wgResourceLoaderLESSVars configuration variable is an associative array
+   mapping variable names to string CSS values. These variables are considered
+   declared for all LESS files. Additional variables may be registered by
+   adding keys to the array.
+** $wgResourceLoaderLESSFunctions is an associative array of custom LESS
+   function names to PHP callables. See <http://leafo.net/lessphp/docs/#custom_functions>
+   for more details regarding custom functions.
+** $wgResourceLoaderLESSImportPaths is an array of file system paths. Files
+   referenced in LESS '@import' statements are looked up here first.
 
 === Bug fixes in 1.22 ===
 * Disable Special:PasswordReset when $wgEnableEmail is false. Previously one
@@ -228,8 +248,8 @@ production.
 * mw.util.tooltipAccessKeyRegexp: The regex now matches "option-" as well.
   Support for Mac "option" was added in 1.16, but the regex was never updated.
 * (bug 46768) Usernames of blocking users now display correctly, even if numeric.
-* (bug 39590) {{PAGESIZE}} for the current page and self-transclusions now
-  show the most up to date result always instead of being a revision behind.
+* (bug 39590) Self-transclusions now show the most up to date result always
+  after save instead of being a revision behind.
 * A bias in wfRandomString() toward digits 1-7 has been corrected. Generated
   strings will now start with digits 0 and 8-f as often as they should.
 * (bug 45371) Removed Parser_LinkHooks and CoreLinkFunctions classes.
@@ -291,6 +311,9 @@ production.
 * (bug 51742) Add data-sort-value for better sorting of hitcounts Special:Tags
 * (bug 26811) On DB error pages, server hostnames are now hidden when both
   $wgShowHostnames and $wgShowSQLErrors are false.
+* (bug 6200) line breaks in <blockquote> are handled like they are in <div>
+* (bug 14931) Default character set now set to 'utf8' when a new MySQL
+  database is created.
 
 === API changes in 1.22 ===
 * (bug 25553) The JSON output formatter now leaves forward slashes unescaped
@@ -445,6 +468,10 @@ changes to languages because of Bugzilla reports.
   Functions related to disambiguation pages are now handled by the Disambiguator
   extension (https://www.mediawiki.org/wiki/Extension:Disambiguator) (bug
   35981).
+* BREAKING CHANGE: The 'mediawiki.legacy.wikiprintable' module has been removed.
+  The skins/common/wikiprintable.css file no longer exists. Return value of
+  Skin#commonPrintStylesheet is ignored. Please use the 'mediawiki.legacy.commonPrint'
+  module instead or base your skin on SkinTemplate.
 
 == Compatibility ==
 
index 02413b3..5d6a6e4 100644 (file)
@@ -2419,6 +2419,11 @@ $result: Boolean; whether MediaWiki currently thinks this is a wikitext page.
   Hooks may change this value to override the return value of
   Title::isWikitextPage()
 
+'TitleMove': Before moving an article (title).
+$old: old title
+$nt: new title
+$user: user who does the move
+
 'TitleMoveComplete': After moving an article (title).
 $old: old title
 $nt: new title
index 23b648f..4b6e446 100644 (file)
@@ -142,7 +142,7 @@ abstract class Action {
                        return 'view';
                }
 
-               $action = Action::factory( $actionName, $context->getWikiPage() );
+               $action = Action::factory( $actionName, $context->getWikiPage(), $context );
                if ( $action instanceof Action ) {
                        return $action->getName();
                }
@@ -167,8 +167,14 @@ abstract class Action {
        final public function getContext() {
                if ( $this->context instanceof IContextSource ) {
                        return $this->context;
+               } else if ( $this->page instanceof Article ) {
+                       // NOTE: $this->page can be a WikiPage, which does not have a context.
+                       wfDebug( __METHOD__ . ': no context known, falling back to Article\'s context.' );
+                       return $this->page->getContext();
                }
-               return $this->page->getContext();
+
+               wfWarn( __METHOD__ . ': no context known, falling back to RequestContext::getMain().' );
+               return RequestContext::getMain();
        }
 
        /**
@@ -255,6 +261,12 @@ abstract class Action {
         * @param $context IContextSource
         */
        public function __construct( Page $page, IContextSource $context = null ) {
+               if ( $context === null ) {
+                       wfWarn( __METHOD__ . ' called without providing a Context object.' );
+                       // NOTE: We could try to initialize $context using $page->getContext(),
+                       //      if $page is an Article. That however seems to not work seamlessly.
+               }
+
                $this->page = $page;
                $this->context = $context;
        }
@@ -477,7 +489,7 @@ abstract class FormAction extends Action {
        public function execute( array $data = null, $captureErrors = true ) {
                try {
                        // Set a new context so output doesn't leak.
-                       $this->context = clone $this->page->getContext();
+                       $this->context = clone $this->getContext();
 
                        // This will throw exceptions if there's a problem
                        $this->checkCanExecute( $this->getUser() );
@@ -566,7 +578,7 @@ abstract class FormlessAction extends Action {
        public function execute( array $data = null, $captureErrors = true ) {
                try {
                        // Set a new context so output doesn't leak.
-                       $this->context = clone $this->page->getContext();
+                       $this->context = clone $this->getContext();
                        if ( is_array( $data ) ) {
                                $this->context->setRequest( new FauxRequest( $data, false ) );
                        }
index 732b1c2..0b18221 100644 (file)
@@ -1121,6 +1121,13 @@ class Article implements Page {
                        return false;
                }
 
+               if ( $rc->getPerformer()->getName() == $user->getName() ) {
+                       // Don't show a patrol link for own creations. If the user could
+                       // patrol them, they already would be patrolled
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
                $rcid = $rc->getAttribute( 'rc_id' );
 
                $token = $user->getEditToken( $rcid );
index 604add3..54bffab 100644 (file)
@@ -111,6 +111,7 @@ $wgAutoloadLocalClasses = array(
        'HistoryBlobStub' => 'includes/HistoryBlob.php',
        'Hooks' => 'includes/Hooks.php',
        'Html' => 'includes/Html.php',
+       'HtmlFormatter' => 'includes/HtmlFormatter.php',
        'HTMLApiField' => 'includes/HTMLForm.php',
        'HTMLButtonField' => 'includes/HTMLForm.php',
        'HTMLCheckField' => 'includes/HTMLForm.php',
@@ -704,6 +705,13 @@ $wgAutoloadLocalClasses = array(
        'JSToken' => 'includes/libs/jsminplus.php',
        'JSTokenizer' => 'includes/libs/jsminplus.php',
 
+       # includes/libs/lessphp
+       'lessc' => 'includes/libs/lessc.inc.php',
+       'lessc_parser' => 'includes/libs/lessc.inc.php',
+       'lessc_formatter_classic' => 'includes/libs/lessc.inc.php',
+       'lessc_formatter_compressed' => 'includes/libs/lessc.inc.php',
+       'lessc_formatter_lessjs' => 'includes/libs/lessc.inc.php',
+
        # includes/logging
        'DatabaseLogEntry' => 'includes/logging/LogEntry.php',
        'DeleteLogFormatter' => 'includes/logging/DeleteLogFormatter.php',
index 029911f..3fc27f9 100644 (file)
@@ -281,4 +281,34 @@ class ChangeTags {
                $wgMemc->set( $key, $emptyTags, 300 );
                return $emptyTags;
        }
+
+       /**
+        * Returns a map of any tags used on the wiki to number of edits
+        * tagged with them, ordered descending by the hitcount.
+        *
+        * @return array Array of string => int
+        */
+       public static function tagUsageStatistics() {
+               $out = array();
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select(
+                       'change_tag',
+                       array( 'ct_tag', 'hitcount' => 'count(*)' ),
+                       array(),
+                       __METHOD__,
+                       array( 'GROUP BY' => 'ct_tag', 'ORDER BY' => 'hitcount DESC' )
+               );
+
+               foreach ( $res as $row ) {
+                       $out[$row->ct_tag] = $row->hitcount;
+               }
+               foreach ( self::listDefinedTags() as $tag ) {
+                       if ( !isset( $out[$tag] ) ) {
+                               $out[$tag] = 0;
+                       }
+               }
+
+               return $out;
+       }
 }
index 22b7f1e..7a1eb22 100644 (file)
@@ -3282,6 +3282,101 @@ $wgResourceLoaderValidateStaticJS = false;
  */
 $wgResourceLoaderExperimentalAsyncLoading = false;
 
+/**
+ * Global LESS variables. An associative array binding variable names to CSS
+ * string values.
+ *
+ * Because the hashed contents of this array are used to construct the cache key
+ * that ResourceLoader uses to look up LESS compilation results, updating this
+ * array can be used to deliberately invalidate the set of cached results.
+ *
+ * @par Example:
+ * @code
+ *   $wgResourceLoaderLESSVars = array(
+ *     'baseFontSize'  => '1em',
+ *     'smallFontSize' => '0.75em',
+ *     'WikimediaBlue' => '#006699',
+ *   );
+ * @endcode
+ * @since 1.22
+ */
+$wgResourceLoaderLESSVars = array();
+
+/**
+ * Custom LESS functions. An associative array mapping function name to PHP
+ * callable.
+ *
+ * Changes to LESS functions do not trigger cache invalidation. If you update
+ * the behavior of a LESS function and need to invalidate stale compilation
+ * results, you can touch one of values in $wgResourceLoaderLESSVars, as
+ * documented above.
+ *
+ * @since 1.22
+ */
+$wgResourceLoaderLESSFunctions = array(
+       /**
+        * Check if an image file reference is suitable for embedding.
+        * An image is embeddable if it (a) exists, (b) has a suitable MIME-type,
+        * (c) does not exceed IE<9 size limit of 32kb. This is a LESS predicate
+        * function; it returns a LESS boolean value and can thus be used as a
+        * mixin guard.
+        *
+        * @par Example:
+        * @code
+        *   .background-image(@url) when(embeddable(@url)) {
+        *       background-image: url(@url) !ie;
+        *   }
+        * @endcode
+        */
+       'embeddable' => function( $frame, $less ) {
+               $base = pathinfo( $less->parser->sourceName, PATHINFO_DIRNAME );
+               $url = $frame[2][0];
+               $file = realpath( $base . '/' . $url );
+               $embeddable = ( $file
+                       && strpos( $url, '//' ) === false
+                       && filesize( $file ) < CSSMin::EMBED_SIZE_LIMIT
+                       && CSSMin::getMimeType( $file ) !== false ) ? 'true' : 'false';
+               return array( 'keyword', $embeddable );
+       },
+
+       /**
+        * Convert an image URI to a base64-encoded data URI.
+        *
+        * @par Example:
+        * @code
+        *   .fancy-button {
+        *       background-image: embed('../images/button-bg.png');
+        *   }
+        * @endcode
+        */
+       'embed' => function( $frame, $less ) {
+               $base = pathinfo( $less->parser->sourceName, PATHINFO_DIRNAME );
+               $url = $frame[2][0];
+               $file = realpath( $base . '/' . $url );
+
+               $data = CSSMin::encodeImageAsDataURI( $file );
+               $less->embeddedImages[ $file ] = filemtime( $file );
+               return 'url(' . $data . ')';
+       },
+);
+
+/**
+ * Default import paths for LESS modules. LESS files referenced in @import
+ * statements will be looked up here first, and relative to the importing file
+ * second. To avoid collisions, it's important for the LESS files in these
+ * directories to have a common, predictable file name prefix.
+ *
+ * Extensions need not (and should not) register paths in
+ * $wgResourceLoaderLESSImportPaths. The import path includes the path of the
+ * currently compiling LESS file, which allows each extension to freely import
+ * files from its own tree.
+ *
+ * @since 1.22
+ */
+$wgResourceLoaderLESSImportPaths = array(
+       "$IP/resources/mediawiki.less/",
+);
+
 /** @} */ # End of resource loader settings }
 
 /*************************************************************************//**
@@ -4880,6 +4975,37 @@ $wgShowSQLErrors = false;
  */
 $wgShowExceptionDetails = false;
 
+/**
+ * Array of functions which need parameters redacted from stack traces shown to
+ * clients and logged. Keys are in the format '[class::]function', and the
+ * values should be either an integer or an array of integers. These are the
+ * indexes of the parameters which need to be kept secret.
+ * @since 1.22
+ */
+$wgRedactedFunctionArguments = array(
+       'AuthPlugin::setPassword' => 1,
+       'AuthPlugin::authenticate' => 1,
+       'AuthPlugin::addUser' => 1,
+
+       'DatabaseBase::__construct' => 2,
+       'DatabaseBase::open' => 2,
+
+       'SpecialChangeEmail::attemptChange' => 1,
+       'SpecialChangePassword::attemptReset' => 0,
+
+       'User::setPassword' => 0,
+       'User::setInternalPassword' => 0,
+       'User::checkPassword' => 0,
+       'User::setNewpassword' => 0,
+       'User::comparePasswords' => array( 0, 1 ),
+       'User::checkTemporaryPassword' => 0,
+       'User::setToken' => 0,
+       'User::crypt' => 0,
+       'User::oldCrypt' => 0,
+       'User::getPasswordValidity' => 0,
+       'User::isValidPassword' => 0,
+);
+
 /**
  * If true, show a backtrace for database errors
  */
index dc1208a..39fe6f4 100644 (file)
@@ -127,7 +127,7 @@ class MWException extends Exception {
 
                if ( $wgShowExceptionDetails ) {
                        return '<p>' . nl2br( htmlspecialchars( $this->getMessage() ) ) .
-                               '</p><p>Backtrace:</p><p>' . nl2br( htmlspecialchars( $this->getTraceAsString() ) ) .
+                               '</p><p>Backtrace:</p><p>' . nl2br( htmlspecialchars( MWExceptionHandler::formatRedactedTrace( $this ) ) ) .
                                "</p>\n";
                } else {
                        return "<div class=\"errorbox\">" .
@@ -152,7 +152,7 @@ class MWException extends Exception {
 
                if ( $wgShowExceptionDetails ) {
                        return $this->getMessage() .
-                               "\nBacktrace:\n" . $this->getTraceAsString() . "\n";
+                               "\nBacktrace:\n" . MWExceptionHandler::formatRedactedTrace( $this ) . "\n";
                } else {
                        return "Set \$wgShowExceptionDetails = true; " .
                                "in LocalSettings.php to show detailed debugging information.\n";
@@ -247,16 +247,9 @@ class MWException extends Exception {
         * It will be either HTML or plain text based on isCommandLine().
         */
        function report() {
-               global $wgLogExceptionBacktrace, $wgMimeType;
-               $log = $this->getLogMessage();
+               global $wgMimeType;
 
-               if ( $log ) {
-                       if ( $wgLogExceptionBacktrace ) {
-                               wfDebugLog( 'exception', $log . "\n" . $this->getTraceAsString() . "\n" );
-                       } else {
-                               wfDebugLog( 'exception', $log );
-                       }
-               }
+               $this->logException();
 
                if ( defined( 'MW_API' ) ) {
                        // Unhandled API exception, we can't be sure that format printer is alive
@@ -273,6 +266,22 @@ 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.
@@ -624,7 +633,7 @@ class MWExceptionHandler {
                                $message = "MediaWiki internal error.\n\n";
 
                                if ( $wgShowExceptionDetails ) {
-                                       $message .= 'Original exception: ' . $e->__toString() . "\n\n" .
+                                       $message .= 'Original exception: ' . self::formatRedactedTrace( $e ) . "\n\n" .
                                                'Exception caught inside exception handler: ' . $e2->__toString();
                                } else {
                                        $message .= "Exception caught inside exception handler.\n\n" .
@@ -641,11 +650,10 @@ class MWExceptionHandler {
                                }
                        }
                } else {
-                       $message = "Unexpected non-MediaWiki exception encountered, of type \"" . get_class( $e ) . "\"\n" .
-                               $e->__toString() . "\n";
+                       $message = "Unexpected non-MediaWiki exception encountered, of type \"" . get_class( $e ) . "\"";
 
                        if ( $wgShowExceptionDetails ) {
-                               $message .= "\n" . $e->getTraceAsString() . "\n";
+                               $message .= "\nexception '" . get_class( $e ) . "' in " . $e->getFile() . ":" . $e->getLine() . "\nStack trace:\n" . self::formatRedactedTrace( $e ) . "\n";
                        }
 
                        if ( $cmdLine ) {
@@ -700,4 +708,53 @@ class MWExceptionHandler {
                // Exit value should be nonzero for the benefit of shell jobs
                exit( 1 );
        }
+
+       /**
+        * Get the stack trace from the exception as a string, redacting certain function arguments in the process
+        * @param Exception $e The exception
+        * @return string The stack trace as a string
+        */
+       public static function formatRedactedTrace( Exception $e ) {
+               global $wgRedactedFunctionArguments;
+               $finalExceptionText = '';
+
+               foreach ( $e->getTrace() as $i => $call ) {
+                       $checkFor = array();
+                       if ( isset( $call['class'] ) ) {
+                               $checkFor[] = $call['class'] . '::' . $call['function'];
+                               foreach ( class_parents( $call['class'] ) as $parent ) {
+                                       $checkFor[] = $parent . '::' . $call['function'];
+                               }
+                       } else {
+                               $checkFor[] = $call['function'];
+                       }
+
+                       foreach ( $checkFor as $check ) {
+                               if ( isset( $wgRedactedFunctionArguments[$check] ) ) {
+                                       foreach ( (array)$wgRedactedFunctionArguments[$check] as $argNo ) {
+                                               $call['args'][$argNo] = 'REDACTED';
+                                       }
+                               }
+                       }
+
+                       $finalExceptionText .= "#{$i} {$call['file']}({$call['line']}): ";
+                       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 );
+                               }
+                       }
+                       $finalExceptionText .=  '(' . implode( ', ', $args ) . ")\n";
+               }
+               return $finalExceptionText . '#' . ( $i + 1 ) . ' {main}';
+       }
 }
index 407b3cb..f49f9be 100644 (file)
@@ -162,7 +162,7 @@ class GitInfo {
        /**
         * Get an URL to a web viewer link to the HEAD revision.
         *
-        * @return string|bool string if an URL is available or false otherwise.
+        * @return string|bool string if a URL is available or false otherwise.
         */
        public function getHeadViewUrl() {
                $config = "{$this->basedir}/config";
index bed2c44..414c822 100644 (file)
@@ -93,6 +93,18 @@ if ( !function_exists( 'mb_strrpos' ) ) {
                return Fallback::mb_strrpos( $haystack, $needle, $offset, $encoding );
        }
 }
+
+// gzdecode function only exists in PHP >= 5.4.0
+// http://php.net/gzdecode
+if ( !function_exists( 'gzdecode' ) ) {
+       /**
+        * @codeCoverageIgnore
+        * @return string
+        */
+       function gzdecode( $data ) {
+               return gzinflate( substr( $data, 10, -8 ) );
+       }
+}
 /// @endcond
 
 /**
@@ -2020,6 +2032,10 @@ function wfEscapeWikiText( $text ) {
                        "\n*" => "\n&#42;", "\r*" => "\r&#42;",
                        "\n:" => "\n&#58;", "\r:" => "\r&#58;",
                        "\n " => "\n&#32;", "\r " => "\r&#32;",
+                       "\n\n" => "\n&#10;", "\r\n" => "&#13;\n",
+                       "\n\r" => "\n&#13;", "\r\r" => "\r&#13;",
+                       "\n\t" => "\n&#9;", "\r\t" => "\r&#9;", // "\n\t\n" is treated like "\n\n"
+                       "\n----" => "\n&#45;---", "\r----" => "\r&#45;---",
                        '__' => '_&#95;', '://' => '&#58;//',
                );
 
@@ -2521,7 +2537,7 @@ function wfMkdirParents( $dir, $mode = null, $caller = null ) {
                wfDebug( "$caller: called wfMkdirParents($dir)\n" );
        }
 
-       if ( strval( $dir ) === '' || file_exists( $dir ) ) {
+       if ( strval( $dir ) === '' || ( file_exists( $dir ) && is_dir( $dir ) ) ) {
                return true;
        }
 
@@ -2537,6 +2553,11 @@ function wfMkdirParents( $dir, $mode = null, $caller = null ) {
        wfRestoreWarnings();
 
        if ( !$ok ) {
+               //directory may have been created on another request since we last checked
+               if ( is_dir( $dir ) ) {
+                       return true;
+               }
+
                // PHP doesn't report the path in its warning message, so add our own to aid in diagnosis.
                wfLogWarning( sprintf( "failed to mkdir \"%s\" mode 0%o", $dir, $mode ) );
        }
index ed9440c..5de34d6 100644 (file)
@@ -700,7 +700,7 @@ class HTMLForm extends ContextSource {
         * @return String HTML.
         */
        function getButtons() {
-               $html = '';
+               $html = '<span class="mw-htmlform-submit-buttons">';
 
                if ( $this->mShowSubmit ) {
                        $attribs = array();
@@ -750,6 +750,8 @@ class HTMLForm extends ContextSource {
                        $html .= Html::element( 'input', $attrs );
                }
 
+               $html .= '</span>';
+
                return $html;
        }
 
diff --git a/includes/HtmlFormatter.php b/includes/HtmlFormatter.php
new file mode 100644 (file)
index 0000000..248a76f
--- /dev/null
@@ -0,0 +1,356 @@
+<?php
+/**
+ * Performs transformations of HTML by wrapping around libxml2 and working
+ * around its countless bugs.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+class HtmlFormatter {
+       /**
+        * @var DOMDocument
+        */
+       private $doc;
+
+       private $html;
+       private $itemsToRemove = array();
+       private $elementsToFlatten = array();
+       protected $removeMedia = false;
+
+       /**
+        * Constructor
+        *
+        * @param string $html: Text to process
+        */
+       public function __construct( $html ) {
+               $this->html = $html;
+       }
+
+       /**
+        * Turns a chunk of HTML into a proper document
+        * @param string $html
+        * @return string
+        */
+       public static function wrapHTML( $html ) {
+               return '<!doctype html><html><head></head><body>' . $html . '</body></html>';
+       }
+
+       /**
+        * Override this in descendant class to modify HTML after it has been converted from DOM tree
+        * @param string $html: HTML to process
+        * @return string: Processed HTML
+        */
+       protected function onHtmlReady( $html ) {
+               return $html;
+       }
+
+       /**
+        * @return DOMDocument: DOM to manipulate
+        */
+       public function getDoc() {
+               if ( !$this->doc ) {
+                       $html = mb_convert_encoding( $this->html, 'HTML-ENTITIES', 'UTF-8' );
+
+                       // Workaround for bug that caused spaces before references
+                       // to disappear during processing:
+                       // https://bugzilla.wikimedia.org/show_bug.cgi?id=53086
+                       //
+                       // Please replace with a better fix if one can be found.
+                       $html = str_replace( ' <', '&#32;<', $html );
+
+                       libxml_use_internal_errors( true );
+                       $loader = libxml_disable_entity_loader();
+                       $this->doc = new DOMDocument();
+                       $this->doc->strictErrorChecking = false;
+                       $this->doc->loadHTML( $html );
+                       libxml_disable_entity_loader( $loader );
+                       libxml_use_internal_errors( false );
+                       $this->doc->encoding = 'UTF-8';
+               }
+               return $this->doc;
+       }
+
+       /**
+        * Sets whether images/videos/sounds should be removed from output
+        * @param bool $flag
+        */
+       public function setRemoveMedia( $flag = true ) {
+               $this->removeMedia = $flag;
+       }
+
+       /**
+        * Adds one or more selector of content to remove. A subset of CSS selector
+        * syntax is supported:
+        *
+        *   <tag>
+        *   <tag>.class
+        *   .<class>
+        *   #<id>
+        *
+        * @param Array|string $selectors: Selector(s) of stuff to remove
+        */
+       public function remove( $selectors ) {
+               $this->itemsToRemove = array_merge( $this->itemsToRemove, (array)$selectors );
+       }
+
+       /**
+        * Adds one or more element name to the list to flatten (remove tag, but not its content)
+        * Can accept undelimited regexes
+        *
+        * Note this interface may fail in surprising unexpected ways due to usage of regexes,
+        * so should not be relied on for HTML markup security measures.
+        *
+        * @param Array|string $elements: Name(s) of tag(s) to flatten
+        */
+       public function flatten( $elements ) {
+               $this->elementsToFlatten = array_merge( $this->elementsToFlatten, (array)$elements );
+       }
+
+       /**
+        * Instructs the formatter to flatten all tags
+        */
+       public function flattenAllTags() {
+               $this->flatten( '[?!]?[a-z0-9]+' );
+       }
+
+       /**
+        * Removes content we've chosen to remove
+        */
+       public function filterContent() {
+               wfProfileIn( __METHOD__ );
+               $removals = $this->parseItemsToRemove();
+
+               if ( !$removals ) {
+                       wfProfileOut( __METHOD__ );
+                       return;
+               }
+
+               $doc = $this->getDoc();
+
+               // Remove tags
+
+               // You can't remove DOMNodes from a DOMNodeList as you're iterating
+               // over them in a foreach loop. It will seemingly leave the internal
+               // iterator on the foreach out of wack and results will be quite
+               // strange. Though, making a queue of items to remove seems to work.
+               $domElemsToRemove = array();
+               foreach ( $removals['TAG'] as $tagToRemove ) {
+                       $tagToRemoveNodes = $doc->getElementsByTagName( $tagToRemove );
+                       foreach ( $tagToRemoveNodes as $tagToRemoveNode ) {
+                               if ( $tagToRemoveNode ) {
+                                       $domElemsToRemove[] = $tagToRemoveNode;
+                               }
+                       }
+               }
+
+               $this->removeElements( $domElemsToRemove );
+
+               // Elements with named IDs
+               $domElemsToRemove = array();
+               foreach ( $removals['ID'] as $itemToRemove ) {
+                       $itemToRemoveNode = $doc->getElementById( $itemToRemove );
+                       if ( $itemToRemoveNode ) {
+                               $domElemsToRemove[] = $itemToRemoveNode;
+                       }
+               }
+               $this->removeElements( $domElemsToRemove );
+
+               // CSS Classes
+               $domElemsToRemove = array();
+               $xpath = new DOMXpath( $doc );
+               foreach ( $removals['CLASS'] as $classToRemove ) {
+                       $elements = $xpath->query( '//*[contains(@class, "' . $classToRemove . '")]' );
+
+                       /** @var $element DOMElement */
+                       foreach ( $elements as $element ) {
+                               $classes = $element->getAttribute( 'class' );
+                               if ( preg_match( "/\b$classToRemove\b/", $classes ) && $element->parentNode ) {
+                                       $domElemsToRemove[] = $element;
+                               }
+                       }
+               }
+               $this->removeElements( $domElemsToRemove );
+
+               // Tags with CSS Classes
+               foreach ( $removals['TAG_CLASS'] as $classToRemove ) {
+                       $parts = explode( '.', $classToRemove );
+
+                       $elements = $xpath->query(
+                               '//' . $parts[0] . '[@class="' . $parts[1] . '"]'
+                       );
+
+                       $this->removeElements( $elements );
+               }
+
+               wfProfileOut( __METHOD__ );
+       }
+
+       /**
+        * Removes a list of elelments from DOMDocument
+        * @param array|DOMNodeList $elements
+        */
+       private function removeElements( $elements ) {
+               $list = $elements;
+               if ( $elements instanceof DOMNodeList ) {
+                       $list = array();
+                       foreach ( $elements as $element ) {
+                               $list[] = $element;
+                       }
+               }
+               /** @var $element DOMElement */
+               foreach ( $list as $element ) {
+                       if ( $element->parentNode ) {
+                               $element->parentNode->removeChild( $element );
+                       }
+               }
+       }
+
+       /**
+        * libxml in its usual pointlessness converts many chars to entities - this function
+        * perfoms a reverse conversion
+        * @param string $html
+        * @return string
+        */
+       private function fixLibXML( $html ) {
+               wfProfileIn( __METHOD__ );
+               static $replacements;
+               if ( ! $replacements ) {
+                       // We don't include rules like '&#34;' => '&amp;quot;' because entities had already been
+                       // normalized by libxml. Using this function with input not sanitized by libxml is UNSAFE!
+                       $replacements = new ReplacementArray( array(
+                               '&quot;' => '&amp;quot;',
+                               '&amp;' => '&amp;amp;',
+                               '&lt;' => '&amp;lt;',
+                               '&gt;' => '&amp;gt;',
+                       ) );
+               }
+               $html = $replacements->replace( $html );
+               $html = mb_convert_encoding( $html, 'UTF-8', 'HTML-ENTITIES' );
+               wfProfileOut( __METHOD__ );
+               return $html;
+       }
+
+       /**
+        * Performs final transformations and returns resulting HTML
+        *
+        * @param DOMElement|string|null $element: ID of element to get HTML from or false to get it from the whole tree
+        * @return string: Processed HTML
+        */
+       public function getText( $element = null ) {
+               wfProfileIn( __METHOD__ );
+
+               if ( $this->doc ) {
+                       if ( $element !== null && !( $element instanceof DOMElement ) ) {
+                               $element = $this->doc->getElementById( $element );
+                       }
+                       if ( $element ) {
+                               $body = $this->doc->getElementsByTagName( 'body' )->item( 0 );
+                               $nodesArray = array();
+                               foreach ( $body->childNodes as $node ) {
+                                       $nodesArray[] = $node;
+                               }
+                               foreach ( $nodesArray as $nodeArray ) {
+                                       $body->removeChild( $nodeArray );
+                               }
+                               $body->appendChild( $element );
+                       }
+                       $html = $this->doc->saveHTML();
+                       $html = $this->fixLibXml( $html );
+               } else {
+                       $html = $this->html;
+               }
+               if ( wfIsWindows() ) {
+                       // Appears to be cleanup for CRLF misprocessing of unknown origin
+                       // when running server on Windows platform.
+                       //
+                       // If this error continues in the future, please track it down in the
+                       // XML code paths if possible and fix there.
+                       $html = str_replace( '&#13;', '', $html );
+               }
+               $html = preg_replace( '/<!--.*?-->|^.*?<body>|<\/body>.*$/s', '', $html );
+               $html = $this->onHtmlReady( $html );
+
+               if ( $this->elementsToFlatten ) {
+                       $elements = implode( '|', $this->elementsToFlatten );
+                       $html = preg_replace( "#</?($elements)\\b[^>]*>#is", '', $html );
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $html;
+       }
+
+       /**
+        * @param $selector: CSS selector to parse
+        * @param $type
+        * @param $rawName
+        * @return bool: Whether the selector was successfully recognised
+        */
+       protected function parseSelector( $selector, &$type, &$rawName ) {
+               if ( strpos( $selector, '.' ) === 0 ) {
+                       $type = 'CLASS';
+                       $rawName = substr( $selector, 1 );
+               } elseif ( strpos( $selector, '#' ) === 0 ) {
+                       $type = 'ID';
+                       $rawName = substr( $selector, 1 );
+               } elseif ( strpos( $selector, '.' ) !== 0 &&
+                       strpos( $selector, '.' ) !== false )
+               {
+                       $type = 'TAG_CLASS';
+                       $rawName = $selector;
+               } elseif ( strpos( $selector, '[' ) === false
+                       && strpos( $selector, ']' ) === false )
+               {
+                       $type = 'TAG';
+                       $rawName = $selector;
+               } else {
+                       throw new MWException( __METHOD__ . "(): unrecognized selector '$selector'" );
+               }
+
+               return true;
+       }
+
+       /**
+        * Transforms CSS selectors into an internal representation suitable for processing
+        * @return array
+        */
+       protected function parseItemsToRemove() {
+               wfProfileIn( __METHOD__ );
+               $removals = array(
+                       'ID' => array(),
+                       'TAG' => array(),
+                       'CLASS' => array(),
+                       'TAG_CLASS' => array(),
+               );
+
+               foreach ( $this->itemsToRemove as $itemToRemove ) {
+                       $type = '';
+                       $rawName = '';
+                       if ( $this->parseSelector( $itemToRemove, $type, $rawName ) ) {
+                               $removals[$type][] = $rawName;
+                       }
+               }
+
+               if ( $this->removeMedia ) {
+                       $removals['TAG'][] = 'img';
+                       $removals['TAG'][] = 'audio';
+                       $removals['TAG'][] = 'video';
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $removals;
+       }
+}
index 2051e69..fc76310 100644 (file)
@@ -212,7 +212,7 @@ class IP {
                                        $longest = $match;
                                        $longestPos = $pos;
                                }
-                               $offset += ( $pos + strlen( $match ) ); // advance
+                               $offset = ( $pos + strlen( $match ) ); // advance
                        }
                        if ( $longest !== false ) {
                                // Replace this portion of the string with the '::' abbreviation
index adb2ab7..427a1ad 100644 (file)
@@ -124,6 +124,7 @@ class MagicWord {
                'revisionyear',
                'revisiontimestamp',
                'revisionuser',
+               'revisionsize',
                'subpagename',
                'subpagenamee',
                'talkspace',
index 0df28a8..1d0c930 100644 (file)
@@ -2481,10 +2481,6 @@ $templates
                $userdir = $this->getLanguage()->getDir();
                $sitedir = $wgContLang->getDir();
 
-               if ( $sk->commonPrintStylesheet() ) {
-                       $this->addModuleStyles( 'mediawiki.legacy.wikiprintable' );
-               }
-
                $ret = Html::htmlHeader( array( 'lang' => $this->getLanguage()->getHtmlCode(), 'dir' => $userdir, 'class' => 'client-nojs' ) );
 
                if ( $this->getHTMLTitle() == '' ) {
index 29d6e07..c9caf4f 100644 (file)
@@ -335,9 +335,11 @@ class Preferences {
                        'type' => 'radio',
                        'section' => 'personal/i18n',
                        'options' => array(
-                               $context->msg( 'gender-male' )->text() => 'male',
+                               $context->msg( 'parentheses',
+                                       $context->msg( 'gender-unknown' )->text()
+                               )->text() => 'unknown',
                                $context->msg( 'gender-female' )->text() => 'female',
-                               $context->msg( 'gender-unknown' )->text() => 'unknown',
+                               $context->msg( 'gender-male' )->text() => 'male',
                        ),
                        'label-message' => 'yourgender',
                        'help-message' => 'prefs-help-gender',
@@ -388,6 +390,18 @@ class Preferences {
                        }
                }
 
+               // Stuff from Language::getExtraUserToggles()
+               // FIXME is this dead code? $extraUserToggles doesn't seem to be defined for any language
+               $toggles = $wgContLang->getExtraUserToggles();
+
+               foreach ( $toggles as $toggle ) {
+                       $defaultPreferences[$toggle] = array(
+                               'type' => 'toggle',
+                               'section' => 'personal/i18n',
+                               'label-message' => "tog-$toggle",
+                       );
+               }
+
                // show a preview of the old signature first
                $oldsigWikiText = $wgParser->preSaveTransform( "~~~", $context->getTitle(), $user, ParserOptions::newFromContext( $context ) );
                $oldsigHTML = $context->getOutput()->parseInline( $oldsigWikiText, true, true );
@@ -694,6 +708,18 @@ class Preferences {
         * @param $defaultPreferences Array
         */
        static function renderingPreferences( $user, IContextSource $context, &$defaultPreferences ) {
+               ## Diffs ####################################
+               $defaultPreferences['diffonly'] = array(
+                       'type' => 'toggle',
+                       'section' => 'rendering/diffs',
+                       'label-message' => 'tog-diffonly',
+               );
+               $defaultPreferences['norollbackdiff'] = array(
+                       'type' => 'toggle',
+                       'section' => 'rendering/diffs',
+                       'label-message' => 'tog-norollbackdiff',
+               );
+
                ## Page Rendering ##############################
                global $wgAllowUserCssPrefs;
                if ( $wgAllowUserCssPrefs ) {
@@ -1066,35 +1092,9 @@ class Preferences {
        }
 
        /**
-        * @param $user User
-        * @param $context IContextSource
-        * @param $defaultPreferences Array
+        * Dummy, kept for backwards-compatibility.
         */
        static function miscPreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               global $wgContLang;
-
-               ## Misc #####################################
-               $defaultPreferences['diffonly'] = array(
-                       'type' => 'toggle',
-                       'section' => 'misc/diffs',
-                       'label-message' => 'tog-diffonly',
-               );
-               $defaultPreferences['norollbackdiff'] = array(
-                       'type' => 'toggle',
-                       'section' => 'misc/diffs',
-                       'label-message' => 'tog-norollbackdiff',
-               );
-
-               // Stuff from Language::getExtraUserToggles()
-               $toggles = $wgContLang->getExtraUserToggles();
-
-               foreach ( $toggles as $toggle ) {
-                       $defaultPreferences[$toggle] = array(
-                               'type' => 'toggle',
-                               'section' => 'personal/i18n',
-                               'label-message' => "tog-$toggle",
-                       );
-               }
        }
 
        /**
index 1d20f18..499d821 100644 (file)
@@ -54,7 +54,6 @@ class Sanitizer {
         * List of all named character entities defined in HTML 4.01
         * http://www.w3.org/TR/html4/sgml/entities.html
         * As well as &apos; which is only defined starting in XHTML1.
-        * @private
         */
        private static $htmlEntities = array(
                'Aacute'   => 193,
@@ -322,7 +321,6 @@ class Sanitizer {
 
        /**
         * Lazy-initialised attributes regex, see getAttribsRegex()
-        * @private
         */
        private static $attribsRegex;
 
index 26cac58..5801806 100644 (file)
@@ -1342,14 +1342,19 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * Should we load mediawiki.legacy.wikiprintable?  Skins that have their own
-        * print stylesheet should override this and return false.  (This is an
-        * ugly hack to get Monobook to play nicely with OutputPage::headElement().)
+        * This function previously controlled whether the 'mediawiki.legacy.wikiprintable' module
+        * should be loaded by OutputPage. That module no longer exists and the return value of this
+        * method is ignored.
         *
+        * If your skin doesn't provide its own print styles, the 'mediawiki.legacy.commonPrint' module
+        * can be used instead (SkinTemplate-based skins do it automatically).
+        *
+        * @deprecated since 1.22
         * @return bool
         */
        public function commonPrintStylesheet() {
-               return true;
+               wfDeprecated( __METHOD__, '1.22' );
+               return false;
        }
 
        /**
index e3ef6ac..ccfb3db 100644 (file)
@@ -1296,10 +1296,6 @@ class SkinTemplate extends Skin {
        function getNameSpaceKey() {
                return $this->getTitle()->getNamespaceKey();
        }
-
-       public function commonPrintStylesheet() {
-               return false;
-       }
 }
 
 /**
index 48cde0e..c1545e6 100644 (file)
@@ -38,6 +38,9 @@ class StringUtils {
         * unit testing our internal implementation.
         *
         * @since 1.21
+        * @note In MediaWiki 1.21, this function did not provide proper UTF-8 validation.
+        * In particular, the pure PHP code path did not in fact check for overlong forms.
+        * Beware of this when backporting code to that version of MediaWiki.
         *
         * @param string $value String to check
         * @param boolean $disableMbstring Whether to use the pure PHP
@@ -47,26 +50,64 @@ class StringUtils {
         * @return boolean Whether the given $value is a valid UTF-8 encoded string
         */
        static function isUtf8( $value, $disableMbstring = false ) {
+               $value = (string)$value;
 
-               if ( preg_match( '/[\x80-\xff]/', $value ) === 0 ) {
-                       # no high bit set, this is pure ASCII which is de facto
-                       # valid UTF-8
+               // If the mbstring extension is loaded, use it. However, before PHP 5.4, values above
+               // U+10FFFF are incorrectly allowed, so we have to check for them separately.
+               if ( !$disableMbstring && function_exists( 'mb_check_encoding' ) ) {
+                       static $newPHP;
+                       if ( $newPHP === null ) {
+                               $newPHP = !mb_check_encoding( "\xf4\x90\x80\x80", 'UTF-8' );
+                       }
+
+                       return mb_check_encoding( $value, 'UTF-8' ) &&
+                               ( $newPHP || preg_match( "/\xf4[\x90-\xbf]|[\xf5-\xff]/S", $value ) === 0 );
+               }
+
+               if ( preg_match( "/[\x80-\xff]/S", $value ) === 0 ) {
+                       // String contains only ASCII characters, has to be valid
                        return true;
                }
 
-               if ( !$disableMbstring && function_exists( 'mb_check_encoding' ) ) {
-                       return mb_check_encoding( $value, 'UTF-8' );
-               } else {
-                       $hasUtf8 = preg_match( '/^(?>
-                                 [\x00-\x7f]
-                               | [\xc0-\xdf][\x80-\xbf]
-                               | [\xe0-\xef][\x80-\xbf]{2}
-                               | [\xf0-\xf7][\x80-\xbf]{3}
-                               | [\xf8-\xfb][\x80-\xbf]{4}
-                               | \xfc[\x84-\xbf][\x80-\xbf]{4}
-                       )+$/x', $value );
-                       return ( $hasUtf8 > 0 );
+               // PCRE implements repetition using recursion; to avoid a stack overflow (and segfault)
+               // for large input, we check for invalid sequences (<= 5 bytes) rather than valid
+               // sequences, which can be as long as the input string is. Multiple short regexes are
+               // used rather than a single long regex for performance.
+               static $regexes;
+               if ( $regexes === null ) {
+                       $cont = "[\x80-\xbf]";
+                       $after = "(?!$cont)"; // "(?:[^\x80-\xbf]|$)" would work here
+                       $regexes = array(
+                               // Continuation byte at the start
+                               "/^$cont/",
+
+                               // ASCII byte followed by a continuation byte
+                               "/[\\x00-\x7f]$cont/S",
+
+                               // Illegal byte
+                               "/[\xc0\xc1\xf5-\xff]/S",
+
+                               // Invalid 2-byte sequence, or valid one then an extra continuation byte
+                               "/[\xc2-\xdf](?!$cont$after)/S",
+
+                               // Invalid 3-byte sequence, or valid one then an extra continuation byte
+                               "/\xe0(?![\xa0-\xbf]$cont$after)/",
+                               "/[\xe1-\xec\xee\xef](?!$cont{2}$after)/S",
+                               "/\xed(?![\x80-\x9f]$cont$after)/",
+
+                               // Invalid 4-byte sequence, or valid one then an extra continuation byte
+                               "/\xf0(?![\x90-\xbf]$cont{2}$after)/",
+                               "/[\xf1-\xf3](?!$cont{3}$after)/S",
+                               "/\xf4(?![\x80-\x8f]$cont{2}$after)/",
+                       );
                }
+
+               foreach ( $regexes as $regex ) {
+                       if ( preg_match( $regex, $value ) !== 0 ) {
+                               return false;
+                       }
+               }
+               return true;
        }
 
        /**
@@ -217,8 +258,8 @@ class StringUtils {
        /**
         * More or less "markup-safe" explode()
         * Ignores any instances of the separator inside <...>
-        * @param $separator String
-        * @param $text String
+        * @param string $separator
+        * @param string $text
         * @return array
         */
        static function explodeMarkup( $separator, $text ) {
@@ -244,8 +285,8 @@ class StringUtils {
         * Escape a string to make it suitable for inclusion in a preg_replace()
         * replacement parameter.
         *
-        * @param $string String
-        * @return String
+        * @param string $string
+        * @return string
         */
        static function escapeRegexReplacement( $string ) {
                $string = str_replace( '\\', '\\\\', $string );
@@ -256,8 +297,8 @@ class StringUtils {
        /**
         * Workalike for explode() with limited memory usage.
         * Returns an Iterator
-        * @param $separator
-        * @param $subject
+        * @param string $separator
+        * @param string $subject
         * @return ArrayIterator|ExplodeIterator
         */
        static function explode( $separator, $subject ) {
@@ -290,14 +331,14 @@ class RegexlikeReplacer extends Replacer {
        var $r;
 
        /**
-        * @param $r string
+        * @param string $r
         */
        function __construct( $r ) {
                $this->r = $r;
        }
 
        /**
-        * @param $matches array
+        * @param array $matches
         * @return string
         */
        function replace( $matches ) {
@@ -318,7 +359,7 @@ class DoubleReplacer extends Replacer {
        /**
         * @param $from
         * @param $to
-        * @param $index int
+        * @param int $index
         */
        function __construct( $from, $to, $index = 0 ) {
                $this->from = $from;
@@ -327,7 +368,7 @@ class DoubleReplacer extends Replacer {
        }
 
        /**
-        * @param $matches array
+        * @param array $matches
         * @return mixed
         */
        function replace( $matches ) {
@@ -343,7 +384,7 @@ class HashtableReplacer extends Replacer {
 
        /**
         * @param $table
-        * @param $index int
+        * @param int $index
         */
        function __construct( $table, $index = 0 ) {
                $this->table = $table;
@@ -351,7 +392,7 @@ class HashtableReplacer extends Replacer {
        }
 
        /**
-        * @param $matches array
+        * @param array $matches
         * @return mixed
         */
        function replace( $matches ) {
@@ -389,6 +430,7 @@ class ReplacementArray {
 
        /**
         * Set the whole replacement array at once
+        * @param array $data
         */
        function setArray( $data ) {
                $this->data = $data;
@@ -404,8 +446,8 @@ class ReplacementArray {
 
        /**
         * Set an element of the replacement array
-        * @param $from string
-        * @param $to string
+        * @param string $from
+        * @param string $to
         */
        function setPair( $from, $to ) {
                $this->data[$from] = $to;
@@ -413,7 +455,7 @@ class ReplacementArray {
        }
 
        /**
-        * @param $data array
+        * @param array $data
         */
        function mergeArray( $data ) {
                $this->data = array_merge( $this->data, $data );
@@ -421,7 +463,7 @@ class ReplacementArray {
        }
 
        /**
-        * @param $other
+        * @param ReplacementArray $other
         */
        function merge( $other ) {
                $this->data = array_merge( $this->data, $other->data );
@@ -429,7 +471,7 @@ class ReplacementArray {
        }
 
        /**
-        * @param $from string
+        * @param string $from
         */
        function removePair( $from ) {
                unset( $this->data[$from] );
@@ -437,7 +479,7 @@ class ReplacementArray {
        }
 
        /**
-        * @param $data array
+        * @param array $data
         */
        function removeArray( $data ) {
                foreach ( $data as $from => $to ) {
@@ -447,7 +489,7 @@ class ReplacementArray {
        }
 
        /**
-        * @param $subject string
+        * @param string $subject
         * @return string
         */
        function replace( $subject ) {
@@ -494,15 +536,15 @@ class ExplodeIterator implements Iterator {
 
        /**
         * Construct a DelimIterator
-        * @param $delim string
-        * @param $s string
+        * @param string $delim
+        * @param string $subject
         */
-       function __construct( $delim, $s ) {
-               $this->subject = $s;
+       function __construct( $delim, $subject ) {
+               $this->subject = $subject;
                $this->delim = $delim;
 
                // Micro-optimisation (theoretical)
-               $this->subjectLength = strlen( $s );
+               $this->subjectLength = strlen( $subject );
                $this->delimLength = strlen( $delim );
 
                $this->rewind();
@@ -530,6 +572,9 @@ class ExplodeIterator implements Iterator {
                return $this->current;
        }
 
+       /**
+        * @return int|bool Current position or boolean false if invalid
+        */
        function key() {
                return $this->curPos;
        }
index 59238fa..a3970f3 100644 (file)
  * their associated module code by deferring initialisation until the first
  * method call.
  *
+ * Note on reference parameters:
+ *
+ * If the called method takes any parameters by reference, the __call magic
+ * here won't work correctly. The solution is to unstub the object before
+ * calling the method.
+ *
  * Note on unstub loops:
  *
  * Unstub loops (infinite recursion) sometimes occur when a constructor calls
@@ -63,6 +69,20 @@ class StubObject {
                return is_object( $obj ) && !$obj instanceof StubObject;
        }
 
+       /**
+        * Unstubs an object, if it is a stub object. Can be used to break a
+        * infinite loop when unstubbing an object or to avoid reference parameter
+        * breakage.
+        *
+        * @param $obj Object to check.
+        * @return void
+        */
+       static function unstub( $obj ) {
+               if ( $obj instanceof StubObject ) {
+                       $obj->_unstub( 'unstub', 3 );
+               }
+       }
+
        /**
         * Function called if any function exists with that name in this object.
         * It is used to unstub the object. Only used internally, PHP will call
index 734e009..13350cf 100644 (file)
@@ -3620,6 +3620,8 @@ class Title {
                        $createRedirect = true;
                }
 
+               wfRunHooks( 'TitleMove', array( $this, $nt, $wgUser ) );
+
                // If it is a file, move it first.
                // It is done before all other moving stuff is done because it's hard to revert.
                $dbw = wfGetDB( DB_MASTER );
@@ -3694,7 +3696,7 @@ class Title {
                                $comment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
                        }
                        // @todo FIXME: $params?
-                       $log->addEntry( 'move_prot', $nt, $comment, array( $this->getPrefixedText() ) );
+                       $log->addEntry( 'move_prot', $nt, $comment, array( $this->getPrefixedText() ), $wgUser );
                }
 
                # Update watchlists
index 560c5dc..60efc9d 100644 (file)
@@ -1700,6 +1700,7 @@ class User {
                        return $this->mLocked;
                }
                global $wgAuth;
+               StubObject::unstub( $wgAuth );
                $authUser = $wgAuth->getUserInstance( $this );
                $this->mLocked = (bool)$authUser->isLocked();
                return $this->mLocked;
@@ -1717,6 +1718,7 @@ class User {
                $this->getBlockedStatus();
                if ( !$this->mHideName ) {
                        global $wgAuth;
+                       StubObject::unstub( $wgAuth );
                        $authUser = $wgAuth->getUserInstance( $this );
                        $this->mHideName = (bool)$authUser->isHidden();
                }
index 55bddfc..23eee04 100644 (file)
@@ -881,8 +881,9 @@ class WebRequest {
                        return;
                }
 
-               if ( function_exists( 'apache_request_headers' ) ) {
-                       foreach ( apache_request_headers() as $tempName => $tempValue ) {
+               $apacheHeaders = function_exists( 'apache_request_headers' ) ? apache_request_headers() : false;
+               if ( $apacheHeaders ) {
+                       foreach ( $apacheHeaders as $tempName => $tempValue ) {
                                $this->headers[strtoupper( $tempName )] = $tempValue;
                        }
                } else {
index f840a5e..58c953a 100644 (file)
@@ -91,9 +91,6 @@ if ( $IP === false ) {
        }
 }
 
-# Get MWInit class
-require_once "$IP/includes/Init.php";
-
 # Start the autoloader, so that extensions can derive classes from core files
 require_once "$IP/includes/AutoLoader.php";
 
index c4c67ab..0683d7c 100644 (file)
@@ -428,7 +428,8 @@ class MediaWiki {
 
                $act = $this->getAction();
 
-               $action = Action::factory( $act, $page );
+               $action = Action::factory( $act, $page, $this->context );
+
                if ( $action instanceof Action ) {
                        # Let Squid cache things if we can purge them.
                        if ( $wgUseSquid &&
index abd657c..0569109 100644 (file)
@@ -93,7 +93,7 @@ class ApiFeedContributions extends ApiBase {
 
        protected function feedItem( $row ) {
                $title = Title::makeTitle( intval( $row->page_namespace ), $row->page_title );
-               if ( $title && $title->userCan( 'read' ) ) {
+               if ( $title && $title->userCan( 'read', $this->getUser() ) ) {
                        $date = $row->rev_timestamp;
                        $comments = $title->getTalkPage()->getFullURL();
                        $revision = Revision::newFromRow( $row );
index e39c25a..2d1089a 100644 (file)
@@ -255,6 +255,9 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                if ( $this->params['limit'] == 'max' ) {
                        $this->params['limit'] = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
                        $result->setParsedLimit( $this->getModuleName(), $this->params['limit'] );
+               } else {
+                       $this->params['limit'] = intval( $this->params['limit'] );
+                       $this->validateLimit( 'limit', $this->params['limit'], 1, $userMax, $botMax );
                }
 
                $this->processContinue();
index da4621a..ef71b18 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * PhpRedis client connection pooling manager.
+ * Redis client connection pooling manager.
  *
  * 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
@@ -23,7 +23,7 @@
  */
 
 /**
- * Helper class to manage redis connections using PhpRedis.
+ * Helper class to manage Redis connections.
  *
  * This can be used to get handle wrappers that free the handle when the wrapper
  * leaves scope. The maximum number of free handles (connections) is configurable.
@@ -70,9 +70,9 @@ class RedisConnectionPool {
         * @param array $options
         */
        protected function __construct( array $options ) {
-               if ( !extension_loaded( 'redis' ) ) {
-                       throw new MWException( __CLASS__ . ' requires the phpredis extension: ' .
-                               'https://github.com/nicolasff/phpredis' );
+               if ( !class_exists( 'Redis' ) ) {
+                       throw new MWException( __CLASS__ . ' requires a Redis client library. ' .
+                               'See https://www.mediawiki.org/wiki/Redis#Setup' );
                }
                $this->connectTimeout = $options['connectTimeout'];
                $this->persistent = $options['persistent'];
index fca979b..fbaa4da 100644 (file)
@@ -694,7 +694,7 @@ class DatabaseOracle extends DatabaseBase {
                                break;
                }
 
-               return parent::tableName( strtoupper( $name ), $format );
+               return strtoupper( parent::tableName( $name, $format ) );
        }
 
        function tableNameInternal( $name ) {
@@ -883,7 +883,7 @@ class DatabaseOracle extends DatabaseBase {
 
        /**
         * Query whether a given table exists (in the given schema, or the default mw one if not given)
-        * @return int
+        * @return bool
         */
        function tableExists( $table, $fname = __METHOD__ ) {
                $table = $this->tableName( $table );
@@ -891,13 +891,14 @@ class DatabaseOracle extends DatabaseBase {
                $owner = $this->addQuotes( strtoupper( $this->mDBname ) );
                $SQL = "SELECT 1 FROM all_tables WHERE owner=$owner AND table_name=$table";
                $res = $this->doQuery( $SQL );
-               if ( $res ) {
-                       $count = $res->numRows();
-                       $res->free();
+               if ( $res && $res->numRows() > 0 ) {
+                       $exists = true;
                } else {
-                       $count = 0;
+                       $exists = false;
                }
-               return $count;
+
+               $res->free();
+               return $exists;
        }
 
        /**
index 6692fa4..a8270bf 100644 (file)
@@ -709,6 +709,8 @@ class DatabaseSqlite extends DatabaseBase {
        function addQuotes( $s ) {
                if ( $s instanceof Blob ) {
                        return "x'" . bin2hex( $s->fetch() ) . "'";
+               } elseif ( is_bool( $s ) ) {
+                       return (int)$s;
                } elseif ( strpos( $s, "\0" ) !== false ) {
                        // SQLite doesn't support \0 in strings, so use the hex representation as a workaround.
                        // This is a known limitation of SQLite's mprintf function which PDO should work around,
index 5444bc1..0c9086b 100644 (file)
@@ -185,10 +185,14 @@ class DifferenceEngine extends ContextSource {
                $out = $this->getOutput();
 
                $missing = array();
-               if ( $this->mOldRev === null ) {
+               if ( $this->mOldRev === null ||
+                       ( $this->mOldRev && $this->mOldContent === null )
+               ) {
                        $missing[] = $this->deletedIdMarker( $this->mOldid );
                }
-               if ( $this->mNewRev === null ) {
+               if ( $this->mNewRev === null ||
+                       ( $this->mNewRev && $this->mNewContent === null )
+               ) {
                        $missing[] = $this->deletedIdMarker( $this->mNewid );
                }
 
@@ -416,12 +420,13 @@ class DifferenceEngine extends ContextSource {
         */
        protected function markPatrolledLink() {
                global $wgUseRCPatrol, $wgEnableAPI, $wgEnableWriteAPI;
+               $user = $this->getUser();
 
                if ( $this->mMarkPatrolledLink === null ) {
                        // Prepare a change patrol link, if applicable
                        if (
                                // Is patrolling enabled and the user allowed to?
-                               $wgUseRCPatrol && $this->mNewPage->quickUserCan( 'patrol', $this->getUser() ) &&
+                               $wgUseRCPatrol && $this->mNewPage->quickUserCan( 'patrol', $user ) &&
                                // Only do this if the revision isn't more than 6 hours older
                                // than the Max RC age (6h because the RC might not be cleaned out regularly)
                                RecentChange::isInRCLifespan( $this->mNewRev->getTimestamp(), 21600 )
@@ -439,22 +444,23 @@ class DifferenceEngine extends ContextSource {
                                        array( 'USE INDEX' => 'rc_timestamp' )
                                );
 
-                               if ( $change ) {
+                               if ( $change && $change->getPerformer()->getName() !== $user->getName() ) {
                                        $rcid = $change->getAttribute( 'rc_id' );
                                } else {
-                                       // None found
+                                       // None found or the page has been created by the current user.
+                                       // If the user could patrol this it already would be patrolled
                                        $rcid = 0;
                                }
                                // Build the link
                                if ( $rcid ) {
                                        $this->getOutput()->preventClickjacking();
                                        if ( $wgEnableAPI && $wgEnableWriteAPI
-                                               && $this->getUser()->isAllowed( 'writeapi' )
+                                               && $user->isAllowed( 'writeapi' )
                                        ) {
                                                $this->getOutput()->addModules( 'mediawiki.page.patrol.ajax' );
                                        }
 
-                                       $token = $this->getUser()->getEditToken( $rcid );
+                                       $token = $user->getEditToken( $rcid );
                                        $this->mMarkPatrolledLink = ' <span class="patrollink">[' . Linker::linkKnown(
                                                $this->mNewPage,
                                                $this->msg( 'markaspatrolleddiff' )->escaped(),
@@ -1179,26 +1185,29 @@ class DifferenceEngine extends ContextSource {
        function loadText() {
                if ( $this->mTextLoaded == 2 ) {
                        return true;
-               } else {
-                       // Whether it succeeds or fails, we don't want to try again
-                       $this->mTextLoaded = 2;
                }
 
+               // Whether it succeeds or fails, we don't want to try again
+               $this->mTextLoaded = 2;
+
                if ( !$this->loadRevisionData() ) {
                        return false;
                }
+
                if ( $this->mOldRev ) {
                        $this->mOldContent = $this->mOldRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
                        if ( $this->mOldContent === null ) {
                                return false;
                        }
                }
+
                if ( $this->mNewRev ) {
                        $this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
                        if ( $this->mNewContent === null ) {
                                return false;
                        }
                }
+
                return true;
        }
 
@@ -1210,13 +1219,16 @@ class DifferenceEngine extends ContextSource {
        function loadNewText() {
                if ( $this->mTextLoaded >= 1 ) {
                        return true;
-               } else {
-                       $this->mTextLoaded = 1;
                }
+
+               $this->mTextLoaded = 1;
+
                if ( !$this->loadRevisionData() ) {
                        return false;
                }
+
                $this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+
                return true;
        }
 }
index 9060731..05cb000 100644 (file)
@@ -842,8 +842,9 @@ abstract class File {
        protected function transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags ) {
                global $wgIgnoreImageErrors;
 
-               if ( $wgIgnoreImageErrors && !( $flags & self::RENDER_NOW ) ) {
-                       return $this->getHandler()->getTransform( $this, $thumbPath, $thumbUrl, $params );
+               $handler = $this->getHandler();
+               if ( $handler && $wgIgnoreImageErrors && !( $flags & self::RENDER_NOW ) ) {
+                       return $handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
                } else {
                        return new MediaTransformError( 'thumbnail_error',
                                $params['width'], 0, wfMessage( 'thumbnail-dest-create' )->text() );
@@ -1000,7 +1001,7 @@ abstract class File {
        /**
         * Get a MediaHandler instance for this file
         *
-        * @return MediaHandler
+        * @return MediaHandler|boolean Registered MediaHandler for file's mime type or false if none found
         */
        function getHandler() {
                if ( !isset( $this->handler ) ) {
index 39ef62c..91dacf8 100644 (file)
@@ -610,7 +610,11 @@ class LocalFile extends File {
                $this->load();
 
                if ( $this->isMultipage() ) {
-                       $dim = $this->getHandler()->getPageDimensions( $this, $page );
+                       $handler = $this->getHandler();
+                       if ( !$handler ) {
+                               return 0;
+                       }
+                       $dim = $handler->getPageDimensions( $this, $page );
                        if ( $dim ) {
                                return $dim['width'];
                        } else {
@@ -633,7 +637,11 @@ class LocalFile extends File {
                $this->load();
 
                if ( $this->isMultipage() ) {
-                       $dim = $this->getHandler()->getPageDimensions( $this, $page );
+                       $handler = $this->getHandler();
+                       if ( !$handler ) {
+                               return 0;
+                       }
+                       $dim = $handler->getPageDimensions( $this, $page );
                        if ( $dim ) {
                                return $dim['height'];
                        } else {
index f0c5a21..d4fe530 100644 (file)
@@ -373,7 +373,7 @@ abstract class DatabaseUpdater {
         * @param array $what what updates to perform
         */
        public function doUpdates( $what = array( 'core', 'extensions', 'stats' ) ) {
-               global $wgVersion, $wgLocalisationCacheConf;
+               global $wgVersion;
 
                $this->db->begin( __METHOD__ );
                $what = array_flip( $what );
@@ -390,14 +390,6 @@ abstract class DatabaseUpdater {
                        $this->checkStats();
                }
 
-               if ( isset( $what['purge'] ) ) {
-                       $this->purgeCache();
-
-                       if ( $wgLocalisationCacheConf['manualRecache'] ) {
-                               $this->rebuildLocalisationCache();
-                       }
-               }
-
                $this->setAppliedUpdates( $wgVersion, $this->updates );
 
                if ( $this->fileHandle ) {
index a508e24..ce282cc 100644 (file)
@@ -33,8 +33,8 @@ class InstallDocFormatter {
        protected function execute() {
                $text = $this->text;
                // Use Unix line endings, escape some wikitext stuff
-               $text = str_replace( array( '<', '{{', '[[', "\r" ),
-                       array( '&lt;', '&#123;&#123;', '&#91;&#91;', '' ), $text );
+               $text = str_replace( array( '<', '{{', '[[', '__', "\r" ),
+                       array( '&lt;', '&#123;&#123;', '&#91;&#91;', '&#95;&#95;', '' ), $text );
                // join word-wrapped lines into one
                do {
                        $prev = $text;
index 0172d84..f77ff32 100644 (file)
@@ -3206,6 +3206,7 @@ $messages['ca'] = array(
  */
 $messages['ce'] = array(
        'config-your-language' => 'Хьан мотт:',
+       'config-continue' => 'Кхин дӀа →',
        'config-page-language' => 'Мотт',
        'config-page-name' => 'ЦӀе',
        'config-no-fts3' => "'''Тергам бе''': SQLite гулйина хуттург йоцуш [//sqlite.org/fts3.html FTS3] — лахар болхбеш хир дац оцу бухца.",
@@ -12329,7 +12330,7 @@ Kuckt Är php.ini no a vergewëssert Iech datt <code>session.save_path</code>  o
        'config-restart' => 'Jo, neistarten',
        'config-welcome' => "=== Iwwerpréifung vum Installatiounsenvironnement ===
 Et gi grondsätzlech Iwwerpréifunge gemaach fir ze kucken ob den Environnment gëeegent ass fir MediaWiki z'installéieren.
-Dir sollt d'Resultater vun dëser Iwwerpréifung ugi wann Dir während der Installatioun Hëllef braucht.",
+Dir sollt d'Resultater vun dëser Iwwerpréifung ugi wann Dir während der Installatioun Hëllef frot wéi Dir D'Installatioun ofschléisse kënnt.",
        'config-sidebar' => '* [//www.mediawiki.org MediaWiki Haaptsäit]
 * [//www.mediawiki.org/wiki/Help:Contents Benotzerguide]
 * [//www.mediawiki.org/wiki/Manual:Contents Guide fir Administrateuren]
@@ -12440,7 +12441,7 @@ Dësen Numm gëtt da gebraucht fir sech an d\'Wiki anzeloggen.',
 Spezifizéiert en anere Benotzernumm.',
        'config-admin-password-blank' => 'Gitt e Passwuert fir den Adminstateur-Kont an.',
        'config-admin-password-same' => "D'Passwuert däerf net dat selwecht si wéi de Benotzernumm.",
-       'config-admin-password-mismatch' => 'Déi zwee Passwierder Déi dir aginn stëmmen net iwwerteneen.',
+       'config-admin-password-mismatch' => 'Déi zwee Passwierder Déi Dir aginn hutt stëmmen net iwwereneen.',
        'config-admin-email' => 'E-Mail-Adress:',
        'config-admin-error-user' => 'Interne Feeler beim uleeë vun engem Administrateur mam Numm "<nowiki>$1</nowiki>".',
        'config-admin-error-password' => 'Interne Feeler beim Setze vum Passwuert fir den Admin "<nowiki>$1</nowiki>": <pre>$2</pre>',
@@ -12555,8 +12556,11 @@ $messages['lo'] = array(
 
 /** Lithuanian (lietuvių)
  * @author Eitvys200
+ * @author Mantak111
  */
 $messages['lt'] = array(
+       'config-desc' => 'MediaWiki diegimas',
+       'config-title' => 'MediaWiki $1 diegimas',
        'config-information' => 'Informacija',
        'config-your-language' => 'Jūsų kalba:',
        'config-wiki-language' => 'Viki kalba:',
@@ -12564,6 +12568,8 @@ $messages['lt'] = array(
        'config-continue' => 'Toliau →',
        'config-page-language' => 'Kalba',
        'config-page-welcome' => 'Sveiki atvykę į MediaWiki!',
+       'config-page-dbconnect' => 'Prisijungti prie duomenų bazės',
+       'config-page-dbsettings' => 'Duomenų bazės nustatymai',
        'config-page-name' => 'Vardas',
        'config-page-options' => 'Parinktys',
        'config-page-install' => 'Įdiegti',
@@ -12573,7 +12579,18 @@ $messages['lt'] = array(
        'config-page-copying' => 'Kopijuojama',
        'config-page-upgradedoc' => 'Atnaujinama',
        'config-restart' => 'Taip, paleiskite jį iš naujo',
+       'config-env-php' => 'PHP $1 yra įdiegtas.',
+       'config-env-php-toolow' => 'PHP $1 įdiegta.
+Tačiau, MediaWiki reikia PHP $2 ar naujesnės.',
+       'config-db-type' => 'Duomenų bazės tipas:',
+       'config-db-host' => 'Duomenų bazės serveris:',
+       'config-db-name' => 'Duomenų bazės pavadinimas:',
+       'config-db-name-oracle' => 'Duomenų bazės schema:',
+       'config-db-username' => 'Duomenų bazės vartotojo vardas:',
+       'config-db-password' => 'Duomenų bazės slaptažodis:',
        'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+       'config-db-port' => 'Duomenų bazės prievadas:',
+       'config-db-schema' => 'MediaWiki schema:',
        'config-header-mysql' => 'MySQL nustatymai',
        'config-header-postgres' => 'PostgreSQL nustatymai',
        'config-header-sqlite' => 'SQLite nustatymai',
@@ -12586,6 +12603,7 @@ $messages['lt'] = array(
        'config-project-namespace' => 'Projekto pavadinimas:',
        'config-ns-generic' => 'Projektas',
        'config-ns-site-name' => 'Toks pat kaip viki pavadinimas: $1',
+       'config-ns-other-default' => 'ManoWiki',
        'config-admin-box' => 'Administratoriaus paskyra',
        'config-admin-name' => 'Jūsų vardas:',
        'config-admin-password' => 'Slaptažodis:',
@@ -12609,7 +12627,25 @@ $messages['lt'] = array(
        'config-install-step-done' => 'atlikta',
        'config-install-step-failed' => 'nepavyko',
        'config-install-schema' => 'Kuriama schema',
+       'config-install-tables' => 'Kuriamos lentelės',
+       'config-install-stats' => 'Inicijuojamos statistikos',
        'config-install-keys' => 'Generuojami slapti raktai',
+       'config-install-done' => "'''Sveikiname!'''
+Jūs sėkmingai įdiegėte MediaWiki.
+
+Įdiegimo programa sukūrė <code>LocalSettings.php</code> failą.
+Jame yra visos jūsų konfigūracijos.
+
+Jums reikės atsisiųsti ir įdėti jį į savo wiki įdiegimo bazę (pačiame kataloge, kaip index.php). Atsisiuntimas turėtų prasidėti automatiškai.
+
+Jei atsisiuntimas nebuvo pasiūlytas, arba jį atšaukėte, galite iš naujo atsisiųsti paspaudę žemiau esančią nuorodą:
+
+<span class=\"notranslate\" versti=\"no\">\$3</span>
+
+'''Pastaba:''' Jei jūs to nepadarysite dabar, tada šis sukurtas konfigūracijos failas nebus galimas vėliau, jei išeisite iš įdiegimo be atsisiuntimo.
+
+Kai baigsite, jūs galėsite '''[\$2 įeiti į savo wiki]'''.",
+       'config-download-localsettings' => 'Atsisiųsti <code>LocalSettings.php</code>',
        'config-help' => 'pagalba',
        'mainpagetext' => "'''MediaWiki sėkmingai įdiegta.'''",
        'mainpagedocfooter' => 'Informacijos apie wiki programinės įrangos naudojimą, ieškokite [//meta.wikimedia.org/wiki/Help:Contents žinyne].
@@ -15322,8 +15358,8 @@ Sprawdź plik php.ini i upewnij się, że <code>session.save_path</code> wskazuj
        'config-help-restart' => 'Czy chcesz usunąć wszystkie zapisane dane i uruchomić ponownie proces instalacji?',
        'config-restart' => 'Tak, zacznij od nowa',
        'config-welcome' => '=== Sprawdzenie środowiska instalacji ===
-Wykonywane są podstawowe testy sprawdzające czy to środowisko jest odpowiednie dla instalacji MediaWiki.
-Jeśli potrzebujesz pomocy podczas instalacji załącz wyniki tych testów.',
+Teraz zostaną wykonane podstawowe testy sprawdzające czy to środowisko jest odpowiednie dla instalacji MediaWiki.
+Jeśli potrzebujesz pomocy podczas instalacji, załącz wyniki tych testów.',
        'config-copyright' => "=== Prawa autorskie i warunki użytkowania ===
 
 $1
@@ -17354,6 +17390,7 @@ $messages['roa-tara'] = array(
  * @author Krinkle
  * @author Lockal
  * @author MaxSem
+ * @author Okras
  * @author Yuriy Apostol
  * @author Александр Сигачёв
  * @author Сrower
@@ -17411,8 +17448,8 @@ $1',
        'config-help-restart' => 'Вы хотите удалить все сохранённые данные, которые вы ввели, и запустить процесс установки заново?',
        'config-restart' => 'Да, начать заново',
        'config-welcome' => '=== Проверка окружения ===
\9fÑ\80оводÑ\8fÑ\82Ñ\81Ñ\8f базовые проверки с целью определить, подходит ли данная система для установки MediaWiki.
£ÐºÐ°Ð¶Ð¸Ñ\82е Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82Ñ\8b Ñ\8dÑ\82иÑ\85 Ð¿Ñ\80овеÑ\80ок Ð¿Ñ\80и Ð¾Ð±Ñ\80аÑ\89ении Ð·Ð° Ð¿Ð¾Ð¼Ð¾Ñ\89Ñ\8cÑ\8e Ñ\81 Ñ\83Ñ\81Ñ\82ановкой.',
\91Ñ\83дÑ\83Ñ\82 Ð¿Ñ\80оведенÑ\8b базовые проверки с целью определить, подходит ли данная система для установки MediaWiki.
\9dе Ð·Ð°Ð±Ñ\83дÑ\8cÑ\82е Ð²ÐºÐ»Ñ\8eÑ\87иÑ\82Ñ\8c Ñ\8dÑ\82Ñ\83 Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8e, ÐµÑ\81ли Ð²Ð°Ð¼ Ð¿Ð¾Ñ\82Ñ\80ебÑ\83еÑ\82Ñ\81Ñ\8f Ð¿Ð¾Ð¼Ð¾Ñ\89Ñ\8c Ð´Ð»Ñ\8f Ð·Ð°Ð²ÐµÑ\80Ñ\88ениÑ\8f Ñ\83Ñ\81Ñ\82ановки.',
        'config-copyright' => "=== Авторские права и условия ===
 
 $1
index e0bf3d7..c0b5243 100644 (file)
@@ -89,8 +89,10 @@ class MysqlInstaller extends DatabaseInstaller {
                return $this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
                        Html::openElement( 'fieldset' ) .
                        Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
-                       $this->getTextBox( 'wgDBname', 'config-db-name', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-name-help' ) ) .
-                       $this->getTextBox( 'wgDBprefix', 'config-db-prefix', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-prefix-help' ) ) .
+                       $this->getTextBox( 'wgDBname', 'config-db-name', array( 'dir' => 'ltr' ),
+                               $this->parent->getHelpBox( 'config-db-name-help' ) ) .
+                       $this->getTextBox( 'wgDBprefix', 'config-db-prefix', array( 'dir' => 'ltr' ),
+                               $this->parent->getHelpBox( 'config-db-prefix-help' ) ) .
                        Html::closeElement( 'fieldset' ) .
                        $this->getInstallUserBox();
        }
@@ -475,7 +477,7 @@ class MysqlInstaller extends DatabaseInstaller {
                $conn = $status->value;
                $dbName = $this->getVar( 'wgDBname' );
                if ( !$conn->selectDB( $dbName ) ) {
-                       $conn->query( "CREATE DATABASE " . $conn->addIdentifierQuotes( $dbName ), __METHOD__ );
+                       $conn->query( "CREATE DATABASE " . $conn->addIdentifierQuotes( $dbName ) . "CHARACTER SET utf8", __METHOD__ );
                        $conn->selectDB( $dbName );
                }
                $this->setupSchemaVars();
index 474212b..4fc8bac 100644 (file)
@@ -48,7 +48,7 @@ class RefreshLinksJob extends Job {
                # Wait for the DB of the current/next slave DB handle to catch up to the master.
                # This way, we get the correct page_latest for templates or files that just changed
                # milliseconds ago, having triggered this job to begin with.
-               if ( !empty( $this->params['masterPos'] ) ) {
+               if ( isset( $this->params['masterPos'] ) && $this->params['masterPos'] !== false ) {
                        wfGetLB()->waitFor( $this->params['masterPos'] );
                }
 
index 8b0e287..4f142fc 100644 (file)
@@ -81,11 +81,39 @@ class CSSMin {
                return $files;
        }
 
+       /**
+        * Encode an image file as a base64 data URI.
+        * If the image file has a suitable MIME type and size, encode it as a
+        * base64 data URI. Return false if the image type is unfamiliar or exceeds
+        * the size limit.
+        *
+        * @param string $file Image file to encode.
+        * @param string|null $type File's MIME type or null. If null, CSSMin will
+        *     try to autodetect the type.
+        * @param int|bool $sizeLimit If the size of the target file is greater than
+        *     this value, decline to encode the image file and return false
+        *     instead. If $sizeLimit is false, no limit is enforced.
+        * @return string|bool: Image contents encoded as a data URI or false.
+        */
+       public static function encodeImageAsDataURI( $file, $type = null, $sizeLimit = self::EMBED_SIZE_LIMIT ) {
+               if ( $sizeLimit !== false && filesize( $file ) >= $sizeLimit ) {
+                       return false;
+               }
+               if ( $type === null ) {
+                       $type = self::getMimeType( $file );
+               }
+               if ( !$type ) {
+                       return false;
+               }
+               $data = base64_encode( file_get_contents( $file ) );
+               return 'data:' . $type . ';base64,' . $data;
+       }
+
        /**
         * @param $file string
         * @return bool|string
         */
-       protected static function getMimeType( $file ) {
+       public static function getMimeType( $file ) {
                $realpath = realpath( $file );
                // Try a couple of different ways to get the mime-type of a file, in order of
                // preference
@@ -174,23 +202,14 @@ class CSSMin {
                                // using Z for the timezone, meaning GMT
                                $url .= '?' . gmdate( 'Y-m-d\TH:i:s\Z', round( filemtime( $file ), -2 ) );
                                // Embedding requires a bit of extra processing, so let's skip that if we can
-                               if ( $embedData && $embed ) {
-                                       $type = self::getMimeType( $file );
-                                       // Detect when URLs were preceeded with embed tags, and also verify file size is
-                                       // below the limit
-                                       if (
-                                               $type
-                                               && $match['embed'][1] > 0
-                                               && filesize( $file ) < self::EMBED_SIZE_LIMIT
-                                       ) {
-                                               // Strip off any trailing = symbols (makes browsers freak out)
-                                               $data = base64_encode( file_get_contents( $file ) );
+                               if ( $embedData && $embed && $match['embed'][1] > 0 ) {
+                                       $data = self::encodeImageAsDataURI( $file );
+                                       if ( $data !== false ) {
                                                // Build 2 CSS properties; one which uses a base64 encoded data URI in place
                                                // of the @embed comment to try and retain line-number integrity, and the
                                                // other with a remapped an versioned URL and an Internet Explorer hack
                                                // making it ignored in all browsers that support data URIs
-                                               $replacement = "{$pre}url(data:{$type};base64,{$data}){$post};";
-                                               $replacement .= "{$pre}url({$url}){$post}!ie;";
+                                               $replacement = "{$pre}url({$data}){$post};{$pre}url({$url}){$post}!ie;";
                                        }
                                }
                                if ( $replacement === false ) {
diff --git a/includes/libs/lessc.inc.php b/includes/libs/lessc.inc.php
new file mode 100644 (file)
index 0000000..6db21be
--- /dev/null
@@ -0,0 +1,3709 @@
+<?php
+
+/**
+ * lessphp v0.4.0@785ad53840
+ * http://leafo.net/lessphp
+ *
+ * LESS css compiler, adapted from http://lesscss.org
+ *
+ * For ease of distribution, lessphp 0.4.0 is under a dual license.
+ * You are free to pick which one suits your needs.
+ *
+ * MIT LICENSE
+ *
+ * Copyright 2013, Leaf Corcoran <leafot@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * GPL VERSION 3
+ *
+ * Please refer to http://www.gnu.org/licenses/gpl-3.0.html for the full
+ * text of the GPL version 3
+ */
+
+
+/**
+ * The less compiler and parser.
+ *
+ * Converting LESS to CSS is a three stage process. The incoming file is parsed
+ * by `lessc_parser` into a syntax tree, then it is compiled into another tree
+ * representing the CSS structure by `lessc`. The CSS tree is fed into a
+ * formatter, like `lessc_formatter` which then outputs CSS as a string.
+ *
+ * During the first compile, all values are *reduced*, which means that their
+ * types are brought to the lowest form before being dump as strings. This
+ * handles math equations, variable dereferences, and the like.
+ *
+ * The `parse` function of `lessc` is the entry point.
+ *
+ * In summary:
+ *
+ * The `lessc` class creates an instance of the parser, feeds it LESS code,
+ * then transforms the resulting tree to a CSS tree. This class also holds the
+ * evaluation context, such as all available mixins and variables at any given
+ * time.
+ *
+ * The `lessc_parser` class is only concerned with parsing its input.
+ *
+ * The `lessc_formatter` takes a CSS tree, and dumps it to a formatted string,
+ * handling things like indentation.
+ */
+class lessc {
+       static public $VERSION = "v0.4.0";
+       static protected $TRUE = array("keyword", "true");
+       static protected $FALSE = array("keyword", "false");
+
+       protected $libFunctions = array();
+       protected $registeredVars = array();
+       protected $preserveComments = false;
+
+       public $vPrefix = '@'; // prefix of abstract properties
+       public $mPrefix = '$'; // prefix of abstract blocks
+       public $parentSelector = '&';
+
+       public $importDisabled = false;
+       public $importDir = '';
+
+       protected $numberPrecision = null;
+
+       protected $allParsedFiles = array();
+
+       // set to the parser that generated the current line when compiling
+       // so we know how to create error messages
+       protected $sourceParser = null;
+       protected $sourceLoc = null;
+
+       static public $defaultValue = array("keyword", "");
+
+       static protected $nextImportId = 0; // uniquely identify imports
+
+       // attempts to find the path of an import url, returns null for css files
+       protected function findImport($url) {
+               foreach ((array)$this->importDir as $dir) {
+                       $full = $dir.(substr($dir, -1) != '/' ? '/' : '').$url;
+                       if ($this->fileExists($file = $full.'.less') || $this->fileExists($file = $full)) {
+                               return $file;
+                       }
+               }
+
+               return null;
+       }
+
+       protected function fileExists($name) {
+               return is_file($name);
+       }
+
+       static public function compressList($items, $delim) {
+               if (!isset($items[1]) && isset($items[0])) return $items[0];
+               else return array('list', $delim, $items);
+       }
+
+       static public function preg_quote($what) {
+               return preg_quote($what, '/');
+       }
+
+       protected function tryImport($importPath, $parentBlock, $out) {
+               if ($importPath[0] == "function" && $importPath[1] == "url") {
+                       $importPath = $this->flattenList($importPath[2]);
+               }
+
+               $str = $this->coerceString($importPath);
+               if ($str === null) return false;
+
+               $url = $this->compileValue($this->lib_e($str));
+
+               // don't import if it ends in css
+               if (substr_compare($url, '.css', -4, 4) === 0) return false;
+
+               $realPath = $this->findImport($url);
+
+               if ($realPath === null) return false;
+
+               if ($this->importDisabled) {
+                       return array(false, "/* import disabled */");
+               }
+
+               if (isset($this->allParsedFiles[realpath($realPath)])) {
+                       return array(false, null);
+               }
+
+               $this->addParsedFile($realPath);
+               $parser = $this->makeParser($realPath);
+               $root = $parser->parse(file_get_contents($realPath));
+
+               // set the parents of all the block props
+               foreach ($root->props as $prop) {
+                       if ($prop[0] == "block") {
+                               $prop[1]->parent = $parentBlock;
+                       }
+               }
+
+               // copy mixins into scope, set their parents
+               // bring blocks from import into current block
+               // TODO: need to mark the source parser these came from this file
+               foreach ($root->children as $childName => $child) {
+                       if (isset($parentBlock->children[$childName])) {
+                               $parentBlock->children[$childName] = array_merge(
+                                       $parentBlock->children[$childName],
+                                       $child);
+                       } else {
+                               $parentBlock->children[$childName] = $child;
+                       }
+               }
+
+               $pi = pathinfo($realPath);
+               $dir = $pi["dirname"];
+
+               list($top, $bottom) = $this->sortProps($root->props, true);
+               $this->compileImportedProps($top, $parentBlock, $out, $parser, $dir);
+
+               return array(true, $bottom, $parser, $dir);
+       }
+
+       protected function compileImportedProps($props, $block, $out, $sourceParser, $importDir) {
+               $oldSourceParser = $this->sourceParser;
+
+               $oldImport = $this->importDir;
+
+               // TODO: this is because the importDir api is stupid
+               $this->importDir = (array)$this->importDir;
+               array_unshift($this->importDir, $importDir);
+
+               foreach ($props as $prop) {
+                       $this->compileProp($prop, $block, $out);
+               }
+
+               $this->importDir = $oldImport;
+               $this->sourceParser = $oldSourceParser;
+       }
+
+       /**
+        * Recursively compiles a block.
+        *
+        * A block is analogous to a CSS block in most cases. A single LESS document
+        * is encapsulated in a block when parsed, but it does not have parent tags
+        * so all of it's children appear on the root level when compiled.
+        *
+        * Blocks are made up of props and children.
+        *
+        * Props are property instructions, array tuples which describe an action
+        * to be taken, eg. write a property, set a variable, mixin a block.
+        *
+        * The children of a block are just all the blocks that are defined within.
+        * This is used to look up mixins when performing a mixin.
+        *
+        * Compiling the block involves pushing a fresh environment on the stack,
+        * and iterating through the props, compiling each one.
+        *
+        * See lessc::compileProp()
+        *
+        */
+       protected function compileBlock($block) {
+               switch ($block->type) {
+               case "root":
+                       $this->compileRoot($block);
+                       break;
+               case null:
+                       $this->compileCSSBlock($block);
+                       break;
+               case "media":
+                       $this->compileMedia($block);
+                       break;
+               case "directive":
+                       $name = "@" . $block->name;
+                       if (!empty($block->value)) {
+                               $name .= " " . $this->compileValue($this->reduce($block->value));
+                       }
+
+                       $this->compileNestedBlock($block, array($name));
+                       break;
+               default:
+                       $this->throwError("unknown block type: $block->type\n");
+               }
+       }
+
+       protected function compileCSSBlock($block) {
+               $env = $this->pushEnv();
+
+               $selectors = $this->compileSelectors($block->tags);
+               $env->selectors = $this->multiplySelectors($selectors);
+               $out = $this->makeOutputBlock(null, $env->selectors);
+
+               $this->scope->children[] = $out;
+               $this->compileProps($block, $out);
+
+               $block->scope = $env; // mixins carry scope with them!
+               $this->popEnv();
+       }
+
+       protected function compileMedia($media) {
+               $env = $this->pushEnv($media);
+               $parentScope = $this->mediaParent($this->scope);
+
+               $query = $this->compileMediaQuery($this->multiplyMedia($env));
+
+               $this->scope = $this->makeOutputBlock($media->type, array($query));
+               $parentScope->children[] = $this->scope;
+
+               $this->compileProps($media, $this->scope);
+
+               if (count($this->scope->lines) > 0) {
+                       $orphanSelelectors = $this->findClosestSelectors();
+                       if (!is_null($orphanSelelectors)) {
+                               $orphan = $this->makeOutputBlock(null, $orphanSelelectors);
+                               $orphan->lines = $this->scope->lines;
+                               array_unshift($this->scope->children, $orphan);
+                               $this->scope->lines = array();
+                       }
+               }
+
+               $this->scope = $this->scope->parent;
+               $this->popEnv();
+       }
+
+       protected function mediaParent($scope) {
+               while (!empty($scope->parent)) {
+                       if (!empty($scope->type) && $scope->type != "media") {
+                               break;
+                       }
+                       $scope = $scope->parent;
+               }
+
+               return $scope;
+       }
+
+       protected function compileNestedBlock($block, $selectors) {
+               $this->pushEnv($block);
+               $this->scope = $this->makeOutputBlock($block->type, $selectors);
+               $this->scope->parent->children[] = $this->scope;
+
+               $this->compileProps($block, $this->scope);
+
+               $this->scope = $this->scope->parent;
+               $this->popEnv();
+       }
+
+       protected function compileRoot($root) {
+               $this->pushEnv();
+               $this->scope = $this->makeOutputBlock($root->type);
+               $this->compileProps($root, $this->scope);
+               $this->popEnv();
+       }
+
+       protected function compileProps($block, $out) {
+               foreach ($this->sortProps($block->props) as $prop) {
+                       $this->compileProp($prop, $block, $out);
+               }
+
+               $out->lines = array_values(array_unique($out->lines));
+       }
+
+       protected function sortProps($props, $split = false) {
+               $vars = array();
+               $imports = array();
+               $other = array();
+
+               foreach ($props as $prop) {
+                       switch ($prop[0]) {
+                       case "assign":
+                               if (isset($prop[1][0]) && $prop[1][0] == $this->vPrefix) {
+                                       $vars[] = $prop;
+                               } else {
+                                       $other[] = $prop;
+                               }
+                               break;
+                       case "import":
+                               $id = self::$nextImportId++;
+                               $prop[] = $id;
+                               $imports[] = $prop;
+                               $other[] = array("import_mixin", $id);
+                               break;
+                       default:
+                               $other[] = $prop;
+                       }
+               }
+
+               if ($split) {
+                       return array(array_merge($vars, $imports), $other);
+               } else {
+                       return array_merge($vars, $imports, $other);
+               }
+       }
+
+       protected function compileMediaQuery($queries) {
+               $compiledQueries = array();
+               foreach ($queries as $query) {
+                       $parts = array();
+                       foreach ($query as $q) {
+                               switch ($q[0]) {
+                               case "mediaType":
+                                       $parts[] = implode(" ", array_slice($q, 1));
+                                       break;
+                               case "mediaExp":
+                                       if (isset($q[2])) {
+                                               $parts[] = "($q[1]: " .
+                                                       $this->compileValue($this->reduce($q[2])) . ")";
+                                       } else {
+                                               $parts[] = "($q[1])";
+                                       }
+                                       break;
+                               case "variable":
+                                       $parts[] = $this->compileValue($this->reduce($q));
+                               break;
+                               }
+                       }
+
+                       if (count($parts) > 0) {
+                               $compiledQueries[] =  implode(" and ", $parts);
+                       }
+               }
+
+               $out = "@media";
+               if (!empty($parts)) {
+                       $out .= " " .
+                               implode($this->formatter->selectorSeparator, $compiledQueries);
+               }
+               return $out;
+       }
+
+       protected function multiplyMedia($env, $childQueries = null) {
+               if (is_null($env) ||
+                       !empty($env->block->type) && $env->block->type != "media")
+               {
+                       return $childQueries;
+               }
+
+               // plain old block, skip
+               if (empty($env->block->type)) {
+                       return $this->multiplyMedia($env->parent, $childQueries);
+               }
+
+               $out = array();
+               $queries = $env->block->queries;
+               if (is_null($childQueries)) {
+                       $out = $queries;
+               } else {
+                       foreach ($queries as $parent) {
+                               foreach ($childQueries as $child) {
+                                       $out[] = array_merge($parent, $child);
+                               }
+                       }
+               }
+
+               return $this->multiplyMedia($env->parent, $out);
+       }
+
+       protected function expandParentSelectors(&$tag, $replace) {
+               $parts = explode("$&$", $tag);
+               $count = 0;
+               foreach ($parts as &$part) {
+                       $part = str_replace($this->parentSelector, $replace, $part, $c);
+                       $count += $c;
+               }
+               $tag = implode($this->parentSelector, $parts);
+               return $count;
+       }
+
+       protected function findClosestSelectors() {
+               $env = $this->env;
+               $selectors = null;
+               while ($env !== null) {
+                       if (isset($env->selectors)) {
+                               $selectors = $env->selectors;
+                               break;
+                       }
+                       $env = $env->parent;
+               }
+
+               return $selectors;
+       }
+
+
+       // multiply $selectors against the nearest selectors in env
+       protected function multiplySelectors($selectors) {
+               // find parent selectors
+
+               $parentSelectors = $this->findClosestSelectors();
+               if (is_null($parentSelectors)) {
+                       // kill parent reference in top level selector
+                       foreach ($selectors as &$s) {
+                               $this->expandParentSelectors($s, "");
+                       }
+
+                       return $selectors;
+               }
+
+               $out = array();
+               foreach ($parentSelectors as $parent) {
+                       foreach ($selectors as $child) {
+                               $count = $this->expandParentSelectors($child, $parent);
+
+                               // don't prepend the parent tag if & was used
+                               if ($count > 0) {
+                                       $out[] = trim($child);
+                               } else {
+                                       $out[] = trim($parent . ' ' . $child);
+                               }
+                       }
+               }
+
+               return $out;
+       }
+
+       // reduces selector expressions
+       protected function compileSelectors($selectors) {
+               $out = array();
+
+               foreach ($selectors as $s) {
+                       if (is_array($s)) {
+                               list(, $value) = $s;
+                               $out[] = trim($this->compileValue($this->reduce($value)));
+                       } else {
+                               $out[] = $s;
+                       }
+               }
+
+               return $out;
+       }
+
+       protected function eq($left, $right) {
+               return $left == $right;
+       }
+
+       protected function patternMatch($block, $orderedArgs, $keywordArgs) {
+               // match the guards if it has them
+               // any one of the groups must have all its guards pass for a match
+               if (!empty($block->guards)) {
+                       $groupPassed = false;
+                       foreach ($block->guards as $guardGroup) {
+                               foreach ($guardGroup as $guard) {
+                                       $this->pushEnv();
+                                       $this->zipSetArgs($block->args, $orderedArgs, $keywordArgs);
+
+                                       $negate = false;
+                                       if ($guard[0] == "negate") {
+                                               $guard = $guard[1];
+                                               $negate = true;
+                                       }
+
+                                       $passed = $this->reduce($guard) == self::$TRUE;
+                                       if ($negate) $passed = !$passed;
+
+                                       $this->popEnv();
+
+                                       if ($passed) {
+                                               $groupPassed = true;
+                                       } else {
+                                               $groupPassed = false;
+                                               break;
+                                       }
+                               }
+
+                               if ($groupPassed) break;
+                       }
+
+                       if (!$groupPassed) {
+                               return false;
+                       }
+               }
+
+               if (empty($block->args)) {
+                       return $block->isVararg || empty($orderedArgs) && empty($keywordArgs);
+               }
+
+               $remainingArgs = $block->args;
+               if ($keywordArgs) {
+                       $remainingArgs = array();
+                       foreach ($block->args as $arg) {
+                               if ($arg[0] == "arg" && isset($keywordArgs[$arg[1]])) {
+                                       continue;
+                               }
+
+                               $remainingArgs[] = $arg;
+                       }
+               }
+
+               $i = -1; // no args
+               // try to match by arity or by argument literal
+               foreach ($remainingArgs as $i => $arg) {
+                       switch ($arg[0]) {
+                       case "lit":
+                               if (empty($orderedArgs[$i]) || !$this->eq($arg[1], $orderedArgs[$i])) {
+                                       return false;
+                               }
+                               break;
+                       case "arg":
+                               // no arg and no default value
+                               if (!isset($orderedArgs[$i]) && !isset($arg[2])) {
+                                       return false;
+                               }
+                               break;
+                       case "rest":
+                               $i--; // rest can be empty
+                               break 2;
+                       }
+               }
+
+               if ($block->isVararg) {
+                       return true; // not having enough is handled above
+               } else {
+                       $numMatched = $i + 1;
+                       // greater than becuase default values always match
+                       return $numMatched >= count($orderedArgs);
+               }
+       }
+
+       protected function patternMatchAll($blocks, $orderedArgs, $keywordArgs, $skip=array()) {
+               $matches = null;
+               foreach ($blocks as $block) {
+                       // skip seen blocks that don't have arguments
+                       if (isset($skip[$block->id]) && !isset($block->args)) {
+                               continue;
+                       }
+
+                       if ($this->patternMatch($block, $orderedArgs, $keywordArgs)) {
+                               $matches[] = $block;
+                       }
+               }
+
+               return $matches;
+       }
+
+       // attempt to find blocks matched by path and args
+       protected function findBlocks($searchIn, $path, $orderedArgs, $keywordArgs, $seen=array()) {
+               if ($searchIn == null) return null;
+               if (isset($seen[$searchIn->id])) return null;
+               $seen[$searchIn->id] = true;
+
+               $name = $path[0];
+
+               if (isset($searchIn->children[$name])) {
+                       $blocks = $searchIn->children[$name];
+                       if (count($path) == 1) {
+                               $matches = $this->patternMatchAll($blocks, $orderedArgs, $keywordArgs, $seen);
+                               if (!empty($matches)) {
+                                       // This will return all blocks that match in the closest
+                                       // scope that has any matching block, like lessjs
+                                       return $matches;
+                               }
+                       } else {
+                               $matches = array();
+                               foreach ($blocks as $subBlock) {
+                                       $subMatches = $this->findBlocks($subBlock,
+                                               array_slice($path, 1), $orderedArgs, $keywordArgs, $seen);
+
+                                       if (!is_null($subMatches)) {
+                                               foreach ($subMatches as $sm) {
+                                                       $matches[] = $sm;
+                                               }
+                                       }
+                               }
+
+                               return count($matches) > 0 ? $matches : null;
+                       }
+               }
+               if ($searchIn->parent === $searchIn) return null;
+               return $this->findBlocks($searchIn->parent, $path, $orderedArgs, $keywordArgs, $seen);
+       }
+
+       // sets all argument names in $args to either the default value
+       // or the one passed in through $values
+       protected function zipSetArgs($args, $orderedValues, $keywordValues) {
+               $assignedValues = array();
+
+               $i = 0;
+               foreach ($args as  $a) {
+                       if ($a[0] == "arg") {
+                               if (isset($keywordValues[$a[1]])) {
+                                       // has keyword arg
+                                       $value = $keywordValues[$a[1]];
+                               } elseif (isset($orderedValues[$i])) {
+                                       // has ordered arg
+                                       $value = $orderedValues[$i];
+                                       $i++;
+                               } elseif (isset($a[2])) {
+                                       // has default value
+                                       $value = $a[2];
+                               } else {
+                                       $this->throwError("Failed to assign arg " . $a[1]);
+                                       $value = null; // :(
+                               }
+
+                               $value = $this->reduce($value);
+                               $this->set($a[1], $value);
+                               $assignedValues[] = $value;
+                       } else {
+                               // a lit
+                               $i++;
+                       }
+               }
+
+               // check for a rest
+               $last = end($args);
+               if ($last[0] == "rest") {
+                       $rest = array_slice($orderedValues, count($args) - 1);
+                       $this->set($last[1], $this->reduce(array("list", " ", $rest)));
+               }
+
+               // wow is this the only true use of PHP's + operator for arrays?
+               $this->env->arguments = $assignedValues + $orderedValues;
+       }
+
+       // compile a prop and update $lines or $blocks appropriately
+       protected function compileProp($prop, $block, $out) {
+               // set error position context
+               $this->sourceLoc = isset($prop[-1]) ? $prop[-1] : -1;
+
+               switch ($prop[0]) {
+               case 'assign':
+                       list(, $name, $value) = $prop;
+                       if ($name[0] == $this->vPrefix) {
+                               $this->set($name, $value);
+                       } else {
+                               $out->lines[] = $this->formatter->property($name,
+                                               $this->compileValue($this->reduce($value)));
+                       }
+                       break;
+               case 'block':
+                       list(, $child) = $prop;
+                       $this->compileBlock($child);
+                       break;
+               case 'mixin':
+                       list(, $path, $args, $suffix) = $prop;
+
+                       $orderedArgs = array();
+                       $keywordArgs = array();
+                       foreach ((array)$args as $arg) {
+                               $argval = null;
+                               switch ($arg[0]) {
+                               case "arg":
+                                       if (!isset($arg[2])) {
+                                               $orderedArgs[] = $this->reduce(array("variable", $arg[1]));
+                                       } else {
+                                               $keywordArgs[$arg[1]] = $this->reduce($arg[2]);
+                                       }
+                                       break;
+
+                               case "lit":
+                                       $orderedArgs[] = $this->reduce($arg[1]);
+                                       break;
+                               default:
+                                       $this->throwError("Unknown arg type: " . $arg[0]);
+                               }
+                       }
+
+                       $mixins = $this->findBlocks($block, $path, $orderedArgs, $keywordArgs);
+
+                       if ($mixins === null) {
+                               // fwrite(STDERR,"failed to find block: ".implode(" > ", $path)."\n");
+                               break; // throw error here??
+                       }
+
+                       foreach ($mixins as $mixin) {
+                               if ($mixin === $block && !$orderedArgs) {
+                                       continue;
+                               }
+
+                               $haveScope = false;
+                               if (isset($mixin->parent->scope)) {
+                                       $haveScope = true;
+                                       $mixinParentEnv = $this->pushEnv();
+                                       $mixinParentEnv->storeParent = $mixin->parent->scope;
+                               }
+
+                               $haveArgs = false;
+                               if (isset($mixin->args)) {
+                                       $haveArgs = true;
+                                       $this->pushEnv();
+                                       $this->zipSetArgs($mixin->args, $orderedArgs, $keywordArgs);
+                               }
+
+                               $oldParent = $mixin->parent;
+                               if ($mixin != $block) $mixin->parent = $block;
+
+                               foreach ($this->sortProps($mixin->props) as $subProp) {
+                                       if ($suffix !== null &&
+                                               $subProp[0] == "assign" &&
+                                               is_string($subProp[1]) &&
+                                               $subProp[1]{0} != $this->vPrefix)
+                                       {
+                                               $subProp[2] = array(
+                                                       'list', ' ',
+                                                       array($subProp[2], array('keyword', $suffix))
+                                               );
+                                       }
+
+                                       $this->compileProp($subProp, $mixin, $out);
+                               }
+
+                               $mixin->parent = $oldParent;
+
+                               if ($haveArgs) $this->popEnv();
+                               if ($haveScope) $this->popEnv();
+                       }
+
+                       break;
+               case 'raw':
+                       $out->lines[] = $prop[1];
+                       break;
+               case "directive":
+                       list(, $name, $value) = $prop;
+                       $out->lines[] = "@$name " . $this->compileValue($this->reduce($value)).';';
+                       break;
+               case "comment":
+                       $out->lines[] = $prop[1];
+                       break;
+               case "import";
+                       list(, $importPath, $importId) = $prop;
+                       $importPath = $this->reduce($importPath);
+
+                       if (!isset($this->env->imports)) {
+                               $this->env->imports = array();
+                       }
+
+                       $result = $this->tryImport($importPath, $block, $out);
+
+                       $this->env->imports[$importId] = $result === false ?
+                               array(false, "@import " . $this->compileValue($importPath).";") :
+                               $result;
+
+                       break;
+               case "import_mixin":
+                       list(,$importId) = $prop;
+                       $import = $this->env->imports[$importId];
+                       if ($import[0] === false) {
+                               if (isset($import[1])) {
+                                       $out->lines[] = $import[1];
+                               }
+                       } else {
+                               list(, $bottom, $parser, $importDir) = $import;
+                               $this->compileImportedProps($bottom, $block, $out, $parser, $importDir);
+                       }
+
+                       break;
+               default:
+                       $this->throwError("unknown op: {$prop[0]}\n");
+               }
+       }
+
+
+       /**
+        * Compiles a primitive value into a CSS property value.
+        *
+        * Values in lessphp are typed by being wrapped in arrays, their format is
+        * typically:
+        *
+        *     array(type, contents [, additional_contents]*)
+        *
+        * The input is expected to be reduced. This function will not work on
+        * things like expressions and variables.
+        */
+       protected function compileValue($value) {
+               switch ($value[0]) {
+               case 'list':
+                       // [1] - delimiter
+                       // [2] - array of values
+                       return implode($value[1], array_map(array($this, 'compileValue'), $value[2]));
+               case 'raw_color':
+                       if (!empty($this->formatter->compressColors)) {
+                               return $this->compileValue($this->coerceColor($value));
+                       }
+                       return $value[1];
+               case 'keyword':
+                       // [1] - the keyword
+                       return $value[1];
+               case 'number':
+                       list(, $num, $unit) = $value;
+                       // [1] - the number
+                       // [2] - the unit
+                       if ($this->numberPrecision !== null) {
+                               $num = round($num, $this->numberPrecision);
+                       }
+                       return $num . $unit;
+               case 'string':
+                       // [1] - contents of string (includes quotes)
+                       list(, $delim, $content) = $value;
+                       foreach ($content as &$part) {
+                               if (is_array($part)) {
+                                       $part = $this->compileValue($part);
+                               }
+                       }
+                       return $delim . implode($content) . $delim;
+               case 'color':
+                       // [1] - red component (either number or a %)
+                       // [2] - green component
+                       // [3] - blue component
+                       // [4] - optional alpha component
+                       list(, $r, $g, $b) = $value;
+                       $r = round($r);
+                       $g = round($g);
+                       $b = round($b);
+
+                       if (count($value) == 5 && $value[4] != 1) { // rgba
+                               return 'rgba('.$r.','.$g.','.$b.','.$value[4].')';
+                       }
+
+                       $h = sprintf("#%02x%02x%02x", $r, $g, $b);
+
+                       if (!empty($this->formatter->compressColors)) {
+                               // Converting hex color to short notation (e.g. #003399 to #039)
+                               if ($h[1] === $h[2] && $h[3] === $h[4] && $h[5] === $h[6]) {
+                                       $h = '#' . $h[1] . $h[3] . $h[5];
+                               }
+                       }
+
+                       return $h;
+
+               case 'function':
+                       list(, $name, $args) = $value;
+                       return $name.'('.$this->compileValue($args).')';
+               default: // assumed to be unit
+                       $this->throwError("unknown value type: $value[0]");
+               }
+       }
+
+       protected function lib_pow($args) {
+               list($base, $exp) = $this->assertArgs($args, 2, "pow");
+               return pow($this->assertNumber($base), $this->assertNumber($exp));
+       }
+
+       protected function lib_pi() {
+               return pi();
+       }
+
+       protected function lib_mod($args) {
+               list($a, $b) = $this->assertArgs($args, 2, "mod");
+               return $this->assertNumber($a) % $this->assertNumber($b);
+       }
+
+       protected function lib_tan($num) {
+               return tan($this->assertNumber($num));
+       }
+
+       protected function lib_sin($num) {
+               return sin($this->assertNumber($num));
+       }
+
+       protected function lib_cos($num) {
+               return cos($this->assertNumber($num));
+       }
+
+       protected function lib_atan($num) {
+               $num = atan($this->assertNumber($num));
+               return array("number", $num, "rad");
+       }
+
+       protected function lib_asin($num) {
+               $num = asin($this->assertNumber($num));
+               return array("number", $num, "rad");
+       }
+
+       protected function lib_acos($num) {
+               $num = acos($this->assertNumber($num));
+               return array("number", $num, "rad");
+       }
+
+       protected function lib_sqrt($num) {
+               return sqrt($this->assertNumber($num));
+       }
+
+       protected function lib_extract($value) {
+               list($list, $idx) = $this->assertArgs($value, 2, "extract");
+               $idx = $this->assertNumber($idx);
+               // 1 indexed
+               if ($list[0] == "list" && isset($list[2][$idx - 1])) {
+                       return $list[2][$idx - 1];
+               }
+       }
+
+       protected function lib_isnumber($value) {
+               return $this->toBool($value[0] == "number");
+       }
+
+       protected function lib_isstring($value) {
+               return $this->toBool($value[0] == "string");
+       }
+
+       protected function lib_iscolor($value) {
+               return $this->toBool($this->coerceColor($value));
+       }
+
+       protected function lib_iskeyword($value) {
+               return $this->toBool($value[0] == "keyword");
+       }
+
+       protected function lib_ispixel($value) {
+               return $this->toBool($value[0] == "number" && $value[2] == "px");
+       }
+
+       protected function lib_ispercentage($value) {
+               return $this->toBool($value[0] == "number" && $value[2] == "%");
+       }
+
+       protected function lib_isem($value) {
+               return $this->toBool($value[0] == "number" && $value[2] == "em");
+       }
+
+       protected function lib_isrem($value) {
+               return $this->toBool($value[0] == "number" && $value[2] == "rem");
+       }
+
+       protected function lib_rgbahex($color) {
+               $color = $this->coerceColor($color);
+               if (is_null($color))
+                       $this->throwError("color expected for rgbahex");
+
+               return sprintf("#%02x%02x%02x%02x",
+                       isset($color[4]) ? $color[4]*255 : 255,
+                       $color[1],$color[2], $color[3]);
+       }
+
+       protected function lib_argb($color){
+               return $this->lib_rgbahex($color);
+       }
+
+       // utility func to unquote a string
+       protected function lib_e($arg) {
+               switch ($arg[0]) {
+                       case "list":
+                               $items = $arg[2];
+                               if (isset($items[0])) {
+                                       return $this->lib_e($items[0]);
+                               }
+                               return self::$defaultValue;
+                       case "string":
+                               $arg[1] = "";
+                               return $arg;
+                       case "keyword":
+                               return $arg;
+                       default:
+                               return array("keyword", $this->compileValue($arg));
+               }
+       }
+
+       protected function lib__sprintf($args) {
+               if ($args[0] != "list") return $args;
+               $values = $args[2];
+               $string = array_shift($values);
+               $template = $this->compileValue($this->lib_e($string));
+
+               $i = 0;
+               if (preg_match_all('/%[dsa]/', $template, $m)) {
+                       foreach ($m[0] as $match) {
+                               $val = isset($values[$i]) ?
+                                       $this->reduce($values[$i]) : array('keyword', '');
+
+                               // lessjs compat, renders fully expanded color, not raw color
+                               if ($color = $this->coerceColor($val)) {
+                                       $val = $color;
+                               }
+
+                               $i++;
+                               $rep = $this->compileValue($this->lib_e($val));
+                               $template = preg_replace('/'.self::preg_quote($match).'/',
+                                       $rep, $template, 1);
+                       }
+               }
+
+               $d = $string[0] == "string" ? $string[1] : '"';
+               return array("string", $d, array($template));
+       }
+
+       protected function lib_floor($arg) {
+               $value = $this->assertNumber($arg);
+               return array("number", floor($value), $arg[2]);
+       }
+
+       protected function lib_ceil($arg) {
+               $value = $this->assertNumber($arg);
+               return array("number", ceil($value), $arg[2]);
+       }
+
+       protected function lib_round($arg) {
+               if($arg[0] != "list") {
+                       $value = $this->assertNumber($arg);
+                       return array("number", round($value), $arg[2]);
+               } else {
+                       $value = $this->assertNumber($arg[2][0]);
+                       $precision = $this->assertNumber($arg[2][1]);
+                       return array("number", round($value, $precision), $arg[2][0][2]);
+               }
+       }
+
+       protected function lib_unit($arg) {
+               if ($arg[0] == "list") {
+                       list($number, $newUnit) = $arg[2];
+                       return array("number", $this->assertNumber($number),
+                               $this->compileValue($this->lib_e($newUnit)));
+               } else {
+                       return array("number", $this->assertNumber($arg), "");
+               }
+       }
+
+       /**
+        * Helper function to get arguments for color manipulation functions.
+        * takes a list that contains a color like thing and a percentage
+        */
+       protected function colorArgs($args) {
+               if ($args[0] != 'list' || count($args[2]) < 2) {
+                       return array(array('color', 0, 0, 0), 0);
+               }
+               list($color, $delta) = $args[2];
+               $color = $this->assertColor($color);
+               $delta = floatval($delta[1]);
+
+               return array($color, $delta);
+       }
+
+       protected function lib_darken($args) {
+               list($color, $delta) = $this->colorArgs($args);
+
+               $hsl = $this->toHSL($color);
+               $hsl[3] = $this->clamp($hsl[3] - $delta, 100);
+               return $this->toRGB($hsl);
+       }
+
+       protected function lib_lighten($args) {
+               list($color, $delta) = $this->colorArgs($args);
+
+               $hsl = $this->toHSL($color);
+               $hsl[3] = $this->clamp($hsl[3] + $delta, 100);
+               return $this->toRGB($hsl);
+       }
+
+       protected function lib_saturate($args) {
+               list($color, $delta) = $this->colorArgs($args);
+
+               $hsl = $this->toHSL($color);
+               $hsl[2] = $this->clamp($hsl[2] + $delta, 100);
+               return $this->toRGB($hsl);
+       }
+
+       protected function lib_desaturate($args) {
+               list($color, $delta) = $this->colorArgs($args);
+
+               $hsl = $this->toHSL($color);
+               $hsl[2] = $this->clamp($hsl[2] - $delta, 100);
+               return $this->toRGB($hsl);
+       }
+
+       protected function lib_spin($args) {
+               list($color, $delta) = $this->colorArgs($args);
+
+               $hsl = $this->toHSL($color);
+
+               $hsl[1] = $hsl[1] + $delta % 360;
+               if ($hsl[1] < 0) $hsl[1] += 360;
+
+               return $this->toRGB($hsl);
+       }
+
+       protected function lib_fadeout($args) {
+               list($color, $delta) = $this->colorArgs($args);
+               $color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) - $delta/100);
+               return $color;
+       }
+
+       protected function lib_fadein($args) {
+               list($color, $delta) = $this->colorArgs($args);
+               $color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) + $delta/100);
+               return $color;
+       }
+
+       protected function lib_hue($color) {
+               $hsl = $this->toHSL($this->assertColor($color));
+               return round($hsl[1]);
+       }
+
+       protected function lib_saturation($color) {
+               $hsl = $this->toHSL($this->assertColor($color));
+               return round($hsl[2]);
+       }
+
+       protected function lib_lightness($color) {
+               $hsl = $this->toHSL($this->assertColor($color));
+               return round($hsl[3]);
+       }
+
+       // get the alpha of a color
+       // defaults to 1 for non-colors or colors without an alpha
+       protected function lib_alpha($value) {
+               if (!is_null($color = $this->coerceColor($value))) {
+                       return isset($color[4]) ? $color[4] : 1;
+               }
+       }
+
+       // set the alpha of the color
+       protected function lib_fade($args) {
+               list($color, $alpha) = $this->colorArgs($args);
+               $color[4] = $this->clamp($alpha / 100.0);
+               return $color;
+       }
+
+       protected function lib_percentage($arg) {
+               $num = $this->assertNumber($arg);
+               return array("number", $num*100, "%");
+       }
+
+       // mixes two colors by weight
+       // mix(@color1, @color2, [@weight: 50%]);
+       // http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html#mix-instance_method
+       protected function lib_mix($args) {
+               if ($args[0] != "list" || count($args[2]) < 2)
+                       $this->throwError("mix expects (color1, color2, weight)");
+
+               list($first, $second) = $args[2];
+               $first = $this->assertColor($first);
+               $second = $this->assertColor($second);
+
+               $first_a = $this->lib_alpha($first);
+               $second_a = $this->lib_alpha($second);
+
+               if (isset($args[2][2])) {
+                       $weight = $args[2][2][1] / 100.0;
+               } else {
+                       $weight = 0.5;
+               }
+
+               $w = $weight * 2 - 1;
+               $a = $first_a - $second_a;
+
+               $w1 = (($w * $a == -1 ? $w : ($w + $a)/(1 + $w * $a)) + 1) / 2.0;
+               $w2 = 1.0 - $w1;
+
+               $new = array('color',
+                       $w1 * $first[1] + $w2 * $second[1],
+                       $w1 * $first[2] + $w2 * $second[2],
+                       $w1 * $first[3] + $w2 * $second[3],
+               );
+
+               if ($first_a != 1.0 || $second_a != 1.0) {
+                       $new[] = $first_a * $weight + $second_a * ($weight - 1);
+               }
+
+               return $this->fixColor($new);
+       }
+
+       protected function lib_contrast($args) {
+               if ($args[0] != 'list' || count($args[2]) < 3) {
+                       return array(array('color', 0, 0, 0), 0);
+               }
+
+               list($inputColor, $darkColor, $lightColor) = $args[2];
+
+               $inputColor = $this->assertColor($inputColor);
+               $darkColor = $this->assertColor($darkColor);
+               $lightColor = $this->assertColor($lightColor);
+               $hsl = $this->toHSL($inputColor);
+
+               if ($hsl[3] > 50) {
+                       return $darkColor;
+               }
+
+               return $lightColor;
+       }
+
+       protected function assertColor($value, $error = "expected color value") {
+               $color = $this->coerceColor($value);
+               if (is_null($color)) $this->throwError($error);
+               return $color;
+       }
+
+       protected function assertNumber($value, $error = "expecting number") {
+               if ($value[0] == "number") return $value[1];
+               $this->throwError($error);
+       }
+
+       protected function assertArgs($value, $expectedArgs, $name="") {
+               if ($expectedArgs == 1) {
+                       return $value;
+               } else {
+                       if ($value[0] !== "list" || $value[1] != ",") $this->throwError("expecting list");
+                       $values = $value[2];
+                       $numValues = count($values);
+                       if ($expectedArgs != $numValues) {
+                               if ($name) {
+                                       $name = $name . ": ";
+                               }
+
+                               $this->throwError("${name}expecting $expectedArgs arguments, got $numValues");
+                       }
+
+                       return $values;
+               }
+       }
+
+       protected function toHSL($color) {
+               if ($color[0] == 'hsl') return $color;
+
+               $r = $color[1] / 255;
+               $g = $color[2] / 255;
+               $b = $color[3] / 255;
+
+               $min = min($r, $g, $b);
+               $max = max($r, $g, $b);
+
+               $L = ($min + $max) / 2;
+               if ($min == $max) {
+                       $S = $H = 0;
+               } else {
+                       if ($L < 0.5)
+                               $S = ($max - $min)/($max + $min);
+                       else
+                               $S = ($max - $min)/(2.0 - $max - $min);
+
+                       if ($r == $max) $H = ($g - $b)/($max - $min);
+                       elseif ($g == $max) $H = 2.0 + ($b - $r)/($max - $min);
+                       elseif ($b == $max) $H = 4.0 + ($r - $g)/($max - $min);
+
+               }
+
+               $out = array('hsl',
+                       ($H < 0 ? $H + 6 : $H)*60,
+                       $S*100,
+                       $L*100,
+               );
+
+               if (count($color) > 4) $out[] = $color[4]; // copy alpha
+               return $out;
+       }
+
+       protected function toRGB_helper($comp, $temp1, $temp2) {
+               if ($comp < 0) $comp += 1.0;
+               elseif ($comp > 1) $comp -= 1.0;
+
+               if (6 * $comp < 1) return $temp1 + ($temp2 - $temp1) * 6 * $comp;
+               if (2 * $comp < 1) return $temp2;
+               if (3 * $comp < 2) return $temp1 + ($temp2 - $temp1)*((2/3) - $comp) * 6;
+
+               return $temp1;
+       }
+
+       /**
+        * Converts a hsl array into a color value in rgb.
+        * Expects H to be in range of 0 to 360, S and L in 0 to 100
+        */
+       protected function toRGB($color) {
+               if ($color[0] == 'color') return $color;
+
+               $H = $color[1] / 360;
+               $S = $color[2] / 100;
+               $L = $color[3] / 100;
+
+               if ($S == 0) {
+                       $r = $g = $b = $L;
+               } else {
+                       $temp2 = $L < 0.5 ?
+                               $L*(1.0 + $S) :
+                               $L + $S - $L * $S;
+
+                       $temp1 = 2.0 * $L - $temp2;
+
+                       $r = $this->toRGB_helper($H + 1/3, $temp1, $temp2);
+                       $g = $this->toRGB_helper($H, $temp1, $temp2);
+                       $b = $this->toRGB_helper($H - 1/3, $temp1, $temp2);
+               }
+
+               // $out = array('color', round($r*255), round($g*255), round($b*255));
+               $out = array('color', $r*255, $g*255, $b*255);
+               if (count($color) > 4) $out[] = $color[4]; // copy alpha
+               return $out;
+       }
+
+       protected function clamp($v, $max = 1, $min = 0) {
+               return min($max, max($min, $v));
+       }
+
+       /**
+        * Convert the rgb, rgba, hsl color literals of function type
+        * as returned by the parser into values of color type.
+        */
+       protected function funcToColor($func) {
+               $fname = $func[1];
+               if ($func[2][0] != 'list') return false; // need a list of arguments
+               $rawComponents = $func[2][2];
+
+               if ($fname == 'hsl' || $fname == 'hsla') {
+                       $hsl = array('hsl');
+                       $i = 0;
+                       foreach ($rawComponents as $c) {
+                               $val = $this->reduce($c);
+                               $val = isset($val[1]) ? floatval($val[1]) : 0;
+
+                               if ($i == 0) $clamp = 360;
+                               elseif ($i < 3) $clamp = 100;
+                               else $clamp = 1;
+
+                               $hsl[] = $this->clamp($val, $clamp);
+                               $i++;
+                       }
+
+                       while (count($hsl) < 4) $hsl[] = 0;
+                       return $this->toRGB($hsl);
+
+               } elseif ($fname == 'rgb' || $fname == 'rgba') {
+                       $components = array();
+                       $i = 1;
+                       foreach ($rawComponents as $c) {
+                               $c = $this->reduce($c);
+                               if ($i < 4) {
+                                       if ($c[0] == "number" && $c[2] == "%") {
+                                               $components[] = 255 * ($c[1] / 100);
+                                       } else {
+                                               $components[] = floatval($c[1]);
+                                       }
+                               } elseif ($i == 4) {
+                                       if ($c[0] == "number" && $c[2] == "%") {
+                                               $components[] = 1.0 * ($c[1] / 100);
+                                       } else {
+                                               $components[] = floatval($c[1]);
+                                       }
+                               } else break;
+
+                               $i++;
+                       }
+                       while (count($components) < 3) $components[] = 0;
+                       array_unshift($components, 'color');
+                       return $this->fixColor($components);
+               }
+
+               return false;
+       }
+
+       protected function reduce($value, $forExpression = false) {
+               switch ($value[0]) {
+               case "interpolate":
+                       $reduced = $this->reduce($value[1]);
+                       $var = $this->compileValue($reduced);
+                       $res = $this->reduce(array("variable", $this->vPrefix . $var));
+
+                       if ($res[0] == "raw_color") {
+                               $res = $this->coerceColor($res);
+                       }
+
+                       if (empty($value[2])) $res = $this->lib_e($res);
+
+                       return $res;
+               case "variable":
+                       $key = $value[1];
+                       if (is_array($key)) {
+                               $key = $this->reduce($key);
+                               $key = $this->vPrefix . $this->compileValue($this->lib_e($key));
+                       }
+
+                       $seen =& $this->env->seenNames;
+
+                       if (!empty($seen[$key])) {
+                               $this->throwError("infinite loop detected: $key");
+                       }
+
+                       $seen[$key] = true;
+                       $out = $this->reduce($this->get($key, self::$defaultValue));
+                       $seen[$key] = false;
+                       return $out;
+               case "list":
+                       foreach ($value[2] as &$item) {
+                               $item = $this->reduce($item, $forExpression);
+                       }
+                       return $value;
+               case "expression":
+                       return $this->evaluate($value);
+               case "string":
+                       foreach ($value[2] as &$part) {
+                               if (is_array($part)) {
+                                       $strip = $part[0] == "variable";
+                                       $part = $this->reduce($part);
+                                       if ($strip) $part = $this->lib_e($part);
+                               }
+                       }
+                       return $value;
+               case "escape":
+                       list(,$inner) = $value;
+                       return $this->lib_e($this->reduce($inner));
+               case "function":
+                       $color = $this->funcToColor($value);
+                       if ($color) return $color;
+
+                       list(, $name, $args) = $value;
+                       if ($name == "%") $name = "_sprintf";
+                       $f = isset($this->libFunctions[$name]) ?
+                               $this->libFunctions[$name] : array($this, 'lib_'.$name);
+
+                       if (is_callable($f)) {
+                               if ($args[0] == 'list')
+                                       $args = self::compressList($args[2], $args[1]);
+
+                               $ret = call_user_func($f, $this->reduce($args, true), $this);
+
+                               if (is_null($ret)) {
+                                       return array("string", "", array(
+                                               $name, "(", $args, ")"
+                                       ));
+                               }
+
+                               // convert to a typed value if the result is a php primitive
+                               if (is_numeric($ret)) $ret = array('number', $ret, "");
+                               elseif (!is_array($ret)) $ret = array('keyword', $ret);
+
+                               return $ret;
+                       }
+
+                       // plain function, reduce args
+                       $value[2] = $this->reduce($value[2]);
+                       return $value;
+               case "unary":
+                       list(, $op, $exp) = $value;
+                       $exp = $this->reduce($exp);
+
+                       if ($exp[0] == "number") {
+                               switch ($op) {
+                               case "+":
+                                       return $exp;
+                               case "-":
+                                       $exp[1] *= -1;
+                                       return $exp;
+                               }
+                       }
+                       return array("string", "", array($op, $exp));
+               }
+
+               if ($forExpression) {
+                       switch ($value[0]) {
+                       case "keyword":
+                               if ($color = $this->coerceColor($value)) {
+                                       return $color;
+                               }
+                               break;
+                       case "raw_color":
+                               return $this->coerceColor($value);
+                       }
+               }
+
+               return $value;
+       }
+
+
+       // coerce a value for use in color operation
+       protected function coerceColor($value) {
+               switch($value[0]) {
+                       case 'color': return $value;
+                       case 'raw_color':
+                               $c = array("color", 0, 0, 0);
+                               $colorStr = substr($value[1], 1);
+                               $num = hexdec($colorStr);
+                               $width = strlen($colorStr) == 3 ? 16 : 256;
+
+                               for ($i = 3; $i > 0; $i--) { // 3 2 1
+                                       $t = $num % $width;
+                                       $num /= $width;
+
+                                       $c[$i] = $t * (256/$width) + $t * floor(16/$width);
+                               }
+
+                               return $c;
+                       case 'keyword':
+                               $name = $value[1];
+                               if (isset(self::$cssColors[$name])) {
+                                       $rgba = explode(',', self::$cssColors[$name]);
+
+                                       if(isset($rgba[3]))
+                                               return array('color', $rgba[0], $rgba[1], $rgba[2], $rgba[3]);
+
+                                       return array('color', $rgba[0], $rgba[1], $rgba[2]);
+                               }
+                               return null;
+               }
+       }
+
+       // make something string like into a string
+       protected function coerceString($value) {
+               switch ($value[0]) {
+               case "string":
+                       return $value;
+               case "keyword":
+                       return array("string", "", array($value[1]));
+               }
+               return null;
+       }
+
+       // turn list of length 1 into value type
+       protected function flattenList($value) {
+               if ($value[0] == "list" && count($value[2]) == 1) {
+                       return $this->flattenList($value[2][0]);
+               }
+               return $value;
+       }
+
+       protected function toBool($a) {
+               if ($a) return self::$TRUE;
+               else return self::$FALSE;
+       }
+
+       // evaluate an expression
+       protected function evaluate($exp) {
+               list(, $op, $left, $right, $whiteBefore, $whiteAfter) = $exp;
+
+               $left = $this->reduce($left, true);
+               $right = $this->reduce($right, true);
+
+               if ($leftColor = $this->coerceColor($left)) {
+                       $left = $leftColor;
+               }
+
+               if ($rightColor = $this->coerceColor($right)) {
+                       $right = $rightColor;
+               }
+
+               $ltype = $left[0];
+               $rtype = $right[0];
+
+               // operators that work on all types
+               if ($op == "and") {
+                       return $this->toBool($left == self::$TRUE && $right == self::$TRUE);
+               }
+
+               if ($op == "=") {
+                       return $this->toBool($this->eq($left, $right) );
+               }
+
+               if ($op == "+" && !is_null($str = $this->stringConcatenate($left, $right))) {
+                       return $str;
+               }
+
+               // type based operators
+               $fname = "op_${ltype}_${rtype}";
+               if (is_callable(array($this, $fname))) {
+                       $out = $this->$fname($op, $left, $right);
+                       if (!is_null($out)) return $out;
+               }
+
+               // make the expression look it did before being parsed
+               $paddedOp = $op;
+               if ($whiteBefore) $paddedOp = " " . $paddedOp;
+               if ($whiteAfter) $paddedOp .= " ";
+
+               return array("string", "", array($left, $paddedOp, $right));
+       }
+
+       protected function stringConcatenate($left, $right) {
+               if ($strLeft = $this->coerceString($left)) {
+                       if ($right[0] == "string") {
+                               $right[1] = "";
+                       }
+                       $strLeft[2][] = $right;
+                       return $strLeft;
+               }
+
+               if ($strRight = $this->coerceString($right)) {
+                       array_unshift($strRight[2], $left);
+                       return $strRight;
+               }
+       }
+
+
+       // make sure a color's components don't go out of bounds
+       protected function fixColor($c) {
+               foreach (range(1, 3) as $i) {
+                       if ($c[$i] < 0) $c[$i] = 0;
+                       if ($c[$i] > 255) $c[$i] = 255;
+               }
+
+               return $c;
+       }
+
+       protected function op_number_color($op, $lft, $rgt) {
+               if ($op == '+' || $op == '*') {
+                       return $this->op_color_number($op, $rgt, $lft);
+               }
+       }
+
+       protected function op_color_number($op, $lft, $rgt) {
+               if ($rgt[0] == '%') $rgt[1] /= 100;
+
+               return $this->op_color_color($op, $lft,
+                       array_fill(1, count($lft) - 1, $rgt[1]));
+       }
+
+       protected function op_color_color($op, $left, $right) {
+               $out = array('color');
+               $max = count($left) > count($right) ? count($left) : count($right);
+               foreach (range(1, $max - 1) as $i) {
+                       $lval = isset($left[$i]) ? $left[$i] : 0;
+                       $rval = isset($right[$i]) ? $right[$i] : 0;
+                       switch ($op) {
+                       case '+':
+                               $out[] = $lval + $rval;
+                               break;
+                       case '-':
+                               $out[] = $lval - $rval;
+                               break;
+                       case '*':
+                               $out[] = $lval * $rval;
+                               break;
+                       case '%':
+                               $out[] = $lval % $rval;
+                               break;
+                       case '/':
+                               if ($rval == 0) $this->throwError("evaluate error: can't divide by zero");
+                               $out[] = $lval / $rval;
+                               break;
+                       default:
+                               $this->throwError('evaluate error: color op number failed on op '.$op);
+                       }
+               }
+               return $this->fixColor($out);
+       }
+
+       function lib_red($color){
+               $color = $this->coerceColor($color);
+               if (is_null($color)) {
+                       $this->throwError('color expected for red()');
+               }
+
+               return $color[1];
+       }
+
+       function lib_green($color){
+               $color = $this->coerceColor($color);
+               if (is_null($color)) {
+                       $this->throwError('color expected for green()');
+               }
+
+               return $color[2];
+       }
+
+       function lib_blue($color){
+               $color = $this->coerceColor($color);
+               if (is_null($color)) {
+                       $this->throwError('color expected for blue()');
+               }
+
+               return $color[3];
+       }
+
+
+       // operator on two numbers
+       protected function op_number_number($op, $left, $right) {
+               $unit = empty($left[2]) ? $right[2] : $left[2];
+
+               $value = 0;
+               switch ($op) {
+               case '+':
+                       $value = $left[1] + $right[1];
+                       break;
+               case '*':
+                       $value = $left[1] * $right[1];
+                       break;
+               case '-':
+                       $value = $left[1] - $right[1];
+                       break;
+               case '%':
+                       $value = $left[1] % $right[1];
+                       break;
+               case '/':
+                       if ($right[1] == 0) $this->throwError('parse error: divide by zero');
+                       $value = $left[1] / $right[1];
+                       break;
+               case '<':
+                       return $this->toBool($left[1] < $right[1]);
+               case '>':
+                       return $this->toBool($left[1] > $right[1]);
+               case '>=':
+                       return $this->toBool($left[1] >= $right[1]);
+               case '=<':
+                       return $this->toBool($left[1] <= $right[1]);
+               default:
+                       $this->throwError('parse error: unknown number operator: '.$op);
+               }
+
+               return array("number", $value, $unit);
+       }
+
+
+       /* environment functions */
+
+       protected function makeOutputBlock($type, $selectors = null) {
+               $b = new stdclass;
+               $b->lines = array();
+               $b->children = array();
+               $b->selectors = $selectors;
+               $b->type = $type;
+               $b->parent = $this->scope;
+               return $b;
+       }
+
+       // the state of execution
+       protected function pushEnv($block = null) {
+               $e = new stdclass;
+               $e->parent = $this->env;
+               $e->store = array();
+               $e->block = $block;
+
+               $this->env = $e;
+               return $e;
+       }
+
+       // pop something off the stack
+       protected function popEnv() {
+               $old = $this->env;
+               $this->env = $this->env->parent;
+               return $old;
+       }
+
+       // set something in the current env
+       protected function set($name, $value) {
+               $this->env->store[$name] = $value;
+       }
+
+
+       // get the highest occurrence entry for a name
+       protected function get($name, $default=null) {
+               $current = $this->env;
+
+               $isArguments = $name == $this->vPrefix . 'arguments';
+               while ($current) {
+                       if ($isArguments && isset($current->arguments)) {
+                               return array('list', ' ', $current->arguments);
+                       }
+
+                       if (isset($current->store[$name]))
+                               return $current->store[$name];
+                       else {
+                               $current = isset($current->storeParent) ?
+                                       $current->storeParent : $current->parent;
+                       }
+               }
+
+               return $default;
+       }
+
+       // inject array of unparsed strings into environment as variables
+       protected function injectVariables($args) {
+               $this->pushEnv();
+               $parser = new lessc_parser($this, __METHOD__);
+               foreach ($args as $name => $strValue) {
+                       if ($name{0} != '@') $name = '@'.$name;
+                       $parser->count = 0;
+                       $parser->buffer = (string)$strValue;
+                       if (!$parser->propertyValue($value)) {
+                               throw new Exception("failed to parse passed in variable $name: $strValue");
+                       }
+
+                       $this->set($name, $value);
+               }
+       }
+
+       /**
+        * Initialize any static state, can initialize parser for a file
+        * $opts isn't used yet
+        */
+       public function __construct($fname = null) {
+               if ($fname !== null) {
+                       // used for deprecated parse method
+                       $this->_parseFile = $fname;
+               }
+       }
+
+       public function compile($string, $name = null) {
+               $locale = setlocale(LC_NUMERIC, 0);
+               setlocale(LC_NUMERIC, "C");
+
+               $this->parser = $this->makeParser($name);
+               $root = $this->parser->parse($string);
+
+               $this->env = null;
+               $this->scope = null;
+
+               $this->formatter = $this->newFormatter();
+
+               if (!empty($this->registeredVars)) {
+                       $this->injectVariables($this->registeredVars);
+               }
+
+               $this->sourceParser = $this->parser; // used for error messages
+               $this->compileBlock($root);
+
+               ob_start();
+               $this->formatter->block($this->scope);
+               $out = ob_get_clean();
+               setlocale(LC_NUMERIC, $locale);
+               return $out;
+       }
+
+       public function compileFile($fname, $outFname = null) {
+               if (!is_readable($fname)) {
+                       throw new Exception('load error: failed to find '.$fname);
+               }
+
+               $pi = pathinfo($fname);
+
+               $oldImport = $this->importDir;
+
+               $this->importDir = (array)$this->importDir;
+               $this->importDir[] = $pi['dirname'].'/';
+
+               $this->addParsedFile($fname);
+
+               $out = $this->compile(file_get_contents($fname), $fname);
+
+               $this->importDir = $oldImport;
+
+               if ($outFname !== null) {
+                       return file_put_contents($outFname, $out);
+               }
+
+               return $out;
+       }
+
+       // compile only if changed input has changed or output doesn't exist
+       public function checkedCompile($in, $out) {
+               if (!is_file($out) || filemtime($in) > filemtime($out)) {
+                       $this->compileFile($in, $out);
+                       return true;
+               }
+               return false;
+       }
+
+       /**
+        * Execute lessphp on a .less file or a lessphp cache structure
+        *
+        * The lessphp cache structure contains information about a specific
+        * less file having been parsed. It can be used as a hint for future
+        * calls to determine whether or not a rebuild is required.
+        *
+        * The cache structure contains two important keys that may be used
+        * externally:
+        *
+        * compiled: The final compiled CSS
+        * updated: The time (in seconds) the CSS was last compiled
+        *
+        * The cache structure is a plain-ol' PHP associative array and can
+        * be serialized and unserialized without a hitch.
+        *
+        * @param mixed $in Input
+        * @param bool $force Force rebuild?
+        * @return array lessphp cache structure
+        */
+       public function cachedCompile($in, $force = false) {
+               // assume no root
+               $root = null;
+
+               if (is_string($in)) {
+                       $root = $in;
+               } elseif (is_array($in) and isset($in['root'])) {
+                       if ($force or ! isset($in['files'])) {
+                               // If we are forcing a recompile or if for some reason the
+                               // structure does not contain any file information we should
+                               // specify the root to trigger a rebuild.
+                               $root = $in['root'];
+                       } elseif (isset($in['files']) and is_array($in['files'])) {
+                               foreach ($in['files'] as $fname => $ftime ) {
+                                       if (!file_exists($fname) or filemtime($fname) > $ftime) {
+                                               // One of the files we knew about previously has changed
+                                               // so we should look at our incoming root again.
+                                               $root = $in['root'];
+                                               break;
+                                       }
+                               }
+                       }
+               } else {
+                       // TODO: Throw an exception? We got neither a string nor something
+                       // that looks like a compatible lessphp cache structure.
+                       return null;
+               }
+
+               if ($root !== null) {
+                       // If we have a root value which means we should rebuild.
+                       $out = array();
+                       $out['root'] = $root;
+                       $out['compiled'] = $this->compileFile($root);
+                       $out['files'] = $this->allParsedFiles();
+                       $out['updated'] = time();
+                       return $out;
+               } else {
+                       // No changes, pass back the structure
+                       // we were given initially.
+                       return $in;
+               }
+
+       }
+
+       // parse and compile buffer
+       // This is deprecated
+       public function parse($str = null, $initialVariables = null) {
+               if (is_array($str)) {
+                       $initialVariables = $str;
+                       $str = null;
+               }
+
+               $oldVars = $this->registeredVars;
+               if ($initialVariables !== null) {
+                       $this->setVariables($initialVariables);
+               }
+
+               if ($str == null) {
+                       if (empty($this->_parseFile)) {
+                               throw new exception("nothing to parse");
+                       }
+
+                       $out = $this->compileFile($this->_parseFile);
+               } else {
+                       $out = $this->compile($str);
+               }
+
+               $this->registeredVars = $oldVars;
+               return $out;
+       }
+
+       protected function makeParser($name) {
+               $parser = new lessc_parser($this, $name);
+               $parser->writeComments = $this->preserveComments;
+
+               return $parser;
+       }
+
+       public function setFormatter($name) {
+               $this->formatterName = $name;
+       }
+
+       protected function newFormatter() {
+               $className = "lessc_formatter_lessjs";
+               if (!empty($this->formatterName)) {
+                       if (!is_string($this->formatterName))
+                               return $this->formatterName;
+                       $className = "lessc_formatter_$this->formatterName";
+               }
+
+               return new $className;
+       }
+
+       public function setPreserveComments($preserve) {
+               $this->preserveComments = $preserve;
+       }
+
+       public function registerFunction($name, $func) {
+               $this->libFunctions[$name] = $func;
+       }
+
+       public function unregisterFunction($name) {
+               unset($this->libFunctions[$name]);
+       }
+
+       public function setVariables($variables) {
+               $this->registeredVars = array_merge($this->registeredVars, $variables);
+       }
+
+       public function unsetVariable($name) {
+               unset($this->registeredVars[$name]);
+       }
+
+       public function setImportDir($dirs) {
+               $this->importDir = (array)$dirs;
+       }
+
+       public function addImportDir($dir) {
+               $this->importDir = (array)$this->importDir;
+               $this->importDir[] = $dir;
+       }
+
+       public function allParsedFiles() {
+               return $this->allParsedFiles;
+       }
+
+       protected function addParsedFile($file) {
+               $this->allParsedFiles[realpath($file)] = filemtime($file);
+       }
+
+       /**
+        * Uses the current value of $this->count to show line and line number
+        */
+       protected function throwError($msg = null) {
+               if ($this->sourceLoc >= 0) {
+                       $this->sourceParser->throwError($msg, $this->sourceLoc);
+               }
+               throw new exception($msg);
+       }
+
+       // compile file $in to file $out if $in is newer than $out
+       // returns true when it compiles, false otherwise
+       public static function ccompile($in, $out, $less = null) {
+               if ($less === null) {
+                       $less = new self;
+               }
+               return $less->checkedCompile($in, $out);
+       }
+
+       public static function cexecute($in, $force = false, $less = null) {
+               if ($less === null) {
+                       $less = new self;
+               }
+               return $less->cachedCompile($in, $force);
+       }
+
+       static protected $cssColors = array(
+               'aliceblue' => '240,248,255',
+               'antiquewhite' => '250,235,215',
+               'aqua' => '0,255,255',
+               'aquamarine' => '127,255,212',
+               'azure' => '240,255,255',
+               'beige' => '245,245,220',
+               'bisque' => '255,228,196',
+               'black' => '0,0,0',
+               'blanchedalmond' => '255,235,205',
+               'blue' => '0,0,255',
+               'blueviolet' => '138,43,226',
+               'brown' => '165,42,42',
+               'burlywood' => '222,184,135',
+               'cadetblue' => '95,158,160',
+               'chartreuse' => '127,255,0',
+               'chocolate' => '210,105,30',
+               'coral' => '255,127,80',
+               'cornflowerblue' => '100,149,237',
+               'cornsilk' => '255,248,220',
+               'crimson' => '220,20,60',
+               'cyan' => '0,255,255',
+               'darkblue' => '0,0,139',
+               'darkcyan' => '0,139,139',
+               'darkgoldenrod' => '184,134,11',
+               'darkgray' => '169,169,169',
+               'darkgreen' => '0,100,0',
+               'darkgrey' => '169,169,169',
+               'darkkhaki' => '189,183,107',
+               'darkmagenta' => '139,0,139',
+               'darkolivegreen' => '85,107,47',
+               'darkorange' => '255,140,0',
+               'darkorchid' => '153,50,204',
+               'darkred' => '139,0,0',
+               'darksalmon' => '233,150,122',
+               'darkseagreen' => '143,188,143',
+               'darkslateblue' => '72,61,139',
+               'darkslategray' => '47,79,79',
+               'darkslategrey' => '47,79,79',
+               'darkturquoise' => '0,206,209',
+               'darkviolet' => '148,0,211',
+               'deeppink' => '255,20,147',
+               'deepskyblue' => '0,191,255',
+               'dimgray' => '105,105,105',
+               'dimgrey' => '105,105,105',
+               'dodgerblue' => '30,144,255',
+               'firebrick' => '178,34,34',
+               'floralwhite' => '255,250,240',
+               'forestgreen' => '34,139,34',
+               'fuchsia' => '255,0,255',
+               'gainsboro' => '220,220,220',
+               'ghostwhite' => '248,248,255',
+               'gold' => '255,215,0',
+               'goldenrod' => '218,165,32',
+               'gray' => '128,128,128',
+               'green' => '0,128,0',
+               'greenyellow' => '173,255,47',
+               'grey' => '128,128,128',
+               'honeydew' => '240,255,240',
+               'hotpink' => '255,105,180',
+               'indianred' => '205,92,92',
+               'indigo' => '75,0,130',
+               'ivory' => '255,255,240',
+               'khaki' => '240,230,140',
+               'lavender' => '230,230,250',
+               'lavenderblush' => '255,240,245',
+               'lawngreen' => '124,252,0',
+               'lemonchiffon' => '255,250,205',
+               'lightblue' => '173,216,230',
+               'lightcoral' => '240,128,128',
+               'lightcyan' => '224,255,255',
+               'lightgoldenrodyellow' => '250,250,210',
+               'lightgray' => '211,211,211',
+               'lightgreen' => '144,238,144',
+               'lightgrey' => '211,211,211',
+               'lightpink' => '255,182,193',
+               'lightsalmon' => '255,160,122',
+               'lightseagreen' => '32,178,170',
+               'lightskyblue' => '135,206,250',
+               'lightslategray' => '119,136,153',
+               'lightslategrey' => '119,136,153',
+               'lightsteelblue' => '176,196,222',
+               'lightyellow' => '255,255,224',
+               'lime' => '0,255,0',
+               'limegreen' => '50,205,50',
+               'linen' => '250,240,230',
+               'magenta' => '255,0,255',
+               'maroon' => '128,0,0',
+               'mediumaquamarine' => '102,205,170',
+               'mediumblue' => '0,0,205',
+               'mediumorchid' => '186,85,211',
+               'mediumpurple' => '147,112,219',
+               'mediumseagreen' => '60,179,113',
+               'mediumslateblue' => '123,104,238',
+               'mediumspringgreen' => '0,250,154',
+               'mediumturquoise' => '72,209,204',
+               'mediumvioletred' => '199,21,133',
+               'midnightblue' => '25,25,112',
+               'mintcream' => '245,255,250',
+               'mistyrose' => '255,228,225',
+               'moccasin' => '255,228,181',
+               'navajowhite' => '255,222,173',
+               'navy' => '0,0,128',
+               'oldlace' => '253,245,230',
+               'olive' => '128,128,0',
+               'olivedrab' => '107,142,35',
+               'orange' => '255,165,0',
+               'orangered' => '255,69,0',
+               'orchid' => '218,112,214',
+               'palegoldenrod' => '238,232,170',
+               'palegreen' => '152,251,152',
+               'paleturquoise' => '175,238,238',
+               'palevioletred' => '219,112,147',
+               'papayawhip' => '255,239,213',
+               'peachpuff' => '255,218,185',
+               'peru' => '205,133,63',
+               'pink' => '255,192,203',
+               'plum' => '221,160,221',
+               'powderblue' => '176,224,230',
+               'purple' => '128,0,128',
+               'red' => '255,0,0',
+               'rosybrown' => '188,143,143',
+               'royalblue' => '65,105,225',
+               'saddlebrown' => '139,69,19',
+               'salmon' => '250,128,114',
+               'sandybrown' => '244,164,96',
+               'seagreen' => '46,139,87',
+               'seashell' => '255,245,238',
+               'sienna' => '160,82,45',
+               'silver' => '192,192,192',
+               'skyblue' => '135,206,235',
+               'slateblue' => '106,90,205',
+               'slategray' => '112,128,144',
+               'slategrey' => '112,128,144',
+               'snow' => '255,250,250',
+               'springgreen' => '0,255,127',
+               'steelblue' => '70,130,180',
+               'tan' => '210,180,140',
+               'teal' => '0,128,128',
+               'thistle' => '216,191,216',
+               'tomato' => '255,99,71',
+               'transparent' => '0,0,0,0',
+               'turquoise' => '64,224,208',
+               'violet' => '238,130,238',
+               'wheat' => '245,222,179',
+               'white' => '255,255,255',
+               'whitesmoke' => '245,245,245',
+               'yellow' => '255,255,0',
+               'yellowgreen' => '154,205,50'
+       );
+}
+
+// responsible for taking a string of LESS code and converting it into a
+// syntax tree
+class lessc_parser {
+       static protected $nextBlockId = 0; // used to uniquely identify blocks
+
+       static protected $precedence = array(
+               '=<' => 0,
+               '>=' => 0,
+               '=' => 0,
+               '<' => 0,
+               '>' => 0,
+
+               '+' => 1,
+               '-' => 1,
+               '*' => 2,
+               '/' => 2,
+               '%' => 2,
+       );
+
+       static protected $whitePattern;
+       static protected $commentMulti;
+
+       static protected $commentSingle = "//";
+       static protected $commentMultiLeft = "/*";
+       static protected $commentMultiRight = "*/";
+
+       // regex string to match any of the operators
+       static protected $operatorString;
+
+       // these properties will supress division unless it's inside parenthases
+       static protected $supressDivisionProps =
+               array('/border-radius$/i', '/^font$/i');
+
+       protected $blockDirectives = array("font-face", "keyframes", "page", "-moz-document", "viewport", "-moz-viewport", "-o-viewport", "-ms-viewport");
+       protected $lineDirectives = array("charset");
+
+       /**
+        * if we are in parens we can be more liberal with whitespace around
+        * operators because it must evaluate to a single value and thus is less
+        * ambiguous.
+        *
+        * Consider:
+        *     property1: 10 -5; // is two numbers, 10 and -5
+        *     property2: (10 -5); // should evaluate to 5
+        */
+       protected $inParens = false;
+
+       // caches preg escaped literals
+       static protected $literalCache = array();
+
+       public function __construct($lessc, $sourceName = null) {
+               $this->eatWhiteDefault = true;
+               // reference to less needed for vPrefix, mPrefix, and parentSelector
+               $this->lessc = $lessc;
+
+               $this->sourceName = $sourceName; // name used for error messages
+
+               $this->writeComments = false;
+
+               if (!self::$operatorString) {
+                       self::$operatorString =
+                               '('.implode('|', array_map(array('lessc', 'preg_quote'),
+                                       array_keys(self::$precedence))).')';
+
+                       $commentSingle = lessc::preg_quote(self::$commentSingle);
+                       $commentMultiLeft = lessc::preg_quote(self::$commentMultiLeft);
+                       $commentMultiRight = lessc::preg_quote(self::$commentMultiRight);
+
+                       self::$commentMulti = $commentMultiLeft.'.*?'.$commentMultiRight;
+                       self::$whitePattern = '/'.$commentSingle.'[^\n]*\s*|('.self::$commentMulti.')\s*|\s+/Ais';
+               }
+       }
+
+       public function parse($buffer) {
+               $this->count = 0;
+               $this->line = 1;
+
+               $this->env = null; // block stack
+               $this->buffer = $this->writeComments ? $buffer : $this->removeComments($buffer);
+               $this->pushSpecialBlock("root");
+               $this->eatWhiteDefault = true;
+               $this->seenComments = array();
+
+               // trim whitespace on head
+               // if (preg_match('/^\s+/', $this->buffer, $m)) {
+               //      $this->line += substr_count($m[0], "\n");
+               //      $this->buffer = ltrim($this->buffer);
+               // }
+               $this->whitespace();
+
+               // parse the entire file
+               $lastCount = $this->count;
+               while (false !== $this->parseChunk());
+
+               if ($this->count != strlen($this->buffer))
+                       $this->throwError();
+
+               // TODO report where the block was opened
+               if (!is_null($this->env->parent))
+                       throw new exception('parse error: unclosed block');
+
+               return $this->env;
+       }
+
+       /**
+        * Parse a single chunk off the head of the buffer and append it to the
+        * current parse environment.
+        * Returns false when the buffer is empty, or when there is an error.
+        *
+        * This function is called repeatedly until the entire document is
+        * parsed.
+        *
+        * This parser is most similar to a recursive descent parser. Single
+        * functions represent discrete grammatical rules for the language, and
+        * they are able to capture the text that represents those rules.
+        *
+        * Consider the function lessc::keyword(). (all parse functions are
+        * structured the same)
+        *
+        * The function takes a single reference argument. When calling the
+        * function it will attempt to match a keyword on the head of the buffer.
+        * If it is successful, it will place the keyword in the referenced
+        * argument, advance the position in the buffer, and return true. If it
+        * fails then it won't advance the buffer and it will return false.
+        *
+        * All of these parse functions are powered by lessc::match(), which behaves
+        * the same way, but takes a literal regular expression. Sometimes it is
+        * more convenient to use match instead of creating a new function.
+        *
+        * Because of the format of the functions, to parse an entire string of
+        * grammatical rules, you can chain them together using &&.
+        *
+        * But, if some of the rules in the chain succeed before one fails, then
+        * the buffer position will be left at an invalid state. In order to
+        * avoid this, lessc::seek() is used to remember and set buffer positions.
+        *
+        * Before parsing a chain, use $s = $this->seek() to remember the current
+        * position into $s. Then if a chain fails, use $this->seek($s) to
+        * go back where we started.
+        */
+       protected function parseChunk() {
+               if (empty($this->buffer)) return false;
+               $s = $this->seek();
+
+               // setting a property
+               if ($this->keyword($key) && $this->assign() &&
+                       $this->propertyValue($value, $key) && $this->end())
+               {
+                       $this->append(array('assign', $key, $value), $s);
+                       return true;
+               } else {
+                       $this->seek($s);
+               }
+
+
+               // look for special css blocks
+               if ($this->literal('@', false)) {
+                       $this->count--;
+
+                       // media
+                       if ($this->literal('@media')) {
+                               if (($this->mediaQueryList($mediaQueries) || true)
+                                       && $this->literal('{'))
+                               {
+                                       $media = $this->pushSpecialBlock("media");
+                                       $media->queries = is_null($mediaQueries) ? array() : $mediaQueries;
+                                       return true;
+                               } else {
+                                       $this->seek($s);
+                                       return false;
+                               }
+                       }
+
+                       if ($this->literal("@", false) && $this->keyword($dirName)) {
+                               if ($this->isDirective($dirName, $this->blockDirectives)) {
+                                       if (($this->openString("{", $dirValue, null, array(";")) || true) &&
+                                               $this->literal("{"))
+                                       {
+                                               $dir = $this->pushSpecialBlock("directive");
+                                               $dir->name = $dirName;
+                                               if (isset($dirValue)) $dir->value = $dirValue;
+                                               return true;
+                                       }
+                               } elseif ($this->isDirective($dirName, $this->lineDirectives)) {
+                                       if ($this->propertyValue($dirValue) && $this->end()) {
+                                               $this->append(array("directive", $dirName, $dirValue));
+                                               return true;
+                                       }
+                               }
+                       }
+
+                       $this->seek($s);
+               }
+
+               // setting a variable
+               if ($this->variable($var) && $this->assign() &&
+                       $this->propertyValue($value) && $this->end())
+               {
+                       $this->append(array('assign', $var, $value), $s);
+                       return true;
+               } else {
+                       $this->seek($s);
+               }
+
+               if ($this->import($importValue)) {
+                       $this->append($importValue, $s);
+                       return true;
+               }
+
+               // opening parametric mixin
+               if ($this->tag($tag, true) && $this->argumentDef($args, $isVararg) &&
+                       ($this->guards($guards) || true) &&
+                       $this->literal('{'))
+               {
+                       $block = $this->pushBlock($this->fixTags(array($tag)));
+                       $block->args = $args;
+                       $block->isVararg = $isVararg;
+                       if (!empty($guards)) $block->guards = $guards;
+                       return true;
+               } else {
+                       $this->seek($s);
+               }
+
+               // opening a simple block
+               if ($this->tags($tags) && $this->literal('{')) {
+                       $tags = $this->fixTags($tags);
+                       $this->pushBlock($tags);
+                       return true;
+               } else {
+                       $this->seek($s);
+               }
+
+               // closing a block
+               if ($this->literal('}', false)) {
+                       try {
+                               $block = $this->pop();
+                       } catch (exception $e) {
+                               $this->seek($s);
+                               $this->throwError($e->getMessage());
+                       }
+
+                       $hidden = false;
+                       if (is_null($block->type)) {
+                               $hidden = true;
+                               if (!isset($block->args)) {
+                                       foreach ($block->tags as $tag) {
+                                               if (!is_string($tag) || $tag{0} != $this->lessc->mPrefix) {
+                                                       $hidden = false;
+                                                       break;
+                                               }
+                                       }
+                               }
+
+                               foreach ($block->tags as $tag) {
+                                       if (is_string($tag)) {
+                                               $this->env->children[$tag][] = $block;
+                                       }
+                               }
+                       }
+
+                       if (!$hidden) {
+                               $this->append(array('block', $block), $s);
+                       }
+
+                       // this is done here so comments aren't bundled into he block that
+                       // was just closed
+                       $this->whitespace();
+                       return true;
+               }
+
+               // mixin
+               if ($this->mixinTags($tags) &&
+                       ($this->argumentDef($argv, $isVararg) || true) &&
+                       ($this->keyword($suffix) || true) && $this->end())
+               {
+                       $tags = $this->fixTags($tags);
+                       $this->append(array('mixin', $tags, $argv, $suffix), $s);
+                       return true;
+               } else {
+                       $this->seek($s);
+               }
+
+               // spare ;
+               if ($this->literal(';')) return true;
+
+               return false; // got nothing, throw error
+       }
+
+       protected function isDirective($dirname, $directives) {
+               // TODO: cache pattern in parser
+               $pattern = implode("|",
+                       array_map(array("lessc", "preg_quote"), $directives));
+               $pattern = '/^(-[a-z-]+-)?(' . $pattern . ')$/i';
+
+               return preg_match($pattern, $dirname);
+       }
+
+       protected function fixTags($tags) {
+               // move @ tags out of variable namespace
+               foreach ($tags as &$tag) {
+                       if ($tag{0} == $this->lessc->vPrefix)
+                               $tag[0] = $this->lessc->mPrefix;
+               }
+               return $tags;
+       }
+
+       // a list of expressions
+       protected function expressionList(&$exps) {
+               $values = array();
+
+               while ($this->expression($exp)) {
+                       $values[] = $exp;
+               }
+
+               if (count($values) == 0) return false;
+
+               $exps = lessc::compressList($values, ' ');
+               return true;
+       }
+
+       /**
+        * Attempt to consume an expression.
+        * @link http://en.wikipedia.org/wiki/Operator-precedence_parser#Pseudo-code
+        */
+       protected function expression(&$out) {
+               if ($this->value($lhs)) {
+                       $out = $this->expHelper($lhs, 0);
+
+                       // look for / shorthand
+                       if (!empty($this->env->supressedDivision)) {
+                               unset($this->env->supressedDivision);
+                               $s = $this->seek();
+                               if ($this->literal("/") && $this->value($rhs)) {
+                                       $out = array("list", "",
+                                               array($out, array("keyword", "/"), $rhs));
+                               } else {
+                                       $this->seek($s);
+                               }
+                       }
+
+                       return true;
+               }
+               return false;
+       }
+
+       /**
+        * recursively parse infix equation with $lhs at precedence $minP
+        */
+       protected function expHelper($lhs, $minP) {
+               $this->inExp = true;
+               $ss = $this->seek();
+
+               while (true) {
+                       $whiteBefore = isset($this->buffer[$this->count - 1]) &&
+                               ctype_space($this->buffer[$this->count - 1]);
+
+                       // If there is whitespace before the operator, then we require
+                       // whitespace after the operator for it to be an expression
+                       $needWhite = $whiteBefore && !$this->inParens;
+
+                       if ($this->match(self::$operatorString.($needWhite ? '\s' : ''), $m) && self::$precedence[$m[1]] >= $minP) {
+                               if (!$this->inParens && isset($this->env->currentProperty) && $m[1] == "/" && empty($this->env->supressedDivision)) {
+                                       foreach (self::$supressDivisionProps as $pattern) {
+                                               if (preg_match($pattern, $this->env->currentProperty)) {
+                                                       $this->env->supressedDivision = true;
+                                                       break 2;
+                                               }
+                                       }
+                               }
+
+
+                               $whiteAfter = isset($this->buffer[$this->count - 1]) &&
+                                       ctype_space($this->buffer[$this->count - 1]);
+
+                               if (!$this->value($rhs)) break;
+
+                               // peek for next operator to see what to do with rhs
+                               if ($this->peek(self::$operatorString, $next) && self::$precedence[$next[1]] > self::$precedence[$m[1]]) {
+                                       $rhs = $this->expHelper($rhs, self::$precedence[$next[1]]);
+                               }
+
+                               $lhs = array('expression', $m[1], $lhs, $rhs, $whiteBefore, $whiteAfter);
+                               $ss = $this->seek();
+
+                               continue;
+                       }
+
+                       break;
+               }
+
+               $this->seek($ss);
+
+               return $lhs;
+       }
+
+       // consume a list of values for a property
+       public function propertyValue(&$value, $keyName = null) {
+               $values = array();
+
+               if ($keyName !== null) $this->env->currentProperty = $keyName;
+
+               $s = null;
+               while ($this->expressionList($v)) {
+                       $values[] = $v;
+                       $s = $this->seek();
+                       if (!$this->literal(',')) break;
+               }
+
+               if ($s) $this->seek($s);
+
+               if ($keyName !== null) unset($this->env->currentProperty);
+
+               if (count($values) == 0) return false;
+
+               $value = lessc::compressList($values, ', ');
+               return true;
+       }
+
+       protected function parenValue(&$out) {
+               $s = $this->seek();
+
+               // speed shortcut
+               if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] != "(") {
+                       return false;
+               }
+
+               $inParens = $this->inParens;
+               if ($this->literal("(") &&
+                       ($this->inParens = true) && $this->expression($exp) &&
+                       $this->literal(")"))
+               {
+                       $out = $exp;
+                       $this->inParens = $inParens;
+                       return true;
+               } else {
+                       $this->inParens = $inParens;
+                       $this->seek($s);
+               }
+
+               return false;
+       }
+
+       // a single value
+       protected function value(&$value) {
+               $s = $this->seek();
+
+               // speed shortcut
+               if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] == "-") {
+                       // negation
+                       if ($this->literal("-", false) &&
+                               (($this->variable($inner) && $inner = array("variable", $inner)) ||
+                               $this->unit($inner) ||
+                               $this->parenValue($inner)))
+                       {
+                               $value = array("unary", "-", $inner);
+                               return true;
+                       } else {
+                               $this->seek($s);
+                       }
+               }
+
+               if ($this->parenValue($value)) return true;
+               if ($this->unit($value)) return true;
+               if ($this->color($value)) return true;
+               if ($this->func($value)) return true;
+               if ($this->string($value)) return true;
+
+               if ($this->keyword($word)) {
+                       $value = array('keyword', $word);
+                       return true;
+               }
+
+               // try a variable
+               if ($this->variable($var)) {
+                       $value = array('variable', $var);
+                       return true;
+               }
+
+               // unquote string (should this work on any type?
+               if ($this->literal("~") && $this->string($str)) {
+                       $value = array("escape", $str);
+                       return true;
+               } else {
+                       $this->seek($s);
+               }
+
+               // css hack: \0
+               if ($this->literal('\\') && $this->match('([0-9]+)', $m)) {
+                       $value = array('keyword', '\\'.$m[1]);
+                       return true;
+               } else {
+                       $this->seek($s);
+               }
+
+               return false;
+       }
+
+       // an import statement
+       protected function import(&$out) {
+               $s = $this->seek();
+               if (!$this->literal('@import')) return false;
+
+               // @import "something.css" media;
+               // @import url("something.css") media;
+               // @import url(something.css) media;
+
+               if ($this->propertyValue($value)) {
+                       $out = array("import", $value);
+                       return true;
+               }
+       }
+
+       protected function mediaQueryList(&$out) {
+               if ($this->genericList($list, "mediaQuery", ",", false)) {
+                       $out = $list[2];
+                       return true;
+               }
+               return false;
+       }
+
+       protected function mediaQuery(&$out) {
+               $s = $this->seek();
+
+               $expressions = null;
+               $parts = array();
+
+               if (($this->literal("only") && ($only = true) || $this->literal("not") && ($not = true) || true) && $this->keyword($mediaType)) {
+                       $prop = array("mediaType");
+                       if (isset($only)) $prop[] = "only";
+                       if (isset($not)) $prop[] = "not";
+                       $prop[] = $mediaType;
+                       $parts[] = $prop;
+               } else {
+                       $this->seek($s);
+               }
+
+
+               if (!empty($mediaType) && !$this->literal("and")) {
+                       // ~
+               } else {
+                       $this->genericList($expressions, "mediaExpression", "and", false);
+                       if (is_array($expressions)) $parts = array_merge($parts, $expressions[2]);
+               }
+
+               if (count($parts) == 0) {
+                       $this->seek($s);
+                       return false;
+               }
+
+               $out = $parts;
+               return true;
+       }
+
+       protected function mediaExpression(&$out) {
+               $s = $this->seek();
+               $value = null;
+               if ($this->literal("(") &&
+                       $this->keyword($feature) &&
+                       ($this->literal(":") && $this->expression($value) || true) &&
+                       $this->literal(")"))
+               {
+                       $out = array("mediaExp", $feature);
+                       if ($value) $out[] = $value;
+                       return true;
+               } elseif ($this->variable($variable)) {
+                       $out = array('variable', $variable);
+                       return true;
+               }
+
+               $this->seek($s);
+               return false;
+       }
+
+       // an unbounded string stopped by $end
+       protected function openString($end, &$out, $nestingOpen=null, $rejectStrs = null) {
+               $oldWhite = $this->eatWhiteDefault;
+               $this->eatWhiteDefault = false;
+
+               $stop = array("'", '"', "@{", $end);
+               $stop = array_map(array("lessc", "preg_quote"), $stop);
+               // $stop[] = self::$commentMulti;
+
+               if (!is_null($rejectStrs)) {
+                       $stop = array_merge($stop, $rejectStrs);
+               }
+
+               $patt = '(.*?)('.implode("|", $stop).')';
+
+               $nestingLevel = 0;
+
+               $content = array();
+               while ($this->match($patt, $m, false)) {
+                       if (!empty($m[1])) {
+                               $content[] = $m[1];
+                               if ($nestingOpen) {
+                                       $nestingLevel += substr_count($m[1], $nestingOpen);
+                               }
+                       }
+
+                       $tok = $m[2];
+
+                       $this->count-= strlen($tok);
+                       if ($tok == $end) {
+                               if ($nestingLevel == 0) {
+                                       break;
+                               } else {
+                                       $nestingLevel--;
+                               }
+                       }
+
+                       if (($tok == "'" || $tok == '"') && $this->string($str)) {
+                               $content[] = $str;
+                               continue;
+                       }
+
+                       if ($tok == "@{" && $this->interpolation($inter)) {
+                               $content[] = $inter;
+                               continue;
+                       }
+
+                       if (!empty($rejectStrs) && in_array($tok, $rejectStrs)) {
+                               break;
+                       }
+
+                       $content[] = $tok;
+                       $this->count+= strlen($tok);
+               }
+
+               $this->eatWhiteDefault = $oldWhite;
+
+               if (count($content) == 0) return false;
+
+               // trim the end
+               if (is_string(end($content))) {
+                       $content[count($content) - 1] = rtrim(end($content));
+               }
+
+               $out = array("string", "", $content);
+               return true;
+       }
+
+       protected function string(&$out) {
+               $s = $this->seek();
+               if ($this->literal('"', false)) {
+                       $delim = '"';
+               } elseif ($this->literal("'", false)) {
+                       $delim = "'";
+               } else {
+                       return false;
+               }
+
+               $content = array();
+
+               // look for either ending delim , escape, or string interpolation
+               $patt = '([^\n]*?)(@\{|\\\\|' .
+                       lessc::preg_quote($delim).')';
+
+               $oldWhite = $this->eatWhiteDefault;
+               $this->eatWhiteDefault = false;
+
+               while ($this->match($patt, $m, false)) {
+                       $content[] = $m[1];
+                       if ($m[2] == "@{") {
+                               $this->count -= strlen($m[2]);
+                               if ($this->interpolation($inter, false)) {
+                                       $content[] = $inter;
+                               } else {
+                                       $this->count += strlen($m[2]);
+                                       $content[] = "@{"; // ignore it
+                               }
+                       } elseif ($m[2] == '\\') {
+                               $content[] = $m[2];
+                               if ($this->literal($delim, false)) {
+                                       $content[] = $delim;
+                               }
+                       } else {
+                               $this->count -= strlen($delim);
+                               break; // delim
+                       }
+               }
+
+               $this->eatWhiteDefault = $oldWhite;
+
+               if ($this->literal($delim)) {
+                       $out = array("string", $delim, $content);
+                       return true;
+               }
+
+               $this->seek($s);
+               return false;
+       }
+
+       protected function interpolation(&$out) {
+               $oldWhite = $this->eatWhiteDefault;
+               $this->eatWhiteDefault = true;
+
+               $s = $this->seek();
+               if ($this->literal("@{") &&
+                       $this->openString("}", $interp, null, array("'", '"', ";")) &&
+                       $this->literal("}", false))
+               {
+                       $out = array("interpolate", $interp);
+                       $this->eatWhiteDefault = $oldWhite;
+                       if ($this->eatWhiteDefault) $this->whitespace();
+                       return true;
+               }
+
+               $this->eatWhiteDefault = $oldWhite;
+               $this->seek($s);
+               return false;
+       }
+
+       protected function unit(&$unit) {
+               // speed shortcut
+               if (isset($this->buffer[$this->count])) {
+                       $char = $this->buffer[$this->count];
+                       if (!ctype_digit($char) && $char != ".") return false;
+               }
+
+               if ($this->match('([0-9]+(?:\.[0-9]*)?|\.[0-9]+)([%a-zA-Z]+)?', $m)) {
+                       $unit = array("number", $m[1], empty($m[2]) ? "" : $m[2]);
+                       return true;
+               }
+               return false;
+       }
+
+       // a # color
+       protected function color(&$out) {
+               if ($this->match('(#(?:[0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{3}))', $m)) {
+                       if (strlen($m[1]) > 7) {
+                               $out = array("string", "", array($m[1]));
+                       } else {
+                               $out = array("raw_color", $m[1]);
+                       }
+                       return true;
+               }
+
+               return false;
+       }
+
+       // consume an argument definition list surrounded by ()
+       // each argument is a variable name with optional value
+       // or at the end a ... or a variable named followed by ...
+       // arguments are separated by , unless a ; is in the list, then ; is the
+       // delimiter.
+       protected function argumentDef(&$args, &$isVararg) {
+               $s = $this->seek();
+               if (!$this->literal('(')) return false;
+
+               $values = array();
+               $delim = ",";
+               $method = "expressionList";
+
+               $isVararg = false;
+               while (true) {
+                       if ($this->literal("...")) {
+                               $isVararg = true;
+                               break;
+                       }
+
+                       if ($this->$method($value)) {
+                               if ($value[0] == "variable") {
+                                       $arg = array("arg", $value[1]);
+                                       $ss = $this->seek();
+
+                                       if ($this->assign() && $this->$method($rhs)) {
+                                               $arg[] = $rhs;
+                                       } else {
+                                               $this->seek($ss);
+                                               if ($this->literal("...")) {
+                                                       $arg[0] = "rest";
+                                                       $isVararg = true;
+                                               }
+                                       }
+
+                                       $values[] = $arg;
+                                       if ($isVararg) break;
+                                       continue;
+                               } else {
+                                       $values[] = array("lit", $value);
+                               }
+                       }
+
+
+                       if (!$this->literal($delim)) {
+                               if ($delim == "," && $this->literal(";")) {
+                                       // found new delim, convert existing args
+                                       $delim = ";";
+                                       $method = "propertyValue";
+
+                                       // transform arg list
+                                       if (isset($values[1])) { // 2 items
+                                               $newList = array();
+                                               foreach ($values as $i => $arg) {
+                                                       switch($arg[0]) {
+                                                       case "arg":
+                                                               if ($i) {
+                                                                       $this->throwError("Cannot mix ; and , as delimiter types");
+                                                               }
+                                                               $newList[] = $arg[2];
+                                                               break;
+                                                       case "lit":
+                                                               $newList[] = $arg[1];
+                                                               break;
+                                                       case "rest":
+                                                               $this->throwError("Unexpected rest before semicolon");
+                                                       }
+                                               }
+
+                                               $newList = array("list", ", ", $newList);
+
+                                               switch ($values[0][0]) {
+                                               case "arg":
+                                                       $newArg = array("arg", $values[0][1], $newList);
+                                                       break;
+                                               case "lit":
+                                                       $newArg = array("lit", $newList);
+                                                       break;
+                                               }
+
+                                       } elseif ($values) { // 1 item
+                                               $newArg = $values[0];
+                                       }
+
+                                       if ($newArg) {
+                                               $values = array($newArg);
+                                       }
+                               } else {
+                                       break;
+                               }
+                       }
+               }
+
+               if (!$this->literal(')')) {
+                       $this->seek($s);
+                       return false;
+               }
+
+               $args = $values;
+
+               return true;
+       }
+
+       // consume a list of tags
+       // this accepts a hanging delimiter
+       protected function tags(&$tags, $simple = false, $delim = ',') {
+               $tags = array();
+               while ($this->tag($tt, $simple)) {
+                       $tags[] = $tt;
+                       if (!$this->literal($delim)) break;
+               }
+               if (count($tags) == 0) return false;
+
+               return true;
+       }
+
+       // list of tags of specifying mixin path
+       // optionally separated by > (lazy, accepts extra >)
+       protected function mixinTags(&$tags) {
+               $s = $this->seek();
+               $tags = array();
+               while ($this->tag($tt, true)) {
+                       $tags[] = $tt;
+                       $this->literal(">");
+               }
+
+               if (count($tags) == 0) return false;
+
+               return true;
+       }
+
+       // a bracketed value (contained within in a tag definition)
+       protected function tagBracket(&$parts, &$hasExpression) {
+               // speed shortcut
+               if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] != "[") {
+                       return false;
+               }
+
+               $s = $this->seek();
+
+               $hasInterpolation = false;
+
+               if ($this->literal("[", false)) {
+                       $attrParts = array("[");
+                       // keyword, string, operator
+                       while (true) {
+                               if ($this->literal("]", false)) {
+                                       $this->count--;
+                                       break; // get out early
+                               }
+
+                               if ($this->match('\s+', $m)) {
+                                       $attrParts[] = " ";
+                                       continue;
+                               }
+                               if ($this->string($str)) {
+                                       // escape parent selector, (yuck)
+                                       foreach ($str[2] as &$chunk) {
+                                               $chunk = str_replace($this->lessc->parentSelector, "$&$", $chunk);
+                                       }
+
+                                       $attrParts[] = $str;
+                                       $hasInterpolation = true;
+                                       continue;
+                               }
+
+                               if ($this->keyword($word)) {
+                                       $attrParts[] = $word;
+                                       continue;
+                               }
+
+                               if ($this->interpolation($inter, false)) {
+                                       $attrParts[] = $inter;
+                                       $hasInterpolation = true;
+                                       continue;
+                               }
+
+                               // operator, handles attr namespace too
+                               if ($this->match('[|-~\$\*\^=]+', $m)) {
+                                       $attrParts[] = $m[0];
+                                       continue;
+                               }
+
+                               break;
+                       }
+
+                       if ($this->literal("]", false)) {
+                               $attrParts[] = "]";
+                               foreach ($attrParts as $part) {
+                                       $parts[] = $part;
+                               }
+                               $hasExpression = $hasExpression || $hasInterpolation;
+                               return true;
+                       }
+                       $this->seek($s);
+               }
+
+               $this->seek($s);
+               return false;
+       }
+
+       // a space separated list of selectors
+       protected function tag(&$tag, $simple = false) {
+               if ($simple)
+                       $chars = '^@,:;{}\][>\(\) "\'';
+               else
+                       $chars = '^@,;{}["\'';
+
+               $s = $this->seek();
+
+               $hasExpression = false;
+               $parts = array();
+               while ($this->tagBracket($parts, $hasExpression));
+
+               $oldWhite = $this->eatWhiteDefault;
+               $this->eatWhiteDefault = false;
+
+               while (true) {
+                       if ($this->match('(['.$chars.'0-9]['.$chars.']*)', $m)) {
+                               $parts[] = $m[1];
+                               if ($simple) break;
+
+                               while ($this->tagBracket($parts, $hasExpression));
+                               continue;
+                       }
+
+                       if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] == "@") {
+                               if ($this->interpolation($interp)) {
+                                       $hasExpression = true;
+                                       $interp[2] = true; // don't unescape
+                                       $parts[] = $interp;
+                                       continue;
+                               }
+
+                               if ($this->literal("@")) {
+                                       $parts[] = "@";
+                                       continue;
+                               }
+                       }
+
+                       if ($this->unit($unit)) { // for keyframes
+                               $parts[] = $unit[1];
+                               $parts[] = $unit[2];
+                               continue;
+                       }
+
+                       break;
+               }
+
+               $this->eatWhiteDefault = $oldWhite;
+               if (!$parts) {
+                       $this->seek($s);
+                       return false;
+               }
+
+               if ($hasExpression) {
+                       $tag = array("exp", array("string", "", $parts));
+               } else {
+                       $tag = trim(implode($parts));
+               }
+
+               $this->whitespace();
+               return true;
+       }
+
+       // a css function
+       protected function func(&$func) {
+               $s = $this->seek();
+
+               if ($this->match('(%|[\w\-_][\w\-_:\.]+|[\w_])', $m) && $this->literal('(')) {
+                       $fname = $m[1];
+
+                       $sPreArgs = $this->seek();
+
+                       $args = array();
+                       while (true) {
+                               $ss = $this->seek();
+                               // this ugly nonsense is for ie filter properties
+                               if ($this->keyword($name) && $this->literal('=') && $this->expressionList($value)) {
+                                       $args[] = array("string", "", array($name, "=", $value));
+                               } else {
+                                       $this->seek($ss);
+                                       if ($this->expressionList($value)) {
+                                               $args[] = $value;
+                                       }
+                               }
+
+                               if (!$this->literal(',')) break;
+                       }
+                       $args = array('list', ',', $args);
+
+                       if ($this->literal(')')) {
+                               $func = array('function', $fname, $args);
+                               return true;
+                       } elseif ($fname == 'url') {
+                               // couldn't parse and in url? treat as string
+                               $this->seek($sPreArgs);
+                               if ($this->openString(")", $string) && $this->literal(")")) {
+                                       $func = array('function', $fname, $string);
+                                       return true;
+                               }
+                       }
+               }
+
+               $this->seek($s);
+               return false;
+       }
+
+       // consume a less variable
+       protected function variable(&$name) {
+               $s = $this->seek();
+               if ($this->literal($this->lessc->vPrefix, false) &&
+                       ($this->variable($sub) || $this->keyword($name)))
+               {
+                       if (!empty($sub)) {
+                               $name = array('variable', $sub);
+                       } else {
+                               $name = $this->lessc->vPrefix.$name;
+                       }
+                       return true;
+               }
+
+               $name = null;
+               $this->seek($s);
+               return false;
+       }
+
+       /**
+        * Consume an assignment operator
+        * Can optionally take a name that will be set to the current property name
+        */
+       protected function assign($name = null) {
+               if ($name) $this->currentProperty = $name;
+               return $this->literal(':') || $this->literal('=');
+       }
+
+       // consume a keyword
+       protected function keyword(&$word) {
+               if ($this->match('([\w_\-\*!"][\w\-_"]*)', $m)) {
+                       $word = $m[1];
+                       return true;
+               }
+               return false;
+       }
+
+       // consume an end of statement delimiter
+       protected function end() {
+               if ($this->literal(';')) {
+                       return true;
+               } elseif ($this->count == strlen($this->buffer) || $this->buffer[$this->count] == '}') {
+                       // if there is end of file or a closing block next then we don't need a ;
+                       return true;
+               }
+               return false;
+       }
+
+       protected function guards(&$guards) {
+               $s = $this->seek();
+
+               if (!$this->literal("when")) {
+                       $this->seek($s);
+                       return false;
+               }
+
+               $guards = array();
+
+               while ($this->guardGroup($g)) {
+                       $guards[] = $g;
+                       if (!$this->literal(",")) break;
+               }
+
+               if (count($guards) == 0) {
+                       $guards = null;
+                       $this->seek($s);
+                       return false;
+               }
+
+               return true;
+       }
+
+       // a bunch of guards that are and'd together
+       // TODO rename to guardGroup
+       protected function guardGroup(&$guardGroup) {
+               $s = $this->seek();
+               $guardGroup = array();
+               while ($this->guard($guard)) {
+                       $guardGroup[] = $guard;
+                       if (!$this->literal("and")) break;
+               }
+
+               if (count($guardGroup) == 0) {
+                       $guardGroup = null;
+                       $this->seek($s);
+                       return false;
+               }
+
+               return true;
+       }
+
+       protected function guard(&$guard) {
+               $s = $this->seek();
+               $negate = $this->literal("not");
+
+               if ($this->literal("(") && $this->expression($exp) && $this->literal(")")) {
+                       $guard = $exp;
+                       if ($negate) $guard = array("negate", $guard);
+                       return true;
+               }
+
+               $this->seek($s);
+               return false;
+       }
+
+       /* raw parsing functions */
+
+       protected function literal($what, $eatWhitespace = null) {
+               if ($eatWhitespace === null) $eatWhitespace = $this->eatWhiteDefault;
+
+               // shortcut on single letter
+               if (!isset($what[1]) && isset($this->buffer[$this->count])) {
+                       if ($this->buffer[$this->count] == $what) {
+                               if (!$eatWhitespace) {
+                                       $this->count++;
+                                       return true;
+                               }
+                               // goes below...
+                       } else {
+                               return false;
+                       }
+               }
+
+               if (!isset(self::$literalCache[$what])) {
+                       self::$literalCache[$what] = lessc::preg_quote($what);
+               }
+
+               return $this->match(self::$literalCache[$what], $m, $eatWhitespace);
+       }
+
+       protected function genericList(&$out, $parseItem, $delim="", $flatten=true) {
+               $s = $this->seek();
+               $items = array();
+               while ($this->$parseItem($value)) {
+                       $items[] = $value;
+                       if ($delim) {
+                               if (!$this->literal($delim)) break;
+                       }
+               }
+
+               if (count($items) == 0) {
+                       $this->seek($s);
+                       return false;
+               }
+
+               if ($flatten && count($items) == 1) {
+                       $out = $items[0];
+               } else {
+                       $out = array("list", $delim, $items);
+               }
+
+               return true;
+       }
+
+
+       // advance counter to next occurrence of $what
+       // $until - don't include $what in advance
+       // $allowNewline, if string, will be used as valid char set
+       protected function to($what, &$out, $until = false, $allowNewline = false) {
+               if (is_string($allowNewline)) {
+                       $validChars = $allowNewline;
+               } else {
+                       $validChars = $allowNewline ? "." : "[^\n]";
+               }
+               if (!$this->match('('.$validChars.'*?)'.lessc::preg_quote($what), $m, !$until)) return false;
+               if ($until) $this->count -= strlen($what); // give back $what
+               $out = $m[1];
+               return true;
+       }
+
+       // try to match something on head of buffer
+       protected function match($regex, &$out, $eatWhitespace = null) {
+               if ($eatWhitespace === null) $eatWhitespace = $this->eatWhiteDefault;
+
+               $r = '/'.$regex.($eatWhitespace && !$this->writeComments ? '\s*' : '').'/Ais';
+               if (preg_match($r, $this->buffer, $out, null, $this->count)) {
+                       $this->count += strlen($out[0]);
+                       if ($eatWhitespace && $this->writeComments) $this->whitespace();
+                       return true;
+               }
+               return false;
+       }
+
+       // match some whitespace
+       protected function whitespace() {
+               if ($this->writeComments) {
+                       $gotWhite = false;
+                       while (preg_match(self::$whitePattern, $this->buffer, $m, null, $this->count)) {
+                               if (isset($m[1]) && empty($this->commentsSeen[$this->count])) {
+                                       $this->append(array("comment", $m[1]));
+                                       $this->commentsSeen[$this->count] = true;
+                               }
+                               $this->count += strlen($m[0]);
+                               $gotWhite = true;
+                       }
+                       return $gotWhite;
+               } else {
+                       $this->match("", $m);
+                       return strlen($m[0]) > 0;
+               }
+       }
+
+       // match something without consuming it
+       protected function peek($regex, &$out = null, $from=null) {
+               if (is_null($from)) $from = $this->count;
+               $r = '/'.$regex.'/Ais';
+               $result = preg_match($r, $this->buffer, $out, null, $from);
+
+               return $result;
+       }
+
+       // seek to a spot in the buffer or return where we are on no argument
+       protected function seek($where = null) {
+               if ($where === null) return $this->count;
+               else $this->count = $where;
+               return true;
+       }
+
+       /* misc functions */
+
+       public function throwError($msg = "parse error", $count = null) {
+               $count = is_null($count) ? $this->count : $count;
+
+               $line = $this->line +
+                       substr_count(substr($this->buffer, 0, $count), "\n");
+
+               if (!empty($this->sourceName)) {
+                       $loc = "$this->sourceName on line $line";
+               } else {
+                       $loc = "line: $line";
+               }
+
+               // TODO this depends on $this->count
+               if ($this->peek("(.*?)(\n|$)", $m, $count)) {
+                       throw new exception("$msg: failed at `$m[1]` $loc");
+               } else {
+                       throw new exception("$msg: $loc");
+               }
+       }
+
+       protected function pushBlock($selectors=null, $type=null) {
+               $b = new stdclass;
+               $b->parent = $this->env;
+
+               $b->type = $type;
+               $b->id = self::$nextBlockId++;
+
+               $b->isVararg = false; // TODO: kill me from here
+               $b->tags = $selectors;
+
+               $b->props = array();
+               $b->children = array();
+
+               $this->env = $b;
+               return $b;
+       }
+
+       // push a block that doesn't multiply tags
+       protected function pushSpecialBlock($type) {
+               return $this->pushBlock(null, $type);
+       }
+
+       // append a property to the current block
+       protected function append($prop, $pos = null) {
+               if ($pos !== null) $prop[-1] = $pos;
+               $this->env->props[] = $prop;
+       }
+
+       // pop something off the stack
+       protected function pop() {
+               $old = $this->env;
+               $this->env = $this->env->parent;
+               return $old;
+       }
+
+       // remove comments from $text
+       // todo: make it work for all functions, not just url
+       protected function removeComments($text) {
+               $look = array(
+                       'url(', '//', '/*', '"', "'"
+               );
+
+               $out = '';
+               $min = null;
+               while (true) {
+                       // find the next item
+                       foreach ($look as $token) {
+                               $pos = strpos($text, $token);
+                               if ($pos !== false) {
+                                       if (!isset($min) || $pos < $min[1]) $min = array($token, $pos);
+                               }
+                       }
+
+                       if (is_null($min)) break;
+
+                       $count = $min[1];
+                       $skip = 0;
+                       $newlines = 0;
+                       switch ($min[0]) {
+                       case 'url(':
+                               if (preg_match('/url\(.*?\)/', $text, $m, 0, $count))
+                                       $count += strlen($m[0]) - strlen($min[0]);
+                               break;
+                       case '"':
+                       case "'":
+                               if (preg_match('/'.$min[0].'.*?(?<!\\\\)'.$min[0].'/', $text, $m, 0, $count))
+                                       $count += strlen($m[0]) - 1;
+                               break;
+                       case '//':
+                               $skip = strpos($text, "\n", $count);
+                               if ($skip === false) $skip = strlen($text) - $count;
+                               else $skip -= $count;
+                               break;
+                       case '/*':
+                               if (preg_match('/\/\*.*?\*\//s', $text, $m, 0, $count)) {
+                                       $skip = strlen($m[0]);
+                                       $newlines = substr_count($m[0], "\n");
+                               }
+                               break;
+                       }
+
+                       if ($skip == 0) $count += strlen($min[0]);
+
+                       $out .= substr($text, 0, $count).str_repeat("\n", $newlines);
+                       $text = substr($text, $count + $skip);
+
+                       $min = null;
+               }
+
+               return $out.$text;
+       }
+
+}
+
+class lessc_formatter_classic {
+       public $indentChar = "  ";
+
+       public $break = "\n";
+       public $open = " {";
+       public $close = "}";
+       public $selectorSeparator = ", ";
+       public $assignSeparator = ":";
+
+       public $openSingle = " { ";
+       public $closeSingle = " }";
+
+       public $disableSingle = false;
+       public $breakSelectors = false;
+
+       public $compressColors = false;
+
+       public function __construct() {
+               $this->indentLevel = 0;
+       }
+
+       public function indentStr($n = 0) {
+               return str_repeat($this->indentChar, max($this->indentLevel + $n, 0));
+       }
+
+       public function property($name, $value) {
+               return $name . $this->assignSeparator . $value . ";";
+       }
+
+       protected function isEmpty($block) {
+               if (empty($block->lines)) {
+                       foreach ($block->children as $child) {
+                               if (!$this->isEmpty($child)) return false;
+                       }
+
+                       return true;
+               }
+               return false;
+       }
+
+       public function block($block) {
+               if ($this->isEmpty($block)) return;
+
+               $inner = $pre = $this->indentStr();
+
+               $isSingle = !$this->disableSingle &&
+                       is_null($block->type) && count($block->lines) == 1;
+
+               if (!empty($block->selectors)) {
+                       $this->indentLevel++;
+
+                       if ($this->breakSelectors) {
+                               $selectorSeparator = $this->selectorSeparator . $this->break . $pre;
+                       } else {
+                               $selectorSeparator = $this->selectorSeparator;
+                       }
+
+                       echo $pre .
+                               implode($selectorSeparator, $block->selectors);
+                       if ($isSingle) {
+                               echo $this->openSingle;
+                               $inner = "";
+                       } else {
+                               echo $this->open . $this->break;
+                               $inner = $this->indentStr();
+                       }
+
+               }
+
+               if (!empty($block->lines)) {
+                       $glue = $this->break.$inner;
+                       echo $inner . implode($glue, $block->lines);
+                       if (!$isSingle && !empty($block->children)) {
+                               echo $this->break;
+                       }
+               }
+
+               foreach ($block->children as $child) {
+                       $this->block($child);
+               }
+
+               if (!empty($block->selectors)) {
+                       if (!$isSingle && empty($block->children)) echo $this->break;
+
+                       if ($isSingle) {
+                               echo $this->closeSingle . $this->break;
+                       } else {
+                               echo $pre . $this->close . $this->break;
+                       }
+
+                       $this->indentLevel--;
+               }
+       }
+}
+
+class lessc_formatter_compressed extends lessc_formatter_classic {
+       public $disableSingle = true;
+       public $open = "{";
+       public $selectorSeparator = ",";
+       public $assignSeparator = ":";
+       public $break = "";
+       public $compressColors = true;
+
+       public function indentStr($n = 0) {
+               return "";
+       }
+}
+
+class lessc_formatter_lessjs extends lessc_formatter_classic {
+       public $disableSingle = true;
+       public $breakSelectors = true;
+       public $assignSeparator = ": ";
+       public $selectorSeparator = ",";
+}
+
+
index 3fb7b89..f8403ca 100644 (file)
@@ -253,16 +253,13 @@ class LogPager extends ReverseChronologicalPager {
                # the choices of available indexes. This mainly
                # avoids site-breaking filesorts.
                } elseif ( $this->title || $this->pattern || $this->performer ) {
-                       $index['logging'] = array( 'page_time', 'user_time' );
-                       if ( count( $this->types ) == 1 ) {
-                               $index['logging'][] = 'log_user_type_time';
-                       }
+                       $index['logging'] = array( 'page_time', 'user_time', 'log_user_type_time' );
                } elseif ( count( $this->types ) == 1 ) {
-                       $index['logging'] = 'type_time';
-               } else {
-                       $index['logging'] = 'times';
+                       $index['logging'] = 'type_time'; // @TODO: sucks for change tags
+               }
+               if ( count( $index ) ) {
+                       $options['USE INDEX'] = $index;
                }
-               $options['USE INDEX'] = $index;
                # Don't show duplicate rows when using log_search
                $joins['log_search'] = array( 'INNER JOIN', 'ls_log_id=log_id' );
 
index 8df0e2c..70a94fe 100644 (file)
@@ -719,13 +719,7 @@ class CoreParserFunctions {
                $page = $title->getPrefixedText();
 
                $length = 0;
-               if ( $title->equals( $parser->getTitle() )
-                       && $parser->mInputSize !== false
-               ) {
-                       # We are on current page (and not in PST), so
-                       # take length of input to parser.
-                       $length = $parser->mInputSize;
-               } elseif ( isset( $cache[$page] ) ) {
+               if ( isset( $cache[$page] ) ) {
                        $length = $cache[$page];
                } elseif ( $parser->incrementExpensiveFunctionCount() ) {
                        $rev = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
index 170148c..eac2202 100644 (file)
@@ -191,6 +191,7 @@ class Parser {
        var $mRevisionId;   # ID to display in {{REVISIONID}} tags
        var $mRevisionTimestamp; # The timestamp of the specified revision ID
        var $mRevisionUser; # User to display in {{REVISIONUSER}} tag
+       var $mRevisionSize; # Size to display in {{REVISIONSIZE}} variable
        var $mRevIdForTs;   # The revision ID which was used to fetch the timestamp
        var $mInputSize = false; # For {{PAGESIZE}} on current page.
 
@@ -292,7 +293,7 @@ class Parser {
                $this->mLinkHolders = new LinkHolderArray( $this );
                $this->mLinkID = 0;
                $this->mRevisionObject = $this->mRevisionTimestamp =
-                       $this->mRevisionId = $this->mRevisionUser = null;
+                       $this->mRevisionId = $this->mRevisionUser = $this->mRevisionSize = null;
                $this->mVarCache = array();
                $this->mUser = null;
                $this->mLangLinkLanguages = array();
@@ -375,11 +376,13 @@ class Parser {
                $oldRevisionObject = $this->mRevisionObject;
                $oldRevisionTimestamp = $this->mRevisionTimestamp;
                $oldRevisionUser = $this->mRevisionUser;
+               $oldRevisionSize = $this->mRevisionSize;
                if ( $revid !== null ) {
                        $this->mRevisionId = $revid;
                        $this->mRevisionObject = null;
                        $this->mRevisionTimestamp = null;
                        $this->mRevisionUser = null;
+                       $this->mRevisionSize = null;
                }
 
                wfRunHooks( 'ParserBeforeStrip', array( &$this, &$text, &$this->mStripState ) );
@@ -566,6 +569,7 @@ class Parser {
                $this->mRevisionObject = $oldRevisionObject;
                $this->mRevisionTimestamp = $oldRevisionTimestamp;
                $this->mRevisionUser = $oldRevisionUser;
+               $this->mRevisionSize = $oldRevisionSize;
                $this->mInputSize = false;
                wfProfileOut( $fname );
                wfProfileOut( __METHOD__ );
@@ -1414,7 +1418,8 @@ class Parser {
         */
        public function doQuotes( $text ) {
                $arr = preg_split( "/(''+)/", $text, -1, PREG_SPLIT_DELIM_CAPTURE );
-               if ( count( $arr ) == 1 ) {
+               $countarr = count( $arr );
+               if ( $countarr == 1 ) {
                        return $text;
                }
 
@@ -1423,26 +1428,29 @@ class Parser {
                // of bold and italics mark-ups.
                $numbold = 0;
                $numitalics = 0;
-               for ( $i = 1; $i < count( $arr ); $i += 2 ) {
+               for ( $i = 1; $i < $countarr; $i += 2 ) {
+                       $thislen = strlen( $arr[$i] );
                        // If there are ever four apostrophes, assume the first is supposed to
                        // be text, and the remaining three constitute mark-up for bold text.
                        // (bug 13227: ''''foo'''' turns into ' ''' foo ' ''')
-                       if ( strlen( $arr[$i] ) == 4 ) {
+                       if ( $thislen == 4 ) {
                                $arr[$i - 1] .= "'";
                                $arr[$i] = "'''";
-                       } elseif ( strlen( $arr[$i] ) > 5 ) {
+                               $thislen = 3;
+                       } elseif ( $thislen > 5 ) {
                                // If there are more than 5 apostrophes in a row, assume they're all
                                // text except for the last 5.
                                // (bug 13227: ''''''foo'''''' turns into ' ''''' foo ' ''''')
-                               $arr[$i - 1] .= str_repeat( "'", strlen( $arr[$i] ) - 5 );
+                               $arr[$i - 1] .= str_repeat( "'", $thislen - 5 );
                                $arr[$i] = "'''''";
+                               $thislen = 5;
                        }
                        // Count the number of occurrences of bold and italics mark-ups.
-                       if ( strlen( $arr[$i] ) == 2 ) {
+                       if ( $thislen == 2 ) {
                                $numitalics++;
-                       } elseif ( strlen( $arr[$i] ) == 3 ) {
+                       } elseif ( $thislen == 3 ) {
                                $numbold++;
-                       } elseif ( strlen( $arr[$i] ) == 5 ) {
+                       } elseif ( $thislen == 5 ) {
                                $numitalics++;
                                $numbold++;
                        }
@@ -1456,7 +1464,7 @@ class Parser {
                        $firstsingleletterword = -1;
                        $firstmultiletterword = -1;
                        $firstspace = -1;
-                       for ( $i = 1; $i < count( $arr ); $i += 2 ) {
+                       for ( $i = 1; $i < $countarr; $i += 2 ) {
                                if ( strlen( $arr[$i] ) == 3 ) {
                                        $x1 = substr( $arr[$i - 1], -1 );
                                        $x2 = substr( $arr[$i - 1], -2, 1 );
@@ -1467,6 +1475,9 @@ class Parser {
                                        } elseif ( $x2 === ' ' ) {
                                                if ( $firstsingleletterword == -1 ) {
                                                        $firstsingleletterword = $i;
+                                                       // if $firstsingleletterword is set, we don't
+                                                       // look at the other options, so we can bail early.
+                                                       break;
                                                }
                                        } else {
                                                if ( $firstmultiletterword == -1 ) {
@@ -1506,7 +1517,8 @@ class Parser {
                                        $output .= $r;
                                }
                        } else {
-                               if ( strlen( $r ) == 2 ) {
+                               $thislen = strlen( $r );
+                               if ( $thislen == 2 ) {
                                        if ( $state === 'i' ) {
                                                $output .= '</i>';
                                                $state = '';
@@ -1523,7 +1535,7 @@ class Parser {
                                                $output .= '<i>';
                                                $state .= 'i';
                                        }
-                               } elseif ( strlen( $r ) == 3 ) {
+                               } elseif ( $thislen == 3 ) {
                                        if ( $state === 'b' ) {
                                                $output .= '</b>';
                                                $state = '';
@@ -1540,7 +1552,7 @@ class Parser {
                                                $output .= '<b>';
                                                $state .= 'b';
                                        }
-                               } elseif ( strlen( $r ) == 5 ) {
+                               } elseif ( $thislen == 5 ) {
                                        if ( $state === 'b' ) {
                                                $output .= '</b><i>';
                                                $state = 'i';
@@ -2354,6 +2366,7 @@ class Parser {
                $this->mDTopen = $inBlockElem = false;
                $prefixLength = 0;
                $paragraphStack = false;
+               $inBlockquote = false;
 
                foreach ( $textLines as $oLine ) {
                        # Fix up $linestart
@@ -2447,10 +2460,10 @@ class Parser {
                                wfProfileIn( __METHOD__ . "-paragraph" );
                                # No prefix (not in list)--go to paragraph mode
                                # XXX: use a stack for nestable elements like span, table and div
-                               $openmatch = preg_match( '/(?:<table|<blockquote|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)/iS', $t );
+                               $openmatch = preg_match( '/(?:<table|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)/iS', $t );
                                $closematch = preg_match(
-                                       '/(?:<\\/table|<\\/blockquote|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|' .
-                                       '<td|<th|<\\/?div|<hr|<\\/pre|<\\/p|' . $this->mUniqPrefix . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS', $t );
+                                       '/(?:<\\/table|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|' .
+                                       '<td|<th|<\\/?blockquote|<\\/?div|<hr|<\\/pre|<\\/p|' . $this->mUniqPrefix . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS', $t );
                                if ( $openmatch or $closematch ) {
                                        $paragraphStack = false;
                                        # TODO bug 5718: paragraph closed
@@ -2458,9 +2471,14 @@ class Parser {
                                        if ( $preOpenMatch and !$preCloseMatch ) {
                                                $this->mInPre = true;
                                        }
+                                       $bqOffset = 0;
+                                       while ( preg_match( '/<(\\/?)blockquote[\s>]/i', $t, $bqMatch, PREG_OFFSET_CAPTURE, $bqOffset ) ) {
+                                               $inBlockquote = !$bqMatch[1][0]; // is this a close tag?
+                                               $bqOffset = $bqMatch[0][1] + strlen( $bqMatch[0][0] );
+                                       }
                                        $inBlockElem = !$closematch;
                                } elseif ( !$inBlockElem && !$this->mInPre ) {
-                                       if ( ' ' == substr( $t, 0, 1 ) and ( $this->mLastSection === 'pre' || trim( $t ) != '' ) ) {
+                                       if ( ' ' == substr( $t, 0, 1 ) and ( $this->mLastSection === 'pre' || trim( $t ) != '' ) and !$inBlockquote ) {
                                                # pre
                                                if ( $this->mLastSection !== 'pre' ) {
                                                        $paragraphStack = false;
@@ -2890,6 +2908,13 @@ class Parser {
                                wfDebug( __METHOD__ . ": {{REVISIONUSER}} used, setting vary-revision...\n" );
                                $value = $this->getRevisionUser();
                                break;
+                       case 'revisionsize':
+                               # Let the edit saving system know we should parse the page
+                               # *after* a revision ID has been assigned. This is for null edits.
+                               $this->mOutput->setFlag( 'vary-revision' );
+                               wfDebug( __METHOD__ . ": {{REVISIONSIZE}} used, setting vary-revision...\n" );
+                               $value = $this->getRevisionSize();
+                               break;
                        case 'namespace':
                                $value = str_replace( '_', ' ', $wgContLang->getNsText( $this->mTitle->getNamespace() ) );
                                break;
@@ -5789,6 +5814,27 @@ class Parser {
                return $this->mRevisionUser;
        }
 
+       /**
+        * Get the size of the revision
+        *
+        * @return int|null revision size
+        */
+       function getRevisionSize() {
+               if ( is_null( $this->mRevisionSize ) ) {
+                       $revObject = $this->getRevisionObject();
+
+                       # if this variable is subst: the revision id will be blank,
+                       # so just use the parser input size, because the own substituation
+                       # will change the size.
+                       if ( $revObject ) {
+                               $this->mRevisionSize = $revObject->getSize();
+                       } elseif ( $this->ot['wiki'] || $this->mOptions->getIsPreview() ) {
+                               $this->mRevisionSize = $this->mInputSize;
+                       }
+               }
+               return $this->mRevisionSize;
+       }
+
        /**
         * Mutator for $mDefaultSort
         *
index dde0609..3138f48 100644 (file)
@@ -183,21 +183,21 @@ class Preprocessor_DOM implements Preprocessor {
                        $xml = UtfNormal::cleanUp( $xml );
                        // 1 << 19 == XML_PARSE_HUGE, needed so newer versions of libxml2 don't barf when the XML is >256 levels deep
                        $result = $dom->loadXML( $xml, 1 << 19 );
-                       if ( !$result ) {
-                               wfProfileOut( __METHOD__ . '-loadXML' );
-                               if ( $cacheable ) {
-                                       wfProfileOut( __METHOD__ . '-cacheable' );
-                               }
-                               wfProfileOut( __METHOD__ );
-                               throw new MWException( __METHOD__ . ' generated invalid XML' );
-                       }
                }
-               $obj = new PPNode_DOM( $dom->documentElement );
+               if ( $result ) {
+                       $obj = new PPNode_DOM( $dom->documentElement );
+               }
                wfProfileOut( __METHOD__ . '-loadXML' );
+
                if ( $cacheable ) {
                        wfProfileOut( __METHOD__ . '-cacheable' );
                }
+
                wfProfileOut( __METHOD__ );
+
+               if ( !$result ) {
+                       throw new MWException( __METHOD__ . ' generated invalid XML' );
+               }
                return $obj;
        }
 
index ff3ea35..b943dd0 100644 (file)
@@ -153,6 +153,7 @@ class ResourceLoader {
                $cache = wfGetCache( CACHE_ANYTHING );
                $cacheEntry = $cache->get( $key );
                if ( is_string( $cacheEntry ) ) {
+                       wfIncrStats( "rl-$filter-cache-hits" );
                        wfProfileOut( __METHOD__ );
                        return $cacheEntry;
                }
@@ -160,6 +161,7 @@ class ResourceLoader {
                $result = '';
                // Run the filter - we've already verified one of these will work
                try {
+                       wfIncrStats( "rl-$filter-cache-misses" );
                        switch ( $filter ) {
                                case 'minify-js':
                                        $result = JavaScriptMinifier::minify( $data,
@@ -177,6 +179,7 @@ class ResourceLoader {
                        // Save filtered text to Memcached
                        $cache->set( $key, $result );
                } catch ( Exception $exception ) {
+                       $exception->logException();
                        wfDebugLog( 'resourceloader', __METHOD__ . ": minification failed: $exception" );
                        $this->hasErrors = true;
                        // Return exception as a comment
@@ -474,6 +477,7 @@ class ResourceLoader {
                try {
                        $this->preloadModuleInfo( array_keys( $modules ), $context );
                } catch ( Exception $e ) {
+                       $e->logException();
                        wfDebugLog( 'resourceloader', __METHOD__ . ": preloading module info failed: $e" );
                        $this->hasErrors = true;
                        // Add exception to the output as a comment
@@ -493,6 +497,7 @@ class ResourceLoader {
                                // Calculate maximum modified time
                                $mtime = max( $mtime, $module->getModifiedTime( $context ) );
                        } catch ( Exception $e ) {
+                               $e->logException();
                                wfDebugLog( 'resourceloader', __METHOD__ . ": calculating maximum modified time failed: $e" );
                                $this->hasErrors = true;
                                // Add exception to the output as a comment
@@ -607,15 +612,7 @@ class ResourceLoader {
                                // See also http://bugs.php.net/bug.php?id=51579
                                // To work around this, we tear down all output buffering before
                                // sending the 304.
-                               // On some setups, ob_get_level() doesn't seem to go down to zero
-                               // no matter how often we call ob_get_clean(), so instead of doing
-                               // the more intuitive while ( ob_get_level() > 0 ) ob_get_clean();
-                               // we have to be safe here and avoid an infinite loop.
-                               // Caching the level is not an option, need to allow it to
-                               // shorten the loop on-the-fly (bug 46836)
-                               for ( $i = 0; $i < ob_get_level(); $i++ ) {
-                                       ob_end_clean();
-                               }
+                               wfResetOutputBuffers( /* $resetGzipEncoding = */ true );
 
                                header( 'HTTP/1.0 304 Not Modified' );
                                header( 'Status: 304 Not Modified' );
@@ -727,6 +724,7 @@ class ResourceLoader {
                        try {
                                $blobs = MessageBlobStore::get( $this, $modules, $context->getLanguage() );
                        } catch ( Exception $e ) {
+                               $e->logException();
                                wfDebugLog( 'resourceloader', __METHOD__ . ": pre-fetching blobs from MessageBlobStore failed: $e" );
                                $this->hasErrors = true;
                                // Add exception to the output as a comment
@@ -834,6 +832,7 @@ class ResourceLoader {
                                                break;
                                }
                        } catch ( Exception $e ) {
+                               $e->logException();
                                wfDebugLog( 'resourceloader', __METHOD__ . ": generating module package failed: $e" );
                                $this->hasErrors = true;
                                // Add exception to the output as a comment
index af533c6..ead81cc 100644 (file)
@@ -115,6 +115,12 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        protected $raw = false;
        protected $targets = array( 'desktop' );
 
+       /**
+        * Boolean: Whether getStyleURLsForDebug should return raw file paths,
+        * or return load.php urls
+        */
+       protected $hasGeneratedStyles = false;
+
        /**
         * Array: Cache for mtime
         * @par Usage:
@@ -259,8 +265,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Gets all scripts for a given context concatenated together.
         *
-        * @param $context ResourceLoaderContext: Context in which to generate script
-        * @return String: JavaScript code for $context
+        * @param ResourceLoaderContext $context Context in which to generate script
+        * @return string: JavaScript code for $context
         */
        public function getScript( ResourceLoaderContext $context ) {
                $files = $this->getScriptFiles( $context );
@@ -268,7 +274,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        }
 
        /**
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @return array
         */
        public function getScriptURLsForDebug( ResourceLoaderContext $context ) {
@@ -289,7 +295,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Gets loader script.
         *
-        * @return String: JavaScript code to be added to startup module
+        * @return string: JavaScript code to be added to startup module
         */
        public function getLoaderScript() {
                if ( count( $this->loaderScripts ) == 0 ) {
@@ -301,8 +307,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Gets all styles for a given context concatenated together.
         *
-        * @param $context ResourceLoaderContext: Context in which to generate styles
-        * @return String: CSS code for $context
+        * @param ResourceLoaderContext $context Context in which to generate styles
+        * @return string: CSS code for $context
         */
        public function getStyles( ResourceLoaderContext $context ) {
                $styles = $this->readStyleFiles(
@@ -330,10 +336,17 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        }
 
        /**
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @return array
         */
        public function getStyleURLsForDebug( ResourceLoaderContext $context ) {
+               if ( $this->hasGeneratedStyles ) {
+                       // Do the default behaviour of returning a url back to load.php
+                       // but with only=styles.
+                       return parent::getStyleURLsForDebug( $context );
+               }
+               // Our module consists entirely of real css files,
+               // in debug mode we can load those directly.
                $urls = array();
                foreach ( $this->getStyleFiles( $context ) as $mediaType => $list ) {
                        $urls[$mediaType] = array();
@@ -347,7 +360,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Gets list of message keys used by this module.
         *
-        * @return Array: List of message keys
+        * @return array: List of message keys
         */
        public function getMessages() {
                return $this->messages;
@@ -356,7 +369,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Gets the name of the group this module should be loaded in.
         *
-        * @return String: Group name
+        * @return string: Group name
         */
        public function getGroup() {
                return $this->group;
@@ -372,7 +385,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Gets list of names of modules this module depends on.
         *
-        * @return Array: List of module names
+        * @return array: List of module names
         */
        public function getDependencies() {
                return $this->dependencies;
@@ -394,9 +407,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * calculations on files relevant to the given language, skin and debug
         * mode.
         *
-        * @param $context ResourceLoaderContext: Context in which to calculate
+        * @param ResourceLoaderContext $context Context in which to calculate
         *     the modified time
-        * @return Integer: UNIX timestamp
+        * @return int: UNIX timestamp
         * @see ResourceLoaderModule::getFileDependencies
         */
        public function getModifiedTime( ResourceLoaderContext $context ) {
@@ -455,7 +468,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /* Protected Methods */
 
        /**
-        * @param $path string
+        * @param string $path
         * @return string
         */
        protected function getLocalPath( $path ) {
@@ -463,21 +476,31 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        }
 
        /**
-        * @param $path string
+        * @param string $path
         * @return string
         */
        protected function getRemotePath( $path ) {
                return "{$this->remoteBasePath}/$path";
        }
 
+       /**
+        * Infer the stylesheet language from a stylesheet file path.
+        *
+        * @param string $path
+        * @return string: the stylesheet language name
+        */
+       protected function getStyleSheetLang( $path ) {
+               return preg_match( '/\.less$/i', $path ) ? 'less' : 'css';
+       }
+
        /**
         * Collates file paths by option (where provided).
         *
         * @param array $list List of file paths in any combination of index/path
         *     or path/options pairs
         * @param string $option option name
-        * @param $default Mixed: default value if the option isn't set
-        * @return Array: List of file paths, collated by $option
+        * @param mixed $default default value if the option isn't set
+        * @return array: List of file paths, collated by $option
         */
        protected static function collateFilePathListByOption( array $list, $option, $default ) {
                $collatedFiles = array();
@@ -506,7 +529,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @param array $list List of lists to select from
         * @param string $key Key to look for in $map
         * @param string $fallback Key to look for in $list if $key doesn't exist
-        * @return Array: List of elements from $map which matched $key or $fallback,
+        * @return array: List of elements from $map which matched $key or $fallback,
         *     or an empty list in case of no match
         */
        protected static function tryForKey( array $list, $key, $fallback = null ) {
@@ -524,8 +547,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Gets a list of file paths for all scripts in this module, in order of propper execution.
         *
-        * @param $context ResourceLoaderContext: Context
-        * @return Array: List of file paths
+        * @param ResourceLoaderContext $context
+        * @return array: List of file paths
         */
        protected function getScriptFiles( ResourceLoaderContext $context ) {
                $files = array_merge(
@@ -543,8 +566,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Gets a list of file paths for all styles in this module, in order of propper inclusion.
         *
-        * @param $context ResourceLoaderContext: Context
-        * @return Array: List of file paths
+        * @param ResourceLoaderContext $context
+        * @return array: List of file paths
         */
        protected function getStyleFiles( ResourceLoaderContext $context ) {
                return array_merge_recursive(
@@ -560,7 +583,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *
         * @param array $scripts List of file paths to scripts to read, remap and concetenate
         * @throws MWException
-        * @return String: Concatenated and remapped JavaScript data from $scripts
+        * @return string: Concatenated and remapped JavaScript data from $scripts
         */
        protected function readScriptFiles( array $scripts ) {
                global $wgResourceLoaderValidateStaticJS;
@@ -591,9 +614,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @param array $styles List of media type/list of file paths pairs, to read, remap and
         * concetenate
         *
-        * @param $flip bool
+        * @param bool $flip
         *
-        * @return Array: List of concatenated and remapped CSS data from $styles,
+        * @return array: List of concatenated and remapped CSS data from $styles,
         *     keyed by media type
         */
        protected function readStyleFiles( array $styles, $flip ) {
@@ -620,9 +643,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * This method can be used as a callback for array_map()
         *
         * @param string $path File path of style file to read
-        * @param $flip bool
+        * @param bool $flip
         *
-        * @return String: CSS data in script file
+        * @return string: CSS data in script file
         * @throws MWException if the file doesn't exist
         */
        protected function readStyleFile( $path, $flip ) {
@@ -632,7 +655,14 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        wfDebugLog( 'resourceloader', $msg );
                        throw new MWException( $msg );
                }
-               $style = file_get_contents( $localPath );
+
+               if ( $this->getStyleSheetLang( $path ) === 'less' ) {
+                       $style = $this->compileLESSFile( $localPath );
+                       $this->hasGeneratedStyles = true;
+               } else {
+                       $style = file_get_contents( $localPath );
+               }
+
                if ( $flip ) {
                        $style = CSSJanus::transform( $style, true, false );
                }
@@ -655,7 +685,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 
        /**
         * Get whether CSS for this module should be flipped
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @return bool
         */
        public function getFlip( $context ) {
@@ -671,4 +701,82 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                return $this->targets;
        }
 
+       /**
+        * 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.
+        *
+        * @param string $fileName File name of root LESS file.
+        * @return string: Cache key
+        */
+       protected static function getLESSCacheKey( $fileName ) {
+               global $wgShowExceptionDetails;
+
+               $vars = json_encode( self::getLESSVars() );
+               $hash = md5( $fileName . $vars );
+               return wfMemcKey( 'resourceloader', 'less', (string)$wgShowExceptionDetails, $hash );
+       }
+
+       /**
+        * Compile a LESS file into CSS.
+        *
+        * If invalid, returns replacement CSS source consisting of the compilation
+        * error message encoded as a comment. To save work, we cache a result object
+        * which comprises the compiled CSS and the names & mtimes of the files
+        * that were processed. lessphp compares the cached & current mtimes and
+        * recompiles as necessary.
+        *
+        * @param string $fileName File path of LESS source
+        * @return string: CSS source
+        */
+       protected function compileLESSFile( $fileName ) {
+               global $wgShowExceptionDetails;
+
+               $key = self::getLESSCacheKey( $fileName );
+               $cache = wfGetCache( CACHE_ANYTHING );
+
+               // The input to lessc. Either an associative array representing the
+               // cached results of a previous compilation, or the string file name if
+               // no cache result exists.
+               $source = $cache->get( $key );
+               if ( !is_array( $source ) || !isset( $source['root'] ) ) {
+                       $source = $fileName;
+               }
+
+               $compiler = self::lessCompiler();
+               $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['files'] = array( $fileName => self::safeFilemtime( $fileName ) );
+                       $result['updated'] = time();
+               }
+               // Tie cache expiry to the names and mtimes of image files that were
+               // embedded in the generated CSS source.
+               $result['files'] += $compiler->embeddedImages;
+               $this->localFileRefs += array_keys( $result['files'] );
+               $cache->set( $key, $result, $expire );
+               return $result['compiled'];
+       }
 }
index 9847ac0..226d91c 100644 (file)
@@ -71,7 +71,7 @@ abstract class ResourceLoaderModule {
         * Get this module's name. This is set when the module is registered
         * with ResourceLoader::register()
         *
-        * @return Mixed: Name (string) or null if no name was set
+        * @return mixed: Name (string) or null if no name was set
         */
        public function getName() {
                return $this->name;
@@ -91,7 +91,7 @@ abstract class ResourceLoaderModule {
         * Get this module's origin. This is set when the module is registered
         * with ResourceLoader::register()
         *
-        * @return Int ResourceLoaderModule class constant, the subclass default
+        * @return int: ResourceLoaderModule class constant, the subclass default
         *     if not set manually
         */
        public function getOrigin() {
@@ -109,7 +109,7 @@ abstract class ResourceLoaderModule {
        }
 
        /**
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @return bool
         */
        public function getFlip( $context ) {
@@ -122,8 +122,8 @@ abstract class ResourceLoaderModule {
         * Get all JS for this module for a given language and skin.
         * Includes all relevant JS except loader scripts.
         *
-        * @param $context ResourceLoaderContext: Context object
-        * @return String: JavaScript code
+        * @param ResourceLoaderContext $context
+        * @return string: JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
                // Stub, override expected
@@ -141,8 +141,8 @@ abstract class ResourceLoaderModule {
         * #2 is important to prevent an infinite loop, therefore this function
         * MUST return either an only= URL or a non-load.php URL.
         *
-        * @param $context ResourceLoaderContext: Context object
-        * @return Array of URLs
+        * @param ResourceLoaderContext $context
+        * @return array: Array of URLs
         */
        public function getScriptURLsForDebug( ResourceLoaderContext $context ) {
                $url = ResourceLoader::makeLoaderURL(
@@ -172,8 +172,8 @@ abstract class ResourceLoaderModule {
        /**
         * Get all CSS for this module for a given skin.
         *
-        * @param $context ResourceLoaderContext: Context object
-        * @return Array: List of CSS strings or array of CSS strings keyed by media type.
+        * @param ResourceLoaderContext $context
+        * @return array: List of CSS strings or array of CSS strings keyed by media type.
         *  like array( 'screen' => '.foo { width: 0 }' );
         *  or array( 'screen' => array( '.foo { width: 0 }' ) );
         */
@@ -188,8 +188,8 @@ abstract class ResourceLoaderModule {
         * the module, but file-based modules will want to override this to
         * load the files directly. See also getScriptURLsForDebug()
         *
-        * @param $context ResourceLoaderContext: Context object
-        * @return Array: array( mediaType => array( URL1, URL2, ... ), ... )
+        * @param ResourceLoaderContext $context
+        * @return array: array( mediaType => array( URL1, URL2, ... ), ... )
         */
        public function getStyleURLsForDebug( ResourceLoaderContext $context ) {
                $url = ResourceLoader::makeLoaderURL(
@@ -211,7 +211,7 @@ abstract class ResourceLoaderModule {
         *
         * To get a JSON blob with messages, use MessageBlobStore::get()
         *
-        * @return Array: List of message keys. Keys may occur more than once
+        * @return array: List of message keys. Keys may occur more than once
         */
        public function getMessages() {
                // Stub, override expected
@@ -221,7 +221,7 @@ abstract class ResourceLoaderModule {
        /**
         * Get the group this module is in.
         *
-        * @return String: Group name
+        * @return string: Group name
         */
        public function getGroup() {
                // Stub, override expected
@@ -231,7 +231,7 @@ abstract class ResourceLoaderModule {
        /**
         * Get the origin of this module. Should only be overridden for foreign modules.
         *
-        * @return String: Origin name, 'local' for local modules
+        * @return string: Origin name, 'local' for local modules
         */
        public function getSource() {
                // Stub, override expected
@@ -263,7 +263,7 @@ abstract class ResourceLoaderModule {
        /**
         * Get the loader JS for this module, if set.
         *
-        * @return Mixed: JavaScript loader code as a string or boolean false if no custom loader set
+        * @return mixed: JavaScript loader code as a string or boolean false if no custom loader set
         */
        public function getLoaderScript() {
                // Stub, override expected
@@ -278,7 +278,7 @@ abstract class ResourceLoaderModule {
         *
         * To add dependencies dynamically on the client side, use a custom
         * loader script, see getLoaderScript()
-        * @return Array: List of module names as strings
+        * @return array: List of module names as strings
         */
        public function getDependencies() {
                // Stub, override expected
@@ -288,7 +288,7 @@ abstract class ResourceLoaderModule {
        /**
         * Get target(s) for the module, eg ['desktop'] or ['desktop', 'mobile']
         *
-        * @return array of strings
+        * @return array: Array of strings
         */
        public function getTargets() {
                return $this->targets;
@@ -299,7 +299,7 @@ abstract class ResourceLoaderModule {
         * Currently these are only image files referenced by the module's CSS.
         *
         * @param string $skin Skin name
-        * @return Array: List of files
+        * @return array: List of files
         */
        public function getFileDependencies( $skin ) {
                // Try in-object cache first
@@ -335,7 +335,7 @@ abstract class ResourceLoaderModule {
         * Get the last modification timestamp of the message blob for this
         * module in a given language.
         * @param string $lang Language code
-        * @return Integer: UNIX timestamp, or 0 if the module doesn't have messages
+        * @return int: UNIX timestamp, or 0 if the module doesn't have messages
         */
        public function getMsgBlobMtime( $lang ) {
                if ( !isset( $this->msgBlobMtime[$lang] ) ) {
@@ -382,8 +382,8 @@ abstract class ResourceLoaderModule {
         * If you want this to happen, you'll need to call getMsgBlobMtime()
         * yourself and take its result into consideration.
         *
-        * @param $context ResourceLoaderContext: Context object
-        * @return Integer: UNIX timestamp
+        * @param ResourceLoaderContext $context
+        * @return int: UNIX timestamp
         */
        public function getModifiedTime( ResourceLoaderContext $context ) {
                // 0 would mean now
@@ -396,8 +396,8 @@ abstract class ResourceLoaderModule {
         * definitely going to be empty, it should override this method to
         * return true in that case. Callers may optimize the request for this
         * module away if this function returns true.
-        * @param $context ResourceLoaderContext: Context object
-        * @return Boolean
+        * @param ResourceLoaderContext $context
+        * @return bool
         */
        public function isKnownEmpty( ResourceLoaderContext $context ) {
                return false;
@@ -407,13 +407,16 @@ abstract class ResourceLoaderModule {
        private static $jsParser;
        private static $parseCacheVersion = 1;
 
+       /** @var array Global LESS variables */
+       private static $lessVars;
+
        /**
         * Validate a given script file; if valid returns the original source.
         * If invalid, returns replacement JS source that throws an exception.
         *
         * @param string $fileName
         * @param string $contents
-        * @return string JS with the original, or a replacement error
+        * @return string: JS with the original, or a replacement error
         */
        protected function validateScriptFile( $fileName, $contents ) {
                global $wgResourceLoaderValidateJS;
@@ -454,6 +457,42 @@ abstract class ResourceLoaderModule {
                return self::$jsParser;
        }
 
+       /**
+        * @return lessc
+        */
+       protected static function lessCompiler() {
+               global $wgResourceLoaderLESSFunctions, $wgResourceLoaderLESSImportPaths;
+
+               $less = new lessc();
+               $less->setPreserveComments( true );
+               $less->setVariables( self::getLESSVars() );
+               $less->setImportDir( $wgResourceLoaderLESSImportPaths );
+               foreach ( $wgResourceLoaderLESSFunctions as $name => $func ) {
+                       $less->registerFunction( $name, $func );
+               }
+               // To ensure embedded images are refreshed when their source files
+               // change, track the names and modification times of image files that
+               // were embedded in the generated CSS source.
+               $less->embeddedImages = array();
+               return $less;
+       }
+
+       /**
+        * Get global LESS variables.
+        *
+        * @return array: Map of variable names to string CSS values.
+        */
+       protected static function getLESSVars() {
+               global $wgResourceLoaderLESSVars;
+
+               if ( self::$lessVars === null ) {
+                       self::$lessVars = $wgResourceLoaderLESSVars;
+                       // Sort by key to ensure consistent hashing for cache lookups.
+                       ksort( self::$lessVars );
+               }
+               return self::$lessVars;
+       }
+
        /**
         * Safe version of filemtime(), which doesn't throw a PHP warning if the file doesn't exist
         * but returns 1 instead.
index 191286d..7185087 100644 (file)
@@ -41,6 +41,19 @@ class RevDel_RevisionList extends RevDel_List {
                return 'rev_id';
        }
 
+       public static function getRestriction() {
+               return 'deleterevision';
+       }
+
+       public static function getRevdelConstant() {
+               return Revision::DELETED_TEXT;
+       }
+
+       public static function suggestTarget( $target, array $ids ) {
+               $rev = Revision::newFromId( $ids[0] );
+               return $rev ? $rev->getTitle() : $target;
+       }
+
        /**
         * @param $db DatabaseBase
         * @return mixed
@@ -441,6 +454,14 @@ class RevDel_FileList extends RevDel_List {
                return 'oi_archive_name';
        }
 
+       public static function getRestriction() {
+               return 'deleterevision';
+       }
+
+       public static function getRevdelConstant() {
+               return File::DELETED_FILE;
+       }
+
        var $storeBatch, $deleteBatch, $cleanupBatch;
 
        /**
@@ -802,6 +823,28 @@ class RevDel_LogList extends RevDel_List {
                return 'log_id';
        }
 
+       public static function getRestriction() {
+               return 'deletelogentry';
+       }
+
+       public static function getRevdelConstant() {
+               return LogPage::DELETED_ACTION;
+       }
+
+       public static function suggestTarget( $target, array $ids ) {
+               $result = wfGetDB( DB_SLAVE )->select( 'logging',
+                       'log_type',
+                       array( 'log_id' => $ids ),
+                       __METHOD__,
+                       array( 'DISTINCT' )
+               );
+               if ( $result->numRows() == 1 ) {
+                       // If there's only one type, the target can be set to include it.
+                       return SpecialPage::getTitleFor( 'Log', $result->current()->log_type );
+               }
+               return SpecialPage::getTitleFor( 'Log' );
+       }
+
        /**
         * @param $db DatabaseBase
         * @return mixed
index 9ace35a..803467e 100644 (file)
@@ -37,12 +37,44 @@ abstract class RevDel_List extends RevisionListBase {
         * Get the DB field name associated with the ID list.
         * This used to populate the log_search table for finding log entries.
         * Override this function.
-        * @return null
+        * @return string|null
         */
        public static function getRelationType() {
                return null;
        }
 
+       /**
+        * Get the user right required for this list type
+        * Override this function.
+        * @since 1.22
+        * @return string|null
+        */
+       public static function getRestriction() {
+               return null;
+       }
+
+       /**
+        * Get the revision deletion constant for this list type
+        * Override this function.
+        * @since 1.22
+        * @return int|null
+        */
+       public static function getRevdelConstant() {
+               return null;
+       }
+
+       /**
+        * Suggest a target for the revision deletion
+        * Optionally override this function.
+        * @since 1.22
+        * @param Title|null $target User-supplied target
+        * @param array $ids
+        * @return Title|null
+        */
+       public static function suggestTarget( $target, array $ids ) {
+               return $target;
+       }
+
        /**
         * Set the visibility for the revisions in this list. Logging and
         * transactions are done here.
@@ -72,7 +104,7 @@ abstract class RevDel_List extends RevisionListBase {
 
                        $oldBits = $item->getBits();
                        // Build the actual new rev_deleted bitfield
-                       $newBits = SpecialRevisionDelete::extractBitfield( $bitPars, $oldBits );
+                       $newBits = RevisionDeleter::extractBitfield( $bitPars, $oldBits );
 
                        if ( $oldBits == $newBits ) {
                                $status->warning( 'revdelete-no-change', $item->formatDate(), $item->formatTime() );
@@ -203,7 +235,7 @@ abstract class RevDel_List extends RevisionListBase {
                // Actually add the deletion log entry
                $log = new LogPage( $logType );
                $logid = $log->addEntry( $this->getLogAction(), $params['title'],
-                       $params['comment'], $logParams );
+                       $params['comment'], $logParams, $this->getUser() );
                // Allow for easy searching of deletion log items for revision/log items
                $log->addRelations( $field, $params['ids'], $logid );
                $log->addRelations( 'target_author_id', $params['authorIds'], $logid );
index 2de19ac..dbcb3d7 100644 (file)
  */
 
 /**
- * Temporary b/c interface, collection of static functions.
- * @ingroup SpecialPage
+ * General controller for RevDel, used by both SpecialRevisiondelete and
+ * ApiRevisionDelete.
  * @ingroup RevisionDelete
  */
 class RevisionDeleter {
+       /** List of known revdel types, with their corresponding list classes */
+       private static $allowedTypes = array(
+               'revision' => 'RevDel_RevisionList',
+               'archive' => 'RevDel_ArchiveList',
+               'oldimage' => 'RevDel_FileList',
+               'filearchive' => 'RevDel_ArchivedFileList',
+               'logging' => 'RevDel_LogList',
+       );
+
+       /** Type map to support old log entries */
+       private static $deprecatedTypeMap = array(
+               'oldid' => 'revision',
+               'artimestamp' => 'archive',
+               'oldimage' => 'oldimage',
+               'fileid' => 'filearchive',
+               'logid' => 'logging',
+       );
+
+       /**
+        * Lists the valid possible types for revision deletion.
+        *
+        * @since 1.22
+        * @return array
+        */
+       public static function getTypes() {
+               return array_keys( self::$allowedTypes );
+       }
+
+       /**
+        * Gets the canonical type name, if any.
+        *
+        * @since 1.22
+        * @param string $typeName
+        * @return string|null
+        */
+       public static function getCanonicalTypeName( $typeName ) {
+               if ( isset( self::$deprecatedTypeMap[$typeName] ) ) {
+                       $typeName = self::$deprecatedTypeMap[$typeName];
+               }
+               return isset( self::$allowedTypes[$typeName] ) ? $typeName : null;
+       }
+
+       /**
+        * Instantiate the appropriate list class for a given list of IDs.
+        *
+        * @since 1.22
+        * @param string $typeName RevDel type, see RevisionDeleter::getTypes()
+        * @param IContextSource $context
+        * @param Title $title
+        * @param array $ids
+        * @return RevDel_List
+        */
+       public static function createList( $typeName, IContextSource $context, Title $title, array $ids ) {
+               $typeName = self::getCanonicalTypeName( $typeName );
+               if ( !$typeName ) {
+                       throw new MWException( __METHOD__ . ": Unknown RevDel type '$typeName'" );
+               }
+               return new self::$allowedTypes[$typeName]( $context, $title, $ids );
+       }
+
        /**
         * Checks for a change in the bitfield for a certain option and updates the
         * provided array accordingly.
@@ -86,20 +146,62 @@ class RevisionDeleter {
        /** Get DB field name for URL param...
         * Future code for other things may also track
         * other types of revision-specific changes.
+        * @param string $typeName
         * @return string One of log_id/rev_id/fa_id/ar_timestamp/oi_archive_name
         */
        public static function getRelationType( $typeName ) {
-               if ( isset( SpecialRevisionDelete::$deprecatedTypeMap[$typeName] ) ) {
-                       $typeName = SpecialRevisionDelete::$deprecatedTypeMap[$typeName];
+               $typeName = self::getCanonicalTypeName( $typeName );
+               if ( !$typeName ) {
+                       return null;
+               }
+               return call_user_func( array( self::$allowedTypes[$typeName], 'getRelationType' ) );
+       }
+
+       /**
+        * Get the user right required for the RevDel type
+        * @since 1.22
+        * @param string $typeName
+        * @return string User right
+        */
+       public static function getRestriction( $typeName ) {
+               $typeName = self::getCanonicalTypeName( $typeName );
+               if ( !$typeName ) {
+                       return null;
                }
-               if ( isset( SpecialRevisionDelete::$allowedTypes[$typeName] ) ) {
-                       $class = SpecialRevisionDelete::$allowedTypes[$typeName]['list-class'];
-                       return call_user_func( array( $class, 'getRelationType' ) );
-               } else {
+               return call_user_func( array( self::$allowedTypes[$typeName], 'getRestriction' ) );
+       }
+
+       /**
+        * Get the revision deletion constant for the RevDel type
+        * @since 1.22
+        * @param string $typeName
+        * @return int RevDel constant
+        */
+       public static function getRevdelConstant( $typeName ) {
+               $typeName = self::getCanonicalTypeName( $typeName );
+               if ( !$typeName ) {
                        return null;
                }
+               return call_user_func( array( self::$allowedTypes[$typeName], 'getRevdelConstant' ) );
        }
 
+       /**
+        * Suggest a target for the revision deletion
+        * @since 1.22
+        * @param string $typeName
+        * @param Title|null $title User-supplied target
+        * @param array $ids
+        * @return Title|null
+        */
+       public static function suggestTarget( $typeName, $target, array $ids ) {
+               $typeName = self::getCanonicalTypeName( $typeName );
+               if ( !$typeName ) {
+                       return $target;
+               }
+               return call_user_func( array( self::$allowedTypes[$typeName], 'suggestTarget' ), $target, $ids );
+       }
+
+
        /**
         * Checks if a revision still exists in the revision table.
         * If it doesn't, returns the corresponding ar_timestamp field
@@ -125,4 +227,24 @@ class RevisionDeleter {
 
                return $timestamp;
        }
+
+       /**
+        * Put together a rev_deleted bitfield
+        * @since 1.22
+        * @param array $bitPars extractBitParams() params
+        * @param int $oldfield current bitfield
+        * @return array
+        */
+       public static function extractBitfield( $bitPars, $oldfield ) {
+               // Build the actual new rev_deleted bitfield
+               $newBits = 0;
+               foreach ( $bitPars as $const => $val ) {
+                       if ( $val == 1 ) {
+                               $newBits |= $const; // $const is the *_deleted const
+                       } elseif ( $val == -1 ) {
+                               $newBits |= ( $oldfield & $const ); // use existing
+                       }
+               }
+               return $newBits;
+       }
 }
index e5925fa..71c05d8 100644 (file)
@@ -877,11 +877,11 @@ class SearchResult {
         * @return String: highlighted text snippet, null (and not '') if not supported
         */
        function getTextSnippet( $terms ) {
-               global $wgUser, $wgAdvancedSearchHighlighting;
+               global $wgAdvancedSearchHighlighting;
                $this->initText();
 
                // TODO: make highliter take a content object. Make ContentHandler a factory for SearchHighliter.
-               list( $contextlines, $contextchars ) = SearchEngine::userHighlightPrefs( $wgUser );
+               list( $contextlines, $contextchars ) = SearchEngine::userHighlightPrefs();
                $h = new SearchHighlighter();
                if ( $wgAdvancedSearchHighlighting ) {
                        return $h->highlightText( $this->mText, $terms, $contextlines, $contextchars );
index 4123805..11141e0 100644 (file)
@@ -188,6 +188,39 @@ class SiteSQLStore implements SiteStore {
                return $site;
        }
 
+       /**
+        * Get a new ORMRow from a Site object
+        *
+        * @since 1.22
+        *
+        * @param Site
+        *
+        * @return ORMRow
+        */
+       protected function getRowFromSite( Site $site ) {
+               $fields = array(
+                       // Site data
+                       'global_key' => $site->getGlobalId(), // TODO: check not null
+                       'type' => $site->getType(),
+                       'group' => $site->getGroup(),
+                       'source' => $site->getSource(),
+                       'language' => $site->getLanguageCode() === null ? '' : $site->getLanguageCode(),
+                       'protocol' => $site->getProtocol(),
+                       'domain' => strrev( $site->getDomain() ) . '.',
+                       'data' => $site->getExtraData(),
+
+                       // Site config
+                       'forward' => $site->shouldForward(),
+                       'config' => $site->getExtraConfig(),
+               );
+
+               if ( $site->getInternalId() !== null ) {
+                       $fields['id'] = $site->getInternalId();
+               }
+
+               return new ORMRow( $this->sitesTable, $fields );
+       }
+
        /**
         * Fetches the site from the database and loads them into the sites field.
         *
@@ -291,28 +324,11 @@ class SiteSQLStore implements SiteStore {
                $localIds = array();
 
                foreach ( $sites as $site ) {
-                       $fields = array(
-                               // Site data
-                               'global_key' => $site->getGlobalId(), // TODO: check not null
-                               'type' => $site->getType(),
-                               'group' => $site->getGroup(),
-                               'source' => $site->getSource(),
-                               'language' => $site->getLanguageCode() === null ? '' : $site->getLanguageCode(),
-                               'protocol' => $site->getProtocol(),
-                               'domain' => strrev( $site->getDomain() ) . '.',
-                               'data' => $site->getExtraData(),
-
-                               // Site config
-                               'forward' => $site->shouldForward(),
-                               'config' => $site->getExtraConfig(),
-                       );
-
                        if ( $site->getInternalId() !== null ) {
-                               $fields['id'] = $site->getInternalId();
                                $internalIds[] = $site->getInternalId();
                        }
 
-                       $siteRow = new ORMRow( $this->sitesTable, $fields );
+                       $siteRow = $this->getRowFromSite( $site );
                        $success = $siteRow->save( __METHOD__ ) && $success;
 
                        foreach ( $site->getLocalIds() as $idType => $ids ) {
index 6ba009a..3b73a37 100644 (file)
@@ -772,7 +772,8 @@ class SpecialBlock extends FormSpecialPage {
                        $logaction,
                        Title::makeTitle( NS_USER, $target ),
                        $data['Reason'][0],
-                       $logParams
+                       $logParams,
+                       $performer
                );
                # Relate log ID to block IDs (bug 25763)
                $blockIds = array_merge( array( $status['id'] ), $status['autoIds'] );
index 0d54bb3..d7d860d 100644 (file)
@@ -478,7 +478,7 @@ class ImportReporter extends ContextSource {
                                if ( $this->reason ) {
                                        $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->reason;
                                }
-                               $log->addEntry( 'upload', $title, $detail );
+                               $log->addEntry( 'upload', $title, $detail, array(), $this->getUser() );
                        } else {
                                $interwiki = '[[:' . $this->mInterwiki . ':' .
                                        $origTitle->getPrefixedText() . ']]';
@@ -487,7 +487,7 @@ class ImportReporter extends ContextSource {
                                if ( $this->reason ) {
                                        $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->reason;
                                }
-                               $log->addEntry( 'interwiki', $title, $detail );
+                               $log->addEntry( 'interwiki', $title, $detail, array(), $this->getUser() );
                        }
 
                        $comment = $detail; // quick
index 2a86fca..fb5ea65 100644 (file)
@@ -417,7 +417,7 @@ class SpecialMergeHistory extends SpecialPage {
                $log = new LogPage( 'merge' );
                $log->addEntry(
                        'merge', $targetTitle, $this->mComment,
-                       array( $destTitle->getPrefixedText(), $timestampLimit )
+                       array( $destTitle->getPrefixedText(), $timestampLimit ), $this->getUser()
                );
 
                $this->getOutput()->addWikiMsg( 'mergehistory-success',
index c4c5c99..28d07ff 100644 (file)
@@ -210,7 +210,8 @@ class SpecialPrefixindex extends SpecialAllpages {
                                        $t = Title::makeTitle( $s->page_namespace, $s->page_title );
                                        if ( $t ) {
                                                $displayed = $t->getText();
-                                               if ( $this->stripPrefix ) {
+                                               // Try not to generate unclickable links
+                                               if ( $this->stripPrefix && $prefixLength !== strlen( $displayed ) ) {
                                                        $displayed = substr( $displayed, $prefixLength );
                                                }
                                                $link = ( $s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
index 1e9adf5..825be6c 100644 (file)
@@ -49,68 +49,43 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        /** Array of checkbox specs (message, name, deletion bits) */
        var $checks;
 
-       /** Information about the current type */
-       var $typeInfo;
+       /** UI Labels about the current type */
+       var $typeLabels;
 
        /** The RevDel_List object, storing the list of items to be deleted/undeleted */
        var $list;
 
        /**
-        * Assorted information about each type, needed by the special page.
-        * TODO Move some of this to the list class
+        * UI labels for each type.
         */
-       static $allowedTypes = array(
+       static $UILabels = array(
                'revision' => array(
                        'check-label'   => 'revdelete-hide-text',
-                       'deletion-bits' => Revision::DELETED_TEXT,
                        'success'               => 'revdelete-success',
                        'failure'               => 'revdelete-failure',
-                       'list-class'    => 'RevDel_RevisionList',
-                       'permission'    => 'deleterevision',
                ),
                'archive' => array(
                        'check-label'   => 'revdelete-hide-text',
-                       'deletion-bits' => Revision::DELETED_TEXT,
                        'success'               => 'revdelete-success',
                        'failure'               => 'revdelete-failure',
-                       'list-class'    => 'RevDel_ArchiveList',
-                       'permission'    => 'deleterevision',
                ),
                'oldimage' => array(
                        'check-label'   => 'revdelete-hide-image',
-                       'deletion-bits' => File::DELETED_FILE,
                        'success'               => 'revdelete-success',
                        'failure'               => 'revdelete-failure',
-                       'list-class'    => 'RevDel_FileList',
-                       'permission'    => 'deleterevision',
                ),
                'filearchive' => array(
                        'check-label'   => 'revdelete-hide-image',
-                       'deletion-bits' => File::DELETED_FILE,
                        'success'               => 'revdelete-success',
                        'failure'               => 'revdelete-failure',
-                       'list-class'    => 'RevDel_ArchivedFileList',
-                       'permission'    => 'deleterevision',
                ),
                'logging' => array(
                        'check-label'   => 'revdelete-hide-name',
-                       'deletion-bits' => LogPage::DELETED_ACTION,
                        'success'               => 'logdelete-success',
                        'failure'               => 'logdelete-failure',
-                       'list-class'    => 'RevDel_LogList',
-                       'permission'    => 'deletelogentry',
                ),
        );
 
-       /** Type map to support old log entries */
-       static $deprecatedTypeMap = array(
-               'oldid' => 'revision',
-               'artimestamp' => 'archive',
-               'oldimage' => 'oldimage',
-               'fileid' => 'filearchive',
-               'logid' => 'logging',
-       );
-
        public function __construct() {
                parent::__construct( 'Revisiondelete', 'deletedhistory' );
        }
@@ -147,19 +122,6 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                } else {
                        $this->typeName = $request->getVal( 'type' );
                        $this->targetObj = Title::newFromText( $request->getText( 'target' ) );
-                       if ( $this->targetObj && $this->targetObj->isSpecial( 'Log' ) && count( $this->ids ) !== 0 ) {
-                               $result = wfGetDB( DB_SLAVE )->select( 'logging',
-                                       'log_type',
-                                       array( 'log_id' => $this->ids ),
-                                       __METHOD__,
-                                       array( 'DISTINCT' )
-                               );
-
-                               if ( $result->numRows() == 1 ) {
-                                       // If there's only one type, the target can be set to include it.
-                                       $this->targetObj = SpecialPage::getTitleFor( 'Log', $result->current()->log_type );
-                               }
-                       }
                }
 
                # For reviewing deleted files...
@@ -170,24 +132,17 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        return;
                }
 
-               if ( isset( self::$deprecatedTypeMap[$this->typeName] ) ) {
-                       $this->typeName = self::$deprecatedTypeMap[$this->typeName];
-               }
+               $this->typeName = RevisionDeleter::getCanonicalTypeName( $this->typeName );
 
                # No targets?
-               if ( !isset( self::$allowedTypes[$this->typeName] ) || count( $this->ids ) == 0 ) {
+               if ( !$this->typeName || count( $this->ids ) == 0 ) {
                        throw new ErrorPageError( 'revdelete-nooldid-title', 'revdelete-nooldid-text' );
                }
-               $this->typeInfo = self::$allowedTypes[$this->typeName];
-               $this->mIsAllowed = $user->isAllowed( $this->typeInfo['permission'] );
-
-               # If we have revisions, get the title from the first one
-               # since they should all be from the same page. This allows
-               # for more flexibility with page moves...
-               if ( $this->typeName == 'revision' ) {
-                       $rev = Revision::newFromId( $this->ids[0] );
-                       $this->targetObj = $rev ? $rev->getTitle() : $this->targetObj;
-               }
+               $this->typeLabels = self::$UILabels[$this->typeName];
+               $this->mIsAllowed = $user->isAllowed( RevisionDeleter::getRestriction( $this->typeName ) );
+
+               # Allow the list type to adjust the passed target
+               $this->targetObj = RevisionDeleter::suggestTarget( $this->typeName, $this->targetObj, $this->ids );
 
                $this->otherReason = $request->getVal( 'wpReason' );
                # We need a target page!
@@ -200,7 +155,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 
                # Initialise checkboxes
                $this->checks = array(
-                       array( $this->typeInfo['check-label'], 'wpHidePrimary', $this->typeInfo['deletion-bits'] ),
+                       array( $this->typeLabels['check-label'], 'wpHidePrimary',
+                               RevisionDeleter::getRevdelConstant( $this->typeName )
+                       ),
                        array( 'revdelete-hide-comment', 'wpHideComment', Revision::DELETED_COMMENT ),
                        array( 'revdelete-hide-user', 'wpHideUser', Revision::DELETED_USER )
                );
@@ -343,8 +300,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
         */
        protected function getList() {
                if ( is_null( $this->list ) ) {
-                       $class = $this->typeInfo['list-class'];
-                       $this->list = new $class( $this->getContext(), $this->targetObj, $this->ids );
+                       $this->list = RevisionDeleter::createList(
+                               $this->typeName, $this->getContext(), $this->targetObj, $this->ids
+                       );
                }
                return $this->list;
        }
@@ -561,7 +519,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
         */
        protected function success() {
                $this->getOutput()->setPageTitle( $this->msg( 'actioncomplete' ) );
-               $this->getOutput()->wrapWikiMsg( "<span class=\"success\">\n$1\n</span>", $this->typeInfo['success'] );
+               $this->getOutput()->wrapWikiMsg( "<span class=\"success\">\n$1\n</span>", $this->typeLabels['success'] );
                $this->list->reloadFromMaster();
                $this->showForm();
        }
@@ -571,7 +529,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
         */
        protected function failure( $status ) {
                $this->getOutput()->setPageTitle( $this->msg( 'actionfailed' ) );
-               $this->getOutput()->addWikiText( $status->getWikiText( $this->typeInfo['failure'] ) );
+               $this->getOutput()->addWikiText( $status->getWikiText( $this->typeLabels['failure'] ) );
                $this->showForm();
        }
 
@@ -598,21 +556,13 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 
        /**
         * Put together a rev_deleted bitfield
+        * @deprecated since 1.22, use RevisionDeleter::extractBitfield instead
         * @param array $bitPars extractBitParams() params
         * @param int $oldfield current bitfield
         * @return array
         */
        public static function extractBitfield( $bitPars, $oldfield ) {
-               // Build the actual new rev_deleted bitfield
-               $newBits = 0;
-               foreach ( $bitPars as $const => $val ) {
-                       if ( $val == 1 ) {
-                               $newBits |= $const; // $const is the *_deleted const
-                       } elseif ( $val == -1 ) {
-                               $newBits |= ( $oldfield & $const ); // use existing
-                       }
-               }
-               return $newBits;
+               return RevisionDeleter::extractBitfield( $bitPars, $oldfield );
        }
 
        /**
index 6a282c9..80c38d5 100644 (file)
@@ -46,28 +46,15 @@ class SpecialTags extends SpecialPage {
                                Xml::tags( 'th', null, $this->msg( 'tags-description-header' )->parse() ) .
                                Xml::tags( 'th', null, $this->msg( 'tags-hitcount-header' )->parse() )
                        );
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'change_tag', array( 'ct_tag', 'hitcount' => 'count(*)' ),
-                       array(), __METHOD__, array( 'GROUP BY' => 'ct_tag', 'ORDER BY' => 'hitcount DESC' ) );
 
-               foreach ( $res as $row ) {
-                       $html .= $this->doTagRow( $row->ct_tag, $row->hitcount );
-               }
-
-               foreach ( ChangeTags::listDefinedTags() as $tag ) {
-                       $html .= $this->doTagRow( $tag, 0 );
+               foreach ( ChangeTags::tagUsageStatistics() as $tag => $hitcount ) {
+                       $html .= $this->doTagRow( $tag, $hitcount );
                }
 
                $out->addHTML( Xml::tags( 'table', array( 'class' => 'wikitable sortable mw-tags-table' ), $html ) );
        }
 
        function doTagRow( $tag, $hitcount ) {
-               static $doneTags = array();
-
-               if ( in_array( $tag, $doneTags ) ) {
-                       return '';
-               }
-
                $user = $this->getUser();
                $newRow = '';
                $newRow .= Xml::tags( 'td', null, Xml::element( 'code', null, $tag ) );
@@ -94,8 +81,6 @@ class SpecialTags extends SpecialPage {
                // add raw $hitcount for sorting, because tags-hitcount contains numbers and letters
                $newRow .= Xml::tags( 'td', array( 'data-sort-value' => $hitcount ), $hitcountLink );
 
-               $doneTags[] = $tag;
-
                return Xml::tags( 'tr', null, $newRow ) . "\n";
        }
 
index 4da5155..ca93b6d 100644 (file)
@@ -211,7 +211,7 @@ class SpecialUnblock extends SpecialPage {
 
                # Make log entry
                $log = new LogPage( 'block' );
-               $log->addEntry( 'unblock', $page, $data['Reason'] );
+               $log->addEntry( 'unblock', $page, $data['Reason'], array(), $performer );
 
                return true;
        }
index 263ec3a..985de80 100644 (file)
@@ -93,7 +93,6 @@ class SpecialUpload extends SpecialPage {
                if ( !$this->mDesiredDestName && $request->getFileName( 'wpUploadFile' ) !== null ) {
                        $this->mDesiredDestName = $request->getFileName( 'wpUploadFile' );
                }
-               $this->mComment = $request->getText( 'wpUploadDescription' );
                $this->mLicense = $request->getText( 'wpLicense' );
 
                $this->mDestWarningAck = $request->getText( 'wpDestFileWarningAck' );
@@ -104,6 +103,14 @@ class SpecialUpload extends SpecialPage {
                $this->mCopyrightSource = $request->getText( 'wpUploadSource' );
 
                $this->mForReUpload = $request->getBool( 'wpForReUpload' ); // updating a file
+
+               $commentDefault = '';
+               $commentMsg = wfMessage( 'upload-default-description' )->inContentLanguage();
+               if ( !$this->mForReUpload && !$commentMsg->isDisabled() ) {
+                       $commentDefault = $commentMsg->plain();
+               }
+               $this->mComment = $request->getText( 'wpUploadDescription', $commentDefault );
+
                $this->mCancelUpload = $request->getCheck( 'wpCancelUpload' )
                        || $request->getCheck( 'wpReUpload' ); // b/w compat
 
index e7f36ee..002e949 100644 (file)
@@ -134,8 +134,13 @@ class SpecialUploadStash extends UnlistedSpecialPage {
                        $paramString = substr( $thumbPart, 0, $srcNamePos - 1 );
 
                        $handler = $file->getHandler();
-                       $params = $handler->parseParamString( $paramString );
-                       return array( 'file' => $file, 'type' => $type, 'params' => $params );
+                       if ( $handler ) {
+                               $params = $handler->parseParamString( $paramString );
+                               return array( 'file' => $file, 'type' => $type, 'params' => $params );
+                       } else {
+                               throw new UploadStashBadPathException( 'No handler found for ' .
+                                               "mime {$file->getMimeType()} of file {$file->getPath()}" );
+                       }
                }
 
                return array( 'file' => $file, 'type' => $type );
index 86639a3..20bef5d 100644 (file)
@@ -30,10 +30,6 @@ if ( !defined( 'MEDIAWIKI' ) ) {
        exit( 1 );
 }
 
-# Read language names
-global $wgLanguageNames;
-require_once __DIR__ . '/Names.php';
-
 if ( function_exists( 'mb_strtoupper' ) ) {
        mb_internal_encoding( 'UTF-8' );
 }
@@ -232,7 +228,7 @@ class Language {
                // Check if there is a language class for the code
                $class = self::classFromCode( $code );
                self::preloadLanguageClass( $class );
-               if ( MWInit::classExists( $class ) ) {
+               if ( class_exists( $class ) ) {
                        $lang = new $class;
                        return $lang;
                }
@@ -246,7 +242,7 @@ class Language {
 
                        $class = self::classFromCode( $fallbackCode );
                        self::preloadLanguageClass( $class );
-                       if ( MWInit::classExists( $class ) ) {
+                       if ( class_exists( $class ) ) {
                                $lang = Language::newFromCode( $fallbackCode );
                                $lang->setCode( $code );
                                return $lang;
@@ -396,7 +392,8 @@ class Language {
                }
 
                if ( $coreLanguageNames === null ) {
-                       include MWInit::compiledPath( 'languages/Names.php' );
+                       global $IP;
+                       include "$IP/languages/Names.php";
                }
 
                if ( isset( $coreLanguageNames[$tag] )
@@ -878,7 +875,8 @@ class Language {
                static $coreLanguageNames;
 
                if ( $coreLanguageNames === null ) {
-                       include MWInit::compiledPath( 'languages/Names.php' );
+                       global $IP;
+                       include "$IP/languages/Names.php";
                }
 
                $names = array();
@@ -2290,6 +2288,8 @@ class Language {
                        // Timestamp within the past week: show the day of the week and time
                        $format = $this->getDateFormatString( 'time', $user->getDatePreference() ?: 'default' );
                        $weekday = self::$mWeekdayMsgs[$ts->timestamp->format( 'w' )];
+                       // Messages:
+                       // sunday-at, monday-at, tuesday-at, wednesday-at, thursday-at, friday-at, saturday-at
                        $ts = wfMessage( "$weekday-at" )
                                ->inLanguage( $this )
                                ->params( $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) ) )
index 39bdfb5..0e2d8b4 100644 (file)
@@ -114,30 +114,6 @@ class LanguageEo extends Language {
                return strtr( $matches[1], $xu ) . strtr( $matches[2], $xu );
        }
 
-       /**
-        * @param $s string
-        * @return string
-        */
-       function checkTitleEncoding( $s ) {
-               # Check for X-system backwards-compatibility URLs
-               $ishigh = preg_match( '/[\x80-\xff]/', $s );
-               $isutf = preg_match( '/^([\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
-                       '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
-
-               if ( $ishigh and !$isutf ) {
-                       # Assume Latin1
-                       $s = utf8_encode( $s );
-               } elseif ( preg_match( '/(\xc4[\x88\x89\x9c\x9d\xa4\xa5\xb4\xb5]' .
-                               '|\xc5[\x9c\x9d\xac\xad])/', $s )
-               ) {
-                       return $s;
-               }
-
-               // if( preg_match( '/[cghjsu]x/i', $s ) )
-               //      return $this->iconv( 'x', 'utf-8', $s );
-               return $s;
-       }
-
        function initEncoding() {
                global $wgEditEncoding;
                $wgEditEncoding = 'x';
index fed3ead..d2ae272 100644 (file)
@@ -19,6 +19,7 @@
  * @author Purodha
  * @author Reedy
  * @author SPQRobin
+ * @author Servien
  * @author Shirayuki
  * @author Spacebirdy
  * @author Xethron
@@ -352,7 +353,7 @@ $messages = array(
 'newwindow' => '(verskyn in nuwe venster)',
 'cancel' => 'Kanselleer',
 'moredotdotdot' => 'Meer…',
-'morenotlisted' => 'Meer nie gelys nie...',
+'morenotlisted' => 'Die lys is nie volledig nie.',
 'mypage' => 'Gebruikersblad',
 'mytalk' => 'Bespreking',
 'anontalk' => 'Besprekingsblad vir hierdie IP',
@@ -538,6 +539,10 @@ Dit kan ook dui op 'n fout in die sagteware van {{SITENAME}}.",
 # General errors
 'error' => 'Fout',
 'databaseerror' => 'Databasisfout',
+'databaseerror-textcl' => "'n Databasis-versoek het gefaal.",
+'databaseerror-query' => 'SQL-versoek:',
+'databaseerror-function' => 'Funksie: $1',
+'databaseerror-error' => 'Fout: $1',
 'laggedslavemode' => 'Waarskuwing: Onlangse wysigings dalk nie in bladsy vervat nie.',
 'readonly' => 'Databasis gesluit',
 'enterlockreason' => 'Rede vir die sluiting,
@@ -820,6 +825,9 @@ Tydelike wagwoord: $2',
 'changeemail-submit' => 'Wysig E-posadres',
 'changeemail-cancel' => 'Kanselleer',
 
+# Special:ResetTokens
+'resettokens-token-label' => '$1 (huidige waarde: $2)',
+
 # Edit page toolbar
 'bold_sample' => 'Vetgedrukte teks',
 'bold_tip' => 'Vetdruk',
@@ -1403,9 +1411,9 @@ Die tildes word in u handtekening omgeskakel en die datum en tyd word insluit.',
 'badsiglength' => 'U handtekening is te lank.
 Dit mag nie meer as $1 {{PLURAL:$1|karakter|karakters}} bevat nie.',
 'yourgender' => 'Geslag:',
-'gender-unknown' => 'Nie gespesifiseer',
-'gender-male' => 'Man',
-'gender-female' => 'Vrou',
+'gender-unknown' => 'Ek wil nie sê nie',
+'gender-male' => 'Hy bewerk wikiblaaie',
+'gender-female' => 'Sy bewerk wikiblaaie',
 'prefs-help-gender' => 'Opsioneel: dit word gebruik om gebruikers korrek aan te spreek in die sagteware.
 Die inligting is vir ander gebruikers sigbaar.',
 'email' => 'E-pos',
@@ -1566,7 +1574,7 @@ As u dit verskaf, sal dit gebruik word om erkenning vir u werk te gee.',
 'action-edit' => 'hierdie bladsy te wysig nie',
 'action-createpage' => 'skep bladsye',
 'action-createtalk' => 'skep besprekingsblaaie',
-'action-createaccount' => 'skep die genruiker',
+'action-createaccount' => 'skep die gebruiker',
 'action-minoredit' => "merk die wysiging as 'n klein verandering",
 'action-move' => 'skuif die bladsy',
 'action-move-subpages' => 'skuif die bladsy met sy subbladsye',
@@ -1604,6 +1612,8 @@ As u dit verskaf, sal dit gebruik word om erkenning vir u werk te gee.',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|wysiging|wysigings}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sedert u laaste besoek}}',
+'enhancedrc-history' => 'geskiedenis',
 'recentchanges' => 'Onlangse wysigings',
 'recentchanges-legend' => 'Opsies vir onlangse wysigings',
 'recentchanges-summary' => 'Volg die mees onlangse wysigings aan die wiki op die bladsy.',
@@ -1635,7 +1645,7 @@ As u dit verskaf, sal dit gebruik word om erkenning vir u werk te gee.',
 'rc_categories_any' => 'Enige',
 'rc-change-size-new' => '$1 {{PLURAL:$1|greep|grepe}} na die wysiging',
 'newsectionsummary' => '/* $1 */ nuwe afdeling',
-'rc-enhanced-expand' => 'Wys details (benodig JavaScript)',
+'rc-enhanced-expand' => 'Wys details',
 'rc-enhanced-hide' => 'Steek details weg',
 'rc-old-title' => 'oorspronklik geskep as "$1"',
 
@@ -1917,6 +1927,8 @@ Kliek op die opskrifte om die tabel te hersorteer.',
 'listfiles_size' => 'Grootte',
 'listfiles_description' => 'Beskrywing',
 'listfiles_count' => 'Weergawes',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nee',
 
 # File description page
 'file-anchor-link' => 'Lêer',
@@ -2011,6 +2023,9 @@ Miskien wil u eerder die beskrywing daar op die [$2 lêerbeskrywing] bywerk.',
 'randompage' => 'Lukrake bladsy',
 'randompage-nopages' => 'Daar is geen bladsye in die volgende {{PLURAL:$2|naamruimte|naamruimtes}} nie: $1.',
 
+# Random page in category
+'randomincategory-selectcategory-submit' => 'Gaan',
+
 # Random redirect
 'randomredirect' => 'Lukrake aanstuur',
 'randomredirect-nopages' => 'Daar is geen aansture in naamruimte "$1" nie.',
index ed24b23..983e701 100644 (file)
@@ -17,6 +17,7 @@
  * @author Alnokta
  * @author Antime
  * @author Arjanizary
+ * @author Asaifm
  * @author Avocato
  * @author Bachounda
  * @author Bassem JARKAS
@@ -482,8 +483,8 @@ $messages = array(
 'tog-extendwatchlist' => 'مدد قائمة المراقبة لتعرض كل التغييرات، وليس أحدثها فقط',
 'tog-usenewrc' => 'جمّع التغييرات حسب الصفحة في أحدث التغييرات وقائمة المراقبة (يتطلب جافاسكربت)',
 'tog-numberheadings' => 'رقّم العناوين تلقائيًا',
-'tog-showtoolbar' => 'أظهر شريط التحرير (يتطلب جافاسكربت)',
-'tog-editondblclick' => 'تحرير الصفحات بالنقر المزدوج (جافاسكربت)',
+'tog-showtoolbar' => 'أظهر شريط التحرير',
+'tog-editondblclick' => 'تحرير الصفحات بالنقر المزدوج',
 'tog-editsection' => 'مكن تحرير الأقسام بروابط [عدل]',
 'tog-editsectiononrightclick' => 'فعِّل تحرير الأقسام بالنقر باليمين على عناوين الأقسام (يتطلب جافاسكريبت)',
 'tog-showtoc' => 'اعرض فهرس المحتويات (للصفحات التي تحتوي على أكثر من 3 عناوين)',
@@ -503,7 +504,7 @@ $messages = array(
 'tog-shownumberswatching' => 'اعرض عدد المستخدمين المراقبِين',
 'tog-oldsig' => 'التوقيع الحالي:',
 'tog-fancysig' => 'عامل التوقيع كنصّ ويكي (بلا رابط تلقائي)',
-'tog-uselivepreview' => 'استخدÙ\85 Ø§Ù\84Ù\85عاÙ\8aÙ\86Ø© Ø§Ù\84سرÙ\8aعة (تتطÙ\84ب Ø¬Ø§Ù\81اسÙ\83رÙ\8aبت) (تجريبية)',
+'tog-uselivepreview' => 'إستخدÙ\85 Ø§Ù\84Ù\85عاÙ\8aÙ\86Ø© Ø§Ù\84Ø­Ù\8aØ©(تجريبية)',
 'tog-forceeditsummary' => 'نبهني عند إدخال ملخص تحرير فارغ',
 'tog-watchlisthideown' => 'أخف تحريراتي من قائمة المراقبة',
 'tog-watchlisthidebots' => 'أخف تحريرات الروبوتات من قائمة المراقبة',
@@ -596,10 +597,10 @@ $messages = array(
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|بلا تصنيف|تصنيف|تصنيفان|تصنيفات}}',
-'category_header' => 'اÙ\84صÙ\81حات Ù\81Ù\8a Ø§Ù\84تصنيف "$1"',
+'category_header' => 'صÙ\81حات تصنيف "$1"',
 'subcategories' => 'تصنيفات فرعية',
-'category-media-header' => 'الوسائط في التصنيف "$1"',
-'category-empty' => "''هذا التصنيف لا يحتوي حاليا على صفحات و لا وسائط.''",
+'category-media-header' => 'ملفات تصنيف "$1"',
+'category-empty' => 'هذا التصنيف لا يحتوي حاليا على صفحات أو ملفات.',
 'hidden-categories' => '{{PLURAL:$1|لا تصنيفات مخفية|تصنيف مخفي|تصنيفان مخفيان|تصنيفات مخفية}}',
 'hidden-category-category' => 'تصنيفات مخفية',
 'category-subcat-count' => '{{PLURAL:$2|هذا التصنيف يحوي التصنيف الفرعي التالي|هذا التصنيف يحوي {{PLURAL:$1||التصنيف الفرعي|تصنيفين فرعيين|$1 تصنيفات فرعية}}، من إجمالي $2.}}',
@@ -618,7 +619,7 @@ $messages = array(
 'newwindow' => '(تفتح في نافذة جديدة)',
 'cancel' => 'ألغِ',
 'moredotdotdot' => 'المزيد...',
-'morenotlisted' => 'Ù\8aÙ\88جد Ø§Ù\84Ù\85زÙ\8aد ØºÙ\8aر Ù\85سرÙ\88د...',
+'morenotlisted' => 'Ù\87Ø°Ù\87 Ø§Ù\84Ù\82ائÙ\85Ø© ØºÙ\8aر Ù\85Ù\83تÙ\85Ù\84Ø©.',
 'mypage' => 'صفحة',
 'mytalk' => 'نقاش',
 'anontalk' => 'نقاش عنوان آي‌بي هذا',
@@ -806,6 +807,11 @@ $1',
 # General errors
 'error' => 'عطل',
 'databaseerror' => 'عطل في قاعدة البيانات',
+'databaseerror-text' => 'حدث خطأ في إستعلام قاعدة البيانات. قد يشير هذا إلى خطأ في البرنامج.',
+'databaseerror-textcl' => 'حدث خطأ في إستعلام قاعدة البيانات.',
+'databaseerror-query' => 'إستعلام: $1',
+'databaseerror-function' => 'دالة: $1',
+'databaseerror-error' => 'خطأ: $1',
 'laggedslavemode' => "'''تحذير:''' الصفحة قد لا تحتوي على أحدث التحديثات.",
 'readonly' => 'قاعدة البيانات مقفلة',
 'enterlockreason' => 'أدخل سببا للقفل ذاكرا تقديرا لوقت إزالة الغلق',
@@ -1278,8 +1284,7 @@ $2
 الإداري الذي أغلقها أعطى هذا التفسير: $1",
 'protectedpagewarning' => "'''تحذير: تمت حماية هذه الصفحة حتى يمكن للمستخدمين ذوي الصلاحيات الإدارية فقط تعديلها.'''
 آخر مدخلة سجل موفرة بالأسفل كمرجع:",
-'semiprotectedpagewarning' => "'''ملاحظة:''' تمت حماية هذه الصفحة بحيث يمكن للمستخدمين المسجلين فقط تعديلها.
-آخر مدخلة سجل موفرة بالأسفل كمرجع:",
+'semiprotectedpagewarning' => "'''ملاحظة:''' هذه الصفحة محمية بحيث يمكن للمستخدمين المسجلين وحدهم تعديلها.",
 'cascadeprotectedwarning' => "'''تحذير:''' تمت حماية هذه الصفحة بحيث يستطيع المستخدمون ذوو الصلاحيات الإدارية فقط تعديلها، وذلك لأنها مدمجة في {{PLURAL:\$1||الصفحة التالية والتي تمت حمايتها|الصفحتين التاليتين واللتين تمت حمايتها|الصفحات التالية والتي تمت حمايتها}} بخاصية \"حماية الصفحات المدمجة\":",
 'titleprotectedwarning' => "'''تحذير:  هذه الصفحة تمت حمايتها بحيث أن [[Special:ListGroupRights|صلاحيات معينة]] مطلوبة لإنشائها.'''
 آخر مدخلة سجل موفرة بالأسفل كمرجع:",
@@ -1386,7 +1391,7 @@ $2
 'histfirst' => 'الأقدم',
 'histlast' => 'الأحدث',
 'historysize' => '({{PLURAL:$1|1 بايت|$1 بايت}})',
-'historyempty' => '(فارغ)',
+'historyempty' => '(فارغة)',
 
 # Revision feed
 'history-feed-title' => 'تاريخ المراجعة',
@@ -1641,7 +1646,7 @@ $1",
 'prefs-rendering' => 'المظهر',
 'saveprefs' => 'احفظ',
 'resetprefs' => 'أزل التغييرات غير المحفوظة',
-'restoreprefs' => 'استرجع كل الإعدادات الافتراضية',
+'restoreprefs' => 'Ø¥سترجع كل الإعدادات الافتراضية',
 'prefs-editing' => 'التحرير',
 'rows' => 'صفوف:',
 'columns' => 'أعمدة:',
@@ -1729,6 +1734,7 @@ $1",
 'prefs-displaywatchlist' => 'خصائص العرض',
 'prefs-tokenwatchlist' => 'مفتاح',
 'prefs-diffs' => 'فروقات',
+'prefs-help-prefershttps' => 'سيتم تفعيل هذا التفضيل عند ولوجوك في المرة القادمة.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'يبدو أن عنوان البريد الإلكتروني صالح',
@@ -1831,6 +1837,8 @@ $1",
 'right-editmyusercss' => 'تعديل ملفات CSS للمستخدم نفسه',
 'right-editmyuserjs' => 'تعديل ملفات جافاسكربت للمستخدم نفسه',
 'right-viewmywatchlist' => 'عرض قائمة مراقبتك',
+'right-viewmyprivateinfo' => 'إستعرض بياناتك الشخصية (مثل البريد الإلكتروني والإسم الحقيقي)',
+'right-editmyprivateinfo' => 'حرر بياناتك الشخصية (مثل البريد الإلكتروني والإسم الحقيقي)',
 'right-editmyoptions' => 'تعديل تفضيلاتك',
 'right-rollback' => 'استرجاع تعديلات آخر مستخدم عدل صفحة معينة سريعا',
 'right-markbotedits' => 'التعليم على تعديلات الاسترجاع كتعديلات بوت',
@@ -1900,6 +1908,7 @@ $1",
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|منذ الزيارة الأخيرة}}',
 'enhancedrc-history' => 'تاريخ',
 'recentchanges' => 'أحدث التغييرات',
 'recentchanges-legend' => 'خيارات أحدث التغييرات',
@@ -1932,7 +1941,7 @@ $1",
 'rc_categories_any' => 'أي',
 'rc-change-size-new' => '$1 {{PLURAL:$1|بايت|بايت}} بعد التغيير',
 'newsectionsummary' => '/* $1 */ قسم جديد',
-'rc-enhanced-expand' => 'عرض التفاصيل (يتطلب جافاسكريبت)',
+'rc-enhanced-expand' => 'عرض التفاصيل',
 'rc-enhanced-hide' => 'أخفِ التفاصيل',
 'rc-old-title' => 'تم إنشاؤها أصلا ك"$1"',
 
@@ -2204,8 +2213,7 @@ $1',
 'upload_source_file' => ' (ملف على حاسوبك)',
 
 # Special:ListFiles
-'listfiles-summary' => 'هذه الصفحة الخاصة تعرض كل الملفات المرفوعة.
-عندما ترشحها حسب المستخدم ستعرض فقط الملفات التي رفع آخر نسخة منها ذلك المستخدم.',
+'listfiles-summary' => 'هذه الصفحة الخاصة تعرض كل الملفات المرفوعة.',
 'listfiles_search_for' => 'ابحث عن اسم الميديا:',
 'imgfile' => 'ملف',
 'listfiles' => 'قائمة الملفات',
@@ -2216,6 +2224,10 @@ $1',
 'listfiles_size' => 'الحجم',
 'listfiles_description' => 'الوصف',
 'listfiles_count' => 'نسخ',
+'listfiles-show-all' => 'أدرج النسخ القديمة من الصور',
+'listfiles-latestversion' => 'النسخة الحالية',
+'listfiles-latestversion-yes' => 'نعم',
+'listfiles-latestversion-no' => 'لا',
 
 # File description page
 'file-anchor-link' => 'ملف',
@@ -2318,6 +2330,7 @@ $1',
 # Random page in category
 'randomincategory' => 'صفحة عشوائية في التصنيف',
 'randomincategory-invalidcategory' => '"$1" ليس اسم تصنيف صالح.',
+'randomincategory-nopages' => 'لا توجد صفحات في التصنيف [[:Category:$1|$1]].',
 'randomincategory-selectcategory' => 'عرض صفحة عشوائية من التصنيف:  $1   $2',
 'randomincategory-selectcategory-submit' => 'اذهب',
 
@@ -2512,7 +2525,7 @@ $1',
 'linksearch-error' => 'الكروت الخاصة يمكن أن تظهر فقط في بداية اسم المضيف.',
 
 # Special:ListUsers
-'listusersfrom' => 'اعرض Ø§Ù\84Ù\85ستخدÙ\85Ù\8aÙ\86 Ø¨Ø¯Ø¡Ø§Ù\8b من:',
+'listusersfrom' => 'اعرض Ø§Ù\84Ù\85ستخدÙ\85Ù\8aÙ\86 Ø§Ø¨ØªØ¯Ø§Ø¡ من:',
 'listusers-submit' => 'اعرض',
 'listusers-noresult' => 'لم يتم إيجاد مستخدم.',
 'listusers-blocked' => '(ممنوع)',
@@ -2727,7 +2740,7 @@ $UNWATCHURL
 'protectlogtext' => 'بالأسفل قائمة بالتغييرات في حماية الصفحات.
 انظر [[Special:ProtectedPages|قائمة الصفحات المحمية]] لقائمة بعمليات حماية الصفحات المفعلة حاليا.',
 'protectedarticle' => 'حمى "[[$1]]"',
-'modifiedarticleprotection' => 'غÙ\8aر Ù\85ستÙ\88Ù\89 Ø§Ù\84Ø­Ù\85اÙ\8aØ© Ù\84"[[$1]]"',
+'modifiedarticleprotection' => 'غÙ\8aر Ù\85ستÙ\88Ù\89 Ø­Ù\85اÙ\8aØ© "[[$1]]"',
 'unprotectedarticle' => 'أزال الحماية من "[[$1]]"',
 'movedarticleprotection' => 'نقل إعدادات الحماية من "[[$2]]" إلى "[[$1]]"',
 'protect-title' => 'ضبط مستوى الحماية ل"$1"',
@@ -4365,8 +4378,8 @@ $5
 'compare-selector' => 'قارن مراجعات الصفحة',
 'compare-page1' => 'صفحة 1',
 'compare-page2' => 'صفحة 2',
-'compare-rev1' => 'Ù\85راجعة 1',
-'compare-rev2' => 'Ù\85راجعة 2',
+'compare-rev1' => 'Ù\86سخة 1',
+'compare-rev2' => 'Ù\86سخة 2',
 'compare-submit' => 'قارن',
 'compare-invalid-title' => 'العنوان الذي حددته غير متاح.',
 'compare-title-not-exists' => 'العنوان الذي حددته غير موجود.',
@@ -4377,6 +4390,7 @@ $5
 'dberr-problems' => 'عذرا! هذا الموقع يعاني من صعوبات تقنية.',
 'dberr-again' => 'جرب الانتظار بضع دقائق وإعادة التحميل.',
 'dberr-info' => '(غير قادر على الاتصال بخادوم قاعدة البيانات: $1)',
+'dberr-info-hidden' => '(لا يمكن الإتصال بخادم قاعدة البيانات)',
 'dberr-usegoogle' => 'يمكنك محاولة البحث من خلال جوجل في الوقت الحاضر.',
 'dberr-outofdate' => 'لاحظ أن فهارسهم لمحتوانا ربما تكون غير محدثة.',
 'dberr-cachederror' => 'التالي نسخة مخزنة من الصفحة المطلوبة، وربما لا تكون محدثة.',
@@ -4513,7 +4527,11 @@ $5
 'rotate-comment' => 'تدوير الصورة  {{PLURAL:$1||درجة واحدة|درجتان|$1 درجات|$1 درجة}} باتجاه عقارب الساعة',
 
 # Limit report
+'limitreport-cputime' => 'بيانات إستخدام وحدة المعالجة المركزية',
 'limitreport-cputime-value' => '{{PLURAL:$1|أقل من ثانية|ثانية واحدة|ثانيتان|$1 ثوانٍ|$1 ثانية}}',
+'limitreport-walltime' => 'بيانات الإستخدام الآني',
 'limitreport-walltime-value' => '{{PLURAL:$1|أقل من ثانية|ثانية واحدة|ثانيتان|$1 ثوانٍ|$1 ثانية}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 بايت',
+'limitreport-templateargumentsize-value' => '$1/$2 بايت',
 
 );
index b2f0979..5d48dd4 100644 (file)
@@ -190,12 +190,12 @@ $messages = array(
 'tog-hidepatrolled' => 'সাম্প্ৰতিক সাল-সলনিত তহলদাৰী সম্পাদনা নেদেখুৱাব',
 'tog-newpageshidepatrolled' => 'নতুন পৃষ্ঠা তালিকাত তহলদাৰী পৃষ্ঠাসমূহ নেদেখুৱাব',
 'tog-extendwatchlist' => 'কেৱল সাম্প্ৰতিকেই নহয, লক্ষ্য-তালিকাৰ সকলো সাল-সলনি বহলাই দেখুৱাওক',
-'tog-usenewrc' => 'বৰà§\8dদà§\8dধিত à¦¸à¦¾à¦®à§\8dপà§\8dৰতিà¦\95 à¦¸à¦¾à¦²-সলনি à¦¬à§\8dযৱহাৰ à¦\95ৰà¦\95 (à¦\9cাভাসà§\8dà¦\95à§\8dৰিপà§\8dà¦\9fৰ à¦ªà§\8dৰয়à§\8bà¦\9cন)',
+'tog-usenewrc' => 'পà§\83ষà§\8dঠাৰ à¦ªà§°à¦¿à§±à§°à§\8dতনসমà§\82হ à¦¶à§\87হতà§\80য়া à¦¸à¦¾à¦²à¦¸à¦²à¦¨à¦¿ à¦\86ৰà§\81 à¦²à¦\95à§\8dষà§\8dযতালিà¦\95াত à¦­à¦¾à¦\97 à¦\95ৰà¦\95',
 'tog-numberheadings' => 'শীৰ্ষকত স্বয়ংক্ৰিয়ভাৱে ক্ৰমিক নং দিয়ক',
-'tog-showtoolbar' => 'সম্পাদনা দণ্ডিকা দেখুৱাওক (জাভাস্ক্ৰিপ্টৰ দৰকাৰ)',
-'tog-editondblclick' => 'à¦\8fà¦\95à§\87লà¦\97à§\87 à¦¦à§\81বাৰ à¦\9fিপা à¦®à¦¾à§°à¦¿à¦²à§\87 à¦ªà§\83ষà§\8dঠা à¦¸à¦®à§\8dপাদনা à¦\95ৰà¦\95 (à¦\9cাভাসà§\8dà¦\95à§\8dৰিপà§\8dà¦\9fৰ à¦¦à§°à¦\95াৰ)',
+'tog-showtoolbar' => 'সম্পাদনা দণ্ডিকা দেখুৱাওক',
+'tog-editondblclick' => 'দà§\81বাৰ à¦\95à§\8dলিà¦\95 à¦\95ৰিলà§\87 à¦ªà§\83ষà§\8dঠা à¦¸à¦®à§\8dপাদনা à¦\95ৰà¦\95',
 'tog-editsection' => '[সম্পাদনা] সংযোগৰ দ্বাৰা অনুচ্ছেদ সম্পাদনা কৰা সক্ৰিয় কৰক',
-'tog-editsectiononrightclick' => 'à¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দৰ à¦¶à¦¿à§°à§\8bনামাত à¦¸à§\8bà¦\81-বà§\81à¦\9fাম à¦\9fিপা à¦®à¦¾à§°à¦¿ à¦¸à¦®à§\8dপাদনা à¦\95ৰাà¦\9fà§\8b à¦¸à¦\95à§\8dৰিয় à¦\95ৰà¦\95 (à¦\9cাভাসà§\8dà¦\95à§\8dৰিপà§\8dà¦\9fৰ à¦ªà§\8dৰয়à§\8bà¦\9cন)',
+'tog-editsectiononrightclick' => 'à¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দৰ à¦¶à¦¿à§°à§\8bনামাত à§°à¦¾à¦\87à¦\9fà§\8dâ\80\8c à¦\95à§\8dলিà¦\95 à¦\9fিপি à¦¸à¦®à§\8dপাদনা à¦\95ৰাà¦\9fà§\8b à¦¸à¦\95à§\8dৰিয় à¦\95ৰà¦\95',
 'tog-showtoc' => 'শিৰোনামাৰ সূচী দেখুৱাওক (যিবোৰ পৃষ্ঠাত তিনিটাতকৈ বেছি শিৰোনামা আছে)',
 'tog-rememberpassword' => 'মোৰ প্ৰৱেশ এই কম্পিউটাৰত মনত ৰাখক (সৰ্বাধিক $1 {{PLURAL:$1|দিনলৈ|দিনলৈ}})',
 'tog-watchcreations' => 'মই সৃষ্টি সকলো পৃষ্ঠা মোৰ লক্ষ্য-তালিকাত যোগ কৰক',
@@ -213,7 +213,7 @@ $messages = array(
 'tog-shownumberswatching' => 'লক্ষ্য কৰি থকা সদস্য সমূহৰ সংখ্যা দেখুৱাওক',
 'tog-oldsig' => 'বৰ্তমানৰ স্বাক্ষৰ:',
 'tog-fancysig' => 'স্বাক্ষৰ ৱিকিটেক্সট হিচাপে ব্যৱহাৰ কৰক (স্বয়ংক্ৰিয় সংযোগ অবিহনে)',
-'tog-uselivepreview' => 'সমà§\8dপাদনাৰ à¦²à¦\97à§\87 à¦²à¦\97à§\87 à¦\96à¦\9aৰা à¦¦à§\87à¦\96à§\81ৱাà¦\93à¦\95 (à¦\9cাভাসà§\8dà¦\95à§\8dৰিপà§\8dà¦\9fৰ à¦ªà§\8dৰয়à§\8bà¦\9cন) (পৰà§\80à¦\95à§\8dষামà§\82লà¦\95)',
+'tog-uselivepreview' => 'সম্পাদনাৰ লগে লগে খচৰা দেখুৱাওক (পৰীক্ষামূলক)',
 'tog-forceeditsummary' => 'সম্পাদনাৰ সাৰাংশ নিদিলে মোক জনাব',
 'tog-watchlisthideown' => 'মোৰ লক্ষ্য-তালিকাত মোৰ সম্পাদনা নেদেখুৱাব',
 'tog-watchlisthidebots' => "মোৰ লক্ষ্য-তালিকাত ব'টে কৰা সম্পাদনা নেদেখুৱাব",
@@ -226,6 +226,7 @@ $messages = array(
 'tog-showhiddencats' => 'নিহিত শ্ৰেণী সমূহ দেখুৱাওক',
 'tog-norollbackdiff' => 'পূৰ্বৱত কৰা পাছত পাৰ্থক্য নেদেখুৱাব',
 'tog-useeditwarning' => 'সালসলনি সংৰক্ষণ নকৰাকৈ সম্পাদনা পৃষ্ঠা ত্যাগৰ সময়ত মোক সাৱধান কৰক',
+'tog-prefershttps' => 'প্ৰৱেশ কৰোঁতে সদায় সুৰক্ষিত সংযোগ ব্যৱহাৰ কৰক',
 
 'underline-always' => 'সদায়',
 'underline-never' => 'কেতিয়াও নহয়',
@@ -326,7 +327,7 @@ $messages = array(
 'newwindow' => "(নতুন ৱিণ্ড'ত খোল খায়)",
 'cancel' => 'বাতিল কৰক',
 'moredotdotdot' => 'অধিক...',
-'morenotlisted' => 'à¦\86ৰà§\81 à¦¤à¦¾à¦²à¦¿à¦\95াভà§\81à¦\95à§\8dত à¦\95ৰা à¦¹à§\8bৱা à¦¨à¦¾à¦\87...',
+'morenotlisted' => 'à¦\8fà¦\87 à¦¤à¦¾à¦²à¦¿à¦\95া à¦¸à¦®à§\8dপà§\82ৰà§\8dণ à¦¨à¦¹à¦¯à¦¼à¥¤',
 'mypage' => 'মোৰ পৃষ্ঠা',
 'mytalk' => 'কথা-বতৰা',
 'anontalk' => 'এই IP-ত যোগাযোগ কৰক',
@@ -512,6 +513,11 @@ $1',
 # General errors
 'error' => 'ভুল',
 'databaseerror' => 'তথ্যকোষৰ ভুল',
+'databaseerror-text' => "এটা ডেটাবে'ছ কুৱেৰী ত্ৰুটি হৈছে।
+ইয়ে ছফ্টৱেৰটোত কিবা বাগ্‌ থকাটো সূচাব পাৰে।",
+'databaseerror-textcl' => "এটা ডেটাবে'ছ কুৱেৰী ত্ৰুটি হৈছে।",
+'databaseerror-function' => 'ফাংচন: $1',
+'databaseerror-error' => 'ত্ৰুটি: $1',
 'laggedslavemode' => 'সাৱধানবাণী: ইয়াত সাম্প্ৰতিক সাল-সলনি নাথাকিব পাৰে',
 'readonly' => 'তথ্যকোষ বন্ধ কৰা আছে',
 'enterlockreason' => 'বন্ধ কৰাৰ কাৰণ দিয়ক, লগতে কেতিয়ামানে খোলা হব তাকো জনাব।',
@@ -545,6 +551,7 @@ $1',
 'cannotdelete-title' => '"$1" পৃষ্ঠা বিলোপ কৰিব নোৱাৰি',
 'delete-hook-aborted' => 'হুকৰ দ্বাৰা সম্পাদনা প্ৰত্যাখ্যান কৰা হৈছে ।
 ইয়াৰ কোনো ব্যাখ্যা নাই ।',
+'no-null-revision' => '"$1" পৃষ্ঠাৰ বাবে নতুন শূন্য সংশোধন সৃষ্টি কৰিব পৰা নগ\'ল',
 'badtitle' => 'অগ্ৰহণীয় শিৰোনামা',
 'badtitletext' => 'আপুনি বিচৰা পৃষ্ঠাটোৰ শিৰোনামা অযোগ্য, খালী বা ভুলকৈ জড়িত আন্তৰ্ভাষিক বা আন্তৰ্ৱিকি শিৰোনামা। ইয়াত এক বা ততোধিক বৰ্ণ আছে যাক শিৰোনামাত ব্যৱহাৰ কৰিব নোৱাৰি।',
 'perfcached' => "তলত দিয়া তথ্যখিনি আগতে জমা কৰি থোৱা (cached) আৰু সাম্প্ৰতিক নহ'ব পাৰে। এই তথ্যখিনিত সৰ্বোচ্চ {{PLURAL:$1|এটা ফলাফল|$1টা ফলাফল}} উপলব্ধ।",
@@ -572,6 +579,8 @@ $2',
 'customjsprotected' => 'এই জাভালিপিৰ পৃষ্ঠা সম্পাদনা কৰাৰ অধিকাৰ আপোনাৰ নাই, কাৰণ ইয়াত আন সদস্যৰ ব্যক্তিগত পছন্দসমূহত আছে ।',
 'mycustomcssprotected' => 'এই CSS পৃষ্ঠা সম্পাদনা কৰিবলৈ আপোনাৰ অনুমতি নাই।',
 'mycustomjsprotected' => 'এই JavaScript পৃষ্ঠা সম্পাদনা কৰিবলৈ আপোনাৰ অনুমতি নাই।',
+'myprivateinfoprotected' => 'ব্যক্তিগত তথ্য সম্পাদনা কৰিবলৈ আপোনাৰ অনুমতি নাই।',
+'mypreferencesprotected' => 'পছন্দসমূহ সম্পাদনা কৰিবলৈ আপোনাৰ অনুমতি  নাই।',
 'ns-specialprotected' => 'বিশেষ পৃষ্ঠা সম্পাদিত কৰিব নোৱাৰি।',
 'titleprotected' => "[[User:$1|$1]] সদস্যজনে এই শিৰোনাণমাৰ লিখনী লিখা ৰোধ কৰিছে ।
 ইয়াৰ কাৰণ হৈছে ''$2'' ।",
@@ -588,10 +597,9 @@ $2',
 'virus-unknownscanner' => 'অজ্ঞাত এন্টিভাইৰাচ:',
 
 # Login and logout pages
-'logouttext' => "'''আপুনি প্ৰস্থান কৰিলে ।'''
+'logouttext' => "'''আপুনি প্ৰস্থান কৰিলে।'''
 
-আপুনি বেনামী ভাবেও {{SITENAME}} ব্যৱহাৰ কৰিব পাৰে, অথবা আকৌ সেই একে বা বেলেগ নামেৰে <span class='plainlinks'>[$1 প্ৰৱেশ]</span> কৰিব পাৰে।
-মন কৰিব যে যেতিয়ালৈকে আপোনাৰ ব্ৰাউজাৰৰ অস্থায়ী-স্মৃতি (cache memory) খালী নকৰে, তেতিয়ালৈকে কিছুমান পৃষ্ঠাত আপুনি প্ৰৱেশ কৰা বুলি দেখুৱাই থাকিব পাৰে।",
+মন কৰিব যে যেতিয়ালৈকে আপোনাৰ ব্ৰাউজাৰৰ অস্থায়ী-স্মৃতি (cache) খালী নকৰে, তেতিয়ালৈকে কিছুমান পৃষ্ঠাত আপুনি প্ৰৱেশ কৰা বুলি দেখুৱাই থাকিব পাৰে।",
 'welcomeuser' => 'আদৰিছোঁ, $1!',
 'welcomecreation-msg' => '== আদৰিছোঁ, $1! ==
 আপোনাৰ সদস্যভুক্তি হৈ গ’ল ।
@@ -599,6 +607,7 @@ $2',
 'yourname' => 'সদস্যনাম:',
 'userlogin-yourname' => 'সদস্যনাম',
 'userlogin-yourname-ph' => 'আপোনাৰ সদস্যনাম লিখক',
+'createacct-another-username-ph' => 'সদস্যনাম লিখক',
 'yourpassword' => 'আপোনাৰ গুপ্তশব্দ',
 'userlogin-yourpassword' => 'গুপ্তশব্দ',
 'userlogin-yourpassword-ph' => 'আপোনাৰ গুপ্তশব্দ লিখক',
@@ -632,10 +641,12 @@ $2',
 'helplogin-url' => 'Help:প্ৰৱেশ/লগ্‌-ইন',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|প্ৰৱেশ সম্পৰ্কীয় সাহায্য]]',
 'createacct-join' => 'আপোনাৰ তথ্যসমূহ তলত লিখক।',
+'createacct-another-join' => 'নতুন একাউণ্টৰ তথ্যসমূহ তলত লিখক।',
 'createacct-emailrequired' => 'ই-মেইল ঠিকনা',
 'createacct-emailoptional' => 'ই-মেইল ঠিকনা (বৈকল্পিক)',
 'createacct-email-ph' => 'আপোনাৰ ই-মেইল ঠিকনা লিখক',
-'createaccountmail' => 'যিকোনো এটা অস্থায়ী গুপ্তশব্দ ব্যৱহাৰ কৰক আৰু ইয়াক তলত দিয়া ইমেইল ঠিকনাটোলৈ পঠিয়াই দিয়ক',
+'createacct-another-email-ph' => 'ইমেইল ঠিকনা লিখক',
+'createaccountmail' => 'এটা যাদৃচ্ছিক অস্থায়ী গুপ্তশব্দ ব্যৱহাৰ কৰক আৰু ইয়াক তলত দিয়া ইমেইল ঠিকনাটোলৈ পঠিয়াই দিয়ক',
 'createacct-realname' => 'প্ৰকৃত নাম (বৈকল্পিক)',
 'createaccountreason' => 'কাৰণ:',
 'createacct-reason' => 'কাৰণ',
@@ -643,6 +654,7 @@ $2',
 'createacct-captcha' => 'সুৰক্ষা পৰীক্ষা',
 'createacct-imgcaptcha-ph' => 'ওপৰত দেখা পোৱা পাঠ্য লিখক',
 'createacct-submit' => 'আপোনাৰ একাউণ্ট সৃষ্টি কৰক',
+'createacct-another-submit' => 'আন এটা একাউণ্ট সৃষ্টি কৰক',
 'createacct-benefit-heading' => 'আপোনাৰ দৰে মানুহেই {{SITENAME}} তৈয়াৰ কৰিছে',
 'createacct-benefit-body1' => '{{PLURAL:$1|সম্পাদনা}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|পৃষ্ঠা|পৃষ্ঠাসমূহ}}',
@@ -714,10 +726,12 @@ $2',
 যদি এইয়া ভুলতে হৈছে, তেনেহলে আপুনি এই বাৰ্তাটো অবজ্ঞা কৰিব পাৰে ।',
 'usernamehasherror' => 'সদস্যনামত হেচ্‌ চিহ্ন থাকিব নোৱাৰে',
 'login-throttled' => 'আপুনি স‍ম্প্ৰতি অজস্ৰবাৰ লগ্‌-ইনৰ প্ৰয়াস কৰিছে ।
-অনুগ্ৰহ কৰি কিছু সময় অপেক্ষা কৰি আকৌ প্ৰয়াস কৰক ।',
+অনুগ্ৰহ কৰি $1 সময়ৰ পিছত আকৌ চেষ্টা কৰক ।',
 'login-abort-generic' => 'আপোনাৰ প্ৰৱেশ অসফল হৈছে- বাতিল কৰা হ’ল',
 'loginlanguagelabel' => 'ভাষা: $1',
 'suspicious-userlogout' => 'আপোনাৰ প্ৰস্থানৰ অনুৰোধ বাতিল কৰা হৈছে কাৰণ হয়তো আপোনাৰ ব্ৰাউজাৰ অসম্পূৰ্ণ নতুবা পূৰ্বৱতী তথ্য পঠাইছে ।',
+'createacct-another-realname-tip' => "প্ৰকৃত নাম দিয়াটো বৈকল্পিক।
+আপুনি নামটো দিলে সেইটো আপোনাৰ বৰঙণিসমূহৰ বাবে স্বীকৃতি প্ৰদানত ব্যৱহাৰ কৰা হ'ব।",
 
 # Email sending
 'php-mail-error-unknown' => 'পি.এইছ.পি মেইল () কাৰ্যত অজ্ঞাত ত্ৰুটি ।',
@@ -733,7 +747,7 @@ $2',
 'newpassword' => 'নতুন গুপ্তশব্দ:',
 'retypenew' => 'নতুন গুপ্তশব্দ আকৌ লিখক',
 'resetpass_submit' => 'গুপ্তশব্দ বহুৱাওক আৰু প্ৰৱেশ কৰক',
-'changepassword-success' => 'আপোনাৰ গুপ্তশব্দ সফলতাৰে সলনি কৰা হৈছে, এতিয়া আপুনি প্ৰৱেশ কৰি আছে...',
+'changepassword-success' => 'আপোনাৰ গুপ্তশব্দ সফলতাৰে সলনি কৰা হৈছে!',
 'resetpass_forbidden' => 'গুপ্তশব্দ সলনি কৰিব নোৱাৰি',
 'resetpass-no-info' => 'এই পৃষ্ঠা প্ৰত্যক্ষ ভাৱে ঢুকি পাবলৈ আপুনি প্ৰৱেশ কৰিব লাগিব ।',
 'resetpass-submit-loggedin' => 'গুপ্তশব্দ সলনি কৰক',
@@ -783,6 +797,9 @@ $2
 'changeemail-submit' => 'ই-মেইল ঠিকনা সলনি কৰক',
 'changeemail-cancel' => 'বাতিল কৰক',
 
+# Special:ResetTokens
+'resettokens' => "ট'কেন ৰিছে'ট কৰক",
+
 # Edit page toolbar
 'bold_sample' => 'গাঢ় পাঠ্য',
 'bold_tip' => 'গাঢ় পাঠ্য',
index 01c43ce..5755eb5 100644 (file)
@@ -104,12 +104,12 @@ $messages = array(
 'tog-hidepatrolled' => 'Tagóa an patrolyadong mga paghirá sa nakakaági pa sanáng pagbabàgo',
 'tog-newpageshidepatrolled' => 'Tagóa an patrolyadong mga pahina gikan sa listahan kan bàgong pahina',
 'tog-extendwatchlist' => 'Palakbanga an bantay-listahan (watchlist) na maipahiling an gabos na pinagbago, bako sana an pinakahurihang binago',
-'tog-usenewrc' => 'Grupong mga pagbabago sa kada pahina kan pinakahuring mga binago asin bantay-listahan (minakaipo nin JavaScript)',
+'tog-usenewrc' => 'Pangrupong mga kaliwatan sa kada pahina kan mga dae pa sana nahaloy na mga kaliwatan asin bantay-listahan',
 'tog-numberheadings' => 'Tolos-bilang na mga pamayohán',
-'tog-showtoolbar' => 'Ihayag an toolbar nin paghirá (minakaipo nin JavaScript)',
-'tog-editondblclick' => 'Liwaton an mga pahina sa dobleng pagpindot (minakaipo nin JavaScript)',
+'tog-showtoolbar' => 'Ipahiling an barang-gamit nin pagliwat',
+'tog-editondblclick' => 'Liwaton an mga pahina sa pagdoble nin klik',
 'tog-editsection' => 'Paganaha an paghihirá kan seksyon sa paági kan [liwaton] na kilyawan',
-'tog-editsectiononrightclick' => 'Paganaha an paghihirá kan seksyon sa paagi kan patoong pagpindot sa mga titulo kan seksyon (minakaipo nin JavaScript)',
+'tog-editsectiononrightclick' => 'Paganaha an seksyon nin pagliliwat sa pag-klik kan mga titulo nin seksyon',
 'tog-showtoc' => 'Ihayag an taytayan nin mga laog (para sa mga pahinang igwang sobra sa 3 pamayohan)',
 'tog-rememberpassword' => 'Giromdoma an sakong paglaóg sa kilyaw (browser) na ini (para sa maximum na $1 {{PLURAL:$1|aldaw|mga aldaw}})',
 'tog-watchcreations' => 'Idagdag an mga pahina na ako an nagmukna asin an mga sagunson na ako an nagkarga sa sakong bantay-listahan',
@@ -127,7 +127,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Ihayag an numero kan nagbabantay na mga parágamit',
 'tog-oldsig' => 'Tugmadong pirma',
 'tog-fancysig' => 'Trataron an pirma na wiki-teksto (mayo nin awtomatikong kilyaw)',
-'tog-uselivepreview' => 'Gamíta an buhay na patànaw (minakaipo nin JavaScript) (eksperimental)',
+'tog-uselivepreview' => 'Gamíta an buhay na patànaw (eksperimental)',
 'tog-forceeditsummary' => 'Ibunyaw sako kun maglalaog sa blangkong kalanyang nin paghirá',
 'tog-watchlisthideown' => 'Tagóa an sakong mga pagliwat gikan sa bantay-listahan',
 'tog-watchlisthidebots' => 'Tagóa an bot na mga pagliwat gikan sa bantay-listahan',
@@ -241,7 +241,7 @@ $messages = array(
 'newwindow' => '(minabukas sa bàgong bintanà)',
 'cancel' => 'Kanselaron',
 'moredotdotdot' => 'Kadagdagan...',
-'morenotlisted' => 'Dakol pa an bakong listado...',
+'morenotlisted' => 'Ining listahan bako pang kumpleto.',
 'mypage' => 'An Pahina',
 'mytalk' => 'Orolayan',
 'anontalk' => 'Olay para kaining IP address',
@@ -428,6 +428,12 @@ Pwede mong mahiling an lista nin mga marhay na pahina sa [[Special:SpecialPages|
 # General errors
 'error' => 'Salâ',
 'databaseerror' => 'Salâ sa base nin datos',
+'databaseerror-text' => 'Sarong hapot sa datos-sarayan na kasalaan an nangyari.
+Ini puwedeng minapasabot nin sarong kudol sa panuklob.',
+'databaseerror-textcl' => 'Sarong hapot sa datos-sarayan na kasalaan an nangyari.',
+'databaseerror-query' => 'Hapot: $1',
+'databaseerror-function' => 'Punksyon: $1',
+'databaseerror-error' => 'Kasalaan: $1',
 'laggedslavemode' => 'Patanid: An pahina pwedeng dai nin pagbabâgo sa ngonyan.',
 'readonly' => 'Nakakandado na datos-sarayan',
 'enterlockreason' => 'Magkaag tabì nin rason sa pagkandado, asin ikalkulo kun nuarin bubukasón an kandado',
@@ -1544,7 +1550,7 @@ An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit mak
 'rc_categories_any' => 'Dawà arín',
 'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} pagtatapos kan pagbabago',
 'newsectionsummary' => '/* $1 */ bàgong seksyon',
-'rc-enhanced-expand' => 'Magpahiling kan mga detalye (minakaipo nin JavaScript)',
+'rc-enhanced-expand' => 'Ipahiling an mga detalye',
 'rc-enhanced-hide' => 'Itago an mga detalye',
 'rc-old-title' => 'orihinal na pinagmukna bilang "$1"',
 
@@ -3809,6 +3815,7 @@ Ika dapat na nakapagresibe na kan [{{SERVER}}{{SCRIPTPATH}}/COPYING sarong kopya
 Ining sityo igwang naeksperiyensiyahan na mga kakundian sa teknikal.',
 'dberr-again' => 'Prubaring maghalat tabi nin nagkapirang minutos asin otrohon ikarga.',
 'dberr-info' => '(Dae makakontak sa serbidor kan datos-sarayan: $1)',
+'dberr-info-hidden' => '(Dae makakontak sa serbidor kan datos-sarayan)',
 'dberr-usegoogle' => 'Ika puwedeng magprubar na maghanap sa Google nguna.',
 'dberr-outofdate' => 'Pasinon mo tabi na an saindang mga indekso kan satuyang laog puwedeng luwas na sa petsa.',
 'dberr-cachederror' => 'Ini sarong nakasaray na kopya kan pinaghahagad na pahina, asin puwedeng bakong angat sa petsa.',
index 0678465..ad62950 100644 (file)
@@ -248,10 +248,10 @@ $messages = array(
 'tog-extendwatchlist' => 'Разширяване на списъка, така че да показва всички промени, не само най-скорошните',
 'tog-usenewrc' => 'Групиране на последните промени и списъка за наблюдение по страници (изисква Джаваскрипт)',
 'tog-numberheadings' => 'Номериране на заглавията',
-'tog-showtoolbar' => 'Ð\9fомоÑ\89на Ð»ÐµÐ½Ñ\82а Ð·Ð° Ñ\80едакÑ\82иÑ\80ане (изиÑ\81ква Ð\94жаваÑ\81кÑ\80ипÑ\82)',
-'tog-editondblclick' => 'РедакÑ\82иÑ\80ане Ð¿Ñ\80и Ð´Ð²Ð¾Ð¹Ð½Ð¾ Ñ\89Ñ\80акване (изиÑ\81ква Ð\94жаваÑ\81кÑ\80ипÑ\82)',
+'tog-showtoolbar' => 'Ð\9fоказване Ð½Ð° Ð¸Ð½Ñ\81Ñ\82Ñ\80Ñ\83менÑ\82иÑ\82е Ð·Ð° Ñ\80едакÑ\82иÑ\80ане',
+'tog-editondblclick' => 'РедакÑ\82иÑ\80ане Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е Ñ\87Ñ\80ез Ð´Ð²Ð¾Ð¹Ð½Ð¾ Ñ\89Ñ\80акване',
 'tog-editsection' => 'Възможност за редактиране на раздел чрез препратка [редактиране]',
-'tog-editsectiononrightclick' => 'Възможност за редактиране на раздел при щракване с десния бутон върху заглавие на раздел (изисква Джаваскрипт)',
+'tog-editsectiononrightclick' => 'Възможност за редактиране на раздел при щракване с десния бутон върху заглавието му',
 'tog-showtoc' => 'Показване на съдържание (за страници с повече от три раздела)',
 'tog-rememberpassword' => 'Запомяне на паролата ми в този браузър (за не повече от $1 {{PLURAL:$1|ден|дни}})',
 'tog-watchcreations' => 'Добавяне на създадените от мен страници и качените от мен файлове към списъка ми за наблюдение',
@@ -269,7 +269,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Показване на броя на потребителите, наблюдаващи дадена страница',
 'tog-oldsig' => 'Текущ подпис:',
 'tog-fancysig' => 'Без превръщане на подписа в препратка към потребителската страница',
-'tog-uselivepreview' => 'Ð\98зползване Ð½Ð° Ð±Ñ\8aÑ\80з Ð¿Ñ\80едваÑ\80иÑ\82елен Ð¿Ñ\80еглед (изиÑ\81ква Ð\94жаваÑ\81кÑ\80ипÑ\82; ÐµÐºÑ\81пеÑ\80именÑ\82ално)',
+'tog-uselivepreview' => 'Използване на бърз предварителен преглед (експериментално)',
 'tog-forceeditsummary' => 'Предупреждаване при празно поле за резюме на редакцията',
 'tog-watchlisthideown' => 'Скриване на моите редакции в списъка ми за наблюдение',
 'tog-watchlisthidebots' => 'Скриване на редакциите на ботове в списъка ми за наблюдение',
@@ -282,6 +282,7 @@ $messages = array(
 'tog-showhiddencats' => 'Показване на скритите категории',
 'tog-norollbackdiff' => 'Пропускане на разликовата връзка след извършване на отмяна на редакции',
 'tog-useeditwarning' => 'Предупреждаване при опит за напускане на страница, отворена в режим на редактиране, без да са запазени промените',
+'tog-prefershttps' => 'Да се използва винаги защитена връзка след влизане',
 
 'underline-always' => 'Винаги',
 'underline-never' => 'Никога',
@@ -382,6 +383,7 @@ $messages = array(
 'newwindow' => '(отваря се в нов прозорец)',
 'cancel' => 'Отказ',
 'moredotdotdot' => 'Още…',
+'morenotlisted' => 'Този списък не е пълен.',
 'mypage' => 'Страница',
 'mytalk' => 'Беседа',
 'anontalk' => 'Беседа за адреса',
@@ -568,6 +570,9 @@ $1',
 # General errors
 'error' => 'Грешка',
 'databaseerror' => 'Грешка при работа с базата от данни',
+'databaseerror-query' => 'Заявка: $1',
+'databaseerror-function' => 'Функция: $1',
+'databaseerror-error' => 'Грешка: $1',
 'laggedslavemode' => 'Внимание: Страницата може да не съдържа последните обновявания.',
 'readonly' => 'Базата от данни е затворена за промени',
 'enterlockreason' => 'Посочете причина за затварянето, като дадете и приблизителна оценка кога базата от данни ще бъде отново отворена',
@@ -821,6 +826,9 @@ $2
 'changeemail-submit' => 'Промяна на е-пощата',
 'changeemail-cancel' => 'Отказване',
 
+# Special:ResetTokens
+'resettokens-token-label' => '$1 (текуща стойност: $2)',
+
 # Edit page toolbar
 'bold_sample' => 'Получер текст',
 'bold_tip' => 'Получер (удебелен) текст',
@@ -1227,6 +1235,7 @@ $1",
 'compareselectedversions' => 'Сравнение на избраните версии',
 'showhideselectedversions' => 'Показване/скриване на избрани версии',
 'editundo' => 'връщане',
+'diff-empty' => '(Няма разлика)',
 'diff-multi' => '({{PLURAL:$1|Не е показана една междинна версия|Не са показани $1 междинни версии}} от {{PLURAL:$2|един потребител|$2 потребителя}}.)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Не е показана една междинна версия|Не са показани $1 междинни версии}} от повече от $2 {{PLURAL:$2|потребител|потребителя}})',
 'difference-missing-revision' => '{{PLURAL:$2|Не беше открита|Не бяха открити}} {{PLURAL:$2|една версия|$2 версии}} от тази разликова препратка ($1).
@@ -1398,6 +1407,7 @@ $1",
 'prefs-dateformat' => 'Формат на датата',
 'prefs-timeoffset' => 'Часово отместване',
 'prefs-advancedediting' => 'Разширени настройки',
+'prefs-preview' => 'Преглед',
 'prefs-advancedrc' => 'Разширени настройки',
 'prefs-advancedrendering' => 'Разширени настройки',
 'prefs-advancedsearchoptions' => 'Разширени настройки',
@@ -1598,7 +1608,7 @@ $1",
 'rc_categories_any' => 'Която и да е',
 'rc-change-size-new' => '$1 {{PLURAL:$1|байт|байта}} след редакцията',
 'newsectionsummary' => 'Нова тема /* $1 */',
-'rc-enhanced-expand' => 'Показване на детайли (изисква JavaScript)',
+'rc-enhanced-expand' => 'Показване на детайли',
 'rc-enhanced-hide' => 'Скриване на детайли',
 'rc-old-title' => 'първоначално създадена като „$1“',
 
@@ -1621,7 +1631,7 @@ $1",
 'reuploaddesc' => 'Връщане към формуляра за качване.',
 'upload-tryagain' => 'Съхраняване на промененото описание на файла',
 'uploadnologin' => 'Не сте влезли',
-'uploadnologintext' => 'Ð\9dеобÑ\85одимо Ðµ Ð´Ð° [[Special:UserLogin|влезеÑ\82е]], Ð·Ð° Ð´Ð° Ð¼Ð¾Ð¶Ðµ Ð´Ð° ÐºÐ°Ñ\87ваÑ\82е Ñ\84айлове.',
+'uploadnologintext' => 'Ð\97а Ð´Ð° Ð¼Ð¾Ð³Ð°Ñ\82 Ð´Ð° Ð±Ñ\8aдаÑ\82 ÐºÐ°Ñ\87вани Ñ\84айлове Ðµ Ð½ÐµÐ¾Ð±Ñ\85одимо $1 Ð² Ñ\81иÑ\81Ñ\82емаÑ\82а.',
 'upload_directory_missing' => 'Директорията за качване ($1) липсва и не може да бъде създадена на сървъра.',
 'upload_directory_read_only' => 'Сървърът няма достъп за писане в директорията за качване „$1“.',
 'uploaderror' => 'Грешка при качване',
@@ -1818,6 +1828,7 @@ $1',
 'listfiles_size' => 'Размер',
 'listfiles_description' => 'Описание',
 'listfiles_count' => 'Версии',
+'listfiles-show-all' => 'Включване на старите версии на изображенията',
 'listfiles-latestversion' => 'Текущата версия',
 'listfiles-latestversion-yes' => 'Да',
 'listfiles-latestversion-no' => 'Не',
@@ -1853,6 +1864,8 @@ $1',
 За повече информация вижте [$2 описателната му страница].',
 'sharedupload-desc-here' => 'Този файл е от $1 и може да се използва от други проекти.
 Следва информация за файла, достъпна през [$2 оригиналната му описателна страница].',
+'sharedupload-desc-edit' => 'Този файл е от $1 и може да бъде използван от други проекти.
+Вероятно желаете да редактирате описанието му на [$2 неговата описателна страница].',
 'filepage-nofile' => 'Не съществува файл с това име.',
 'filepage-nofile-link' => 'Не съществува файл с това име, но можете [$1 да го качите].',
 'uploadnewversion-linktext' => 'Качване на нова версия на файла',
@@ -2925,6 +2938,7 @@ $1',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Скрита категория|Скрити категории}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Включен шаблон|Включени шаблони}} ($1)',
 'pageinfo-toolboxlink' => 'Информация за страницата',
+'pageinfo-redirectsto' => 'Пренасочване към',
 'pageinfo-redirectsto-info' => 'инфо',
 'pageinfo-contentpage-yes' => 'Да',
 'pageinfo-protect-cascading' => 'Каскадни защити, започващи от тази страница',
@@ -3170,6 +3184,7 @@ $1',
 'exif-citycreated' => 'Град, в който е направена снимката',
 'exif-objectname' => 'Кратко заглавие',
 'exif-specialinstructions' => 'Специални инструкции',
+'exif-headline' => 'Заглавие',
 'exif-source' => 'Източник',
 'exif-contact' => 'Информация за контакти',
 'exif-languagecode' => 'Език',
@@ -3575,6 +3590,7 @@ $5
 'version-license' => 'Лиценз',
 'version-poweredby-credits' => "Това уики се задвиждва от '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'други',
+'version-poweredby-translators' => 'преводачи в translatewiki.net',
 'version-credits-summary' => 'Бихме искали да изкажем признателност на следните хора за техните приноси към [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki е свободен софтуер, можете да го разпространявате и/или променяте съгласно условията на GNU General Public License, както е публикуван от Free Software Foundation, версия 2 на лиценза или (по ваше усмотрение) която и да е следваща версия.
 
@@ -3683,6 +3699,7 @@ MediaWiki се разпространява с надеждата, че ще б
 'htmlform-selectorother-other' => 'Друга',
 'htmlform-no' => 'Не',
 'htmlform-yes' => 'Да',
+'htmlform-chosen-placeholder' => 'Избиране',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 с поддръжка на пълнотекстово търсене',
index 9a24304..2ab17a7 100644 (file)
@@ -78,12 +78,12 @@ $messages = array(
 'tog-hidepatrolled' => 'পরীক্ষিত সম্পাদনা গুলো সাম্প্রতিক পরিবর্তনসমূহে আড়াল করো',
 'tog-newpageshidepatrolled' => 'পরীক্ষিত পাতা গুলো নতুন পাতার তালিকায় আড়াল করো',
 'tog-extendwatchlist' => 'শুধু সাম্প্রতিক পরিবর্তনই নয়, সকল পরিবর্তন দেখতে নজর তালিকা সম্প্রসারণ করুন।',
-'tog-usenewrc' => 'সাম্প্রতিক পরিবর্তনসমূহ এবং নজরতালিকা পাতায় পরিবর্তনগুলো একত্রে প্রদর্শন (জাভাস্ক্রিপ্ট প্রয়োজন)',
+'tog-usenewrc' => 'সাম্প্রতিক পরিবর্তনসমূহ এবং নজরতালিকা পাতায় পরিবর্তনগুলো একত্রে প্রদর্শন',
 'tog-numberheadings' => 'শিরোনামগুলোকে স্বয়ংক্রিয়ভাবে ক্রমিক নম্বর দাও',
-'tog-showtoolbar' => 'সম্পাদনা টুলবার দেখাও (জাভাস্ক্রিপ্ট প্রয়োজন)',
-'tog-editondblclick' => 'দুইবার ক্লিক করে পাতা সম্পাদনা (জাভাস্ক্রিপ্ট প্রয়োজন)',
+'tog-showtoolbar' => 'সম্পাদনা টুলবার দেখাও',
+'tog-editondblclick' => 'দুইবার ক্লিক করে পাতা সম্পাদনা',
 'tog-editsection' => '[সম্পাদনা] সংযোগের সাহায্যে পরিচ্ছেদ সম্পাদনা করার ক্ষমতা দেয়া হোক',
-'tog-editsectiononrightclick' => 'পরিচ্ছেদের শিরোনামে ডান ক্লিকের মাধ্যমে সম্পাদনা করার ক্ষমতা দেয়া হোক (জাভাস্ক্রিপ্ট)',
+'tog-editsectiononrightclick' => 'পরিচ্ছেদের শিরোনামে ডান ক্লিকের মাধ্যমে সম্পাদনা করার ক্ষমতা দেয়া হোক',
 'tog-showtoc' => 'সূচিপত্র দেখানো হোক (৩টির বেশি পরিচ্ছেদের শিরোনামবিশিষ্ট পাতার জন্য)',
 'tog-rememberpassword' => 'এই ব্রাউজারে আমার লগ ইন তথ্য (শব্দচাবি) মনে রাখো (সর্বোচ্চ $1 {{PLURAL:$1|দিনের|দিনের}} জন্য)',
 'tog-watchcreations' => 'আমার তৈরি পাতা এবং আপলোড করা ফাইলগুললো আমার নজরতালিকায় যোগ করা হোক',
@@ -101,7 +101,7 @@ $messages = array(
 'tog-shownumberswatching' => 'নজরদারী করছে, এমন ব্যবহারকারীর সংখ্যা দেখানো হোক',
 'tog-oldsig' => 'বর্তমান স্বাক্ষর:',
 'tog-fancysig' => 'স্বাক্ষরকে উইকিটেক্সট হিসেবে মনে করুন (কোন সয়ংক্রিয় লিঙ্ক ছাড়া)',
-'tog-uselivepreview' => 'তাà§\8eà¦\95à§\8dষণিà¦\95 à¦ªà§\8dরাà¦\95দরà§\8dশনà§\87র à¦\95à§\8dষমতা à¦\9aালà§\81 à¦\95রা à¦¹à§\8bà¦\95 (à¦\9cাভাসà§\8dà¦\95à§\8dরিপà§\8dà¦\9f) (পরà§\80à¦\95à§\8dষামà§\82লà¦\95)',
+'tog-uselivepreview' => 'তাৎক্ষণিক প্রাকদর্শনের ক্ষমতা চালু করা হোক (পরীক্ষামূলক)',
 'tog-forceeditsummary' => 'খালি সম্পাদনা সারাংশ প্রবেশ করানোর সময় আমাকে জানানো হোক',
 'tog-watchlisthideown' => 'আমার সম্পাদনাগুলি আমার নজরতালিকায় না দেখানো হোক',
 'tog-watchlisthidebots' => 'বটের করা সম্পাদনাগুলি নজরতালিকায় না দেখানো হোক',
@@ -402,6 +402,12 @@ $1',
 # General errors
 'error' => 'ত্রুটি',
 'databaseerror' => 'ডাটাবেস ত্রুটি',
+'databaseerror-text' => 'ডাটাবেজ অনুসন্ধান ত্রুটি।
+এটি সফটওয়্যারের একটি ত্রুটি হতে পারে।',
+'databaseerror-textcl' => 'ডাটাবেজ অনুসন্ধান ত্রুটি।',
+'databaseerror-query' => 'অনুসন্ধান: $1',
+'databaseerror-function' => 'ফাংশন: $1',
+'databaseerror-error' => 'ত্রুটি: $1',
 'laggedslavemode' => 'সতর্কীকরণ: পাতাটি সম্ভবত সম্প্রতি হালনাগাদকৃত নয়।',
 'readonly' => 'ডেটাবেজের ব্যবহার সীমাবদ্ধ',
 'enterlockreason' => 'তালাবদ্ধ করার কারণ কি তা বলুন, সাথে কখন তালা খুলবেন তার আনুমানিক সময় উল্লখ্য করুন',
@@ -3783,6 +3789,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 এই সাইটটি বর্তমানে কারীগরী অসুবিধার মুখোমুখি হয়েছে।',
 'dberr-again' => 'কয়েক মিনিট পর পুনরায় পরিদর্শনের চেষ্টা করুন।',
 'dberr-info' => '(ডেটাবেজ সার্ভার $1-এর সাথে যোগাযোগ করা সম্ভব হয়নি)',
+'dberr-info-hidden' => '(ডাটাবেজ সার্ভারের সাথে সংযোগ দেয়া সম্ভব হচ্ছে না)',
 'dberr-usegoogle' => 'এই পরিস্থিতিতে আপনি গুগলের মাধ্যমে অনুসন্ধান করার চেষ্টা করতে পারেন।',
 'dberr-outofdate' => 'খেয়াল করুন যে, আমাদের বিষয়বস্তু সম্পর্কিত তাদের সূচি মেয়াদ উত্তীর্ণ হতে পারে।',
 'dberr-cachederror' => 'এটি অনুরোধকৃত পাতার ক্যাশে লিপি, যা হালনাগাতকৃত নাও হতে পারে।',
index 50f4370..0ad0fed 100644 (file)
@@ -189,7 +189,7 @@ $messages = array(
 'tog-extendwatchlist' => 'Astenn ar roll evezhiañ a-benn diskouez an holl gemmoù ha neket ar re ziwezhañ hepken.',
 'tog-usenewrc' => "Diskouez ar c'hemmoù nevez en ur feson kempennoc'h (rekis eo JavaScript)",
 'tog-numberheadings' => 'Niverenniñ emgefre an titloù',
-'tog-showtoolbar' => 'Diskouez ar varrenn gant ar meuzioù skridaozañ',
+'tog-showtoolbar' => 'Diskouez ar varrenn ostilhoù aozañ',
 'tog-editondblclick' => 'Daouglikañ evit kemmañ pajennoù',
 'tog-editsection' => 'Kemmañ ur rann dre al liammoù [kemmañ]',
 'tog-editsectiononrightclick' => 'Kemmañ ur rann dre glikañ a-zehou<br /> war titl ar rann',
@@ -210,7 +210,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Diskouez an niver a lennerien',
 'tog-oldsig' => 'Ar sinadur zo evit poent :',
 'tog-fancysig' => 'Ober gant ar sinadur evel pa vefe wikitestenn (hep liamm emgefre)',
-'tog-uselivepreview' => 'Implijout Rakwelet prim (JavaScript) (taol-arnod)',
+'tog-uselivepreview' => 'Implijout Rakwelet prim (taol-arnod)',
 'tog-forceeditsummary' => 'Kemenn din pa ne skrivan netra er stern diverrañ',
 'tog-watchlisthideown' => "Kuzhat ma c'hemmoù er rollad evezhiañ",
 'tog-watchlisthidebots' => 'Kuzhat kemmoù ar botoù er rollad evezhiañ',
@@ -2008,6 +2008,8 @@ Marteze a-walc'h e fell deoc'h kemmañ an deskrivadur anezhi war ar [$2 bajenn d
 'statistics-users-active-desc' => "Implijerien o deus degaset da nebeutañ ur c'hemm {{PLURAL:$1|an deiz paseet|e-kerzh an $1 deiz diwezhañ}}",
 'statistics-mostpopular' => 'Pajennoù muiañ sellet',
 
+'pageswithprop' => 'Pajennoù gant ur perzh pajenn',
+'pageswithprop-legend' => 'Pajennoù gant ur perzh pajenn',
 'pageswithprop-prop' => 'Anv ar perzh :',
 'pageswithprop-submit' => 'Mont',
 
@@ -3919,7 +3921,7 @@ Sañset oc'h bezañ resevet [{{SERVER}}{{SCRIPTPATH}}/COPYING un eilskrid eus ar
 'logentry-delete-delete' => 'Diverket eo bet ar bajenn $3 gant $1',
 'logentry-delete-restore' => 'Assavet eo bet ar bajenn $3 gant $1',
 'logentry-delete-event' => "Kemmet eo bet gwelusted {{PLURAL:$5|un darvoud eus ar marilh|$5 darvoud eus ar marilh}} d'an $3 gant $1 : $4",
-'logentry-delete-revision' => 'Kemmet eo bet gwelusted {{PLURAL:$5|reizhadenn}} war ar bajenn $3 gant $1 : $4',
+'logentry-delete-revision' => 'Kemmet eo bet gwelusted {{PLURAL:$5|$5reizhadenn}} war ar bajenn $3 gant $1 : $4',
 'logentry-delete-event-legacy' => 'Kemmet eo bet gwelusted darvoudoù ar marilh $3 gant $1',
 'logentry-delete-revision-legacy' => 'Kemmet eo bet gwelusted ar reizhadennoù war ar bajenn $3 gant $1',
 'logentry-suppress-delete' => '$1 {{GENDER:$2|en deus dilamet}} ar bajenn $3',
index 81661cd..58f90fc 100644 (file)
@@ -289,7 +289,7 @@ $messages = array(
 'tog-extendwatchlist' => 'Proširi spisak praćenja za pogled svih izmjena, ne samo nedavnih',
 'tog-usenewrc' => 'Grupiraj izmjene po stranicama sa nedavnih izmjena i praćenih članaka',
 'tog-numberheadings' => 'Automatski numeriši podnaslove',
-'tog-showtoolbar' => 'Prikaži dugmiće za izmjene (JavaScript)',
+'tog-showtoolbar' => 'Prikaži traku s alatkama za uređivanje',
 'tog-editondblclick' => 'Izmijeni stranice dvostrukim klikom',
 'tog-editsection' => 'Omogući da mijenjam pojedinačne odjeljke putem [uredi] linka',
 'tog-editsectiononrightclick' => 'Uključite uređivanje odjeljka sa pritiskom na desno dugme miša u naslovu odjeljka',
@@ -425,7 +425,7 @@ $messages = array(
 'newwindow' => '(otvara se u novom prozoru)',
 'cancel' => 'Poništite',
 'moredotdotdot' => 'Još...',
-'morenotlisted' => 'Više nije prikazano...',
+'morenotlisted' => 'Ovaj spisak nije kompletan.',
 'mypage' => 'Korisnička stranica',
 'mytalk' => 'Razgovor',
 'anontalk' => 'Razgovor za ovu IP adresu',
@@ -1968,8 +1968,7 @@ Možda možete pokušati kada bude manje opterećenje.',
 'upload_source_file' => ' (datoteka na Vašem računaru)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Ova posebna stranica prikazuje sve postavljene datoteke.
-Kada je filtrirana od strane korisnika, prikazane su samo datoteke ako je korisnik postavio posljednju verziju te datoteke.',
+'listfiles-summary' => 'Ova posebna stranica prikazuje sve postavljene datoteke.',
 'listfiles_search_for' => 'Traži medije po imenu:',
 'imgfile' => 'datoteka',
 'listfiles' => 'Spisak slika',
index 7392bfb..a1c814d 100644 (file)
@@ -534,6 +534,11 @@ Vegeu la llista de pàgines especials a [[Special:SpecialPages]].',
 # General errors
 'error' => 'Error',
 'databaseerror' => "S'ha produït un error en la base de dades",
+'databaseerror-text' => "S'ha produït un error en la consulta de la base de dades.
+Això pot indicar un error en el programari.",
+'databaseerror-textcl' => "S'ha produït un error en la consulta de la base de dades.",
+'databaseerror-query' => 'Consulta: $1',
+'databaseerror-function' => 'Funció: $1',
 'laggedslavemode' => 'Avís: La pàgina podria mancar de modificacions recents.',
 'readonly' => 'La base de dades es troba bloquejada',
 'enterlockreason' => 'Escriviu una raó pel bloqueig, així com una estimació de quan tindrà lloc el desbloqueig',
@@ -567,6 +572,7 @@ Potser ja ha estat esborrat per algú altre.",
 'cannotdelete-title' => 'No es pot suprimir la pàgina " $1 "',
 'delete-hook-aborted' => 'Un «hook» ha interromput la supressió.
 No ha donat cap explicació.',
+'no-null-revision' => "No s'ha pogut crear una nova revisió nul·la de la pàgina «$1»",
 'badtitle' => 'El títol no és correcte',
 'badtitletext' => 'El títol de la pàgina que heu introduït no és correcte, és en blanc o conté un enllaç trencat amb un altre projecte. També podria contenir algun caràcter no acceptat als títols de pàgina.',
 'perfcached' => "Les dades següents es troben a la memòria cau i podrien no estar al dia. Hi ha un màxim {{PLURAL:$1|d'un resultat|de $1 resultats}} disponibles a la memòria cau.",
@@ -734,6 +740,8 @@ Espereu $1 abans de tornar-ho a provar.",
 'login-abort-generic' => "L'entrada al compte d'usuari no ha reeixit - Abortada",
 'loginlanguagelabel' => 'Llengua: $1',
 'suspicious-userlogout' => "S'ha denegat la vostra petició per tancar la sessió ja què sembla que va ser enviada per un navegador defectuós o un proxy cau.",
+'createacct-another-realname-tip' => "El nom real és opcional.
+Si decidiu proporcionar-lo, s'utilitzarà per a reconèixer a l'usuari el seu treball.",
 
 # Email sending
 'php-mail-error-unknown' => 'Error desconegut en la funció mail() de PHP',
@@ -762,6 +770,7 @@ Deveu haver canviat la vostra contrasenya o demanat una nova contrasenya tempora
 # Special:PasswordReset
 'passwordreset' => 'Restablir contrasenya',
 'passwordreset-text-one' => 'Cal completar aquest formulari per reiniciar la contrasenya',
+'passwordreset-text-many' => '{{PLURAL:$1|Ompliu un dels camps per a reiniciar la vostra contrasenya.}}',
 'passwordreset-legend' => 'Restablir contrasenya',
 'passwordreset-disabled' => "S'ha desactivat el restabliment de contranyes en aquest wiki.",
 'passwordreset-emaildisabled' => 'Les opcions de correu electrònic no estan habilitades en aquest wiki.',
@@ -801,6 +810,16 @@ Contrasenya temporal: $2",
 'changeemail-submit' => 'Canvia de correu electrònic',
 'changeemail-cancel' => 'Cancel·la',
 
+# Special:ResetTokens
+'resettokens' => 'Reinicia els testimonis',
+'resettokens-no-tokens' => 'No hi ha testimonis per reiniciar.',
+'resettokens-legend' => 'Reinicia els testimonis',
+'resettokens-tokens' => 'Testimonis:',
+'resettokens-token-label' => '$1 (valor actual: $2)',
+'resettokens-watchlist-token' => 'Testimoni del canal web (Atom/RSS) dels [[Special:Watchlist|canvis a la llista de seguiment]]',
+'resettokens-done' => "S'han reiniciat els testimonis.",
+'resettokens-resetbutton' => 'Reinicia els testimonis seleccionats',
+
 # Edit page toolbar
 'bold_sample' => 'Text en negreta',
 'bold_tip' => 'Text en negreta',
@@ -1501,6 +1520,8 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 '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-viewmywatchlist' => 'Mostra la llista de seguiment pròpia',
+'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',
 'right-noratelimit' => "No veure's afectat pels límits d'accions",
@@ -1562,6 +1583,10 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'action-userrights-interwiki' => "modificar permisos d'usuari en altres wikis",
 'action-siteadmin' => 'bloquejar o desbloquejar la base de dades',
 'action-sendemail' => 'enviar missatges de correu',
+'action-editmywatchlist' => 'edita la llista de seguiment',
+'action-viewmywatchlist' => 'mostra la llista de seguiment',
+'action-viewmyprivateinfo' => 'mostra la informació personal',
+'action-editmyprivateinfo' => 'edita la informació personal',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|canvi|canvis}}',
@@ -1852,6 +1877,9 @@ Si filtreu per usuari només es mostraran els fitxers la versió més recent del
 'listfiles_size' => 'Mida (octets)',
 'listfiles_description' => 'Descripció',
 'listfiles_count' => 'Versions',
+'listfiles-show-all' => 'Inclou versions antigues de les imatges',
+'listfiles-latestversion' => 'Versió actual',
+'listfiles-latestversion-yes' => 'Sí',
 
 # File description page
 'file-anchor-link' => 'Fitxer',
@@ -1946,6 +1974,13 @@ Potser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].
 'randompage' => "Pàgina a l'atzar",
 'randompage-nopages' => "No hi ha cap pàgina en {{PLURAL:$2|l'espai de noms següent|els espais de noms següents}}: $1.",
 
+# Random page in category
+'randomincategory' => 'Pàgina aleatòria en la categoria',
+'randomincategory-invalidcategory' => '«$1» no és un nom de categoria vàlid.',
+'randomincategory-nopages' => 'No hi ha pàgines a la categoria [[:Category:$1|$1]].',
+'randomincategory-selectcategory' => "Obté una pàgina a l'atzar de la categoria: $1 $2.",
+'randomincategory-selectcategory-submit' => 'Vés-hi',
+
 # Random redirect
 'randomredirect' => "Redirecció a l'atzar",
 'randomredirect-nopages' => "No hi ha cap redirecció a l'espai de noms «$1».",
@@ -2804,6 +2839,8 @@ En el darrer cas, podeu fer servir un enllaç com ara [[{{#Special:Export}}/{{Me
 'thumbnail-more' => 'Amplia',
 'filemissing' => 'Fitxer inexistent',
 'thumbnail_error' => "S'ha produït un error en crear la miniatura: $1",
+'thumbnail_error_remote' => "Missatge d'error de $1:
+$2",
 'djvu_page_error' => "La pàgina DjVu està fora de l'abast",
 'djvu_no_xml' => "No s'ha pogut recollir l'XML per al fitxer DjVu",
 'thumbnail-temp-create' => "No s'ha pogut creat el fitxer de miniatura temporal",
@@ -3752,9 +3789,14 @@ Amb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còp
 'version-entrypoints-header-url' => 'URL',
 
 # Special:Redirect
+'redirect' => 'Redirigeix per fitxer, usuari o ID de la revisió',
+'redirect-legend' => 'Redirigeix a un fitxer o a una pàgina',
 'redirect-submit' => 'Vés-hi',
+'redirect-lookup' => 'Consulta:',
 'redirect-value' => 'Valor:',
 'redirect-user' => "ID d'usuari",
+'redirect-revision' => 'Revisió de la pàgina',
+'redirect-file' => 'Nom del fitxer',
 'redirect-not-exists' => "No s'ha trobat el valor",
 
 # Special:FileDuplicateSearch
@@ -3805,6 +3847,7 @@ Amb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còp
 'tags' => 'Etiquetes de canvi vàlides',
 'tag-filter' => "Filtre d'[[Special:Tags|etiquetes]]:",
 'tag-filter-submit' => 'Filtra',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetes}}]]: $2)',
 'tags-title' => 'Etiquetes',
 'tags-intro' => 'Aquesta pàgina llista les etiquetes amb les què el programari pot marcar una modificació, i llur significat.',
 'tags-tag' => "Nom de l'etiqueta",
@@ -3831,6 +3874,7 @@ Amb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còp
 'dberr-problems' => 'Ho sentim. Aquest lloc web està experimentant dificultats tècniques.',
 'dberr-again' => 'Intenteu esperar uns minuts i tornar a carregar.',
 'dberr-info' => '(No es pot contactar amb el servidor de dades: $1)',
+'dberr-info-hidden' => '(No es pot contactar amb el servidor de la base de dades)',
 'dberr-usegoogle' => 'Podeu intentar fer la cerca via Google mentrestant.',
 'dberr-outofdate' => 'Tingueu en compte que la seva indexació del nostre contingut pot no estar actualitzada.',
 'dberr-cachederror' => 'A continuació hi ha una còpia emmagatzemada de la pàgina demanada, que pot no estar actualitzada.',
index 8fe6a4c..806ea86 100644 (file)
@@ -820,8 +820,8 @@ $1',
 # Edit page toolbar
 'bold_sample' => 'Дерстино до йоза',
 'bold_tip' => 'Дерстино до йоза',
-'italic_sample' => 'Ð\9aÑ\83Ñ\80Ñ\81еттан до йоза',
-'italic_tip' => 'Ð\9aÑ\83Ñ\80Ñ\81еттан до йоза',
+'italic_sample' => 'Сеттан до йоза',
+'italic_tip' => 'Сеттан до йоза',
 'link_sample' => 'Хьажориган коьрта могlа',
 'link_tip' => 'Чоьхьа хьажориг',
 'extlink_sample' => 'http://www.example.com хьажориг корта',
index 3ea3f33..cd231d9 100644 (file)
@@ -1213,7 +1213,7 @@ $1",
 لەیادت بێت لەوانەیە پێرستەکانیان بۆ گەڕانی ناو {{SITENAME}}، کات‌بەسەرچوو بێت.',
 
 # Preferences page
-'preferences' => 'ھەڵبەژاردەکان',
+'preferences' => 'ھەڵبژاردەکان',
 'mypreferences' => 'ھەڵبژاردەکان',
 'prefs-edits' => 'ژمارەی گۆڕانکارییەکان:',
 'prefsnologin' => 'لەژوورەوە نیت',
@@ -1434,7 +1434,7 @@ $1",
 'right-importupload' => 'ھاوردنی پەڕەکان بە بارکردنی پەڕگە',
 'right-patrol' => 'نیشانکردنی دەستکاریەکانی کەسانی تر وەک پاس دراو',
 'right-autopatrol' => 'نیشانکردنی خۆگەڕی دەستکارییەکانی خۆی وەک پاس دراو',
-'right-patrolmarks' => 'دیتنی نیشان کراوەکان وەک پاس دراو لە دوایین گۆڕانکارییەکاندا',
+'right-patrolmarks' => 'دیتنی نیشانەکانی پاسدان لە دوایین گۆڕانکارییەکاندا',
 'right-unwatchedpages' => 'دیتنی پێرستێک لە پەڕە چاودێری نەکراوەکان',
 'right-mergehistory' => 'میژووی پەڕەکان بکە یەک',
 'right-userrights' => 'دەستکاری مافەکانی هەموو بەکارهێنەران',
@@ -2893,13 +2893,29 @@ $1',
 'minutes-abbrev' => '$1خ',
 'hours-abbrev' => '$1ک',
 'days-abbrev' => '$1ڕ',
-'seconds' => '{{PLURAL:$1|$1 چرکە|$1 چرکە}}',
-'minutes' => '{{PLURAL:$1|$1 خولەک|$1 خولەک}}',
-'hours' => '{{PLURAL:$1|$1 کاتژمێر|$1 کاتژمێر}}',
-'days' => '{{PLURAL:$1|$1 ڕۆژ|$1 ڕۆژ}}',
-'ago' => '$1 پێش',
+'seconds' => '{{PLURAL:$1|$1 چرکە}}',
+'minutes' => '{{PLURAL:$1|$1 خولەک}}',
+'hours' => '{{PLURAL:$1|$1 کاتژمێر}}',
+'days' => '{{PLURAL:$1|$1 ڕۆژ}}',
+'weeks' => '{{PLURAL:$1|$1 حەفتە}}',
+'months' => '{{PLURAL:$1|$1 مانگ}}',
+'years' => '{{PLURAL: $1|$1 ساڵ}}',
+'ago' => '$1 لەمە پێش',
 'just-now' => 'ھەرئێستا',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|کاتژمێر}} لەمه پێش',
+'minutes-ago' => '$1 {{PLURAL:$1|خولەک}} لەمە پێش',
+'seconds-ago' => '$1 {{PLURAL:$1|چرکە}} لەمە پێش',
+'monday-at' => 'دووشەممە $1',
+'tuesday-at' => 'سێشەممە $1',
+'wednesday-at' => 'چوارشەممە $1',
+'thursday-at' => 'پێنجشەممە $1',
+'friday-at' => 'ھەینی $1',
+'saturday-at' => 'شەممە $1',
+'sunday-at' => 'یەکشەممە $1',
+'yesterday-at' => 'دوێنێ $1',
+
 # Bad image list
 'bad_image_list' => 'فۆرمات بەم شێوەی خوارەوەیە:
 
index 5c91131..2c36d05 100644 (file)
@@ -3230,10 +3230,10 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 'pageinfo-redirects-name' => 'Počet přesměrování na tuto stránku',
 'pageinfo-subpages-name' => 'Podstránky této stránky',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|přesměrování}}; $3 {{PLURAL:$3|nepřesměrování}})',
-'pageinfo-firstuser' => 'Zakladatel stránky',
+'pageinfo-firstuser' => 'Stránku vytvořil',
 'pageinfo-firsttime' => 'Datum založení stránky',
-'pageinfo-lastuser' => 'Nejnovější editor',
-'pageinfo-lasttime' => 'Datum nejnovější editace',
+'pageinfo-lastuser' => 'Naposledy editoval',
+'pageinfo-lasttime' => 'Datum poslední editace',
 'pageinfo-edits' => 'Celkový počet editací',
 'pageinfo-authors' => 'Celkový počet různých autorů',
 'pageinfo-recent-edits' => 'Počet nedávných ($1) editací',
index ed2b36b..54e7628 100644 (file)
@@ -1611,7 +1611,7 @@ Vær venlig at gennemse og bekræft dine ændringer.',
 'rc-change-size' => '$1 {{PLURAL:$1|Byte|Bytes}}',
 'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} efter ændring',
 'newsectionsummary' => '/* $1 */ nyt afsnit',
-'rc-enhanced-expand' => 'Vis detaljer (kræver JavaScript)',
+'rc-enhanced-expand' => 'Vis detaljer',
 'rc-enhanced-hide' => 'Skjul detaljer',
 'rc-old-title' => 'oprindeligt oprettet som "$1"',
 
index 3b1f43c..3192912 100644 (file)
@@ -665,7 +665,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' => 'Über {{SITENAME}}',
 'aboutpage' => 'Project:Über_{{SITENAME}}',
-'copyright' => 'Der Inhalt ist verfügbar unter der Lizenz $1.',
+'copyright' => 'Der Inhalt ist verfügbar unter der Lizenz $1, sofern nicht anders angegeben.',
 'copyrightpage' => '{{ns:project}}:Urheberrechte',
 'currentevents' => 'Aktuelle Ereignisse',
 'currentevents-url' => 'Project:Aktuelle Ereignisse',
index c6f696f..d963e0d 100644 (file)
@@ -568,7 +568,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' => 'Heqa {{SITENAME}}i de',
 'aboutpage' => 'Project:Heqdê cı',
-'copyright' => 'Zerrek bınê $1 dero.',
+'copyright' => 'Zerrekacı $1 bındı not biya.',
 'copyrightpage' => '{{ns:project}}:Heqa telifi',
 'currentevents' => 'Veng u vac',
 'currentevents-url' => 'Project:Veng u vac',
@@ -657,6 +657,7 @@ Seba lista pelanê xasanê vêrdeyan reca kena: [[Special:SpecialPages|{{int:spe
 # General errors
 'error' => 'Xırab',
 'databaseerror' => 'Xeta serveri',
+'databaseerror-query' => 'Perskerdış:$1',
 'databaseerror-function' => 'Fonksiyon: $1',
 'databaseerror-error' => 'Xırab: $1',
 'laggedslavemode' => 'Diqet: Pel de newe vıraşteyi belka çini .',
@@ -888,6 +889,7 @@ Bıne vındere u newe ra dest pê bıkere.',
 # Special:PasswordReset
 'passwordreset' => 'Parola reset ke',
 'passwordreset-text-one' => 'Na form de parola reset kerdış temamiye',
+'passwordreset-text-many' => '{{PLURAL:$1|Qande parola reset kerdışi cayanra taynın pırkeri}}',
 'passwordreset-legend' => 'Parola reset ke',
 'passwordreset-disabled' => 'Parola reset kerdış ena viki sera qefılneyayo.',
 'passwordreset-username' => 'Nameyê karberi:',
@@ -4341,10 +4343,15 @@ Ena sita dı newke xırabiya teknik esta.',
 'rotate-comment' => 'Resim heta sehata $1 {{PLURAL:$1|derece|derecey}} bi cerx',
 
 # Limit report
+'limitreport-title' => 'Agoznaye malumata profili:',
+'limitreport-cputime' => 'CPU dem karnayış',
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|saniye|saniyeyan}}',
+'limitreport-walltime' => 'Raştay demdı bıkarn',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|saniye|saniyeyan}}',
 'limitreport-postexpandincludesize-value' => '$1/$2 bayt',
 'limitreport-templateargumentsize' => 'Ebata hacetandi şablonan',
 'limitreport-templateargumentsize-value' => '$1/$2 bayt',
+'limitreport-expansiondepth' => 'Tewr veşi herayina dergbiyayışi',
+'limitreport-expensivefunctioncount' => 'Amoriya fonksiyonde vay agozni',
 
 );
index baec32d..04b7ff0 100644 (file)
@@ -261,7 +261,7 @@ $messages = array(
 $1',
 'pool-errorunknown' => 'ކޮންމެވެސް ކުށެއް',
 
-# 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) and the disambiguation template definition (see disambiguations).
+# 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 ގެ ދަށުން ލިބެން އެބަހުއްޓެވެ.',
index a6d47b2..9e2d3c8 100644 (file)
@@ -370,10 +370,10 @@ $messages = array(
 'tog-extendwatchlist' => 'Επέκταση της λίστας παρακολούθησης ώστε να δείχνει όλες τις αλλαγές, όχι μόνο τις πιο πρόσφατες',
 'tog-usenewrc' => 'Ομαδοποίηση αλλαγών ανά σελίδα στις πρόσφατες αλλαγές και στη λίστα παρακολούθησης (απαιτεί JavaScript)',
 'tog-numberheadings' => 'Αυτόματη αρίθμηση επικεφαλίδων',
-'tog-showtoolbar' => 'Εμφάνιση μπάρας εργαλείων επεξεργασίας (απαιτεί JavaScript)',
-'tog-editondblclick' => 'Επεξεργασία σελίδων με διπλό κλικ (απαιτεί JavaScript)',
+'tog-showtoolbar' => 'Εμφάνιση μπάρας εργαλείων επεξεργασίας',
+'tog-editondblclick' => 'Επεξεργασία σελίδων με διπλό κλικ',
 'tog-editsection' => 'Ενεργοποίηση επεξεργασίας ενοτήτων μέσω των συνδέσμων [επεξεργασία]',
-'tog-editsectiononrightclick' => 'Ενεργοποίηση επεξεργασίας ενοτήτων με δεξί κλικ στους τίτλους των ενοτήτων (απαιτεί JavaScript)',
+'tog-editsectiononrightclick' => 'Ενεργοποίηση επεξεργασίας ενοτήτων με δεξί κλικ στους τίτλους των ενοτήτων',
 'tog-showtoc' => 'Εμφάνιση πίνακα περιεχομένων (για σελίδες με περισσότερες από τρεις κεφαλίδες)',
 'tog-rememberpassword' => 'Διατήρηση της σύνδεσής μου σε αυτόν τον περιηγητή (για μέγιστο $1 {{PLURAL:$1|ημέρας|ημερών}})',
 'tog-watchcreations' => 'Προσθήκη σελίδων που δημιουργώ και αρχείων που ανεβάζω στη λίστα παρακολούθησής μου',
@@ -692,6 +692,7 @@ $1',
 # General errors
 'error' => 'Σφάλμα',
 'databaseerror' => 'Σφάλμα στη βάση δεδομένων',
+'databaseerror-error' => 'Σφάλμα: $1',
 'laggedslavemode' => "'''Προειδοποίηση:''' Η σελίδα μπορεί να μην περιέχει πρόσφατες ενημερώσεις.",
 'readonly' => 'Κλειδωμένη βάση δεδομένων',
 'enterlockreason' => 'Εισαγάγετε μια αιτία για το κλείδωμα και μια εκτίμησή για το πότε το κλείδωμα αυτό θα αρθεί',
@@ -1499,8 +1500,8 @@ $1",
 'recentchangesdays-max' => '($1 {{PLURAL:$1|ημέρα|ημέρες}} το μέγιστο)',
 'recentchangescount' => 'Αριθμός επεξεργασιών που να εμφανίζονται για προεπιλογή.',
 'prefs-help-recentchangescount' => 'Αυτό περιλαμβάνει τις πρόσφατες αλλαγές, τα ιστορικά των σελίδων, και τα αρχεία διαγραφών.',
-'prefs-help-watchlist-token2' => 'Αυτό είναι το μυστικό κλειδί για την τροφοδοσία web της λίστας παρακολούθησής σας.
-Όποιος τον γνωρίζει θα είναι σε θέση να διαβάσει την λίστα παρακολούθησης σας, οπότε μην τον μοιράζεστε.
+'prefs-help-watchlist-token2' => 'Αυτό είναι το μυστικό κλειδί για την web τροφοδοσία  της λίστας παρακολούθησής σας.
+Όποιος το γνωρίζει θα είναι σε θέση να διαβάσει την λίστα παρακολούθησης σας, οπότε μην τον μοιράζεστε.
 [[Special: ResetTokens|Κάνε κλικ εδώ εάν θέλετε να τον επαναφέρετε]].',
 'savedprefs' => 'Οι προτιμήσεις σας έχουν αποθηκευτεί.',
 'timezonelegend' => 'Ζώνη ώρας:',
index a63d1f8..225a6b2 100644 (file)
@@ -321,6 +321,7 @@ $magicWords = array(
        'revisionyear'            => array( 1,    'REVISIONYEAR' ),
        'revisiontimestamp'       => array( 1,    'REVISIONTIMESTAMP' ),
        'revisionuser'            => array( 1,    'REVISIONUSER' ),
+       'revisionsize'            => array( 1,    'REVISIONSIZE' ),
        'plural'                  => array( 0,    'PLURAL:' ),
        'fullurl'                 => array( 0,    'FULLURL:' ),
        'fullurle'                => array( 0,    'FULLURLE:' ),
@@ -903,7 +904,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'            => 'About {{SITENAME}}',
 'aboutpage'            => 'Project:About',
-'copyright'            => 'Content is available under $1.',
+'copyright'            => 'Content is available under $1 unless otherwise noted.',
 'copyrightpage'        => '{{ns:project}}:Copyrights',
 'currentevents'        => 'Current events',
 'currentevents-url'    => 'Project:Current events',
@@ -1396,13 +1397,13 @@ The reason given is ''$2''.
 * Intended blockee: $7
 
 You can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.
-You cannot use the 'email this user' feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.
+You cannot use the \"email this user\" feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.
 Your current IP address is $3, and the block ID is #$5.
 Please include all above details in any queries you make.",
-'autoblockedtext'                  => 'Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.
+'autoblockedtext'                  => "Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.
 The reason given is:
 
-:\'\'$2\'\'
+:''$2''
 
 * Start of block: $8
 * Expiry of block: $6
@@ -1410,10 +1411,10 @@ The reason given is:
 
 You may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.
 
-Note that you may not use the "email this user" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.
+Note that you may not use the \"email this user\" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.
 
 Your current IP address is $3, and the block ID is #$5.
-Please include all above details in any queries you make.',
+Please include all above details in any queries you make.",
 'blockednoreason'                  => 'no reason given',
 'whitelistedittext'                => 'You have to $1 to edit pages.',
 'confirmedittext'                  => 'You must confirm your email address before editing pages.
@@ -1979,7 +1980,7 @@ Check HTML tags.',
 'badsiglength'                  => 'Your signature is too long.
 It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'yourgender'                    => 'How do you prefer to be described?',
-'gender-unknown'                => 'I prefer not to detail',
+'gender-unknown'                => 'I prefer not to say',
 'gender-male'                   => 'He edits wiki pages',
 'gender-female'                 => 'She edits wiki pages',
 'prefs-help-gender'             => 'Setting this preference is optional.
@@ -2258,12 +2259,13 @@ To view or search previously uploaded files go to the [[Special:FileList|list of
 
 To include a file in a page, use a link in one of the following forms:
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' to use the full version of the file
-* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' to use a 200 pixel wide rendition in a box in the left margin with 'alt text' as description
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' to use a 200 pixel wide rendition in a box in the left margin with \"alt text\" as description
 * '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' for directly linking to the file without displaying the file",
 'upload-permitted'            => 'Permitted file types: $1.',
 'upload-preferred'            => 'Preferred file types: $1.',
 'upload-prohibited'           => 'Prohibited file types: $1.',
 'uploadfooter'                => '-', # do not translate or duplicate this message to other languages
+'upload-default-description'  => '-', # do not translate or duplicate this message to other languages
 'uploadlog'                   => 'upload log',
 'uploadlogpage'               => 'Upload log',
 'uploadlogpagetext'           => 'Below is a list of the most recent file uploads.
@@ -2506,21 +2508,21 @@ You may want to try at a less busy time.',
 'upload_source_file' => '(a file on your computer)',
 
 # Special:ListFiles
-'listfiles-summary'     => 'This special page shows all uploaded files.',
-'listfiles_search_for'  => 'Search for media name:',
-'imgfile'               => 'file',
-'listfiles'             => 'File list',
-'listfiles_thumb'       => 'Thumbnail',
-'listfiles_date'        => 'Date',
-'listfiles_name'        => 'Name',
-'listfiles_user'        => 'User',
-'listfiles_size'        => 'Size',
-'listfiles_description' => 'Description',
-'listfiles_count'       => 'Versions',
-'listfiles-show-all'    => 'Include old versions of images',
-'listfiles-latestversion' => 'Current version',
+'listfiles-summary'           => 'This special page shows all uploaded files.',
+'listfiles_search_for'        => 'Search for media name:',
+'imgfile'                     => 'file',
+'listfiles'                   => 'File list',
+'listfiles_thumb'             => 'Thumbnail',
+'listfiles_date'              => 'Date',
+'listfiles_name'              => 'Name',
+'listfiles_user'              => 'User',
+'listfiles_size'              => 'Size',
+'listfiles_description'       => 'Description',
+'listfiles_count'             => 'Versions',
+'listfiles-show-all'          => 'Include old versions of images',
+'listfiles-latestversion'     => 'Current version',
 'listfiles-latestversion-yes' => 'Yes',
-'listfiles-latestversion-no' => 'No',
+'listfiles-latestversion-no'  => 'No',
 
 # File description page
 'file-anchor-link'                  => 'File',
@@ -2970,7 +2972,7 @@ Future changes to this page and its associated talk page will be listed there.',
 'watchmethod-recent'   => 'checking recent edits for watched pages',
 'watchmethod-list'     => 'checking watched pages for recent edits',
 'watchlistcontains'    => 'Your watchlist contains $1 {{PLURAL:$1|page|pages}}.',
-'iteminvalidname'      => "Problem with item '$1', invalid name...",
+'iteminvalidname'      => 'Problem with item "$1", invalid name...',
 'wlnote'               => "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}, as of $3, $4.",
 'wlshowlast'           => 'Show last $1 hours $2 days $3',
 'watchlist-options'    => 'Watchlist options',
index ded7b3d..ec94bae 100644 (file)
@@ -790,9 +790,9 @@ El administrador que lo ha bloqueado ofrece esta explicación: "$3".',
 # Login and logout pages
 'logouttext' => '"\'Usted está ahora desconectado."\'
 Tenga en cuenta que algunas páginas pueden continuar mostrándose como si todavía estuviera conectado, hasta que borres la caché de tu navegador.',
-'welcomeuser' => '¡Bienvenido, $1!',
-'welcomecreation-msg' => 'Tu cuenta ha sido creada.
-No olvides cambiar tus [[Special:Preferences|preferencias de {{SITENAME}} ]].',
+'welcomeuser' => '¡Te damos la bienvenida, $1!',
+'welcomecreation-msg' => 'Se ha creado tu cuenta.
+No olvides personalizar tus [[Special:Preferences|preferencias de {{SITENAME}}]].',
 'yourname' => 'Nombre de usuario:',
 'userlogin-yourname' => 'Usuario',
 'userlogin-yourname-ph' => 'Escribe tu nombre de usuario',
@@ -984,7 +984,7 @@ Contraseña temporal: $2',
 
 # Special:ChangeEmail
 'changeemail' => 'Cambiar la dirección de correo electrónico',
-'changeemail-header' => 'Cambiar la dirección de correo electrónico de la cuenta',
+'changeemail-header' => 'Cambiar la dirección de correo de la cuenta',
 'changeemail-text' => 'Rellena este formulario para cambiar tu dirección de correo electrónico. Debes introducir la contraseña para confirmar este cambio.',
 'changeemail-no-info' => 'Debes iniciar sesión para acceder directamente a esta página.',
 'changeemail-oldemail' => 'Dirección de correo electrónico actual:',
@@ -1003,7 +1003,7 @@ Deberías hacerlo si accidentalmente la has compartido con alguien o si su cuent
 'resettokens-legend' => 'Restablecer claves',
 'resettokens-tokens' => 'Claves:',
 'resettokens-token-label' => '$1 (valor actual: $2)',
-'resettokens-watchlist-token' => 'Lista de seguimiento de la red de claves',
+'resettokens-watchlist-token' => 'Clave para la lista de seguimiento (RSS/Atom) de los [[special:Watchlist|cambios a las páginas en tu lista de segumiento]]',
 'resettokens-done' => 'Restablecimiento de claves.',
 'resettokens-resetbutton' => 'Restablecer las claves',
 
@@ -1541,9 +1541,9 @@ Mientras tanto puedes buscar mediante Google, pero ten en cuenta que sus índice
 'recentchangesdays-max' => '(máximo {{PLURAL:$1|un día|$1 días}})',
 'recentchangescount' => 'Número de ediciones a mostrar de manera predeterminada:',
 'prefs-help-recentchangescount' => 'Esto incluye cambios recientes, historiales de página, y registros.',
-'prefs-help-watchlist-token2' => 'Esta es la llave secreta al feed de tu lista de seguimiento web.
-Toda persona que la sepa será capaz de leer tu lista, así que no la compartiremos.
-[[Special:ResetTokens|Has clic aquí si necesitas reiniciarlo]].',
+'prefs-help-watchlist-token2' => 'Esta es la clave secreta para el canal de contenido web de tu lista de seguimiento.
+Cualquier persona que la conozca podría leer tu lista, así que no la compartas.
+[[Special:ResetTokens|Pulsa aquí si necesitas restablecerla]].',
 'savedprefs' => 'Tus preferencias han sido guardadas.',
 'timezonelegend' => 'Zona horaria:',
 'localtime' => 'Hora local:',
@@ -2295,6 +2295,7 @@ Las entradas <del>tachadas</del> han sido resueltas.',
 'mostrevisions' => 'Artículos con más ediciones',
 'prefixindex' => 'Todas las páginas con prefijo',
 'prefixindex-namespace' => 'Todas las páginas con el prefijo (espacio de nombres $1)',
+'prefixindex-strip' => 'Prefijo de la hilera en la lista',
 'shortpages' => 'Páginas cortas',
 'longpages' => 'Páginas largas',
 'deadendpages' => 'Páginas sin salida',
@@ -3266,7 +3267,7 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista
 'pageinfo-length' => 'Longitud de la página (en bytes)',
 'pageinfo-article-id' => 'Identificador ID de la página',
 'pageinfo-language' => 'Idioma de la página',
-'pageinfo-robot-policy' => 'Indexación por robots',
+'pageinfo-robot-policy' => 'Indización por robots',
 'pageinfo-robot-index' => 'Permitido',
 'pageinfo-robot-noindex' => 'No permitido',
 'pageinfo-views' => 'Número de vistas',
@@ -4250,17 +4251,17 @@ En otro caso, puedes usar el siguiente formulario. Tu comentario será añadido
 'rotate-comment' => 'Imagen girada por $1 {{PLURAL:$1|grado|grados}} en el sentido de las agujas del reloj',
 
 # Limit report
-'limitreport-title' => 'Analizador de datos de perfiles:',
+'limitreport-title' => 'Datos de perfilado del analizador:',
 'limitreport-cputime' => 'Tiempo de uso de CPU',
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
-'limitreport-walltime' => 'Tiempo Real de uso',
+'limitreport-walltime' => 'Tiempo real de uso',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
-'limitreport-ppvisitednodes' => 'Preprocesador visitó la cantidad de nodos',
-'limitreport-ppgeneratednodes' => 'Preprocesador genera el número de nodos',
-'limitreport-postexpandincludesize' => 'Post-Expand incluyen el tamaño',
+'limitreport-ppvisitednodes' => 'N.º de nodos visitados por el preprocesador',
+'limitreport-ppgeneratednodes' => 'N.º de nodos generados por el preprocesador',
+'limitreport-postexpandincludesize' => 'Tamaño de inclusión posexpansión',
 'limitreport-postexpandincludesize-value' => '$1/$2 bytes',
 'limitreport-templateargumentsize' => 'Argumento del tamaño de la plantilla',
 'limitreport-templateargumentsize-value' => '$1/$2 bytes',
-'limitreport-expansiondepth' => 'Máxima expansión de profundidad',
+'limitreport-expansiondepth' => 'Profundidad máxima de expansión',
 
 );
index 3947674..9412b16 100644 (file)
@@ -623,6 +623,8 @@ Käibel olevad erileheküljed on loetletud leheküljel [[Special:SpecialPages|{{
 # General errors
 'error' => 'Viga',
 'databaseerror' => 'Andmebaasi viga',
+'databaseerror-text' => 'Esines andmebaasipäringu tõrge.
+See võib viidata veale tarkvaras.',
 'databaseerror-textcl' => 'Esines andmebaasipäringu tõrge.',
 'databaseerror-query' => 'Päring: $1',
 'databaseerror-function' => 'Funktsioon: $1',
@@ -2178,7 +2180,7 @@ Igal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise 
 'shortpages' => 'Lühikesed leheküljed',
 'longpages' => 'Pikad leheküljed',
 'deadendpages' => 'Edasipääsuta leheküljed',
-'deadendpagestext' => 'Järgmised leheküljed ei viita ühelegi teisele viki leheküljele.',
+'deadendpagestext' => 'Järgmised leheküljed ei viita ühelegi teisele {{GRAMMAR:genitive|{{SITENAME}}}} leheküljele.',
 'protectedpages' => 'Kaitstud leheküljed',
 'protectedpages-indef' => 'Ainult määramata ajani kaitstud',
 'protectedpages-cascade' => 'Ainult kaskaadkaitsega',
index 7ea78fd..825466d 100644 (file)
@@ -881,7 +881,7 @@ Azken erregistroko sarrera ematen da azpian erreferentzia gisa:",
 'templatesusedsection' => 'Atal honetan erabiltzen {{PLURAL:$1|den txantiloia|diren txantiloiak}}:',
 'template-protected' => '(babestua)',
 'template-semiprotected' => '(erdi-babestua)',
-'hiddencategories' => 'Orrialde hau {{PLURAL:$1|kategoria izkutu bateko|$1 kategoria izkutuko}} kide da:',
+'hiddencategories' => 'Orri hau ezkutuko {{PLURAL:$1|kategoria bateko|$1 kategoriatako}} kide da:',
 'edittools' => '<!-- Hemen jarritako testua aldaketa eta igoera formularioen azpian agertuko da. -->',
 'nocreatetext' => 'Gune honek orrialde berriak sortzeko gaitasuna mugatu du. Atzera egin dezakezu existitzen den orrialde bat aldatzeko, edo [[Special:UserLogin|saio hasi edo kontua sortu]].',
 'nocreate-loggedin' => 'Ez duzu orri berriak sortzeko baimenik.',
@@ -1914,7 +1914,7 @@ Mesedez, kontuan izan beste webgune batzutatik URL zuzena erabiliz lotura izan d
 Erregistro mota, erabiltzailearen izena edota orrialdearen izena iragaziz bistaratu daiteke. Letra larriak eta xeheak bereizten dira.',
 'logempty' => 'Ez dago emaitzarik erregistroan.',
 'log-title-wildcard' => 'Testu honekin hasten diren izenburuak bilatu',
-'showhideselectedlogentries' => 'Erakutsi/izkutatu aukeratutako log sarrerak',
+'showhideselectedlogentries' => 'Erakutsi/ezkutatu aukeratutako log sarrerak',
 
 # Special:AllPages
 'allpages' => 'Orri guztiak',
@@ -2379,9 +2379,9 @@ Ikus [[Special:BlockList|blokeoen zerrenda]] blokeoak aztertzeko.',
 'blocklist' => 'Blokeatutako erabiltzaileak',
 'ipblocklist' => 'Blokeatutako erabiltzaileak',
 'ipblocklist-legend' => 'Blokeatutako erabiltzaile bat bilatu',
-'blocklist-userblocks' => 'Izkutatu kontuaren blokeak',
-'blocklist-tempblocks' => 'Izkutatu behin-behineko blokeoak',
-'blocklist-addressblocks' => 'Izkutatu IP bakarretako blokeoak',
+'blocklist-userblocks' => 'Ezkutatu kontu-blokeatzeak',
+'blocklist-tempblocks' => 'Ezkutatu behin-behineko blokeoak',
+'blocklist-addressblocks' => 'Ezkutatu IP bakarreko blokeoak',
 'blocklist-rangeblocks' => 'Izkuntatu eremu blokeoak',
 'blocklist-timestamp' => 'Eguna eta ordua',
 'blocklist-target' => 'Helburua',
@@ -2432,7 +2432,7 @@ Ikus [[Special:BlockList|blokeoen zerrenda]] aktibo dauden blokeoak eta debekuak
 'ipb_already_blocked' => '"$1" badago blokeatuta',
 'ipb-needreblock' => '$1 dagoeneko blokeaturik dago. Ezarpenak aldatu nahi al dituzu?',
 'ipb-otherblocks-header' => 'Bestelako {{PLURAL:$1|blokeoa|blokeoak}}',
-'unblock-hideuser' => 'Ezin duzu erabiltzaile hau desblokeatu, bere erabiltzaile izena izkutatua izan baita.',
+'unblock-hideuser' => 'Ezin duzu erabiltzaile hau desblokeatu, haren erabiltzaile izena ezkutatua izan baita.',
 'ipb_cant_unblock' => 'Errorea: Ez da $1 IDa duen blokeoa aurkitu. Baliteke blokeoa jada kenduta egotea.',
 'ipb_blocked_as_range' => 'Akatsa: $1 IPa ez dago zuzenean blokeatuta eta ezin da blokeoa kendu.
 Hala ere, $2-(r)en parte denez, blokeoa kendu daiteke.',
@@ -3573,13 +3573,14 @@ Halaber [[Special:EditWatchlist|aldatzaile estandarra]] erabil dezakezu.',
 'logentry-delete-delete' => '$1 wikilariak $3 orria {{GENDER:$2|ezabatu}} du',
 'logentry-delete-restore' => '$1(e)k $3 orrialdea {{GENDER:$2|berrezarri}} du',
 'logentry-delete-event' => '$1 wikilariak ikusgaitasuna aldatu {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, $3 orrian: $4',
+'logentry-delete-revision' => '$1 erabiltzaileak {{PLURAL:$5|berrikuste baten|$5 berrikusteren}} ikusgaitasuna aldatu du «$3» orrian: $4',
 'logentry-suppress-delete' => '$1 erabiltzaileak $3 orrialdea {{GENDER:$2|ezabatu}} du',
-'logentry-suppress-event' => '$1 wikilariak ezkutuan ikusgaitasuna aldatu {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, $3 orrian: $4',
-'revdelete-content-hid' => 'edukia izkutatua',
-'revdelete-summary-hid' => 'aldaketa laburpena izkutatua',
+'logentry-suppress-event' => '$1 wikilariak ezkutuan ikusgaitasuna aldatu {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, «$3» orrian: $4',
+'revdelete-content-hid' => 'edukia ezkutatu da',
+'revdelete-summary-hid' => 'edizioaren laburpena ezkutatu da',
 'revdelete-uname-hid' => 'lankide izena ezkutatua',
 'revdelete-content-unhid' => 'eduki ezkutua erakutsi',
-'revdelete-summary-unhid' => 'aldaketa laburpen izkutua erakutsi',
+'revdelete-summary-unhid' => 'edizioaren laburpen ezkutua bistaratu da',
 'revdelete-uname-unhid' => 'lankide ezkutua erakutsi',
 'revdelete-restricted' => 'administratzaileentzako mugak ezarri dira',
 'revdelete-unrestricted' => 'administratzaileentzako mugak kendu dira',
index 62f1cfb..4260f6b 100644 (file)
@@ -34,6 +34,7 @@
  * @author Pouyana
  * @author Reza1615
  * @author Roozbeh Pournader <roozbeh at gmail.com>
+ * @author Rtemis
  * @author Sahim
  * @author Surena
  * @author Taha
@@ -444,7 +445,7 @@ $messages = array(
 'tog-extendwatchlist' => 'گسترش فهرست پی‌گیری‌ها برای نمایش همهٔ تغییرات، نه فقط آخرین‌ها',
 'tog-usenewrc' => 'گروه‌بندی تغییرات بر پایه صفحه در تغییرات اخیر و فهرست پیگیری‌ها (نیازمند جاوااسکریپت)',
 'tog-numberheadings' => 'شماره‌گذاری خودکار عنوان‌ها',
-'tog-showtoolbar' => 'نوار ابزار جعبهٔ ویرایش نمایش یابد (نیازمند جاوااسکریپت)',
+'tog-showtoolbar' => 'نوار ابزار جعبهٔ ویرایش نمایش یابد',
 'tog-editondblclick' => 'ویرایش صفحه‌ها با دوکلیک (نیازمند جاوااسکریپت)',
 'tog-editsection' => 'ویرایش بخش‌ها از طریق پیوندهای [ویرایش] فعال باشد',
 'tog-editsectiononrightclick' => 'امکان ویرایش بخش‌ها با کلیک راست روی عنوان‌های بخش (نیازمند جاوااسکریپت)',
@@ -1893,7 +1894,7 @@ $1",
 'rc_categories_any' => 'هر کدام',
 'rc-change-size-new' => '$1 {{PLURAL:$1|بایت}} پس از تغییر',
 'newsectionsummary' => '/* $1 */ بخش جدید',
-'rc-enhanced-expand' => 'نمایش جزئیات (نیازمند جاوااسکریپت)',
+'rc-enhanced-expand' => 'نمایش جزئیات',
 'rc-enhanced-hide' => 'نهفتن جزئیات',
 'rc-old-title' => 'ایجادشده با عنوان اصلی «$1»',
 
index 756d7ba..5c7fb19 100644 (file)
@@ -18,6 +18,7 @@
  * @author Jaakonam
  * @author Jack Phoenix
  * @author Jafeluv
+ * @author Kaanteli
  * @author Kaganer
  * @author Kulmalukko
  * @author Linnea
@@ -27,6 +28,7 @@
  * @author Ochs
  * @author Olli
  * @author Pxos
+ * @author Samoasambia
  * @author Silvonen
  * @author Snidata
  * @author Str4nd
@@ -562,7 +564,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' => 'Tietoja {{GRAMMAR:elative|{{SITENAME}}}}',
 'aboutpage' => 'Project:Tietoja',
-'copyright' => 'Sisältö on käytettävissä lisenssillä $1.',
+'copyright' => 'Sisältö on käytettävissä lisenssillä $1, ellei toisin ole mainittu.',
 'copyrightpage' => '{{ns:project}}:Tekijänoikeudet',
 'currentevents' => 'Ajankohtaista',
 'currentevents-url' => 'Project:Ajankohtaista',
@@ -2036,7 +2038,7 @@ Voit tarvittaessa muokata [$2 tiedoston kuvaussivua] kohteessa.',
 'filerevert-legend' => 'Tiedoston palautus',
 'filerevert-intro' => '<span class="plainlinks">Olet palauttamassa tiedostoa \'\'\'[[Media:$1|$1]]\'\'\' [$4 versioon, joka luotiin $2 kello $3].</span>',
 'filerevert-comment' => 'Syy',
-'filerevert-defaultcomment' => 'Palautettiin versioon, joka luotiin $1 kello $2',
+'filerevert-defaultcomment' => 'Palautettiin versioon, joka luotiin $1 kello $2 (UTC)',
 'filerevert-submit' => 'Palauta',
 'filerevert-success' => '<span class="plainlinks">\'\'\'[[Media:$1|$1]]\'\'\' on palautettu [$4 versioon, joka luotiin $2 kello $3].</span>',
 'filerevert-badversion' => 'Tiedostosta ei ole luotu versiota kyseisellä ajan hetkellä.',
@@ -4100,7 +4102,14 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi
 'rotate-comment' => 'Kuvaa käännettiin $1 aste{{PLURAL:$1||tta}} myötäpäivään',
 
 # Limit report
+'limitreport-title' => 'Jäsentimen profilointitiedot',
+'limitreport-cputime' => 'Suorittimen ajankäyttö',
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekunti|sekuntia}}',
+'limitreport-walltime' => 'Oikea ajankäyttö',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekunti|sekuntia}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 tavua',
+'limitreport-templateargumentsize' => 'Mallineen argumenttien koko',
+'limitreport-templateargumentsize-value' => '$1/$2 tavua',
+'limitreport-expansiondepth' => 'Korkein laajennussyvyys',
 
 );
index 4683c16..2cda462 100644 (file)
@@ -359,7 +359,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' => 'Um {{SITENAME}}',
 'aboutpage' => 'Project:Um',
-'copyright' => 'Innihald er tøkt undir $1.',
+'copyright' => 'Innihaldið er tøkt undir $1, um ikki annað er viðmerkt.',
 'copyrightpage' => '{{ns:project}}:Upphavsrættur',
 'currentevents' => 'Aktuellar hendingar',
 'currentevents-url' => 'Project:Aktuellar hendingar',
index e86e769..a7a287f 100644 (file)
@@ -397,7 +397,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Masquer les modifications surveillées dans les modifications récentes',
 'tog-newpageshidepatrolled' => 'Masquer les pages surveillées dans la liste des nouvelles pages',
 'tog-extendwatchlist' => 'Étendre la liste de suivi pour afficher toutes les modifications et pas uniquement les plus récentes',
-'tog-usenewrc' => 'Grouper les changements dans les modifications récentes et la liste de suivi (nécessite JavaScript)',
+'tog-usenewrc' => 'Grouper les changements par page dans les modifications récentes et la liste de suivi (nécessite JavaScript)',
 'tog-numberheadings' => 'Numéroter automatiquement les titres de section',
 'tog-showtoolbar' => "Montrer la barre d'outils de modification (nécessite JavaScript)",
 'tog-editondblclick' => 'Modifier des pages sur double-clic (nécessite JavaScript)',
@@ -638,7 +638,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' => 'À propos de {{SITENAME}}',
 'aboutpage' => 'Project:À propos',
-'copyright' => 'Le contenu est disponible sous licence $1 .',
+'copyright' => 'Le contenu est disponible sous licence $1 sauf mention contraire.',
 'copyrightpage' => '{{ns:project}}:Copyrights',
 'currentevents' => 'Actualités',
 'currentevents-url' => 'Project:Actualités',
@@ -721,6 +721,8 @@ Une liste des pages spéciales valides se trouve sur [[Special:SpecialPages|{{in
 # General errors
 'error' => 'Erreur',
 'databaseerror' => 'Erreur de la base de données',
+'databaseerror-text' => "Une erreur de requête de base de données s'est produite. Cela peut provenir d'un bogue dans le logiciel.",
+'databaseerror-textcl' => "Une erreur de requête de base de données s'est produite.",
 'databaseerror-query' => 'Requête : $1',
 'databaseerror-function' => 'Fonction : $1',
 'databaseerror-error' => 'Erreur : $1',
@@ -776,8 +778,8 @@ Essayez à nouveau dans quelques minutes.",
 'viewyourtext' => "Vous pouvez voir et copier le contenu de '''vos modifications''' à cette page :",
 'protectedinterface' => "Cette page fournit du texte d'interface pour le logiciel sur ce wiki, et est protégée pour éviter les abus.
 Pour ajouter ou modifier des traductions sur tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet de localisation de MediaWiki.",
-'editinginterface' => "'''Attention''': Vous êtes en train de modifier une page utilisée pour créer le texte de l'interface du logiciel. Les changements sur cette page se répercuteront dur l'apparence de l'interface utilisateur pour les autres utilisateurs de ce wiki.
-Pour ajouter ou modifier des traductions pour tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet d'internationalisation de MediaWiki.",
+'editinginterface' => "'''Attention''' : vous êtes en train de modifier une page utilisée pour créer le texte de l’interface du logiciel. Les changements sur cette page se répercuteront sur l’apparence de l’interface utilisateur pour les autres utilisateurs de ce wiki.
+Pour ajouter ou modifier des traductions pour tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet dinternationalisation de MediaWiki.",
 'cascadeprotected' => "Cette page est protégée car elle est incluse par {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l'option « protection en cascade » activée :
 $2",
 'namespaceprotected' => "Vous n'avez pas la permission de modifier les pages de l'espace de noms « '''$1''' ».",
@@ -1171,10 +1173,10 @@ Vous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l'av
 '''N'UTILISEZ PAS DE TRAVAUX SOUS DROIT D'AUTEUR SANS AUTORISATION EXPRESSE !'''",
 'longpageerror' => "'''Erreur: Le texte que vous avez soumis fait {{PLURAL:$1|un Kio|$1 Kio}}, ce qui dépasse la limite fixée à {{PLURAL:$2|un Kio|$2 Kio}}.'''
 Il ne peut pas être sauvegardé.",
-'readonlywarning' => "'''AVERTISSEMENT : la base de données a été verrouillée pour des opérations de maintenance. Vous ne pouvez donc pas publier vos modifications pour l'instant.'''
-Vous pouvez copier et coller votre texte dans un fichier texte et l'enregistrer pour plus tard.
+'readonlywarning' => "'''AVERTISSEMENT : la base de données a été verrouillée pour des opérations de maintenance. Vous ne pouvez donc pas publier vos modifications pour linstant.'''
+Vous pouvez copier et coller votre texte dans un fichier texte et lenregistrer pour plus tard.
 
-L'administrateur ayant verrouillé la base de données a donné l'explication suivante: $1",
+L’administrateur ayant verrouillé la base de données a donné l’explication suivante : $1",
 'protectedpagewarning' => "'''AVERTISSEMENT : cette page est protégée. Seuls les utilisateurs ayant le statut d'administrateur peuvent la modifier.'''<br />
 La dernière entrée du journal est affichée ci-dessous pour référence :",
 'semiprotectedpagewarning' => "'''Note :''' Cette page a été protégée de telle façon que seuls les contributeurs enregistrés puissent la modifier. La dernière entrée du journal est affichée ci-dessous pour référence :",
index 472b447..5f4b120 100644 (file)
@@ -11,6 +11,7 @@
  * @author Amire80
  * @author Dekel E
  * @author Drorsnir
+ * @author Guycn1
  * @author Hoo
  * @author Ijon
  * @author Inkbug
@@ -508,7 +509,7 @@ $messages = array(
 'morenotlisted' => 'רשימה זו אינה מלאה.',
 'mypage' => 'דף משתמש',
 'mytalk' => 'שיחה',
-'anontalk' => '×\94ש×\99×\97×\94 ×¢×\91×\95ר IP ×\96×\94',
+'anontalk' => '×\93×£ ×\94ש×\99×\97×\94 ×¢×\91×\95ר ×\9bת×\95×\91ת IP ×\96×\95',
 'navigation' => 'ניווט',
 'and' => '&#32;וגם',
 
@@ -1583,7 +1584,7 @@ $1",
 'badsiglength' => 'חתימתכם ארוכה מדי.
 אורך החתימה המרבי הוא {{PLURAL:$1|תו אחד|$1 תווים}}.',
 'yourgender' => 'איזה תיאור מתאים לך?',
-'gender-unknown' => '×\90×\99× ×\99 ×¨×\95צ×\94 ×\9cפר×\98',
+'gender-unknown' => '×\90×\99× ×\99 ×¨×\95צ×\94 ×\9c×\95×\9eר',
 'gender-male' => 'הוא עורך דפים בוויקי',
 'gender-female' => 'היא עורכת דפים בוויקי',
 'prefs-help-gender' => 'אין חובה למלא את ההעדפה הזאת.
@@ -2126,7 +2127,7 @@ $1',
 'linkstoimage-more' => 'יותר {{PLURAL:$1|מדף אחד מקשר|מ־$1 דפים מקשרים}} לקובץ זה.
 הרשימה הבאה מראה רק את {{PLURAL:$1|הדף הראשון שמקשר|$1 הדפים הראשונים שמקשרים}} לקובץ זה.
 ניתן לצפות ב[[Special:WhatLinksHere/$2|רשימה המלאה]].',
-'nolinkstoimage' => '×\90×\99×\9f ×\93פ×\99×\9d ×©משתמשים בקובץ זה.',
+'nolinkstoimage' => '×\90×\99×\9f ×\93פ×\99×\9d ×\94משתמשים בקובץ זה.',
 'morelinkstoimage' => 'ראו [[Special:WhatLinksHere/$1|דפים נוספים]] שמשתמשים בקובץ זה.',
 'linkstoimage-redirect' => '$1 (הפניה של קובץ) $2',
 'duplicatesoffile' => '{{PLURAL:$1|הקובץ הבא זהה|הקבצים הבאים זהים}} לקובץ זה ([[Special:FileDuplicateSearch/$2|לפרטים נוספים]]):',
@@ -2555,7 +2556,7 @@ $UNWATCHURL
 'deletepage' => 'מחיקה',
 'confirm' => 'אישור',
 'excontent' => 'תוכן היה: "$1"',
-'excontentauthor' => 'התוכן היה: "$1" (והתורם היחיד היה "[[Special:Contributions/$2|$2]]")',
+'excontentauthor' => 'התוכן היה: "$1" ({{gender:$2|והתורם היחיד היה|והתורמת היחידה הייתה}} [[Special:Contributions/$2|$2]])',
 'exbeforeblank' => 'תוכן לפני שרוקן היה: "$1"',
 'exblank' => 'הדף היה ריק',
 'delete-confirm' => 'מחיקת $1',
@@ -2611,7 +2612,7 @@ $UNWATCHURL
 'protectlogtext' => 'להלן רשימה של שינויי ההגנה על דפים.
 ראו גם את [[Special:ProtectedPages|רשימת הדפים המוגנים]] הנוכחית.',
 'protectedarticle' => 'הפעיל הגנה על [[$1]]',
-'modifiedarticleprotection' => 'ש×\99× ×\94 ×\90ת ×¨×\9eת ×\94×\94×\92× ×\94 ×©×\9c [[$1]]',
+'modifiedarticleprotection' => 'ש×\99× ×\94 ×\90ת ×\94×\92×\93ר×\95ת ×\94×\94×\92× ×\94 ×©×\9c "[[$1]]"',
 'unprotectedarticle' => 'ביטל את ההגנה על [[$1]]',
 'movedarticleprotection' => 'העביר את הגדרות ההגנה מ"[[$2]]" ל"[[$1]]"',
 'protect-title' => 'שינוי רמת ההגנה של "$1"',
@@ -2807,11 +2808,11 @@ $1',
 'ipbenableautoblock' => 'חסימה אוטומטית גם של כתובת ה־IP האחרונה שהשתמש בה ושל כל כתובת IP שינסה להשתמש בה בעתיד',
 'ipbsubmit' => 'חסימה',
 'ipbother' => 'זמן אחר:',
-'ipboptions' => 'שעת×\99×\99×\9d:2 hours,×\99×\95×\9d:1 day,ש×\9c×\95ש×\94 ×\99×\9e×\99×\9d:3 days,ש×\91×\95×¢:1 week,ש×\91×\95×¢×\99×\99×\9d:2 weeks,×\97×\95×\93ש:1 month,ש×\9c×\95ש×\94 ×\97×\95×\93ש×\99×\9d:3 months,ש×\99ש×\94 ×\97×\95×\93ש×\99×\9d:6 months,שנ×\94:1 year,×\9c×\96×\9e×\9f ×\91×\9cת×\99 ×\9e×\95×\92×\91×\9c:infinite',
+'ipboptions' => 'שעתיים:2 hours,יום:1 day,שלושה ימים:3 days,שבוע:1 week,שבועיים:2 weeks,חודש:1 month,שלושה חודשים:3 months,שישה חודשים:6 months,שנה:1 year,זמן בלתי מוגבל:infinite',
 'ipbotheroption' => 'אחר',
 'ipbotherreason' => 'סיבה אחרת/נוספת:',
 'ipbhidename' => 'הסתרת שם המשתמש מהעריכות ומהרשימות',
-'ipbwatchuser' => 'מעקב אחרי דפי המשתמש והשיחה של משתמש זה',
+'ipbwatchuser' => 'מעקב אחר דף המשתמש ודף השיחה של משתמש זה',
 'ipb-disableusertalk' => 'ביטול האפשרות של המשתמש לערוך את דף השיחה של עצמו בעת החסימה',
 'ipb-change-block' => 'חסימת המשתמש מחדש עם הגדרות אלה',
 'ipb-confirm' => 'אישור החסימה',
@@ -2868,7 +2869,7 @@ $1',
 'blocklogpage' => 'יומן חסימות',
 'blocklog-showlog' => 'משתמש זה נחסם בעבר. יומן החסימות מוצג למטה:',
 'blocklog-showsuppresslog' => 'משתמש זה נחסם והוסתר בעבר. יומן ההסתרות מוצג למטה:',
-'blocklogentry' => '{{GENDER:$4|חסם|חסמה}} את [[$1]] למשך $2 $3',
+'blocklogentry' => 'חסם את [[$1]] למשך $2 $3',
 'reblock-logentry' => 'שינה את הגדרות החסימה של [[$1]] עם זמן פקיעה של $2 $3',
 'blocklogtext' => 'זהו יומן פעולות החסימה והשחרור של משתמשים.
 כתובות IP שנחסמו אוטומטית אינן מופיעות.
@@ -2970,7 +2971,7 @@ $1',
 'cant-move-user-page' => 'אינכם מורשים להעביר דפי משתמש (למעט דפי משנה).',
 'cant-move-to-user-page' => 'אינכם מורשים להעביר דף לדף משתמש (למעט לדף משנה של דף משתמש).',
 'newtitle' => 'לשם החדש:',
-'move-watch' => 'מעקב אחרי דף המקור ואחרי דף היעד',
+'move-watch' => 'מעקב אחר דף המקור ואחר דף היעד',
 'movepagebtn' => 'העברה',
 'pagemovedsub' => 'ההעברה הושלמה בהצלחה',
 'movepage-moved' => 'הדף "$1" הועבר לשם "$2".',
@@ -4212,14 +4213,14 @@ $5
 'logentry-delete-delete' => '$1 {{GENDER:$2|מחק|מחקה}} את הדף $3',
 'logentry-delete-restore' => '$1 {{GENDER:$2|שחזר|שחזרה}} את הדף $3',
 'logentry-delete-event' => '$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4',
-'logentry-delete-revision' => '$1 {{GENDER:$2|ש×\99× ×\94|ש×\99נת×\94}} ×\90ת ×\9eצ×\91 ×\94תצ×\95×\92×\94 ×©×\9c {{PLURAL:$5|×\92רס×\94|$5 ×\92רס×\90×\95ת}} ×©×\9c ×\94דף $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|ש×\99× ×\94|ש×\99נת×\94}} ×\90ת ×\9eצ×\91 ×\94תצ×\95×\92×\94 ×©×\9c {{PLURAL:$5|×\92רס×\94|$5 ×\92רס×\90×\95ת}} ×\91דף $3: $4',
 'logentry-delete-event-legacy' => '$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של פעולות יומן של $3',
 'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של גרסאות בדף $3',
 'logentry-suppress-delete' => '$1 {{GENDER:$2|הסתיר|הסתירה}} לחלוטין את הדף $3',
 'logentry-suppress-event' => '$1 {{GENDER:$2|שינה|שינתה}} בסודיות את מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4',
-'logentry-suppress-revision' => '$1 {{GENDER:$2|ש×\99× ×\94|ש×\99נת×\94}} ×\91ס×\95×\93×\99×\95ת ×\90ת ×\9eצ×\91 ×\94תצ×\95×\92×\94 ×©×\9c {{PLURAL:$5|×\92רס×\94|$5 ×\92רס×\90×\95ת}} ×©×\9c ×\94דף $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|ש×\99× ×\94|ש×\99נת×\94}} ×\91ס×\95×\93×\99×\95ת ×\90ת ×\9eצ×\91 ×\94תצ×\95×\92×\94 ×©×\9c {{PLURAL:$5|×\92רס×\94|$5 ×\92רס×\90×\95ת}} ×\91דף $3: $4',
 'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|שינה|שינתה}} בסודיות את מצב התצוגה של פעולות יומן של $3',
-'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|ש×\99× ×\94|ש×\99נת×\94}} ×\91ס×\95×\93×\99×\95ת ×\90ת ×\9eצ×\91 ×\94תצ×\95×\92×\94 ×©×\9c ×\92רס×\90×\95ת ×©×\9c ×\94דף $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|ש×\99× ×\94|ש×\99נת×\94}} ×\91ס×\95×\93×\99×\95ת ×\90ת ×\9eצ×\91 ×\94תצ×\95×\92×\94 ×©×\9c ×\92רס×\90×\95ת ×\91דף $3',
 'revdelete-content-hid' => 'התוכן הוסתר',
 'revdelete-summary-hid' => 'תקציר העריכה הוסתר',
 'revdelete-uname-hid' => 'שם המשתמש הוסתר',
@@ -4228,7 +4229,7 @@ $5
 'revdelete-uname-unhid' => 'הסתרת שם המשתמש בוטלה',
 'revdelete-restricted' => 'נוספו הגבלות למפעילי מערכת',
 'revdelete-unrestricted' => 'הוסרו הגבלות ממפעילי מערכת',
-'logentry-move-move' => '$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל$4',
+'logentry-move-move' => '$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}}',
 'logentry-move-move-noredirect' => '$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}} בלי להשאיר הפניה',
 'logentry-move-move_redir' => '$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}} תוך דריסת הפניה',
 'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}} תוך דריסת הפניה ובלי להשאיר הפניה',
@@ -4289,7 +4290,7 @@ $5
 'api-error-invalid-file-key' => 'שגיאה פנימית: הקובץ לא נמצא במאגר הזמני.',
 'api-error-missingparam' => 'שגיאה פנימית: פרמטרים חסרים בבקשה שנשלחה.',
 'api-error-missingresult' => 'שגיאה פנימית: לא ניתן לקבוע אם ההעתקה הצליחה.',
-'api-error-mustbeloggedin' => '×¢×\9c×\99×\9b×\9d ×\9c×\94×\99×\95ת ×\9e×\97×\95×\91ר×\99×\9d לחשבון כדי להעלות קבצים.',
+'api-error-mustbeloggedin' => '×\99ש ×\9c×\94×\99×\9bנס לחשבון כדי להעלות קבצים.',
 'api-error-mustbeposted' => 'שגיאה פנימית: הבקשה דורשת שימוש בשיטת POST של HTTP.',
 'api-error-noimageinfo' => 'ההעלאה הושלמה בהצלחה, אבל השרת לא נתן לנו שום מידע על הקובץ.',
 'api-error-nomodule' => 'שגיאה פנימית: מודול ההעלאה אינו מוגדר.',
index fa07b71..fd59f77 100644 (file)
@@ -322,12 +322,12 @@ $messages = array(
 'tog-hidepatrolled' => 'Az ellenőrzött szerkesztések elrejtése a friss változtatások lapon',
 'tog-newpageshidepatrolled' => 'Ellenőrzött lapok elrejtése az új lapok listájáról',
 'tog-extendwatchlist' => 'A figyelőlistán az összes változtatás látszódjon, ne csak az utolsó',
-'tog-usenewrc' => 'Szerkesztések csoportosítása oldal szerint a friss változtatásokban és a figyelőlistán (JavaScript-alapú)',
+'tog-usenewrc' => 'Szerkesztések csoportosítása oldal szerint a friss változtatásokban és a figyelőlistán',
 'tog-numberheadings' => 'Fejezetcímek automatikus számozása',
-'tog-showtoolbar' => 'Szerkesztőeszközsor megjelenítése (JavaScript-alapú)',
-'tog-editondblclick' => 'A lapok szerkesztése dupla kattintásra (JavaScript-alapú)',
+'tog-showtoolbar' => 'Szerkesztőeszközsor megjelenítése',
+'tog-editondblclick' => 'A lapok szerkesztése dupla kattintásra',
 'tog-editsection' => '[szerkesztés] linkek az egyes szakaszok szerkesztéséhez',
-'tog-editsectiononrightclick' => 'Szakaszok szerkesztése a szakaszcímre való jobb kattintással (JavaScript-alapú)',
+'tog-editsectiononrightclick' => 'Szakaszok szerkesztése a szakaszcímre való jobb kattintással',
 'tog-showtoc' => 'Tartalomjegyzék megjelenítése a három fejezetnél többel rendelkező cikkeknél',
 'tog-rememberpassword' => 'Emlékezzen rám ezzel a böngészővel (legfeljebb {{PLURAL:$1|egy|$1}} napig)',
 'tog-watchcreations' => 'Az általam létrehozott lapok és feltöltött fájlok felvétele a figyelőlistámra',
@@ -345,7 +345,7 @@ $messages = array(
 'tog-shownumberswatching' => 'A lapot figyelő szerkesztők számának megjelenítése',
 'tog-oldsig' => 'A jelenlegi aláírás:',
 'tog-fancysig' => 'Az aláírás wikiszöveg (nem lesz automatikusan hivatkozásba rakva)',
-'tog-uselivepreview' => 'Élő előnézet használata (JavaScript-alapú, kísérleti)',
+'tog-uselivepreview' => 'Élő előnézet használata (kísérleti)',
 'tog-forceeditsummary' => 'Figyelmeztessen, ha nem adok meg szerkesztési összefoglalót',
 'tog-watchlisthideown' => 'Saját szerkesztések elrejtése',
 'tog-watchlisthidebots' => 'Robotok szerkesztéseinek elrejtése',
@@ -459,7 +459,7 @@ $messages = array(
 'newwindow' => '(új ablakban nyílik meg)',
 'cancel' => 'Mégse',
 'moredotdotdot' => 'Tovább…',
-'morenotlisted' => 'Tovább…',
+'morenotlisted' => 'A lista nem teljes.',
 'mypage' => 'Lapom',
 'mytalk' => 'Vitalap',
 'anontalk' => 'Az IP-címhez tartozó vitalap',
@@ -646,6 +646,11 @@ Az érvényes speciális lapok listáját a [[Special:SpecialPages|{{int:special
 # General errors
 'error' => 'Hiba',
 'databaseerror' => 'Adatbázishiba',
+'databaseerror-text' => 'Hiba történt az adatbázis-lekérdezés során. Lehetséges, hogy ez egy szoftverhiba eredménye.',
+'databaseerror-textcl' => 'Hiba történt az adatbázis-lekérdezés során.',
+'databaseerror-query' => 'Lekérdezés: $1',
+'databaseerror-function' => 'Függvény: $1',
+'databaseerror-error' => 'Hiba: $1',
 'laggedslavemode' => "'''Figyelem:''' Ez a lap nem feltétlenül tartalmazza a legfrissebb változtatásokat!",
 'readonly' => 'Az adatbázis le van zárva',
 'enterlockreason' => 'Add meg a lezárás okát, valamint egy becslést, hogy mikor lesz a lezárásnak vége',
@@ -679,6 +684,7 @@ Talán már valaki más törölte.',
 'cannotdelete-title' => 'Nem lehet törölni a(z) „$1” lapot',
 'delete-hook-aborted' => 'A törlés meg lett szakítva egy hook által.
 Nem lett magyarázat csatolva.',
+'no-null-revision' => 'Nem sikerült új null-revíziót létrehozni a(z) „$1” lap számára.',
 'badtitle' => 'Hibás cím',
 'badtitletext' => 'A kért oldal címe érvénytelen, üres, vagy rosszul hivatkozott nyelvközi vagy wikiközi cím volt. Olyan karaktereket is tartalmazhatott, melyek a címekben nem használhatóak.',
 'perfcached' => "Az alábbi adatok gyorsítótárból (''cache''-ből) származnak, és ezért lehetséges, hogy nem a legfrissebb változatot mutatják. Legfeljebb {{PLURAL:$1|egy|$1 }} eredmény áll rendelkezésre a gyorsítótárban.",
@@ -701,6 +707,10 @@ $2',
 'namespaceprotected' => "Nincs jogosultságod a(z) '''$1''' névtérben található lapok szerkesztésére.",
 'customcssprotected' => 'Nem szerkesztheted ezt a CSS-lapot, mert egy másik felhasználó személyes beállításait tartalmazza.',
 'customjsprotected' => 'Nem szerkesztheted ezt a JavaScript-lapot, mert egy másik felhasználó személyes beállításait tartalmazza.',
+'mycustomcssprotected' => 'Nincs jogod szerkeszteni ezt a CSS lapot.',
+'mycustomjsprotected' => 'Nincs jogod szerkeszteni ezt a Javascript lapot.',
+'myprivateinfoprotected' => 'Nincs jogod módosítani a privát adataidat.',
+'mypreferencesprotected' => 'Nincs jogod módosítani a beállításaidat.',
 'ns-specialprotected' => 'A speciális lapok nem szerkeszthetők.',
 'titleprotected' => "Ilyen címmel nem lehet szócikket készíteni, [[User:$1|$1]] letiltotta.
 Az indoklás: „''$2''”.",
@@ -720,7 +730,6 @@ A lezárást végrehajtó rendszergazda az alábbi indoklást adta meg: "$3".',
 # Login and logout pages
 'logouttext' => "'''Sikeresen kijelentkeztél.'''
 
-Folytathatod névtelenül  a(z) {{SITENAME}} használatát, vagy <span class='plainlinks'>[$1 ismét bejelentkezhetsz]</span> ugyanezzel, vagy egy másik névvel.
 Lehetséges, hogy néhány oldalon továbbra is azt látod, be vagy jelentkezve, mindaddig, amíg nem üríted a böngésződ gyorsítótárát.",
 'welcomeuser' => 'Üdvözlünk, $1!',
 'welcomecreation-msg' => 'A felhasználói fiókod elkészült.
@@ -728,6 +737,7 @@ Ne felejtsd el módosítani a [[Special:Preferences|{{SITENAME}} beállításaid
 'yourname' => 'Szerkesztőneved:',
 'userlogin-yourname' => 'Felhasználónév',
 'userlogin-yourname-ph' => 'Add meg a felhasználóneved',
+'createacct-another-username-ph' => 'Add meg a felhasználónevet',
 'yourpassword' => 'Jelszavad:',
 'userlogin-yourpassword' => 'Jelszó',
 'userlogin-yourpassword-ph' => 'Add meg a jelszavad',
@@ -761,10 +771,12 @@ Ne felejtsd el módosítani a [[Special:Preferences|{{SITENAME}} beállításaid
 'helplogin-url' => 'Help:Bejelentkezés',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Segítség a bejelentkezéshez]]',
 'createacct-join' => 'Add meg az alábbi információkat.',
+'createacct-another-join' => 'Add meg az új fiók adatait alább.',
 'createacct-emailrequired' => 'E-mail cím',
 'createacct-emailoptional' => 'E-mail cím (opcionális)',
 'createacct-email-ph' => 'Add meg e-mail címed',
-'createaccountmail' => 'Átmeneti, véletlenszerű jelszó használata és kiküldése az alábbi e-mail címre',
+'createacct-another-email-ph' => 'Add meg az emailcímet',
+'createaccountmail' => 'Átmeneti, véletlenszerű jelszó beállítása és kiküldése a megadott e-mail címre',
 'createacct-realname' => 'Igazi neved (nem kötelező)',
 'createaccountreason' => 'Indoklás:',
 'createacct-reason' => 'Indoklás',
@@ -772,6 +784,7 @@ Ne felejtsd el módosítani a [[Special:Preferences|{{SITENAME}} beállításaid
 'createacct-captcha' => 'Biztonsági ellenőrzés',
 'createacct-imgcaptcha-ph' => 'Írd be a szöveget, amit fent látsz',
 'createacct-submit' => 'Felhasználói fiók létrehozása',
+'createacct-another-submit' => 'Újabb felhasználó létrehozása',
 'createacct-benefit-heading' => 'A(z) {{SITENAME}}-t hozzád hasonló emberek készítik.',
 'createacct-benefit-body1' => '{{PLURAL:$1|szerkesztés|szerkesztés}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|lap|lap}}',
@@ -830,7 +843,7 @@ A visszaélések elkerülése végett {{PLURAL:$1|egy|$1}} óránként csak egy
 'cannotchangeemail' => 'Ezen a wikin nem módosítható a fiókhoz tartozó e-mail cím.',
 'emaildisabled' => 'Ez az oldal nem küld e-maileket.',
 'accountcreated' => 'Felhasználói fiók létrehozva',
-'accountcreatedtext' => '$1 felhasználói fiókja sikeresen létrejött.',
+'accountcreatedtext' => '[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|vita]]) felhasználói fiókja sikeresen létrejött.',
 'createaccount-title' => 'Új {{SITENAME}}-azonosító létrehozása',
 'createaccount-text' => 'Valaki létrehozott számodra egy "$2" nevű {{SITENAME}}-azonosítót ($4).
 A hozzá tartozó jelszó "$3", melyet a bejelentkezés után minél előbb változtass meg.
@@ -838,7 +851,7 @@ A hozzá tartozó jelszó "$3", melyet a bejelentkezés után minél előbb vál
 Ha nem kértél új azonosítót, és tévedésből kaptad ezt a levelet, hagyd figyelmen kívül.',
 'usernamehasherror' => 'A felhasználónév nem tartalmazhat hash karaktereket',
 'login-throttled' => 'Túl sok hibás bejelentkezés.
-Várj egy kicsit, mielőtt újra próbálkozol.',
+Várj $1, mielőtt újra próbálkozol.',
 'login-abort-generic' => 'A bejelentkezés sikertelen – megszakítva',
 'loginlanguagelabel' => 'Nyelv: $1',
 'suspicious-userlogout' => 'A kijelentkezési kérésed vissza lett utasítva, mert úgy tűnik, hogy egy hibás böngésző vagy gyorsítótárazó proxy küldte.',
@@ -1319,6 +1332,7 @@ Győződj meg róla, hogy a laptörténet folytonossága megmarad.',
 'compareselectedversions' => 'Kiválasztott változatok összehasonlítása',
 'showhideselectedversions' => 'Kiválasztott változatok láthatóságának beállítása',
 'editundo' => 'visszavonás',
+'diff-empty' => '(Nincs különbség)',
 'diff-multi' => '({{PLURAL:$2|egy|$2}} szerkesztő {{PLURAL:$1|egy|$1}} közbeeső változata nincs mutatva)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Egy közbeeső változat|$1 közbeeső változat}} nincs mutatva, amit $2 szerkesztő módosított)',
 'difference-missing-revision' => 'A(z) "{{PAGENAME}}" nevű oldal #$1 $2 változata nem létezik.
@@ -1659,9 +1673,12 @@ A műveletet nem lehet visszavonni.',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|egy|$1}} változtatás',
+'enhancedrc-since-last-visit' => '$1 az utolsó látogatás óta',
+'enhancedrc-history' => 'történet',
 'recentchanges' => 'Friss változtatások',
 'recentchanges-legend' => 'A friss változtatások beállításai',
 'recentchanges-summary' => 'Ezen a lapon a wikiben történt legutóbbi fejleményeket lehet nyomon követni.',
+'recentchanges-noresult' => 'A megadott időszakban nincs a feltételeknek megfelelő szerkesztés.',
 'recentchanges-feed-description' => 'Kövesd a wiki friss változtatásait ezzel a hírcsatornával.',
 'recentchanges-label-newpage' => 'Ezzel a szerkesztéssel egy új lap jött létre',
 'recentchanges-label-minor' => 'Ez egy apró szerkesztés',
@@ -1689,7 +1706,7 @@ A műveletet nem lehet visszavonni.',
 'rc_categories_any' => 'Bármelyik',
 'rc-change-size-new' => '{{PLURAL:$1| egy bájt|$1 bájt}} módosítás után',
 'newsectionsummary' => '/* $1 */ (új szakasz)',
-'rc-enhanced-expand' => 'Részletek megjelenítése (JavaScript szükséges)',
+'rc-enhanced-expand' => 'Részletek megjelenítése',
 'rc-enhanced-hide' => 'Részletek elrejtése',
 'rc-old-title' => 'eredetileg létrehozott " $1 "',
 
@@ -4000,7 +4017,7 @@ A MediaWikit abban a reményben terjesztjük, hogy hasznos lesz, de GARANCIA NÉ
 'api-error-badtoken' => 'Belső hiba: hibás token.',
 'api-error-copyuploaddisabled' => 'Az URL-címes feltöltés nem engedélyezett ezen a kiszolgálón.',
 'api-error-duplicate' => 'Már van {{PLURAL:$1|egy|néhány}} [$2 másik fájl] az oldalon ugyanilyen tartalommal',
-'api-error-duplicate-archive' => 'Az oldalon {{PLURAL:$1|szerepelt|szerepeltek}} más [$2 más {{PLURAL:$1|fájl|fájlok}}] is ugyanezzel a tartalommal, de törlölve {{PLURAL:$1|lett|lettek}}.',
+'api-error-duplicate-archive' => 'Az oldalon {{PLURAL:$1|szerepelt|szerepeltek}} [$2 más {{PLURAL:$1|fájl|fájlok}}] is ugyanezzel a tartalommal, de törölve {{PLURAL:$1|lett|lettek}}.',
 'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Az azonos fájl, ami törölve lett|Azonos fájlok, amik törölve lettek}}',
 'api-error-duplicate-popup-title' => '{{PLURAL:$1|Duplikátum|Duplikátumok}}',
 'api-error-empty-file' => 'Az általad elküldött fájl üres volt.',
index c4d2a28..fa3d96e 100644 (file)
@@ -2693,7 +2693,7 @@ $1',
 'sp-contributions-logs' => 'log',
 'sp-contributions-talk' => 'bicara',
 'sp-contributions-userrights' => 'pengelolaan hak pengguna',
-'sp-contributions-blocked-notice' => 'Pengguna ini sedang di blok. log pemblokiran terakhir ditampilkan berikut untuk referensi:',
+'sp-contributions-blocked-notice' => 'Pengguna ini sedang diblok. Log pemblokiran terakhir ditampilkan berikut untuk referensi:',
 'sp-contributions-blocked-notice-anon' => 'Alamat IP ini diblokir pada saat ini.
 Catatan log pemblokiran terakhir tersedia di bawah ini sebagai rujukan:',
 'sp-contributions-search' => 'Cari kontribusi',
index e070127..7bd61b0 100644 (file)
@@ -42,12 +42,12 @@ $messages = array(
 'tog-hidepatrolled' => 'Ilemmeng dagiti napatruliaan nga inurnos kadagiti naudi a sinuk-sukatan',
 'tog-newpageshidepatrolled' => 'Ilemmeng dagiti napatruliaan a panid manipud ti baro a listaan ti panid',
 'tog-extendwatchlist' => 'Ipalawa ti listaan ti bambantayan tapno maipakita amin a nasukatan, tapno saan laeng a dagiti nabiit',
-'tog-usenewrc' => 'Dagiti grupo a panagbaliw babaen ti panid kadagiti kinaudi a panagbaliw ken banbantayan  (masapul ti JavaScript)',
+'tog-usenewrc' => 'Dagiti grupo a panagbaliw babaen ti panid kadagiti kinaudi a panagbaliw ken banbantayan',
 'tog-numberheadings' => 'Automatiko a pabilangan dagiti paulo',
-'tog-showtoolbar' => 'Ipakita ti baras ti ramit ti panag-urnos (masapul ti JavaScript)',
-'tog-editondblclick' => 'Urnosen dagiti panid iti mamindua a panagpindut (masapul ti JavaScript)',
+'tog-showtoolbar' => 'Ipakita ti baras ti ramit ti panag-urnos',
+'tog-editondblclick' => 'Urnosen dagiti panid iti mamindua a panagpindut',
 'tog-editsection' => 'Pakabaelan ti panag-urnos ti paset babaen kadagiti silpo nga [urnosen]',
-'tog-editsectiononrightclick' => 'Pakabaelan ti panag-urnos ti paset babaen ti kanawan a panagpindut kadagiti titulo ti paset (masapul ti JavaScript)',
+'tog-editsectiononrightclick' => 'Pakabaelan ti panag-urnos ti paset babaen ti kanawan a panagpindut kadagiti titulo ti paset',
 'tog-showtoc' => 'Ipakita ti tabla dagiti linaon (para kadagiti panid nga adda ti ad-adu ngem dagiti 3 a paulo)',
 'tog-rememberpassword' => 'Laglagipem ti iseserrekko iti daytoy a pagbasabasa (iti kapaut nga $1 {{PLURAL:$1|aldaw|al-aldaw}})',
 'tog-watchcreations' => 'Agnayon kadagiti panid a pinartuatko ken papeles nga inkargak idiay listaan ti bambantayak',
@@ -65,7 +65,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Ipakita ti bilang dagiti agbuybuya nga agar-aramat',
 'tog-oldsig' => 'Ti adda a pirma:',
 'tog-fancysig' => 'Tratuen ti pirma a kas wikitext (nga awan ti automatiko a panagsilpo)',
-'tog-uselivepreview' => 'Usaren ti agdama a panagipadas (masapul ti JavaScript) (eksperimento)',
+'tog-uselivepreview' => 'Usaren ti agdama a panagipadas (eksperimento)',
 'tog-forceeditsummary' => 'Pakaammuannak no sumrek ti blanko a pakabuklan ti panag-urnos',
 'tog-watchlisthideown' => 'Ilemmeng dagiti inurnosko manipud ti listaan ti bambantayan',
 'tog-watchlisthidebots' => 'Ilemmeng dagiti inurnos ti bot manipud ti listaan ti bambantayan',
@@ -179,7 +179,7 @@ $messages = array(
 'newwindow' => '(aglukat iti sabali a tawa)',
 'cancel' => 'Ukasen',
 'moredotdotdot' => 'Adu pay...',
-'morenotlisted' => 'Adu a saan a nailista...',
+'morenotlisted' => 'Daytoy a listaan ket saan a kompleto.',
 'mypage' => 'Panid',
 'mytalk' => 'Tungtungan',
 'anontalk' => 'Tungtungan para iti daytoy a pagtaengan ti IP',
@@ -366,6 +366,12 @@ Masarakan ti listaan dagiti umisu nga espesial a pampanid iti [[Special:SpecialP
 # General errors
 'error' => 'Biddut',
 'databaseerror' => 'Biddut iti database',
+'databaseerror-text' => 'Adda napasamak a biddut ti usisa ti database.
+Daytoy ket mabalin a mangibagbaga ti parikut ti sopwer.',
+'databaseerror-textcl' => 'Adda napasamak a biddut ti usisa ti database.',
+'databaseerror-query' => 'Usisa: $1',
+'databaseerror-function' => 'Annong: $1',
+'databaseerror-error' => 'Biddut: $1',
 'laggedslavemode' => "'''Ballaag:''' Ti panid ket mabalin a saan nga aglaon kadagiti kinaudi a panagpabaro.",
 'readonly' => 'Narikepan ti database',
 'enterlockreason' => 'Agikabil ti rason para iti pannakarikep, agraman ti maysa a karkulo no kaanonto a maluktan',
@@ -1163,7 +1169,7 @@ Dagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete
 'searcheverything-enable' => 'Agbirukka kadagiti amin a nagan ti espasio',
 'searchrelated' => 'mainaig',
 'searchall' => 'amin',
-'showingresults' => "Maiparang iti baba ti agingga {{PLURAL:$1|iti '''1''' a nagbanagan|dagiti '''$1''' a nagbanagan}} a mangrugi iti #'''$2'''.",
+'showingresults' => "Maiparang dita baba agingga {{PLURAL:$1|iti '''1''' a nagbanagan|dagiti '''$1''' a nagbanagan}} a mangrugi iti #'''$2'''.",
 'showingresultsnum' => "Maipakpakita dita baba  {{PLURAL:$3|iti '''1''' a nagbanagan|dagiti '''$3''' a nagbanagan}} a mangrugi iti #'''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Nagbanagan a '''$1''' iti '''$3'''|Dagiti Nagbanagan a '''$1 - $2''' iti '''$3'''}} para iti '''$4'''",
 'nonefound' => "'''Palagip'': Adda laeng bassit dagita nagan ti espasio a masigud a biruken.
@@ -1213,13 +1219,13 @@ Laglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.',
 'prefs-rendering' => 'Tabas',
 'saveprefs' => 'Idulin',
 'resetprefs' => 'Dalusan dagiti saan a naidulin a sinuksukatan',
-'restoreprefs' => 'Isublim amin dagiti kinasigud a kasasaad',
+'restoreprefs' => 'Isubli amin dagiti kasisigud a pannakaiyasentar (kadagiti amin a paset)',
 'prefs-editing' => 'Ur-urnosen',
 'rows' => 'Ar-aray:',
 'columns' => 'Tuk-tukol:',
 'searchresultshead' => 'Biruken',
 'resultsperpage' => 'Nabirukan ti tunggal maysa a panid:',
-'stub-threshold' => 'Pangruggian ti <a href="#" class="stub">pungol a silpo</a>panagporma (dagiti byte):',
+'stub-threshold' => 'Pagpatinggaan para iti panagporma ti <a href="#" class="stub">pungol a silpo</a> (dagiti byte):',
 'stub-threshold-disabled' => 'Nabaldado',
 'recentchangesdays' => 'Al-aldaw nga ipakita dagiti kinaudi a binalbaliwan:',
 'recentchangesdays-max' => 'Kapaut nga $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}}',
@@ -1304,6 +1310,7 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
 'prefs-displaywatchlist' => 'Ipakita dagiti pagpilian',
 'prefs-tokenwatchlist' => 'Tandaan',
 'prefs-diffs' => 'Sabali',
+'prefs-help-prefershttps' => 'Daytoy a kakaykayatan ket mapakabaelanto iti sumaruno nga iseserrekmo.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Ti esurat a pagtaengan ket kasla umiso',
@@ -1511,7 +1518,7 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
 'rc_categories_any' => 'Uray ania',
 'rc-change-size-new' => '$1 {{PLURAL:$1|a byte|kadagiti byte}} kalpasan ti panag-sukat',
 'newsectionsummary' => '/* $1 */ baro a paset',
-'rc-enhanced-expand' => 'Ipakita dagiti salaysay (masapul ti JavaScript)',
+'rc-enhanced-expand' => 'Ipakita dagiti salaysay',
 'rc-enhanced-hide' => 'Ilemmeng dagiti salaysay',
 'rc-old-title' => 'kasisigud nga inaramid a kas ti "$1"',
 
@@ -1773,8 +1780,7 @@ Baka kayatmo a padasen no saan a makumikom nga oras.',
 'upload_source_file' => '(papeles iti kompiutermo)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Daytoy nga espesial a panid ket agiparang kadagiti pinag-ipan kadagiti papeles.
-No sagaten ti agar-aramat, dagiti laeng papeles a pinag-ipan ti agar-aramat ti kinaudi a bersion ti papeles ti maipakita.',
+'listfiles-summary' => 'Daytoy nga espesial a panid ket agiparang kadagiti amin a naipan a papeles.',
 'listfiles_search_for' => 'Agsapul para iti nagan ti midia:',
 'imgfile' => 'papeles',
 'listfiles' => 'Listaan ti papeles',
@@ -1785,6 +1791,10 @@ No sagaten ti agar-aramat, dagiti laeng papeles a pinag-ipan ti agar-aramat ti k
 'listfiles_size' => 'Kadakkel',
 'listfiles_description' => 'Panagipalpalawag',
 'listfiles_count' => 'Dagiti bersion',
+'listfiles-show-all' => 'Iraman dagiti daan a bersion dagiti ladawan',
+'listfiles-latestversion' => 'Agdama a bersion',
+'listfiles-latestversion-yes' => 'Wen',
+'listfiles-latestversion-no' => 'Saan',
 
 # File description page
 'file-anchor-link' => 'Papeles',
@@ -3724,8 +3734,7 @@ Naka-awatka koman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU Sapasap a
 'specialpages' => 'Espesial a pampanid',
 'specialpages-note' => '----
 * Kadawyan nga espesial a pampanid.
-* <span class="mw-specialpagerestricted">Naiparit nga espesial a pampanid.</span>
-* <span class="mw-specialpagecached">Cached nga espesial a pampanid (baka nagpaso).</span>',
+* <span class="mw-specialpagerestricted">Nagawidan nga espesial a pampanid.</span>',
 'specialpages-group-maintenance' => 'Dagiti padamag ti panagtaripato',
 'specialpages-group-other' => 'Sabsabali pay nga espesial a pampanid',
 'specialpages-group-login' => 'Sumrek / agaramid ti pakabilangan',
@@ -3784,7 +3793,8 @@ Naka-awatka koman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU Sapasap a
 'dberr-problems' => 'Pasensian a!
 Daytoy a pagsaadan ket agdadama ti teknikal a pagrigrigatan.',
 'dberr-again' => 'Padasem ti agururay to manu a minutos ken agikarga.',
-'dberr-info' => '(San a makontak ti database server: $1)',
+'dberr-info' => '(Saan a makontak ti database server: $1)',
+'dberr-info-hidden' => '(Saan a makontak ti database server)',
 'dberr-usegoogle' => 'Padasem  ti agbiruk idiay Google tatta.',
 'dberr-outofdate' => 'Palagip a dagiti listaan da kadagiti kukuami a nagyan ket baka nagpaso.',
 'dberr-cachederror' => 'Daytoy ket naidulin a kopia ti kiniddawmo a panid, ken mabalin a saan a kabarbaro.',
index 2165fd7..a88ef48 100644 (file)
@@ -1461,7 +1461,7 @@ Chiunque la conosce sarà in grado di leggere i tuoi osservati speciali, per cui
 'prefs-reset-intro' => "È possibile usare questa pagina per reimpostare le proprie preferenze a quelle predefinite del sito.
 L'operazione non può essere annullata.",
 'prefs-emailconfirm-label' => "Conferma dell'e-mail:",
-'youremail' => 'Indirizzo e-mail:',
+'youremail' => 'Indirizzo email:',
 'username' => '{{GENDER:$1|Nome utente}}:',
 'uid' => '{{GENDER:$1|ID utente}}:',
 'prefs-memberingroups' => '{{GENDER:$2|Membro}} {{PLURAL:$1|del gruppo|dei gruppi}}:',
@@ -1625,7 +1625,7 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'right-userrights-interwiki' => 'Modifica i diritti degli utenti di altre wiki',
 'right-siteadmin' => 'Blocca e sblocca il database',
 'right-override-export-depth' => 'Esporta le pagine includendo le pagine collegate fino ad una profondità di 5',
-'right-sendemail' => 'Invia e-mail ad altri utenti',
+'right-sendemail' => 'Invia email ad altri utenti',
 'right-passwordreset' => 'Vede i messaggi di reimpostazione della password',
 
 # Special:Log/newusers
index 5cda489..5aa8fbc 100644 (file)
@@ -1430,8 +1430,8 @@ $1",
 'mergehistory-empty' => '統合できる版がありません。',
 'mergehistory-success' => '[[:$1]]の $3 {{PLURAL:$3|版}}を[[:$2]]に統合しました。',
 'mergehistory-fail' => '履歴の統合を実行できません。ページと時刻の引数を再確認してください。',
-'mergehistory-no-source' => '統合元ページ「$1」が存在しません。',
-'mergehistory-no-destination' => '統合先ページ「$1」が存在しません。',
+'mergehistory-no-source' => '統合元ページ $1 が存在しません。',
+'mergehistory-no-destination' => '統合先ページ $1 が存在しません。',
 'mergehistory-invalid-source' => '統合元のページは有効な名前でなければなりません。',
 'mergehistory-invalid-destination' => '統合先のページは有効な名前でなければなりません。',
 'mergehistory-autocomment' => '[[:$1]]を[[:$2]]に統合',
@@ -2577,7 +2577,7 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 'enotif_body_intro_changed' => '{{SITENAME}}のページ「$1」が$PAGEEDITDATEに、$2 によって{{GENDER:$2|変更}}されました。現在の版は $3 で閲覧できます。',
 'enotif_lastvisited' => '最終訪問以降のすべての変更は $1 をご覧ください。',
 'enotif_lastdiff' => 'この変更内容を表示するには $1 をご覧ください。',
-'enotif_anon_editor' => '匿名利用者「$1」',
+'enotif_anon_editor' => '匿名利用者 $1',
 'enotif_body' => '$WATCHINGUSERNAMEさん
 
 $PAGEINTRO $NEWPAGE
@@ -2618,7 +2618,7 @@ $UNWATCHURL
 'delete-legend' => '削除',
 'historywarning' => "'''警告:''' 削除しようとしているページには、約$1版の履歴があります:",
 'confirmdeletetext' => 'ページをすべての履歴とともに削除しようとしています。
\9c¬å½\93ã\81«ã\81\93ã\81®æ\93\8dä½\9cã\82\92è¡\8cã\81\84ã\81\9fã\81\84ã\81\8bã\80\81æ\93\8dä½\9cã\81®çµ\90æ\9e\9cã\82\92ç\90\86解ã\81\97ã\81¦ã\81\84ã\82\8bã\81\8bã\80\81ã\81\8aã\82\88ã\81³ã\81\93ã\81®æ\93\8dä½\9cã\81\8c[[{{MediaWiki:Policy-url}}|æ\96¹é\87\9d]]ã\81«å¾\93ã\81£ã\81¦ã\81\84ã\82\8bã\81\8bã\81©ã\81\86ã\81\8bã\80\81確èª\8dã\82\92ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82',
+本当にこの操作を行いたいか、操作の結果を理解しているか、およびこの操作が[[{{MediaWiki:Policy-url}}|方針]]に従っているかどうか、確認してください。',
 'actioncomplete' => '操作を完了しました',
 'actionfailed' => '操作に失敗しました',
 'deletedtext' => '「$1」は削除されました。
@@ -2687,13 +2687,13 @@ $2による直前の版へ変更されました。',
 'protect_expiry_invalid' => '有効期間が正しくありません。',
 'protect_expiry_old' => '有効期限が過去の時刻です。',
 'protect-unchain-permissions' => '追加保護オプションをロック解除',
-'protect-text' => "ã\83\9aã\83¼ã\82¸ã\80\8c'''$1'''ã\80\8dに対する保護レベルの表示と操作ができます。",
+'protect-text' => "ã\81\93ã\81\93ã\81§ã\81¯ã\80\81ã\83\9aã\83¼ã\82¸ '''$1''' に対する保護レベルの表示と操作ができます。",
 'protect-locked-blocked' => "ブロックされている間は、保護レベルを変更できません。
-ページ「'''$1'''」の現在の状態は以下の通りです:",
+ページ '''$1''' の現在の状態は以下の通りです:",
 'protect-locked-dblock' => "データベースのロックが有効なため、保護レベルを変更できません。
-ページ「'''$1'''」の現在の状態は以下の通りです:",
+ページ '''$1''' の現在の状態は以下の通りです:",
 'protect-locked-access' => "アカウントに、ページの保護レベルを変更する権限がありません。
-ページ「'''$1'''」の現在の状態は以下の通りです:",
+ページ '''$1''' の現在の状態は以下の通りです:",
 'protect-cascadeon' => 'このページは現在、カスケード保護が有効になっている以下の{{PLURAL:$1|ページ|ページ群}}から読み込まれているため、保護されています。
 このページの保護レベルを変更できますが、カスケード保護には影響しません。',
 'protect-default' => 'すべての利用者に許可',
@@ -2754,7 +2754,7 @@ $2による直前の版へ変更されました。',
 'undeletehistorynoadmin' => 'このページは削除されています。
 削除の理由は、削除前にこのページを編集していた利用者の詳細情報と共に、以下に表示されています。
 管理者以外の利用者には、削除された各版の本文への制限がかけられています。',
-'undelete-revision' => '削除されたページ「$1」の $4 $5 時点での $3 による版:',
+'undelete-revision' => '削除されたページ $1 の $4 $5 時点での $3 による版:',
 'undeleterevision-missing' => '無効または存在しない版です。
 間違ったリンクをたどったか、この版は既に復元されたか、もしくは保存版から除去された可能性があります。',
 'undelete-nodiff' => 'これより前の版はありません。',
@@ -3056,9 +3056,9 @@ $1 のブロックの理由は「''$2''」です。",
 'movetalk' => '付随するトークページも移動',
 'move-subpages' => '下位ページも移動 ($1 件まで)',
 'move-talk-subpages' => 'トークページの下位ページも移動 ($1 件まで)',
-'movepage-page-exists' => 'ページ「$1」は既に存在するため、自動的な上書きはできませんでした。',
-'movepage-page-moved' => 'ページ「$1」は「$2」に移動しました。',
-'movepage-page-unmoved' => 'ページ「$1」は「$2」に移動できませんでした。',
+'movepage-page-exists' => 'ページ $1 は既に存在するため、自動的な上書きはできません。',
+'movepage-page-moved' => 'ページ $1 は $2 に移動しました。',
+'movepage-page-unmoved' => 'ページ $1 は $2 に移動できませんでした。',
 'movepage-max-pages' => '自動的に移動できるのは $1 {{PLURAL:$1|ページ}}までで、それ以上は移動されません。',
 'movelogpage' => '移動記録',
 'movelogpagetext' => '以下はすべてのページ移動の一覧です。',
index 281b53e..b2299c0 100644 (file)
@@ -177,10 +177,10 @@ $messages = array(
 'tog-extendwatchlist' => 'გავრცობილი კონტროლის სია ყველა დაკავშირებული ცვლილების ჩვენების ჩათვლით',
 'tog-usenewrc' => 'ბოლო ცვლილებების და კონტროლის სიის ცვლილებების დაჯგუფება (საჭიროა ჯავასკრიპტი)',
 'tog-numberheadings' => 'ავტომატურად დანომრე ქვესათაურები',
-'tog-showtoolbar' => 'á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\98á\83¡ á\83\98á\83\9cá\83¡á\83¢á\83 á\83£á\83\9bá\83\94á\83\9cá\83¢á\83\94á\83\91á\83\98á\83¡ á\83©á\83\95á\83\94á\83\9cá\83\94á\83\91á\83\90 (á\83¯á\83\90á\83\95á\83\90á\83¡á\83\99á\83 á\83\98á\83\9eá\83¢á\83\98)',
-'tog-editondblclick' => 'გვერდების რედაქტირება ორმაგი დაწკაპუნებით (ჯავასკრიპტი)',
+'tog-showtoolbar' => 'á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\98á\83¡ á\83\9eá\83\90á\83\9cá\83\94á\83\9aá\83\98á\83¡ á\83©á\83\95á\83\94á\83\9cá\83\94á\83\91á\83\90',
+'tog-editondblclick' => 'გვერდების რედაქტირება ორმაგი დაწკაპუნებით',
 'tog-editsection' => 'სექციის რედაქტირების ნებართვა [რედაქტირებული] ბმულების გავლით',
-'tog-editsectiononrightclick' => 'á\83¡á\83\94á\83¥á\83ªá\83\98á\83\98á\83¡ á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\98á\83¡ á\83\9cá\83\94á\83\91á\83\90á\83 á\83\97á\83\95á\83\90 á\83\9bá\83\90á\83 á\83¯á\83\95á\83\94á\83\9cá\83\90 á\83¦á\83\98á\83\9aá\83\90á\83\99á\83\96á\83\94 á\83\93á\83\90á\83­á\83\94á\83 á\83\98á\83\97<br />á\83¡á\83\94á\83¥á\83ªá\83\98á\83\98á\83¡ á\83¡á\83\90á\83\97á\83\90á\83£á\83 á\83\94á\83\91á\83\96á\83\94 (á\83¯á\83\90á\83\95á\83\90á\83¡á\83\99á\83 á\83\98á\83\9eá\83¢á\83\98)',
+'tog-editsectiononrightclick' => 'á\83¡á\83\94á\83¥á\83ªá\83\98á\83\98á\83¡ á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\98á\83¡ á\83\9cá\83\94á\83\91á\83\90á\83 á\83\97á\83\95á\83\90 á\83¡á\83\90á\83\97á\83\90á\83£á\83 á\83\94á\83\91á\83\96á\83\94 á\83\9bá\83\90á\83 á\83¯á\83\95á\83\94á\83\9cá\83\90 á\83¦á\83\98á\83\9aá\83\90á\83\99á\83\96á\83\94 á\83\93á\83\90á\83­á\83\94á\83 á\83\98á\83\97',
 'tog-showtoc' => 'აჩვენე სარჩევი (სამ ქვესათაურზე მეტის მქონე გვერდებისთვის)',
 'tog-rememberpassword' => 'დამიმახსოვრე ამ კომპიუტერზე (მაქსიმუმ $1 {{PLURAL:$1|დღე|დღე}})',
 'tog-watchcreations' => 'დაამატე ჩემი კონტროლის სიას ჩემს მიერ შექმნილი გვერდები და ატვირთული ფაილები',
@@ -198,7 +198,7 @@ $messages = array(
 'tog-shownumberswatching' => 'მაკონტროლებელ მომხმარებელთა რიცხვის ჩვენება',
 'tog-oldsig' => 'არსებული ხელმოწერა:',
 'tog-fancysig' => 'საკუთარი ვიკიფორმატიანი ხელმოწერა (ავტომატური ბმულის გარეშე)',
-'tog-uselivepreview' => 'á\83\92á\83\90á\83\9bá\83\9dá\83\98á\83§á\83\94á\83\9cá\83\94á\83\97 á\83\90á\83®á\83\90á\83\9aá\83\98 á\83¬á\83\98á\83\9cá\83\90á\83¡á\83¬á\83\90á\83 á\83\98 á\83\92á\83\90á\83\93á\83\90á\83®á\83\94á\83\93á\83\95á\83\90 (á\83¯á\83\90á\83\95á\83\90á\83¡á\83\99á\83 á\83\98á\83\9eá\83¢á\83\98 (ექსპერიმენტული)',
+'tog-uselivepreview' => 'á\83\92á\83\90á\83\9bá\83\9dá\83\98á\83§á\83\94á\83\9cá\83\94á\83\97 á\83¡á\83¬á\83 á\83\90á\83¤á\83\98 á\83¬á\83\98á\83\9cá\83\90á\83¡á\83¬á\83\90á\83 á\83\98 á\83\92á\83\90á\83\93á\83\90á\83®á\83\94á\83\93á\83\95á\83\90 (ექსპერიმენტული)',
 'tog-forceeditsummary' => 'გამაფრთხილე ცარიელი რედაქტირების რეზიუმეს შემთხვევაში',
 'tog-watchlisthideown' => 'დამალე ჩემი რედაქტირება კონტროლის სიაში',
 'tog-watchlisthidebots' => 'დამალე რობოტის რედაქტირება კონტროლის სიაში',
@@ -315,7 +315,7 @@ $messages = array(
 'newwindow' => '(ახალ ფანჯარაში)',
 'cancel' => 'გაუქმება',
 'moredotdotdot' => 'ვრცლად...',
-'morenotlisted' => 'á\83\9bá\83\94á\83¢á\83\98 á\83\90á\83  á\83\90á\83 á\83\98á\83¡ á\83\9cá\83\90á\83©á\83\95á\83\94á\83\9cá\83\94á\83\91á\83\98...',
+'morenotlisted' => 'á\83\94á\83¡ á\83\90á\83 á\83\90á\83¡á\83 á\83£á\83\9aá\83\98 á\83¡á\83\98á\83\90á\83\90.',
 'mypage' => 'გვერდი',
 'mytalk' => 'განხილვა',
 'anontalk' => 'ამ IP-ს განხილვა',
@@ -1369,9 +1369,9 @@ $1",
 'badsiglength' => 'ხელმოწერა ძალიან გრძელია.
 უნდა შედგებოდეს მაქსიმუმ $1 ნიშნისაგან.',
 'yourgender' => 'სქესი:',
-'gender-unknown' => 'á\83\90á\83  á\83\90á\83 á\83\98á\83¡ á\83\9bá\83\98á\83\97á\83\98á\83\97á\83\94á\83\91á\83£á\83\9aá\83\98',
-'gender-male' => 'á\83\9bá\83\90á\83\9bá\83 á\83\9dá\83\91á\83\98á\83\97á\83\98',
-'gender-female' => 'á\83\9bá\83\93á\83\94á\83\93á\83 á\83\9dá\83\91á\83\98á\83\97á\83\98',
+'gender-unknown' => 'á\83\9bá\83\98á\83\97á\83\98á\83\97á\83\94á\83\91á\83\90á\83¡ á\83\90á\83  á\83\95á\83\97á\83\95á\83\9aá\83\98 á\83¡á\83\90á\83­á\83\98á\83 á\83\9dá\83\93',
+'gender-male' => 'á\83\98á\83¡ á\83\90á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83¡ á\83\95á\83\98á\83\99á\83\98\83\92á\83\95á\83\94á\83 á\83\93á\83\94á\83\91á\83¡',
+'gender-female' => 'á\83\98á\83¡ á\83\90á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83¡ á\83\95á\83\98á\83\99á\83\98\83\92á\83\95á\83\94á\83 á\83\93á\83\94á\83\91á\83¡',
 'prefs-help-gender' => 'არასავალდებულო ველი: გამოიყენება პროგრამული უზრუნველყოფის იმ შეტყობინებებისთვის, რომლებიც ადამიანის სქესზეა დამოკიდებული.
 ეს ინფორმაცია საზოგადოებრივი  იქნება.',
 'email' => 'ელ. ფოსტა',
@@ -1486,9 +1486,9 @@ $1",
 'right-hideuser' => 'მომხმარებლის სახელის დაბლოკვა და მისი დამალვა საზოგადოებისგან',
 'right-ipblock-exempt' => 'IP ბლოკის, ავტობლოკის და დიაპაზონთა ბლოკის გასვლა',
 'right-proxyunbannable' => 'პროქსის ავტობლოკის გადასვლა',
-'right-unblockself' => 'á\83\9bá\83\9dá\83®á\83¡á\83\9cá\83\90á\83\9c á\83\91á\83\9aá\83\9dá\83\99á\83\98 á\83\97á\83\95á\83\98á\83\97á\83\9dá\83\9c',
+'right-unblockself' => 'á\83¡á\83\90á\83\99á\83£á\83\97á\83\90á\83 á\83\98 á\83\97á\83\90á\83\95á\83\98á\83¡ á\83\92á\83\90á\83\9cá\83\91á\83\9aá\83\9dá\83\99á\83\95á\83\90',
 'right-protect' => 'გვერდების დაცვის დონის შეცვლა და დაცული გვერდების რედაქტირება',
-'right-editprotected' => 'á\83\93á\83\90á\83ªá\83£á\83\9aá\83\98 á\83\92á\83\95á\83\94á\83 á\83\93á\83\94á\83\91á\83\98á\83¡ á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\90 (á\83\98á\83\94á\83 á\83\90á\83 á\83¥á\83\98á\83£á\83\9aá\83\98 á\83\93á\83\90á\83ªá\83\95á\83\98á\83¡ á\83\92á\83\90á\83 á\83\94á\83¨á\83\94)',
+'right-editprotected' => 'á\83\92á\83\95á\83\94á\83 á\83\93á\83\94á\83\91á\83\98á\83¡ á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\90 á\83 á\83\9dá\83\9bá\83\9aá\83\94á\83\91á\83\98á\83ª á\83\93á\83\90á\83ªá\83£á\83\9aá\83\98á\83\90 á\83 á\83\9dá\83\92á\83\9dá\83 á\83ª â\80\9e{{int:protect-level-sysop}}â\80\9c',
 'right-editinterface' => 'მომხმარებლის ინტერფეისის შეცვლა',
 'right-editusercssjs' => 'სხვა მომხმარებლების CSS- и JS- ფაილების შესწორება',
 'right-editusercss' => 'სხვა მომხმარებლების CSS- ფაილების შესწორება',
@@ -1593,7 +1593,7 @@ $1",
 'rc-change-size' => '$1',
 'rc-change-size-new' => 'ზომა ცვლილების შემდეგ არის: {{PLURAL:$1|ბაიტი|ბაიტი}}',
 'newsectionsummary' => '/* $1 */ ახალი სექცია',
-'rc-enhanced-expand' => 'á\83\93á\83\90á\83\9bá\83\90á\83¢á\83\94á\83\91á\83\98á\83\97á\83\98 á\83\98á\83\9cá\83¤á\83\9dá\83 á\83\9bá\83\90á\83ªá\83\98á\83\98á\83¡ á\83©á\83\95á\83\94á\83\9cá\83\94á\83\91á\83\90 (á\83\9bá\83\9dá\83\98á\83\97á\83®á\83\9dá\83\95á\83¡ á\83¯á\83\90á\83\95á\83\90á\83¡á\83\99á\83 á\83\98á\83\9eá\83¢á\83¡)',
+'rc-enhanced-expand' => 'á\83\93á\83\94á\83¢á\83\90á\83\9aá\83\94á\83\91á\83\98á\83¡  á\83©á\83\95á\83\94á\83\9cá\83\94á\83\91á\83\90',
 'rc-enhanced-hide' => 'დამატებითი ინფორმაციის დამალვა',
 'rc-old-title' => 'თავდაპირველად შექმნილი როგორც „$1“',
 
@@ -2161,8 +2161,9 @@ $1',
 'listgrouprights' => 'მომხმარებელთა ჯგუფების უფლებები',
 'listgrouprights-summary' => 'ქვემოთ წარმოდგენილია ამ ვიკიში გარკვეულ ჯგუფთა სია და მათი უფლებები.
 შესაძლოა არსებობს [[{{MediaWiki:Listgrouprights-helppage}}|დამატებითი ინფორმაცია]] ინდივიდუალურ უფლებებთან დაკავშირებით.',
-'listgrouprights-key' => '* <span class="listgrouprights-granted">წარმოდგენილი უფლებები</span>
-* <span class="listgrouprights-revoked">გაუქმებული უფლებები</span>',
+'listgrouprights-key' => 'ლეგენდა:
+* <span class="listgrouprights-granted">მიცემული უფლებები</span>
+* <span class="listgrouprights-revoked">გაწვეული უფლებები</span>',
 'listgrouprights-group' => 'ჯგუფი',
 'listgrouprights-rights' => 'უფლებები',
 'listgrouprights-helppage' => 'Help:ჯგუფების უფლებები',
@@ -2344,7 +2345,7 @@ $UNWATCHURL
 ბოლო ცვლილებები შეიტანა  [[User:$3|$3]] ([[User talk:$3|განხილვა]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "რედაქტირება განმარტებული იყო როგორც: \"''\$1''\".",
 'revertpage' => '[[Special:Contributions/$2|$2]]-ის რედაქტირება გაუქმდა; აღდგა ბოლოს [[User:$1|$1]]-ის მიერ რედაქტირებული ვერსია',
-'revertpage-nouser' => 'á\83\92á\83\90á\83£á\83¥á\83\9bá\83\93á\83\90 (á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\9aá\83\98á\83¡ á\83¡á\83\90á\83®á\83\94á\83\9aá\83\98 á\83¬á\83\90á\83\98á\83¨á\83\90á\83\9aá\83\90) á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\94á\83\9a [[User:$1|$1]] á\83\91á\83\9dá\83\9aá\83\9d á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\90á\83\96á\83\94.',
+'revertpage-nouser' => 'á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\94á\83\9a (á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\9aá\83\98á\83¡ á\83¡á\83\90á\83®á\83\94á\83\9aá\83\98 á\83\93á\83\90á\83\9bá\83\90á\83\9aá\83£á\83\9aá\83\98á\83\90)-á\83\98á\83¡ á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\90 á\83\93á\83\90á\83\91á\83 á\83£á\83\9cá\83\94á\83\91á\83£á\83\9aá\83\98á\83\90 á\83\95á\83\94á\83 á\83¡á\83\98á\83\90á\83\96á\83\94 [[User:$1|$1]]',
 'rollback-success' => 'გაუქმდა შესწორება $1; დაბრუნება ვერსიაზე $2.',
 
 # Edit tokens
index d6aaa75..544cd56 100644 (file)
@@ -1017,7 +1017,7 @@ $2
 # Edit pages
 'summary' => '요약:',
 'subject' => '주제/제목:',
-'minoredit' => 'ì\9d´ í\8e¸ì§\91ì\9d\80 ì\82¬ì\86\8cí\95\9c í\8e¸ì§\91ì\9e\85ë\8b\88ë\8b¤',
+'minoredit' => 'ì\82¬ì\86\8cí\95\9c í\8e¸ì§\91',
 'watchthis' => '이 문서 주시하기',
 'savearticle' => '저장',
 'preview' => '미리 보기',
@@ -1802,7 +1802,7 @@ HTML 태그를 확인하세요.',
 'recentchanges-noresult' => '지정한 조건과 일치하는 주어진 기간 동안 바뀜이 없습니다.',
 'recentchanges-feed-description' => '위키의 최근 바뀜이 나와 있습니다.',
 'recentchanges-label-newpage' => '새로운 문서',
-'recentchanges-label-minor' => 'ì\9d´ í\8e¸ì§\91ì\9d\80 ì\82¬ì\86\8cí\95\9c í\8e¸ì§\91ì\9e\85ë\8b\88ë\8b¤',
+'recentchanges-label-minor' => 'ì\82¬ì\86\8cí\95\9c í\8e¸ì§\91',
 'recentchanges-label-bot' => '봇의 편집',
 'recentchanges-label-unpatrolled' => '아직 검토하지 않은 편집',
 'rcnote' => "다음은 $4 $5 까지의 {{PLURAL:$2|'''$2'''일}}동안 {{PLURAL:$1|바뀐 문서 '''$1'''개입니다}}.",
@@ -2353,7 +2353,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'booksources-search-legend' => '책 찾기',
 'booksources-isbn' => 'ISBN:',
 'booksources-go' => '찾기',
-'booksources-text' => '아래의 목록은 새 책이나 중고 책을 판매하는 바깥 사이트로, 원하는 책의 정보를 얻을 수 있습니다:',
+'booksources-text' => '아래의 목록은 새 책이나 중고 책을 판매하는 바깥 사이트로, 원하는 책의 정보를 얻을 수 있습니다.',
 'booksources-invalid-isbn' => '입력한 ISBN이 잘못된 것으로 보입니다. 원본과 대조해 보세요.',
 
 # Special:Log
@@ -4141,7 +4141,7 @@ $5
 #모든 정규 표현식은 이 줄 위에 넣어 주십시오. 그리고 이 줄은 그대로 두십시오.</pre>',
 
 # Special:Tags
-'tags' => 'ì\98¬ë°\94른 편집 태그',
+'tags' => 'ì\9c í\9a¨í\95\9c 편집 태그',
 'tag-filter' => '[[Special:Tags|태그]] 필터:',
 'tag-filter-submit' => '필터',
 'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|태그}}]]: $2)',
index 97832c6..9f9121e 100644 (file)
@@ -385,6 +385,7 @@ $messages = array(
 'jumpto' => 'Salire ad:',
 'jumptonavigation' => 'navigationem',
 'jumptosearch' => 'quaerere',
+'pool-errorunknown' => 'Error ignotus',
 
 # 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' => 'De {{grammar:ablative|{{SITENAME}}}}',
@@ -475,6 +476,7 @@ Pro indice paginarum specialum validarum, vide [[Special:SpecialPages|{{int:spec
 'internalerror' => 'Erratum internum',
 'internalerror_info' => 'Erratum internum: $1',
 'filecopyerror' => 'Non potuit fasciculus "$1" ad "$2" transcribi.',
+'filerenameerror' => 'Transnominare "$1" in "$2" non contigit.',
 'filedeleteerror' => 'Non potuit deleri fasciculus "$1".',
 'directorycreateerror' => 'Non potuit directorium "$1" creari.',
 'filenotfound' => 'Non potuit fasciculus "$1" inveniri.',
@@ -482,6 +484,7 @@ Pro indice paginarum specialum validarum, vide [[Special:SpecialPages|{{int:spec
 'badarticleerror' => 'Haec actio non perfici potest in hac pagina.',
 'cannotdelete' => 'Pagina vel fasciculus "$1" deleri non potuit.
 Fortasse usor alius iam deleverat.',
+'cannotdelete-title' => 'Paginam "$1" delere non contigit',
 'badtitle' => 'Titulus malus',
 'badtitletext' => 'Nomen paginae quaestae fuit invalidum, vacuum, aut praeverbium interlingualem vel intervicialem habuit. Fortasse insunt una aut plus litterarum quae in titulis non possunt inscribier.',
 'wrong_wfQuery_params' => 'Parametri incorrectae pro wfQuery()<br />
@@ -547,6 +550,7 @@ Noli oblivisci [[Special:Preferences|praeferentias]] tuas apud {{grammar:accusat
 'createacct-email-ph' => 'Inscriptionem electronicam tuam inscribe',
 'createacct-another-email-ph' => 'Inscriptionem electronicam inscribe',
 'createaccountmail' => 'Use a temporary random password and send it to the email address specified below',
+'createacct-realname' => 'Nomen rectum (non necesse)',
 'createaccountreason' => 'Causa:',
 'createacct-reason' => 'Causa',
 'createacct-reason-ph' => 'Cur aliam rationem creas',
@@ -743,6 +747,7 @@ Nobis etiam spondes te esse ipsum horum verborum scriptorem primum, aut ex opere
 'template-semiprotected' => '(semi-protecta)',
 'hiddencategories' => 'Haec pagina ad {{PLURAL:$1|unam categoriam celatam|$1 categorias celatas}} pertinet:',
 'nocreate-loggedin' => 'Tibi non licet paginas novas creare.',
+'sectioneditnotsupported-title' => 'Recensio partis non praebetur',
 'permissionserrors' => 'Error permissionis',
 'permissionserrorstext-withaction' => 'Tibi non licet $2, ex {{PLURAL:$1|ratione|rationibus}}:',
 'recreate-moveddeleted-warn' => "'''Cave: paginam quae antea iam deleta est creas.'''
@@ -760,6 +765,9 @@ Haec pagina deleta esse videtur.',
 'edit-already-exists' => 'Non potui paginam novam creare
 quia haec pagina iam est.',
 
+# Content models
+'content-model-wikitext' => 'vicitextum',
+
 # Parser/template warnings
 'parser-template-loop-warning' => 'Ansa formulae detecta: [[$1]]',
 
@@ -800,6 +808,7 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
 
 # Revision feed
 'history-feed-title' => 'Historia',
+'history-feed-description' => 'Historia emendationum huius paginae',
 'history-feed-item-nocomment' => '$1 ad $2',
 
 # Revision deletion
@@ -827,6 +836,7 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
 'revdel-restore-visible' => 'Recensiones visibiles',
 'pagehist' => 'Historia paginae',
 'deletedhist' => 'Historia deleta',
+'revdelete-otherreason' => 'Causa alia vel explicatio:',
 'revdelete-reasonotherlist' => 'Causa alia',
 'revdelete-edit-reasonlist' => 'Causas deletionum recensere',
 'revdelete-offender' => 'Auctor emendationis:',
@@ -857,6 +867,7 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
 'compareselectedversions' => 'Conferre emendationes selectas',
 'showhideselectedversions' => 'Monstrare/celare emendationes selectas',
 'editundo' => 'abrogare',
+'diff-empty' => '(Nulla dissimilitudo)',
 'diff-multi' => '(Inter has {{PLURAL:$1|una emendatio|$1 emendationes}} ab {{PLURAL:$2|uno usore|$2 usoribus}} {{PLURAL:$1|facta|factae}} non {{PLURAL:$1|videtur|videntur}})',
 
 # Search results
@@ -915,6 +926,7 @@ Conare praefixare tua inquisitionem cum ''all:'' ut quaeras contenta omnia (pagi
 'powersearch-togglenone' => 'Nullum',
 'search-external' => 'Inquisitio externalis',
 'searchdisabled' => 'Per {{grammar:accusative|{{SITENAME}}}} ad tempus non potes quaerere. Interea per [http://www.google.com Googlem] quaeras. Nota indices {{grammar:genitive|{{SITENAME}}}} contentorum apud Googlem fortasse antiquiores esse.',
+'search-error' => 'Error in quaerendo: $1',
 
 # Preferences page
 'preferences' => 'Praeferentiae',
@@ -926,7 +938,9 @@ Conare praefixare tua inquisitionem cum ''all:'' ut quaeras contenta omnia (pagi
 'prefs-skin' => 'Aspectum',
 'skin-preview' => 'Praevisum',
 'datedefault' => 'Nullum praeferentiae',
+'prefs-beta' => 'Facultates experimentales',
 'prefs-datetime' => 'Dies et tempus',
+'prefs-user-pages' => 'Paginae usoris',
 'prefs-personal' => 'Minutiae rationis',
 'prefs-rc' => 'Nuper mutata',
 'prefs-watchlist' => 'Paginae custoditae',
@@ -998,6 +1012,11 @@ Si vis id dare, opera tua tibi ascribentur.',
 'prefs-info' => 'Informatio basica',
 'prefs-i18n' => 'Internationalizatio',
 'prefs-signature' => 'Subscriptio',
+'prefs-preview' => 'Praevisum',
+'prefs-advancedwatchlist' => 'Praeferentiae monstrare',
+'prefs-displayrc' => 'Praeferentiae vultus',
+'prefs-displaysearchoptions' => 'Praeferentiae vultus',
+'prefs-displaywatchlist' => 'Praeferentiae vultus',
 'prefs-diffs' => 'Differentiae',
 
 # User rights
@@ -1113,9 +1132,12 @@ Si vis id dare, opera tua tibi ascribentur.',
 'action-userrights' => 'omnes potestates usorum recensere',
 'action-userrights-interwiki' => 'potestates usorum aliis in vicis recensere',
 'action-siteadmin' => 'basem datorum obstruere vel deobstruere',
+'action-editmywatchlist' => 'Recensere paginas custoditas',
+'action-viewmywatchlist' => 'Spectare paginas custoditas',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|mutatio|mutationes}}',
+'enhancedrc-history' => 'Historia',
 'recentchanges' => 'Nuper mutata',
 'recentchanges-legend' => 'Indicis paginarum nuper mutatarum praeferentiae',
 'recentchanges-summary' => 'Inspice mutationes recentes huic vici in hac pagina.',
@@ -1143,7 +1165,7 @@ Si vis id dare, opera tua tibi ascribentur.',
 'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|usor custodiens|usores custodientes}}]',
 'rc_categories_any' => 'Ulla',
 'newsectionsummary' => '/* $1 */ nova pars',
-'rc-enhanced-expand' => 'Minima monstrare (JavaScript utendum)',
+'rc-enhanced-expand' => 'Minima monstrare',
 'rc-enhanced-hide' => 'Minima celare',
 
 # Recent changes linked
@@ -1301,6 +1323,9 @@ Fortasse [$2 paginam descriptionis fasciculi] ibi sitam recensere vis.',
 'randompage' => 'Pagina fortuita',
 'randompage-nopages' => 'Non est ulla pagina {{PLURAL:$2|hoc in spatio nominale|in his spatiis nominalibus}}: $1.',
 
+# Random page in category
+'randomincategory-selectcategory-submit' => 'Pergere',
+
 # Random redirect
 'randomredirect' => 'Redirectio fortuita',
 'randomredirect-nopages' => 'Non est ulla redirectio in spatio nominali "$1".',
@@ -1325,6 +1350,8 @@ Fortasse [$2 paginam descriptionis fasciculi] ibi sitam recensere vis.',
 'statistics-users-active-desc' => 'Usores qui {{PLURAL:$1|proxima die|proximis $1 diebus}} actionem perfecerunt',
 'statistics-mostpopular' => 'Paginae plurimum visae',
 
+'pageswithprop-submit' => 'Pergere',
+
 'doubleredirects' => 'Redirectiones duplices',
 'double-redirect-fixed-move' => '[[$1]] mota est et nunc redirigit ad [[$2]]',
 'double-redirect-fixer' => 'Rectificator redirectionum',
@@ -1425,6 +1452,9 @@ Adspectum graciliorem potes facere modum indicum, nomen usoris (cave litteras ma
 'allpages-bad-ns' => 'Non est spatium nominale "$1" apud {{grammar:accusative|{{SITENAME}}}}.',
 'allpages-hide-redirects' => 'Celare redirectiones',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Recentissima vide.',
+
 # Special:Categories
 'categories' => 'Categoriae',
 'categoriespagetext' => '{{PLURAL:$1|Categoria subter paginas vel fasciculos continet.|Categoriae subter paginas vel fasciculos continent.}}
@@ -1481,6 +1511,8 @@ Inscriptio electronica quam in [[Special:Preferences|praeferentiis tuis]] dedis
 'noemailtext' => 'Hic usor inscriptionem electronicam ratam non dedit.',
 'nowikiemailtitle' => 'Litterae electronicae non permissae',
 'nowikiemailtext' => 'Hic usor litteras electronicas ab aliis usoribus non vult.',
+'emailusername' => 'Nomen usoris:',
+'emailusernamesubmit' => 'Conferre',
 'email-legend' => 'Litteras electronicas usori {{grammar:genitive|{{SITENAME}}}} mittere',
 'emailfrom' => 'Ab:',
 'emailto' => 'Ad:',
@@ -1689,7 +1721,7 @@ Si pagina nova cum ipso nomine post deletionem creata est, emendationes restitut
 'mycontris' => 'Conlationes',
 'contribsub2' => 'Pro $1 ($2)',
 'nocontribs' => 'Nullae mutationes inventae sunt ex his indiciis.',
-'uctop' => ' (vertex)',
+'uctop' => '(vertex)',
 'month' => 'Ab mense (et prior):',
 'year' => 'Ab anno (et prior):',
 
@@ -2008,6 +2040,7 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
 # Info page
 'pageinfo-title' => 'Res quae ad "$1" pertinent',
 'pageinfo-header-basic' => 'De hac pagina',
+'pageinfo-header-edits' => 'Conspectus recensionum',
 'pageinfo-display-title' => 'Titulus ut in pagina ipsa monstratur',
 'pageinfo-length' => 'Magnitudo paginae (octeti)',
 'pageinfo-article-id' => 'Identificatio paginis',
@@ -2016,6 +2049,7 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
 'pageinfo-firsttime' => 'Dies et tempus creationis paginae',
 'pageinfo-lastuser' => 'Usor qui ultimam recensionem fecit',
 'pageinfo-lasttime' => 'Dies ultimae emendationis',
+'pageinfo-recent-edits' => 'Praesens numerus recensionum (intra praeterita $1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria celata|Categoriae celatae}} ($1)',
 'pageinfo-toolboxlink' => 'De hac pagina',
 
@@ -2139,6 +2173,7 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
 'exif-gpsareainformation' => 'Nomen areae GPS',
 'exif-gpsdatestamp' => 'Dies GPS',
 'exif-gpsdifferential' => 'Correctio differentialis GPS',
+'exif-source' => 'Fons',
 
 # Exif attributes
 'exif-compression-1' => 'Incompressus',
index 9fabe18..43af434 100644 (file)
@@ -188,7 +188,7 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Linken ënnersträichen:',
 'tog-justify' => "Ränner vum Text riichten (''justify'')",
-'tog-hideminor' => 'Kleng Ännerungen an de rezenten Ännerungen verstoppen',
+'tog-hideminor' => 'Kleng Ännerungen an de rezenten Ännerunge verstoppen',
 'tog-hidepatrolled' => 'Iwwerkuckten Ännerungen an de "Rezenten Ännerungen" verstoppen',
 'tog-newpageshidepatrolled' => 'Iwwerkuckte Säiten op der Lëscht vun den "Neie Säite" verstoppen',
 'tog-extendwatchlist' => 'Iwwerwaachungslëscht op all Ännerungen ausbreeden, net nëmmen op déi rezentst',
@@ -535,7 +535,7 @@ Dat geschitt normalerweis duerch e Link op eng Säit déi geläscht oder geréck
 Wann dat net de Fall ass, hutt Dir eventuell e Feeler an der Software fonnt.
 Mellt dëst w.e.g. bei engem [[Special:ListUsers/sysop|Administrateur]] a vergiesst net d'URL unzeginn.",
 'missingarticle-rev' => '(Versiounsnummer: $1)',
-'missingarticle-diff' => '(Ënnerscheed tëschent Versiounen: $1, $2)',
+'missingarticle-diff' => '(Ënnerscheed tëscht Versiounen: $1, $2)',
 'readonly_lag' => "D'Datebank gouf automatesch gespaart fir datt d'Zweetserveren (slaves) nees mat dem Haaptserver (master) synchron geschalt kënne ginn.",
 'internalerror' => 'Interne Feeler',
 'internalerror_info' => 'Interne Feeler: $1',
@@ -682,7 +682,7 @@ Vergewëssert Iech datt Dir Cookien zouloosst, luet dës Säit nei a probéiert
 'loginsuccesstitle' => 'Umeldung huet geklappt',
 'loginsuccess' => "'''Dir sidd elo als \"\$1\" op {{SITENAME}} ugemellt.'''",
 'nosuchuser' => 'Et gëtt kee Benotzernumm mam Numm "$1".
-Beim Benotzernumm gëtt tëschent groussen a klenge Buschtawen ënnerscheet (casesensitive).
+Beim Benotzernumm gëtt tëscht groussen a klenge Buschtawen ënnerscheet (casesensitive).
 Kuckt w.e.g. op d\'Schreifweis richteg ass, oder [[Special:UserLogin/signup|maacht en neie Benotzerkont op]].',
 'nosuchusershort' => 'De Benotzernumm "$1" gëtt et net.
 Kuckt w.e.g. op d\'Schreifweis richteg ass.',
@@ -997,7 +997,7 @@ Den Administrateur den d'Datebank gespaart huet, huet dës Erklärung ginn: $1",
 'nocreatetext' => "Op {{SITENAME}} gouf d'Schafe vun neie Säite limitéiert. Dir kënnt Säiten déi scho bestinn änneren oder Iech [[Special:UserLogin|umellen]].",
 'nocreate-loggedin' => 'Dir hutt keng Berechtigung fir nei Säiten unzeleeën.',
 'sectioneditnotsupported-title' => 'Ännere vum Abschnitt gëtt net ënnerstëtzt',
-'sectioneditnotsupported-text' => "D'Ännere vun Abschnitten gëtt op dëser Ännerungssäit net ënnerstetzt.",
+'sectioneditnotsupported-text' => "D'Ännere vun Abschnitte gëtt op dëser Ännerungssäit net ënnerstëtzt.",
 'permissionserrors' => 'Net genuch Rechter',
 'permissionserrorstext' => 'Dir hutt net genuch Rechter fir déi Aktioun auszeféieren. {{PLURAL:$1|Grond|Grënn}}:',
 'permissionserrorstext-withaction' => 'Dir sidd, aus {{PLURAL:$1|dësem Grond|dëse Grënn}}, net berechtegt $2 :',
@@ -1226,9 +1226,9 @@ Denkt w.e.g drunn datt d'Navigatiounslinken d'Wiel vun de Versiounen nees zréck
 
 # Diffs
 'history-title' => '$1: Historique vun de Versiounen',
-'difference-title' => '$1: Ënnerscheed tëschent de Versiounen',
-'difference-title-multipage' => '$1 a(n) $2: Ënnerscheed tëschent de Säiten',
-'difference-multipage' => '(Ënnerscheed tëschent Säiten)',
+'difference-title' => '$1: Ënnerscheed tëscht de Versiounen',
+'difference-title-multipage' => '$1 a(n) $2: Ënnerscheed tëscht de Säiten',
+'difference-multipage' => '(Ënnerscheed tëscht Säiten)',
 'lineno' => 'Linn $1:',
 'compareselectedversions' => 'Ausgewielte Versioune vergläichen',
 'showhideselectedversions' => 'Erausgesicht Versioune weisen/verstoppen',
@@ -1501,7 +1501,7 @@ Dës Informatioun ass ëffentlech.",
 'right-deletelogentry' => 'Eenzel Androungen an de Logbicher läschen a restauréieren',
 'right-deleterevision' => 'Spezifesch Versioune vu Säite läschen a restauréieren',
 'right-deletedhistory' => 'Weis geläscht Versiounen am Historique, ouni den associéierten Text',
-'right-deletedtext' => "Geläschten Text an d'Ännerungen tëschent de geläschte Versioune weisen",
+'right-deletedtext' => "Geläschten Text an d'Ännerungen tëscht de geläschte Versioune weisen",
 'right-browsearchive' => 'Geläscht Säite sichen',
 'right-undelete' => 'Eng Säit restauréieren',
 'right-suppressrevision' => 'Virun den Administrateure verstoppte Versiounen nokucken a restauréieren',
@@ -2744,7 +2744,7 @@ Dëst bedeit datt dir eng Säit zréck op deen Numm dee se virdrun hat ëmbenenn
 Dëst kann en drastesche Changement fir eng populär Säit sinn;
 verstitt w.e.g. d'Konsequenze vun ärer Handlung éier Dir dëst maacht.",
 'movepagetalktext' => "D'associéiert Diskussiounssäit, am Fall wou  eng do ass, gëtt automatesch matgeréckelt, '''ausser:'''
-*D'Säit gëtt an een anere Nummraum geréckelt.
+*D'Säit gëtt an een aneren Nummraum geréckelt.
 *Et gëtt schonn eng Diskussiounssäit mat dësem Numm, oder
 *Dir klickt d'Këschtchen ënnendrënner net un.
 
@@ -2767,7 +2767,7 @@ An deene Fäll musst Dir d'Diskussiounssäit manuell réckelen oder fusionéiere
 'articleexists' => 'Eng Säit mat dësem Numm gëtt et schonns, oder den Numm deen Dir gewielt hutt gëtt net akzeptéiert.
 Wielt w.e.g. en aneren Numm.',
 'cantmove-titleprotected' => "Dir kënnt keng Säit op dës Plaz réckelen, well deen neien Titel fir d'Uleeë gespaart ass.",
-'talkexists' => "D'Säit selwer gouf erfollegräich geréckelt, mä d'Diskussiounssäit konnt net mat eriwwergeholl gi well et schonns eng ënner deem neien Titel gëtt. W.e.g. setzt dës manuell zesummen.",
+'talkexists' => "D'Säit selwer gouf geréckelt, mä d'Diskussiounssäit konnt net mat eriwwergeholl gi well et schonns eng ënner deem neien Titel gëtt. W.e.g. setzt dës manuell zesummen.",
 'movedto' => 'geréckelt op',
 'movetalk' => 'Déi associéiert Diskussiounssäit matréckelen',
 'move-subpages' => 'Ënnersäite (bis zu $1) réckelen',
@@ -2987,7 +2987,7 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
 'tooltip-save' => 'Ännerunge späicheren',
 'tooltip-preview' => 'Kuckt är Ännerungen ouni ofzespäicheren, Benotzt dëst w.e.g. virum späicheren!',
 'tooltip-diff' => 'Weist wéi eng Ännerungen Dir beim Text gemaach hutt.',
-'tooltip-compareselectedversions' => "D'Ënnerscheeder op dëser Säit tëschent den zwou gewielte Versioune weisen.",
+'tooltip-compareselectedversions' => "D'Ënnerscheeder op dëser Säit tëscht den zwou gewielte Versioune weisen.",
 'tooltip-watch' => 'Dës Säit op Är Iwwerwaachungslëscht bäisetzen',
 'tooltip-watchlistedit-normal-submit' => 'Säiten erofhuelen',
 'tooltip-watchlistedit-raw-submit' => 'Iwwerwaachungslëscht aktualiséieren',
@@ -3152,7 +3152,7 @@ Duerch d'Opmaache vum Fichier kann Äre System beschiedegt ginn.",
 'noimages' => 'Keng Biller fonnt.',
 'ilsubmit' => 'Sichen',
 'bydate' => 'no Datum',
-'sp-newimages-showfrom' => 'Nei Biller weisen, ugefaangen den $1 ëm $2',
+'sp-newimages-showfrom' => 'Nei Biller weisen, ugefaangen de(n) $1 ëm $2',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'seconds' => '{{PLURAL:$1|enger Sekonn|$1 Sekonnen}}',
@@ -3765,7 +3765,7 @@ Dir kënnt och [[Special:EditWatchlist|de Standard Editeur benotzen]].",
 'version-poweredby-others' => 'anerer',
 'version-poweredby-translators' => 'translatewiki.net Iwwersetzer',
 'version-credits-summary' => "Mir soen dëse Persoune 'Merci' fir hir Mataarbecht u [[Special:Version|MediaWiki]].",
-'version-license-info' => "MediaWiki ass fräi Software; Dir kënnt se weiderginn an/oder s'änneren ënner de Bedingungen vun der GNU-General Public License esou wéi se vun der Free Softare Foundation publizéiert ass; entweder ënner der Versioun 2 vun der Lizenz, oder (no Ärem Choix) enger spéiderer Versioun.
+'version-license-info' => "MediaWiki ass fräi Software; Dir kënnt se weiderginn an/oder s'änneren ënner de Bedingunge vun der GNU-General Public License esou wéi se vun der Free Softare Foundation publizéiert ass; entweder ënner der Versioun 2 vun der Lizenz, oder (no Ärem Choix) enger spéiderer Versioun.
 
 MediaWiki gëtt verdeelt an der Hoffnung datt se nëtzlech ass, awer OUNI IERGENDENG GARANTIE; ouni eng implizit Garantie vu Commercialisatioun oder Eegnung fir e bestëmmte Gebrauch. Kuckt d'GPL General Public License fir méi Informatiounen.
 
@@ -3825,11 +3825,11 @@ Dir misst eng [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun der GNU General Public
 
 # External image whitelist
 'external_image_whitelist' => "#Dës Zeil genee esou loosse wéi se ass<pre>
-#Schreift hei ënnendrënner Fragmenter vu regulären Ausdréck (just den Deel zwëschen den // aginn)
+#Schreift hei ënnendrënner Fragmenter vu regulären Ausdréck (just den Deel zwëscht den // aginn)
 #Dës gi mat den URLe vu Biller aus externe Quelle verglach
 #Wann d'Resultat positiv ass, gëtt d'Bild gewisen, soss gëtt d'Bild just als Link gewisen
 #Zeilen, déi mat engem # ufänken, ginn als Bemierkung behandelt
-#Et gëtt en Ënnerscheed tëschent groussen a klenge Buschtawe gemaach
+#Et gëtt en Ënnerscheed tëscht groussen a klenge Buschtawe gemaach
 
 #All regulär Ausdréck ënner dëser Zeil androen. Dës Zeil genee esou loosse wéi se ass</pre>",
 
index f1ff6cf..673991c 100644 (file)
@@ -1573,7 +1573,7 @@ teisės",
 'rc_categories_any' => 'Bet kokia',
 'rc-change-size-new' => '$1 {{PLURAL:$1|baitas|baitai|baitų}} po pakeitimo',
 'newsectionsummary' => '/* $1 */ naujas skyrius',
-'rc-enhanced-expand' => 'Rodyti detales (reikia JavaScript)',
+'rc-enhanced-expand' => 'Rodyti detales',
 'rc-enhanced-hide' => 'Slėpti detales',
 'rc-old-title' => 'iš pradžių sukurtas kaip " $1 "',
 
index 61c2665..a21e022 100644 (file)
@@ -63,7 +63,7 @@ $messages = array(
 'tog-usenewrc' => "Grupēt izmaiņas pēc lapas pēdējās izmaiņās un uzraugāmo lapu sarakstā  (izmanto ''JavaScript'')",
 'tog-numberheadings' => 'Automātiski numurēt virsrakstus',
 'tog-showtoolbar' => 'Rādīt rediģēšanas rīkjoslu',
-'tog-editondblclick' => "Atvērt rediģēšanas lapu ar dubultklikšķi (izmanto ''JavaScript'')",
+'tog-editondblclick' => 'Atvērt lapu rediģēšanai ar dubultklikšķi',
 'tog-editsection' => 'Rādīt sadaļām izmainīšanas saiti "[labot]"',
 'tog-editsectiononrightclick' => "Atvērt sadaļas rediģēšanas lapu, uzklikšķinot ar labo peles pogu uz sadaļas virsraksta (izmanto ''JavaScript'')",
 'tog-showtoc' => 'Parādīt satura rādītāju (lapām, kurās ir vairāk par 3 virsrakstiem)',
@@ -196,6 +196,7 @@ $messages = array(
 'newwindow' => '(atveras jaunā logā)',
 'cancel' => 'Atcelt',
 'moredotdotdot' => 'Vairāk...',
+'morenotlisted' => 'Šis saraksts nav pilnīgs.',
 'mypage' => 'Lapa',
 'mytalk' => 'Diskusijas',
 'anontalk' => 'Šīs IP adreses diskusija',
@@ -376,6 +377,10 @@ Derīgo īpašo lapu saraksts atrodas te: [[Special:SpecialPages|{{int:specialpa
 # General errors
 'error' => 'Kļūda',
 'databaseerror' => 'Datu bāzes kļūda',
+'databaseerror-textcl' => 'Datu bāzes vaicājuma kļūda.',
+'databaseerror-query' => 'Vaicājums: $1',
+'databaseerror-function' => 'Funkcija: $1',
+'databaseerror-error' => 'Kļūda: $1',
 'laggedslavemode' => 'Uzmanību: Iespējams, šajā lapā nav redzami nesen izdarītie papildinājumi.',
 'readonly' => 'Datubāze bloķēta',
 'enterlockreason' => 'Ievadiet bloķēšanas iemeslu, ieskaitot aplēses, kad bloķēšana tiks beigta.',
@@ -2682,7 +2687,7 @@ Pārējie lauki, pēc noklusējuma, būs paslēpti.
 'exif-devicesettingdescription' => 'Ierīces uzstādījumu apraksts',
 'exif-subjectdistancerange' => 'Objekta attāluma diapazons',
 'exif-imageuniqueid' => 'Unikālais attēla ID',
-'exif-gpsversionid' => 'GPS taga versija',
+'exif-gpsversionid' => 'GPS iezīmes versija',
 'exif-gpslatituderef' => 'Ziemeļu vai dienvidu platums',
 'exif-gpslatitude' => 'Platums',
 'exif-gpslongituderef' => 'Austrumu vai rietumu garums',
@@ -3097,11 +3102,13 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 'intentionallyblankpage' => 'Šī lapa ar nodomu ir atstāta tukša.',
 
 # Special:Tags
-'tags' => 'Derīgi izmaiņu tagi',
-'tag-filter' => '[[Special:Tags|Tagu]] filtrs:',
+'tags' => 'Derīgas izmaiņu iezīmes',
+'tag-filter' => '[[Special:Tags|Iezīmju]] filtrs:',
 'tag-filter-submit' => 'Filtrs',
-'tags-title' => 'Tagi',
-'tags-tag' => 'Taga nosaukums',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Iezīme|Iezīmes}}]]: $2)',
+'tags-title' => 'Iezīmes',
+'tags-intro' => 'Šajā lapā uzskaitītas iezīmes, ar kurām programmatūra var atzīmēt labojumus, un to nozīme.',
+'tags-tag' => 'Iezīmes nosaukums',
 'tags-display-header' => 'Izmainīto sarakstu izskats',
 'tags-description-header' => 'Nozīmes pilns apraksts',
 'tags-hitcount-header' => 'Iezīmētās izmaiņas',
index 9e0818f..5e71254 100644 (file)
@@ -224,12 +224,12 @@ $messages = array(
 'tog-hidepatrolled' => "Hanitrika ny fanovana voaara-maso ao amin'ny fanovana farany",
 'tog-newpageshidepatrolled' => "Hanitsika ny pejy voaara-maso ao amin'ny pejy vaovao",
 'tog-extendwatchlist' => 'Hanitatra ny lisitra fanaraham-pejy mba haneho ny fanovana rehetra fa tsy ny vaovao indrindra fotsiny',
-'tog-usenewrc' => "Hamondrona ny fanovana araka ny pejy ao amin'ny fanovàna farany ary ao amin'ny pejy arahana (mila Javascript)",
+'tog-usenewrc' => "Hamondrona ny fanovana araky ny pejy ao amin'ny fanovana farany ary ao amin'ny lisitry ny pejy arahana",
 'tog-numberheadings' => 'Asio laharany ny lohateny',
-'tog-showtoolbar' => 'Asehoy ny edit toolbar (mila JavaScript)',
-'tog-editondblclick' => 'Ovay ny pejy rehefa voatsindry indroa misesy ny totozy (mila JavaScript)',
+'tog-showtoolbar' => 'Haneho ny toolbar fanovana',
+'tog-editondblclick' => "Hanova pejy amin'ny alalan'ny tsindrim-boalavo roa misesy",
 'tog-editsection' => "Ataovy mety ny fanovana fizaràna amin'ny alalan'ny rohy [hanova]",
-'tog-editsectiononrightclick' => "Ovay ny fizaràna rehefa manindry ny bokotra havanana amin'ny totozy eo amin'ny lohateny hoe fizaràna (mila JavaScript)",
+'tog-editsectiononrightclick' => "Hampiasa ny fanovana fizarana amin'ny tsindry havanana eo amin'ny lohatenim-pizarana.",
 'tog-showtoc' => "Asehoy ny fanoroan-takila (ho an'ny pejy misy lohateny mihoatra ny 3)",
 'tog-rememberpassword' => "Tadidio ny tenimiafiko eto amin'ity solosaina ity (mandritry ny andro $1 fara-fahabetsany){{PLURAL:}}",
 'tog-watchcreations' => 'Hanaraka ny pejy foronoko ary ny rakitra ampidiriko',
@@ -247,7 +247,7 @@ $messages = array(
 'tog-shownumberswatching' => "Asehoy ny isan'ny mpikambana manara-maso ny pejy",
 'tog-oldsig' => "Topi-mason'ny sonia :",
 'tog-fancysig' => 'Sonia tsotra (tsy misy rohy)',
-'tog-uselivepreview' => 'Ampesao ny topi-maso maikamaika (mila Javascript) (mbola am-panandramana)',
+'tog-uselivepreview' => 'Hampiasa ny topi-maso malakay (andramana)',
 'tog-forceeditsummary' => 'Teneno ahy ra tsy nametraka ny ambangovangony',
 'tog-watchlisthideown' => "Tsy ampiseho anatin'ny pejy fanaraha-maso ny zavatra nosoratako",
 'tog-watchlisthidebots' => "Asitriho amin'ny lisitro ny fanovàna nataon'ny rôbô",
@@ -259,6 +259,8 @@ $messages = array(
 'tog-diffonly' => "Aza ampiseho ny voatonin'ny pejy eo amban'ny diff",
 'tog-showhiddencats' => 'Asehoy ny sokajy misitrika',
 'tog-norollbackdiff' => 'Aza aseho ny diff rehefa avy namafa fanàvana iray',
+'tog-useeditwarning' => 'Ampitandremo aho raha miala sady mamela pejy ovaiko nefa tsy notahiriziko',
+'tog-prefershttps' => 'Fanohizana azo antoka foana no ampaisaina rehefa tafiditra',
 
 'underline-always' => 'Foana foana',
 'underline-never' => 'Tsy tsipihina mihitsy',
@@ -359,7 +361,7 @@ $messages = array(
 'newwindow' => '(sokafy anaty takila hafa)',
 'cancel' => 'Aoka ihany',
 'moredotdotdot' => 'Tohiny...',
-'morenotlisted' => 'Tohiny tsy voalisitra...',
+'morenotlisted' => 'Tsy feno ity lisitra ity.',
 'mypage' => 'Pejy',
 'mytalk' => 'Dinika',
 'anontalk' => "Resaka ho an'io adiresy IP io",
@@ -393,6 +395,7 @@ $messages = array(
 'namespaces' => 'Valam-pejy',
 'variants' => "Ny ''skin'' Voasintona",
 
+'navigation-heading' => 'Meny fitetezana',
 'errorpagetitle' => 'Tsy fetezana',
 'returnto' => "Hiverina any amin'ny $1.",
 'tagline' => "Avy amin'i {{SITENAME}}",
@@ -542,6 +545,12 @@ Mitaky version $1-n'i MediaWiki",
 # General errors
 'error' => 'Tsy mety',
 'databaseerror' => "Tsy fetezana eo amin'ny toby",
+'databaseerror-text' => "Nisy hadisoana banky angona nitranga.
+Mety maneho baogy ao amin'ny rindrankajy izany.",
+'databaseerror-textcl' => 'Nisy hadisoana banky angona nitranga.',
+'databaseerror-query' => 'Hataka: $1',
+'databaseerror-function' => 'Lefa: $1',
+'databaseerror-error' => 'Hadisoana: $1',
 'laggedslavemode' => 'Fampitandremana: Mety ho tsy nisy fanovana vao haingana angamba io pejy io',
 'readonly' => 'Mihidy ny banky angona',
 'enterlockreason' => 'Manomeza antony hanidiana ny pejy, ahitana ny fotoana tokony hamahana izay fihidiana izay',
@@ -577,6 +586,7 @@ Mety efa nataon'ny hafa angamba ny famafàna.",
 'cannotdelete-title' => 'Tsy afaka mamafa ny pejy "$1"',
 'delete-hook-aborted' => "Famafana nofoanan'ny itatra.
 Tsy nanome fanazavana.",
+'no-null-revision' => 'Tsy nahaforona famerenana poaka aty ho an\'ny pejy "$1"',
 'badtitle' => 'Tsy mety ny lohateny',
 'badtitletext' => "Tsy mety io anaram-pejy nangatahinao io na tsy misy n'inon'inona na rohy dikan-teny vahiny misy diso tsipelina.",
 'perfcached' => "Ao amin'ny voatakona ireo data manaraka ireo ary mety tsy voavao. $1{{PLURAL:}} ihany no isan'ireo zavatra voatahiry ao amin'ny voatakona",
@@ -627,16 +637,16 @@ Ny antony nomen\'ny mpandrindra nanidy azy: "$3".',
 'virus-unknownscanner' => 'Tsy fantatra io Antivirus io :',
 
 # Login and logout pages
-'logouttext' => "'''Tafavoaka ianao ankehitriny.'''
+'logouttext' => "'''Efa tafavoaka amin'izay ianao.'''
 
-Mbola afaka mampiasa ny {{SITENAME}} ianao na dia ef anivoaka aza, na afaka <span class='plainlinks'>[$1 miverina mihiditra]</span> ianao ambanin'ny anaranao na anaram-pikambana hafa.
-Fantaro fa ny endriky ny pejy sasany dia mety mitovy amin'ny endrika nahitanao azy tamin' ianao mbola niditra tato, ho toy izany ny endri-pejy raha tsy nofafanao ny cache.",
+Fantaro fa mety mbola misy ireo pejy milaza anao fa mbola tafiditra raha tsy namafa ny pejy voatakona (cache) ianao.",
 'welcomeuser' => 'Tonga soa, $1',
 'welcomecreation-msg' => "Noforonina ny aontinao.
 Aza adin ny manova ny [[Special:Preferences|safidinao ro amin'i{{SITENAME}}]].",
 'yourname' => 'Solonanarana',
 'userlogin-yourname' => 'Anaram-pikambana',
 'userlogin-yourname-ph' => 'Atsofohy ny anaram-pikambanao',
+'createacct-another-username-ph' => 'Atsofohy ny anaram-pikambana',
 'yourpassword' => 'Tenimiafina',
 'userlogin-yourpassword' => 'Tenimiafina',
 'userlogin-yourpassword-ph' => 'Atsofohy ny tenimiafinao',
@@ -668,19 +678,23 @@ Mila manaiky cookies ianao raha te hiditra amin'ny {{SITENAME}}.",
 'gotaccountlink' => 'Midira',
 'userlogin-resetlink' => "Adinonavo ve ny antsipihan'ny fidiranao ?",
 'userlogin-resetpassword-link' => 'Hamerina ny tenimiafinao',
-'helplogin-url' => 'Fanoroana:Fidirana',
+'helplogin-url' => 'Help:Fidirana',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Fanoroana mikasika ny fidirana]]',
 'createacct-join' => 'Atsofohy eo ambany ny fampahalalana momba anao.',
+'createacct-another-join' => "Atsofohy eo ambany ny fampahalalana vaovaon'ny kaonty",
 'createacct-emailrequired' => 'Adiresy mailaka :',
 'createacct-emailoptional' => 'Adiresy mailaka (azo tsy atao) :',
 'createacct-email-ph' => 'Atsofohy ny adiresy mailakao',
-'createaccountmail' => "Hampiasa tenimiafina kisendra vonjimaika ary handefa azy mailaka any amin'ny adiresy nolazaina teo ambany",
+'createacct-another-email-ph' => 'Atsofohy ny adiresy mailaka',
+'createaccountmail' => "Hampiasa tenimiafina vonjimaika ary handefa azy eo amin'ny adiresy mailaka voalaza",
 'createacct-realname' => 'Tena anarana (azo tsy atao)',
 'createaccountreason' => 'Antony :',
 'createacct-reason' => 'Antony',
 'createacct-reason-ph' => 'Inona ny antony hamoronanao kaonty hafa',
+'createacct-captcha' => 'Fitsapana ny antoka',
 'createacct-imgcaptcha-ph' => 'Atsofohy ny teny hitanao eo ambony',
 'createacct-submit' => 'Hamorona ny kaontinao',
+'createacct-another-submit' => 'Hamorona kaonty vaovao',
 'createacct-benefit-heading' => "Olona tahaka ianao no manoratra eo amin'i {{SITENAME}}",
 'createacct-benefit-body1' => 'fanovana{{PLURAL:$1}}',
 'createacct-benefit-body2' => 'pejy{{PLURAL:$1}}',
@@ -752,11 +766,14 @@ Tokony miditra na manokatra kaonty ianao, ary ovay ny tenimiafinao dien-izao.
 
 Aza mijery ity hafatra ity ianao raha voaforona an-tsifetezana ilay kaonty io.",
 'usernamehasherror' => 'Ny anaram-pikambana dia tsy afaka manana soratra fanaovana hash.',
-'login-throttled' => "Im-betsaka loatra ianao no nanandrana tenimiafina teo amin'io kaonty io.
-Andraso kely ary andramo indray.",
+'login-throttled' => "Betsaka loatra ny andram-pidirana nataonao.
+
+Andraso $1 alohan'ny mamerina.",
 'login-abort-generic' => 'Tsy nahomby ny fanandramanao niditra',
 'loginlanguagelabel' => 'fiteny : $1',
 'suspicious-userlogout' => "Ny fangataham-pialanao dia tsy nekena satria ohatry ny nalfan'ny mpizahan-tsehatra simba izy na kasy ny proxy.",
+'createacct-another-realname-tip' => "Azo tsy atsofoka ny tena anarana.
+Raha misafidy ny hanome azy ianao, ho ampiasaina amin'ny fanehoana ny anjara asan'ilay mpikambana ilay izy.",
 
 # Email sending
 'php-mail-error-unknown' => "Hadisoana tsy fantatra tao amin'ny tao mial() an'i PHP.",
@@ -771,7 +788,7 @@ Andraso kely ary andramo indray.",
 'newpassword' => 'Tenimiafina vaovao:',
 'retypenew' => 'Avereno ampidirina ny tenimiafina vaovao:',
 'resetpass_submit' => 'Ovay ny tenimiafina ary midira',
-'changepassword-success' => 'Voasolo soa aman-tsara ny tenimiafinao ! Mampiditranao izao ankehitriny...',
+'changepassword-success' => 'Voaova soa aman-tsara ny tenimiafinao!',
 'resetpass_forbidden' => 'Tsy afaka ovaina ny tenimiafina',
 'resetpass-no-info' => "Tsy maintsy tafiditra ao amin'ny kaontinao ianao vao afaka mijery ity pejy ity.",
 'resetpass-submit-loggedin' => 'Ovay ny tenimiafina',
@@ -830,6 +847,9 @@ Tenimiafina miserana : $2',
 'resettokens-legend' => 'Famerenana ny token',
 'resettokens-tokens' => 'Token:',
 'resettokens-token-label' => '$1 (sanda ankehitriny: $2)',
+'resettokens-watchlist-token' => "Token ho an'ny fahna web (Atom/RSS) ho an'ny  [[Special:Watchlist|fanovana ny pejy ao amin'ny lisitry ny pejy arahanao]]",
+'resettokens-done' => 'Natao reset ny token',
+'resettokens-resetbutton' => 'Hanao reset ny token voafidy',
 
 # Edit page toolbar
 'bold_sample' => 'Soratra matavy',
@@ -910,7 +930,7 @@ Mety efa nakisaka angamba izy, na voafafa tamin' ianareo namaky ity pejy ity far
 'loginreqlink' => 'miditra',
 'loginreqpagetext' => 'Tokony $1 ianao raha te hijery pejy hafa.',
 'accmailtitle' => 'Lasa ny tenimiafina.',
-'accmailtext' => 'Lasa any amin\'i $2 ny tenimiafin\'i "$1".',
+'accmailtext' => "Nalefa tany amin'i $2 ny tenimiafina kisendra ho an'ny kaonty [[User talk:$1|$1]]! Azo ovaina eo amin'i ''[[Special:ChangePassword|Manova tenimiafina]]'' izany amin'ny alalan'ny fidirana.",
 'newarticle' => '(Vaovao)',
 'newarticletext' => "Mbola tsy misy ity takelaka ity koa azonao atao ny mamorona azy eto ambany. Jereo ny [[{{MediaWiki:Helppage}}|Fanoroana]] raha misy fanazavana ilainao.
 
@@ -1059,6 +1079,7 @@ Ao aorian'ny fivelarana, mety namoaka valy lava loatra angamba izy, ary tsy namp
 'expansion-depth-exceeded-category' => 'Pejy manana halalim-panitarana mihoatra',
 'expansion-depth-exceeded-warning' => 'Pejy manana halalim-panitarana mihoatra',
 'parser-unstrip-loop-warning' => 'Nahitana tondro mifolaka tsy azo vahana',
+'parser-unstrip-recursion-limit' => 'Tafahoatra ny fetra avo ny fetra recursion ($1)',
 'converter-manual-rule-error' => "Nahitana hadisoana ao amin'ny fepetra famadihana tanana ny fiteny.",
 
 # "Undo" feature
@@ -1066,6 +1087,7 @@ Ao aorian'ny fivelarana, mety namoaka valy lava loatra angamba izy, ary tsy namp
 'undo-failure' => "Tsy afaka esorina io fanovàna io : mety tsy miraikitra amin'ny fanovàna misy eo ampivoaniny ra esorina",
 'undo-norev' => 'Tsy afaka nesorina ilay fanovàna satria tsy misy na efa voafafa izy.',
 'undo-summary' => "Niala ny fanovàna $1 nataon'i [[Special:Contributions/$2|$2]] ([[User talk:$2|resaho]])",
+'undo-summary-username-hidden' => 'Namafa ny famerenana $1 nataom-pikambana afenina',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Tsy afaka manokatra kaonty ianao.',
@@ -1314,6 +1336,7 @@ ihany no miseho amin'ny vokatry ny karoka).",
 'powersearch-togglenone' => 'Tsy misy',
 'search-external' => 'Hikaroka any ivelany',
 'searchdisabled' => "Tsy nalefa ny karoka eto amin'i {{SITENAME}}. Afaka mampiasa an'i Google aloha ianao mandra-paha. Nefa fantaro fa mety ho efa lany daty ny valiny omeny.",
+'search-error' => 'Hadisoana nitranga tam-pikarohana: $1',
 
 # Preferences page
 'preferences' => 'Ny momba anao',
@@ -1345,7 +1368,7 @@ ihany no miseho amin'ny vokatry ny karoka).",
 'prefs-rendering' => 'Fampisehoana',
 'saveprefs' => 'Tehirizo',
 'resetprefs' => 'Avereno',
-'restoreprefs' => 'Averina ny reglages taloha',
+'restoreprefs' => "Hamerina ny safidy taloha (amin'ny fizarana rehetra)",
 'prefs-editing' => 'Fanovana',
 'rows' => 'Filaharana :',
 'columns' => 'Tsanganana/Tioba :',
@@ -1401,10 +1424,10 @@ Fenoy araka ny datin'ny solosainan'ny mpitsidika",
 'badsig' => 'Tsy mety io sonia io; hamarino ny kialo HTML.',
 'badsiglength' => "Lava loatra ny sonianao. {{PLURAL:$1||}}
 Tokony mba manana lohavy ambanimbany kokoa non'ny $1",
-'yourgender' => 'lahi-vavy :',
-'gender-unknown' => 'Tsy voalaza',
-'gender-male' => 'Lehilahy',
-'gender-female' => 'Vehivavy',
+'yourgender' => 'Tiana hofaritana ahoana ianao?',
+'gender-unknown' => 'Tsy tia hanome ny antsipirihany aho',
+'gender-male' => 'Manova pejy wiki izy (lehilahy)',
+'gender-female' => 'Manova pejy wiki izy (vehivavy)',
 'prefs-help-gender' => "Ankifidy : Ampiasaina mba hifanaraka amin'ny lahi-vavy. Ho sarababem-bahoaka io fampahalalàna io.",
 'email' => 'Imailaka',
 'prefs-help-realname' => "Anarana marina (afaka tsy fenoina): raha fenoinao ity dia hampiasaina hanomezana anao tambin'ny asa izay efainao eto.",
@@ -1427,7 +1450,9 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'prefs-displayrc' => 'safidim-tseho',
 'prefs-displaysearchoptions' => 'Safidin-tseho',
 'prefs-displaywatchlist' => 'Safidin-tseho',
+'prefs-tokenwatchlist' => 'Token',
 'prefs-diffs' => 'Diff',
+'prefs-help-prefershttps' => "Hihatra amin'ny fidiranao manaraka ity safidy ity.",
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Adiresy imailaka mameno fepetra',
@@ -1451,10 +1476,10 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'userrights-no-interwiki' => "Tsy manana alalana manova ny alalan'ny mpikambana eny amin'ny wiki hafa ianao.",
 'userrights-nodatabase' => 'Tsy eto akaiky na tsy misy ny banky angona « $1 ».',
 'userrights-nologin' => "Tsy maintsy [[Special:UserLogin|miditra]] ary manana kaontim-pandrindra ianao raha hanova ny alalan'ny mpikambana.",
-'userrights-notallowed' => "Tsy afaka manova ny fahafahan'ny mpikambana ny kaontinao.",
+'userrights-notallowed' => 'Tsy manana alalana ny manova na manampy zom-pikambana ianao.',
 'userrights-changeable-col' => 'Ny gropy azonao ovaina',
 'userrights-unchangeable-col' => 'Ny gropy tsy azonao ovaina',
-'userrights-conflict' => 'Fifandonana zom-pikambana! Ampiharo fanindroany ny fanovanao.',
+'userrights-conflict' => 'Fifandonana fanovana zom-pikambana! Avereno vakiana ary marino ny fanovanao.',
 'userrights-removed-self' => "Afakao soa aman-tsara ny zonao. Noho izany, tsy afaka mijery amin'ilay pejy intsony ianao.",
 
 # Groups
@@ -1520,8 +1545,9 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'right-ipblock-exempt' => 'Tsy voakasiky ny fanakanana IP, ny fanakanana mandeha ho azy (aotômatika) ary ny fanakanana sampana IP',
 'right-proxyunbannable' => "Tsy voakasiky ny fanakana mande hoazy avy amin'ny proxy",
 'right-unblockself' => "Manala ny hidin'ny tena",
-'right-protect' => "Manova ny fiarovan'ny pejy sy manova ny pejy voaaro",
+'right-protect' => "Manova ny lenta fiarovan'ny pejy sy manova ny pejy voaaro miriana",
 'right-editprotected' => 'Manova pejy voaaro (tsy misy fiarovana en cascade)',
+'right-editsemiprotected' => 'Hanova ny pejy narovna ho "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Manova ny interface ny mpikambana',
 'right-editusercssjs' => 'Manova ny rakitra CSS sy JS ny mpikambana hafa',
 'right-editusercss' => 'Manova ny rakitra CSS ny mpikambana hafa',
@@ -1601,6 +1627,8 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|fanovana|fanovana}} $1',
+'enhancedrc-since-last-visit' => '$1 ({{PLURAL:$1|hatry ny famangiana farany}})',
+'enhancedrc-history' => 'tantara',
 'recentchanges' => 'Fanovana farany',
 'recentchanges-legend' => 'Safidy ny fanovàna farany',
 'recentchanges-summary' => "Jereo eto amin'ity pejy ity izay vao niova vao haingana teto amin'ity wiki ity.",
@@ -1632,7 +1660,7 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'rc_categories_any' => 'Tsy misy fetrany',
 'rc-change-size-new' => "$1{{PLURAL:}} oktety taorian'ny fanovana",
 'newsectionsummary' => '/* $1 */ fizarana vaovao',
-'rc-enhanced-expand' => 'Jereo ny detail (mila JavaScript)',
+'rc-enhanced-expand' => 'Hijery ny antsipirihany',
 'rc-enhanced-hide' => 'Asitriho ny adidiny sy ny antsipiriany',
 'rc-old-title' => 'noforonina tamin\'ilay lohateny "$1"',
 
@@ -1887,6 +1915,8 @@ Rehefa sivanin'ny mpikambana iray izy ity, ny rakitra izay ahitana santiôna vao
 'listfiles_size' => 'Habe',
 'listfiles_description' => 'Visavisa',
 'listfiles_count' => 'Version',
+'listfiles-latestversion-yes' => 'Eny',
+'listfiles-latestversion-no' => 'Tsia',
 
 # File description page
 'file-anchor-link' => 'Rakitra',
@@ -2005,8 +2035,13 @@ Aza manadino manamarina raha tsy misy rohy makany amin'ny endrika hafa alohan'ny
 'statistics-users-active-desc' => "Mpikambana nanao zavatra teto tanatin'ny $1 andro{{PLURAL:}}.",
 'statistics-mostpopular' => 'Pejy voatsidika',
 
+'pageswithprop' => 'Pejy misy toe-pejy',
+'pageswithprop-legend' => 'Pejy misy toe-pejy',
+'pageswithprop-text' => 'Manalisitra ny pejy mampiasa toe-pejy manokana ity',
 'pageswithprop-prop' => "Anaran'ilay tondro",
 'pageswithprop-submit' => 'Alefa',
+'pageswithprop-prophidden-long' => 'Sandan-toe-dahatsoratra lava miafina ($1)',
+'pageswithprop-prophidden-binary' => 'sandan-toetra roa fototra miafina ($1)',
 
 'doubleredirects' => 'Fihodinana roa',
 'double-redirect-fixed-move' => "Ity fihodinana ity, nanana ny tanjona [[$1]] novaina anarana, dia mitondra mankany amin'ny [[$2]].",
@@ -2855,6 +2890,11 @@ Tsy hita ny rakitra miserana.',
 'import-token-mismatch' => 'Very ny fampahalalàna momba ny kaonty.
 Avereno fanindroany.',
 'import-invalid-interwiki' => "Tsy afaka mampiditra avy any amin'ilay wiki nofidiana.",
+'import-error-edit' => 'Tsy nafarana ny pejy "$1" satria tsy afaka manova azy ianao.',
+'import-error-create' => 'Tsy nafarana ny pejy "$1" satria tsy afaka mamorona azy ianao.',
+'import-error-interwiki' => 'Tsy nafarana ny pejy "$1" satria atokana ho an\'ny rohy interwiki ny anarany.',
+'import-error-special' => 'Tsy nafarana ny pejy "$1" satria amy valan\'anarana tsy mandray pejy ilay izy.',
+'import-error-invalid' => 'Tsy nafarana ny pejy "$1" satria tsy ekena ny anarany.',
 'import-rootpage-invalid' => 'Lohateny tsy azo raisina ny foto-pejy nomenao:',
 
 # Import log
@@ -3156,10 +3196,18 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray .
 'exif-fnumber' => 'Isa F',
 'exif-exposureprogram' => 'Fomba famakiana',
 'exif-isospeedratings' => 'ISO',
+'exif-shutterspeedvalue' => 'hafaingam-panapenana ny APEX',
 'exif-aperturevalue' => 'Fisanasana APEX',
+'exif-brightnessvalue' => "Hazavan'ny APEX",
+'exif-exposurebiasvalue' => 'fanitsiana ny fanehoana',
+'exif-maxaperturevalue' => 'Fisokafana be indrindra',
+'exif-subjectdistance' => "Halaviran'ny alaina sary",
+'exif-meteringmode' => 'Fomba fandrefesana',
 'exif-lightsource' => 'Loharanon-kazavana',
 'exif-flashenergy' => "Angôvon'akonkazavana",
+'exif-subjectlocation' => "Toeram-pisian'ny alaina sary",
 'exif-filesource' => 'Fangon-drakitra',
+'exif-digitalzoomratio' => "Tahan'ny zoom arak'isa",
 'exif-imageuniqueid' => "ID an'io sary io manokana",
 'exif-gpslatituderef' => 'Laharam-pehintany avaratra na atsimo',
 'exif-gpslatitude' => 'Laharam-pehintany',
index 08d895a..19db9ed 100644 (file)
@@ -1428,6 +1428,7 @@ Tindakan ini tidak boleh dibatalkan.',
 'prefs-displaysearchoptions' => 'Pilihan paparan',
 'prefs-displaywatchlist' => 'Pilihan paparan',
 'prefs-diffs' => 'Beza',
+'prefs-help-prefershttps' => 'Keutamaan inu akan berkuatkuasa pada lain kali anda log masuk.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Alamat e-mel adalah sah',
@@ -3916,6 +3917,7 @@ Anda patut telah menerima [{{SERVER}}{{SCRIPTPATH}}/COPYING sebuah salinan bagi
 'dberr-problems' => 'Harap maaf. Tapak web ini dilanda masalah teknikal.',
 'dberr-again' => 'Cuba tunggu selama beberapa minit dan muat semula.',
 'dberr-info' => '(Tidak dapat menghubungi pelayan pangkalan data: $1)',
+'dberr-info-hidden' => '(Pelayan pangkalan data tidak dapat dihubungi)',
 'dberr-usegoogle' => 'Buat masa ini, anda boleh cuba mencari melalui Google.',
 'dberr-outofdate' => 'Sila ambil perhatian bahawa indeks mereka bagi kandungan kami mungkin sudah ketinggalan zaman.',
 'dberr-cachederror' => 'Yang berikut ialah salinan bagi laman yang diminta yang diambil daripada cache, dan mungkin bukan yang terkini.',
@@ -4052,6 +4054,7 @@ Ataupun, anda boleh menggunakan borang yang mudah di bawah. Ulasan anda akan dic
 'rotate-comment' => 'Imej diputar sebanyak $1 {{PLURAL:$1|darjah|darjah}} mengikut arah jam',
 
 # Limit report
+'limitreport-title' => 'Data pemprofilan penghurai:',
 'limitreport-cputime' => 'Penggunaan masa CPU',
 'limitreport-cputime-value' => '$1 saat',
 'limitreport-walltime' => 'Penggunaan masa nyata',
index 81df40b..bfb72eb 100644 (file)
@@ -765,11 +765,11 @@ Vergeet niet joew [[Special:Preferences|veurkeuren veur {{SITENAME}}]] an te pas
 'createacct-realname' => 'Echte naam (niet verplicht)',
 'createaccountreason' => 'Reden:',
 'createacct-reason' => 'Reden',
-'createacct-reason-ph' => 'Waorumme jie n aandere gebruker anmaken',
+'createacct-reason-ph' => 'Waorumme je n aandere gebrukerskonto anmaken',
 'createacct-captcha' => 'Veiligheidskontraole',
 'createacct-imgcaptcha-ph' => "Voer de tekste in die'j hierboven zien",
-'createacct-submit' => 'Gebruker anmaken',
-'createacct-another-submit' => 'n Aandere gebruker anmaken',
+'createacct-submit' => 'Gebrukerskonto anmaken',
+'createacct-another-submit' => 'n Aandere gebrukerskonto anmaken',
 'createacct-benefit-heading' => '{{SITENAME}} wörden emaakt deur meensen zo as jie.',
 'createacct-benefit-body1' => 'bewarking{{PLURAL:$1||en}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|zied|ziejen}}',
@@ -833,8 +833,8 @@ Voer de juuste opmaak van t adres in of laot t veld leeg.',
 'accountcreated' => 'Gebrukersprofiel is an-emaakt',
 'accountcreatedtext' => 'De gebrukersnaam veur [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) is an-emaakt.',
 'createaccount-title' => 'Gebrukers anmaken veur {{SITENAME}}',
-'createaccount-text' => 'Der hef der ene n gebruker veur $2 an-emaakt op {{SITENAME}} ($4). t Wachtwoord veur "$2" is "$3".
-Meld je noen an en wiezig t wachtwoord.
+'createaccount-text' => 'Der hef der ene n gebruker an-emaakt op {{SITENAME}} ($4), mit de naam $2 en t wachtwoord "$3". 
+Meld je eigen noen an en wiezig t wachtwoord.
 
 Negeer dit bericht as disse gebruker zonder joew toestemming an-emaakt is.',
 'usernamehasherror' => "In n gebrukersnaam ma'j gien hekjen gebruken.",
@@ -1662,7 +1662,7 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 'action-edit' => 'disse zied bewarken',
 'action-createpage' => 'ziejen schrieven',
 'action-createtalk' => 'overlegziejen anmaken',
-'action-createaccount' => 'disse gebruker anmaken',
+'action-createaccount' => 'disse gebrukerskonto anmaken',
 'action-minoredit' => 'disse bewarking as klein markeren',
 'action-move' => 'disse zied herneumen',
 'action-move-subpages' => 'disse zied en de biebeheurende ziejen die deronder hangen herneumen',
@@ -2465,9 +2465,9 @@ Bevestig hieronder dat dit inderdaod de bedoeling is, da'j de gevolgen begriepen
 'deleteotherreason' => 'Aandere/extra reden:',
 'deletereasonotherlist' => 'Aandere reden',
 'deletereason-dropdown' => '*Redens veur t vortdoon van ziejen
-** Op vrage van de auteur
-** Schending van de auteursrechten
-** Vandelisme',
+** Op verzeuk van de auteur
+** Schending van auteursrecht
+** Vandalisme',
 'delete-edit-reasonlist' => 'Redens veur t vortdoon bewarken',
 'delete-toobig' => 'Disse zied hef n lange bewarkingsgeschiedenisse, meer as $1 {{PLURAL:$1|versie|versies}}.
 t Vortdoon van dit soort ziejen is mit rechten bepark um t per ongelok versteuren van de warking van {{SITENAME}} te veurkoemen.',
@@ -2540,8 +2540,8 @@ Hier staon de instellingen zo as ze noen bin veur de zied '''$1''':",
 'protect-otherreason' => 'Aandere reden:',
 'protect-otherreason-op' => 'aandere reden',
 'protect-dropdown' => '*Veulveurkomende redens veur beveiliging
-** Vandelisme
-** Ongewunste verwiezingen plaotsen
+** Te veul vandalisme
+** Te veul moekreklame
 ** Bewarkingsoorlog
 ** Zied mit veule bezeukers',
 'protect-edit-reasonlist' => 'Redens veur beveiliging bewarken',
@@ -2676,7 +2676,9 @@ De leste regel uut t blokkeerlogboek steet as referensie',
 'blockip' => 'Gebruker blokkeren',
 'blockip-title' => 'Gebruker blokkeren',
 'blockip-legend' => 'n Gebruker of IP-adres blokkeren',
-'blockiptext' => 'Gebruuk dit formulier um n IP-adres of gebrukersnaam te blokkeren. t Is bedoeld um vandelisme te veurkoemen en mit in akkerderen mit t [[{{MediaWiki:Policy-url}}|beleid]]. Geef hieronder n reden op (bieveurbeeld op welke ziejen de vandelisme epleeg is)',
+'blockiptext' => 'Gebruuk dit formulier um n IP-adres of gebrukersnaam te blokkeren. 
+t Is bedoeld um vandalisme te veurkoemen en mut akkederen mit t [[{{MediaWiki:Policy-url}}|beleid]]. 
+Geef hieronder n reden op (bieveurbeeld op welke ziejen de vandalisme epleegd is).',
 'ipadressorusername' => 'IP-adres of gebrukersnaam',
 'ipbexpiry' => 'Verlöp nao',
 'ipbreason' => 'Reden:',
@@ -4021,9 +4023,9 @@ Samen mit dit programma heur je n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van de
 'logentry-move-move_redir-noredirect' => '$1 hef de zied $3 {{GENDER:$2|herneumd}} naor $4 over n deurverwiezing heer zonder n deurverwiezing achter te laoten',
 'logentry-patrol-patrol' => '$1 hef versie $4 van de zied $3 op {{GENDER:$2|nao-ekeken}} ezet',
 'logentry-patrol-patrol-auto' => '$1 hef versie $4 van de zied $3 automaties op {{GENDER:$2|nao-ekeken}} ezet',
-'logentry-newusers-newusers' => '$1 hef n gebruker {{GENDER:$2|an-emaakt}}',
-'logentry-newusers-create' => '$1 hef n gebruker {{GENDER:$2|an-emaakt}}',
-'logentry-newusers-create2' => '$1 hef n gebruker $3 {{GENDER:$2|an-emaakt}}',
+'logentry-newusers-newusers' => 'Gebruker $1 is {{GENDER:$2|an-emaakt}}',
+'logentry-newusers-create' => 'Gebruker $1 is {{GENDER:$2|an-emaakt}}',
+'logentry-newusers-create2' => 'Gebruker $3 is {{GENDER:$2|an-emaakt}} an-emaakt deur $1',
 'logentry-newusers-byemail' => 'Gebruker $3 {{GENDER:$2|is}} an-emaakt deur $1 en t wachtwoord is per netpost verstuurd',
 'logentry-newusers-autocreate' => 'De gebruker $1 is automaties {{GENDER:$2|an-emaakt}}',
 'logentry-rights-rights' => '$1 {{GENDER:$2|hef}} groepslidmaotschap veur $3 ewiezigd van $4 naor $5',
index 27a1072..53b26a5 100644 (file)
@@ -1136,8 +1136,8 @@ Uw eigen .css- en .js-pagina's beginnen met een kleine letter, bijvoorbeeld {{ns
 Uw tekst is niet opgeslagen!",
 'continue-editing' => 'Naar het bewerkingsvenster gaan',
 'previewconflict' => 'Deze voorvertoning geeft aan hoe de tekst in het bovenste veld eruit ziet als u deze opslaat.',
-'session_fail_preview' => "'''Excuses, uw bewerking is niet opgeslagen, omdat de sessiegegevens verloren zijn gegaan.'''
-Probeert U het opnieuw.
+'session_fail_preview' => "'''Excuses, uw bewerking is niet opgeslagen omdat de sessiegegevens verloren zijn gegaan.'''
+Probeer het opnieuw.
 Als het dan nog niet lukt, [[Special:UserLogout|meld uzelf dan af]] en vervolgens weer aan.",
 'session_fail_preview_html' => "'''Uw bewerking is niet verwerkt, omdat de sessiegegevens verloren zijn gegaan.'''
 
index 9c21764..50715bb 100644 (file)
@@ -368,8 +368,8 @@ $messages = array(
 'underline-default' => 'Drakt- eller nettlesarstandard',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'Endre stilen for skrifttypen i området:',
-'editfont-default' => 'Nettlesar i utgangspunktet',
+'editfont-style' => 'Skrifttype i endringsboksen:',
+'editfont-default' => 'Nettlesarstandard',
 'editfont-monospace' => 'Skrift med fast breidd',
 'editfont-sansserif' => 'Skrifttype utan seriffar',
 'editfont-serif' => 'Skrifttype med seriffar',
index ff90c3c..d53a578 100644 (file)
@@ -1004,9 +1004,9 @@ o [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear aquesta pagina]</span>.',
 'noarticletext-nopermission' => 'Actualament i a pas cap de tèxte dins aquesta pagina.
 Podètz [[Special:Search/{{PAGENAME}}|far una recèrca sul títol de la pagina]] dins las autras paginas,
 o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} recercar dins los jornals associats]</span>.',
-'missing-revision' => "La rrvision n° $1 de la pagina intitulada « {{PAGENAME}} » existís pas.
+'missing-revision' => "La revision n° $1 de la pagina intitulada « {{PAGENAME}} » existís pas.
 
-Aquò se produsís en general en seguent un ligam istoric obsolèt cap a una pagina qu'es estada suprimida.
+Aquò se produsís en general en seguent un ligam istoric obsolet cap a una pagina qu'es estada suprimida.
 Podètz trobar mai de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de las supressions].",
 'userpage-userdoesnotexist' => "Lo compte d'utilizaire « <nowiki>$1</nowiki> » es pas enregistrat. Indicatz se volètz crear o editar aquesta pagina.",
 'userpage-userdoesnotexist-view' => "Lo compte d'utilizaire « $1 » es pas enregistrat.",
index fa3a13d..1abdd86 100644 (file)
@@ -200,7 +200,7 @@ $messages = array(
 'tog-showtoolbar' => 'ਸੋਧ ਸੰਦਬਕਸਾ ਵੇਖੋ (ਜਾਵਾਸਕਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)',
 'tog-editondblclick' => "ਦੋ ਵਾਰ ਕਲਿੱਕ ਕਰਨ 'ਤੇ ਸਫ਼ੇ ਸੋਧੋ (ਜਾਵਾਸਕਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)",
 'tog-editsection' => '[ਸੋਧੋ] ਲਿੰਕਾਂ ਰਾਹੀਂ ਭਾਗ ਸੋਧਣਾ ਚਾਲੂ ਕਰੋ',
-'tog-editsectiononrightclick' => 'ਭਾà¨\97 à¨¸à¨¿à¨°à¨²à©\87à¨\96ਾà¨\82 ਤੇ ਸੱਜੀ ਕਲਿੱਕ ਨਾਲ਼ ਸੋਧ ਚਾਲੂ ਕਰੋ (ਜਾਵਾਸਕਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)',
+'tog-editsectiononrightclick' => 'ਸà©\88à¨\95ਸ਼ਨ à¨¸à¨¿à¨°à¨²à©\87à¨\96ਾà¨\82 â\80\99ਤੇ ਸੱਜੀ ਕਲਿੱਕ ਨਾਲ਼ ਸੋਧ ਚਾਲੂ ਕਰੋ (ਜਾਵਾਸਕਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)',
 'tog-showtoc' => 'ਤਤਕਰਾ ਵਿਖਾਓ (੩ ਤੋਂ ਵੱਧ ਸਿਰਲੇਖਾਂ ਵਾਲੇ ਸਫ਼ਿਆਂ ਲਈ)',
 'tog-rememberpassword' => 'ਇਸ ਬਰਾਊਜ਼ਰ ਉੱਤੇ ਮੇਰਾ ਦਾਖ਼ਲਾ ਯਾਦ ਰੱਖੋ (ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਲਈ)',
 'tog-watchcreations' => 'ਮੇਰੇ ਵਲੋਂ ਬਣਾਏ ਗਏ ਸਫ਼ੇ ਅਤੇ ਅੱਪਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
@@ -408,7 +408,7 @@ $messages = array(
 'userpage' => 'ਵਰਤੋਂਕਾਰ ਸਫ਼ਾ ਵੇਖੋ',
 'projectpage' => 'ਪ੍ਰੋਜੈਕਟ ਸਫ਼ਾ ਵੇਖੋ',
 'imagepage' => 'ਫਾਇਲ ਸਫ਼ਾ ਵੇਖੋ',
-'mediawikipage' => 'ਸà©\81ਨà©\87ਹਾ à¨ªà©\87à¨\9c ਵੇਖੋ',
+'mediawikipage' => 'ਸà©\81ਨà©\87ਹਾ à¨¸à¨«à¨¼à¨¾ ਵੇਖੋ',
 'templatepage' => 'ਫਰਮਾ ਸਫ਼ਾ ਵੇਖੋ',
 'viewhelppage' => 'ਮਦਦ ਸਫ਼ਾ ਵੇਖੋ',
 'categorypage' => 'ਸ਼੍ਰੇਣੀ ਸਫ਼ਾ ਵੇਖੋ',
@@ -597,7 +597,7 @@ $2',
 ਧਿਆਨ ਦਿਉ ਕਿ ਜਿੰਨੀ ਦੇਰ ਤੱਕ ਤੁਸੀਂ ਆਪਣੇ ਬਰਾਊਜ਼ਰ ਦਾ ਕੈਸ਼ ਸਾਫ਼ ਨਹੀਂ ਕਰਦੇ, ਕੁਝ ਸਫ਼ੇ ਇੱਦਾਂ ਵਿਖਣਗੇ ਜਿਵੇਂ ਤੁਸੀਂ ਅਜੇ ਵੀ ਦਾਖ਼ਲ ਹੀ ਹੋ।",
 'welcomeuser' => '$1 ਜੀ ਆਇਆਂ ਨੂੰ!',
 'welcomecreation-msg' => 'ਤੁਹਾਡਾ ਖਾਤਾ ਬਣ ਚੁੱਕਾ ਹੈ। ਆਪਣੀਆਂ [[Special:Preferences|{{SITENAME}} ਪਸੰਦ]] ਬਦਲਣੀ ਨਾ ਭੁੱਲੋ।',
-'yourname' => 'ਯà©\82à¨\9c਼ਰ-ਨਾਂ:',
+'yourname' => 'ਵਰਤà©\8bà¨\82à¨\95ਾਰ-ਨਾਂ:',
 'userlogin-yourname' => 'ਯੂਜ਼ਰ-ਨਾਂ',
 'userlogin-yourname-ph' => 'ਆਪਣਾ ਯੂਜ਼ਰ-ਨਾਂ ਭਰੋ',
 'createacct-another-username-ph' => 'ਯੂਜ਼ਰ ਨਾਂ ਦਿਓ',
@@ -1410,7 +1410,7 @@ HTML ਟੈਗ ਚੈੱਕ ਕਰੋ।',
 'show' => 'ਵਖਾਓ',
 'minoreditletter' => 'ਛੋ',
 'newpageletter' => 'ਨ',
-'boteditletter' => 'ਬੋ',
+'boteditletter' => 'ਬੋ',
 'number_of_watching_users_pageview' => '[$1 ਵੇਖ ਰਹੇ ਹਨ {{PLURAL:$1|ਯੂਜ਼ਰ}}]',
 'rc_categories_any' => 'ਕੋਈ ਵੀ',
 'newsectionsummary' => '/* $1 */ ਨਵਾਂ ਭਾਗ',
@@ -1995,7 +1995,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'nolinkshere' => "ਕੋਈ ਵੀ ਸਫ਼ਾ '''[[:$1]]''' ਨਾਲ ਨਹੀਂ ਜੋੜਦਾ।",
 'isredirect' => 'ਰੀਡਿਰੈਕਟ ਸਫ਼ਾ',
 'istemplate' => 'ਟਾਕਰਾ ਕਰੋ',
-'isimage' => 'ਫ਼ਾà¨\88ਲ à¨\95à©\9cà©\80',
+'isimage' => 'ਫ਼ਾà¨\88ਲ à¨²à¨¿à©°à¨\95',
 'whatlinkshere-prev' => '{{PLURAL:$1|ਪਿਛਲਾ|ਪਿਛਲੇ $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|ਅਗਲਾ|ਅਗਲੇ $1}}',
 'whatlinkshere-links' => '← ਕੜੀਆਂ',
@@ -2008,7 +2008,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 # Block/unblock
 'block' => "ਵਰਤੋਂਕਾਰ 'ਤੇ ਪਾਬੰਦੀ ਲਾਓ",
 'unblock' => "ਵਰਤੋਂਕਾਰ 'ਤੇ ਲੱਗੀ ਪਾਬੰਦੀ ਹਟਾਓ",
-'blockip' => 'ਪਾਬੰਦà©\80ਸ਼à©\81ਦਾ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ',
+'blockip' => 'ਵਰਤà©\8bà¨\82à¨\95ਾਰ â\80\99ਤà©\87 à¨ªà¨¾à¨¬à©°à¨¦à©\80 à¨²à¨¾à¨\93',
 'blockip-title' => "ਵਰਤੋਂਕਾਰ 'ਤੇ ਪਾਬੰਦੀ ਲਾਓ",
 'blockip-legend' => "ਵਰਤੋਂਕਾਰ 'ਤੇ ਪਾਬੰਦੀ ਲਾਓ",
 'ipadressorusername' => 'IP ਐਡਰੈਸ ਜਾਂ ਯੂਜ਼ਰ ਨਾਂ:',
@@ -2216,7 +2216,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'tooltip-t-contributions' => 'ਇਸ ਵਰਤੋਂਕਾਰ ਦੇ ਯੋਗਦਾਨ ਦੀ ਸੂਚੀ',
 'tooltip-t-emailuser' => 'ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
 'tooltip-t-upload' => 'ਫ਼ਾਈਲਾਂ ਅਪਲੋਡ ਕਰੋ',
-'tooltip-t-specialpages' => 'ਸਾਰà©\87 à¨\96਼ਾਸ à¨¸à¨«à¨¼à¨¿à¨\86à¨\82 à¨¦à©\80 à¨¸à©\82à¨\9aà©\80',
+'tooltip-t-specialpages' => 'ਸਾਰà©\87 à¨\96਼ਾਸ à¨¸à¨«à¨¼à¨¿à¨\86à¨\82 à¨¦à©\80 à¨²à¨¿à¨¸à¨\9f',
 'tooltip-t-print' => 'ਇਸ ਸਫ਼ੇ ਦਾ ਛਪਣਯੋਗ ਵਰਜਨ',
 'tooltip-t-permalink' => 'ਸਫ਼ੇ ਦੇ ਇਸ ਰੀਵਿਜਨ ਲਈ ਪੱਕੀ ਕੜੀ',
 'tooltip-ca-nstab-main' => 'ਸਮੱਗਰੀ ਸਫ਼ਾ ਵੇਖੋ',
@@ -2737,6 +2737,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'htmlform-chosen-placeholder' => 'ਕੋਈ ਚੋਣ ਚੁਣੋ',
 
 # New logging system
+'logentry-delete-delete' => '$1 ਨੇ ਸਫ਼ਾ $3 ਮਿਟਾਇਆ',
 'revdelete-content-hid' => 'ਸਮੱਗਰੀ ਲੁਕਾਈ ਹੋਈ',
 'revdelete-summary-hid' => 'ਸੋਧ ਸਾਰ ਲੁਕਾਈ ਹੋਈ',
 'revdelete-uname-hid' => 'ਵਰਤੋਂਕਾਰ ਨਾਂ ਲੁਕਾਇਆ ਹੋਇਆ',
index 3dfc3fe..25ddedf 100644 (file)
@@ -209,7 +209,7 @@ $messages = array(
 'jumptonavigation' => 'Faahre-Gnepp',
 'jumptosearch' => 'guck uff',
 
-# 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) and the disambiguation template definition (see disambiguations).
+# 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' => 'Iwwer {{SITENAME}}',
 'aboutpage' => 'Project:Iwwer_{{SITENAME}}',
 'copyright' => 'Was do drin schdeht iss unner $1 verfiechbar',
index 91ce501..8e18693 100644 (file)
@@ -13,6 +13,7 @@
  * @author Beau
  * @author BeginaFelicysym
  * @author Chrumps
+ * @author Clamira
  * @author Cysioland
  * @author Debeet
  * @author Derbeth
@@ -847,7 +848,7 @@ Poniższe funkcje poczty nie działają.",
 Wpisz poprawny adres e‐mail lub wyczyść pole.',
 'cannotchangeemail' => 'Na tej wiki nie ma możliwości zmiany adresu e‐mail przypisanego do konta.',
 'emaildisabled' => 'Ta witryna nie może wysłać wiadomości e-mail.',
-'accountcreated' => 'Konto zostało utworzone',
+'accountcreated' => 'Utworzono konto',
 'accountcreatedtext' => 'Konto dla [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|dyskusja]]) zostało utworzone.',
 'createaccount-title' => 'Utworzenie konta w {{GRAMMAR:MS.lp|{{SITENAME}}}}',
 'createaccount-text' => 'Ktoś utworzył w {{GRAMMAR:MS.lp|{{SITENAME}}}} ($4), podając Twój adres e‐mail, konto „$2”. Aktualnym hasłem jest „$3”.
@@ -1789,7 +1790,7 @@ Strony z [[Special:Watchlist|listy obserwowanych]] są '''wytłuszczone'''.",
 'upload_directory_missing' => 'Katalog dla przesyłanych plików ($1) nie istnieje i nie może zostać utworzony przez serwer WWW.',
 'upload_directory_read_only' => 'Serwer nie może zapisywać do katalogu ($1) przeznaczonego na przesyłane pliki.',
 'uploaderror' => 'Błąd wysyłania',
-'upload-recreate-warning' => "'''Uwaga – plik o tej nazwie został wcześniej usunięty lub przrniesiony.'''
+'upload-recreate-warning' => "'''Uwaga: plik o tej nazwie został wcześniej usunięty lub przeniesiony.''' 
 
 Poniżej znajduje się rejestr usunięć i zmian nazwy tej strony:",
 'uploadtext' => "Użyj poniższego formularza do przesłania plików.
@@ -2521,9 +2522,9 @@ Zobacz na stronie $2 rejestr ostatnio wykonanych usunięć.',
 ** Naruszenie praw autorskich
 ** Wandalizm',
 'delete-edit-reasonlist' => 'Edytuj listę przyczyn usunięcia',
-'delete-toobig' => 'Ta strona ma bardzo długą historię edycji, ponad $1 {{PLURAL:$1|zmianę|zmiany|zmian}}.
-Usunięcie jej mogłoby spowodować zakłócenia w pracy {{GRAMMAR:D.lp|{{SITENAME}}}} i dlatego zostało ograniczone.',
-'delete-warning-toobig' => 'Ta strona ma bardzo długą historię edycji, ponad $1 {{PLURAL:$1|zmianę|zmiany|zmian}}.
+'delete-toobig' => 'Ta strona ma bardzo długą historię edycji – ponad $1 {{PLURAL:$1|zmianę|zmiany|zmian}}.<br />
+Usuwanie jej zostało ograniczone ze względu na możliwość zakłócenia pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.',
+'delete-warning-toobig' => 'Ta strona ma bardzo długą historię edycji – ponad $1 {{PLURAL:$1|zmianę|zmiany|zmian}}.<br />
 Bądź ostrożny, ponieważ usunięcie jej może spowodować zakłócenia w pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.',
 
 # Rollback
index 4611e62..e39ecb9 100644 (file)
@@ -596,33 +596,36 @@ Peul desse ch'a l'ha già cambià la ciav o a l'ha ciamà na neuva ciav provisò
 'resetpass-abort-generic' => "La modìfica ëd la ciav a l'é stàita anulà da n'estension.",
 
 # Special:PasswordReset
-'passwordreset' => 'Cambi ëd ciav',
-'passwordreset-legend' => 'Cambié la ciav',
-'passwordreset-disabled' => 'Ij cangiament ëd ciav a son stàit disabilità su sta wiki.',
+'passwordreset' => 'Ri-inissialisassion ëd la ciav',
+'passwordreset-text-one' => "Ch'a completa 's formolari për reimposté soa ciav.",
+'passwordreset-text-many' => "{{PLURAL:$1|Ch'a compila un dij camp për riamposté soa ciav.}}",
+'passwordreset-legend' => 'Riampostassion ëd la ciav',
+'passwordreset-disabled' => "La reinissialisassion ëd le ciav a l'é stàita disabilità su sta wiki.",
+'passwordreset-emaildisabled' => 'Le fonsionalità ëd pòsta eletrònica a son ëstàite disativà su sta wiki.',
 'passwordreset-username' => 'Stranòm:',
 'passwordreset-domain' => 'Domini:',
-'passwordreset-capture' => 'Vardé ël mëssagi arzultant?',
-'passwordreset-capture-help' => "S'a marca costa casela, ël mëssagi ëd pòsta eletrònica (con la ciav temporania) a-j sarà smonù e ant l'istess temp a sarà mandà a l'utent.",
+'passwordreset-capture' => 'Vëdde ël mëssagi arzultant?',
+'passwordreset-capture-help' => "S'a marca costa casela, ël mëssagi ëd pòsta eletrònica (con la ciav provisòria) a-j sarà smonù e ant l'istess temp a sarà mandà a l'utent.",
 'passwordreset-email' => 'Adrëssa ëd pòsta eletrònica:',
-'passwordreset-emailtitle' => 'Detaj dël cont ansima {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Quaidun (a l'é bel fé ch'a sia chiel, da l'adrëssa IP $1) a l'ha ciamà d'arcordé ij detaj ëd sò cont për {{SITENAME}} ($4). {{PLURAL:$3|Ël cont utent sì-sota a l'é|Ij cont utent sì-sota a son}} 
+'passwordreset-emailtitle' => 'Detaj dël cont ansima {{SITENAME}}',
+'passwordreset-emailtext-ip' => "Quaidun (a l'é bel fé ch'a sia chiel, da l'adrëssa IP $1) a l'ha ciamà na riampostassion ëd soa ciav për {{SITENAME}} ($4). {{PLURAL:$3|Ël cont utent sì-sota a l'é|Ij cont utent sì-sota a son}} 
 associà a st'adrëssa ëd pòsta eletrònica:
 
 $2
 
-{{PLURAL:$3|Costa ciav|Coste ciav}} a temp a scadran da sì {{PLURAL:$5|un di|$5 di}}.
+{{PLURAL:$3|Costa ciav provisòria|Coste ciav provisòrie}} a scadran da-sì {{PLURAL:$5|un di|$5 di}}.
 A dovrìa intré ant ël sistema e serne na ciav neuva adess. Se quaidun d'àutr a l'ha fàit costa arcesta, o s'a l'é arcordasse soa ciav original, e a veul pa pi cangela, a peule ignoré ës mëssagi e continué a dovré soa veja ciav.",
-'passwordreset-emailtext-user' => "L'utent $1 ansima a {{SITENAME}} a l'ha ciamà d'arcordé ij detaj ëd sò cont për {{SITENAME}} ($4). {{PLURAL:$3|Ël cont utent sì-sota a l'é|Ij cont utent sì-sota a son}} associà a st'adrëssa ëd pòsta eletrònica:
+'passwordreset-emailtext-user' => "L'utent $1 ansima a {{SITENAME}} a l'ha ciamà na riampostassion ëd soa ciav për {{SITENAME}} ($4). {{PLURAL:$3|Ël cont utent sì-sota a l'é|Ij cont utent sì-sota a son}} associà a st'adrëssa ëd pòsta eletrònica:
 
 $2
 
-{{PLURAL:$3|Costa ciav|Coste ciav}} a temp a scadran da sì {{PLURAL:$5|un di|$5 di}}.
-A dovrìa intré ant ël sistema e serne na ciav neuva adess. Se quaidun d'àutr a l'ha fàit costa arcesta, o s'a l'é arcordasse soa ciav original, e a veul pa pi cangela, a peul ignoré sto mëssagi e continué a dovré soa veja ciav.",
+{{PLURAL:$3|Costa ciav provisòria|Coste ciav provisòrie}} a scadran da-sì {{PLURAL:$5|un di|$5 di}}.
+A dovrìa intré ant ël sistema e serne na ciav neuva adess. Se quaidun d'àutr a l'ha fàit costa arcesta, o s'a l'é arcordasse soa ciav original, e a veul pa pi cangela, a peul ignoré ës mëssagi e continué a dovré soa veja ciav.",
 'passwordreset-emailelement' => 'Stranòm: $1
-Ciav a temp: $2',
-'passwordreset-emailsent' => "Un mëssagi ëd pòsta eletrònica për giuté a arcordé a l'é stàit spedì.",
-'passwordreset-emailsent-capture' => "Un mëssagi ëd pro-memòria a l'é stàit mandà, e a l'é mostrà sì-sota.",
-'passwordreset-emailerror-capture' => "Un mëssagi ëd pro-memòria a l'é stàit generà, e a l'é smonù sì-sota, ma la spedission a l'utent a l'é falìa: $1",
+Ciav provisòria: $2',
+'passwordreset-emailsent' => "Un mëssagi ëd riampostassion ëd la ciav a l'é stàit spedì.",
+'passwordreset-emailsent-capture' => "Un mëssagi ëd riampostassion ëd la ciav a l'é stàit mandà, e a l'é mostrà sì-sota.",
+'passwordreset-emailerror-capture' => "Un mëssagi ëd riampostassion ëd la ciav a l'é stàit generà, e a l'é smonù sì-sota, ma la spedission a {{GENDER:$2|l'utent}} a l'é falìa: $1",
 
 # Special:ChangeEmail
 'changeemail' => "Cangé l'adrëssa ëd pòsta eletrònica",
@@ -631,10 +634,23 @@ Ciav a temp: $2',
 'changeemail-no-info' => 'A dev esse intrà ant ël sistema për andé diretament a costa pàgina.',
 'changeemail-oldemail' => 'Adrëssa ëd pòsta eletrònica atual:',
 'changeemail-newemail' => 'Adrëssa ëd pòsta eletrònica neuva:',
-'changeemail-none' => '(gnun)',
-'changeemail-password' => 'Toa ciav ëd {{SITENAME}}:',
+'changeemail-none' => '(gnun-a)',
+'changeemail-password' => 'Soa ciav su {{SITENAME}}:',
 'changeemail-submit' => "Cangé l'adrëssa ëd pòsta eletrònica",
-'changeemail-cancel' => 'Scancela',
+'changeemail-cancel' => 'Anulé',
+
+# Special:ResetTokens
+'resettokens' => 'Riamposté ij geton',
+'resettokens-text' => "Ambelessì a peul riamposté ij geton ch'a permëtto d'acede a chèich dàit privà associà a sò cont.
+
+A dovrìa felo si për asar chiel a l'ha partagiaje con cheidun o si sò cont a l'é stàit compromëttù.",
+'resettokens-no-tokens' => 'A-i é gnun geton da riamposté.',
+'resettokens-legend' => 'Riamposté ij geton.',
+'resettokens-tokens' => 'Geton:',
+'resettokens-token-label' => '$1 (valor atual: $2)',
+'resettokens-watchlist-token' => "Geton për ël fluss an sl'aragnà (Atom/RSS) ëd [[Special:Watchlist|modìfiche a le pàgine che as ten sot-euj]]",
+'resettokens-done' => 'Geton riampostà.',
+'resettokens-resetbutton' => 'Riamposté ij geton selessionà',
 
 # Edit page toolbar
 'bold_sample' => 'Test an grassèt',
@@ -645,22 +661,22 @@ Ciav a temp: $2',
 'link_tip' => 'Anliura interna',
 'extlink_sample' => "http://www.example.com tìtol dl'anliura",
 'extlink_tip' => 'Anliura esterna (che as visa dë buté ël prefiss http://)',
-'headline_sample' => "Antestassion dl'artìcol",
+'headline_sample' => 'Test dël tìtol',
 'headline_tip' => 'Antestassion dë scond livel',
-'nowiki_sample' => 'Che a buta ël test nen formatà ambelessì',
-'nowiki_tip' => 'Lassé un tòch ëd test fòra dla formatassion dla wiki',
+'nowiki_sample' => 'Che a buta ël test brut ambelessì',
+'nowiki_tip' => 'Lassé un tòch ëd test fòra dla sintassi dla wiki',
 'image_sample' => 'Esempi.jpg',
-'image_tip' => 'Figura anglobà ant ël test',
+'image_tip' => 'Archivi anglobà',
 'media_sample' => 'Esempi.ogg',
 'media_tip' => "Anliura a n'archivi multimedial",
-'sig_tip' => 'Firma butand data e ora',
+'sig_tip' => "Soa signadura con la data e l'ora",
 'hr_tip' => 'Riga orisontal (da dovresse nen tròp soèns)',
 
 # Edit pages
 'summary' => 'Resumé:',
-'subject' => 'Sogèt:',
+'subject' => 'Sogèt/antestassion:',
 'minoredit' => "Costa a l'é na modìfica cita",
-'watchthis' => "Ten sot euj st'artìcol-sì",
+'watchthis' => 'Ten-e sot euj costa pàgina-sì',
 'savearticle' => 'Salva sta pàgina',
 'preview' => 'Preuva',
 'showpreview' => 'Mostra na preuva',
index 07c6ef5..db3565d 100644 (file)
@@ -45,6 +45,7 @@
  * @author Luckas Blade
  * @author Malafaya
  * @author ManoDbo
+ * @author Matheus Sousa L.T
  * @author McDutchie
  * @author MetalBrasil
  * @author MisterSanderson
@@ -536,7 +537,7 @@ $messages = array(
 'unprotectthispage' => 'Alterar a proteção desta página',
 'newpage' => 'Página nova',
 'talkpage' => 'Dialogar sobre esta página',
-'talkpagelinktext' => 'disc',
+'talkpagelinktext' => 'Discussão',
 'specialpage' => 'Página especial',
 'personaltools' => 'Ferramentas pessoais',
 'postcomment' => 'Nova seção',
@@ -573,7 +574,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 {{SITENAME}}',
 'aboutpage' => 'Project:Sobre',
-'copyright' => 'Conteúdo disponível sob $1.',
+'copyright' => 'Conteúdo disponível sob $1, salvo indicação em contrário.',
 'copyrightpage' => '{{ns:project}}:Direitos_de_autor',
 'currentevents' => 'Eventos atuais',
 'currentevents-url' => 'Project:Eventos atuais',
@@ -1566,6 +1567,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'prefs-displayrc' => 'Opções de exibição',
 'prefs-displaysearchoptions' => 'Opções de exibição',
 'prefs-displaywatchlist' => 'Opções de exibição',
+'prefs-tokenwatchlist' => 'Senha',
 'prefs-diffs' => 'Diferenças',
 'prefs-help-prefershttps' => 'Esta preferência terá efeito no seu próximo início de sessão.',
 
@@ -4203,5 +4205,6 @@ Caso contrário, você poderá usar o formulário simplificado a seguir. Seu com
 'limitreport-walltime' => 'Tempo de uso real',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
 'limitreport-postexpandincludesize-value' => '$1/$2 bytes',
+'limitreport-expansiondepth' => 'Máxima profundidade de expansão',
 
 );
index c2637e9..da14d70 100644 (file)
@@ -483,9 +483,10 @@ This can also appear in the credits page if the credits feature is enabled,for e
 {{Identical|My pages}}',
 'qbspecialpages' => '{{Identical|Special page}}',
 'faq' => "FAQ is short for ''frequently asked questions''.",
-'faqpage' => "FAQ is short for ''frequently asked questions''. This page is only linked in CologneBlue (an old skin), not in Monobook or Vector.
+'faqpage' => '{{doc-important|Do not translate <code>Project:</code> part.}}
+"FAQ" is short for "frequently asked questions".
 
-{{doc-important|Do not translate <tt>Project:</tt> part.}}",
+This page is only linked in CologneBlue (an old skin), not in Monobook or Vector.',
 
 # Vector skin
 'vector-action-addsection' => 'Used in the Vector skin. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}',
@@ -658,7 +659,7 @@ See also:
 'viewhelppage' => 'Used as link text in Talk page of help page.',
 'categorypage' => 'Used as link text in Talk page of category page.',
 'viewtalkpage' => 'Used in Standard (a.k.a. Classic) skin as a link to talk page for all namespaces, in edit or history mode.',
-'otherlanguages' => 'This message is shown under the toolbox. It is used if there are interwiki links added to the page, like <tt><nowiki>[[</nowiki>en:Interwiki article]]</tt>.
+'otherlanguages' => 'This message is shown under the toolbox. It is used if there are interwiki links added to the page, like <code><nowiki>[[</nowiki>en:Interwiki article]]</code>.
 {{Identical|Otherlanguages}}',
 'redirectedfrom' => 'The text displayed when a certain page is redirected to another page. Parameters:
 * $1 - the name of the page user came from',
@@ -720,15 +721,18 @@ See also:
 * {{msg-mw|Currentevents}}
 * {{msg-mw|Accesskey-n-currentevents}}
 * {{msg-mw|Tooltip-n-currentevents}}',
-'currentevents-url' => "Target page of ''CurrentEvents'' in the sidebar. See also {{msg-mw|currentevents}}.
-{{doc-important|Do not translate the \"<tt>Project:</tt>\" part.}}",
+'currentevents-url' => '{{doc-important|Do not translate the <code>Project:</code> part.}}
+Target page of "CurrentEvents" in the sidebar.
+
+See also:
+* {{msg-mw|Currentevents}}',
 'disclaimers' => 'Used as display name for the link to [[{{MediaWiki:Disclaimerpage}}]] shown at the bottom of every page on the wiki. Example [[{{MediaWiki:Disclaimerpage}}|{{MediaWiki:Disclaimers}}]].
 {{Identical|Disclaimer}}',
-'disclaimerpage' => 'Used as page for that contains the site disclaimer. Used at the bottom of every page on the wiki. Example: [[{{MediaWiki:Disclaimerpage}}|{{MediaWiki:Disclaimers}}]].
-{{doc-important|Do not change the "<tt>Project:</tt>" part.}}',
+'disclaimerpage' => '{{doc-important|Do not change the <code>Project:</code> part.}}
+Used as page for that contains the site disclaimer. Used at the bottom of every page on the wiki. Example: [[{{MediaWiki:Disclaimerpage}}|{{MediaWiki:Disclaimers}}]].',
 'edithelp' => 'This is the text that appears on the editing help link that is near the bottom of the editing page',
-'helppage' => 'The link destination used by default in the sidebar, and in {{msg-mw|noarticletext}}.
-{{doc-important|Do not change the "<tt>Help:</tt>" part.}}
+'helppage' => '{{doc-important|Do not change the <code>Help:</code> part.}}
+The link destination used by default in the sidebar, and in {{msg-mw|Noarticletext}}.
 {{Identical|HelpContent}}',
 'mainpage' => 'Defines the link and display name of the main page of the wiki. Shown as the top link in the navigation part of the interface. Please do not change it too often, that could break things!
 
@@ -746,8 +750,10 @@ See also:
 * {{msg-mw|Accesskey-n-mainpage-description}}
 * {{msg-mw|Tooltip-n-mainpage-description}}
 {{Identical|Main page}}',
-'policy-url' => 'Description: The URL of the project page describing the policies of the wiki. This is shown below every page (the left link).
-{{doc-important|Do not change the "<tt>Project:</tt>" part.}}',
+'policy-url' => '{{doc-important|Do not change the <code>Project:</code> part.}}
+The URL of the project page describing the policies of the wiki.
+
+This is shown below every page (the left link).',
 'portal' => "Display name for the 'Community portal', shown in the sidebar menu of all pages. The target page is meant to be a portal for users where useful links are to be found about the wiki's operation.
 
 See also:
@@ -755,8 +761,8 @@ See also:
 * {{msg-mw|Portal-url}}
 * {{msg-mw|Accesskey-n-portal}}
 * {{msg-mw|Tooltip-n-portal}}",
-'portal-url' => 'Description: The URL of the community portal. This is shown in the sidebar by default (removed on translatewiki.net).
-{{doc-important|Do not change the "<tt>Project:</tt>" part.}}
+'portal-url' => '{{doc-important|Do not change the <code>Project:</code> part.}}
+Description: The URL of the community portal. This is shown in the sidebar by default (removed on translatewiki.net).
 
 See also:
 * {{msg-mw|Portal}}
@@ -765,8 +771,10 @@ See also:
 * {{msg-mw|Tooltip-n-portal}}',
 'privacy' => 'Used as page name and link at the bottom of each wiki page. The page contains a legal notice providing information about the use of personal information by the website owner.of the site. Example: [[Privacy policy]].
 {{Identical|Privacy policy}}',
-'privacypage' => 'Used as page for that contains the privacy policy. Used at the bottom of every page on the wiki. Example: [[{{MediaWiki:Privacypage}}|{{MediaWiki:Privacy}}]].
-{{doc-important|Do not change the "<tt>Project:</tt>" part.}}',
+'privacypage' => '{{doc-important|Do not change the <code>Project:</code> part.}}
+Used as page for that contains the privacy policy. Used at the bottom of every page on the wiki.
+
+Example: [[{{MediaWiki:Privacypage}}|{{MediaWiki:Privacy}}]].',
 
 'badaccess' => 'Title shown within page indicating unauthorized access.
 {{Identical|Permission error}}',
@@ -1030,9 +1038,12 @@ See example [{{canonicalurl:Main_page|action=x}} action=x].',
 'nosuchactiontext' => 'This error is shown when trying to open a page with invalid "action" parameter, e.g. [{{canonicalurl:Main_page|action=x}} action=x].
 * The title of this error is the message {{msg-mw|nosuchaction}}.',
 'nosuchspecialpage' => 'The title of the error you get when trying to open a special page which does not exist. The text of the warning is the message {{msg-mw|nospecialpagetext}}. Example: [[Special:Nosuchpage]]',
-'nospecialpagetext' => '{{doc-important|Link <code><nowiki>[[Special:SpecialPages|{{int:specialpages}}]]</nowiki></code> should remain untranslated.}}
+'nospecialpagetext' => '{{doc-important|Do not translate <code><nowiki>[[Special:SpecialPages|{{int:specialpages}}]]</nowiki></code>.}}
 This error is shown when trying to open a special page which does not exist, e.g. [[Special:Nosuchpage]].
-* The title of this error is the message {{msg-mw|nosuchspecialpage}}.',
+
+Refers to {{msg-mw|Specialpages}}.
+
+The title of this error is the message {{msg-mw|Nosuchspecialpage}}.',
 
 # General errors
 'error' => '{{Identical|Error}}',
@@ -1422,7 +1433,8 @@ Parameters:
 'nocookiesforlogin' => "{{optional}}
 This message is displayed when someone tried to login and the CSRF failed (most likely, the browser doesn't accept cookies).
 
-Defaults to '''nocookieslogin''' ({{int:nocookieslogin}})",
+Default:
+* {{msg-mw|Nocookieslogin}}",
 'noname' => 'Error message.',
 'loginsuccesstitle' => 'The title of the page saying that you are logged in. The content of the page is the message {{msg-mw|Loginsuccess}}.
 {{Identical|Login successful}}',
@@ -1597,7 +1609,7 @@ Parameters:
 'passwordreset-emaildisabled' => "Used as error message in changing password when site's email feature is disabled.",
 'passwordreset-username' => '{{Identical|Username}}',
 'passwordreset-domain' => 'A domain like used in Domain Name System (DNS) or more specifically like a domain component in the Lightweight Directory Access Protocol (LDAP)',
-'passwordreset-capture' => 'Label for checkbox asking the user whether they want to see the contents of the password reset email (only shown if they have the <tt>passwordreset</tt> permission',
+'passwordreset-capture' => 'Label for checkbox asking the user whether they want to see the contents of the password reset email (only shown if they have the <code>passwordreset</code> permission).',
 'passwordreset-capture-help' => 'Longer explanatory message for the capture checkbox label.',
 'passwordreset-email' => '{{Identical|E-mail address}}',
 'passwordreset-emailtitle' => 'Used as subject (title) of email.',
@@ -1764,38 +1776,55 @@ See also:
 * {{msg-mw|Anonpreviewwarning}}',
 'anonpreviewwarning' => 'See also:
 * {{msg-mw|Anoneditwarning}}',
-'missingsummary' => 'The text "edit summary" is in {{msg-mw|summary}}.
-The text "Save" is in {{msg-mw|savearticle}}.',
+'missingsummary' => 'The text "edit summary" is in {{msg-mw|Summary}}.
+
+See also:
+* {{msg-mw|Missingcommentheader}}
+* {{msg-mw|Savearticle}}',
 'missingcommenttext' => 'This message is shown, when the textbox by a new-section is empty.',
-'missingcommentheader' => 'Edit summary that is shown if you enable "Prompt me when entering a blank summary" and add a new section without headline to a talk page.',
+'missingcommentheader' => 'Edit summary that is shown if you enable "Prompt me when entering a blank summary" and add a new section without headline to a talk page.
+
+See also:
+* {{msg-mw|Missingsummary}}
+* {{msg-mw|Savearticle}}',
 'summary-preview' => 'Preview of the edit summary, shown under the edit summary itself.
 Should match: {{msg-mw|summary}}.',
 'subject-preview' => 'Should match {{msg-mw|subject}}',
 'blockedtitle' => 'Used as title displayed for blocked users. The corresponding message body is one of the following messages:
 * {{msg-mw|Blockedtext|notext=1}}
 * {{msg-mw|Autoblockedtext|notext=1}}',
-'blockedtext' => "Text displayed to blocked users. Parameters:
+'blockedtext' => 'Text displayed to blocked users.
+
+"email this user" should be consistent with {{msg-mw|Emailuser}}.
+
+Parameters:
 * $1 - the blocking sysop (with a link to his/her userpage)
 * $2 - the reason for the block
 * $3 - the current IP address of the blocked user
-* $4 - (Unused) the blocking sysop's username (plain text, without the link)
+* $4 - (Unused) the blocking sysop\'s username (plain text, without the link)
 * $5 - the unique numeric identifier of the applied autoblock
 * $6 - the expiry of the block
 * $7 - the intended target of the block (what the blocking user specified in the blocking form)
 * $8 - the timestamp when the block started
 See also:
-* {{msg-mw|Autoblockedtext}}",
-'autoblockedtext' => "Text displayed to automatically blocked users. Parameters:
+* {{msg-mw|Grouppage-sysop}}
+* {{msg-mw|Autoblockedtext}}',
+'autoblockedtext' => 'Text displayed to automatically blocked users.
+
+"email this user" should be consistent with {{msg-mw|Emailuser}}.
+
+Parameters:
 * $1 - the blocking sysop (with a link to his/her userpage)
 * $2 - the reason for the block (in case of autoblocks: {{msg-mw|autoblocker}})
 * $3 - the current IP address of the blocked user
-* $4 - (Unused) the blocking sysop's username (plain text, without the link). Use it for GENDER.
+* $4 - (Unused) the blocking sysop\'s username (plain text, without the link). Use it for GENDER.
 * $5 - the unique numeric identifier of the applied autoblock
 * $6 - the expiry of the block
 * $7 - the intended target of the block (what the blocking user specified in the blocking form)
 * $8 - the timestamp when the block started
 See also:
-* {{msg-mw|Blockedtext}}",
+* {{msg-mw|Grouppage-sysop}}
+* {{msg-mw|Blockedtext}}',
 'blockednoreason' => 'Substituted with <code>$2</code> in the following message if the reason is not given:
 * {{msg-mw|cantcreateaccount-text}}.
 {{Identical|No reason given}}',
@@ -1836,11 +1865,15 @@ Parameters:
 * $1 - username
 * $2 - email address',
 'newarticle' => '{{Identical|New}}',
-'newarticletext' => "Text displayed above the edit box in editor when trying to create a new page.<br />'''Very important:''' leave <tt><nowiki>{{MediaWiki:Helppage}}</nowiki></tt> exactly as it is!",
+'newarticletext' => '{{doc-important|Do not translate <code><nowiki>{{MediaWiki:Helppage}}</nowiki></code>.}}
+Text displayed above the edit box in editor when trying to create a new page.
+
+Refers to {{msg-mw|Helppage}}.',
 'anontalkpagetext' => 'Displayed at the bottom of talk pages of anonymous users.',
 'noarticletext' => 'This is the message that you get if you search for a term that has not yet got any entries on the wiki.
 
-See also {{msg-mw|Noarticletext-nopermission}}.',
+See also:
+* {{msg-mw|Noarticletext-nopermission}}',
 'noarticletext-nopermission' => 'See also {{msg-mw|Noarticletext}}.',
 'missing-revision' => 'Text displayed when the requested revision does not exist using a permalink.
 
@@ -1858,11 +1891,25 @@ Parameters:
 Parameters:
 * $1 - (Optional) the name of the blocked user. Can be used for GENDER.',
 'clearyourcache' => 'Text at the top of .js/.css pages',
-'usercssyoucanpreview' => "Text displayed on every css page. The 'Show preview' part should be the same as {{msg-mw|showpreview}} (or you can use <nowiki>{{int:showpreview}}</nowiki>).",
-'userjsyoucanpreview' => 'Text displayed on every js page.',
-'usercsspreview' => 'Text displayed on preview of every user .css subpage',
+'usercssyoucanpreview' => 'Text displayed on every CSS page.
+
+See also:
+* {{msg-mw|Userjsyoucanpreview}}
+* {{msg-mw|Showpreview}}',
+'userjsyoucanpreview' => 'Text displayed on every JavaScript page.
+
+See also:
+* {{msg-mw|Usercssyoucanpreview}}
+* {{msg-mw|Showpreview}}',
+'usercsspreview' => 'Text displayed on preview of every user .css subpage.
+
+See also:
+* {{msg-mw|Sitecsspreview}}',
 'userjspreview' => 'Text displayed on preview of every user .js subpage',
-'sitecsspreview' => 'Text displayed on preview of .css pages in MediaWiki namespace',
+'sitecsspreview' => 'Text displayed on preview of .css pages in MediaWiki namespace.
+
+See also:
+* {{msg-mw|Usercsspreview}}',
 'sitejspreview' => 'Text displayed on preview of .js pages in MediaWiki namespace',
 'userinvalidcssjstitle' => 'Parameters:
 * $1 - skin name',
@@ -1893,21 +1940,24 @@ See also:
 * {{msg-mw|Token suffix mismatch}}
 * {{msg-mw|Session fail preview}}
 * {{msg-mw|Edit form incomplete}}',
-'editing' => "Shown as page title when editing a page. Parameters:
-* \$1 - the name of the page that is being edited. e.g. \"''Editing Main Page''\"",
-'creating' => "Shown as page title when creating a page. Parameters:
-* \$1 is the name of the page that is being created. Example: \"''Creating Main Page''\".",
+'editing' => 'Shown as page title when editing a page. Parameters:
+* $1 - the name of the page that is being edited. e.g. "Editing Main Page"
+{{Related|Editing}}',
+'creating' => 'Shown as page title when creating a page. Parameters:
+* $1 - the name of the page that is being created. Example: "Creating Main Page".
+{{Related|Editing}}',
 'editingsection' => 'This message displays at the top of the page when a user is editing a page section. Parameters:
 * $1 - page name
-See also:
-* {{msg-mw|Editingcomment}}',
+{{Related|Editing}}',
 'editingcomment' => 'This message displays at the top of the page when a user is creating a new section. Parameters:
 * $1 - page name
-See also:
-* {{msg-mw|Editingsection}}',
+{{Related|Editing}}',
 'editconflict' => 'Used as title of error message. Parameters:
 * $1 - page title',
-'explainconflict' => 'Appears at the top of a page when there is an edit conflict.',
+'explainconflict' => 'Appears at the top of a page when there is an edit conflict.
+
+See also:
+* {{msg-mw|Savearticle}}',
 'yourtext' => 'Used in Diff Preview page. The diff is between {{msg-mw|currentrev}} and {{msg-mw|yourtext}}.
 
 Also used in Edit Conflict page; the diff between {{msg-mw|yourtext}} and {{msg-mw|storedversion}}.',
@@ -2035,9 +2085,15 @@ See also:
 * {{msg-mw|edit-no-change}}',
 'defaultmessagetext' => 'Caption above the default message text shown on the left-hand side of a diff displayed after clicking "Show changes" when creating a new page in the MediaWiki: namespace',
 'content-failed-to-parse' => "Error message indicating that the page's content can not be saved because it is syntactically invalid. This may occurr for content types using serialization or a strict markup syntax.
-*$1 – content model ({{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}})
-*$2 – content format as MIME type (e.g. <tt>text/css</tt>)
-*$3 – specific error message",
+
+Parameters:
+* $1 – content model, any one of the following messages:
+** {{msg-mw|Content-model-wikitext}}
+** {{msg-mw|Content-model-javascript}}
+** {{msg-mw|Content-model-css}}
+** {{msg-mw|Content-model-text}}
+* $2 – content format as MIME type (e.g. <code>text/css</code>)
+* $3 – specific error message",
 'invalid-content-data' => "Error message indicating that the page's content can not be saved because it is invalid. This may occurr for content types with internal consistency constraints.",
 'content-not-allowed-here' => 'Error message indicating that the desired content model is not supported in given localtion.
 * $1 - the human readable name of the content model: {{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}
@@ -2124,21 +2180,21 @@ Parameters:
 * $2 - (Unused) the value of the max depth limit
 See also:
 * {{msg-mw|Expansion-depth-exceeded-category}}',
-'parser-unstrip-loop-warning' => '{{Doc-important|Do not translate function name "<code>unstrip</code>".}}
-This error is shown when a parser extension tag such as &lt;pre> includes a reference to itself in its own output.
+'parser-unstrip-loop-warning' => '{{Doc-important|Do not translate function name <code>unstrip</code>.}}
+This error is shown when a parser extension tag such as <code><nowiki><pre></nowiki></code> includes a reference to itself in its own output.
 
-The reference must be to the exact same invocation of the tag at the same location in the source, merely writing &lt;pre>&lt;pre>&lt;/pre>&lt;/pre> will not do it.
+The reference must be to the exact same invocation of the tag at the same location in the source, merely writing <code><nowiki><pre><pre></pre></pre></nowiki></code> will not do it.
 
 This is usually impossible and unlikely to happen by accident, so translation is not essential.
 
-"Unstrip" refers to the internal function of the parser, called \'unstrip\', which recursively puts the output of parser functions in the place of the parser function call and which would enter an infinite loop in the situation above.
+"Unstrip" refers to the internal function of the parser, called "unstrip", which recursively puts the output of parser functions in the place of the parser function call and which would enter an infinite loop in the situation above.
 
 See also:
 *{{msg-mw|Parser-unstrip-recursion-limit}}',
-'parser-unstrip-recursion-limit' => '{{doc-important|Do not translate function name "<code>unstrip</code>".}}
+'parser-unstrip-recursion-limit' => '{{doc-important|Do not translate function name <code>unstrip</code>.}}
 This message is shown when the recursion limit for nested parser extension tags is exceeded.
 
-This warning may be encountered due to input text like &lt;ref>&lt;ref>&lt;ref>...&lt;/ref>&lt;/ref>&lt;/ref>.
+This warning may be encountered due to input text like <code><nowiki><ref><ref><ref>...</ref></ref></ref></nowiki></code>.
 
 Parameters:
 * $1 - the depth limit
@@ -2227,7 +2283,12 @@ Parameters:
 'page_last' => "This is part of the navigation message on the top and bottom of Special pages which are lists of things in alphabetical order, e.g. the '[[Special:Categories|Categories]]' special page. It is followed by the message {{msg-mw|Viewprevnext}}.
 
 {{Identical|Last}}",
-'histlegend' => 'Text in history page. Refers to {{msg-mw|cur}}, {{msg-mw|last}}, and {{msg-mw|minoreditletter}}.',
+'histlegend' => 'Text in history page.
+
+See also:
+* {{msg-mw|Cur}}
+* {{msg-mw|Last}}
+* {{msg-mw|Minoreditletter}}',
 'history-fieldset-title' => 'Fieldset label in the edit history pages.',
 'history-show-deleted' => 'CheckBox to show only per [[mw:Manual:RevisionDelete|RevisonDelete]] deleted versions.
 
@@ -2330,11 +2391,13 @@ See also:
 'revdelete-text' => '{{RevisionDelete}}
 This is the introduction explaining the feature.',
 'revdelete-confirm' => 'This message is a part of the [[mw:RevisionDelete|RevisionDelete]] feature.
-[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]
+
+Refers to {{msg-mw|Policy-url}}.
 
 See also:
 * {{msg-mw|Revdelete-suppress}}
-* {{msg-mw|Revdelete-suppress-text}}',
+* {{msg-mw|Revdelete-suppress-text}}
+[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]',
 'revdelete-suppress-text' => 'Used as usage text in [[Special:RevisionDelete]].
 
 See also:
@@ -2680,7 +2743,13 @@ Example: [{{canonicalurl:Project:News|diff=426850&oldid=99999999}} Diff with inv
 
 Parameters:
 * $1 - the search term',
-'searchsubtitle' => 'Parameters:
+'searchresulttext' => '{{doc-important|Do not translate <code><nowiki>[[{{MediaWiki:Helppage}}|{{int:help}}]]</nowiki></code>.}}
+See also:
+* {{msg-mw|Helppage}}
+* {{msg-mw|Help}}',
+'searchsubtitle' => 'Refers to {{msg-mw|Pipe-separator}}.
+
+Parameters:
 * $1 - search term
 See also:
 * {{msg-mw|Searchsubtitleinvalid}}',
@@ -2726,7 +2795,9 @@ It is also used by [[Special:WhatLinksHere|Whatlinkshere]] pages, where ($1) and
 ($3) is made up in all cases of the various proposed numbers of results per page, e.g. "(20 | 50 | 100 | 250 | 500)".
 For Special pages, the navigation bar is prefixed by "({{msg-mw|Page first}} | {{msg-mw|Page last}})" (alphabetical order) or "({{msg-mw|Histfirst}} | {{msg-mw|Histlast}})" (date order).
 
-Viewprevnext is sometimes preceded by the {{msg-mw|Showingresults}} or {{msg-mw|Showingresultsnum}} message (for Special pages) or by the {{msg-mw|Linkshere}} message (for Whatlinkshere pages).',
+Viewprevnext is sometimes preceded by the {{msg-mw|Showingresults}} or {{msg-mw|Showingresultsnum}} message (for Special pages) or by the {{msg-mw|Linkshere}} message (for Whatlinkshere pages).
+
+Refers to {{msg-mw|Pipe-separator}}.',
 'searchmenu-legend' => '{{Identical|Search options}}',
 'searchmenu-exists' => 'An option shown in a menu beside search form offering a link to the existing page having the specified title (when using the default MediaWiki search engine).
 
@@ -3046,7 +3117,10 @@ Used in [[Special:Preferences]]. Parameters are:
 {{Identical|Signature}}',
 'prefs-help-signature' => 'Used in [[Special:Preferences]], tab User profile.',
 'badsig' => 'Error message displayed when entering invalid signature in user preferences',
-'badsiglength' => 'Warning message that is displayed on [[Special:Preferences]] when trying to save a signature that is too long. Parameter $1 is the maximum number of characters that is allowed in a signature (multi-byte characters are counted as one character).',
+'badsiglength' => 'Warning message that is displayed on [[Special:Preferences]] when trying to save a signature that is too long.
+
+Parameters
+* $1 - the maximum number of characters that is allowed in a signature (multi-byte characters are counted as one character)',
 'yourgender' => 'Used in [[Special:Preferences]], first tab, in the Internationalisation section.
 This may be customized for other languages. This should sound like a question, the answer to which can be selected in one of these:
 * {{msg-mw|gender-unknown}}
@@ -3293,7 +3367,7 @@ Related messages:
 * {{msg-mw|right-reupload}}',
 'right-upload_by_url' => '{{doc-right|upload by url}}',
 'right-purge' => '{{doc-right|purge}}
-The right to use <tt>&action=purge</tt> in the URL, without needing to confirm it (by default, anonymous users need to confirm it).',
+The right to use <code>&action=purge</code> in the URL, without needing to confirm it (by default, anonymous users need to confirm it).',
 'right-autoconfirmed' => "{{doc-right|autoconfirmed}}
 If your account is older than [[mw:Manual:\$wgAutoConfirmAge|wgAutoConfirmAge]] and if you have at least [[mw:Manual:\$wgAutoConfirmCount|\$wgAutoConfirmCount]] edits, you are in the '''group \"autoconfirmed\"''' (note that you can't see this group at [[Special:ListUsers]]).
 If you are in that group, you have (by default) the '''right \"autoconfirmed\"''', which exempts you from certain rate limits (those based on your IP address or otherwise intended solely for new users). Other rate limits may still apply; see {{msg-mw|right-noratelimit}}.",
@@ -3362,9 +3436,13 @@ This user automatically bypasses IP blocks, auto-blocks and range blocks - so I
 'right-unblockself' => '{{doc-right|unblockself}}',
 'right-protect' => '{{doc-right|protect}}',
 'right-editprotected' => '{{doc-right|editprotected}}
+Refers to {{msg-mw|Protect-level-sysop}}.
+
 See also:
 * {{msg-mw|Right-editsemiprotected}}',
 'right-editsemiprotected' => '{{doc-right|editsemiprotected}}
+Refers to {{msg-mw|Protect-level-autoconfirmed}}.
+
 See also:
 * {{msg-mw|Right-editprotected}}',
 'right-editinterface' => '{{doc-right|editinterface}}',
@@ -3389,7 +3467,7 @@ See also:
 'right-rollback' => '{{doc-right|rollback}}
 {{Identical|Rollback}}',
 'right-markbotedits' => '{{doc-right|markbotedits}}
-A user with this right can mark a roll-back edit as a bot edit by adding <tt>&bot=1</tt> to the URL (not by default).',
+A user with this right can mark a roll-back edit as a bot edit by adding <code>&bot=1</code> to the URL (not by default).',
 'right-noratelimit' => '{{doc-right|noratelimit}}
 The rate limits have no effect on the groups that have this right. Rate limits is a restriction that you can only do X actions (edits, moves, etc.) in Y number of seconds (set by [[mw:Manual:$wgRateLimits|$wgRateLimits]]).',
 'right-import' => '{{doc-right|import}}',
@@ -3547,10 +3625,10 @@ The corresponding message is {{msg-mw|Rcnotefrom}}.',
 'rcshowhidemine' => "Option text in [[Special:RecentChanges]]. Parameters:
 * $1 is the 'show/hide' command, with the text taken from either {{msg-mw|show}} or {{msg-mw|hide}}.",
 'rclinks' => "Used on [[Special:RecentChanges]].
-* '''\$1''' is a list of different choices with number of pages to be shown.<br />&nbsp;Example: \"''50{{int:pipe-separator}}100{{int:pipe-separator}}250{{int:pipe-separator}}500\".
-* '''\$2''' is a list of clickable links with a number of days for which recent changes are to be displayed.<br />&nbsp;Example: \"''1{{int:pipe-separator}}3{{int:pipe-separator}}7{{int:pipe-separator}}14{{int:pipe-separator}}30''\".
-* '''\$3''' is a block of text that consists of other messages.<br />&nbsp;Example: \"''Hide minor edits{{int:pipe-separator}}Show bots{{int:pipe-separator}}Hide anonymous users{{int:pipe-separator}}Hide logged-in users{{int:pipe-separator}}Hide patrolled edits{{int:pipe-separator}}Hide my edits''\"
-List elements are separated by {{msg-mw|pipe-separator}} each. Each list element is, or contains, a link.",
+* \$1 - a list of different choices with number of pages to be shown.<br />&nbsp;Example: \"''50{{int:pipe-separator}}100{{int:pipe-separator}}250{{int:pipe-separator}}500\".
+* \$2 - a list of clickable links with a number of days for which recent changes are to be displayed.<br />&nbsp;Example: \"''1{{int:pipe-separator}}3{{int:pipe-separator}}7{{int:pipe-separator}}14{{int:pipe-separator}}30''\".
+* \$3 - a block of text that consists of other messages.<br />&nbsp;Example: \"''Hide minor edits{{int:pipe-separator}}Show bots{{int:pipe-separator}}Hide anonymous users{{int:pipe-separator}}Hide logged-in users{{int:pipe-separator}}Hide patrolled edits{{int:pipe-separator}}Hide my edits''\"
+List elements are separated by {{msg-mw|Pipe-separator}} each. Each list element is, or contains, a link.",
 'diff' => 'Short form of "differences". Used on [[Special:RecentChanges]], [[Special:Watchlist]], ...',
 'hist' => 'Short form of "history". Used on [[Special:RecentChanges]], [[Special:Watchlist]], ...',
 'hide' => '{{doc-actionlink}}
@@ -3666,8 +3744,8 @@ See also:
 See also:
 * {{msg-mw|upload-tryagain|Submit text}}',
 'upload-recreate-warning' => 'Used as warning in [[Special:Upload]].',
-'uploadtext' => "{{doc-important|''thumb'' and ''left'' are magic words. Leave them untranslated!}}
-Text displayed when uploading a file using [[Special:Upload]].",
+'uploadtext' => '{{doc-important|<code>thumb</code> and <code>left</code> are magic words. Leave them untranslated!}}
+Text displayed when uploading a file using [[Special:Upload]].',
 'upload-permitted' => 'Used in [[Special:Upload]]. Parameters:
 * $1 - list of file types, defined in the variable [[mw:Special:MyLanguage/Manual:$wgFileExtensions|$wgFileExtensions]]
 See also:
@@ -5090,7 +5168,9 @@ See also:
 
 # Special:ListGroupRights
 'listgrouprights' => 'The name of the special page [[Special:ListGroupRights]].',
-'listgrouprights-summary' => 'The description used on [[Special:ListGroupRights]].',
+'listgrouprights-summary' => 'The description used on [[Special:ListGroupRights]].
+
+Refers to {{msg-mw|Listgrouprights-helppage}}.',
 'listgrouprights-key' => 'Footer note for the [[Special:ListGroupRights]] page',
 'listgrouprights-group' => "The title of the column in the table, about user groups (like you are in the ''translator'' group).
 
@@ -5099,12 +5179,14 @@ See also:
 {{Identical|Right}}",
 'listgrouprights-helppage' => "The link used on [[Special:ListGroupRights]]. Just translate \"Group rights\", and '''leave the \"Help:\" namespace exactly as it is'''.",
 'listgrouprights-members' => 'Used on [[Special:ListGroupRights]] and [[Special:Statistics]] as a link to [[Special:ListUsers|Special:ListUsers/"group"]], a list of members in that group.',
-'listgrouprights-right-display' => "{{optional}}
-* $1 is the text from the 'right-...' messages, i.e. {{msg-mw|right-edit}}
-* $2 is the codename of this right",
-'listgrouprights-right-revoked' => "{{optional}}
-* $1 is the text from the 'right-...' messages, i.e. {{msg-mw|right-edit}}
-* $2 is the codename of this right",
+'listgrouprights-right-display' => '{{optional}}
+Parameters:
+* $1 - the text from the "right-..." messages, i.e. {{msg-mw|Right-edit}}
+* $2 - the codename of this right',
+'listgrouprights-right-revoked' => '{{optional}}
+Parameters:
+* $1 - the text from the "right-..." messages, i.e. {{msg-mw|Right-edit}}
+* $2 - the codename of this right',
 'listgrouprights-addgroup' => 'This is an individual right for groups, used on [[Special:ListGroupRights]].
 * $1 - an enumeration of group names
 * $2 - the number of group names in $1
@@ -5394,32 +5476,36 @@ See also:
 * $1 - a link which points to a diff, shown as a plain link
 See also:
 * {{msg-mw|Enotif lastvisited}}',
-'enotif_anon_editor' => 'User name in an e-mail notification when referring to an anonymous user. Parameters:
-* $1 is the anonymous user name (i.e. an IP address).',
-'enotif_body' => 'Text of a notification e-mail sent when a watched page has been edited or deleted.[[File:Screenshot_MediaWiki_e-mail_notifier.PNG|150px|right]]
+'enotif_anon_editor' => 'User name in an email notification when referring to an anonymous user. Parameters:
+* $1 - the anonymous user name (i.e. an IP address).',
+'enotif_body' => 'Text of a notification email sent when a watched page has been edited or deleted.
+[[File:Screenshot_MediaWiki_e-mail_notifier.PNG|150px|right]]
+
+Refers to {{msg-mw|Helppage}}.
 
+Parameters:
 *$WATCHINGUSERNAME is the username of the user receiving the notification.
 *$PAGEINTRO is the first line of the message, saying what happened. It currently can be either of:
-**{{msg-mw|enotif body intro deleted}}
-**{{msg-mw|enotif body intro created}}
-**{{msg-mw|enotif body intro moved}}
-**{{msg-mw|enotif body intro restored}}
-**{{msg-mw|enotif body intro changed}} (for all the other cases).
+**{{msg-mw|Enotif body intro deleted}}
+**{{msg-mw|Enotif body intro created}}
+**{{msg-mw|Enotif body intro moved}}
+**{{msg-mw|Enotif body intro restored}}
+**{{msg-mw|Enotif body intro changed}} (for all the other cases).
 *$NEWPAGE consists of either
-**if the page is new (in older releases), {{msg-mw|enotif newpagetext}}
+**if the page is new (in older releases), {{msg-mw|Enotif newpagetext}}
 **if the page has a previous revision,
-***{{msg-mw|enotif lastdiff}}
+***{{msg-mw|Enotif lastdiff}}
 ***a newline
-***{{msg-mw|enotif lastvisited}}
-*$PAGEEDITOR_EMAIL and $PAGEEDITOR_WIKI are links respectively to the e-mail user special page and user page for the user who performed the action.
+***{{msg-mw|Enotif lastvisited}}
+*$PAGEEDITOR_EMAIL and $PAGEEDITOR_WIKI are links respectively to the email user special page and user page for the user who performed the action.
 *$PAGEEDITOR is the username of the user who performed the action.
 
-The subject of the e-mail is one of the following messages:
-*{{msg-mw|enotif subject deleted}}
-*{{msg-mw|enotif subject created}}
-*{{msg-mw|enotif subject moved}}
-*{{msg-mw|enotif subject restored}}
-*{{msg-mw|enotif subject changed}}',
+The subject of the email is one of the following messages:
+*{{msg-mw|Enotif subject deleted}}
+*{{msg-mw|Enotif subject created}}
+*{{msg-mw|Enotif subject moved}}
+*{{msg-mw|Enotif subject restored}}
+*{{msg-mw|Enotif subject changed}}',
 'created' => '{{Optional}}
 Possible value for $CHANGEDORCREATED in the following messages:
 * {{msg-mw|enotif_subject}}
@@ -5456,7 +5542,9 @@ Followed by a link which points to the history page.
 
 Parameters:
 * $1 - the <b>approximate</b> number of revisions that the page has, the message should not claim to give an exact count',
-'confirmdeletetext' => 'Introduction shown when deleting a page.',
+'confirmdeletetext' => 'Introduction shown when deleting a page.
+
+Refers to {{msg-mw|Policy-url}}.',
 'actioncomplete' => 'Used in several situations, for example when a page has been deleted.
 
 See also:
@@ -5529,7 +5617,12 @@ See also:
 * {{msg-mw|Notvisiblerev}}
 {{Identical|Revert}}
 {{Identical|Rollback}}',
-'alreadyrolled' => "Appear when there's rollback and/or edit collision. Parameters:
+'alreadyrolled' => "Appear when there's rollback and/or edit collision.
+
+Refers to:
+* {{msg-mw|Pipe-separator}}
+* {{msg-mw|Contribslink}}
+Parameters:
 * $1 - the page to be rolled back
 * $2 - the editor to be rolled-back of that page
 * $3 - the editor that cause collision
@@ -5691,8 +5784,8 @@ Parameters:
 {{Identical|Other reason}}',
 'protect-dropdown' => 'Shown on the page protection form as drop down menu for protection reasons.
 
-<tt><nowiki>* Groupname</nowiki></tt> - defines a new group<br />
-<tt><nowiki>** Reason</nowiki></tt> - defines a reason in this group',
+* <code><nowiki>* Groupname</nowiki></code> - defines a new group
+* <code><nowiki>** Reason</nowiki></code> - defines a reason in this group',
 'protect-edit-reasonlist' => 'Shown beneath the page protection form on the right side. It is a link to {{msg-mw|Protect-dropdown|notext=1}}.
 
 See also:
@@ -5754,9 +5847,12 @@ See also:
 See also:
 * {{msg-mw|Undelete-no-results}} - if no results',
 'undelete-fieldset-title' => 'Used as the title of the fieldset.',
-'undeleteextrahelp' => "Help message displayed when restoring history of a page.
+'undeleteextrahelp' => 'Help message displayed when restoring history of a page.
 
-In your language, ''Restore'' is called {{msg-mw|Undeletebtn}}, the ''Reset'' button is called {{msg-mw|Undeletereset}}.",
+Refers to {{msg-mw|Undeletebtn}}.
+
+See also:
+* {{msg-mw|Undeletereset}}',
 'undeleterevisions' => 'Enclosed in parentheses and preceded by item name.
 
 Parameters:
@@ -5780,11 +5876,11 @@ See also:
 Parameters:
 * $1 - deleted page name
 * $2 - (unused)
-* $3 - user name (author of revision, not who deleted it)
-* $4 - date of the revision
-* $5 - time of the revision
-Example:
-* Deleted revision of [[Main Page]] (as of {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, at {{CURRENTTIME}}) by [[User:Username|Username]]:',
+* $3 - username (author of revision, not who deleted it)
+* $4 - date of the revision (localized)
+* $5 - time of the revision (localized)
+Example (in English):
+* Deleted revision of [[Main Page]] (as of 14 September 2013, at 08:17) by [[User:Username|Username]]:',
 'undeleterevision-missing' => 'Used as warning when undeleting the revision.',
 'undelete-nodiff' => 'Used in [[Special:Undelete]].',
 'undeletebtn' => 'Shown on [[Special:Undelete]] as button caption and on [[Special:Log/delete|deletion log]] after each entry (for sysops).
@@ -6136,6 +6232,8 @@ See also:
 {{Identical|Block user}}',
 'blockiptext' => 'Used in the {{msg-mw|Blockip}} form in [[Special:Block]].
 
+Refers to {{msg-mw|Policy-url}}.
+
 This message may follow the message {{msg-mw|Ipb-otherblocks-header}} and other block messages.
 
 See also:
@@ -6543,7 +6641,7 @@ See also:
 * $1 is the original block reason for the IP address matched in the X-Forwarded-For header",
 'cant-see-hidden-user' => 'Used as (red) error message on [[Special:Block]] when you try to change (as sysop without the hideuser right) the block of a hidden user.',
 'ipbblocked' => 'Error message shown when a user tries to alter block settings when they are themselves blocked.',
-'ipbnounblockself' => 'Error message shown when a user without the <tt>unblockself</tt> right tries to unblock themself.',
+'ipbnounblockself' => 'Error message shown when a user without the <code>unblockself</code> right tries to unblock themself.',
 
 # Developer tools
 'lockdb' => 'The title of the special page [[Special:LockDB]].
@@ -6639,7 +6737,12 @@ See also:
 * $3 is the time at which the lock was made',
 
 # Move page
-'move-page' => 'Header of the special page to move pages. $1 is the name of the page to be moved.',
+'move-page' => 'Used as page title of [[Special:MovePage]] to move pages.
+
+See example: [[Special:MovePage/Portal:En]].
+
+Parameters:
+* $1 - the name of the page to be moved (without link)',
 'move-page-legend' => 'Legend of the fieldset around the input form of [[Special:MovePage/testpage]].
 
 See also:
@@ -6811,11 +6914,19 @@ See also:
 'movepage-page-exists' => 'Used as error message when moving page.
 * $1 - page title',
 'movepage-page-moved' => 'Used as success message when moving page.
-* $1 - old page title
-* $2 - new page title',
-'movepage-page-unmoved' => 'Used as error message when moving page.
-* $1 - old page title
-* $2 - new page title',
+
+Can be followed by {{msg-mw|Movepage-max-pages}}.
+
+Parameters:
+* $1 - old page title (with link)
+* $2 - new page title (with link)
+See also:
+* {{msg-mw|Movepage-page-unmoved}}',
+'movepage-page-unmoved' => 'Used as error message when moving page. Parameters:
+* $1 - old page title (with link)
+* $2 - new page title (with link)
+See also:
+* {{msg-mw|Movepage-page-moved}}',
 'movepage-max-pages' => 'PROBABLY (A GUESS): when moving a page, you can select an option of moving its subpages, but there is a maximum that can be moved automatically.
 
 Parameters:
@@ -6967,7 +7078,9 @@ Parameters:
 # Export
 'export' => 'Page title of [[Special:Export]], a page where a user can export pages from a wiki to a file.',
 'exporttext' => '{{doc-important|Leave the line <code><nowiki>[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]</nowiki></code> exactly as it is!}}
-Main text on [[Special:Export]].',
+Main text on [[Special:Export]].
+
+Refers to {{msg-mw|Mainpage}}.',
 'exportall' => 'A label of checkbox option in [[Special:Export]]',
 'exportcuronly' => 'A label of checkbox option in [[Special:Export]]',
 'exportnohistory' => 'Used in [[Special:Export]].',
@@ -7405,7 +7518,7 @@ See also:
 * {{msg-mw|Tooltip-ca-viewsource}}',
 'tooltip-ca-history' => 'Used as tooltip for {{msg-mw|Vector-view-history}}.
 
-See for example [{{canonicalurl:Main_Page|useskin=vector}}]
+See for example [{{canonicalurl:Main Page|useskin=vector}} Main Page]
 
 See also:
 * {{msg-mw|Vector-view-history}}
@@ -8149,7 +8262,12 @@ Parameters:
 The variable $1 is the number of individual frames in an animated gif file.
 
 For example of message in use see [[:File:Mouse10.gif]].',
-'file-no-thumb-animation' => 'We cannot animate thumbnails of this file. This notice is shown on the image description page on animated svg files just below {{msg-mw|file-info-size}}. This message may be overridden by a more specific message of the form file-no-thumb-animation-&lt;extension&gt; like {{msg-mw|file-no-thumb-animation-gif}}',
+'file-no-thumb-animation' => 'We cannot animate thumbnails of this file.
+
+This notice is shown on the image description page on animated svg files just below {{msg-mw|File-info-size}}.
+
+This message may be overridden by a more specific message:
+* {{msg-mw|File-no-thumb-animation-gif}}.',
 'file-no-thumb-animation-gif' => 'Cannot animate thumbnails of this gif file, because it has too big a resolution. The cut off resolution can vary between wikis ([[mw:manual:$wgMaxAnimatedGifArea|$wgMaxAnimatedGifArea]]). Note that resolution is calculated as width times height times number of frames. See {{msg-mw|file-no-thumb-animation}}.',
 
 # Special:NewFiles
@@ -8223,7 +8341,7 @@ Parameters:
 * $1 - the number of years',
 'ago' => 'Phrase for indicating how long ago something happened. Parameters:
 * $1 - some kind of timestamp
-{{Identical|$1 ago}}',
+{{Identical|Ago}}',
 'just-now' => 'Phrase for indicating something happened just now.',
 
 # Human-readable timestamps
@@ -9551,7 +9669,8 @@ See also:
 'watchlistedit-normal-title' => 'Title of [[Special:Watchlist/edit|special page]].',
 'watchlistedit-normal-legend' => 'Heading of dialogue box on [[Special:Watchlist/edit]]',
 'watchlistedit-normal-explain' => 'An introduction/explanation about the [[Special:Watchlist/edit|normal edit watchlist function]].
-Hint: the text "Remove Titles" is in {{msg-mw|watchlistedit-normal-submit}}',
+
+Refers to {{msg-mw|Watchlistedit-normal-submit}}.',
 'watchlistedit-normal-submit' => 'Text of submit button on [[Special:Watchlist/edit]].
 
 See also:
@@ -9573,7 +9692,10 @@ See also:
 'watchlistedit-raw-legend' => 'Heading of dialogue box on [[Special:Watchlist/raw]].
 
 {{Identical|Edit raw watchlist}}',
-'watchlistedit-raw-explain' => 'An introduction/explanation about the [[Special:Watchlist/raw|raw edit watchlist function]].',
+'watchlistedit-raw-explain' => '{{doc-important|Do not translate <code><nowiki>{{int:Watchlistedit-raw-submit}}</nowiki></code> and <code>Special:EditWatchlist</code>.}}
+An introduction/explanation about the [[Special:Watchlist/raw|raw edit watchlist function]].
+
+Refers to {{msg-mw|Watchlistedit-raw-submit}}.',
 'watchlistedit-raw-titles' => 'Text above edit box containing items being watched on [[Special:Watchlist/raw]].
 {{Identical|Title}}',
 'watchlistedit-raw-submit' => 'Text of submit button on [[Special:Watchlist/raw]].
@@ -10057,7 +10179,7 @@ Parameters:
 * $3 - the name of the log page inside parenthesis',
 'logentry-delete-revision' => '{{Logentry|[[Special:Log/delete]]}}
 {{Logentryparam}}
-* $5 - the number of affected revisions of the page $3.',
+* $5 - the number of affected revisions of the page $3',
 'logentry-delete-event-legacy' => '{{Logentry|[[Special:Log/delete]]}}
 * $3 - the name of the log page inside parenthesis',
 'logentry-delete-revision-legacy' => '{{Logentry|[[Special:Log/delete]]}}',
index 83f1655..faaa635 100644 (file)
@@ -71,6 +71,7 @@
  * @author MaxSem
  * @author NBS
  * @author Nemo bis
+ * @author Okras
  * @author Ola
  * @author Ole Yves
  * @author Putnik
@@ -436,7 +437,7 @@ $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъы
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Подчёркивать ссылки:',
+'tog-underline' => 'Подчёркивание ссылок:',
 'tog-justify' => 'Выравнивать текст по ширине страницы',
 'tog-hideminor' => 'Скрывать малые правки в списке свежих правок',
 'tog-hidepatrolled' => 'Скрывать патрулированные правки в списке свежих правок',
@@ -479,7 +480,7 @@ $messages = array(
 'tog-noconvertlink' => 'Отключить ссылку на преобразование заголовка',
 'tog-norollbackdiff' => 'Не показывать разницу версий после выполнения отката',
 'tog-useeditwarning' => 'Предупреждать, когда я покидаю страницу с несохранёнными изменениями',
-'tog-prefershttps' => 'Всегда использовать защищенное соединение при входе в',
+'tog-prefershttps' => 'Всегда использовать защищённое соединение после представления системе',
 
 'underline-always' => 'Всегда',
 'underline-never' => 'Никогда',
@@ -805,6 +806,7 @@ $1',
 'cannotdelete-title' => 'Нельзя удалить страницу «$1»',
 'delete-hook-aborted' => 'Правка отменена процедурой-перехватчиком.
 Дополнительных пояснений не приведено.',
+'no-null-revision' => 'Не удалось создать новую нулевую правку для страницы «$1»',
 'badtitle' => 'Недопустимое название',
 'badtitletext' => 'Запрашиваемое название страницы неправильно, пусто, либо неверно указано межъязыковое или интервики название. Возможно, в названии используются недопустимые символы.',
 'perfcached' => 'Следующие данные взяты из кэша и могут не учитывать последних изменений. В кэше хранится не более $1 {{PLURAL:$1|записи|записей|записей}}.',
@@ -864,7 +866,7 @@ $2',
 'createacct-another-username-ph' => 'Введите имя вашей учётной записи',
 'yourpassword' => 'Пароль:',
 'userlogin-yourpassword' => 'Пароль',
-'userlogin-yourpassword-ph' => 'Введите ваш пароль',
+'userlogin-yourpassword-ph' => 'Введите свой пароль',
 'createacct-yourpassword-ph' => 'Введите пароль',
 'yourpasswordagain' => 'Повторный набор пароля:',
 'createacct-yourpasswordagain' => 'Подтвердите пароль',
@@ -1061,6 +1063,13 @@ $2
 
 # Special:ResetTokens
 'resettokens' => 'Сбросить токены',
+'resettokens-no-tokens' => 'Нет токенов для сброса.',
+'resettokens-legend' => 'Сбросить токены',
+'resettokens-tokens' => 'Токены:',
+'resettokens-token-label' => '$1 (текущее значение: $2)',
+'resettokens-watchlist-token' => 'Токен для веб-канала (Atom/RSS)  [[Special:Watchlist|изменений страниц в вашем списке наблюдения]]',
+'resettokens-done' => 'Токены сброшены.',
+'resettokens-resetbutton' => 'Сбросить выбранные токены',
 
 # Edit page toolbar
 'bold_sample' => 'Полужирное начертание',
@@ -1597,6 +1606,8 @@ $1",
 'recentchangesdays-max' => '(не более $1 {{PLURAL:$1|дня|дней|дней}})',
 'recentchangescount' => 'Количество правок, отображаемое по умолчанию:',
 'prefs-help-recentchangescount' => 'Включает свежие правки, истории страниц, журналы.',
+'prefs-help-watchlist-token2' => 'Это секретный ключ для веб-канала вашего списка наблюдений.
+Любой, кто знает его, сможет читать ваш список наблюдения, поэтому не сообщайте его другим. [[Special:ResetTokens|Нажмите здесь, если вам нужно сбросить его]].',
 'savedprefs' => 'Ваши настройки сохранены.',
 'timezonelegend' => 'Часовой пояс:',
 'localtime' => 'Местное время:',
@@ -1671,7 +1682,7 @@ $1",
 'prefs-displaywatchlist' => 'Настройки отображения',
 'prefs-tokenwatchlist' => 'Токен',
 'prefs-diffs' => 'Разница версий',
-'prefs-help-prefershttps' => 'ЭÑ\82а Ð½Ð°Ñ\81Ñ\82Ñ\80ойка Ð±Ñ\83деÑ\82 Ð²Ð²ÐµÐ´ÐµÐ½Ð° Ð² Ñ\81ледÑ\83Ñ\8eÑ\89ий Ñ\80аз ÐºÐ¾Ð³Ð´Ð° Ð²Ñ\8b Ð¿Ñ\80едÑ\81Ñ\82авиÑ\82еÑ\81Ñ\8c системе.',
+'prefs-help-prefershttps' => 'ЭÑ\82а Ð½Ð°Ñ\81Ñ\82Ñ\80ойка Ð±Ñ\83деÑ\82 Ð¿Ñ\80именена Ð¿Ð¾Ñ\81ле Ñ\81ледÑ\83Ñ\8eÑ\89его Ð¿Ñ\80едÑ\81Ñ\82авлениÑ\8f системе.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Выглядит корректно',
@@ -1846,7 +1857,7 @@ $1",
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|изменение|изменения|изменений}}',
-'enhancedrc-since-last-visit' => '$1 с последнего посещения',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|с последнего посещения}}',
 'enhancedrc-history' => 'история',
 'recentchanges' => 'Свежие правки',
 'recentchanges-legend' => 'Настройки свежих правок',
@@ -1880,7 +1891,7 @@ $1",
 'rc_categories_any' => 'Любой',
 'rc-change-size-new' => 'Размер после изменения: $1 {{PLURAL:$1|байт|байта|байт}}',
 'newsectionsummary' => '/* $1 */ новая тема',
-'rc-enhanced-expand' => 'Показать подробности (используется JavaScript)',
+'rc-enhanced-expand' => 'Показать подробности',
 'rc-enhanced-hide' => 'Скрыть подробности',
 'rc-old-title' => 'первоначально созданная как «$1»',
 
@@ -2152,6 +2163,10 @@ $1',
 'listfiles_size' => 'Размер',
 'listfiles_description' => 'Описание',
 'listfiles_count' => 'Версий',
+'listfiles-show-all' => 'Включить старые версии изображений',
+'listfiles-latestversion' => 'Текущая версия',
+'listfiles-latestversion-yes' => 'Да',
+'listfiles-latestversion-no' => 'Нет',
 
 # File description page
 'file-anchor-link' => 'Файл',
@@ -2285,8 +2300,8 @@ $1',
 'pageswithprop-text' => 'Здесь перечислены страницы, у которых были вручную переопределены отдельные свойства.',
 'pageswithprop-prop' => 'Название свойства:',
 'pageswithprop-submit' => 'Найти',
-'pageswithprop-prophidden-long' => 'длинное значение текстового свойства скрыто ($1 килобайт)',
-'pageswithprop-prophidden-binary' => 'значение двоичного свойства скрыто ($1 килобайт)',
+'pageswithprop-prophidden-long' => 'длинное значение текстового свойства скрыто ($1)',
+'pageswithprop-prophidden-binary' => 'значение двоичного свойства скрыто ($1)',
 
 'doubleredirects' => 'Двойные перенаправления',
 'doubleredirectstext' => 'На этой странице представлен список перенаправлений на другие перенаправления.
@@ -3324,13 +3339,13 @@ The wiki server can't provide data in a format your client can read.",
 'pageinfo-length' => 'Длина страницы (в байтах)',
 'pageinfo-article-id' => 'Идентификатор страницы',
 'pageinfo-language' => 'Язык страницы',
-'pageinfo-robot-policy' => 'Ð\98ндекÑ\81аÑ\86иÑ\8f Ð¿Ð¾Ð¸Ñ\81ковÑ\8bми Ñ\81лÑ\83жбами',
-'pageinfo-robot-index' => 'Ð\98ндекÑ\81иÑ\80Ñ\83еÑ\82Ñ\81Ñ\8f',
-'pageinfo-robot-noindex' => 'Не индексируется',
+'pageinfo-robot-policy' => 'Ð\98ндекÑ\81аÑ\86иÑ\8f Ð¿Ð¾Ð¸Ñ\81ковÑ\8bми Ñ\80обоÑ\82ами',
+'pageinfo-robot-index' => 'РазÑ\80еÑ\88ено',
+'pageinfo-robot-noindex' => 'Не разрешено',
 'pageinfo-views' => 'Количество просмотров',
 'pageinfo-watchers' => 'Число наблюдающих',
 'pageinfo-few-watchers' => 'Менее $1 {{PLURAL:$1|следящего|следящих}}',
-'pageinfo-redirects-name' => 'Ð\9fеÑ\80енапÑ\80авлениÑ\8f на эту страницу',
+'pageinfo-redirects-name' => 'Ð\9aолиÑ\87еÑ\81Ñ\82во Ð¿ÐµÑ\80енапÑ\80авлений на эту страницу',
 'pageinfo-redirects-value' => '$1',
 'pageinfo-subpages-name' => 'Подстраницы данной страницы',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|перенаправление|перенаправления|перенаправлений}}; $3 {{PLURAL:$3|обычная|обычные|обычных}})',
@@ -4255,6 +4270,7 @@ MediaWiki распространяется в надежде, что она бу
 'dberr-problems' => 'Извините! На данном сайте возникли технические трудности.',
 'dberr-again' => 'Попробуйте обновить страницу через несколько минут.',
 'dberr-info' => '(невозможно соединиться с сервером баз данных: $1)',
+'dberr-info-hidden' => '(Невозможно соединиться с сервером баз данных)',
 'dberr-usegoogle' => 'Пока вы можете попробовать поискать с помощью Google.',
 'dberr-outofdate' => 'Но имейте в виду, что его индекс может оказаться устаревшим.',
 'dberr-cachederror' => 'Ниже представлена закэшированная версия запрашиваемой страницы, возможно, она не отражает последних изменений.',
@@ -4390,4 +4406,16 @@ MediaWiki распространяется в надежде, что она бу
 # Image rotation
 'rotate-comment' => 'Изображение повёрнуто на $1 градус{{PLURAL:$1||а|ов}} по часовой стрелке',
 
+# Limit report
+'limitreport-cputime' => 'Использование времени процессора',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|секунда|секунды|секунд}}',
+'limitreport-walltime' => 'Использование в режиме реального времени',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|секунда|секунды|секунд}}',
+'limitreport-ppgeneratednodes' => 'Количество сгенерированных препроцессором узлов',
+'limitreport-postexpandincludesize-value' => '$1/$2 байт',
+'limitreport-templateargumentsize' => 'Размер аргумента шаблона',
+'limitreport-templateargumentsize-value' => '$1/$2 байт',
+'limitreport-expansiondepth' => 'Наибольшая глубина расширения',
+'limitreport-expensivefunctioncount' => 'Количество «дорогих» функций анализатора',
+
 );
index f6df0ca..a525e96 100644 (file)
@@ -51,12 +51,12 @@ $messages = array(
 'tog-hidepatrolled' => 'Ботурууллааччы көрбүт көннөрүүтүн саҥа көннөрүүлэр тиһиктэригэр көрдөрүмэ',
 'tog-newpageshidepatrolled' => 'Ботуруулламмыт сирэйдэри саҥа сирэйдэр тиһиктэригэр көрдөрүмэ',
 'tog-extendwatchlist' => 'Кэтээһин тупсарыллыбыт испииһэгэ. Бары уларытыылар көстөллөр (бүтэһиктэр эрэ буолбатах)',
-'tog-usenewrc' => 'Саҥа уларытыылар уонна кэтэбил тиһиктэригэр уларыйыылары бөлөхтүүргэ (JavaScript баар буолуохтаах)',
+'tog-usenewrc' => 'Саҥа уларытыы уонна кэтэбил тиһиктэригэр уларыйыылары бөлөхтүүргэ',
 'tog-numberheadings' => 'Бас тыллары нүөмэрдээ',
-'tog-showtoolbar' => 'Көннөрүү үстүрүмүөннэрин көрдөр (JavaScript)',
-'tog-editondblclick' => 'Хоһулатан иккитэ баттаан сирэйи уларытыы (JavaScript)',
+'tog-showtoolbar' => 'Көннөрүү үстүрүмүөннэрин көрдөр',
+'tog-editondblclick' => 'Хоһулатан иккитэ баттаан сирэйи уларытыы',
 'tog-editsection' => '[Көннөрүү] диэн ыйынньыгынан сиэксийэны көннөрүү',
-'tog-editsectiononrightclick' => 'Сиэксийэ баһыгар уҥа тимэҕинэн<br />баттаан сиэксийэни көннөрүү (JavaScript)',
+'tog-editsectiononrightclick' => 'Сиэксийэ баһыгар уҥа тимэҕинэн баттаан сиэксийэни көннөрүү',
 'tog-showtoc' => 'Иһинээҕитин көрдөр (ыстатыйа үстэн ордук бас тыллаах буоллаҕына)',
 'tog-rememberpassword' => 'Миигин бу браузерга сигээ ($1 {{PLURAL:$1|күн|күнтэн ордуга суох}})',
 'tog-watchcreations' => 'Суруйбут ыстатыйаларбын уонна укпут билэлэрбин кэтээн көрүүгэ киллэрэн ис',
@@ -74,7 +74,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Сирэйи кэтээн көрөр дьон ахсаанын көрдөр',
 'tog-oldsig' => 'Баар илии баттааһын:',
 'tog-fancysig' => 'Бэйэ илии баттааһына (ыйынньыга суох)',
-'tog-uselivepreview' => 'ТÑ\83Ñ\82аÑ\82Ñ\8bна Ñ\85айдаÑ\85 Ð±Ñ\83олаÑ\80Ñ\8bн ÐºÓ©Ñ\80Ò¯Ò¯ (JavaScript, тургутуу быһыытынан)',
+'tog-uselivepreview' => 'ХайдаÑ\85 Ð±Ñ\83олÑ\83оÑ\85Ñ\82ааÒ\95Ñ\8bн Ñ\82Ñ\83Ñ\82аÑ\82Ñ\8bна Ñ\8dÑ\80дÑ\8d ÐºÓ©Ñ\80Ò¯Ò¯ (тургутуу быһыытынан)',
 'tog-forceeditsummary' => 'Тугу уларыппытым туһунан суруйбатахпына сэрэт',
 'tog-watchlisthideown' => 'Кэтээн көрүү испииһэгэр бэйэм уларытыыларбын көрдөрүмэ',
 'tog-watchlisthidebots' => 'Кэтээн көрүү испииһэгэр робот уларытыытын көрдөрүмэ',
@@ -87,6 +87,7 @@ $messages = array(
 'tog-showhiddencats' => 'Кистэммит категориялары көрдөр',
 'tog-norollbackdiff' => 'Төннөрүү кэнниттэн барыллар уратыларын көрдөрүмэ',
 'tog-useeditwarning' => 'Эрэдээксийэлиир сирэйтэн уларытыыларбын бигэргэппэккэ тахсаары гыннахпына сэрэтээр',
+'tog-prefershttps' => 'Манна киирэргэ куруук көмүскэллээх холбонууну туттарга',
 
 'underline-always' => 'Куруук',
 'underline-never' => 'Аннынан тардыма',
@@ -187,7 +188,7 @@ $messages = array(
 'newwindow' => '(атын түннүккэ арыллар)',
 'cancel' => 'Алҕас',
 'moredotdotdot' => 'Өссө...',
-'morenotlisted' => 'Ð\90Ñ\82Ñ\8bн Ñ\81Ñ\83оÑ\85...',
+'morenotlisted' => 'Ð\91Ñ\83 Ñ\82иһик Ñ\82олоÑ\80Ñ\83Ñ\82а Ñ\81Ñ\83оÑ\85.',
 'mypage' => 'Сирэй',
 'mytalk' => 'Кэпсэтэр сирим',
 'anontalk' => 'Бу IP-га ырытыы',
@@ -371,6 +372,11 @@ $1',
 # General errors
 'error' => 'Алҕас',
 'databaseerror' => 'Билии олоҕор сыыһа',
+'databaseerror-text' => 'Билии олоҕор алҕас таҕыста.
+Бырагыраамма алҕаһа буолуон сөп.',
+'databaseerror-textcl' => 'Билии олоҕор алҕас таҕыста.',
+'databaseerror-query' => 'Ыйытык: $1',
+'databaseerror-error' => 'Алҕас: $1',
 'laggedslavemode' => 'Болҕой: Бу сирэй бүтэһик уларытыылара суох буолуон сөп',
 'readonly' => 'Билии олоҕун уларытар бобуллубут',
 'enterlockreason' => 'Уларытыыны бобуу төрүөтүн уонна төһө өр бобулларын ый.',
@@ -451,8 +457,6 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Эн тиһиликтэн таҕыстыҥ.'''
 
-{{SITENAME}} ситим-сиргэ билигин урукку ааккынан буолбакка IP-аадырыһынан эрэ көстөҕүн.
-Салгыы ааккын ааттаабакка үлэлиэххин сөп, эбэтэр саҥаттан урукку ааккынан дуу, атын аатынан дуу <span class='plainlinks'>[$1 киириэххин]</span> сөп.
 Сорох сирэйдэр өссө даҕаны эйигин урукку ааккынан көрдөрүөхтэрин сөп, ону суох гыныаххын баҕардаххына интэриниэт көрдөрөөччүҥ кээһин ыраастаа.",
 'welcomeuser' => 'Нөрүөн нөргүй, $1!',
 'welcomecreation-msg' => 'Аатыҥ бэлиэтэннэ.
@@ -499,7 +503,7 @@ $2',
 'createacct-emailoptional' => 'Email аадырыс (булгуччута суох)',
 'createacct-email-ph' => 'Эл аадырыскын суруй',
 'createacct-another-email-ph' => 'Эл. почтаҕын киллэр',
-'createaccountmail' => 'Быстах киирии тылы туһаныы уонна ону email-ынан ыытыы',
+'createaccountmail' => 'Быстах киирии тылы туһаныы уонна ону ыйыллыбыт аадырыска ыытыы',
 'createacct-realname' => 'Дьиҥнээх аатыҥ (булгуччута суох)',
 'createaccountreason' => 'Төрүөтэ:',
 'createacct-reason' => 'Төрүөтэ',
@@ -576,11 +580,13 @@ $2',
 
 Саҥа аат сыыһа оҥоһуллубут буоллаҕына тугу да гыныа суоххун сөп.',
 'usernamehasherror' => 'Аакка эрэһиэккэ бэлиэтин туттар сатаммат',
-'login-throttled' => 'Ð\9dаһаа Ñ\8dлбÑ\8dÑ\85Ñ\82ик Ð±Ñ\8dйÑ\8dÒ¥ Ð°Ð°ÐºÐºÑ\8bн билиһиннэрэ сатаатыҥ.
-Бука диэн кыратык тохтуу түһэн баран өссө боруобалаа.',
+'login-throttled' => 'Ð\90аккÑ\8bн Ð°Ò»Ð°Ñ\80а Ñ\8dлбÑ\8dÑ\85Ñ\82ик билиһиннэрэ сатаатыҥ.
+Бука диэн $1 буолан баран өссө киирэн көрөөр.',
 'login-abort-generic' => 'Бу аатынан сатаан киирбэтиҥ - быстан хаалла',
 'loginlanguagelabel' => 'Омугун тыла: $1',
 'suspicious-userlogout' => 'Сеансы түмүктүүр ыйытыгыҥ ылыныллыбата, тоҕо диэтэххэ браузер эбэтэр кээштыыр прокси алҕас ыыппыт ыйытыктарыгар майгынныыр.',
+'createacct-another-realname-tip' => 'Дьиҥнээх аатыҥ булгуччута суох.
+Ыйдаххына уларыппыт сирэйиҥ устуоруйатыгар көстөр буолуоҕа.',
 
 # Email sending
 'php-mail-error-unknown' => 'mail() PHP-функциятыгар туох эрэ алҕас тахсыбыт',
@@ -596,8 +602,7 @@ $2',
 'newpassword' => 'Саҥа киирии тыл:',
 'retypenew' => 'Саҥа киирии тылы хатылаа:',
 'resetpass_submit' => 'Киирии тылы уларыт уонна киир',
-'changepassword-success' => 'Your password has been changed successfully! Now logging you in...
-Киирии тылыҥ этэҥҥэ уларыйда. Сотору кэминэн киириэҥ...',
+'changepassword-success' => 'Киирии тылыҥ этэҥҥэ уларыйда!',
 'resetpass_forbidden' => 'Киирии тылы уларытар сатаммат',
 'resetpass-no-info' => 'Ааккын билиһиннэрдэххинэ эрэ бу сирэйгэ быһа тиийиэххин сөп.',
 'resetpass-submit-loggedin' => 'Киирии тылы уларытыы',
@@ -658,6 +663,11 @@ $2
 'changeemail-submit' => 'Аадырыһы уларыт',
 'changeemail-cancel' => 'Тохтот',
 
+# Special:ResetTokens
+'resettokens' => 'Токеннары бырах',
+'resettokens-legend' => 'Токеннары бырах',
+'resettokens-tokens' => 'Токеннар:',
+
 # Edit page toolbar
 'bold_sample' => 'Модьу бичик',
 'bold_tip' => 'Модьу бичик',
@@ -735,7 +745,6 @@ IP-аадырыһыҥ $3, бобуу нүөмэрэ — #$5.
 'loginreqpagetext' => 'Атын сирэйдэри көрөргө маны оҥоруохтааххын: $1.',
 'accmailtitle' => 'Киирии тыл ыытылынна.',
 'accmailtext' => "[[User talk:$1|$1]] кыттааччыга түбэспиччэ бэлиэлэртэн оҥоһуллубут киирии тыл бу аадырыска $2 ыытылынна.
-
 Тиһиккэ бэлиэтэнэн баран киирии тылгын ''[[Special:ChangePassword|уларытыаххын]]'' сөп.",
 'newarticle' => '(Саҥа ыстатыйа)',
 'newarticletext' => 'Эн суох сирэйгэ киирэ сатаатыҥ.
@@ -1179,7 +1188,7 @@ $1",
 'prefs-rendering' => 'Тас көрүҥэ',
 'saveprefs' => 'Бигэргэт',
 'resetprefs' => 'Бигэргэтиллибэтэх уларыйыылары сот',
-'restoreprefs' => 'Туруоруулары саҥаттан',
+'restoreprefs' => 'Туруоруулары саҥаттан (салааларга барыларыгар)',
 'prefs-editing' => 'Уларытыы',
 'rows' => 'Строкаалара:',
 'columns' => 'Колонкалара:',
@@ -1236,9 +1245,9 @@ $1",
 'badsig' => 'Сыыһа илии баттааһын; HTML тиэгтэрин көр.',
 'badsiglength' => 'Наһаа уһун илии баттааһын.
 $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}} ордук буолуо суохтаах.',
-'yourgender' => 'ЭÑ\80 ÐºÐ¸Ò»Ð¸Ñ\82Ñ\8d/дÑ\8cаÑ\85Ñ\82аÑ\80а:',
-'gender-unknown' => 'Ыйыллыбатах',
-'gender-male' => 'ЭÑ\80 ÐºÐ¸Ò»Ð¸',
+'yourgender' => 'ХайаÑ\82а Ð­Ð¹Ð¸Ñ\8dÑ\85Ñ\8d Ñ\81өп Ñ\82үбÑ\8dÒ»Ñ\8dÑ\80ий?',
+'gender-unknown' => 'Ыйбат инибин',
+'gender-male' => 'Ð\9aини Ð±Ð¸Ð¸ÐºÐ¸ Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80и Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80',
 'gender-female' => 'Дьахтар',
 'prefs-help-gender' => 'Булгуччута суох. Бырагыраамма сорох дьоҥҥо туһаайыллыбыт биллэриилэригэр эбэтэр кинилэргэ сыһыаннаах этиилэригэр кытааччы дьахтарыттан эр киһититтэн көрөн этии тутулун уларытан биэриэн сөп. Туора дьоҥҥо көстөр бэлиэтээһин.',
 'email' => 'Почта',
@@ -1251,7 +1260,7 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 'prefs-signature' => 'Илии баттааһына',
 'prefs-dateformat' => 'Күн-дьыл көрүҥэ (формаата)',
 'prefs-timeoffset' => 'Кэм уратыта',
-'prefs-advancedediting' => 'Сүрүн (барытыгар сыһыаннаах)',
+'prefs-advancedediting' => 'Сүрүн туруоруулар',
 'prefs-editor' => 'Эрэдээктэр',
 'prefs-preview' => 'Инники көрүү',
 'prefs-advancedrc' => 'Дириҥэтиллибит туруоруулар',
@@ -1262,6 +1271,7 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 'prefs-displaysearchoptions' => 'Көстүүтүн туруоруулара',
 'prefs-displaywatchlist' => 'Көстүүтүн туруоруулара',
 'prefs-diffs' => 'Уратылара',
+'prefs-help-prefershttps' => 'Аныгыскы киириигэр үлэлиир буолуо.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Сөп курдук көстөр',
@@ -1285,7 +1295,7 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 'userrights-no-interwiki' => 'Атын биикилэргэ кыттааччылар бырааптарын уларытар быраабыҥ суох.',
 'userrights-nodatabase' => '$1 билэ тиһигэ (олоҕо, база данных) суох эбэтэр локальнай буолбатах.',
 'userrights-nologin' => 'Эн дьон бырааптарын уларытаргар администратор быһыытынан [[Special:UserLogin|бэлиэтэниэхтээххин]].',
-'userrights-notallowed' => 'Ð\91Ñ\8dлиÑ\8dÑ\82Ñ\8dммиÑ\82 Ð°Ð°ÐºÐºÑ\8bнан Ð°Ñ\82Ñ\8bн ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b Ð±Ñ\8bÑ\80аабÑ\8bн уларытар кыаҕыҥ суох эбит.',
+'userrights-notallowed' => 'Ð\90Ñ\82Ñ\8bн ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b Ð±Ñ\8bÑ\80аабÑ\8bн Ñ\8dбÑ\8dÑ\80 Ñ\83онна уларытар кыаҕыҥ суох эбит.',
 'userrights-changeable-col' => 'Эн уларытар кыахтаах бөлөхтөрүҥ',
 'userrights-unchangeable-col' => 'Бу бөлөхтөрү уларытар кыаҕыҥ суох',
 'userrights-conflict' => 'Кыттааччы быраабын быһаарарга алҕас таҕыста! Хатылаан көр.',
@@ -1353,7 +1363,7 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 'right-hideuser' => 'Кыттааччы аатын бобуу уонна кистээһин',
 'right-ipblock-exempt' => 'IP хааччахтааһынын, аптамаатынан уонна диапазоннары хааччахтааһыны тумнуу',
 'right-proxyunbannable' => 'Прокси аптааматынан хааччахтааһынын тумнуу',
-'right-unblockself' => 'хааччаҕы бэйэ устуута',
+'right-unblockself' => 'Хааччаҕы бэйэ устуута',
 'right-protect' => 'Сирэйдэр көмүскэллэрин таһымын уонна каскаадынан көмүскэммит сирэйдэри уларытыы',
 'right-editprotected' => 'Уларытыллар сирэйдэр "{{int:protect-level-sysop}}" таһымынан көмүскэммиттэр',
 'right-editsemiprotected' => 'Уларытыллар сирэйдэр "{{int:protect-level-autoconfirmed}}" таһымынан көмүскэммиттэр',
@@ -1436,6 +1446,7 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|уларытыы|уларытыылар}}',
+'enhancedrc-history' => 'устуоруйата',
 'recentchanges' => 'Кэнники уларытыылар',
 'recentchanges-legend' => 'Кэлиҥҥи уларытыылар хайдах көстөллөрүн туруоруу',
 'recentchanges-summary' => 'Манна хаһан оҥоһуллубуттарынан сааһыланан {{SITENAME}} кэнники уларыытыылара көстөллөр.',
@@ -1467,7 +1478,7 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 'rc_categories_any' => 'Ханнык баҕарар',
 'rc-change-size-new' => 'Уларытыы кээмэйэ: $1 баайт',
 'newsectionsummary' => '/* $1 */ саҥа сиэксийэ',
-'rc-enhanced-expand' => 'Сиһилии көрдөр (JavaScript туһаныллар)',
+'rc-enhanced-expand' => 'Сиһилии көрдөр',
 'rc-enhanced-hide' => 'Сиһилиитин көрдөрүмэ',
 'rc-old-title' => 'бастаан бу аатынан суруллубут "$1"',
 
@@ -1730,8 +1741,7 @@ $1',
 'upload_source_file' => ' (билэ көмпүүтэргэр баар)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Бу анал сирэй киллэриллибит билэлэри барытын көрдөрөр.
-Киллэрээччинэн наардаатахха киллэрээччи бүтэһик көннөрүүтэ эрэ көстүөҕэ.',
+'listfiles-summary' => 'Бу анал сирэй киллэриллибит билэлэри барытын көрдөрөр.',
 'listfiles_search_for' => 'Миэдьийэни (ойууну) аатынан көрдөтүү:',
 'imgfile' => 'билэ',
 'listfiles' => 'Билэлэр',
@@ -1742,6 +1752,9 @@ $1',
 'listfiles_size' => 'Кээмэйэ',
 'listfiles_description' => 'Быһаарыыта',
 'listfiles_count' => 'Барыллар',
+'listfiles-latestversion' => 'Билиҥҥи барыла',
+'listfiles-latestversion-yes' => 'Сөп',
+'listfiles-latestversion-no' => 'Суох',
 
 # File description page
 'file-anchor-link' => 'Билэ',
@@ -1874,8 +1887,8 @@ $1',
 'pageswithprop-text' => 'Манна сорох туруоруулара уларытыллыбыт сирэйдэр көстүбүттэр.',
 'pageswithprop-prop' => 'Туруоруу аата:',
 'pageswithprop-submit' => 'Толор',
-'pageswithprop-prophidden-long' => 'уһун тиэкис кистэммит ($1 килобайт)',
-'pageswithprop-prophidden-binary' => 'бинаар суолта кистэммит ($1 килобайт)',
+'pageswithprop-prophidden-long' => 'уһун тиэкис кистэммит ($1)',
+'pageswithprop-prophidden-binary' => 'бинаар суолта кистэммит ($1)',
 
 'doubleredirects' => 'Хос көһөрөөһүн',
 'doubleredirectstext' => 'Бу сирэйгэ атын сиргэ утаарар хос утаарыылар тиһиктэрэ көстөр.
@@ -2030,7 +2043,7 @@ $1',
 'linksearch-ok' => 'Бул',
 'linksearch-text' => 'Туруоран биэрэр бэлиэлэри туһаныахха сөп, холобур,  <code>*.wikipedia.org</code>.
 Үрдүкү таһымнаах домен буолуохтаах, холобур <code>*.org</code>.<br />
-Өйөнөр боротокуоллар: <code>$1</code> (көрдүүргэр ханнык да боротокуолу талбатаххына http:// туруоруллуо)',
+Өйөнөр {{PLURAL:$2|боротокуол|боротокуоллар}}: <code>$1</code> (көрдүүргэр ханнык да боротокуолу талбатаххына http:// туруоруллуо)',
 'linksearch-line' => 'Мантан $2 манна $1 ыйынньык',
 'linksearch-error' => 'Туруоран биэрэр бэлиэлэри аадырыс/hostname саҕаланыытыгар эрэ туттуохха сөп.',
 
@@ -2157,30 +2170,31 @@ $1',
 'enotif_lastvisited' => 'Бутэһик киирииҥ кэнниттэн оҥоһуллубут уларыйыылары барытын көрөргө манна киир: $1.',
 'enotif_lastdiff' => 'Уларытыыны манна көрүҥ: $1.',
 'enotif_anon_editor' => 'ааттамматах кыттааччы $1',
-'enotif_body' => 'Ð\9aүндү $WATCHINGUSERNAME,
+'enotif_body' => 'Ð\90лама ÐºÒ¯Ð½ Ñ\81Ñ\8bÑ\80дÑ\8bгÑ\8bнан, $WATCHINGUSERNAME!
 
-«{{SITENAME}}» $PAGETITLE кыттаачыга сыһыаннаах сирэйи $PAGEEDITDATE $PAGEEDITOR кыттааччы $CHANGEDORCREATED. Сирэй билиҥҥи туругун манна көр: $PAGETITLE_URL.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Уларытыы кылгас ис хоһооно: $PAGESUMMARY $PAGEMINOREDIT
 
-Уларыппыт киһи:
\8dл. Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»а: $PAGEEDITOR_EMAIL
\91иикигÑ\8d Ñ\81иÑ\80Ñ\8dйÑ\8d: $PAGEEDITOR_WIKI
+Уларыппыт киһиэхэ суруйуоххун сөп:
\8dл. Ð¿Ð¾Ñ\87Ñ\82а: $PAGEEDITOR_EMAIL
±Ð¸Ð¸ÐºÐ¸: $PAGEEDITOR_WIKI
 
-Бу сирэйи көрө иликкинэ хос биллэрии кэлиэ суоҕа. Арай кэтэбили туруорар сиргэ "уларытыыны биллэрэргэ" диэни иккистээн туруордаххына кэлиэн сөп.
+Бу сирэйи көрбөтөххүнэ биллэриилэр уонна кэлиэхтэрэ суоҕа. Биллэриилэри аналлаах сирэйгэ арааран кэбиһиэххин эмиэ сөп.
 
-         Бары үтүөнү кытта, {{SITENAME}} биллэрэр систиэмэтэ
+             Бары үтүөнү кытта, {{SITENAME}} биллэрэр тиһигэ
 
 --
-Кэтиир сирэйдэриҥ тиһигин уларытарга маны көр:
+Биллэрии кэлэрин салайыы
+{{canonicalurl:{{#special:Preferences}}}}
+
+Кэтиир тиһиги уларытыы
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
\91Ñ\83 Ñ\81иÑ\80Ñ\8dйи ÐºÑ\8dÑ\82Ñ\8dбил Ñ\82иһигиÑ\82Ñ\82Ñ\8dн Ñ\81оÑ\82оÑ\80го Ð¼Ð°Ð½Ð½Ð° ÐºÐ¸Ð¸Ñ\80:
\9aÑ\8dÑ\82ииÑ\80 Ñ\82иһикÑ\82Ñ\8dн Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80и Ñ\81оÑ\82Ñ\83Ñ\83
 $UNWATCHURL
 
-Көмөлөһүннэрэр уонна быһаартарар сир:
+Көмө
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 'created' => 'айыллыбыт',
 'changed' => 'уларыппыт (уларытыллыбыт)',
index 209b90c..51ba6e0 100644 (file)
@@ -195,10 +195,11 @@ $messages = array(
 'tog-showhiddencats' => 'Ammustra li catigurìi ammucciati.',
 'tog-norollbackdiff' => "Umettiri li ''diff'' doppu aviri fattu nu ''rollback''",
 'tog-useeditwarning' => 'Avvisa quannu si lasaa na paggina di canci cu canci nu sarbati',
+'tog-prefershttps' => 'Usa sempri na cunnissioni sicura quannu trasi',
 
 'underline-always' => 'sempri',
 'underline-never' => 'mai',
-'underline-default' => 'manteni li mpustazzioni dû browser',
+'underline-default' => 'manteni li mpustazzioni dû browser o dû tema',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Stili da casedda di canciamentu:',
@@ -295,7 +296,7 @@ $messages = array(
 'newwindow' => '(grapi na finestra nova)',
 'cancel' => 'annulla',
 'moredotdotdot' => 'Àutru...',
-'morenotlisted' => 'cchiossai non ntâ lista',
+'morenotlisted' => 'Sta lista è ncumpreta',
 'mypage' => 'Pàggina',
 'mytalk' => 'la mè pàggina di discussioni',
 'anontalk' => 'Discussione pi stu IP',
index 1f90791..26d4ce5 100644 (file)
@@ -201,8 +201,8 @@ $messages = array(
 'tog-extendwatchlist' => 'මෑත වෙනස්වීම් පමණක් නොව, අදාළ සියළු වෙනස්වීම් දක්වා පෙන්වන අයුරින් මුර-ලැයිස්තුව පුළුල් කරන්න',
 'tog-usenewrc' => 'මෑත වෙනස්වීම් සහ මුර ලැයිස්තුව හී පිටුව අනුව සමූහ වෙනස්වීම් (ජාවාස්ක්‍රිප්ට් ඇවැසිය)',
 'tog-numberheadings' => 'ශීර්ෂ-නාම ස්වයංක්‍රීයව අංකනය කරන්න',
-'tog-showtoolbar' => 'සංස්කරණ මෙවලම්තීරුව පෙන්වන්න (ජාවාස්ක්‍රිප්ට්)',
-'tog-editondblclick' => 'ද්විත්ව-ක්ලික් කිරීම මගින් පිටු සංස්කරණය අරඹන්න (ජාවාස්ක්‍රිප්ට්)',
+'tog-showtoolbar' => 'සංස්කරණ මෙවලම්තීරුව පෙන්වන්න',
+'tog-editondblclick' => 'ද්විත්ව-ක්ලික් කිරීම මගින් පිටු සංස්කරණය අරඹන්න',
 'tog-editsection' => '[සංස්කරණ] සබැඳියාවන් මගින් ඡේද සංස්කරණය සක්‍රීය කරන්න',
 'tog-editsectiononrightclick' => 'ඡේද ශීර්ෂ මත දකුණු-ක්ලික් කිරීමෙන් ඡේද සංස්කරණය සක්‍රීය කරන්න (ජාවාස්ක්‍රිප්ට්)',
 'tog-showtoc' => 'පටුන පෙන්වන්න ( තුනකට වඩා වැඩියෙන් ශීර්ෂ-නාම අඩංගු පිටු සඳහා)',
@@ -971,7 +971,7 @@ $2
 'nocreate-loggedin' => '{{SITENAME}} හි නව පිටු තැනීමට අවසරයක් ඔබ හට ප්‍රදානය කොට නොමැත.',
 'sectioneditnotsupported-title' => 'කොටසක් සංස්කරණය කිරීම සඳහා සහාය නොදක්වයි',
 'sectioneditnotsupported-text' => 'මෙම පිටුවේදී කොටසක් සංස්කරණය කිරීම සඳහා සහාය නොදක්වයි',
-'permissionserrors' => 'à¶\85à·\80à·\83රයනà·\8a à¶´à·\92à·\85à·\92බඳ à¶¯à·\9dà·\82යනà·\8a à¶´à·\80තà·\93',
+'permissionserrors' => 'à¶\85à·\80à·\83රදà·\93මà·\9a à¶¯à·\9dà·\82යà¶\9aà·\92',
 'permissionserrorstext' => 'පහත දැක්වෙන {{PLURAL:$1|හේතුව|හේතූන්}} නිසා, ඔබ හට එය සිදුකිරීමට අවසර ලබා දීමට නොහැක:',
 'permissionserrorstext-withaction' => 'පහත {{PLURAL:$1|හේතුව|හේතු}} නිසා, ඔබ හට $2 සඳහා අවසර නොමැත:',
 'recreate-moveddeleted-warn' => "'''අවවාදයයි: පෙරදී මකාදැමුණු පිටුවක් ඔබ විසින් යළි-තනමින් පවතියි.'''
@@ -1372,7 +1372,7 @@ HTML ටැගයන් පිරික්සන්න.',
 'prefs-signature' => 'අත්සන',
 'prefs-dateformat' => 'දින ආකෘතිය',
 'prefs-timeoffset' => 'වේලා හිලව්ව',
-'prefs-advancedediting' => 'à·\83à·\8fමà·\8fනà·\8aâ\80\8dය',
+'prefs-advancedediting' => 'පà·\8aâ\80\8dරධà·\8fන à·\80à·\92à¶\9aලà·\8aපයනà·\8a',
 'prefs-advancedrc' => 'වැඩිදුර සැකසුම් තෝරාගැනීම',
 'prefs-advancedrendering' => 'වැඩිදුර සැකසුම් තෝරාගැනීම',
 'prefs-advancedsearchoptions' => 'ප්‍රගත විකල්පයන්',
index 797b070..703abf7 100644 (file)
@@ -1696,7 +1696,7 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 'rc_categories_any' => 'akékoľvek',
 'rc-change-size-new' => '$1 {{PLURAL:$1|bajt|bajty|bajtov}} po zmene',
 'newsectionsummary' => '/* $1 */ nová sekcia',
-'rc-enhanced-expand' => 'Zobraziť podrobnosti (vyžaduje JavaScript)',
+'rc-enhanced-expand' => 'Zobraziť podrobnosti',
 'rc-enhanced-hide' => 'Skryť podrobnosti',
 'rc-old-title' => 'pôvodne vytvorené ako "$1"',
 
index 168f14e..56c3537 100644 (file)
@@ -584,7 +584,7 @@ Spremembe te strani bodo vplivale na podobo uporabniškega vmesnika ostalih upor
 Za dodajanje ali spreminjanje prevodov vseh wikijev uporabite [//translatewiki.net/ translatewiki.net], projekt za lokalizacijo MediaWiki.",
 'cascadeprotected' => 'Ta stran je bila zaščitena pred urejanji, ker je vključena na {{PLURAL:$1|sledečo stran, ki je bila zaščitena|sledeči strani, ki sta bili zaščiteni|sledeče strani, ki so bile zaščitene}} z vključeno kaskadno možnostjo:
 $2',
-'namespaceprotected' => "Nimate dovoljenja urejati strani v imenskem prostoru '''$1'''.",
+'namespaceprotected' => "Za urejanje strani v imenskem prostoru '''$1''' nimate dovoljenja.",
 'customcssprotected' => 'Nimate pravice urejati te strani CSS, ker vsebuje osebne nastavitve drugega uporabnika.',
 'customjsprotected' => 'Nimate pravice urejati te strani JavaScript, ker vsebuje osebne nastavitve drugega uporabnika.',
 'mycustomcssprotected' => 'Nimate pravic za urejanje te strani s CSS.',
@@ -643,7 +643,7 @@ Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rod
 'userlogin-joinproject' => 'Pridružite se {{GRAMMAR:dajalnik|{{SITENAME}}}}',
 'nologin' => 'Še nimate uporabniškega računa? $1!',
 'nologinlink' => 'Registrirajte se',
-'createaccount' => 'Ustvari račun',
+'createaccount' => 'Registracija',
 'gotaccount' => 'Račun že imate? $1.',
 'gotaccountlink' => 'Prijavite se',
 'userlogin-resetlink' => 'Ste pozabili svoje prijavne podatke?',
@@ -1013,12 +1013,12 @@ Za sklic je priskrbljen spodnji dnevnik vnosov:",
 'edittools' => '<!-- To besedilo bo prikazano pod urejevalnim poljem in poljem za nalaganje. -->',
 'nocreatetext' => '{{SITENAME}} ima omejeno zmožnost za ustvarjanje novih strani.
 Lahko se vrnete nazaj in urejate že obstoječe strani, ali pa se [[Special:UserLogin|prijavite ali ustvarite račun]].',
-'nocreate-loggedin' => 'Nimate pravic, da bi ustvarjali nove strani.',
+'nocreate-loggedin' => 'Za ustvarjanje novih strani nimate dovoljenja.',
 'sectioneditnotsupported-title' => 'Urejanje razdelkov ni podprto',
 'sectioneditnotsupported-text' => 'Urejanje razdelkov ni podprto na tej strani.',
 'permissionserrors' => 'Napaka dovoljenja',
-'permissionserrorstext' => 'Nimate dovoljenja za izvedbo dejanja zaradi {{PLURAL:$1|naslednjega razloga|naslednjih razlogov|naslednjih razlogov|naslednjih razlogov|naslednjih razlogov}}:',
-'permissionserrorstext-withaction' => 'Nimate dovoljenja za $2 zaradi {{PLURAL:$1|naslednjega razloga|naslednjih $1 razlogov|naslednjih $1 razlogov|naslednjih $1 razlogov}}:',
+'permissionserrorstext' => 'Za izvedbo dejanja nimate dovoljenja zaradi {{PLURAL:$1|naslednjega razloga|naslednjih razlogov|naslednjih razlogov|naslednjih razlogov|naslednjih razlogov}}:',
+'permissionserrorstext-withaction' => 'Za $2 zaradi {{PLURAL:$1|naslednjega razloga|naslednjih $1 razlogov|naslednjih $1 razlogov|naslednjih $1 razlogov}} nimate dovoljenja:',
 'recreate-moveddeleted-warn' => "'''Opozorilo: Pišete stran, ki je bila nekoč že izbrisana.'''
 
 Premislite preden nadaljujete s pisanjem, morda bo stran zaradi istih razlogov ponovno odstranjena.
@@ -1467,10 +1467,10 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 * Odkljukano polje pomeni uporabnika, ki ni v skupini
 * Zvezdica (*) kaže, da uporabnika ne boste mogli odstraniti iz skupine, ko ga vanjo dodate oz. obratno.',
 'userrights-reason' => 'Razlog:',
-'userrights-no-interwiki' => 'Nimate dovoljenja za urejanje pravic uporabnikov na drugih wikijih.',
+'userrights-no-interwiki' => 'Za urejanje pravic uporabnikov na drugih wikijih nimate dovoljenja.',
 'userrights-nodatabase' => 'Podatkovna baza $1 ne obstaja ali ni lokalna.',
 'userrights-nologin' => 'Za dodeljevanje uporabniških pravic se morate [[Special:UserLogin|prijaviti]] s skrbniškim računom.',
-'userrights-notallowed' => 'Nimate dovoljenj za dodajanje ali odstranjevanje uporabniških pravic.',
+'userrights-notallowed' => 'Za dodajanje ali odstranjevanje uporabniških pravic nimate dovoljenja.',
 'userrights-changeable-col' => 'Skupine, ki jih lahko spremenite',
 'userrights-unchangeable-col' => 'Skupine, ki jih ne morete spremeniti',
 'userrights-conflict' => 'Spor sprememb uporabniških pravic! Prosimo, da pregledate in potrdite svoje spremembe.',
@@ -2812,7 +2812,7 @@ prosimo, pred nadaljevanjem se prepričajte, da razumete posledice tega dejanja.
 'moveuserpage-warning' => "'''Opozorilo:''' Premikate uporabniško stran. To pomeni, da bo premaknjena samo stran in uporabnik ''ne'' bo preimenovan.",
 'movenologin' => 'Niste prijavljeni',
 'movenologintext' => 'Za prestavljanje strani morate biti registrirani in [[Special:UserLogin|prijavljeni]].',
-'movenotallowed' => 'Nimate dovoljenja, da premikate strani.',
+'movenotallowed' => 'Za prestavljanje strani nimate dovoljenja.',
 'movenotallowedfile' => 'Nimate dovoljenja, da premikate datoteke.',
 'cant-move-user-page' => 'Nimate dovoljenja, da premikate uporabniške strani (razen podstrani).',
 'cant-move-to-user-page' => 'Nimate dovoljenja, da premikate strani na uporabniške strani (razen na uporabniške podstrani).',
@@ -3810,7 +3810,7 @@ Poskusite normalni predogled.',
 Da odstranite stran, označite kvadratek poleg nje in kliknite »{{int:Watchlistedit-normal-submit}}«.
 Lahko tudi [[Special:EditWatchlist/raw|uredite gol spisek]].',
 'watchlistedit-normal-submit' => 'Odstrani strani',
-'watchlistedit-normal-done' => 'Iz vašega spiska nadzorov {{PLURAL:$1|je bila odstranjena $1 stran|sta bili odstranjeni $1 strani|so bile odstranjene $1 strani|je bilo odstranjenih $1 strani}}:',
+'watchlistedit-normal-done' => 'Z vašega spiska nadzorov {{PLURAL:$1|je bila odstranjena $1 stran|sta bili odstranjeni $1 strani|so bile odstranjene $1 strani|je bilo odstranjenih $1 strani}}:',
 'watchlistedit-raw-title' => 'Uredi gol spisek nadzorov',
 'watchlistedit-raw-legend' => 'Uredi gol spisek nadzorov',
 'watchlistedit-raw-explain' => 'Strani na vašem spisku nadzorov so prikazane spodaj in jih lahko urejate z dodajanjem in odstranjevanjem s seznama; vsak naslov je v svoji vrstici.
@@ -4029,7 +4029,7 @@ V nasprotnem primeru lahko uporabite preprost obrazec spodaj. Vašo pripombo bom
 'feedback-error2' => 'Napaka: Urejanje je spodletelo',
 'feedback-error3' => 'Napaka: Ni odgovora od API',
 'feedback-thanks' => 'Havala! Vaše povratne informacije smo objavili na strani »[$2 $1]«.',
-'feedback-close' => 'Končano',
+'feedback-close' => 'Urejeno',
 'feedback-bugcheck' => 'Izvrstno! Samo preverite, da ne gre za enega od [$1 že znanih hroščev].',
 'feedback-bugnew' => 'Sem preveril. Prijavi nov hrošč',
 
index 26803b5..6d48fdc 100644 (file)
@@ -403,12 +403,12 @@ $messages = array(
 'tog-hidepatrolled' => 'Сакриј прегледане измене у списку скорашњих измена',
 'tog-newpageshidepatrolled' => 'Сакриј прегледане странице са списка нових страница',
 'tog-extendwatchlist' => 'Прошири списак надгледања за приказ свих измена, не само скорашњих',
-'tog-usenewrc' => 'Промене у групи по страници у списку скорашњих измена и надгледаних страница (потребна JavaScript-а)',
+'tog-usenewrc' => 'Промене у групи по страници у списку скорашњих измена и надгледаних страница',
 'tog-numberheadings' => 'Самостално нумериши поднаслове',
-'tog-showtoolbar' => 'ТÑ\80ака Ñ\81 Ð°Ð»Ð°Ñ\82кама Ð·Ð° Ñ\83Ñ\80еÑ\92иваÑ\9aе (поÑ\82Ñ\80ебна JavaScript-а)',
-'tog-editondblclick' => 'Уређивање страница двоструким кликом (потребна JavaScript-а)',
+'tog-showtoolbar' => 'Ð\9fÑ\80икажи Ñ\82Ñ\80акÑ\83 Ñ\81 Ð°Ð»Ð°Ñ\82кама Ð·Ð° Ñ\83Ñ\80еÑ\92иваÑ\9aе',
+'tog-editondblclick' => 'Уређивање страница двоструким кликом',
 'tog-editsection' => 'Везе за уређивање појединачних одељака',
-'tog-editsectiononrightclick' => 'Уређивање одељака десним кликом на њихове наслове (потребна JavaScript-а)',
+'tog-editsectiononrightclick' => 'Уређивање одељака десним кликом на њихове наслове',
 'tog-showtoc' => 'Прикажи садржај страница које имају више од три поднаслова',
 'tog-rememberpassword' => 'Запамти ме на овом прегледачу (најдуже $1 {{PLURAL:$1|дан|дана|дана}})',
 'tog-watchcreations' => 'Додај странице које направим и датотеке које пошаљем у списак надгледања',
@@ -426,8 +426,8 @@ $messages = array(
 'tog-shownumberswatching' => 'Прикажи број корисника који надгледају',
 'tog-oldsig' => 'Текући потпис:',
 'tog-fancysig' => 'Сматрај потпис као викитекст (без самоповезивања)',
-'tog-uselivepreview' => 'Ð\9aоÑ\80иÑ\81Ñ\82и Ñ\82Ñ\80енÑ\83Ñ\82ан Ð¿Ñ\80еглед (поÑ\82Ñ\80ебна JavaScript-а, ÐµÐºÑ\81пеÑ\80именÑ\82ално)',
-'tog-forceeditsummary' => 'Ð\9eпомени Ð¼Ðµ Ð¿Ñ\80и Ñ\83ноÑ\81Ñ\83 Ð¿Ñ\80азног Ð¾Ð¿Ð¸Ñ\81а',
+'tog-uselivepreview' => 'Користи тренутан преглед (експериментално)',
+'tog-forceeditsummary' => 'УпозоÑ\80и Ð¼Ðµ ÐºÐ°Ð´Ð° Ð½Ðµ Ñ\83неÑ\81ем Ð¾Ð¿Ð¸Ñ\81 Ð¸Ð·Ð¼ÐµÐ½Ðµ',
 'tog-watchlisthideown' => 'Сакриј моје измене са списка надгледања',
 'tog-watchlisthidebots' => 'Сакриј измене ботова са списка надгледања',
 'tog-watchlisthideminor' => 'Сакриј мање измене са списка надгледања',
@@ -522,7 +522,7 @@ $messages = array(
 'category_header' => 'Странице у категорији „$1“',
 'subcategories' => 'Поткатегорије',
 'category-media-header' => 'Датотеке у категорији „$1“',
-'category-empty' => "''Ова категорија тренутно не садржи странице или датотеке.''",
+'category-empty' => "<div style=\"margin:2em 1em 0 1em; padding:0.5em; border:1px solid #AAA; text-align:center;\">''Ова категорија тренутно не садржи странице или датотеке.''</div>",
 'hidden-categories' => '{{PLURAL:$1|Сакривена категорија|Сакривене категорије}}',
 'hidden-category-category' => 'Сакривене категорије',
 'category-subcat-count' => '{{PLURAL:$2|Ова категорија садржи само следећу поткатегорију.|Ова категорија има {{PLURAL:$1|следећу поткатегорију|следеће $1 поткатегорије|следећих $1 поткатегорија}}, од укупно $2.}}',
@@ -543,7 +543,7 @@ $messages = array(
 'newwindow' => '(отвара се у новом прозору)',
 'cancel' => 'Откажи',
 'moredotdotdot' => 'Више…',
-'morenotlisted' => 'Ð\92иÑ\88е Ð½Ð¸Ñ\98е Ð¿Ñ\80иказаноâ\80¦',
+'morenotlisted' => 'Ð\9eва Ð»Ð¸Ñ\81Ñ\82а Ð½Ð¸Ñ\98е ÐºÐ¾Ð¼Ð¿Ð»ÐµÑ\82на.',
 'mypage' => 'Страница',
 'mytalk' => 'Разговор',
 'anontalk' => 'Разговор за ову ИП адресу',
@@ -1101,9 +1101,7 @@ $2
 'loginreqlink' => 'пријављени',
 'loginreqpagetext' => 'Морате бити $1 да бисте видели друге странице.',
 'accmailtitle' => 'Лозинка је послата.',
-'accmailtext' => 'Лозинка за {{GENDER:$1|корисника|корисницу|корисника}} [[User talk:$1|$1]] је послата на $2.
-
-Након пријаве, лозинка се може променити [[Special:ChangePassword|овде]].',
+'accmailtext' => 'Лозинка за {{GENDER:$1|корисника|корисницу}} [[User talk:$1|$1]] је послата на $2. Након пријаве, лозинка се може променити [[Special:ChangePassword|овде]].',
 'newarticle' => '(нови)',
 'newarticletext' => 'Дошли сте на страницу која још не постоји.
 Да бисте је направили, почните куцати у прозор испод овог текста (погледајте [[{{MediaWiki:Helppage}}|страницу за помоћ]]).
@@ -1299,8 +1297,8 @@ $2
 '''({{int:last}})''' – разлика с претходном изменом, '''{{int:minoreditletter}}''' – мала измена",
 'history-fieldset-title' => 'Преглед историје',
 'history-show-deleted' => 'само обрисано',
-'histfirst' => 'Ð\9dајстарије',
-'histlast' => 'Ð\9dајновије',
+'histfirst' => 'најстарије',
+'histlast' => 'најновије',
 'historysize' => '({{PLURAL:$1|1 бајт|$1 бајта|$1 бајтова}})',
 'historyempty' => '(празно)',
 
@@ -1615,7 +1613,7 @@ $1",
 'badsiglength' => 'Ваш потпис је предугачак.
 Не сме бити дужи од $1 {{PLURAL:$1|знака|знака|знакова}}.',
 'yourgender' => 'Како желите да се представите?',
-'gender-unknown' => 'Ð\9dе Ð¿Ñ\80евиÑ\88е Ð´ÐµÑ\82аÑ\99но',
+'gender-unknown' => 'Ð\9dе Ð¶ÐµÐ»Ð¸Ð¼ Ð´Ð° Ñ\81е Ð¿Ñ\80едÑ\81Ñ\82авим',
 'gender-male' => 'Он уређује вики странице',
 'gender-female' => 'Она уређује вики странице',
 'prefs-help-gender' => 'Необавезно: користи се за исправно обраћање софтвера корисницима, зависно од њиховог пола.
@@ -1630,7 +1628,7 @@ $1",
 'prefs-i18n' => 'Интернационализација',
 'prefs-signature' => 'Потпис',
 'prefs-dateformat' => 'Формат датума',
-'prefs-timeoffset' => 'Ð\92Ñ\80еменÑ\81ко Ð¾Ð´Ñ\81Ñ\82Ñ\83паÑ\9aе',
+'prefs-timeoffset' => 'Ð\92Ñ\80еменÑ\81ка Ñ\80азлика',
 'prefs-advancedediting' => 'Главна подешавања',
 'prefs-editor' => 'Уређивач',
 'prefs-preview' => 'Претпреглед',
@@ -1809,6 +1807,7 @@ $1",
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|измена|измене|измена}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|измена од ваше последње посете}}',
 'enhancedrc-history' => 'историја',
 'recentchanges' => 'Скорашње измене',
 'recentchanges-legend' => 'Поставке скорашњих измена',
@@ -1952,7 +1951,7 @@ $1",
 'uploadwarning-text' => 'Измените опис датотеке и покушајте поново.',
 'savefile' => 'Сачувај датотеку',
 'uploadedimage' => '{{GENDER:|је послао|је послала|је послао}} „[[$1]]“',
-'overwroteimage' => '{{GENDER:|је послао|је послала|је послао}} ново издање „[[$1]]“',
+'overwroteimage' => '{{GENDER:|је послао|је послала}} нову верзију датотеке „[[$1]]“',
 'uploaddisabled' => 'Отпремање је онемогућено.',
 'copyuploaddisabled' => 'Слање путем URL адресе је онемогућено.',
 'uploadfromurl-queued' => 'Слање је стављено на списак чекања.',
@@ -2137,7 +2136,7 @@ $1',
 # File description page
 'file-anchor-link' => 'Датотека',
 'filehist' => 'Историја датотеке',
-'filehist-help' => 'Кликните на датум/време да видите тадашње издање датотеке.',
+'filehist-help' => 'Кликните на датум/време да видите тадашњу верзију датотеке.',
 'filehist-deleteall' => 'обриши све',
 'filehist-deleteone' => 'обриши',
 'filehist-revert' => 'врати',
@@ -3524,7 +3523,7 @@ Variants for Chinese language
 
 # Metadata
 'metadata' => 'Метаподаци',
-'metadata-help' => 'Ова датотека садржи додатне податке који вероватно долазе од дигигалних фотоапарата или скенера.
+'metadata-help' => 'Ова датотека садржи додатне податке који вероватно долазе од дигиталног фотоапарата или скенера.
 Ако је првобитно стање датотеке промењено, могуће је да неки детаљи не описују измењену датотеку.',
 'metadata-expand' => 'Прикажи детаље',
 'metadata-collapse' => 'Сакриј детаље',
@@ -4124,7 +4123,7 @@ $5
 
 # Friendlier slave lag warnings
 'lag-warn-normal' => 'Измене новије од $1 {{PLURAL:$1|секунде|секунде|секунди}} неће бити приказане.',
-'lag-warn-high' => 'Ð\97бог Ð¿Ñ\80еопÑ\82еÑ\80еÑ\9bеÑ\9aа Ð±Ð°Ð·Ðµ Ð¿Ð¾Ð´Ð°Ñ\82ака, Ð¸Ð·Ð¼ÐµÐ½Ðµ Ð½Ð¾Ð²Ð¸Ñ\98е Ð¾Ð´ $1 {{PLURAL:$1|Ñ\81екÑ\83нде|Ñ\81екÑ\83нде|Ñ\81екÑ\83нди}} неће бити приказане.',
+'lag-warn-high' => 'Ð\97бог Ð¿Ñ\80еопÑ\82еÑ\80еÑ\9bеÑ\9aа Ð±Ð°Ð·Ðµ Ð¿Ð¾Ð´Ð°Ñ\82ака, Ð¸Ð·Ð¼ÐµÐ½Ðµ Ð½Ð¾Ð²Ð¸Ñ\98е Ð¾Ð´ $1 {{PLURAL:$1|Ñ\81екÑ\83нда|Ñ\81екÑ\83нде}} неће бити приказане.',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'Ваш списак надгледања садржи {{PLURAL:$1|један наслов|$1 наслова|$1 наслова}}, без страница за разговор.',
index 71277ec..7a89772 100644 (file)
@@ -312,14 +312,14 @@ $messages = array(
 'tog-hidepatrolled' => 'Sakrij pregledane izmene u spisku skorašnjih izmena',
 'tog-newpageshidepatrolled' => 'Sakrij pregledane stranice sa spiska novih stranica',
 'tog-extendwatchlist' => 'Proširi spisak nadgledanja za prikaz svih izmena, ne samo skorašnjih',
-'tog-usenewrc' => 'Promene u grupi po stranici u spisku skorašnjih izmena i nadgledanih stranica (zahteva javaskript)',
+'tog-usenewrc' => 'Promene u grupi po stranici u spisku skorašnjih izmena i nadgledanih stranica',
 'tog-numberheadings' => 'Samostalno numeriši podnaslove',
-'tog-showtoolbar' => 'Traka s alatkama za uređivanje (javaskript)',
-'tog-editondblclick' => 'Uređivanje stranica dvostrukim klikom (potrebna JavaScript-а)',
+'tog-showtoolbar' => 'Prikaži traku s alatkama za uređivanje',
+'tog-editondblclick' => 'Uređivanje stranica dvostrukim klikom',
 'tog-editsection' => 'Veze za uređivanje pojedinačnih odeljaka',
-'tog-editsectiononrightclick' => 'Uređivanje odeljaka desnim klikom na njihove naslove (javaskript)',
+'tog-editsectiononrightclick' => 'Uređivanje odeljaka desnim klikom na njihove naslove',
 'tog-showtoc' => 'Prikaži sadržaj stranica koje imaju više od tri podnaslova',
-'tog-rememberpassword' => 'Zapamti me na ovom pregledaču (najduže $1 {{PLURAL:$1|dan|dana|dana}})',
+'tog-rememberpassword' => 'Zapamti me na ovom pregledaču (najduže $1 {{PLURAL:$1|dan|dana}})',
 'tog-watchcreations' => 'Dodaj stranice koje napravim i datoteke koje pošaljem u spisak nadgledanja',
 'tog-watchdefault' => 'Dodaj stranice i datoteke koje izmenim u spisak nadgledanja',
 'tog-watchmoves' => 'Dodaj stranice i datoteke koje premestim u spisak nadgledanja',
@@ -335,8 +335,8 @@ $messages = array(
 'tog-shownumberswatching' => 'Prikaži broj korisnika koji nadgledaju',
 'tog-oldsig' => 'Tekući potpis:',
 'tog-fancysig' => 'Smatraj potpis kao vikitekst (bez samopovezivanja)',
-'tog-uselivepreview' => 'Koristi trenutan pregled (javaskript, probna mogućnost)',
-'tog-forceeditsummary' => 'Opomeni me pri unosu praznog opisa',
+'tog-uselivepreview' => 'Koristi trenutan pregled (eksperimentalno)',
+'tog-forceeditsummary' => 'Upozori me kada ne unesem opis izmene',
 'tog-watchlisthideown' => 'Sakrij moje izmene sa spiska nadgledanja',
 'tog-watchlisthidebots' => 'Sakrij izmene botova sa spiska nadgledanja',
 'tog-watchlisthideminor' => 'Sakrij manje izmene sa spiska nadgledanja',
@@ -430,7 +430,7 @@ $messages = array(
 'category_header' => 'Stranice u kategoriji „$1“',
 'subcategories' => 'Potkategorije',
 'category-media-header' => 'Datoteke u kategoriji „$1“',
-'category-empty' => "''Ova kategorija trenutno ne sadrži stranice ili datoteke.''",
+'category-empty' => "<div style=\"margin:2em 1em 0 1em; padding:0.5em; border:1px solid #AAA; text-align:center;\">''Ova kategorija trenutno ne sadrži stranice ili datoteke.''</div>",
 'hidden-categories' => '{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}}',
 'hidden-category-category' => 'Sakrivene kategorije',
 'category-subcat-count' => '{{PLURAL:$2|Ova kategorija sadrži samo sledeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|sledeću potkategoriju|sledeće $1 potkategorije|sledećih $1 potkategorija}}, od ukupno $2.}}',
@@ -451,7 +451,7 @@ $messages = array(
 'newwindow' => '(otvara u novom prozoru)',
 'cancel' => 'Otkaži',
 'moredotdotdot' => 'Više…',
-'morenotlisted' => 'Više nije prikazano...',
+'morenotlisted' => 'Ova lista nije kompletna.',
 'mypage' => 'Stranica',
 'mytalk' => 'Razgovor',
 'anontalk' => 'Razgovor za ovu IP adresu',
@@ -987,9 +987,7 @@ Možda je premešten ili obrisan dok ste pregledali stranicu.',
 'loginreqlink' => 'prijavljeni',
 'loginreqpagetext' => 'Morate biti $1 da biste videli druge stranice.',
 'accmailtitle' => 'Lozinka je poslata.',
-'accmailtext' => 'Lozinka za {{GENDER:$1|korisnika|korisnicu|korisnika}} [[User talk:$1|$1]] je poslata na $2.
-
-Nakon prijave, lozinka se može promeniti [[Special:ChangePassword|ovde]].',
+'accmailtext' => 'Lozika za {{GENDER:$1|korisnika|korisnicu}} [[User talk:$1|$1]] je poslata na $2. Nakon prijave, lozinka se može promeniti [[Special:ChangePassword|ovde]].',
 'newarticle' => '(novi)',
 'newarticletext' => 'Došli ste na stranicu koja još ne postoji.
 Da biste je napravili, počnite kucati u prozor ispod ovog teksta (pogledajte [[{{MediaWiki:Helppage}}|stranicu za pomoć]]).
@@ -1439,7 +1437,7 @@ Upamtite da njegovi popisi ovog vikija mogu biti zastareli.',
 'prefs-rendering' => 'Izgled',
 'saveprefs' => 'Sačuvaj',
 'resetprefs' => 'Očisti nesačuvane izmene',
-'restoreprefs' => 'Vrati sve na podrazumevano',
+'restoreprefs' => 'Vrati sve na podrazumevano (u svim odeljcima)',
 'prefs-editing' => 'Uređivanje',
 'rows' => 'Redova:',
 'columns' => 'Kolone:',
@@ -1483,7 +1481,7 @@ Ova radnja se ne može vratiti.',
 'prefs-emailconfirm-label' => 'Potvrda e-adrese:',
 'youremail' => 'E-adresa:',
 'username' => '{{GENDER:$1|Korisničko ime}}:',
-'uid' => 'Korisnički IB:',
+'uid' => '{{GENDER:$1|Korisnički}} ID:',
 'prefs-memberingroups' => '{{GENDER:$2|Korisnik|Korisnica}} je član {{PLURAL:$1|grupe|grupa}}:',
 'prefs-memberingroups-type' => '$1',
 'prefs-registration' => 'Vreme upisa:',
@@ -1498,10 +1496,10 @@ Ova radnja se ne može vratiti.',
 Proverite oznake HTML.',
 'badsiglength' => 'Vaš potpis je predugačak.
 Ne sme biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
-'yourgender' => 'Pol:',
-'gender-unknown' => 'nenaznačen',
-'gender-male' => 'muški',
-'gender-female' => 'ženski',
+'yourgender' => 'Kako želite da se predstavite?',
+'gender-unknown' => 'Ne želim da se predstavim',
+'gender-male' => 'On uređuje viki stranice',
+'gender-female' => 'Ona uređuje viki stranice',
 'prefs-help-gender' => 'Neobavezno: koristi se za ispravno obraćanje softvera korisnicima, zavisno od njihovog pola.
 Ovaj podatak će biti javan.',
 'email' => 'E-adresa',
@@ -1514,7 +1512,7 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'prefs-i18n' => 'Internacionalizacija',
 'prefs-signature' => 'Potpis',
 'prefs-dateformat' => 'Format datuma',
-'prefs-timeoffset' => 'Vremensko odstupanje',
+'prefs-timeoffset' => 'Vremenska razlika',
 'prefs-advancedediting' => 'Glavna podešavanja',
 'prefs-advancedrc' => 'Napredne postavke',
 'prefs-advancedrendering' => 'Napredne postavke',
@@ -1565,8 +1563,8 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'group-user-member' => '{{GENDER:$1|korisnik|korisnica|korisnik}}',
 'group-autoconfirmed-member' => '{{GENDER:$1|automatski potvrđen korisnik|automatski potvrđena korisnica|automatski potvrđen korisnik}}',
 'group-bot-member' => '{{GENDER:$1|bot}}',
-'group-sysop-member' => '{{GENDER:$1|administrator|administratorka|administrator}}',
-'group-bureaucrat-member' => '{{GENDER:$1|birokrata|birokratkinja|birokrata}}',
+'group-sysop-member' => '{{GENDER:$1|administrator|administratorka}}',
+'group-bureaucrat-member' => '{{GENDER:$1|birokrata|birokratkinja}}',
 'group-suppress-member' => '{{GENDER:$1|revizor|revizorka|revizor}}',
 
 'grouppage-user' => '{{ns:project}}:Korisnici',
@@ -1594,7 +1592,7 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'right-reupload-shared' => 'menjanje datoteka na deljenom skladištu multimedije',
 'right-upload_by_url' => 'otpremanje datoteka sa veb adrese',
 'right-purge' => 'čišćenje keš memorije stranice bez potvrde',
-'right-autoconfirmed' => 'uređivanje poluzaštićenih stranica',
+'right-autoconfirmed' => 'Not be affected by IP-based rate limits',
 'right-bot' => 'smatranje izmena kao automatski proces',
 'right-nominornewtalk' => 'neposedovanje malih izmena na stranicama za razgovor otvara prozor za nove poruke',
 'right-apihighlimits' => 'korišćenje viših granica za upite iz API-ja',
@@ -1737,7 +1735,7 @@ Stranice s [[Special:Watchlist|vašeg spiska nadgledanja]] su '''podebljane'''."
 'reuploaddesc' => 'Nazad na obrazac za otpremanje',
 'upload-tryagain' => 'Pošalji izmenjeni opis datoteke',
 'uploadnologin' => 'Niste prijavljeni',
-'uploadnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]] da biste otpremali datoteke.',
+'uploadnologintext' => 'Morate biti $1 da biste otpremali datoteke.',
 'upload_directory_missing' => 'Fascikla za slanje ($1) nedostaje i server je ne može napraviti.',
 'upload_directory_read_only' => 'Server ne može da piše po fascikli za slanje ($1).',
 'uploaderror' => 'Greška pri otpremanju',
@@ -1827,7 +1825,7 @@ Pogledajte istoriju brisanja pre ponovnog slanja.',
 'uploadwarning-text' => 'Izmenite opis datoteke i pokušajte ponovo.',
 'savefile' => 'Sačuvaj datoteku',
 'uploadedimage' => '{{GENDER:|je poslao|je poslala|je poslao}} „[[$1]]“',
-'overwroteimage' => '{{GENDER:|je poslao|je poslala|je poslao}} novo izdanje „[[$1]]“',
+'overwroteimage' => '{{GENDER:|je poslao|je poslala}} novu verziju datoteke „[[$1]]“',
 'uploaddisabled' => 'Otpremanje je onemogućeno.',
 'copyuploaddisabled' => 'Slanje putem URL adrese je onemogućeno.',
 'uploadfromurl-queued' => 'Slanje je stavljeno na spisak čekanja.',
@@ -1994,8 +1992,7 @@ Probajte kasnije kada bude manje opterećenje.',
 'upload_source_file' => ' (datoteka na vašem računaru)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Ova posebna stranica prikazuje sve poslate datoteke.
-Kad je poređano po korisniku, popis prikazuje samo one datoteke čije je poslednje izdanje postavio taj korisnik.',
+'listfiles-summary' => 'Ova posebna stranica prikazuje sve poslate datoteke.',
 'listfiles_search_for' => 'Naziv datoteke:',
 'imgfile' => 'datoteka',
 'listfiles' => 'Spisak datoteka',
@@ -2010,7 +2007,7 @@ Kad je poređano po korisniku, popis prikazuje samo one datoteke čije je posled
 # File description page
 'file-anchor-link' => 'Datoteka',
 'filehist' => 'Istorija datoteke',
-'filehist-help' => 'Kliknite na datum/vreme da vidite tadašnje izdanje datoteke.',
+'filehist-help' => 'Kliknite na datum/vreme da vidite tadašnju verziju datoteke.',
 'filehist-deleteall' => 'obriši sve',
 'filehist-deleteone' => 'obriši',
 'filehist-revert' => 'vrati',
@@ -2376,9 +2373,7 @@ E-adresa koju ste uneli u vašim [[Special:Preferences|podešavanjima]] će se p
 'watchnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]] da biste menjali spisak nadgledanja.',
 'addwatch' => 'Dodaj na spisak nadgledanja',
 'addedwatchtext' => 'Stranica „[[:$1]]“ je dodata na vaš [[Special:Watchlist|spisak nadgledanja]].
-Buduće izmene ove stranice i njene stranice za razgovor biće navedene ovde, a stranica će biti <b>podebljana</b> u [[Special:RecentChanges|spisku skorašnjih izmena]] da bi se lakše uočila.
-
-Ukoliko budete želeli da uklonite stranicu sa spiska nadgledanja, kliknite opet na zvezdicu u gornjoj paleti.',
+Buduće izmene ove stranice i njene stranice za razgovor biće navedene tamo.',
 'removewatch' => 'Ukloni sa spiska nadgledanja',
 'removedwatchtext' => 'Stranica „[[:$1]]“ je uklonjena s vašeg [[Special:Watchlist|spiska nadgledanja]].',
 'watch' => 'Nadgledaj',
@@ -2631,7 +2626,7 @@ $1',
 'blanknamespace' => '(Glavno)',
 
 # Contributions
-'contributions' => 'Korisnički doprinosi',
+'contributions' => '{{GENDER:$1|Korisnički}} doprinosi',
 'contributions-title' => 'Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}} $1',
 'mycontris' => 'Doprinosi',
 'contribsub2' => 'Za $1 ($2)',
@@ -3179,13 +3174,13 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
 'pageinfo-length' => 'Dužina stranice (u bajtovima)',
 'pageinfo-article-id' => 'ID stranice',
 'pageinfo-language' => 'Jezik sadržaja stranice',
-'pageinfo-robot-policy' => 'Status pretraživača',
+'pageinfo-robot-policy' => 'Indeksiranje od strane robota',
 'pageinfo-robot-index' => 'Dozvoljeno',
 'pageinfo-robot-noindex' => 'Nije dozvoljeno',
 'pageinfo-views' => 'Broj pregleda',
 'pageinfo-watchers' => 'Broj nadgledača stranica',
 'pageinfo-few-watchers' => 'Manje od $1 {{PLURAL:$1|pratioca|pratilaca}}',
-'pageinfo-redirects-name' => 'Preusmeravanja na stranicu',
+'pageinfo-redirects-name' => 'Broj preusmerenja na ovu stranicu',
 'pageinfo-subpages-name' => 'Podstranice ove stranice',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|preusmerenje|preusmerenja|preusmerenja}}; $3 {{PLURAL:$3|nepreusmerenje|nepreusmerenja|nepreusmerenja}})',
 'pageinfo-firstuser' => 'Autor stranice',
@@ -3364,7 +3359,7 @@ Variants for Chinese language
 
 # Metadata
 'metadata' => 'Metapodaci',
-'metadata-help' => 'Ova datoteka sadrži dodatne podatke koji verovatno dolaze od digigalnih fotoaparata ili skenera.
+'metadata-help' => 'Ova datoteka sadrži dodatne podatke koji verovatno dolaze od digitalnog fotoaparata ili skenera.
 Ako je prvobitno stanje datoteke promenjeno, moguće je da neki detalji ne opisuju izmenjenu datoteku.',
 'metadata-expand' => 'Prikaži detalje',
 'metadata-collapse' => 'Sakrij detalje',
@@ -3592,7 +3587,7 @@ $8',
 'exif-compression-34712' => 'JPEG2000',
 
 'exif-copyrighted-true' => 'Zaštićeno autorskim pravom',
-'exif-copyrighted-false' => 'Javno vlasništvo',
+'exif-copyrighted-false' => 'Status autorskih prava nije podešen',
 
 'exif-photometricinterpretation-2' => 'RGB',
 'exif-photometricinterpretation-6' => 'YCbCr',
index dc4d9a4..1dd34a5 100644 (file)
@@ -23,6 +23,7 @@
  * @author Habjchen
  * @author Hangsna
  * @author Hannibal
+ * @author Haxpett
  * @author Jon Harald Søby
  * @author Jopparn
  * @author Kaganer
@@ -1355,6 +1356,7 @@ Se till att sidhistorikens kontinuitet behålls när du sammanfogar historik.',
 'mergehistory-comment' => 'Infogade [[:$1]] i [[:$2]]: $3',
 'mergehistory-same-destination' => 'Käll- och målsidor kan inte vara samma',
 'mergehistory-reason' => 'Anledning:',
+'mergehistory-revisionrow' => '$1($2) $3 . .$4 $5 $6',
 
 # Merge log
 'mergelog' => 'Sammanfogningslogg',
index 784c10e..83bd7d2 100644 (file)
@@ -204,12 +204,12 @@ $messages = array(
 'tog-hidepatrolled' => 'ซ่อนการแก้ไขที่ตรวจแล้วในหน้าปรับปรุงล่าสุด',
 'tog-newpageshidepatrolled' => 'ซ่อนหน้าที่ตรวจแล้วจากรายการหน้าใหม่',
 'tog-extendwatchlist' => 'ขยายรายการเฝ้าดูให้แสดงการเปลี่ยนแปลงทั้งหมด ไม่เพียงการเปลี่ยนแปลงล่าสุด',
-'tog-usenewrc' => 'à¸\88ัà¸\94à¸\81ลุà¹\88มà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\82à¸\94ยหà¸\99à¹\89าà¹\83à¸\99รายà¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87ลà¹\88าสุà¸\94à¹\81ละรายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ู (à¸\95à¹\89อà¸\87à¸\81ารà¸\88าวาสà¸\84ริà¸\9bà¸\95à¹\8c)',
+'tog-usenewrc' => 'à¸\88ัà¸\94à¸\81ลุà¹\88มà¸\84วามà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\81à¸\9aà¹\88à¸\87à¸\95ามหà¸\99à¹\89าà¹\83à¸\99รายà¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87ลà¹\88าสุà¸\94à¹\81ละรายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ู',
 'tog-numberheadings' => 'ใส่เลขหัวข้อในสารบัญอัตโนมัติ',
-'tog-showtoolbar' => 'à¹\81สà¸\94à¸\87à¹\80à¸\84รืà¹\88อà¸\87มือà¹\81à¸\81à¹\89à¹\84à¸\82 (à¸\88าวาสà¸\84ริà¸\9bà¸\95à¹\8c)',
-'tog-editondblclick' => 'à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¹\82à¸\94ยà¸\81ารà¸\94ัà¸\9aà¹\80à¸\9aิลà¸\84ลิà¸\81 (à¸\88าวาสà¸\84ริà¸\9bà¸\95à¹\8c)',
+'tog-showtoolbar' => 'à¹\81สà¸\94à¸\87à¹\81à¸\96à¸\9aà¹\80à¸\84รืà¹\88อà¸\87มือà¹\81à¸\81à¹\89à¹\84à¸\82',
+'tog-editondblclick' => 'à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¹\80มืà¹\88อà¸\94ัà¸\9aà¹\80à¸\9aิลà¸\84ลิà¸\81',
 'tog-editsection' => 'เปิดการแก้ไขเฉพาะส่วนผ่านลิงก์ [แก้ไข]',
-'tog-editsectiononrightclick' => 'à¹\80à¸\9bิà¸\94à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80à¸\89à¸\9eาะสà¹\88วà¸\99à¹\82à¸\94ยà¸\84ลิà¸\81à¸\82วาà¸\97ีà¹\88หัวà¸\82à¹\89อ (à¸\88าวาสà¸\84ริà¸\9bà¸\95à¹\8c)',
+'tog-editsectiononrightclick' => 'à¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80à¸\89à¸\9eาะสà¹\88วà¸\99à¹\82à¸\94ยà¸\84ลิà¸\81à¸\82วาà¸\97ีà¹\88หัวà¸\82à¹\89อ',
 'tog-showtoc' => 'แสดงสารบัญ (สำหรับหน้าที่มีมากกว่า 3 หัวข้อ)',
 'tog-rememberpassword' => 'จำการล็อกอินของฉันในเบราว์เซอร์นี้ (สูงสุด $1 วัน)',
 'tog-watchcreations' => 'เพิ่มหน้าที่ฉันสร้างและไฟล์ที่ฉันอัปโหลดเข้ารายการเฝ้าดู',
@@ -227,7 +227,7 @@ $messages = array(
 'tog-shownumberswatching' => 'แสดงจำนวนผู้ใช้ที่เฝ้าดู',
 'tog-oldsig' => 'ลายเซ็นที่ใช้อยู่:',
 'tog-fancysig' => 'ใช้คำสั่งวิกิที่ปรากฏในลายเซ็นนี้ (โดยไม่มีลิงก์อัตโนมัติ)',
-'tog-uselivepreview' => 'à¹\81สà¸\94à¸\87à¸\95ัวอยà¹\88าà¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\81à¸\9aà¸\9aà¸\97ัà¸\99à¸\97ี (à¸\88าวาสà¸\84ริà¸\9bà¸\95à¹\8c) (à¸\97à¸\94ลอà¸\87)',
+'tog-uselivepreview' => 'แสดงตัวอย่างการแก้ไขแบบทันที (ทดลอง)',
 'tog-forceeditsummary' => 'เตือนเมื่อช่องคำอธิบายอย่างย่อว่าง',
 'tog-watchlisthideown' => 'ซ่อนการแก้ไขของฉันจากรายการเฝ้าดู',
 'tog-watchlisthidebots' => 'ซ่อนการแก้ไขของบอตจากรายการเฝ้าดู',
@@ -241,6 +241,7 @@ $messages = array(
 'tog-noconvertlink' => 'ปิดใช้งานการแปลงชื่อเรื่องของลิงก์',
 'tog-norollbackdiff' => 'ไม่แสดงการเปลี่ยนแปลงหลังดำเนินการย้อนกลับฉุกเฉิน',
 'tog-useeditwarning' => 'เตือนฉัน เมื่อฉันกำลังจะออกจากหน้าแก้ไขโดยมีข้อมูลที่ยังไม่ได้บันทึก',
+'tog-prefershttps' => 'ใช้การเชื่อมต่อปลอดภัยทุกครั้งเมื่อล็อกอิน',
 
 'underline-always' => 'เสมอ',
 'underline-never' => 'ไม่เคย',
@@ -341,7 +342,7 @@ $messages = array(
 'newwindow' => '(เปิดหน้าต่างใหม่)',
 'cancel' => 'ยกเลิก',
 'moredotdotdot' => 'ดูเพิ่ม...',
-'morenotlisted' => 'มีà¸\97ีà¹\88ยัà¸\87à¹\84มà¹\88à¹\81สà¸\94à¸\87อีà¸\81...',
+'morenotlisted' => 'รายà¸\81ารà¸\99ีà¹\89à¹\84มà¹\88สมà¸\9aูรà¸\93à¹\8c',
 'mypage' => 'หน้า',
 'mytalk' => 'พูดคุย',
 'anontalk' => 'พูดคุยกับเลขที่อยู่ไอพีนี้',
@@ -652,7 +653,7 @@ $1',
 'createacct-emailoptional' => 'ที่อยู่อีเมล (เลือกไม่ใส่ได้)',
 'createacct-email-ph' => 'กรอกที่อยู่อีเมล',
 'createacct-another-email-ph' => 'กรอกที่อยู่อีเมล',
-'createaccountmail' => 'ใช้รหัสผ่านสุ่มชั่วคราวและส่งไปยังที่อยู่อีเมลที่ระบุด้านล่าง',
+'createaccountmail' => 'ใช้รหัสผ่านสุ่มชั่วคราวและส่งไปยังที่อยู่อีเมลที่ระบุ',
 'createacct-realname' => 'ชื่อจริง (เลือกไม่ใส่ได้)',
 'createaccountreason' => 'เหตุผล:',
 'createacct-reason' => 'เหตุผล',
@@ -699,7 +700,8 @@ $1',
 กรุณาล็อกอินอีกครั้งหลังได้รับอีเมล',
 'blocked-mailpassword' => 'เลขที่อยู่ไอพีของคุณถูกบล็อกมิให้แก้ไข ฉะนั้น จึงไม่ได้รับอนุญาตให้ใช้ฟังก์ชันขอกู้รหัสผ่านเพื่อป้องกันการกระทำผิด',
 'eauthentsent' => 'อีเมลยืนยันได้ถูกส่งไปที่อยู่อีเมลที่เสนอ ก่อนที่อีเมลจะถูกส่งไปที่ชื่อบัญชีนั้น คุณต้องปฏิบัติตามคำแนะนำในอีเมลเพื่อยืนยันว่าบัญชีนั้นเป็นของคุณจริง ๆ',
-'throttled-mailpassword' => 'ตัวเตือนรหัสผ่านได้ถูกส่งไปแล้วใน $1 ชั่วโมงที่ผ่านมา ตัวเตือนรหัสผ่านนี้จะถูกส่งได้หนึ่งครั้งต่อ $1 ชั่วโมงเท่านั้น เพื่อป้องกันการกระทำผิด',
+'throttled-mailpassword' => 'อีเมลตั้งรหัสผ่านใหม่ถูกส่งไปแล้วใน $1 ชั่วโมงที่ผ่านมา 
+อีเมลตั้งรหัสผ่านใหม่จะส่งไปหนึ่งครั้งต่อ $1 ชั่วโมงเท่านั้น เพื่อป้องกันการกระทำที่ไม่ถูกต้อง',
 'mailerror' => 'ข้อผิดพลาดในการส่งเมล: $1',
 'acct_creation_throttle_hit' => 'ผู้เข้าชมวิกินี้ที่ใช้เลขที่อยู่ไอพีของคุณ ได้สร้างบัญชีแล้ว $1 บัญชีในวันที่ผ่านมา ซึ่งเป็นจำนวนสูงสุดที่อนุญาตในช่วงเวลาดังกล่าว
 จึงส่งผลให้ผู้เข้าชมที่ใช้เลขที่อยู่ไอพีนี้ ไม่สามารถสร้างบัญชีได้อีกในขณะนี้',
@@ -720,10 +722,12 @@ $1',
 คุณอาจเพิกเฉยข้อความนี้ หากการสร้างบัญชีนี้เกิดจากความผิดพลาด',
 'usernamehasherror' => 'ชื่อผู้ใช้ต้องไม่มีอักขระแฮช',
 'login-throttled' => 'ที่ผ่านมาคุณพยายามล็อกอินมากครั้งเกินไป
-กรุณารอสักครู่แล้วลองใหม่อีกครั้ง',
+กรุณารอ $1 ก่อนลองอีกครั้ง',
 'login-abort-generic' => 'การเข้าสู่ระบบของคุณไม่ประสบความสำเร็จ - ล้มเลิกแล้ว',
 'loginlanguagelabel' => 'ภาษา: $1',
 'suspicious-userlogout' => 'คำขอล็อกเอาต์ของคุณถูกปฏิเสธเพราะดูเหมือนส่งมาจากเบราว์เซอร์หรือพร็อกซีแคชที่เสีย',
+'createacct-another-realname-tip' => 'ไม่จำเป็นต้องใส่ชื่อจริง
+หากคุณเลือกใส่ชื่อจริง จะใช้เพื่อแสดงที่มาสำหรับงานของตน',
 
 # Email sending
 'php-mail-error-unknown' => 'เกิดข้อผิดพลาดไม่ทราบสาเหตุในฟังก์ชัน mail() ของพีเอชพี',
@@ -739,7 +743,7 @@ $1',
 'newpassword' => 'รหัสผ่านใหม่:',
 'retypenew' => 'พิมพ์รหัสผ่านใหม่อีกครั้ง:',
 'resetpass_submit' => 'ตั้งรหัสผ่านและล็อกอิน',
-'changepassword-success' => 'เปลี่ยนรหัสผ่านของคุณเรียบร้อย ขณะนี้กำลังล็อกอินให้คุณ...',
+'changepassword-success' => 'เปลี่ยนรหัสผ่านของคุณเรียบร้อย',
 'resetpass_forbidden' => 'ไม่สามารถเปลี่ยนรหัสผ่านได้',
 'resetpass-no-info' => 'คุณต้องล็อกอินเพื่อเข้าถึงหน้านี้โดยตรง',
 'resetpass-submit-loggedin' => 'เปลี่ยนรหัสผ่าน',
@@ -762,23 +766,23 @@ $1',
 'passwordreset-capture-help' => 'หากคุณเลือกกล่องนี้ อีเมลดังกล่าว (พร้อมรหัสผ่านชั่วคราว) จะแสดงแก่คุณ เช่นเดียวกับส่งไปยังผู้ใช้',
 'passwordreset-email' => 'ที่อยู่อีเมล:',
 'passwordreset-emailtitle' => 'รายละเอียดบัญชีบน {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'à¹\83à¸\84รà¸\9aาà¸\87à¸\84à¸\99 (à¸\8bึà¹\88à¸\87อาà¸\88à¹\80à¸\9bà¹\87à¸\99à¸\84ุà¸\93 à¸\97ีà¹\88à¹\83à¸\8aà¹\89à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eี $1) à¸\82อà¸\95ัวà¹\80à¸\95ือà¸\99รายละà¹\80อียà¸\94à¸\9aัà¸\8dà¸\8aีà¸\82อà¸\87à¸\84ุà¸\93à¸\9aà¸\99 {{SITENAME}} ($4) บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:
+'passwordreset-emailtext-ip' => 'à¸\9aาà¸\87à¸\84à¸\99 (à¸\8bึà¹\88à¸\87อาà¸\88à¹\80à¸\9bà¹\87à¸\99à¸\84ุà¸\93 à¸\88าà¸\81à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eี $1) à¸£à¹\89อà¸\87à¸\82อà¸\81ารà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¸\82อà¸\87à¸\84ุà¸\93à¹\83หมà¹\88à¸\9aà¸\99{{SITENAME}} ($4) บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:
 
 $2
 
 {{PLURAL:$3|รหัสผ่านชั่วคราวนี้|รหัสผ่านชั่วคราวเหล่านี้}}จะหมดอายุใน $5 วัน
-à¸\95อà¸\99à¸\99ีà¹\89à¸\84ุà¸\93à¸\84วรลà¹\87อà¸\81อิà¸\99à¹\81ละà¹\80ลือà¸\81รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88 à¸«à¸²à¸\81à¸\9aุà¸\84à¸\84ลอืà¹\88à¸\99à¸\82อà¸\95ัวà¹\80à¸\95ือà¸\99รายละà¹\80อียà¸\94à¸\9aัà¸\8dà¸\8aี à¸«à¸£à¸·à¸­à¸\84ุà¸\93à¸\88ำรหัสà¸\9cà¹\88าà¸\99à¹\80à¸\94ิมà¸\82อà¸\87à¸\84ุà¸\93à¹\84à¸\94à¹\89à¹\81ลà¹\89ว à¹\81ละà¸\84ุà¸\93à¹\84มà¹\88à¸\95à¹\89อà¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99รหัสà¸\9cà¹\88าà¸\99อีà¸\81à¸\95à¹\88อà¹\84à¸\9b à¸\84ุà¸\93อาà¸\88ละà¹\80ลยà¸\82à¹\89อà¸\84วามà¸\99ีà¹\89à¹\81ละà¹\83à¸\8aà¹\89รหัสà¸\9cà¹\88าà¸\99à¹\80à¸\81à¹\88าของคุณต่อไป',
-'passwordreset-emailtext-user' => 'à¸\9cูà¹\89à¹\83à¸\8aà¹\89 $1 à¸\82อà¸\95ัวà¹\80à¸\95ือà¸\99รายละà¹\80อียà¸\94à¸\9aัà¸\8dà¸\8aีà¸\82อà¸\87à¸\84ุà¸\93à¸\9aà¸\99 {{SITENAME}} ($4) {{PLURAL:$3||}}บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:
+à¸\95อà¸\99à¸\99ีà¹\89à¸\84ุà¸\93à¸\84วรลà¹\87อà¸\81อิà¸\99à¹\81ละà¹\80ลือà¸\81รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88 à¸«à¸²à¸\81à¸\9aุà¸\84à¸\84ลอืà¹\88à¸\99à¸\82อà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\99ีà¹\89 à¸«à¸£à¸·à¸­à¸\84ุà¸\93à¸\88ำรหัสà¸\9cà¹\88าà¸\99à¹\80à¸\94ิมà¸\82อà¸\87à¸\84ุà¸\93à¹\84à¸\94à¹\89à¹\81ลà¹\89ว à¹\81ละà¸\84ุà¸\93à¹\84มà¹\88à¸\95à¹\89อà¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99รหัสà¸\9cà¹\88าà¸\99อีà¸\81 à¸\84ุà¸\93อาà¸\88ละà¹\80ลยà¸\82à¹\89อà¸\84วามà¸\99ีà¹\89à¹\81ละà¹\83à¸\8aà¹\89รหัสà¸\9cà¹\88าà¸\99à¹\80à¸\94ิมของคุณต่อไป',
+'passwordreset-emailtext-user' => 'à¸\9cูà¹\89à¹\83à¸\8aà¹\89 $1 à¸\82อà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¸\82อà¸\87à¸\84ุà¸\93à¹\83หมà¹\88à¸\9aà¸\99{{SITENAME}} ($4) {{PLURAL:$3||}}บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:
 
 $2
 
 {{PLURAL:$3|รหัสผ่านชั่วคราวนี้|รหัสผ่านชั่วคราวเหล่านี้}}จะหมดอายุใน $5 วัน
-à¸\95อà¸\99à¸\99ีà¹\89à¸\84ุà¸\93à¸\84วรลà¹\87อà¸\81อิà¸\99à¹\81ละà¹\80ลือà¸\81รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88 à¸«à¸²à¸\81à¸\9aุà¸\84à¸\84ลอืà¹\88à¸\99à¸\82อà¸\95ัวà¹\80à¸\95ือà¸\99รายละà¹\80อียà¸\94à¸\9aัà¸\8dà¸\8aี à¸«à¸£à¸·à¸­à¸\84ุà¸\93à¸\88ำรหัสà¸\9cà¹\88าà¸\99à¹\80à¸\94ิมà¸\82อà¸\87à¸\84ุà¸\93à¹\84à¸\94à¹\89à¹\81ลà¹\89ว à¹\81ละà¸\84ุà¸\93à¹\84มà¹\88à¸\95à¹\89อà¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99รหัสà¸\9cà¹\88าà¸\99อีà¸\81à¸\95à¹\88อà¹\84à¸\9b à¸\84ุà¸\93อาà¸\88ละà¹\80ลยà¸\82à¹\89อà¸\84วามà¸\99ีà¹\89à¹\81ละà¹\83à¸\8aà¹\89รหัสà¸\9cà¹\88าà¸\99à¹\80à¸\81à¹\88าของคุณต่อไป',
+à¸\95อà¸\99à¸\99ีà¹\89à¸\84ุà¸\93à¸\84วรลà¹\87อà¸\81อิà¸\99à¹\81ละà¹\80ลือà¸\81รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88 à¸«à¸²à¸\81à¸\9aุà¸\84à¸\84ลอืà¹\88à¸\99à¸\82อà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\99ีà¹\89 à¸«à¸£à¸·à¸­à¸\84ุà¸\93à¸\88ำรหัสà¸\9cà¹\88าà¸\99à¹\80à¸\94ิมà¸\82อà¸\87à¸\84ุà¸\93à¹\84à¸\94à¹\89à¹\81ลà¹\89ว à¹\81ละà¸\84ุà¸\93à¹\84มà¹\88à¸\95à¹\89อà¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99รหัสà¸\9cà¹\88าà¸\99อีà¸\81 à¸\84ุà¸\93อาà¸\88ละà¹\80ลยà¸\82à¹\89อà¸\84วามà¸\99ีà¹\89à¹\81ละà¹\83à¸\8aà¹\89รหัสà¸\9cà¹\88าà¸\99à¹\80à¸\94ิมของคุณต่อไป',
 'passwordreset-emailelement' => 'ชื่อผู้ใช้: $1
 รหัสผ่านชั่วคราว: $2',
 'passwordreset-emailsent' => 'อีเมลตั้งรหัสผ่านใหม่ถูกส่งไปแล้ว',
 'passwordreset-emailsent-capture' => 'อีเมลตั้งรหัสผ่านใหม่ถูกส่งไปแล้ว ซึ่งแสดงด้านล่าง',
-'passwordreset-emailerror-capture' => 'อีà¹\80มลà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\96ูà¸\81สรà¹\89าà¸\87à¸\82ึà¹\89à¸\99à¹\81ลà¹\89ว à¸\8bึà¹\88à¸\87à¹\81สà¸\94à¸\87à¸\82à¹\89าà¸\87ลà¹\88าà¸\87 à¹\81à¸\95à¹\88à¸\81ารสà¹\88à¸\87à¹\84à¸\9bยัà¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89ลà¹\89มà¹\80หลว: $1',
+'passwordreset-emailerror-capture' => 'อีà¹\80มลà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\96ูà¸\81สรà¹\89าà¸\87à¸\82ึà¹\89à¸\99à¹\81ลà¹\89ว à¸\8bึà¹\88à¸\87à¹\81สà¸\94à¸\87à¸\94à¹\89าà¸\99ลà¹\88าà¸\87 à¹\81à¸\95à¹\88à¹\84มà¹\88สามารà¸\96สà¹\88à¸\87à¹\84à¸\9bยัà¸\87{{GENDER:$2|à¸\9cูà¹\89à¹\83à¸\8aà¹\89}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'เปลี่ยนที่อยู่อีเมล',
@@ -801,7 +805,7 @@ $2
 'resettokens-legend' => 'ตั้งโทเค็นใหม่',
 'resettokens-tokens' => 'โทเค็น:',
 'resettokens-token-label' => '$1 (ค่าปัจจุบัน: $2)',
-'resettokens-watchlist-token' => 'โทเค็นการป้อนเว็บรายการเฝ้าดู',
+'resettokens-watchlist-token' => 'โทเค็นการป้อนเว็บ (Atom/RSS) ของ[[Special:Watchlist|การเปลี่ยนแปลงไปยังหน้าในรายการเฝ้าดูของคุณ]]',
 'resettokens-done' => 'ตั้งโทเค็นใหม่แล้ว',
 'resettokens-resetbutton' => 'ตั้งโทเค็นที่เลือกใหม่',
 
@@ -878,9 +882,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}}|หน้าคำอธิบาย]])
@@ -1313,7 +1315,7 @@ $1",
 'prefs-rendering' => 'รูปลักษณ์',
 'saveprefs' => 'บันทึก',
 'resetprefs' => 'ล้างการเปลี่ยนแปลงที่ยังไม่บันทึก',
-'restoreprefs' => 'คืนการตั้งค่าโดยปริยายทั้งหมด',
+'restoreprefs' => 'คืนการตั้งค่าโดยปริยายทั้งหมด (ในทุกส่วน)',
 'prefs-editing' => 'การแก้ไข',
 'rows' => 'แถว:',
 'columns' => 'คอลัมน์:',
@@ -1374,7 +1376,9 @@ $1",
 'gender-unknown' => 'ไม่ระบุ',
 'gender-male' => 'ชาย',
 'gender-female' => 'หญิง',
-'prefs-help-gender' => 'เป็นข้อมูลเสริม: ใช้เพื่อให้ซอฟต์แวร์แยกแยะเพศของผู้ใช้ได้ ข้อมูลนี้จะเปิดเผยต่อสาธารณะ',
+'prefs-help-gender' => 'เลือกตั้งค่านี้หรือไม่ก็ได้
+ซอฟต์แวร์ใช้ค่านี้เพื่อติดต่อคุณและกล่าวถึงคุณโดยใช้เพศทางไวยากรณ์ที่เหมาะสมเมื่อติดต่อผู้อื่น
+ข้อมูลนี้เปิดเผยต่อสาธารณะ',
 'email' => 'อีเมล',
 'prefs-help-realname' => 'ไม่จำเป็นต้องใช้ชื่อจริง ถ้าคุณเลือกใช้ชื่อจริง จะใช้เพื่อให้เกียรติแก่งานของคุณ',
 'prefs-help-email' => 'ไม่จำเป็นต้องใส่ที่อยู่อีเมล แต่จำเป็นสำหรับการตั้งรหัสผ่านใหม่เมื่อคุณลืมรหัสผ่าน',
@@ -1397,6 +1401,7 @@ $1",
 'prefs-displaywatchlist' => 'ตัวเลือกผลแสดง',
 'prefs-tokenwatchlist' => 'โทเค็น',
 'prefs-diffs' => 'ผลต่าง',
+'prefs-help-prefershttps' => 'การตั้งค่านี้จะมีผลเมื่อคุณล็อกอินครั้งถัดไป',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'ที่อยู่อีเมลดูถูกต้อง',
@@ -1420,7 +1425,7 @@ $1",
 'userrights-no-interwiki' => 'คุณไม่ได้รับสิทธิแก้ไขสิทธิผู้ใช้บนวิกิอื่น',
 'userrights-nodatabase' => 'ไม่มีฐานข้อมูล $1 อยู่ หรือฐานข้อมูลอยู่บนเครื่องอื่น',
 'userrights-nologin' => 'คุณต้อง[[Special:UserLogin|ล็อกอิน]]ด้วยบัญชีผู้ดูแลระบบก่อน จึงจะกำหนดสิทธิผู้ใช้ได้',
-'userrights-notallowed' => 'à¸\9aัà¸\8dà¸\8aีà¸\82อà¸\87à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\80à¸\9eิà¹\88มหรือลà¸\94สิà¸\97à¸\98ิà¸\82อà¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89',
+'userrights-notallowed' => 'บัญชีของคุณไม่ได้รับอนุญาตให้เพิ่มหรือลดสิทธิผู้ใช้',
 'userrights-changeable-col' => 'กลุ่มที่คุณสามารถเปลี่ยนได้',
 'userrights-unchangeable-col' => 'กลุ่มที่คุณไม่สามารถเปลี่ยนได้',
 
@@ -1488,7 +1493,8 @@ $1",
 'right-proxyunbannable' => 'เลี่ยงการบล็อกอัตโนมัติของพร็อกซี',
 'right-unblockself' => 'ปลดบล็อกตนเอง',
 'right-protect' => 'เปลี่ยนระดับการล็อกและแก้ไขหน้าที่ถูกล็อก',
-'right-editprotected' => 'หน้าที่ถูกล็อกเต็มที่ (ที่ไม่ล็อกแบบสืบทอด)',
+'right-editprotected' => 'แก้ไขหน้าที่ถูกล็อกซึ่ง "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'แก้ไขหน้าที่ถูกล็อกซึ่ง "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'แก้ไขอินเตอร์เฟซผู้ใช้',
 'right-editusercssjs' => 'แก้ไขไฟล์ CSS และจาวาสคริปต์ของผู้ใช้อื่น',
 'right-editusercss' => 'แก้ไขไฟล์ CSS ของผู้ใช้อื่น',
@@ -1568,6 +1574,8 @@ $1",
 
 # Recent changes
 'nchanges' => '$1 การแก้ไข',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|ตั้งแต่การเข้าชมล่าสุด}}',
+'enhancedrc-history' => 'ประวัติ',
 'recentchanges' => 'ปรับปรุงล่าสุด',
 'recentchanges-legend' => 'ตัวเลือกปรับปรุงล่าสุด',
 'recentchanges-summary' => 'ในหน้านี้เป็นรายการการปรับปรุงล่าสุดบนวิกินี้',
@@ -1600,7 +1608,7 @@ $1",
 'rc_categories_any' => 'ใด ๆ',
 'rc-change-size-new' => '$1 ไบต์หลังปรับปรุง',
 'newsectionsummary' => '/* $1 */ หัวข้อใหม่',
-'rc-enhanced-expand' => 'แสดงรายละเอียด (จาวาสคริปต์)',
+'rc-enhanced-expand' => 'แสดงรายละเอียด',
 'rc-enhanced-hide' => 'ซ่อนรายละเอียด',
 'rc-old-title' => 'เดิมถูกสร้างในชื่อ "$1"',
 
@@ -1819,8 +1827,7 @@ $1',
 'upload_source_file' => ' (ไฟล์จากคอมพิวเตอร์คุณ)',
 
 # Special:ListFiles
-'listfiles-summary' => 'หน้าพิเศษนี้แสดงไฟล์ทั้งหมดที่อัปโหลด
-เมื่อกรองตามผู้ใช้แล้ว จะแสดงเฉพาะไฟล์รุ่นล่าสุดที่ผู้ใช้นั้นอัปโหลด',
+'listfiles-summary' => 'หน้าพิเศษนี้แสดงไฟล์ทั้งหมดที่อัปโหลด',
 'listfiles_search_for' => 'ค้นหาชื่อสื่อ:',
 'imgfile' => 'ไฟล์',
 'listfiles' => 'รายการไฟล์',
@@ -1831,6 +1838,10 @@ $1',
 'listfiles_size' => 'ขนาด',
 'listfiles_description' => 'คำอธิบาย',
 'listfiles_count' => 'รุ่น',
+'listfiles-show-all' => 'รวมภาพรุ่นเก่า',
+'listfiles-latestversion' => 'รุ่นปัจจุบัน',
+'listfiles-latestversion-yes' => 'ใช่',
+'listfiles-latestversion-no' => 'ไม่',
 
 # File description page
 'file-anchor-link' => 'ไฟล์',
@@ -2023,6 +2034,7 @@ $1',
 'mostrevisions' => 'หน้าที่มีรุ่นมากที่สุด',
 'prefixindex' => 'ทุกหน้าพร้อมคำขึ้นต้น',
 'prefixindex-namespace' => 'ทุกหน้าพร้อมคำขึ้นต้น (เนมสเปซ $1)',
+'prefixindex-strip' => 'ลบคำขึ้นต้นในรายการออก',
 'shortpages' => 'หน้าสั้น',
 'longpages' => 'หน้ายาว',
 'deadendpages' => 'หน้าสุดทาง',
@@ -2117,7 +2129,7 @@ $1',
 'linksearch-ok' => 'ค้นหา',
 'linksearch-text' => 'สามารถใช้ตัวแทนเช่น "*.wikipedia.org" ได้
 ต้องการโดเมนระดับบนสุดเป็นอย่างน้อย เช่น "*.org"<br />
-โพรโทคอลที่รองรับ: <code>$1</code> (ค่าโดยปริยายเป็น http:// หากไม่ระบุโพรโทคอล)',
+{PLURAL:$2|โพรโทคอล}}ที่รองรับ: <code>$1</code> (ค่าโดยปริยายเป็น http:// หากไม่ระบุโพรโทคอล)',
 'linksearch-line' => '$1 ถูกลิงก์จาก $2',
 'linksearch-error' => 'อักขระตัวแทนอยู่ได้เฉพาะหน้าชื่อโฮสต์เท่านั้น',
 
@@ -2140,7 +2152,8 @@ $1',
 'listgrouprights' => 'สิทธิกลุ่มผู้ใช้',
 'listgrouprights-summary' => 'ด้านล่างเป็นรายการกลุ่มผู้ใช้ที่นิยามบนวิกินี้ และสิทธิการเข้าถึงที่เกี่ยวข้อง
 อาจมี[[{{MediaWiki:Listgrouprights-helppage}}|ข้อมูลเพิ่มเติม]]เกี่ยวกับสิทธิหนึ่ง ๆ',
-'listgrouprights-key' => '* <span class="listgrouprights-granted">สิทธิที่ได้รับแต่งตั้ง</span>
+'listgrouprights-key' => 'คำอธิบาย:
+* <span class="listgrouprights-granted">สิทธิที่ได้รับแต่งตั้ง</span>
 * <span class="listgrouprights-revoked">สิทธิที่ถูกเพิกถอน</span>',
 'listgrouprights-group' => 'กลุ่ม',
 'listgrouprights-rights' => 'สิทธิ',
@@ -2212,7 +2225,7 @@ $1',
 'notvisiblerev' => 'รุ่นล่าสุดโดยผู้ใช้อีกคนถูกลบแล้ว',
 'watchlist-details' => 'มี $1 หน้าในรายการเฝ้าดูของคุณ ไม่รวมหน้าอภิปราย',
 'wlheader-enotif' => 'การแจ้งเตือนผ่านอีเมลถูกเปิดใช้งาน',
-'wlheader-showupdated' => "หà¸\99à¹\89าà¸\97ีà¹\88มีà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88à¸\81ารà¹\80à¸\82à¹\89าà¸\8aมà¸\84รัà¹\89à¸\87ลà¹\88าสุà¸\94à¸\82อà¸\87à¸\84ุà¸\93แสดงใน'''ตัวหนา'''",
+'wlheader-showupdated' => "หà¸\99à¹\89าà¸\97ีà¹\88มีà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88à¸\84ุà¸\93à¹\80à¸\82à¹\89าà¸\8aมลà¹\88าสุà¸\94แสดงใน'''ตัวหนา'''",
 'watchmethod-recent' => 'ตรวจสอบการปรับปรุงล่าสุดกับหน้าเฝ้าดู',
 'watchmethod-list' => 'ตรวจสอบหน้าเฝ้าดูกับการแก้ไขล่าสุด',
 'watchlistcontains' => 'รายการเฝ้าดูของคุณมี $1 หน้า',
@@ -2976,7 +2989,7 @@ $1',
 'pageinfo-length' => 'ความยาวหน้า (ไบต์)',
 'pageinfo-article-id' => 'หมายเลขประจำหน้า',
 'pageinfo-language' => 'ภาษาเนื้อหาของหน้า',
-'pageinfo-robot-policy' => 'สà¸\96าà¸\99ะà¹\80สิรà¹\8cà¸\8aà¹\80อà¸\99à¸\88ิà¸\99',
+'pageinfo-robot-policy' => 'à¸\81ารà¸\97ำà¸\94ัà¸\8aà¸\99ีà¹\82à¸\94ยà¸\9aอà¸\95',
 'pageinfo-robot-index' => 'อนุญาต',
 'pageinfo-robot-noindex' => 'ไม่อนุญาต',
 'pageinfo-views' => 'จำนวนการเข้าดู',
@@ -2999,7 +3012,9 @@ $1',
 'pageinfo-redirectsto' => 'เปลี่ยนทางไปยัง',
 'pageinfo-contentpage' => 'นับเป็นหน้าเนื้อหา',
 'pageinfo-contentpage-yes' => 'ใช่',
+'pageinfo-protect-cascading' => 'การล็อกที่สืบทอดจากหน้านี้',
 'pageinfo-protect-cascading-yes' => 'ใช่',
+'pageinfo-protect-cascading-from' => 'การล็อกที่สืบทอดมายังหน้านี้',
 'pageinfo-category-info' => 'ข้อมูลหมวดหมู่',
 'pageinfo-category-pages' => 'จำนวนหน้า',
 'pageinfo-category-subcats' => 'จำนวนหมวดหมู่ย่อย',
@@ -3637,6 +3652,18 @@ $5
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath เส้นทางบทความ]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath เส้นทางสคริปต์]',
 
+# Special:Redirect
+'redirect' => 'การเปลี่ยนทางตามชื่อไฟล์ รหัสประจำผู้ใช้หรือรุ่น',
+'redirect-legend' => 'การเปลี่ยนทางไปยังไฟล์หรือหน้า',
+'redirect-summary' => 'หน้าพิเศษนี้เปลี่ยนทางไปยังไฟล์ (ระบุเป็นชื่อไฟล์) หน้า (ระบุเป็นรหัสรุ่น) หรือหน้าผู้ใช้ (ระบุเป็นรหัสผู้ใช้)',
+'redirect-submit' => 'ไป',
+'redirect-lookup' => 'ค้นดู:',
+'redirect-value' => 'ค่า:',
+'redirect-user' => 'รหัสผู้ใช้',
+'redirect-revision' => 'รุ่นหน้า',
+'redirect-file' => 'ชื่อไฟล์',
+'redirect-not-exists' => 'ไม่พบค่า',
+
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ค้นหาไฟล์ที่ซ้ำซ้อน',
 'fileduplicatesearch-summary' => 'ค้นหาไฟล์ที่ซ้ำกันตามค่าแฮช',
@@ -3764,6 +3791,9 @@ $5
 'logentry-newusers-create2' => 'บัญชีผู้ใช้ $3 ถูกสร้างขึ้นโดย $1',
 'logentry-newusers-byemail' => 'บัญชีผู้ใช้ $3 ถูกสร้างขึ้นโดย $1 และส่งรหัสผ่านไปทางอีเมลแล้ว',
 'logentry-newusers-autocreate' => 'บัญชีผู้ใช้ $1 ถูกสร้างขึ้นอัตโนมัติ',
+'logentry-rights-rights' => '$1 {{GENDER:$2|เปลี่ยน}}กลุ่มสมาชิกของ $3 จาก $4 เป็น $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|เปลี่ยน}}กลุ่มสมาชิกของ $3',
+'logentry-rights-autopromote' => '$1 ได้รับการ{{GENDER:$2|เลื่อนกลุ่ม}}จาก $4 เป็น $5 อัตโนมัติ',
 'rightsnone' => '(ไม่มี)',
 
 # Feedback
index 682119e..883d326 100644 (file)
@@ -2677,7 +2677,7 @@ Sa mga kasong ganoon, kailangan mong ilipat o pagsamahin/pagsanibin ang pahina s
 pangalang pinili mo ay hindi tanggap.
 Pumili muli ng ibang pangalan.',
 'cantmove-titleprotected' => 'Hindi mo malilipatan ang isang pahina sa lokasyong ito, dahil nakasanggalang sa paglikha ang baong pamagat',
-'talkexists' => "'''Tagumpay na nailipat ang pahina mismo, ngunit hindi mailipat ang pahina ng usapan dahil mayroon ng ganito sa bagong pamagat. Ipagsama ito sa manwal na paraan.'''",
+'talkexists' => "'''Matagumpay na nailipat ang pahina mismo, ngunit hindi mailipat ang pahinang usapan dahil may ganito na sa bagong pamagat.  Mangyaring isanib ito nang manwal.'''",
 'movedto' => 'inilipat sa',
 'movetalk' => 'Ilipat ang kaugnay na pahinang usapan',
 'move-subpages' => 'Ilipat ang kabahaging mga pahina (hanggang sa $1)',
@@ -3605,7 +3605,7 @@ $8',
 'confirmemail_text' => "Pinagagawa ng {{SITENAME}} na patotohanan mo ang iyong adres ng e-liham bago gamitin ang mga kasangkapang-katangian ng e-liham.  Pindutin at buhayin ang pindutan sa ibaba para makapagpadala ng isang makapagpapatotoong e-liham (kompirmasyon) patungo sa iyong adres.
 Makakasama sa liham ang isang kawing na naglalaman ng kodigo;
 Ikarga ang kawing sa iyong pantingin-tingin (''browser'') para mapatotohanang katanggap-tanggap ang iyong adres ng e-liham.",
-'confirmemail_pending' => 'Naipadala na sa iyong e-liham ang kodigo ng pagpapatotoo (kumpirmasyon); kung kamakailan mo lamang nilikha ang iyong kuwenta/akawnt, maaaring ibigin mong maghintay ng ilang minuto para makarating muna ito bago subuking humiling ng isang bagong kodigo.',
+'confirmemail_pending' => 'Naipadala na sa iyong e-liham ang kodigo ng pagpapatotoo (kumpirmasyon); kung kamakailan mo lamang nilikha ang iyong kuwenta, maaaring ibigin mong maghintay ng ilang minuto para makarating muna ito bago subuking humiling ng isang bagong kodigo.',
 'confirmemail_send' => 'Magpadala ng isang kodigo ng pagpapatotoo (kumpirmasyon)',
 'confirmemail_sent' => 'Naipadala na ang magpapatotoong e-liham (kumpirmasyon).',
 'confirmemail_oncreate' => 'Nagpadala na ng isang kodigo ng pagpapatotoo (kumpirmasyon) patungo sa iyong adres ng e-liham.  Hindi kailangan ang kodigong ito para makalagda, ngunit kailangan mong ibigay muna ito bago paganahin/paandarin ang anumang pang e-liham na kasangkapang-katangiang nasa loob ng wiki.',
@@ -3619,19 +3619,19 @@ Ibinalik ng tagapagpadala ang: $1',
 'confirmemail_loggedin' => 'Natiyak na ngayon ang tirahan ng e-liham mo.',
 'confirmemail_error' => 'May nangyaring kamalian sa pagsasagip ng iyong kumpirmasyon.',
 'confirmemail_subject' => 'Kumpirmasyon/pagpapatotoong pang-adres ng e-liham ng {{SITENAME}}',
-'confirmemail_body' => 'May isa, maaaring ikaw, na mula sa adres ng IP na $1,
-ang nagtala ng isang akawnt/kuwentang "$2" na mayroong ganitong adres ng e-liham sa {{SITENAME}}.
+'confirmemail_body' => 'May isa, maaaring ikaw, na mula sa direksiyong IP na $1,
+ang nagtala ng isang kuwentang "$2" na mayroong ganitong direksiyong e-liham sa {{SITENAME}}.
 
-Para patotohanang ikaw nga ang may-ari ng kuwentang ito at para buhayin ang mga kasangkapang-katanginan ng e-liham sa {{SITENAME}}, buksan ang kawing na ito sa iyong pantingin-tingin (\'\'browser\'\'):
+Para patotohanang ikaw nga ang may-ari ng kuwentang ito at para buhayin ang mga kasangkapang-katanginan ng e-liham sa {{SITENAME}}, buksan ang kawing na ito sa iyong pambasa-basa (\'\'browser\'\'):
 
 $3
 
-Kung *hindi* mo itinala/inirehistro ang kuwenta, sundan mo ang kawing na ito
-para kanselahin o huwag nang ituloy ang pagpapatotoo (kumpirmasyon) ng adres ng e-liham:
+Kung *hindi* mo itinala ang kuwenta, sundan mo ang kawing na ito
+para kanselahin o huwag nang ituloy ang pagpapatotoo (kumpirmasyon) ng direksiyong e-liham:
 
 $5
 
-Magwawakas ang pagiging mabisa ng kodigo ng pagpapatotoong ito sa $4.',
+Magwawalang-saysay ang kodigo ng pagpapatotoong ito sa $4.',
 'confirmemail_body_changed' => 'May isa, maaaring ikaw, na mula sa adres ng IP na $1,
 ang nagbago ng adres ng e-liham ng akawnt na "$2" sa ganitong adres sa {{SITENAME}}.
 
@@ -3749,7 +3749,8 @@ Pakitiyak kung ibig mo talagang likhain muli ang pahinang ito.",
 'livepreview-loading' => 'Ikinakarga...',
 'livepreview-ready' => 'Ikinakarga… Handa na!',
 'livepreview-failed' => 'Nabigo ang umiiral na paunang tingin!  Subukan ang normal/pangkaraniwang paunang tingin.',
-'livepreview-error' => 'Hindi tagumpay ang pagkabit (connect): $1 "$2". Subukan ang karaniwang paunang tingin.',
+'livepreview-error' => 'Hindi matagumpay ang pagkonekta: $1 "$2".
+Subukan ang karaniwang paunang tingin.',
 
 # Friendlier slave lag warnings
 'lag-warn-normal' => 'Maaaring hindi naipapakita sa talaang ito ang mga pagbabagong mas bago pa kaysa $1 {{PLURAL:$1|segundo|mga segundo}}.',
index ddf05f2..b0ae349 100644 (file)
@@ -359,12 +359,12 @@ $messages = array(
 'tog-hidepatrolled' => 'Son değişikliklerde gözden geçirilen düzenlemeleri gizle',
 'tog-newpageshidepatrolled' => 'Kontrol edilmiş sayfaları yeni sayfalar listesinde gizle',
 'tog-extendwatchlist' => 'İzleme listesini sadece en son değil, tüm değişiklikleri göstermek için genişlet',
-'tog-usenewrc' => 'Son değişiklikler sayfasındaki ve izleme listesindeki değişiklikleri gruplandırma (JavaScript gerektirir)',
+'tog-usenewrc' => 'Son değişiklikler sayfasındaki ve izleme listesindeki değişiklikleri gruplandırma',
 'tog-numberheadings' => 'Başlıkları otomatik numaralandır',
-'tog-showtoolbar' => 'Düzenleme yaparken araç çubuğunu göster (JavaScript gerektirir)',
-'tog-editondblclick' => 'Çift tıklayarak sayfaları düzenle (JavaScript gerektirir)',
+'tog-showtoolbar' => 'Düzenleme yaparken araç çubuğunu göster',
+'tog-editondblclick' => 'Çift tıklayarak sayfaları düzenle',
 'tog-editsection' => 'Bölümleri [{{int:Editsection}}] bağlantıları ile düzenlemeyi etkinleştir',
-'tog-editsectiononrightclick' => 'Bölüm başlığına sağ tıklayarak bölümleri düzenleyebilme olanağı ver (JavaScript gerektirir)',
+'tog-editsectiononrightclick' => 'Bölüm başlığına sağ tıklayarak bölümleri düzenleyebilme olanağı ver',
 'tog-showtoc' => 'İçindekiler tablosunu göster (3 taneden fazla başlığı olan sayfalar için)',
 'tog-rememberpassword' => 'Girişimi bu tarayıcıda hatırla (en fazla $1 {{PLURAL:$1|gün|gün}} için)',
 'tog-watchcreations' => 'Açtığım sayfaları ve yüklediğim dosyaları izleme listeme ekle',
@@ -382,7 +382,7 @@ $messages = array(
 'tog-shownumberswatching' => 'İzleyen kullanıcı sayısını göster',
 'tog-oldsig' => 'Mevcut imza:',
 'tog-fancysig' => 'İmzaya vikimetin muamelesi yap (otomatik bir bağlantı olmadan)',
-'tog-uselivepreview' => 'Canlı ön izlemeyi kullan (JavaScript gerektirir ve özellik deneme aşamasındadır)',
+'tog-uselivepreview' => 'Canlı önizlemeyi kullan (deneysel)',
 'tog-forceeditsummary' => 'Özeti boş bıraktığımda beni uyar',
 'tog-watchlisthideown' => 'İzleme listemden düzenlemelerimi gizle',
 'tog-watchlisthidebots' => 'İzleme listemden bot değişikliklerini gizle',
@@ -497,7 +497,7 @@ $messages = array(
 'newwindow' => '(yeni bir pencerede açılır)',
 'cancel' => 'İptal',
 'moredotdotdot' => 'Daha...',
-'morenotlisted' => 'Listede daha fazlası yok...',
+'morenotlisted' => 'Bu liste tam değildir.',
 'mypage' => 'Sayfa',
 'mytalk' => 'Mesaj',
 'anontalk' => "Bu IP'nin iletileri",
@@ -684,6 +684,12 @@ Bu, {{SITENAME}} sitesindeki bir hatayı da belirtebilir.",
 # General errors
 'error' => 'Hata',
 'databaseerror' => 'Veritabanı hatası',
+'databaseerror-text' => 'Bir veritabanı sorgu hatası oluştu.
+Bu yazılım bir hata gösteriyor olabilir.',
+'databaseerror-textcl' => 'Bir veritabanı sorgu hatası oluştu.',
+'databaseerror-query' => 'Sorgu: $1',
+'databaseerror-function' => 'Fonksiyon: $1',
+'databaseerror-error' => 'Hata: $1',
 'laggedslavemode' => 'Uyarı: Sayfa son güncellemeleri içermeyebilir.',
 'readonly' => 'Veritabanı kilitlendi',
 'enterlockreason' => 'Koruma için bir neden belirtin. Korumanın ne zaman kaldırılacağına dair tahmini bir tarih eklemeyi unutmayın.',
@@ -698,7 +704,7 @@ Eğer neden bu değilse yazılımda bir hata ile karşılaşmış olabilirsiniz.
 Lütfen URL\'yi not ederek bunu bir [[Special:ListUsers/sysop|hizmetliye]] iletin.',
 'missingarticle-rev' => '(revizyon#: $1)',
 'missingarticle-diff' => '(Fark: $1, $2)',
-'readonly_lag' => 'Yedek sunucular ana sunucu ile güncellemeye çalışırken veritabanı otomatik olarak kilitlendi.',
+'readonly_lag' => 'Yedek sunucular ana sunucu ile güncellenmeye çalışılırken veritabanı otomatik olarak kilitlendi.',
 'internalerror' => 'Yazılım hatası',
 'internalerror_info' => 'İç hata: $1',
 'fileappenderrorread' => 'Ekleme yapılırken "$1" okunamadı.',
@@ -711,7 +717,7 @@ Lütfen URL\'yi not ederek bunu bir [[Special:ListUsers/sysop|hizmetliye]] ileti
 'fileexistserror' => '"$1" dosyasına yazılamadı: dosya zaten mevcut',
 'unexpected' => 'beklenmeyen değer: "$1"="$2".',
 'formerror' => 'Hata: Form gönderilemiyor',
-'badarticleerror' => 'Yapmak istediğiniz işlem geçersizdir.',
+'badarticleerror' => 'Bu işlem, bu sayfada yapılamaz.',
 'cannotdelete' => '"$1" sayfa ya da dosyası silinemedi.
 Başka bir kullanıcı tarafından silinmiş olabilir.',
 'cannotdelete-title' => '"$1" sayfasını silemezsiniz',
@@ -961,18 +967,18 @@ Geçici şifre: $2',
 'changeemail-cancel' => 'İptal',
 
 # Special:ResetTokens
-'resettokens' => 'Belirteçleri sıfırla',
-'resettokens-text' => 'Burada hesabınızla ilişkili bazı özel verilere erişim izin belirteçleri sıfırlayabilirsiniz.
+'resettokens' => 'Anahtarları sıfırla',
+'resettokens-text' => 'Burada hesabınızla ilişkili bazı özel verilere erişim izin anahtarları sıfırlayabilirsiniz.
 
 
 Siz yanlışlıkla bunları paylaştıysanız veya hesabınızda bir bozulma varsa bunu yapmalısınız.',
 'resettokens-no-tokens' => 'Sıfırlamak için hiç bir belirteç bulunmuyor.',
-'resettokens-legend' => 'Belirteçleri sıfırla',
+'resettokens-legend' => 'Anahtarları sıfırla',
 'resettokens-tokens' => 'Belirteçler:',
 'resettokens-token-label' => '$1 (geçerli değer: $2)',
-'resettokens-watchlist-token' => 'İzleme listesi web beslemesi belirteci',
+'resettokens-watchlist-token' => '[[Special:Watchlist|İzleme listenizdeki sayfa değişiklikleri]] için web beslemeleri (Atom/RSS) anahtarı',
 'resettokens-done' => 'Belirteçler sıfırlandı.',
-'resettokens-resetbutton' => 'Seçili belirteçleri sıfırla',
+'resettokens-resetbutton' => 'Seçili anahtarları sıfırla',
 
 # Edit page toolbar
 'bold_sample' => 'Kalın yazı',
@@ -1468,7 +1474,7 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
 'datedefault' => 'Tercih yok',
 'prefs-beta' => 'Beta özellikleri',
 'prefs-datetime' => 'Tarih ve saat',
-'prefs-labs' => 'Lab özellikleri',
+'prefs-labs' => 'Deneysel özellikler',
 'prefs-user-pages' => 'Kullanıcı sayfaları',
 'prefs-personal' => 'Kullanıcı bilgileri',
 'prefs-rc' => 'Son değişiklikler',
@@ -1477,7 +1483,7 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
 'prefs-watchlist-days-max' => 'en fazla $1 {{PLURAL:$1|gün|gün}}',
 'prefs-watchlist-edits' => 'Genişletilmiş izleme listesinde gösterilecek değişiklik sayısı:',
 'prefs-watchlist-edits-max' => 'En fazla sayı: 1000',
-'prefs-watchlist-token' => 'İzleme listesi nişanı:',
+'prefs-watchlist-token' => 'İzleme listesi anahtarı:',
 'prefs-misc' => 'Diğer ayarlar',
 'prefs-resetpass' => 'Parolayı değiştir',
 'prefs-changeemail' => "E-posta'yı değiştir",
@@ -1498,6 +1504,7 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
 'recentchangesdays-max' => '(en fazla $1 {{PLURAL:$1|gün|gün}})',
 'recentchangescount' => 'Varsayılan olarak gösterilecek değişiklik sayısı:',
 'prefs-help-recentchangescount' => 'Bu, son değişiklikleri, sayfa geçmişlerini ve günlükleri içerir.',
+'prefs-help-watchlist-token2' => 'Bu izleme listenizin gizli anahtarıdır. Anahtarı bilen herkes izleme listenizi görebilir. Bu nedenle kimseyle paylaşmayın. [[Special:ResetTokens|Bu anahtarı sıfırlamak isterseniz buraya tıklayın]].',
 'savedprefs' => 'Tercihleriniz kaydedildi.',
 'timezonelegend' => 'Zaman dilimi:',
 'localtime' => 'Yerel saat:',
@@ -1524,7 +1531,7 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
 'prefs-files' => 'Dosyalar',
 'prefs-custom-css' => 'Özel CSS',
 'prefs-custom-js' => 'Özel JS',
-'prefs-common-css-js' => 'Tüm kaplamalar için paylaşılan CSS/JS:',
+'prefs-common-css-js' => 'Tüm temalar için paylaşılan CSS/JS:',
 'prefs-reset-intro' => 'Bu sayfayı tercihlerinizi site varsayılanına döndürmek için kullanabilirsiniz. Bu geri alınamaz.',
 'prefs-emailconfirm-label' => 'E-posta doğrulaması:',
 'youremail' => 'E-posta:',
@@ -1541,11 +1548,13 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
 'badsig' => 'Geçersiz ham imza; HTML etiketlerini kontrol edin.',
 'badsiglength' => 'İmzanız çok uzun.
 $1 {{PLURAL:$1|karakterin|karakterin}} altında olmalı.',
-'yourgender' => 'Cinsiyet:',
-'gender-unknown' => 'Belirtilmemiş',
-'gender-male' => 'Erkek',
+'yourgender' => 'Nasıl açıklamayı tercih edersiniz?',
+'gender-unknown' => 'Söylemek istemiyorsanız',
+'gender-male' => 'Wiki düzenlemelerinde kadın olarak',
 'gender-female' => 'Bayan',
-'prefs-help-gender' => 'İsteğe bağlı: Yazılım tarafından doğru cinsiyet adreslemesi için kullanılır. Bu bilgi umumi olacaktır.',
+'prefs-help-gender' => 'Bu tercih ayarı isteğe bağlıdır.
+Yazılımda söz değerlerinin başlarında bulunan cinsiyete uygun gramerler için kullanılır.
+Bu bilgiler herkes tarafından görülebilir.',
 'email' => 'E-posta',
 'prefs-help-realname' => '* Gerçek isim (isteğe bağlı): eğer gerçek isminizi vermeyi seçerseniz, çalışmanızı size atfederken kullanılacaktır.',
 'prefs-help-email' => 'E-posta adresi isteğe bağlıdır; ancak parolanızı unutmanız durumunda parola sıfırlamak için gerekecektir.',
@@ -1556,8 +1565,10 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
 'prefs-i18n' => 'Uluslararasılaştırma',
 'prefs-signature' => 'İmza',
 'prefs-dateformat' => 'Tarih biçemi',
-'prefs-timeoffset' => 'Zaman ofseti',
+'prefs-timeoffset' => 'Saat farkı',
 'prefs-advancedediting' => 'Genel seçenekler',
+'prefs-editor' => 'Editör',
+'prefs-preview' => 'Önizleme',
 'prefs-advancedrc' => 'Gelişmiş seçenekler',
 'prefs-advancedrendering' => 'Gelişmiş seçenekler',
 'prefs-advancedsearchoptions' => 'Gelişmiş seçenekler',
@@ -1565,6 +1576,7 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
 'prefs-displayrc' => 'Görüntü seçenekleri',
 'prefs-displaysearchoptions' => 'Görüntüleme seçenekleri',
 'prefs-displaywatchlist' => 'Görüntüleme seçenekleri',
+'prefs-tokenwatchlist' => 'Anahtar',
 'prefs-diffs' => 'Farklar',
 
 # User preference: email validation using jQuery
@@ -2095,6 +2107,10 @@ Dosya açıklamasını düzenlemek isterseniz, [$2 dosya açıklama sayfası] bu
 'randompage' => 'Rastgele sayfa',
 'randompage-nopages' => 'Şu {{PLURAL:$2|ad alanında|ad alanlarında}} hiç bir sayfa yok: $1.',
 
+# Random page in category
+'randomincategory' => 'Kategoriye göre rastgele sayfa',
+'randomincategory-selectcategory' => 'Rastgele sayfa alınacak kategori: $1 $2.',
+
 # Random redirect
 'randomredirect' => 'Rastgele yönlendirme',
 'randomredirect-nopages' => '"$1" ad alanında hiç bir yönlendirme yok.',
@@ -2120,6 +2136,8 @@ Dosya açıklamasını düzenlemek isterseniz, [$2 dosya açıklama sayfası] bu
 'statistics-users-active-desc' => 'Son {{PLURAL:$1|gün|$1 günde}} çalışma yapan kullanıcılar',
 'statistics-mostpopular' => 'En çok ziyaret edilen sayfalar',
 
+'pageswithprop' => 'Bir sayfa özelliğine sahip sayfalar',
+'pageswithprop-text' => 'Bu sayfa belirli bir sayfa özelliğini kullanan sayfaları listeler.',
 'pageswithprop-submit' => 'Git',
 
 'doubleredirects' => 'Çift yönlendirmeler',
@@ -2220,7 +2238,7 @@ Lütfen unutmayın ki, diğer web siteleri bir dosyaya doğrudan bir URL ile ba
 'specialloguserlabel' => 'Kullanıcı:',
 'speciallogtitlelabel' => 'Hedef (başlık ya da kullanıcı):',
 'log' => 'Kayıtlar',
-'all-logs-page' => 'Tüm umumi kayıtlar',
+'all-logs-page' => 'Tüm ortak günlükler',
 'alllogstext' => '{{SITENAME}} için mevcut tüm günlüklerin birleşik gösterimi.
 Günlük tipini, kullanıcı adını (büyük-küçük harf duyarlı), ya da etkilenen sayfayı (yine büyük-küçük harf duyarlı) seçerek görünümü daraltabilirsiniz.',
 'logempty' => 'Kayıtlarda eşleşen bilgi yok.',
@@ -3391,6 +3409,7 @@ Diğerleri varsayılan olarak gizlenecektir.
 'exif-headline' => 'Başlık',
 'exif-credit' => 'Sağlayıcı',
 'exif-source' => 'Kaynak',
+'exif-editstatus' => 'Görüntünün yayın durumu',
 'exif-urgency' => 'Aciliyet',
 'exif-fixtureidentifier' => 'Fikstür adı',
 'exif-locationdest' => 'Yerin konumu',
@@ -3861,10 +3880,14 @@ Bu programla birlikte [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU Genel Kamu Lisansın
 'version-entrypoints-header-url' => 'URL',
 
 # Special:Redirect
+'redirect' => 'Dosya, kullanıcı veya sayfa ID yönlendirme',
+'redirect-legend' => 'Bir dosya veya sayfaya yönlendirme',
+'redirect-summary' => "Bu özel sayfa sizi bir dosya (dosya adı verilen), bir sayfa (bir revizyon ID'si verilen) veya bir kullanıcı sayfasının (sayısal kullanıcı kimliği verilen) adresine yönlendirir.",
 'redirect-submit' => 'Git',
 'redirect-value' => 'Değer:',
 'redirect-user' => 'Kullanıcı kimliği',
 'redirect-file' => 'Dosya adı',
+'redirect-not-exists' => 'Değer bulunamadı',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Benzer dosyaları ara',
@@ -4007,7 +4030,7 @@ Bu programla birlikte [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU Genel Kamu Lisansın
 
 # API errors
 'api-error-badaccess-groups' => 'Bu wiki için dosya yüklemenize izin verilmiyor.',
-'api-error-badtoken' => 'İç hata: Bozuk simge.',
+'api-error-badtoken' => 'İç hata: Bozuk anahtar.',
 'api-error-duplicate-popup-title' => 'Çift {{PLURAL:$1|dosya|dosya}}',
 'api-error-empty-file' => 'Gönderdiğiniz dosya boş.',
 'api-error-emptypage' => 'Yeni, boş bir sayfa oluşturmaya izin verilmez.',
index 7925185..8a1d47e 100644 (file)
@@ -233,7 +233,7 @@ $messages = array(
 'vector-action-undelete' => 'Эгидер',
 'vector-action-unprotect' => 'Камгалалды өскертири',
 'vector-view-create' => 'Чаяары',
-'vector-view-edit' => 'Эдери',
+'vector-view-edit' => 'Эдер',
 'vector-view-history' => 'Төөгүнү көөрү',
 'vector-view-view' => 'Номчуур',
 'vector-view-viewsource' => 'Дөзү бижиин көөрү',
@@ -255,7 +255,7 @@ $messages = array(
 'permalink' => 'Турум холбаа',
 'print' => 'Саазынга үндүрер',
 'view' => 'Көөрү',
-'edit' => 'Эдери',
+'edit' => 'Эдер',
 'create' => 'Чогаадыры',
 'editthispage' => 'Бо арынны өскертири',
 'create-this-page' => 'Бо арынны чогаадыры',
@@ -510,11 +510,11 @@ Please check if you want to create/edit this page.',
 'previewnote' => "'''Бо чүгле шенеп көөрү-дүр.'''
 Бижик ам-даа шыгжатынмаан!",
 'editing' => '«$1» деп арынны эдери',
-'editingsection' => '«$1» деп арынның салбырын эдери',
+'editingsection' => 'Эдилге: «$1» (үлеш)',
 'editingcomment' => '«$1» деп арынны өскертип турар (чаа салбыр)',
 'yourtext' => 'Силерниң сөзүглелиңер',
 'yourdiff' => 'Ылгалдар',
-'templatesused' => 'Бо арында {{PLURAL:$1|Майык|Майыктар}} ажыглаттырган:',
+'templatesused' => 'Бо арында ажыглаан {{PLURAL:$1|Майык|Майыктар}}:',
 'template-protected' => '(камгалаан)',
 'template-semiprotected' => '(четпес камгалаан)',
 'hiddencategories' => 'Бо арын {{PLURAL:$1|$1 чажыт бөлүкке}} хамааржыр:',
@@ -733,7 +733,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'бо арынны номчууру',
-'action-edit' => 'бо арынны эдери',
+'action-edit' => 'бо арынның эдилгези',
 'action-createpage' => 'арыннарны чогаадыры',
 'action-createtalk' => 'чугаалажырга арыннарны чогаадыры',
 'action-createaccount' => 'бо бүрүткел бижиктерин бүдүрери',
@@ -1319,7 +1319,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'table_pager_empty' => 'Түңнеллер чок',
 
 # Auto-summaries
-'autosumm-new' => 'Чаа арынны чогаадаан: «$1»',
+'autosumm-new' => 'Чаа арын чаяатынган: «$1»',
 
 # Watchlist editor
 'watchlistedit-normal-title' => 'Хайгаарал даңзыны өскертири',
index cac41e5..caaf42c 100644 (file)
@@ -22,6 +22,7 @@
  * @author Base
  * @author Dim Grits
  * @author DixonD
+ * @author DonDrakon
  * @author Dubyk
  * @author EugeneZelenko
  * @author Geitost
@@ -398,7 +399,7 @@ $messages = array(
 'tog-watchlisthidebots' => 'Приховати редагування ботів у списку спостереження',
 'tog-watchlisthideminor' => 'Приховати незначні редагування у списку спостереження',
 'tog-watchlisthideliu' => 'Приховати редагування зареєстрованих дописувачів у списку спостереження',
-'tog-watchlisthideanons' => 'Приховати редагування анонімів у списку спостереження',
+'tog-watchlisthideanons' => 'Приховати редагування анонімних користувачів у списку спостереження',
 'tog-watchlisthidepatrolled' => 'Приховувати патрульовані редагування у списку спостереження',
 'tog-ccmeonemails' => 'Надсилати мені копії листів, які я надсилаю іншим користувачам',
 'tog-diffonly' => 'Не показувати вміст сторінки під різницею версій',
@@ -613,7 +614,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' => 'Про {{grammar:accusative|{{SITENAME}}}}',
 'aboutpage' => 'Project:Про',
-'copyright' => 'Ð\92мÑ\96Ñ\81Ñ\82 Ð´Ð¾Ñ\81Ñ\82Ñ\83пний Ð·Ð³Ñ\96дно Ð· $1.',
+'copyright' => 'Ð\92мÑ\96Ñ\81Ñ\82 Ð´Ð¾Ñ\81Ñ\82Ñ\83пний Ð½Ð° Ñ\83моваÑ\85 $1, Ñ\8fкÑ\89о Ð½Ðµ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾ Ñ\96нÑ\88е.',
 'copyrightpage' => '{{ns:project}}:Авторське право',
 'currentevents' => 'Поточні події',
 'currentevents-url' => 'Project:Поточні події',
index b016193..03321d2 100644 (file)
@@ -783,8 +783,8 @@ Mugomad argumentad čutihe.",
 Znamoičendad: '''({{int:cur}})''' = erod nügüdläižes versijaspäi, '''({{int:last}})''' = erod enččes vepsijaspäi, '''{{int:minoreditletter}}''' = pen' toižetuz.",
 'history-fieldset-title' => 'Lehtelta istorii',
 'history-show-deleted' => 'Vaiše čutud',
-'histfirst' => 'Kaikiš vanhembad',
-'histlast' => 'Tantoižed',
+'histfirst' => 'vanhembad',
+'histlast' => 'udembad',
 'historysize' => '({{PLURAL:$1|1 bait|$1 baitad}})',
 'historyempty' => "(pall'az)",
 
@@ -1251,7 +1251,7 @@ Ku tö kirjutat sen, nece nimi kävutadas, miše ozutada lehtpolen toižetajad.'
 'rc-change-size' => '$1',
 'rc-change-size-new' => "$1 {{PLURAL:$1|bait|baitad}} jäl'ges toižetamišt",
 'newsectionsummary' => "/* $1 */ uz' jaguz",
-'rc-enhanced-expand' => 'Ozutada detalid (JavaScript)',
+'rc-enhanced-expand' => 'Ozutada detalid',
 'rc-enhanced-hide' => 'Peitta detalid',
 'rc-old-title' => 'Om sätud ezmässai kut "$1"',
 
@@ -1937,7 +1937,7 @@ $1',
 'contributions-title' => '$1-kävutajan tond',
 'mycontris' => 'Minun tond',
 'contribsub2' => '$1-kävutajan ($2) tond',
-'uctop' => "(jäl'gmäine)",
+'uctop' => '(nügüdläine)',
 'month' => 'Ku:',
 'year' => 'Voz’:',
 
index a2614eb..8cad007 100644 (file)
@@ -173,6 +173,7 @@ $messages = array(
 'vector-view-history' => 'Wärsjoonsfolche',
 'vector-view-view' => 'Leesn',
 'vector-view-viewsource' => 'Gwäl-dhägsd ôôgugn',
+'actions' => 'Aggdsione',
 'namespaces' => 'Nôômsrajm',
 'variants' => 'Warjandn',
 
@@ -239,6 +240,7 @@ $1",
 'copyright' => 'Was hiir schdäd däfmâr benudsn nach $1',
 'copyrightpage' => '{{ns:project}}:Uurheewâr-rächde',
 'currentevents' => 'Was grôôd basiird is',
+'currentevents-url' => 'Project:Aggduelle Ereichnisse',
 'disclaimers' => 'Imbräsum',
 'disclaimerpage' => 'Project:Imbräsum',
 'edithelp' => 'Hilfe dsum beärbâdn',
@@ -405,6 +407,10 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'hiddencategories' => 'Dii sajdn ghäärd dsu {{PLURAL:$1|aanâr fârschdegdn|$1 fârschdegde}} ghadegoriin:',
 'permissionserrorstext-withaction' => 'Du däfsd ned $2, des{{PLURAL:$1||}}dâsweechn:',
 
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => "'''Obachd:''' dii Gräiß vo dii ajbundna Vorlââng is zgrouß, ajniche Vorlââng kenna ned ajbundn wärrn.",
+'post-expand-template-inclusion-category' => 'Sajdn, ba denne vo dii ajbundna Vorlââng dii Gräiß üba da gräißdmöchlichn Gräiß iss',
+
 # History pages
 'viewpagelogs' => 'Logbicher fär dii sajdn dsajchn',
 'currentrev-asof' => 'Jedsiche wärsjoon, am $2 um $3 gmachd',
@@ -445,6 +451,10 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'prevn' => '{{PLURAL:$1|foorichâr|fooriche $1}}',
 'nextn' => '{{PLURAL:$1|nägschdâr|nägschde $1}}',
 'viewprevnext' => 'Dsajch ($1 {{int:pipe-separator}} $2) ($3)',
+'searchprofile-articles' => 'Sajdn dii ann Inhald zajng',
+'searchprofile-images' => 'Muldimedjâ',
+'searchprofile-everything' => 'Âlls',
+'searchprofile-advanced' => 'Erwajderd',
 'search-result-size' => '$1 ({{PLURAL:$2|1 wôrd|$2 wärdâr}})',
 'search-result-score' => 'Âjschleechich: $1 %',
 'search-redirect' => '(Wajdalajdung fon „$1“ häa)',
@@ -603,6 +613,9 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].",
 'sharedupload-desc-there' => 'Dii dadaj ghumd fon $1, un mr däf se fir andârâ brojägd aa nemâ. Genauârs schded uf dr [$2 beschrajwungssajdâ fon dr dadaj].',
 'uploadnewversion-linktext' => ' naje wärsjoon fo derä dadaj nauflôôdn',
 
+# Random page
+'randompage' => 'Zufälliche Sajdn',
+
 # Statistics
 'statistics' => 'Schdadisdig',
 
@@ -860,6 +873,7 @@ Bidde gug's mi´m foorschau-gnobf ôô fôrm schbajchan",
 'tooltip-upload' => 'Loos midm nauflaadn',
 'tooltip-rollback' => 'Hiir glign machd mid am môl alâs riggängich, was däär benudsâr dsledschd af där sajdn gmachd had.',
 'tooltip-undo' => 'Hiir glign machd dii aane ändärung riggängich un dsajchd dan ôô, wiis dan ausschaua dääd. Dann koosd aa no â dsamfassung wisoo un warum dâdsuuschrajm.',
+'tooltip-summary' => 'Dibb schnell a glaane Zusammafassung nei.',
 
 # Stylesheets
 'common.css' => '/* CSS hiir beâjflusd ale schelfn */',
index e89bc19..e30a8a2 100644 (file)
@@ -12,6 +12,7 @@
  * @author Reedy
  * @author Wu-chinese.com
  * @author Yfdyh000
+ * @author 十弌
  */
 
 $fallback = 'zh-hans';
@@ -26,10 +27,10 @@ $messages = array(
 'tog-extendwatchlist' => '扩展监控列表,显示所有改动,而弗仅仅是最近个',
 'tog-usenewrc' => '使用强化版个近段辰光个改动(JavaScript)',
 'tog-numberheadings' => '标题自动编号',
-'tog-showtoolbar' => '显示编辑工具条(JavaScript)',
-'tog-editondblclick' => '双击个辰光编辑页面(JavaScript)',
+'tog-showtoolbar' => '顯示編寫傢伙欄',
+'tog-editondblclick' => '雙捺來編寫頁面',
 'tog-editsection' => '允许通过点击【编辑】链接来编辑段落',
-'tog-editsectiononrightclick' => '允许右击标题编辑段落(JavaScript)',
+'tog-editsectiononrightclick' => '用右捺標題編輯段落',
 'tog-showtoc' => '显示目录(针对超过三只标题个页面)',
 'tog-rememberpassword' => '来许箇台电脑上记牢我个密码(可维持$1{{PLURAL:$1|日|日}})',
 'tog-watchcreations' => '拿我创建个页面添加到我个监控列表里向',
@@ -312,6 +313,11 @@ $1',
 # General errors
 'error' => '错误',
 'databaseerror' => '数据库错误',
+'databaseerror-text' => '一個數據庫討信發生。
+嘸數說明一個bug徠軟件裏向。',
+'databaseerror-textcl' => '一個數據庫討信賺爻發生。',
+'databaseerror-query' => '討信:$1',
+'databaseerror-error' => '賺爻:$1',
 'laggedslavemode' => '警告: 页面可能弗包含最近个更新。',
 'readonly' => '数据库锁定',
 'enterlockreason' => '请输入锁定个原因,包括预计解锁个辰光',
@@ -952,6 +958,7 @@ $1",
 'yourlanguage' => '语言:',
 'yournick' => '绰号:',
 'badsig' => '无效原始签名;检查 HTML 标签。',
+'gender-unknown' => '我弗想講',
 'email' => '电子邮件',
 'prefs-help-email' => '电子邮件是备选个,垃拉侬忘记密码个情况下头可以用得来重置密码。
 侬也可以让别人家通过侬个用户页或者讨论页来联系侬。',
@@ -1005,7 +1012,7 @@ $1",
 'newpageletter' => '新',
 'boteditletter' => '机',
 'newsectionsummary' => '/* $1 */ 新段落',
-'rc-enhanced-expand' => '显示细节(需要JavaScript支持)',
+'rc-enhanced-expand' => '展示零碎',
 'rc-enhanced-hide' => '拿细节囥脱',
 
 # Recent changes linked
@@ -1564,6 +1571,9 @@ Variants for Chinese language
 # Special:SpecialPages
 'specialpages' => '特殊页面',
 
+# Database error messages
+'dberr-info-hidden' => '(數據庫服務器連弗上)',
+
 # New logging system
 'revdelete-restricted' => '已将限制应用到管理员',
 'revdelete-unrestricted' => '已移除对管理员个限制',
index 6f20232..46d2c80 100644 (file)
@@ -202,12 +202,12 @@ $messages = array(
 'tog-hidepatrolled' => 'באַהאַלטן פאַטראלירטע רעדאַקטירונגען אין לעצטע ענדערונגען',
 'tog-newpageshidepatrolled' => 'באַהאַלטן פאַטראלירטע בלעטער פון דער ליסטע פון נײַע בלעטער',
 'tog-extendwatchlist' => 'פארברייטערן די אויפפאסן ליסטע צו צייגן אלע פאסנדע ענדערונגען (אנדערשט: בלויז די לעצטע ענדערונג פון יעדן בלאט)',
-'tog-usenewrc' => '× ×\99צ×\9f ×¤Ö¿×\90ַר×\91עסער×\98×¢ ×\9cעצ×\98×¢ ×¢× ×\93ער×\95× ×\92×¢×\9f (פֿ×\90×\93ער×\98 JavaScript)',
+'tog-usenewrc' => '×\92ר×\95פ×\99ר×\9f ×¢× ×\93ער×\95× ×\92×¢×\9f ×\9c×\95×\99×\98×\9f ×\91×\9c×\90×\98 ×\90×\99×\9f "×\9cעצ×\98×¢ ×¢× ×\93ער×\95× ×\92×¢×\9f" ×\90×\95×\9f ×\90×\95×\99פֿפ×\90ס×\9f ×\9c×\99ס×\98×¢',
 'tog-numberheadings' => 'נומערירן קעפלעך אויטאמאטיש',
-'tog-showtoolbar' => '×\95×\95ײַ×\96×\9f ×\93×¢×\9d געצייג-שטאנג',
-'tog-editondblclick' => '×¢× ×\93ער×\9f ×\91×\9c×¢×\98ער ×\93×\95ר×\9a ×\98×\90פ×\9c ×§×\9c×\99ק (JavaScript)',
+'tog-showtoolbar' => '×\95×\95ײַ×\96×\9f ×¨×¢×\93×\90ק×\98×\99ר×\9f געצייג-שטאנג',
+'tog-editondblclick' => 'רע×\93×\90ק×\98×\99ר×\9f ×\91×\9c×¢×\98ער ×\93×\95ר×\9a ×\98×\90פ×\9c ×§×\9c×\99ק',
 'tog-editsection' => 'ערמעגליכט אפטייל ענדערן דורך [ענדערן] לינקס',
-'tog-editsectiononrightclick' => '×\91×\90×\9e×¢×\92×\9c×\99×\9a ×¤×\90ר×\90×\92ר×\90×£ ×¢× ×\93ער×\95× ×\92×¢×\9f ×\93×\95ר×\9b×\9f ×§×\95×\95×¢×\98ש×\9f ×\90×\95×\99פ×\9f ×¨×¢×\9b×\98×\9f<br />×\90×\95×\99×£ ×\90פ×\98×\99×\99×\9c ×§×¢×¤×\9c (JavaScript)',
+'tog-editsectiononrightclick' => '×\91×\90×\9e×¢×\92×\9c×¢×\9b×\9f ×\90פ×\98×\99×\99×\9c ×¨×¢×\93×\90ק×\98×\99ר×\9f ×\93×\95ר×\9b×\9f ×¨×¢×\9b×\98ס־ק×\9c×\99ק×\9f ×\90×\95×\99×£ ×\90פ×\98×\99×\99×\9c ×§×¢×¤×\9c×¢×\9a',
 'tog-showtoc' => 'ווייז דאס אינהאלט קעסטל<br />(פאר בלעטער מיט מער ווי 3 קעפלעך)',
 'tog-rememberpassword' => 'געדענק מיין אריינלאגירן אין דעם בלעטערער (ביז $1 {{PLURAL:$1|טאָג|טעג}})',
 'tog-watchcreations' => 'צולייגן בלעטער וואס איך באשאף און טעקעס וואס איך לאד ארויף צו מיין אכטונג ליסטע',
@@ -225,7 +225,7 @@ $messages = array(
 'tog-shownumberswatching' => 'ווייזן דעם נומער פון בלאט אויפֿפאסערס',
 'tog-oldsig' => 'איצטיגער אונטערשריפֿט:',
 'tog-fancysig' => 'באַהאַנדלן  אונטערשריפט אַלס וויקיטעקסט (אָן אויטאמאטישן לינק)',
-'tog-uselivepreview' => '×\91×\90× ×\99צ×\98 ×\96×\99×\9a ×\9e×\99×\98 ×\92×\99×\9b×¢ ×¤×\90ר×\90×\95×\99ס×\93×\99×\92×¢ ×\95×\95×\99×\99×\96×\95× ×\92 (JavaScript) (עקספערימענטאל)',
+'tog-uselivepreview' => '×\91×\90× ×\99צ×\9f ×\96×\99×\9a ×\9e×\99×\98 ×\92×\99×\9bער ×¤×\90ר×\90×\95×\99ס×\93×\99×\92ער ×\95×\95×\99×\99×\96×\95× ×\92 (עקספערימענטאל)',
 'tog-forceeditsummary' => 'ווארן מיך ווען איך לייג א ליידיג קורץ ווארט ענדערונג',
 'tog-watchlisthideown' => 'באהאלט מיינע ענדערונגען פון דער אויפפאסן ליסטע',
 'tog-watchlisthidebots' => 'באהאלט באט עדיטס פון אויפפאסן ליסטע',
@@ -530,6 +530,12 @@ $1',
 # General errors
 'error' => 'פעלער',
 'databaseerror' => 'דאטנבאזע פעלער',
+'databaseerror-text' => "ס'האט פאסירט א דאטנבאזע פֿראגע פֿעלער.
+קען אפשר זיין א באַג אינעם ווייכווארג.",
+'databaseerror-textcl' => "ס'האט פאסירט א דאטנבאזע פֿראגע פֿעלער.",
+'databaseerror-query' => 'פֿראגע: $1',
+'databaseerror-function' => 'פֿונקציע: $1',
+'databaseerror-error' => 'פֿעלער: $1',
 'laggedslavemode' => 'ווארענונג: בלאט טוט מעגליך נישט אנטהאלטן לעצטיגע דערהײַנטיגונגען.',
 'readonly' => 'דאַטנבאַזע פאַרשפאַרט',
 'enterlockreason' => 'שטעלט א סיבה פארן אפשפאר, אריינגערעכנט א געשאצטער צייט אויף ווען דאס וועט זיך צוריקעפענען די פארשפארונג.',
@@ -1643,7 +1649,7 @@ $1",
 'rc_categories_any' => 'אלע',
 'rc-change-size-new' => '$1 {{PLURAL:$1|בייט|בייטן}} נאך דער ענדערונג',
 'newsectionsummary' => '/* $1 */ נייע אפטיילונג',
-'rc-enhanced-expand' => 'צייג דעטאלען (פארלאנגט זיך JavaScript)',
+'rc-enhanced-expand' => 'צייגן דעטאלן',
 'rc-enhanced-hide' => 'באהאלט דעטאלן',
 'rc-old-title' => 'געשאפן לכתחילה מיטן נאמען "$1"',
 
index e933c9e..8c33b35 100644 (file)
@@ -3002,7 +3002,7 @@ $2',
 'tooltip-pt-preferences' => '你的设置',
 'tooltip-pt-watchlist' => '你正在监视更改的页面的列表',
 'tooltip-pt-mycontris' => '你的贡献的列表',
-'tooltip-pt-login' => '我们鼓励登录,不过这不是强制的',
+'tooltip-pt-login' => '我们鼓励登录,不过这不是强制的',
 'tooltip-pt-anonlogin' => '我们鼓励你登录,不过这不是强制的',
 'tooltip-pt-logout' => '退出登录',
 'tooltip-ca-talk' => '关于内容页面的讨论',
@@ -3028,7 +3028,7 @@ $2',
 'tooltip-n-recentchanges' => '本wiki最近更改的列表',
 'tooltip-n-randompage' => '载入一个随机页面',
 'tooltip-n-help' => '查找帮助的地方',
-'tooltip-t-whatlinkshere' => '所有链至本页的wiki页面的列表',
+'tooltip-t-whatlinkshere' => '所有链至本页的维基页面的列表',
 'tooltip-t-recentchangeslinked' => '链自本页的页面的最近更改',
 'tooltip-feed-rss' => '本页面的RSS源',
 'tooltip-feed-atom' => '本页面的Atom源',
index 3af96fd..3bbd6f7 100644 (file)
@@ -385,7 +385,7 @@ $messages = array(
 'december-date' => '12月$1日',
 
 # Categories related messages
-'pagecategories' => '$1 個分類',
+'pagecategories' => '$1個分類',
 'category_header' => '「$1」分類中的頁面',
 'subcategories' => '子分類',
 'category-media-header' => '「$1」分類中的媒體',
index e29ffd9..0023c6d 100644 (file)
@@ -453,11 +453,11 @@ abstract class Maintenance {
         */
        public function runChild( $maintClass, $classFile = null ) {
                // Make sure the class is loaded first
-               if ( !MWInit::classExists( $maintClass ) ) {
+               if ( !class_exists( $maintClass ) ) {
                        if ( $classFile ) {
                                require_once $classFile;
                        }
-                       if ( !MWInit::classExists( $maintClass ) ) {
+                       if ( !class_exists( $maintClass ) ) {
                                $this->error( "Cannot spawn child: $maintClass" );
                        }
                }
@@ -1171,7 +1171,7 @@ abstract class Maintenance {
         * @return bool
         */
        public static function posix_isatty( $fd ) {
-               if ( !MWInit::functionExists( 'posix_isatty' ) ) {
+               if ( !function_exists( 'posix_isatty' ) ) {
                        return !$fd;
                } else {
                        return posix_isatty( $fd );
index 0c1ace1..164b5b0 100644 (file)
@@ -4446,7 +4446,6 @@ wikipage
 wikipedia
 wikipedian
 wikipedias
-wikiprintable
 wikis
 wikisyntax
 wikitable
index 69b4b9c..3bd508c 100644 (file)
@@ -53,8 +53,6 @@ $maintenance->setup();
 // to $maintenance->mSelf. Keep that here for b/c
 $self = $maintenance->getName();
 
-# Get the MWInit class
-require_once "$IP/includes/Init.php";
 # Start the autoloader, so that extensions can derive classes from core files
 require_once "$IP/includes/AutoLoader.php";
 # Stub the profiler
@@ -68,7 +66,7 @@ if ( file_exists( "$IP/StartProfiler.php" ) ) {
 
 // Some other requires
 require_once "$IP/includes/Defines.php";
-require_once MWInit::compiledPath( 'includes/DefaultSettings.php' );
+require_once "$IP/includes/DefaultSettings.php";
 
 # Load composer's autoloader if present
 if ( is_readable( "$IP/vendor/autoload.php" ) ) {
@@ -86,7 +84,7 @@ if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
                # Maybe a hook?
                global $cluster;
                $cluster = 'pmtpa';
-               require MWInit::interpretedPath( '../wmf-config/wgConf.php' );
+               require "$IP/../wmf-config/wgConf.php";
        }
        // Require the configuration (probably LocalSettings.php)
        require $maintenance->loadSettings();
@@ -95,7 +93,7 @@ if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
 if ( $maintenance->getDbType() === Maintenance::DB_ADMIN &&
        is_readable( "$IP/AdminSettings.php" ) )
 {
-       require MWInit::interpretedPath( 'AdminSettings.php' );
+       require "$IP/AdminSettings.php";
 }
 
 if ( $maintenance->getDbType() === Maintenance::DB_NONE ) {
@@ -105,7 +103,7 @@ if ( $maintenance->getDbType() === Maintenance::DB_NONE ) {
 }
 $maintenance->finalSetup();
 // Some last includes
-require_once MWInit::compiledPath( 'includes/Setup.php' );
+require_once "$IP/includes/Setup.php";
 
 // Much much faster startup than creating a title object
 $wgTitle = null;
index 0cdc069..c153fa7 100644 (file)
@@ -141,6 +141,7 @@ $wgIgnoredMessages = array(
        'statistics-footer',
        'talkpagetext',
        'uploadfooter',
+       'upload-default-description',
        'listgrouprights-link',
        'search-interwiki-custom',
        'allpages-summary',
index b2db694..43be195 100644 (file)
@@ -1388,6 +1388,7 @@ $wgMessageStructure = array(
                'upload-preferred',
                'upload-prohibited',
                'uploadfooter',
+               'upload-default-description',
                'uploadlog',
                'uploadlogpage',
                'uploadlogpagetext',
index 28b041a..eda101e 100644 (file)
@@ -80,7 +80,7 @@ class mcTest extends Maintenance {
                        $get = 0;
                        $time_start = $this->microtime_float();
                        for ( $i = 1; $i <= $iterations; $i++ ) {
-                               if ( !is_null( $mcc->set( "test$i", $i ) ) ) {
+                               if ( $mcc->set( "test$i", $i ) ) {
                                        $set++;
                                }
                        }
index b76f57c..c474f00 100644 (file)
@@ -505,8 +505,6 @@ CREATE TABLE /*$wgDBprefix*/recentchanges (
    rc_this_oldid INT DEFAULT 0,
    rc_last_oldid INT DEFAULT 0,
    rc_type tinyint DEFAULT 0,
-   rc_moved_to_ns BIT DEFAULT 0,
-   rc_moved_to_title NVARCHAR(255)  DEFAULT '',
    rc_patrolled BIT DEFAULT 0,
    rc_ip NCHAR(40) DEFAULT '',
    rc_old_len INT DEFAULT 0,
index 74fb1b1..57b6e7e 100644 (file)
@@ -409,8 +409,6 @@ CREATE TABLE &mw_prefix.recentchanges (
   rc_this_oldid      NUMBER      DEFAULT 0 NOT NULL,
   rc_last_oldid      NUMBER      DEFAULT 0 NOT NULL,
   rc_type            CHAR(1)         DEFAULT '0' NOT NULL,
-  rc_moved_to_ns     NUMBER          DEFAULT 0 NOT NULL,
-  rc_moved_to_title  VARCHAR2(255),
   rc_patrolled       CHAR(1)         DEFAULT '0' NOT NULL,
   rc_ip              VARCHAR2(15),
   rc_old_len         NUMBER,
index 30a8e1b..4d44705 100644 (file)
@@ -405,8 +405,6 @@ CREATE TABLE recentchanges (
   rc_this_oldid      INTEGER      NOT NULL,
   rc_last_oldid      INTEGER      NOT NULL,
   rc_type            SMALLINT     NOT NULL  DEFAULT 0,
-  rc_moved_to_ns     SMALLINT,
-  rc_moved_to_title  TEXT,
   rc_patrolled       SMALLINT     NOT NULL  DEFAULT 0,
   rc_ip              CIDR,
   rc_old_len         INTEGER,
diff --git a/maintenance/tidyUpBug37714.php b/maintenance/tidyUpBug37714.php
new file mode 100644 (file)
index 0000000..1ad9c7e
--- /dev/null
@@ -0,0 +1,49 @@
+<?php
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Fixes all rows affected by https://bugzilla.wikimedia.org/show_bug.cgi?id=37714
+ */
+class TidyUpBug37714 extends Maintenance {
+       public function execute() {
+               // Search for all log entries which are about changing the visability of other log entries.
+               $result = wfGetDB( DB_SLAVE )->select(
+                       'logging',
+                       array( 'log_id', 'log_params' ),
+                       array(
+                               'log_type' => array( 'suppress', 'delete' ),
+                               'log_action' => 'event',
+                               'log_namespace' => NS_SPECIAL,
+                               'log_title' => SpecialPage::getTitleFor( 'Log' )->getText()
+                       ),
+                       __METHOD__
+               );
+
+               foreach ( $result as $row ) {
+                       $paramLines = explode( "\n", $row->log_params );
+                       $ids = explode( ',', $paramLines[0] ); // Array dereferencing is PHP >= 5.4 :(
+                       $result = wfGetDB( DB_SLAVE )->select( // Work out what log entries were changed here.
+                               'logging',
+                               'log_type',
+                               array( 'log_id' => $ids ),
+                               __METHOD__,
+                               'DISTINCT'
+                       );
+                       if ( $result->numRows() === 1 ) {
+                               // If there's only one type, the target title can be set to include it.
+                               $logTitle = SpecialPage::getTitleFor( 'Log', $result->current()->log_type )->getText();
+                               $this->output( 'Set log_title to "' . $logTitle . '" for log entry ' . $row->log_id . ".\n" );
+                               wfGetDB( DB_MASTER )->update(
+                                       'logging',
+                                       array( 'log_title' => $logTitle ),
+                                       array( 'log_id' => $row->log_id ),
+                                       __METHOD__
+                               );
+                               wfWaitForSlaves();
+                       }
+               }
+       }
+}
+
+$maintClass = 'TidyUpBug37714';
+require_once RUN_MAINTENANCE_IF_MAIN;
index 5df9f32..378217f 100644 (file)
@@ -140,10 +140,6 @@ class UpdateMediaWiki extends Maintenance {
                                $updates[] = 'noschema';
                        }
                        $updates[] = 'stats';
-
-                       if ( !$this->hasOption( 'nopurge' ) ) {
-                               $updates[] = 'purge';
-                       }
                }
 
                $updater = DatabaseUpdater::newForDb( $db, $shared, $this );
index 6fb29be..8bd80c9 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Helper class for update.php and upgrade1_5.php.
+ * Helper class for update.php.
  *
  * Copyright © 2005 Brion Vibber <brion@pobox.com>
  * http://www.mediawiki.org/
@@ -158,11 +158,7 @@ class UserDupes {
         * @access private
         */
        function lock() {
-               if ( $this->newSchema() ) {
-                       $set = array( 'user', 'revision' );
-               } else {
-                       $set = array( 'user', 'cur', 'old' );
-               }
+               $set = array( 'user', 'revision' );
                $names = array_map( array( $this, 'lockTable' ), $set );
                $tables = implode( ',', $names );
 
@@ -173,14 +169,6 @@ class UserDupes {
                return $this->db->tableName( $table ) . ' WRITE';
        }
 
-       /**
-        * @return bool
-        * @access private
-        */
-       function newSchema() {
-               return MWInit::classExists( 'Revision' );
-       }
-
        /**
         * @access private
         */
@@ -266,27 +254,10 @@ class UserDupes {
         * @access private
         */
        function editCount( $userid ) {
-               if ( $this->newSchema() ) {
-                       return $this->editCountOn( 'revision', 'rev_user', $userid );
-               } else {
-                       return $this->editCountOn( 'cur', 'cur_user', $userid ) +
-                               $this->editCountOn( 'old', 'old_user', $userid );
-               }
-       }
-
-       /**
-        * Count the number of hits on a given table for this account.
-        * @param $table string
-        * @param $field string
-        * @param $userid int
-        * @return int
-        * @access private
-        */
-       function editCountOn( $table, $field, $userid ) {
                return intval( $this->db->selectField(
-                       $table,
+                       'revision',
                        'COUNT(*)',
-                       array( $field => $userid ),
+                       array( 'rev_user' => $userid ),
                        __METHOD__ ) );
        }
 
@@ -296,26 +267,10 @@ class UserDupes {
         * @access private
         */
        function reassignEdits( $from, $to ) {
-               $set = $this->newSchema()
-                       ? array( 'revision' => 'rev_user' )
-                       : array( 'cur' => 'cur_user', 'old' => 'old_user' );
-               foreach ( $set as $table => $field ) {
-                       $this->reassignEditsOn( $table, $field, $from, $to );
-               }
-       }
-
-       /**
-        * @param $table string
-        * @param $field string
-        * @param $from int
-        * @param $to int
-        * @access private
-        */
-       function reassignEditsOn( $table, $field, $from, $to ) {
-               $this->out( "reassigning on $table... " );
-               $this->db->update( $table,
-                       array( $field => $to ),
-                       array( $field => $from ),
+               $this->out( 'reassigning... ' );
+               $this->db->update( 'revision',
+                       array( 'rev_user' => $to ),
+                       array( 'rev_user' => $from ),
                        __METHOD__ );
                $this->out( "ok. " );
        }
index eeb3ae7..60edb56 100644 (file)
@@ -261,7 +261,10 @@ return array(
                'scripts' => 'resources/jquery/jquery.tablesorter.js',
                'styles' => 'resources/jquery/jquery.tablesorter.css',
                'messages' => array( 'sort-descending', 'sort-ascending' ),
-               'dependencies' => 'jquery.mwExtension',
+               'dependencies' => array(
+                       'jquery.mwExtension',
+                       'mediawiki.language.months',
+               ),
        ),
        'jquery.textSelection' => array(
                'scripts' => 'resources/jquery/jquery.textSelection.js',
@@ -1120,11 +1123,6 @@ return array(
                ),
                'position' => 'top',
        ),
-       'mediawiki.legacy.wikiprintable' => array(
-               'styles' => array( 'common/wikiprintable.css' => array( 'media' => 'print' ) ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
        'mediawiki.ui' => array(
                'skinStyles' => array(
                        'default' => 'resources/mediawiki.ui/mediawiki.ui.default.css',
index ffe4d7d..bd61d96 100644 (file)
Binary files a/resources/jquery.chosen/chosen-sprite@2x.png and b/resources/jquery.chosen/chosen-sprite@2x.png differ
index dbbbfc7..ef17cc3 100644 (file)
Binary files a/resources/jquery.tipsy/images/tipsy.png and b/resources/jquery.tipsy/images/tipsy.png differ
index 26b9da5..e425e6e 100644 (file)
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png and b/resources/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png differ
index b4b148d..72d4757 100644 (file)
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png and b/resources/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png differ
index ad3d634..3b2914a 100644 (file)
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png and b/resources/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png differ
index 42ccba2..8569c1b 100644 (file)
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png and b/resources/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png differ
index 5a46b47..d6cc3c5 100644 (file)
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png and b/resources/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png differ
index 7c9fa6c..3cd467e 100644 (file)
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png and b/resources/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ
index f9fde8b..12a80c8 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/titlebar-fade.png and b/resources/jquery.ui/themes/vector/images/titlebar-fade.png differ
index 83d6ff8..84ed2a2 100644 (file)
Binary files a/resources/jquery/images/jquery.arrowSteps.divider-ltr.png and b/resources/jquery/images/jquery.arrowSteps.divider-ltr.png differ
index 529d7b8..7cfbfeb 100644 (file)
Binary files a/resources/jquery/images/jquery.arrowSteps.divider-rtl.png and b/resources/jquery/images/jquery.arrowSteps.divider-rtl.png differ
index 3289617..eb07028 100644 (file)
Binary files a/resources/jquery/images/jquery.arrowSteps.head-ltr.png and b/resources/jquery/images/jquery.arrowSteps.head-ltr.png differ
index 3d9f70c..7ea2fdb 100644 (file)
Binary files a/resources/jquery/images/jquery.arrowSteps.head-rtl.png and b/resources/jquery/images/jquery.arrowSteps.head-rtl.png differ
index 92b872b..3ad990b 100644 (file)
Binary files a/resources/jquery/images/jquery.arrowSteps.tail-ltr.png and b/resources/jquery/images/jquery.arrowSteps.tail-ltr.png differ
index 3929bbb..19efb6c 100644 (file)
Binary files a/resources/jquery/images/marker.png and b/resources/jquery/images/marker.png differ
index b0a4d40..fe08de0 100644 (file)
Binary files a/resources/jquery/images/mask.png and b/resources/jquery/images/mask.png differ
index 27c4c6c..0cd6417 100644 (file)
                                        $containers.hide();
                                        hookCallback();
                                } else {
-                                       $.when( $containers.stop( true, true ).fadeOut() ).then( hookCallback );
+                                       $containers.stop( true, true ).fadeOut().promise().done( hookCallback );
                                }
                        } else {
-                               $.when( $containers.stop( true, true ).fadeIn() ).then( hookCallback );
+                               $containers.stop( true, true ).fadeIn().promise().done( hookCallback );
                        }
 
                } else if ( !options.plainMode && ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) ) {
                                        $containers.hide();
                                        hookCallback();
                                } else {
-                                       $.when( $containers.stop( true, true ).slideUp() ).then( hookCallback );
+                                       $containers.stop( true, true ).slideUp().promise().done( hookCallback );
                                }
                        } else {
-                               $.when( $containers.stop( true, true ).slideDown() ).then( hookCallback );
+                               $containers.stop( true, true ).slideDown().promise().done( hookCallback );
                        }
 
                } else {
                                                $collapsibleContent.hide();
                                                hookCallback();
                                        } else {
-                                               $.when( $collapsibleContent.slideUp() ).then( hookCallback );
+                                               $collapsibleContent.slideUp().promise().done( hookCallback );
                                        }
                                } else {
-                                       $.when( $collapsibleContent.slideDown() ).then( hookCallback );
+                                       $collapsibleContent.slideDown().promise().done( hookCallback );
                                }
 
                        // Otherwise assume this is a customcollapse with a remote toggle
                                                hookCallback();
                                        } else {
                                                if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
-                                                       $.when( $collapsible.fadeOut() ).then( hookCallback );
+                                                       $collapsible.fadeOut().promise().done( hookCallback );
                                                } else {
-                                                       $.when( $collapsible.slideUp() ).then( hookCallback );
+                                                       $collapsible.slideUp().promise().done( hookCallback );
                                                }
                                        }
                                } else {
                                        if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
-                                               $.when( $collapsible.fadeIn() ).then( hookCallback );
+                                               $collapsible.fadeIn().promise().done( hookCallback );
                                        } else {
-                                               $.when( $collapsible.slideDown() ).then( hookCallback );
+                                               $collapsible.slideDown().promise().done( hookCallback );
                                        }
                                }
                        }
index bf38769..28e2afc 100644 (file)
@@ -379,7 +379,8 @@ $.suggestions = {
                        preventDefault = false;
 
                switch ( key ) {
-                       case 40: // Arrow down
+                       // Arrow down
+                       case 40:
                                if ( wasVisible ) {
                                        $.suggestions.highlight( context, 'next', true );
                                        context.data.selectedWithMouse = false;
@@ -388,21 +389,24 @@ $.suggestions = {
                                }
                                preventDefault = true;
                                break;
-                       case 38: // Arrow up
+                       // Arrow up
+                       case 38:
                                if ( wasVisible ) {
                                        $.suggestions.highlight( context, 'prev', true );
                                        context.data.selectedWithMouse = false;
                                }
                                preventDefault = wasVisible;
                                break;
-                       case 27: // Escape
+                       // Escape
+                       case 27:
                                context.data.$container.hide();
                                $.suggestions.restore( context );
                                $.suggestions.cancel( context );
                                context.data.$textbox.trigger( 'change' );
                                preventDefault = wasVisible;
                                break;
-                       case 13: // Enter
+                       // Enter
+                       case 13:
                                context.data.$container.hide();
                                preventDefault = wasVisible;
                                selected = context.data.$container.find( '.suggestions-result-current' );
@@ -581,13 +585,15 @@ $.fn.suggestions = function () {
                                        switch ( context.data.keypressed ) {
                                                // This preventDefault logic is duplicated from
                                                // $.suggestions.keypress(), which sucks
-                                               case 40: // Arrow down
+                                               // Arrow down
+                                               case 40:
                                                        e.preventDefault();
                                                        e.stopImmediatePropagation();
                                                        break;
-                                               case 38: // Arrow up
-                                               case 27: // Escape
-                                               case 13: // Enter
+                                               // Arrow up, Escape and Enter
+                                               case 38:
+                                               case 27:
+                                               case 13:
                                                        if ( context.data.$container.is( ':visible' ) ) {
                                                                e.preventDefault();
                                                                e.stopImmediatePropagation();
index b71ef83..bdc6675 100644 (file)
@@ -8,8 +8,9 @@
  * http://www.opensource.org/licenses/mit-license.php
  * http://www.gnu.org/licenses/gpl.html
  *
- * Depends on mw.config (wgDigitTransformTable, wgMonthNames, wgMonthNamesShort,
- * wgDefaultDateFormat, wgContentLanguage)
+ * Depends on mw.config (wgDigitTransformTable, wgDefaultDateFormat, wgContentLanguage)
+ * and mw.language.months.
+ *
  * Uses 'tableSorterCollation' in mw.config (if available)
  */
 /**
                var regex = [];
                ts.monthNames = {};
 
-               for ( var i = 1; i < 13; i++ ) {
-                       var name = mw.config.get( 'wgMonthNames' )[i].toLowerCase();
-                       ts.monthNames[name] = i;
+               for ( var i = 0; i < 12; i++ ) {
+                       var name = mw.language.months.names[i].toLowerCase();
+                       ts.monthNames[name] = i + 1;
+                       regex.push( $.escapeRE( name ) );
+                       name = mw.language.months.genitive[i].toLowerCase().replace( '.', '' );
+                       ts.monthNames[name] = i + 1;
                        regex.push( $.escapeRE( name ) );
-                       name = mw.config.get( 'wgMonthNamesShort' )[i].toLowerCase().replace( '.', '' );
-                       ts.monthNames[name] = i;
+                       name = mw.language.months.abbrev[i].toLowerCase();
+                       ts.monthNames[name] = i + 1;
                        regex.push( $.escapeRE( name ) );
                }
 
index 8bba1fc..98a9c54 100644 (file)
@@ -16,9 +16,9 @@
                isCategory: function ( title, ok, err ) {
                        var d = $.Deferred(),
                                apiPromise;
+
                        // Backwards compatibility (< MW 1.20)
-                       d.done( ok );
-                       d.fail( err );
+                       d.done( ok ).fail( err );
 
                        apiPromise = this.get( {
                                        prop: 'categoryinfo',
@@ -53,9 +53,9 @@
                getCategoriesByPrefix: function ( prefix, ok, err ) {
                        var d = $.Deferred(),
                                apiPromise;
+
                        // Backwards compatibility (< MW 1.20)
-                       d.done( ok );
-                       d.fail( err );
+                       d.done( ok ).fail( err );
 
                        // Fetch with allpages to only get categories that have a corresponding description page.
                        apiPromise = this.get( {
@@ -92,9 +92,9 @@
                getCategories: function ( title, ok, err, async ) {
                        var d = $.Deferred(),
                                apiPromise;
+
                        // Backwards compatibility (< MW 1.20)
-                       d.done( ok );
-                       d.fail( err );
+                       d.done( ok ).fail( err );
 
                        apiPromise = this.get( {
                                        prop: 'categories',
index 96947cc..381e172 100644 (file)
@@ -59,9 +59,9 @@
                getEditToken: function ( ok, err ) {
                        var d = $.Deferred(),
                                apiPromise;
+
                        // Backwards compatibility (< MW 1.20)
-                       d.done( ok );
-                       d.fail( err );
+                       d.done( ok ).fail( err );
 
                        apiPromise = this.get( {
                                        action: 'tokens',
index 08bb171..c4d23b8 100644 (file)
@@ -17,9 +17,9 @@
                parse: function ( wikitext, ok, err ) {
                        var d = $.Deferred(),
                                apiPromise;
+
                        // Backwards compatibility (< MW 1.20)
-                       d.done( ok );
-                       d.fail( err );
+                       d.done( ok ).fail( err );
 
                        apiPromise = this.get( {
                                        action: 'parse',
index e2be5c7..49a4c62 100644 (file)
@@ -22,9 +22,9 @@
                var params,
                        d = $.Deferred(),
                        apiPromise;
+
                // Backwards compatibility (< MW 1.20)
-               d.done( ok );
-               d.fail( err );
+               d.done( ok ).fail( err );
 
                params = {
                        action: 'watch',
diff --git a/resources/mediawiki.less/mediawiki.mixins.less b/resources/mediawiki.less/mediawiki.mixins.less
new file mode 100644 (file)
index 0000000..032028f
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * Common LESS mixin library for MediaWiki
+ *
+ * By default the folder containing this file is included in $wgResourceLoaderLESSImportPaths,
+ * which makes this file importable by all less files via '@import "mediawiki.mixins";'.
+ *
+ * The mixins included below are considered a public interface for MediaWiki extensions.
+ * The signatures of parametrized mixins should be kept as stable as possible.
+ *
+ * See <http://lesscss.org/#-mixins> for more information about how to write mixins.
+ */
+
+.background-image(@url) when (embeddable(@url)) {
+       background-image: embed(@url);
+       background-image: url(@url)!ie;
+}
+
+.background-image(@url) when not (embeddable(@url)) {
+       background-image: url(@url);
+}
index f43505e..0578be0 100644 (file)
Binary files a/resources/mediawiki.special/images/glyph-people-large.png and b/resources/mediawiki.special/images/glyph-people-large.png differ
index e9b8874..f933aa6 100644 (file)
Binary files a/resources/mediawiki.special/images/icon-contributors.png and b/resources/mediawiki.special/images/icon-contributors.png differ
index f4ec247..39f4f2d 100644 (file)
Binary files a/resources/mediawiki.special/images/icon-edits.png and b/resources/mediawiki.special/images/icon-edits.png differ
index 4b3d4ee..03f0eec 100644 (file)
Binary files a/resources/mediawiki.special/images/icon-lock.png and b/resources/mediawiki.special/images/icon-lock.png differ
index a406ce7..59513db 100644 (file)
Binary files a/resources/mediawiki.special/images/icon-pages.png and b/resources/mediawiki.special/images/icon-pages.png differ
index ea9c67a..b17e578 100644 (file)
Binary files a/resources/mediawiki/images/arrow-collapsed-ltr.png and b/resources/mediawiki/images/arrow-collapsed-ltr.png differ
index 081d3a8..a834548 100644 (file)
Binary files a/resources/mediawiki/images/arrow-collapsed-rtl.png and b/resources/mediawiki/images/arrow-collapsed-rtl.png differ
index fa4bf26..2bec798 100644 (file)
Binary files a/resources/mediawiki/images/arrow-expanded.png and b/resources/mediawiki/images/arrow-expanded.png differ
index 7cf9d8f..3e375fb 100644 (file)
@@ -3,10 +3,15 @@
  * @singleton
  */
 ( function ( mw, $ ) {
-       var callbacks, options, tokens, user;
+       var user,
+               callbacks = {},
+               // Extend the skeleton mw.user from mediawiki.js
+               // This is kind of ugly but we're stuck with this for b/c reasons
+               options = mw.user.options || new mw.Map(),
+               tokens = mw.user.tokens || new mw.Map();
 
        /**
-        * Gets the current user's groups or rights.
+        * Get the current user's groups or rights
         *
         * @private
         * @param {string} info One of 'groups' or 'rights'
                } );
        }
 
-       callbacks = {};
-
-       // Extend the skeleton mw.user from mediawiki.js
-       // This is kind of ugly but we're stuck with this for b/c reasons
-       options = mw.user.options || new mw.Map();
-       tokens = mw.user.tokens || new mw.Map();
-
        mw.user = user = {
                options: options,
                tokens: tokens,
 
                /**
-                * Generates a random user session ID (32 alpha-numeric characters).
+                * Generate a random user session ID (32 alpha-numeric characters)
                 *
                 * This information would potentially be stored in a cookie to identify a user during a
                 * session or series of sessions. Its uniqueness should not be depended on.
@@ -68,9 +66,9 @@
                },
 
                /**
-                * Gets the current user's database id.
+                * Get the current user's database id
                 *
-                * Not to be confused with #id
+                * Not to be confused with #id.
                 *
                 * @return {number} Current user's id, or 0 if user is anonymous
                 */
@@ -79,7 +77,7 @@
                },
 
                /**
-                * Gets the current user's name.
+                * Get the current user's name
                 *
                 * @return {string|null} User name string or null if user is anonymous
                 */
@@ -96,7 +94,7 @@
                },
 
                /**
-                * Get date user registered, if available.
+                * Get date user registered, if available
                 *
                 * @return {Date|boolean|null} Date user registered, or false for anonymous users, or
                 *  null when data is not available
                },
 
                /**
-                * Checks if the current user is anonymous.
+                * Whether the current user is anonymous
                 *
                 * @return {boolean}
                 */
                },
 
                /**
-                * Gets a random ID automatically generated and stored in a session cookie.
+                * Get an automatically generated random ID (stored in a session cookie)
                 *
                 * This ID is ephemeral for everyone, staying in their browser only until they close
                 * their browser.
                 */
                sessionId: function () {
                        var sessionId = $.cookie( 'mediaWiki.user.sessionId' );
-                       if ( typeof sessionId === 'undefined' || sessionId === null ) {
+                       if ( sessionId === undefined || sessionId === null ) {
                                sessionId = user.generateRandomSessionId();
-                               $.cookie( 'mediaWiki.user.sessionId', sessionId, { 'expires': null, 'path': '/' } );
+                               $.cookie( 'mediaWiki.user.sessionId', sessionId, { expires: null, path: '/' } );
                        }
                        return sessionId;
                },
 
                /**
-                * Gets the current user's name or the session ID
+                * Get the current user's name or the session ID
                 *
-                * Not to be confused with #getId
+                * Not to be confused with #getId.
                 *
                 * @return {string} User name or random session ID
                 */
                id: function () {
-                       var name = user.getName();
-                       if ( name ) {
-                               return name;
-                       }
-                       return user.sessionId();
+                       return user.getName() || user.sessionId();
                },
 
                /**
-                * Gets the user's bucket, placing them in one at random based on set odds if needed.
+                * Get the user's bucket (place them in one if not done already)
                 *
                 *     mw.user.bucket( 'test', {
-                *         'buckets': { 'ignored': 50, 'control': 25, 'test': 25 },
-                *         'version': 1,
-                *         'expires': 7
+                *         buckets: { ignored: 50, control: 25, test: 25 },
+                *         version: 1,
+                *         expires: 7
                 *     } );
                 *
                 * @param {string} key Name of bucket
                 * @param {Object} options Bucket configuration options
                 * @param {Object} options.buckets List of bucket-name/relative-probability pairs (required,
                 *  must have at least one pair)
-                * @param {number} options.version Version of bucket test, changing this forces rebucketing
-                *  (optional, default: 0)
-                * @param {number} options.expires Length of time (in days) until the user gets rebucketed
-                *  (optional, default: 30)
-                * @return {string} Bucket name - the randomly chosen key of the options.buckets object
+                * @param {number} [options.version=0] Version of bucket test, changing this forces
+                *  rebucketing
+                * @param {number} [options.expires=30] Length of time (in days) until the user gets
+                *  rebucketed
+                * @return {string} Bucket name - the randomly chosen key of the `options.buckets` object
                 */
                bucket: function ( key, options ) {
                        var cookie, parts, version, bucket,
                        cookie = $.cookie( 'mediaWiki.user.bucket:' + key );
 
                        // Bucket information is stored as 2 integers, together as version:bucket like: "1:2"
-                       if ( typeof cookie === 'string' && cookie.length > 2 && cookie.indexOf( ':' ) > 0 ) {
+                       if ( typeof cookie === 'string' && cookie.length > 2 && cookie.indexOf( ':' ) !== -1 ) {
                                parts = cookie.split( ':' );
                                if ( parts.length > 1 && Number( parts[0] ) === options.version ) {
                                        version = Number( parts[0] );
                                        bucket = String( parts[1] );
                                }
                        }
+
                        if ( bucket === undefined ) {
                                if ( !$.isPlainObject( options.buckets ) ) {
-                                       throw 'Invalid buckets error. Object expected for options.buckets.';
+                                       throw new Error( 'Invalid bucket. Object expected for options.buckets.' );
                                }
+
                                version = Number( options.version );
+
                                // Find range
                                range = 0;
                                for ( k in options.buckets ) {
                                        range += options.buckets[k];
                                }
+
                                // Select random value within range
                                rand = Math.random() * range;
+
                                // Determine which bucket the value landed in
                                total = 0;
                                for ( k in options.buckets ) {
                                                break;
                                        }
                                }
+
                                $.cookie(
                                        'mediaWiki.user.bucket:' + key,
                                        version + ':' + bucket,
-                                       { 'path': '/', 'expires': Number( options.expires ) }
+                                       { path: '/', expires: Number( options.expires ) }
                                );
                        }
+
                        return bucket;
                },
 
                /**
-                * Gets the current user's groups.
+                * Get the current user's groups
                 *
                 * @param {Function} callback
                 */
                },
 
                /**
-                * Gets the current user's rights.
+                * Get the current user's rights
                 *
                 * @param {Function} callback
                 */
index 071a52b..9c3a8b3 100644 (file)
@@ -53,8 +53,9 @@
                                                        || profile.name === 'konqueror' ) ) {
                                util.tooltipAccessKeyPrefix = 'ctrl-';
 
-                       // Firefox 2.x and later
-                       } else if ( profile.name === 'firefox' && profile.versionBase > '1' ) {
+                       // Firefox/Iceweasel 2.x and later
+                       } else if ( ( profile.name === 'firefox' || profile.name === 'iceweasel' )
+                               && profile.versionBase > '1' ) {
                                util.tooltipAccessKeyPrefix = 'alt-shift-';
                        }
 
                 * Get the link to a page name (relative to `wgServer`),
                 *
                 * @param {string} str Page name to get the link for.
+                * @param {Object} params A mapping of query parameter names to values,
+                *     e.g. { action: 'edit' }. Optional.
                 * @return {string} Location for a page with name of `str` or boolean false on error.
                 */
-               wikiGetlink: function ( str ) {
-                       return mw.config.get( 'wgArticlePath' ).replace( '$1',
+               wikiGetlink: function ( str, params ) {
+                       var url = mw.config.get( 'wgArticlePath' ).replace( '$1',
                                util.wikiUrlencode( typeof str === 'string' ? str : mw.config.get( 'wgPageName' ) ) );
+                       if ( params && !$.isEmptyObject( params ) ) {
+                               url += url.indexOf( '?' ) !== -1 ? '&' : '?';
+                               url += $.param( params );
+                       }
+                       return url;
                },
 
                /**
index 6132836..1aa543a 100644 (file)
Binary files a/skins/common/images/Arr_u.png and b/skins/common/images/Arr_u.png differ
index 04fb8f1..398e561 100644 (file)
Binary files a/skins/common/images/ar/button_headline.png and b/skins/common/images/ar/button_headline.png differ
index 12b986b..743ea61 100644 (file)
Binary files a/skins/common/images/ar/button_nowiki.png and b/skins/common/images/ar/button_nowiki.png differ
index 8f979aa..83df068 100644 (file)
Binary files a/skins/common/images/arrow_disabled_left_25.png and b/skins/common/images/arrow_disabled_left_25.png differ
index 11022f6..aa4fbf8 100644 (file)
Binary files a/skins/common/images/arrow_disabled_right_25.png and b/skins/common/images/arrow_disabled_right_25.png differ
index 9e1b550..3f8fee3 100644 (file)
Binary files a/skins/common/images/arrow_right_25.png and b/skins/common/images/arrow_right_25.png differ
index 19e4ad4..47e1ca4 100644 (file)
Binary files a/skins/common/images/button_hr.png and b/skins/common/images/button_hr.png differ
index c647de2..2ba818d 100644 (file)
Binary files a/skins/common/images/button_nowiki.png and b/skins/common/images/button_nowiki.png differ
index ff7348a..fe34b3f 100644 (file)
Binary files a/skins/common/images/button_sig.png and b/skins/common/images/button_sig.png differ
index 53b6f92..94d9d0b 100644 (file)
Binary files a/skins/common/images/button_template.png and b/skins/common/images/button_template.png differ
index dce5667..9b38e6a 100644 (file)
Binary files a/skins/common/images/critical-32.png and b/skins/common/images/critical-32.png differ
index 12b986b..743ea61 100644 (file)
Binary files a/skins/common/images/fa/button_nowiki.png and b/skins/common/images/fa/button_nowiki.png differ
index 7188fa2..00f49f6 100644 (file)
Binary files a/skins/common/images/feed-icon.png and b/skins/common/images/feed-icon.png differ
index cfddc27..ff85c07 100644 (file)
Binary files a/skins/common/images/magnify-clip-rtl.png and b/skins/common/images/magnify-clip-rtl.png differ
index 590f0cb..f7405d2 100644 (file)
Binary files a/skins/common/images/question-small.png and b/skins/common/images/question-small.png differ
index dfde170..34cfa9c 100644 (file)
Binary files a/skins/common/images/tick-32.png and b/skins/common/images/tick-32.png differ
index b14a831..0400734 100644 (file)
Binary files a/skins/common/images/warning-32.png and b/skins/common/images/warning-32.png differ
index 8df4894..462fa9c 100644 (file)
@@ -1,6 +1,7 @@
+( function ( mw, $ ) {
 
-window.ProtectionForm = {
-       'existingMatch': false,
+var ProtectionForm = window.ProtectionForm = {
+       existingMatch: false,
 
        /**
         * Set up the protection chaining interface (i.e. "unlock move permissions" checkbox)
@@ -12,32 +13,38 @@ window.ProtectionForm = {
         *     numTypes             The number of protection types
         *     existingMatch        True if all the existing expiry times match
         */
-       'init': function( opts ) {
-               if( !( document.createTextNode && document.getElementById && document.getElementsByTagName ) )
+       init: function ( opts ) {
+               var box, boxbody, row, cell, check, label;
+
+               if ( !( document.createTextNode && document.getElementById && document.getElementsByTagName ) ) {
                        return false;
+               }
 
-               var box = document.getElementById( opts.tableId );
-               if( !box )
+               box = document.getElementById( opts.tableId );
+               if ( !box ) {
                        return false;
+               }
 
-               var boxbody = box.getElementsByTagName('tbody')[0];
-               var row = document.createElement( 'tr' );
+               boxbody = box.getElementsByTagName( 'tbody' )[0];
+               row = document.createElement( 'tr' );
                boxbody.insertBefore( row, boxbody.firstChild.nextSibling );
 
                this.existingMatch = opts.existingMatch;
 
-               var cell = document.createElement( 'td' );
+               cell = document.createElement( 'td' );
                row.appendChild( cell );
                // If there is only one protection type, there is nothing to chain
-               if( opts.numTypes > 1 ) {
-                       var check = document.createElement( 'input' );
+               if ( opts.numTypes > 1 ) {
+                       check = document.createElement( 'input' );
                        check.id = 'mwProtectUnchained';
                        check.type = 'checkbox';
                        cell.appendChild( check );
-                       addClickHandler( check, function() { ProtectionForm.onChainClick(); } );
+                       window.addClickHandler( check, function () {
+                               ProtectionForm.onChainClick();
+                       } );
 
                        cell.appendChild( document.createTextNode( ' ' ) );
-                       var label = document.createElement( 'label' );
+                       label = document.createElement( 'label' );
                        label.htmlFor = 'mwProtectUnchained';
                        label.appendChild( document.createTextNode( opts.labelText ) );
                        cell.appendChild( label );
@@ -56,17 +63,19 @@ window.ProtectionForm = {
        /**
         * Sets the disabled attribute on the cascade checkbox depending on the current selected levels
         */
-       'updateCascadeCheckbox': function() {
+       updateCascadeCheckbox: function () {
+               var i, lists, items, selected;
+
                // For non-existent titles, there is no cascade option
-               if( !document.getElementById( 'mwProtect-cascade' ) ) {
+               if ( !document.getElementById( 'mwProtect-cascade' ) ) {
                        return;
                }
-               var lists = this.getLevelSelectors();
-               for( var i = 0; i < lists.length; i++ ) {
-                       if( lists[i].selectedIndex > -1 ) {
-                               var items = lists[i].getElementsByTagName( 'option' );
-                               var selected = items[ lists[i].selectedIndex ].value;
-                               if( !this.isCascadeableLevel(selected) ) {
+               lists = this.getLevelSelectors();
+               for ( i = 0; i < lists.length; i++ ) {
+                       if ( lists[i].selectedIndex > -1 ) {
+                               items = lists[i].getElementsByTagName( 'option' );
+                               selected = items[ lists[i].selectedIndex ].value;
+                               if ( !this.isCascadeableLevel( selected ) ) {
                                        document.getElementById( 'mwProtect-cascade' ).checked = false;
                                        document.getElementById( 'mwProtect-cascade' ).disabled = true;
                                        return;
@@ -81,7 +90,7 @@ window.ProtectionForm = {
         * @param level {String}
         * @return {Boolean}
         */
-       'isCascadeableLevel': function( level ) {
+       isCascadeableLevel: function (  level ) {
                var cascadeLevels, len, i;
 
                cascadeLevels = mw.config.get( 'wgCascadeableLevels' );
@@ -102,9 +111,10 @@ window.ProtectionForm = {
         *
         * @param source Element Level selector that changed
         */
-       'updateLevels': function(source) {
-               if( !this.isUnchained() )
+       updateLevels: function ( source ) {
+               if ( !this.isUnchained() ) {
                        this.setAllSelectors( source.selectedIndex );
+               }
                this.updateCascadeCheckbox();
        },
 
@@ -115,22 +125,24 @@ window.ProtectionForm = {
         * @param source Element expiry input that changed
         */
 
-       'updateExpiry': function(source) {
-               if( !this.isUnchained() ) {
-                       var expiry = source.value;
-                       this.forEachExpiryInput(function(element) {
+       updateExpiry: function ( source ) {
+               var expiry, listId, list;
+
+               if ( !this.isUnchained() ) {
+                       expiry = source.value;
+                       this.forEachExpiryInput( function ( element ) {
                                element.value = expiry;
-                       });
+                       } );
                }
-               var listId = source.id.replace( /^mwProtect-(\w+)-expires$/, 'mwProtectExpirySelection-$1' );
-               var list = document.getElementById( listId );
-               if (list && list.value != 'othertime' ) {
+               listId = source.id.replace( /^mwProtect-(\w+)-expires$/, 'mwProtectExpirySelection-$1' );
+               list = document.getElementById( listId );
+               if ( list && list.value !== 'othertime' ) {
                        if ( this.isUnchained() ) {
                                list.value = 'othertime';
                        } else {
-                               this.forEachExpirySelector(function(element) {
+                               this.forEachExpirySelector( function ( element ) {
                                        element.value = 'othertime';
-                               });
+                               } );
                        }
                }
        },
@@ -141,15 +153,16 @@ window.ProtectionForm = {
         *
         * @param source Element expiry selector that changed
         */
-       'updateExpiryList': function(source) {
-               if( !this.isUnchained() ) {
-                       var expiry = source.value;
-                       this.forEachExpirySelector(function(element) {
+       updateExpiryList: function ( source ) {
+               var expiry;
+               if ( !this.isUnchained() ) {
+                       expiry = source.value;
+                       this.forEachExpirySelector( function ( element ) {
                                element.value = expiry;
-                       });
-                       this.forEachExpiryInput(function(element) {
+                       } );
+                       this.forEachExpiryInput( function ( element ) {
                                element.value = '';
-                       });
+                       } );
                }
        },
 
@@ -157,8 +170,8 @@ window.ProtectionForm = {
         * Update chain status and enable/disable various bits of the UI
         * when the user changes the "unlock move permissions" checkbox
         */
-       'onChainClick': function() {
-               if( this.isUnchained() ) {
+       onChainClick: function () {
+               if ( this.isUnchained() ) {
                        this.enableUnchainedInputs( true );
                } else {
                        this.setAllSelectors( this.getMaxLevel() );
@@ -170,16 +183,17 @@ window.ProtectionForm = {
        /**
         * Returns true if the named attribute in all objects in the given array are matching
         */
-       'matchAttribute' : function( objects, attrName ) {
-               var value = null;
+       matchAttribute: function ( objects, attrName ) {
+               var i, element, value;
 
                // Check levels
-               for ( var i = 0; i < objects.length; i++ ) {
-                       var element = objects[i];
-                       if ( value == null ) {
+               value = null;
+               for ( i = 0; i < objects.length; i++ ) {
+                       element = objects[i];
+                       if ( value === null ) {
                                value = element[attrName];
                        } else {
-                               if ( value != element[attrName] ) {
+                               if ( value !== element[attrName] ) {
                                        return false;
                                }
                        }
@@ -192,7 +206,7 @@ window.ProtectionForm = {
         *
         * @return boolean
         */
-       'areAllTypesMatching': function() {
+       areAllTypesMatching: function () {
                return this.existingMatch
                        && this.matchAttribute( this.getLevelSelectors(), 'selectedIndex' )
                        && this.matchAttribute( this.getExpirySelectors(), 'selectedIndex' )
@@ -204,7 +218,7 @@ window.ProtectionForm = {
         *
         * @return bool
         */
-       'isUnchained': function() {
+       isUnchained: function () {
                var element = document.getElementById( 'mwProtectUnchained' );
                return element
                        ? element.checked
@@ -214,13 +228,13 @@ window.ProtectionForm = {
        /**
         * Find the highest protection level in any selector
         */
-       'getMaxLevel': function() {
+       getMaxLevel: function () {
                var maxIndex = -1;
-               this.forEachLevelSelector(function(element) {
-                       if (element.selectedIndex > maxIndex) {
+               this.forEachLevelSelector( function ( element ) {
+                       if ( element.selectedIndex > maxIndex ) {
                                maxIndex = element.selectedIndex;
                        }
-               });
+               } );
                return maxIndex;
        },
 
@@ -229,12 +243,12 @@ window.ProtectionForm = {
         *
         * @param index int Protection level
         */
-       'setAllSelectors': function(index) {
-               this.forEachLevelSelector(function(element) {
-                       if (element.selectedIndex != index) {
+       setAllSelectors: function ( index ) {
+               this.forEachLevelSelector( function ( element ) {
+                       if ( element.selectedIndex !== index ) {
                                element.selectedIndex = index;
                        }
-               });
+               } );
        },
 
        /**
@@ -242,10 +256,12 @@ window.ProtectionForm = {
         *
         * @param func callable Callback function
         */
-       'forEachLevelSelector': function(func) {
-               var selectors = this.getLevelSelectors();
-               for (var i = 0; i < selectors.length; i++) {
-                       func(selectors[i]);
+       forEachLevelSelector: function ( func ) {
+               var i, selectors;
+
+               selectors = this.getLevelSelectors();
+               for ( i = 0; i < selectors.length; i++ ) {
+                       func( selectors[i] );
                }
        },
 
@@ -254,12 +270,14 @@ window.ProtectionForm = {
         *
         * @return Array
         */
-       'getLevelSelectors': function() {
-               var all = document.getElementsByTagName("select");
-               var ours = [];
-               for (var i = 0; i < all.length; i++) {
-                       var element = all[i];
-                       if (element.id.match(/^mwProtect-level-/)) {
+       getLevelSelectors: function () {
+               var i, ours, all, element;
+
+               all = document.getElementsByTagName( 'select' );
+               ours = [];
+               for ( i = 0; i < all.length; i++ ) {
+                       element = all[i];
+                       if ( element.id.match( /^mwProtect-level-/ ) ) {
                                ours[ours.length] = element;
                        }
                }
@@ -271,10 +289,12 @@ window.ProtectionForm = {
         *
         * @param func callable Callback function
         */
-       'forEachExpiryInput': function(func) {
-               var inputs = this.getExpiryInputs();
-               for (var i = 0; i < inputs.length; i++) {
-                       func(inputs[i]);
+       forEachExpiryInput: function ( func ) {
+               var i, inputs;
+
+               inputs = this.getExpiryInputs();
+               for ( i = 0; i < inputs.length; i++ ) {
+                       func( inputs[i] );
                }
        },
 
@@ -283,12 +303,14 @@ window.ProtectionForm = {
         *
         * @return Array
         */
-       'getExpiryInputs': function() {
-               var all = document.getElementsByTagName("input");
-               var ours = [];
-               for (var i = 0; i < all.length; i++) {
-                       var element = all[i];
-                       if (element.name.match(/^mwProtect-expiry-/)) {
+       getExpiryInputs: function () {
+               var i, all, element, ours;
+
+               all = document.getElementsByTagName( 'input' );
+               ours = [];
+               for ( i = 0; i < all.length; i++ ) {
+                       element = all[i];
+                       if ( element.name.match( /^mwProtect-expiry-/ ) ) {
                                ours[ours.length] = element;
                        }
                }
@@ -299,10 +321,12 @@ window.ProtectionForm = {
         * Apply a callback to each expiry selector list
         * @param func callable Callback function
         */
-       'forEachExpirySelector': function(func) {
-               var inputs = this.getExpirySelectors();
-               for (var i = 0; i < inputs.length; i++) {
-                       func(inputs[i]);
+       forEachExpirySelector: function ( func ) {
+               var i, inputs;
+
+               inputs = this.getExpirySelectors();
+               for ( i = 0; i < inputs.length; i++ ) {
+                       func( inputs[i] );
                }
        },
 
@@ -311,12 +335,14 @@ window.ProtectionForm = {
         *
         * @return Array
         */
-       'getExpirySelectors': function() {
-               var all = document.getElementsByTagName("select");
-               var ours = [];
-               for (var i = 0; i < all.length; i++) {
-                       var element = all[i];
-                       if (element.id.match(/^mwProtectExpirySelection-/)) {
+       getExpirySelectors: function () {
+               var i, all, ours, element;
+
+               all = document.getElementsByTagName( 'select' );
+               ours = [];
+               for ( i = 0; i < all.length; i++ ) {
+                       element = all[i];
+                       if ( element.id.match( /^mwProtectExpirySelection-/ ) ) {
                                ours[ours.length] = element;
                        }
                }
@@ -328,30 +354,33 @@ window.ProtectionForm = {
         *
         * @param val boolean Enable?
         */
-       'enableUnchainedInputs': function(val) {
+       enableUnchainedInputs: function ( val ) {
                var first = true;
-               this.forEachLevelSelector(function(element) {
-                       if (first) {
+
+               this.forEachLevelSelector( function ( element ) {
+                       if ( first ) {
                                first = false;
                        } else {
                                element.disabled = !val;
                        }
-               });
+               } );
                first = true;
-               this.forEachExpiryInput(function(element) {
-                       if (first) {
+               this.forEachExpiryInput( function ( element ) {
+                       if ( first ) {
                                first = false;
                        } else {
                                element.disabled = !val;
                        }
-               });
+               } );
                first = true;
-               this.forEachExpirySelector(function(element) {
-                       if (first) {
+               this.forEachExpirySelector( function ( element ) {
+                       if ( first ) {
                                first = false;
                        } else {
                                element.disabled = !val;
                        }
-               });
+               } );
        }
 };
+
+}( mediaWiki, jQuery ) );
index 160de86..580cf25 100644 (file)
@@ -1,12 +1,14 @@
+/*jshint camelcase:false */
 ( function ( mw, $ ) {
-var    ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
+var    licenseSelectorCheck, wgUploadWarningObj, wgUploadLicenseObj, fillDestFilename,
+       ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
        fileExtensions = mw.config.get( 'wgFileExtensions' );
 
-window.licenseSelectorCheck = function() {
-       var selector = document.getElementById( "wpLicense" );
-       var selection = selector.options[selector.selectedIndex].value;
-       if( selector.selectedIndex > 0 ) {
-               if( selection == "" ) {
+licenseSelectorCheck = window.licenseSelectorCheck = function () {
+       var selector = document.getElementById( 'wpLicense' ),
+               selection = selector.options[selector.selectedIndex].value;
+       if ( selector.selectedIndex > 0 ) {
+               if ( !selection ) {
                        // Option disabled, but browser is broken and doesn't respect this
                        selector.selectedIndex = 0;
                }
@@ -17,23 +19,29 @@ window.licenseSelectorCheck = function() {
 
 function uploadSetup() {
        // Disable URL box if the URL copy upload source type is not selected
-       var e = document.getElementById( 'wpSourceTypeurl' );
-       if( e ) {
-               if( !e.checked ) {
-                       var ein = document.getElementById( 'wpUploadFileURL' );
-                       if(ein)
-                               ein.setAttribute( 'disabled', 'disabled' );
+       var ein,
+               selector, ua, isMacIe, i,
+               optionsTable, row, td,
+               wpLicense, wpLicenseRow, wpLicenseTbody,
+               uploadSourceIds, len, onchange,
+               e = document.getElementById( 'wpSourceTypeurl' );
+       if ( e ) {
+               if ( !e.checked ) {
+                       ein = document.getElementById( 'wpUploadFileURL' );
+                       if ( ein ) {
+                               ein.disabled = true;
+                       }
                }
        }
 
        // For MSIE/Mac: non-breaking spaces cause the <option> not to render.
        // But for some reason, setting the text to itself works
-       var selector = document.getElementById("wpLicense");
-       if (selector) {
-               var ua = navigator.userAgent;
-               var isMacIe = (ua.indexOf("MSIE") != -1) && (ua.indexOf("Mac") != -1);
-               if (isMacIe) {
-                       for (var i = 0; i < selector.options.length; i++) {
+       selector = document.getElementById( 'wpLicense' );
+       if ( selector ) {
+               ua = navigator.userAgent;
+               isMacIe = ua.indexOf( 'MSIE' ) !== -1 && ua.indexOf( 'Mac' ) !== -1;
+               if ( isMacIe ) {
+                       for ( i = 0; i < selector.options.length; i++ ) {
                                selector.options[i].text = selector.options[i].text;
                        }
                }
@@ -43,31 +51,31 @@ function uploadSetup() {
        if ( ajaxUploadDestCheck ) {
                // Insert an event handler that fetches upload warnings when wpDestFile
                // has been changed
-               document.getElementById( 'wpDestFile' ).onchange = function ( e ) {
-                       wgUploadWarningObj.checkNow(this.value);
+               document.getElementById( 'wpDestFile' ).onchange = function () {
+                       wgUploadWarningObj.checkNow( this.value );
                };
                // Insert a row where the warnings will be displayed just below the
                // wpDestFile row
-               var optionsTable = document.getElementById( 'mw-htmlform-description' ).tBodies[0];
-               var row = optionsTable.insertRow( 1 );
-               var td = document.createElement( 'td' );
+               optionsTable = document.getElementById( 'mw-htmlform-description' ).tBodies[0];
+               row = optionsTable.insertRow( 1 );
+               td = document.createElement( 'td' );
                td.id = 'wpDestFile-warning';
                td.colSpan = 2;
 
                row.appendChild( td );
        }
 
-       var wpLicense = document.getElementById( 'wpLicense' );
+       wpLicense = document.getElementById( 'wpLicense' );
        if ( mw.config.get( 'wgAjaxLicensePreview' ) && wpLicense ) {
                // License selector check
                wpLicense.onchange = licenseSelectorCheck;
 
                // License selector table row
-               var wpLicenseRow = wpLicense.parentNode.parentNode;
-               var wpLicenseTbody = wpLicenseRow.parentNode;
+               wpLicenseRow = wpLicense.parentNode.parentNode;
+               wpLicenseTbody = wpLicenseRow.parentNode;
 
-               var row = document.createElement( 'tr' );
-               var td = document.createElement( 'td' );
+               row = document.createElement( 'tr' );
+               td = document.createElement( 'td' );
                row.appendChild( td );
                td = document.createElement( 'td' );
                td.id = 'mw-license-preview';
@@ -78,63 +86,75 @@ function uploadSetup() {
 
 
        // fillDestFile setup
-       var     i,
-               uploadSourceIds = mw.config.get( 'wgUploadSourceIds' ),
-               len = uploadSourceIds.length;
-       for ( i = 0; i < len; i += 1 )
-               document.getElementById( uploadSourceIds[i] ).onchange = function (e) {
-                       fillDestFilename( this.id );
-               };
-};
+       uploadSourceIds = mw.config.get( 'wgUploadSourceIds' );
+       len = uploadSourceIds.length;
+       onchange = function () {
+               fillDestFilename( this.id );
+       };
+       for ( i = 0; i < len; i += 1 ) {
+               document.getElementById( uploadSourceIds[i] ).onchange = onchange;
+       }
+}
 
+wgUploadWarningObj = window.wgUploadWarningObj = {
+       responseCache: { '' : '&nbsp;' },
+       nameToCheck: '',
+       typing: false,
+       delay: 500, // ms
+       timeoutID: false,
 
-window.wgUploadWarningObj = {
-       'responseCache' : { '' : '&nbsp;' },
-       'nameToCheck' : '',
-       'typing': false,
-       'delay': 500, // ms
-       'timeoutID': false,
+       keypress: function () {
+               var cached, destFile, warningElt;
 
-       'keypress': function () {
-               if ( !ajaxUploadDestCheck ) return;
+               if ( !ajaxUploadDestCheck ) {
+                       return;
+               }
 
                // Find file to upload
-               var destFile = document.getElementById('wpDestFile');
-               var warningElt = document.getElementById( 'wpDestFile-warning' );
-               if ( !destFile || !warningElt ) return ;
+               destFile = document.getElementById( 'wpDestFile' );
+               warningElt = document.getElementById( 'wpDestFile-warning' );
+               if ( !destFile || !warningElt ) {
+                       return;
+               }
 
-               this.nameToCheck = destFile.value ;
+               this.nameToCheck = destFile.value;
 
                // Clear timer
                if ( this.timeoutID ) {
-                       window.clearTimeout( this.timeoutID );
+                       clearTimeout( this.timeoutID );
                }
                // Check response cache
-               for (cached in this.responseCache) {
-                       if (this.nameToCheck == cached) {
+               for ( cached in this.responseCache ) {
+                       if ( this.nameToCheck === cached ) {
                                this.setWarning(this.responseCache[this.nameToCheck]);
                                return;
                        }
                }
 
-               this.timeoutID = window.setTimeout( 'wgUploadWarningObj.timeout()', this.delay );
+               this.timeoutID = setTimeout( function () {
+                       wgUploadWarningObj.timeout();
+               }, this.delay );
        },
 
-       'checkNow': function (fname) {
-               if ( !ajaxUploadDestCheck ) return;
+       checkNow: function ( fname ) {
+               if ( !ajaxUploadDestCheck ) {
+                       return;
+               }
                if ( this.timeoutID ) {
-                       window.clearTimeout( this.timeoutID );
+                       clearTimeout( this.timeoutID );
                }
                this.nameToCheck = fname;
                this.timeout();
        },
 
-       'timeout' : function() {
-               if ( !ajaxUploadDestCheck || this.nameToCheck === '' ) return;
-               injectSpinner( document.getElementById( 'wpDestFile' ), 'destcheck' );
+       timeout: function () {
+               if ( !ajaxUploadDestCheck || this.nameToCheck === '' ) {
+                       return;
+               }
+               window.injectSpinner( document.getElementById( 'wpDestFile' ), 'destcheck' );
 
                var uploadWarningObj = this;
-               ( new mw.Api ).get( {
+               ( new mw.Api() ).get( {
                        action: 'query',
                        titles: ( new mw.Title( this.nameToCheck, mw.config.get( 'wgNamespaceIds' ).file ) ).getPrefixedText(),
                        prop: 'imageinfo',
@@ -149,89 +169,101 @@ window.wgUploadWarningObj = {
                } );
        },
 
-       'processResult' : function ( result, fileName ) {
-               removeSpinner( 'destcheck' );
+       processResult: function ( result, fileName ) {
+               window.removeSpinner( 'destcheck' );
                this.setWarning( result.html );
                this.responseCache[fileName] = result.html;
        },
 
-       'setWarning' : function (warning) {
-               var warningElt = document.getElementById( 'wpDestFile-warning' );
-               var ackElt = document.getElementsByName( 'wpDestFileWarningAck' );
+       setWarning: function ( warning ) {
+               var warningElt = document.getElementById( 'wpDestFile-warning' ),
+                       ackElt = document.getElementsByName( 'wpDestFileWarningAck' );
 
                this.setInnerHTML(warningElt, warning);
 
                // Set a value in the form indicating that the warning is acknowledged and
                // doesn't need to be redisplayed post-upload
-               if ( warning == '' ) {
+               if ( !warning ) {
                        ackElt[0].value = '';
                } else {
                        ackElt[0].value = '1';
                }
 
        },
-       'setInnerHTML' : function (element, text) {
+       setInnerHTML: function ( element, text ) {
                // Check for no change to avoid flicker in IE 7
-               if (element.innerHTML != text) {
+               if ( element.innerHTML !== text ) {
                        element.innerHTML = text;
                }
        }
 };
 
-window.fillDestFilename = function(id) {
+fillDestFilename = window.fillDestFilename = function ( id ) {
+       var e, path, slash, backslash, fname,
+               found, ext, i,
+               destFile;
        if ( !mw.config.get( 'wgUploadAutoFill' ) ) {
                return;
        }
-       if (!document.getElementById) {
+       if ( !document.getElementById ) {
                return;
        }
        // Remove any previously flagged errors
-       var e = document.getElementById( 'mw-upload-permitted' );
-       if( e ) e.className = '';
+       e = document.getElementById( 'mw-upload-permitted' );
+       if ( e ) {
+               e.className = '';
+       }
 
-       var e = document.getElementById( 'mw-upload-prohibited' );
-       if( e ) e.className = '';
+       e = document.getElementById( 'mw-upload-prohibited' );
+       if ( e ) {
+               e.className = '';
+       }
 
-       var path = document.getElementById(id).value;
+       path = document.getElementById( id ).value;
        // Find trailing part
-       var slash = path.lastIndexOf('/');
-       var backslash = path.lastIndexOf('\\');
-       var fname;
-       if (slash == -1 && backslash == -1) {
+       slash = path.lastIndexOf( '/' );
+       backslash = path.lastIndexOf( '\\' );
+       if ( slash === -1 && backslash === -1 ) {
                fname = path;
-       } else if (slash > backslash) {
-               fname = path.substring(slash+1, 10000);
+       } else if ( slash > backslash ) {
+               fname = path.substring( slash + 1, 10000 );
        } else {
-               fname = path.substring(backslash+1, 10000);
+               fname = path.substring( backslash + 1, 10000 );
        }
 
        // Clear the filename if it does not have a valid extension.
        // URLs are less likely to have a useful extension, so don't include them in the
        // extension check.
        if ( mw.config.get( 'wgStrictFileExtensions' ) && fileExtensions && id !== 'wpUploadFileURL' ) {
-               var found = false;
+               found = false;
                if ( fname.lastIndexOf( '.' ) !== -1 ) {
-                       var ext = fname.substr( fname.lastIndexOf( '.' ) + 1 );
-                       for ( var i = 0; i < fileExtensions.length; i += 1 ) {
+                       ext = fname.substr( fname.lastIndexOf( '.' ) + 1 );
+                       for ( i = 0; i < fileExtensions.length; i += 1 ) {
                                if ( fileExtensions[i].toLowerCase() === ext.toLowerCase() ) {
                                        found = true;
                                        break;
                                }
                        }
                }
-               if( !found ) {
+               if ( !found ) {
                        // Not a valid extension
                        // Clear the upload and set mw-upload-permitted to error
-                       document.getElementById(id).value = '';
-                       var e = document.getElementById( 'mw-upload-permitted' );
-                       if( e ) e.className = 'error';
+                       document.getElementById( id ).value = '';
+                       e = document.getElementById( 'mw-upload-permitted' );
+                       if ( e ) {
+                               e.className = 'error';
+                       }
 
-                       var e = document.getElementById( 'mw-upload-prohibited' );
-                       if( e ) e.className = 'error';
+                       e = document.getElementById( 'mw-upload-prohibited' );
+                       if ( e ) {
+                               e.className = 'error';
+                       }
 
                        // Clear wpDestFile as well
-                       var e = document.getElementById( 'wpDestFile' );
-                       if( e ) e.value = '';
+                       e = document.getElementById( 'wpDestFile' );
+                       if ( e ) {
+                               e.value = '';
+                       }
 
                        return false;
                }
@@ -245,45 +277,51 @@ window.fillDestFilename = function(id) {
        }
 
        // Output result
-       var destFile = document.getElementById( 'wpDestFile' );
+       destFile = document.getElementById( 'wpDestFile' );
        if ( destFile ) {
                // Call decodeURIComponent function to remove possible URL-encoded characters
                // from the file name (bug 30390). Especially likely with upload-form-url.
                // decodeURIComponent can throw an exception in input is invalid utf-8
                try {
                        destFile.value = decodeURIComponent( fname );
-               } catch ( e ) {
+               } catch ( err ) {
                        destFile.value = fname;
                }
                wgUploadWarningObj.checkNow( fname );
        }
 };
 
-window.toggleFilenameFiller = function() {
-       if(!document.getElementById) return;
-       var upfield = document.getElementById('wpUploadFile');
-       var destName = document.getElementById('wpDestFile').value;
-       wgUploadAutoFill = ( destName == '' || destName == ' ' );
+window.toggleFilenameFiller = function () {
+       if ( !document.getElementById ) {
+               return;
+       }
+       var destName = document.getElementById( 'wpDestFile' ).value;
+       mw.config.set( 'wgUploadAutoFill', !destName );
 };
 
-window.wgUploadLicenseObj = {
+wgUploadLicenseObj = window.wgUploadLicenseObj = {
 
-       'responseCache' : { '' : '' },
+       responseCache: { '' : '' },
 
-       'fetchPreview': function( license ) {
-               if ( !mw.config.get( 'wgAjaxLicensePreview' ) ) return;
-               for (cached in this.responseCache) {
-                       if (cached == license) {
+       fetchPreview: function ( license ) {
+               var cached, title;
+               if ( !mw.config.get( 'wgAjaxLicensePreview' ) ) {
+                       return;
+               }
+               for ( cached in this.responseCache ) {
+                       if ( cached === license ) {
                                this.showPreview( this.responseCache[license] );
                                return;
                        }
                }
-               injectSpinner( document.getElementById( 'wpLicense' ), 'license' );
+               window.injectSpinner( document.getElementById( 'wpLicense' ), 'license' );
 
-               var title = document.getElementById('wpDestFile').value;
-               if ( !title ) title = 'File:Sample.jpg';
+               title = document.getElementById( 'wpDestFile' ).value;
+               if ( !title ) {
+                       title = 'File:Sample.jpg';
+               }
 
-               ( new mw.Api ).get( {
+               ( new mw.Api() ).get( {
                        action: 'parse',
                        text: '{{' + license + '}}',
                        title: title,
@@ -294,16 +332,17 @@ window.wgUploadLicenseObj = {
                } );
        },
 
-       'processResult' : function( result, license ) {
-               removeSpinner( 'license' );
-               this.responseCache[license] = result['parse']['text']['*'];
+       processResult: function ( result, license ) {
+               window.removeSpinner( 'license' );
+               this.responseCache[license] = result.parse.text['*'];
                this.showPreview( this.responseCache[license] );
        },
 
-       'showPreview' : function( preview ) {
+       showPreview: function ( preview ) {
                var previewPanel = document.getElementById( 'mw-license-preview' );
-               if( previewPanel.innerHTML != preview )
+               if ( previewPanel.innerHTML !== preview ) {
                        previewPanel.innerHTML = preview;
+               }
        }
 
 };
diff --git a/skins/common/wikiprintable.css b/skins/common/wikiprintable.css
deleted file mode 100644 (file)
index dc236ea..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/* MediaWiki print stylesheet */
-
-body {
-       color: #000000;
-       background: #ffffff;
-}
-
-/* MSIE/Win doesn't understand 'inherit' */
-a,
-a.external,
-a.new,
-a.stub {
-       color: black !important;
-       text-decoration: none !important;
-}
-#article {
-       margin: 0 !important;
-}
-
-/* Continue ... */
-a,
-a.external,
-a.new,
-a.stub {
-       color: inherit !important;
-       text-decoration: inherit !important;
-}
-
-/* Hide UI stuff */
-#quickbar,
-#topbar,
-#logo,
-#footer,
-#siteNotice,
-.mw-editsection,
-.toctoggle {
-       display: none;
-}
-
-/* */
-#article {
-       position: relative;
-       margin: inherit !important;
-}
-
-.printfooter {
-       border-top: solid 1px black;
-       display: block !important;
-}
-
-/* Old stuff. @todo FIXME:
-a.CBlink { color: #0000AA; text-decoration: none; font-size: 12pt; }
-a.interwiki,
-a.external { color: #3333BB; text-decoration: none; }
-h1.pagetitle { padding-bottom: 0; margin-bottom: 0; }
-i.link,
-u.link { color: #000066; }
-p.subtitle { padding-top: 0; margin-top: 0; }
-*/
index acf260f..6308383 100644 (file)
Binary files a/skins/modern/external.png and b/skins/modern/external.png differ
index 47c320b..40fbfd7 100644 (file)
@@ -405,8 +405,7 @@ h1, h2, h3, h4, h5, h6 {
        text-decoration: none;
        color: white;
 }
-#mw_content a.external,
-#mw_content a.external[href ^="gopher://"] {
+#mw_content a.external {
        /* @embed */
        background: url(external.png) center right no-repeat;
        padding-right: 13px;
index ec1ce43..534d333 100644 (file)
@@ -70,15 +70,6 @@ div#footer {
 #portal-personaltools {
        padding-bottom: 0.1em;
 }
-#bodyContent a.external {
-       background: url(external.png) center right no-repeat;
-       padding-right: 13px;
-}
-
-.rtl #bodyContent a.external {
-       background-image: url(external-rtl.png);
-       padding-right: 13px;
-}
 
 .rtl a.feedlink {
        background-position: right;
index acf260f..6308383 100644 (file)
Binary files a/skins/monobook/external-ltr.png and b/skins/monobook/external-ltr.png differ
index 7d5ee37..5313234 100644 (file)
Binary files a/skins/monobook/external-rtl.png and b/skins/monobook/external-rtl.png differ
index 50b9e09..d8f25eb 100644 (file)
@@ -142,8 +142,7 @@ table.rimage {
 ** keep the whitespace in front of the ^=, hides rule from konqueror
 ** this is css3, the validator doesn't like it when validating as css2
 */
-#bodyContent a.external,
-#bodyContent a.external[href ^="gopher://"] {
+#bodyContent a.external {
        /* @embed */
        background: url(external-ltr.png) center right no-repeat;
        padding-right: 13px;
index 462ca64..43e4691 100644 (file)
Binary files a/skins/vector/images/edit-icon.png and b/skins/vector/images/edit-icon.png differ
index acf260f..6308383 100644 (file)
Binary files a/skins/vector/images/external-link-ltr-icon.png and b/skins/vector/images/external-link-ltr-icon.png differ
index 7d5ee37..5313234 100644 (file)
Binary files a/skins/vector/images/external-link-rtl-icon.png and b/skins/vector/images/external-link-rtl-icon.png differ
index 9823d72..0d93a2f 100644 (file)
Binary files a/skins/vector/images/mail-icon.png and b/skins/vector/images/mail-icon.png differ
index ade1a37..6f27054 100644 (file)
Binary files a/skins/vector/images/news-icon.png and b/skins/vector/images/news-icon.png differ
index 1436cda..b4a6034 100644 (file)
Binary files a/skins/vector/images/page-fade.png and b/skins/vector/images/page-fade.png differ
index cec17ea..20bf366 100644 (file)
Binary files a/skins/vector/images/portal-break-ltr.png and b/skins/vector/images/portal-break-ltr.png differ
index e59f578..b529308 100644 (file)
Binary files a/skins/vector/images/preferences-break.png and b/skins/vector/images/preferences-break.png differ
index c03c72e..6d37af5 100644 (file)
Binary files a/skins/vector/images/tab-break.png and b/skins/vector/images/tab-break.png differ
index c443435..0332054 100644 (file)
Binary files a/skins/vector/images/talk-icon.png and b/skins/vector/images/talk-icon.png differ
index e934a0f..ed85232 100644 (file)
Binary files a/skins/vector/images/video-icon.png and b/skins/vector/images/video-icon.png differ
index 8a69f84..c164c6d 100644 (file)
@@ -703,8 +703,7 @@ pre, .mw-code {
        margin-top: 0;
        font-size: 1.6em;
 }
-div#content a.external,
-div#content a.external[href ^="gopher://"] {
+div#content a.external {
        /* @embed */
        background: url(images/external-link-ltr-icon.png) center right no-repeat;
        padding-right: 13px;
index 146f867..47189fc 100644 (file)
@@ -586,7 +586,7 @@ parsoid
 !! input
 '''foo'''''
 !! result
-<p><b>foo<i></i></b>
+<p><b>foo</b><i></i>
 </p>
 !!end
 
@@ -643,7 +643,7 @@ parsoid
 !! input
 ''''foo'''''
 !! result
-<p>'<b>foo<i></i></b>
+<p>'<b>foo</b><i></i>
 </p>
 !!end
 
@@ -653,26 +653,14 @@ parsoid
 ###
 
 !! test
-Italics and bold: 5-quote opening sequence: (5,2) (php)
+Italics and bold: 5-quote opening sequence: (5,2)
 !! options
-php
 !! input
 '''''foo''
 !! result
 <p><b><i>foo</i></b>
 </p>
 !!end
-# Parsoid reverses the nesting order, compared to the PHP parser
-!! test
-Italics and bold: 5-quote opening sequence: (5,2) (parsoid)
-!! options
-parsoid
-!! input
-'''''foo''
-!! result
-<p><i><b>foo</b></i>
-</p>
-!!end
 
 
 !! test
@@ -815,32 +803,15 @@ Italics and bold: other quote tests: (3,2,3,2)
 !!end
 
 
-# The Parsoid team believes the PHP parser's output on this test is wrong.
-# It only checks for convert-to-bold-on-single-character-word when the word
-# matches with a bold tag ("'''") that is *odd* in the list of quote tokens.
-# This means that the bold token in position 2 (0-indexed) gets converted by
-# parsoid, but doesn't get changed by the PHP parser.
 !! test
-Italics and bold: other quote tests: (3,2,3,3) (php)
+Italics and bold: other quote tests: (3,2,3,3)
 !! options
-php
 !! input
 '''this is about ''foo'''s family'''
 !! result
 <p>'<i>this is about </i>foo<b>s family</b>
 </p>
 !!end
-# This is the output the Parsoid team believes to be correct.
-!! test
-Italics and bold: other quote tests: (3,2,3,3) (parsoid)
-!! options
-parsoid
-!! input
-'''this is about ''foo'''s family'''
-!! result
-<p><b>this is about <i>foo'</i>s family</b>
-</p>
-!!end
 
 
 !! test
@@ -1042,7 +1013,7 @@ parsoid
 !! input
 {{echo|&ndash;}}
 !! result
-<p><span typeof="mw:Transclusion mw:Entity" data-mw='{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&amp;ndash;"}},"i":0}'>&ndash;</span>
+<p><span typeof="mw:Transclusion mw:Entity" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&amp;ndash;"}},"i":0}}]}'>&ndash;</span>
 </p>
 !! end
 
@@ -1239,8 +1210,9 @@ b
 </p><p>b
 </p>
 !! end
+
 !! test
-Block tag on one line
+Block tag on one line (<div>)
 !! input
 a <div>foo</div>
 
@@ -1252,7 +1224,19 @@ a <div>foo</div>
 !! end
 
 !! test
-Block tag on both lines
+Block tag on one line (<blockquote>)
+!! input
+a <blockquote>foo</blockquote>
+
+b
+!! result
+a <blockquote>foo</blockquote>
+<p>b
+</p>
+!! end
+
+!! test
+Block tag on both lines (<div>)
 !! input
 a <div>foo</div>
 
@@ -1263,6 +1247,18 @@ b <div>foo</div>
 
 !! end
 
+!! test
+Block tag on both lines (<blockquote>)
+!! input
+a <blockquote>foo</blockquote>
+
+b <blockquote>foo</blockquote>
+!! result
+a <blockquote>foo</blockquote>
+b <blockquote>foo</blockquote>
+
+!! end
+
 !! test
 Multiple lines without block tags
 !! input
@@ -1389,17 +1385,61 @@ Regression with preformatted in <center>
 
 !! end
 
-# Expected output in the following test is not really expected (there should be
-# <pre> in the output) -- it's only testing for well-formedness.
 !! test
-Bug 6200: Preformatted in <blockquote>
+Bug 52763: Preformatted in <blockquote>
 !! input
 <blockquote>
  Blah
 </blockquote>
 !! result
 <blockquote>
- Blah
+<p> Blah
+</p>
+</blockquote>
+
+!! end
+
+!! test
+Bug 51086: Double newlines in blockquotes should be turned into paragraphs
+!! input
+<blockquote>
+Foo
+
+Bar
+</blockquote>
+!! result
+<blockquote>
+<p>Foo
+</p><p>Bar
+</p>
+</blockquote>
+
+!! end
+
+!! test
+Bug 15491: <ins>/<del> in blockquote
+!! input
+<blockquote>
+Foo <del>bar</del> <ins>baz</ins> quux
+</blockquote>
+!! result
+<blockquote>
+<p>Foo <del>bar</del> <ins>baz</ins> quux
+</p>
+</blockquote>
+
+!! end
+
+# Note that the p-wrapping is newline sensitive, which could be
+# considered a bug: tidy will wrap only the 'Foo' in the example
+# below in a <p> tag. (see comment 23-25 of bug #6200)
+!! test
+Bug 15491: <ins>/<del> in blockquote (2)
+!! input
+<blockquote>Foo <del>bar</del> <ins>baz</ins> quux
+</blockquote>
+!! result
+<blockquote>Foo <del>bar</del> <ins>baz</ins> quux
 </blockquote>
 
 !! end
@@ -1629,6 +1669,62 @@ Templates: Indent-Pre: 1f: Wrapping should be based on expanded content
 </pre>
 !!end
 
+# TODO / maybe: fix wt2wt for this
+!! test
+Parsoid: Don't paragraph-wrap fosterable content
+!! options
+parsoid=wt2html
+!! input
+{|
+<td></td>
+<td></td>
+
+
+
+|}
+!! result
+<table>
+
+<tbody>
+<tr>
+<td></td>
+
+<td></td></tr>
+
+
+
+</tbody></table>
+!! end
+
+!! test
+Parsoid: Don't paragraph-wrap fosterable content even if table syntax is unbalanced
+!! options
+parsoid=wt2html
+!! input
+{|
+<td>
+<td>
+</td>
+
+
+
+|}
+!! result
+<table>
+
+<tbody>
+<tr>
+<td></td>
+
+<td>
+</td></tr>
+
+
+
+</tbody></table>
+!! end
+
+
 #--------------------------------------------------------------------
 # Transclusion parameter whitespace stripping tests
 # Behavior is different for positional and named parameters
@@ -1658,7 +1754,6 @@ Templates: Strip leading and trailing whitespace from named-param values
 
 !! test
 Templates: Don't strip whitespace from positional-param values
-!! options
 !! input
 {{echo|a }}
 
@@ -1702,6 +1797,19 @@ Templates: Don't strip whitespace from positional-param values
 </pre>
 !! end
 
+!! test
+Templates: Handle empty comment-and-ws-only lines correctly
+!! input
+{{echo|foo
+<!--should be ignored-->
+ <!--should be ignored as well-->
+bar}}
+!! result
+<p>foo
+bar
+</p>
+!! end
+
 #--------------------------------------------------------------------
 # Transclusion parameter escaping tests
 #--------------------------------------------------------------------
@@ -1713,7 +1821,7 @@ parsoid
 {{echo|[foo]|{{echo|[bar]}}}}
 !! result
 <p about="#mwt1" typeof="mw:Transclusion"
-data-mw="{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;[foo]&quot;},&quot;2&quot;:{&quot;wt&quot;:&quot;{{echo|[bar]}}&quot;}},&quot;i&quot;:0}">[foo]</p>
+data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[foo]"},"2":{"wt":"{{echo|[bar]}}"}},"i":0}}]}'>[foo]</p>
 !! end
 
 !! test
@@ -1723,7 +1831,7 @@ parsoid
 !! input
 {{echo|[{{echo|http://example.com}} link]}}
 !! result
-<p><a rel="mw:ExtLink" href="http://example.com" about="#mwt31" typeof="mw:Transclusion" data-mw="{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;[{{echo|http://example.com}} link]&quot;}},&quot;i&quot;:0}">link</a></p>
+<p><a rel="mw:ExtLink" href="http://example.com" about="#mwt31" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[{{echo|http://example.com}} link]"}},"i":0}}]}'>link</a></p>
 !! end
 
 !! test
@@ -1735,7 +1843,7 @@ parsoid
 !! result
 <p><a rel="mw:ExtLink" href="http://foo.com/a|b" about="#mwt1"
 typeof="mw:Transclusion"
-data-mw='{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"http://foo.com/a|b"}},"i":0}'>http://foo.com/a|b</a></p>
+data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"http://foo.com/a&amp;#124;b"}},"i":0}}]}'>http://foo.com/a|b</a></p>
 !! end
 
 !! test
@@ -1747,8 +1855,8 @@ parsoid=html2wt,wt2wt
 !! result
 <p><a rel="mw:ExtLink" href="http://foo.com/a|b" about="#mwt1"
 typeof="mw:Transclusion"
-data-mw='{"target":{"wt":"echo","href":"./Template:Echo"},
-"params":{"1":{"wt":"[http://foo.com/a|b a|b]"}},"i":0}'>a|b</a></p>
+data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},
+"params":{"1":{"wt":"[http://foo.com/a|b a|b]"}},"i":0}}]}'>a|b</a></p>
 !! end
 
 !! test
@@ -1760,12 +1868,23 @@ parsoid=html2wt,wt2wt
 {{echo|<nowiki>&lt;div&gt;</nowiki>}}
 {{echo|<nowiki></nowiki>}}
 !! result
-<p><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo<nowiki>|</nowiki>bar"}},"i":0}'}'>foo</span><span typeof="mw:Nowiki" about="#mwt1">|</span><span about="#mwt1">bar</span>
-<span typeof="mw:Transclusion mw:Nowiki" about="#mwt2" data-mw='{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<nowiki>&amp;lt;div&amp;gt;</nowiki>"}},"i":0}'><span typeof="mw:Entity">&lt;</span>div<span typeof="mw:Entity">&gt;</span></span>
-<span typeof="mw:Transclusion mw:Nowiki" about="#mwt3" data-mw='{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<nowiki></nowiki>"}},"i":0}'></span>
+<p><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo<nowiki>|</nowiki>bar"}},"i":0}}]}'}'>foo</span><span typeof="mw:Nowiki" about="#mwt1">|</span><span about="#mwt1">bar</span>
+<span typeof="mw:Transclusion mw:Nowiki" about="#mwt2" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<nowiki>&amp;lt;div&amp;gt;</nowiki>"}},"i":0}}]}'><span typeof="mw:Entity">&lt;</span>div<span typeof="mw:Entity">&gt;</span></span>
+<span typeof="mw:Transclusion mw:Nowiki" about="#mwt3" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<nowiki></nowiki>"}},"i":0}}]}'></span>
 </p>
 !! end
 
+## Bug 52824
+!! test
+Templates: '=' char in nested transclusions should not trigger nowiki escapes or conversion to named param
+!! options
+parsoid=html2wt,wt2wt
+!! input
+{{echo|{{echo|1=bar}}}}
+!! result
+<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{echo|1=bar}}"}},"i":0}}]}'>bar</p>
+!! end
+
 ###
 ### Parsoid-centric tests for testing RT edge cases for pre
 ###
 !!input
  <p> foo </p>
  <div> foo </div>
+ <blockquote> foo </blockquote>
  <span> foo </span>
 !!result
  <p> foo </p>
  <div> foo </div>
+ <blockquote> foo </blockquote>
 <pre><span> foo </span>
 </pre>
 !!end
@@ -1909,6 +2030,12 @@ c
  foo
 </blockquote>
 
+<blockquote>
+<pre>
+foo
+</pre>
+</blockquote>
+
 <table><tr><td>
  foo
 </td></tr></table>
@@ -1930,7 +2057,13 @@ c
 </pre>
 </center>
 <blockquote>
- foo
+<p> foo
+</p>
+</blockquote>
+<blockquote>
+<pre>
+foo
+</pre>
 </blockquote>
 <table><tr><td>
 <pre>foo
@@ -2006,7 +2139,9 @@ parsoid=wt2html,wt2wt
  [[Category:foo]] <!-- No pre-wrapping -->
 {{echo| [[Category:foo]]}} <!-- No pre-wrapping -->
 !! result
-  <span typeof="mw:Transclusion"> </span> 
+ <link rel="mw:WikiLink/Category" href="./Category:Foo"> <!-- No pre-wrapping -->
+<span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":" [[Category:foo]]"}},"i":0}}]}'> </span>
+<link rel="mw:WikiLink/Category" href="./Category:Foo" about="#mwt1"> <!-- No pre-wrapping -->
 !! end
 
 !! test
@@ -2017,8 +2152,10 @@ parsoid=wt2html,wt2wt
  [[Category:foo]] a
  [[Category:foo]] {{echo|b}}
 !! result
-<pre> a <span typeof="mw:Transclusion">b</span>
-</pre>
+<pre>
+<link rel="mw:WikiLink/Category" href="./Category:Foo"> a
+
+<link rel="mw:WikiLink/Category" href="./Category:Foo"> <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b"}},"i":0}}]}'>b</span></pre>
 !! end
 
 ###
@@ -3574,8 +3711,7 @@ Plain ''italic'''s plain
 !! end
 # Parsoid inserts an empty bold tag pair at the end of the line, that the PHP
 # parser strips. The wikitext contains just the first half of the bold
-# quote pair. (There's also a case where Parsoid nests <b> and <i>
-# differently than the PHP parser.)
+# quote pair.
 !! test
 Unclosed and unmatched quotes (parsoid)
 !! options
@@ -3603,7 +3739,7 @@ Normal text.
 Plain ''italic'''s plain
 !! result
 <p><i><b>Bold italic text </b>with bold deactivated<b> in between.</b></i>
-</p><p><i><b>Bold italic text </b></i><b>with italic deactivated<i> in between.</i></b>
+</p><p><b><i>Bold italic text </i>with italic deactivated<i> in between.</i></b>
 </p><p><b>Bold text..</b>
 </p><p>..spanning two paragraphs (should not work).<b></b>
 </p><p><b>Bold tag left open</b>
@@ -4067,11 +4203,14 @@ Template-generated table cell attributes and cell content
 !! input
 {|
 |{{table_attribs}}
+| {{table_attribs}}
 |}
 !! result
 <table>
 <tr>
 <td style="color: red"> Foo
+</td>
+<td style="color: red"> Foo
 </td></tr></table>
 
 !! end
@@ -4321,22 +4460,18 @@ Parsoid: Default to a newline after tables in new content (bug 51219)
 parsoid=html2wt
 !! input
 {|
-|-
 |foo
 |}
 <nowiki> </nowiki>bar
 {|
-|-
 |baz
 |}
 '''quux'''
 !! result
 <table><tbody>
-<tr>
-<td>foo</td></tr></tbody></table> bar
+<tr><td>foo</td></tr></tbody></table> bar
 <table><tbody>
-<tr>
-<td>baz</td></tr></tbody></table><b>quux</b>
+<tr><td>baz</td></tr></tbody></table><b>quux</b>
 !! end
 
 ###
@@ -4975,6 +5110,12 @@ Interwiki link with fragment (bug 2130)
 </p>
 !! end
 
+
+###
+### Interlanguage links
+### Language links (so that searching for '### language' matches..)
+###
+
 !! test
 Interlanguage link
 !! input
@@ -5032,6 +5173,19 @@ language=ln
 </p>
 !! end
 
+!! test
+Parsoid bug 53221: Wikilinks should be properly entity-escaped
+!! options
+parsoid=html2wt
+!! input
+He&amp;nbsp;llo [[Foo|He&amp;nbsp;llo]]
+
+He&amp;nbsp;llo [[He&amp;nbsp;llo]]
+!!result
+<p>He&amp;nbsp;llo <a href="Foo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
+<p>He&amp;nbsp;llo <a href="He&amp;nbsp;llo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
+!! end
+
 !! test
 Parsoid: handle constructor well
 !! options
@@ -5047,9 +5201,30 @@ parsoid
 <p data-parsoid="{&quot;dsr&quot;:[17,36,0,0]}"><a rel="mw:WikiLink" href="./Foo" data-parsoid="{&quot;stx&quot;:&quot;simple&quot;,&quot;a&quot;:{&quot;href&quot;:&quot;./Foo&quot;},&quot;sa&quot;:{&quot;href&quot;:&quot;constructor:foo&quot;},&quot;dsr&quot;:[17,36,2,2]}">constructor:foo</a></p>
 !! end
 
-##
-## Redirects, Parsoid-only
-##
+!! test
+Parsoid: recognize interlanguage links without a target page
+!! options
+parsoid
+!! input
+[[ko:]]
+!! result
+<p>
+<link rel="mw:WikiLink/Language" href="http://ko.wikipedia.org/wiki/"></p>
+!! end
+
+!! test
+Parsoid: recognize interwiki links without a target page
+!! options
+parsoid
+!! input
+[[:ko:]]
+!! result
+<p><a rel="mw:WikiLink/Interwiki" href="http://ko.wikipedia.org/wiki/">ko:</a></p>
+!! end
+
+###
+### Redirects, Parsoid-only
+###
 !! test
 Simple redirect to page
 !! options
@@ -5692,7 +5867,7 @@ parsoid=wt2html,wt2wt
 !!result
 <ul><li> foo</li>
 <li>li-hack</li>
-<li about="#mwt1" typeof="mw:Transclusion" data-mw='{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<li>templated li-hack"}}}'>templated li-hack</li>
+<li about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<li>templated li-hack"}}}}]}'>templated li-hack</li>
 <li> <!--foo--> </li><li> li-hack with preceding comments</li></ul>
 
 <ul>
@@ -5724,7 +5899,7 @@ parsoid
 * {{bullet}}
 !! result
 <ul>
-<li> </li><li about="#mwt1" typeof="mw:Transclusion" data-mw='{"target":{"wt":"bullet","href":"./Template:Bullet"},"params":{},"i":0}'> Bar</li>
+<li> </li><li about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"bullet","href":"./Template:Bullet"},"params":{},"i":0}}]}'> Bar</li>
 </ul>
 !! end
 
@@ -5800,6 +5975,23 @@ parsoid
 <p><small></small></p>
 !!end
 
+!! test
+Table with missing opening <tr> tag
+!! options
+parsoid=wt2html,wt2wt
+!! input
+<table>
+<td>foo</td>
+</tr>
+</table>
+!! result
+<table>
+<tr>
+<td>foo</td>
+</tr>
+</table>
+!! end
+
 ###
 ### Magic Words
 ###
@@ -7182,14 +7374,57 @@ c}}d
 
 b}}
 !! result
-a<span typeof="mw:Transclusion">b</span>
-<table></table><span>c</span>d
-<p typeof="mw:Transclusion">ab</p>
-<table></table>
-<p>cd</p>
-<p typeof="mw:Transclusion">a</p>
-<table></table>
-<p>b</p>
+a<span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b
+<table></table>c"}},"i":0}}]}'>b</span>
+<table about="#mwt1"></table><span about="#mwt1">c</span>d
+
+
+<p about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":["a",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b\n<table></table>\nc"}},"i":0}},"d"]}'>ab</p><span about="#mwt2">
+</span>
+<table about="#mwt2"></table><span about="#mwt2">
+</span>
+<p about="#mwt2">cd</p>
+
+
+<p about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a\n\n<table></table>\n\nb"}},"i":0}}]}'>a</p><span about="#mwt3">
+
+</span>
+<table about="#mwt3"></table><span about="#mwt3">
+
+</span>
+<p about="#mwt3">b</p>
+!! end
+
+!! test
+Parsoid: Merge double tds (bug 50603)
+!! options
+parsoid
+!! input
+{|
+|{{echo|{{!}} foo}}
+|}
+!! result
+<table><tbody>
+<tr><td about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{!}} foo"}},"i":0}}]}'> foo</td></tr>
+</tbody></table>
+!! end
+
+!! test
+Parsoid: Merge double tds in nested transclusion content (bug 50603)
+!! options
+parsoid
+!! input
+{{echo|<div>}}
+{|
+|{{echo|{{!}} foo}}
+|}
+{{echo|</div>}}
+!! result
+<div about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<div>"}},"i":0}},"\n{|\n|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{!}} foo"}},"i":1}},"\n|}\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"</div>"}},"i":2}}]}'>
+<table><tbody>
+<tr><td data-mw='{"parts":["|"]}'> foo</td></tr>
+</tbody></table>
+</div>
 !! end
 
 ###
@@ -7288,8 +7523,10 @@ Templates: 1. Simple use
 Templates: 2. Inside a block tag
 !!input
 <div>{{echo|Foo}}</div>
+<blockquote>{{echo|Foo}}</blockquote>
 !!result
 <div>Foo</div>
+<blockquote>Foo</blockquote>
 
 !!end
 
@@ -7333,14 +7570,14 @@ bar <div>baz</div>
 !!test
 Templates: P-wrapping: 1d. Template preceded by comment-only line
 !!options
-parsoid=wt2html,wt2wt
+parsoid
 !!input
 <!-- foo -->
 {{echo|Bar}}
 !!result
 <!-- foo -->
-<p typeof="mw:Transclusion">Bar
-</p>
+
+<p about="#mwt223" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"Bar"}},"i":0}}]}'>Bar</p>
 !!end
 
 !!test
@@ -7741,24 +7978,24 @@ Templates: Ugly nesting: 1. Quotes opened/closed across templates (echo)
 Templates: Ugly nesting: 2. Quotes opened/closed across templates (echo_with_span)
 (PHP parser generates misnested html)
 !! options
-parsoid=wt2html,wt2wt
+parsoid
 !!input
 {{echo_with_span|''a}}{{echo_with_span|b''c''d}}{{echo_with_span|''e}}
 !!result
-<p><span typeof="mw:Transclusion"><i>a</i></span><i typeof="mw:Transclusion"><span>b</span></i><span>c</span><i>d</i><span>e</span></p>
+<p><span about="#mwt1" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_span&quot;,&quot;href&quot;:&quot;./Template:Echo_with_span&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;''a&quot;}},&quot;i&quot;:0}}]}"><i>a</i></span><i about="#mwt2" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_span&quot;,&quot;href&quot;:&quot;./Template:Echo_with_span&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;b''c''d&quot;}},&quot;i&quot;:0}},{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_span&quot;,&quot;href&quot;:&quot;./Template:Echo_with_span&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;''e&quot;}},&quot;i&quot;:1}}]}"><span>b</span></i><span about="#mwt2">c</span><i about="#mwt2">d<span></span></i><span about="#mwt2">e</span></p>
 !!end
 
 !!test
 Templates: Ugly nesting: 3. Quotes opened/closed across templates (echo_with_div)
-(PHP parser generates misnested html)
+(PHP parser generates misnested html; Parsoid html2wt mode adds newlines between {{echo}}s)
 !! options
 parsoid=wt2html,wt2wt
 !!input
 {{echo_with_div|''a}}{{echo_with_div|b''c''d}}{{echo_with_div|''e}}
 !!result
-<div typeof="mw:Transclusion"><i>a</i></div>
-<div typeof="mw:Transclusion"><i>b</i>c<i>d</i></div>
-<div typeof="mw:Transclusion">e</div>
+<div about="#mwt1" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_div&quot;,&quot;href&quot;:&quot;./Template:Echo_with_div&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;''a&quot;}},&quot;i&quot;:0}}]}"><i>a</i></div>
+<div about="#mwt2" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_div&quot;,&quot;href&quot;:&quot;./Template:Echo_with_div&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;b''c''d&quot;}},&quot;i&quot;:0}}]}"><i>b</i>c<i>d</i></div>
+<div about="#mwt3" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_div&quot;,&quot;href&quot;:&quot;./Template:Echo_with_div&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;''e&quot;}},&quot;i&quot;:0}}]}">e</div>
 !!end
 
 !!test
@@ -7781,10 +8018,13 @@ parsoid
 |bar
 |}
 !!result
-<table typeof="mw:Transclusion">
+<table about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["{|\n|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo</table>"}},"i":0}},"\n|bar\n|}"]}'>
+
 <tbody>
 <tr>
-<td>foo</td></tr></tbody></table><span>bar</span>
+<td>foo</td></tr></tbody></table><span about="#mwt1">
+</span><span about="#mwt1">bar</span><span about="#mwt1">
+</span>
 !!end
 
 !!test
@@ -7813,24 +8053,24 @@ parsoid
   </tr>
 </table>
 !!result
-<table  about="#mwt1" typeof="mw:Transclusion">
-  <tbody><tr >
-    <td >
-    <table >
-      <tbody><tr >
-        <td >1. foo </td></tr></tbody></table></td>
-        <td > bar </td>
-        <td >2. baz </td></tr></tbody></table><span about="#mwt1">
-      </span><span about="#mwt1">
-      
-        abc</span><span about="#mwt1">
-      </span><span about="#mwt1">
-    </span><span about="#mwt1">
-    </span><span about="#mwt1">
-  </span><span about="#mwt1">
-  
-    xyz</span><span about="#mwt1">
-  </span><span about="#mwt1">
+<table about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":["<table>\n  <tr>\n    <td>\n    <table>\n      <tr>\n        <td>1. ",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo </table>"}},"i":0}},"</td>\n        <td> bar </td>\n        <td>2. ",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"baz </table>"}},"i":1}},"</td>\n      </tr>\n      <tr>\n        <td>abc</td>\n      </tr>\n    </table>\n    </td>\n  </tr>\n  <tr>\n    <td>xyz</td>\n  </tr>\n</table>"]}'>
+  <tbody><tr>
+    <td>
+    <table>
+      <tbody><tr>
+        <td>1. foo </td></tr></tbody></table></td>
+        <td> bar </td>
+        <td>2. baz </td></tr></tbody></table><span about="#mwt2">
+      </span><span about="#mwt2">
+      </span><span about="#mwt2">
+        </span><span about="#mwt2">abc</span><span about="#mwt2">
+      </span><span about="#mwt2">
+    </span><span about="#mwt2">
+    </span><span about="#mwt2">
+  </span><span about="#mwt2">
+  </span><span about="#mwt2">
+    </span><span about="#mwt2">xyz</span><span about="#mwt2">
+  </span><span about="#mwt2">
 </span>
 !!end
 
@@ -12797,7 +13037,7 @@ parsoid
 !! input
 '''''
 !! result
-<p><i><b></b></i></p>
+<p><b><i></i></b></p>
 !! end
 
 !! test
@@ -13610,9 +13850,6 @@ __NOEDITSECTION__
 </p>
 !! end
 
-# Expected output in the following test is not necessarily expected (there
-# should probably be <p> tags inside the <blockquote> in the output) -- it's
-# only testing for well-formedness.
 !! test
 Bug 6200: blockquotes and paragraph formatting
 !! input
@@ -13625,7 +13862,8 @@ bar
  baz
 !! result
 <blockquote>
-foo
+<p>foo
+</p>
 </blockquote>
 <p>bar
 </p>
@@ -14305,8 +14543,6 @@ B</strong>
 # Bug 6200: <blockquote> should behave like <div> with respect to line breaks
 !! test
 Bug 6200: paragraphs inside blockquotes (no extra line breaks)
-!! options
-disabled
 !! input
 <blockquote>Line one
 
@@ -14319,8 +14555,6 @@ Line two</blockquote>
 
 !! test
 Bug 6200: paragraphs inside blockquotes (extra line break on open)
-!! options
-disabled
 !! input
 <blockquote>
 Line one
@@ -14336,8 +14570,6 @@ Line two</blockquote>
 
 !! test
 Bug 6200: paragraphs inside blockquotes (extra line break on close)
-!! options
-disabled
 !! input
 <blockquote>Line one
 
@@ -14353,8 +14585,6 @@ Line two
 
 !! test
 Bug 6200: paragraphs inside blockquotes (extra line break on open and close)
-!! options
-disabled
 !! input
 <blockquote>
 Line one
@@ -15585,10 +15815,10 @@ A <ref>
 
 <references />
 !!result
-<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"This is a <b data-parsoid=\"{&amp;quot;dsr&amp;quot;:[19,40,3,3]}\"><a rel=\"mw:WikiLink\" href=\"./Bolded_link\" data-parsoid=\"{&amp;quot;a&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;./Bolded_link&amp;quot;},&amp;quot;sa&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;bolded link&amp;quot;},&amp;quot;stx&amp;quot;:&amp;quot;simple&amp;quot;,&amp;quot;dsr&amp;quot;:[22,37,2,2]}\">bolded link</a></b> and this is a <span about=\"#mwt3\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;transclusion&amp;quot;}}}\" data-parsoid=\"{&amp;quot;src&amp;quot;:&amp;quot;{{echo|transclusion}}&amp;quot;,&amp;quot;dsr&amp;quot;:[55,76,null,null]}\">transclusion</span>\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"This is a <b data-parsoid=\"{&amp;quot;dsr&amp;quot;:[19,40,3,3]}\"><a rel=\"mw:WikiLink\" href=\"./Bolded_link\" data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;simple&amp;quot;,&amp;quot;a&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;./Bolded_link&amp;quot;},&amp;quot;sa&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;bolded link&amp;quot;},&amp;quot;dsr&amp;quot;:[22,37,2,2]}\">bolded link</a></b> and this is a <span about=\"#mwt5\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;transclusion&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[55,76,null,null],&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]]}\">transclusion</span>\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
 
-<ol about="#mwt2" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references">
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> This is a <b><a rel="mw:WikiLink" href="./Bolded_link">bolded link</a></b> and this is a <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}}}'>transclusion</span>
+<ol class="references" typeof="mw:Extension/references" about="#mwt2" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> This is a <b><a rel="mw:WikiLink" href="./Bolded_link">bolded link</a></b> and this is a <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
 </li></ol>
 !!end
 
@@ -15607,7 +15837,7 @@ A <ref>
 !!result
 <p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo\n bar\n baz\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
 
-<ol about="#mwt2" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references">
+<ol class="references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{}}'>
 <li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo
  bar
  baz
@@ -15615,7 +15845,7 @@ A <ref>
 !!end
 
 !!test
-Ref: 6. No p-wrapping in ref-body
+Ref: 7. No p-wrapping in ref-body
 !!options
 parsoid
 !!input
@@ -15636,7 +15866,7 @@ booz
 !!result
 <p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo\n\nbar\n\n\nbaz\n\n\n\nbooz\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
 
-<ol about="#mwt2" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references">
+<ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
 <li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo
 
 bar
@@ -15659,9 +15889,9 @@ A <ref> foo {{echo|</ref> B C}}
 
 <references />
 !!result
-<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo <span typeof=\"mw:Nowiki\" data-parsoid=\"{&amp;quot;src&amp;quot;:&amp;quot;{{&amp;quot;,&amp;quot;dsr&amp;quot;:[12,14,2,null]}\">{{</span>echo|"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C<span typeof="mw:Nowiki">}}</span></p>
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo <span typeof=\"mw:Nowiki\" data-parsoid=\"{&amp;quot;src&amp;quot;:&amp;quot;{{&amp;quot;,&amp;quot;dsr&amp;quot;:[12,14,0,0]}\">{{</span>echo|"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C<span typeof="mw:Nowiki">}}</span></p>
 
-<ol about="#mwt2" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references">
+<ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
 <li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo <span typeof="mw:Nowiki">{{</span>echo|</li></ol>
 !!end
 
@@ -15676,7 +15906,7 @@ A <ref> foo <!--</ref> B C
 !!result
 <p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo <!---->"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C</p>
 
-<ol about="#mwt2" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references">
+<ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
 <li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo <!----></li></ol>
 !!end
 
@@ -15691,7 +15921,7 @@ A <ref> <b> foo </ref> B C
 !!result
 <p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"<b data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;autoInsertedEnd&amp;quot;:true,&amp;quot;dsr&amp;quot;:[8,16,3,0]}\"> foo </b>"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C</p>
 
-<ol about="#mwt2" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references">
+<ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
 <li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> <b> foo </b></li></ol>
 !!end
 
@@ -15770,7 +16000,7 @@ B1 <ref name="b" /> B2 <ref name="b">bar</ref>
 <p>A1 <span about="#mwt3" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"a"}}' id="cite_ref-a-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-a-1">[1]</a></span> A2 <span about="#mwt4" class="reference" data-mw='{"name":"ref","attrs":{"name":"a"}}' id="cite_ref-a-1-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-a-1">[1]</a></span>
 B1 <span about="#mwt7" class="reference" data-mw='{"name":"ref","attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span> B2 <span about="#mwt8" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}' id="cite_ref-b-2-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span></p>
 
-<ol about="#mwt10" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references"><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy">↑ <a href="#cite_ref-a-1-0">1.0</a> <a href="#cite_ref-a-1-1">1.1</a></span> foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy">↑ <a href="#cite_ref-b-2-0">2.0</a> <a href="#cite_ref-b-2-1">2.1</a></span> bar</li></ol>
+<ol about="#mwt10" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy">↑ <a href="#cite_ref-a-1-0">1.0</a> <a href="#cite_ref-a-1-1">1.1</a></span> foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy">↑ <a href="#cite_ref-b-2-0">2.0</a> <a href="#cite_ref-b-2-1">2.1</a></span> bar</li></ol>
 !!end
 
 !!test
@@ -15780,7 +16010,7 @@ parsoid
 !!input
 <references />
 !!result
-<ol about="#mwt2" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references"></ol>
+<ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'></ol>
 !!end
 
 !!test
@@ -15796,7 +16026,7 @@ B <ref group="b">bar</ref>
 <p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"group":"a"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[a 1]</a></span>
 B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"group":"b"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[b 1]</a></span></p>
 
-<ol about="#mwt6" class="references" data-mw='{"name":"references","attrs":{"group":"a"}}' typeof="mw:Extension/references"><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li></ol>
+<ol about="#mwt6" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li></ol>
 !!end
 
 !!test
@@ -15814,11 +16044,11 @@ B <ref>bar</ref>
 !!result
 <p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
 
-<ol about="#mwt4" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references"><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li></ol>
+<ol about="#mwt4" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li></ol>
 
 <p>B <span about="#mwt6" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
 
-<ol about="#mwt8" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references"><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> bar</li></ol>
+<ol about="#mwt8" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> bar</li></ol>
 !!end
 
 !!test
@@ -15838,11 +16068,11 @@ C <ref>cfoo</ref>
 <p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"afoo"},"attrs":{"group":"a"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[a 1]</a></span>
 B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bfoo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref>bfoo</ref>","dsr":[30,45,5,6]}'><a href="#cite_note-1">[1]</a></span></p>
 
-<ol about="#mwt6" class="references" data-mw='{"name":"references","attrs":{"group":"a"}}' typeof="mw:Extension/references"><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> afoo</li></ol>
+<ol about="#mwt6" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> afoo</li></ol>
 
 <p>C <span about="#mwt8" class="reference" data-mw='{"name":"ref","body":{"html":"cfoo"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[2]</a></span></p>
 
-<ol about="#mwt10" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references"><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> bfoo</li><li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2-0">↑</a></span> cfoo</li></ol>
+<ol about="#mwt10" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> bfoo</li><li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2-0">↑</a></span> cfoo</li></ol>
 !!end
 
 !!test
@@ -15861,7 +16091,7 @@ This should just get lost.
 <p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{"name":"a"}}' id="cite_ref-a-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-a-1">[1]</a></span>
 B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","body":{"extsrc":"<ref name=\"a\">foo</ref>\nThis should just get lost.","html":"<span about=\"#mwt8\" class=\"reference\" data-mw=\"{&amp;quot;name&amp;quot;:&amp;quot;ref&amp;quot;,&amp;quot;body&amp;quot;:{&amp;quot;html&amp;quot;:&amp;quot;foo&amp;quot;},&amp;quot;attrs&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;a&amp;quot;}}\" rel=\"dc:references\" typeof=\"mw:Extension/ref\"><a href=\"#cite_note-a-1\">[1]</a></span>"},"attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy"><a href="#cite_ref-a-1-0">↑</a></span> foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b-2-0">↑</a></span> bar</li></ol>
+<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","body":{"extsrc":"<ref name=\"a\">foo</ref>\nThis should just get lost.","html":"\n<span about=\"#mwt8\" class=\"reference\" data-mw=\"{&amp;quot;name&amp;quot;:&amp;quot;ref&amp;quot;,&amp;quot;body&amp;quot;:{&amp;quot;html&amp;quot;:&amp;quot;foo&amp;quot;},&amp;quot;attrs&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;a&amp;quot;}}\" rel=\"dc:references\" typeof=\"mw:Extension/ref\"><a href=\"#cite_note-a-1\">[1]</a></span>\n"},"attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy"><a href="#cite_ref-a-1-0">↑</a></span> foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b-2-0">↑</a></span> bar</li></ol>
 !!end
 
 !!test
@@ -15871,7 +16101,7 @@ parsoid
 !!input
 {{echo|<references />}}
 !!result
-<ol class="references" about="#mwt2" typeof="mw:Transclusion" data-mw='{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<references />"}},"i":0}'></ol>
+<ol class="references" about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<references />"}},"i":0}}]}'></ol>
 !!end
 
 !! test
@@ -15891,10 +16121,12 @@ B <ref name="b" />
 <p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo bar for a"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span>
 B <span about="#mwt4" class="reference" data-mw='{"name":"ref","attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo bar for a</li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b-2-0">↑</a></span> </li></ol>
-
-<ol class="references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","body":{"extsrc":"<ref name=\"b\">foo</ref>","html":"\n<span about=\"#mwt10\" class=\"reference\" data-mw=\"{&amp;quot;name&amp;quot;:&amp;quot;ref&amp;quot;,&amp;quot;body&amp;quot;:{&amp;quot;html&amp;quot;:&amp;quot;foo&amp;quot;},&amp;quot;attrs&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;b&amp;quot;}}\" rel=\"dc:references\" typeof=\"mw:Extension/ref\"><a href=\"#cite_note-b-1\">[1]</a></span>\n"},"attrs":{}}'><li about="#cite_note-b-1" id="cite_note-b-1"><span rel="mw:referencedBy">↑</span> foo</li></ol>
+<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo bar for a</li>
+<li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b-2-0">↑</a></span> </li></ol>
 
+<ol class="references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","body":{"extsrc":"<ref name=\"b\">foo</ref>","html":"\n<span about=\"#mwt10\" class=\"reference\" data-mw=\"{&amp;quot;name&amp;quot;:&amp;quot;ref&amp;quot;,&amp;quot;body&amp;quot;:{&amp;quot;html&amp;quot;:&amp;quot;foo&amp;quot;},&amp;quot;attrs&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;b&amp;quot;}}\" rel=\"dc:references\" typeof=\"mw:Extension/ref\"><a href=\"#cite_note-b-1\">[1]</a></span>\n"},"attrs":{}}'>
+<li about="#cite_note-b-1" id="cite_note-b-1"><span rel="mw:referencedBy">↑</span> foo</li></ol>
 !! end
 
 #### ----------------------------------------------------------------
@@ -16481,7 +16713,6 @@ Tables: 4a. Escape -
 parsoid
 !! input
 {|
-|-
 !-bar
 |-
 |<nowiki>-bar</nowiki>
@@ -16499,7 +16730,6 @@ Tables: 4b. Escape +
 parsoid
 !! input
 {|
-|-
 !+bar
 |-
 |<nowiki>+bar</nowiki>
@@ -16517,7 +16747,6 @@ Tables: 4c. No escaping needed
 parsoid
 !! input
 {|
-|-
 |foo-bar
 |foo+bar
 |-
@@ -17150,7 +17379,7 @@ Indented table with an empty td
 Empty TR followed by a template-generated TR
 (Parsoid-specific since PHP parser doesn't handle this mixed tbl-wikitext)
 !!options
-parsoid=wt2html,wt2wt
+parsoid
 !!input
 {|
 |-
@@ -17160,8 +17389,9 @@ parsoid=wt2html,wt2wt
 <table>
 <tbody>
 <tr></tr>
-<tr typeof="mw:Transclusion">
-<td>foo</td></tr></tbody></table>
+<tr about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<tr><td>foo</td></tr>"}},"i":0}}]}'>
+<td>foo</td></tr>
+</tbody></table>
 !!end
 
 ## PHP and parsoid output differ for this, and since this is primarily
@@ -17180,10 +17410,10 @@ parsoid
 !!result
 <table>
 <tbody>
+<tr></tr>
+ <!--c-->
 <tr>
-<td> <!--c--></td></tr>
-<tr>
-<td><!--c--> <!--d--></td></tr>
+<!--c--> </tr><!--d-->
 </tbody></table>
 
 !!end
@@ -17240,6 +17470,19 @@ plain text</pre>
 plain text
 !!end
 
+!!test
+Ensure fostered text content is wrapped in spans
+!!options
+parsoid=wt2html
+!!input
+<table>hi</table><table>ho</table>
+!!result
+<span>hi</span>
+<table></table>
+<span>ho</span>
+<table></table>
+!!end
+
 # -----------------------------------------------------------------
 # The following section of tests are primarily to spec requirements
 # around serialization of new/edited content.
@@ -17313,10 +17556,115 @@ Parsoid: Serialize positional parameters with = in them as named parameter
 parsoid=html2wt
 !! input
 {{echo|1 = f=oo}}
+
+{{echo|1 = f=oo|2 = bar}}
+
+<!--Orig params with data-parsoid has heuristics for handling = chars-->
+<!--FIXME: But maybe the heuristic needs fixing to apply to new params as well-->
+{{echo|<nowiki>f=oo</nowiki>|bar}}
 !! result
 <p about="#mwt1" typeof="mw:Transclusion"
-data-mw='{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"f=oo"}},"i":0}'
->foo</p>
+data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"f=oo"}},"i":0}}]}'>foo</p>
+
+<p about="#mwt1" typeof="mw:Transclusion"
+data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"f=oo"}, "2":{"wt":"bar"}},"i":0}}]}'>foo</p>
+
+<!--Orig params with data-parsoid has heuristics for handling = chars-->
+<!--FIXME: But maybe the heuristic needs fixing to apply to new params as well-->
+<p data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]},{"k":"2","spc":["","","",""]}]]}' about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"f=oo"},"2":{"wt":"bar"}},"i":0}}]}'>foo</p>
+!! end
+
+!! test
+Parsoid: Correctly serialize block-node children when they are a combination of text and p-nodes
+!! options
+parsoid=html2wt
+!! input
+<div>a
+b
+</div>
+<div>a
+b
+</div>
+<div>
+a
+
+b
+</div>
+!! result
+<div>a<p>b</p></div>
+<div>a
+<p>b</p></div>
+<div>
+a
+<p>b</p></div>
+!! end
+
+#-----------------------------
+# I/B quote minimization tests
+#-----------------------------
+
+!! test
+1. I/B qoute minimization: wikitext-only tags should be combined
+!! options
+parsoid=html2wt
+!! input
+''AB''
+
+'''AB'''
+
+''A'''B'''''
+
+'''A''B'''''
+
+'''A''BC''D'''
+!! result
+<p><i>A</i><i>B</i></p>
+<p><b>A</b><b>B</b></p>
+<p><i>A</i><b><i>B</i></b></p>
+<p><b>A</b><i><b>B</b></i></p>
+<p><b>A</b><i><b>B</b><b>C</b></i><b>D</b></p>
+!! end
+
+!! test
+2. I/B qoute minimization: wikitext and html tags should not be combined
+!! options
+parsoid=html2wt
+!! input
+''A''<i>B</i>
+
+''A'''''<i>B</i>'''
+!! result
+<p><i>A</i><i data-parsoid='{"stx":"html"}'>B</i></p>
+<p><i>A</i><b><i data-parsoid='{"stx":"html"}'>B</i></b></p>
+!! end
+
+!! test
+3. I/B qoute minimization: templated content stops minimization
+!! options
+parsoid=html2wt
+!! input
+''A''{{echo|''B''}}
+
+''A''{{echo|'''''B'''''}}
+!! result
+<p><i>A</i><i about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&#39;&#39;B&#39;&#39;"}},"i":0}}]}'>B</i>
+<p><i>A</i><b about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&#39;&#39;&#39;&#39;&#39;B&#39;&#39;&#39;&#39;&#39;"}},"i":0}}]}'><i>B</i></b>
+!! end
+
+!! test
+4. I/B qoute minimization: new content should be mimimized with adjacent old content
+!! options
+parsoid=html2wt
+!! input
+''AB''
+
+'''AB'''
+
+''A'''B'''''
+!! result
+<p><i>A</i><i data-parsoid='{}'>B</i></p>
+<p><b data-parsoid='{}'>A</b><b>B</b></p>
+<p><i>A</i><b data-parsoid='{}'><i data-parsoid='{}'>B</i></b></p>
 !! end
 
 # -----------------------------------------------------------------
index 25ba29e..349c510 100644 (file)
@@ -918,6 +918,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * the provided code.
         *
         * @since 1.21
+        * @deprecated since 1.22 Use setExpectedException
         *
         * @param callable $code
         * @param string $expected
diff --git a/tests/phpunit/data/less/common/test.common.mixins.less b/tests/phpunit/data/less/common/test.common.mixins.less
new file mode 100644 (file)
index 0000000..2fbe9b7
--- /dev/null
@@ -0,0 +1,5 @@
+.test-mixin (@value) {
+       color: @value;
+       border: @foo solid @Foo;
+       line-height: test-sum(@bar, 10, 20);
+}
diff --git a/tests/phpunit/data/less/module/dependency.less b/tests/phpunit/data/less/module/dependency.less
new file mode 100644 (file)
index 0000000..c7725a2
--- /dev/null
@@ -0,0 +1,3 @@
+@import "test.common.mixins";
+
+@unitTestColor: green;
diff --git a/tests/phpunit/data/less/module/styles.css b/tests/phpunit/data/less/module/styles.css
new file mode 100644 (file)
index 0000000..b78780a
--- /dev/null
@@ -0,0 +1,6 @@
+/* @noflip */
+.unit-tests {
+  color: green;
+  border: 2px solid #eeeeee;
+  line-height: 35;
+}
diff --git a/tests/phpunit/data/less/module/styles.less b/tests/phpunit/data/less/module/styles.less
new file mode 100644 (file)
index 0000000..ecac839
--- /dev/null
@@ -0,0 +1,6 @@
+@import "dependency";
+
+/* @noflip */
+.unit-tests {
+       .test-mixin(@unitTestColor);
+}
index 6a2a0df..244b100 100644 (file)
@@ -630,6 +630,15 @@ class GlobalTest extends MediaWikiTestCase {
                return $a;
        }
 
+       function testWfMkdirParents() {
+               // Should not return true if file exists instead of directory
+               $fname = $this->getNewTempFile();
+               wfSuppressWarnings();
+               $ok = wfMkdirParents( $fname );
+               wfRestoreWarnings();
+               $this->assertFalse( $ok );
+       }
+
        /**
         * @dataProvider provideWfShellMaintenanceCmdList
         */
diff --git a/tests/phpunit/includes/HtmlFormatterTest.php b/tests/phpunit/includes/HtmlFormatterTest.php
new file mode 100644 (file)
index 0000000..a37df74
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+
+/**
+ * @group HtmlFormatter
+ */
+class HtmlFormatterTest extends MediaWikiTestCase {
+       /**
+        * @dataProvider getHtmlData
+        */
+       public function testTransform( $input, $expected, $callback = false ) {
+               $input = self::normalize( $input );
+               $formatter = new HtmlFormatter( HtmlFormatter::wrapHTML( $input ) );
+               if ( $callback ) {
+                       $callback( $formatter );
+               }
+               $formatter->filterContent();
+               $html = $formatter->getText();
+               $this->assertEquals( self::normalize( $expected ), self::normalize( $html ) );
+       }
+
+       private static function normalize( $s ) {
+               return str_replace( "\n", '',
+                       str_replace( "\r", '', $s ) // "yay" to Windows!
+               );
+       }
+
+       public function getHtmlData() {
+               $removeImages = function( HtmlFormatter $f ) {
+                       $f->setRemoveMedia();
+               };
+               $removeTags = function( HtmlFormatter $f ) {
+                       $f->remove( array( 'table', '.foo', '#bar', 'div.baz' ) );
+               };
+               $flattenSomeStuff = function( HtmlFormatter $f ) {
+                       $f->flatten( array( 's', 'div' ) );
+               };
+               $flattenEverything = function( HtmlFormatter $f ) {
+                       $f->flattenAllTags();
+               };
+               return array(
+                       // remove images if asked
+                       array(
+                               '<img src="/foo/bar.jpg" alt="Blah"/>',
+                               '',
+                               $removeImages,
+                       ),
+                       // basic tag removal
+                       array(
+                               '<table><tr><td>foo</td></tr></table><div class="foo">foo</div><div class="foo quux">foo</div><span id="bar">bar</span>
+<strong class="foo" id="bar">foobar</strong><div class="notfoo">test</div><div class="baz"/>
+<span class="baz">baz</span>',
+
+                               '<div class="notfoo">test</div>
+<span class="baz">baz</span>',
+                               $removeTags,
+                       ),
+                       // don't flatten tags that start like chosen ones
+                       array(
+                               '<div><s>foo</s> <span>bar</span></div>',
+                               'foo <span>bar</span>',
+                               $flattenSomeStuff,
+                       ),
+                       // total flattening
+                       array(
+                               '<div style="foo">bar<sup>2</sup></div>',
+                               'bar2',
+                               $flattenEverything,
+                       ),
+                       // UTF-8 preservation and security
+                       array(
+                               '<span title="&quot; \' &amp;">&lt;Тест!&gt;</span> &amp;&lt;&#38;&#0038;&#x26;&#x026;',
+                               '<span title="&quot; \' &amp;">&lt;Тест!&gt;</span> &amp;&lt;&amp;&amp;&amp;&amp;',
+                       ),
+                       // https://bugzilla.wikimedia.org/show_bug.cgi?id=53086
+                       array(
+                               'Foo<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup> <a href="/wiki/Bar" title="Bar" class="mw-redirect">Bar</a>',
+                               'Foo<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup> <a href="/wiki/Bar" title="Bar" class="mw-redirect">Bar</a>',
+                       ),
+               );
+       }
+}
index fa228a6..c30c441 100644 (file)
@@ -4,6 +4,32 @@ class ResourceLoaderTest extends MediaWikiTestCase {
 
        protected static $resourceLoaderRegisterModulesHook;
 
+       protected function setUp() {
+               parent::setUp();
+
+               // $wgResourceLoaderLESSFunctions, $wgResourceLoaderLESSImportPaths; $wgResourceLoaderLESSVars;
+
+               $this->setMwGlobals( array(
+                       'wgResourceLoaderLESSFunctions' => array(
+                               'test-sum' => function ( $frame, $less ) {
+                                       $sum = 0;
+                                       foreach ( $frame[2] as $arg ) {
+                                               $sum += (int)$arg[1];
+                                       }
+                                       return $sum;
+                               },
+                       ),
+                       'wgResourceLoaderLESSImportPaths' => array(
+                               dirname( __DIR__ ) . '/data/less/common',
+                       ),
+                       'wgResourceLoaderLESSVars' => array(
+                               'foo'  => '2px',
+                               'Foo' => '#eeeeee',
+                               'bar' => 5,
+                       ),
+               ) );
+       }
+
        /* Hook Methods */
 
        /**
@@ -22,6 +48,14 @@ class ResourceLoaderTest extends MediaWikiTestCase {
                );
        }
 
+       public static function provideResourceLoaderContext() {
+               $resourceLoader = new ResourceLoader();
+               $request = new FauxRequest();
+               return array(
+                       array( new ResourceLoaderContext( $resourceLoader, $request ) ),
+               );
+       }
+
        /* Test Methods */
 
        /**
@@ -49,6 +83,20 @@ class ResourceLoaderTest extends MediaWikiTestCase {
                $this->assertEquals( $module, $resourceLoader->getModule( $name ) );
        }
 
+       /**
+        * @dataProvider provideResourceLoaderContext
+        * @covers ResourceLoaderFileModule::compileLessFile
+        */
+       public function testLessFileCompilation( $context ) {
+               $basePath = __DIR__ . '/../data/less/module';
+               $module = new ResourceLoaderFileModule( array(
+                       'localBasePath' => $basePath,
+                       'styles' => array( 'styles.less' ),
+               ) );
+               $styles = $module->getStyles( $context );
+               $this->assertStringEqualsFile( $basePath . '/styles.css', $styles['all'] );
+       }
+
        /**
         * @dataProvider providePackedModules
         */
index 842e2fc..94ba3a7 100644 (file)
@@ -67,32 +67,35 @@ class StringUtilsTest extends MediaWikiTestCase {
                        array( $PASS, 'Some ASCII' ),
                        array( $PASS, "Euro sign €" ),
 
-                       # First possible sequences
+                       // First possible sequences
                        array( $PASS, "\x00" ),
                        array( $PASS, "\xc2\x80" ),
                        array( $PASS, "\xe0\xa0\x80" ),
                        array( $PASS, "\xf0\x90\x80\x80" ),
-                       array( $PASS, "\xf8\x88\x80\x80\x80" ),
-                       array( $PASS, "\xfc\x84\x80\x80\x80\x80" ),
+                       array( $FAIL, "\xf8\x88\x80\x80\x80" ),
+                       array( $FAIL, "\xfc\x84\x80\x80\x80\x80" ),
 
-                       # Last possible sequence
+                       // Last possible sequence
                        array( $PASS, "\x7f" ),
                        array( $PASS, "\xdf\xbf" ),
                        array( $PASS, "\xef\xbf\xbf" ),
-                       array( $PASS, "\xf7\xbf\xbf\xbf" ),
-                       array( $PASS, "\xfb\xbf\xbf\xbf\xbf" ),
+                       array( $FAIL, "\xf7\xbf\xbf\xbf" ), // U+1FFFFF
+                       array( $FAIL, "\xfb\xbf\xbf\xbf\xbf" ),
                        array( $FAIL, "\xfd\xbf\xbf\xbf\xbf\xbf" ),
 
-                       # boundaries:
+                       // Boundaries
                        array( $PASS, "\xed\x9f\xbf" ),
                        array( $PASS, "\xee\x80\x80" ),
                        array( $PASS, "\xef\xbf\xbd" ),
-                       array( $PASS, "\xf4\x8f\xbf\xbf" ),
-                       array( $PASS, "\xf4\x90\x80\x80" ),
+                       array( $PASS, "\xf2\x80\x80\x80" ),
+                       array( $PASS, "\xf3\xbf\xbf\xbf" ), // U+FFFFF
+                       array( $PASS, "\xf4\x80\x80\x80" ), // U+100000
+                       array( $PASS, "\xf4\x8f\xbf\xbf" ), // U+10FFFF
+                       array( $FAIL, "\xf4\x90\x80\x80" ), // U+110000
 
-                       # Malformed
+                       // Malformed
                        array( $FAIL, "\x80" ),
-                       array( $FAIL, "\xBF" ),
+                       array( $FAIL, "\xbf" ),
                        array( $FAIL, "\x80\xbf" ),
                        array( $FAIL, "\x80\xbf\x80" ),
                        array( $FAIL, "\x80\xbf\x80\xbf" ),
@@ -100,7 +103,7 @@ class StringUtilsTest extends MediaWikiTestCase {
                        array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf" ),
                        array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf\x80" ),
 
-                       # last byte missing
+                       // Last byte missing
                        array( $FAIL, "\xc0" ),
                        array( $FAIL, "\xe0\x80" ),
                        array( $FAIL, "\xf0\x80\x80" ),
@@ -112,31 +115,42 @@ class StringUtilsTest extends MediaWikiTestCase {
                        array( $FAIL, "\xfb\xbf\xbf\xbf" ),
                        array( $FAIL, "\xfd\xbf\xbf\xbf\xbf" ),
 
-                       # impossible bytes
+                       // Extra continuation byte
+                       array( $FAIL, "e\xaf" ),
+                       array( $FAIL, "\xc3\x89\xaf" ),
+                       array( $FAIL, "\xef\xbc\xa5\xaf" ),
+                       array( $FAIL, "\xf0\x9d\x99\xb4\xaf" ),
+
+                       // Impossible bytes
                        array( $FAIL, "\xfe" ),
                        array( $FAIL, "\xff" ),
                        array( $FAIL, "\xfe\xfe\xff\xff" ),
 
-                       /*
-                       # The PHP implementation does not handle characters
-                       # being represented in a form which is too long :(
-
-                       # overlong sequences
+                       // Overlong sequences
                        array( $FAIL, "\xc0\xaf" ),
+                       array( $FAIL, "\xc1\xaf" ),
                        array( $FAIL, "\xe0\x80\xaf" ),
                        array( $FAIL, "\xf0\x80\x80\xaf" ),
                        array( $FAIL, "\xf8\x80\x80\x80\xaf" ),
                        array( $FAIL, "\xfc\x80\x80\x80\x80\xaf" ),
 
-                       # Maximum overlong sequences
+                       // Maximum overlong sequences
                        array( $FAIL, "\xc1\xbf" ),
                        array( $FAIL, "\xe0\x9f\xbf" ),
-                       array( $FAIL, "\xf0\x8F\xbf\xbf" ),
+                       array( $FAIL, "\xf0\x8f\xbf\xbf" ),
                        array( $FAIL, "\xf8\x87\xbf\xbf" ),
                        array( $FAIL, "\xfc\x83\xbf\xbf\xbf\xbf" ),
-                       */
 
-                       # non characters
+                       // Surrogates
+                       array( $PASS, "\xed\x9f\xbf" ), // U+D799
+                       array( $PASS, "\xee\x80\x80" ), // U+E000
+                       array( $FAIL, "\xed\xa0\x80" ), // U+D800
+                       array( $FAIL, "\xed\xaf\xbf" ), // U+DBFF
+                       array( $FAIL, "\xed\xb0\x80" ), // U+DC00
+                       array( $FAIL, "\xed\xbf\xbf" ), // U+DFFF
+                       array( $FAIL, "\xed\xa0\x80\xed\xb0\x80" ), // U+D800 U+DC00
+
+                       // Noncharacters
                        array( $PASS, "\xef\xbf\xbe" ),
                        array( $PASS, "\xef\xbf\xbf" ),
                );
index c9f5f5c..a3ef55a 100644 (file)
@@ -84,19 +84,29 @@ class DatabaseTest extends MediaWikiTestCase {
                        $quote = '';
                } elseif ( $this->db->getType() === 'mysql' ) {
                        $quote = '`';
+               } elseif ( $this->db->getType() === 'oracle' ) {
+                       $quote = '/*Q*/';
                } else {
                        $quote = '"';
                }
 
                if ( $database !== null ) {
-                       $database = $quote . $database . $quote . '.';
+                       if ( $this->db->getType() === 'oracle' ) {
+                               $database = $quote . $database . '.';
+                       } else {
+                               $database = $quote . $database . $quote . '.';
+                       }
                }
 
                if ( $prefix === null ) {
                        $prefix = $this->dbPrefix();
                }
 
-               return $database . $quote . $prefix . $table . $quote;
+               if ( $this->db->getType() === 'oracle' ) {
+                       return strtoupper($database . $quote . $prefix . $table);
+               } else {
+                       return $database . $quote . $prefix . $table . $quote;
+               }
        }
 
        function testTableNameLocal() {
index 342f7d5..ea87ede 100644 (file)
@@ -27,6 +27,7 @@ class InstallDocFormatterTest extends MediaWikiTestCase {
                        array( 'Install &lt;tag>', 'Install <tag>', 'Escaping <' ),
                        array( 'Install &#123;&#123;template}}', 'Install {{template}}', 'Escaping [[' ),
                        array( 'Install &#91;&#91;page]]', 'Install [[page]]', 'Escaping {{' ),
+                       array( 'Install &#95;&#95;TOC&#95;&#95;', 'Install __TOC__', 'Escaping __' ),
                        array( 'Install ', "Install \r", 'Removing \r' ),
 
                        # Transform \t{1,2} into :{1,2}
index 78a5153..163314e 100644 (file)
@@ -60,11 +60,14 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                if ( $gzipped_contents === false ) {
                        $this->fail( "Could not get contents of $fname" );
                }
-               // We resort to use gzinflate instead of gzdecode, as gzdecode
-               // need not be available
-               $contents = gzinflate( substr( $gzipped_contents, 10, -8 ) );
-               $this->assertEquals( strlen( $contents ),
-                       file_put_contents( $fname, $contents ), "# bytes written" );
+
+               $contents = gzdecode( $gzipped_contents );
+
+               $this->assertEquals(
+                       strlen( $contents ),
+                       file_put_contents( $fname, $contents ),
+                       '# bytes written'
+               );
        }
 
        /**
index e867369..f2676d7 100644 (file)
@@ -17,7 +17,7 @@
                assert.equal( mw.util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' );
        } );
 
-       QUnit.test( 'wikiGetlink', 3, function ( assert ) {
+       QUnit.test( 'wikiGetlink', 4, function ( assert ) {
                // Not part of startUp module
                mw.config.set( 'wgArticlePath', '/wiki/$1' );
                mw.config.set( 'wgPageName', 'Foobar' );
 
                href = mw.util.wikiGetlink();
                assert.equal( href, '/wiki/Foobar', 'Default title; Get link for current page ("Foobar")' );
+
+               href = mw.util.wikiGetlink( 'Sandbox', { action: 'edit' } );
+               assert.equal( href, '/wiki/Sandbox?action=edit',
+                       'Simple title with query string; Get link for "Sandbox" with action=edit' );
        } );
 
        QUnit.test( 'wikiScript', 4, function ( assert ) {
index 2b68927..2cda344 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -171,20 +171,17 @@ function wfStreamThumb( array $params ) {
                $redirectedLocation = false;
                if ( !$isTemp ) {
                        // Check for file redirect
-                       if ( $isOld ) {
-                               // Since redirects are associated with pages, not versions of files,
-                               // we look for the most current version to see if its a redirect.
-                               $possibleRedirFile = RepoGroup::singleton()->getLocalRepo()->findFile( $img->getName() );
-                       } else {
-                               $possibleRedirFile = RepoGroup::singleton()->getLocalRepo()->findFile( $fileName );
-                       }
-                       if ( $possibleRedirFile && !is_null( $possibleRedirFile->getRedirected() ) ) {
-                               $redirTarget = $possibleRedirFile->getName();
+                       // Since redirects are associated with pages, not versions of files,
+                       // we look for the most current version to see if its a redirect.
+                       $possRedirFile = RepoGroup::singleton()->getLocalRepo()->findFile( $img->getName() );
+                       if ( $possRedirFile && !is_null( $possRedirFile->getRedirected() ) ) {
+                               $redirTarget = $possRedirFile->getName();
                                $targetFile = wfLocalFile( Title::makeTitleSafe( NS_FILE, $redirTarget ) );
                                if ( $targetFile->exists() ) {
                                        $newThumbName = $targetFile->thumbName( $params );
                                        if ( $isOld ) {
-                                               $newThumbUrl = $targetFile->getArchiveThumbUrl( $bits[0] . '!' . $targetFile->getName(), $newThumbName );
+                                               $newThumbUrl = $targetFile->getArchiveThumbUrl(
+                                                       $bits[0] . '!' . $targetFile->getName(), $newThumbName );
                                        } else {
                                                $newThumbUrl = $targetFile->getThumbUrl( $newThumbName );
                                        }