Merge "Increase $wgSVGMaxSize to 5120 pixels wide (previously 2048)."
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 24 Jul 2015 19:51:11 +0000 (19:51 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 24 Jul 2015 19:51:11 +0000 (19:51 +0000)
264 files changed:
.jscsrc
.jshintignore
.jshintrc
Gruntfile.js
RELEASE-NOTES-1.26
autoload.php
composer.json
includes/EditPage.php
includes/GlobalFunctions.php
includes/HttpFunctions.php
includes/MediaWiki.php
includes/Message.php
includes/OutputPage.php
includes/PHPVersionCheck.php
includes/Title.php
includes/User.php
includes/api/i18n/ca.json
includes/api/i18n/de.json
includes/api/i18n/es.json
includes/api/i18n/eu.json
includes/api/i18n/fr.json
includes/api/i18n/he.json
includes/api/i18n/lb.json
includes/api/i18n/pl.json
includes/api/i18n/ru.json
includes/api/i18n/uk.json
includes/api/i18n/vi.json
includes/api/i18n/zh-hans.json
includes/api/i18n/zh-hant.json
includes/changetags/ChangeTags.php
includes/content/JavaScriptContent.php
includes/content/JavaScriptContentHandler.php
includes/db/Database.php
includes/debug/logger/LegacyLogger.php
includes/debug/logger/LegacySpi.php
includes/debug/logger/LoggerFactory.php
includes/debug/logger/MonologSpi.php
includes/debug/logger/NullSpi.php
includes/debug/logger/Spi.php
includes/debug/logger/monolog/LegacyFormatter.php
includes/filerepo/FileBackendDBRepoWrapper.php [new file with mode: 0644]
includes/filerepo/FileRepo.php
includes/filerepo/ForeignDBRepo.php
includes/filerepo/ForeignDBViaLBRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/htmlform/HTMLButtonField.php
includes/htmlform/HTMLCheckField.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/HTMLFormFieldWithButton.php
includes/htmlform/HTMLUserTextField.php [new file with mode: 0644]
includes/htmlform/OOUIHTMLForm.php
includes/htmlform/VFormHTMLForm.php
includes/installer/PostgresUpdater.php
includes/installer/i18n/bn.json
includes/installer/i18n/bs.json
includes/installer/i18n/ce.json
includes/installer/i18n/es.json
includes/installer/i18n/hy.json
includes/installer/i18n/it.json
includes/installer/i18n/pl.json
includes/installer/i18n/sv.json
includes/installer/i18n/vi.json
includes/installer/i18n/zh-hant.json
includes/jobqueue/jobs/EmaillingJob.php
includes/libs/BufferingStatsdDataFactory.php
includes/libs/MultiHttpClient.php
includes/libs/objectcache/APCBagOStuff.php
includes/mail/EmailNotification.php
includes/mail/UserMailer.php
includes/page/ImagePage.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/search/SearchPostgres.php
includes/site/SiteSQLStore.php
includes/specials/SpecialAllMessages.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWhatlinkshere.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
includes/upload/UploadBase.php
includes/upload/UploadFromUrl.php
includes/widget/NamespaceInputWidget.php
includes/widget/TitleInputWidget.php
includes/widget/UserInputWidget.php [new file with mode: 0644]
languages/Language.php
languages/Names.php
languages/i18n/ar.json
languages/i18n/ast.json
languages/i18n/azb.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/bgn.json
languages/i18n/bho.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/cv.json
languages/i18n/de.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/frr.json
languages/i18n/gom-deva.json
languages/i18n/he.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/ie.json
languages/i18n/ilo.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/kn.json
languages/i18n/ksh.json
languages/i18n/lb.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/mg.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/nap.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/ru.json
languages/i18n/scn.json
languages/i18n/si.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/th.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/uk.json
languages/i18n/vi.json
languages/i18n/yi.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesBcc.php
languages/messages/MessagesBgn.php
languages/messages/MessagesLuz.php [new file with mode: 0644]
languages/messages/MessagesLv.php
maintenance/jsduck/external.js
maintenance/migrateFileRepoLayout.php [new file with mode: 0644]
maintenance/parse.php
maintenance/postgres/archives/patch-textsearch_bug66650.sql [new file with mode: 0644]
maintenance/postgres/update-keys.sql
resources/Resources.php
resources/ResourcesOOUI.php
resources/lib/jquery.i18n/CREDITS [new file with mode: 0644]
resources/lib/jquery.i18n/GPL-LICENSE [new file with mode: 0644]
resources/lib/jquery.i18n/MIT-LICENSE [new file with mode: 0644]
resources/lib/jquery.i18n/README.md [new file with mode: 0644]
resources/lib/jquery.i18n/package.json [new file with mode: 0644]
resources/lib/jquery.i18n/src/jquery.i18n.emitter.bidi.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/jquery.i18n.emitter.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/jquery.i18n.fallbacks.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/jquery.i18n.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/jquery.i18n.language.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/jquery.i18n.messagestore.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/jquery.i18n.parser.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/bs.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/dsb.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/fi.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/ga.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/he.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/hsb.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/hu.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/hy.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/la.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/ml.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/os.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/ru.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/sl.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/uk.js [new file with mode: 0644]
resources/lib/mustache/LICENSE [new file with mode: 0644]
resources/lib/oojs-ui/i18n/arq.json
resources/lib/oojs-ui/i18n/as.json
resources/lib/oojs-ui/i18n/ast.json
resources/lib/oojs-ui/i18n/be-tarask.json
resources/lib/oojs-ui/i18n/bn.json
resources/lib/oojs-ui/i18n/ckb.json
resources/lib/oojs-ui/i18n/da.json
resources/lib/oojs-ui/i18n/dty.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/eo.json
resources/lib/oojs-ui/i18n/et.json
resources/lib/oojs-ui/i18n/eu.json
resources/lib/oojs-ui/i18n/fa.json
resources/lib/oojs-ui/i18n/fi.json
resources/lib/oojs-ui/i18n/fr.json
resources/lib/oojs-ui/i18n/gu.json
resources/lib/oojs-ui/i18n/hu.json
resources/lib/oojs-ui/i18n/hy.json
resources/lib/oojs-ui/i18n/id.json
resources/lib/oojs-ui/i18n/ja.json
resources/lib/oojs-ui/i18n/jv.json
resources/lib/oojs-ui/i18n/ka.json
resources/lib/oojs-ui/i18n/ko.json
resources/lib/oojs-ui/i18n/li.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ml.json
resources/lib/oojs-ui/i18n/ms.json
resources/lib/oojs-ui/i18n/nl.json
resources/lib/oojs-ui/i18n/oc.json
resources/lib/oojs-ui/i18n/or.json
resources/lib/oojs-ui/i18n/pl.json
resources/lib/oojs-ui/i18n/pms.json
resources/lib/oojs-ui/i18n/pt-br.json
resources/lib/oojs-ui/i18n/ru.json
resources/lib/oojs-ui/i18n/sah.json
resources/lib/oojs-ui/i18n/sk.json
resources/lib/oojs-ui/i18n/sl.json
resources/lib/oojs-ui/i18n/sv.json
resources/lib/oojs-ui/i18n/ta.json
resources/lib/oojs-ui/i18n/uk.json
resources/lib/oojs-ui/i18n/vi.json
resources/lib/oojs-ui/oojs-ui-apex-noimages.css
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-mediawiki-noimages.css
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/themes/apex/images/indicators/clear.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/indicators/clear.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/indicators.json
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/indicators.json
resources/lib/oojs/oojs.jquery.js
resources/src/jquery/jquery.makeCollapsible.js
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.less/mediawiki.ui/mixins.less
resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js
resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.js
resources/src/startup.js
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/cache/MessageCacheTest.php
tests/phpunit/includes/content/CssContentTest.php
tests/phpunit/includes/content/JavaScriptContentHandlerTest.php [new file with mode: 0644]
tests/phpunit/includes/content/JavaScriptContentTest.php
tests/phpunit/includes/db/ORMTableTest.php
tests/phpunit/includes/filerepo/FileBackendDBRepoWrapperTest.php [new file with mode: 0644]
tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php [new file with mode: 0644]
tests/qunit/data/generateJqueryMsgData.php
tests/qunit/data/mediawiki.jqueryMsg.data.js
tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
thumb.php

diff --git a/.jscsrc b/.jscsrc
index 98b81db..6a3c564 100644 (file)
--- a/.jscsrc
+++ b/.jscsrc
@@ -3,5 +3,17 @@
 
        "disallowQuotedKeysInObjects": null,
        "requireSpacesInsideParentheses": null,
-       "requireSpacesInsideArrayBrackets": null
+       "requireSpacesInsideArrayBrackets": null,
+
+       "excludeFiles": [
+               "docs/**",
+               "extensions/**",
+               "node_modules/**",
+               "resources/lib/**",
+               "resources/src/jquery.tipsy/**",
+               "resources/src/jquery/jquery.farbtastic.js",
+               "resources/src/mediawiki.libs/**",
+               "skins/**",
+               "vendor/**"
+       ]
 }
index 1882151..fdde7d0 100644 (file)
@@ -8,4 +8,5 @@ resources/lib/**
 resources/src/jquery.tipsy/**
 resources/src/jquery/jquery.farbtastic.js
 resources/src/mediawiki.libs/**
-tests/frontend/node_modules/**
+skins/**
+vendor/**
index d72c31d..b84d276 100644 (file)
--- a/.jshintrc
+++ b/.jshintrc
@@ -22,6 +22,7 @@
                "mediaWiki": true,
                "JSON": true,
                "OO": true,
+               "performance": true,
                "jQuery": false,
                "QUnit": false,
                "sinon": false
index 868fa4a..e1e5e4a 100644 (file)
@@ -19,34 +19,16 @@ module.exports = function ( grunt ) {
                        options: {
                                jshintrc: true
                        },
-                       all: [
-                               '*.js',
-                               '{includes,languages,resources,tests}/**/*.js'
-                       ]
+                       all: '.'
                },
                jscs: {
-                       all: [
-                               '<%= jshint.all %>',
-                               // Auto-generated file with JSON (double quotes)
-                               '!tests/qunit/data/mediawiki.jqueryMsg.data.js',
-                               // Skip functions are stored as script files but wrapped in a function when
-                               // executed. node-jscs trips on the would-be "Illegal return statement".
-                               '!resources/src/*-skip.js'
-
-                       // Exclude all files ignored by jshint
-                       ].concat( grunt.file.read( '.jshintignore' ).split( '\n' ).reduce( function ( patterns, pattern ) {
-                               // Filter out empty lines
-                               if ( pattern.length && pattern[0] !== '#' ) {
-                                       patterns.push( '!' + pattern );
-                               }
-                               return patterns;
-                       }, [] ) )
+                       all: '.'
                },
                jsonlint: {
                        all: [
                                '.jscsrc',
-                               '{languages,maintenance,resources}/**/*.json',
-                               'package.json'
+                               '**/*.json',
+                               '!{docs/js,extensions,node_modules,skins,vendor}/**'
                        ]
                },
                banana: {
@@ -56,10 +38,9 @@ module.exports = function ( grunt ) {
                },
                watch: {
                        files: [
-                               '<%= jscs.all %>',
-                               '<%= jsonlint.all %>',
-                               '.jshintignore',
-                               '.jshintrc'
+                               '.js*',
+                               '**/*',
+                               '!{docs,extensions,node_modules,skins,vendor}/**'
                        ],
                        tasks: 'test'
                },
index 46ffe36..f22a546 100644 (file)
@@ -42,6 +42,11 @@ production.
 * Added new hooks 'EnhancedChangesListModifyLineData' &
   'EnhancedChangesListModifyBlockLineData', to modify the data used to build
   lines in enhanced recentchanges and watchlist.
+* Caches that need purging ability now use the WANObjectCache interface.
+  This corresponds to a new $wgMainWANCache setting, which defaults to using
+  the $wgMainCacheType settings.
+* Callers needing fast light-weight data stores use $wgMainStash to select
+  the store type from $wgObjectCaches. The default is the local database.
 
 ==== External libraries ====
 * Update es5-shim from v4.0.0 to v4.1.5.
@@ -84,6 +89,7 @@ changes to languages because of Phabricator reports.
 * Languages added:
 ** dty (डोटेली/Doteli), thanks to translators जनक राज भट्ट, बिप्लब आनन्द,
    मेश सिंह बोहरा, and राम प्रसाद जोशी
+** luz (لئری جئنوٙڤی / Southern Luri)
 
 === Other changes in 1.26 ===
 * ChangeTags::tagDescription() will return false if the interface message
@@ -128,6 +134,7 @@ changes to languages because of Phabricator reports.
 * $wgSpecialPageGroups was removed (deprecated in 1.21).
 * SpecialPageFactory::setGroup was removed (deprecated in 1.21).
 * SpecialPageFactory::getGroup was removed (deprecated in 1.21).
+* DatabaseBase::ignoreErrors() is now protected.
 
 == Compatibility ==
 
index fd75c8a..a8940c4 100644 (file)
@@ -418,6 +418,7 @@ $wgAutoloadLocalClasses = array(
        'Field' => __DIR__ . '/includes/db/DatabaseUtility.php',
        'File' => __DIR__ . '/includes/filerepo/file/File.php',
        'FileBackend' => __DIR__ . '/includes/filebackend/FileBackend.php',
+       'FileBackendDBRepoWrapper' => __DIR__ . '/includes/filerepo/FileBackendDBRepoWrapper.php',
        'FileBackendError' => __DIR__ . '/includes/filebackend/FileBackend.php',
        'FileBackendException' => __DIR__ . '/includes/filebackend/FileBackend.php',
        'FileBackendGroup' => __DIR__ . '/includes/filebackend/FileBackendGroup.php',
@@ -510,6 +511,7 @@ $wgAutoloadLocalClasses = array(
        'HTMLTextField' => __DIR__ . '/includes/htmlform/HTMLTextField.php',
        'HTMLTextFieldWithButton' => __DIR__ . '/includes/htmlform/HTMLTextFieldWithButton.php',
        'HTMLTitleTextField' => __DIR__ . '/includes/htmlform/HTMLTitleTextField.php',
+       'HTMLUserTextField' => __DIR__ . '/includes/htmlform/HTMLUserTextField.php',
        'HWLDFWordAccumulator' => __DIR__ . '/includes/diff/DairikiDiff.php',
        'HashBagOStuff' => __DIR__ . '/includes/libs/objectcache/HashBagOStuff.php',
        'HashConfig' => __DIR__ . '/includes/config/HashConfig.php',
@@ -756,6 +758,7 @@ $wgAutoloadLocalClasses = array(
        'MediaWiki\\Logger\\Spi' => __DIR__ . '/includes/debug/logger/Spi.php',
        'MediaWiki\\Widget\\NamespaceInputWidget' => __DIR__ . '/includes/widget/NamespaceInputWidget.php',
        'MediaWiki\\Widget\\TitleInputWidget' => __DIR__ . '/includes/widget/TitleInputWidget.php',
+       'MediaWiki\\Widget\\UserInputWidget' => __DIR__ . '/includes/widget/UserInputWidget.php',
        'MemCachedClientforWiki' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
        'MemcLockManager' => __DIR__ . '/includes/filebackend/lockmanager/MemcLockManager.php',
        'MemcachedBagOStuff' => __DIR__ . '/includes/objectcache/MemcachedBagOStuff.php',
@@ -770,6 +773,7 @@ $wgAutoloadLocalClasses = array(
        'MessageCache' => __DIR__ . '/includes/cache/MessageCache.php',
        'MessageContent' => __DIR__ . '/includes/content/MessageContent.php',
        'MessageSpecifier' => __DIR__ . '/includes/libs/MessageSpecifier.php',
+       'MigrateFileRepoLayout' => __DIR__ . '/maintenance/migrateFileRepoLayout.php',
        'MigrateUserGroup' => __DIR__ . '/maintenance/migrateUserGroup.php',
        'MimeMagic' => __DIR__ . '/includes/MimeMagic.php',
        'MinifyScript' => __DIR__ . '/maintenance/minify.php',
index c40b802..5740921 100644 (file)
@@ -21,7 +21,7 @@
                "leafo/lessphp": "0.5.0",
                "liuggio/statsd-php-client": "1.0.12",
                "mediawiki/at-ease": "1.0.0",
-               "oojs/oojs-ui": "0.12.0",
+               "oojs/oojs-ui": "0.12.1",
                "php": ">=5.3.3",
                "psr/log": "1.0.0",
                "wikimedia/cdb": "1.0.1",
index bf322ae..0233b11 100644 (file)
@@ -3445,7 +3445,7 @@ HTML
 
                $this->deletedSinceEdit = false;
 
-               if ( $this->mTitle->isDeletedQuick() ) {
+               if ( !$this->mTitle->exists() && $this->mTitle->isDeletedQuick() ) {
                        $this->lastDelete = $this->getLastDelete();
                        if ( $this->lastDelete ) {
                                $deleteTime = wfTimestamp( TS_MW, $this->lastDelete->log_timestamp );
index 21b584b..167305d 100644 (file)
@@ -1254,12 +1254,16 @@ function wfLogProfilingData() {
 
        $config = $context->getConfig();
        if ( $config->get( 'StatsdServer' ) ) {
-               $statsdServer = explode( ':', $config->get( 'StatsdServer' ) );
-               $statsdHost = $statsdServer[0];
-               $statsdPort = isset( $statsdServer[1] ) ? $statsdServer[1] : 8125;
-               $statsdSender = new SocketSender( $statsdHost, $statsdPort );
-               $statsdClient = new StatsdClient( $statsdSender );
-               $statsdClient->send( $context->getStats()->getBuffer() );
+               try {
+                       $statsdServer = explode( ':', $config->get( 'StatsdServer' ) );
+                       $statsdHost = $statsdServer[0];
+                       $statsdPort = isset( $statsdServer[1] ) ? $statsdServer[1] : 8125;
+                       $statsdSender = new SocketSender( $statsdHost, $statsdPort );
+                       $statsdClient = new StatsdClient( $statsdSender, true, false );
+                       $statsdClient->send( $context->getStats()->getBuffer() );
+               } catch ( Exception $ex ) {
+                       MWExceptionHandler::logException( $ex );
+               }
        }
 
        # Profiling must actually be enabled...
@@ -1421,7 +1425,7 @@ function wfGetLangObj( $langcode = false ) {
  *
  * This function replaces all old wfMsg* functions.
  *
- * @param string|string[] $key Message key, or array of keys
+ * @param string|string[]|MessageSpecifier $key Message key, or array of keys, or a MessageSpecifier
  * @param mixed $params,... Normal message parameters
  * @return Message
  *
index 825cd06..7b43a2d 100644 (file)
@@ -252,7 +252,7 @@ class MWHttpRequest {
                $this->parsedUrl = wfParseUrl( $this->url );
 
                if ( !$this->parsedUrl || !Http::isValidURI( $this->url ) ) {
-                       $this->status = Status::newFatal( 'http-invalid-url' );
+                       $this->status = Status::newFatal( 'http-invalid-url', $url );
                } else {
                        $this->status = Status::newGood( 100 ); // continue
                }
index 5510d35..f488aa2 100644 (file)
@@ -363,9 +363,8 @@ class MediaWiki {
                        $this->context->setWikiPage( $article->getPage() );
                }
 
-               // NS_MEDIAWIKI has no redirects.
-               // It is also used for CSS/JS, so performance matters here...
-               if ( $title->getNamespace() == NS_MEDIAWIKI ) {
+               // Skip some unnecessary code if the content model doesn't support redirects
+               if ( !ContentHandler::getForTitle( $title )->supportsRedirects() ) {
                        return $article;
                }
 
index ee41db0..54abfd1 100644 (file)
@@ -226,8 +226,9 @@ class Message implements MessageSpecifier, Serializable {
        /**
         * @since 1.17
         *
-        * @param string|string[] $key Message key or array of message keys to try and use the first
-        * non-empty message for.
+        * @param string|string[]|MessageSpecifier $key Message key, or array of
+        * message keys to try and use the first non-empty message for, or a
+        * MessageSpecifier to copy from.
         * @param array $params Message parameters.
         * @param Language $language Optional language of the message, defaults to $wgLang.
         *
@@ -236,6 +237,16 @@ class Message implements MessageSpecifier, Serializable {
        public function __construct( $key, $params = array(), Language $language = null ) {
                global $wgLang;
 
+               if ( $key instanceof MessageSpecifier ) {
+                       if ( $params ) {
+                               throw new InvalidArgumentException(
+                                       '$params must be empty if $key is a MessageSpecifier'
+                               );
+                       }
+                       $params = $key->getParams();
+                       $key = $key->getKey();
+               }
+
                if ( !is_string( $key ) && !is_array( $key ) ) {
                        throw new InvalidArgumentException( '$key must be a string or an array' );
                }
@@ -362,7 +373,7 @@ class Message implements MessageSpecifier, Serializable {
         *
         * @since 1.17
         *
-        * @param string|string[] $key Message key or array of keys.
+        * @param string|string[]|MessageSpecifier $key
         * @param mixed $param,... Parameters as strings.
         *
         * @return Message
index e832b82..a551fe1 100644 (file)
@@ -3433,11 +3433,11 @@ class OutputPage extends ContextSource {
                        $lang = $this->getTitle()->getPageLanguage();
                        if ( $lang->hasVariants() ) {
                                $variants = $lang->getVariants();
-                               foreach ( $variants as $_v ) {
-                                       $tags["variant-$_v"] = Html::element( 'link', array(
+                               foreach ( $variants as $variant ) {
+                                       $tags["variant-$variant"] = Html::element( 'link', array(
                                                'rel' => 'alternate',
-                                               'hreflang' => wfBCP47( $_v ),
-                                               'href' => $this->getTitle()->getLocalURL( array( 'variant' => $_v ) ) )
+                                               'hreflang' => wfBCP47( $variant ),
+                                               'href' => $this->getTitle()->getLocalURL( array( 'variant' => $variant ) ) )
                                        );
                                }
                                # x-default link per https://support.google.com/webmasters/answer/189077?hl=en
@@ -3952,7 +3952,14 @@ class OutputPage extends ContextSource {
         * @since 1.25
         */
        public function enableOOUI() {
-               OOUI\Theme::setSingleton( new OOUI\MediaWikiTheme() );
+               $themes = ExtensionRegistry::getInstance()->getAttribute( 'SkinOOUIThemes' );
+               // Make keys (skin names) lowercase for case-insensitive matching.
+               $themes = array_change_key_case( $themes, CASE_LOWER );
+               $skinName = strtolower( $this->getSkin()->getSkinName() );
+               $theme = isset( $themes[ $skinName ] ) ? $themes[ $skinName ] : 'MediaWiki';
+               // For example, 'OOUI\MediaWikiTheme'.
+               $themeClass = "OOUI\\{$theme}Theme";
+               OOUI\Theme::setSingleton( new $themeClass() );
                OOUI\Element::setDefaultDir( $this->getLanguage()->getDir() );
                $this->addModuleStyles( array(
                        'oojs-ui.styles',
index d11d021..9dec950 100644 (file)
 /**
  * Check php version and that external dependencies are installed, and
  * display an informative error if either condition is not satisfied.
+ *
+ * @note Since we can't rely on anything, the minimum PHP versions and MW current
+ * version are hardcoded here
  */
 function wfEntryPointCheck( $entryPoint ) {
+       $mwVersion = '1.26';
+       $minimumVersionPHP = '5.3.3';
+       $phpVersion = PHP_VERSION;
+
        if ( !function_exists( 'version_compare' )
-               || version_compare( PHP_VERSION, '5.3.3' ) < 0
-               || !file_exists( dirname( __FILE__ ) . '/../vendor/autoload.php' )
+               || version_compare( $phpVersion, $minimumVersionPHP ) < 0
        ) {
-               wfPHPVersionError( $entryPoint );
+               wfPHPVersionError( $entryPoint, $mwVersion, $minimumVersionPHP, $phpVersion );
+       }
+
+       if ( !file_exists( dirname( __FILE__ ) . '/../vendor/autoload.php' ) ) {
+               wfMissingVendorError( $entryPoint, $mwVersion );
        }
 }
 
@@ -49,47 +59,39 @@ function wfEntryPointCheck( $entryPoint ) {
  *   - api.php
  *   - mw-config/index.php
  *   - cli
- *
- * @note Since we can't rely on anything, the minimum PHP versions and MW current
- * version are hardcoded here
+ * @param string $mwVersion The number of the MediaWiki version used
+ * @param string $title HTML code to be put within an <h2> tag
+ * @param string $shortText
+ * @param string $longText
+ * @param string $longHtml
  */
-function wfPHPVersionError( $type ) {
-       $mwVersion = '1.26';
-       $minimumVersionPHP = '5.3.3';
-
-       $phpVersion = PHP_VERSION;
+function wfGenericError( $type, $mwVersion, $title, $shortText, $longText, $longHtml ) {
        $protocol = isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0';
-       $message = "MediaWiki $mwVersion requires at least "
-               . "PHP version $minimumVersionPHP, you are using PHP $phpVersion. Installing some "
-               . " external dependencies (e.g. via composer) is also required.";
 
        if ( $type == 'cli' ) {
-               $finalOutput = "Error: You are missing some external dependencies or are using on older PHP version. \n"
-                       . "MediaWiki $mwVersion needs PHP $minimumVersionPHP or higher.\n\n"
-                       . "Check if you have a newer php executable with a different name, such as php5.\n\n"
-                       . "MediaWiki now also has some external dependencies that need to be installed\n"
-                       . "via composer or from a separate git repo. Please see\n"
-                       . "https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries\n"
-                       . "for help on installing the required components.";
-       } elseif ( $type == 'index.php' || $type == 'mw-config/index.php' ) {
-               $pathinfo = pathinfo( $_SERVER['SCRIPT_NAME'] );
-               if ( $type == 'mw-config/index.php' ) {
-                       $dirname = dirname( $pathinfo['dirname'] );
-               } else {
-                       $dirname = $pathinfo['dirname'];
-               }
-               $encLogo = htmlspecialchars(
-                       str_replace( '//', '/', $dirname . '/' ) .
-                       'resources/assets/mediawiki.png'
-               );
-
+               $finalOutput = $longText;
+       } else {
                header( "$protocol 500 MediaWiki configuration Error" );
-               header( 'Content-type: text/html; charset=UTF-8' );
                // Don't cache error pages!  They cause no end of trouble...
                header( 'Cache-control: none' );
                header( 'Pragma: no-cache' );
 
-               $finalOutput = <<<HTML
+               if ( $type == 'index.php' || $type == 'mw-config/index.php' ) {
+                       $pathinfo = pathinfo( $_SERVER['SCRIPT_NAME'] );
+                       if ( $type == 'mw-config/index.php' ) {
+                               $dirname = dirname( $pathinfo['dirname'] );
+                       } else {
+                               $dirname = $pathinfo['dirname'];
+                       }
+                       $encLogo = htmlspecialchars(
+                               str_replace( '//', '/', $dirname . '/' ) .
+                               'resources/assets/mediawiki.png'
+                       );
+                       $shortHtml = htmlspecialchars( $shortText );
+
+                       header( 'Content-type: text/html; charset=UTF-8' );
+
+                       $finalOutput = <<<HTML
 <!DOCTYPE html>
 <html lang="en" dir="ltr">
        <head>
@@ -120,10 +122,43 @@ function wfPHPVersionError( $type ) {
                <h1>MediaWiki {$mwVersion} internal error</h1>
                <div class='error'>
                <p>
-                       {$message}
+                       {$shortHtml}
                </p>
-               <h2>Supported PHP versions</h2>
+               <h2>{$title}</h2>
                <p>
+                       {$longHtml}
+               </p>
+               </div>
+       </body>
+</html>
+HTML;
+               // Handle everything that's not index.php
+               } else {
+                       // So nothing thinks this is JS or CSS
+                       $finalOutput = ( $type == 'load.php' ) ? "/* $shortText */" : $shortText;
+               }
+       }
+       echo "$finalOutput\n";
+       die( 1 );
+}
+
+/**
+ * Display an error for the minimum PHP version requirement not being satisfied.
+ *
+ * @param string $type See wfGenericError
+ * @param string $mwVersion See wfGenericError
+ * @param string $minimumVersionPHP The minimum PHP version supported by MediaWiki
+ * @param string $phpVersion The current PHP version
+ */
+function wfPHPVersionError( $type, $mwVersion, $minimumVersionPHP, $phpVersion ) {
+       $shortText = "MediaWiki $mwVersion requires at least "
+               . "PHP version $minimumVersionPHP, you are using PHP $phpVersion.";
+
+       $longText = "Error: You might be using on older PHP version. \n"
+               . "MediaWiki $mwVersion needs PHP $minimumVersionPHP or higher.\n\n"
+               . "Check if you have a newer php executable with a different name, such as php5.\n\n";
+
+       $longHtml = <<<HTML
                        Please consider <a href="http://www.php.net/downloads.php">upgrading your copy of PHP</a>.
                        PHP versions less than 5.3.0 are no longer supported by the PHP Group and will not receive
                        security or bugfix updates.
@@ -134,24 +169,31 @@ function wfPHPVersionError( $type ) {
                        of MediaWiki from our website.  See our
                        <a href="https://www.mediawiki.org/wiki/Compatibility#PHP">compatibility page</a>
                        for details of which versions are compatible with prior versions of PHP.
-               </p>
-               <h2>External dependencies</h2>
-               <p>
+HTML;
+       wfGenericError( $type, $mwVersion, 'Supported PHP versions', $shortText, $longText, $longHtml );
+}
+
+/**
+ * Display an error for the vendor/autoload.php file not being found.
+ *
+ * @param string $type See wfGenericError
+ * @param string $mwVersion See wfGenericError
+ */
+function wfMissingVendorError( $type, $mwVersion ) {
+       $shortText = "Installing some external dependencies (e.g. via composer) is also required.";
+
+       $longText = "Error: You are missing some external dependencies. \n"
+               . "MediaWiki now also has some external dependencies that need to be installed\n"
+               . "via composer or from a separate git repo. Please see\n"
+               . "https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries\n"
+               . "for help on installing the required components.";
+
+       $longHtml = <<<HTML
                        MediaWiki now also has some external dependencies that need to be installed via
                        composer or from a separate git repo. Please see
                        <a href="https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries">mediawiki.org</a>
                        for help on installing the required components.
-               </p>
-               </div>
-       </body>
-</html>
 HTML;
-       // Handle everything that's not index.php
-       } else {
-               // So nothing thinks this is JS or CSS
-               $finalOutput = ( $type == 'load.php' ) ? "/* $message */" : $message;
-               header( "$protocol 500 MediaWiki configuration Error" );
-       }
-       echo "$finalOutput\n";
-       die( 1 );
+
+       wfGenericError( $type, $mwVersion, 'External dependencies', $shortText, $longText, $longHtml );
 }
index fac45d0..8a15b54 100644 (file)
@@ -4547,15 +4547,17 @@ class Title {
        public function isValidRedirectTarget() {
                global $wgInvalidRedirectTargets;
 
-               // invalid redirect targets are stored in a global array, but explicitly disallow Userlogout here
-               if ( $this->isSpecial( 'Userlogout' ) ) {
-                       return false;
-               }
-
-               foreach ( $wgInvalidRedirectTargets as $target ) {
-                       if ( $this->isSpecial( $target ) ) {
+               if ( $this->isSpecialPage() ) {
+                       // invalid redirect targets are stored in a global array, but explicitly disallow Userlogout here
+                       if ( $this->isSpecial( 'Userlogout' ) ) {
                                return false;
                        }
+
+                       foreach ( $wgInvalidRedirectTargets as $target ) {
+                               if ( $this->isSpecial( $target ) ) {
+                                       return false;
+                               }
+                       }
                }
 
                return true;
index d627a6d..cefbe62 100644 (file)
@@ -3689,7 +3689,7 @@ class User implements IDBAccessObject {
                        $from = ( $this->queryFlagsUsed & self::READ_LATEST ) ? 'master' : 'slave';
                        throw new MWException(
                                "CAS update failed on user_touched for user ID '{$this->mId}' (read from $from);" .
-                               "the version of the user to be saved is older than the current version."
+                               " the version of the user to be saved is older than the current version."
                        );
                }
 
@@ -4252,7 +4252,9 @@ class User implements IDBAccessObject {
                }
                $to = MailAddress::newFromUser( $this );
 
-               return UserMailer::send( $to, $sender, $subject, $body, $replyto );
+               return UserMailer::send( $to, $sender, $subject, $body, array(
+                       'replyTo' => $replyto,
+               ) );
        }
 
        /**
index 59f2199..febe5cc 100644 (file)
        "apihelp-login-param-name": "Nom d'usuari.",
        "apihelp-login-param-password": "Contrasenya.",
        "apihelp-login-example-login": "Inicia sessió.",
-       "apihelp-protect-param-cascade": "Activa la protecció en cascada (és a dir, protegeix les plantilles i imatges utilitzades en aquesta pàgina). S'ignora si cap dels nivells de protecció suporta la protecció en cascada."
+       "apihelp-protect-param-cascade": "Activa la protecció en cascada (és a dir, protegeix les plantilles i imatges utilitzades en aquesta pàgina). S'ignora si cap dels nivells de protecció suporta la protecció en cascada.",
+       "apihelp-query+pageswithprop-example-generator": "Obtenir informació addicional sobre les 10 primeres pàgines utilitzant <code>__NOTOC__</code>.",
+       "apihelp-query+watchlist-paramvalue-prop-title": "Afegeix el títol de la pàgina.",
+       "apihelp-query+watchlist-paramvalue-prop-user": "Afegeix l'usuari que ha fet l'edició.",
+       "apihelp-query+watchlist-paramvalue-prop-userid": "Afegeix l'identificador d'usuari que ha fet l'edició.",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "Afegeix comentari de l'edició.",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "Afegeix timestamp de l'edició.",
+       "apihelp-query+watchlist-paramvalue-prop-patrol": "Etiqueta les modificacions que són vigilades.",
+       "apihelp-query+watchlist-paramvalue-prop-loginfo": "Afegeix informació de registre, si s'escau."
 }
index efde89b..e3cc09b 100644 (file)
        "apihelp-expandtemplates-param-title": "Titel der Seite.",
        "apihelp-expandtemplates-param-text": "Zu konvertierender Wikitext.",
        "apihelp-expandtemplates-param-revid": "Versionsnummer, die für die Anzeige von <nowiki>{{REVISIONID}}</nowiki> und ähnlichen Variablen verwendet wird.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "Der expandierte Wikitext.",
+       "apihelp-expandtemplates-paramvalue-prop-parsetree": "Der XML-Parserbaum der Eingabe.",
        "apihelp-expandtemplates-param-includecomments": "Ob HTML-Kommentare in der Ausgabe eingeschlossen werden sollen.",
        "apihelp-expandtemplates-param-generatexml": "XML-Parserbaum erzeugen (ersetzt durch $1prop=parsetree).",
        "apihelp-expandtemplates-example-simple": "Den Wikitext <kbd><nowiki>{{Project:Spielwiese}}</nowiki></kbd> expandieren.",
        "apihelp-parse-paramvalue-prop-templates": "Gibt die Vorlagen im geparsten Wikitext zurück.",
        "apihelp-parse-paramvalue-prop-images": "Gibt die Bilder im geparsten Wikitext zurück.",
        "apihelp-parse-paramvalue-prop-externallinks": "Gibt die externen Links im geparsten Wikitext zurück.",
+       "apihelp-parse-paramvalue-prop-revid": "Ergänzt die Versionskennung der geparsten Seite.",
+       "apihelp-parse-paramvalue-prop-displaytitle": "Ergänzt den Titel des geparsten Wikitextes.",
        "apihelp-parse-param-section": "Gibt nur den Inhalt dieses Abschnittes zurück oder erstellt einen neuen Abschnitt, wenn <kbd>new</kbd> angegeben wird.\n\n<kbd>new</kbd> wird nur ausgewertet, wenn auch <var>text</var> angegeben wurde.",
        "apihelp-parse-param-sectiontitle": "Überschrift des neuen Abschnittes, wenn <var>section</var> = <kbd>new</kbd> ist.\n\nAnders als beim Bearbeiten der Seite wird der Parameter nicht durch die <var>summary</var> ersetzt, wenn er weggelassen oder leer ist.",
        "apihelp-parse-param-disableeditsection": "Lässt Abschnittsbearbeitungslinks in der Parserausgabe weg.",
index 1e286d4..885bc77 100644 (file)
@@ -24,7 +24,7 @@
        "apihelp-main-param-requestid": "Cualquier valor dado aquí se incluirá en la respuesta. Se puede utilizar para distinguir solicitudes.",
        "apihelp-main-param-servedby": "Incluir el nombre del host que ha servido la solicitud en los resultados.",
        "apihelp-main-param-curtimestamp": "Incluir la marca de tiempo actual en el resultado.",
-       "apihelp-block-description": "Bloquear usuario",
+       "apihelp-block-description": "Bloquear a un usuario.",
        "apihelp-block-param-user": "El nombre de usuario, dirección IP o intervalo de IP que quieres bloquear.",
        "apihelp-block-param-expiry": "Fecha de expiración. Puede ser relativa (por ejemplo, <kbd>5 meses</kbd> o <kbd>2 semanas</kbd>) o absoluta (por ejemplo, <kbd>2014-09-18T12:34:56Z</kbd>). Si se establece en <kbd>infinito</kbd>, <kbd>indefinido</kbd>, o <kbd>nunca</kbd>, el bloqueo será permanente.",
        "apihelp-block-param-reason": "Razón para el bloqueo.",
@@ -50,7 +50,7 @@
        "apihelp-compare-param-fromid": "ID de la primera página a comparar.",
        "apihelp-compare-param-fromrev": "Primera revisión para comparar.",
        "apihelp-compare-param-totitle": "Segundo título para comparar.",
-       "apihelp-compare-param-toid": "Segunda página de IDENTIFICACIÓN para comparar.",
+       "apihelp-compare-param-toid": "Segunda identificador de página para comparar.",
        "apihelp-compare-param-torev": "Segunda revisión para comparar.",
        "apihelp-compare-example-1": "Crear una diferencia entre las revisiones 1 y 2.",
        "apihelp-createaccount-description": "Crear una nueva cuenta de usuario.",
@@ -94,7 +94,7 @@
        "apihelp-edit-param-undo": "Deshacer esta revisión. Reemplaza $1text, $1prependtext y $1appendtext.",
        "apihelp-edit-param-undoafter": "Deshacer todas las revisiones desde $1undo a esta. Si no está establecido solo se deshace una revisión.",
        "apihelp-edit-param-redirect": "Resolver redirecciones automáticamente.",
-       "apihelp-edit-param-contentformat": "Formato de serialización de contenido, utilizado para introducir texto.",
+       "apihelp-edit-param-contentformat": "Formato de serialización de contenido utilizado para el texto de entrada.",
        "apihelp-edit-param-contentmodel": "Modelo de contenido del nuevo contenido.",
        "apihelp-edit-param-token": "La clave debe enviarse siempre como el último parámetro o, al menos, después del parámetro $1text.",
        "apihelp-edit-example-edit": "Editar una página",
        "apihelp-managetags-example-delete": "Eliminar la etiqueta <kbd>vandlaismo</kbd> con el motivo <kbd>mal deletreado</kbd>",
        "apihelp-managetags-example-activate": "Activar una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>Para utilizar en patrullaje de edición</kbd>",
        "apihelp-managetags-example-deactivate": "Desactivar una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>Para utilizar en patrullaje de edición</kbd>",
-       "apihelp-move-description": "Mover una página.",
+       "apihelp-move-description": "Trasladar una página.",
        "apihelp-move-param-from": "Título de la página a renombrar. No se puede utilizar con <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "ID de la página a renombrar. No se puede utilizar con <var>$1from</var>.",
        "apihelp-move-param-to": "Título para cambiar el nombre de la página.",
        "apihelp-query+allcategories-example-size": "Lista las categorías con información sobre el número de páginas de cada una.",
        "apihelp-query+alldeletedrevisions-description": "Listar todas las revisiones eliminadas por un usuario o en un espacio de nombres.",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Solo puede usarse con <var>$3user</var>.",
-       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "No puede ser utilizado con <var>$3user</var>.",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "No puede utilizarse con <var>$3user</var>.",
        "apihelp-query+alldeletedrevisions-param-start": "El sello de tiempo para comenzar la enumeración",
        "apihelp-query+alldeletedrevisions-param-end": "El sello de tiempo para detener la enumeración",
        "apihelp-query+alldeletedrevisions-param-from": "Empezar a listar en este título.",
        "apihelp-query+deletedrevs-example-mode3-talk": "Listar las primeras 50 páginas en el espacio de nombres {{ns:talk}} (modo 3).",
        "apihelp-query+disabled-description": "Se ha desactivado el módulo de consulta.",
        "apihelp-query+duplicatefiles-example-simple": "Buscar duplicados de [[:File:Alber Einstein Head.jpg]].",
-       "apihelp-query+duplicatefiles-example-generated": "Buscar duplicados en todos los ficheros.",
+       "apihelp-query+duplicatefiles-example-generated": "Buscar duplicados en todos los archivos.",
        "apihelp-query+embeddedin-description": "Encuentra todas las páginas que transcluyen el título dado.",
        "apihelp-query+embeddedin-param-title": "Título a buscar. No puede usarse en conjunto con $1pageid.",
        "apihelp-query+embeddedin-param-filterredir": "Cómo filtrar las redirecciones.",
index b418f1d..2bb9890 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Subi"
+                       "Subi",
+                       "Sator"
                ]
        },
        "apihelp-block-description": "Blokeatu erabiltzaile bat.",
@@ -35,6 +36,7 @@
        "apihelp-query+allusers-param-activeusers": "Bakarrik zerrendatu azken {{PLURAL:$1|eguneko|$1 egunetako}} erabiltzaile aktiboak.",
        "apihelp-query+imageinfo-param-urlheight": "$1urlwidth-en antzekoa.",
        "apihelp-query+imageusage-example-simple": "Erakutsi [[:File:Albert Einstein Head.jpg]] darabilten orriak",
+       "apihelp-query+langlinks-param-inlanguagecode": "Hizkuntza izenak aurkitzeko hizkuntza kodea.",
        "apihelp-query+prefixsearch-param-search": "Bilatu katea.",
        "apihelp-query+protectedtitles-example-simple": "Zerrendatu babestutako izenburuak",
        "apihelp-query+recentchanges-example-simple": "Zerrendatu aldaketa berriak.",
index 585bf6a..8bbecfa 100644 (file)
        "apihelp-xmlfm-description": "Extraire les données au format XML (affiché proprement en HTML).",
        "apihelp-yaml-description": "Extraire les données au format YAML.",
        "apihelp-yamlfm-description": "Extraire les données YAML (affiché proprement en HTML).",
-       "api-format-title": "Résultat de l’API de MédiaWiki",
+       "api-format-title": "Résultat de l’API de MediaWiki",
        "api-format-prettyprint-header": "Voici la représentation HTML du format $1. HTML est utile pour le débogage, mais inapproprié pour être utilisé dans une application.\n\nSpécifiez le paramètre <var>format</var> pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez <kbd>format=$2</kbd>.\n\nVoyez la [[mw:API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
        "api-format-prettyprint-header-only-html": "Ceci est une représentation HTML à des fins de déboguage, et n’est pas approprié à une utilisation applicative.\n\nVoir la [[mw:API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
        "api-orm-param-props": "Champs à rechercher.",
        "api-pageset-param-redirects-nogenerator": "Résoudre automatiquement les redirections dans <var>$1titles</var>, <var>$1pageids</var> et <var>$1revids</var>.",
        "api-pageset-param-converttitles": "Convertir les titres dans d’autres variantes si nécessaire. Fonctionne uniquement si la langue de contenu du wiki supporte la conversion en variantes. Les langues qui supportent la conversion en variante incluent $1.",
        "api-help-title": "Aide de l’API de MediaWiki",
-       "api-help-lead": "Ceci est une page d’aide de l’API de MédiaWiki générée automatiquement.\n\nDocumentation et exemples : https://www.mediawiki.org/wiki/API",
+       "api-help-lead": "Ceci est une page d’aide de l’API de MediaWiki générée automatiquement.\n\nDocumentation et exemples : https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Module principal",
        "api-help-flag-deprecated": "Ce module est obsolète.",
        "api-help-flag-internal": "<strong>Ce module est interne ou instable.</strong> Son fonctionnement peut être modifié sans préavis.",
index 3cdc992..c885f4e 100644 (file)
@@ -87,6 +87,7 @@
        "apihelp-edit-param-notminor": "שינוי לא משני.",
        "apihelp-edit-param-bot": "סימון עריכה זו כבוט.",
        "apihelp-edit-param-basetimestamp": "חותם־זמן של גרסת הבסיס, משמש לזיהוי התנגשויות עריכה. אפשר לקבל אותו באמצעות [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
+       "apihelp-edit-param-starttimestamp": "חותם־הזמן של תחילת תהליך העריכה, משמש לזיהוי התנגשויות. אפשר לקבל ערך מתאים באמצעות <var>[[Special:ApiHelp/main|curtimestamp]]</var> בעת תחילת תהליך העריכה (למשל בזמן טעינת תוכן הדף לעריכה).",
        "apihelp-edit-param-recreate": "לעקוב את כל הטעויות על כך שהדף נמחק בינתיים.",
        "apihelp-edit-param-createonly": "לא לערוך את הדף אם הוא כבר קיים.",
        "apihelp-edit-param-nocreate": "לזרוק שגיאה אם הדף אינו קיים.",
        "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "נותן משתני הגדרות של JavaScript שייחודיים לדף הזה בתור מחרוזת JSON.",
        "apihelp-parse-paramvalue-prop-iwlinks": "מתן קישורי בינוויקי בקוד הוויקי המפוענח.",
        "apihelp-parse-paramvalue-prop-wikitext": "מתן קוד הוויקי המקורי שפוענח.",
-       "apihelp-parse-param-disablepp": "×\9c×\9b×\91×\95ת ×\90ת ×\93×\95\"×\97 ×\94Ö¾PP מפלט המפענח.",
-       "apihelp-parse-param-disableeditsection": "×\9c×\9b×\91×\95ת את קישורי עריכת הפסקאות מפלט המפענח.",
+       "apihelp-parse-param-disablepp": "×\9c×\94ש×\9e×\99×\98 ×\90ת ×\93×\95\"×\97 ×\94ק×\93×\9dÖ¾×\9e×¢×\91×\93 (\"NewPP limit report\") מפלט המפענח.",
+       "apihelp-parse-param-disableeditsection": "×\9c×\94ש×\9e×\99×\98 את קישורי עריכת הפסקאות מפלט המפענח.",
        "apihelp-parse-param-preview": "לפענח במצב תצוגה מקדימה.",
        "apihelp-parse-param-sectionpreview": "לפענח במצב תצוגה מקדימה של פסקה (מדליק גם את מצב תצוגה מקדימה).",
-       "apihelp-parse-param-disabletoc": "×\9c×\9b×\91×\95ת ×ª×\95×\9b×\9f עניינים בפלט.",
+       "apihelp-parse-param-disabletoc": "×\9c×\94ש×\9e×\99×\98 ×\90ת ×ª×\95×\9b×\9f ×\94עניינים בפלט.",
        "apihelp-parse-param-contentformat": "תסדיר הסדרת תוכן שישמש לטקסט הקלט. תקף רק עם $1text.",
        "apihelp-parse-example-page": "לפענח דף.",
        "apihelp-parse-example-text": "לפענח קוד ויקי.",
        "apihelp-protect-param-protections": "רשימת רמות הכנה, בתסדיר <kbd>action=level</kbd> (למשל <kbd>edit=sysop</kbd>).",
        "apihelp-protect-param-expiry": "חותמי־זמן של תפוגה. אם הוגדר רק חותם־זמן אחד, הוא ישמש לכל ההגנות. יש להשתמש ב־<kbd>infinite</kbd>‏, <kbd>indefinite</kbd>‏, <kbd>infinity</kbd>, או <kbd>never</kbd> להגנה שלא פגה לעולם.",
        "apihelp-protect-param-reason": "סיבה להגנה או הסרת הגנה.",
-       "apihelp-protect-param-cascade": "×\94פע×\9cת ×\94×\92× ×\94 ×\9e×\93×\95ר×\92ת (×\9b×\9c×\95×\9eר, ×\9c×\94×\92×\9f ×¢×\9c ×\93פ×\99×\9d ×©×\9b×\9c×\95×\9c×\99×\9d ×\91×\93×£ ×\94×\96×\94). ×\90×\99×\9f ×\9c×\96×\94 ×\94שפע×\94 ×\90×\9d ×\9b×\9c ×¨×\9e×\95ת ×\94×\94×\92× ×\94 ×©× ×\99תנ×\95 ×\90×\99× ×\9f ×ª×\95×\9e×\9b×\95ת בדירוג.",
+       "apihelp-protect-param-cascade": "×\94פע×\9cת ×\94×\92× ×\94 ×\9e×\93×\95ר×\92ת (×\9b×\9c×\95×\9eר, ×\9c×\94×\92×\9f ×¢×\9c ×\93פ×\99×\9d ×©×\9e×\95×\9b×\9c×\9c×\99×\9d ×\91×\93×£ ×\94×\96×\94 ×\95×¢×\9c ×ª×\9e×\95× ×\95ת ×©×\9eש×\9e×\95ת ×\91×\95). ×\90×\99×\9f ×\9c×\96×\94 ×\94שפע×\94 ×\90×\9d ×\90×£ ×\90×\97ת ×\9eר×\9e×\95ת ×\94×\94×\92× ×\94 ×©× ×\99תנ×\95 ×\90×\99× ×\94 ×ª×\95×\9e×\9bת בדירוג.",
        "apihelp-protect-param-watch": "אם זה מוגדר, הוספת הדף שהגנה נוספת אליו או מוסרת ממנו לרשימת המעקב של המשתמש הנוכחי.",
        "apihelp-protect-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
        "apihelp-protect-example-protect": "הגנה על דף.",
        "apihelp-query+allimages-param-sha1": "גיבוב SHA1 של תמונה. דריסת $1sha1base36.",
        "apihelp-query+allimages-param-sha1base36": "גיבוב SHA1 של התמונה בבסיס 36 (הבסיס בו נעשה שימוש במדיה־ויקי).",
        "apihelp-query+allimages-param-user": "להחזיר רק קבצים שהועלו על־ידי המשתמש הזה. יכול לשמש רק עם $1sort=timestamp. לא יכול לשמש יחד עם $1filterbots.",
+       "apihelp-query+allimages-param-filterbots": "איך לסנן קבצים שמעלים בוטים. יכול לשמש רק עם $1sort=timestamp. לא יכול לשמש יחד עם $1user.",
        "apihelp-query+allimages-param-limit": "כמה תמונות להחזיר בסך הכול.",
        "apihelp-query+allimages-example-B": "הצגת רשימה של קבצים שמתחילים באות <kbd>B</kbd>.",
        "apihelp-query+allimages-example-generator": "הצגת מידע על 4 קבצים המתחילים באות <kbd>T</kbd>.",
        "apihelp-query+allusers-description": "למנות את כל המשתמשים הרשומים.",
        "apihelp-query+allusers-param-from": "מאיזה שם משתמש להתחיל למנות.",
        "apihelp-query+allusers-param-to": "באיזה שם משתמש להפסיק למנות.",
+       "apihelp-query+allusers-param-prefix": "חיפוש כל המשתמשים שמתחילים בערך הזה.",
        "apihelp-query+allusers-param-dir": "באיזה כיוון למיין.",
+       "apihelp-query+allusers-param-group": "לכלול רק משתמשים בקבוצות הנתונות.",
+       "apihelp-query+allusers-param-excludegroup": "לא לכלול משתמשים בקבוצות הנתונות.",
+       "apihelp-query+allusers-param-rights": "לכלול רק משתמשים עם ההרשאות הנתונות. לא כולל הרשאות שניתנו בקבוצות משתמעות או אוטומטיות כגון *, user או autoconfirmed.",
        "apihelp-query+allusers-param-prop": "אילו פרטי מידע לכלול:\n;blockinfo:הוספת מידע עם החסימה הנוכחית של משתמש.\n;groups:הוספת קבוצות שמשתמש חבר בהן. זה משתמש ביותר משאבי דפדפן ויכול להחזיר פחות תוצאות מהמגבלה.\n;implicitgroups:לרשום את כל הקבוצות שהמשתמש חבר בהן אוטומטית.\n;rights:רשימת הההרשאות שיש למשתמש.\n;editcount:הוספת מניין העריכות של המשתמש .\n;registration:הוספת חותם־הזמן של זמן הרישום של המשתמש (יכול להיות ריק).",
+       "apihelp-query+allusers-param-limit": "כמה שמות משתמש בסך הכול לשנות.",
+       "apihelp-query+allusers-param-witheditsonly": "לרשום רק משתמשים שעשו עריכות.",
+       "apihelp-query+allusers-param-activeusers": "לרשום רק משתמשים שהיו פעילים {{PLURAL:$1|ביום האחרון|ביומיים האחרונים|ב־$1 הימים האחרונים}}.",
+       "apihelp-query+allusers-example-Y": "לרשום משתמשים שמתחילים ב־<kbd>Y</kbd>.",
        "apihelp-query+backlinks-description": "מציאת כל הדפים שמקשרים לדף הנתון.",
        "apihelp-query+backlinks-param-title": "איזו כותרת לחפש. לא ניתן להשתמש בזה יחד עם <var>$1pageid</var>.",
        "apihelp-query+backlinks-param-namespace": "איזה מרחב שם למנות.",
        "apihelp-query+blocks-param-start": "מאיזה חותם‏־זמן להתחיל למנות.",
        "apihelp-query+blocks-param-end": "באיזה חותם זמן להפסיק למנות.",
        "apihelp-query+blocks-param-prop": "אילו מאפיינים לקבל:\n;id:הוספת מזהה החסימה.\n;user:הוספת שם המשתמש שנחסם.\n;userid:הוספת המזהה של המשמש שנחסם.\n;by:הוספת שם המשתמש שחסם.\n;byid:הוספת מזהה המשתמש שחסם.\n;timestamp:הוספת חותם־הזמן של החסימה.\n;expiry:הוספת חותם־הזמן של תפוגת החסימה.\n;reason:הוספת הסיבה שניתנה לחסימה.\n;range:הוספת טווח כתובות ה־IP שהחסימה משפיעה עליהן.\n;flags:מתייג את ההחרמה (autoblock‏, anononly, וכו'.).",
+       "apihelp-query+blocks-example-simple": "רשימת חסימות.",
        "apihelp-query+categories-param-prop": "אילו מאפיינים נוספים לקבל עבור כל קטגוריה:\n;sortkey:הוספת מפתח מיון (מחרוזת הקסדצימלית) ותחילית מפתח מיון (החלק הקריא) עבור קטגוריה.\n;timestamp:הוספת חותם־הזמן של יצירת הקטגוריה.\n;hidden:תיוג קטגוריות שהוסתרו באמצעות _&#95;HIDDENCAT_&#95;.",
        "apihelp-query+categories-param-limit": "כמה קטגוריות להחזיר.",
        "apihelp-query+categories-param-dir": "באיזה כיוון לרשום.",
+       "apihelp-query+categoryinfo-description": "החזרת מידע על הקטגוריות הנתונות.",
        "apihelp-query+categorymembers-description": "רשימת כל הדפים בקטגוריה נתונה.",
        "apihelp-query+categorymembers-param-title": "איזו קטגוריה למנות (נדרש). חייב לכלול את התחילית <kbd>{{ns:category}}:</kbd>. לא יכול לשמש יחד עם <var>$1pageid</var>.",
        "apihelp-query+categorymembers-param-pageid": "מזהה הדף של הקטגוריה שצריך למנות. לא יכול לשמש יחד עם <var>$1title</var>.",
+       "apihelp-query+categorymembers-param-prop": "אילו חלקי מידע לכלול:\n;ids:הוספת מזהה הדף.\n;title:הוספת השם ומזהה מרחב השם של הדף.\n;sortkey:הוספת מפתח המיון שמשמש למיון בקטגוריה (מחרזות הקסדצימלית).\n;sortkeyprefix:הוספת מפתח המיון שמשמש למיון בקטגוריה (מחרוזת הקסדצימלית).\n;type:הוספת הסוג שהדף מוין אליו (דף, תת־קטגוריה, או קובץ).\n;timestamp:הוספת חותם־הזמן שבו הדף נכלל.",
        "apihelp-query+categorymembers-param-namespace": "לכלול רק דפים במרחבי השם האלה. יש לשים לב לכך ש־<kbd>$1type=subcat</kbd> או <kbd>$1type=file</kbd> יכולים לשמש במקום <kbd>$1namespace=14</kbd> או <kbd>6</kbd>.",
+       "apihelp-query+categorymembers-param-type": "איזה סוג של חברי קטגוריה לכלול. לא תקף כאשר מוגדר <kbd>$1sort=timestamp</kbd>.",
        "apihelp-query+categorymembers-param-limit": "מספר הדפים המרבי שיוחזר.",
        "apihelp-query+categorymembers-param-sort": "לפי איזה מאפיין למיין.",
        "apihelp-query+categorymembers-param-dir": "באיזה כיוון למיין.",
+       "apihelp-query+categorymembers-param-start": "מאיזה חותם־זמן להתחיל לרשום. יכול לשמש רק עם <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-end": "באיזה חותם־זמן לסיים לרשום. יכול לשמש רק עם <kbd>$1sort=timestamp</kbd>.",
        "apihelp-query+categorymembers-param-startsortkey": "כדאי להשתמש ב־$1starthexsortkey במקום.",
        "apihelp-query+categorymembers-param-endsortkey": "כדאי להשתמש ב־$1endhexsortkey במקום.",
        "apihelp-query+categorymembers-example-simple": "קבלת עשרת העמודים הראשונים שתחת <kbd>קטגוריה:פיזיקה</kbd>.",
        "apihelp-query+contributors-param-limit": "כמה תורמים להחזיר.",
        "apihelp-query+contributors-example-simple": "הצגת תורמים לדף <kbd>עמוד ראשי</kbd>.",
+       "apihelp-query+deletedrevisions-description": "קבלת מידע על גרסה מחוקה.\n\nיכול לשמש במספר דרכים:\n# קבלת גרסאות מחוקות עבור ערכת דפים, על־ידי הגדרת שמות או מזהי דף. ממוין לפי שם וחותם־זמן.\n# קבלת מידע על ערכת גרסאות מחוקות באמצעות הגדרת המזהים שלהם עם revid־ים. ממוין לפי מזהה גרסה.",
        "apihelp-query+deletedrevisions-param-start": "באיזה חותם־זמן להתחיל למנות. לא תקף בעיבור רשימת מזהי גרסה.",
        "apihelp-query+deletedrevisions-param-end": "באיזה חותם־זמן להפסיק למנות. לא תקף בעת עיבוד רשימת מזהי גרסה.",
        "apihelp-query+deletedrevisions-param-tag": "לרשום רק גרסאות עם התג הזה.",
        "apihelp-query+deletedrevisions-param-user": "לרשום רק גרסאות מאת המשתמש הזה.",
        "apihelp-query+deletedrevisions-param-excludeuser": "לא לרשום גרסאות מאת המשתמש הזה.",
+       "apihelp-query+deletedrevs-description": "רשימת גרסאות מחוקות.\n\nפועל בשלושה אופנים:\n# רשימת גרסאות מחוקות לשמות שניתנו, ממוינות לפי חותם־זמן.\n# רשימת תרומות מחוקות של המשתמש שניתן, ממוינות לפי חותם־זמן (בלי לציין שמות).\n# רשימת כל הגרסאות המחוקות במרחב השם שניתן, ממוינות לפי שם וחותם־זמן (בלי לציין שמות, בלי להגדיר $1user).\n\nפרמטרים מסוימים חלים רק על חלק מהאופנים ולא תקפים באחרים.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|מצב|מצבים}}: $2",
        "apihelp-query+deletedrevs-param-start": "באיזה חותם־זמן להתחיל למנות.",
        "apihelp-query+deletedrevs-param-end": "באיזה חותם־זמן להפסיק למנות.",
        "apihelp-query+embeddedin-param-title": "איזו כותרת לחפש. לא ניתן להשתמש בזה יחד עם $1pageid.",
        "apihelp-query+embeddedin-param-namespace": "איזה מרחב שם למנות.",
        "apihelp-query+embeddedin-param-dir": "באיזה כיוון לרשום.",
+       "apihelp-query+embeddedin-param-filterredir": "איך לסנן עבור הפניות.",
        "apihelp-query+embeddedin-param-limit": "כמה דפים להחזיר בסך הכול.",
        "apihelp-query+extlinks-param-limit": "כמה קישורים להחזיר.",
        "apihelp-query+exturlusage-description": "למנות דפים שמכילים URL נתון.",
        "apihelp-query+exturlusage-param-namespace": "איזה מרחב שם למנות.",
+       "apihelp-query+exturlusage-param-limit": "כמה דפים להחזיר.",
        "apihelp-query+filearchive-description": "למנות את כל הקבצים המחוקים לפי הסדר.",
        "apihelp-query+filearchive-param-from": "מאיזו כותרת תמונה להתחיל למנות.",
        "apihelp-query+filearchive-param-to": "באיזו כותרת תמונה להפסיק למנות.",
+       "apihelp-query+filearchive-param-limit": "כמה תמונות להחזיר בסך הכול.",
        "apihelp-query+filearchive-param-dir": "באיזה כיוון לרשום.",
+       "apihelp-query+filearchive-param-sha1": "גיבוב SHA1 של תמונה. דורס את $1sha1base36.",
+       "apihelp-query+filearchive-param-sha1base36": "גיבוב SHA1 של תמונה בבסיס 36 (משמש במדיה־ויקי).",
+       "apihelp-query+filearchive-param-prop": "איזה מידע על תמונה לקבל:\n;sha1:הוספת גיבוב SHA-1 עבור התמונה.\n;timestamp:הוספת חותם־זמן לגרסה המועלית.\n;user:הוספת המשתמש שהעלה על גרסת התמונה.\n;size:הוספת הגודל של התמונה בבתים והגובה, הרוחב ומניין הדפים (אם מתאים).\n;dimensions:כינוי ל־size.\n;description:הוספת תיאור לגרסת התמונה.\n;parseddescription:פענוח התיאור של הגרסה.\n;mime:הוספת ה־MIME של התמונה.\n;mediatype:הוספת סוג המדיה של התמונה.\n;metadata:רשימת מטא־נתוני Exif עבור גרסת הקובץ.\n;bitdepth:הוספת עומק הביטים של הגרסה.\n;archivename:הוספת שם הקובץ של גרסה מאורכבת עבור גרסאות שאינן האחרונה.",
        "apihelp-query+fileusage-param-namespace": "לכלול רק דפים במרחבי השם האלה.",
        "apihelp-query+fileusage-param-limit": "כמה להחזיר.",
        "apihelp-query+fileusage-param-show": "לחפש רק פריטים שמתאימים לאמות המידה הבאות:\n;redirect:להציג רק הפניות.\n;!redirect:לא להציג הפניות.",
        "apihelp-query+imageusage-param-namespace": "איזה מרחב שם לרשום.",
        "apihelp-query+imageusage-param-dir": "באיזה כיוון לרשום.",
        "apihelp-query+info-paramvalue-prop-watchers": "מספר העוקבים, אם קיבלת הרשאה.",
+       "apihelp-query+info-paramvalue-prop-notificationtimestamp": "חותם־זמן של הודעת רשימת מעקב של כל דף.",
        "apihelp-query+info-paramvalue-prop-readable": "האם המשתמש יכול להציג דף זה.",
        "apihelp-query+iwbacklinks-param-title": "איזה קישור בינוויקי לחפש. צריך להשתמש בזה יחד עם <var>$1blprefix</var>.",
        "apihelp-query+iwbacklinks-param-limit": "כמה דפים להחזיר בסך הכול.",
        "apihelp-query+linkshere-param-limit": "כמה להחזיר.",
        "apihelp-query+linkshere-param-show": "הצגת פריטים שתואמים את הדרישות הללו בלבד:\n;redirect:הצגת הפניות בלבד.\n;!redirect:הצגת קישורים שאינם הפניות בלבד.",
        "apihelp-query+logevents-description": "קבלת אירועים מהרישומים.",
+       "apihelp-query+logevents-param-prop": "אילו מאפיינים לקבל:\n;ids:הוספת המזהה של אירוע היומן.\n;title:הוספת שם הדף של אירוע היומן.\n;type:הוספת הסוג של אירוע היומן.\n;user:הוספת המשתמש האחראי על אירוע היומן.\n;userid:הוספת מזהה המשתמש האחראי על אירוע היומן.\n;timestamp:הוספת חותם־הזמן עבור האירוע.\n;comment:הוספת ההערה של האירוע.\n;parsedcomment:הוספת ההערה המפוענחת של האירוע.\n;details:הוספת פרטים נוספים על האירוע.\n;tags:רשימת התגים של האירוע.",
        "apihelp-query+logevents-param-start": "באיזה חותם־זמן להתחיל למנות.",
        "apihelp-query+logevents-param-end": "באיזה חותם זמן להפסיק לרשום.",
        "apihelp-query+pageswithprop-param-propname": "מאפיין דף שעבורו יימנו דפים.",
        "apihelp-query+pageswithprop-param-limit": "מספר הדפים המרבי שיוחזר.",
        "apihelp-query+pageswithprop-param-dir": "באיזה כיוון לסדר.",
        "apihelp-query+pageswithprop-example-simple": "הצגת עשרת הדפים הראשונים שעושים שימוש ב־<code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
-       "apihelp-query+pageswithprop-example-generator": "ק×\91×\9cת ×¤×¨×\98×\99×\94×\9d ×©ל עשרת הדפים הראשונים המשתמשים ב־<code>_&#95;NOTOC_&#95;</code>.",
+       "apihelp-query+pageswithprop-example-generator": "ק×\91×\9cת ×\9e×\99×\93×¢ × ×\95סף ×¢ל עשרת הדפים הראשונים המשתמשים ב־<code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+prefixsearch-param-search": "מחרוזת לחיפוש.",
        "apihelp-query+prefixsearch-param-namespace": "שמות מתחם לחיפוש.",
        "apihelp-query+prefixsearch-param-limit": "מספר התוצאות המרבי להחזרה.",
        "apihelp-query+prefixsearch-param-offset": "מספר תוצאות לדילוג.",
        "apihelp-query+protectedtitles-param-limit": "כמה דפים להחזיר בסך הכול.",
+       "apihelp-query+protectedtitles-param-start": "להתחיל לרשום בחותם־זמן ההגנה הזה.",
        "apihelp-query+protectedtitles-param-end": "באיזה חותם־זמן הגנה לסיים את הרשימה.",
+       "apihelp-query+protectedtitles-param-prop": "אילו מאפיינים לקבל:\n;timestamp:הוספת חותם־הזמן של הוספת ההגנה.\n;user:הוספת המשתמש שהוסיף את ההגנה.\n;userid:הוספת מזהה המשתמש שהוסיף את ההגנה.\n;comment:הוספת ההערה עבור ההגנה.\n;parsedcomment:הוספת ההערה המפוענחת עבור ההגנה.\n;expiry:הוספת חותם־הזמן של הסרת ההגנה.\n;level:הוספת רמת ההגנה.",
        "apihelp-query+querypage-param-limit": "מספר תוצאות להחזרה.",
        "apihelp-query+recentchanges-description": "מניית השינויים האחרונים.",
        "apihelp-query+recentchanges-param-start": "באיזה חותם־זמן להתחיל למנות.",
        "apihelp-query+recentchanges-param-end": "באיזה חותם זמן להפסיק לרשום.",
        "apihelp-query+recentchanges-param-user": "לרשום רק שינויים של המשתמש הזה.",
        "apihelp-query+recentchanges-param-excludeuser": "Don't list changes by this user",
+       "apihelp-query+recentchanges-param-prop": "לכלול פריטי מידע נוספים:\n;user:הוספת המשתמש האחראי על העריכה ותיוג אם זאת כתובת IP.\n;userid:הוספת המשתמש האחראי על העריכה.\n;comment:הוספת ההערה על העריכה.\n;parsedcomment:הוספת ההערה המפוענחת על העריכה.\n;flags:הוספת דגלים לעריכה.\n;timestamp:הוספת חותם־זמן של העריכה.\n;title:הוספת שם הדף של העריכה.\n;ids:הוספת מזהה הדף, מזהה שינויים אחרונים, והמזהה הגרסה החדשה והישנה.\n;sizes:הוספת אורך הדף החדש והישן בבתים.\n;redirect:מתייג שהדף הוא הפניה.\n;patrolled:מתייג עריכה בת־בדיקה בתור בדוקה או בלתי־בדוקה.\n;loginfo:הוספת מידע יומן (זהה יומן, סוג יומן וכו') לעיולי יומן.\n;tags:רשימת תגים עבור העיול.\n;sha1:הוספת סיכום־ביקורת תוכן לעיולים שמשויכים לגרסה.",
        "apihelp-query+recentchanges-param-limit": "כמה שינויים להחזיר בסך הכול.",
        "apihelp-query+recentchanges-param-type": "אילו סוגים של שינויים להציג.",
        "apihelp-query+recentchanges-param-toponly": "לרשום רק שינויים שהם הגרסה האחרונה.",
        "apihelp-query+revisions-param-startid": "מאיזה מזהה גרסה להתחיל למנות.",
        "apihelp-query+revisions-param-endid": "באיזה מזהה גרסה להפסיק את מניית הגרסאות.",
        "apihelp-query+revisions-param-start": "מאיזה חותם־זמן של גרסה להתחיל למנות.",
+       "apihelp-query+revisions-param-end": "למנות עד חותם־הזמן הזה.",
        "apihelp-query+revisions-param-tag": "לרשום רק גרסאות עם התג הזה.",
+       "apihelp-query+revisions+base-paramvalue-prop-timestamp": "חותם־הזמן של הגרסה.",
        "apihelp-query+revisions+base-param-limit": "הגבלת מספר הגרסאות שיוחזרו.",
        "apihelp-query+revisions+base-param-contentformat": "תסדיר ההסדרה שמשמש את <var>$1difftotext</var> וצפוי לפלט של תוכן.",
        "apihelp-query+search-description": "ביצוע חיפוש בכל הטקסט.",
        "apihelp-query+search-param-what": "איזה סוג חיפוש לבצע.",
        "apihelp-query+search-param-info": "אילו מטא־נתונים להחזיר.",
+       "apihelp-query+search-param-prop": "אילו מאפיינים להחזיר:\n;size:הוספת גודל הדף בבתים.\n;wordcount:הוספת מניין המילים של הדף.\n;timestamp:הוספת חותם־הזמן של העריכה האחרונה של הדף.\n;snippet:הוספת קטע קצר מפוענח מהדף.\n;titlesnippet:הוספת קטע קצר מפוענח משם הדף.\n;redirectsnippet:הוספת קטע קצר מפוענח משם ההפניה.\n;redirecttitle:הוספת שם ההפניה התואמת.\n;sectionsnippet:הוספת קטע קצר מפוענח של שם הפסקה התואמת.\n;sectiontitle:הוספת שם הפסקה התואמת.\n;categorysnippet:הוספת קטע קצר מפוענח של הקטגוריה התואמת.\n;isfilematch:הוספת בוליאני שמציין אם החיפוש תאם לתוכן של קובץ.\n;score:<span class=\"apihelp-deprecated\">מיושן וחסר־תוקן.</span>\n;hasrelated:<span class=\"apihelp-deprecated\">מיושן וחסר־תוקן.</span>",
        "apihelp-query+search-param-limit": "כמה דפים להחזיר בסך הכול.",
        "apihelp-query+siteinfo-param-inlanguagecode": "קוד שפה ששמות שפות מתורגמות (מאמץ טוב ביותר) ושמות עיצובים.",
        "apihelp-query+siteinfo-example-simple": "איזור מידע על האתר.",
        "apihelp-query+usercontribs-param-start": "באיזה חותם־הזמן להתחיל.",
        "apihelp-query+usercontribs-param-end": "באיזה חותם־הזמן לסיים",
        "apihelp-query+usercontribs-param-user": "עבור אילו משתמשים לאחזר תרומות.",
+       "apihelp-query+usercontribs-param-prop": "לכלול פריטי מידע נוספים:\n;ids:הוספת מזהה הדף ומזהה הגרסה.\n;title:הוספת השם ומזהה מרחב השם של הדף.\n;timestamp:הוספת חותם־הזמן של העריכה.\n;comment:הוספת ההערה על העריכה.\n;parsedcomment:הוספת ההערה המפוענחת של העריכה.\n;size:הוספת הגודל החדש של העריכה.\n;sizediff:הוספת ההפרש של העריכה אל מול ההורה שלה.\n;flags:הוספת הדגלים של העריכה.\n;patrolled:מתייג עריכות בדוקות.\n;tags:רשימת תגים עבור עריכות.",
        "apihelp-query+usercontribs-param-tag": "לרשום רק גרסאות עם התג הזה.",
        "apihelp-query+usercontribs-param-toponly": "לרשום רק שינויים שהם הגרסה האחרונה.",
        "apihelp-query+userinfo-param-prop": "אילו חלקי מידע לכלול:\n;blockinfo:מתייג אם המשתמש הנוכחי נחסם, על־ידי מי ומאיזו סיבה.\n;hasmsg:הוספת התג <samp>messages</samp> אם למשתמש הנוכחי יש הודעות ממתינות.\n;groups:רשימת כל הקבוצות שהמשתמש שייך אליהן.\n;implicitgroups:רשימת כל הקבוצות שהמשתמש שייך אליהן באופן אוטומטי.\n;rights:רשימת כל ההרשאות שיש למשתמש הזה.\n;changeablegroups:רשימת הקבוצות שהמשתמש הנוכחי יכול להוסיף אליהן ולגרוע מהן.\n;options:רשימת כל ההעדפות שהמשתמש הנוכחי הגדיר.\n;preferencestoken:<span class=\"apihelp-deprecated\">מיושן.</span> קבלת אסימון לשינוי ההעדפות של המשתמש הנוכחי.\n;editcount:הוספת מניין העריכות של המשתמש הנוכחי.\n;ratelimits:רשימת כל מגבלות הקצב שחלות על המשתמש הנוכחי.\n;realname:הוספת השם האמתי של המשתמש.\n;email:הוספת כתובת הדוא\"ל ותאריך אימות כתובת הדוא\"ל.\n;acceptlang:מדפיס את כותרת <code>Accept-Language</code> ששלח הלקוח בתסדיר מובנה.\n;registrationdate:הוספת תאריך הרישום של המשתמש.\n;unreadcount:הוספת מניין הדפים שלא נקראו ברשימת המעקב של המשתמש (לכל היותר $1; מחזיר <samp>$2</samp> אם יש יותר).",
+       "apihelp-query+users-param-prop": "אילו חלקי מידע לקבל:\n;blockinfo:מתייג אם המשתמש חסום, על־ידי מי, ומאיזו סיבה.\n;groups:רשימת כל הקבוצות שהמשתמש שייך אליהן.\n;implicitgroups:רשימת כל הקבוצות שהמשתמש חבר בהן אוטומטית.\n;rights:רשימת כל ההרשאות שיש למשתמש.\n;editcount:הוספת מניין העריכות של המשתמש.\n;registration:הוספת חותם־הזמן של רישום המשתמש.\n;emailable:מתייג אם המשתמש יכול ורוצה לקבל דואר אלקטרוני דרך [[Special:Emailuser]].\n;gender:מתייג את המגדר של המשתמש. מחזיר \"male\"‏, \"female\" או \"unknown\".",
        "apihelp-query+watchlist-param-start": "מאיזה חותם־זמן להתחיל למנות.",
        "apihelp-query+watchlist-param-end": "באיזה חותם זמן להפסיק לרשום.",
        "apihelp-query+watchlist-param-user": "לרשום רק שינויים של המשתמש הזה.",
        "apihelp-query+watchlist-param-excludeuser": "Don't list changes by this user",
        "apihelp-query+watchlist-param-limit": "כמה תוצאות סך הכול להחזיר בכל בקשה.",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "הוספת חותם־זמן של העריכה.",
+       "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "הוספת חותם־זמן של ההודעה האחרונה למשתמש על העריכה.",
        "apihelp-query+watchlistraw-param-limit": "כמה תוצאות סך הכול להחזיר בכל בקשה.",
+       "apihelp-query+watchlistraw-param-prop": "אילו מאפיינים נוספים לקבל:\n;changed:הוספת חותם־הזמן של ההודעה האחרונה למשתמש על העריכה.",
        "apihelp-query+watchlistraw-param-fromtitle": "מאיזו כותרת (עם תחילית מרחב שם) להתחיל את המנייה.",
        "apihelp-query+watchlistraw-param-totitle": "באיזו כותרת (עם תחילית מרחב שם) להפסיק למנות.",
        "apihelp-rollback-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
+       "apihelp-setnotificationtimestamp-description": "עדכון חותם־הזמן של ההודעה עבור דפים במעקב.\n\nזה משפיע על הדגשת הדפים שהשתנו ברשימת המעקב ובהיסטוריה, ושליחת דואר אלקטרוני כאשר ההעדפה \"לשלוח אליי דואר אלקטרוני כאשר נעשה שינוי בדף או בקובץ ברשימת המעקב שלי\" מופעלת.",
+       "apihelp-setnotificationtimestamp-param-timestamp": "חותם־הזמן להגדרת חותם־זמן של הודעה.",
+       "apihelp-setnotificationtimestamp-param-torevid": "לאיזו גרסה להגדיר את חותם הזמן (רק דף אחד).",
+       "apihelp-setnotificationtimestamp-param-newerthanrevid": "הגרסה שחותם־הזמן של ההודעה יוגדר בתור חדש ממנה (רק דף אחד).",
+       "apihelp-setnotificationtimestamp-example-pagetimestamp": "הגדרת חותם־הזמן להודעה ל־<kbd>Main page</kbd> כך שכל העריכות מאז 1 בינואר 2012 מוגדרות בתור כאלה שלא נצפו.",
        "apihelp-tag-param-reason": "סיבה לשינוי.",
        "apihelp-tokens-description": "קבלת אסימונים לפעולות שמשנות נתונים.\n\nהיחידה הזאת הוכרזה בתור מיושנת לטובת [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
+       "apihelp-undelete-description": "שחזור גרסאות של דף מחוק.\n\nאפשר לאחזר רשימת גרסאות מחוקות (כולל חותמי־זמן) דרך [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]], ואפשר לאחזר רשימת מזהי קבצים מחוקים דרך [[Special:ApiHelp/query+filearchive|list=filearchive]].",
        "apihelp-undelete-param-reason": "סיבה לשחזור.",
+       "apihelp-undelete-param-timestamps": "חותמי־זמן של הגרסה לשחזור. אם גם <var>$1timestamps</var> וגם <var>$1fileids</var> ריקים, הכול ישוחזר.",
        "apihelp-undelete-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
        "apihelp-upload-param-filename": "שם קובץ היעד.",
        "apihelp-upload-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
        "api-orm-param-props": "באילו שדות לעשות שאילתה.",
        "api-orm-param-limit": "מספר מרבי של שורות להחזיר.",
        "api-pageset-param-titles": "רשימת כותרות.",
-       "api-pageset-param-pageids": "רש×\99×\9eת ×\9e×\96×\94×\99 ×\93×£ ×\9c×¢×\95×\91ד עליהם.",
+       "api-pageset-param-pageids": "רש×\99×\9eת ×\9e×\96×\94×\99 ×\93×£ ×\9c×¢×\91×\95ד עליהם.",
        "api-pageset-param-revids": "רשימת מזהי גרסה לעבוד עליהם.",
        "api-pageset-param-generator": "קבלת רשימת דפים לעבוד עליהם על־ידי הרצת יחידת ה־query שצוינה.\n\n<strong>לתשומת לבך:</strong> לשמות בפרמטר generator צריכה להיות התחילית \"g\", ר' דוגמאות.",
        "api-pageset-param-redirects-generator": "פתרון אוטומטי של הפניות ב־<var>$1titles</var>, ב־<var>$1pageids</var>, וב־<var>$1revids</var>, ודפים שמחזיר <var>$1generator</var>.",
index 98975c9..426f580 100644 (file)
@@ -96,6 +96,7 @@
        "apihelp-query+watchlist-param-user": "Nëmmen Ännerunge vun dësem Benotzer opzielen.",
        "apihelp-query+watchlist-param-excludeuser": "Ännerunge vun dësem Benotzer net opzielen.",
        "apihelp-query+watchlist-paramvalue-prop-title": "Setzt den Titel vun der Säit derbäi.",
+       "apihelp-query+watchlist-paramvalue-prop-user": "Setzt de Benotzer derbäi deen d'Ännerung gemaach huet.",
        "apihelp-query+watchlistraw-param-show": "Nëmmen Elementer opzielen déi dëse Critèren entspriechen.",
        "apihelp-query+watchlistraw-example-simple": "Säite vum aktuelle Benotzer senger Iwwerwaachungslëscht opzielen",
        "apihelp-revisiondelete-description": "Versioune läschen a restauréieren.",
index 2b506d9..e295886 100644 (file)
        "apihelp-patrol-example-revid": "Sprawdź edycje.",
        "apihelp-protect-description": "Zmień poziom zabezpieczenia strony.",
        "apihelp-protect-param-reason": "Powód zabezpieczania/odbezpieczania.",
-       "apihelp-protect-param-cascade": "Włacz ochronę kaskadową (chronione są wszystkie strony zawarte w tej stronie). Ignorowane jeśli wszystkie poziomy ochrony nie wspierają kaskadowania.",
+       "apihelp-protect-param-cascade": "Włącz ochronę kaskadową (chronione są wszystkie osadzone szablony i obrazki na tej stronie). Ignorowane, jeśli żaden z danych poziomów ochrony nie wspiera kaskadowania.",
        "apihelp-protect-example-protect": "Zabezpiecz stronę",
        "apihelp-protect-example-unprotect": "Odbezpiecz stronę ustawiając ograniczenia na <kbd>wszystkie</kbd>.",
        "apihelp-protect-example-unprotect2": "Odbezpiecz stronę ustawiając brak ograniczeń.",
index db66d38..2accd1f 100644 (file)
@@ -7,7 +7,8 @@
                        "Kaganer",
                        "Mariya",
                        "Дмитрий",
-                       "WindEwriX"
+                       "WindEwriX",
+                       "Ochilov"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Документация]]\n* [[mw:API:FAQ|ЧаВО]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Почтовая рассылка]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Новости API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Ошибки и запросы]\n</div>\n<strong>Статус:</strong> Все отображаемые на этой странице функции должны работать, однако API находится в статусе активной разработки, и может измениться в любой момент. Подпишитесь на  [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ почтовую рассылку mediawiki-api-announce], чтобы быть в курсе обновлений.\n\n<strong>Ошибочные запросы:</strong> Если API получает запрос с ошибкой, вернётся заголовок HTTP с ключом \"MediaWiki-API-Error\", после чего значение заголовка и код ошибки будут отправлены обратно и установлены в то же значение. Более подробную информацию см. [[mw:API:Errors_and_warnings|API: Ошибки и предупреждения]].",
@@ -26,6 +27,7 @@
        "apihelp-block-param-anononly": "Блокировать только анонимных пользователей (т. е. запретить анонимные правки для этого IP-адреса).",
        "apihelp-block-param-nocreate": "Запретить создание учётных записей.",
        "apihelp-block-param-watchuser": "Следить за страницей пользователя или IP-участника и страницей обсуждения.",
+       "apihelp-checktoken-param-type": "Тип маркера проходит тестирование.",
        "apihelp-checktoken-param-token": "токен для проверки",
        "apihelp-checktoken-param-maxtokenage": "Максимально допустимый возраст токена (в секундах).",
        "apihelp-checktoken-example-simple": "Проверить годность <kbd>csrf</kbd>-токена.",
@@ -78,6 +80,8 @@
        "apihelp-emailuser-example-email": "Отправить письмо пользователю <kbd>WikiSysop</kbd> с текстом <kbd>контентом</kbd>.",
        "apihelp-expandtemplates-description": "Разворачивает все шаблоны в wikitext.",
        "apihelp-expandtemplates-param-title": "Заголовок страницы.",
+       "apihelp-expandtemplates-param-text": "Викитекст для конвертирования",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "Расширенный викитекст",
        "apihelp-expandtemplates-paramvalue-prop-parsetree": "Дерево разбора XML входных данных.",
        "apihelp-feedcontributions-param-year": "От года (и ранее).",
        "apihelp-feedcontributions-param-month": "От месяца (и ранее).",
index 528f0b6..b439fb0 100644 (file)
@@ -6,15 +6,98 @@
                        "Ahonc"
                ]
        },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Документація]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Список розсилки]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Оголошення API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Баґи і запити]\n</div>\n<strong>Статус:</strong> Усі функції, вказані на цій сторінці, мають працювати, але API далі перебуває в активній розробці і може змінитися у будь-який момент. Підпишіться на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ список розсилки mediawiki-api-announce], щоб помічати оновлення.\n\n<strong>Хибні запити:</strong> Коли до API надсилаються хибні запити, буде відіслано HTTP-шапку з ключем «MediaWiki-API-Error», а тоді і значення шапки, і код помилки, надіслані назад, будуть встановлені з тим же значенням. Більше інформації див. на [[mw:API:Errors_and_warnings|API: Errors and warnings]].",
        "apihelp-main-param-action": "Яку дію виконати.",
        "apihelp-main-param-format": "Формат виводу.",
+       "apihelp-main-param-maxlag": "Максимальна затримка може використовуватися, коли MediaWiki інстальовано на реплікований кластер бази даних. Щоб зберегти дії, які спричиняють більшу затримку реплікації, цей параметр може змусити клієнт почекати, поки затримка реплікації не буде меншою за вказане значення. У випадку непомірної затримки, видається код помилки <samp>maxlag</samp> з повідомленням на зразок <samp>Очікування на $host: $lag секунд(и) затримки</samp>.<br />Див. [[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]] для детальнішої інформації.",
+       "apihelp-main-param-smaxage": "Встановити <code>s-maxage</code> HTTP кеш-контроль заголовок на стільки секунд. Помилки ніколи не кешуються.",
+       "apihelp-main-param-maxage": "Встановити <code>max-age</code> HTTP кеш-контроль заголовок на стільки секунд. Помилки ніколи не кешуються.",
+       "apihelp-main-param-assert": "Перевірити, що користувач увійшов у систему, якщо задано <kbd>user</kbd>, або має права бота, якщо задано <kbd>bot</kbd>.",
+       "apihelp-main-param-requestid": "Будь-яке значення, вказане тут, буде включене у відповідь. Може використовуватися, щоб відрізняти запити.",
+       "apihelp-main-param-servedby": "Включити в результати ім'я хоста, який обробив запит.",
+       "apihelp-main-param-curtimestamp": "Включити в результат поточну мітку часу.",
+       "apihelp-main-param-origin": "При доступі до API з використанням крос-доменного AJAX-запиту (CORS), задайте параметру значення вихідного домена. Він має бути включений у будь-який попередній запит і таким чином мусить бути частиною запиту URI (не тіла POST). Він повинен точно співпадати з одним з виходів у заголовку <code>Origin</code>, тобто бути заданим чимось на зразок <kbd>https://uk.wikipedia.org</kbd> або <kbd>https://meta.wikimedia.org</kbd>. Якщо цей параметр не співпадає з заголовком <code>Origin</code>, повернеться помилка 403. Якщо цей параметр співпадає з заголовком <code>Origin</code> і вихід знаходиться у білому списку, буде встановлено заголовок <code>Access-Control-Allow-Origin</code>.",
+       "apihelp-main-param-uselang": "Мова, що використовується для перекладу повідомлень. Список кодів можна знайти на <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> з <kbd>siprop=languages</kbd> або вказати <kbd>user</kbd> на використання поточного налаштування мови користувача, або вказати <kbd>content</kbd> на використання мови вмісту цієї вікі.",
        "apihelp-block-description": "Заблокувати користувача.",
        "apihelp-block-param-user": "Ім'я користувача, IP-адреса або діапазон IP-адрес для блокування.",
+       "apihelp-block-param-expiry": "Закінчення часу. Може бути відносним (напр., <kbd>5 місяців</kbd> або <kbd>2 тижні</kbd>) чи абсолютним (напр., <kbd>2014-09-18T12:34:56Z</kbd>). Якщо вказано <kbd>infinite</kbd>, <kbd>indefinite</kbd> або <kbd>never</kbd>, блокування не закінчиться ніколи.",
        "apihelp-block-param-reason": "Причина блокування.",
+       "apihelp-block-param-anononly": "Блокувати тільки анонімних користувачів (тобто відключити можливість анонімних редагувань з цієї IP-адреси).",
        "apihelp-block-param-nocreate": "Заборонити створення облікових записів.",
+       "apihelp-block-param-autoblock": "Автоматично блокувати IP-адреси, які цей користувач використовував останніми, та будь-які наступні адреси, з яких він спробує зайти в систему.",
+       "apihelp-block-param-noemail": "Заборонити користувачеві надсилати електронні листи через вікі. (Вимагає права <code>blockemail</code>).",
+       "apihelp-block-param-hidename": "Приховати ім'я користувача з журналу блокувань. (Вимагає права <code>hideuser</code>).",
+       "apihelp-block-param-allowusertalk": "Дозволити користувачу редагувати власну сторінку обговорення (залежить від <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-reblock": "Якщо користувач уже заблокований, переписати наявне блокування.",
+       "apihelp-block-param-watchuser": "Спостерігати за сторінкою користувача чи IP-адреси і сторінкою обговорення.",
+       "apihelp-block-example-ip-simple": "Блокувати IP-адресу <kbd>192.0.2.5</kbd> на три дні з причиною <kbd>First strike</kbd>.",
+       "apihelp-block-example-user-complex": "Блокувати користувача<kbd>Vandal</kbd> на невизначений термін з причиною <kbd>Vandalism</kbd> і заборонити створення нових облікових записів та надсилання електронної пошти.",
+       "apihelp-checktoken-description": "Перевірити коректність токена з <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
+       "apihelp-checktoken-param-type": "Тип токена, який тестується.",
+       "apihelp-checktoken-param-token": "Токен для тесту.",
+       "apihelp-checktoken-param-maxtokenage": "Максимально допустимий вік токена (у секундах).",
+       "apihelp-checktoken-example-simple": "Перевірити дійсність токена <kbd>csrf</kbd>.",
+       "apihelp-clearhasmsg-description": "Очищає прапорець <code>hasmsg</code> для поточного користувача.",
+       "apihelp-clearhasmsg-example-1": "Очистити прапорець <code>hasmsg</code> для поточного користувача.",
+       "apihelp-compare-description": "Отримати порівняння двох сторінок.\n\nПовинні бути номер версії, назва сторінки або ID сторінки для «від» і «до».",
+       "apihelp-compare-param-fromtitle": "Перший заголовок для порівняння.",
+       "apihelp-compare-param-fromid": "Перший ID сторінки для порівняння.",
+       "apihelp-compare-param-fromrev": "Перша версія для порівняння.",
+       "apihelp-compare-param-totitle": "Другий заголовок для порівняння.",
+       "apihelp-compare-param-toid": "Другий ID сторінки для порівняння.",
+       "apihelp-compare-param-torev": "Друга версія для порівняння.",
+       "apihelp-compare-example-1": "Створити порівняння версій 1 і 2.",
+       "apihelp-createaccount-description": "Створити новий обліковий запис користувача.",
        "apihelp-createaccount-param-name": "Ім'я користувача.",
        "apihelp-createaccount-param-password": "Пароль (ігнорується, якщо встановлено <var>$1mailpassword</var>).",
        "apihelp-createaccount-param-domain": "Домен для зовнішньої аутентифікації (опціонально).",
+       "apihelp-createaccount-param-token": "Токен створення облікового запису отримано у першому запиті.",
+       "apihelp-createaccount-param-email": "Адреса електронної пошти користувача (необов'язково).",
+       "apihelp-createaccount-param-realname": "Справжнє ім'я користувача (необов'язково).",
+       "apihelp-createaccount-param-mailpassword": "Якщо встановлено будь-яке значення, користувачеві буде надіслано випадковий пароль.",
+       "apihelp-createaccount-param-reason": "Необов'язкова причина для створення облікового запису, яка буде записана в журнал.",
+       "apihelp-createaccount-param-language": "Код мови для встановлення за замовчуванням для користувача (необов'язково, за замовчуванням — мова вмісту).",
+       "apihelp-createaccount-example-pass": "Створити користувача <kbd>testuser</kbd> з паролем <kbd>test123</kbd>.",
+       "apihelp-createaccount-example-mail": "Створити користувача <kbd>testmailuser</kbd> і надіслати на електронну пошту випадково-згенерований пароль.",
+       "apihelp-delete-description": "Вилучити сторінку.",
+       "apihelp-delete-param-title": "Назва сторінки для вилучення. Не можна використати разом з <var>$1pageid</var>.",
+       "apihelp-delete-param-pageid": "ID-сторінки на вилучення. Не можна використати разом з <var>$1title</var>.",
+       "apihelp-delete-param-reason": "Причина вилучення. Якщо не вказана, буде використано автоматично-згенеровану.",
+       "apihelp-delete-param-watch": "Додати сторінку у список спостереження поточного користувача.",
+       "apihelp-delete-param-watchlist": "Беззастережно додати або вилучити сторінку зі списку спостереження поточного користувача, використати налаштування або не змінювати спостереження.",
+       "apihelp-delete-param-unwatch": "Вилучити сторінку зі списку спостереження поточного користувача.",
+       "apihelp-delete-param-oldimage": "Назва старого зображення на вилучення, як вказано у [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
+       "apihelp-delete-example-simple": "Вилучити <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Вилучити <kbd>Main Page</kbd> з причиною <kbd>Preparing for move</kbd>.",
+       "apihelp-disabled-description": "Цей модуль було вимкнено.",
+       "apihelp-edit-description": "Створювати і редагувати сторінки.",
+       "apihelp-edit-param-title": "Назва сторінки для редагування. Не можна використати разом з <var>$1pageid</var>.",
+       "apihelp-edit-param-pageid": "ID-сторінки для редагування. Не можна використати разом з <var>$1title</var>.",
+       "apihelp-edit-param-section": "Номер розділу. <kbd>0</kbd> для вступного розділу, <kbd>new</kbd> для нового розділу.",
+       "apihelp-edit-param-sectiontitle": "Назва нового розділу.",
+       "apihelp-edit-param-text": "Вміст сторінки.",
+       "apihelp-edit-param-summary": "Опис редагування. Також заголовок розділу, коли $1section=new і коли $1sectiontitle не вказано.",
+       "apihelp-edit-param-tags": "Змінити теги для версії.",
+       "apihelp-edit-param-minor": "Незначне редагування.",
+       "apihelp-edit-param-notminor": "Не «незначне» редагування.",
+       "apihelp-edit-param-bot": "Помітити редагування як зроблене ботом.",
+       "apihelp-edit-param-basetimestamp": "Мітка часу для основної версії, використовується для виявлення конфлікту редагувань. Може бути отримана через [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
+       "apihelp-edit-param-starttimestamp": "Мітка часу, з якого почався процес редагування, використовується для виявлення конфліктів редагувань. Відповідне значення можна отримати з допомогою <var>[[Special:ApiHelp/main|curtimestamp]]</var> на початку процесу редагування (напр., коли завантажується вміст сторінки для редагування).",
+       "apihelp-edit-param-recreate": "Відкинути будь-які помилки щодо цієї сторінки, вилучені нещодавно.",
+       "apihelp-edit-param-createonly": "Не редагувати сторінку, якщо вона вже існує.",
+       "apihelp-edit-param-nocreate": "Видати помилку, якщо сторінка не існує.",
+       "apihelp-edit-param-watch": "Додати сторінку у список спостереження поточного користувача.",
+       "apihelp-edit-param-unwatch": "Вилучити сторінку зі списку спостереження поточного користувача.",
+       "apihelp-edit-param-watchlist": "Беззастережно додати або вилучити сторінку зі списку спостереження поточного користувача, використати налаштування або не змінювати спостереження.",
+       "apihelp-edit-param-md5": "MD5-хеш у параметрі $1text або параметрах $1prependtext і $1appendtext разом. Якщо вказано, редагування буде зроблене, лише якщо хеш правильний.",
+       "apihelp-edit-param-prependtext": "Додати цей текст на початок сторінки. Замінює $1text.",
+       "apihelp-edit-param-appendtext": "Додати цей текст у кінець сторінки. Замінює $1text.\n\nЩоб додати новий розділ, замість цього параметра використайте $1section=new.",
+       "apihelp-edit-param-undo": "Скасувати цю версію. Замінює $1text, $1prependtext та $1appendtext.",
+       "apihelp-edit-param-undoafter": "Скасувати усі версії від $1undo до цієї. Якщо не вказано, просто скасувати одну версію.",
+       "apihelp-edit-param-redirect": "Автоматично виправляти перенаправлення.",
+       "apihelp-edit-param-contentformat": "Формат серіалізації вмісту, використовуваний для введеного тексту.",
+       "apihelp-edit-param-contentmodel": "Модель вмісту нового вмісту.",
+       "apihelp-edit-param-token": "Токен завжди має надсилатися як останній параметр або хоча б після параметра $1text.",
        "apihelp-edit-example-edit": "Редагувати сторінку",
        "apihelp-edit-example-prepend": "Додати зміст на початок сторінки",
        "apihelp-edit-example-undo": "Скасувати версії з 13579 по 13585 з автоматичним описом змін",
        "apihelp-emailuser-param-subject": "Заголовок теми.",
        "apihelp-emailuser-param-text": "Тіло листа.",
        "apihelp-emailuser-param-ccme": "Надіслати копію цього повідомлення мені.",
-       "apihelp-emailuser-example-email": "Відправити листа користувачу \"WikiSysop\" з текстом \"Вміст\"",
+       "apihelp-emailuser-example-email": "Відправити листа користувачу <kbd>WikiSysop</kbd> з текстом <kbd>Вміст</kbd>.",
        "apihelp-expandtemplates-description": "Розгортає усі шаблони у вікітекст.",
        "apihelp-expandtemplates-param-title": "Заголовок сторінки.",
        "apihelp-expandtemplates-param-text": "Вікітекст для перетворення.",
+       "apihelp-expandtemplates-param-revid": "ID версії, для <nowiki>{{REVISIONID}}</nowiki> і подібних змінних.",
+       "apihelp-expandtemplates-param-prop": "Яку інформацію отримувати.\n\nЗважте, що якщо не вибрано значень, результат міститиме вікітекст, але буде в застарілому форматі.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "Розгорнений вікітекст.",
+       "apihelp-expandtemplates-paramvalue-prop-categories": "Будь-які категорії, наявні у джерелі, але не виведені у вікітексті результату.",
+       "apihelp-expandtemplates-paramvalue-prop-properties": "Властивості сторінки, визначені розгорненими магічними словами у вікітексті.",
+       "apihelp-expandtemplates-paramvalue-prop-volatile": "Чи результат тривкий і не повинен повторно використовуватись десь іще на сторінці.",
+       "apihelp-expandtemplates-paramvalue-prop-ttl": "Максимальний час, після якого кеш результату стане недійсним.",
+       "apihelp-expandtemplates-paramvalue-prop-modules": "Будь-які модулі ResourceLoader, які парсерні функції запитують на додання у результат. Або <kbd>jsconfigvars</kbd>, або <kbd>encodedjsconfigvars</kbd> має бути запитано разом з <kbd>modules</kbd>.",
+       "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Дає конфігурації JavaScript змінні, притаманні для сторінки.",
+       "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Дає конфігурації JavaScript змінні, притаманні для сторінки, як рядок JSON.",
+       "apihelp-expandtemplates-paramvalue-prop-parsetree": "Дерево парсу XML вхідних даних.",
+       "apihelp-expandtemplates-param-includecomments": "Чи включати HTML-коментарі у результат.",
+       "apihelp-expandtemplates-param-generatexml": "Дерево парсу XML вхідних даних (замінене на $1prop=parsetree).",
+       "apihelp-expandtemplates-example-simple": "Розгорнути вікітекст <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>.",
+       "apihelp-feedcontributions-description": "Повертає стрічку внеску користувача.",
+       "apihelp-feedcontributions-param-feedformat": "Формат стрічки.",
+       "apihelp-feedcontributions-param-user": "Для яких користувачів отримати внесок.",
+       "apihelp-feedcontributions-param-namespace": "За яким простором назв фільтрувати внески.",
+       "apihelp-feedcontributions-param-year": "Від року (і раніше).",
+       "apihelp-feedcontributions-param-month": "До місяця (і раніше).",
+       "apihelp-feedcontributions-param-tagfilter": "Відфільтрувати внесок, у якого є ці теґи.",
+       "apihelp-feedcontributions-param-deletedonly": "Показати лише вилучений внесок.",
+       "apihelp-feedcontributions-param-toponly": "Показати лише редагування, які є останніми версіями.",
+       "apihelp-feedcontributions-param-newonly": "Показати лише редагування, які є створеннями сторінок.",
+       "apihelp-feedcontributions-param-showsizediff": "Показати різницю розміру між версіями.",
+       "apihelp-feedcontributions-example-simple": "Вивести внесок для користувача <kbd>Example</kbd>.",
+       "apihelp-feedrecentchanges-description": "Видає стрічку нових редагувань.",
+       "apihelp-feedrecentchanges-param-feedformat": "Формат стрічки.",
+       "apihelp-feedrecentchanges-param-namespace": "Простір назв, до якого обмежити результати.",
+       "apihelp-feedrecentchanges-param-invert": "Усі простори назв, крім вибраного.",
+       "apihelp-feedrecentchanges-param-associated": "Включно з пов'язаним (обговорення чи головним) простором назв.",
+       "apihelp-feedrecentchanges-param-days": "Дні, до яких обмежити результати.",
+       "apihelp-feedrecentchanges-param-limit": "Максимальна кількість результатів для виведення.",
+       "apihelp-feedrecentchanges-param-from": "Показати зміни відтоді.",
+       "apihelp-feedrecentchanges-param-hideminor": "Приховати незначні редагування.",
+       "apihelp-feedrecentchanges-param-hidebots": "Приховати редагування ботів.",
+       "apihelp-feedrecentchanges-param-hideanons": "Приховати редагування анонімних користувачів.",
+       "apihelp-feedrecentchanges-param-hideliu": "Приховати редагування зареєстрованих користувачів.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Приховати відпатрульовані редагування.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Приховати редагування поточного користувача.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Фільтрувати за теґом.",
+       "apihelp-feedrecentchanges-param-target": "Показати лише зміни на сторінках, на які посилається ця сторінка.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Показати натомість лише зміни на сторінках, які посилаються на цю сторінку.",
+       "apihelp-feedrecentchanges-example-simple": "Показати нещодавні зміни.",
+       "apihelp-feedrecentchanges-example-30days": "Показати нещодавні зміни за 30 днів.",
+       "apihelp-feedwatchlist-description": "Видає стрічку списку спостереження.",
+       "apihelp-feedwatchlist-param-feedformat": "Формат стрічки.",
+       "apihelp-feedwatchlist-param-hours": "Список сторінок, змінених за цю кількість годин від зараз.",
+       "apihelp-feedwatchlist-param-linktosections": "За можливості, посилатися безпосередньо на змінені розділи.",
+       "apihelp-feedwatchlist-example-default": "Показати стрічку списку спостереження.",
+       "apihelp-filerevert-param-filename": "Цільова назва файлу, без префіксу File:.",
+       "apihelp-filerevert-param-comment": "Завантажити коментар.",
+       "apihelp-filerevert-param-archivename": "Архівна назва версії, до якої повернути.",
+       "apihelp-filerevert-example-revert": "Повернути <kbd>Wiki.png</kbd> до версії <kbd>2011-03-05T15:27:40Z</kbd>.",
+       "apihelp-help-description": "Відображати довідку для зазначених модулів.",
+       "apihelp-help-param-modules": "Модулі, для яких відображати довідку (значення параметрів <var>action</var> і <var>format</var> або <kbd>main</kbd>). Можна вказати під модулі через <kbd>+</kbd>.",
+       "apihelp-help-param-recursivesubmodules": "Включити довідку для підмодулів рекурсивно.",
+       "apihelp-help-param-helpformat": "Формат результату довідки.",
+       "apihelp-help-param-wrap": "Помістити результат у стандартну структуру API-відповіді.",
+       "apihelp-help-param-toc": "Включити зміст у HTML-результат.",
+       "apihelp-help-example-main": "Довідка для головного модуля.",
+       "apihelp-help-example-recursive": "Уся довідка на одній сторінці.",
+       "apihelp-help-example-help": "Довідка для самого модуля довідки.",
+       "apihelp-help-example-query": "Довідка для двох підмодулів запитів.",
+       "apihelp-imagerotate-description": "Поворот одного або декількох зображень.",
+       "apihelp-imagerotate-param-rotation": "Градуси для повороту зображення за годинниковою стрілкою.",
+       "apihelp-imagerotate-example-simple": "Повернути <kbd>File:Example.png</kbd> на <kbd>90</kbd> градусів.",
+       "apihelp-imagerotate-example-generator": "Повернути усі зображення у <kbd>Category:Flip</kbd> на <kbd>180</kbd> градусів.",
+       "apihelp-import-description": "Імпортувати сторінку з іншої вікі або з XML-файлу.\n\nЗважте, що HTTP POST має бути виконано як завантаження файлу (тобто з використанням даних різних частин/форм) під час надсилання файлу для параметра <var>xml</var>.",
+       "apihelp-import-param-summary": "Імпортувати підсумок.",
+       "apihelp-import-param-xml": "Завантажено XML-файл.",
+       "apihelp-import-param-interwikisource": "Для інтервікі-імпорту: вікі, з якої імпортувати.",
+       "apihelp-import-param-interwikipage": "Для інтервікі-імпорту: сторінки для імпорту.",
+       "apihelp-import-param-fullhistory": "Для інтервікі-імпорту: імпортувати повну історію, не лише поточну версію.",
+       "apihelp-import-param-templates": "Для інтервікі-імпорту: імпортувати також усі включені шаблони.",
+       "apihelp-import-param-namespace": "Імпортувати у цей простір назв. Не можна використати разом з <var>$1rootpage</var>.",
+       "apihelp-import-param-rootpage": "Імпортувати як підсторінку цієї сторінки. Не можна використати разом з <var>$1namespace</var>.",
+       "apihelp-import-example-import": "Імпортувати [[meta:Help:ParserFunctions]] у простір назв 100 з повною історією.",
+       "apihelp-login-description": "Увійти в систему й отримати куки автентифікації.\n\nУ випадку успішного входження в систему, потрібні куки буде включено в заголовки HTTP-відповіді. У разі невдалого входу, подальші спроби будуть обмежені до ліміту автоматичних спроб підбирання пароля.",
+       "apihelp-login-param-name": "Ім'я користувача.",
+       "apihelp-login-param-password": "Пароль.",
+       "apihelp-login-param-domain": "Домен (необов'язково).",
+       "apihelp-login-param-token": "Токен входу в систему, отриманий у першому запиті.",
+       "apihelp-login-example-gettoken": "Отримати токен входу в систему.",
+       "apihelp-login-example-login": "Увійти в систему.",
+       "apihelp-logout-description": "Вийти й очистити дані сесії.",
+       "apihelp-logout-example-logout": "Вийти з поточного облікового запису.",
+       "apihelp-managetags-description": "Виконати керівні завдання щодо зміни теґів.",
        "apihelp-move-param-ignorewarnings": "Ігнорувати всі попередження",
        "api-help-datatypes-header": "Типи даних"
 }
index 8c9f8c8..64bea5b 100644 (file)
        "apihelp-delete-description": "Xóa trang.",
        "apihelp-delete-param-title": "Xóa tiêu đề của trang. Không thể sử dụng cùng với <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "Xóa ID của trang. Không thể sử dụng cùng với <var>$1title</var>.",
-       "apihelp-delete-param-watch": "Thêm trang vào danh sách theo dõi của bạn.",
-       "apihelp-delete-param-unwatch": "Bỏ trang này khỏi danh sách theo dõi của bạn.",
-       "apihelp-delete-example-simple": "Xóa Trang Chính",
-       "apihelp-delete-example-reason": "Xóa Trang Chính với lý do “Chuẩn bị di chuyển”",
+       "apihelp-delete-param-watch": "Thêm trang vào danh sách theo dõi của người dùng hiện tại.",
+       "apihelp-delete-param-unwatch": "Bỏ trang này khỏi danh sách theo dõi của người dùng hiện tại.",
+       "apihelp-delete-example-simple": "Xóa <kbd>Trang Chính</kbd>.",
+       "apihelp-delete-example-reason": "Xóa <kbd>Trang Chính</kbd> với lý do <kbd>Chuẩn bị di chuyển</kbd>.",
        "apihelp-disabled-description": "Mô đun này đã bị vô hiệu hóa.",
        "apihelp-edit-description": "Tạo và sửa trang.",
-       "apihelp-edit-param-section": "Số phần trang. 0 là phần đầu; “new” là phần mới.",
+       "apihelp-edit-param-section": "Số phần trang. <kbd>0</kbd> là phần đầu; <kbd>new</kbd> là phần mới.",
        "apihelp-edit-param-sectiontitle": "Tên của phần mới.",
        "apihelp-edit-param-text": "Nội dung trang.",
        "apihelp-edit-param-summary": "Tóm lược sửa đổi. Cũng là tên phần khi $1section=new và $1sectiontitle không được đặt.",
@@ -53,8 +53,8 @@
        "apihelp-edit-param-bot": "Đánh dấu sửa đổi này là do bot thực hiện.",
        "apihelp-edit-param-createonly": "Không sửa đổi trang nếu nó đã tồn tại.",
        "apihelp-edit-param-nocreate": "Gây lỗi nếu trang không tồn tại.",
-       "apihelp-edit-param-watch": "Thêm trang vào danh sách theo dõi của bạn.",
-       "apihelp-edit-param-unwatch": "Bỏ trang này khỏi danh sách theo dõi của bạn.",
+       "apihelp-edit-param-watch": "Thêm trang vào danh sách theo dõi của người dùng hiện tại.",
+       "apihelp-edit-param-unwatch": "Bỏ trang này khỏi danh sách theo dõi của người dùng hiện tại.",
        "apihelp-edit-param-undo": "Hoàn tác sửa đổi này. Ghi đè $1text, $1prependtext và $ 1appendtext.",
        "apihelp-edit-param-undoafter": "Hoàn tác tất cả các sửa đổi từ $1undo cho tới sửa đổi này. Nếu không được thiết lập, chỉ cần lùi lại một sửa đổi.",
        "apihelp-edit-example-edit": "Sửa đổi trang",
@@ -65,7 +65,7 @@
        "apihelp-emailuser-param-subject": "Tiêu đề bức thư.",
        "apihelp-emailuser-param-text": "Nội dung bức thư.",
        "apihelp-emailuser-param-ccme": "Gửi bản sao của thư này cho tôi.",
-       "apihelp-emailuser-example-email": "Gửi thư điện tử cho thành viên “BQVWiki” với văn bản “Nội dung”",
+       "apihelp-emailuser-example-email": "Gửi thư điện tử cho thành viên <kbd>BQVWiki</kbd> với văn bản <kbd>Nội dung</kbd>.",
        "apihelp-expandtemplates-description": "Bung tất cả bản mẫu trong văn bản wiki.",
        "apihelp-expandtemplates-param-title": "Tên trang.",
        "apihelp-expandtemplates-param-text": "Văn bản wiki để bung.",
@@ -79,8 +79,8 @@
        "apihelp-help-example-query": "Trợ giúp cho hai module con truy vấn",
        "apihelp-imagerotate-description": "Xoay một hoặc nhiều hình ảnh.",
        "apihelp-imagerotate-param-rotation": "Độ xoay hình ảnh theo chiều kim đồng hồ.",
-       "apihelp-imagerotate-example-simple": "Xoay [[:Tập tin:Ví dụ.jpg]] 90 độ",
-       "apihelp-imagerotate-example-generator": "Xoay tất cả các hình ảnh trong [[:Thể loại:Búng]] 180 độ",
+       "apihelp-imagerotate-example-simple": "Xoay <kbd>Tập tin:Ví dụ.jpg</kbd> <kbd>90</kbd> độ.",
+       "apihelp-imagerotate-example-generator": "Xoay tất cả các hình ảnh trong <kbd>Thể loại:Búng</kbd> <kbd>180</kbd> độ.",
        "apihelp-login-param-name": "Tên người dùng.",
        "apihelp-login-param-password": "Mật khẩu.",
        "apihelp-login-param-domain": "Tên miền (tùy chọn).",
@@ -89,7 +89,7 @@
        "apihelp-login-example-login": "Đăng nhập",
        "apihelp-logout-example-logout": "Đăng xuất người dùng hiện tại",
        "apihelp-move-description": "Di chuyển trang.",
-       "apihelp-move-param-reason": "Lý do di chuyển.",
+       "apihelp-move-param-reason": "Lý do đổi tên.",
        "apihelp-move-param-noredirect": "Không tạo trang đổi hướng.",
        "apihelp-move-param-ignorewarnings": "Bỏ qua tất cả các cảnh báo.",
        "apihelp-opensearch-description": "Tìm kiếm trong wiki qua giao thức OpenSearch.",
        "apihelp-opensearch-param-limit": "Đa số kết quả để cho ra.",
        "apihelp-opensearch-param-namespace": "Không gian tên để tìm kiếm.",
        "apihelp-opensearch-param-format": "Định dạng kết quả được cho ra.",
-       "apihelp-opensearch-example-te": "Tìm trang bắt đầu với “Te”",
+       "apihelp-opensearch-example-te": "Tìm trang bắt đầu với <kbd>Te</kbd>.",
        "apihelp-options-example-reset": "Mặc định lại các tùy chọn",
        "apihelp-paraminfo-param-helpformat": "Định dạng chuỗi trợ giúp.",
        "apihelp-parse-param-summary": "Lời tóm lược để phân tích.",
-       "apihelp-parse-param-section": "Chỉ truy xuất nội dung của số bộ phận này.",
-       "apihelp-parse-param-disablepp": "Vô hiệu hóa phân tích cú pháp đầu ra của Báo cáo PP .",
+       "apihelp-parse-param-section": "Chỉ truy xuất nội dung của số phần này; nếu có <kbd>new</kbd> thì tạo phần mới.\n\nPhần <kbd>new</kbd> chỉ được chấp nhận khi định rõ <var>text</var>.",
+       "apihelp-parse-param-disablepp": "Bỏ qua thông báo bộ tiền xử lý (“NewPP limit report”) khi cho ra kết quả bộ xử lý.",
        "apihelp-parse-example-page": "Phân tích trang.",
        "apihelp-parse-example-text": "Phân tích văn bản wiki.",
        "apihelp-parse-example-texttitle": "Phân tích văn bản wiki theo tên trang.",
        "apihelp-parse-example-summary": "Phân tích lời tóm lược.",
        "apihelp-protect-example-protect": "Khóa trang.",
-       "apihelp-protect-example-unprotect": "Mở khóa trang bằng cách đặt hạn chế thành “all”",
+       "apihelp-protect-example-unprotect": "Mở khóa trang bằng cách đặt hạn chế thành <kbd>all</kbd>.",
        "apihelp-protect-example-unprotect2": "Mở khóa trang bằng cách không đặt hạn chế nào",
        "apihelp-purge-param-forcelinkupdate": "Cập nhật các bảng liên kết.",
        "apihelp-purge-example-generator": "Làm mới 10 trang đầu tiên trong không gian tên chính",
        "apihelp-query-param-meta": "Siêu dữ liệu để lấy.",
        "apihelp-query+allcategories-param-dir": "Hướng xếp loại.",
        "apihelp-rollback-description": "Hoàn tác chỉnh sửa cuối cùng của trang này.\n\nNếu người dùng cuối cùng đã cỉnh sửa trang này nhiều lần, tất cả chúng sẽ được hoàn tác lại như ban đầu.",
-       "apihelp-format-example-generic": "Định dạng kết quả truy vấn dưới dạng $1",
-       "apihelp-dbg-description": "Cho ra dữ liệu dưới dạng var_export() của PHP.",
-       "apihelp-dbgfm-description": "Cho ra dữ liệu dưới dạng var_export() của PHP (định dạng bằng HTML).",
+       "apihelp-format-example-generic": "Cho ra kết quả truy vấn dưới dạng $1.",
+       "apihelp-dbg-description": "Cho ra dữ liệu dưới dạng <code>var_export()</code> của PHP.",
+       "apihelp-dbgfm-description": "Cho ra dữ liệu dưới dạng <code>var_export()</code> của PHP (định dạng bằng HTML).",
        "apihelp-json-description": "Cho ra dữ liệu dưới dạng JSON.",
        "apihelp-jsonfm-description": "Cho ra dữ liệu dưới dạng JSON (định dạng bằng HTML).",
        "apihelp-none-description": "Không cho ra gì.",
        "apihelp-rawfm-description": "Cho ra dữ liệu với các phần tử gỡ lỗi dưới dạng JSON (định dạng bằng HTML).",
-       "apihelp-txt-description": "Cho ra dữ liệu dưới dạng print_r() của PHP.",
-       "apihelp-txtfm-description": "Cho ra dữ liệu dưới dạng print_r() của PHP (định dạng bằng HTML).",
+       "apihelp-txt-description": "Cho ra dữ liệu dưới dạng <code>print_r()</code> của PHP.",
+       "apihelp-txtfm-description": "Cho ra dữ liệu dưới dạng <code>print_r()</code> của PHP (định dạng bằng HTML).",
        "apihelp-xml-description": "Cho ra dữ liệu dưới dạng XML.",
        "apihelp-xmlfm-description": "Cho ra dữ liệu dưới dạng XML (định dạng bằng HTML).",
        "apihelp-yaml-description": "Cho ra dữ liệu dưới dạng YAML.",
        "api-help-parameters": "{{PLURAL:$1|Tham số|Các tham số}}:",
        "api-help-param-deprecated": "Bị phản đối.",
        "api-help-param-required": "Tham số này là bắt buộc.",
-       "api-help-param-list": "{{PLURAL:$1|1=Một giá trị|2=Các giá trị (phân tách bằng “{{!}}”)}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=Một giá trị|2=Các giá trị (phân tách bằng <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Cần phải để trống|Cần phải để trống hoặc là $2}}",
        "api-help-param-limit": "Không cho phép hơn $1.",
        "api-help-param-limit2": "Không cho phép hơn $1 ($2 đối với các bot).",
-       "api-help-param-multi-separate": "Phân tách các giá trị bằng “|”.",
+       "api-help-param-multi-separate": "Phân tách các giá trị bằng <kbd>|</kbd>.",
        "api-help-param-default": "Mặc định: $1",
        "api-help-param-default-empty": "Mặc định: <span class=\"apihelp-empty\">(trống)</span>",
        "api-help-examples": "{{PLURAL:$1|Ví dụ|Các ví dụ}}:",
index c75658c..e2d05e0 100644 (file)
        "apihelp-query-param-prop": "要为已查询页面获取的属性。",
        "apihelp-query-param-list": "要获取的列表。",
        "apihelp-query-param-meta": "要获取的元数据。",
+       "apihelp-query-param-indexpageids": "包含一个额外的pageid段落,列举所有返回的页面ID。",
+       "apihelp-query-param-export": "导出所有指定或生成页面的当前修订。",
        "apihelp-query-param-exportnowrap": "返回导出XML,不需要将其包裹在一个XML结果中(与[[Special:Export]]格式相同)。只能与$1export一起使用。",
+       "apihelp-query-param-iwurl": "如果标题是一个跨wiki链接的话,是否获取完整URL。",
        "apihelp-query-param-rawcontinue": "为继续返回原始<samp>query-continue</samp>数据。",
        "apihelp-query-example-revisions": "获取<kbd>Main Page</kbd>的[[Special:ApiHelp/query+siteinfo|网站信息]]和[[Special:ApiHelp/query+revisions|修订版本]]。",
        "apihelp-query-example-allpages": "获取以<kbd>API/</kbd>开头的页面的修订版本。",
-       "apihelp-query+allcategories-description": "枚举所有类别。",
+       "apihelp-query+allcategories-description": "列举所有分类。",
        "apihelp-query+allcategories-param-from": "要作为枚举起始点的类别。",
        "apihelp-query+allcategories-param-to": "要作为枚举终止点的类别。",
-       "apihelp-query+allcategories-param-prefix": "æ\90\9c索此å\80¼å¼\80头ç\9a\84æ\89\80æ\9c\89分类标题。",
+       "apihelp-query+allcategories-param-prefix": "æ\90\9cç´¢æ\89\80æ\9c\89以此å\80¼å¼\80头ç\9a\84分类标题。",
        "apihelp-query+allcategories-param-dir": "排序方向。",
        "apihelp-query+allcategories-param-min": "只返回至少带这么多成员的分类。",
        "apihelp-query+allcategories-param-max": "只返回最多带这么多成员的分类。",
        "apihelp-query+alldeletedrevisions-param-end": "枚举的结束时间戳。",
        "apihelp-query+alldeletedrevisions-param-from": "从此标题开始列出。",
        "apihelp-query+alldeletedrevisions-param-to": "列出至此标题为止。",
-       "apihelp-query+alldeletedrevisions-param-prefix": "æ\90\9cç´¢æ \87é¢\98以此å\80¼å¼\80头ç\9a\84æ\89\80æ\9c\89页é\9d¢。",
+       "apihelp-query+alldeletedrevisions-param-prefix": "æ\90\9cç´¢æ\89\80æ\9c\89以此å\80¼å¼\80头ç\9a\84页é\9d¢æ \87é¢\98。",
        "apihelp-query+alldeletedrevisions-param-tag": "只列出被此标签标记的修订。",
        "apihelp-query+alldeletedrevisions-param-user": "只列出此用户做出的修订。",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "不要列出此用户做出的修订。",
        "apihelp-query+allfileusages-description": "列出所有文件用途,包括不存在的。",
        "apihelp-query+allfileusages-param-from": "要列举的起始文件标题。",
        "apihelp-query+allfileusages-param-to": "要列举的最终文件标题。",
-       "apihelp-query+allfileusages-param-prefix": "æ\90\9c索此å\80¼å¼\80头ç\9a\84æ\89\80æ\9c\89文件标题。",
+       "apihelp-query+allfileusages-param-prefix": "æ\90\9cç´¢æ\89\80æ\9c\89以此å\80¼å¼\80头ç\9a\84文件标题。",
        "apihelp-query+allfileusages-param-unique": "只显示明显的文件标题。不能与$1prop=ids一起使用。\n当作为生成器使用时,产生目标页面而不是来源页面。",
        "apihelp-query+allfileusages-param-prop": "要包含的信息束:\n;ids:添加使用中的页面的页面ID(不能与$1unique一起使用)。\n;title:添加文件的标题。",
        "apihelp-query+allfileusages-param-limit": "要返回的总计项目。",
        "apihelp-query+allimages-param-to": "要列举的最终图片标题。只能与$1sort=name一起使用。",
        "apihelp-query+allimages-param-start": "要列举的起始时间戳。只能与$1sort=timestamp一起使用。",
        "apihelp-query+allimages-param-end": "要列举的最终时间戳。只能与$1sort=timestamp一起使用。",
+       "apihelp-query+allimages-param-prefix": "搜索所有以此值开头的图像标题。只能与$1sort=name一起使用。",
        "apihelp-query+allimages-param-minsize": "限于至少这么多字节的图像。",
        "apihelp-query+allimages-param-maxsize": "限于顶多这么多字节的图像。",
        "apihelp-query+allimages-param-sha1": "图像的 SHA1 哈希。覆盖$1sha1base36。",
        "apihelp-query+alllinks-description": "列举所有指向至指定名字空间的链接。",
        "apihelp-query+alllinks-param-from": "要列举的起始标题链接。",
        "apihelp-query+alllinks-param-to": "要列举的最终标题链接。",
-       "apihelp-query+alllinks-param-prefix": "搜索此值开头的所有已链接标题。",
+       "apihelp-query+alllinks-param-prefix": "搜索所有以此值开头的已链接标题。",
+       "apihelp-query+alllinks-param-unique": "只显示明显的链接标题。不能与<kbd>$1prop=ids</kbd>一起使用。\n当作为生成器使用时,产生目标页面而不是来源页面。",
+       "apihelp-query+alllinks-param-prop": "要包含的信息束:\n;ids:添加链接中的页面的页面ID(不能与<var>$1unique</var>一起使用)。\n;title:添加链接的标题。",
        "apihelp-query+alllinks-param-namespace": "要列举的名字空间。",
        "apihelp-query+alllinks-param-limit": "总共要返回多少个项目。",
        "apihelp-query+alllinks-param-dir": "列出方向。",
        "apihelp-query+allmessages-param-prefix": "返回带有该前缀的消息。",
        "apihelp-query+allmessages-example-ipb": "显示以<kbd>ipb-</kbd>开始的消息。",
        "apihelp-query+allmessages-example-de": "显示德语版的<kbd>august</kbd>和<kbd>mainpage</kbd>消息。",
+       "apihelp-query+allpages-description": "循序列举在指定名字空间中的所有页面。",
        "apihelp-query+allpages-param-from": "枚举的起始页面标题。",
        "apihelp-query+allpages-param-to": "枚举的结束页面标题。",
+       "apihelp-query+allpages-param-prefix": "搜索所有以此值开头的页面标题。",
        "apihelp-query+allpages-param-namespace": "要列举的名字空间。",
        "apihelp-query+allpages-param-filterredir": "要列出哪些页面。",
        "apihelp-query+allpages-param-minsize": "限于至少这么多字节的页面。",
        "apihelp-query+allpages-param-maxsize": "限于至多这么多字节的页面。",
        "apihelp-query+allpages-param-prtype": "仅限于受保护页面。",
+       "apihelp-query+allpages-param-prfiltercascade": "过滤基于cascadingness的保护(当$1prtype未设置时忽略)。",
        "apihelp-query+allpages-param-limit": "返回的总计页面数。",
        "apihelp-query+allpages-param-dir": "罗列所采用的方向。",
+       "apihelp-query+allpages-param-filterlanglinks": "过滤基于页面是否有语言链接。注意这可能不考虑由扩展添加的语言链接。",
+       "apihelp-query+allpages-param-prexpiry": "要在页面上过滤的保护期限:\n;indefinite:只获取带无限期保护的页面。\n;definite:只获取带指定保护期限的页面。\n;all:获取任意保护期限的页面。",
        "apihelp-query+allpages-example-B": "显示以字母<kbd>B</kbd>开头的页面的列表。",
        "apihelp-query+allpages-example-generator": "显示有关4个以字母<kbd>T</kbd>开头的页面的信息。",
        "apihelp-query+allpages-example-generator-revisions": "显示前2个以<kbd>Re</kbd>开头的非重定向页面的内容。",
        "apihelp-query+allredirects-description": "列出至一个名字空间的重定向。",
        "apihelp-query+allredirects-param-from": "要列举的起始重定向标题。",
        "apihelp-query+allredirects-param-to": "要列举的最终重定向标题。",
+       "apihelp-query+allredirects-param-prefix": "搜索所有以此值开头的目标页面。",
+       "apihelp-query+allredirects-param-prop": "要包含的信息束:\n;ids:添加重定向页面的页面ID(不能与<var>$1unique</var>一起使用)。\n;title:添加重定向的标题。\n;fragment:添加来自重定向的碎片,如果有(不能与<var>$1unique</var>一起使用)。\n;interwiki:添加来自重定向的跨wiki前缀,如果有(不能与<var>$1unique</var>一起使用)。",
        "apihelp-query+allredirects-param-namespace": "要列举的名字空间。",
        "apihelp-query+allredirects-param-limit": "返回的总计项目数。",
        "apihelp-query+allredirects-param-dir": "罗列所采用的方向。",
        "apihelp-query+alltransclusions-description": "列出所有嵌入页面(使用&#123;&#123;x&#125;&#125;嵌入的页面),包括不存在的。",
        "apihelp-query+alltransclusions-param-from": "要列举的起始嵌入标题。",
        "apihelp-query+alltransclusions-param-to": "要列举的最终嵌入标题。",
+       "apihelp-query+alltransclusions-param-prefix": "搜索所有以此值开头的嵌入的标题。",
+       "apihelp-query+alltransclusions-param-prop": "要包含的信息束:\n;ids:添加嵌入中的页面的页面ID(不能与$1unique一起使用)。\n;title:添加嵌入的标题。",
        "apihelp-query+alltransclusions-param-namespace": "要列举的名字空间。",
        "apihelp-query+alltransclusions-param-limit": "要返回的总计项目。",
        "apihelp-query+alltransclusions-param-dir": "罗列所采用的方向。",
        "apihelp-query+allusers-description": "列举所有注册用户。",
        "apihelp-query+allusers-param-from": "枚举的起始用户名。",
        "apihelp-query+allusers-param-to": "枚举的结束用户名。",
-       "apihelp-query+allusers-param-prefix": "搜索以此值开始的所有用户。",
+       "apihelp-query+allusers-param-prefix": "搜索所有以此值开头的用户。",
        "apihelp-query+allusers-param-dir": "排序方向。",
        "apihelp-query+allusers-param-group": "只包含指定组中的用户。",
        "apihelp-query+allusers-param-excludegroup": "排除指定组中的用户。",
        "apihelp-query+allusers-param-rights": "仅列出有所选权限的用户。不包括隐性的或自动加入的用户组别(如*、用户或自动确认用户)所授予的权限。",
+       "apihelp-query+allusers-param-prop": "要包含的信息束:\n;blockinfo:添加有关用户当前封禁的信息。\n;groups:列举用户所在的组。这使用更多服务器资源,并可能返回少于限制的结果。\n;implicitgroups:Lists all the groups the user is automatically in.\n;rights:Lists rights that the user has.\n;editcount:Adds the edit count of the user.\n;registration:Adds the timestamp of when the user registered if available (may be blank).",
        "apihelp-query+allusers-param-limit": "返回的总计用户数。",
        "apihelp-query+allusers-param-witheditsonly": "只列出有编辑的用户。",
        "apihelp-query+allusers-param-activeusers": "只列出最近$1{{PLURAL:$1|天}}内活跃的用户。",
        "apihelp-query+categorymembers-description": "在指定的分类中列出所有页面。",
        "apihelp-query+categorymembers-param-title": "要列举的分类(必需)。必须包括<kbd>{{ns:category}}:</kbd>前缀。不能与<var>$1pageid</var>一起使用。",
        "apihelp-query+categorymembers-param-pageid": "要枚举的分类的页面 ID。不能与<var>$1title</var>一起使用。",
+       "apihelp-query+categorymembers-param-prop": "要包含的信息束:\n;ids:添加页面ID。\n;title:添加页面标题和名字空间ID。\n;sortkey:Adds the sortkey used for sorting in the category (hexadecimal string).\n;sortkeyprefix:Adds the sortkey prefix used for sorting in the category (human-readable part of the sortkey).\n;type:Adds the type that the page has been categorised as (page, subcat or file).\n;timestamp:Adds the timestamp of when the page was included.",
        "apihelp-query+categorymembers-param-namespace": "仅包含这些名字空间的页面。注意<kbd>$1type=subcat</kbd>或<kbd>$1type=file</kbd>可能被使用,而不是<kbd>$1namespace=14</kbd>或<kbd>6</kbd>。",
        "apihelp-query+categorymembers-param-type": "包含的分类成员类型。当<kbd>$1sort=timestamp</kbd>被设置时会忽略。",
        "apihelp-query+categorymembers-param-limit": "返回页面的最大数量。",
        "apihelp-query+deletedrevisions-param-excludeuser": "不要列出此用户做出的修订。",
        "apihelp-query+deletedrevisions-example-titles": "列出页面<kbd>Main Page</kbd>和<kbd>Talk:Main Page</kbd>的已删除修订,包含内容。",
        "apihelp-query+deletedrevisions-example-revids": "列出已删除修订<kbd>123456</kbd>的信息。",
-       "apihelp-query+deletedrevs-description": "列出被删除修订。\n\n操作于三种模式中:\n# List deleted revisions for the given titles, sorted by timestamp.\n# List deleted contributions for the given user, sorted by timestamp (no titles specified).\n# List all deleted revisions in the given namespace, sorted by title and timestamp (no titles specified, $1user not set).\n\nCertain parameters only apply to some modes and are ignored in others.",
+       "apihelp-query+deletedrevs-description": "列出被删除修订。\n\n操作于三种模式中:\n# 为指定标题列举已删除修订,按时间戳排列。\n# List deleted contributions for the given user, sorted by timestamp (no titles specified).\n# List all deleted revisions in the given namespace, sorted by title and timestamp (no titles specified, $1user not set).\n\nCertain parameters only apply to some modes and are ignored in others.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|模式}}:$2",
        "apihelp-query+deletedrevs-param-start": "枚举的起始时间戳。",
        "apihelp-query+deletedrevs-param-end": "枚举的结束时间戳。",
        "apihelp-query+deletedrevs-param-from": "从此标题开始列出。",
        "apihelp-query+deletedrevs-param-to": "列出至此标题为止。",
-       "apihelp-query+deletedrevs-param-prefix": "æ\90\9cç´¢æ \87é¢\98以此å\80¼å¼\80头ç\9a\84æ\89\80æ\9c\89页é\9d¢。",
+       "apihelp-query+deletedrevs-param-prefix": "æ\90\9cç´¢æ\89\80æ\9c\89以此å\80¼å¼\80头ç\9a\84页é\9d¢æ \87é¢\98。",
        "apihelp-query+deletedrevs-param-unique": "每个页面只列出一个修订。",
        "apihelp-query+deletedrevs-param-tag": "只列出被此标签标记的修订。",
        "apihelp-query+deletedrevs-param-user": "只列出此用户做出的修订。",
        "apihelp-query+duplicatefiles-param-localonly": "只看本地存储库的文件。",
        "apihelp-query+duplicatefiles-example-simple": "查找与[[:File:Albert Einstein Head.jpg]]重复的文件。",
        "apihelp-query+duplicatefiles-example-generated": "查找所有文件的重复文件。",
+       "apihelp-query+embeddedin-description": "查找所有嵌入指定标题的页面。",
        "apihelp-query+embeddedin-param-title": "要搜索的标题。不能与$1pageid一起使用。",
        "apihelp-query+embeddedin-param-pageid": "要搜索的页面ID。不能与$1title一起使用。",
        "apihelp-query+embeddedin-param-namespace": "列举的名字空间。",
        "apihelp-query+extlinks-param-expandurl": "扩展协议相对URL与规范协议。",
        "apihelp-query+extlinks-example-simple": "获取<kbd>Main Page<kbd>的外部链接列表。",
        "apihelp-query+exturlusage-description": "列举包含一个指定URL的页面。",
+       "apihelp-query+exturlusage-param-prop": "要包含的信息束:\n;ids:添加页面ID。\n;title:添加页面的标题和名字空间ID。\n;url:添加页面中使用的URL。",
        "apihelp-query+exturlusage-param-protocol": "URL协议。如果为空并且<var>$1query</var>被设置,协议为<kbd>http</kbd>。将此和<var>$1query</var>都留空以列举所有外部链接。",
        "apihelp-query+exturlusage-param-query": "不包括协议的搜索字符串。参见[[Special:LinkSearch]]。留空以列出所有外部链接。",
        "apihelp-query+exturlusage-param-namespace": "要列举的页面名字空间。",
        "apihelp-query+info-paramvalue-prop-talkid": "每个非讨论页面的讨论页的页面ID。",
        "apihelp-query+info-paramvalue-prop-watched": "列出每个页面的被监视状态。",
        "apihelp-query+info-paramvalue-prop-watchers": "监视人员数,如果允许。",
+       "apihelp-query+info-paramvalue-prop-notificationtimestamp": "每个页面的监视列表通知时间戳。",
        "apihelp-query+info-paramvalue-prop-subjectid": "每个讨论页的母页面的页面ID。",
        "apihelp-query+info-paramvalue-prop-readable": "用户是否可以阅读此页面。",
        "apihelp-query+info-paramvalue-prop-preload": "提供由EditFormPreloadText返回的文本。",
        "apihelp-query+info-param-token": "请改用[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。",
        "apihelp-query+info-example-simple": "获取有关页面<kbd>Main Page</kbd>的信息。",
        "apihelp-query+info-example-protection": "获取<kbd>Main Page</kbd>相关的常规和保护信息。",
+       "apihelp-query+iwbacklinks-description": "查找所有链接至指定跨wiki链接的页面。\n\n可被用于查找带某一前缀的所有链接,或所有至某一标题的链接(带指定前缀)。两参数都不使用就意味着“所有跨wiki链接”。",
        "apihelp-query+iwbacklinks-param-prefix": "跨维基前缀。",
        "apihelp-query+iwbacklinks-param-title": "要搜索的跨wiki链接。必须与<var>$1blprefix</var>一起使用。",
        "apihelp-query+iwbacklinks-param-limit": "返回的总计页面数。",
        "apihelp-query+pagepropnames-example-simple": "获取前10个属性名称。",
        "apihelp-query+pageprops-example-simple": "获取用于页面<kbd>Main Page</kbd>和<kbd>MediaWiki</kbd>的属性。",
        "apihelp-query+pageswithprop-description": "列出所有使用指定页面属性的页面。",
+       "apihelp-query+pageswithprop-param-prop": "要包含的信息束:\n;ids:添加页面ID。\n;title:添加页面的标题和名字空间ID。\n;value:添加页面属性值。",
        "apihelp-query+pageswithprop-param-limit": "返回页面的最大数量。",
        "apihelp-query+pageswithprop-param-dir": "排序的方向。",
        "apihelp-query+pageswithprop-example-simple": "列出前10个使用<code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>的页面。",
        "apihelp-query+usercontribs-example-user": "显示用户<kbd>Example</kbd>的贡献。",
        "apihelp-query+usercontribs-example-ipprefix": "显示来自<kbd>192.0.2.</kbd>前缀所有 IP 地址的贡献。",
        "apihelp-query+userinfo-description": "获取有关当前用户的信息。",
-       "apihelp-query+userinfo-param-prop": "要包含的信息束:\n;blockinfo:如果当前用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。\n;hasmsg:Adds a tag <samp>messages</samp> if the current user has pending messages.\n;groups:Lists all the groups the current user belongs to.\n;implicitgroups:Lists all the groups the current user is automatically a member of.\n;rights:Lists all the rights the current user has.\n;changeablegroups:Lists the groups the current user can add to and remove from.\n;options:Lists all preferences the current user has set.\n;preferencestoken:<span class=\"apihelp-deprecated\">Deprecated.</span> Get a token to change current user's preferences.\n;editcount:Adds the current user's edit count.\n;ratelimits:Lists all rate limits applying to the current user.\n;realname:Adds the user's real name.\n;email:Adds the user's email address and email authentication date.\n;acceptlang:Echoes the <code>Accept-Language</code> header sent by the client in a structured format.\n;registrationdate:Adds the user's registration date.\n;unreadcount:Adds the count of unread pages on the user's watchlist (maximum $1; returns <samp>$2</samp> if more).",
+       "apihelp-query+userinfo-param-prop": "要包含的信息束:\n;blockinfo:如果当前用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。\n;hasmsg:如果当前用户有等待中的消息的话,添加标签<samp>messages</samp>。\n;groups:Lists all the groups the current user belongs to.\n;implicitgroups:Lists all the groups the current user is automatically a member of.\n;rights:Lists all the rights the current user has.\n;changeablegroups:Lists the groups the current user can add to and remove from.\n;options:Lists all preferences the current user has set.\n;preferencestoken:<span class=\"apihelp-deprecated\">Deprecated.</span> Get a token to change current user's preferences.\n;editcount:Adds the current user's edit count.\n;ratelimits:Lists all rate limits applying to the current user.\n;realname:Adds the user's real name.\n;email:Adds the user's email address and email authentication date.\n;acceptlang:Echoes the <code>Accept-Language</code> header sent by the client in a structured format.\n;registrationdate:Adds the user's registration date.\n;unreadcount:Adds the count of unread pages on the user's watchlist (maximum $1; returns <samp>$2</samp> if more).",
        "apihelp-query+userinfo-example-simple": "获取有关当前用户的信息。",
        "apihelp-query+userinfo-example-data": "获取有关当前用户的额外信息。",
        "apihelp-query+users-description": "获取有关列出用户的信息。",
+       "apihelp-query+users-param-prop": "要包含的信息束:\n;blockinfo:如果用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。\n;groups:列举每位用户属于的所有组。\n;implicitgroups:Lists all the groups a user is automatically a member of.\n;rights:Lists all the rights each user has.\n;editcount:Adds the user's edit count.\n;registration:Adds the user's registration timestamp.\n;emailable:Tags if the user can and wants to receive email through [[Special:Emailuser]].\n;gender:Tags the gender of the user. Returns \"male\", \"female\", or \"unknown\".",
        "apihelp-query+users-param-token": "请改用<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
        "apihelp-query+users-example-simple": "返回用户<kbd>Example</kbd>的信息。",
        "apihelp-query+watchlist-param-start": "枚举的起始时间戳。",
        "apihelp-query+watchlist-paramvalue-prop-sizes": "添加页面的旧有长度和新长度。",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "添加最近被通知有关编辑的用户的时间戳。",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "在适当位置添加日志信息。",
+       "apihelp-query+watchlist-param-type": "要显示的更改类型:\n;edit:定期页面编辑。\n;external:外部更改。\n;new:页面创建。\n;log:日志记录。",
        "apihelp-query+watchlist-param-token": "允许访问其他用户监视列表的安全密钥(可通过用户的[[Special:Preferences#mw-prefsection-watchlist|参数设置]]找到)。",
        "apihelp-query+watchlist-example-generator": "在当前用户的监视列表中检索用于最近更改页面的页面信息。",
        "apihelp-query+watchlistraw-description": "获得当前用户的监视列表上的所有页面。",
        "apihelp-yamlfm-description": "输出数据为YAML格式(HTML优质打印效果)。",
        "api-format-title": "MediaWiki API 结果",
        "api-format-prettyprint-header": "这是$1格式的HTML表示。HTML对调试很有用,但不适合应用程序使用。\n\n指定<var>format</var>参数以更改输出格式。要查看$1格式的非HTML表示,设置<kbd>format=$2</kbd>。\n\n参见[[mw:API|完整文档]],或[[Special:ApiHelp/main|API 帮助]]以获取更多信息。",
+       "api-format-prettyprint-header-only-html": "这是用来调试的HTML表现,不适合实际使用。\n\n参见[[mw:API|完整文档]],或[[Special:ApiHelp/main|API帮助]]以获取更多信息。",
        "api-orm-param-props": "要查询的字段。",
        "api-orm-param-limit": "返回的总行数。",
        "api-pageset-param-titles": "要工作的标题列表。",
index 8531e23..b1e6d95 100644 (file)
@@ -43,7 +43,7 @@
        "apihelp-createaccount-param-name": "使用者名稱。",
        "apihelp-createaccount-param-password": "密碼 (若有設定 <var>$1mailpassword</var> 則可略過)。",
        "apihelp-createaccount-param-domain": "外部認証使用的網域 (選填)。",
-       "apihelp-createaccount-param-token": "å·²å\8f\96å¾\97帳è\99\9f建ç«\8bå¯\86é\91°æ\96¼ç¬¬ä¸\80次è«\8bæ±\82。",
+       "apihelp-createaccount-param-token": "å\9c¨ç¬¬ä¸\80次è«\8bæ±\82æ\99\82å·²å\8f\96å¾\97ç\9a\84帳è\99\9f建ç«\8bé\87\91é\91°。",
        "apihelp-createaccount-param-email": "使用者的電子郵件地址 (選填) 。",
        "apihelp-createaccount-param-realname": "使用者的真實姓名 (選填)。",
        "apihelp-createaccount-param-mailpassword": "若設為其他值,將會以電子郵件寄送隨機密碼給使用者。",
        "apihelp-query+stashimageinfo-example-simple": "回傳儲藏檔案的檔案資訊。",
        "apihelp-query+templates-description": "回傳指定頁面中所有引用的頁面。",
        "apihelp-query+templates-param-limit": "要回傳的模板數量。",
-       "apihelp-query+tokens-param-type": "è¦\81è«\8bæ±\82ç\9a\84å¯\86é\91°é¡\9eå\9e\8bã\80\82",
+       "apihelp-query+tokens-param-type": "請求的密鑰類型。",
        "apihelp-query+tokens-example-simple": "接收 csrf 密鑰 (預設)。",
        "apihelp-query+tokens-example-types": "接收監視密鑰以及巡邏密鑰。",
        "apihelp-query+transcludedin-param-limit": "回傳的數量。",
        "apihelp-format-example-generic": "格式化查詢結果為 $1 格式",
        "apihelp-dbg-description": "使用 PHP 的 <code>var_export()</code> 格式輸出資料。",
        "apihelp-dbgfm-description": "使用 PHP 的 <code>var_export()</code> 格式輸出資料 (使用 HTML 格式顯示)。",
-       "apihelp-dump-description": "使用 PHP 的 <code>var_dump()</code> 格式輸出資料。",
-       "apihelp-dumpfm-description": "使用 PHP 的 <code>var_dump()</code> 格式輸出資料 (使用 HTML 格式顯示)。",
        "apihelp-json-description": "使用 JSON 格式輸出資料。",
        "apihelp-jsonfm-description": "使用 JSON 格式輸出資料 (使用 HTML 格式顯示)。",
        "apihelp-none-description": "不輸出。",
        "apihelp-rawfm-description": "使用 JSON 格式的除錯元素輸出資料 (使用 HTML 格式顯示)。",
        "apihelp-txt-description": "使用 PHP 的 <code>print_r()</code> 格式輸出資料。",
        "apihelp-txtfm-description": "使用 PHP 的 <code>print_r()</code> 格式輸出資料 (使用 HTML 格式顯示)。",
-       "apihelp-wddx-description": "使用 WDDX 格式輸出資料。",
-       "apihelp-wddxfm-description": "使用 WDDX 格式輸出資料 (使用 HTML 格式顯示)。",
        "apihelp-xml-description": "使用 XML 格式輸出資料。",
        "apihelp-xmlfm-description": "使用 XML 格式輸出資料 (使用 HTML 格式顯示)。",
        "apihelp-yaml-description": "使用 YAML 格式輸出資料。",
index 95f4816..bf8386f 100644 (file)
@@ -611,17 +611,16 @@ class ChangeTags {
         * Build a text box to select a change tag
         *
         * @param string $selected Tag to select by default
-        * @param bool $fullForm
-        *        - if false, then it returns an array of (label, form).
-        *        - if true, it returns an entire form around the selector.
-        * @param Title $title Title object to send the form to.
-        *        Used when, and only when $fullForm is true.
+        * @param bool $fullForm Affects return value, see below
+        * @param Title $title Title object to send the form to. Used only if $fullForm is true.
+        * @param bool $ooui Use an OOUI TextInputWidget as selector instead of a non-OOUI input field
+        *        You need to call OutputPage::enableOOUI() yourself.
         * @return string|array
-        *        - if $fullForm is false: Array with
-        *        - if $fullForm is true: String, html fragment
+        *        - if $fullForm is false: an array of (label, selector).
+        *        - if $fullForm is true: HTML of entire form built around the selector.
         */
        public static function buildTagFilterSelector( $selected = '',
-               $fullForm = false, Title $title = null
+               $fullForm = false, Title $title = null, $ooui = false
        ) {
                global $wgUseTagFilter;
 
@@ -634,14 +633,24 @@ class ChangeTags {
                                'label',
                                array( 'for' => 'tagfilter' ),
                                wfMessage( 'tag-filter' )->parse()
-                       ),
-                       Xml::input(
+                       )
+               );
+
+               if ( $ooui ) {
+                       $data[] = new OOUI\TextInputWidget( array(
+                               'id' => 'tagfilter',
+                               'name' => 'tagfilter',
+                               'value' => $selected,
+                               'classes' => 'mw-tagfilter-input',
+                       ) );
+               } else {
+                       $data[] = Xml::input(
                                'tagfilter',
                                20,
                                $selected,
                                array( 'class' => 'mw-tagfilter-input mw-ui-input mw-ui-input-inline', 'id' => 'tagfilter' )
-                       )
-               );
+                       );
+               }
 
                if ( !$fullForm ) {
                        return $data;
index c0194c2..6d23656 100644 (file)
  */
 class JavaScriptContent extends TextContent {
 
+       /**
+        * @var bool|Title|null
+        */
+       private $redirectTarget = false;
+
        /**
         * @param string $text JavaScript code.
         * @param string $modelId the content model name
@@ -73,4 +78,46 @@ class JavaScriptContent extends TextContent {
                return $html;
        }
 
+       /**
+        * If this page is a redirect, return the content
+        * if it should redirect to $target instead
+        *
+        * @param Title $target
+        * @return JavaScriptContent
+        */
+       public function updateRedirect( Title $target ) {
+               if ( !$this->isRedirect() ) {
+                       return $this;
+               }
+
+               return $this->getContentHandler()->makeRedirectContent( $target );
+       }
+
+       /**
+        * @return Title|null
+        */
+       public function getRedirectTarget() {
+               if ( $this->redirectTarget !== false ) {
+                       return $this->redirectTarget;
+               }
+               $this->redirectTarget = null;
+               $text = $this->getNativeData();
+               if ( strpos( $text, '/* #REDIRECT */' ) === 0 ) {
+                       // Extract the title from the url
+                       preg_match( '/title=(.*?)\\\\u0026action=raw/', $text, $matches );
+                       if ( isset( $matches[1] ) ) {
+                               $title = Title::newFromText( $matches[1] );
+                               if ( $title ) {
+                                       // Have a title, check that the current content equals what
+                                       // the redirect content should be
+                                       if ( $this->equals( $this->getContentHandler()->makeRedirectContent( $title ) ) ) {
+                                               $this->redirectTarget = $title;
+                                       }
+                               }
+                       }
+               }
+
+               return $this->redirectTarget;
+       }
+
 }
index d221897..65e3a6f 100644 (file)
@@ -41,4 +41,22 @@ class JavaScriptContentHandler extends CodeContentHandler {
        protected function getContentClass() {
                return 'JavaScriptContent';
        }
+
+       public function supportsRedirects() {
+               return true;
+       }
+
+       /**
+        * Create a redirect that is also valid JavaScript
+        *
+        * @param Title $destination
+        * @param string $text ignored
+        * @return JavaScriptContent
+        */
+       public function makeRedirectContent( Title $destination, $text = '' ) {
+               // The parameters are passed as a string so the / is not url-encoded by wfArrayToCgi
+               $url = $destination->getFullURL( 'action=raw&ctype=text/javascript', false, PROTO_RELATIVE );
+               $class = $this->getContentClass();
+               return new $class( '/* #REDIRECT */' . Xml::encodeJsCall( 'mw.loader.load', array( $url ) ) );
+       }
 }
index 04b3edd..2ee4545 100644 (file)
@@ -230,7 +230,7 @@ abstract class DatabaseBase implements IDatabase {
         * @param null|bool $ignoreErrors
         * @return bool The previous value of the flag.
         */
-       public function ignoreErrors( $ignoreErrors = null ) {
+       protected function ignoreErrors( $ignoreErrors = null ) {
                return wfSetBit( $this->mFlags, DBO_IGNORE, $ignoreErrors );
        }
 
@@ -605,125 +605,6 @@ abstract class DatabaseBase implements IDatabase {
                return $this->getSqlFilePath( 'update-keys.sql' );
        }
 
-       /**
-        * Get the type of the DBMS, as it appears in $wgDBtype.
-        *
-        * @return string
-        */
-       abstract function getType();
-
-       /**
-        * Open a connection to the database. Usually aborts on failure
-        *
-        * @param string $server Database server host
-        * @param string $user Database user name
-        * @param string $password Database user password
-        * @param string $dbName Database name
-        * @return bool
-        * @throws DBConnectionError
-        */
-       abstract function open( $server, $user, $password, $dbName );
-
-       /**
-        * Fetch the next row from the given result object, in object form.
-        * Fields can be retrieved with $row->fieldname, with fields acting like
-        * member variables.
-        * If no more rows are available, false is returned.
-        *
-        * @param ResultWrapper|stdClass $res Object as returned from DatabaseBase::query(), etc.
-        * @return stdClass|bool
-        * @throws DBUnexpectedError Thrown if the database returns an error
-        */
-       abstract function fetchObject( $res );
-
-       /**
-        * Fetch the next row from the given result object, in associative array
-        * form. Fields are retrieved with $row['fieldname'].
-        * If no more rows are available, false is returned.
-        *
-        * @param ResultWrapper $res Result object as returned from DatabaseBase::query(), etc.
-        * @return array|bool
-        * @throws DBUnexpectedError Thrown if the database returns an error
-        */
-       abstract function fetchRow( $res );
-
-       /**
-        * Get the number of rows in a result object
-        *
-        * @param mixed $res A SQL result
-        * @return int
-        */
-       abstract function numRows( $res );
-
-       /**
-        * Get the number of fields in a result object
-        * @see http://www.php.net/mysql_num_fields
-        *
-        * @param mixed $res A SQL result
-        * @return int
-        */
-       abstract function numFields( $res );
-
-       /**
-        * Get a field name in a result object
-        * @see http://www.php.net/mysql_field_name
-        *
-        * @param mixed $res A SQL result
-        * @param int $n
-        * @return string
-        */
-       abstract function fieldName( $res, $n );
-
-       /**
-        * Get the inserted value of an auto-increment row
-        *
-        * The value inserted should be fetched from nextSequenceValue()
-        *
-        * Example:
-        * $id = $dbw->nextSequenceValue( 'page_page_id_seq' );
-        * $dbw->insert( 'page', array( 'page_id' => $id ) );
-        * $id = $dbw->insertId();
-        *
-        * @return int
-        */
-       abstract function insertId();
-
-       /**
-        * Change the position of the cursor in a result object
-        * @see http://www.php.net/mysql_data_seek
-        *
-        * @param mixed $res A SQL result
-        * @param int $row
-        */
-       abstract function dataSeek( $res, $row );
-
-       /**
-        * Get the last error number
-        * @see http://www.php.net/mysql_errno
-        *
-        * @return int
-        */
-       abstract function lastErrno();
-
-       /**
-        * Get a description of the last error
-        * @see http://www.php.net/mysql_error
-        *
-        * @return string
-        */
-       abstract function lastError();
-
-       /**
-        * mysql_fetch_field() wrapper
-        * Returns false if the field doesn't exist
-        *
-        * @param string $table Table name
-        * @param string $field Field name
-        *
-        * @return Field
-        */
-       abstract function fieldInfo( $table, $field );
-
        /**
         * Get information about an index into an object
         * @param string $table Table name
@@ -733,14 +614,6 @@ abstract class DatabaseBase implements IDatabase {
         */
        abstract function indexInfo( $table, $index, $fname = __METHOD__ );
 
-       /**
-        * Get the number of rows affected by the last write query
-        * @see http://www.php.net/mysql_affected_rows
-        *
-        * @return int
-        */
-       abstract function affectedRows();
-
        /**
         * Wrapper for addslashes()
         *
@@ -749,24 +622,6 @@ abstract class DatabaseBase implements IDatabase {
         */
        abstract function strencode( $s );
 
-       /**
-        * Returns a wikitext link to the DB's website, e.g.,
-        *   return "[http://www.mysql.com/ MySQL]";
-        * Should at least contain plain text, if for some reason
-        * your database has no website.
-        *
-        * @return string Wikitext of a link to the server software's web site
-        */
-       abstract function getSoftwareLink();
-
-       /**
-        * A string describing the current software version, like from
-        * mysql_get_server_info().
-        *
-        * @return string Version information from the database server.
-        */
-       abstract function getServerVersion();
-
        /**
         * Constructor.
         *
index 8010790..ea4e1b1 100644 (file)
@@ -40,7 +40,7 @@ use UDPTransport;
  * See documentation in DefaultSettings.php for detailed explanations of each
  * variable.
  *
- * @see \MediaWiki\Logger\LoggerFactory
+ * @see \\MediaWiki\\Logger\\LoggerFactory
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
@@ -53,10 +53,10 @@ class LegacyLogger extends AbstractLogger {
        protected $channel;
 
        /**
-        * Convert Psr\Log\LogLevel constants into int for sane comparisons
+        * Convert Psr\\Log\\LogLevel constants into int for sane comparisons
         * These are the same values that Monlog uses
         *
-        * @var array
+        * @var array $levelMapping
         */
        protected static $levelMapping = array(
                LogLevel::DEBUG => 100,
@@ -100,7 +100,7 @@ class LegacyLogger extends AbstractLogger {
         *
         * @param string $channel
         * @param string $message
-        * @param string|int $level Psr\Log\LogEvent constant or Monlog level int
+        * @param string|int $level Psr\\Log\\LogEvent constant or Monlog level int
         * @param array $context
         * @return bool True if message should be sent to disk/network, false
         * otherwise
index 1bf39e4..6a7f1d0 100644 (file)
@@ -30,7 +30,7 @@ namespace MediaWiki\Logger;
  * );
  * @endcode
  *
- * @see \MediaWiki\Logger\LoggerFactory
+ * @see \\MediaWiki\\Logger\\LoggerFactory
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
@@ -47,7 +47,7 @@ class LegacySpi implements Spi {
         * Get a logger instance.
         *
         * @param string $channel Logging channel
-        * @return \Psr\Log\LoggerInterface Logger instance
+        * @return \\Psr\\Log\\LoggerInterface Logger instance
         */
        public function getLogger( $channel ) {
                if ( !isset( $this->singletons[$channel] ) ) {
index f6699ec..0b6965f 100644 (file)
@@ -25,7 +25,7 @@ use ObjectFactory;
 /**
  * PSR-3 logger instance factory.
  *
- * Creation of \Psr\Log\LoggerInterface instances is managed via the
+ * Creation of \\Psr\\Log\\LoggerInterface instances is managed via the
  * LoggerFactory::getInstance() static method which in turn delegates to the
  * currently registered service provider.
  *
@@ -38,7 +38,7 @@ use ObjectFactory;
  * $wgMWLoggerDefaultSpi is expected to be an array usable by
  * ObjectFactory::getObjectFromSpec() to create a class.
  *
- * @see \MediaWiki\Logger\Spi
+ * @see \\MediaWiki\\Logger\\Spi
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
@@ -53,10 +53,10 @@ class LoggerFactory {
 
 
        /**
-        * Register a service provider to create new \Psr\Log\LoggerInterface
+        * Register a service provider to create new \\Psr\\Log\\LoggerInterface
         * instances.
         *
-        * @param \MediaWiki\Logger\Spi $provider Provider to register
+        * @param \\MediaWiki\\Logger\\Spi $provider Provider to register
         */
        public static function registerProvider( Spi $provider ) {
                self::$spi = $provider;
@@ -71,7 +71,7 @@ class LoggerFactory {
         * Spi registration. $wgMWLoggerDefaultSpi is expected to be an
         * array usable by ObjectFactory::getObjectFromSpec() to create a class.
         *
-        * @return \MediaWiki\Logger\Spi
+        * @return \\MediaWiki\\Logger\\Spi
         * @see registerProvider()
         * @see ObjectFactory::getObjectFromSpec()
         */
@@ -91,7 +91,7 @@ class LoggerFactory {
         * Get a named logger instance from the currently configured logger factory.
         *
         * @param string $channel Logger channel (name)
-        * @return \Psr\Log\LoggerInterface
+        * @return \\Psr\\Log\\LoggerInterface
         */
        public static function getInstance( $channel ) {
                if ( !interface_exists( '\Psr\Log\LoggerInterface' ) ) {
index e32e0b2..7b54861 100644 (file)
@@ -30,7 +30,7 @@ use ObjectFactory;
  * Configured using an array of configuration data with the keys 'loggers',
  * 'processors', 'handlers' and 'formatters'.
  *
- * The ['loggers']['@default'] configuration will be used to create loggers
+ * The ['loggers']['\@default'] configuration will be used to create loggers
  * for any channel that isn't explicitly named in the 'loggers' configuration
  * section.
  *
@@ -176,7 +176,7 @@ class MonologSpi implements Spi {
         * name will return the cached instance.
         *
         * @param string $channel Logging channel
-        * @return \Psr\Log\LoggerInterface Logger instance
+        * @return \\Psr\\Log\\LoggerInterface Logger instance
         */
        public function getLogger( $channel ) {
                if ( !isset( $this->singletons['loggers'][$channel] ) ) {
@@ -198,7 +198,7 @@ class MonologSpi implements Spi {
         * Create a logger.
         * @param string $channel Logger channel
         * @param array $spec Configuration
-        * @return \Monolog\Logger
+        * @return \\Monolog\\Logger
         */
        protected function createLogger( $channel, $spec ) {
                $obj = new Logger( $channel );
@@ -236,7 +236,7 @@ class MonologSpi implements Spi {
        /**
         * Create or return cached handler.
         * @param string $name Processor name
-        * @return \Monolog\Handler\HandlerInterface
+        * @return \\Monolog\\Handler\\HandlerInterface
         */
        public function getHandler( $name ) {
                if ( !isset( $this->singletons['handlers'][$name] ) ) {
@@ -256,7 +256,7 @@ class MonologSpi implements Spi {
        /**
         * Create or return cached formatter.
         * @param string $name Formatter name
-        * @return \Monolog\Formatter\FormatterInterface
+        * @return \\Monolog\\Formatter\\FormatterInterface
         */
        public function getFormatter( $name ) {
                if ( !isset( $this->singletons['formatters'][$name] ) ) {
index a82d2c4..c9c7482 100644 (file)
@@ -23,7 +23,7 @@ namespace MediaWiki\Logger;
 use Psr\Log\NullLogger;
 
 /**
- * LoggerFactory service provider that creates \Psr\Log\NullLogger
+ * LoggerFactory service provider that creates \\Psr\\Log\\NullLogger
  * instances. A NullLogger silently discards all log events sent to it.
  *
  * Usage:
@@ -33,7 +33,7 @@ use Psr\Log\NullLogger;
  * );
  * @endcode
  *
- * @see \MediaWiki\Logger\LoggerFactory
+ * @see \\MediaWiki\\Logger\\LoggerFactory
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
@@ -41,7 +41,7 @@ use Psr\Log\NullLogger;
 class NullSpi implements Spi {
 
        /**
-        * @var \Psr\Log\NullLogger $singleton
+        * @var \\Psr\\Log\\NullLogger $singleton
         */
        protected $singleton;
 
@@ -55,7 +55,7 @@ class NullSpi implements Spi {
         * Get a logger instance.
         *
         * @param string $channel Logging channel
-        * @return \Psr\Log\NullLogger Logger instance
+        * @return \\Psr\\Log\\NullLogger Logger instance
         */
        public function getLogger( $channel ) {
                return $this->singleton;
index 044789f..51818a3 100644 (file)
 namespace MediaWiki\Logger;
 
 /**
- * Service provider interface for \Psr\Log\LoggerInterface implementation
+ * Service provider interface for \\Psr\\Log\\LoggerInterface implementation
  * libraries.
  *
  * MediaWiki can be configured to use a class implementing this interface to
- * create new \Psr\Log\LoggerInterface instances via either the
+ * create new \\Psr\\Log\\LoggerInterface instances via either the
  * $wgMWLoggerDefaultSpi global variable or code that constructs an instance
  * and registers it via the LoggerFactory::registerProvider() static method.
  *
- * @see \MediaWiki\Logger\LoggerFactory
+ * @see \\MediaWiki\\Logger\\LoggerFactory
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
@@ -40,7 +40,7 @@ interface Spi {
         * Get a logger instance.
         *
         * @param string $channel Logging channel
-        * @return \Psr\Log\LoggerInterface Logger instance
+        * @return \\Psr\\Log\\LoggerInterface Logger instance
         */
        public function getLogger( $channel );
 
index 9ec15cb..42e7cab 100644 (file)
@@ -26,12 +26,12 @@ use Monolog\Formatter\NormalizerFormatter;
 /**
  * Log message formatter that mimics the legacy log message formatting of
  * `wfDebug`, `wfDebugLog`, `wfLogDBError` and `wfErrorLog` global functions by
- * delegating the formatting to \MediaWiki\Logger\LegacyLogger.
+ * delegating the formatting to \\MediaWiki\\Logger\\LegacyLogger.
  *
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2013 Bryan Davis and Wikimedia Foundation.
- * @see \MediaWiki\Logger\LegacyLogger
+ * @see \\MediaWiki\\Logger\\LegacyLogger
  */
 class LegacyFormatter extends NormalizerFormatter {
 
diff --git a/includes/filerepo/FileBackendDBRepoWrapper.php b/includes/filerepo/FileBackendDBRepoWrapper.php
new file mode 100644 (file)
index 0000000..0401d0c
--- /dev/null
@@ -0,0 +1,357 @@
+<?php
+/**
+ * Proxy backend that manages file layout rewriting for FileRepo.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup FileRepo
+ * @ingroup FileBackend
+ * @author Aaron Schulz
+ */
+
+/**
+ * @brief Proxy backend that manages file layout rewriting for FileRepo.
+ *
+ * LocalRepo may be configured to store files under their title names or by SHA-1.
+ * This acts as a shim in the later case, providing backwards compatability for
+ * most callers. All "public"/"deleted" zone files actually go in an "original"
+ * container and are never changed.
+ *
+ * This requires something like thumb_handler.php and img_auth.php for client viewing of files.
+ *
+ * @ingroup FileRepo
+ * @ingroup FileBackend
+ * @since 1.25
+ */
+class FileBackendDBRepoWrapper extends FileBackend {
+       /** @var FileBackend */
+       protected $backend;
+       /** @var string */
+       protected $repoName;
+       /** @var Closure */
+       protected $dbHandleFunc;
+       /** @var ProcessCacheLRU */
+       protected $resolvedPathCache;
+       /** @var Array Map of (index => DBConnRef) */
+       protected $dbs;
+
+       public function __construct( array $config ) {
+               $config['name'] = $config['backend']->getName();
+               $config['wikiId'] = $config['backend']->getWikiId();
+               parent::__construct( $config );
+               $this->backend = $config['backend'];
+               $this->repoName = $config['repoName'];
+               $this->dbHandleFunc = $config['dbHandleFactory'];
+               $this->resolvedPathCache = new ProcessCacheLRU( 100 );
+       }
+
+       /**
+        * Get the underlying FileBackend that is being wrapped
+        *
+        * @return FileBackend
+        */
+       public function getInternalBackend() {
+               return $this->backend;
+       }
+
+       /**
+        * Translate a legacy "title" path to it's "sha1" counterpart
+        *
+        * E.g. mwstore://local-backend/local-public/a/ab/<name>.jpg
+        * => mwstore://local-backend/local-original/x/y/z/<sha1>.jpg
+        *
+        * @param string $path
+        * @param bool $latest
+        * @return string
+        */
+       public function getBackendPath( $path, $latest = true ) {
+               $paths = $this->getBackendPaths( array( $path ), $latest );
+               return current( $paths );
+       }
+
+       /**
+        * Translate legacy "title" paths to their "sha1" counterparts
+        *
+        * E.g. mwstore://local-backend/local-public/a/ab/<name>.jpg
+        * => mwstore://local-backend/local-original/x/y/z/<sha1>.jpg
+        *
+        * @param array $paths
+        * @param bool $latest
+        * @return array Translated paths in same order
+        */
+       public function getBackendPaths( array $paths, $latest = true ) {
+               $db = $this->getDB( $latest ? DB_MASTER : DB_SLAVE );
+               $origBasePath = $this->backend->getContainerStoragePath( "{$this->repoName}-original" );
+
+               // @TODO: batching
+               $resolved = array();
+               foreach ( $paths as $i => $path ) {
+                       if ( !$latest && $this->resolvedPathCache->has( $path, 'target', 10 ) ) {
+                               $resolved[$i] = $this->resolvedPathCache->get( $path, 'target' );
+                               continue;
+                       }
+
+                       list( , $container, $rel ) = FileBackend::splitStoragePath( $path );
+
+                       if ( $container === "{$this->repoName}-public" ) {
+                               $name = basename( $path );
+                               if ( strpos( $path, '!' ) !== false ) {
+                                       $sha1 = $db->selectField( 'oldimage', 'oi_sha1',
+                                               array( 'oi_archive_name' => $name ),
+                                               __METHOD__
+                                       );
+                               } else {
+                                       $sha1 = $db->selectField( 'image', 'img_sha1',
+                                               array( 'img_name' => $name ),
+                                               __METHOD__
+                                       );
+                               }
+                               if ( !strlen( $sha1 ) ) {
+                                       $resolved[$i] = $path; // give up
+                                       continue;
+                               }
+                               $resolved[$i] = $this->getPathForSHA1( $sha1 );
+                               $this->resolvedPathCache->set( $path, 'target', $resolved[$i] );
+                       } elseif ( $container === "{$this->repoName}-deleted" ) {
+                               $name = basename( $path ); // <hash>.<ext>
+                               $sha1 = substr( $name, 0, strpos( $name, '.' ) ); // ignore extension
+                               $resolved[$i] = $this->getPathForSHA1( $sha1 );
+                               $this->resolvedPathCache->set( $path, 'target', $resolved[$i] );
+                       } else {
+                               $resolved[$i] = $path;
+                       }
+               }
+
+               $res = array();
+               foreach ( $paths as $i => $path ) {
+                       $res[$i] = $resolved[$i];
+               }
+
+               return $res;
+       }
+
+       protected function doOperationsInternal( array $ops, array $opts ) {
+               return $this->backend->doOperationsInternal( $this->mungeOpPaths( $ops ), $opts );
+       }
+
+       protected function doQuickOperationsInternal( array $ops ) {
+               return $this->backend->doQuickOperationsInternal( $this->mungeOpPaths( $ops ) );
+       }
+
+       protected function doPrepare( array $params ) {
+               return $this->backend->doPrepare( $params );
+       }
+
+       protected function doSecure( array $params ) {
+               return $this->backend->doSecure( $params );
+       }
+
+       protected function doPublish( array $params ) {
+               return $this->backend->doPublish( $params );
+       }
+
+       protected function doClean( array $params ) {
+               return $this->backend->doClean( $params );
+       }
+
+       public function concatenate( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function fileExists( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function getFileTimestamp( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function getFileSize( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function getFileStat( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function getFileXAttributes( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function getFileSha1Base36( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function getFileProps( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function streamFile( array $params ) {
+               // The stream methods use the file extension to determine the
+               // Content-Type (as MediaWiki should already validate it on upload).
+               // The translated SHA1 path has no extension, so this needs to use
+               // the untranslated path extension.
+               $type = StreamFile::contentTypeFromPath( $params['src'] );
+               if ( $type && $type != 'unknown/unknown' ) {
+                       $params['headers'][] = "Content-type: $type";
+               }
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function getFileContentsMulti( array $params ) {
+               return $this->translateArrayResults( __FUNCTION__, $params );
+       }
+
+       public function getLocalReferenceMulti( array $params ) {
+               return $this->translateArrayResults( __FUNCTION__, $params );
+       }
+
+       public function getLocalCopyMulti( array $params ) {
+               return $this->translateArrayResults( __FUNCTION__, $params );
+       }
+
+       public function getFileHttpUrl( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function directoryExists( array $params ) {
+               return $this->backend->directoryExists( $params );
+       }
+
+       public function getDirectoryList( array $params ) {
+               return $this->backend->getDirectoryList( $params );
+       }
+
+       public function getFileList( array $params ) {
+               return $this->backend->getFileList( $params );
+       }
+
+       public function getFeatures() {
+               return $this->backend->getFeatures();
+       }
+
+       public function clearCache( array $paths = null ) {
+               $this->backend->clearCache( null ); // clear all
+       }
+
+       public function preloadCache( array $paths ) {
+               $paths = $this->getBackendPaths( $paths );
+               $this->backend->preloadCache( $paths );
+       }
+
+       public function preloadFileStat( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function getScopedLocksForOps( array $ops, Status $status ) {
+               return $this->backend->getScopedFileLocks( $ops, $status );
+       }
+
+       /**
+        * Get the ultimate original storage path for a file
+        *
+        * Use this when putting a new file into the system
+        *
+        * @param string $sha1 File SHA-1 base36
+        * @return string
+        */
+       public function getPathForSHA1( $sha1 ) {
+               if ( strlen( $sha1 ) < 3 ) {
+                       throw new MWException( "Invalid file SHA-1." );
+               }
+               return $this->backend->getContainerStoragePath( "{$this->repoName}-original" ) .
+                       "/{$sha1[0]}/{$sha1[1]}/{$sha1[2]}/{$sha1}";
+       }
+
+       /**
+        * Get a connection to the repo file registry DB
+        *
+        * @param integer $index
+        * @return DBConnRef
+        */
+       protected function getDB( $index ) {
+               if ( !isset( $this->db[$index] ) ) {
+                       $func = $this->dbHandleFunc;
+                       $this->db[$index] = $func( $index );
+               }
+               return $this->db[$index];
+       }
+
+       /**
+        * Translates paths found in the "src" or "srcs" keys of a params array
+        *
+        * @param string $function
+        * @param array $params
+        */
+       protected function translateSrcParams( $function, array $params ) {
+               $latest = !empty( $params['latest'] );
+
+               if ( isset( $params['src'] ) ) {
+                       $params['src'] = $this->getBackendPath( $params['src'], $latest );
+               }
+
+               if ( isset( $params['srcs'] ) ) {
+                       $params['srcs'] = $this->getBackendPaths( $params['srcs'], $latest );
+               }
+
+               return $this->backend->$function( $params );
+       }
+
+       /**
+        * Translates paths when the backend function returns results keyed by paths
+        *
+        * @param string $function
+        * @param array $params
+        * @return array
+        */
+       protected function translateArrayResults( $function, array $params ) {
+               $origPaths = $params['srcs'];
+               $params['srcs'] = $this->getBackendPaths( $params['srcs'], !empty( $params['latest'] ) );
+               $pathMap = array_combine( $params['srcs'], $origPaths );
+
+               $results = $this->backend->$function( $params );
+
+               $contents = array();
+               foreach ( $results as $path => $result ) {
+                       $contents[$pathMap[$path]] = $result;
+               }
+
+               return $contents;
+       }
+
+       /**
+        * Translate legacy "title" source paths to their "sha1" counterparts
+        *
+        * This leaves destination paths alone since we don't want those to mutate
+        *
+        * @param array $ops
+        * @return array
+        */
+       protected function mungeOpPaths( array $ops ) {
+               // Ops that use 'src' and do not mutate core file data there
+               static $srcRefOps = array( 'store', 'copy', 'describe' );
+               foreach ( $ops as &$op ) {
+                       if ( isset( $op['src'] ) && in_array( $op['op'], $srcRefOps ) ) {
+                               $op['src'] = $this->getBackendPath( $op['src'], true );
+                       }
+                       if ( isset( $op['srcs'] ) ) {
+                               $op['srcs'] = $this->getBackendPaths( $op['srcs'], true );
+                       }
+               }
+               return $ops;
+       }
+}
index 82bbd76..7370c5c 100644 (file)
@@ -49,6 +49,9 @@ class FileRepo {
        /** @var int */
        public $descriptionCacheExpiry;
 
+       /** @var bool */
+       protected $hasSha1Storage = false;
+
        /** @var FileBackend */
        protected $backend;
 
@@ -1885,6 +1888,14 @@ class FileRepo {
 
                return $ret;
        }
+
+       /**
+        * Returns whether or not storage is SHA-1 based
+        * @return boolean
+        */
+       public function hasSha1Storage() {
+               return $this->hasSha1Storage;
+       }
 }
 
 /**
index 6e9e6ad..dfdb375 100644 (file)
@@ -76,17 +76,8 @@ class ForeignDBRepo extends LocalRepo {
         */
        function getMasterDB() {
                if ( !isset( $this->dbConn ) ) {
-                       $this->dbConn = DatabaseBase::factory( $this->dbType,
-                               array(
-                                       'host' => $this->dbServer,
-                                       'user' => $this->dbUser,
-                                       'password' => $this->dbPassword,
-                                       'dbname' => $this->dbName,
-                                       'flags' => $this->dbFlags,
-                                       'tablePrefix' => $this->tablePrefix,
-                                       'foreign' => true,
-                               )
-                       );
+                       $func = $this->getDBFactory();
+                       $this->dbConn = $func( DB_MASTER );
                }
 
                return $this->dbConn;
@@ -99,6 +90,25 @@ class ForeignDBRepo extends LocalRepo {
                return $this->getMasterDB();
        }
 
+       /**
+        * @return Closure
+        */
+       protected function getDBFactory() {
+               return function( $index ) {
+                       return DatabaseBase::factory( $this->dbType,
+                               array(
+                                       'host' => $this->dbServer,
+                                       'user' => $this->dbUser,
+                                       'password' => $this->dbPassword,
+                                       'dbname' => $this->dbName,
+                                       'flags' => $this->dbFlags,
+                                       'tablePrefix' => $this->tablePrefix,
+                                       'foreign' => true,
+                               )
+                       );
+               };
+       }
+
        /**
         * @return bool
         */
index 8153ffb..f49b716 100644 (file)
@@ -66,6 +66,16 @@ class ForeignDBViaLBRepo extends LocalRepo {
                return wfGetDB( DB_SLAVE, array(), $this->wiki );
        }
 
+       /**
+        * @return Closure
+        */
+       protected function getDBFactory() {
+               $wiki = $this->wiki;
+               return function( $index ) use ( $wiki ) {
+                       return wfGetDB( $index, array(), $wiki );
+               };
+       }
+
        function hasSharedCache() {
                return $this->hasSharedCache;
        }
index 800a230..1852912 100644 (file)
@@ -29,6 +29,9 @@
  * @ingroup FileRepo
  */
 class LocalRepo extends FileRepo {
+       /** @var bool */
+       protected $hasSha1Storage = false;
+
        /** @var array */
        protected $fileFactory = array( 'LocalFile', 'newFromTitle' );
 
@@ -47,6 +50,20 @@ class LocalRepo extends FileRepo {
        /** @var array */
        protected $oldFileFactoryKey = array( 'OldLocalFile', 'newFromKey' );
 
+       function __construct( array $info = null ) {
+               parent::__construct( $info );
+
+               $this->hasSha1Storage = isset( $info['storageLayout'] ) && $info['storageLayout'] === 'sha1';
+
+               if ( $this->hasSha1Storage() ) {
+                       $this->backend = new FileBackendDBRepoWrapper( array(
+                               'backend'         => $this->backend,
+                               'repoName'        => $this->name,
+                               'dbHandleFactory' => $this->getDBFactory()
+                       ) );
+               }
+       }
+
        /**
         * @throws MWException
         * @param stdClass $row
@@ -82,6 +99,11 @@ class LocalRepo extends FileRepo {
         * @return FileRepoStatus
         */
        function cleanupDeletedBatch( array $storageKeys ) {
+               if ( $this->hasSha1Storage() ) {
+                       wfDebug( __METHOD__ . ": skipped because storage uses sha1 paths\n" );
+                       return Status::newGood();
+               }
+
                $backend = $this->backend; // convenience
                $root = $this->getZonePath( 'deleted' );
                $dbw = $this->getMasterDB();
@@ -469,6 +491,16 @@ class LocalRepo extends FileRepo {
                return wfGetDB( DB_MASTER );
        }
 
+       /**
+        * Get a callback to get a DB handle given an index (DB_SLAVE/DB_MASTER)
+        * @return Closure
+        */
+       protected function getDBFactory() {
+               return function( $index ) {
+                       return wfGetDB( $index );
+               };
+       }
+
        /**
         * Get a key on the primary cache for this repository.
         * Returns false if the repository's cache is not accessible at this site.
@@ -514,4 +546,56 @@ class LocalRepo extends FileRepo {
                        'favicon' => wfExpandUrl( $wgFavicon ),
                ) );
        }
+
+       public function store( $srcPath, $dstZone, $dstRel, $flags = 0 ) {
+               return $this->skipWriteOperationIfSha1( __FUNCTION__, func_get_args() );
+       }
+
+       public function storeBatch( array $triplets, $flags = 0 ) {
+               return $this->skipWriteOperationIfSha1( __FUNCTION__, func_get_args() );
+       }
+
+       public function cleanupBatch( array $files, $flags = 0 ) {
+               return $this->skipWriteOperationIfSha1( __FUNCTION__, func_get_args() );
+       }
+
+       public function publish(
+               $srcPath,
+               $dstRel,
+               $archiveRel,
+               $flags = 0,
+               array $options = array()
+       ) {
+               return $this->skipWriteOperationIfSha1( __FUNCTION__, func_get_args() );
+       }
+
+       public function publishBatch( array $ntuples, $flags = 0 ) {
+               return $this->skipWriteOperationIfSha1( __FUNCTION__, func_get_args() );
+       }
+
+       public function delete( $srcRel, $archiveRel ) {
+               return $this->skipWriteOperationIfSha1( __FUNCTION__, func_get_args() );
+       }
+
+       public function deleteBatch( array $sourceDestPairs ) {
+               return $this->skipWriteOperationIfSha1( __FUNCTION__, func_get_args() );
+       }
+
+       /**
+        * Skips the write operation if storage is sha1-based, executes it normally otherwise
+        *
+        * @param string $function
+        * @param array $args
+        * @return FileRepoStatus
+        */
+       protected function skipWriteOperationIfSha1( $function, array $args ) {
+               $this->assertWritableRepo(); // fail out if read-only
+
+               if ( $this->hasSha1Storage() ) {
+                       wfDebug( __METHOD__ . ": skipped because storage uses sha1 paths\n" );
+                       return Status::newGood();
+               } else {
+                       return call_user_func_array('parent::' . $function, $args );
+               }
+       }
 }
index f9e1128..72b3ae9 100644 (file)
@@ -1149,6 +1149,8 @@ abstract class File implements IDBAccessObject {
                        Hooks::run( 'FileTransformed', array( $this, $thumb, $tmpThumbPath, $thumbPath ) );
                }
 
+               wfDebugLog( 'thumbnailaccess', time() . ' ' . $thumbPath . ' ' . filesize( $tmpThumbPath ) . ' Generated ' );
+
                return $thumb;
        }
 
index 6abe00c..4070553 100644 (file)
@@ -1459,7 +1459,7 @@ class LocalFile extends File {
         * The archive name should be passed through to recordUpload for database
         * registration.
         *
-        * @param string $srcPath Local filesystem path to the source image
+        * @param string $srcPath Local filesystem path or virtual URL to the source image
         * @param int $flags A bitwise combination of:
         *     File::DELETE_SOURCE    Delete the source file, i.e. move rather than copy
         * @param array $options Optional additional parameters
@@ -1477,7 +1477,7 @@ class LocalFile extends File {
         * The archive name should be passed through to recordUpload for database
         * registration.
         *
-        * @param string $srcPath Local filesystem path to the source image
+        * @param string $srcPath Local filesystem path or virtual URL to the source image
         * @param string $dstRel Target relative path
         * @param int $flags A bitwise combination of:
         *     File::DELETE_SOURCE    Delete the source file, i.e. move rather than copy
@@ -1486,7 +1486,8 @@ class LocalFile extends File {
         *     archive name, or an empty string if it was a new file.
         */
        function publishTo( $srcPath, $dstRel, $flags = 0, array $options = array() ) {
-               if ( $this->getRepo()->getReadOnlyReason() !== false ) {
+               $repo = $this->getRepo();
+               if ( $repo->getReadOnlyReason() !== false ) {
                        return $this->readOnlyFatalStatus();
                }
 
@@ -1494,13 +1495,29 @@ class LocalFile extends File {
 
                $archiveName = wfTimestamp( TS_MW ) . '!' . $this->getName();
                $archiveRel = 'archive/' . $this->getHashPath() . $archiveName;
-               $flags = $flags & File::DELETE_SOURCE ? LocalRepo::DELETE_SOURCE : 0;
-               $status = $this->repo->publish( $srcPath, $dstRel, $archiveRel, $flags, $options );
 
-               if ( $status->value == 'new' ) {
-                       $status->value = '';
+               if ( $repo->hasSha1Storage() ) {
+                       $sha1 = $repo->isVirtualUrl( $srcPath )
+                               ? $repo->getFileSha1( $srcPath )
+                               : File::sha1Base36( $srcPath );
+                       $dst = $repo->getBackend()->getPathForSHA1( $sha1 );
+                       $status = $repo->quickImport( $srcPath, $dst );
+                       if ( $flags & File::DELETE_SOURCE ) {
+                               unlink( $srcPath );
+                       }
+
+                       if ( $this->exists() ) {
+                               $status->value = $archiveName;
+                       }
                } else {
-                       $status->value = $archiveName;
+                       $flags = $flags & File::DELETE_SOURCE ? LocalRepo::DELETE_SOURCE : 0;
+                       $status = $repo->publish( $srcPath, $dstRel, $archiveRel, $flags, $options );
+
+                       if ( $status->value == 'new' ) {
+                               $status->value = '';
+                       } else {
+                               $status->value = $archiveName;
+                       }
                }
 
                $this->unlock(); // done
@@ -1941,14 +1958,14 @@ class LocalFileDeleteBatch {
                $this->status = $file->repo->newGood();
        }
 
-       function addCurrent() {
+       public function addCurrent() {
                $this->srcRels['.'] = $this->file->getRel();
        }
 
        /**
         * @param string $oldName
         */
-       function addOld( $oldName ) {
+       public function addOld( $oldName ) {
                $this->srcRels[$oldName] = $this->file->getArchiveRel( $oldName );
                $this->archiveUrls[] = $this->file->getArchiveUrl( $oldName );
        }
@@ -1957,7 +1974,7 @@ class LocalFileDeleteBatch {
         * Add the old versions of the image to the batch
         * @return array List of archive names from old versions
         */
-       function addOlds() {
+       public function addOlds() {
                $archiveNames = array();
 
                $dbw = $this->file->repo->getMasterDB();
@@ -1978,7 +1995,7 @@ class LocalFileDeleteBatch {
        /**
         * @return array
         */
-       function getOldRels() {
+       protected function getOldRels() {
                if ( !isset( $this->srcRels['.'] ) ) {
                        $oldRels =& $this->srcRels;
                        $deleteCurrent = false;
@@ -2050,7 +2067,7 @@ class LocalFileDeleteBatch {
                return $hashes;
        }
 
-       function doDBInserts() {
+       protected function doDBInserts() {
                $dbw = $this->file->repo->getMasterDB();
                $encTimestamp = $dbw->addQuotes( $dbw->timestamp() );
                $encUserId = $dbw->addQuotes( $this->user->getId() );
@@ -2165,8 +2182,8 @@ class LocalFileDeleteBatch {
         * Run the transaction
         * @return FileRepoStatus
         */
-       function execute() {
-
+       public function execute() {
+               $repo = $this->file->getRepo();
                $this->file->lock();
 
                // Prepare deletion batch
@@ -2180,7 +2197,7 @@ class LocalFileDeleteBatch {
                        if ( isset( $hashes[$name] ) ) {
                                $hash = $hashes[$name];
                                $key = $hash . $dotExt;
-                               $dstRel = $this->file->repo->getDeletedHashPath( $key ) . $key;
+                               $dstRel = $repo->getDeletedHashPath( $key ) . $key;
                                $this->deletionBatch[$name] = array( $srcRel, $dstRel );
                        }
                }
@@ -2193,20 +2210,22 @@ class LocalFileDeleteBatch {
                // them in a separate transaction, then run the file ops, then update the fa_name fields.
                $this->doDBInserts();
 
-               // Removes non-existent file from the batch, so we don't get errors.
-               // This also handles files in the 'deleted' zone deleted via revision deletion.
-               $checkStatus = $this->removeNonexistentFiles( $this->deletionBatch );
-               if ( !$checkStatus->isGood() ) {
-                       $this->status->merge( $checkStatus );
-                       return $this->status;
-               }
-               $this->deletionBatch = $checkStatus->value;
+               if ( !$repo->hasSha1Storage() ) {
+                       // Removes non-existent file from the batch, so we don't get errors.
+                       // This also handles files in the 'deleted' zone deleted via revision deletion.
+                       $checkStatus = $this->removeNonexistentFiles( $this->deletionBatch );
+                       if ( !$checkStatus->isGood() ) {
+                               $this->status->merge( $checkStatus );
+                               return $this->status;
+                       }
+                       $this->deletionBatch = $checkStatus->value;
 
-               // Execute the file deletion batch
-               $status = $this->file->repo->deleteBatch( $this->deletionBatch );
+                       // Execute the file deletion batch
+                       $status = $this->file->repo->deleteBatch( $this->deletionBatch );
 
-               if ( !$status->isGood() ) {
-                       $this->status->merge( $status );
+                       if ( !$status->isGood() ) {
+                               $this->status->merge( $status );
+                       }
                }
 
                if ( !$this->status->isOK() ) {
@@ -2232,7 +2251,7 @@ class LocalFileDeleteBatch {
         * @param array $batch
         * @return Status
         */
-       function removeNonexistentFiles( $batch ) {
+       protected function removeNonexistentFiles( $batch ) {
                $files = $newBatch = array();
 
                foreach ( $batch as $batchItem ) {
@@ -2293,7 +2312,7 @@ class LocalFileRestoreBatch {
         * Add a file by ID
         * @param int $fa_id
         */
-       function addId( $fa_id ) {
+       public function addId( $fa_id ) {
                $this->ids[] = $fa_id;
        }
 
@@ -2301,14 +2320,14 @@ class LocalFileRestoreBatch {
         * Add a whole lot of files by ID
         * @param int[] $ids
         */
-       function addIds( $ids ) {
+       public function addIds( $ids ) {
                $this->ids = array_merge( $this->ids, $ids );
        }
 
        /**
         * Add all revisions of the file
         */
-       function addAll() {
+       public function addAll() {
                $this->all = true;
        }
 
@@ -2320,12 +2339,13 @@ class LocalFileRestoreBatch {
         * So we save the batch and let the caller call cleanup()
         * @return FileRepoStatus
         */
-       function execute() {
+       public function execute() {
                global $wgLang;
 
+               $repo = $this->file->getRepo();
                if ( !$this->all && !$this->ids ) {
                        // Do nothing
-                       return $this->file->repo->newGood();
+                       return $repo->newGood();
                }
 
                $lockOwnsTrx = $this->file->lock();
@@ -2382,9 +2402,9 @@ class LocalFileRestoreBatch {
                                continue;
                        }
 
-                       $deletedRel = $this->file->repo->getDeletedHashPath( $row->fa_storage_key ) .
+                       $deletedRel = $repo->getDeletedHashPath( $row->fa_storage_key ) .
                                $row->fa_storage_key;
-                       $deletedUrl = $this->file->repo->getVirtualUrl() . '/deleted/' . $deletedRel;
+                       $deletedUrl = $repo->getVirtualUrl() . '/deleted/' . $deletedRel;
 
                        if ( isset( $row->fa_sha1 ) ) {
                                $sha1 = $row->fa_sha1;
@@ -2498,27 +2518,29 @@ class LocalFileRestoreBatch {
                        $status->error( 'undelete-missing-filearchive', $id );
                }
 
-               // Remove missing files from batch, so we don't get errors when undeleting them
-               $checkStatus = $this->removeNonexistentFiles( $storeBatch );
-               if ( !$checkStatus->isGood() ) {
-                       $status->merge( $checkStatus );
-                       return $status;
-               }
-               $storeBatch = $checkStatus->value;
+               if ( !$repo->hasSha1Storage() ) {
+                       // Remove missing files from batch, so we don't get errors when undeleting them
+                       $checkStatus = $this->removeNonexistentFiles( $storeBatch );
+                       if ( !$checkStatus->isGood() ) {
+                               $status->merge( $checkStatus );
+                               return $status;
+                       }
+                       $storeBatch = $checkStatus->value;
 
-               // Run the store batch
-               // Use the OVERWRITE_SAME flag to smooth over a common error
-               $storeStatus = $this->file->repo->storeBatch( $storeBatch, FileRepo::OVERWRITE_SAME );
-               $status->merge( $storeStatus );
+                       // Run the store batch
+                       // Use the OVERWRITE_SAME flag to smooth over a common error
+                       $storeStatus = $this->file->repo->storeBatch( $storeBatch, FileRepo::OVERWRITE_SAME );
+                       $status->merge( $storeStatus );
 
-               if ( !$status->isGood() ) {
-                       // Even if some files could be copied, fail entirely as that is the
-                       // easiest thing to do without data loss
-                       $this->cleanupFailedBatch( $storeStatus, $storeBatch );
-                       $status->ok = false;
-                       $this->file->unlock();
+                       if ( !$status->isGood() ) {
+                               // Even if some files could be copied, fail entirely as that is the
+                               // easiest thing to do without data loss
+                               $this->cleanupFailedBatch( $storeStatus, $storeBatch );
+                               $status->ok = false;
+                               $this->file->unlock();
 
-                       return $status;
+                               return $status;
+                       }
                }
 
                // Run the DB updates
@@ -2542,7 +2564,7 @@ class LocalFileRestoreBatch {
                }
 
                // If store batch is empty (all files are missing), deletion is to be considered successful
-               if ( $status->successCount > 0 || !$storeBatch ) {
+               if ( $status->successCount > 0 || !$storeBatch || $repo->hasSha1Storage() ) {
                        if ( !$exists ) {
                                wfDebug( __METHOD__ . " restored {$status->successCount} items, creating a new current\n" );
 
@@ -2565,7 +2587,7 @@ class LocalFileRestoreBatch {
         * @param array $triplets
         * @return Status
         */
-       function removeNonexistentFiles( $triplets ) {
+       protected function removeNonexistentFiles( $triplets ) {
                $files = $filteredTriplets = array();
                foreach ( $triplets as $file ) {
                        $files[$file[0]] = $file[0];
@@ -2591,7 +2613,7 @@ class LocalFileRestoreBatch {
         * @param array $batch
         * @return array
         */
-       function removeNonexistentFromCleanup( $batch ) {
+       protected function removeNonexistentFromCleanup( $batch ) {
                $files = $newBatch = array();
                $repo = $this->file->repo;
 
@@ -2616,7 +2638,7 @@ class LocalFileRestoreBatch {
         * This should be called from outside the transaction in which execute() was called.
         * @return FileRepoStatus
         */
-       function cleanup() {
+       public function cleanup() {
                if ( !$this->cleanupBatch ) {
                        return $this->file->repo->newGood();
                }
@@ -2635,7 +2657,7 @@ class LocalFileRestoreBatch {
         * @param Status $storeStatus
         * @param array $storeBatch
         */
-       function cleanupFailedBatch( $storeStatus, $storeBatch ) {
+       protected function cleanupFailedBatch( $storeStatus, $storeBatch ) {
                $cleanupBatch = array();
 
                foreach ( $storeStatus->success as $i => $success ) {
@@ -2693,7 +2715,7 @@ class LocalFileMoveBatch {
        /**
         * Add the current image to the batch
         */
-       function addCurrent() {
+       public function addCurrent() {
                $this->cur = array( $this->oldRel, $this->newRel );
        }
 
@@ -2701,7 +2723,7 @@ class LocalFileMoveBatch {
         * Add the old versions of the image to the batch
         * @return array List of archive names from old versions
         */
-       function addOlds() {
+       public function addOlds() {
                $archiveBase = 'archive';
                $this->olds = array();
                $this->oldCount = 0;
@@ -2751,7 +2773,7 @@ class LocalFileMoveBatch {
         * Perform the move.
         * @return FileRepoStatus
         */
-       function execute() {
+       public function execute() {
                $repo = $this->file->repo;
                $status = $repo->newGood();
 
@@ -2782,22 +2804,26 @@ class LocalFileMoveBatch {
                wfDebugLog( 'imagemove', "Renamed {$this->file->getName()} in database: " .
                        "{$statusDb->successCount} successes, {$statusDb->failCount} failures" );
 
-               // Copy the files into their new location.
-               // If a prior process fataled copying or cleaning up files we tolerate any
-               // of the existing files if they are identical to the ones being stored.
-               $statusMove = $repo->storeBatch( $triplets, FileRepo::OVERWRITE_SAME );
-               wfDebugLog( 'imagemove', "Moved files for {$this->file->getName()}: " .
-                       "{$statusMove->successCount} successes, {$statusMove->failCount} failures" );
-               if ( !$statusMove->isGood() ) {
-                       // Delete any files copied over (while the destination is still locked)
-                       $this->cleanupTarget( $triplets );
-                       $destFile->unlock();
-                       $this->file->unlockAndRollback(); // unlocks the destination
-                       wfDebugLog( 'imagemove', "Error in moving files: " . $statusMove->getWikiText() );
-                       $statusMove->ok = false;
-
-                       return $statusMove;
+               if ( !$repo->hasSha1Storage() ) {
+                       // Copy the files into their new location.
+                       // If a prior process fataled copying or cleaning up files we tolerate any
+                       // of the existing files if they are identical to the ones being stored.
+                       $statusMove = $repo->storeBatch( $triplets, FileRepo::OVERWRITE_SAME );
+                       wfDebugLog( 'imagemove', "Moved files for {$this->file->getName()}: " .
+                               "{$statusMove->successCount} successes, {$statusMove->failCount} failures" );
+                       if ( !$statusMove->isGood() ) {
+                               // Delete any files copied over (while the destination is still locked)
+                               $this->cleanupTarget( $triplets );
+                               $destFile->unlock();
+                               $this->file->unlockAndRollback(); // unlocks the destination
+                               wfDebugLog( 'imagemove', "Error in moving files: " . $statusMove->getWikiText() );
+                               $statusMove->ok = false;
+
+                               return $statusMove;
+                       }
+                       $status->merge( $statusMove );
                }
+
                $destFile->unlock();
                $this->file->unlock(); // done
 
@@ -2805,7 +2831,6 @@ class LocalFileMoveBatch {
                $this->cleanupSource( $triplets );
 
                $status->merge( $statusDb );
-               $status->merge( $statusMove );
 
                return $status;
        }
@@ -2816,7 +2841,7 @@ class LocalFileMoveBatch {
         *
         * @return FileRepoStatus
         */
-       function doDBUpdates() {
+       protected function doDBUpdates() {
                $repo = $this->file->repo;
                $status = $repo->newGood();
                $dbw = $this->db;
@@ -2868,7 +2893,7 @@ class LocalFileMoveBatch {
         * Generate triplets for FileRepo::storeBatch().
         * @return array
         */
-       function getMoveTriplets() {
+       protected function getMoveTriplets() {
                $moves = array_merge( array( $this->cur ), $this->olds );
                $triplets = array(); // The format is: (srcUrl, destZone, destUrl)
 
@@ -2890,7 +2915,7 @@ class LocalFileMoveBatch {
         * @param array $triplets
         * @return Status
         */
-       function removeNonexistentFiles( $triplets ) {
+       protected function removeNonexistentFiles( $triplets ) {
                $files = array();
 
                foreach ( $triplets as $file ) {
@@ -2920,7 +2945,7 @@ class LocalFileMoveBatch {
         * files. Called if something went wrong half way.
         * @param array $triplets
         */
-       function cleanupTarget( $triplets ) {
+       protected function cleanupTarget( $triplets ) {
                // Create dest pairs from the triplets
                $pairs = array();
                foreach ( $triplets as $triplet ) {
@@ -2936,7 +2961,7 @@ class LocalFileMoveBatch {
         * Called at the end of the move process if everything else went ok.
         * @param array $triplets
         */
-       function cleanupSource( $triplets ) {
+       protected function cleanupSource( $triplets ) {
                // Create source file names from the triplets
                $files = array();
                foreach ( $triplets as $triplet ) {
index 8d7aec3..b0b08a6 100644 (file)
@@ -44,7 +44,7 @@ class HTMLButtonField extends HTMLFormField {
        /**
         * Get the OOUI widget for this field.
         * @param string $value
-        * @return OOUI\ButtonInputWidget
+        * @return OOUI\\ButtonInputWidget
         */
        public function getInputOOUI( $value ) {
                return new OOUI\ButtonInputWidget( array(
index 55312ff..9666c4e 100644 (file)
@@ -45,7 +45,7 @@ class HTMLCheckField extends HTMLFormField {
         * Get the OOUI version of this field.
         * @since 1.26
         * @param string $value
-        * @return OOUI\CheckboxInputWidget The checkbox widget.
+        * @return OOUI\\CheckboxInputWidget The checkbox widget.
         */
        public function getInputOOUI( $value ) {
                if ( !empty( $this->mParams['invert'] ) ) {
index d49963d..48cc828 100644 (file)
@@ -154,6 +154,7 @@ class HTMLForm extends ContextSource {
                'password' => 'HTMLTextField',
                'url' => 'HTMLTextField',
                'title' => 'HTMLTitleTextField',
+               'user' => 'HTMLUserTextField',
        );
 
        public $mFieldData;
@@ -166,7 +167,7 @@ class HTMLForm extends ContextSource {
        protected $mFieldTree;
        protected $mShowReset = false;
        protected $mShowSubmit = true;
-       protected $mSubmitFlag = 'constructive';
+       protected $mSubmitFlags = array( 'constructive', 'primary' );
 
        protected $mSubmitCallback;
        protected $mValidationErrorMessage;
@@ -974,7 +975,10 @@ class HTMLForm extends ContextSource {
                        $attribs['class'] = array( 'mw-htmlform-submit' );
 
                        if ( $useMediaWikiUIEverywhere ) {
-                               array_push( $attribs['class'], 'mw-ui-button', 'mw-ui-' . $this->mSubmitFlag );
+                               foreach ( $this->mSubmitFlags as $flag ) {
+                                       array_push( $attribs['class'], 'mw-ui-' . $flag );
+                               }
+                               array_push( $attribs['class'], 'mw-ui-button' );
                        }
 
                        $buttons .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
@@ -1101,7 +1105,7 @@ class HTMLForm extends ContextSource {
         * @since 1.24
         */
        public function setSubmitDestructive() {
-               $this->mSubmitFlag = 'destructive';
+               $this->mSubmitFlags = array( 'destructive', 'primary' );
        }
 
        /**
@@ -1109,7 +1113,7 @@ class HTMLForm extends ContextSource {
         * @since 1.25
         */
        public function setSubmitProgressive() {
-               $this->mSubmitFlag = 'progressive';
+               $this->mSubmitFlags = array( 'progressive', 'primary' );
        }
 
        /**
index 70615d9..1d8137e 100644 (file)
@@ -49,7 +49,7 @@ abstract class HTMLFormField {
         * Defaults to false, which getOOUI will interpret as "use the HTML version"
         *
         * @param string $value
-        * @return OOUI\Widget|false
+        * @return OOUI\\Widget|false
         */
        function getInputOOUI( $value ) {
                return false;
@@ -582,13 +582,14 @@ abstract class HTMLFormField {
 
                $fieldType = get_class( $this );
                $helpText = $this->getHelpText();
-               $field = new OOUI\FieldLayout( $inputField, array(
+               $config = array(
                        'classes' => array( "mw-htmlform-field-$fieldType", $this->mClass, $errorClass ),
                        'align' => $this->getLabelAlignOOUI(),
                        'label' => $this->getLabel(),
                        'help' => $helpText !== null ? new OOUI\HtmlSnippet( $helpText ) : null,
                        'infusable' => $infusable,
-               ) );
+               );
+               $field = $this->getFieldLayoutOOUI( $inputField, $config );
 
                return $field . $errors;
        }
@@ -601,6 +602,18 @@ abstract class HTMLFormField {
                return 'top';
        }
 
+       /**
+        * Get a FieldLayout (or subclass thereof) to wrap this field in when using OOUI output.
+        * @return OOUI\\FieldLayout|OOUI\\ActionFieldLayout
+        */
+       protected function getFieldLayoutOOUI( $inputField, $config ) {
+               if ( isset( $this->mClassWithButton ) ) {
+                       $buttonWidget = $this->mClassWithButton->getInputOOUI( '' );
+                       return new OOUI\ActionFieldLayout( $inputField, $buttonWidget, $config );
+               }
+               return new OOUI\FieldLayout( $inputField, $config );
+       }
+
        /**
         * Get the complete raw fields for the input, including help text,
         * labels, and whatever.
@@ -874,7 +887,7 @@ abstract class HTMLFormField {
         * @return array Attributes
         */
        public function getAttributes( array $list, array $mappings = null ) {
-               static $boolAttribs = array( 'disabled', 'required', 'autofocus', 'multiple', 'readonly' );
+               static $boolAttribs = array( 'disabled', 'required', 'multiple', 'readonly' );
 
                $ret = array();
                foreach ( $list as $key ) {
index 113bb4b..6b02c49 100644 (file)
@@ -18,6 +18,9 @@ class HTMLFormFieldWithButton extends HTMLFormField {
        /** @var string $mButtonType Value for the button in this field */
        protected $mButtonValue;
 
+       /** @var string $mButtonType Value for the button in this field */
+       protected $mButtonFlags = array( 'primary', 'progressive' );
+
        public function __construct( $info ) {
                if ( isset( $info['buttonclass'] ) ) {
                        $this->mButtonClass = $info['buttonclass'];
@@ -34,6 +37,9 @@ class HTMLFormFieldWithButton extends HTMLFormField {
                if ( isset( $info['buttontype'] ) ) {
                        $this->mButtonType = $info['buttontype'];
                }
+               if ( isset( $info['buttonflags'] ) ) {
+                       $this->mButtonFlags = $info['buttonflags'];
+               }
                parent::__construct( $info );
        }
 
@@ -46,6 +52,16 @@ class HTMLFormFieldWithButton extends HTMLFormField {
                return Html::input( $this->mButtonName, $this->mButtonValue, $this->mButtonType, $attr );
        }
 
+       public function getInputOOUI( $value ) {
+               return new OOUI\ButtonInputWidget( array(
+                       'name' => $this->mButtonName,
+                       'value' => $this->mButtonValue,
+                       'type' => $this->mButtonType,
+                       'label' => $this->mButtonValue,
+                       'flags' => $this->mButtonFlags,
+               ) );
+       }
+
        /**
         * Combines the passed element with a button.
         * @param String $element Element to combine the button with.
diff --git a/includes/htmlform/HTMLUserTextField.php b/includes/htmlform/HTMLUserTextField.php
new file mode 100644 (file)
index 0000000..949fefd
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+
+use MediaWiki\Widget\UserInputWidget;
+
+/**
+ * Implements a text input field for user names.
+ * Automatically auto-completes if using the OOUI display format.
+ *
+ * FIXME: Does not work for forms that support GET requests.
+ *
+ * Optional parameters:
+ * 'exists' - Whether to validate that the user already exists
+ *
+ * @since 1.26
+ */
+class HTMLUserTextField extends HTMLTextField {
+       public function __construct( $params ) {
+               $params += array(
+                       'exists' => false,
+               );
+
+               parent::__construct( $params );
+       }
+
+       public function validate( $value, $alldata ) {
+               // check, if a user exists with the given username
+               $user = User::newFromName( $value );
+
+               if ( !$user ) {
+                       return $this->msg( 'htmlform-user-not-valid', $value )->parse();
+               } elseif ( $this->mParams['exists'] && $user->getId() === 0 ) {
+                       return $this->msg( 'htmlform-user-not-exists', $user->getName() )->parse();
+               }
+
+               return parent::validate( $value, $alldata );
+       }
+
+       protected function getInputWidget( $params ) {
+               $this->mParent->getOutput()->addModules( 'mediawiki.widgets' );
+
+               return new UserInputWidget( $params );
+       }
+}
index fe2f26e..eec13ee 100644 (file)
@@ -65,7 +65,7 @@ class OOUIHTMLForm extends HTMLForm {
                        $attribs['type'] = 'submit';
                        $attribs['label'] = $this->getSubmitText();
                        $attribs['value'] = $this->getSubmitText();
-                       $attribs['flags'] = array( $this->mSubmitFlag );
+                       $attribs['flags'] = $this->mSubmitFlags;
 
                        $buttons .= new OOUI\ButtonInputWidget( $attribs );
                }
index c544f16..3788379 100644 (file)
@@ -95,8 +95,10 @@ class VFormHTMLForm extends HTMLForm {
                        $attribs['class'] = array(
                                'mw-htmlform-submit',
                                'mw-ui-button mw-ui-big mw-ui-block',
-                               'mw-ui-' . $this->mSubmitFlag,
                        );
+                       foreach ( $this->mSubmitFlags as $flag ) {
+                               $attribs['class'][] = 'mw-ui-' . $flag;
+                       }
 
                        $buttons .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
                }
index 6ac5436..4410271 100644 (file)
@@ -407,6 +407,8 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgField', 'mwuser', 'user_password_expires', 'TIMESTAMPTZ NULL' ),
                        array( 'changeFieldPurgeTable', 'l10n_cache', 'lc_value', 'bytea',
                                "replace(lc_value,'\','\\\\')::bytea" ),
+                       // 1.23.9
+                       array( 'rebuildTextSearch'),
 
                        // 1.24
                        array( 'addPgField', 'page_props', 'pp_sortkey', 'float NULL' ),
@@ -947,4 +949,12 @@ END;
                        $this->applyPatch( 'patch-tsearch2funcs.sql', false, "Rewriting tsearch2 triggers" );
                }
        }
+
+       protected function rebuildTextSearch() {
+               if ( $this->updateRowExists( 'patch-textsearch_bug66650.sql' ) ) {
+                       $this->output( "...bug 66650 already fixed or not applicable.\n" );
+                       return true;
+               };
+               $this->applyPatch( 'patch-textsearch_bug66650.sql', false, "Rebuilding text search for bug 66650" );
+       }
 }
index 0aecb70..1d8cd9c 100644 (file)
@@ -5,12 +5,14 @@
                        "Wikitanvir",
                        "Aftab1995",
                        "Tauhid16",
-                       "Aftabuzzaman"
+                       "Aftabuzzaman",
+                       "Hasive"
                ]
        },
        "config-desc": "মিডিয়াউইকির জন্য ইন্সটলার",
        "config-title": "মিডিয়াউইকি $1 ইন্সটলেশন",
        "config-information": "তথ্য",
+       "config-localsettings-upgrade": "A <code>LocalSettings.php</code> ফাইলটি মুছে ফেলা হয়েছে। এ ইন্সটলেশনটি আরো উন্নত করতে দয়া করে <code>$wgUpgradeKey</code> কোডটি বক্সে দিন। আপনি এটি পাবেন এখানে <code>LocalSettings.php</code>.",
        "config-localsettings-key": "হালনাগাদ কি",
        "config-localsettings-badkey": "আপনি যেই চাবিটি দিয়েছেন তা সঠিক নয়।",
        "config-session-error": "সেশন শুরুতে ত্রুটি: $1",
        "config-continue": "অব্যাহত →",
        "config-page-language": "ভাষা",
        "config-page-welcome": "মিডিয়াউইকিতে স্বাগতম!",
-       "config-page-dbconnect": "ডà§\87à¦\9fাবà§\87à¦\9cে সংযোগ দিন",
+       "config-page-dbconnect": "ডà§\87à¦\9fাবà§\87সে সংযোগ দিন",
        "config-page-upgrade": "ইতিমধ্যেই থাকা ইন্সটলেশন হালনাগাদ করুন",
-       "config-page-dbsettings": "ডà§\87à¦\9fাবà§\87à¦\9c সেটিংস",
+       "config-page-dbsettings": "ডà§\87à¦\9fাবà§\87স সেটিংস",
        "config-page-name": "নাম",
        "config-page-options": "অপশন",
        "config-page-install": "ইন্সটল",
        "config-page-complete": "সম্পূর্ণ!",
        "config-page-restart": "পুনরায় ইন্সটল প্রক্রিয়া চালু করুন",
        "config-page-readme": "এটি পড়ুন",
-       "config-page-releasenotes": "রিলিà¦\9c à¦¨à§\8bà¦\9f",
+       "config-page-releasenotes": "পà§\8dরà¦\95াশ à¦¸à¦\82à¦\95à§\8dরানà§\8dত à¦¬à¦¾à¦°à§\8dতা",
        "config-page-copying": "অনুলেপন",
        "config-page-upgradedoc": "হালনাগাদকরণ",
        "config-page-existingwiki": "ইতিমধ্যেই থাকা উইকি",
-       "config-help-restart": "à¦\86পনি à¦\95à§\80 à¦¸à¦\95ল à¦¸à¦\82রà¦\95à§\8dষিত à¦\89পাতà§\8dত à¦ªà¦°à¦¿à¦·à§\8dà¦\95ার à¦\95রতà§\87 à¦¯à¦¾ à¦\86পনি à¦ªà§\8dরবà§\87স à¦\95রিয়à§\87à¦\9bিলà§\87ন à¦\8fবà¦\82 à¦\87নà§\8dসà¦\9fালà§\87সন ব্যবস্থা পুনরায় আরম্ভ করতে চান?",
+       "config-help-restart": "à¦\86পনি à¦\95à§\80 à¦¸à¦\95ল à¦¸à¦\82রà¦\95à§\8dষিত à¦\89পাতà§\8dত à¦ªà¦°à¦¿à¦·à§\8dà¦\95ার à¦\95রতà§\87 à¦¯à¦¾ à¦\86পনি à¦ªà§\8dরবà§\87শ à¦\95রিয়à§\87à¦\9bিলà§\87ন à¦\8fবà¦\82 à¦\87নà§\8dসà¦\9fালà§\87শন ব্যবস্থা পুনরায় আরম্ভ করতে চান?",
        "config-restart": "হ্যাঁ, পুনরায় চালু করুন",
        "config-env-php": "পিএইচপি $1 ইন্সটল করা হয়েছে।",
        "config-env-hhvm": "HHVM $1 ইনস্টল করা হয়েছে।",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] ইনস্টল করা হয়েছে",
        "config-apc": "[http://www.php.net/apc এপিসি] ইনস্টল হয়েছে",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ইনস্টল করা হয়েছে",
-       "config-db-type": "ডà§\87à¦\9fাবà§\87à¦\9cের ধরন:",
+       "config-db-type": "ডà§\87à¦\9fাবà§\87সের ধরন:",
        "config-db-host": "ডেটাবেজের হোস্ট:",
        "config-db-wiki-settings": "এই উইকি সনাক্ত করুন",
-       "config-db-name": "à¦\89পাতà§\8dতসà¦\82à¦\97à§\8dরহশালা নামঃ",
+       "config-db-name": "ডà§\87à¦\9fাবà§\87সà§\87র নামঃ",
        "config-db-install-account": "ইন্সটলের জন্য ব্যবহারকারী অ্যাকাউন্ট",
        "config-db-username": "ডেটাবেজের ব্যবহারকারী নাম:",
        "config-db-password": "ডেটাবেজের পাসওয়ার্ড:",
-       "config-db-username-empty": "আপনাকে অবশ্যই \"{{int:config-db-username}}\"-এর জন্য একটি মান প্রবেশ করাতে হবে।",
        "config-db-wiki-account": "সাধারণ অভিযানের জন্য ব্যবহারকারী একাউন্ট",
        "config-db-prefix": "উপাত্তশালা ছক প্রিফিক্স:",
        "config-db-charset": "ডেটাবেজের অক্ষর সেট",
index 92a1440..7a7cfb1 100644 (file)
@@ -4,7 +4,8 @@
                        "CERminator",
                        "Palapa",
                        "Emir Mujadzic",
-                       "Semso98"
+                       "Semso98",
+                       "Srdjan m"
                ]
        },
        "config-desc": "Instalacija za MediaWiki",
        "config-admin-name": "Vaše korisničko ime:",
        "config-admin-password": "Lozinka:",
        "config-admin-password-confirm": "Ponovno unesite lozinku:",
-       "config-admin-email": "E-mail adresa:",
+       "config-admin-email": "Adresa e-pošte:",
        "config-profile-wiki": "Otvori wiki",
        "config-profile-private": "Privatna wiki",
        "config-license-pd": "Javno vlasništvo",
        "config-logo": "Logo URL:",
        "config-cc-again": "Odaberi ponovno...",
+       "config-skins": "Teme",
        "config-install-step-done": "završeno",
        "config-install-step-failed": "neuspješno",
        "config-install-extensions": "Uključujući ekstenzije",
index 077c503..0709665 100644 (file)
@@ -31,7 +31,6 @@
        "config-no-fts3": "'''Тергам бе''': SQLite гулйина хуттург йоцуш [//sqlite.org/fts3.html FTS3] — лахар болхбеш хир дац оцу бухца.",
        "config-no-cli-uri": "'''ДӀахьедар''': <code>--scriptpath</code> параметр язйина яц, иза Ӏад йитарца лелош ю: <code>$1</code> .",
        "config-db-name": "Хаамийн базан цӀе:",
-       "config-db-username-empty": "Ахьа «{{int:config-db-username}}» параметран маьӀна даздан дезаш ду.",
        "config-db-charset": "Базан хаамийн символийн гулам",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 бинаран",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
@@ -54,7 +53,7 @@
        "config-profile-no-anon": "ДӀаяздар кхолла деза",
        "config-profile-fishbowl": "ДӀаяздарш долу тадархошна бен",
        "config-profile-private": "ДӀачӀаьгӀна вики",
-       "config-license": "Авторан бакъонаш а лицензи а:",
+       "config-license": "Авторан бакъонаш а, лицензи а:",
        "config-license-cc-by-sa": "Creative Commons Attribution Share Alike",
        "config-license-cc-by": "Creative Commons Attribution",
        "config-license-cc-by-nc-sa": "Creative Commons Attribution Non-Commercial Share Alike",
index 81e6e6a..5a26449 100644 (file)
@@ -79,7 +79,7 @@
        "config-outdated-sqlite": "<strong>Advertencia:</strong> tienes SQLite $1, que es inferior a la mínima versión requerida: $2. SQLite no estará disponible.",
        "config-no-fts3": "<strong>Advertencia:</strong> SQLite está compilado sin el [//sqlite.org/fts3.html módulo FTS3]. Las funcionalidades de búsqueda no estarán disponibles en esta instalación.",
        "config-register-globals-error": "<strong>Error: la opción de PHP <code>[http://php.net/register_globals register_globals]</code> está activada.\nDebe estar desactivada para continuar con la instalación.</strong>\nVéase [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] para obtener ayuda sobre cómo hacerlo.",
-       "config-magic-quotes-gpc": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] está activa!</strong>\nEsta opción corrompe la entrada de datos de forma impredecible.\nUsted no puede instalar o utilizar MediaWiki a menos que esta opción esté deshabilitada.",
+       "config-magic-quotes-gpc": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] está activa!</strong>\nEsta opción corrompe la entrada de datos de forma impredecible.\nNo puedes instalar o utilizar MediaWiki a menos que esta opción esté desactivada.",
        "config-magic-quotes-runtime": "'''Fatal: ¡[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está activada!'''\nEsta opción causa la imprevisible corrupción de la entrada de datos.\nNo puedes instalar o utilizar MediaWiki a menos que esta opción esté inhabilitada.",
        "config-magic-quotes-sybase": "'''Fatal: ¡[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está activada!'''\nEsta opción causa la imprevisible corrupción de la entrada de datos.\nNo puedes instalar o utilizar MediaWiki a menos que esta opción esté inhabilitada.",
        "config-mbstring": "'''Fatal: La opción [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está activada!'''\nEsta opción causa errores y puede corromper los datos de una forma imprevisible.\nNo se puede instalar o usar MediaWiki a menos que esta opción sea desactivada.",
        "config-db-host": "Servidor de la base de datos:",
        "config-db-host-help": "Si tu servidor de base de datos está en otro servidor, escribe el nombre del equipo o su dirección IP aquí.\n\nSi estás utilizando alojamiento web compartido, tu proveedor debería darte el nombre correcto del servidor en su documentación.\n\nSi vas a instalar en un servidor Windows y a utilizar MySQL, el uso de \"localhost\" como nombre del servidor puede no funcionar. Si es así, intenta poner \"127.0.0.1\" como dirección IP local.\n\nSi utilizas PostgreSQL, deja este campo vacío para conectarse a través de un socket de Unix.",
        "config-db-host-oracle": "TNS de la base de datos:",
-       "config-db-host-oracle-help": "Introduzca un [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm nombre de conexión local] válido; un archivo tnsnames.ora debe ser visible para esta instalación.<br />Si está utilizando bibliotecas de cliente 10g o más recientes también puede utilizar el método de asignación de nombres [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
+       "config-db-host-oracle-help": "Escribe un [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm nombre de conexión local] válido; un archivo tnsnames.ora debe ser visible para esta instalación.<br />Si estás utilizando bibliotecas de cliente 10g o más recientes también puedes utilizar el método de asignación de nombres [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Identifica este wiki",
        "config-db-name": "Nombre de la base de datos:",
        "config-db-name-help": "Elige un nombre que identifique tu wiki.\nNo debe contener espacios.\n\nSi estás utilizando alojamiento web compartido, tu proveedor te dará un nombre específico de base de datos para que lo utilices, o bien te permitirá crear bases de datos a través de un panel de control.",
        "config-email-auth": "Activar autenticación del correo electrónico",
        "config-email-auth-help": "Si esta opción está habilitada, los usuarios tienen que confirmar su dirección de correo electrónico mediante un enlace que se les envía a ellos cuando éstos lo establecen o lo cambian.\nSolo las direcciones de correo electrónico autenticadas pueden recibir correos electrónicos de otros usuarios o correos electrónicos de notificación de cambios.\nEsta opción está '''recomendada''' para wikis públicos debido a posibles abusos de las características del correo electrónico.",
        "config-email-sender": "Dirección de correo electrónico de retorno:",
-       "config-email-sender-help": "Introduce la dirección de correo electrónico que será usada como dirección de retorno en los mensajes electrónicos de salida.\nAquí llegarán los correos electrónicos que no lleguen a su destino.\nMuchos servidores de correo electrónico exigen que por lo menos la parte del nombre del dominio sea válida.",
+       "config-email-sender-help": "Escribe la dirección de correo electrónico que se usará como dirección de retorno en los mensajes electrónicos de salida.\nAquí llegarán los correos electrónicos que no lleguen a su destino.\nMuchos servidores de correo electrónico exigen que por lo menos la parte del nombre del dominio sea válida.",
        "config-upload-settings": "Cargas de imágenes y archivos",
        "config-upload-enable": "Habilitar la subida de archivos",
        "config-upload-help": "La carga de archivos expone potencialmente su servidor a riesgos de seguridad.\nPara obtener más información, lea la [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security sección de seguridad] en el manual.\n\nPara habilitar la carga de archivos, cambie el modo en el subdirectorio <code>images</code> bajo el directorio raíz de MediaWiki para que el servidor web pueda escribir en él.\nA continuación, habilite esta opción.",
index 7617942..a1f9154 100644 (file)
@@ -1,5 +1,38 @@
 {
-       "@metadata": [],
+       "@metadata": {
+               "authors": [
+                       "Vahe Gharakhanyan"
+               ]
+       },
+       "config-title": "ՄեդիաՎիքի $1-ի տեղադրում",
+       "config-information": "Տեղեկատվություն",
+       "config-localsettings-key": "Թարմացման բանալի`",
+       "config-your-language": "Ձեր լեզուն`",
+       "config-wiki-language": "Վիքի լեզու`",
+       "config-back": "← Վերադառնալ",
+       "config-continue": "Շարունակել →",
+       "config-page-language": "Լեզու",
+       "config-page-welcome": "Բարի գալուստ ՄեդիաՎիքի:",
+       "config-page-dbconnect": "Միացում տվյալների բազային",
+       "config-page-name": "Անվանում",
+       "config-page-options": "Ընտրանքներ",
+       "config-page-install": "Տեղադրում",
+       "config-page-complete": "Պատրաստ է:",
+       "config-page-readme": "Կարդա ինձ",
+       "config-page-releasenotes": "Տեղեկություն տարբերակի մասին",
+       "config-page-existingwiki": "Գոյություն ունեցող վիքի",
+       "config-restart": "Այո, նորից սկսել",
+       "config-admin-password": "Գաղտնաբառ՝",
+       "config-admin-password-confirm": "Գաղտնաբառը կրկին`",
+       "config-admin-email": "Էլ-փոստի հասցեն՝",
+       "config-license": "Հեղինակային իրավունք և արտոնագիր`",
+       "config-license-cc-by-sa": "Creative Commons Attribution-ShareAlike",
+       "config-license-cc-by": "Creative Commons Attribution",
+       "config-license-cc-by-nc-sa": "Creative Commons Attribution-NonCommercial-ShareAlike",
+       "config-license-cc-0": "Creative Commons Zero (հանրային սեփականություն)",
+       "config-license-gfdl": "GNU Free Documentation License 1.3 կամ ավելի ուշ",
+       "config-license-pd": "Հանրային սեփականություն",
+       "config-help": "օգնություն",
        "mainpagetext": "'''«MediaWiki» ծրագիրը հաջողությամբ տեղադրվեց։'''",
        "mainpagedocfooter": "Այցելեք [//meta.wikimedia.org/wiki/Help:Contents User's Guide]՝ վիքի ծրագրային ապահովման օգտագործման մասին տեղեկությունների համար։\n\n== Որոշ օգտակար ռեսուրսներ ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
 }
index 3547308..cbe64d6 100644 (file)
                        "Seb35",
                        "Nemo bis",
                        "Ricordisamoa",
-                       "Fpugliajno"
+                       "Fpugliajno",
+                       "The Polish"
                ]
        },
        "config-desc": "Il programma di installazione per MediaWiki",
-       "config-title": "Installazione MediaWiki $1",
+       "config-title": "Installazione di MediaWiki $1",
        "config-information": "Informazioni",
        "config-localsettings-upgrade": "È stato rilevato un file <code>LocalSettings.php</code>.\nPer aggiornare questa installazione, si prega di inserire il valore di <code>$wgUpgradeKey</code> nella casella qui sotto.\nLo potete trovare in <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "È stato rilevato un file <code>LocalSettings.php</code>.\nPer aggiornare questa installazione, eseguire <code>update.php</code>",
index e7d2388..6615026 100644 (file)
        "config-db-install-account": "Konto użytkownika dla instalatora",
        "config-db-username": "Nazwa użytkownika bazy danych:",
        "config-db-password": "Hasło bazy danych:",
-       "config-db-password-empty": "Wprowadź hasło dla nowego użytkownika bazy danych: $1.\nChoć istnieje możliwość tworzenia użytkowników bez hasła, nie jest to bezpieczne.",
-       "config-db-username-empty": "Należy podać wartość parametru \"{{int:config-db-username}}\".",
        "config-db-install-username": "Wprowadź nazwę użytkownika, który będzie używany do łączenia się z bazą danych podczas procesu instalacji.\nNie jest to nazwa konta MediaWiki, a użytkownika bazy danych.",
        "config-db-install-password": "Wprowadź hasło, które będzie wykorzystywane do łączenia się z bazą danych w procesie instalacji.\nTo nie jest hasło konta MediaWiki, lecz hasło do bazy danych.",
        "config-db-install-help": "Podaj nazwę użytkownika i jego hasło, które zostaną użyte do połączenia z bazą danych w czasie procesu instalacji.",
index 87ac7a5..68b2695 100644 (file)
@@ -54,7 +54,6 @@
        "config-env-bad": "Miljön har kontrollerats.\nDu kan inte installera MediaWiki.",
        "config-env-php": "PHP $1 är installerat.",
        "config-env-hhvm": "HHVM $1 är installerat.",
-       "config-unicode-using-utf8": "Använder Brion Vibbers utf8_normalize.so för Unicode-normalisering.",
        "config-unicode-using-intl": "Använder [http://pecl.php.net/intl intl PECL-tillägget] för Unicode-normalisering.",
        "config-unicode-pure-php-warning": "'''Varning:''' [http://pecl.php.net/intl intl PECL-tillägget] är inte tillgängligt för att hantera Unicode-normalisering, faller tillbaka till en långsamt implementering i ren PHP.\nOm du driver en högtrafikerad webbplats bör du läsa lite om [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-normalisering].",
        "config-unicode-update-warning": "'''Varning:''' Den installerade versionen av Unicode-normaliserings \"wrappern\" använder en äldre version av [http://site.icu-project.org/ ICU projektets] bibliotek.\nDu bör [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations uppgradera] om är intresserad av att använda Unicode.",
@@ -67,7 +66,7 @@
        "config-magic-quotes-sybase": "'''Kritiskt: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] är aktiv!'''\nDetta alternativ korrumperar inmatad data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.",
        "config-mbstring": "'''Kritiskt: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] är aktiv!'''\nDetta alternativ orsakar fel och kan korrumpera data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.",
        "config-safe-mode": "''' Varning:''' PHP:s [http://www.php.net/features.safe-mode felsäkra läge] är aktivt.\nDet kan orsaka problem, särskilt om du använder filuppladdningar och <code>math</code>-stöd.",
-       "config-xml-bad": "PHP:s XML-modul saknas.\nMediaWiki kräver funktioner i denna modul och kommer inte att fungera i den här konfigurationen.\nOm du kör Mandrake, installera php-xml-paketet.",
+       "config-xml-bad": "PHP:s XML-modul saknas.\nMediaWiki kräver funktioner i denna modul och kommer inte att fungera i den här konfigurationen.\nDu kan behöva installera RPM-paketet för php-xml.",
        "config-pcre-old": "'''Kritiskt:''' PCRE $1 eller senare krävs.\nDin PHP-binär är länkad till PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mer information].",
        "config-pcre-no-utf8": "'''Kritiskt:''' PHP:s PCRE-modul verkar vara kompilerat utan PCRE_UTF8-stöd.\nMediaWiki kräver stöd för UTF-8 för att fungera korrekt.",
        "config-memory-raised": "PHPs <code>memory_limit</code> är $1, ökad till $2.",
        "config-db-install-account": "Användarkonto för installation",
        "config-db-username": "Databas-användarnamn:",
        "config-db-password": "Databas-lösenord:",
-       "config-db-password-empty": "Ange ett lösenord för den nya databasanvändaren: $1.\nÄven om det kan vara möjligt att skapa användare utan lösenord är det inte säkert.",
-       "config-db-username-empty": "Du måste ange ett värde för \"{{int:config-db-username}}\"",
        "config-db-install-username": "Ange det användarnamn som ska används för att ansluta till databasen under installationsprocessen.\nDetta är inte användarnamnet för ditt MediaWiki-konto; detta är användarnamnet för din databas.",
        "config-db-install-password": "Ange det lösenord som ska användas för att ansluta till databasen under installationsprocessen.\nDetta är inte lösenordet för ditt MediaWiki-konto; detta är lösenordet för din databas.",
        "config-db-install-help": "Ange användarnamnet och lösenordet som kommer att användas för att ansluta till databasen under installationsprocessen.",
index bf3636b..3923f7e 100644 (file)
@@ -62,7 +62,7 @@
        "config-magic-quotes-sybase": "<strong>Lỗi chí tử: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] đang hoạt động!</strong>\nTùy chọn này sẽ làm hỏng dữ liệu nhập một cách không thể đoán trước.\nBạn không thể cài đặt hoặc sử dụng MediaWiki trừ phi tùy chọn này bị vô hiệu.",
        "config-mbstring": "<strong>Lỗi chí tử: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] được kích hoạt!</strong>\nTùy chọn này gây lỗi và có thể làm hỏng dữ liệu một cách không thể đoán trước.\nBạn không thể cài đặt hoặc sử dụng MediaWiki trừ phi tùy chọn này bị vô hiệu.",
        "config-safe-mode": "<strong>Cảnh báo:</strong> [http://www.php.net/features.safe-mode Chế độ an toàn] của PHP đang được kích hoạt.\nNó có thể gây vấn đề, nhất là nếu dùng các chức năng tải lên tập tin và <code>math</code>.",
-       "config-xml-bad": "Mô đun XML của PHP đang bị thiếu.\nMediaWiki yêu cầu các hàm trong mô đun này và sẽ không hoạt động trong cấu hình này.\nNếu bạn đang chạy Mandrake, hãy cài đặt gói php-xml.",
+       "config-xml-bad": "Mô đun XML của PHP đang bị thiếu.\nMediaWiki yêu cầu các hàm trong mô đun này và sẽ không hoạt động trong cấu hình này.\nBạn có thể cần cài đặt gói RPM php-xml.",
        "config-pcre-old": "<strong>Lỗi chí tử:</strong> PCRE $1 trở lên được yêu cầu phải có.\nBản nhị phân PHP của bạn dang được liên kết với PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Thông tin bổ sung].",
        "config-pcre-no-utf8": "<strong>Lỗi chí tử:</strong> Mô đun PCRE của PHP dường như được biên dịch mà không có hỗ trợ PCRE_UTF8.\nMediaWiki yêu cầu phải có hỗ trợ UTF-8 để hoạt động chính xác.",
        "config-memory-raised": "<code>memory_limit</code> của PHP là $1, tăng lên $2.",
        "config-db-install-account": "Tài khoản người dùng để cài đặt",
        "config-db-username": "Tên người dùng cơ sở dữ liệu:",
        "config-db-password": "Mật khẩu cơ sở dữ liệu:",
-       "config-db-password-empty": "Xin nhập vào một mật khẩu cho người dùng cơ sở dữ liệu mới: $1. Tuy bạn có thể tạo một tài khoản người dùng mà không cần mật khẩu, nhưng khi đó sẽ không đảm bảo tính bảo mật cho bạn.",
-       "config-db-username-empty": "Bạn phải nhập một giá trị cho “{{int:config-db-username}}”",
        "config-db-install-username": "Nhập tên người dùng để kết nối với cơ sở dữ liệu trong quá trình cài đặt.\nĐây không phải là tên người dùng của tài khoản MediaWiki; đây là tên người dùng cho cơ sở dữ liệu của bạn.",
        "config-db-install-password": "Nhập mật khẩu để kết nối với cơ sở dữ liệu trong quá trình cài đặt.\nĐây không phải là mật khẩu của tài khoản MediaWiki; đây là mật khẩu cho cơ sở dữ liệu của bạn.",
        "config-db-install-help": "Nhập tên người dùng và mật khẩu sẽ được sử dụng để kết nối với cơ sở dữ liệu trong quá trình cài đặt.",
index d1db005..5dbe66e 100644 (file)
@@ -93,7 +93,7 @@
        "config-no-uri": "<strong>錯誤:</strong>無法辨識目前的 URI 位置。\n安裝已中止。",
        "config-no-cli-uri": "<strong>警告:</strong>:未指定 <code>--scriptpath</code> 指令參數,使用預設值:<code>$1</code>。",
        "config-using-server": "使用伺服器名稱 \"<nowiki>$1</nowiki>\"。",
-       "config-using-uri": "使用伺服器 URL 位置 \"<nowiki>$1$2</nowiki>\"。",
+       "config-using-uri": "使用伺服器 URL  \"<nowiki>$1$2</nowiki>\"。",
        "config-uploads-not-safe": "<strong>警告:</strong>您預設的上傳目錄 <code>$1</code> 有可被任意執行 Script 的漏洞。\n雖然 MediaWiki 會對所有上傳的檔案進行安全檢查,但我們仍強烈建議您在開啟上傳功能前了解如何 [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security 關閉此安全漏洞]。",
        "config-no-cli-uploads-check": "<strong>警告:</strong>透過指令介面安不會檢查您預設的上傳目錄 (<code>$1</code>) 是否有可任意執行 Script 的安全性漏洞。",
        "config-brokenlibxml": "您的系統使用了可能造成 MediaWiki 或其他網頁應用程式資料損毀問題的 PHP 與 limbxml2 版本。\n請升級 libxml2 2.7.3 或更新的版本 ([https://bugs.php.net/bug.php?id=45996 PHP 問題報告])。\n安裝已中止。",
        "config-db-install-account": "安裝程式使用的使用者帳號",
        "config-db-username": "資料庫使用者名稱:",
        "config-db-password": "資料庫密碼:",
-       "config-db-password-empty": "請輸入新增資料庫使用者 $1 的密碼。\n雖然您可以不設定任何密碼,但這樣做並不安全。",
-       "config-db-username-empty": "您必須輸入 \"{{int:config-db-username}}\" 欄位的內容。",
        "config-db-install-username": "請輸入在安裝過程中用來連線資料庫的使用者名稱。\n請注意,這不是 MediaWiki 帳號的使用者名稱,這是您資料庫的使用者名稱。",
        "config-db-install-password": "請輸入在安裝過程中用來連線資料庫的密碼。\n請注意,這不是 MediaWiki 帳號的密碼,這是您資料庫的密碼。",
        "config-db-install-help": "請輸入在安裝過程中用來連線資料庫的使用者名稱及密碼。",
        "config-upload-help": "檔案上傳功能會讓您的伺服器暴露在潛藏的安全性風險之下。\n要取得更多相關的資訊,請參考 [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security 安全性章節]。\n\n要開啟檔案上傳需要將 MediaWiki 根目錄底下的 <code>images</code> 目錄開啟網頁伺服器的寫入權,\n然後再啟動選項。",
        "config-upload-deleted": "已刪除檔案的目錄:",
        "config-upload-deleted-help": "請選擇用來存放已刪除檔案的目錄。\n理想情況下,此目錄不可被網頁直接存取。",
-       "config-logo": "標誌 URL 位置:",
+       "config-logo": "Logo 網址:",
        "config-logo-help": "在 MediaWiki 的預設介面,側欄選單上方有一塊 135x160 像素用來放置標誌的區域。\n請上傳合適大小的圖片並在此輸入 URL 網址。\n\n您可以透過 <code>$wgStylePath</code> 或者 <code>$wgScriptPath</code> 來表示您的圖片與這些路徑的相對位置。\n\n如果您不想使用標誌,可略過此欄位。",
        "config-instantcommons": "開啟即時共享資源",
        "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons 即時共享資源] 是允許 Wiki 使用來自 [//commons.wikimedia.org/ Wikimedia Commons] 網站上的圖片、聲音以及其他媒體的一項功能。\n若要開啟此功能,您的 MediaWiki 必須能夠連線網際網路。\n更多有關此功能的訊息,包含如何存除了 Wikimedia Commons 之外其他網站的說明,請參考 \n[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos 操作手冊]。",
        "config-memcached-servers": "Memcached 伺服器:",
        "config-memcached-help": "請列出 Memcached 伺服器的 IP 位址。\n每一行只指定一個位置並且要註明使用的埠號,例如:\n 127.0.0.1:11211\n 192.168.1.25:1234",
        "config-memcache-needservers": "您的快取類型選擇使用 Memcached,但並未設定任何的伺服器。",
-       "config-memcache-badip": "您輸入了一筆無效的 Memcached IP 位:$1。",
+       "config-memcache-badip": "您輸入了一筆無效的 Memcached IP 位:$1。",
        "config-memcache-noport": "您沒有輸入 Memcached 伺服器的埠號:$1。\n如果您不曉得埠號為多少,預設為 11211。",
        "config-memcache-badport": "Memcached 埠號應介於 $1 到 $2 之間。",
        "config-extensions": "擴充套件",
index 68e96fc..beeb067 100644 (file)
@@ -38,7 +38,7 @@ class EmaillingJob extends Job {
                        $this->params['from'],
                        $this->params['subj'],
                        $this->params['body'],
-                       $this->params['replyto']
+                       array( 'replyTo' => $this->params['replyto'] )
                );
 
                return $status->isOK();
index 192b119..3d7fad5 100644 (file)
@@ -42,7 +42,7 @@ class BufferingStatsdDataFactory extends StatsdDataFactory {
        /**
         * Normalize a metric key for StatsD
         *
-        * Replace occurences of '::' with dots and any other non-alphabetic
+        * Replace occurences of '::' with dots and any other non-alphanumeric
         * characters with underscores. Combine runs of dots or underscores.
         * Then trim leading or trailing dots or underscores.
         *
@@ -51,7 +51,7 @@ class BufferingStatsdDataFactory extends StatsdDataFactory {
         */
        private static function normalizeMetricKey( $key ) {
                $key = preg_replace( '/[:.]+/', '.', $key );
-               $key = preg_replace( '/[^a-z.]+/i', '_', $key );
+               $key = preg_replace( '/[^a-z0-9.]+/i', '_', $key );
                $key = trim( $key, '_.' );
                return str_replace( array( '._', '_.' ), '.', $key );
        }
index aa0cc46..2e7ef88 100644 (file)
@@ -228,7 +228,7 @@ class MultiHttpClient {
                        if ( $errno !== 0 ) {
                                $req['response']['error'] = "(curl error: $errno)";
 
-                               if ( version_compare( PHP_VERSION, '5.5.0' ) >= 0 ) {
+                               if ( function_exists( 'curl_strerror' ) ) {
                                        $req['response']['error'] .= " " . curl_strerror( $errno );
                                }
                        }
index eaf1155..cc54fe7 100644 (file)
  * @ingroup Cache
  */
 class APCBagOStuff extends BagOStuff {
+
+       /**
+        * @var string String to append to each APC key. This may be changed
+        *  whenever the handling of values is changed, to prevent existing code
+        *  from encountering older values which it cannot handle.
+        **/
+       const KEY_SUFFIX = ':1';
+
        public function get( $key, &$casToken = null ) {
-               $val = apc_fetch( $key );
+               $val = apc_fetch( $key . self::KEY_SUFFIX );
 
                $casToken = $val;
 
-               if ( is_string( $val ) ) {
-                       if ( $this->isInteger( $val ) ) {
-                               $val = intval( $val );
-                       } else {
-                               $val = unserialize( $val );
-                       }
-               }
-
                return $val;
        }
 
        public function set( $key, $value, $exptime = 0 ) {
-               if ( !$this->isInteger( $value ) ) {
-                       $value = serialize( $value );
-               }
-
-               apc_store( $key, $value, $exptime );
+               apc_store( $key . self::KEY_SUFFIX, $value, $exptime );
 
                return true;
        }
 
        public function delete( $key ) {
-               apc_delete( $key );
+               apc_delete( $key . self::KEY_SUFFIX );
 
                return true;
        }
 
        public function incr( $key, $value = 1 ) {
-               return apc_inc( $key, $value );
+               return apc_inc( $key . self::KEY_SUFFIX, $value );
        }
 
        public function decr( $key, $value = 1 ) {
-               return apc_dec( $key, $value );
+               return apc_dec( $key . self::KEY_SUFFIX, $value );
        }
 }
index 1027732..0eed450 100644 (file)
@@ -478,7 +478,9 @@ class EmailNotification {
                                $wgContLang->userTime( $this->timestamp, $watchingUser ) ),
                        $this->body );
 
-               return UserMailer::send( $to, $this->from, $this->subject, $body, $this->replyto );
+               return UserMailer::send( $to, $this->from, $this->subject, $body, array(
+                       'replyTo' => $this->replyto,
+               ) );
        }
 
        /**
@@ -503,7 +505,9 @@ class EmailNotification {
                                $wgContLang->time( $this->timestamp, false, false ) ),
                        $this->body );
 
-               return UserMailer::send( $addresses, $this->from, $this->subject, $body, $this->replyto );
+               return UserMailer::send( $addresses, $this->from, $this->subject, $body, array(
+                       'replyTo' => $this->replyto,
+               ) );
        }
 
 }
index 546cc8c..d83ae93 100644 (file)
@@ -102,16 +102,32 @@ class UserMailer {
         * @param MailAddress $from Sender's email
         * @param string $subject Email's subject.
         * @param string $body Email's text or Array of two strings to be the text and html bodies
-        * @param MailAddress $replyto Optional reply-to email (default: null).
-        * @param string $contentType Optional custom Content-Type (default: text/plain; charset=UTF-8)
+        * @param array $options:
+        *              'replyTo' MailAddress
+        *              'contentType' string default 'text/plain; charset=UTF-8'
+        *
+        * Previous versions of this function had $replyto as the 5th argument and $contentType
+        * as the 6th. These are still supported for backwards compatability, but deprecated.
+        *
         * @throws MWException
         * @throws Exception
         * @return Status
         */
-       public static function send( $to, $from, $subject, $body, $replyto = null,
-               $contentType = 'text/plain; charset=UTF-8'
-       ) {
+       public static function send( $to, $from, $subject, $body, $options = array() ) {
                global $wgSMTP, $wgEnotifMaxRecips, $wgAdditionalMailParams, $wgAllowHTMLEmail;
+               $contentType = 'text/plain; charset=UTF-8';
+               if ( is_array( $options ) ) {
+                       $replyto = isset( $options['replyTo'] ) ? $options['replyTo'] : null;
+                       $contentType = isset( $options['contentType'] ) ? $options['contentType'] : $contentType;
+               } else {
+                       // Old calling style
+                       wfDeprecated( __METHOD__ . ' with $replyto as 5th parameter', '1.26' );
+                       $replyto = $options;
+                       if ( func_num_args() === 6 ) {
+                               $contentType = func_get_arg( 5 );
+                       }
+               }
+
                $mime = null;
                if ( !is_array( $to ) ) {
                        $to = array( $to );
index 7ea4ed7..4ec377a 100644 (file)
@@ -296,7 +296,7 @@ class ImagePage extends Article {
        }
 
        protected function openShowImage() {
-               global $wgEnableUploads, $wgSend404Code;
+               global $wgEnableUploads, $wgSend404Code, $wgSVGMaxSize;
 
                $this->loadFile();
                $out = $this->getContext()->getOutput();
@@ -351,7 +351,7 @@ class ImagePage extends Article {
                                        );
                                        $linktext = $this->getContext()->msg( 'show-big-image' )->escaped();
 
-                                       $thumbSizes = $this->getThumbSizes( $width, $height, $width_orig, $height_orig );
+                                       $thumbSizes = $this->getThumbSizes( $width_orig, $height_orig );
                                        # Generate thumbnails or thumbnail links as needed...
                                        $otherSizes = array();
                                        foreach ( $thumbSizes as $size ) {
@@ -361,10 +361,12 @@ class ImagePage extends Article {
                                                // the current thumbnail's size ($width/$height)
                                                // since that is added to the message separately, so
                                                // it can be denoted as the current size being shown.
-                                               // Vectorized images are "infinitely" big, so all thumb
-                                               // sizes are shown.
+                                               // Vectorized images are limited by $wgSVGMaxSize big,
+                                               // so all thumbs less than or equal that are shown.
                                                if ( ( ( $size[0] <= $width_orig && $size[1] <= $height_orig )
-                                                               || $this->displayImg->isVectorized() )
+                                                               || ( $this->displayImg->isVectorized()
+                                                                       && max( $size[0], $size[1] ) <= $wgSVGMaxSize )
+                                                       )
                                                        && $size[0] != $width && $size[1] != $height
                                                ) {
                                                        $sizeLink = $this->makeSizeLink( $params, $size[0], $size[1] );
index a4d94f8..0023de2 100644 (file)
@@ -149,7 +149,7 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
         */
        protected function getContent( $titleText ) {
                $title = Title::newFromText( $titleText );
-               if ( !$title || $title->isRedirect() ) {
+               if ( !$title ) {
                        return null;
                }
 
index bda10b0..71e3b63 100644 (file)
@@ -186,7 +186,7 @@ class SearchPostgres extends SearchDatabase {
        function update( $pageid, $title, $text ) {
                ## We don't want to index older revisions
                $sql = "UPDATE pagecontent SET textvector = NULL WHERE textvector IS NOT NULL and old_id IN " .
-                               "(SELECT rev_text_id FROM revision WHERE rev_page = " . intval( $pageid ) .
+                               "(SELECT DISTINCT rev_text_id FROM revision WHERE rev_page = " . intval( $pageid ) .
                                " ORDER BY rev_text_id DESC OFFSET 1)";
                $this->db->query( $sql );
                return true;
index d77f07b..e3230ff 100644 (file)
@@ -41,7 +41,7 @@ class SiteSQLStore extends CachingSiteStore {
         */
        public static function newInstance( ORMTable $sitesTable = null, BagOStuff $cache = null ) {
                if ( $cache === null ) {
-                       $cache = wfGetMainCache();
+                       $cache = wfGetCache( wfIsHHVM() ? CACHE_ACCEL : CACHE_ANYTHING );
                }
 
                $siteStore = new DBSiteStore();
index 41c2f93..e5c5aa4 100644 (file)
@@ -445,7 +445,7 @@ class AllMessagesTablePager extends TablePager {
                } elseif ( $field === 'am_title' ) {
                        return array( 'class' => $field );
                } else {
-                       return array( 'lang' => $this->langcode, 'dir' => $this->lang->getDir(), 'class' => $field );
+                       return array( 'lang' => wfBCP47( $this->langcode ), 'dir' => $this->lang->getDir(), 'class' => $field );
                }
        }
 
index c55fa94..1754471 100644 (file)
@@ -356,7 +356,9 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        $replyTo = null;
                }
 
-               $status = UserMailer::send( $to, $mailFrom, $subject, $text, $replyTo );
+               $status = UserMailer::send( $to, $mailFrom, $subject, $text, array(
+                       'replyTo' => $replyTo,
+               ) );
 
                if ( !$status->isGood() ) {
                        return $status;
index 4ca07fe..8491f89 100644 (file)
@@ -1390,6 +1390,7 @@ class LoginForm extends SpecialPage {
                        : is_array( $wgPasswordResetRoutes ) && in_array( true, array_values( $wgPasswordResetRoutes ) );
 
                $template->set( 'header', '' );
+               $template->set( 'formheader', '' );
                $template->set( 'skin', $this->getSkin() );
                $template->set( 'name', $this->mUsername );
                $template->set( 'password', $this->mPassword );
index 0a91957..4fb6772 100644 (file)
@@ -575,7 +575,10 @@ class SpecialVersion extends SpecialPage {
                if ( count( $tags ) ) {
                        $out = Html::rawElement(
                                'h2',
-                               array( 'class' => 'mw-headline plainlinks' ),
+                               array(
+                                       'class' => 'mw-headline plainlinks',
+                                       'id' => 'mw-version-parser-extensiontags',
+                               ),
                                Linker::makeExternalLink(
                                        '//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Tag_extensions',
                                        $this->msg( 'version-parser-extensiontags' )->parse(),
@@ -615,7 +618,10 @@ class SpecialVersion extends SpecialPage {
                if ( count( $fhooks ) ) {
                        $out = Html::rawElement(
                                'h2',
-                               array( 'class' => 'mw-headline plainlinks' ),
+                               array(
+                                       'class' => 'mw-headline plainlinks',
+                                       'id' => 'mw-version-parser-function-hooks',
+                               ),
                                Linker::makeExternalLink(
                                        '//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Parser_functions',
                                        $this->msg( 'version-parser-function-hooks' )->parse(),
index be77e62..69a8074 100644 (file)
@@ -314,7 +314,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                static $msgcache = null;
                if ( $msgcache === null ) {
                        static $msgs = array( 'isredirect', 'istemplate', 'semicolon-separator',
-                               'whatlinkshere-links', 'isimage' );
+                               'whatlinkshere-links', 'isimage', 'edit' );
                        $msgcache = array();
                        foreach ( $msgs as $msg ) {
                                $msgcache[$msg] = $this->msg( $msg )->escaped();
@@ -355,7 +355,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                }
 
                # Space for utilities links, with a what-links-here link provided
-               $wlhLink = $this->wlhLink( $nt, $msgcache['whatlinkshere-links'] );
+               $wlhLink = $this->wlhLink( $nt, $msgcache['whatlinkshere-links'], $msgcache['edit'] );
                $wlh = Xml::wrapClass(
                        $this->msg( 'parentheses' )->rawParams( $wlhLink )->escaped(),
                        'mw-whatlinkshere-tools'
@@ -370,18 +370,29 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                return Xml::closeElement( 'ul' );
        }
 
-       protected function wlhLink( Title $target, $text ) {
+       protected function wlhLink( Title $target, $text, $editText ) {
                static $title = null;
                if ( $title === null ) {
                        $title = $this->getPageTitle();
                }
 
+               $editLink = '';
+               if ( $this->getUser()->isAllowed( 'edit' ) ) {
+                       $editLink = $this->msg( 'pipe-separator' )->escaped() .
+                               Linker::linkKnown(
+                                       $target,
+                                       $editText,
+                                       array(),
+                                       array( 'action' => 'edit' )
+                               );
+               }
+
                return Linker::linkKnown(
                        $title,
                        $text,
                        array(),
                        array( 'target' => $target->getPrefixedText() )
-               );
+               ) . $editLink;
        }
 
        function makeSelfLink( $text, $query ) {
index f09b6bb..c17d575 100644 (file)
@@ -73,6 +73,12 @@ class UsercreateTemplate extends BaseTemplate {
                        <?php } ?>
                        </div>
 
+                       <?php if ( $this->data['formheader'] ) { ?>
+                               <div class="mw-form-formheader">
+                                       <?php $this->html( 'formheader' ); /* extensions such as MobileFrontend add html here */ ?>
+                               </div>
+                       <?php } ?>
+
                        <div class="mw-ui-vform-field">
                                <label for='wpName2'>
                                        <?php $this->msg( 'userlogin-yourname' ); ?>
index 345bb71..4a0b413 100644 (file)
@@ -56,6 +56,11 @@ class UserloginTemplate extends BaseTemplate {
                                </div>
                        <?php } ?>
 
+                       <?php if ( $this->data['formheader'] ) { ?>
+                               <div class="mw-form-formheader">
+                                       <?php $this->html( 'formheader' ); /* extensions such as MobileFrontend add html here */ ?>
+                               </div>
+                       <?php } ?>
                        <div class="mw-ui-vform-field">
                                <label for='wpName1'>
                                        <?php
index 426c752..493df2e 100644 (file)
@@ -1935,7 +1935,7 @@ abstract class UploadBase {
        public static function getSessionStatus( User $user, $statusKey ) {
                $key = wfMemcKey( 'uploadstatus', $user->getId() ?: md5( $user->getName() ), $statusKey );
 
-               return wfGetCache( CACHE_ANYTHING )->get( $key );
+               return ObjectCache::getMainStashInstance()->get( $key );
        }
 
        /**
@@ -1951,7 +1951,7 @@ abstract class UploadBase {
        public static function setSessionStatus( User $user, $statusKey, $value ) {
                $key = wfMemcKey( 'uploadstatus', $user->getId() ?: md5( $user->getName() ), $statusKey );
 
-               $cache = wfGetCache( CACHE_ANYTHING );
+               $cache = ObjectCache::getMainStashInstance();
                if ( $value === false ) {
                        $cache->delete( $key );
                } else {
index 4c099b3..f578745 100644 (file)
@@ -195,7 +195,7 @@ class UploadFromUrl extends UploadBase {
         */
        public function fetchFile( $httpOptions = array() ) {
                if ( !Http::isValidURI( $this->mUrl ) ) {
-                       return Status::newFatal( 'http-invalid-url' );
+                       return Status::newFatal( 'http-invalid-url', $this->mUrl );
                }
 
                if ( !self::isAllowedHost( $this->mUrl ) ) {
index 69427c5..2d69ed7 100644 (file)
@@ -40,7 +40,6 @@ class NamespaceInputWidget extends \OOUI\Widget {
         */
        public function __construct( array $config = array() ) {
                // Configuration initialization
-
                $config = array_merge(
                        array(
                                'nameNamespace' => 'namespace',
index 37c9d9c..d3e2851 100644 (file)
@@ -7,12 +7,10 @@
  */
 namespace MediaWiki\Widget;
 
-use OOUI\TextInputWidget;
-
 /**
  * Title input widget.
  */
-class TitleInputWidget extends TextInputWidget {
+class TitleInputWidget extends \OOUI\TextInputWidget {
 
        protected $namespace = null;
        protected $relative = null;
diff --git a/includes/widget/UserInputWidget.php b/includes/widget/UserInputWidget.php
new file mode 100644 (file)
index 0000000..e5663c3
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+/**
+ * MediaWiki Widgets – UserInputWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+namespace MediaWiki\Widget;
+
+/**
+ * User input widget.
+ */
+class UserInputWidget extends \OOUI\TextInputWidget {
+
+       /**
+        * @param array $config Configuration options
+        */
+       public function __construct( array $config = array() ) {
+               // Parent constructor
+               parent::__construct( array_merge( $config, array( 'infusable' => true ) ) );
+
+               // Initialization
+               $this->addClasses( array( 'mw-widget-userInputWidget' ) );
+       }
+
+       protected function getJavaScriptClassName() {
+               return 'mw.widgets.UserInputWidget';
+       }
+}
index 93dd239..b698beb 100644 (file)
@@ -254,10 +254,16 @@ class Language {
         * @since 1.21
         */
        public static function isSupportedLanguage( $code ) {
-               return self::isValidBuiltInCode( $code )
-                       && ( is_readable( self::getMessagesFileName( $code ) )
-                               || is_readable( self::getJsonMessagesFileName( $code ) )
-               );
+               if ( !self::isValidBuiltInCode( $code ) ) {
+                       return false;
+               }
+
+               if ( $code === 'qqq' ) {
+                       return false;
+               }
+
+               return is_readable( self::getMessagesFileName( $code ) ) ||
+                       is_readable( self::getJsonMessagesFileName( $code ) );
        }
 
        /**
index 6d537d3..d44e68f 100644 (file)
        'bat-smg' => 'žemaitėška', # Samogitian (deprecated code, 'sgs' in ISO 693-3 since 2010-06-30 )
        'bbc' => 'Batak Toba', # Batak Toba (falls back to bbc-latn)
        'bbc-latn' => 'Batak Toba', # Batak Toba
-       'bcc' => 'بÙ\84Ù\88Ú\86Û\8c Ù\85کراÙ\86Û\8c', # Southern Balochi
+       'bcc' => 'جÙ\87Ù\84سرÛ\8c Ø¨Ù\84Ù\88Ú\86Û\8c', # Southern Balochi
        'bcl' => 'Bikol Central', # Bikol: Central Bicolano language
        'be' => 'беларуская', #  Belarusian normative
        'be-tarask' => "беларуская (тарашкевіца)\xE2\x80\x8E",     # Belarusian in Taraskievica orthography
        'be-x-old' => "беларуская (тарашкевіца)\xE2\x80\x8E",      # (be-tarask compat)
        'bg' => 'български',   # Bulgarian
-       'bgn' => 'بÙ\84Ù\88Ú\86Û\8c Ø±Ø®Ø´Ø§Ù\86Û\8c', # Western Balochi
+       'bgn' => 'رÙ\88Ú\86 Ú©Ù¾ØªÛ\8cÙ\86 Ø¨Ù\84Ù\88Ú\86Û\8c', # Western Balochi
        'bh' => 'भोजपुरी',        # Bihari macro language. Falls back to Bhojpuri (bho)
        'bho' => 'भोजपुरी',       # Bhojpuri
        'bi' => 'Bislama',              # Bislama
        'lt' => 'lietuvių',    # Lithuanian
        'ltg' => 'latgaļu',    # Latgalian
        'lus' => 'Mizo ţawng', # Mizo/Lushai
+       'luz' => 'لئری جئنوٙڤی', # Southern Luri
        'lv' => 'latviešu',    # Latvian
        'lzh' => '文言',      # Literary Chinese, bug 8217
        'lzz' => 'Lazuri',      # Laz
index ad2ae19..aa9f7ac 100644 (file)
@@ -51,7 +51,8 @@
                        "Khaled",
                        "Emara",
                        "Macofe",
-                       "Yahya Sakhnini"
+                       "Yahya Sakhnini",
+                       "Mervat Salman"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "htmlform-cloner-create": "إضافة المزيد",
        "htmlform-cloner-delete": "إزالة",
        "htmlform-cloner-required": "مطلوب قيمة واحدة على الأقل.",
+       "htmlform-user-not-exists": "<strong>$1</strong> غير موجود",
+       "htmlform-user-not-valid": "اسم المستخدم <strong>$1</strong> غير صالح.",
        "sqlite-has-fts": "$1 بدعم البحث في كامل النص",
        "sqlite-no-fts": "$1 بدون دعم البحث في كامل النص",
        "logentry-delete-delete": "{{GENDER:$2|حذف|حذفت}} $1 صفحة $3",
index 2252d94..a6b5c69 100644 (file)
        "protectedinterface": "Esta páxina proporciona'l testu de la interfaz del software d'esta wiki, y ta candada pa torgar abusos.\nP'amestar o cambiar les traducciones de toles wikis, por favor usa [//translatewiki.net/translatewiki.net], el proyeutu de llocalización de MediaWiki.",
        "editinginterface": "<strong>Avisu:</strong> Tas editando una páxina que s'usa pa proporcionar el testu de la interfaz del programa.\nLos cambeos nesta páxina afeutarán al aspeutu de la interfaz pa otros usuarios d'esta wiki.",
        "translateinterface": "P'amestar o camudar les traducciones pa toles wikis, usa [//translatewiki.net/ translatewiki.net], el proyeutu de traducción de MediaWiki.",
-       "cascadeprotected": "Esta páxina ta protexida d'ediciones porque ta inxerta {{PLURAL:$1|na siguiente páxina, protexida|nes siguientes páxines, protexíes}} cola opción «en cascada» activada:\n$2",
+       "cascadeprotected": "Esta páxina ta protexida d'ediciones porque ta trescluída {{PLURAL:$1|na siguiente páxina, protexida|nes siguientes páxines, protexíes}} cola opción «en cascada» activada:\n$2",
        "namespaceprotected": "Nun tienes permisu pa editar páxines nel espaciu de nomes '''$1'''.",
        "customcssprotected": "Nun tienes permisu pa editar esta páxina CSS porque contien preferencies personales d'otru usuariu.",
        "customjsprotected": "Nun tienes permisu pa editar esta páxina de JavaScript porque contien preferencies personales d'otru usuariu.",
        "readonlywarning": "'''Avisu: La base de datos ta candada por mantenimientu, polo que nun vas poder guardar les tos ediciones nestos momentos.'''\nSeique habríes copiar y apegar el testu nun ficheru de testu y guardalu pa intentalo más sero.\n\nL'alministrador que la candó dio esta esplicación: $1",
        "protectedpagewarning": "'''Avisu: Esta páxina ta candada pa que sólo los alministradores puean editala.'''\nLa cabera entrada del rexistru s'ufre darréu pa referencia:",
        "semiprotectedpagewarning": "'''Nota:''' Esta páxina ta candada pa que nun puean editala namái que los usuarios rexistraos.\nLa cabera entrada del rexistru s'ufre darréu pa referencia:",
-       "cascadeprotectedwarning": "'''Avisu:''' Esta páxina ta candada pa que namái los alministradores puedan editala porque ta incluída {{PLURAL:$1|na siguiente páxina protexida|nes siguientes páxines protexíes}} en cascada:",
+       "cascadeprotectedwarning": "<strong>Avisu:</strong> Esta páxina ta candada pa que namái los alministradores puedan editala porque ta trescluída {{PLURAL:$1|na siguiente páxina protexida|nes siguientes páxines protexíes}} en cascada:",
        "titleprotectedwarning": "'''Avisu: Esta páxina ta candada pa que necesite [[Special:ListGroupRights|permisos especiales]] pa creala.'''\nLa cabera entrada del rexistru s'ufre darréu pa referencia:",
        "templatesused": "{{PLURAL:$1|Plantía usada|Plantíes usaes}} nesta páxina:",
        "templatesusedpreview": "{{PLURAL:$1|Plantía usada|Plantíes usaes}} nesta vista previa:",
        "protect-locked-blocked": "Nun pues camudar los niveles de proteición mentes teas bloquiáu. Esta\nye la configuración actual de la páxina '''$1''':",
        "protect-locked-dblock": "Los niveles de proteición nun puen ser camudaos pol mor d'un candáu activu de\nla base de datos. Esta ye la configuración actual de la páxina '''$1''':",
        "protect-locked-access": "La to cuenta nun tien permisu pa camudar los niveles de proteición de páxina.\nEsta ye la configuración actual pa la páxina '''$1''':",
-       "protect-cascadeon": "Esta páxina ta protexida nestos momentos porque ta incluída {{PLURAL:$1|na siguiente páxina, que tien|nes siguientes páxines, que tienen}} activada la proteición en cascada.\nLos cambios nel nivel de proteición d'esta páxina nun afeutarán a la proteición en cascada.",
+       "protect-cascadeon": "Esta páxina ta protexida nestos momentos porque ta trescluída {{PLURAL:$1|na siguiente páxina, que tien|nes siguientes páxines, que tienen}} activada la proteición en cascada.\nLos cambios nel nivel de proteición d'esta páxina nun afeutarán a la proteición en cascada.",
        "protect-default": "Permitir tolos usuarios",
        "protect-fallback": "Permitir namái usuarios con permisu \"$1\"",
        "protect-level-autoconfirmed": "Permitir namái usuarios autoconfirmaos",
        "htmlform-cloner-create": "Amestar más",
        "htmlform-cloner-delete": "Desaniciar",
        "htmlform-cloner-required": "Necesítase polo menos un valor.",
+       "htmlform-title-badnamespace": "[[:$1]] nun ta nel espaciu de nomes \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "«$1» nun ye un títulu de páxina que pueda crease",
+       "htmlform-title-not-exists": "[[:$1]] nun esiste.",
+       "htmlform-user-not-exists": "<strong>$1</strong> nun esiste.",
+       "htmlform-user-not-valid": "<strong>$1</strong> nun ye un nome d'usuariu válidu.",
        "sqlite-has-fts": "$1 con sofitu pa busca de testu completu",
        "sqlite-no-fts": "$1 ensin sofitu pa busca de testu completu",
        "logentry-delete-delete": "$1 {{GENDER:$2|desanició}} la páxina $3",
index 0927ede..9b63b13 100644 (file)
        "youremail": "ایمیل:",
        "username": "{{GENDER:$1|ایشلدن آدی}}:",
        "prefs-memberingroups": "{{PLURAL:$1|بیر|$1}} قروپ {{GENDER:$2|عوضو}}و:",
-       "prefs-registration": "یازیلماق واختی:",
+       "prefs-registration": "یازیلماق تاریخی:",
        "yourrealname": "دوغرو آد:",
        "yourlanguage": "دیل:",
        "yourvariant": "دیل واریانتی:",
        "prefs-help-email": "ایمیل آدرسی ایستگه باغلی‌دیر، آنجاق رمزینیزی اونوتدوغونوز واخت، سیزه يئنی رمز گؤندرمگه گرکلی‌دیر.",
        "prefs-help-email-others": "سیز هم‌ده آیری ایستیفاده‌چیلره ایجازه وئره بیلرسیز، سیزین ایستیفاده‌چی یا دانیشیق صحیفه‌نیزده بیر باغلانتی ایله، سیزله ایلگی قورسونلار.\nآیری ایستیفاده‌چیلر سیزینله ایلگی قوراندا، سیزین ایمیل آدرسیز گؤستریلمه‌یه‌جک‌دیر.",
        "prefs-help-email-required": "ایمیل آدرس گرکلی‌دیر.",
-       "prefs-info": "اساس Ø¨Û\8cÙ\84Ú¯Û\8cÙ\84ر",
+       "prefs-info": "کؤک Ø¨Û\8cÙ\84Ú¯Û\8câ\80\8cÙ\84ر",
        "prefs-i18n": "اولوسلارآراسی‌لاشدیرما",
        "prefs-signature": "ایمضا",
        "prefs-dateformat": "تاریخ فورمتی",
        "rollback-success": "$1 طرفین‌دن ائدیلمیش دییشدیر‌لر گئری قایتاریلدی؛ $2 طرفین‌دن یارادیلمیش سون وئرسیا برپا اولوندو.",
        "sessionfailure-title": "گیریش خطاسی",
        "sessionfailure": "گیریش اوتورومونوزلا ایلگی‌لی بیر سورون وار گیبی گؤرونویور؛\nبو ائیلئم، اوتوروم گاسپینا کارشی اؤنلئم اولاراک ایپتال ائدیلدی.\nلوتفن \"گئری\" گیدین و گئلدیغینیز سایفایی یئنی‌دئن یوکلئیین، سونرا تئکرار دئنئیین.",
+       "changecontentmodel-title-label": "صحیفه باشلیقی",
+       "changecontentmodel-reason-label": "ندن:",
+       "logentry-contentmodel-change-revertlink": "قایتار",
+       "logentry-contentmodel-change-revert": "قایتار",
        "protectlogpage": "قوروما قئیدلری",
        "protectlogtext": "آشاغی‌داکی، صحیفه قوروما‌لارینا دییشیک‌لیک‌لرین بیر سیاهی‌سی‌دیر.\nحال-حاضردا تطبیق اولونان صحیفه قوروما‌لاری اوچون [[Special:ProtectedPages| قوروما آلتینا آلینمیش صحیفه‌لر سیاهی‌سینا]] باخا بیلرسینیز.",
        "protectedarticle": "«[[$1]]» قوروندو",
index 545a882..010629d 100644 (file)
        "viewyourtext": "Saimong mahihiling asin makokopya an gikanan kan '''saimong mga pinagriliwat''' sa pahinang ini:",
        "protectedinterface": "An pahinang ini nagtatao nin panlaog-olay para sa software, asin protektado tangaring malikayan an abuso.\nSa pagdagdag or pagliwat nin mga dakit-taramon para sa bilog na wiki, gamita tabi an [//translatewiki.net/translatewiki.net], an MediaWiki sa proyektong lokalisasyon.",
        "editinginterface": "'''Patanid:''' Ika nagliliwat kan pahina na ginagamit sa pagtao nin pantahaw-olay na teksto para sa software.\nAn mga pagbabago kaining pahina makaka-apekto sa hitsura kan pantahaw-olay nin paragamit para sa iba man na paragamit.\nPara sa mga pagdadakit-taramon, pakikonsidera man tabi an paggagamit kan [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], an MediaWiking lokalisasyon kan proyekto.",
-       "cascadeprotected": "Ining pahina pinagprotehiran gikan sa pagliliwat nin huli ta ini pinagbale sa minasunod na {{PLURAL:$1|pahina, na iyo ngani an|mga pahina, na iyo ngani an mga}} protektado kan pinagbukasang opsyon na \"pasurunod-sunudan\":\n$2",
+       "cascadeprotected": "Ining pahina pinagprotehiran gikan sa pagliliwat nin huli ta kabaling pinagbalyo sa minasunod na {{PLURAL:$1|pahina, na iyo ngani an|mga pahina, na iyo ngani an mga}} protektado na igwa nin \"pasurunod\" na opsyong pinagbuksan:\n$2",
        "namespaceprotected": "Ika mayong permiso sa pagliwat nin mga pahina sa <strong>$1</strong> na ngarang-espasyo.",
        "customcssprotected": "Ika mayong permiso sa pagliwat kaining pahinang CSS, nin huli ta ini naglalaman kan personal na panuytoy (settings) kan ibang paragamit.",
        "customjsprotected": "Ika mayong permiso sa pagliwat kaining pahinang JavaScript, nin huli ta ini naglalaman kan personal na panuytoy (settings) kan ibang paragamit.",
        "readonlywarning": "'''Patanid tabi: An datos-sarayan nakakandado para sa maintenance, kaya ika dae makakapagtagama kan saimong mga pinagriliwat sa ngunyan.'''\nIka mapuwedeng makakopya asin idukot an saimong teksto pasiring sa sarong sagunson kan teksto asin itagama ini sa bandang huri.\n\nAn administrador na iyo an nagkandado kaini naghayag kaining kapaliwanagan: $1",
        "protectedpagewarning": "'''Patanid tabi: Ining pahina pinagprotektaran tanganing an mga paragamit sana na igwang pribilihiyo bilang administrador an makakapagliwat kaini.'''\nAn pinakahuring entrada sa talaan pinaghaya sa ibaba bilang reperensiya:",
        "semiprotectedpagewarning": "'''Note:''' Ining pahina pinagprotektaran na tanganing an mga rehistradong mga paragamit sana an mapuwedeng makapagliwat kaini.\nAn pinakahuring entrada sa talaan pinaghaya sa ibaba bilang reperensiya:",
-       "cascadeprotectedwarning": "'''Patanid:''' Nakakandado an pahinang ini tangarig an mga parágamit na igwang pribilehyo nin sysop sana an pwedeng maghirá kaini, huli ta kabali ini sa mga kataratang protektado na {{PLURAL:$1|pahina|mga pahina}}:",
+       "cascadeprotectedwarning": "<strong>Patanid:</strong> Ining pahina pinagprotehiran na tanganing an mga paragamit na igwa nin pan-administrador na mga pribilihiyo an makakaliwat kaini nin huli ta ini kabaling pinagbalyo sa minasunod na protektadong pasurunod na {{PLURAL:$1|pahina|mga pahina}}:",
        "titleprotectedwarning": "'''Patanid tabi: Ining pahina pinagprotektaran na tanganing [[Special:ListGroupRights|espesipikong karapatan]] minakaipo tanganing magmukna kaini.'''\nAn pinakahuring entrada sa talaan pinaghaya sa ibaba bilang reperensiya:",
        "templatesused": "{{PLURAL:$1|Template|Mga Panguyog}} na pinaggamit kaining pahina:",
        "templatesusedpreview": "{{PLURAL:$1|Template|Mga Panguyog}} na pinaggamit kaining patanaw:",
        "linksearch-pat": "Pangarugan sa paghahanap:",
        "linksearch-ns": "Espasyong-ngaran:",
        "linksearch-ok": "Hanápon",
-       "linksearch-text": "Mga tsambang baraha arog baka kan \"*.wikipedia.org\" na puwedeng paggamiton.\nMinakaipo kisera halangkaw na kamugtakan nin kinasakupan, halimbawa \"*.org\".<br />\nSuportadong {{PLURAL:$2|protokol|mga protokol}}: $1 (defaults to http:// kun mayong protokol na pinagkaag).",
+       "linksearch-text": "Mga tsambang baraha arog baka kan \"*.wikipedia.org\" na puwedeng paggamiton.\nMinakaipo nin kisera halangkaw na kamugtakan nin kinasakupan, halimbawa \"*.org\".<br />\nSuportadong {{PLURAL:$2|protokol|mga protokol}}: $1 (defaults to http:// kun mayong protokol na pinagkaag).",
        "linksearch-line": "$1 isinugpon gikan sa $2",
        "linksearch-error": "Mga pantsambang baraha mapuwedeng magluwas sana sa poon kan hostname.",
        "listusersfrom": "Ipahiling an mga paragamit poon sa:",
        "protect-locked-blocked": "Dai mo pwedeng bâgohon an mga tangga kan proteksyon mientras na ika nababágat. Ini an mga presenteng pwesto kan páhina '''$1''':",
        "protect-locked-dblock": "Dai puedeng ibalyo an mga nibel kan proteksión ta may actibong kandado sa base nin datos.\nIni an mga puesta sa ngunyan kaining páhina '''$1''':",
        "protect-locked-access": "Mayong permiso an account mo na magbàgo kan tangga nin proteksyon.\nUya an ngonyan na mga pwesto kan pahinang '''$1''':",
-       "protect-cascadeon": "Pigproprotektaran ining pahina sa ngonyan ta sabay ini sa mga nasunod na {{PLURAL:$1|pahina, na may|mga pahina, na may}} proteksyong katarata na nakaandar. Pwede mong bàgohon an tangga nin proteksyon kaining pahina, pero mayò ning epekto sa proteksyong katarata.",
+       "protect-cascadeon": "Ining pahina presenteng pinagprotehiran nin huli ta kabaling pinagbalyo sa minasunod na {{PLURAL:$1|pahina, na iyo ngani an|mga pahina, na iyo ngani an mga}} protektado na igwa nin \"pasurunod\" na opsyong pinagbuksan.\nAn mga kaliwatan sa lebel kan proteksyon kaining pahina dae makapag-apektar sa pasurunod na proteksyon.",
        "protect-default": "Tuguti an gabos na mga paragamit",
        "protect-fallback": "Minatugot sana sa mga paragamit na igwang \"$1\" na permiso",
        "protect-level-autoconfirmed": "Minatugot sana sa awtokumpirmadong mga paragamit",
        "htmlform-no": "Habó",
        "htmlform-yes": "Iyo",
        "htmlform-chosen-placeholder": "Magpili nin sarong opsyon",
+       "htmlform-title-not-creatable": "\"$1\" bako sarong maimumuknang titulo kan pahina",
+       "htmlform-title-not-exists": "[[:$1]] bakong eksistido.",
        "sqlite-has-fts": "$1 na igwang suporta sa kabilogang-teksto nin paghahanap",
        "sqlite-no-fts": "$1 na mayong suporta sa kabilogang-teksto nin paghahanap",
        "logentry-delete-delete": "$1 {{GENDER:$2|pinagpura na}} pahina $3",
index 8892a91..fda2f23 100644 (file)
        "changecontentmodel-nodirectediting": "Мадэль зьместу $1 не падтрымлівае наўпроставае рэдагаваньне",
        "log-name-contentmodel": "Журнал зьменаў мадэляў зьместу",
        "log-description-contentmodel": "Падзеі, зьвязаныя з мадэлямі зьместу старонак",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} мадэль зьместу старонкі $3 з «$4» на «$5»",
+       "logentry-contentmodel-change-revertlink": "адкаціць",
+       "logentry-contentmodel-change-revert": "адкат",
        "protectlogpage": "Журнал абаронаў",
        "protectlogtext": "Ніжэй пададзены сьпіс зьменаў абароны старонкі.\nГлядзіце [[Special:ProtectedPages|сьпіс абароненых старонак на цяперашні момант]].",
        "protectedarticle": "абароненая «[[$1]]»",
        "tooltip-watchlistedit-raw-submit": "Абнавіць сьпіс назіраньня",
        "tooltip-recreate": "Аднавіць старонку, ня гледзячы на тое, што яна была выдаленая",
        "tooltip-upload": "Пачаць загрузку",
-       "tooltip-rollback": "«Ð\90дкаÑ\82» Ð²Ñ\8fÑ\80Ñ\82ае Ñ\80Ñ\8dдагаванÑ\8cнÑ\96 Ð¿Ð°Ð¿Ñ\8fÑ\80Ñ\8dднÑ\8fга Ñ\9eдзелÑ\8cнÑ\96ка Ð°Ð´Ð½Ñ\8bм ÐºÐ»Ñ\96кам.",
+       "tooltip-rollback": "«Ð\90дкаÑ\82» Ð¿Ñ\80Ñ\8bбÑ\96Ñ\80ае Ñ\80Ñ\8dдагаванÑ\8cнÑ\96 Ð°Ð¿Ð¾Ñ\88нÑ\8fга Ñ\9eдзелÑ\8cнÑ\96ка Ð°Ð´Ð½Ñ\8bм Ð½Ð°Ñ\86Ñ\96Ñ\81канÑ\8cнем",
        "tooltip-undo": "«Скасаваць» — скасоўвае гэтае рэдагаваньне і адкрывае акно рэдагаваньня ў рэжыме прагляду.\nДазваляе дадаваць прычыну адкату ў апісаньне зьменаў.",
        "tooltip-preferences-save": "Захаваць налады",
        "tooltip-summary": "Увядзіце кароткае апісаньне",
        "pageinfo-robot-index": "Дазволеная",
        "pageinfo-robot-noindex": "Не дазволеная",
        "pageinfo-watchers": "Колькасьць назіральнікаў і назіральніц",
+       "pageinfo-visiting-watchers": "Колькасьць удзельнікаў, якія назіраюць за старонкай і бачылі апошнія зьмены",
        "pageinfo-few-watchers": "Менш за $1 {{PLURAL:$1|назіральніка|назіральнікі|назіральнікаў}}",
+       "pageinfo-few-visiting-watchers": "Могуць быць, а могуць ня быць удзельнікі, якія назіраюць за старонкай і бачылі апошнія зьмены",
        "pageinfo-redirects-name": "Перанакіраваньняў на гэтую старонку",
        "pageinfo-subpages-name": "Колькасьць падстаронак",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|перанакіраваньне|перанакіраваньні|перанакіраваньняў}}; $3 {{PLURAL:$3|звычайная|звычайныя|звычайных}})",
        "tags-delete-too-many-uses": "Метка «$1» выкарыстаная ў больш чым $2 {{PLURAL:$2|вэрсіі|вэрсіях}}, адпаведна, яна ня можа быць выдаленая.",
        "tags-delete-warnings-after-delete": "Метка «$1» была пасьпяхова выдаленая, але {{PLURAL:$2|1=атрыманае наступнае папярэджаньне|атрыманыя наступныя папярэджаньні}}:",
        "tags-activate-title": "Актываваць метку",
+       "tags-activate-question": "Вы зьбіраецеся актываваць метку «$1».",
+       "tags-activate-reason": "Прычына:",
+       "tags-activate-not-allowed": "Немагчыма актываваць метку «$1».",
+       "tags-activate-not-found": "Метка «$1» не існуе.",
+       "tags-activate-submit": "Актываваць",
+       "tags-deactivate-title": "Дэактываваць метку",
+       "tags-deactivate-question": "Вы зьбіраецеся дэактываваць метку «$1».",
+       "tags-deactivate-reason": "Прычына:",
+       "tags-deactivate-not-allowed": "Немагчыма дэактываваць метку «$1».",
+       "tags-deactivate-submit": "Адключыць",
+       "tags-apply-no-permission": "Вы ня маеце права прымяняць меткі да вашых рэдагаваньняў.",
+       "tags-edit-title": "Рэдагаваньне метак",
+       "tags-edit-manage-link": "Кіраваньне меткамі",
+       "tags-edit-revision-selected": "{{PLURAL:$1|1=Абраная вэрсія|Абраныя вэрсіі}} [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|1=Абраны запіс|Абраныя запісы}} журнала:",
+       "tags-edit-revision-legend": "Дадаць ці прыбраць меткі з {{PLURAL:$1|1=гэтай вэрсіі|усіх $1 вэрсіяў}}",
+       "tags-edit-logentry-legend": "Дадаць ці прыбраць меткі з {{PLURAL:$1|1=гэтага запісу|усіх $1 запісаў}} журналу",
+       "tags-edit-existing-tags": "Наяўныя меткі:",
+       "tags-edit-existing-tags-none": "«Няма»",
+       "tags-edit-new-tags": "Новыя меткі:",
+       "tags-edit-add": "Дадаць гэтыя меткі:",
+       "tags-edit-remove": "Выдаліць гэтыя меткі:",
+       "tags-edit-remove-all-tags": "(выдаліць усе меткі)",
+       "tags-edit-chosen-placeholder": "Абярыце меткі",
        "comparepages": "Параўнаньне старонак",
        "compare-page1": "Старонка 1",
        "compare-page2": "Старонка 2",
        "htmlform-cloner-create": "Дадаць больш",
        "htmlform-cloner-delete": "Выдаліць",
        "htmlform-cloner-required": "Патрабуецца як мінімум яшчэ адно значэньне.",
+       "htmlform-user-not-exists": "<strong>$1</strong> не існуе.",
+       "htmlform-user-not-valid": "<strong>$1</strong> — некарэктнае імя карыстальніка.",
        "sqlite-has-fts": "$1 з падтрымкай поўнатэкстнага пошуку",
        "sqlite-no-fts": "$1 без падтрымкі поўнатэкстнага пошуку",
        "logentry-delete-delete": "$1 {{GENDER:$2|выдаліў|выдаліла}} старонку $3",
        "revdelete-uname-unhid": "імя ўдзельніка адкрытае",
        "revdelete-restricted": "ужыць абмежаваньні для адміністратараў",
        "revdelete-unrestricted": "зьнятыя абмежаваньні для адміністратараў",
+       "logentry-block-block": "$1 {{GENDER:$2|заблякаваў|заблякавала}} {{GENDER:$4|$3}} на тэрмін $5 $6",
+       "logentry-block-unblock": "$1 {{GENDER:$2|разблякаваў|разблякавала}} {{GENDER:$4|$3}}",
+       "logentry-suppress-block": "$1 {{GENDER:$2|заблякаваў|заблякавала}} {{GENDER:$4|$3}} на тэрмін $5 $6",
        "logentry-merge-merge": "$1 {{GENDER:$2|аб’яднаў|аб’яднала}} $3 у $4 (вэрсіі да $5)",
        "logentry-move-move": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4 без пакінутага перанакіраваньня",
index 8dc411f..6e2d5bd 100644 (file)
        "categorypage": "دیستین تهری تاکدیمی",
        "viewtalkpage": "گپ تاکدیمی نشان داتین",
        "otherlanguages": "بی دیگه زبانانی تا",
-       "redirectedfrom": "(تغییرمسیر داتین شه $1)",
+       "redirectedfrom": "(گردینته بوته شه $1 ئا)",
        "redirectpagesub": "تاکدیمی تغییرمسیر داتین",
-       "redirectto": "تغییر مسیر بی:",
+       "redirectto": "گردینتین په:",
        "lastmodifiedat": "ای تاکدیم آخرین‌ وارا بی $1 سائت $2 تا تغییر بوته.",
        "viewcount": "شه ای تاکدیما کسی {{PLURAL:$1|یکوار|$1ور}} دیدن کورته.",
        "protectedpage": "قُلپ بوتگین تاکدیم",
        "passwordreset": "پاک کورتین پاسوردئ",
        "passwordreset-text-one": "په پدا نادینتین ایمیلی پاسوردی خاتیرا ای فرم ئا پر کنیت.",
        "passwordreset-text-many": "{{PLURAL:$1|په موقتی ئین چیهرگال ئی گیپتین شه ایمیلئ راه ئا، یکی شه زمینه‌هان ئا پر کنیت.}}",
-       "passwordreset-legend": "پاک کورتین پاسوردئ",
        "passwordreset-disabled": "ای ویکی ئی تا پاسورد یا چیهرگالی پدا بیئر گردینتین غیر پئال اینت.",
        "passwordreset-emaildisabled": "ایمیلی گزینه بی ای یکی ئی تا پئال نه ونت.",
        "passwordreset-username": "کار زوروکین نام:",
        "changeemail-throttled": "شما بیخی باز وار په لوگین بوتینا کوشش کورته ایت.\nمهربانئ بکنیت دیم شه آیی که پدا کوشش بکنیت $1 صبر کنیت.",
        "resettokens": "بیئر گردینتین نشانگ ئانی",
        "resettokens-no-tokens": "هیچ نشانگ ئی په ریست کورتین ئا وجود نداریت.",
-       "resettokens-legend": "بیئر گردینتین نشانگ ئانی",
        "resettokens-tokens": "نشانگان:",
        "resettokens-token-label": "$1 (انونین اندازه گ: $2)",
        "resettokens-done": "بیئر گردینتین نشانگ ئان.",
        "note": "'''نکته:'''",
        "previewnote": "'''بئ هوش ئا داشته بیئت که ای په قت دیم اینت.'''\nشمی تغیرات تا انون زه خیره نه بوته انت!",
        "continue-editing": "شوتین بی ایڈ\tیٹ\tی نیمگا",
-       "editing": "بی ایڈ\tیٹ\t کورتینی حالا $1",
-       "creating": "بی جوڑ کورتینی حالا $1",
-       "editingsection": "بئ $1 ئی ایڈیٹ کورتینئ حالا (بخش)",
+       "editing": "به $1 ئی دستکاری کورتینێ حالا",
+       "creating": "$1 جۆڑ ئه بيت",
+       "editingsection": "به $1 ئی دستکاری کورتینێ حالا (چونڑ)",
        "editingcomment": "بئ $1 ئی ایڈیٹ کورتینئ حالا (نوکین بخش)",
        "editconflict": "هجومین ایڈیٹ: $1",
+       "explainconflict": "شه وختی که شما ای دیمێ دستکاری ئا شرو کورتێت یک دیگه نپری آیرا ٹگل دات.\nبُرزگین متنین جاگه شامل ئه بیت شه اي دیمێ رقم، به انونین حالتێ تا.\nشمێ ٹگل به متنێ جهلگا نشان داته بوته انت.\nشما باید وتي ٹگل ئانه گۆ انونین متنا لۆڑ کنیت.\nگو \"{{int:savearticle}}\" کيلی ئی پرنچیتین ئا <strong>تانا</strong> بُرزگین متني ئین متنێ جاگه ذخیره ئه بیت.",
        "yourtext": "شمی متن",
        "storedversion": "ذخیره بوته ئین نخسه",
+       "editingold": "'''توجه: شما به ای تاکدیمێ کهنگین نخسه ئی جۆڑ کورتينێ حالا هستیت.'''\nاگه ایشیرا ذخیره‌بکنیت ، هر تغییری که پدا شه ای نخسه ئا بوته انت شه بێن ئه رونت.",
        "yourdiff": "تفاوت‌هان",
        "templatesused": "{{PLURAL:$1|تراشوان|تراشوانان}} استفاده بوته انت بی ای تاکدیمئ تا:",
        "templatesusedpreview": "ای دیم دیست ئی تا استفاده بوته ئین {{PLURAL:$1|تراشوان|تراشوانان}} :",
        "searchprofile-everything-tooltip": "گشتین په موچین محتوا ئان (شاملئ گپ ئی تاکدیمان)",
        "searchprofile-advanced-tooltip": "گشتین بی فضای نام دلخواه",
        "search-result-size": "$1 ({{PLURAL:$2|یک کلیمه|$2 کلیمه}})",
-       "search-redirect": "(تغییرمسیر $1)",
+       "search-redirect": "($1 یي گردینتین)",
        "search-section": "(بخش $1)",
        "search-category": "(تهر  $1)",
        "search-file-match": "(فایلی محتوایی یکرنگی)",
        "right-createtalk": "گپ ئی تاکدیمی جوڑ\t کورتین",
        "right-createaccount": "کار زوروکئ حسابئ جوڑ\t کورتین",
        "right-minoredit": "نشانی کورتین ایڈیٹانی بئ ئنوان کم ئین",
-       "right-move": "تاکدیمی انتقال",
-       "right-move-subpages": "تاکدÛ\8cÙ\85اÙ\86ئ Ø§Ù\86تÙ\82اÙ\84 Ú¯Ù\88 Ø¢Ù\88اÙ\86 Ú¯Ù\88Ù\86Ú\88دÛ\8cÙ\85 Ø¦ان",
+       "right-move": "تاکدیمئ جابجا کورتین",
+       "right-move-subpages": "تاکدÛ\8cÙ\85اÙ\86ئ Ø¬Ø§Ø¨Ø¬Ø§Û\8cÙ\8a Ú¯Û\86 Ø¢Ù\88اÙ\86Ù\8a Ú¯Û\86Ù\86Ú\88دÛ\8cÙ\85ان",
        "right-move-rootuserpages": "کار زوروکین سرشاخه ئین تاکدیمانئ انتقال",
        "right-move-categorypages": "تهر تاکدیمئ انتکال",
        "right-movefile": "فایلی انتقال",
-       "right-suppressredirect": "تاکدÛ\8cÙ\85ئ Ø§Ù\86تÙ\82اÙ\84 Ø¨Û\8cدÙ\88Ù\86 Ø´Ù\87 Ø¯Û\8cÙ\85Û\8cÙ\86 Ù\86اÙ\85Û\8c ØªØºÛ\8cرÙ\85سÛ\8cر Ø¦Û\8c Ø¬Ù\88Ú\91 Ú©Ù\88رتÛ\8cÙ\86",
+       "right-suppressredirect": "تاکدÛ\8cÙ\85ئ Ø¬Ø§Ø¨Ø¬Ø§ Ú©Ù\88رتÛ\8cÙ\86 ØºÛ\8cر Ø´Ù\87 Ø¯Û\8cÙ\85Û\8cÙ\86 Ù\86اÙ\85ئ Ú¯Ø±Ø¯Û\8cÙ\86تÛ\8cÙ\86ا",
        "right-upload": "فایلی بُرز کورتین",
        "right-reupload": "پدا نیویشتین موجودین فایلئ",
        "right-reupload-own": "آ فایلی پدا بُرز کورتین که دیمتیرا هم شه هما کار زوروکی نیمگا یک وار بُرز بوتت",
        "upload-proto-error-text": "بُرز کورتین شه دوردستا به ادرس ئان که گو <code dir=ltr>http://</code> یا <code dir=ltr>ftp://</code>  ئی شرو بیئنت ضرورت داریت .",
        "upload-file-error": "داخلین خطا",
        "upload-misc-error": "نامئلومین خطا بی بُرزکورتینئ تا",
-       "upload-too-many-redirects": "انترنیتی ادرس به شه اندازه ئا تغیرمسیر داریت",
+       "upload-too-many-redirects": "ای انترنیتین ادرس شه اندازه ئا گیشتیر گردینته بوته ئین دیم داریت",
        "upload-http-error": "یک  اچ‌تی‌تی‌پی خطا رخ داته: $1",
        "upload-copy-upload-invalid-domain": "بُرز بوته فایلانی کاپی کورتین شه ای ڈومین ئا امکان نداریت.",
        "backend-fail-stream": "نه توانن $1 ئی فایلا دیم دهین.",
        "mimetype": "MIME ئی رکم:",
        "download": "ائیر کورتین",
        "unwatchedpages": "دیسته نه یوته ئین تاکدیمان",
-       "listredirects": "تغیرمسیر ئی تاکدیمانی لڑ",
+       "listredirects": "گردینته بوته ئین تاکدیمانی لڑلیست",
        "listduplicatedfiles": "موچین فایل ئانی لڑ ، لۆڑ گۆ تکراری ئان",
        "listduplicatedfiles-entry": "[[:File:$1|$1]][[$3|{{PLURAL:$2|یک تکرار|$2 تکرار}}]] داریت.",
        "unusedtemplates": "استفاده نه بوته ئین تراشوانان",
        "randomincategory-nopages": "هیچ تاکدیمی بئ  [[:Category:$1|$1]] ئی تهری تا موجود نه اینت.",
        "randomincategory-category": "تهر:",
        "randomincategory-legend": "تصادفین تاکدیم بئ تهرئی تا",
-       "randomredirect": "تغÛ\8cÛ\8cرÙ\85سÛ\8cر ØªØµØ§Ø¯Ù\81Û\8c",
+       "randomredirect": "بÛ\8e Ù\82ستÛ\8cÙ\86 Ú¯Ø±Ø¯Û\8cÙ\86تÛ\8cÙ\86",
        "randomredirect-nopages": "هیج تغیر مسیر بئ  «$1» ئی نامی فضای تا موجود نه اینت.",
        "statistics": "ارقام",
        "statistics-header-pages": "ای تاکدیمئ ارقام",
        "pageswithprop-submit": "برا",
        "pageswithprop-prophidden-long": "($1) ئی تچکین متنی چیهرین جزییات",
        "pageswithprop-prophidden-binary": "($1) ئی باینری چیهرین اندازگ ئی جزییات",
-       "doubleredirects": "دوتائین تغیرمسیرئان",
+       "doubleredirects": "ڈبل گردینتێن",
        "double-redirect-fixer": "تغیرمسیرئانی تئمیرکار",
        "brokenredirects": "خرابین تغیرمسیر",
        "brokenredirectstext": "جهلگین تغییرمسیرئان بئ یک ناموجودین دیمی لینک دارنت:",
        "newpages": "نوکین تاکدیم",
        "newpages-username": "کار زوروکین نام:",
        "ancientpages": "کهنگین تاکدیمان",
-       "move": "اÙ\86تÙ\82اÙ\84",
+       "move": "جابجاÛ\8cÙ\8a",
        "movethispage": "ای تاکدیمی انتقال",
        "notargettitle": "بی شه هدفا",
        "nopagetitle": "ایرنگی تاکدیمئ وجود نداریت",
        "table_pager_empty": "هیچ نتیجه",
        "autosumm-blank": "تاکدیما خالی کورت",
        "autosumm-replace": "تاکدیمی جابجایی گۆ '$1'",
-       "autoredircomment": "جÙ\87ت Û\8cÛ\8c ØªØºÛ\8cر Ø¨Ø¦ [[$1]]",
+       "autoredircomment": "اÛ\8c ØªØ§Ú©Ø¯Û\8cÙ\85 Ø¨Ù\87 [[$1]] Ø¦Ø§ Ú¯Ø±Ø¯Û\8cÙ\86تÙ\87 Ø¨Ù\88ت",
        "autosumm-new": "نوکین دیمی گۆ «$1» ئا جۆڑ کورت",
        "autosumm-newblank": "خالی ئین دیمی جۆڑ بوت",
        "watchlistedit-normal-title": "دیدارلیست ئی ایڈیٹ کورتین",
        "version-libraries": "نصب بوته ئین کتابخانه",
        "version-libraries-library": "کتابجاه",
        "version-libraries-version": "نخسه",
-       "redirect-legend": "جابجا په یک پایل یا دیم ئی",
+       "redirect-legend": "گردینتین په یک پایل یا تاکدیمئ",
        "redirect-submit": "برا",
        "redirect-lookup": "گشتین:",
        "redirect-value": "اندازه گ:",
        "specialpages-group-pages": "تاکدیمانی لڑ\t لیست",
        "specialpages-group-pagetools": "تاکدیمانئ وسایلان",
        "specialpages-group-wiki": "دتا و وسایلان",
-       "specialpages-group-redirects": "مسیر ئی تغیری خاسین تاکدیمان",
+       "specialpages-group-redirects": "گردینۆکین خاسین تاکدیمان",
        "specialpages-group-spam": "سپم ئی وسایلان",
        "specialpages-group-developer": "توسه ئه دهوکین وسایلان",
        "blankpage": "خالی ئین دیم",
        "special-characters-group-khmer": "خمر",
        "special-characters-title-endash": "پاسیله خت",
        "special-characters-title-emdash": "تچکین پاسیله خت",
-       "special-characters-title-minus": "منپی نشانگ"
+       "special-characters-title-minus": "منپی نشانگ",
+       "mw-widgets-titleinput-description-redirect": "گردینتین به $1 یی تا"
 }
index f5189a1..b0a7ed1 100644 (file)
        "category-file-count-limited": "वर्तमान में निम्नलिखित {{PLURAL:$1|पन्ना|$1 पन्नां}} इ श्रेणीं में बाड़े।",
        "listingcontinuesabbrev": "जारी...",
        "index-category": "सूचीबद्ध पृष्ठ",
-       "noindex-category": "à¤\85सà¥\82à¤\9aà¥\80बदà¥\8dध à¤ªà¥\83षà¥\8dठ",
+       "noindex-category": "बिना à¤¸à¥\82à¤\9aà¥\80बदà¥\8dध à¤ªà¤¨à¥\8dना",
        "broken-file-category": "टूटल फ़ाइल कड़ियन वाला पन्ना",
        "about": "बारे में",
        "article": "सामग्री पन्ना",
        "nstab-project": "प्रोजेक्ट पन्ना",
        "nstab-image": "फाइल",
        "nstab-mediawiki": "सन्देश",
-       "nstab-template": "साà¤\81à¤\9aा",
+       "nstab-template": "à¤\9fà¥\87मà¥\8dपलà¥\87à¤\9f",
        "nstab-help": "मदद पन्ना",
        "nstab-category": "श्रेणी",
        "nosuchaction": "अईसन कौनो कार्रवाई नाहि",
        "passwordreset": "गुप्तशब्द (पासवर्ड) रिसेट करीं",
        "passwordreset-text-one": "आपन गुप्तशब्द के पुनर्स्थापित करे खातिर इ फॉर्म भरीं।",
        "passwordreset-text-many": "{{PLURAL:$1|ईमेल द्वारा अस्थाई पासवर्ड पावे खातिर निम्न में से कउनो एगो स्थान भरीं।}}",
-       "passwordreset-legend": "गुप्तशब्द रिसेट करीं",
        "passwordreset-disabled": "इ विकी पर पासवर्ड पुनर्स्थापन अक्षम बा।",
        "passwordreset-emaildisabled": "इ विकि पर ई-मेल सुविधा अक्षम कर दिहल गईल बा।",
        "passwordreset-username": "प्रयोगकर्ता नाम",
        "resettokens": "टोकन रीसेट करीं",
        "resettokens-text": "जौन टोकन राउर खाता से सम्बद्ध कुछ विशिष्ट व्यक्तिगत जानकारी प्रदान करेला, आप उ के अहिजा रीसेट कर सकत बानी।\n\nयदि रउआ ई के गलती से केहू के दिखा देले बानी या फिर राउर खाता हैक हो गईल बा त रउआ ई के रीसेट कर देवे के चाहीं।",
        "resettokens-no-tokens": "रीसेट करे खातिर कउनो टोकन नइखे।",
-       "resettokens-legend": "टोकन रीसेट करीं",
        "resettokens-tokens": "टोकन:",
        "resettokens-token-label": "$1 (वर्तमान मूल्य: $2)",
        "resettokens-watchlist-token": "[[Special:Watchlist|आपके ध्यानसूची के पन्नन में बदलावसभ]] के वेब फ़ीड (Atom/RSS) हेतु टोकन",
        "yourtext": "राउर पाठ्य",
        "storedversion": "सुरक्षित करल गईल संशोधन",
        "yourdiff": "अंतर",
-       "templatesused": "ए पन्ना पर इस्तेमाल {{PLURAL:$1|साँचा|साँचा कुल}}:",
-       "templatesusedpreview": "इ पुर्वावलोकन में प्रयुक्त {{PLURAL:$1|खाँचा|खाँचा कुल}}:",
+       "templatesused": "ए पन्ना पर इस्तेमाल {{PLURAL:$1|टेम्पलेट|टेम्पलेट कुल}}:",
+       "templatesusedpreview": "इ पुर्वावलोकन में प्रयुक्त {{PLURAL:$1|टेम्पलेट|टेम्पलेट कुल}}:",
+       "templatesusedsection": "एह खण्ड में इस्तेमाल {{PLURAL:$1|टेम्पलेट|कुल}}:",
        "template-protected": "(सुरक्षित)",
        "template-semiprotected": "(कुछ-सुरक्षित)",
        "hiddencategories": "ई पन्ना {{PLURAL:$1|1 छिपल श्रेणी|$1 छिपल श्रेणीसभ}} के सदस्य बा:",
        "listfiles_thumb": "चिप्पी",
        "listfiles_date": "तिथि",
        "listfiles_name": "नाँव",
+       "listfiles_user": "सदस्य",
+       "listfiles_description": "विवरण",
+       "listfiles_count": "संस्करण",
+       "listfiles-latestversion": "वर्तमान संस्करण",
        "file-anchor-link": "फाइल",
        "filehist": "पन्ना के इतिहास",
        "filehist-help": "ओ समय ई फाइल कइसन लउके ई देखे खातिर कौनों तारीख/समय पर क्लिक करीं।",
        "randompage": "बेतरतीब पन्ना",
        "randomincategory": "श्रेणी में अनियमित पन्ना",
        "randomincategory-nopages": "[[:Category:$1|$1]] श्रेणी में कउनो पन्ना नइखे।",
+       "randomincategory-category": "श्रेणी:",
        "randomincategory-legend": "श्रेणी में अनियमित पन्ना",
-       "statistics": "तथ्यांकसभ",
-       "statistics-header-edits": "तथ्यांक सम्पादन",
-       "statistics-header-hooks": "अन्य तथ्यांक",
+       "randomincategory-submit": "जाईं",
+       "statistics": "सांख्यिकी",
+       "statistics-header-pages": "पन्ना सांख्यिकी",
+       "statistics-header-edits": "संपादन सांख्यिकी",
+       "statistics-header-users": "सदस्य सांख्यिकी",
+       "statistics-header-hooks": "अन्य सांख्यिकी",
+       "statistics-articles": "सामग्री पन्ना",
+       "statistics-pages": "पन्ना सभ",
+       "statistics-pages-desc": "विकि पर सगरी पन्ना, वार्ता पन्ना, अनुप्रेषण इत्यादि समेत।",
+       "statistics-files": "अपलोड कइल फाइल सभ",
+       "statistics-edits": "{{SITENAME}} सेट अप की बाद पन्ना संपादन संख्या",
+       "statistics-edits-average": "प्रति पन्ना औसत संपादन",
+       "statistics-users": "रजिस्टर्ड [[Special:ListUsers|सदस्य]]",
+       "statistics-users-active": "सक्रिय सदस्य",
+       "statistics-users-active-desc": "सदस्य लोग जे पछिला {{PLURAL:$1|दिन|$1 दिन}} में कौनों काम कइले बाटे",
        "pageswithprop": "पन्ना-गुण वाला पन्नासभ",
+       "pageswithprop-legend": "पन्ना प्रापर्टी वाला पन्ना सभ",
+       "pageswithprop-prop": "प्रापर्टी नाँव:",
+       "pageswithprop-submit": "जाईं",
        "doubleredirects": "दोहरा पुननिर्देशित पन्ना",
        "brokenredirects": "टूटल पुनर्निर्देशन पन्ना",
+       "brokenredirects-edit": "संपादन",
+       "brokenredirects-delete": "मिटाईं",
        "withoutinterwiki": "बिना अंतरविकि जोड़ वाला पन्ना",
+       "withoutinterwiki-summary": "ई पन्ना सभ कौनों दुसरा भाषा की वर्जन से नइखे जुड़ल।",
+       "withoutinterwiki-legend": "उपसर्ग",
+       "withoutinterwiki-submit": "देखाईं",
        "fewestrevisions": "सबसे कम संशोधन वाला पन्ना",
        "nbytes": "$1 {{PLURAL:$1|बाइट|बाइट्स}}",
        "ncategories": "{{PLURAL:$1|श्रेणी|श्रेणीसभ}}",
+       "ninterwikis": "$1 {{PLURAL:$1|इंटरविकि|इंटरविकि सभ}}",
+       "nlinks": "$1 {{PLURAL:$1|कड़ी|कड़ी सभ}}",
+       "nmembers": "$1 {{PLURAL:$1|मेंबर|मेंबर सभ}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|मेंबर|मेंबर सभ}}",
+       "nrevisions": "$1 {{PLURAL:$1|रिवीजन|रिवीजन सभ}}",
+       "nimagelinks": "Used on $1 {{PLURAL:$1|पन्ना|पन्ना सभ}}",
+       "ntransclusions": "used on $1 {{PLURAL:$1|पन्ना|पन्ना सभ}}",
+       "specialpage-empty": "एह रिपोर्ट खातिर कौनों रिजल्ट नइखे",
        "lonelypages": "अनाथ पन्ना",
        "lonelypagestext": "ई पन्ना कुल कौनों दूसर पन्ना से नइखें जुड़ल न कौनों में ट्रांसक्लूड बाड़ें",
        "uncategorizedpages": "बिना श्रेणी के पन्ना",
        "wantedcategories": "श्रेणी चाहत बा",
        "wantedpages": "पन्ना चाहत बा",
        "wantedfiles": "जरुरत के फाईलसभ",
+       "wantedfiletext-nocat-noforeign": "ई फाइल सभ इस्तेमाल में बाटे बाकी मौजूद नइखे।",
        "wantedtemplates": "जरुरत के खाँचा",
+       "mostlinked": "सबसे ढेर पन्ना-जोड़ वाला",
        "mostlinkedcategories": "सबसे अधिक से जुड़ल श्रेणीसभ",
+       "mostlinkedtemplates": "सभसे ढेर ट्रांसक्लूजन वाला पन्ना",
        "mostcategories": "सबसे अधिक श्रेणी वाला पन्नाकुल",
+       "mostimages": "सभसे ढेर फाइल-जोड़ वाला",
+       "mostinterwikis": "सभसे ढेर इंटरविकि वाला पन्ना",
+       "mostrevisions": "सभसे ढेर रिवीजन वाला पन्ना सभ",
        "prefixindex": "उपसर्ग अनुसार पन्ना",
        "shortpages": "छोट पन्नासभ",
        "longpages": "लमहर पन्ना",
        "deadendpages": "मरल-खपल पन्ना",
        "protectedpages": "सुरक्षित पन्ना",
+       "protectedpages-noredirect": "अनुप्रेषण छिपाईं",
+       "protectedpagesempty": "कौनों पन्ना के सुरक्षा ए पैमान पर नइखे",
+       "protectedpages-timestamp": "टाइममोहर",
+       "protectedpages-page": "पन्ना",
+       "protectedpages-expiry": "एक्सपायर हो जाई",
+       "protectedpages-performer": "सदस्य सुरक्षा",
+       "protectedpages-params": "सुरक्षा पैमाना",
+       "protectedpages-reason": "कारण",
+       "protectedpages-unknown-timestamp": "नामालूम",
+       "protectedpages-unknown-performer": "नामालूम सदस्य",
        "protectedtitles": "सुरक्षित शीर्षक",
+       "protectedtitlesempty": "कौनों टाइटिल के सुरक्षा एह पैमान पर नइखे।",
        "listusers": "सदस्यसूची",
+       "listusers-editsonly": "उहे सदस्य देखाईं जे संपादन कइले होखे",
+       "listusers-creationsort": "बनवले की तारीख की हिसाब से सरियाईं",
+       "listusers-desc": "घटत क्रम से सरियाईं",
+       "usereditcount": "$1 {{PLURAL:$1|संपादन|संपादन सभ}}",
        "newpages": "नया पन्ना",
+       "newpages-username": "सदस्यनाँव:",
        "ancientpages": "सभन से पुरान पन्नासभ",
        "move": "स्थान्तरण",
        "movethispage": "ई पन्ना के स्थांतरण करीं",
+       "suppress": "ओवरसाइटर",
+       "apihelp": "एपीआइ (API) मदद",
        "apihelp-no-such-module": "मॉड्युल $1 ना मिलल।",
        "booksources": "किताबी स्रोत",
        "booksources-search-legend": "किताबी स्रोत के खोज",
        "booksources-search": "खोज",
        "log": "सगरी लॉग",
+       "allpages": "सगरी पन्ना",
+       "nextpage": "अगिला पन्ना ($1)",
+       "prevpage": "पछिला पन्ना ($1)",
+       "allpagesfrom": "पन्ना देखाई जे शुरू होत बा:",
+       "allpagesto": "पन्ना देखाईं जे खतम होत बा:",
        "allarticles": "सगरी पन्ना",
+       "allinnamespace": "सगरी पन्ना ($1 namespace)",
        "allpagessubmit": "जाईं",
        "allpagesprefix": "उपसर्ग के साथे पन्ना प्रदर्शन:",
+       "allpages-bad-ns": "{{SITENAME}} पर \"$1\" नामस्थान नइखे।",
+       "allpages-hide-redirects": "अनुप्रेषण छिपाईं",
+       "cachedspecial-viewing-cached-ttl": "आप कैश कइल वर्जन देखत बानी जेवन $1 ले पुरान हो सकत बा।",
+       "cachedspecial-refresh-now": "सभसे नया देखाईं।",
        "categories": "श्रेणीसभ",
        "activeusers": "सक्रिय सदस्यन के सूची",
        "listgrouprights": "सदस्य समूह अधिकारसभ",
        "trackingcategories": "नजर रखे वाला श्रेणीसभ",
+       "trackingcategories-msg": "निगरानी श्रेणी",
+       "trackingcategories-name": "संदेस नाँव",
        "emailuser": "ई प्रयोगकर्ता के ईमेल करीं",
        "watchlist": "ध्यानसूची",
        "mywatchlist": "धियानसूची",
        "rollbacklinkcount": "रोलबैक $1 {{PLURAL:$1|संपादन|संपादन सब}}",
        "protectlogpage": "सुरक्षा लॉग",
        "protectlogtext": "नीचे पन्ना सुरक्षा में भइल बदलावकुल के सूची बा।\nहाल में सुरक्षित पन्नन के सूची खातिर [[Special:ProtectedPages|सुरक्षित पन्नन के सूची]] देखीं।",
+       "restriction-move": "स्थानांतरण",
+       "restriction-create": "बनावे पर",
+       "restriction-upload": "अपलोड",
+       "restriction-level-sysop": "पुरा सुरक्षित",
+       "restriction-level-autoconfirmed": "आधा सुरक्षित",
+       "restriction-level-all": "कौनों लेवल",
+       "undelete": "हटावल पन्ना देखीं",
+       "undeletepage": "हटावल पन्ना देखीं आ वापिस ले आईं",
        "undeletelink": "देखीं/बहाल करीं",
        "namespace": "नामस्थान:",
        "invert": "चुनाव पलटीं",
index 12d31c6..ab02ac4 100644 (file)
                ]
        },
        "tog-underline": "Podvuci veze:",
-       "tog-hideminor": "Sakrij male izmjene u spisku nedavnih izmjena",
+       "tog-hideminor": "Sakrij manje izmjene u spisku nedavnih izmjena",
        "tog-hidepatrolled": "Sakrij patrolirane izmjene u nedavnim promjenama",
        "tog-newpageshidepatrolled": "Sakrij patrolirane stranice sa spiska novih stranica",
        "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 traku s alatkama za uređivanje",
-       "tog-editondblclick": "Izmijeni stranice dvostrukim klikom",
-       "tog-editsectiononrightclick": "Uključite uređivanje odjeljka sa pritiskom na desno dugme miša u naslovu odjeljka",
+       "tog-editondblclick": "Uredi stranice dvostrukim klikom",
+       "tog-editsectiononrightclick": "Uključi uređivanje odjeljka sa pritiskom na desno dugme miša u naslovu odjeljka",
        "tog-watchcreations": "Dodaj stranice i datoteke koje napravim na moj spisak praćenih članaka",
        "tog-watchdefault": "Dodaj stranice i datoteke koje uređujem na moj spisak praćenih članaka",
        "tog-watchmoves": "Dodaj stranice i datoteke koje premjestim na moj spisak praćenih članaka",
        "tog-watchdeletion": "Dodaj stranice i datoteke koje izbrišem na moj spisak praćenih članaka",
        "tog-watchrollback": "Sve stranice za koje sam izvršio povrat izmjena stavi na spisak praćenja",
-       "tog-minordefault": "Označi sve izmjene malim isprva",
-       "tog-previewontop": "Prikaži pretpregled prije polja za izmjenu a ne poslije",
+       "tog-minordefault": "Označi sve izmjene manjim isprva",
+       "tog-previewontop": "Prikaži pregled iznad okvira za uređivanje",
        "tog-previewonfirst": "Prikaži izgled pri prvoj izmjeni",
-       "tog-enotifwatchlistpages": "Pošalji mi e-mail kada se promijeni stranica ili datoteka sa mog spiska praćenih članaka",
+       "tog-enotifwatchlistpages": "Pošalji mi e-poštu kada se promijeni stranica ili datoteka sa mog spiska praćenih članaka",
        "tog-enotifusertalkpages": "Pošalji mi e-poštu kad se promijeni moja korisnička stranica za razgovor",
        "tog-enotifminoredits": "Također mi pošalji e-poštu za male izmjene na stranicama i datotekama",
        "tog-enotifrevealaddr": "Otkrij adresu moje e-pošte u porukama obavještenja",
        "tog-shownumberswatching": "Prikaži broj korisnika koji prate",
        "tog-oldsig": "Postojeći potpis:",
        "tog-fancysig": "Smatraj potpis kao wikitekst (bez automatskog linka)",
-       "tog-uselivepreview": "Koristite pregled uživo",
+       "tog-uselivepreview": "Koristi pregled uživo",
        "tog-forceeditsummary": "Opomeni me pri unosu praznog sažetka",
        "tog-watchlisthideown": "Sakrij moje izmjene sa spiska praćenih članaka",
        "tog-watchlisthidebots": "Sakrij izmjene botova sa spiska praćenih članaka",
-       "tog-watchlisthideminor": "Sakrij zanemarljive izmjene sa spiska mojih praćenja",
-       "tog-watchlisthideliu": "Sakrij promjene prijavljenih korisnika sa liste praćenja",
-       "tog-watchlisthideanons": "Sakrij promjene anonimnih korisnika sa liste praćenja",
+       "tog-watchlisthideminor": "Sakrij manje izmjene sa spiska praćenih članaka",
+       "tog-watchlisthideliu": "Sakrij izmjene prijavljenih korisnika sa spiska praćenih članaka",
+       "tog-watchlisthideanons": "Sakrij izmjene anonimnih korisnika sa spiska praćenih članaka",
        "tog-watchlisthidepatrolled": "Sakrij patrolirane izmjene sa spiska praćenja",
        "tog-ccmeonemails": "Pošalji mi kopije e-pošte koju pošaljem drugim korisnicima",
-       "tog-diffonly": "Ne prikazuj sadržaj stranice ispod prikaza razlika",
+       "tog-diffonly": "Ne prikazuj sadržaj stranice ispod razlika",
        "tog-showhiddencats": "Prikaži skrivene kategorije",
-       "tog-norollbackdiff": "Nakon vraćanja zanemari prikaz razlika",
-       "tog-useeditwarning": "Upozori me kada napustim stranicu za izmjene bez spašenih promjena",
+       "tog-norollbackdiff": "Izostavi razliku nakon vraćanja",
+       "tog-useeditwarning": "Upozori me kad napuštam stranicu za izmjene bez sačuvanih promjena",
        "tog-prefershttps": "Uvijek koristi sigurnu konekciju kada sam prijavljen.",
        "underline-always": "Uvijek",
        "underline-never": "Nikad",
        "underline-default": "Po standardu izgleda ili preglednika",
-       "editfont-style": "Stil slova područja uređivanja:",
+       "editfont-style": "Stil fonta u okviru za uređivanje:",
        "editfont-default": "Po postavkama preglednika",
        "editfont-monospace": "Slova sa jednostrukim razmakom",
        "editfont-sansserif": "Beserifni font",
        "about": "O",
        "article": "Članak",
        "newwindow": "(otvara se u novom prozoru)",
-       "cancel": "Poništite",
+       "cancel": "Odustani",
        "moredotdotdot": "Više...",
        "morenotlisted": "Ovaj spisak nije potpun.",
        "mypage": "Korisnička stranica",
        "readonly_lag": "Baza podataka je zaključana dok se sekundarne baze podataka na serveru ne sastave sa glavnom.",
        "internalerror": "Unutrašnja greška",
        "internalerror_info": "Interna greška: $1",
+       "internalerror-fatal-exception": "Fatalna greška tipa \"$1\"",
        "filecopyerror": "Ne može se kopirati \"$1\" na \"$2\".",
        "filerenameerror": "Ne može se promjeniti ime datoteke \"$1\" u \"$2\".",
        "filedeleteerror": "Ne može se izbrisati datoteka \"$1\".",
        "title-invalid-interwiki": "Traženi naslov stranice sadrži interwiki link koji ne može biti korišten u naslovima.",
        "title-invalid-talk-namespace": "Vaš zatraženi naslov stranice se odnosi na stranicu za razgovor koja ne može postojati.",
        "title-invalid-characters": "Vaš zatraženi naslov stranice sadrži nevažeće znakove: \"$1\".",
+       "title-invalid-relative": "Naslov ima relativnu putanja. Relativni naslovi stranica (./, ../) nisu važeći jer će često biti nedostupni u pregledniku korisnika.",
+       "title-invalid-magic-tilde": "Zatraženi naslov stranice sadrži nevažeći slijed magičknog znaka tilda (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Zatraženi naziv stranice je predugačak. Ne smije biti duži od {{PLURAL:$1|bajta|bajtova}} u UTF-8 kodiranju.",
        "title-invalid-leading-colon": "Zahtjevani naslov stranice sadrži nevažeću dvotačku na početku.",
        "perfcached": "Sljedeći podaci su keširani i možda neće biti u potpunosti ažurirani. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata}}.",
        "perfcachedts": "Sljedeći podaci nalaze se u memoriji i posljednji put ažurirani su $1. Keš sadrži najviše {{PLURAL:$4|jedan rezultat|$4 rezultata}}.",
        "protectedinterface": "Ova stranica sadrži tekst korisničkog okruženja za softver na ovom wikiju i zaštićena je radi sprečavanja zloupotrebe.\nDa biste dodali ili izmjenili prijevode svih wikija, posjetite [//translatewiki.net/  translatewiki.net], projekat za lokalizaciju Mediawikija.",
        "editinginterface": "<strong>Upozorenje:</strong> Mijenjate stranicu koja sadrži aktivan tekst programa.\nPromjene na ovoj stranici dovode i do promjena za druge korisnike ovog wikija.\nZa dodavanje ili promjene prijevoda za sve wikije, molimo Vas koristite [//translatewiki.net/ translatewiki.net], projekt prijevoda za MediaWiki.",
        "translateinterface": "Za dodavanje ili promjenu prijevoda za sve wikije koristite [//translatewiki.net/ translatewiki.net], projekt za lokalizaciju MediaWikija.",
-       "cascadeprotected": "Uređivanje ove stranice zabranjeno je jer sadrži {{PLURAL:$1|stranicu zaštićenu|stranice zaštićene}} od uređivanja iz razloga:\n$2",
+       "cascadeprotected": "Uređivanje ove stranice zabranjeno je jer se koristi u {{PLURAL:$1|sljedećoj stranici, koja je zaštićena|sljedećim stranicama, koje su zaštićene}} prenosivom zaštitom:\n$2",
        "namespaceprotected": "Vi nemate dozvulu da mijenjate stranicu '''$1'''.",
        "customcssprotected": "Nemate dozvolu za mijenjanje ove CSS stranice jer sadrži osobne postavke nekog drugog korisnika.",
        "customjsprotected": "Nemate dozvolu za mijenjanje ove JavaScript stranice jer sadrži osobne postavke nekog drugog korisnika.",
        "wrongpassword": "Unijeli ste neispravnu šifru.\nMolimo Vas da pokušate ponovno.",
        "wrongpasswordempty": "Šifra je bila prazna.\nMolimo Vas da pokušate ponovno.",
        "passwordtooshort": "Šifra mora imati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}.",
+       "passwordtoolong": "Šifre ne mogu biti duže od {{PLURAL:$1|jednog znaka|$1 znaka|$1 znakova}}.",
        "password-name-match": "Vaša šifra mora biti različita od Vašeg korisničkog imena.",
        "password-login-forbidden": "Korištenje ovih korisničkih imena i šifara je zabranjeo.",
        "mailmypassword": "Poništi lozinku",
        "hr_tip": "Horizontalna linija (koristite oskudno)",
        "summary": "Sažetak:",
        "subject": "Tema/naslov:",
-       "minoredit": "Ovo je mala izmjena",
+       "minoredit": "Ovo je manja izmjena",
        "watchthis": "Prati ovu stranicu",
        "savearticle": "Sačuvaj",
        "preview": "Pregled stranice",
        "yourdiff": "Razlike",
        "copyrightwarning": "Za sve priloge poslane na projekt {{SITENAME}} smatramo da su objavljeni pod $2 (konsultirajte $1 za detalje).\nAko ne želite da vaši članci budu podložni izmjenama i slobodnoj distribuciji i objavljivanju,\nnemojte ih slati ovdje. Također, slanje članka podrazumijeva i Vašu izjavu da ste ga napisali sami ili da ste ga kopirali iz izvora u javnom domenu ili sličnog slobodnog izvora.\n\n'''NEMOJTE SLATI RAD ZAŠTIĆEN AUTORSKIM PRAVIMA BEZ DOZVOLE AUTORA!'''",
        "copyrightwarning2": "Zapamtite da svi doprinosi na stranici {{SITENAME}} može biti izmijenjen, promijenjen ili uklonjen od strane ostalih korisnika. Ako ne želite da ovo desi sa Vašim tekstom, onda ga nemojte slati ovdje.<br />\nTakođer nam garantujete da ste ovo Vi napisali, ili da ste ga kopirali iz javne domene ili sličnog slobodnog izvora informacija (pogledajte $1 za više detalja).\n'''NE ŠALJITE AUTORSKIM PRAVOM ZAŠTIĆENE TEKSTOVE BEZ DOZVOLE!'''",
+       "editpage-cannot-use-custom-model": "Model sadržaja ove stranice se ne može promijeniti.",
        "longpageerror": "'''Greška: Tekst, koji ste poslali, je dug {{PLURAL:$1|jedan kilobajt|$1 kilobajta}}, što je veće od maksimuma, koji iznosi {{PLURAL:$2|jedan kilobajt|$2 kilobajta}}.'''\nStranica ne može biti sačuvana.",
        "readonlywarning": "'''PAŽNJA: Baza je zaključana zbog održavanja, tako da nećete moći da sačuvate svoje izmjene za sada.'''\nMožda želite da kopirate i nalijepite tekst u tekst editor i sačuvate ga za kasnije.\n\nAdministrator koji je zaključao bazu je naveo slijedeće objašnjenje: $1",
        "protectedpagewarning": "'''PAŽNJA: Ova stranica je zaključana tako da samo korisnici sa administratorskim privilegijama mogu da je mijenjaju.'''\nPosljednja stavka u zapisniku je prikazana ispod kao referenca:",
        "semiprotectedpagewarning": "'''Pažnja:''' Ova stranica je zaključana tako da je samo registrovani korisnici mogu uređivati.\nPosljednja stavka zapisnika je prikazana ispod kao referenca:",
-       "cascadeprotectedwarning": "'''Upozorenje:''' Ova stranica je zaključana tako da je samo administratori mogu mijenjati, jer je ona uključena u {{PLURAL:$1|ovu, lančanu povezanu, zaštićenu stranicu|sljedeće, lančano povezane, zaštićene stranice}}:",
+       "cascadeprotectedwarning": "<strong>Upozorenje:</strong> Ova stranica je zaključana tako da je samo administratori mogu mijenjati, jer je ona uključena u {{PLURAL:$1|ovu, lančanu povezanu, zaštićenu stranicu|sljedeće, prenosivo povezane, zaštićene stranice}}:",
        "titleprotectedwarning": "'''UPOZORENJE: Ova stranica je zaključana tako da su potrebna [[Special:ListGroupRights|posebna prava]] da se ona napravi.'''\nPosljednja stavka zapisnika je prikazana ispod kao referenca:",
        "templatesused": "{{PLURAL:$1|Šablon|Šabloni}} koji su upotrebljeni na ovoj stranici:",
        "templatesusedpreview": "{{PLURAL:$1|Šablon|Šabloni}} prikazani u ovom pregledu:",
        "rev-showdeleted": "Pokaži",
        "revisiondelete": "Obriši/vrati revizije",
        "revdelete-nooldid-title": "Nije unesena tačna revizija",
-       "revdelete-nooldid-text": "Niste precizno odredili odredišnu reviziju/revizije da se izvrši ova funkcija, ili ta revizija nepostoji, ili pokušavate sakriti trenutnu reviziju.",
+       "revdelete-nooldid-text": "Niste odredili odredišnu verziju da se izvrši ova funkcija, ili ta verzija ne postoji, ili pokušavate sakriti trenutnu verziju.",
        "revdelete-no-file": "Navedena datoteka ne postoji.",
        "revdelete-show-file-confirm": "Da li ste sigurni da želite pogledati obrisanu reviziju datoteke \"<nowiki>$1</nowiki>\" od $2 u $3?",
        "revdelete-show-file-submit": "Da",
        "editundo": "ukloni ovu izmjenu",
        "diff-empty": "(Nema razlike)",
        "diff-multi-sameuser": "({{PLURAL:$1|Nije prikazana jedna međurevizija|Nisu prikazane $1 međurevizije}} istog korisnika)",
+       "diff-multi-otherusers": "(Nije prikazana {{PLURAL:$1|jedna međuverzija|$1 međuverzija}} {{PLURAL:$2|drugog korisnika|$2 korisnika}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Jedna međurevizija|$1 međurevizije|$1 međurevizija}} od više od $2 {{PLURAL:$2|korisnika|korisnika}} {{PLURAL:$1|nije prikazana|nisu prikazane}})",
        "difference-missing-revision": "{{PLURAL:$2|Jedna izmjena|$2 izmjene}} od ove razlike ($1) ne {{PLURAL:$2|postoji|postoje}}.\n\nOvo se obično dešava kada pratite zastarjelu vezu na stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokol brisanja].",
        "searchresults": "Rezultati pretrage",
        "preferences": "Postavke",
        "mypreferences": "Postavke",
        "prefs-edits": "Broj izmjena:",
-       "prefs-skin": "Koža",
+       "prefsnologintext2": "Prijavite se da biste sačuvali postavke.",
+       "prefs-skin": "Tema",
        "skin-preview": "Pregled",
        "datedefault": "Nije bitno",
        "prefs-labs": "Eksperimentalne mogućnosti",
        "prefs-editwatchlist-raw": "Napredno uređivanje spiska praćenja",
        "prefs-editwatchlist-clear": "Očisti spisak praćenja",
        "prefs-watchlist-days": "Broj dana za prikaz u spisku praćenja:",
-       "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|dan|dana}}",
+       "prefs-watchlist-days-max": "Najviše $1 {{PLURAL:$1|dan|dana}}",
        "prefs-watchlist-edits": "Najveći broj izmjena za prikaz u proširenom spisku praćenja:",
        "prefs-watchlist-edits-max": "Najveći broj: 1000",
-       "prefs-watchlist-token": "Token spiska za praćenje:",
+       "prefs-watchlist-token": "Žeton praćenih članaka:",
        "prefs-misc": "Ostala podešavanja",
        "prefs-resetpass": "Promijeni šifru",
-       "prefs-changeemail": "Promijeni e-mail adresu",
+       "prefs-changeemail": "Promijeni adresu e-pošte",
        "prefs-setemail": "Postavite e-mail adresu",
-       "prefs-email": "E-mail opcije",
+       "prefs-email": "Opcije e-pošte",
        "prefs-rendering": "Izgled",
        "saveprefs": "Sačuvaj",
-       "restoreprefs": "Vrati sve pretpostavljene postavke (u svim sekcijama)",
+       "restoreprefs": "Vrati sve postavke na podrazumijevane (u svim odjeljcima)",
        "prefs-editing": "Uređivanje",
-       "rows": "Redova",
-       "columns": "Kolona",
+       "rows": "Redova:",
+       "columns": "Kolona:",
        "searchresultshead": "Podešavanja rezultata pretrage",
        "stub-threshold": "Formatiranje <a href=\"#\" class=\"stub\">linkova stranica u začetku</a> (bajtova):",
-       "stub-threshold-disabled": "Isključen/a",
+       "stub-threshold-disabled": "Isključeno",
        "recentchangesdays": "Broj dana za prikaz u nedavnim izmjenama:",
-       "recentchangesdays-max": "(najviše $1 {{PLURAL:$1|dan|dana}})",
-       "recentchangescount": "Broj uređivanja za prikaz po pretpostavkama:",
-       "prefs-help-recentchangescount": "Ovo uključuje nedavne izmjene, historije stranice i zapise.",
+       "recentchangesdays-max": "Najviše $1 {{PLURAL:$1|dan|dana}}",
+       "recentchangescount": "Broj izmjena na nedavnim izmjenama:",
+       "prefs-help-recentchangescount": "Ovo uključuje nedavne izmjene, historije stranice i zapisnike.",
        "prefs-help-watchlist-token2": "Ovo je tajni ključ sažetka vašeg spiska izmjena. Ko god da ga zna, moći će ga čitati. Ne dijelite ga ni s kim. Ako je potrebno, [[Special:ResetTokens|možete ga ponovo postaviti]].",
        "savedprefs": "Vaše postavke su sačuvane.",
        "timezonelegend": "Vremenska zona:",
        "prefs-files": "Datoteke",
        "prefs-custom-css": "Prilagođeni CSS",
        "prefs-custom-js": "Prilagođeni JavaScript",
-       "prefs-common-css-js": "Dijeljeni CSS/JS za sve kože:",
+       "prefs-common-css-js": "Dijeljeni CSS/JavaScript za sve teme:",
        "prefs-reset-intro": "Možete koristiti ovu stranicu da poništite Vaše postavke na ovom sajtu na pretpostavljene vrijednosti.\nOvo se ne može vratiti unazad.",
-       "prefs-emailconfirm-label": "E-mail potvrda:",
-       "youremail": "E-mail:",
+       "prefs-emailconfirm-label": "Potvrda e-pošte:",
+       "youremail": "Adresa e-pošte:",
        "username": "{{GENDER:$1|Korisničko}} ime:",
        "prefs-memberingroups": "{{GENDER:$2|Korisnik|Korisnica}} je član {{PLURAL:$1|grupe|grupâ}}:",
        "prefs-registration": "Vrijeme registracije:",
        "badsig": "Loš sirovi potpis.\nProvjerite HTML tagove.",
        "badsiglength": "Vaš potpis je predug.\nMora biti manji od $1 {{PLURAL:$1|znaka|znaka|znakova}}.",
        "yourgender": "Kako želite da se predstavite?",
-       "gender-unknown": "Ne previše detaljno",
+       "gender-unknown": "Kad vas spominje, softver će pokušati koristiti srednji rod kad god je to moguće",
        "gender-male": "On uređuje wiki stranice",
        "gender-female": "Ona uređuje wiki stranice",
-       "prefs-help-gender": "Postavljanje ovih podešavanja je optionalno: Softver koristi ove vrijednosti za vaše naslovljanje i ispravke gramatičkog roda u porukama softvera. Ova informacija bit će javna.",
+       "prefs-help-gender": "Postavljanje ovih podešavanja nije obavezno.\nSoftver koristi ove vrijednosti za vaše naslovljanje i ispravke gramatičkog roda u porukama softvera. Ova će informacija biti javna.",
        "email": "E-mail",
        "prefs-help-realname": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje vašem radu.",
-       "prefs-help-email": "E-mail adresa je opcionalna, ali je potrebna jer omogućava da Vam se pošalje nova šifra u slučaju da je izgubite ili zaboravite.",
-       "prefs-help-email-others": "Također možete da odaberete da vas drugi kontaktiraju putem vaše korisničke stranice ili stranice za razgovor bez otkrivanja vašeg identiteta.",
+       "prefs-help-email": "Adresa e-pošte nije obavezna, ali je potrebna u slučaju ponovnog postavljanja šifre, ako je zaboravite.",
+       "prefs-help-email-others": "Također možete dopustiti drugim korisnicima da vas kontaktiraju preko linka na lijevoj strani vaše stranice ili stranice za razgovor.\nVaša adresa e-pošte neće biti prikazana drugim korisnicima koji vas kontaktiraju.",
        "prefs-help-email-required": "Neophodno je navesti e-mail adresu.",
        "prefs-info": "Osnovne informacije",
        "prefs-i18n": "Internacionalizacija",
        "prefs-dateformat": "Format datuma",
        "prefs-timeoffset": "Vremenska razlika",
        "prefs-advancedediting": "Opće opcije",
-       "prefs-editor": "Urednik",
-       "prefs-preview": "Prethodni pregled",
+       "prefs-editor": "Uređivač",
+       "prefs-preview": "Pregled",
        "prefs-advancedrc": "Napredne opcije",
        "prefs-advancedrendering": "Napredne opcije",
        "prefs-advancedsearchoptions": "Napredne opcije",
        "prefs-diffs": "Razlike",
        "prefs-help-prefershttps": "Ova podešavanja će stupiti na snagu pri sljedećoj prijavi.",
        "prefswarning-warning": "Napravili ste promjene u vašim postavkama koje još uvijek nisu sačuvane. Ako napustite ovu stranicu bez da pritisnete na \"$1\", postavke neće biti ažurirane.",
+       "prefs-tabs-navigation-hint": "Savjet: Možete koristiti tipke sa lijevom i desnom strelicom za kretanje kroz kartice.",
        "email-address-validity-valid": "Izgleda valjano",
        "email-address-validity-invalid": "Neophodna valjana adresa!",
        "userrights": "Postavke korisničkih prava",
        "right-protect": "Promjena nivoa zaštite i uređivanje kaskadno zaštićenih stranica",
        "right-editprotected": "Uređivanje stranice zaštićenih kao \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Uređivanje stranica zaštićenih kao  \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Uređivanje modela sadržaja stranice",
        "right-editinterface": "Uređivanje korisničkog interfejsa",
        "right-editusercssjs": "Uređivanje CSS i JS datoteka drugih korisnika",
        "right-editusercss": "Uređivanje CSS datoteka drugih korisnika",
        "right-passwordreset": "Pogledaj e-mailove za obnavljanje šifre",
        "right-managechangetags": "Napravi i briši [[Special:Tags|oznake]] iz baze podataka",
        "right-applychangetags": "Primijeni [[Special:Tags|oznake]] na nečije izmjene",
+       "right-changetags": "Dodavanje ili uklanjanje raznih [[Special:Tags|oznaka]] na pojedinačnim verzijama i unosima zapisnika",
        "newuserlogpage": "Zapisnik novih korisnika",
        "newuserlogpagetext": "Ovo je zapis o registraciji novih korisnika.",
        "rightslog": "Zapisnik korisničkih prava",
        "action-viewmywatchlist": "pogledajte svoj spisak praćenih stranica",
        "action-viewmyprivateinfo": "pogledajte svoje privatne informacije",
        "action-editmyprivateinfo": "uredite svoje privatne podatke",
+       "action-editcontentmodel": "uredi model sadržaja stranice",
        "action-managechangetags": "napravite i uklonite oznake iz baze podataka",
+       "action-applychangetags": "dodate oznake uz vaše izmjene",
+       "action-changetags": "dodate ili uklonite razne oznake na pojedinačnim verzijama i unosima u zapisnicima",
        "nchanges": "$1 {{PLURAL:$1|promjena|promjene|promjena}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|izmjena od Vaše posljedne posjete}}",
        "enhancedrc-history": "historija",
        "fileexists-shared-forbidden": "Datoteka s ovim imenom već postoji u zajedničkoj ostavi. Molimo Vas da se vratite i pošaljete ovu datoteku pod novim imenom. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Ova datoteka je dvojnik {{PLURAL:$1|slijedećoj datoteci|slijedećim datotekama}}:",
        "file-deleted-duplicate": "Datoteka koje je identična ovoj datoteci ([[:$1]]) je ranije bila obrisana. Trebate provjeriti historiju brisanja te datoteke prije nego što nastavite sa njenim ponovnim postavljanjem.",
+       "file-deleted-duplicate-notitle": "Datoteka identična ovoj prethodno je obrisana i ime joj je sakriveno.\nTrebali biste pitati nekog ko može vidjeti podatke skrivenih datoteka da pregleda situaciju prije nego što ponovo postavite datoteku.",
        "uploadwarning": "Upozorenje pri slanju",
        "uploadwarning-text": "Molimo izmijeniti opis datoteke ispod i pokušajte kasnije.",
        "savefile": "Sačuvaj datoteku",
        "uploaddisabledtext": "Postavljanje datoteka je onemogućeno.",
        "php-uploaddisabledtext": "Postavljanje datoteka preko PHP je onemogućeno. Molimo provjerite postavku file_uploads.",
        "uploadscripted": "Ova datoteka sadrži HTML ili skriptni kod koji može izazvati grešku kod internet preglednika.",
+       "upload-scripted-pi-callback": "Datoteka koja sadrži instrukcije za obradu XML stilskog oblika se ne može postaviti.",
+       "uploaded-script-svg": "Pronađen skriptni element \"$1\" u postavljenoj SVG datoteci.",
+       "uploaded-hostile-svg": "Pronađen nesiguran CSS u stilskom elementu postavljene SVG datoteke.",
+       "uploaded-event-handler-on-svg": "Nije dozvoljeno postavljanje atributa koji kontroliraju događaje <code>$1=\"$2\"</code> u SVG datotekama.",
+       "uploaded-href-attribute-svg": "href atributi <code>&lt;$1 $2=\"$3\"&gt;</code> sa nelokalnom metom (npr. http://, javascript:, etc) nisu dozvoljeni u SVG datotekama.",
+       "uploaded-href-unsafe-target-svg": "Pronađen href sa nesigurnom metom <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-animate-svg": "Pronađena \"animate\" oznaka koja možda mijenja href koristeći se \"from\" atributom <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-setting-event-handler-svg": "Postavljanje kontrole događaja je blokirano, pronađeno <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-setting-href-svg": "Blokirano je korištenje \"set\" oznake kako bi se dodao \"href\" atribut glavnom elementu.",
+       "uploaded-wrong-setting-svg": "Blokirano je korištenje oznake \"set\" kako bi se dodao atribut udaljenoj/podatkovnoj/skriptnoj meti. Pronađeno <code>&lt;set to=\"$1\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-setting-handler-svg": "SVG datoteka koja koristi atribut \"handler\" sa udaljenom/podatkovnoj/skriptnom vrijednosti je blokirana. Pronađeno <code>$1=\"$2\"</code> u postavljenoj SVG datoteci.",
+       "uploaded-remote-url-svg": "SVG datoteka koja postavlja stilski atribut koristeći se vanjskim linkom je blokiranja. Pronađeno <code>$1=\"$2\"</code> u postavljenoj SVG datoteci.",
+       "uploaded-image-filter-svg": "Pronađen slikovni filter sa URLom: <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor \"$1\".",
+       "uploadinvalidxml": "Nije moguće raščlaniti XML postavljene datoteke.",
        "uploadvirus": "Datoteka sadrži virus!  Detalji:  $1",
        "uploadjava": "Datoteka je ZIP datoteka koja sadrži Java .class datoteku.\nPostavljanje Java datoteka nije dopušteno, jer one mogu prouzrokovati da se zaobiđu sigurnosne zabrane.",
        "upload-source": "Izvorna datoteka",
        "backend-fail-notsame": "Već postoji različita datoteka $1.",
        "backend-fail-invalidpath": "$1 nije valjana putanja za skladištenje.",
        "backend-fail-delete": "Ne može se izbrisati datoteka $1.",
+       "backend-fail-describe": "Ne mogu promijeniti metapodatke za datoteku \"$1\".",
        "backend-fail-alreadyexists": "Datoteka $1 već postoji.",
        "backend-fail-store": "Ne može se spremiti datoteka $1 na $2.",
        "backend-fail-copy": "Nije uspjelo kopiranje datoteke \"$1\" u \"$2\".",
        "backend-fail-closetemp": "Ne mogu zatvoriti privremenu datoteku.",
        "backend-fail-read": "Ne mogu čitati datoteku $1.",
        "backend-fail-create": "Ne mogu napraviti datoteku $1.",
+       "backend-fail-maxsize": "Ne mogu zapisati datoteku \"$1\" jer je veća od {{PLURAL:$2|$2 bajta|$2 bajta|$2 bajtova}}.",
        "backend-fail-readonly": "Skladišna osnova \"$1\" je trenutno samo za čitanje. Navedeni razlog je: \"$2\"",
        "backend-fail-synced": "Datoteka \"$1\" je u nekonzistentnom stanju u internom skladištu",
        "backend-fail-connect": "Ne mogu se povezati sa pozadinskim spremištem \"$1\".",
        "backend-fail-internal": "Došlo je do nepoznate greške u skladišnoj osnovi \"$1\".",
        "backend-fail-contenttype": "Ne mogu da utvrdim kakav sadržaj ima datoteka koju treba da smjestim u \"$1\".",
        "backend-fail-batchsize": "Skladišna osnova je dobila blokadu od $1 {{PLURAL:$1|datotečne operacije|datotečne operacije|datotečnih operacija}}; ograničenje je $2 {{PLURAL:$2|operacija|operacije|operacija}}.",
+       "backend-fail-usable": "Ne mogu pročitati ili zapisati datoteku \"$1\" jer nemate odgovarajuća prava ili folderi/sadržioci ne postoje.",
+       "filejournal-fail-dbconnect": "Ne mogu se povezati s novinarskom bazom podataka za skladišnu osnovu \"$1\".",
+       "filejournal-fail-dbquery": "Ne mogu ažurirati novinarsku bazu za skladišnu osnovu \"$1\".",
        "lockmanager-notlocked": "Ne mogu otključati \"$1\"; nije zaključan.",
        "lockmanager-fail-closelock": "Ne mogu zatvoriti \"lock\"-datoteku za \"$1\".",
        "lockmanager-fail-deletelock": "Ne mogu obrisati \"lock\"-datoteku za \"$1\".",
        "lockmanager-fail-releaselock": "Ne mogu osloboditi katanac za „$1“.",
        "lockmanager-fail-db-bucket": "Ne mogu da kontaktiram s dovoljno \"lock\"-baza u kanti $1.",
        "lockmanager-fail-db-release": "Ne mogu osloboditi katance u bazi $1.",
+       "lockmanager-fail-svr-acquire": "Ne mogu dobiti katance na serveru $1.",
        "lockmanager-fail-svr-release": "Ne mogu se otključati katanci na serveru file $1.",
        "zip-file-open-error": "Desila se greška pri otvaranju datoteke za provjere ZIP-a.",
        "zip-wrong-format": "Navedena datoteka nije bila ZIP datoteka.",
        "listfiles_size": "Veličina",
        "listfiles_description": "Opis",
        "listfiles_count": "Verzije",
+       "listfiles-show-all": "Obuhvati stare verzije slika",
        "listfiles-latestversion": "Trenutna verzija",
        "listfiles-latestversion-yes": "Da",
        "listfiles-latestversion-no": "Ne",
        "download": "učitaj",
        "unwatchedpages": "Nepraćene stranice",
        "listredirects": "Spisak preusmjerenja",
+       "listduplicatedfiles": "Spisak duplih datoteka",
+       "listduplicatedfiles-summary": "Ovo je spisak datoteka koje su duplikat nekih drugih datoteka. Prikazane su samo lokalne datoteke.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] ima [[$3|{{PLURAL:$2|jedan duplikat|$2 duplikata}}]].",
        "unusedtemplates": "Nekorišteni šabloni",
        "unusedtemplatestext": "Ova stranica prikazuje sve stranice u imenskom prostoru {{ns:template}} koji se ne koriste.\nPrije brisanja provjerite da li druge stranice vode na te šablone.",
        "unusedtemplateswlh": "ostali linkovi",
        "pageswithprop-text": "Ova stranica prikazuje stranice koje imaju određeno svojstvo.",
        "pageswithprop-prop": "Naziv svojstva:",
        "pageswithprop-submit": "Idi",
+       "pageswithprop-prophidden-long": "sakriveno dugo tekstualno svojstvo ($1)",
+       "pageswithprop-prophidden-binary": "sakriveno dugo binarno svojstvo ($1)",
        "doubleredirects": "Dvostruka preusmjerenja",
        "doubleredirectstext": "Ova stranica prikazuje stranice koje preusmjeravaju na druga preusmjerenja.\nSvaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju teksta drugog preusmjerenja, što obično daje \"pravi\" ciljni članak, na koji bi prvo preusmjerenje i trebalo da pokazuje.\n<del>Precrtane</del> stavke su riješene.",
        "double-redirect-fixed-move": "[[$1]] je premješten.\nAutomatski je ažuriran i sada preusmjerava na [[$2]].",
        "ninterwikis": "$1 {{PLURAL:$1|međujezična veza|međujezične veze}}",
        "nlinks": "$1 {{PLURAL:$1|veza|veze}}",
        "nmembers": "$1 {{PLURAL:$1|član|članova}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|član|člana|članova}}",
        "nrevisions": "$1 {{PLURAL:$1|revizija|revizije|revizija}}",
        "nimagelinks": "Koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}",
        "ntransclusions": "koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}",
        "wantedpages-badtitle": "Nevaljan naslov u setu rezultata: $1",
        "wantedfiles": "Tražene datoteke",
        "wantedfiletext-cat": "Sljedeće datoteke se koriste, ali ne postoje. Datoteke iz drugih baza mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbrisane</del> sa spiska. Pored toga, stranice koje sadrže nepostojeće datoteke se nalaze u [[:$1]].",
+       "wantedfiletext-cat-noforeign": "Sljedeće datoteke se koriste, ali ne postoje. Dodatno, stranice koje ugrađuju datoteke koje ne postoje prikazane su u [[:$1]].",
        "wantedfiletext-nocat": "Sljedeće datoteke se koriste, ali ne postoje. Datoteke iz drugih baza mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbrisane</del> sa spiska.",
+       "wantedfiletext-nocat-noforeign": "Sljedeće datoteke se koriste, ali ne postoje.",
        "wantedtemplates": "Potrebni šabloni",
        "mostlinked": "Članci sa najviše linkova",
        "mostlinkedcategories": "Kategorije sa najviše linkova",
        "mostlinkedtemplates": "Najviše uključene stranice",
        "mostcategories": "Članci sa najviše kategorija",
        "mostimages": "Najviše linkovane slike",
+       "mostinterwikis": "Stranice sa najviše međuwikija",
        "mostrevisions": "Članci sa najviše izmjena",
        "prefixindex": "Sve stranice sa prefiksom",
        "prefixindex-namespace": "Sve stranice s predmetkom (imenski prostor $1)",
+       "prefixindex-strip": "Sakrij prefiks u spisku",
        "shortpages": "Kratke stranice",
        "longpages": "Dugačke stranice",
        "deadendpages": "Stranice bez internih veza",
        "deadendpagestext": "Slijedeće stranice nisu povezane s drugim stranicama na {{SITENAME}}.",
        "protectedpages": "Zaštićene stranice",
        "protectedpages-indef": "Samo neograničena zaštićenja",
+       "protectedpages-summary": "Na ovoj stranici se nalazi spisak trenutno zaštićenih stranica. Za spisak zaštićenih naslova vidi [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Samo prenosive zaštite",
        "protectedpages-noredirect": "Sakrij preusmjerenja",
        "protectedpagesempty": "Trenutno nijedna stranica nije zaštićena ovim parametrima.",
        "logempty": "Nema zatraženih članaka u zapisniku.",
        "log-title-wildcard": "Traži naslove koji počinju ovim tekstom",
        "showhideselectedlogentries": "Pokaži/sakrij izabrane zapise u evidenciji",
+       "log-edit-tags": "Uredi oznake izabranih zapisničkih unosa",
        "allpages": "Sve stranice",
        "nextpage": "Sljedeća strana ($1)",
        "prevpage": "Prethodna stranica ($1)",
        "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
        "listgrouprights-namespaceprotection-restrictedto": "Prava kojima se dozvoljava korisniku da uređuje",
        "trackingcategories": "Praćenje kategorija",
+       "trackingcategories-summary": "Ova stranica prikazuje prateće kategorije koje MediaWiki softver automatski popunjava. Njihovi nazivi se mogu promijeniti izmjenom odgovarajućih sistemskih poruka u imenskom prostoru {{ns:8}}.",
        "trackingcategories-msg": "Praćenje kategorije",
        "trackingcategories-name": "Ime poruke",
        "trackingcategories-desc": "Kriterij uključenja kategorije",
+       "noindex-category-desc": "Roboti ne indeksiraju stranicu jer u sebi ima magičnu riječ <code><nowiki>__NOINDEX__</nowiki></code>, te je u imenskom prostoru u kome ta oznaka nije dozvoljena.",
+       "index-category-desc": "Stranica ima u sebi <code><nowiki>__INDEX__</nowiki></code> (te se nalazi u imenskom prostoru gdje je ta oznaka dozvoljena) pa je, samim tim, roboti indeksiraju.",
+       "post-expand-template-inclusion-category-desc": "Veličina stranice prelazi <code>$wgMaxArticleSize</code> nakon proširenja svih šablona, te zbog toga neki šabloni nisu prošireni.",
+       "post-expand-template-argument-category-desc": "Veličina stranice prelazi <code>$wgMaxArticleSize</code> nakon proširenja defincije šablona (nešto što je u trima vitičastim zagradama, poput <code>{{{Foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "Stranica koristi previše ekspenzivnih parserskih funkcija (poput <code>#ifexist</code>). Pogledajte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Stranica sadrži pokvareni link ka datoteci (link koji se nadovezuje na nepostojeću datoteku).",
+       "hidden-category-category-desc": "Kategorija u sebi sadrži <code><nowiki>__HIDDENCAT__</nowiki></code> te se samim tim ne prikazuju u odjeljku za kategoriju na stranicama.",
        "trackingcategories-nodesc": "Opis nije dostupan.",
        "trackingcategories-disabled": "Kategorija je onemogućena",
        "mailnologin": "Nema adrese za slanje",
        "rollback-success": "Poništene izmjene korisnika $1;\nvraćeno na posljednju verziju koju je sačuvao $2.",
        "sessionfailure-title": "Greška u sesiji",
        "sessionfailure": "Izgleda da postoji problem sa vašom sesijom; ova akcija je otkazana kao prevencija protiv napadanja sesija. Kliknite \"back\" (''nazad'') i osvježite stranicu sa koje ste došli, i opet pokušajte.",
+       "changecontentmodel": "Promijeni model sadržaja stranice",
        "changecontentmodel-legend": "Promijeni model sadržaja",
+       "changecontentmodel-title-label": "Naslov stranice",
+       "changecontentmodel-model-label": "Novi model sadržaja",
+       "changecontentmodel-reason-label": "Razlog:",
+       "changecontentmodel-success-title": "Model sadržaja je promijenjen",
+       "changecontentmodel-success-text": "Model sadržaja stranice [[:$1]] je promijenjen.",
+       "changecontentmodel-cannot-convert": "Model sadržaja stranice [[:$1]] se ne može pretvoriti u vrstu $2.",
+       "changecontentmodel-title-cantexist": "Ne može postojati stranica na $1.",
+       "changecontentmodel-nodirectediting": "Model sadržaja $1 ne podržava izravno uređivanje",
        "log-name-contentmodel": "Zapisnik promjene modela sadržaja",
        "log-description-contentmodel": "Događaji koji su povezani s modelom sadržaja stranice",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|promijenio|promijenila}} je model sadržaja stranice $3 iz \"$4\" u \"$5\"",
+       "logentry-contentmodel-change-revertlink": "vrati",
+       "logentry-contentmodel-change-revert": "vrati",
        "protectlogpage": "Zapisnik zaključavanja",
        "protectlogtext": "Ispod je spisak promjena zaštićenja stranice.\nPogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za pregled trenutno operativnih zaštita stranica.",
        "protectedarticle": "stranica \"[[$1]]\" je zaštićena",
        "protect-locked-blocked": "Ne možete promijeniti nivo zaštite dok ste blokirani.\nOvo su trenutne postavke za stranicu '''$1''':",
        "protect-locked-dblock": "Nivoi zaštite ne mogu se mijenjati jer je aktivna baza podataka zaključana.\nTrenutna postavka za stranicu '''$1''' jest:",
        "protect-locked-access": "Nemate ovlasti za mijenjanje stepena zaštite.\nSlijede trenutne postavke stranice '''$1''':",
-       "protect-cascadeon": "Ova stranica je trenutno zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju|stranice, koje imaju}} uključenu prenosnu zaštitu.\nPromijene stepena zaštite ove stranice neće uticati na prenosnu zaštitu.",
+       "protect-cascadeon": "Ova stranica je trenutno zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju}} uključenu prenosivu zaštitu.\nPromjene stepena zaštite ove stranice neće utjecati na prenosnu zaštitu.",
        "protect-default": "Dopusti svim korisnicima",
        "protect-fallback": "Dozvolite samo korisnicima sa \"$1\" ovlastima/privilegijama",
        "protect-level-autoconfirmed": "Dopustite samo automatski potvrđenim korisnicima",
        "protect-othertime": "Ostali period:",
        "protect-othertime-op": "ostali period",
        "protect-existing-expiry": "Postojeće vrijeme isticanja: $3, $2",
+       "protect-existing-expiry-infinity": "Postojeće vrijeme isteka: trajno",
        "protect-otherreason": "Ostali/dodatni razlozi:",
        "protect-otherreason-op": "Ostali razlozi",
        "protect-dropdown": "*Uobičajeni razlozi zaštite\n** Prekomjerni vandalizam\n** Prekomjerno spamovanje\n** Ne produktivni rat izmjena\n** Stranica velikog prometa",
        "namespace": "Vrsta članka:",
        "invert": "Sve osim odabranog",
        "tooltip-invert": "Označite ovu kutiju za sakrivanje promjena na stranicama u odabranom imenskom prostoru (i povezanim imenskim prostorima ako je označeno)",
+       "tooltip-whatlinkshere-invert": "Označite ovu kutiju za sakrivanje linkova sa stranica u izabranom imenskom prostoru.",
        "namespace_association": "Povezan imenski prostor",
        "tooltip-namespace_association": "Označite ovu kutiju da također uključite razgovor ili imenski prostor teme koja je povezana sa odabranim imenskim prostorom",
        "blanknamespace": "(Glavno)",
        "sp-contributions-newbies-sub": "Za nove korisnike",
        "sp-contributions-newbies-title": "Doprinosi novih korisnika",
        "sp-contributions-blocklog": "zapisnik blokiranja",
+       "sp-contributions-suppresslog": "obrisani doprinosi korisnika",
        "sp-contributions-deleted": "obrisani doprinosi korisnika",
        "sp-contributions-uploads": "postavljanja",
        "sp-contributions-logs": "zapisnici",
        "sp-contributions-search": "Pretraga doprinosa",
        "sp-contributions-username": "IP adresa ili korisničko ime:",
        "sp-contributions-toponly": "Prikaži samo izmjene koje su posljednje revizije",
+       "sp-contributions-newonly": "Prikaži samo izmjene kojima su napravljene nove stranice",
        "sp-contributions-submit": "Traži",
        "whatlinkshere": "Šta vodi ovamo",
        "whatlinkshere-title": "Stranice koje vode na \"$1\"",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] je {{GENDER:$1|blokiran|blokirana|blokiran}}.<br />\nPogledajte [[Special:BlockList|spisak blokiranja]] za pregled blokiranja.",
        "ipb-blockingself": "Ovom akcijom ćete blokirati sebe! Da li ste sigurni da to želite?",
        "ipb-confirmhideuser": "Upravo ćete blokirati korisnika s uključenom opcijom \"Sakrij korisnika\". Ovim će korisničko ime biti sakriveno u svim spiskovima i stavkama zapisnika. Jeste li sigurni da to želite?",
+       "ipb-confirmaction": "Ako ste sigurni da želite nastaviti, kliknite na \"{{int:ipb-confirm}}\" polje na dnu stranice.",
        "ipb-edit-dropdown": "Uredi razloge blokiranja",
        "ipb-unblock-addr": "Deblokiraj $1",
        "ipb-unblock": "Deblokiraj korisničko ime ili IP adresu",
        "unblocked": "[[User:$1|$1]] je deblokiran",
        "unblocked-range": "$1 je deblokiran",
        "unblocked-id": "Blokada ID oznake $1 je uklonjena",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] je deblokiran.",
        "blocklist": "Blokirani korisnici",
        "ipblocklist": "Blokirani korisnici",
        "ipblocklist-legend": "Traži blokiranog korisnika",
        "proxyblockreason": "Vaša IP adresa je blokirana jer je ona otvoreni proksi.  Molimo vas da kontaktirate vašeg davatelja internetskih usluga (Internet Service Provider-a) ili tehničku podršku i obavijestite ih o ovom ozbiljnom sigurnosnom problemu.",
        "sorbsreason": "Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL koji koristi {{SITENAME}}.",
        "sorbs_create_account_reason": "Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL korišten od {{SITENAME}}.\nNe možete napraviti račun",
+       "xffblockreason": "Blokirana je vaša ili IP adresa proxy servera koga koristite, koja se nalazi u zaglavlju X-Forwarded-For. Razlog za blokiranje je bio: $1",
        "cant-see-hidden-user": "Korisnik kojeg pokušavate blokirati je već blokiran i sakriven. Pošto nemate prava hideuser (sakrivanje korisnika), ne možete vidjeti ni urediti korisnikovu blokadu.",
        "ipbblocked": "Ne možete blokirati ili deblokirati druge korisnike, jer ste i sami blokirani",
        "ipbnounblockself": "Nije Vam dopušteno da deblokirate samog sebe",
        "movepagetalktext": "Odgovarajuća stranica za razgovor, ako postoji, automatski će biti premještena istovremeno '''osim ako:'''\n*premještate stranicu preko imenskih prostora\n*neprazna stranica za razgovor već postoji pod novim imenom\n*odčekirate donju kutiju.\n\nU tim slučajevima morat ćete ručno premjestiti ili prekopirati stranicu ako to želite.",
        "movearticle": "Premjesti stranicu:",
        "moveuserpage-warning": "'''Upozorenje:''' Premještate korisničku stranicu. Molimo da zapamtite da će se samo stranica premjestiti a korisnik se ''neće'' preimenovati.",
+       "movecategorypage-warning": "<strong>Upozorenje:</strong> Premještate stranicu kategorije. Imajte na umu da će samo stranica biti premještena i da sve stranice u staroj kategoriji <em>neće</em> biti ponovo kategorirane u novu kategoriju.",
        "movenologintext": "Morate biti registrovani korisnik i [[Special:UserLogin|prijavljeni]] da biste premjestili stranicu.",
        "movenotallowed": "Nemate dopuštenje za premještanje stranica.",
        "movenotallowedfile": "Nemate dopuštenja da premještanje datoteke.",
        "cant-move-user-page": "Nemate dopuštenje da premještate korisničke stranice (bez podstranica).",
        "cant-move-to-user-page": "Nemate dopuštenje da premjestite stranicu na korisničku stranicu (osim na korisničku podstranicu).",
+       "cant-move-category-page": "Nemate dopuštene da premještate stranice kategorija.",
+       "cant-move-to-category-page": "Nemate dopuštenje da premjestite stranicu na stranicu kategorije.",
        "newtitle": "Novi naslov",
        "move-watch": "Prati ovu stranicu",
        "movepagebtn": "Premjesti stranicu",
        "immobile-target-namespace-iw": "Međuwiki link nije ispravno odredište premještanja stranice.",
        "immobile-source-page": "Ova stranica se ne može premještati.",
        "immobile-target-page": "Ne može se premjestiti na taj odredišni naslov.",
+       "bad-target-model": "Željeno odredište koristi drugačiji model sadržaja. Ne mogu pretvoriti iz $1 u $2.",
        "imagenocrossnamespace": "Ne može se premjestiti datoteka u nedatotečni imenski prostor",
        "nonfile-cannot-move-to-file": "Ne mogu se premjestiti podaci u datotečni imenski prostor",
        "imagetypemismatch": "Ekstenzija nove datoteke ne odgovara njenom tipu",
        "thumbnail-temp-create": "Ne mogu da napravim privremenu smanjenu sliku",
        "thumbnail-dest-create": "Ne mogu da sačuvam smanjenu sliku (\"thumbnail\") na destinaciju",
        "thumbnail_invalid_params": "Pogrešne postavke smanjenog prikaza",
+       "thumbnail_toobigimagearea": "Datoteka sa dimenzijama većim od $1",
        "thumbnail_dest_directory": "Ne može se napraviti odredišni folder",
        "thumbnail_image-type": "Tip slike nije podržan",
        "thumbnail_gd-library": "Nekompletna konfiguracija GD biblioteke: nedostaje funkcija $1",
        "thumbnail_image-missing": "Datoteka ne dostaje: $1",
+       "thumbnail_image-failure-limit": "Bilo je previše nedavnih greška ($1 ili više) pri pravljenju umanjene slike. Ponovo pokušajte kasnije.",
        "import": "Uvoz stranica",
        "importinterwiki": "Uvezeno sa druge wiki",
-       "import-interwiki-text": "Izaberi wiki i naslov stranice za uvoz.\nDatumi revizija i imena autora će biti sačuvani.\nSve akcije pri međuwiki uvozu će biti zapisane u [[Special:Log/import|zapisu uvoza]].",
+       "import-interwiki-text": "Izaberi wiki i naslov stranice za uvoz.\nDatumi i imena autora verzija će biti sačuvani.\nSve akcije pri međuwiki uvozu će biti zapisane u [[Special:Log/import|zapisniku uvoza]].",
+       "import-interwiki-sourcewiki": "Izvorna wiki:",
+       "import-interwiki-sourcepage": "Izvorna stranica:",
        "import-interwiki-history": "Kopiraj sve verzije historije za ovu stranicu",
        "import-interwiki-templates": "Uključi sve šablone",
        "import-interwiki-submit": "Uvoz",
+       "import-mapping-default": "Uvezi u predodređena mjesta",
+       "import-mapping-namespace": "Uvezi u imenski prostor:",
+       "import-mapping-subpage": "Uvezi kao podstranice sljedeće stranice:",
        "import-upload-filename": "Naziv datoteke:",
        "import-comment": "Komentar:",
        "importtext": "Molimo Vas da izvezete datoteku iz izvornog wikija koristeći [[Special:Export|alat za izvoz]].\nSačuvajte je na Vašem računaru i pošaljite ovdje.",
        "importcantopen": "Ne može se otvoriti uvozna datoteka",
        "importbadinterwiki": "Loš interwiki link",
        "importsuccess": "Uspješno ste uvezli stranicu!",
-       "importnosources": "Nije definisan međuwiki izvor za uvoz i direktna postavljanja historije su onemogućena.",
+       "importnosources": "Nije definisan međuwiki izvor za uvoz i direktna postavljanja historije su isključena.",
        "importnofile": "Uvozna datoteka nije postavljena.",
        "importuploaderrorsize": "Postavljanje uvozne datoteke nije uspjelo.\nDatoteka je veća nego što je dopušteno.",
        "importuploaderrorpartial": "Postavljanje uvozne datoteke nije uspjelo.\nDatoteka je samo djelimično postavljena.",
        "import-error-interwiki": "Stranica \"$1\" nije uvezena jer je njen naziv rezerviran za vanjsko povezivanje (interwiki).",
        "import-error-special": "Stranica \"$1\" nije uvezena jer pripada posebnom imenskom prostoru koje ne prihvata stranice.",
        "import-error-invalid": "Stranica \"$1\" nije uvezena jer je naziv pod kojim treba biti uvezena nije valjan na ovoj wiki.",
+       "import-error-unserialize": "Verzija $2 stranice $1 ne može biti pročitana, odnosno uvezena. Zapisano je da verzija koristi $3 tip sadržaja u $4 formatu.",
+       "import-error-bad-location": "Verzija $2 koja koristi model sadržaja $3 ne može se postaviti na stranicu \"$1\" ovog wikija, jer taj model sadržaja nije podržan na toj stranici.",
        "import-options-wrong": "{{PLURAL:$2|Pogrešna opcija|Pogrešne opcije}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Navedena osnovna stranica ima neispravan naslov.",
        "import-rootpage-nosubpage": "Imenski prostor \"$1\" osnovne stranice ne dozvoljava podstranice.",
        "javascripttest": "Testiranje JavaScript-e",
        "javascripttest-pagetext-noframework": "Ova stranica je određena za pokretanje JavaScript testova.",
        "javascripttest-pagetext-unknownframework": "Nepoznat radni okvir testiranja\"$1\".",
+       "javascripttest-pagetext-unknownaction": "Nepoznata radnja \"$1\".",
        "javascripttest-pagetext-frameworks": "Molimo Vas izaberite jednu od sljedećih testnih okvira: $1",
        "javascripttest-pagetext-skins": "Izaberite s kojom temom želite da pokrenete probu:",
        "javascripttest-qunit-intro": "Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.",
        "pageinfo-robot-index": "Dozvoljeno",
        "pageinfo-robot-noindex": "Nije dozvoljeno",
        "pageinfo-watchers": "Broj pratitelja stranice",
+       "pageinfo-visiting-watchers": "Broj korisnika koji prate ovu stranica i koji su je posjetili zbog najnovijih izmjena",
        "pageinfo-few-watchers": "Manje od $1 {{PLURAL:$1|pratioca|pratilaca}}",
+       "pageinfo-few-visiting-watchers": "Moguće je da postoji korisnik koji prati i posjećuje nedavne izmjene",
        "pageinfo-redirects-name": "Broj preusmjeravanja na ovu stranicu",
        "pageinfo-subpages-name": "Podstranice ove stranice",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|preusmjerenje|preusmjerenja}}; $3 {{PLURAL:$3|nepreusmjerenje|nepreusmjerenja}})",
        "pageinfo-redirectsto-info": "Informacije",
        "pageinfo-contentpage": "Broji se kao stranica sa sadržajem",
        "pageinfo-contentpage-yes": "Da",
+       "pageinfo-protect-cascading": "Prenosiva zaštita počinje od ove stranice",
        "pageinfo-protect-cascading-yes": "Da",
+       "pageinfo-protect-cascading-from": "Prenosiva zaštita počinje od",
        "pageinfo-category-info": "Informacije o kategoriji",
        "pageinfo-category-total": "Ukupan broj članova",
        "pageinfo-category-pages": "Broj stranica",
        "patrol-log-page": "Zapisnik patroliranja",
        "patrol-log-header": "Ovdje se nalazi zapis patroliranih revizija.",
        "log-show-hide-patrol": "$1 zapis patroliranja",
+       "log-show-hide-tag": "$1 zapisnik oznaka",
        "deletedrevision": "Obrisana stara revizija $1",
        "filedeleteerror-short": "Greška pri brisanju datoteke: $1",
        "filedeleteerror-long": "Desile su se greške pri brisanju datoteke:\n\n$1",
        "watchlistedit-clear-titles": "Naslovi:",
        "watchlistedit-clear-submit": "Isprazni spisak nadgledanja (Ovo je trajno!)",
        "watchlistedit-clear-done": "Vaš spisak praćenja je očišćen.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 naslov je uklonjen|$1 naslova su uklonjena|$1 naslova je uklonjeno}}:",
+       "watchlistedit-too-many": "Ima previše stranica za prikaz ovdje.",
        "watchlisttools-clear": "Očisti spisak nadgledanja",
        "watchlisttools-view": "Pogledaj srodne izmjene",
        "watchlisttools-edit": "Pogledaj i uredi spisak praćenja",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|razgovor]])",
        "timezone-utc": "KSV",
        "duplicate-defaultsort": "Upozorenje: Postavljeni ključ sortiranja \"$2\" zamjenjuje raniji ključ \"$1\".",
+       "duplicate-displaytitle": "<strong>Upozorenje:</strong> Prikazivani naslov \"$2\" poništava prethodni naslov \"$1\".",
+       "invalid-indicator-name": "<strong>Greška:</strong> <code>Imena</code> pokazatelja stanja strance ne smiju biti prazna.",
        "version": "Verzija",
        "version-extensions": "Instalirana proširenja (ekstenzije)",
        "version-skins": "Instalirane kože",
        "version-license": "Licenca",
        "version-ext-license": "Licenca",
        "version-ext-colheader-name": "Proširenje",
-       "version-skin-colheader-name": "Izgled",
+       "version-skin-colheader-name": "Tema",
        "version-ext-colheader-version": "Verzija",
        "version-ext-colheader-license": "Licenca",
        "version-ext-colheader-description": "Opis",
        "version-ext-colheader-credits": "Autori",
        "version-license-title": "Licenca za $1",
+       "version-license-not-found": "Za ovo proširenje nije pronađena informacija o licenci.",
+       "version-credits-title": "Zasluge za $1",
+       "version-credits-not-found": "Za ovo proširenje nisu pronađene informacije o zaslugama.",
        "version-poweredby-credits": "Ova wiki je zasnovana na '''[https://www.mediawiki.org/ MediaWiki]''', autorska prava zadržana © 2001-$1 $2.",
        "version-poweredby-others": "ostali",
+       "version-poweredby-translators": "translatewiki.net prevodioci",
        "version-credits-summary": "Željeli bismo se zahvaliti sljedećim ljudima na njihovom doprinosu [[Special:Version|MediaWikiju]].",
        "version-license-info": "Mediawiki je slobodni softver; možete ga redistribuirati i(li) mijenjati pod uvjetima opće javne GNU licence kao što je objavljeno od strane \"Free Software Foundationa\", bilo u verziji 2 licence ili (po Vašoj volji) nekoj od kasnijih verzija.\n\nMediawiki se distribuira u nadi da će biti korisna, ali BEZ IKAKVIH GARANCIJA, čak i bez ikakvih posrednih garancija o KOMERCIJALNOSTI ili DOSTUPNOSTI ZA ODREĐENU SVRHU. Pogledajte opću javnu GNU licencu za više detalja.\n\nTrebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU opće javne GNU licence] zajedno s ovim programom. Ako niste, pišite \"Free Software Foundationu\" na adresu: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ili je pročitajte [//www.gnu.org/licenses/old-licenses/gpl-2.0.html ovdje].",
        "version-software": "Instalirani softver",
        "version-entrypoints": "URL Adrese ulazne tačke",
        "version-entrypoints-header-entrypoint": "Ulazna tačka",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Instalirane biblioteke",
+       "version-libraries-library": "Biblioteka",
        "version-libraries-version": "Verzija",
+       "version-libraries-license": "Licenca",
+       "version-libraries-description": "Opis",
+       "version-libraries-authors": "Autori",
+       "redirect": "Preusmjerenje na datoteku, korisnika, stranicu ili oznaku izmjene",
+       "redirect-legend": "Preusmjeri na datoteku ili stranicu",
+       "redirect-summary": "Ova posebna stranica preusmjerava na datoteku (datog imena), stranicu (date oznake izmjene) ili korisničku stranicu (datog numeričkog identifikatora korisnika). Oznake se koriste na sljedeći način: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] ili [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Idi",
+       "redirect-lookup": "Tip vrijednosti:",
        "redirect-value": "Vrijednost:",
        "redirect-user": "Korisnički ID",
        "redirect-page": "ID stranice",
        "tags-source-header": "Izvor",
        "tags-active-header": "Aktivna?",
        "tags-hitcount-header": "Označene izmjene",
+       "tags-actions-header": "Radnje",
        "tags-active-yes": "Da",
        "tags-active-no": "Ne",
        "tags-source-extension": "Definirano preko proširenja",
+       "tags-source-manual": "Ručno postavili korisnici ili botovi",
        "tags-source-none": "Više se ne koristi",
        "tags-edit": "uređivanje",
        "tags-delete": "izbriši",
        "tags-hitcount": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}",
        "tags-manage-no-permission": "Nemate pravo upravljati promjenama oznaka.",
        "tags-create-heading": "Napravi novu oznaku",
+       "tags-create-explanation": "Predoređeno je da će korisnici i botovi moći koristiti novonapravljene oznake.",
        "tags-create-tag-name": "Naziv oznake:",
        "tags-create-reason": "Razlog:",
        "tags-create-submit": "Napravi",
        "tags-create-no-name": "Morate navesti ime oznake.",
+       "tags-create-invalid-chars": "Nazivi oznaka ne smiju sadržavati zareze (<code>,</code>) ni kose crte (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Nazivi oznaka ne smiju sadržavati znakove koje se ne mogu koristiti u naslovima stranica.",
        "tags-create-already-exists": "Oznaka \"$1\" već postoji.",
+       "tags-create-warnings-above": "{{PLURAL:$2|Dogodila se sljedeća greška|Dogodile su se sljedeće greške}} pri stvaranju oznake \"$1\":",
+       "tags-create-warnings-below": "Želite li nastaviti stvaranje oznake?",
        "tags-delete-title": "Izbriši oznaku",
+       "tags-delete-explanation-initial": "Brišete oznaku \"$1\" iz baze podataka.",
+       "tags-delete-explanation-in-use": "Bit će obrisana sa {{PLURAL:$2|$2 verzije ili unosa u zapisniku|svih $2 verzija i/ili unosa u zapisniku}} na kojima se trenutno koristi.",
+       "tags-delete-explanation-warning": "Ova radnja se <strong>ne može povratiti</strong> te se <strong>ne može poništiti</strong>. Ovo ne mogu uraditi čak ni administratori baze podataka. Budite sigurni da je ovo oznaka koju želite obrisati.",
+       "tags-delete-explanation-active": "<strong>Oznaka \"$1\" je i dalje aktivna te će se nastaviti primjenjivati u budućnosti.</strong> Kako biste ovo spriječili, otiđite na mjesto (ili mjesta) na kojima je postavljeno da se oznaka postavlja, te je tamo isključite.",
        "tags-delete-reason": "Razlog:",
+       "tags-delete-submit": "Nepovratno obriši ovu oznaku",
+       "tags-delete-not-allowed": "Oznake koje su definirane proširenjem se ne mogu obrisati ukoliko to proširenje isključivo ne dopušta.",
        "tags-delete-not-found": "Oznaka \"$1\" ne postoji.",
+       "tags-delete-too-many-uses": "Oznaka \"$1\" je primjenjena na više od {{PLURAL:$2|revizija|revizijǎ}}, što znači da se ne može obrisati.",
+       "tags-delete-warnings-after-delete": "Oznaka \"$1\" uspješno je obrisana. Međutim, došlo je do {{PLURAL:$2|sljedećeg upozorenja|sljedećih upozorenja}}:",
+       "tags-activate-title": "Aktiviraj oznaku",
+       "tags-activate-question": "Aktivirate oznaku \"$1\".",
        "tags-activate-reason": "Razlog:",
+       "tags-activate-not-allowed": "Nije moguće aktivirati oznaku \"$1\".",
        "tags-activate-not-found": "Oznaka \"$1\" ne postoji.",
+       "tags-activate-submit": "Aktiviraj",
+       "tags-deactivate-title": "Deaktiviraj oznaku",
+       "tags-deactivate-question": "Deaktivirate oznaku \"$1\".",
+       "tags-deactivate-reason": "Razlog:",
+       "tags-deactivate-not-allowed": "Nije moguće deaktivirati oznaku \"$1\".",
+       "tags-deactivate-submit": "Deaktiviraj",
+       "tags-apply-no-permission": "Nemate dopuštenja da dodate izmjenske oznake zajedno s vašim promjenama.",
+       "tags-apply-not-allowed-one": "Oznaka \"$1\" se ne može ručno dodati.",
+       "tags-apply-not-allowed-multi": "{{PLURAL:$2|Sljedeća oznaka ne dozvoljava da se ručno doda|Sljedeće oznake ne dozvoljavaju da se ručno dodaju}}: $1",
+       "tags-update-no-permission": "Nemate dopuštenje da dodate ili uklonite izmjenske oznake sa zasebnih verzija ili zapisničkih unosa.",
+       "tags-update-add-not-allowed-one": "Oznaka \"$1\" se ne može ručno dodati.",
+       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Sljedeća oznaka ne dozvoljava da se ručno doda|Sljedeće oznake ne dozvoljavaju da se ručno dodaju}}: $1",
+       "tags-update-remove-not-allowed-one": "Oznaka \"$1\" se ne može ručno ukloniti.",
+       "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|Sljedeća oznaka ne dozvoljava da se ručno ukloni|Sljedeće oznake ne dozvoljavaju da se ručno uklone}}: $1",
+       "tags-edit-title": "Uredi oznake",
+       "tags-edit-manage-link": "Upravljaj oznakama",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Izabrana verzija|Izabrane verzije}} od [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Izabran unos zapisnika|Izabrani unosi zapisnika}}:",
+       "tags-edit-revision-legend": "Dodaj ili ukloni oznake sa {{PLURAL:$1|ove verzije|svih $1 verzija}}",
+       "tags-edit-logentry-legend": "Dodaj ili ukloni oznake sa {{PLURAL:$1|ove zapisničke stavke|svih $1 zapisničkih stavki}}",
+       "tags-edit-existing-tags": "Postojeće oznake:",
+       "tags-edit-existing-tags-none": "\"Nema\"",
+       "tags-edit-new-tags": "Nove oznake:",
+       "tags-edit-add": "Dodaj ove oznake:",
+       "tags-edit-remove": "Ukloni ove oznake:",
+       "tags-edit-remove-all-tags": "(ukloni sve oznake)",
+       "tags-edit-chosen-placeholder": "Izaberi neke oznake",
+       "tags-edit-chosen-no-results": "Odgovarajuće oznake nisu pronađene",
+       "tags-edit-reason": "Razlog:",
+       "tags-edit-revision-submit": "Primijeni izmjene {{PLURAL:$1|ovoj verziji|svim $1 verzijama}}",
+       "tags-edit-logentry-submit": "Primijeni izmjene {{PLURAL:$1|ovom zapisničkom unosu|svim $1 zapisničkim unosima}}",
+       "tags-edit-success": "Izmjene su uspješno primijenjene.",
+       "tags-edit-failure": "Nije bilo moguće primijeniti izmjene:\n$1",
+       "tags-edit-nooldid-title": "Neispravna odredišna verzija",
+       "tags-edit-nooldid-text": "Niste izabrali odredišnu verziju na koju treba primijeniti ovu funkciju, ili odredišna verzija na postoji.",
+       "tags-edit-none-selected": "Izaberite bar jednu oznaku koju treba dodati ili ukloniti.",
        "comparepages": "Usporedi stranice",
        "compare-page1": "Stranica 1",
        "compare-page2": "Stranica 2",
        "dberr-problems": "Žao nam je! Ova stranica ima određene tehničke poteškoće.",
        "dberr-again": "Pokušajte pričekati par minuta i zatim osvježiti.",
        "dberr-info": "(ne može se pristupiti bazi podataka: $1)",
+       "dberr-info-hidden": "(Ne mogu pristupiti bazi podataka)",
        "dberr-usegoogle": "U međuvremenu, možete pokušati pretraživanje putem Google.",
        "dberr-outofdate": "Zapamtite da njihovi indeksi našeg sadržaja ne moraju uvijek biti ažurni.",
        "dberr-cachederror": "Sljedeći tekst je keširana kopija zahtijevane stranice, koja možda nije potpuno ažurirana.",
        "htmlform-chosen-placeholder": "Izaberite opciju",
        "htmlform-cloner-create": "Dodaj još",
        "htmlform-cloner-delete": "Ukloni",
+       "htmlform-cloner-required": "Potrebna je barem jedna vrijednost.",
+       "htmlform-title-badnamespace": "[[:$1]] nije u imenskom prostoru \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "Stranica \"$1\" se ne može napraviti",
+       "htmlform-title-not-exists": "[[:$1]] ne postoji.",
+       "htmlform-user-not-exists": "<strong>$1</strong> ne postoji.",
+       "htmlform-user-not-valid": "<strong>$1</strong> nije ispravno korisničko ime.",
        "sqlite-has-fts": "$1 sa podrškom pretrage cijelog teksta",
        "sqlite-no-fts": "$1 bez podrške pretrage cijelog teksta",
        "logentry-delete-delete": "$1 {{GENDER:$2|obrisao|obrisala}} je stranicu $3",
        "revdelete-unrestricted": "uklonjena ograničenja za administratore",
        "logentry-block-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} sa vremenom isticanja blokade od $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|deblokirao|deblokirala}} je {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "$1 {{GENDER:$2|promijenio|promijenila}} je postavke za blokiranje {{GENDER:$4|korisnika|korisnice}} {{GENDER:$4|$3}} u trajanju od $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} sa vremenom isticanja blokade od $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|promijenio|promijenila}} je postavke za blokiranje {{GENDER:$4|korisnika|korisnice}} {{GENDER:$4|$3}} u trajanju od $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|uvezao|uvezla}} je $3 postavljanjem datoteke",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|uvezao|uvezla}} je $3 s drugog wikija",
+       "logentry-merge-merge": "$1 {{GENDER:$2|spojio|spojila}} je $3 u $4 (sve do izmjene $5)",
        "logentry-move-move": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4 bez ostavljanja preusmjerenja",
        "logentry-move-move_redir": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4 preko preusmjeravanja",
        "logentry-rights-autopromote": "$1 {{GENDER:$1|je automatski promijenjeno članstvo|su automatski promijenjena članstva}} iz $4 u $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|postavio|postavila}} je $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|postavio|postavila}} је novu verziju $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|postavio|postavila}} је $3",
        "log-name-managetags": "Zapisnik upravljanja oznaka",
+       "log-description-managetags": "Ovaj zapisnik sadrži spisak izmjena u vezi [[Special:Tags|oznaka]]. Zapisnik sadrži samo radnje izvršene od strane administratora; unosi za oznake napravljene ili obrisane od strane wiki softvera se ne nalaze u ovom zapisniku.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|napravio|napravila}} je oznaku \"$4\"",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|obrisao|obrisala}} je oznaku \"$4\" (uklonjena je iz $5 {{PLURAL:$5|izmjene ili zapisnika|izmjena i/ili zapisnikǎ}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|aktivirao|aktivirala}} je oznaku \"$4\" za upotrebu od strane korisnika i botova",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|deaktivirao|deaktivirala}} je oznaku \"$4\" za upotrebu od strane korisnika i botova",
        "log-name-tag": "Zapisnik oznaka",
+       "log-description-tag": "Ova stranica prikazaju kad su korisnici dodali ili ukonili [[Special:Tags|oznake]] s pojedinih verzija ili zapisničkih unosa. Zapisnik ne prikazuje označavačke radnje ako su se dogodile prilikom uređivanja, brisanja ili slične radnje.",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|dodao|dodala}} je {{PLURAL:$7|oznaku|oznaka}} $6 verziji $4 stranice $3",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|dodao|dodala}} je {{PLURAL:$7|oznaku|oznaka}} $6 verziji $5 zapisničkog unosa $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|uklonio|uklonila}} je {{PLURAL:$9|oznaku|oznake}} $8 sa verzije $4 stranice $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|uklonio|uklonila}} je {{PLURAL:$9|oznaku|oznake}} $8 sa zapisničkog unosa $5 stranice $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|ažurirao|ažurirala}} je oznake na verziji $4 strane $3 ({{PLURAL:$7|dodano}} $6; {{PLURAL:$9|uklonjeno}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|ažurirao|ažurirala}} je oznake na zapisničkom unosu $5 strane $3 ({{PLURAL:$7|dodano}} $6; {{PLURAL:$9|uklonjeno}} $8)",
        "rightsnone": "(nema)",
        "revdelete-summary": "sažetak",
        "feedback-adding": "Dodajem povratne informacije na stranicu...",
        "feedback-bugornote": "Ako ste spremni detaljno opisati tehnički problem, molimo [$1 prijavite \"bug\" (grešku)].\nInače, možete ispuniti jednostavan obrazac ispod. Vaš komentar bit će dodan na stranicu \"[$3 $2]\" zajedno s Vašim korisničkim imenom.",
        "feedback-cancel": "Odustani",
        "feedback-close": "Završeno",
+       "feedback-external-bug-report-button": "Podnesi tehnički zadatak",
        "feedback-dialog-title": "Pošalji povratne informacije",
+       "feedback-dialog-intro": "Možete koristiti jednostavni formular ispod kako biste poslali povratne informacije. Vaš komentar će biti dodan stranici \"$1\" zajedno s vašim korisničkim imenom.",
        "feedback-error-title": "Greška",
        "feedback-error1": "Greška: Neprepoznati rezultat od API",
        "feedback-error2": "Greška: Uređivanje nije uspjelo",
        "feedback-error3": "Greška: Nema odgovora od API",
+       "feedback-error4": "Greška: Ne može se postaviti na dati naslov",
        "feedback-message": "Poruka:",
        "feedback-subject": "Tema:",
        "feedback-submit": "Pošalji",
+       "feedback-terms": "Shvatam da moje korisničko agentske informacije sadrže tačne informacije o pregledniku i verziji operativnog sistema i da će javno biti podijeljene zajedno s mojim povratnim informacijama.",
+       "feedback-termsofuse": "Slažem se da ću pružati povratne informacije u skladu s Uslovima korištenja.",
        "feedback-thanks": "Hvala! Vaša povratna informacija postavljena je na stranicu \"[$2 $1]\".",
        "feedback-thanks-title": "Hvala!",
+       "feedback-useragent": "Korisnički agent:",
        "searchsuggest-search": "Traži",
        "searchsuggest-containing": "sadrži...",
        "api-error-badaccess-groups": "Nemate ovlasti da postavljate datoteke na ovoj wiki.",
        "api-error-overwrite": "Pisanje preko postojeće datoteke nije dopušteno.",
        "api-error-stashfailed": "Unutrašnja greška: server nije mogao da spremi privremenu datoteku.",
        "api-error-publishfailed": "Unutrašnja greška: Server nije uspio objaviti privremenu datoteku.",
+       "api-error-stasherror": "Dogodila se greška pri postavljaju datoteke u skladište.",
+       "api-error-stashedfilenotfound": "Skladištena datoteka nije pronađena pri pokušaju postavljanja iste iz skladišta.",
+       "api-error-stashpathinvalid": "Putanja na kojoj je trebala biti skladištena datoteka je neispravna.",
+       "api-error-stashfilestorage": "Dogodila se greška pri postavljaju datoteke u skladište.",
+       "api-error-stashzerolength": "Server nije mogao skladištiti datoteku jer joj je veličina iznosila 0.",
+       "api-error-stashnotloggedin": "Morate biti prijavljeni kako biste sačuvali datoteke u skladište postavljanja.",
+       "api-error-stashwrongowner": "Datoteka kojoj ste pokušali pristupiti u skladištu ne pripada vama.",
+       "api-error-stashnosuchfilekey": "Datotečni ključ kome ste pokušali pristupiti u skladištu ne pripada vama.",
        "api-error-timeout": "Server nije odgovorio unutar očekivanog vremena.",
        "api-error-unclassified": "Desila se nepoznata greška",
        "api-error-unknown-code": "Nepoznata greška: \"$1\"",
        "duration-centuries": "$1 {{PLURAL:$1|vijek|vijeka|vijekova}}",
        "duration-millennia": "$1 {{PLURAL:$1|milenij|milenija}}",
        "rotate-comment": "Slika rotirana za $1 {{PLURAL:$1|stepen|stepeni}} u smjeru kazaljke na satu",
+       "limitreport-title": "Podaci profiliranja analizatora:",
        "limitreport-cputime": "Vrijeme korištenja CPU",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|sekunda|sekunde|sekundi}}",
        "limitreport-walltime": "Korištenje u realnom vremenu",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|sekunda|sekunde|sekundi}}",
+       "limitreport-ppvisitednodes": "Broj predprocesiranih posjećenih nodova",
+       "limitreport-ppgeneratednodes": "Broj predprocesiranih generiranih nodova",
+       "limitreport-postexpandincludesize": "Nakon proširenja navedi i veličinu",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
+       "limitreport-templateargumentsize": "Veličina stavke šablona",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
+       "limitreport-expansiondepth": "Najveća dubina proširenja",
+       "limitreport-expensivefunctioncount": "Broj funkcije ekspenzivnog analizatora",
        "expandtemplates": "Proširi šablone",
        "expand_templates_intro": "Ova posebna stranica uzima neki tekst i proširuje sve šablone u njemu rekurzivno.\nOna također proširuje parserske funkcije poput\n<code><nowiki>{{</nowiki>#language:…}}</code> i varijable poput\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>. U principu proširuje gotovo sve između dvostrukih zagrada.",
        "expand_templates_title": "Naslov konteksta, za {{FULLPAGENAME}} itd.:",
        "expand_templates_input": "Tekst unosa:",
        "expand_templates_output": "Rezultat",
        "expand_templates_xml_output": "XML izlaz",
+       "expand_templates_html_output": "Sirov HTML prikaz",
        "expand_templates_ok": "U redu",
        "expand_templates_remove_comments": "Ukloni komentare",
        "expand_templates_remove_nowiki": "Onemogući oznake <nowiki> u rezultatima",
        "expand_templates_generate_xml": "Prikaži XML stablo parsera",
        "expand_templates_generate_rawhtml": "Pokaži izvorni HTML",
        "expand_templates_preview": "Pregled",
+       "expand_templates_preview_fail_html": "<em>Pošto stranica {{SITENAME}} ima uključen sirov HTML prikaz, te je bilo gubitka u podacima sesije, pregled je sakriven kao mjera predostrožnosti protiv JavaScript napada.</em>\n\n<strong>Ako je ovo ispravan pokušaj pretpregleda, molim da ponovo pokušate.</strong>\nAko i dalje ne bude radilo, pokušajte se [[Special:UserLogout|odjaviti]], pa ponovo prijaviti.",
+       "expand_templates_preview_fail_html_anon": "<em>Pošto stranica {{SITENAME}} ima uključen sirov HTML prikaz, a vi se niste prijavili, pregled je sakriven kao mjera predostrožnosti protiv JavaScript napada.</em>\n\n<strong>Ako je ovo ispravan pokušaj pretpregleda, molim da se [[Special:UserLogin|prijavite]] i pokušate ponovo.</strong>",
+       "pagelanguage": "Odabir jezika stranice",
        "pagelang-name": "Stranica",
        "pagelang-language": "Jezik",
        "pagelang-use-default": "Koristi podrazumijevani jezik",
        "pagelang-select-lang": "Izaberi jezik",
+       "right-pagelang": "promjena jezika stranice",
+       "action-pagelang": "promijenite jezik stranice",
        "log-name-pagelang": "Zapisnik promjene jezika",
+       "log-description-pagelang": "Ovo je zapisnik promjena jezika stranica.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|promijenio|promijenila}} je jezik stranice $3 iz $4 u $5.",
+       "default-skin-not-found": "Ups! Nije dostupna predodređena tema vašeg wikija, koja je definirana u <code dir=\"ltr\">$wgDefaultSkin</code> kao <code>$1</code>.\n\nVaša instalacija sadrži {{PLURAL:$4|sljedeću temu|sljedeće teme}}. Pogledajte [https://www.mediawiki.org/wiki/Manual:Skin_configuration Priručnik: Podešavanje tema] za više informacija o tome kako {{PLURAL:$4|je uključiti|ih uključiti i izabrati predodređenu}}.\n\n$2\n\n; Ako ste upravo instalirali MediaWiki:\n: Vjerovatno ste je instalirali sa gita ili sa izvornog koda koristeći se nekom drugom metodom. Ovo je za očekivati. Pokušajte instalirati neku temu sa [https://www.mediawiki.org/wiki/Category:All_skins kataloga tema] tako što ćete:\n:* Preuzeti [https://www.mediawiki.org/wiki/Download tarball instalacijsku datoteku] koji sadrži nekoliko tema i proširenja. Možete prekopirati folder <code>skins/</code> iz nje.\n:* Preuzeti zasebne instalacijske tarball datoteke sa stranice [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]. \n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Koristiti Git kako biste preuzeli teme].\n: Ako ste MediaWiki razvijatelj, ovo ne bi trebalo utjecati na vaše git skladište.\n\n; Ako ste upravo nadogradili MediaWiki:\n: MediaWiki 1.24 i više verzije više ne automatski uključuju instalirane teme (pogledajte [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Priručni: Automatski traženje tema]). Možete prekopirati {{PLURAL:$5|sljedeći red kǒda|sljedeće redove kǒda}} u datoteku <code>LocalSettings.php</code> kako biste uključili {{PLURAL:$5|odgovarajuću instaliranu temu|sve instalirane teme}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Ako ste upravo promijenili datoteku <code>LocalSettings.php</code>:\n: Provjerite jeste li napravili grešku pri unosu naziva tema.",
+       "default-skin-not-found-no-skins": "Ups! Nije dostupna predodređena tema vašeg wikija, koja je definirana u <code dir=\"ltr\">$wgDefaultSkin</code> kao <code>$1</code>.\n\nNemate instaliranih tema.\n\n; Ako ste upravo nadogradili MediaWiki:\n: Vjerovatno ste je instalirali sa gita ili sa izvornog koda koristeći se nekom drugom metodom. Ovo je za očekivati. MediaWiki 1.24 i više ne sadržavaju teme u glavnom skladištu. Pokušajte instalirati neku temu sa [https://www.mediawiki.org/wiki/Category:All_skins kataloga tema] tako što ćete:\n:* Preuzeti [https://www.mediawiki.org/wiki/Download tarball instalacijsku datoteku] koji sadrži nekoliko tema i proširenja. Možete prekopirati folder <code>skins/</code> iz nje.\n:* Preuzeti zasebne instalacijske tarball datoteke sa stranice [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]. \n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Koristiti Git kako biste preuzeli teme].\n: Ako ste MediaWiki razvijatelj, ovo ne bi trebalo utjecati na vaše git skladište.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (uključena)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (isključena)",
+       "mediastatistics": "Statistika datoteka",
+       "mediastatistics-summary": "Statistike o tipovima poslanih datoteka. Ovdje su uračunate samo najnovije verzije datoteka. Stare ili obrisane verzije nisu uračunate.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 bajt|$1 bajt|$1 bajtova}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME tip",
+       "mediastatistics-table-extensions": "Moguća proširenja",
        "mediastatistics-table-count": "Broj datoteka",
        "mediastatistics-table-totalbytes": "Kombinirana veličina",
        "mediastatistics-header-unknown": "Nepoznato",
+       "mediastatistics-header-bitmap": "Bitmap slike",
        "mediastatistics-header-drawing": "Crteži (vektorske slike)",
        "mediastatistics-header-audio": "Zvuk",
        "mediastatistics-header-video": "Videa",
        "mediastatistics-header-text": "Tekstualno",
        "mediastatistics-header-executable": "Izvršni",
        "mediastatistics-header-archive": "Kompresovani formati",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|prateća tačka uklonjena je|pratećih tački uklonjeno je}} iz JSON-a",
+       "json-error-unknown": "Dogodio se problem s JSON-om. Greška: $1",
+       "json-error-depth": "Prekoračena je maksimalna dubina",
+       "json-error-state-mismatch": "Nevažeći ili pokvareni JSON",
+       "json-error-ctrl-char": "Greška kontrolnog simbola, moguće je da je neispravno enkodiran",
        "json-error-syntax": "Sintaksna greška",
+       "json-error-utf8": "Pokvareni UTF-8 znaci, moguće je da su neispravno enkodirani",
+       "json-error-recursion": "Jedna ili više rekurzivnih referenci u iznosu koga treba enkodirati",
+       "json-error-inf-or-nan": "Jedna ili više NAN ili INF vrijednosti u iznosu koga treba enkodirati",
+       "json-error-unsupported-type": "Data je vrijednost vrste koja se ne može enkodirati",
+       "headline-anchor-title": "Veza do ovog odjeljka",
        "special-characters-group-latin": "Latinica",
        "special-characters-group-latinextended": "Prošireni latinski",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-greek": "Grčki",
        "special-characters-group-cyrillic": "Ćirilica",
        "special-characters-group-arabic": "Arapski",
+       "special-characters-group-arabicextended": "Prošireni arapski",
        "special-characters-group-persian": "Perzijski",
        "special-characters-group-hebrew": "Hebrejski",
        "special-characters-group-bangla": "Bangladeški",
+       "special-characters-group-tamil": "Tamilski",
        "special-characters-group-telugu": "Telugu",
        "special-characters-group-sinhala": "Sinhala",
        "special-characters-group-gujarati": "Gujarati",
+       "special-characters-group-devanagari": "Devanagari",
        "special-characters-group-thai": "Tajlandski",
        "special-characters-group-lao": "Laoški",
-       "special-characters-group-khmer": "Kmerski"
+       "special-characters-group-khmer": "Kmerski",
+       "special-characters-title-endash": "crtica",
+       "special-characters-title-emdash": "duga crta",
+       "special-characters-title-minus": "minus",
+       "mw-widgets-titleinput-description-new-page": "stranica još ne postoji",
+       "mw-widgets-titleinput-description-redirect": "preusmjerava na $1"
 }
index c66f094..511d8af 100644 (file)
        "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.",
        "title-invalid-empty": "El títol de la pàgina sol·licitada és buit o només conté el nom d’un espai de noms.",
        "title-invalid-utf8": "El títol de la pàgina sol·licitada conté una seqüència UTF-8 no vàlida.",
-       "title-invalid-interwiki": "El títol conté un enllaç interwiki",
+       "title-invalid-interwiki": "El títol de la pàgina sol·licitada conté un enllaç interwiki que no pot ser utilitzat en títols.",
        "title-invalid-talk-namespace": "El títol de la pàgina sol·licitada fa referència a una pàgina de discussió impossible.",
        "title-invalid-characters": "El títol de la pàgina sol·licitada conté caràcters no vàlids: «$1».",
        "title-invalid-relative": "El títol conté un camí relatiu. Els títols relatius (./, ../) no són vàlids perquè els navegadors web sovint no poden arribar-hi.",
        "yourdiff": "Diferències",
        "copyrightwarning": "Si us plau, tingueu en compte que totes les contribucions per al projecte {{SITENAME}} es consideren com a publicades sota els termes de la llicència $2 (vegeu-ne més detalls a $1). Si no desitgeu la modificació i distribució lliure dels vostres escrits sense el vostre consentiment, no els poseu ací.<br />\nA més a més, en enviar el vostre text, doneu fe que és vostra l'autoria, o bé de fonts en el domini públic o recursos lliures similars. Heu de saber que aquest '''no''' és el cas de la majoria de pàgines que hi ha a Internet.\n'''No feu servir textos amb drets d'autor sense permís!'''",
        "copyrightwarning2": "Si us plau, tingueu en compte que totes les contribucions al projecte {{SITENAME}} poden ser corregides, alterades o esborrades per altres usuaris. Si no desitgeu la modificació i distribució lliure dels vostres escrits sense el vostre consentiment, no els poseu ací.<br />\nA més a més, en enviar el vostre text, doneu fe que és vostra l'autoria, o bé de fonts en el domini públic o altres recursos lliures similars (consulteu $1 per a més detalls).\n'''No feu servir textos amb drets d'autor sense permís!'''",
+       "editpage-cannot-use-custom-model": "El model de contingut d'aquesta pàgina no pot ser canviat.",
        "longpageerror": "'''Error: El text que heu introduït és {{PLURAL:$1|d'un kilobyte|de $1 kilobytes}} i sobrepassa el màxim permès de {{PLURAL:$2|one kilobyte|$2 kilobytes}}.'''\nNo es pot desar.",
        "readonlywarning": "'''Avís: La base de dades està tancada per manteniment, de manera que no podreu desar els canvis ara mateix.'''\nÉs possible que vulgueu copiar i enganxar el text en un arxiu de text i desar-ho més tard.\n\nL'administrador que l'ha bloquejada ha donat la següent explicació: $1",
        "protectedpagewarning": "'''ATENCIÓ: Aquesta pàgina està bloquejada i només els usuaris amb drets d'administrador la poden modificar.\nA continuació es mostra la darrera entrada del registre com a referència:",
        "badsig": "La signatura que heu inserit no és vàlida; verifiqueu les etiquetes HTML que heu emprat.",
        "badsiglength": "La signatura és massa llarga.\nHa de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.",
        "yourgender": "Sexe:",
-       "gender-unknown": "No especificat",
+       "gender-unknown": "En esmentar-vos, el software utilitzarà paraules de gènere neutre, sempre que sigui possible",
        "gender-male": "Masculí",
        "gender-female": "Femení",
        "prefs-help-gender": "Opcional: s'usa perquè el programari se us adreci amb missatges amb el gènere adient. Aquesta informació serà pública.",
        "userrights-lookup-user": "Gestiona els grups d'usuari",
        "userrights-user-editname": "Introduïu un nom d'usuari:",
        "editusergroup": "Edita els grups d'usuaris",
-       "editinguser": "Modificació dels permisos de {{GENDER:$1|l’usuari|la usuària}} '''[[User:$1|$1]]''' $2",
+       "editinguser": "Modificació dels permisos de {{GENDER:$1|l'usuari|la usuària}} <strong>[[User:$1|$1]]</strong>$2",
        "userrights-editusergroup": "Edita els grups d'usuaris",
        "saveusergroups": "Desa els grups d'usuari",
        "userrights-groupsmember": "Membre de:",
        "uploaddisabledtext": "S'ha inhabilitat la càrrega de fitxers.",
        "php-uploaddisabledtext": "La càrrega de fitxer està desactivada al PHP. Comproveu les opcions del fitxer file_uploads.",
        "uploadscripted": "Aquest fitxer conté codi HTML o de seqüències que pot ser interpretat equivocadament per un navegador.",
+       "upload-scripted-pi-callback": "No es poden carregar arxius que continguin instruccions de processament de pàgines d'estil XML",
        "uploadscriptednamespace": "Aquest fitxer SVG conté un espai de noms \"$1\" no autoritzat",
        "uploadinvalidxml": "No s'ha pogut analitzar l'XML del fitxer carregat.",
        "uploadvirus": "El fitxer conté un virus! Detalls: $1",
        "pageinfo-robot-index": "Permès",
        "pageinfo-robot-noindex": "No permès",
        "pageinfo-watchers": "Número d'usuaris que vigilen la pàgina",
+       "pageinfo-visiting-watchers": "Nombre de vigilants de la pàgina que han visitat els canvis recents",
        "pageinfo-few-watchers": "Menys de $1 {{PLURAL:$1|observador|observadors}}",
        "pageinfo-redirects-name": "Nombre de redireccions a aquesta pàgina",
        "pageinfo-redirects-value": "$1",
index 65bd132..0759943 100644 (file)
@@ -15,7 +15,7 @@
        "tog-hideminor": "Къайладаха кигийра нисдарш оц могӀама керла хийцамехь",
        "tog-hidepatrolled": "Къайладаха гӀаролладина нисдарш оц могӀама керла нисдаршкахь",
        "tog-newpageshidepatrolled": "Къайлаяха гӀароллайина агӀонаш оьцу могӀама керла агӀонашкахь",
-       "tog-extendwatchlist": "Шорбина тӀехьажарна могӀам, ша беригге а хийцамаш чубогӀуш, тӀехьаббина боцурш а",
+       "tog-extendwatchlist": "Шорбина тӀехьажарна могӀам, ша беригге а, хийцамаш чубогӀуш, тӀехьаббина боцурш а",
        "tog-usenewrc": "Лелабе дика могӀам керла чу хийцамашна (оьшу JavaScript)",
        "tog-numberheadings": "Ша шех хlитто терахь корташна",
        "tog-showtoolbar": "Гайта лакхара гӀирсийн панель тадарш дечу хенахь",
        "laggedslavemode": "Тергам бе: агӀона чохь керла йаьхинарш ца хила мега.",
        "readonly": "Блоктоьхна дӀайаздар хаамийн бухе",
        "enterlockreason": "Билгалде блоктохаран бахьана а, и чекх йолу хан а.",
-       "readonlytext": "АгӀонаш тӀетохар а кхин хийцамаш барна а блоктоьхна:\nБлокоьхначо биттина хаам: $1.",
+       "readonlytext": "АгӀонаш тӀетохар а, кхин хийцамаш барна а блоктоьхна:\nБлокоьхначо биттина хаам: $1.",
        "missing-article": "ХӀокху чохь кароезаш йолу хьан дехарца йозан агӀонаш цакарийна «$1» $2.\n\nИштнарг наггахь хуьлу хьажорг дӀаяьккхина елахь я хийцам бина тиша хьажоргца дехьа гӀо гӀоьртича.\n\nНагахьсан гӀулкх цуьнах доьзна дацахь, хьуна карийна гӀирс латточехь гӀалат.\nДехар до, хаам бе оцуьнах [[Special:ListUsers/sysop|куьйгалхога]], гойтуш URL.",
        "missingarticle-rev": "(верси № $1)",
        "missingarticle-diff": "(башхалла: $1, $2)",
        "actionthrottledtext": "Спам цахилийта хӀара дешдерг кӀезиг хенахь дукху ца дайта дихкина ду. Дехар до массийта минот яьлча гӀорта.",
        "protectedpagetext": "ХӀара агӀо дӀакъоьвлина ю тадарш ца дайта.",
        "viewsourcetext": "Хьоьга далундерг хьажар а дезахь хlокху агlон чура йоза хьаэцар:",
-       "viewyourtext": "Хьан йиш ю '''хьой нисдинчу''' дӀадолалун йозе хьажа а цуна копи ян а:",
+       "viewyourtext": "Хьан йиш ю '''хьой нисдинчу''' дӀадолалун йозе хьажа а, цуна копи ян а:",
        "protectedinterface": "ХӀокху агӀона чохь интерфейсан программа латторан хаам бу. Зулам ца дайта цуна хийцам бан куьйгалхошна бен цало.\nХӀокху хааман гоч тӀетоха я хийца лелае локализацин сайт MediaWiki [//translatewiki.net/ translatewiki.net]",
        "editinginterface": "<strong>Тергам бе:</strong> Ахьа таеш ю интерфейсан йоза долу агӀо программин латторан.\nЦуна бина хийцам хьокху Википедин кхечу декъашхошна гур бу.",
        "translateinterface": "ХӀокху хааман гоч тӀетоха я хийца дехар до лелае локализацин сайт MediaWiki [//translatewiki.net/ translatewiki.net].",
        "wrongpasswordempty": "Дехар до, язъе еса йоцу пароль.",
        "passwordtooshort": "Пароль хилла еза $1 {{PLURAL:$1|символ|символаш}} йолуш.",
        "password-name-match": "Язъен пароль декъашхочун дӀаяздарал башха хила еза.",
-       "password-login-forbidden": "Иштта декъашхочун цӀе а пароль а лелаян цамаго.",
+       "password-login-forbidden": "Иштта декъашхочун цӀе а, пароль а лелаян цамаго.",
        "mailmypassword": "Пароль кхоссар",
        "passwordremindertitle": "Декъашхочун {{grammar:genitive|{{SITENAME}}}}  пароль дагайаийтар",
        "passwordremindertext": "Цхьам (ахь хила мега IP-адрес $1 тӀера) керла пароль кхоллар дехна {{grammar:genitive|{{SITENAME}}}} ($4) чохь. Декъашхочун $2\nкхоьллина керла хана пароль: $3. Иза дехар ахь динехь,\nсистемин чугӀой хийца пароль.\nХьан керла пароль белх беш хира ю $5 {{PLURAL:$5|дийнахь}}.\n\nХьой дехар дийна дацахь хӀума маде Ӏад бита хӀара хаам.",
        "mergehistory-submit": "Цхьаьнатоха нисдарш",
        "mergehistory-empty": "Цхьаьнатоха нисдарш цакарий.",
        "mergehistory-success": "$3 {{PLURAL:$3|нисдар|нисдарш}} [[:$1]] чура кхиамца {{PLURAL:$3|дехьа даьккхина|дехьа дехна}} [[:$2]] чу.",
-       "mergehistory-fail": "АгӀонийн истореш вовшахтоха цаделира, дехар до агӀона параметаршка а хене а хьажа.",
+       "mergehistory-fail": "АгӀонийн истореш вовшахтоха цаделира, дехар до агӀона параметаршка а, хене а хьажа.",
        "mergehistory-no-source": "Коьрта агӀо «$1» яц.",
        "mergehistory-no-destination": "Ӏалашон агӀо «$1» яц.",
        "mergehistory-invalid-source": "Хьостан нийса корта хила еза.",
        "yourlanguage": "Мотт:",
        "yourvariant": "Метта башхо:",
        "yournick": "Керла куьгтаӀор:",
-       "prefs-help-signature": "Дийцаре агӀонаш чохь къуьгтаӀо деза символшца «<nowiki>~~~~</nowiki>», цара гойтур ду хьан къуьгтаӀор а хан а.",
+       "prefs-help-signature": "Дийцаре агӀонаш чохь къуьгтаӀо деза символшца «<nowiki>~~~~</nowiki>», цара гойтур ду хьан къуьгтаӀор а, хан а.",
        "badsiglength": "ТӀех деха куьг.\nКуьйган $1 {{PLURAL:$1|символ}} дукха хила цамега.",
        "yourgender": "Стен-боьршалла",
        "gender-unknown": "хӀоттийна яц",
        "right-writeapi": "дӀаяздеш лелойо API",
        "right-delete": "агӀонаш дӀаяхар",
        "right-bigdelete": "еха хийцаман истори йолу агӀонаш дӀаяхар",
-       "right-deletelogentry": "тептар чура билгала дӀаяздарш дӀадахар а меттахӀиттадар а.",
-       "right-deleterevision": "агӀонийн билгала версеш дӀаяхар а меттахӀиттаяр а",
+       "right-deletelogentry": "тептар чура билгала дӀаяздарш дӀадахар а, меттахӀиттадар а.",
+       "right-deleterevision": "агӀонийн билгала версеш дӀаяхар а, меттахӀиттаяр а",
        "right-deletedhistory": "дӀаяьхна агӀонийн исторега хьажар дӀадаьккхина йоза тӀекхочехь доцуш",
-       "right-deletedtext": "дӀадаьккхина йозане а хийцамашка а хьажар агӀонийн дӀаяьхна версин юккъахь",
+       "right-deletedtext": "дӀадаьккхина йозане а, хийцамашка а хьажар агӀонийн дӀаяьхна версин юккъахь",
        "right-browsearchive": "дӀаяхна агӀонаш лахар",
        "right-undelete": "АгӀонаш меттахӀоттор",
        "right-suppressrevision": "куьйгалхойх хьулйина йолу агӀонийн версеш меттахӀиттаяр а хьажар а",
        "right-suppressionlog": "долара тептаршка хьажар",
        "right-block": "кхечу декъашхошка тадарш ца дайта дехкар хӀоттор",
        "right-blockemail": "Цамагдо декъашхошка хааман кехаташ кхехьийта",
-       "right-hideuser": "декъашхочун цӀе а и лечкъо а цамагор",
-       "right-ipblock-exempt": "IP блоктохаршна чекхбовлар, диапазонийн шаблоктохаршна а блоктохаршна а",
+       "right-hideuser": "декъашхочун цӀе а, и лечкъо а цамагор",
+       "right-ipblock-exempt": "IP блоктохаршна чекхбовлар, диапазонийн шаблоктохаршна а, блоктохаршна а",
        "right-proxyunbannable": "проксен автоматически блоктохаран чекхбовлар",
        "right-unblockself": "ша шин блокдӀаяккхар",
        "right-protect": "АгӀо ларъяран хийцар а, ларйина агӀо нисяр а",
        "right-editprotected": "«{{int:protect-level-sysop}}» бахьанца ларйина агӀонаш нисъяр",
        "right-editsemiprotected": "«{{int:protect-level-autoconfirmed}}» бахьанца ларйина агӀонаш нисъяр",
        "right-editinterface": "лелош йолу интерфейсан хийцам бар",
-       "right-editusercssjs": "кхечу декъашхойн CSS- а JS- а файлаш нисяр",
+       "right-editusercssjs": "кхечу декъашхойн CSS- а, JS- а файлаш нисяр",
        "right-editusercss": "кхечу декъашхойн CSS-файлаш нсяр",
        "right-edituserjs": "кхечу декъашхойн JavaScript-файлаш нисяр",
        "right-editmyusercss": "Декъашхочун CSS файлаш таяр",
        "right-mergehistory": "агӀонаш вовшахтохар",
        "right-userrights": "декъашхойн массо бакъонаш хийцар",
        "right-userrights-interwiki": "кхечу вики сайташкара декъашхойн бакъонаш хийцар",
-       "right-siteadmin": "хаамийн гуламан блоктохар а блокдӀаяккхар а",
+       "right-siteadmin": "хаамийн гуламан блоктохар а, блокдӀаяккхар а",
        "right-override-export-depth": "агӀонаш экспорт ян, 5 кхаччалц къорга агӀонаш цхьан",
        "right-sendemail": "кхечу декъашхошка электронан хаамаш кхехьийта",
        "right-passwordreset": "пароль хийцарца электроннан хаамашка хьажар",
-       "right-managechangetags": "Хаамийн базан чохь [[Special:Tags|билгалонаш]] кхолла а дӀаяха а",
+       "right-managechangetags": "Хаамийн базан чохь [[Special:Tags|билгалонаш]] кхолла а, дӀаяха а",
        "newuserlogpage": "Декъашхой дӀабазбина тептар",
        "newuserlogpagetext": "Дукху хан йоцуш дӀабазбелла декъашхойн могӀам",
        "rightslog": "Декъашхочун бакъона тéптар",
        "action-deletedhistory": "хӀокху агӀона дӀаяккхинцу исторега хьажар",
        "action-browsearchive": "ДӀаяхна агӀонаш лахар",
        "action-undelete": "хӀара агӀо меттахӀоттор",
-       "action-suppressrevision": "хӀокху къайлаха йолу агӀон версеш хьажар а меттахӀоттор а",
+       "action-suppressrevision": "хӀокху къайлаха йолу агӀон версеш хьажар а, меттахӀоттор а",
        "action-suppressionlog": "хӀокху долара тептаре хьажар",
        "action-block": "хӀокху декъашхошка тадарш ца дайта дехкар хӀоттор",
        "action-protect": "хӀокху агӀона гӀоралин хьал хийцар",
        "action-viewmywatchlist": "шен тергаме могӀане хьажар",
        "action-viewmyprivateinfo": "хьан долара хааме хьажар",
        "action-editmyprivateinfo": "хьан долара хаам табар",
-       "action-managechangetags": "хаамийн базан чохь билгалонаш кхоллар а дӀаяхар а",
+       "action-managechangetags": "хаамийн базан чохь билгалонаш кхоллар а, дӀаяхар а",
        "nchanges": "$1 {{PLURAL:$1|хийцам}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|тӀеххьара чудаларца}}",
        "enhancedrc-history": "истори",
        "file-exists-duplicate": "ХӀара файл лахарчу {{PLURAL:$1|1=файлан|файлийн}} дубликат ю:",
        "file-deleted-duplicate": "Иштта файл ([[:$1]]) хӀинцале дӀаяьккхина хилла. Дехар до, юху файл чуяккхале файл дӀаяккхаран историга хьажа.",
        "uploadwarning": "ДӀахьедар",
-       "uploadwarning-text": "Дехар до, лахара файлах лаьцнарг хийца а дай юху а гӀорта файл чуяккха.",
+       "uploadwarning-text": "Дехар до, лахара файлах лаьцнарг хийца а, дай юху а гӀорта файл чуяккха.",
        "savefile": "ДӀаязъе файл",
        "uploaddisabled": "Чуяккхар магийна дац",
        "copyuploaddisabled": "URL тӀера чуяккхар дӀадайина ду.",
        "deadendpages": "Дика йоцу агӀонаш",
        "protectedpages": "Ларйина агӀонаш",
        "protectedpages-indef": "Хан йоцуш ларйинарш бен",
+       "protectedpages-summary": "ХӀокху агӀонгахь гойтуш ю йолуш йолу ларйина агӀонаш. ЦӀерш ларйина агӀонашка хьажа [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Чахчарин ларъяр бен",
        "protectedpages-noredirect": "Къайлаяха дӀасахьажийнарш",
        "protectedpages-timestamp": "Терахь/хан",
        "protectedpages-unknown-timestamp": "Хууш дац",
        "protectedpages-unknown-performer": "Хууш доцу декъашхо",
        "protectedtitles": "Ларйина цӀерш",
+       "protectedtitles-summary": "ХӀокху агӀонгахь гойтуш ю ца кхоллийта ларйина цӀерш. ХӀинца ларйина агӀонашка хьажа [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "listusers": "Декъашхойн могӀам",
        "listusers-editsonly": "Цхаъ мукъане а хийцам бина декъашхой гайта",
        "listusers-creationsort": "Кхоьллина хене хьаьжжина нисъяр",
        "restriction-level-autoconfirmed": "дуьззина доцуш лардар",
        "restriction-level-all": "массо барам",
        "undelete": "ДӀаяьхна агӀонашка хьажар",
-       "undeletepage": "ДӀаяьхна агӀонашка хьажар а меттахӀоттор а",
+       "undeletepage": "ДӀаяьхна агӀонашка хьажар а, меттахӀоттор а",
        "undeletepagetitle": "'''Лахахь гайтина хӀокху [[:$1]] агӀона дӀаяхина версеш'''.",
        "viewdeletedpage": "ДӀаяьхна йолу агӀонашка хьажар",
        "undelete-fieldset-title": "МеттахӀоттае версеш",
        "undeleteinvert": "Къастае массо",
        "undeletecomment": "Бахьана:",
        "undeletedrevisions": "{{PLURAL:$1|меттахӀоьттина}} $1 {{PLURAL:$1|хийцам}}",
-       "undeletedrevisions-files": "меттахӀоьттина $1 {{PLURAL:$1|верси}} а $2 {{PLURAL:$2|файл}} а",
+       "undeletedrevisions-files": "меттахӀоьттина $1 {{PLURAL:$1|верси}} а, $2 {{PLURAL:$2|файл}} а",
        "undeletedfiles": "$1 {{PLURAL:$1|файл меттахӀоттайина|файлаш меттахӀоттайина}}",
        "cannotundelete": "ГӀалат меттахӀоттайина:\n$1",
        "undeletedpage": "'''МеттахӀоттайина агӀо «$1».'''\n\nДӀадяхнарш долу могӀане [[Special:Log/delete|тéптаре хьажа]].",
        "ipbsubmit": "Блоктоха хӀокху декъашхочун/адресна",
        "ipbother": "Кхин хан:",
        "ipboptions": "2 сахьат:2 hours,1 де:1 day,3 де:3 days,1 кlиран:1 week,2 кlиран:2 weeks,1 бутт:1 month,3 бутт:3 months,6 бутт:6 months,1 шо:1 year,цӀкъа:infinite",
-       "ipbhidename": "Нисдарийн а могӀаман а чура декъашхочун цӀе хьул йе",
-       "ipbwatchuser": "ТӀетоха тергаме могӀам юкъа цуьнан долахь йолу агӀо а цуьнан дийцаре агӀо а",
+       "ipbhidename": "Нисдарийн а, могӀаман а чура декъашхочун цӀе хьул йе",
+       "ipbwatchuser": "ТӀетоха тергаме могӀам юкъа цуьнан долахь йолу агӀо а, цуьнан дийцаре агӀо а",
        "ipb-disableusertalk": "Цамагдо шин дийцаре агӀо та я блоктоьхна хан чекхъяллалц",
        "ipb-change-block": "Юхаблоктоха декъашхочун оьцу хийцамашца",
        "ipb-confirm": "Бакъде блоктохар",
        "articleexists": "ХӀарасанна цӀе йолу агӀо йолуш ю йа ахьа гойтуш йолу цӀе магош яц.\nДехар до, харжа кхин цӀе.",
        "movetalk": "Цуьнца йогӀуш йолу дийцаре агӀон цӀе хийцар",
        "move-subpages": "ЦӀерш хийца бухара агӀонийн ($1 кхаччалц)",
-       "move-talk-subpages": "ЦӀе хийца бухара агӀонийн а агӀонийн дийцаре а ($1  кхаччалц)",
+       "move-talk-subpages": "ЦӀе хийца бухара агӀонийн а, агӀонийн дийцаре а ($1  кхаччалц)",
        "movepage-page-exists": "Агӏо $1 йолуш ю цундела и ша юху дӏаязъян йиш яц.",
        "movepage-page-moved": "АгӀона $1 цӀе хийцина → $2.",
        "movelogpage": "ЦӀерш хийцаран тептар",
        "exif-orientation": "Суьртан хьал",
        "exif-samplesperpixel": "Беснийн компонентийн дукхалла",
        "exif-planarconfiguration": "Организацин хаамийн некъ",
-       "exif-ycbcrsubsampling": "Барамийн компонент Y а C а",
-       "exif-ycbcrpositioning": "Y а C а компонентин листаран кеп",
+       "exif-ycbcrsubsampling": "Барамийн компонент Y а, C а",
+       "exif-ycbcrpositioning": "Y а, C а компонентин листаран кеп",
        "exif-xresolution": "Шоралла",
        "exif-yresolution": "Локхалла",
        "exif-stripoffsets": "Суьртийн хаамаш болу меттиг",
        "exif-jpeginterchangeformatlength": "Сизан хааман барам preview",
        "exif-whitepoint": "Къайн тӀадаман бос",
        "exif-primarychromaticities": "Коьрта беснийн бос",
-       "exif-referenceblackwhite": "Ӏаьржа а къай а тӀадамийн меттиг",
+       "exif-referenceblackwhite": "Ӏаьржа а, къай а тӀадамийн меттиг",
        "exif-datetime": "Файлан хийцам бина терахь а, хан а",
        "exif-imagedescription": "Суьртан цӏе",
        "exif-make": "Камера арахоьцург",
        "exif-usercomment": "Кхин тӀе къамел",
        "exif-relatedsoundfile": "Къамелан аьзнийн файл",
        "exif-datetimeoriginal": "Дуьххьарлера терахь а хан",
-       "exif-datetimedigitized": "Оцифровк йина терахь а хан а",
+       "exif-datetimedigitized": "Оцифровк йина терахь а, хан а",
        "exif-subsectime": "Файлан хийцам баран хан секундашкахь",
        "exif-subsectimeoriginal": "Оригинал хенан секундан дакъа",
        "exif-subsectimedigitized": "Терахьийн хенан секундан дакъа",
        "exif-gpsdop-poor": "Во ($1)",
        "exif-objectcycle-a": "Ӏуьранна бен",
        "exif-objectcycle-p": "Суьйранна бен",
-       "exif-objectcycle-b": "Ӏуьранна а суьйранна а",
+       "exif-objectcycle-b": "Ӏуьранна а, суьйранна а",
        "exif-gpsdirection-t": "бакъалла",
        "exif-gpsdirection-m": "магнитан",
        "exif-ycbcrpositioning-1": "Юкъйина",
        "exif-dc-type": "Медиан тайп",
        "exif-rating-rejected": "ДӀайайина",
        "exif-isospeedratings-overflow": "65535 дукха",
-       "exif-iimcategory-ace": "Исбаьхьалла, культура а синкъерам а",
-       "exif-iimcategory-clj": "Зулам дар а Ӏедал а",
-       "exif-iimcategory-dis": "Ирча бохам а авари а",
-       "exif-iimcategory-fin": "Экономика а бизнес а",
+       "exif-iimcategory-ace": "Исбаьхьалла, культура а, синкъерам а",
+       "exif-iimcategory-clj": "Зулам дар а, Ӏедал а",
+       "exif-iimcategory-dis": "Ирча бохам а, авари а",
+       "exif-iimcategory-fin": "Экономика а, бизнес а",
        "exif-iimcategory-edu": "Дешна хилар",
        "exif-iimcategory-lab": "Къинхьегам",
-       "exif-iimcategory-rel": "Дин а тешар а",
-       "exif-iimcategory-sci": "Ӏилма а техника а",
+       "exif-iimcategory-rel": "Дин а, тешар а",
+       "exif-iimcategory-sci": "Ӏилма а, техника а",
        "exif-iimcategory-soi": "Социалан хаттарш",
        "exif-iimcategory-wea": "Хенан хӀоттам",
        "exif-urgency-normal": "Диканиг ($1)",
        "specialpages-group-highuse": "Уггаре дукха лелайо агӀонаш",
        "specialpages-group-pages": "АгӀонийн могӀанаш",
        "specialpages-group-pagetools": "ГӀирсаш агӀонашна",
-       "specialpages-group-wiki": "Хаамаш а гӀирсаш а",
+       "specialpages-group-wiki": "Хаамаш а, гӀирсаш а",
        "specialpages-group-redirects": "ДӀасахьажош йолу белхан агӀонаш",
        "specialpages-group-spam": "Спаман дуьхьала гӀирсаш",
        "blankpage": "Еса агӀо",
        "tags-deactivate": "дӀаяйа",
        "tags-hitcount": "$1 {{PLURAL:$1|хийцам}}",
        "tags-create-heading": "Кхолла керла билгало",
-       "tags-create-explanation": "Юха кхоьллина билгалонаш декъашхошна а боташна а Ӏад йтарца тӀекхочуш хира ю.",
+       "tags-create-explanation": "Юха кхоьллина билгалонаш декъашхошна а, боташна а Ӏад йтарца тӀекхочуш хира ю.",
        "tags-create-tag-name": "Билгалонна цӀе:",
        "tags-create-reason": "Бахьана:",
        "tags-create-submit": "Кхолла",
index 362d313..bc238c4 100644 (file)
        "htmlform-selectorother-other": "دیکە",
        "htmlform-no": "نا",
        "htmlform-yes": "بەڵێ",
+       "htmlform-title-not-creatable": "پەڕە بە سەردێڕی \"$1\" دروست ناکرێت",
+       "htmlform-title-not-exists": "[[$1]] بوونی نیە.",
        "logentry-delete-delete": "$1 پەڕەی $3ی {{GENDER:$2|سڕییەوە}}",
        "logentry-delete-restore": "$1 پەڕەی $3ی {{GENDER:$2|ھێنایەوە}}",
        "logentry-delete-revision": "$1 دەرکەوتنی {{PLURAL:$5|پێداچوونەوەیەکی|$5 پێداچوونەوەی}} پەڕەی $3ی {{GENDER:$2|گۆڕیی}}: $4",
index cc5919b..e20c3eb 100644 (file)
        "protectedinterface": "Tato stránka obsahuje text softwarového rozhraní a je zamčena kvůli prevenci zneužití.\nPro přidávání a změny překladů pro všechny wiki použijte [//translatewiki.net/ translatewiki.net], projekt pro lokalizaci MediaWiki.",
        "editinginterface": "<strong>Upozornění:</strong> Editujete stránku, která definuje texty rozhraní.\nZměny této stránky ovlivní vzhled uživatelského rozhraní všem uživatelům této wiki.",
        "translateinterface": "Pro přidávání a změny překladů pro všechny wiki použijte [//translatewiki.net/ translatewiki.net], projekt pro lokalizaci MediaWiki.",
-       "cascadeprotected": "Tato stránka je zamčena, neboť je vložena do {{PLURAL:$1|následující stránky, zamčené|následujících stránek, zamčených|následujících stránek, zamčených}} kaskádovým zámkem:\n$2",
+       "cascadeprotected": "Tato stránka je zamčena, neboť je vložena na {{PLURAL:$1|následující stránku, zamčenou|následující stránky, zamčené}} kaskádovým zámkem:\n$2",
        "namespaceprotected": "Nemáte povoleno editovat stránky ve jmenném prostoru '''$1'''.",
        "customcssprotected": "Nemáte povoleno editovat tuto stránku s CSS, protože obsahuje osobní nastavení jiného uživatele.",
        "customjsprotected": "Nemáte povoleno editovat tuto stránku s JavaScriptem, protože obsahuje osobní nastavení jiného uživatele.",
        "readonlywarning": "<strong>Varování: Databáze byla uzamčena kvůli údržbě, takže momentálně nebudete moci uložit své změny.</strong>\nMůžete si okopírovat text do souboru a uložit si ho na později.\n\nSprávce serveru, který databázi zamkl, poskytl toto zdůvodnění: $1",
        "protectedpagewarning": "'''Varování: Tato stránka byla zamčena, takže ji mohou editovat pouze správci.'''\nNíže je pro přehled zobrazen nejnovější protokolovací záznam:",
        "semiprotectedpagewarning": "'''Poznámka:''' Tato stránka byla zamčena, takže ji mohou editovat pouze registrovaní uživatelé.\nNíže je pro přehled zobrazen nejnovější protokolovací záznam:",
-       "cascadeprotectedwarning": "<strong>Varování:</strong> Tato stránka byla zamčena, takže ji mohou editovat pouze správci, protože je vložena na následující, kaskádm zámkem {{PLURAL:$1|zamčenou, stránku|zamčené, stránky}}:",
+       "cascadeprotectedwarning": "<strong>Varování:</strong> Tato stránka byla zamčena, takže ji mohou editovat pouze správci, protože je vložena na následující, kaskádovým zámkem {{PLURAL:$1|zamčenou, stránku|zamčené, stránky}}:",
        "titleprotectedwarning": "'''Varování: Tato stránka byla uzamčena, takže k jejímu založení jsou potřeba [[Special:ListGroupRights|zvláštní oprávnění]].'''\nNíže je pro přehled zobrazen nejnovější protokolovací záznam:",
        "templatesused": "{{PLURAL:$1|Šablona použitá|Šablony použité}} na této stránce:",
        "templatesusedpreview": "{{PLURAL:$1|Šablona použitá|Šablony použité}} v tomto náhledu:",
        "htmlform-title-badnamespace": "Stránka [[:$1]] není ve jmenném prostoru „{{ns:$2}}“.",
        "htmlform-title-not-creatable": "Pod názvem „$1“ nelze vytvořit stránku",
        "htmlform-title-not-exists": "Stránka [[:$1]] neexistuje.",
+       "htmlform-user-not-exists": "Uživatel <strong>$1</strong> neexistuje.",
+       "htmlform-user-not-valid": "<strong>$1</strong> není platné uživatelské jméno.",
        "sqlite-has-fts": "$1 s podporou plnotextového vyhledávání",
        "sqlite-no-fts": "$1 bez podpory plnotextového vyhledávání",
        "logentry-delete-delete": "$1 {{GENDER:$2|smazal|smazala}} stránku $3",
index 5de7f78..3c0a78e 100644 (file)
        "emailccme": "Çыру копине ман пата ямалла",
        "emailsent": "Çырăва леçрĕмĕр",
        "emailsenttext": "Сирĕн электронлă çырăва леçрĕмĕр.",
-       "watchlist": "Ð\9fÄ\83Ñ\85Ñ\81а Ñ\82Ä\83Ñ\80акан Ñ\81Ñ\82Ñ\80аниÑ\86Ä\83Ñ\81ем Ñ\8fÑ\82-йÑ\8bÑ\88ĕ",
+       "watchlist": "Ð\9fÄ\83Ñ\85Ñ\81а Ñ\82Ä\83Ñ\80акан Ñ\81Ñ\82Ñ\80аниÑ\86Ä\83Ñ\81ен Ñ\81пиÑ\81окĕ",
        "mywatchlist": "Сăнаса тăракан списокĕ",
        "watchlistfor2": "$1 валли $2",
        "nowatchlist": "Эсир пăхса тăракан страницăсен списокĕ пушă.",
index f46ebde..9b744ee 100644 (file)
        "specialpages-group-spam": "Spam-Werkzeuge",
        "specialpages-group-developer": "Entwicklerwerkzeuge",
        "blankpage": "Leere Seite",
-       "intentionallyblankpage": "Diese Seite ist absichtlich ohne Inhalt. Sie wird für Benchmarks verwendet.",
+       "intentionallyblankpage": "Diese Seite enthält absichtlich keinen Inhalt.",
        "external_image_whitelist": " #Diese Zeile nicht verändern.<pre>\n#Untenstehend können Fragmente regulärer Ausdrücke (der Teil zwischen den //) eingegeben werden.\n#Diese werden mit den URLs von Bildern aus externen Quellen verglichen.\n#Ein positiver Vergleich führt zur Anzeige des Bildes, andernfalls wird das Bild nur als Link angezeigt.\n#Zeilen, die mit einem # beginnen, werden als Kommentar behandelt.\n#Es wird nicht zwischen Groß- und Kleinschreibung unterschieden.\n\n#Fragmente regulärer Ausdrücke nach dieser Zeile eintragen. Diese Zeile nicht verändern.</pre>",
        "tags": "Gültige Änderungsmarkierungen",
        "tag-filter": "[[Special:Tags|Markierungs]]-Filter:",
        "htmlform-title-badnamespace": "[[:$1]] ist nicht im Namensraum „{{ns:$2}}“.",
        "htmlform-title-not-creatable": "„$1“ ist kein erstellbarer Seitentitel",
        "htmlform-title-not-exists": "[[:$1]] ist nicht vorhanden.",
+       "htmlform-user-not-exists": "<strong>$1</strong> ist nicht vorhanden.",
+       "htmlform-user-not-valid": "<strong>$1</strong> ist kein gültiger Benutzername.",
        "sqlite-has-fts": "Version $1 mit Unterstützung für die Volltextsuche",
        "sqlite-no-fts": "Version $1 ohne Unterstützung für die Volltextsuche",
        "logentry-delete-delete": "$1 {{GENDER:$2|löschte}} Seite $3",
index 00bd980..1fdd75d 100644 (file)
        "htmlform-title-badnamespace": "[[:$1]] is not in the \"{{ns:$2}}\" namespace.",
        "htmlform-title-not-creatable": "\"$1\" is not a creatable page title",
        "htmlform-title-not-exists": "[[:$1]] does not exist.",
+       "htmlform-user-not-exists": "<strong>$1</strong> does not exist.",
+       "htmlform-user-not-valid": "<strong>$1</strong> isn't a valid username.",
        "sqlite-has-fts": "$1 with full-text search support",
        "sqlite-no-fts": "$1 without full-text search support",
        "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} page $3",
index 7fbb96d..d6520d6 100644 (file)
        "tog-oldsig": "Firma actual:",
        "tog-fancysig": "Tratar la firma como wikitexto (sin un enlace automático)",
        "tog-uselivepreview": "Usar previsualización dinámica",
-       "tog-forceeditsummary": "Avisarme cuando grabe la página sin introducir un resumen de edición",
+       "tog-forceeditsummary": "Avisarme cuando grabe la página sin escribir un resumen de edición",
        "tog-watchlisthideown": "Ocultar mis ediciones en la lista de seguimiento",
        "tog-watchlisthidebots": "Ocultar las ediciones de bots en la lista de seguimiento",
        "tog-watchlisthideminor": "Ocultar las ediciones menores en la lista de seguimiento",
        "passwordreset-emailsent-capture": "Se ha enviado un correo para el restablecimiento de la contraseña, el cual se muestra a continuación.",
        "passwordreset-emailerror-capture": "Se ha generado un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero ha fallado el envío {{GENDER:$2|al usuario|a la usuaria}}: $1",
        "changeemail": "Cambiar la dirección de correo electrónico",
-       "changeemail-text": "Rellena este formulario para cambiar tu dirección de correo electrónico. Debes introducir tu contraseña para confirmar este cambio.",
+       "changeemail-text": "Rellena este formulario para cambiar tu dirección de correo electrónico. Debes escribir tu contraseña para confirmar este cambio.",
        "changeemail-no-info": "Debes iniciar sesión para acceder directamente a esta página.",
        "changeemail-oldemail": "Dirección de correo electrónico actual:",
        "changeemail-newemail": "Dirección de correo electrónico nueva:",
        "subject-preview": "Previsualización del asunto/encabezado:",
        "previewerrortext": "Se ha producido un error al intentar la vista previa de los cambios.",
        "blockedtitle": "El usuario está bloqueado",
-       "blockedtext": "<strong>Tu nombre de usuario o dirección IP ha sido bloqueada.</strong>\n\nEl bloqueo fue hecho por $1.\nLa razón dada es <em>$2</em>.\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar a $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\nNo puedes utilizar la función «enviar correo electrónico a este usuario»  a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y que el bloqueo no haya inhabilitado esta función.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es #$5.\nPor favor incluye todos los datos aquí mostrados en cualquier consulta que hagas.",
-       "autoblockedtext": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por otro usuario, que resultó bloqueado por $1.\n\nEl motivo dado es el siguiente:\n\n:<em>$2</em>\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\n\nTen en cuenta que no podrás utilizar la herramienta de «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y la función no haya sido también bloqueada.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es #$5.\nPor favor, incluye todos los datos aquí mostrados en cualquier consulta que hagas al respecto.",
+       "blockedtext": "<strong>Tu nombre de usuario o dirección IP ha sido bloqueada.</strong>\n\nEl bloqueo lo hizo $1.\nLa razón dada es <em>$2</em>.\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar a $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\nNo puedes utilizar la función «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y la función no haya sido también bloqueada.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es #$5.\nIncluye todos los datos aquí mostrados en cualquier consulta que hagas.",
+       "autoblockedtext": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por otro usuario, que resultó bloqueado por $1.\nEl motivo dado es el siguiente:\n\n:<em>$2</em>\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\n\nTen en cuenta que no puedes utilizar la función «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y la función no haya sido también bloqueada.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es #$5.\nIncluye todos los datos aquí mostrados en cualquier consulta que hagas.",
        "blockednoreason": "no se ha especificado el motivo",
        "whitelistedittext": "Tienes que $1 para editar páginas.",
        "confirmedittext": "Debes confirmar tu dirección de correo electrónico antes de poder editar páginas. Por favor, configura y confirma tu dirección de correo a través de tus [[Special:Preferences|preferencias de usuario]].",
        "largefileserver": "El tamaño de este archivo es mayor del que este servidor admite por configuración.",
        "emptyfile": "El archivo que has intentado subir parece estar vacío; por favor, verifica que realmente se trate del archivo que intentabas subir.",
        "windows-nonascii-filename": "Este wiki no admite nombres de archivo con caracteres especiales.",
-       "fileexists": "Ya existe un archivo con este nombre, por favor comprueba <strong>[[:$1]]</strong> si {{GENDER:|tú}} no estás seguro de querer cambiarlo.\n[[$1|thumb]]",
-       "filepageexists": "La página de descripción de este archivo ya ha sido creada en <strong>[[:$1]]</strong>, pero no existe actualmente ningún fichero con este nombre.\nEl resumen que ha ingresado no aparecerá en la página de descripción. Para que el sumario aparezca, deberá editarlo manualmente.\n[[$1|thumb]]",
+       "fileexists": "Ya existe un archivo con este nombre. Comprueba <strong>[[:$1]]</strong> si {{GENDER:|tú}} no estás seguro de querer cambiarlo.\n[[$1|thumb]]",
+       "filepageexists": "La página de descripción de este archivo ya ha sido creada en <strong>[[:$1]]</strong>, pero no existe actualmente ningún archivo con este nombre.\nEl resumen que has escrito no aparecerá en la página de descripción.\nPara que el resumen aparezca, deberás editarlo manualmente.\n[[$1|thumb]]",
        "fileexists-extension": "Existe un archivo con un nombre similar: [[$2|thumb]]\n* Nombre del archivo que se está subiendo: <strong>[[:$1]]</strong>\n* Nombre del archivo ya existente: <strong>[[:$2]]</strong>\n¿Quieres cambiar el nombre para que sea más distintivo?",
        "fileexists-thumbnail-yes": "El archivo parece ser una imagen de tamaño reducido ''(thumbnail)''. [[$1|thumb]]\nPor favor comprueba el archivo <strong>[[:$1]]</strong>.\nSi el archivo comprobado es la misma imagen a tamaño original no es necesario subir un thumbnail más.",
        "file-thumbnail-no": "El nombre del archivo comienza con <strong>$1</strong>.\nParece ser una imagen de tamaño reducido ''(thumbnail)''.\nSi tiene esta imagen a toda resolución súbala, si no, por favor cambie el nombre del archivo.",
        "backend-fail-stream": "No se pudo transmitir el archivo «$1».",
        "backend-fail-backup": "No pudo hacer copia de seguridad del archivo «$1».",
        "backend-fail-notexists": "El archivo  $1  no existe.",
-       "backend-fail-hashes": "No se pudieron obtener los hashes de los ficheros para compararlos.",
-       "backend-fail-notsame": "Ya existe un fichero distinto en $1.",
+       "backend-fail-hashes": "No se pudieron obtener los \"hashes\" de los archivos para compararlos.",
+       "backend-fail-notsame": "Ya existe un archivo distinto en \"$1\".",
        "backend-fail-invalidpath": "$1 no es una ruta de almacenamiento válida",
        "backend-fail-delete": "No se pudo borrar el archivo «$1».",
        "backend-fail-describe": "No pudieron cambiar los metadatos del archivo \"$1\".",
        "zip-bad": "El archivo es un ZIP dañado o que no se puede leer.\nNo se puede comprobar su seguridad.",
        "zip-unsupported": "El archivo es un archivo que utiliza características ZIP no compatibles con MediaWiki.\nNo puede comprobarse adecuadamente su seguridad.",
        "uploadstash": "Ficheros escondidos",
-       "uploadstash-summary": "Esta página da acceso a los ficheros enviados (o que están en el proceso de envío) pero que aún no han sido publicados en la wiki. Estos ficheros no son visibles para nadie, excepto para el usuario que los envió.",
+       "uploadstash-summary": "Esta página da acceso a los archivos subidos (o que están por subirse), pero que aún no han sido publicados en el wiki. Estos archivos no son visibles para nadie, excepto para el usuario que los subió.",
        "uploadstash-clear": "Borrar los ficheros escondidos",
        "uploadstash-nofiles": "No tienes archivos escondidos.",
        "uploadstash-badtoken": "No se pudo realizar la acción. Es posible que haya finalizado el tiempo de espera de la sesión. Inténtalo de nuevo.",
        "filerevert-defaultcomment": "Revertido a la versión subida el $1 a las $2",
        "filerevert-submit": "Revertir",
        "filerevert-success": "'''[[Media:$1|$1]]''' ha sido revertido a la [$4 versión del $2 a las $3].",
-       "filerevert-badversion": "No existe version local previa de este archivo con esa marca de tiempo.",
+       "filerevert-badversion": "No existe versión local previa de este archivo con esa marca de tiempo.",
        "filedelete": "Borrar $1",
        "filedelete-legend": "Borrar archivo",
        "filedelete-intro": "Estás borrando el archivo '''[[Media:$1|$1]]''' así como todo su historial.",
        "filedelete-comment": "Motivo:",
        "filedelete-submit": "Eliminar",
        "filedelete-success": "'''$1''' ha sido borrado.",
-       "filedelete-success-old": "La version de '''[[Media:$1|$1]]''' del $2 a las $3 ha sido borrada.",
+       "filedelete-success-old": "La versión de <strong>[[Media:$1|$1]]</strong> del $2 a las $3 ha sido borrada.",
        "filedelete-nofile": "'''$1''' no existe.",
        "filedelete-nofile-old": "No existe una versión guardada de '''$1''' con los atributos especificados.",
        "filedelete-otherreason": "Otra razón:",
        "filedelete-maintenance": "Borrado y restauración de archivos temporalmente deshabilitados durante el mantenimiento.",
        "filedelete-maintenance-title": "No se puede eliminar el archivo",
        "mimesearch": "Búsqueda por MIME",
-       "mimesearch-summary": "Esta página permite el filtrado de ficheros por su tipo MIME.\nEntrada: tipo/subtipo o tipo/*, p. ej. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Esta página permite el filtrado de archivos por su tipo MIME.\nEntrada: tipo/subtipo o tipo/*, p. ej. <code>image/jpeg</code>.",
        "mimetype": "Tipo MIME:",
        "download": "descargar",
        "unwatchedpages": "Páginas no vigiladas",
        "pageswithprop": "Páginas con una propiedad de página",
        "pageswithprop-legend": "Páginas con una propiedad de página",
        "pageswithprop-text": "Esta página muestra las páginas que usan la propiedad de una página en particular",
-       "pageswithprop-prop": "Nombre de la propiedad",
+       "pageswithprop-prop": "Nombre de la propiedad:",
        "pageswithprop-submit": "Ir",
        "pageswithprop-prophidden-long": "hay un largo valor en la propiedad texto oculta ($1)",
        "pageswithprop-prophidden-binary": "valor de la propiedad binaria oculta ($1)",
        "wantedpages": "Páginas requeridas",
        "wantedpages-summary": "Lista de páginas inexistentes con el mayor número de enlaces a ellas, excluyendo páginas que son solo redirecciones a ellas. Para ver una lista de páginas inexistentes con redirecciones apuntando a ellas, consulta [[{{#special:BrokenRedirects}}|la lista de redirecciones rotas]].",
        "wantedpages-badtitle": "Título inválido en conjunto de resultados: $1",
-       "wantedfiles": "Ficheros requeridos",
+       "wantedfiles": "Archivos requeridos",
        "wantedfiletext-cat": "Los siguientes archivos están en uso, pero no existen. Es posible que algunos de ellos estén almacenados en repositorios externos y se hayan incluido aquí por error; dichas entradas aparecen <del>tachadas</del>. De igual manera, las páginas que incluyen archivos inexistentes se enumeran en [[:$1]].",
        "wantedfiletext-cat-noforeign": "Los siguientes archivos están en uso, pero no existen. Además, las páginas con archivos que no existen están listadas en [[:$1]].",
        "wantedfiletext-nocat": "Los siguientes archivos están en uso, pero no existen. Es posible que algunos de ellos estén almacenados en repositorios externos y se hayan incluido aquí por error; dichas entradas aparecen <del>tachadas</del>.",
        "noemailtext": "Este usuario no ha especificado una dirección de correo electrónico válida.",
        "nowikiemailtext": "Este usuario ha elegido no recibir correos electrónicos de otros usuarios.",
        "emailnotarget": "Nombre de usuario no existente o no válido para el destinatario.",
-       "emailtarget": "Introduce el nombre de usuario del destinatario",
+       "emailtarget": "Escribe el nombre de usuario del destinatario",
        "emailusername": "Nombre de usuario:",
        "emailusernamesubmit": "Enviar",
        "email-legend": "Enviar un correo electrónico a otro usuario de {{SITENAME}}",
        "notvisiblerev": "La última revisión de un usuario diferente ha sido borrada",
        "watchlist-details": "{{PLURAL:$1|$1 página|$1 páginas}} en tu lista de seguimiento, sin contar las de discusión.",
        "wlheader-enotif": "La notificación por correo está activada.",
-       "wlheader-showupdated": "Las páginas modificadas desde su última visita aparecen en '''negrita'''.",
+       "wlheader-showupdated": "Las páginas modificadas desde tu última visita aparecen en <strong>negrita</strong>.",
        "wlnote": "A continuación {{PLURAL:$1|se muestra el último cambio|se muestran los últimos '''$1''' cambios}} en {{PLURAL:$2|la última hora|las últimas '''$2''' horas}} a fecha de $4 $3.",
        "wlshowlast": "Ver los cambios de las últimas $1 horas, $2 días",
        "watchlist-options": "Opciones de la lista de seguimiento",
        "protect-expiring-local": "caduca el $1",
        "protect-expiry-indefinite": "indefinido",
        "protect-cascade": "Protección en cascada - proteger todas las páginas incluidas en ésta.",
-       "protect-cantedit": "No puedes cambiar el nivel de protección porque no tienes permiso para hacer ediciones.",
+       "protect-cantedit": "No puedes cambiar el nivel de protección de esta página porque no tienes permiso para editarla.",
        "protect-othertime": "Especificar caducidad:",
        "protect-othertime-op": "otra (especificar)",
        "protect-existing-expiry": "Fecha de caducidad actual: $2 a las $3",
        "undelete-search-prefix": "Mostrar páginas que empiecen por:",
        "undelete-search-submit": "Buscar",
        "undelete-no-results": "No se encontraron páginas borradas para ese criterio de búsqueda.",
-       "undelete-filename-mismatch": "No se puede restaurar la versión con marca de tiempo $1: No concuerda el nombre de fichero",
-       "undelete-bad-store-key": "No se puede restaurar la versión con marca de tiempo $1: el fichero fue omitido antes del borrado.",
+       "undelete-filename-mismatch": "No se puede restaurar la revisión con marca de tiempo $1: no concuerda el nombre del archivo.",
+       "undelete-bad-store-key": "No se puede restaurar la revisión con marca de tiempo $1: el archivo fue omitido antes del borrado.",
        "undelete-cleanup-error": "Error al borrar el archivo no utilizado \"$1\".",
        "undelete-missing-filearchive": "No se ha podido restaurar el archivo de ID $1 debido a que no está en la base de datos.\nPuede que ya haya sido restaurado.",
        "undelete-error": "Error restaurando la página",
        "immobile-source-page": "Esta página no se puede renombrar.",
        "immobile-target-page": "No se puede trasladar a ese título.",
        "bad-target-model": "El destino deseado utiliza un modelo diferente de contenido. No se puede realizar la conversión de $1 a $2.",
-       "imagenocrossnamespace": "No se puede trasladar el fichero a otro espacio de nombres",
-       "nonfile-cannot-move-to-file": "No es posible trasladar lo que no es un archivo al espacio de nombres de archivo",
+       "imagenocrossnamespace": "No se puede trasladar el archivo a un espacio de nombres que no es para archivos.",
+       "nonfile-cannot-move-to-file": "No es posible trasladar lo que no es un archivo al espacio de nombres de archivos.",
        "imagetypemismatch": "La nueva extensión de archivo no corresponde con su tipo",
-       "imageinvalidfilename": "El nombre del fichero de destino no es válido",
+       "imageinvalidfilename": "El nombre del archivo de destino no es válido.",
        "fix-double-redirects": "Actualizar las redirecciones que apuntan al título original",
        "move-leave-redirect": "Dejar una redirección",
        "protectedpagemovewarning": "'''Advertencia:''' Esta página ha sido bloqueada de tal manera que solamente usuarios con privilegios de administrador puedan trasladarla.\nA continuación se muestra la última entrada de registro para referencia:",
        "thumbnail_dest_directory": "Incapaz de crear el directorio de destino",
        "thumbnail_image-type": "Tipo de imagen no contemplado",
        "thumbnail_gd-library": "Configuración de la librería GD incompleta: falta la función $1",
-       "thumbnail_image-missing": "El fichero parece no existir: $1",
+       "thumbnail_image-missing": "El archivo parece no existir: $1",
        "thumbnail_image-failure-limit": "Ha habido muchos intentos recientes ($1 o más) para representar esta miniatura. Inténtalo de nuevo más tarde.",
        "import": "Importar páginas",
        "importinterwiki": "Importar desde otro wiki",
        "importnosources": "No se definieron wikis de los cuales importar y no está permitido subir directamente el historial.",
        "importnofile": "No se subieron archivos de importación.",
        "importuploaderrorsize": "Falló la carga del archivo de importaciones.\nSu tamaño es superior al máximo permitido.",
-       "importuploaderrorpartial": "Falló la subida del fichero de importación.\nSe subió sólo parcialmente.",
-       "importuploaderrortemp": "Falló la subida del fichero de importación.\nNo hay un directorio temporal.",
+       "importuploaderrorpartial": "Falló la subida del archivo de importación.\nSe subió sólo parcialmente.",
+       "importuploaderrortemp": "Falló la subida del archivo de importación.\nNo hay un directorio temporal.",
        "import-parse-failure": "Error de lectura al importar XML",
        "import-noarticle": "¡No hay páginas para importar!",
        "import-nonewrevisions": "Ninguna revisión fue importada (todas ya estaban presentes o fueron omitido debido a errores).",
        "javascripttest-pagetext-unknownframework": "Marco de pruebas desconocido \"$1\".",
        "javascripttest-pagetext-unknownaction": "La acción «$1» es desconocida.",
        "javascripttest-pagetext-frameworks": "Por favor, seleccione uno de los marcos de pruebas siguientes: $1",
-       "javascripttest-pagetext-skins": "Elija un aspecto (skin) para ejecutar las pruebas:",
-       "javascripttest-qunit-intro": "Consulte la [$1 documentación sobre las pruebas] en mediawiki.org.",
+       "javascripttest-pagetext-skins": "Elige una apariencia con la que ejecutar las pruebas:",
+       "javascripttest-qunit-intro": "Consulta la [$1 documentación sobre las pruebas] en mediawiki.org.",
        "tooltip-pt-userpage": "Tu página de {{gender:|usuario|usuaria}}",
        "tooltip-pt-anonuserpage": "La página de usuario de la IP desde la que editas",
        "tooltip-pt-mytalk": "Tu página de discusión",
        "filedelete-archive-read-only": "El servidor web no logra escribir en el directorio archivo \"$1\".",
        "previousdiff": "← Edición anterior",
        "nextdiff": "Edición siguiente →",
-       "mediawarning": "'''Atención''': Este fichero puede contener código malicioso.\nEjecutarlo podría comprometer la seguridad de su equipo.",
+       "mediawarning": "<strong>Advertencia:</strong> este archivo puede contener código malicioso.\nEjecutarlo podría comprometer la seguridad de tu equipo.",
        "imagemaxsize": "Límite de tamaño de imagen:<br />''(para páginas de descripción de archivo)''",
        "thumbsize": "Tamaño de las vistas en miniatura:",
        "widthheight": "$1 × $2",
        "file-no-thumb-animation": "'''Nota: debido a limitaciones técnicas, las miniaturas de este archivo no están animadas.'''",
        "file-no-thumb-animation-gif": "'''Nota: Debido a limitaciones técnicas, las miniaturas de imágenes GIF de alta resolución como esta no están animadas.'''",
        "newimages": "Galería de imágenes nuevas",
-       "imagelisttext": "Debajo hay una lista de '''$1''' {{PLURAL:$1|imagen|imágenes}} ordenadas $2.",
+       "imagelisttext": "Debajo hay una lista de <strong>$1</strong> {{PLURAL:$1|archivo ordenado|archivos ordenados}} $2.",
        "newimages-summary": "Esta página especial muestra una galería de los últimos archivos subidos.",
-       "newimages-legend": "Nombre del fichero",
-       "newimages-label": "Nombre del fichero (o una parte):",
+       "newimages-legend": "Filtro",
+       "newimages-label": "Nombre del archivo (o una parte):",
        "newimages-showbots": "Mostrar cargas de bots",
        "noimages": "No hay nada que ver.",
        "ilsubmit": "Buscar",
        "bydate": "por fecha",
-       "sp-newimages-showfrom": "Mostrar nuevas imágenes empezando por $2, $1",
+       "sp-newimages-showfrom": "Mostrar archivos nuevos empezando desde $2, $1",
        "seconds-abbrev": "$1s",
        "minutes-abbrev": "$1m",
        "hours-abbrev": "$1h",
        "exif-gpsspeed": "Velocidad del receptor GPS",
        "exif-gpstrackref": "Referencia para la dirección del movimiento",
        "exif-gpstrack": "Dirección del movimiento",
-       "exif-gpsimgdirectionref": "Referencia de la dirección de imágen",
+       "exif-gpsimgdirectionref": "Referencia para la dirección de la imagen",
        "exif-gpsimgdirection": "Dirección de imagen",
        "exif-gpsmapdatum": "Utilizados datos de medición geodésica",
        "exif-gpsdestlatituderef": "Referencia para la latitud del destino",
        "version-license": "Licencia de MediaWiki",
        "version-ext-license": "Licencia",
        "version-ext-colheader-name": "Extensión",
-       "version-skin-colheader-name": "Tema",
+       "version-skin-colheader-name": "Apariencia",
        "version-ext-colheader-version": "Versión",
        "version-ext-colheader-license": "Licencia",
        "version-ext-colheader-description": "Descripción",
        "version-libraries-authors": "Autores",
        "redirect": "Redirigir por archivo, usuario, página o ID de revisión",
        "redirect-legend": "Redirigir a un archivo o página",
-       "redirect-summary": "Esta página especial redirige a un fichero (dado un nombre de fichero), a una página (dado un identificador de revisión o de página) o a una página de usuario (dado un identificador numérico de usuario). Uso: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
+       "redirect-summary": "Esta página especial redirige a un archivo (dado un nombre), a una página (dado un identificador de revisión o de página) o a una página de usuario (dado un identificador numérico de usuario). Uso: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] o [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Ir",
        "redirect-lookup": "Buscar:",
        "redirect-value": "Valor:",
        "redirect-user": "Id. del usuario",
        "redirect-page": "Identificador de la página",
        "redirect-revision": "Revisión de página",
-       "redirect-file": "Nombre de fichero",
+       "redirect-file": "Nombre de archivo",
        "redirect-not-exists": "No se encontró el valor",
        "fileduplicatesearch": "Búsqueda de archivos duplicados",
        "fileduplicatesearch-summary": "Búsqueda de archivos duplicados en base a su valor hash.",
        "fileduplicatesearch-legend": "Busca duplicados",
-       "fileduplicatesearch-filename": "Nombre del fichero:",
+       "fileduplicatesearch-filename": "Nombre de archivo:",
        "fileduplicatesearch-submit": "Buscar",
        "fileduplicatesearch-info": "$1 × $2 píxeles<br />Tamaño: $3<br />Tipo MIME: $4",
        "fileduplicatesearch-result-1": "El archivo «$1» no tiene duplicados idénticos.",
        "specialpages-group-spam": "Herramientas anti-SPAM",
        "specialpages-group-developer": "Herramientas para desarrolladores",
        "blankpage": "Página vacía",
-       "intentionallyblankpage": "Esta pagina está en blanco de manera intencionada.",
+       "intentionallyblankpage": "Esta página está en blanco de manera intencionada.",
        "external_image_whitelist": " #Deja esta línea exactamente como está<pre>\n#Colocar fragmentos de expresiones regulares (sólo la parte que va entre los //) debajo\n#Estos coincidirán con los URLs de las imágenes externas (hotlinked)\n#Aquellos que coincidan serán mostrados como imágenes, de lo contrario solamente un vínculo a la imagen será mostrada\n#Las líneas que empiezan por «#» se consideran comentarios\n#Esta es insensible a las mayúsculas\n\n#Colocar todos los fragmentos regex arriba de esta línea. Deja esta línea exactamente como está</pre>",
        "tags": "Etiquetas de cambios",
        "tag-filter": "Filtro de [[Special:Tags|etiquetas]]:",
        "htmlform-title-badnamespace": "[[:$1]] no está en el espacio de nombres \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" no es un título de página que se pueda crear",
        "htmlform-title-not-exists": "[[:$1]] no existe.",
+       "htmlform-user-not-exists": "<strong>$1</strong> no existe.",
+       "htmlform-user-not-valid": "<strong>$1</strong> no es un nombre de usuario válido.",
        "sqlite-has-fts": "$1 con soporte para búsqueda de texto completo",
        "sqlite-no-fts": "$1 sin soporte para búsqueda de texto completo",
        "logentry-delete-delete": "$1 {{GENDER:$2|borró}} la página «$3»",
        "duration-decades": "$1 {{PLURAL:$1|década|décadas}}",
        "duration-centuries": "$1 {{PLURAL:$1|siglo|siglos}}",
        "duration-millennia": "$1 {{PLURAL:$1|milenio|milenios}}",
-       "rotate-comment": "Imagen girada por $1 {{PLURAL:$1|grado|grados}} en el sentido de las agujas del reloj",
+       "rotate-comment": "Imagen girada $1 {{PLURAL:$1|grado|grados}} en sentido horario",
        "limitreport-title": "Datos de perfilado del analizador:",
        "limitreport-cputime": "Tiempo de uso de CPU",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|segundo|segundos}}",
index 6aabe74..ff936ad 100644 (file)
        "readonlywarning": "'''Hoiatus: Andmebaas on lukustatud hooldustöödeks, nii et praegu ei saa parandusi salvestada.'''\nVõid teksti hilisemaks kasutamiseks alles hoida tekstifailina.\n\nAdministraator, kes andmebaasi lukustas, andis järgmise selgituse: $1",
        "protectedpagewarning": "'''Hoiatus: See lehekülg on lukustatud, nii et ainult administraatori õigustega kasutajad saavad seda redigeerida.'''\nAllpool on toodud uusim logisissekanne:",
        "semiprotectedpagewarning": "'''Märkus:''' See lehekülg on lukustatud, nii et üksnes registreeritud kasutajad saavad seda muuta.\nAllpool on toodud uusim logisissekanne:",
-       "cascadeprotectedwarning": "'''Hoiatus:''' See lehekülg on nii lukustatud, et ainult administraatori õigustega kasutajad saavad seda redigeerida, sest lehekülg on osa {{PLURAL:$1|järgmisest|järgmisest}} kaskaadkaitsega {{PLURAL:$1|leheküljest|lehekülgedest}}:",
+       "cascadeprotectedwarning": "<strong>Hoiatus:</strong> See lehekülg on nii lukustatud, et ainult administraatori õigustega kasutajad saavad seda redigeerida, sest lehekülg on osa {{PLURAL:$1|järgmisest|järgmistest}} kaskaadkaitsega {{PLURAL:$1|leheküljest|lehekülgedest}}:",
        "titleprotectedwarning": "'''Hoiatus: See lehekülg on nii lukustatud, et selle loomiseks on tarvis [[Special:ListGroupRights|eriõigusi]].'''\nAllpool on toodud uusim logisissekanne:",
        "templatesused": "Sellel leheküljel on kasutusel {{PLURAL:$1|järgmine mall|järgmised mallid}}:",
        "templatesusedpreview": "Eelvaates {{PLURAL:$1|kasutatav mall|kasutatavad mallid}}:",
        "rollback-success": "Tühistati muudatused, mille tegi $1;\npöörduti tagasi viimasele muudatusele, mille tegi $2.",
        "sessionfailure-title": "Seansiviga",
        "sessionfailure": "Sinu sisselogimisseansiga näib probleem olevat.\nSee toiming on seansiärandamise vastase ettevaatusabinõuna tühistatud.\nMine tagasi eelmisele leheküljele ja taaslaadi see, seejärel proovi uuesti.",
+       "changecontentmodel": "Lehekülje sisumudeli muutmine",
+       "changecontentmodel-legend": "Sisumudeli muutmine",
+       "changecontentmodel-title-label": "Lehekülje pealkiri",
+       "changecontentmodel-model-label": "Uus sisumudel",
+       "changecontentmodel-reason-label": "Põhjus:",
+       "changecontentmodel-success-title": "Sisumudel on muudetud",
+       "changecontentmodel-success-text": "Lehekülje [[:$1]] sisumudel on muudetud.",
+       "changecontentmodel-cannot-convert": "Lehekülje [[:$1]] sisumudelit ei saa teisendada tüübiks $2.",
+       "changecontentmodel-title-cantexist": "Lehekülg ei saa olla pealkirja \"$1\" all.",
+       "changecontentmodel-nodirectediting": "Sisumudel $1 ei võimalda otseredigeerimist.",
+       "log-name-contentmodel": "Sisumudeli muutmislogi",
+       "log-description-contentmodel": "Lehekülje sisumudelite muutmisega seotud sündmused",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|muutis}} lehekülje \"$3\" sisumudeli: \"$4\" → \"$5\"",
+       "logentry-contentmodel-change-revertlink": "võta tagasi",
+       "logentry-contentmodel-change-revert": "tagasi võetud",
        "protectlogpage": "Kaitsmislogi",
        "protectlogtext": "Allpool on loetletud lehekülgede kaitsetasemete muutmised. Praegu kaitstud lehekülgi vaata [[Special:ProtectedPages|kaitstud lehtede loetelust]].",
        "protectedarticle": "kaitses lehekülje \"[[$1]]\"",
        "tooltip-pt-logout": "Logi välja",
        "tooltip-pt-createaccount": "See pole küll kohustuslik, aga sul tasub konto luua ja sisse logida.",
        "tooltip-ca-talk": "Arutelu selle lehekülje sisu kohta",
-       "tooltip-ca-edit": "Sa saad seda lehekülge muuta. Palun kasuta enne salvestamist eelvaadet.",
+       "tooltip-ca-edit": "Muuda seda lehekülge",
        "tooltip-ca-addsection": "Lisa uus alaosa",
        "tooltip-ca-viewsource": "See lehekülg on kaitstud.\nSaad vaadata selle lähteteksti.",
        "tooltip-ca-history": "Selle lehekülje varasemad redaktsioonid",
        "pageinfo-robot-index": "Lubatud",
        "pageinfo-robot-noindex": "Keelatud",
        "pageinfo-watchers": "Lehekülje jälgijate arv",
+       "pageinfo-visiting-watchers": "Viimaseid muudatusi külastanud jälgijate arv",
        "pageinfo-few-watchers": "Alla {{PLURAL:$1|ühe jälgija|$1 jälgija}}",
+       "pageinfo-few-visiting-watchers": "Pole kindel, kas jälgijatest keegi külastab viimaseid muudatusi.",
        "pageinfo-redirects-name": "Sellele leheküljele suunatud lehekülgi",
        "pageinfo-subpages-name": "Selle lehekülje alamlehekülgi",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|ümbersuunamine|ümbersuunamist}}; $3 {{PLURAL:$3|mitteümbersuunamine|mitteümbersuunamist}})",
        "htmlform-cloner-create": "Lisa veel",
        "htmlform-cloner-delete": "Eemalda",
        "htmlform-cloner-required": "Vähemalt üks väärtus on nõutav.",
+       "htmlform-title-badnamespace": "[[:$1]] pole nimeruumis \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "Pealkirja \"$1\" all ei saa lehekülge alustada.",
+       "htmlform-title-not-exists": "Lehekülge [[:$1]] pole olemas.",
+       "htmlform-user-not-exists": "Kasutajat <strong>$1</strong> pole olemas.",
+       "htmlform-user-not-valid": "<strong>$1</strong> pole sobiv kasutajanimi.",
        "sqlite-has-fts": "$1 koos täistekstiotsingu toega",
        "sqlite-no-fts": "$1 ilma täistekstiotsingu toeta",
        "logentry-delete-delete": "$1 {{GENDER:$2|kustutas}} lehekülje $3",
index aafc46d..12bc1d8 100644 (file)
        "prefs-rc": "Azken aldaketak",
        "prefs-watchlist": "Jarraipen zerrenda",
        "prefs-editwatchlist": "Aldatu jarraipen-zerrenda",
+       "prefs-editwatchlist-label": "Editatu sarrerak zure jarraipen zerrendan:",
+       "prefs-editwatchlist-edit": "Zure jarraipen zerrendako tituluak ikusi eta kendu",
        "prefs-editwatchlist-clear": "Garbitu zure jarraipen-zerrenda",
        "prefs-watchlist-days": "Jarraipen zerrendan erakutsi beharreko egun kopurua:",
        "prefs-watchlist-days-max": "Gehienez $1 {{PLURAL:$1|egun|egun}}",
        "action-viewmywatchlist": "zure jarraipen zerrenda ikusi",
        "action-viewmyprivateinfo": "zure informazio pribatua ikusi",
        "action-editmyprivateinfo": "zure informazio pribatua aldatu",
+       "action-managechangetags": "Etiketak sortu eta ezabatu datu basean",
        "nchanges": "{{PLURAL:$1|aldaketa 1|$1 aldaketa}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|azkeneko bisitatik}}",
        "enhancedrc-history": "historia",
        "randomincategory-invalidcategory": "\"$1\" ez da kategoria izen baliagarri bat.",
        "randomincategory-nopages": "Ez dago orrialderik [[:Category:$1|$1]] kategorian.",
        "randomincategory-category": "Kategoria:",
+       "randomincategory-legend": "Kategoriako ausazko orrialdea",
        "randomincategory-submit": "Joan",
        "randomredirect": "Ausazko birbideratzea",
        "randomredirect-nopages": "Ez dago birzuzenketarik \"$1\" izen-tartean.",
        "listgrouprights-removegroup-all": "Talde guztiak kendu daitezke",
        "listgrouprights-addgroup-self-all": "Talde guztiak norbere kontura gehitu",
        "listgrouprights-removegroup-self-all": "Talde guztiak norbere kontutik ezabatu",
+       "listgrouprights-namespaceprotection-namespace": "Izen-tartea",
+       "trackingcategories-disabled": "Kategoria desgaitua dago",
        "mailnologin": "Bidalketa helbiderik ez",
        "mailnologintext": "Beste erabiltzaileei e-posta mezuak bidaltzeko [[Special:UserLogin|saioa hasi]] eta baliozko e-posta helbidea behar duzu izan zure [[Special:Preferences|hobespenetan]].",
        "emailuser": "Erabiltzaile honi e-posta bidali",
        "emailccsubject": "Zure mezuaren kopia $1(r)i: $2",
        "emailsent": "Mezua bidali egin da",
        "emailsenttext": "Zure e-posta mezua bidali egin da.",
-       "emailuserfooter": "E-posta hau $1(e)k bidali dio $2(r)i {{SITENAME}}ko \"E-posta bidali\" funtzioa erabiliz.",
+       "emailuserfooter": "E-posta hau $1(e)k bidali dio $2(r)i {{SITENAME}}ko \"{{int:emailpage}}\" funtzioa erabiliz.",
        "usermessage-summary": "Sistema mezua uzten.",
        "usermessage-editor": "Sistemako mezularia",
        "watchlist": "Jarraipen zerrenda",
        "mywatchlist": "Jarraipen zerrenda",
        "watchlistfor2": "$1 ($2)",
        "nowatchlist": "Zure jarraipen zerrenda hutsik dago.",
-       "watchlistanontext": "Mesedez $1 zure jarraipen zerrendako orrialdeak ikusi eta aldatu ahal izateko.",
+       "watchlistanontext": "Mesedez saioa hasi zure jarraipen zerrendako orrialdeak ikusi eta aldatu ahal izateko.",
        "watchnologin": "Saioa hasi gabe",
        "addwatch": "Jarraipen zerrendara gehitu",
        "addedwatchtext": "«[[:$1]]» orria zure [[Special:Watchlist|jarraipen zerrendara]] erantsi da. \n\nOrri honetan aurrerantzean egindako aldaketak zerrenda horretan agertuko dira.",
+       "addedwatchtext-short": "$1 orria zure jarraipen zerrendara gehitu da.",
        "removewatch": "Kendu zure jarraipen zerrendatik",
        "removedwatchtext": "\"[[:$1]]\" orrialdea zure [[Special:Watchlist|jarraipen zerrendatik]] kendu da.",
+       "removedwatchtext-short": "$1 orria zure jarraipen zerrendatik ezabatu da.",
        "watch": "Jarraitu",
        "watchthispage": "Orrialde hau jarraitu",
        "unwatch": "Ez jarraitu",
        "sessionfailure-title": "Saio-akatsa",
        "sessionfailure": "Badirudi saioarekin arazoren bat dagoela; bandalismoak saihesteko ekintza hau ezeztatu egin da. Mesedez, nabigatzaileko \"atzera\" botoian klik egin, hona ekarri zaituen orrialde hori berriz kargatu, eta saiatu berriz.",
        "changecontentmodel-title-label": "Orriaren izenburua",
+       "logentry-contentmodel-change-revertlink": "desegin",
+       "logentry-contentmodel-change-revert": "desegin",
        "protectlogpage": "Babes erregistroa",
        "protectlogtext": "Orri-babesteen zerrenda ageri da jarraian.\nIkus [[Special:ProtectedPages|orri babestuen zerrenda]], orain indarrean dauden orri babesen zerrenda ikusteko.",
        "protectedarticle": "\"[[$1]]\" babestu da\"",
        "redirect-lookup": "Ikuskatu:",
        "redirect-value": "Balioa:",
        "redirect-user": "Erabiltzailearen identifikazioa (ID):",
+       "redirect-page": "Orriaren IDa",
        "redirect-revision": "Orrialdearen berrikuspena",
        "redirect-file": "Fitxategiaren izena",
        "redirect-not-exists": "Ez da baliorik aurkitu",
        "tags-tag": "Etiketaren izena",
        "tags-display-header": "Aldaketa zerrenden itxura",
        "tags-description-header": "Esanahiaren deskribapen osoa",
+       "tags-source-header": "Iturria",
        "tags-active-header": "Aktiboa?",
        "tags-hitcount-header": "Etiketatutako aldaketak",
        "tags-actions-header": "Ekintzak",
        "tags-edit": "aldatu",
        "tags-delete": "ezabatu",
        "tags-activate": "aktibatu",
+       "tags-deactivate": "desaktibatu",
        "tags-hitcount": "$1 {{PLURAL:$1|aldaketa|aldaketa}}",
+       "tags-create-heading": "Etiketa berria sortu",
+       "tags-create-tag-name": "Etiketaren izena:",
        "tags-create-reason": "Arrazoia:",
        "tags-create-submit": "Sortu",
+       "tags-delete-title": "Etiketa ezabatu",
        "tags-delete-reason": "Arrazoia:",
        "tags-activate-reason": "Arrazoia:",
        "tags-activate-submit": "Aktibatu",
        "tags-deactivate-reason": "Arrazoia:",
+       "tags-deactivate-submit": "Desaktibatu",
        "tags-edit-new-tags": "Etiketa berriak:",
        "tags-edit-add": "Gehitu etiketa hauek:",
        "tags-edit-remove": "Kendu etiketa hauek:",
        "rightsnone": "(bat ere ez)",
        "revdelete-summary": "aldaketaren laburpena",
        "feedback-adding": "Orriari feedbacka gehitzen...",
+       "feedback-back": "Atzera",
        "feedback-bugnew": "Txekeatu dut. Bug berria bidaliko",
        "feedback-cancel": "Utzi",
        "feedback-close": "Egina",
+       "feedback-error-title": "Errorea",
        "feedback-error1": "Akatsa: APIaren emaitza ez ezagunak",
        "feedback-error2": "Akatsa: Aldaketa ez da egin",
        "feedback-error3": "Akatsa: APIaren erantzunik gabe",
        "feedback-message": "Mezua:",
        "feedback-subject": "Gaia:",
        "feedback-submit": "Bidali",
+       "feedback-thanks-title": "Eskerrik asko!",
        "searchsuggest-search": "Bilatu",
        "searchsuggest-containing": "edukian...",
        "api-error-badaccess-groups": "Ez duzu baimendik fitxategi hauek wiki honetara igotzeko.",
        "expand_templates_remove_nowiki": "Ezabatu <nowiki> etiketen emaitzak",
        "expand_templates_generate_xml": "Erakutsi XML parse zuhaitza",
        "expand_templates_preview": "Aurreikusi",
+       "pagelanguage": "Orriaren hizkuntza aukeratu",
        "pagelang-language": "Hizkuntza",
+       "pagelang-use-default": "Hizkuntza lehenetsia erabili",
        "pagelang-select-lang": "Hizkuntza aukeratu",
        "right-pagelang": "Aldatu orrialdearen hizkuntza",
        "action-pagelang": "orrialdearen hizkuntza aldatu",
index 9967cff..5afd8b3 100644 (file)
        "htmlform-title-badnamespace": "[[:$1]] در فضای نام \"{{ns:$2}}\"  موجود نیست.",
        "htmlform-title-not-creatable": "\"$1\" عنوان قابل ایجاد نیست",
        "htmlform-title-not-exists": "[[:$1]] وجود ندارد.",
+       "htmlform-user-not-exists": "<strong>$1</strong> وجود ندارد.",
+       "htmlform-user-not-valid": "حساب کاربری <strong>$1</strong> معتبر نیست.",
        "sqlite-has-fts": "$1 با پشتیبانی از جستجو در متن کامل",
        "sqlite-no-fts": "$1 بدون پشتیبانی از جستجو در متن کامل",
        "logentry-delete-delete": "$1 صفحهٔ $3 را {{GENDER:$2|حذف کرد}}",
index cb91030..ac78994 100644 (file)
        "searchrelated": "samankaltainen",
        "searchall": "kaikki",
        "showingresults": "Alla on vain {{PLURAL:$1|<strong>1</strong> hakutulos|<strong>$1</strong> hakutulosta}} alkaen tuloksesta nro <strong>$2</strong>.",
-       "showingresultsinrange": "Alla näytetään {{PLURAL:$1|<strong>1</strong> tulos|<strong>$1</strong> tulosta}} väliltä <strong>$2</strong> – <strong>$3</strong>.",
+       "showingresultsinrange": "Alla näytetään {{PLURAL:$1|<strong>1</strong> tulos|<strong>$1</strong> tulosta}} väliltä <strong>$2</strong><strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Tulos <strong>$1</strong> enimmäismäärästä <strong>$3</strong>|Tulokset <strong>$1 – $2</strong> enimmäismäärästä <strong>$3</strong>}}",
        "search-nonefound": "Hakusi ei tuottanut tulosta.",
        "powersearch-legend": "Laajennettu haku",
        "changecontentmodel-nodirectediting": "Sisältömalli $1 ei tue suoraa muokkaamista",
        "log-name-contentmodel": "Sisältömallin muutosloki",
        "log-description-contentmodel": "Tapahtumat, jotka liittyvät sivun sisältömalleihin",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|muutti}} sivun $3 sisältömallia muodosta \"$4\" muotoon \"$5\"",
        "logentry-contentmodel-change-revertlink": "kumoa",
        "logentry-contentmodel-change-revert": "kumottu",
        "protectlogpage": "Suojausloki",
        "htmlform-title-badnamespace": "Sivu [[:$1]] ei ole nimiavaruudessa ”{{ns:$2}}”.",
        "htmlform-title-not-creatable": "”$1” ei kelpaa sivun nimeksi.",
        "htmlform-title-not-exists": "Sivua [[:$1]] ei ole olemassa.",
+       "htmlform-user-not-valid": "<strong>$1</strong> ei ole kelvollinen käyttäjänimi.",
        "sqlite-has-fts": "$1, jossa on tuki kokotekstihaulle",
        "sqlite-no-fts": "$1, jossa ei ole tukea kokotekstihaulle",
        "logentry-delete-delete": "$1 {{GENDER:$2|poisti}} sivun $3",
index 6675eeb..d6ab4d8 100644 (file)
        "pageinfo-robot-index": "Autorisée",
        "pageinfo-robot-noindex": "Interdite",
        "pageinfo-watchers": "Nombre de contributeurs ayant la page dans leur liste de suivi",
-       "pageinfo-visiting-watchers": "Nombre d’observateurs de la page ayant consulté récemment les modifications récentes de la page",
+       "pageinfo-visiting-watchers": "Nombre d’observateurs de la page ayant consulté les modifications récentes de la page",
        "pageinfo-few-watchers": "Moins de $1 {{PLURAL:$1|observateur|observateurs}}",
        "pageinfo-few-visiting-watchers": "Il peut ou non y avoir un observateur regardant les modifications récentes",
        "pageinfo-redirects-name": "Nombre de redirections vers cette page",
        "htmlform-title-badnamespace": "[[:$1]] n'est pas dans l'espace de noms \"{{ns:$2}}\" .",
        "htmlform-title-not-creatable": "\"$1\" n'est pas un titre de page réalisable",
        "htmlform-title-not-exists": "[[:$1]] n’existe pas",
+       "htmlform-user-not-exists": "<strong>$1</strong> n’existe pas.",
+       "htmlform-user-not-valid": "<strong>$1</strong> n’est pas un nom d’utilisateur valide.",
        "sqlite-has-fts": "$1 avec recherche en texte intégral supportée",
        "sqlite-no-fts": "$1 sans recherche en texte intégral supportée",
        "logentry-delete-delete": "$1 {{GENDER:$2|a supprimé}} la page $3",
index 8b75289..b445673 100644 (file)
        "pt-userlogout": "Ufmelde",
        "php-mail-error-unknown": "Ünbekäänd feeler mä det funktjuun mail() faan PHP.",
        "user-mail-no-addy": "Küd nian e-mail schüür saner e-mail-adres.",
-       "user-mail-no-body": "Dü wulst en e-mail saner tekst wechsjüür.",
+       "user-mail-no-body": "Dü wulst en e-mail saner tekst wechschüür.",
        "changepassword": "Paaswurd feranre",
        "resetpass_announce": "Am det uunmeldin uftuslütjen, skel dü en nei paaswurd iindu.",
        "resetpass_header": "Paaswurd feranre",
        "emailccme": "Schüür mi en kopii faan det e-mail.",
        "emailccsubject": "Kopii faan din mädialang tu $1: $2",
        "emailsent": "E-mail as wechschüürd wurden",
-       "emailsenttext": "Din e-mail as wechsjüürd wurden.",
+       "emailsenttext": "Din e-mail as wechschüürd wurden.",
        "emailuserfooter": "Detdiar e-mail as faan „$1“ tu „$2“ auer det funktjuun „{{int:emailpage}}“ bi {{SITENAME}} schüürd wurden.",
        "usermessage-summary": "Süsteemnooracht seekert.",
        "usermessage-editor": "Süsteemnoorachten siinst",
index 3533043..eb78841 100644 (file)
        "dellogpage": "काडून उडयिल्ल्यांची वळेरी",
        "rollbacklink": "फाटीं घेयात",
        "rollbacklinkcount": "$1 {{PLURAL:$1|संपादन}} फाटीं घेयात",
+       "changecontentmodel-title-label": "पानाचो माथाळो",
+       "changecontentmodel-reason-label": "Reason:कारण",
        "protectlogpage": "सुरक्षितेचें सोत्र",
        "protectedarticle": "राखिल्ले\"[[$1]]\"",
        "restriction-edit": "संस्करण",
        "specialpages": "खाशेलीं पानां",
        "tag-filter": "[[Special:Tags|कुर्वेचीट]] गाळणो:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|कुरवेचीट|कुरवेचीटी}}]]: $2)",
+       "htmlform-title-not-exists": "[[:$1]] अस्तित्वांत ना.",
        "logentry-delete-delete": "$1 {{GENDER:$2|काडून उडयल्ले पान}} $3",
        "logentry-move-move": "$1 न $3 पानाचेर $4 {{GENDER:$2|हालयला}}",
        "logentry-newusers-create": "उपयोगकत्याचें $1 {{GENDER:$2|तयार केलें}}",
index 656f423..1093f27 100644 (file)
        "htmlform-title-badnamespace": "[[:$1]] אינו במרחב השם \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" אינו שם של דף שאפשר ליצור",
        "htmlform-title-not-exists": "[[:$1]] אינו קיים.",
+       "htmlform-user-not-exists": "<strong>$1</strong> אינו קיים.",
+       "htmlform-user-not-valid": "<strong>$1</strong> אינו שם משתמש תקין.",
        "sqlite-has-fts": "$1 עם תמיכה בחיפוש בטקסט מלא",
        "sqlite-no-fts": "$1 ללא תמיכה בחיפוש בטקסט מלא",
        "logentry-delete-delete": "$1 {{GENDER:$2|מחק|מחקה}} את הדף $3&rlm;",
index 3548dad..bb5dc9b 100644 (file)
        "disclaimers": "Ազատում պատասխանատվությունից",
        "disclaimerpage": "Project:Ազատում պատասխանատվությունից",
        "edithelp": "Խմբագրման ուղեցույց",
+       "helppage-top-gethelp": "Օգնություն",
        "mainpage": "Գլխավոր էջ",
        "mainpage-description": "Գլխավոր էջ",
        "policy-url": "Project:Կանոնակարգ",
        "showhideselectedversions": "Ցուցադրել/թաքցնել ընտրված խմբագրումները",
        "editundo": "հետ շրջել",
        "diff-empty": "(Տարբերություն չկա)",
+       "diff-multi-sameuser": "(Միևնույն մասնակցի {{PLURAL:$1|մեկ միջանկյալ տարբերակ|$1 միջանկյալ տարբերակներ}} թաքցրված է)",
        "searchresults": "Որոնման արդյունքներ",
        "searchresults-title": "«$1»-ի որոնման արդյունքներ",
        "titlematches": "Համընկած հոդվածների անվանումներ",
        "right-suppressredirect": "Էջը վերանավանելիս վերահղում չթողնել",
        "right-upload": "Նիշքերի բեռնում",
        "right-upload_by_url": "Բեռնել նիշքեր ինտերնետային հասցեից",
+       "right-writeapi": "API գրի օգտագործումը",
        "right-delete": "Էջերի ջնջում",
        "right-rollback": "Արագ հետ գլորել տվյալ էջը վերջին անգամ խմբագրած մասնակցի խմբագրումները",
        "newuserlogpage": "Մասնակիցների գրանցման տեղեկամատյան",
        "logentry-newusers-newusers": "$1 մասնակիցը ստեղծեց նոր հաշիվ",
        "logentry-newusers-create": "Ստեղծվեց $1 մասնակցի հաշիվ",
        "logentry-newusers-create2": "$1 Ստեղծեց նոր հաշիվ $3",
+       "logentry-upload-upload": "$1 {{GENDER:$2|ներբեռնել է}} $3",
        "rightsnone": "(ոչ մի)",
        "feedback-cancel": "Բեկանել",
        "feedback-close": "Արված է",
index 0787563..d00739c 100644 (file)
        "readonlywarning": "'''Attention: Le base de datos ha essite blocate pro mantenentia. Tu non pote salveguardar tu modificationes in iste momento.'''\nNos recommenda copiar-e-collar le texto in un file e salveguardar lo pro plus tarde.\n\nLe administrator qui ha blocate le base de datos ha fornite iste explication: $1",
        "protectedpagewarning": "'''Attention:  Iste pagina ha essite protegite de sorta que solmente usatores con privilegios de administrator pote modificar lo.''' Le ultime entrata del registro es fornite hic infra pro referentia:",
        "semiprotectedpagewarning": "'''Nota:''' Iste pagina ha essite protegite de maniera que solmente usatores registrate pote modificar lo. Le ultime entrata del registro es fornite hic infra pro referentia:",
-       "cascadeprotectedwarning": "'''Attention:''' Iste pagina ha essite protegite de maniera que solmente administratores pote modificar lo, proque illo es includite in le protection in cascada del sequente {{PLURAL:$1|pagina|paginas}}:",
+       "cascadeprotectedwarning": "<strong>Attention:</strong> Iste pagina ha essite protegite de maniera que solmente usatores con privilegios de administrator pote modificar lo, perque illo es transcludite in le sequente {{PLURAL:$1|pagina|paginas}} protegite in cascada:",
        "titleprotectedwarning": "'''Attention:  Iste pagina ha essite protegite de maniera que [[Special:ListGroupRights|permissiones specific]] es requirite pro crear lo.''' Le ultime entrata del registro es fornite hic infra pro referentia:",
        "templatesused": "{{PLURAL:$1|Patrono|Patronos}} usate in iste pagina:",
        "templatesusedpreview": "{{PLURAL:$1|Patrono|Patronos}} usate in iste previsualisation:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objecto vacue",
        "content-json-empty-array": "Array vacue",
+       "duplicate-args-warning": "<strong>Attention:</strong> [[:$1]] appella [[:$2]] con plure valores pro le parametro \"$3\". Solmente le ultime valor fornite essera usate.",
        "duplicate-args-category": "Paginas que usa parametros duplicate in appellos de patrono",
        "duplicate-args-category-desc": "Le pagina contine appellos de patrono que usa duplicatos de parametros, como per exemplo <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Attention: Iste pagina contine troppo de appellos costose al functiones del analysator syntactic.\n\nIllo debe haber minus de $2 {{PLURAL:$2|appello|appellos}}, sed al momento ha $1 {{PLURAL:$1|appello|appellos}}.",
        "right-sendemail": "Inviar e-mail a altere usatores",
        "right-passwordreset": "Vider le e-mails pro reinitialisar le contrasigno",
        "right-managechangetags": "Crear e deler [[Special:Tags|etiquettas]] in le base de datos",
+       "right-applychangetags": "Applicar [[Special:Tags|etiquettas]] al proprie modificationes",
+       "right-changetags": "Adder e remover qualcunque [[Special:Tags|etiquettas]] sur individual versiones e entratas de registro",
        "newuserlogpage": "Registro de creation de usatores",
        "newuserlogpagetext": "Isto es un registro de creation de usatores.",
        "rightslog": "Registro de derectos de usator",
        "action-editmyprivateinfo": "modificar le proprie information private",
        "action-editcontentmodel": "modificar le modello de contento de un pagina",
        "action-managechangetags": "crear e deler etiquettas in le base de datos",
+       "action-applychangetags": "applicar etiquettas al proprie modificationes",
+       "action-changetags": "adder e remover qualcunque etiquettas sur individual versiones e entratas de registro",
        "nchanges": "$1 {{PLURAL:$1|modification|modificationes}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde le ultime visita}}",
        "enhancedrc-history": "historia",
index 215c489..8c07242 100644 (file)
@@ -11,7 +11,8 @@
                        "Renan",
                        "Valodnieks",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Srdjan m"
                ]
        },
        "tog-underline": "Ultracatenun:",
        "timezoneregion-europe": "Europe",
        "timezoneregion-indian": "Ocean Indian",
        "timezoneregion-pacific": "Ocean Pacific",
-       "youremail": "E-mail:",
+       "youremail": "Adresa e-pošte:",
        "username": "Nómine de usator:",
        "yourrealname": "Nómine real:",
        "yourlanguage": "Lingue:",
index 998070d..18d6d60 100644 (file)
        "protectedinterface": "Daytoy a panid ket mangited iti testo ti interface para iti sopwer iti daytoy a wiki, ken nasalakniban tapno mapawilan ti panag-abuso.\nTi aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
        "editinginterface": "<strong>Ballaag:</strong> Ur-urnosem ti maysa a panid a maar-aramat a mangted iti testo ti interface para iti sopwer.\nDagiti panagsukat iti daytoy a panid ket maarigan ti langa ti interface ti agar-aramat para kadagiti sabali nga agar-aramat iti daytoy a wiki.",
        "translateinterface": "Ti aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
-       "cascadeprotected": "Daytoy a panid ket nasalaknibanen para iti panag-urnos ngamin ket nairaman kadagiti sumaganad {{PLURAL:$1|a panid, a|a pampanid, a}} nasalakniban iti nalukatan a pagpilian ti \"sariap\":\n$2",
+       "cascadeprotected": "Daytoy a panid ket nasalaknibanen manipud iti panagurnos gapu ta nailak-am {{PLURAL:$1|iti sumaganad a panid|kadagiti sumaganad a panid}} a nasalakniban iti nalukatan a pagpilian ti \"sariap\":\n$2",
        "namespaceprotected": "Awan ti pammalubosmo nga agurnos kadagiti panid iti nagan ti espasio ti <strong>$1</strong>.",
        "customcssprotected": "Awan ti pammalubosmo nga agurnos iti daytoy panid ti CSS, ngamin ket naglaon ti personal a pannakaisaad iti sabali agar-aramat.",
        "customjsprotected": "Awan ti pammalubosmo nga agurnos iti daytoy a panid ti JavaScript, ngamin ket naglaon ti personal a pannakaisaad iti sabali agar-aramat.",
        "readonlywarning": "<strong>Ballaag: Narikepan ti database tapno mataripato, isu a saanmo a mabalin nga idulin dagita inurnosmo tattan.</strong>\nMabalinmo ti agkopia ken agipegket ti testom iti papeles ti testo ken idulinmo daytoy intono madamdama.\n\nTi administrador a nangrikep ket nangited iti daytoy a palawag: $1",
        "protectedpagewarning": "<strong>Ballaag: Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos ditoy.</strong>\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "semiprotectedpagewarning": "<strong>Nota:</strong> Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaurnos ditoy.\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
-       "cascadeprotectedwarning": "<strong>Ballaag:</strong> Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos ngamin ket nairaman kadagiti sumaganad a nasalakniban iti sariap\n{{PLURAL:$1|a panid|a pampanid}}:",
+       "cascadeprotectedwarning": "<strong>Ballaag:</strong> Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos gapu ta nailak-am {{PLURAL:$1|iti sumaganad a panid|kadagiti sumaganad a panid}} a nasalakniban iti sariap:",
        "titleprotectedwarning": "<strong>Ballaag:  Nasalakniban daytoy a panid tapno [[Special:ListGroupRights|dagiti naisangayan ti karbengan]] ket nasken a makapartuat iti daytoy.</strong>\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "templatesused": "{{PLURAL:$1|Ti plantilia|Dagiti plantilia}} a naaramat iti daytoy a panid:",
        "templatesusedpreview": "{{PLURAL:$1|Ti plantilia|Dagiti plantilia}} a naaramat iti daytoy a panagpadas:",
        "rollback-success": "Naibabawi dagiti panagurnos babaen ni $1;\nnaisubli manen ti naudi a rebision babaen ni $2.",
        "sessionfailure-title": "Napaay ti sesion",
        "sessionfailure": "Adda parikut ti sesion ti panagserrekmo;\ndaytoy nga aramid ket naibabawi a kas pagpawilan ti panaghijack ti sesion.\nAgsublika iti naggapuam a panid, ikargam manen ti panid ken padasen manen.",
+       "changecontentmodel": "Baliwan ti modelo ti linaon ti panid",
+       "changecontentmodel-legend": "Baliwan ti modelo ti linaon ti panid",
        "changecontentmodel-title-label": "Titulo ti panid",
        "changecontentmodel-model-label": "Baro a modelo ti linaon",
        "changecontentmodel-reason-label": "Rason:",
        "protect-locked-blocked": "Saanmo a mabalin a sukatan dagiti kita ti salaknib no naserraanka.\nAdda ditoy kadagiti agdama a kasasaad ti panid ti <strong>$1</strong>:",
        "protect-locked-dblock": "Ti kita ti salaknib ket saan a masukatan gapu ti agdama a kandado ti database.\nAdda ditoy kadagiti agdama a kasasaad ti panid ti <strong>$1</strong>:",
        "protect-locked-access": "Ti pakabilangam ket awan pammalubosna a mangsukat kadagiti agpang ti salaknib ti panid.\nDagitoy ti agdama a pannakaisaad para iti panid ti <strong>$1</strong>:",
-       "protect-cascadeon": "Daytoy a panid ket agdama a nasalakniban gapu ta nairaman kadagiti sumaganad a {{PLURAL:$1|panid, nga addaan|pampanid, nga addaan}} iti nalukatan a salaknib ti sariap.\nDagiti panagbaliw iti agpang ti salaknib iti daytoy a panid ket saan a mabanagan ti salaknib ti sariap.",
+       "protect-cascadeon": "Daytoy a panid ket agdama a nasalakniban gapu ta nailak-am {{PLURAL:$1|iti sumaganad a panid|kadagiti sumaganad a panid}} nga addaan iti nalukatan a salaknib ti sariap.\nDagiti panagbaliw iti agpang ti salaknib iti daytoy a panid ket saan a mabanagan ti salaknib ti sariap.",
        "protect-default": "Palubosan amin nga agar-aramat",
        "protect-fallback": "Palubosan laeng dagiti agar-aramat nga adda iti \"$1\" a pammalubos",
        "protect-level-autoconfirmed": "Palubosan laeng dagiti automatiko a napasingkedan nga agar-aramat",
        "htmlform-cloner-create": "Agnayon pay ti adu",
        "htmlform-cloner-delete": "Ikkaten",
        "htmlform-cloner-required": "Saan a basbassit ngem maysa a pateg ti masapul.",
+       "htmlform-title-not-exists": "Awan ti [[:$1]].",
+       "htmlform-user-not-exists": "Awan ti <strong>$1</strong>.",
+       "htmlform-user-not-valid": "Saan nga umiso a nagan ti agar-aramat ti <strong>$1</strong>.",
        "sqlite-has-fts": "Ti $1 nga addaan iti suporta ti panagbiruk ti napno a testo",
        "sqlite-no-fts": "Ti $1 nga awan iti suporta ti panagbiruk ti napno a testo",
        "logentry-delete-delete": "{{GENDER:$2|Inikkat}} ni $1 ti panid ti $3",
index e67d664..ff8a901 100644 (file)
@@ -85,7 +85,9 @@
                        "TecnoMaster",
                        "Alexmar983",
                        "Federico Mugnaini",
-                       "Fpugliajno"
+                       "Fpugliajno",
+                       "Fringio",
+                       "Aquatech"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "protectedinterface": "Questa pagina contiene un elemento che fa parte dell'interfaccia utente del software di questo sito ed è protetta per evitare possibili abusi.\nPer aggiungere o modificare le traduzioni valide su tutti i wiki, usa [//translatewiki.net/ translatewiki.net], il progetto di localizzazione di MediaWiki.",
        "editinginterface": "<strong>Attenzione:</strong> il testo di questa pagina fa parte dell'interfaccia utente del software di questo sito. Tutte le modifiche apportate a questa pagina si riflettono sui messaggi visualizzati per tutti gli utenti su questo wiki.",
        "translateinterface": "Per aggiungere o modificare le traduzioni valide su tutti i wiki, usa [//translatewiki.net/ translatewiki.net], il progetto MediaWiki per la localizzazione.",
-       "cascadeprotected": "Su questa pagina non è possibile effettuare modifiche perché è stata inclusa {{PLURAL:$1|nella pagina indicata di seguito, che è stata protetta|nelle pagine indicate di seguito, che sono state protette}} selezionando la protezione \"ricorsiva\":\n$2",
+       "cascadeprotected": "Su questa pagina non è possibile effettuare modifiche perché è inclusa {{PLURAL:$1|nella pagina indicata di seguito, che è stata protetta|nelle pagine indicate di seguito, che sono state protette}} selezionando la protezione \"ricorsiva\":\n$2",
        "namespaceprotected": "Non si dispone dei permessi necessari per modificare le pagine del namespace '''$1'''.",
        "customcssprotected": "Non si dispone dei permessi necessari alla modifica di questa pagina CSS, in quanto contiene le impostazioni personali di un altro utente.",
        "customjsprotected": "Non si dispone dei permessi necessari alla modifica di questa pagina JavaScript, in quanto contiene le impostazioni personali di un altro utente.",
        "readonlywarning": "<strong>ATTENZIONE</strong>: il database è bloccato per manutenzione, non è momentaneamente possibile salvare le modifiche effettuate.\nPer non perderle, copiale in un file di testo e salvalo in attesa dello sblocco del database.\n\nL'amministratore che impostato il blocco ha fornito questa spiegazione: $1.",
        "protectedpagewarning": "'''Attenzione: questa pagina è stata bloccata in modo che solo gli utenti con privilegi di amministratore possano modificarla.'''\nL'ultimo elemento del registro è riportato di seguito per informazione:",
        "semiprotectedpagewarning": "'''Nota:''' Questa pagina è stata bloccata in modo che solo gli utenti registrati possano modificarla.\nL'ultimo elemento del registro è riportato di seguito per informazione:",
-       "cascadeprotectedwarning": "'''Attenzione:''' Questa pagina è stata bloccata in modo che solo gli utenti con privilegi di amministratore possano modificarla. Ciò avviene perché la pagina è inclusa {{PLURAL:$1|nella pagina indicata di seguito, che è stata protetta|nelle pagine indicate di seguito, che sono state protette}} selezionando la protezione \"ricorsiva\":",
+       "cascadeprotectedwarning": "<strong>Attenzione:</strong> Questa pagina è stata bloccata in modo che solo gli utenti con privilegi di amministratore possano modificarla poiché è inclusa selezionando la protezione \"ricorsiva\" {{PLURAL:$1|nella pagina|nelle pagine}}:",
        "titleprotectedwarning": "'''Attenzione: questa pagina è stata bloccata in modo che siano necessari [[Special:ListGroupRights|diritti specifici]] per crearla.'''\nL'ultimo elemento del registro è riportato di seguito per informazione:",
        "templatesused": "{{PLURAL:$1|Template utilizzato|Template utilizzati}} in questa pagina:",
        "templatesusedpreview": "{{PLURAL:$1|Template utilizzato|Template utilizzati}} in questa anteprima:",
        "history-feed-description": "Cronologia della pagina su questo sito",
        "history-feed-item-nocomment": "$1 il $2",
        "history-feed-empty": "La pagina richiesta non esiste; potrebbe essere stata cancellata dal sito o rinominata. Verificare con la [[Special:Search|pagina di ricerca]] se vi sono nuove pagine.",
-       "history-edit-tags": "Modifica le etichette delle versioni selezioniate",
+       "history-edit-tags": "Modifica le etichette delle versioni selezionate",
        "rev-deleted-comment": "(Oggetto della modifica rimosso)",
        "rev-deleted-user": "(nome utente rimosso)",
        "rev-deleted-event": "(dettagli del registro rimossi)",
        "uploaded-href-attribute-svg": "Attributi href <code>&lt;$1 $2=\"$3\"&gt;</code> com un bersaglio non locale (e.g. http://, javascript:, etc) non sono permessi file SGV",
        "uploaded-href-unsafe-target-svg": "Trovati href ad un bersaglio non sicuro <code>&lt;$1 $2=\"$3\"&gt;</code> caricato nel file SVG",
        "uploaded-animate-svg": "Trovato il tag \"animate\" che potrebbe cambiare href, usando l'attributo \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> nel file SVG caricato.",
+       "uploaded-setting-href-svg": "Utilizzare il tag \"set\" per aggiungere l'attributo \"href\" all'elemento parentale è bloccato.",
        "uploaded-image-filter-svg": "Trovato filtro immagine con URL: <code>&lt;$1 $2=\"$3\"&gt;</code> nel file in formato SVG caricato.",
        "uploadscriptednamespace": "Questo file SVG contiene un namespace '$1' non consentito",
        "uploadinvalidxml": "Il codice XML nel file caricato non può essere elaborato.",
        "changecontentmodel-success-title": "Il modello di contenuto è stato modificato",
        "changecontentmodel-success-text": "Il tipo di contenuto di [[:$1]] è stato modificato.",
        "changecontentmodel-cannot-convert": "Il contenuto di [[:$1]] non può essere convertito in tipo $2.",
+       "changecontentmodel-title-cantexist": "Non è possibile avere una pagina in $1.",
+       "changecontentmodel-nodirectediting": "Il modello di contenuto $1 non supporta la modifica diretta",
+       "log-name-contentmodel": "Registro delle modifiche del modello contenuti",
        "log-description-contentmodel": "Eventi relativi al modello di contenuto di una pagina",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|ha modificato}} il modello di contenuto della pagina $3 da \"$4\" a \"$5\"",
        "logentry-contentmodel-change-revertlink": "ripristina",
        "protect-locked-blocked": "Non è possibile modificare i livelli di protezione quando è attivo un blocco. Le impostazioni correnti per la pagina sono '''$1''':",
        "protect-locked-dblock": "Impossibile modificare i livelli di protezione durante un blocco del database.\nLe impostazioni correnti per la pagina sono '''$1''':",
        "protect-locked-access": "Non si dispone dei permessi necessari per modificare i livelli di protezione della pagina.\nLe impostazioni correnti per la pagina sono '''$1''':",
-       "protect-cascadeon": "Al momento questa pagina è bloccata perché viene inclusa {{PLURAL:$1|nella pagina indicata di seguito, per la quale|nelle pagine indicate di seguito, per le quali}} è attiva la protezione ricorsiva.\nLe modifiche al livello di protezione individuale della pagina, non avranno effetto sulle impostazioni derivanti dalla protezione ricorsiva.",
+       "protect-cascadeon": "Al momento questa pagina è bloccata perché inclusa {{PLURAL:$1|nella pagina indicata di seguito, per la quale|nelle pagine indicate di seguito, per le quali}} è attiva la protezione ricorsiva.\nLe modifiche al livello di protezione individuale della pagina, non avranno effetto sulle impostazioni derivanti dalla protezione ricorsiva.",
        "protect-default": "Autorizza tutti gli utenti",
        "protect-fallback": "Consentito solo agli utenti con permesso \"$1\"",
        "protect-level-autoconfirmed": "Consentito solo agli utenti autoconvalidati",
        "pageinfo-robot-index": "Consentito",
        "pageinfo-robot-noindex": "Non consentito",
        "pageinfo-watchers": "Numero di utenti che hanno la pagina nei loro osservati speciali",
+       "pageinfo-visiting-watchers": "Numero degli osservatori della pagina che hanno visitato le modifiche recenti",
        "pageinfo-few-watchers": "Meno di $1 {{PLURAL:$1|osservatore|osservatori}}",
+       "pageinfo-few-visiting-watchers": "Ci potrebbero essere o non essere utenti che hanno visualizzato le modifiche recenti",
        "pageinfo-redirects-name": "Numero di redirect a questa pagina",
        "pageinfo-subpages-name": "Sottopagine di questa pagina",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect}}; $3 {{PLURAL:$3|non redirect}})",
        "htmlform-cloner-create": "Aggiungi altro",
        "htmlform-cloner-delete": "Rimuovi",
        "htmlform-cloner-required": "È necessario almeno un valore.",
+       "htmlform-title-badnamespace": "[[:$1]] non si trova nel namespace \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "\"$1\" è il titolo di una pagina non creabile",
+       "htmlform-title-not-exists": "[[:$1]] non esiste.",
+       "htmlform-user-not-exists": "<strong>$1</strong> non esiste.",
+       "htmlform-user-not-valid": "<strong>$1</strong> non è un nome utente valido.",
        "sqlite-has-fts": "$1 con la possibilità di ricerca completa nel testo",
        "sqlite-no-fts": "$1 senza la possibilità di ricerca completa nel testo",
        "logentry-delete-delete": "$1 {{GENDER:$2|ha cancellato}} la pagina $3",
index 9fa4ece..55188ea 100644 (file)
        "htmlform-cloner-delete": "除去",
        "htmlform-cloner-required": "少なくとも 1 つの値が必要です。",
        "htmlform-title-badnamespace": "[[:$1]]は、\"{{ns:$2}}\"名前空間にありません。",
-       "htmlform-title-not-creatable": "\"$1\" は、作成可能なページタイトルでは、ありません。",
+       "htmlform-title-not-creatable": "\"$1\" は、作成可能なページでは、ありません。",
        "htmlform-title-not-exists": "[[:$1]] は存在しません。",
        "sqlite-has-fts": "$1 (全文検索あり)",
        "sqlite-no-fts": "$1 (全文検索なし)",
        "log-description-managetags": "このページは[[Special:Tags|タグ]]に関係する管理タスクをリストアップしています。ログには管理者によって手動で実行された操作の記録しか記載されていません。ウィキ・ソフトウェアによって、ログを残さずにタグが作成・削除されている場合があります。",
        "logentry-managetags-create": "$1 がタグ「$4」を{{GENDER:$2|作成しました}}",
        "logentry-managetags-delete": "$1 がタグ \"$4\" を{{GENDER:$2|削除しました}}  ( $5 {{PLURAL:$5|版 または 記録項目|版 および/または 記録項目}} からの除去)",
-       "logentry-managetags-activate": "$1 ã\81\8cã\82¿ã\82° \"$4\" ã\82\92{{GENDER:$2|ã\82¢ã\82¯ã\83\81ã\81¹ã\83¼ã\83\88ã\81\97ã\81¾ã\81\97ã\81\9f}}ã\80\82å\88©ç\94¨è\80\85ã\81\8aã\82\88ã\81³ã\83\9cã\83\83ã\83\88ã\81®ä½¿ç\94¨ã\81®ã\81\9fã\82\81ã\81§ã\81\99。",
-       "logentry-managetags-deactivate": "$1 ã\81\8cã\82¿ã\82° \"$4\" ã\82\92{{GENDER:$2|ã\82¢ã\82¯ã\83\81ã\81¹ã\83¼ã\83\88ã\81\97ã\81¾ã\81\97ã\81\9f}}ã\80\82å\88©ç\94¨è\80\85ã\81\8aã\82\88ã\81³ã\83\9cã\83\83ã\83\88ã\81®ä½¿ç\94¨ã\81®ã\81\9fã\82\81ã\81§ã\81\99。",
+       "logentry-managetags-activate": "$1 ã\81\8cã\82¿ã\82° \"$4\" ã\81®å\88©ç\94¨è\80\85ã\81\8aã\82\88ã\81³ã\83\9cã\83\83ã\83\88ã\81«ã\82\88ã\82\8b使ç\94¨ã\82\92{{GENDER:$2|æ\9c\89å\8a¹å\8c\96ã\81\97ã\81¾ã\81\97ã\81\9f}}。",
+       "logentry-managetags-deactivate": "$1 ã\81\8cã\82¿ã\82° \"$4\" ã\81®å\88©ç\94¨è\80\85ã\81\8aã\82\88ã\81³ã\83\9cã\83\83ã\83\88ã\81«ã\82\88ã\82\8b使ç\94¨ã\82\92{{GENDER:$2|ç\84¡å\8a¹å\8c\96ã\81\97ã\81¾ã\81\97ã\81\9f}}。",
        "log-name-tag": "タグ記録",
        "logentry-tag-update-add-revision": "$1 がページ $3 の版 $4 に{{PLURAL:$7|タグ}} $6 を{{GENDER:$2|追加しました}}",
        "logentry-tag-update-add-logentry": "$1 がページ $3 の記録項目 $5 に{{PLURAL:$7|タグ}} $6 を{{GENDER:$2|追加しました}}",
index 8947bc3..d4d1ce9 100644 (file)
        "hiddencategories": "ಈ ಪುಟವು {{PLURAL:$1|೧ ಗುಪ್ತ ವರ್ಗಕ್ಕೆ|$1 ಗುಪ್ತ ವರ್ಗಗಳಿಗೆ}} ಸೇರಿದೆ:",
        "nocreatetext": "{{SITENAME}} ಅಲ್ಲಿ ಹೊಸ ಪುಟಗಳನ್ನು ಸೃಷ್ಟಿಸಲು ಕೆಲವು ನಿಬಂಧನೆಗಳಿವೆ.\nನೀವು ಹಿಂದಿರುಗಿ ಆಗಲೇ ಅಸ್ಥಿತ್ವದಲ್ಲಿರುವ ಪುಟವೊಂದನ್ನು ಸಂಪಾದಿಸಿ, ಅಥವ [[Special:UserLogin|ಲಾಗ್ ಇನ್ ಆಗಿ ಅಥವ ಹೊಸ ಸದಸ್ಯರಾಗಿ]].",
        "nocreate-loggedin": "ಹೊಸ ಪುಟಗಳನ್ನು ಸೃಷ್ಟಿಸಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ.",
+       "sectioneditnotsupported-title": "ವಿಭಾಗ ಸಂಪಾದನೆಗೆ ಬೆಂಬಲವಿಲ್ಲ",
+       "sectioneditnotsupported-text": "ಈ ಪುಟದಲ್ಲಿ ವಿಭಾಗ ಸಂಪಾದನೆಗೆ ಬೆಂಬಲವಿಲ್ಲ.",
        "permissionserrors": "ಅನುಮತಿ ದೋಷ",
        "permissionserrorstext": "ನಿಮಗೆ ಅದನ್ನು ಮಾಡಲು ಅನುಮತಿ ಇಲ್ಲ, ಅದಕ್ಕೆ {{PLURAL:$1|ಕಾರಣ|ಕಾರಣಗಳು}}:",
        "permissionserrorstext-withaction": "$2 ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ, ಅದಕ್ಕೆ {{PLURAL:$1|ಕಾರಣ|ಕಾರಣಗಳು}}:",
        "right-suppressionlog": "ಖಾಸಗಿ ದಾಖಲೆಗಳು ವೀಕ್ಷಿಸಿ",
        "right-block": "ಬೇರೆ ಬಳಕೆದಾರರು ಸಂಪಾದಿಸದಂತೆ ನಿರ್ಬಂಧಿಸು",
        "right-blockemail": "ಬಳಕೆದಾರನು ಇ-ಅಂಚೆ ಕಳುಹಿಸುವುದನ್ನು ತಡೆಗಟ್ಟು",
+       "right-editmyoptions": "ನಿಮ್ಮ ಆದ್ಯತೆಗಳನ್ನು ಸಂಪಾದಿಸಿ",
        "right-import": "ಬೇರೆ ವಿಕಿಗಳಿಂದ ಪುಟಗಳನ್ನು ಆಮದು ಮಾಡು",
        "right-unwatchedpages": "ಪಹರೆಯಿಲ್ಲದ ಪುಟಗಳ ಪಟ್ಟಿಯನ್ನು ವೀಕ್ಷಿಸಿ",
        "right-mergehistory": "ಪುಟಗಳು ಇತಿಹಾಸದಲ್ಲಿ ವಿಲೀನಗೊಳಿಸಿ",
        "action-createpage": "ಪುಟಗಳನ್ನು ಸೃಷ್ಟಿಸು",
        "action-createtalk": "ಚರ್ಚಾ ಪುಟಗಳನ್ನು ಸೃಷ್ಟಿಸು",
        "action-createaccount": "ಈ ಬಳಕೆದಾರ ಖಾತೆಯನ್ನು ರಚಿಸಿ",
+       "action-history": "ಈ ಪುಟದ ಇತಿಹಾಸವನ್ನು ವೀಕ್ಷಿಸಿ",
        "action-minoredit": "ಈ ತಿದ್ದುಪಡಿಯನ್ನು ಚಿಕ್ಕದೆಂದು ಗುರುತಿಸಿ",
        "action-move": "ಈ ಪುಟವನ್ನು ಸ್ಥಳಾಂತರಿಸಿ",
        "action-move-subpages": "ಈ ಪುಟವನ್ನು ಮತ್ತು ಅದರ ಉಪಪುಟಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸಿ",
        "license": "ಪರವಾನಗಿ:",
        "license-header": "ಪರವಾನಗಿ",
        "nolicense": "ಆಯ್ಕೆ ಇಲ್ಲ",
+       "licenses-edit": "ಪರವಾನಗಿ ಆಯ್ಕೆಗಳನ್ನು ಸಂಪಾದಿಸಿ",
        "license-nopreview": "(ಪೂರ್ವವೀಕ್ಷಣೆ ಲಭ್ಯವಿಲ್ಲ)",
        "upload_source_url": " (ಒಂದು ಮನ್ನಿತ, ಸಾರ್ವಜನಿಕವಾಗಿ ಎಟಕುವ URL)",
        "upload_source_file": " (ನಿಮ್ಮ ಗಣಕಯಂತ್ರದಲ್ಲಿರುವ ಒಂದು ಫೈಲು)",
        "listgrouprights-helppage": "Help:ಗುಂಪು ಹಕ್ಕುಗಳು",
        "listgrouprights-members": "(ಸದಸ್ಯರ ಪಟ್ಟಿ)",
        "listgrouprights-addgroup-all": "ಎಲ್ಲಾ ಗುಂಪುಗಳನ್ನು ಸೇರಿಸಿ",
+       "listgrouprights-removegroup-all": "ಎಲ್ಲಾ ಗುಂಪುಗಳನ್ನು ತೆಗೆದುಹಾಕಿ",
        "listgrouprights-namespaceprotection-namespace": "ನಾಮವರ್ಗ",
        "trackingcategories-name": "ಸಂದೇಶದ ಹೆಸರು",
        "trackingcategories-nodesc": "ಯಾವುದೇ ವಿವರಣೆಯಿಲ್ಲ.",
        "deletereason-dropdown": "*ಸಾಮಾನ್ಯ ಅಳಿಸುವಿಕೆಯ ಕಾರಣಗಳು\n** ಸಂಪಾದಕರ ಕೋರಿಕೆ\n** ಕೃತಿಸ್ವಾಮ್ಯತೆಯ ಉಲ್ಲಂಘನೆ\n** Vandalism",
        "delete-edit-reasonlist": "ಅಳಿಸುವಿಕೆ ಕಾರಣಗಳನ್ನು ಸಂಪಾದಿಸು",
        "rollbacklink": "ತೊಡೆದುಹಾಕು",
+       "changecontentmodel": "ಪುಟದ ವಿಷಯ ಮಾದರಿಯನ್ನು ಬದಲಾಯಿಸಿ",
+       "changecontentmodel-legend": "ವಿಷಯ ಮಾದರಿಯನ್ನು ಬದಲಾಯಿಸಿ",
        "changecontentmodel-title-label": "ಪುಟ ಶೀರ್ಷಿಕೆ",
+       "changecontentmodel-model-label": "ಹೊಸ ವಿಷಯ ಮಾದರಿ",
        "changecontentmodel-reason-label": "ಕಾರಣ:",
+       "changecontentmodel-success-title": "ವಿಷಯ ಮಾದರಿಯನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ",
        "logentry-contentmodel-change-revertlink": "ಹಿಂದಿನಂತಾಗಿಸು",
        "logentry-contentmodel-change-revert": "ಹಿಂದಿನಂತಾಗಿಸು",
        "protectlogpage": "ಸಂರಕ್ಷಣೆ ದಿನಚರಿ",
        "htmlform-selectorother-other": "ಇತರ",
        "htmlform-no": "ಇಲ್ಲ",
        "htmlform-yes": "ಹೌದು",
+       "htmlform-title-not-exists": "[[:$1]] ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ.",
        "logentry-delete-delete": "$1 {{GENDER:$2|ಅಳಿಸಲಾಯಿತು}} ಪುಟ $3",
        "revdelete-restricted": "ನಿರ್ವಾಹಕರಿಗೆ ನಿಬಂಧನೆಗಳನ್ನು ಅನ್ವಯಿಸಲಾಯಿತು",
        "revdelete-unrestricted": "ನಿರ್ವಾಹಕರ ನಿಬಂಧನೆಗಳನ್ನು ತೆಗೆಯಲಾಯಿತು",
index 8b4563c..515895a 100644 (file)
        "welcomecreation-msg": "Dinge Zohjang es enjerescht.\nWann De wells, künnts De Ding [[Special:Preferences|Enschtällonge aanpaße]].",
        "yourname": "Metmaacher_Naame:",
        "userlogin-yourname": "Der Metmaacher_Nahme",
-       "userlogin-yourname-ph": "Donn Dinge Metmaachername aanjevve",
+       "userlogin-yourname-ph": "Donn Dinge Metmaachernahme aanjävve",
        "createacct-another-username-ph": "Jivv ene Metmaacher_Nahme aan",
        "yourpassword": "Paßwoot:",
        "userlogin-yourpassword": "Et Paßwoot",
        "user-mail-no-addy": "Do häs versöhg en <i lang=\"en\">e-mail</i> der ohne en Adräß ze verschecke",
        "user-mail-no-body": "En dä <i lang=\"en\">e-mail</i> schteiht nix udder zoh winnisch dren.",
        "changepassword": "Passwood *",
-       "resetpass_announce": "Do moß jäz e neu Paßwoot för op Duur aanjevve.",
+       "resetpass_announce": "Do moß jäz e neu Paßwoot för op Duur aanjävve.",
        "resetpass_text": "<!-- Donn der Täx hee dobei -->",
        "resetpass_header": "Neu Passwood faßlääje",
        "oldpassword": "Et ahle Passwood:",
        "resetpass-submit-cancel": "Nix donn!",
        "resetpass-wrong-oldpass": "Dat Zweschepaßwood udder dat aktoälle Paßwood stemmp nit.\nMöjjelesch, Do häs Ding Paßwood ald jetuusch, künnt och sin,\nDo häs Der enzwesche e neu Zweschepaßwood jehollt.",
        "resetpass-recycled": "Donn för Ding neu Paßwoot jät anders aanjävve, wi Ding Paßwoot vun jäz.",
-       "resetpass-temp-emailed": "Do beß jez enjelogg med ennem Zweschepasswoot, wat De övver e-mail krääje häs. Dat kanns De nit einfar_esu behallde. Alsu donn jetz e neu Passwoot för op Duur aanjevve.",
+       "resetpass-temp-emailed": "Do beß jez enjelogg med ennem Zweschepasswoot, wat De övver e-mail krääje häs. Dat kanns De nit einfar_esu behallde. Alsu donn jetz e neu Passwoot för op Duur aanjävve.",
        "resetpass-temp-password": "Zweschepasswood:",
        "resetpass-abort-generic": "E Zohsazprojramm häd_et nit zohjelohße, et Paßwoot ze ändere.",
        "resetpass-expired": "Di Paßwood es afjeloufe. Donn jetz e neu Passwoot för et Enlogg faßlääje.",
        "prefs-help-realname": "Dinge rechteje Nahme kanns De fott lohße.\nWann De en ävver nenne wells, dann kann dä jebruch weede, öm Ding Beidrähch domet ze schmöcke.",
        "prefs-help-email": "Ding <i lang=\"en\">e-mail</i> Adress - kanns De fottlooße, un se es för Andre nit ze sinn - mäht et ävver müjjelich, Der e neu Passwoot ze schecke, wann De et ens verjäße häß.",
        "prefs-help-email-others": "Do kannß och zohlohße, dat mer Der domet övver Ding Metmaacherklaafsigg en <i lang=\"en\">e-mail</i> schecke kann. Esu künne ander Metmaacher met Der en Kontak kumme, ohne dat se Dinge Name oder Ding <i lang=\"en\">e-Mail</i> Adress kenne mööte.",
-       "prefs-help-email-required": "Do moß en <i lang=\"en>e-mail</i>-Addräß aanjevve.",
+       "prefs-help-email-required": "Do moß en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß aanjävve.",
        "prefs-info": "Jrundlare",
        "prefs-i18n": "Schprohche-Enschtällonge",
        "prefs-signature": "Ongerschreff",
        "filedelete-maintenance": "Datteie Fottschmiiße un widder zerök Holle jeiht jez jrad nit, mer hann Waadong.",
        "filedelete-maintenance-title": "Di Dattei künne mer nit fottschmiiße",
        "mimesearch": "Dateije övver dänne ehre <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Multi-Purpose Internet Mail Extensions\">MIME</i>-Zoot söhke",
-       "mimesearch-summary": "Op hee dä {{int:nstab-special}} könne de Dateie noh de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Multi-Purpose Internet Mail Extensions\">MIME</i>-Zoot ußjesöhk wähde.\nMer moß der Medijetüp un der Ongertüp aanjevve mem scheive Schtresch derzwesche, zem Bejschpell: <code xml:lang=\"en\" lang=\"en\">image/jpeg</code> udder <code xml:lang=\"en\" lang=\"en\">text/*</code> udder esu.",
+       "mimesearch-summary": "Op hee dä {{int:nstab-special}} könne de Dateie noh de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Multi-Purpose Internet Mail Extensions\">MIME</i>-Zoot ußjesöhk wähde.\nMer moß de Zoot Medije un de Ongerzppd aanjävve mem scheive Schtresch derzwesche, zem Bejschpell: <code xml:lang=\"en\" lang=\"en\">image/jpeg</code> udder <code xml:lang=\"en\" lang=\"en\">text/*</code> udder esu.",
        "mimetype": "<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Multi-Purpose Internet Mail Extensions\">MIME</i>-Zoot:",
        "download": "eronger laade",
        "unwatchedpages": "Sigge, wo keiner drop oppass",
        "linksearch-pat": "Sök noh:",
        "linksearch-ns": "Appachtemang:",
        "linksearch-ok": "Söhke",
-       "linksearch-text": "Beim Söke künnd_Er Schtäänsche aanjevve för e Schtöcksche fun ennem Nahme, wo mer nit jenou weiß, wi et heiß udder wat me nit kenne deit, zem Beischpöll esu: <code>http://*.example.com</code> un ene bövverschte Name för en Domain moß aanjejovve sin, zem Beishpöll esu: <code>http://*.org</code> \n\n{{PLURAL:$2|Dat Brauserprotokoll, wat|De Brauserprotokolle, di|Kein Brauserprotokolle, di}} mer beim Söhke aanjävve kann, sin: $1, un der Schtandatt es <code>http://</code> wann nix aanjejovve es.",
+       "linksearch-text": "Beim Söke künnd_Er Schtähnsche aanjävve för e Schtöcksche fun ennem Nahme, wo mer nit jenou weiß, wi et heiß udder wat me nit kenne deit, zem Beischpöll esu: <code>http://*.example.com</code> un ene bövverschte Name för en Domain moß aanjejovve sin, zem Beishpöll esu: <code>http://*.org</code> \n\n{{PLURAL:$2|Dat Brauserprotokoll, wat|De Brauserprotokolle, di|Kein Brauserprotokolle, di}} mer beim Söhke aanjävve kann, sin: $1, un der Schtandatt es <code>http://</code> wann nix aanjejovve es.",
        "linksearch-line": "„$2“ hät ene Link op $1",
        "linksearch-error": "Shternshe kam_mer nor aam Aanfang fum Domain-Name bruche.",
        "listusersfrom": "Zeich de Metmaacher vun:",
index d2fb581..ebb128f 100644 (file)
        "htmlform-cloner-required": "Mindestens ee Wäert ass obligatoresch.",
        "htmlform-title-badnamespace": "[[:$1]] ass net am Nummraum \"{{ns:$2}}\".",
        "htmlform-title-not-exists": "[[:$1]] gëtt et net.",
+       "htmlform-user-not-exists": "<strong>$1</strong> gëtt et net.",
+       "htmlform-user-not-valid": "<strong>$1</strong> ass kee valabele Benotzernumm.",
        "sqlite-has-fts": "$1 ënnerstëtzt d'Volltextsich",
        "sqlite-no-fts": "$1 ënnerstëtzt d'Volltextsich net",
        "logentry-delete-delete": "$1 {{GENDER:$2|huet}} d'Säit $3 geläscht",
index 81736bf..acdbcad 100644 (file)
        "userloginnocreate": "ڤامین ئوٙمائن",
        "logout": "د ساموٙنە دئرئوٙمائن",
        "userlogout": "د ساموٙنە دئرئوٙمائن",
-       "notloggedin": "Ù\86بÙ\88Ù\99Û\95 Ø¨Û\8cاÛ\8cیت ڤامین",
+       "notloggedin": "Ù\86أبÙ\88Ù\99Ø£ Ø¨Û\8cائیت ڤامین",
        "userlogin-noaccount": "یئ گئل حئساڤ ناریت؟",
        "userlogin-joinproject": "ڤأصل بوٙییت {{SITENAME}}",
        "nologin": "یئ گئل حئساڤ کاریاری ناريت؟$1",
        "noemailcreate": "شوما بایأد یئ گئل تیرنئشوٙن أنجومانە جادیار سی خوتوٙ داشتوٙییت.",
        "passwordsent": "یئ گئل رازینە گوڤاردئن هأنی کئل بییە سی تیرنئشوٙن أنجومانامە یی کئ \"$1\" ڤاش ثأڤت نام کئردە.\nخاهئشت می کیم هأنی روٙییت ڤامین و ئوٙسئ بئریتئش.",
        "blocked-mailpassword": "نئها آی پی شوما سی ڤیرایئشت کاری گئرئتە بییە، هأنی صئلا یە نە نارە کئ د رازینە گوڤاردئن د نۊ کئل بییە سی نئهاگئری د گأن کاری نارە.",
-       "eauthentsent": "یه گل انجومانامه پشت راس کردنی د یه گل تیرنشون ویجه کل بیه.\nدما یه که یه گل انجومانامه هنی د حساو کل بوئه، شما واس دما رئنمونی نه د انجومانامه بئریت، سی یه که حساو شما راستکی پشت راست بوئه.",
-       "throttled-mailpassword": "یه گل رازینه گواردن دواره زنه بیه ایسه کل بیه، د آخری {{PLURAL:$1|ساعت|$1 ساعتیا}}.\nسی نهاگری د اذیت دئن،فقط یه گل رازینه گواردن د انجومانامه دواره زنه بیه د هر {{PLURAL:$1|ساعت|$1 ساعتیا}} کل بیه.",
-       "mailerror": "خطا Ø¯Ø§Ø±Ù\87 Ú©Ù\84 Ù\85Ù\88ئÙ\87:$1",
-       "acct_creation_throttle_hit": "سیل کریا ای ویکی تیرنشون آی پی شما وه کار گرتنه د روز دمایی {{PLURAL:$1|1 حساو|$1 حساویا}} نه دروس کردنه، و وه د بیشترونه صلا دئن د ای دوره گاتی انجوم بیه.\nد نتیجه، سیل کریایی که د ای تیرنشون آی پی وه کار گرتنه نمی تونن  حساویا بیشتری د ای گات دروس بکن.",
-       "emailauthenticated": "تÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 ØªÙ\88Ù\86Ù\87 Ø¯ $2 Ø³Û\8c 3$ Ù\85ئکÙ\85 Ø¨Û\8cÙ\87.",
-       "emailnotauthenticated": "تÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ø´Ù\85ا ØªØ§ Ø§Û\8cسÙ\87 Ù¾Ø´Øª Ø±Ø§Ø³Ú¯Ø±Û\8c Ù\86بÛ\8cÙ\87.\nÙ\87Ù\86Û\8c Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ø§Û\8c Ø³Û\8c Ú\86Û\8cا Ø±Û\8c Ø¨Ù\87 Ù\86Ù\87ا Ú©Ù\84 Ù\86بÛ\8cÙ\87.",
-       "noemailprefs": "یه گل تیرنشون انجومانامه د الویتیاتو سی یه که ای ویجه گیا کار بکن انتخاو بکیت.",
-       "emailconfirmlink": "پشت راس کردن تیرنشون انجومانامه",
-       "invalidemailaddress": "تÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ø­Ø§Ø³ØªÙ\86Û\8c Ù\86ئ Ø´Ú©Ù\84 Ù\88Ù\87 Ú\86Ù\88ئÙ\87 Ø®Ù\88ئÛ\8c Ù\86ارÙ\87.\nÙ\84Ø·Ù\81Ù\86 Û\8cÙ\87 Ú¯Ù\84 ØªÛ\8cرÙ\86Ø´Ù\88Ù\86 Ú\86Ù\88ئÙ\87 Ø¯Ø§Ø± Ù\88ارد Ø¨Ú©Û\8cت Û\8cا Ø§Û\8c Ø±Ø´Ù\86Ù\87 Ú¯Ù\87 Ù\86Ù\87 Ø­Ø§Ù\84Û\8c Ø¨نیت.",
-       "cannotchangeemail": "تÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ø­Ø³Ø§Ù\88 Ù\86تÙ\88Ù\86Ù\87 Ø¯ Ø§Û\8c Ù\88Û\8cÚ©Û\8c Ø¢Ù\84شت Ø¨Ù\88ئÙ\87.",
-       "emaildisabled": "اÛ\8c Ù\85اÙ\84Ú¯Ù\87 Ù\86تÙ\88Ù\86Ù\87 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ú©Ù\84 Ù\86Ù\85Û\8c Ú©Ù\87",
+       "eauthentsent": "یئ گئل أنجومانامە پوشت راست کئردئنی د یئ گئلٛ تیرنئشوٙن ڤیجە کئل بییە.\nدئما یە کئ یئ گئل أنجومانامە هأنی د حئساڤ کئل بوٙأ، شوما ڤاس دئما رأدیارکونی نە د أنجومانامە بئیریت، سی یە کئ حئساڤ شوما راستأکی پوشت راست بوٙأ.",
+       "throttled-mailpassword": "یئ گئل رازینە گوڤاردئن د نۊ زئنە بییە و ئیسئ کئل بییە، د آخئری {{PLURAL:$1|ساعأت|$1 ساعأتیا}}.\nسی نئهاگئری د أذیأت بییئن، فأقأط یئ گئل رازینە گوڤاردئن د أنجومانامە د نۊ زئنە بییە د هأر {{PLURAL:$1|ساعأت|$1 ساعأتیا}} کئل بییە.",
+       "mailerror": "خأطا Ø¯ Ú©Ø¦Ù\84 Ø¨Û\8cÛ\8cئÙ\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95:$1",
+       "acct_creation_throttle_hit": "سئل کاریا ئی ڤیکی تیرنئشوٙن آی پی شوما نە ڤئ کار گئرئتئنە د روٙز دئمایی {{PLURAL:$1|1 حئساڤ|$1 حئساڤیا}} نە رأڤأندیاری کئردئنە، و ڤئ د بیشتأروٙنە صئلا دأئنە د ئی دورە گاتی أنجوم بییە.\nد نأتیجە، سئل کاریایی کئ د ئی تیرنئشوٙن آی پی ڤئ کار گئرئتئنە نئمی توٙنئن حئساڤیا بیشتأری نە د ئی گات دوروس بأکأن.",
+       "emailauthenticated": "تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 ØªÙ\88Ù\99 Ø¯ $2 Ø³Û\8c 3$ Ù¾Ù\88شت Ø±Ø§Ø³Ú©Ø§Ø±Û\8c Ø¨Û\8cÛ\8cÛ\95.",
+       "emailnotauthenticated": "تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ø´Ù\88Ù\85ا ØªØ§ Ø¦Û\8cسئ Ù¾Ù\88شت Ø±Ø§Ø³ Ú©Ø§Ø±Û\8c Ù\86أبÛ\8cÛ\8cÛ\95.\nÙ\87Ø£Ù\86Û\8c Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Û\8cÛ\8c Ø³Û\8c Ø¦Û\8c Ú\86Û\8cا Ú©Ø¦ Ù\87اÙ\86 Ø±Û\8c Ù\86ئÙ\87ا Ú©Ø¦Ù\84 Ù\86أبÛ\8cÛ\8cÛ\95.",
+       "noemailprefs": "یئ گئل تیرنئشوٙن أنجومانامە د چیا نازار شوما سی یە کئ ئی خوصوٙصیأتیا کار بأکأن ئنتئخاڤ بأکیت.",
+       "emailconfirmlink": "تیرنئشوٙن أنجومانامە توٙنە پوشت راسکاری بأکیت",
+       "invalidemailaddress": "تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ù\82Ø£Ú¤Ù\88Ù\99Ù\84 Ø¨Û\8cئÙ\86Û\8c Ù\86Û\8c Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ú\86Û\8c Ø¯ Ú¤Û\8cر Ù\88 Ø¨Ø§Ú¤Ø£Ø± Ù\85Û\8cا Ú©Ø¦ Ú¤Ø¦ Ø´Û\8cÚ¤Û\95 Ø®Ù\88Ù\99Û\8cÛ\8c Ù\86ارÛ\95.\nÙ\84Ù\88Ø·Ù\81 Ø¨Ø£Ú©Û\8cت Û\8cئ Ú¯Ø¦Ù\84 ØªÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ú\86Ù\88Ù\99Ø£ Ø¯Ø§Ø± Ù\86Û\95 Ø¨Ø£Ø²Ø£Ù\86Û\8cت Û\8cا Ø¦Û\8c Ø¬Ø§Ú¯Û\95 Ù\86Û\95 Ø­Ø§Ù\84Û\8c Ø¨Ø£نیت.",
+       "cannotchangeemail": "تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ø­Ø¦Ø³Ø§Ú¤ Ø¯ Ø¦Û\8c Ú¤Û\8cÚ©Û\8c Ø¢Ù\84ئشت Ú©Ø§Ø±Û\8c Ù\86أبÙ\88Ù\99Ø£.",
+       "emaildisabled": "ئÛ\8c Ø¯Û\8cارگÛ\95 Ù\86ئÙ\85Û\8c ØªÙ\88Ù\99Ù\86Û\95 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ú©Ø¦Ù\84 Ø¨Ø£Ú©Û\95.",
        "accountcreated": "حئساڤ راس بی",
        "accountcreatedtext": "حئساڤ کاریاری سی [[{{ns:کاریار}}:$1|$1]] ([[{{ns:کاریار چأک چئنە}}:$1|چأک چئنە]]) دوروس بییە.",
        "createaccount-title": "حئساڤ سی {{SITENAME}} راس بی",
-       "createaccount-text": "یه نفر وا تیرنشون انجونامه تو یه گل حساو راس کرده{{نوم دیارگه}} ($4) نومشه نیائه\"$2\", با پاسورد \"$3\".\nشما همی ایسه باید روئیت وامین و رازینه گواردتونه آلشت بکیت.\n\nار شما ای پیغوم نه وش التفات نکیت، د راس بیین ای حساو خطا دروس موئه.",
-       "login-throttled": "Ø´Ù\85ا Ø§Û\8cسÙ\86Û\8c Ù\81رÙ\87 Ø³Û\8c Ù\88اÙ\85Û\8cÙ\86 Ø§Ù\88Ù\85ائÙ\86 ØªÙ\84اش Ú©Ø±Ø¯Û\8cتÙ\87.\n$1 Ù\84Ø·Ù\81Ù\86 Ø³Û\8c ØªÙ\84اش Ù\87Ù\86Û\8c ØµØ¨Ø± Ø¨Ú©Û\8cد",
-       "login-abort-generic": "اومائن وامین تو شکست حرد-شکست حرده",
-       "login-migrated-generic": "حساÙ\88 Ú©Ø§Ø±Û\8cارÛ\8c Ø´Ù\85ا Ø¬Ø§ Ù\88Ù\87 Ø¬Ø§ Ø¨Û\8cÙ\87Ø\8c Ù\88 Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c Ø´Ù\85ا Ø¯Û\8cÙ\87 Ø¯ Ø§Û\8c Ù\88یکی نیئش.",
+       "createaccount-text": "یئ نأفأر ڤا تیرنئشوٙن أنجومانامە توٙ یئ گئل حساڤ راس کئردە {{SITENAME}} ($4) و ئوسئ نومئشە نیاە \"$2\"، ڤا رازینە گوڤاردئن \"$3\".\nشوما هأمی ئیسئ بایأد روییت ڤامین و ر ازینە گوڤاردئن خوتوٙنە آلئش کاری بأکیت.\n\nأر شوما د ئی پئیغوم ئلتئفات نأکیت، د گات رأڤأندیاری ئی حئساڤ خأطا پیش میا.",
+       "login-throttled": "Ø´Ù\88Ù\85ا ØªØ§ Ø¦Û\8cسئ Ø³Û\8c Ú¤Ø§Ù\85Û\8cÙ\86 Ø¦Ù\88Ù\99Ù\85ائÙ\86 Ù\81ئرÛ\95 ØªØ¦Ù\84اش Ú©Ø¦Ø±Ø¯Û\8cتÛ\95.\n$1 Ù\84Ù\88Ø·Ù\81 Ø¨Ø£Ú©Û\8cت Ø³Û\8c ØªØ¦Ù\84اش Ù\87Ø£Ù\86Û\8c Ú¯Ù\88رÛ\8c Ø¨Ø¦Ø³Û\8cت.",
+       "login-abort-generic": "ڤامین ئوٙمائن توٙ ناخوش سأرنجوم بی- گأن بی",
+       "login-migrated-generic": "حئساڤ Ú©Ø§Ø±Û\8cارÛ\8c Ø´Ù\88Ù\85ا Ø¬Ø§ Ú¤Ø¦ Ø¬Ø§ Ø¨Û\8cÛ\8cÛ\95Ø\8c Ù\88 Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c Ø´Ù\88Ù\85ا Ø¯Û\95 Ø¯ Ø¦Û\8c Ú¤یکی نیئش.",
        "loginlanguagelabel": "زوٙن:$1",
-       "suspicious-userlogout": "درحاست وه در رئتن شما انکار بیه سی یه کل وه نظر میا که د یه گل دووارته نیئر گن یا یه گل پروکسی که ها د ویرگه نهو کل بیه",
-       "createacct-another-realname-tip": "نوم راستکی دل به حائه.\nار شما وه نه نهااماییه بکیت، یه سی هوم نسبت دئن وه کاریار   سی کاریاش وه کار گرته بوئه.",
+       "suspicious-userlogout": "د حاست ڤئ دأر رأتئن شوما تیە پوشی بییە سی یە کئ ڤئ نأظأر یما کئ ڤئ سی یئ گئل دوڤارتە نیأر گأن یا یئ گئل پوروکسی کئ ها د ڤیرگە کأش کئل بییە.",
+       "createacct-another-realname-tip": "نوم راستأکی دئل ڤئ حاییە.\nأر شوما ڤئنە نئها ئمایە بأکیت، یە سی هوم نئسبأت دأئن کاریاری سی کاریاش ڤئ کار گئرئتئ بوٙە.",
        "pt-login": "ڤامین ئوٙمائن",
        "pt-login-button": "ڤامین ئوٙمائن",
-       "pt-createaccount": "يه گل حساو راس بكيد",
+       "pt-createaccount": "حئساڤ راس بأکیت",
        "pt-userlogout": "د ساموٙنە دئرئوٙمائن",
-       "php-mail-error-unknown": "خطا Ù\86ادÛ\8cار Ù\85Û\8cÙ\86 Ø¢Ù\84شت Ù\88Ù\86 PHP's mail()",
-       "user-mail-no-addy": "سی کل کردن انجومانامه د یه گل انجومانامه بی تیرنشون کنشتگری بیه",
-       "user-mail-no-body": "سی کل کردن انجومانامه وا مینونه حالی یا کؤچک بیئن سی دلیل غیر علقمنی تلاش بکید.",
+       "php-mail-error-unknown": "خأطا Ù\86ادÛ\8cار Ø¯ Ø¢Ù\84ئشتگئر PHP's mail()",
+       "user-mail-no-addy": "سی کئل کئردئن أنجومانامە د یئ گئل أنجومانامە بی تیرنئشوٙن أنجومانامه تئلاش بییە.",
+       "user-mail-no-body": "سی کئل کئردئن أنجومانامە ڤا مینوٙنە حالی یا کوچئک بییئن سی دألیل یا غئر مأنطئقی بییئن ڤئ تئلاش بأکیت.",
        "changepassword": "رارینە گوڤاردئن نە آلئشت بأکیت",
-       "resetpass_announce": "سی تموم کردن وا مین اومائن، شما باید یه گل رازینه گواردن هنی وارد بکیتو.",
+       "resetpass_announce": "سی تأموم کئردئن ڤامین ئوٙمائن، شوما بایأد یئ گئل رازینە گوڤاردئن هأنی نە بأزئنیت.",
        "resetpass_text": "<!-- یه گل نیسسه ایچه اضاف بکیت -->",
-       "resetpass_header": "رازینه گواردن حساوتونه آلشت بکید",
-       "oldpassword": "رازینه گواردن قدیمی:",
-       "newpassword": "رازینه گواردن تازه:",
-       "retypenew": "رازینه گواردن تازه نه دوواره انجومیارنیسی :",
-       "resetpass_submit": "رازینه گواردن بنیت و وامین بیایت",
-       "changepassword-success": "رازینه گواردن شما د خوئی آلشت بی",
-       "changepassword-throttled": "Ø´Ù\85ا Ø§Û\8cسÙ\86Û\8c Ù\81رÙ\87 Ø³Û\8c Ù\88اÙ\85Û\8cÙ\86 Ø§Ù\88Ù\85ائÙ\86 ØªÙ\84اش Ú©Ø±Ø¯Û\8cتÙ\87.\n$1 Ù\84Ø·Ù\81Ù\86 Ø³Û\8c ØªÙ\84اش Ù\87Ù\86Û\8c ØµØ¨Ø± Ø¨Ú©Û\8cد",
-       "resetpass_forbidden": "رازینه گواردناتون نتونن آلشت بوئن",
-       "resetpass-no-info": "Ø´Ù\85ا Ø¨Ø§ Ø¨Û\8cاÛ\8cت Ø¯ Ø³Ø§Ù\85Ù\88Ù\86Ù\87 ØªØ§ Ø¯ Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ø¯Ø³Ø±Ø³Û\8c Ø¯Ø§Ø´ØªÙ\88Û\8cت",
-       "resetpass-submit-loggedin": "رازÛ\8cÙ\86Ù\87 Ú¯Ù\88اردÙ\86 Ù\86Ù\87 Ø¢Ù\84شت Ø¨Ù\83Ù\8aت",
+       "resetpass_header": "رازینە گوڤاردئن حئساڤئ توٙنە آلئشت بأکیت",
+       "oldpassword": "رازینە گوڤاردئن دئمایی:",
+       "newpassword": "رازینە گوڤاردئن تازە:",
+       "retypenew": "رازینە گوڤاردئن تازە نئ د نۊ أنجومیارنیسی بأکیت:",
+       "resetpass_submit": "رازینە گوڤاردئن نە بأزئنیت و بیاییت ڤامین",
+       "changepassword-success": "رازینە گوڤاردئن شوما ڤا خوٙیی آلئشت کاری بی!",
+       "changepassword-throttled": "Ø´Ù\88Ù\85ا ØªØ§ Ø¦Û\8cسئ Ø³Û\8c Ú¤Ø§Ù\85Û\8cÙ\86 Ø¦Ù\88Ù\99Ù\85ائÙ\86 Ù\81ئرÛ\95 ØªØ¦Ù\84اش Ú©Ø¦Ø±Ø¯Û\8cتÛ\95.\n$1 Ù\84Ù\88Ø·Ù\81 Ø¨Ø£Ú©Û\8cت Ø³Û\8c ØªØ¦Ù\84اش Ù\87Ø£Ù\86Û\8c Ú¯Ù\88رÛ\8c Ø¨Ø¦Ø³Û\8cت.",
+       "resetpass_forbidden": "نأبوٙە رازینە گوڤاردنیانە آلئشتکاری بأکیت",
+       "resetpass-no-info": "Ø´Ù\88Ù\85ا Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ø¯ Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø¯Ø£Ø³Ø±Ø¦Ø³Û\8c Ø¯Ø§Ø´ØªÙ\88Ù\99Û\8cÛ\8cت Ø¨Ø§Ø³ Ø¨Û\8cاÛ\8cÛ\8cت Ú¤Ø§Ù\85Û\8cÙ\86.",
+       "resetpass-submit-loggedin": "رارÛ\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ù\86Û\95 Ø¢Ù\84ئشت Ø¨Ø£Ú©Û\8cت",
        "resetpass-submit-cancel": "أنجوم شیڤئستئن",
-       "resetpass-wrong-oldpass": "رازینه گواردن تازه یا موقتی نامعتور.\nشات شما ایسنی یا رازینه گواردن خوتونه د خوئی آلشت دئیته یا یه گل رازینه گواردن موقت هنی درحاست دئیته.",
-       "resetpass-recycled": "لطفن رازینه گواردن خوتونه سی چیا تر د رازینه گواردن ایسنی د نو زنه بکیت",
-       "resetpass-temp-emailed": "Ø´Ù\85ا Ù\88ا Û\8cÙ\87 Ú¯Ù\84 Ø±Ø§Ø²Û\8cÙ\86Ù\87 Ù\85Ù\88Ù\82تÛ\8c Ú©Ù\87 Ø§Ù\86جÙ\88Ù\85ا Ú¯Ø± Ø¨Û\8cÙ\87  Ø§Ù\88Ù\85اÛ\8cتÙ\87 Ù\88اÙ\85Û\8cÙ\86.\nسÛ\8c ØªÙ\85Ù\88Ù\85 Ú©Ø±Ø¯Ù\86 Ø§Ù\88Ù\85ائÙ\86 Ù\88اÙ\85Û\8cÙ\86Ø\8c Û\8cÙ\87 Ú¯Ù\84 Ø±Ø§Ø²Û\8cÙ\86Ù\87 Ú¯Ù\88اردÙ\86 Ù\87Ù\86Û\8c Ø¯ Ø§Û\8cÚ\86Ù\87  Ø¬Ø§Ú¯Ø± Ø¨کیت.",
-       "resetpass-temp-password": "رازینه گواردن موقت:",
-       "resetpass-abort-generic": "Ø¢Ù\84شت Ø¯Ø¦Ù\86 Ø±Ø§Ø²Û\8cÙ\86Ù\87 Ú¯Ù\88اردÙ\86 Ù\88ا Û\8cÙ\87 Ú¯Ù\84 Ù\81رÙ\87 Ù¾Ù\88Ø´ Ø®Ø±Ù\88 Ø¨Û\8cÙ\87.",
-       "resetpass-expired": "رازینه گواردن شما منقضی بیه. لطفن یه گل رازینه گواردن هنی سی وامین اومائن جاگری بکیت.",
-       "resetpass-expired-soft": "رازینه گواردن شما منقضی بیه و واس د نو زنه با. لطفن یه گل رازینه هنی انتخاو بکیت، یا سی د نو زنه کردن د نهاتر د ایچه \"{{int:resetpass-submit-cancel}}\" بپورنیت.",
-       "resetpass-validity-soft": "رازینه گواردتون تو معتور نئ:$1\n\nلطفن یه گل رازینه گواردن هنی انتخاو بکیت، یا ری ایچه \"{{int:resetpass-submit-cancel}}\" سی د نو زنه کردن وه د نهاتر بپورنیت.",
-       "passwordreset": "د Ù\86Û\88 Ù\88ارد Ù\83ردÙ\86 Ø±Ø§Ø²Û\8cÙ\86Ù\87 Ú¯Ù\88اردن",
-       "passwordreset-text-one": "اÛ\8c Ù\86Ù\88Ù\85 Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\87 Ø³Û\8c Ú¯Ø±ØªÙ\86 Û\8cÙ\87 Ú¯Ù\84 Ø±Ø§Ø²Û\8cÙ\86Ù\87 Ú¯Ù\88اردÙ\86 Ù\85Ù\88Ù\82تÛ\8c Ù\88ا Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ù¾Ø± Ø¨کیت.",
-       "passwordreset-text-many": "{{PLURAL:$1|یه گل د رشنه گه یا نه سی یه که رازینه گواردن موقتی وا انجومانامه گرته بوئه پر بکیت}}",
-       "passwordreset-disabled": "نو کرد رازینه گواردن د ای ویکی ناکشتگر بیه.",
-       "passwordreset-emaildisabled": "چی یا هنی انجومانامه د ای ویکی ناکشتگر بیه.",
+       "resetpass-wrong-oldpass": "رازینە گوڤاردئن تازە یا موڤأقأتی نادیارە.\nگاسی شوما ئیسئنی یا یا رازینە گوڤاردئن خوتوٙنە د خوٙیی آلئشت دأئیتە یا یئ گئل رازینە گوڤاردئن موڤأقأت هأنی حاستیتە.",
+       "resetpass-recycled": "لوطف بأکیت رازینە گوڤاردئن خوتوٙنە سی چیا هأنی د رازینە گوڤاردئن ئیسئنی د نۊ زئنە بأکیت.",
+       "resetpass-temp-emailed": "Ø´Ù\88Ù\85ا Ú¤Ø§ Û\8cئ Ú¯Ø¦Ù\84 Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ù\85Ù\88ڤأÙ\82أتÛ\8c Ø¦Ù\88Ù\99Ù\85اÛ\8cتÛ\95 Ú¤Ø§Ù\85Û\8cÙ\86.\nسÛ\8c Ø¦Ù\88Ù\99Ù\85ائÙ\86 Ú¤Ø¦ Ø¯Ø£Ø±Ø\8c Û\8cئ Ú¯Ø¦Ù\84 Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ù\87Ø£Ù\86Û\8c Ù\86Û\95 Ø¦Û\8cÚ\86ئ Ø¬Ø§Ú¯Ø¦Ø±(Ù\85Û\8cزÙ\88Ù\99Ù\86کارÛ\8c) Ø¨Ø£کیت.",
+       "resetpass-temp-password": "رازینە گوڤاردئن موڤأقأت:",
+       "resetpass-abort-generic": "Ø¢Ù\84ئشت Ø¯Ø£Ø¦Ù\86 Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ú¤Ø§ Û\8cئ Ú¯Ø¦Ù\84 Ø¯Ø¦Ù\85ادÛ\8cس Ø®Ø¦Ø±Ø§Ú¤ Ø¨Û\8cÛ\8cÛ\95.",
+       "resetpass-expired": "گات دیاری رازینە گوڤاردئن شوما تأموم بییە. لوطف بأکیت یئ گئل رازینە گوڤاردئن هأنی نە سی ڤامین ئوٙمائن میزوٙنکاری بأکیت.",
+       "resetpass-expired-soft": "گات دیاری رازینە گوڤاردئن شوما تأموم بییە و باس د نۊ زئنە با. لوطف بأکیت یئ گئل رازینە گوڤاردئن هأنی نە ئنتئخاڤ بأکیت، یا سی د نۊ زئنە کئردئن د نئهاتئر د ئیچئ \"{{int:resetpass-submit-cancel}}\" بأپوٙرنیت.",
+       "resetpass-validity-soft": "رازینە گوڤاردئن توٙ نادیاره:$1\n\n لوطف بأکیت یئ گئل رازینە گوڤاردئن هأنی نە ئنتئخاڤ بأکیت، یا سی د نۊ زئنە کئردئن د نئهاتئر د ئیچئ \"{{int:resetpass-submit-cancel}}\" بأپوٙرنیت.",
+       "passwordreset": "د Ù\86Û\8a Ø¯Ø£Ø¦Ù\86 Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئن",
+       "passwordreset-text-one": "ئÛ\8c Ù\86Ù\88Ù\85 Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\95 Ø³Û\8c Ú¯Ø¦Ø±Ø¦ØªØ¦Ù\86 Û\8cئ Ú¯Ø¦Ù\84 Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ù\85Ù\88ڤأÙ\82أت Ú¤Ø§ Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 ØªÙ\88Ù\99 Ù¾Ù\88ر Ø¨Ø£کیت.",
+       "passwordreset-text-many": "{{PLURAL:$1|یئ گئل د جاگە یا نە سی گئرئتئن رازینە گوڤاردئن موڤأقأتی نە ڤا أنجومانامە گئرئتە بوٙأ پور بأکیت.}}",
+       "passwordreset-disabled": "نۊ کئردئن رازینە گوڤاردئن د ئی ڤیکی ناکونئشگأر بییە.",
+       "passwordreset-emaildisabled": "چیا هأنی کئ هان د أنجومانامە د ئی ڤیکی ناکونئشتگأر بینە.",
        "passwordreset-username": "نوم کاریاری:",
        "passwordreset-domain": "پوشگئر",
-       "passwordreset-capture": "اÙ\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ù\86تÛ\8cجÙ\87 Ù\86Ù\87 Ø¨Ù\88Û\8cÙ\86Û\8cتÙ\88؟",
-       "passwordreset-capture-help": "ار Ø´Ù\85ا Ø§Û\8c Ø¬Ø¹Ù\88Ù\87 Ù\86Ù\87 Ù\88ارسÛ\8c Ø¨Ú©Û\8cد. Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ù\88 Ø®Ù\88ئÛ\8c Ø§Ù\88سÙ\87 Ú©Ù\87 Ø³Û\8c Ú©Ø§Ø±Û\8cار Ú©Ù\84 Ø¨Û\8cÙ\87 Ø¨Ù\88ئÙ\87 Ø¨Ù\88Û\8cÙ\86Û\8cتش.",
+       "passwordreset-capture": "Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ù\86أتÛ\8cجÛ\95 Ù\86Û\95 Ø³Ø¦Ù\84 Ø¨Ø£Ú©Û\8cت؟",
+       "passwordreset-capture-help": "أر Ø´Ù\88Ù\85ا Ø¦Û\8c Ø¬Ø£Ú¤Û\95 Ù\86ئ Ú¤Ø§Ø±Ø¦Ø³Û\8c Ø¨Ø£Ú©Û\8cت.Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 (ڤا Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ù\85Ù\88ڤأÙ\82أتÛ\8c) Ø¬Ù\88Ù\99رÛ\8c Ú©Ø¦ Ø³Û\8c Ú©Ø§Ø±Û\8cارÛ\8cا Ù\87Ø£Ù\86Û\8c Ú©Ø¦Ù\84 Ø¨Û\8cÛ\8cÛ\95 Ø¯Û\8cارÛ\8c Ù\85Û\8cÚ©Û\95.",
        "passwordreset-email": "تیرنئشوٙن أنجومانامە",
-       "passwordreset-emailtitle": "جزئیات حساو ها د {{نوم مالگه}}",
+       "passwordreset-emailtitle": "جوزئیات حئساڤ ها د {{نوم مالگە}}",
        "passwordreset-emailtext-ip": "یه کسی(شات خوتو، وا تیرنشون آی پی $1) سی د نو زنه کردن رازینه گواردن تو د {{SITENAME}}  درحاست کرده($4).\nسی کاریار «$2» یه گل رازینه گواردن موقتی دروس بیه و و هؤمبراور «$3» ئه.\nار تمارزو تو یه بیه ایسه باید بیایت وامین سامونه و یه گل رازینه گواردن هنی بهاییت\nرازینه گواردن شما د طیل {{PLURAL:$5|یه رو|$5 رو}} باطل بوئه.\n\nار کس هنی چنی درحاستی کرده یا یه که شما رازینه گواردن دمایی خوتونه د ویر اوردیت و تر نمیهایت ونه آلشت بیئت، می تونیت د ای پیغوم تیه پوشی بکیت و همو رازینه گواردن دمایی نه وه کار به ونیت.",
        "passwordreset-emailtext-user": "کاریار $1 د {{SITENAME}} د نو زنه کردن رازینه گواردن شمانه د{{SITENAME}} ($4) کرده. {{PLURAL:$3|حساو|حساویا}} کاریاری که هان د هار د وا ای تیرنشون انجومانامه ها د ارتواط:\n\n$2\n\n{{PLURAL:$3|ای رازینه گواردن موقت|ای رازینه گواردنیا موقت}} تا {{PLURAL:$5|یه رو|$5 رو}} باطل بوئه.\nار کس هنی چنی درحاستی کرده یا یه که شما رازینه گواردن دمایی خوتونه د ویر اوردیت و تر نمیهایت ونه آلشت بیئت، می تونیت د ای پیغوم تیه پوشی بکیت و همو رازینه گواردن دمایی نه وه کار به ونیت.",
        "passwordreset-emailelement": "نوم کاریاری: $1\nرازینه گواردن موقتی: $2",
        "resettokens": "تازه کردن نشونه یا",
        "resettokens-text": "شما سی صلا دئن دسرسی وه رسینه یا خصوصی که ها د حساو ایچنی تو می تونیت دیارگریا نه د نو زنه بکیت.\n\nشما اوسنی واس ای کار بکیت که رسینه یا شما سی یه کسی تر بئر بیه یا د حساو شما چل بیه.",
        "resettokens-no-tokens": "هیژ نشونه ای سی تازه کردن نئ.",
-       "resettokens-tokens": "Ù\86Ø´Ù\88Ù\86Ù\87 یا:",
-       "resettokens-token-label": "$1 (ارزشت ØªØ§Ø²Ù\87: $2)",
+       "resettokens-tokens": "Ù\86ئشÙ\88Ù\99Ù\86Û\95 یا:",
+       "resettokens-token-label": "$1 (أرزاÛ\8cئشت ØªØ§Ø²Û\95: $2)",
        "resettokens-watchlist-token": "دیارگر سی حردنی تورگه(اتم/آر اس اس) سی [[ویجه:سیل برگ|آلشت دئن بلگه یا د سیل برگتو]]",
        "resettokens-done": "نشونه یا تازه بیه.",
        "resettokens-resetbutton": "نشونه یا انتخاو بیه تازه بوئن",
        "bold_tip": "نیسسه توپر بيه",
        "italic_sample": "نیسسه كج كوله",
        "italic_tip": "نیسسه كج كوله",
-       "link_sample": "داسÙ\88Ù\86 Ù\87Ù\88Ù\85 Ù¾Û\8cÙ\88ند",
-       "link_tip": "هوم پیوند مینجایی",
+       "link_sample": "داسÙ\88Ù\99Ù\86 Ù\87Ù\88Ù\85 Ù¾Ø¦Û\8cڤأند",
+       "link_tip": "هوم پئیڤأند مینجایی",
        "extlink_sample": "http://www.example.com داسون هوم پیوند",
        "extlink_tip": "هوم پیوند خارجی(د ویر داشتو)",
        "headline_sample": "سرخط نیسسه",
        "nowiki_sample": "د ایچه یه گل نیسسه بی شلک وارد بکید",
        "nowiki_tip": "شلک ویکی نه ندید بگر",
        "image_sample": "Example.jpg",
-       "image_tip": "جاÙ\86Û\8cا Ú\86ار Ù\82ر Ú¯Ø±ØªÙ\87",
+       "image_tip": "جاÙ\86Û\8cا Ú\86ار Ù\82ئر Ú¯Ø¦Ø±Ø¦ØªÛ\95",
        "media_sample": "Example.ogg",
-       "media_tip": "جانیا هوم پیوند",
-       "sig_tip": "اÙ\85ضا Ø´Ù\85ا Ù\88ا گاتدیس",
-       "hr_tip": "خط Ø¢Ø³Ù\88 Ù\88Ù\86Ù\87(سÙ\88ا Ø³Ù\88ا Ù\88Ù\87 Ú©Ø§Ø± Ø¨Û\8cئرشÙ\88)",
-       "summary": "چكسته",
-       "subject": "موضو/سر خط:",
-       "minoredit": "يه ويرايشت كؤچكيه",
-       "watchthis": "ديئن ای بلگه",
-       "savearticle": "اÙ\85اÛ\8cÛ\8cÙ\87 Ú©Ø±Ø¯Ù\86 Ø¨Ù\84Ú¯Ù\87",
+       "media_tip": "جانیا هوم پئیڤأند",
+       "sig_tip": "ئÙ\85ضا Ø´Ù\88Ù\85ا Ú¤ا گاتدیس",
+       "hr_tip": "خأط Ø¢Ø³Ù\88Ù\99 Ú¤Ø£Ù\86Û\95(جئگا Ø¬Ø¦Ú¯Ø§ Ú¤Ø¦ Ú©Ø§Ø± Ú¯Ø¦Ø±Ø¦ØªØ¦Ù\86)",
+       "summary": "چئکئسە",
+       "subject": "ذاسوٙن/سأرتال:",
+       "minoredit": "یە یئ گئل ڤیرایئشت کوچئکە",
+       "watchthis": "دیئن ئی بألگە",
+       "savearticle": "ئÙ\85اÛ\8cÛ\95 Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Ø¨Ø£Ù\84Ú¯Û\95",
        "preview": "پيش سئيل",
-       "showpreview": "Ù¾Ù\8aØ´ Ø³Û\8cÙ\84 Ù\86Ø´Ù\88Ù\86 Ø¨Ù\8aئÙ\87",
-       "showdiff": "آلشتيانه نشون بيئه",
+       "showpreview": "Ù\86ئشÙ\88Ù\99 Ø¯Ø£Ø¦Ù\86 Ù¾Û\8cØ´ Ø³Ø¦Û\8cÙ\84",
+       "showdiff": "نئشوٙ دأئن آلئشت کاریا",
        "blankarticle": "<strong>زنئار:</strong> بلگه ای که شما دروس کردیته حالیه.\nار شما د نو ری \"{{int:savearticle}}\" بپورنیت, بلگه وه شکل که هیچ مینونه ای دش نبا دروس بوئه.",
        "anoneditwarning": "<strong>زئنار:</strong> شما هنی نیوماته وامین. تیرنشون آی پی شما هر گاتی که آلشتی راس بکیت سی کل خلک دیاره. ار <strong>[$1 روئیت وامین]</strong> یا <strong>[$2 یه گل حساو کاریاری راس بکیت]</strong>، ویرایشتیا شما وه نوم کاریاری خوتون دیاری می که، و وا چیا بیتر هنی.",
        "anonpreviewwarning": "<em>شما نیومائته وامین. تیرنشون آی پی شما د ویرگار ویرایشت ای بلگه اماییه بوئه.</em>",
        "selfredirect": "<strong>هشدار:</strong> شما د حال و بار آلشت دئن لا بلگه وه خوش هیئن.\nشایت دال اشتوایی سی آلشت دئن لا نه انتخاو کردیته، یا شایت بلگه نه اشتوایی ویرایشت می کیت.\n\nار ری \"{{int:savearticle}}\" دوبار بپورنیت، آلشت دئن لا دروس بوئه.",
        "missingcommenttext": "لطفن د ایچه ویر و باور بیئتو",
        "missingcommentheader": "<strong>د ویر ونا:</strong> شما هنی یه گل موضوع/سرخط سی ای ویر و باور نها اماییه نکردیته.\nار شما د نو د ری\"{{int:savearticle}}\" بپورنیت, ویرایشت شما حالی اماییه بوئه.",
-       "summary-preview": "چکسته پیش سیل:",
+       "summary-preview": "چئکئسە پیش سئیل:",
        "subject-preview": "پیش سیل موضو سرخط",
        "previewerrortext": "یه گل خطا د گاتی که شما میهاستیت یه گل پیش سیل د آلشتیاتو داشتوین پیش اومائه.",
        "blockedtitle": "کاریار نهاگری بیه",
        "confirmedittext": "شما واس دما ویرایشت کردن بلگه یا تیرنشون انجومانامه تونه پشت راس بکیت.\nلطفا یه گل تیرنشون خو سی [[Special:اولویتیا|اولویتیا کاریار]] بنیت.",
        "nosuchsectiontitle": "نبوئه بشخ پیدا بوئه",
        "nosuchsectiontext": "شما سی ویرایشت کردن جایی که وجود ناره تلاش کردیته.\nشات وه اوسه که شما بلگه نه می دیئته جا وه جا بیه یا پاکسا بیه.",
-       "loginreqtitle": "وامین اومائن لازمه",
-       "loginreqlink": "وا مین اومائن",
+       "loginreqtitle": "ڤامین ئوٙمائن لازئمە",
+       "loginreqlink": "ڤامین ئوٙمائن",
        "loginreqpagetext": "$1 لطف بکید بلگه یا هنی نه بوینیت",
-       "accmailtitle": "رازینه گواردن کل بی",
+       "accmailtitle": "رازینە گوڤاردئن کئل بی",
        "accmailtext": "یه گل رازینه گواردن شامسکی سی[[چک چنه کاریار:$1|$1]] سی $2 کل بیه.بوئه وه نه د گات وه کار بستن بلگه اومائن وامین د <em>[[Special:آلشت دئن رازینه گواردن|آلشت دئن رازینه گواردن]]</em>  آلشت دئه بوئه.",
-       "newarticle": "تازه",
+       "newarticle": "تازە",
        "newarticletext": "شما وادما هوم پیوندی هئیت که وجود ناره.\nسی راس کردن بلگه.شرو د نیسنن مئن جعوه هاری بکید(سیل[$1 ] سی دونسمنی بیشتر بکید).\nار شما سی اشتوا کردن هایئن ایچه، دگمه وادما رئتن دوارته نیئر تونه بپورنیت.",
        "anontalkpagetext": "----",
        "noarticletext": "د تازه یا د ای بلگه نیسسه نی.\nشما می تونیت د[[Special:Search/{{PAGENAME}}|بگردید]] د ای بلگه یا د بلگیا هنی یا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} د هنی پی جوری بوئه]</span>، <span class=\"plainlinks\">[{{fullurl:{{FULLPAGENAME}}|action=edit}} یای ای بلگه نه ویرایشت بکید]</span>.",
        "sitejspreview": "<strong>د ویر داشتوئیت که شما فقط می تونیت ای ای جاوا اسکریپت نه فقط پیش سیل بکیت. وه د ایسنی هنی اماییه نبیه!</strong>",
        "userinvalidcssjstitle": "<strong>زئنار:</strong> پوسه \"$1\" نیئش.\nسی اس اس جاونه و بلگه یا جاوا اسکریپت  سرون وا حرف کؤچک نه وه کار بسته، همچنو{{ns:کاریار}}:فو/وکتور.سی اس اس چی د ضد{{ns:کاریار}}:فو/وکتور. سی اس اسه.",
        "updated": "(تازه بيه)",
-       "note": "'''نيسنن:'''",
+       "note": "'''نیسأنئن:'''",
        "previewnote": "فقط ای پیش سیل د ویرتو با.\nآلشتیاتو هنی اماییه نبیه.",
        "continue-editing": "رو د راساگه ویرایشت",
        "previewconflict": "ورگشت پیش سیل د نیسسه د راساگه وارو ویرایشت چی شکل دیار بیین بوئه ار شما وه نه سی اماییه کردن انتخاو بکیت.",
        "session_fail_preview_html": "<strong>د بدبختی ما سی یه که رسینه یا جلسه مونه د دس دئیمه نمی تونیم کار پردازشت ویرایشت شمانه انجوم بیئمو.</strong>\nلطفن هنی تلاش بکیت.\n\n<em>سی یه که {{نوم دیارگه}} یه گل ردیف اچ تی ام ال کنشتگر بیه داره، پیش سیل سی یه که د دس حمله یا جاوا اسکریپ د امون با قام کرده بیه..</em>\n\n<strong>ار وه گات قانونی تلاش سی ویرایشته،لطفا د نو تلاش بکیت.</strong>\nار هنی کار وه دروس کار نکرد،[[Special:UserLogout|اومائن وه در]] نه ازمایشت بکیت و د نو بیایت وامین.",
        "token_suffix_mismatch": "<strong>ویرایشتیا شما سی یه که دووارته نئر شما نیسسه یا نقطه نیائن نه د رازینه امنیتی ویرایشت د یک تیچسه.</strong>\nویرایشت سی یه که د خراو بیئن نیسسه بلگه نهاگری با رد بیه.\nای رخ ون د گاتیایی پیش میا که شما د یه گل رسینه جا پروکسی استفاده می کیت.",
        "edit_form_incomplete": "<strong>پاره ای د ویرایشتا وه رسینه جا نمی رسن، هنی وارسی بکیت سی یه که بوینیت ویرایشتیا شما خوئه و هنی تلاش بکیت .</strong>",
-       "editing": "د حال و بال ويرايشت$1",
-       "creating": "راس كردن $1",
-       "editingsection": "د حال و بال ویرایشت$1(بشخ)",
-       "editingcomment": "د حال و بال ویرایشت$1(بهرجا تازه)",
-       "editconflict": "تضاد Ø¯ Ù\88Û\8cراÛ\8cشت:$1",
+       "editing": "د حال و بال ڤیرایئشت $1",
+       "creating": "راس کئردئن $1",
+       "editingsection": "د حال و بال ڤیرایئشت $1 (بأرجا$1)",
+       "editingcomment": "د حال و بال ڤیرایئشت $1 (بأرجا تازە)",
+       "editconflict": "رÛ\8c Ú¤Ø¦ Ø±Û\8c Ú©Ø§Ø±Û\8c Ø¯ Ú¤Û\8cراÛ\8cئشت: $1",
        "explainconflict": "داوسه که شما شرو د ویرایشت ای بلگه کردیته، یه نفر هنی ای بلگه نه آلشت دئه.\nراساگه وارو نیسسه بلگه نیسسه نه چی یه که وجود داشتوه د ور میئره.\nآلشتیا شما د نیسسه هاری نشو دئه هئ.\nشما با آلشتیاتونه د نیسسه که هئش یکی بکید.\nفقط متنی که ها د رو د گاتی که شما\"{{رقم:اماییه کاری گوتار}}\" نه گزارشت می کید اماییه بوئه",
-       "yourtext": "Ù\86Û\8cسسÙ\87 Ø´ما",
-       "storedversion": "دوواره دیئن انبار بیه.",
+       "yourtext": "Ù\86Û\8cسئسÛ\95 Ø´Ù\88ما",
+       "storedversion": "ڤانئیأری ئمایە بییە",
        "nonunicodebrowser": "<strong>زئنار:دووارته نئر شما وا نیسسه یا یونیکد سازگاری ناره.</strong>\nیه گل راحل وه کار گرته بیه سی یه که شما بلگه یا نه وا امنیت ویرایشت بکیت:\nنیسه یا غیر-ASCII  د پایه رازینه یا 16 تایی دتو نشو دئه بوئه.",
        "editingold": "<strong>زئنار:شما داریت یه گل وانئری نا به هنگوم بیه نه سی ای بلگه ویرایشت می کید</strong>\nار شما ونه اماییه بکیت،هر آلشتی که د اول سی ای وانئری انجوم بیه گم بوئه.",
-       "yourdiff": "Ù\81رخÙ\8aا",
+       "yourdiff": "Ù\81أرخÛ\8cا",
        "copyrightwarning": "لطفن د ویرتو با که ایچه فرض بوئه که همه هومیاریا شما وا{{SITENAME}} د شکل «$2» درتیچ بوئن(سی چیا تر روئیت وه $1).\nار نمیهایت که که نیسسه یاتو که فره ویرایشت بینه و دلحا درتیچ بان، د ایچه کلشو نکیت.<br />\nهمچنو شما داریت وه ایما قول میئیت که خوتو ونونن نویسنیته، یا ونه د یه گل سرچشمه آزاد وا بئرکرد همگونی یا چی وه ؤرداشتیته.\n'''کاریایی که حق درتیچسن (copyright) دارن بی صلا کل نکیت!'''",
        "copyrightwarning2": "لطفن د ویرتو با که ایچه فرض بوئه که همه هومیاریا شما وا{{SITENAME}} د شکل «$2» درتیچ بوئن(سی چیا تر روئیت وه $1).\nار نمیهایت که که نیسسه یاتو که فره ویرایشت بینه و دلحا درتیچ بان، د ایچه کلشو نکیت.<br />\nهمچنو شما داریت وه ایما قول میئیت که خوتو ونونن نویسنیته، یا ونه د یه گل سرچشمه آزاد وا بئرکرد همگونی یا چی وه ؤرداشتیته.\n'''کاریایی که حق درتیچسن (copyright) دارن بی صلا کل نکیت!'''",
        "longpageerror": "<strong>خطا:نیسسه شما  {{PLURAL:$1|یه کلوبایت|$1 کلوبایت}}  درازی نه دئه، که ونو د بیشرونه انازه{{PLURAL:$2|یه کلوبایت|$2 کلوبایت}} گپترن.</strong>\nنبوئه وه اماییه با.",
        "templatesused": "{{PLURAL:$1|چوئه|چوئه یا}} د ای بلگه وه کار گرته بیه:",
        "templatesusedpreview": "{{PLURAL:$1|چوئه|چوئه یا}}استفاده بیه د ای پیش سیل:",
        "templatesusedsection": "{{PLURAL:$1|چوئه|چوئه یا}} وه کار گرته بیه د ای بخش:",
-       "template-protected": "(پر Ù\88 Ù¾Û\8cÙ\85 Ø¨Ù\8aÙ\87)",
-       "template-semiprotected": "نصم و نیمه پر و پیم بیه",
+       "template-protected": "(پأر Ù\88 Ù¾Û\8cÙ\85 Ø¨Û\8cÛ\8cÛ\95)",
+       "template-semiprotected": "(نئصم و نیمە پأر و پیم بییە)",
        "hiddencategories": "ای بلگه يه اندوم د{{PLURAL:$1|1 hidden category|$1 hidden categories}}: هئ",
        "edittools-upload": "-",
        "nocreatetext": "{{نوم مالگه}} سی راس کردن بلگه یا تازه محدود بیه.\nشما تونید روئیت وادما و بلگه ای که هئیش ویرایشت بکید ، یا [[ویجه:وامین اومائن کاریار|بیایت وامین یا یه گل حساو بسازیت]].",
-       "nocreate-loggedin": "Ø´Ù\85ا Ø­Ù\82 Ù\86ارÛ\8cت  Ú©Ù\87 Ø¨Ù\84Ú¯Ù\87 Û\8cا ØªØ§Ø²Ù\87 Ù\86Ù\87 Ø±Ø§Ø³ Ø¨Ú©Û\8cد.",
+       "nocreate-loggedin": "Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Ø±Ø§Ø³ Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 ØªØ§Ø²Û\95 Ù\86Û\95 Ù\86ارÛ\8cت.",
        "sectioneditnotsupported-title": "ویرایشت بهرجا حامین داری نبوئه",
-       "sectioneditnotsupported-text": "ویرایشت بهرجایی د ای بلگه نئیش.",
+       "sectioneditnotsupported-text": "ڤیرایئشت بأرجایی د ئی بألگە نیئش.",
        "permissionserrors": "خطا اجازه دئین",
        "permissionserrorstext": "شما حق ناریت ونه انجوم بیئت, سی{{PLURAL:$1|دلیل|دلیلیا}} نهایی:",
        "permissionserrorstext-withaction": "شما سی $2 اجازه ناریت\nسی نهاگری {{PLURAL:$1|دلیل|دلیلیا}}:",
        "recreate-moveddeleted-warn": "'''زنهار شما بلگه ای که وادما پاکسا بیه هنی راس کردیته'''\nشما باید دونسه بایت که آیا هنی سی نها گرتن ویرایشت ای بلگه خوئه.\nپاکسا بیئن و جمشت سی ای بلگه سی فراغتتو آماده بیه:",
        "moveddeleted-notice": "ای بلگه پاکسا بیه.\nپاکسا بین و جمشت ای بلگه سی سرچشمه دئین آماده بیه",
-       "log-fulllog": "دیئن همه پهرستنومه یا",
+       "log-fulllog": "دیئن هأمە پئهئرستنوٙمە یا",
        "edit-hook-aborted": "ویرایشت وا قلاو نهاگری بیه.\nهیچ توضیئ سیش نئ.",
        "edit-gone-missing": "نبوئه ای بلگه نه وه هنگوم بکیت.\nوه نظر میا که وه پاکسا بیه.",
-       "edit-conflict": "مخالفت نه ویرایشت بکید",
+       "edit-conflict": "ری ڤئ ری کاری د ڤیرایئشت.",
        "edit-no-change": "سی یه که آلشتیا د یه گل نیسسه دروس بیه د ویرایشت شما تیه پوشی بیه.",
-       "postedit-confirmation-created": "بلگه دروس بیه.",
-       "postedit-confirmation-restored": "بلگه د نو اماییه بیه.",
-       "postedit-confirmation-saved": "ویرایشتتو اماییه بی",
+       "postedit-confirmation-created": "بألگە دوروس بییە.",
+       "postedit-confirmation-restored": "بألگە د نۊ ئمایە بییە.",
+       "postedit-confirmation-saved": "ڤیرایئشتئتوٙ ئمایە بی.",
        "edit-already-exists": "نبوئه یه گل بلگه تازه راس بکید.\nوه هئیش.",
        "defaultmessagetext": "نیسسه پیغوم پیش فرض",
        "content-failed-to-parse": "د یک تیچیسن چیا مئن $2 د مدل $1:$3",
        "currentrev-asof": "آخري وانئری چی $1",
        "revisionasof": "دوواره ديئن $1",
        "revision-info": "دوواره سیل بیه چی $1 وا $2",
-       "previousrevision": "اصلاح دمايی",
-       "nextrevision": "تازه تری وانئری",
-       "currentrevisionlink": "آخرÛ\8c Ù\88اÙ\86ئری",
-       "cur": "تازه باو",
-       "next": "نيایی",
-       "last": "دمايی",
-       "page_first": "اÙ\88لی",
-       "page_last": "آخر",
+       "previousrevision": "ڤانئیأری دئمایی←",
+       "nextrevision": "ڤانئیأری تازە تئر",
+       "currentrevisionlink": "آخئرÛ\8c Ú¤Ø§Ù\86ئÛ\8cØ£ری",
+       "cur": "تازە باڤ",
+       "next": "نئهایی",
+       "last": "دئمایی",
+       "page_first": "أڤئلی",
+       "page_last": "آخئر",
        "histlegend": "انتخاو فرخدار:جعویا رادیو نه سی دوواره دیئن و وارسی نشو دار بکید و یا ری رئتن کلیک بکید .<br />\nشرح نوشته: '''({{int:cur}})''' = وا آخری دوواره دیئن فرخ داره '''({{ int:last}})'''= وا دواره دیئن انجوم دئنی فرخ داره  '''{{int:minoreditletter}}''' =ویرایشت کؤچک.",
        "history-fieldset-title": "ویرگار دوارته نیئری",
        "history-show-deleted": "فقط پاكسا بيه",
        "rev-deleted-diff-view": "وانئری ای بلگه <strong>پاکسا بیه</strong>.\nجزئیات هان د  [{{fullurl:{{#Special:Log}}/پاکسا کردن|بلگه={{نوم کامل بلگه}}}} پهرستنومه پاکساکردن].",
        "rev-suppressed-diff-view": "وانئری بلگه <strong>پاکساگری</strong>.\nجزئیات هان د  [{{fullurl:{{#Special:Log}}/پاکساگری کردن|بلگه={{نوم کامل بلگه}}}} پهرستنومه پاکساگری کردن].",
        "rev-delundel": "آلشت حال و بال ديئن",
-       "rev-showdeleted": "Ù\86Ø´Ù\88 Ø¯ئن",
+       "rev-showdeleted": "Ù\86ئشÙ\88Ù\99 Ø¯Ø£ئن",
        "revisiondelete": "پاکسا کردن/زنه کردن وانئریا",
        "revdelete-nooldid-title": "وانیری تمارزی بیه نامعتوره",
        "revdelete-nooldid-text": "شما وانئریا حاسنی نه سی انجوم دئن ای کار ره ون تیاری نکردیته، یا وانئریا تیارگر بیه وجود نارن، یا یه که شما میهایت وانئری ایسنی نه قام بکیت.",
        "revdelete-no-file": "جانیا تیار بیه وجود ناره.",
        "revdelete-show-file-confirm": "شما د دل میهایت که وانئری پاکسا بیه ای جانیا نه بونیت \"<nowiki>$1</nowiki>\" د $2 تا $3؟",
-       "revdelete-show-file-submit": "هری",
+       "revdelete-show-file-submit": "Ù\87أرÛ\8c",
        "revdelete-selected-text": "{{PLURAL:$1|وانیری گل گر بیه|وانیری گل گر بیه}} د [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|وانیری گل گر بیه|وانیری گل گر بیه}} د [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|پهرستنومه رخ ونیا انتخاو بیه|پهرستنومه رخ ونیا انتخاو بیه}}:",
        "revdelete-radio-unset": "دیینی",
        "revdelete-suppress": "پاکساگری کردن رسینه یا سی دیوونداریا و کسونا تر",
        "revdelete-unsuppress": "محدودیتیانه د وانیریا امباربیه جا وه جا بکید",
-       "revdelete-log": "دلیل:",
+       "revdelete-log": "دألیل:",
        "revdelete-submit": "سی {{PLURAL:$1|وانیری|وانیریا}} انتخاو بیه وه کار بوریتو",
        "revdelete-success": "'''دیئن وانیری وه خوئی وه هنگوم بی.'''",
        "revdelete-failure": "'''دیئن وانیری وه خوئی وه هنگوم نبی:'''$1",
        "logdelete-success": "پهرستنومه دیار بیین د خوئی میزونکاری بی.",
        "logdelete-failure": "پهرستنومه دیار بیین نبوئه میزونکاری با. $1",
        "revdel-restore": "آلشت حال و بال ديئن",
-       "pagehist": "ويرگار بلگه",
-       "deletedhist": "ویرگار پاکسا بیه",
+       "pagehist": "ڤیرگار بألگە",
+       "deletedhist": "ڤیرگار پاکسا بییە",
        "revdelete-hide-current": "خطا د قام کردن چی که ها د ویرگار $2 ساعت $1: ای نسقه، نسقه ایسنی یه و نبوئه نهوش بکیت.",
        "revdelete-show-no-access": "خطا د قام کردن چیی که ها د ویرگار $2 ساعت $1: ای نسقه نشون «مئن تنگلا بیئن» داره و شما نمی تونیت وه ش دسرسی داشتویت.",
        "revdelete-modify-no-access": "خطا د قام کردن چیی که ها د ویرگار $2 ساعت $1: ای نسقه نشون «مئن تنگلا بیئن» داره و شما نمی تونیت وه ش دسرسی داشتویت.",
        "mergehistory-autocomment": " [[:$1]]وا[[:$2]] یکی بیه",
        "mergehistory-comment": " [[:$1]]وا[[:$2]] یکی بیه:$3",
        "mergehistory-same-destination": "سرچشمه و بلگه یا مقصد نبوئه یکی بوئن",
-       "mergehistory-reason": "دليل:",
+       "mergehistory-reason": "دأليل:",
        "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
        "mergelog": "سریک سازی پهرستنومه",
        "revertmerge": "بی لوئه",
        "prefs-edits": "شماره ویرایشتا:",
        "prefsnologintext2": "لطف بکیت بیایت وامین و ترجیحات خوتونه آلشت بئیت.",
        "prefs-skin": "پوس",
-       "skin-preview": "پیش سیل",
+       "skin-preview": "پیش سئیل",
        "datedefault": "هیچ ترجیحات دش نئ",
        "prefs-labs": "گزینشتیا ازماشتی",
-       "prefs-user-pages": "بلگه یا کاریار",
-       "prefs-personal": "پروفایل کاریار",
-       "prefs-rc": "Ø¢Ù\84شتÛ\8cا ØªØ§Ø²Ù\87 Ø¨Ø§Ù\88",
-       "prefs-watchlist": "سیل برگ",
-       "prefs-editwatchlist": "ویرایشت سیل برگ",
+       "prefs-user-pages": "بألگە کاریار",
+       "prefs-personal": "پوروفایل کاریار",
+       "prefs-rc": "Ø¢Ù\84ئشتÛ\8cا Ø¦Û\8cسئÙ\86Û\8c",
+       "prefs-watchlist": "سئیل بأرگ",
+       "prefs-editwatchlist": "ڤیرایئشت سئیل بأرگ",
        "prefs-editwatchlist-label": "داده یا نه د سیل برگ خوتو ویرایشت بکیت:",
        "prefs-editwatchlist-edit": "داسونانه سیل بکیت و ونونه د سیل برگ خوتو ورداریت",
        "prefs-editwatchlist-raw": "ویرایشت ردیفی سیل برگ",
        "prefs-rendering": "شلک و ری",
        "saveprefs": "اماییه كردن",
        "restoreprefs": "د نو زنه کردن همه میزونکاریا پیش فرض(د همه جایا)",
-       "prefs-editing": "د حال و بال ویرایشت",
+       "prefs-editing": "د حال و بال ڤیرایئشت",
        "rows": "رديفيا:",
        "columns": "ستينا:",
        "searchresultshead": "پی جوری",
        "timezoneregion-indian": "جهوناو هند",
        "timezoneregion-pacific": "جهوناو آروم",
        "allowemail": "انجومانامه نه سی کاریاریا هنی کنشتگر کو",
-       "prefs-searchoptions": "پی جوری",
+       "prefs-searchoptions": "پئی جوٙری",
        "prefs-namespaces": "نوم جایا",
        "default": "پيش فرض",
        "prefs-files": "جانیایا",
        "prefs-common-css-js": " سی اس اس/جاوا اسکریپت بهر بیه سی همه پوسه یا:",
        "prefs-reset-intro": "شما می تونیت ای بلگه سی د نو زنه کردن ترجیحات خوت وه شکل تیارگه پیش فرض وه کار بوونیت.\nیه ورئشت پذیر نئ.",
        "prefs-emailconfirm-label": "پش راست کردن انجومانامه:",
-       "youremail": "اÙ\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87:",
+       "youremail": "Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95:",
        "username": "{{GENDER:$1|نوم کاریاری}}:",
        "prefs-memberingroups": "{{GENDER:$2|اندوم}}  {{PLURAL:$1|گرویا|گرویا}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "گات ثوت نام:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "نوم راستكی:",
-       "yourlanguage": "زون:",
+       "yourlanguage": "زÙ\88Ù\99Ù\86:",
        "yourvariant": "مینونه آلشتگر زون:",
        "prefs-help-variant": "قسه وری انتخاوی شما سی نمائشت مینونه بلگه یا د ای ویکی.",
        "yournick": "امضا تازه:",
        "gender-male": "وه(پیا) بلگه یا ویکی نه ویرایشت می که",
        "gender-female": "وه(زئنه)بلگه یا ویکی نه ویرایشت می که",
        "prefs-help-gender": "انجوم دئن ای میزونکاری دل به هاییه.\nنرم افزار سی هشاره درست وه جنسیت و گوتن شما سی کسونا تر د شکل درست وه کار بسن یه گل دستور زون یه نه وه کار می بنه.\nای دونسمنیا سی کل خلک دیارن.",
-       "email": "اÙ\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87",
+       "email": "Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95",
        "prefs-help-realname": "نوم راستکی دل به حائه.\nار شما ونه وارد بکیت د گات واگردونی وه آرنگیاتو و نسوت دئن ونو وه خوتو نوم راستکی وه کار گرته بوئه.",
        "prefs-help-email": "تیرنشون ایمیل دل بهاییه.اما سی وایافت رازینه گواردن دش میهایتش.شما باید رازینه گواردنتونه د ویر بوریت",
        "prefs-help-email-others": "شما می تونید سی پیوند گرتن تو وا نهایین انجومانامه مین یه هوم پیوند د بلگه کاریاری یا بلگه چک چنه تو انتخاو بکید.تیرنشون انجومانامه تونه د گاتی که کاریاریا هنی وا تو پیوند می گرن دیار نی.",
        "prefs-help-email-required": "تیرنشون انجومانامه واس با.",
        "prefs-info": "دونسمنیا اولیه",
        "prefs-i18n": "جهون ولاتمنی",
-       "prefs-signature": "امضا",
+       "prefs-signature": "ئمضا",
        "prefs-dateformat": "شلک گات",
        "prefs-timeoffset": "جا وه جایی گاتی",
        "prefs-advancedediting": "گزینه یا خلکمنی",
        "prefs-editor": "ويرايشتگر",
-       "prefs-preview": "پیش سیل",
+       "prefs-preview": "پیش سئیل",
        "prefs-advancedrc": "گزینه یا پیشکرده",
        "prefs-advancedrendering": "گزینه یا پیشکرده",
        "prefs-advancedsearchoptions": "گزینه یا پیشکرده",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "تعارض دسرسیا کاریاری! لطف بکیت یه گل وارسی انجوم بئیت و آلشتانه پشت راس بکیت.",
        "userrights-removed-self": "شما د خوئی حقوق خوتونه ؤرداشتیته، چی یه که مثلا شما تر نمی تونیت وه ای بلگه دسرسی داشتویت.",
-       "group": "گرو",
+       "group": "جأرغە",
        "group-user": "کاریاریا",
-       "group-autoconfirmed": "کاریاریا خود پش راست بیه",
-       "group-bot": "بتیا",
-       "group-sysop": "دÛ\8cÙ\88Ù\88Ù\86داریا",
+       "group-autoconfirmed": "کاریاریا خود پوشت راس بییە",
+       "group-bot": "بوتیا",
+       "group-sysop": "سأردÛ\8cÚ¤Ù\88Ù\99Ù\86Ú©اریا",
        "group-bureaucrat": "بروکراتیا",
-       "group-suppress": "تیه پایا",
-       "group-all": "(همه)",
+       "group-suppress": "تیە پایا",
+       "group-all": "(هأمە)",
        "group-user-member": "{{GENDER:$1|کاریار}}",
        "group-autoconfirmed-member": "{{GENDER:$1|کاریار خودانجومکار}}",
        "group-bot-member": "{{حنس:$1|بوت}}",
index a11fbb5..ad82920 100644 (file)
        "protectedinterface": "Šiame puslapyje yra apsaugotas nuo piktnaudžiavimo programinės įrangos sąsajos tekstas. Norėdami pridėti ar pakeisti vertimus visose wiki, naudokite [//translatewiki.net/ translatewiki.net] MediaWiki vertimų projektą.",
        "editinginterface": "'''Dėmesio:''' Jūs redaguojate puslapį, kuris yra naudojamas programinės įrangos sąsajos tekste. Pakeitimai šiame puslapyje taip pat pakeis naudotojo sąsajos išvaizdą ir kitiems naudotojams šiame wiki.",
        "translateinterface": "Kad pridėtumėte vertimus visoms wiki, naudokitės  [//translatewiki.net/ translatewiki.net] – projektu, skirtu MediaWiki vertimams į vietines kalbas.",
-       "cascadeprotected": "Šis puslapis buvo apsaugotas nuo redagavimo, kadangi jis yra įtrauktas į {{PLURAL:$1|šį puslapį, apsaugotą|šiuos puslapius, apsaugotus}} „pakopinės apsaugos“ pasirinktimi:\n$2",
+       "cascadeprotected": "Šis puslapis buvo apsaugotas nuo redagavimo, kadangi jis yra įtrauktas į {{PLURAL:$1|šį puslapį, kuris yra apsaugotas|šiuos puslapius, kurie yra apsaugoti}} su „pakopinės apsaugos“ parinktimi:\n$2",
        "namespaceprotected": "Jūs neturite teisės redaguoti puslapių '''$1''' srityje.",
        "customcssprotected": "Jūs neturite teisės keisti šį CSS puslapį, nes jame yra kito naudotojo asmeniniai nustatymai.",
        "customjsprotected": "Jūs neturite teisės keisti šį JavaScript puslapį, nes jame yra kito naudotojo asmeniniai nustatymai.",
        "creating": "Kuriama $1",
        "editingsection": "Taisomas $1 (skyrelis)",
        "editingcomment": "Taisomas $1 (naujas skyrius)",
-       "editconflict": "Jūsų pakeitimai negali būti įrašyti dėl redagavimo konflikto. Ar norite išspręsti konfliktą rankiniu būdu?",
+       "editconflict": "Redaguoti konfliktą: $1",
        "explainconflict": "Kažkas kitas jau pakeitė puslapį nuo tada, kai jūs pradėjote jį redaguoti.\nViršutiniame tekstiniame lauke pateikta šiuo metu esanti puslapio versija.\nJūsų keitimai pateikti žemiau esančiame lauke.\nJums reikia sujungti jūsų pakeitimus su esančia versija.\nKai paspausite „{{int:savearticle}}“, bus įrašytas '''tik''' tekstas viršutiniame tekstiniame lauke.",
        "yourtext": "Jūsų tekstas",
        "storedversion": "Išsaugota versija",
        "readonlywarning": "'''Įspėjimas: Duomenų bazė buvo užrakinta techninei profilaktikai, todėl šiuo metu negalėsite išsaugoti savo pakeitimų. Siūlome nusikopijuoti tekstą į tekstinį failą ir vėliau jį čia išsaugoti.'''\n\nJą užrakinusio administratoriaus paaiškinimas: $1",
        "protectedpagewarning": "'''Dėmesio: Šis puslapis yra užrakintas taip, kad jį redaguoti gali tik administratoriaus teises turintys naudotojai.'''\nNaujausias įrašas žurnale yra pateiktas žemiau:",
        "semiprotectedpagewarning": "'''Pastaba:''' Šis puslapis buvo užrakintas, jį gali redaguoti tik registruoti naudotojai.\nNaujausias įrašas žurnale yra pateiktas žemiau:",
-       "cascadeprotectedwarning": "'''Dėmesio''': Šis puslapis buvo užrakintas taip, kad tik naudotojai su administratoriaus teisėmis galėtų jį redaguoti, nes jis yra įtrauktas į {{PLURAL:$1|šį puslapį, apsaugotą|šiuos puslapius, apsaugotus}} „pakopinės apsaugos“ pasirinktimi:",
+       "cascadeprotectedwarning": "<strong>Dėmesio:</strong> Šis puslapis buvo užrakintas taip, kad tik naudotojai su administratoriaus teisėmis galėtų jį redaguoti, nes jis yra įtrauktas į {{PLURAL:$1|šį puslapį, apsaugotą|šiuos puslapius, apsaugotus}} „pakopinės apsaugos“ pasirinktimi:",
        "titleprotectedwarning": "'''Dėmesio: Šis puslapis buvo užrakintas taip, kad tik [[Special:ListGroupRights|kai kurie naudotojai]] galėtų jį sukurti.'''\nNaujausias įrašas žurnale yra pateiktas žemiau:",
        "templatesused": "{{PLURAL:$1|Šablonas|Šablonai}}, naudojami puslapyje:",
        "templatesusedpreview": "{{PLURAL:$1|Šablonas|Šablonai}}, naudoti šioje peržiūroje:",
        "changecontentmodel-nodirectediting": "$1 turinio modelis nepalaiko tiesioginio redagavimo",
        "log-name-contentmodel": "Turinio modelio kaitos istorija",
        "log-description-contentmodel": "Įvykiai susiję su puslapio turinio modeliu",
-       "logentry-contentmodel-change": "$1 atnaujino puslapio $3 turinio modelį iš $4 į $5",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|atnaujino}} puslapio $3 turinio modelį iš $4 į $5",
        "logentry-contentmodel-change-revertlink": "atšaukti",
        "logentry-contentmodel-change-revert": "atšaukti",
        "protectlogpage": "Rakinimų sąrašas",
        "protect-locked-blocked": "Jūs negalite keisti apsaugos lygių, kol esate užbluokuotas.\nČia yra dabartiniai nustatymai puslapiui '''$1''':",
        "protect-locked-dblock": "Apsaugos lygiai negali būti pakeisti dėl duomenų bazės užrakinimo.\nČia yra dabartiniai nustatymai puslapiui '''$1''':",
        "protect-locked-access": "Jūsų paskyra neturi teisių keisti puslapių apsaugos lygių.\nČia yra dabartiniai nustatymai puslapiui '''$1''':",
-       "protect-cascadeon": "Šis puslapis dabar yra apsaugotas, nes jis yra įtrauktas į {{PLURAL:$1|šį puslapį, apsaugotą|šiuos puslapius, apsaugotus}} „pakopinės apsaugos“ pasirinktimi. Jūs galite pakeisti šio puslapio apsaugos lygį, bet tai nepaveiks pakopinės apsaugos.",
+       "protect-cascadeon": "Šis puslapis dabar yra apsaugotas, nes jis yra įtrauktas į {{PLURAL:$1|šį puslapį, apsaugotą|šiuos puslapius, apsaugotus}} „pakopinės apsaugos“ parinktimi.\nPuslapio apsaugos lygių pakeitimai neturės poveikio pakopinei apsaugai.",
        "protect-default": "Leisti visiems naudotojams",
        "protect-fallback": "Reikalauti „$1“ teisės",
        "protect-level-autoconfirmed": "Blokuoti naujai prisiregistravusius ir neregistruotus naudotojus",
        "pageinfo-robot-index": "Leidžiama",
        "pageinfo-robot-noindex": "Neleidžiama",
        "pageinfo-watchers": "Puslapio stebėtojų skaičius",
-       "pageinfo-visiting-watchers": "Skaičius puslapio stebėtojų, lankančių pastaruosius pakeitimus",
+       "pageinfo-visiting-watchers": "Skaičius puslapio stebėtojų, kurie aplankė pastaruosius pakeitimus",
        "pageinfo-few-watchers": "Mažiau nei $1 {{PLURAL:$1|stebėtojas|stebėtojų}}",
        "pageinfo-few-visiting-watchers": "Gali būti arba nebūti stebėtojų, lankančių pastaruosius pakeitimus",
        "pageinfo-redirects-name": "Nukreipimai į šį puslapį",
        "htmlform-cloner-create": "Pridėti dar",
        "htmlform-cloner-delete": "Pašalinti",
        "htmlform-cloner-required": "Bent viena reikšmė būtina.",
+       "htmlform-title-badnamespace": "[[:$1]] nėra \"{{ns:$2}}\" vardų srityje.",
+       "htmlform-title-not-creatable": "\"$1\" nėra tinkamas sukūrimui puslapio pavadinimas",
+       "htmlform-title-not-exists": "[[:$1]] neegzistuoja.",
+       "htmlform-user-not-exists": "<strong>$1</strong> neegzistuoja.",
+       "htmlform-user-not-valid": "<strong>$1</strong> nėra tinkamas naudotojo vardas.",
        "sqlite-has-fts": "$1 su visatekstės paieškos palaikymu",
        "sqlite-no-fts": "$1 be visatekstės paieškos palaikymo",
        "logentry-delete-delete": "$1 {{GENDER:$2|ištrynė}} puslapį $3",
        "logentry-merge-merge": "$1 {{GENDER:$2|sujungė}} $3 į $4 (versijas iki $5)",
        "logentry-move-move": "$1 pervadino puslapį $3 į $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|perkėlė}} puslapį $3 į $4 be nukreipimo",
-       "logentry-move-move_redir": "$1 {{GENDER:$2|perkėlė}} puslapį $3 į $4 per nukreipimą",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|perkėlė}} puslapį $3 į $4 (anksčiau buvo nukreipiamasis)",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|pervadino}} puslapį $3 į $4, nesukurdamas nukreipimo",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|payžėmjo}} versiją $4 puslapio $3 kaip patruliuojama",
        "logentry-patrol-patrol-auto": "$1 automatiškai {{GENDER:$2|pažymėjo}} versiją $4 puslapio $3 kaip patruliuojama",
index 5da3700..c9a50df 100644 (file)
        "tooltip-pt-logout": "Hidio",
        "tooltip-pt-createaccount": "Amporisihana mafy ianao hanokatra kaonty ary miditra; na dia izany aza, tsy voatery atao izany.",
        "tooltip-ca-talk": "resaka momba io takelaka io",
-       "tooltip-ca-edit": "Azonao atao no manova n'ity pejy ity.\nAmpesao ny topi-maso aloha no mihatiry.",
+       "tooltip-ca-edit": "Hanova ity pejy ity",
        "tooltip-ca-addsection": "hanomboka fizaràna vaovao",
        "tooltip-ca-viewsource": "Voaaro ilay pejy. Fa afaka itanao ny voatotiny.",
        "tooltip-ca-history": "Ny revision natao tamin'ity pejy ity",
        "watchlisttools-view": "pejy arahako maso",
        "watchlisttools-edit": "Jereo sy ovao ny lisitra ny pejy fanaraha-maso",
        "watchlisttools-raw": "Ovay ilay pejy arahako maso amizao",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|resaka]])",
        "duplicate-defaultsort": "'''Tandremo''' : manitsaka ny sort key taloha \"$1\" ilay sort key ankehitriny \"$2\".",
        "version": "Versiona",
        "version-extensions": "Fanitarana nampidirina",
index 07b93dc..c8dec2a 100644 (file)
        "htmlform-title-badnamespace": "[[:$1]] не се наоѓа во именскиот простор „{{ns:$2}}“.",
        "htmlform-title-not-creatable": "Насловот „$1“ не може да се создава",
        "htmlform-title-not-exists": "[[:$1]] не постои.",
+       "htmlform-user-not-exists": "<strong>$1</strong> не постои.",
+       "htmlform-user-not-valid": "<strong>$1</strong> не претставува важечко корисничко име.",
        "sqlite-has-fts": "$1 со поддршка за пребарување по цели текстови",
        "sqlite-no-fts": "$1 без поддршка за пребарување по цели текстови",
        "logentry-delete-delete": "$1 {{GENDER:$2|ја избриша}} страницата $3",
index f5373b2..ef2c4a0 100644 (file)
        "protectedinterface": "ഈ താൾ ഈ വിക്കിയുടെ സോഫ്റ്റ്‌വെയറിന്റെ സമ്പർക്കമുഖ എഴുത്തുകൾ നൽകുന്നു, അതുകൊണ്ട് ദുരുപയോഗം തടയാൻ ബന്ധിക്കപ്പെട്ടിരിക്കുന്നു. എല്ലാ വിക്കികൾക്കുമായി പരിഭാഷ കൂട്ടിച്ചേർക്കാനോ, പരിഭാഷയിൽ മാറ്റം വരുത്താനോ, ദയവായി മീഡിയവിക്കി പ്രാദേശീകരണ പദ്ധതിയായ [//translatewiki.net/ translatewiki.net] ഉപയോഗിക്കുക.",
        "editinginterface": "<strong>മുന്നറിയിപ്പ്:<strong> സോഫ്റ്റ്‌വെയറിൽ സമ്പർക്കമുഖം നിലനിർത്തുന്ന താളാണു താങ്കൾ തിരുത്തുവാൻ പോകുന്നത്.\nഈ താളിൽ താങ്കൾ വരുത്തുന്ന മാറ്റങ്ങൾ ഉപയോക്താക്കൾ വിക്കി കാണുന്ന വിധത്തെ മാറ്റിമറിച്ചേക്കാം.",
        "translateinterface": "എല്ലാ വിക്കികൾക്കും ഉപയോഗിക്കാനാവുംവിധം പരിഭാഷകൾ കൂട്ടിച്ചേർക്കാനും മാറ്റംവരുത്താനും മീഡിയവിക്കി സന്ദേശങ്ങളുടെ പ്രാദേശികവത്കരണ പദ്ധതിയായ [//translatewiki.net/ translatewiki.net] ഉപയോഗിക്കുവാൻ താല്പര്യപ്പെടുന്നു.",
-       "cascadeprotected": "നിർഝരിത (cascading) സൗകര്യം ഉപയോഗിച്ച് തിരുത്തൽ നടത്തുന്നതിനു സം‌രക്ഷണം ഏർപ്പെടുത്തിയിട്ടുള്ള {{PLURAL:$1|താഴെ കൊടുത്തിട്ടുള്ള താളിന്റെ|താഴെ കൊടുത്തിട്ടുള്ള താളുകളുടെ}} ഭാഗമാണ്‌ ഈ താൾ. അതിനാൽ ഈ താൾ തിരുത്താൻ സാധിക്കില്ല:\n$2",
+       "cascadeprotected": "\"നിർഝരിത\" (cascading) സൗകര്യം ഉപയോഗിച്ച് തിരുത്തൽ നടത്തുന്നതിനു സം‌രക്ഷണം ഏർപ്പെടുത്തിയിട്ടുള്ള {{PLURAL:$1|താഴെ കൊടുത്തിട്ടുള്ള താളിന്റെ|താഴെ കൊടുത്തിട്ടുള്ള താളുകളുടെ}} ഭാഗമാണ്‌ ഈ താൾ. അതിനാൽ ഈ താൾ തിരുത്താൻ സാധിക്കില്ല:\n$2",
        "namespaceprotected": "'''$1''' നാമമേഖലയിലുള്ള താളുകൾ തിരുത്താൻ താങ്കൾക്ക് അനുവാദമില്ല.",
        "customcssprotected": "ഈ സി.എസ്.എസ്. താളിൽ മറ്റൊരു ഉപയോക്താവിന്റെ സ്വകാര്യസജ്ജീകരണങ്ങൾ ഉൾക്കൊള്ളുന്നു, അതിനാൽ താങ്കൾക്ക് ഈ താൾ തിരുത്താൻ അനുവാദമില്ല.",
        "customjsprotected": "ഈ ജാവാസ്ക്രിപ്റ്റ് താളിൽ മറ്റൊരു ഉപയോക്താവിന്റെ സ്വകാര്യസജ്ജീകരണങ്ങൾ ഉൾക്കൊള്ളുന്നു, അതിനാൽ താങ്കൾക്ക് ഈ താൾ തിരുത്താൻ അനുവാദമില്ല.",
        "readonlywarning": "'''മുന്നറിയിപ്പ്: ഡേറ്റാബേസ് പരിപാലനത്തിനു വേണ്ടി ബന്ധിച്ചിരിക്കുന്നു, അതുകൊണ്ട് താങ്കളിപ്പോൾ വരുത്തിയ മാറ്റങ്ങൾ സേവ് ചെയ്യാൻ സാദ്ധ്യമല്ല.''' താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ ഒരു ടെക്സ്റ്റ് ഫയലിലേക്ക് പകർത്തി (കോപ്പി & പേസ്റ്റ്) പിന്നീടുപയോഗിക്കുന്നതിനായി കരുതിവക്കാൻ താല്പര്യപ്പെടുന്നു. ഡേറ്റാബേസ് ബന്ധിച്ച അഡ്മിനിസ്ട്രേറ്റർ നൽകിയ വിശദീകരണം: $1",
        "protectedpagewarning": "'''മുന്നറിയിപ്പ്:  ഈ താൾ കാര്യനിർവാഹക പദവിയുള്ളവർക്കു മാത്രം തിരുത്താൻ സാധിക്കാവുന്ന തരത്തിൽ സം‌രക്ഷിക്കപ്പെട്ടിരിക്കുന്നു.''' അവലംബമായി രേഖകളിൽ ലഭ്യമായ ഏറ്റവും പുതിയ വിവരം താഴെ നൽകിയിരിക്കുന്നു:",
        "semiprotectedpagewarning": "'''ശ്രദ്ധിക്കുക:'''അംഗത്വമെടുത്തിട്ടുള്ളവർക്കുമാത്രം തിരുത്താൻ സാധിക്കുന്ന വിധത്തിൽ ഈ താൾ സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്നു. അവലംബമായി രേഖകളിലെ ഏറ്റവും പുതിയ വിവരം താഴെ കൊടുത്തിരിക്കുന്നു:",
-       "cascadeprotectedwarning": "'''മുന്നറിയിപ്പ്:''' ഈ താൾ കാര്യനിർവാഹക അവകാശമുള്ളവർക്കു മാത്രം തിരുത്തുവാൻ സാധിക്കുന്ന വിധത്തിൽ സം‌രക്ഷിക്കപ്പെട്ടിട്ടുള്ളതാണ്‌. {{PLURAL:$1|താൾ|താളുകൾ}} കാസ്കേഡ് സം‌രക്ഷണം ചെയ്തപ്പോൾ അതിന്റെ ഭാഗമായി സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ളതാണ്‌ ഈ താൾ.",
+       "cascadeprotectedwarning": "<strong>മുന്നറിയിപ്പ്:</strong> ഈ താൾ കാര്യനിർവാഹക അവകാശമുള്ളവർക്കു മാത്രം തിരുത്തുവാൻ സാധിക്കുന്ന വിധത്തിൽ സം‌രക്ഷിക്കപ്പെട്ടിട്ടുള്ളതാണ്‌. ഇനിക്കൊടുക്കുന്ന {{PLURAL:$1|താൾ|താളുകൾ}} നിർഝരിത(cascade) സം‌രക്ഷണം ചെയ്തപ്പോൾ അതിന്റെ ഭാഗമായി സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ളതാണ്‌ ഈ താൾ:",
        "titleprotectedwarning": "'''മുന്നറിയിപ്പ്: [[Special:ListGroupRights|പ്രത്യേക അവകാശമുള്ള]] ഉപയോക്താക്കൾക്ക് മാത്രം സൃഷ്ടിക്കാൻ സാധിക്കുന്ന വിധത്തിൽ ഈ താൾ സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്നു.''' അവലംബമായി രേഖകളിൽ ലഭ്യമായ ഏറ്റവും പുതിയ വിവരം താഴെ നൽകിയിരിക്കുന്നു:",
        "templatesused": "ഈ താളിൽ ഉപയോഗിച്ചിരിക്കുന്ന {{PLURAL:$1|ഫലകം|ഫലകങ്ങൾ}}:",
        "templatesusedpreview": "ഈ പ്രിവ്യൂവിൽ ഉപയോഗിച്ചിരിക്കുന്ന {{PLURAL:$1|ഫലകം|ഫലകങ്ങൾ}}:",
        "uploaddisabledtext": "പ്രമാണം അപ്‌ലോഡ് ചെയ്യുന്നതു സാദ്ധ്യമല്ലാതാക്കിയിരിക്കുന്നു.",
        "php-uploaddisabledtext": "പി.എച്ച്.പി.യിൽ പ്രമാണ അപ്‌‌ലോഡുകൾ സാദ്ധ്യമല്ലാതാക്കിയിരിക്കുന്നു.\nദയവായി file_uploads ക്രമീകരണങ്ങൾ പരിശോധിക്കുക.",
        "uploadscripted": "ഈ പ്രമാണത്തിൽ വെബ് ബ്രൗസർ തെറ്റായി വ്യാഖ്യാനിച്ചേക്കാവുന്ന എച്ച്.റ്റി.എം.എൽ. അല്ലെങ്കിൽ സ്ക്രിപ്റ്റ് കോഡ് ഉണ്ട്.",
+       "upload-scripted-pi-callback": "എക്സ്.എം.എൽ.-സ്റ്റൈൽഷീറ്റ് പ്രോസസിങ് നിർദ്ദേശങ്ങളുള്ള പ്രമാണം അപ്‌ലോഡ് ചെയ്യാനാവില്ല.",
        "uploaded-script-svg": "അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. പ്രമാണത്തിൽ സ്ക്രിപ്റ്റ് ചെയ്യാവുന്ന ഭാഗമായ \"$1\" കണ്ടെത്തി.",
        "uploaded-hostile-svg": "അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. പ്രമാണത്തിൽ സുരക്ഷിതമല്ലാത്ത സി.എസ്.എസ്. സ്റ്റൈൽ ഭാഗം കണ്ടെത്താനായി.",
+       "uploaded-event-handler-on-svg": "എസ്.വി.ജി. പ്രമാണങ്ങളിൽ എവന്റ്-ഹാൻഡ്‌ലർ ആട്രിബ്യൂട്ടുകൾ <code>$1=\"$2\"</code>  എന്ന് സജ്ജീകരിച്ചിരിക്കുന്നവ അനുവദിച്ചിട്ടില്ല.",
+       "uploaded-href-attribute-svg": "എസ്.വി.ജി. പ്രമാണങ്ങളിൽ എച്ച്റെഫ് (href) ആട്രിബ്യൂട്ടുകൾ പ്രാദേശികമല്ലാത്ത ലക്ഷ്യങ്ങളിലേക്ക് <code>&lt;$1 $2=\"$3\"&gt;</code> എന്നുള്ളവ (ഉദാ: http://, javascript:, തുടങ്ങിയവ) അനുവദിച്ചിട്ടില്ല.",
        "uploaded-image-filter-svg": "യു.ആർ.എൽ. ഉൾപ്പെടെയുള്ള ചിത്ര അരിപ്പ : <code>&lt;$1 $2=\"$3\"&gt;</code>, അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. ചിത്രത്തിൽ കണ്ടെത്തി.",
        "uploadscriptednamespace": "ഈ എസ്.വി.ജി. പ്രമാണത്തിൽ ഉപയോഗിക്കാൻ പാടില്ലാത്ത നാമമേഖലയായ \"$1\" ഉണ്ട്",
        "uploadinvalidxml": "അപ്‌ലോഡ് ചെയ്ത പ്രമാണത്തിലെ എക്സ്.എം.എൽ. പാഴ്സ് ചെയ്യാൻ കഴിയില്ല.",
        "htmlform-cloner-create": "കൂടുതൽ ചേർക്കുക",
        "htmlform-cloner-delete": "നീക്കം ചെയ്യുക",
        "htmlform-cloner-required": "കുറഞ്ഞത് ഒരു വിലയെങ്കിലും നൽകിയിരിക്കണം.",
+       "htmlform-title-badnamespace": "[[:$1]] ഉള്ളത് \"{{ns:$2}}\" നാമമേഖലയിലല്ല.",
+       "htmlform-title-not-creatable": "\"$1\" സൃഷ്ടിക്കാനാവുന്ന തലക്കെട്ടല്ല.",
+       "htmlform-title-not-exists": "[[:$1]] നിലവിലില്ല.",
+       "htmlform-user-not-exists": "<strong>$1</strong> നിലവിലില്ല.",
+       "htmlform-user-not-valid": "<strong>$1</strong> സാധുതയുള്ള ഉപയോക്തൃനാമമല്ല.",
        "sqlite-has-fts": "പൂർണ്ണ-എഴുത്ത് തിരച്ചിൽ പിന്തുണയുള്ള $1",
        "sqlite-no-fts": "പൂർണ്ണ-എഴുത്ത് തിരച്ചിൽ പിന്തുണയില്ലാത്ത $1",
        "logentry-delete-delete": "$3 എന്ന താൾ $1 {{GENDER:$2|മായ്ച്ചിരിക്കുന്നു}}",
index abcdd1a..90d1f90 100644 (file)
        "htmlform-cloner-create": "Azzecca 'e cchiù",
        "htmlform-cloner-delete": "Lèva",
        "htmlform-cloner-required": "Servesse al minimo nu valore.",
+       "htmlform-title-badnamespace": "[[:$1]] nun è dint'a lu namespace \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "\"$1\" nun è nu titolo criabbele 'e paggena",
        "htmlform-title-not-exists": "[[:$1]] nun esiste.",
+       "htmlform-user-not-exists": "<strong>$1</strong> nun esiste.",
+       "htmlform-user-not-valid": "<strong>$1</strong> nun è nu nomme buono.",
        "sqlite-has-fts": "$1 cu supporto 'e ricerche full-text",
        "sqlite-no-fts": "$1 senza supporto 'e ricerche full-text",
        "logentry-delete-delete": "$1 {{GENDER:$2|scancellaje}} 'a paggena $3",
index 6f9f927..970497a 100644 (file)
        "yourdiff": "Różnice",
        "copyrightwarning": "Wkład na {{SITENAME}} jest udostępniany na licencji $2 (szczegóły w $1). Jeśli nie chcesz, żeby Twój tekst był dowolnie zmieniany przez każdego i rozpowszechniany bez ograniczeń, nie umieszczaj go tutaj.<br />\nZapisując swoją edycję, oświadczasz, że ten tekst jest Twoim dziełem lub pochodzi z materiałów dostępnych na warunkach ''domeny publicznej'' lub kompatybilnych.\n'''PROSZĘ NIE WPROWADZAĆ MATERIAŁÓW CHRONIONYCH PRAWEM AUTORSKIM BEZ POZWOLENIA WŁAŚCICIELA!'''",
        "copyrightwarning2": "Wszelki wkład na {{SITENAME}} może być edytowany, zmieniany lub usunięty przez innych użytkowników.\nJeśli nie chcesz, żeby Twój tekst był dowolnie zmieniany przez każdego i rozpowszechniany bez ograniczeń, nie umieszczaj go tutaj.<br />\nZapisując swoją edycję, oświadczasz, że ten tekst jest Twoim dziełem lub pochodzi z materiałów dostępnych na warunkach ''domeny publicznej'' lub kompatybilnych (zobacz także $1).\n'''PROSZĘ NIE WPROWADZAĆ MATERIAŁÓW CHRONIONYCH PRAWEM AUTORSKIM BEZ POZWOLENIA WŁAŚCICIELA!'''",
+       "editpage-cannot-use-custom-model": "Model zawartości tej strony nie może być zmieniony.",
        "longpageerror": "'''Błąd! Wprowadzony przez Ciebie tekst ma {{PLURAL:$1|1 kilobajt|$1 kilobajty|$1 kilobajtów}}. Długość tekstu nie może przekraczać {{PLURAL:$2|1 kilobajt|$2 kilobajty|$2 kilobajtów}}. Tekst nie może być zapisany.'''",
        "readonlywarning": "'''Uwaga! Baza danych została zablokowana do celów administracyjnych. W tej chwili nie można zapisać nowej wersji strony. Jeśli chcesz, może skopiować ją do pliku, aby móc zapisać ją później.'''\n\nAdministrator, który zablokował bazę, podał następujące wyjaśnienie: $1",
        "protectedpagewarning": "'''Uwaga! Możliwość modyfikacji tej strony została zabezpieczona. Mogą ją edytować jedynie użytkownicy z uprawnieniami administratora.'''\nOstatni wpis z rejestru jest pokazany poniżej.",
        "semiprotectedpagewarning": "'''Uwaga!''' Ta strona została zabezpieczona i tylko zarejestrowani użytkownicy mogą ją edytować.\nOstatni wpis z rejestru jest pokazany poniżej.",
-       "cascadeprotectedwarning": "'''Uwaga!''' Ta strona została zabezpieczona i tylko użytkownicy z uprawnieniami administratora mogą ją edytować. Strona ta jest zawarta na {{PLURAL:$1|następującej stronie, która została zabezpieczona|następujących stronach, które zostały zabezpieczone}} z włączoną opcją dziedziczenia:",
+       "cascadeprotectedwarning": "<strong>Uwaga:<strong> Ta strona została zabezpieczona i tylko użytkownicy z uprawnieniami administratora mogą ją edytować. Została ona osadzona w {{PLURAL:$1|następującej stronie, która została zabezpieczona|następujących stronach, które zostały zabezpieczone}} z włączoną opcją dziedziczenia:",
        "titleprotectedwarning": "'''Uwaga! Utworzenie strony o tej nazwie zostało zabezpieczone. Do jej utworzenia wymagane są [[Special:ListGroupRights|specyficzne uprawnienia]].'''\nOstatni wpis z rejestru jest pokazany poniżej.",
        "templatesused": "{{PLURAL:$1|Szablon użyty|Szablony użyte}} w tym artykule:",
        "templatesusedpreview": "{{PLURAL:$1|Szablon użyty|Szablony użyte}} w tym podglądzie:",
        "unusedimages": "Nieużywane pliki",
        "wantedcategories": "Brakujące kategorie",
        "wantedpages": "Najpotrzebniejsze strony",
-       "wantedpages-summary": "Najczęściej linkowane nieistniejące strony, z wyłączeniem stron, do których linkują wyłącznie przekierowania. Lista nieistniejących stron, do których linkują przekierowania, znajduje się na [[{{#special:BrokenRedirects}}]].",
+       "wantedpages-summary": "Lista najczęściej linkowanych, nieistniejących stron, z wyłączeniem stron, do których linkują wyłącznie przekierowania. By zobaczyć listę nieistniejących stron, do których linkują przekierowania, zobacz [[{{#special:BrokenRedirects}}|listę zerwanych przekierowań]].",
        "wantedpages-badtitle": "Nieprawidłowy tytuł wśród wyników – $1",
        "wantedfiles": "Potrzebne pliki",
        "wantedfiletext-cat": "Następujące pliki są używane, ale nie istnieją. Pliki z obcych repozytoriów mogą być wymienione pomimo istnienia. Takie fałszywe wyniki zostaną <del>przekreślone</del>. Ponadto strony, które osadzają pliki, które nie istnieją, są wymienione w [[:$1]].",
        "sessionfailure": "Wystąpił problem z weryfikacją zalogowania.\nPolecenie zostało anulowane, aby uniknąć przechwycenia sesji.\nNaciśnij „wstecz” w przeglądarce, przeładuj stronę, po czym ponownie wydaj polecenie.",
        "changecontentmodel": "Edycja modelu zawartości strony",
        "changecontentmodel-title-label": "Tytuł strony",
+       "changecontentmodel-model-label": "Nowy model zawartości",
        "changecontentmodel-reason-label": "Powód:",
+       "changecontentmodel-success-title": "Model zawartości został zmieniony",
+       "changecontentmodel-success-text": "Typ zawartości [[:$1]] został zmieniony.",
+       "changecontentmodel-cannot-convert": "Zawartość [[:$1]] nie może być przekształcona do typu $2.",
+       "changecontentmodel-nodirectediting": "Model zawartości $1 nie obsługuje bezpośredniego edytowania",
+       "log-name-contentmodel": "Rejestr zmian modelu zawartości",
        "logentry-contentmodel-change-revertlink": "Przywróć",
        "logentry-contentmodel-change-revert": "Przywróć",
        "protectlogpage": "Zabezpieczone",
        "htmlform-title-badnamespace": "[[:$1]] nie znajduje się w przestrzeni nazw „{{ns:$2}}”.",
        "htmlform-title-not-creatable": "Nie można użyć „$1” do utworzenia tytułu strony",
        "htmlform-title-not-exists": "[[:$1]] nie istnieje.",
+       "htmlform-user-not-exists": "<strong>$1</strong> nie istnieje.",
+       "htmlform-user-not-valid": "<strong>$1</strong> nie jest prawidłową nazwą użytkownika.",
        "sqlite-has-fts": "$1 z obsługą pełnotekstowego wyszukiwania",
        "sqlite-no-fts": "$1 bez obsługi pełnotekstowego wyszukiwania",
        "logentry-delete-delete": "$1 {{GENDER:$2|usunął|usunęła}} stronę $3",
index e6952c3..b207f10 100644 (file)
        "yourdiff": "Diferense",
        "copyrightwarning": "Che a ten-a për piasì da ment che tute le contribussion a {{SITENAME}} as consìdero dàite sota a na licensa ëd la sòrt $2 (che a varda $1 për avèj pì 'd detaj).\nSe a veul nen che sò test a peula esse modificà e distribuì da qualsëssìa përson-a sensa gnun-a limitassion ëd gnun-a sòrt, che a lo buta pa ambelessì.<br />\nËn mandand ës test-sì chiel as fa garant sota soa responsabilità che ël test a l'ha scrivusslo despërchiel, ò pura che a l'ha tracopialo da na sorgiss ëd pùblich domini, ò da n'àutra sorgiss dla midema sòrt.\n'''Anserì mai dël material coatà da drit d'autor sensa avèj n'autorisassion për felo!'''",
        "copyrightwarning2": "Për piasì, che a ten-a da ment che tute le contribussion a {{SITENAME}} a peulo esse modificà ò scancelà da d'àutri contributor. Se a veul nen che lòn che a scriv a ven-a modificà sensa limitassion ëd gnun-a sòrt, che a lo manda nen ambelessì.<br />\nAnt l'istess temp, ën mandand dël material un as pija la responsabilità dë dì che a l'ha scrivusslo daspërchiel, ò pura che a l'ha copialo da na sorgiss ëd domini pùblich, ò pura da 'nt n'àutra sorgiss dla midema sòrt (che a varda $1 për avèj pì d'anformassion).\n'''Che a manda pa dël material coata da drit d'autor sensa avèj avù ël përmess ëd felo!'''",
+       "editpage-cannot-use-custom-model": "Ël model ëd contnù ëd sa pàgina a peul nen esse modificà.",
        "longpageerror": "'''EROR: Ël test che a l'ha mandà a l'é longh {{PLURAL:$1|un kilobyte|$1 kilobytes}}, che a resta pì che ël lìmit màssim {{PLURAL:$2|d'un kilobyte|ëd $2 kilobyte}}.''' Parèj as peul pa salvesse.",
        "readonlywarning": "'''Avis: La base ëd dat a l'é stàita blocà për manutension, e donca a podrà pa salvesse soe modìfiche tut sùbit.'''\nA peul esse che a-j ven-a còmod copiesse via sò test e ancoless-lo an n'archivi ëd test e goernelo për pi tard.\n\nL'aministrator che a l'ha fàit ël blocagi a l'ha dàit costa spiegassion: $1",
        "protectedpagewarning": "'''Avis: costa pàgina-sì a l'é stàita protegiùa an manera che mach j'utent con la qualìfica da aministrator a peulo feje dle modìfiche.'''\nL'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:",
        "semiprotectedpagewarning": "'''Nòta:''' Costa pàgina-sì a l'é stàita blocà an manera che mach j'utent registrà a peulo modifichela.\nL'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:",
-       "cascadeprotectedwarning": "'''Tension:''' Sta pàgina a l'é stàita blocà an manera che mach j'utent con la qualìfica da aministrator a peulo modifichela, për via che a l'é comprèisa an {{PLURAL:$1|costa pàgina-sì|an coste pàgine-sì}} ch'a l'han ël sistema ëd protession a cascada:",
+       "cascadeprotectedwarning": "<strong>Tension:</strong> Sta pàgina a l'é stàita blocà an manera che mach j'utent con la qualìfica da aministrator a peulo modifichela, për via che a l'é comprèisa an {{PLURAL:$1|costa pàgina-sì|an coste pàgine-sì}} ch'a l'han ël sistema ëd protession a cascada:",
        "titleprotectedwarning": "'''Avis: sta pàgina-sì a l'é stàita blocà an manera che a-i é dabzògn ëd [[Special:ListGroupRights|drit specìfich]] për creela.'''\nL'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:",
        "templatesused": "{{PLURAL:$1|Stamp}} dovrà da costa pàgina-sì:",
        "templatesusedpreview": "{{PLURAL:$1|Stamp}} dovrà an costa preuva:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Oget veuid",
        "content-json-empty-array": "Tàula veuida",
+       "duplicate-args-warning": "<strong>Atension:</strong> [[:$1]] a arciama [[:$2]] con pe che un valor për ël paràmeter \"$3\". Mach l'ùltim valor fornì a sarà dovrà.",
        "duplicate-args-category": "Pàgine ch'a deuvro d'argoment dobi ant j'arceste dë stamp",
        "duplicate-args-category-desc": "La pàgina a conten cj'arceste dë stamp che deuvro ëd duplicà d'argoment, tanme <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Atension:''' Costa pàgina a l'ha tròpe ciamà costose a le fonsions d'anàlisi sintàtica.\n\nA dovrìa essnie men che {{PLURAL:$2|$2}}, adess a-i na j'é {{PLURAL:$1|$1}}.",
        "badsig": "Soa firma a l'é nen giusta, che a controla j'istrussion HTML.",
        "badsiglength": "Sò stranòm a l'é tròp longh.\nA deuv nen esse pì longh che $1 {{PLURAL:$1|caràter|caràter}}.",
        "yourgender": "'Me ch'a preferiss esse descrivù?",
-       "gender-unknown": "I preferisso nen dilo",
+       "gender-unknown": "Cand a parlërà ëd chiel, ël programa a dovrërà dle paròle ëd géner neutral, s'a l'é possìbil",
        "gender-male": "Chiel a modìfica dle pàgine dla wiki",
        "gender-female": "Chila a modìfica dle pàgine dla wiki",
        "prefs-help-gender": "Definì coste preferense a l'é opsional.\nËl programa a deuvra sò valor për adressesse a chiel e massionelo a j'àutri an dovrand ël géner gramatical giust.\nCosta anformassion a sarà pùblica.",
        "uploaddisabledtext": "La possibilità ëd carié dj'archivi a l'é staita disabilità.",
        "php-uploaddisabledtext": "Ij cariament d'archivi a son disabilità an PHP.\nPër piasì, ch'a controla l'ampostassion file_uploads.",
        "uploadscripted": "St'archivi-sì a l'ha andrinta chèich-còs (dël còdes HTML ò pura un senari) che a podrìa esse travajà mal da chèich programa ëd navigassion.",
+       "upload-scripted-pi-callback": "Impossìbil carié n'archivi ch'a conten d'anstrussion ëd tratament ëd feuj dë stil XML.",
+       "uploaded-script-svg": "Element ëscrivìbil «$1» trovà ant l'archivi SVG carià.",
+       "uploaded-hostile-svg": "CSS nen sigur trovà ant l'element dë stil ëd n'archivi SVG carià.",
+       "uploaded-event-handler-on-svg": "Fissé dj'atribù ëd gestion d'eveniment <code>$1=\"$2\"</code> a l'é nen përmëttù ant j'archivi SVG.",
+       "uploaded-href-attribute-svg": "J'atribù <code>&lt;$1 $2=\"$3\"&gt;</code> con un bërsaj nen local (për esempi http://, javascript:, e via fòrt) a son nen përmëttù ant j'archivi SVG.",
+       "uploaded-href-unsafe-target-svg": "href ver un bërsaj nen sigur <code>&lt;$1 $2=\"$3\"&gt;</code> trovà ant l'archivi SVG carià.",
+       "uploaded-animate-svg": "Trovà na tichëtta «animate», ch'a podrìa modifiché ël href an dovrand l'atribù «from» <code>&lt;$1 $2=\"$3\"&gt;</code> ant l'archivi SVG carià.",
        "uploadscriptednamespace": "S'archivi SVG a conten në spassi nominal «$1» nen autorisà",
        "uploadinvalidxml": "L'XML ant l'archivi carià a l'ha nen podù esse analisà.",
        "uploadvirus": "St'archivi-sì a l'han andrinta un '''vìrus!''' Detaj: $1",
index b7c6852..6681d50 100644 (file)
        "protectedinterface": "Esta página fornece o texto da interface ao software, e está protegida para prevenir abusos.",
        "editinginterface": "<strong>Aviso:</strong> Está a editar uma página usada para fornecer texto de interface ao software. Alterações a esta página afetarão a aparência da interface de utilizador para os outros utilizadores.",
        "translateinterface": "Para traduções, considere utilizar a [//translatewiki.net/wiki/Main_Page?setlang=pt translatewiki.net], um projeto destinado à tradução do MediaWiki.",
-       "cascadeprotected": "Esta página foi protegida contra edições por estar incluída {{PLURAL:$1|na página listada|nas páginas listadas}} a seguir, ({{PLURAL:$1|página essa que está protegida|páginas essas que estão protegidas}} com a opção de proteção \"em cascata\" ativada):\n$2",
+       "cascadeprotected": "Esta página foi protegida contra edições por estar transcluída {{PLURAL:$1|na página listada|nas páginas listadas}} a seguir, ({{PLURAL:$1|página essa que está protegida|páginas essas que estão protegidas}} com a opção de proteção \"em cascata\" ativada):\n$2",
        "namespaceprotected": "Não tem permissão para editar páginas no domínio '''$1'''.",
        "customcssprotected": "Não tem permissão para editar esta página de CSS porque esta contém as configurações pessoais de outro utilizador.",
        "customjsprotected": "Não tem permissão para editar esta página de JavaScript porque esta contém as configurações pessoais de outro utilizador.",
        "readonlywarning": "'''Aviso: A base de dados foi bloqueada para manutenção, pelo que não poderá gravar a sua edição neste momento.'''\nPode, no entanto, copiar e colar o seu texto num ficheiro de texto e guardá-lo para mais tarde.\n\nO administrador que bloqueou a base de dados forneceu a seguinte explicação: $1",
        "protectedpagewarning": "'''Aviso: Esta página foi protegida para só poder ser editada por administradores.'''\nO último registo é apresentado abaixo para referência:",
        "semiprotectedpagewarning": "'''Nota:''' Esta página foi protegida de modo a que apenas utilizadores registados a possam editar.\nA última entrada no histórico é fornecida abaixo como referência.",
-       "cascadeprotectedwarning": "'''Aviso:''' Esta página está protegida de forma que apenas os administradores possam editá-la, porque se encontra incluída {{PLURAL:$1|na seguinte página protegida|nas seguintes páginas protegidas}} em cascata:",
+       "cascadeprotectedwarning": "<strong>Aviso:</strong> Esta página está protegida de forma que apenas os administradores possam editá-la, porque se encontra transcluída {{PLURAL:$1|na seguinte página protegida|nas seguintes páginas protegidas}} em cascata:",
        "titleprotectedwarning": "'''Aviso: Esta página foi protegida de forma a que [[Special:ListGroupRights|privilégios específicos]] sejam necessários para criá-la.'''\nPara referência, é apresentada abaixo a última entrada do registo:",
        "templatesused": "{{PLURAL:$1|Predefinição utilizada|Predefinições utilizadas}} nesta página:",
        "templatesusedpreview": "{{PLURAL:$1|Predefinição utilizada|Predefinições utilizadas}} nesta antevisão:",
        "protect-locked-blocked": "Não pode alterar níveis de proteção enquanto estiver bloqueado.\nEsta é a configuração presente para a página '''$1''':",
        "protect-locked-dblock": "Não é possível alterar os níveis de proteção, porque a base de dados está bloqueada.\nEsta é a configuração atual para a página '''$1''':",
        "protect-locked-access": "A sua conta não tem permissões para alterar os níveis de proteção de uma página.\nEsta é a configuração atual da página '''$1''':",
-       "protect-cascadeon": "Esta página está atualmente protegida porque está incluída {{PLURAL:$1|na página listada a seguir, a qual|nas páginas listadas a seguir, as quais}} têm a proteção em cascata ativada.\nAlterações feitas ao nível de proteção desta página não afetarão a proteção em cascata.",
+       "protect-cascadeon": "Esta página está atualmente protegida porque está transcluída {{PLURAL:$1|na página listada a seguir, a qual|nas páginas listadas a seguir, as quais}} têm a proteção em cascata ativada.\nAlterações feitas ao nível de proteção desta página não afetarão a proteção em cascata.",
        "protect-default": "Permitir todos os utilizadores",
        "protect-fallback": "Permitir apenas utilizadores com o privilégio de \"$1\"",
        "protect-level-autoconfirmed": "Permitir apenas utilizadores autoconfirmados",
        "htmlform-cloner-create": "Adicionar mais",
        "htmlform-cloner-delete": "Remover",
        "htmlform-cloner-required": "Pelo menos um valor é necessário.",
+       "htmlform-title-badnamespace": "[[:$1]] não se encontra no domínio \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "\"$1\" não é um título que possa ser atribuído a uma página",
        "htmlform-title-not-exists": "[[:$1]] não existe.",
        "sqlite-has-fts": "$1 com suporte de pesquisa de texto completo",
        "sqlite-no-fts": "$1 sem suporte de pesquisa de texto completo",
index cc9dcc6..872a89f 100644 (file)
        "htmlform-title-badnamespace": "Error message shown if the page title provided by the user is not in the required namespace. $1 is the page, $2 is the numerical namespace index.",
        "htmlform-title-not-creatable": "Error message shown if the page title provided by the user is not creatable (a special page). $1 is the page title.",
        "htmlform-title-not-exists": "Error message shown if the page title provided by the user does not exist. $1 is the page title.",
+       "htmlform-user-not-exists": "Error message shown if a user with the name provided by the user does not exist. $1 is the username.",
+       "htmlform-user-not-valid": "Error message shown if the name provided by the user isn't a valid username. $1 is the username.",
        "sqlite-has-fts": "Shown on [[Special:Version]].\nParameters:\n* $1 - version",
        "sqlite-no-fts": "Shown on [[Special:Version]].\nParameters:\n* $1 - version",
        "logentry-delete-delete": "{{Logentry|[[Special:Log/delete]]}}",
index 05f541e..7ec0ccb 100644 (file)
        "pager-older-n": "{{PLURAL:$1|aswan mawk'a 1|aswan mawk'a $1}}",
        "suppress": "Rikurpariy",
        "querypage-disabled": "Kay sapaq p'anqamanqa ama nisqam allinta llamk'anapaq.",
+       "apihelp": "API yanapa",
        "booksources": "Liwrukunapi pukyukuna",
        "booksources-search-legend": "Liwrukunapi pukyukunata maskay",
        "booksources-search": "Maskay",
index 296b621..256c3ba 100644 (file)
        "protectedinterface": "Эта страница содержит интерфейсное сообщение программного обеспечения. Во избежание вандализма её изменение запрещено.\nЧтобы добавить или изменить перевод этого сообщения во всех вики, пожалуйста, используйте сайт локализации MediaWiki [//translatewiki.net/ translatewiki.net]",
        "editinginterface": "<strong>Внимание:</strong> Вы редактируете страницу, содержащую текст интерфейса программного обеспечения.\nЕё изменение повлияет на внешний вид интерфейса для других пользователей этой вики.",
        "translateinterface": "Чтобы добавить или изменить перевод этого сообщения, пожалуйста, используйте сайт локализации MediaWiki [//translatewiki.net/ translatewiki.net].",
-       "cascadeprotected": "Страница защищена от изменений, поскольку она включена в {{PLURAL:$1|1=следующую страницу, для которой|следующие страницы, для которых}} включена каскадная защита:\n$2",
+       "cascadeprotected": "Ð\94аннаÑ\8f Ñ\81траница защищена от изменений, поскольку она включена в {{PLURAL:$1|1=следующую страницу, для которой|следующие страницы, для которых}} включена каскадная защита:\n$2",
        "namespaceprotected": "У вас нет разрешения редактировать страницы в пространстве имён «$1».",
        "customcssprotected": "У вас нет разрешения редактировать эту CSS-страницу, так как она содержит личные настройки другого участника.",
        "customjsprotected": "У вас нет разрешения редактировать эту JavaScript-страницу, так как она содержит личные настройки другого участника.",
        "readonlywarning": "'''Предупреждение. База данных заблокирована в связи с процедурами обслуживания, поэтому вы не можете записать ваши изменения прямо сейчас.'''\nВозможно, вам следует скопировать этот текст в текстовый файл, чтобы сохранить его на будущее.\n\nАдминистратор, заблокировавший базу данных, оставил следующее объяснение: $1",
        "protectedpagewarning": "'''Предупреждение. Эта страница защищена от изменений, её могут редактировать только участники с полномочиями администраторов.'''\nНиже для справки приведена последняя запись журнала:",
        "semiprotectedpagewarning": "'''Замечание.''' Эта страница была защищена; редактировать её могут только зарегистрированные участники.\nНиже для справки приведена последняя запись журнала:",
-       "cascadeprotectedwarning": "'''Предупреждение:''' Данную страницу могут редактировать только участники с административными правами, поскольку она включена {{PLURAL:$1|1=в следующую страницу, для которой|в следующие страницы, для которых}} включена каскадная защита:",
+       "cascadeprotectedwarning": "<strong>Предупреждение:</strong> Данную страницу могут редактировать только участники с административными правами, поскольку она включена {{PLURAL:$1|1=в следующую страницу, для которой|в следующие страницы, для которых}} включена каскадная защита:",
        "titleprotectedwarning": "'''Предупреждение.  Это название защищено. Создать эту страницу могут только участники с [[Special:ListGroupRights|соответствующими правами]].'''\nНиже для справки приведена последняя запись журнала:",
        "templatesused": "{{PLURAL:$1|1=Шаблон, используемый|Шаблоны, используемые}} на этой странице:",
        "templatesusedpreview": "{{PLURAL:$1|1=Шаблон, используемый|Шаблоны, используемые}} в режиме предпросмотра:",
        "protect-locked-blocked": "Вы не можете изменять уровень защиты страницы, пока ваша учётная запись заблокирована.\nТекущие установки для страницы '''$1''':",
        "protect-locked-dblock": "Уровень защиты не может быть изменён, так как основная база данных временно заблокирована.\nТекущие установки для страницы '''$1''':",
        "protect-locked-access": "У вашей учётной записи недостаточно прав для изменения уровня защиты страницы. Текущие установки для страницы '''$1''':",
-       "protect-cascadeon": "ЭÑ\82а страница сейчас защищена в связи с тем, что она включена в {{PLURAL:$1|1=указанную ниже страницу, для которой|нижеследующие страницы, для которых}} установлена каскадная защита. Изменения уровня защиты этой страницы не повлияет на каскадную защиту.",
+       "protect-cascadeon": "Ð\94аннаÑ\8f страница сейчас защищена в связи с тем, что она включена в {{PLURAL:$1|1=указанную ниже страницу, для которой|нижеследующие страницы, для которых}} установлена каскадная защита. Изменения уровня защиты этой страницы не повлияет на каскадную защиту.",
        "protect-default": "Без защиты",
        "protect-fallback": "Разрешено только участникам с правами «$1»",
        "protect-level-autoconfirmed": "Разрешено только автоподтверждённым участникам",
        "htmlform-cloner-create": "Добавить ещё",
        "htmlform-cloner-delete": "Удалить",
        "htmlform-cloner-required": "Требуется по крайней мере одно значение.",
+       "htmlform-title-badnamespace": "[[:$1]] находится не в пространстве имён «{{ns:$2}}».",
+       "htmlform-title-not-creatable": "«$1» не является создаваемым заголовком страницы",
+       "htmlform-title-not-exists": "[[:$1]] не существует.",
        "sqlite-has-fts": "$1 с поддержкой полнотекстового поиска",
        "sqlite-no-fts": "$1 без поддержки полнотекстового поиска",
        "logentry-delete-delete": "$1 {{GENDER:$2|удалил|удалила}} страницу $3",
index db80f6f..cfc3ad5 100644 (file)
        "protectedinterface": "Sta pàggina cunteni un elementu ca fà parti dâ nterfaccia utenti dû software eggh'è  prutetta p'evitari pussìbbili abbusi. Pi jùnciri o canciari li traduzzioni pi tutti li wiki usari [//translatewiki.net/translatewiki.net] lu pruggettu di lucalizzazzioni di Mediawiki.",
        "editinginterface": "<strong>Accura:</strong> Lu testu di sta pàggina fà parti di l'interfaccia utenti dû situ.\nTutti li canciamenti appurtati a sta pàggina si riflèttinu supra li missaggi visualizzati pi tutti l'utenti di sta wiki.",
        "translateinterface": "Pi' agghiunciri o canciari traduzzioni pi' tutti i wiki, pi' favuri adupirati [//translatewiki.net/ translatewiki.net], lu pruggettu di lucalizzazzioni di MediaWiki.",
-       "cascadeprotected": "Supra sta pàggina nun è pussìbbili effittuari canciamenti pirchì veni nclusa nt{{PLURAL:$1|â pàggina siquenti, ca fu prutetta|ê pàggini siquenti, ca foru prutetti}} silizziunannu la prutizzioni \"ricursiva\":\n$2",
+       "cascadeprotected": "Sta pàggina è prutetta dî canciamenti pirchì veni trasclusa {{PLURAL:$1|ntâ pàggina siquenti, ca fu' prutiggiuta|ntê pàggini siquenti, ca foru prutiggiuti}} cu' l'opzioni «a' cascata»:\n$2",
        "namespaceprotected": "Nun hai lu pirmissu pi canciari li pàggini ntô namespace '''$1'''.",
        "customcssprotected": "Nun hai lu pirmissu pi' canciari sta pàggina CSS picchì cunteni i mpustazzioni pirsunali di n'autru utenti.",
        "customjsprotected": "Nun hai lu pirmissu pi' canciari sta pàggina JavaScript picchì cunteni i mpustazzioni pirsunali di n'autru utenti.",
        "readonlywarning": "<strong>Accura: Lu database è fermu pi manutinzioni, pirciò nun poi sarvari li tò canciamenti nta stu mumentu.</strong>\nLa cosa megghia è fari un copia e ncodda dû testu nta n'àutru prugramma e sarvàrilu pi quannu lu database torna accissìbbili.\n\nL'amministraturi ca bluccau lu database desi sta spiegazzioni: $1",
        "protectedpagewarning": "<strong>Accura: Sta pàggina fu' prutetta a' manera chi' sulu l'utenti cu' privileggi d'amministraturi a ponnu canciari.</strong>\nPi' rifirimentu, ccassutta è ripurtata l'ultima vuci dû riggistru:",
        "semiprotectedpagewarning": "<strong>Nota:</strong> Sta pàggina fu' prutetta a' manera chi' sulu l'utenti riggistrati la ponnu canciari.\nPi' rifirimentu, ccassutta è ripurtata l'ultima vuci dû riggistru:",
-       "cascadeprotectedwarning": "<strong>Accura:</strong> Sta pàggina havi statu bluccata di manera ca sulu l'utenti cu' privileggi di amministraturi la ponnu canciari, pirchì veni nclusa {{PLURAL:$1|nta siquente pàggina ca havi statu prutiggiuta|ntê siquenti pàggini ca hannu statu prutiggiuti}} a' cascata:",
+       "cascadeprotectedwarning": "<strong>Accura:</strong> Sta pàggina fu' bluccata di manera ca sulu l'utenti cu' privileggi di amministraturi la ponnu canciari, pirchì veni trasclusa {{PLURAL:$1|nta siquenti pàggina ca è prutiggiuta|ntê siquenti pàggini ca sunnu prutiggiuti}} a' cascata:",
        "titleprotectedwarning": "<strong>Accura: Sta pàggina fu' prutetta a' manera chi' giuvunu [[Special:ListGroupRights|privileggi spicìfici]] pi' criàrila.</strong>\nPi' rifirimentu, ccassutta è ripurtata l'ultima vuci dû riggistru:",
        "templatesused": "{{PLURAL:$1|Template adupiratu|Template adupirati}} nta sta pàggina:",
        "templatesusedpreview": "{{PLURAL:$1|Template adupiratu|Template adupirati}} nta st'antiprima:",
        "protect-locked-blocked": "Nun si ponnu canciari li livedda di prutizzioni quannu unu è bluccatu.\nCca cci su' li mpustazzioni attuali dâ pàggina <strong>$1</strong>:",
        "protect-locked-dblock": "Nun si ponnu canciari li livedda di prutizzioni picchì cc'è attivatu un bloccu dâ basi di dati.\nCca cci su' li mpustazzioni attuali dâ pàggina <strong>$1</strong>:",
        "protect-locked-access": "Lu to cuntu nun havi lu pirmissu di canciari li livedda di prutizzioni.\nCca cci su' li mpustazzioni attuali dâ pàggina <strong>$1</strong>:",
-       "protect-cascadeon": "Com'ad ora sta pàggina è prutetta picchi' veni nclusa {{PLURAL:$1|ntâ pàggina innicata di sèquitu, supra â quali|ntê pàggini innicati di sèquitu, supra ê quali}} è attivata la prutizzioni a' cascata.\nI canciamenti fatti ô liveddu di prutizzioni di sta pàggina nun vannu a' canciari la prutizzioni a' cascata.",
+       "protect-cascadeon": "Com'ad ora sta pàggina è prutetta picchì veni trasclusa {{PLURAL:$1|ntâ siquenti pàggina, ca havi|ntê siquenti pàggini, ca hannu}} la prutizzioni a' cascata attivata.\nLi canciamenti ca si fannu ô liveddu di prutizzioni di sta pàggina nun vannu a' canciari la prutizzioni a' cascata.",
        "protect-default": "Cunsenti a' tutti l'utenti",
        "protect-fallback": "Cunsenti sulu a' l'utenti cû pirmissu \"$1\"",
        "protect-level-autoconfirmed": "Cunsenti sulu a' l'utenti autu-cunfirmati",
        "pageinfo-robot-index": "Cunsintuta",
        "pageinfo-robot-noindex": "Pruibbuta",
        "pageinfo-watchers": "Quanti talìunu sta pàggina",
-       "pageinfo-visiting-watchers": "Nùmmiru d’utenti ntirissati a’ sta pàggina ca talìunu li canciamenti cchiu’ ricenti",
+       "pageinfo-visiting-watchers": "Nùmmiru d’utenti ntirissati a’ sta pàggina ca hannu taliatu li canciamenti cchiu’ ricenti",
        "pageinfo-few-watchers": "Cchiu' picca di $1 {{PLURAL:$1|taliaturi|taliatura}}",
        "pageinfo-few-visiting-watchers": "Forsi cc’è quarchi utenti ntirissatu ca talìa li canciamenti ricenti, forsi no",
        "pageinfo-redirects-name": "Nùmmiru di rimanni a' sta pàggina",
        "htmlform-cloner-create": "Agghiunci autru",
        "htmlform-cloner-delete": "Leva",
        "htmlform-cloner-required": "Cci voli almenu nu valuri.",
+       "htmlform-title-badnamespace": "[[:$1]] nun sta ntô namespace «{{ns:$2}}».",
+       "htmlform-title-not-creatable": "«$1» nun è tìtulu di na pàggina ca si po’ criari",
+       "htmlform-title-not-exists": "[[:$1]] nun esisti.",
+       "htmlform-user-not-exists": "<strong>$1</strong> nun esisti.",
+       "htmlform-user-not-valid": "<strong>$1</strong> nun è vàlidu comu nomu utenti.",
        "sqlite-has-fts": "$1 cu' capacità di risciduta a' tuttu testu",
        "sqlite-no-fts": "$1 senza capacità di risciduta a' tuttu testu",
        "logentry-delete-delete": "$1 {{GENDER:$2|cancillau}} la pàggina $3",
index db71ab1..d317988 100644 (file)
        "tooltip-pt-logout": "නික්මීම",
        "tooltip-pt-createaccount": "ඔබ ගිණුමක් තනා පිවිසෙන්නේ නම් මැනවි; කෙසේ වුවත්, එය අනිවාර්ය නොවේ.",
        "tooltip-ca-talk": "අන්තර්ගත පිටුව පිළිබඳ සාකච්ඡාව",
-       "tooltip-ca-edit": "à¶\94බâ\80\8dට à¶¸à·\99ම à¶´à·\92ටà·\94à·\80 à·\83à¶\82à·\83à·\8aà¶\9aරණය à¶\9aල à·\84à·\90à¶\9a. à·\83à¶\82à¶\9aරණ à·\83à·\94රà·\90à¶\9aà·\93මට à¶´à·\99ර à¶´à·\99රදà·\83à·\94න à¶¶à·\9cතà·\8aතම à¶·à·\8fà·\80à·\92තà·\8fà¶\9aà·\92රà·\93ම à¶ºà·\9dà¶\9cà·\8aâ\80\8dයà·\80à·\9a.",
+       "tooltip-ca-edit": "මà·\99ම à¶´à·\92ටà·\94à·\80 à·\83à¶\82à·\83à·\8aà¶\9aරණය à¶\9aරනà·\8aන",
        "tooltip-ca-addsection": "නව කොටසක් අරඹන්න",
        "tooltip-ca-viewsource": "මෙම පිටුව ආරක්‍ෂණය කොට ඇත.\nඔබට එහි මූලාශ්‍රය නැරඹිය හැක.",
        "tooltip-ca-history": "මෙම පිටුවේ පෙර සංශෝධන",
index a8fe9cc..9a6e537 100644 (file)
        "htmlform-title-badnamespace": "[[:$1]] ni v imenskem prostoru »{{ns:$2}}«.",
        "htmlform-title-not-creatable": "»$1« je naslov strani, ki ga ni mogoče ustvariti",
        "htmlform-title-not-exists": "[[:$1]] ne obstaja.",
+       "htmlform-user-not-exists": "<strong>$1</strong> ne obstaja.",
+       "htmlform-user-not-valid": "<strong>$1</strong> ni veljavno uporabniško ime.",
        "sqlite-has-fts": "$1 s podporo iskanju polnih besedil",
        "sqlite-no-fts": "$1 brez podpore iskanju polnih besedil",
        "logentry-delete-delete": "$1 je {{GENDER:$2|izbrisal|izbrisala|izbrisal(-a)}} stran $3",
index 27704dc..a3e903b 100644 (file)
@@ -26,7 +26,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Nemo bis",
-                       "Aktron"
+                       "Aktron",
+                       "Srdjan m"
                ]
        },
        "tog-underline": "Подвлачење веза:",
        "wrongpassword": "Унели сте неисправну лозинку. Покушајте поново.",
        "wrongpasswordempty": "Нисте унели лозинку. Покушајте поново.",
        "passwordtooshort": "Лозинка мора имати најмање {{PLURAL:$1|један знак|$1 знака|$1 знакова}}.",
+       "passwordtoolong": "Лозинке не могу бити дуже од {{PLURAL:$1|$1 знака|$1 знакова}}.",
        "password-name-match": "Лозинка се мора разликовати од корисничког имена.",
        "password-login-forbidden": "Коришћење овог корисничког имена и лозинке је забрањено.",
        "mailmypassword": "Ресетуј лозинку",
        "rollback-success": "Враћене су измене {{GENDER:$1|корисника|кориснице}} $1\nна последњу измену {{GENDER:$2|корисника|кориснице}} $2.",
        "sessionfailure-title": "Сесија је окончана",
        "sessionfailure": "Изгледа да постоји проблем с вашом сесијом;\nова радња је отказана да би се избегла злоупотреба.\nВратите се на претходну страницу, поново је учитајте и покушајте поново.",
+       "changecontentmodel": "Промени модел садржаја странице",
+       "changecontentmodel-legend": "Промени модел садржаја",
+       "changecontentmodel-title-label": "Наслов странице",
+       "changecontentmodel-model-label": "Нови модел садржаја",
+       "changecontentmodel-reason-label": "Разлог:",
+       "changecontentmodel-success-title": "Модел садржаја је промењен",
+       "changecontentmodel-success-text": "Модел садржаја странице [[:$1]] је промењен.",
+       "changecontentmodel-cannot-convert": "Модел садржаја странице [[:$1]] се не може претворити у врсту $2.",
+       "changecontentmodel-title-cantexist": "Не може постојати страница на $1.",
+       "changecontentmodel-nodirectediting": "Модел садржаја $1 не подржава изравно уређивање",
+       "log-name-contentmodel": "Дневник промене модела садржаја",
+       "log-description-contentmodel": "Догађаји који имају везу са моделима садржаја страница",
+       "logentry-contentmodel-change": "$1 је {{GENDER:$2|променио|променила}} модел садржаја странице $3 из „$4“ у „$5“",
+       "logentry-contentmodel-change-revertlink": "врати",
        "protectlogpage": "Дневник закључавања",
        "protectlogtext": "Испод је списак заштићених страница.\nПогледајте [[Special:ProtectedPages|списак заштићених страница]] за више детаља.",
        "protectedarticle": "{{GENDER:|је заштитио|је заштитила}} „[[$1]]“",
        "prot_1movedto2": "је преместио [[$1]] на [[$2]]",
        "protect-badnamespace-title": "Незаштитљив именски простор",
        "protect-badnamespace-text": "Странице у овом именском простору се не могу заштитити.",
+       "protect-norestrictiontypes-text": "Ова страница се не може заштитити јер нема доступних врста ограничења.",
        "protect-norestrictiontypes-title": "Незаштитљива страна",
        "protect-legend": "Потврдите заштиту",
        "protectcomment": "Разлог:",
        "import-interwiki-history": "Копирај све верзије историје за ову страницу",
        "import-interwiki-templates": "Укључи све шаблоне",
        "import-interwiki-submit": "Увези",
+       "import-mapping-namespace": "Увези у именски простор:",
        "import-upload-filename": "Назив датотеке:",
        "import-comment": "Коментар:",
        "importtext": "Извезите датотеку с изворног викија користећи [[Special:Export|извоз]].\nСачувајте је на рачунар и пошаљите овде.",
index 3e86908..7c1e636 100644 (file)
@@ -17,7 +17,8 @@
                        "Михајло Анђелковић",
                        "לערי ריינהארט",
                        "아라",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Srdjan m"
                ]
        },
        "tog-underline": "Podvlačenje veza:",
        "delete-hook-aborted": "Brisanje je prekinula kuka.\nNije dato nikakvo obrazloženje.",
        "badtitle": "Neispravan naslov",
        "badtitletext": "Naslov stranice je neispravan, prazan ili je međujezički ili međuviki naslov pogrešno povezan.\nMožda sadrži znakove koji se ne mogu koristiti u naslovima.",
+       "title-invalid-characters": "Zatraženi naslov stranice sadrži neispravne znakove: „$1“.",
        "perfcached": "Sledeći podaci su keširani i mogu biti zastareli. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata|$1 rezultata}}.",
        "perfcachedts": "Sledeći podaci su keširani i poslednji put su ažurirani $2 u $3. U kešu {{PLURAL:$4|1=je dostupan najviše jedan rezultat|su dostupna najviše $4 rezultata|je dostupno najviše $4 rezultata}}.",
        "querypage-no-updates": "Ažuriranje ove stranice je trenutno onemogućeno.\nPodaci koji se ovde nalaze mogu biti zastareli.",
        "wrongpassword": "Uneli ste neispravnu lozinku. Pokušajte ponovo.",
        "wrongpasswordempty": "Niste uneli lozinku. Pokušajte ponovo.",
        "passwordtooshort": "Lozinka mora imati najmanje {{PLURAL:$1|jedan znak|$1 znaka|$1 znakova}}.",
+       "passwordtoolong": "Lozinke ne mogu biti duže od {{PLURAL:$1|jednog znaka|$1 znaka|$1 znakova}}.",
        "password-name-match": "Lozinka se mora razlikovati od korisničkog imena.",
        "password-login-forbidden": "Korišćenje ovog korisničkog imena i lozinke je zabranjeno.",
        "mailmypassword": "Resetuj lozinku",
        "notextmatches": "Nijedan tekst stranice ne odgovara",
        "prevn": "prethodnih {{PLURAL:$1|$1}}",
        "nextn": "sledećih {{PLURAL:$1|$1}}",
+       "prev-page": "prethodna stranica",
+       "next-page": "sledeća stranica",
        "prevn-title": "$1 {{PLURAL:$1|prethodni  rezultat|prethodna rezultata|prethodnih rezultata}}",
        "nextn-title": "$1 {{PLURAL:$1|sledeći rezultat|sledeća rezultata|sledećih rezultata}}",
        "shown-title": "Prikaži $1 {{PLURAL:$1|rezultat|rezultata|rezultata}} po stranici",
        "listfiles-delete": "obriši",
        "listfiles-summary": "Ova posebna stranica prikazuje sve poslate datoteke.",
        "listfiles_search_for": "Naziv datoteke:",
+       "listfiles-userdoesnotexist": "Korisnički nalog „$1“ nije registrovan.",
        "imgfile": "datoteka",
        "listfiles": "Spisak datoteka",
        "listfiles_thumb": "Minijatura",
        "rollback-success": "Vraćene su izmene {{GENDER:$1|korisnika|korisnice}} $1\nna poslednju izmenu {{GENDER:$2|korisnika|korisnice}} $2.",
        "sessionfailure-title": "Sesija je okončana",
        "sessionfailure": "Izgleda da postoji problem s vašom sesijom;\nova radnja je otkazana da bi se izbegla zloupotreba.\nVratite se na prethodnu stranicu, ponovo je učitajte i pokušajte ponovo.",
+       "changecontentmodel": "Promeni model sadržaja stranice",
+       "changecontentmodel-legend": "Promeni model sadržaja",
+       "changecontentmodel-title-label": "Naslov stranice",
+       "changecontentmodel-model-label": "Novi model sadržaja",
+       "changecontentmodel-reason-label": "Razlog:",
+       "changecontentmodel-success-title": "Model sadržaja je promenjen",
+       "changecontentmodel-success-text": "Model sadržaja stranice [[:$1]] je promenjen.",
+       "changecontentmodel-cannot-convert": "Model sadržaja stranice [[:$1]] se ne može pretvoriti u vrstu $2.",
+       "changecontentmodel-title-cantexist": "Ne može postojati stranica na $1.",
+       "changecontentmodel-nodirectediting": "Model sadržaja $1 ne podržava izravno uređivanje",
+       "log-name-contentmodel": "Dnevnik promene modela sadržaja",
+       "log-description-contentmodel": "Događaji koji imaju vezu sa modelima sadržaja stranica",
+       "logentry-contentmodel-change": "$1 je {{GENDER:$2|promenio|promenila}} model sadržaja stranice $3 iz „$4“ u „$5“",
+       "logentry-contentmodel-change-revertlink": "vrati",
+       "logentry-contentmodel-change-revert": "vrati",
        "protectlogpage": "Dnevnik zaključavanja",
        "protectlogtext": "Ispod je spisak zaštićenih stranica.\nPogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za više detalja.",
        "protectedarticle": "{{GENDER:|je zaštitio|je zaštitila}} „[[$1]]“",
        "prot_1movedto2": "je premestio [[$1]] na [[$2]]",
        "protect-badnamespace-title": "Nezaštitljiv imenski prostor",
        "protect-badnamespace-text": "Stranice u ovom imenskom prostoru se ne mogu zaštititi.",
+       "protect-norestrictiontypes-text": "Ova stranica se ne može zaštititi jer nema dostupnih vrsta ograničenja.",
        "protect-norestrictiontypes-title": "Nezaštitljiva strana",
        "protect-legend": "Potvrdite zaštitu",
        "protectcomment": "Razlog:",
        "import": "Uvoz stranica",
        "importinterwiki": "Međuviki uvoz",
        "import-interwiki-text": "Izaberite viki i naslov stranice za uvoz.\nDatumi i imena urednika će biti sačuvani.\nSve radnje pri uvozu s drugih vikija su zabeležene u [[Special:Log/import|dnevniku uvoza]].",
+       "import-interwiki-sourcewiki": "Izvorna viki:",
+       "import-interwiki-sourcepage": "Izvorna stranica:",
        "import-interwiki-history": "Kopiraj sve verzije istorije za ovu stranicu",
        "import-interwiki-templates": "Uključi sve šablone",
        "import-interwiki-submit": "Uvezi",
+       "import-mapping-namespace": "Uvezi u imenski prostor:",
        "import-upload-filename": "Naziv datoteke:",
        "import-comment": "Komentar:",
        "importtext": "Izvezite datoteku s izvornog vikija koristeći [[Special:Export|izvoz]].\nSačuvajte je na računar i pošaljite ovde.",
index 2f17572..c4fb1be 100644 (file)
        "protectedinterface": "Denna sida innehåller text för mjukvarans gränssnitt på denna wiki, och är skrivskyddad för att förebygga missbruk.\nFör att lägga till eller ändra översättningar för alla wikis, var god använd [//translatewiki.net/ translatewiki.net], lokaliseringsprojektet för MediaWiki.",
        "editinginterface": "<strong>Varning:</strong> Du redigerar en sida som används för texten i gränssnittet.\nÄndringar på denna sida kommer att påverka användargränssnittets utseende för andra användare på denna wiki.",
        "translateinterface": "För att lägga till eller ändra översättningar för alla wikis, använd [//translatewiki.net/ translatewiki.net], lokaliseringsprojektet för MediaWiki.",
-       "cascadeprotected": "Den här sidan har skyddats från redigering eftersom den inkluderas på följande {{PLURAL:$1|sida|sidor}} som skrivskyddats med \"kaskaderande skydd\":\n$2",
+       "cascadeprotected": "Den här sidan har skyddats från redigering eftersom den inkluderas på följande {{PLURAL:$1|sida|sidor}} som skrivskyddats med \"kaskaderande\"-inställningen aktiverad:\n$2",
        "namespaceprotected": "Du har inte behörighet att redigera sidor i namnrymden '''$1'''.",
        "customcssprotected": "Du har inte behörighet att redigera denna CSS-sida eftersom den innehåller en annan användares personliga inställningar.",
        "customjsprotected": "Du har inte behörighet att redigera denna JavaScript-sida eftersom den innehåller en annan användares personliga inställningar.",
        "readonlywarning": "'''VARNING: Databasen är tillfälligt låst för underhåll. Du kommer inte att kunna spara dina ändringar just nu.\nDet kan vara klokt att kopiera texten till ett textdokument som sparas på din dator tills vidare.'''\n\nAdministratören som låste databasen gav följande förklaring: $1",
        "protectedpagewarning": "'''Varning: Den här sidan har låsts så att bara användare med administratörsrättigheter kan redigera den.'''\nDen senaste loggposten tillhandahålls nedan som referens:",
        "semiprotectedpagewarning": "'''Observera:''' Denna sida har låsts så att endast registrerade användare kan redigera den.\nDen senaste loggposten tillhandahålls nedan som referens:",
-       "cascadeprotectedwarning": "'''Varning:''' Den här sidan är låst så att bara användare med administratörsrättigheter kan redigera den, eftersom den är inkluderad på följande {{PLURAL:$1|sida|sidor}} som skyddats med kaskaderande skrivskydd:",
+       "cascadeprotectedwarning": "'''Varning:''' Den här sidan har låsts så att bara användare med administratörsrättigheter kan redigera den, eftersom den är inkluderad på följande {{PLURAL:$1|sida|sidor}} som skyddats med kaskaderande skrivskydd:",
        "titleprotectedwarning": "'''Varning: Denna sida har låsts så att [[Special:ListGroupRights|specifika rättigheter]] krävs för att skapa den.'''\nDen senaste loggposten tillhandahålls nedan som referens:",
        "templatesused": "{{PLURAL:$1|Mall|Mallar}} som används på den här sidan:",
        "templatesusedpreview": "{{PLURAL:$1|Mall|Mallar}} som används i denna förhandsgranskning:",
        "uploaddisabledtext": "Uppladdning av filer är avstängd.",
        "php-uploaddisabledtext": "Filuppladdningar i PHP är avaktiverade. \nKolla inställningarna för file_uploads.",
        "uploadscripted": "Denna fil innehåller HTML eller script som felaktigt kan komma att tolkas av webbläsare.",
+       "upload-scripted-pi-callback": "Kan inte ladda upp en fil som innehåller instruktioner för behandling av XML-stylesheet.",
        "uploaded-script-svg": "Hittade skriptelementet \"$1\" i den uppladdade SVG-filen.",
        "uploaded-hostile-svg": "Hittade osäker CSS i den uppladdade filens stilelement.",
+       "uploaded-event-handler-on-svg": "Att ange event-handler-attribut <code>$1=\"$2\"</code> är inte tillåtet i SVG-filer.",
+       "uploaded-href-attribute-svg": "href-attribut <code>&lt;$1 $2=\"$3\"&gt;</code> med icke-lokala mål (t.ex. http://, javascript:, etc) tillåts inte i SVG filer.",
        "uploaded-href-unsafe-target-svg": "Hittade href till ett osäkert mål <code>&lt;$1 $2=\"$3\"&gt;</code> i den uppladdade SVG-filen.",
        "uploaded-animate-svg": "Hittades taggen \"animate\" som kan ändra href med hjälp av attributen \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> i den uppladdade SVG-filen.",
+       "uploaded-setting-event-handler-svg": "Att ange event-handler-attribut är blockerat. Hittade <code>&lt;$1 $2=\"$3\"&gt;</code> i den uppladdade SVG-filen.",
        "uploaded-setting-href-svg": "Användning av taggen \"set\" för att lägga till attributen \"href\" till överordnade element blockeras.",
+       "uploaded-wrong-setting-svg": "Användning av \"set\"-taggen för att lägga till ett remote-/data-/skriptmål till något attribut är blokerat. Hittade <code>&lt;set to=\"$1\"&gt;</code> i den uppladdade SVG-filen.",
+       "uploaded-setting-handler-svg": "SVG som anger \"handler\"-attributet med remote/data/skript är blockerat. Hittade <code>$1=\"$2\"</code> i den uppladdade SVG-filen.",
+       "uploaded-remote-url-svg": "SVG som anger style-attributet med en fjärr-URL är blockerat. Hittade <code>$1=\"$2\"</code> i den uppladdade SVG-filen.",
        "uploaded-image-filter-svg": "Hittade bildfilter med URL: <code>&lt;$1 $2=\"$3\"&gt;</code> i den uppladdade SVG-filen.",
        "uploadscriptednamespace": "Denna SVG-fil innehåller den ogiltiga namnrymden \"$1\".",
        "uploadinvalidxml": "XML-koden i den uppladdade filen kunde inte tolkas.",
        "protect-locked-blocked": "Du kan inte ändra sidors skrivskydd medan du är blockerad.\nHär kan du se gällande skrivskyddsinställninger för sidan '''$1''':",
        "protect-locked-dblock": "Skrivskydd kan inte ändras då databasen är låst.\nNuvarande skrivskyddsinställning för sidan '''$1''' är:",
        "protect-locked-access": "Ditt konto har inte behörighet att ändra skrivskydd på sidor.\nNuvarande skrivskyddsinställning för sidan '''$1''' är:",
-       "protect-cascadeon": "Den här sidan är skrivskyddad eftersom den inkluderas på följande {{PLURAL:$1|sida|sidor}} som har ett kaskaderande skydd.\nÄndringar i skyddet för den här sidan kommer inte påverka det kaskaderande skyddet.",
+       "protect-cascadeon": "Den här sidan är skrivskyddad eftersom den inkluderas på följande {{PLURAL:$1|sida|sidor}} som har ett kaskaderande skydd aktiverat.\nÄndringar i skyddet för den här sidan kommer inte påverka det kaskaderande skyddet.",
        "protect-default": "Tillåt alla användare",
        "protect-fallback": "Kräv \"$1\"-behörighet",
        "protect-level-autoconfirmed": "Blockera nya och oregistrerade användare",
        "htmlform-cloner-create": "Lägg till mer",
        "htmlform-cloner-delete": "Ta bort",
        "htmlform-cloner-required": "Det krävs minst ett värde.",
+       "htmlform-title-badnamespace": "[[:$1]] är inte i \"{{ns:$2}}\"-namnrymden.",
+       "htmlform-title-not-creatable": "\"$1\" är inte en sidtitel som kan skapas",
+       "htmlform-title-not-exists": "[[:$1]] finns inte.",
+       "htmlform-user-not-exists": "<strong>$1</strong> finns inte.",
+       "htmlform-user-not-valid": "<strong>$1</strong> är inte ett giltigt användarnamn.",
        "sqlite-has-fts": "$1 med stöd för fulltextsökning",
        "sqlite-no-fts": "$1 utan stöd för fulltextsökning",
        "logentry-delete-delete": "$1 {{GENDER:$2|raderade}} sidan $3",
index 5a005b0..e5bf3b6 100644 (file)
        "protectedinterface": "หน้านี้เป็นข้อความส่วนต่อประสานสำหรับซอฟต์แวร์บนวิกินี้ และถูกล็อกเพื่อป้องกันการกระทำผิด\nในการเพิ่มหรือเปลี่ยนแปลงการแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/ translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
        "editinginterface": "<strong>คำเตือน:</strong> คุณกำลังแก้ไขหน้าที่ใช้จัดหาข้อความอินเตอร์เฟซให้ซอฟต์แวร์\nการเปลี่ยนแปลงหน้านี้จะมีผลต่อสภาพปรากฏของส่วนต่อประสานผู้ใช้แก่ผู้ใช้อื่นบนวิกินี้",
        "translateinterface": "ในการเพิ่มหรือเปลี่ยนแปลงคำแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/ translatewiki.net] โครงการแปลเป็นภาษาถิ่นของมีเดียวิกิ",
-       "cascadeprotected": "หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81à¸\9bà¹\89อà¸\87à¸\81ัà¸\99มิà¹\83หà¹\89à¹\81à¸\81à¹\89à¹\84à¸\82 à¹\80à¸\9eราะà¸\96ูà¸\81รวมอยูà¹\88à¹\83à¸\99หà¸\99à¹\89าà¸\8bึà¹\88à¸\87à¸\96ูà¸\81ลà¹\87อà¸\81à¹\82à¸\94ยà¹\80à¸\9bิà¸\94à¸\95ัวà¹\80ลือà¸\81 \"à¸\97à¸\9aà¸\97ุà¸\81ลำà¸\94ัà¸\9aà¸\82ัà¹\89à¸\99\":\n$2",
+       "cascadeprotected": "หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81à¸\9bà¹\89อà¸\87à¸\81ัà¸\99มิà¹\83หà¹\89à¹\81à¸\81à¹\89à¹\84à¸\82 à¹\80à¸\9eราะà¸\96ูà¸\81รวมอยูà¹\88à¹\83à¸\99หà¸\99à¹\89าà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¸\8bึà¹\88à¸\87à¸\96ูà¸\81ลà¹\87อà¸\81à¹\82à¸\94ยà¹\80à¸\9bิà¸\94à¸\95ัวà¹\80ลือà¸\81 \"à¸\95à¹\88อà¹\80รียà¸\87\":\n$2",
        "namespaceprotected": "คุณไม่มีสิทธิแก้ไขหน้าในเนมสเปซ <strong>$1</strong>",
        "customcssprotected": "คุณไม่มีสิทธิแก้ไขหน้า CSS นี้ เพราะมีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
        "customjsprotected": "คุณไม่มีสิทธิแก้ไขหน้าจาวาสคริปต์นี้ เพราะหน้านี้มีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
        "readonlywarning": "<strong>คำเตือน: ฐานข้อมูลถูกล็อกเพื่อบำรุงรักษา คุณจึงไม่สามารถบันทึกการเปลี่ยนแปลงของคุณได้ในขณะนี้</strong>\nคุณอาจต้องการคัดลอกและวางข้อความของคุณในไฟล์ข้อความ และบันทึกไว้ภายหลัง\n\nผู้ดูแลระบบที่ล็อกฐานข้อมูลให้คำอธิบายดังนี้: $1",
        "protectedpagewarning": "<strong>คำเตือน: หน้านี้ถูกล็อก เพื่อให้เฉพาะผู้ใช้ที่มีสิทธิผู้ดูแลระบบแก้ไขได้เท่านั้น</strong>\nรายการปูมล่าสุดจัดไว้ด้านล่างเพื่อการอ้างอิง:",
        "semiprotectedpagewarning": "<strong>หมายเหตุ:</strong> หน้านี้ถูกล็อก เพื่อให้เฉพาะผู้ใช้ลงทะเบียนสามารถแก้ไขเท่านั้น\nรายการปูมล่าสุดได้จัดไว้ด้านล่างนี้เพื่อการอ้างอิง",
-       "cascadeprotectedwarning": "<strong>คำเตือน:</strong> หน้านี้ถูกล็อก และแก้ไขได้เฉพาะผู้ใช้ที่มีสิทธิผู้ดูแลระบบเท่านั้น เนื่องจากหน้านี้สืบทอดการล็อกมาจาก{{PLURAL:$1|หน้า|หน้า}}ต่อไปนี้:",
+       "cascadeprotectedwarning": "<strong>คำเตือน:</strong> หน้านี้ถูกล็อก และแก้ไขได้เฉพาะผู้ใช้ที่มีสิทธิผู้ดูแลระบบ เนื่องจากหน้านี้รวมอยู่ใน{{PLURAL:$1|หน้า}}ที่ถูกล็อกแบบต่อเรียงต่อไปนี้:",
        "titleprotectedwarning": "<strong>คำเตือน: หน้านี้ได้รับการป้องกัน สร้างได้เฉพาะผู้ใช้ที่มี[[Special:ListGroupRights|สิทธิจำเพาะ]]เท่านั้น</strong>\nรายการปูมล่าสุดถูกแสดงไว้ด้านล่างเพื่อการอ้างอิง",
        "templatesused": "{{PLURAL:$1|แม่แบบ}}ที่ใช้ในหน้านี้:",
        "templatesusedpreview": "{{PLURAL:$1|แม่แบบ}}ที่ใช้ในตัวอย่างนี้:",
        "right-ipblock-exempt": "เลี่ยงการบล็อกเลขที่อยู่ไอพี บล็อกอัตโนมัติ และบล็อกช่วง",
        "right-proxyunbannable": "เลี่ยงการบล็อกอัตโนมัติของพร็อกซี",
        "right-unblockself": "ปลดบล็อกตนเอง",
-       "right-protect": "à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81à¹\81ละà¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81ลà¹\87อà¸\81à¹\81à¸\9aà¸\9aà¸\96à¹\88ายà¸\97อà¸\94",
+       "right-protect": "à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81à¹\81ละà¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81ลà¹\87อà¸\81à¹\81à¸\9aà¸\9aà¸\95à¹\88อà¹\80รียà¸\87",
        "right-editprotected": "แก้ไขหน้าที่ถูกล็อกในฐานะ \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "แก้ไขหน้าที่ถูกล็อกในฐานะ \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "แก้ไขตัวแบบเนื้อหาของหน้า",
        "protectedpages": "หน้าที่ถูกล็อก",
        "protectedpages-indef": "เฉพาะการล็อกแบบไม่มีกำหนด",
        "protectedpages-summary": "หน้านี้แสดงรายการหน้าที่มีอยู่ซึ่งปัจจุบันถูกล็อก สำหรับรายการชื่อเรื่องที่ถูกป้องกันมิให้สร้าง ดู [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]",
-       "protectedpages-cascade": "à¹\80à¸\89à¸\9eาะà¸\81ารลà¹\87อà¸\81à¹\81à¸\9aà¸\9aสืà¸\9aà¸\97อà¸\94",
+       "protectedpages-cascade": "à¹\80à¸\89à¸\9eาะà¸\81ารลà¹\87อà¸\81à¹\81à¸\9aà¸\9aà¸\95à¹\88อà¹\80รียà¸\87",
        "protectedpages-noredirect": "ซ่อนการเปลี่ยนทาง",
        "protectedpagesempty": "ขณะนี้ไม่มีหน้าถูกล็อกตามพารามิเตอร์เหล่านี้",
        "protectedpages-timestamp": "ตราเวลา",
        "protect-locked-blocked": "ไม่สามารถเปลี่ยนระดับการล็อกหน้าขณะถูกบล็อกได้ \nการตั้งค่าปัจจุบันของหน้า <strong>$1</strong> คือ:",
        "protect-locked-dblock": "ไม่สามารถเปลี่ยนระดับการล็อกได้เนื่องจากฐานข้อมูลกำลังถูกล็อก \nการตั้งค่าปัจจุบันของหน้า <strong>$1</strong> คือ:",
        "protect-locked-access": "บัญชีของคุณไม่มีสิทธิเปลี่ยนแปลงระดับการล็อกหน้า \nการตั้งค่าปัจจุบันของหน้า <strong>$1</strong> คือ:",
-       "protect-cascadeon": "à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81ลà¹\87อà¸\81à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81รวมอยูà¹\88à¹\83à¸\99{{PLURAL:$1|หà¸\99à¹\89า|หà¸\99à¹\89า}}à¸\97ีà¹\88à¹\80à¸\9bิà¸\94à¸\81ารลà¹\87อà¸\81à¹\81à¸\9aà¸\9aสืà¸\9aà¸\97อà¸\94\nà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¸\88ะà¹\84มà¹\88มีà¸\9cลà¸\95à¹\88อà¸\81ารลà¹\87อà¸\81à¹\81à¸\9aà¸\9aสืà¸\9aà¸\97อà¸\94",
+       "protect-cascadeon": "à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81ลà¹\87อà¸\81à¹\80à¸\9eราะรวมอยูà¹\88à¹\83à¸\99{{PLURAL:$1|หà¸\99à¹\89า}}à¸\97ีà¹\88à¹\80à¸\9bิà¸\94à¸\81ารลà¹\87อà¸\81à¹\81à¸\9aà¸\9aà¸\95à¹\88อà¹\80รียà¸\87\nà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¸\88ะà¹\84มà¹\88มีà¸\9cลà¸\95à¹\88อà¸\81ารลà¹\87อà¸\81à¹\81à¸\9aà¸\9aà¸\95à¹\88อà¹\80รียà¸\87",
        "protect-default": "อนุญาตผู้ใช้ทั้งหมด",
        "protect-fallback": "อนุญาตเฉพาะผู้ใช้ที่มีสิทธิ \"$1\"",
        "protect-level-autoconfirmed": "อนุญาตเฉพาะผู้ใช้ยืนยันอัตโนมัติ",
        "protect-level-sysop": "อนุญาตเฉพาะผู้ดูแลระบบ",
-       "protect-summary-cascade": "สืà¸\9aà¸\97อà¸\94",
+       "protect-summary-cascade": "à¸\95à¹\88อà¹\80รียà¸\87",
        "protect-expiring": "หมดอายุ $1 (UTC)",
        "protect-expiring-local": "หมดอายุ $1",
        "protect-expiry-indefinite": "ไม่มีกำหนด",
-       "protect-cascade": "ลà¹\87อà¸\81หà¸\99à¹\89าà¸\97ีà¹\88à¹\80à¸\9bà¹\87à¸\99รวมอยูà¹\88à¹\83à¸\99หà¸\99à¹\89าà¸\99ีà¹\89 (ลà¹\87อà¸\81à¹\81à¸\9aà¸\9aสืà¸\9aà¸\97อà¸\94)",
+       "protect-cascade": "ลà¹\87อà¸\81หà¸\99à¹\89าà¸\97ีà¹\88รวมอยูà¹\88à¹\83à¸\99หà¸\99à¹\89าà¸\99ีà¹\89 (ลà¹\87อà¸\81à¹\81à¸\9aà¸\9aà¸\95à¹\88อà¹\80รียà¸\87)",
        "protect-cantedit": "คุณไม่สามารถเปลี่ยนระดับการล็อกของหน้านี้ เพราะคุณไม่มีสิทธิแก้ไข",
        "protect-othertime": "เวลาอื่น:",
        "protect-othertime-op": "เวลาอื่น",
        "pageinfo-redirectsto": "เปลี่ยนทางไป",
        "pageinfo-contentpage": "นับเป็นหน้าเนื้อหา",
        "pageinfo-contentpage-yes": "ใช่",
-       "pageinfo-protect-cascading": "à¸\81ารลà¹\87อà¸\81à¸\97ีà¹\88สืà¸\9aà¸\97อà¸\94จากหน้านี้",
+       "pageinfo-protect-cascading": "à¸\81ารลà¹\87อà¸\81à¸\97ีà¹\88à¸\95à¹\88อà¹\80รียà¸\87จากหน้านี้",
        "pageinfo-protect-cascading-yes": "ใช่",
-       "pageinfo-protect-cascading-from": "à¸\81ารลà¹\87อà¸\81สืà¸\9aà¸\97อà¸\94จาก",
+       "pageinfo-protect-cascading-from": "à¸\81ารลà¹\87อà¸\81à¸\95à¹\88อà¹\80รียà¸\87จาก",
        "pageinfo-category-info": "สารสนเทศหมวดหมู่",
        "pageinfo-category-total": "จำนวนสมาชิกรวม",
        "pageinfo-category-pages": "จำนวนหน้า",
index 0e277a8..338fa0b 100644 (file)
        "createacct-benefit-heading": "{{SITENAME}} ay nilikha ng mga taong iyong katulad.",
        "createacct-benefit-body1": "{{PLURAL:$1|pagbabago|mga pagbabago}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pahina|mga pahina}}",
-       "createacct-benefit-body3": "kamakailang {{PLURAL:$1|nag-ambag|mga nag-ambag}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|kamakailang taga-ambag|mga kamakailang taga-ambag}}",
        "badretype": "Hindi magkatugma ang ipinasok mong mga password.",
        "userexists": "May gumagamit na ng ipinasok na bansag.\nPumili po ng ibang pangalan.",
        "loginerror": "Kamalian sa paglagda",
        "currentrev": "Pangkasalukuyang pagbabago",
        "currentrev-asof": "Pangkasalukuyang pagbabago mula noong $1",
        "revisionasof": "Pagbabago mula noong $1",
-       "revision-info": "Pagbabago mula noong $1 ni $2",
+       "revision-info": "Pagbabago mula noong $1 ni {{GENDER:$6|$2}}$7",
        "previousrevision": "← Lumang pagbabago",
        "nextrevision": "Bagong pagbabago →",
        "currentrevisionlink": "Pangkasalukuyang pagbabago",
        "tooltip-pt-logout": "Umalis sa pagkaka-login",
        "tooltip-pt-createaccount": "Hinihikayat kang lumikha ng kuwenta at lumigda; gayunpaman, hindi ito kinakailangan",
        "tooltip-ca-talk": "Usapan tungkol sa nilalaman ng pahinang ito",
-       "tooltip-ca-edit": "Maaaring baguhin ang pahinang ito. Paki gamit ang buton ng paunang tingin bago itala.",
+       "tooltip-ca-edit": "Baguhin ang pahinang ito",
        "tooltip-ca-addsection": "Magsimula ng bagong seksiyon",
        "tooltip-ca-viewsource": "Nakasanggalang ang pahinang ito.\nMaaari mong tingnan ang batayan nito.",
        "tooltip-ca-history": "Mga nakaraang bersiyon ng pahinang ito.",
        "logentry-newusers-create": "{{GENDER:$2|Inilikha}} ang account na $1 ng tagagamit",
        "logentry-newusers-create2": "Lumikha si $1 ng isang kuwenta ng tagagamit na $3",
        "logentry-newusers-autocreate": "Automatikong {{GENDER:$2|inilikha}} ang account ng tagagamit na $1",
+       "logentry-upload-upload": "{{GENDER:$2|Ikinarga}} ni $1 ang $3",
        "rightsnone": "(wala)",
        "revdelete-summary": "buod ng pagbabago",
        "feedback-adding": "Idinaragdag ang pakaing-tugon sa pahina...",
index b602704..e34fc5c 100644 (file)
@@ -75,7 +75,8 @@
                        "Watermelon juice",
                        "Ömer Berkay",
                        "Demircimehmed",
-                       "Uğurkent"
+                       "Uğurkent",
+                       "Kincki"
                ]
        },
        "tog-underline": "Bağlantıların altını çiz:",
        "categoriesfrom": "Şununla başlayan kategorileri görüntüle:",
        "special-categories-sort-count": "sayılarına göre sırala",
        "special-categories-sort-abc": "alfabetik olarak sırala",
-       "deletedcontributions": "Silinen kullanıcı katkıları",
-       "deletedcontributions-title": "Silinen kullanıcı katkıları",
+       "deletedcontributions": "Kullanıcının silinen katkıları",
+       "deletedcontributions-title": "Kullanıcının silinen katkıları",
        "sp-deletedcontributions-contribs": "katkılar",
        "linksearch": "Dış bağlantı arama",
        "linksearch-pat": "Motif ara:",
        "rollback-success": "$1 tarafından yapılan değişiklikler geri alınarak;\n$2 tarafından değiştirilmiş önceki sürüme geri dönüldü.",
        "sessionfailure-title": "Oturum başarısızlığı",
        "sessionfailure": "Giriş oturumunuzla ilgili bir sorun var gibi görünüyor;\nbu eylem, oturum gaspına karşı önlem olarak iptal edildi.\nLütfen \"geri\" gidin ve geldiğiniz sayfayı yeniden yükleyin, sonra tekrar deneyin.",
+       "changecontentmodel-title-label": "Sayfa başlığı",
+       "changecontentmodel-model-label": "Yeni içerik modeli",
+       "changecontentmodel-reason-label": "Gerekçe:",
+       "changecontentmodel-success-title": "İçerik modeli değiştirildi",
+       "changecontentmodel-success-text": "İçerik türü [[:$1]] olarak değiştirildi.",
+       "logentry-contentmodel-change-revertlink": "Eski haline döndür",
+       "logentry-contentmodel-change-revert": "Eski haline döndür",
        "protectlogpage": "Koruma kayıtları",
        "protectlogtext": "Aşağıdaki, sayfa korumalarına değişikliklerin bir listesidir.\nŞu anda uygulanan sayfa korumaları için [[Special:ProtectedPages|koruma altına alınmış sayfalar listesine]] bakabilirsiniz.",
        "protectedarticle": "\"[[$1]]\" koruma altında alındı",
        "sp-contributions-newbies-sub": "Yeni kullanıcılar için",
        "sp-contributions-newbies-title": "Yeni hesaplar için kullanıcı katkıları",
        "sp-contributions-blocklog": "Engel kaydı",
-       "sp-contributions-suppresslog": "Silinen kullanıcı katkıları",
-       "sp-contributions-deleted": "silinen kullanıcı katkıları",
+       "sp-contributions-suppresslog": "kullanıcının silinen katkıları",
+       "sp-contributions-deleted": "kullanıcının silinen katkıları",
        "sp-contributions-uploads": "yüklenenler",
        "sp-contributions-logs": "kayıtlar",
        "sp-contributions-talk": "mesaj",
        "version-libraries": "Yüklü kütüphaneler",
        "version-libraries-library": "Kütüphane",
        "version-libraries-version": "Sürüm",
+       "version-libraries-license": "Lisans",
+       "version-libraries-description": "Açıklama",
+       "version-libraries-authors": "Yazarlar",
        "redirect": "Dosya, kullanıcı, sayfa ya da revizyon kimliği ile 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 ya da sayfa ID'si verilen) veya bir kullanıcı sayfasının (sayısal kullanıcı kimliği verilen) adresine yönlendirir. Kullanım: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], ya da  [[{{#Special:Redirect}}/user/101]].",
        "htmlform-cloner-create": "Daha fazla ekle",
        "htmlform-cloner-delete": "Sil",
        "htmlform-cloner-required": "En az bir değer gereklidir.",
+       "htmlform-title-not-creatable": "\"$1\"oluşturulabilir bir sayfa ismi değil.",
+       "htmlform-title-not-exists": "[[:$1]] mevcut değil",
+       "htmlform-user-not-exists": "<strong>$1</strong> mevcut değil.",
+       "htmlform-user-not-valid": "<strong>$1</strong> geçerli bir kullanıcı ismi değildir.",
        "sqlite-has-fts": "$1 tam-metin arama desteği ile",
        "sqlite-no-fts": "$1 tam-metin arama desteği olmaksızın",
        "logentry-delete-delete": "$1 $3 sayfasını {{GENDER:$2|sildi}}",
        "special-characters-title-endash": "tire",
        "special-characters-title-emdash": "uzun çizgi",
        "special-characters-title-minus": "Eksi işareti",
-       "mw-widgets-titleinput-description-new-page": "sayfa henüz mevcut değil"
+       "mw-widgets-titleinput-description-new-page": "sayfa henüz mevcut değil",
+       "mw-widgets-titleinput-description-redirect": "$1'e yönlendirildi"
 }
index f6a335c..9ae575c 100644 (file)
        "filedelete-submit": "Вилучити",
        "filedelete-success": "'''$1''' було вилучено.",
        "filedelete-success-old": "Версія '''[[Media:$1|$1]]''' від $3, $2 була вилучена.",
-       "filedelete-nofile": "Файл '''$1''' не існує.",
+       "filedelete-nofile": "<strong>$1</strong> не існує.",
        "filedelete-nofile-old": "Не існує архівної версії '''$1''' із зазначеними атрибутами.",
        "filedelete-otherreason": "Інша/додаткова причина:",
        "filedelete-reason-otherlist": "Інша причина",
        "protect-locked-blocked": "Ви не можете змінювати рівень захисту сторінки, доки ваш обліковий запис заблокований.\nПоточні установки для сторінки '''$1''':",
        "protect-locked-dblock": "Рівень захисту не може бути зміненим, так як основна база даних тимчасово заблокована.\nПоточні установки для сторінки '''$1''':",
        "protect-locked-access": "У вашого облікового запису недостатньо прав для зміни рівня захисту сторінки.\nПоточні установки для сторінки: '''$1''':",
-       "protect-cascadeon": "Ця сторінка зараз захищена у зв'язку з тим, що вона включена в {{PLURAL:$1/1=зазначену нижче сторінку, для якої|нижченаведені сторінки, для яких}} встановлений каскадний захист. Зміни рівня захисту цієї сторінки не вплине на каскадний захист.",
+       "protect-cascadeon": "Ця сторінка зараз захищена у зв'язку з тим, що вона включена у {{PLURAL:$1|1=сторінку, для якої|сторінки, для яких}} встановлений каскадний захист. \nЗміни рівня захисту цієї сторінки не вплине на каскадний захист.",
        "protect-default": "Дозволити всім користувачам",
        "protect-fallback": "Дозволено тільки користувачам із дозволом «$1»",
        "protect-level-autoconfirmed": "Дозволено тільки автопідтвердженим користувачам",
        "tooltip-pt-logout": "Вихід із системи",
        "tooltip-pt-createaccount": "Пропонуємо створити обліковий запис і увійти в систему; однак, це не обов'язково",
        "tooltip-ca-talk": "Обговорення змісту сторінки",
-       "tooltip-ca-edit": "Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\80едагÑ\83ваÑ\82и Ñ\86Ñ\8e Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83. Ð\91Ñ\83дÑ\8c Ð»Ð°Ñ\81ка, Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83йÑ\82е ÐºÐ½Ð¾Ð¿ÐºÑ\83 Ð¿Ð¾Ð¿ÐµÑ\80еднÑ\8cого Ð¿ÐµÑ\80еглÑ\8fдÑ\83 Ð¿ÐµÑ\80ед Ð·Ð±ÐµÑ\80еженнÑ\8fм",
+       "tooltip-ca-edit": "РедагÑ\83ваÑ\82и Ñ\86Ñ\8e Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83",
        "tooltip-ca-addsection": "Створити новий розділ",
        "tooltip-ca-viewsource": "Ця сторінка захищена від змін. Ви можете переглянути і скопіювати її вихідний текст.",
        "tooltip-ca-history": "Журнал змін сторінки",
        "pageinfo-robot-index": "Індексується",
        "pageinfo-robot-noindex": "Не індексується",
        "pageinfo-watchers": "Кількість спостерігачів",
+       "pageinfo-visiting-watchers": "Кількість спостерігачів сторінки, які відвідали останні редагування",
        "pageinfo-few-watchers": "Менше ніж $1 {{PLURAL:$1|спостерігач|спостерігачі|спостерігачів}}",
+       "pageinfo-few-visiting-watchers": "Користувачі, що спостерігають за сторінкою і бачили останні редагування, можуть бути, а можуть ні",
        "pageinfo-redirects-name": "Число перенаправлень на цю сторінку",
        "pageinfo-subpages-name": "Підсторінки цієї сторінки",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|перенаправлення|перенаправлення|перенаправлень}}; $3 {{PLURAL:$3|неперенаправлення|неперенаправлення|неперенаправлень}})",
        "version-libraries": "Встановлені бібліотеки",
        "version-libraries-library": "Бібліотека",
        "version-libraries-version": "Версія",
+       "version-libraries-license": "Ліцензія",
+       "version-libraries-description": "Опис",
+       "version-libraries-authors": "Автори",
        "redirect": "Перенаправлення за файлом, користувачем, сторінкою або ID версії",
        "redirect-legend": "Перенаправити на файл чи сторінку",
        "redirect-summary": "Ця спеціальна сторінка перенаправляє на файл (за поданою назвою файлу), сторінку (за поданим ID версії або сторінки) або сторінку користувача (за поданим числовим ID користувача). Використання: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]],[[{{#Special:Redirect}}/revision/328429]] або [[{{#Special:Redirect}}/user/101]].",
        "htmlform-cloner-create": "Додати більше",
        "htmlform-cloner-delete": "Вилучити",
        "htmlform-cloner-required": "Необхідно принаймні одне значення.",
+       "htmlform-title-badnamespace": "[[:$1]] не в просторі назв «{{ns:$2}}».",
+       "htmlform-title-not-creatable": "«$1» — назва сторінки, яку не можна створити",
+       "htmlform-title-not-exists": "[[:$1]] не існує.",
+       "htmlform-user-not-exists": "<strong>$1</strong> не існує.",
+       "htmlform-user-not-valid": "<strong>$1</strong> не є дійсним іменем користувача.",
        "sqlite-has-fts": "$1 з підтримкою повнотекстового пошуку",
        "sqlite-no-fts": "$1 без підтримки повнотекстового пошуку",
        "logentry-delete-delete": "$1 {{GENDER:$2|вилучив|вилучила}} сторінку $3",
index 061ac9b..80c441a 100644 (file)
@@ -30,7 +30,8 @@
                        "Dinhxuanduyet",
                        "Macofe",
                        "KhangND",
-                       "Darcy Le"
+                       "Darcy Le",
+                       "Quenhitran"
                ]
        },
        "tog-underline": "Gạch chân liên kết:",
        "view": "Xem",
        "view-foreign": "Xem trên $1",
        "edit": "Sửa đổi",
-       "edit-local": "Sửa đổi miêu tả địa phương",
+       "edit-local": "Sửa đổi miêu tả trên wiki địa phương",
        "create": "Tạo",
-       "create-local": "Thêm miêu tả địa phương",
+       "create-local": "Thêm miêu tả trên wiki địa phương",
        "editthispage": "Sửa đổi trang này",
        "create-this-page": "Tạo trang này",
        "delete": "Xóa",
        "prefsnologintext2": "Xin vui lòng đăng nhập để thay đổi tùy chọn.",
        "prefs-skin": "Giao diện",
        "skin-preview": "Xem trước",
-       "datedefault": "Không quan tâm",
+       "datedefault": "Không tuỳ biến",
        "prefs-labs": "Tính năng phòng thí nghiệm",
        "prefs-user-pages": "Trang cá nhân",
        "prefs-personal": "Thông tin cá nhân",
        "prefs-files": "Tập tin",
        "prefs-custom-css": "sửa CSS",
        "prefs-custom-js": "sửa JS",
-       "prefs-common-css-js": "CSS/JS chung cho mọi giao diện:",
+       "prefs-common-css-js": "CSS/JavaScript chung cho mọi giao diện:",
        "prefs-reset-intro": "Có thể mặc định lại toàn bộ tùy chọn dùng trang này. Điều này không thể hoàn tác.",
        "prefs-emailconfirm-label": "Xác nhận thư điện tử:",
        "youremail": "Thư điện tử:",
        "prefs-info": "Thông tin cơ bản",
        "prefs-i18n": "Quốc tế hóa",
        "prefs-signature": "Chữ ký",
-       "prefs-dateformat": "Kiểu ngày tháng",
-       "prefs-timeoffset": "Chênh giờ",
+       "prefs-dateformat": "Kiểu hiển thị ngày tháng",
+       "prefs-timeoffset": "Chênh lệch giờ",
        "prefs-advancedediting": "Tùy chọn chung",
        "prefs-editor": "Trình soạn",
        "prefs-preview": "Xem trước",
        "php-uploaddisabledtext": "Việc tải tập tin trong PHP đã bị tắt. Xin hãy kiểm tra lại thiết lập file_uploads.",
        "uploadscripted": "Tập tin này có chứa mã HTML hoặc kịch bản có thể khiến trình duyệt web thông dịch sai.",
        "upload-scripted-pi-callback": "Không thể tải lên một file có chứa lệnh xử lý XML-stylesheet",
+       "uploaded-script-svg": "Tìm thấy phần tử “$1” có khả năng chạy kịch bản trong tập tin SVG được tải lên.",
+       "uploaded-hostile-svg": "Tìm thấy CSS nguy hiểm trong phần tử style của tập tin SVG được tải lên.",
+       "uploaded-event-handler-on-svg": "Không cho phép đặt thuộc tính xử lý sự kiện <code>$1=\"$2\"</code> trong tập tin SVG.",
+       "uploaded-href-attribute-svg": "Không cho phép thuộc tính href <code>&lt;$1 $2=\"$3\"&gt;</code> có đích ngoài máy (ví dụ http://, javascript:, v.v.) trong tập tin SVG.",
+       "uploaded-href-unsafe-target-svg": "Tìm thấy href đến đích nguy hiểm <code>&lt;$1 $2=\"$3\"&gt;</code> trong tập tin SVG được tải lên.",
+       "uploaded-animate-svg": "Tìm thấy thẻ “animate” có thể thay đổi href qua thuộc tính “from” <code>&lt;$1 $2=\"$3\"&gt;</code> trong tập tin SVG được tải lên.",
+       "uploaded-setting-event-handler-svg": "Đã ngăn cản việc đặt thuộc tính xử lý sự kiện khi tìm thấy <code>&lt;$1 $2=\"$3\"&gt;</code> trong tập tin SVG được tải lên.",
        "uploaded-setting-href-svg": "Sử dụng tag \"set\" để thêm thuộc tính \"href\" tới thành phần mẹ bị khóa.",
+       "uploaded-wrong-setting-svg": "Đã ngăn cản việc sử dụng thẻ “set” để thêm đích bên ngoài/dữ liệu/kịch bản vào thuộc tính nào đó. Tìm thấy <code>&lt;set to=\"$1\"&gt;</code> trong tập tin SVG được tải lên.",
+       "uploaded-setting-handler-svg": "Đã ngăn cản mã SVG đặt thuộc tính “handler” là từ xa/dữ liệu/kịch bản. Tìm thấy <code>$1=\"$2\"</code> trong tập tin SVG được tải lên.",
+       "uploaded-remote-url-svg": "Đã ngăn cản mã SVG đặt thuộc tính style nào đó là URL ngoài máy. Tìm thấy <code>$1=\"$2\"</code> trong tập tin SVG được tải lên.",
        "uploaded-image-filter-svg": "Tìm công cụ lọc ảnh với UPL: <Mã>&lt;$1 $2=\"$3\"&gt;</Mã> trong tập tin SVG được tải lên.",
        "uploadscriptednamespace": "Tập tin SVG này chứa không gian tên “$1” không được cho phép",
        "uploadinvalidxml": "Không thể phân tích mã XML trong tập tin tải lên.",
        "changecontentmodel-reason-label": "Lý do:",
        "changecontentmodel-success-title": "Kiểu nội dung đã thay đổi",
        "changecontentmodel-success-text": "Loại nội dung của [[:$1]] đã được thay đổi.",
+       "changecontentmodel-cannot-convert": "Không thể chuyển đổi nội dung [[:$1]] thành nội dung dưới dạng $2.",
+       "changecontentmodel-title-cantexist": "Không thể có trang tại $1.",
+       "changecontentmodel-nodirectediting": "Mô hình nội dung $1 không hỗ trợ sửa đổi trực tiếp",
+       "log-name-contentmodel": "Nhật trình thay đổi mô hình nội dung",
+       "log-description-contentmodel": "Sự kiện có liên quan đến mô hình nội dung của trang.",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2}}đã thay đổi mô hình nội dung của trang $3 từ “$4” thành “$5”",
+       "logentry-contentmodel-change-revertlink": "lùi lại",
+       "logentry-contentmodel-change-revert": "lùi lại",
        "protectlogpage": "Nhật trình khóa",
        "protectlogtext": "Đây là danh sách các thay đổi mức khóa trang. Xem [[Special:ProtectedPages|danh sách các trang hiện thời đang bị khóa]].",
        "protectedarticle": "đã khóa “[[$1]]”",
        "pageinfo-robot-index": "Cho phép",
        "pageinfo-robot-noindex": "Không cho phép",
        "pageinfo-watchers": "Số người theo dõi trang",
+       "pageinfo-visiting-watchers": "Số người theo dõi trang đã xem sửa đổi gần đây",
        "pageinfo-few-watchers": "Không tới $1 người theo dõi",
+       "pageinfo-few-visiting-watchers": "Có thể có hoặc không có người dùng theo dõi các sửa đổi gần đây",
        "pageinfo-redirects-name": "Số trang đổi hướng đến trang này",
        "pageinfo-redirects-value": "$1",
        "pageinfo-subpages-name": "Số trang con của trang này",
        "htmlform-cloner-create": "Tiếp tục thêm",
        "htmlform-cloner-delete": "Loại bỏ",
        "htmlform-cloner-required": "Cần ít nhất một giá trị.",
+       "htmlform-title-badnamespace": "[[:$1]] không phải trong không gian tên “{{ns:$2}}”.",
+       "htmlform-title-not-creatable": "Không cho phép tạo ra trang với tên “$1”",
+       "htmlform-title-not-exists": "[[:$1]] không tồn tại.",
+       "htmlform-user-not-exists": "<strong>$1</strong> không tồn tại.",
+       "htmlform-user-not-valid": "<strong>$1</strong> không phải là tên người dùng.",
        "sqlite-has-fts": "$1 với sự hỗ trợ tìm kiếm toàn văn",
        "sqlite-no-fts": "$1 không có hỗ trợ tìm kiếm toàn văn",
        "logentry-delete-delete": "$1 {{GENDER:$2}}đã xóa trang “$3”",
        "log-description-pagelang": "Nhật trình này ghi các thay đổi ngôn ngữ của các trang.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2}}đã đổi ngôn ngữ của trang $3 từ $4 thành $5.",
        "default-skin-not-found": "Đã xảy ra lỗi! Giao diện mặc định của wiki này được định nghĩa trong <code dir=\"ltr\">$wgDefaultSkin</code> là <code>$1</code> nhưng không tồn tại.\n\nViệc cài đặt của bạn dường như bao gồm {{PLURAL:$4|giao diện|các giao diện}} sau. Xem [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration Hướng dẫn: Cấu hình giao diện] để biết thông tin về cách kích hoạt {{PLURAL:$4|nó|chúng và chọn giao diện mặc định}}.\n\n$2\n\n; Nếu bạn vừa mới cài đặt MediaWiki:\n: Có lẽ bạn đã cài đặt nó từ git, hoặc trực tiếp từ mã nguồn bằng cách sử dụng một số phương thức khác. Điều này đã nằm trong tính toán của chúng tôi. Hãy thử cài đặt một số giao diện từ [https://www.mediawiki.org/wiki/Category:All_skins thư mục giao diện của mediawiki.org] bằng cách:\n:* Tải về [https://www.mediawiki.org/wiki/Special:MyLanguage/Download trình cài đặt dưới dạng gói tar], trong đó có kèm theo một số giao diện và phần mở rộng. Bạn có thể chép nó và dán vào thư mục <code>skins/</code>.\n:* Tải về các gói giao diện nén riêng từ [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_từ_Git#Using_Git_to_download_MediaWiki_skins Sử dụng Git để tải về giao diện].\n: Cách này sẽ không có ảnh hưởng đến kho git của bạn dù bạn là một nhà phát triển MediaWiki.\n\n; Nếu bạn vừa mới nâng cấp MediaWiki:\n: Phiên bản MediaWiki 1.24 trở lên không còn tự động kích hoạt giao diện đã cài đặt (xem [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Hướng dẫn: Tự động dò giao diện]). Bạn có thể dán {{PLURAL:$5|dòng|các dòng}} sau vào <code>LocalSettings.php</code> để kích hoạt {{PLURAL:$5|giao diện|tất cả các giao diện}} đã được cài dặt:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Nếu bạn vừa mới chỉnh sửa <code>LocalSettings.php</code>:\n: Kiểm tra lại tên các giao diện xem có lỗi đánh máy nào không.",
-       "default-skin-not-found-no-skins": "Đã xảy ra lỗi! Giao diện mặc định của wiki này được định nghĩa trong <code dir=\"ltr\">$wgDefaultSkin</code> là <code>$1</code> nhưng không tồn tại.\n\nKhông có giao diện nào của bạn được kích hoạt.\n\n; Nếu bạn vừa mới cài đặt MediaWiki:\n: Bạn có thể cài đặt nó từ git, hoặc trực tiếp từ mã nguồn bằng cách sử dụng một số phương thức khác. Điều này nằm trong dự kiến. Hãy thử cài đặt một số giao diện từ [https://www.mediawiki.org/wiki/Category:All_skins thư mục giao diện của mediawiki.org], bằng cách:\n:* Tải về [https://www.mediawiki.org/wiki/Special:MyLanguage/Download trình cài đặt dưới dạng gói tar], trong đó có kèm theo một số giao diện và phần mở rộng. Bạn có thể chép nó và dán vào thư mục <code>skins/</code>.\n:* Tải về các gói giao diện nén riêng từ [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:*Sao chép một trong những kho <code>mediawiki/skins/*</code> thông qua git vào trong thư mục <code dir=\"ltr\">skins/</code> của cài đặt MediaWiki của bạn.\n: Cách này sẽ không có ảnh hưởng đến kho git của bạn dù bạn là một nhà phát triển MediaWiki. Xin xem [https://www.mediawiki.org/wiki/Manual:Skin_configuration Hướng dẫn: Cấu hình giao diện] để biết thông tin về cách kích hoạt hoặc chọn một trong số chúng làm giao diện mặc định.",
+       "default-skin-not-found-no-skins": "Đã xảy ra lỗi! Giao diện mặc định của wiki này được định nghĩa trong <code dir=\"ltr\">$wgDefaultSkin</code> là <code>$1</code> nhưng không tồn tại.\n\nKhông có giao diện nào của bạn được kích hoạt.\n\n; Nếu bạn vừa mới cài đặt MediaWiki:\n: Bạn có thể cài đặt nó từ git, hoặc trực tiếp từ mã nguồn bằng cách sử dụng một số phương thức khác. Điều này nằm trong dự kiến. Hãy thử cài đặt một số giao diện từ [https://www.mediawiki.org/wiki/Category:All_skins thư mục giao diện của mediawiki.org], bằng cách:\n:* Tải về [https://www.mediawiki.org/wiki/Special:MyLanguage/Download trình cài đặt dưới dạng gói tar], trong đó có kèm theo một số giao diện và phần mở rộng. Bạn có thể chép nó và dán vào thư mục <code>skins/</code>.\n:* Tải về các gói giao diện nén riêng từ [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git/vi#Using_Git_to_download_MediaWiki_skins Tải về giao diện qua Git].\n: Cách này sẽ không có ảnh hưởng đến kho git của bạn dù bạn là một nhà phát triển MediaWiki. Xin xem [https://www.mediawiki.org/wiki/Manual:Skin_configuration Hướng dẫn: Cấu hình giao diện] để biết thông tin về cách kích hoạt hoặc chọn một trong số chúng làm giao diện mặc định.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (kích hoạt)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''vô hiệu hóa''')",
        "mediastatistics": "Thống kê phương tiện",
index 500a168..ca13562 100644 (file)
        "protectedinterface": "דער בלאַט שטעלט צו באניצער־אויבערפלאך טעקסט פֿאַרן װײכװאַרג אויף דער דאזיקער וויקי, און איז פֿאַרשפּאַרט כּדי צו פֿאַרמײַדן װאַנדאַליזם.\nכדי צולייגן אדער ענדערן איבערזעצונגען פאר אלע וויקיס, זייט אזוי גוט ניצן [//translatewiki.net/ translatewiki.net], דער מעדיעוויקי לאקאליזאציע פראיעקט.",
        "editinginterface": "<strong>ווארענונג:</strong> איר באַאַרבעט א בלאט וואס ווערט געניצט צוצושטעלן אינטערפֿייס טעקסט פאר דער ווייכווארג.\nענדערונגען אין דעם בלאַט וועלן טוישן דאס אויסזען פון די סיסטעם מודעות פאר אנדערע באניצער אויף דער וויקי.",
        "translateinterface": "כדי צו צולייגן איבערזעצונגען פאר אלע וויקיס, זײַט אזוי גוט און ניצט [//translatewiki.net/ translatewiki.net], דער מעדיעוויקי לאקאליזירונג פראיעקט.",
-       "cascadeprotected": "×\93ער ×\91×\9c×\90×\98 ×\90×\99×\96 ×¤×\90רשפ×\90ר×\98 ×¦×\95×\9d ×¢× ×\93ער×\9f ×\95×\95×\99×\91×\90×\9c×\93 ×¢×¨ ×\90×\99×\96 ×\90×\99×\99× ×\92עש×\9c×\90ס×\9f ×\90×\99×\9f ×\90×\99×\99× ×¢ ×¤×\95×\9f ×\93×\99 ×¤×\90×\9c×\92× ×\93×¢ {{PLURAL:$1|×\91×\9c×\90×\98, ×\95×\95×\90ס ×\90×\99×\96\91×\9c×¢×\98ער, ×\95×\95×\90ס ×\96×¢× ×¢×\9f}} ×\91×\90ש×\99צ×\98 ×\9e×\99×\98 ×\93ער ×§×\90סק×\99×\99ד אפציע:\n\n$2",
+       "cascadeprotected": "×\93ער ×\91×\9c×\90×\98 ×\90×\99×\96 ×\92×¢×\95×\95×\90ר×\9f ×\91×\90ש×\99צ×\98 ×¤×\95×\9f ×¨×¢×\93×\90ק×\98×\99ר×\9f ×\95×\95×\99×\91×\90×\9c×\93 ×¢×¨ ×\90×\99×\96 ×\90×\99×\99× ×\92עש×\9c×\90ס×\9f ×\90×\99×\9f {{PLURAL:$1|×\93×¢×\9d ×¤×\90×\9c×\92× ×\93×\9f ×\91×\9c×\90×\98, ×\95×\95×\90ס ×\90×\99×\96\93×\99 ×¤×\90×\9c×\92× ×\93×¢ ×\91×\9c×¢×\98ער, ×\95×\95×\90ס ×\96×¢× ×¢×\9f}} ×\91×\90ש×\99צ×\98 ×\9e×\99×\98 ×\93ער ×§×\90סק×\90ד אפציע:\n\n$2",
        "namespaceprotected": "איר זענט נישט ערלויבט צו רעדאקטירן בלעטער אינעם '''$1''' נאמענטייל.",
        "customcssprotected": "איר האט נישט רשות צו רעדאַקטירן דעם CSS בלאַט, ווײַל ער אַנטהאַלט די פערזענלעכע באַשטימונגען פון אַן אַנדער באַניצער.",
        "customjsprotected": "איר האט נישט רשות צו רעדאַקטירן דעם JavaScript בלאַט, ווײַל ער אַנטהאַלט די פערזענלעכע באַשטימונגען פון אַן אַנדער באַניצער.",
        "readonlywarning": "'''ווארענונג: די דאטנבאזע איז געווארן פארשלאסן פאר אויפהאלטונג, ממילא וועט איר נישט קענען אפהיטן אייערע ענדערונגען אצינד. '''\nאיר קענט קאפירן און ארײַנלייגן דעם טעקסט אריין צו א טעקסט טעקע און דאס דארטן אפהיטן אויף שפעטער.\n\nדער אדמיניסטראטאר וואס האט זי פארשלאסן האט מסביר געווען אזוי: $1",
        "protectedpagewarning": "'''ווארענונג:  דער בלאט איז געווארן פארשפארט אז בלויז באניצערס מיט סיסאפ פריווילעגיעס קענען אים ענדערן.'''\nדי פארגאנגענע לאגבוך באשרײַבונג ווערט געוויזן דא:",
        "semiprotectedpagewarning": "'''באמערקונג:''' דער דאָזיקער בלאַט איז פאַרשפּאַרט, אַזוי אַז בלויז איינגעשריבענע באַניצער קענען אים ענדערן.\nדאָס פאַרגאַנגענע לאָגבוך באַשרייבונג ווערט געוויזן דאָ:",
-       "cascadeprotectedwarning": "'''ווארענונג:''' דער בלאט איז פארשפארט אז בלויז סיסאפן קענען אים ענדערן, וויבאלד ער איז איינגעשלאסן אין {{PLURAL:$1| דעם פאלגנדן בלאט, וואס איז|די פאלגנדע בלעטער, וואס זענען}} קאסקאד באשיצט:",
+       "cascadeprotectedwarning": "<strong>ווארענונג:</strong> דער בלאט איז פארשפארט אז בלויז סיסאפן קענען אים ענדערן, וויבאלד ער איז איינגעשלאסן אין {{PLURAL:$1| דעם פאלגנדן בלאט, וואס איז|די פאלגנדע בלעטער, וואס זענען}} קאסקאד באשיצט:",
        "titleprotectedwarning": "'''אזהרה: דער בלאט איז פֿארשפאַרט טא דארף מען [[Special:ListGroupRights|ספעציפֿישע רעכטן]] צו שאפֿן אים.'''\nדי פֿאַרגאַנגענע לאגבוך באשרײַבונג ווערט געוויזן דאָ:",
        "templatesused": "{{PLURAL:$1|מוסטער|מוסטערן}} באנוצט אויף דעם בלאט:",
        "templatesusedpreview": "{{PLURAL:$1|מוסטער| מוסטערן}}  באַניצט  אין דעם פֿאָראױסקוק:",
        "content-model-css": "CSS",
        "content-json-empty-object": "ליידיגער אביעקט",
        "content-json-empty-array": "ליידיגער אריי",
+       "duplicate-args-warning": "<strong>ווארענונג:</strong> [[:$1]] רופט [[:$2]] מיט מער ווי איין ווערט פארן פאראמעטער \"$3\". נאר דעם לעצטן ווערט וועט מען ניצן.",
        "duplicate-args-category": "בלעטער וואס ניצן געטאפלטע ארגומענטן אין מוסטער רופן",
        "duplicate-args-category-desc": "דער בלאט אנטהאלט מוסטער־אויפרופן וואס ניצן דופליקאטן פון ארגומענטן, ווי למשל <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''אזהרה:''' דער בלאט אנטהאלט צופיל טייערע פארזירער רופן.\n\nער דארף האבן ווינציגער פון  $2 {{PLURAL:$2|רוף|רופן}}, אבער אצינד {{PLURAL:$1|איז דא $1 רוף|זענען דא $1 רופן}}.",
        "protect-text": "איר מעגט זען און ענדערן דעם שוץ ניווא דא פֿארן בלאט '''$1'''.",
        "protect-locked-blocked": "איר קען נישט ענדערן דעם שוץ ניווא בעת ווען איר זענט בלאקירט.\nפֿאלגנד זענען די לויפֿיגע שטעלונגען פֿארן בלאט '''$1''':",
        "protect-locked-access": "אייער קאנטע האט נישט קיין ערלויבניש צו ענדערן בלאט שיצונג ניוואען.\nדא זענען די לויפֿיקע שטעלונגען פֿאַר דעם בלאַט '''$1''':",
-       "protect-cascadeon": "×\93ער ×\91×\9c×\90Ö·×\98 ×\90×\99×\96 ×\92עש×\99צ×\98 ×\90ַצ×\99× ×\93 ×\95×\95ײַ×\9c ×¢×¨ ×\90×\99×\96 ×\90ײַנ×\92עש×\9c×\90ס×\9f ×\90×\99×\9f  {{PLURAL:$1|×\93×¢×\9d ×¤Ö¿×\90×\9c×\92× ×\93×\9f ×\91×\9c×\90Ö·×\98, ×\95×\95×\90ס ×\94×\90×\98\93×\99 ×¤Ö¿×\90×\9c×\92× ×\93×¢ ×\91×\9c×¢×\98ער, ×\95×\95×\90ס ×\94×\90×\91×\9f}} ×§×\90ַסק×\90Ö·×\93×\99ר×\98×¢ ×©×\99צ×\95× ×\92.\n\nענדערונגען צום שיצונג ניווא פונעם בלאַט וועלן נישט ווירקן אויף דער קאַסקאַדירטער שיצונג .",
+       "protect-cascadeon": "×\93ער ×\91×\9c×\90Ö·×\98 ×\90×\99×\96 ×\92עש×\99צ×\98 ×\90ַצ×\99× ×\93 ×\95×\95ײַ×\9c ×¢×¨ ×\90×\99×\96 ×\90ר×\99×\91ער×\92עש×\9c×\90ס×\9f ×\90×\99×\9f  {{PLURAL:$1|×\93×¢×\9d ×¤Ö¿×\90×\9c×\92× ×\93×\9f ×\91×\9c×\90Ö·×\98, ×\95×\95×\90ס ×\94×\90×\98\93×\99 ×¤Ö¿×\90×\9c×\92× ×\93×¢ ×\91×\9c×¢×\98ער, ×\95×\95×\90ס ×\94×\90×\91×\9f}} ×§×\90ַסק×\90Ö·×\93×\99ר×\98×¢ ×©×\99צ×\95× ×\92.\nענדערונגען צום שיצונג ניווא פונעם בלאַט וועלן נישט ווירקן אויף דער קאַסקאַדירטער שיצונג .",
        "protect-default": "אלע באניצער ערלויבט",
        "protect-fallback": "דערלויבן נאר באניצער מיט \"$1\" ערלויבניש",
        "protect-level-autoconfirmed": "לאזן נאר אויטאמאטיש באשטעטיקטע באַניצער",
index 00b4612..775b111 100644 (file)
@@ -29,7 +29,7 @@
                ]
        },
        "tog-underline": "連結加底線:",
-       "tog-hideminor": "最新更改唔顯示修改",
+       "tog-hideminor": "最新更改唔顯示修改",
        "tog-hidepatrolled": "響最近修改度隱藏巡查過嘅編輯",
        "tog-newpageshidepatrolled": "響新頁清單度隱藏巡查過嘅版",
        "tog-extendwatchlist": "展開監視清單去顯示全部更改,唔係淨係最新嘅",
        "tog-watchdeletion": "將我刪除嘅頁同檔案加入監視清單",
        "tog-watchrollback": "將我反轉過嘅頁加落監視清單",
        "tog-minordefault": "預設全部編輯做小修改",
-       "tog-previewontop": "喺修改欄上顯示預覽",
+       "tog-previewontop": "喺修改欄上顯示預覽",
        "tog-previewonfirst": "第一次修改時顯示預覽",
-       "tog-enotifwatchlistpages": "當響我張監視清單度嘅頁面同檔案有修改時電郵通知我",
-       "tog-enotifusertalkpages": "å\80\8b人ç\95\99è¨\80ç\89\88æ\9c\89ä¿®æ\94¹æ\99\82é\9b»é\83µé\80\9aç\9f¥æ\88\91",
-       "tog-enotifminoredits": "頁面同檔案小修改都要電郵通知我",
+       "tog-enotifwatchlistpages": "喺我張監視清單度嘅頁同檔有修改時,用電郵通知我。",
+       "tog-enotifusertalkpages": "å\96ºå\80\8b人ç\95\99è¨\80ç\89\88æ\9c\89ä¿®æ\94¹æ\99\82ï¼\8cç\94¨é\9b»é\83µé\80\9aç\9f¥æ\88\91ã\80\82",
+       "tog-enotifminoredits": "喺頁面同檔案有細修改時,用電郵通知我。",
        "tog-enotifrevealaddr": "喺電郵通知信上面話畀人聽我嘅電郵地址",
        "tog-shownumberswatching": "顯示有幾多人監視",
        "tog-oldsig": "現有簽名:",
        "tog-forceeditsummary": "我冇入修改註解時通知我",
        "tog-watchlisthideown": "響監視清單度隱藏我嘅編輯",
        "tog-watchlisthidebots": "響監視清單度隱藏機械人嘅編輯",
-       "tog-watchlisthideminor": "響監視清單度隱藏修改",
+       "tog-watchlisthideminor": "響監視清單度隱藏修改",
        "tog-watchlisthideliu": "響監視清單度隱藏登入用戶",
        "tog-watchlisthideanons": "響監視清單度隱藏匿名用戶",
        "tog-watchlisthidepatrolled": "響監視清單度隱藏巡查過嘅編輯",
-       "tog-ccmeonemails": "當我寄電郵畀其他人嗰陣寄返封副本畀我",
+       "tog-ccmeonemails": "喺我寄電郵畀其他人嗰陣,寄返封副本畀我。",
        "tog-diffonly": "響差異下面唔顯示頁面內容",
        "tog-showhiddencats": "顯示隱藏類",
        "tog-norollbackdiff": "進行反轉之後略過差異",
        "creating": "開版$1",
        "editingsection": "而家喺度編輯$1 (小節)",
        "editingcomment": "而家喺度編輯$1 (新小節)",
-       "editconflict": "由於編輯衝突,{{GENDER:|你|妳|你}}嘅修改記唔低。{{GENDER:|你|妳|你}}想唔想人手解決呢個衝突?",
+       "editconflict": "ç\94±æ\96¼ç·¨è¼¯è¡\9dçª\81ï¼\8c{{GENDER:|ä½ |妳|ä½ }}å\96º$1å\98\85ä¿®æ\94¹è¨\98å\94\94ä½\8eã\80\82{{GENDER:|ä½ |妳|ä½ }}æ\83³å\94\94æ\83³äººæ\89\8b解決å\91¢å\80\8bè¡\9dçª\81ï¼\9f",
        "explainconflict": "有其他人喺你開始編輯之後已經更改呢一頁。\n喺上面嗰個空間而家現存嘅頁面文字。\n你嘅更改會喺下面嘅文字空間顯示。\n你需要合併你嘅更改到原有嘅文字。\n喺你撳「{{int:savearticle}}」之後,'''只有'''喺上面嘅文字區會被儲存。",
        "yourtext": "你嘅文字",
        "storedversion": "已經儲存咗嘅修訂",
        "yourdiff": "差異",
        "copyrightwarning": "請留意喺{{SITENAME}}度,所有喺呢度嘅貢獻會被考慮到喺$2之下發出(睇$1有更詳細嘅資訊)。如果你係唔想你編輯嘅文字無喇喇咁被分發,咁就唔好喺呢度遞交。\n\n你亦都要同我哋保證啲文字係你自己寫嘅,或者係由公有領域或相似嘅自由資源複製落嚟。\n'''喺未有任何許可嘅情況之下千祈唔好遞交有版權嘅作品!'''",
        "copyrightwarning2": "請留意喺{{SITENAME}}度,所有嘅貢獻可能會被其他嘅貢獻者編輯、修改,或者刪除。如果你係唔想你編輯嘅文字無喇喇咁被編輯,咁就唔好喺呢度遞交。\n\n你亦都要同我哋保證啲文字係你自己寫嘅,或者係由公有領域或相似嘅自由資源複製落嚟(睇$1有更詳細嘅資訊)。\n'''喺未有任何許可嘅情況之下千祈唔好遞交有版權嘅作品!'''",
+       "editpage-cannot-use-custom-model": "呢頁嘅目錄模型唔改得",
        "longpageerror": "<strong>出錯:你所遞交嘅文字係有 {{PLURAL:$1|1 KB|$1 KB}} 咁長,長過最大嘅 {{PLURAL:$2|1 KB|$2 KB}}。</strong>\n儲唔到你遞交嘅文字。",
        "readonlywarning": "<strong>警告:資料庫已經鎖住咗去做定期保養。而家你唔可以儲起你嘅編輯。</strong>\n\n你可以儲啲文字落一份文字檔先。\n\n管理員嘅解釋: $1",
        "protectedpagewarning": "'''警告:呢版已經受到保護,只有管理員權限嘅用戶先至可以改。'''\n最近嘅日誌響下面提供以便參考:",
        "semiprotectedpagewarning": "'''注意:'''呢一頁已經保護咗,只有已經註冊嘅用戶先至可以改。\n最近嘅日誌響下面提供以便參考:",
-       "cascadeprotectedwarning": "'''è­¦å\91\8aï¼\9a'''å\91¢ä¸\80é \81å·²ç¶\93ä¿\9dè­·å\92\97ï¼\8cå\8fªæ\9c\89管理員權限嘅用戶先至可以改,因為佢係響以下連串保護嘅{{PLURAL:$1|一|幾}}頁度包含咗:",
+       "cascadeprotectedwarning": "'''è­¦å\91\8aï¼\9a'''å\91¢ä¸\80é \81å·²ç¶\93ä¿\9dè­·å\92\97ï¼\8cå\87\88å¾\97管理員權限嘅用戶先至可以改,因為佢係響以下連串保護嘅{{PLURAL:$1|一|幾}}頁度包含咗:",
        "titleprotectedwarning": "'''警告:呢一版已經保護咗,需要一啲[[Special:ListGroupRights|指定權限]]先至可以開到。'''\n最近嘅日誌響下面提供以便參考:",
        "templatesused": "呢版用嘅{{PLURAL:$1|模}}:",
        "templatesusedpreview": "呢一次預覽裏面,用咗下面呢啲{{PLURAL:$1|模|模}}:",
        "postedit-confirmation-saved": "呢版經已儲存咗。",
        "edit-already-exists": "唔可以開一新版。\n佢已經存在。",
        "defaultmessagetext": "預設訊息文字",
+       "content-failed-to-parse": "從$1模型解析到$2目錄時肥佬咗。原因:$3。",
        "invalid-content-data": "無效嘅內容資料",
        "content-not-allowed-here": "「$1」唔可以輸入[[$2]]。",
        "editwarning-warning": "離開爾一版會令到閣下嘅修改唔見咗。\n閣下可以喺喜好設定嘅\"{{int:prefs-editing}}\"小節度停用爾個警告。",
        "editpage-notsupportedcontentformat-title": "唔支持爾種內容格式。",
+       "editpage-notsupportedcontentformat-text": "指定嘅目錄類$1同$2唔兼容",
        "content-model-wikitext": "維基文字",
        "content-model-text": "純文字",
        "content-model-javascript": "JavaScript程式語言",
        "parser-template-loop-warning": "已偵測迴模: [[$1]]",
        "parser-template-recursion-depth-warning": "迴模深度限制超過咗 ($1)",
        "language-converter-depth-warning": "字體變換器深度限制超過咗 ($1)",
+       "node-count-exceeded-category": "有頁面超出咗指定數",
+       "node-count-exceeded-category-desc": "頁數超過最大限制,快啲返去改過。",
+       "node-count-exceeded-warning": "頁面超出指定數",
        "undo-success": "呢個編輯可以取消。請檢查一下個差異去確認呢個係你要去做嘅,跟住儲存下面嘅更改去完成編輯。",
        "undo-failure": "呢個編輯唔能夠取消,由於同途中嘅編輯有衝突。",
        "undo-norev": "呢個編輯唔能夠取消,由於佢唔存在或者刪除咗。",
        "history-feed-description": "響哩個wiki嘅哩一頁嘅修訂歷史",
        "history-feed-item-nocomment": "$1 響 $2",
        "history-feed-empty": "要求嘅頁面並唔存在。\n佢可能響哩個 wiki 度刪除咗或者改咗名。\n試吓[[Special:Search|響哩個wiki度搵]]有關新頁面嘅資料。",
+       "history-edit-tags": "編輯已經揀咗嘅分頁",
        "rev-deleted-comment": "(編輯摘要已經移除咗)",
        "rev-deleted-user": "(用戶名已經移除咗)",
        "rev-deleted-event": "(日誌詳情已經移除咗)",
        "rev-deleted-user-contribs": "[用戶名或IP地址拎走咗 - 響貢獻度隱藏咗編輯]",
        "rev-deleted-text-permission": "呢頁嘅修訂已經被'''洗咗'''。\n喺[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 刪除日誌]裏面可以搵到更詳細嘅資料。",
+       "rev-suppressed-text-permission": "呢頁嘅修訂已經'''廢止咗'''。\n你可以去睇吓佢;\n喺[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 廢止日誌]裏面可以搵到更詳細嘅資料。",
        "rev-deleted-text-unhide": "呢頁嘅修訂已經被'''洗咗'''。\n喺[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 刪除日誌]裏面可以搵到更詳細嘅資料。\n如果你想繼續嘅話,可以仍然[$1 睇番呢次修訂]。",
        "rev-suppressed-text-unhide": "呢頁嘅修訂已經被'''廢止咗'''。\n喺[{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} 廢止日誌]裏面可以搵到更詳細嘅資料。\n如果你想繼續嘅話,可以仍然[$1 睇番呢次修訂]。",
        "rev-deleted-text-view": "呢頁嘅修訂已經'''洗咗'''。\n你可以去睇吓佢;\n喺[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]裏面可以搵到更詳細嘅資料。",
        "rev-showdeleted": "顯示",
        "revisiondelete": "刪除/反刪除修訂",
        "revdelete-nooldid-title": "無效嘅目標修訂",
-       "revdelete-nooldid-text": "講清用邊個修訂去做呢樣嘢、\n所指定嘅修訂唔存在,或者你試緊去隱藏現時嘅修訂。",
+       "revdelete-nooldid-text": "講清用邊個修訂去做呢樣嘢、所指定嘅修訂唔存在或你試緊去隱藏現時嘅修訂。",
        "revdelete-no-file": "指定嘅檔案未存在。",
        "revdelete-show-file-confirm": "你係咪真係想去睇響$2 $3刪咗 \"$1\" 嘅檔案修訂?",
        "revdelete-show-file-submit": "係",
        "prefs-diffs": "差異",
        "prefs-help-prefershttps": "呢項喜好設定會喺你下次簽到先至開始生效。",
        "prefswarning-warning": "你改嘅喜好設定改動重未記低。\n如果你未撳「$1」就走咗,你嘅喜好設定唔會有更新。",
+       "prefs-tabs-navigation-hint": "貼士:可以用鍵盤嘅←或→掣睇一覽內嘅分頁",
        "email-address-validity-valid": "電郵地址睇嚟有效",
        "email-address-validity-invalid": "請打一個有效嘅電郵地址",
        "userrights": "用戶權限管理",
        "userrights-notallowed": "你無權限去加減用戶權限。",
        "userrights-changeable-col": "你可以改嘅組",
        "userrights-unchangeable-col": "你唔可以改嘅組",
+       "userrights-removed-self": "移走自身權限成功,但你冇乜可能入到呢頁。",
        "group": "組:",
        "group-user": "用戶",
        "group-autoconfirmed": "自動確認用戶",
        "right-editusercssjs": "編輯其他用戶嘅CSS同埋JavaScript檔",
        "right-editusercss": "編輯其他用戶嘅CSS檔",
        "right-edituserjs": "編輯其他用戶嘅JavaScript檔",
+       "right-editmyusercss": "編輯戶口嘅CSS文件",
+       "right-editmyuserjs": "編輯戶口嘅JavaScript文件",
+       "right-viewmywatchlist": "睇你自己嘅監視一覽",
+       "right-viewmyprivateinfo": "睇下個人信息(例如電郵或真名)",
+       "right-editmyprivateinfo": "修改個人信息(例如電郵或真名)",
+       "right-editmyoptions": "設定個人參數",
        "right-rollback": "快速反轉上位用戶對某一版嘅編輯",
        "right-markbotedits": "標示反轉編輯做機械人編輯",
        "right-noratelimit": "唔受利用率限制影響",
        "right-siteadmin": "鎖同解鎖資料庫",
        "right-override-export-depth": "倒出包含有五層深連版嘅頁面",
        "right-sendemail": "寄電郵畀其他用戶",
+       "right-passwordreset": "檢查密碼/重設電郵",
+       "right-managechangetags": "從數據庫度開或刪走[[Special:Tags|tags]]",
        "newuserlogpage": "使用者開戶記錄",
        "newuserlogpagetext": "呢個係一個使用者開戶嘅日誌",
        "rightslog": "用戶權限日誌",
        "action-createpage": "開版",
        "action-createtalk": "開討論版",
        "action-createaccount": "開呢個用戶戶口",
+       "action-history": "睇呢頁嘅歷史",
        "action-minoredit": "標示呢個編輯做細嘅",
        "action-move": "搬呢版",
        "action-move-subpages": "搬呢版同埋佢嘅細頁",
        "action-move-rootuserpages": "搬根用戶版",
+       "action-move-categorypages": "搬類頁",
        "action-movefile": "搬呢個檔案",
        "action-upload": "上載呢個檔案",
        "action-reupload": "覆蓋呢個現有嘅檔案",
        "action-viewmywatchlist": "睇監視清單",
        "action-viewmyprivateinfo": "睇你嘅私人資料",
        "action-editmyprivateinfo": "改你嘅私人資料",
+       "action-managechangetags": "從數據庫開或刪走啲符",
        "nchanges": "$1次更改",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|你上次嚟之後}}有 $1 個",
        "enhancedrc-history": "歷史",
        "uploaddisabledtext": "檔案上載已經停用。",
        "php-uploaddisabledtext": "PHP 檔案上載已經停用。請檢查 file_uploads 設定。",
        "uploadscripted": "呢個檔案包含可能會誤被瀏覽器解釋執行嘅 HTML 或 script 代碼。",
+       "uploadscriptednamespace": "呢個SVG文件可能有“$1”嘅非法字詞響度",
+       "uploadinvalidxml": "分析唔到已經上傳咗嘅XML文件",
        "uploadvirus": "呢個檔案有病毒!\n詳情:$1",
        "uploadjava": "呢個係個ZIP檔案包括Java .class檔案。\n因為保安問題,上傳Java檔案係禁止左嘅。",
        "upload-source": "來源檔案",
        "upload-misc-error-text": "響上載時發生咗未知嘅錯誤。請確認輸入咗嘅URL係可以訪問嘅,之後再試多一次。如果重有問題嘅話,請聯絡一位[[Special:ListUsers/sysop|管理員]]。",
        "upload-too-many-redirects": "個URL有太多跳轉",
        "upload-http-error": "一個HTTP錯誤發生咗: $1",
+       "upload-copy-upload-invalid-domain": "從嗰個域名度冇複製上傳功能",
+       "backend-fail-backup": "檔案 \"$1\" 唔備份得。",
        "backend-fail-notexists": "檔案$1唔存在。",
+       "backend-fail-invalidpath": "\"$1\"係冇效嘅儲存命令",
        "backend-fail-delete": "刪唔到檔案「$1」。",
+       "backend-fail-describe": "改唔到$1文件嘅數據",
        "backend-fail-alreadyexists": "檔案「$1」已經喺度。",
        "backend-fail-store": "檔案「$1」存唔到去「$2」。",
        "backend-fail-copy": "檔案「$1」抄唔到去「$2」。",
        "uploadstash-badtoken": "進行呢個動作唔成功,或者你嘅編輯資訊已經過咗期。再試吓喇。",
        "uploadstash-errclear": "清除檔案唔成功。",
        "uploadstash-refresh": "更新檔案清單",
+       "invalid-chunk-offset": "非法偏移塊",
        "img-auth-accessdenied": "拒絕通行",
        "img-auth-nopathinfo": "PATH_INFO唔見咗。\n你嘅伺服器重未設定呢個資料。\n佢可能係CGI為本,唔支援img_auth。\n睇吓 https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization 。",
        "img-auth-notindir": "所請求嘅路徑唔響個已經設定咗嘅上載目錄。",
        "randomincategory-nopages": "[[:Category:$1|$1]]類入面無嘢。",
        "randomincategory-category": "類:",
        "randomincategory-legend": "類入面是但一版",
+       "randomincategory-submit": "搵",
        "randomredirect": "隨便彈",
        "randomredirect-nopages": "響 \"$1\" 空間名度冇一個彈去版。",
        "statistics": "統計",
        "trackingcategories": "追蹤類",
        "trackingcategories-msg": "追蹤類",
        "trackingcategories-name": "訊息名",
+       "post-expand-template-inclusion-category-desc": "由於呢篇頁面嘥士喺擴展之前,已經超出咗<code>$wgMaxArticleSize</code>限制,所以好多模都擴展唔到。",
        "trackingcategories-nodesc": "冇解說資料",
        "trackingcategories-disabled": "類停用咗",
        "mailnologin": "冇傳送地址",
        "delete-toobig": "呢一版有一個好大量嘅編輯歷史,過咗$1次修訂。刪除呢類版嘅動作已經限制咗,以防止響{{SITENAME}}嘅意外擾亂。",
        "delete-warning-toobig": "呢一版有一個好大量嘅編輯歷史,過咗$1次修訂。刪除佢可能會擾亂{{SITENAME}}嘅資料庫操作;響繼續嗰陣請小心。",
        "deleteprotected": "你唔可以刪呢版,因為佢畀人保護咗。",
+       "deleting-backlinks-warning": "'''警告:'''你所鏈到或轉到嘅[[Special:WhatLinksHere/{{FULLPAGENAME}}|其它頁面]]已經俾人話刪。",
        "rollback": "反轉修改",
        "rollbacklink": "反轉",
        "rollbacklinkcount": "反轉 $1 次修改",
+       "rollbacklinkcount-morethan": "反轉超過$1次嘅{{PLURAL:$1|edit|修改}}",
        "rollbackfailed": "反轉唔到",
        "cantrollback": "反轉唔到;上一位貢獻者係唯一修改過呢版嘅人。",
        "alreadyrolled": "無法反轉[[User:$2|$2]]([[User talk:$2|留言]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])對[[:$1]]嘅最後編輯;有人已經修改過或者反轉咗呢個頁面。\n\n上次對呢版嘅編輯係由[[User:$3|$3]]([[User talk:$3|留言]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])做嘅。",
        "rollback-success": "已經反轉由$1所寫嘅編輯;恢復到$2嘅最後修訂。",
        "sessionfailure-title": "會話失敗",
        "sessionfailure": "你嘅登入會話 (session) 好似有啲問題;\n為咗防止會話劫持,呢個操作已經取消。\n請返去之前嗰版,重新載入嗰版然後再試。",
+       "changecontentmodel": "喺頁面內改目錄類",
+       "changecontentmodel-legend": "改目錄類",
+       "changecontentmodel-title-label": "版題",
+       "changecontentmodel-model-label": "開新嘅目錄類",
+       "changecontentmodel-reason-label": "原因:",
+       "changecontentmodel-success-title": "目錄類已經改咗",
+       "changecontentmodel-success-text": "[[:$1]]目錄類已經改變咗",
+       "changecontentmodel-cannot-convert": "唔可以喺[[:$1]]嘅目錄轉成$2嘅類。",
+       "changecontentmodel-title-cantexist": "$1冇呢頁,可能係刪咗或未開。",
+       "logentry-contentmodel-change-revertlink": "反轉",
+       "logentry-contentmodel-change-revert": "反轉",
        "protectlogpage": "保護日誌",
        "protectlogtext": "下面係一個保護同埋解除保護頁面改動嘅一覽表。\n睇吓[[Special:ProtectedPages|保護頁面一覽]]去搵而家鎖咗嘅頁。",
        "protectedarticle": "已經保護 \"[[$1]]\"",
        "prot_1movedto2": "[[$1]]搬到去[[$2]]",
        "protect-badnamespace-title": "保護唔到嘅空間名",
        "protect-badnamespace-text": "呢個空間名嘅版面保護唔到。",
+       "protect-norestrictiontypes-text": "呢頁因冇乜限制類響度而唔可以保護。",
        "protect-norestrictiontypes-title": "保護唔到嘅頁",
        "protect-legend": "確認保護",
        "protectcomment": "原因:",
        "databasenotlocked": "資料庫而家冇鎖到。",
        "move-page": "搬$1",
        "move-page-legend": "搬頁",
-       "movepagetext": "用下面個表改版名,搬埋佢嘅歷史。\n舊標題會變做跳轉。\n你可以自動噉更新指到原先標題嘅跳轉。\n如果你揀咗唔去做嘅話,請務必要檢查吓有冇[[Special:DoubleRedirects|雙重跳轉]]或者[[Special:BrokenRedirects|死跳轉]](嘅情況發生)。\n你有責任確保啲連結依然指去佢哋應該指去嘅地方。\n\n注意如果已經有一個同個新名同名嘅頁,噉呢個頁係搬'''唔到'''嘅,除非嗰個同名嘅頁係空嘅或者佢係一個跳轉頁,兼且要之前冇編輯過(冇編輯歷史)先得。噉即係講萬一你搞錯咗,你可以將呢個頁改返去佢改之前噉,你唔可以覆蓋一個現有嘅頁。\n\n'''警告!'''\n噉樣對於一個好多人經過嘅頁面嚟講可能係一個好大嘅同埋出人意表嘅修改;請你喺行動之前確認你清楚噉做嘅後果。",
+       "movepagetext": "用下面個表改版名,搬埋佢嘅歷史。\n舊標題會變做跳轉。\n你可以自動噉更新指到原先標題嘅跳轉。\n如果你揀咗唔去做嘅話,請務必要檢查吓有冇[[Special:DoubleRedirects|雙重跳轉]]或者[[Special:BrokenRedirects|死跳轉]](嘅情況發生)。\n你有責任確保啲連結依然指去佢哋應該指去嘅地方。\n\n注意如果已經有一個同個新名同名嘅頁,噉呢個頁係搬'''唔到'''嘅,除非嗰個同名嘅頁係空嘅或者佢係一個跳轉頁,兼且要之前冇編輯過(冇編輯歷史)先得。噉即係講萬一你搞錯咗,你可以將呢個頁改返去佢改之前噉,你唔可以覆蓋一個現有嘅頁。\n\n<strong>警告!</strong>\n噉樣對於一個好多人經過嘅頁面嚟講可能係一個好大嘅同埋出人意表嘅修改;請你喺行動之前確認你清楚噉做嘅後果。",
        "movepagetext-noredirectfixer": "用下面個表改版名,搬埋佢嘅歷史。\n舊標題會變做跳轉。\n請肯定檢查清楚[[Special:DoubleRedirects|雙重]]或者[[Special:BrokenRedirects|死跳轉]]。\n你有責任確保啲連結依然指去佢哋應該指去嘅地方。\n\n注意如果已經有一個同個新名同名嘅頁,噉呢個頁係搬'''唔到'''嘅,除非嗰個同名嘅頁係空嘅或者佢係一個跳轉頁,兼且要之前冇編輯過(冇編輯歷史)先得。噉即係講萬一你搞錯咗,你可以將呢個頁改返去佢改之前噉,你唔可以覆蓋一個現有嘅頁。\n\n'''警告!'''\n噉樣對於一個好多人經過嘅頁面嚟講可能係一個好大嘅同埋出人意表嘅修改;請你喺行動之前確認你清楚噉做嘅後果。",
        "movepagetalktext": "相應嘅討論頁會連同佢一齊自動搬過去,'''除非''':\n*新嘅頁面名下面已經有咗一個非空嘅討論頁,又或者\n*你唔剔下面個框。\n\n喺呢啲情況下,需要嘅話你唯有手動搬同合併個頁。",
        "movearticle": "搬頁:",
        "import-interwiki-history": "複製呢一頁所有嘅歷史修訂",
        "import-interwiki-templates": "包含全部嘅模",
        "import-interwiki-submit": "倒入",
+       "import-mapping-default": "輸入默認位置",
        "import-upload-filename": "檔名:",
        "import-comment": "註解:",
        "importtext": "請由原 wiki 嘅[[Special:Export|匯出工具]]匯出成檔案。\n儲存喺你部電腦度,然後再上載到呢度。",
        "pageinfo-protect-cascading-yes": "係",
        "pageinfo-protect-cascading-from": "保護引申來源",
        "pageinfo-category-info": "類資料",
+       "pageinfo-category-total": "成員總數",
        "pageinfo-category-pages": "頁數",
        "pageinfo-category-subcats": "子類數",
        "pageinfo-category-files": "檔案數",
        "friday-at": "$1 禮拜五",
        "saturday-at": "$1 禮拜六",
        "sunday-at": "$1 禮拜日",
+       "yesterday-at": "尋日喺$1",
        "bad_image_list": "請根據下面嘅格式去寫:\n\n只有列示項目(以 * 開頭嘅項目)會考慮。第一個連結一定要連去幅壞檔度。\n之後響同一行嘅連結會考慮做例外,即係個檔可以響邊版度同時顯示。",
        "variantname-zh-hans": "簡體",
        "variantname-zh-hant": "繁體",
        "exif-gpsareainformation": "GPS 地區名",
        "exif-gpsdatestamp": "GPS 日期",
        "exif-gpsdifferential": "GPS 差動修正",
+       "exif-jpegfilecomment": "JPEG文件註",
+       "exif-keywords": "關鍵字",
+       "exif-countrydest": "顯示國家",
+       "exif-countrycodedest": "顯示國家地區碼",
+       "exif-provinceorstatedest": "顯示省份或州份或領域地區",
+       "exif-citydest": "顯示城市",
        "exif-objectname": "短標題",
+       "exif-specialinstructions": "特殊介紹",
        "exif-headline": "標題",
        "exif-source": "來源",
+       "exif-contact": "聯繫信息",
        "exif-languagecode": "語言",
        "exif-iimcategory": "類",
        "exif-label": "標籤",
        "exif-copyrighted": "版權狀態",
        "exif-copyrightowner": "版權人",
+       "exif-pngfilecomment": "PNG文件註",
        "exif-disclaimer": "免責聲明",
+       "exif-giffilecomment": "GIF文件註",
+       "exif-intellectualgenre": "項類",
+       "exif-subjectnewscode": "項碼",
        "exif-compression-1": "未壓過",
        "exif-unknowndate": "未知日期",
        "exif-orientation-1": "正常",
        "exif-dc-date": "日子",
        "exif-dc-publisher": "發佈者",
        "exif-dc-rights": "權",
+       "exif-rating-rejected": "拒絕咗",
+       "exif-isospeedratings-overflow": "超出咗65535嘅限制",
        "namespacesall": "全部",
        "monthsall": "全部",
        "confirmemail": "確認電郵地址",
index f082f67..fa1931a 100644 (file)
        "exbeforeblank": "被清空前的内容为:“$1”",
        "delete-confirm": "删除“$1”",
        "delete-legend": "删除",
-       "historywarning": "<strong>警告</strong>:您将要删除的页面有约$1次修订的历史:",
+       "historywarning": "<strong>警告:</strong>您将要删除的页面有约$1次{{PLURAL:$1|修订}}的历史:",
        "confirmdeletetext": "您即将删除一个页面或图像以及其历史。\n请确定您要进行此项操作,并且了解其后果,同时您的行为符合[[{{MediaWiki:Policy-url}}]]。",
        "actioncomplete": "操作完成",
        "actionfailed": "操作失败",
        "htmlform-title-badnamespace": "[[:$1]]不在“{{ns:$2}}”名字空间中。",
        "htmlform-title-not-creatable": "“$1”不是一个可创建的页面标题",
        "htmlform-title-not-exists": "[[:$1]]不存在",
+       "htmlform-user-not-exists": "<strong>$1</strong>不存在。",
+       "htmlform-user-not-valid": "<strong>$1</strong>不是一个有效的用户名。",
        "sqlite-has-fts": "带全文搜索的版本$1",
        "sqlite-no-fts": "不带全文搜索的版本$1",
        "logentry-delete-delete": "$1{{GENDER:$2|删除}}页面$3",
index 760595d..12a5a92 100644 (file)
        "readonlywarning": "<strong>警告:資料庫已被鎖定以進行維護,因此無法儲存您目前所做的編輯動作。</strong>\n您可先複製您的文字並貼上到文字檔案中儲存,稍後再儲存您編輯。\n\n鎖定資料庫的管理員有以下說明:$1",
        "protectedpagewarning": "<strong>警告:本頁已經被保護,只有擁有管理員權限的使用者才可編輯。</strong>\n以下提供最近的日誌以便參考:",
        "semiprotectedpagewarning": "<strong>注意:</strong>本頁已經被保護,只有已註冊的使用者才可編輯。\n以下提供最近的日誌以便參考:",
-       "cascadeprotectedwarning": "<strong>警告:</strong>本頁已經被保護,只有擁有管理員權限的使用者才可編輯,此頁面被下列頁面引用因此連鎖保護:",
+       "cascadeprotectedwarning": "<strong>警告:</strong>本頁已經被保護,只有擁有管理員權限的使用者才可編輯,此頁面被下列{{PLURAL:$1|頁面|頁面}}引用因此連鎖保護:",
        "titleprotectedwarning": "<strong>警告:本頁面已被保護,需要 [[Special:ListGroupRights|特殊權限]] 方可建立。</strong>\n以下提供最近的日誌以便參考:",
        "templatesused": "此頁面使用了以下{{PLURAL:$1|模板}}:",
        "templatesusedpreview": "此預覽使用了以下{{PLURAL:$1|模板}}:",
        "undo-summary-username-hidden": "還原隱藏使用者的修訂 $1",
        "cantcreateaccounttitle": "無法建立帳號",
        "cantcreateaccount-text": "來自這個 IP 位址 (<strong>$1</strong>) 建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n $3 封鎖的原因是 <em>$2</em>",
-       "cantcreateaccount-range-text": "來自 IP 位址範圍 '''$1''',包含您的 IP 位 ('''$4''') 所建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n $3 封鎖的原因是 ''$2''",
+       "cantcreateaccount-range-text": "來自 IP 位址範圍 '''$1''',包含您的 IP 位 ('''$4''') 所建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n $3 封鎖的原因是 ''$2''",
        "viewpagelogs": "檢視此頁面的日誌",
        "nohistory": "此頁沒有任何的修訂記錄。",
        "currentrev": "最新修訂",
        "nopagetext": "您所指定的目標頁面並不存在。",
        "pager-newer-n": "較新 $1 筆",
        "pager-older-n": "較舊 $1 筆",
-       "suppress": "失職",
+       "suppress": "監督",
        "querypage-disabled": "此特殊頁面因考量效能問題已被停用。",
        "apihelp": "API 說明",
        "apihelp-no-such-module": "查無模組 \"$1\"。",
        "htmlform-cloner-create": "新增更多",
        "htmlform-cloner-delete": "移除",
        "htmlform-cloner-required": "至少必須填寫一筆資料。",
+       "htmlform-title-badnamespace": "[[:$1]] 不在 \"{{ns:$2}}\" 命名空間中。",
+       "htmlform-title-not-creatable": "\"$1\" 並非可用來建立頁面的標題",
+       "htmlform-title-not-exists": "[[:$1]] 並不存在。",
+       "htmlform-user-not-exists": "<strong>$1</strong> 並不存在。",
+       "htmlform-user-not-valid": "<strong>$1</strong> 不是有效的使用者名稱。",
        "sqlite-has-fts": "$1 且支援全文搜索",
        "sqlite-no-fts": "$1 且不支援全文搜索",
        "logentry-delete-delete": "$1 刪除頁面 $3",
        "api-error-illegal-filename": "不允許使用的檔案名稱。",
        "api-error-internal-error": "內部錯誤:此 Wiki 在處理你的上傳時發生錯誤。",
        "api-error-invalid-file-key": "內部錯誤:於暫存儲存庫中查無檔案。",
-       "api-error-missingparam": "內部錯誤:請求缺少參數。",
+       "api-error-missingparam": "內部錯誤:請求缺少參數。",
        "api-error-missingresult": "內部錯誤:無法辨識複製是否成功。",
        "api-error-mustbeloggedin": "您必須登入方可上傳檔案。",
        "api-error-mustbeposted": "內部錯誤:請求需使用 HTTP POST。",
index f5ade22..f9ee1be 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Southern Balochi (بÙ\84Ù\88Ú\86Û\8c Ù\85کراÙ\86Û\8c)
+/** Southern Balochi (جÙ\87Ù\84سرÛ\8c Ø¨Ù\84Ù\88Ú\86Û\8c)
  *
  * To improve a translation please visit https://translatewiki.net
  *
index cb52c1a..0c9fa26 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Western Balochi (بÙ\84Ù\88Ú\86Û\8c Ø±Ø®Ø´Ø§Ù\86Û\8c)
+/** Western Balochi (رÙ\88Ú\86 Ú©Ù¾ØªÛ\8cÙ\86 Ø¨Ù\84Ù\88Ú\86Û\8c)
  *
  * To improve a translation please visit https://translatewiki.net
  *
diff --git a/languages/messages/MessagesLuz.php b/languages/messages/MessagesLuz.php
new file mode 100644 (file)
index 0000000..b50b83c
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+/** Southern Luri (لئری جئنوٙڤی)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ */
+
+$fallback = 'lrc, fa';
+$rtl = true;
+
index 7205e6c..865ebb3 100644 (file)
@@ -32,6 +32,8 @@
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
  */
 
+$linkTrail = '/^([a-zA-ZĀāČčĒēĢģĪīĶķĻļŅņŠšŪūŽž]+)(.*)$/sDu';
+
 $namespaceNames = array(
        NS_MEDIA            => 'Media',
        NS_SPECIAL          => 'Special',
index 4bb8369..c901240 100644 (file)
@@ -37,7 +37,6 @@
  * @alternateClassName jqXHR
  */
 
-
 /**
  * @class QUnit
  * @source <http://api.qunitjs.com/>
diff --git a/maintenance/migrateFileRepoLayout.php b/maintenance/migrateFileRepoLayout.php
new file mode 100644 (file)
index 0000000..78587ce
--- /dev/null
@@ -0,0 +1,232 @@
+<?php
+/**
+ * Copy all files in FileRepo to an originals container using SHA1 paths.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Copy all files in FileRepo to an originals container using SHA1 paths.
+ *
+ * This script should be run while the repo is still set to the old layout.
+ *
+ * @ingroup Maintenance
+ */
+class MigrateFileRepoLayout extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Copy files in repo to a different layout.";
+               $this->addOption( 'oldlayout', "Old layout; one of 'name' or 'sha1'", true, true );
+               $this->addOption( 'newlayout', "New layout; one of 'name' or 'sha1'", true, true );
+               $this->addOption( 'since', "Copy only files from after this timestamp", false, true );
+               $this->setBatchSize( 50 );
+       }
+
+       public function execute() {
+               $oldLayout = $this->getOption( 'oldlayout' );
+               if ( !in_array( $oldLayout, array( 'name', 'sha1' ) ) ) {
+                       $this->error( "Invalid old layout.", 1 );
+               }
+               $newLayout = $this->getOption( 'newlayout' );
+               if ( !in_array( $newLayout, array( 'name', 'sha1' ) ) ) {
+                       $this->error( "Invalid new layout.", 1 );
+               }
+               $since = $this->getOption( 'since' );
+
+               $repo = $this->getRepo();
+
+               $be = $repo->getBackend();
+               if ( $be instanceof FileBackendDBRepoWrapper ) {
+                       $be = $be->getInternalBackend(); // avoid path translations for this script
+               }
+
+               $dbw = $repo->getMasterDB();
+
+               $origBase = $be->getContainerStoragePath( "{$repo->getName()}-original" );
+               $startTime = wfTimestampNow();
+
+               // Do current and archived versions...
+               $conds = array();
+               if ( $since ) {
+                       $conds[] = 'img_timestamp >= ' . $dbw->addQuotes( $dbw->timestamp( $since ) );
+               }
+
+               $batch = array();
+               $lastName = '';
+               do {
+                       $res = $dbw->select( 'image', array( 'img_name', 'img_sha1' ),
+                               array_merge( array( 'img_name > ' . $dbw->addQuotes( $lastName ) ), $conds ),
+                               __METHOD__,
+                               array( 'LIMIT' => $this->mBatchSize, 'ORDER BY' => 'img_name' )
+                       );
+
+                       foreach ( $res as $row ) {
+                               $lastName = $row->img_name;
+                               $sha1 = $row->img_sha1;
+                               if ( !strlen( $sha1 ) ) {
+                                       $this->error( "Image SHA-1 not set for {$row->img_name}." );
+                               } else {
+                                       $file = $repo->newFile( $row->img_name );
+
+                                       if ( $oldLayout === 'sha1' ) {
+                                               $spath = "{$origBase}/{$sha1[0]}/{$sha1[1]}/{$sha1[2]}/{$sha1}";
+                                       } else {
+                                               $spath = $file->getPath();
+                                       }
+
+                                       if ( $newLayout === 'sha1' ) {
+                                               $dpath = "{$origBase}/{$sha1[0]}/{$sha1[1]}/{$sha1[2]}/{$sha1}";
+                                       } else {
+                                               $dpath = $file->getPath();
+                                       }
+
+                                       $status = $be->prepare( array( 'dir' => dirname( $dpath ) ) );
+                                       if ( !$status->isOK() ) {
+                                               $this->error( print_r( $status->getErrorsArray(), true ) );
+                                       }
+
+                                       $batch[] = array( 'op' => 'copy', 'overwrite' => true,
+                                               'src' => $spath, 'dst' => $dpath, 'img' => $row->img_name );
+                               }
+
+                               foreach ( $file->getHistory() as $ofile ) {
+                                       $sha1 = $ofile->getSha1();
+                                       if ( !strlen( $sha1 ) ) {
+                                               $this->error( "Image SHA-1 not set for {$ofile->getArchiveName()}." );
+                                               continue;
+                                       }
+
+                                       if ( $oldLayout === 'sha1' ) {
+                                               $spath = "{$origBase}/{$sha1[0]}/{$sha1[1]}/{$sha1[2]}/{$sha1}";
+                                       } elseif ( $ofile->isDeleted( File::DELETED_FILE ) ) {
+                                               $spath = $be->getContainerStoragePath( "{$repo->getName()}-deleted" ) .
+                                                       '/' . $repo->getDeletedHashPath( $sha1 ) .
+                                                       $sha1 . '.' . $ofile->getExtension();
+                                       } else {
+                                               $spath = $ofile->getPath();
+                                       }
+
+                                       if ( $newLayout === 'sha1' ) {
+                                               $dpath = "{$origBase}/{$sha1[0]}/{$sha1[1]}/{$sha1[2]}/{$sha1}";
+                                       } else {
+                                               $dpath = $ofile->getPath();
+                                       }
+
+                                       $status = $be->prepare( array( 'dir' => dirname( $dpath ) ) );
+                                       if ( !$status->isOK() ) {
+                                               $this->error( print_r( $status->getErrorsArray(), true ) );
+                                       }
+                                       $batch[] = array( 'op' => 'copy', 'overwrite' => true,
+                                               'src' => $spath, 'dst' => $dpath, 'img' => $ofile->getArchiveName() );
+                               }
+
+                               if ( count( $batch ) >= $this->mBatchSize ) {
+                                       $this->runBatch( $batch, $be );
+                                       $batch = array();
+                               }
+                       }
+               } while ( $res->numRows() );
+
+               if ( count( $batch ) ) {
+                       $this->runBatch( $batch, $be );
+               }
+
+               // Do deleted versions...
+               $conds = array();
+               if ( $since ) {
+                       $conds[] = 'fa_deleted_timestamp >= ' . $dbw->addQuotes( $dbw->timestamp( $since ) );
+               }
+
+               $batch = array();
+               $lastId = 0;
+               do {
+                       $res = $dbw->select( 'filearchive', array( 'fa_storage_key', 'fa_id', 'fa_name' ),
+                               array_merge( array( 'fa_id > ' . $dbw->addQuotes( $lastId ) ), $conds ),
+                               __METHOD__,
+                               array( 'LIMIT' => $this->mBatchSize, 'ORDER BY' => 'fa_id' )
+                       );
+
+                       foreach ( $res as $row ) {
+                               $lastId = $row->fa_id;
+                               $sha1Key = $row->fa_storage_key;
+                               if ( !strlen( $sha1Key ) ) {
+                                       $this->error( "Image SHA-1 not set for file #{$row->fa_id} (deleted)." );
+                                       continue;
+                               }
+                               $sha1 = substr( $sha1Key, 0, strpos( $sha1Key, '.' ) );
+
+                               if ( $oldLayout === 'sha1' ) {
+                                       $spath = "{$origBase}/{$sha1[0]}/{$sha1[1]}/{$sha1[2]}/{$sha1}";
+                               } else {
+                                       $spath = $be->getContainerStoragePath( "{$repo->getName()}-deleted" ) .
+                                               '/' . $repo->getDeletedHashPath( $sha1Key ) . $sha1Key;
+                               }
+
+                               if ( $newLayout === 'sha1' ) {
+                                       $dpath = "{$origBase}/{$sha1[0]}/{$sha1[1]}/{$sha1[2]}/{$sha1}";
+                               } else {
+                                       $dpath = $be->getContainerStoragePath( "{$repo->getName()}-deleted" ) .
+                                               '/' . $repo->getDeletedHashPath( $sha1Key ) . $sha1Key;
+                               }
+
+                               $status = $be->prepare( array( 'dir' => dirname( $dpath ) ) );
+                               if ( !$status->isOK() ) {
+                                       $this->error( print_r( $status->getErrorsArray(), true ) );
+                               }
+
+                               $batch[] = array( 'op' => 'copy', 'src' => $spath, 'dst' => $dpath,
+                                       'overwriteSame' => true, 'img' => "(ID {$row->fa_id}) {$row->fa_name}" );
+
+                               if ( count( $batch ) >= $this->mBatchSize ) {
+                                       $this->runBatch( $batch, $be );
+                                       $batch = array();
+                               }
+                       }
+               } while ( $res->numRows() );
+
+               if ( count( $batch ) ) {
+                       $this->runBatch( $batch, $be );
+               }
+
+               $this->output( "Done (started $startTime)\n" );
+       }
+
+       protected function getRepo() {
+               return RepoGroup::singleton()->getLocalRepo();
+       }
+
+       protected function runBatch( array $ops, FileBackend $be ) {
+               $this->output( "Migrating file batch:\n" );
+               foreach ( $ops as $op ) {
+                       $this->output( "\"{$op['img']}\" (dest: {$op['dst']})\n" );
+               }
+
+               $status = $be->doOperations( $ops );
+               if ( !$status->isOK() ) {
+                       $this->output( print_r( $status->getErrorsArray(), true ) );
+               }
+
+               $this->output( "Batch done\n\n" );
+       }
+}
+
+$maintClass = 'MigrateFileRepoLayout';
+require_once RUN_MAINTENANCE_IF_MAIN;
index 7b05cb7..d655965 100644 (file)
@@ -89,11 +89,10 @@ class CLIParser extends Maintenance {
         * @return string Wikitext
         */
        protected function Wikitext() {
-
                $php_stdin = 'php://stdin';
                $input_file = $this->getArg( 0, $php_stdin );
 
-               if ( $input_file === $php_stdin ) {
+               if ( $input_file === $php_stdin && !$this->mQuiet ) {
                        $ctrl = wfIsWindows() ? 'CTRL+Z' : 'CTRL+D';
                        $this->error( basename( __FILE__ )
                                . ": warning: reading wikitext from STDIN. Press $ctrl to parse.\n" );
diff --git a/maintenance/postgres/archives/patch-textsearch_bug66650.sql b/maintenance/postgres/archives/patch-textsearch_bug66650.sql
new file mode 100644 (file)
index 0000000..e4f5681
--- /dev/null
@@ -0,0 +1,5 @@
+UPDATE /*_*/pagecontent SET textvector=to_tsvector(old_text)
+WHERE textvector IS NULL AND old_id IN 
+(SELECT  max(rev_text_id) FROM revision GROUP BY rev_page);
+
+INSERT INTO /*_*/updatelog(ul_key) VALUES ('patch-textsearch_bug66650.sql');
index 7761d0c..b858551 100644 (file)
@@ -27,3 +27,8 @@ INSERT INTO /*_*/updatelog (ul_key, ul_value)
        VALUES( 'user_former_groups-ufg_group-patch-ufg_group-length-increase-255.sql', null );
 INSERT INTO /*_*/updatelog (ul_key, ul_value)
        VALUES( 'user_properties-up_property-patch-up_property.sql', null );
+
+-- PostgreSQL-specific patches.
+
+INSERT INTO /*_*/updatelog (ul_key, ul_value)
+       VALUES( 'patch-textsearch_bug66650.sql', null );
index 7bf0f2c..840b6a9 100644 (file)
@@ -256,6 +256,35 @@ return array(
        'jquery.hoverIntent' => array(
                'scripts' => 'resources/lib/jquery/jquery.hoverIntent.js',
        ),
+       'jquery.i18n' => array(
+               'scripts' => array(
+                       'resources/lib/jquery.i18n/src/jquery.i18n.js',
+                       'resources/lib/jquery.i18n/src/jquery.i18n.messagestore.js',
+                       'resources/lib/jquery.i18n/src/jquery.i18n.parser.js',
+                       'resources/lib/jquery.i18n/src/jquery.i18n.emitter.js',
+                       'resources/lib/jquery.i18n/src/jquery.i18n.emitter.bidi.js',
+                       'resources/lib/jquery.i18n/src/jquery.i18n.language.js',
+                       'resources/lib/jquery.i18n/src/jquery.i18n.fallbacks.js',
+               ),
+               'dependencies' => 'mediawiki.libs.pluralruleparser',
+               'languageScripts' => array(
+                       'bs' => 'resources/lib/jquery.i18n/src/languages/bs.js',
+                       'dsb' => 'resources/lib/jquery.i18n/src/languages/dsb.js',
+                       'fi' => 'resources/lib/jquery.i18n/src/languages/fi.js',
+                       'ga' => 'resources/lib/jquery.i18n/src/languages/ga.js',
+                       'he' => 'resources/lib/jquery.i18n/src/languages/he.js',
+                       'hsb' => 'resources/lib/jquery.i18n/src/languages/hsb.js',
+                       'hu' => 'resources/lib/jquery.i18n/src/languages/hu.js',
+                       'hy' => 'resources/lib/jquery.i18n/src/languages/hy.js',
+                       'la' => 'resources/lib/jquery.i18n/src/languages/la.js',
+                       'ml' => 'resources/lib/jquery.i18n/src/languages/ml.js',
+                       'os' => 'resources/lib/jquery.i18n/src/languages/os.js',
+                       'ru' => 'resources/lib/jquery.i18n/src/languages/ru.js',
+                       'sl' => 'resources/lib/jquery.i18n/src/languages/sl.js',
+                       'uk' => 'resources/lib/jquery.i18n/src/languages/uk.js',
+               ),
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
        'jquery.localize' => array(
                'scripts' => 'resources/src/jquery/jquery.localize.js',
        ),
@@ -1758,6 +1787,7 @@ return array(
                        'resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.js',
                        'resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js',
                        'resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js',
                ),
                'skinStyles' => array(
                        'default' => array(
index 8320b37..974db87 100644 (file)
@@ -27,11 +27,12 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 // WARNING: OOjs-UI is NOT TESTED with older browsers and is likely to break
 // if loaded in browsers that don't support ES5
 return call_user_func( function () {
-       // Core default themes
-       $themes = array( 'default' => 'mediawiki' );
-       $themes += ExtensionRegistry::getInstance()->getAttribute( 'SkinOOUIThemes' );
-       $modules = array();
+       $themes = ExtensionRegistry::getInstance()->getAttribute( 'SkinOOUIThemes' );
+       // We only use the theme names for file names, and they are lowercase
+       $themes = array_map( 'strtolower', $themes );
+       $themes['default'] = 'mediawiki';
 
+       $modules = array();
        $modules['oojs-ui'] = array(
                'scripts' => array(
                        'resources/lib/oojs-ui/oojs-ui.js',
diff --git a/resources/lib/jquery.i18n/CREDITS b/resources/lib/jquery.i18n/CREDITS
new file mode 100644 (file)
index 0000000..3a4eb5e
--- /dev/null
@@ -0,0 +1,9 @@
+Credits
+=======
+
+Santhosh Thottingal
+Amir E. Aharoni
+Siebrand Mazeland
+Niklas Laxström
+Neil Kandalgaonkar
+David Chan
diff --git a/resources/lib/jquery.i18n/GPL-LICENSE b/resources/lib/jquery.i18n/GPL-LICENSE
new file mode 100644 (file)
index 0000000..019694a
--- /dev/null
@@ -0,0 +1,342 @@
+== GNU GENERAL PUBLIC LICENSE ==
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+=== Preamble ===
+
+The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+== TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ==
+
+'''0.''' This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+'''1.''' You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+'''2.''' You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+       '''a)''' You must cause the modified files to carry prominent notices
+       stating that you changed the files and the date of any change.
+
+       '''b)''' You must cause any work that you distribute or publish, that in
+       whole or in part contains or is derived from the Program or any
+       part thereof, to be licensed as a whole at no charge to all third
+       parties under the terms of this License.
+
+       '''c)''' If the modified program normally reads commands interactively
+       when run, you must cause it, when started running for such
+       interactive use in the most ordinary way, to print or display an
+       announcement including an appropriate copyright notice and a
+       notice that there is no warranty (or else, saying that you provide
+       a warranty) and that users may redistribute the program under
+       these conditions, and telling the user how to view a copy of this
+       License.  (Exception: if the Program itself is interactive but
+       does not normally print such an announcement, your work based on
+       the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+'''3.''' You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+       '''a)''' Accompany it with the complete corresponding machine-readable
+       source code, which must be distributed under the terms of Sections
+       1 and 2 above on a medium customarily used for software interchange; or,
+
+       '''b)''' Accompany it with a written offer, valid for at least three
+       years, to give any third party, for a charge no more than your
+       cost of physically performing source distribution, a complete
+       machine-readable copy of the corresponding source code, to be
+       distributed under the terms of Sections 1 and 2 above on a medium
+       customarily used for software interchange; or,
+
+       '''c)''' Accompany it with the information you received as to the offer
+       to distribute corresponding source code.  (This alternative is
+       allowed only for noncommercial distribution and only if you
+       received the program in object code or executable form with such
+       an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+'''4.''' You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+'''5.''' You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+'''6.''' Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+'''7.''' If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+'''8.''' If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+'''9.''' The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+'''10.''' If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+=== NO WARRANTY ===
+
+'''11.''' BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+'''12.''' IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+       '''END OF TERMS AND CONDITIONS'''
+
+== How to Apply These Terms to Your New Programs ==
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+       <one line to give the program's name and a brief idea of what it does.>
+
+       Copyright (C) <year>  <name of author>
+
+       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
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+       Gnomovision version 69, Copyright (C) year name of author
+       Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+       This is free software, and you are welcome to redistribute it
+       under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+       Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+       `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+       <signature of Ty Coon>, 1 April 1989
+
+       Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/resources/lib/jquery.i18n/MIT-LICENSE b/resources/lib/jquery.i18n/MIT-LICENSE
new file mode 100644 (file)
index 0000000..f3a03b7
--- /dev/null
@@ -0,0 +1,21 @@
+Copyright (c) 2012-2013 Santhosh Thottingal and other
+contributors. See CREDITS for a list.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/resources/lib/jquery.i18n/README.md b/resources/lib/jquery.i18n/README.md
new file mode 100644 (file)
index 0000000..da82c2b
--- /dev/null
@@ -0,0 +1,432 @@
+jQuery.i18n
+===========
+
+jQuery.i18n is a jQuery based Javascript internationalization library. It helps you to internationalize your web applications easily.
+
+This is a project by Wikimedia foundation's [Language Engineering team](http://wikimediafoundation.org/wiki/Language_Engineering_team) and used in some of the Wikimedia Foundation projects like Universal Language Selector.
+
+The jquery.i18n library uses a json based localization file format, "banana", which is used as the localization file format for  MediaWiki and other projects.
+
+Features
+========
+* Simple file format - JSON. Easily readable for humans and machines.
+* Author and metadata information is not lost anywhere. There are other file formats using comments to store this.
+* Uses MediaWiki convention for placeholders. Easily readable and proven convention. Example: ```There are $1 cars```
+* Supports plural conversion without using extra messages for all plural forms. Plural rule handling is done using CLDR. Covers a wide range of languages
+* Supports gender. By passing the gender value, you get correct sentences according to gender.
+* Supports grammar forms. jquery.i18n has a basic but extensible grammar conversion support
+* Fallback chains for all languages.
+* Data api- the message key. Example: ```<li data-i18n="message-key"></li>```.
+* Dynamic change of interface language without refreshing a webpage.
+* Nestable grammar, plural, gender support. These constructs can be nested to any arbitrary level for supporting sophisticated message localization
+* Message documentation through special language code ```qqq```
+* Extensible message parser to add or customize magic words in the messages. Example: ```{sitename}``` or ```[[link]]``
+
+
+Quick start
+-----------
+
+```bash
+git clone https://github.com/wikimedia/jquery.i18n.git
+cd jquery.i18n
+git submodule update --init
+```
+
+Testing
+-------
+
+```shell
+npm install
+```
+
+To run tests locally, run `npm test`, and this will run the tests.
+
+Message File Format
+===================
+
+The message files are json formatted. As a convention you can have a folder named i18n inside your source code. For each language or locale, have a file named like languagecode.json.
+
+Example:
+```
+App
+       |--src
+       |--doc
+       |--i18n
+               |--ar.json
+               |--de.json
+               |--en.json
+               |--he.json
+               |--hi.json
+               |--fr.json
+               |--qqq.json
+```
+
+A simple en.json file example is given below
+
+```json
+{
+       "@metadata": {
+               "authors": [
+                       "Alice",
+                       "David",
+                       "Santhosh"
+               ],
+               "last-updated": "2012-09-21",
+               "locale": "en",
+               "message-documentation": "qqq",
+               "AnotherMetadata": "AnotherMedatadataValue"
+       },
+       "appname-title": "Example Application",
+       "appname-sub-title": "An example application with jquery.i18n",
+       "appname-header-introduction": "Introduction",
+       "appname-about": "About this application",
+       "appname-footer": "Footer text"
+}
+```
+
+The json file should be a valid json. The ```@metadata``` holds all kind of data that are not messages. You can store author information, copyright, updated date or anything there.
+
+Messages are key value pairs. It is a good convention to prefix your appname to message keys to make the messages unique. It acts as the namespace for the message keys. It is also a good convention to have the message keys with ```-``` separated words, all in lower case.
+
+If you are curious to see some real jquery.i18n message file from other projects:
+
+- message files of MediaWiki https://github.com/wikimedia/mediawiki-core/tree/master/languages/i18n
+- message files from jquery.uls project https://github.com/wikimedia/jquery.uls/blob/master/i18n
+
+Single message file for all languages
+-------------------------------------
+There are some alternate message file format supported for different use cases. If your application is not big, and want all the translation in a single file, you can have it as shown in the below example:
+
+```json
+{
+       "@metadata": {
+               "authors": [
+                       "Alice",
+                       "David",
+                       "Santhosh"
+               ],
+               "last-updated": "2012-09-21",
+               "locale": "en",
+               "message-documentation": "qqq",
+               "AnotherMetadata": "AnotherMedatadataValue"
+       },
+       "en": {
+               "appname-title": "Example Application",
+               "appname-sub-title": "An example application with jquery.i18n",
+               "appname-header-introduction": "Introduction",
+               "appname-about": "About this application",
+               "appname-footer": "Footer text"
+               },
+       "ml": {
+               "appname-title": "അപ്ലിക്കേഷന്‍ ഉദാഹരണം",
+               "appname-sub-title": "jquery.i18n ഉപയോഗിച്ചുള്ള അപ്ലിക്കേഷന്‍ ഉദാഹരണം",
+               "appname-header-introduction": "ആമുഖം",
+               "appname-about": "ഈ അപ്ലിക്കേഷനെപ്പറ്റി",
+               "appname-footer": "അടിക്കുറിപ്പു്"
+       }
+}
+```
+
+Here the json file contains language code as key value and messagekey-message pairs as the value for all language pairs. You can choose this format or per-language file formats depending on your use case. Per-language files are more convenient for collaboration, version controlling, scalability, etc.
+
+In this approach, it is also possible to give a file name as the value of language code.
+
+```json
+{
+       "@metadata": {
+               "authors": [
+                       "Alice",
+                       "David",
+                       "Santhosh"
+               ],
+               "last-updated": "2012-09-21",
+               "locale": "en",
+               "message-documentation": "qqq",
+               "AnotherMetadata": "AnotherMedatadataValue"
+       },
+       "en": {
+               "appname-title": "Example Application",
+               "appname-sub-title": "An example application with jquery.i18n",
+               "appname-header-introduction": "Introduction",
+               "appname-about": "About this application",
+               "appname-footer": "Footer text"
+               },
+       "ml": "path/to/ml.json"
+}
+```
+
+Translation
+===========
+To translate the jquery.i18n application, depending on the expertise of the translator, there are multiple ways.
+
+* Editing the json files directly - Suitable for translators with technical background. Also suitable if your application is small and you want to work with only a small number of languages
+* Providing a translation interface along with your application: Suitable for proprietary or private applications with significant amount of translators
+* Using open source translation platforms like translatewiki.net. The MediaWiki and jquery.uls from previous examples use translatewiki.net for crowdsourced message translation. Translatewiki.net can update your code repo in regular intervals with updated translations. Highly recommended if your application is opensource and want localized to as many as languages possible with maximum number of translators.
+
+Usage
+=====
+
+## Switching locale
+
+While initializing the `jquery.i18n`, the locale for the page can be given using the `locale` option. For example
+
+```javascript
+$.i18n( {
+    locale: 'he' // Locale is Hebrew
+} );
+```
+
+In case locale option is not given, `jquery.i18n` plugin will use the language attribute given for the html tag. For example
+
+```html
+<html lang="he" dir="rtl">
+```
+
+In this case the locale will be he(Hebrew). If that `lang` attribute is also missing, it will try to use the locale specified by the browser.
+
+It is possible to switch to another locale after plugin is initialized. See below example:
+
+```javascript
+$.i18n({
+    locale: 'he' // Locale is Hebrew
+});
+$.i18n( 'message_hello' ); // This will give the Hebrew translation of message key `message_hello`.
+$.i18n().locale = 'ml'; // Now onwards locale is 'Malayalam'
+$.i18n( 'message_hello' ); // This will give the Malayalam translation of message key `message_hello`.
+```
+
+## Message Loading
+
+JSON formatted messages can be loaded to the plugin using multiple ways.
+
+### Dynamic loading using `load` method.
+
+Following example shows loading messages for two locales- localex, and localey. Here localex and localey are just examples. They should be valid IS0 639 language codes(eg: en, ml, hi, fr, ta etc)
+
+```javascript
+$.i18n().load( {
+       'localex' : {
+               'message-key1' : 'message1' // Message for localex.
+       },
+       'localey' : {
+               'message-key1' : 'message1'
+       }
+} );
+```
+
+If we want to load the messages for a specific locale, it can be done like this:
+
+```javascript
+$.i18n().load({
+    'message-hello': 'Hello World',
+    'message-welcome': 'Welcome'
+}, 'en');
+```
+
+Note the second argument for the `load` method. It should be a valid language code.
+
+It is also possible to refer messages from an external URL. See below example
+
+```javascript
+$.i18n().load( {
+       en: {
+               message_hello: 'Hello World',
+       message_welcome: 'Welcome'
+       },
+       hi: 'i18n/messages-hi.json', // Messages for Hindi
+       de: 'i18n/messages-de.json'
+} );
+```
+
+Messages for a locale can be also loaded in parts. Example
+
+```javascript
+$.i18n().load( {
+       en: {
+               message_hello: 'Hello World',
+       message_welcome: 'Welcome'
+       }
+} );
+
+$.i18n().load( {
+       // This does not remove the previous messages.
+       en: {
+               'message_header' : 'Header',
+               'message_footer' : 'Footer',
+               // This will overwrite message_welcome message
+               'message_welcome' : 'Welcome back'
+       }
+} );
+```
+
+Since it is desirable to render interface messages instantly and not after a delay of loading the message files from a server, make sure that the messages are present at client side before using jQuery.i18n.
+
+The library should expose an API to load an object containing key-value pair of messages. Example: ```$.i18n.load(data)```. This will return a ```jQuery.Promise```.
+
+jquery.i18n plugin
+=========================
+
+The jQuery plugin defines ```$.i18n()``` and ```$.fn.i18n()```
+
+```javascript
+$.i18n( 'message-key-sample1' );
+$.i18n( 'message-key-sample1' );
+$.i18n( 'Found $1 {{plural:$1|result|results}}', 10 ); // Message key itself is message text
+$.i18n( 'Showing $1 out of $2 {{plural:$2|result|results}}', 5,100 );
+$.i18n(' User X updated {{gender|his|her}} profile', 'male' );
+
+$( '#foo' ).i18n(); // to translate the element matching jquery selector based on data-i18n key
+```
+
+Data API
+--------
+
+It is possible to display localized messages without any custom JavaScript. For the HTML tags, add an attribute data-i18n with value as the message key. Example:
+```html
+<li data-i18n="message-key"></li>.
+```
+
+It is also possible to have the above li node with fallback text already in place.
+```html
+<li data-i18n="message-key">Fallback text</li>
+```
+
+The framework will place the localized message corresponding to message-key as the text value of the node. Similar to $('selector').i18n( ... ).
+This will not work for dynamically created elements.
+
+Note that if data-i18n contains html markup, that html will not be used as the element content, instead, the text version will be used. $.fn.i18n is always about replacing text of the element. If you want to change the html of the element, you may want to use: ```$(selector).html($.i18n(messagekey))```
+
+Examples
+========
+
+See http://thottingal.in/projects/js/jquery.i18n/demo/
+
+Message format
+==============
+
+## Placeholders
+
+Messages take parameters. They are represented by $1, $2, $3, … in the message texts, and replaced at run time. Typical parameter values are numbers (Example: "Delete 3 versions?"), or user names (Example: "Page last edited by $1"), page names, links, and so on, or sometimes other messages.
+
+```javascript
+var message = "Welcome, $1";
+$.i18n(message, 'Alice'); // This gives "Welcome, Alice"
+```
+
+
+## Plurals
+
+To make the syntax of sentence correct, plural forms are required. jquery.i18n support plural forms in the message using the syntax `{{PLURAL:$1|pluralform1|pluralform2|...}}`
+
+For example:
+
+```javascript
+var message = "Found $1 {{PLURAL:$1|result|results}}";
+$.i18n(message, 1); // This gives "Found 1 result"
+$.i18n(message, 4); // This gives "Found 4 results"
+```
+Note that {{PLURAL:...}} is not case sensitive. It can be {{plural:...}} too.
+
+In case of English, there are only 2 plural forms, but many languages use more than 2 plural forms. All the plural forms can be given in the above syntax, separated by pipe(|)
+
+## Gender
+Similar to plural, depending on gender of placeholders, mostly user names, the syntax changes dynamically. An example in English is "Alice changed her profile picture" and "Bob changed his profile picture". To support this {{GENDER...}} syntax can be used as show in example
+
+```javascript
+var message = "$1 changed {{GENDER:$2|his|her}} profile picture";
+$.i18n(message, 'Alice', 'female' ); // This gives "Alice changed her profile picture"
+$.i18n(message, 'Bob', 'male' ); // This gives "Bob changed his profile picture"
+```
+
+Note that {{GENDER:...}} is not case sensitive. It can be {{gender:...}} too.
+
+## Grammar
+
+
+```javascript
+$.i18n( { locale: 'fi' } );
+
+var message = "{{grammar:genitive|$1}}";
+
+$.i18n(message, 'talo' ); // This gives "talon"
+
+$.i18n().locale = 'hy'; // Switch to locale Armenian
+$.i18n(message, 'Մաունա'); // This gives "Մաունայի"
+```
+
+## Directionality-safe isolation
+
+To avoid BIDI corruption that looks like "(Foo_(Bar", which happens when a string is inserted into a context with the reverse directionality, you can use `{{bidi:…}}`. Directionality-neutral characters at the edge of the string can get wrongly interpreted by the BIDI algorithm. This would let you embed your substituted string into a new BIDI context, //e.g.//:
+
+   "`Shalom, {{bidi:$1}}, hi!`"
+
+The embedded context's directionality is determined by looking at the argument for `$1`, and then explicitly inserted into the Unicode text, ensuring correct rendering (because then the bidi algorithm "knows" the argument text is a separate context).
+
+
+Fallback
+========
+
+The plugin takes an option 'fallback' with the default value 'en'. The library reuses the fallback data available in MediaWiki for calculating the language fallbacks. Fallbacks are used when a message key is not found in a locale. Example fallbacks: sa->hi->en or tt->tt-cyrl->ru.
+
+See jquery.i18n.fallbacks.js in the source.
+
+Magic word support
+===================
+* For plural, gender and grammar support, MediaWiki template-like syntax - {{...}} will be used.
+* There will be a default implementation for all these in $.i18n.language['default']
+* The plural, gender and grammar methods in ```$.i18n.language[ 'default' ]``` can be overridden or extended in ```$.i18n.language['languageCode']```.
+* Language-specific rules about Gender and Grammar can be written in languages/langXYZ.js files
+* Plural forms will be dynamically calculated using the CLDR plural parser.
+
+Extending the parser
+--------------------
+Following example illustrates extending the parser to support more magic words
+
+```javascript
+$.extend( $.i18n.parser.emitter, {
+       // Handle SITENAME keywords
+       sitename: function () {
+               return 'Wikipedia';
+       },
+       // Handle LINK keywords
+       link: function ( nodes ) {
+               return '<a href="' + nodes[1] + '">' + nodes[0] + '</a>';
+       }
+} );
+```
+
+This will parse the message
+```javascript
+$.i18n( '{{link:{{SITENAME}}|http://en.wikipedia.org}}' );
+```
+
+to
+
+```html
+<a href="http://en.wikipedia.org">Wikipedia</a>
+```
+
+Message documentation
+=====================
+
+The message keys and messages won't give a enough context about the message being translated to the translator. Whenever a developer adds a new message, it is a usual practice to document the message to a file named qqq.json
+with same message key.
+
+Example qqq.json:
+```json
+{
+       "@metadata": {
+               "authors": [
+                       "Developer Name"
+               ]
+       },
+       "appname-title": "Application name. Transliteration is recommended",
+       "appname-sub-title": "Brief explanation of the application",
+       "appname-header-introduction": "Text for the introduction header",
+       "appname-about": "About this application text",
+       "appname-footer": "Footer text"
+}
+
+```
+
+In MediaWiki and its hundreds of extensions, message documentation is a strictly followed practice. There is a grunt task to check whether all messages are documented or not. See https://www.npmjs.org/package/grunt-banana-checker
diff --git a/resources/lib/jquery.i18n/package.json b/resources/lib/jquery.i18n/package.json
new file mode 100644 (file)
index 0000000..0dded29
--- /dev/null
@@ -0,0 +1,47 @@
+{
+  "name": "jquery.i18n",
+  "version": "1.0.3",
+  "description": "jQuery based internationalization library",
+  "homepage": "https://github.com/wikimedia/jquery.i18n",
+  "keywords": [
+    "internationalization",
+    "localization",
+    "i18n",
+    "jquery",
+    "l10n"
+  ],
+  "author": {
+    "name": "Santhosh Thottingal",
+    "email": "santhosh.thottingal@gmail.com"
+  },
+  "contributors": [
+    "Amir Aharoni <amir.aharoni@mail.huji.ac.il>",
+    "Niklas Laxström <nlaxstrom@wikimedia.org>",
+    "Neil Kandalgaonkar <neilk@brevity.org>",
+    "David Chan <david@troi.org>"
+  ],
+  "devDependencies": {
+    "qunit": "0.7.6",
+    "grunt": "0.4.5",
+    "grunt-cli": "0.1.13",
+    "grunt-contrib-jshint": "0.11.2",
+    "grunt-contrib-connect": "0.10.1",
+    "grunt-contrib-qunit": "0.7.0",
+    "grunt-contrib-watch": "0.6.1",
+    "grunt-jscs": "1.8.0"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/wikimedia/jquery.i18n.git"
+  },
+  "bugs": {
+      "url" : "http://github.com/wikimedia/jquery.i18n/issues"
+  },
+  "engine": {
+    "node": ">=0.8.x"
+  },
+  "license": "(MIT OR GPL-2.0)",
+  "scripts": {
+    "test": "grunt test --verbose"
+  }
+}
diff --git a/resources/lib/jquery.i18n/src/jquery.i18n.emitter.bidi.js b/resources/lib/jquery.i18n/src/jquery.i18n.emitter.bidi.js
new file mode 100644 (file)
index 0000000..3a5b625
--- /dev/null
@@ -0,0 +1,88 @@
+/**
+ * BIDI embedding support for jQuery.i18n
+ *
+ * Copyright (C) 2015, David Chan
+ *
+ * This code is dual licensed GPLv2 or later and MIT. You don't have to do
+ * anything special to choose one license or the other and you don't have to
+ * notify anyone which license you are using. You are free to use this code
+ * in commercial projects as long as the copyright header is left intact.
+ * See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @licence GNU General Public Licence 2.0 or later
+ * @licence MIT License
+ */
+
+( function ( $ ) {
+       'use strict';
+       var strongDirRegExp;
+
+       /**
+        * Matches the first strong directionality codepoint:
+        * - in group 1 if it is LTR
+        * - in group 2 if it is RTL
+        * Does not match if there is no strong directionality codepoint.
+        *
+        * Generated by UnicodeJS (see tools/strongDir) from the UCD; see
+        * https://git.wikimedia.org/summary/unicodejs.git .
+        */
+       strongDirRegExp = new RegExp(
+               '(?:' +
+                       '(' +
+                               '[\u0041-\u005a\u0061-\u007a\u00aa\u00b5\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u02bb-\u02c1\u02d0\u02d1\u02e0-\u02e4\u02ee\u0370-\u0373\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0482\u048a-\u052f\u0531-\u0556\u0559-\u055f\u0561-\u0587\u0589\u0903-\u0939\u093b\u093d-\u0940\u0949-\u094c\u094e-\u0950\u0958-\u0961\u0964-\u0980\u0982\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd-\u09c0\u09c7\u09c8\u09cb\u09cc\u09ce\u09d7\u09dc\u09dd\u09df-\u09e1\u09e6-\u09f1\u09f4-\u09fa\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3e-\u0a40\u0a59-\u0a5c\u0a5e\u0a66-\u0a6f\u0a72-\u0a74\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd-\u0ac0\u0ac9\u0acb\u0acc\u0ad0\u0ae0\u0ae1\u0ae6-\u0af0\u0af9\u0b02\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b3e\u0b40\u0b47\u0b48\u0b4b\u0b4c\u0b57\u0b5c\u0b5d\u0b5f-\u0b61\u0b66-\u0b77\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe\u0bbf\u0bc1\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd0\u0bd7\u0be6-\u0bf2\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c41-\u0c44\u0c58-\u0c5a\u0c60\u0c61\u0c66-\u0c6f\u0c7f\u0c82\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd-\u0cc4\u0cc6-\u0cc8\u0cca\u0ccb\u0cd5\u0cd6\u0cde\u0ce0\u0ce1\u0ce6-\u0cef\u0cf1\u0cf2\u0d02\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d40\u0d46-\u0d48\u0d4a-\u0d4c\u0d4e\u0d57\u0d5f-\u0d61\u0d66-\u0d75\u0d79-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dcf-\u0dd1\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df4\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e4f-\u0e5b\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0ed0-\u0ed9\u0edc-\u0edf\u0f00-\u0f17\u0f1a-\u0f34\u0f36\u0f38\u0f3e-\u0f47\u0f49-\u0f6c\u0f7f\u0f85\u0f88-\u0f8c\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce-\u0fda\u1000-\u102c\u1031\u1038\u103b\u103c\u103f-\u1057\u105a-\u105d\u1061-\u1070\u1075-\u1081\u1083\u1084\u1087-\u108c\u108e-\u109c\u109e-\u10c5\u10c7\u10cd\u10d0-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1360-\u137c\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u167f\u1681-\u169a\u16a0-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1735\u1736\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17b6\u17be-\u17c5\u17c7\u17c8\u17d4-\u17da\u17dc\u17e0-\u17e9\u1810-\u1819\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1923-\u1926\u1929-\u192b\u1930\u1931\u1933-\u1938\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u1a00-\u1a16\u1a19\u1a1a\u1a1e-\u1a55\u1a57\u1a61\u1a63\u1a64\u1a6d-\u1a72\u1a80-\u1a89\u1a90-\u1a99\u1aa0-\u1aad\u1b04-\u1b33\u1b35\u1b3b\u1b3d-\u1b41\u1b43-\u1b4b\u1b50-\u1b6a\u1b74-\u1b7c\u1b82-\u1ba1\u1ba6\u1ba7\u1baa\u1bae-\u1be5\u1be7\u1bea-\u1bec\u1bee\u1bf2\u1bf3\u1bfc-\u1c2b\u1c34\u1c35\u1c3b-\u1c49\u1c4d-\u1c7f\u1cc0-\u1cc7\u1cd3\u1ce1\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u200e\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u214f\u2160-\u2188\u2336-\u237a\u2395\u249c-\u24e9\u26ac\u2800-\u28ff\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d70\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u302e\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u3190-\u31ba\u31f0-\u321c\u3220-\u324f\u3260-\u327b\u327f-\u32b0\u32c0-\u32cb\u32d0-\u32fe\u3300-\u3376\u337b-\u33dd\u33e0-\u33fe\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua60c\ua610-\ua62b\ua640-\ua66e\ua680-\ua69d\ua6a0-\ua6ef\ua6f2-\ua6f7\ua722-\ua787\ua789-\ua7ad\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua824\ua827\ua830-\ua837\ua840-\ua873\ua880-\ua8c3\ua8ce-\ua8d9\ua8f2-\ua8fd\ua900-\ua925\ua92e-\ua946\ua952\ua953\ua95f-\ua97c\ua983-\ua9b2\ua9b4\ua9b5\ua9ba\ua9bb\ua9bd-\ua9cd\ua9cf-\ua9d9\ua9de-\ua9e4\ua9e6-\ua9fe\uaa00-\uaa28\uaa2f\uaa30\uaa33\uaa34\uaa40-\uaa42\uaa44-\uaa4b\uaa4d\uaa50-\uaa59\uaa5c-\uaa7b\uaa7d-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaaeb\uaaee-\uaaf5\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab65\uab70-\uabe4\uabe6\uabe7\uabe9-\uabec\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\ue000-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]|\ud800[\udc00-\udc0b]|\ud800[\udc0d-\udc26]|\ud800[\udc28-\udc3a]|\ud800\udc3c|\ud800\udc3d|\ud800[\udc3f-\udc4d]|\ud800[\udc50-\udc5d]|\ud800[\udc80-\udcfa]|\ud800\udd00|\ud800\udd02|\ud800[\udd07-\udd33]|\ud800[\udd37-\udd3f]|\ud800[\uddd0-\uddfc]|\ud800[\ude80-\ude9c]|\ud800[\udea0-\uded0]|\ud800[\udf00-\udf23]|\ud800[\udf30-\udf4a]|\ud800[\udf50-\udf75]|\ud800[\udf80-\udf9d]|\ud800[\udf9f-\udfc3]|\ud800[\udfc8-\udfd5]|\ud801[\udc00-\udc9d]|\ud801[\udca0-\udca9]|\ud801[\udd00-\udd27]|\ud801[\udd30-\udd63]|\ud801\udd6f|\ud801[\ude00-\udf36]|\ud801[\udf40-\udf55]|\ud801[\udf60-\udf67]|\ud804\udc00|\ud804[\udc02-\udc37]|\ud804[\udc47-\udc4d]|\ud804[\udc66-\udc6f]|\ud804[\udc82-\udcb2]|\ud804\udcb7|\ud804\udcb8|\ud804[\udcbb-\udcc1]|\ud804[\udcd0-\udce8]|\ud804[\udcf0-\udcf9]|\ud804[\udd03-\udd26]|\ud804\udd2c|\ud804[\udd36-\udd43]|\ud804[\udd50-\udd72]|\ud804[\udd74-\udd76]|\ud804[\udd82-\uddb5]|\ud804[\uddbf-\uddc9]|\ud804\uddcd|\ud804[\uddd0-\udddf]|\ud804[\udde1-\uddf4]|\ud804[\ude00-\ude11]|\ud804[\ude13-\ude2e]|\ud804\ude32|\ud804\ude33|\ud804\ude35|\ud804[\ude38-\ude3d]|\ud804[\ude80-\ude86]|\ud804\ude88|\ud804[\ude8a-\ude8d]|\ud804[\ude8f-\ude9d]|\ud804[\ude9f-\udea9]|\ud804[\udeb0-\udede]|\ud804[\udee0-\udee2]|\ud804[\udef0-\udef9]|\ud804\udf02|\ud804\udf03|\ud804[\udf05-\udf0c]|\ud804\udf0f|\ud804\udf10|\ud804[\udf13-\udf28]|\ud804[\udf2a-\udf30]|\ud804\udf32|\ud804\udf33|\ud804[\udf35-\udf39]|\ud804[\udf3d-\udf3f]|\ud804[\udf41-\udf44]|\ud804\udf47|\ud804\udf48|\ud804[\udf4b-\udf4d]|\ud804\udf50|\ud804\udf57|\ud804[\udf5d-\udf63]|\ud805[\udc80-\udcb2]|\ud805\udcb9|\ud805[\udcbb-\udcbe]|\ud805\udcc1|\ud805[\udcc4-\udcc7]|\ud805[\udcd0-\udcd9]|\ud805[\udd80-\uddb1]|\ud805[\uddb8-\uddbb]|\ud805\uddbe|\ud805[\uddc1-\udddb]|\ud805[\ude00-\ude32]|\ud805\ude3b|\ud805\ude3c|\ud805\ude3e|\ud805[\ude41-\ude44]|\ud805[\ude50-\ude59]|\ud805[\ude80-\udeaa]|\ud805\udeac|\ud805\udeae|\ud805\udeaf|\ud805\udeb6|\ud805[\udec0-\udec9]|\ud805[\udf00-\udf19]|\ud805\udf20|\ud805\udf21|\ud805\udf26|\ud805[\udf30-\udf3f]|\ud806[\udca0-\udcf2]|\ud806\udcff|\ud806[\udec0-\udef8]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e]|\ud809[\udc70-\udc74]|\ud809[\udc80-\udd43]|\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38]|\ud81a[\ude40-\ude5e]|\ud81a[\ude60-\ude69]|\ud81a\ude6e|\ud81a\ude6f|\ud81a[\uded0-\udeed]|\ud81a\udef5|\ud81a[\udf00-\udf2f]|\ud81a[\udf37-\udf45]|\ud81a[\udf50-\udf59]|\ud81a[\udf5b-\udf61]|\ud81a[\udf63-\udf77]|\ud81a[\udf7d-\udf8f]|\ud81b[\udf00-\udf44]|\ud81b[\udf50-\udf7e]|\ud81b[\udf93-\udf9f]|\ud82c\udc00|\ud82c\udc01|\ud82f[\udc00-\udc6a]|\ud82f[\udc70-\udc7c]|\ud82f[\udc80-\udc88]|\ud82f[\udc90-\udc99]|\ud82f\udc9c|\ud82f\udc9f|\ud834[\udc00-\udcf5]|\ud834[\udd00-\udd26]|\ud834[\udd29-\udd66]|\ud834[\udd6a-\udd72]|\ud834\udd83|\ud834\udd84|\ud834[\udd8c-\udda9]|\ud834[\uddae-\udde8]|\ud834[\udf60-\udf71]|\ud835[\udc00-\udc54]|\ud835[\udc56-\udc9c]|\ud835\udc9e|\ud835\udc9f|\ud835\udca2|\ud835\udca5|\ud835\udca6|\ud835[\udca9-\udcac]|\ud835[\udcae-\udcb9]|\ud835\udcbb|\ud835[\udcbd-\udcc3]|\ud835[\udcc5-\udd05]|\ud835[\udd07-\udd0a]|\ud835[\udd0d-\udd14]|\ud835[\udd16-\udd1c]|\ud835[\udd1e-\udd39]|\ud835[\udd3b-\udd3e]|\ud835[\udd40-\udd44]|\ud835\udd46|\ud835[\udd4a-\udd50]|\ud835[\udd52-\udea5]|\ud835[\udea8-\udeda]|\ud835[\udedc-\udf14]|\ud835[\udf16-\udf4e]|\ud835[\udf50-\udf88]|\ud835[\udf8a-\udfc2]|\ud835[\udfc4-\udfcb]|\ud836[\udc00-\uddff]|\ud836[\ude37-\ude3a]|\ud836[\ude6d-\ude74]|\ud836[\ude76-\ude83]|\ud836[\ude85-\ude8b]|\ud83c[\udd10-\udd2e]|\ud83c[\udd30-\udd69]|\ud83c[\udd70-\udd9a]|\ud83c[\udde6-\ude02]|\ud83c[\ude10-\ude3a]|\ud83c[\ude40-\ude48]|\ud83c\ude50|\ud83c\ude51|[\ud840-\ud868][\udc00-\udfff]|\ud869[\udc00-\uded6]|\ud869[\udf00-\udfff]|[\ud86a-\ud86c][\udc00-\udfff]|\ud86d[\udc00-\udf34]|\ud86d[\udf40-\udfff]|\ud86e[\udc00-\udc1d]|\ud86e[\udc20-\udfff]|[\ud86f-\ud872][\udc00-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]|[\udb80-\udbbe][\udc00-\udfff]|\udbbf[\udc00-\udffd]|[\udbc0-\udbfe][\udc00-\udfff]|\udbff[\udc00-\udffd]' +
+                       ')|(' +
+                               '[\u0590\u05be\u05c0\u05c3\u05c6\u05c8-\u05ff\u07c0-\u07ea\u07f4\u07f5\u07fa-\u0815\u081a\u0824\u0828\u082e-\u0858\u085c-\u089f\u200f\ufb1d\ufb1f-\ufb28\ufb2a-\ufb4f\u0608\u060b\u060d\u061b-\u064a\u066d-\u066f\u0671-\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u0710\u0712-\u072f\u074b-\u07a5\u07b1-\u07bf\u08a0-\u08e2\ufb50-\ufd3d\ufd40-\ufdcf\ufdf0-\ufdfc\ufdfe\ufdff\ufe70-\ufefe]|\ud802[\udc00-\udd1e]|\ud802[\udd20-\ude00]|\ud802\ude04|\ud802[\ude07-\ude0b]|\ud802[\ude10-\ude37]|\ud802[\ude3b-\ude3e]|\ud802[\ude40-\udee4]|\ud802[\udee7-\udf38]|\ud802[\udf40-\udfff]|\ud803[\udc00-\ude5f]|\ud803[\ude7f-\udfff]|\ud83a[\udc00-\udccf]|\ud83a[\udcd7-\udfff]|\ud83b[\udc00-\uddff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\ude00-\udeef]|\ud83b[\udef2-\udeff]' +
+                       ')' +
+               ')'
+       );
+
+       /**
+        * Gets directionality of the first strongly directional codepoint
+        *
+        * This is the rule the BIDI algorithm uses to determine the directionality of
+        * paragraphs ( http://unicode.org/reports/tr9/#The_Paragraph_Level ) and
+        * FSI isolates ( http://unicode.org/reports/tr9/#Explicit_Directional_Isolates ).
+        *
+        * TODO: Does not handle BIDI control characters inside the text.
+        * TODO: Does not handle unallocated characters.
+        */
+       function strongDirFromContent( text ) {
+               var m = text.match( strongDirRegExp );
+               if ( !m ) {
+                       return null;
+               }
+               if ( m[2] === undefined ) {
+                       return 'ltr';
+               }
+               return 'rtl';
+       }
+
+       $.extend( $.i18n.parser.emitter, {
+               /**
+                * Wraps argument with unicode control characters for directionality safety
+                *
+                * This solves the problem where directionality-neutral characters at the edge of
+                * the argument string get interpreted with the wrong directionality from the
+                * enclosing context, giving renderings that look corrupted like "(Ben_(WMF".
+                *
+                * The wrapping is LRE...PDF or RLE...PDF, depending on the detected
+                * directionality of the argument string, using the BIDI algorithm's own "First
+                * strong directional codepoint" rule. Essentially, this works round the fact that
+                * there is no embedding equivalent of U+2068 FSI (isolation with heuristic
+                * direction inference). The latter is cleaner but still not widely supported.
+                */
+               bidi: function ( nodes ) {
+                       var dir = strongDirFromContent( nodes[0] );
+                       if ( dir === 'ltr' ) {
+                               // Wrap in LEFT-TO-RIGHT EMBEDDING ... POP DIRECTIONAL FORMATTING
+                               return '\u202A' + nodes[0] + '\u202C';
+                       }
+                       if ( dir === 'rtl' ) {
+                               // Wrap in RIGHT-TO-LEFT EMBEDDING ... POP DIRECTIONAL FORMATTING
+                               return '\u202B' + nodes[0] + '\u202C';
+                       }
+                       // No strong directionality: do not wrap
+                       return nodes[0];
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/jquery.i18n.emitter.js b/resources/lib/jquery.i18n/src/jquery.i18n.emitter.js
new file mode 100644 (file)
index 0000000..b26f147
--- /dev/null
@@ -0,0 +1,168 @@
+/**
+ * jQuery Internationalization library
+ *
+ * Copyright (C) 2011-2013 Santhosh Thottingal, Neil Kandalgaonkar
+ *
+ * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do
+ * anything special to choose one license or the other and you don't have to
+ * notify anyone which license you are using. You are free to use
+ * UniversalLanguageSelector in commercial projects as long as the copyright
+ * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @licence GNU General Public Licence 2.0 or later
+ * @licence MIT License
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       var MessageParserEmitter = function () {
+               this.language = $.i18n.languages[String.locale] || $.i18n.languages['default'];
+       };
+
+       MessageParserEmitter.prototype = {
+               constructor: MessageParserEmitter,
+
+               /**
+                * (We put this method definition here, and not in prototype, to make
+                * sure it's not overwritten by any magic.) Walk entire node structure,
+                * applying replacements and template functions when appropriate
+                *
+                * @param {Mixed} node abstract syntax tree (top node or subnode)
+                * @param {Array} replacements for $1, $2, ... $n
+                * @return {Mixed} single-string node or array of nodes suitable for
+                *  jQuery appending.
+                */
+               emit: function ( node, replacements ) {
+                       var ret, subnodes, operation,
+                               messageParserEmitter = this;
+
+                       switch ( typeof node ) {
+                       case 'string':
+                       case 'number':
+                               ret = node;
+                               break;
+                       case 'object':
+                               // node is an array of nodes
+                               subnodes = $.map( node.slice( 1 ), function ( n ) {
+                                       return messageParserEmitter.emit( n, replacements );
+                               } );
+
+                               operation = node[0].toLowerCase();
+
+                               if ( typeof messageParserEmitter[operation] === 'function' ) {
+                                       ret = messageParserEmitter[operation]( subnodes, replacements );
+                               } else {
+                                       throw new Error( 'unknown operation "' + operation + '"' );
+                               }
+
+                               break;
+                       case 'undefined':
+                               // Parsing the empty string (as an entire expression, or as a
+                               // paramExpression in a template) results in undefined
+                               // Perhaps a more clever parser can detect this, and return the
+                               // empty string? Or is that useful information?
+                               // The logical thing is probably to return the empty string here
+                               // when we encounter undefined.
+                               ret = '';
+                               break;
+                       default:
+                               throw new Error( 'unexpected type in AST: ' + typeof node );
+                       }
+
+                       return ret;
+               },
+
+               /**
+                * Parsing has been applied depth-first we can assume that all nodes
+                * here are single nodes Must return a single node to parents -- a
+                * jQuery with synthetic span However, unwrap any other synthetic spans
+                * in our children and pass them upwards
+                *
+                * @param {Array} nodes Mixed, some single nodes, some arrays of nodes.
+                * @return String
+                */
+               concat: function ( nodes ) {
+                       var result = '';
+
+                       $.each( nodes, function ( i, node ) {
+                               // strings, integers, anything else
+                               result += node;
+                       } );
+
+                       return result;
+               },
+
+               /**
+                * Return escaped replacement of correct index, or string if
+                * unavailable. Note that we expect the parsed parameter to be
+                * zero-based. i.e. $1 should have become [ 0 ]. if the specified
+                * parameter is not found return the same string (e.g. "$99" ->
+                * parameter 98 -> not found -> return "$99" ) TODO throw error if
+                * nodes.length > 1 ?
+                *
+                * @param {Array} nodes One element, integer, n >= 0
+                * @param {Array} replacements for $1, $2, ... $n
+                * @return {string} replacement
+                */
+               replace: function ( nodes, replacements ) {
+                       var index = parseInt( nodes[0], 10 );
+
+                       if ( index < replacements.length ) {
+                               // replacement is not a string, don't touch!
+                               return replacements[index];
+                       } else {
+                               // index not found, fallback to displaying variable
+                               return '$' + ( index + 1 );
+                       }
+               },
+
+               /**
+                * Transform parsed structure into pluralization n.b. The first node may
+                * be a non-integer (for instance, a string representing an Arabic
+                * number). So convert it back with the current language's
+                * convertNumber.
+                *
+                * @param {Array} nodes List [ {String|Number}, {String}, {String} ... ]
+                * @return {String} selected pluralized form according to current
+                *  language.
+                */
+               plural: function ( nodes ) {
+                       var count = parseFloat( this.language.convertNumber( nodes[0], 10 ) ),
+                               forms = nodes.slice( 1 );
+
+                       return forms.length ? this.language.convertPlural( count, forms ) : '';
+               },
+
+               /**
+                * Transform parsed structure into gender Usage
+                * {{gender:gender|masculine|feminine|neutral}}.
+                *
+                * @param {Array} nodes List [ {String}, {String}, {String} , {String} ]
+                * @return {String} selected gender form according to current language
+                */
+               gender: function ( nodes ) {
+                       var gender = nodes[0],
+                               forms = nodes.slice( 1 );
+
+                       return this.language.gender( gender, forms );
+               },
+
+               /**
+                * Transform parsed structure into grammar conversion. Invoked by
+                * putting {{grammar:form|word}} in a message
+                *
+                * @param {Array} nodes List [{Grammar case eg: genitive}, {String word}]
+                * @return {String} selected grammatical form according to current
+                *  language.
+                */
+               grammar: function ( nodes ) {
+                       var form = nodes[0],
+                               word = nodes[1];
+
+                       return word && form && this.language.convertGrammar( word, form );
+               }
+       };
+
+       $.extend( $.i18n.parser.emitter, new MessageParserEmitter() );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/jquery.i18n.fallbacks.js b/resources/lib/jquery.i18n/src/jquery.i18n.fallbacks.js
new file mode 100644 (file)
index 0000000..4584c5f
--- /dev/null
@@ -0,0 +1,186 @@
+/**
+ * jQuery Internationalization library
+ *
+ * Copyright (C) 2012 Santhosh Thottingal
+ *
+ * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do anything special to
+ * choose one license or the other and you don't have to notify anyone which license you are using.
+ * You are free to use UniversalLanguageSelector in commercial projects as long as the copyright
+ * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @licence GNU General Public Licence 2.0 or later
+ * @licence MIT License
+ */
+( function ( $, undefined ) {
+       'use strict';
+
+       $.i18n = $.i18n || {};
+       $.extend( $.i18n.fallbacks, {
+               ab: [ 'ru' ],
+               ace: [ 'id' ],
+               aln: [ 'sq' ],
+               // Not so standard - als is supposed to be Tosk Albanian,
+               // but in Wikipedia it's used for a Germanic language.
+               als: [ 'gsw', 'de' ],
+               an: [ 'es' ],
+               anp: [ 'hi' ],
+               arn: [ 'es' ],
+               arz: [ 'ar' ],
+               av: [ 'ru' ],
+               ay: [ 'es' ],
+               ba: [ 'ru' ],
+               bar: [ 'de' ],
+               'bat-smg': [ 'sgs', 'lt' ],
+               bcc: [ 'fa' ],
+               'be-x-old': [ 'be-tarask' ],
+               bh: [ 'bho' ],
+               bjn: [ 'id' ],
+               bm: [ 'fr' ],
+               bpy: [ 'bn' ],
+               bqi: [ 'fa' ],
+               bug: [ 'id' ],
+               'cbk-zam': [ 'es' ],
+               ce: [ 'ru' ],
+               crh: [ 'crh-latn' ],
+               'crh-cyrl': [ 'ru' ],
+               csb: [ 'pl' ],
+               cv: [ 'ru' ],
+               'de-at': [ 'de' ],
+               'de-ch': [ 'de' ],
+               'de-formal': [ 'de' ],
+               dsb: [ 'de' ],
+               dtp: [ 'ms' ],
+               egl: [ 'it' ],
+               eml: [ 'it' ],
+               ff: [ 'fr' ],
+               fit: [ 'fi' ],
+               'fiu-vro': [ 'vro', 'et' ],
+               frc: [ 'fr' ],
+               frp: [ 'fr' ],
+               frr: [ 'de' ],
+               fur: [ 'it' ],
+               gag: [ 'tr' ],
+               gan: [ 'gan-hant', 'zh-hant', 'zh-hans' ],
+               'gan-hans': [ 'zh-hans' ],
+               'gan-hant': [ 'zh-hant', 'zh-hans' ],
+               gl: [ 'pt' ],
+               glk: [ 'fa' ],
+               gn: [ 'es' ],
+               gsw: [ 'de' ],
+               hif: [ 'hif-latn' ],
+               hsb: [ 'de' ],
+               ht: [ 'fr' ],
+               ii: [ 'zh-cn', 'zh-hans' ],
+               inh: [ 'ru' ],
+               iu: [ 'ike-cans' ],
+               jut: [ 'da' ],
+               jv: [ 'id' ],
+               kaa: [ 'kk-latn', 'kk-cyrl' ],
+               kbd: [ 'kbd-cyrl' ],
+               khw: [ 'ur' ],
+               kiu: [ 'tr' ],
+               kk: [ 'kk-cyrl' ],
+               'kk-arab': [ 'kk-cyrl' ],
+               'kk-latn': [ 'kk-cyrl' ],
+               'kk-cn': [ 'kk-arab', 'kk-cyrl' ],
+               'kk-kz': [ 'kk-cyrl' ],
+               'kk-tr': [ 'kk-latn', 'kk-cyrl' ],
+               kl: [ 'da' ],
+               'ko-kp': [ 'ko' ],
+               koi: [ 'ru' ],
+               krc: [ 'ru' ],
+               ks: [ 'ks-arab' ],
+               ksh: [ 'de' ],
+               ku: [ 'ku-latn' ],
+               'ku-arab': [ 'ckb' ],
+               kv: [ 'ru' ],
+               lad: [ 'es' ],
+               lb: [ 'de' ],
+               lbe: [ 'ru' ],
+               lez: [ 'ru' ],
+               li: [ 'nl' ],
+               lij: [ 'it' ],
+               liv: [ 'et' ],
+               lmo: [ 'it' ],
+               ln: [ 'fr' ],
+               ltg: [ 'lv' ],
+               lzz: [ 'tr' ],
+               mai: [ 'hi' ],
+               'map-bms': [ 'jv', 'id' ],
+               mg: [ 'fr' ],
+               mhr: [ 'ru' ],
+               min: [ 'id' ],
+               mo: [ 'ro' ],
+               mrj: [ 'ru' ],
+               mwl: [ 'pt' ],
+               myv: [ 'ru' ],
+               mzn: [ 'fa' ],
+               nah: [ 'es' ],
+               nap: [ 'it' ],
+               nds: [ 'de' ],
+               'nds-nl': [ 'nl' ],
+               'nl-informal': [ 'nl' ],
+               no: [ 'nb' ],
+               os: [ 'ru' ],
+               pcd: [ 'fr' ],
+               pdc: [ 'de' ],
+               pdt: [ 'de' ],
+               pfl: [ 'de' ],
+               pms: [ 'it' ],
+               pt: [ 'pt-br' ],
+               'pt-br': [ 'pt' ],
+               qu: [ 'es' ],
+               qug: [ 'qu', 'es' ],
+               rgn: [ 'it' ],
+               rmy: [ 'ro' ],
+               'roa-rup': [ 'rup' ],
+               rue: [ 'uk', 'ru' ],
+               ruq: [ 'ruq-latn', 'ro' ],
+               'ruq-cyrl': [ 'mk' ],
+               'ruq-latn': [ 'ro' ],
+               sa: [ 'hi' ],
+               sah: [ 'ru' ],
+               scn: [ 'it' ],
+               sg: [ 'fr' ],
+               sgs: [ 'lt' ],
+               sli: [ 'de' ],
+               sr: [ 'sr-ec' ],
+               srn: [ 'nl' ],
+               stq: [ 'de' ],
+               su: [ 'id' ],
+               szl: [ 'pl' ],
+               tcy: [ 'kn' ],
+               tg: [ 'tg-cyrl' ],
+               tt: [ 'tt-cyrl', 'ru' ],
+               'tt-cyrl': [ 'ru' ],
+               ty: [ 'fr' ],
+               udm: [ 'ru' ],
+               ug: [ 'ug-arab' ],
+               uk: [ 'ru' ],
+               vec: [ 'it' ],
+               vep: [ 'et' ],
+               vls: [ 'nl' ],
+               vmf: [ 'de' ],
+               vot: [ 'fi' ],
+               vro: [ 'et' ],
+               wa: [ 'fr' ],
+               wo: [ 'fr' ],
+               wuu: [ 'zh-hans' ],
+               xal: [ 'ru' ],
+               xmf: [ 'ka' ],
+               yi: [ 'he' ],
+               za: [ 'zh-hans' ],
+               zea: [ 'nl' ],
+               zh: [ 'zh-hans' ],
+               'zh-classical': [ 'lzh' ],
+               'zh-cn': [ 'zh-hans' ],
+               'zh-hant': [ 'zh-hans' ],
+               'zh-hk': [ 'zh-hant', 'zh-hans' ],
+               'zh-min-nan': [ 'nan' ],
+               'zh-mo': [ 'zh-hk', 'zh-hant', 'zh-hans' ],
+               'zh-my': [ 'zh-sg', 'zh-hans' ],
+               'zh-sg': [ 'zh-hans' ],
+               'zh-tw': [ 'zh-hant', 'zh-hans' ],
+               'zh-yue': [ 'yue' ]
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/jquery.i18n.js b/resources/lib/jquery.i18n/src/jquery.i18n.js
new file mode 100644 (file)
index 0000000..9236e4e
--- /dev/null
@@ -0,0 +1,287 @@
+/**
+ * jQuery Internationalization library
+ *
+ * Copyright (C) 2012 Santhosh Thottingal
+ *
+ * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do
+ * anything special to choose one license or the other and you don't have to
+ * notify anyone which license you are using. You are free to use
+ * UniversalLanguageSelector in commercial projects as long as the copyright
+ * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @licence GNU General Public Licence 2.0 or later
+ * @licence MIT License
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       var nav, I18N,
+               slice = Array.prototype.slice;
+       /**
+        * @constructor
+        * @param {Object} options
+        */
+       I18N = function ( options ) {
+               // Load defaults
+               this.options = $.extend( {}, I18N.defaults, options );
+
+               this.parser = this.options.parser;
+               this.locale = this.options.locale;
+               this.messageStore = this.options.messageStore;
+               this.languages = {};
+
+               this.init();
+       };
+
+       I18N.prototype = {
+               /**
+                * Initialize by loading locales and setting up
+                * String.prototype.toLocaleString and String.locale.
+                */
+               init: function () {
+                       var i18n = this;
+
+                       // Set locale of String environment
+                       String.locale = i18n.locale;
+
+                       // Override String.localeString method
+                       String.prototype.toLocaleString = function () {
+                               var localeParts, localePartIndex, value, locale, fallbackIndex,
+                                       tryingLocale, message;
+
+                               value = this.valueOf();
+                               locale = i18n.locale;
+                               fallbackIndex = 0;
+
+                               while ( locale ) {
+                                       // Iterate through locales starting at most-specific until
+                                       // localization is found. As in fi-Latn-FI, fi-Latn and fi.
+                                       localeParts = locale.split( '-' );
+                                       localePartIndex = localeParts.length;
+
+                                       do {
+                                               tryingLocale = localeParts.slice( 0, localePartIndex ).join( '-' );
+                                               message = i18n.messageStore.get( tryingLocale, value );
+
+                                               if ( message ) {
+                                                       return message;
+                                               }
+
+                                               localePartIndex--;
+                                       } while ( localePartIndex );
+
+                                       if ( locale === 'en' ) {
+                                               break;
+                                       }
+
+                                       locale = ( $.i18n.fallbacks[i18n.locale] && $.i18n.fallbacks[i18n.locale][fallbackIndex] ) ||
+                                               i18n.options.fallbackLocale;
+                                       $.i18n.log( 'Trying fallback locale for ' + i18n.locale + ': ' + locale );
+
+                                       fallbackIndex++;
+                               }
+
+                               // key not found
+                               return '';
+                       };
+               },
+
+               /*
+                * Destroy the i18n instance.
+                */
+               destroy: function () {
+                       $.removeData( document, 'i18n' );
+               },
+
+               /**
+                * General message loading API This can take a URL string for
+                * the json formatted messages. Example:
+                * <code>load('path/to/all_localizations.json');</code>
+                *
+                * To load a localization file for a locale:
+                * <code>
+                * load('path/to/de-messages.json', 'de' );
+                * </code>
+                *
+                * To load a localization file from a directory:
+                * <code>
+                * load('path/to/i18n/directory', 'de' );
+                * </code>
+                * The above method has the advantage of fallback resolution.
+                * ie, it will automatically load the fallback locales for de.
+                * For most usecases, this is the recommended method.
+                * It is optional to have trailing slash at end.
+                *
+                * A data object containing message key- message translation mappings
+                * can also be passed. Example:
+                * <code>
+                * load( { 'hello' : 'Hello' }, optionalLocale );
+                * </code>
+                *
+                * A source map containing key-value pair of languagename and locations
+                * can also be passed. Example:
+                * <code>
+                * load( {
+                * bn: 'i18n/bn.json',
+                * he: 'i18n/he.json',
+                * en: 'i18n/en.json'
+                * } )
+                * </code>
+                *
+                * If the data argument is null/undefined/false,
+                * all cached messages for the i18n instance will get reset.
+                *
+                * @param {String|Object} source
+                * @param {String} locale Language tag
+                * @returns {jQuery.Promise}
+                */
+               load: function ( source, locale ) {
+                       var fallbackLocales, locIndex, fallbackLocale, sourceMap = {};
+                       if ( !source && !locale ) {
+                               source = 'i18n/' + $.i18n().locale + '.json';
+                               locale = $.i18n().locale;
+                       }
+                       if ( typeof source === 'string' &&
+                               source.split( '.' ).pop() !== 'json'
+                       ) {
+                               // Load specified locale then check for fallbacks when directory is specified in load()
+                               sourceMap[locale] = source + '/' + locale + '.json';
+                               fallbackLocales = ( $.i18n.fallbacks[locale] || [] )
+                                       .concat( this.options.fallbackLocale );
+                               for ( locIndex in fallbackLocales ) {
+                                       fallbackLocale = fallbackLocales[locIndex];
+                                       sourceMap[fallbackLocale] = source + '/' + fallbackLocale + '.json';
+                               }
+                               return this.load( sourceMap );
+                       } else {
+                               return this.messageStore.load( source, locale );
+                       }
+
+               },
+
+               /**
+                * Does parameter and magic word substitution.
+                *
+                * @param {string} key Message key
+                * @param {Array} parameters Message parameters
+                * @return {string}
+                */
+               parse: function ( key, parameters ) {
+                       var message = key.toLocaleString();
+                       // FIXME: This changes the state of the I18N object,
+                       // should probably not change the 'this.parser' but just
+                       // pass it to the parser.
+                       this.parser.language = $.i18n.languages[$.i18n().locale] || $.i18n.languages['default'];
+                       if ( message === '' ) {
+                               message = key;
+                       }
+                       return this.parser.parse( message, parameters );
+               }
+       };
+
+       /**
+        * Process a message from the $.I18N instance
+        * for the current document, stored in jQuery.data(document).
+        *
+        * @param {string} key Key of the message.
+        * @param {string} param1 [param...] Variadic list of parameters for {key}.
+        * @return {string|$.I18N} Parsed message, or if no key was given
+        * the instance of $.I18N is returned.
+        */
+       $.i18n = function ( key, param1 ) {
+               var parameters,
+                       i18n = $.data( document, 'i18n' ),
+                       options = typeof key === 'object' && key;
+
+               // If the locale option for this call is different then the setup so far,
+               // update it automatically. This doesn't just change the context for this
+               // call but for all future call as well.
+               // If there is no i18n setup yet, don't do this. It will be taken care of
+               // by the `new I18N` construction below.
+               // NOTE: It should only change language for this one call.
+               // Then cache instances of I18N somewhere.
+               if ( options && options.locale && i18n && i18n.locale !== options.locale ) {
+                       String.locale = i18n.locale = options.locale;
+               }
+
+               if ( !i18n ) {
+                       i18n = new I18N( options );
+                       $.data( document, 'i18n', i18n );
+               }
+
+               if ( typeof key === 'string' ) {
+                       if ( param1 !== undefined ) {
+                               parameters = slice.call( arguments, 1 );
+                       } else {
+                               parameters = [];
+                       }
+
+                       return i18n.parse( key, parameters );
+               } else {
+                       // FIXME: remove this feature/bug.
+                       return i18n;
+               }
+       };
+
+       $.fn.i18n = function () {
+               var i18n = $.data( document, 'i18n' );
+
+               if ( !i18n ) {
+                       i18n = new I18N();
+                       $.data( document, 'i18n', i18n );
+               }
+               String.locale = i18n.locale;
+               return this.each( function () {
+                       var $this = $( this ),
+                               messageKey = $this.data( 'i18n' );
+
+                       if ( messageKey ) {
+                               $this.text( i18n.parse( messageKey ) );
+                       } else {
+                               $this.find( '[data-i18n]' ).i18n();
+                       }
+               } );
+       };
+
+       String.locale = String.locale || $( 'html' ).attr( 'lang' );
+
+       if ( !String.locale ) {
+               if ( typeof window.navigator !== undefined ) {
+                       nav = window.navigator;
+                       String.locale = nav.language || nav.userLanguage || '';
+               } else {
+                       String.locale = '';
+               }
+       }
+
+       $.i18n.languages = {};
+       $.i18n.messageStore = $.i18n.messageStore || {};
+       $.i18n.parser = {
+               // The default parser only handles variable substitution
+               parse: function ( message, parameters ) {
+                       return message.replace( /\$(\d+)/g, function ( str, match ) {
+                               var index = parseInt( match, 10 ) - 1;
+                               return parameters[index] !== undefined ? parameters[index] : '$' + match;
+                       } );
+               },
+               emitter: {}
+       };
+       $.i18n.fallbacks = {};
+       $.i18n.debug = false;
+       $.i18n.log = function ( /* arguments */ ) {
+               if ( window.console && $.i18n.debug ) {
+                       window.console.log.apply( window.console, arguments );
+               }
+       };
+       /* Static members */
+       I18N.defaults = {
+               locale: String.locale,
+               fallbackLocale: 'en',
+               parser: $.i18n.parser,
+               messageStore: $.i18n.messageStore
+       };
+
+       // Expose constructor
+       $.i18n.constructor = I18N;
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/jquery.i18n.language.js b/resources/lib/jquery.i18n/src/jquery.i18n.language.js
new file mode 100644 (file)
index 0000000..3ce0a99
--- /dev/null
@@ -0,0 +1,472 @@
+/*global pluralRuleParser */
+( function ( $ ) {
+       'use strict';
+
+       var language = {
+               // CLDR plural rules generated using
+               // libs/CLDRPluralRuleParser/tools/PluralXML2JSON.html
+               pluralRules: {
+                       ak: {
+                               one: 'n = 0..1'
+                       },
+                       am: {
+                               one: 'i = 0 or n = 1'
+                       },
+                       ar: {
+                               zero: 'n = 0',
+                               one: 'n = 1',
+                               two: 'n = 2',
+                               few: 'n % 100 = 3..10',
+                               many: 'n % 100 = 11..99'
+                       },
+                       be: {
+                               one: 'n % 10 = 1 and n % 100 != 11',
+                               few: 'n % 10 = 2..4 and n % 100 != 12..14',
+                               many: 'n % 10 = 0 or n % 10 = 5..9 or n % 100 = 11..14'
+                       },
+                       bh: {
+                               one: 'n = 0..1'
+                       },
+                       bn: {
+                               one: 'i = 0 or n = 1'
+                       },
+                       br: {
+                               one: 'n % 10 = 1 and n % 100 != 11,71,91',
+                               two: 'n % 10 = 2 and n % 100 != 12,72,92',
+                               few: 'n % 10 = 3..4,9 and n % 100 != 10..19,70..79,90..99',
+                               many: 'n != 0 and n % 1000000 = 0'
+                       },
+                       bs: {
+                               one: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',
+                               few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'
+                       },
+                       cs: {
+                               one: 'i = 1 and v = 0',
+                               few: 'i = 2..4 and v = 0',
+                               many: 'v != 0'
+                       },
+                       cy: {
+                               zero: 'n = 0',
+                               one: 'n = 1',
+                               two: 'n = 2',
+                               few: 'n = 3',
+                               many: 'n = 6'
+                       },
+                       da: {
+                               one: 'n = 1 or t != 0 and i = 0,1'
+                       },
+                       fa: {
+                               one: 'i = 0 or n = 1'
+                       },
+                       ff: {
+                               one: 'i = 0,1'
+                       },
+                       fil: {
+                               one: 'i = 0..1 and v = 0'
+                       },
+                       fr: {
+                               one: 'i = 0,1'
+                       },
+                       ga: {
+                               one: 'n = 1',
+                               two: 'n = 2',
+                               few: 'n = 3..6',
+                               many: 'n = 7..10'
+                       },
+                       gd: {
+                               one: 'n = 1,11',
+                               two: 'n = 2,12',
+                               few: 'n = 3..10,13..19'
+                       },
+                       gu: {
+                               one: 'i = 0 or n = 1'
+                       },
+                       guw: {
+                               one: 'n = 0..1'
+                       },
+                       gv: {
+                               one: 'n % 10 = 1',
+                               two: 'n % 10 = 2',
+                               few: 'n % 100 = 0,20,40,60'
+                       },
+                       he: {
+                               one: 'i = 1 and v = 0',
+                               two: 'i = 2 and v = 0',
+                               many: 'v = 0 and n != 0..10 and n % 10 = 0'
+                       },
+                       hi: {
+                               one: 'i = 0 or n = 1'
+                       },
+                       hr: {
+                               one: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',
+                               few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'
+                       },
+                       hy: {
+                               one: 'i = 0,1'
+                       },
+                       is: {
+                               one: 't = 0 and i % 10 = 1 and i % 100 != 11 or t != 0'
+                       },
+                       iu: {
+                               one: 'n = 1',
+                               two: 'n = 2'
+                       },
+                       iw: {
+                               one: 'i = 1 and v = 0',
+                               two: 'i = 2 and v = 0',
+                               many: 'v = 0 and n != 0..10 and n % 10 = 0'
+                       },
+                       kab: {
+                               one: 'i = 0,1'
+                       },
+                       kn: {
+                               one: 'i = 0 or n = 1'
+                       },
+                       kw: {
+                               one: 'n = 1',
+                               two: 'n = 2'
+                       },
+                       lag: {
+                               zero: 'n = 0',
+                               one: 'i = 0,1 and n != 0'
+                       },
+                       ln: {
+                               one: 'n = 0..1'
+                       },
+                       lt: {
+                               one: 'n % 10 = 1 and n % 100 != 11..19',
+                               few: 'n % 10 = 2..9 and n % 100 != 11..19',
+                               many: 'f != 0'
+                       },
+                       lv: {
+                               zero: 'n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19',
+                               one: 'n % 10 = 1 and n % 100 != 11 or v = 2 and f % 10 = 1 and f % 100 != 11 or v != 2 and f % 10 = 1'
+                       },
+                       mg: {
+                               one: 'n = 0..1'
+                       },
+                       mk: {
+                               one: 'v = 0 and i % 10 = 1 or f % 10 = 1'
+                       },
+                       mo: {
+                               one: 'i = 1 and v = 0',
+                               few: 'v != 0 or n = 0 or n != 1 and n % 100 = 1..19'
+                       },
+                       mr: {
+                               one: 'i = 0 or n = 1'
+                       },
+                       mt: {
+                               one: 'n = 1',
+                               few: 'n = 0 or n % 100 = 2..10',
+                               many: 'n % 100 = 11..19'
+                       },
+                       naq: {
+                               one: 'n = 1',
+                               two: 'n = 2'
+                       },
+                       nso: {
+                               one: 'n = 0..1'
+                       },
+                       pa: {
+                               one: 'n = 0..1'
+                       },
+                       pl: {
+                               one: 'i = 1 and v = 0',
+                               few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14',
+                               many: 'v = 0 and i != 1 and i % 10 = 0..1 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 12..14'
+                       },
+                       pt: {
+                               one: 'i = 1 and v = 0 or i = 0 and t = 1'
+                       },
+                       // jscs:disable requireCamelCaseOrUpperCaseIdentifiers
+                       pt_PT: {
+                               one: 'n = 1 and v = 0'
+                       },
+                       // jscs:enable requireCamelCaseOrUpperCaseIdentifiers
+                       ro: {
+                               one: 'i = 1 and v = 0',
+                               few: 'v != 0 or n = 0 or n != 1 and n % 100 = 1..19'
+                       },
+                       ru: {
+                               one: 'v = 0 and i % 10 = 1 and i % 100 != 11',
+                               many: 'v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14'
+                       },
+                       se: {
+                               one: 'n = 1',
+                               two: 'n = 2'
+                       },
+                       sh: {
+                               one: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',
+                               few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'
+                       },
+                       shi: {
+                               one: 'i = 0 or n = 1',
+                               few: 'n = 2..10'
+                       },
+                       si: {
+                               one: 'n = 0,1 or i = 0 and f = 1'
+                       },
+                       sk: {
+                               one: 'i = 1 and v = 0',
+                               few: 'i = 2..4 and v = 0',
+                               many: 'v != 0'
+                       },
+                       sl: {
+                               one: 'v = 0 and i % 100 = 1',
+                               two: 'v = 0 and i % 100 = 2',
+                               few: 'v = 0 and i % 100 = 3..4 or v != 0'
+                       },
+                       sma: {
+                               one: 'n = 1',
+                               two: 'n = 2'
+                       },
+                       smi: {
+                               one: 'n = 1',
+                               two: 'n = 2'
+                       },
+                       smj: {
+                               one: 'n = 1',
+                               two: 'n = 2'
+                       },
+                       smn: {
+                               one: 'n = 1',
+                               two: 'n = 2'
+                       },
+                       sms: {
+                               one: 'n = 1',
+                               two: 'n = 2'
+                       },
+                       sr: {
+                               one: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',
+                               few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'
+                       },
+                       ti: {
+                               one: 'n = 0..1'
+                       },
+                       tl: {
+                               one: 'i = 0..1 and v = 0'
+                       },
+                       tzm: {
+                               one: 'n = 0..1 or n = 11..99'
+                       },
+                       uk: {
+                               one: 'v = 0 and i % 10 = 1 and i % 100 != 11',
+                               few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14',
+                               many: 'v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14'
+                       },
+                       wa: {
+                               one: 'n = 0..1'
+                       },
+                       zu: {
+                               one: 'i = 0 or n = 1'
+                       }
+               },
+
+               /**
+                * Plural form transformations, needed for some languages.
+                *
+                * @param count
+                *            integer Non-localized quantifier
+                * @param forms
+                *            array List of plural forms
+                * @return string Correct form for quantifier in this language
+                */
+               convertPlural: function ( count, forms ) {
+                       var pluralRules,
+                               pluralFormIndex,
+                               index,
+                               explicitPluralPattern = new RegExp( '\\d+=', 'i' ),
+                               formCount,
+                               form;
+
+                       if ( !forms || forms.length === 0 ) {
+                               return '';
+                       }
+
+                       // Handle for Explicit 0= & 1= values
+                       for ( index = 0; index < forms.length; index++ ) {
+                               form = forms[index];
+                               if ( explicitPluralPattern.test( form ) ) {
+                                       formCount = parseInt( form.substring( 0, form.indexOf( '=' ) ), 10 );
+                                       if ( formCount === count ) {
+                                               return ( form.substr( form.indexOf( '=' ) + 1 ) );
+                                       }
+                                       forms[index] = undefined;
+                               }
+                       }
+
+                       forms = $.map( forms, function ( form ) {
+                               if ( form !== undefined ) {
+                                       return form;
+                               }
+                       } );
+
+                       pluralRules = this.pluralRules[$.i18n().locale];
+
+                       if ( !pluralRules ) {
+                               // default fallback.
+                               return ( count === 1 ) ? forms[0] : forms[1];
+                       }
+
+                       pluralFormIndex = this.getPluralForm( count, pluralRules );
+                       pluralFormIndex = Math.min( pluralFormIndex, forms.length - 1 );
+
+                       return forms[pluralFormIndex];
+               },
+
+               /**
+                * For the number, get the plural for index
+                *
+                * @param number
+                * @param pluralRules
+                * @return plural form index
+                */
+               getPluralForm: function ( number, pluralRules ) {
+                       var i,
+                               pluralForms = [ 'zero', 'one', 'two', 'few', 'many', 'other' ],
+                               pluralFormIndex = 0;
+
+                       for ( i = 0; i < pluralForms.length; i++ ) {
+                               if ( pluralRules[pluralForms[i]] ) {
+                                       if ( pluralRuleParser( pluralRules[pluralForms[i]], number ) ) {
+                                               return pluralFormIndex;
+                                       }
+
+                                       pluralFormIndex++;
+                               }
+                       }
+
+                       return pluralFormIndex;
+               },
+
+               /**
+                * Converts a number using digitTransformTable.
+                *
+                * @param {number} num Value to be converted
+                * @param {boolean} integer Convert the return value to an integer
+                */
+               convertNumber: function ( num, integer ) {
+                       var tmp, item, i,
+                               transformTable, numberString, convertedNumber;
+
+                       // Set the target Transform table:
+                       transformTable = this.digitTransformTable( $.i18n().locale );
+                       numberString = String( num );
+                       convertedNumber = '';
+
+                       if ( !transformTable ) {
+                               return num;
+                       }
+
+                       // Check if the restore to Latin number flag is set:
+                       if ( integer ) {
+                               if ( parseFloat( num, 10 ) === num ) {
+                                       return num;
+                               }
+
+                               tmp = [];
+
+                               for ( item in transformTable ) {
+                                       tmp[transformTable[item]] = item;
+                               }
+
+                               transformTable = tmp;
+                       }
+
+                       for ( i = 0; i < numberString.length; i++ ) {
+                               if ( transformTable[numberString[i]] ) {
+                                       convertedNumber += transformTable[numberString[i]];
+                               } else {
+                                       convertedNumber += numberString[i];
+                               }
+                       }
+
+                       return integer ? parseFloat( convertedNumber, 10 ) : convertedNumber;
+               },
+
+               /**
+                * Grammatical transformations, needed for inflected languages.
+                * Invoked by putting {{grammar:form|word}} in a message.
+                * Override this method for languages that need special grammar rules
+                * applied dynamically.
+                *
+                * @param word {String}
+                * @param form {String}
+                * @return {String}
+                */
+               convertGrammar: function ( word, form ) { /*jshint unused: false */
+                       return word;
+               },
+
+               /**
+                * Provides an alternative text depending on specified gender. Usage
+                * {{gender:[gender|user object]|masculine|feminine|neutral}}. If second
+                * or third parameter are not specified, masculine is used.
+                *
+                * These details may be overriden per language.
+                *
+                * @param gender
+                *      string male, female, or anything else for neutral.
+                * @param forms
+                *      array List of gender forms
+                *
+                * @return string
+                */
+               gender: function ( gender, forms ) {
+                       if ( !forms || forms.length === 0 ) {
+                               return '';
+                       }
+
+                       while ( forms.length < 2 ) {
+                               forms.push( forms[forms.length - 1] );
+                       }
+
+                       if ( gender === 'male' ) {
+                               return forms[0];
+                       }
+
+                       if ( gender === 'female' ) {
+                               return forms[1];
+                       }
+
+                       return ( forms.length === 3 ) ? forms[2] : forms[0];
+               },
+
+               /**
+                * Get the digit transform table for the given language
+                * See http://cldr.unicode.org/translation/numbering-systems
+                * @param language
+                * @returns {Array|boolean} List of digits in the passed language or false
+                * representation, or boolean false if there is no information.
+                */
+               digitTransformTable: function ( language ) {
+                       var tables = {
+                               ar: '٠١٢٣٤٥٦٧٨٩',
+                               fa: '۰۱۲۳۴۵۶۷۸۹',
+                               ml: '൦൧൨൩൪൫൬൭൮൯',
+                               kn: '೦೧೨೩೪೫೬೭೮೯',
+                               lo: '໐໑໒໓໔໕໖໗໘໙',
+                               or: '୦୧୨୩୪୫୬୭୮୯',
+                               kh: '០១២៣៤៥៦៧៨៩',
+                               pa: '੦੧੨੩੪੫੬੭੮੯',
+                               gu: '૦૧૨૩૪૫૬૭૮૯',
+                               hi: '०१२३४५६७८९',
+                               my: '၀၁၂၃၄၅၆၇၈၉',
+                               ta: '௦௧௨௩௪௫௬௭௮௯',
+                               te: '౦౧౨౩౪౫౬౭౮౯',
+                               th: '๐๑๒๓๔๕๖๗๘๙', // FIXME use iso 639 codes
+                               bo: '༠༡༢༣༤༥༦༧༨༩' // FIXME use iso 639 codes
+                       };
+
+                       if ( !tables[language] ) {
+                               return false;
+                       }
+
+                       return tables[language].split( '' );
+               }
+       };
+
+       $.extend( $.i18n.languages, {
+               default: language
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/jquery.i18n.messagestore.js b/resources/lib/jquery.i18n/src/jquery.i18n.messagestore.js
new file mode 100644 (file)
index 0000000..759295c
--- /dev/null
@@ -0,0 +1,125 @@
+/**
+ * jQuery Internationalization library - Message Store
+ *
+ * Copyright (C) 2012 Santhosh Thottingal
+ *
+ * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do anything special to
+ * choose one license or the other and you don't have to notify anyone which license you are using.
+ * You are free to use UniversalLanguageSelector in commercial projects as long as the copyright
+ * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @licence GNU General Public Licence 2.0 or later
+ * @licence MIT License
+ */
+
+( function ( $, window, undefined ) {
+       'use strict';
+
+       var MessageStore = function () {
+               this.messages = {};
+               this.sources = {};
+       };
+
+       /**
+        * See https://github.com/wikimedia/jquery.i18n/wiki/Specification#wiki-Message_File_Loading
+        */
+       MessageStore.prototype = {
+
+               /**
+                * General message loading API This can take a URL string for
+                * the json formatted messages.
+                * <code>load('path/to/all_localizations.json');</code>
+                *
+                * This can also load a localization file for a locale <code>
+                * load( 'path/to/de-messages.json', 'de' );
+                * </code>
+                * A data object containing message key- message translation mappings
+                * can also be passed Eg:
+                * <code>
+                * load( { 'hello' : 'Hello' }, optionalLocale );
+                * </code> If the data argument is
+                * null/undefined/false,
+                * all cached messages for the i18n instance will get reset.
+                *
+                * @param {String|Object} source
+                * @param {String} locale Language tag
+                * @return {jQuery.Promise}
+                */
+               load: function ( source, locale ) {
+                       var key = null,
+                               deferred = null,
+                               deferreds = [],
+                               messageStore = this;
+
+                       if ( typeof source === 'string' ) {
+                               // This is a URL to the messages file.
+                               $.i18n.log( 'Loading messages from: ' + source );
+                               deferred = jsonMessageLoader( source )
+                                       .done( function ( localization ) {
+                                               messageStore.set( locale, localization );
+                                       } );
+
+                               return deferred.promise();
+                       }
+
+                       if ( locale ) {
+                               // source is an key-value pair of messages for given locale
+                               messageStore.set( locale, source );
+
+                               return $.Deferred().resolve();
+                       } else {
+                               // source is a key-value pair of locales and their source
+                               for ( key in source ) {
+                                       if ( Object.prototype.hasOwnProperty.call( source, key ) ) {
+                                               locale = key;
+                                               // No {locale} given, assume data is a group of languages,
+                                               // call this function again for each language.
+                                               deferreds.push( messageStore.load( source[key], locale ) );
+                                       }
+                               }
+                               return $.when.apply( $, deferreds );
+                       }
+
+               },
+
+               /**
+                * Set messages to the given locale.
+                * If locale exists, add messages to the locale.
+                * @param locale
+                * @param messages
+                */
+               set: function ( locale, messages ) {
+                       if ( !this.messages[locale] ) {
+                               this.messages[locale] = messages;
+                       } else {
+                               this.messages[locale] = $.extend( this.messages[locale], messages );
+                       }
+               },
+
+               /**
+                *
+                * @param locale
+                * @param messageKey
+                * @returns {Boolean}
+                */
+               get: function ( locale, messageKey ) {
+                       return this.messages[locale] && this.messages[locale][messageKey];
+               }
+       };
+
+       function jsonMessageLoader( url ) {
+               var deferred = $.Deferred();
+
+               $.getJSON( url )
+                       .done( deferred.resolve )
+                       .fail( function ( jqxhr, settings, exception ) {
+                               $.i18n.log( 'Error in loading messages from ' + url + ' Exception: ' + exception );
+                               // Ignore 404 exception, because we are handling fallabacks explicitly
+                               deferred.resolve();
+                       } );
+
+               return deferred.promise();
+       }
+
+       $.extend( $.i18n.messageStore, new MessageStore() );
+}( jQuery, window ) );
diff --git a/resources/lib/jquery.i18n/src/jquery.i18n.parser.js b/resources/lib/jquery.i18n/src/jquery.i18n.parser.js
new file mode 100644 (file)
index 0000000..3dea284
--- /dev/null
@@ -0,0 +1,309 @@
+/**
+ * jQuery Internationalization library
+ *
+ * Copyright (C) 2011-2013 Santhosh Thottingal, Neil Kandalgaonkar
+ *
+ * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do
+ * anything special to choose one license or the other and you don't have to
+ * notify anyone which license you are using. You are free to use
+ * UniversalLanguageSelector in commercial projects as long as the copyright
+ * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @licence GNU General Public Licence 2.0 or later
+ * @licence MIT License
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       var MessageParser = function ( options ) {
+               this.options = $.extend( {}, $.i18n.parser.defaults, options );
+               this.language = $.i18n.languages[String.locale] || $.i18n.languages['default'];
+               this.emitter = $.i18n.parser.emitter;
+       };
+
+       MessageParser.prototype = {
+
+               constructor: MessageParser,
+
+               simpleParse: function ( message, parameters ) {
+                       return message.replace( /\$(\d+)/g, function ( str, match ) {
+                               var index = parseInt( match, 10 ) - 1;
+
+                               return parameters[index] !== undefined ? parameters[index] : '$' + match;
+                       } );
+               },
+
+               parse: function ( message, replacements ) {
+                       if ( message.indexOf( '{{' ) < 0 ) {
+                               return this.simpleParse( message, replacements );
+                       }
+
+                       this.emitter.language = $.i18n.languages[$.i18n().locale] ||
+                               $.i18n.languages['default'];
+
+                       return this.emitter.emit( this.ast( message ), replacements );
+               },
+
+               ast: function ( message ) {
+                       var pipe, colon, backslash, anyCharacter, dollar, digits, regularLiteral,
+                               regularLiteralWithoutBar, regularLiteralWithoutSpace, escapedOrLiteralWithoutBar,
+                               escapedOrRegularLiteral, templateContents, templateName, openTemplate,
+                               closeTemplate, expression, paramExpression, result,
+                               pos = 0;
+
+                       // Try parsers until one works, if none work return null
+                       function choice( parserSyntax ) {
+                               return function () {
+                                       var i, result;
+
+                                       for ( i = 0; i < parserSyntax.length; i++ ) {
+                                               result = parserSyntax[i]();
+
+                                               if ( result !== null ) {
+                                                       return result;
+                                               }
+                                       }
+
+                                       return null;
+                               };
+                       }
+
+                       // Try several parserSyntax-es in a row.
+                       // All must succeed; otherwise, return null.
+                       // This is the only eager one.
+                       function sequence( parserSyntax ) {
+                               var i, res,
+                                       originalPos = pos,
+                                       result = [];
+
+                               for ( i = 0; i < parserSyntax.length; i++ ) {
+                                       res = parserSyntax[i]();
+
+                                       if ( res === null ) {
+                                               pos = originalPos;
+
+                                               return null;
+                                       }
+
+                                       result.push( res );
+                               }
+
+                               return result;
+                       }
+
+                       // Run the same parser over and over until it fails.
+                       // Must succeed a minimum of n times; otherwise, return null.
+                       function nOrMore( n, p ) {
+                               return function () {
+                                       var originalPos = pos,
+                                               result = [],
+                                               parsed = p();
+
+                                       while ( parsed !== null ) {
+                                               result.push( parsed );
+                                               parsed = p();
+                                       }
+
+                                       if ( result.length < n ) {
+                                               pos = originalPos;
+
+                                               return null;
+                                       }
+
+                                       return result;
+                               };
+                       }
+
+                       // Helpers -- just make parserSyntax out of simpler JS builtin types
+
+                       function makeStringParser( s ) {
+                               var len = s.length;
+
+                               return function () {
+                                       var result = null;
+
+                                       if ( message.substr( pos, len ) === s ) {
+                                               result = s;
+                                               pos += len;
+                                       }
+
+                                       return result;
+                               };
+                       }
+
+                       function makeRegexParser( regex ) {
+                               return function () {
+                                       var matches = message.substr( pos ).match( regex );
+
+                                       if ( matches === null ) {
+                                               return null;
+                                       }
+
+                                       pos += matches[0].length;
+
+                                       return matches[0];
+                               };
+                       }
+
+                       pipe = makeStringParser( '|' );
+                       colon = makeStringParser( ':' );
+                       backslash = makeStringParser( '\\' );
+                       anyCharacter = makeRegexParser( /^./ );
+                       dollar = makeStringParser( '$' );
+                       digits = makeRegexParser( /^\d+/ );
+                       regularLiteral = makeRegexParser( /^[^{}\[\]$\\]/ );
+                       regularLiteralWithoutBar = makeRegexParser( /^[^{}\[\]$\\|]/ );
+                       regularLiteralWithoutSpace = makeRegexParser( /^[^{}\[\]$\s]/ );
+
+                       // There is a general pattern:
+                       // parse a thing;
+                       // if it worked, apply transform,
+                       // otherwise return null.
+                       // But using this as a combinator seems to cause problems
+                       // when combined with nOrMore().
+                       // May be some scoping issue.
+                       function transform( p, fn ) {
+                               return function () {
+                                       var result = p();
+
+                                       return result === null ? null : fn( result );
+                               };
+                       }
+
+                       // Used to define "literals" within template parameters. The pipe
+                       // character is the parameter delimeter, so by default
+                       // it is not a literal in the parameter
+                       function literalWithoutBar() {
+                               var result = nOrMore( 1, escapedOrLiteralWithoutBar )();
+
+                               return result === null ? null : result.join( '' );
+                       }
+
+                       function literal() {
+                               var result = nOrMore( 1, escapedOrRegularLiteral )();
+
+                               return result === null ? null : result.join( '' );
+                       }
+
+                       function escapedLiteral() {
+                               var result = sequence( [ backslash, anyCharacter ] );
+
+                               return result === null ? null : result[1];
+                       }
+
+                       choice( [ escapedLiteral, regularLiteralWithoutSpace ] );
+                       escapedOrLiteralWithoutBar = choice( [ escapedLiteral, regularLiteralWithoutBar ] );
+                       escapedOrRegularLiteral = choice( [ escapedLiteral, regularLiteral ] );
+
+                       function replacement() {
+                               var result = sequence( [ dollar, digits ] );
+
+                               if ( result === null ) {
+                                       return null;
+                               }
+
+                               return [ 'REPLACE', parseInt( result[1], 10 ) - 1 ];
+                       }
+
+                       templateName = transform(
+                               // see $wgLegalTitleChars
+                               // not allowing : due to the need to catch "PLURAL:$1"
+                               makeRegexParser( /^[ !"$&'()*,.\/0-9;=?@A-Z\^_`a-z~\x80-\xFF+\-]+/ ),
+
+                               function ( result ) {
+                                       return result.toString();
+                               }
+                       );
+
+                       function templateParam() {
+                               var expr,
+                                       result = sequence( [ pipe, nOrMore( 0, paramExpression ) ] );
+
+                               if ( result === null ) {
+                                       return null;
+                               }
+
+                               expr = result[1];
+
+                               // use a "CONCAT" operator if there are multiple nodes,
+                               // otherwise return the first node, raw.
+                               return expr.length > 1 ? [ 'CONCAT' ].concat( expr ) : expr[0];
+                       }
+
+                       function templateWithReplacement() {
+                               var result = sequence( [ templateName, colon, replacement ] );
+
+                               return result === null ? null : [ result[0], result[2] ];
+                       }
+
+                       function templateWithOutReplacement() {
+                               var result = sequence( [ templateName, colon, paramExpression ] );
+
+                               return result === null ? null : [ result[0], result[2] ];
+                       }
+
+                       templateContents = choice( [
+                               function () {
+                                       var res = sequence( [
+                                               // templates can have placeholders for dynamic
+                                               // replacement eg: {{PLURAL:$1|one car|$1 cars}}
+                                               // or no placeholders eg:
+                                               // {{GRAMMAR:genitive|{{SITENAME}}}
+                                               choice( [ templateWithReplacement, templateWithOutReplacement ] ),
+                                               nOrMore( 0, templateParam )
+                                       ] );
+
+                                       return res === null ? null : res[0].concat( res[1] );
+                               },
+                               function () {
+                                       var res = sequence( [ templateName, nOrMore( 0, templateParam ) ] );
+
+                                       if ( res === null ) {
+                                               return null;
+                                       }
+
+                                       return [ res[0] ].concat( res[1] );
+                               }
+                       ] );
+
+                       openTemplate = makeStringParser( '{{' );
+                       closeTemplate = makeStringParser( '}}' );
+
+                       function template() {
+                               var result = sequence( [ openTemplate, templateContents, closeTemplate ] );
+
+                               return result === null ? null : result[1];
+                       }
+
+                       expression = choice( [ template, replacement, literal ] );
+                       paramExpression = choice( [ template, replacement, literalWithoutBar ] );
+
+                       function start() {
+                               var result = nOrMore( 0, expression )();
+
+                               if ( result === null ) {
+                                       return null;
+                               }
+
+                               return [ 'CONCAT' ].concat( result );
+                       }
+
+                       result = start();
+
+                       /*
+                        * For success, the pos must have gotten to the end of the input
+                        * and returned a non-null.
+                        * n.b. This is part of language infrastructure, so we do not throw an internationalizable message.
+                        */
+                       if ( result === null || pos !== message.length ) {
+                               throw new Error( 'Parse error at position ' + pos.toString() + ' in input: ' + message );
+                       }
+
+                       return result;
+               }
+
+       };
+
+       $.extend( $.i18n.parser, new MessageParser() );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/bs.js b/resources/lib/jquery.i18n/src/languages/bs.js
new file mode 100644 (file)
index 0000000..5370069
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Bosnian (bosanski) language functions
+ */
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.bs = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       switch ( form ) {
+                       case 'instrumental': // instrumental
+                               word = 's ' + word;
+                               break;
+                       case 'lokativ': // locative
+                               word = 'o ' + word;
+                               break;
+                       }
+
+                       return word;
+               }
+       } );
+
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/dsb.js b/resources/lib/jquery.i18n/src/languages/dsb.js
new file mode 100644 (file)
index 0000000..cc069eb
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Lower Sorbian (Dolnoserbski) language functions
+ */
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.dsb = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       switch ( form ) {
+                               case 'instrumental': // instrumental
+                                       word = 'z ' + word;
+                                       break;
+                               case 'lokatiw': // lokatiw
+                                       word = 'wo ' + word;
+                                       break;
+                       }
+
+                       return word;
+               }
+       } );
+
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/fi.js b/resources/lib/jquery.i18n/src/languages/fi.js
new file mode 100644 (file)
index 0000000..d8e9578
--- /dev/null
@@ -0,0 +1,49 @@
+/**
+ * Finnish (Suomi) language functions
+ *
+ * @author Santhosh Thottingal
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.fi = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       // vowel harmony flag
+                       var aou = word.match( /[aou][^äöy]*$/i ),
+                               origWord = word;
+                       if ( word.match( /wiki$/i ) ) {
+                               aou = false;
+                       }
+
+                       // append i after final consonant
+                       if ( word.match( /[bcdfghjklmnpqrstvwxz]$/i ) ) {
+                               word += 'i';
+                       }
+
+                       switch ( form ) {
+                       case 'genitive':
+                               word += 'n';
+                               break;
+                       case 'elative':
+                               word += ( aou ? 'sta' : 'stä' );
+                               break;
+                       case 'partitive':
+                               word += ( aou ? 'a' : 'ä' );
+                               break;
+                       case 'illative':
+                               // Double the last letter and add 'n'
+                               word += word.substr( word.length - 1 ) + 'n';
+                               break;
+                       case 'inessive':
+                               word += ( aou ? 'ssa' : 'ssä' );
+                               break;
+                       default:
+                               word = origWord;
+                               break;
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/ga.js b/resources/lib/jquery.i18n/src/languages/ga.js
new file mode 100644 (file)
index 0000000..1aceab7
--- /dev/null
@@ -0,0 +1,38 @@
+/**
+ * Irish (Gaeilge) language functions
+ */
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.ga = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       if ( form === 'ainmlae' ) {
+                               switch ( word ) {
+                               case 'an Domhnach':
+                                       word = 'Dé Domhnaigh';
+                                       break;
+                               case 'an Luan':
+                                       word = 'Dé Luain';
+                                       break;
+                               case 'an Mháirt':
+                                       word = 'Dé Mháirt';
+                                       break;
+                               case 'an Chéadaoin':
+                                       word = 'Dé Chéadaoin';
+                                       break;
+                               case 'an Déardaoin':
+                                       word = 'Déardaoin';
+                                       break;
+                               case 'an Aoine':
+                                       word = 'Dé hAoine';
+                                       break;
+                               case 'an Satharn':
+                                       word = 'Dé Sathairn';
+                                       break;
+                               }
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/he.js b/resources/lib/jquery.i18n/src/languages/he.js
new file mode 100644 (file)
index 0000000..cbbe90b
--- /dev/null
@@ -0,0 +1,31 @@
+/**
+ * Hebrew (עברית) language functions
+ */
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.he = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       switch ( form ) {
+                       case 'prefixed':
+                       case 'תחילית': // the same word in Hebrew
+                               // Duplicate prefixed "Waw", but only if it's not already double
+                               if ( word.substr( 0, 1 ) === 'ו' && word.substr( 0, 2 ) !== 'וו' ) {
+                                       word = 'ו' + word;
+                               }
+
+                               // Remove the "He" if prefixed
+                               if ( word.substr( 0, 1 ) === 'ה' ) {
+                                       word = word.substr( 1, word.length );
+                               }
+
+                               // Add a hyphen (maqaf) before numbers and non-Hebrew letters
+                               if ( word.substr( 0, 1 ) < 'א' || word.substr( 0, 1 ) > 'ת' ) {
+                                       word = '־' + word;
+                               }
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/hsb.js b/resources/lib/jquery.i18n/src/languages/hsb.js
new file mode 100644 (file)
index 0000000..957616f
--- /dev/null
@@ -0,0 +1,21 @@
+/**
+ * Upper Sorbian (Hornjoserbsce) language functions
+ */
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.hsb = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       switch ( form ) {
+                       case 'instrumental': // instrumental
+                               word = 'z ' + word;
+                               break;
+                       case 'lokatiw': // lokatiw
+                               word = 'wo ' + word;
+                               break;
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/hu.js b/resources/lib/jquery.i18n/src/languages/hu.js
new file mode 100644 (file)
index 0000000..1177b85
--- /dev/null
@@ -0,0 +1,26 @@
+/**
+ * Hungarian language functions
+ *
+ * @author Santhosh Thottingal
+ */
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.hu = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       switch ( form ) {
+                       case 'rol':
+                               word += 'ról';
+                               break;
+                       case 'ba':
+                               word += 'ba';
+                               break;
+                       case 'k':
+                               word += 'k';
+                               break;
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/hy.js b/resources/lib/jquery.i18n/src/languages/hy.js
new file mode 100644 (file)
index 0000000..9c56899
--- /dev/null
@@ -0,0 +1,25 @@
+/**
+ * Armenian (Հայերեն) language functions
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.hy = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       if ( form === 'genitive' ) { // սեռական հոլով
+                               if ( word.substr( -1 ) === 'ա' ) {
+                                       word = word.substr( 0, word.length - 1 ) + 'այի';
+                               } else if ( word.substr( -1 ) === 'ո' ) {
+                                       word = word.substr( 0, word.length - 1 ) + 'ոյի';
+                               } else if ( word.substr( -4 ) === 'գիրք' ) {
+                                       word = word.substr( 0, word.length - 4 ) + 'գրքի';
+                               } else {
+                                       word = word + 'ի';
+                               }
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/la.js b/resources/lib/jquery.i18n/src/languages/la.js
new file mode 100644 (file)
index 0000000..11c1122
--- /dev/null
@@ -0,0 +1,54 @@
+/**
+ * Latin (lingua Latina) language functions
+ *
+ * @author Santhosh Thottingal
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.la = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       switch ( form ) {
+                       case 'genitive':
+                               // only a few declensions, and even for those mostly the singular only
+                               word = word.replace( /u[ms]$/i, 'i' ); // 2nd declension singular
+                               word = word.replace( /ommunia$/i, 'ommunium' ); // 3rd declension neuter plural (partly)
+                               word = word.replace( /a$/i, 'ae' ); // 1st declension singular
+                               word = word.replace( /libri$/i, 'librorum' ); // 2nd declension plural (partly)
+                               word = word.replace( /nuntii$/i, 'nuntiorum' ); // 2nd declension plural (partly)
+                               word = word.replace( /tio$/i, 'tionis' ); // 3rd declension singular (partly)
+                               word = word.replace( /ns$/i, 'ntis' );
+                               word = word.replace( /as$/i, 'atis' );
+                               word = word.replace( /es$/i, 'ei' ); // 5th declension singular
+                               break;
+                       case 'accusative':
+                               // only a few declensions, and even for those mostly the singular only
+                               word = word.replace( /u[ms]$/i, 'um' ); // 2nd declension singular
+                               word = word.replace( /ommunia$/i, 'am' ); // 3rd declension neuter plural (partly)
+                               word = word.replace( /a$/i, 'ommunia' ); // 1st declension singular
+                               word = word.replace( /libri$/i, 'libros' ); // 2nd declension plural (partly)
+                               word = word.replace( /nuntii$/i, 'nuntios' );// 2nd declension plural (partly)
+                               word = word.replace( /tio$/i, 'tionem' ); // 3rd declension singular (partly)
+                               word = word.replace( /ns$/i, 'ntem' );
+                               word = word.replace( /as$/i, 'atem' );
+                               word = word.replace( /es$/i, 'em' ); // 5th declension singular
+                               break;
+                       case 'ablative':
+                               // only a few declensions, and even for those mostly the singular only
+                               word = word.replace( /u[ms]$/i, 'o' ); // 2nd declension singular
+                               word = word.replace( /ommunia$/i, 'ommunibus' ); // 3rd declension neuter plural (partly)
+                               word = word.replace( /a$/i, 'a' ); // 1st declension singular
+                               word = word.replace( /libri$/i, 'libris' ); // 2nd declension plural (partly)
+                               word = word.replace( /nuntii$/i, 'nuntiis' ); // 2nd declension plural (partly)
+                               word = word.replace( /tio$/i, 'tione' ); // 3rd declension singular (partly)
+                               word = word.replace( /ns$/i, 'nte' );
+                               word = word.replace( /as$/i, 'ate' );
+                               word = word.replace( /es$/i, 'e' ); // 5th declension singular
+                               break;
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/ml.js b/resources/lib/jquery.i18n/src/languages/ml.js
new file mode 100644 (file)
index 0000000..f724b7b
--- /dev/null
@@ -0,0 +1,98 @@
+/**
+ * Malayalam language functions
+ *
+ * @author Santhosh Thottingal
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.ml = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       form = form.toLowerCase();
+                       switch ( form ) {
+                               case 'ഉദ്ദേശിക':
+                               case 'dative':
+                                       if ( word.substr( -1 ) === 'ു' ||
+                                               word.substr( -1 ) === 'ൂ' ||
+                                               word.substr( -1 ) === 'ൗ' ||
+                                               word.substr( -1 ) === 'ൌ'
+                                       ) {
+                                               word += 'വിന്';
+                                       } else if ( word.substr( -1 ) === 'ം' ) {
+                                               word = word.substr( 0, word.length - 1 ) + 'ത്തിന്';
+                                       } else if ( word.substr( -1 ) === 'ൻ' ) {
+                                               // Atomic chillu n. അവൻ -> അവന്
+                                               word = word.substr( 0, word.length - 1 ) + 'ന്';
+                                       } else if ( word.substr( -3 ) === 'ന്\u200d' ) {
+                                               // chillu n. അവൻ -> അവന്
+                                               word = word.substr( 0, word.length - 1 );
+                                       } else if ( word.substr( -1 ) === 'ൾ' || word.substr( -3 ) === 'ള്\u200d' ) {
+                                               word += 'ക്ക്';
+                                       } else if ( word.substr( -1 ) === 'ർ' || word.substr( -3 ) === 'ര്\u200d' ) {
+                                               word += 'ക്ക്';
+                                       } else if ( word.substr( -1 ) === 'ൽ' ) {
+                                               // Atomic chillu ൽ , ഫയൽ -> ഫയലിന്
+                                               word = word.substr( 0, word.length - 1 ) + 'ലിന്';
+                                       } else if ( word.substr( -3 ) === 'ല്\u200d' ) {
+                                               // chillu ല്\u200d , ഫയല്\u200d -> ഫയലിന്
+                                               word = word.substr( 0, word.length - 2 ) + 'ിന്';
+                                       } else if ( word.substr( -2 ) === 'ു്' ) {
+                                               word = word.substr( 0, word.length - 2 ) + 'ിന്';
+                                       } else if ( word.substr( -1 ) === '്' ) {
+                                               word = word.substr( 0, word.length - 1 ) + 'ിന്';
+                                       } else {
+                                               // കാവ്യ -> കാവ്യയ്ക്ക്, ഹരി -> ഹരിയ്ക്ക്, മല -> മലയ്ക്ക്
+                                               word += 'യ്ക്ക്';
+                                       }
+
+                                       break;
+                               case 'സംബന്ധിക':
+                               case 'genitive':
+                                       if ( word.substr( -1 ) === 'ം' ) {
+                                               word = word.substr( 0, word.length - 1 ) + 'ത്തിന്റെ';
+                                       } else if ( word.substr( -2 ) === 'ു്' ) {
+                                               word = word.substr( 0, word.length - 2 ) + 'ിന്റെ';
+                                       } else if ( word.substr( -1 ) === '്' ) {
+                                               word = word.substr( 0, word.length - 1 ) + 'ിന്റെ';
+                                       } else if (  word.substr( -1 ) === 'ു' ||
+                                               word.substr( -1 ) === 'ൂ' ||
+                                               word.substr( -1 ) === 'ൗ' ||
+                                               word.substr( -1 ) === 'ൌ'
+                                       ) {
+                                               word += 'വിന്റെ';
+                                       } else if ( word.substr( -1 ) === 'ൻ' ) {
+                                               // Atomic chillu n. അവൻ -> അവന്റെ
+                                               word = word.substr( 0, word.length - 1 ) + 'ന്റെ';
+                                       } else if ( word.substr( -3 ) === 'ന്\u200d' ) {
+                                               // chillu n. അവൻ -> അവന്റെ
+                                               word = word.substr( 0, word.length - 1 ) + 'റെ';
+                                       } else if ( word.substr( -3 ) === 'ള്\u200d' ) {
+                                               // chillu n. അവൾ -> അവളുടെ
+                                               word = word.substr( 0, word.length - 2 ) + 'ുടെ';
+                                       } else if ( word.substr( -1 ) === 'ൾ' ) {
+                                               // Atomic chillu n. അവള്\u200d -> അവളുടെ
+                                               word = word.substr( 0, word.length - 1 ) + 'ളുടെ';
+                                       } else if ( word.substr( -1 ) === 'ൽ' ) {
+                                               // Atomic l. മുയല്\u200d -> മുയലിന്റെ
+                                               word = word.substr( 0, word.length - 1 ) + 'ലിന്റെ';
+                                       } else if ( word.substr( -3 ) === 'ല്\u200d' ) {
+                                               // chillu l. മുയല്\u200d -> അവളുടെ
+                                               word = word.substr( 0, word.length - 2 ) + 'ിന്റെ';
+                                       } else if ( word.substr( -3 ) === 'ര്\u200d' ) {
+                                               // chillu r. അവര്\u200d -> അവരുടെ
+                                               word = word.substr( 0, word.length - 2 ) + 'ുടെ';
+                                       } else if ( word.substr( -1 ) === 'ർ' ) {
+                                               // Atomic chillu r. അവർ -> അവരുടെ
+                                               word = word.substr( 0, word.length - 1 ) + 'രുടെ';
+                                       } else {
+                                               word += 'യുടെ';
+                                       }
+
+                                       break;
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/os.js b/resources/lib/jquery.i18n/src/languages/os.js
new file mode 100644 (file)
index 0000000..4744367
--- /dev/null
@@ -0,0 +1,76 @@
+/**
+ * Ossetian (Ирон) language functions
+ *
+ * @author Santhosh Thottingal
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.os = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       var endAllative, jot, hyphen, ending;
+
+                       // Ending for allative case
+                       endAllative = 'мæ';
+                       // Variable for 'j' beetwen vowels
+                       jot = '';
+                       // Variable for "-" for not Ossetic words
+                       hyphen = '';
+                       // Variable for ending
+                       ending = '';
+
+                       if ( word.match( /тæ$/i ) ) {
+                               // Checking if the $word is in plural form
+                               word = word.substring( 0, word.length - 1 );
+                               endAllative = 'æм';
+                       } else if ( word.match( /[аæеёиоыэюя]$/i ) ) {
+                               // Works if word is in singular form.
+                               // Checking if word ends on one of the vowels: е, ё, и, о, ы, э, ю,
+                               // я.
+                               jot = 'й';
+                       } else if ( word.match( /у$/i ) ) {
+                               // Checking if word ends on 'у'. 'У' can be either consonant 'W' or
+                               // vowel 'U' in cyrillic Ossetic.
+                               // Examples: {{grammar:genitive|аунеу}} = аунеуы,
+                               // {{grammar:genitive|лæппу}} = лæппуйы.
+                               if ( !word.substring( word.length - 2, word.length - 1 )
+                                               .match( /[аæеёиоыэюя]$/i ) ) {
+                                       jot = 'й';
+                               }
+                       } else if ( !word.match( /[бвгджзйклмнопрстфхцчшщьъ]$/i ) ) {
+                               hyphen = '-';
+                       }
+
+                       switch ( form ) {
+                       case 'genitive':
+                               ending = hyphen + jot + 'ы';
+                               break;
+                       case 'dative':
+                               ending = hyphen + jot + 'æн';
+                               break;
+                       case 'allative':
+                               ending = hyphen + endAllative;
+                               break;
+                       case 'ablative':
+                               if ( jot === 'й' ) {
+                                       ending = hyphen + jot + 'æ';
+                               } else {
+                                       ending = hyphen + jot + 'æй';
+                               }
+                               break;
+                       case 'superessive':
+                               ending = hyphen + jot + 'ыл';
+                               break;
+                       case 'equative':
+                               ending = hyphen + jot + 'ау';
+                               break;
+                       case 'comitative':
+                               ending = hyphen + 'имæ';
+                               break;
+                       }
+
+                       return word + ending;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/ru.js b/resources/lib/jquery.i18n/src/languages/ru.js
new file mode 100644 (file)
index 0000000..893b238
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * Russian (Русский) language functions
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.ru = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       if ( form === 'genitive' ) { // родительный падеж
+                               if ( word.substr( -1 ) === 'ь' ) {
+                                       word = word.substr( 0, word.length - 1 ) + 'я';
+                               } else if ( word.substr( -2 ) === 'ия' ) {
+                                       word = word.substr( 0, word.length - 2 ) + 'ии';
+                               } else if ( word.substr( -2 ) === 'ка' ) {
+                                       word = word.substr( 0, word.length - 2 ) + 'ки';
+                               } else if ( word.substr( -2 ) === 'ти' ) {
+                                       word = word.substr( 0, word.length - 2 ) + 'тей';
+                               } else if ( word.substr( -2 ) === 'ды' ) {
+                                       word = word.substr( 0, word.length - 2 ) + 'дов';
+                               } else if ( word.substr( -3 ) === 'ник' ) {
+                                       word = word.substr( 0, word.length - 3 ) + 'ника';
+                               }
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/sl.js b/resources/lib/jquery.i18n/src/languages/sl.js
new file mode 100644 (file)
index 0000000..a3aafc3
--- /dev/null
@@ -0,0 +1,26 @@
+/**
+ * Slovenian (Slovenščina) language functions
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.sl = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       switch ( form ) {
+                               // locative
+                               case 'mestnik':
+                                       word = 'o ' + word;
+
+                                       break;
+                               // instrumental
+                               case 'orodnik':
+                                       word = 'z ' + word;
+
+                                       break;
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/uk.js b/resources/lib/jquery.i18n/src/languages/uk.js
new file mode 100644 (file)
index 0000000..8e69efc
--- /dev/null
@@ -0,0 +1,39 @@
+/**
+ * Ukrainian (Українська) language functions
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.uk = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       switch ( form ) {
+                       case 'genitive': // родовий відмінок
+                               if ( word.substr( -1 ) === 'ь' ) {
+                                       word = word.substr( 0, word.length - 1 ) + 'я';
+                               } else if ( word.substr( -2 ) === 'ія' ) {
+                                       word = word.substr( 0, word.length - 2 ) + 'ії';
+                               } else if ( word.substr( -2 ) === 'ка' ) {
+                                       word = word.substr( 0, word.length - 2 ) + 'ки';
+                               } else if ( word.substr( -2 ) === 'ти' ) {
+                                       word = word.substr( 0, word.length - 2 ) + 'тей';
+                               } else if ( word.substr( -2 ) === 'ды' ) {
+                                       word = word.substr( 0, word.length - 2 ) + 'дов';
+                               } else if ( word.substr( -3 ) === 'ник' ) {
+                                       word = word.substr( 0, word.length - 3 ) + 'ника';
+                               }
+
+                               break;
+                       case 'accusative': // знахідний відмінок
+                               if ( word.substr( -2 ) === 'ія' ) {
+                                       word = word.substr( 0, word.length - 2 ) + 'ію';
+                               }
+
+                               break;
+                       }
+
+                       return word;
+               }
+       } );
+
+}( jQuery ) );
diff --git a/resources/lib/mustache/LICENSE b/resources/lib/mustache/LICENSE
new file mode 100644 (file)
index 0000000..aa1b831
--- /dev/null
@@ -0,0 +1,10 @@
+The MIT License
+
+Copyright (c) 2009 Chris Wanstrath (Ruby)
+Copyright (c) 2010-2014 Jan Lehnardt (JavaScript)
+
+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.
index 8098781..61eb384 100644 (file)
@@ -8,9 +8,14 @@
        "ooui-outline-control-move-up": "طلع الشيئ للفوق",
        "ooui-outline-control-remove": "أمحي العنصر",
        "ooui-toolbar-more": "زيادة",
+       "ooui-toolgroup-expand": "زيادة",
+       "ooui-toolgroup-collapse": "قليل",
        "ooui-dialog-message-accept": "مليح",
        "ooui-dialog-message-reject": "رجَع",
        "ooui-dialog-process-error": "حاجه ما خدمتش مليح",
        "ooui-dialog-process-dismiss": "أرفضها",
-       "ooui-dialog-process-retry": "عاود جرب"
+       "ooui-dialog-process-retry": "عاود جرب",
+       "ooui-dialog-process-continue": "واصل",
+       "ooui-selectfile-not-supported": "تحديد الفيشيات ما هوش محدد",
+       "ooui-selectfile-placeholder": "ما اختاريتش حتا ملف"
 }
index ae853dd..c373601 100644 (file)
@@ -1,9 +1,13 @@
 {
        "@metadata": {
                "authors": [
-                       "Gitartha.bordoloi"
+                       "Gitartha.bordoloi",
+                       "Dibya Dutta"
                ]
        },
+       "ooui-outline-control-move-down": "সমল তললৈ স্থানান্তৰ কৰক",
+       "ooui-outline-control-move-up": "সমল ওপৰলৈ স্থানান্তৰ কৰক",
+       "ooui-outline-control-remove": "সমল আঁতৰাওক",
        "ooui-toolbar-more": "অধিক",
        "ooui-toolgroup-expand": "অধিক",
        "ooui-toolgroup-collapse": "কম দেখাওক",
@@ -12,5 +16,7 @@
        "ooui-dialog-process-error": "কিবা ত্ৰুটি হৈছে",
        "ooui-dialog-process-dismiss": "বাতিল",
        "ooui-dialog-process-retry": "পুনৰ চেষ্টা কৰক",
-       "ooui-dialog-process-continue": "অব্যাহত ৰাখক"
+       "ooui-dialog-process-continue": "অব্যাহত ৰাখক",
+       "ooui-selectfile-not-supported": "নথি নিৰ্বাচন সমৰ্থন কৰা নাই",
+       "ooui-selectfile-placeholder": "কোনো নথি নিৰ্বাচিত কৰা হোৱা নাই"
 }
index 87d7688..216df70 100644 (file)
        "ooui-outline-control-move-up": "Mover arriba l'elementu",
        "ooui-outline-control-remove": "Desaniciar elementu",
        "ooui-toolbar-more": "Más",
+       "ooui-toolgroup-expand": "Más",
+       "ooui-toolgroup-collapse": "Menos",
        "ooui-dialog-message-accept": "Aceutar",
        "ooui-dialog-message-reject": "Encaboxar",
        "ooui-dialog-process-error": "Daqué funcionó mal",
        "ooui-dialog-process-dismiss": "Descartar",
-       "ooui-dialog-process-retry": "Vuelvi a intentalo"
+       "ooui-dialog-process-retry": "Vuelvi a intentalo",
+       "ooui-dialog-process-continue": "Siguir",
+       "ooui-selectfile-not-supported": "Nun hai encontu pa la seleición de ficheros",
+       "ooui-selectfile-placeholder": "Nun se seleicionó nengún ficheru"
 }
index 4aeb490..3548239 100644 (file)
@@ -5,12 +5,22 @@
                        "Wizardist",
                        "Чаховіч Уладзіслаў",
                        "Zedlik",
-                       "Red Winged Duck"
+                       "Red Winged Duck",
+                       "Renessaince"
                ]
        },
        "ooui-outline-control-move-down": "Перасунуць элемэнт ніжэй",
        "ooui-outline-control-move-up": "Перасунуць элемэнт вышэй",
+       "ooui-outline-control-remove": "Выдаліць пункт",
        "ooui-toolbar-more": "Болей",
        "ooui-toolgroup-expand": "Болей",
-       "ooui-toolgroup-collapse": "Меней"
+       "ooui-toolgroup-collapse": "Меней",
+       "ooui-dialog-message-accept": "Добра",
+       "ooui-dialog-message-reject": "Скасаваць",
+       "ooui-dialog-process-error": "Нешта пайшло ня так",
+       "ooui-dialog-process-dismiss": "Прапусьціць",
+       "ooui-dialog-process-retry": "Паспрабаваць зноў",
+       "ooui-dialog-process-continue": "Працягваць",
+       "ooui-selectfile-not-supported": "Выбар файлу не падтрымліваецца",
+       "ooui-selectfile-placeholder": "Ніводзін файл не абраны"
 }
index 1cfa6c4..9481a2c 100644 (file)
@@ -8,7 +8,8 @@
                        "Runab",
                        "Sayak Sarkar",
                        "Aftabuzzaman",
-                       "RYasmeen (WMF)"
+                       "RYasmeen (WMF)",
+                       "NahidSultan"
                ]
        },
        "ooui-outline-control-move-down": "আইটেম নিচে স্থানান্তর",
@@ -22,5 +23,7 @@
        "ooui-dialog-process-error": "কিছু একটায় ত্রুটি হয়েছে",
        "ooui-dialog-process-dismiss": "বাতিল করুন",
        "ooui-dialog-process-retry": "আবার চেষ্টা করুন",
-       "ooui-dialog-process-continue": "অগ্রসর হোন"
+       "ooui-dialog-process-continue": "অগ্রসর হোন",
+       "ooui-selectfile-not-supported": "চিত্র নির্বাচন সমর্থন করছে না।",
+       "ooui-selectfile-placeholder": " কোন চিত্র নির্বাচিত হয়নি।"
 }
index 0c66619..d2a998c 100644 (file)
@@ -3,9 +3,18 @@
                "authors": [
                        "Calak",
                        "Muhammed taha",
-                       "Serwan"
+                       "Serwan",
+                       "Pirehelokan"
                ]
        },
+       "ooui-toolbar-more": "زیاتر",
+       "ooui-toolgroup-expand": "زیاتر",
+       "ooui-toolgroup-collapse": "کەمتر",
        "ooui-dialog-message-accept": "باشە",
-       "ooui-dialog-message-reject": "پاشگەزبوونەوە"
+       "ooui-dialog-message-reject": "پاشگەزبوونەوە",
+       "ooui-dialog-process-error": "ھەڵەیەک ڕووی داوە",
+       "ooui-dialog-process-dismiss": "لێگەڕان",
+       "ooui-dialog-process-retry": "دیسان ھەوڵ بدە",
+       "ooui-dialog-process-continue": "درێژە بدە",
+       "ooui-selectfile-placeholder": "ھیچ فایلێک ھەڵنەبژێراوە"
 }
index 0b847be..30e3efa 100644 (file)
@@ -7,10 +7,13 @@
                        "Laketown",
                        "Palnatoke",
                        "Simeondahl",
-                       "Tehnix"
+                       "Tehnix",
+                       "Macofe"
                ]
        },
        "ooui-outline-control-move-down": "Flyt ned",
        "ooui-outline-control-move-up": "Flyt op",
-       "ooui-toolbar-more": "Mere"
+       "ooui-toolbar-more": "Mere",
+       "ooui-toolgroup-expand": "Mere",
+       "ooui-dialog-process-continue": "Fortsæt"
 }
diff --git a/resources/lib/oojs-ui/i18n/dty.json b/resources/lib/oojs-ui/i18n/dty.json
new file mode 100644 (file)
index 0000000..21742b6
--- /dev/null
@@ -0,0 +1,18 @@
+{
+       "@metadata": {
+               "authors": [
+                       "जनक राज भट्ट"
+               ]
+       },
+       "ooui-outline-control-move-down": "वस्तुलाई तल साददे",
+       "ooui-outline-control-move-up": "वस्तुलाई मथि साददे",
+       "ooui-outline-control-remove": "वस्तुलाई हटुन्या",
+       "ooui-toolbar-more": "झिक्क",
+       "ooui-toolgroup-expand": "झिक्क",
+       "ooui-toolgroup-collapse": "थोका",
+       "ooui-dialog-message-accept": "हुन्छ",
+       "ooui-dialog-message-reject": "रद्द",
+       "ooui-dialog-process-dismiss": "खारेज गद्दे",
+       "ooui-dialog-process-retry": "दोसरया प्रयास गर",
+       "ooui-dialog-process-continue": "जारी राख्या"
+}
index 0f705ad..2ead5c5 100644 (file)
@@ -4,7 +4,8 @@
                        "Happy5214",
                        "KuboF",
                        "Shirayuki",
-                       "Yekrats"
+                       "Yekrats",
+                       "Kvardek du"
                ]
        },
        "ooui-outline-control-move-down": "Movi eron suben",
@@ -16,6 +17,9 @@
        "ooui-dialog-message-accept": "Bone",
        "ooui-dialog-message-reject": "Nuligi",
        "ooui-dialog-process-error": "Io rompiĝis",
+       "ooui-dialog-process-dismiss": "Elimini",
        "ooui-dialog-process-retry": "Reprovi",
-       "ooui-dialog-process-continue": "Daŭrigi"
+       "ooui-dialog-process-continue": "Daŭrigi",
+       "ooui-selectfile-not-supported": "Dosieroselekto ne estas subtenata.",
+       "ooui-selectfile-placeholder": "Vi ne selektis dosieron"
 }
index 415ff60..e86f11e 100644 (file)
@@ -18,6 +18,6 @@
        "ooui-dialog-process-dismiss": "Hülga",
        "ooui-dialog-process-retry": "Proovi uuesti",
        "ooui-dialog-process-continue": "Jätka",
-       "ooui-selectfile-not-supported": "Faili valik ei ole toetatud",
+       "ooui-selectfile-not-supported": "Faili valiku tugi puudub",
        "ooui-selectfile-placeholder": "Faili ei ole valitud"
 }
index fe6e997..93c66c5 100644 (file)
@@ -20,5 +20,6 @@
        "ooui-dialog-process-dismiss": "Utzi",
        "ooui-dialog-process-retry": "Saiatu berriro",
        "ooui-dialog-process-continue": "Jarraitu",
+       "ooui-selectfile-not-supported": "Fitxategi aukeraketa ez da onartzen",
        "ooui-selectfile-placeholder": "Ez da fitxategirik hautatu"
 }
index 62198f4..e20997a 100644 (file)
@@ -12,7 +12,8 @@
                        "درفش کاویانی",
                        "Armin1392",
                        "Alirezaaa",
-                       "Leyth"
+                       "Leyth",
+                       "الناز"
                ]
        },
        "ooui-outline-control-move-down": "انتقال مورد به پایین",
@@ -24,9 +25,9 @@
        "ooui-dialog-message-accept": "تأیید",
        "ooui-dialog-message-reject": "لغو",
        "ooui-dialog-process-error": "مشکلی وجود دارد",
-       "ooui-dialog-process-dismiss": "نپذیرفتن",
-       "ooui-dialog-process-retry": "دوباره امتحان کن",
+       "ooui-dialog-process-dismiss": "رد",
+       "ooui-dialog-process-retry": "دوباره امتحان کنید",
        "ooui-dialog-process-continue": "ادامه",
        "ooui-selectfile-not-supported": "انتخاب پرونده پشتیبانی نمی‌شود",
-       "ooui-selectfile-placeholder": "هیچ پرونده‌ای انتخاب نشدهاست"
+       "ooui-selectfile-placeholder": "هیچ پرونده‌ای انتخاب نشده است"
 }
index 8c76e07..c96a74e 100644 (file)
@@ -24,7 +24,7 @@
        "ooui-toolgroup-expand": "Näytä lisää",
        "ooui-toolgroup-collapse": "Näytä vähemmän",
        "ooui-dialog-message-accept": "OK",
-       "ooui-dialog-message-reject": "Peruuta",
+       "ooui-dialog-message-reject": "Peru",
        "ooui-dialog-process-error": "Jokin meni pieleen",
        "ooui-dialog-process-dismiss": "Hylkää",
        "ooui-dialog-process-retry": "Yritä uudelleen",
index ae671cb..537f6b8 100644 (file)
                        "Verdy p",
                        "Wyz",
                        "SnowedEarth",
-                       "Jdforrester"
+                       "Jdforrester",
+                       "Wladek92",
+                       "Harmonia Amanda"
                ]
        },
-       "ooui-outline-control-move-down": "Faire descendre l’élément",
-       "ooui-outline-control-move-up": "Faire monter l’élément",
+       "ooui-outline-control-move-down": "Descendre l’élément",
+       "ooui-outline-control-move-up": "Monter l’élément",
        "ooui-outline-control-remove": "Supprimer l’élément",
        "ooui-toolbar-more": "Plus",
        "ooui-toolgroup-expand": "Plus",
        "ooui-toolgroup-collapse": "Moins",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Annuler",
-       "ooui-dialog-process-error": "Quelque chose a mal tourné",
+       "ooui-dialog-process-error": "Quelque chose s'est mal passé",
        "ooui-dialog-process-dismiss": "Rejeter",
-       "ooui-dialog-process-retry": "Réessayez",
+       "ooui-dialog-process-retry": "Réessayer",
        "ooui-dialog-process-continue": "Continuer",
        "ooui-selectfile-not-supported": "La sélection de fichier n’est pas prise en charge",
        "ooui-selectfile-placeholder": "Aucun fichier sélectionné"
index 3f02e19..5c48b9e 100644 (file)
@@ -4,7 +4,8 @@
                        "Ashok modhvadia",
                        "KartikMistry",
                        "The Discoverer",
-                       "NehalDaveND"
+                       "NehalDaveND",
+                       "Dsvyas"
                ]
        },
        "ooui-outline-control-move-down": "વસ્તુ નીચે ખસેડો",
        "ooui-outline-control-remove": "વસ્તુ હટાવો",
        "ooui-toolbar-more": "વધુ",
        "ooui-toolgroup-expand": "વધુ",
+       "ooui-toolgroup-collapse": "ઓછા",
        "ooui-dialog-message-accept": "બરાબર",
        "ooui-dialog-message-reject": "રદ કરો",
        "ooui-dialog-process-error": "કંઇક ગરબડ થઇ",
+       "ooui-dialog-process-dismiss": "વિસર્જન",
        "ooui-dialog-process-retry": "ફરી પ્રયત્ન કરો",
-       "ooui-dialog-process-continue": "ચાલુ રાખો"
+       "ooui-dialog-process-continue": "ચાલુ રાખો",
+       "ooui-selectfile-not-supported": "ફાઇલ પસંદગીની જોગવાઈ નથી",
+       "ooui-selectfile-placeholder": "કોઇ ફાઇલ પસંદ નથી કરાઈ"
 }
index d45b057..acd9d3b 100644 (file)
@@ -6,18 +6,19 @@
                        "Misibacsi",
                        "ViDam",
                        "Tacsipacsi",
-                       "Csega"
+                       "Csega",
+                       "Kishajnalka"
                ]
        },
        "ooui-outline-control-move-down": "Elem mozgatása lefelé",
        "ooui-outline-control-move-up": "Elem mozgatása felfelé",
        "ooui-outline-control-remove": "Elem eltávolítása",
-       "ooui-toolbar-more": "Tovább...",
+       "ooui-toolbar-more": "Több",
        "ooui-toolgroup-expand": "Több",
        "ooui-toolgroup-collapse": "Kevesebb",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Mégse",
-       "ooui-dialog-process-error": "Valami elromlott.",
+       "ooui-dialog-process-error": "Valami elromlott",
        "ooui-dialog-process-dismiss": "Elrejt",
        "ooui-dialog-process-retry": "Próbáld újra",
        "ooui-dialog-process-continue": "Folytatás",
index 2aaf4e4..c2b45a8 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Vacio",
                        "Xelgen",
-                       "Դավիթ Սարոյան"
+                       "Դավիթ Սարոյան",
+                       "Vahe Gharakhanyan"
                ]
        },
        "ooui-outline-control-move-down": "Իջեցնել կետը",
@@ -17,5 +18,7 @@
        "ooui-dialog-process-error": "Ինչ-որ սխալ է տեղի ունեցել",
        "ooui-dialog-process-dismiss": "Փակել",
        "ooui-dialog-process-retry": "Կրկին փորձել",
-       "ooui-dialog-process-continue": "Շարունակել"
+       "ooui-dialog-process-continue": "Շարունակել",
+       "ooui-selectfile-not-supported": "Ֆայլի ընտրությունը չի պաշտպանվում",
+       "ooui-selectfile-placeholder": "Ֆայլն ընտրված չէ"
 }
index bd65e71..400a432 100644 (file)
@@ -22,5 +22,7 @@
        "ooui-dialog-process-error": "Ada yang tidak beres",
        "ooui-dialog-process-dismiss": "Tutup",
        "ooui-dialog-process-retry": "Coba lagi",
-       "ooui-dialog-process-continue": "Lanjutkan"
+       "ooui-dialog-process-continue": "Lanjutkan",
+       "ooui-selectfile-not-supported": "Peilihan berkas tidak didukung",
+       "ooui-selectfile-placeholder": "Tidak ada berkas yang terpilih"
 }
index ec86124..631b3f5 100644 (file)
@@ -20,5 +20,7 @@
        "ooui-dialog-process-error": "エラーが発生しました…",
        "ooui-dialog-process-dismiss": "閉じる",
        "ooui-dialog-process-retry": "もう一度お試しください",
-       "ooui-dialog-process-continue": "続行"
+       "ooui-dialog-process-continue": "続行",
+       "ooui-selectfile-not-supported": "ファイルの選択はサポートされていません",
+       "ooui-selectfile-placeholder": "ファイルが選択されていません"
 }
index 8827af3..677b1c3 100644 (file)
@@ -3,8 +3,22 @@
                "authors": [
                        "Gleki",
                        "NoiX180",
-                       "Pras"
+                       "Pras",
+                       "Jadinegara"
                ]
        },
-       "ooui-outline-control-move-down": "Pindhahaken butir mangandhap"
+       "ooui-outline-control-move-down": "Pindhahaken butir mangandhap",
+       "ooui-outline-control-move-up": "Pindhah kara mêndhuwur",
+       "ooui-outline-control-remove": "Busak kara",
+       "ooui-toolbar-more": "Mênèh",
+       "ooui-toolgroup-expand": "Mênèh",
+       "ooui-toolgroup-collapse": "Suda",
+       "ooui-dialog-message-accept": "Oké",
+       "ooui-dialog-message-reject": "Batal",
+       "ooui-dialog-process-error": "Ana sing klèru",
+       "ooui-dialog-process-dismiss": "Tutup",
+       "ooui-dialog-process-retry": "Jajal manèh",
+       "ooui-dialog-process-continue": "Tutug",
+       "ooui-selectfile-not-supported": "Pilihan bêrkas ora disokong",
+       "ooui-selectfile-placeholder": "Ora ana bêrkas sing kapilih"
 }
index 60ef661..efacb63 100644 (file)
@@ -22,5 +22,8 @@
        "ooui-dialog-process-error": "მოხდა რაღაც შეცდომა",
        "ooui-dialog-process-dismiss": "დამალვა",
        "ooui-dialog-process-retry": "კიდევ სცადეთ",
-       "ooui-dialog-process-continue": "გაგრძელება"
+       "ooui-dialog-process-continue": "გაგრძელება",
+       "ooui-selectfile-not-supported": "ფაილის არჩევა არ არის მხარდაჭერილი",
+       "ooui-selectfile-placeholder": "ფაილი არ არის არჩეული",
+       "ooui-semicolon-separator": ";"
 }
index 196dc2c..f23f687 100644 (file)
        "ooui-outline-control-remove": "항목 지우기",
        "ooui-toolbar-more": "더 보기",
        "ooui-toolgroup-expand": "더 보기",
+       "ooui-toolgroup-collapse": "덜 보기",
        "ooui-dialog-message-accept": "확인",
        "ooui-dialog-message-reject": "취소",
        "ooui-dialog-process-error": "무언가가 잘못되었습니다",
        "ooui-dialog-process-dismiss": "숨기기",
-       "ooui-dialog-process-retry": "다시 시도하세요"
+       "ooui-dialog-process-retry": "다시 시도하세요",
+       "ooui-dialog-process-continue": "계속",
+       "ooui-selectfile-not-supported": "파일 선택은 지원하지 않습니다",
+       "ooui-selectfile-placeholder": "선택한 파일 없음"
 }
diff --git a/resources/lib/oojs-ui/i18n/li.json b/resources/lib/oojs-ui/i18n/li.json
new file mode 100644 (file)
index 0000000..f05a957
--- /dev/null
@@ -0,0 +1,21 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Pahles"
+               ]
+       },
+       "ooui-outline-control-move-down": "Item nao ónger verplaatse",
+       "ooui-outline-control-move-up": "Item nao bove verplaetse",
+       "ooui-outline-control-remove": "Item ewegsjaffe",
+       "ooui-toolbar-more": "Mieë",
+       "ooui-toolgroup-expand": "Mieë",
+       "ooui-toolgroup-collapse": "Minder",
+       "ooui-dialog-message-accept": "Ok",
+       "ooui-dialog-message-reject": "Aafbraeke",
+       "ooui-dialog-process-error": "Dao is get misgegange",
+       "ooui-dialog-process-dismiss": "Sjlete",
+       "ooui-dialog-process-retry": "Perbeer obbenuujts",
+       "ooui-dialog-process-continue": "Doorgaon",
+       "ooui-selectfile-not-supported": "Selektie van 'n besjtandj waert neet óngersteund",
+       "ooui-selectfile-placeholder": "Dao is gein besjtandj geselekteerd"
+}
index 0ce0c3f..326dd14 100644 (file)
@@ -9,5 +9,16 @@
        },
        "ooui-outline-control-move-down": "ഇനം താഴേയ്ക്ക് മാറ്റുക",
        "ooui-outline-control-move-up": "ഇനം മുകളിലേയ്ക്ക് മാറ്റുക",
-       "ooui-toolbar-more": "കൂടുതൽ"
+       "ooui-outline-control-remove": "ഇനം നീക്കംചെയ്യുക",
+       "ooui-toolbar-more": "കൂടുതൽ",
+       "ooui-toolgroup-expand": "കൂടുതൽ",
+       "ooui-toolgroup-collapse": "കുറച്ച്",
+       "ooui-dialog-message-accept": "ശരി",
+       "ooui-dialog-message-reject": "റദ്ദാക്കുക",
+       "ooui-dialog-process-error": "എന്തോ പ്രശ്നമുണ്ടായി",
+       "ooui-dialog-process-dismiss": "ഒഴിവാക്കുക",
+       "ooui-dialog-process-retry": "വീണ്ടും ശ്രമിക്കുക",
+       "ooui-dialog-process-continue": "തുടരുക",
+       "ooui-selectfile-not-supported": "പ്രമാണം തിരഞ്ഞെടുക്കൽ പിന്തുണയ്ക്കുന്നില്ല",
+       "ooui-selectfile-placeholder": "പ്രമാണങ്ങൾ ഒന്നും തിരഞ്ഞെടുത്തിട്ടില്ല"
 }
index 136ada3..19ce1c2 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Anakmalaysia",
                        "Aurora",
-                       "Pizza1016"
+                       "Pizza1016",
+                       "Karmadunya9-"
                ]
        },
        "ooui-outline-control-move-down": "Alihkan perkara ke bawah",
@@ -18,5 +19,6 @@
        "ooui-dialog-process-dismiss": "Singkir",
        "ooui-dialog-process-retry": "Cuba lagi",
        "ooui-dialog-process-continue": "Teruskan",
+       "ooui-selectfile-not-supported": "Pilihan fail tidak disokong",
        "ooui-selectfile-placeholder": "Tiada fail yang dipilih"
 }
index 8eba859..515eada 100644 (file)
@@ -32,5 +32,6 @@
        "ooui-dialog-process-dismiss": "Sluiten",
        "ooui-dialog-process-retry": "Opnieuw proberen",
        "ooui-dialog-process-continue": "Doorgaan",
+       "ooui-selectfile-not-supported": "Selectie van een bestand wordt niet ondersteund",
        "ooui-selectfile-placeholder": "Er is geen bestand geselecteerd"
 }
index 4d35b6c..bccd615 100644 (file)
@@ -9,5 +9,12 @@
        "ooui-outline-control-move-up": "Far montar l’element",
        "ooui-outline-control-remove": "Suprimir l’element",
        "ooui-toolbar-more": "Mai",
-       "ooui-dialog-message-reject": "Anullar"
+       "ooui-toolgroup-expand": "Mai",
+       "ooui-toolgroup-collapse": "Mens",
+       "ooui-dialog-message-accept": "D'acòrdi",
+       "ooui-dialog-message-reject": "Anullar",
+       "ooui-dialog-process-dismiss": "Regetar",
+       "ooui-dialog-process-retry": "Ensajatz tornamai",
+       "ooui-dialog-process-continue": "Contunhar",
+       "ooui-selectfile-placeholder": "Cap de fichièr pas seleccionat"
 }
index dde49bf..7d96dcb 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Odisha1",
                        "Psubhashish",
-                       "ଶିତିକଣ୍ଠ ଦାଶ"
+                       "ଶିତିକଣ୍ଠ ଦାଶ",
+                       "Jnanaranjan Sahu"
                ]
        },
        "ooui-outline-control-move-down": "ବସ୍ତୁଟିକୁ ତଳକୁ ଘୁଞ୍ଚାନ୍ତୁ",
@@ -17,5 +18,7 @@
        "ooui-dialog-process-error": "ଅସୁବିଧାଟିଏ ଘଟିଲା",
        "ooui-dialog-process-dismiss": "ଖାରଜ",
        "ooui-dialog-process-retry": "ଆଉ ଥରେ ଚେଷ୍ଟା କରନ୍ତୁ",
-       "ooui-dialog-process-continue": "ଚାଲୁରଖିବେ"
+       "ooui-dialog-process-continue": "ଚାଲୁରଖିବେ",
+       "ooui-selectfile-not-supported": "ଫାଇଲ ବାଛିବା ସୁବିଧା ନାହିଁ",
+       "ooui-selectfile-placeholder": "କୌଣସି ଫାଇଲ ବଛାଯାଇନାହିଁ"
 }
index 3023479..81da6f5 100644 (file)
@@ -31,5 +31,6 @@
        "ooui-dialog-process-dismiss": "Ukryj",
        "ooui-dialog-process-retry": "Spróbuj ponownie",
        "ooui-dialog-process-continue": "Kontynuuj",
+       "ooui-selectfile-not-supported": "Wybór pliku nie jest obsługiwany",
        "ooui-selectfile-placeholder": "Nie wybrano pliku"
 }
index b8fd3a5..c8b5bc7 100644 (file)
@@ -8,5 +8,16 @@
        },
        "ooui-outline-control-move-down": "Fé calé giù l'element",
        "ooui-outline-control-move-up": "Fé monté l'element",
-       "ooui-toolbar-more": "Ëd pi"
+       "ooui-outline-control-remove": "Gavé j'element",
+       "ooui-toolbar-more": "Ëd pi",
+       "ooui-toolgroup-expand": "Pi",
+       "ooui-toolgroup-collapse": "Men",
+       "ooui-dialog-message-accept": "Va bin",
+       "ooui-dialog-message-reject": "Scancelé",
+       "ooui-dialog-process-error": "Quaicòs a l'é andà mal",
+       "ooui-dialog-process-dismiss": "Stërmé",
+       "ooui-dialog-process-retry": "Preuva torna",
+       "ooui-dialog-process-continue": "Continua",
+       "ooui-selectfile-not-supported": "La selession d'archivi a l'é nen mantnùa",
+       "ooui-selectfile-placeholder": "Gnun archivi selessionà"
 }
index 94ea089..bcc31e0 100644 (file)
@@ -9,10 +9,23 @@
                        "Jaideraf",
                        "Luckas",
                        "OTAVIO1981",
-                       555
+                       555,
+                       "TheEduGobi",
+                       "TheGabrielZaum"
                ]
        },
        "ooui-outline-control-move-down": "Mover item para baixo",
        "ooui-outline-control-move-up": "Mover item para cima",
-       "ooui-toolbar-more": "Mais"
+       "ooui-outline-control-remove": "Remover item",
+       "ooui-toolbar-more": "Mais",
+       "ooui-toolgroup-expand": "Mais",
+       "ooui-toolgroup-collapse": "Menos",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Cancelar",
+       "ooui-dialog-process-error": "Algo deu errado",
+       "ooui-dialog-process-dismiss": "Dispensar",
+       "ooui-dialog-process-retry": "Tentar novamente",
+       "ooui-dialog-process-continue": "Continuar",
+       "ooui-selectfile-not-supported": "O selecionamento de arquivos não é suportado",
+       "ooui-selectfile-placeholder": "Nenhum arquivo selecionado"
 }
index f5674b3..7435416 100644 (file)
@@ -16,7 +16,8 @@
                        "Sunpriat",
                        "Yury Katkov",
                        "Умар",
-                       "Камалист"
+                       "Камалист",
+                       "Meshkov.a"
                ]
        },
        "ooui-outline-control-move-down": "Переместить элемент вниз",
@@ -31,5 +32,6 @@
        "ooui-dialog-process-dismiss": "Закрыть",
        "ooui-dialog-process-retry": "Попробовать ещё раз",
        "ooui-dialog-process-continue": "Продолжить",
-       "ooui-selectfile-not-supported": "Выбор файла не поддерживается"
+       "ooui-selectfile-not-supported": "Выбор файла не поддерживается",
+       "ooui-selectfile-placeholder": "Не выбран файл"
 }
index 85a94cd..1e1b05d 100644 (file)
@@ -4,5 +4,19 @@
                        "Gazeb",
                        "HalanTul"
                ]
-       }
+       },
+       "ooui-outline-control-move-down": "Аллара түһэрэн биэр",
+       "ooui-outline-control-move-up": "Үөһэ таһааран биэр",
+       "ooui-outline-control-remove": "Сот",
+       "ooui-toolbar-more": "Эбии",
+       "ooui-toolgroup-expand": "Эбии",
+       "ooui-toolgroup-collapse": "Кыччат",
+       "ooui-dialog-message-accept": "Сөп",
+       "ooui-dialog-message-reject": "Салҕаама",
+       "ooui-dialog-process-error": "Туга эрэ сатаммата",
+       "ooui-dialog-process-dismiss": "Сап",
+       "ooui-dialog-process-retry": "Хатылаан көр",
+       "ooui-dialog-process-continue": "Салгыы",
+       "ooui-selectfile-not-supported": "Билэни талыы өйөммөт",
+       "ooui-selectfile-placeholder": "Биир да билэ талыллыбатах"
 }
index c8246da..fa65888 100644 (file)
@@ -2,11 +2,21 @@
        "@metadata": {
                "authors": [
                        "Mimarik",
-                       "Teslaton"
+                       "Teslaton",
+                       "Kusavica"
                ]
        },
        "ooui-outline-control-move-down": "Posunúť položku nadol",
        "ooui-outline-control-move-up": "Posunúť položku nahor",
        "ooui-outline-control-remove": "Odstrániť položku",
-       "ooui-toolbar-more": "Viac"
+       "ooui-toolbar-more": "Viac",
+       "ooui-toolgroup-expand": "Viac",
+       "ooui-toolgroup-collapse": "Menej",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Zrušiť",
+       "ooui-dialog-process-error": "Niečo sa pokazilo",
+       "ooui-dialog-process-dismiss": "Zrušiť",
+       "ooui-dialog-process-retry": "Skúsiť znova",
+       "ooui-dialog-process-continue": "Pokračovať",
+       "ooui-selectfile-placeholder": "Nie je vybraný žiadny súbor"
 }
index a40728a..e113671 100644 (file)
@@ -18,5 +18,7 @@
        "ooui-dialog-process-error": "Nekaj je šlo narobe",
        "ooui-dialog-process-dismiss": "Skrij",
        "ooui-dialog-process-retry": "Poskusi znova",
-       "ooui-dialog-process-continue": "Nadaljuj"
+       "ooui-dialog-process-continue": "Nadaljuj",
+       "ooui-selectfile-not-supported": "Izbira datoteke ni podprta",
+       "ooui-selectfile-placeholder": "Nobena datoteka ni izbrana"
 }
index c2422ba..9cd8ea3 100644 (file)
@@ -11,7 +11,8 @@
                        "Sendelbach",
                        "Skalman",
                        "WikiPhoenix",
-                       "Lokal Profil"
+                       "Lokal Profil",
+                       "Warrakkk"
                ]
        },
        "ooui-outline-control-move-down": "Flytta ned objekt",
@@ -26,5 +27,6 @@
        "ooui-dialog-process-dismiss": "Stäng",
        "ooui-dialog-process-retry": "Försök igen",
        "ooui-dialog-process-continue": "Fortsätt",
+       "ooui-selectfile-not-supported": "Filval stöds inte",
        "ooui-selectfile-placeholder": "Ingen fil är vald"
 }
index 122d4a2..6e7b249 100644 (file)
@@ -5,9 +5,22 @@
                        "Sank",
                        "Shanmugamp7",
                        "மதனாஹரன்",
-                       "ElangoRamanujam"
+                       "ElangoRamanujam",
+                       "Info-farmer"
                ]
        },
+       "ooui-outline-control-move-down": "உருப்படியை கீழிடு",
+       "ooui-outline-control-move-up": "உருப்படியை மேலிடு",
+       "ooui-outline-control-remove": "உருப்படியை நீக்கு",
+       "ooui-toolbar-more": "மேலும்",
        "ooui-toolgroup-expand": "மேலும்",
-       "ooui-dialog-process-continue": "தொடரவும்"
+       "ooui-toolgroup-collapse": "குறைவாக",
+       "ooui-dialog-message-accept": "சரி",
+       "ooui-dialog-message-reject": "கைவிடுக",
+       "ooui-dialog-process-error": "ஏதோ தவறாகியுள்ளது",
+       "ooui-dialog-process-dismiss": "அகற்று",
+       "ooui-dialog-process-retry": "மீண்டும் முயல்க",
+       "ooui-dialog-process-continue": "தொடரவும்",
+       "ooui-selectfile-not-supported": "கோப்புத்தேர்வு ஆதரவாக இல்லை",
+       "ooui-selectfile-placeholder": "எக்கோப்பும் தெரிவாகவில்லை"
 }
index a35d4eb..9e0b977 100644 (file)
@@ -31,5 +31,6 @@
        "ooui-dialog-process-dismiss": "Приховати",
        "ooui-dialog-process-retry": "Спробуйте ще раз",
        "ooui-dialog-process-continue": "Продовжити",
+       "ooui-selectfile-not-supported": "Вибір файлу не підтримується",
        "ooui-selectfile-placeholder": "Жодного файлу не вибрано"
 }
index d5c1e36..d62e3cb 100644 (file)
@@ -4,19 +4,22 @@
                        "Cheers!",
                        "Jdforrester",
                        "Minh Nguyen",
-                       "Max20091"
+                       "Max20091",
+                       "Anh88"
                ]
        },
        "ooui-outline-control-move-down": "Chuyển mục xuống",
        "ooui-outline-control-move-up": "Chuyển mục lên",
-       "ooui-outline-control-remove": "Xóa khoản",
+       "ooui-outline-control-remove": "Xóa mục",
        "ooui-toolbar-more": "Thêm",
        "ooui-toolgroup-expand": "Mở rộng",
        "ooui-toolgroup-collapse": "Rút gọn",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Hủy bỏ",
-       "ooui-dialog-process-error": "Đã bị trục trặc",
+       "ooui-dialog-process-error": "Có thứ gì đó bị lỗi",
        "ooui-dialog-process-dismiss": "Bỏ qua",
        "ooui-dialog-process-retry": "Thử lại",
-       "ooui-dialog-process-continue": "Tiếp tục"
+       "ooui-dialog-process-continue": "Tiếp tục",
+       "ooui-selectfile-not-supported": "Tệp tin được chọn không được hỗ trợ",
+       "ooui-selectfile-placeholder": "Không có Tệp tin nào được chọn"
 }
index 6c7ae5c..d9a8314 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.0
+ * OOjs UI v0.12.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2015 OOjs Team and other contributors.
+ * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-07-13T23:47:11Z
+ * Date: 2015-07-22T19:37:14Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
        z-index: 1;
        width: 100%;
 }
+.oo-ui-pendingElement-pending {
+       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
+}
 .oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous > .oo-ui-panelLayout-scrollable {
        overflow-y: hidden;
 }
        border-radius: 0.5em;
        box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
 }
+.oo-ui-panelLayout-padded.oo-ui-panelLayout-framed {
+       margin: 1em 0;
+}
 .oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
        display: block;
        position: relative;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
+.oo-ui-textInputWidget input[type="search"] {
+       -webkit-appearance: none;
+}
+.oo-ui-textInputWidget input[type="search"]::-ms-clear {
+       display: none;
+}
+.oo-ui-textInputWidget input[type="search"]::-ms-reveal {
+       display: none;
+}
+.oo-ui-textInputWidget input[type="search"]::-webkit-search-decoration,
+.oo-ui-textInputWidget input[type="search"]::-webkit-search-cancel-button,
+.oo-ui-textInputWidget input[type="search"]::-webkit-search-results-button,
+.oo-ui-textInputWidget input[type="search"]::-webkit-search-results-decoration {
+       display: none;
+}
 .oo-ui-textInputWidget > .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
 .oo-ui-textInputWidget > .oo-ui-labelElement-label {
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
        cursor: text;
 }
+.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-textInputWidget-type-search > .oo-ui-indicatorElement-indicator {
+       cursor: pointer;
+}
 .oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
        display: block;
 }
             -o-transition: border-color 200ms, box-shadow 200ms;
                transition: border-color 200ms, box-shadow 200ms;
 }
+.oo-ui-textInputWidget input.oo-ui-pendingElement-pending,
+.oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
+       background-color: transparent;
+}
 .oo-ui-textInputWidget-decorated input,
 .oo-ui-textInputWidget-decorated textarea {
        padding-left: 2em;
        color: #dddddd;
        text-shadow: 0 1px 1px #ffffff;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
        padding-left: 2em;
 .oo-ui-processDialog-content .oo-ui-window-head {
        height: 3.4em;
 }
-.oo-ui-processDialog-content .oo-ui-window-head.oo-ui-pendingElement-pending {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
 .oo-ui-processDialog-content .oo-ui-window-body {
        top: 3.4em;
        box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
index 91c43a6..f5d2ea7 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.0
+ * OOjs UI v0.12.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2015 OOjs Team and other contributors.
+ * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-07-13T23:47:04Z
+ * Date: 2015-07-22T19:37:07Z
  */
 /**
  * @class
index 08f7f68..d539219 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.0
+ * OOjs UI v0.12.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2015 OOjs Team and other contributors.
+ * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-07-13T23:47:11Z
+ * Date: 2015-07-22T19:37:14Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
        z-index: 1;
        width: 100%;
 }
+.oo-ui-pendingElement-pending {
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
 .oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous > .oo-ui-panelLayout-scrollable {
        overflow-y: hidden;
 }
        border-radius: 0.2em;
        box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
 }
+.oo-ui-panelLayout-padded.oo-ui-panelLayout-framed {
+       margin: 1em 0;
+}
 .oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
        display: block;
        position: relative;
 }
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
        padding-left: 0.5em;
-       color: #000000;
+       color: #555555;
 }
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel,
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
 .oo-ui-progressBarWidget.oo-ui-widget-disabled {
        opacity: 0.6;
 }
-.oo-ui-actionWidget.oo-ui-pendingElement-pending {
-       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
-}
 .oo-ui-popupWidget {
        position: absolute;
        /* @noflip */
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
+.oo-ui-textInputWidget input[type="search"] {
+       -webkit-appearance: none;
+}
+.oo-ui-textInputWidget input[type="search"]::-ms-clear {
+       display: none;
+}
+.oo-ui-textInputWidget input[type="search"]::-ms-reveal {
+       display: none;
+}
+.oo-ui-textInputWidget input[type="search"]::-webkit-search-decoration,
+.oo-ui-textInputWidget input[type="search"]::-webkit-search-cancel-button,
+.oo-ui-textInputWidget input[type="search"]::-webkit-search-results-button,
+.oo-ui-textInputWidget input[type="search"]::-webkit-search-results-decoration {
+       display: none;
+}
 .oo-ui-textInputWidget > .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
 .oo-ui-textInputWidget > .oo-ui-labelElement-label {
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
        cursor: text;
 }
+.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-textInputWidget-type-search > .oo-ui-indicatorElement-indicator {
+       cursor: pointer;
+}
 .oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
        display: block;
 }
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
+.oo-ui-textInputWidget input.oo-ui-pendingElement-pending,
+.oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
+       background-color: transparent;
+}
 .oo-ui-textInputWidget-decorated input,
 .oo-ui-textInputWidget-decorated textarea {
        padding-left: 2em;
        color: #dddddd;
        text-shadow: 0 1px 1px #ffffff;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
-       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
-}
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
        padding-left: 2.75em;
 .oo-ui-processDialog-content .oo-ui-window-head {
        height: 3.4em;
 }
-.oo-ui-processDialog-content .oo-ui-window-head.oo-ui-pendingElement-pending {
-       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
-}
 .oo-ui-processDialog-content .oo-ui-window-body {
        top: 3.4em;
        outline: 1px solid rgba(0, 0, 0, 0.2);
index a09b898..b73f751 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.0
+ * OOjs UI v0.12.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2015 OOjs Team and other contributors.
+ * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-07-13T23:47:04Z
+ * Date: 2015-07-22T19:37:07Z
  */
 /**
  * @class
index 98ec673..96c3204 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.0
+ * OOjs UI v0.12.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2015 OOjs Team and other contributors.
+ * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-07-13T23:47:04Z
+ * Date: 2015-07-22T19:37:07Z
  */
 ( function ( OO ) {
 
@@ -2176,7 +2176,7 @@ OO.ui.Window.prototype.getBodyHeight = function () {
  * @return {string} Directionality: `'ltr'` or `'rtl'`
  */
 OO.ui.Window.prototype.getDir = function () {
-       return this.dir;
+       return OO.ui.Element.static.getDir( this.$content ) || 'ltr';
 };
 
 /**
@@ -2371,7 +2371,6 @@ OO.ui.Window.prototype.initialize = function () {
        this.$head = $( '<div>' );
        this.$body = $( '<div>' );
        this.$foot = $( '<div>' );
-       this.dir = OO.ui.Element.static.getDir( this.$content ) || 'ltr';
        this.$document = $( this.getElementDocument() );
 
        // Events
@@ -7832,7 +7831,7 @@ OO.ui.MessageDialog = function OoUiMessageDialog( config ) {
        this.$element.addClass( 'oo-ui-messageDialog' );
 };
 
-/* Inheritance */
+/* Setup */
 
 OO.inheritClass( OO.ui.MessageDialog, OO.ui.Dialog );
 
@@ -12603,8 +12602,8 @@ OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
        // Mixin constructors
        OO.ui.mixin.IconElement.call( this, config );
        OO.ui.mixin.IndicatorElement.call( this, config );
-       OO.ui.mixin.PendingElement.call( this, config );
-       OO.ui.mixin.LabelElement.call( this, $.extend( config, { autoFitLabel: true } ) );
+       OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$handle } ) );
+       OO.ui.mixin.LabelElement.call( this, $.extend( {}, config, { autoFitLabel: true } ) );
        OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$handle } ) );
 
        // Properties
@@ -12667,7 +12666,7 @@ OO.mixinClass( OO.ui.SelectFileWidget, OO.ui.mixin.PendingElement );
 OO.mixinClass( OO.ui.SelectFileWidget, OO.ui.mixin.LabelElement );
 OO.mixinClass( OO.ui.SelectFileWidget, OO.ui.mixin.TabIndexedElement );
 
-/* Static properties */
+/* Static Properties */
 
 /**
  * Check if this widget is supported
@@ -13913,6 +13912,11 @@ OO.ui.RadioSelectInputWidget.prototype.setOptions = function ( options ) {
  * @param {Object} [config] Configuration options
  * @cfg {string} [type='text'] The value of the HTML `type` attribute: 'text', 'password', 'search',
  *  'email' or 'url'. Ignored if `multiline` is true.
+ *
+ *  Some values of `type` result in additional behaviors:
+ *
+ *  - `search`: implies `icon: 'search'` and `indicator: 'clear'`; when clicked, the indicator
+ *    empties the text field
  * @cfg {string} [placeholder] Placeholder text
  * @cfg {boolean} [autofocus=false] Use an HTML `autofocus` attribute to
  *  instruct the browser to focus this widget.
@@ -13927,7 +13931,7 @@ OO.ui.RadioSelectInputWidget.prototype.setOptions = function ( options ) {
  *  Defaults to the maximum of `10` and `2 * rows`, or `10` if `rows` isn't provided.
  * @cfg {string} [labelPosition='after'] The position of the inline label relative to that of
  *  the value or placeholder text: `'before'` or `'after'`
- * @cfg {boolean} [required=false] Mark the field as required
+ * @cfg {boolean} [required=false] Mark the field as required. Implies `indicator: 'required'`.
  * @cfg {boolean} [autocomplete=true] Should the browser support autocomplete for this field
  * @cfg {RegExp|Function|string} [validate] Validation pattern: when string, a symbolic name of a
  *  pattern defined by the class: 'non-empty' (the value cannot be an empty string) or 'integer'
@@ -13941,6 +13945,17 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
                type: 'text',
                labelPosition: 'after'
        }, config );
+       if ( config.type === 'search' ) {
+               if ( config.icon === undefined ) {
+                       config.icon = 'search';
+               }
+               // indicator: 'clear' is set dynamically later, depending on value
+       }
+       if ( config.required ) {
+               if ( config.indicator === undefined ) {
+                       config.indicator = 'required';
+               }
+       }
 
        // Parent constructor
        OO.ui.TextInputWidget.parent.call( this, config );
@@ -13948,10 +13963,11 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        // Mixin constructors
        OO.ui.mixin.IconElement.call( this, config );
        OO.ui.mixin.IndicatorElement.call( this, config );
-       OO.ui.mixin.PendingElement.call( this, config );
+       OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$input } ) );
        OO.ui.mixin.LabelElement.call( this, config );
 
        // Properties
+       this.type = this.getSaneType( config );
        this.readOnly = false;
        this.multiline = !!config.multiline;
        this.autosize = !!config.autosize;
@@ -13982,13 +13998,17 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        this.$icon.on( 'mousedown', this.onIconMouseDown.bind( this ) );
        this.$indicator.on( 'mousedown', this.onIndicatorMouseDown.bind( this ) );
        this.on( 'labelChange', this.updatePosition.bind( this ) );
-       this.connect( this, { change: 'onChange' } );
+       this.connect( this, {
+               change: 'onChange',
+               disable: 'onDisable'
+       } );
 
        // Initialization
        this.$element
-               .addClass( 'oo-ui-textInputWidget' )
+               .addClass( 'oo-ui-textInputWidget oo-ui-textInputWidget-type-' + this.type )
                .append( this.$icon, this.$indicator );
        this.setReadOnly( !!config.readOnly );
+       this.updateSearchIndicator();
        if ( config.placeholder ) {
                this.$input.attr( 'placeholder', config.placeholder );
        }
@@ -14021,7 +14041,7 @@ OO.mixinClass( OO.ui.TextInputWidget, OO.ui.mixin.IndicatorElement );
 OO.mixinClass( OO.ui.TextInputWidget, OO.ui.mixin.PendingElement );
 OO.mixinClass( OO.ui.TextInputWidget, OO.ui.mixin.LabelElement );
 
-/* Static properties */
+/* Static Properties */
 
 OO.ui.TextInputWidget.static.validationPatterns = {
        'non-empty': /.+/,
@@ -14063,6 +14083,10 @@ OO.ui.TextInputWidget.prototype.onIconMouseDown = function ( e ) {
  */
 OO.ui.TextInputWidget.prototype.onIndicatorMouseDown = function ( e ) {
        if ( e.which === 1 ) {
+               if ( this.type === 'search' ) {
+                       // Clear the text field
+                       this.setValue( '' );
+               }
                this.$input[ 0 ].focus();
                return false;
        }
@@ -14111,10 +14135,21 @@ OO.ui.TextInputWidget.prototype.onElementAttach = function () {
  * @private
  */
 OO.ui.TextInputWidget.prototype.onChange = function () {
+       this.updateSearchIndicator();
        this.setValidityFlag();
        this.adjustSize();
 };
 
+/**
+ * Handle disable events.
+ *
+ * @param {boolean} disabled Element is disabled
+ * @private
+ */
+OO.ui.TextInputWidget.prototype.onDisable = function () {
+       this.updateSearchIndicator();
+};
+
 /**
  * Check if the input is {@link #readOnly read-only}.
  *
@@ -14133,6 +14168,7 @@ OO.ui.TextInputWidget.prototype.isReadOnly = function () {
 OO.ui.TextInputWidget.prototype.setReadOnly = function ( state ) {
        this.readOnly = !!state;
        this.$input.prop( 'readOnly', this.readOnly );
+       this.updateSearchIndicator();
        return this;
 };
 
@@ -14263,10 +14299,23 @@ OO.ui.TextInputWidget.prototype.adjustSize = function () {
  * @protected
  */
 OO.ui.TextInputWidget.prototype.getInputElement = function ( config ) {
+       return config.multiline ?
+               $( '<textarea>' ) :
+               $( '<input type="' + this.getSaneType( config ) + '" />' );
+};
+
+/**
+ * Get sanitized value for 'type' for given config.
+ *
+ * @param {Object} config Configuration options
+ * @return {string|null}
+ * @private
+ */
+OO.ui.TextInputWidget.prototype.getSaneType = function ( config ) {
        var type = [ 'text', 'password', 'search', 'email', 'url' ].indexOf( config.type ) !== -1 ?
                config.type :
                'text';
-       return config.multiline ? $( '<textarea>' ) : $( '<input type="' + type + '" />' );
+       return config.multiline ? 'multiline' : type;
 };
 
 /**
@@ -14385,7 +14434,6 @@ OO.ui.TextInputWidget.prototype.setPosition =
  * This method is called by #setLabelPosition, and can also be called on its own if
  * something causes the label to be mispositioned.
  *
- *
  * @chainable
  */
 OO.ui.TextInputWidget.prototype.updatePosition = function () {
@@ -14402,6 +14450,20 @@ OO.ui.TextInputWidget.prototype.updatePosition = function () {
        return this;
 };
 
+/**
+ * Update the 'clear' indicator displayed on type: 'search' text fields, hiding it when the field is
+ * already empty or when it's not editable.
+ */
+OO.ui.TextInputWidget.prototype.updateSearchIndicator = function () {
+       if ( this.type === 'search' ) {
+               if ( this.getValue() === '' || this.isDisabled() || this.isReadOnly() ) {
+                       this.setIndicator( null );
+               } else {
+                       this.setIndicator( 'clear' );
+               }
+       }
+};
+
 /**
  * Position the label by setting the correct padding on the input.
  *
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/clear.png b/resources/lib/oojs-ui/themes/apex/images/indicators/clear.png
new file mode 100644 (file)
index 0000000..5db444c
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/indicators/clear.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/clear.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/clear.svg
new file mode 100644 (file)
index 0000000..b18405d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+    <g id="clear">
+        <path id="circle-with-cross" d="M6 0C2.7 0 0 2.7 0 6s2.7 6 6 6 6-2.7 6-6-2.7-6-6-6zM3.5 2.5L6 5l2.5-2.5 1 1L7 6l2.5 2.5-1 1L6 7 3.5 9.5l-1-1L5 6 2.5 3.5z"/>
+    </g>
+</svg>
index 0a9d1d2..9a9afa8 100644 (file)
@@ -3,6 +3,7 @@
        "intro": "@import '../../../../src/styles/common';",
        "images": {
                "alert": { "file": "images/indicators/alert.svg" },
+               "clear": { "file": "images/indicators/clear.svg" },
                "up": { "file": "images/indicators/arrow-up.svg" },
                "down": { "file": "images/indicators/arrow-down.svg" },
                "next": { "file": {
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-invert.png
new file mode 100644 (file)
index 0000000..d68353b
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-invert.svg
new file mode 100644 (file)
index 0000000..ba5fd1d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
+    <g id="clear">
+        <path id="circle-with-cross" d="M6 0C2.7 0 0 2.7 0 6s2.7 6 6 6 6-2.7 6-6-2.7-6-6-6zM3.5 2.5L6 5l2.5-2.5 1 1L7 6l2.5 2.5-1 1L6 7 3.5 9.5l-1-1L5 6 2.5 3.5z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear.png
new file mode 100644 (file)
index 0000000..5db444c
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear.svg
new file mode 100644 (file)
index 0000000..b18405d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+    <g id="clear">
+        <path id="circle-with-cross" d="M6 0C2.7 0 0 2.7 0 6s2.7 6 6 6 6-2.7 6-6-2.7-6-6-6zM3.5 2.5L6 5l2.5-2.5 1 1L7 6l2.5 2.5-1 1L6 7 3.5 9.5l-1-1L5 6 2.5 3.5z"/>
+    </g>
+</svg>
index d83e57e..3d66337 100644 (file)
@@ -10,6 +10,7 @@
        },
        "images": {
                "alert": { "file": "images/indicators/alert.svg" },
+               "clear": { "file": "images/indicators/clear.svg" },
                "up": { "file": "images/indicators/arrow-up.svg" },
                "down": { "file": "images/indicators/arrow-down.svg" },
                "next": { "file": {
index d87183e..6e7851a 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs v1.1.7 optimised for jQuery
+ * OOjs v1.1.8 optimised for jQuery
  * https://www.mediawiki.org/wiki/OOjs
  *
  * Copyright 2011-2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-04-29T01:13:49Z
+ * Date: 2015-07-23T19:16:00Z
  */
 ( function ( global ) {
 
@@ -698,12 +698,9 @@ oo.isPlainObject = $.isPlainObject;
        /**
         * Emit an event.
         *
-        * TODO: Should this be chainable? What is the usefulness of the boolean
-        * return value here?
-        *
         * @param {string} event Type of event
         * @param {Mixed} args First in a list of variadic arguments passed to event handler (optional)
-        * @return {boolean} If event was handled by at least one listener
+        * @return {boolean} Whether the event was handled by at least one listener
         */
        oo.EventEmitter.prototype.emit = function ( event ) {
                var args = [],
index f7c4217..19fdb26 100644 (file)
                }
 
                if ( e ) {
-                       if ( e.type === 'click' && options.linksPassthru && $.nodeName( e.target, 'a' ) ) {
-                               // Don't fire if a link was clicked, if requested  (for premade togglers by default)
+                       if (
+                               e.type === 'click' &&
+                               options.linksPassthru &&
+                               $.nodeName( e.target, 'a' ) &&
+                               $( e.target ).attr( 'href' ) !== '#'
+                       ) {
+                               // Don't fire if a link with href !== '#' was clicked, if requested  (for premade togglers by default)
                                return;
                        } else if ( e.type === 'keypress' && e.which !== 13 && e.which !== 32 ) {
                                // Only handle keypresses on the "Enter" or "Space" keys
index a0861df..e11a2c2 100644 (file)
@@ -951,6 +951,7 @@ ol:lang(fa) li,
 ol:lang(glk) li,
 ol:lang(kk-arab) li,
 ol:lang(lrc) li,
+ol:lang(luz) li,
 ol:lang(mzn) li {
        list-style-type: -moz-persian;
        list-style-type: persian;
index 56b6811..1b31956 100644 (file)
 
        &:hover {
                // The inner bottom bevel should match the active background color.
-               box-shadow: 0 1px rgba(0, 0, 0, 10%), inset 0 -3px rgba(0, 0, 0, 20%);
-               border-bottom-color: @highlightColor;
+               background-color: @highlightColor;
        }
 
        &:focus {
-               border-color: rgba(0,0,0,0.2);
-               box-shadow: inset 0 0 0 1px rgba(0,0,0,0.2);
+               border-color: @colorWhite;
+               box-shadow: 0 0 0 1px @highlightColor;
 
                outline: none;
                // remove outline in Firefox
                color: @colorButtonText;
        }
 
+       &:focus {
+               background-color: @highlightColor;
+       }
+
        &:disabled {
                color: @colorDisabledText;
 
 
        &:hover,
        &:focus {
+               background: transparent;
                color: @textColor;
        }
 
index 0558c32..05e6f27 100644 (file)
@@ -25,7 +25,7 @@
         */
        mw.widgets.NamespaceInputWidget = function MwWidgetsNamespaceInputWidget( config ) {
                // Parent constructor
-               OO.ui.Widget.call( this, config );
+               mw.widgets.NamespaceInputWidget.parent.call( this, config );
 
                // Properties
                this.namespace = config.namespace;
                this.allValue = config.allValue;
 
                // Events
-               config.namespace.connect( this, { change: 'updateCheckboxesState' } );
+               this.namespace.connect( this, { change: 'updateCheckboxesState' } );
 
                // Initialization
                this.$element
                        .addClass( 'mw-widget-namespaceInputWidget' )
                        .append(
-                               config.namespace.$element,
-                               config.invert ? config.invert.$element : '',
-                               config.associated ? config.associated.$element : ''
+                               this.namespace.$element,
+                               this.invert ? this.invert.$element : '',
+                               this.associated ? this.associated.$element : ''
                        );
                this.updateCheckboxesState();
        };
 
-       /* Inheritance */
+       /* Setup */
 
        OO.inheritClass( mw.widgets.NamespaceInputWidget, OO.ui.Widget );
 
index e715361..66b009f 100644 (file)
@@ -5,6 +5,7 @@
  * @license The MIT License (MIT); see LICENSE.txt
  */
 ( function ( $, mw ) {
+
        /**
         * Creates an mw.widgets.TitleInputWidget object.
         *
                config = config || {};
 
                // Parent constructor
-               OO.ui.TextInputWidget.call( this, $.extend( {}, config, { autocomplete: false } ) );
+               mw.widgets.TitleInputWidget.parent.call( this, $.extend( {}, config, { autocomplete: false } ) );
 
                // Mixin constructors
                OO.ui.mixin.LookupElement.call( this, config );
 
                // Properties
                this.limit = config.limit || 10;
-               this.namespace = config.namespace || null;
+               this.namespace = config.namespace !== undefined ? config.namespace : null;
                this.relative = config.relative !== undefined ? config.relative : true;
                this.showRedirectTargets = config.showRedirectTargets !== false;
                this.showRedlink = !!config.showRedlink;
                } );
        };
 
-       /* Inheritance */
+       /* Setup */
 
        OO.inheritClass( mw.widgets.TitleInputWidget, OO.ui.TextInputWidget );
-
        OO.mixinClass( mw.widgets.TitleInputWidget, OO.ui.mixin.LookupElement );
 
        /* Methods */
@@ -95,7 +95,7 @@
                this.setLookupsDisabled( true );
 
                // Parent method
-               retval = OO.ui.TextInputWidget.prototype.focus.apply( this, arguments );
+               retval = mw.widgets.TitleInputWidget.parent.prototype.focus.apply( this, arguments );
 
                this.setLookupsDisabled( false );
 
         * Get lookup cache item from server response data.
         *
         * @method
-        * @param {Mixed} data Response from server
+        * @param {Mixed} response Response from server
         */
-       mw.widgets.TitleInputWidget.prototype.getLookupCacheDataFromResponse = function ( data ) {
-               return data.query || {};
+       mw.widgets.TitleInputWidget.prototype.getLookupCacheDataFromResponse = function ( response ) {
+               return response.query || {};
        };
 
        /**
                                imageUrl: OO.getProp( suggestionPage, 'thumbnail', 'source' ),
                                description: OO.getProp( suggestionPage, 'terms', 'description' )
                        };
-                       titles.push( suggestionPage.title );
+
+                       // Throw away pages from wrong namespaces. This can happen when 'showRedirectTargets' is true
+                       // and we encounter a cross-namespace redirect.
+                       if ( this.namespace === null || this.namespace === suggestionPage.ns ) {
+                               titles.push( suggestionPage.title );
+                       }
 
                        redirects = redirectsTo[suggestionPage.title] || [];
                        for ( i = 0, len = redirects.length; i < len; i++ ) {
index 6623aa7..ec0c935 100644 (file)
@@ -45,9 +45,9 @@
                }, config );
 
                // Parent constructor
-               OO.ui.MenuOptionWidget.call( this, config );
+               mw.widgets.TitleOptionWidget.parent.call( this, config );
 
-               // Intialization
+               // Initialization
                this.$label.wrap( '<a>' );
                this.$link = this.$label.parent();
                this.$link.attr( 'href', config.href );
@@ -75,7 +75,7 @@
                }
        };
 
-       /* Inheritance */
+       /* Setup */
 
        OO.inheritClass( mw.widgets.TitleOptionWidget, OO.ui.MenuOptionWidget );
 
diff --git a/resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js b/resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js
new file mode 100644 (file)
index 0000000..d540877
--- /dev/null
@@ -0,0 +1,119 @@
+/*!
+ * MediaWiki Widgets - UserInputWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * Creates a mw.widgets.UserInputWidget object.
+        *
+        * @class
+        * @extends OO.ui.TextInputWidget
+        * @mixins OO.ui.mixin.LookupElement
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {number} [limit=10] Number of results to show
+        */
+       mw.widgets.UserInputWidget = function MwWidgetsUserInputWidget( config ) {
+               // Config initialization
+               config = config || {};
+
+               // Parent constructor
+               mw.widgets.UserInputWidget.parent.call( this, $.extend( {}, config, { autocomplete: false } ) );
+
+               // Mixin constructors
+               OO.ui.mixin.LookupElement.call( this, config );
+
+               // Properties
+               this.limit = config.limit || 10;
+
+               // Initialization
+               this.$element.addClass( 'mw-widget-userInputWidget' );
+               this.lookupMenu.$element.addClass( 'mw-widget-userInputWidget-menu' );
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.widgets.UserInputWidget, OO.ui.TextInputWidget );
+       OO.mixinClass( mw.widgets.UserInputWidget, OO.ui.mixin.LookupElement );
+
+       /* Methods */
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.UserInputWidget.prototype.onLookupMenuItemChoose = function ( item ) {
+               this.closeLookupMenu();
+               this.setLookupsDisabled( true );
+               this.setValue( item.getData() );
+               this.setLookupsDisabled( false );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.UserInputWidget.prototype.focus = function () {
+               var retval;
+
+               // Prevent programmatic focus from opening the menu
+               this.setLookupsDisabled( true );
+
+               // Parent method
+               retval = mw.widgets.UserInputWidget.parent.prototype.focus.apply( this, arguments );
+
+               this.setLookupsDisabled( false );
+
+               return retval;
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.UserInputWidget.prototype.getLookupRequest = function () {
+               var inputValue = this.value;
+
+               return new mw.Api().get( {
+                       action: 'query',
+                       list: 'allusers',
+                       // Prefix of list=allusers is case sensitive. Normalise first
+                       // character to uppercase so that "fo" may yield "Foo".
+                       auprefix: inputValue[0].toUpperCase() + inputValue.slice( 1 ),
+                       aulimit: this.limit
+               } );
+       };
+
+       /**
+        * Get lookup cache item from server response data.
+        *
+        * @method
+        * @param {Mixed} response Response from server
+        */
+       mw.widgets.UserInputWidget.prototype.getLookupCacheDataFromResponse = function ( response ) {
+               return response.query.allusers || {};
+       };
+
+       /**
+        * Get list of menu items from a server response.
+        *
+        * @param {Object} data Query result
+        * @returns {OO.ui.MenuOptionWidget[]} Menu items
+        */
+       mw.widgets.UserInputWidget.prototype.getLookupMenuOptionsFromData = function ( data ) {
+               var len, i, user,
+                       items = [];
+
+               for ( i = 0, len = data.length; i < len; i++ ) {
+                       user = data[i] || {};
+                       items.push( new OO.ui.MenuOptionWidget( {
+                               label: user.name,
+                               data: user.name
+                       } ) );
+               }
+
+               return items;
+       };
+
+}( jQuery, mediaWiki ) );
index 2c88e93..c0b1642 100644 (file)
                        function addEmbeddedCSS( cssText, callback ) {
                                var $style, styleEl;
 
+                               function fireCallbacks() {
+                                       var oldCallbacks = cssCallbacks;
+                                       // Reset cssCallbacks variable so it's not polluted by any calls to
+                                       // addEmbeddedCSS() from one of the callbacks (T105973)
+                                       cssCallbacks = $.Callbacks();
+                                       oldCallbacks.fire().empty();
+                               }
+
                                if ( callback ) {
                                        cssCallbacks.add( callback );
                                }
                                                } else {
                                                        styleEl.appendChild( document.createTextNode( cssText ) );
                                                }
-                                               cssCallbacks.fire().empty();
+                                               fireCallbacks();
                                                return;
                                        }
                                }
 
                                $( newStyleTag( cssText, getMarker() ) ).data( 'ResourceLoaderDynamicStyleTag', true );
 
-                               cssCallbacks.fire().empty();
+                               fireCallbacks();
                        }
 
                        /**
index 80cc7d9..5ee295b 100644 (file)
@@ -6,6 +6,14 @@
 
 var mediaWikiLoadStart = ( new Date() ).getTime();
 
+if ( !window.performance ) {
+       window.performance = {};
+}
+if ( !performance.mark ) {
+       performance.mark = function () {};
+}
+performance.mark( 'mediaWikiStartUp' );
+
 /**
  * Returns false for Grade C supported browsers.
  *
index 0ce056f..43d8ce8 100644 (file)
@@ -204,9 +204,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        while ( $this->db->trxLevel() > 0 ) {
                                $this->db->rollback();
                        }
-
-                       // don't ignore DB errors
-                       $this->db->ignoreErrors( false );
                }
 
                DeferredUpdates::clearPendingUpdates();
@@ -233,9 +230,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        while ( $this->db->trxLevel() > 0 ) {
                                $this->db->rollback();
                        }
-
-                       // don't ignore DB errors
-                       $this->db->ignoreErrors( false );
                }
 
                // Restore mw globals
index cf08dbe..9c953a6 100644 (file)
@@ -21,6 +21,17 @@ class MessageTest extends MediaWikiLangTestCase {
                $this->assertEquals( $key, $message->getKey() );
                $this->assertEquals( $params, $message->getParams() );
                $this->assertEquals( $expectedLang, $message->getLanguage() );
+
+               $messageSpecifier = $this->getMockForAbstractClass( 'MessageSpecifier' );
+               $messageSpecifier->expects( $this->any() )
+                       ->method( 'getKey' )->will( $this->returnValue( $key ) );
+               $messageSpecifier->expects( $this->any() )
+                       ->method( 'getParams' )->will( $this->returnValue( $params ) );
+               $message = new Message( $messageSpecifier, array(), $language );
+
+               $this->assertEquals( $key, $message->getKey() );
+               $this->assertEquals( $params, $message->getParams() );
+               $this->assertEquals( $expectedLang, $message->getLanguage() );
        }
 
        public static function provideConstructor() {
index 9c59e65..5302b36 100644 (file)
@@ -124,4 +124,26 @@ class MessageCacheTest extends MediaWikiLangTestCase {
                );
        }
 
+       /**
+        * @dataProvider provideNormalizeKey
+        */
+       public function testNormalizeKey( $key, $expected ) {
+               $actual = MessageCache::normalizeKey( $key );
+               $this->assertEquals( $expected, $actual );
+       }
+
+       public function provideNormalizeKey() {
+               return array(
+                       array( 'Foo', 'foo' ),
+                       array( 'foo', 'foo' ),
+                       array( 'fOo', 'fOo' ),
+                       array( 'FOO', 'fOO' ),
+                       array( 'Foo bar', 'foo_bar' ),
+                       array( 'Ćab', 'ćab' ),
+                       array( 'Ćab_e 3', 'ćab_e_3' ),
+                       array( 'ĆAB', 'ćAB' ),
+                       array( 'ćab', 'ćab' ),
+                       array( 'ćaB', 'ćaB' ),
+               );
+       }
 }
index 40484d3..44427ba 100644 (file)
@@ -4,6 +4,8 @@
  * @group ContentHandler
  * @group Database
  *        ^--- needed, because we do need the database to test link updates
+ *
+ * @FIXME this should not extend JavaScriptContentTest.
  */
 class CssContentTest extends JavaScriptContentTest {
 
@@ -68,7 +70,28 @@ class CssContentTest extends JavaScriptContentTest {
                $this->assertEquals( CONTENT_MODEL_CSS, $content->getContentHandler()->getModelID() );
        }
 
-       public static function dataEquals() {
+       /**
+        * Redirects aren't supported
+        */
+       public static function provideUpdateRedirect() {
+               return array(
+                       array(
+                               '#REDIRECT [[Someplace]]',
+                               '#REDIRECT [[Someplace]]',
+                       ),
+               );
+       }
+
+       /**
+        * Override this since CssContent does not support redirects yet
+        */
+       public static function provideGetRedirectTarget() {
+               return array(
+                       array( null, '' ),
+               );
+       }
+
+               public static function dataEquals() {
                return array(
                        array( new CssContent( 'hallo' ), null, false ),
                        array( new CssContent( 'hallo' ), new CssContent( 'hallo' ), true ),
diff --git a/tests/phpunit/includes/content/JavaScriptContentHandlerTest.php b/tests/phpunit/includes/content/JavaScriptContentHandlerTest.php
new file mode 100644 (file)
index 0000000..0f41020
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+
+class JavaScriptContentHandlerTest extends MediaWikiTestCase {
+
+       /**
+        * @dataProvider provideMakeRedirectContent
+        * @covers JavaScriptContentHandler::makeRedirectContent
+        */
+       public function testMakeRedirectContent( $title, $expected ) {
+               $this->setMwGlobals( array(
+                       'wgServer' => '//example.org',
+                       'wgScript' => '/w/index.php',
+               ) );
+               $ch = new JavaScriptContentHandler();
+               $content = $ch->makeRedirectContent( Title::newFromText( $title ) );
+               $this->assertInstanceOf( 'JavaScriptContent', $content );
+               $this->assertEquals( $expected, $content->serialize( CONTENT_FORMAT_JAVASCRIPT ) );
+       }
+
+       /**
+        * Keep this in sync with JavaScriptContentTest::provideGetRedirectTarget()
+        */
+       public static function provideMakeRedirectContent() {
+               return array(
+                       array( 'MediaWiki:MonoBook.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=MediaWiki:MonoBook.js\u0026action=raw\u0026ctype=text/javascript");' ),
+                       array( 'User:FooBar/common.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=User:FooBar/common.js\u0026action=raw\u0026ctype=text/javascript");' ),
+                       array( 'Gadget:FooBaz.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=Gadget:FooBaz.js\u0026action=raw\u0026ctype=text/javascript");' ),
+               );
+       }
+}
index 7193ec9..0ee2712 100644 (file)
@@ -251,16 +251,31 @@ class JavaScriptContentTest extends TextContentTest {
 
        /**
         * @covers JavaScriptContent::updateRedirect
+        * @dataProvider provideUpdateRedirect
         */
-       public function testUpdateRedirect() {
+       public function testUpdateRedirect( $oldText, $expectedText) {
+               $this->setMwGlobals( array(
+                       'wgServer' => '//example.org',
+                       'wgScriptPath' => '/w/index.php',
+               ) );
                $target = Title::newFromText( "testUpdateRedirect_target" );
 
-               $content = $this->newContent( "#REDIRECT [[Someplace]]" );
+               $content = new JavaScriptContent( $oldText );
                $newContent = $content->updateRedirect( $target );
 
-               $this->assertTrue(
-                       $content->equals( $newContent ),
-                       "content should be unchanged since it's not wikitext"
+               $this->assertEquals( $expectedText, $newContent->getNativeData() );
+       }
+
+       public static function provideUpdateRedirect() {
+               return array(
+                       array(
+                               '#REDIRECT [[Someplace]]',
+                               '#REDIRECT [[Someplace]]',
+                       ),
+                       array(
+                               '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=MediaWiki:MonoBook.js\u0026action=raw\u0026ctype=text/javascript");',
+                               '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=TestUpdateRedirect_target\u0026action=raw\u0026ctype=text/javascript");'
+                       )
                );
        }
 
@@ -290,4 +305,32 @@ class JavaScriptContentTest extends TextContentTest {
                        array( new JavaScriptContent( "hallo" ), new JavaScriptContent( "HALLO" ), false ),
                );
        }
+
+       /**
+        * @dataProvider provideGetRedirectTarget
+        */
+       public function testGetRedirectTarget( $title, $text ) {
+               $this->setMwGlobals( array(
+                       'wgServer' => '//example.org',
+                       'wgScriptPath' => '/w/index.php',
+               ) );
+               $content = new JavaScriptContent( $text );
+               $target = $content->getRedirectTarget();
+               $this->assertEquals( $title, $target ? $target->getPrefixedText() : null );
+       }
+
+       /**
+        * Keep this in sync with JavaScriptContentHandlerTest::provideMakeRedirectContent()
+        */
+       public static function provideGetRedirectTarget() {
+               return array(
+                       array( 'MediaWiki:MonoBook.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=MediaWiki:MonoBook.js\u0026action=raw\u0026ctype=text/javascript");' ),
+                       array( 'User:FooBar/common.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=User:FooBar/common.js\u0026action=raw\u0026ctype=text/javascript");' ),
+                       array( 'Gadget:FooBaz.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=Gadget:FooBaz.js\u0026action=raw\u0026ctype=text/javascript");' ),
+                       // No #REDIRECT comment
+                       array( null, 'mw.loader.load("//example.org/w/index.php?title=MediaWiki:NoRedirect.js\u0026action=raw\u0026ctype=text/javascript");' ),
+                       // Different domain
+                       array( null, '/* #REDIRECT */mw.loader.load("//example.com/w/index.php?title=MediaWiki:OtherWiki.js\u0026action=raw\u0026ctype=text/javascript");' ),
+               );
+       }
 }
index 338d931..764560d 100644 (file)
@@ -68,25 +68,6 @@ class ORMTableTest extends MediaWikiTestCase {
                $this->assertInstanceOf( $class, $class::singleton() );
                $this->assertTrue( $class::singleton() === $class::singleton() );
        }
-
-       /**
-        * @since 1.21
-        */
-       public function testIgnoreErrorsOverride() {
-               $table = $this->getTable();
-
-               $db = $table->getReadDbConnection();
-               $db->ignoreErrors( true );
-
-               try {
-                       $table->rawSelect( "this is invalid" );
-                       $this->fail( "An invalid query should trigger a DBQueryError even if ignoreErrors is enabled." );
-               } catch ( DBQueryError $ex ) {
-                       $this->assertTrue( true, "just making phpunit happy" );
-               }
-
-               $db->ignoreErrors( false );
-       }
 }
 
 /**
diff --git a/tests/phpunit/includes/filerepo/FileBackendDBRepoWrapperTest.php b/tests/phpunit/includes/filerepo/FileBackendDBRepoWrapperTest.php
new file mode 100644 (file)
index 0000000..681e368
--- /dev/null
@@ -0,0 +1,138 @@
+<?php
+
+class FileBackendDBRepoWrapperTest extends MediaWikiTestCase {
+       protected $backendName = 'foo-backend';
+       protected $repoName = 'pureTestRepo';
+
+       /**
+        * @dataProvider getBackendPathsProvider
+        * @covers FileBackendDBRepoWrapper::getBackendPaths
+        */
+       public function testGetBackendPaths(
+               $mocks,
+               $latest,
+               $dbReadsExpected,
+               $dbReturnValue,
+               $originalPath,
+               $expectedBackendPath,
+               $message ) {
+               list( $dbMock, $backendMock, $wrapperMock ) = $mocks;
+
+               $dbMock->expects( $dbReadsExpected )
+                       ->method( 'selectField' )
+                       ->will( $this->returnValue( $dbReturnValue ) );
+
+               $newPaths = $wrapperMock->getBackendPaths( array( $originalPath ), $latest );
+
+               $this->assertEquals(
+                       $expectedBackendPath,
+                       $newPaths[0],
+                       $message );
+       }
+
+       public function getBackendPathsProvider() {
+               $prefix = 'mwstore://' . $this->backendName . '/' . $this->repoName;
+               $mocksForCaching = $this->getMocks();
+
+               return array(
+                       array(
+                               $mocksForCaching,
+                               false,
+                               $this->once(),
+                               '96246614d75ba1703bdfd5d7660bb57407aaf5d9',
+                               $prefix . '-public/f/o/foobar.jpg',
+                               $prefix . '-original/9/6/2/96246614d75ba1703bdfd5d7660bb57407aaf5d9',
+                               'Public path translated correctly',
+                       ),
+                       array(
+                               $mocksForCaching,
+                               false,
+                               $this->never(),
+                               '96246614d75ba1703bdfd5d7660bb57407aaf5d9',
+                               $prefix . '-public/f/o/foobar.jpg',
+                               $prefix . '-original/9/6/2/96246614d75ba1703bdfd5d7660bb57407aaf5d9',
+                               'LRU cache leveraged',
+                       ),
+                       array(
+                               $this->getMocks(),
+                               true,
+                               $this->once(),
+                               '96246614d75ba1703bdfd5d7660bb57407aaf5d9',
+                               $prefix . '-public/f/o/foobar.jpg',
+                               $prefix . '-original/9/6/2/96246614d75ba1703bdfd5d7660bb57407aaf5d9',
+                               'Latest obtained',
+                       ),
+                       array(
+                               $this->getMocks(),
+                               true,
+                               $this->never(),
+                               '96246614d75ba1703bdfd5d7660bb57407aaf5d9',
+                               $prefix . '-deleted/f/o/foobar.jpg',
+                               $prefix . '-original/f/o/o/foobar',
+                               'Deleted path translated correctly',
+                       ),
+                       array(
+                               $this->getMocks(),
+                               true,
+                               $this->once(),
+                               null,
+                               $prefix . '-public/b/a/baz.jpg',
+                               $prefix . '-public/b/a/baz.jpg',
+                               'Path left untouched if no sha1 can be found',
+                       ),
+               );
+       }
+
+       /**
+        * @covers FileBackendDBRepoWrapper::getFileContentsMulti
+        */
+       public function testGetFileContentsMulti() {
+               list( $dbMock, $backendMock, $wrapperMock ) = $this->getMocks();
+
+               $sha1Path = 'mwstore://' . $this->backendName . '/' . $this->repoName
+                       . '-original/9/6/2/96246614d75ba1703bdfd5d7660bb57407aaf5d9';
+               $filenamePath = 'mwstore://' . $this->backendName . '/' . $this->repoName
+                       . '-public/f/o/foobar.jpg';
+
+               $dbMock->expects( $this->once() )
+                       ->method( 'selectField' )
+                       ->will( $this->returnValue( '96246614d75ba1703bdfd5d7660bb57407aaf5d9' ) );
+
+               $backendMock->expects( $this->once() )
+                       ->method( 'getFileContentsMulti')
+                       ->will( $this->returnValue( array( $sha1Path => 'foo' ) ) );
+
+               $result = $wrapperMock->getFileContentsMulti( array( 'srcs' => array( $filenamePath ) ) );
+
+               $this->assertEquals(
+                       array( $filenamePath => 'foo' ),
+                       $result,
+                       'File contents paths translated properly'
+               );
+       }
+
+       protected function getMocks() {
+               $dbMock = $this->getMockBuilder( 'DatabaseMysql' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $backendMock = $this->getMock( 'FSFileBackend',
+                       array(),
+                       array( array(
+                               'name' => $this->backendName,
+                               'wikiId' => wfWikiId()
+                       ) ) );
+
+               $wrapperMock = $this->getMock( 'FileBackendDBRepoWrapper',
+                       array( 'getDB' ),
+                       array( array(
+                               'backend' => $backendMock,
+                               'repoName' => $this->repoName,
+                               'dbHandleFactory' => null
+                       ) ) );
+
+               $wrapperMock->expects( $this->any() )->method( 'getDB' )->will( $this->returnValue( $dbMock ) );
+
+               return array( $dbMock, $backendMock, $wrapperMock );
+       }
+}
diff --git a/tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php b/tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php
new file mode 100644 (file)
index 0000000..65db7e4
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+
+class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
+       protected $tmpPrefix;
+       protected $migratorMock;
+       protected $tmpFilepath;
+       protected $text = 'testing';
+
+       protected function setUp() {
+               parent::setUp();
+
+               $filename = 'Foo.png';
+
+               $this->tmpPrefix = wfTempDir() . '/migratefilelayout-test-' . time() . '-' . mt_rand();
+
+               $backend = new FSFileBackend( array(
+                       'name' => 'local-migratefilerepolayouttest',
+                       'wikiId' => wfWikiID(),
+                       'containerPaths' => array(
+                               'migratefilerepolayouttest-original' => "{$this->tmpPrefix}-original",
+                               'migratefilerepolayouttest-public' => "{$this->tmpPrefix}-public",
+                               'migratefilerepolayouttest-thumb' => "{$this->tmpPrefix}-thumb",
+                               'migratefilerepolayouttest-temp' => "{$this->tmpPrefix}-temp",
+                               'migratefilerepolayouttest-deleted' => "{$this->tmpPrefix}-deleted",
+                       )
+               ) );
+
+               $dbMock = $this->getMockBuilder( 'DatabaseMysql' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $imageRow = new stdClass;
+               $imageRow->img_name = $filename;
+               $imageRow->img_sha1 = sha1( $this->text );
+
+               $dbMock->expects( $this->any() )
+                       ->method( 'select' )
+                       ->will( $this->onConsecutiveCalls(
+                               new FakeResultWrapper( array( $imageRow ) ), // image
+                               new FakeResultWrapper( array() ), // image
+                               new FakeResultWrapper( array() ) // filearchive
+                       ) );
+
+               $repoMock = $this->getMock( 'LocalRepo',
+                       array( 'getMasterDB' ),
+                       array( array(
+                               'name' => 'migratefilerepolayouttest',
+                               'backend' => $backend
+                       ) ) );
+
+               $repoMock->expects( $this->any() )->method( 'getMasterDB' )->will( $this->returnValue( $dbMock ) );
+
+               $this->migratorMock = $this->getMock( 'MigrateFileRepoLayout', array( 'getRepo' ) );
+               $this->migratorMock->expects( $this->any() )->method( 'getRepo' )->will( $this->returnValue( $repoMock ) );
+
+               $this->tmpFilepath = TempFSFile::factory( 'migratefilelayout-test-', 'png' )->getPath();
+
+               file_put_contents( $this->tmpFilepath, $this->text );
+
+               $hashPath = $repoMock->getHashPath( $filename );
+
+               $status = $repoMock->store( $this->tmpFilepath, 'public', $hashPath . $filename, FileRepo::OVERWRITE );
+       }
+
+       protected function deleteFilesRecursively( $directory ) {
+               foreach ( glob( $directory . '/*' ) as $file ) {
+               if ( is_dir( $file ) ) {
+                       $this->deleteFilesRecursively( $file );
+               } else {
+                       unlink( $file );
+               }
+               }
+
+               rmdir( $directory );
+       }
+
+       protected function tearDown() {
+       foreach ( glob( $this->tmpPrefix . '*' ) as $directory ) {
+               $this->deleteFilesRecursively( $directory );
+       }
+
+       unlink( $this->tmpFilepath );
+
+               parent::tearDown();
+       }
+
+       public function testMigration() {
+               $this->migratorMock->loadParamsAndArgs( null, array( 'oldlayout' => 'name', 'newlayout' => 'sha1' ) );
+
+               ob_start();
+
+               $this->migratorMock->execute();
+
+               ob_end_clean();
+
+               $sha1 = sha1( $this->text );
+
+               $expectedOriginalFilepath = $this->tmpPrefix
+                       . '-original/'
+                       . substr( $sha1, 0, 1 )
+                       . '/'
+                       . substr( $sha1, 1, 1 )
+                       . '/'
+                       . substr( $sha1, 2, 1 )
+                       . '/'
+                       . $sha1 ;
+
+               $this->assertEquals( file_get_contents( $expectedOriginalFilepath ), $this->text, 'New sha1 file should be exist and have the right contents' );
+
+               $expectedPublicFilepath = $this->tmpPrefix . '-public/f/f8/Foo.png';
+
+               $this->assertEquals( file_get_contents( $expectedPublicFilepath ), $this->text, 'Existing name file should still and have the right contents' );
+       }
+}
index 61ebbf8..0fcaa5f 100644 (file)
@@ -133,8 +133,7 @@ class GenerateJqueryMsgData extends Maintenance {
                                . "// languages, and parser modes. Intended for use by a unit test framework by looping\n"
                                . "// through the object and comparing its parser return value with the 'result' property.\n"
                                . '// Last generated with ' . basename( __FILE__ ) . ' at ' . gmdate( 'r' ) . "\n"
-                               // This file will contain unquoted JSON strings as javascript native object literals,
-                               // flip the quotemark convention for this file.
+                               . "//jscs:disable\n"
                                . "\n"
                                . 'mediaWiki.libs.phpParserData = ' . FormatJson::encode( $phpParserData, true ) . ";\n";
 
index 4ab5f14..498acc1 100644 (file)
@@ -1,7 +1,8 @@
 // This file stores the output from the PHP parser for various messages, arguments,
 // languages, and parser modes. Intended for use by a unit test framework by looping
 // through the object and comparing its parser return value with the 'result' property.
-// Last generated with generateJqueryMsgData.php at Thu, 30 Jan 2014 04:04:41 +0000
+// Last generated with generateJqueryMsgData.php at Fri, 10 Jul 2015 11:44:08 +0000
+//jscs:disable
 
 mediaWiki.libs.phpParserData = {
     "messages": {
index 8040581..c51e409 100644 (file)
                this.clock.tick( 500 );
        } );
 
+       QUnit.test( 'cloned collapsibles can be made collapsible again', 2, function ( assert ) {
+               var test = this,
+                       $collapsible = prepareCollapsible(
+                               '<div class="mw-collapsible">' + loremIpsum + '</div>'
+                       ),
+                       $clone = $collapsible.clone() // clone without data and events
+                               .appendTo( '#qunit-fixture' ).makeCollapsible(),
+                       $content = $clone.find( '.mw-collapsible-content' );
+
+               assert.assertTrue( $content.is( ':visible' ), 'content is visible' );
+
+               $clone.on( 'afterCollapse.mw-collapsible', function () {
+                       assert.assertTrue( $content.is( ':hidden' ), 'after collapsing: content is hidden' );
+               } );
+
+               $clone.find( '.mw-collapsible-toggle a' ).trigger( 'click' );
+               test.clock.tick( 500 );
+       } );
 }( mediaWiki, jQuery ) );
index 77fecb3..c8f0011 100644 (file)
 
        } );
 
+       QUnit.asyncTest( 'mw.loader.implement( dependency with styles )', 4, function ( assert ) {
+               var $element = $( '<div class="mw-test-implement-e"></div>' ).appendTo( '#qunit-fixture' ),
+                       $element2 = $( '<div class="mw-test-implement-e2"></div>' ).appendTo( '#qunit-fixture' );
+
+               assert.notEqual(
+                       $element.css( 'float' ),
+                       'right',
+                       'style is clear'
+               );
+               assert.notEqual(
+                       $element2.css( 'float' ),
+                       'left',
+                       'style is clear'
+               );
+
+               mw.loader.register( [
+                       [ 'test.implement.e', '0', ['test.implement.e2']],
+                       [ 'test.implement.e2', '0' ]
+               ] );
+
+               mw.loader.implement(
+                       'test.implement.e',
+                       function () {
+                               assert.equal(
+                                       $element.css( 'float' ),
+                                       'right',
+                                       'Depending module\'s style is applied'
+                               );
+                               QUnit.start();
+                       },
+                       {
+                               'all': '.mw-test-implement-e { float: right; }'
+                       }
+               );
+
+               mw.loader.implement(
+                       'test.implement.e2',
+                       function () {
+                               assert.equal(
+                                       $element2.css( 'float' ),
+                                       'left',
+                                       'Dependency\'s style is applied'
+                               );
+                       },
+                       {
+                               'all': '.mw-test-implement-e2 { float: left; }'
+                       }
+               );
+
+               mw.loader.load( [
+                       'test.implement.e'
+               ] );
+       } );
+
        QUnit.test( 'mw.loader.implement( only scripts )', 1, function ( assert ) {
                mw.loader.implement( 'test.onlyscripts', function () {} );
                assert.strictEqual( mw.loader.getState( 'test.onlyscripts' ), 'ready' );
index 5c4eea7..3b7ff43 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -309,6 +309,7 @@ function wfStreamThumb( array $params ) {
                        wfThumbError( 500, 'Could not stream the file' );
                } else {
                        RequestContext::getMain()->getStats()->timing( 'media.thumbnail.stream', $streamtime );
+                       wfDebugLog( 'thumbnailaccess', time() . ' ' . $thumbPath . ' ' . ob_get_length() . ' Streamed ' );
                }
                return;
        }