Merge "Fixed Style/FileName RuboCop offense"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 23 Mar 2015 17:22:24 +0000 (17:22 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 23 Mar 2015 17:22:24 +0000 (17:22 +0000)
214 files changed:
Gruntfile.js
RELEASE-NOTES-1.25
autoload.php
composer.json
docs/sitescache.txt [new file with mode: 0644]
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/Html.php
includes/MediaWiki.php
includes/TemplateParser.php
includes/Title.php
includes/api/i18n/de.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/it.json
includes/api/i18n/ja.json
includes/api/i18n/ksh.json
includes/api/i18n/ru.json
includes/api/i18n/zh-hans.json
includes/api/i18n/zh-hant.json
includes/cache/BacklinkCache.php
includes/debug/MWDebug.php
includes/debug/logger/legacy/Logger.php
includes/exception/HttpError.php
includes/filebackend/FSFileBackend.php
includes/filebackend/FileBackendStore.php
includes/filebackend/SwiftFileBackend.php
includes/filerepo/file/LocalFile.php
includes/installer/i18n/de.json
includes/installer/i18n/es.json
includes/installer/i18n/hi.json
includes/installer/i18n/zh-hant.json
includes/jobqueue/JobQueueFederated.php
includes/logging/LogFormatter.php
includes/media/ImageHandler.php
includes/media/MediaHandler.php
includes/page/Article.php
includes/page/ImagePage.php
includes/page/WikiPage.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/site/CachingSiteStore.php [new file with mode: 0644]
includes/site/DBSiteStore.php [new file with mode: 0644]
includes/site/FileBasedSiteLookup.php [new file with mode: 0644]
includes/site/HashSiteStore.php
includes/site/SiteListFileCache.php [deleted file]
includes/site/SiteListFileCacheBuilder.php [deleted file]
includes/site/SiteLookup.php [new file with mode: 0644]
includes/site/SiteSQLStore.php
includes/site/SiteStore.php
includes/site/SitesCacheFileBuilder.php [new file with mode: 0644]
includes/specialpage/FormSpecialPage.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialDiff.php
includes/specials/SpecialExpandTemplates.php
includes/specials/SpecialImport.php
includes/specials/SpecialRandomInCategory.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialTags.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUserrights.php
languages/i18n/ang.json
languages/i18n/ar.json
languages/i18n/arq.json
languages/i18n/as.json
languages/i18n/awa.json
languages/i18n/az.json
languages/i18n/bar.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bho.json
languages/i18n/bn.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/cs.json
languages/i18n/cv.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/egl.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/ext.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/frr.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/ka.json
languages/i18n/kk-cyrl.json
languages/i18n/ksh.json
languages/i18n/lb.json
languages/i18n/lez.json
languages/i18n/lt.json
languages/i18n/lzh.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mr.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/oc.json
languages/i18n/pa.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sa.json
languages/i18n/scn.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/tcy.json
languages/i18n/te.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/uk.json
languages/i18n/vo.json
languages/i18n/yi.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesDe.php
maintenance/rebuildLocalisationCache.php
maintenance/rebuildSitesCache.php
package.json
resources/Resources.php
resources/lib/oojs-ui/i18n/is.json
resources/lib/oojs-ui/i18n/kk-cyrl.json
resources/lib/oojs-ui/i18n/krc.json
resources/lib/oojs-ui/i18n/ksh.json
resources/lib/oojs-ui/i18n/tr.json
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-alerts.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-content.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-editing-advanced.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-editing-core.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-editing-list.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-editing-styling.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-interactions.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-layout.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-location.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-media.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-moderation.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-movement.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-user.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-wikimedia.css
resources/lib/oojs-ui/oojs-ui-mediawiki.css
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs/oojs.jquery.js
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki.api/mediawiki.api.options.js [new file with mode: 0644]
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.special/mediawiki.special.block.js
resources/src/mediawiki.special/mediawiki.special.changeslist.css
resources/src/mediawiki.ui/components/inputs.less
resources/src/mediawiki/images/help.png
resources/src/mediawiki/images/help.svg [new file with mode: 0644]
resources/src/mediawiki/mediawiki.filewarning.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.filewarning.less [new file with mode: 0644]
resources/src/mediawiki/mediawiki.helplink.css [deleted file]
resources/src/mediawiki/mediawiki.helplink.less [new file with mode: 0644]
resources/src/mediawiki/mediawiki.util.js
tests/browser/features/step_definitions/create_account_steps.rb
tests/browser/features/step_definitions/create_and_follow_wiki_link_steps.rb
tests/browser/features/step_definitions/edit_page_steps.rb
tests/browser/features/step_definitions/file_steps.rb
tests/browser/features/step_definitions/login_steps.rb
tests/browser/features/step_definitions/main_page_links_steps.rb
tests/browser/features/step_definitions/preferences_appearance_steps.rb
tests/browser/features/step_definitions/preferences_editing_steps.rb
tests/browser/features/step_definitions/preferences_user_profile_steps.rb
tests/browser/features/step_definitions/view_history_steps.rb
tests/phpunit/data/templates/foobar.mustache [new file with mode: 0644]
tests/phpunit/data/templates/foobar_args.mustache [new file with mode: 0644]
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/TemplateParserTest.php
tests/phpunit/includes/changes/RecentChangeTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/site/CachingSiteStoreTest.php [new file with mode: 0644]
tests/phpunit/includes/site/DBSiteStoreTest.php [new file with mode: 0644]
tests/phpunit/includes/site/FileBasedSiteLookupTest.php [new file with mode: 0644]
tests/phpunit/includes/site/SiteListFileCacheBuilderTest.php [deleted file]
tests/phpunit/includes/site/SiteListFileCacheTest.php [deleted file]
tests/phpunit/includes/site/SiteSQLStoreTest.php
tests/phpunit/includes/site/SitesCacheFileBuilderTest.php [new file with mode: 0644]
tests/phpunit/includes/site/TestSites.php
tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
tests/phpunit/structure/AutoLoaderTest.php
tests/qunit/QUnitTestResources.php
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.options.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js

index a292d0b..573db69 100644 (file)
@@ -76,7 +76,9 @@ module.exports = function ( grunt ) {
                                frameworks: [ 'qunit' ],
                                reporters: [ 'dots' ],
                                singleRun: true,
-                               autoWatch: false
+                               autoWatch: false,
+                               // Some tests in extensions don't yield for more than the default 10s (T89075)
+                               browserNoActivityTimeout: 60 * 1000
                        },
                        main: {
                                browsers: [ 'Chrome' ]
@@ -97,8 +99,21 @@ module.exports = function ( grunt ) {
                }
        } );
 
+       grunt.registerTask( 'assert-mw-env', function () {
+               if ( !process.env.MW_SERVER ) {
+                       grunt.log.error( 'Environment variable MW_SERVER must be set.\n' +
+                               'Set this like $wgServer, e.g. "http://localhost"'
+                       );
+               }
+               if ( !process.env.MW_SCRIPT_PATH ) {
+                       grunt.log.error( 'Environment variable MW_SCRIPT_PATH must be set.\n' +
+                               'Set this like $wgScriptPath, e.g. "/w"');
+               }
+               return !!( process.env.MW_SERVER && process.env.MW_SCRIPT_PATH );
+       } );
+
        grunt.registerTask( 'lint', ['jshint', 'jscs', 'jsonlint', 'banana'] );
-       grunt.registerTask( 'qunit', 'karma:main' );
+       grunt.registerTask( 'qunit', [ 'assert-mw-env', 'karma:main' ] );
 
        grunt.registerTask( 'test', ['lint'] );
        grunt.registerTask( 'default', 'test' );
index 88bfc15..00ce6b1 100644 (file)
@@ -115,6 +115,8 @@ production.
   interface, reachable via IContextSource::getStats().
 * Move the jQuery Client library from being mastered in MediaWiki as v0.1.0 to a
   proper, published library, which is now tagged as v1.0.0.
+* A new message (defaulting to blank), 'editnotice-notext', can be shown to users
+  when they are editing if no edit notices apply to the page being edited.
 
 ==== External libraries ====
 * MediaWiki now requires certain external libraries to be installed. In the past
index 6b83fcb..eacf431 100644 (file)
@@ -189,6 +189,7 @@ $wgAutoloadLocalClasses = array(
        'CacheHelper' => __DIR__ . '/includes/cache/CacheHelper.php',
        'CacheTime' => __DIR__ . '/includes/parser/CacheTime.php',
        'CachedAction' => __DIR__ . '/includes/actions/CachedAction.php',
+       'CachingSiteStore' => __DIR__ . '/includes/site/CachingSiteStore.php',
        'CapsCleanup' => __DIR__ . '/maintenance/cleanupCaps.php',
        'Category' => __DIR__ . '/includes/Category.php',
        'CategoryFinder' => __DIR__ . '/includes/CategoryFinder.php',
@@ -277,6 +278,7 @@ $wgAutoloadLocalClasses = array(
        'DBMasterPos' => __DIR__ . '/includes/db/DatabaseUtility.php',
        'DBObject' => __DIR__ . '/includes/db/DatabaseUtility.php',
        'DBQueryError' => __DIR__ . '/includes/db/DatabaseError.php',
+       'DBSiteStore' => __DIR__ . '/includes/site/DBSiteStore.php',
        'DBUnexpectedError' => __DIR__ . '/includes/db/DatabaseError.php',
        'DataUpdate' => __DIR__ . '/includes/deferred/DataUpdate.php',
        'DatabaseBase' => __DIR__ . '/includes/db/Database.php',
@@ -417,6 +419,7 @@ $wgAutoloadLocalClasses = array(
        'FileBackendStoreShardDirIterator' => __DIR__ . '/includes/filebackend/FileBackendStore.php',
        'FileBackendStoreShardFileIterator' => __DIR__ . '/includes/filebackend/FileBackendStore.php',
        'FileBackendStoreShardListIterator' => __DIR__ . '/includes/filebackend/FileBackendStore.php',
+       'FileBasedSiteLookup' => __DIR__ . '/includes/site/FileBasedSiteLookup.php',
        'FileCacheBase' => __DIR__ . '/includes/cache/FileCacheBase.php',
        'FileDeleteForm' => __DIR__ . '/includes/FileDeleteForm.php',
        'FileDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
@@ -1061,14 +1064,14 @@ $wgAutoloadLocalClasses = array(
        'SiteExporter' => __DIR__ . '/includes/site/SiteExporter.php',
        'SiteImporter' => __DIR__ . '/includes/site/SiteImporter.php',
        'SiteList' => __DIR__ . '/includes/site/SiteList.php',
-       'SiteListFileCache' => __DIR__ . '/includes/site/SiteListFileCache.php',
-       'SiteListFileCacheBuilder' => __DIR__ . '/includes/site/SiteListFileCacheBuilder.php',
+       'SiteLookup' => __DIR__ . '/includes/site/SiteLookup.php',
        'SiteObject' => __DIR__ . '/includes/site/Site.php',
        'SiteSQLStore' => __DIR__ . '/includes/site/SiteSQLStore.php',
        'SiteStats' => __DIR__ . '/includes/SiteStats.php',
        'SiteStatsInit' => __DIR__ . '/includes/SiteStats.php',
        'SiteStatsUpdate' => __DIR__ . '/includes/deferred/SiteStatsUpdate.php',
        'SiteStore' => __DIR__ . '/includes/site/SiteStore.php',
+       'SitesCacheFileBuilder' => __DIR__ . '/includes/site/SitesCacheFileBuilder.php',
        'Skin' => __DIR__ . '/includes/skins/Skin.php',
        'SkinApi' => __DIR__ . '/includes/skins/SkinApi.php',
        'SkinApiTemplate' => __DIR__ . '/includes/skins/SkinApiTemplate.php',
index 8c0cfed..484f472 100644 (file)
@@ -20,7 +20,7 @@
                "ext-iconv": "*",
                "leafo/lessphp": "0.5.0",
                "liuggio/statsd-php-client": "1.0.12",
-               "oojs/oojs-ui": "0.9.1",
+               "oojs/oojs-ui": "0.9.3",
                "php": ">=5.3.3",
                "psr/log": "1.0.0",
                "wikimedia/cdb": "1.0.1",
diff --git a/docs/sitescache.txt b/docs/sitescache.txt
new file mode 100644 (file)
index 0000000..13bf371
--- /dev/null
@@ -0,0 +1,42 @@
+MediaWiki's SiteStore can be cached and stored in a flat file,
+in a json format. If the SiteStore is frequently accessed, the
+file cache may provide a performance benefit over a database
+store, even with memcached in front of it.
+
+Configuration:
+
+File-based caching can be enabled by setting $wgSitesCacheFile
+to the file path of the cache file.
+
+The file can then be generated with the rebuildSitesCache.php
+maintenance script.
+
+Format:
+
+In the sites cache file, sites are listed in a key-value
+map, with the key being the site's global id (e.g. "enwiki")
+and a key-value map as the value. The site list is wrapped
+with in a "sites" key.
+
+Example:
+
+"sites": {
+       "aawiktionary": {
+               "globalid": "aawiktionary",
+               "type": "mediawiki",
+               "group": "wiktionary",
+               "source": "local",
+               "language": "aa",
+               "localids": [],
+               "config": [],
+               "data": {
+                       "paths": {
+                               "file_path": "http:\/\/aa.wiktionary.org\/w\/$1",
+                               "page_path": "http:\/\/aa.wiktionary.org\/wiki\/$1"
+                       }
+               },
+               "forward": false,
+               "internalid": 2666,
+               "identifiers": []
+       }
+}
index 8a4769d..1df809e 100644 (file)
@@ -3805,7 +3805,7 @@ $wgInterwikiFallbackSite = 'wiki';
  */
 
 /**
- * Specify the file location for the SiteStore json cache file.
+ * Specify the file location for the Sites json cache file.
  */
 $wgSitesCacheFile = false;
 
@@ -5320,6 +5320,11 @@ $wgDebugLogGroups = array();
  * inject an MWLoggerSpi instance into MWLoggerFactory and bypass the use of
  * this configuration variable entirely.
  *
+ * @par To completely disable logging:
+ * @code
+ * $wgMWLoggerDefaultSpi = array( 'class' => 'MWLoggerNullSpi' );
+ * @endcode
+ *
  * @since 1.25
  * @var array $wgMWLoggerDefaultSpi
  * @see MwLogger
@@ -6689,8 +6694,6 @@ $wgLogActions = array(
        'protect/modify' => 'modifiedarticleprotection',
        'protect/unprotect' => 'unprotectedarticle',
        'protect/move_prot' => 'movedarticleprotection',
-       'import/upload' => 'import-logentry-upload',
-       'import/interwiki' => 'import-logentry-interwiki',
 );
 
 /**
@@ -6725,6 +6728,8 @@ $wgLogActionsHandlers = array(
        'block/reblock' => 'BlockLogFormatter',
        'suppress/block' => 'BlockLogFormatter',
        'suppress/reblock' => 'BlockLogFormatter',
+       'import/upload' => 'LogFormatter',
+       'import/interwiki' => 'LogFormatter',
 );
 
 /**
index 8456c5d..c9263da 100644 (file)
@@ -208,7 +208,6 @@ require_once __DIR__ . '/libs/normal/UtfNormalDefines.php';
 /**@{
  * Hook support constants
  */
-define( 'MW_SUPPORTS_EDITFILTERMERGED', 1 );
 define( 'MW_SUPPORTS_PARSERFIRSTCALLINIT', 1 );
 define( 'MW_SUPPORTS_LOCALISATIONCACHE', 1 );
 define( 'MW_SUPPORTS_CONTENTHANDLER', 1 );
@@ -245,11 +244,6 @@ define( 'SFH_NO_HASH', 1 );
 define( 'SFH_OBJECT_ARGS', 2 );
 /**@}*/
 
-/**
- * Flags for Parser::replaceLinkHolders
- */
-define( 'RLH_FOR_UPDATE', 1 );
-
 /**@{
  * Autopromote conditions (must be here and not in Autopromote.php, so that
  * they're loaded for DefaultSettings.php before AutoLoader.php)
index 5eb07d1..94ed903 100644 (file)
@@ -2555,7 +2555,19 @@ class EditPage {
                }
 
                // Add edit notices
-               $wgOut->addHTML( implode( "\n", $this->mTitle->getEditNotices( $this->oldid ) ) );
+               $editNotices = $this->mTitle->getEditNotices( $this->oldid );
+               if ( count( $editNotices ) ) {
+                       $wgOut->addHTML( implode( "\n", $editNotices ) );
+               } else {
+                       $msg = wfMessage( 'editnotice-notext' );
+                       if ( !$msg->isDisabled() ) {
+                               $wgOut->addHTML(
+                                       '<div class="mw-editnotice-notext">'
+                                       . $msg->parseAsBlock()
+                                       . '</div>'
+                               );
+                       }
+               }
 
                if ( $this->isConflict ) {
                        $wgOut->wrapWikiMsg( "<div class='mw-explainconflict'>\n$1\n</div>", 'explainconflict' );
index 9ae6cb8..47e7a15 100644 (file)
@@ -1030,12 +1030,7 @@ function wfMatchesDomainList( $url, $domains ) {
  * @since 1.25 support for additional context data
  *
  * @param string $text
- * @param string|bool $dest Destination of the message:
- *     - 'all': both to the log and HTML (debug toolbar or HTML comments)
- *     - 'log': only to the log and not in HTML
- *   For backward compatibility, it can also take a boolean:
- *     - true: same as 'all'
- *     - false: same as 'log'
+ * @param string|bool $dest Unused
  * @param array $context Additional logging context data
  */
 function wfDebug( $text, $dest = 'all', array $context = array() ) {
@@ -1046,13 +1041,6 @@ function wfDebug( $text, $dest = 'all', array $context = array() ) {
                return;
        }
 
-       // Turn $dest into a string if it's a boolean (for b/c)
-       if ( $dest === true ) {
-               $dest = 'all';
-       } elseif ( $dest === false ) {
-               $dest = 'log';
-       }
-
        $text = trim( $text );
 
        // Inline logic from deprecated wfDebugTimer()
@@ -1067,16 +1055,6 @@ function wfDebug( $text, $dest = 'all', array $context = array() ) {
                );
        }
 
-       if ( $dest === 'all' ) {
-               $prefix = '';
-               if ( $wgDebugTimestamps ) {
-                       // Prepend elapsed request time and real memory usage with two
-                       // trailing spaces.
-                       $prefix = "{$context['seconds_elapsed']} {$context['memory_used']}  ";
-               }
-               MWDebug::debugMsg( "{$prefix}{$text}" );
-       }
-
        if ( $wgDebugLogPrefix !== '' ) {
                $context['prefix'] = $wgDebugLogPrefix;
        }
@@ -1181,10 +1159,6 @@ function wfDebugLog(
 
        $text = trim( $text );
 
-       if ( $dest === 'all' ) {
-               MWDebug::debugMsg( "[{$logGroup}] {$text}\n" );
-       }
-
        $logger = MWLoggerFactory::getInstance( $logGroup );
        $context['private'] = ( $dest === 'private' );
        $logger->info( $text, $context );
index 8799225..ed77729 100644 (file)
@@ -151,10 +151,6 @@ class Html {
                        } else {
                                $attrs['class'] = 'mw-ui-input';
                        }
-
-                       // Note that size can effect the desired width rendering of mw-ui-input elements
-                       // so it is removed. Left intact when mediawiki ui not enabled.
-                       unset( $attrs['size'] );
                }
                return $attrs;
        }
index 3b463ae..2644023 100644 (file)
@@ -22,8 +22,6 @@
 
 /**
  * The MediaWiki class is the helper class for the index.php entry point.
- *
- * @internal documentation reviewed 15 Mar 2010
  */
 class MediaWiki {
        /**
index a22f280..3de70fa 100644 (file)
@@ -51,7 +51,7 @@ class TemplateParser {
         * @return string
         * @throws UnexpectedValueException Disallows upwards directory traversal via $templateName
         */
-       public function getTemplateFilename( $templateName ) {
+       protected function getTemplateFilename( $templateName ) {
                // Prevent upwards directory traversal using same methods as Title::secureAndSplit
                if (
                        strpos( $templateName, '.' ) !== false &&
@@ -74,12 +74,12 @@ class TemplateParser {
        /**
         * Returns a given template function if found, otherwise throws an exception.
         * @param string $templateName The name of the template (without file suffix)
-        * @return Function
+        * @return callable
         * @throws RuntimeException
         */
-       public function getTemplate( $templateName ) {
+       protected function getTemplate( $templateName ) {
                // If a renderer has already been defined for this template, reuse it
-               if ( isset( $this->renderers[$templateName] ) ) {
+               if ( isset( $this->renderers[$templateName] ) && is_callable( $this->renderers[$templateName] ) ) {
                        return $this->renderers[$templateName];
                }
 
@@ -103,22 +103,15 @@ class TemplateParser {
                        // See if the compiled PHP code is stored in cache.
                        // CACHE_ACCEL throws an exception if no suitable object cache is present, so fall
                        // back to CACHE_ANYTHING.
-                       try {
-                               $cache = wfGetCache( CACHE_ACCEL );
-                       } catch ( Exception $e ) {
-                               $cache = wfGetCache( CACHE_ANYTHING );
-                       }
+                       $cache = ObjectCache::newAccelerator( array(), CACHE_ANYTHING );
                        $key = wfMemcKey( 'template', $templateName, $fastHash );
                        $code = $this->forceRecompile ? null : $cache->get( $key );
 
                        if ( !$code ) {
                                $code = $this->compileForEval( $fileContents, $filename );
 
-                               // Prefix the code with a keyed hash (64 hex chars) as an integrity check
-                               $code = hash_hmac( 'sha256', $code, $secretKey ) . $code;
-
-                               // Cache the compiled PHP code
-                               $cache->set( $key, $code );
+                               // Prefix the cached code with a keyed hash (64 hex chars) as an integrity check
+                               $cache->set( $key, hash_hmac( 'sha256', $code, $secretKey ) . $code );
                        } else {
                                // Verify the integrity of the cached PHP code
                                $keyedHash = substr( $code, 0, 64 );
@@ -134,6 +127,9 @@ class TemplateParser {
                }
 
                $renderer = eval( $code );
+               if ( !is_callable( $renderer ) ) {
+                       throw new RuntimeException( "Requested template, {$templateName}, is not callable" );
+               }
                return $this->renderers[$templateName] = $renderer;
        }
 
@@ -145,9 +141,9 @@ class TemplateParser {
         * @return string PHP code (without '<?php')
         * @throws RuntimeException
         */
-       public function compileForEval( $fileContents, $filename ) {
+       protected function compileForEval( $fileContents, $filename ) {
                // Compile the template into PHP code
-               $code = self::compile( $fileContents );
+               $code = $this->compile( $fileContents );
 
                if ( !$code ) {
                        throw new RuntimeException( "Could not compile template: {$filename}" );
@@ -167,7 +163,7 @@ class TemplateParser {
         * @return string PHP code (with '<?php')
         * @throws RuntimeException
         */
-       public static function compile( $code ) {
+       protected function compile( $code ) {
                if ( !class_exists( 'LightnCandy' ) ) {
                        throw new RuntimeException( 'LightnCandy class not defined' );
                }
index f47300c..921538b 100644 (file)
@@ -29,8 +29,6 @@
  *       however, it does so inefficiently.
  * @note Consider using a TitleValue object instead. TitleValue is more lightweight
  *       and does not rely on global state or the database.
- *
- * @internal documentation reviewed 15 Mar 2010
  */
 class Title {
        /** @var MapCacheLRU */
index 7e3c63f..a7b951b 100644 (file)
        "apihelp-block-param-watchuser": "Benutzer- und Diskussionsseiten des Benutzers oder der IP-Adresse beobachten.",
        "apihelp-block-example-ip-simple": "IP <kbd>192.0.2.5</kbd> für drei Tage mit der Begründung „First strike“ (erste Verwarnung) sperren",
        "apihelp-block-example-user-complex": "Benutzer <kbd>Vandal</kbd> unbeschränkt sperren mit der Begründung „Vandalism“ (Vandalismus), Erstellung neuer Benutzerkonten sowie Versand von E-Mails verhindern.",
+       "apihelp-checktoken-description": "Überprüft die Gültigkeit eines über <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> erhaltenen Tokens.",
+       "apihelp-checktoken-param-type": "Typ des Tokens, das getestet werden soll.",
+       "apihelp-checktoken-param-token": "Token, das getestet werden soll.",
+       "apihelp-checktoken-param-maxtokenage": "Maximal erlaubtes Alter des Tokens in Sekunden.",
+       "apihelp-checktoken-example-simple": "Überprüft die Gültigkeit des <kbd>csrf</kbd>-Tokens.",
        "apihelp-clearhasmsg-description": "Löschen des <code>hasmsg</code>-Flags („hat Nachrichten“-Flag) für den aktuellen Benutzer.",
        "apihelp-clearhasmsg-example-1": "<code>hasmsg</code>-Flags für den aktuellen Benutzer löschen",
        "apihelp-compare-description": "Abrufen des Unterschieds zwischen zwei Seiten.\n\nDu musst eine Versionsnummer, einen Seitentitel oder eine Seitennummer für „from“ als auch „to“ angeben.",
        "apihelp-paraminfo-description": "Ruft Informationen über API-Module ab.",
        "apihelp-paraminfo-param-helpformat": "Format der Hilfe-Zeichenfolgen.",
        "apihelp-parse-param-summary": "Zu parsende Zusammenfassung.",
+       "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": "Deaktiviert Abschnittsbearbeitungslinks in der Parserausgabe.",
        "apihelp-parse-param-preview": "Im Vorschaumodus parsen.",
        "apihelp-parse-param-disabletoc": "Inhaltsverzeichnis in der Ausgabe deaktivieren.",
        "apihelp-parse-example-page": "Eine Seite parsen.",
        "apihelp-parse-example-text": "Wikitext parsen.",
+       "apihelp-parse-example-texttitle": "Parst den Wikitext über die Eingabe des Seitentitels.",
+       "apihelp-parse-example-summary": "Parst eine Zusammenfassung.",
        "apihelp-patrol-description": "Kontrolliert eine Seite oder Version.",
+       "apihelp-patrol-param-rcid": "Letzte-Änderungen-Kennung, die kontrolliert werden soll.",
+       "apihelp-patrol-param-revid": "Versionskennung, die kontrolliert werden soll.",
+       "apihelp-patrol-example-rcid": "Kontrolliert eine kürzlich getätigte Änderung.",
        "apihelp-patrol-example-revid": "Kontrolliert eine Version",
        "apihelp-protect-description": "Ändert den Schutzstatus einer Seite.",
        "apihelp-protect-param-title": "Titel der Seite, die du (ent-)sperren möchtest. Kann nicht zusammen mit $1pageid verwendet werden.",
        "apihelp-protect-example-protect": "Schützt eine Seite",
        "apihelp-protect-example-unprotect": "Eine Seite entsperren, indem die Einschränkungen durch den Schutz auf <kbd>all</kbd> gestellt werden.",
        "apihelp-protect-example-unprotect2": "Eine Seite entsperren, indem keine Einschränkungen übergeben werden",
+       "apihelp-purge-description": "Setzt den Cache der angegebenen Seiten zurück.\n\nFalls kein Benutzer angemeldet ist, müssen POST-Anfragen genutzt werden.",
        "apihelp-purge-param-forcelinkupdate": "Aktualisiert die Linktabellen.",
+       "apihelp-purge-param-forcerecursivelinkupdate": "Aktualisiert die Linktabelle der Seite und alle Linktabellen der Seiten, die sie als Vorlage einbinden.",
+       "apihelp-purge-example-simple": "Purgt die <kbd>Main Page</kbd> und die <kbd>API</kbd>-Seite.",
+       "apihelp-purge-example-generator": "Purgt die ersten 10 Seiten des Hauptnamensraums.",
+       "apihelp-query-description": "Bezieht Daten von und über MediaWiki.\n\nAlle Änderungsvorgänge müssen unter Angabe eines Tokens ablaufen, um Missbrauch durch böswillige Anwendungen vorzubeugen.",
+       "apihelp-query-param-prop": "Zurückzuliefernde Eigenschaften der abgefragten Seiten.",
        "apihelp-query-param-list": "Welche Listen abgerufen werden sollen.",
+       "apihelp-query-param-meta": "Zurückzugebende Metadaten.",
+       "apihelp-query-param-indexpageids": "Schließt einen zusätzlichen pageids-Abschnitt mit allen zurückgegebenen Seitenkennungen ein.",
+       "apihelp-query-param-export": "Exportiert die aktuellen Versionen der angegebenen oder generierten Seiten.",
+       "apihelp-query-param-exportnowrap": "Gibt den XML-Export zurück, ohne ihn in ein XML-Ergebnis einzuschließen (gleiches Format wie durch [[Special:Export]]). Kann nur zusammen mit $1export genutzt werden.",
+       "apihelp-query-param-iwurl": "Gibt an, ob die komplette URL zurückgegeben werden soll, wenn der Titel ein Interwikilink ist.",
+       "apihelp-query-param-continue": "Falls angegeben, wird query-continue als Schlüssel-Wert-Paar zurückgegeben, das anschließend an die Folgeabfrage gehängt werden kann. Dieser Parameter muss in der ersten Abfrage auf leer gesetzt werden.\n\nDieser Parameter ist für alle Neuentwicklungen empfohlen und wird in der nächsten API-Version Standard.",
+       "apihelp-query-param-rawcontinue": "Momentan unbeachtet. In Zukunft wird <var>$1continue</var> Standard, dieser Parameter wird dann benötigt, um die rohen <samp>query-continue</samp>-Daten zu erhalten.",
+       "apihelp-query-example-revisions": "Bezieht [[Special:ApiHelp/query+siteinfo|Seiteninformationen]] und [[Special:ApiHelp/query+revisions|Versionen]] der <kbd>Main Page</kbd>.",
+       "apihelp-query-example-allpages": "Bezieht Versionen von Seiten, die mit <kbd>API/</kbd> beginnen.",
        "apihelp-query+allcategories-description": "Alle Kategorien aufzählen.",
+       "apihelp-query+allcategories-param-from": "Kategorie, bei der die Auflistung beginnen soll.",
+       "apihelp-query+allcategories-param-to": "Kategorie, bei der die Auflistung enden soll.",
+       "apihelp-query+allcategories-param-prefix": "Listet alle Kategorien auf, die mit dem angegebenen Wert beginnen.",
+       "apihelp-query+allcategories-param-dir": "Sortierrichtung.",
+       "apihelp-query+allcategories-param-min": "Gibt nur Kategorien zurück, die mindestens die angegebene Anzahl an Einträgen haben.",
+       "apihelp-query+allcategories-param-max": "Gibt nur Kategorien zurück, die höchstens die angegebene Anzahl an Einträgen haben.",
        "apihelp-query+allcategories-param-limit": "Wie viele Kategorien zurückgegeben werden sollen.",
+       "apihelp-query+allcategories-param-prop": "Zurückzugebende Eigenschaften:\n;size: Ergänzt die Anzahl der Einträge in der Antwort.\n;hidden: Markiert über _&#95;HIDDENCAT_&#95; versteckte Kategorien.",
+       "apihelp-query+allcategories-example-size": "Listet Kategorien mit der Anzahl ihrer Einträge auf.",
+       "apihelp-query+allcategories-example-generator": "Bezieht Informationen über die Kategorieseite selbst für Kategorien, die mit <kbd>List</kbd> beginnen.",
+       "apihelp-query+alldeletedrevisions-description": "Bezieht alle gelöschten Versionen eines Benutzers oder eines Namensraumes.",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Darf nur mit <var>$3user</var> verwendet werden.",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Kann nicht zusammen mit <var>$3user</var> benutzt werden.",
+       "apihelp-query+alldeletedrevisions-param-start": "Der Zeitstempel, bei dem die Auflistung beginnen soll.",
+       "apihelp-query+alldeletedrevisions-param-end": "Der Zeitstempel, bei dem die Auflistung enden soll.",
+       "apihelp-query+alldeletedrevisions-param-from": "Seitentitel, bei dem die Auflistung beginnen soll.",
+       "apihelp-query+alldeletedrevisions-param-to": "Seitentitel, bei dem die Auflistung enden soll.",
+       "apihelp-query+alldeletedrevisions-param-prefix": "Listet alle Seitentitel auf, die mit dem angegebenen Wert beginnen.",
+       "apihelp-query+alldeletedrevisions-param-tag": "Listet nur Versionen auf, die die angegebene Markierung haben.",
        "apihelp-query+alldeletedrevisions-param-user": "Nur Versionen von diesem Benutzer auflisten.",
+       "apihelp-query+alldeletedrevisions-param-excludeuser": "Schließt Bearbeitungen des angegebenen Benutzers aus.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Nur Seiten in diesem Namensraum auflisten.",
        "apihelp-query+allfileusages-param-limit": "Wie viele Gesamtobjekte zurückgegeben werden sollen.",
        "apihelp-query+allfileusages-example-unique": "Einheitliche Dateititel auflisten",
        "apihelp-query+deletedrevisions-param-limit": "Die Maximalmenge der aufzulistenden Versionen.",
        "apihelp-query+deletedrevs-param-from": "Auflistung bei diesem Titel beginnen.",
        "apihelp-query+deletedrevs-param-to": "Auflistung bei diesem Titel beenden.",
+       "apihelp-query+duplicatefiles-param-localonly": "Sucht nur nach Dateien im lokalen Repositorium.",
+       "apihelp-query+duplicatefiles-example-simple": "Sucht nach Duplikaten von [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+duplicatefiles-example-generated": "Sucht nach Duplikaten aller Dateien.",
+       "apihelp-query+embeddedin-param-namespace": "Der aufzulistende Namensraum.",
+       "apihelp-query+embeddedin-param-filterredir": "Wie für Weiterleitungen gefiltert werden soll.",
+       "apihelp-query+embeddedin-param-limit": "Wie viele Seiten insgesamt zurückgegeben werden sollen.",
        "apihelp-query+extlinks-param-limit": "Wie viele Links zurückgegeben werden sollen.",
        "apihelp-query+exturlusage-param-limit": "Wie viele Seiten zurückgegeben werden sollen.",
+       "apihelp-query+filearchive-param-from": "Der Bildertitel, bei der die Auflistung beginnen soll.",
+       "apihelp-query+filearchive-param-to": "Der Bildertitel, bei der die Auflistung enden soll.",
+       "apihelp-query+filearchive-param-limit": "Wie viele Bilder insgesamt zurückgegeben werden sollen.",
        "apihelp-query+filearchive-example-simple": "Eine Liste aller gelöschten Dateien auflisten",
        "apihelp-query+imageinfo-param-limit": "Wie viele Dateiversionen pro Datei zurückgegeben werden sollen.",
        "apihelp-query+imageinfo-param-start": "Zeitstempel, von dem die Liste beginnen soll.",
        "apihelp-query+imageinfo-param-end": "Zeitstempel, an dem die Liste enden soll.",
        "apihelp-query+imageinfo-param-urlheight": "Ähnlich wie $1urlwidth.",
        "apihelp-query+info-description": "Ruft Basisinformationen über die Seite ab.",
+       "apihelp-query+info-param-testactions": "Überprüft, ob der aktuelle Benutzer gewisse Aktionen auf der Seite ausführen kann.",
        "apihelp-query+iwbacklinks-param-prefix": "Präfix für das Interwiki.",
        "apihelp-query+langbacklinks-param-limit": "Wie viele Gesamtseiten zurückgegeben werden sollen.",
        "apihelp-query+links-example-simple": "Links von der <kbd>Hauptseite</kbd> abrufen",
index c2d7fcc..c74715d 100644 (file)
        "apihelp-logout-description": "Se déconnecter et effacer les données de session.",
        "apihelp-logout-example-logout": "Déconnecter l’utilisateur actuel.",
        "apihelp-managetags-description": "Effectuer des tâches de gestion relatives à la modification des balises.",
+       "apihelp-managetags-param-operation": "Quelle opération effectuer :\n;create:Créer une nouvelle balise de modification pour un usage manuel.\n;delete:Supprimer une balise de modification de la base de données, y compris la suppression de la marque de toutes les révisions, entrées de modification récente et entrées de journal dans lesquelles elle serait utilisée.\n;activate:Activer une balise de modification, permettant aux utilisateurs de l’appliquer manuellement.\n;deactivate:Désactiver une balise de modification, empêchant les utilisateurs de l’appliquer manuellement.",
+       "apihelp-managetags-param-tag": "Balise à créer, supprimer, activer ou désactiver. Pour la création de balise, elle ne doit pas exister. Pour la suppression de balise, elle doit exister. Pour l’activation de balise, elle doit exister et ne pas être utilisée par une extension. Pour la désactivation de balise, elle doit être actuellement active et définie manuellement.",
+       "apihelp-managetags-param-reason": "Un motif facultatif pour créer, supprimer, activer ou désactiver la balise.",
+       "apihelp-managetags-param-ignorewarnings": "S’il faut ignorer tout avertissement qui se produirait au cours de l’opération.",
+       "apihelp-managetags-example-create": "Créer une balise nommée <kbd>pourriel</kbd> avec le motif <kbd>À utiliser lors de la revue des modifications</kbd>",
+       "apihelp-managetags-example-delete": "Supprimer la balise <kbd>vandlaisme</kbd> avec le motif <kbd>Mal épelé</kbd>",
+       "apihelp-managetags-example-activate": "Activer une balise nommée <kbd>pourriel</kbd> avec le motif <kbd>À utiliser dans la revue des modifications</kbd>",
+       "apihelp-managetags-example-deactivate": "Désactiver une balise nommée <kbd>pourriel</kbd> avec le motif <kbd>Plus nécessaire</kbd>",
        "apihelp-move-description": "Déplacer une page.",
-       "apihelp-move-param-from": "Titre de la page que vous voulez déplacer. Impossible de l’utiliser avec $1fromid.",
-       "apihelp-move-param-fromid": "ID de la page que vous voulez déplacer. Impossible à utiliser avec $1from.",
+       "apihelp-move-param-from": "Titre de la page à renommer. Impossible de l’utiliser avec <var>$1fromid</var>.",
+       "apihelp-move-param-fromid": "ID de la page à renommer. Impossible à utiliser avec <var>$1from</var>.",
        "apihelp-move-param-to": "Titre de la page renommée.",
        "apihelp-move-param-reason": "Motif du renommage.",
        "apihelp-move-param-movetalk": "Renommer la page de discussion, si elle existe.",
        "apihelp-parse-param-pst": "Faire une transformation avant enregistrement de l’entrée avant de l’analyser. Valide uniquement quand utilisé avec du texte.",
        "apihelp-parse-param-onlypst": "Faire une transformation avant enregistrement (PST) de l’entrée, mais ne pas l’analyser. Renvoie le même wikitexte, après que la PST a été appliquée. Valide uniquement quand utilisé avec <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Inclut les liens de langue fournis par les extensions (à utiliser avec <kbd>$1prop=langlinks</kbd>).",
-       "apihelp-parse-param-section": "Récupérer uniquement le contenu de ce numéro de section.",
+       "apihelp-parse-param-section": "Récupérer uniquement le contenu de ce numéro de section ou quand <kbd>nouveau</kbd> génère une nouvelle section.\n\nLa <kbd>nouvelle</kbd> section est mise à l’honneur uniquement quand <var>text</var> est spécifié.",
+       "apihelp-parse-param-sectiontitle": "Nouveau titre de section quand <var>section</var> vaut <kbd>nouveau</kbd>.\n\nÀ la différence de la modification de page, cela ne revient pas à <var>summary</var> quand il est omis ou vide.",
        "apihelp-parse-param-disablepp": "Désactiver le rapport PP de la sortie de l’analyseur.",
        "apihelp-parse-param-disableeditsection": "Désactiver les liens de modification de section de la sortie de l’analyseur.",
        "apihelp-parse-param-generatexml": "Générer un arbre d’analyse XML (nécessite le modèle de contenu <code>$1</code>).",
        "apihelp-query+imageusage-param-namespace": "L’espace de noms à énumérer.",
        "apihelp-query+imageusage-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+imageusage-param-filterredir": "Comment filtrer les redirections. Si mis à nonredirects quand $1redirect est activé, cela ne s’appliquera qu’au second niveau.",
-       "apihelp-query+imageusage-param-limit": "Combien de pages renvoyer au total. Si $1redirect est activé, la limite s’applique à chaque niveau séparément (ce qui veut dire que vous pouvez obtenir jusqu’à 2 * limite résultats).",
+       "apihelp-query+imageusage-param-limit": "Combien de pages renvoyer au total. Si <var>$1redirect</var> est activé, la limite s’applique à chaque niveau séparément (ce qui veut dire que jusqu’à 2 * <var>$1limit</var> résultats peuvent être renvoyés).",
        "apihelp-query+imageusage-param-redirect": "Si le lien vers une page est une redirection, trouver toutes les pages qui ont aussi un lien vers cette redirection. La limite maximale est divisée par deux.",
        "apihelp-query+imageusage-example-simple": "Afficher les pages utilisant [[:File:Albert Einstein Head.jpg]]",
        "apihelp-query+imageusage-example-generator": "Obtenir des informations sur les pages utilisant [[:File:Albert Einstein Head.jpg]]",
        "apihelp-query+info-paramvalue-prop-readable": "Si l’utilisateur peut lire cette page.",
        "apihelp-query+info-paramvalue-prop-preload": "Fournit le texte renvoyé par EditFormPreloadText.",
        "apihelp-query+info-paramvalue-prop-displaytitle": "Fournit la manière dont le titre de la page est réellement affiché.",
+       "apihelp-query+info-param-testactions": "Tester si l’utilisateur actuel peut effectuer certaines actions sur la page.",
        "apihelp-query+info-param-token": "Utiliser plutôt [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-query+info-example-simple": "Obtenir des informations sur la page <kbd>Main Page</kbd>.",
        "apihelp-query+info-example-protection": "Obtenir des informations générale et de protection sur la page <kbd>Main Page</kbd>.",
        "apihelp-query+links-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+links-example-simple": "Obtenir les liens de la page <kbd>Main Page</kbd>",
        "apihelp-query+links-example-generator": "Obtenir des informations sur tous les liens de page dans <kbd>Main Page</kbd>.",
-       "apihelp-query+links-example-namespaces": "Obtenir les liens de [[Main Page]] dans les espaces de nom Utilisateur et Modèle",
+       "apihelp-query+links-example-namespaces": "Obtenir les liens de la page <kbd>Accueil</kbd> dans les espaces de nom {{ns:user}} et {{ns:template}}.",
        "apihelp-query+linkshere-description": "Trouver toutes les pages ayant un lien vers les pages données.",
        "apihelp-query+linkshere-param-prop": "Quelles propriétés obtenir :\n;pageid:ID de chaque page.\n;title:Titre de chaque page.\n;redirect:Indique si la page est une redirection.",
        "apihelp-query+linkshere-param-namespace": "Inclure uniquement les pages dans ces espaces de nom.",
        "apihelp-query+querypage-param-page": "Le nom de la page spéciale. Remarque, ce nom est sensible à la casse.",
        "apihelp-query+querypage-param-limit": "Nombre de résultats à renvoyer.",
        "apihelp-query+querypage-example-ancientpages": "Renvoyer les résultats de [[Special:Ancientpages]].",
-       "apihelp-query+random-description": "Obtenir un ensemble de pages au hasard.\n\nLes pages sont listées dans un ordre prédéterminé, seul le point de départ est aléatoire. Par exemple, cela signifie que si la première page sur votre liste est « Accueil », la seconde sera *toujours* « Liste des singes de fiction », la troisième « Liste de personnes figurant sur les timbres de Vanuatu », etc.\n\nSi le nombre de page dans l’espace de nom est inférieur à $1limit, vous obtiendrez moins de page. Vous n'obtiendrez jamais deux fois la même page.",
+       "apihelp-query+random-description": "Obtenir un ensemble de pages au hasard.\n\nLes pages sont listées dans un ordre prédéterminé, seul le point de départ est aléatoire. Par exemple, cela signifie que si la première page dans la liste est <samp>Accueil</samp>, la seconde sera <em>toujours</em> <samp>Liste des singes de fiction</samp>, la troisième <samp>Liste de personnes figurant sur les timbres de Vanuatu</samp>, etc.\n\nSi le nombre de page dans l’espace de nom est inférieur à <var>$1limit</var>, moins de pages seront renvoyées. La même page ne sera jamais renvoyée deux fois.",
        "apihelp-query+random-param-namespace": "Renvoyer seulement des pages de ces espaces de noms.",
        "apihelp-query+random-param-limit": "Limite sur le nombre de pages aléatoires renvoyées.",
        "apihelp-query+random-param-redirect": "Charger une redirection aléatoire plutôt qu’une page aléatoire.",
        "apihelp-query+search-example-text": "Rechercher des textes pour <kbd>signification</kbd>.",
        "apihelp-query+search-example-generator": "Obtenir les informations sur les pages renvoyées par une recherche de <kbd>signification</kbd>.",
        "apihelp-query+siteinfo-description": "Renvoyer les informations générales sur le site.",
-       "apihelp-query+siteinfo-param-prop": "Quelles informations obtenir :\n;general:Information globale du système.\n;namespaces:Liste des espaces de nom déclarés et leur nom canonique.\n;namespacealiases:Liste des alias des espaces de nom déclarés.\n;specialpagealiases:Liste des alias des pages spéciales.\n;magicwords:Liste des mots magiques et leurs alias.\n;statistics:Renvoie les statistiques du site.\n;interwikimap:Renvoie la correspondance interwiki (éventuellement filtrée, éventuellement localisée en utilisant <var>$1inlanguagecode</var>).\n;dbrepllag:Renvoie le serveur de base de donnée avec la plus grande latence de réplication.\n;usergroups:Renvoie les groupes utilisateur et les droits associés.\n;extensions:Renvoie les extensions installées sur le wiki.\n;fileextensions:Renvoie la liste des extensions de fichier autorisées au téléchargement.\n;rightsinfo:Renvoie l’information sur les droits du wiki (sa licence), si elle est disponible.\n;restrictions:Renvoie l’information sur les types de restriction disponibles (protection).\n;languages:Renvoie une liste des langues que supporte MédiaWiki (éventuellement localisé en utilisant <var>$1inlanguagecode</var>).\n;skins:Renvoie une liste de tous les habillages activés (éventuellement localisé en utilisant <var>$1inlanguagecode</var>, sinon dans la langue du contenu).\n;extensiontags:Renvoie une liste des balises d’extension de l’analyseur.\n;functionhooks:Renvoie une liste des accroches de fonction de l’analyseur.\n;showhooks:Renvoie une liste de toutes les accroches souscrites (contenu de <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).\n;variables:Renvoie une liste des IDs de variable.\n;protocols:Renvoie une liste des protocoles qui sont autorisés dans les liens externes.\n;defaultoptions:Renvoie les valeurs par défaut pour les préférences utilisateur.",
+       "apihelp-query+siteinfo-param-prop": "Quelles informations obtenir :\n;general:Information globale du système.\n;namespaces:Liste des espaces de nom déclarés et leur nom canonique.\n;namespacealiases:Liste des alias des espaces de nom déclarés.\n;specialpagealiases:Liste des alias des pages spéciales.\n;magicwords:Liste des mots magiques et leurs alias.\n;statistics:Renvoie les statistiques du site.\n;interwikimap:Renvoie la correspondance interwiki (éventuellement filtrée, éventuellement localisée en utilisant <var>$1inlanguagecode</var>).\n;dbrepllag:Renvoie le serveur de base de donnée avec la plus grande latence de réplication.\n;usergroups:Renvoie les groupes utilisateur et les droits associés.\n;libraries:Renvoie les bibliothèques installées sur le wiki.\n;extensions:Renvoie les extensions installées sur le wiki.\n;fileextensions:Renvoie la liste des extensions de fichier autorisées au téléchargement.\n;rightsinfo:Renvoie l’information sur les droits du wiki (sa licence), si elle est disponible.\n;restrictions:Renvoie l’information sur les types de restriction disponibles (protection).\n;languages:Renvoie une liste des langues que supporte MédiaWiki (éventuellement localisé en utilisant <var>$1inlanguagecode</var>).\n;skins:Renvoie une liste de tous les habillages activés (éventuellement localisé en utilisant <var>$1inlanguagecode</var>, sinon dans la langue du contenu).\n;extensiontags:Renvoie une liste des balises d’extension de l’analyseur.\n;functionhooks:Renvoie une liste des accroches de fonction de l’analyseur.\n;showhooks:Renvoie une liste de toutes les accroches souscrites (contenu de <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).\n;variables:Renvoie une liste des IDs de variable.\n;protocols:Renvoie une liste des protocoles qui sont autorisés dans les liens externes.\n;defaultoptions:Renvoie les valeurs par défaut pour les préférences utilisateur.",
        "apihelp-query+siteinfo-param-filteriw": "Renvoyer uniquement les entrées locales ou uniquement les non locales de la correspondance interwiki.",
        "apihelp-query+siteinfo-param-showalldb": "Lister tous les serveurs de base de données, pas seulement celui avec la plus grande latence.",
        "apihelp-query+siteinfo-param-numberingroup": "Liste le nombre d’utilisateurs dans les groupes.",
        "apihelp-query+stashimageinfo-example-params": "Renvoie les vignettes pour deux fichiers mis en réserve",
        "apihelp-query+tags-description": "Lister les balises de modification.",
        "apihelp-query+tags-param-limit": "Le nombre maximal de balises à lister.",
-       "apihelp-query+tags-param-prop": "Quelles propriétés récupérer :\n;name:Ajoute le nom de la balise.\n;displayname:Ajoute le message système pour la balise.\n;description:Ajoute la description de la balise.\n;hitcount:Ajoute le nombre de révisions qui ont cette balise.\n;defined:Indique si la balise est définie.",
+       "apihelp-query+tags-param-prop": "Quelles propriétés récupérer :\n;name:Ajoute le nom de la balise.\n;displayname:Ajoute le message système pour la balise.\n;description:Ajoute la description de la balise.\n;hitcount:Ajoute le nombre de révisions et d’entrées du journal qui ont cette balise.\n;defined:Indique si la balise est définie.\n;source:Obtient les sources de la balise, ce qui comprend <samp>extension</samp> pour les balises définies par une extension et <samp>manual</samp> pour les balises pouvant être appliquées manuellement par les utilisateurs.\n;active:Si la balise est encore appliquée.",
        "apihelp-query+tags-example-simple": "Lister les balises disponibles",
        "apihelp-query+templates-description": "Renvoie toutes les pages incluses dans les pages fournies.",
        "apihelp-query+templates-param-namespace": "Afficher les modèles uniquement dans ces espaces de nom.",
        "apihelp-query+templates-param-limit": "Combien de modèles renvoyer.",
        "apihelp-query+templates-param-templates": "Lister uniquement ces modèles. Utile pour vérifier si une certaine page utilise un modèle donné.",
        "apihelp-query+templates-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+templates-example-simple": "Obtenir les modèles de [[Main Page]]",
+       "apihelp-query+templates-example-simple": "Obtenir les modèles utilisés sur la page <kbd>Accueil</kbd>.",
        "apihelp-query+templates-example-generator": "Obtenir des informations sur les pages modèle utilisé sur <kbd>Main Page</kbd>.",
        "apihelp-query+templates-example-namespaces": "Obtenir les pages des espaces de nom {{ns:user}} et {{ns:template}} qui sont inclues dans la page <kdb>Main Page<kdb>.",
        "apihelp-query+tokens-description": "Récupère les jetons pour les actions de modification de données.",
        "apihelp-query+users-param-users": "Une liste des utilisateurs sur lesquels obtenir de l’information.",
        "apihelp-query+users-param-token": "Utiliser plutôt <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-query+users-example-simple": "Renvoyer des informations pour l'utilisateur <kbd>Exemple</kbd>.",
-       "apihelp-query+watchlist-description": "Obtenir les modifications récentes des pages dans la liste de suivi de l’utilisateur connecté.",
+       "apihelp-query+watchlist-description": "Obtenir les modifications récentes des pages dans la liste de suivi de l’utilisateur actuel.",
        "apihelp-query+watchlist-param-allrev": "Inclure les multiples révisions de la même page dans l’intervalle de temps fourni.",
        "apihelp-query+watchlist-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+watchlist-param-end": "L’horodatage auquel arrêter l’énumération.",
        "apihelp-query+watchlist-example-generator": "Chercher l’information de la page sur les pages récemment modifiées de la liste de suivi de l’utilisateur actuel",
        "apihelp-query+watchlist-example-generator-rev": "Chercher l’information de la révision pour les modifications récentes des pages de la liste de suivi de l’utilisateur actuel",
        "apihelp-query+watchlist-example-wlowner": "Lister la révision de tête des pages récemment modifiées de la liste de suivi de l'utilisateur <kbd>Exemple</kbd>.",
-       "apihelp-query+watchlistraw-description": "Obtenir toutes les pages de la liste de suivi de l’utilisateur connecté.",
+       "apihelp-query+watchlistraw-description": "Obtenir toutes les pages de la liste de suivi de l’utilisateur actuel.",
        "apihelp-query+watchlistraw-param-namespace": "Lister uniquement les pages dans les espaces de nom fournis.",
        "apihelp-query+watchlistraw-param-limit": "Combien de résultats renvoyer au total par requête.",
        "apihelp-query+watchlistraw-param-prop": "Quelles propriétés supplémentaires obtenir :\n;changed:Ajoute l’horodatage de la dernière notification de l’utilisateur à propos de la modification.",
        "apihelp-revisiondelete-example-revision": "Masquer le contenu de la révision <kbd>12345</kbd> de la page <kbd>Main Page</kbd>",
        "apihelp-revisiondelete-example-log": "Masquer toutes les données de l’entrée de journal <kbd>67890</kbd> avec le motif <kbd>Violation de Biographie de Personne Vivante</kbd>.",
        "apihelp-rollback-description": "Annuler la dernière modification de la page.\n\nSi le dernier utilisateur à avoir modifié la page a fait plusieurs modifications sur une ligne, elles seront toutes annulées.",
-       "apihelp-rollback-param-title": "Titre de la page que vous voulez restaurer. Impossible à utiliser avec $1pageid.",
-       "apihelp-rollback-param-pageid": "ID de la page que vous voulez restaurer. Impossible à utiliser avec $1title.",
+       "apihelp-rollback-param-title": "Titre de la page à restaurer. Impossible à utiliser avec <var>$1pageid</var>.",
+       "apihelp-rollback-param-pageid": "ID de la page à restaurer. Impossible à utiliser avec <var>$1title</var>.",
        "apihelp-rollback-param-user": "Nom de l’utilisateur dont les modifications doivent être annulées.",
        "apihelp-rollback-param-summary": "Personnaliser le résumé de la modification. S’il est vide, le résumé par défaut sera utilisé.",
        "apihelp-rollback-param-markbot": "Marquer les modifications annulées et les modifications annulées comme robot.",
-       "apihelp-rollback-param-watchlist": "Ajouter ou supprimer la page de votre liste de suivi sans condition, utiliser les préférences ou ne pas modifier le suivi.",
+       "apihelp-rollback-param-watchlist": "Ajouter ou supprimer la page de la liste de suivi de l’utilisateur actuel sans condition, utiliser les préférences ou ne pas modifier le suivi.",
        "apihelp-rollback-example-simple": "Annuler les dernières modifications à [<kbd>Main Page</kbd> par l’utilisateur <kbd>Exemple</kbd>.",
        "apihelp-rollback-example-summary": "Annuler les dernières modifications de la page <kbd>Main Page</kbd> par l’utilisateur à l’adresse IP <kbd>192.0.2.5</kbd> avec le résumé <kbd>Annulation de vandalisme<kbd>, et marquer ces modifications et l’annulation comme modifications de robots.",
        "apihelp-rsd-description": "Exporter un schéma RSD (Découverte Très Simple).",
        "apihelp-undelete-param-reason": "Motif de restauration.",
        "apihelp-undelete-param-timestamps": "Horodatages des révisions à restaurer. Si <var>$1timestamps</var> et <var>$1fileids</var> sont vides, toutes seront restaurées.",
        "apihelp-undelete-param-fileids": "IDs des révisions de fichier à restaurer. Si <var>$1timestamps</var> et <var>$1fileids</var> sont vides, toutes seront restaurées.",
-       "apihelp-undelete-param-watchlist": "Ajouter ou supprimer la page de votre liste de suivi sans condition, utiliser les préférences ou ne pas modifier le suivi.",
+       "apihelp-undelete-param-watchlist": "Ajouter ou supprimer la page de la liste de suivi de l’utilisateur actuel sans condition, utiliser les préférences ou ne pas modifier le suivi.",
        "apihelp-undelete-example-page": "Annuler la suppression de la page <kbd>Main Page</kbd>.",
        "apihelp-undelete-example-revisions": "Annuler la suppression de deux révisions de la page <kbd>Main Page</kbd>.",
        "apihelp-upload-description": "Télécharger un fichier, ou obtenir l’état des téléchargements en cours.\n\nPlusieurs méthodes sont disponibles :\n* Télécharger directement le contenu du fichier, en utilisant le paramètre <var>$1file</var>.\n* Télécharger le fichier par morceaux, en utilsiant les paramètres <var>$1filesize</var>, <var>$1chunk</var>, and <var>$1offset</var>.* Pour que le serveur MédiaWiki cherche un fichier depuis une URL, utiliser le paramètre <var>$1url</var>.\n* Terminer un téléchargement précédent qui a échoué à cause d’avertissements, en utilisant le paramètre <var>$1filekey</var>.\nNoter que le POST HTTP doit être fait comme un téléchargement de fichier (par ex. en utilisant <code>multipart/form-data</code>) en envoyant le <code>multipart/form-data</code>.",
        "apihelp-upload-param-comment": "Télécharger le commentaire. Utilisé aussi comme texte de la page initiale pour les nouveaux fichiers si <var>$1text</var> n’est pas spécifié.",
        "apihelp-upload-param-text": "Texte de page initiale pour les nouveaux fichiers.",
        "apihelp-upload-param-watch": "Suivre la page.",
-       "apihelp-upload-param-watchlist": "Ajouter ou supprimer sans condition la page de votre liste de suivi, utiliser les préférences ou ne pas changer le suivi.",
+       "apihelp-upload-param-watchlist": "Ajouter ou supprimer sans condition la page de la liste de suivi de l’utilisateur actuel, utiliser les préférences ou ne pas changer le suivi.",
        "apihelp-upload-param-ignorewarnings": "Ignorer tous les avertissements.",
        "apihelp-upload-param-file": "Contenu du fichier.",
        "apihelp-upload-param-url": "URL où chercher le fichier.",
        "apihelp-wddx-description": "Extraire les données au format WDDX.",
        "apihelp-wddxfm-description": "Extraire les données au format WDDX (affiché proprement en HTML).",
        "apihelp-xml-description": "Extraire les données au format XML.",
-       "apihelp-xml-param-xslt": "Si spécifié, ajoute &lt;xslt&gt; comme feuille de style. Ce devrait être une page du wiki dans l’espace de noms MediaWiki dont le nom de page se termine par « .xsl ».",
+       "apihelp-xml-param-xslt": "Si spécifié, ajoute la page nommée comme une feuille de style XSL. La valeur doit être un titre dans l’espace de noms {{ns:mediawiki}} se terminant par <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Si spécifié, ajoute un espace de noms XML.",
        "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-prettyprint-header": "Vous regardez la représentation HTML du format $1. HTML est utile pour le débogage, mais inapproprié pour être utilisé dans une application.$2\n\nSpécifiez le paramètre format pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez format=$2.\n\nVoyez la [https://www.mediawiki.org/wiki/API documentation complète], ou l’ [[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
+       "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.$2\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-orm-param-props": "Champs à rechercher.",
        "api-orm-param-limit": "Nombre maximal de lignes à renvoyer.",
        "api-pageset-param-titles": "Une liste des titres sur lesquels travailler.",
index 40bc7e9..b7171f4 100644 (file)
@@ -23,6 +23,7 @@
        "apihelp-main-param-uselang": "Linga a usar para a tradución de mensaxes. Pode consultarse unha lista de códigos en <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> con <kbd>siprop=languages</kbd>, ou especificando <kbd>user</kbd> coa preferencia de lingua do usuario actual, ou especificando <kbd>content</kbd> para usar a lingua do contido desta wiki.",
        "apihelp-block-description": "Bloquear un usuario.",
        "apihelp-block-param-user": "Nome de usuario, dirección ou rango de IPs que quere bloquear.",
+       "apihelp-block-param-expiry": "Tempo de caducidade. Pode ser relativo (p. ex.<kbd>5 meses</kbd> ou <kbd>2 semanas</kbd>) ou absoluto (p. ex. 2014-09-18T12:34:56Z</kbd>). Se se pon kbd>infinite</kbd>, <kbd>indefinite</kbd>, ou <kbd>never</kbd>, o bloqueo nunca caducará.",
        "apihelp-block-param-reason": "Motivo para o bloqueo.",
        "apihelp-block-param-anononly": "Bloquear só usuarios anónimos (é dicir, desactivar edicións anónimas desta dirección IP).",
        "apihelp-block-param-nocreate": "Previr a creación de contas.",
        "apihelp-expandtemplates-param-title": "Título da páxina.",
        "apihelp-expandtemplates-param-text": "Sintaxis wiki a converter.",
        "apihelp-expandtemplates-param-revid": "ID de revisión, para <nowiki>{{REVISIONID}}</nowiki> e variables similares.",
+       "apihelp-expandtemplates-param-prop": "Pezas de información a retornar:\n;wikitext:O texto wiki expandido.\n;categories:Calquer categoría presente na entrada que non estea representada na saída do texto wiki\n;properties:Propiedades da páxina definidas por palabras máxicas expandidas no texto wiki\n;volatile:Definir se a saída é volátil e se non debe usarse noutra parte da páxina.\n;ttl:Tempo máximo a partir do cal os cachés do resultado deben invalidarse.\n;parsetree:O análise sintáctico en árbore do XML de entrada.\nTeña en conta que se non se selecciona ningún valor o resultado conterá o texto wiki, pero a saída estará nun formato desprezado.",
        "apihelp-expandtemplates-param-includecomments": "Cando queria incluír comentarios HTML na saída.",
        "apihelp-expandtemplates-param-generatexml": "Xenerar árbore de análise XML (reemprazado por $1prop=parsetree).",
        "apihelp-expandtemplates-example-simple": "Expandir o wikitexto <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>.",
        "apihelp-logout-description": "Terminar e limpar datos de sesión.",
        "apihelp-logout-example-logout": "Cerrar a sesión do usuario actual",
        "apihelp-managetags-description": "Realizar tarefas de xestión relacionadas coa modificación de etiquetas.",
+       "apihelp-managetags-param-operation": "Que operación realizar:\n;create:Crear unha nova etiqueta de modificación para uso manual.\n;delete:Borar unha etiqueta de modificación da base de datos, incluíndo o borrado da etiqueta de todas as revisións, entradas de cambios recentes e entradas de rexistro onde estea a usarse.\n;activate:Activar unha etiqueta de modificación, permitindo que os usuarios a usen manualmente.\n;deactivate:Desactivar unha etiqueta de modificación, impedindo que os usuarios a usen manualmente.",
+       "apihelp-managetags-param-tag": "Etiqueta para crear, borrar, activar ou desactivar. Para a creación da etiqueta, a etiqueta non pode existir previamente. Para o borrado da etiqueta, a etiqueta debe existir. Para a activación da etiqueta, a etiqueta debe existir e non pode ser usada por unha extensión. Para desactivar unha etiqueta, a etiqueta debe estar activa e definida manualmente.",
        "apihelp-managetags-param-reason": "Un motivo opcional para crear, borrar, activar ou desactivar a etiqueta.",
        "apihelp-managetags-param-ignorewarnings": "Ignorar calquera aviso que apareza durante a operación.",
        "apihelp-managetags-example-create": "Crear unha etiqueta chamada <kbd>publicidade</kbd> coa razón <kbd>Para usar en vixiancia de edicións</kbd>",
        "apihelp-paraminfo-param-mainmodule": "Obter información sobre o módulo principal (nivel superior). No canto use <kbd>$1modules=main</kbd>.",
        "apihelp-paraminfo-param-pagesetmodule": "Obter información sobre o módulo pageset (proporcionando títulos= e amigos).",
        "apihelp-paraminfo-param-formatmodules": "Lista dos nomes de módulo de formato (valores do parámetro <var>formato</var>). No canto use <var>$1modules</kbd>.",
+       "apihelp-paraminfo-example-1": "Amosar información para <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd>, e <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>.",
        "apihelp-parse-param-title": "Título da páxina á que pertence o texto. Se non se indica, debe especificarse <var>$1contentmodel</var>, e [[API]] usarase como o título.",
        "apihelp-parse-param-text": "Texto a analizar. Use <var>$1title</var> ou <var>$1contentmodel</var> para controlar o modelo de contido.",
        "apihelp-parse-param-summary": "Resumo a analizar.",
        "apihelp-parse-param-redirects": "Se <var>$1page</var> ou <var>$1pageid</var> apuntar a unha redirección, resólvea.",
        "apihelp-parse-param-oldid": "Analizar o contido desta revisión. Ignora <var>$1page</var> e <var>$1pageid</var>.",
        "apihelp-parse-param-pst": "Fai unha transformación antes de gardar a entrada antes de analizala. Válida unicamente para usar con texto.",
+       "apihelp-parse-param-onlypst": "Facer unha transformación antes de gardar (PST) a entrada, pero sen analizala. Devolve o mesmo wikitexto, despois de que a PST foi aplicada. Só válida cando se usa con <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Inclúe ligazóns de idioma proporcionadas polas extensións (para usar con <kbd>$1prop=langlinks</kbd>).",
-       "apihelp-parse-param-section": "Recuperar unicamente o contido deste número de sección.",
+       "apihelp-parse-param-section": "Recuperar unicamente o contido deste número de sección ou cando <kbd>new</kbd> xera unha nova sección.\n\nA sección <kbd>new</kbd> só é atendida cando se especifica <var>text</var>.",
+       "apihelp-parse-param-sectiontitle": "Novo título de sección cando <var>section</var> é <kbd>new</kbd>.\n\nA diferenza da edición de páxinas, non se oculta no <var>summary</var> cando se omite ou está baleiro.",
        "apihelp-parse-param-disablepp": "Desactivar o informe PP da saída do analizador.",
        "apihelp-parse-param-disableeditsection": "Desactivar as ligazóns de edición de sección da saída do analizador.",
        "apihelp-parse-param-generatexml": "Xenerar unha árbore de análise XML (necesita o modelo de contido <code>$1</code>).",
        "apihelp-protect-param-title": "Título da páxina que quere (des)protexer. Non pode usarse xunto con $1pageid.",
        "apihelp-protect-param-pageid": "Identificador da páxina que quere (des)protexer. Non pode usarse xunto con $1title.",
        "apihelp-protect-param-protections": "Lista dos niveis de protección, con formato <kbd>action=level</kbd> (p.ex. <kbd>edit=sysop</kbd>).\n\n<strong>Nota:</strong> Todas as accións que non estean listadas terán restriccións para ser eliminadas.",
+       "apihelp-protect-param-expiry": "Selos de tempo de caducidade. Se só se indica un selo de tempo, usarase para todas as proteccións. Use <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, ou <kbd>never</kbd>, para unha protección sen caducidade.",
        "apihelp-protect-param-reason": "Razón para (des)protexer.",
        "apihelp-protect-param-cascade": "Activar protección en cascada (p. ex. protexer páxinas incluídas nesta páxina). Ignorado se todos os niveis de protección proporcionados non permiten o uso en cascada.",
        "apihelp-protect-param-watch": "Se se define este parámetro, engadir a páxina que se (des)protexe á lista de vixilancia do usuario actual.",
        "apihelp-query-param-export": "Exportar as revisións actuais de todas as páxinas dadas ou xeneradas.",
        "apihelp-query-param-exportnowrap": "Devolver o XML exportado sen incluílo nun resultado XML (mesmo formato que [[Special:Export]]). Só pode usarse con  $1export.",
        "apihelp-query-param-iwurl": "Se fai falta obter a URL completa se o título é unha ligazón interwiki.",
+       "apihelp-query-param-continue": "Cando está presente, formatea query-continue como pares clave-valor que simplemente serán mesturados na consulta orixinal. Este parámetro debe fixarse a unha cadea baleira na consulta inicial.\n\nEste parámetro está recomendado para todos os novos desenvolvementos, e será o usado por defecto na seguinte versión da API.",
        "apihelp-query-param-rawcontinue": "Actualmente ignorado. No futuro, <var>$1continue</var> virá por defecto e será necesario para recibir os datos en bruto de <samp>query-continue</samp>.",
        "apihelp-query-example-revisions": "Consultar [[Special:ApiHelp/query+siteinfo|información do sitio]] e [[Special:ApiHelp/query+revisions|as revisións]] da <kbd>Páxina Principal</kbd>.",
        "apihelp-query-example-allpages": "Buscar revisións de páxinas que comecen por <kbd>API/</kbd>.",
        "apihelp-query+alldeletedrevisions-param-user": "Só listar revisións deste usuario.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Non listar revisións deste usuario.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Só listar páxinas neste espazo de nomes.",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Nota:</strong> Debido ó [[mw:Manual:$wgMiserMode|modo minimal]], ó usar á vez <var>$1user</var> e <var>$1namespace</var> pode devolver menos resultados de <var>$1limit</var> antes de continuar, en casos extremos, pode que non devolva resultados.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "Usado como xenerador, xenera títulos no canto de IDs de revisión.",
        "apihelp-query+alldeletedrevisions-example-user": "Listar as últimas 50 contribucións borradas do usuario <kbd>Exemplo<kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Listar as 50 primeiras revisións borradas no espazo de nomes principal.",
        "apihelp-query+allredirects-param-to": "Título da redirección na que rematar de enumerar.",
        "apihelp-query+allredirects-param-prefix": "Buscar todas as páxinas que comecen con este valor.",
        "apihelp-query+allredirects-param-unique": "Só mostrar páxinas obxectivo distintas. Non pode usarse con $1prop=ids|fragment|interwiki.\nCando se usa como xenerador, produce páxinas obxectivo no canto de páxinas fonte.",
+       "apihelp-query+allredirects-param-prop": "Que información incluír:\n;ids:Engade o ID da páxina da redirección (non pode usarse con <var>$1unique</var>).\n;title:Engade o título da redirección.\n;fragment:Engade o fragmento da redirección, se o hai (non pode usarse con <var>$1unique</var>).\n;interwiki:Engade o prefixo interwiki da redirección, se o hai (non pode usarse con <var>$1unique</var>).",
        "apihelp-query+allredirects-param-namespace": "Espazo de nomes a enumerar.",
        "apihelp-query+allredirects-param-limit": "Número total de obxectos a devolver.",
        "apihelp-query+allredirects-param-dir": "Dirección na cal listar.",
        "apihelp-query+allusers-param-group": "Só incluír os usuarios nos grupos dados.",
        "apihelp-query+allusers-param-excludegroup": "Excluír usuarios nos grupos dados.",
        "apihelp-query+allusers-param-rights": "Incluír só ós usuarios cos dereitos dados. Non se inclúen grupo implícitos nin autopromocionados como *, usuario ou autoconfirmado.",
+       "apihelp-query+allusers-param-prop": "Que información incluír:\n;blockinfo:Engade información sobre o bloque actual do usuario.\n;groups:Lista de grupos nos que está o usuario. Isto usa máis recursos no servidor e pode devolver menos resultados que o límite.\n;implicitgroups:Lista todos os grupos ós que usuario pertence de forma automática.\n;rights:Lista os dereitos que ten o usuario.\n;editcount:Engade o número de edicións do usuario.\n;registration:Engade o selo de tempo do momento no que se rexistrou o usuario, se está dispoñible (pode ser branco).",
        "apihelp-query+allusers-param-limit": "Número total de nomes de usuario a devolver.",
        "apihelp-query+allusers-param-witheditsonly": "Só listar usuarios que teñan feito edicións.",
        "apihelp-query+allusers-param-activeusers": "Só listar usuarios activos {{PLURAL:$1|no último día|nos $1 últimos días}}.",
        "apihelp-query+backlinks-param-namespace": "Espazo de nomes a enumerar.",
        "apihelp-query+backlinks-param-dir": "Dirección na cal listar.",
        "apihelp-query+backlinks-param-filterredir": "Como filtrar as redireccións. Se o valor é <kbd>nonredirects</kbd> cando <var>$1redirect</var> está activa, só se aplica ó segundo nivel.",
+       "apihelp-query+backlinks-param-limit": "Cantas páxinas devolver. Se <var>$1redirect</var> está activa, aplícase o límite a cada nivel de forma separada (isto significa que poden devolverse ata 2 * <var>$1limit</var> resultados).",
        "apihelp-query+backlinks-param-redirect": "Se a ligazón sobre unha páxina é unha redirección, atopa tamén todas as páxinas que ligan con esa redirección. O límite máximo divídese á metade.",
        "apihelp-query+backlinks-example-simple": "Mostrar ligazóns á <kbd>Páxina principal<kbd>.",
        "apihelp-query+backlinks-example-generator": "Obter a información das páxinas que ligan á <kbd>Páxina principal<kbd>.",
        "apihelp-query+blocks-example-simple": "Listar bloques.",
        "apihelp-query+blocks-example-users": "Lista de bloques de usuarios <kbd>Alice</kbd> e <kbd>Bob</kbd>.",
        "apihelp-query+categories-description": "Listar todas as categorías ás que pertencen as páxinas.",
+       "apihelp-query+categories-param-prop": "Que propiedades adicionais obter para cada categoría:\n;sortkey:Engade a clave de ordenación (cadea hexadecimal) e o prefixo da clave de ordenación (parte lexible) da categoría.\n;timestamp:Engade o selo de tempo de cando se engadíu a categoría.\n;hidden:Pon unha marca nas categorías que están ocultas con _&#95;HIDDENCAT_&#95;.",
        "apihelp-query+categories-param-show": "Tipo de categorías a amosar.",
        "apihelp-query+categories-param-limit": "Cantas categorías devolver.",
        "apihelp-query+categories-param-categories": "Listar só esas categorías. Útil para verificar se unha páxina concreta está nunha categoría determinada.",
        "apihelp-query+categorymembers-description": "Listar tódalas páxinas nunha categoría determinada.",
        "apihelp-query+categorymembers-param-title": "Que categoría enumerar (obrigatorio). Debe incluír o prefixo <kbd>{{ns:category}}:</kbd>. Non pode usarse xunto con <var>$1pageid</var>.",
        "apihelp-query+categorymembers-param-pageid": "ID de páxina da categoría a enumerar. Non se pode usar xunto con <var>$1title</var>.",
+       "apihelp-query+categorymembers-param-prop": "Que información incluír:\n;ids:Engade o ID da páxina.\n;title:Engade o título e o ID do espazo de nomes da páxina.\n;sortkey:Engade a clave de ordenación usada para ordenala na categoría (cadea hexadecimal).\n;sortkeyprefix:Engade o prefixo da clave de ordenación usado para ordenala na categoría (parte lexible da clave de ordenación).\n;type:Engade o tipo no que foi categorizado a páxina (páxina, subcategoría ou ficheiro)\n;timestamp:Engade o selo de tempo no que foi incluída a páxina.",
        "apihelp-query+categorymembers-param-namespace": "Só incluír páxinas nestes espazos de nomes. Decátese de que poden usarse  <kbd>$1type=subcat</kbd> ou <kbd>$1type=file</kbd> no canto de <kbd>$1namespace=14</kbd> ou <kbd>6</kbd>.",
        "apihelp-query+categorymembers-param-type": "Que tipo de membros da categoría incluír. Ignorado cando está activo <kbd>$1sort=timestamp</kbd>.",
        "apihelp-query+categorymembers-param-limit": "Máximo número de páxinas a retornar.",
        "apihelp-query+contributors-param-excluderights": "Excluír usuarios cos dereitos dados. Non se inclúen os dereitos dados a grupos implícitos nin autopromocionados como *, usuario ou autoconfirmado.",
        "apihelp-query+contributors-param-limit": "Número total de contribuidores a devolver.",
        "apihelp-query+contributors-example-simple": "Mostrar os contribuidores á páxina <kbd>Main Page</kbd>.",
+       "apihelp-query+deletedrevisions-description": "Obter a información da revisión eliminada.\n\nPode usarse de varias formas:\n#Obter as revisións borradas dun conxunto de páxinas, indicando os títulos ou os IDs das páxinas. Ordenado por título e selo de tempo.\n#Obter datos sobre un conxunto de revisións borradas, indicando os seus IDs e os seus IDs de revisión. Ordenado por ID de revisión.",
        "apihelp-query+deletedrevisions-param-start": "Selo de tempo no que comezar a enumeración. Ignorado cando se está procesando unha lista de IDs de revisións.",
        "apihelp-query+deletedrevisions-param-end": "Selo de tempo no que rematar a enumeración. Ignorado cando se está procesando unha lista de IDs de revisións.",
        "apihelp-query+deletedrevisions-param-tag": "Só listar revisións marcadas con esta etiqueta.",
        "apihelp-query+deletedrevisions-param-user": "Só listar revisións deste usuario.",
        "apihelp-query+deletedrevisions-param-excludeuser": "Non listar revisións deste usuario.",
        "apihelp-query+deletedrevisions-param-limit": "Máximo número de revisións a listar.",
+       "apihelp-query+deletedrevisions-param-prop": "Que propiedades obter:\n;revid:Engade o ID da modificación borrada.\n;parentid:Engade o ID da modificación da modificación anterior da páxina.\n;user:Engade o usuario que fixo a modificación.\n;userid:Engade o ID do usuario que fixo a modificación.\n;comment:Engade o comentario da modificación.\n;parsedcomment:Engade o comentario analizado da modificación.\n;minor:Engade unha marca se a modificación é menor.\n;len:Engade a lonxitude (bytes) da modificación.\n;sha1:Engade a función SHA-1 (base 16) da modificación.\n;content:Engade o contido da modificación.\n;tags:Marcas da modificación.",
        "apihelp-query+deletedrevisions-example-titles": "Listar as revisións borradas das páxinas <kbd>Main Page</kbd> e <kbd>Talk:Main Page</kbd>, con contido.",
        "apihelp-query+deletedrevisions-example-revids": "Listar a información para a revisión borrada <kbd>123456</kbd>.",
+       "apihelp-query+deletedrevs-description": "Lista as modificación borradas.\n\nOpera según tres modos:\n#Lista as modificacións borradas dos títulos indicados, ordenados por selo de tempo.\n#Lista as contribucións borradas do usuario indicado, ordenadas por selo de tempo (sen indicar títulos).\n#Lista todas as modificacións borradas no espazo de nomes indicado, ordenadas por título e selo de tempo (sen indicar títulos, sen fixar $1user).\n\nCertos parámetros só se aplican a algúns modos e son ignorados noutros.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Modo|Modos}}: $2",
        "apihelp-query+deletedrevs-param-start": "Selo de tempo no que comezar a enumeración.",
        "apihelp-query+deletedrevs-param-end": "Selo de tempo para rematar a enumeración.",
        "apihelp-query+extlinks-param-expandurl": "Expandir as URLs relativas a un protocolo co protocolo canónico.",
        "apihelp-query+extlinks-example-simple": "Obter unha de ligazóns externas á <kbd>Páxina Principal<kbd>.",
        "apihelp-query+exturlusage-description": "Enumerar páxinas que conteñen unha dirección URL dada.",
+       "apihelp-query+exturlusage-param-prop": "Que información incluír:\n;ids:Engade o ID da páxina.\n;title:Engade o título e o ID do espazo de nomes da páxina.\n;url:Engade a URL usada na páxina.",
        "apihelp-query+exturlusage-param-protocol": "Protocolo da URL. Se está baleiro e está activo <var>$1query</var>, o protocolo é <kbd>http</kbd>. Deixar esa variable e a <var>$1query</var> baleiras para listar todas as ligazóns externas.",
        "apihelp-query+exturlusage-param-query": "Buscar unha cadea sen protocolo. Ver [[Special:LinkSearch]]. Deixar baleira para listar todas as ligazóns externas.",
        "apihelp-query+exturlusage-param-namespace": "Espazo de nomes a enumerar.",
        "apihelp-query+imageinfo-param-urlwidth": "Se $2prop=url está definido, será devolta unha URL a unha imaxe escalada a este ancho.\nPor razóns de rendimento se se usa esta opción, non se devolverán máis de $1 imaxes.",
        "apihelp-query+imageinfo-param-urlheight": "Similar a $1urlwidth.",
        "apihelp-query+imageinfo-param-metadataversion": "Versión de metadata a usar. Se <kbd>latest</kbd> está especificado, usa a última versión. Por defecto <kbd>1</kbd> para compatibilidade con versións anteriores.",
+       "apihelp-query+imageinfo-param-extmetadatalanguage": "Que lingua buscar en extmetadata. Isto afecta tanto á tradución a buscar, se hai varias dispoñibles, como a como se formatean cousas como os números e outros valores.",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "Se as traducións para a propiedade extmetadata están dispoñibles, búscaas todas.",
        "apihelp-query+imageinfo-param-extmetadatafilter": "Se está especificado e non baleiro, só se devolverán esas claves para $1prop=extmetadata.",
        "apihelp-query+imageinfo-param-localonly": "Só buscar ficheiros no repositorio local.",
        "apihelp-query+imageusage-param-pageid": "ID de páxina a buscar. Non pode usarse xunto con $1title.",
        "apihelp-query+imageusage-param-namespace": "Nome de espazos a numerar.",
        "apihelp-query+imageusage-param-dir": "Dirección na cal listar.",
+       "apihelp-query+imageusage-param-filterredir": "Como filtrar redireccións. Se se fixa a non redirección cando está activo $1redirect, isto só se aplica ó segundo nivel.",
+       "apihelp-query+imageusage-param-limit": "Cantas páxinas devolver. Se <var>$1redirect</var> está activa, aplícase o límite a cada nivel de forma separada (isto significa que poden devolverse ata 2 * <var>$1limit</var> resultados).",
+       "apihelp-query+imageusage-param-redirect": "Se a ligazón sobre unha páxina é unha redirección, atopa tamén todas as páxinas que ligan con esa redirección. O límite máximo divídese á metade.",
+       "apihelp-query+imageusage-example-simple": "Mostrar as páxinas que usan [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+imageusage-example-generator": "Obter información sobre as páxinas que usan [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+info-description": "Obter información básica da páxina.",
+       "apihelp-query+info-param-prop": "Que propiedades adicionais obter:",
+       "apihelp-query+info-paramvalue-prop-protection": "Listar o nivel de protección de cada páxina.",
+       "apihelp-query+info-paramvalue-prop-talkid": "O ID de páxina da páxina de conversa para cada páxina que non é páxina de conversa.",
+       "apihelp-query+info-paramvalue-prop-watched": "Listar o estado de vixiancia de cada páxina.",
+       "apihelp-query+info-paramvalue-prop-watchers": "O número de vixiantes, se está permitido.",
+       "apihelp-query+info-paramvalue-prop-notificationtimestamp": "O selo de tempo de notificación da lista de vixiancia de cada páxina.",
+       "apihelp-query+info-paramvalue-prop-subjectid": "O ID de páxina da páxina pai para cada páxina de conversa.",
+       "apihelp-query+info-paramvalue-prop-url": "Devolve unha URL completa, unha URL de modificación, e a URL canónica de cada páxina.",
+       "apihelp-query+info-paramvalue-prop-readable": "Se o usuario pode ler esta páxina.",
+       "apihelp-query+info-paramvalue-prop-preload": "Devolve o texto devolto por EditFormPreloadText.",
        "apihelp-query+info-paramvalue-prop-displaytitle": "Devolve a forma na que se visualiza actualmente o título da páxina.",
+       "apihelp-query+info-param-testactions": "Proba se o usuario actual pode realizar certas accións na páxina.",
        "apihelp-query+info-param-token": "Usar  [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] no canto diso.",
        "apihelp-query+info-example-simple": "Obter información sobre a páxina <kbd>Main Page</kbd>.",
        "apihelp-query+info-example-protection": "Obter información xeral e de protección  sobre a páxina <kbd>Main Page</kbd>.",
+       "apihelp-query+iwbacklinks-description": "Atopar todas as páxina que ligan á ligazón interwiki indicada.\n\nPode usarse para atopar todas as ligazóns cun prefixo, ou todas as ligazóns a un título (co prefixo indicado). Se non se usa ningún parámetro funciona como \"todas as ligazóns interwiki\".",
        "apihelp-query+iwbacklinks-param-prefix": "Prefixo para a interwiki.",
        "apihelp-query+iwbacklinks-param-title": "Ligazón interwiki a buscar. Debe usarse con <var>$1blprefix</var>.",
        "apihelp-query+iwbacklinks-param-limit": "Número total de páxinas a devolver.",
        "apihelp-query+redirects-param-show": "Só mostrar elementos que cumpran estos criterios:\n;fragment:Só mostrar redireccións que teñan un fragmento.\n;!fragment:Só mostrar redireccións que non teñan un fragmento.",
        "apihelp-query+redirects-example-simple": "Obter unha lista de redireccións á [[Main Page]]",
        "apihelp-query+redirects-example-generator": "Obter información sobre tódalas redireccións á [[Main Page]]",
+       "apihelp-query+revisions-description": "Obter información da modificación.\n\nPode usarse de varias formas:\n#Obter datos sobre un conxunto de páxinas (última modificación), fixando os títulos ou os IDs das páxinas.\n#Obter as modificacións da páxina indicada, usando os títulos ou os IDs de páxinas con comezar, rematar ou límite.\n#Obter os datos sobre un conxunto de modificacións fixando os seus IDs cos seus IDs de modificación.",
        "apihelp-query+revisions-paraminfo-singlepageonly": "Só pode usarse cunha única páxina (mode #2).",
        "apihelp-query+revisions-param-startid": "Desde que ID de revisión comezar a enumeración.",
        "apihelp-query+revisions-param-endid": "Rematar a enumeración de revisión neste ID de revisión.",
        "apihelp-query+usercontribs-param-user": "Usuarios para os que recuperar as contribucións.",
        "apihelp-query+usercontribs-param-userprefix": "Recuperar as contribucións de todos os usuarios cuxo nome comece por este valor. Ignora $1user.",
        "apihelp-query+usercontribs-param-namespace": "Só listar contribucións nestes espazos de nomes.",
+       "apihelp-query+usercontribs-param-show": "Só mostrar elementos que cumpran estos criterios, p.ex. só edicións menores: <kbd>$2show=!minor</kbd>.\n\nSe está fixado <kbd>$2show=patrolled</kbd> ou <kbd>$2show=!patrolled</kbd>, as modificacións máis antigas que <var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|segundo|segundos}}) non se mostrarán.",
        "apihelp-query+usercontribs-param-tag": "Só listar revisións marcadas con esta etiqueta.",
        "apihelp-query+usercontribs-param-toponly": "Listar só cambios que son a última revisión.",
        "apihelp-query+usercontribs-example-user": "Mostrar as contribucións do usuario <kbd>Exemplo</kbd>.",
        "apihelp-query+userinfo-example-simple": "Obter información sobre o usuario actual.",
        "apihelp-query+userinfo-example-data": "Obter información adicional sobre o usuario actual.",
        "apihelp-query+users-description": "Obter información sobre unha lista de usuarios.",
+       "apihelp-query+users-param-prop": "Que información incluír:\n;blockinfo:Etiquetas se o usuario está bloqueado, por quen, e por que razón.\n;groups:Lista todos os grupos ós que pertence cada usuario.\n;implicitgroups:Lista os grupos dos que un usuario é membro de forma automatica.\n;rights:Lista todos os dereitos que ten cada usuario.\n;editcount:Engade o contador de edicións do usuario.\n;registration:Engade o selo de tempo do rexistro do usuario.\n;emailable:Marca se o usuario pode e quere recibir correos usando [[Special:Emailuser]].\n;gender:Marca o xénero do usuario. Devolve \"home\", \"muller\" ou \"descoñecido\".",
        "apihelp-query+users-param-users": "Lista de usuarios para os que obter información.",
        "apihelp-query+users-param-token": "Usar <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> no canto diso.",
        "apihelp-query+users-example-simple": "Mostar información para o usuario <kbd>Exemplo</kbd>.",
        "apihelp-rollback-example-summary": "Desfacer as últimas edicións á páxina <kbd>Main Page</kbd> polo usuario da dirección IP <kbd>192.0.2.5</kbd> co resumo de edición <kbd>Revertindo vandalismo</kbd>, marcar esas edicións e a reversión como edicións de bot.",
        "apihelp-rsd-description": "Exportar un esquema RSD (Really Simple Discovery, Descubrimento Moi Simple).",
        "apihelp-rsd-example-simple": "Exportar o esquema RSD.",
+       "apihelp-setnotificationtimestamp-description": "Actualiza o selo de tempo de notificación das páxinas vixiadas.\n\nIsto afecta ó resalte das páxinas modificadas na lista de vixiancia e historial, e o envío de correo cando a preferencia \"Mandarme un correo cando cambie unha páxina da miña lista de vixiancia\" está activa.",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "Traballar en tódalas páxinas vixiadas.",
+       "apihelp-setnotificationtimestamp-param-timestamp": "Selo de tempo ó que fixar a notificación.",
+       "apihelp-setnotificationtimestamp-param-torevid": "Modificación á que fixar o selo de tempo de modificación (só unha páxina).",
+       "apihelp-setnotificationtimestamp-param-newerthanrevid": "Modificación na que fixar o selo de tempo de modificación máis recente (só unha páxina).",
        "apihelp-setnotificationtimestamp-example-all": "Restaurar o estado de notificación para toda a páxina de vixiancia",
        "apihelp-setnotificationtimestamp-example-page": "Restaurar o estado de notificación para a <kbd>Páxina Principal</kbd>.",
+       "apihelp-setnotificationtimestamp-example-pagetimestamp": "Fixar o selo de tempo de notificación para a <kbd>Main page</kbd> de forma que todas as edicións dende o 1 se xaneiro de 2012 queden sen revisar.",
        "apihelp-setnotificationtimestamp-example-allpages": "Restaurar o estado de notificación para as páxinas no espazo de nomes de <kbd>{{ns:user}}</kbd>.",
+       "apihelp-tokens-description": "Obter os identificadores para accións de modificación de datos.\n\nEste módulo está obsoleto e foi reemprazado por [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
+       "apihelp-tokens-param-type": "Tipos de identificadores a consultar.",
+       "apihelp-tokens-example-edit": "Recuperar un identificador de modificación (por defecto).",
+       "apihelp-tokens-example-emailmove": "Recuperar un identificador de correo e un identificador de movemento.",
        "apihelp-unblock-description": "Desbloquear un usuario.",
+       "apihelp-unblock-param-id": "ID do bloque a desbloquear (obtido de <kbd>list=blocks</kbd>). Non pode usarse xunto con <var>$1user</var>.",
+       "apihelp-unblock-param-user": "Nome de usuario, dirección IP ou rango de direccións IP a desbloquear. Non pode usarse xunto con <var>$1id</var>.",
        "apihelp-unblock-param-reason": "Razón para desbloquear.",
        "apihelp-unblock-example-id": "Desbloquear bloqueo ID #<kbd>105</kbd>.",
        "apihelp-unblock-example-user": "Desbloquear usuario <kbd>Bob</kbd> con razón <kbd>Síntoo Bob</kbd>.",
+       "apihelp-undelete-description": "Restaurar modificacións dunha páxina borrada.\n\nUnha lista de modificacións borradas (incluíndo os seus selos de tempo) pode consultarse a través de [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]], e unha lista de IDs de ficheiros borrados pode consultarse a través de [[Special:ApiHelp/query+filearchive|list=filearchive]].",
        "apihelp-undelete-param-title": "Título da páxina a restaurar.",
        "apihelp-undelete-param-reason": "Razón para restaurar.",
+       "apihelp-undelete-param-timestamps": "Selos de tempo das modificacións a restaurar. Se <var>$1timestamps</var> e <var>$1fileids</var> están baleiras, restaurarase todo.",
+       "apihelp-undelete-param-fileids": "IDs das modificacións de ficheiro a restaurar. Se <var>$1timestamps</var> e <var>$1fileids</var> están baleiras, serán restauradas todas.",
        "apihelp-undelete-example-page": "Restaurar a <kbd>Páxina Principal</kbd>.",
        "apihelp-undelete-example-revisions": "Restaurar dúas revisións de <kbd>[[Main Page]]</kbd>.",
+       "apihelp-upload-param-filename": "Nome de ficheiro obxectivo.",
+       "apihelp-upload-param-comment": "Subir comentario. Tamén usado como texto da páxina inicial para ficheiros novos se non se especifica <var>$1text</var>.",
        "apihelp-upload-param-text": "Texto da páxina inicial para novos ficheiros.",
        "apihelp-upload-param-watch": "Vixiar a páxina.",
+       "apihelp-upload-param-watchlist": "Engadir ou eliminar sen condicións a páxina da lista de vixiancia do usuario actual, use as preferencias ou non cambie a vixiancia.",
        "apihelp-upload-param-ignorewarnings": "Ignorar as advertencias.",
        "apihelp-upload-param-file": "Contido do ficheiro.",
+       "apihelp-upload-param-url": "URL onde buscar o ficheiro.",
+       "apihelp-upload-param-filekey": "Clave que identifica unha subida precedente e que foi almacenada temporalmente.",
+       "apihelp-upload-param-sessionkey": "Igual a $1filekey, mantido por razóns de compatibilidade con procesos antigos.",
+       "apihelp-upload-param-stash": "Se está indicado, o servidor almacenará o ficheiro temporalmente no canto de engadilo ó repositorio.",
        "apihelp-upload-param-filesize": "Tamaño de ficheiro completo da carga.",
+       "apihelp-upload-param-offset": "Desaxuste do bloque en bytes.",
+       "apihelp-upload-param-chunk": "Contido do bloque.",
+       "apihelp-upload-param-async": "Facer de forma asíncrona as operacións de ficheiro potencialmente grandes cando sexa posible.",
+       "apihelp-upload-param-asyncdownload": "Facer de forma asíncrona a busca dunha URL.",
+       "apihelp-upload-param-leavemessage": "Se se usa asyncdownload, deixar unha mensaxe na páxina de conversa do usuario cando se remate.",
+       "apihelp-upload-param-statuskey": "Buscar o estado da subida para esta clave de ficheiro (subida por URL).",
+       "apihelp-upload-param-checkstatus": "Só buscar o estado da subida da clave de ficheiro indicada.",
        "apihelp-upload-example-url": "Carga dunha URL",
        "apihelp-upload-example-filekey": "Completar carga que fallou debido a avisos",
+       "apihelp-userrights-description": "Cambiar a pertencia dun usuario a un grupo.",
        "apihelp-userrights-param-user": "Nome de usuario.",
        "apihelp-userrights-param-userid": "ID de usuario.",
        "apihelp-userrights-param-add": "Engadir o usuario a estes grupos.",
        "apihelp-userrights-param-remove": "Eliminar o usuario destes grupos.",
        "apihelp-userrights-param-reason": "Motivo para o cambio.",
+       "apihelp-userrights-example-user": "Engadir o usuario <kbd>FooBot</kbd> ó grupo <kbd>bot</kbd>, e eliminar dos grupos <kbd>sysop</kbd> e <kbd>burócrata</kbd>.",
+       "apihelp-userrights-example-userid": "Engadir ó usuario con ID <kbd>123</kbd> ó grupo <kbd>bot</kbd>, e borralo dos grupos <kbd>sysop</kbd> e <kbd>burócrata</kbd>.",
+       "apihelp-watch-description": "Engadir ou borrar páxinas da lista de vixiancia do usuario actual.",
+       "apihelp-watch-param-title": "Páxina a vixiar/deixar de vixiar. Usar no canto <var>$1titles</var>.",
+       "apihelp-watch-param-unwatch": "Se está definido, a páxina deixará de estar vixiada en vez de vixiada.",
        "apihelp-watch-example-watch": "Vixiar a páxina <kbd>Páxina Principal</kbd>.",
        "apihelp-watch-example-unwatch": "Deixar de vixiar a páxina <kbd>Páxina Principal</kbd>.",
        "apihelp-watch-example-generator": "Vixiar as primeiras páxinas no espazo de nomes principal",
+       "apihelp-format-example-generic": "Formatar o resultado da consulta no formato $1.",
+       "apihelp-dbg-description": "Datos de saída en formato <code>var_export()</code> de PHP.",
+       "apihelp-dbgfm-description": "Datos de saída en formato <code>var_export()</code> de PHP(impresión en HTML).",
+       "apihelp-dump-description": "Datos de saída en formato PHP <code>var_dump()</code>.",
+       "apihelp-dumpfm-description": "Datos de saída en formato <code>var_dump()</code> de PHP(impresión en HTML).",
+       "apihelp-json-description": "Datos de saída en formato JSON.",
+       "apihelp-json-param-callback": "Se está especificado, inclúe a saída na chamada da función indicada. Para maior seguridade, todos os datos específicos do usuario serán restrinxidos.",
+       "apihelp-json-param-utf8": "Se está especificado, codifica a maioría (pero non todos) dos caracteres ASCII como UTF-8 no canto de reemprazalos con secuencias de escape hexadecimais.",
+       "apihelp-jsonfm-description": "Datos de saída en formato JSON(impresión en HTML).",
+       "apihelp-none-description": "Ningunha saída.",
+       "apihelp-php-description": "Datos de saída en formato serializado de PHP.",
+       "apihelp-phpfm-description": "Datos de saída en formato serializado de PHP(impresión en HTML).",
+       "apihelp-rawfm-description": "Datos de saída cos elementos de depuración en formato JSON(impresión en HTML).",
+       "apihelp-txt-description": "Datos de saída en formato PHP <code>print_r()</code>.",
+       "apihelp-txtfm-description": "Datos de saída en formato <code>print_r()</code> de PHP(impresión en HTML).",
+       "apihelp-wddx-description": "Datos de saída en formato WDDX.",
+       "apihelp-wddxfm-description": "Datos de saída en formato WDDX(impresión en HTML).",
+       "apihelp-xml-description": "Datos de saída en formato XML.",
+       "apihelp-xml-param-xslt": "Se está indicado, engade o nome da páxina como unha folla de estilo XSL. O valor debe ser un título no espazo de nomes {{ns:mediawiki}} rematando con <code>.xsl</code>.",
+       "apihelp-xml-param-includexmlnamespace": "Se está indicado, engade un espazo de nomes XML.",
+       "apihelp-xmlfm-description": "Datos de saída en formato XML(impresión en HTML).",
+       "apihelp-yaml-description": "Datos de saída en formato YAML.",
+       "apihelp-yamlfm-description": "Datos de saída en formato YAML(impresión en HTML).",
+       "api-format-title": "Resultado de API de MediaWiki",
+       "api-orm-param-props": "Campos a consultar.",
        "api-orm-param-limit": "Número máximo de filas a mostrar.",
        "api-pageset-param-titles": "Lista de títulos nos que traballar.",
        "api-pageset-param-pageids": "Lista de identificadores de páxina nos que traballar.",
+       "api-pageset-param-revids": "Unha lista de IDs de modificacións sobre as que traballar.",
+       "api-pageset-param-generator": "Obter a lista de páxinas sobre as que traballar executando o módulo de consulta especificado.\n\n<strong>Nota:</strong>Os nomes de parámetro do xerador deben comezar cunha \"g\", vexa os exemplos.",
+       "api-pageset-param-redirects-generator": "Resolver automaticamente as redireccións en <var>$1titles</var>, <var>$1pageids</var>, e <var>$1revids</var>, e nas páxinas devoltas por <var>$1generator</var>.",
+       "api-pageset-param-redirects-nogenerator": "Resolver automaticamente as redireccións en <var>$1titles</var>, <var>$1pageids</var>, e <var>$1revids</var>.",
+       "api-pageset-param-converttitles": "Converter títulos a outras variantes se é preciso. Só funciona se a lingua de contido da wiki soporta a conversión en variantes. As linguas que soportan conversión en variante inclúen $1.",
        "api-help-title": "Axuda da API de MediaWiki",
+       "api-help-lead": "Esta é unha páxina de documentación da API de MediaWiki xerada automaticamente.\n\nDocumentación e exemplos:\nhttps://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Módulo principal",
        "api-help-flag-deprecated": "Este módulo está obsoleto.",
+       "api-help-flag-internal": "<strong>Este módulo é interno ou inestable. </strong> O seu funcionamento pode cambiar sen aviso previo.",
        "api-help-flag-readrights": "Este módulo precisa permisos de lectura.",
        "api-help-flag-writerights": "Este módulo precisa permisos de escritura.",
        "api-help-flag-mustbeposted": "Este módulo só acepta peticións POST.",
        "api-help-param-integer-min": "{{PLURAL:$1|1=O valor debe ser maior |2=Os valores deben ser maiores}} que $2.",
        "api-help-param-integer-max": "{{PLURAL:$1|1=O valor debe ser menor |2=Os valores deben ser menores}} que $3.",
        "api-help-param-integer-minmax": "{{PLURAL:$1|1=O valor debe estar entre $2 e $3 |2=Os valores deben estar entre $2 e $3}}.",
+       "api-help-param-upload": "Debe ser enviado como un ficheiro importado usando multipart/form-data.",
        "api-help-param-multi-separate": "Separe os valores con <kbd>|</kbd>.",
+       "api-help-param-multi-max": "O número máximo de valores é {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} para os bots).",
        "api-help-param-default": "Por defecto: $1",
        "api-help-param-default-empty": "Por defecto: <span class=\"apihelp-empty\">(baleiro)</span>",
+       "api-help-param-token": "Un identificador \"$1\" recuperado por [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
+       "api-help-param-token-webui": "Por compatibilidade, o identificador usado na web UI tamén é aceptado.",
+       "api-help-param-disabled-in-miser-mode": "Desactivado debido ó [[mw:Manual:$wgMiserMode|modo minimal]].",
+       "api-help-param-limited-in-miser-mode": "<strong>Nota:</strong> Debido ó [[mw:Manual:$wgMiserMode|modo minimal]], usar isto pode devolver menos de <var>$1limit</var> resultados antes de seguir, en casos extremos, pode que non se devolvan resultados.",
+       "api-help-param-direction": "En que dirección enumerar:\n;newer:Lista os máis antigos primeiro. Nota: $1start ten que estar antes que $1end.\n;older:Lista os máis novos primeiro (por defecto). Nota: $1start ten que estar despois que $1end.",
+       "api-help-param-continue": "Cando estean dispoñibles máis resultados, use isto para continuar.",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(sen descrición)</span>",
        "api-help-examples": "{{PLURAL:$1|Exemplo|Exemplos}}:",
        "api-help-permissions": "{{PLURAL:$1|Permiso|Permisos}}:",
+       "api-help-permissions-granted-to": "{{PLURAL:$1|Concedida a|Concedidas a}}: $2",
        "api-credits-header": "Créditos"
 }
index 085113d..277f368 100644 (file)
@@ -7,6 +7,11 @@
                ]
        },
        "apihelp-block-description": "Blocca  un utente.",
+       "apihelp-emailuser-description": "Manda un'e-mail ad un utente.",
+       "apihelp-emailuser-param-ccme": "Mandami una copia di questa mail.",
+       "apihelp-expandtemplates-description": "Espandi tutti i template nel wikitesto.",
+       "apihelp-expandtemplates-param-title": "Titolo della pagina.",
+       "apihelp-expandtemplates-param-text": "Wikitesto da convertire.",
        "apihelp-query+recentchanges-example-simple": "Elenco modifiche recenti.",
        "apihelp-upload-example-url": "Carica da un URL.",
        "api-help-parameters": "{{PLURAL:$1|Parametro|Parametri}}:",
index 4c7b20a..e0e32f5 100644 (file)
@@ -28,6 +28,9 @@
        "apihelp-block-param-watchuser": "その利用者またはIPアドレスの利用者ページとトークページをウォッチします。",
        "apihelp-block-example-ip-simple": "IPアドレス <kbd>192.0.2.5</kbd> を <kbd>First strike<kbd> という理由で3日ブロックする",
        "apihelp-block-example-user-complex": "利用者 <kbd>Vandal</kbd> を <kbd>Vandalism</kbd> という理由で無期限ブロックし、新たなアカウント作成とメールの送信を禁止する。",
+       "apihelp-checktoken-param-type": "調べるトークンの種類。",
+       "apihelp-checktoken-param-token": "調べるトークン。",
+       "apihelp-checktoken-example-simple": "<kbd>csrf</kbd> トークンの妥当性を調べる。",
        "apihelp-compare-example-1": "版1と2の差分を生成する。",
        "apihelp-createaccount-description": "新しい利用者アカウントを作成します。",
        "apihelp-createaccount-param-name": "利用者名。",
@@ -36,6 +39,7 @@
        "apihelp-createaccount-param-email": "利用者の電子メールアドレス (任意)。",
        "apihelp-createaccount-param-realname": "利用者の本名 (省略可能)。",
        "apihelp-createaccount-param-mailpassword": "設定されると (その値を問わず)、ランダムなパスワードがその利用者に電子メールで送られます。",
+       "apihelp-createaccount-param-reason": "ログに記録されるアカウント作成の理由 (任意)。",
        "apihelp-createaccount-example-pass": "利用者 <kbd>testuser</kbd> をパスワード <kbd>test123</kbd> として作成する。",
        "apihelp-createaccount-example-mail": "利用者 <kbd>testuser</kbd>を作成し、ランダムに生成されたパスワードをメールで送る",
        "apihelp-delete-description": "ページを削除します。",
        "apihelp-feedcontributions-param-toponly": "最新版の編集のみ表示します。",
        "apihelp-feedcontributions-param-newonly": "ページ作成を伴う編集のみを表示します。",
        "apihelp-feedcontributions-example-simple": "利用者 <kbd>Example</kbd> の投稿記録を取得する。",
+       "apihelp-feedrecentchanges-param-limit": "返す結果の最大数。",
+       "apihelp-feedrecentchanges-param-hideminor": "細部の変更を隠す。",
+       "apihelp-feedrecentchanges-param-hidebots": "ボットによる変更を隠す。",
+       "apihelp-feedrecentchanges-param-hideanons": "未登録利用者による変更を隠す。",
+       "apihelp-feedrecentchanges-param-hideliu": "登録利用者による変更を隠す。",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "巡回済みの変更を隠す。",
+       "apihelp-feedrecentchanges-example-simple": "最近の更新を表示する。",
+       "apihelp-feedrecentchanges-example-30days": "最近30日間の変更を表示する。",
        "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> を使用して下位モジュールを指定できます。",
@@ -87,6 +99,8 @@
        "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-param-xml": "XMLファイルをアップロード",
+       "apihelp-import-param-rootpage": "このページの下位ページとしてインポートする。",
+       "apihelp-import-example-import": "[[meta:Help:Parserfunctions]] をすべての履歴とともに名前空間100 にインポートする。",
        "apihelp-login-param-name": "利用者名。",
        "apihelp-login-param-password": "パスワード。",
        "apihelp-login-param-token": "最初のリクエストで取得したログイントークンです。",
        "apihelp-move-param-unwatch": "そのページと転送ページを現在の利用者のウォッチリストから除去します。",
        "apihelp-move-param-ignorewarnings": "あらゆる警告を無視",
        "apihelp-move-example-move": "<kbd>Badtitle</kbd> を <kbd>Goodtitle</kbd> に転送ページを残さず移動",
+       "apihelp-opensearch-param-search": "検索文字列。",
+       "apihelp-opensearch-param-limit": "返す結果の最大数。",
+       "apihelp-opensearch-param-namespace": "検索する名前空間。",
        "apihelp-opensearch-param-suggest": "<var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> が false の場合、何もしません。",
        "apihelp-paraminfo-description": "API モジュールに関する情報を取得します。",
        "apihelp-patrol-description": "ページまたは版を巡回済みにします。",
index 25d8cd1..4dcc433 100644 (file)
@@ -4,8 +4,12 @@
                        "Purodha"
                ]
        },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page/de|Dokemäntazjohn]]\n* [[mw:API:FAQ/de|Öff jefrohch]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mäileng_Leß]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Aanköndejonge zom <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i>]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Jemäldte Fähler un Wönsch]\n</div>\n<strong>Status:</strong> Alle op heh dä Sigg aanjzeischte Ußwahle sullte donn, ävver et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> wee jrahd noch äntwekeld un et kann sesch alle Nahslangs jädd ändere. Holl Der de [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ Mäileng_Leß med Aanköndejonge], öm automattesch övver Neujeschkeite enfommehrt ze wähde.\n\n<strong>Kapodde Aanfrohe:</strong> Wam_mer kapodde Aanfroheaan et API <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> schek, kritt mer ene <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Transfer Protocol\">HTTP</i>-Kopp ußjejovve met däm Täx „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">MediaWiki-API-Error</code>“ dren, dä mer als ene Schlößel bedraachte kann. Mih dohzoh fengk met op dä Sigg [[mw:API:Errors_and_warnings|<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i>: Fähler un Warnonge]].",
        "apihelp-main-param-action": "Wat för en Aufjahb.",
        "apihelp-main-param-format": "Et Fommaht för ußzejävve.",
+       "apihelp-main-param-smaxage": "Säz <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">s-maxage</code> em Kobb obb esu vill Sekonde. Fähler wähde nit faßjehallde.",
+       "apihelp-main-param-maxage": "Säz <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">max-age</code> em Kobb obb esu vill Sekonde. Fähler wähde nit faßjehallde.",
+       "apihelp-main-param-assert": "Ställ sescher, dat dä Metmaacher enjelogg es (doh för jiff <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">user</kbd> en), udder ene Bot es (doh för jiff <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">bot</kbd> en).",
        "apihelp-main-param-requestid": "Jehde Aanjahb vun heh weed widder med ußjejovve. Esuh kam_mer einzel Affrohre ussenein hallde.",
        "apihelp-main-param-servedby": "Donn däm ẞööver, dä et jedonn hät, singe Nahme med ußjävve.",
        "apihelp-main-param-curtimestamp": "Donn de aktoälle Zigg un et Dattum med ußjävve.",
@@ -64,6 +68,7 @@
        "apihelp-expandtemplates-param-text": "Dä Wikitäx zom ömwandelle.",
        "apihelp-feedcontributions-param-feedformat": "Däm Kannahl sing Fommaht.",
        "apihelp-feedcontributions-param-year": "Vum johr un fröhjer.",
+       "apihelp-feedcontributions-param-month": "Vun däm Mohnd un derför",
        "apihelp-feedcontributions-param-deletedonly": "zeijsch blohß de fottjeschmeße Beijdrähsch.",
        "apihelp-feedcontributions-param-toponly": "Zeich blohß de Änderonge, di och de neußte sin.",
        "apihelp-feedcontributions-param-newonly": "Zeich blohß de Änderonge, woh Sigge neu aanjelaat woode sin.",
@@ -72,7 +77,9 @@
        "apihelp-feedrecentchanges-param-feedformat": "Däm Kannahl sing Fommaht.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Nohjelohrte Änderonge övverjonn.",
        "apihelp-feedrecentchanges-param-hidemyself": "Änderonge vun heh dämm Metmaacher övverjonn.",
+       "apihelp-filerevert-param-filename": "De Zih_Dattei, der ohne „{{ne:file}}“ derför.",
        "apihelp-filerevert-param-comment": "Aanmärkong huh lahde.",
+       "apihelp-help-description": "zeisch Hölp för de aanjejovve Moduhle.",
        "apihelp-help-example-recursive": "Alle Hölp en eine Sigg.",
        "apihelp-help-example-help": "Alle Hölp övver de Hölp säälver.",
        "apihelp-imagerotate-description": "Ein udder mieh Bellder driehje.",
        "apihelp-login-param-password": "Paßwoot.",
        "apihelp-login-param-domain": "De Domaijn (kann fott bliehve)",
        "apihelp-login-example-login": "Enlogge.",
+       "apihelp-logout-example-logout": "Donn dä aktoälle Metmaacher ußlogge.",
+       "apihelp-move-description": "Donn en Sigg ömbenänne",
+       "apihelp-move-param-to": "De neue Övverschreff för di Sigg drop ömzebenänne.",
+       "apihelp-move-param-reason": "Der jrond för di Sigg ömzebenänne.",
+       "apihelp-move-param-movetalk": "Donn de Klaafsigg ömbenänne, wann et se jitt.",
+       "apihelp-move-param-movesubpages": "Donn de Ongersigge ömbenänne, wann müjjelesch.",
+       "apihelp-move-param-noredirect": "Donn kein Ömleidong aanlähje.",
+       "apihelp-move-param-watch": "Donn de Sigg un de Ömleijdong op dem aktoälle Metmaacher sing Oppaßleß.",
+       "apihelp-move-param-unwatch": "Donn de Sigg un de Ömleijdong uß dem aktoälle Metmaacher sing Oppaßleß eruß nämme.",
+       "apihelp-move-param-watchlist": "Donn di Sigg en dem aktoälle Metmaacher sing Oppaßleß udder nemm se eruß, donn de Enschtällonge nämme udder donn de Oppaßleß nid ändere.",
+       "apihelp-move-param-ignorewarnings": "Donn alle Warnonge övverjonn",
+       "apihelp-move-example-move": "Donn <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Schlääschte Övverschreff</kbd> nach <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Johde Övverschreff</kbd> önmännde, der ohne en Ömleijdong aanzelähje.",
+       "apihelp-opensearch-param-search": "Noh wat söhke?",
+       "apihelp-opensearch-param-limit": "De hühßte Aanzahl vun Äjeebnesse för zeröck ze jävve",
+       "apihelp-opensearch-param-namespace": "En wällschem Appachtemang söhke.",
        "apihelp-protect-description": "Änder der Siggeschoz för en Sigg.",
        "apihelp-query+allmessages-param-prop": "Wat för en Eijeschaffte holle.",
        "apihelp-query+allmessages-param-filter": "Jiv blohß de Täxte un Nohreesche uß, woh heh dat Täxschtöck dren änthallde es.",
index 0a83e80..e533d79 100644 (file)
@@ -3,15 +3,17 @@
                "authors": [
                        "Mahairod",
                        "Okras",
-                       "Eakarpov"
+                       "Eakarpov",
+                       "Kaganer"
                ]
        },
+       "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: Ошибки и предупреждения]].",
        "apihelp-main-param-action": "Действие, которое следует выполнить.",
        "apihelp-main-param-format": "Формат вывода.",
        "apihelp-main-param-smaxage": "Устанавливает заголовок <code>s-maxage</code> в заданное число секунд. Ошибки никогда не кэшируются.",
        "apihelp-main-param-maxage": "Устанавливает заголовок <code>max-age</code> в заданное число секунд. Ошибки никогда не кэшируются.",
-       "apihelp-main-param-assert": "Удостовериться, что пользователь авторизован, если задано \"user\", или что имеет права бота, если задано \"bot\".",
-       "apihelp-main-param-requestid": "Ð\9bÑ\8eбое Ð·Ð½Ð°Ñ\87ение, Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ðµ Ð·Ð´ÐµÑ\81Ñ\8c, будет включено в ответ. Может быть использовано для различения запросов.",
+       "apihelp-main-param-assert": "Удостовериться, что пользователь авторизован, если задано <kbd>user</kbd>, или что имеет права бота, если задано <kbd>bot</kbd>.",
+       "apihelp-main-param-requestid": "Ð\9bÑ\8eбое Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ðµ Ð·Ð´ÐµÑ\81Ñ\8c Ð·Ð½Ð°Ñ\87ение будет включено в ответ. Может быть использовано для различения запросов.",
        "apihelp-main-param-servedby": "Включить в результаты имя хоста, обработавшего запрос.",
        "apihelp-main-param-curtimestamp": "Включить в результаты временную метку.",
        "apihelp-main-param-origin": "При обращении к API, используя кросс-доменный AJAX-запрос (CORS), задайте параметру значение исходного домена. Он должен быть включён в любой предварительный запрос и таким образом должен быть частью URI-запроса (не тела POST). Он должен точно соответствовать одному из источников в заголовке <code>Origin<code>, так что он должен быть задан наподобие <kbd>https://ru.wikipedia.org</kbd> или <kbd>https://meta.wikimedia.org</kbd>. Если параметр не соответствует заголовку <code>Origin<code>, будет возвращён ответ с кодом ошибки 403. Если параметр соответствует заголовку <code>Origin</code>, и источник находится в белом списке, будет установлен заголовок <code>Access-Control-Allow-Origin</code>.",
@@ -25,6 +27,9 @@
        "apihelp-disabled-description": "Этот модуль был отключен.",
        "apihelp-edit-param-sectiontitle": "Заголовок для нового раздела.",
        "apihelp-edit-param-text": "Содержание страницы.",
+       "apihelp-edit-param-minor": "Незначительное изменение (малая правка).",
+       "apihelp-edit-param-notminor": "Значительное изменение (обычная, не «малая», правка).",
+       "apihelp-edit-param-bot": "Пометить правку как сделанную ботом.",
        "apihelp-edit-param-watch": "Добавить страницу к текущему списку наблюдения пользователя.",
        "apihelp-edit-example-edit": "Редактировать страницу",
        "apihelp-expandtemplates-param-title": "Заголовок страницы.",
index 9c292ba..81e5941 100644 (file)
@@ -8,7 +8,8 @@
                        "LNDDYL",
                        "Shizhao",
                        "Yfdyh000",
-                       "JuneAugsut"
+                       "JuneAugsut",
+                       "EagerLin"
                ]
        },
        "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 header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅[[mw:API:Errors_and_warnings|API: 错误与警告]]。",
        "apihelp-parse-param-redirects": "如果<var>$1page</var>或<var>$1pageid</var>被设置为一个重定向,则解析它。",
        "apihelp-parse-param-oldid": "解析该修订版本的内容。覆盖<var>$1page</var>和<var>$1pageid</var>。",
        "apihelp-parse-param-effectivelanglinks": "包含由扩展提供的语言链接(用于与<kbd>$1prop=langlinks</kbd>一起使用)。",
+       "apihelp-parse-param-sectiontitle": "当<var>section</var>为<kbd>new</kbd>时新段落标题。\n\n不像页面编辑,当省略或为空时将不会备选为<var>summary</var>。",
        "apihelp-parse-param-disablepp": "从解析器输出中禁用PP报告。",
        "apihelp-parse-param-disableeditsection": "从解析器输出中禁用编辑段落链接。",
        "apihelp-parse-param-generatexml": "生成XML解析树(需要内容模型<code>$1</code>)。",
        "apihelp-query+allusers-param-dir": "排序方向。",
        "apihelp-query+allusers-param-group": "只包含指定组中的用户。",
        "apihelp-query+allusers-param-excludegroup": "排除指定组中的用户。",
+       "apihelp-query+allusers-param-limit": "返回的总计用户数。",
        "apihelp-query+allusers-param-witheditsonly": "只列出有编辑的用户。",
        "apihelp-query+allusers-param-activeusers": "只列出最近$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-pageid": "要搜索的页面ID。不能与<var>$1title</var>一起使用。",
        "apihelp-query+backlinks-param-namespace": "要列举的名字空间。",
        "apihelp-query+imageinfo-paramvalue-prop-dimensions": "大小别名。",
        "apihelp-query+imageinfo-paramvalue-prop-sha1": "为文件加入SHA-1哈希值。",
        "apihelp-query+imageinfo-paramvalue-prop-mime": "添加文件的MIME类型。",
+       "apihelp-query+imageinfo-paramvalue-prop-mediatype": "添加文件媒体类型。",
+       "apihelp-query+imageinfo-param-start": "开始列举的时间戳。",
+       "apihelp-query+imageinfo-param-end": "列举的结束时间戳。",
        "apihelp-query+imageinfo-param-urlheight": "与$1urlwidth类似。",
+       "apihelp-query+imageinfo-param-metadataversion": "要使用的元数据版本。如果<kbd>latest</kbd>被指定,则使用最新版本。默认为<kbd>1</kbd>以便向下兼容。",
        "apihelp-query+imageinfo-param-localonly": "只看本地存储库的文件。",
        "apihelp-query+imageinfo-example-simple": "获取有关[[:File:Albert Einstein Head.jpg]]的当前版本的信息",
        "apihelp-query+imageinfo-example-dated": "获取有关[[:File:Albert Einstein Head.jpg]]自2008年以来版本的信息",
        "apihelp-query+recentchanges-param-excludeuser": "不要列出此用户的更改。",
        "apihelp-query+recentchanges-param-tag": "只列出带此标签的更改。",
        "apihelp-query+recentchanges-param-token": "请改用<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
-       "apihelp-query+recentchanges-param-limit": "返回总计更新数。",
+       "apihelp-query+recentchanges-param-limit": "返回总计更新数。",
        "apihelp-query+recentchanges-param-type": "显示的更改类型。",
        "apihelp-query+recentchanges-example-simple": "最近更改列表",
        "apihelp-query+redirects-description": "返回至指定页面的所有重定向。",
index 22280d8..8eccd5d 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Cwlin0416",
                        "Liuxinyu970226",
-                       "LNDDYL"
+                       "LNDDYL",
+                       "EagerLin"
                ]
        },
        "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 Bug與請求]\n</div>\n<strong>狀態資訊:</strong>本頁所展示的所有功能都應正常工作,但是 API 仍在開發當中,將會隨時變化。請訂閱[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 郵件清單]以便得到更新通知。\n\n<strong>錯誤請求:</strong>當 API 收到錯誤請求時, HTTP header 將會返回一個包含「MediaWiki-API-Error」的值,隨後 header 的值與錯誤碼將會送回並設定為相同的值。詳細資訊請參閱[[mw:API:Errors_and_warnings|API: 錯誤與警告]]。",
@@ -32,7 +33,7 @@
        "apihelp-createaccount-param-password": "密碼 (若有設定 <var>$1mailpassword</var> 則可略過)。",
        "apihelp-createaccount-param-domain": "外部認証使用的網域 (選填)。",
        "apihelp-createaccount-param-token": "已取得帳號建立密鑰於第一次請求。",
-       "apihelp-createaccount-param-email": "使用者的電子郵件位址 (選填)。",
+       "apihelp-createaccount-param-email": "使用者的電子郵件地址 (選填) 。",
        "apihelp-createaccount-param-realname": "使用者的真實姓名 (選填)。",
        "apihelp-createaccount-param-mailpassword": "若設為其他值,將會以電子郵件寄送隨機密碼給使用者。",
        "apihelp-createaccount-param-reason": "建立帳號時選填的原因,會被記錄到日誌當中。",
        "apihelp-opensearch-param-search": "搜尋字串。",
        "apihelp-opensearch-param-namespace": "搜尋的命名空間。",
        "apihelp-options-example-reset": "重設所有偏好設定",
+       "apihelp-query+recentchanges-description": "列舉出近期變動。",
+       "apihelp-query+recentchanges-example-simple": "近期變動清單",
        "apihelp-userrights-param-user": "使用者名稱。",
        "apihelp-userrights-param-userid": "使用者 ID。",
        "apihelp-format-example-generic": "格式化查詢結果為 $1 格式",
index c3f455e..10b4fb0 100644 (file)
@@ -38,8 +38,6 @@
  * of memory.
  *
  * Introduced by r47317
- *
- * @internal documentation reviewed on 18 Mar 2011 by hashar
  */
 class BacklinkCache {
        /** @var ProcessCacheLRU */
index 48d4e8d..dc80a46 100644 (file)
@@ -309,11 +309,24 @@ class MWDebug {
         *
         * @since 1.19
         * @param string $str
+        * @param array $context
         */
-       public static function debugMsg( $str ) {
+       public static function debugMsg( $str, $context = array() ) {
                global $wgDebugComments, $wgShowDebug;
 
                if ( self::$enabled || $wgDebugComments || $wgShowDebug ) {
+                       if ( $context ) {
+                               $prefix = '';
+                               if ( isset( $context['prefix'] ) ) {
+                                       $prefix = $context['prefix'];
+                               } elseif ( isset( $context['channel'] ) && $context['channel'] !== 'wfDebug' ) {
+                                       $prefix = "[{$context['channel']}] ";
+                               }
+                               if ( isset( $context['seconds_elapsed'] ) && isset( $context['memory_used'] ) ) {
+                                       $prefix .= "{$context['seconds_elapsed']} {$context['memory_used']}  ";
+                               }
+                               $str = $prefix . $str;
+                       }
                        self::$debug[] = rtrim( UtfNormal::cleanUp( $str ) );
                }
        }
index be46c27..c53aeaa 100644 (file)
@@ -84,6 +84,8 @@ class MWLoggerLegacyLogger extends AbstractLogger {
                        $destination = self::destination( $this->channel, $message, $context );
                        self::emit( $text, $destination );
                }
+               // Add to debug toolbar
+               MWDebug::debugMsg( $message, array( 'channel' => $this->channel ) + $context );
        }
 
 
index 6ab6e03..0515566 100644 (file)
@@ -42,6 +42,19 @@ class HttpError extends MWException {
                $this->content = $content;
        }
 
+       /**
+        * We don't want the default exception logging as we got our own logging set
+        * up in self::report.
+        *
+        * @see MWException::isLoggable
+        *
+        * @since 1.24
+        * @return bool
+        */
+       public function isLoggable() {
+               return false;
+       }
+
        /**
         * Returns the HTTP status code supplied to the constructor.
         *
@@ -52,11 +65,13 @@ class HttpError extends MWException {
        }
 
        /**
-        * Report the HTTP error.
+        * Report and log the HTTP error.
         * Sends the appropriate HTTP status code and outputs an
         * HTML page with an error message.
         */
        public function report() {
+               $this->doLog();
+
                $httpMessage = HttpStatus::getMessage( $this->httpCode );
 
                header( "Status: {$this->httpCode} {$httpMessage}", true, $this->httpCode );
@@ -65,6 +80,29 @@ class HttpError extends MWException {
                print $this->getHTML();
        }
 
+       private function doLog() {
+               $logger = MWLoggerFactory::getInstance( 'HttpError' );
+               $content = $this->content;
+
+               if ( $content instanceof Message ) {
+                       $content = $content->text();
+               }
+
+               $context = array(
+                       'file' => $this->getFile(),
+                       'line' => $this->getLine(),
+                       'http_code' => $this->httpCode,
+               );
+
+               $logMsg = "$content ({http_code}) from {file}:{line}";
+
+               if ( $this->getStatusCode() < 500 ) {
+                       $logger->info( $logMsg, $context );
+               } else {
+                       $logger->error( $logMsg, $context );
+               }
+       }
+
        /**
         * Returns HTML for reporting the HTTP error.
         * This will be a minimal but complete HTML document.
index c00fb81..07370ad 100644 (file)
@@ -681,6 +681,11 @@ class FSFileBackend extends FileBackendStore {
                return false;
        }
 
+       /**
+        * @param FileBackendStoreOpHandle[] $fileOpHandles
+        *
+        * @return Status[]
+        */
        protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
                $statuses = array();
 
index de189ec..25e87d4 100644 (file)
@@ -1188,9 +1188,9 @@ abstract class FileBackendStore extends FileBackend {
         * The resulting Status object fields will correspond
         * to the order in which the handles where given.
         *
-        * @param array $fileOpHandles
+        * @param FileBackendStoreOpHandle[] $fileOpHandles
+        *
         * @throws FileBackendError
-        * @internal param array $handles List of FileBackendStoreOpHandle objects
         * @return array Map of Status objects
         */
        final public function executeOpHandlesInternal( array $fileOpHandles ) {
@@ -1213,9 +1213,11 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * @see FileBackendStore::executeOpHandlesInternal()
-        * @param array $fileOpHandles
+        *
+        * @param FileBackendStoreOpHandle[] $fileOpHandles
+        *
         * @throws FileBackendError
-        * @return array List of corresponding Status objects
+        * @return Status[] List of corresponding Status objects
         */
        protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
                if ( count( $fileOpHandles ) ) {
index 836fd49..5f406c9 100644 (file)
@@ -1171,6 +1171,11 @@ class SwiftFileBackend extends FileBackendStore {
                return $hdrs;
        }
 
+       /**
+        * @param FileBackendStoreOpHandle[] $fileOpHandles
+        *
+        * @return Status[]
+        */
        protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
                $statuses = array();
 
index be5ca7f..b4cced3 100644 (file)
@@ -842,7 +842,7 @@ class LocalFile extends File {
         * Refresh metadata in memcached, but don't touch thumbnails or squid
         */
        function purgeMetadataCache() {
-               $this->loadFromDB();
+               $this->loadFromDB( File::READ_LATEST );
                $this->saveToCache();
                $this->purgeHistory();
        }
index b0b2ebe..b45b8f2 100644 (file)
        "config-db-install-account": "Benutzerkonto für die Installation",
        "config-db-username": "Name des Datenbankbenutzers:",
        "config-db-password": "Passwort des Datenbankbenutzers:",
-       "config-db-password-empty": "Bitte ein Passwort für den neuen Datenbankbenutzer angeben: $1\nObwohl es möglich ist, Datenbankbenutzer ohne Passwort anzulegen, so ist dies nicht sicher.",
+       "config-db-password-empty": "Bitte ein Passwort für den neuen Datenbankbenutzer angeben: $1.\nObwohl es möglich ist, Datenbankbenutzer ohne Passwort anzulegen, so ist dies nicht sicher.",
        "config-db-username-empty": "Du musst einen Wert für „{{int:config-db-username}}“ eingeben",
        "config-db-install-username": "Den Benutzernamen angeben, der für die Verbindung mit der Datenbank während des Installationsvorgangs genutzt werden soll. Es handelt sich dabei nicht um den Benutzernamen für das MediaWiki-Konto, sondern um den Benutzernamen der vorgesehenen Datenbank.",
        "config-db-install-password": "Das Passwort angeben, das für die Verbindung mit der Datenbank während des Installationsvorgangs genutzt werden soll. Es handelt sich dabei nicht um das Passwort für das MediaWiki-Konto, sondern um das Passwort der vorgesehenen Datenbank.",
index ee1a2f4..5ff0749 100644 (file)
@@ -75,7 +75,7 @@
        "config-unicode-using-intl": "Usando la [http://pecl.php.net/intl extensión intl PECL] para la normalización Unicode.",
        "config-unicode-pure-php-warning": "'''Advertencia''': La [http://pecl.php.net/intl extensión intl] no está disponible para efectuar la normalización Unicode. Utilizando la implementación más lenta en PHP.\nSi tu web tiene mucho tráfico, te recomendamos leer acerca de la [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalización Unicode].",
        "config-unicode-update-warning": "'''Warning''': La versión instalada del contenedor de normalización Unicode usa una versión anterior de la biblioteca del [http://site.icu-project.org/ proyecto ICU].\nDeberás [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations actualizar] si realmente deseas usar Unicode.",
-       "config-no-db": "¡No fue posible encontrar un controlador adecuado para la base de datos! Necesitas instalar un controlador de base de datos para PHP.\nLos siguientes sistemas gestores de bases de datos están soportados: $1.\n\nSi compilaste PHP tú mismo, debes reconfigurarlo habilitando un cliente de base de datos, por ejemplo, usando <code>./configure --with-mysqli</code>.\nSi instalaste PHP desde un paquete Debian o Ubuntu, entonces también necesitas instalar, por ejemplo, el paquete <code>php5-mysql</code>.",
+       "config-no-db": "No se encontró un controlador adecuado para la base de datos. Necesitas instalar un controlador de base de datos para PHP.\n{{PLURAL:$2|El siguiente gestor de bases de datos está soportado|Los siguientes gestores de bases de datos están soportados}}: $1.\n\nSi compilaste PHP tú mismo, debes reconfigurarlo habilitando un cliente de base de datos, por ejemplo, usando <code>./configure --with-mysqli</code>.\nSi instalaste PHP desde un paquete Debian o Ubuntu, entonces también necesitas instalar, por ejemplo, el paquete <code>php5-mysql</code>.",
        "config-outdated-sqlite": "''' Advertencia ''': tiene la versión SQLite $1, que es inferior a la mínima versión requerida: $2 . SQLite no estará disponible.",
        "config-no-fts3": "'''Advertencia''': 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>\nVea [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] para obtener ayuda sobre cómo hacerlo.",
index 9c31619..ea549a1 100644 (file)
@@ -2,10 +2,17 @@
        "@metadata": {
                "authors": [
                        "Smtchahal",
-                       "Vivek Rai"
+                       "Vivek Rai",
+                       "Phoenix303",
+                       "संजीव कुमार"
                ]
        },
+       "config-desc": "साँचा लिए इंस्टॉलर",
+       "config-title": "मीडियाविकी  $1 इंस्टॉलेशन",
        "config-information": "जानकारी",
+       "config-localsettings-upgrade": "<code>LocalSettings.php</code> फ़ाइल पाया गया है ।\nइस स्थापना को अपग्रेड करने के लिए, नीचे दिए गए बॉक्स में <code>$wgUpgradeKey</code>  का मान दर्ज करें।\nआपको <code>LocalSettings.php</code> में मिल जाएगा।",
+       "config-localsettings-cli-upgrade": "<code>LocalSettings.php</code> फ़ाइल पाया गया है ।\nइस स्थापना को अपग्रेड करने के लिए, बदले में कृपया करके ये चलाए <code>update.php</code>",
+       "config-localsettings-key": "नवीनीकरण कुंजी",
        "config-localsettings-badkey": "आपकी दी गई कुंजी ग़लत है।",
        "config-your-language": "आपकी भाषा:",
        "config-wiki-language": "विकी भाषा:",
        "config-page-language": "भाषा",
        "config-page-welcome": "मीडियाविकी पर आपका स्वागत है!",
        "config-page-dbconnect": "डेटाबेस से जुड़ें",
+       "config-page-upgrade": "मौजूदा स्थापना का नवीनीकरण",
+       "config-page-dbsettings": "डेटाबेस वरियतायें",
        "config-page-name": "नाम",
        "config-page-options": "विकल्प",
        "config-page-install": "स्थापित करें",
        "config-page-complete": "पूर्ण!",
        "config-page-restart": "स्थापना को पुनरारंभ करें",
        "config-page-readme": "मुझे पढ़ें",
+       "config-page-releasenotes": "रिलीज नोट्स",
+       "config-page-copying": "अनुकरण",
+       "config-page-upgradedoc": "उन्नयन",
        "config-page-existingwiki": "मौजूदा विकि",
        "config-restart": "हाँ, इसे पुनः आरंभ करें",
        "config-env-php": "PHP $1 स्थापित किया गया है।",
index 07a6f35..0f2d7be 100644 (file)
        "config-admin-email-help": "在此輸入的電子郵件信箱可用來接收 Wiki 上其他使用者所傳送的訊息、重設您的密碼與通知監視清單中頁面更動。您可將此欄位留空。",
        "config-admin-error-user": "建立管理員帳號 \"<nowiki>$1</nowiki>\" 時發送內部錯誤。",
        "config-admin-error-password": "設定管理員 \"<nowiki>$1</nowiki>\" 的密碼時發送內部錯誤:<pre>$2</pre>",
-       "config-admin-error-bademail": "您輸入了不正確的電地址。",
+       "config-admin-error-bademail": "您輸入了不正確的電子郵件地址。",
        "config-subscribe": "訂閱 [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 發佈公告郵寄清單]。",
        "config-subscribe-help": "這是一個用於發佈公告的低郵件量郵寄清單,內容包括重要的安全公告。\n您應該訂閱它並在 MediaWiki 發佈新版的時候更新系統。",
-       "config-subscribe-noemail": "您正嘗試不填寫電郵地址訂閱發佈公告郵寄清單。 \n請如果您希望訂閱郵寄清單,請提供一個有效的電郵地址。",
+       "config-subscribe-noemail": "您正嘗試不填寫電子郵件地址訂閱發佈公告郵寄清單。 \n請如果您希望訂閱郵寄清單,請提供一個有效的電子郵件地址。",
        "config-almost-done": "您快要完成了!\n您現在可以跳過其餘的設定項目並且立即安裝 Wiki。",
        "config-optional-continue": "多問我一些問題吧。",
        "config-optional-skip": "我已經不耐煩了,請趕緊安裝 Wiki。",
        "config-email-watchlist-help": "若使用者在個人偏好開啟了此功能,允許使用者收到與其監視清單有關的通知。",
        "config-email-auth": "開啟電子郵件身份認證",
        "config-email-auth-help": "若開啟此選項,使用者不論設定或者更改電子郵件地址,都必須透過收信的方式確認沒有問題。\n只有驗證過的電子郵件地址可以收到來自其他使用者或修改通知的信件。\n公開的 Wiki 會 <strong>建議</strong> 設定此選項,以防使用者濫用電子郵件功能。",
-       "config-email-sender": "電子郵件回覆址:",
+       "config-email-sender": "電子郵件回覆址:",
        "config-email-sender-help": "請輸入要用來做為外寄郵件的電子郵件回覆地址。\n該郵件地址會收到被拒收的信件。\n許多郵件伺服器會要求使用有效的網域名稱。",
        "config-upload-settings": "圖片和檔案上傳",
        "config-upload-enable": "開啟檔案上傳",
index 66bbb9c..1d84dc4 100644 (file)
@@ -49,8 +49,6 @@
 class JobQueueFederated extends JobQueue {
        /** @var HashRing */
        protected $partitionRing;
-       /** @var HashRing */
-       protected $partitionPushRing;
        /** @var array (partition name => JobQueue) reverse sorted by weight */
        protected $partitionQueues = array();
 
@@ -68,8 +66,6 @@ class JobQueueFederated extends JobQueue {
         *                          These configuration arrays are passed to JobQueue::factory().
         *                          The options set here are overridden by those passed to this
         *                          the federated queue itself (e.g. 'order' and 'claimTTL').
-        *  - partitionsNoPush    : List of partition names that can handle pop() but not push().
-        *                          This can be used to migrate away from a certain partition.
         *  - maxPartitionsTry    : Maximum number of times to attempt job insertion using
         *                          different partition queues. This improves availability
         *                          during failure, at the cost of added latency and somewhat
@@ -90,17 +86,10 @@ class JobQueueFederated extends JobQueue {
                // Get the full partition map
                $partitionMap = $params['partitionsBySection'][$section];
                arsort( $partitionMap, SORT_NUMERIC );
-               // Get the partitions jobs can actually be pushed to
-               $partitionPushMap = $partitionMap;
-               if ( isset( $params['partitionsNoPush'] ) ) {
-                       foreach ( $params['partitionsNoPush'] as $partition ) {
-                               unset( $partitionPushMap[$partition] );
-                       }
-               }
                // Get the config to pass to merge into each partition queue config
                $baseConfig = $params;
                foreach ( array( 'class', 'sectionsByWiki', 'maxPartitionsTry',
-                       'partitionsBySection', 'configByPartition', 'partitionsNoPush' ) as $o
+                       'partitionsBySection', 'configByPartition', ) as $o
                ) {
                        unset( $baseConfig[$o] ); // partition queue doesn't care about this
                }
@@ -114,12 +103,6 @@ class JobQueueFederated extends JobQueue {
                }
                // Ring of all partitions
                $this->partitionRing = new HashRing( $partitionMap );
-               // Get the ring of partitions to push jobs into
-               if ( count( $partitionPushMap ) === count( $partitionMap ) ) {
-                       $this->partitionPushRing = clone $this->partitionRing; // faster
-               } else {
-                       $this->partitionPushRing = new HashRing( $partitionPushMap );
-               }
        }
 
        protected function supportedOrders() {
@@ -196,7 +179,7 @@ class JobQueueFederated extends JobQueue {
 
        protected function doBatchPush( array $jobs, $flags ) {
                // Local ring variable that may be changed to point to a new ring on failure
-               $partitionRing = $this->partitionPushRing;
+               $partitionRing = $this->partitionRing;
                // Try to insert the jobs and update $partitionsTry on any failures.
                // Retry to insert any remaning jobs again, ignoring the bad partitions.
                $jobsLeft = $jobs;
@@ -332,12 +315,12 @@ class JobQueueFederated extends JobQueue {
        protected function doIsRootJobOldDuplicate( Job $job ) {
                $params = $job->getRootJobParams();
                $sigature = $params['rootJobSignature'];
-               $partition = $this->partitionPushRing->getLiveLocation( $sigature );
+               $partition = $this->partitionRing->getLiveLocation( $sigature );
                try {
                        return $this->partitionQueues[$partition]->doIsRootJobOldDuplicate( $job );
                } catch ( JobQueueError $e ) {
-                       if ( $this->partitionPushRing->ejectFromLiveRing( $partition, 5 ) ) {
-                               $partition = $this->partitionPushRing->getLiveLocation( $sigature );
+                       if ( $this->partitionRing->ejectFromLiveRing( $partition, 5 ) ) {
+                               $partition = $this->partitionRing->getLiveLocation( $sigature );
                                return $this->partitionQueues[$partition]->doIsRootJobOldDuplicate( $job );
                        }
                }
@@ -348,12 +331,12 @@ class JobQueueFederated extends JobQueue {
        protected function doDeduplicateRootJob( Job $job ) {
                $params = $job->getRootJobParams();
                $sigature = $params['rootJobSignature'];
-               $partition = $this->partitionPushRing->getLiveLocation( $sigature );
+               $partition = $this->partitionRing->getLiveLocation( $sigature );
                try {
                        return $this->partitionQueues[$partition]->doDeduplicateRootJob( $job );
                } catch ( JobQueueError $e ) {
-                       if ( $this->partitionPushRing->ejectFromLiveRing( $partition, 5 ) ) {
-                               $partition = $this->partitionPushRing->getLiveLocation( $sigature );
+                       if ( $this->partitionRing->ejectFromLiveRing( $partition, 5 ) ) {
+                               $partition = $this->partitionRing->getLiveLocation( $sigature );
                                return $this->partitionQueues[$partition]->doDeduplicateRootJob( $job );
                        }
                }
index ce6e0ad..267a319 100644 (file)
@@ -363,6 +363,19 @@ class LogFormatter {
                                                break;
                                }
                                break;
+
+                       case 'import':
+                               switch ( $entry->getSubtype() ) {
+                                       case 'upload':
+                                               $text = wfMessage( 'import-logentry-upload' )
+                                                       ->rawParams( $target )->inContentLanguage()->escaped();
+                                               break;
+                                       case 'interwiki':
+                                               $text = wfMessage( 'import-logentry-interwiki' )
+                                                       ->rawParams( $target )->inContentLanguage()->escaped();
+                                               break;
+                               }
+                               break;
                        // case 'suppress' --private log -- aaron  (so we know who to blame in a few years :-D)
                        // default:
                }
index 787f21e..968e424 100644 (file)
@@ -245,11 +245,11 @@ abstract class ImageHandler extends MediaHandler {
                if ( $pages === false || $pages <= 1 ) {
                        $msg = wfMessage( 'file-info-size' )->numParams( $file->getWidth(),
                                $file->getHeight() )->params( $size,
-                                       $file->getMimeType() )->parse();
+                                       '<span class="mime-type">' . $file->getMimeType() . '</span>' )->parse();
                } else {
                        $msg = wfMessage( 'file-info-size-pages' )->numParams( $file->getWidth(),
                                $file->getHeight() )->params( $size,
-                                       $file->getMimeType() )->numParams( $pages )->parse();
+                                       '<span class="mime-type">' . $file->getMimeType() . '</span>' )->numParams( $pages )->parse();
                }
 
                return $msg;
index 0103946..33aed34 100644 (file)
@@ -639,7 +639,7 @@ abstract class MediaHandler {
         */
        static function getGeneralLongDesc( $file ) {
                return wfMessage( 'file-info' )->sizeParams( $file->getSize() )
-                       ->params( $file->getMimeType() )->parse();
+                       ->params( '<span class="mime-type">' . $file->getMimeType() . '</span>' )->parse();
        }
 
        /**
@@ -861,4 +861,26 @@ abstract class MediaHandler {
        public function sanitizeParamsForBucketing( $params ) {
                return $params;
        }
+
+       /**
+        * Gets configuration for the file warning message. Return value of
+        * the following structure:
+        *   array(
+        *     'module' => 'example.filewarning.messages', // Required, module with messages loaded for the client
+        *     'messages' => array( // Required, array of names of messages
+        *       'main' => 'example-filewarning-main', // Required, main warning message
+        *       'header' => 'example-filewarning-header', // Optional, header for warning dialog
+        *       'footer' => 'example-filewarning-footer', // Optional, footer for warning dialog
+        *       'info' => 'example-filewarning-info', // Optional, text for more-information link (see below)
+        *     ),
+        *     'link' => 'http://example.com', // Optional, link for more information
+        *   )
+        *
+        * Returns null if no warning is necessary.
+        * @param File $file
+        * @return array|null
+        */
+       public function getWarningConfig( $file ) {
+               return null;
+       }
 }
index 6ebd8a1..eb597d2 100644 (file)
@@ -30,8 +30,6 @@
  * See design.txt for an overview.
  * Note: edit user interface and cache support functions have been
  * moved to separate EditPage and HTMLFileCache classes.
- *
- * @internal documentation reviewed 15 Mar 2010
  */
 class Article implements Page {
        /** @var IContextSource The context this Article is executed in */
index 504fa74..8f635cf 100644 (file)
@@ -505,6 +505,22 @@ class ImagePage extends Article {
 
                        $longDesc = $this->getContext()->msg( 'parentheses', $this->displayImg->getLongDesc() )->text();
 
+                       $handler = $this->displayImg->getHandler();
+
+                       // If this is a filetype with potential issues, warn the user.
+                       if ( $handler ) {
+                               $warningConfig = $handler->getWarningConfig( $this->displayImg );
+
+                               if ( $warningConfig !== null ) {
+                                       // The warning will be displayed via CSS and JavaScript.
+                                       // We just need to tell the client side what message to use.
+                                       $output = $this->getContext()->getOutput();
+                                       $output->addJsConfigVars( 'wgFileWarning', $warningConfig );
+                                       $output->addModules( $warningConfig['module'] );
+                                       $output->addModules( 'mediawiki.filewarning' );
+                               }
+                       }
+
                        $medialink = "[[Media:$filename|$linktext]]";
 
                        if ( !$this->displayImg->isSafeFile() ) {
index 285611d..5527ace 100644 (file)
@@ -31,8 +31,6 @@ interface Page {
  *
  * Some fields are public only for backwards-compatibility. Use accessors.
  * In the past, this class was part of Article.php and everything was public.
- *
- * @internal documentation reviewed 15 Mar 2010
  */
 class WikiPage implements Page, IDBAccessObject {
        // Constants for $mDataLoadedFrom and related
index fbca08e..0104fe9 100644 (file)
@@ -587,9 +587,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @return array
         */
        public function getDefinitionSummary( ResourceLoaderContext $context ) {
-               $summary = array(
-                       'class' => get_class( $this ),
-               );
+               $summary = parent::getDefinitionSummary( $context );
                foreach ( array(
                        'scripts',
                        'debugScripts',
diff --git a/includes/site/CachingSiteStore.php b/includes/site/CachingSiteStore.php
new file mode 100644 (file)
index 0000000..9243f12
--- /dev/null
@@ -0,0 +1,195 @@
+<?php
+
+/**
+ * Represents the site configuration of a wiki.
+ * Holds a list of sites (ie SiteList), with a caching layer.
+ *
+ * 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
+ *
+ * @since 1.25
+ *
+ * @file
+ * @ingroup Site
+ *
+ * @license GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ * @author Katie Filbert < aude.wiki@gmail.com >
+ */
+class CachingSiteStore implements SiteStore {
+
+       /**
+        * @var SiteList|null
+        */
+       private $sites = null;
+
+       /**
+        * @var string|null
+        */
+       private $cacheKey;
+
+       /**
+        * @var int
+        */
+       private $cacheTimeout;
+
+       /**
+        * @var BagOStuff
+        */
+       private $cache;
+
+       /**
+        * @var SiteStore
+        */
+       private $siteStore;
+
+       /**
+        * @param SiteStore $siteStore
+        * @param BagOStuff $cache
+        * @param string|null $cacheKey
+        * @param int $cacheTimeout
+        */
+       public function __construct(
+               SiteStore $siteStore,
+               BagOStuff $cache,
+               $cacheKey = null,
+               $cacheTimeout = 3600
+       ) {
+               $this->siteStore = $siteStore;
+               $this->cache = $cache;
+               $this->cacheKey = $cacheKey;
+               $this->cacheTimeout = $cacheTimeout;
+       }
+
+       /**
+        * Constructs a cache key to use for caching the list of sites.
+        *
+        * This includes the concrete class name of the site list as well as a version identifier
+        * for the list's serialization, to avoid problems when unserializing site lists serialized
+        * by an older version, e.g. when reading from a cache.
+        *
+        * The cache key also includes information about where the sites were loaded from, e.g.
+        * the name of a database table.
+        *
+        * @see SiteList::getSerialVersionId
+        *
+        * @return string The cache key.
+        */
+       private function getCacheKey() {
+               if ( $this->cacheKey === null ) {
+                       $type = 'SiteList#' . SiteList::getSerialVersionId();
+                       $this->cacheKey = wfMemcKey( "sites/$type" );
+               }
+
+               return $this->cacheKey;
+       }
+
+       /**
+        * @see SiteStore::getSites
+        *
+        * @since 1.25
+        *
+        * @return SiteList
+        */
+       public function getSites() {
+               if ( $this->sites === null ) {
+                       $this->sites = $this->cache->get( $this->getCacheKey() );
+
+                       if ( !is_object( $this->sites ) ) {
+                               $this->sites = $this->siteStore->getSites();
+
+                               $this->cache->set( $this->getCacheKey(), $this->sites, $this->cacheTimeout );
+                       }
+               }
+
+               return $this->sites;
+       }
+
+       /**
+        * @see SiteStore::getSite
+        *
+        * @since 1.25
+        *
+        * @param string $globalId
+        *
+        * @return Site|null
+        */
+       public function getSite( $globalId ) {
+               $sites = $this->getSites();
+
+               return $sites->hasSite( $globalId ) ? $sites->getSite( $globalId ) : null;
+       }
+
+       /**
+        * @see SiteStore::saveSite
+        *
+        * @since 1.25
+        *
+        * @param Site $site
+        *
+        * @return bool Success indicator
+        */
+       public function saveSite( Site $site ) {
+               return $this->saveSites( array( $site ) );
+       }
+
+       /**
+        * @see SiteStore::saveSites
+        *
+        * @since 1.25
+        *
+        * @param Site[] $sites
+        *
+        * @return bool Success indicator
+        */
+       public function saveSites( array $sites ) {
+               if ( empty( $sites ) ) {
+                       return true;
+               }
+
+               $success = $this->siteStore->saveSites( $sites );
+
+               // purge cache
+               $this->reset();
+
+               return $success;
+       }
+
+       /**
+        * Purges the internal and external cache of the site list, forcing the list
+        * of sites to be reloaded.
+        *
+        * @since 1.25
+        */
+       public function reset() {
+               // purge cache
+               $this->cache->delete( $this->getCacheKey() );
+               $this->sites = null;
+       }
+
+       /**
+        * Clears the list of sites stored.
+        *
+        * @see SiteStore::clear()
+        *
+        * @return bool Success
+        */
+       public function clear() {
+               $this->reset();
+
+               return $this->siteStore->clear();
+       }
+
+}
diff --git a/includes/site/DBSiteStore.php b/includes/site/DBSiteStore.php
new file mode 100644 (file)
index 0000000..f167584
--- /dev/null
@@ -0,0 +1,345 @@
+<?php
+
+/**
+ * Represents the site configuration of a wiki.
+ * Holds a list of sites (ie SiteList), stored in the database.
+ *
+ * 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
+ *
+ * @since 1.25
+ *
+ * @file
+ * @ingroup Site
+ *
+ * @license GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class DBSiteStore implements SiteStore {
+
+       /**
+        * @var SiteList|null
+        */
+       protected $sites = null;
+
+       /**
+        * @var ORMTable
+        */
+       protected $sitesTable;
+
+       /**
+        * @since 1.25
+        *
+        * @param ORMTable|null $sitesTable
+        */
+       public function __construct( ORMTable $sitesTable = null ) {
+               if ( $sitesTable === null ) {
+                       $sitesTable = $this->newSitesTable();
+               }
+
+               $this->sitesTable = $sitesTable;
+       }
+
+       /**
+        * @see SiteStore::getSites
+        *
+        * @since 1.25
+        *
+        * @return SiteList
+        */
+       public function getSites() {
+               $this->loadSites();
+
+               return $this->sites;
+       }
+
+       /**
+        * Returns a new Site object constructed from the provided ORMRow.
+        *
+        * @since 1.25
+        *
+        * @param ORMRow $siteRow
+        *
+        * @return Site
+        */
+       protected function siteFromRow( ORMRow $siteRow ) {
+
+               $site = Site::newForType( $siteRow->getField( 'type', Site::TYPE_UNKNOWN ) );
+
+               $site->setGlobalId( $siteRow->getField( 'global_key' ) );
+
+               $site->setInternalId( $siteRow->getField( 'id' ) );
+
+               if ( $siteRow->hasField( 'forward' ) ) {
+                       $site->setForward( $siteRow->getField( 'forward' ) );
+               }
+
+               if ( $siteRow->hasField( 'group' ) ) {
+                       $site->setGroup( $siteRow->getField( 'group' ) );
+               }
+
+               if ( $siteRow->hasField( 'language' ) ) {
+                       $site->setLanguageCode( $siteRow->getField( 'language' ) === ''
+                               ? null
+                               : $siteRow->getField( 'language' )
+                       );
+               }
+
+               if ( $siteRow->hasField( 'source' ) ) {
+                       $site->setSource( $siteRow->getField( 'source' ) );
+               }
+
+               if ( $siteRow->hasField( 'data' ) ) {
+                       $site->setExtraData( $siteRow->getField( 'data' ) );
+               }
+
+               if ( $siteRow->hasField( 'config' ) ) {
+                       $site->setExtraConfig( $siteRow->getField( 'config' ) );
+               }
+
+               return $site;
+       }
+
+       /**
+        * Get a new ORMRow from a Site object
+        *
+        * @since 1.25
+        *
+        * @param Site $site
+        *
+        * @return ORMRow
+        */
+       protected function getRowFromSite( Site $site ) {
+               $fields = array(
+                       // Site data
+                       'global_key' => $site->getGlobalId(), // TODO: check not null
+                       'type' => $site->getType(),
+                       'group' => $site->getGroup(),
+                       'source' => $site->getSource(),
+                       'language' => $site->getLanguageCode() === null ? '' : $site->getLanguageCode(),
+                       'protocol' => $site->getProtocol(),
+                       'domain' => strrev( $site->getDomain() ) . '.',
+                       'data' => $site->getExtraData(),
+
+                       // Site config
+                       'forward' => $site->shouldForward(),
+                       'config' => $site->getExtraConfig(),
+               );
+
+               if ( $site->getInternalId() !== null ) {
+                       $fields['id'] = $site->getInternalId();
+               }
+
+               return new ORMRow( $this->sitesTable, $fields );
+       }
+
+       /**
+        * Fetches the site from the database and loads them into the sites field.
+        *
+        * @since 1.25
+        */
+       protected function loadSites() {
+               $this->sites = new SiteList();
+
+               foreach ( $this->sitesTable->select() as $siteRow ) {
+                       $this->sites[] = $this->siteFromRow( $siteRow );
+               }
+
+               // Batch load the local site identifiers.
+               $ids = wfGetDB( $this->sitesTable->getReadDb() )->select(
+                       'site_identifiers',
+                       array(
+                               'si_site',
+                               'si_type',
+                               'si_key',
+                       ),
+                       array(),
+                       __METHOD__
+               );
+
+               foreach ( $ids as $id ) {
+                       if ( $this->sites->hasInternalId( $id->si_site ) ) {
+                               $site = $this->sites->getSiteByInternalId( $id->si_site );
+                               $site->addLocalId( $id->si_type, $id->si_key );
+                               $this->sites->setSite( $site );
+                       }
+               }
+       }
+
+       /**
+        * @see SiteStore::getSite
+        *
+        * @since 1.25
+        *
+        * @param string $globalId
+        *
+        * @return Site|null
+        */
+       public function getSite( $globalId ) {
+               if ( $this->sites === null ) {
+                       $this->sites = $this->getSites();
+               }
+
+               return $this->sites->hasSite( $globalId ) ? $this->sites->getSite( $globalId ) : null;
+       }
+
+       /**
+        * @see SiteStore::saveSite
+        *
+        * @since 1.25
+        *
+        * @param Site $site
+        *
+        * @return bool Success indicator
+        */
+       public function saveSite( Site $site ) {
+               return $this->saveSites( array( $site ) );
+       }
+
+       /**
+        * @see SiteStore::saveSites
+        *
+        * @since 1.25
+        *
+        * @param Site[] $sites
+        *
+        * @return bool Success indicator
+        */
+       public function saveSites( array $sites ) {
+               if ( empty( $sites ) ) {
+                       return true;
+               }
+
+               $dbw = $this->sitesTable->getWriteDbConnection();
+
+               $dbw->startAtomic( __METHOD__ );
+
+               $success = true;
+
+               $internalIds = array();
+               $localIds = array();
+
+               foreach ( $sites as $site ) {
+                       if ( $site->getInternalId() !== null ) {
+                               $internalIds[] = $site->getInternalId();
+                       }
+
+                       $siteRow = $this->getRowFromSite( $site );
+                       $success = $siteRow->save( __METHOD__ ) && $success;
+
+                       foreach ( $site->getLocalIds() as $idType => $ids ) {
+                               foreach ( $ids as $id ) {
+                                       $localIds[] = array( $siteRow->getId(), $idType, $id );
+                               }
+                       }
+               }
+
+               if ( $internalIds !== array() ) {
+                       $dbw->delete(
+                               'site_identifiers',
+                               array( 'si_site' => $internalIds ),
+                               __METHOD__
+                       );
+               }
+
+               foreach ( $localIds as $localId ) {
+                       $dbw->insert(
+                               'site_identifiers',
+                               array(
+                                       'si_site' => $localId[0],
+                                       'si_type' => $localId[1],
+                                       'si_key' => $localId[2],
+                               ),
+                               __METHOD__
+                       );
+               }
+
+               $dbw->endAtomic( __METHOD__ );
+
+               $this->reset();
+
+               return $success;
+       }
+
+       /**
+        * Resets the SiteList
+        *
+        * @since 1.25
+        */
+       public function reset() {
+               $this->sites = null;
+       }
+
+       /**
+        * Clears the list of sites stored in the database.
+        *
+        * @see SiteStore::clear()
+        *
+        * @return bool Success
+        */
+       public function clear() {
+               $dbw = $this->sitesTable->getWriteDbConnection();
+
+               $dbw->startAtomic( __METHOD__ );
+               $ok = $dbw->delete( 'sites', '*', __METHOD__ );
+               $ok = $dbw->delete( 'site_identifiers', '*', __METHOD__ ) && $ok;
+               $dbw->endAtomic( __METHOD__ );
+
+               $this->reset();
+
+               return $ok;
+       }
+
+       /**
+        * @since 1.25
+        *
+        * @return ORMTable
+        */
+       protected function newSitesTable() {
+               return new ORMTable(
+                       'sites',
+                       array(
+                               'id' => 'id',
+
+                               // Site data
+                               'global_key' => 'str',
+                               'type' => 'str',
+                               'group' => 'str',
+                               'source' => 'str',
+                               'language' => 'str',
+                               'protocol' => 'str',
+                               'domain' => 'str',
+                               'data' => 'array',
+
+                               // Site config
+                               'forward' => 'bool',
+                               'config' => 'array',
+                       ),
+                       array(
+                               'type' => Site::TYPE_UNKNOWN,
+                               'group' => Site::GROUP_NONE,
+                               'source' => Site::SOURCE_LOCAL,
+                               'data' => array(),
+
+                               'forward' => false,
+                               'config' => array(),
+                               'language' => '',
+                       ),
+                       'ORMRow',
+                       'site_'
+               );
+       }
+
+}
diff --git a/includes/site/FileBasedSiteLookup.php b/includes/site/FileBasedSiteLookup.php
new file mode 100644 (file)
index 0000000..9654440
--- /dev/null
@@ -0,0 +1,139 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ *
+ * @license GNU GPL v2+
+ */
+
+/**
+ * Provides a file-based cache of a SiteStore. The sites are stored in
+ * a json file. (see docs/sitescache.txt regarding format)
+ *
+ * The cache can be built with the rebuildSitesCache.php maintenance script,
+ * and a MediaWiki instance can be setup to use this by setting the
+ * 'wgSitesCacheFile' configuration to the cache file location.
+ *
+ * @since 1.25
+ */
+class FileBasedSiteLookup implements SiteLookup {
+
+       /**
+        * @var SiteList
+        */
+       private $sites = null;
+
+       /**
+        * @var string
+        */
+       private $cacheFile;
+
+       /**
+        * @param string $cacheFile
+        */
+       public function __construct( $cacheFile ) {
+               $this->cacheFile = $cacheFile;
+       }
+
+       /**
+        * @since 1.25
+        *
+        * @return SiteList
+        */
+       public function getSites() {
+               if ( $this->sites === null ) {
+                       $this->sites = $this->loadSitesFromCache();
+               }
+
+               return $this->sites;
+       }
+
+       /**
+        * @param string $globalId
+        *
+        * @since 1.25
+        *
+        * @return Site|null
+        */
+       public function getSite( $globalId ) {
+               $sites = $this->getSites();
+
+               return $sites->hasSite( $globalId ) ? $sites->getSite( $globalId ) : null;
+       }
+
+       /**
+        * @return SiteList
+        */
+       private function loadSitesFromCache() {
+               $data = $this->loadJsonFile();
+
+               $sites = new SiteList();
+
+               // @todo lazy initialize the site objects in the site list (e.g. only when needed to access)
+               foreach ( $data['sites'] as $siteArray ) {
+                       $sites[] = $this->newSiteFromArray( $siteArray );
+               }
+
+               return $sites;
+       }
+
+       /**
+        * @throws MWException
+        * @return array see docs/sitescache.txt for format of the array.
+        */
+       private function loadJsonFile() {
+               if ( !is_readable( $this->cacheFile ) ) {
+                       throw new MWException( 'SiteList cache file not found.' );
+               }
+
+               $contents = file_get_contents( $this->cacheFile );
+               $data = json_decode( $contents, true );
+
+               if ( !is_array( $data ) || !is_array( $data['sites'] )
+                       || !array_key_exists( 'sites', $data )
+               ) {
+                       throw new MWException( 'SiteStore json cache data is invalid.' );
+               }
+
+               return $data;
+       }
+
+       /**
+        * @param array $data
+        *
+        * @return Site
+        */
+       private function newSiteFromArray( array $data ) {
+               $siteType = array_key_exists( 'type', $data ) ? $data['type'] : Site::TYPE_UNKNOWN;
+               $site = Site::newForType( $siteType );
+
+               $site->setGlobalId( $data['globalid'] );
+               $site->setForward( $data['forward'] );
+               $site->setGroup( $data['group'] );
+               $site->setLanguageCode( $data['language'] );
+               $site->setSource( $data['source'] );
+               $site->setExtraData( $data['data'] );
+               $site->setExtraConfig( $data['config'] );
+
+               foreach ( $data['identifiers'] as $identifier ) {
+                       $site->addLocalId( $identifier['type'], $identifier['key'] );
+               }
+
+               return $site;
+       }
+
+}
index 38528d6..2c25472 100644 (file)
@@ -54,6 +54,8 @@ class HashSiteStore implements SiteStore {
         */
        public function saveSite( Site $site ) {
                $this->sites[$site->getGlobalId()] = $site;
+
+               return true;
        }
 
        /**
@@ -69,6 +71,8 @@ class HashSiteStore implements SiteStore {
                foreach ( $sites as $site ) {
                        $this->saveSite( $site );
                }
+
+               return true;
        }
 
        /**
@@ -112,6 +116,8 @@ class HashSiteStore implements SiteStore {
         */
        public function clear() {
                $this->sites = array();
+
+               return true;
        }
 
 }
diff --git a/includes/site/SiteListFileCache.php b/includes/site/SiteListFileCache.php
deleted file mode 100644 (file)
index e48a187..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-<?php
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- *
- * @license GNU GPL v2+
- */
-
-/**
- * Provides a file-based cache of a SiteStore, stored as a json file.
- * The cache can be built with the rebuildSitesCache.php maintenance script,
- * and a MediaWiki instance can be setup to use this by setting the
- * 'wgSitesCacheFile' configuration to the cache file location.
- *
- * @since 1.25
- */
-class SiteListFileCache {
-
-       /**
-        * @var SiteList
-        */
-       private $sites = null;
-
-       /**
-        * @var string
-        */
-       private $cacheFile;
-
-       /**
-        * @param string $cacheFile
-        */
-       public function __construct( $cacheFile ) {
-               $this->cacheFile = $cacheFile;
-       }
-
-       /**
-        * @since 1.25
-        *
-        * @return SiteList
-        */
-       public function getSites() {
-               if ( $this->sites === null ) {
-                       $this->sites = $this->loadSitesFromCache();
-               }
-
-               return $this->sites;
-       }
-
-       /**
-        * @param string $globalId
-        *
-        * @since 1.25
-        *
-        * @return Site|null
-        */
-       public function getSite( $globalId ) {
-               $sites = $this->getSites();
-
-               return $sites->hasSite( $globalId ) ? $sites->getSite( $globalId ) : null;
-       }
-
-       /**
-        * @return SiteList
-        */
-       private function loadSitesFromCache() {
-               $data = $this->loadJsonFile();
-
-               $sites = new SiteList();
-
-               // @todo lazy initialize the site objects in the site list (e.g. only when needed to access)
-               foreach ( $data['sites'] as $siteArray ) {
-                       $sites[] = $this->newSiteFromArray( $siteArray );
-               }
-
-               return $sites;
-       }
-
-       /**
-        * @throws MWException
-        * @return array
-        */
-       private function loadJsonFile() {
-               if ( !is_readable( $this->cacheFile ) ) {
-                       throw new MWException( 'SiteList cache file not found.' );
-               }
-
-               $contents = file_get_contents( $this->cacheFile );
-               $data = json_decode( $contents, true );
-
-               if ( !is_array( $data ) || !array_key_exists( 'sites', $data ) ) {
-                       throw new MWException( 'SiteStore json cache data is invalid.' );
-               }
-
-               return $data;
-       }
-
-       /**
-        * @param array $data
-        *
-        * @return Site
-        */
-       private function newSiteFromArray( array $data ) {
-               $siteType = array_key_exists( 'type', $data ) ? $data['type'] : Site::TYPE_UNKNOWN;
-               $site = Site::newForType( $siteType );
-
-               $site->setGlobalId( $data['globalid'] );
-               $site->setInternalId( $data['internalid'] );
-               $site->setForward( $data['forward'] );
-               $site->setGroup( $data['group'] );
-               $site->setLanguageCode( $data['language'] );
-               $site->setSource( $data['source'] );
-               $site->setExtraData( $data['data'] );
-               $site->setExtraConfig( $data['config'] );
-
-               foreach ( $data['identifiers'] as $identifier ) {
-                       $site->addLocalId( $identifier['type'], $identifier['key'] );
-               }
-
-               return $site;
-       }
-
-}
diff --git a/includes/site/SiteListFileCacheBuilder.php b/includes/site/SiteListFileCacheBuilder.php
deleted file mode 100644 (file)
index 7307a6f..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-<?php
-
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @since 1.25
- *
- * @file
- *
- * @license GNU GPL v2+
- */
-class SiteListFileCacheBuilder {
-
-       /**
-        * @var SiteStore
-        */
-       private $siteStore;
-
-       /**
-        * @var string
-        */
-       private $cacheFile;
-
-       /**
-        * @param SiteStore $siteStore
-        * @param string $cacheFile
-        */
-       public function __construct( SiteStore $siteStore, $cacheFile ) {
-               $this->siteStore = $siteStore;
-               $this->cacheFile = $cacheFile;
-       }
-
-       public function build() {
-               $this->sites = $this->siteStore->getSites( 'recache' );
-               $this->cacheSites( $this->sites->getArrayCopy() );
-       }
-
-       /**
-        * @param Site[] $sites
-        *
-        * @throws MWException if in manualRecache mode
-        * @return bool
-        */
-       private function cacheSites( array $sites ) {
-               $sitesArray = array();
-
-               foreach ( $sites as $site ) {
-                       $globalId = $site->getGlobalId();
-                       $sitesArray[$globalId] = $this->getSiteAsArray( $site );
-               }
-
-               $json = json_encode( array(
-                       'sites' => $sitesArray
-               ) );
-
-               $result = file_put_contents( $this->cacheFile, $json );
-
-               return $result !== false;
-       }
-
-       /**
-        * @param Site $site
-        *
-        * @return array
-        */
-       private function getSiteAsArray( Site $site ) {
-               $siteEntry = unserialize( $site->serialize() );
-               $siteIdentifiers = $this->buildLocalIdentifiers( $site );
-               $identifiersArray = array();
-
-               foreach ( $siteIdentifiers as $identifier ) {
-                       $identifiersArray[] = $identifier;
-               }
-
-               $siteEntry['identifiers'] = $identifiersArray;
-
-               return $siteEntry;
-       }
-
-       /**
-        * @param Site $site
-        *
-        * @return array Site local identifiers
-        */
-       private function buildLocalIdentifiers( Site $site ) {
-               $localIds = array();
-
-               foreach ( $site->getLocalIds() as $idType => $ids ) {
-                       foreach ( $ids as $id ) {
-                               $localIds[] = array(
-                                       'type' => $idType,
-                                       'key' => $id
-                               );
-                       }
-               }
-
-               return $localIds;
-       }
-
-}
diff --git a/includes/site/SiteLookup.php b/includes/site/SiteLookup.php
new file mode 100644 (file)
index 0000000..610bf0b
--- /dev/null
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * Interface for service objects providing a lookup of Site objects.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.25
+ *
+ * @file
+ * @ingroup Site
+ *
+ * @license GNU GPL v2+
+ */
+interface SiteLookup {
+
+       /**
+        * Returns the site with provided global id, or null if there is no such site.
+        *
+        * @since 1.25
+        *
+        * @param string $globalId
+        *
+        * @return Site|null
+        */
+       public function getSite( $globalId );
+
+       /**
+        * Returns a list of all sites.
+        *
+        * @since 1.25
+        *
+        * @return SiteList
+        */
+       public function getSites();
+
+}
index 8f25c76..d77f07b 100644 (file)
  * @license GNU GPL v2+
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
-class SiteSQLStore implements SiteStore {
-       /**
-        * @since 1.21
-        *
-        * @var SiteList|null
-        */
-       protected $sites = null;
-
-       /**
-        * @var ORMTable
-        */
-       protected $sitesTable;
-
-       /**
-        * @var string|null
-        */
-       private $cacheKey = null;
-
-       /**
-        * @var int
-        */
-       private $cacheTimeout = 3600;
-
-       /**
-        * @var BagOStuff
-        */
-       private $cache;
+class SiteSQLStore extends CachingSiteStore {
 
        /**
         * @since 1.21
+        * @deprecated 1.25 Construct a SiteStore instance directly instead.
         *
         * @param ORMTable|null $sitesTable
         * @param BagOStuff|null $cache
@@ -69,370 +44,9 @@ class SiteSQLStore implements SiteStore {
                        $cache = wfGetMainCache();
                }
 
-               return new static( $cache, $sitesTable );
-       }
-
-       /**
-        * Constructor.
-        *
-        * @since 1.21
-        *
-        * @param BagOStuff $cache
-        * @param ORMTable|null $sitesTable
-        */
-       protected function __construct( BagOStuff $cache, ORMTable $sitesTable = null ) {
-               if ( $sitesTable === null ) {
-                       $sitesTable = $this->newSitesTable();
-               }
-
-               $this->cache = $cache;
-               $this->sitesTable = $sitesTable;
-       }
-
-       /**
-        * Constructs a cache key to use for caching the list of sites.
-        *
-        * This includes the concrete class name of the site list as well as a version identifier
-        * for the list's serialization, to avoid problems when unserializing site lists serialized
-        * by an older version, e.g. when reading from a cache.
-        *
-        * The cache key also includes information about where the sites were loaded from, e.g.
-        * the name of a database table.
-        *
-        * @see SiteList::getSerialVersionId
-        *
-        * @return string The cache key.
-        */
-       protected function getCacheKey() {
-
-               if ( $this->cacheKey === null ) {
-                       $type = 'SiteList#' . SiteList::getSerialVersionId();
-                       $source = $this->sitesTable->getName();
-
-                       if ( $this->sitesTable->getTargetWiki() !== false ) {
-                               $source = $this->sitesTable->getTargetWiki() . '.' . $source;
-                       }
-
-                       $this->cacheKey = wfMemcKey( "$source/$type" );
-               }
-
-               return $this->cacheKey;
-       }
-
-       /**
-        * @see SiteStore::getSites
-        *
-        * @since 1.21
-        *
-        * @param string $source Either 'cache' or 'recache'
-        *
-        * @return SiteList
-        */
-       public function getSites( $source = 'cache' ) {
-
-               if ( $source === 'cache' ) {
-                       if ( $this->sites === null ) {
-                               $sites = $this->cache->get( $this->getCacheKey() );
-
-                               if ( is_object( $sites ) ) {
-                                       $this->sites = $sites;
-                               } else {
-                                       $this->loadSites();
-                               }
-                       }
-               }
-               else {
-                       $this->loadSites();
-               }
-
-               return $this->sites;
-       }
-
-       /**
-        * Returns a new Site object constructed from the provided ORMRow.
-        *
-        * @since 1.21
-        *
-        * @param ORMRow $siteRow
-        *
-        * @return Site
-        */
-       protected function siteFromRow( ORMRow $siteRow ) {
-
-               $site = Site::newForType( $siteRow->getField( 'type', Site::TYPE_UNKNOWN ) );
-
-               $site->setGlobalId( $siteRow->getField( 'global_key' ) );
-
-               $site->setInternalId( $siteRow->getField( 'id' ) );
-
-               if ( $siteRow->hasField( 'forward' ) ) {
-                       $site->setForward( $siteRow->getField( 'forward' ) );
-               }
-
-               if ( $siteRow->hasField( 'group' ) ) {
-                       $site->setGroup( $siteRow->getField( 'group' ) );
-               }
-
-               if ( $siteRow->hasField( 'language' ) ) {
-                       $site->setLanguageCode( $siteRow->getField( 'language' ) === ''
-                               ? null
-                               : $siteRow->getField( 'language' )
-                       );
-               }
-
-               if ( $siteRow->hasField( 'source' ) ) {
-                       $site->setSource( $siteRow->getField( 'source' ) );
-               }
-
-               if ( $siteRow->hasField( 'data' ) ) {
-                       $site->setExtraData( $siteRow->getField( 'data' ) );
-               }
-
-               if ( $siteRow->hasField( 'config' ) ) {
-                       $site->setExtraConfig( $siteRow->getField( 'config' ) );
-               }
-
-               return $site;
-       }
-
-       /**
-        * Get a new ORMRow from a Site object
-        *
-        * @since 1.22
-        *
-        * @param Site $site
-        *
-        * @return ORMRow
-        */
-       protected function getRowFromSite( Site $site ) {
-               $fields = array(
-                       // Site data
-                       'global_key' => $site->getGlobalId(), // TODO: check not null
-                       'type' => $site->getType(),
-                       'group' => $site->getGroup(),
-                       'source' => $site->getSource(),
-                       'language' => $site->getLanguageCode() === null ? '' : $site->getLanguageCode(),
-                       'protocol' => $site->getProtocol(),
-                       'domain' => strrev( $site->getDomain() ) . '.',
-                       'data' => $site->getExtraData(),
-
-                       // Site config
-                       'forward' => $site->shouldForward(),
-                       'config' => $site->getExtraConfig(),
-               );
-
-               if ( $site->getInternalId() !== null ) {
-                       $fields['id'] = $site->getInternalId();
-               }
-
-               return new ORMRow( $this->sitesTable, $fields );
-       }
-
-       /**
-        * Fetches the site from the database and loads them into the sites field.
-        *
-        * @since 1.21
-        */
-       protected function loadSites() {
-
-               $this->sites = new SiteList();
-
-               foreach ( $this->sitesTable->select() as $siteRow ) {
-                       $this->sites[] = $this->siteFromRow( $siteRow );
-               }
-
-               // Batch load the local site identifiers.
-               $ids = wfGetDB( $this->sitesTable->getReadDb() )->select(
-                       'site_identifiers',
-                       array(
-                               'si_site',
-                               'si_type',
-                               'si_key',
-                       ),
-                       array(),
-                       __METHOD__
-               );
-
-               foreach ( $ids as $id ) {
-                       if ( $this->sites->hasInternalId( $id->si_site ) ) {
-                               $site = $this->sites->getSiteByInternalId( $id->si_site );
-                               $site->addLocalId( $id->si_type, $id->si_key );
-                               $this->sites->setSite( $site );
-                       }
-               }
-
-               $this->cache->set( $this->getCacheKey(), $this->sites, $this->cacheTimeout );
-
-       }
-
-       /**
-        * @see SiteStore::getSite
-        *
-        * @since 1.21
-        *
-        * @param string $globalId
-        * @param string $source
-        *
-        * @return Site|null
-        */
-       public function getSite( $globalId, $source = 'cache' ) {
-
-               $sites = $this->getSites( $source );
-
-               return $sites->hasSite( $globalId ) ? $sites->getSite( $globalId ) : null;
-       }
-
-       /**
-        * @see SiteStore::saveSite
-        *
-        * @since 1.21
-        *
-        * @param Site $site
-        *
-        * @return bool Success indicator
-        */
-       public function saveSite( Site $site ) {
-               return $this->saveSites( array( $site ) );
-       }
-
-       /**
-        * @see SiteStore::saveSites
-        *
-        * @since 1.21
-        *
-        * @param Site[] $sites
-        *
-        * @return bool Success indicator
-        */
-       public function saveSites( array $sites ) {
-
-               if ( empty( $sites ) ) {
-                       return true;
-               }
-
-               $dbw = $this->sitesTable->getWriteDbConnection();
-
-               $dbw->startAtomic( __METHOD__ );
-
-               $success = true;
-
-               $internalIds = array();
-               $localIds = array();
-
-               foreach ( $sites as $site ) {
-                       if ( $site->getInternalId() !== null ) {
-                               $internalIds[] = $site->getInternalId();
-                       }
-
-                       $siteRow = $this->getRowFromSite( $site );
-                       $success = $siteRow->save( __METHOD__ ) && $success;
-
-                       foreach ( $site->getLocalIds() as $idType => $ids ) {
-                               foreach ( $ids as $id ) {
-                                       $localIds[] = array( $siteRow->getId(), $idType, $id );
-                               }
-                       }
-               }
-
-               if ( $internalIds !== array() ) {
-                       $dbw->delete(
-                               'site_identifiers',
-                               array( 'si_site' => $internalIds ),
-                               __METHOD__
-                       );
-               }
-
-               foreach ( $localIds as $localId ) {
-                       $dbw->insert(
-                               'site_identifiers',
-                               array(
-                                       'si_site' => $localId[0],
-                                       'si_type' => $localId[1],
-                                       'si_key' => $localId[2],
-                               ),
-                               __METHOD__
-                       );
-               }
-
-               $dbw->endAtomic( __METHOD__ );
-
-               // purge cache
-               $this->reset();
-
-               return $success;
-       }
-
-       /**
-        * Purges the internal and external cache of the site list, forcing the list
-        * of sites to be re-read from the database.
-        *
-        * @since 1.21
-        */
-       public function reset() {
-               // purge cache
-               $this->cache->delete( $this->getCacheKey() );
-               $this->sites = null;
-
-       }
-
-       /**
-        * Clears the list of sites stored in the database.
-        *
-        * @see SiteStore::clear()
-        *
-        * @return bool Success
-        */
-       public function clear() {
-               $dbw = $this->sitesTable->getWriteDbConnection();
-
-               $dbw->startAtomic( __METHOD__ );
-               $ok = $dbw->delete( 'sites', '*', __METHOD__ );
-               $ok = $dbw->delete( 'site_identifiers', '*', __METHOD__ ) && $ok;
-               $dbw->endAtomic( __METHOD__ );
-
-               $this->reset();
-
-               return $ok;
-       }
-
-       /**
-        * @since 1.21
-        *
-        * @return ORMTable
-        */
-       protected function newSitesTable() {
-               return new ORMTable(
-                       'sites',
-                       array(
-                               'id' => 'id',
-
-                               // Site data
-                               'global_key' => 'str',
-                               'type' => 'str',
-                               'group' => 'str',
-                               'source' => 'str',
-                               'language' => 'str',
-                               'protocol' => 'str',
-                               'domain' => 'str',
-                               'data' => 'array',
-
-                               // Site config
-                               'forward' => 'bool',
-                               'config' => 'array',
-                       ),
-                       array(
-                               'type' => Site::TYPE_UNKNOWN,
-                               'group' => Site::GROUP_NONE,
-                               'source' => Site::SOURCE_LOCAL,
-                               'data' => array(),
+               $siteStore = new DBSiteStore();
 
-                               'forward' => false,
-                               'config' => array(),
-                               'language' => '',
-                       ),
-                       'ORMRow',
-                       'site_'
-               );
+               return new static( $siteStore, $cache );
        }
 
 }
index 537f1cc..10e0c1b 100644 (file)
@@ -26,7 +26,7 @@
  * @license GNU GPL v2+
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
-interface SiteStore {
+interface SiteStore extends SiteLookup {
 
        /**
         * Saves the provided site.
@@ -50,33 +50,6 @@ interface SiteStore {
         */
        public function saveSites( array $sites );
 
-       /**
-        * Returns the site with provided global id, or null if there is no such site.
-        *
-        * @since 1.21
-        *
-        * @param string $globalId
-        * @param string $source Either 'cache' or 'recache'.
-        * If 'cache', the values are allowed (but not obliged) to come from a cache.
-        *
-        * @return Site|null
-        */
-       public function getSite( $globalId, $source = 'cache' );
-
-       /**
-        * Returns a list of all sites. By default this site is
-        * fetched from the cache, which can be changed to loading
-        * the list from the database using the $useCache parameter.
-        *
-        * @since 1.21
-        *
-        * @param string $source Either 'cache' or 'recache'.
-        * If 'cache', the values are allowed (but not obliged) to come from a cache.
-        *
-        * @return SiteList
-        */
-       public function getSites( $source = 'cache' );
-
        /**
         * Deletes all sites from the database. After calling clear(), getSites() will return an empty
         * list and getSite() will return null until saveSite() or saveSites() is called.
diff --git a/includes/site/SitesCacheFileBuilder.php b/includes/site/SitesCacheFileBuilder.php
new file mode 100644 (file)
index 0000000..2e42040
--- /dev/null
@@ -0,0 +1,113 @@
+<?php
+
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.25
+ *
+ * @file
+ *
+ * @license GNU GPL v2+
+ */
+class SitesCacheFileBuilder {
+
+       /**
+        * @var SiteLookup
+        */
+       private $siteLookup;
+
+       /**
+        * @var string
+        */
+       private $cacheFile;
+
+       /**
+        * @param SiteLookup $siteLookup
+        * @param string $cacheFile
+        */
+       public function __construct( SiteLookup $siteLookup, $cacheFile ) {
+               $this->siteLookup = $siteLookup;
+               $this->cacheFile = $cacheFile;
+       }
+
+       public function build() {
+               $this->sites = $this->siteLookup->getSites();
+               $this->cacheSites( $this->sites->getArrayCopy() );
+       }
+
+       /**
+        * @param Site[] $sites
+        *
+        * @throws MWException if in manualRecache mode
+        * @return bool
+        */
+       private function cacheSites( array $sites ) {
+               $sitesArray = array();
+
+               foreach ( $sites as $site ) {
+                       $globalId = $site->getGlobalId();
+                       $sitesArray[$globalId] = $this->getSiteAsArray( $site );
+               }
+
+               $json = json_encode( array(
+                       'sites' => $sitesArray
+               ) );
+
+               $result = file_put_contents( $this->cacheFile, $json );
+
+               return $result !== false;
+       }
+
+       /**
+        * @param Site $site
+        *
+        * @return array
+        */
+       private function getSiteAsArray( Site $site ) {
+               $siteEntry = unserialize( $site->serialize() );
+               $siteIdentifiers = $this->buildLocalIdentifiers( $site );
+               $identifiersArray = array();
+
+               foreach ( $siteIdentifiers as $identifier ) {
+                       $identifiersArray[] = $identifier;
+               }
+
+               $siteEntry['identifiers'] = $identifiersArray;
+
+               return $siteEntry;
+       }
+
+       /**
+        * @param Site $site
+        *
+        * @return array Site local identifiers
+        */
+       private function buildLocalIdentifiers( Site $site ) {
+               $localIds = array();
+
+               foreach ( $site->getLocalIds() as $idType => $ids ) {
+                       foreach ( $ids as $id ) {
+                               $localIds[] = array(
+                                       'type' => $idType,
+                                       'key' => $id
+                               );
+                       }
+               }
+
+               return $localIds;
+       }
+
+}
index 21e465a..9056761 100644 (file)
@@ -89,11 +89,9 @@ abstract class FormSpecialPage extends SpecialPage {
         * @return HTMLForm|null
         */
        protected function getForm() {
-               $this->fields = $this->getFormFields();
-
                $form = HTMLForm::factory(
                        $this->getDisplayFormat(),
-                       $this->fields,
+                       $this->getFormFields(),
                        $this->getContext(),
                        $this->getMessagePrefix()
                );
index 91a148d..7028fdc 100644 (file)
@@ -135,7 +135,7 @@ class SpecialBookSources extends SpecialPage {
                        'isbn',
                        20,
                        $this->isbn,
-                       array( 'autofocus' => true, 'class' => 'mw-ui-input-inline' )
+                       array( 'autofocus' => '', 'class' => 'mw-ui-input-inline' )
                );
 
                $form .= '&#160;' . Html::submitButton(
index 77d2317..799e526 100644 (file)
@@ -53,6 +53,7 @@ class SpecialDiff extends RedirectSpecialPage {
                        $this->mAddedRedirectParams['diff'] = $parts[1];
                } else {
                        // Wrong number of parameters, bail out
+                       $this->getOutput()->addHelpLink( 'Help:Diff' );
                        throw new ErrorPageError( 'nopagetitle', 'nopagetext' );
                }
 
index 891ea01..b7582e6 100644 (file)
@@ -154,7 +154,7 @@ class SpecialExpandTemplates extends SpecialPage {
                        'contexttitle',
                        60,
                        $title,
-                       array( 'autofocus' => true, 'class' => 'mw-ui-input-inline' )
+                       array( 'autofocus' => '', 'class' => 'mw-ui-input-inline' )
                ) . '</p>';
                $form .= '<p>' . Xml::label(
                        $this->msg( 'expand_templates_input' )->text(),
index aa9b0f4..af86964 100644 (file)
@@ -546,7 +546,6 @@ class ImportReporter extends ContextSource {
                                        "</li>\n"
                        );
 
-                       $log = new LogPage( 'import' );
                        if ( $this->mIsUpload ) {
                                $detail = $this->msg( 'import-logentry-upload-detail' )->numParams(
                                        $successCount )->inContentLanguage()->text();
@@ -554,7 +553,7 @@ class ImportReporter extends ContextSource {
                                        $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text()
                                                . $this->reason;
                                }
-                               $log->addEntry( 'upload', $title, $detail, array(), $this->getUser() );
+                               $action = 'upload';
                        } else {
                                $interwiki = '[[:' . $this->mInterwiki . ':' .
                                        $foreignTitle->getFullText() . ']]';
@@ -564,9 +563,16 @@ class ImportReporter extends ContextSource {
                                        $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text()
                                                . $this->reason;
                                }
-                               $log->addEntry( 'interwiki', $title, $detail, array(), $this->getUser() );
+                               $action = 'interwiki';
                        }
 
+                       $logEntry = new ManualLogEntry( 'import', $action );
+                       $logEntry->setTarget( $title );
+                       $logEntry->setComment( $detail );
+                       $logEntry->setPerformer( $this->getUser() );
+                       $logid = $logEntry->insert();
+                       $logEntry->publish( $logid );
+
                        $comment = $detail; // quick
                        $dbw = wfGetDB( DB_MASTER );
                        $latest = $title->getLatestRevID();
index 69436bf..b6f19ec 100644 (file)
@@ -68,6 +68,8 @@ class SpecialRandomInCategory extends FormSpecialPage {
        }
 
        protected function getFormFields() {
+               $this->getOutput()->addHelpLink( 'Help:RandomInCategory' );
+
                $form = array(
                        'category' => array(
                                'type' => 'text',
index 7a350c7..e0a964e 100644 (file)
@@ -374,10 +374,12 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $userAllowed = true;
 
                // Messages: revdelete-selected-text, revdelete-selected-file, logdelete-selected
-               $this->getOutput()->wrapWikiMsg( "<strong>$1</strong>", array( $this->typeLabels['selected'],
+               $out = $this->getOutput();
+               $out->wrapWikiMsg( "<strong>$1</strong>", array( $this->typeLabels['selected'],
                        $this->getLanguage()->formatNum( count( $this->ids ) ), $this->targetObj->getPrefixedText() ) );
 
-               $this->getOutput()->addHTML( "<ul>" );
+               $out->addHelpLink( 'Help:RevisionDelete' );
+               $out->addHTML( "<ul>" );
 
                $numRevisions = 0;
                // Live revisions...
@@ -395,14 +397,14 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        }
 
                        $numRevisions++;
-                       $this->getOutput()->addHTML( $item->getHTML() );
+                       $out->addHTML( $item->getHTML() );
                }
 
                if ( !$numRevisions ) {
                        throw new ErrorPageError( 'revdelete-nooldid-title', 'revdelete-nooldid-text' );
                }
 
-               $this->getOutput()->addHTML( "</ul>" );
+               $out->addHTML( "</ul>" );
                // Explanation text
                $this->addUsageText();
 
@@ -413,7 +415,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 
                // Show form if the user can submit
                if ( $this->mIsAllowed ) {
-                       $out = Xml::openElement( 'form', array( 'method' => 'post',
+                       $form = Xml::openElement( 'form', array( 'method' => 'post',
                                        'action' => $this->getPageTitle()->getLocalURL( array( 'action' => 'submit' ) ),
                                        'id' => 'mw-revdel-form-revisions' ) ) .
                                Xml::fieldset( $this->msg( 'revdelete-legend' )->text() ) .
@@ -465,12 +467,12 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                        array(),
                                        array( 'action' => 'edit' )
                                );
-                               $out .= Xml::tags( 'p', array( 'class' => 'mw-revdel-editreasons' ), $link ) . "\n";
+                               $form .= Xml::tags( 'p', array( 'class' => 'mw-revdel-editreasons' ), $link ) . "\n";
                        }
                } else {
-                       $out = '';
+                       $form = '';
                }
-               $this->getOutput()->addHTML( $out );
+               $out->addHTML( $form );
        }
 
        /**
index ff263b6..0b8147e 100644 (file)
@@ -114,6 +114,12 @@ class SpecialTags extends SpecialPage {
                $showActions = $user->isAllowed( 'managechangetags' );
 
                // Write the headers
+               $tagUsageStatistics = ChangeTags::tagUsageStatistics();
+
+               // Show header only if there exists atleast one tag
+               if ( !$tagUsageStatistics ) {
+                       return;
+               }
                $html = Xml::tags( 'tr', null, Xml::tags( 'th', null, $this->msg( 'tags-tag' )->parse() ) .
                        Xml::tags( 'th', null, $this->msg( 'tags-display-header' )->parse() ) .
                        Xml::tags( 'th', null, $this->msg( 'tags-description-header' )->parse() ) .
@@ -134,7 +140,7 @@ class SpecialTags extends SpecialPage {
                $this->extensionActivatedTags = array_fill_keys(
                        ChangeTags::listExtensionActivatedTags(), true );
 
-               foreach ( ChangeTags::tagUsageStatistics() as $tag => $hitcount ) {
+               foreach ( $tagUsageStatistics as $tag => $hitcount ) {
                        $html .= $this->doTagRow( $tag, $hitcount, $showActions );
                }
 
index 205e2f4..de2365e 100644 (file)
@@ -841,7 +841,7 @@ class SpecialUndelete extends SpecialPage {
                                        'prefix',
                                        20,
                                        $this->mSearchPrefix,
-                                       array( 'id' => 'prefix', 'autofocus' => true )
+                                       array( 'id' => 'prefix', 'autofocus' => '' )
                                ) . ' ' .
                                Xml::submitButton( $this->msg( 'undelete-search-submit' )->text() ) .
                                Xml::closeElement( 'fieldset' ) .
@@ -1314,7 +1314,7 @@ class SpecialUndelete extends SpecialPage {
                                        'wpComment',
                                        50,
                                        $this->mComment,
-                                       array( 'id' => 'wpComment', 'autofocus' => true )
+                                       array( 'id' => 'wpComment', 'autofocus' => '' )
                                ) .
                                "</td>
                        </tr>
index 7dd2b87..785a844 100644 (file)
@@ -441,7 +441,7 @@ class UserrightsPage extends SpecialPage {
                                30,
                                str_replace( '_', ' ', $this->mTarget ),
                                array(
-                                       'autofocus' => true,
+                                       'autofocus' => '',
                                        'class' => 'mw-autocomplete-user', // used by mediawiki.userSuggest
                                )
                        ) . ' ' .
index 92675cd..9221af9 100644 (file)
        "actions": "Fremmunga",
        "namespaces": "Namstedas",
        "variants": "Missenlīcnessa",
+       "navigation-heading": "Sōcne getæl",
        "errorpagetitle": "Wōh",
        "returnto": "Gān eft tō $1",
        "tagline": "Fram {{SITENAME}}",
        "permalink": "Fæst hlenca",
        "print": "Ūtmǣlan",
        "view": "Sihþ",
+       "view-foreign": "Sihþ on $1",
        "edit": "Adihtan",
        "create": "Scieppan",
+       "create-local": "Besettan stōwlice gemearcunge",
        "editthispage": "Adihtan þisne tramet",
        "create-this-page": "Scieppan þisne tramet",
        "delete": "Forlēosan",
        "retypenew": "Wrīt nīwe þafungword eft:",
        "resetpass-submit-loggedin": "Andwendan þafungword",
        "resetpass-submit-cancel": "Undōn",
+       "passwordreset": "Settan þafungword eft",
        "passwordreset-legend": "Settan þafungword eft",
        "passwordreset-username": "Brūcendnama:",
        "bold_sample": "Þicce traht",
        "note": "'''Gewritincel:'''",
        "previewnote": "<strong>Beþenc þe þis is gīet efne forebysen.</strong>\nÞīna andwendunga gīet ne sind hordoda!",
        "editing": "Adihtende $1",
+       "creating": "Scipþ nū $1",
        "editingsection": "Adihtende $1 (dǣl)",
        "editingcomment": "Adihtende $1 (nīwe dǣl)",
        "editconflict": "Adihtunge wiþdǣd: $1",
        "permissionserrors": "Þafunge wōh",
        "permissionserrorstext-withaction": "Þū ne hæfst þafunge tō $2, for {{PLURAL:$1|þisre race|þissum racum}}:",
        "recreate-moveddeleted-warn": "'''Warnung: Þū edsciepst tramet þe wæs ǣr forloren.'''\n\nÞu sceoldest smēagan, hwæðer hit gerādlīc sīe, forþ tō gānne mid þǣre adihtunge þisses trametes.\nÞæt forlēosunge and wegunge ealdhord þisses trametes is hēr geīeht for behēfnesse:",
+       "moveddeleted-notice": "Þes tramet wæs forloren.\nÞæt forlēosunge and wǣgunge stǣr þæs trametes is geīwed hēr.",
        "viewpagelogs": "Sēon þisses trametes ealdhold",
        "nohistory": "Nis nān adihtunge stǣr for þissum tramete.",
        "currentrev-asof": "Nīwost fadung on þǣre $3. tīde þæs $2.",
        "mergehistory-reason": "Racu:",
        "revertmerge": "Settan þā geānlǣcinge on bæc",
        "history-title": "Ednīwunga stǣr for \"$1\"",
+       "difference-title": "Fǣgness betweox fadungum \"$1\"",
        "lineno": "$1. līne:",
        "compareselectedversions": "Bemetan gecorena ednīwunga",
        "editundo": "undōn",
        "searchprofile-articles": "Innunge trametas",
        "searchprofile-images": "Missenendebyrdness",
        "searchprofile-everything": "Gehwæt",
+       "searchprofile-advanced": "Manigfeald",
        "searchprofile-articles-tooltip": "Sēcan in $1",
        "searchprofile-images-tooltip": "Sēcan ymelan",
+       "searchprofile-everything-tooltip": "Sēcan geond ealla innunga (ēac mōtungum)",
        "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 worda}})",
        "search-redirect": "(edlǣded fram \"$1\")",
        "search-section": "(dǣl $1)",
        "searchrelated": "gesibb",
        "searchall": "eall",
        "showingresults": "Īewan under oþ <b>$1</b> tōhīgunga onginnenda mid #<b>$2</b>.",
+       "search-nonefound": "Ne cūðe findan þæt þū woldest.",
        "powersearch-legend": "Manigfeald sēcung",
        "powersearch-ns": "Sēcan in namstedum:",
        "search-external": "Ūtanweard sōcn",
        "rightslog": "Brūcenda riht cranic",
        "action-edit": "adihtan þisne tramet",
        "nchanges": "$1 {{PLURAL:$1|andwendung|andwendunga}}",
+       "enhancedrc-history": "stǣr",
        "recentchanges": "Nīwa andwendunga",
        "recentchanges-legend": "Nīwra andwendunga cyras",
        "recentchanges-summary": "Sēon þā nīwostan andwendunga þisses wiki on þissum tramete",
        "recentchanges-label-newpage": "Þēos adihtung scōp nīwne tramet",
        "recentchanges-label-minor": "Þēos is lytel adihtung",
        "recentchanges-label-bot": "Searuþrǣl fremede þās adihtunge",
+       "recentchanges-label-plusminus": "Þæs trametes micelness wæs andwended þȳs rīme grēatbitena",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (seoh ēac [[Special:NewPages|getæl nīwra trameta]])",
        "rcnotefrom": "Niðer sind þā andwendunga fram <strong>$2</strong> (mǣst īweþ <strong>$1</strong>).",
        "rclistfrom": "Īwan nīwa andwendunga fram $3 $2 and siþþan",
        "rcshowhideminor": "$1 lytela adihtunga",
+       "rcshowhideminor-show": "Īwan",
+       "rcshowhideminor-hide": "Hȳdan",
        "rcshowhidebots": "$1 searuþrǣlas",
+       "rcshowhidebots-show": "Īwan",
+       "rcshowhidebots-hide": "Hȳdan",
        "rcshowhideliu": "$1 brūcendas on nambēc",
+       "rcshowhideliu-hide": "Hȳdan",
        "rcshowhideanons": "$1 uncūðe brūcendas",
+       "rcshowhideanons-show": "Īwan",
+       "rcshowhideanons-hide": "Hȳdan",
        "rcshowhidemine": "$1 mīna adihtunga",
+       "rcshowhidemine-show": "Īwan",
+       "rcshowhidemine-hide": "Hȳdan",
        "rclinks": "Īwan þā nīwostan $1 andwendunga in þissum nīehstum $2 daga<br />$3",
        "diff": "scēad",
        "hist": "stǣr",
        "morelinkstoimage": "Sēon [[Special:WhatLinksHere/$1|mā hlencan]] tō þisre ymelan.",
        "duplicatesoffile": "{{PLURAL:$1|Sēol folgiende ymele is gelīcnes|Þā folgiendan ymelan sind gelīcnessa}} þisse ymelan (seoh [[Special:FileDuplicateSearch/$2|mā cȳþþe ymbe þis]]):",
        "sharedupload": "Þēos ymele is fram $1 and man mæg hīe brūcan on ōðrum weorcum.",
+       "sharedupload-desc-here": "Þēos ymele is fram $1 and cann wesan gebrocen fram ōðrum weorcum. Sēo amearcung on hire [$2 tramete ymelan amearcunge] þǣr is hēr geīwed.",
        "uploadnewversion-linktext": "Hladan nīwe fadunge þisse ymelan forþ",
+       "upload-disallowed-here": "Þū ne canst wrītan ofer þisse ymelan.",
        "filerevert-legend": "Settan ymelan on bæc",
        "filedelete-submit": "Forlēosan",
        "unusedtemplateswlh": "ōðre hlencan",
        "pager-older-n": "{{PLURAL:$1|ieldre 1|ieldran $1}}",
        "booksources": "Bōcfruman",
        "booksources-search-legend": "Sēcan bōcfruman",
+       "booksources-search": "Sēcan",
        "booksources-text": "Niðer is getæl hlencena tō ōðrum webstedum þe cīpaþ nīwa and gebrocena bēc, and wēninga hæbben ēac mā cȳþþu ymbe bēc þe þu sēcst:",
        "specialloguserlabel": "Gelǣstende brūcend:",
        "speciallogtitlelabel": "Ende (trametes titul oþþe brūcendes nama):",
        "tooltip-pt-mycontris": "Getæl þīnra forðunga",
        "tooltip-pt-login": "Man þē byldeþ to inmeldienne; þēah, þis nis abeden",
        "tooltip-pt-logout": "Ūtmeldian",
+       "tooltip-pt-createaccount": "Þū āhst wyrcan grīman tō brūcenne, ac þū ne þearft þæt dōn.",
        "tooltip-ca-talk": "Mōtung ymbe þone innunge tramet",
        "tooltip-ca-edit": "Þū meaht þisne tramet adihtan. Brūc lā þone fōrebysene cnæpp ǣr þū hordie.",
        "tooltip-ca-addsection": "Beginnan nīwne dǣl",
        "tooltip-compareselectedversions": "Sēon þā gescēad betweonan þǣm twǣm gecorenum fadungum þisses trametes",
        "tooltip-watch": "Ēacnian þīn behealdungtæl mid þissum tramete",
        "tooltip-undo": "\"Undōn\" undēþ þās adihtunge and openaþ þǣre adihtunge bysene tō fōrebysene. Man cann secgan race on þǣre sceortnesse.",
+       "tooltip-summary": "Wrītan sceorte gemearcunge",
        "anonymous": "{{PLURAL:$1|uncūþ brūcend|uncūðra brūcenda}} of {{SITENAME}}",
        "siteuser": "{{SITENAME}}n brūcend $1",
        "others": "ōðru",
        "anonusers": "{{SITENAME}} {{PLURAL:$2|uncūþ brūcend|uncūðra brūcenda}} $1",
+       "pageinfo-toolboxlink": "Trametes cȳþþu",
        "previousdiff": "← Ieldre adihtung",
        "nextdiff": "Nīwre adihtung →",
        "imagemaxsize": "Mǣst biliðes micelness:<br />''(for ymelena amearcunga trametum)''",
        "file-nohires": "Þǣr nis nǣnig māre micelness.",
        "svg-long-desc": "SVG ymele, rihte $1 × $2 pixela, ymelan micelness: $3",
        "show-big-image": "Frumlicu ymele",
+       "show-big-image-preview": "Micelness þisre forebysene: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Ōðru biliðes micelness|Ōðra biliða micelnessa}}: $1.",
+       "show-big-image-size": "$1 be $2 dotta",
        "imagelisttext": "Niðer is getæl '''$1''' {{PLURAL:$1|ymelan|ymelena}}, endebyrded on $2.",
        "noimages": "Nāht tō sēonne.",
        "ilsubmit": "Sēcan",
        "exif-imagewidth": "Wīdnes",
        "exif-imagelength": "Hīehþ",
        "exif-compression": "Ȝeþryccungmōd",
+       "exif-orientation": "Gebīgedness",
        "exif-ycbcrpositioning": "Y and C gesetednes",
+       "exif-xresolution": "Wīdnesse micelness",
+       "exif-yresolution": "Hēahþu micelness",
+       "exif-datetime": "Tælmearc and tīd þǣre ymelan andwendunge",
        "exif-imagedescription": "Biliðes nama",
+       "exif-make": "Biliðfōndes wyrhta",
+       "exif-model": "Biliþfōndes fadung",
+       "exif-software": "Weorcwrithyrst þe wæs gebrocen",
        "exif-artist": "Fruma",
+       "exif-colorspace": "Bleohmearc",
        "exif-usercomment": "Brūcendes trahtnunga",
+       "exif-datetimeoriginal": "Tælmearc and tīd þǣre wyrcunge þǣre cȳþþu",
+       "exif-datetimedigitized": "Tælmearc and tīd þǣre awendunge tō spearctellenda ymelan",
        "exif-exposuretime": "Blicestīd",
        "exif-brightnessvalue": "APEX beorhtness",
        "exif-lightsource": "Lēohtfruma",
        "exif-gpsmeasuremode": "Mētungmōd",
        "exif-gpsimgdirection": "Rihtung þæs biliðes",
        "exif-compression-1": "Unȝeþrycced",
+       "exif-orientation-1": "Gewunelic",
        "exif-meteringmode-0": "Uncūþ",
        "exif-meteringmode-1": "Geþēawisc",
        "exif-meteringmode-6": "Sām",
        "htmlform-submit": "Forþsendan",
        "htmlform-reset": "Undōn andwendunga",
        "htmlform-selectorother-other": "Ōðer",
-       "revdelete-summary": "ādihtscortnes"
+       "logentry-delete-delete": "$1 {{GENDER:$2|forlēas}} tramet $3",
+       "logentry-newusers-create": "Brūcendes grīma $1 wæs {{GENDER:$2|geworht}}",
+       "revdelete-summary": "ādihtscortnes",
+       "searchsuggest-search": "Sēcan"
 }
index 556898e..942baa3 100644 (file)
        "disclaimers": "إخلاء مسؤولية",
        "disclaimerpage": "Project:إخلاء مسؤولية عام",
        "edithelp": "مساعدة التحرير",
+       "helppage-top-gethelp": "مساعدة",
        "mainpage": "الصفحة الرئيسية",
        "mainpage-description": "الصفحة الرئيسية",
        "policy-url": "Project:سياسة",
        "import-rootpage-nosubpage": "إن النطاق \"$1\" لصفحة الجذر لا يسمح بصفحات فرعية.",
        "importlogpage": "سجل الاستيراد",
        "importlogpagetext": "عمليات الاستيراد الإدارية للصفحات مع تاريخ التعديل من ويكيات أخرى.",
-       "import-logentry-upload": "استورد [[$1]] بواسطة رفع ملف",
        "import-logentry-upload-detail": "{{PLURAL:$1|لا مراجعات|مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}}",
-       "import-logentry-interwiki": "استورد عبر الويكي $1",
        "import-logentry-interwiki-detail": "تم استيراد {{PLURAL:$1||مراجعة واحدة|مراجعتين|$1 مراجعات|$1 مراجعة}} من $2",
        "javascripttest": "اختبار جافاسكربت",
        "javascripttest-pagetext-noframework": "هذه الصفحة محجوزة لإجراء أختبارات الجافا سكريبت.",
index b202e20..28a6c5b 100644 (file)
        "april": "أفريل",
        "may_long": "ماي",
        "june": "جوان",
-       "july": "جويليي",
+       "july": "جويليا",
        "august": "أوت",
        "september": "سبتمبر",
-       "october": "أكتوبر",
+       "october": "Ø£Ù\88Ù\83تÙ\88بر",
        "november": "نوفمبر",
        "december": "ديسمبر",
        "january-gen": "جانفي",
@@ -98,9 +98,9 @@
        "apr": "أفريل",
        "may": "ماي",
        "jun": "جوان",
-       "jul": "جويليي",
+       "jul": "جويليا",
        "aug": "أوت",
-       "sep": "سيبتمبر",
+       "sep": "سبتمبر",
        "oct": "أوكتوبر",
        "nov": "نوفمبر",
        "dec": "ديسمبر",
        "faqpage": "Project:سؤالات متكرره",
        "actions": "أفعال",
        "namespaces": "بلاصه تع أسموات",
-       "variants": "متغيرات",
+       "variants": "تنويعات",
        "navigation-heading": "القايمة تاع الـتبحار",
        "errorpagetitle": "غلطه",
        "returnto": "ولي إلى $1.",
        "talkpage": "قرعَج على هاد الباجة",
        "talkpagelinktext": "ناقش",
        "specialpage": "باجة خوصوصيّة",
-       "personaltools": "ادÙ\88اÙ\84ت شخصيه",
+       "personaltools": "دÙ\88زاÙ\86 شخصيه",
        "articlepage": "شوف الباجة تاع المحتاوا",
        "talk": "مناقشه",
-       "views": "Ø´Ù\88Ù\81ات",
-       "toolbox": "صÙ\86دÙ\88Ù\82 ØªØ§Ø¹ Ø§Ù\84دÙ\88زاÙ\86",
+       "views": "استبÙ\8aاÙ\86",
+       "toolbox": "دوزان",
        "userpage": "شوف الباجة تاع المستعملي",
        "projectpage": "شوف الباجة تاع البروجي",
        "imagepage": "شوف الباجة تاع الفيشي",
        "viewcount": "هاد الباجة نشافت {{PLURAL:$1|خطرة وحدة|$1 خطرة}}.",
        "protectedpage": "باجة محضيّة",
        "jumpto": "اقفز ل:",
-       "jumptonavigation": "تجÙ\88اÙ\84",
-       "jumptosearch": "تفتاش",
+       "jumptonavigation": "تبحار",
+       "jumptosearch": "فتّش",
        "view-pool-error": "اعدرونا، السربايات راهم مغبّنين ف هاد الوقيتة.\nبزّاف المستعمليّين راهم باغيين يشوفو هاد الباجة.\nاصبرو شي وقيتة قبل ما تحاولو تلحقو لها عاود.\n\n$1",
        "generic-pool-error": "اعدرونا، السربايات راهم مغبّنين ف هاد الوقيتة.\nبزّاف المستعمليّين راهم باغيين يشوفو هاد الباجة.\nاصبرو شي وقيتة قبل ما تحاولو تلحقو لها عاود.",
        "pool-timeout": "المهلة تاع المقارعة راهي فاتت",
        "mainpage": "الباجة اللولانيّة",
        "mainpage-description": "الباجة اللوله",
        "policy-url": "Project:المقاون",
-       "portal": "المجتمع",
+       "portal": "بÙ\88رطاÙ\8a Ø§Ù\84Ù\85جتÙ\85ع",
        "portal-url": "Project:بورطاي المجتمع",
        "privacy": "السياسة تاع الخصوصيات (الدين الضيّق)",
        "privacypage": "Project:خصوصيه",
        "actionthrottledtext": "باش نحرزو من السبام، ما يمكنش تدير هاد الفعل بزّاف المرات في مدّة تاع وقت قصير، و راك ضركا فتّ هذا الحد.\nمن فضلك عاود سيّي منّا على شي دقايق.",
        "protectedpagetext": "هاد الصفحة راهي تنحضات باش ما تتبدّلش ولا شي حاجاخرة.",
        "viewsourcetext": "تنجم تشوف ولا تنسّح المصدر تاع هاد الصفحة:",
+       "viewyourtext": "تنجم تشوف و تنسّخ المصدر تاع <strong>التبدالات تاعك</strong> ف هاد الصفحة:",
+       "protectedinterface": "هاد الباجة توفّر لك وريشة (interface) تاع كتابة مديورة لل صوفتوار الّي ف هاد الويكي، و راهي مأمّنة باش تنحضا من الضرارات.\nباش تزيد ولا تبدّل طرجمات ل كامل الويكيّات، من فضلك استعمل [//translatewiki.net/ translatewiki.net] المشروع ميدياويكي تاع التبلادات.",
+       "editinginterface": "<strong>ردّ بالك:</strong>راك تبدّل صفحة الّمديورة باش تصنع النصّ تاع الواجهة تاع اللوجيسيال. التبدالات على هاد الصفحة غادي يوتّرو على الشكَل تاع الواجهة حتا عند المستعمليين لخرين.",
+       "translateinterface": "باش تزيد ولا تبدّل الطرجمات ل كامل الويكيّات، استعمل [//translatewiki.net/ translatewiki.net]، المشروع تاع التبلاد تاع الميديويكي.",
+       "exception-nologin": "ماشي مسجّل الدخول",
        "yourname": "اسم المستخدم:",
+       "userlogin-yourname": "سميّة تاع المستعملي",
+       "userlogin-yourname-ph": "دخّل السميّة تاع المستعملي تاعك",
        "yourpassword": "كلمة السر:",
+       "userlogin-yourpassword": "كلمت` السرّ",
+       "userlogin-yourpassword-ph": "دخّل كلمت` السرّ تاعك",
+       "createacct-yourpassword-ph": "دخّل كلمت` سرّ",
        "yourpasswordagain": "عاود كتبت كلمت السر:",
+       "createacct-yourpasswordagain": "أكّد كلمت` السرّ",
+       "createacct-yourpasswordagain-ph": "عاود دخّل كلمت` السرّ",
        "remembermypassword": "اتفكر الدخول تاعي ب هاذ النافيكاتور (ب مدّة حدها{{PLURAL:$1||يوم واحد|يومين|$1 إيّام|$1 يوم}})",
+       "userlogin-remembermypassword": "خلّيني مسجّل داخل",
        "login": "كونكسيون",
        "nav-login-createaccount": "تسجل/ اصنع حساب",
        "userlogin": "تسجل/ اصنع حساب",
+       "userloginnocreate": "مسجّل الدخول",
+       "logout": "مسجّل الخروج",
        "userlogout": "سجل خروج",
+       "userlogin-noaccount": "ما عندك حساب؟",
+       "userlogin-joinproject": "انضم لـ {{SITENAME}}",
        "nologin": "ما عندكش حساب مسجل؟ '''$1'''.",
        "nologinlink": "اصنع حساب",
        "createaccount": "اصنع حساب",
        "gotaccount": "عندك حساب مسجل؟ '''$1'''.",
        "gotaccountlink": "كونكسيون",
        "userlogin-resetlink": "نسيت تفاصيل الدخول؟",
+       "userlogin-resetpassword-link": "راك ناسي كلمت` السرّ؟",
+       "userlogin-helplink2": "معاونة ف تسجال الدخول",
+       "createacct-emailrequired": "علوان تاع إيمال",
+       "createacct-emailoptional": "علوان ليمال (ماشي مسيّف)",
+       "createacct-email-ph": "دخّل علوان` ليمال تاعك",
+       "createacct-another-email-ph": "دخّل علوان تاع إيمال",
+       "createaccountreason": "سبّة:",
+       "createacct-reason": "سبّة",
+       "createacct-captcha": "تحقق أمني",
+       "createacct-imgcaptcha-ph": "دخّل النصّ الّي راك تشوفهُ لفوق",
+       "createacct-submit": "اصنع حسابك",
+       "createacct-benefit-heading": "{{SITENAME}} مخلوق من عند شي ناس غير كيفك.",
+       "createacct-benefit-body1": "{{PLURAL:$1|تحرير|تحريرات}}",
+       "createacct-benefit-body2": "$1 {{PLURAL:$1|صفحة|صفحات}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|مساهم|مساهمين}} توالا",
        "mailmypassword": "أرسل لي كلمة سر جديده",
        "loginlanguagelabel": "اللوغه: $1",
        "pt-login": "دخله",
+       "pt-login-button": "دخول",
        "pt-createaccount": "اصنع حساب",
+       "pt-userlogout": "خروج",
+       "passwordreset": "صفّي كلمت` السرّ",
+       "passwordreset-legend": "استرجع كلمت` السرّ",
        "bold_sample": "كتيبة غليظه",
        "bold_tip": "كتيبة غليظه",
        "italic_sample": "كتبة مايلة",
        "preview": "شوفه-قبلي",
        "showpreview": "بين معاينة",
        "showdiff": "عرض التبديلات",
-       "anoneditwarning": "'''تÙ\88Ù\84Ù\87:''' Ø±Ø§Ù\83 Ù\85ا Ø¯Ø®Ù\84تش.\nغادÙ\8a Ù\8aتسجÙ\84 Ù\84ادراس Ø¢Ù\8aبÙ\8a Ù\86تاعÙ\83 Ù\81Ù\8a ØªØ§Ø±Ù\8aØ® Ù\87Ø°Ù\87 Ø§Ù\84باجÙ\87.",
+       "anoneditwarning": "'''تÙ\88Ù\84Ù\8aÙ\87Ø©:''' Ø±Ø§Ù\83 Ù\85ا Ø¯Ø®Ù\84تش Ø¨Ù\84 Ø­Ø³Ø§Ø¨ ØªØ§Ø¹Ù\83.\nÙ\8aÙ\84ا ØªØ¯Ù\8aر Ø´Ù\8a ØªØ¨Ø¯Ø§Ù\84Ø\8c ØºØ§Ø¯Ù\8a ØªØªØ³Ø¬Ù\91Ù\84 Ù\84ادرÙ\8aسة Ø¢Ù\8aبÙ\8a ØªØ§Ø¹Ù\83 Ù\81Ù\84 Ù\85تراخ ØªØ§Ø¹ Ù\87اد Ø§Ù\84صÙ\81حة Ù\88 ØªÙ\83Ù\88Ù\86 Ø¨Ø§Ù\8aÙ\86Ø© Ù\84 Ù\83Ù\84Ù\91 Ù\88احد. Ù\8aÙ\84ا [$1 ØªØªÙ\83Ù\88Ù\86Ù\8aÙ\83تا]</strong> Ù\88Ù\84ا <strong>[$2 ØªØ®Ù\84Ù\82 Ø­Ø³Ø§Ø¨]</strong>Ø\8c Ø§Ù\84تبداÙ\84ات ØªØ§Ø¹Ù\83 ØºØ§Ø¯Ù\8a Ù\8aباÙ\86Ù\88 ØªØ­Øª Ø§Ù\84سÙ\85Ù\8aÙ\91Ø© ØªØ§Ø¹ Ø§Ù\84Ù\85ستعÙ\85Ù\84Ù\8a ØªØ§Ø¹Ù\83Ø\8c Ù\88 Ù\83اÙ\8aÙ\86 ØªØ§Ù\86Ù\8a Ù\85زÙ\8aÙ\91ات Ù\88حدخرÙ\8aÙ\86.",
        "loginreqlink": "اتكونيكتا",
        "newarticle": "(جديد)",
        "newarticletext": "راك تبعت وصيلة لباجه لم ما تخدمتش بعد.\nباش تصنع هاذ الباجه ابدا الكتبه فالصندوق التحت (شوف في [$1  زياده باجه المساعده] لمعلومات).\nإذا كانت زيارتك لهاذ الباجه غلطه، ادرك على بوطون''ولى'' في نافيقاتور الإنترنت نتاعك.",
        "noarticletext-nopermission": "لحد الساعه ما كانش حتى نص في هاذ الباجه.\nتقدرو [[Special:Search/{{PAGENAME}}|ترميو تفتيشه على هاذ العنوان]] فالباجات لخرين,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} فتش فالعمليات المربوطه]\nو إلا[{{fullurl:{{FULLPAGENAME}}|action=edit}} أصنع هاذ الباجه]</span>.",
        "previewnote": "'''ما تنساش هذي معاينه قبليه.'''\nلدوك التبديلات دياولك ما تسجلوش!",
        "editing": "تحرير $1",
+       "creating": "خليق $1",
        "editingsection": "كتيبه $1 (قسم)",
        "templatesused": "{{PLURAL:$1||القالب المستعمل|القوالب المستعمله}} في هذه الباجه:",
        "template-protected": "(محميه)",
        "viewpagelogs": "بين العمليات على هاذ الباحه",
        "currentrev-asof": "نسخة ضركانية بل تاريخ تاع $1",
        "revisionasof": "معاودة تاع الـ $1",
-       "revision-info": "مراجعه $1 بواسطت $2",
+       "revision-info": "مراجعة تاع $1 من عند {{GENDER:$6|$2}}$7",
        "previousrevision": "← نسخة اللوله",
        "nextrevision": "فرسيون جايه←",
        "currentrevisionlink": "المراجعه الحاليه",
        "revdel-restore": "غير كيف راهي تبان",
        "revertmerge": "فرق",
        "history-title": " «$1»: تاريخ المراجعات",
+       "difference-title": "فروقات بين التبدالات تاع \"$1\"",
        "lineno": "سطر$1:",
        "compareselectedversions": "كومباري بين نسختين مخيرين",
        "editundo": "نحي",
+       "diff-multi-sameuser": "({{PLURAL:$1|تبديلة متوسّطة وحدة|$1 تبديلات متوسّطين}} ماشي {{PLURAL:$1|مورّية|$1 مورّيين}} من عند نفس المستعملي)",
        "searchresults": "نتاج تاع التفتيشة",
        "searchresults-title": "ريزيلته تاع التحواس \"$1\"",
        "prevn": "{{PLURAL:$1|précédente|$1 اللولانيين}}",
        "shown-title": "آفيشي $1 {{PLURAL:$1|نتيجة}} فل صفحة",
        "viewprevnext": "شوف($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''كاين باجه اسمها « [[:$1]] » في هاذ الويكي'''",
-       "searchmenu-new": "'''أصنع الباجه « [[:$1|$1]] » في هذ الويكي !'''",
+       "searchmenu-new": "'''أصنع الباجة \"[[:$1]]\" في هذ الويكي !'''\n{{PLURAL:$2|0=|شوف تاني الصفحة الّي صبتها ف`التفتاش..|شوف تاني النواتج تاع التفتاش.}}",
        "searchprofile-articles": "باجه تع محتوى",
        "searchprofile-images": "ميلتيميديا",
        "searchprofile-everything": "كلش",
        "search-suggest": "كنت باغي تقول: $1",
        "searchrelated": "مرتابطه",
        "searchall": "ألكل",
+       "search-showingresults": "{{PLURAL:$4|النتيج <strong>$1</strong> تاع <strong>$3</strong>|النتايج <strong>$1 - $2</strong> من أصل <strong>$3</strong>}}",
        "search-nonefound": "ما كانش نتائج تطابق المسقسية.",
        "mypreferences": "إختيارات",
        "youremail": "البريه الالكترونيه:",
        "enhancedrc-history": "تاريخ",
        "recentchanges": "تبديلات توالا",
        "recentchanges-legend": "ابسيون التبديلات التواله",
+       "recentchanges-summary": "اجبر التبدالات اللواخر الّي صراو ف هاد الصفحة.",
        "recentchanges-feed-description": "تبع التبديلات الجدد للويكي في هاذ التيار .",
        "recentchanges-label-newpage": " هاذ التبديل صنع باجه جديده",
        "recentchanges-label-minor": "هاذا تبديل صغير",
        "recentchanges-label-bot": "هاذ التبديل ندار بروبو",
        "recentchanges-label-unpatrolled": "ما تراجعتش هاذ التبديله للآن",
+       "recentchanges-label-plusminus": "الحجَم تاع الصفحة راه تبدّل ب هاد العدّة تاع البايتات",
+       "recentchanges-legend-heading": "'''تفسار:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (شوف تاني [[Special:NewPages|ليستة تاع صفحات جديدة]])",
        "rcnotefrom": "هاهي التبديلات  من'''$2''' (ل'''$1''' معروضه).",
        "rclistfrom": "بين التبديلات البديه من $3 $2",
        "rcshowhideminor": "$1 التبديلات الصغير",
+       "rcshowhideminor-show": "ورّي",
        "rcshowhideminor-hide": "خبّي",
        "rcshowhidebots": "$1 البوتات",
        "rcshowhidebots-show": "ورّي",
+       "rcshowhidebots-hide": "خبّي",
        "rcshowhideliu": "$1 المستخدمين المسجلين",
        "rcshowhideliu-hide": "خبّي",
        "rcshowhideanons": "$1 المستخدمين المجهولين",
+       "rcshowhideanons-show": "ورّي",
        "rcshowhideanons-hide": "خبّي",
        "rcshowhidepatr": "$1 التبديلات المعسوسه",
        "rcshowhidemine": "$1 تبديلات نتاعي",
+       "rcshowhidemine-show": "ورّي",
        "rcshowhidemine-hide": "خبّي",
        "rclinks": "بين آخر $1 تبديل في آخر $2 يوم<br />$3",
        "diff": "إختلاف",
        "filedesc": "ملخص",
        "license": "ترخيص:",
        "license-header": "ترخيص:",
+       "imgfile": "فيشي",
        "file-anchor-link": "ملف",
        "filehist": "تاريخ الفيشيي",
        "filehist-help": "ادرك على وقت و تاريخ/باش تشوف الملف كما بان  في هاذ الوقت.",
        "pager-older-n": "{{PLURAL:$1|قديم بزاف 1|قديم بزاف $1}}",
        "booksources": "مصادر كتاب",
        "booksources-search-legend": "حوس ما بين مصادر الكتب",
+       "booksources-search": "فتّش",
        "log": "ريجيسترات العمليات",
        "allpages": "قاع الباجات",
        "allarticles": "قاع الباجات",
        "actionfailed": "العمليه فشلت",
        "dellogpage": "ريجيستر محو الباجات",
        "rollbacklink": "ولي",
+       "rollbacklinkcount": "رجّع {{PLURAL:$1|تعديل واحد|$1 تعديلات}}",
        "protectlogpage": "ريجيستر الحمايه",
        "protectedarticle": "راه حمى \"[[$1]]\"",
        "undeletelink": "شوف/رجع",
        "undeleteviewlink": "شوف",
        "namespace": "بلاصه تع أسموات",
        "invert": "اعكس التخيار",
+       "tooltip-invert": "علّم هاد المقّبسة باش تخبّي التبدالات تاع الصفحات الّي فيها وسَع` التسمية (و وسَع التسمية المربوط يلا كاين)",
+       "namespace_association": "وسَع التسمية المربوط",
+       "tooltip-namespace_association": "علّم على هاد المقيبسة باش تدخّل تاني المهادرة ولا وسَع التسمية تاع الموضوع المربوط معا وسَع التسمية المسيليكسيوني",
        "blanknamespace": "أساسي",
        "contributions": "مساهمات {{GENDER:$1|المستخدم|المستخدمه}}",
        "contributions-title": "مساهمات {{GENDER:$1|المستخدم|المستخدمه}} $1",
        "sp-contributions-username": "عنوان أيبي والال اسم مستخدم:",
        "sp-contributions-toponly": "ما تورّي غير المشاركات التوالا تاع المقالات",
        "sp-contributions-submit": "تفتاش",
-       "whatlinkshere": "Ù\88اش Ù\8aÙ\88صل هنا",
+       "whatlinkshere": "Ù\88اش Ù\88اصل هنا",
        "whatlinkshere-title": "الباجات اللي تقين في \"$1\"",
        "whatlinkshere-page": "الباجه:",
        "linkshere": "هاذ الباجات يوصلو إلى '''[[:$1]]''':",
        "tooltip-pt-preferences": "وش خيرت",
        "tooltip-pt-watchlist": "ليستت الباجات الي راك أتبع تبديلاتهم",
        "tooltip-pt-mycontris": "ليسته نتع مساهماتك",
-       "tooltip-pt-login": "Ù\85ادابÙ\8aÙ\83 ØªØ³Ø¬Ù\84 Ø§Ù\84دخÙ\88Ù\84 ØªØ§Ø¹Ù\83Ø\8c Ø¨ØµÙ\91Ø­ Ù\85اشÙ\8a Ù\85Ù\84زÙ\88Ù\85 Ø¹Ù\84Ù\8aÙ\83",
+       "tooltip-pt-login": "Ù\85ادابÙ\8aÙ\83 ØªØ³Ø¬Ù\84 Ø¯Ø®Ù\84تÙ\83 Ø\8c Ù\84Ù\83Ù\86 Ù\85اشÙ\8a Ù\84ازÙ\85",
        "tooltip-pt-logout": "سجل خروج",
-       "tooltip-pt-createaccount": "نشجعك باش تصنع حساب و تسجل دخلتك ; و لكن على كل حال ماهوش ضروري",
-       "tooltip-ca-talk": "تقرعيج على باجتٰ المحتاوا",
-       "tooltip-ca-edit": "تÙ\86جÙ\85 ØªØ­Ø±Ø± Ù\87اذ Ø§Ù\84باجÙ\87 Ø\8cÙ\85اذابÙ\8aÙ\83 ØªØ³ØªØ¹Ù\85Ù\84 Ù\82Ù\81Ù\84Ù\87 Ø§Ù\84Ù\85راجعÙ\87 Ù\82بÙ\84 Ù\85ا ØªØ­Ù\81ظ",
+       "tooltip-pt-createaccount": "ننصح باش تصنع حساب و تسجل دخلتك ; على كل حال ماهوش ضروري",
+       "tooltip-ca-talk": "مناقشه على هاد باجت المحتوا",
+       "tooltip-ca-edit": "تÙ\82در ØªØ¨Ø¯Ù\84 Ù\87اذ Ø§Ù\84باجÙ\87 Ø\8cÙ\85اذابÙ\8aÙ\83 ØªØ³ØªØ¹Ù\85Ù\84 Ù\82Ù\81Ù\84Ù\87 Ø§Ù\84Ù\85راجعÙ\87 Ù\82بÙ\84 Ù\85ا ØªØ³Ø¬Ù\84",
        "tooltip-ca-addsection": "ابدأ طرف جديد",
        "tooltip-ca-viewsource": "هاذ الباجه محميه. و شنو تقدرو تشوفو الأصلي نتاعها",
        "tooltip-ca-history": "المراجعات التوالا تاع الباجة (معا المساهمين تاوعها)",
        "tooltip-ca-watch": "زيد هذ الباجة لل ليستة تاعك تاع التتباع",
        "tooltip-ca-unwatch": "اقلع هاد الباجة منل ليستة تاعك تاع التتباع",
        "tooltip-search": " فتّش في {{SITENAME}}",
-       "tooltip-search-go": "روح الباجه عندها نفس الآسم إذا كانت كاينه",
+       "tooltip-search-go": "روح لباجه عندها ذاك الآسم نفسو  إذا كانت",
        "tooltip-search-fulltext": "فتّش على باجه بهاد الكتبة",
-       "tooltip-p-logo": "رÙ\88Ø­ Ù\84Ù\84باجÙ\87 Ø§Ù\84Ù\84Ù\88Ù\84اÙ\86Ù\8aÙ\91ه",
+       "tooltip-p-logo": "زÙ\88ر Ø§Ù\84باجÙ\87 Ø§Ù\84Ù\84Ù\88Ù\84ه",
        "tooltip-n-mainpage": "زور الباجه اللوله",
-       "tooltip-n-mainpage-description": "زور الباجه لوله",
-       "tooltip-n-portal": "عÙ\84Ù\89 Ø§Ù\84پرÙ\88جÙ\8aØ\8cÙ\88اش ØªÙ\86جÙ\85 تدير، وين تصيب واش تحتاج",
+       "tooltip-n-mainpage-description": "زور الباجه اللوله",
+       "tooltip-n-portal": "عÙ\84Ù\89 Ø§Ù\84پرÙ\88جÙ\8aØ\8cÙ\88اش ØªÙ\82در تدير، وين تصيب واش تحتاج",
        "tooltip-n-currentevents": "صيب خبارات مستّرين على الصوالح الّي راهم يصراو ضركا",
-       "tooltip-n-recentchanges": "اÙ\84Ù\84Ù\8aستة ØªØ§Ø¹ Ø§Ù\84تبدÙ\8aÙ\84ات Ø§Ù\84تÙ\88اÙ\84ا فل ويكي",
+       "tooltip-n-recentchanges": "اÙ\84Ù\84Ù\8aستة ØªØ§Ø¹ Ø§Ù\84تبدÙ\8aÙ\84ات Ø§Ù\84جدÙ\8aدة فل ويكي",
        "tooltip-n-randompage": "طلّع باجه على الزهر",
        "tooltip-n-help": "بلاصة المعونة",
-       "tooltip-t-whatlinkshere": "ليستة تاع كاع الباجات تاع المحتاوا الي توصّل لهنا",
+       "tooltip-t-whatlinkshere": "ليستة تاع كامل باجات المحتاوا الواصله هنا",
        "tooltip-t-recentchangeslinked": "ليستة تاع التبديلات التوالا تاع الباجات الّي عندهم رباط معا هادي",
        "tooltip-feed-atom": "سيلان آتوم تاع هاد الباجة",
        "tooltip-t-contributions": "شوفان ليسته مساهمات هاذا المستخدم",
        "tooltip-rollback": "\"نحّي\" : ب ضركة وحدة تآنيلي التبديلة ولا التبديلات تاع المساهم التالي",
        "tooltip-undo": "\"نحّي\" فاصي هاد الـمعاودة و حلّ تاقة تاع تبدال بشوفه قبلانيّه. تخلّي باش ترجع لل معاوده التاليه و تزيد الـسبّة علاش فل قابسه تاع الـحويصله.",
        "tooltip-summary": "دخل تلخيص صغير",
+       "simpleantispam-label": "مسيّة ضدّ السبام.\nما تعمّرش هادا!",
        "pageinfo-toolboxlink": "معلومات على هاد الباجه",
        "previousdiff": "→ التعديل الي قبل",
        "nextdiff": "التبديل الجاي ←",
        "svg-long-desc": "فيشيي SVG، أبعاده $1 × $2 بكسل، تاي الفيشي : $3",
        "show-big-image": "الملف الأصلي",
        "show-big-image-preview": "حجم هذه المعاينه: $1.",
+       "show-big-image-other": "{{PLURAL:$2||التدقاقة|التدقاقات}}: $1.",
        "show-big-image-size": "$1 × $2 بكسل",
        "bad_image_list": "الفورمة راهي كيما واش يتبع:\nما كاين غير السطور الّي باديين بل *، الّي يكونو معدودين\nالـوصيل الـلوّل تاع سطر لازم كون تاع تصويرة ضايعة.\nكامل الوصيلات لخرين الّي فل سطر، يكونو معدودين كلّي تتنيّات، بل متال باجات وين الـتصويرة تنجم تبان.",
        "metadata": "بايان ميتا",
        "metadata-help": "هذا الملف راه فيه خبيرات زايدين، بالاك تكون انزادت من عند صواره نيميريك ولا سكانر مين صنع الملف.\nالأصلي، شي تفاصيل بالاك ما تعبرش على الملف المعدل.",
        "metadata-fields": "الحقول تاع الميتا معطيّات تاع تصاور الّي يكونو ف هاد البريّة غادي ينحطّو فل باجة تاع التوصاف تاع التصويرة منين يكون الجدول تاع  الميتاالمعطيات مطوي.\nالحقول لخرة يكونو مخبيين بارديفو.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-orientation": "توجاه",
+       "exif-xresolution": "التدقاق الأوفوقي",
+       "exif-yresolution": "التدقاق العامودي",
+       "exif-datetime": "تاريخ و وقت تاع تبدال الفيشي",
+       "exif-make": "الصانع تاع الجهاز",
+       "exif-model": "الطبّع تاع الجهاز",
+       "exif-software": "البريمجات الّي مستعملة",
+       "exif-exifversion": "نسخة Exif",
+       "exif-colorspace": "موساع تاع اللوان",
+       "exif-datetimeoriginal": "التاريخ و الوقت تاع تولاد المعلومات",
+       "exif-datetimedigitized": "التاريخ تاع التنمريل (numérisation)",
+       "exif-orientation-1": "عادي",
        "namespacesall": "لكل",
        "monthsall": "لكل",
        "watchlisttools-view": "اعرض التبديلات المرتابطه",
        "watchlisttools-edit": "اعرض قائمه المراقبه و عدلها",
        "watchlisttools-raw": "موديفي ليستت التبيعه الخام",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|تقرعيج]])",
        "duplicate-defaultsort": "'''توليه:''' مفتاح التستيف الافتراضي \"$2\" ديباسا مفتاح التستيف الافتراضي التالي\"$1\".",
        "specialpages": "الباجات الخصوصيه",
        "external_image_whitelist": " #<pre>خلى هاذ السطر كيما راه\n#حط منثورات التعبيرات المنتظمة (برك الجزء الي يروح بين //) بالتحت\n#هاذ يكون مطابقتها مع مسارات التصاوير البرانيه (الموصولة بصفه مباشره)\n#هاذي الي تشبهغادي تنعرض  كتصاور، خلاف هذا برك وصيلة للتصويرة غادي تنعرض\n#السطور اللي تبدأا ب# تعتبر تعليقات\n#هذا لا يتأثر بحالة الحروف\n\n#حط كامل منثورات التعبيرات المنتظمة فوق هذا السطر. خلي هاذ السطر سواسوا كيما هو</pre>",
        "tag-filter": "صفاية[[Special:Tags|الوشام]]:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1||وسم|وسمان|وسوم}}]]: $2)",
+       "logentry-delete-delete": "$1 {{GENDER:$2| راه محا|راهي محات}}الصفحة $3",
+       "logentry-move-move": "{{GENDER:$2|نقّل|نقّلت}} $1 الصفحة $3 لـ $4",
        "logentry-newusers-create": "راه تفتح حساب {{GENDER:$2|المستخدم|المستخدمه}} $1",
+       "logentry-upload-upload": " {{GENDER:$2|نزّل|نزّلت}} $1 $3",
        "searchsuggest-search": "تفتاش"
 }
index 3243952..1d03c74 100644 (file)
        "import-rootpage-nosubpage": "মূল পৃষ্ঠাৰ \"$1\" নামস্থানে উপপৃষ্ঠা অনুমোদন নকৰে।",
        "importlogpage": "আমদানিৰ অভিলেখ",
        "importlogpagetext": "আন ৱিকিৰ পৰা সম্পাদনা ইতিহাসসহ প্ৰশাসনীয় পৃষ্ঠা আমদানি।",
-       "import-logentry-upload": "নথি আপল'ডৰ মাধ্যমেৰে [[$1]] আমদানি কৰা হ'ল",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|টা সংশোধন|টা সংশোধন}}",
-       "import-logentry-interwiki": "আন্তঃৱিকি-স্থানান্তৰিত $1",
        "import-logentry-interwiki-detail": "$2ৱে কৰা $1 {{PLURAL:$1|টা সংশোধন|টা সংশোধন}}",
        "javascripttest": "জাভাস্ক্ৰিপ্ট পৰীক্ষা।",
        "javascripttest-pagetext-noframework": "এই পৃষ্ঠাটো জাভাস্ক্ৰিপ্ট পৰীক্ষা চলোৱাৰ বাবে সংৰক্ষিত।",
        "tooltip-pt-mycontris": "আপোনাৰ বৰঙণিৰ তালিকা",
        "tooltip-pt-login": "বাধ্যতামূলক নহ'লেও প্ৰৱেশ কৰাটো বাঞ্চনীয়",
        "tooltip-pt-logout": "প্ৰস্থান",
+       "tooltip-pt-createaccount": "আপোনাক এটা একাউণ্ট সৃষ্টি কৰি প্ৰৱেশ কৰিবলৈ অনুৰোধ জনোৱা হৈছে, কিন্তু এয়া বাধ্যতামূলক নহয়",
        "tooltip-ca-talk": "সংশ্লিষ্ট প্ৰবন্ধ সম্পৰ্কীয় আলোচনা",
        "tooltip-ca-edit": "আপুনি এই পৃষ্ঠাটো সালসলনি কৰিব পাৰে, অনুগ্ৰহ কৰি সালসলনি সাচী থোৱাৰ আগতে খচৰা চাই লব",
        "tooltip-ca-addsection": "নতুন অনুচ্ছেদ আৰম্ভ কৰক",
index 3e03958..6c7dce0 100644 (file)
        "disclaimers": "अस्वीकरण",
        "disclaimerpage": "Project:साधारण अस्वीकरण",
        "edithelp": "सम्पादन सहायता",
+       "helppage-top-gethelp": "मदद",
        "mainpage": "प्रधान पन्ना",
        "mainpage-description": "प्रधान पन्ना",
        "policy-url": "Project:नीति",
        "import-rootpage-nosubpage": "दिए गए उपसर्ग पृष्ठ \"$1\" के नामस्थान में उप-पृष्ठ नहीं बनाए जा सकते।",
        "importlogpage": "आयात सूची",
        "importlogpagetext": "अन्य विकियों से प्रबन्धकों द्वारा किए गए सम्पादन इतिहास के साथ होने वाले पृष्ठों का आयात।",
-       "import-logentry-upload": "सञ्चिका अपलोड करके [[$1]] का आयात किया",
-       "import-logentry-interwiki": " $1 कय अन्तरविकिकरण कई गय",
        "javascripttest": "जावास्क्रिप्ट परीक्षण",
        "javascripttest-pagetext-unknownframework": "अज्ञात परीक्षण ढाँचा \"$1\"",
        "javascripttest-pagetext-unknownaction": "अज्ञात काम \"$1\".",
        "logentry-move-move": "$1 ने $3 पृष्ठ $4 पर {{GENDER:$2|स्थानांतरित}} कै गय",
        "rightsnone": "(कउनो नाहीं)",
        "revdelete-summary": "संपादन सारांश",
-       "feedback-subject": "विषय:",
-       "feedback-message": "सनेशा:",
-       "feedback-cancel": "रद्द करा जाय",
-       "feedback-submit": "प्रतिक्रिया भेजा जाय",
        "feedback-adding": "पृष्ठ पे प्रतिक्रिया जोडत है ...",
-       "feedback-error2": "त्रुटि: संपादन विफल रहा है",
+       "feedback-cancel": "रद्द करा जाय",
        "feedback-close": "होइ गवा",
+       "feedback-error2": "त्रुटि: संपादन विफल रहा है",
+       "feedback-message": "सनेशा:",
+       "feedback-subject": "विषय:",
+       "feedback-submit": "प्रतिक्रिया भेजा जाय",
        "searchsuggest-search": "खोज",
        "searchsuggest-containing": "...से युक्त",
        "api-error-badaccess-groups": "इ विकि मा आप कय फाइल अपलोड करेक अनुमति नाइ है",
index eabb161..d7e15c4 100644 (file)
        "right-delete": "Səhifələrin silinməsi",
        "right-bigdelete": "Uzun tarixçəsi olan səhifələrin silinməsi",
        "right-deleterevision": "səhifənin konkret versiyasının silinməsi və bərpası",
-       "right-deletedhistory": "silinmiş mətnə daxil olmadan silinmiş səhifələrin tarixçələrinə baxma",
+       "right-deletedhistory": "Silinmiş mətni görmədən silinmiş səhifələrin tarixçələrinə baxmaq",
        "right-browsearchive": "Silinmiş səhifələri axtar",
        "right-undelete": "Silinmiş səhifələrin bərpası",
        "right-suppressrevision": "Səhifələrin gizli versiyalarına bax, gizlə və göstər",
        "action-writeapi": "API yazıdan istifadə",
        "action-delete": "bu səhifəni sil",
        "action-deleterevision": "bu yoxlamaı ləğv et",
-       "action-deletedhistory": "səhifənin silinmə tarixinə bax",
+       "action-deletedhistory": "səhifənin silinmə tarixinə baxmaq",
        "action-browsearchive": "Silinmiş səhifələri axtar",
        "action-undelete": "bu səhifəni silmə",
        "action-suppressrevision": "bu gizli redaktəyə bax və bərpa et",
        "importlogpage": "Çıxarılma gündəliyi",
        "importlogpagetext": "Səhifələrin idarəçilər tərəfindən digər vikilərdən dəyişiklik tarixçəsi ilə birlikdə köçürülməsi",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|dəyişiklik|dəyişiklik}} idxal edildi.",
-       "import-logentry-interwiki": "vikilərarası idxal $1",
        "import-logentry-interwiki-detail": "$2 vikidən $1 {{PLURAL:$1|dəyişiklik|dəyişiklik}} idxal edildi",
        "tooltip-pt-userpage": "İstifadəçi səhifəniz",
        "tooltip-pt-anonuserpage": "The user page for the ip you",
index dc9af98..8bfc90e 100644 (file)
        "rcnotefrom": "Untn san de Endarunga seit  '''$2''' (bis za '''$1''' Ozoagn).",
        "rclistfrom": "Nua Endarunga seit $3 $2 zoagn",
        "rcshowhideminor": "Kloane Endarunga $1",
+       "rcshowhideminor-hide": "Ausblendn",
        "rcshowhidebots": "Bots $1",
        "rcshowhideliu": "Eigloggte Nutza $1",
+       "rcshowhideliu-hide": "Ausblendn",
        "rcshowhideanons": "Anonyme Nutza $1",
+       "rcshowhideanons-hide": "Ausblendn",
        "rcshowhidepatr": "Kontrolliade Endarunga $1",
        "rcshowhidemine": "Meine Beidreg $1",
+       "rcshowhidemine-hide": "Ausblendn",
        "rclinks": "De letztn Endarunga vo de letztn $2 Dog zoagn<br />$3",
        "diff": "Untaschied",
        "hist": "Versiona",
index f8e0831..5713043 100644 (file)
        "disclaimers": "Адмова ад адказнасьці",
        "disclaimerpage": "Project:Адмова ад адказнасьці",
        "edithelp": "Дапамога ў рэдагаваньні",
+       "helppage-top-gethelp": "Дапамога",
        "mainpage": "Галоўная старонка",
        "mainpage-description": "Галоўная старонка",
        "policy-url": "Project:Правілы",
        "nocookiesfornew": "Рахунак удзельніка ня быў створаны, таму што мы не змаглі пацьвердзіць яго крыніцу. \nУпэўніцеся, што ў Вас уключаныя файлы-кукі, перазагрузіце гэтую старонку і паспрабуйце зноў.",
        "noname": "Вы пазначылі няслушнае імя ўдзельніка.",
        "loginsuccesstitle": "Пасьпяховы ўваход у сыстэму",
-       "loginsuccess": "'''Цяпер Вы ўвайшлі ў {{GRAMMAR:вінавальны|{{SITENAME}}}} як «$1».'''",
+       "loginsuccess": "<strong>Цяпер Вы ўвайшлі ў {{GRAMMAR:вінавальны|{{SITENAME}}}} як «$1».</strong>",
        "nosuchuser": "Удзельніка «$1» не існуе.\nВялікія і малыя літары адрозьніваюцца ў імёнах удзельнікаў.\nПраверце напісаньне альбо [[Special:UserLogin/signup|стварыце новы рахунак]].",
        "nosuchusershort": "Удзельніка зь іменем «$1» не існуе. Праверце напісаньне.",
        "nouserspecified": "Вы мусіце пазначыць імя ўдзельніка.",
        "import-rootpage-nosubpage": "Падстаронкі ў прасторы назваў «$1» карнявой старонкі не дазволеныя.",
        "importlogpage": "Журнал імпартаваньняў",
        "importlogpagetext": "Імпартаваньне адміністратарамі старонак з гісторыяй зьменаў зь іншых вікі.",
-       "import-logentry-upload": "імпартавана [[$1]] праз загрузку файла",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|вэрсія імпартаваная|вэрсіі імпартаваныя|вэрсіяў імпартаваныя}}",
-       "import-logentry-interwiki": "імпартавана зь іншай вікі $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|вэрсія імпартаваная|вэрсіі імпартаваныя|вэрсіяў імпартаваныя}} з $2",
        "javascripttest": "Тэставаньне JavaScript",
        "javascripttest-pagetext-noframework": "Гэтая старонка трымаецца для правядзеньня тэстаў JavaScript.",
        "tags-hitcount": "$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}",
        "tags-manage-no-permission": "Вы ня маеце правоў на зьмену метак.",
        "tags-create-heading": "Стварэньне новай меткі",
+       "tags-create-tag-name": "Назва меткі:",
        "comparepages": "Параўнаньне старонак",
        "compare-page1": "Старонка 1",
        "compare-page2": "Старонка 2",
index b5936af..0590ce1 100644 (file)
        "import-rootpage-nosubpage": "Именното пространство „$1“ на основната страница не позволява създаването на подстраници.",
        "importlogpage": "Дневник на внасянията",
        "importlogpagetext": "Административни внасяния на страници с редакционна история от други уикита.",
-       "import-logentry-upload": "[[$1]] беше внесена от файл",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|версия беше внесена|версии бяха внесени}}",
-       "import-logentry-interwiki": "$1 беше внесена от друго уики",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|една версия|$1 версии}} на $2 бяха внесени",
        "javascripttest": "Тестване на JavaScript",
        "javascripttest-pagetext-noframework": "Тази страница е запазена за изпълнение на Джаваскрипт тестове.",
index fc8baa8..f86214f 100644 (file)
        "unknown-error": "یک نا زانتین خطائی رخ دات.",
        "tmp-create-error": "موقتین فایلی جۆڑ کورتین ممکن نه اینت.",
        "tmp-write-error": "خطا بئ موقتین فایلی نیویشتینا.",
+       "windows-nonascii-filename": "ای ویکی پایل ئی ناما گۆ خاسین نۆیسگ ئان پُشتیوانی ئه نه کنت.",
+       "fileexists": "پایل ئی گۆ ای ناما شه دیما موجود اینت، اگه موتمئین {{GENDER:|نه ۆیت}} که لوٹیت ای پایل ئا تغیر ب دهیت، مهربانی بکنیت <strong>[[:$1]]</strong> ئا بگیندیت.\n[[$1|thumb]]",
        "uploadwarning": "بُرز کورتینئ هشدار",
        "savefile": "فایلی ذخیره کورتین",
        "uploaddisabled": "بُرز کورتین غیر پئال اینت.",
        "deadendpagestext": "جهلگین تاکدیمان گۆ هیچگوجام تاکدیما بئ  {{SITENAME}} ئی تا لینک نه دارنت.",
        "protectedpages": "قُلپ بوتگین تاکدیمان",
        "protectedpages-indef": "فقط بی پایانین قُلپ ئان",
+       "protectedpages-cascade": "په قت آبشارین قُلپ هان",
        "protectedpages-noredirect": "تغیرمسیرانی چیهرداتین",
        "protectedpagesempty": "بئ انونین وختا هیچ دیمی قُلپ نه بوته.",
        "protectedpages-timestamp": "وختی برچسپ",
        "protectedpages-unknown-timestamp": "نامئلوم",
        "protectedpages-unknown-performer": "نادروستئ ئین کار زوروک",
        "protectedtitles": "قُلپ بوته ئین ئنوانان",
+       "protectedtitles-summary": "ای تاکدیم ، لیست ئی شه آ تاکدیمان اینت که شه جۆڑ کورتین ئا قُلپ بوته انت. په قُلپ بوته ئین  ئنوانانی لیستا که شه ایڈیٹ ئا ساتیته بوته انت، بئ ایدا  [[{{#special:ProtectedPages}}|{{int:protectedpages}}]] برویت.",
        "protectedtitlesempty": "بئ انونین وختا هیچ ئنوانی قُلپ نه بوته گۆ ای پارامیترا.",
        "listusers": "کار زوروکانئ لڑلیست",
        "listusers-editsonly": "فقط آ کار زوروکان که ایڈیٹ کورته انت نشان ب دئ",
        "block-log-flags-angry-autoblock": "پیشرفته ئین اتوماتیکین بلاک فعال بوت",
        "block-log-flags-hiddenname": "چیهرین کار زوروکئ نام",
        "ipb_expiry_invalid": "الاسی وخت صحیح نه اینت.",
+       "ipb_expiry_temp": "چیهرین کارزوروکانی دسترسی قه تی کورتین یا بلاک باید همیشگی بیئت .",
+       "ipb_hide_invalid": "ای هیساب ئی سرکوب کورتین امکان نداریت; ای گیشتیر شه {{PLURAL:$1|یک ایڈیٹ|$1 ایڈیٹان}} داریت.",
        "ipb_already_blocked": "«$1» همی انون بسته بوته",
+       "ipb-needreblock": " $1 ئی دسترسی شه دیما بسته بسته بوته . آیا لوٹیت که آیی تنزیماتان تغیر ب دهیت؟",
        "ipb-otherblocks-header": "دیگرین {{PLURAL:$1|بلاک|بلاک ئان}}",
+       "unblock-hideuser": "په ای خاتیرا که ای کار زوروکی هیساب چیهرداته بوته شما ئه نه توانیت آیرا پاچ بکنیت.",
+       "ipb_cant_unblock": "خه تا:  $1 ئی بلاک آی ڈی ودی نه بوت . ممکن اینت که دیمتیرا پاچ بوته بیت.",
        "ip_range_invalid": "ناموتبرین آی پی ئی رینج",
+       "ip_range_toolarge": "بلاک کورتین ئی رینج ٹوُتیر شه /$1 ئا مجاز نه اینت.",
        "proxyblocker": "پروکسی ئی بلاک کنۆک",
+       "ipbnounblockself": "شما په وتی آنبلاک یا پاچ کورتین ئا اجازه نه داریت.",
        "lockdb": "مئلوماتئ بانکی قُلپ کورتین",
        "unlockdb": "مئلوماتئ بانکی قُلپئ پروشتێن",
        "lockconfirm": "هان، من جدآن لوٹین که مئلومانئ بانکا قُلپ کنین.",
        "movearticle": "تاکدیمی انتقال:",
        "movenotallowed": "شما په تاکدیمانی جابجا کورتین ئی اجازه ئا نداریت.",
        "movenotallowedfile": "شما په پایل ئانی جابجا کورتین ئی اجازه ئا نداریت.",
+       "cant-move-category-page": "شما په تهرئانی تاکدیمانی جابجا کورتین ئا اجازه  نداریت.",
+       "cant-move-to-category-page": "شما په تهری یک دیم په دیگه دیمی جابیجا کورتینا اجازه نداریت.",
        "newtitle": "گۆ نوکین ئنوانا:",
+       "move-watch": "دیستین مخسد و زهی دیمانی",
        "movepagebtn": "تاکدیمی انتقال",
        "pagemovedsub": "جابجایی گۆ کامیابیا بوت",
        "movepage-moved": "'''«$1» بئ «$2» انتقال بوت'''",
        "movepage-moved-redirect": "یک تغیرمسیر جۆڑ بوت.",
+       "movepage-moved-noredirect": "شه تغیرمسیر ئا دیمگیری بوت.",
+       "articleexists": "یک دیمی گۆ ای ناما شه دیما موجود اینت، یا نامی که شما انتخاب کورته ایت موتبر نه اینت.\nمهربانی بکنیت دیگه نامی انتخاب بکنیت.",
        "movetalk": "حبر و گپ ئی دیم جابجا بیئت",
        "move-subpages": "گۆنڈ دیمانی انتقال (تا $1 دیم)",
        "move-talk-subpages": "حبر وگپ ئی گۆنڈ دیمانی انتقال (تا $1 دیما)",
        "delete_and_move": "پاک کورتین یا جابیجا",
        "delete_and_move_confirm": "هان،تاکدیم پاک بیئت",
        "delete_and_move_reason": "پاک کورتین  «[[$1]]» جابجایی امکانا",
+       "immobile-source-page": "ای دیم جابیجا ئه نه بیئت.",
+       "immobile-target-page": "انتقال ئی امکان په ای ئنوانا موجود نه اینت.",
+       "move-leave-redirect": "بئ جا ایشتین یک تغیری مسیر ئی",
        "export": "ڈن کورتین  تاکدیمانئ",
        "exportall": "ڈن کورتین موچین تاکدیمانئ",
        "exportcuronly": "فقط انونین نخسه شامل بیئت، نه موچین تاریخچه",
        "import-upload": "اکس ام ال ئی دیتای بُرز کورتین",
        "importlogpage": "ایمپورت لوگ",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|نسخه|نسخه}} وارد بوته",
-       "import-logentry-interwiki": "$1 ئا ترانس ویکی کورت",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|نسخه|نسخه}} داخل بوته شه $2",
        "javascripttest": "جاوا اسکریپتی آزمایش",
        "javascripttest-pagetext-noframework": "ای تاکدیم په جاوا اسکریپتی آزمایشی خاتیرا ایشته بوته.",
index 86d2168..1184e72 100644 (file)
@@ -31,7 +31,7 @@
        "tog-shownumberswatching": "ध्यान रखे वालन सदस्यन के देखावल जाव",
        "tog-oldsig": "वर्तमान हस्ताक्षर:",
        "tog-fancysig": "हस्ताक्षर के विकी पाठ के रुप में उपयोग करीं (बिना स्वचालित कड़ी के)",
-       "tog-uselivepreview": "लाइव पुर्वालोकन के प्रयोग करीं (प्रयोगात्मक)",
+       "tog-uselivepreview": "लाइव पुर्वालोकन के प्रयोग करीं",
        "tog-forceeditsummary": "यदि सम्पादन सारांश ना दिहल होखे त हमके सूचित करब",
        "tog-watchlisthideown": "हमार ध्यान दिहल पन्ना के सूची से हमरा खातिर परिवर्तन छिपाईं",
        "tog-watchlisthidebots": "हमार ध्यान सूची से बोट द्वारा करल गईल परिवर्तन के छिपाईं",
        "otherlanguages": "अन्य भाषा में",
        "redirectedfrom": "($1 द्वारा पुन: निर्देशित)",
        "redirectpagesub": "पुन: निर्देशित पन्ना",
+       "redirectto": "पुनः निर्देशित:",
        "lastmodifiedat": "$1 के $2 पर ई पन्ना पर अन्तिम बार परिवर्तन भईल।",
        "viewcount": "ई पन्ना {{PLURAL:$1|एक|$1}} बार देखल गईल बा।",
        "protectedpage": "सुरक्षित पन्ना",
        "disclaimers": "अस्विकरण",
        "disclaimerpage": "Project:सामान्य अस्विकरण",
        "edithelp": "मदद सम्पादन",
+       "helppage-top-gethelp": "मदद",
        "mainpage": "मुख्य पन्ना",
        "mainpage-description": "मुख्य पन्ना",
        "policy-url": "Project:नीति",
        "viewsourcetext": "रउआ इ पन्ना के स्त्रोत देख सकत बानी आ एकर नकल उतार सकत बानी:",
        "viewyourtext": "रउआ इ पन्ना में ''आपन सम्पादन'' के स्रोत देख सकत बानी आ ओकर नकल उतार सकत बानी:",
        "protectedinterface": "इ पन्ना इ विकी के सॉफ़्टवेयर के इंटरफ़ेस पाठ्य के देवेला, आ इ के गलत प्रयोग से बचावे खातिर सुरक्षित कर दिहल गइल बा।\nसभन विकियन खातिर अनुवाद जोड़े या बदले खातिर कृपया मीडियाविकि के क्षेत्रीयकरण प्रकल्प [//translatewiki.net/ translatewiki.net] के प्रयोग करीं।",
-       "editinginterface": "'''चेतावनी:''' रउआ एगो अइसन पन्ना के बदल रहल बानी जउन सॉफ़्टवेयर के इंटरफ़ेस पाठ्य प्रदान करेला।\nइ पन्ना के बदलला से अन्य सदस्यन के प्रदर्शित इंटरफ़ेस के शक्ल-सूरत में बदलाव आइ।\nसभे विकियन के खातिर अनुवाद बदले या जोड़े खातिर कृपया मीडियाविकि के क्षेत्रीयकरण परियोजना [//translatewiki.net/wiki/Main_Page?setlang=hi translatewiki.net] के प्रयोग करीं।",
+       "editinginterface": "<strong>चेतावनी:</strong> आप एगो अइसन पन्ना के बदल बदल रहल बानी जवन सॉफ़्टवेयर के इंटरफ़ेस पाठ प्रदान करेला। इ पृष्ठ के बदले से अन्य सदस्यवन के प्रदर्शित इंटरफ़ेस के शक्लोसूरत में बदलाव आई।",
        "cascadeprotected": "इ पन्ना पर सम्पादन करे के अधिकार खत्म कर दिहल गइल बा काहे कि इ निम्न में शामिल बा {{PLURAL:$1|पन्ना, जउन|पन्नां, जउन}} \"व्यापक\" विकल्प के चालू कइला के साथ सुरक्षित कर दिहल गइल बा:\n$2",
        "namespaceprotected": "रउआ के '''$1''' नामस्थान के पन्नं में सम्पादन करे के अधिकार नइखे दिहल गइल।",
        "customcssprotected": "रउआ के इ CSS पन्ना के संपादित करे के अनुमति नइखे, काहे कि इ में अन्य सदस्यं के व्यक्तिगत सेटिंग्स समाविष्ट बा।",
        "invalidtitle-knownnamespace": "\"$2\" नामस्थान आ \"$3\" पाठ्य वाला गलत शीर्षक",
        "invalidtitle-unknownnamespace": "अज्ञात नामस्थान संख्या $1 आ नाम \"$2\" वाला गलत शीर्षक",
        "exception-nologin": "खाता में प्रवेश नईखीं भईल",
-       "exception-nologin-text": "इ पन्ना अथवा कार्य के सक्षम करे खातिर कृपया [[Special:Userlogin|लॉग इन]] करीं।",
+       "exception-nologin-text": "इ पन्ना अथवा कार्य के सक्षम करे खातिर कृपया प्रवेश करीं।",
        "exception-nologin-text-manual": "इ पन्ना अथवा कार्य के सक्षम करे खातिर कृपया $1 करीं।",
        "virus-badscanner": "गलत जमाव: अज्ञात वायरस जाँचक: ''$1''",
        "virus-scanfailed": "जाँच विफल (कोड $1)",
        "preview": "पूर्वावलोकन",
        "showpreview": "पूर्वावलोकन देखाईं",
        "showdiff": "परिवर्तन देखाईं",
-       "anoneditwarning": "'''चेतावनी:''' रउआ आपन खाता में प्रवेश नईखीं कईले। ई पन्ना के सम्पादन इतिहास पर राउर आई पी पता दर्ज कईल जाई।",
+       "anoneditwarning": "<strong>चेतावनी:</strong> रउआ आपन खाता में प्रवेश नईखीं कईले। यदि रउआ कवनो बदलाव करत बानी त राउर आईपी पता खुलेआम दिखाई दी। यदि रउआ <strong>[$1 लॉग इन]</strong> या <strong>[$2 नया खाता बनायेब]</strong> त, अन्य सुविधावन के साथ राउर सम्पादन के श्रेय राउर सदस्यनाम पर चल जाई।",
        "anonpreviewwarning": "''रउआ खाता में प्रवेश नईखीं भईल। सुरक्षित करेब त ई पन्ना के सम्पादन इतिहास पर राउर आई पी पता दर्ज हो जाई।\"",
        "missingsummary": "'''स्मरणपत्र:'''रउआ एगो सारांश के सम्पादन नईखीं प्रदान कईले। अगर रउआ \"फिर से सुरक्षित करीं\" पर क्लिक करेब, त राउर सम्पादन बिना एगो सारांश के सुरक्षित हो जाई।",
        "missingcommenttext": "कृपया निचे एगो टिप्पणी करीं।",
        "post-expand-template-inclusion-category": "अइसन पृष्ठ जे पर साँचा जोडे के सीमा पार हो गइल बा",
        "cantcreateaccounttitle": "खाता खुल नईखे सकत",
        "revisionasof": "$1 के रुप में संशोधन",
-       "revision-info": "$2 में से $1 के रुप में संशोधन",
+       "revision-info": "{{GENDER:$6|$2}}$7 के द्वारा $1 के संशोधन",
        "previousrevision": "← पुरान संशोधन",
        "nextrevision": "नया संशोधन →",
        "currentrevisionlink": "हाल के संशोधन",
        "history-feed-empty": "अनुरोध करल गईल पन्ना उपलब्ध नईखे। हो सकत बा उ के विकि पर से मिटा दिहल गईल होखे, आ चाहे उ के नाम बदल देवल गईल होखे।\nप्रासंगिक पन्ना के [[Special:Search|विकि पर खोजे के]] कोशिश करत रहीं।",
        "rev-deleted-comment": "(सम्पादन सारांश हटावल गईल)",
        "rev-deleted-user": "(प्रयोगकर्ता के नाम मिटा दिहल गईल बा)",
-       "rev-deleted-event": "(लà¥\89à¤\97 à¤\95ारà¥\8dरवाà¤\88 à¤®à¤¿टा दिहल गईल बा)",
+       "rev-deleted-event": "(लà¥\89à¤\97 à¤µà¤¿à¤µà¤°à¤£ à¤¹टा दिहल गईल बा)",
        "rev-deleted-user-contribs": "[प्रयोगकर्ता नाम आ चाहे आइ पी पता हटा दिहल गईल बा - योगदान से सम्पादन छुप गईल बा]",
        "rev-deleted-text-permission": "ई पन्ना के संशोधन '''मिटा'''' दिहल गईल बा।\nमेटावल जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} डिलेशन लॉग] में मिली।",
        "rev-delundel": "दिखाईं/छुपाईं",
        "rev-showdeleted": "देखाईं",
        "revdelete-show-file-submit": "जी",
-       "revdelete-hide-text": "संशोधन पाठ्य छुपाँईं",
+       "revdelete-hide-text": "संशोधन पाठ्य",
        "revdelete-hide-image": "फाइल के सामग्री छुपाँईं",
-       "revdelete-hide-comment": "समà¥\8dपादित à¤¸à¤¾à¤°à¤¾à¤\82श à¤\9bà¥\81पाà¤\81à¤\88à¤\82",
-       "revdelete-hide-user": "समà¥\8dपादà¤\95 à¤\95à¥\87 à¤¸à¤¦à¤¸à¥\8dयनाम/à¤\86à¤\87॰पà¥\80 à¤\9bà¥\81पाà¤\81à¤\88à¤\82",
+       "revdelete-hide-comment": "साराà¤\82श à¤¸à¤®à¥\8dपादन",
+       "revdelete-hide-user": "समà¥\8dपादà¤\95 à¤\95à¥\87 à¤¸à¤¦à¤¸à¥\8dयनाम/à¤\86à¤\87॰पà¥\80 à¤ªà¤¤à¤¾",
        "revdelete-radio-same": "(मत बदलीं)",
-       "revdelete-radio-set": "à¤\9cà¥\80",
-       "revdelete-radio-unset": "ना",
+       "revdelete-radio-set": "à¤\9bà¥\81पल",
+       "revdelete-radio-unset": "दà¥\83शà¥\8dयमान",
        "revdelete-log": "कारण:",
        "revdel-restore": "दूश्यता बदलीं",
        "pagehist": "पन्ना के इतिहास",
        "shown-title": "दिखाईं $1 {{PLURAL:$1|परिणाम}}",
        "viewprevnext": "देखीं ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''इ विकि पर ''[[:$1]]'' नाम से एगो पन्ना उपलब्ध बा'''",
-       "searchmenu-new": "'''इ विकि पर ''[[:$1]]'' नाम से पन्ना बनाईं'''",
+       "searchmenu-new": "<strong> ई विकि पर \"[[:$1]]\" नाम के पन्ना बनाईं !</strong> {{PLURAL:$2|0=|आपके खोज से मिलल पन्ना भी देखीं|खोज परिणाम भी देखीं।}}",
        "searchprofile-articles": "सामग्री पन्ना",
        "searchprofile-images": "मल्टिमीडिया",
        "searchprofile-everything": "सब कुछ",
        "search-section": "(खंड $1)",
        "search-suggest": "का राउर मतलब बा: $1",
        "search-interwiki-caption": "भ्रातृ परियोजना",
-       "search-interwiki-default": "$1 à¤\95े परिणाम:",
+       "search-interwiki-default": "$1 à¤¸े परिणाम:",
        "search-interwiki-more": "(अउर)",
        "search-relatedarticle": "संबंधित",
        "searchrelated": "संबंधित",
        "preferences": "वरीयता",
        "mypreferences": "राउर पसन्द",
        "prefs-edits": "सम्पादन संख्या",
+       "prefsnologintext2": "आपन वरीयता में बदलाव लावे खातिर प्रवेश करीं।",
        "prefs-skin": "त्वचा",
        "skin-preview": "पूर्वावलोकन",
+       "datedefault": "वरीयता नईखे",
        "prefs-user-pages": "सदस्य पन्ना",
        "prefs-personal": "सदस्य प्रोफाईल",
        "prefs-rc": "तुरंत भईल परिवर्तन",
        "contributions-title": " $1 खातिर प्रयोगकर्ता योगदान",
        "mycontris": "राउर योगदान के सूची",
        "nocontribs": "ई मानदंड से मिलत जुलत कौनो बदलाव ना मिलल।",
-       "uctop": "(शà¥\80रà¥\8dष)",
+       "uctop": "(हाल à¤\95à¥\87)",
        "month": "महिना से (आ उ से पहिले):",
        "year": "साल से (आ उ से पहिले):",
        "sp-contributions-newbies": "खाली नया खाता के योगदान देखीं।",
        "whatlinkshere-hidelinks": "$1 लिंक",
        "whatlinkshere-hideimages": "$1 फ़ाइल लिंक",
        "whatlinkshere-filters": "फिल्टर",
-       "blockip": "प्रतिबंधित प्रयोगकर्ता",
+       "blockip": "{{GENDER:$1|सदस्य}} अवरोधित करीं",
        "ipboptions": "२ घंटे:2 hours,१ दिन:1 day,३ दिन:3 days,१ हफ्ता:1 week,२ हफ्ते:2 weeks,१ महिना:1 month,३ महिने:3 months,६ महिने:6 months,१ साल:1 year,हमेशा खातिर:infinite",
        "blocklink": "निष्क्रिय",
        "unblocklink": "ताला खोलीं",
        "tooltip-pt-mycontris": "राउर योगदान के सूची",
        "tooltip-pt-login": "रउआ के खाता प्रवेश खातिर प्रोत्साहित करल जा रहल बा, बाकि ई अनिवार्य नईखे",
        "tooltip-pt-logout": "खाता से बाहर",
+       "tooltip-pt-createaccount": "हमनी के सुझाव बा की आप खाता बनाईं आ प्रवेश करीं, परन्तु ई अनिवार्य नईखे",
        "tooltip-ca-talk": "सामग्री पन्ना के बारे में बात-चीत",
        "tooltip-ca-edit": "रउआ ई पन्ना के सम्पादन कर सकत बानी। कृपया पन्ना सुरक्षित करे से पहिले पूर्वावलोकन बटन के इस्तेमाल करीं।",
        "tooltip-ca-addsection": "एगो नया खण्ड शुरु करीं",
        "tooltip-ca-viewsource": "इ पन्ना के संरक्षित कर दिहल गईल बा। रऊआ एकर मूल देख सकत बानी।",
        "tooltip-ca-history": "ई पन्ना के पिछला संशोधन",
        "tooltip-ca-protect": "इ पन्ना के संरक्षित करीं।",
-       "tooltip-ca-unprotect": "à¤\87 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¤\82रà¤\95à¥\8dषण à¤¹à¤\9fाà¤\88ं।",
+       "tooltip-ca-unprotect": "à¤\88 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¥\81रà¤\95à¥\8dषा à¤¬à¤¦à¤²à¥\80ं।",
        "tooltip-ca-delete": "ई पन्ना मिटाईं",
        "tooltip-ca-move": "ई पन्ना के स्थांतरण करीं",
        "tooltip-ca-watch": "इ पन्ना के आपन ध्यानसूची में डालीं",
        "tooltip-preview": "आपन द्वारा कियल गइल बदलाव के देखीं, संजोये से पहले ईका इस्तेमाल करीं!",
        "tooltip-rollback": "\"वापिस लीं\" ई पन्ना के पिछ्ला योगदाता के बदलाव एकही चटके मे गायब कर देवेला",
        "tooltip-summary": "एगो संक्षिप्त सारांश दर्ज करीं",
+       "pageinfo-toolboxlink": "जानकारी पन्ना",
        "file-nohires": " उच्च गुणवत्ता उपलब्ध नईखे।",
        "svg-long-desc": "एस वी जी फाईल, नॉमिनल्ली $1 x $2 पिक्सल्स, फाईल के आकार $3",
-       "show-big-image": "पà¥\81रा à¤\97à¥\81णवतà¥\8dता",
+       "show-big-image": "मà¥\82ल à¤«à¤¾à¤\88ल",
        "file-info-gif-looped": "लूप्ड",
        "file-info-gif-frames": "$1 {{PLURAL:$1|फ्रेम}}",
        "file-info-png-looped": "लूप्ड",
        "specialpages": "ख़ाश पन्ना",
        "revdelete-restricted": "प्रबंधक पर प्रतिबंध लागू",
        "revdelete-unrestricted": "प्रबंधक पर से प्रतिबंध समाप्त",
-       "revdelete-summary": "सारांश संपादन"
+       "revdelete-summary": "सारांश संपादन",
+       "searchsuggest-search": "खोजीं"
 }
index 0d9562c..fb7ea65 100644 (file)
        "listduplicatedfiles": "সদৃশ ফাইলের তালিকা",
        "listduplicatedfiles-summary": "এটি ফাইলসমূহের একটি তালিকা যেখানে একটি ফাইলের সাম্প্রতিকতম সংস্করণ অন্য আরেকটি ফাইলের সাম্প্রতিকতম সংস্করণের প্রতিলিপি। শুধু স্থানীয় ফাইল বিবেচনা করা হয়েছে।",
        "listduplicatedfiles-entry": "[[:File:$1|$1]]-এর [[$3|{{PLURAL:$2|একটি প্রতিলিপি|$2টি প্রতিলিপি}}]] রয়েছে।",
-       "unusedtemplates": "à¦\85বà§\8dযবহà§\83ত à¦\9fà§\87মপà§\8dলà§\87à¦\9fà¦\97à§\81লি",
+       "unusedtemplates": "à¦\85বà§\8dযবহà§\83ত à¦\9fà§\87মপà§\8dলà§\87à¦\9fসমà§\82হ",
        "unusedtemplatestext": "{{ns:template}} নামস্থানের যে সমস্ত পাতা অন্য কোন পাতায় অন্তর্ভুক্ত নয়, তাদের সবগুলির তালিকা এই পাতায় দেওয়া হল। টেমপ্লেটগুলি মুছে ফেলার আগে পরীক্ষা করে দেখুন অন্য কোথাও থেকে এগুলিতে সংযোগ আছে কি না।",
        "unusedtemplateswlh": "অন্যান্য সংযোগগুলি",
        "randompage": "অজানা যেকোনো পাতা",
        "pageswithprop-submit": "চলো",
        "pageswithprop-prophidden-long": "দীর্ঘ প্রোপার্টি টেক্সটগুলো লুকানো রয়েছে ($1)",
        "pageswithprop-prophidden-binary": "বাইনারি প্রোপার্টি টেক্সটগুলো লুকানো রয়েছে ($1)",
-       "doubleredirects": "দà§\81à¦\87বার à¦\95রা à¦ªà§\81নরà§\8dনিরà§\8dদà§\87শনাà¦\97à§\81লি",
+       "doubleredirects": "দà§\81à¦\87বার à¦\95রা à¦ªà§\81নরà§\8dনিরà§\8dদà§\87শনাসমà§\82হ",
        "doubleredirectstext": "এই পাতায় এমন পাতাগুলোর তালিকা আছে, যেগুলো অন্য কোন পুনর্নির্দেশনা পাতায় পুনর্নির্দেশিত হয়েছে। প্রতিটি সারিতে প্রথম ও দ্বিতীয় পুনর্নির্দেশনার জন্য সংযোগ আছে এবং দ্বিতীয় পুনর্নির্দেশনাটির লক্ষ্য সংযোগটিও দেওয়া আছে। এই লক্ষ্য সংযোগটিই সাধারণত \"আসল\" লক্ষ্য পাতা, যেটিতে প্রথম পুনর্নির্দেশনাটি থেকে সংযোগ থাকা উচিত।\n<del>কেটে দেওয়া</del> ভুক্তিগুলো ঠিক করা হয়েছে।",
        "double-redirect-fixed-move": "[[$1]] সরিয়ে নেওয়া হয়েছে।\nএটি স্বয়ংক্রিয়ভাবে হালনাগাদ হয়েছে এবং এটি এখন [[$2]] এ পুনঃনির্দেশিত হয়েছে।",
        "double-redirect-fixed-maintenance": "রক্ষণাবেক্ষণ কাজ হিসাবে [[$1]] থেকে [[$2]] এর দ্বিপুনঃর্নিদেশ স্বয়ংক্রিয়ভাবে সংশোধন করা হয়েছে।",
        "wantedcategories": "বাঞ্ছনীয় বিষয়শ্রেণীগুলি",
        "wantedpages": "বাঞ্ছনীয় পাতাগুলি",
        "wantedpages-badtitle": "ফলাফলে ভুল শিরনাম: $1",
-       "wantedfiles": "à¦\86বশà§\8dযিà¦\95 à¦«à¦¾à¦\87লà¦\97à§\81লà§\8b",
+       "wantedfiles": "à¦\86বশà§\8dযিà¦\95 à¦«à¦¾à¦\87লসমà§\82হ",
        "wantedfiletext-cat": "নিচের ফাইলগুলো ব্যবহৃত হচ্ছে কিন্তু এগুলো অপসারিত হয়েছে। অন্যান্য রিপোজিটরী থেকে ব্যবহৃত ফাইলগুলো এভাবে প্রদর্শিত হতে পারে। এই ধরনের কোন ফাইল খুজে পেলে <del>অপসারণ করুন</del>। এছাড়া অপসারিত হয়েছে এমন ছবির সংযোগ রয়েছে এমন পাতাসমূহের লিংক পাওয়া যাবে এখানে [[:$1]]।",
        "wantedfiletext-nocat": "নিচের ফাইলগুলো ব্যবহৃত হচ্ছে কিন্তু এগুলো অপসারিত হয়েছে। অন্যান্য রিপোজিটরী থেকে ব্যবহৃত ফাইলগুলো এভাবে প্রদর্শিত হতে পারে। এই ধরনের ভূলগুলো শিঘ্রই <del>অপসারিত হবে</del>।",
        "wantedfiletext-nocat-noforeign": "নিম্নলিখিত ফাইলসমূহ ব্যবহৃত হয়েছে কিন্তু এর অস্তিত্ব নেই।",
-       "wantedtemplates": "à¦\86বশà§\8dযিà¦\95 à¦\9fà§\87মà§\8dপলà§\87à¦\9fà¦\97à§\81লà§\8b",
+       "wantedtemplates": "à¦\86বশà§\8dযিà¦\95 à¦\9fà§\87মপà§\8dলà§\87à¦\9fসমà§\82হ",
        "mostlinked": "যেসব পাতার প্রতি সবচেয়ে বেশি সংযোগ আছে",
        "mostlinkedcategories": "যেসব বিষয়শ্রেণীর প্রতি সবচেয়ে বেশি সংযোগ আছে",
        "mostlinkedtemplates": "সবচেয়ে বেশি অন্তর্ভুক্ত পাতা",
        "import-rootpage-nosubpage": "মূল পাতার \"$1\" নামস্থানে উপপাতা তৈরী অনুমোদিত নয়।",
        "importlogpage": "আমদানি লগ",
        "importlogpagetext": "প্রশাসক কর্তৃক অন্যান্য উইকি থেকে সম্পাদনা ইতিহাসসহ পাতা আমদানি।",
-       "import-logentry-upload": "ফাইল আপলোডের মাধ্যমে [[$1]] আমদানি করা হয়েছে",
        "import-logentry-upload-detail": "$1টি {{PLURAL:$1|সংশোধন}} আমদানি করা হয়েছে",
-       "import-logentry-interwiki": "$1 উইকি-স্থানান্তরিত",
        "import-logentry-interwiki-detail": "$2-এর থেকে $1টি {{PLURAL:$1|সংশোধন}} করা হয়েছে",
        "javascripttest": "জাভাস্ক্রিপ্ট পরীক্ষা",
        "javascripttest-pagetext-noframework": "এই পাতাটি জাভাস্ক্রিপ্ট পরীক্ষার জন্য সংরক্ষিত।",
        "redirect-revision": "পাতা সংস্করণ",
        "redirect-file": "ফাইলের নাম",
        "redirect-not-exists": "মান পাওয়া যায়নি",
-       "fileduplicatesearch": "ডà§\81পà§\8dলিà¦\95à§\87à¦\9f ফাইলের জন্য অনুসন্ধান",
+       "fileduplicatesearch": "সদà§\83শ ফাইলের জন্য অনুসন্ধান",
        "fileduplicatesearch-summary": "হ্যাশ ভ্যালুর ওর ভিত্তি করে একই ছবিগুলো খুঁজুন।",
        "fileduplicatesearch-legend": "অনুলিপির জন্য অনুসন্ধান",
        "fileduplicatesearch-filename": "ফাইলনাম:",
index c13ccd3..c053527 100644 (file)
        "disclaimers": "Avís general",
        "disclaimerpage": "Project:Avís general",
        "edithelp": "Ajuda per a l'edició",
+       "helppage-top-gethelp": "Ajuda",
        "mainpage": "Pàgina principal",
        "mainpage-description": "Pàgina principal",
        "policy-url": "Project:Polítiques",
        "readonly_lag": "La base de dades s'ha bloquejat automàticament mentre els servidors esclaus se sincronitzen amb el mestre",
        "internalerror": "Error intern",
        "internalerror_info": "Error intern: $1",
+       "internalerror-fatal-exception": "Excepció fatal del tipus «$1»",
        "filecopyerror": "No s'ha pogut copiar el fitxer «$1» com «$2».",
        "filerenameerror": "No s'ha pogut reanomenar el fitxer «$1» com «$2».",
        "filedeleteerror": "No s'ha pogut eliminar el fitxer «$1».",
        "thumbnail_image-missing": "Sembla que falta el fitxer: $1",
        "thumbnail_image-failure-limit": "Hi ha hagut massa intents fallits recents ($1 o més) per dibuixar aquesta miniatura.\nTorneu-ho a provar més endavant.",
        "import": "Importació de pàgines",
-       "importinterwiki": "Importa interwiki",
+       "importinterwiki": "Importa d'un altre wiki",
        "import-interwiki-text": "Trieu un web basat en wiki i un títol de pàgina per a importar.\nEs conservaran les dates de les versions i els noms dels editors.\nTotes les accions d'importació interwiki es conserven al [[Special:Log/import|registre d'importacions]].",
        "import-interwiki-sourcewiki": "Wiki d'origen:",
        "import-interwiki-sourcepage": "Pàgina d'origen:",
        "import-rootpage-nosubpage": "L'espai de noms \"$1\" de la pàgina arrel no permet subpàgines.",
        "importlogpage": "Registre d'importació",
        "importlogpagetext": "Importacions administratives de pàgines amb l'historial des d'altres wikis.",
-       "import-logentry-upload": "ha importat [[$1]] per càrrega de fitxers",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|revisió|revisions}} importades",
-       "import-logentry-interwiki": "s'ha importat $1 via interwiki",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revisió|revisions}} importades de $2",
        "javascripttest": "Proves de JavaScript",
        "javascripttest-pagetext-noframework": "Es reserva la pàgina per a l'execució de tests amb JavaScript.",
        "tags-delete-title": "Elimina l'etiqueta",
        "tags-delete-explanation-initial": "Esteu a punt d'eliminar l'etiqueta «$1» de la base de dades.",
        "tags-delete-reason": "Motiu:",
+       "tags-delete-submit": "Suprimeix irreversiblement aquesta etiqueta",
        "tags-delete-not-found": "L'etiqueta «$1» no existeix.",
        "tags-delete-too-many-uses": "L'etiqueta «$1» s'aplica a més {{PLURAL:$2|d'$2 revisió|de $2 revisions}} i, per tant, no pot eliminar-se.",
        "tags-activate-title": "Activa l'etiqueta",
        "tags-activate-not-found": "L'etiqueta «$1» no existeix.",
        "tags-activate-submit": "Activa",
        "tags-deactivate-title": "Desactiva l'etiqueta",
+       "tags-deactivate-question": "Esteu a punt de desactivar l'etiqueta «$1».",
        "tags-deactivate-reason": "Motiu:",
+       "tags-deactivate-not-allowed": "No és possible desactivar l'etiqueta «$1».",
        "tags-deactivate-submit": "Desactiva",
        "comparepages": "Comparar pàgines",
        "compare-page1": "Pàgina 1",
        "rightsnone": "(cap)",
        "revdelete-summary": "el resum d'edició",
        "feedback-adding": "S'està afegint el comentari a la pàgina...",
+       "feedback-back": "Enrere",
        "feedback-bugcheck": "Fantàstic! Comproveu que no sigui un dels [$1 problemes ja coneguts].",
        "feedback-bugnew": "Ja ho he comprovat. Informeu d'un nou problema",
        "feedback-bugornote": "Si podeu descriure un problema tècnic en detall, [$1 informeu-ne].\nAltrament, podeu fer servir un senzill formulari a continuació. El vostre comentari s'afegirà a la pàgina «[$3 $2]», juntament amb el vostre nom d'usuari i el navegador que esteu emprant.",
        "feedback-cancel": "Canceŀla",
        "feedback-close": "Fet",
+       "feedback-error-title": "Error",
        "feedback-error1": "Error: Resultat de l'API no reconegut",
        "feedback-error2": "Error: Edició fallida",
        "feedback-error3": "Error: No hi ha resposta de l'API",
        "feedback-subject": "Assumpte:",
        "feedback-submit": "Envia",
        "feedback-thanks": "Gràcies! S'ha publicat la vostra opinió a la pàgina «[$2 $1]».",
+       "feedback-thanks-title": "Gràcies!",
+       "feedback-useragent": "Agent d'usuari:",
        "searchsuggest-search": "Cerca",
        "searchsuggest-containing": "que conté ...",
        "api-error-badaccess-groups": "No teniu permís per a carregar fitxers en aquest wiki.",
index c00f555..41c2ebe 100644 (file)
@@ -18,7 +18,7 @@
        "tog-extendwatchlist": "Шорбина тӀехьажарна могӀам, ша беригге а хийцамаш чубогӀуш, тӀехьаббина боцурш а",
        "tog-usenewrc": "Лелабе дика могӀам керла чу хийцамашна (оьшу JavaScript)",
        "tog-numberheadings": "Ша шех хlитто терахь корташна",
-       "tog-showtoolbar": "Ð\93айÑ\82а Ð»Ð°ÐºÑ\85аÑ\80а Ð³Ó\80иÑ\80Ñ\81ан Ð´Ð°ÐºÑ\8aа Ð½Ð¸Ñ\81йеÑ\88 Ð°Ñ\82Ñ\82он Ð¾Ñ\86 Ñ\82адаÑ\80 Ñ\87оÑ\85Ñ\8c (JavaScript)",
+       "tog-showtoolbar": "Ð\93айÑ\82а Ð»Ð°ÐºÑ\85аÑ\80а Ð³Ó\80иÑ\80Ñ\81ийн Ð¿Ð°Ð½ÐµÐ»Ñ\8c Ñ\82адаÑ\80Ñ\88 Ð´ÐµÑ\87Ñ\83 Ñ\85енаÑ\85Ñ\8c",
        "tog-editondblclick": "Нисъе агӀонаш шозза тӀетаӀийча (JavaScript)",
        "tog-editsectiononrightclick": "Нисде дакъа шозза бакъехьар дахка тӀетаӀийча оцу кортан (JavaScript)",
        "tog-watchcreations": "ТӀетоха ас кхоьллина агӀонаш тергаме могӀам чу",
@@ -88,7 +88,7 @@
        "february-gen": "февралехь",
        "march-gen": "мартехь",
        "april-gen": "апрелехь",
-       "may-gen": "майехь",
+       "may-gen": "майхь",
        "june-gen": "июнехь",
        "july-gen": "июлехь",
        "august-gen": "августехь",
        "thisisdeleted": "Хьажа я меттахӀоттае $1?",
        "viewdeleted": "Хьожий $1?",
        "restorelink": "{{PLURAL:$1|1=$1 дӀадаьккхина нийсдар|$1 дӀадяхна нийсдарш}}",
-       "feedlinks": "Ð\9eÑ\86Ñ\83 Ñ\85аÑ\82lаÑ\8cхь:",
+       "feedlinks": "Тайпанехь:",
        "feed-invalid": "Тайпан нийсадоцу талол оцу куьгтаlорна.",
        "feed-unavailable": "Хаитарца йолу асанаш тlекхочучехь яц",
        "site-rss-feed": "$1 — RSS-аса",
        "viewpagelogs": "Гайта хlокху агlонан тептар",
        "nohistory": "ХӀокху агӀона хийцамаш бина хила бац.",
        "currentrev": "Карара верси",
-       "currentrev-asof": "Карара верси оцу $1",
+       "currentrev-asof": "Карара верси $1",
        "revisionasof": "Верси $1",
        "revision-info": "Верси $1; {{GENDER:$6|$2}}$7",
        "previousrevision": "← Хьалха йоьдург",
        "searchprofile-articles-tooltip": "$1 чохь лахар",
        "searchprofile-images-tooltip": "Файлаш лахар",
        "searchprofile-everything-tooltip": "Массо агӀонашкахь лахар (дийцаре агӀонашца)",
-       "searchprofile-advanced-tooltip": "Ð\94еÑ\85аÑ\80Ñ\86а Ð¹Ð¾Ð»Ñ\83 Ñ\86Ó\80еÑ\80ийн Ð¼ÐµÑ\82Ñ\82игашкахь лахар",
+       "searchprofile-advanced-tooltip": "Ð\94еÑ\85аÑ\80Ñ\86а Ð¹Ð¾Ð»Ñ\83 Ñ\86Ó\80еÑ\80ийн Ð°Ð½ашкахь лахар",
        "search-result-size": "$1 ({{PLURAL:$2|$2 дош|$2 дешнаш}})",
        "search-result-category-size": "$1 {{PLURAL:$1|юкъаяр}} ($2 {{PLURAL:$2|1=бухара категори|бухара категореш}}, $3 {{PLURAL:$3|1=файл|файлаш}}).",
        "search-redirect": "(дlасахьажийна $1)",
        "search-showingresults": "{{PLURAL:$4|Карийна <strong>$1</strong> — цхьаъ агӀо|И дош карийна <strong>$3</strong> агӀонашкахь, царех гойту $2 агӀо}}",
        "search-nonefound": "Дехаре терра цхьа хӀума ца карийна.",
        "powersearch-legend": "Шуьйра лахар",
-       "powersearch-ns": "ЦÓ\80еÑ\80ийн Ð¼ÐµÑ\82Ñ\82игашкахь лахар:",
+       "powersearch-ns": "ЦÓ\80еÑ\80ийн Ð°Ð½ашкахь лахар:",
        "powersearch-togglelabel": "Билгалдан:",
        "powersearch-toggleall": "Массо",
        "powersearch-togglenone": "ХӀумма цаоьшу",
        "filehist-current": "карара",
        "filehist-datetime": "Терахь/Хан",
        "filehist-thumb": "Жима",
-       "filehist-thumbtext": "Ð\96имо Ð±Ð°Ñ\88Ñ\85о Ð¾Ñ\86Ñ\83 $1",
+       "filehist-thumbtext": "Ð\96имо Ð²ÐµÑ\80Ñ\81и $1",
        "filehist-nothumb": "Миниатюра яц",
        "filehist-user": "Декъашхо",
        "filehist-dimensions": "Файлан барам",
        "nextpage": "Тlаьхьа йогlу агlо ($1)",
        "prevpage": "Хьалхалера агlо ($1)",
        "allpagesfrom": "Гучé яха агӀонаш, йолалуш йолу оцу:",
-       "allpagesto": "Арайахар сацадé оцу:",
+       "allpagesto": "Араяхар сацадé тӀе:",
        "allarticles": "Массо агӀонаш",
        "allinnamespace": "Массо агӀонаш оцу цӀерийн анахь «$1»",
        "allpagessubmit": "Кхочушдé",
        "cachedspecial-refresh-now": "Хьажа тӀехьарчу версега.",
        "categories": "Категореш",
        "categoriespagetext": "{{PLURAL:$1|1=Лахара категореш чохь ю|Лахара категореш чохь ю}} агӀонаш я медиа-файлаш.\nКхузахь гойтуш яц [[Special:UnusedCategories|лелош йоцу категореш]].\nКхин дӀа [[Special:WantedCategories| хийла еза категореш]].",
-       "categoriesfrom": "Гучé яха категореш, оцу:",
+       "categoriesfrom": "Гучé яха категореш, тӀера:",
        "special-categories-sort-count": "нисъе дукхаллица",
        "special-categories-sort-abc": "нисъе абатца",
        "deletedcontributions": "Декъашхочун дӀабяккхина къинхьегам",
        "undelete-show-file-submit": "ХӀаъ",
        "namespace": "Цlерийн ана:",
        "invert": "Хаьржинарг къайлаяккха",
-       "tooltip-invert": "Ð¥Ó\80оÑ\82Ñ\82ае Ñ\85Ó\80аÑ\80а Ð±Ð¸Ð»Ð³Ð°Ð»Ð¾, Ñ\85аÑ\8cÑ\80жинÑ\87Ñ\83 Ñ\86Ó\80еÑ\80ийн Ð°Ð½Ð°Ð½ Ð°Ð³Ó\80онийн Ñ\85ийÑ\86амаÑ\88 ÐºÑ\8aайлабаÑ\85а (кÑ\85ин Ð´Ð¸Ñ\85кина Ñ\86Ó\80еÑ\80ийн Ð¼ÐµÑ\82Ñ\82игаш, гайтина елахь)",
+       "tooltip-invert": "Ð¥Ó\80оÑ\82Ñ\82ае Ñ\85Ó\80аÑ\80а Ð±Ð¸Ð»Ð³Ð°Ð»Ð¾, Ñ\85аÑ\8cÑ\80жинÑ\87Ñ\83 Ñ\86Ó\80еÑ\80ийн Ð°Ð½Ð°Ð½ Ð°Ð³Ó\80онийн Ñ\85ийÑ\86амаÑ\88 ÐºÑ\8aайлабаÑ\85а (кÑ\85ин Ð´Ð¸Ñ\85кина Ñ\86Ó\80еÑ\80ийн Ð°Ð½аш, гайтина елахь)",
        "namespace_association": "Йихкина ана",
        "tooltip-namespace_association": "ХӀоттае хӀара билгало, иштта дийцарийн (я кхин) цӀерийн ана юкъахь хилийта",
        "blanknamespace": "(Коьрта)",
        "export-addns": "ТӀетоха",
        "export-download": "Кховда де файл сана Ӏалашдан",
        "export-templates": "Латадé кепаш",
-       "allmessages": "Гlирса хаамаш",
+       "allmessages": "ГӀирса хаамаш",
        "allmessagesname": "Хаам",
        "allmessagesdefault": "Ӏад дитарца йоза",
        "allmessagescurrent": "Карарчу хенан йоза",
        "importlogpage": "Импортан тептар",
        "importlogpagetext": "Куьйгалхоша агӀонаш импорт яр царна бина хийцамашца кхечу википедеш чура.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|верси импорт йина|версеш импорт йина}}",
-       "import-logentry-interwiki": "«$1» — викиюкъара импорт",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|верси импорт йина|версеш импорт йина}} $2 чура",
        "javascripttest": "JavaScript хьажар",
        "tooltip-pt-userpage": "Декъашхочуьна агlо",
index c3febd7..e2b0a8f 100644 (file)
        "import-rootpage-nosubpage": "Ve jmenném prostoru „$1“ kořenové stránky nejsou dovoleny podstránky.",
        "importlogpage": "Kniha importů",
        "importlogpagetext": "Na této stránce se zobrazují správcovské importy stránek včetně historie editací z jiných wiki.",
-       "import-logentry-upload": "naimportoval [[$1]] načtením souboru",
        "import-logentry-upload-detail": "{{PLURAL:$1|naimportována $1 revize|naimportovány $1 revize|naimportováno $1 revizí}}",
-       "import-logentry-interwiki": "přenesl $1",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|naimportována $1 revize|naimportovány $1 revize|naimportováno $1 revizí}} z $2",
        "javascripttest": "Testování JavaScriptu",
        "javascripttest-pagetext-noframework": "Tato stránka je vyhrazena pro spouštění testů JavaScriptu.",
        "logentry-block-reblock": "$1 {{GENDER:$2|změnil|změnila|mění}} nastavení bloku {{GENDER:$4|uživatele|uživatelky}} „$3“ s časem vypršení $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|zablokoval|zablokovala|blokuje}} {{GENDER:$4|uživatele|uživatelku}} „$3“ s časem vypršení $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|změnil|změnila|mění}} nastavení bloku {{GENDER:$4|uživatele|uživatelky}} „$3“ s časem vypršení $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|naimportoval|naimportovala}} $3 načtením souboru",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|naimportoval|naimportovala}} $3 z jiné wiki",
        "logentry-merge-merge": "$1 {{GENDER:$2|sloučil|sloučila}} stránku $3 do $4 (revize po $5)",
        "logentry-move-move": "$1 {{GENDER:$2|přesunul|přesunula}} stránku $3 na $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|přesunul|přesunula}} stránku $3 na $4 bez založení přesměrování",
        "feedback-bugornote": "Pokud dokážete podrobně popsat technický problém, můžete [$1 nahlásit chybu].\nJinak můžete využít jednoduchý formulář níže. Váš komentář bude přidán na stránku „[$3 $2]“ spolu s vaším uživatelským jménem a informací o tom, jaký prohlížeč používáte.",
        "feedback-cancel": "Storno",
        "feedback-close": "Hotovo",
+       "feedback-external-bug-report-button": "Založit technický úkol",
        "feedback-dialog-title": "Odeslat názor",
-       "feedback-dialog-intro": "Pomocí níže zobrazeného formuláře můžete odeslat svůj názor. Váš komentář se spolu s vaším uživatelským jménem přidá na stránku „$1“.",
+       "feedback-dialog-intro": "Pomocí níže zobrazeného jednoduchého formuláře můžete odeslat svůj názor. Váš komentář se spolu s vaším uživatelským jménem přidá na stránku „$1“.",
        "feedback-error-title": "Chyba",
        "feedback-error1": "Chyba: Nerozpoznaný výsledek z API",
        "feedback-error2": "Chyba: Editace se nezdařila",
        "feedback-message": "Zpráva:",
        "feedback-subject": "Předmět:",
        "feedback-submit": "Odeslat",
+       "feedback-terms": "Jsem srozuměn s tím, že informace o mém uživatelském agentu zahrnují informace o přesné verzi mého prohlížeče a operačního systému a budou zveřejněny u mého komentáře.",
        "feedback-thanks": "Děkujeme! Váš komentář byl přidán na stránku „[$2 $1]“.",
        "feedback-thanks-title": "Děkujeme!",
+       "feedback-useragent": "Uživatelský agent:",
        "searchsuggest-search": "Hledat",
        "searchsuggest-containing": "obsahující…",
        "api-error-badaccess-groups": "Nemáte povoleno nahrávat soubory na tuto wiki.",
index 1136b85..08a33ce 100644 (file)
@@ -72,7 +72,7 @@
        "november": "Чӳк",
        "december": "Раштав",
        "january-gen": "Кăрлач уйăхĕн",
-       "february-gen": "нарăс уйăхĕн",
+       "february-gen": "Ð\9dарăс уйăхĕн",
        "march-gen": "Пуш уйăхĕн",
        "april-gen": "Ака уйăхĕн",
        "may-gen": "Çу уйăхĕн",
        "importnofile": "Импортламалли файла тиемен",
        "import-noarticle": "Импортламалли страница çук!",
        "importlogpage": "Импорт журналĕ",
-       "import-logentry-upload": "«[[$1]]» — файлтан импортла",
        "tooltip-pt-userpage": "Сирĕн хутшăнакан страници",
        "tooltip-pt-mytalk": "Сирĕн канашлу страници",
        "tooltip-pt-preferences": "Сирĕн ĕнерлевсем",
index 7d95c33..3b9ef84 100644 (file)
@@ -47,7 +47,8 @@
                        "Tjernobyl",
                        "Urhixidur",
                        "아라",
-                       "Thomsen"
+                       "Thomsen",
+                       "Knud Winckelmann"
                ]
        },
        "tog-underline": "Understreg henvisninger:",
        "revdelete-hide-image": "Skjul filindhold",
        "revdelete-hide-name": "Skjul handling og mål",
        "revdelete-hide-comment": "Redigeringssammendrag",
-       "revdelete-hide-user": "Brugerens brugernavn/IP-adrsse",
+       "revdelete-hide-user": "Brugerens brugernavn/IP-adresse",
        "revdelete-hide-restricted": "Skjul også informationen for administratorer",
        "revdelete-radio-same": "(ingen ændring)",
        "revdelete-radio-set": "Skjult",
        "import-rootpage-nosubpage": "Navnerummet \"$1\" tillader ikke undersider af rodsiderne.",
        "importlogpage": "Importlog",
        "importlogpagetext": "Administrativ import af sider med versionshistorik fra andre Wikis.",
-       "import-logentry-upload": "[[$1]] blev importeret",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|version|versioner}} importeret",
-       "import-logentry-interwiki": "$1 blev importeret (Transwiki)",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|version|versioner}} importeret fra $2",
        "javascripttest": "Test af JavaScript",
        "javascripttest-pagetext-noframework": "Denne side er reserveret til at teste JavaScript.",
index 31ada1b..06815fa 100644 (file)
        "sp-contributions-uploads": "Hochgeladene Dateien",
        "sp-contributions-logs": "Logbücher",
        "sp-contributions-talk": "Diskussion",
-       "sp-contributions-userrights": "Benutzerrechteverwaltung",
+       "sp-contributions-userrights": "Benutzerrechte­verwaltung",
        "sp-contributions-blocked-notice": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} ist derzeit gesperrt. Es folgt der aktuelle Eintrag aus dem Benutzersperr-Logbuch:",
        "sp-contributions-blocked-notice-anon": "Diese IP-Adresse ist zurzeit gesperrt.\nZur Information folgt der aktuelle Auszug aus dem Sperr-Logbuch:",
        "sp-contributions-search": "Suche nach Benutzerbeiträgen",
        "import-rootpage-nosubpage": "Im Namensraum „$1“ der Stammseite sind keine Unterseiten erlaubt.",
        "importlogpage": "Import-Logbuch",
        "importlogpagetext": "Administrativer Import von Seiten mit Versionsgeschichte von anderen Wikis.",
-       "import-logentry-upload": "importierte „[[$1]]“ von einer Datei",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|Version|Versionen}} importiert",
-       "import-logentry-interwiki": "importierte „$1“ (Transwiki)",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|Version|Versionen}} von $2 importiert",
        "javascripttest": "JavaScript-Test",
        "javascripttest-pagetext-noframework": "Diese Seite ist JavaSkript-Tests vorbehalten.",
        "logentry-block-reblock": "$1 {{GENDER:$2|änderte}} die Sperreinstellungen für {{GENDER:$4|$3}} mit einer Sperrdauer von $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|sperrte}} {{GENDER:$4|$3}} mit einer Sperrdauer von $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|änderte}} die Sperreinstellungen für {{GENDER:$4|$3}} mit einer Sperrdauer von $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|importierte}} $3 durch das Hochladen einer Datei",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|importierte}} $3 aus einem anderen Wiki",
        "logentry-merge-merge": "$1 {{GENDER:$2|vereinigte}} $3 in die Seite „$4“ (Versionen bis zum $5)",
        "logentry-move-move": "$1 {{GENDER:$2|verschob}} die Seite $3 nach $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|verschob}} die Seite $3 nach $4, ohne dabei eine Weiterleitung anzulegen",
index 538ee08..a9a62b2 100644 (file)
        "fileexists-extension": "Un file cun l'istès nòm al ghé bèle: [[$2|thumb]]\n*Nòm dal file carghê: <strong>[[:$1]]</strong>\n*Nòm dal file che gh'é: <strong>[[:$2]]</strong>  \nVōt fōrsi siēlier un nòm pió carateréstich?",
        "fileexists-thumbnail-yes": "Al file carghê al sèmbra èsere 'na miniadûra ''(thumbnail)''. [[$1|thumb]] Verifichêr, per cunfròunt, al file <strong>[[:$1]]</strong>. Se 's trâta ed l'istèsa figûra, int al j amzûri uriginêli, an n'é mìa necesâri carghêr êtri miniadûri.",
        "file-thumbnail-no": "Al nòm dal file al cumincia cun <strong>$1</strong>; la sèmbra dòunca èser 'na miniadûra ''(thumbnail)''. Se 's gh'à la figûra int la qualitê uriginêla, as prèiga 'd carghêrla. In chêş contrâri, as prèiga 'd cambiêr al nòm dal file.",
-       "fileexists-forbidden": "Un file cun un nòm cumpâgn al gh'é bèle e an 's pōl mìa scrévregh inséma. Tunêr indrē e cambiêr al nòm cun al nòm ch'es vōl carghêr alò file. [[File:$1|thumb|center|$1]]",
+       "fileexists-forbidden": "Un file cun un nòm cumpâgn al gh'é bèle e an 's pōl mìa scrévregh inséma. Tunêr indrē e cambiêr al nòm cun al nòm ch'es vōl carghêr al file. [[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "Un file cun un nòm cumpâgn al gh'é bèle int l'archévi dal risórsi multimediêli spartîdi. S' es vōl incòra carghêr al file, tunêr indrē e cambiêr al nòm cun al nòm ch'es vōl carghêr al file. [[File:$1|thumb|center|$1]]",
+       "file-exists-duplicate": "Cōl file ché l'é 'na côpia {{PLURAL:$1|dal segvèint|di segvèint}} file:",
+       "file-deleted-duplicate": "Un file cumpâgn a còst ([[:$1]]) l'é stê scanşlê tèimp fa. Verifichêr la stôria dal scanşladûri préma 'd carghêrel incòra ed nōv.",
+       "file-deleted-duplicate-notitle": "Un file cumpâgn a còst l'é stê scanşlê tèimp fa, e al tétol l'é stê tôt via. Dmânda a quelchidûn  ch' al gh'à la pusibilitê ed vèdeer i file scanşlê 'd verifichêr la situasiòun préma 'd andêr avânti cun al carghêrel incòra 'd nōv.",
+       "uploadwarning": "Avîş che s'é drē carghêr",
+       "uploadwarning-text": "Per piaşèir câmbia ché sòta la spiegasiòun dal file e prōv' incòra.",
+       "savefile": "Sêlva 'l file",
+       "uploaddisabled": "La cârga dal file l'é bluchêda.",
+       "copyuploaddisabled": "La cârga per mèz  'd URL l'é blucêda.",
+       "uploaddisabledtext": "La cârga di file an n'é mìa atîva.",
        "license": "Licèinsa:",
        "license-header": "Licèinsa",
        "nolicense": "Nisóna licèinsa sgnêda",
index a81a89e..56bfbbc 100644 (file)
        "editingsection": "Editing $1 (section)",
        "editingcomment": "Editing $1 (new section)",
        "editconflict": "Edit conflict: $1",
+       "editnotice-notext": "-",
        "explainconflict": "Someone else has changed this page since you started editing it.\nThe upper text area contains the page text as it currently exists.\nYour changes are shown in the lower text area.\nYou will have to merge your changes into the existing text.\n<strong>Only</strong> the text in the upper text area will be saved when you press \"{{int:savearticle}}\".",
        "yourtext": "Your text",
        "storedversion": "Stored revision",
        "logentry-block-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiry time of $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiry time of $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiry time of $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|imported}} $3 by file upload",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|imported}} $3 from another wiki",
        "logentry-merge-merge": "$1 {{GENDER:$2|merged}} $3 into $4 (revisions up to $5)",
        "logentry-move-move": "$1 {{GENDER:$2|moved}} page $3 to $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|moved}} page $3 to $4 without leaving a redirect",
index 888ce8b..1dcef6e 100644 (file)
        "unusedimagestext": "Los siguientes archivos existen pero no están insertados en ninguna página.\nPor favor note que otros sitios web pueden vincular a un archivo con un URL directo, y por tanto pueden ser listados aquí a pesar de estar en uso activo.",
        "unusedcategoriestext": "Las siguientes categorías han sido creadas, pero ningún artículo o categoría las utiliza.",
        "notargettitle": "No hay página objetivo",
-       "notargettext": "Especifique sobre qué página desea llevar a cabo esta acción.",
+       "notargettext": "No has especificado sobre qué página deseas llevar a cabo esta acción.",
        "nopagetitle": "No existe la página destino",
        "nopagetext": "La página destino que ha especificado no existe.",
        "pager-newer-n": "{{PLURAL:$1|1 siguiente|$1 siguientes}}",
        "import-rootpage-nosubpage": "El espacio de nombres \"$1\" de la página raíz no permite subpáginas.",
        "importlogpage": "Registro de importaciones",
        "importlogpagetext": "Importaciones administrativas de páginas con historial desde otros wikis.",
-       "import-logentry-upload": "importó [[$1]] por subida de archivo",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|revisión importada|revisiones importadas}}",
-       "import-logentry-interwiki": "transwikificada $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revisión importada|revisiones importadas}} desde $2",
        "javascripttest": "Pruebas de JavaScript",
        "javascripttest-pagetext-noframework": "Esta página está reservada para ejecutar pruebas de JavaScript.",
        "logentry-block-reblock": "$1 {{GENDER:$2|cambió}} la configuración del bloqueo de {{GENDER:$4|$3}} durante un plazo de $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|bloqueó}} {{GENDER:$4|$3}} durante un plazo de $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|cambió}} la configuración del bloqueo de {{GENDER:$4|$3}} durante un plazo de $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|importó}} $3 subiendo un archivo",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|importó}} $3 desde otro wiki",
        "logentry-merge-merge": "$1 {{GENDER:$2|combinó}} $3 en $4 (revisiones hasta el $5)",
        "logentry-move-move": "$1 {{GENDER:$2|trasladó}} la página $3 a $4",
        "logentry-move-move-noredirect": "$1 movió la página $3 a $4 sin dejar una redirección",
index 8557f6a..46ca745 100644 (file)
        "import-rootpage-nosubpage": "Juurlehekülje nimeruumis \"$1\" pole alamleheküljed lubatud.",
        "importlogpage": "Impordilogi",
        "importlogpagetext": "Importimislogi kuvab leheküljed, mille redigeerimisajalugu pärineb teistest vikidest.",
-       "import-logentry-upload": "importis faili üleslaadimisega lehekülje [[$1]]",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|redaktsioon|redaktsiooni}} imporditud",
-       "import-logentry-interwiki": "importis teisest vikist lehekülje $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|redaktsioon|redaktsiooni}} imporditud asukohast $2",
        "javascripttest": "JavaScripti katsetamine",
        "javascripttest-pagetext-noframework": "Seda lehekülge hoitakse JavaScripti katsete jaoks.",
        "logentry-block-reblock": "$1 {{GENDER:$2|muutis}} kasutaja {{GENDER:$4|$3}} blokeeringut; aegumistähtaeg $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|blokeeris}} kasutaja {{GENDER:$4|$3}}; aegumistähtaeg $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|muutis}} kasutaja {{GENDER:$4|$3}} blokeeringut; aegumistähtaeg $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|importis}} lehekülje $3 faili üleslaadimise teel",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|importis}} lehekülje $3 teisest vikist",
        "logentry-merge-merge": "$1 {{GENDER:$2|liitis}} lehekülje $3 leheküljega $4 (kuni redaktsioonini $5)",
        "logentry-move-move": "$1 {{GENDER:$2|teisaldas}} lehekülje $3 pealkirja $4 alla",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|teisaldas}} lehekülje $3 pealkirja $4 alla ümbersuunamist maha jätmata",
index 0b1b265..bbf55e3 100644 (file)
        "import-rootpage-nosubpage": "Jatorri orrialdearen «$1» izen-tarteak ez du baimentzen azpi-orrialderik.",
        "importlogpage": "Inportazio erregistroa",
        "importlogpagetext": "Beste wiki batzutatik historial eta guzti egindako orrialdeen inportazio administratiboak.",
-       "import-logentry-upload": "[[$1]] igoera bitartez inportatu da",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|berrikuspen|berrikuspen}}",
-       "import-logentry-interwiki": "$1 wiki artean mugitu da",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|berrikuspen|berrikuspen}} $2-(e)tik",
        "javascripttest": "JavaScript frogatzen",
        "javascripttest-pagetext-noframework": "Orrialde hau JavaScript frogak egiteko gordeta dago.",
index 7f5c30b..427c023 100644 (file)
@@ -7,7 +7,8 @@
                        "Urhixidur",
                        "Xuacu",
                        "아라",
-                       "Babanwalia"
+                       "Babanwalia",
+                       "Henares"
                ]
        },
        "tog-underline": "Surrayal atihus:",
        "import-upload": "Empuntal datus XML",
        "importlogpage": "Emporteal rustrihu",
        "importlogpagetext": "Emporteacionis alministrativas de páhinas con estorial d'edicionis d'otras güiquis.",
-       "import-logentry-upload": "á emporteau [[$1]] pol empuntu d'archivu",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|revisión|revisionis}}",
-       "import-logentry-interwiki": "trasgüiquipeau $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revisión|revisionis}} dendi $2",
        "tooltip-pt-userpage": "La mi páhina d'usuáriu",
        "tooltip-pt-anonuserpage": "La páhina d'usuáriu la IP dendi la qu'eita",
        "revdelete-unrestricted": "las restricionis a los çahorilis án siu esborrás",
        "rightsnone": "(dengunu)",
        "revdelete-summary": "eital sumáriu",
+       "searchsuggest-search": "Buscal",
        "expand_templates_preview": "Previsoreal"
 }
index 4e7fa12..9833b1f 100644 (file)
        "import-rootpage-nosubpage": "فضای نام  \"$1\" صفحهٔ مبنا اجازهٔ زیرصفحه نمی‌دهد.",
        "importlogpage": "سیاههٔ درون‌ریزی‌ها",
        "importlogpagetext": "درون‌ریزی صفحات به همراه تاریخچهٔ ویرایش آن‌ها از ویکی‌های دیگر.",
-       "import-logentry-upload": "[[$1]] را از طریق بارگذاری پرونده درون‌ریزی کرد",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|نسخه|نسخه}} واردشده",
-       "import-logentry-interwiki": "$1 را تراویکی کرد",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|نسخه|نسخه}} واردشده از $2",
        "javascripttest": "آزمایش جاوا اسکریپت",
        "javascripttest-pagetext-noframework": "این صفحه برای اجرای آزمایش‌های جاوا اسکریپت کنار گذاشته شده‌است.",
        "tags-create-warnings-below": "آیا مایل به ادامه ایجاد تگ هستید؟",
        "tags-delete-title": "حذف برچسب",
        "tags-delete-explanation-initial": "شما در حال حذف تگ «$1» از پایگاه داده هستید.",
+       "tags-delete-explanation-in-use": "این از {{PLURAL:$2|$2 ویرایش یا ورودی سیاهه|همهٔ $2 ویرایش و/یا ورودی سیاهه}} حذف خواهد شد با وجودی که الان تائید شده‌است.",
        "tags-delete-explanation-warning": "این عمل <strong>غیر قابل بازگشت</strong> است، حتی توسط مدیران پایگاه داده. مطمئن باشید که این همان تگی است که می‌خواهید آن‌را حذف کنید.",
        "tags-delete-explanation-active": "<strong>برچسب \"$1\" هنوز فعال است و در آینده اعمال خواهد شد.</strong> برای جلوگیری از این اتفاق، به قسمت(‌هایی) که برچسب فعال شده رفته و از آنجا غیرفعالش کنید.",
        "tags-delete-reason": "دلیل:",
        "log-name-managetags": "تاریخچه مدیریت تگ",
        "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 {{GENDER:$2|برچسب}} فعال شده \"$4\" برای کاربران و ربات‌ها",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|برچسب}} غیرفعال شده \"$4\" برای کاربران و ربات‌ها",
        "rightsnone": "(هیچ)",
index 8ab187f..5e7a0b6 100644 (file)
        "import-rootpage-nosubpage": "Annetun perussivun nimiavaruus \"$1\" ei salli alasivuja.",
        "importlogpage": "Tuontiloki",
        "importlogpagetext": "Loki ylläpitäjien toisista wikeistä tuomista sivuista, joissa on muokkaushistoriaa.",
-       "import-logentry-upload": "toi sivun [[$1]] tiedostomuodossa",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|versio|versiota}} tuotiin",
-       "import-logentry-interwiki": "toi toisesta wikistä sivun $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versio|versiota}} tuotiin wikistä $2",
        "javascripttest": "JavaScriptin testaus",
        "javascripttest-pagetext-noframework": "Tämä sivu on varattu JavaScript-testien suorittamiseen.",
        "tags-delete-title": "Hävitä merkkaus pysyvästi",
        "tags-delete-explanation-initial": "Olet parhaillaan poistamassa (eli tuhoamassa pysyvästi) merkkauksen \"$1\" tietokannasta.",
        "tags-delete-explanation-in-use": "Se poistuu {{PLURAL:$2|$2 sivun versiosta tai lokimerkinnästä|kaikista $2 sivuversiosta tai lokimerkinnöistä}}, joissa se tällä hetkellä on käytössä.",
-       "tags-delete-explanation-warning": "Tämä toimenpide on <strong>peruuttamaton</strong> ja <strong>poistettua ei merkkausta voida palauttaa takaisin</strong>. Siihen ei pysty edes tietokannan ylläpitohenkilöstö. Sinun pitää olla täysin varma, että haluat poistettavaksi juuri tämän merkkauksen.",
+       "tags-delete-explanation-warning": "Tämä toimenpide on <strong>peruuttamaton</strong> ja <strong>poistettua merkkausta ei voi palauttaa takaisin</strong>. Siihen ei pysty edes tietokannan ylläpitohenkilöstö. Sinun pitää olla täysin varma, että haluat poistettavaksi juuri tämän merkkauksen.",
        "tags-delete-explanation-active": "<stron>Merkkaus \"$1\" on edelleen käytössä ja sitä käytetään myös jatkossa.</strong>. Jos haluat merkkauksen pois käytöstä, mene sinne missä merkkaus on asetettu ja ota se pois siellä.",
        "tags-delete-reason": "Syy:",
        "tags-delete-submit": "Tuhoa tämä merkkaus peruuttamattomasti ja pysyvästi",
        "logentry-block-reblock": "$1 {{GENDER:$2|muutti}} eston asetuksia kohteessa {{GENDER:$4|$3}}. Eston kesto on $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|esti}} käyttäjän {{GENDER:$4|$3}}. Eston kesto on $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|muutti}} eston asetuksia kohteessa {{GENDER:$4|$3}}. Eston kesto on $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|toi}} kohteen $3 tiedostotallennuksella",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|toi}} kohteen $3 muusta wikistä",
        "logentry-merge-merge": "$1 {{GENDER:$2|yhdisti}} sivun $3 sivuun $4 (versiot $5 saakka)",
        "logentry-move-move": "$1 {{GENDER:$2|siirsi}} sivun $3 uudelle nimelle $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|siirsi}} sivun $3 uudelle nimelle $4 luomatta ohjausta",
index baf979f..cff297f 100644 (file)
                        "Nicolapps",
                        "Yzelf",
                        "0x010C",
-                       "Thibaut120094"
+                       "Thibaut120094",
+                       "NemesisIII"
                ]
        },
        "tog-underline": "Souligner les liens :",
        "unusedimages": "Fichiers orphelins",
        "wantedcategories": "Catégories les plus demandées",
        "wantedpages": "Pages les plus demandées",
+       "wantedpages-summary": "Liste des pages inexistantes ayant le plus de lien vers elles, en excluant les pages n’ayant que des redirections pointant vers elles. Pour avoir une liste des pages inexistantes qui ont des redirections pointant vers elles, voyez [[{{#special:BrokenRedirects}}]].",
        "wantedpages-badtitle": "Titre invalide dans les résultats : $1",
        "wantedfiles": "Fichiers les plus demandés",
        "wantedfiletext-cat": "Les fichiers suivants sont utilisés, mais n'existent pas localement. S'ils se trouvent sur un dépôt partagé, ils peuvent être listés ici, bien qu'ils soient, de fait, déjà disponibles. Tous ces faux positifs seront <del>barrés</del>. En outre, les pages qui intègrent des fichiers qui n'existent pas sont répertoriées dans [[:$1]].",
        "import-rootpage-nosubpage": "L'espace de noms « $1 » de la page racine n'autorise pas les sous-pages.",
        "importlogpage": "Journal des importations",
        "importlogpagetext": "Importations administratives de pages d'autres wikis, avec leur historique de modification.",
-       "import-logentry-upload": "a importé [[$1]] par envoi de fichier",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|révision importée|révisions importées}}",
-       "import-logentry-interwiki": "a importé $1 d'un wiki à l'autre",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|révision importée|révisions importées}} depuis $2",
        "javascripttest": "Test de JavaScript",
        "javascripttest-pagetext-noframework": "Cette page est réservée pour l'exécution des tests JavaScript.",
        "logentry-block-reblock": "$1 {{GENDER:$2|a modifié}} les paramètres de blocage pour {{GENDER:$4|$3}} $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|a bloqué}} {{GENDER:$4|$3}} $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|a modifié}} les paramètres de blocage pour {{GENDER:$4|$3}} $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|a importé}} $3 par téléchargement de fichier",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|a importé}} $3 depuis un autre wiki",
        "logentry-merge-merge": "$1 {{GENDER:$2|a fusionné}} $3 en $4 (révisions jusqu’à $5)",
        "logentry-move-move": "$1 {{GENDER:$2|a déplacé}} la page $3 vers $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|a déplacé}} la page $3 vers $4 sans laisser de redirection",
        "feedback-message": "Message :",
        "feedback-subject": "Objet :",
        "feedback-submit": "Envoyer",
-       "feedback-thanks": "Merci ! Votre commentaire a été publié sur la page \"[$2 $1]\".",
+       "feedback-terms": "Je comprends que les informations de mon agent utilisateur incluent des informations sur mon navigateur et ma version de système d’exploitation et qu’elles seront partagées publiquement avec mes commentaires.",
+       "feedback-termsofuse": "J’accepte de fournir un avis en accord avec les Conditions d’utilisation.",
+       "feedback-thanks": "Merci ! Votre commentaire a été publié sur la page « [$2 $1] ».",
        "feedback-thanks-title": "Merci !",
        "feedback-useragent": "Agent utilisateur :",
        "searchsuggest-search": "Rechercher",
index b7a935e..c530e1e 100644 (file)
        "enhancedrc-history": "Ferluup",
        "recentchanges": "Leetst feranrangen",
        "recentchanges-legend": "Iinstelangen för't uunwisin",
-       "recentchanges-summary": "Üüb detdiar sidj könst dü a leetst feranrangen faan't Nordfriisk Wikipedia ferfulge.",
+       "recentchanges-summary": "Üüb detdiar sidj könst dü a leetst feranrangen faan detheer Wiki-projekt ferfulge.",
        "recentchanges-noresult": "Uun di uunjiwen tidjrüm san sok feranrangen ei föörnimen wurden.",
-       "recentchanges-feed-description": "Mä didiar feed könst dü a leetst feranrangen faan't Nordfriisk Wikipedia ferfulge.",
+       "recentchanges-feed-description": "Mä didiar feed könst dü a leetst feranrangen faan detheer Wiki-projekt ferfulge.",
        "recentchanges-label-newpage": "Nei sidj uunlaanj",
        "recentchanges-label-minor": "Letj feranrang",
        "recentchanges-label-bot": "Feranrang faan en bot",
        "import-rootpage-nosubpage": "Uun di nöömrüm „$1“ jaft at nian onersidjen.",
        "importlogpage": "Import-logbuk",
        "importlogpagetext": "Administratiif import faan sidjen mä aal a werjuunen faan ööder Wikis.",
-       "import-logentry-upload": "„[[$1]]“ faan en datei importiaret",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|werjuun|werjuunen}} importiaret",
-       "import-logentry-interwiki": "„$1“ mä transwiki importiaret",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|werjuun|werjuunen}} faan $2 importiaret",
        "javascripttest": "JavaScript-test",
        "javascripttest-pagetext-noframework": "Detdiar sidj as för JavaScript-tests föörsen.",
index baf7648..e4d59a3 100644 (file)
        "import-rootpage-nosubpage": "Cha cheadaich an t-ainm-spàs \"$1\" aig an duilleag freumha fo-duilleagan.",
        "importlogpage": "Loga an ion-phortachaidh",
        "importlogpagetext": "Ion-phortachadh rianachd de dhuilleagan aig a bheil eachdraidh mhùthaidhean o uicidhean eile.",
-       "import-logentry-upload": "chaidh [[$1]] ion-phortachadh le luchdadh suas faidhle",
        "import-logentry-upload-detail": "Chaidh $1 {{PLURAL:$1|mhùthadh|mùthadh|mùthaidhean|mùthadh}} ion-phortachadh",
-       "import-logentry-interwiki": "air fhaighinn 'na thar-uicidh $1",
        "import-logentry-interwiki-detail": "Chaidh $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} ion-phortachadh o $2",
        "javascripttest": "Deuchainn air JavaScript",
        "javascripttest-pagetext-noframework": "Tha an duilleag seo glèidhte airson deuchainnean JavaScript a ruith.",
index 8eed518..f3bdf85 100644 (file)
        "import-rootpage-nosubpage": "O espazo de nomes \"$1\" da páxina raíz non permite as subpáxinas.",
        "importlogpage": "Rexistro de importacións",
        "importlogpagetext": "Importacións administrativas de páxinas procedentes doutros wikis xunto co seu historial de edicións.",
-       "import-logentry-upload": "importou \"[[$1]]\" mediante a carga dun ficheiro",
        "import-logentry-upload-detail": "{{PLURAL:$1|Importouse $1 revisión|Importáronse $1 revisións}}",
-       "import-logentry-interwiki": "importou \"$1\"",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|Importouse $1 revisión|Importáronse $1 revisións}} desde $2",
        "javascripttest": "Proba de JavaScript",
        "javascripttest-pagetext-noframework": "Esta páxina está reservada para executar probas do JavaScript.",
        "logentry-block-reblock": "$1 {{GENDER:$2|cambiou}} as configuracións do bloqueo de {{GENDER:$4|$3}} cunha caducidade de $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|bloqueou}} a {{GENDER:$4|$3}} cun tempo de duración de $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|cambiou}} as configuracións do bloqueo de {{GENDER:$4|$3}} cunha caducidade de $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|importou}} $3 por medio da carga de ficheiros",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|importou}} $3 dende outra wiki",
        "logentry-merge-merge": "$1 {{GENDER:$2|fusionou}} \"$3\" con \"$4\" (revisións ata o $5)",
        "logentry-move-move": "$1 {{GENDER:$2|moveu}} a páxina \"$3\" a \"$4\"",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|moveu}} a páxina \"$3\" a \"$4\" sen deixar unha redirección",
index fa50a36..5ae57bb 100644 (file)
        "protectlogtext": "להלן רשימה של שינויי ההגנה על דפים.\nראו גם את [[Special:ProtectedPages|רשימת הדפים המוגנים]] הנוכחית.",
        "protectedarticle": "הפעיל הגנה על הדף \"[[$1]]\"",
        "modifiedarticleprotection": "שינה את רמת ההגנה של הדף \"[[$1]]\"",
-       "unprotectedarticle": "ביטל את ההגנה על [[$1]]",
+       "unprotectedarticle": "ביטל את ההגנה על הדף \"[[$1]]\"",
        "movedarticleprotection": "העביר את הגדרות ההגנה מ\"[[$2]]\" ל\"[[$1]]\"",
        "protect-title": "שינוי רמת ההגנה של הדף \"$1\"",
        "protect-title-notallowed": "הצגת רמת ההגנה של הדף \"$1\"",
        "import-rootpage-nosubpage": "מרחב השם \"$1\" של דף הבסיס אינו מאפשר דפי־משנה.",
        "importlogpage": "יומן ייבוא",
        "importlogpagetext": "ייבוא מנהלי של דפים (כולל היסטוריית העריכות שלהם) מאתרי ויקי אחרים.",
-       "import-logentry-upload": "ייבא את [[$1]] באמצעות העלאת קובץ",
        "import-logentry-upload-detail": "{{PLURAL:$1|גרסה אחת יובאה|$1 גרסאות יובאו}}",
-       "import-logentry-interwiki": "ייבא את $1 בייבוא בין־אתרי",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|גרסה אחת של הדף $2 יובאה|$1 גרסאות של הדף $2 יובאו}}",
        "javascripttest": "בדיקת JavaScript",
        "javascripttest-pagetext-noframework": "דף זה שמור להרצת בדיקות JavaScript.",
        "logentry-block-reblock": "$1 {{GENDER:$2|שינה|שינתה}} את הגדרות החסימה של {{GENDER:$4|$3}} עם זמן פקיעה של $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|חסם|חסמה}} את {{GENDER:$4|$3}} עם זמן פקיעה של $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|שינה|שינתה}} את הגדרות החסימה של {{GENDER:$4|$3}} עם זמן פקיעה של $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|ייבא|ייבאה}} את $3 באמצעות העלאת קובץ",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|ייבא|ייבאה}} את $3 מאתר ויקי אחר",
        "logentry-merge-merge": "$1 {{GENDER:$2|מיזג|מיזגה}} את $3 לתוך $4 (גרסאות עד $5)",
        "logentry-move-move": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}}",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}} בלי להשאיר הפניה",
index fb8da8a..c9bbbaa 100644 (file)
@@ -57,7 +57,8 @@
                        "아라",
                        "संजीव कुमार",
                        "बिप्लब आनन्द",
-                       "Phoenix303"
+                       "Phoenix303",
+                       "Steinsplitter"
                ]
        },
        "tog-underline": "कड़ियाँ अधोरेखन:",
        "disclaimerpage": "Project:साधारण अस्वीकरण",
        "edithelp": "सम्पादन सहायता",
        "helppage-top-gethelp": "सहायता",
-       "mainpage": "मुखपृष्ठ",
-       "mainpage-description": "मुखपृष्ठ",
+       "mainpage": "'मुख्य पृष्ठ",
+       "mainpage-description": "मà¥\81à¤\96à¥\8dय à¤ªà¥\83षà¥\8dठ",
        "policy-url": "Project:नीति",
        "portal": "समाज मुखपृष्ठ",
        "portal-url": "Project:समाज मुखपृष्ठ",
        "readonly_lag": "उपमुख्य डाटाबेस सर्वर मुख्य डाटाबेस सर्वर के बराबर अद्यातानीत होने तक मुख्य डाटाबेस सर्वर लॉक हो गया है।",
        "internalerror": "आन्तरिक त्रुटि",
        "internalerror_info": "आन्तरिक त्रुटि: $1",
+       "internalerror-fatal-exception": "प्रकार की गंभीर अपवाद \"$1\"",
        "filecopyerror": "\"$1\" फ़ाइल की \"$2\" पर प्रतिलिपि नहीं बन पाई।",
        "filerenameerror": "\"$1\" फ़ाइल का नाम बदलकर \"$2\" नहीं रखा जा सका।",
        "filedeleteerror": "\"$1\" फ़ाइल को हटाया नहीं जा सका।",
        "anoneditwarning": "<strong>सावधान:</strong> आपने सत्रारंभ नहीं किया है। यदि आप सम्पादन करते हैं तो इस पृष्ठ के संपादन इतिहास में आपका आइ॰पी पता अंकित किया जाएगा। यदि आप <strong>[$1 लॉगिन]</strong> करते हैं अथवा <strong>[$2 खाता बनाते हैं]</strong> तो अन्य सुविधाओं के साथ-साथ आपके संपादनों का श्रेय आपके सदस्यनाम पर दिया जाएगा।",
        "anonpreviewwarning": "''आप लॉग्ड इन नहीं हैं। पृष्ठ सहेजने पर आपका आइ॰पी पता इस पृष्ठ के इतिहास में दर्ज किया जायेगा।''",
        "missingsummary": "'''अनुस्मारक:''' आपने संपादन सारांश नहीं दिया है।\nअगर आप दुबारा \"{{int:savearticle}}\" पर क्लिक करते हैं तो आपका संपादन बिना सारांश के संजोया जायेगा।",
+       "selfredirect": "<strong>चेतावनी:</strong> आप खुद को इस पेज पुनः निर्देशित कर रहे हैं।\nआप अनुप्रेषित के लिए गलत लक्ष्य निर्दिष्ट हो सकता है, या आप गलत पृष्ठ का संपादन किया जा सकता है।\nआप फिर से \"{{int:savearticle}}\" क्लिक करते हैं, रीडायरेक्ट वैसे भी बनाया जाएगा।",
        "missingcommenttext": "कृपया नीचे टिप्पणी दें।",
        "missingcommentheader": "'''अनुस्मारक:''' आपने इस टिप्पणी का कोई शीर्षक नहीं दिया है।\nअगर आप \"{{int:savearticle}}\" पर दोबारा क्लिक करते हैं तो आपके बदलाव बिना शीर्षक के संजोये जायेंगे।",
        "summary-preview": "सारांश की झलक:",
        "content-model-css": "सी॰एस॰एस",
        "content-json-empty-object": "रिक्त ऑब्जेक्ट",
        "content-json-empty-array": "रिक्त ऐरे",
+       "duplicate-args-category": "टेम्पलेट कॉल में डुप्लिकेट तर्क का उपयोग करते हुए पन्ने",
+       "duplicate-args-category-desc": "पेज जैसे तर्कों के डुप्लिकेट का उपयोग करने वाले टेम्पलेट कॉल, जैसे <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ओैर <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''चेतावनी:''' इस पृष्ठ पर बहुत अधिक संख्या में कीमती पार्सर फ़ंक्शनों का प्रयोग किया गया है।\n\nइनका प्रयोग $2 से कम बार होना चाहिये, इस समय प्रयोग $1 बार {{PLURAL:$1|है|हैं}}।",
        "expensive-parserfunction-category": "कीमती पार्सर फ़ंक्शनों का अत्यधिक प्रयोग कर रहे पृष्ठ",
        "post-expand-template-inclusion-warning": "'''चेतावनी:''' साँचे जुड़ने की सीमा पार हो चुकी है।\nकुछ साँचे नहीं जुड़ेंगे।",
        "logdelete-selected": "{{PLURAL:$1|चुना हुआ|चुने हुए}} लॉग इवेंट:",
        "revdelete-text-text": "हटाए गए अवतरण पृष्ठ इतिहास में दर्शाए जाएँगे परन्तु उनकी सामग्री सार्वजनिक रूप से नहीं देखी जा सकेगी।",
        "revdelete-text-file": "हटाए गए फ़ाइल अवतरण फ़ाइल इतिहास में दर्शाए जायेंगे परन्तु सामग्री सार्वजनिक रूप से नहीं देखी जा सकेगी।",
+       "logdelete-text": "हटाए गए प्रवेश घटनाओं अभी भी लॉग में दिखाई देंगे, लेकिन उनकी सामग्री के कुछ हिस्सों को सार्वजनिक करने के लिए दुर्गम हो जाएगा।",
+       "revdelete-text-others": "अन्य प्रशासकों अभी भी छिपा सामग्री का उपयोग करने के लिए और अतिरिक्त प्रतिबंध सेट कर रहे हैं, जब तक यह अ-नष्ट करने में सक्षम हो जाएगा।",
        "revdelete-confirm": "पुष्टि करें कि आप यह कार्य करना चाहते हैं, आप इसका परिणाम समझते हैं, और आप ये [[{{MediaWiki:Policy-url}}|नीति]] के अनुसार कर रहे हैं।",
        "revdelete-suppress-text": "छिपाने का प्रयोग <strong>केवल</strong> इन परिस्थितियों में होना चाहिए:\n* संभावित अपमानजनक जानकारी\n* अनुपयुक्त निजी जानकारी\n*: <em>घर के पते व दूरभाष, राष्ट्रीय पहचान क्रमांक आदि।</em>",
        "revdelete-legend": "दृश्य प्रतिबंध निश्चित करें",
        "prefs-watchlist": "ध्यानसूची",
        "prefs-editwatchlist": "ध्यानसूची सम्पादित करें",
        "prefs-editwatchlist-label": "अपनी ध्यानसूची की प्रविष्टियाँ सम्पादित करें:",
+       "prefs-editwatchlist-edit": "देखें और अपनी वॉचलिस्ट पर खिताब को दूर।",
+       "prefs-editwatchlist-raw": "कच्ची ध्यानसूची बदलें",
+       "prefs-editwatchlist-clear": "अपनी ध्यानसूची साफ करे",
        "prefs-watchlist-days": "ध्यानसूची में दिखाने के दिन:",
        "prefs-watchlist-days-max": "अधिकतम $1 {{PLURAL:$1|दिन}}",
        "prefs-watchlist-edits": "बढ़ाई हुई ध्यानसूची में दिखाने हेतु अधिकतम बदलाव:",
        "right-browsearchive": "हटाए गए पृष्ठ खोजें",
        "right-undelete": "पृष्ठ पुनर्स्थापित करें",
        "right-suppressrevision": "किसी भी सदस्य से छुपे हुए अवतरण देखें, छुपायें और पुनर्स्थापित करें",
+       "right-viewsuppressed": "देखें संशोधन किसी भी उपयोगकर्ता से छुपा।",
        "right-suppressionlog": "खासगी लॉग देखें",
        "right-block": "अन्य सदस्यों को सम्पादन करने से ब्लॉक करें",
        "right-blockemail": "सदस्यों को ई-मेल भेजने से ब्लॉक करें",
        "right-protect": "सुरक्षा स्तर बदलें और सीढ़ी-सुरक्षित पृष्ठ सम्पादित करें",
        "right-editprotected": "उन सुरक्षित पृष्ठ सम्पादित करें जिनके सम्पादन की \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "उन पृष्ठों को सम्पादित करें जिनका सुरक्षा स्तर है \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "एक पेज की सामग्री मॉडल को संपादित।",
        "right-editinterface": "सॉफ़्टवेयर इंटरफ़ेस सम्पादित करें",
        "right-editusercssjs": "अन्य सदस्यों के सी॰एस॰एस और जावास्क्रिप्ट पृष्ठ सम्पादित करें",
        "right-editusercss": "अन्य सदस्यों के सी॰एस॰एस पृष्ठ सम्पादित करें",
        "right-override-export-depth": "पृष्ठ निर्यात करें, पाँच स्तर की गहराई तक जुड़े हुए पृष्ठों समेत",
        "right-sendemail": "अन्य सदस्यों को ई-मेल भेजें",
        "right-passwordreset": "कूटशब्द रीसेट ई-मेल देखें",
+       "right-managechangetags": "डेटाबेस से [[Special:Tags|चिप्पियाँ]] बनायें और हटायें",
        "newuserlogpage": "सदस्य खाता निर्माण लॉग",
        "newuserlogpagetext": "यह सदस्य खातों के निर्माण का लॉग है।",
        "rightslog": "सदस्य अधिकार लॉग",
        "action-viewmywatchlist": "अपनी ध्यानसूची देखने",
        "action-viewmyprivateinfo": "अपनी व्यक्तिगत जानकारी देखने",
        "action-editmyprivateinfo": "अपनी व्यक्तिगत जानकारी बदलने",
+       "action-editcontentmodel": "एक पेज की सामग्री मॉडल को संपादित।",
+       "action-managechangetags": "डेटाबेस से चिप्पि बनायें और हटायें",
        "nchanges": "$1 {{PLURAL:$1|बदलाव}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|अंतिम बार देखने के बाद से}}",
        "enhancedrc-history": "इतिहास",
        "download": "डाउनलोड",
        "unwatchedpages": "ध्यान न दिये हुए पृष्ठ",
        "listredirects": "पुनर्निर्देशनों की सूची",
+       "listduplicatedfiles": "डुप्लिकेट के साथ फाइलों की सूची।",
        "unusedtemplates": "अप्रयुक्त साँचे",
        "unusedtemplatestext": "इस पृष्ठ पर {{ns:template}} नामस्थान वाले वे सभी पृष्ठ इंगित है जो किसी अन्य पृष्ठ में शामिल नहीं हैं।\nइन्हें हटाने के पहले इन साँचों की और कड़ियाँ जाँच लें।",
        "unusedtemplateswlh": "अन्य कड़ियाँ",
        "randomincategory-invalidcategory": "\"$1\" एक मान्य श्रेणी नाम नहीं है।",
        "randomincategory-nopages": "[[:Category:$1|$1]] श्रेणी में कोई पृष्ठ नहीं हैं।",
        "randomincategory-category": "श्रेणी:",
+       "randomincategory-legend": "श्रेणी में यादृच्छिक पृष्ठ",
        "randomredirect": "किसी एक पुनर्निर्देशन पर जाएँ",
        "randomredirect-nopages": "नामस्थान \"$1\" में कोई पुनर्निर्देशन नहीं हैं।",
        "statistics": "आँकड़े",
        "listgrouprights-addgroup-self-all": "अपने खाते में सभी समूह शामिल करें",
        "listgrouprights-removegroup-self-all": "अपने खाते से सभी समूह हटाएँ",
        "listgrouprights-namespaceprotection-namespace": "नामस्थान",
+       "trackingcategories": "चिह्नित श्रेणियाँ",
+       "trackingcategories-msg": "चिह्नित श्रेणी",
+       "trackingcategories-name": "संदेश नाम",
+       "trackingcategories-desc": "श्रेणी शामिल किए जाने के मानदंड",
        "trackingcategories-nodesc": "कोई वर्णन उपलब्ध नहीं।",
        "mailnologin": "पाने वाले का एड्रेस दिया नहीं",
        "mailnologintext": "अन्य सदस्यों को इ-मेल भेजने के लिये [[Special:UserLogin|लॉग इन]] करना आवश्यक है और आपकी [[Special:Preferences|वरीयताओं]] में वैध ई-मेल पता होना आवश्यक है।",
        "protect-othertime": "अन्य समय:",
        "protect-othertime-op": "अन्य समय",
        "protect-existing-expiry": "मौजूदा सुरक्षा सम्पात होने का समय: $3, $2",
+       "protect-existing-expiry-infinity": "मौजुदा समाप्ति समय: अनंत",
        "protect-otherreason": "अन्य/अतिरिक्त कारण:",
        "protect-otherreason-op": "अन्य कारण",
        "protect-dropdown": "*सुरक्षा के आम कारण\n**अत्यधिक बर्बरता \n**अत्यधिक स्पैम\n**अफलदायी सम्पादन युद्ध\n**अधिक यातायात वाला पृष्ठ",
        "thumbnail_image-missing": "लगता है संचिका नामौजूद है: $1",
        "import": "पृष्ठ इम्पोर्ट करें",
        "importinterwiki": "ट्रान्सविकि आयात",
-       "import-interwiki-text": "आयात करने के लिये एक विकि और एक पृष्ठ चुनें।\nअवतरण दिनांक और संपादक नाम ज्यों-के-त्यों रखे जाएँगे।\nसभी ट्रान्सविकि आयात क्रियाएँ [[Special:Log/import|आयात लॉग]] में डाली जाती हैं।",
+       "import-interwiki-text": "आयात करने के लिये एक विकि और एक पृष्ठ चुनें।\nअवतरण दिनांक और संपादक नाम ज्यों-के-त्यों रखे जाएँगे।\nअन्य विकि से सभी आयात [[Special:Log/import|आयात लॉग]] में डाली जाती हैं।",
+       "import-interwiki-sourcewiki": "स्रोत विकि:",
+       "import-interwiki-sourcepage": "स्रोत पृष्ठ:",
        "import-interwiki-history": "इस पृष्ठ के सभी इतिहास अवतरण कॉपी करें",
        "import-interwiki-templates": "सभी साँचे शामिल करें",
        "import-interwiki-submit": "आयात",
        "import-rootpage-nosubpage": "दिए गए उपसर्ग पृष्ठ \"$1\" के नामस्थान में उप-पृष्ठ नहीं बनाए जा सकते।",
        "importlogpage": "आयात सूची",
        "importlogpagetext": "अन्य विकियों से प्रबन्धकों द्वारा किए गए सम्पादन इतिहास के साथ होने वाले पृष्ठों का आयात।",
-       "import-logentry-upload": "सञ्चिका अपलोड करके [[$1]] का आयात किया",
        "import-logentry-upload-detail": "$1 अवतरण आयात {{PLURAL:$1|किया गया|किये गए}}",
-       "import-logentry-interwiki": "ट्रान्सविकि कर दिया $1",
        "import-logentry-interwiki-detail": "$2 से $1 अवतरण आयात {{PLURAL:$1|किया गया|किये गए}}",
        "javascripttest": "जावास्क्रिप्ट परीक्षण",
        "javascripttest-pagetext-noframework": "यह पृष्ठ जावास्क्रिप्ट परीक्षण चलाने के लिए है।",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1शीर्षक|$1 शीर्षक}} हटा दिये:",
        "watchlistedit-clear-title": "ध्यानसूची खाली की",
        "watchlistedit-clear-legend": "ध्यानसूची खाली करें",
-       "watchlistedit-clear-explain": "आपकी ध्यानसूची से सभी पृष्ठ हटाये जायेंगे",
-       "watchlistedit-clear-titles": "शà¥\80रà¥\8dषà¤\95:",
+       "watchlistedit-clear-explain": "आपकी ध्यानसूची से सभी पृष्ठ हटा दिये जायेंगे",
+       "watchlistedit-clear-titles": "à¤\96िताब:",
        "watchlistedit-clear-done": "आपकी ध्यानसूची खाली कर दी गयी है।",
        "watchlistedit-clear-removed": "$1 पृष्ठ{{PLURAL:$1|हटाया गया|हटाये गए}}:",
        "watchlistedit-too-many": "यहाँ दर्शाने के लिए अत्यधिक पृष्ठ हैं।",
        "version-software": "इन्स्टॉल की हुई प्रणाली",
        "version-software-product": "प्रोडक्ट",
        "version-software-version": "अवतरण",
+       "version-entrypoints": "प्रवेश बिंदु यू॰आर॰एल",
+       "version-entrypoints-header-entrypoint": "प्रवेश बिंदु",
        "version-entrypoints-header-url": "यू॰आर॰एल",
+       "version-libraries": "स्थापित लाइब्रेरी",
        "version-libraries-library": "लाइब्रेरी",
        "version-libraries-version": "संस्करण",
        "redirect-legend": "फ़ाइल अथवा पृष्ठ को पुनर्प्रेषण",
        "redirect-page": "पृष्ठ आइ॰डी",
        "redirect-revision": "पृष्ठ अवतरण संख्या",
        "redirect-file": "फ़ाइल नाम",
+       "redirect-not-exists": "यह मान प्राप्त नहीं हुआ",
        "fileduplicatesearch": "फ़ाईल द्विरावृत्ति खोजें",
        "fileduplicatesearch-summary": "हैश वैल्यू के अनुसार फ़ाईल की द्विरावृत्ति खोजें।",
        "fileduplicatesearch-legend": "द्विरावृत्ति के लिये खोजें",
        "tags-source-header": "स्रोत",
        "tags-active-header": "सक्रिय?",
        "tags-hitcount-header": "चिप्पी वाले बदलाव",
+       "tags-actions-header": "क्रियाएं",
        "tags-active-yes": "हाँ",
        "tags-active-no": "नहीं",
        "tags-source-extension": "एक्सटेंशन द्वारा परिभाषित",
+       "tags-source-manual": "उपयोगकर्ताओं और बॉट द्वारा नियमानुसार लागू",
+       "tags-source-none": "अब प्रयोग में नहीं",
        "tags-edit": "सम्पादन",
        "tags-delete": "हटाएँ",
+       "tags-activate": "सक्रिय करें",
+       "tags-deactivate": "निष्क्रिय करें",
        "tags-hitcount": "$1 {{PLURAL:$1|बदलाव|बदलाव}}",
+       "tags-create-tag-name": "चिप्पी का नाम",
+       "tags-create-reason": "कारण:",
+       "tags-create-submit": "बनाएँ",
+       "tags-create-no-name": "आपको एक चिप्पि का नाम निर्दिष्ट करना चाहिए।",
+       "tags-delete-title": "चिप्पि हटायें",
+       "tags-delete-reason": "कारण:",
+       "tags-activate-submit": "सक्रिय करें",
+       "tags-deactivate-reason": "कारण:",
+       "tags-deactivate-submit": "निष्क्रिय करें",
        "comparepages": "पृष्ठों की तुलना करें",
        "compare-page1": "पृष्ठ १",
        "compare-page2": "पृष्ठ २",
        "htmlform-no": "नहीं",
        "htmlform-yes": "हाँ",
        "htmlform-chosen-placeholder": "एक विकल्प चुनें",
+       "htmlform-cloner-create": "अधिक जोड़ें",
        "htmlform-cloner-delete": "हटाएँ",
        "sqlite-has-fts": "$1 पूर्ण पाठ खोज समर्थन के साथ",
        "sqlite-no-fts": "$1पूर्ण-पाठ खोज समर्थन के बिना",
index 95900f2..7fb5118 100644 (file)
        "eauthentsent": "Egy ellenőrző e-mailt küldtünk a megadott címre. Mielőtt más leveleket kaphatnál, igazolnod kell az e-mailben írt utasításoknak megfelelően, hogy valóban a tiéd a megadott cím.",
        "throttled-mailpassword": "Már elküldtünk egy jelszóemlékeztetőt az utóbbi {{PLURAL:$1|egy|$1}} órában.\nA visszaélések elkerülése végett {{PLURAL:$1|egy|$1}} óránként csak egy jelszó-emlékeztetőt küldünk.",
        "mailerror": "Hiba történt az e-mail küldése közben: $1",
-       "acct_creation_throttle_hit": "A wiki látogatói ezt az IP-címet használva {{PLURAL:$1|egy|$1}} fiókot hoztak létre az elmúlt egy nap alatt . Ez a megengedett maximum ezen időtartam alatt, így az erről a címről látogatók jelenleg nem hozhatnak létre újabb fiókokat.",
-       "emailauthenticated": "Az e-mail címedet $2 $3-kor erősítetted meg.",
+       "acct_creation_throttle_hit": "A wiki látogatói ezt az IP-címet használva $1 fiókot hoztak létre az elmúlt egy nap alatt. Ez a megengedett maximum ezen időtartam alatt, így az erről a címről látogatók jelenleg nem hozhatnak létre újabb fiókokat.",
+       "emailauthenticated": "Az e-mail címedet $2, $3-kor erősítetted meg.",
        "emailnotauthenticated": "Az e-mail címed még <strong>nincs megerősítve</strong>. E-mailek küldése és fogadása nem engedélyezett.",
        "noemailprefs": "Az alábbi funkciók használatához meg kell adnod az e-mail címedet.",
        "emailconfirmlink": "E-mail cím megerősítése",
        "speciallogtitlelabel": "Cél (cím vagy felhasználó):",
        "log": "Rendszernaplók",
        "all-logs-page": "Minden nyilvános napló",
-       "alllogstext": "A(z) {{SITENAME}} naplóinak összesített listája.\nA napló típusának, a szerkesztő nevének (kis- és nagybetűérzékeny), vagy az érintett lap kiválasztásával (ez is kis- és nagybetűérzékeny) szűkítheted a találatok listáját.",
+       "alllogstext": "A(z) {{SITENAME}} naplóinak összesített listája.\nA naplótípus, a felhasználónév (kis- és nagybetűérzékeny) vagy az érintett lap kiválasztásával (ez is kis- és nagybetűérzékeny) szűkítheted a találatok listáját.",
        "logempty": "Nincs illeszkedő naplóbejegyzés.",
        "log-title-wildcard": "Így kezdődő címek keresése",
        "showhideselectedlogentries": "Kijelölt napló bejegyzések megjelenítése/elrejtése",
        "listgrouprights-namespaceprotection-header": "Névtér korlátozások",
        "listgrouprights-namespaceprotection-namespace": "Névtér",
        "listgrouprights-namespaceprotection-restrictedto": "A szerkesztéshez szükséges jogosultság(ok)",
+       "trackingcategories": "Nyomkövető kategóriák",
+       "trackingcategories-msg": "Nyomkövető kategória",
        "trackingcategories-name": "Üzenetnév",
        "trackingcategories-nodesc": "Nem található leírás.",
        "trackingcategories-disabled": "A kategória le van tiltva",
        "mailnologin": "Nincs feladó",
-       "mailnologintext": "Ahhoz hogy másoknak e-mailt küldhess, [[Special:UserLogin|be kell jelentkezned]] és meg kell adnod egy érvényes e-mail címet a [[Special:Preferences|beállításaidban]].",
+       "mailnologintext": "Ahhoz, hogy másoknak e-mailt küldhess, [[Special:UserLogin|be kell jelentkezned]] és meg kell adnod egy érvényes e-mail címet a [[Special:Preferences|beállításaidban]].",
        "emailuser": "E-mail küldése ezen szerkesztőnek",
        "emailuser-title-target": "E-mail küldése ennek a felhasználónak: $1",
        "emailuser-title-notarget": "E-mail küldése a felhasználónak",
        "blocklog-showsuppresslog": "Ez a felhasználó korábban blokkot kapott, és a naplóbejegyzés el lett rejtve. Az elrejtési napló alább látható tájékoztatásként:",
        "blocklogentry": "„[[$1]]” blokkolva $2 időtartamra $3",
        "reblock-logentry": "megváltoztatta [[$1]] blokkjának beállításait, a blokk lejárta: $2 $3",
-       "blocklogtext": "Ez a felhasználókra helyezett blokkoknak és azok feloldásának listája. Az automatikus blokkolt IP címek nem szerepelnek a listában. Lásd még [[Special:BlockList|a jelenleg életben lévő blokkok listáját]].",
+       "blocklogtext": "Ez a felhasználókra helyezett blokkoknak és azok feloldásának listája. Az automatikusan blokkolt IP-címek nem szerepelnek a listában. Lásd még [[Special:BlockList|a jelenleg életben lévő blokkok listáját]].",
        "unblocklogentry": "„$1” blokkolása feloldva",
        "block-log-flags-anononly": "csak anonok",
        "block-log-flags-nocreate": "nem hozhat létre új fiókot",
        "import-options-wrong": "Rossz {{PLURAL:$2|opció|opciók}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "A megadott gyökér oldal címe érvénytelen.",
        "import-rootpage-nosubpage": "A(z) \"$1\" névtér nem engedi meg aloldalak használatát.",
-       "importlogpage": "Importnapló",
+       "importlogpage": "Importálási napló",
        "importlogpagetext": "Lapok szerkesztési előzményekkel történő adminisztratív imporálása más wikikből.",
-       "import-logentry-upload": "[[$1]] importálása fájlfeltöltéssel kész",
        "import-logentry-upload-detail": "$1 változat importálva",
-       "import-logentry-interwiki": "$1 más wikiből áthozva",
        "import-logentry-interwiki-detail": "$1 változat innen: $2",
        "javascripttest": "JavaScript tesztelés",
        "javascripttest-pagetext-noframework": "Ez az oldal JavaStript tesztek futtatására van fenntartva.",
        "confirmemail_sent": "Kaptál egy e-mailt, melyben megtalálod a megerősítéshez szükséges kódot.",
        "confirmemail_oncreate": "A megerősítő kódot elküldtük az e-mail címedre.\nEz a kód nem szükséges a belépéshez, de meg kell adnod,\nmielőtt a wiki e-mail alapú szolgáltatásait igénybe veheted.",
        "confirmemail_sendfailed": "Nem sikerült elküldeni a megerősítő e-mailt.\nEllenőrizd, hogy nem írtál-e érvénytelen karaktert a címbe.\n\nA levelező üzenete: $1",
-       "confirmemail_invalid": "Nem megfelelő kód. A kódnak lehet, hogy lejárt a felhasználhatósági ideje.",
-       "confirmemail_needlogin": "Meg kell $1 erősíteni az e-mail címedet.",
+       "confirmemail_invalid": "Nem megfelelő kód.\nLehet, hogy a kód felhasználhatósági ideje lejárt.",
+       "confirmemail_needlogin": "{{ucfirst:$1}} az e-mail címed megerősítéséhez.",
        "confirmemail_success": "Az e-mail címed megerősítve. Most már beléphetsz a wikibe.",
        "confirmemail_loggedin": "E-mail címed megerősítve.",
        "confirmemail_subject": "{{SITENAME}} e-mail cím megerősítés",
        "watchlistedit-raw-done": "A figyelőlistád változtatásait elmentettem.",
        "watchlistedit-raw-added": "A {{PLURAL:$1|következő|következő $1}} cikket hozzáadtam a figyelőlistádhoz:",
        "watchlistedit-raw-removed": "A {{PLURAL:$1|következő|következő $1}} cikket eltávolítottam a figyelőlistádról:",
+       "watchlistedit-clear-title": "A figyelőlista kiürítése",
+       "watchlistedit-clear-legend": "Figyelőlista kiürítése",
+       "watchlistedit-clear-explain": "Minden cím el lesz távolítva a figyelőlistádról",
+       "watchlistedit-clear-submit": "Figyelőlista kiürítése (Ez végleges!)",
        "watchlisttools-clear": "A figyelőlista kiürítése",
        "watchlisttools-view": "Kapcsolódó változtatások",
        "watchlisttools-edit": "A figyelőlista megtekintése és szerkesztése",
index fe0e5ae..d5d575f 100644 (file)
        "import-upload": "Բեռնված է XML-ի դատան",
        "importlogpage": "Ներմուծման տեղեկամատյան",
        "importlogpagetext": "Ադմինիստրատորների կողմից այլ վիքիներից իրենց պատմությունների հետ էջերի ներմուծումներ։",
-       "import-logentry-upload": "ներմուծվել է «[[$1]]» նիշքի բեռնումով",
        "import-logentry-upload-detail": "$1 տարբերակ",
-       "import-logentry-interwiki": "«$1»՝ միջվիքի ներմուծմամբ",
        "import-logentry-interwiki-detail": "$1 տարբերակ $2-ից",
        "tooltip-pt-userpage": "Ձեր մասնակցի էջը",
        "tooltip-pt-anonuserpage": "Ձեր IP-հասցեի մասնակցային էջը",
index a2ac33e..9738363 100644 (file)
        "action-viewmyprivateinfo": "vider le proprie information private",
        "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",
        "nchanges": "$1 {{PLURAL:$1|modification|modificationes}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde le ultime visita}}",
        "enhancedrc-history": "historia",
        "thumbnail_image-missing": "le file pare mancar: $1",
        "thumbnail_image-failure-limit": "Il ha habite recentemente troppo de tentativas fallite ($1 o plus) de generar iste miniatura. Per favor reproba plus tarde.",
        "import": "Importar paginas",
-       "importinterwiki": "Importation transwiki",
+       "importinterwiki": "Importar ab un altere wiki",
        "import-interwiki-text": "Selige le wiki e le titulo del pagina a importar.\nLe datas del versiones e nomines del contributores essera preservate.\nTote le actiones de importation transwiki se registra in le [[Special:Log/import|registro de importationes]].",
        "import-interwiki-sourcewiki": "Wiki de origine:",
        "import-interwiki-sourcepage": "Pagina de origine:",
        "import-rootpage-nosubpage": "Le spatio de nomines \"$1\" del pagina radice non permitte subpaginas.",
        "importlogpage": "Registro de importationes",
        "importlogpagetext": "Importationes administrative de paginas con historia de modificationes desde altere wikis.",
-       "import-logentry-upload": "importava [[$1]] per incargamento de file",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|version|versiones}} importate",
-       "import-logentry-interwiki": "importava $1 transwiki",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|version|versiones}} importate desde $2",
        "javascripttest": "Test de JavaScript",
        "javascripttest-pagetext-noframework": "Iste pagina es reservate pro le execution de tests de JavaScript.",
index 8bd80fe..940e34b 100644 (file)
@@ -34,6 +34,7 @@
        "tog-watchdefault": "Bæta síðum og skrám sem ég breyti á vaktlistann minn",
        "tog-watchmoves": "Bæta síðum og skrám sem ég færi á vaktlistann minn",
        "tog-watchdeletion": "Bæta síðum og skrám sem ég eyði á vaktlistann minn",
+       "tog-watchrollback": "Bæta síðum þar sem ég hef tekið aftur breytingu á vaktlistann minn",
        "tog-minordefault": "Merkja allar breytingar sem minniháttar sjálfgefið",
        "tog-previewontop": "Sýna forskoðun á undan breytingarkassanum",
        "tog-previewonfirst": "Sýna forskoðun með fyrstu breytingu",
@@ -44,7 +45,7 @@
        "tog-shownumberswatching": "Sýna fjölda vaktandi notenda",
        "tog-oldsig": "Núverandi undirskrift:",
        "tog-fancysig": "Meðhöndla undirskrift sem wikimál (án sjálfvirks tengils)",
-       "tog-uselivepreview": "Nota beina forskoðun (Á tilraunastigi)",
+       "tog-uselivepreview": "Nota beina forskoðun",
        "tog-forceeditsummary": "Birta áminningu þegar breytingarágripið er tómt",
        "tog-watchlisthideown": "Ekki sýna mínar breytingar á vaktlistanum",
        "tog-watchlisthidebots": "Ekki sýna breytingar vélmenna á vaktlistanum",
        "import-rootpage-nosubpage": "Nafnrými „$1“ móðursíðunnar leyfir ekki undirsíður.",
        "importlogpage": "Innflutningsskrá",
        "importlogpagetext": "Hér er listi yfir innflutninga möppdýra á síðum ásamt breytingarskránni frá öðrum wiki.",
-       "import-logentry-upload": "flutti inn [[$1]] frá skrá",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|breyting flutt|breytingar fluttar}} inn",
-       "import-logentry-interwiki": "flutti inn $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|breyting flutt|breytingar fluttar}} inn frá $2",
        "javascripttest": "JavaScript prófun",
        "javascripttest-pagetext-noframework": "Þessi síða er frátekin fyrir JavaScript prófanir.",
index 4e889f4..e49bade 100644 (file)
        "import-rootpage-nosubpage": "Il namespace \"$1\" della pagina principale non permette di avere sottopagine.",
        "importlogpage": "Importazioni",
        "importlogpagetext": "Di seguito sono elencate le importazioni di pagine provenienti da altre wiki, complete di cronologia.",
-       "import-logentry-upload": "ha importato [[$1]] tramite upload",
        "import-logentry-upload-detail": "{{PLURAL:$1|una versione importata|$1 versioni importate}}",
-       "import-logentry-interwiki": "ha trasferito da altra wiki la pagina $1",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|una versione importata|$1 versioni importate}} da $2",
        "javascripttest": "Sperimentazione JavaScript",
        "javascripttest-pagetext-noframework": "Questa pagina è riservata all'esecuzione di test di JavaScript.",
        "logentry-block-reblock": "$1 {{GENDER:$2|ha modificato}} le impostazioni del blocco per {{GENDER:$4|$3}} con una scadenza di $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|ha bloccato}} {{GENDER:$4|$3}} con una scadenza di $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|ha modificato}} le impostazioni del blocco per {{GENDER:$4|$3}} con una scadenza di $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|ha importato}} $3 tramite caricamento",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|ha importato}} $3 da un'altra wiki",
        "logentry-merge-merge": "$1 {{GENDER:$2|ha unito}} $3 in $4 (versioni fino al $5)",
        "logentry-move-move": "$1 {{GENDER:$2|ha spostato}} la pagina $3 a $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|ha spostato}} la pagina $3 a $4 senza lasciare redirect",
index e537209..c6701c1 100644 (file)
        "import-rootpage-nosubpage": "ルートページの名前空間「$1」では、下位ページが許可されていません。",
        "importlogpage": "取り込み記録",
        "importlogpagetext": "管理された他のウィキから編集履歴を伴ったページ取り込みです。",
-       "import-logentry-upload": "ファイルのアップロードにより[[$1]]を取り込みました",
        "import-logentry-upload-detail": "$1{{PLURAL:$1|版}} をインポートしました",
-       "import-logentry-interwiki": "$1をウィキ間移動しました",
        "import-logentry-interwiki-detail": "$2からインポート済みの$1{{PLURAL:$1|版}}",
        "javascripttest": "JavaScript をテスト中",
        "javascripttest-pagetext-noframework": "このページは JavaScript のテストを実行するために予約されています。",
        "tags-create-warnings-below": "このタグの作成を続けますか?",
        "tags-delete-title": "タグを削除",
        "tags-delete-explanation-initial": "あなたはタグ「$1」をデータベースから削除しようとしています。",
+       "tags-delete-explanation-warning": "この操作は<strong>元に戻せず</strong>、データベース管理者をもってしても<strong>取り消しは不可能</strong>です。削除するタグとして間違いがないことをもう一度しっかり確認してください。",
+       "tags-delete-explanation-active": "<strong>タグ「$1」はまだ有効であり、今後も付与され続けます。</strong>これを止めるには、タグが付与されるよう設定されているところに行き、そこで無効化してください。",
        "tags-delete-reason": "理由:",
+       "tags-delete-submit": "タグを削除する(取り消し不可)",
+       "tags-delete-not-allowed": "拡張機能によって定義されているタグは削除できません(ただし拡張機能が明示的に削除を許可している場合を除く)。",
+       "tags-delete-not-found": "タグ「$1」は存在しません。",
+       "tags-delete-too-many-uses": "タグ「$1」は少なくとも$2版に付与されており、削除できません。",
+       "tags-delete-warnings-after-delete": "タグ「$1」の削除に成功しましたが、以下の{{PLURAL:$2|警告}}が発生しました:",
+       "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": "無効化",
        "comparepages": "ページの比較",
        "compare-page1": "ページ 1",
        "logentry-upload-upload": "$1 が $3 を {{GENDER:$2|アップロードしました}}",
        "logentry-upload-overwrite": "$1 が $3 の新しいバージョンを {{GENDER:$2|アップロードしました}}",
        "logentry-upload-revert": "$1 が $3 を {{GENDER:$2|アップロードしました}}",
+       "log-name-managetags": "タグ管理記録",
+       "log-description-managetags": "このページは[[Special:Tags|タグ]]に関係する管理タスクをリストアップしています。ログには管理者によって手動で実行された操作の記録しか記載されていません。ウィキ・ソフトウェアによって、ログを残さずにタグが作成・削除されている場合があります。",
        "rightsnone": "(なし)",
        "revdelete-summary": "編集内容の要約",
        "feedback-adding": "ページへのフィードバックの追加...",
        "feedback-message": "メッセージ:",
        "feedback-subject": "件名:",
        "feedback-submit": "送信",
+       "feedback-terms": "私のユーザーエージェント情報には、使用ブラウザやオペレーティングシステムのバージョンの情報が含まれており、その情報は私が提供するフィードバックとあわせて公開されることを理解しました。",
+       "feedback-termsofuse": "利用規約に従い、フィードバックを提供することに同意します。",
        "feedback-thanks": "ありがとうございます。フィードバックを「[$2 $1]」のページに投稿しました。",
        "feedback-thanks-title": "ありがとうございます!",
        "feedback-useragent": "ユーザーエージェント:",
index 28598a1..3c5f492 100644 (file)
@@ -38,6 +38,7 @@
        "tog-watchdefault": "დაამატე ჩემი კონტროლის სიას ჩემს მიერ რედაქტირებული გვერდები და ფაილები",
        "tog-watchmoves": "ჩასვი გვერდები და ფაილები, რომლებიც მე გადამაქვს, ჩემს კონტროლის სიაში",
        "tog-watchdeletion": "ჩასვი გვერდები და ფაილები, რომლებსაც მე ვშლი, ჩემს კონტროლის სიაში",
+       "tog-watchrollback": "დაამატე ჩემი კონტროლის სიას გვერდები, სადაც მე სწრაფი გაუქმება განვახორციელე",
        "tog-minordefault": "ყველა რედაქტირების მონიშვნა, როგორც უმნიშვნელო, უპირობოდ",
        "tog-previewontop": "წინასწარი გადახედვის ჩვენება რედაქტირების დაფამდე",
        "tog-previewonfirst": "წინასწარი ჩვენება პირველივე რედაქტირებაზე",
        "changeemail-password": "თქვენი პაროლი პროექტში {{SITENAME}}:",
        "changeemail-submit": "ელ-ფოსტის შეცვლა",
        "changeemail-throttled": "თქვენ უკვე ძალიან ბევრჯერ სცადეთ შესვლა.\nგთხოვთ, მოიცადოთ $1, სანამ კიდევ სცდიდეთ.",
+       "resettokens": "ტოკენების ჩამოყრა",
+       "resettokens-legend": "ტოკენების ჩამოყრა",
        "resettokens-tokens": "ჟეტონები:",
        "resettokens-token-label": "$1 (მიმდინარე მნიშვნელობა: $2)",
+       "resettokens-resetbutton": "არჩეული ტოკენების ჩამოყრა",
        "bold_sample": "მუქი ტექსტი",
        "bold_tip": "მუქი ტექსტი",
        "italic_sample": "კურსივი",
        "import-rootpage-nosubpage": "სახელტა სივრცეში მითითებულ ძირეულ გვერდში „$1“ ქვეგვერდები დაუშვებელია.",
        "importlogpage": "იმპორტის ჟურნალი",
        "importlogpagetext": "ადმინისტრატორთა მიერ გვერდების იმპორტირება  ცვლილებების ჩათვლით სხვა ვიკიდან.",
-       "import-logentry-upload": "„[[$1]]“ — ფაილის იმპორტი",
        "import-logentry-upload-detail": "$1 ცვლილება",
-       "import-logentry-interwiki": "„$1“ — ტრანსვიკი იმპორტი",
        "import-logentry-interwiki-detail": "$1 ცვლილება $2-დან",
        "javascripttest": "JavaScript-ის ტესტირება",
        "javascripttest-pagetext-noframework": "ეს გვერდი დარეგისტრირებულია JavaScript-ის ტესტების გასაშვებად.",
index e7dfc62..9d18201 100644 (file)
        "otherlanguages": "Басқа тілдерде",
        "redirectedfrom": "($1 бетінен бағытталған)",
        "redirectpagesub": "Бағыттау беті",
+       "redirectto": "Мына бетке бағытталған:",
        "lastmodifiedat": "Бұл беттің соңғы өзгертілген кезі: $2, $1.",
        "viewcount": "Бұл бет {{PLURAL:$1|бір рет|$1 уақыт}} қатыналған.",
        "protectedpage": "Қорғалған бет",
        "rcshowhideanons": "Кірмегендерді $1",
        "rcshowhideanons-show": "көрсету",
        "rcshowhideanons-hide": "жасыру",
-       "rcshowhidepatr": "Ð\97еÑ\80Ñ\82Ñ\82елген өңдемелерді $1",
+       "rcshowhidepatr": "ТекÑ\81еÑ\80Ñ\96лген өңдемелерді $1",
        "rcshowhidepatr-show": "көрсету",
        "rcshowhidepatr-hide": "жасыру",
        "rcshowhidemine": "Өңдемелерімді $1",
        "number_of_watching_users_pageview": "[бақылаған $1 қатысушы]",
        "rc_categories": "Санаттарға шектеу (\"|\" белгісімен бөліктеңіз)",
        "rc_categories_any": "Кез келген",
-       "rc-change-size-new": "Өңдеуден кейінгі көлемі: $1{{PLURAL:$1|байт|байт}}",
+       "rc-change-size-new": "Өңдеуден кейінгі көлемі: $1 {{PLURAL:$1|байт|байт}}",
        "newsectionsummary": "/* $1 */ жаңа бөлім",
        "rc-enhanced-expand": "Толық ақпаратты көрсету",
        "rc-enhanced-hide": "Толық ақпаратты жасыру",
        "importunknownsource": "Cырттан алынатын қайнар түрі белгісіз",
        "importcantopen": "Сырттан алынатын файл ашылмайды",
        "importbadinterwiki": "Жарамсыз уики-аралық сілтеме",
-       "importsuccess": "СÑ\8bÑ\80Ñ\82Ñ\82ан Ð°Ð»у аяқталды!",
+       "importsuccess": "Ð\98мпоÑ\80Ñ\82Ñ\82ау аяқталды!",
        "importnosources": "Уики-апару үшін сырттан алынатын еш қайнар көзі анықталмаған, және тарихын тікелей қотарып беруі өшірілген.",
        "importnofile": "Сырттан алынған файл жүктелген жоқ.",
        "importuploaderrorsize": "Импортталған файлдың жүктелуі сәтсіз болды. \nФайл рұқсат етілгеннен жүктеу өлшемінен үлкенірек.",
        "import-options-wrong": "Қате {{PLURAL:$2|параметр|параметр}}: <nowiki>$1</nowiki>",
        "importlogpage": "Сырттан алу журналы",
        "importlogpagetext": "Беттерді түзету тарихымен бірге сыртқы уикилерден әкімші ретінде алу.",
-       "import-logentry-upload": "«[[$1]]» дегенді файл жүктеу арқылы сырттан алды",
        "import-logentry-upload-detail": "$1 түзету",
-       "import-logentry-interwiki": "уики-апарылған $1",
        "import-logentry-interwiki-detail": "$2 дегеннен $1 түзету",
        "javascripttest": "JavaScript сынақталуда",
        "javascripttest-qunit-intro": "[$1 сынақтау құжаттамасын]  mediawiki.org-тен қара.",
        "markedaspatrollederror": "Зерттелді деп белгіленбейді",
        "markedaspatrollederrortext": "Зерттелді деп белгілеу үшін түзетуді келтіріңіз.",
        "markedaspatrollederror-noautopatrol": "Өз жасаған өзгерістеріңізді зерттелді деп белгілей алмайсыз.",
-       "patrol-log-page": "Ð\97еÑ\80Ñ\82Ñ\82еу журналы",
-       "log-show-hide-patrol": "$1 зерттеу журналы",
+       "patrol-log-page": "ТекÑ\81еÑ\80у журналы",
+       "log-show-hide-patrol": "$1 тексеру журналы",
        "deletedrevision": "Ескі түзетуін жойды: $1",
        "filedeleteerror-short": "Файл жою қатесі: $1",
        "filedeleteerror-long": "Файлды жойғанда қателер кездесті:\n\n$1",
        "logentry-rights-rights-legacy": "$1 $3 үшін топ мүшелігін {{GENDER:$2|өзгерті}}",
        "logentry-upload-upload": "$1 $3 файлын {{GENDER:$2|жүктеді}}",
        "logentry-upload-overwrite": "$1 $3 дегеннің жаңа нұсқасын {{GENDER:$2|жүктеді}}",
+       "log-name-managetags": "Тег басқару журналы",
        "rightsnone": "(ешқандай)",
        "revdelete-summary": "өңдеменің қысқаша мазмұндамасы",
        "feedback-adding": "Бетке кері байланыс қосуда...",
index 3eb6f37..49160c4 100644 (file)
@@ -32,7 +32,7 @@
        "tog-enotifusertalkpages": "Scheck mer en <i lang=\"en\">e-mail</i>, wann ming Klaaf_Sigg jeändert weed",
        "tog-enotifminoredits": "Scheck mer och en <i lang=\"en\">e-mail</i> för de klein Mini-Änderonge",
        "tog-enotifrevealaddr": "Zeich dä Andere ming E-Mail Adress aan, en de Benohrichtijunge per E-Mail",
-       "tog-shownumberswatching": "Zeich de Aanzahl Metmaacher, die op die Sigg am oppasse sin",
+       "tog-shownumberswatching": "Zeisch de Aanzahl Metmaacher, di op di Sigg am oppaßße sin",
        "tog-oldsig": "Esu&nbsp;süht&nbsp;Ding „Ongerschreff“&nbsp;us:",
        "tog-fancysig": "Donn de „Ungerschreff“ als Wiki-Tex behandelle (ohne enne automattesche Lengk)",
        "tog-uselivepreview": "Vör-Aansesch övver AJAX zeije",
        "summary": "Koot zosammejefaß, Quäll:",
        "subject": "Üvverschreff - wodröm jeiht et?",
        "minoredit": "Dat es en klein Änderung (mini)",
-       "watchthis": "Op die Sigg heh oppasse",
+       "watchthis": "Op di Sigg heh oppaßße",
        "savearticle": "De Sigg Avspeichere",
        "preview": "Vör-Ansich",
        "showpreview": "Vör-Aansich zeije",
        "upload-maxfilesize": "Der jrüütßte müjjelesche Ömfang för en Datei es $1.",
        "upload-description": "Övver di Datei",
        "upload-options": "Enstellunge för et Laade",
-       "watchthisupload": "Op di Datei oppasse",
+       "watchthisupload": "Op di Datei oppaßße",
        "filewasdeleted": "Unger däm Name wood ald ens en Datei huhjelade. Die es enzwesche ävver widder fottjeschmesse woode. Luur leever eets ens en et $1 ih dat De se dann avspeichere deis.",
        "filename-bad-prefix": "Dä Datei ier Name fängk met '''„$1“''' aan. dat eß fä jewöhnlesch ene Name, dä en dijjitaale Kammerra iere Belder jitt. Esu en Name donn uns esu winnisch verzälle, dat mer se nit jän em Wiki han wulle.\nBes esu joot un jiff dä enne Name, wo mer mieh met aanfange, öm ze wesse, wat en dä Datei dren es.",
        "filename-prefix-blacklist": " #<!-- Lohß di Reih jenou esu wie se es! --> <pre>\n#  Syntax:\n#   * Alles zwesche em #-Zeiche bes nohm Engk vun de Reih es ene Kommäntaa\n#   * Jede Reih met jet dren es ene typpesche Aanfang för ene Datteiname,\n#   * dä automattesch vun ene Dijjitahlkammera kütt\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # - et ein udder andere mobile Tellefohn -\nIMG # - alljemein üplesch -\nJD # Jenoptik\nMGP # Pentax\nPICT # - diverse -\n #</pre> <!-- Lohß di Reih jenou esu wie se es! -->",
        "removewatch": "Us de Oppassliss nämme",
        "removedwatchtext": "Die Sigg „[[:$1]]“ es jetz us de [[Special:Watchlist|Oppassliss]] erusjenomme.",
        "removedwatchtext-short": "De Sigg  „$1“ es uß Dinge Oppaßleß eruß jenumme.",
-       "watch": "Drop Oppasse",
-       "watchthispage": "Op die Sigg oppasse",
-       "unwatch": "Nimieh drop Oppasse",
-       "unwatchthispage": "Nit mieh op die Sigg oppasse",
+       "watch": "Drobb oppaßße",
+       "watchthispage": "Op di Sigg oppaßße",
+       "unwatch": "Nimeh drobb oppaßße",
+       "unwatchthispage": "Nit mih op di Sigg oppaßße",
        "notanarticle": "Keine Atikkel",
        "notvisiblerev": "Di Version es fottjeschmesse",
        "watchlist-details": "Do häß {{PLURAL:$1|ein Sigg|$1 Sigge|kein Sigg}} en Dinge Oppaßleß{{PLURAL:$1|, un di Klaafsigg dohzoh|, un de Klaafsigge dohzoh|}}.",
        "wlnote": "{{PLURAL:$1|Hee es de läzde Änderong uß|Hee sin de läzde <strong>$1</strong> Änderonge uß|Mer han kein Änderonge en}} de läzde {{PLURAL:$2|Stund|<strong>$2</strong> Stunde|<strong>noll</strong> Stunde}} zigg em $3 öm $4 Uhr.",
        "wlshowlast": "Zeisch de läzde $1 Schtunde, $2 Dähsch aan.",
        "watchlist-options": "Eijeschaffte fun de Oppassless",
-       "watching": "Drop oppasse…",
-       "unwatching": "Nimmieh drop oppasse",
+       "watching": "Drobb oppaßße…",
+       "unwatching": "Nimmih drobb oppaßße",
        "watcherrortext": "Ene Fähler es opjetrodde beim Ändere vun de Enshtällonge för Ding Oppaßleß för „$1“",
        "enotif_reset": "Saz all Änderonge op „Aanjeluurt“, un fäädesch.",
        "enotif_impersonal_salutation": "Metmaacher {{GRAMMAR:Genitiv vun|{{SITENAME}}}}",
        "ipbother": "För en ander Duur:",
        "ipboptions": "2 Stund:2 hours,1 Dach:1 day,3 Däch:3 days,1 Woch:1 week,2 Woche:2 weeks,1 Mond:1 month,3 Mond:3 months,6 Mond:6 months,1 Johr:1 year,Unbejrenz:infinite",
        "ipbhidename": "Don däm Metmaacher singe Name versteiche, en de Leste un däm sing Änderunge.",
-       "ipbwatchuser": "Op däm Metmaacher sing Metmaachersigg un Klaafsigg oppasse",
+       "ipbwatchuser": "Op däm Metmaacher sing Metmaachersigg un Klaafsigg oppaßße",
        "ipb-disableusertalk": "Dä Metmaacher darf sing Klaafsigg nit ändere, esulang, wi hä jwesperrt es",
        "ipb-change-block": "Wigger sperre met dä neue Enstellunge",
        "ipb-confirm": "Et Sperre beshtäätejje",
        "cant-move-category-page": "Do häß nit dat Rääsch, Saachjroppesigge ömzebenänne.",
        "cant-move-to-category-page": "Do häß nit dat Rääsch, en Sigg obb en Saachjroppesigg ömzebenänne.",
        "newtitle": "op dä neue Name",
-       "move-watch": "Op die Sigg heh oppasse",
+       "move-watch": "Op di Sigg heh oppaßße",
        "movepagebtn": "Ömnenne",
        "pagemovedsub": "Dat Ömnenne hät jeflupp",
        "movepage-moved": "'''De Sigg „$1“ es jez en „$2“ ömjenannt.'''",
        "import-rootpage-nosubpage": "Em Appachtemang „$1“ vun dä Aanfangssig sin kein Ongersigge zohjelohße.",
        "importlogpage": "Logboch met emporteerte Sigge",
        "importlogpagetext": "Sigge met ehre Versione vun ander Wikis emporteere.",
-       "import-logentry-upload": "„[[$1]]“ emporteet fun enne huhjelade Dattei",
        "import-logentry-upload-detail": "{{PLURAL:$1|ein Väsjohn|$1 Väsjohne|kein Väsjohn}} woodt emportehrt.",
-       "import-logentry-interwiki": "hät tirek vum ander Wiki emporteet: „$1“",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|ein Väsjohn|$1 Väsjohne|kein VVäsjohnersion}} woodt empottehrt vun „$2“",
        "javascripttest": " JavaSkrepte ußprobeere.",
        "javascripttest-pagetext-noframework": "Heh di Sigg es för JavaSkrepte ußzeprobeere.",
        "tooltip-preview": "Liss de Vör-Aansich vun dä Sigg un vun Dinge Änderunge ih datte se Avspeichere deis!",
        "tooltip-diff": "Zeich Ding Änderunge am Tex aan.",
        "tooltip-compareselectedversions": "Dun de Ungerscheid zwesche dä beids usjewählde Versione zeije.",
-       "tooltip-watch": "Op die Sigg heh oppasse.",
+       "tooltip-watch": "Op di Sigg heh oppaßße.",
        "tooltip-watchlistedit-normal-submit": "Donn  de Titele met Hökche eruß schmieße.",
        "tooltip-watchlistedit-raw-submit": "Oppassliss neu fasshallde",
        "tooltip-recreate": "En fottjeschmesse Sigg widder zeröckholle",
        "logentry-block-reblock": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät {{GENDER:$4|däm|däm|däm Metmaacher|dä|däm}} $3 {{GENDER:$3|sing|sing|sing|ier|sing}} sing Schpärr för di Zigg vun $5 verändert. $6",
        "logentry-suppress-block": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät {{GENDER:$4|dä|dat|dä Metmaacher|de|dat}} $3 för en Zigg vun $5 jespächt. $6",
        "logentry-suppress-reblock": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät {{GENDER:$4|däm|däm|däm Metmaacher|dä|däm}} $3 {{GENDER:$3|sing|sing|sing|ier|sing}} sing Schpärr för di Zigg vun $5 verändert. $6",
+       "logentry-import-upload": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} „$1“ hät di Sigg „$3“ huhjelahde un esu empottehrt",
+       "logentry-import-interwiki": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} „$1“ hät di Sigg „$3“ fun enem andere Wikki empottehrt",
        "logentry-merge-merge": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Sigg „$3“ met dä Sigg „$4“ zersamme jelaat, jenou jenumme de Väsjohne bes $5",
        "logentry-move-move": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hätt di Sigg „$3“ en „$4“ ömjenannt.",
        "logentry-move-move-noredirect": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei kein Ömleidong aanjelaat.",
        "log-name-pagelang": "Logbooch vum Tuusche vun Sige iehr Schprohche",
        "log-description-pagelang": "Dat heh es et Logbohch vun de Veränderonge aan de Schprohch vun de Sigge.",
        "logentry-pagelang-pagelang": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät de Schprohch vun dä Sigg „$3“ vun $4 op $5 verändert.",
-       "default-skin-not-found": "De schtandattmähßejje Bedehnbovverfläsch <code>$1</code> för et Wikki es nit ze fenge. Se weed övver dä Enndraach <code lang=\"en\" xml:lang=\"en\">$wgDefaultSkin</code> en dä Dattei <code lang=\"en\" xml:lang=\"en\">LocalSettings.php</code> om ẞööver faßjelaat.\n\nHeh di Bedehnbovverfläsche sin doh:\n\n$2\n\nLohr och en et [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de Handbohch övver et Enschtälle vun Bedehnbovverfläsche].\n\n*'''Falls dat heh e fresch enjereesch MeedijaWikki es:'''\n*: MeedijaWikki wood velleisch övver <i lang=\"en\" xml:lang=\"en\">Git</i> eschtallehrt, udder der Quälltäx wood tiräk obb_en ander Manier eschtallehrt. Met däm Problehm heh wohr ze rääschne. Donn winneschßdens eine vun dä Bovverfläsche uss_em [https://www.mediawiki.org/wiki/Category:All_skins Verzeischneß vun de Bedehnbovverfläsche vum MeedijaWikki] enschtallehre. Dat jeihd, endämm dat De:\n*:* einzel veröffentleschte Bovverfläsche us [https://www.mediawiki.org/wiki/Special:SkinDistributor MediaWiki.org] erongerlähds un en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun dä MeedijaWikki_Enschtallazuhn holls,\n*:* winneschsdens eins vun dä Verzeischneße us <code lang=\"en\" xml:lang=\"en\">mediawiki/skins/*</code> met <i lang=\"en\" xml:lang=\"en\">Git</i> en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun Dinge MeedijaWikki_Enschtallazuhn holls,\n*:* de [https://www.mediawiki.org/wiki/Download Dattei vum MeedijaWikki] erongerlähds, woh ongerscheidlejje Bedehnbovverfläsche dren sin un Zohsäz derzoh. Uß däm Verzeischneß doh dren kam_mer Saache en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun dä MeedijaWikki_Enschtallazuhn holle.\n*: Dat sullt sesch nit met Dingem <i lang=\"en\" xml:lang=\"en\">git</i>-Verzeischneß schtühre, falls De och ene Äntweckler vum MeedijaWikki bes.\n*'''Falls dat MeedijaWikki heh jrahd obb ene neue Schtand jebraht wood:'''\n*: Bei MeedijaWikki en dä Väsjohn 1.24 un hüüter wääde de enschtallehrte Bedehnbovverfläsche nit mieh automattesch alle aanjemaat; süsch och em [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Handbohch] derhoh. Do kanns heh di Reihje e de Dattei <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">LocalSettings.php</code> eren koppehre, öm alle enschtallehrte Bedehnbovverfläsche aanzemaache:\n*:<pre lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$3</pre>\n* '''Falls de jrahd aan dä Dattei <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">LocalSettings.php</code> jät geändert häs:'''\n*: Donn de Nahme vun de Bedehnbovverfläsche en dä Dattei pröhve. Se künnte verhehrt jeschrevve sin.",
-       "default-skin-not-found-no-skins": "De schtandattmähßejje Bedehnbovverfläsch <code>$1</code> för et Wikki es nit ze fenge. Se weed övver dä Enndraach <code lang=\"en\" xml:lang=\"en\">$wgDefaultSkin</code> en dä Dattei <code lang=\"en\" xml:lang=\"en\">LocalSettings.php</code> om ẞööver faßjelaat.\n\nEt sinn_er kein Bedehnbovverfläsche doh.\n\n*'''Falls dat heh e fresch enjereesch MeedijaWikki, es udder jrahd obb ene neue Schtand jebraht wood:'''\n*: MeedijaWikki wood velleisch övver <i lang=\"en\" xml:lang=\"en\">Git</i> eschtallehrt, udder der Quälltäx wood tiräk obb_en ander Manier eschtallehrt. Met däm Problehm heh wohr ze rääschne. Bei MeedijaWikki en dä Väsjohn 1.24 un hüüter sin kein Bedehnbovverfläsche mieh automattesch derbei. Donn winneschßdens eine vun dä Bovverfläsche uss_em [https://www.mediawiki.org/wiki/Category:All_skins Verzeischneß vun de Bedehnbovverfläsche] enschtallehre. Dat jeihd, endämm dat De:\n*:* winneschsdens eins vun dä Verzeischneße us <code lang=\"en\" xml:lang=\"en\">mediawiki/skins/*</code> met <i lang=\"en\" xml:lang=\"en\">Git</i> en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun Dinge MeedijaWikki_Enschtallazuhn holls,\n*:* einzel veröffentleschte Bovverfläsche us [https://www.mediawiki.org/wiki/Special:SkinDistributor MediaWiki.org] erongerlähds un en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun Dinge MeedijaWikki_Enschtallazuhn holls,\n*:* de [https://www.mediawiki.org/wiki/Download Dattei vum MeedijaWikki] erongerlähds, woh ongerscheidlejje Bedehnbovverfläsche dren sin un Zohsäz dder derzoh. Uß däm Verzeischneß doh dren kam_mer Saache en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun Dinge vun dä MeedijaWikki_Enschtallazuhn holle.\n*: Dat sullt sesch nit met Dingem <i lang=\"en\" xml:lang=\"en\">Git</i>-Verzeischneß schtühre, falls De och ene Äntweckler vum MeedijaWikki bes. Loor em [https://www.mediawiki.org/wiki/Manual:Skin_configuration Handbohch] derhoh, wi mer Bedehnbovverfläsche aanmääd un ene Schtandatt faßlähsch.",
+       "default-skin-not-found": "De schtandattmähßejje Bedehnbovverfläsch <code>$1</code> för et Wikki es nit ze fenge. Se weed övver dä Enndraach <code lang=\"en\" xml:lang=\"en\">$wgDefaultSkin</code> en dä Dattei <code lang=\"en\" xml:lang=\"en\">LocalSettings.php</code> om ẞööver faßjelaat.\n\n{{PLURAL:$4|Heh di Bedehnbovverfläsch es|Heh di Bedehnbovverfläsche sin|Kein Bedehnbovverfläsche sin}} doh:\n\n$2\n\nLohr och en et [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de Handbohch övver et Enschtälle vun Bedehnbovverfläsche].\n\n*'''Falls dat heh e fresch enjereesch MehdijaWikki es:'''\n*: MehdijaWikki wood velleisch övver <i lang=\"en\" xml:lang=\"en\">Git</i> enschtallehrt, udder der Quälltäx wood tiräk obb_en ander Manier enschtallehrt. Met däm Problehm heh wohr ze rääschne. Donn winneschßdens eine vun dä Bovverfläsche uss_em [https://www.mediawiki.org/wiki/Category:All_skins Verzeischneß vun de Bedehnbovverfläsche vum MehdijaWikki] enschtallehre. Dat jeihd, endämm dat De:\n*:* einzel veröffentleschte Bovverfläsche us [https://www.mediawiki.org/wiki/Special:SkinDistributor MediaWiki.org] erongerlähds un en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun dä MehdijaWikki_Enschtallazuhn holls,\n*:* winneschsdens eins vun dä Verzeischneße us <code lang=\"en\" xml:lang=\"en\">mediawiki/skins/*</code> met <i lang=\"en\" xml:lang=\"en\">Git</i> en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun Dinge MehdijaWikki_Enschtallazuhn holls,\n*:* de [https://www.mediawiki.org/wiki/Download Dattei vum MehdijaWikki] erongerlähds, woh ongerscheidlejje Bedehnbovverfläsche dren sin un Zohsäz derzoh. Uß däm Verzeischneß doh dren kam_mer Saache en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun dä MehdijaWikki_Enschtallazuhn holle.\n*: Dat sullt sesch nit met Dingem <i lang=\"en\" xml:lang=\"en\">git</i>-Verzeischneß schtühre, falls De och ene Äntweckler vum MehdijaWikki bes.\n*'''Falls dat MehdijaWikki heh jrahd obb ene neue Schtand jebraht wood:'''\n*: Bei MehdijaWikki en dä Väsjohn 1.24 un hüüter wääde de enschtallehrte Bedehnbovverfläsche nit mieh automattesch alle aanjemaat; süsch och em [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Handbohch] dernoh. Do kanns heh di {{PLURAL:$5|Reih|Reihje|kein Reihje}} en de Dattei <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">LocalSettings.php</code> eren koppehre, öm {{PLURAL:$5|di enschtallehrte Bedehnbovverfläsch|alle enschtallehrte Bedehnbovverfläsche|kein Bedehnbovverfläsch}} aanzeschallde:\n<pre lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$3</pre>\n* '''Falls de jrahd aan dä Dattei <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">LocalSettings.php</code> jät geändert häs:'''\n*: Donn de Nahme vun de Bedehnbovverfläsche en dä Dattei pröhve. Se künnte verhehrt jeschrevve sin.",
+       "default-skin-not-found-no-skins": "De schtandattmähßejje Bedehnbovverfläsch <code>$1</code> för et Wikki es nit ze fenge. Se weed övver dä Enndraach <code lang=\"en\" xml:lang=\"en\">$wgDefaultSkin</code> en dä Dattei <code lang=\"en\" xml:lang=\"en\">LocalSettings.php</code> om ẞööver faßjelaat.\n\nEt sinn_er kein Bedehnbovverfläsche doh.\n\n*'''Falls dat heh e fresch enjereesch MehdijaWikki, es udder jrahd obb ene neue Schtand jebraht wood:'''\n*: MehdijaWikki wood velleisch övver <i lang=\"en\" xml:lang=\"en\">Git</i> enschtallehrt, udder der Quälltäx wood tiräk obb_en ander Manier enschtallehrt. Met däm Problehm heh wohr ze rääschne. Bei MehdijaWikki en dä Väsjohn 1.24 un hüüter sin kein Bedehnbovverfläsche mieh automattesch derbei. Donn winneschßdens eine vun dä Bovverfläsche uss_em [https://www.mediawiki.org/wiki/Category:All_skins Verzeischneß vun de Bedehnbovverfläsche] enschtallehre. Dat jeihd, endämm dat De:\n*:* winneschsdens eins vun dä Verzeischneße us <code lang=\"en\" xml:lang=\"en\">mediawiki/skins/*</code> met <i lang=\"en\" xml:lang=\"en\">Git</i> en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun Dinge MehdijaWikki_Enschtallazuhn holls,\n*:* einzel veröffentleschte Bovverfläsche us [https://www.mediawiki.org/wiki/Special:SkinDistributor MediaWiki.org] erongerlähds un en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun Dinge MehdijaWikki_Enschtallazuhn holls,\n*:* de [https://www.mediawiki.org/wiki/Download Dattei vum MehdijaWikki] erongerlähds, woh ongerscheidlejje Bedehnbovverfläsche dren sin un Zohsäz derzoh. Uß däm Verzeischneß doh dren kam_mer Saache en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun Dinge vun dä MehdijaWikki_Enschtallazuhn holle.\n*: Dat sullt sesch nit met Dingem <i lang=\"en\" xml:lang=\"en\">Git</i>-Verzeischneß schtühre, falls De och ene Äntweckler vum MehdijaWikki bes. Lohr em [https://www.mediawiki.org/wiki/Manual:Skin_configuration Handbohch] dernoh, wi mer Bedehnbovverfläsche aanmääd un ene Schtandatt faßlähsch.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (enjeschalldt)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''ußjeschalldt''')",
        "mediastatistics": "Schtateßteke övver de Meedije",
index b9975a5..6187d02 100644 (file)
        "import-rootpage-nosubpage": "Am Nummraum \"$1\" vun der Basis-Säit si keng Ënnersäiten erlaabt.",
        "importlogpage": "Lëscht vun den Säitenimporten",
        "importlogpagetext": "Administrativen Import vu Säite mam Historique vun den Ännerungen aus anere Wikien.",
-       "import-logentry-upload": "huet [[$1]] vun engem Fichier duerch Eroplueden importéiert",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|Versioun|Versiounen}} importéiert",
-       "import-logentry-interwiki": "huet $1 importéiert (Transwiki)",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|Versioun|Versiounen}} importéiert vu(n) $2",
        "javascripttest": "JavaScript-Test",
        "javascripttest-pagetext-noframework": "Dës Säit ass fir Java-Script-Tester reservéiert.",
        "revdelete-uname-unhid": "Benotzernumm net verstoppt",
        "revdelete-restricted": "Limitatioune fir Administrateuren ageschalt",
        "revdelete-unrestricted": "Limitatioune fir Administrateuren opgehuewen",
+       "logentry-import-interwiki": "$1 huet $3 vun enger anerer Wiki {{GENDER:$2|importéiert}}",
        "logentry-move-move": "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}}",
        "logentry-move-move-noredirect": "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}} ouni eng Viruleedung unzeleeën",
        "logentry-move-move_redir": "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}} an derbäi gouf eng Viruleedung iwwerschriwwen",
index 438934a..83aeb8a 100644 (file)
        "editconflict": "Дуьзар хъувунрин акьунар: $1",
        "yourtext": "Зи текст",
        "yourdiff": "Тафаватар",
-       "copyrightwarning": "Тавакъу ийида, фагьум ая хьи, {{SITENAME}}-диз кутунвай вири крариз $2 лицензиядин шартунал акъуднавайбур хьиз килигда. (гегьеншдиз $1-з килига). \nКвез куьне кхьенвайбур азаддаказ чкIун ва гьар са кас  патахъай дуьзар хъувун кIанзавачтIа, а кхьенвайбур иниз эцигмир.<br />\nГЬакIни, куьне тестикьзава хьи, кутазвай алавайрин автор кьун я, я тахьайтIа, куьне а алаваяр чпин къенеавайбур азад чкIунни дегишун ихтияр гузвай чешмедикай ччин къачунва.<br />\n'''АВТОРДИН ИХТИЯР ХУЬЗВАЙ МАЛУМАТАР ИХТИЯР ГАЛАЧИЗ ЭЦИГМИР!'''",
+       "copyrightwarning": "Тавакъу ийида, фагьум ая хьи, {{SITENAME}}-диз кутунвай вири крариз $2 лицензиядин шартунал акъуднавайбур хьиз килигда. (гегьеншдиз $1-з килига).\nКвез куьне кхьенвайбур азаддаказ чкӀун ва гьар са кас патахъай дуьзар хъувун кӀанзавачтӀа, а кхьенвайбур иниз эцигмир.<br />\nГьакӀни, куьне тестикьзава хьи, кутазвай алавайрин автор кьун я, я тахьайтӀа, куьне а алаваяр чпин къенеавайбур азад чкӀунни дегишун ихтияр гузвай чешмедикай ччин къачунва.<br />\n'''АВТОРДИН ИХТИЯР ХУЬЗВАЙ МАЛУМАТАР ИХТИЯР ГАЛАЧИЗ ЭЦИГМИР!'''",
        "templatesused": "И ччина кардик кутунвай {{PLURAL:$1|1=Чешне|Чешнеяр}}:",
        "templatesusedpreview": "{{PLURAL:$1|1=Шаблон|Шаблонар}},илемишзавай дуьз клигунра:",
        "template-protected": "(хвенвай)",
        "upload-options": "Ппарунин шартIар",
        "watchthisupload": "И файл гуьзетун",
        "upload-file-error": "Къенепатан гъалатӀ",
+       "backend-fail-delete": "$1 файл алудиз хьанвач.",
        "uploadstash-refresh": "Файлрин сиягь цIийи хъувун",
        "img-auth-accessdenied": "Гьахьун къадагъа авунва",
        "license": "Лицензиярун",
        "statistics-pages": "Ччинар",
        "statistics-files": "Ппарнавай файлар",
        "statistics-users-active": "Актив уртахар",
-       "brokenredirects-edit": "дегишарун",
+       "brokenredirects-edit": "дуьзар хъувун",
        "brokenredirects-delete": "алудун",
        "withoutinterwiki-submit": "Къалурун",
        "nbytes": "$1 {{PLURAL:$1|1=байт|байтар}}",
        "changed": "дегишнава",
        "deletepage": "Къакъудун хъувун",
        "confirm": "Тестикьун",
-       "delete-confirm": "Къакъудун \"$1\"",
+       "delete-confirm": "«$1» алудун",
        "delete-legend": "Къакъудун",
        "confirmdeletetext": "Квез чlуриз кlанзани чарар гьадан вири тарихар галаз.                                                                                                                         Буюр, сидикъара,куьне чlурзатlа, куьн агъавурда автlа вуч ийизатlа ва куьне ийизатlа жуьреда [[{{MediaWiki:Policy-url}}| политика]].",
        "actioncomplete": "Кар авунва",
        "dellogpage": "Алудунин журнал",
        "deletecomment": "Кар",
        "deleteotherreason": "Масса/ ва мад кар",
-       "deletereasonotherlist": "Маса фагьум",
-       "rollback_short": "КЬулухъди чIугун",
+       "deletereasonotherlist": "Маса себеб",
        "rollbacklink": "Кьулухъди чIугун",
        "sessionfailure-title": "Гьахьунин гъалатI",
        "protectlogpage": "Хуьнин журнал",
        "logentry-move-move_redir-noredirect": "$1 $3 макъаладин тӀвар, ракъурун тун тавуна ва ракъурунин винелай $4 -диз масакӀа хъувуна",
        "logentry-newusers-autocreate": "Уртахдин $1 учётдин кхьин автоматиквилели туькӀуьр хьанва",
        "rightsnone": "(садни)",
-       "feedback-subject": "Тема:",
-       "feedback-message": "Чар:",
        "feedback-cancel": "Гьич авун",
        "feedback-close": "Авунва",
+       "feedback-message": "Чар:",
+       "feedback-subject": "Тема:",
        "expand_templates_xml_output": "XML акъудун",
        "expand_templates_ok": "ОК",
        "expand_templates_remove_comments": "Баянар алудун"
index 65bc575..7fbec56 100644 (file)
@@ -29,7 +29,8 @@
                        "לערי ריינהארט",
                        "Vogone",
                        "아라",
-                       "Aswanas"
+                       "Aswanas",
+                       "Pofka"
                ]
        },
        "tog-underline": "Pabraukti nuorodas:",
        "disclaimers": "Atsakomybės apribojimas",
        "disclaimerpage": "Project:Atsakomybės apribojimas",
        "edithelp": "Kaip redaguoti",
+       "helppage-top-gethelp": "Pagalba",
        "mainpage": "Pagrindinis puslapis",
        "mainpage-description": "Pagrindinis puslapis",
        "policy-url": "Project:Politika",
        "thumbnail_gd-library": "Nepilna GD bibliotekos konfigūracija: trūksta funkcijos $1",
        "thumbnail_image-missing": "Gali būti, kad failo nėra: $1",
        "import": "Importuoti puslapius",
-       "importinterwiki": "Tarpprojektinis importas",
+       "importinterwiki": "Įkelti iš kitos Wiki",
        "import-interwiki-text": "Pasirinkite projektą ir puslapio pavadinimą importavimui.\nVersijų datos ir redaktorių vardai bus išlaikyti.\nVisi tarpprojektiniai importo veiksmai yra registruojami  [[Special:Log/import|importo istorijoje]].",
        "import-interwiki-sourcewiki": "Pradinė wiki:",
        "import-interwiki-sourcepage": "Pirminis puslapis:",
        "import-rootpage-invalid": "Duotas šaknų puslapis yra blogas pavadinimas.",
        "importlogpage": "Importavimų sąrašas",
        "importlogpagetext": "Administraciniai puslapių importai su keitimų istorija iš kitų wiki projektų.",
-       "import-logentry-upload": "importuota $1 įkeliant failą",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|keitimas|keitimai|keitimų}}",
-       "import-logentry-interwiki": "tarpprojektinis $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|keitimas|keitimai|keitimų}} iš $2",
        "javascripttest": "JavaScript testavimas",
        "javascripttest-pagetext-noframework": "Šis puslapis yra skirtas vykdyti JavaScript testavimus.",
        "rightsnone": "(jokių)",
        "revdelete-summary": "keitimo paaiškinimas",
        "feedback-adding": "Pridedamas atsiliepimas į puslapį ...",
+       "feedback-back": "Atgal",
        "feedback-bugcheck": "Puiku! Tiesiog patikrinkite, ar tai ne viena [$1 jau žinomų klaidų].",
        "feedback-bugnew": "Patikrinau. Pranešti apie naują klaidą",
        "feedback-bugornote": "Jei jūs esate pasirengę aprašyti techninę problemą išsamiau, [$1 praneškite apie programinę klaidą].\nKitu atveju, galite naudotis žemiau esančia paprastesne forma. Jūsų komentaras bus įtrauktas į puslapį „[$3 $2]“, kartu su jūsų naudotojo vardu ir jūsų naudojama naršykle.",
        "feedback-cancel": "Atšaukti",
        "feedback-close": "Atlikta",
+       "feedback-dialog-title": "Pateikti atsiliepimą",
+       "feedback-error-title": "Klaida",
        "feedback-error1": "Klaida: Neatpažįstamas rezultatas iš API",
        "feedback-error2": "Klaida: Redagavimas nepavyko",
        "feedback-error3": "Klaida: Jokio atsakymo iš API",
        "feedback-message": "Pranešimas:",
        "feedback-subject": "Tema:",
-       "feedback-submit": "Siųsti Atsiliepimą",
+       "feedback-submit": "Pateikti",
        "feedback-thanks": "Ačiū! Jūsų atsiliepimas buvo užregistruotas puslapyje „[$2 $1]“.",
        "searchsuggest-search": "Ieškoti",
        "searchsuggest-containing": "turintys",
index f0d436a..d8d4836 100644 (file)
        "listfiles_size": "幅(位元組)",
        "listfiles_description": "述",
        "listfiles_count": "擇",
+       "listfiles-latestversion": "當前版本",
        "listfiles-latestversion-yes": "是",
        "listfiles-latestversion-no": "否",
        "file-anchor-link": "檔",
        "filedelete-reason-dropdown": "\n*常刪之因\n** 侵版權\n** 重檔",
        "filedelete-edit-reasonlist": "纂刪因",
        "filedelete-maintenance": "護當禁刪復檔也。",
+       "filedelete-maintenance-title": "無法刪檔",
        "mimesearch": "篩檔",
        "mimesearch-summary": "此頁可以MIME篩檔.格仿「文類/次類」,如<code>image/jpeg</code>。",
        "mimetype": "MIME類有:",
        "unusedtemplateswlh": "支鏈",
        "randompage": "清風翻書",
        "randompage-nopages": "下列{{PLURAL:$2|名集}}中無頁也:$1",
+       "randomincategory-category": "類:",
        "randomredirect": "任渡",
        "randomredirect-nopages": "「$1」名冊內無渡也。",
        "statistics": "彙統",
        "protectedpages": "頁錮",
        "protectedpages-indef": "只示無期之錮",
        "protectedpages-cascade": "只示連串之錮",
+       "protectedpages-timestamp": "時間戳",
        "protectedpages-page": "頁",
        "protectedpages-expiry": "屆期",
        "protectedpages-reason": "因:",
+       "protectedpages-unknown-timestamp": "未知",
        "listusers": "點簿",
        "listusers-editsonly": "只示有纂之簿",
        "listusers-creationsort": "按先後列之",
        "pager-older-n": "陳$1次",
        "suppress": "監",
        "querypage-disabled": "此奇頁基以效,故停之。",
+       "apihelp": "程式接口幫助檔",
        "booksources": "書海",
        "booksources-search-legend": "舀書海",
        "booksources-search": "尋",
        "activeusers-noresult": "無簿矣。",
        "listgrouprights": "權任一覽",
        "listgrouprights-summary": "此所列述,諸職所司也,各有異同。欲知其詳,請閱[[{{MediaWiki:Listgrouprights-helppage}}|此文]]。",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">權授矣</span>\n* <span class=\"listgrouprights-revoked\">權撤矣</span>",
+       "listgrouprights-key": "圖例:\n* <span class=\"listgrouprights-granted\">權授矣</span>\n* <span class=\"listgrouprights-revoked\">權撤矣</span>",
        "listgrouprights-group": "組",
        "listgrouprights-rights": "權",
        "listgrouprights-helppage": "Help:組權",
        "noemailtext": "此君無郵。",
        "nowikiemailtext": "此君謝收郵之。",
        "emailusername": "簿名:",
+       "emailusernamesubmit": "呈",
        "email-legend": "發郵至{{SITENAME}}之另一簿",
        "emailfrom": "自:",
        "emailto": "致:",
        "mywatchlist": "哨站",
        "watchlistfor2": "$1之哨 $2",
        "nowatchlist": "無哨",
-       "watchlistanontext": "$1以治哨",
+       "watchlistanontext": "登簿以治哨",
        "watchnologin": "未登簿",
        "addwatch": "增至哨站",
        "addedwatchtext": "\"[[:$1]]\"哨派矣。後有易、議者可見於[[Special:Watchlist|哨站]],且'''粗體'''列於[[Special:RecentChanges|近易]]。",
        "unblocked-id": "禁$1赦焉",
        "ipblocklist": "列禁簿",
        "ipblocklist-legend": "尋禁簿",
+       "blocklist-reason": "因:",
        "ipblocklist-submit": "尋",
        "ipblocklist-localblock": "本禁",
        "ipblocklist-otherblocks": "他{{PLURAL:$1|禁|禁}}",
        "unblocklink": "赦",
        "change-blocklink": "更",
        "contribslink": "勛",
+       "emaillink": "遣函",
        "autoblocker": "近日$1\"$2\";同子IP址,故禁焉。",
        "blocklogpage": "誌禁",
        "blocklog-showlog": "此簿曾被禁。誌禁示下:",
        "import-invalid-interwiki": "無乃定之wiki匯入。",
        "importlogpage": "誌入",
        "importlogpagetext": "秩入匯自他山之審。",
-       "import-logentry-upload": "[[$1]]上傳而匯",
        "import-logentry-upload-detail": "有審$1",
-       "import-logentry-interwiki": "互匯$1",
        "import-logentry-interwiki-detail": "$1審自$2",
        "tooltip-pt-userpage": "述平生、紹身家、銘字號",
        "tooltip-pt-anonuserpage": "君IP之舍",
        "spam_reverting": "還新審之無鏈$1者。",
        "spam_blanking": "審皆鏈$1,遂令白頁。",
        "pageinfo-header-restrictions": "頁錮",
+       "pageinfo-robot-index": "可",
+       "pageinfo-robot-noindex": "不可",
        "pageinfo-toolboxlink": "文訊",
        "markaspatrolleddiff": "派哨",
        "markaspatrolledtext": "哨此報",
        "bydate": "時序",
        "sp-newimages-showfrom": "自$1 $2賞新檔",
        "video-dims": "$1,$2矩$3",
+       "just-now": "方",
+       "hours-ago": "$1時前",
+       "yesterday-at": "昨日於 $1",
        "bad_image_list": "僅取表件,冠「*」者也。格式如下:\n\n單列數鏈,首通壞檔;而後所鏈之文,允圖見於其內。",
        "metadata": "補註",
        "metadata-help": "此檔補註,製者所添,如相機、掃描之器;後若更檔,補註不誠也。",
index 2c424ba..6a285b3 100644 (file)
        "import-rootpage-nosubpage": "Именскиот простор „$1“ на основната страница не допушта потстраници.",
        "importlogpage": "Дневник на увезувања",
        "importlogpagetext": "Административно увезување на страници со историја на уредување од други викија.",
-       "import-logentry-upload": "увезена [[$1]] со подигање на податотека",
        "import-logentry-upload-detail": "{{PLURAL:$1|Увезена е една преработка|Увезени се $1 преработки}}",
-       "import-logentry-interwiki": "трансвикифиран $1",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|Увезена е една преработка|Увезени се $1 преработки}} од $2",
        "javascripttest": "Проба на JavaScript",
        "javascripttest-pagetext-noframework": "Оваа страница е резервирана за вршење на проби со JavaScript.",
        "logentry-block-reblock": "$1 {{GENDER:$2|го измени}} блокот на {{GENDER:$4|$3}} со истек $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|го блокираше}} {{GENDER:$4|$3}} со истек $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|го измени}} блокот на {{GENDER:$4|$3}} со истек $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|ја увезе}} $3 со податотечно подигање",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|ја увезе}} $3 од друго вики",
        "logentry-merge-merge": "$1 {{GENDER:$2|ја припои}} $3 кон $4 (преработки сè до $5)",
        "logentry-move-move": "$1 {{GENDER:$2|ја премести}} страницата $3 на $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|ја премести}} страницата $3 на $4 без да остави пренасочување",
index e80f071..b440cbd 100644 (file)
        "import-rootpage-nosubpage": "മൂലതാളിന്റെ നാമമേഖലയായ \"$1\" ഉപതാളുകൾ അനുവദിക്കുന്നില്ല.",
        "importlogpage": "ഇറക്കുമതി പ്രവർത്തനരേഖ",
        "importlogpagetext": "മറ്റു വിക്കികളിൽ നിന്ന് താളുകൾ നാൾവഴിയടക്കം എടുക്കുന്ന കാര്യനിർവാഹക ഇറക്കുമതി.",
-       "import-logentry-upload": "പ്രമാണ അപ്‌‌ലോഡ് വഴി [[$1]] ഇറക്കുമതി ചെയ്തിരിക്കുന്നു",
        "import-logentry-upload-detail": "{{PLURAL:$1|ഒരു പതിപ്പ്|$1 പതിപ്പുകൾ}} ഇറക്കുമതി ചെയ്തു",
-       "import-logentry-interwiki": "$1 അന്തർവിക്കി ഇറക്കുമതി ചെയ്തു",
        "import-logentry-interwiki-detail": "$2 എന്നതിൽ നിന്ന് {{PLURAL:$1|ഒരു പതിപ്പ്|$1 പതിപ്പുകൾ}} ഇറക്കുമതി ചെയ്തു",
        "javascripttest": "ജാവാസ്ക്രിപ്റ്റ് പരീക്ഷണം",
        "javascripttest-pagetext-noframework": "ഈ താൾ ജാവാസ്ക്രിപ്റ്റ് പരീക്ഷണങ്ങൾ നടത്താനായി മാറ്റിവെച്ചിരിക്കുന്നതാണ്.",
        "tags-create-reason": "കാരണം:",
        "tags-create-submit": "സൃഷ്ടിക്കുക",
        "tags-create-no-name": "റ്റാഗിന്റെ പേര് വ്യക്തമാക്കേണ്ടതുണ്ട്.",
+       "tags-create-warnings-above": "\"$1\" എന്ന ടാഗ് സൃഷ്ടിക്കാൻ ശ്രമിക്കുമ്പോൾ താഴെക്കൊടുത്തിരിക്കുന്ന {{PLURAL:$2|മുന്നറിയിപ്പ്|മുന്നറിയിപ്പുകൾ}} വന്നു:",
        "tags-delete-reason": "കാരണം:",
        "tags-activate-reason": "കാരണം:",
        "tags-activate-submit": "സജ്ജമാക്കുക",
        "logentry-newusers-create2": "$3 എന്ന ഉപയോക്തൃ അംഗത്വം $1 {{GENDER:$2|സൃഷ്ടിച്ചിരിക്കുന്നു}}",
        "logentry-newusers-byemail": "$3 എന്ന ഉപയോക്തൃ അംഗത്വം $1 {{GENDER:$2|സൃഷ്ടിച്ചിരിക്കുന്നു}}, രഹസ്യവാക്ക് ഇമെയിൽ വഴി അയച്ചു",
        "logentry-newusers-autocreate": "$1 എന്ന ഉപയോക്തൃ അംഗത്വം സ്വയം {{GENDER:$2|സൃഷ്ടിക്കപ്പെട്ടിരിക്കുന്നു}}",
-       "logentry-rights-rights": "$3 à´\8eà´¨àµ\8dà´¨ à´\89പയàµ\8bà´\95àµ\8dതാവിനàµ\8dà´±àµ\86 à´¸à´\82à´\98 à´\85à´\82à´\97à´¤àµ\8dà´µà´\82, $4 à´\8eà´¨àµ\8dനതിൽ à´¨à´¿à´¨àµ\8dà´¨àµ\81 $5 à´\8eà´¨àµ\8dനതിലàµ\87à´\95àµ\8dà´\95àµ\81, $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
+       "logentry-rights-rights": "$3 à´\8eà´¨àµ\8dà´¨ à´\89പയàµ\8bà´\95àµ\8dതാവിനàµ\8dà´±àµ\86 à´¸à´\82à´\98 à´\85à´\82à´\97à´¤àµ\8dà´µà´\82, $4 à´\8eà´¨àµ\8dനതിൽ à´¨à´¿à´¨àµ\8dà´¨àµ\81 $5 à´\8eà´¨àµ\8dനതിലàµ\87à´\95àµ\8dà´\95àµ\8d, $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
        "logentry-rights-rights-legacy": "$3 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
        "logentry-rights-autopromote": "$1 എന്ന ഉപയോക്താവ് $4 എന്നതിൽ നിന്നും $5 എന്നതിലേയ്ക്ക് സ്വയമേവ {{GENDER:$2|ഉയർത്തപ്പെട്ടിരിക്കുന്നു}}",
        "logentry-upload-upload": "$1 $3 {{GENDER:$2|അപ്‌ലോഡ് ചെയ്തു}}",
index 69d8ab9..4d523bc 100644 (file)
@@ -44,7 +44,8 @@
                        "संतोष दहिवळ",
                        "아라",
                        "BPositive",
-                       "Darshan kandolkar"
+                       "Darshan kandolkar",
+                       "Steinsplitter"
                ]
        },
        "tog-underline": "दुव्यांचे अधोरेखन:",
        "otherlanguages": "इतर भाषांत",
        "redirectedfrom": "($1 पासून पुनर्निर्देशित)",
        "redirectpagesub": "पुनर्निर्देशनाचे पान",
+       "redirectto": "येथे पुनर्निर्देशित करा:",
        "lastmodifiedat": "या पानातील शेवटचा बदल $1 रोजी $2 वाजता केला गेला.",
        "viewcount": "हे पान {{PLURAL:$1|एकदा|$1 वेळा}} बघितले गेलेले आहे.",
        "protectedpage": "सुरक्षित पृष्ठ",
        "disclaimers": "उत्तरदायित्वास नकार",
        "disclaimerpage": "Project: सर्वसाधारण उत्तरदायकत्वास नकार",
        "edithelp": "संपादन साहाय्य",
-       "mainpage": "मुखपृष्ठ",
+       "mainpage": "'मुखपृष्ठ",
        "mainpage-description": "मुखपृष्ठ",
        "policy-url": "Project:नीती",
        "portal": "समाज मुखपृष्ठ",
        "gotaccountlink": "सनोंद-प्रवेश करा",
        "userlogin-resetlink": "सनोंद-प्रवेश तपशील विसरला असाल तर येथे टिचकी मारा.",
        "userlogin-resetpassword-link": "आपला परवलीचा शब्द विसरलात?",
+       "userlogin-helplink2": "सनोंद प्रवेशासंबंधी मदत",
        "userlogin-loggedin": "आपण पुर्वीच {{GENDER:$1|$1}} म्हणून सनोंद प्रवेशित आहात.वेगळ्या सदस्यनावाने सनोंद प्रवेशासाठी खालील आवेदन वापरा.",
        "userlogin-createanother": "दुसरे नवीन खाते तयार करा",
        "createacct-emailrequired": "विपत्र पत्ता(ई-मेल)",
        "token_suffix_mismatch": "'''तुमचे संपादन रद्द करण्यात आलेले आहे कारण तुमच्या क्लायंटनी तुमच्या संपादनातील उद्गारवाचक चिन्हांमध्ये (punctuation) बदल केलेले आहेत.\nपानातील मजकूर खराब होऊ नये यासाठी संपादन रद्द करण्यात आलेले आहे.\nअसे कदाचित तुम्ही अनामिक proxy वापरत असल्याने होऊ शकते.'''",
        "edit_form_incomplete": "'''तुमच्या संपादनाचा काही भाग सर्व्हरपर्यंत पोचला नाही; तुमचे संपादन पूर्ण आहे का याची पुन्हा खात्री करा व पुन्हा प्रयत्न करा.'''",
        "editing": "$1 चे संपादन होत आहे.",
-       "creating": "$1 à¤\9aà¥\80 à¤¨à¤¿à¤°à¥\8dमणà¥\80",
+       "creating": "$1 à¤¯à¤¾ à¤²à¥\87à¤\96ाà¤\9aà¥\80 à¤¨à¤¿à¤°à¥\8dमितà¥\80 à¤¸à¥\81रà¥\82 à¤\86हà¥\87",
        "editingsection": "$1 (विभाग) संपादन",
        "editingcomment": "$1 चे संपादन (प्रतिक्रिया)",
        "editconflict": "संपादन मतभेद: $1",
        "templatesusedpreview": "या झलकेमध्ये {{PLURAL:$1|वापरलेला साचा|वापरलेले साचे}}:",
        "templatesusedsection": "या विभागामध्ये {{PLURAL:$1|वापरलेला साचा|वापरलेले साचे}}:",
        "template-protected": "(सुरक्षित)",
-       "template-semiprotected": "(à¤\85रà¥\8dध-सà¥\81रà¤\95à¥\8dषà¥\80त)",
+       "template-semiprotected": "(à¤\85रà¥\8dध-सà¥\81रà¤\95à¥\8dषित)",
        "hiddencategories": "हे पान खालील {{PLURAL:$1|एका लपविलेल्या वर्गामध्ये|$1 लपविलेल्या वर्गांमध्ये}} आहे:",
        "nocreatetext": "{{SITENAME}}वर नवीन लेख लिहिण्यास मज्जाव करण्यात आलेला आहे. आपण परत जाऊन अस्तित्वात असलेल्या लेखांचे संपादन करू शकता अथवा [[Special:UserLogin|नवीन सदस्यत्व घ्या/ प्रवेश करा]].",
        "nocreate-loggedin": "येथे तुम्हाला नवीन पाने बनवण्याची परवानगी नाही.",
        "import-rootpage-nosubpage": "\"$1\" नामविश्वाची मुल पाने, उपपानास परवानगी देत नाही.",
        "importlogpage": "ईम्पोर्ट सूची",
        "importlogpagetext": "इतर विकिक्डून पानांची, संपादकीय इतिहासासहीत, प्रबंधकीय आयात.",
-       "import-logentry-upload": "संचिका चढवल्याने [[$1]] आयात",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|आवर्तन|आवर्तने}}",
-       "import-logentry-interwiki": "आंतरविकिकरण $1",
        "import-logentry-interwiki-detail": "$2 पासून $1 {{PLURAL:$1|आवर्तन|आवर्तने}}",
        "javascripttest": "जावा स्क्रिप्ट तपासणी",
        "javascripttest-pagetext-noframework": "हे पान जावा स्क्रिप्ट तपासणी साठी सुरक्षित केले आहे",
index ad17a83..2a70e08 100644 (file)
        "import-rootpage-nosubpage": "'O namespace \"$1\" d' 'a pàggena princepale nun permette 'e sottopaggene.",
        "importlogpage": "Riggistro 'e mpurtaziune",
        "importlogpagetext": "Mpurtaziune ammenistrative 'e paggene c' 'a storia 'e cagnamiente 'e l'ati wiki.",
-       "import-logentry-upload": "ha mpurtato [[$1]] trammeto upload",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|verzione|verziune}} mpurtate",
-       "import-logentry-interwiki": "trasferito 'a n'ata wiki 'a paggena $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|verzione|verziune}} mpurtate 'a $2",
        "javascripttest": "Test JavaScript",
        "javascripttest-pagetext-noframework": "Sta paggena è riservata pe' l'esecuziune d' 'e test 'e Javascript.",
        "logentry-block-reblock": "$1 {{GENDER:$2|ave cagnato}} 'e mpustaziune 'e blocco pe' {{GENDER:$4|$3}} cu na scadenza 'e $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|ave bluccato}} {{GENDER:$4|$3}} cu na scadenza 'e $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|cagnaje}} 'e mpustaziune 'e blocco 'e {{GENDER:$4|$3}} ch' 'ammaturasse a nu $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|ave mpurtato}} $3 pe' bbìa d' 'a carreca",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|ave mpurtato}} $3 pe' bbìa 'e n'atu wiki",
        "logentry-merge-merge": "$1 {{GENDER:$2|aunito|aunita}} $3 int' 'a $4 (verziune nzin' 'a $5)",
        "logentry-move-move": "$1 {{GENDER:$2|muvette}} paggena $3 a $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|muvette}} paggena $3 a $4 senza lassà nu redirezionamiento",
index 125d15d..0ad7c89 100644 (file)
        "import-rootpage-nosubpage": "Navnerommet \"$1\" til grunnsiden tillater ikke undersider.",
        "importlogpage": "Importlogg",
        "importlogpagetext": "Administrativ import av sider med redigeringshistorikk fra andre wikier.",
-       "import-logentry-upload": "importerte [[$1]] ved opplasting",
        "import-logentry-upload-detail": "{{PLURAL:$1|\\Én revisjon|$1 revisjoner}} er importert",
-       "import-logentry-interwiki": "transwikiimporterte $1",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|Én revisjon|$1 revisjoner}} er importert fra $2",
        "javascripttest": "JavaScript-testing",
        "javascripttest-pagetext-noframework": "Denne siden er reservert for å kjøre JavaScript-tester.",
index 7217d1f..a3ff20d 100644 (file)
        "import-rootpage-nosubpage": "In de naamruumte \"$1\" van de baosiszied is t anmaken van onderziejen niet meugelik.",
        "importlogpage": "Invoerlogboek",
        "importlogpagetext": "Administratieve invoer van ziejen mit geschiedenisse van aandere wiki's.",
-       "import-logentry-upload": "hef [[$1]] in-evoerd",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|versie|versies}}",
-       "import-logentry-interwiki": "transwiki $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versie|versies}} van $2",
        "javascripttest": "JavaScript testen",
        "javascripttest-pagetext-noframework": "Disse zied is ereserveerd veur t uutvoeren van JavaScript-testen.",
        "revdelete-uname-unhid": "gebrukersnaam zichtbaor emaakt",
        "revdelete-restricted": "hef beparkingen an beheerders op-eleg",
        "revdelete-unrestricted": "hef beparkingen veur beheerders deraof ehaold",
+       "logentry-block-block": "$1 {{GENDER:$2|hef}} {{GENDER:$4|$3}} eblokkeerd veur de duur van $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|hef}} {{GENDER:$4|$3}} eblokkeerd veur de duur van $5 $6",
        "logentry-move-move": "$1 hef de zied $3 {{GENDER:$2|herneumd}} naor $4",
        "logentry-move-move-noredirect": "$1 hef de zied $3 {{GENDER:$2|herneumd}} naor $4 zonder n deurverwiezing achter te laoten",
        "logentry-move-move_redir": "$1 hef de zied $3 {{GENDER:$2|herneumd}} naor $4 over n deurverwiezing heer",
index 6848d71..f8301c3 100644 (file)
        "import-invalid-interwiki": "Ut dat angevene Wiki is en Import nich mööglich.",
        "importlogpage": "Import-Logbook",
        "importlogpagetext": "Administrativen Import vun Sieden mit Versionsgeschicht vun annere Wikis.",
-       "import-logentry-upload": "hett „[[$1]]“ ut Datei importeert",
        "import-logentry-upload-detail": "{{PLURAL:$1|ene Version|$1 Versionen}}",
-       "import-logentry-interwiki": "hett „$1“ importeert (Transwiki)",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|ene Version|$1 Versionen}} vun $2",
        "tooltip-pt-userpage": "Dien Brukersied",
        "tooltip-pt-anonuserpage": "De Brukersiet för de IP-Adress ünner de du schriffst",
        "sqlite-no-fts": "$1 ahn Stöhn för Vulltext-Söök",
        "revdelete-restricted": "Inschränkungen för Administraters instellt",
        "revdelete-unrestricted": "Inschränkungen för Administraters rutnahmen",
+       "logentry-block-block": "$1 {{GENDER:$2|block}} {{GENDER:$4|$3}} för en Tiedruum vun $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|block}} {{GENDER:$4|$3}} för en Tiedruum vun $5 $6",
        "rightsnone": "(kene)",
        "revdelete-summary": "Tosamenfaten",
        "searchsuggest-search": "Söken",
index a627e48..807711c 100644 (file)
@@ -14,7 +14,8 @@
                        "Reedy",
                        "ne.wikipedia.org sysops",
                        "सरोज कुमार ढकाल",
-                       "아라"
+                       "아라",
+                       "Steinsplitter"
                ]
        },
        "tog-underline": "सम्बन्ध निम्न रेखाङ्कन:",
        "disclaimers": "अस्विकारोक्तिहरु",
        "disclaimerpage": "Project:सामान्य अस्वीकारोक्ति",
        "edithelp": "सम्पादन सहायता",
-       "mainpage": "मुख्य पृष्ठ",
-       "mainpage-description": "मुख्य पृष्ठ",
+       "mainpage": "'गृह पृष्ठ",
+       "mainpage-description": "'गृह पृष्ठ",
        "policy-url": "Project:निति",
        "portal": "सामाजिक पोर्टल",
        "portal-url": "Project:सामाजिक पोर्टल",
        "import-invalid-interwiki": "खुलाइएको विकिबाट आयात गर्न सकिएन",
        "importlogpage": "आयात सूची",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|संशोधन|संशोधनहरु}}",
-       "import-logentry-interwiki": " $1लाई अन्तरविकिकरण गरियो",
        "import-logentry-interwiki-detail": "$2 देखि $1 {{PLURAL:$1|पुनरावलोकन|पुनरावलोकनहरु}}",
        "tooltip-pt-userpage": "तपाईको प्रयोगकर्ता पृष्ठ",
        "tooltip-pt-anonuserpage": "तपाईले जुन IP ठेगानाको रुपमा सम्पादन गर्दै हुनुहुन्छ , त्यसको प्रयोगकर्ता पृष्ठ निम्न छ :",
index 9c51af0..18e08e8 100644 (file)
        "import-rootpage-nosubpage": "In de naamruimte \"$1\" van de basispagina is het aanmaken van subpagina's niet mogelijk.",
        "importlogpage": "Importlogboek",
        "importlogpagetext": "Administratieve import van pagina's met geschiedenis van andere wiki's.",
-       "import-logentry-upload": "heeft [[$1]] geïmporteerd via een bestandsupload",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|versie|versies}} geïmporteerd",
-       "import-logentry-interwiki": "importeerde $1 via transwiki",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versie|versies}} geïmporteerd uit $2",
        "javascripttest": "JavaScript testen",
        "javascripttest-pagetext-noframework": "Deze pagina is gereserveerd voor het uitvoeren van JavaScripttesten.",
index 3cb8770..565638a 100644 (file)
        "blocklogpage": "Blokkeringslogg",
        "blocklog-showlog": "Denne brukaren har tidlegare vorte blokkert.\nBlokkeringsloggen er sett opp nedanfor, som referanse.",
        "blocklog-showsuppresslog": "Denne brukaren har tidlegare vorte blokkert og skjult.\nLoggføringa er synt nedanfor som referanse:",
-       "blocklogentry": "Blokkerte «[[$1]]» med opphøyrstid $2 $3",
+       "blocklogentry": "blokkerte [[$1]] med opphøyrstid $2 $3",
        "reblock-logentry": "endra blokkeringsinnstillingar for [[$1]] med tida $2 $3",
        "blocklogtext": "Dette er ein logg over blokkeringar og oppheving av blokkeringar gjorde.\nIP-adresser som blir automatisk blokkerte er ikkje lista her. Sjå [[Special:BlockList|blokkeringslista]] for alle aktive blokkeringar.",
        "unblocklogentry": "oppheva blokkering av «$1»",
        "import-rootpage-nosubpage": "Namnerommet «$1» til rotsida tillèt ikkje undersider.",
        "importlogpage": "Importeringslogg",
        "importlogpagetext": "Administrativ import av sider med endringshistorikk frå andre wikiar.",
-       "import-logentry-upload": "importerte [[$1]] frå opplasta fil",
        "import-logentry-upload-detail": "{{PLURAL:$1|Éin versjon|$1 versjonar}}",
-       "import-logentry-interwiki": "overførte $1 mellom wikiar",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|Éin versjon|$1 versjonar}} frå $2",
        "javascripttest": "JavaScript-utrøyning",
        "javascripttest-pagetext-noframework": "Sida er reservert for køyring av JavaScript-utrøyningar.",
        "spam_reverting": "Attenderullar til siste versjon utan lenkje til $1",
        "spam_blanking": "Alle versjonar inneheldt lenkje til $1, tømmer sida",
        "spam_deleting": "Alle versjonane inneheldt lenkjer til $1, slettar.",
-       "simpleantispam-label": "Antispam-kontroll.\n'''IKKJE''' fyll ut dette feltet!",
+       "simpleantispam-label": "Antispam-kontroll.\n<strong>IKKJE</strong> fyll ut dette feltet!",
        "pageinfo-title": "Informasjon om «$1»",
        "pageinfo-not-current": "Diverre er det umogeleg å gje ut denne informasjonen for gamle versjonar.",
        "pageinfo-header-basic": "Grunnleggjande informasjon",
index f456f43..b4cb832 100644 (file)
        "import-rootpage-nosubpage": "L'espaci de noms « $1 » de la pagina raiç autoriza pas las sospaginas.",
        "importlogpage": "Istoric de las importacions de paginas",
        "importlogpagetext": "Impòrts administratius de paginas amb l’istoric a partir dels autres wikis.",
-       "import-logentry-upload": "a importat [[$1]] per mandadís de fichièr",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|revision importada|revisions importadas}}",
-       "import-logentry-interwiki": "a importat $1 d'un wiki a l'autre",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision importada|revisions importadas}} dempuèi $2",
        "javascripttest": "Tèst de JavaScript",
        "javascripttest-pagetext-noframework": "Aquesta pagina es reservada per l'execucion dels tèsts JavaScript.",
index ab5f183..fa54c0e 100644 (file)
        "mypreferencesprotected": "ਤੁਹਾਨੂੰ ਆਪਣੀਆਂ ਪਸੰਦਾਂ ਵਿੱਚ ਸੋਧ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "ns-specialprotected": "ਖ਼ਾਸ ਸਫ਼ਿਆਂ ’ਚ ਫੇਰ-ਬਦਲ ਨਹੀਂ ਹੋ ਸਕਦੇ।",
        "titleprotected": "ਇਹ ਸਿਰਲੇਖ [[User:$1|$1]] ਵੱਲੋਂ ਸੁਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ ਹੈ ਅਤੇ ਵਰਤਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ। ਦਿੱਤਾ ਹੋਇਆ ਕਾਰਨ ਹੈ, \"''$2''\"।",
-       "filereadonlyerror": "\"$1\" à¨«à¨¼à¨¾à¨\88ਲ à¨µà¨¿à©±à¨\9a à¨¤à¨¬à¨¦à©\80ਲà©\80 à¨¨à¨¹à©\80à¨\82 à¨¹à©\8b à¨¸à¨\95ਦà©\80 à¨\95ਿà¨\89à¨\82à¨\95ਿ à¨«à¨¼à¨¾à¨\88ਲ à¨­à©°à¨¡à¨¾à¨° \"$2\" à¨¸à¨¿à¨°à¨«à¨¼ à¨µà©\87à¨\96ਣਯà©\8bà¨\97 à¨°à©\82ਪ à¨µà¨¿à¨\9a à¨¹à©\88।\n\nà¨\89ਹ à¨ªà©\8dਰਬੰਧà¨\95, à¨\9cਿਹਨੇ ਇਹ ਰੋਕ ਲਾਈ ਹੈ, ਦਾ ਕਹਿਣਾ ਹੈ: ''$3''",
+       "filereadonlyerror": "\"$1\" à¨«à¨¼à¨¾à¨\88ਲ à¨µà¨¿à©±à¨\9a à¨¤à¨¬à¨¦à©\80ਲà©\80 à¨¨à¨¹à©\80à¨\82 à¨¹à©\8b à¨¸à¨\95ਦà©\80 à¨\95ਿà¨\89à¨\82à¨\95ਿ à¨«à¨¼à¨¾à¨\88ਲ à¨­à©°à¨¡à¨¾à¨° \"$2\" à¨¸à¨¿à¨°à¨«à¨¼ à¨µà©\87à¨\96ਣਯà©\8bà¨\97 à¨°à©\82ਪ à¨µà¨¿à¨\9a à¨¹à©\88।\n\nà¨\89ਹ à¨ªà©\8dਰਬੰਧà¨\95, à¨\9cਿਸਨੇ ਇਹ ਰੋਕ ਲਾਈ ਹੈ, ਦਾ ਕਹਿਣਾ ਹੈ: ''$3''",
        "invalidtitle-knownnamespace": "ਥਾਂ-ਨਾਮ \"$2\" ਅਤੇ ਲਿਖਤ \"$3\" ਵਾਲ਼ਾ ਗ਼ਲਤ ਸਿਰਲੇਖ",
        "invalidtitle-unknownnamespace": "ਅਣਜਾਣ ਨਾਂ-ਸਥਾਨ ਗਿਣਤੀ $1 ਅਤੇ ਲਿਖਤ $2 ਵਾਲ਼ਾ ਗ਼ਲਤ ਸਿਰਲੇਖ",
        "exception-nologin": "ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ",
        "import-invalid-interwiki": "ਦੱਸੇ ਹੋਏ ਵਿਕੀ ਤੋਂ ਮੰਗਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।",
        "importlogpage": "ਮੰਗਾਉਣ ਦਾ ਚਿੱਠਾ",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|ਸੁਧਾਈ|ਸੁਧਾਈਆਂ}} ਦੀ ਦਰਾਮਦ ਹੋਈ",
-       "import-logentry-interwiki": "$1 ਦੀ ਵਿਕੀ-ਪਾਰ ਘੱਲਿਆ",
        "tooltip-pt-userpage": "ਤੁਹਾਡਾ ਵਰਤੋਂਕਾਰ ਸਫ਼ਾ",
        "tooltip-pt-mytalk": "ਤੁਹਾਡਾ ਗੱਲ-ਬਾਤ ਸਫ਼ਾ",
        "tooltip-pt-anontalk": "ਇਸ IP ਪਤੇ ਤੋਂ ਹੋਈਆਂ ਸੋਧਾਂ ਬਾਰੇ ਚਰਚਾ",
index 8144095..273497b 100644 (file)
        "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-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]].",
        "import-rootpage-nosubpage": "Przestrzeń nazw \"$1\" strony głównej nie dopuszcza stron podrzędnych.",
        "importlogpage": "Rejestr importu",
        "importlogpagetext": "Rejestr przeprowadzonych importów stron z innych serwisów wiki.",
-       "import-logentry-upload": "zaimportował(a) [[$1]] przez pobieranie plików",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|wersja|wersje|wersji}}",
-       "import-logentry-interwiki": "zaimportował(a) $1 używając transwiki",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|wersja|wersje|wersji}} z $2",
        "javascripttest": "Testowanie JavaScript",
        "javascripttest-pagetext-noframework": "Ta strona jest zarezerwowana dla wykonywania testów JavaScript.",
        "logentry-block-reblock": "$1 {{GENDER:$2|zmienił|zmieniła}} ustawienia blokady dla {{GENDER:$4|$3}}, czas blokady: $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|zablokował|zablokowała}} {{GENDER:$4|$3}}, czas blokady: $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|zmienił|zmieniła}} ustawienia blokady dla {{GENDER:$4|$3}}, czas blokady: $5 $6",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|zaimportował|zaimportowała}} $3 z innej wiki",
        "logentry-merge-merge": "$1 {{GENDER:$2|scalił|scaliła}} stronę $3 do $4 (wersje do $5)",
        "logentry-move-move": "$1 {{GENDER:$2|przeniósł|przeniosła}} stronę $3 do $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|przeniósł|przeniosła}} stronę $3 na $4, bez pozostawienia przekierowania pod starym tytułem",
index c3de600..2fa50f4 100644 (file)
        "import-rootpage-nosubpage": "Lë spassi nominal «$1» ëd la pàgina prinsipal a përmët pa dle sot-pagine.",
        "importlogpage": "Registr dj'amportassion",
        "importlogpagetext": "Amportassion aministrative ëd pàgine e ëd soa stòria da dj'àutre wiki.",
-       "import-logentry-upload": "a l'ha amportà [[$1]] con un càrich d'archivi",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|revision}} amportà",
-       "import-logentry-interwiki": "Amportà da n'àutra wiki $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision}} amportà da $2",
        "javascripttest": "Preuva ëd JavaScript",
        "javascripttest-pagetext-noframework": "Costa pàgina a l'é arservà për fé dle preuve JavaScript.",
        "logentry-block-reblock": "$1 {{GENDER:$2|a l'ha modificà}} ij paràmeter ëd blocagi për {{GENDER:$4|$3}} con na durà ëd $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|a l'ha blocà}} {{GENDER:$4|$3}} për na durà ëd $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|a l'ha modificà}} ij paràmeter ëd blocagi për {{GENDER:$4|$3}} con na durà ëd $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|a l'ha amportà}} $3 an cariand d'archivi",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|a l'ha amportà}} $3 da n'àutra wiki",
        "logentry-merge-merge": "$1 {{GENDER:$2|a l'ha gionzù}} $3 an $4 (revision fin-a a $5)",
        "logentry-move-move": "$1 {{GENDER:$2|a l'ha tramudà}} la pàgina $3 a $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|a l'ha tramudà}} la pàgina $3 a $4 sensa lassé na ridiression",
index 983352e..64ab279 100644 (file)
        "searchprofile-advanced-tooltip": "د خپل خوښې په نوم-تشيالونو کې پلټل",
        "search-result-size": "$1 ({{PLURAL:$2|1 ويی|$2 وييونه}})",
        "search-result-category-size": "{{PLURAL:$1|1 غړی|$1 غړي}} ({{PLURAL:$2|1 څېرمه وېشنيزه|$2 څېرمه وېشنيزې}}، {{PLURAL:$3|1 دوتنه|$3 دوتنې}})",
-       "search-redirect": "(د $1 Ù\85Ø® Ú«Ø±Ú\81Ù\88نه)",
+       "search-redirect": "(د $1 Ù\85Ø® Ú¯Ø±Ú\81Û\90دنه)",
        "search-section": "(برخه $1)",
        "search-category": "(وېشنيزه $1)",
        "search-file-match": "(د دوتنو مېنځپانگې سره ورته دي)",
index 846b3f7..0616cfb 100644 (file)
        "import-rootpage-nosubpage": "O espaço nominal $1 da página principal não permite subpáginas.",
        "importlogpage": "Registro de importações",
        "importlogpagetext": "Importações administrativas de páginas com a preservação do histórico de edição de outros wikis.",
-       "import-logentry-upload": "importou [[$1]] através de arquivo de importação",
        "import-logentry-upload-detail": "{{PLURAL:$1|uma edição|$1 edições}}",
-       "import-logentry-interwiki": "transwiki $1",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|$1 edição|$1 edições}} de $2",
        "javascripttest": "Teste de JavaScript",
        "javascripttest-pagetext-noframework": "Esta página é exclusiva para testes de JavaScript.",
index bb61551..4293f11 100644 (file)
        "import-rootpage-nosubpage": "O domínio \"$1\" da página de raiz não permite subpáginas.",
        "importlogpage": "Registo de importações",
        "importlogpagetext": "Importações administrativas de páginas com a preservação do histórico de edição de outras wikis.",
-       "import-logentry-upload": "importou [[$1]] por carregamento de ficheiro",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|edição importada|edições importadas}}",
-       "import-logentry-interwiki": "transwikis $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|edição importada|edições importadas}} de $2",
        "javascripttest": "Teste de JavaScript",
        "javascripttest-pagetext-noframework": "Esta página é reservada para a execução de testes de JavaScript.",
        "log-description-managetags": "Esta página lista as tarefas de gestão relacionadas com [[Special:Tags|etiquetas]]. O registo contém apenas ações realizadas manualmente por um administrador; etiquetas podem ser criadas ou eliminadas pelo ''software'' da wiki sem uma entrada a ser gravada neste registo.",
        "logentry-managetags-create": "$1 {{GENDER:$2|criou}} a etiqueta \"$4\"",
        "logentry-managetags-delete": "$1 {{GENDER:$2|eliminou}} a etiqueta \"$4\" (removida de $5 {{PLURAL:$5|edição ou entrada de registo|edições e/ou entradas de registo}})",
-       "logentry-managetags-activate": "$1 {{GENDER:$2|ativou}} a etiqueta \"$1\" para uso de utilizadores e robôs.",
-       "logentry-managetags-deactivate": "$1 {{GENDER:$2|desativou}} a etiqueta \"$1\" para uso de utilizadores e robôs.",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|ativou}} a etiqueta \"$4\" para uso de utilizadores e robôs.",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|desativou}} a etiqueta \"$4\" para uso de utilizadores e robôs.",
        "rightsnone": "(nenhum)",
        "revdelete-summary": "editar resumo",
        "feedback-adding": "A acrescentar os comentários à página...",
index 1761b18..1484107 100644 (file)
        "editingsection": "This message displays at the top of the page when a user is editing a page section. Parameters:\n* $1 - page name\n{{Related|Editing}}",
        "editingcomment": "This message displays at the top of the page when a user is creating a new section. Parameters:\n* $1 - page name\n{{Related|Editing}}",
        "editconflict": "Used as title of error message. Parameters:\n* $1 - page title",
+       "editnotice-notext": "{{ignored}}\nCustom message on top of the edit page if no edit notices apply to this page.",
        "explainconflict": "Appears at the top of a page when there is an edit conflict.\n\nSee also:\n* {{msg-mw|Savearticle}}",
        "yourtext": "Used in Diff Preview page. The diff is between {{msg-mw|currentrev}} and {{msg-mw|yourtext}}.\n\nAlso used in Edit Conflict page; the diff between {{msg-mw|yourtext}} and {{msg-mw|storedversion}}.",
        "storedversion": "This is used in an edit conflict as the label for the top revision that has been stored, as opposed to your version {{msg-mw|yourtext}} that has not been stored which is shown at the bottom of the page.",
        "import-rootpage-nosubpage": "Used on [[Special:Import]], when the import namespace does not support subpages. Parameters:\n* $1 is a namespace name.",
        "importlogpage": "{{doc-logpage}}",
        "importlogpagetext": "This text appears at the top of the [{{canonicalurl:Special:Log|type=import}} import log] special page.",
-       "import-logentry-upload": "This is the text of an entry in the Import log (and Recent Changes), after hour (and date, only in the Import log) and sysop name:\n* $1 is the name of the imported file",
+       "import-logentry-upload": "{{ignored}}This is ''logentry'' message only used on IRC.\n* $1 is the name of the imported file",
        "import-logentry-upload-detail": "Used as success message and log entry. Parameters:\n* $1 - number of succeeded revisions\nSee also:\n* {{msg-mw|Import-logentry-interwiki-detail}}",
-       "import-logentry-interwiki": "Used as action listed in the log. Parameters:\n* $1 - page title",
+       "import-logentry-interwiki": "{{ignored}}This is ''logentry'' message only used on IRC. Parameters:\n* $1 - page title",
        "import-logentry-interwiki-detail": "Used as success message and log entry. Parameters:\n* $1 - number of succeeded revisions\n* $2 - interwiki name\nSee also:\n* {{msg-mw|Import-logentry-upload-detail}}",
        "javascripttest": "Title of the special page [[Special:JavaScriptTest]].\n\nSee also:\n* {{msg-mw|Javascripttest|title}}\n* {{msg-mw|Javascripttest-pagetext-noframework|summary}}\n* {{msg-mw|Javascripttest-pagetext-unknownframework|error message}}",
        "javascripttest-backlink": "{{optional}}\nUsed as subtitle in [[Special:JavaScriptTest]]. Parameters:\n* $1 - page title",
        "logentry-block-reblock": "{{Logentry|[[Special:Log/block]]}}\n* $4 - user name for gender or empty string for autoblocks\n* $5 - the block duration, localized and formatted with the english tooltip\n* $6 - block detail flags or empty string\n\nCf. {{msg-mw|Reblock-logentry}}",
        "logentry-suppress-block": "{{Logentry}}\n* $4 - user name for gender or empty string for autoblocks\n* $5 - the block duration, localized and formatted with the english tooltip\n* $6 - block detail flags or empty string",
        "logentry-suppress-reblock": "{{Logentry}}\n* $4 - user name for gender or empty string for autoblocks\n* $5 - the block duration, localized and formatted with the english tooltip\n* $6 - block detail flags or empty string",
+       "logentry-import-upload": "{{Logentry|[[Special:Log/import]]}}",
+       "logentry-import-interwiki": "{{Logentry|[[Special:Log/import]]}}",
        "logentry-merge-merge": "{{Logentry|[[Special:Log/merge]]}}\n* $4 - the page into which the content is merged\n* $5 - a timestamp of limit\n\nThe log and its associated special page 'MergeHistory' is not enabled by default.\n\nPlease note that the parameters in a log entry will appear in the log only in the default language of the wiki. View [[Special:Log]] for examples on translatewiki.net with English default language.",
        "logentry-move-move": "{{Logentry|[[Special:Log/move]]}}\nParameter $4, the target page, is also not visible to parser functions.",
        "logentry-move-move-noredirect": "{{Logentry|[[Special:Log/move]]}}\nParameter $4, the target page, is also not visible to parser functions.",
index 0cd6e56..35f8049 100644 (file)
        "pool-timeout": "Tiembe d'attese scadute pu 'u blocche",
        "pool-queuefull": "'A code de le sondagge jè chiene",
        "pool-errorunknown": "Errore scanusciute",
+       "poolcounter-usage-error": "Errore d'ause: $1",
        "aboutsite": "Sus a {{SITENAME}}",
        "aboutpage": "Project:Sus a",
        "copyright": "'U condenute jè disponibile sotte a $1.",
        "disclaimers": "No ne sacce ninde",
        "disclaimerpage": "Project:Scareca uarrile",
        "edithelp": "Cangianne l'ajute",
+       "helppage-top-gethelp": "Aijute",
        "mainpage": "Pàgene Prengepàle",
        "mainpage-description": "Pàgene Prengepàle",
        "policy-url": "Project:Reghele",
        "hidetoc": "scunne",
        "collapsible-collapse": "Scunne",
        "collapsible-expand": "Spanne",
+       "confirmable-confirm": "{{GENDER:$1|Sì}} secure?",
        "confirmable-yes": "Sìne",
        "confirmable-no": "None",
        "thisisdeleted": "Vide o ripristine $1?",
        "readonly_lag": "'U database ha state automaticamende blocchete purcè le server de le database ca depennene da 'u master onne sciute in eccezzione",
        "internalerror": "Errore inderne",
        "internalerror_info": "Errore inderne: $1",
+       "internalerror-fatal-exception": "Eccezzione fatale d'u tipe \"$1\"",
        "filecopyerror": "Non ge pozze cupià 'u fail \"$1\" jndr'à \"$2\".",
        "filerenameerror": "Non ge pozze cangià 'u nome d'u fail \"$1\" jndr'à \"$2\".",
        "filedeleteerror": "Non ge pozze scangillà 'u fail \"$1\".",
        "thumbnail_gd-library": "Configurazione d'a libbrerie GD ingomblete: funziona perse $1",
        "thumbnail_image-missing": "'U file pare ca non ge se iacchie: $1",
        "import": "Pàggene 'mbortete",
-       "importinterwiki": "'Mborte da Transuicchi",
-       "import-interwiki-text": "Schacchie 'na Uicchi e 'nu titele de pàgene da 'mbortà.\nLe date d'a revisione e 'u nome de le cangiature avènene preservate.\nTutte le aziune de 'mbortaziune 'mbrà le Uicchi sonde reggistrate jndr'à l'[[Special:Log/import|archivije de le 'mbortaziune]].",
+       "importinterwiki": "'Mborte da 'n'otra uicchi",
+       "import-interwiki-text": "Schacchie 'na Uicchi e 'nu titole de pàgene da 'mbortà.\nLe date d'a revisione e 'u nome de le cangiature avènene preservate.\nTutte le aziune de 'mbortaziune 'mbrà le Uicchi sonde reggistrate jndr'à l'[[Special:Log/import|archivije de le 'mbortaziune]].",
        "import-interwiki-history": "Copie tutte 'a sotrie de le versiune de sta pàgene",
        "import-interwiki-templates": "Inglude tutte le template",
        "import-interwiki-submit": "'Mborte",
        "import-rootpage-nosubpage": "Namespace \"$1\" d'a pàgene prengepàle non ge permette le sottopàggene.",
        "importlogpage": "Archivie de le 'mbortaziune",
        "importlogpagetext": "'Mbortaziune amministrative de pàggene cu 'a storie de le cangiaminde da otre Uicchi.",
-       "import-logentry-upload": "'mbortete [[$1]] da 'u fail carechete",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|revisione|revisiune}} 'mbortate",
-       "import-logentry-interwiki": "transuicchied $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revisione|revisiune}} 'mbortate da $2",
        "javascripttest": "Test de JavaScript",
        "javascripttest-pagetext-noframework": "Sta pàgene jè riservate pe le esecuziune de le test de Javascript.",
index f42624c..2c3f2d8 100644 (file)
        "import-rootpage-nosubpage": "В пространстве имён указанной корневой страницы «$1» подстраницы запрещены.",
        "importlogpage": "Журнал импорта",
        "importlogpagetext": "Импортирование администраторами страниц с историей изменений из других вики.",
-       "import-logentry-upload": "«[[$1]]» — импорт из файла",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|версия импортирована|версии импортировано|версий импортировано}}",
-       "import-logentry-interwiki": "«$1» — межвики импорт",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|версия импортирована|версии импортировано|версий  импортировано}} из $2",
        "javascripttest": "Проверка JavaScript",
        "javascripttest-pagetext-noframework": "Эта страница зарезервирована для запуска JavaScript-тестов.",
        "logentry-upload-overwrite": "$1 загрузил{{GENDER:$2||а}} новую версию $3",
        "logentry-upload-revert": "$1 загрузил{{GENDER:$2||а}} $3",
        "log-name-managetags": "Журнал управления метками",
+       "log-description-managetags": "На этой странице перечислены задачи, связанные с управлением [[Special:Tags|метками]]. Журнал содержит только действия, выполненные администратором вручную. Метки могут быть созданы или удалены с помощью программного обеспечения вики без добавления записей в этот журнал.",
        "logentry-managetags-create": "$1 создал{{GENDER:$2||а}} метку «$4»",
+       "logentry-managetags-activate": "$1 активировал{{GENDER:$2||а}} метку «$4» для использования участниками и ботами",
+       "logentry-managetags-deactivate": "$1 отключил{{GENDER:$2||а}} метку «$4» для использования участниками и ботами",
        "rightsnone": "(нет)",
        "revdelete-summary": "описание изменений",
        "feedback-adding": "Добавление отзыва на страницу…",
index 829169e..f80a4b7 100644 (file)
        "import-rootpage-nosubpage": "मूलपुटस्य \"$1\" इति नामस्थाने उपपुटानि नानुमतानि ।",
        "importlogpage": "आयातसूचिका ।",
        "importlogpagetext": "अन्यविकितः सम्पादितेतिहाससहितानि प्रशासकानाम् आयातपुटानि ।",
-       "import-logentry-upload": "सञ्चिकाम् उत्तारयित्वा [[$1]] इत्यस्य आयातः कृतः ।",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|पुनरावृत्तिः}}",
-       "import-logentry-interwiki": "ट्रान्स्विकिकृतम् ।$1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|पुनरावृत्तिः}} $2 इत्येतस्मात् ।",
        "javascripttest": "जावालिपिपरीक्षणम् ।",
        "javascripttest-pagetext-noframework": "जावलिपिचालनपरीक्षार्थम् एतत्पुटम् आरक्षितम् ।",
index d97a8d8..92fc865 100644 (file)
        "import-rootpage-nosubpage": "U namespace \"$1\" dâ pàggina ràdica nun cunsenti suttapàggini.",
        "importlogpage": "Riggistru dî mpurtazzioni",
        "importlogpagetext": "Riggistru dî mpurtazzioni d'ufficiu di pàggini pruvinenti d'àutri wiki, cumpleti di cronoluggìa.",
-       "import-logentry-upload": "hà mpurtatu $1 tràmiti upload",
        "import-logentry-upload-detail": "{{PLURAL:$1|na virsioni mpurtata|$1 virsioni mpurtati}}",
-       "import-logentry-interwiki": "hà trasfiritu di àutra wiki la pàggina $1",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|na virsioni mpurtata|$1 virsioni mpurtati}} di $2",
        "javascripttest": "Virìfichi JavaScript",
        "javascripttest-pagetext-noframework": "Sta pàggina è risirvata pi' l'esicuzzioni dî virìfichi JavaScript.",
index 339c571..313ef92 100644 (file)
        "import-rootpage-nosubpage": "Menný priestor „$1“ koreňovej stránky nepodporuje podstránky.",
        "importlogpage": "Záznam importov",
        "importlogpagetext": "Administratívny import stránok vrátane histórie úprav z iných wiki.",
-       "import-logentry-upload": "importoval [[$1]] nahraním súboru",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|revízia|revízie|revízií}}",
-       "import-logentry-interwiki": "Transwiki import $1 úspešný",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revízia|revízie|revízií}} z $2",
        "javascripttest": "Testovanie JavaScriptu",
        "javascripttest-pagetext-noframework": "Táto stránka je vyhradená pre testy JavaScriptu.",
index eb079cb..d6ef5dd 100644 (file)
        "import-rootpage-nosubpage": "Imenski prostor »$1« korenske strani ne dovoli podstrani.",
        "importlogpage": "Dnevnik uvozov",
        "importlogpagetext": "Administrativni uvozi strani z zgodovino urejanja iz drugih wikijev.",
-       "import-logentry-upload": "uvozil [[$1]] z nalaganjem datoteke",
        "import-logentry-upload-detail": "{{PLURAL:$1|Uvožena $1 redakcija|Uvoženi $1 redakciji|Uvožene $1 redakcije|Uvoženih $1 redakcij}}",
-       "import-logentry-interwiki": "prenesel $1 med wikiji",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|Uvožena $1 redakcija|Uvoženi $1 redakciji|Uvožene $1 redakcije|Uvoženih $1 redakcij}} z $2",
        "javascripttest": "Preizkušanje JavaScripta",
        "javascripttest-pagetext-noframework": "Stran je rezervirana za poganjanje preizkusov JavaScript.",
        "logentry-block-reblock": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} nastavitve blokade za {{GENDER:$4|$3}} s časomspremenil poteka $5 $6",
        "logentry-suppress-block": "$1 je {{GENDER:$2|blokiral|blokirala|blokiral(-a)}} {{GENDER:$4|$3}} s časom poteka $5 $6",
        "logentry-suppress-reblock": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} nastavitve blokade za {{GENDER:$4|$3}} s časom poteka $5 $6",
+       "logentry-import-upload": "$1 je {{GENDER:$2|uvozil|uvozila|uvozil(-a)}} $3 z nalaganjem datoteke",
+       "logentry-import-interwiki": "$1 je {{GENDER:$2|uvozil|uvozila|uvozil(-a)}} $3 z drugega wikija",
        "logentry-merge-merge": "$1 je {{GENDER:$2|združil|združila|združil(-a)}} $3 z $4 (redakcije do $5)",
        "logentry-move-move": "$1 je {{GENDER:$2|premaknil|premaknila|premaknil(-a)}} stran $3 na $4",
        "logentry-move-move-noredirect": "$1 je {{GENDER:$2|prestavil|prestavila|prestavil(-a)}} stran $3 na $4 brez preusmeritve",
index 1fbf91c..688e526 100644 (file)
        "templatesused": "{{PLURAL:$1|Шаблон|Шаблони}} на овој страници:",
        "templatesusedpreview": "{{PLURAL:$1|Шаблон|Шаблони}} у овом прегледу:",
        "templatesusedsection": "{{PLURAL:$1|Шаблон|Шаблони}} у овом одељку:",
-       "template-protected": "(заштићен)",
-       "template-semiprotected": "(полузаштићен)",
+       "template-protected": "(заштићено)",
+       "template-semiprotected": "(полузаштићено)",
        "hiddencategories": "Ова страница је члан {{PLURAL:$1|једне скривене категорије|$1 скривене категорије|$1 скривених категорија}}:",
        "edittools": "<!-- Овај текст ће бити приказан испод обрасца за уређивање и отпремање. -->",
        "edittools-upload": "-",
        "history-feed-empty": "Тражена страница не постоји.\nМогуће да је обрисана с викија или је преименована.\nПокушајте да [[Special:Search|претражите вики]] за сличне странице.",
        "rev-deleted-comment": "(опис измене уклоњен)",
        "rev-deleted-user": "(корисничко име уклоњено)",
-       "rev-deleted-event": "(иÑ\81Ñ\82оÑ\80иÑ\98а Ñ\98е Ñ\83клоÑ\9aена)",
+       "rev-deleted-event": "(деÑ\82аÑ\99и Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÐ° Ñ\83клоÑ\9aени)",
        "rev-deleted-user-contribs": "[корисничко име или ИП адреса је уклоњена – измена је сакривена са списка доприноса]",
        "rev-deleted-text-permission": "Измена ове странице је '''обрисана'''.\nДетаље можете видети у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} историји брисања].",
        "rev-deleted-text-unhide": "Измена ове странице је '''обрисана'''.\nДетаље можете видети у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} историји брисања].\nИпак можете да [$1 видите ову измену] ако желите да наставите.",
        "unusedimages": "Некоришћене датотеке",
        "wantedcategories": "Тражене категорије",
        "wantedpages": "Тражене странице",
+       "wantedpages-summary": "Списак непостојећих страница са највише веза до њих, на овом списку се не налазе странице до којих воде преусмерења. За списак покварених преусмерења погледајте [[{{#special:BrokenRedirects}}]].",
        "wantedpages-badtitle": "Неисправан наслов у низу резултата: $1",
        "wantedfiles": "Тражене датотеке",
        "wantedfiletext-cat": "Следеће датотеке се користе, али не постоје. Датотеке из других ризница могу бити наведене иако не постоје. Такве датотеке ће бити <del>поништене</del> са списка. Поред тога, странице које садрже непостојеће датотеке се налазе [[:$1|овде]].",
        "listgrouprights-namespaceprotection-namespace": "Именски простор",
        "listgrouprights-namespaceprotection-restrictedto": "Права потребна за уређивање",
        "trackingcategories-name": "Име поруке",
+       "trackingcategories-desc": "Које странице се налазе у категорији",
+       "noindex-category-desc": "Странице које у себи имају магичну реч <code><nowiki>__NOINDEX__</nowiki></code>.",
+       "index-category-desc": "Странице које у себи имају магичну реч <code><nowiki>__INDEX__</nowiki></code> и самим тим су индексиране од стране робота.",
+       "broken-file-category-desc": "Странице које имају везе до непостојећих датотека.",
+       "hidden-category-category-desc": "Категорије које у себи имају магичну реч <code><nowiki>__HIDDENCAT__</nowiki></code> и самим тим се не приказују у одељку за категорије на страницама.",
        "trackingcategories-nodesc": "Опис није доступан.",
        "trackingcategories-disabled": "Категорија је онемогућена",
        "mailnologin": "Нема адресе за слање",
        "import-rootpage-nosubpage": "Именски простор „$1“ основне странице не дозвољава подстранице.",
        "importlogpage": "Дневник увоза",
        "importlogpagetext": "Административни увози страница с историјама измена с других викија.",
-       "import-logentry-upload": "је увезао [[$1]] отпремањем датотеке",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|измена увезена|измене увезене|измена увезено}}",
-       "import-logentry-interwiki": "је увезао $1 с другог викија",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|измена увезена|измене увезене|измена увезено}} из $2",
        "javascripttest": "Јаваскрипт тест",
        "javascripttest-pagetext-noframework": "Ова страница је резервисана за извршавање јаваскрипт тестова.",
        "tags-delete-title": "Брисање ознака",
        "tags-delete-explanation-initial": "Бришете ознаку „$1“ из базе података.",
        "tags-delete-reason": "Разлог:",
+       "tags-delete-submit": "Неповратно обриши ову ознаку",
        "tags-delete-not-found": "Ознака „$1“ не постоји.",
        "tags-activate-title": "Активирање ознака",
        "tags-activate-question": "Активирате ознаку „$1“.",
        "logentry-block-reblock": "$1 је {{GENDER:$2|променио|променила}} подешавања за блокирање {{GENDER:$4|корисника|кориснице}} {{GENDER:$4|$3}} у трајању од $5 $6",
        "logentry-suppress-block": "$1 је {{GENDER:$2|блокирао|блокирала}} {{GENDER:$4|$3}} у трајању од $5 $6",
        "logentry-suppress-reblock": "$1 је {{GENDER:$2|променио|променила}} подешавања за блокирање {{GENDER:$4|корисника|кориснице}} {{GENDER:$4|$3}} у трајању од $5 $6",
+       "logentry-import-upload": "$1 је {{GENDER:$2|увезао|увезла}} $3 отпремањем датотеке",
+       "logentry-import-interwiki": "$1 је {{GENDER:$2|увезао|увезла}} $3 с другог викија",
        "logentry-merge-merge": "$1 је {{GENDER:$2|спојио|спојила}} $3 у $4 (све до измене $5)",
        "logentry-move-move": "$1 је {{GENDER:$2|преместио|преместила}} страницу $3 на $4",
        "logentry-move-move-noredirect": "$1 је {{GENDER:$2|преместио|преместила}} страницу $3 на $4 без остављања преусмерења",
index 3818fcf..61b3176 100644 (file)
        "templatesused": "{{PLURAL:$1|Šablon|Šabloni}} na ovoj stranici:",
        "templatesusedpreview": "{{PLURAL:$1|Šablon|Šabloni}} u ovom pregledu:",
        "templatesusedsection": "{{PLURAL:$1|Šablon|Šabloni}} u ovom odeljku:",
-       "template-protected": "(zaštićen)",
-       "template-semiprotected": "(poluzaštićen)",
+       "template-protected": "(zaštićeno)",
+       "template-semiprotected": "(poluzaštićeno)",
        "hiddencategories": "Ova stranica je član {{PLURAL:$1|jedne skrivene kategorije|$1 skrivene kategorije|$1 skrivenih kategorija}}:",
        "edittools": "<!-- Ovaj tekst će biti prikazan ispod obrasca za uređivanje i otpremanje. -->",
        "edittools-upload": "-",
        "history-feed-empty": "Tražena stranica ne postoji.\nMoguće da je obrisana s vikija ili je preimenovana.\nPokušajte da [[Special:Search|pretražite viki]] za slične stranice.",
        "rev-deleted-comment": "(opis izmene uklonjen)",
        "rev-deleted-user": "(korisničko ime uklonjeno)",
-       "rev-deleted-event": "(istorija je uklonjena)",
+       "rev-deleted-event": "(detalji dnevnika uklonjeni)",
        "rev-deleted-user-contribs": "[korisničko ime ili IP adresa je uklonjena – izmena je sakrivena sa spiska doprinosa]",
        "rev-deleted-text-permission": "Izmena ove stranice je '''obrisana'''.\nDetalje možete videti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} istoriji brisanja].",
        "rev-deleted-text-unhide": "Izmena ove stranice je '''obrisana'''.\nDetalje možete videti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} istoriji brisanja].\nIpak možete da [$1 vidite ovu izmenu] ako želite da nastavite.",
        "import-rootpage-nosubpage": "Imenski prostor „$1“ osnovne stranice ne dozvoljava podstranice.",
        "importlogpage": "Dnevnik uvoza",
        "importlogpagetext": "Administrativni uvozi stranica s istorijama izmena s drugih vikija.",
-       "import-logentry-upload": "je uvezao [[$1]] otpremanjem datoteke",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|izmena uvezena|izmene uvezene|izmena uvezeno}}",
-       "import-logentry-interwiki": "je uvezao $1 s drugog vikija",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|izmena uvezena|izmene uvezene|izmena uvezeno}} iz $2",
        "javascripttest": "Javaskript test",
        "javascripttest-pagetext-noframework": "Ova stranica je rezervisana za izvršavanje javaskript testova.",
index 0af7b40..21d3dbd 100644 (file)
        "importcantopen": "Misslyckades med att öppna importfilen.",
        "importbadinterwiki": "Felaktig interwiki-länk",
        "importsuccess": "Importen är genomförd!",
-       "importnosources": "Inga källor för transwiki-import har angivits, och direkt uppladdning av historik har stängts av.",
+       "importnosources": "Inga källor från vilka import ska göras har angivits och direkt uppladdning av historik har stängts av.",
        "importnofile": "Ingen fil att importera har laddats upp.",
        "importuploaderrorsize": "Uppladdningen av importfilen misslyckades. Filen är större än vad som är tillåtet att ladda upp.",
        "importuploaderrorpartial": "Uppladdningen av importfilen misslyckades. Bara en del av filen laddades upp.",
        "import-rootpage-nosubpage": "Namnrymden \"$1\" till grundsidan tillåter inte undersidor.",
        "importlogpage": "Importlogg",
        "importlogpagetext": "Administrativa sidimporter med versionshistorik från andra wikier.",
-       "import-logentry-upload": "importerade [[$1]] genom filuppladdning",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|version|versioner}} importerades",
-       "import-logentry-interwiki": "överförde $1 mellan wikier",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|version|versioner}} importerades från $2",
        "javascripttest": "JavaScript-testning",
        "javascripttest-pagetext-noframework": "Denna sida är reserverat för att köra JavaScript-tester.",
        "logentry-block-reblock": "$1 {{GENDER:$2|ändrade}} blockeringsinställningar för {{GENDER:$4|$3}} med en varaktighet på $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|blockerade}} {{GENDER:$4|$3}} med en varaktighet på $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|ändrade}} blockeringsinställningar för {{GENDER:$4|$3}} med en varaktighet på $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|importerade}} $3 genom filuppladdning",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|importerade}} $3 från en annan wiki",
        "logentry-merge-merge": "$1 {{GENDER:$2|slog ihop}} $3 i $4 (versioner t.o.m. $5)",
        "logentry-move-move": "$1 {{GENDER:$2|flyttade}} sidan $3 till $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|flyttade}} sidan $3 till $4 utan att lämna en omdirigering",
        "feedback-bugornote": "Om du har möjlighet att ge en detaljerad teknisk beskrivning av felet kan du lämna en [$1 buggrapport]. \nAnvänd annars formuläret nedan. Din kommentar kommer att läggas till på sidan \"[$3 $2]\", tillsammans med ditt användarnamn.",
        "feedback-cancel": "Avbryt",
        "feedback-close": "Färdig",
+       "feedback-external-bug-report-button": "Registrera en teknisk uppgift",
        "feedback-dialog-title": "Skicka återkoppling",
        "feedback-dialog-intro": "Du kan använda det enkla formuläret nedan för att skicka in din återkoppling. Din kommentar kommer att läggas till på sidan \"$1\" tillsammans med ditt användarnamn.",
        "feedback-error-title": "Fel",
index fd30fd3..d696243 100644 (file)
        "actions": "ಕ್ರಿಯೆಕ್ಕುಲು",
        "namespaces": "ಪುದರ್ ದ ವರ್ಗೊಲು",
        "variants": "ರೂಪಾಂತರ ಹೊಂದ್‘ನ",
+       "navigation-heading": "ಸಂಚರಣೆ ಮೆನು",
        "errorpagetitle": "ದೋಷ",
        "returnto": "$1 ಗ್ ಪಿರ ಪೋಲೆ.",
        "tagline": "{{SITENAME}} ರ್ದ್",
        "permalink": "ಸ್ಥಿರ ಸಂಪರ್ಕ",
        "print": "ಪ್ರಿ೦ಟ್ ಮನ್ಪುಲೆ",
        "view": "ತೂಲೆ",
+       "view-foreign": "$1ಡ್ ತೂಲೆ",
        "edit": "ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ(Edit this page)",
        "create": "ಸೃಷ್ಟಿಸಾಲೆ",
        "editthispage": "ಈ ಪುಟೊನು ಬದಲಾಯಿಸಾಲೆ",
        "articlepage": "ಲೇಖನ ಪುಟೊನು ತೂಲೆ",
        "talk": "ಚರ್ಚೆ",
        "views": "ನೋಟಲು",
-       "toolbox": "ಉಪಕರಣ(ಟೂಲ್)",
+       "toolbox": "ಉಪಕರಣೊಲು",
        "userpage": "ಸದಸ್ಯೆರ್ನ ಪುಟೊನು ತೂಲೆ",
        "projectpage": "ಪ್ರೊಜೆಕ್ಟ್ ಪುಟೊನು ತೂಲೆ",
        "imagepage": "ಮೀಡಿಯ ಪುಟೊನು ತೂಲೆ",
        "login-abort-generic": "ಇರೆನ ಲಾಗ್ ಇನ್ ವಿಫಲ ವಾತ್‘ಂಡ್",
        "loginlanguagelabel": "ಭಾಷೆ: $1",
        "pt-login": "ಲಾಗಿನ್",
+       "pt-createaccount": "ಪೊಸ ಖಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "changepassword": "ಪ್ರವೇಶಪದೊನ್ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "resetpass_header": "ಈ ಖಾತೆದ ಪ್ರವೇಶಪದ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "oldpassword": "ಪರ ಪ್ರವೇಶಪದ",
        "action-deleterevision": "ಈ ಆವೃತ್ತಿನ್ ಮಾಜಾಲೆ",
        "action-sendemail": "ಇ-ಅಂಚೆ ಕಡಪುಡುಲೆ",
        "nchanges": "$1 {{PLURAL:$1|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಲು}}",
+       "enhancedrc-history": "ಇತಿಹಾಸೊ",
        "recentchanges": "ಇಂಚಿಪದ ಬದಲಾವಣೆಲು",
        "recentchanges-legend": "ಇಂಚಿಪದ ಬದಲಾವಣೆಲು ಆಯ್ಕೆಲು",
        "recentchanges-summary": "ಈ ವಿಕಿಟ್ ಇಂಚಿಪ್ಪ ಆತಿನ ಬದಲಾವಣೆನ್ ಟ್ರಾಕ್ ಮಲ್ಪುಲೆ",
        "recentchanges-label-minor": "ಉಂದು ಎಲ್ಯ ಬದಲಾವಣೆ",
        "rclistfrom": "$3 $2 ರ್ದ್ ಶುರುವಾತಿನ ಪೊಸ ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾವು",
        "rcshowhideminor": "$1 ಎಲ್ಯೆಲ್ಯ ಬದಲಾವಣೆಲು",
+       "rcshowhideminor-hide": "ದೆಂಗಾವು",
        "rcshowhidebots": "$1 ಬಾಟ್",
+       "rcshowhidebots-show": "ತೊಜಾವು",
        "rcshowhideliu": "ಲಾಗ್-ಇನ್ ಆತಿನಂಚಿನ ಸದಸ್ಯೆರ್ $1",
+       "rcshowhideliu-hide": "ದೆಂಗಾವು",
        "rcshowhideanons": "ಅನಾಮಧೇಯ ಸದಸ್ಯೆರ್ $1",
+       "rcshowhideanons-hide": "ದೆಂಗಾವು",
        "rcshowhidepatr": "$1 ಪರೀಕ್ಷಿಸಾದಿನ ಸಂಪಾದನೆಲು",
        "rcshowhidemine": "ಎನ್ನ ಸಂಪಾದನೆಲೆನ್ $1",
+       "rcshowhidemine-hide": "ದೆಂಗಾವು",
        "rclinks": "ದುಂಬುದ $2 ದಿನೊಲೆಡ್ ಮಲ್ತಿನ $1 ಕಡೆತ ಬದಲಾವಣೆಲೆನ್ ತೂಲೆ <br />$3",
        "diff": "ವ್ಯತ್ಯಾಸ",
        "hist": "ಇತಿಹಾಸ",
        "imagelinks": "ಫೈಲ್ ಲಿಂಕ್’ಲು",
        "linkstoimage": "ಈ ಫೈಲ್’ಗ್ ತಿರ್ತ್’ದ ಈ {{PLURAL:$1|ಪುಟ|$1 ಪುಟೊಲು}} ಲಿಂಕ್ ಕೊರ್ಪುಂಡು.",
        "sharedupload": "ಈ ಫೈಲ್’ನ್ ಮಸ್ತ್ ಜನ ಪಟ್ಟ್’ದುಲ್ಲೆರ್ ಅಂಚೆನೆ ಉಂದು ಮಸ್ತ್ ಪ್ರೊಜೆಕ್ಟ್’ಲೆಡ್ ಉಪಯೋಗಡುಪ್ಪು.",
+       "upload-disallowed-here": "ಈರ್ ಈ ಕಡತನ್ ಕುಡ ಬರೆವರೆ ಸಾದ್ಯ ಇಜ್ಜಿ.",
        "filedelete-comment": "ಕಾರಣ",
        "filedelete-submit": "ಮಾಜಾಲೆ",
        "randompage": "ಯಾದೃಚ್ಛಿಕ ಪುಟ",
        "namespace": "ನೇಮ್-ಸ್ಪೇಸ್:",
        "invert": "ಆಯ್ಕೆನ್ ತಿರ್ಗಾಲೆ",
        "blanknamespace": "(ಮುಖ್ಯ)",
-       "contributions": "ಸದಸ್ಯೆರ್ನ ಕಾಣಿಕೆಲು",
+       "contributions": "{{$1ಸದಸ್ಯೆರ್ನ}} ಕಾಣಿಕೆಲು",
        "contributions-title": "$1 ಗ್ ಸದಸ್ಯೆರ್ನ ಕಾಣಿಕೆ",
        "mycontris": "ಎನ್ನ ಕಾಣಿಕೆಲು",
        "contribsub2": "$1 ($2) ಗ್",
        "tooltip-pt-mycontris": "ಎನ್ನ ಕಾಣಿಕೆಲ್ದ ಪಟ್ಟಿ",
        "tooltip-pt-login": "ಈರ್ ಲಾಗ್ ಇನ್ ಆವೊಡುಂದು ಕೋರೊಂದುಲ್ಲ, ಆಂಡ ಉಂದು ದಾಲ ಕಡ್ಡಾಯ ಅತ್ತ್.",
        "tooltip-pt-logout": "ಲಾಗ್ ಔಟ್",
+       "tooltip-pt-createaccount": "ನಿಕುಲು ಪೊಸ ಖಾತೆ ಸುರುಮಲ್ತ್‍ದ್ ಲಾಗಿನ್ ಆಪುನೈನ್ ಸ್ವಾಗತ ಮಲ್ಪುವೊ, ಆಂಡಲಾ ಉಂದು ಕಡ್ಡಾಯ ಅತ್ತ್.",
        "tooltip-ca-talk": "ಮಾಹಿತಿ ಪುಟೊತ ಬಗ್ಗೆ ಚರ್ಚೆ",
        "tooltip-ca-edit": "ಈ ಪುಟೊನು ಈರ್ ಸಂಪಾದನೆ ಮಲ್ಪೊಲಿ. ಸೇವ್ ಮಲ್ಪುನ ದುಂಬು ಮುನ್ನೋಟದ ಉಪಯೊಗ ಮನ್ತೊನ್ಲೆ.",
        "tooltip-ca-addsection": "ಪೊಸ ಸೆಶನ್ನ್ ಶರು ಮಲ್ಪುಲೆ",
        "tooltip-upload": "ಅಪ್ಲೋಡ್ ಸುರು ಮಲ್ಪು",
        "tooltip-rollback": "\"Rollback\", ಈ ಪುಟದ ಕರಿನ ಬದಾಲವಣೆಗ್ ಒ೦ಜಿ ಕ್ಲಿಕ್ ಡ್ ಕೊನೊಪು೦ಡು",
        "tooltip-undo": "\"Undo\" ಈ ಬದಲಾವಣೆನ್ ದೆತೊನುಜಿ ಬುಕ ಪ್ರಿವ್ಯೂ ಮೋಡ್ ಡ್ ಬದಲಾವಣೆ ಮಲ್ಪೆರ್ ಕೊನೊಪು೦ಡು. ಅ೦ಚೆನೆ ಸಮ್ಮರಿ ಡ್ ಬದಲಾವಣೆ ಗ್ ಕಾರಣ ಕೊರ್ರ್‍ಎ ಆಪು೦ಡು.",
+       "tooltip-summary": "ಒಂಜಿ ಎಲ್ಯ ಸಾರಾಂಶ ಕೊರ್ಲೆ",
+       "pageinfo-toolboxlink": "ಪುಟೊತ ಮಾಹಿತಿ",
        "previousdiff": "← ದುಂಬುದ ಸಂಪಾದನೆ",
        "nextdiff": "ಪೊಸ ಎಡಿಟ್ →",
        "file-info-size": "$1 × $2 ಪಿಕ್ಸೆಲ್, ಫೈಲ್’ದ ಗಾತ್ರ: $3, MIME ಪ್ರಕಾರ: $4",
        "file-nohires": "ಇಂದೆರ್ದ್ ಜಾಸ್ತಿ ವಿವರವಾಯಿನ ನೋಟ ಇಜ್ಜಿ.",
        "svg-long-desc": "ಎಸ್.ವಿ.ಜಿ ಫೈಲ್, ಸುಮಾರಾದ್ $1 × $2 ಪಿಕ್ಸೆಲ್, ಫೈಲ್’ದ ಗಾತ್ರ: $3",
-       "show-big-image": "ಪೂರ್ತಿ ರೆಸೊಲ್ಯೂಶನ್",
+       "show-big-image": "ಮೂಲ ಕಡತ",
+       "show-big-image-size": "$1 × $2 ಪಿಕ್ಸೆಲ್‌ಸ್",
        "bad_image_list": "ವ್ಯವಸ್ಥೆದ ಆಕಾರ ಈ ರೀತಿ ಉಂಡು:\n\nಪಟ್ಟಿಡುಪ್ಪುನಂಚಿನ ದಾಖಲೆಲೆನ್ (* ರ್ದ್ ಶುರು ಆಪುನ ಸಾಲ್’ಲು) ಮಾತ್ರ ಪರಿಗಣನೆಗ್ ದೆತೊನೆರಾಪುಂಡು.\nಪ್ರತಿ ಸಾಲ್’ದ ಶುರುತ ಲಿಂಕ್ ಒಂಜಿ ದೋಷ ಉಪ್ಪುನಂಚಿನ ಫೈಲ್’ಗ್ ಲಿಂಕಾದುಪ್ಪೊಡು.\nಅವ್ವೇ ಸಾಲ್’ದ ಶುರುತ ಪೂರಾ ಲಿಂಕ್’ಲೆನ್ ಪರಿಗನೆರ್ದ್ ದೆಪ್ಪೆರಾಪುಂಡು, ಪಂಡ ಓವು ಪುಟೊಲೆಡ್ ಫೈಲ್’ದ ಬಗ್ಗೆ ಬರ್ಪುಂಡೋ ಔಲು.",
        "metadata": "ಮೇಲ್ದರ್ಜೆ ಮಾಹಿತಿ",
        "metadata-help": "ಈ ಫೈಲ್’ಡ್ ಜಾಸ್ತಿ ಮಾಹಿತಿ ಉಂಡು. ಪ್ರಾಯಶಃ ಫೈಲ್’ನ್ ಉಂಡು ಮಲ್ಪೆರೆ ಉಪಯೋಗ ಮಲ್ತಿನ ಡಿಜಿಟಲ್ ಕ್ಯಾಮೆರರ್ದ್ ಅತ್ತ್’ನ್ಡ ಸ್ಕ್ಯಾನರ್ ರ್ದ್ ಈ ಮಾಹಿತಿ ಬೈದ್’ನ್ಡ್.\nಮೂಲಪ್ರತಿರ್ದ್ ಈ ಫೈಲ್ ಬದಲಾದಿತ್ತ್’ನ್ಡ, ಈ ಮಾಹಿತಿ ಬದಲಾತಿನ ಫೈಲ್’ದ ವಿವರೊಲೆಗ್ ಸರಿಯಾದ್ ಹೊಂದಂದೆ ಉಪ್ಪು.",
        "metadata-expand": "ವಿಸ್ತಾರವಾಯಿನ ವಿವರೊಲೆನ್ ತೊಜ್ಪಾವು",
        "metadata-collapse": "ವಿಸ್ತಾರವಾಯಿನ ವಿವರೊಲೆನ್ ದೆಂಗಾವು",
        "metadata-fields": "ಈ ಸಂದೇಶೊಡು ಪಟ್ಟಿ ಮಲ್ತಿನಂಚಿನ EXIF ಮೆಟಡೇಟ ಮಾಹಿತಿನ್ ಚಿತ್ರ ಪುಟೊಕು ಸೇರ್ಪಾಯೆರೆ ಆವೊಂದುಂಡು. ಪುಟೊಟು ಮೆಟಡೇಟ ಮಾಹಿತಿದ ಪಟ್ಟಿನ್ ದೆಪ್ಪುನಗ ಉಂದು ತೋಜುಂಡು.\nಒರಿದನವು ಮೂಲಸ್ಥಿತಿಟ್ ಅಗೋಚರವಾದುಪ್ಪುಂಡು.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-datetime": "ಕಡೊತೊನು ಬದಲಾವಣೆ ಮಲ್ತ್‍ನ ದಿನಾಂಕೊ ಬೊಕ್ಕ ಸಮಯೊ",
+       "exif-make": "ಕ್ಯಾಮೆರಾದ ತಯಾರೆಕೆರ್",
+       "exif-model": "ಕ್ಯಾಮೆರಾ ಮಾದರಿ",
+       "exif-software": "ಉಪಯೋಗ ಮಲ್ತಿನ ತಂತ್ರಾಂಶ",
+       "exif-exifversion": "Exif ಆವೃತ್ತಿ",
+       "exif-datetimeoriginal": "ಮಾಹಿತಿ ಸೃಷ್ಟಿಯಾಯಿನ ದಿನಾಂಕೊ ಬೊಕ್ಕ ಸಮಯ",
+       "exif-datetimedigitized": "ಗಣಕೀಕರಣದ ದಿನಾಂಕೊ ಬೊಕ್ಕ ಸಮಯೊ",
+       "exif-orientation-1": "ಸಾಧಾರಣ",
        "namespacesall": "ಪೂರಾ",
        "monthsall": "ಪೂರಾ",
        "watchlisttools-view": "ಪ್ರಸ್ತುತ ಬದಲಾವಣೆಲ್ ತೋಜಾಲೆ",
        "watchlisttools-edit": "ವೀಕ್ಷಣಾಪಟ್ಟಿನ್ ತೂಲೆ ಬೊಕ್ಕ ಎಡಿಟ್ ಮಲ್ಪುಲೆ",
        "specialpages": "ವಿಷೇಶ ಪುಟೊಲು",
+       "logentry-delete-delete": "$1 {{GENDER:$2|ಮಾಜಾದ್‍ಂಡ್}} ಪುಟ $3",
        "searchsuggest-search": "ನಾಡ್‍ಲೆ"
 }
index 60fa17f..bdd91a3 100644 (file)
        "import-rootpage-nosubpage": "మూలపేజీ యొక్క పేరుబరి \"$1\" ఉపపేజీలను అనుమతించదు.",
        "importlogpage": "దిగుమతుల చిట్టా",
        "importlogpagetext": "ఇతర వికీల నుండీ మార్పుల చరిత్రతోసహా తెచ్చిన నిర్వహణా దిగుమతులు.",
-       "import-logentry-upload": "[[$1]]ను ఫైలు అప్లోడు ద్వారా దిగుమతి చేసాం",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|కూర్పు|కూర్పులు}}",
-       "import-logentry-interwiki": "ఇతర వికీల నుండి $1",
        "import-logentry-interwiki-detail": "$2 నుండి {{PLURAL:$1|ఒక కూర్పు|$1 కూర్పులు}}",
        "javascripttest": "జావాస్క్రిప్ట్ పరీక్ష",
        "javascripttest-pagetext-noframework": "ఈ పేజీ JavaScript పరీక్షల కోసం ఉద్దేశించబడింది.",
index 72eb870..5988482 100644 (file)
        "import-rootpage-nosubpage": "Kök sayfanın \"$1\" ad alanı alt sayfalara izin vermiyor.",
        "importlogpage": "Aktarım günlüğü",
        "importlogpagetext": "Diğer vikilerden sayfaların değişiklik geçmişiyle idari içe aktarımları.",
-       "import-logentry-upload": "[[$1]] dosya yüklemesiyle içe aktarıldı",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|revizyon|revizyon}} içe aktarıldı",
-       "import-logentry-interwiki": "$1 transvikileşmiş",
        "import-logentry-interwiki-detail": "$2 sayfasından $1 {{PLURAL:$1|revizyon|revizyon}} içe aktarıldı",
        "javascripttest": "JavaScript denemesi",
        "javascripttest-pagetext-noframework": "Bu sayfa JavaScript testleri çalıştırmak için ayrılmıştır.",
index 98dc382..493f5d3 100644 (file)
        "mypage": "Бит",
        "mytalk": "Бәхәс бите",
        "anontalk": "Бу IP адресы өчен бәхәс бите",
-       "navigation": "Ð\9aÒ¯Ñ\87Ò¯",
+       "navigation": "Ð\9dавигаÑ\86иÑ\8f",
        "and": "&#32;һәм",
        "qbfind": "Эзләү",
        "qbbrowse": "Карау",
        "history": "Битнең тарихы",
        "history_short": "Тарих",
        "updatedmarker": "соңгы керүемнән соң яңартылган",
-       "printableversion": "Бастыру версиясе",
+       "printableversion": "Басма версиясе",
        "permalink": "Даими сылтама",
        "print": "Бастыру",
        "view": "Карау",
        "pool-timeout": "Кысылуның  вакыты узды",
        "pool-queuefull": "Сорауларны саклау  бите тулы",
        "pool-errorunknown": "Билгесез  хата",
+       "poolcounter-usage-error": "$1: куллану хатасы",
        "aboutsite": "{{SITENAME}} турында",
        "aboutpage": "Project:Тасвирлама",
-       "copyright": "Мәгълүмат $1 буенча таратыла.",
+       "copyright": "Мәгълүмат $1 буенча таратыла (әгәр башкасы күрсәтелмәсә).",
        "copyrightpage": "{{ns:project}}:Авторлык хокуклары",
        "currentevents": "Хәзерге вакыйгалар",
        "currentevents-url": "Project:Хәзерге вакыйгалар",
        "disclaimers": "Җаваплылыктан баш тарту",
        "disclaimerpage": "Project:Җаваплылыктан баш тарту",
        "edithelp": "Үзгәртү буенча ярдәм",
+       "helppage-top-gethelp": "Ярдәм",
        "mainpage": "Баш бит",
        "mainpage-description": "Баш бит",
        "policy-url": "Project:Кагыйдәләр",
        "privacypage": "Project:Яшеренлек сәясәте",
        "badaccess": "Керү хатасы",
        "badaccess-group0": "Сез сораган гамәлне башкара алмыйсыз.",
-       "badaccess-groups": "Соралган гамәлне $1 {{PLURAL:$2|1=төркеменең|төркеменең}} кулланучылары гына башкара ала.",
+       "badaccess-groups": "Соралган гамәлне $1 {{PLURAL:$2|1=төркеме|төркемнәренең}} кулланучылары гына башкара ала.",
        "versionrequired": "MediaWikiның $1 версиясе таләп ителә",
        "versionrequiredtext": "Бу бит белән эшләү өчен MediaWikiның $1 версиясе кирәк. [[Special:Version|Кулланылучы программа версиясе турында мәгълүмат битен]] кара.",
        "ok": "OK",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "retrievedfrom": "Чыганагы — \"$1\"",
        "youhavenewmessages": "Сездә $1 бар ($2).",
-       "youhavenewmessagesfromusers": "Сезгә {{PLURAL:$3|$3 кулланучыдан}} $1 килде ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Сезгә}} {{PLURAL:$3|$3 кулланучыдан}} $1 килде ($2).",
        "youhavenewmessagesmanyusers": "Сез бик күп кулланучыдан $1 алдыгыз ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|яңа хәбәр}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|1=соңгы үзгәртү|соңгы үзгәртүләр}}",
+       "newmessageslinkplural": "{{PLURAL:$1|яңа хәбәр|999=яңа хәбәрләр}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|1=соңгы үзгәртү|соңгы үзгәртүләр}}\nсоңгы {{PLURAL:$1|үзгәртү|999=үзгәртү}}",
        "youhavenewmessagesmulti": "Сезгә монда яңа хәбәрләр бар: $1",
        "editsection": "үзгәртү",
        "editold": "үзгәртү",
        "hidetoc": "яшерү",
        "collapsible-collapse": "Төрү",
        "collapsible-expand": "Ачу",
+       "confirmable-confirm": "{{GENDER:$1|Шулаймы}}?",
        "confirmable-yes": "Әйе",
        "confirmable-no": "Юк",
        "thisisdeleted": "$1 карарга яки торгызырга телисезме?",
        "viewdeleted": "$1 карарга телисезме?",
-       "restorelink": "{{PLURAL:$1|1=1 бетерелгән үзгәртүне|$1 бетерелгән үзгәртүне}}",
+       "restorelink": "{{PLURAL:$1|бер бетерелгән үзгәртүне|$1 бетерелгән үзгәртүне}}",
        "feedlinks": "Шушылай:",
        "feed-invalid": "Язылу каналы тибы ялгыш",
        "feed-unavailable": "Синдикация тасмасы ябык",
        "nospecialpagetext": "<strong>Сез сорый торган махсус бит юк.</strong>\n\nМахсус битләр исемлеген карагыз: [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Хата",
        "databaseerror": "Мәгълүматлар базасында хата",
+       "databaseerror-textcl": "Мәгълүмат базасында хата чыкты",
+       "databaseerror-query": "Сорату: $1",
+       "databaseerror-function": "Функция: $1",
+       "databaseerror-error": "Хата: $1",
        "laggedslavemode": "Игътибар: биттә соңгы яңартулар күрсәтелмәгән булырга мөмкин.",
        "readonly": "Мәгълүматлар базасына язу ябылган",
        "enterlockreason": "Ябылу сәбәбен һәм вакытын күрсәтегез.",
        "filerenameerror": "«$1» файлының исемен «$2» исеменә алыштырып булмый.",
        "filedeleteerror": "«$1» файлын бетереп булмый.",
        "directorycreateerror": "«$1» директориясен ясап булмый.",
+       "directoryreadonlyerror": "«$1» каталогы уку өчен генә.",
+       "directorynotreadableerror": "«$1» каталогы укылмый.",
        "filenotfound": "«$1» файлын табып булмый.",
        "unexpected": "Көтелмәгән кыймәт: «$1»=«$2».",
        "formerror": "Хата: форма мәгълүматларын тапшырып булмый",
        "delete-hook-aborted": "Үзгәртү махсус процедура тарафыннан кире кагыла.\nСәбәпләре китерелми.",
        "badtitle": "Яраксыз исем",
        "badtitletext": "Битнең соралган исеме дөрес түгел, буш яисә телъара яки интервики исеме дөрес күрсәтелмәгән. Исемдә тыелган символлар кулланылган булырга мөмкин.",
-       "perfcached": "Бу мәгълүматлар кэштан алынган, аларда соңгы үзгәртүләр булмаска мөмкин. Кэшта иң күбе {{PLURAL:$1|язма}} саклана.",
-       "perfcachedts": "Бу мәгълүматлар кэштан алынган, ул соңгы тапкыр $1 яңартылды. Кэшта иң күбе  {{PLURAL:$4|язма}} саклана",
+       "perfcached": "Бу мәгълүматлар кэштан алынган, аларда соңгы үзгәртүләр булмаска мөмкин. Кэшта иң күбе {{PLURAL:$1|язма|$1 язмалар}}  саклана.",
+       "perfcachedts": "Бу мәгълүматлар кэштан алынган, ул соңгы тапкыр $1 яңартылды. Кэшта иң күбе {{PLURAL:$4|язма}} саклана",
        "querypage-no-updates": "Хәзер бу битне яңартып булмый. Монда күрсәтелгән мәгълүматлар кабул ителмәячәк.",
        "viewsource": "Карау",
        "viewsource-title": "$1 битенең яхма текстын карау",
        "viewsourcetext": "Сез бу битнең башлангыч текстын карый һәм күчерә аласыз:",
        "viewyourtext": "Сез '''үз төзәтмәләрегезне''' бу сәхифәдә карый һәм чыгарылма текстны күчермәли аласыз:",
        "protectedinterface": "Бу биттә программа тәэминатының интерфейс хәбәрләре бар. Вандализмга каршы көрәш сәбәпле, бу битне үзгәртү тыела. Әлеге хәбәрнең тәрҗемәсен өстәү яки үзгәртү өчен, зинһар өчен, MediaWiki [//translatewiki.net/ translatewiki.net] тәрҗемәләү сайтын кулланыгыз.",
-       "editinginterface": "'''Игътибар:''' Сез программа тәэминатының интерфейс тексты булган битне үзгәртәсез. Бу башка кулланучыларга да тәэсир итәчәк. Тәрҗемә өчен [//translatewiki.net/wiki/Main_Page?setlang=tt-cyrl translatewiki.net] локализацияләү проектын кулланыгыз.",
+       "editinginterface": "<strong>Игътибар:</strong> Сез программа тәэминатының интерфейс тексты булган битне үзгәртәсез. Бу башка кулланучыларга да тәэсир итәчәк.",
+       "translateinterface": "Бу хәбәрнең текстын үзгәртү өчен яки өстәмәләр кертү өчен MediaWiki җирләштерү сайтын кулланыгыз [//translatewiki.net/ translatewiki.net].",
        "cascadeprotected": "Бу бит үзгәртүләрдән сакланган, чөнки ул каскадлы саклау кабул ителгән {{PLURAL:$1|1=биткә|битләргә}} өстәлгән:\n$2",
        "namespaceprotected": "'''$1''' исем киңлегендәге битләрне үзгәртү өчен сезнең рөхсәтегез юк.",
        "customcssprotected": "Сез бу CSS-сәхифәне үзгәртә алмыйсыз, чөнки монда башка кулланучының шәхси көйләнмәләре саклана",
        "prevn": "алдагы {{PLURAL:$1|$1}}",
        "nextn": "чираттагы {{PLURAL:$1|$1}}",
        "prevn-title": "Алдагы $1  {{PLURAL:$1|язма}}",
-       "nextn-title": "Киләсе $1  {{PLURAL:$1|язма}}",
+       "nextn-title": "Киләсе $1 {{PLURAL:$1|язма|язма}}",
        "shown-title": "Сәхифәдә $1 {{PLURAL:$1|1=язма|язма}} күрсәтелсен",
        "viewprevnext": "Күрсәтелүе: ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Бу вики-проекта «[[:$1]]» исемле бит бар инде'''",
        "searchprofile-images-tooltip": "Файллар эзләү",
        "searchprofile-everything-tooltip": "Барлык битләрдә дә эзләү",
        "searchprofile-advanced-tooltip": "Бирелгән исемнәр мәйданында эзләү",
-       "search-result-size": "$1 ({{PLURAL:$2|$2 сүз}})",
+       "search-result-size": "$1 ({{PLURAL:$2|1 сүз|$2 сүз}})",
        "search-result-category-size": "{{PLURAL:$1|1=1 әгъза|$1 әгъза}} ({{PLURAL:$2|1=1 асттөркем|$2 асттөркем}}, {{PLURAL:$3|1=1 файл|$3 файл}})",
        "search-redirect": "(юнәлтү $1)",
        "search-section": "($1 бүлеге)",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|күзәтеп тора кулланучы}}]",
        "rc_categories": "Төркемнәрдә генә тора («|» бүлүче)",
        "rc_categories_any": "Һәрбер",
+       "rc-change-size-new": "Төзәтмәдән соң күләме: $1 {{PLURAL:$1|байт|байт|байт}}",
        "newsectionsummary": "/* $1 */ яңа бүлек",
        "rc-enhanced-expand": "Ваклыкларны күрсәтү",
        "rc-enhanced-hide": "Ваклыкларны яшерү",
        "import-revision-count": "$1 {{PLURAL:$1|юрама|юрама|юрама}}",
        "importnopages": "Импортлау өчен битләр юк.",
        "importlogpage": "Кертү көндәлеге",
-       "import-logentry-interwiki": "«$1» — викиара  импортлау",
        "tooltip-pt-userpage": "Кулланучы битегез",
        "tooltip-pt-mytalk": "Бәхәс битегез",
        "tooltip-pt-preferences": "Көйләнмәләрегез",
        "tooltip-pt-mycontris": "Сезнең кертеменгезне исемлеге",
        "tooltip-pt-login": "Сез хисап язмасы төзи алыр идегез, әмма бу мәҗбүри түгел.",
        "tooltip-pt-logout": "Чыгу",
+       "tooltip-pt-createaccount": "Сезгә аккаунт ясарга һәм системага керергә киңәш итәбез, әмма бу мәҗбүри түгел.",
        "tooltip-ca-talk": "Битнең эчтәлеге турында бәхәс",
        "tooltip-ca-edit": "Сез бу бит үзгәртә аласыз. Зинһар, саклаганчы карап алуны кулланыгыз.",
        "tooltip-ca-addsection": "Яңа бүлек башлау",
        "tooltip-t-emailuser": "Бу кулланучыга хат җибәрү",
        "tooltip-t-upload": "Файлларны йөкләү",
        "tooltip-t-specialpages": "Барлык махсус битләр исемлеге",
-       "tooltip-t-print": "Бу битнең бастыру версиясе",
+       "tooltip-t-print": "Бу битнең басма версиясе",
        "tooltip-t-permalink": "Битнең бу юрамасына даими сылтама",
        "tooltip-ca-nstab-main": "Мәкаләнең эчтәлеге",
        "tooltip-ca-nstab-user": "Кулланучының шәхси бите",
        "file-nohires": "Югары ачыклык белән юрама юк.",
        "svg-long-desc": "SVG файлы, шартлы $1 × $2 нокта, файлның зурлыгы: $3",
        "show-big-image": "Тулы ачыклык",
+       "show-big-image-size": "$1 × $2 пиксель",
        "newimages": "Яңа сүрәтләр җыелмасы",
        "newimages-legend": "Фильтр",
        "ilsubmit": "Эзләү",
        "logentry-newusers-autocreate": "Автоматик рәвештә $1 хисап язмасы төзелде.",
        "rightsnone": "(юк)",
        "revdelete-summary": "үзгәртүләр тасвирламасы",
+       "feedback-adding": "Фикерне сәхифәгә өстәү ...",
+       "feedback-bugnew": "Мин тикшердем. Яңа хата турында хәбәр итү",
        "feedback-bugornote": "Әгәр дә сез техник проблеманы җентекләп тасвирларга әзер икәнсез, зинһар өчен, [$1 хата турында хәбәр итегез].\nБашка очракта сез түбәндәге гади форманы куллана аласыз. Сезнең шәрехләмә \"[$3 $2]\" сәхифәсенә сезнең кулланучы исеме һәм сез кулланган браузер исеме белән бергә өстәләчәк.",
-       "feedback-subject": "Тема:",
-       "feedback-message": "Хәбәр:",
        "feedback-cancel": "Баш тарту",
-       "feedback-submit": "Фикер җибәрү",
-       "feedback-adding": "Фикерне сәхифәгә өстәү ...",
+       "feedback-close": "Әзер",
        "feedback-error1": "Хата. APIдан билгесез нәтиҗә",
        "feedback-error2": "Хата: төзәтү уңышсыз килеп чыкты",
        "feedback-error3": "Хата: APIдан җавап юк.",
+       "feedback-message": "Хәбәр:",
+       "feedback-subject": "Тема:",
+       "feedback-submit": "Фикер җибәрү",
        "feedback-thanks": "Рәхмәт! Сезнең фикер \"[$2 $1]\" сәхифәсенә куелды.",
-       "feedback-close": "Әзер",
-       "feedback-bugnew": "Мин тикшердем. Яңа хата турында хәбәр итү",
        "searchsuggest-search": "Эзләү",
        "searchsuggest-containing": "эчтәлек...",
        "api-error-badaccess-groups": "Сезгә бу викигә файллар өстәү рөхсәт ителмәгән",
index 64b2521..6671a94 100644 (file)
        "disclaimers": "Відмова від відповідальності",
        "disclaimerpage": "Project:Відмова від відповідальності",
        "edithelp": "Довідка про редагування",
+       "helppage-top-gethelp": "Довідка",
        "mainpage": "Головна сторінка",
        "mainpage-description": "Головна сторінка",
        "policy-url": "Project:Правила",
        "readonly_lag": "База даних автоматично заблокована від змін, доки вторинний сервер бази даних не синхронізується з первинним.",
        "internalerror": "Внутрішня помилка",
        "internalerror_info": "Внутрішня помилка: $1",
+       "internalerror-fatal-exception": "Критичний виняток типу «$1»",
        "filecopyerror": "Не вдалося скопіювати файл «$1» в «$2».",
        "filerenameerror": "Не вдалося перейменувати файл «$1» на «$2».",
        "filedeleteerror": "Не вдалося вилучити файл «$1».",
        "importcantopen": "Неможливо відкрити файл імпорту",
        "importbadinterwiki": "Невірне інтервікі-посилання",
        "importsuccess": "Імпорт виконано!",
-       "importnosources": "Ð\9dе Ð±Ñ\83ло Ð²Ð¸Ð±Ñ\80ане Ð´Ð¶ÐµÑ\80ело Ð¼Ñ\96жвÑ\96кÑ\96\96мпоÑ\80Ñ\82Ñ\83, Ð¿Ñ\80Ñ\8fме Ð·Ð°Ð²Ð°Ð½Ñ\82аженнÑ\8f Ñ\96Ñ\81Ñ\82оÑ\80Ñ\96Ñ\97 Ð·Ð¼Ñ\96н Ð²Ð¸Ð¼ÐºÐ½Ñ\83Ñ\82е.",
+       "importnosources": "Ð\9fÑ\80Ñ\8fме Ð·Ð°Ð²Ð°Ð½Ñ\82аженнÑ\8f Ñ\96Ñ\81Ñ\82оÑ\80Ñ\96Ñ\97 Ð·Ð¼Ñ\96н Ð±Ñ\83ло Ð²Ð¸Ð¼ÐºÐ½Ñ\83Ñ\82е, Ð¾Ñ\81кÑ\96лÑ\8cки Ð½Ðµ Ð±Ñ\83ла Ð²Ð¸Ð±Ñ\80ана Ð²Ñ\96кÑ\96, Ð· Ñ\8fкоÑ\97 Ð¼Ð¾Ð¶Ð½Ð° Ð±Ñ\83ло Ð± Ñ\96мпоÑ\80Ñ\82Ñ\83ваÑ\82и.",
        "importnofile": "Файл імпорту не було завантажено.",
        "importuploaderrorsize": "Не вдалося завантажити або імпортувати файл. Розмір файлу перевищує встановлену межу.",
        "importuploaderrorpartial": "Не вдалося завантажити або імпортувати файл. Він був завантажений лише частково.",
        "import-rootpage-nosubpage": "В просторі назв вказаної кореневої сторінки «$1» заборонені підсторінки",
        "importlogpage": "Журнал імпорту",
        "importlogpagetext": "Імпорт адміністраторами сторінок з історією редагувань з інших вікі.",
-       "import-logentry-upload": "«[[$1]]» — імпорт з файлу",
        "import-logentry-upload-detail": "Імпортовано $1 {{PLURAL:$1|версія|версії|версій}}",
-       "import-logentry-interwiki": "«$1» — міжвікі імпорт",
        "import-logentry-interwiki-detail": "Імпортовано $1 {{PLURAL:$1|версія|версії|версій}} з $2",
        "javascripttest": "Тестування JavaScript",
        "javascripttest-pagetext-noframework": "Ця сторінка призначений для тестування JavaScript.",
        "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-block-reblock": "$1 {{GENDER:$2|переблокував|переблокувала}} {{GENDER:$4|$3}} на термін $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|заблокував}} {{GENDER:$4|$3}} строком на $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|змінив}} блокування для {{GENDER:$4|$3}} на період $5 $6",
+       "logentry-import-upload": "$1 імпортува{{GENDER:$2|в|ла}} $3 через завантаження файлів",
+       "logentry-import-interwiki": "$1 імпортува{{GENDER:$2|в|ла}} $3 з іншої вікі",
        "logentry-merge-merge": "$1 {{GENDER:$2|приєднав|приєднала}} $3 до $4 (версії до $5)",
        "logentry-move-move": "$1 {{GENDER:$2|перейменував|перейменувала}} сторінку з $3 на $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|перейменував|перейменувала}} сторінку з $3 на $4 без створення перенаправлення",
        "rightsnone": "(нема)",
        "revdelete-summary": "коментар до редагування",
        "feedback-adding": "Додавання відгуку на сторінку ...",
+       "feedback-back": "Назад",
        "feedback-bugcheck": "Чудово! Просто перевірте, що це не одна з вже [$1 відомих помилок].",
        "feedback-bugnew": "Я перевірив. Повідомити про нову помилку",
        "feedback-bugornote": "Якщо ви готові описати технічні проблеми в деталях, будь ласка, [$1 повідомте про помилку].\nАбо можете використати форму нижче. Ваш коментар буде додано на сторінку \"[$3  $2]\", разом з іменем користувача.",
        "feedback-cancel": "Скасувати",
        "feedback-close": "Виконано",
+       "feedback-external-bug-report-button": "Повідомити про технічну проблему",
+       "feedback-dialog-title": "Надіслати відгук",
+       "feedback-dialog-intro": "Для надсилання відгуку Ви можете скористатись простою формою внизу. Ваш коментар буде залишений на сторінці «$1», разом із Вашим іменем користувача (або IP-адресою).",
+       "feedback-error-title": "Помилка",
        "feedback-error1": "Помилка: Невідомий результаті API",
        "feedback-error2": "Помилка: Збій редагувань",
        "feedback-error3": "Помилка: Немає відповіді від API",
        "feedback-message": "Повідомлення:",
        "feedback-subject": "Тема:",
        "feedback-submit": "Надіслати",
+       "feedback-terms": "Я розумію, що мій ідентифікатор User Agent містить інформацію про тип мого браузера та версію операційної системи, і ця інформація після залишення відгуку перебуватиме в публічному доступі.",
+       "feedback-termsofuse": "Я погоджуюсь залишити відгук у відповідності до Умов використання.",
        "feedback-thanks": "Дякуємо! Ваші відгук розміщено на сторінці \"[$2 $1]\".",
+       "feedback-thanks-title": "Дякуємо!",
+       "feedback-useragent": "User Agent:",
        "searchsuggest-search": "Пошук",
        "searchsuggest-containing": "що містять...",
        "api-error-badaccess-groups": "Вам не дозволено завантажувати файли до цього вікіпроекту.",
index 079f15f..d51a5fc 100644 (file)
        "import-invalid-interwiki": "Nüveigam se vük pavilöl no mögon.",
        "importlogpage": "Jenotalised nüveigamas",
        "importlogpagetext": "Nüveigam guverik padas labü redakamajenotem se vüks votik",
-       "import-logentry-upload": "pad: [[$1]] penüveigon medü ragivilöpükam",
        "import-logentry-upload-detail": "{{PLURAL:$1|fomam|fomams}} $1",
-       "import-logentry-interwiki": "pevotavükükon: $1",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|fomam|fomams}} $1 se $2",
        "tooltip-pt-userpage": "Gebanapad olik",
        "tooltip-pt-anonuserpage": "Gebanapad ladeta-IP, me kel redakol",
index 488b0bc..238aca4 100644 (file)
        "undelete-show-file-submit": "יא",
        "namespace": "נאמענטייל:",
        "invert": "ווײַז אַלע אויסער די",
+       "tooltip-invert": "באצייכנט דאס קעסטל צו באהאלטן ענדערונגען צו בלעטער אין דעם געקליבענעם נאמענטייל",
        "tooltip-whatlinkshere-invert": "מארקירט דאס קעסטל צו באהאלטן לינקען פון בלעטער אינעם אויסגעקליבענעם נאמענטייל.",
        "namespace_association": "אָנגעבונדענער נאָמענטייל",
        "tooltip-namespace_association": "צייכנט דאס קעסטל כדי איינשליסן דעם שמועס אדער סוביעקט נאמענטייל וואס געהערט צום אויסגעקליבענעם נאמענטייל",
        "import-rootpage-nosubpage": "נאמענטייל \"$1\" פונעם שטאמבלאט ערלויבט נישט קיין אונטערבלעטער.",
        "importlogpage": "אימפארט לאגבוך",
        "importlogpagetext": "אַדמיניסטראַטיווער אימפארט פון בלעטער מיט רעדאַגירן היסטאריע פֿון ​​אַנדערע וויקיס.",
-       "import-logentry-upload": "האט אימפארטירט [[$1]] דורך טעקע אַרויפֿלאָדן",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}} אימפארטירט",
-       "import-logentry-interwiki": "אריבערגעוויקיט $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}} אימפארטירט פֿון $2",
        "javascripttest": "JavaScript טעסט",
        "javascripttest-pagetext-noframework": " דער בלאט איז רעזערווירט פאר JavaScript. פרואוון.",
index 22a74de..9d2cec7 100644 (file)
        "import-rootpage-nosubpage": "名字空间为“$1”的根页面不允许子页面。",
        "importlogpage": "导入日志",
        "importlogpagetext": "管理性导入在其他wiki上有编辑历史的页面。",
-       "import-logentry-upload": "通过文件上传导入[[$1]]",
        "import-logentry-upload-detail": "导入$1个{{PLURAL:$1|版本}}",
-       "import-logentry-interwiki": "跨wiki导入页面$1",
        "import-logentry-interwiki-detail": "来自$2的$1个{{PLURAL:$1|版本}}已导入",
        "javascripttest": "JavaScript测试",
        "javascripttest-pagetext-noframework": "本页面被保留进行JavaScript测试。",
        "logentry-block-reblock": "$1将{{GENDER:$4|$3}}的封禁设置{{GENDER:$2|更改为}}持续时间$5 $6",
        "logentry-suppress-block": "$1{{GENDER:$2|封禁了}}{{GENDER:$4|$3}},持续时间$5 $6",
        "logentry-suppress-reblock": "$1将{{GENDER:$4|$3}}的封禁设置{{GENDER:$2|更改为}}持续时间$5 $6",
+       "logentry-import-upload": "$1通过上传{{GENDER:$2|导入}}了$3",
+       "logentry-import-interwiki": "$1从其他wiki{{GENDER:$2|导入}}了$3",
        "logentry-merge-merge": "$1将$3{{GENDER:$2|合并}}至$4(修订版本至$5)",
        "logentry-move-move": "$1{{GENDER:$2|移动}}页面$3至$4",
        "logentry-move-move-noredirect": "$1{{GENDER:$2|移动}}页面$3至$4,不留重定向",
        "json-error-recursion": "要编码的数值中一个或更多递归引用",
        "json-error-inf-or-nan": "要编码的数值中一个或更多NAN或INF值",
        "json-error-unsupported-type": "给出了不能编码的类型的值",
-       "headline-anchor-title": "链接到此段落"
+       "headline-anchor-title": "该段落的链接"
 }
index c6feb20..d413434 100644 (file)
@@ -59,7 +59,8 @@
                        "Cathypilot0117",
                        "NigelSoft",
                        "EagerLin",
-                       "Cbliu"
+                       "Cbliu",
+                       "Citizen01"
                ]
        },
        "tog-underline": "底線標示連結:",
@@ -67,7 +68,7 @@
        "tog-hidepatrolled": "隱藏近期變更中巡查過的編輯",
        "tog-newpageshidepatrolled": "隱藏新頁面清單中巡查過的頁面",
        "tog-extendwatchlist": "展開監視清單顯示包含最近以外的所有變更",
-       "tog-usenewrc": "依近期變更與監視清單頁面分類顯示變更",
+       "tog-usenewrc": "依近期變更與監視清單頁面分類顯示變更",
        "tog-numberheadings": "標題自動編號",
        "tog-showtoolbar": "顯示編輯工具列",
        "tog-editondblclick": "開啟滑鼠雙擊編輯頁面",
@@ -91,7 +92,7 @@
        "tog-forceeditsummary": "未填寫編輯摘要時提示我",
        "tog-watchlisthideown": "隱藏監視清單中本人的編輯",
        "tog-watchlisthidebots": "隱藏監視清單中機器人的編輯",
-       "tog-watchlisthideminor": "隱藏監視清單中的細微修訂",
+       "tog-watchlisthideminor": "隱藏監視清單中的修訂",
        "tog-watchlisthideliu": "隱藏監視清單中已登入使用者的編輯",
        "tog-watchlisthideanons": "隱藏監視清單中匿名使用者的編輯",
        "tog-watchlisthidepatrolled": "隱藏監視清單中已巡查的編輯",
        "disclaimers": "免責聲明",
        "disclaimerpage": "Project:General disclaimer",
        "edithelp": "編輯説明",
+       "helppage-top-gethelp": "説明",
        "mainpage": "首頁",
        "mainpage-description": "首頁",
        "policy-url": "Project:Policy",
        "youhavenewmessages": "您有 $1 ($2)。",
        "youhavenewmessagesfromusers": "你有來自{{PLURAL:$3|另一位使用者|$3 位使用者}}的 $1 ($2)。",
        "youhavenewmessagesmanyusers": "你有來自多位使用者的 $1 ($2)。",
-       "newmessageslinkplural": "{{PLURAL:$1|一新訊息|999=新訊息}}",
+       "newmessageslinkplural": "{{PLURAL:$1|一新訊息|999=新訊息}}",
        "newmessagesdifflinkplural": "最近{{PLURAL:$1|變更}}",
        "youhavenewmessagesmulti": "您在 $1 有新訊息",
        "editsection": "編輯",
        "readonly_lag": "資料庫已自動鎖定,正在等候次要資料庫同步資料到主要資料庫",
        "internalerror": "內部錯誤",
        "internalerror_info": "內部錯誤:$1",
+       "internalerror-fatal-exception": "嚴重例外類型 \"$1\"",
        "filecopyerror": "無法複製檔案 \"$1\" 至 \"$2\"。",
        "filerenameerror": "無法重新命名檔案 \"$1\" 為 \"$2\"。",
        "filedeleteerror": "無法刪除檔案 \"$1\"。",
        "cannotdelete": "無法刪除頁面或檔案 \"$1\"。\n它可能已經被其他人刪除。",
        "cannotdelete-title": "無法刪除頁面 \"$1\"",
        "delete-hook-aborted": "刪除已被 Hook 中止。\n且未回應無任何說明。",
-       "no-null-revision": "ç\84¡æ³\95å°\8d \"$1\" é \81é\9d¢å»ºç«\8bæ\96°ç\9a\84空白修訂",
+       "no-null-revision": "ç\84¡æ³\95建ç«\8bé \81é\9d¢ \"$1\" ç\9a\84æ\96°空白修訂",
        "badtitle": "無效的標題",
        "badtitletext": "指定的頁面標題是無效、空白,或未正確連結的跨語言或跨 Wiki 的標題。\n標題中可能包含無法使用在標題的字元。",
        "perfcached": "以下為快取資料,可能不是最新的。 快取資料最多可儲存 {{PLURAL:$1|1 筆結果|$1 筆結果}}。",
        "invalidtitle-knownnamespace": "命名空間 \"$2\" 與名稱 \"$3\" 是無效的標題",
        "invalidtitle-unknownnamespace": "不明的命名空間編號 $1 與名稱 \"$2\" 是無效的標題",
        "exception-nologin": "未登入",
-       "exception-nologin-text": "請先登入才能存取頁面或操作。",
+       "exception-nologin-text": "您需要先登入方可存取或者操作此頁面。",
        "exception-nologin-text-manual": "請先 $1 以存取此頁面或操作。",
        "virus-badscanner": "錯誤的設定:不明的病毒掃瞄程式:<em>$1</em>",
        "virus-scanfailed": "掃瞄失敗 (代碼 $1)",
        "userlogin-helplink2": "登入協助",
        "userlogin-loggedin": "您目前已登入 {{GENDER:$1|$1}} 使用者,\n請使用下列表單改登入另一位使用者。",
        "userlogin-createanother": "建立另一個帳號",
-       "createacct-emailrequired": "電子郵地址",
+       "createacct-emailrequired": "電子郵地址",
        "createacct-emailoptional": "電子郵件地址 (選填)",
        "createacct-email-ph": "輸入您的電子郵件地址",
-       "createacct-another-email-ph": "輸入電子郵地址",
-       "createaccountmail": "使用臨時的隨機密碼,並將它寄至指定的電子郵地址",
+       "createacct-another-email-ph": "輸入電子郵地址",
+       "createaccountmail": "使用臨時的隨機密碼,並將它寄至指定的電子郵地址",
        "createacct-realname": "真實姓名 (選填)",
        "createaccountreason": "原因:",
        "createacct-reason": "原因",
        "mailmypassword": "重設密碼",
        "passwordremindertitle": "{{SITENAME}} 的新臨時密碼",
        "passwordremindertext": "不明人士 (可能是您自己,來自 IP 位址 $1) 要求重設在 {{SITENAME}} ($4) 的密碼。\n給使用者 \"$2\" 的臨時密碼設為 \"$3\"。\n如果這個動作是您做的,您需要立即登入並設定一個新的密碼,\n您的臨時密碼將於{{PLURAL:$5|一|$5}}天內過期。\n\n如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
-       "noemail": "使用者 \"$1\" 沒有電子郵地址記錄。",
-       "noemailcreate": "您需要提供一個有效的電地址。",
-       "passwordsent": "使用者 \"$1\" 的新密碼已寄至當出登記的電子郵件位址,\n請稍後收到信件後再登入。",
+       "noemail": "使用者 \"$1\" 沒有電子郵地址記錄。",
+       "noemailcreate": "您需要提供一個有效的電子郵件地址。",
+       "passwordsent": "使用者 \"$1\" 的新密碼已寄至當出登記的電子郵件地址,\n請稍後收到郵件後再登入。",
        "blocked-mailpassword": "您的 IP 位址已被封鎖不允許編輯,密碼復原的功能也同樣被禁止使用以防止被濫用。",
        "eauthentsent": "已寄出一封確認信到您所設定的電子郵件位址。\n在未收到其它電子郵件前,您必須先依照郵件中的指示,確認這個帳號確實是您本人。",
        "throttled-mailpassword": "密碼重設的電子郵件已經在最近 $1 小時內寄出。\n為防止濫用,$1 小時內只能寄出一次密碼重設信件。",
        "mailerror": "傳送電子郵件錯誤:$1",
        "acct_creation_throttle_hit": "使用您目前的 IP 位址的訪客在最近一天建立了 {{PLURAL:$1|1 個帳號|$1 個帳號}},已超出系統允許的上限。\n因此,目前無法讓使用此 IP 位址的訪客建立帳號。",
-       "emailauthenticated": "您的電子郵地址已於 $2 $3 確認。",
-       "emailnotauthenticated": "您的電地址尚未確認,\n尚不會寄出以下功能的電子郵件給您。",
-       "noemailprefs": "在您的偏好設定中設定電子郵件址,讓您可以使用這些功能。",
-       "emailconfirmlink": "確認您的電地址",
-       "invalidemailaddress": "無法接受格式不正確的電子郵箱地址,請輸入正確的電子郵箱地址格式或略過填寫該欄位。",
-       "cannotchangeemail": "此 Wiki 不允許更改帳號的電子郵件址。",
+       "emailauthenticated": "您的電子郵地址已於 $2 $3 確認。",
+       "emailnotauthenticated": "您的電子郵件地址尚未確認,\n尚不會寄出以下功能的電子郵件給您。",
+       "noemailprefs": "在您的偏好設定中設定電子郵件址,讓您可以使用這些功能。",
+       "emailconfirmlink": "確認您的電子郵件地址",
+       "invalidemailaddress": "無法接受格式不正確的電子郵件地址,請輸入正確的電子郵件地址格式或略過填寫該欄位。",
+       "cannotchangeemail": "此 Wiki 不允許更改帳號的電子郵件址。",
        "emaildisabled": "此網站不能傳送電子郵件。",
        "accountcreated": "已建立帳號",
        "accountcreatedtext": "使用者帳號 [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|對話]]) 已建立。",
        "createaccount-title": "{{SITENAME}} 的帳號建立",
-       "createaccount-text": "不明人士使用您的電地址在 {{SITENAME}} ($4) 建立了一個帳號名稱為 \"$2\",密碼為 \"$3\"。\n您應該立即登入並更改密碼。\n\n如果該帳號是建立錯誤的話,您可以忽略此訊息。",
+       "createaccount-text": "不明人士使用您的電子郵件地址在 {{SITENAME}} ($4) 建立了一個帳號名稱為 \"$2\",密碼為 \"$3\"。\n您應該立即登入並更改密碼。\n\n如果該帳號是建立錯誤的話,您可以忽略此訊息。",
        "login-throttled": "您已經嘗試太多次的登入動作。\n請稍等 $1 後再試。",
        "login-abort-generic": "您登入失敗 - 已中止",
        "login-migrated-generic": "您的帳號已轉移,且此 Wiki 中您的使用者名稱已不存在。",
        "passwordreset-domain": "網域名稱:",
        "passwordreset-capture": "檢視電子郵件內容?",
        "passwordreset-capture-help": "若您勾選此核選方塊,電子郵件 (包含臨時密碼) 將直接顯示,並寄給使用者。",
-       "passwordreset-email": "電子郵箱位址:",
+       "passwordreset-email": "電子郵件地址:",
        "passwordreset-emailtitle": "於 {{SITENAME}} 的帳號詳細資訊",
        "passwordreset-emailtext-ip": "不明人士 (可能是您自己,來自 IP 位址 $1) 要求重設在 {{SITENAME}} ($4) 的密碼,下列是與此電子郵件地址有關的使用者{{PLURAL:$3|帳號}}:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}將會在{{PLURAL:$5|一天|$5 天}}內到期,\n您應立即登入並更改新的密碼。如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略本訊息並且繼續使用您原本的密碼。",
        "passwordreset-emailtext-user": "使用者 $1 要求重設在 {{SITENAME}} ($4) 的密碼,下列是與此電子郵件位址有關的使用者{{PLURAL:$3|帳號}}:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}將會在{{PLURAL:$5|一天|$5 天}}內到期,\n您應立即登入並更改新的密碼。如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
        "passwordreset-emailsent": "已寄出重設密碼的電子郵件。",
        "passwordreset-emailsent-capture": "已寄出重設密碼的電子郵件,並於下方顯示。",
        "passwordreset-emailerror-capture": "下列為重設密碼的電子郵件內容,傳送給{{GENDER:$2|使用者}}失敗:$1",
-       "changeemail": "變更電子郵地址",
-       "changeemail-text": "完成此表單以修改您的電子郵地址,您需要輸入您的密碼來確認此次變更。",
+       "changeemail": "變更電子郵地址",
+       "changeemail-text": "完成此表單以修改您的電子郵地址,您需要輸入您的密碼來確認此次變更。",
        "changeemail-no-info": "您必須登入方可直接存取此頁面。",
-       "changeemail-oldemail": "目前的電地址:",
-       "changeemail-newemail": "新的電地址:",
+       "changeemail-oldemail": "目前的電子郵件地址:",
+       "changeemail-newemail": "新的電子郵件地址:",
        "changeemail-none": "(無)",
        "changeemail-password": "您於 {{SITENAME}} 的密碼:",
-       "changeemail-submit": "變更電子郵",
+       "changeemail-submit": "變更電子郵",
        "changeemail-throttled": "您最近嘗試了太多次登入。\n請等待 $1 後再試。",
        "resettokens": "重設金鑰",
        "resettokens-text": "您可以在此重設用來存取您帳號相關隱私資料的金鑰。\n\n若您不小心將您的密鑰分享給其他人或您的帳號已遭到入侵、破壞,應該要重設此金鑰。",
        "subject-preview": "主旨/標題預覽:",
        "blockedtitle": "使用者已被封鎖",
        "blockedtext": "<strong>您的使用者名稱或 IP 位址以被封鎖。</strong>\n\n您被 $1 封鎖,\n原因爲 <em>$2</em>。\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯絡 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件地址,且尚未被封鎖郵件功能,則您可透過 \"Email 給此使用者\" 的功能來聯絡相關管理員。\n您目前的 IP 位址是 $3,此次封鎖的 ID 為 #$5。\n請您在詢問時附註以上詳細訊息。",
-       "autoblockedtext": "因先前的另一位使用者被 $1 封鎖,您的 IP 位址已被自動封鎖。\n原因是:\n\n:<em>$2</em>\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯絡 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件地址,且尚未被封鎖郵件功能,則您可透過 「Email 給此使用者」 的功能來聯絡相關管理員。\n您目前的 IP 位址是 $3,此次封鎖的 ID 爲 #$5。\n請您在詢問時附註以上詳細訊息。",
+       "autoblockedtext": "因先前的另一位使用者被 $1 封鎖,您的 IP 位址已被自動封鎖。\n原因是:\n\n:<em>$2</em>\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯絡 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件地址,且尚未被封鎖郵件功能,則您可透過 \"Email 給此使用者\" 的功能來聯絡相關管理員。\n您目前的 IP 位址是 $3,此次封鎖的 ID 爲 #$5。\n請您在詢問時附註以上詳細訊息。",
        "blockednoreason": "未說明原因",
        "whitelistedittext": "請先 $1 才可編輯頁面。",
-       "confirmedittext": "在編輯此頁之前您必須確認您的電郵地址。\n請透過 [[Special:Preferences|偏好設定]] 設定並驗證您的電郵地址。",
+       "confirmedittext": "在編輯此頁之前您必須確認您的電子郵件地址。\n請透過 [[Special:Preferences|偏好設定]] 設定並驗證您的電子郵件地址。",
        "nosuchsectiontitle": "找不到章節",
        "nosuchsectiontext": "您嘗試編輯的章節並不存在。\n可能在您檢視頁面時已經移動或刪除。",
        "loginreqtitle": "需要登入",
        "last": "前筆",
        "page_first": "第一頁",
        "page_last": "最後頁",
-       "histlegend": "比較選擇的版本差異:選要比較修訂版本的單選方塊並點選底部的按鈕進行比較。<br />\n符號說明:<strong>({{int:cur}})</strong> = 與最新的修訂版本比較,<strong>({{int:last}})</strong> = 與前一筆修訂版本比較,<strong>{{int:minoreditletter}}</strong> = 小修訂。",
+       "histlegend": "比對選擇的版本差異:選擇要比對修訂版本的單選方塊並點選底部的按鈕進行比對。<br />\n符號說明:<strong>({{int:cur}})</strong> = 與最新的修訂版本比對,<strong>({{int:last}})</strong> = 與前一筆修訂版本比對,<strong>{{int:minoreditletter}}</strong> = 小修訂。",
        "history-fieldset-title": "瀏覽歷史",
        "history-show-deleted": "只顯示已刪除的修訂",
        "histfirst": "最舊",
        "logdelete-text": "已刪除的日誌活動仍會出現於日誌中,但其部分內容將不會向公眾開放存取。",
        "revdelete-text-others": "若未設定額外條件,其他管理員仍有權限檢視與取消刪除隱藏的內容。",
        "revdelete-confirm": "請確認您是否明白此動作會造成的後果,以及您所做的動作是否符合[[{{MediaWiki:Policy-url}}|政策]]規範。",
-       "revdelete-suppress-text": "隱藏顯示應<strong>只有</strong>在下述情形時使用:\n* 潛在誹謗的資訊\n* 不恰當的個人資料\n*: <em>住家地址、電話號碼、身分證號碼等。</em>",
+       "revdelete-suppress-text": "禁止顯示應<strong>只有</strong>在下述情形時使用:\n* 潛在誹謗的資訊\n* 不恰當的個人資料\n*: <em>住家地址、電話號碼、身分證號碼等。</em>",
        "revdelete-legend": "設定顯示限制",
        "revdelete-hide-text": "修訂文字",
        "revdelete-hide-image": "隱藏檔案內容",
        "prefs-watchlist-token": "監視清單金鑰:",
        "prefs-misc": "其他",
        "prefs-resetpass": "變更密碼",
-       "prefs-changeemail": "變更電子郵地址",
-       "prefs-setemail": "設定電子郵地址",
-       "prefs-email": "電子郵選項",
+       "prefs-changeemail": "變更電子郵地址",
+       "prefs-setemail": "設定電子郵地址",
+       "prefs-email": "電子郵選項",
        "prefs-rendering": "外觀",
        "saveprefs": "儲存",
        "restoreprefs": "還原所有預設設定 (所有項目)",
        "prefs-custom-js": "自訂 JavaScript",
        "prefs-common-css-js": "所有外觀共用的 CSS/JavaScript:",
        "prefs-reset-intro": "您可以使用此頁面重設您的偏好設定為網站預設值。\n這個動作將無法復原。",
-       "prefs-emailconfirm-label": "電子郵確認:",
-       "youremail": "電子郵箱:",
+       "prefs-emailconfirm-label": "電子郵確認:",
+       "youremail": "Email:",
        "username": "{{GENDER:$1|使用者名稱}}:",
        "prefs-memberingroups": "{{GENDER:$2|所屬}}{{PLURAL:$1|群組}}:",
        "prefs-registration": "註冊時間:",
        "gender-male": "他編輯了 Wiki 頁面",
        "gender-female": "她編輯了 Wiki 頁面",
        "prefs-help-gender": "此偏好設定為選填欄位。\n系統會使用您選擇的方式稱呼您,對他人提及您時也會使用適當語法稱呼。\n此項資訊會被公開。",
-       "email": "電子郵箱",
+       "email": "Email",
        "prefs-help-realname": "真實姓名為選填欄位。\n若提供,真實姓名可能會用來作為您的作品的署名。",
        "prefs-help-email": "電子郵件地址為選填欄位。\n但在重設密碼時會使用,而您很有可能會忘記密碼。",
-       "prefs-help-email-others": "您亦可以選擇讓其他使用者透過您的電子郵箱、使用者頁面或對話頁面的連結與您聯絡。\n您的電子郵箱地址不會洩漏給其他要聯絡您的使用者。",
+       "prefs-help-email-others": "您亦可以選擇讓其他使用者透過您的電子郵件、使用者頁面或對話頁面的連結與您聯絡。\n您的電子郵件地址不會洩漏給其他要聯絡您的使用者。",
        "prefs-help-email-required": "電子郵件地址是必填項目。",
        "prefs-info": "基本資訊",
        "prefs-i18n": "國際化",
        "prefs-help-prefershttps": "此偏好設定將於您下次登入時生效。",
        "prefswarning-warning": "您對您的偏好設定所做的變更尚未儲存。\n若您未點選 \"$1\" 離開此頁面,將不會更新您的偏好設定。",
        "prefs-tabs-navigation-hint": "提示:您可使用左、右方向鍵切換頁籤。",
-       "email-address-validity-valid": "電子郵地址有效",
-       "email-address-validity-invalid": "請輸入一個有效的電子郵件址",
+       "email-address-validity-valid": "電子郵地址有效",
+       "email-address-validity-invalid": "請輸入一個有效的電子郵件址",
        "userrights": "使用者權限管理",
        "userrights-lookup-user": "管理使用者群組",
        "userrights-user-editname": "請輸入使用者名稱:",
        "group-bot-member": "機器人",
        "group-sysop-member": "{{GENDER:$1|管理員}}",
        "group-bureaucrat-member": "行政員",
-       "group-suppress-member": "監督員",
+       "group-suppress-member": "{{GENDER:$1|監督員}}",
        "grouppage-user": "{{ns:project}}:使用者",
        "grouppage-autoconfirmed": "{{ns:project}}:自動確認使用者",
        "grouppage-bot": "{{ns:project}}:機器人",
        "grouppage-sysop": "{{ns:project}}:管理員",
        "grouppage-bureaucrat": "{{ns:project}}:行政員",
-       "grouppage-suppress": "{{ns:project}}:監督",
+       "grouppage-suppress": "{{ns:project}}:監督",
        "right-read": "閱讀頁面",
        "right-edit": "編輯頁面",
        "right-createpage": "建立頁面 (不含討論頁面)",
        "right-editmyuserjs": "編輯自己的使用者 JavaScript 檔",
        "right-viewmywatchlist": "檢視自己的監視清單",
        "right-editmywatchlist": "編輯自己的監視清單。注意,即使無此權限,某些操作仍會新增頁面至監視清單。",
-       "right-viewmyprivateinfo": "檢視自己的私隱資料(如:電子郵件地址及真實姓名)",
-       "right-editmyprivateinfo": "編輯自己的隱私資料(如:電子郵件地址及真實姓名)",
+       "right-viewmyprivateinfo": "檢視自己的私隱資料 (如:電子郵件地址及真實姓名)",
+       "right-editmyprivateinfo": "編輯自己的隱私資料 (如:電子郵件地址及真實姓名)",
        "right-editmyoptions": "編輯自己的偏好設定",
        "right-rollback": "快速還原最後一位使用者對某一頁面的編輯",
        "right-markbotedits": "標示還原編輯為機械人編輯",
        "action-editcontentmodel": "編輯頁面的內容模型",
        "action-managechangetags": "建立並自資料庫移除標籤",
        "nchanges": "$1 次變更",
-       "enhancedrc-since-last-visit": "{{PLURAL:$1|自上次訪}}已有 $1",
+       "enhancedrc-since-last-visit": "{{PLURAL:$1|自上次訪}}已有 $1",
        "enhancedrc-history": "歷史",
        "recentchanges": "近期變更",
        "recentchanges-legend": "近期變更選項",
        "rcshowhideliu": "$1 已註冊的使用者",
        "rcshowhideliu-show": "顯示",
        "rcshowhideliu-hide": "隱藏",
-       "rcshowhideanons": "$1 匿名使用者",
+       "rcshowhideanons": "$1 匿名使用者",
        "rcshowhideanons-show": "顯示",
        "rcshowhideanons-hide": "隱藏",
        "rcshowhidepatr": "$1 巡查過的編輯",
        "rcshowhidemine": "$1 我的編輯",
        "rcshowhidemine-show": "顯示",
        "rcshowhidemine-hide": "隱藏",
-       "rclinks": "顯示最近 $2 天內的 $1 次更改。<br />$3",
+       "rclinks": "顯示近期 $2 天內的 $1 次變更。<br />$3",
        "diff": "差異",
        "hist": "歷史",
        "hide": "隱藏",
        "unusedimages": "未使用的檔案",
        "wantedcategories": "需要的分類",
        "wantedpages": "需要的頁面",
+       "wantedpages-summary": "以下為最多連結的不存在頁面,除只有重新導向連結的頁面外。 若要取得不存在的重新導向頁面,請至 [[{{#special:BrokenRedirects}}]]。",
        "wantedpages-badtitle": "結果集合中的標題無效:$1",
        "wantedfiles": "需要的檔案",
        "wantedfiletext-cat": "下列檔案被時用,但檔案不存在。 外部儲存庫的檔案儘管存在,但此清單仍會列出。 這類誤報的項目會以 <del>刪除線</del> 標示。 另外,頁面內嵌檔案不存在會於清單 [[:$1]] 中顯示。",
        "mostinterwikis": "最多跨 Wiki 的頁面",
        "mostrevisions": "最多修訂的頁面",
        "prefixindex": "所有頁面與字首",
-       "prefixindex-namespace": "所有含字首的頁面 ($1 命名空間)",
+       "prefixindex-namespace": "所有含字首的頁面 ($1 命名空間)",
        "prefixindex-strip": "於清單中省略字首",
        "shortpages": "過短的頁面",
        "longpages": "過長的頁面",
        "nopagetext": "您所指定的目標頁面並不存在。",
        "pager-newer-n": "較新 $1 筆",
        "pager-older-n": "較舊 $1 筆",
-       "suppress": "監督",
+       "suppress": "失職",
        "querypage-disabled": "此特殊頁面因考量效能問題已被停用。",
        "apihelp": "API 說明",
        "apihelp-no-such-module": "查無模組 \"$1\"。",
        "booksources-text": "下列清單包含其他銷售新書籍或二手書籍的網站連結,可會有你想尋找書籍的進一部資訊:",
        "booksources-invalid-isbn": "您提供的 ISBN 不正確,請檢查複製的來源是否有誤。",
        "specialloguserlabel": "執行者:",
-       "speciallogtitlelabel": "目標(標題或使用者):",
+       "speciallogtitlelabel": "目標 (標題或使用者):",
        "log": "日誌",
        "all-logs-page": "所有公開日誌",
        "alllogstext": "合併顯示所有 {{SITENAME}} 中所有類型的日誌。\n您可以點選下拉式選單選擇日誌的類型,指定使用者名稱 (區分大小寫) 或影響的頁面 (區分大小寫)。",
        "allpagesfrom": "顯示頁面開始於:",
        "allpagesto": "顯示頁面結束於:",
        "allarticles": "所有頁面",
-       "allinnamespace": "所有頁面 ($1 命名空間)",
+       "allinnamespace": "所有頁面 ($1 命名空間)",
        "allpagessubmit": "執行",
        "allpagesprefix": "顯示以此為字首頁面:",
        "allpagesbadtitle": "指定的頁面標題無效、包含內部語言或內部 Wiki 的字首。\n它可能包含一個或多個的不能用於標題的字元。",
        "emailpagetext": "您可以使用以下表格傳送電子郵件給這位 {{Gender:$1|使用者}}。\n您在 [[Special:Preferences|偏好設定]] 中所輸入的電子郵件位址將會作為郵件的 \"寄件人\",因此該使用者可直接回覆您。",
        "defemailsubject": "{{SITENAME}} 使用者 \"$1\" 寄來的電子郵件",
        "usermaildisabled": "使用者電子郵件已停用",
-       "usermaildisabledtext": "您不能傳送郵件到本 Wiki 上的其他使用者",
-       "noemailtitle": "沒有電子郵件位址",
+       "usermaildisabledtext": "æ\82¨ä¸\8dè\83½å\82³é\80\81é\9b»å­\90é\83µä»¶å\88°æ\9c¬ Wiki ä¸\8aç\9a\84å\85¶ä»\96使ç\94¨è\80\85",
+       "noemailtitle": "無電子郵件地址",
        "noemailtext": "此使用者尚未指定一個有效的電子郵件地址。",
        "nowikiemailtext": "此使用者選擇不接收其他使用者的信件。",
        "emailnotarget": "收件人不存在或無效的使用者名稱。",
        "emailsent": "已寄出電子郵件",
        "emailsenttext": "已寄出您的電子郵件訊息。",
        "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"Email 給此使用者\" 功能寄給 $2。",
-       "usermessage-summary": "留下系統訊息。",
+       "usermessage-summary": "留訊息至系統。",
        "usermessage-editor": "系統訊息",
        "watchlist": "監視清單",
        "mywatchlist": "監視清單",
        "thumbnail_image-missing": "檔案遺失:$1",
        "thumbnail_image-failure-limit": "最近顯示此縮圖已發生太多次失敗 ($1 次或更多),請稍後再試。",
        "import": "匯入頁面",
-       "importinterwiki": "Transwiki 匯入",
-       "import-interwiki-text": "請選擇一個 Wiki 與頁面標題以進行匯入。\n會同時記錄修訂日期和編輯者的名稱。\n所有的 Transwiki 匯入操作會被記錄在 [[Special:Log/import|匯入日誌]]。",
+       "importinterwiki": "從其他 wiki 匯入",
+       "import-interwiki-text": "請選擇一個 Wiki 與頁面標題以進行匯入。\n會同時記錄修訂日期和編輯者的名稱。\n所有的從其他 Wiki 匯入操作都會被記錄在 [[Special:Log/import|匯入日誌]]。",
        "import-interwiki-sourcewiki": "來源 Wiki:",
        "import-interwiki-sourcepage": "來源頁面:",
        "import-interwiki-history": "複製此頁的所有歷史修訂",
        "importcantopen": "無法開啟匯入檔案",
        "importbadinterwiki": "無效的 Interwiki 連結",
        "importsuccess": "已完成匯入!",
-       "importnosources": "未定義任何 Transwiki 匯入來源且已關閉使用歷史記錄上傳功能。",
+       "importnosources": "未定義任何已匯入的 wiki 來源且已關閉使用歷史記錄上傳功能。",
        "importnofile": "未上傳匯入檔案。",
        "importuploaderrorsize": "上傳匯入檔案失敗。\n檔案大小超過允許上傳大小。",
        "importuploaderrorpartial": "上傳匯入檔案失敗。\n僅上傳部份檔案。",
        "import-rootpage-nosubpage": "命名空間 \"$1\" 的根頁面不允許子頁面。",
        "importlogpage": "匯入日誌",
        "importlogpagetext": "管理性匯入其他 Wiki 的頁面及編輯歷史記錄。",
-       "import-logentry-upload": "使用檔案上傳匯入 [[$1]]",
        "import-logentry-upload-detail": "已匯入 $1 筆{{PLURAL:$1|修訂}}",
-       "import-logentry-interwiki": "Transwiki 頁面 $1",
        "import-logentry-interwiki-detail": "已從 $2 匯入 $1 筆{{PLURAL:$1|修訂}}",
        "javascripttest": "JavaScript 測試",
        "javascripttest-pagetext-noframework": "此頁面保留用來作為 JavaScript 測試使用。",
        "pageinfo-few-watchers": "少於 $1 名監視者",
        "pageinfo-redirects-name": "指向此頁面的重新導向頁面數量",
        "pageinfo-subpages-name": "此頁面的子頁面數",
-       "pageinfo-subpages-value": "$1 ($2 個{{PLURAL:$2|重新導向}}; $3 個{{PLURAL:$3|非重新導向}})",
+       "pageinfo-subpages-value": "$1 ($2 個{{PLURAL:$2|重新導向}}; $3 個{{PLURAL:$3|非重新導向}})",
        "pageinfo-firstuser": "頁面建立者",
        "pageinfo-firsttime": "頁面建立日期",
        "pageinfo-lastuser": "最近編輯者",
        "exif-countrydest": "顯示國家",
        "exif-countrycodedest": "顯示國家代碼",
        "exif-provinceorstatedest": "顯示省或州",
-       "exif-citydest": "顯示城市",
+       "exif-citydest": "顯示城市",
        "exif-sublocationdest": "顯示城市詳細地點",
        "exif-objectname": "簡稱",
        "exif-specialinstructions": "特別說明",
        "exif-editstatus": "圖片編輯狀態",
        "exif-urgency": "緊急性",
        "exif-fixtureidentifier": "夾具名稱",
-       "exif-locationdest": "位置描述",
+       "exif-locationdest": "描繪地點",
        "exif-locationdestcode": "位置代碼描述",
-       "exif-objectcycle": "åª\92é«\94ç\9a\84時間",
+       "exif-objectcycle": "åª\92é«\94ç\99¼ç\94\9f時間",
        "exif-contact": "聯絡資訊",
        "exif-writer": "作家",
        "exif-languagecode": "語言",
        "exif-intellectualgenre": "項目類型",
        "exif-subjectnewscode": "主題代碼",
        "exif-scenecode": "IPTC 現場代碼",
-       "exif-event": "事件描述",
-       "exif-organisationinimage": "組織描述",
-       "exif-personinimage": "æ\89\80æ\8f\8fè¿°ç\9a\84人",
+       "exif-event": "描繪事件",
+       "exif-organisationinimage": "描繪組織",
+       "exif-personinimage": "æ\8f\8f繪人ç\89©",
        "exif-originalimageheight": "裁切前的高度",
        "exif-originalimagewidth": "裁切前的寬度",
        "exif-compression-1": "未壓縮",
        "exif-sensingmethod-8": "連續彩色線性感測器",
        "exif-filesource-3": "數位相機",
        "exif-scenetype-1": "直接照像圖片",
-       "exif-customrendered-0": "標準處理",
-       "exif-customrendered-1": "自定義處理",
+       "exif-customrendered-0": "一般程序",
+       "exif-customrendered-1": "自訂程序",
        "exif-exposuremode-0": "自動曝光",
        "exif-exposuremode-1": "手動曝光",
-       "exif-exposuremode-2": "自動曝光感知調節",
+       "exif-exposuremode-2": "自動包圍曝光",
        "exif-whitebalance-0": "自動白平衡",
        "exif-whitebalance-1": "手動白平衡",
        "exif-scenecapturetype-0": "標準",
        "exif-gpslongitude-w": "西經",
        "exif-gpsaltitude-above-sealevel": "海拔 $1 {{PLURAL:$1|公尺}}",
        "exif-gpsaltitude-below-sealevel": "海拔負 $1 {{PLURAL:$1|公尺}}",
-       "exif-gpsstatus-a": "測é\87\8fé\81\8eç¨\8b",
-       "exif-gpsstatus-v": "互動測量",
+       "exif-gpsstatus-a": "測é\87\8fé\80²è¡\8c中",
+       "exif-gpsstatus-v": "測量互通性",
        "exif-gpsmeasuremode-2": "二維測量",
        "exif-gpsmeasuremode-3": "三維測量",
        "exif-gpsspeed-k": "每小時公里",
        "exif-ycbcrpositioning-1": "中間",
        "exif-ycbcrpositioning-2": "同時取樣",
        "exif-dc-contributor": "貢獻者",
-       "exif-dc-coverage": "時間或空間性介質範圍",
+       "exif-dc-coverage": "媒體的時空範圍",
        "exif-dc-date": "日期",
        "exif-dc-publisher": "出版商",
        "exif-dc-relation": "相關媒體",
        "exif-dc-rights": "權利",
        "exif-dc-source": "來源媒體",
-       "exif-dc-type": "介質類型",
+       "exif-dc-type": "媒體類型",
        "exif-rating-rejected": "已拒絕",
        "exif-isospeedratings-overflow": "大於 65535",
        "exif-iimcategory-ace": "藝術、文化與娛樂",
        "exif-urgency-other": "使用者自訂優先權 ($1)",
        "namespacesall": "全部",
        "monthsall": "全部",
-       "confirmemail": "確認電子郵地址",
-       "confirmemail_noemail": "您尚未在 [[Special:Preferences|偏好設定]] 中輸入一個有效的電子郵地址。",
-       "confirmemail_text": "{{SITENAME}}要求您在使用郵件功能之前驗證您的電子郵箱地址。\n點選以下按鈕可向您的電子郵箱傳送一封確認郵件。該郵件包含有一行代碼連結;\n請在您的瀏覽器中載入此連結以確認您的電子郵箱地址是有效的。",
+       "confirmemail": "確認電子郵地址",
+       "confirmemail_noemail": "您尚未在 [[Special:Preferences|偏好設定]] 中輸入一個有效的電子郵地址。",
+       "confirmemail_text": "{{SITENAME}} 要求您在使用郵件功能之前驗證您的電子郵件地址。\n點選以下按鈕可向您的電子郵件傳送一封確認郵件。該郵件包含有一行代碼連結;\n請在您的瀏覽器中載入此連結以確認您的電子郵件地址是有效的。",
        "confirmemail_pending": "確認碼已傳送至您的電子郵件,\n若您才剛建立好您的帳號,可能需要稍後幾分鐘才能收到。\n若沒有收到,請再重新申請一次確認碼。",
-       "confirmemail_send": "電子郵箱確認代碼",
+       "confirmemail_send": "電子郵件確認碼",
        "confirmemail_sent": "確認郵件已寄出。",
-       "confirmemail_oncreate": "確認碼已傳送至您的電子郵件地址。\n登入動作不需要使用此代碼,但開啟在 Wiki 中任何以電子郵件為基礎的功能會需要先提供此代碼。",
-       "confirmemail_sendfailed": "{{SITENAME}}無法傳送確認郵件,請檢查電子郵件址是否包含非法字元。\n\n郵件傳送員回應: $1",
+       "confirmemail_oncreate": "確認碼已傳送至您的電子郵件地址。\n登入動作不需要使用此代碼,但開啟在 Wiki 中任何以電子郵件為基礎的功能會需要先提供此代碼。",
+       "confirmemail_sendfailed": "{{SITENAME}}無法傳送確認郵件,請檢查電子郵件址是否包含非法字元。\n\n郵件傳送員回應: $1",
        "confirmemail_invalid": "無效的確認碼,該代碼可能已經過期。",
-       "confirmemail_needlogin": "請 $1 以確認您的電子郵地址。",
-       "confirmemail_success": "您的電子郵已經被確認。您現在可以 [[Special:UserLogin|登入]] 並使用此網站了。",
-       "confirmemail_loggedin": "已確認您的電子郵地址。",
-       "confirmemail_subject": "{{SITENAME}} 電子郵地址確認",
+       "confirmemail_needlogin": "請 $1 以確認您的電子郵地址。",
+       "confirmemail_success": "您的電子郵已經被確認。您現在可以 [[Special:UserLogin|登入]] 並使用此網站了。",
+       "confirmemail_loggedin": "已確認您的電子郵地址。",
+       "confirmemail_subject": "{{SITENAME}} 電子郵地址確認",
        "confirmemail_body": "不明人士 (可能是您自己,來自 IP 位址 $1) 已在 {{SITENAME}} 註冊了一個帳號 「$2」 並使用了此 Email 地址。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以開啟在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
-       "confirmemail_body_changed": "不明人士 (可能是您自己,來自 IP 位址 $1)  已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件址更改至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以開啟在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
+       "confirmemail_body_changed": "不明人士 (可能是您自己,來自 IP 位址 $1)  已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件址更改至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以開啟在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
        "confirmemail_body_set": "不明人士 (可能是您自己,來自 IP 位址 $1) 已將在 {{SITENAME}} 帳號 「$2」 的電子郵件地址設定至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以開啟在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
-       "confirmemail_invalidated": "已取消電子郵地址確認",
+       "confirmemail_invalidated": "已取消電子郵地址確認",
        "invalidateemail": "取消電子郵件確認",
        "scarytranscludedisabled": "[Interwiki 轉換代碼不可用]",
        "scarytranscludefailed": "[模板 $1 讀取失敗]",
        "tags-create-submit": "建立",
        "tags-create-no-name": "您必須指定一個標籤名稱。",
        "tags-create-invalid-chars": "標籤名稱不可包含逗號 (<code>,</code>) 或斜線 (<code>/</code>)。",
+       "tags-create-invalid-title-chars": "標籤名稱不能含有無法使用者頁面標題的字元。",
        "tags-create-already-exists": "標籤 \"$1\" 已存在。",
+       "tags-create-warnings-above": "嘗試建立標籤 \"$1\" 時發生下列{{PLURAL:$2|警告}}:",
        "tags-create-warnings-below": "您是否要繼續建立標籤?",
        "tags-delete-title": "刪除標籤",
        "tags-delete-explanation-initial": "您正要從資料庫刪除標籤 \"$1\"。",
+       "tags-delete-explanation-in-use": "標籤會自目前正在使用的{{PLURAL:$2| $2 個修訂或日誌項目| $2 修訂或日誌項目}}中移除。",
+       "tags-delete-explanation-warning": "此動作是 <strong>無法還原的</strong> 且 <strong>無法取消的</strong>,即使是資料庫管理者也無法。 請確認您要刪除的標題。",
+       "tags-delete-explanation-active": "<strong>標籤 \"$1\" 尚在使用,無法刪除。</strong> 要停止標籤使用,請至套用該標籤的頁面,並於該處將標籤停用。",
        "tags-delete-reason": "原因:",
        "tags-delete-submit": "無法取消刪除此標籤",
+       "tags-delete-not-allowed": "無法刪除由擴充套件定義的標籤,除非該擴充套件允許。",
        "tags-delete-not-found": "標籤 \"$1\" 不存在。",
+       "tags-delete-too-many-uses": "標籤 \"$1\" 會套用至 $2 筆以上的{{PLURAL:$2|修訂|修訂}},這代表該標籤將無法刪除。",
+       "tags-delete-warnings-after-delete": "標籤 \"$1\" 已刪除成功,但發生下列{{PLURAL:$2|警告|警告}}:",
        "tags-activate-title": "啟動標籤",
        "tags-activate-question": "您正要啟動標籤 \"$1\"。",
        "tags-activate-reason": "原因:",
        "compare-revision-not-exists": "您所指定的修訂不存在。",
        "dberr-problems": "抱歉!這個網站出現了一些技術上的問題。",
        "dberr-again": "嘗試等候數分鐘後,然後再試。",
-       "dberr-info": "(無法存取資料庫: $1)",
-       "dberr-info-hidden": "(無法連接資料庫)",
+       "dberr-info": "(無法存取資料庫:$1)",
+       "dberr-info-hidden": "(無法存取資料庫)",
        "dberr-usegoogle": "您可以嘗試在此期間使用 Google 搜尋。",
        "dberr-outofdate": "注意,它們用來建立索引的內容可能不是最新的。",
        "dberr-cachederror": "這是請求面頁面的快取複本,可能不是最新的。",
        "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-block-reblock": "$1 {{GENDER:$2|已變更}} {{GENDER:$4|$3}} 的封鎖設定期限為 $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|已封鎖}} {{GENDER:$4|$3}} 期限為 $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|已變更}} {{GENDER:$4|$3}} 的封鎖設定期限為 $5 $6",
+       "logentry-import-upload": "$1 已由檔案上傳{{GENDER:$2|匯入}} $3",
+       "logentry-import-interwiki": "$1 已由其他 wiki {{GENDER:$2|匯入}} $3",
        "logentry-merge-merge": "$1 將 $3 {{GENDER:$2|合併}}至 $4 (修訂版本至 $5)",
        "logentry-move-move": "$1 {{GENDER:$2|已移動}}頁面 $3 至 $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|已移動}}頁面 $3 至 $4,不保留重新導向",
        "logentry-upload-revert": "$1 {{GENDER:$2|已上傳}} $3",
        "log-name-managetags": "標籤管理日誌",
        "log-description-managetags": "此頁面列出與[[Special:Tags|標籤]]相關的管理工作項目。 在日誌中僅包含由管理員手動所做的操作;被 Wiki 軟體所建立或刪除的標籤項目,不會記錄在此日誌中",
+       "logentry-managetags-create": "$1 {{GENDER:$2|已建立}}標籤 \"$4\"",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|已刪除}}標籤 \"$4\" (已自 $5 個{{PLURAL:$5|修訂或日誌|修訂或日誌}}中移除)",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|已啟用}}標籤 \"$4\" 供使用者與機器人使用",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|已停用}}標籤 \"$4\" 供使用者與機器人使用",
        "rightsnone": "(無)",
        "revdelete-summary": "編輯摘要",
        "feedback-adding": "正在新增意見回饋至頁面...",
+       "feedback-back": "返回",
        "feedback-bugcheck": "很好! 檢查一下您的意見是不是已經被列為 [$1 已知問題]。",
        "feedback-bugnew": "我已經檢查。 回報新問題",
        "feedback-bugornote": "如果您準備要詳細描述一個技術問題,請至 [$1 回報問題]。\n或您可以使用以下的簡易表單回報問題,您的使用者名稱與評論將被新增到 [$3 $2] 頁面。",
        "feedback-cancel": "取消",
        "feedback-close": "完成",
+       "feedback-external-bug-report-button": "回報技術問題",
+       "feedback-dialog-title": "送出意見回饋",
+       "feedback-dialog-intro": "您可以使用以下簡易表單傳送您的意見回饋。您的意見將會使用您的使用者名稱新增至頁面 \"$1\"。",
+       "feedback-error-title": "錯誤",
        "feedback-error1": "錯誤:無法識別 API 回傳的結果",
        "feedback-error2": "錯誤:編輯失敗",
        "feedback-error3": "錯誤:API 沒有回應",
        "feedback-message": "訊息:",
        "feedback-subject": "主旨:",
        "feedback-submit": "送出",
+       "feedback-terms": "我了解我的使用者代理資訊包含完整的瀏覽器與作業系統版本資訊,且該資訊將會與意見回饋一同公開共享。",
+       "feedback-termsofuse": "我同意依照使用條款提供意見回饋。",
        "feedback-thanks": "感謝!您的意見回饋已發佈到頁面 \"[$2 $1]\"。",
+       "feedback-thanks-title": "感謝您!",
+       "feedback-useragent": "使用者代理:",
        "searchsuggest-search": "搜尋",
        "searchsuggest-containing": "包含...",
        "api-error-badaccess-groups": "您沒有權限在此 Wiki 上傳檔案。",
        "json-error-utf8": "格式不正確的 UTF-8 字元,可能被不正確編碼",
        "json-error-recursion": "在資料中有一個或多個的遞迴參照值被編碼",
        "json-error-inf-or-nan": "在資料中有一個或多個的 NAN 或 INF 值被編碼",
-       "json-error-unsupported-type": "下列的資料型態無法被編碼"
+       "json-error-unsupported-type": "下列的資料型態無法被編碼",
+       "headline-anchor-title": "連結至此章節"
 }
index e0848d0..c9994e2 100644 (file)
@@ -58,7 +58,7 @@ $specialPageAliases = array(
        'CreateAccount'             => array( 'Benutzerkonto_anlegen' ),
        'Deadendpages'              => array( 'Sackgassenseiten' ),
        'DeletedContributions'      => array( 'Gelöschte_Beiträge' ),
-       'Diff'                      => array( 'Unterschied' ),
+       'Diff'                      => array( 'Diff', 'Differenz', 'Unterschied' ),
        'DoubleRedirects'           => array( 'Doppelte_Weiterleitungen' ),
        'EditWatchlist'             => array( 'Beobachtungsliste_bearbeiten' ),
        'Emailuser'                 => array( 'E-Mail_senden', 'Mailen', 'E-Mail' ),
index b04639c..47866dc 100644 (file)
@@ -113,6 +113,7 @@ class RebuildLocalisationCache extends Maintenance {
                $total = count( $codes );
                $chunks = array_chunk( $codes, ceil( count( $codes ) / $threads ) );
                $pids = array();
+               $parentStatus = 0;
                foreach ( $chunks as $codes ) {
                        // Do not fork for only one thread
                        $pid = ( $threads > 1 ) ? pcntl_fork() : -1;
@@ -121,9 +122,8 @@ class RebuildLocalisationCache extends Maintenance {
                                // Child, reseed because there is no bug in PHP:
                                // http://bugs.php.net/bug.php?id=42465
                                mt_srand( getmypid() );
-                               $numRebuilt = $this->doRebuild( $codes, $lc, $force );
-                               // Abuse the exit value for the count of rebuild languages
-                               exit( $numRebuilt );
+                               $this->doRebuild( $codes, $lc, $force );
+                               exit( 0 );
                        } elseif ( $pid === -1 ) {
                                // Fork failed or one thread, do it serialized
                                $numRebuilt += $this->doRebuild( $codes, $lc, $force );
@@ -136,13 +136,20 @@ class RebuildLocalisationCache extends Maintenance {
                foreach ( $pids as $pid ) {
                        $status = 0;
                        pcntl_waitpid( $pid, $status );
-                       // Fetch the count from the return value
-                       $numRebuilt += pcntl_wexitstatus( $status );
+                       if ( pcntl_wexitstatus( $status ) ) {
+                               // Pass a fatal error code through to the caller
+                               $parentStatus = pcntl_wexitstatus( $status );
+                       }
                }
 
-               $this->output( "$numRebuilt languages rebuilt out of $total\n" );
-               if ( $numRebuilt === 0 ) {
-                       $this->output( "Use --force to rebuild the caches which are still fresh.\n" );
+               if ( !$pids ) {
+                       $this->output( "$numRebuilt languages rebuilt out of $total\n" );
+                       if ( $numRebuilt === 0 ) {
+                               $this->output( "Use --force to rebuild the caches which are still fresh.\n" );
+                       }
+               }
+               if ( $parentStatus ) {
+                       exit( $parentStatus );
                }
        }
 
index 862a983..2bc7510 100644 (file)
@@ -23,7 +23,7 @@
 require_once __DIR__ . '/Maintenance.php';
 
 /**
- * Maintenance script to dump the SiteStore as a static json file.
+ * Maintenance script to dump a SiteStore as a static json file.
  *
  * @ingroup Maintenance
  */
@@ -32,17 +32,17 @@ class RebuildSitesCache extends Maintenance {
        public function __construct() {
                parent::__construct();
 
-               $this->mDescription = "Dumps site store as json";
+               $this->mDescription = "Cache sites as json for file-based lookup.";
                $this->addOption( 'file', 'File to output the json to', false, true );
        }
 
        public function execute() {
-               $siteListFileCacheBuilder = new SiteListFileCacheBuilder(
-                       SiteSQLStore::newInstance(),
+               $sitesCacheFileBuilder = new SitesCacheFileBuilder(
+                       new DBSiteStore(),
                        $this->getCacheFile()
                );
 
-               $siteListFileCacheBuilder->build();
+               $sitesCacheFileBuilder->build();
        }
 
        /**
@@ -55,7 +55,7 @@ class RebuildSitesCache extends Maintenance {
                        $jsonFile = $this->getConfig()->get( 'SitesCacheFile' );
 
                        if ( $jsonFile === false ) {
-                               $this->error( 'Error: No sites cache file is set in configuration.', 1 );
+                               $this->error( 'Error: No file set in configuration for SitesCacheFile.', 1 );
                        }
                }
 
index 076582b..933212c 100644 (file)
@@ -8,6 +8,7 @@
   },
   "devDependencies": {
     "grunt": "0.4.5",
+    "grunt-cli": "0.1.13",
     "grunt-banana-checker": "0.2.0",
     "grunt-contrib-copy": "0.8.0",
     "grunt-contrib-jshint": "0.11.0",
index e90b24e..2c80a85 100644 (file)
@@ -820,6 +820,11 @@ return array(
                'scripts' => 'resources/src/mediawiki.api/mediawiki.api.login.js',
                'dependencies' => 'mediawiki.api',
        ),
+       'mediawiki.api.options' => array(
+               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.options.js',
+               'dependencies' => 'mediawiki.api',
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
        'mediawiki.api.parse' => array(
                'scripts' => 'resources/src/mediawiki.api/mediawiki.api.parse.js',
                'dependencies' => 'mediawiki.api',
@@ -892,9 +897,18 @@ return array(
                        'feedback-useragent'
                ),
        ),
+
+       'mediawiki.filewarning' => array(
+               'scripts' => 'resources/src/mediawiki/mediawiki.filewarning.js',
+               'styles' => 'resources/src/mediawiki/mediawiki.filewarning.less',
+               'dependencies' => array(
+                       'oojs-ui',
+               ),
+       ),
+
        'mediawiki.helplink' => array(
                'styles' => array(
-                       'resources/src/mediawiki/mediawiki.helplink.css',
+                       'resources/src/mediawiki/mediawiki.helplink.less',
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
index 2c99bdd..3a4e145 100644 (file)
@@ -7,5 +7,14 @@
        },
        "ooui-outline-control-move-down": "Færa atriði niður",
        "ooui-outline-control-move-up": "Færa atriði upp",
-       "ooui-toolbar-more": "Fleira"
+       "ooui-outline-control-remove": "Fjarlægja atriði",
+       "ooui-toolbar-more": "Fleira",
+       "ooui-toolgroup-expand": "Fleira",
+       "ooui-toolgroup-collapse": "Færra",
+       "ooui-dialog-message-accept": "Í lagi",
+       "ooui-dialog-message-reject": "Hætta við",
+       "ooui-dialog-process-error": "Eitthvað mistókst",
+       "ooui-dialog-process-dismiss": "Loka",
+       "ooui-dialog-process-retry": "Reyna aftur",
+       "ooui-dialog-process-continue": "Halda áfram"
 }
index 9840319..1d7317b 100644 (file)
@@ -7,5 +7,13 @@
        "ooui-outline-control-move-down": "Элементті төмен жылжыту",
        "ooui-outline-control-move-up": "Элементті жоғары жылжыту",
        "ooui-outline-control-remove": "Элементті алып тастау",
-       "ooui-toolbar-more": "толығырақ"
+       "ooui-toolbar-more": "толығырақ",
+       "ooui-toolgroup-expand": "Тағы",
+       "ooui-toolgroup-collapse": "Азырақ",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Қажет емес",
+       "ooui-dialog-process-error": "Бірдеңеден қате кетті",
+       "ooui-dialog-process-dismiss": "Тоқтату",
+       "ooui-dialog-process-retry": "Қайта байқап көріңіз",
+       "ooui-dialog-process-continue": "Жалғастыру"
 }
index 1bec097..ef92e49 100644 (file)
@@ -7,5 +7,13 @@
        "ooui-outline-control-move-down": "Элементни тюбюне кёчюр",
        "ooui-outline-control-move-up": "Элементни башына кёчюр",
        "ooui-outline-control-remove": "Пунктну кетер",
-       "ooui-toolbar-more": "Энтда"
+       "ooui-toolbar-more": "Энтда",
+       "ooui-toolgroup-expand": "Энтда",
+       "ooui-toolgroup-collapse": "Артха",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Ызына ал",
+       "ooui-dialog-process-error": "Не эсе да табсыз кетди",
+       "ooui-dialog-process-dismiss": "Джаб",
+       "ooui-dialog-process-retry": "Энтда сынаб кёр",
+       "ooui-dialog-process-continue": "Бардыр"
 }
index 53f1fb0..c975e82 100644 (file)
@@ -4,12 +4,16 @@
                        "Purodha"
                ]
        },
+       "ooui-outline-control-move-down": "Öm eine Plaz noh onge schiehbe",
+       "ooui-outline-control-move-up": "Öm eine Plaz noh bovve schiehbe",
+       "ooui-outline-control-remove": "Dä Plaz läddesch maache → fott domet!",
        "ooui-toolbar-more": "Mih",
        "ooui-toolgroup-expand": "Mih",
        "ooui-toolgroup-collapse": "Winnijer",
        "ooui-dialog-message-accept": "Lohß Jonn!",
        "ooui-dialog-message-reject": "Ophühre",
        "ooui-dialog-process-error": "Öhnsjädd es scheif jejange",
+       "ooui-dialog-process-dismiss": "Maach fott, ha_sch jelässe",
        "ooui-dialog-process-retry": "Norr_ens versöhke",
        "ooui-dialog-process-continue": "Wigger maache"
 }
index c9d0999..7b4d492 100644 (file)
        },
        "ooui-outline-control-move-down": "Ögeyi aşağı taşı",
        "ooui-outline-control-move-up": "Ögeyi yukarı taşı",
+       "ooui-outline-control-remove": "Ögeyi kaldır",
        "ooui-toolbar-more": "Dahası",
        "ooui-toolgroup-expand": "Dahası",
        "ooui-toolgroup-collapse": "Daha az",
-       "ooui-dialog-process-retry": "Tekrar dene"
+       "ooui-dialog-message-accept": "Tamam",
+       "ooui-dialog-message-reject": "İptal",
+       "ooui-dialog-process-error": "Bir şeyler yanlış gitti",
+       "ooui-dialog-process-dismiss": "Kapat",
+       "ooui-dialog-process-retry": "Tekrar dene",
+       "ooui-dialog-process-continue": "Devam et"
 }
index cdf7721..6be1e61 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.2
+ * OOjs UI v0.9.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-12T23:44:05Z
+ * Date: 2015-03-19T23:19:18Z
  */
 .oo-ui-icon-bell {
        background-image: url("themes/mediawiki/images/icons/bell.png");
index f919ec4..2e38c15 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.2
+ * OOjs UI v0.9.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-12T23:44:05Z
+ * Date: 2015-03-19T23:19:18Z
  */
 .oo-ui-icon-article {
        background-image: url("themes/mediawiki/images/icons/article-ltr.png");
index 6c866ab..020ebfb 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.2
+ * OOjs UI v0.9.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-12T23:44:05Z
+ * Date: 2015-03-19T23:19:18Z
  */
 .oo-ui-icon-table {
        background-image: url("themes/mediawiki/images/icons/table.png");
index 37a8562..44d383a 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.2
+ * OOjs UI v0.9.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-12T23:44:05Z
+ * Date: 2015-03-19T23:19:18Z
  */
 .oo-ui-icon-edit {
        background-image: url("themes/mediawiki/images/icons/edit-ltr.png");
index 8bebff8..62f9a65 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.2
+ * OOjs UI v0.9.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-12T23:44:05Z
+ * Date: 2015-03-19T23:19:18Z
  */
 .oo-ui-icon-indent {
        background-image: url("themes/mediawiki/images/icons/indent-ltr.png");
index fdda7c0..1acf7ea 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.2
+ * OOjs UI v0.9.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-12T23:44:05Z
+ * Date: 2015-03-19T23:19:18Z
  */
 .oo-ui-icon-bigger {
        background-image: url("themes/mediawiki/images/icons/bigger-ltr.png");
index e13873f..5497de0 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.2
+ * OOjs UI v0.9.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-12T23:44:05Z
+ * Date: 2015-03-19T23:19:18Z
  */
 .oo-ui-icon-beta {
        background-image: url("themes/mediawiki/images/icons/beta.png");
index b23bdea..ff1c994 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.2
+ * OOjs UI v0.9.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-12T23:44:05Z
+ * Date: 2015-03-19T23:19:18Z
  */
 .oo-ui-icon-stripeFlow {
        background-image: url("themes/mediawiki/images/icons/stripeFlow-ltr.png");
index d200ef2..4d2b8f2 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.2
+ * OOjs UI v0.9.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-12T23:44:05Z
+ * Date: 2015-03-19T23:19:18Z
  */
 .oo-ui-icon-map {
        background-image: url("themes/mediawiki/images/icons/map-ltr.png");
index babb93f..ff8ed55 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.2
+ * OOjs UI v0.9.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-12T23:44:05Z
+ * Date: 2015-03-19T23:19:18Z
  */
 .oo-ui-icon-image {
        background-image: url("themes/mediawiki/images/icons/image-ltr.png");
index 4de7472..f62e46e 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.2
+ * OOjs UI v0.9.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-12T23:44:05Z
+ * Date: 2015-03-19T23:19:18Z
  */
 .oo-ui-icon-block {
        background-image: url("themes/mediawiki/images/icons/block.png");
index b54c204..2f487b3 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.2
+ * OOjs UI v0.9.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-12T23:44:05Z
+ * Date: 2015-03-19T23:19:18Z
  */
 .oo-ui-icon-arrowNext {
        background-image: url("themes/mediawiki/images/icons/arrow-ltr.png");
index 30b4b33..8af9eb1 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.2
+ * OOjs UI v0.9.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-12T23:44:05Z
+ * Date: 2015-03-19T23:19:18Z
  */
 .oo-ui-icon-userActive {
        background-image: url("themes/mediawiki/images/icons/userActive-ltr.png");
index b03fd4d..e8df47a 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.2
+ * OOjs UI v0.9.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-12T23:44:05Z
+ * Date: 2015-03-19T23:19:18Z
  */
 .oo-ui-icon-logoCC {
        background-image: url("themes/mediawiki/images/icons/logo-cc.png");
index 8b82ca2..e38270c 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.2
+ * OOjs UI v0.9.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-12T23:44:05Z
+ * Date: 2015-03-19T23:19:18Z
  */
 .oo-ui-progressBarWidget-slide-frames from {
        margin-left: -40%;
 .oo-ui-textInputWidget-icon {
        width: 2em;
 }
+.oo-ui-textInputWidget.oo-ui-widget-enabled input,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea {
+       -webkit-transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1) box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
+          -moz-transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1) box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
+           -ms-transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1) box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
+            -o-transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1) box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
+               transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1) box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
+}
 .oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-transition( border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1) box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1)) textarea:focus {
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
        outline: none;
        border-color: #347bff;
        box-shadow: inset 0 0 0 0.1em #347bff;
index 889b4e1..45872b6 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.2
+ * OOjs UI v0.9.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-12T23:43:45Z
+ * Date: 2015-03-19T23:18:59Z
  */
 /**
  * @class
index b570130..a8afca6 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.2
+ * OOjs UI v0.9.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-12T23:43:45Z
+ * Date: 2015-03-19T23:18:59Z
  */
 ( function ( OO ) {
 
@@ -333,60 +333,61 @@ OO.ui.PendingElement.prototype.popPending = function () {
  *
  *     @example
  *     // Example: An action set used in a process dialog
- *     function ProcessDialog( config ) {
- *         ProcessDialog.super.call( this, config );
+ *     function MyProcessDialog( config ) {
+ *         MyProcessDialog.super.call( this, config );
  *     }
- *     OO.inheritClass( ProcessDialog, OO.ui.ProcessDialog );
- *     ProcessDialog.static.title = 'An action set in a process dialog';
+ *     OO.inheritClass( MyProcessDialog, OO.ui.ProcessDialog );
+ *     MyProcessDialog.static.title = 'An action set in a process dialog';
  *     // An action set that uses modes ('edit' and 'help' mode, in this example).
- *     ProcessDialog.static.actions = [
- *        { action: 'continue', modes: 'edit', label: 'Continue', flags: [ 'primary', 'constructive' ] },
- *        { action: 'help', modes: 'edit', label: 'Help' },
- *        { modes: 'edit', label: 'Cancel', flags: 'safe' },
- *        { action: 'back', modes: 'help', label: 'Back', flags: 'safe' }
+ *     MyProcessDialog.static.actions = [
+ *         { action: 'continue', modes: 'edit', label: 'Continue', flags: [ 'primary', 'constructive' ] },
+ *         { action: 'help', modes: 'edit', label: 'Help' },
+ *         { modes: 'edit', label: 'Cancel', flags: 'safe' },
+ *         { action: 'back', modes: 'help', label: 'Back', flags: 'safe' }
  *     ];
  *
- *     ProcessDialog.prototype.initialize = function () {
- *         ProcessDialog.super.prototype.initialize.apply( this, arguments );
+ *     MyProcessDialog.prototype.initialize = function () {
+ *         MyProcessDialog.super.prototype.initialize.apply( this, arguments );
  *         this.panel1 = new OO.ui.PanelLayout( { padded: true, expanded: false } );
- *         this.panel1.$element.append( '<p>This dialog uses an action set (continue, help, cancel, back) configured with modes. This is edit mode. Click \'help\' to see help mode. </p>' );
+ *         this.panel1.$element.append( '<p>This dialog uses an action set (continue, help, cancel, back) configured with modes. This is edit mode. Click \'help\' to see help mode.</p>' );
  *         this.panel2 = new OO.ui.PanelLayout( { padded: true, expanded: false } );
- *         this.panel2.$element.append( '<p>This is help mode. Only the \'back\' action widget is configured to be visible here. Click \'back\' to return to \'edit\' mode</p>' );
- *         this.stackLayout= new OO.ui.StackLayout( {
+ *         this.panel2.$element.append( '<p>This is help mode. Only the \'back\' action widget is configured to be visible here. Click \'back\' to return to \'edit\' mode.</p>' );
+ *         this.stackLayout = new OO.ui.StackLayout( {
  *             items: [ this.panel1, this.panel2 ]
- *         });
+ *         } );
  *         this.$body.append( this.stackLayout.$element );
  *     };
- *     ProcessDialog.prototype.getSetupProcess = function ( data ) {
- *         return ProcessDialog.super.prototype.getSetupProcess.call( this, data )
- *         .next( function () {
- *         this.actions.setMode('edit');
- *         }, this );
+ *     MyProcessDialog.prototype.getSetupProcess = function ( data ) {
+ *         return MyProcessDialog.super.prototype.getSetupProcess.call( this, data )
+ *             .next( function () {
+ *                 this.actions.setMode( 'edit' );
+ *             }, this );
  *     };
- *     ProcessDialog.prototype.getActionProcess = function ( action ) {
+ *     MyProcessDialog.prototype.getActionProcess = function ( action ) {
  *         if ( action === 'help' ) {
  *             this.actions.setMode( 'help' );
  *             this.stackLayout.setItem( this.panel2 );
- *             } else if ( action === 'back' ) {
+ *         } else if ( action === 'back' ) {
  *             this.actions.setMode( 'edit' );
  *             this.stackLayout.setItem( this.panel1 );
- *             } else if ( action === 'continue' ) {
+ *         } else if ( action === 'continue' ) {
  *             var dialog = this;
  *             return new OO.ui.Process( function () {
  *                 dialog.close();
  *             } );
  *         }
- *         return ProcessDialog.super.prototype.getActionProcess.call( this, action );
+ *         return MyProcessDialog.super.prototype.getActionProcess.call( this, action );
  *     };
- *     ProcessDialog.prototype.getBodyHeight = function () {
+ *     MyProcessDialog.prototype.getBodyHeight = function () {
  *         return this.panel1.$element.outerHeight( true );
  *     };
  *     var windowManager = new OO.ui.WindowManager();
  *     $( 'body' ).append( windowManager.$element );
- *     var processDialog = new ProcessDialog({
- *        size: 'medium'});
- *     windowManager.addWindows( [ processDialog ] );
- *     windowManager.openWindow( processDialog );
+ *     var dialog = new MyProcessDialog( {
+ *         size: 'medium'
+ *     } );
+ *     windowManager.addWindows( [ dialog ] );
+ *     windowManager.openWindow( dialog );
  *
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Process_Dialogs#Action_sets
  *
@@ -1614,7 +1615,8 @@ OO.mixinClass( OO.ui.Layout, OO.EventEmitter );
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {boolean} [disabled=false] Disable
+ * @cfg {boolean} [disabled=false] Disable the widget. Disabled widgets cannot be used and their
+ *  appearance reflects this state.
  */
 OO.ui.Widget = function OoUiWidget( config ) {
        // Initialize config
@@ -1644,11 +1646,17 @@ OO.mixinClass( OO.ui.Widget, OO.EventEmitter );
 
 /**
  * @event disable
+ *
+ * A 'disable' event is emitted when a widget is disabled.
+ *
  * @param {boolean} disabled Widget is disabled
  */
 
 /**
  * @event toggle
+ *
+ * A 'toggle' event is emitted when the visibility of the widget changes.
+ *
  * @param {boolean} visible Widget is visible
  */
 
@@ -1657,16 +1665,16 @@ OO.mixinClass( OO.ui.Widget, OO.EventEmitter );
 /**
  * Check if the widget is disabled.
  *
- * @return {boolean} Button is disabled
+ * @return {boolean} Widget is disabled
  */
 OO.ui.Widget.prototype.isDisabled = function () {
        return this.disabled;
 };
 
 /**
- * Set the disabled state of the widget.
+ * Set the 'disabled' state of the widget.
  *
- * This should probably change the widgets' appearance and prevent it from being used.
+ * When a widget is disabled, it cannot be used and its appearance is updated to reflect this state.
  *
  * @param {boolean} disabled Disable widget
  * @chainable
@@ -2103,9 +2111,10 @@ OO.ui.Window.prototype.updateSize = function () {
 };
 
 /**
- * Set window dimensions.
+ * Set window dimensions. This method is called by the {@link OO.ui.WindowManager window manager}
+ * when the window is opening. In general, setDimensions should not be called directly.
  *
- * Properties are applied to the frame container.
+ * To set the size of the window, use the #setSize method.
  *
  * @param {Object} dim CSS dimension properties
  * @param {string|number} [dim.width] Width
@@ -2539,9 +2548,10 @@ OO.ui.Dialog.prototype.getActionProcess = function ( action ) {
  * @inheritdoc
  *
  * @param {Object} [data] Dialog opening data
- * @param {jQuery|string|Function|null} [data.title] Dialog title, omit to use #static-title
- * @param {Object[]} [data.actions] List of OO.ui.ActionWidget configuration options for each
- *   action item, omit to use #static-actions
+ * @param {jQuery|string|Function|null} [data.title] Dialog title, omit to use
+ *  the {@link #static-title static title}
+ * @param {Object[]} [data.actions] List of configuration options for each
+ *   {@link OO.ui.ActionWidget action widget}, omit to use {@link #static-actions static actions}.
  */
 OO.ui.Dialog.prototype.getSetupProcess = function ( data ) {
        data = data || {};
@@ -2549,20 +2559,13 @@ OO.ui.Dialog.prototype.getSetupProcess = function ( data ) {
        // Parent method
        return OO.ui.Dialog.super.prototype.getSetupProcess.call( this, data )
                .next( function () {
-                       var i, len,
-                               items = [],
-                               config = this.constructor.static,
+                       var config = this.constructor.static,
                                actions = data.actions !== undefined ? data.actions : config.actions;
 
                        this.title.setLabel(
                                data.title !== undefined ? data.title : this.constructor.static.title
                        );
-                       for ( i = 0, len = actions.length; i < len; i++ ) {
-                               items.push(
-                                       new OO.ui.ActionWidget( actions[ i ] )
-                               );
-                       }
-                       this.actions.add( items );
+                       this.actions.add( this.getActionWidgets( actions ) );
 
                        if ( this.constructor.static.escapable ) {
                                this.$document.on( 'keydown', this.onDocumentKeyDownHandler );
@@ -2601,6 +2604,22 @@ OO.ui.Dialog.prototype.initialize = function () {
        this.setPendingElement( this.$head );
 };
 
+/**
+ * Get action widgets from a list of configs
+ *
+ * @param {Object[]} actions Action widget configs
+ * @return {OO.ui.ActionWidget[]} Action widgets
+ */
+OO.ui.Dialog.prototype.getActionWidgets = function ( actions ) {
+       var i, len, widgets = [];
+       for ( i = 0, len = actions.length; i < len; i++ ) {
+               widgets.push(
+                       new OO.ui.ActionWidget( actions[ i ] )
+               );
+       }
+       return widgets;
+};
+
 /**
  * Attach action actions.
  *
@@ -2692,6 +2711,8 @@ OO.ui.Dialog.prototype.executeAction = function ( action ) {
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {OO.Factory} [factory] Window factory to use for automatic instantiation
+ *  Note that window classes that are instantiated with a factory must have
+ *  a {@link OO.ui.Dialog#static-name static name} property that specifies a symbolic name.
  * @cfg {boolean} [modal=true] Prevent interaction outside the dialog
  */
 OO.ui.WindowManager = function OoUiWindowManager( config ) {
@@ -2734,34 +2755,30 @@ OO.mixinClass( OO.ui.WindowManager, OO.EventEmitter );
 /* Events */
 
 /**
- * Window is opening.
- *
- * Fired when the window begins to be opened.
+ * An 'opening' event is emitted when the window begins to be opened.
  *
  * @event opening
  * @param {OO.ui.Window} win Window that's being opened
- * @param {jQuery.Promise} opening Promise resolved when window is opened; when the promise is
- *   resolved the first argument will be a promise which will be resolved when the window begins
- *   closing, the second argument will be the opening data; progress notifications will be fired on
- *   the promise for `setup` and `ready` when those processes are completed respectively.
+ * @param {jQuery.Promise} opening An `opening` promise resolved with a value when the window is opened successfully.
+ *  When the `opening` promise is resolved, the first argument of the value is an 'opened' promise, the second argument
+ *  is the opening data. The `opening` promise emits `setup` and `ready` notifications when those processes are complete.
  * @param {Object} data Window opening data
  */
 
 /**
- * Window is closing.
- *
- * Fired when the window begins to be closed.
+ * A 'closing' event is emitted when the window begins to be closed.
  *
  * @event closing
  * @param {OO.ui.Window} win Window that's being closed
- * @param {jQuery.Promise} closing Promise resolved when window is closed; when the promise
- *   is resolved the first argument will be a the closing data; progress notifications will be fired
- *   on the promise for `hold` and `teardown` when those processes are completed respectively.
+ * @param {jQuery.Promise} closing A `closing` promise is resolved with a value when the window
+ *  is closed successfully. The promise emits `hold` and `teardown` notifications when those
+ *  processes are complete. When the `closing` promise is resolved, the first argument of its value
+ *  is the closing data.
  * @param {Object} data Window closing data
  */
 
 /**
- * Window was resized.
+ * A 'resize' event is emitted when a window is resized.
  *
  * @event resize
  * @param {OO.ui.Window} win Window that was resized
@@ -2770,7 +2787,7 @@ OO.mixinClass( OO.ui.WindowManager, OO.EventEmitter );
 /* Static Properties */
 
 /**
- * Map of symbolic size names and CSS properties.
+ * Map of the symbolic name of each window size and its CSS properties.
  *
  * @static
  * @inheritable
@@ -2797,9 +2814,9 @@ OO.ui.WindowManager.static.sizes = {
 };
 
 /**
- * Symbolic name of default size.
+ * Symbolic name of the default window size.
  *
- * Default size is used if the window's requested size is not recognized.
+ * The default size is used if the window's requested size is not recognized.
  *
  * @static
  * @inheritable
@@ -2812,6 +2829,7 @@ OO.ui.WindowManager.static.defaultSize = 'medium';
 /**
  * Handle window resize events.
  *
+ * @private
  * @param {jQuery.Event} e Window resize event
  */
 OO.ui.WindowManager.prototype.onWindowResize = function () {
@@ -2822,6 +2840,7 @@ OO.ui.WindowManager.prototype.onWindowResize = function () {
 /**
  * Handle window resize events.
  *
+ * @private
  * @param {jQuery.Event} e Window resize event
  */
 OO.ui.WindowManager.prototype.afterWindowResize = function () {
@@ -2876,7 +2895,7 @@ OO.ui.WindowManager.prototype.hasWindow = function ( win ) {
 };
 
 /**
- * Get the number of milliseconds to wait between beginning opening and executing setup process.
+ * Get the number of milliseconds to wait after opening begins before executing the ‘setup’ process.
  *
  * @param {OO.ui.Window} win Window being opened
  * @param {Object} [data] Window opening data
@@ -2887,7 +2906,7 @@ OO.ui.WindowManager.prototype.getSetupDelay = function () {
 };
 
 /**
- * Get the number of milliseconds to wait between finishing setup and executing ready process.
+ * Get the number of milliseconds to wait after setup has finished before executing the ‘ready’ process.
  *
  * @param {OO.ui.Window} win Window being opened
  * @param {Object} [data] Window opening data
@@ -2898,7 +2917,7 @@ OO.ui.WindowManager.prototype.getReadyDelay = function () {
 };
 
 /**
- * Get the number of milliseconds to wait between beginning closing and executing hold process.
+ * Get the number of milliseconds to wait after closing has begun before executing the 'hold' process.
  *
  * @param {OO.ui.Window} win Window being closed
  * @param {Object} [data] Window closing data
@@ -2909,7 +2928,8 @@ OO.ui.WindowManager.prototype.getHoldDelay = function () {
 };
 
 /**
- * Get the number of milliseconds to wait between finishing hold and executing teardown process.
+ * Get the number of milliseconds to wait after the ‘hold’ process has finished before
+ * executing the ‘teardown’ process.
  *
  * @param {OO.ui.Window} win Window being closed
  * @param {Object} [data] Window closing data
@@ -2920,14 +2940,17 @@ OO.ui.WindowManager.prototype.getTeardownDelay = function () {
 };
 
 /**
- * Get managed window by symbolic name.
+ * Get a window by its symbolic name.
  *
- * If window is not yet instantiated, it will be instantiated and added automatically.
+ * If the window is not yet instantiated and its symbolic name is recognized by a factory, it will be
+ * instantiated and added to the window manager automatically. Please see the [OOjs UI documentation on MediaWiki][3]
+ * for more information about using factories.
+ * [3]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Window_managers
  *
- * @param {string} name Symbolic window name
+ * @param {string} name Symbolic name of the window
  * @return {jQuery.Promise} Promise resolved with matching window, or rejected with an OO.ui.Error
- * @throws {Error} If the symbolic name is unrecognized by the factory
- * @throws {Error} If the symbolic name unrecognized as a managed window
+ * @throws {Error} An error is thrown if the symbolic name is not recognized by the factory.
+ * @throws {Error} An error is thrown if the named window is not recognized as a managed window.
  */
 OO.ui.WindowManager.prototype.getWindow = function ( name ) {
        var deferred = $.Deferred(),
@@ -2970,8 +2993,8 @@ OO.ui.WindowManager.prototype.getCurrentWindow = function () {
  *
  * @param {OO.ui.Window|string} win Window object or symbolic name of window to open
  * @param {Object} [data] Window opening data
- * @return {jQuery.Promise} Promise resolved when window is done opening; see {@link #event-opening}
- *   for more details about the `opening` promise
+ * @return {jQuery.Promise} An `opening` promise resolved when the window is done opening.
+ *  See {@link #event-opening 'opening' event}  for more information about `opening` promises.
  * @fires opening
  */
 OO.ui.WindowManager.prototype.openWindow = function ( win, data ) {
@@ -3035,9 +3058,9 @@ OO.ui.WindowManager.prototype.openWindow = function ( win, data ) {
  *
  * @param {OO.ui.Window|string} win Window object or symbolic name of window to close
  * @param {Object} [data] Window closing data
- * @return {jQuery.Promise} Promise resolved when window is done closing; see {@link #event-closing}
- *   for more details about the `closing` promise
- * @throws {Error} If no window by that name is being managed
+ * @return {jQuery.Promise} A `closing` promise resolved when the window is done closing.
+ *  See {@link #event-closing 'closing' event} for more information about closing promises.
+ * @throws {Error} An error is thrown if the window is not managed by the window manager.
  * @fires closing
  */
 OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) {
@@ -3103,11 +3126,16 @@ OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) {
 };
 
 /**
- * Add windows.
+ * Add windows to the window manager.
  *
- * @param {Object.<string,OO.ui.Window>|OO.ui.Window[]} windows Windows to add
- * @throws {Error} If one of the windows being added without an explicit symbolic name does not have
- *   a statically configured symbolic name
+ * Windows can be added by reference, symbolic name, or explicitly defined symbolic names.
+ * See the [OOjs ui documentation on MediaWiki] [2] for examples.
+ * [2]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Window_managers
+ *
+ * @param {Object.<string,OO.ui.Window>|OO.ui.Window[]} windows An array of window objects specified
+ *  by reference, symbolic name, or explicitly defined symbolic names.
+ * @throws {Error} An error is thrown if a window is added by symbolic name, but has neither an
+ *  explicit nor a statically configured symbolic name.
  */
 OO.ui.WindowManager.prototype.addWindows = function ( windows ) {
        var i, len, win, name, list;
@@ -3136,13 +3164,15 @@ OO.ui.WindowManager.prototype.addWindows = function ( windows ) {
 };
 
 /**
- * Remove windows.
+ * Remove the specified windows from the windows manager.
  *
- * Windows will be closed before they are removed.
+ * Windows will be closed before they are removed. If you wish to remove all windows, you may wish to use
+ * the #clearWindows method instead. If you no longer need the window manager and want to ensure that it no
+ * longer listens to events, use the #destroy method.
  *
  * @param {string[]} names Symbolic names of windows to remove
  * @return {jQuery.Promise} Promise resolved when window is closed and removed
- * @throws {Error} If windows being removed are not being managed
+ * @throws {Error} An error is thrown if the named windows are not managed by the window manager.
  */
 OO.ui.WindowManager.prototype.removeWindows = function ( names ) {
        var i, len, win, name, cleanupWindow,
@@ -3167,9 +3197,11 @@ OO.ui.WindowManager.prototype.removeWindows = function ( names ) {
 };
 
 /**
- * Remove all windows.
+ * Remove all windows from the window manager.
  *
- * Windows will be closed before they are removed.
+ * Windows will be closed before they are removed. Note that the window manager, though not in use, will still
+ * listen to events. If the window manager will not be used again, you may wish to use the #destroy method instead.
+ * To remove just a subset of windows, use the #removeWindows method.
  *
  * @return {jQuery.Promise} Promise resolved when all windows are closed and removed
  */
@@ -3178,7 +3210,7 @@ OO.ui.WindowManager.prototype.clearWindows = function () {
 };
 
 /**
- * Set dialog size.
+ * Set dialog size. In general, this method should not be called directly.
  *
  * Fullscreen mode will be used if the dialog is too wide to fit in the screen.
  *
@@ -3213,6 +3245,7 @@ OO.ui.WindowManager.prototype.updateWindowSize = function ( win ) {
 /**
  * Bind or unbind global events for scrolling.
  *
+ * @private
  * @param {boolean} [on] Bind global events
  * @chainable
  */
@@ -3255,6 +3288,7 @@ OO.ui.WindowManager.prototype.toggleGlobalEvents = function ( on ) {
 /**
  * Toggle screen reader visibility of content other than the window manager.
  *
+ * @private
  * @param {boolean} [isolate] Make only the window manager visible to screen readers
  * @chainable
  */
@@ -3279,7 +3313,11 @@ OO.ui.WindowManager.prototype.toggleAriaIsolation = function ( isolate ) {
 };
 
 /**
- * Destroy window manager.
+ * Destroy the window manager.
+ *
+ * Destroying the window manager ensures that it will no longer listen to events. If you would like to
+ * continue using the window manager, but wish to remove all windows from it, use the #clearWindows method
+ * instead.
  */
 OO.ui.WindowManager.prototype.destroy = function () {
        this.toggleGlobalEvents( false );
@@ -3764,20 +3802,20 @@ OO.ui.Theme.prototype.updateElementClasses = function ( element ) {
  *     // TabIndexedElement is mixed into the ButtonWidget class
  *     // to provide a tabIndex property.
  *     var button1 = new OO.ui.ButtonWidget( {
- *         label : 'fourth',
- *         tabIndex : 4
+ *         label: 'fourth',
+ *         tabIndex: 4
  *     } );
  *     var button2 = new OO.ui.ButtonWidget( {
- *         label : 'second',
- *         tabIndex : 2
+ *         label: 'second',
+ *         tabIndex: 2
  *     } );
  *     var button3 = new OO.ui.ButtonWidget( {
- *         label : 'third',
- *         tabIndex : 3
+ *         label: 'third',
+ *         tabIndex: 3
  *     } );
  *     var button4 = new OO.ui.ButtonWidget( {
- *         label : 'first',
- *         tabIndex : 1
+ *         label: 'first',
+ *         tabIndex: 1
  *     } );
  *     $( 'body' ).append( button1.$element, button2.$element, button3.$element, button4.$element );
  *
@@ -3786,9 +3824,12 @@ OO.ui.Theme.prototype.updateElementClasses = function ( element ) {
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {jQuery} [$tabIndexed] tabIndexed node, assigned to #$tabIndexed, omit to use #$element
- * @cfg {number|null} [tabIndex=0] Tab index value. Use 0 to use default ordering, use -1 to
- *  prevent tab focusing, use null to suppress the `tabindex` attribute.
+ * @cfg {jQuery} [$tabIndexed] The element that should use the tabindex functionality. By default,
+ *  the functionality is applied to the element created by the class ($element). If a different element is specified, the tabindex
+ *  functionality will be applied to it instead.
+ * @cfg {number|null} [tabIndex=0] Number that specifies the element’s position in the tab-navigation
+ *  order (e.g., 1 for the first focusable element). Use 0 to use the default navigation order; use -1
+ *  to remove the element from the tab-navigation flow.
  */
 OO.ui.TabIndexedElement = function OoUiTabIndexedElement( config ) {
        // Configuration initialization
@@ -3813,11 +3854,13 @@ OO.initClass( OO.ui.TabIndexedElement );
 /* Methods */
 
 /**
- * Set the element with `tabindex` attribute.
+ * Set the element that should use the tabindex functionality.
  *
- * If an element is already set, it will be cleaned up before setting up the new element.
+ * This method is used to retarget a tabindex mixin so that its functionality applies
+ * to the specified element. If an element is currently using the functionality, the mixin’s
+ * effect on that element is removed before the new element is set up.
  *
- * @param {jQuery} $tabIndexed Element to set tab index on
+ * @param {jQuery} $tabIndexed Element that should use the tabindex functionality
  * @chainable
  */
 OO.ui.TabIndexedElement.prototype.setTabIndexedElement = function ( $tabIndexed ) {
@@ -3831,9 +3874,9 @@ OO.ui.TabIndexedElement.prototype.setTabIndexedElement = function ( $tabIndexed
 };
 
 /**
- * Set tab index value.
+ * Set the value of the tabindex.
  *
- * @param {number|null} tabIndex Tab index value or null for no tab index
+ * @param {number|null} tabIndex Tabindex value, or `null` for no tabindex
  * @chainable
  */
 OO.ui.TabIndexedElement.prototype.setTabIndex = function ( tabIndex ) {
@@ -3880,9 +3923,9 @@ OO.ui.TabIndexedElement.prototype.onDisable = function () {
 };
 
 /**
- * Get tab index value.
+ * Get the value of the tabindex.
  *
- * @return {number|null} Tab index value
+ * @return {number|null} Tabindex value
  */
 OO.ui.TabIndexedElement.prototype.getTabIndex = function () {
        return this.tabIndex;
@@ -4149,7 +4192,8 @@ OO.ui.ButtonElement.prototype.setActive = function ( value ) {
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {jQuery} [$group] Container node, assigned to #$group, omit to use a generated `<div>`
+ * @cfg {jQuery} [$group] The container element created by the class. If this configuration
+ *  is omitted, the group element will use a generated `<div>`.
  */
 OO.ui.GroupElement = function OoUiGroupElement( config ) {
        // Configuration initialization
@@ -4183,7 +4227,7 @@ OO.ui.GroupElement.prototype.setGroupElement = function ( $group ) {
 };
 
 /**
- * Check if there are no items.
+ * Check if a group contains no items.
  *
  * @return {boolean} Group is empty
  */
@@ -4192,9 +4236,13 @@ OO.ui.GroupElement.prototype.isEmpty = function () {
 };
 
 /**
- * Get items.
+ * Get all items in the group.
+ *
+ * The method returns an array of item references (e.g., [button1, button2, button3]) and is useful
+ * when synchronizing groups of items, or whenever the references are required (e.g., when removing items
+ * from a group).
  *
- * @return {OO.ui.Element[]} Items
+ * @return {OO.ui.Element[]} An array of items.
  */
 OO.ui.GroupElement.prototype.getItems = function () {
        return this.items.slice( 0 );
@@ -4203,7 +4251,8 @@ OO.ui.GroupElement.prototype.getItems = function () {
 /**
  * Get an item by its data.
  *
- * Data is compared by a hash of its value. Only the first item with matching data will be returned.
+ * Only the first item with matching data will be returned. To return all matching items,
+ * use the #getItemsFromData method.
  *
  * @param {Object} data Item data to search for
  * @return {OO.ui.Element|null} Item with equivalent data, `null` if none exists
@@ -4225,7 +4274,7 @@ OO.ui.GroupElement.prototype.getItemFromData = function ( data ) {
 /**
  * Get items by their data.
  *
- * Data is compared by a hash of its value. All items with matching data will be returned.
+ * All items with matching data will be returned. To return only the first match, use the #getItemFromData method instead.
  *
  * @param {Object} data Item data to search for
  * @return {OO.ui.Element[]} Items with equivalent data
@@ -4246,15 +4295,18 @@ OO.ui.GroupElement.prototype.getItemsFromData = function ( data ) {
 };
 
 /**
- * Add an aggregate item event.
+ * Aggregate the events emitted by the group.
  *
- * Aggregated events are listened to on each item and then emitted by the group under a new name,
- * and with an additional leading parameter containing the item that emitted the original event.
- * Other arguments that were emitted from the original event are passed through.
+ * When events are aggregated, the group will listen to all contained items for the event,
+ * and then emit the event under a new name. The new event will contain an additional leading
+ * parameter containing the item that emitted the original event. Other arguments emitted from
+ * the original event are passed through.
  *
- * @param {Object.<string,string|null>} events Aggregate events emitted by group, keyed by item
- *   event, use null value to remove aggregation
- * @throws {Error} If aggregation already exists
+ * @param {Object.<string,string|null>} events An object keyed by the name of the event that should be
+ *  aggregated  (e.g., ‘click’) and the value of the new name to use (e.g., ‘groupClick’).
+ *  A `null` value will remove aggregated events.
+
+ * @throws {Error} An error is thrown if aggregation already exists.
  */
 OO.ui.GroupElement.prototype.aggregate = function ( events ) {
        var i, len, item, add, remove, itemEvent, groupEvent;
@@ -4299,12 +4351,13 @@ OO.ui.GroupElement.prototype.aggregate = function ( events ) {
 };
 
 /**
- * Add items.
+ * Add items to the group.
  *
- * Adding an existing item will move it.
+ * Items will be added to the end of the group array unless the optional `index` parameter specifies
+ * a different insertion point. Adding an existing item will move it to the end of the array or the point specified by the `index`.
  *
- * @param {OO.ui.Element[]} items Items
- * @param {number} [index] Index to insert items at
+ * @param {OO.ui.Element[]} items An array of items to add to the group
+ * @param {number} [index] Index of the insertion point
  * @chainable
  */
 OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
@@ -4350,11 +4403,12 @@ OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
 };
 
 /**
- * Remove items.
+ * Remove the specified items from a group.
  *
- * Items will be detached, not removed, so they can be used later.
+ * Removed items are detached (not removed) from the DOM so that they may be reused.
+ * To remove all items from a group, you may wish to use the #clearItems method instead.
  *
- * @param {OO.ui.Element[]} items Items to remove
+ * @param {OO.ui.Element[]} items An array of items to remove
  * @chainable
  */
 OO.ui.GroupElement.prototype.removeItems = function ( items ) {
@@ -4385,9 +4439,10 @@ OO.ui.GroupElement.prototype.removeItems = function ( items ) {
 };
 
 /**
- * Clear all items.
+ * Clear all items from the group.
  *
- * Items will be detached, not removed, so they can be used later.
+ * Cleared items are detached from the DOM, not removed, so that they may be reused.
+ * To remove only a subset of items from a group, use the #removeItems method.
  *
  * @chainable
  */
@@ -4565,11 +4620,14 @@ OO.ui.DraggableElement.prototype.getIndex = function () {
  *
  * @abstract
  * @class
+ * @mixins OO.ui.GroupElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {jQuery} [$group] Container node, assigned to #$group, omit to use a generated `<div>`
- * @cfg {string} [orientation] Item orientation, 'horizontal' or 'vertical'. Defaults to 'vertical'
+ * @cfg {string} [orientation] Item orientation: 'horizontal' or 'vertical'. The orientation
+ *  should match the layout of the items. Items displayed in a single row
+ *  or in several rows should use horizontal orientation. The vertical orientation should only be
+ *  used when the items are displayed in a single column. Defaults to 'vertical'
  */
 OO.ui.DraggableGroupElement = function OoUiDraggableGroupElement( config ) {
        // Configuration initialization
@@ -4620,6 +4678,8 @@ OO.mixinClass( OO.ui.DraggableGroupElement, OO.ui.GroupElement );
 /* Events */
 
 /**
+ * A 'reorder' event is emitted when the order of items in the group changes.
+ *
  * @event reorder
  * @param {OO.ui.DraggableElement} item Reordered item
  * @param {number} [newIndex] New index for the item
@@ -4629,6 +4689,8 @@ OO.mixinClass( OO.ui.DraggableGroupElement, OO.ui.GroupElement );
 
 /**
  * Respond to item drag start event
+ *
+ * @private
  * @param {OO.ui.DraggableElement} item Dragged item
  */
 OO.ui.DraggableGroupElement.prototype.onItemDragStart = function ( item ) {
@@ -4657,6 +4719,8 @@ OO.ui.DraggableGroupElement.prototype.onItemDragStart = function ( item ) {
 
 /**
  * Respond to item drag end event
+ *
+ * @private
  */
 OO.ui.DraggableGroupElement.prototype.onItemDragEnd = function () {
        this.unsetDragItem();
@@ -4665,6 +4729,8 @@ OO.ui.DraggableGroupElement.prototype.onItemDragEnd = function () {
 
 /**
  * Handle drop event and switch the order of the items accordingly
+ *
+ * @private
  * @param {OO.ui.DraggableElement} item Dropped item
  * @fires reorder
  */
@@ -4689,6 +4755,8 @@ OO.ui.DraggableGroupElement.prototype.onItemDrop = function ( item ) {
 
 /**
  * Handle dragleave event.
+ *
+ * @private
  */
 OO.ui.DraggableGroupElement.prototype.onDragLeave = function () {
        // This means the item was dragged outside the widget
@@ -4699,6 +4767,8 @@ OO.ui.DraggableGroupElement.prototype.onDragLeave = function () {
 
 /**
  * Respond to dragover event
+ *
+ * @private
  * @param {jQuery.Event} event Event details
  */
 OO.ui.DraggableGroupElement.prototype.onDragOver = function ( e ) {
@@ -4770,6 +4840,7 @@ OO.ui.DraggableGroupElement.prototype.onDragOver = function ( e ) {
 
 /**
  * Set a dragged item
+ *
  * @param {OO.ui.DraggableElement} item Dragged item
  */
 OO.ui.DraggableGroupElement.prototype.setDragItem = function ( item ) {
@@ -4787,15 +4858,17 @@ OO.ui.DraggableGroupElement.prototype.unsetDragItem = function () {
 };
 
 /**
- * Get the current dragged item
- * @return {OO.ui.DraggableElement|null} item Dragged item or null if no item is dragged
+ * Get the item that is currently being dragged.
+ *
+ * @return {OO.ui.DraggableElement|null} The currently dragged item, or `null` if no item is being dragged
  */
 OO.ui.DraggableGroupElement.prototype.getDragItem = function () {
        return this.dragItem;
 };
 
 /**
- * Check if there's an item being dragged.
+ * Check if an item in the group is currently being dragged.
+ *
  * @return {Boolean} Item is being dragged
  */
 OO.ui.DraggableGroupElement.prototype.isDragging = function () {
@@ -5085,9 +5158,9 @@ OO.ui.IndicatorElement.prototype.setIndicatorElement = function ( $indicator ) {
 };
 
 /**
- * Set indicator name.
+ * Set the indicator by its symbolic name: ‘alert’, ‘down’, ‘next’, ‘previous’, ‘required’, ‘up’. Use `null` to remove the indicator.
  *
- * @param {string|null} indicator Symbolic name of indicator to use or null for no indicator
+ * @param {string|null} indicator Symbolic name of indicator, or `null` for no indicator
  * @chainable
  */
 OO.ui.IndicatorElement.prototype.setIndicator = function ( indicator ) {
@@ -5112,10 +5185,12 @@ OO.ui.IndicatorElement.prototype.setIndicator = function ( indicator ) {
 };
 
 /**
- * Set indicator title.
+ * Set the indicator title.
+ *
+ * The title is displayed when a user moves the mouse over the indicator.
  *
- * @param {string|Function|null} indicator Indicator title text, a function that returns text or
- *   null for no indicator title
+ * @param {string|Function|null} indicator Indicator title text, a function that returns text, or
+ *   `null` for no indicator title
  * @chainable
  */
 OO.ui.IndicatorElement.prototype.setIndicatorTitle = function ( indicatorTitle ) {
@@ -5138,7 +5213,7 @@ OO.ui.IndicatorElement.prototype.setIndicatorTitle = function ( indicatorTitle )
 };
 
 /**
- * Get indicator name.
+ * Get the symbolic name of the indicator (e.g., ‘alert’ or  ‘down’).
  *
  * @return {string} Symbolic name of indicator
  */
@@ -5147,7 +5222,9 @@ OO.ui.IndicatorElement.prototype.getIndicator = function () {
 };
 
 /**
- * Get indicator title.
+ * Get the indicator title.
+ *
+ * The title is displayed when a user moves the mouse over the indicator.
  *
  * @return {string} Indicator title text
  */
@@ -5322,6 +5399,8 @@ OO.ui.LabelElement.prototype.setLabelContent = function ( label ) {
  * @param {Object} [config] Configuration options
  * @cfg {jQuery} [$overlay] Overlay for dropdown; defaults to relative positioning
  * @cfg {jQuery} [$container=this.$element] Element to render menu under
+ * @cfg {boolean} [allowSuggestionsWhenEmpty=false] Whether suggestions will be requested
+ *   and shown when the user has not typed anything yet.
  */
 OO.ui.LookupElement = function OoUiLookupElement( config ) {
        // Configuration initialization
@@ -5334,6 +5413,9 @@ OO.ui.LookupElement = function OoUiLookupElement( config ) {
                input: this,
                $container: config.$container
        } );
+
+       this.allowSuggestionsWhenEmpty = config.allowSuggestionsWhenEmpty || false;
+
        this.lookupCache = {};
        this.lookupQuery = null;
        this.lookupRequest = null;
@@ -5492,8 +5574,8 @@ OO.ui.LookupElement.prototype.populateLookupMenu = function () {
                return;
        }
 
-       // If the input is empty, clear the menu
-       if ( value === '' ) {
+       // If the input is empty, clear the menu, unless suggestions when empty are allowed.
+       if ( !this.allowSuggestionsWhenEmpty && value === '' ) {
                this.closeLookupMenu();
        // Skip population if there is already a request pending for the current value
        } else if ( value !== this.lookupQuery ) {
@@ -5685,6 +5767,24 @@ OO.ui.PopupElement.prototype.getPopup = function () {
  * - **destructive**: Destructive styling is applied to convey that the widget will remove something.
  * - **constructive**: Constructive styling is applied to convey that the widget will create something.
  *
+ * The flags affect the appearance of the buttons:
+ *
+ *     @example
+ *     // FlaggedElement is mixed into ButtonWidget to provide styling flags
+ *     var button1 = new OO.ui.ButtonWidget( {
+ *         label: 'Constructive',
+ *         flags: 'constructive'
+ *     } );
+ *     var button2 = new OO.ui.ButtonWidget( {
+ *         label: 'Destructive',
+ *         flags: 'destructive'
+ *     } );
+ *     var button3 = new OO.ui.ButtonWidget( {
+ *         label: 'Progressive',
+ *         flags: 'progressive'
+ *     } );
+ *     $( 'body' ).append( button1.$element, button2.$element, button3.$element );
+ *
  * {@link OO.ui.ActionWidget ActionWidgets}, which are a special kind of button that execute an action, use these flags: **primary** and **safe**.
  * Please see the [OOjs UI documentation on MediaWiki] [1] for more information.
  *
@@ -5698,7 +5798,9 @@ OO.ui.PopupElement.prototype.getPopup = function () {
  * @cfg {string|string[]} [flags] The name or names of the flags (e.g., 'constructive' or 'primary') to apply.
  *  Please see the [OOjs UI documentation on MediaWiki] [2] for more information about available flags.
  *  [2]: https://www.mediawiki.org/wiki/OOjs_UI/Elements/Flagged
- * @cfg {jQuery} [$flagged] Flagged node, assigned to $flagged, omit to use $element
+ * @cfg {jQuery} [$flagged] The flagged element. By default,
+ *  the flagged functionality is applied to the element created by the class ($element).
+ *  If a different element is specified, the flagged functionality will be applied to it instead.
  */
 OO.ui.FlaggedElement = function OoUiFlaggedElement( config ) {
        // Configuration initialization
@@ -5730,9 +5832,10 @@ OO.ui.FlaggedElement = function OoUiFlaggedElement( config ) {
 /**
  * Set the flagged element.
  *
- * If an element is already set, it will be cleaned up before setting up the new element.
+ * This method is used to retarget a flagged mixin so that its functionality applies to the specified element.
+ * If an element is already set, the method will remove the mixin’s effect on that element.
  *
- * @param {jQuery} $flagged Element to add flags to
+ * @param {jQuery} $flagged Element that should be flagged
  */
 OO.ui.FlaggedElement.prototype.setFlaggedElement = function ( $flagged ) {
        var classNames = Object.keys( this.flags ).map( function ( flag ) {
@@ -5747,10 +5850,10 @@ OO.ui.FlaggedElement.prototype.setFlaggedElement = function ( $flagged ) {
 };
 
 /**
- * Check if a flag is set.
+ * Check if the specified flag is set.
  *
  * @param {string} flag Name of flag
- * @return {boolean} Has flag
+ * @return {boolean} The flag is set
  */
 OO.ui.FlaggedElement.prototype.hasFlag = function ( flag ) {
        return flag in this.flags;
@@ -5797,8 +5900,9 @@ OO.ui.FlaggedElement.prototype.clearFlags = function () {
 /**
  * Add one or more flags.
  *
- * @param {string|string[]|Object.<string, boolean>} flags One or more flags to add, or an object
- *  keyed by flag name containing boolean set/remove instructions.
+ * @param {string|string[]|Object.<string, boolean>} flags A flag name, an array of flag names,
+ *  or an object keyed by flag name with a boolean value that indicates whether the flag should
+ *  be added (`true`) or removed (`false`).
  * @chainable
  * @fires flag
  */
@@ -5869,8 +5973,8 @@ OO.ui.FlaggedElement.prototype.setFlags = function ( flags ) {
  *     // TitledElement provides a 'title' attribute to the
  *     // ButtonWidget class
  *     var button = new OO.ui.ButtonWidget( {
- *         label : 'Button with Title',
- *         title : 'I am a button'
+ *         label: 'Button with Title',
+ *         title: 'I am a button'
  *     } );
  *     $( 'body' ).append( button.$element );
  *
@@ -5883,7 +5987,7 @@ OO.ui.FlaggedElement.prototype.setFlags = function ( flags ) {
  *  If this config is omitted, the title functionality is applied to $element, the
  *  element created by the class.
  * @cfg {string|Function} [title] The title text or a function that returns text. If
- *  this config is omitted, the value of the static `title` property is used.
+ *  this config is omitted, the value of the {@link #static-title static title} property is used.
  */
 OO.ui.TitledElement = function OoUiTitledElement( config ) {
        // Configuration initialization
@@ -5919,9 +6023,10 @@ OO.ui.TitledElement.static.title = null;
 /**
  * Set the titled element.
  *
- * If an element is already set, it will be cleaned up before setting up the new element.
+ * This method is used to retarget a titledElement mixin so that its functionality applies to the specified element.
+ * If an element is already set, the mixin’s effect on that element is removed before the new element is set up.
  *
- * @param {jQuery} $titled Element to set title on
+ * @param {jQuery} $titled Element that should use the 'titled' functionality
  */
 OO.ui.TitledElement.prototype.setTitledElement = function ( $titled ) {
        if ( this.$titled ) {
@@ -5937,7 +6042,7 @@ OO.ui.TitledElement.prototype.setTitledElement = function ( $titled ) {
 /**
  * Set title.
  *
- * @param {string|Function|null} title Title text, a function that returns text or null for no title
+ * @param {string|Function|null} title Title text, a function that returns text, or `null` for no title
  * @chainable
  */
 OO.ui.TitledElement.prototype.setTitle = function ( title ) {
@@ -7344,39 +7449,39 @@ OO.ui.MessageDialog.prototype.fitActions = function () {
  *
  *     @example
  *     // Example: Creating and opening a process dialog window.
- *     function ProcessDialog( config ) {
- *         ProcessDialog.super.call( this, config );
+ *     function MyProcessDialog( config ) {
+ *         MyProcessDialog.super.call( this, config );
  *     }
- *     OO.inheritClass( ProcessDialog, OO.ui.ProcessDialog );
+ *     OO.inheritClass( MyProcessDialog, OO.ui.ProcessDialog );
  *
- *     ProcessDialog.static.title = 'Process dialog';
- *     ProcessDialog.static.actions = [
+ *     MyProcessDialog.static.title = 'Process dialog';
+ *     MyProcessDialog.static.actions = [
  *         { action: 'save', label: 'Done', flags: 'primary' },
  *         { label: 'Cancel', flags: 'safe' }
  *     ];
  *
- *     ProcessDialog.prototype.initialize = function () {
- *         ProcessDialog.super.prototype.initialize.apply( this, arguments );
+ *     MyProcessDialog.prototype.initialize = function () {
+ *         MyProcessDialog.super.prototype.initialize.apply( this, arguments );
  *         this.content = new OO.ui.PanelLayout( { $: this.$, padded: true, expanded: false } );
- *         this.content.$element.append( '<p>This is a process dialog window. The header contains the title and two buttons: \'Cancel\' (a safe action) on the left and \'Done\' (a primary action)  on the right. </p>' );
+ *         this.content.$element.append( '<p>This is a process dialog window. The header contains the title and two buttons: \'Cancel\' (a safe action) on the left and \'Done\' (a primary action)  on the right.</p>' );
  *         this.$body.append( this.content.$element );
  *     };
- *     ProcessDialog.prototype.getActionProcess = function ( action ) {
+ *     MyProcessDialog.prototype.getActionProcess = function ( action ) {
  *         var dialog = this;
  *         if ( action ) {
  *             return new OO.ui.Process( function () {
- *             dialog.close( { action: action } );
- *         } );
- *     }
- *     return ProcessDialog.super.prototype.getActionProcess.call( this, action );
+ *                 dialog.close( { action: action } );
+ *             } );
+ *         }
+ *         return MyProcessDialog.super.prototype.getActionProcess.call( this, action );
  *     };
  *
  *     var windowManager = new OO.ui.WindowManager();
  *     $( 'body' ).append( windowManager.$element );
  *
- *     var processDialog = new ProcessDialog();
- *     windowManager.addWindows( [ processDialog ] );
- *     windowManager.openWindow( processDialog );
+ *     var dialog = new MyProcessDialog();
+ *     windowManager.addWindows( [ dialog ] );
+ *     windowManager.openWindow( dialog );
  *
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Process_Dialogs
  *
@@ -7482,6 +7587,19 @@ OO.ui.ProcessDialog.prototype.initialize = function () {
        this.$foot.append( this.$otherActions );
 };
 
+/**
+ * @inheritdoc
+ */
+OO.ui.ProcessDialog.prototype.getActionWidgets = function ( actions ) {
+       var i, len, widgets = [];
+       for ( i = 0, len = actions.length; i < len; i++ ) {
+               widgets.push(
+                       new OO.ui.ActionWidget( $.extend( { framed: true }, actions[ i ] ) )
+               );
+       }
+       return widgets;
+};
+
 /**
  * @inheritdoc
  */
@@ -7495,16 +7613,13 @@ OO.ui.ProcessDialog.prototype.attachActions = function () {
        others = this.actions.getOthers();
        if ( special.primary ) {
                this.$primaryActions.append( special.primary.$element );
-               special.primary.toggleFramed( true );
        }
        for ( i = 0, len = others.length; i < len; i++ ) {
                other = others[ i ];
                this.$otherActions.append( other.$element );
-               other.toggleFramed( true );
        }
        if ( special.safe ) {
                this.$safeActions.append( special.safe.$element );
-               special.safe.toggleFramed( true );
        }
 
        this.fitLabel();
@@ -7515,8 +7630,11 @@ OO.ui.ProcessDialog.prototype.attachActions = function () {
  * @inheritdoc
  */
 OO.ui.ProcessDialog.prototype.executeAction = function ( action ) {
+       var process = this;
        OO.ui.ProcessDialog.super.prototype.executeAction.call( this, action )
-               .fail( this.showErrors.bind( this ) );
+               .fail( function ( errors ) {
+                       process.showErrors( errors || [] );
+               } );
 };
 
 /**
@@ -9775,21 +9893,21 @@ OO.ui.ToggleWidget.prototype.setValue = function ( value ) {
  *     @example
  *     // Example: A ButtonGroupWidget with two buttons
  *     var button1 = new OO.ui.PopupButtonWidget( {
- *         label : 'Select a category',
- *         icon : 'menu',
- *         popup : {
+ *         label: 'Select a category',
+ *         icon: 'menu',
+ *         popup: {
  *             $content: $( '<p>List of categories...</p>' ),
  *             padded: true,
  *             align: 'left'
  *         }
  *     } );
  *     var button2 = new OO.ui.ButtonWidget( {
- *         label : 'Add item'
+ *         label: 'Add item'
  *     });
  *     var buttonGroup = new OO.ui.ButtonGroupWidget( {
  *         items: [button1, button2]
  *     } );
- *     $('body').append(buttonGroup.$element);
+ *     $( 'body' ).append( buttonGroup.$element );
  *
  * @class
  * @extends OO.ui.Widget
@@ -9832,9 +9950,9 @@ OO.mixinClass( OO.ui.ButtonGroupWidget, OO.ui.GroupElement );
  *     @example
  *     // A button widget
  *     var button = new OO.ui.ButtonWidget( {
- *         label : 'Button with Icon',
- *         icon : 'remove',
- *         iconTitle : 'Remove'
+ *         label: 'Button with Icon',
+ *         icon: 'remove',
+ *         iconTitle: 'Remove'
  *     } );
  *     $( 'body' ).append( button.$element );
  *
@@ -10353,7 +10471,7 @@ OO.ui.ToggleButtonWidget.prototype.setValue = function ( value ) {
  *
  *     @example
  *     // Example: A DropdownWidget with a menu that contains three options
- *     var dropDown=new OO.ui.DropdownWidget( {
+ *     var dropDown = new OO.ui.DropdownWidget( {
  *         label: 'Dropdown menu: Select a menu option',
  *         menu: {
  *             items: [
@@ -10373,7 +10491,7 @@ OO.ui.ToggleButtonWidget.prototype.setValue = function ( value ) {
  *         }
  *     } );
  *
- *     $('body').append(dropDown.$element);
+ *     $( 'body' ).append( dropDown.$element );
  *
  * For more information, please see the [OOjs UI documentation on MediaWiki] [1].
  *
@@ -10503,15 +10621,15 @@ OO.ui.DropdownWidget.prototype.onKeyPress = function ( e ) {
  *
  *     @example
  *     // An icon widget with a label
- *     var myIcon = new OO.ui.IconWidget({
+ *     var myIcon = new OO.ui.IconWidget( {
  *         icon: 'help',
  *         iconTitle: 'Help'
- *      });
+ *      } );
  *      // Create a label.
- *      var iconLabel = new OO.ui.LabelWidget({
+ *      var iconLabel = new OO.ui.LabelWidget( {
  *          label: 'Help'
- *      });
- *      $('body').append(myIcon.$element, iconLabel.$element);
+ *      } );
+ *      $( 'body' ).append( myIcon.$element, iconLabel.$element );
  *
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Icons,_Indicators,_and_Labels#Icons
  *
@@ -10557,12 +10675,12 @@ OO.ui.IconWidget.static.tagName = 'span';
  *     // Example of an indicator widget
  *     var indicator1 = new OO.ui.IndicatorWidget( {
  *         indicator: 'alert'
- *     });
+ *     } );
  *
  *     // Create a fieldset layout to add a label
- *     var fieldset = new OO.ui.FieldsetLayout( );
+ *     var fieldset = new OO.ui.FieldsetLayout();
  *     fieldset.addItems( [
- *         new OO.ui.FieldLayout( indicator1, {label: 'An alert indicator:'} )
+ *         new OO.ui.FieldLayout( indicator1, { label: 'An alert indicator:' } )
  *     ] );
  *     $( 'body' ).append( fieldset.$element );
  *
@@ -10942,13 +11060,13 @@ OO.ui.ButtonInputWidget.prototype.setValue = function ( value ) {
  *
  *     @example
  *     // An example of selected, unselected, and disabled checkbox inputs
- *     var checkbox1=new OO.ui.CheckboxInputWidget({
+ *     var checkbox1=new OO.ui.CheckboxInputWidget( {
  *          value: 'a',
  *          selected: true
- *     });
- *     var checkbox2=new OO.ui.CheckboxInputWidget({
+ *     } );
+ *     var checkbox2=new OO.ui.CheckboxInputWidget( {
  *         value: 'b'
- *     });
+ *     } );
  *     var checkbox3=new OO.ui.CheckboxInputWidget( {
  *         value:'c',
  *         disabled: true
@@ -10958,9 +11076,9 @@ OO.ui.ButtonInputWidget.prototype.setValue = function ( value ) {
  *         label: 'Checkboxes'
  *     } );
  *     fieldset.addItems( [
- *         new OO.ui.FieldLayout( checkbox1, {label : 'Selected checkbox', align : 'inline'}),
- *         new OO.ui.FieldLayout( checkbox2, {label : 'Unselected checkbox', align : 'inline'}),
- *         new OO.ui.FieldLayout( checkbox3, {label : 'Disabled checkbox', align : 'inline'}),
+ *         new OO.ui.FieldLayout( checkbox1, { label: 'Selected checkbox', align: 'inline' } ),
+ *         new OO.ui.FieldLayout( checkbox2, { label: 'Unselected checkbox', align: 'inline' } ),
+ *         new OO.ui.FieldLayout( checkbox3, { label: 'Disabled checkbox', align: 'inline' } ),
  *     ] );
  *     $( 'body' ).append( fieldset.$element );
  *
@@ -11051,7 +11169,7 @@ OO.ui.CheckboxInputWidget.prototype.isSelected = function () {
  *
  *     @example
  *     // Example: A DropdownInputWidget with three options
- *     var dropDown=new OO.ui.DropdownInputWidget( {
+ *     var dropDown = new OO.ui.DropdownInputWidget( {
  *         label: 'Dropdown menu: Select a menu option',
  *         options: [
  *             { data: 'a', label: 'First' } ,
@@ -11059,7 +11177,7 @@ OO.ui.CheckboxInputWidget.prototype.isSelected = function () {
  *             { data: 'c', label: 'Third' }
  *         ]
  *     } );
- *     $('body').append(dropDown.$element);
+ *     $( 'body' ).append( dropDown.$element );
  *
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Inputs
  *
@@ -11192,15 +11310,15 @@ OO.ui.DropdownInputWidget.prototype.blur = function () {
  *
  *     @example
  *     // An example of selected, unselected, and disabled radio inputs
- *     var radio1=new OO.ui.RadioInputWidget({
+ *     var radio1 = new OO.ui.RadioInputWidget( {
  *         value: 'a',
  *         selected: true
- *     });
- *     var radio2=new OO.ui.RadioInputWidget({
+ *     } );
+ *     var radio2 = new OO.ui.RadioInputWidget( {
  *         value: 'b'
- *     });
- *     var radio3=new OO.ui.RadioInputWidget( {
- *         value:'c',
+ *     } );
+ *     var radio3 = new OO.ui.RadioInputWidget( {
+ *         value: 'c',
  *         disabled: true
  *     } );
  *     // Create a fieldset layout with fields for each radio button.
@@ -11208,9 +11326,9 @@ OO.ui.DropdownInputWidget.prototype.blur = function () {
  *         label: 'Radio inputs'
  *     } );
  *     fieldset.addItems( [
- *         new OO.ui.FieldLayout( radio1, {label : 'Selected', align : 'inline'}),
- *         new OO.ui.FieldLayout( radio2, {label : 'Unselected', align : 'inline'}),
- *         new OO.ui.FieldLayout( radio3, {label : 'Disabled', align : 'inline'}),
+ *         new OO.ui.FieldLayout( radio1, { label: 'Selected', align: 'inline' } ),
+ *         new OO.ui.FieldLayout( radio2, { label: 'Unselected', align: 'inline' } ),
+ *         new OO.ui.FieldLayout( radio3, { label: 'Disabled', align: 'inline' } ),
  *     ] );
  *     $( 'body' ).append( fieldset.$element );
  *
@@ -11287,10 +11405,10 @@ OO.ui.RadioInputWidget.prototype.isSelected = function () {
  *
  *     @example
  *     // Example of a text input widget
- *     var textInput=new OO.ui.TextInputWidget( {
+ *     var textInput = new OO.ui.TextInputWidget( {
  *         value: 'Text input'
  *     } )
- *     $('body').append(textInput.$element);
+ *     $( 'body' ).append( textInput.$element );
  *
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Inputs
  *
@@ -11800,30 +11918,35 @@ OO.ui.TextInputWidget.prototype.positionLabel = function () {
  *
  *     @example
  *     // Example: A ComboBoxWidget.
- *     var comboBox=new OO.ui.ComboBoxWidget( {
+ *     var comboBox = new OO.ui.ComboBoxWidget( {
  *         label: 'ComboBoxWidget',
  *         input: { value: 'Option One' },
  *         menu: {
  *             items: [
  *                 new OO.ui.MenuOptionWidget( {
  *                     data: 'Option 1',
- *                     label: 'Option One' } ),
+ *                     label: 'Option One'
+ *                 } ),
  *                 new OO.ui.MenuOptionWidget( {
  *                     data: 'Option 2',
- *                     label: 'Option Two' } ),
+ *                     label: 'Option Two'
+ *                 } ),
  *                 new OO.ui.MenuOptionWidget( {
  *                     data: 'Option 3',
- *                     label: 'Option Three'} ),
+ *                     label: 'Option Three'
+ *                 } ),
  *                 new OO.ui.MenuOptionWidget( {
  *                     data: 'Option 4',
- *                     label: 'Option Four' } ),
+ *                     label: 'Option Four'
+ *                 } ),
  *                 new OO.ui.MenuOptionWidget( {
  *                     data: 'Option 5',
- *                     label: 'Option Five' } )
+ *                     label: 'Option Five'
+ *                 } )
  *             ]
  *         }
  *     } );
- *     $('body').append(comboBox.$element);
+ *     $( 'body' ).append( comboBox.$element );
  *
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options
  *
@@ -12029,14 +12152,14 @@ OO.ui.ComboBoxWidget.prototype.setDisabled = function ( disabled ) {
  *
  *     @example
  *     // Examples of LabelWidgets
- *     var label1 = new OO.ui.LabelWidget({
+ *     var label1 = new OO.ui.LabelWidget( {
  *         label: 'plaintext label'
- *     });
- *     var label2 = new OO.ui.LabelWidget({
- *         label: $( '<a href="default.html">jQuery label</a>'  )
- *     });
+ *     } );
+ *     var label2 = new OO.ui.LabelWidget( {
+ *         label: $( '<a href="default.html">jQuery label</a>' )
+ *     } );
  *     // Create a fieldset layout with fields for each example
- *     var fieldset = new OO.ui.FieldsetLayout( );
+ *     var fieldset = new OO.ui.FieldsetLayout();
  *     fieldset.addItems( [
  *         new OO.ui.FieldLayout( label1 ),
  *         new OO.ui.FieldLayout( label2 )
@@ -12286,7 +12409,7 @@ OO.ui.OptionWidget.prototype.setPressed = function ( state ) {
  *
  *     @example
  *     // Decorated options in a select widget
- *     var select=new OO.ui.SelectWidget( {
+ *     var select = new OO.ui.SelectWidget( {
  *         items: [
  *             new OO.ui.DecoratedOptionWidget( {
  *                 data: 'a',
@@ -12300,7 +12423,7 @@ OO.ui.OptionWidget.prototype.setPressed = function ( state ) {
  *             } )
  *         ]
  *     } );
- *     $('body').append(select.$element);
+ *     $( 'body' ).append( select.$element );
  *
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options
  *
@@ -12656,15 +12779,15 @@ OO.ui.OutlineOptionWidget.prototype.setLevel = function ( level ) {
  *
  *     @example
  *     // A popup widget.
- *     var popup=new OO.ui.PopupWidget({
+ *     var popup = new OO.ui.PopupWidget( {
  *         $content: $( '<p>Hi there!</p>' ),
  *         padded: true,
  *         width: 300
  *     } );
  *
- *     $('body').append(popup.$element);
+ *     $( 'body' ).append( popup.$element );
  *     // To display the popup, toggle the visibility to 'true'.
- *     popup.toggle(true);
+ *     popup.toggle( true );
  *
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Popups
  *
@@ -13021,18 +13144,16 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
  *
  *     @example
  *     // Examples of determinate and indeterminate progress bars.
- *     var progressBar1=new OO.ui.ProgressBarWidget( {
+ *     var progressBar1 = new OO.ui.ProgressBarWidget( {
  *         progress: 33
  *     } );
+ *     var progressBar2 = new OO.ui.ProgressBarWidget();
  *
- *     var progressBar2=new OO.ui.ProgressBarWidget( {
- *         progress: false
- *     } );
  *     // Create a FieldsetLayout to layout progress bars
  *     var fieldset = new OO.ui.FieldsetLayout;
  *     fieldset.addItems( [
- *        new OO.ui.FieldLayout( progressBar1, {label : 'Determinate', align : 'top'}),
- *        new OO.ui.FieldLayout( progressBar2, {label : 'Indeterminate', align : 'top'})
+ *        new OO.ui.FieldLayout( progressBar1, {label: 'Determinate', align: 'top'}),
+ *        new OO.ui.FieldLayout( progressBar2, {label: 'Indeterminate', align: 'top'})
  *     ] );
  *     $( 'body' ).append( fieldset.$element );
  *
@@ -13271,7 +13392,7 @@ OO.ui.SearchWidget.prototype.getResults = function () {
  *
  *     @example
  *     // Example of a select widget with three options
- *     var select=new OO.ui.SelectWidget( {
+ *     var select = new OO.ui.SelectWidget( {
  *         items: [
  *             new OO.ui.OptionWidget( {
  *                 data: 'a',
@@ -13284,10 +13405,10 @@ OO.ui.SearchWidget.prototype.getResults = function () {
  *             new OO.ui.OptionWidget( {
  *                 data: 'c',
  *                 label: 'Option Three',
- *             } ),
+ *             } )
  *         ]
  *     } );
- *     $('body').append(select.$element);
+ *     $( 'body' ).append( select.$element );
  *
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options
  *
@@ -13890,25 +14011,25 @@ OO.ui.SelectWidget.prototype.clearItems = function () {
  *     var option1 = new OO.ui.ButtonOptionWidget( {
  *         data: 1,
  *         label: 'Option 1',
- *         title:'Button option 1'
+ *         title: 'Button option 1'
  *     } );
  *
  *     var option2 = new OO.ui.ButtonOptionWidget( {
  *         data: 2,
  *         label: 'Option 2',
- *         title:'Button option 2'
+ *         title: 'Button option 2'
  *     } );
  *
  *     var option3 = new OO.ui.ButtonOptionWidget( {
  *         data: 3,
  *         label: 'Option 3',
- *         title:'Button option 3'
+ *         title: 'Button option 3'
  *     } );
  *
  *     var buttonSelect=new OO.ui.ButtonSelectWidget( {
- *         items: [option1, option2, option3]
+ *         items: [ option1, option2, option3 ]
  *     } );
- *     $('body').append(buttonSelect.$element);
+ *     $( 'body' ).append( buttonSelect.$element );
  *
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options
  *
@@ -13960,13 +14081,13 @@ OO.mixinClass( OO.ui.ButtonSelectWidget, OO.ui.TabIndexedElement );
  *     } );
  *
  *     var radioSelect=new OO.ui.RadioSelectWidget( {
- *         items: [option1, option2]
+ *         items: [ option1, option2 ]
  *      } );
  *
  *     // Select 'option 1' using the RadioSelectWidget's selectItem() method.
  *     radioSelect.selectItem( option1 );
  *
- *     $('body').append(radioSelect.$element);
+ *     $( 'body' ).append( radioSelect.$element );
  *
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options
 
@@ -14002,9 +14123,10 @@ OO.mixinClass( OO.ui.RadioSelectWidget, OO.ui.TabIndexedElement );
 
 /**
  * MenuSelectWidget is a {@link OO.ui.SelectWidget select widget} that contains options and
- * is used together with OO.ui.MenuOptionWidget. See {@link OO.ui.DropdownWidget DropdownWidget} and
- * {@link OO.ui.ComboBoxWidget ComboBoxWidget} for examples of interfaces that contain menus.
- * MenuSelectWidgets themselves are not designed to be instantiated directly, rather subclassed
+ * is used together with OO.ui.MenuOptionWidget. It is designed be used as part of another widget.
+ * See {@link OO.ui.DropdownWidget DropdownWidget}, {@link OO.ui.ComboBoxWidget ComboBoxWidget},
+ * and {@link OO.ui.LookupElement LookupElement} for examples of widgets that contain menus.
+ * MenuSelectWidgets themselves are not instantiated directly, rather subclassed
  * and customized to be opened, closed, and displayed as needed.
  *
  * By default, menus are clipped to the visible viewport and are not visible when a user presses the
@@ -14026,9 +14148,12 @@ OO.mixinClass( OO.ui.RadioSelectWidget, OO.ui.TabIndexedElement );
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {OO.ui.TextInputWidget} [input] Input to bind keyboard handlers to
- * @cfg {OO.ui.Widget} [widget] Widget to bind mouse handlers to
- * @cfg {boolean} [autoHide=true] Hide the menu when the mouse is pressed outside the menu
+ * @cfg {OO.ui.TextInputWidget} [input] Text input used to implement option highlighting for menu items that match
+ *  the text the user types. This config is used by {@link OO.ui.ComboBoxWidget ComboBoxWidget}
+ *  and {@link OO.ui.LookupElement LookupElement}
+ * @cfg {OO.ui.Widget} [widget] Widget associated with the menu’s active state. If the user clicks the mouse
+ *  anywhere on the page outside of this widget, the menu is hidden.
+ * @cfg {boolean} [autoHide=true] Hide the menu when the mouse is pressed outside the menu.
  */
 OO.ui.MenuSelectWidget = function OoUiMenuSelectWidget( config ) {
        // Configuration initialization
@@ -14140,8 +14265,10 @@ OO.ui.MenuSelectWidget.prototype.unbindKeyDownListener = function () {
 /**
  * Choose an item.
  *
- * This will close the menu, unlike #selectItem which only changes selection.
+ * When a user chooses an item, the menu is closed.
  *
+ * Note that ‘choose’ should never be modified programmatically. A user can choose an option with the keyboard
+ * or mouse and it becomes selected. To select an item programmatically, use the #selectItem method.
  * @param {OO.ui.OptionWidget} item Item to choose
  * @chainable
  */
@@ -14395,10 +14522,8 @@ OO.mixinClass( OO.ui.OutlineSelectWidget, OO.ui.TabIndexedElement );
  *
  *     @example
  *     // Toggle switches in the 'off' and 'on' position.
- *     var toggleSwitch1 = new OO.ui.ToggleSwitchWidget({
- *         value: false
- *      } );
- *     var toggleSwitch2 = new OO.ui.ToggleSwitchWidget({
+ *     var toggleSwitch1 = new OO.ui.ToggleSwitchWidget();
+ *     var toggleSwitch2 = new OO.ui.ToggleSwitchWidget( {
  *         value: true
  *     } );
  *
@@ -14407,8 +14532,8 @@ OO.mixinClass( OO.ui.OutlineSelectWidget, OO.ui.TabIndexedElement );
  *        label: 'Toggle switches'
  *     } );
  *     fieldset.addItems( [
- *         new OO.ui.FieldLayout( toggleSwitch1, {label : 'Off', align : 'top'}),
- *         new OO.ui.FieldLayout( toggleSwitch2, {label : 'On', align : 'top'})
+ *         new OO.ui.FieldLayout( toggleSwitch1, { label: 'Off', align: 'top' } ),
+ *         new OO.ui.FieldLayout( toggleSwitch2, { label: 'On', align: 'top' } )
  *     ] );
  *     $( 'body' ).append( fieldset.$element );
  *
index cf5a616..18dc564 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs v1.1.5 optimised for jQuery
+ * OOjs v1.1.6 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-02-26T01:51:06Z
+ * Date: 2015-03-19T00:42:55Z
  */
 ( function ( global ) {
 
@@ -435,6 +435,21 @@ oo.getHash.keySortReplacer = function ( key, val ) {
        }
 };
 
+/**
+ * Get the unique values of an array, removing duplicates
+ *
+ * @param {Array} arr Array
+ * @return {Array} Unique values in array
+ */
+oo.unique = function ( arr ) {
+       return arr.reduce( function ( result, current ) {
+               if ( result.indexOf( current ) === -1 ) {
+                       result.push( current );
+               }
+               return result;
+       }, [] );
+};
+
 /**
  * Compute the union (duplicate-free merge) of a set of arrays.
  *
index 3bf8e32..84bde7d 100644 (file)
        $( function () {
                // Do not enable on user .js/.css pages, as there's no sane way of "previewing"
                // the scripts or styles without reloading the page.
-               if ( $( '#mw-userjsyoucanpreview' ).length || $( '#mw-usercssyoucanpreview' ).length ) {
+               // Do not enable for ProofreadPage Index page editors, which have no textbox
+               if ( $( '#mw-userjsyoucanpreview' ).length || $( '#mw-usercssyoucanpreview' ).length || $( '#wpTextbox1' ).length === 0 ) {
                        return;
                }
 
diff --git a/resources/src/mediawiki.api/mediawiki.api.options.js b/resources/src/mediawiki.api/mediawiki.api.options.js
new file mode 100644 (file)
index 0000000..b839fbd
--- /dev/null
@@ -0,0 +1,89 @@
+/**
+ * @class mw.Api.plugin.options
+ */
+( function ( mw, $ ) {
+
+       $.extend( mw.Api.prototype, {
+
+               /**
+                * Asynchronously save the value of a single user option using the API. See #saveOptions.
+                *
+                * @param {string} name
+                * @param {string|null} value
+                * @return {jQuery.Promise}
+                */
+               saveOption: function ( name, value ) {
+                       var param = {};
+                       param[name] = value;
+                       return this.saveOptions( param );
+               },
+
+               /**
+                * Asynchronously save the values of user options using the API.
+                *
+                * If a value of `null` is provided, the given option will be reset to the default value.
+                *
+                * Any warnings returned by the API, including warnings about invalid option names or values,
+                * are ignored. However, do not rely on this behavior.
+                *
+                * If necessary, the options will be saved using several parallel API requests. Only one promise
+                * is always returned that will be resolved when all requests complete.
+                *
+                * @param {Object} options Options as a `{ name: value, … }` object
+                * @return {jQuery.Promise}
+                */
+               saveOptions: function ( options ) {
+                       var name, value, bundleable,
+                               grouped = [],
+                               deferreds = [];
+
+                       for ( name in options ) {
+                               value = options[name] === null ? null : String( options[name] );
+
+                               // Can we bundle this option, or does it need a separate request?
+                               bundleable =
+                                       ( value === null || value.indexOf( '|' ) === -1 ) &&
+                                       ( name.indexOf( '|' ) === -1 && name.indexOf( '=' ) === -1 );
+
+                               if ( bundleable ) {
+                                       if ( value !== null ) {
+                                               grouped.push( name + '=' + value );
+                                       } else {
+                                               // Omitting value resets the option
+                                               grouped.push( name );
+                                       }
+                               } else {
+                                       if ( value !== null ) {
+                                               deferreds.push( this.postWithToken( 'options', {
+                                                       action: 'options',
+                                                       optionname: name,
+                                                       optionvalue: value
+                                               } ) );
+                                       } else {
+                                               // Omitting value resets the option
+                                               deferreds.push( this.postWithToken( 'options', {
+                                                       action: 'options',
+                                                       optionname: name
+                                               } ) );
+                                       }
+                               }
+                       }
+
+                       if ( grouped.length ) {
+                               deferreds.push( this.postWithToken( 'options', {
+                                       action: 'options',
+                                       change: grouped.join( '|' )
+                               } ) );
+                       }
+
+                       return $.when.apply( $, deferreds );
+               }
+
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.options
+        */
+
+}( mediaWiki, jQuery ) );
index 467714e..56e4625 100644 (file)
@@ -91,6 +91,18 @@ abbr[title],
        color: #aaa; /* gray */
 }
 
+/*
+ * Bidi-isolate these numbers.
+ * See https://phabricator.wikimedia.org/T93484
+ */
+.mw-plusminus-pos,
+.mw-plusminus-neg,
+.mw-plusminus-null {
+       unicode-bidi: -moz-isolate;
+       unicode-bidi: -webkit-isolate;
+       unicode-bidi: isolate;
+}
+
 /**
  * Links to redirects appear italicized on [[Special:AllPages]], [[Special:PrefixIndex]],
  * [[Special:Watchlist/edit]] and in category listings.
index 8579e05..aca335e 100644 (file)
@@ -12,7 +12,7 @@
                function updateBlockOptions( instant ) {
                        var blocktarget = $.trim( $blockTarget.val() ),
                                isEmpty = blocktarget === '',
-                               isIp = mw.util.isIPv4Address( blocktarget, true ) || mw.util.isIPv6Address( blocktarget, true ),
+                               isIp = mw.util.isIPAddress( blocktarget, true ),
                                isIpRange = isIp && blocktarget.match( /\/\d+$/ );
 
                        if ( isIp && !isEmpty ) {
index c92db16..16fdf38 100644 (file)
@@ -5,3 +5,11 @@
 .mw-changeslist-line-watched .mw-title {
        font-weight: bold;
 }
+
+/*
+ * Titles, including username links, are especially prone for getting jumbled up
+ * with other titles, usernames, etc. in mixed RTL-LTR environment.
+ */
+.mw-changeslist .mw-title {
+       unicode-bidi: embed;
+}
index 1992cce..2f76131 100644 (file)
@@ -128,11 +128,3 @@ input.mw-ui-input-large {
        font-weight: bold;
        line-height: 1.25em;
 }
-
-// Tablet and desktop specific styling tweaks.
-@media all and (min-width: 768px) {
-       // Make inline elements take up a sensible amount of the screen on wider devices.
-       .mw-ui-input-inline {
-               min-width: 320px;
-       }
-}
index f1bc368..9910582 100644 (file)
Binary files a/resources/src/mediawiki/images/help.png and b/resources/src/mediawiki/images/help.png differ
diff --git a/resources/src/mediawiki/images/help.svg b/resources/src/mediawiki/images/help.svg
new file mode 100644 (file)
index 0000000..3662cb5
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g><path d="M12.001 2.085c-5.478 0-9.916 4.438-9.916 9.916 0 5.476 4.438 9.914 9.916 9.914 5.476 0 9.914-4.438 9.914-9.914 0-5.478-4.438-9.916-9.914-9.916zm.001 18c-4.465 0-8.084-3.619-8.084-8.083 0-4.465 3.619-8.084 8.084-8.084 4.464 0 8.083 3.619 8.083 8.084 0 4.464-3.619 8.083-8.083 8.083z"/><g><path d="M11.766 6.688c-2.5 0-3.219 2.188-3.219 2.188l1.411.854s.298-.791.901-1.229c.516-.375 1.625-.625 2.219.125.701.885-.17 1.587-1.078 2.719-.953 1.186-1 3.655-1 3.655h1.969s.135-2.318 1.041-3.381c.603-.707 1.443-1.338 1.443-2.494s-1.187-2.437-3.687-2.437z"/><path d="M11 16h2v2h-2z"/></g></g></svg>
diff --git a/resources/src/mediawiki/mediawiki.filewarning.js b/resources/src/mediawiki/mediawiki.filewarning.js
new file mode 100644 (file)
index 0000000..882affe
--- /dev/null
@@ -0,0 +1,68 @@
+/*!
+ * mediawiki.filewarning
+ *
+ * @author Mark Holmquist, 2015
+ * @since 1.25
+ */
+/*global OO*/
+( function ( mw, $, oo ) {
+       var warningConfig = mw.config.get( 'wgFileWarning' ),
+               warningMessages = warningConfig.messages,
+               warningLink = warningConfig.link,
+               $origMimetype = $( '.fullMedia .fileInfo .mime-type' ),
+               $mimetype = $origMimetype.clone(),
+               $header = $( '<h3>' )
+                       .addClass( 'mediawiki-filewarning-header empty' ),
+               $main = $( '<p>' )
+                       .addClass( 'mediawiki-filewarning-main empty' ),
+               $info = $( '<a>' )
+                       .addClass( 'mediawiki-filewarning-info empty' ),
+               $footer = $( '<p>' )
+                       .addClass( 'mediawiki-filewarning-footer empty' ),
+               dialog = new oo.ui.PopupButtonWidget( {
+                       classes: [ 'mediawiki-filewarning-anchor' ],
+                       label: $mimetype,
+                       flags: [ 'warning' ],
+                       icon: 'alert',
+                       framed: false,
+                       popup: {
+                               classes: [ 'mediawiki-filewarning' ],
+                               padded: true,
+                               width: 400,
+                               $content: $header.add( $main ).add( $info ).add( $footer )
+                       }
+               } );
+
+       function loadMessage( $target, message ) {
+               if ( message ) {
+                       $target.removeClass( 'empty' )
+                               .text( mw.message( message ).text() );
+               }
+       }
+
+       // The main message must be populated for the dialog to show.
+       if ( warningConfig && warningConfig.messages && warningConfig.messages.main ) {
+               $mimetype.addClass( 'has-warning' );
+
+               $origMimetype.replaceWith( dialog.$element );
+
+               if ( warningMessages ) {
+                       loadMessage( $main, warningMessages.main );
+                       loadMessage( $header, warningMessages.header );
+                       loadMessage( $footer, warningMessages.footer );
+
+                       if ( warningLink ) {
+                               loadMessage( $info, warningMessages.info );
+                               $info.attr( 'href', warningLink );
+                       }
+               }
+
+               // Make OOUI open the dialog, it won't appear until the user
+               // hovers over the warning.
+               dialog.getPopup().toggle( true );
+
+               // Override toggle handler because we don't need it for this popup
+               // object at all. Sort of nasty, but it gets the job done.
+               dialog.getPopup().toggle = $.noop;
+       }
+}( mediaWiki, jQuery, OO ) );
diff --git a/resources/src/mediawiki/mediawiki.filewarning.less b/resources/src/mediawiki/mediawiki.filewarning.less
new file mode 100644 (file)
index 0000000..489ac42
--- /dev/null
@@ -0,0 +1,29 @@
+@import "mediawiki.ui/variables"
+
+.mediawiki-filewarning {
+       display: none;
+
+       .mediawiki-filewarning-header {
+               padding: 0;
+               font-weight: 600;
+       }
+
+       .mediawiki-filewarning-footer {
+               color: #888888;
+       }
+
+       .empty {
+               display: none;
+       }
+
+       .mediawiki-filewarning-anchor:hover & {
+               display: block;
+       }
+}
+
+.mime-type {
+       &.has-warning {
+               font-weight: bold;
+               color: @colorMediumSevere;
+       }
+}
diff --git a/resources/src/mediawiki/mediawiki.helplink.css b/resources/src/mediawiki/mediawiki.helplink.css
deleted file mode 100644 (file)
index 5d45778..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#mw-indicator-mw-helplink a {
-       /* @embed */
-       background: url(images/help.png) no-repeat scroll left center transparent;
-       padding-left: 20px;
-}
diff --git a/resources/src/mediawiki/mediawiki.helplink.less b/resources/src/mediawiki/mediawiki.helplink.less
new file mode 100644 (file)
index 0000000..dd6bf74
--- /dev/null
@@ -0,0 +1,11 @@
+@import "mediawiki.mixins";
+
+#mw-indicator-mw-helplink a {
+       .background-image-svg('images/help.svg', 'images/help.png');
+       background-repeat: no-repeat;
+       background-position: left center;
+       padding-left: 28px;
+       display: inline-block;
+       height: 24px;
+       line-height: 24px;
+}
index 2c3c90f..6723e5f 100644 (file)
 
                        return address.search( new RegExp( '^' + RE_IPV6_ADD + block + '$' ) ) !== -1
                                && address.search( /::/ ) !== -1 && address.search( /::.*::/ ) === -1;
+               },
+
+               /**
+                * Check whether a string is an IP address
+                *
+                * @since 1.25
+                * @param {string} address String to check
+                * @param {boolean} allowBlock True if a block of IPs should be allowed
+                * @return {boolean}
+                */
+               isIPAddress: function ( address, allowBlock ) {
+                       return util.isIPv4Address( address, allowBlock ) ||
+                               util.isIPv6Address( address, allowBlock );
                }
        };
 
index 79507ca..406a67e 100644 (file)
@@ -14,5 +14,5 @@ Given(/^I go to Create account page at (.+)$/) do |path|
 end
 
 Then(/^form has Create account button$/) do
-  on(CreateAccountPage).create_account_element.should exist
+  expect(on(CreateAccountPage).create_account_element).to exist
 end
index 6197b6b..065ee26 100644 (file)
@@ -18,9 +18,9 @@ When(/^I click the Link Target link$/) do
 end
 
 Then(/^I should be on the Link Target Test Page$/) do
-  browser.url.should match(/Link_Target_Test_Page/)
+  expect(@browser.url).to match /Link_Target_Test_Page/
 end
 
 Then(/^the page content should contain "(.*?)"$/) do |content|
-  on(ZtargetPage).page_content.should match content
+  expect(on(ZtargetPage).page_content).to match content
 end
index 713bb39..0e0aeb1 100644 (file)
@@ -19,5 +19,5 @@ When(/^I save the edit$/) do
 end
 
 Then(/^the edited page content should contain "(.*?)"$/) do |content|
-  on(MainPage).page_content.should match(content + @random_string)
+  expect(on(MainPage).page_content).to match(content + @random_string)
 end
index 6f017c1..a80ca50 100644 (file)
@@ -14,5 +14,5 @@ Given(/^I am at file that does not exist$/) do
 end
 
 Then(/^page should show that no such file exists$/) do
-  on(FileDoesNotExistPage).file_does_not_exist_message_element.should be_visible
+  expect(on(FileDoesNotExistPage).file_does_not_exist_message_element).to be_visible
 end
index f528eba..1f76e55 100644 (file)
@@ -30,36 +30,36 @@ When(/^I log in without entering password$/) do
 end
 
 Then(/^error box should be visible$/) do
-  on(LoginErrorPage).error_box_element.should be_visible
+  expect(on(LoginErrorPage).error_box_element).to be_visible
 end
 
 Then(/^error box should not be visible$/) do
-  on(LoginErrorPage).error_box_element.should_not be_visible
+  expect(on(LoginErrorPage).error_box_element).not_to be_visible
 end
 
 Then(/^feedback should be (.+)$/) do |feedback|
   on(LoginPage) do |page|
     page.feedback_element.when_present.click
-    page.feedback.should match Regexp.escape(feedback)
+    expect(page.feedback).to match Regexp.escape(feedback)
   end
 end
 
 Then(/^Log in element should be there$/) do
-  on(LoginPage).login_element.should exist
+  expect(on(LoginPage).login_element).to exist
 end
 
 Then(/^main page should open$/) do
-  browser.url.should == on(MainPage).class.url
+  expect(@browser.url).to eq on(MainPage).class.url
 end
 
 Then(/^Password element should be there$/) do
-  on(LoginPage).password_element.should exist
+  expect(on(LoginPage).password_element).to exist
 end
 
 Then(/^there should be a link to (.+)$/) do |text|
-  on(LoginPage).username_displayed_element.when_present.text.should == text
+  expect(on(LoginPage).username_displayed_element.when_present.text).to eq text
 end
 
 Then(/^Username element should be there$/) do
-  on(LoginPage).username_element.should exist
+  expect(on(LoginPage).username_element).to exist
 end
index c76fd2b..7f588c0 100644 (file)
@@ -3,45 +3,45 @@ Given(/^I open the main wiki URL$/) do
 end
 
 Then(/^I should see a link for View History$/) do
-  on(MainPage).view_history_link_element.should be_visible
+  expect(on(MainPage).view_history_link_element).to be_visible
 end
 
 Then(/^I should see a link for Edit$/) do
-  on(MainPage).edit_link_element.should be_visible
+  expect(on(MainPage).edit_link_element).to be_visible
 end
 
 Then(/^I should see a link for Recent changes$/) do
-  on(MainPage).recent_changes_link_element.should be_visible
+  expect(on(MainPage).recent_changes_link_element).to be_visible
 end
 
 Then(/^I should see a link for Random page$/) do
-  on(MainPage).random_page_link_element.should be_visible
+  expect(on(MainPage).random_page_link_element).to be_visible
 end
 
 Then(/^I should see a link for Help$/) do
-  on(MainPage).help_link_element.should be_visible
+  expect(on(MainPage).help_link_element).to be_visible
 end
 
 Then(/^I should see a link for What links here$/) do
-  on(MainPage).what_links_here_link_element.should be_visible
+  expect(on(MainPage).what_links_here_link_element).to be_visible
 end
 
 Then(/^I should see a link for Related changes$/) do
-  on(MainPage).related_changes_link_element.should be_visible
+  expect(on(MainPage).related_changes_link_element).to be_visible
 end
 
 Then(/^I should see a link for Special pages$/) do
-  on(MainPage).special_pages_link_element.should be_visible
+  expect(on(MainPage).special_pages_link_element).to be_visible
 end
 
 Then(/^I should see a link for Printable version$/) do
-  on(MainPage).printable_version_link_element.should be_visible
+  expect(on(MainPage).printable_version_link_element).to be_visible
 end
 
 Then(/^I should see a link for Permanent link$/) do
-  on(MainPage).permanent_link_link_element.should be_visible
+  expect(on(MainPage).permanent_link_link_element).to be_visible
 end
 
 Then(/^I should see a link for Page information$/) do
-  on(MainPage).page_information_link_element.should be_visible
+  expect(on(MainPage).page_information_link_element).to be_visible
 end
index 44f87de..133eec3 100644 (file)
@@ -18,66 +18,66 @@ When(/^I navigate to Preferences$/) do
 end
 
 Then(/^I can click Save$/) do
-  on(PreferencesPage).save_button_element.should exist
+  expect(on(PreferencesPage).save_button_element).to exist
 end
 
 Then(/^I can restore default settings$/) do
-  on(PreferencesAppearancePage).restore_default_link_element.should exist
+  expect(on(PreferencesAppearancePage).restore_default_link_element).to exist
 end
 
 Then(/^I can see local time$/) do
-  on(PreferencesAppearancePage).local_time_span_element.should exist
+  expect(on(PreferencesAppearancePage).local_time_span_element).to exist
 end
 
 Then(/^I can see time offset section$/) do
-  on(PreferencesAppearancePage).time_offset_table_element.should be_visible
+  expect(on(PreferencesAppearancePage).time_offset_table_element).to be_visible
 end
 
 Then(/^I can select date format$/) do
   on(PreferencesAppearancePage) do |page|
-    page.no_preference_radio_element.should exist
-    page.mo_day_year_radio_element.should exist
-    page.day_mo_year_radio_element.should exist
-    page.year_mo_day_radio_element.should exist
-    page.iso_8601_radio_element.should exist
+    expect(page.no_preference_radio_element).to exist
+    expect(page.mo_day_year_radio_element).to exist
+    expect(page.day_mo_year_radio_element).to exist
+    expect(page.year_mo_day_radio_element).to exist
+    expect(page.iso_8601_radio_element).to exist
   end
 end
 
 Then(/^I can select image size$/) do
-  on(PreferencesAppearancePage).size_select_element.should exist
+  expect(on(PreferencesAppearancePage).size_select_element).to exist
 end
 
 Then(/^I can select my time zone$/) do
   on(PreferencesAppearancePage) do |page|
-    page.time_offset_select_element.should exist
-    page.other_offset_element.should exist
+    expect(page.time_offset_select_element).to exist
+    expect(page.other_offset_element).to exist
   end
 end
 
 Then(/^I can select skins$/) do
   on(PreferencesAppearancePage) do |page|
-    page.cologne_blue_element.should exist
-    page.modern_element.should exist
-    page.monobook_element.should exist
-    page.vector_element.should exist
+    expect(page.cologne_blue_element).to exist
+    expect(page.modern_element).to exist
+    expect(page.monobook_element).to exist
+    expect(page.vector_element).to exist
   end
 end
 
 Then(/^I can select Threshold for stub link$/) do
-  on(PreferencesAppearancePage).threshold_select_element.should exist
+  expect(on(PreferencesAppearancePage).threshold_select_element).to exist
 end
 
 Then(/^I can select thumbnail size$/) do
-  on(PreferencesAppearancePage).thumb_select_element.should exist
+  expect(on(PreferencesAppearancePage).thumb_select_element).to exist
 end
 
 Then(/^I can select underline preferences$/) do
-  on(PreferencesAppearancePage).underline_select_element.should exist
+  expect(on(PreferencesAppearancePage).underline_select_element).to exist
 end
 
 Then(/^I have advanced options checkboxes$/) do
   on(PreferencesAppearancePage) do |page|
-    page.hidden_categories_check_element.should exist
-    page.auto_number_check_element.should exist
+    expect(page.hidden_categories_check_element).to exist
+    expect(page.auto_number_check_element).to exist
   end
 end
index ad29a74..0a98e88 100644 (file)
@@ -14,41 +14,41 @@ When(/^I click Editing$/) do
 end
 
 Then(/^I can select edit area font style$/) do
-  on(PreferencesEditingPage).edit_area_font_style_select_element.when_present.should exist
+  expect(on(PreferencesEditingPage).edit_area_font_style_select_element.when_present).to exist
 end
 
 Then(/^I can select live preview$/) do
-  on(PreferencesEditingPage).live_preview_check_element.when_present.should exist
+  expect(on(PreferencesEditingPage).live_preview_check_element.when_present).to exist
 end
 
 Then(/^I can select section editing by double clicking$/) do
-  on(PreferencesEditingPage).edit_section_double_click_check_element.when_present.should exist
+  expect(on(PreferencesEditingPage).edit_section_double_click_check_element.when_present).to exist
 end
 
 Then(/^I can select section editing by right clicking$/) do
-  on(PreferencesEditingPage).edit_section_right_click_check_element.when_present.should exist
+  expect(on(PreferencesEditingPage).edit_section_right_click_check_element.when_present).to exist
 end
 
 Then(/^I can select section editing via edit links$/) do
-  on(PreferencesEditingPage).edit_section_edit_link_element.when_present.should exist
+  expect(on(PreferencesEditingPage).edit_section_edit_link_element.when_present).to exist
 end
 
 Then(/^I can select show edit toolbar$/) do
-  on(PreferencesEditingPage).show_edit_toolbar_check_element.when_present.should exist
+  expect(on(PreferencesEditingPage).show_edit_toolbar_check_element.when_present).to exist
 end
 
 Then(/^I can select show preview before edit box$/) do
-  on(PreferencesEditingPage).preview_on_top_check_element.when_present.should exist
+  expect(on(PreferencesEditingPage).preview_on_top_check_element.when_present).to exist
 end
 
 Then(/^I can select show preview on first edit$/) do
-  on(PreferencesEditingPage).preview_on_first_check_element.when_present.should exist
+  expect(on(PreferencesEditingPage).preview_on_first_check_element.when_present).to exist
 end
 
 Then(/^I can select to prompt me when entering a blank edit summary$/) do
-  on(PreferencesEditingPage).forced_edit_summary_check_element.when_present.should exist
+  expect(on(PreferencesEditingPage).forced_edit_summary_check_element.when_present).to exist
 end
 
 Then(/^I can select to warn me when I leave an edit page with unsaved changes$/) do
-  on(PreferencesEditingPage).unsaved_changes_check_element.when_present.should exist
+  expect(on(PreferencesEditingPage).unsaved_changes_check_element.when_present).to exist
 end
index 6ecd04f..9c65db8 100644 (file)
@@ -15,28 +15,28 @@ end
 
 Then(/^I can change my gender$/) do
   on(PreferencesUserProfilePage) do |page|
-    page.gender_undefined_radio_element.should exist
-    page.gender_male_radio_element.should exist
-    page.gender_female_radio_element.should exist
+    expect(page.gender_undefined_radio_element).to exist
+    expect(page.gender_male_radio_element).to exist
+    expect(page.gender_female_radio_element).to exist
   end
 end
 
 Then(/^I can change my language$/) do
-  on(PreferencesUserProfilePage).lang_select_element.should exist
+  expect(on(PreferencesUserProfilePage).lang_select_element).to exist
 end
 
 Then(/^I can change my signature$/) do
-  on(PreferencesUserProfilePage).signature_field_element.should exist
+  expect(on(PreferencesUserProfilePage).signature_field_element).to exist
 end
 
 Then(/^I can see my Basic informations$/) do
-  on(PreferencesUserProfilePage).basic_info_table_element.should exist
+  expect(on(PreferencesUserProfilePage).basic_info_table_element).to exist
 end
 
 Then(/^I can see my email$/) do
-  on(PreferencesUserProfilePage).email_table_element.should exist
+  expect(on(PreferencesUserProfilePage).email_table_element).to exist
 end
 
 Then(/^I can see my signature$/) do
-  on(PreferencesUserProfilePage).signature_table_element.should exist
+  expect(on(PreferencesUserProfilePage).signature_table_element).to exist
 end
index 6bb7e83..d9b9381 100644 (file)
@@ -3,5 +3,5 @@ When(/^I click View History$/) do
 end
 
 Then(/^I should see a link to a previous version of the page$/) do
-  on(ViewHistoryPage).old_version_link_element.should be_visible
+  expect(on(ViewHistoryPage).old_version_link_element).to be_visible
 end
diff --git a/tests/phpunit/data/templates/foobar.mustache b/tests/phpunit/data/templates/foobar.mustache
new file mode 100644 (file)
index 0000000..a042389
--- /dev/null
@@ -0,0 +1 @@
+hello world!
diff --git a/tests/phpunit/data/templates/foobar_args.mustache b/tests/phpunit/data/templates/foobar_args.mustache
new file mode 100644 (file)
index 0000000..cfbe3d0
--- /dev/null
@@ -0,0 +1 @@
+hello {{planet}}!
index 1f35ead..9a3bf17 100644 (file)
@@ -225,6 +225,11 @@ class OutputPageTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideMakeResourceLoaderLink
         * @covers OutputPage::makeResourceLoaderLink
+        * @covers ResourceLoader::makeLoaderImplementScript
+        * @covers ResourceLoader::makeModuleResponse
+        * @covers ResourceLoader::makeInlineScript
+        * @covers ResourceLoader::makeLoaderStateScript
+        * @covers ResourceLoader::createLoaderURL
         */
        public function testMakeResourceLoaderLink( $args, $expectedHtml ) {
                $this->setMwGlobals( array(
index ccfccd1..81854ff 100644 (file)
@@ -4,27 +4,60 @@
  * @group Templates
  */
 class TemplateParserTest extends MediaWikiTestCase {
-       /**
-        * @covers TemplateParser::compile
-        */
-       public function testTemplateCompilation() {
-               $this->assertRegExp(
-                       '/^<\?php return function/',
-                       TemplateParser::compile( "test" ),
-                       'compile a simple mustache template'
-               );
+
+       protected $templateDir;
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       'wgSecretKey' => 'foo',
+                       'wgMemc' => new EmptyBagOStuff(),
+               ) );
+
+               $this->templateDir = dirname( __DIR__ ) . '/data/templates/';
        }
 
        /**
-        * @covers TemplateParser::compile
+        * @dataProvider provideProcessTemplate
+        * @covers TemplateParser::processTemplate
+        * @covers TemplateParser::getTemplate
+        * @covers TemplateParser::getTemplateFilename
         */
-       public function testTemplateCompilationWithVariable() {
-               $this->assertRegExp(
-                       '/return \'\'\.htmlentities\(\(string\)\(\(isset\(\$in\[\'value\'\]\) && '
-                               . 'is_array\(\$in\)\) \? \$in\[\'value\'\] : null\), ENT_QUOTES, '
-                               . '\'UTF-8\'\)\.\'\';/',
-                       TemplateParser::compile( "{{value}}" ),
-                       'compile a mustache template with an escaped variable'
+       public function testProcessTemplate( $name, $args, $result, $exception = false ) {
+               if ( $exception ) {
+                       $this->setExpectedException( $exception );
+               }
+               $tp = new TemplateParser( $this->templateDir );
+               $this->assertEquals( $result, $tp->processTemplate( $name, $args ) );
+       }
+
+       public static function provideProcessTemplate() {
+               return array(
+                       array(
+                               'foobar',
+                               array(),
+                               "hello world!\n"
+                       ),
+                       array(
+                               'foobar_args',
+                               array(
+                                       'planet' => 'world',
+                               ),
+                               "hello world!\n",
+                       ),
+                       array(
+                               '../foobar',
+                               array(),
+                               false,
+                               'UnexpectedValueException'
+                       ),
+                       array(
+                               'nonexistenttemplate',
+                               array(),
+                               false,
+                               'RuntimeException',
+                       )
                );
        }
 }
index e00a45a..b3cb7b5 100644 (file)
@@ -48,6 +48,8 @@ class RecentChangeTest extends MediaWikiTestCase {
         * - protect/unprotect
         * - upload/upload
         * - merge/merge
+        * - import/upload
+        * - import/interwiki
         *
         * As well as the following Auto Edit Summaries:
         * - blank
@@ -265,6 +267,29 @@ class RecentChangeTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers LogFormatter::getIRCActionText
+        */
+       public function testIrcMsgForLogTypeImport() {
+               $sep = $this->context->msg( 'colon-separator' )->text();
+
+               # import/upload
+               $this->assertIRCComment(
+                       $this->context->msg( 'import-logentry-upload', 'SomeTitle' )->plain() . $sep . $this->user_comment,
+                       'import', 'upload',
+                       array(),
+                       $this->user_comment
+               );
+
+               # import/interwiki
+               $this->assertIRCComment(
+                       $this->context->msg( 'import-logentry-interwiki', 'SomeTitle' )->plain() . $sep . $this->user_comment,
+                       'import', 'interwiki',
+                       array(),
+                       $this->user_comment
+               );
+       }
+
        /**
         * @todo Emulate these edits somehow and extract
         * raw edit summary from RecentChange object
index 9afc54d..f3dff17 100644 (file)
@@ -18,7 +18,7 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
                );
        }
 
-       public static function getModules() {
+       private static function getModules() {
                $base = array(
                        'localBasePath' => realpath( dirname( __FILE__ ) ),
                );
@@ -48,48 +48,10 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
                );
        }
 
-       public static function providerGetTemplates() {
-               $modules = self::getModules();
-
-               return array(
-                       array(
-                               $modules['noTemplateModule'],
-                               array(),
-                       ),
-                       array(
-                               $modules['templateModuleHandlebars'],
-                               array(
-                                       'templates/template_awesome.handlebars' => "wow\n",
-                               ),
-                       ),
-                       array(
-                               $modules['htmlTemplateModule'],
-                               array(
-                                       'templates/template.html' => "<strong>hello</strong>\n",
-                                       'templates/template2.html' => "<div>goodbye</div>\n",
-                               ),
-                       ),
-                       array(
-                               $modules['aliasedHtmlTemplateModule'],
-                               array(
-                                       'foo.html' => "<strong>hello</strong>\n",
-                                       'bar.html' => "<div>goodbye</div>\n",
-                               ),
-                       ),
-               );
-       }
-
-       public static function providerGetModifiedTime() {
-               $modules = self::getModules();
-
-               return array(
-                       // Check the default value when no templates present in module is 1
-                       array( $modules['noTemplateModule'], 1 ),
-               );
-       }
-
        /**
+        * @covers ResourceLoaderFileModule::getAllStyleFiles
         * @covers ResourceLoaderFileModule::getAllSkinStyleFiles
+        * @covers ResourceLoaderFileModule::getSkinStyleFiles
         */
        public function testGetAllSkinStyleFiles() {
                $baseParams = array(
@@ -132,6 +94,81 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
                );
        }
 
+       /**
+        * Strip @noflip annotations from CSS code.
+        * @param string $css
+        * @return string
+        */
+       private static function stripNoflip( $css ) {
+               return str_replace( '/*@noflip*/ ', '', $css );
+       }
+
+       /**
+        * What happens when you mix @embed and @noflip?
+        * This really is an integration test, but oh well.
+        *
+        * @covers ResourceLoaderFileModule::getStyles
+        * @covers ResourceLoaderFileModule::getStyleFiles
+        */
+       public function testMixedCssAnnotations(  ) {
+               $basePath = __DIR__ . '/../../data/css';
+               $testModule = new ResourceLoaderFileModule( array(
+                       'localBasePath' => $basePath,
+                       'styles' => array( 'test.css' ),
+               ) );
+               $expectedModule = new ResourceLoaderFileModule( array(
+                       'localBasePath' => $basePath,
+                       'styles' => array( 'expected.css' ),
+               ) );
+
+               $contextLtr = $this->getResourceLoaderContext( 'en', 'ltr' );
+               $contextRtl = $this->getResourceLoaderContext( 'he', 'rtl' );
+
+               // Since we want to compare the effect of @noflip+@embed against the effect of just @embed, and
+               // the @noflip annotations are always preserved, we need to strip them first.
+               $this->assertEquals(
+                       $expectedModule->getStyles( $contextLtr ),
+                       self::stripNoflip( $testModule->getStyles( $contextLtr ) ),
+                       "/*@noflip*/ with /*@embed*/ gives correct results in LTR mode"
+               );
+               $this->assertEquals(
+                       $expectedModule->getStyles( $contextLtr ),
+                       self::stripNoflip( $testModule->getStyles( $contextRtl ) ),
+                       "/*@noflip*/ with /*@embed*/ gives correct results in RTL mode"
+               );
+       }
+
+       public static function providerGetTemplates() {
+               $modules = self::getModules();
+
+               return array(
+                       array(
+                               $modules['noTemplateModule'],
+                               array(),
+                       ),
+                       array(
+                               $modules['templateModuleHandlebars'],
+                               array(
+                                       'templates/template_awesome.handlebars' => "wow\n",
+                               ),
+                       ),
+                       array(
+                               $modules['htmlTemplateModule'],
+                               array(
+                                       'templates/template.html' => "<strong>hello</strong>\n",
+                                       'templates/template2.html' => "<div>goodbye</div>\n",
+                               ),
+                       ),
+                       array(
+                               $modules['aliasedHtmlTemplateModule'],
+                               array(
+                                       'foo.html' => "<strong>hello</strong>\n",
+                                       'bar.html' => "<div>goodbye</div>\n",
+                               ),
+                       ),
+               );
+       }
+
        /**
         * @dataProvider providerGetTemplates
         * @covers ResourceLoaderFileModule::getTemplates
@@ -142,6 +179,15 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
                $this->assertEquals( $rl->getTemplates(), $expected );
        }
 
+       public static function providerGetModifiedTime() {
+               $modules = self::getModules();
+
+               return array(
+                       // Check the default value when no templates present in module is 1
+                       array( $modules['noTemplateModule'], 1 ),
+               );
+       }
+
        /**
         * @dataProvider providerGetModifiedTime
         * @covers ResourceLoaderFileModule::getModifiedTime
index d756ce3..e43db78 100644 (file)
@@ -5,8 +5,6 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
        protected function setUp() {
                parent::setUp();
 
-               // $wgResourceLoaderLESSFunctions, $wgResourceLoaderLESSImportPaths; $wgResourceLoaderLESSVars;
-
                $this->setMwGlobals( array(
                        'wgResourceLoaderLESSFunctions' => array(
                                'test-sum' => function ( $frame, $less ) {
@@ -28,15 +26,12 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                ) );
        }
 
-       /* Provider Methods */
        public static function provideValidModules() {
                return array(
                        array( 'TEST.validModule1', new ResourceLoaderTestModule() ),
                );
        }
 
-       /* Test Methods */
-
        /**
         * Ensures that the ResourceLoaderRegisterModules hook is called when a new
         * ResourceLoader object is constructed.
@@ -95,42 +90,10 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
         * @param string $css
         * @return string
         */
-       private function stripNoflip( $css ) {
+       private static function stripNoflip( $css ) {
                return str_replace( '/*@noflip*/ ', '', $css );
        }
 
-       /**
-        * What happens when you mix @embed and @noflip?
-        * This really is an integration test, but oh well.
-        */
-       public function testMixedCssAnnotations(  ) {
-               $basePath = __DIR__ . '/../../data/css';
-               $testModule = new ResourceLoaderFileModule( array(
-                       'localBasePath' => $basePath,
-                       'styles' => array( 'test.css' ),
-               ) );
-               $expectedModule = new ResourceLoaderFileModule( array(
-                       'localBasePath' => $basePath,
-                       'styles' => array( 'expected.css' ),
-               ) );
-
-               $contextLtr = $this->getResourceLoaderContext( 'en', 'ltr' );
-               $contextRtl = $this->getResourceLoaderContext( 'he', 'rtl' );
-
-               // Since we want to compare the effect of @noflip+@embed against the effect of just @embed, and
-               // the @noflip annotations are always preserved, we need to strip them first.
-               $this->assertEquals(
-                       $expectedModule->getStyles( $contextLtr ),
-                       $this->stripNoflip( $testModule->getStyles( $contextLtr ) ),
-                       "/*@noflip*/ with /*@embed*/ gives correct results in LTR mode"
-               );
-               $this->assertEquals(
-                       $expectedModule->getStyles( $contextLtr ),
-                       $this->stripNoflip( $testModule->getStyles( $contextRtl ) ),
-                       "/*@noflip*/ with /*@embed*/ gives correct results in RTL mode"
-               );
-       }
-
        /**
         * @dataProvider providePackedModules
         * @covers ResourceLoader::makePackedModulesString
@@ -192,6 +155,7 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
        /**
         * @dataProvider provideAddSource
         * @covers ResourceLoader::addSource
+        * @covers ResourceLoader::getSources
         */
        public function testAddSource( $name, $info, $expected ) {
                $rl = new ResourceLoader;
diff --git a/tests/phpunit/includes/site/CachingSiteStoreTest.php b/tests/phpunit/includes/site/CachingSiteStoreTest.php
new file mode 100644 (file)
index 0000000..8159b28
--- /dev/null
@@ -0,0 +1,162 @@
+<?php
+
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.25
+ *
+ * @ingroup Site
+ * @ingroup Test
+ *
+ * @group Site
+ * @group Database
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class CachingSiteStoreTest extends MediaWikiTestCase {
+
+       /**
+        * @covers CachingSiteStore::getSites
+        */
+       public function testGetSites() {
+               $testSites = TestSites::getSites();
+
+               $store = new CachingSiteStore(
+                       $this->getHashSiteStore( $testSites ),
+                       wfGetMainCache()
+               );
+
+               $sites = $store->getSites();
+
+               $this->assertInstanceOf( 'SiteList', $sites );
+
+               /**
+                * @var Site $site
+                */
+               foreach ( $sites as $site ) {
+                       $this->assertInstanceOf( 'Site', $site );
+               }
+
+               foreach ( $testSites as $site ) {
+                       if ( $site->getGlobalId() !== null ) {
+                               $this->assertTrue( $sites->hasSite( $site->getGlobalId() ) );
+                       }
+               }
+       }
+
+       /**
+        * @covers CachingSiteStore::saveSites
+        */
+       public function testSaveSites() {
+               $store = new CachingSiteStore( new HashSiteStore(), wfGetMainCache() );
+
+               $sites = array();
+
+               $site = new Site();
+               $site->setGlobalId( 'ertrywuutr' );
+               $site->setLanguageCode( 'en' );
+               $sites[] = $site;
+
+               $site = new MediaWikiSite();
+               $site->setGlobalId( 'sdfhxujgkfpth' );
+               $site->setLanguageCode( 'nl' );
+               $sites[] = $site;
+
+               $this->assertTrue( $store->saveSites( $sites ) );
+
+               $site = $store->getSite( 'ertrywuutr' );
+               $this->assertInstanceOf( 'Site', $site );
+               $this->assertEquals( 'en', $site->getLanguageCode() );
+
+               $site = $store->getSite( 'sdfhxujgkfpth' );
+               $this->assertInstanceOf( 'Site', $site );
+               $this->assertEquals( 'nl', $site->getLanguageCode() );
+       }
+
+       /**
+        * @covers CachingSiteStore::reset
+        */
+       public function testReset() {
+               $dbSiteStore = $this->getMockBuilder( 'SiteStore' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               // php 5.3 compatibility!
+               $self = $this;
+
+               $dbSiteStore->expects( $this->any() )
+                       ->method( 'getSite' )
+                       ->will( $this->returnValue( $self->getTestSite() ) );
+
+               $dbSiteStore->expects( $this->any() )
+                       ->method( 'getSites' )
+                       ->will( $this->returnCallback( function() use( $self ) {
+                               $siteList = new SiteList();
+                               $siteList->setSite( $self->getTestSite() );
+
+                               return $siteList;
+                       } ) );
+
+               $store = new CachingSiteStore( $dbSiteStore, wfGetMainCache() );
+
+               // initialize internal cache
+               $this->assertGreaterThan( 0, $store->getSites()->count(), 'count sites' );
+
+               $store->getSite( 'enwiki' )->setLanguageCode( 'en-ca' );
+
+               // sanity check: $store should have the new language code for 'enwiki'
+               $this->assertEquals( 'en-ca', $store->getSite( 'enwiki' )->getLanguageCode(), 'sanity check' );
+
+               // purge cache
+               $store->reset();
+
+               // the internal cache of $store should be updated, and now pulling
+               // the site from the 'fallback' DBSiteStore with the original language code.
+               $this->assertEquals( 'en', $store->getSite( 'enwiki' )->getLanguageCode(), 'reset' );
+       }
+
+       public function getTestSite() {
+               $enwiki = new MediaWikiSite();
+               $enwiki->setGlobalId( 'enwiki' );
+               $enwiki->setLanguageCode( 'en' );
+
+               return $enwiki;
+       }
+
+       /**
+        * @covers CachingSiteStore::clear
+        */
+       public function testClear() {
+               $store = new CachingSiteStore( new HashSiteStore(), wfGetMainCache() );
+               $this->assertTrue( $store->clear() );
+
+               $site = $store->getSite( 'enwiki' );
+               $this->assertNull( $site );
+
+               $sites = $store->getSites();
+               $this->assertEquals( 0, $sites->count() );
+       }
+
+       private function getHashSiteStore( array $sites ) {
+               $siteStore = new HashSiteStore();
+               $siteStore->saveSites( $sites );
+
+               return $siteStore;
+       }
+
+}
diff --git a/tests/phpunit/includes/site/DBSiteStoreTest.php b/tests/phpunit/includes/site/DBSiteStoreTest.php
new file mode 100644 (file)
index 0000000..09ee899
--- /dev/null
@@ -0,0 +1,134 @@
+<?php
+
+/**
+ * Tests for the DBSiteStore class.
+ *
+ * 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
+ * @since 1.21
+ *
+ * @ingroup Site
+ * @ingroup Test
+ *
+ * @group Site
+ * @group Database
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class DBSiteStoreTest extends MediaWikiTestCase {
+
+       /**
+        * @covers DBSiteStore::getSites
+        */
+       public function testGetSites() {
+               $expectedSites = TestSites::getSites();
+               TestSites::insertIntoDb();
+
+               $store = new DBSiteStore();
+
+               $sites = $store->getSites();
+
+               $this->assertInstanceOf( 'SiteList', $sites );
+
+               /**
+                * @var Site $site
+                */
+               foreach ( $sites as $site ) {
+                       $this->assertInstanceOf( 'Site', $site );
+               }
+
+               foreach ( $expectedSites as $site ) {
+                       if ( $site->getGlobalId() !== null ) {
+                               $this->assertTrue( $sites->hasSite( $site->getGlobalId() ) );
+                       }
+               }
+       }
+
+       /**
+        * @covers DBSiteStore::saveSites
+        */
+       public function testSaveSites() {
+               $store = new DBSiteStore();
+
+               $sites = array();
+
+               $site = new Site();
+               $site->setGlobalId( 'ertrywuutr' );
+               $site->setLanguageCode( 'en' );
+               $sites[] = $site;
+
+               $site = new MediaWikiSite();
+               $site->setGlobalId( 'sdfhxujgkfpth' );
+               $site->setLanguageCode( 'nl' );
+               $sites[] = $site;
+
+               $this->assertTrue( $store->saveSites( $sites ) );
+
+               $site = $store->getSite( 'ertrywuutr' );
+               $this->assertInstanceOf( 'Site', $site );
+               $this->assertEquals( 'en', $site->getLanguageCode() );
+               $this->assertTrue( is_integer( $site->getInternalId() ) );
+               $this->assertTrue( $site->getInternalId() >= 0 );
+
+               $site = $store->getSite( 'sdfhxujgkfpth' );
+               $this->assertInstanceOf( 'Site', $site );
+               $this->assertEquals( 'nl', $site->getLanguageCode() );
+               $this->assertTrue( is_integer( $site->getInternalId() ) );
+               $this->assertTrue( $site->getInternalId() >= 0 );
+       }
+
+       /**
+        * @covers DBSiteStore::reset
+        */
+       public function testReset() {
+               $store1 = new DBSiteStore();
+               $store2 = new DBSiteStore();
+
+               // initialize internal cache
+               $this->assertGreaterThan( 0, $store1->getSites()->count() );
+               $this->assertGreaterThan( 0, $store2->getSites()->count() );
+
+               // Clear actual data. Will purge the external cache and reset the internal
+               // cache in $store1, but not the internal cache in store2.
+               $this->assertTrue( $store1->clear() );
+
+               // sanity check: $store2 should have a stale cache now
+               $this->assertNotNull( $store2->getSite( 'enwiki' ) );
+
+               // purge cache
+               $store2->reset();
+
+               // ...now the internal cache of $store2 should be updated and thus empty.
+               $site = $store2->getSite( 'enwiki' );
+               $this->assertNull( $site );
+       }
+
+       /**
+        * @covers DBSiteStore::clear
+        */
+       public function testClear() {
+               $store = new DBSiteStore();
+               $this->assertTrue( $store->clear() );
+
+               $site = $store->getSite( 'enwiki' );
+               $this->assertNull( $site );
+
+               $sites = $store->getSites();
+               $this->assertEquals( 0, $sites->count() );
+       }
+}
diff --git a/tests/phpunit/includes/site/FileBasedSiteLookupTest.php b/tests/phpunit/includes/site/FileBasedSiteLookupTest.php
new file mode 100644 (file)
index 0000000..8103f61
--- /dev/null
@@ -0,0 +1,102 @@
+<?php
+
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.25
+ *
+ * @ingroup Site
+ * @ingroup Test
+ *
+ * @covers FileBasedSiteLookup
+ * @group Site
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < aude.wiki@gmail.com >
+ */
+class FileBasedSiteLookupTest extends PHPUnit_Framework_TestCase {
+
+       protected function setUp() {
+               $this->cacheFile = $this->getCacheFile();
+       }
+
+       protected function tearDown() {
+               unlink( $this->cacheFile );
+       }
+
+       public function testGetSites() {
+               $sites = $this->getSites();
+               $cacheBuilder = $this->newSitesCacheFileBuilder( $sites );
+               $cacheBuilder->build();
+
+               $cache = new FileBasedSiteLookup( $this->cacheFile );
+               $this->assertEquals( $sites, $cache->getSites() );
+       }
+
+       public function testGetSite() {
+               $sites = $this->getSites();
+               $cacheBuilder = $this->newSitesCacheFileBuilder( $sites );
+               $cacheBuilder->build();
+
+               $cache = new FileBasedSiteLookup( $this->cacheFile );
+
+               $this->assertEquals( $sites->getSite( 'enwiktionary' ), $cache->getSite( 'enwiktionary' ) );
+       }
+
+       private function newSitesCacheFileBuilder( SiteList $sites ) {
+               return new SitesCacheFileBuilder(
+                       $this->getSiteLookup( $sites ),
+                       $this->cacheFile
+               );
+       }
+
+       private function getSiteLookup( SiteList $sites ) {
+               $siteLookup = $this->getMockBuilder( 'SiteLookup' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $siteLookup->expects( $this->any() )
+                       ->method( 'getSites' )
+                       ->will( $this->returnValue( $sites ) );
+
+               return $siteLookup;
+       }
+
+       private function getSites() {
+               $sites = array();
+
+               $site = new Site();
+               $site->setGlobalId( 'foobar' );
+               $sites[] = $site;
+
+               $site = new MediaWikiSite();
+               $site->setGlobalId( 'enwiktionary' );
+               $site->setGroup( 'wiktionary' );
+               $site->setLanguageCode( 'en' );
+               $site->addNavigationId( 'enwiktionary' );
+               $site->setPath( MediaWikiSite::PATH_PAGE, "https://en.wiktionary.org/wiki/$1" );
+               $site->setPath( MediaWikiSite::PATH_FILE, "https://en.wiktionary.org/w/$1" );
+               $sites[] = $site;
+
+               return new SiteList( $sites );
+       }
+
+       private function getCacheFile() {
+               return tempnam( sys_get_temp_dir(), 'mw-test-sitelist' );
+       }
+
+}
diff --git a/tests/phpunit/includes/site/SiteListFileCacheBuilderTest.php b/tests/phpunit/includes/site/SiteListFileCacheBuilderTest.php
deleted file mode 100644 (file)
index bbe8cc7..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-<?php
-
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @since 1.25
- *
- * @ingroup Site
- * @ingroup Test
- *
- * @covers SiteListFileCacheBuilder
- * @group Site
- *
- * @licence GNU GPL v2+
- * @author Katie Filbert < aude.wiki@gmail.com >
- */
-class SiteListFileCacheBuilderTest extends PHPUnit_Framework_TestCase {
-
-       protected function setUp() {
-               $this->cacheFile = $this->getCacheFile();
-       }
-
-       protected function tearDown() {
-               unlink( $this->cacheFile );
-       }
-
-       public function testBuild() {
-               $cacheBuilder = $this->newSiteListFileCacheBuilder( $this->getSites() );
-               $cacheBuilder->build();
-
-               $contents = file_get_contents( $this->cacheFile );
-               $this->assertEquals( json_encode( $this->getExpectedData() ), $contents );
-       }
-
-       private function getExpectedData() {
-               return array(
-                       'sites' => array(
-                               'foobar' => array(
-                                       'globalid' => 'foobar',
-                                       'type' => 'unknown',
-                                       'group' => 'none',
-                                       'source' => 'local',
-                                       'language' => null,
-                                       'localids' => array(),
-                                       'config' => array(),
-                                       'data' => array(),
-                                       'forward' => false,
-                                       'internalid' => null,
-                                       'identifiers' => array()
-                               ),
-                               'enwiktionary' => array(
-                                       'globalid' => 'enwiktionary',
-                                       'type' => 'mediawiki',
-                                       'group' => 'wiktionary',
-                                       'source' => 'local',
-                                       'language' => 'en',
-                                       'localids' => array(
-                                               'equivalent' => array( 'enwiktionary' )
-                                       ),
-                                       'config' => array(),
-                                       'data' => array(
-                                               'paths' => array(
-                                                       'page_path' => 'https://en.wiktionary.org/wiki/$1',
-                                                       'file_path' => 'https://en.wiktionary.org/w/$1'
-                                               )
-                                       ),
-                                       'forward' => false,
-                                       'internalid' => null,
-                                       'identifiers' => array(
-                                               array(
-                                                       'type' => 'equivalent',
-                                                       'key' => 'enwiktionary'
-                                               )
-                                       )
-                               )
-                       )
-               );
-       }
-
-       private function newSiteListFileCacheBuilder( SiteList $sites ) {
-               return new SiteListFileCacheBuilder(
-                       $this->getSiteSQLStore( $sites ),
-                       $this->cacheFile
-               );
-       }
-
-       private function getSiteSQLStore( SiteList $sites ) {
-               $siteSQLStore = $this->getMockBuilder( 'SiteSQLStore' )
-                       ->disableOriginalConstructor()
-                       ->getMock();
-
-               $siteSQLStore->expects( $this->any() )
-                       ->method( 'getSites' )
-                       ->will( $this->returnValue( $sites ) );
-
-               return $siteSQLStore;
-       }
-
-       private function getSites() {
-               $sites = array();
-
-               $site = new Site();
-               $site->setGlobalId( 'foobar' );
-               $sites[] = $site;
-
-               $site = new MediaWikiSite();
-               $site->setGlobalId( 'enwiktionary' );
-               $site->setGroup( 'wiktionary' );
-               $site->setLanguageCode( 'en' );
-               $site->addNavigationId( 'enwiktionary' );
-               $site->setPath( MediaWikiSite::PATH_PAGE, "https://en.wiktionary.org/wiki/$1" );
-               $site->setPath( MediaWikiSite::PATH_FILE, "https://en.wiktionary.org/w/$1" );
-               $sites[] = $site;
-
-               return new SiteList( $sites );
-       }
-
-       private function getCacheFile() {
-               return tempnam( sys_get_temp_dir(), 'mw-test-sitelist' );
-       }
-
-}
diff --git a/tests/phpunit/includes/site/SiteListFileCacheTest.php b/tests/phpunit/includes/site/SiteListFileCacheTest.php
deleted file mode 100644 (file)
index 05dcd8a..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @since 1.25
- *
- * @ingroup Site
- * @ingroup Test
- *
- * @covers SiteListFileCache
- * @group Site
- *
- * @licence GNU GPL v2+
- * @author Katie Filbert < aude.wiki@gmail.com >
- */
-class SiteListFileCacheTest extends PHPUnit_Framework_TestCase {
-
-       protected function setUp() {
-               $this->cacheFile = $this->getCacheFile();
-       }
-
-       protected function tearDown() {
-               unlink( $this->cacheFile );
-       }
-
-       public function testGetSites() {
-               $sites = $this->getSites();
-               $cacheBuilder = $this->newSiteListFileCacheBuilder( $sites );
-               $cacheBuilder->build();
-
-               $cache = new SiteListFileCache( $this->cacheFile );
-               $this->assertEquals( $sites, $cache->getSites() );
-       }
-
-       public function testGetSite() {
-               $sites = $this->getSites();
-               $cacheBuilder = $this->newSiteListFileCacheBuilder( $sites );
-               $cacheBuilder->build();
-
-               $cache = new SiteListFileCache( $this->cacheFile );
-
-               $this->assertEquals( $sites->getSite( 'enwiktionary' ), $cache->getSite( 'enwiktionary' ) );
-       }
-
-       private function newSiteListFileCacheBuilder( SiteList $sites ) {
-               return new SiteListFileCacheBuilder(
-                       $this->getSiteSQLStore( $sites ),
-                       $this->cacheFile
-               );
-       }
-
-       private function getSiteSQLStore( SiteList $sites ) {
-               $siteSQLStore = $this->getMockBuilder( 'SiteSQLStore' )
-                       ->disableOriginalConstructor()
-                       ->getMock();
-
-               $siteSQLStore->expects( $this->any() )
-                       ->method( 'getSites' )
-                       ->will( $this->returnValue( $sites ) );
-
-               return $siteSQLStore;
-       }
-
-       private function getSites() {
-               $sites = array();
-
-               $site = new Site();
-               $site->setGlobalId( 'foobar' );
-               $sites[] = $site;
-
-               $site = new MediaWikiSite();
-               $site->setGlobalId( 'enwiktionary' );
-               $site->setGroup( 'wiktionary' );
-               $site->setLanguageCode( 'en' );
-               $site->addNavigationId( 'enwiktionary' );
-               $site->setPath( MediaWikiSite::PATH_PAGE, "https://en.wiktionary.org/wiki/$1" );
-               $site->setPath( MediaWikiSite::PATH_FILE, "https://en.wiktionary.org/w/$1" );
-               $sites[] = $site;
-
-               return new SiteList( $sites );
-       }
-
-       private function getCacheFile() {
-               return tempnam( sys_get_temp_dir(), 'mw-test-sitelist' );
-       }
-
-}
index 6002c1a..f466e10 100644 (file)
@@ -1,8 +1,6 @@
 <?php
 
 /**
- * Tests for the SiteSQLStore class.
- *
  * 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
@@ -19,7 +17,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @since 1.21
+ * @since 1.25
  *
  * @ingroup Site
  * @ingroup Test
  * @group Database
  *
  * @licence GNU GPL v2+
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ * @author Katie Filbert < aude.wiki@gmail.com >
  */
 class SiteSQLStoreTest extends MediaWikiTestCase {
 
        /**
-        * @covers SiteSQLStore::getSites
-        */
-       public function testGetSites() {
-               $expectedSites = TestSites::getSites();
-               TestSites::insertIntoDb();
-
-               $store = SiteSQLStore::newInstance();
-
-               $sites = $store->getSites();
-
-               $this->assertInstanceOf( 'SiteList', $sites );
-
-               /**
-                * @var Site $site
-                */
-               foreach ( $sites as $site ) {
-                       $this->assertInstanceOf( 'Site', $site );
-               }
-
-               foreach ( $expectedSites as $site ) {
-                       if ( $site->getGlobalId() !== null ) {
-                               $this->assertTrue( $sites->hasSite( $site->getGlobalId() ) );
-                       }
-               }
-       }
-
-       /**
-        * @covers SiteSQLStore::saveSites
-        */
-       public function testSaveSites() {
-               $store = SiteSQLStore::newInstance();
-
-               $sites = array();
-
-               $site = new Site();
-               $site->setGlobalId( 'ertrywuutr' );
-               $site->setLanguageCode( 'en' );
-               $sites[] = $site;
-
-               $site = new MediaWikiSite();
-               $site->setGlobalId( 'sdfhxujgkfpth' );
-               $site->setLanguageCode( 'nl' );
-               $sites[] = $site;
-
-               $this->assertTrue( $store->saveSites( $sites ) );
-
-               $site = $store->getSite( 'ertrywuutr' );
-               $this->assertInstanceOf( 'Site', $site );
-               $this->assertEquals( 'en', $site->getLanguageCode() );
-               $this->assertTrue( is_integer( $site->getInternalId() ) );
-               $this->assertTrue( $site->getInternalId() >= 0 );
-
-               $site = $store->getSite( 'sdfhxujgkfpth' );
-               $this->assertInstanceOf( 'Site', $site );
-               $this->assertEquals( 'nl', $site->getLanguageCode() );
-               $this->assertTrue( is_integer( $site->getInternalId() ) );
-               $this->assertTrue( $site->getInternalId() >= 0 );
-       }
-
-       /**
-        * @covers SiteSQLStore::reset
+        * @covers SiteSQLStore::newInstance
         */
-       public function testReset() {
-               $store1 = SiteSQLStore::newInstance();
-               $store2 = SiteSQLStore::newInstance();
-
-               // initialize internal cache
-               $this->assertGreaterThan( 0, $store1->getSites()->count() );
-               $this->assertGreaterThan( 0, $store2->getSites()->count() );
-
-               // Clear actual data. Will purge the external cache and reset the internal
-               // cache in $store1, but not the internal cache in store2.
-               $this->assertTrue( $store1->clear() );
-
-               // sanity check: $store2 should have a stale cache now
-               $this->assertNotNull( $store2->getSite( 'enwiki' ) );
-
-               // purge cache
-               $store2->reset();
-
-               // ...now the internal cache of $store2 should be updated and thus empty.
-               $site = $store2->getSite( 'enwiki' );
-               $this->assertNull( $site );
+       public function testNewInstance() {
+               $siteStore = SiteSQLStore::newInstance();
+               $this->assertInstanceOf( 'SiteSQLStore', $siteStore );
        }
 
-       /**
-        * @covers SiteSQLStore::clear
-        */
-       public function testClear() {
-               $store = SiteSQLStore::newInstance();
-               $this->assertTrue( $store->clear() );
-
-               $site = $store->getSite( 'enwiki' );
-               $this->assertNull( $site );
-
-               $sites = $store->getSites();
-               $this->assertEquals( 0, $sites->count() );
-       }
 }
diff --git a/tests/phpunit/includes/site/SitesCacheFileBuilderTest.php b/tests/phpunit/includes/site/SitesCacheFileBuilderTest.php
new file mode 100644 (file)
index 0000000..8299423
--- /dev/null
@@ -0,0 +1,136 @@
+<?php
+
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.25
+ *
+ * @ingroup Site
+ * @ingroup Test
+ *
+ * @covers SitesCacheFileBuilder
+ * @group Site
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < aude.wiki@gmail.com >
+ */
+class SitesCacheFileBuilderTest extends PHPUnit_Framework_TestCase {
+
+       protected function setUp() {
+               $this->cacheFile = $this->getCacheFile();
+       }
+
+       protected function tearDown() {
+               unlink( $this->cacheFile );
+       }
+
+       public function testBuild() {
+               $cacheBuilder = $this->newSitesCacheFileBuilder( $this->getSites() );
+               $cacheBuilder->build();
+
+               $contents = file_get_contents( $this->cacheFile );
+               $this->assertEquals( json_encode( $this->getExpectedData() ), $contents );
+       }
+
+       private function getExpectedData() {
+               return array(
+                       'sites' => array(
+                               'foobar' => array(
+                                       'globalid' => 'foobar',
+                                       'type' => 'unknown',
+                                       'group' => 'none',
+                                       'source' => 'local',
+                                       'language' => null,
+                                       'localids' => array(),
+                                       'config' => array(),
+                                       'data' => array(),
+                                       'forward' => false,
+                                       'internalid' => null,
+                                       'identifiers' => array()
+                               ),
+                               'enwiktionary' => array(
+                                       'globalid' => 'enwiktionary',
+                                       'type' => 'mediawiki',
+                                       'group' => 'wiktionary',
+                                       'source' => 'local',
+                                       'language' => 'en',
+                                       'localids' => array(
+                                               'equivalent' => array( 'enwiktionary' )
+                                       ),
+                                       'config' => array(),
+                                       'data' => array(
+                                               'paths' => array(
+                                                       'page_path' => 'https://en.wiktionary.org/wiki/$1',
+                                                       'file_path' => 'https://en.wiktionary.org/w/$1'
+                                               )
+                                       ),
+                                       'forward' => false,
+                                       'internalid' => null,
+                                       'identifiers' => array(
+                                               array(
+                                                       'type' => 'equivalent',
+                                                       'key' => 'enwiktionary'
+                                               )
+                                       )
+                               )
+                       )
+               );
+       }
+
+       private function newSitesCacheFileBuilder( SiteList $sites ) {
+               return new SitesCacheFileBuilder(
+                       $this->getSiteLookup( $sites ),
+                       $this->cacheFile
+               );
+       }
+
+       private function getSiteLookup( SiteList $sites ) {
+               $siteLookup = $this->getMockBuilder( 'SiteLookup' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $siteLookup->expects( $this->any() )
+                       ->method( 'getSites' )
+                       ->will( $this->returnValue( $sites ) );
+
+               return $siteLookup;
+       }
+
+       private function getSites() {
+               $sites = array();
+
+               $site = new Site();
+               $site->setGlobalId( 'foobar' );
+               $sites[] = $site;
+
+               $site = new MediaWikiSite();
+               $site->setGlobalId( 'enwiktionary' );
+               $site->setGroup( 'wiktionary' );
+               $site->setLanguageCode( 'en' );
+               $site->addNavigationId( 'enwiktionary' );
+               $site->setPath( MediaWikiSite::PATH_PAGE, "https://en.wiktionary.org/wiki/$1" );
+               $site->setPath( MediaWikiSite::PATH_FILE, "https://en.wiktionary.org/w/$1" );
+               $sites[] = $site;
+
+               return new SiteList( $sites );
+       }
+
+       private function getCacheFile() {
+               return tempnam( sys_get_temp_dir(), 'mw-test-sitelist' );
+       }
+
+}
index af314ba..b3ff701 100644 (file)
@@ -108,7 +108,7 @@ class TestSites {
         * @since 0.1
         */
        public static function insertIntoDb() {
-               $sitesTable = SiteSQLStore::newInstance();
+               $sitesTable = new DBSiteStore();
                $sitesTable->clear();
                $sitesTable->saveSites( TestSites::getSites() );
        }
index f1146a7..860fec4 100644 (file)
@@ -370,13 +370,6 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideGetNamespaceName
-        *
-        * @param int $namespace
-        * @param string $text
-        * @param string $lang
-        * @param string $expected
-        *
-        * @internal param \TitleValue $title
         */
        public function testGetNamespaceName( $namespace, $text, $lang, $expected ) {
                $codec = $this->makeCodec( $lang );
index 681b2d2..cde6547 100644 (file)
@@ -130,10 +130,14 @@ class AutoLoaderTest extends MediaWikiTestCase {
        }
 
        function testWrongCaseClass() {
+               $this->setMwGlobals( 'wgAutoloadAttemptLowercase', true );
+
                $this->assertTrue( class_exists( 'testautoLoadedcamlCLASS' ) );
        }
 
        function testWrongCaseSerializedClass() {
+               $this->setMwGlobals( 'wgAutoloadAttemptLowercase', true );
+
                $dummyCereal = 'O:29:"testautoloadedserializedclass":0:{}';
                $uncerealized = unserialize( $dummyCereal );
                $this->assertFalse( $uncerealized instanceof __PHP_Incomplete_Class,
index 494727a..8430413 100644 (file)
@@ -73,6 +73,7 @@ return array(
                        'tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.category.test.js',
+                       'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.options.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.watch.test.js',
                        'tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js',
@@ -99,6 +100,7 @@ return array(
                        'jquery.textSelection',
                        'mediawiki.api',
                        'mediawiki.api.category',
+                       'mediawiki.api.options',
                        'mediawiki.api.parse',
                        'mediawiki.api.watch',
                        'mediawiki.jqueryMsg',
diff --git a/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.options.test.js b/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.options.test.js
new file mode 100644 (file)
index 0000000..c0a6585
--- /dev/null
@@ -0,0 +1,78 @@
+( function ( mw ) {
+       QUnit.module( 'mediawiki.api.options', QUnit.newMwEnvironment( {
+               setup: function () {
+                       this.server = this.sandbox.useFakeServer();
+               }
+       } ) );
+
+       QUnit.test( 'saveOption', function ( assert ) {
+               QUnit.expect( 2 );
+
+               var
+                       api = new mw.Api(),
+                       stub = this.sandbox.stub( mw.Api.prototype, 'saveOptions' );
+
+               api.saveOption( 'foo', 'bar' );
+
+               assert.ok( stub.calledOnce, '#saveOptions called once' );
+               assert.deepEqual( stub.getCall( 0 ).args, [ { foo: 'bar' } ], '#saveOptions called correctly' );
+       } );
+
+       QUnit.test( 'saveOptions', function ( assert ) {
+               QUnit.expect( 13 );
+
+               var api = new mw.Api();
+
+               // We need to respond to the request for token first, otherwise the other requests won't be sent
+               // until after the server.respond call, which confuses sinon terribly. This sucks a lot.
+               api.getToken( 'options' );
+               this.server.respond(
+                       /action=tokens.*&type=options/,
+                       [ 200, { 'Content-Type': 'application/json' },
+                               '{ "tokens": { "optionstoken": "+\\\\" } }' ]
+               );
+
+               api.saveOptions( {} ).done( function () {
+                       assert.ok( true, 'Request completed: empty case' );
+               } );
+               api.saveOptions( { foo: 'bar' } ).done( function () {
+                       assert.ok( true, 'Request completed: simple' );
+               } );
+               api.saveOptions( { foo: 'bar', baz: 'quux' } ).done( function () {
+                       assert.ok( true, 'Request completed: two options' );
+               } );
+               api.saveOptions( { foo: 'bar|quux', bar: 'a|b|c', baz: 'quux' } ).done( function () {
+                       assert.ok( true, 'Request completed: not bundleable' );
+               } );
+               api.saveOptions( { foo: null } ).done( function () {
+                       assert.ok( true, 'Request completed: reset an option' );
+               } );
+               api.saveOptions( { 'foo|bar=quux': null } ).done( function () {
+                       assert.ok( true, 'Request completed: reset an option, not bundleable' );
+               } );
+
+               // Requests are POST, match requestBody instead of url
+               this.server.respond( function ( request ) {
+                       switch ( request.requestBody ) {
+                               // simple
+                               case 'action=options&format=json&change=foo%3Dbar&token=%2B%5C':
+                               // two options
+                               case 'action=options&format=json&change=foo%3Dbar%7Cbaz%3Dquux&token=%2B%5C':
+                               // not bundleable
+                               case 'action=options&format=json&optionname=foo&optionvalue=bar%7Cquux&token=%2B%5C':
+                               case 'action=options&format=json&optionname=bar&optionvalue=a%7Cb%7Cc&token=%2B%5C':
+                               case 'action=options&format=json&change=baz%3Dquux&token=%2B%5C':
+                               // reset an option
+                               case 'action=options&format=json&change=foo&token=%2B%5C':
+                               // reset an option, not bundleable
+                               case 'action=options&format=json&optionname=foo%7Cbar%3Dquux&token=%2B%5C':
+                                       assert.ok( true, 'Repond to ' + request.requestBody );
+                                       request.respond( 200, { 'Content-Type': 'application/json' },
+                                               '{ "options": "success" }' );
+                                       break;
+                               default:
+                                       assert.ok( false, 'Unexpected request:' + request.requestBody );
+                       }
+               } );
+       } );
+}( mediaWiki ) );
index 3f19a64..0b42af4 100644 (file)
@@ -1,4 +1,79 @@
 ( function ( mw, $ ) {
+       var
+               // Based on IPTest.php > testisIPv4
+               IPV4_CASES = [
+                       [false, false, 'Boolean false is not an IP'],
+                       [false, true, 'Boolean true is not an IP'],
+                       [false, '', 'Empty string is not an IP'],
+                       [false, 'abc', '"abc" is not an IP'],
+                       [false, ':', 'Colon is not an IP'],
+                       [false, '124.24.52', 'IPv4 not enough quads'],
+                       [false, '24.324.52.13', 'IPv4 out of range'],
+                       [false, '.24.52.13', 'IPv4 starts with period'],
+
+                       [true, '124.24.52.13', '124.24.52.134 is a valid IP'],
+                       [true, '1.24.52.13', '1.24.52.13 is a valid IP'],
+                       [false, '74.24.52.13/20', 'IPv4 ranges are not recognized as valid IPs']
+               ],
+
+               // Based on IPTest.php > testisIPv6
+               IPV6_CASES = [
+                       [false, ':fc:100::', 'IPv6 starting with lone ":"'],
+                       [false, 'fc:100:::', 'IPv6 ending with a ":::"'],
+                       [false, 'fc:300', 'IPv6 with only 2 words'],
+                       [false, 'fc:100:300', 'IPv6 with only 3 words'],
+
+                       [false, 'fc:100:a:d:1:e:ac:0::', 'IPv6 with 8 words ending with "::"'],
+                       [false, 'fc:100:a:d:1:e:ac:0:1::', 'IPv6 with 9 words ending with "::"'],
+
+                       [false, ':::'],
+                       [false, '::0:', 'IPv6 ending in a lone ":"'],
+
+                       [true,  '::', 'IPv6 zero address'],
+
+                       [false, '::fc:100:a:d:1:e:ac:0', 'IPv6 with "::" and 8 words'],
+                       [false, '::fc:100:a:d:1:e:ac:0:1', 'IPv6 with 9 words'],
+
+                       [false, ':fc::100', 'IPv6 starting with lone ":"'],
+                       [false, 'fc::100:', 'IPv6 ending with lone ":"'],
+                       [false, 'fc:::100', 'IPv6 with ":::" in the middle'],
+
+                       [true,  'fc::100', 'IPv6 with "::" and 2 words'],
+                       [true,  'fc::100:a', 'IPv6 with "::" and 3 words'],
+                       [true,  'fc::100:a:d', 'IPv6 with "::" and 4 words'],
+                       [true,  'fc::100:a:d:1', 'IPv6 with "::" and 5 words'],
+                       [true,  'fc::100:a:d:1:e', 'IPv6 with "::" and 6 words'],
+                       [true,  'fc::100:a:d:1:e:ac', 'IPv6 with "::" and 7 words'],
+                       [true,  '2001::df', 'IPv6 with "::" and 2 words'],
+                       [true,  '2001:5c0:1400:a::df', 'IPv6 with "::" and 5 words'],
+                       [true,  '2001:5c0:1400:a::df:2', 'IPv6 with "::" and 6 words'],
+
+                       [false, 'fc::100:a:d:1:e:ac:0', 'IPv6 with "::" and 8 words'],
+                       [false, 'fc::100:a:d:1:e:ac:0:1', 'IPv6 with 9 words']
+               ];
+
+       Array.prototype.push.apply( IPV6_CASES,
+               $.map( [
+                       'fc:100::',
+                       'fc:100:a::',
+                       'fc:100:a:d::',
+                       'fc:100:a:d:1::',
+                       'fc:100:a:d:1:e::',
+                       'fc:100:a:d:1:e:ac::',
+                       '::0',
+                       '::fc',
+                       '::fc:100',
+                       '::fc:100:a',
+                       '::fc:100:a:d',
+                       '::fc:100:a:d:1',
+                       '::fc:100:a:d:1:e',
+                       '::fc:100:a:d:1:e:ac',
+                       'fc:100:a:d:1:e:ac:0'
+               ], function ( el ) {
+                       return [[ true, el, el + ' is a valid IP' ]];
+               } )
+       );
+
        QUnit.module( 'mediawiki.util', QUnit.newMwEnvironment( {
                setup: function () {
                        $.fn.updateTooltipAccessKeys.setTestMode( true );
        } );
 
        QUnit.test( 'isIPv6Address', 40, function ( assert ) {
-               // Shortcuts
-               function assertFalseIPv6( addy, summary ) {
-                       return assert.strictEqual( mw.util.isIPv6Address( addy ), false, summary );
-               }
-
-               function assertTrueIPv6( addy, summary ) {
-                       return assert.strictEqual( mw.util.isIPv6Address( addy ), true, summary );
-               }
-
-               // Based on IPTest.php > testisIPv6
-               assertFalseIPv6( ':fc:100::', 'IPv6 starting with lone ":"' );
-               assertFalseIPv6( 'fc:100:::', 'IPv6 ending with a ":::"' );
-               assertFalseIPv6( 'fc:300', 'IPv6 with only 2 words' );
-               assertFalseIPv6( 'fc:100:300', 'IPv6 with only 3 words' );
-
-               $.each(
-                       ['fc:100::',
-                               'fc:100:a::',
-                               'fc:100:a:d::',
-                               'fc:100:a:d:1::',
-                               'fc:100:a:d:1:e::',
-                               'fc:100:a:d:1:e:ac::'], function ( i, addy ) {
-                               assertTrueIPv6( addy, addy + ' is a valid IP' );
-                       } );
-
-               assertFalseIPv6( 'fc:100:a:d:1:e:ac:0::', 'IPv6 with 8 words ending with "::"' );
-               assertFalseIPv6( 'fc:100:a:d:1:e:ac:0:1::', 'IPv6 with 9 words ending with "::"' );
-
-               assertFalseIPv6( ':::' );
-               assertFalseIPv6( '::0:', 'IPv6 ending in a lone ":"' );
-
-               assertTrueIPv6( '::', 'IPv6 zero address' );
-               $.each(
-                       ['::0',
-                               '::fc',
-                               '::fc:100',
-                               '::fc:100:a',
-                               '::fc:100:a:d',
-                               '::fc:100:a:d:1',
-                               '::fc:100:a:d:1:e',
-                               '::fc:100:a:d:1:e:ac',
-
-                               'fc:100:a:d:1:e:ac:0'], function ( i, addy ) {
-                               assertTrueIPv6( addy, addy + ' is a valid IP' );
-                       } );
-
-               assertFalseIPv6( '::fc:100:a:d:1:e:ac:0', 'IPv6 with "::" and 8 words' );
-               assertFalseIPv6( '::fc:100:a:d:1:e:ac:0:1', 'IPv6 with 9 words' );
-
-               assertFalseIPv6( ':fc::100', 'IPv6 starting with lone ":"' );
-               assertFalseIPv6( 'fc::100:', 'IPv6 ending with lone ":"' );
-               assertFalseIPv6( 'fc:::100', 'IPv6 with ":::" in the middle' );
-
-               assertTrueIPv6( 'fc::100', 'IPv6 with "::" and 2 words' );
-               assertTrueIPv6( 'fc::100:a', 'IPv6 with "::" and 3 words' );
-               assertTrueIPv6( 'fc::100:a:d', 'IPv6 with "::" and 4 words' );
-               assertTrueIPv6( 'fc::100:a:d:1', 'IPv6 with "::" and 5 words' );
-               assertTrueIPv6( 'fc::100:a:d:1:e', 'IPv6 with "::" and 6 words' );
-               assertTrueIPv6( 'fc::100:a:d:1:e:ac', 'IPv6 with "::" and 7 words' );
-               assertTrueIPv6( '2001::df', 'IPv6 with "::" and 2 words' );
-               assertTrueIPv6( '2001:5c0:1400:a::df', 'IPv6 with "::" and 5 words' );
-               assertTrueIPv6( '2001:5c0:1400:a::df:2', 'IPv6 with "::" and 6 words' );
-
-               assertFalseIPv6( 'fc::100:a:d:1:e:ac:0', 'IPv6 with "::" and 8 words' );
-               assertFalseIPv6( 'fc::100:a:d:1:e:ac:0:1', 'IPv6 with 9 words' );
+               $.each( IPV6_CASES, function ( i, ipCase ) {
+                       assert.strictEqual( mw.util.isIPv6Address( ipCase[1] ), ipCase[0], ipCase[2] );
+               } );
        } );
 
        QUnit.test( 'isIPv4Address', 11, function ( assert ) {
-               // Shortcuts
-               function assertFalseIPv4( addy, summary ) {
-                       assert.strictEqual( mw.util.isIPv4Address( addy ), false, summary );
-               }
+               $.each( IPV4_CASES, function ( i, ipCase ) {
+                       assert.strictEqual( mw.util.isIPv4Address( ipCase[1] ), ipCase[0], ipCase[2] );
+               } );
+       } );
 
-               function assertTrueIPv4( addy, summary ) {
-                       assert.strictEqual( mw.util.isIPv4Address( addy ), true, summary );
-               }
+       QUnit.test( 'isIPAddress', 51, function ( assert ) {
+               $.each( IPV4_CASES, function ( i, ipCase ) {
+                       assert.strictEqual( mw.util.isIPv4Address( ipCase[1] ), ipCase[0], ipCase[2] );
+               } );
 
-               // Based on IPTest.php > testisIPv4
-               assertFalseIPv4( false, 'Boolean false is not an IP' );
-               assertFalseIPv4( true, 'Boolean true is not an IP' );
-               assertFalseIPv4( '', 'Empty string is not an IP' );
-               assertFalseIPv4( 'abc', '"abc" is not an IP' );
-               assertFalseIPv4( ':', 'Colon is not an IP' );
-               assertFalseIPv4( '124.24.52', 'IPv4 not enough quads' );
-               assertFalseIPv4( '24.324.52.13', 'IPv4 out of range' );
-               assertFalseIPv4( '.24.52.13', 'IPv4 starts with period' );
-
-               assertTrueIPv4( '124.24.52.13', '124.24.52.134 is a valid IP' );
-               assertTrueIPv4( '1.24.52.13', '1.24.52.13 is a valid IP' );
-               assertFalseIPv4( '74.24.52.13/20', 'IPv4 ranges are not recogzized as valid IPs' );
+               $.each( IPV6_CASES, function ( i, ipCase ) {
+                       assert.strictEqual( mw.util.isIPv6Address( ipCase[1] ), ipCase[0], ipCase[2] );
+               } );
        } );
 }( mediaWiki, jQuery ) );