Merge "mediawiki.ui: Remove deployment hack"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 3 Sep 2014 17:51:17 +0000 (17:51 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 3 Sep 2014 17:51:17 +0000 (17:51 +0000)
221 files changed:
RELEASE-NOTES-1.24
docs/hooks.txt
docs/uidesign/design.html
includes/AutoLoader.php
includes/CategoryFinder.php [new file with mode: 0644]
includes/Categoryfinder.php [deleted file]
includes/DefaultSettings.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/MediaWiki.php
includes/OutputPage.php
includes/ProtectionForm.php
includes/WebRequest.php
includes/actions/Action.php
includes/api/ApiQueryBase.php
includes/api/ApiQuerySiteinfo.php
includes/cache/bloom/BloomCache.php [new file with mode: 0644]
includes/cache/bloom/BloomCacheRedis.php [new file with mode: 0644]
includes/cache/bloom/BloomFilters.php [new file with mode: 0644]
includes/changes/OldChangesList.php
includes/content/CssContent.php
includes/content/CssContentHandler.php
includes/content/JSONContentHandler.php
includes/content/JavaScriptContent.php
includes/content/JavaScriptContentHandler.php
includes/content/TextContentHandler.php
includes/content/WikitextContent.php
includes/content/WikitextContentHandler.php
includes/db/Database.php
includes/diff/DifferenceEngine.php
includes/installer/WebInstallerOutput.php
includes/installer/i18n/br.json
includes/installer/i18n/cs.json
includes/installer/i18n/es.json
includes/installer/i18n/fa.json
includes/installer/i18n/it.json
includes/installer/i18n/ja.json
includes/installer/i18n/lb.json
includes/installer/i18n/mt.json
includes/installer/i18n/nb.json
includes/installer/i18n/oc.json
includes/installer/i18n/pl.json
includes/installer/i18n/ru.json
includes/installer/i18n/zh-hans.json
includes/installer/i18n/zh-hant.json
includes/libs/CSSJanus.php
includes/logging/LogEntry.php
includes/page/Article.php
includes/page/ImagePage.php
includes/pager/IndexPager.php
includes/pager/TablePager.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/specials/SpecialAllMessages.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialListfiles.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialRecentchanges.php
languages/i18n/am.json
languages/i18n/ar.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/egl.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/ka.json
languages/i18n/kk-cyrl.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/lrc.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/mai.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mn.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/myv.json
languages/i18n/mzn.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/oc.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/rm.json
languages/i18n/ro.json
languages/i18n/ru.json
languages/i18n/sah.json
languages/i18n/sc.json
languages/i18n/scn.json
languages/i18n/si.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/ta.json
languages/i18n/tet.json
languages/i18n/th.json
languages/i18n/tr.json
languages/i18n/uk.json
languages/i18n/wuu.json
languages/i18n/yi.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/findMissingFiles.php
maintenance/populateBloomCache.php [new file with mode: 0644]
resources/Resources.php
resources/lib/oojs/oojs.jquery.js
resources/src/mediawiki.action/mediawiki.action.edit.js
resources/src/mediawiki.action/mediawiki.action.view.metadata.css [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.view.metadata.js
resources/src/mediawiki.language/mediawiki.language.js
resources/src/mediawiki.language/mediawiki.language.numbers.js
resources/src/mediawiki.legacy/ajax.js [new file with mode: 0644]
resources/src/mediawiki.legacy/commonPrint.css [new file with mode: 0644]
resources/src/mediawiki.legacy/images/ajax-loader.gif [new file with mode: 0644]
resources/src/mediawiki.legacy/images/checker.png [new file with mode: 0644]
resources/src/mediawiki.legacy/images/feed-icon.png [new file with mode: 0644]
resources/src/mediawiki.legacy/images/feed-icon.svg [new file with mode: 0644]
resources/src/mediawiki.legacy/images/help-question-hover.gif [new file with mode: 0644]
resources/src/mediawiki.legacy/images/help-question.gif [new file with mode: 0644]
resources/src/mediawiki.legacy/images/question.png [new file with mode: 0644]
resources/src/mediawiki.legacy/images/question.svg [new file with mode: 0644]
resources/src/mediawiki.legacy/images/spinner.gif [new file with mode: 0644]
resources/src/mediawiki.legacy/oldshared.css [new file with mode: 0644]
resources/src/mediawiki.legacy/protect.js [new file with mode: 0644]
resources/src/mediawiki.legacy/shared.css [new file with mode: 0644]
resources/src/mediawiki.legacy/upload.js [new file with mode: 0644]
resources/src/mediawiki.legacy/wikibits.js [new file with mode: 0644]
resources/src/mediawiki.ui/components/inputs.less
resources/src/mediawiki/images/arrow-sort-ascending.png [new file with mode: 0644]
resources/src/mediawiki/images/arrow-sort-ascending.svg [new file with mode: 0644]
resources/src/mediawiki/images/arrow-sort-descending.png [new file with mode: 0644]
resources/src/mediawiki/images/arrow-sort-descending.svg [new file with mode: 0644]
resources/src/mediawiki/images/pager-arrow-disabled-fastforward-ltr.png [new file with mode: 0644]
resources/src/mediawiki/images/pager-arrow-disabled-fastforward-rtl.png [new file with mode: 0644]
resources/src/mediawiki/images/pager-arrow-disabled-forward-ltr.png [new file with mode: 0644]
resources/src/mediawiki/images/pager-arrow-disabled-forward-rtl.png [new file with mode: 0644]
resources/src/mediawiki/images/pager-arrow-fastforward-ltr.png [new file with mode: 0644]
resources/src/mediawiki/images/pager-arrow-fastforward-rtl.png [new file with mode: 0644]
resources/src/mediawiki/images/pager-arrow-forward-ltr.png [new file with mode: 0644]
resources/src/mediawiki/images/pager-arrow-forward-rtl.png [new file with mode: 0644]
resources/src/mediawiki/mediawiki.pager.tablePager.less [new file with mode: 0644]
resources/src/startup.js
skins/common/ajax.js [changed from file to symlink]
skins/common/commonPrint.css [deleted file]
skins/common/images/Arr_d.png [deleted file]
skins/common/images/Arr_u.png [deleted file]
skins/common/images/Checker-16x16.png [deleted file]
skins/common/images/ajax-loader.gif [deleted file]
skins/common/images/arrow_disabled_first_25.png [deleted file]
skins/common/images/arrow_disabled_last_25.png [deleted file]
skins/common/images/arrow_disabled_left_25.png [deleted file]
skins/common/images/arrow_disabled_right_25.png [deleted file]
skins/common/images/arrow_first_25.png [deleted file]
skins/common/images/arrow_last_25.png [deleted file]
skins/common/images/arrow_left_25.png [deleted file]
skins/common/images/arrow_right_25.png [deleted file]
skins/common/images/closewindow19x19.png [deleted file]
skins/common/images/feed-icon.png [deleted file]
skins/common/images/feed-icon.svg [deleted file]
skins/common/images/help-question-hover.gif [deleted file]
skins/common/images/help-question.gif [deleted file]
skins/common/images/question-small.png [deleted file]
skins/common/images/question.svg [deleted file]
skins/common/images/spinner.gif [deleted file]
skins/common/oldshared.css [deleted file]
skins/common/protect.js [deleted file]
skins/common/shared.css [deleted file]
skins/common/upload.js [deleted file]
skins/common/wikibits.js [changed from file to symlink]
tests/TestsAutoLoader.php
tests/browser/features/support/pages/preferences_appearance_page.rb
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/data/css/expected.css
tests/phpunit/data/css/test.css
tests/phpunit/data/less/module/styles.css
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/changes/EnhancedChangesListTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/CSSJanusTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
tests/qunit/suites/resources/startup.test.js

index 1205ceb..aea6ec5 100644 (file)
@@ -70,6 +70,10 @@ production.
   we will send rel=alternate.
 
 === New features in 1.24 ===
+* Added new hook WatchlistEditorBeforeFormRender, allowing subscribers to
+  manipulate the list of pages and/or preload lots of data at once.
+* Added new argument &$link in hook WatchlistEditorBuildRemoveLine, allowing the
+  link to the title to be changed.
 * Added a new hook, "WhatLinksHereProps", to allow extensions to annotate
   WhatLinksHere entries.
 * Added a new hook, "ContentGetParserOutput", to customize parser output for
@@ -209,6 +213,7 @@ production.
 * (bugs 57238, 65206) Blank pages can now be directly created.
 * (bug 69789) Title::getContentModel() now loads from the database when
   necessary instead of incorrectly returning the default content model.
+* (bug 69249) wfBaseConvert() now works around PHP Bug #50175 when using GMP.
 
 === Action API changes in 1.24 ===
 * action=parse API now supports prop=modules, which provides the list of
@@ -432,6 +437,8 @@ changes to languages because of Bugzilla reports.
   stylesheet. It was ignored by most browsers these days anyway.
 * SpecialSearchNoResults hook has been removed. SpecialSearchResults is now
   called unconditionally.
+* TablePager::getBody() is now 'final' and can't be overridden in subclasses.
+* TablePager::getBody() is deprecated, use getBodyOutput() or getFullOutput().
 
 ==== Renamed classes ====
 * CLDRPluralRuleConverter_Expression to CLDRPluralRuleConverterExpression
index ad5377e..82da289 100644 (file)
@@ -2942,12 +2942,18 @@ $page: WikiPage object to be watched
 $user: user that watched
 $page: WikiPage object watched
 
+'WatchlistEditorBeforeFormRender': Before building the Special:EditWatchlist
+form, used to manipulate the list of pages or preload data based on that list.
+&$watchlistInfo: array of watchlisted pages in
+  [namespaceId => ['title1' => 1, 'title2' => 1]] format
+
 'WatchlistEditorBuildRemoveLine': when building remove lines in
 Special:Watchlist/edit.
 &$tools: array of extra links
 $title: Title object
 $redirect: whether the page is a redirect
 $skin: Skin object
+&$link: HTML link to title
 
 'WebRequestPathInfoRouter': While building the PathRouter to parse the
 REQUEST_URI.
index a285a5b..51c1b55 100644 (file)
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <html lang="en" dir="ltr">
 <head>
-       <link rel="stylesheet" href="../../skins/common/shared.css">
+       <link rel="stylesheet" href="../../resources/src/mediawiki.legacy/shared.css">
 </head>
 <body style="font-size: small;">
 
index 04802f9..0559a8e 100644 (file)
@@ -36,8 +36,12 @@ $wgAutoloadLocalClasses = array(
        'AuthPluginUser' => 'includes/AuthPlugin.php',
        'Autopromote' => 'includes/Autopromote.php',
        'Block' => 'includes/Block.php',
+       'BloomCache' => 'includes/cache/bloom/BloomCache.php',
+       'BloomCacheRedis' => 'includes/cache/bloom/BloomCacheRedis.php',
+       'BloomFilterTitleHasLogs' => 'includes/cache/bloom/BloomFilters.php',
+       'CacheHelper' => 'includes/CacheHelper.php',
        'Category' => 'includes/Category.php',
-       'Categoryfinder' => 'includes/Categoryfinder.php',
+       'CategoryFinder' => 'includes/CategoryFinder.php',
        'CategoryViewer' => 'includes/CategoryViewer.php',
        'ChangeTags' => 'includes/ChangeTags.php',
        'ChannelFeed' => 'includes/Feed.php',
@@ -65,6 +69,7 @@ $wgAutoloadLocalClasses = array(
        'DumpPipeOutput' => 'includes/Export.php',
        'EditPage' => 'includes/EditPage.php',
        'EmailNotification' => 'includes/UserMailer.php',
+       'EmptyBloomCache' => 'includes/cache/bloom/BloomCache.php',
        'Fallback' => 'includes/Fallback.php',
        'FauxRequest' => 'includes/WebRequest.php',
        'FauxResponse' => 'includes/WebResponse.php',
diff --git a/includes/CategoryFinder.php b/includes/CategoryFinder.php
new file mode 100644 (file)
index 0000000..9fd3883
--- /dev/null
@@ -0,0 +1,236 @@
+<?php
+/**
+ * Recent changes filtering by category.
+ *
+ * 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
+ */
+
+/**
+ * The "CategoryFinder" class takes a list of articles, creates an internal
+ * representation of all their parent categories (as well as parents of
+ * parents etc.). From this representation, it determines which of these
+ * articles are in one or all of a given subset of categories.
+ *
+ * Example use :
+ * <code>
+ *     # Determines whether the article with the page_id 12345 is in both
+ *     # "Category 1" and "Category 2" or their subcategories, respectively
+ *
+ *     $cf = new CategoryFinder;
+ *     $cf->seed(
+ *         array( 12345 ),
+ *         array( 'Category 1', 'Category 2' ),
+ *         'AND'
+ *     );
+ *     $a = $cf->run();
+ *     print implode( ',' , $a );
+ * </code>
+ *
+ */
+class CategoryFinder {
+       /** @var int[] The original article IDs passed to the seed function */
+       protected $articles = array();
+
+       /** @var array Array of DBKEY category names for categories that don't have a page */
+       protected $deadend = array();
+
+       /** @var array Array of [ID => array()] */
+       protected $parents = array();
+
+       /** @var array Array of article/category IDs */
+       protected $next = array();
+
+       /** @var array Array of DBKEY category names */
+       protected $targets = array();
+
+       /** @var array */
+       protected $name2id = array();
+
+       /** @var string "AND" or "OR" */
+       protected $mode;
+
+       /** @var DatabaseBase Read-DB slave */
+       protected $dbr;
+
+       /**
+        * Initializes the instance. Do this prior to calling run().
+        * @param array $articleIds Array of article IDs
+        * @param array $categories FIXME
+        * @param string $mode FIXME, default 'AND'.
+        * @todo FIXME: $categories/$mode
+        */
+       public function seed( $articleIds, $categories, $mode = 'AND' ) {
+               $this->articles = $articleIds;
+               $this->next = $articleIds;
+               $this->mode = $mode;
+
+               # Set the list of target categories; convert them to DBKEY form first
+               $this->targets = array();
+               foreach ( $categories as $c ) {
+                       $ct = Title::makeTitleSafe( NS_CATEGORY, $c );
+                       if ( $ct ) {
+                               $c = $ct->getDBkey();
+                               $this->targets[$c] = $c;
+                       }
+               }
+       }
+
+       /**
+        * Iterates through the parent tree starting with the seed values,
+        * then checks the articles if they match the conditions
+        * @return array Array of page_ids (those given to seed() that match the conditions)
+        */
+       public function run() {
+               $this->dbr = wfGetDB( DB_SLAVE );
+               while ( count( $this->next ) > 0 ) {
+                       $this->scanNextLayer();
+               }
+
+               # Now check if this applies to the individual articles
+               $ret = array();
+
+               foreach ( $this->articles as $article ) {
+                       $conds = $this->targets;
+                       if ( $this->check( $article, $conds ) ) {
+                               # Matches the conditions
+                               $ret[] = $article;
+                       }
+               }
+               return $ret;
+       }
+
+       /**
+        * This functions recurses through the parent representation, trying to match the conditions
+        * @param int $id The article/category to check
+        * @param array $conds The array of categories to match
+        * @param array $path Used to check for recursion loops
+        * @return bool Does this match the conditions?
+        */
+       private function check( $id, &$conds, $path = array() ) {
+               // Check for loops and stop!
+               if ( in_array( $id, $path ) ) {
+                       return false;
+               }
+
+               $path[] = $id;
+
+               # Shortcut (runtime paranoia): No conditions=all matched
+               if ( count( $conds ) == 0 ) {
+                       return true;
+               }
+
+               if ( !isset( $this->parents[$id] ) ) {
+                       return false;
+               }
+
+               # iterate through the parents
+               foreach ( $this->parents[$id] as $p ) {
+                       $pname = $p->cl_to;
+
+                       # Is this a condition?
+                       if ( isset( $conds[$pname] ) ) {
+                               # This key is in the category list!
+                               if ( $this->mode == 'OR' ) {
+                                       # One found, that's enough!
+                                       $conds = array();
+                                       return true;
+                               } else {
+                                       # Assuming "AND" as default
+                                       unset( $conds[$pname] );
+                                       if ( count( $conds ) == 0 ) {
+                                               # All conditions met, done
+                                               return true;
+                                       }
+                               }
+                       }
+
+                       # Not done yet, try sub-parents
+                       if ( !isset( $this->name2id[$pname] ) ) {
+                               # No sub-parent
+                               continue;
+                       }
+                       $done = $this->check( $this->name2id[$pname], $conds, $path );
+                       if ( $done || count( $conds ) == 0 ) {
+                               # Subparents have done it!
+                               return true;
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Scans a "parent layer" of the articles/categories in $this->next
+        */
+       private function scanNextLayer() {
+               $profiler = new ProfileSection( __METHOD__ );
+
+               # Find all parents of the article currently in $this->next
+               $layer = array();
+               $res = $this->dbr->select(
+                       /* FROM   */ 'categorylinks',
+                       /* SELECT */ '*',
+                       /* WHERE  */ array( 'cl_from' => $this->next ),
+                       __METHOD__ . '-1'
+               );
+               foreach ( $res as $o ) {
+                       $k = $o->cl_to;
+
+                       # Update parent tree
+                       if ( !isset( $this->parents[$o->cl_from] ) ) {
+                               $this->parents[$o->cl_from] = array();
+                       }
+                       $this->parents[$o->cl_from][$k] = $o;
+
+                       # Ignore those we already have
+                       if ( in_array( $k, $this->deadend ) ) {
+                               continue;
+                       }
+
+                       if ( isset( $this->name2id[$k] ) ) {
+                               continue;
+                       }
+
+                       # Hey, new category!
+                       $layer[$k] = $k;
+               }
+
+               $this->next = array();
+
+               # Find the IDs of all category pages in $layer, if they exist
+               if ( count( $layer ) > 0 ) {
+                       $res = $this->dbr->select(
+                               /* FROM   */ 'page',
+                               /* SELECT */ array( 'page_id', 'page_title' ),
+                               /* WHERE  */ array( 'page_namespace' => NS_CATEGORY, 'page_title' => $layer ),
+                               __METHOD__ . '-2'
+                       );
+                       foreach ( $res as $o ) {
+                               $id = $o->page_id;
+                               $name = $o->page_title;
+                               $this->name2id[$name] = $id;
+                               $this->next[] = $id;
+                               unset( $layer[$name] );
+                       }
+               }
+
+               # Mark dead ends
+               foreach ( $layer as $v ) {
+                       $this->deadend[$v] = $v;
+               }
+       }
+}
diff --git a/includes/Categoryfinder.php b/includes/Categoryfinder.php
deleted file mode 100644 (file)
index a5415af..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-<?php
-/**
- * Recent changes filtering by category.
- *
- * 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
- */
-
-/**
- * The "Categoryfinder" class takes a list of articles, creates an internal
- * representation of all their parent categories (as well as parents of
- * parents etc.). From this representation, it determines which of these
- * articles are in one or all of a given subset of categories.
- *
- * Example use :
- * <code>
- *     # Determines whether the article with the page_id 12345 is in both
- *     # "Category 1" and "Category 2" or their subcategories, respectively
- *
- *     $cf = new Categoryfinder;
- *     $cf->seed(
- *         array( 12345 ),
- *         array( 'Category 1', 'Category 2' ),
- *         'AND'
- *     );
- *     $a = $cf->run();
- *     print implode( ',' , $a );
- * </code>
- *
- */
-class Categoryfinder {
-       /** @var int[] The original article IDs passed to the seed function */
-       protected $articles = array();
-
-       /** @var array Array of DBKEY category names for categories that don't have a page */
-       protected $deadend = array();
-
-       /** @var array Array of [ID => array()] */
-       protected $parents = array();
-
-       /** @var array Array of article/category IDs */
-       protected $next = array();
-
-       /** @var array Array of DBKEY category names */
-       protected $targets = array();
-
-       /** @var array */
-       protected $name2id = array();
-
-       /** @var string "AND" or "OR" */
-       protected $mode;
-
-       /** @var DatabaseBase Read-DB slave */
-       protected $dbr;
-
-       function __construct() {
-       }
-
-       /**
-        * Initializes the instance. Do this prior to calling run().
-        * @param array $article_ids Array of article IDs
-        * @param array $categories FIXME
-        * @param string $mode FIXME, default 'AND'.
-        * @todo FIXME: $categories/$mode
-        */
-       function seed( $article_ids, $categories, $mode = 'AND' ) {
-               $this->articles = $article_ids;
-               $this->next = $article_ids;
-               $this->mode = $mode;
-
-               # Set the list of target categories; convert them to DBKEY form first
-               $this->targets = array();
-               foreach ( $categories as $c ) {
-                       $ct = Title::makeTitleSafe( NS_CATEGORY, $c );
-                       if ( $ct ) {
-                               $c = $ct->getDBkey();
-                               $this->targets[$c] = $c;
-                       }
-               }
-       }
-
-       /**
-        * Iterates through the parent tree starting with the seed values,
-        * then checks the articles if they match the conditions
-        * @return array Array of page_ids (those given to seed() that match the conditions)
-        */
-       function run() {
-               $this->dbr = wfGetDB( DB_SLAVE );
-               while ( count( $this->next ) > 0 ) {
-                       $this->scan_next_layer();
-               }
-
-               # Now check if this applies to the individual articles
-               $ret = array();
-
-               foreach ( $this->articles as $article ) {
-                       $conds = $this->targets;
-                       if ( $this->check( $article, $conds ) ) {
-                               # Matches the conditions
-                               $ret[] = $article;
-                       }
-               }
-               return $ret;
-       }
-
-       /**
-        * This functions recurses through the parent representation, trying to match the conditions
-        * @param int $id The article/category to check
-        * @param array $conds The array of categories to match
-        * @param array $path Used to check for recursion loops
-        * @return bool Does this match the conditions?
-        */
-       function check( $id, &$conds, $path = array() ) {
-               // Check for loops and stop!
-               if ( in_array( $id, $path ) ) {
-                       return false;
-               }
-
-               $path[] = $id;
-
-               # Shortcut (runtime paranoia): No conditions=all matched
-               if ( count( $conds ) == 0 ) {
-                       return true;
-               }
-
-               if ( !isset( $this->parents[$id] ) ) {
-                       return false;
-               }
-
-               # iterate through the parents
-               foreach ( $this->parents[$id] as $p ) {
-                       $pname = $p->cl_to;
-
-                       # Is this a condition?
-                       if ( isset( $conds[$pname] ) ) {
-                               # This key is in the category list!
-                               if ( $this->mode == 'OR' ) {
-                                       # One found, that's enough!
-                                       $conds = array();
-                                       return true;
-                               } else {
-                                       # Assuming "AND" as default
-                                       unset( $conds[$pname] );
-                                       if ( count( $conds ) == 0 ) {
-                                               # All conditions met, done
-                                               return true;
-                                       }
-                               }
-                       }
-
-                       # Not done yet, try sub-parents
-                       if ( !isset( $this->name2id[$pname] ) ) {
-                               # No sub-parent
-                               continue;
-                       }
-                       $done = $this->check( $this->name2id[$pname], $conds, $path );
-                       if ( $done || count( $conds ) == 0 ) {
-                               # Subparents have done it!
-                               return true;
-                       }
-               }
-               return false;
-       }
-
-       /**
-        * Scans a "parent layer" of the articles/categories in $this->next
-        */
-       function scan_next_layer() {
-               wfProfileIn( __METHOD__ );
-
-               # Find all parents of the article currently in $this->next
-               $layer = array();
-               $res = $this->dbr->select(
-                       /* FROM   */ 'categorylinks',
-                       /* SELECT */ '*',
-                       /* WHERE  */ array( 'cl_from' => $this->next ),
-                       __METHOD__ . '-1'
-               );
-               foreach ( $res as $o ) {
-                       $k = $o->cl_to;
-
-                       # Update parent tree
-                       if ( !isset( $this->parents[$o->cl_from] ) ) {
-                               $this->parents[$o->cl_from] = array();
-                       }
-                       $this->parents[$o->cl_from][$k] = $o;
-
-                       # Ignore those we already have
-                       if ( in_array( $k, $this->deadend ) ) {
-                               continue;
-                       }
-
-                       if ( isset( $this->name2id[$k] ) ) {
-                               continue;
-                       }
-
-                       # Hey, new category!
-                       $layer[$k] = $k;
-               }
-
-               $this->next = array();
-
-               # Find the IDs of all category pages in $layer, if they exist
-               if ( count( $layer ) > 0 ) {
-                       $res = $this->dbr->select(
-                               /* FROM   */ 'page',
-                               /* SELECT */ array( 'page_id', 'page_title' ),
-                               /* WHERE  */ array( 'page_namespace' => NS_CATEGORY, 'page_title' => $layer ),
-                               __METHOD__ . '-2'
-                       );
-                       foreach ( $res as $o ) {
-                               $id = $o->page_id;
-                               $name = $o->page_title;
-                               $this->name2id[$name] = $id;
-                               $this->next[] = $id;
-                               unset( $layer[$name] );
-                       }
-               }
-
-               # Mark dead ends
-               foreach ( $layer as $v ) {
-                       $this->deadend[$v] = $v;
-               }
-
-               wfProfileOut( __METHOD__ );
-       }
-}
index 5fc7377..f2042f9 100644 (file)
@@ -2075,6 +2075,28 @@ $wgObjectCaches = array(
        'hash' => array( 'class' => 'HashBagOStuff' ),
 );
 
+/**
+ * Map of bloom filter store names to configuration arrays.
+ *
+ * Example:
+ * $wgBloomFilterStores['main'] = array(
+ *  'cacheId'      => 'main-v1',
+ *  'class'        => 'BloomCacheRedis',
+ *  'redisServers' => array( '127.0.0.1:6379' ),
+ *  'redisConfig'  => array( 'connectTimeout' => 2 )
+ * );
+ *
+ * A primary bloom filter must be created manually.
+ * Example in eval.php:
+ * <code>
+ *     BloomCache::get( 'main' )->init( 'shared', 1000000000, .001 );
+ * </code>
+ * The size should be as large as practical given wiki size and resources.
+ *
+ * @since 1.24
+ */
+$wgBloomFilterStores = array();
+
 /**
  * The expiry time for the parser cache, in seconds.
  * The default is 86400 (one day).
index b83569d..a14191a 100644 (file)
@@ -217,8 +217,13 @@ class EditPage {
        /** @var bool|stdClass */
        protected $lastDelete;
 
-       /** @var bool */
-       protected $mTokenOk = false;
+       /** @var bool
+        * This is public because SemanticForms uses it (bug 67522).
+        * However, please consider using this property publicly
+        * to be deprecated.
+        * @protected
+        */
+       public $mTokenOk = false;
 
        /** @var bool */
        protected $mTokenOkExceptSuffix = false;
@@ -2425,9 +2430,7 @@ class EditPage {
 
                $wgOut->addHTML( $this->editFormTextBeforeContent );
 
-               if ( $this->contentModel === CONTENT_MODEL_WIKITEXT &&
-                       $showToolbar && $wgUser->getOption( 'showtoolbar' ) )
-               {
+               if ( !$this->isCssJsSubpage && $showToolbar && $wgUser->getOption( 'showtoolbar' ) ) {
                        $wgOut->addHTML( EditPage::getEditToolbar() );
                }
 
@@ -2612,9 +2615,18 @@ class EditPage {
                        );
                } elseif ( $wgUser->isAnon() ) {
                        if ( $this->formtype != 'preview' ) {
-                               $wgOut->wrapWikiMsg( "<div id=\"mw-anon-edit-warning\">\n$1</div>", 'anoneditwarning' );
+                               $wgOut->wrapWikiMsg(
+                                       "<div id='mw-anon-edit-warning'>\n$1\n</div>",
+                                       array( 'anoneditwarning',
+                                               // Log-in link
+                                               '{{fullurl:Special:UserLogin|returnto={{FULLPAGENAMEE}}}}',
+                                               // Sign-up link
+                                               '{{fullurl:Special:UserLogin/signup|returnto={{FULLPAGENAMEE}}}}' )
+                               );
                        } else {
-                               $wgOut->wrapWikiMsg( "<div id=\"mw-anon-preview-warning\">\n$1</div>", 'anonpreviewwarning' );
+                               $wgOut->wrapWikiMsg( "<div id=\"mw-anon-preview-warning\">\n$1</div>",
+                                       'anonpreviewwarning'
+                               );
                        }
                } else {
                        if ( $this->isCssJsSubpage ) {
index ddea620..cfe9a87 100644 (file)
@@ -3366,7 +3366,10 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1,
        );
 
        if ( extension_loaded( 'gmp' ) && ( $engine == 'auto' || $engine == 'gmp' ) ) {
-               $result = gmp_strval( gmp_init( $input, $sourceBase ), $destBase );
+               // Removing leading zeros works around broken base detection code in
+               // some PHP versions (see <https://bugs.php.net/bug.php?id=50175> and
+               // <https://bugs.php.net/bug.php?id=55398>).
+               $result = gmp_strval( gmp_init( ltrim( $input, '0' ), $sourceBase ), $destBase );
        } elseif ( extension_loaded( 'bcmath' ) && ( $engine == 'auto' || $engine == 'bcmath' ) ) {
                $decimal = '0';
                foreach ( str_split( strtolower( $input ) ) as $char ) {
index 0424633..9213c02 100644 (file)
@@ -27,7 +27,6 @@
  */
 class MediaWiki {
        /**
-        * @todo Fold $output, etc, into this
         * @var IContextSource
         */
        private $context;
@@ -37,30 +36,6 @@ class MediaWiki {
         */
        private $config;
 
-       /**
-        * @param null|WebRequest $x
-        * @return WebRequest
-        */
-       public function request( WebRequest $x = null ) {
-               $old = $this->context->getRequest();
-               if ( $x ) {
-                       $this->context->setRequest( $x );
-               }
-               return $old;
-       }
-
-       /**
-        * @param null|OutputPage $x
-        * @return OutputPage
-        */
-       public function output( OutputPage $x = null ) {
-               $old = $this->context->getOutput();
-               if ( $x ) {
-                       $this->context->setOutput( $x );
-               }
-               return $old;
-       }
-
        /**
         * @param IContextSource|null $context
         */
index fbd80c9..af90ca6 100644 (file)
@@ -2797,7 +2797,9 @@ $templates
                                                );
                                        } else {
                                                $links['html'] .= Html::inlineScript(
-                                                       $resourceLoader->makeModuleResponse( $context, $grpModules )
+                                                       ResourceLoader::makeLoaderConditionalScript(
+                                                               $resourceLoader->makeModuleResponse( $context, $grpModules )
+                                                       )
                                                );
                                        }
                                        $links['html'] .= "\n";
@@ -3502,6 +3504,8 @@ $templates
                if ( $flip === 'flip' && $this->getLanguage()->isRTL() ) {
                        # If wanted, and the interface is right-to-left, flip the CSS
                        $style_css = CSSJanus::transform( $style_css, true, false );
+               } else {
+                       $style_css = CSSJanus::nullTransform( $style_css );
                }
                $this->mInlineStyles .= Html::inlineStyle( $style_css ) . "\n";
        }
@@ -3552,6 +3556,8 @@ $templates
                        $previewedCSS = $this->getRequest()->getText( 'wpTextbox1' );
                        if ( $this->getLanguage()->getDir() !== $wgContLang->getDir() ) {
                                $previewedCSS = CSSJanus::transform( $previewedCSS, true, false );
+                       } else {
+                               $previewedCSS = CSSJanus::nullTransform( $previewedCSS );
                        }
                        $otherTags .= Html::inlineStyle( $previewedCSS ) . "\n";
                } else {
index 853e2cc..4aa65d9 100644 (file)
@@ -57,16 +57,21 @@ class ProtectionForm {
        /** @var array Map of action to the expiry time of the existing protection */
        protected $mExistingExpiry = array();
 
-       function __construct( Page $article ) {
-               global $wgUser;
+       /** @var IContextSource */
+       private $mContext;
+
+       function __construct( Article $article ) {
                // Set instance variables.
                $this->mArticle = $article;
                $this->mTitle = $article->getTitle();
                $this->mApplicableTypes = $this->mTitle->getRestrictionTypes();
+               $this->mContext = $article->getContext();
 
                // Check if the form should be disabled.
                // If it is, the form will be available in read-only to show levels.
-               $this->mPermErrors = $this->mTitle->getUserPermissionsErrors( 'protect', $wgUser );
+               $this->mPermErrors = $this->mTitle->getUserPermissionsErrors(
+                       'protect', $this->mContext->getUser()
+               );
                if ( wfReadOnly() ) {
                        $this->mPermErrors[] = array( 'readonlytext', wfReadOnlyReason() );
                }
@@ -82,14 +87,15 @@ class ProtectionForm {
         * Loads the current state of protection into the object.
         */
        function loadData() {
-               global $wgRequest, $wgUser;
-
-               $levels = MWNamespace::getRestrictionLevels( $this->mTitle->getNamespace(), $wgUser );
+               $levels = MWNamespace::getRestrictionLevels(
+                       $this->mTitle->getNamespace(), $this->mContext->getUser()
+               );
                $this->mCascade = $this->mTitle->areRestrictionsCascading();
 
-               $this->mReason = $wgRequest->getText( 'mwProtect-reason' );
-               $this->mReasonSelection = $wgRequest->getText( 'wpProtectReasonSelection' );
-               $this->mCascade = $wgRequest->getBool( 'mwProtect-cascade', $this->mCascade );
+               $request = $this->mContext->getRequest();
+               $this->mReason = $request->getText( 'mwProtect-reason' );
+               $this->mReasonSelection = $request->getText( 'wpProtectReasonSelection' );
+               $this->mCascade = $request->getBool( 'mwProtect-cascade', $this->mCascade );
 
                foreach ( $this->mApplicableTypes as $action ) {
                        // @todo FIXME: This form currently requires individual selections,
@@ -106,8 +112,8 @@ class ProtectionForm {
                        }
                        $this->mExistingExpiry[$action] = $existingExpiry;
 
-                       $requestExpiry = $wgRequest->getText( "mwProtect-expiry-$action" );
-                       $requestExpirySelection = $wgRequest->getVal( "wpProtectExpirySelection-$action" );
+                       $requestExpiry = $request->getText( "mwProtect-expiry-$action" );
+                       $requestExpirySelection = $request->getVal( "wpProtectExpirySelection-$action" );
 
                        if ( $requestExpiry ) {
                                // Custom expiry takes precedence
@@ -128,7 +134,7 @@ class ProtectionForm {
                                $this->mExpirySelection[$action] = 'infinite';
                        }
 
-                       $val = $wgRequest->getVal( "mwProtect-level-$action" );
+                       $val = $request->getVal( "mwProtect-level-$action" );
                        if ( isset( $val ) && in_array( $val, $levels ) ) {
                                $this->mRestrictions[$action] = $val;
                        }
@@ -170,16 +176,14 @@ class ProtectionForm {
         * Main entry point for action=protect and action=unprotect
         */
        function execute() {
-               global $wgRequest, $wgOut;
-
                if ( MWNamespace::getRestrictionLevels( $this->mTitle->getNamespace() ) === array( '' ) ) {
                        throw new ErrorPageError( 'protect-badnamespace-title', 'protect-badnamespace-text' );
                }
 
-               if ( $wgRequest->wasPosted() ) {
+               if ( $this->mContext->getRequest()->wasPosted() ) {
                        if ( $this->save() ) {
                                $q = $this->mArticle->isRedirect() ? 'redirect=no' : '';
-                               $wgOut->redirect( $this->mTitle->getFullURL( $q ) );
+                               $this->mContext->getOutput()->redirect( $this->mTitle->getFullURL( $q ) );
                        }
                } else {
                        $this->show();
@@ -192,28 +196,27 @@ class ProtectionForm {
         * @param string $err Error message or null if there's no error
         */
        function show( $err = null ) {
-               global $wgOut;
-
-               $wgOut->setRobotPolicy( 'noindex,nofollow' );
-               $wgOut->addBacklinkSubtitle( $this->mTitle );
+               $out = $this->mContext->getOutput();
+               $out->setRobotPolicy( 'noindex,nofollow' );
+               $out->addBacklinkSubtitle( $this->mTitle );
 
                if ( is_array( $err ) ) {
-                       $wgOut->wrapWikiMsg( "<p class='error'>\n$1\n</p>\n", $err );
+                       $out->wrapWikiMsg( "<p class='error'>\n$1\n</p>\n", $err );
                } elseif ( is_string( $err ) ) {
-                       $wgOut->addHTML( "<p class='error'>{$err}</p>\n" );
+                       $out->addHTML( "<p class='error'>{$err}</p>\n" );
                }
 
                if ( $this->mTitle->getRestrictionTypes() === array() ) {
                        // No restriction types available for the current title
                        // this might happen if an extension alters the available types
-                       $wgOut->setPageTitle( wfMessage(
+                       $out->setPageTitle( wfMessage(
                                'protect-norestrictiontypes-title',
                                $this->mTitle->getPrefixedText()
                        ) );
-                       $wgOut->addWikiText( wfMessage( 'protect-norestrictiontypes-text' )->text() );
+                       $out->addWikiText( wfMessage( 'protect-norestrictiontypes-text' )->text() );
 
                        // Show the log in case protection was possible once
-                       $this->showLogExtract( $wgOut );
+                       $this->showLogExtract( $out );
                        // return as there isn't anything else we can do
                        return;
                }
@@ -227,7 +230,7 @@ class ProtectionForm {
                        }
 
                        /** @todo FIXME: i18n issue, should use formatted number. */
-                       $wgOut->wrapWikiMsg(
+                       $out->wrapWikiMsg(
                                "<div id=\"mw-protect-cascadeon\">\n$1\n" . $titles . "</div>",
                                array( 'protect-cascadeon', count( $cascadeSources ) )
                        );
@@ -236,19 +239,19 @@ class ProtectionForm {
                # Show an appropriate message if the user isn't allowed or able to change
                # the protection settings at this time
                if ( $this->disabled ) {
-                       $wgOut->setPageTitle(
+                       $out->setPageTitle(
                                wfMessage( 'protect-title-notallowed',
                                        $this->mTitle->getPrefixedText() )
                        );
-                       $wgOut->addWikiText( $wgOut->formatPermissionsErrorMessage( $this->mPermErrors, 'protect' ) );
+                       $out->addWikiText( $out->formatPermissionsErrorMessage( $this->mPermErrors, 'protect' ) );
                } else {
-                       $wgOut->setPageTitle( wfMessage( 'protect-title', $this->mTitle->getPrefixedText() ) );
-                       $wgOut->addWikiMsg( 'protect-text',
+                       $out->setPageTitle( wfMessage( 'protect-title', $this->mTitle->getPrefixedText() ) );
+                       $out->addWikiMsg( 'protect-text',
                                wfEscapeWikiText( $this->mTitle->getPrefixedText() ) );
                }
 
-               $wgOut->addHTML( $this->buildForm() );
-               $this->showLogExtract( $wgOut );
+               $out->addHTML( $this->buildForm() );
+               $this->showLogExtract( $out );
        }
 
        /**
@@ -257,16 +260,17 @@ class ProtectionForm {
         * @return bool Success
         */
        function save() {
-               global $wgRequest, $wgUser, $wgOut;
-
                # Permission check!
                if ( $this->disabled ) {
                        $this->show();
                        return false;
                }
 
-               $token = $wgRequest->getVal( 'wpEditToken' );
-               if ( !$wgUser->matchEditToken( $token, array( 'protect', $this->mTitle->getPrefixedDBkey() ) ) ) {
+               $request = $this->mContext->getRequest();
+               $user = $this->mContext->getUser();
+               $out = $this->mContext->getOutput();
+               $token = $request->getVal( 'wpEditToken' );
+               if ( !$user->matchEditToken( $token, array( 'protect', $this->mTitle->getPrefixedDBkey() ) ) ) {
                        $this->show( array( 'sessionfailure' ) );
                        return false;
                }
@@ -295,18 +299,18 @@ class ProtectionForm {
                        }
                }
 
-               $this->mCascade = $wgRequest->getBool( 'mwProtect-cascade' );
+               $this->mCascade = $request->getBool( 'mwProtect-cascade' );
 
                $status = $this->mArticle->doUpdateRestrictions(
                        $this->mRestrictions,
                        $expiry,
                        $this->mCascade,
                        $reasonstr,
-                       $wgUser
+                       $user
                );
 
                if ( !$status->isOK() ) {
-                       $this->show( $wgOut->parseInline( $status->getWikiText() ) );
+                       $this->show( $out->parseInline( $status->getWikiText() ) );
                        return false;
                }
 
@@ -327,7 +331,7 @@ class ProtectionForm {
                        return false;
                }
 
-               WatchAction::doWatchOrUnwatch( $wgRequest->getCheck( 'mwProtectWatch' ), $this->mTitle, $wgUser );
+               WatchAction::doWatchOrUnwatch( $request->getCheck( 'mwProtectWatch' ), $this->mTitle, $user );
 
                return true;
        }
@@ -338,12 +342,14 @@ class ProtectionForm {
         * @return string HTML form
         */
        function buildForm() {
-               global $wgUser, $wgLang, $wgOut, $wgCascadingRestrictionLevels;
-
+               $user = $this->mContext->getUser();
+               $output = $this->mContext->getOutput();
+               $lang = $this->mContext->getLanguage();
+               $cascadingRestrictionLevels = $this->mContext->getConfig()->get( 'CascadingRestrictionLevels' );
                $out = '';
                if ( !$this->disabled ) {
-                       $wgOut->addModules( 'mediawiki.legacy.protect' );
-                       $wgOut->addJsConfigVars( 'wgCascadeableLevels', $wgCascadingRestrictionLevels );
+                       $output->addModules( 'mediawiki.legacy.protect' );
+                       $output->addJsConfigVars( 'wgCascadeableLevels', $cascadingRestrictionLevels );
                        $out .= Xml::openElement( 'form', array( 'method' => 'post',
                                'action' => $this->mTitle->getLocalURL( 'action=protect' ),
                                'id' => 'mw-Protect-Form', 'onsubmit' => 'ProtectionForm.enableUnchainedInputs(true)' ) );
@@ -379,9 +385,9 @@ class ProtectionForm {
 
                        $expiryFormOptions = '';
                        if ( $this->mExistingExpiry[$action] && $this->mExistingExpiry[$action] != 'infinity' ) {
-                               $timestamp = $wgLang->timeanddate( $this->mExistingExpiry[$action], true );
-                               $d = $wgLang->date( $this->mExistingExpiry[$action], true );
-                               $t = $wgLang->time( $this->mExistingExpiry[$action], true );
+                               $timestamp = $lang->timeanddate( $this->mExistingExpiry[$action], true );
+                               $d = $lang->date( $this->mExistingExpiry[$action], true );
+                               $t = $lang->time( $this->mExistingExpiry[$action], true );
                                $expiryFormOptions .=
                                        Xml::option(
                                                wfMessage( 'protect-existing-expiry', $timestamp, $d, $t )->text(),
@@ -508,14 +514,14 @@ class ProtectionForm {
                                        "</td>
                                </tr>";
                        # Disallow watching is user is not logged in
-                       if ( $wgUser->isLoggedIn() ) {
+                       if ( $user->isLoggedIn() ) {
                                $out .= "
                                <tr>
                                        <td></td>
                                        <td class='mw-input'>" .
                                                Xml::checkLabel( wfMessage( 'watchthis' )->text(),
                                                        'mwProtectWatch', 'mwProtectWatch',
-                                                       $wgUser->isWatched( $this->mTitle ) || $wgUser->getOption( 'watchdefault' ) ) .
+                                                       $user->isWatched( $this->mTitle ) || $user->getOption( 'watchdefault' ) ) .
                                        "</td>
                                </tr>";
                        }
@@ -533,7 +539,7 @@ class ProtectionForm {
                }
                $out .= Xml::closeElement( 'fieldset' );
 
-               if ( $wgUser->isAllowed( 'editinterface' ) ) {
+               if ( $user->isAllowed( 'editinterface' ) ) {
                        $title = Title::makeTitle( NS_MEDIAWIKI, 'Protect-dropdown' );
                        $link = Linker::link(
                                $title,
@@ -547,10 +553,10 @@ class ProtectionForm {
                if ( !$this->disabled ) {
                        $out .= Html::hidden(
                                'wpEditToken',
-                               $wgUser->getEditToken( array( 'protect', $this->mTitle->getPrefixedDBkey() ) )
+                               $user->getEditToken( array( 'protect', $this->mTitle->getPrefixedDBkey() ) )
                        );
                        $out .= Xml::closeElement( 'form' );
-                       $wgOut->addScript( $this->buildCleanupScript() );
+                       $output->addScript( $this->buildCleanupScript() );
                }
 
                return $out;
@@ -564,12 +570,10 @@ class ProtectionForm {
         * @return string HTML fragment
         */
        function buildSelector( $action, $selected ) {
-               global $wgUser;
-
                // If the form is disabled, display all relevant levels. Otherwise,
                // just show the ones this user can use.
                $levels = MWNamespace::getRestrictionLevels( $this->mTitle->getNamespace(),
-                       $this->disabled ? null : $wgUser
+                       $this->disabled ? null : $this->mContext->getUser()
                );
 
                $id = 'mwProtect-level-' . $action;
index a1fa0eb..b187c4a 100644 (file)
@@ -181,7 +181,12 @@ class WebRequest {
                                continue;
                        }
                        $host = $parts[0];
-                       if ( $parts[1] === false ) {
+                       if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) {
+                               // Bug 70021: Assume that upstream proxy is running on the default
+                               // port based on the protocol. We have no reliable way to determine
+                               // the actual port in use upstream.
+                               $port = $stdPort;
+                       } elseif ( $parts[1] === false ) {
                                if ( isset( $_SERVER['SERVER_PORT'] ) ) {
                                        $port = $_SERVER['SERVER_PORT'];
                                } // else leave it as $stdPort
index 7dd4616..ffdf516 100644 (file)
@@ -38,18 +38,21 @@ abstract class Action {
 
        /**
         * Page on which we're performing the action
+        * @since 1.17
         * @var WikiPage|Article|ImagePage|CategoryPage|Page $page
         */
        protected $page;
 
        /**
         * IContextSource if specified; otherwise we'll use the Context from the Page
+        * @since 1.17
         * @var IContextSource $context
         */
        protected $context;
 
        /**
         * The fields used to create the HTMLForm
+        * @since 1.17
         * @var array $fields
         */
        protected $fields;
@@ -82,6 +85,7 @@ abstract class Action {
 
        /**
         * Get an appropriate Action subclass for the given action
+        * @since 1.17
         * @param string $action
         * @param Page $page
         * @param IContextSource $context
@@ -152,6 +156,7 @@ abstract class Action {
 
        /**
         * Check if a given action is recognised, even if it's disabled
+        * @since 1.17
         *
         * @param string $name Name of an action
         * @return bool
@@ -162,6 +167,7 @@ abstract class Action {
 
        /**
         * Get the IContextSource in use here
+        * @since 1.17
         * @return IContextSource
         */
        final public function getContext() {
@@ -179,6 +185,7 @@ abstract class Action {
 
        /**
         * Get the WebRequest being used for this instance
+        * @since 1.17
         *
         * @return WebRequest
         */
@@ -188,6 +195,7 @@ abstract class Action {
 
        /**
         * Get the OutputPage being used for this instance
+        * @since 1.17
         *
         * @return OutputPage
         */
@@ -197,6 +205,7 @@ abstract class Action {
 
        /**
         * Shortcut to get the User being used for this instance
+        * @since 1.17
         *
         * @return User
         */
@@ -206,6 +215,7 @@ abstract class Action {
 
        /**
         * Shortcut to get the Skin being used for this instance
+        * @since 1.17
         *
         * @return Skin
         */
@@ -224,6 +234,8 @@ abstract class Action {
 
        /**
         * Shortcut to get the Title object from the page
+        * @since 1.17
+        *
         * @return Title
         */
        final public function getTitle() {
@@ -262,6 +274,8 @@ abstract class Action {
 
        /**
         * Return the name of the action this object responds to
+        * @since 1.17
+        *
         * @return string Lowercase name
         */
        abstract public function getName();
@@ -269,6 +283,8 @@ abstract class Action {
        /**
         * Get the permission required to perform this action.  Often, but not always,
         * the same as the action name
+        * @since 1.17
+        *
         * @return string|null
         */
        public function getRestriction() {
@@ -279,6 +295,7 @@ abstract class Action {
         * Checks if the given user (identified by an object) can perform this action.  Can be
         * overridden by sub-classes with more complicated permissions schemes.  Failures here
         * must throw subclasses of ErrorPageError
+        * @since 1.17
         *
         * @param User $user The user to check, or null to use the context user
         * @throws UserBlockedError|ReadOnlyError|PermissionsError
@@ -307,6 +324,8 @@ abstract class Action {
 
        /**
         * Whether this action requires the wiki not to be locked
+        * @since 1.17
+        *
         * @return bool
         */
        public function requiresWrite() {
@@ -315,6 +334,8 @@ abstract class Action {
 
        /**
         * Whether this action can still be executed by a blocked user
+        * @since 1.17
+        *
         * @return bool
         */
        public function requiresUnblock() {
@@ -324,6 +345,7 @@ abstract class Action {
        /**
         * Set output headers for noindexing etc.  This function will not be called through
         * the execute() entry point, so only put UI-related stuff in here.
+        * @since 1.17
         */
        protected function setHeaders() {
                $out = $this->getOutput();
@@ -344,6 +366,7 @@ abstract class Action {
 
        /**
         * Returns the description that goes below the \<h1\> tag
+        * @since 1.17
         *
         * @return string
         */
@@ -355,6 +378,8 @@ abstract class Action {
         * The main action entry point.  Do all output for display and send it to the context
         * output.  Do not use globals $wgOut, $wgRequest, etc, in implementations; use
         * $this->getOutput(), etc.
+        * @since 1.17
+        *
         * @throws ErrorPageError
         */
        abstract public function show();
index afb939b..6b08fc5 100644 (file)
@@ -576,7 +576,7 @@ abstract class ApiQueryBase extends ApiBase {
         * @return bool True if acceptable, false otherwise
         */
        protected function checkRowCount() {
-               wfDeprecated( __METHOD__, 1.24 );
+               wfDeprecated( __METHOD__, '1.24' );
                $db = $this->getDB();
                $this->profileDBIn();
                $rowcount = $db->estimateRowCount(
@@ -603,7 +603,7 @@ abstract class ApiQueryBase extends ApiBase {
         * @return string Page title with underscores
         */
        public function titleToKey( $title ) {
-               wfDeprecated( __METHOD__, 1.24 );
+               wfDeprecated( __METHOD__, '1.24' );
                // Don't throw an error if we got an empty string
                if ( trim( $title ) == '' ) {
                        return '';
@@ -623,7 +623,7 @@ abstract class ApiQueryBase extends ApiBase {
         * @return string Page title with spaces
         */
        public function keyToTitle( $key ) {
-               wfDeprecated( __METHOD__, 1.24 );
+               wfDeprecated( __METHOD__, '1.24' );
                // Don't throw an error if we got an empty string
                if ( trim( $key ) == '' ) {
                        return '';
@@ -644,7 +644,7 @@ abstract class ApiQueryBase extends ApiBase {
         * @return string Key part with underscores
         */
        public function keyPartToTitle( $keyPart ) {
-               wfDeprecated( __METHOD__, 1.24 );
+               wfDeprecated( __METHOD__, '1.24' );
                return substr( $this->keyToTitle( $keyPart . 'x' ), 0, -1 );
        }
 
index 04892a1..522c7c0 100644 (file)
@@ -843,7 +843,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                ' fileextensions        - Returns list of file extensions allowed to be uploaded',
                                ' rightsinfo            - Returns wiki rights (license) information if available',
                                ' restrictions          - Returns information on available restriction (protection) types',
-                               ' languages             - Returns a list of languages MediaWiki supports' .
+                               ' languages             - Returns a list of languages MediaWiki supports ' .
                                        "(optionally localised by using {$p}inlanguagecode)",
                                ' skins                 - Returns a list of all enabled skins',
                                ' extensiontags         - Returns a list of parser extension tags',
diff --git a/includes/cache/bloom/BloomCache.php b/includes/cache/bloom/BloomCache.php
new file mode 100644 (file)
index 0000000..236db95
--- /dev/null
@@ -0,0 +1,323 @@
+<?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
+ * @author Aaron Schulz
+ */
+
+/**
+ * Persistent bloom filter used to avoid expensive lookups
+ *
+ * @since 1.24
+ */
+abstract class BloomCache {
+       /** @var string Unique ID for key namespacing */
+       protected $cacheID;
+
+       /** @var array Map of (id => BloomCache) */
+       protected static $instances = array();
+
+       /**
+        * @param string $id
+        * @return BloomCache
+        */
+       final public static function get( $id ) {
+               global $wgBloomFilterStores;
+
+               if ( !isset( self::$instances[$id] ) ) {
+                       if ( isset( $wgBloomFilterStores[$id] ) ) {
+                               $class = $wgBloomFilterStores[$id]['class'];
+                               self::$instances[$id] = new $class( $wgBloomFilterStores[$id] );
+                       } else {
+                               wfDebug( "No bloom filter store '$id'; using EmptyBloomCache." );
+                               return new EmptyBloomCache( array() );
+                       }
+               }
+
+               return self::$instances[$id];
+       }
+
+       /**
+        * Create a new bloom cache instance from configuration.
+        * This should only be called from within BloomCache.
+        *
+        * @param array $config Parameters include:
+        *   - cacheID : Prefix to all bloom filter names that is unique to this cache.
+        *               It should only consist of alphanumberic, '-', and '_' characters.
+        *               This ID is what avoids collisions if multiple logical caches
+        *               use the same storage system, so this should be set carefully.
+        */
+       public function __construct( array $config ) {
+               $this->cacheID = $config['cacheId'];
+               if ( !preg_match( '!^[a-zA-Z0-9-_]{1,32}$!', $this->cacheID ) ) {
+                       throw new MWException( "Cache ID '{$this->cacheID}' is invalid." );
+               }
+       }
+
+       /**
+        * Check if a member is set in the bloom filter
+        *
+        * A member being set means that it *might* have been added.
+        * A member not being set means it *could not* have been added.
+        *
+        * This abstracts over isHit() to deal with filter updates and readiness.
+        * A class must exist with the name BloomFilter<type> and a static public
+        * mergeAndCheck() method. The later takes the following arguments:
+        *              (BloomCache $bcache, $domain, $virtualKey, array $status)
+        * The method should return a bool indicating whether to use the filter.
+        *
+        * The 'shared' bloom key must be used for any updates and will be used
+        * for the membership check if the method returns true. Since the key is shared,
+        * the method should never use delete(). The filter cannot be used in cases where
+        * membership in the filter needs to be taken away. In such cases, code *cannot*
+        * use this method - instead, it can directly use the other BloomCache methods
+        * to manage custom filters with their own keys (e.g. not 'shared').
+        *
+        * @param string $domain
+        * @param string $type
+        * @param string $member
+        * @return bool True if set, false if not (also returns true on error)
+        */
+       final public function check( $domain, $type, $member ) {
+               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+
+               if ( method_exists( "BloomFilter{$type}", 'mergeAndCheck' ) ) {
+                       try {
+                               $virtualKey = "$domain:$type";
+
+                               $status = $this->getStatus( $virtualKey );
+                               if ( $status == false ) {
+                                       wfDebug( "Could not query virtual bloom filter '$virtualKey'." );
+                                       return null;
+                               }
+
+                               $useFilter = call_user_func_array(
+                                       array( "BloomFilter{$type}", 'mergeAndCheck' ),
+                                       array( $this, $domain, $virtualKey, $status )
+                               );
+
+                               if ( $useFilter ) {
+                                       return ( $this->isHit( 'shared', "$virtualKey:$member" ) !== false );
+                               }
+                       } catch ( MWException $e ) {
+                               MWExceptionHandler::logException( $e );
+                               return true;
+                       }
+               }
+
+               return true;
+       }
+
+       /**
+        * Inform the bloom filter of a new member in order to keep it up to date
+        *
+        * @param string $domain
+        * @param string $type
+        * @param string|array $members
+        * @return bool Success
+        */
+       final public function insert( $domain, $type, $members ) {
+               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+
+               if ( method_exists( "BloomFilter{$type}", 'mergeAndCheck' ) ) {
+                       try {
+                               $virtualKey = "$domain:$type";
+                               $prefixedMembers = array();
+                               foreach ( (array)$members as $member ) {
+                                       $prefixedMembers[] = "$virtualKey:$member";
+                               }
+
+                               return $this->add( 'shared', $prefixedMembers );
+                       } catch ( MWException $e ) {
+                               MWExceptionHandler::logException( $e );
+                               return false;
+                       }
+               }
+
+               return true;
+       }
+
+       /**
+        * Create a new bloom filter at $key (if one does not exist yet)
+        *
+        * @param string $key
+        * @param integer $size Bit length [default: 1000000]
+        * @param float $precision [default: .001]
+        * @return bool Success
+        */
+       final public function init( $key, $size = 1000000, $precision = .001 ) {
+               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+
+               return $this->doInit( "{$this->cacheID}:$key", $size, min( .1, $precision ) );
+       }
+
+       /**
+        * Add a member to the bloom filter at $key
+        *
+        * @param string $key
+        * @param string|array $members
+        * @return bool Success
+        */
+       final public function add( $key, $members ) {
+               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+
+               return $this->doAdd( "{$this->cacheID}:$key", (array)$members );
+       }
+
+       /**
+        * Check if a member is set in the bloom filter.
+        *
+        * A member being set means that it *might* have been added.
+        * A member not being set means it *could not* have been added.
+        *
+        * If this returns true, then the caller usually should do the
+        * expensive check (whatever that may be). It can be avoided otherwise.
+        *
+        * @param string $key
+        * @param string $member
+        * @return bool|null True if set, false if not, null on error
+        */
+       final public function isHit( $key, $member ) {
+               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+
+               return $this->doIsHit( "{$this->cacheID}:$key", $member );
+       }
+
+       /**
+        * Destroy a bloom filter at $key
+        *
+        * @param string $key
+        * @return bool Success
+        */
+       final public function delete( $key ) {
+               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+
+               return $this->doDelete( "{$this->cacheID}:$key" );
+       }
+
+       /**
+        * Set the status map of the virtual bloom filter at $key
+        *
+        * @param string $virtualKey
+        * @param array $values Map including some of (lastID, asOfTime, epoch)
+        * @return bool Success
+        */
+       final public function setStatus( $virtualKey, array $values ) {
+               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+
+               return $this->doSetStatus( "{$this->cacheID}:$virtualKey", $values );
+       }
+
+       /**
+        * Get the status map of the virtual bloom filter at $key
+        *
+        * The map includes:
+        *   - lastID    : the highest ID of the items merged in
+        *   - asOfTime  : UNIX timestamp that the filter is up-to-date as of
+        *   - epoch     : UNIX timestamp that filter started being populated
+        * Unset fields will have a null value.
+        *
+        * @param string $virtualKey
+        * @return array|bool False on failure
+        */
+       final public function getStatus( $virtualKey ) {
+               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+
+               return $this->doGetStatus( "{$this->cacheID}:$virtualKey" );
+       }
+
+       /**
+        * Get an exclusive lock on a filter for updates
+        *
+        * @param string $virtualKey
+        * @return ScopedCallback|ScopedLock|null Returns null if acquisition failed
+        */
+       public function getScopedLock( $virtualKey ) {
+               return null;
+       }
+
+       /**
+        * @param string $key
+        * @param integer $size Bit length
+        * @param float $precision
+        * @return bool Success
+        */
+       abstract protected function doInit( $key, $size, $precision );
+
+       /**
+        * @param string $key
+        * @param array $members
+        * @return bool Success
+        */
+       abstract protected function doAdd( $key, array $members );
+
+       /**
+        * @param string $key
+        * @param string $member
+        * @return bool|null
+        */
+       abstract protected function doIsHit( $key, $member );
+
+       /**
+        * @param string $key
+        * @return bool Success
+        */
+       abstract protected function doDelete( $key );
+
+       /**
+        * @param string $virtualKey
+        * @param array $values
+        * @return bool Success
+        */
+       abstract protected function doSetStatus( $virtualKey, array $values );
+
+       /**
+        * @param string $key
+        * @return array|bool
+        */
+       abstract protected function doGetStatus( $key );
+}
+
+class EmptyBloomCache extends BloomCache {
+       public function __construct( array $config ) {
+               parent::__construct( array( 'cacheId' => 'none' ) );
+       }
+
+       protected function doInit( $key, $size, $precision ) {
+               return true;
+       }
+
+       protected function doAdd( $key, array $members ) {
+               return true;
+       }
+
+       protected function doIsHit( $key, $member ) {
+               return true;
+       }
+
+       protected function doDelete( $key ) {
+               return true;
+       }
+
+       protected function doSetStatus( $virtualKey, array $values ) {
+               return true;
+       }
+
+       protected function doGetStatus( $virtualKey ) {
+               return array( 'lastID' => null, 'asOfTime' => null, 'epoch' => null ) ;
+       }
+}
diff --git a/includes/cache/bloom/BloomCacheRedis.php b/includes/cache/bloom/BloomCacheRedis.php
new file mode 100644 (file)
index 0000000..7bafc99
--- /dev/null
@@ -0,0 +1,370 @@
+<?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
+ * @author Aaron Schulz
+ */
+
+/**
+ * Bloom filter implented using Redis
+ *
+ * The Redis server must be >= 2.6 and should have volatile-lru or volatile-ttl
+ * if there is any eviction policy. It should not be allkeys-* in any case. Also,
+ * this can be used in a simple master/slave setup or with Redis Sentinal preferably.
+ *
+ * Some bits are based on https://github.com/ErikDubbelboer/redis-lua-scaling-bloom-filter
+ * but are simplified to use a single filter instead of up to 32 filters.
+ *
+ * @since 1.24
+ */
+class BloomCacheRedis extends BloomCache {
+       /** @var RedisConnectionPool */
+       protected $redisPool;
+       /** @var RedisLockManager */
+       protected $lockMgr;
+       /** @var array */
+       protected $servers;
+       /** @var integer Federate each filter into this many redis bitfield objects */
+       protected $segments = 128;
+
+       /**
+        * @params include:
+        *   - redisServers : list of servers (address:<port>) (the first is the master)
+        *   - redisConf    : additional redis configuration
+        *
+        * @param array $config
+        */
+       public function __construct( array $config ) {
+               parent::__construct( $config );
+
+               $redisConf = $config['redisConfig'];
+               $redisConf['serializer'] = 'none'; // manage that in this class
+               $this->redisPool = RedisConnectionPool::singleton( $redisConf );
+               $this->servers = $config['redisServers'];
+               $this->lockMgr = new RedisLockManager( array(
+                       'lockServers'  => array( 'srv1' => $this->servers[0] ),
+                       'srvsByBucket' => array( 0 => array( 'srv1' ) ),
+                       'redisConfig'  => $config['redisConfig']
+               ) );
+       }
+
+       protected function doInit( $key, $size, $precision ) {
+               $conn = $this->getConnection( 'master' );
+               if ( !$conn ) {
+                       return false;
+               }
+
+               // 80000000 items at p = .001 take up 500MB and fit into one value.
+               // Do not hit the 512MB redis value limit by reducing the demands.
+               $size = min( $size, 80000000 * $this->segments );
+               $precision = max( round( $precision, 3 ), .001 );
+               $epoch = microtime( true );
+
+               static $script =
+<<<LUA
+               local kMetadata, kData = unpack(KEYS)
+               local aEntries, aPrec, aEpoch = unpack(ARGV)
+               if redis.call('EXISTS',kMetadata) == 0 or redis.call('EXISTS',kData) == 0 then
+                       redis.call('DEL',kMetadata)
+                       redis.call('HSET',kMetadata,'entries',aEntries)
+                       redis.call('HSET',kMetadata,'precision',aPrec)
+                       redis.call('HSET',kMetadata,'epoch',aEpoch)
+                       redis.call('SET',kData,'')
+                       return 1
+               end
+               return 0
+LUA;
+
+               $res = false;
+               try {
+                       $conn->script( 'load', $script );
+                       $conn->multi( Redis::MULTI );
+                       for ( $i = 0; $i < $this->segments; ++$i ) {
+                               $res = $conn->luaEval( $script,
+                                       array(
+                                               "$key:$i:bloom-metadata", # KEYS[1]
+                                               "$key:$i:bloom-data", # KEYS[2]
+                                               ceil( $size / $this->segments ), # ARGV[1]
+                                               $precision, # ARGV[2]
+                                               $epoch # ARGV[3]
+                                       ),
+                                       2 # number of first argument(s) that are keys
+                               );
+                       }
+                       $results = $conn->exec();
+                       $res = $results && !in_array( false, $results, true );
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+               }
+
+               return ( $res !== false );
+       }
+
+       protected function doAdd( $key, array $members ) {
+               $conn = $this->getConnection( 'master' );
+               if ( !$conn ) {
+                       return false;
+               }
+
+               static $script =
+<<<LUA
+               local kMetadata, kData = unpack(KEYS)
+               local aMember = unpack(ARGV)
+
+               -- Check if the filter was initialized
+               if redis.call('EXISTS',kMetadata) == 0 or redis.call('EXISTS',kData) == 0 then
+                       return false
+               end
+
+               -- Initial expected entries and desired precision
+               local entries = 1*redis.call('HGET',kMetadata,'entries')
+               local precision = 1*redis.call('HGET',kMetadata,'precision')
+               local hash = redis.sha1hex(aMember)
+
+               -- Based on the math from: http://en.wikipedia.org/wiki/Bloom_filter#Probability_of_false_positives
+               -- 0.480453013 = ln(2)^2
+               local bits = math.ceil((entries * math.log(precision)) / -0.480453013)
+
+               -- 0.693147180 = ln(2)
+               local k = math.floor(0.693147180 * bits / entries)
+
+               -- This uses a variation on:
+               -- 'Less Hashing, Same Performance: Building a Better Bloom Filter'
+               -- http://www.eecs.harvard.edu/~kirsch/pubs/bbbf/esa06.pdf
+               local h = { }
+               h[0] = tonumber(string.sub(hash, 1, 8 ), 16)
+               h[1] = tonumber(string.sub(hash, 9, 16), 16)
+               h[2] = tonumber(string.sub(hash, 17, 24), 16)
+               h[3] = tonumber(string.sub(hash, 25, 32), 16)
+
+               for i=1, k do
+                       local pos = (h[i % 2] + i * h[2 + (((i + (i % 2)) % 4) / 2)]) % bits
+                       redis.call('SETBIT', kData, pos, 1)
+               end
+
+               return 1
+LUA;
+
+               $res = false;
+               try {
+                       $conn->script( 'load', $script );
+                       $conn->multi( Redis::PIPELINE );
+                       foreach ( $members as $member ) {
+                               $i = $this->getSegment( $member );
+                               $conn->luaEval( $script,
+                                       array(
+                                               "$key:$i:bloom-metadata", # KEYS[1],
+                                               "$key:$i:bloom-data", # KEYS[2]
+                                               $member # ARGV[1]
+                                       ),
+                                       2 # number of first argument(s) that are keys
+                               );
+                       }
+                       $results = $conn->exec();
+                       $res = $results && !in_array( false, $results, true );
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+               }
+
+               if ( $res === false ) {
+                       wfDebug( "Could not add to the '$key' bloom filter; it may be missing." );
+               }
+
+               return ( $res !== false );
+       }
+
+       protected function doSetStatus( $virtualKey, array $values ) {
+               $conn = $this->getConnection( 'master' );
+               if ( !$conn ) {
+                       return null;
+               }
+
+               $res = false;
+               try {
+                       $res = $conn->hMSet( "$virtualKey:filter-metadata", $values );
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+               }
+
+               return ( $res !== false );
+       }
+
+       protected function doGetStatus( $virtualKey ) {
+               $conn = $this->getConnection( 'slave' );
+               if ( !$conn ) {
+                       return false;
+               }
+
+               $res = false;
+               try {
+                       $res = $conn->hGetAll( "$virtualKey:filter-metadata" );
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+               }
+
+               if ( is_array( $res ) ) {
+                       $res['lastID'] = isset( $res['lastID'] ) ? $res['lastID'] : null;
+                       $res['asOfTime'] = isset( $res['asOfTime'] ) ? $res['asOfTime'] : null;
+                       $res['epoch'] = isset( $res['epoch'] ) ? $res['epoch'] : null;
+               }
+
+               return $res;
+       }
+
+       protected function doIsHit( $key, $member ) {
+               $conn = $this->getConnection( 'slave' );
+               if ( !$conn ) {
+                       return null;
+               }
+
+               static $script =
+<<<LUA
+               local kMetadata, kData = unpack(KEYS)
+               local aMember = unpack(ARGV)
+
+               -- Check if the filter was initialized
+               if redis.call('EXISTS',kMetadata) == 0 or redis.call('EXISTS',kData) == 0 then
+                       return false
+               end
+
+               -- Initial expected entries and desired precision.
+               -- This determines the size of the first and subsequent filters.
+               local entries = redis.call('HGET',kMetadata,'entries')
+               local precision = redis.call('HGET',kMetadata,'precision')
+               local hash = redis.sha1hex(aMember)
+
+               -- This uses a variation on:
+               -- 'Less Hashing, Same Performance: Building a Better Bloom Filter'
+               -- http://www.eecs.harvard.edu/~kirsch/pubs/bbbf/esa06.pdf
+               local h = { }
+               h[0] = tonumber(string.sub(hash, 1, 8 ), 16)
+               h[1] = tonumber(string.sub(hash, 9, 16), 16)
+               h[2] = tonumber(string.sub(hash, 17, 24), 16)
+               h[3] = tonumber(string.sub(hash, 25, 32), 16)
+
+               -- 0.480453013 = ln(2)^2
+               local bits = math.ceil((entries * math.log(precision)) / -0.480453013)
+
+               -- 0.693147180 = ln(2)
+               local k = math.floor(0.693147180 * bits / entries)
+
+               local found = 1
+               for i=1, k do
+                       local pos = (h[i % 2] + i * h[2 + (((i + (i % 2)) % 4) / 2)]) % bits
+                       if redis.call('GETBIT', kData, pos) == 0 then
+                               found = 0
+                               break
+                       end
+               end
+
+               return found
+LUA;
+
+               $res = null;
+               try {
+                       $i = $this->getSegment( $member );
+                       $res = $conn->luaEval( $script,
+                               array(
+                                       "$key:$i:bloom-metadata", # KEYS[1],
+                                       "$key:$i:bloom-data", # KEYS[2]
+                                       $member # ARGV[1]
+                               ),
+                               2 # number of first argument(s) that are keys
+                       );
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+               }
+
+               return is_int( $res ) ? (bool)$res : null;
+       }
+
+       protected function doDelete( $key ) {
+               $conn = $this->getConnection( 'master' );
+               if ( !$conn ) {
+                       return false;
+               }
+
+               $res = false;
+               try {
+                       $keys = array();
+                       for ( $i = 0; $i < $this->segments; ++$i ) {
+                               $keys[] = "$key:$i:bloom-metadata";
+                               $keys[] = "$key:$i:bloom-data";
+                       }
+                       $res = $conn->delete( $keys );
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+               }
+
+               return ( $res !== false );
+       }
+
+       public function getScopedLock( $virtualKey ) {
+               $status = Status::newGood();
+               return ScopedLock::factory( $this->lockMgr,
+                       array( $virtualKey ), LockManager::LOCK_EX, $status );
+       }
+
+       /**
+        * @param string $member
+        * @return integer
+        */
+       protected function getSegment( $member ) {
+               return hexdec( substr( md5( $member ), 0, 2 ) ) % $this->segments;
+       }
+
+       /**
+        * $param string $to (master/slave)
+        * @return RedisConnRef|bool Returns false on failure
+        */
+       protected function getConnection( $to ) {
+               if ( $to === 'master' ) {
+                       $conn = $this->redisPool->getConnection( $this->servers[0] );
+               } else {
+                       static $lastServer = null;
+
+                       $conn = false;
+                       if ( $lastServer ) {
+                               $conn = $this->redisPool->getConnection( $lastServer );
+                               if ( $conn ) {
+                                       return $conn; // reuse connection
+                               }
+                       }
+                       $servers = $this->servers;
+                       $attempts = min( 3, count( $servers ) );
+                       for ( $i = 1; $i <= $attempts; ++$i ) {
+                               $index = mt_rand( 0, count( $servers ) - 1 );
+                               $conn = $this->redisPool->getConnection( $servers[$index] );
+                               if ( $conn ) {
+                                       $lastServer = $servers[$index];
+                                       return $conn;
+                               }
+                               unset( $servers[$index] ); // skip next time
+                       }
+               }
+
+               return $conn;
+       }
+
+       /**
+        * @param RedisConnRef $conn
+        * @param Exception $e
+        */
+       protected function handleException( RedisConnRef $conn, $e ) {
+               $this->redisPool->handleError( $conn, $e );
+       }
+}
diff --git a/includes/cache/bloom/BloomFilters.php b/includes/cache/bloom/BloomFilters.php
new file mode 100644 (file)
index 0000000..9b710d7
--- /dev/null
@@ -0,0 +1,79 @@
+<?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
+ * @author Aaron Schulz
+ */
+
+/**
+ * @since 1.24
+ */
+class BloomFilterTitleHasLogs {
+       public static function mergeAndCheck(
+               BloomCache $bcache, $domain, $virtualKey, array $status
+       ) {
+               $age = microtime( true ) - $status['asOfTime']; // seconds
+               $scopedLock = ( mt_rand( 1, (int)pow( 3, max( 0, 5 - $age ) ) ) == 1 )
+                       ? $bcache->getScopedLock( $virtualKey )
+                       : false;
+
+               if ( $scopedLock ) {
+                       $updates = self::merge( $bcache, $domain, $virtualKey, $status );
+                       if ( isset( $updates['asOfTime'] ) ) {
+                               $age = ( microtime( true ) - $updates['asOfTime'] );
+                       }
+               }
+
+               return ( $age < 30 );
+       }
+
+       public static function merge(
+               BloomCache $bcache, $domain, $virtualKey, array $status
+       ) {
+               $limit = 1000;
+               $dbr = wfGetDB( DB_SLAVE, array(), $domain );
+               $res = $dbr->select( 'logging',
+                       array( 'log_namespace', 'log_title', 'log_id', 'log_timestamp' ),
+                       array( 'log_id > ' . $dbr->addQuotes( (int)$status['lastID'] ) ),
+                       __METHOD__,
+                       array( 'ORDER BY' => 'log_id', 'LIMIT' => $limit )
+               );
+
+               $updates = array();
+               if ( $res->numRows() > 0 ) {
+                       $members = array();
+                       foreach ( $res as $row ) {
+                               $members[] = "$virtualKey:{$row->log_namespace}:{$row->log_title}";
+                       }
+                       $lastID = $row->log_id;
+                       $lastTime = $row->log_timestamp;
+                       if ( !$bcache->add( 'shared', $members ) ) {
+                               return false;
+                       }
+                       $updates['lastID'] = $lastID;
+                       $updates['asOfTime'] = wfTimestamp( TS_UNIX, $lastTime );
+               } else {
+                       $updates['asOfTime'] = microtime( true );
+               }
+
+               $updates['epoch'] = $status['epoch'] ?: microtime( true );
+
+               $bcache->setStatus( $virtualKey, $updates );
+
+               return $updates;
+       }
+}
index 17c5b6e..b779a02 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 class OldChangesList extends ChangesList {
+
        /**
         * Format a line using the old system (aka without any javascript).
         *
@@ -33,10 +34,6 @@ class OldChangesList extends ChangesList {
        public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
                wfProfileIn( __METHOD__ );
 
-               # Should patrol-related stuff be shown?
-               $unpatrolled = $this->showAsUnpatrolled( $rc );
-
-               $s = '';
                $classes = array();
                // use mw-line-even/mw-line-odd class only if linenumber is given (feature from bug 14468)
                if ( $linenumber ) {
@@ -52,20 +49,52 @@ class OldChangesList extends ChangesList {
                $classes[] = $watched && $rc->mAttribs['rc_timestamp'] >= $watched
                        ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
 
+               $html = $this->formatChangeLine( $rc, $watched );
+
+               if ( $this->watchlist ) {
+                       $classes[] = Sanitizer::escapeClass( 'watchlist-' .
+                               $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] );
+               }
+
+               if ( !wfRunHooks( 'OldChangesListRecentChangesLine', array( &$this, &$html, $rc, &$classes ) ) ) {
+                       wfProfileOut( __METHOD__ );
+
+                       return false;
+               }
+
+               wfProfileOut( __METHOD__ );
+
+               $dateheader = ''; // $html now contains only <li>...</li>, for hooks' convenience.
+               $this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] );
+
+               return "$dateheader<li class=\"" . implode( ' ', $classes ) . "\">" . $html . "</li>\n";
+       }
+
+       /**
+        * @param RecentChange $rc
+        * @param boolean $watched
+        *
+        * @return string
+        */
+       private function formatChangeLine( RecentChange $rc, $watched ) {
+               $html = '';
+
                if ( $rc->mAttribs['rc_log_type'] ) {
                        $logtitle = SpecialPage::getTitleFor( 'Log', $rc->mAttribs['rc_log_type'] );
-                       $this->insertLog( $s, $logtitle, $rc->mAttribs['rc_log_type'] );
+                       $this->insertLog( $html, $logtitle, $rc->mAttribs['rc_log_type'] );
                // Log entries (old format) or log targets, and special pages
                } elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
-                       list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $rc->mAttribs['rc_title'] );
+                       list( $name, $htmlubpage ) = SpecialPageFactory::resolveAlias( $rc->mAttribs['rc_title'] );
                        if ( $name == 'Log' ) {
-                               $this->insertLog( $s, $rc->getTitle(), $subpage );
+                               $this->insertLog( $html, $rc->getTitle(), $htmlubpage );
                        }
                // Regular entries
                } else {
-                       $this->insertDiffHist( $s, $rc, $unpatrolled );
+                       $unpatrolled = $this->showAsUnpatrolled( $rc );
+
+                       $this->insertDiffHist( $html, $rc, $unpatrolled );
                        # M, N, b and ! (minor, new, bot and unpatrolled)
-                       $s .= $this->recentChangesFlags(
+                       $html .= $this->recentChangesFlags(
                                array(
                                        'newpage' => $rc->mAttribs['rc_type'] == RC_NEW,
                                        'minor' => $rc->mAttribs['rc_minor'],
@@ -74,56 +103,40 @@ class OldChangesList extends ChangesList {
                                ),
                                ''
                        );
-                       $this->insertArticleLink( $s, $rc, $unpatrolled, $watched );
+                       $this->insertArticleLink( $html, $rc, $unpatrolled, $watched );
                }
                # Edit/log timestamp
-               $this->insertTimestamp( $s, $rc );
+               $this->insertTimestamp( $html, $rc );
                # Bytes added or removed
                if ( $this->getConfig()->get( 'RCShowChangedSize' ) ) {
                        $cd = $this->formatCharacterDifference( $rc );
                        if ( $cd !== '' ) {
-                               $s .= $cd . '  <span class="mw-changeslist-separator">. .</span> ';
+                               $html .= $cd . '  <span class="mw-changeslist-separator">. .</span> ';
                        }
                }
 
                if ( $rc->mAttribs['rc_type'] == RC_LOG ) {
-                       $s .= $this->insertLogEntry( $rc );
+                       $html .= $this->insertLogEntry( $rc );
                } else {
                        # User tool links
-                       $this->insertUserRelatedLinks( $s, $rc );
+                       $this->insertUserRelatedLinks( $html, $rc );
                        # LTR/RTL direction mark
-                       $s .= $this->getLanguage()->getDirMark();
-                       $s .= $this->insertComment( $rc );
+                       $html .= $this->getLanguage()->getDirMark();
+                       $html .= $this->insertComment( $rc );
                }
 
                # Tags
-               $this->insertTags( $s, $rc, $classes );
+               $this->insertTags( $html, $rc, $classes );
                # Rollback
-               $this->insertRollback( $s, $rc );
+               $this->insertRollback( $html, $rc );
                # For subclasses
-               $this->insertExtra( $s, $rc, $classes );
+               $this->insertExtra( $html, $rc, $classes );
 
                # How many users watch this page
                if ( $rc->numberofWatchingusers > 0 ) {
-                       $s .= ' ' . $this->numberofWatchingusers( $rc->numberofWatchingusers );
-               }
-
-               if ( $this->watchlist ) {
-                       $classes[] = Sanitizer::escapeClass( 'watchlist-' .
-                               $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] );
+                       $html .= ' ' . $this->numberofWatchingusers( $rc->numberofWatchingusers );
                }
 
-               if ( !wfRunHooks( 'OldChangesListRecentChangesLine', array( &$this, &$s, $rc, &$classes ) ) ) {
-                       wfProfileOut( __METHOD__ );
-
-                       return false;
-               }
-
-               wfProfileOut( __METHOD__ );
-
-               $dateheader = ''; // $s now contains only <li>...</li>, for hooks' convenience.
-               $this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] );
-
-               return "$dateheader<li class=\"" . implode( ' ', $classes ) . "\">" . $s . "</li>\n";
+               return $html;
        }
 }
index 2673084..7241458 100644 (file)
@@ -58,7 +58,7 @@ class CssContent extends TextContent {
                $text = $this->getNativeData();
                $pst = $wgParser->preSaveTransform( $text, $title, $user, $popts );
 
-               return new CssContent( $pst );
+               return new static( $pst );
        }
 
        /**
index fd326f0..1ab4ee2 100644 (file)
@@ -36,27 +36,8 @@ class CssContentHandler extends TextContentHandler {
                parent::__construct( $modelId, array( CONTENT_FORMAT_CSS ) );
        }
 
-       /**
-        * @param string $text
-        * @param string $format
-        *
-        * @return CssContent
-        *
-        * @see ContentHandler::unserializeContent()
-        */
-       public function unserializeContent( $text, $format = null ) {
-               $this->checkFormat( $format );
-
-               return new CssContent( $text );
-       }
-
-       /**
-        * @return CssContent A new CssContent object with empty text.
-        *
-        * @see ContentHandler::makeEmptyContent()
-        */
-       public function makeEmptyContent() {
-               return new CssContent( '' );
+       protected function getContentClass() {
+               return 'CssContent';
        }
 
        /**
index 6b77527..33f2036 100644 (file)
@@ -16,6 +16,8 @@ class JSONContentHandler extends TextContentHandler {
        /**
         * The class name of objects that should be created
         *
+        * @deprecated override getContentClass instead
+        *
         * @var string
         */
        protected $contentClass = 'JSONContent';
@@ -25,25 +27,13 @@ class JSONContentHandler extends TextContentHandler {
        }
 
        /**
-        * Unserializes a JSONContent object.
-        *
-        * @param string $text Serialized form of the content
-        * @param null|string $format The format used for serialization
-        *
-        * @return JSONContent
-        */
-       public function unserializeContent( $text, $format = null ) {
-               $this->checkFormat( $format );
-               return new $this->contentClass( $text );
-       }
-
-       /**
-        * Creates an empty JSONContent object.
+        * Temporary back-compat until extensions
+        * are updated to override this
         *
-        * @return JSONContent
+        * @return string
         */
-       public function makeEmptyContent() {
-               return new $this->contentClass( '' );
+       protected function getContentClass() {
+               return $this->contentClass;
        }
 
        /**
index 442b705..0991f07 100644 (file)
@@ -57,7 +57,7 @@ class JavaScriptContent extends TextContent {
                $text = $this->getNativeData();
                $pst = $wgParser->preSaveTransform( $text, $title, $user, $popts );
 
-               return new JavaScriptContent( $pst );
+               return new static( $pst );
        }
 
        /**
index 122003f..8d62e2a 100644 (file)
@@ -36,27 +36,8 @@ class JavaScriptContentHandler extends TextContentHandler {
                parent::__construct( $modelId, array( CONTENT_FORMAT_JAVASCRIPT ) );
        }
 
-       /**
-        * @param string $text
-        * @param string $format
-        *
-        * @return JavaScriptContent
-        *
-        * @see ContentHandler::unserializeContent()
-        */
-       public function unserializeContent( $text, $format = null ) {
-               $this->checkFormat( $format );
-
-               return new JavaScriptContent( $text );
-       }
-
-       /**
-        * @return JavaScriptContent A new JavaScriptContent object with empty text.
-        *
-        * @see ContentHandler::makeEmptyContent()
-        */
-       public function makeEmptyContent() {
-               return new JavaScriptContent( '' );
+       protected function getContentClass() {
+               return 'JavaScriptContent';
        }
 
        /**
index 0c9ee37..ffe1acb 100644 (file)
@@ -92,6 +92,19 @@ class TextContentHandler extends ContentHandler {
                return $mergedContent;
        }
 
+       /**
+        * Returns the name of the associated Content class, to
+        * be used when creating new objects. Override expected
+        * by subclasses.
+        *
+        * @since 1.24
+        *
+        * @return string
+        */
+       protected function getContentClass() {
+               return 'TextContent';
+       }
+
        /**
         * Unserializes a Content object of the type supported by this ContentHandler.
         *
@@ -105,7 +118,8 @@ class TextContentHandler extends ContentHandler {
        public function unserializeContent( $text, $format = null ) {
                $this->checkFormat( $format );
 
-               return new TextContent( $text );
+               $class = $this->getContentClass();
+               return new $class( $text );
        }
 
        /**
@@ -116,7 +130,8 @@ class TextContentHandler extends ContentHandler {
         * @return Content A new TextContent object with empty text.
         */
        public function makeEmptyContent() {
-               return new TextContent( '' );
+               $class = $this->getContentClass();
+               return new $class( '' );
        }
 
 }
index 237029b..d23f925 100644 (file)
@@ -52,7 +52,7 @@ class WikitextContent extends TextContent {
                if ( $sect === false ) {
                        return false;
                } else {
-                       return new WikitextContent( $sect );
+                       return new static( $sect );
                }
        }
 
@@ -104,7 +104,7 @@ class WikitextContent extends TextContent {
                        $text = $wgParser->replaceSection( $oldtext, $sectionId, $text );
                }
 
-               $newContent = new WikitextContent( $text );
+               $newContent = new static( $text );
 
                wfProfileOut( __METHOD__ );
 
@@ -125,7 +125,7 @@ class WikitextContent extends TextContent {
                $text .= "\n\n";
                $text .= $this->getNativeData();
 
-               return new WikitextContent( $text );
+               return new static( $text );
        }
 
        /**
@@ -145,7 +145,7 @@ class WikitextContent extends TextContent {
                $pst = $wgParser->preSaveTransform( $text, $title, $user, $popts );
                rtrim( $pst );
 
-               return ( $text === $pst ) ? $this : new WikitextContent( $pst );
+               return ( $text === $pst ) ? $this : new static( $pst );
        }
 
        /**
@@ -164,7 +164,7 @@ class WikitextContent extends TextContent {
                $text = $this->getNativeData();
                $plt = $wgParser->getPreloadText( $text, $title, $popts, $params );
 
-               return new WikitextContent( $plt );
+               return new static( $plt );
        }
 
        /**
@@ -246,7 +246,7 @@ class WikitextContent extends TextContent {
                        '[[' . $target->getFullText() . ']]',
                        $this->getNativeData(), 1 );
 
-               return new WikitextContent( $newText );
+               return new static( $newText );
        }
 
        /**
index 5ae3e25..c1db1de 100644 (file)
@@ -34,19 +34,8 @@ class WikitextContentHandler extends TextContentHandler {
                parent::__construct( $modelId, array( CONTENT_FORMAT_WIKITEXT ) );
        }
 
-       public function unserializeContent( $text, $format = null ) {
-               $this->checkFormat( $format );
-
-               return new WikitextContent( $text );
-       }
-
-       /**
-        * @return Content A new WikitextContent object with empty text.
-        *
-        * @see ContentHandler::makeEmptyContent
-        */
-       public function makeEmptyContent() {
-               return new WikitextContent( '' );
+       protected function getContentClass() {
+               return 'WikitextContent';
        }
 
        /**
@@ -79,7 +68,8 @@ class WikitextContentHandler extends TextContentHandler {
                        $redirectText .= "\n" . $text;
                }
 
-               return new WikitextContent( $redirectText );
+               $class = $this->getContentClass();
+               return new $class( $redirectText );
        }
 
        /**
index a46ee1c..9584e46 100644 (file)
@@ -679,8 +679,6 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *   - DBO_DEBUG: output some debug info (same as debug())
         *   - DBO_NOBUFFER: don't buffer results (inverse of bufferResults())
         *   - DBO_TRX: automatically start transactions
-        *   - DBO_DEFAULT: automatically sets DBO_TRX if not in command line mode
-        *       and removes it in command line mode
         *   - DBO_PERSISTENT: use persistant database connection
         * @return bool
         */
index ee918f3..50e08ca 100644 (file)
@@ -310,11 +310,11 @@ class DifferenceEngine extends ContextSource {
                                                                'undoafter' => $this->mOldid,
                                                                'undo' => $this->mNewid
                                                        ) ),
-                                                       'title' => Linker::titleAttrib( 'undo' )
+                                                       'title' => Linker::titleAttrib( 'undo' ),
                                                ),
                                                $this->msg( 'editundo' )->text()
                                        );
-                                       $revisionTools[] = $undoLink;
+                                       $revisionTools['mw-diff-undo'] = $undoLink;
                                }
                        }
 
@@ -387,8 +387,14 @@ class DifferenceEngine extends ContextSource {
                wfRunHooks( 'DiffRevisionTools', array( $this->mNewRev, &$revisionTools, $this->mOldRev ) );
                $formattedRevisionTools = array();
                // Put each one in parentheses (poor man's button)
-               foreach ( $revisionTools as $tool ) {
-                       $formattedRevisionTools[] = $this->msg( 'parentheses' )->rawParams( $tool )->escaped();
+               foreach ( $revisionTools as $key => $tool ) {
+                       $toolClass = is_string( $key ) ? $key : 'mw-diff-tool';
+                       $element = Html::rawElement(
+                               'span',
+                               array( 'class' => $toolClass ),
+                               $this->msg( 'parentheses' )->rawParams( $tool )->escaped()
+                       );
+                       $formattedRevisionTools[] = $element;
                }
                $newRevisionHeader = $this->getRevisionHeader( $this->mNewRev, 'complete' ) .
                        ' ' . implode( ' ', $formattedRevisionTools );
@@ -1052,8 +1058,13 @@ class DifferenceEngine extends ContextSource {
 
                        $key = $title->quickUserCan( 'edit', $user ) ? 'editold' : 'viewsourceold';
                        $msg = $this->msg( $key )->escaped();
-                       $header .= ' ' . $this->msg( 'parentheses' )->rawParams(
-                               Linker::linkKnown( $title, $msg, array(), $editQuery ) )->plain();
+                       $editLink = $this->msg( 'parentheses' )->rawParams(
+                               Linker::linkKnown( $title, $msg, array( ), $editQuery ) )->plain();
+                       $header .= ' ' . Html::rawElement(
+                               'span',
+                               array( 'class' => 'mw-diff-edit' ),
+                               $editLink
+                       );
                        if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
                                $header = Html::rawElement(
                                        'span',
index f797ef9..3094d55 100644 (file)
@@ -124,53 +124,55 @@ class WebInstallerOutput {
         * @return string
         */
        public function getCSS() {
-               // Horrible, horrible hack: the installer is currently hardcoded to use the Vector skin, so load
-               // it here. Include instead of require, as this will work without it, it will just look bad.
-               // We need the 'global' statement for $wgResourceModules because the Vector skin adds the
-               // definitions for its RL modules there that we use implicitly below.
-               // @codingStandardsIgnoreStart
-               global $wgResourceModules; // This is NOT UNUSED!
-               // @codingStandardsIgnoreEnd
                global $wgStyleDirectory;
-               include_once "$wgStyleDirectory/Vector/Vector.php";
 
                $moduleNames = array(
                        // See SkinTemplate::setupSkinUserCss
                        'mediawiki.legacy.shared',
                        // See Vector::setupSkinUserCss
                        'mediawiki.skinning.interface',
-                       'skins.vector.styles',
-
-                       'mediawiki.legacy.config',
                );
 
-               $css = '';
+               if ( file_exists( "$wgStyleDirectory/Vector/Vector.php" ) ) {
+                       // Force loading Vector skin if available as a fallback skin
+                       // for whatever ResourceLoader wants to have as the default.
+
+                       // Include instead of require, as this will work without it, it will just look bad.
+                       // We need the 'global' statement for $wgResourceModules because the Vector skin adds the
+                       // definitions for its RL modules there that we use implicitly below.
+
+                       // @codingStandardsIgnoreStart
+                       global $wgResourceModules; // This is NOT UNUSED!
+                       // @codingStandardsIgnoreEnd
+
+                       include_once "$wgStyleDirectory/Vector/Vector.php";
+
+                       $moduleNames[] = 'skins.vector.styles';
+               }
+
+               $moduleNames[] = 'mediawiki.legacy.config';
 
                $resourceLoader = new ResourceLoader();
                $rlContext = new ResourceLoaderContext( $resourceLoader, new FauxRequest( array(
                                'debug' => 'true',
                                'lang' => $this->getLanguageCode(),
                                'only' => 'styles',
-                               'skin' => 'vector',
                ) ) );
+
+               $styles = array();
                foreach ( $moduleNames as $moduleName ) {
                        /** @var ResourceLoaderFileModule $module */
                        $module = $resourceLoader->getModule( $moduleName );
-                       // One of the modules will be missing if Vector is unavailable
-                       if ( !$module ) {
-                               continue;
-                       }
 
                        // Based on: ResourceLoaderFileModule::getStyles (without the DB query)
-                       $styles = ResourceLoader::makeCombinedStyles( $module->readStyleFiles(
-                               $module->getStyleFiles( $rlContext ),
-                               $module->getFlip( $rlContext )
-                       ) );
-
-                       $css .= implode( "\n", $styles );
+                       $styles = array_merge( $styles, ResourceLoader::makeCombinedStyles(
+                               $module->readStyleFiles(
+                                       $module->getStyleFiles( $rlContext ),
+                                       $module->getFlip( $rlContext )
+                       ) ) );
                }
 
-               return $css;
+               return implode( "\n", $styles );
        }
 
        /**
@@ -271,8 +273,8 @@ class WebInstallerOutput {
 <?php echo Html::openElement( 'body', array( 'class' => $this->getDir() ) ) . "\n"; ?>
 <div id="mw-page-base"></div>
 <div id="mw-head-base"></div>
-<div id="content">
-<div id="bodyContent">
+<div id="content" class="mw-body">
+<div id="bodyContent" class="mw-body-content">
 
 <h1><?php $this->outputTitle(); ?></h1>
 <?php
index c2aaf64..297b870 100644 (file)
@@ -50,6 +50,7 @@
        "config-env-good": "Gwiriet eo bet an endro.\nGallout a rit staliañ MediaWiki.",
        "config-env-bad": "Gwiriet eo bet an endro.\nNe c'hallit ket staliañ MediaWiki.",
        "config-env-php": "Staliet eo PHP $1.",
+       "config-env-hhvm": "HHVM $1 zo staliet.",
        "config-unicode-using-utf8": "Oc'h implijout utf8_normalize.so gant Brion Vibber evit ar reolata Unicode.",
        "config-unicode-using-intl": "Oc'h implijout [http://pecl.php.net/intl an astenn PECL intl] evit ar reolata Unicode.",
        "config-unicode-pure-php-warning": "'''Diwallit''' : N'haller ket kaout an [http://pecl.php.net/intl intl PECL astenn] evit merañ reoladur Unicode, a zistro d'ar stumm gorrek emplementet e-PHP.\nMa lakait da dreiñ ul lec'hienn darempredet-stank e vo mat deoc'h lenn un tammig bihan diwar-benn se war [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization]. (e saozneg)",
        "config-db-web-help": "Diuzañ an anv implijer hag ar ger-tremen a vo implijet gant ar servijer web evit kevreañ ouzh ar servijer diaz roadennoù pa vez ar wiki o vont en-dro war ar pemdez.",
        "config-db-web-account-same": "Ober gant an hevelep kont hag an hini implijet evit ar staliañ",
        "config-db-web-create": "Krouiñ ar gont ma n'eus ket anezhi c'hoazh",
+       "config-db-web-no-create-privs": "Ar gont ho peus diferet evit ar staliañ n'he deus ket gwirioù a-walc'h evit krouiñ ur gont.\nRet eo d'ar gont diferet amañ bezañ anezhi dija.",
        "config-mysql-engine": "Lusker stokañ :",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
index eb98e32..a783cfe 100644 (file)
@@ -52,6 +52,7 @@
        "config-env-good": "Prostředí bylo zkontrolováno.\nMůžete nainstalovat MediaWiki.",
        "config-env-bad": "Prostředí bylo zkontrolováno.\nMediaWiki nelze nainstalovat.",
        "config-env-php": "Je nainstalováno PHP $1.",
+       "config-env-hhvm": "Je nainstalováno HHVM $1.",
        "config-unicode-using-utf8": "Pro normalizaci Unicode se používá utf8_normalize.so Briona Vibbera.",
        "config-unicode-using-intl": "Pro normalizaci Unicode se používá [http://pecl.php.net/intl PECL rozšíření intl].",
        "config-unicode-pure-php-warning": "'''Upozornění''': Není dostupné [http://pecl.php.net/intl PECL rozšíření intl] pro normalizaci Unicode, bude se využívat pomalá implementace v čistém PHP.\nPokud provozujete wiki s velkou návštěvností, měli byste si přečíst něco o [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizaci Unicode].",
index 135a32b..755c2a6 100644 (file)
@@ -24,7 +24,8 @@
                        "McDutchie",
                        "Miguel2706",
                        "Macofe",
-                       "AVIADOR"
+                       "AVIADOR",
+                       "FuzzyDice"
                ]
        },
        "config-desc": "El instalador de MediaWiki",
@@ -41,9 +42,9 @@
        "config-session-expired": "Tus datos de sesión parecen haber expirado.\nLas sesiones están configuradas por una duración de $1.\nPuedes incrementar esto configurando <code>session.gc_maxlifetime</code> en php.ini.\nReiniciar el proceso de instalación.",
        "config-no-session": "Se han perdido los datos de sesión.\nVerifica tu php.ini y comprueba que <code>session.save_path</code> está establecido en un directorio apropiado.",
        "config-your-language": "Tu idioma:",
-       "config-your-language-help": "Seleccionar un idioma a usar durante el proceso de instalación.",
+       "config-your-language-help": "Selecciona un idioma para usar durante el proceso de instalación.",
        "config-wiki-language": "Idioma del wiki:",
-       "config-wiki-language-help": "Seleccionar el idioma en el que el wiki será escrito predominantemente.",
+       "config-wiki-language-help": "Selecciona el idioma en el que se escribirá predominantemente el wiki.",
        "config-back": "← Atrás",
        "config-continue": "Continuar →",
        "config-page-language": "Idioma",
@@ -69,6 +70,7 @@
        "config-env-good": "El entorno ha sido comprobado.\nPuedes instalar MediaWiki.",
        "config-env-bad": "El entorno ha sido comprobado.\nNo puedes instalar MediaWiki.",
        "config-env-php": "PHP $1 está instalado.",
+       "config-env-hhvm": "HHVM $1 está instalado.",
        "config-unicode-using-utf8": "Usando utf8_normalize.so de Brion Vibber para la normalización Unicode.",
        "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-no-cache": "'''Advertencia:''' No pudo encontrarse [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].\nEl caché de objetos no está habilitado.",
        "config-mod-security": "''' Advertencia ''': Su servidor web tiene [http://modsecurity.org/ mod_security] habilitado. Si la configuración es incorrecta, puede causar problemas a MediaWiki u otro software que permita a los usuarios publicar contenido arbitrarios.\nConsulte la [http://modsecurity.org/documentation/ documentación de mod_security] o contacte con el soporte de su servidor (''host'') si encuentra errores aleatorios.",
        "config-diff3-bad": "GNU diff3 no se encuentra.",
-       "config-git": "Se encontró el ''software'' de control de versiones Git: <code>$1</code>.",
+       "config-git": "Se encontró el software de control de versiones Git: <code>$1</code>.",
        "config-git-bad": "No se encontró el software de control de versiones Git.",
        "config-imagemagick": "ImageMagick encontrado: <code>$1</code>.\nLa miniaturización de imágenes se habilitará si habilitas las cargas.",
        "config-gd": "Se ha encontrado una biblioteca de gráficos GD integrada.\nLa miniaturización de imágenes se habilitará si habilitas las subidas.",
        "config-no-scaling": "No se ha encontrado ninguma biblioteca GD o ImageMagik.\nSe inhabilitará la miniaturización de imágenes.",
-       "config-no-uri": "'''Error:''' No se pudo determinar el URI actual.\nSe interrumpió la instalación.",
+       "config-no-uri": "<strong>Error:</strong> no se pudo determinar el URI actual.\nSe interrumpió la instalación.",
        "config-no-cli-uri": "<strong>Aviso:</strong> No se especificó <code>--scriptpath</code>; se usa el valor predeterminado: <code>$1</code>.",
        "config-using-server": "Utilizando el nombre de servidor \"<nowiki>$1</nowiki>\".",
-       "config-using-uri": "Utilizando la dirección URL del servidor \"<nowiki>$1$2</nowiki>\".",
+       "config-using-uri": "Utilizando la URL del servidor \"<nowiki>$1$2</nowiki>\".",
        "config-uploads-not-safe": "'''Atención:''' Su directorio por defecto para las cargas, <code>$1</code>, es vulnerable a la ejecución de scripts arbitrarios.\nAunque MediaWiki comprueba todos los archivos cargados por si hubiese amenazas de seguridad, es altamente recomendable [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security cerrar esta vulnerabilidad de seguridad] antes de activar las cargas.",
        "config-no-cli-uploads-check": "'''Atención:''' Su directorio predeterminado para cargas (<code>$1</code>) no está comprobado para la vulnerabilidad\n de ejecución arbitraria de comandos script durante la instalación de CLI.",
        "config-brokenlibxml": "El sistema tiene una combinación de versiones de PHP y de libxml2 que es poco confiable y puede provocar corrupción oculta en los datos de MediaWiki y otras aplicaciones web.\nActualizar a PHP 5.2.9 o posterior y a libxml2 2.7.3 o posterior ([//bugs.php.net/bug.php?id=45996 bug reportado con PHP]).\nInstalación abortada.",
        "config-suhosin-max-value-length": "Suhosin está instalado y limita el parámetro <code>length</code> GET a $1 bytes.\nEl componente ResourceLoader (gestor de recursos) de MediaWiki trabajará en este límite, pero eso perjudicará el rendimiento.\nSi es posible, deberías establecer <code>suhosin.get.max_value_length</code> en el valor 1024 o superior en <code>php.ini</code> y establecer <code>$wgResourceLoaderMaxQueryLength</code> en el mismo valor en <code>php.ini</code>.",
-       "config-db-type": "Tipo de base de datos",
+       "config-db-type": "Tipo de base de datos:",
        "config-db-host": "Servidor de la base de datos:",
        "config-db-host-help": "Si su servidor de base de datos está en otro servidor, escriba el nombre del host o su dirección IP aquí.\nSi está utilizando alojamiento web compartido, su proveedor de alojamiento debería darle el nombre correcto del servidor de alojamiento (host) en su documentación.\nSi va a instalarlo en un servidor Windows y utiliza MySQL, el uso de \"localhost\" como nombre del servidor puede no funcionar. Si no es así, intente poner \"127.0.0.1\" como dirección IP local.\nSi utiliza PostgreSQL, deje este campo en blanco para conectarse a través de un socket de Unix.",
        "config-db-host-oracle": "TNS de la base de datos:",
        "config-db-host-oracle-help": "Introduzca un [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm nombre de conexión local] válido; un archivo tnsnames.ora debe ser visible para esta instalación.<br />Si está utilizando bibliotecas de cliente 10g o más recientes también puede utilizar el método de asignación de nombres [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
-       "config-db-wiki-settings": "Identifique este wiki",
-       "config-db-name": "Nombre de base de datos:",
+       "config-db-wiki-settings": "Identifica este wiki",
+       "config-db-name": "Nombre de la base de datos:",
        "config-db-name-help": "Elija un nombre que identifique su wiki.\nNo debe contener espacios.\n\nSi está utilizando alojamiento web compartido, su proveedor de alojamiento le dará un nombre específico de base de datos para que lo utilice, o bien le permitirá crear bases de datos a través de un panel de control.",
-       "config-db-name-oracle": "Esquema de base de datos:",
+       "config-db-name-oracle": "Esquema de la base de datos:",
        "config-db-account-oracle-warn": "Hay tres escenarios compatibles para la instalación de Oracle como base de datos back-end:\n\nSi desea crear una cuenta de base de datos como parte del proceso de instalación, por favor suministre una cuenta con función SYSDBA como cuenta de base de datos para la instalación y especifique las credenciales deseadas de la cuenta de acceso al web, de lo contrario puede crear manualmente la cuenta de acceso al web y suministrar sólo esa cuenta (si tiene los permisos necesarios para crear los objetos de esquema) o suministrar dos cuentas diferentes, una con privilegios de creación y otra con acceso restringido a la web\n\nLa secuencia de comandos (script) para crear una cuenta con los privilegios necesarios puede encontrarse en el directorio \"maintenance/oracle/\" de esta instalación. Tenga en cuenta que utilizando una cuenta restringida desactivará todas las capacidades de mantenimiento con la cuenta predeterminada.",
        "config-db-install-account": "Cuenta de usuario para instalación",
-       "config-db-username": "Nombre de usuario de base de datos:",
-       "config-db-password": "contraseña de base de datos:",
+       "config-db-username": "Nombre de usuario de la base de datos:",
+       "config-db-password": "Contraseña de la base de datos:",
        "config-db-password-empty": "Introduzca una contraseña para el nuevo usuario de base de datos:  $1.\nAunque es posible crear usuarios sin contraseña, esto no es seguro.",
        "config-db-username-empty": "Debe introducir un valor para \"{{int:config-db-username}}\"",
        "config-db-install-username": "Introduzca el nombre de usuario que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nEste no es el nombre de usuario de la cuenta de MediaWiki; Este es el nombre de usuario para la base de datos.",
        "config-db-install-password": "Introduzca la contraseña que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nEsta no es la contraseña para la cuenta de MediaWiki; esta es la contraseña para la base de datos.",
        "config-db-install-help": "Ingresar el nombre de usuario y la contraseña que será usada para conectar a la base de datos durante el proceso de instalación.",
        "config-db-account-lock": "Usar el mismo nombre de usuario y contraseña durante operación normal",
-       "config-db-wiki-account": "Usar cuenta para operación normal",
+       "config-db-wiki-account": "Cuenta de usuario para operación normal",
        "config-db-wiki-help": "Introduce el nombre de usuario y la contraseña que serán usados para acceder a la base de datos durante la operación normal del wiki.\nSi esta cuenta no existe y la cuenta de instalación tiene suficientes privilegios, se creará esta cuenta de usuario con los privilegios mínimos necesarios para la operación normal del wiki.",
-       "config-db-prefix": "Prefijo de tablas de base de datos:",
+       "config-db-prefix": "Prefijo de tablas de la base de datos:",
        "config-db-prefix-help": "Si necesita compartir una base de datos entre múltiples wikis, o entre MediaWiki y otra aplicación web, puede optar por agregar un prefijo a todos los nombres de tabla para evitar conflictos.\nNo utilice espacios.\n\nNormalmente se deja este campo vacío.",
        "config-db-charset": "Conjunto de caracteres de la base de datos",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 binario",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-charset-mysql4": "MySQL 4.0 retrocompatible UTF-8",
        "config-charset-help": "'''Atención:''' Si emplea '''backwards-compatible UTF-8''' en MySQL 4.1+ y posteriormente hace copia de seguridad de la base de datos con <code>mysqldump</code> , puede destruir todos los caracteres no-ASCII, ¡dañando irreversiblemente sus copias de seguridad!\n\nEn '''modo binario''', MediaWiki almacena texto UTF-8 en la base de datos en campos binarios.\nEsto es más eficiente que el modo UTF-8 de MySQL, y le permite utilizar la gama completa de caracteres Unicode.\nEn ''' modo UTF-8'' ', MySQL sabrá el juego de caracteres de sus datos y puede presentarlos y convertirlos apropiadamente,\npero no le permitirá almacenar caracteres por encima del [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plano multilingüe básico].",
-       "config-mysql-old": "Se necesita MySQL $1 o una versión más reciente. Tienes la versión $2.",
+       "config-mysql-old": "Se necesita MySQL $1 o posterior. Tienes $2.",
        "config-db-port": "Puerto de la base de datos:",
        "config-db-schema": "Esquema para MediaWiki",
        "config-db-schema-help": "Estos esquemas usualmente estarán bien.\nAltéralos sólo si tienes la seguridad de que necesitas hacerlo.",
        "config-upgrade-done": "Actualización completa.\n\nUsted puede ahora [ $1  empezar a usar su wiki].\n\nSi desea regenerar su archivo <code>LocalSettings.php</code> de archivo, haga clic en el botón de abajo.\nEsto '''no se recomienda''' a menos que esté teniendo problemas con su wiki.",
        "config-upgrade-done-no-regenerate": "Actualización completa.\n\nUsted puede ahora [$1  empezar a usar su wiki].",
        "config-regenerate": "Regenerar LocalSettings.php →",
-       "config-show-table-status": "<code>SHOW TABLE STATUS</code> ha fallado!",
+       "config-show-table-status": "¡Falló la consulta <code>SHOW TABLE STATUS</code>!",
        "config-unknown-collation": "'''Advertencia:''' La base de datos está utilizando una intercalación no reconocida.",
-       "config-db-web-account": "Cuenta de base de datos para acceso Web",
+       "config-db-web-account": "Cuenta de la base de datos para acceso web",
        "config-db-web-help": "Elige el usuario y contraseña que el servidor Web usará para conectarse al servidor de la base de datos durante el fincionamiento normal del wiki.",
        "config-db-web-account-same": "Utilizar la misma cuenta que en la instalación",
        "config-db-web-create": "Crear la cuenta si no existe",
        "config-mysql-binary": "Binario",
        "config-mysql-utf8": "UTF-8",
        "config-mysql-charset-help": "En '''modo binario''', MediaWiki almacena texto UTF-8 para la base de datos en campos binarios.\nEsto es más eficiente que el modo UTF-8 de MySQL y le permite utilizar la gama completa de caracteres Unicode.\n\nEn '''modo UTF-8''', MySQL sabrá qué conjunto de caracteres emplean sus datos y puede presentarlos y convertirlos adecuadamente, pero no le permitirá almacenar caracteres por encima del [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plano multilingüe básico].",
-       "config-mssql-auth": "Tipo de autentificación:",
+       "config-mssql-auth": "Tipo de autenticación:",
        "config-mssql-install-auth": "Seleccione el tipo de autenticación que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nSi selecciona \"{{int:config-mssql-windowsauth}}\", las credenciales de cualquier usuario de el servidor web que se está ejecutando van a ser utilizadas.",
        "config-mssql-web-auth": "Seleccione el tipo de autenticación que utilizará el servidor web para conectarse al servidor de base de datos, durante el funcionamiento normal de la wiki.\nSi selecciona \"{{int:config-mssql-windowsauth}}\", las credenciales del usuario que sea cual sea el servidor Web se ejecuta como será utilizado.",
        "config-mssql-sqlauth": "Autenticación de SQL Server",
        "config-site-name-blank": "Ingresar un nombre de sitio.",
        "config-project-namespace": "Espacio de nombre de proyecto:",
        "config-ns-generic": "Proyecto",
-       "config-ns-site-name": "Igual como el nombre del wiki: $1",
+       "config-ns-site-name": "Igual al nombre del wiki: $1",
        "config-ns-other": "Otro (especificar)",
        "config-ns-other-default": "MiWiki",
        "config-project-namespace-help": "Siguiendo el ejemplo de  Wikipedia, muchos wikis mantienen sus páginas de políticas separadas de sus páginas de contenido, en un \"'''espacio de nombres del proyecto'''\".\n\nTodos los títulos de página en este espacio de nombres comienzan con un determinado prefijo, que usted puede especificar aquí.\nTradicionalmente, este prefijo se deriva del nombre del wiki, pero no puede contener caracteres de puntuación como \"#\" o \":\".",
        "config-admin-box": "Cuenta de administrador",
        "config-admin-name": "Tu nombre de usuario:",
        "config-admin-password": "Contraseña:",
-       "config-admin-password-confirm": "Repita la contraseña:",
+       "config-admin-password-confirm": "Repite la contraseña:",
        "config-admin-help": "Escribe aquí el nombre de usuario que desees, como por ejemplo \"Pedro Bloggs\".\nEste es el nombre que usarás para entrar al wiki.",
        "config-admin-name-blank": "Introduce un nombre de usuario de administrador.",
        "config-admin-name-invalid": "El nombre de usuario especificado \"<nowiki>$1</nowiki>\" no es válido.\nEspecifique un nombre de usuario diferente.",
        "config-profile-fishbowl": "Sólo editores autorizados",
        "config-profile-private": "Wiki privado",
        "config-profile-help": "Los wikis funcionan mejor cuando dejas que los edite tanta gente como sea posible.\nEn MediaWiki, es fácil revisar los cambios recientes y revertir los daños realizados por usuarios malintencionados o novatos.\nSin embargo, muchos han encontrado que MediaWiki es útil para una amplia variedad de funciones, y a veces no es fácil convencer a todos de los beneficios de la forma wiki.\nPor lo tanto tienes la elección.\n\nEl modelo '''{{int:config-profile-wiki}}''' permite que cualquiera pueda editar, sin siquiera iniciar sesión.\nUn wiki con '''{{int:config-profile-no-anon}}''' ofrece rendición de cuentas adicional, pero puede disuadir a colaboradores.\n\nEl modelo '''{{int:config-profile-fishbowl}}''' permite editar a los usuarios autorizados, pero el público puede ver las páginas, incluyendo el historial.\nUn '''{{int:config-profile-private}}''' sólo permite ver páginas a los usuarios autorizados, el mismo grupo al que le está permitido editar.\n\nConfiguraciones más complejas de derechos de usuario están disponibles después de la instalación, consulte [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights esta entrada en el manual].",
-       "config-license": "Copyright and licencia:",
+       "config-license": "Derechos de autor y licencia:",
        "config-license-none": "Pie sin licencia",
-       "config-license-cc-by-sa": "Creative Commons Reconocimiento Compartir Igual",
-       "config-license-cc-by": "Creative Commons Reconocimiento",
-       "config-license-cc-by-nc-sa": "Creative Commons Reconocimiento Compartir Igual no comercial",
+       "config-license-cc-by-sa": "Creative Commons Atribución-CompartirIgual",
+       "config-license-cc-by": "Creative Commons Atribución",
+       "config-license-cc-by-nc-sa": "Creative Commons Atribución-NoComercial-CompartirIgual",
        "config-license-cc-0": "Creative Commons Zero (dominio público)",
        "config-license-gfdl": "Licencia de documentación libre de GNU 1.3 o posterior",
-       "config-license-pd": "Dominio Público",
+       "config-license-pd": "Dominio público",
        "config-license-cc-choose": "Selecciona una licencia personalizada de Creative Commons",
        "config-license-help": "Muchos wikis públicos ponen todas las contribuciones bajo una [http://freedomdefined.org/Definition licencia libre].\nEsto ayuda a crear un sentido de propiedad comunitaria y alienta la contribución a largo plazo.\nEsto no es generalmente necesario para un wiki privado o corporativo.\n\nSi deseas poder utilizar texto de Wikipedia, y deseas que Wikipedia pueda aceptar el texto copiado de tu wiki, debes elegir <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nWikipedia utilizaba anteriormente la licencia de documentación libre de GNU (GFDL).\nLa GFDL es una licencia válida, pero es difícil de entender.\nTambién es difícil reutilizar el contenido licenciado bajo la GFDL.",
        "config-email-settings": "Configuración de correo electrónico",
        "config-enable-email": "Activar el envío de correos electrónicos",
        "config-enable-email-help": "Si quieres que el correo electrónico funcione, la [http://www.php.net/manual/en/mail.configuration.php configuración PHP de correo electrónico] debe ser la correcta.\nSi no quieres la funcionalidad de correo electrónico, puedes desactivarla aquí.",
-       "config-email-user": "Habilitar correo electrónico de usuario a usuario",
+       "config-email-user": "Habilitar correo electrónico entre usuarios",
        "config-email-user-help": "Permitir que todos los usuarios intercambien correos electrónicos si lo han activado en sus preferencias.",
        "config-email-usertalk": "Activar notificaciones de páginas de discusión de usuarios",
        "config-email-usertalk-help": "Permitir a los usuarios recibir notificaciones de cambios en la página de discusión de usuario, si lo han activado en sus preferencias.",
        "config-install-user": "Creando el usuario de la base de datos",
        "config-install-user-alreadyexists": "El usuario \"$1\" ya existe",
        "config-install-user-create-failed": "La creación del usuario \"$1\" falló:  $2",
-       "config-install-user-grant-failed": "La concesión de permisos para el usuario \"$1\" ha fallado: $2",
+       "config-install-user-grant-failed": "La concesión de permisos al usuario \"$1\" falló: $2",
        "config-install-user-missing": "El usuario especificado \"$1\" no existe.",
        "config-install-user-missing-create": "El usuario especificado \"$1\" no existe.\nPor favor, haga clic en la casilla \"Crear cuenta\" que aparece a continuación si desea crearlo.",
        "config-install-tables": "Creando tablas",
        "config-install-interwiki-list": "No se pudo encontrar el archivo <code>interwiki.list</code>.",
        "config-install-interwiki-exists": "'''Advertencia''': La tabla de interwikis parece ya contener entradas.\nSe omitirá la lista predeterminada.",
        "config-install-stats": "Iniciando las estadísticas",
-       "config-install-keys": "Generación de claves secretas",
+       "config-install-keys": "Generando claves secretas",
        "config-insecure-keys": "''' Atención:'' '  {{PLURAL:$2|Una clave de seguridad generada|Las claves de seguridad generadas}} ($1) durante la instalación no  {{PLURAL:$2|es totalmente segura|son totalmente seguras}}. Considere {{PLURAL:$2| cambiarla|cambiarlas}} manualmente.",
-       "config-install-sysop": "Creando cuenta de usuario del administrador",
+       "config-install-sysop": "Creando la cuenta de usuario del administrador",
        "config-install-subscribe-fail": "No se ha podido suscribir a mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL no está instalado y <code>allow_url_fopen</code> no está disponible.",
        "config-install-mainpage": "Creando página principal con contenido predeterminado",
        "config-install-mainpage-failed": "No se pudo insertar la página principal: $1",
        "config-install-done": "<strong>¡Felicidades!</strong>\nHas instalado MediaWiki correctamente.\n\nEl instalador ha generado un  archivo <code>LocalSettings.php</code>.\nEste contiene toda su configuración.\n\nDeberás descargarlo y ponerlo en la base de la instalación de wiki (el mismo directorio que index.php). La descarga debería haber comenzado automáticamente.\n\nSi no comenzó la descarga, o si se ha cancelado, puedes reiniciar la descarga haciendo clic en el siguiente enlace:\n\n$3\n\n<strong>Nota</strong>: Si no haces esto ahora, este archivo de configuración generado no estará disponible más tarde si sales de la instalación sin descargarlo.\n\nCuando lo hayas hecho, podrás <strong>[$2  entrar en tu wiki]</strong>.",
        "config-download-localsettings": "Descargar archivo <code>LocalSettings.php</code>",
-       "config-help": "Ayuda",
-       "config-help-tooltip": "Haz clic para ampliar",
+       "config-help": "ayuda",
+       "config-help-tooltip": "haz clic para ampliar",
        "config-nofile": "El archivo \"$1\" no se pudo encontrar. ¿Se ha eliminado?",
        "config-extension-link": "¿Sabías que tu wiki admite [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nPuedes navegar por las [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category categorías] o visitar el [//www.mediawiki.org/wiki/Extension_Matrix centro de extensiones] para ver una lista completa.",
-       "mainpagetext": "'''MediaWiki ha sido instalado con éxito.'''",
+       "mainpagetext": "<strong>MediaWiki se ha instalado con éxito.<strong>",
        "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Help:Contents/es guía del usuario] para obtener información sobre el uso del software wiki.\n\n== Primeros pasos ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [//www.mediawiki.org/wiki/Manual:FAQ/es Preguntas frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de publicación de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducir MediaWiki en tu idioma]"
 }
index d4fa13b..02ffd0d 100644 (file)
@@ -20,7 +20,7 @@
        "config-upgrade-key-missing": "نصب موجود مدیاویکی شناسایی شده‌است.\nبرای بروزرسانی این نصب، لطفاً خط زیر را در آخر کد \nقرار دادن به نصب ارتقاء داده شده، به خط زیر لطفاً در پایین خود را <code>LocalSettings.php</code> قرار دهید:\n\n$1",
        "config-localsettings-incomplete": "وجود <code>LocalSettings.php</code> به نظر ناقص می‌رسد.\nمتغیر $1 تنظیم نشده‌است.\nبرای اینکه این متغیر تنظیم شود لطفاً <code>LocalSettings.php</code> را تغییر دهید، و \"{{int:Config-continue}}\" را کلیک کنید.",
        "config-localsettings-connection-error": "هنگام اتصال به پایگاه اطلاعاتی که ازتنظیمات مشخص شده در<code>LocalSettings.php</code> استفاده می‌کند، خطایی رخ داد. لطفاً این تنظیمات را نصب کنید و دوباره تلاش کنید.\n$1",
-       "config-session-error": "خطا در شروع جلسه $1",
+       "config-session-error": "خطا در شروع جلسه: $1",
        "config-session-expired": "به نظر می‌رسد اطلاعات جلسهٔ شما منقضی شده‌است.\nجلسات برای مادام العمر $1 پیکربندی شده‌اند.\nشما می‌توانید این پیکربندی را با تنظیم <code>session.gc_maxlifetime</code> در php.ini افزایش دهید.\nروند نصب را دوباره شروع کنید.",
        "config-no-session": "اطلاعات دورهٔ شما از دست رفته‌ است!\nphp.ini خود را بررسی کنید و مطمئن شوید <code>session.save_path</code> برای یک فهرست مناسب تنظیم شده‌است.",
        "config-your-language": "زبان شما:",
        "config-page-language": "زبان",
        "config-page-welcome": "به مدیاویکی خوش آمدید!",
        "config-page-dbconnect": "اتصال به پایگاه داده",
-       "config-page-upgrade": "نصب موجود را ارتقاء دهید.",
-       "config-page-dbsettings": "تÙ\86ظÛ\8cÙ\85ات Ù¾Ø§Û\8cگاÙ\87 Ø§Ø·Ù\84اعاتÛ\8c",
+       "config-page-upgrade": "ارتقای نصب موجود",
+       "config-page-dbsettings": "تÙ\86ظÛ\8cÙ\85ات Ù¾Ø§Û\8cگاÙ\87 Ø¯Ø§Ø¯Ù\87",
        "config-page-name": "نام",
        "config-page-options": "گزینه‌ها",
        "config-page-install": "نصب",
        "config-page-complete": "کامل!",
-       "config-page-restart": "نصب را دوباره شروع کنید",
+       "config-page-restart": "راه‌اندازی دوباره نصب",
        "config-page-readme": "مرا بخوان",
        "config-page-releasenotes": "یادداشت‌های انتشار",
        "config-page-copying": "تکثیر",
-       "config-page-upgradedoc": "ارتقا",
+       "config-page-upgradedoc": "ارتقاء",
        "config-page-existingwiki": "ویکی موجود",
        "config-help-restart": "آیا می‌خواهید همهٔ اطلاعات ذخیره شده‌ای که وارد کرده‌اید را پاک کنید و دوباره روند نصب را شروع کنید؟",
-       "config-restart": "بله ، آن دوباره راه اندازی کن",
+       "config-restart": "بله، دوباره راه‌اندازی کن",
        "config-welcome": "===بررسی‌های محیطی===\nبرای فهمیدن اینکه این محیط برای نصب مدیاویکی مناسب است، اکنون بررسی‌های اساسی انجام خواهد‌شد.\nاگر به دنبال پشتیبانی در چگونگی تکمیل نصب هستید،به یاد داشته باشید این اطلاعات را بگنجانید.",
        "config-copyright": "===حق چاپ و شرایط===\n$1\nاین برنامه،نرم‌افزاری آزاد است;شما می‌توانید این برنامه را دوباره توزیع کنید و/یا تحت شرایط مجوز عمومی کلی جی‌ان‌یو که توسط بنیاد نرم‌افزار آزاد منتشر شده،اصلاح کنید;یا نسخهٔ 2 مجوز، یا (به انتخاب خود) هر نسخهٔ پس از این.\nاین برنامه به امید اینکه مفید واقع‌ شود توزیع شده‌است،اما '''بدون هیچ ضمانتی'''; حتی بدون اشارهٔ ضمانتی از '''قابلیت عرضه''' یا ''' صلاحیت برای یک هدف خاص'''.\nبرای جزئیات بیشتر مجوز عمومی کلی جی‌ان‌یو را مشاهده کنید.\nشما باید <doclink href=Copying> یک چاپ ازمجوز عمومی کلی </doclink> همراه این برنامه دریافت کنید; اگر دریافت نکردید،به بنیاد نرم‌افزار آزاد بنویسید،Inc.،خیابان فرانکلین۵۱،طبقه پنجم،بوستون، MA۰۲۱۱۰-۱۳۰،آمریکا،یا [http://www.gnu.org/copyleft/gpl.html read it online].",
        "config-sidebar": "* [//www.mediawiki.org صفحهٔ اصلی مدیاویکی]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents راهنمای کاربر]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents راهنمای مدیر]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ پرسش‌های رایج]\n----\n* <doclink href=Readme>مرا بخوان</doclink>\n* <doclink href=ReleaseNotes>یادداشت‌های انتشار</doclink>\n* <doclink href=Copying>نسخه برداری</doclink>\n* <doclink href=UpgradeDoc>ارتقا</doclink>",
@@ -80,8 +80,8 @@
        "config-no-cache": "'''هشدار:''' [http://www.php.net/apc APC],[http://xcache.lighttpd.net/ XCache] یا [http://www.iis.net/download/WinCacheForPhp WinCache] را نتوانست پیدا کند.\nذخیره شی فعال نیست.",
        "config-mod-security": "'''هشدار:''' وب سرور شما [http://modsecurity.org/ mod_security] فعال است.اگر اشتباه پیکربندی شده‌‌ باشد،می تواند باعث ایجاد مشکلاتی برای مدیاویکی یا دیگر نرم‌افزاری شود که به کاربران اجازه می‌دهد پیام دلخواه ارسال کنند.\nبه [http://modsecurity.org/documentation/ mod_security documentation] مراجعه کنید یا اگر با خطاهای اتفاقی مواجه شدید با پشتیبانی میزبان خود در تماس باشید.",
        "config-diff3-bad": "جی‌ان‌یو دیف۳ پیدا نشد.",
-       "config-git": "نسخهٔ کنترل نرم‌افزار جیت پیدا شد:<code>$1</code>.",
-       "config-git-bad": "نسخه نرم‌افزار کنترل جیت پیدا نشد.",
+       "config-git": "کنترل نسخهٔ نرم‌افزار گیت پیدا شد: <code>$1</code>.",
+       "config-git-bad": "کنترل نسخهٔ نرم‌افزار گیت پیدا نشد.",
        "config-imagemagick": "ایمیج‌مجیک پیدا شد: <code>$1</code>.\nاگر ارسال‌ها را فعال کنید،تصویر کوچک فعال خواهد‌شد.",
        "config-gd": "گرافیک‌های جی‌دی ساخته‌‌ شده در کتابخانه پیدا شد.\nاگر ارسال‌ها را فعال کنید تصویر کوچک فعال خواهد‌شد.",
        "config-no-scaling": "کتابخانهٔ جی‌دی یا ایمیج‌مجیک نتوانست پیدا شود.\nتصویر کوچک غیر‌فعال خواهد‌شد.",
        "config-db-install-account": "حساب کاربری برای نصب",
        "config-db-username": "نام کاربری پایگاه اطلاعات:",
        "config-db-password": "گذرواژه پایگاه داده‌ها:",
-       "config-db-password-empty": "Ù\84Ø·Ù\81اÙ\8b Û\8cÚ© Ø±Ù\85ز Ø¹Ø¨Ù\88ر Ø¨Ø±Ø§Û\8c Ú©Ø§Ø±Ø¨Ø± Ø¬Ø¯Û\8cد پایگاه اطلا‌عاتی وارد کنید: $1\nدر صورتی که ممکن است کاربران بدون رمز عبور به وجود آیند،امن نیست.",
+       "config-db-password-empty": "Ù\84Ø·Ù\81اÙ\8b Û\8cÚ© Ø±Ù\85ز Ø¹Ø¨Ù\88ر Ø¨Ø±Ø§Û\8c Ú©Ø§Ø±Ø¨Ø± ØªØ§Ø²Ù\87 پایگاه اطلا‌عاتی وارد کنید: $1\nدر صورتی که ممکن است کاربران بدون رمز عبور به وجود آیند،امن نیست.",
        "config-db-username-empty": "شما باید یک مقدار برای \"نام کاربری {{int:config-db-username}}\" وارد کنید",
        "config-db-install-username": "نام کاربری را وارد کنید که برای اتصال به پایگاه اطلاعاتی در طول روند نصب استفاده خواهد‌شد.\nاین نام کاربری حساب مدیاویکی نیست; نام کاربری برای پایگاه اطلاعاتی شما است.",
        "config-db-install-password": "رمز عبوری را وارد کنید که برای اتصال به پایگاه اطلاعاتی در طول روند نصب استفاده خواهد‌شد.\nاین رمز عبور برای حساب مدیاویکی نیست;رمز عبور برای پایگاه اطلاعاتی شما است.",
index 908d282..faaf335 100644 (file)
@@ -55,6 +55,7 @@
        "config-env-good": "L'ambiente è stato controllato.\nÈ possibile installare MediaWiki.",
        "config-env-bad": "L'ambiente è stato controllato.\nNon è possibile installare MediaWiki.",
        "config-env-php": "PHP $1 è installato.",
+       "config-env-hhvm": "HHVM $1 è installato.",
        "config-unicode-using-utf8": "Usa Brion Vibber's utf8_normalize.so per la normalizzazione Unicode.",
        "config-unicode-using-intl": "Usa [http://pecl.php.net/intl l'estensione PECL intl] per la normalizzazione Unicode.",
        "config-unicode-pure-php-warning": "'''Attenzione:''' [http://pecl.php.net/intl l'estensione PECL intl] non è disponibile per gestire la normalizzazione Unicode, così si usa la lenta implementazione in puro PHP.\nSe esegui un sito ad alto traffico, dovresti leggere alcune considerazioni sulla [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizzazione Unicode].",
        "config-admin-name-invalid": "Il nome utente specificato \"<nowiki>$1</nowiki>\" non è valido.\nSpecificare un nome utente diverso.",
        "config-admin-password-blank": "Inserisci una password per l'account di amministratore.",
        "config-admin-password-mismatch": "Le password inserite non coincidono tra loro.",
-       "config-admin-email": "Indirizzo e-mail:",
+       "config-admin-email": "Indirizzo email:",
        "config-admin-email-help": "Inserisci qui un indirizzo email per poter ricevere email dagli altri utenti del wiki, reimpostare la tua password, ed essere informato delle modifiche apportate alle pagine tuoi osservati speciali. Se non ti interessa, puoi lasciare vuoto questo campo.",
        "config-admin-error-user": "Errore interno durante la creazione di un amministratore con il nome \"<nowiki>$1</nowiki>\".",
        "config-admin-error-password": "Errore interno durante l'impostazione di una password per amministratore \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
index 39ebf87..21fcb9d 100644 (file)
@@ -58,6 +58,7 @@
        "config-env-good": "環境を確認しました。\nMediaWiki をインストールできます。",
        "config-env-bad": "環境を確認しました。\nMediaWiki のインストールはできません。",
        "config-env-php": "PHP $1がインストールされています。",
+       "config-env-hhvm": "HHVM $1 がインストールされています。",
        "config-unicode-using-utf8": "Unicode正規化に、Brion Vibberのutf8_normalize.soを使用。",
        "config-unicode-using-intl": "Unicode正規化に[http://pecl.php.net/intl intl PECL 拡張機能]を使用。",
        "config-unicode-pure-php-warning": "<strong>警告:</strong> Unicode 正規化の処理に [http://pecl.php.net/intl intl PECL 拡張機能]を利用できないため、処理が遅いピュア PHP の実装を代わりに使用しています。\n高トラフィックのサイトを運営する場合は、[//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode 正規化]をお読みください。",
index 030e0c1..4d73ca0 100644 (file)
@@ -44,6 +44,7 @@
        "config-env-good": "Den Environement gouf nogekuckt.\nDir kënnt MediaWiki installéieren.",
        "config-env-bad": "Den Environnement gouf iwwerpréift.\nDir kënnt MediWiki net installéieren.",
        "config-env-php": "PHP $1 ass installéiert.",
+       "config-env-hhvm": "HHVM $1 ass installéiert.",
        "config-unicode-using-utf8": "Fir d'Unicode-Normalisatioun gëtt dem Brion Vibber säin <code>utf8_normalize.so</code> benotzt.",
        "config-no-db": "Et konnt kee passenden Datebank-Driver fonnt ginn! Dir musst een Datebank-Driver fir PHP installéieren.\nDës Datebank-Type ginn ënnerstëtzt: $1.\n\nWann Dir PHP selwer compiléiert hutt, da rekonfiguréiert en mat dem ageschalten Datebank-Client, zum Beispill an deem Dir <code>./configure --with-mysql</code> benotzt.\nWann Dir PHP vun engem Debian oder Ubuntu Package aus installéiert hutt, da musst Dir och den php5-mysql Modul installéieren.",
        "config-outdated-sqlite": "'''Warnung:''' SQLite $1 ass installéiert. Allerdengs brauch MediaWiki SQLite $2 oder méi nei. SQLite ass dofir net disponibel.",
index 0a84d87..262a837 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Chrisportelli"
+                       "Chrisportelli",
+                       "Leli Forte"
                ]
        },
        "config-title": "Installazzjoni ta' MediaWiki $1",
@@ -30,6 +31,7 @@
        "config-page-existingwiki": "Wiki eżistenti",
        "config-restart": "Iva, erġa' ibda",
        "config-env-php": "PHP $1 huwa installat.",
+       "config-env-hhvm": "HHVM $1 hu installat.",
        "config-db-wiki-settings": "Identifika din il-wiki",
        "config-db-name": "Isem tad-databażi:",
        "config-db-install-account": "Kont tal-utent għall-installazzjoni",
        "config-site-name": "Isem tal-wiki:",
        "config-site-name-help": "Dan se jidher fil-barra tat-titlu tal-browżer u f'diversi postijiet oħra.",
        "config-site-name-blank": "Daħħal isem tas-sit.",
-       "config-project-namespace": "Spazju tal-isem tal-proġett:",
+       "config-project-namespace": "Spazju tal-ismijiet tal-proġett:",
        "config-ns-generic": "Proġett",
        "config-ns-site-name": "L-istess bħall-isem tal-wiki: $1",
        "config-ns-other": "Oħrajn (speċifika)",
        "config-ns-other-default": "MyWiki",
-       "config-ns-invalid": "L-ispazju speċifikat \"<nowiki>$1</nowiki>\" huwa ħażin.\nSpeċifika spazju tal-isem tal-proġett differenti.",
-       "config-ns-conflict": "L-ispazju speċifikat \"<nowiki>$1</nowiki>\" joħloq kunflitt ma' spazju tal-isem ieħor tal-MediaWiki.\nSpeċifika spazju tal-isem tal-proġett differenti.",
+       "config-ns-invalid": "L-ispazju speċifikat \"<nowiki>$1</nowiki>\" huwa ħażin.\nSpeċifika spazju tal-ismijiet ta' proġett differenti.",
+       "config-ns-conflict": "L-ispazju speċifikat \"<nowiki>$1</nowiki>\" joħloq kunflitt ma' spazju tal-ismijiet tal-MediaWiki predeterminat.\nSpeċifika spazju tal-ismijiet ta' proġett differenti.",
        "config-admin-box": "Kont tal-amministratur",
        "config-admin-name": "Ismek:",
        "config-admin-password": "Password:",
index 93ddfa4..f3cf645 100644 (file)
@@ -50,6 +50,7 @@
        "config-env-good": "Miljøet har blitt sjekket.\nDu kan installere MediaWiki.",
        "config-env-bad": "Miljøet har blitt sjekket.\nDu kan installere MediaWiki.",
        "config-env-php": "PHP $1 er innstallert.",
+       "config-env-hhvm": "HHVM $1 er installert.",
        "config-unicode-using-utf8": "Bruker Brion Vibbers utf8_normalize.so for Unicode-normalisering.",
        "config-unicode-using-intl": "Bruker [http://pecl.php.net/intl intl PECL-utvidelsen] for Unicode-normalisering.",
        "config-unicode-pure-php-warning": "'''Advarsel''': [http://pecl.php.net/intl intl PECL-utvidelsen] er ikke tilgjengelig for å håndtere Unicode-normaliseringen, faller tilbake til en langsommere ren-PHP-implementasjon.\nOm du kjører et nettsted med høy trafikk bør du lese litt om [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-normalisering].",
@@ -58,6 +59,7 @@
        "config-outdated-sqlite": "'''Advarsel''': Du har SQLite $1, som er en eldre versjon enn minimumskravet SQLite $2. SQLite vil ikke være tilgjengelig.",
        "config-no-fts3": "'''Advarsel''': SQLite er kompilert uten [//sqlite.org/fts3.html FTS3-modulen], søkefunksjoner vil ikke være tilgjengelig på dette bakstykket.",
        "config-register-globals-error": "<strong>Feil: PHPs <code>[http://php.net/register_globals register_globals]</code>-valg er aktivt.\nDet må deaktiveres for å kunne fortsette med installeringen.</strong>\nSe [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] for å få hjelp til å gjøre dette.",
+       "config-magic-quotes-gpc": "<strong>Fatalt: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] er aktiv!</strong>\nDette valget kan ødelegge inndata på en uforutsigelig måte.\nDu kan ikke installere eller bruke MediaWiki uten at denne valgmuligheten er slått av.",
        "config-magic-quotes-runtime": "'''Kritisk: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] er aktiv!'''\nDette alternativet ødelegger inndata på en uforutsigbar måte.\nDu kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
        "config-magic-quotes-sybase": "'''Kritisk: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] er aktiv!'''\nDette alternativet ødelegger inndata på en uforutsigbar måte.\nDu kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
        "config-mbstring": "'''Kritisk: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] er aktiv!'''\nDette alternativet fører til feil og kan ødelegge data på en uforutsigbar måte.\nDu kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
@@ -68,6 +70,7 @@
        "config-memory-raised": "PHPs <code>memory_limit</code> er $1, økt til $2.",
        "config-memory-bad": "'''Advarsel:''' PHPs <code>memory_limit</code> er $1.\nDette er sannsynligvis for lavt.\nInstallasjonen kan mislykkes!",
        "config-ctype": "'''Fatal feil''': PHP må kompileres med støtte for [http://www.php.net/manual/en/ctype.installation.php Ctype-utvidelsen].",
+       "config-iconv": "<strong>Kritisk:</strong> PHP må kompileres med støtte for [http://www.php.net/manual/en/iconv.installation.php iconv-utvidelsen].",
        "config-json": "'''Alvorlig:''' PHP ble kompilert uten JSON-støtte.\nDu må installere enten PHP JSON-utvidelsen eller [http://pecl.php.net/package/jsonc PECL jsonc]-utvidelsen før du installere MediaWiki.\n* PHP-utvidelsen inngår i Red Hat Enterprise Linux (CentOS) 5 and 6, men må aktiveres i <code>/etc/php.ini</code> eller <code>/etc/php.d/json.ini</code>.\n* Noen Linux-distribusjoner sluppet etter mai 2013 har ikke med PHP-utvidelsen, men har i stedet med PECL-utvidelsen <code>php5-json</code> eller <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] er innstallert",
        "config-apc": "[http://www.php.net/apc APC] er innstallert",
index e4bcb6e..372058f 100644 (file)
@@ -37,7 +37,7 @@
        "config-env-good": "L’environament es estat verificat.\nPodètz installar MediaWiki.",
        "config-env-bad": "L’environament es estat verificat.\nPodètz pas installar MediaWiki.",
        "config-env-php": "PHP $1 es installat.",
-       "config-env-php-toolow": "PHP $1 es installat.\nPasmens, MediaWiki requerís PHP $2 o superior.",
+       "config-env-hhvm": "HHVM $1 es installat.",
        "config-unicode-using-utf8": "Utilizacion de utf8_normalize.so per Brion Vibber per la normalizacion Unicode.",
        "config-unicode-using-intl": "Utilizacion de [http://pecl.php.net/intl l'extension PECL intl] per la normalizacion Unicode.",
        "config-memory-raised": "Lo paramètre <code>memory_limit</code> de PHP èra a $1, portat a $2.",
        "config-cache-options": "Paramètres per la mesa en escondedor dels objèctes :",
        "config-memcached-servers": "servidors per Memcached :",
        "config-extensions": "Extensions",
+       "config-skins": "Abilhatges",
+       "config-skins-use-as-default": "Utilizar aqueste abilhatge per defaut",
        "config-install-step-done": "fach",
        "config-install-step-failed": "fracàs",
        "config-install-extensions": "Inclusion de las extensions",
        "config-install-database": "Creacion de la banca de donadas",
        "config-install-schema": "Creacion d'esquèma",
+       "config-install-pg-schema-not-exist": "L'esquèma PostgreSQL existís pas",
        "config-install-pg-commit": "Validacion de las modificacions",
        "config-install-pg-plpgsql": "Verificacion del lengatge PL/pgSQL",
        "config-install-user": "Creacion d'un utilizaire de la banca de donadas",
+       "config-install-user-alreadyexists": "L'utilizaire « $1 » existís ja.",
+       "config-install-user-create-failed": "Fracàs al moment de la creacion de l'utilizaire « $1 » : $2",
+       "config-install-user-missing": "L'utilizaire «$1» existís pas.",
        "config-install-tables": "Creacion de las taulas",
        "config-install-stats": "Inicializacion de las estatisticas",
+       "config-install-keys": "Generacion de la clau secreta",
+       "config-install-updates": "Empachar l’execucion de las mesas a jorn inutilas",
        "config-install-sysop": "Creacion del compte administrator",
        "config-install-mainpage-failed": "Impossible d’inserir la pagina principala : $1",
        "config-download-localsettings": "Telecargar <code>LocalSettings.php</code>",
        "config-help": "ajuda",
+       "config-help-tooltip": "clicar per agrandir",
        "mainpagetext": "'''MediaWiki es estat installat amb succès.'''",
        "mainpagedocfooter": "Consultatz lo [//meta.wikimedia.org/wiki/Help:Contents/fr Guida de l'utilizaire] per mai d'entresenhas sus l'utilizacion d'aqueste logicial de wiki.\n\n== Per començar ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista dels paramètres de configuracion]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/oc FAQ MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussions de las distribucions de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Adaptatz MediaWiki dins vòstra lenga]"
 }
index 0c48ffa..2e7e023 100644 (file)
@@ -62,6 +62,7 @@
        "config-env-good": "Środowisko oprogramowania zostało sprawdzone.\nMożesz teraz zainstalować MediaWiki.",
        "config-env-bad": "Środowisko oprogramowania zostało sprawdzone.\nNie możesz zainstalować MediaWiki.",
        "config-env-php": "Zainstalowane jest PHP w wersji $1.",
+       "config-env-hhvm": "Zainstalowany jest HHVM $1.",
        "config-unicode-using-utf8": "Korzystanie z normalizacji Unicode utf8_normalize.so napisanej przez Brion Vibbera.",
        "config-unicode-using-intl": "Korzystanie z [http://pecl.php.net/intl rozszerzenia intl PECL] do normalizacji Unicode.",
        "config-unicode-pure-php-warning": "'''Uwaga!''' [http://pecl.php.net/intl Rozszerzenie intl PECL] do obsługi normalizacji Unicode nie jest dostępne. Użyta zostanie mało wydajna zwykła implementacja w PHP.\nJeśli prowadzisz stronę o dużym natężeniu ruchu, powinieneś zapoznać się z informacjami o [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizacji Unicode].",
        "config-install-stats": "Inicjowanie statystyki",
        "config-install-keys": "Generowanie tajnych kluczy",
        "config-insecure-keys": "'''Ostrzeżenie:''' {{PLURAL:$2|Klucz bezpieczeństwa|Klucze bezpieczeństwa|Klucze bezpieczeństwa}} ($1) utworzone podczas instalacji {{PLURAL:$2|utworzony podczas instalacji nie jest|utworzone podczas instalacji nie są|utworzone podczas instalacji nie są}} w pełni bezpieczne. Być może warto wygenerować {{PLURAL:$2|własny klucz|własne klucze|własne klucze}}.",
+       "config-install-updates": "Zapobieganie uruchamianiu niepotrzebnych aktualizacji",
        "config-install-sysop": "Tworzenie konta administratora",
        "config-install-subscribe-fail": "Nie można zapisać na listę „mediawiki-announce“ – $1",
        "config-install-subscribe-notpossible": "cURL nie jest zainstalowany, więc <code>allow_url_fopen</code> nie jest dostępne.",
index ccd88e8..b8a36be 100644 (file)
@@ -62,6 +62,7 @@
        "config-env-good": "Проверка внешней среды была успешно проведена.\nВы можете установить MediaWiki.",
        "config-env-bad": "Была проведена проверка внешней среды.\nВы не можете установить MediaWiki.",
        "config-env-php": "Установленная версия PHP: $1.",
+       "config-env-hhvm": "HHVM $1 установлена.",
        "config-unicode-using-utf8": "Использовать Brion Vibber utf8_normalize.so для нормализации Юникода.",
        "config-unicode-using-intl": "Будет использовано [http://pecl.php.net/intl расширение «intl» для PECL] для нормализации Юникода.",
        "config-unicode-pure-php-warning": "'''Внимание!''': [http://pecl.php.net/intl расширение intl из PECL] недоступно для нормализации Юникода, будет использоваться медленная реализация на чистом PHP.\nЕсли ваш сайт работает под высокой нагрузкой, вам следует больше узнать о [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations нормализации Юникода].",
index a4b64bc..9e2833e 100644 (file)
@@ -66,6 +66,7 @@
        "config-env-good": "环境检查已经完成。您可以安装MediaWiki。",
        "config-env-bad": "环境检查已经完成。您不能安装MediaWiki。",
        "config-env-php": "PHP $1已安装。",
+       "config-env-hhvm": "HHVM $1已安装。",
        "config-unicode-using-utf8": "使用Brion Vibber的utf8_normalize.so实现Unicode正常化。",
        "config-unicode-using-intl": "使用[http://pecl.php.net/intl intl PECL扩展程序]标准化Unicode。",
        "config-unicode-pure-php-warning": "<strong>警告:</strong>因为尚未安装 [http://pecl.php.net/intl intl PECL 扩展]以处理 Unicode 正常化,故只能退而采用运行较慢的纯 PHP 实现的方法。\n如果您运行着一个高流量的站点,请参阅 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode 正常化]一文。",
index cb6cefb..c5b5a4c 100644 (file)
@@ -58,6 +58,7 @@
        "config-env-good": "環境檢查已完成。\n您可以安裝 MediaWiki。",
        "config-env-bad": "環境檢查已完成。\n您無法安裝 MediaWiki。",
        "config-env-php": "PHP $1 已安裝。",
+       "config-env-hhvm": "HHVM $1 已安裝。",
        "config-unicode-using-utf8": "使用 Brion Vibber 的 utf8_normalize.so 做 Unicode 正規化。",
        "config-unicode-using-intl": "使用 [http://pecl.php.net/intl intl PECL 擴充套件] 做 Unicode 正規化。",
        "config-unicode-pure-php-warning": "<strong>警告:</strong> 無法使用 [http://pecl.php.net/intl intl PECL 擴充套件] 處理 Unicode 正規化,故回退使用純 PHP 實作的正規化程式,此方式處理速度較緩慢。\n\n如果您的網站瀏覽人次很高,您應先閱讀 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/zh Unicode 正規化]。",
        "config-sqlite-cant-create-db": "無法建立資料庫檔案 <code>$1</code>。",
        "config-sqlite-fts3-downgrade": "PHP 不支援 FTS3,正在降級資料表。",
        "config-can-upgrade": "在資料庫中找到 MediaWiki 的資料表。\n要升級至 MediaWiki $1,請點選 <strong>繼續</strong>。",
-       "config-upgrade-done": "升級完成。\n\n現在您可以 [$1 開始使用您的 Wiki] 了。\n\n如果您需要重新產生 <code>LocalSettings.php</code> 檔案,請點下方按鈕。\n除非您的 Wiki 出現了問題,否則我們 <strong>不建議</strong> 您執行此操作。",
+       "config-upgrade-done": "升級完成。\n\n現在您可以 [$1 開始使用您的 Wiki] 了。\n\n如果您需要重新產生 <code>LocalSettings.php</code> 檔案,請點下方按鈕。\n除非您的 Wiki 出現了問題,否則我們 <strong>不建議</strong> 您執行此操作。",
        "config-upgrade-done-no-regenerate": "升級完成。\n\n現在您可以 [$1 開始使用您的 Wiki] 了。",
        "config-regenerate": "重新產生 LocalSettings.php →",
        "config-show-table-status": "<code>SHOW TABLE STATUS</code> 查詢失敗!",
        "config-email-usertalk": "開啟使用者討論頁面通知",
        "config-email-usertalk-help": "若使用者在個人偏好開啟了此功能,則可收到使用者討論頁面被修改的通知。",
        "config-email-watchlist": "開啟監視清單通知",
-       "config-email-watchlist-help": "若使用者在個人偏好開啟了此功能,允許使用者收到與其監視列表有關的通知。",
+       "config-email-watchlist-help": "若使用者在個人偏好開啟了此功能,允許使用者收到與其監視清單有關的通知。",
        "config-email-auth": "開啟電子郵件身份認證",
        "config-email-auth-help": "若開啟此選項,使用者不論設定或者更改電子郵件地址,都必須透過收信的方式確認沒有問題。\n只有驗證過的電子郵件地址可以收到來自其他使用者或修改通知的信件。\n公開的 Wiki 會 <strong>建議</strong> 設定此選項,以防使用者濫用電子郵件功能。",
        "config-email-sender": "電子郵件回覆位址:",
index 30b92c7..ae28163 100644 (file)
@@ -179,6 +179,22 @@ class CSSJanus {
                $css = $noFlipClass->detokenize( $css );
                $css = $noFlipSingle->detokenize( $css );
 
+               // Remove remaining /* @noflip */ annotations, they won't be needed anymore
+               // and can interfere with other code (bug 69698).
+               $css = self::nullTransform( $css );
+
+               return $css;
+       }
+
+       /**
+        * Remove @noflip annotations, but don't do any other transforms.
+        * @param string $css stylesheet to transform
+        * @return string Transformed stylesheet
+        */
+       public static function nullTransform( $css ) {
+               $patt = self::$patterns['noflip_annotation'];
+               $css = preg_replace( "/($patt)\\s*/i", '', $css );
+
                return $css;
        }
 
index bebe3a9..46c5515 100644 (file)
@@ -533,6 +533,10 @@ class ManualLogEntry extends LogEntryBase {
                        $dbw->insert( 'log_search', $rows, __METHOD__, 'IGNORE' );
                }
 
+               // Update any bloom filter cache
+               $member = $this->getTarget()->getNamespace() . ':' . $this->getTarget()->getDBkey();
+               BloomCache::get( 'main' )->insert( wfWikiId(), 'TitleHasLogs', $member );
+
                return $this->id;
        }
 
index 8970539..b433414 100644 (file)
@@ -1190,15 +1190,18 @@ class Article implements Page {
         */
        public function showMissingArticle() {
                global $wgSend404Code;
+
                $outputPage = $this->getContext()->getOutput();
                // Whether the page is a root user page of an existing user (but not a subpage)
                $validUserPage = false;
 
+               $title = $this->getTitle();
+
                # Show info in user (talk) namespace. Does the user exist? Is he blocked?
-               if ( $this->getTitle()->getNamespace() == NS_USER
-                       || $this->getTitle()->getNamespace() == NS_USER_TALK
+               if ( $title->getNamespace() == NS_USER
+                       || $title->getNamespace() == NS_USER_TALK
                ) {
-                       $parts = explode( '/', $this->getTitle()->getText() );
+                       $parts = explode( '/', $title->getText() );
                        $rootPart = $parts[0];
                        $user = User::newFromName( $rootPart, false /* allow IP users*/ );
                        $ip = User::isIP( $rootPart );
@@ -1222,9 +1225,9 @@ class Article implements Page {
                                                )
                                        )
                                );
-                               $validUserPage = !$this->getTitle()->isSubpage();
+                               $validUserPage = !$title->isSubpage();
                        } else {
-                               $validUserPage = !$this->getTitle()->isSubpage();
+                               $validUserPage = !$title->isSubpage();
                        }
                }
 
@@ -1236,12 +1239,16 @@ class Article implements Page {
                wfRunHooks( 'Article::MissingArticleConditions', array( &$conds, $logTypes ) );
 
                # Show delete and move logs
-               LogEventsList::showLogExtract( $outputPage, $logTypes, $this->getTitle(), '',
-                       array( 'lim' => 10,
-                               'conds' => $conds,
-                               'showIfEmpty' => false,
-                               'msgKey' => array( 'moveddeleted-notice' ) )
-               );
+               $member = $title->getNamespace() . ':' . $title->getDBkey();
+               // @todo: move optimization to showLogExtract()?
+               if ( BloomCache::get( 'main' )->check( wfWikiId(), 'TitleHasLogs', $member ) ) {
+                       LogEventsList::showLogExtract( $outputPage, $logTypes, $title, '',
+                               array( 'lim' => 10,
+                                       'conds' => $conds,
+                                       'showIfEmpty' => false,
+                                       'msgKey' => array( 'moveddeleted-notice' ) )
+                       );
+               }
 
                if ( !$this->mPage->hasViewableContent() && $wgSend404Code && !$validUserPage ) {
                        // If there's no backing content, send a 404 Not Found
@@ -1264,11 +1271,11 @@ class Article implements Page {
                $oldid = $this->getOldID();
                if ( $oldid ) {
                        $text = wfMessage( 'missing-revision', $oldid )->plain();
-               } elseif ( $this->getTitle()->getNamespace() === NS_MEDIAWIKI ) {
+               } elseif ( $title->getNamespace() === NS_MEDIAWIKI ) {
                        // Use the default message text
-                       $text = $this->getTitle()->getDefaultMessageText();
-               } elseif ( $this->getTitle()->quickUserCan( 'create', $this->getContext()->getUser() )
-                       && $this->getTitle()->quickUserCan( 'edit', $this->getContext()->getUser() )
+                       $text = $title->getDefaultMessageText();
+               } elseif ( $title->quickUserCan( 'create', $this->getContext()->getUser() )
+                       && $title->quickUserCan( 'edit', $this->getContext()->getUser() )
                ) {
                        $message = $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon';
                        $text = wfMessage( $message )->plain();
index 80e5371..d06c819 100644 (file)
@@ -267,7 +267,7 @@ class ImagePage extends Article {
                                # @todo FIXME: Why is this using escapeId for a class?!
                                $class = Sanitizer::escapeId( $v['id'] );
                                if ( $type == 'collapsed' ) {
-                                       // Handled by mediawiki.action.view.metadata module and shared.css.
+                                       // Handled by mediawiki.action.view.metadata module.
                                        $class .= ' collapsable';
                                }
                                $r .= "<tr class=\"$class\">\n";
index 1d93c27..5972296 100644 (file)
@@ -447,8 +447,8 @@ abstract class IndexPager extends ContextSource implements Pager {
         *
         * @param string $text Text displayed on the link
         * @param array $query Associative array of parameter to be in the query string
-        * @param string $type Value of the "rel" attribute
-        *
+        * @param string $type Link type used to create additional attributes, like "rel", "class" or
+        *  "title". Valid values (non-exhaustive list): 'first', 'last', 'prev', 'next', 'asc', 'desc'.
         * @return string HTML fragment
         */
        function makeLink( $text, array $query = null, $type = null ) {
@@ -457,15 +457,19 @@ abstract class IndexPager extends ContextSource implements Pager {
                }
 
                $attrs = array();
-               if ( in_array( $type, array( 'first', 'prev', 'next', 'last' ) ) ) {
-                       # HTML5 rel attributes
+               if ( in_array( $type, array( 'prev', 'next' ) ) ) {
                        $attrs['rel'] = $type;
                }
 
+               if ( in_array( $type, array( 'asc', 'desc' ) ) ) {
+                       $attrs['title'] = wfMessage( $type == 'asc' ? 'sort-ascending' : 'sort-descending' )->text();
+               }
+
                if ( $type ) {
                        $attrs['class'] = "mw-{$type}link";
                }
 
+
                return Linker::linkKnown(
                        $this->getTitle(),
                        $text,
index 19538c6..2218787 100644 (file)
@@ -50,48 +50,99 @@ abstract class TablePager extends IndexPager {
                parent::__construct();
        }
 
+       /**
+        * Get the formatted result list. Calls getStartBody(), formatRow() and getEndBody(), concatenates
+        * the results and returns them.
+        *
+        * Also adds the required styles to our OutputPage object (this means that if context wasn't
+        * passed to constructor or otherwise set up, you will get a pager with missing styles).
+        *
+        * This method has been made 'final' in 1.24. There's no reason to override it, and if there exist
+        * any subclasses that do, the style loading hack is probably broken in them. Let's fail fast
+        * rather than mysteriously render things wrong.
+        *
+        * @deprecated since 1.24, use getBodyOutput() or getFullOutput() instead
+        * @return string
+        */
+       final public function getBody() {
+               $this->getOutput()->addModuleStyles( $this->getModuleStyles() );
+               return parent::getBody();
+       }
+
+       /**
+        * Get the formatted result list.
+        *
+        * Calls getBody() and getModuleStyles() and builds a ParserOutput object. (This is a bit hacky
+        * but works well.)
+        *
+        * @since 1.24
+        * @return ParserOutput
+        */
+       public function getBodyOutput() {
+               $body = parent::getBody();
+
+               $pout = new ParserOutput;
+               $pout->setText( $body );
+               $pout->addModuleStyles( $this->getModuleStyles() );
+               return $pout;
+       }
+
+       /**
+        * Get the formatted result list, with navigation bars.
+        *
+        * Calls getBody(), getNavigationBar() and getModuleStyles() and
+        * builds a ParserOutput object. (This is a bit hacky but works well.)
+        *
+        * @since 1.24
+        * @return ParserOutput
+        */
+       public function getFullOutput() {
+               $navigation = $this->getNavigationBar();
+               $body = parent::getBody();
+
+               $pout = new ParserOutput;
+               $pout->setText( $navigation . $body . $navigation );
+               $pout->addModuleStyles( $this->getModuleStyles() );
+               return $pout;
+       }
+
        /**
         * @protected
         * @return string
         */
        function getStartBody() {
-               global $wgStylePath;
                $sortClass = $this->getSortHeaderClass();
 
                $s = '';
                $fields = $this->getFieldNames();
 
-               # Make table header
+               // Make table header
                foreach ( $fields as $field => $name ) {
                        if ( strval( $name ) == '' ) {
                                $s .= Html::rawElement( 'th', array(), '&#160;' ) . "\n";
                        } elseif ( $this->isFieldSortable( $field ) ) {
                                $query = array( 'sort' => $field, 'limit' => $this->mLimit );
-                               if ( $field == $this->mSort ) {
-                                       # This is the sorted column
-                                       # Prepare a link that goes in the other sort order
+                               $linkType = null;
+                               $class = null;
+
+                               if ( $this->mSort == $field ) {
+                                       // The table is sorted by this field already, make a link to sort in the other direction
+                                       // We don't actually know in which direction other fields will be sorted by default…
                                        if ( $this->mDefaultDirection ) {
-                                               # Descending
-                                               $image = 'Arr_d.png';
+                                               $linkType = 'asc';
+                                               $class = "$sortClass TablePager_sort-descending";
                                                $query['asc'] = '1';
                                                $query['desc'] = '';
-                                               $alt = $this->msg( 'descending_abbrev' )->escaped();
                                        } else {
-                                               # Ascending
-                                               $image = 'Arr_u.png';
+                                               $linkType = 'desc';
+                                               $class = "$sortClass TablePager_sort-ascending";
                                                $query['asc'] = '';
                                                $query['desc'] = '1';
-                                               $alt = $this->msg( 'ascending_abbrev' )->escaped();
                                        }
-                                       $image = "$wgStylePath/common/images/$image";
-                                       $link = $this->makeLink(
-                                               Html::element( 'img', array( 'width' => 12, 'height' => 12,
-                                                       'alt' => $alt, 'src' => $image ) ) . htmlspecialchars( $name ), $query );
-                                       $s .= Html::rawElement( 'th', array( 'class' => $sortClass ), $link ) . "\n";
-                               } else {
-                                       $s .= Html::rawElement( 'th', array(),
-                                               $this->makeLink( htmlspecialchars( $name ), $query ) ) . "\n";
                                }
+
+                               $link = $this->makeLink( htmlspecialchars( $name ), $query, $linkType );
+                               $s .= Html::rawElement( 'th', array( 'class' => $class ), $link ) . "\n";
                        } else {
                                $s .= Html::element( 'th', array(), $name ) . "\n";
                        }
@@ -99,7 +150,6 @@ abstract class TablePager extends IndexPager {
 
                $tableClass = $this->getTableClass();
                $ret = Html::openElement( 'table', array(
-                       'style' => 'border:1px;',
                        'class' => "mw-datatable $tableClass" )
                );
                $ret .= Html::rawElement( 'thead', array(), Html::rawElement( 'tr', array(), "\n" . $s . "\n" ) );
@@ -235,45 +285,23 @@ abstract class TablePager extends IndexPager {
         * @return string HTML
         */
        public function getNavigationBar() {
-               global $wgStylePath;
-
                if ( !$this->isNavigationBarShown() ) {
                        return '';
                }
 
-               $path = "$wgStylePath/common/images";
                $labels = array(
                        'first' => 'table_pager_first',
                        'prev' => 'table_pager_prev',
                        'next' => 'table_pager_next',
                        'last' => 'table_pager_last',
                );
-               $images = array(
-                       'first' => 'arrow_first_25.png',
-                       'prev' => 'arrow_left_25.png',
-                       'next' => 'arrow_right_25.png',
-                       'last' => 'arrow_last_25.png',
-               );
-               $disabledImages = array(
-                       'first' => 'arrow_disabled_first_25.png',
-                       'prev' => 'arrow_disabled_left_25.png',
-                       'next' => 'arrow_disabled_right_25.png',
-                       'last' => 'arrow_disabled_last_25.png',
-               );
-               if ( $this->getLanguage()->isRTL() ) {
-                       $keys = array_keys( $labels );
-                       $images = array_combine( $keys, array_reverse( $images ) );
-                       $disabledImages = array_combine( $keys, array_reverse( $disabledImages ) );
-               }
 
                $linkTexts = array();
                $disabledTexts = array();
                foreach ( $labels as $type => $label ) {
                        $msgLabel = $this->msg( $label )->escaped();
-                       $linkTexts[$type] = Html::element( 'img', array( 'src' => "$path/{$images[$type]}",
-                               'alt' => $msgLabel ) ) . "<br />$msgLabel";
-                       $disabledTexts[$type] = Html::element( 'img', array( 'src' => "$path/{$disabledImages[$type]}",
-                               'alt' => $msgLabel ) ) . "<br />$msgLabel";
+                       $linkTexts[$type] = "<div class='TablePager_nav-enabled'>$msgLabel</div>";
+                       $disabledTexts[$type] = "<div class='TablePager_nav-disabled'>$msgLabel</div>";
                }
                $links = $this->getPagingLinks( $linkTexts, $disabledTexts );
 
@@ -281,12 +309,26 @@ abstract class TablePager extends IndexPager {
                $s .= Html::openElement( 'tr' ) . "\n";
                $width = 100 / count( $links ) . '%';
                foreach ( $labels as $type => $label ) {
-                       $s .= Html::rawElement( 'td', array( 'style' => "width:$width;" ), $links[$type] ) . "\n";
+                       // We want every cell to have the same width. We could use table-layout: fixed; in CSS,
+                       // but it only works if we specify the width of a cell or the table and we don't want to.
+                       // There is no better way. <http://www.w3.org/TR/CSS2/tables.html#fixed-table-layout>
+                       $s .= Html::rawElement( 'td',
+                               array( 'style' => "width: $width;", 'class' => "TablePager_nav-$type" ),
+                               $links[$type] ) . "\n";
                }
                $s .= Html::closeElement( 'tr' ) . Html::closeElement( 'table' ) . "\n";
                return $s;
        }
 
+       /**
+        * ResourceLoader modules that must be loaded to provide correct styling for this pager
+        * @since 1.24
+        * @return string[]
+        */
+       public function getModuleStyles() {
+               return array( 'mediawiki.pager.tablePager' );
+       }
+
        /**
         * Get a "<select>" element which has options for each of the allowed limits
         *
index 0c84700..6128f19 100644 (file)
@@ -867,6 +867,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 
                if ( $flip ) {
                        $style = CSSJanus::transform( $style, true, false );
+               } else {
+                       $style = CSSJanus::nullTransform( $style );
                }
                $localDir = dirname( $localPath );
                $remoteDir = dirname( $remotePath );
index 40274c6..7abecc7 100644 (file)
@@ -83,6 +83,8 @@ class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
                $style = implode( "\n", $rules );
                if ( $this->getFlip( $context ) ) {
                        $style = CSSJanus::transform( $style, true, false );
+               } else {
+                       $style = CSSJanus::nullTransform( $style );
                }
                return array( 'all' => $style );
        }
index 0472f1a..d45316f 100644 (file)
@@ -36,8 +36,8 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
        # Origin is user-supplied code
        protected $origin = self::ORIGIN_USER_SITEWIDE;
 
-       // In-object cache for title mtimes
-       protected $titleMtimes = array();
+       // In-object cache for title info
+       protected $titleInfo = array();
 
        /* Abstract Protected Methods */
 
@@ -152,6 +152,8 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        }
                        if ( $this->getFlip( $context ) ) {
                                $style = CSSJanus::transform( $style, true, false );
+                       } else {
+                               $style = CSSJanus::nullTransform( $style );
                        }
                        $style = CSSMin::remap( $style, false, $this->getConfig()->get( 'ScriptPath' ), true );
                        if ( !isset( $styles[$media] ) ) {
@@ -169,8 +171,11 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
         */
        public function getModifiedTime( ResourceLoaderContext $context ) {
                $modifiedTime = 1; // wfTimestamp() interprets 0 as "now"
-               $mtimes = $this->getTitleMtimes( $context );
-               if ( count( $mtimes ) ) {
+               $titleInfo = $this->getTitleInfo( $context );
+               if ( count( $titleInfo ) ) {
+                       $mtimes = array_map( function( $value ) {
+                               return $value['timestamp'];
+                       }, $titleInfo );
                        $modifiedTime = max( $modifiedTime, max( $mtimes ) );
                }
                $modifiedTime = max(
@@ -199,16 +204,35 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
         * @return bool
         */
        public function isKnownEmpty( ResourceLoaderContext $context ) {
-               return count( $this->getTitleMtimes( $context ) ) == 0;
+               $titleInfo = $this->getTitleInfo( $context );
+               // Bug 68488: For modules in the "user" group, we should actually
+               // check that the pages are empty (page_len == 0), but for other
+               // groups, just check the pages exist so that we don't end up
+               // caching temporarily-blank pages without the appropriate
+               // <script> or <link> tag.
+               if ( $this->getGroup() !== 'user' ) {
+                       return count( $titleInfo ) === 0;
+               }
+
+               foreach ( $titleInfo as $info ) {
+                       if ( $info['length'] !== 0 ) {
+                               // At least one non-0-lenth page, not empty
+                               return false;
+                       }
+               }
+
+               // All pages are 0-length, so it's empty
+               return true;
        }
 
        /**
         * Get the modification times of all titles that would be loaded for
         * a given context.
         * @param ResourceLoaderContext $context Context object
-        * @return array( prefixed DB key => UNIX timestamp ), nonexistent titles are dropped
+        * @return array keyed by page dbkey, with value is an array with 'length' and 'timestamp'
+        *               keys, where the timestamp is a unix one
         */
-       protected function getTitleMtimes( ResourceLoaderContext $context ) {
+       protected function getTitleInfo( ResourceLoaderContext $context ) {
                $dbr = $this->getDB();
                if ( !$dbr ) {
                        // We're dealing with a subclass that doesn't have a DB
@@ -216,11 +240,11 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
                }
 
                $hash = $context->getHash();
-               if ( isset( $this->titleMtimes[$hash] ) ) {
-                       return $this->titleMtimes[$hash];
+               if ( isset( $this->titleInfo[$hash] ) ) {
+                       return $this->titleInfo[$hash];
                }
 
-               $this->titleMtimes[$hash] = array();
+               $this->titleInfo[$hash] = array();
                $batch = new LinkBatch;
                foreach ( $this->getPages( $context ) as $titleText => $options ) {
                        $batch->addObj( Title::newFromText( $titleText ) );
@@ -228,16 +252,18 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
 
                if ( !$batch->isEmpty() ) {
                        $res = $dbr->select( 'page',
-                               array( 'page_namespace', 'page_title', 'page_touched' ),
+                               array( 'page_namespace', 'page_title', 'page_touched', 'page_len' ),
                                $batch->constructSet( 'page', $dbr ),
                                __METHOD__
                        );
                        foreach ( $res as $row ) {
                                $title = Title::makeTitle( $row->page_namespace, $row->page_title );
-                               $this->titleMtimes[$hash][$title->getPrefixedDBkey()] =
-                                       wfTimestamp( TS_UNIX, $row->page_touched );
+                               $this->titleInfo[$hash][$title->getPrefixedDBkey()] = array(
+                                       'timestamp' => wfTimestamp( TS_UNIX, $row->page_touched ),
+                                       'length' => $row->page_len,
+                               );
                        }
                }
-               return $this->titleMtimes[$hash];
+               return $this->titleInfo[$hash];
        }
 }
index 7096fde..6ecb121 100644 (file)
@@ -68,10 +68,8 @@ class SpecialAllMessages extends SpecialPage {
 
                $this->langcode = $this->table->lang->getCode();
 
-               $out->addHTML( $this->table->buildForm() .
-                       $this->table->getNavigationBar() .
-                       $this->table->getBody() .
-                       $this->table->getNavigationBar() );
+               $out->addHTML( $this->table->buildForm() );
+               $out->addParserOutputContent( $this->table->getFullOutput() );
        }
 
        protected function getGroupName() {
index e2ebdbe..0123972 100644 (file)
@@ -181,11 +181,7 @@ class SpecialBlockList extends SpecialPage {
 
                $pager = new BlockListPager( $this, $conds );
                if ( $pager->getNumRows() ) {
-                       $out->addHTML(
-                               $pager->getNavigationBar() .
-                                       $pager->getBody() .
-                                       $pager->getNavigationBar()
-                       );
+                       $out->addParserOutputContent( $pager->getFullOutput() );
                } elseif ( $this->target ) {
                        $out->addWikiMsg( 'ipblocklist-no-results' );
                } else {
index 76f2f4a..3656b9c 100644 (file)
@@ -553,7 +553,15 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $fields = array();
                $count = 0;
 
-               foreach ( $this->getWatchlistInfo() as $namespace => $pages ) {
+               // Allow subscribers to manipulate the list of watched pages (or use it
+               // to preload lots of details at once)
+               $watchlistInfo = $this->getWatchlistInfo();
+               wfRunHooks(
+                       'WatchlistEditorBeforeFormRender',
+                       array( &$watchlistInfo )
+               );
+
+               foreach ( $watchlistInfo as $namespace => $pages ) {
                        $options = array();
 
                        foreach ( array_keys( $pages ) as $dbkey ) {
@@ -620,15 +628,10 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
        private function buildRemoveLine( $title ) {
                $link = Linker::link( $title );
 
-               if ( $title->isRedirect() ) {
-                       // Linker already makes class mw-redirect, so this is redundant
-                       $link = '<span class="watchlistredir">' . $link . '</span>';
-               }
-
-               $tools[] = Linker::link( $title->getTalkPage(), $this->msg( 'talkpagelinktext' )->escaped() );
+               $tools['talk'] = Linker::link( $title->getTalkPage(), $this->msg( 'talkpagelinktext' )->escaped() );
 
                if ( $title->exists() ) {
-                       $tools[] = Linker::linkKnown(
+                       $tools['history'] = Linker::linkKnown(
                                $title,
                                $this->msg( 'history_short' )->escaped(),
                                array(),
@@ -637,7 +640,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                }
 
                if ( $title->getNamespace() == NS_USER && !$title->isSubpage() ) {
-                       $tools[] = Linker::linkKnown(
+                       $tools['contributions'] = Linker::linkKnown(
                                SpecialPage::getTitleFor( 'Contributions', $title->getText() ),
                                $this->msg( 'contributions' )->escaped()
                        );
@@ -645,9 +648,14 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 
                wfRunHooks(
                        'WatchlistEditorBuildRemoveLine',
-                       array( &$tools, $title, $title->isRedirect(), $this->getSkin() )
+                       array( &$tools, $title, $title->isRedirect(), $this->getSkin(), &$link )
                );
 
+               if ( $title->isRedirect() ) {
+                       // Linker already makes class mw-redirect, so this is redundant
+                       $link = '<span class="watchlistredir">' . $link . '</span>';
+               }
+
                return $link . " (" . $this->getLanguage()->pipeList( $tools ) . ")";
        }
 
index cea6ff8..a1730d1 100644 (file)
@@ -48,15 +48,13 @@ class SpecialListFiles extends IncludableSpecialPage {
                        $showAll
                );
 
+               $out = $this->getOutput();
                if ( $this->including() ) {
-                       $html = $pager->getBody();
+                       $out->addParserOutputContent( $pager->getBodyOutput() );
                } else {
-                       $form = $pager->getForm();
-                       $body = $pager->getBody();
-                       $nav = $pager->getNavigationBar();
-                       $html = "$form<br />\n$body<br />\n$nav";
+                       $out->addHTML( $pager->getForm() );
+                       $out->addParserOutputContent( $pager->getFullOutput() );
                }
-               $this->getOutput()->addHTML( $html );
        }
 
        protected function getGroupName() {
@@ -548,6 +546,7 @@ class ImageListPager extends TablePager {
                $form = new HTMLForm( $fields, $this->getContext() );
 
                $form->setMethod( 'get' );
+               $form->setTitle( $this->getTitle() );
                $form->setId( 'mw-listfiles-form' );
                $form->setWrapperLegendMsg( 'listfiles' );
                $form->setSubmitTextMsg( 'table_pager_limit_submit' );
index 5072e76..0ba7385 100644 (file)
@@ -79,11 +79,7 @@ class SpecialProtectedpages extends SpecialPage {
                ) );
 
                if ( $pager->getNumRows() ) {
-                       $this->getOutput()->addHTML(
-                               $pager->getNavigationBar() .
-                                       $pager->getBody() .
-                                       $pager->getNavigationBar()
-                       );
+                       $this->getOutput()->addParserOutputContent( $pager->getFullOutput() );
                } else {
                        $this->getOutput()->addWikiMsg( 'protectedpagesempty' );
                }
index 5938f01..17d7664 100644 (file)
@@ -595,9 +595,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                }
 
                # Look up
-               $c = new Categoryfinder;
-               $c->seed( $articles, $cats, $opts['categories_any'] ? 'OR' : 'AND' );
-               $match = $c->run();
+               $catFind = new CategoryFinder;
+               $catFind->seed( $articles, $cats, $opts['categories_any'] ? 'OR' : 'AND' );
+               $match = $catFind->run();
 
                # Filter
                $newrows = array();
index 1ff713b..59808fc 100644 (file)
        "recentchanges": "በቅርብ ጊዜ የተለወጡ",
        "recentchanges-legend": "የቅርብ ለውጥ አማራጮች፦",
        "recentchanges-summary": "በዚሁ ገጽ ላይ በቅርብ ጊዜ የወጡ አዳዲስ ለውጦች ለመከታተል ይችላሉ።",
+       "recentchanges-noresult": "ለዚሁ ጥያቄ በተሰጠው ወቅት ውስጥ  አንዳችም ለውጥ አልነበረም።",
        "recentchanges-feed-description": "በዚህ ዊኪ ላይ በቅርብ ግዜ የተለወጠውን በዚሁ feed መከታተል ይችላሉ",
        "recentchanges-label-newpage": "ይኸው ለውጥ አዲስ ገጽ ፈጠረ።",
        "recentchanges-label-minor": "ይህ ለውጥ ጥቃቅን ነው።",
        "thumbnail_invalid_params": "ትክክለኛ ያልሆነ የናሙና ግቤት",
        "import": "ገጾች ከሌላ ዊኪ ለማስገባት",
        "importinterwiki": "ከሌላ ዊኪ ማስገባት",
-       "import-interwiki-source": "መነሻ ዊኪ/ገጽ:",
        "import-interwiki-history": "ለዚህ ገጽ የታሪክ ዕትሞች ሁሉ ለመቅዳት",
        "import-interwiki-submit": "ለማስገባት",
        "import-interwiki-namespace": "መድረሻ ክፍለ-ዊኪ:",
index f8946b3..25941c6 100644 (file)
        "userlogin-resetlink": "نسيت تفاصيل الدخول؟",
        "userlogin-resetpassword-link": "نسيت كلمة مرورك؟",
        "userlogin-helplink2": "المساعدة في الدخول",
-       "userlogin-loggedin": "أنت {{GENDER:$1|مسجل|مسجلة}} الدخول مسبقًا باسم $1. {{GENDER:$1|استخدم|استخدمي}} النموذج بالأسفل لتسجيل الدخول بحساب آخر.",
-       "userlogin-createanother": "إنشاء حساب آخر",
        "createacct-emailrequired": "عنوان البريد الإلكتروني",
        "createacct-emailoptional": "البريد الإلكتروني (اختياري)",
        "createacct-email-ph": "أدخل عنوان بريدك الإلكتروني",
        "contribsub2": "ل{{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "حساب المستخدم \"$1\" غير مسجل.",
        "nocontribs": "لم يتم العثور على تغييرات تطابق هذه المحددات.",
-       "uctop": "حالي",
+       "uctop": "(حالية)",
        "month": "من شهر (وأقدم):",
        "year": "من سنة (وأقدم):",
        "sp-contributions-newbies": "اعرض مساهمات الحسابات الجديدة فقط",
index 2bd1869..24b75c9 100644 (file)
        "userlogin-resetlink": "আপোনাৰ প্ৰৱেশ তথ্য পাহৰিছে?",
        "userlogin-resetpassword-link": "আপোনাৰ গুপ্তশব্দ পাহৰিছে?",
        "userlogin-helplink2": "প্ৰৱেশ সংক্ৰান্তীয় সাহায্য",
-       "userlogin-loggedin": "আপুনি ইতিমধ্যে {{GENDER:$1|$1}} হিচাপে প্ৰৱেশ কৰিছে। তলৰ আন সদস্যৰূপে প্ৰৱেশ কৰিবলৈ তলৰ প্ৰপত্ৰ ব্যৱহাৰ কৰক।",
-       "userlogin-createanother": "আন এটা একাউণ্ট সৃষ্টি কৰক",
        "createacct-emailrequired": "ই-মেইল ঠিকনা",
        "createacct-emailoptional": "ই-মেইল ঠিকনা (বৈকল্পিক)",
        "createacct-email-ph": "আপোনাৰ ই-মেইল ঠিকনা লিখক",
        "download": "ডাউনল’ড কৰক",
        "unwatchedpages": "চকু নৰখা পৃষ্ঠাসমূহ",
        "listredirects": "পুননিৰ্দেশনাৰ তালিকা",
+       "listduplicatedfiles": "প্ৰতিলিপি থকা ফাইলসমূহৰ তালিকা",
+       "listduplicatedfiles-summary": "এই তালিকাখনত থকা ফাইলবোৰৰ শেহতীয়া সংস্কৰণ আন কোনো ফাইলৰ শেহতীয়া সংস্কৰণৰ প্ৰতিলিপি। কেৱল স্থানীয় ফাইলবোৰহে গণ্য কৰা হৈছে।",
        "unusedtemplates": "অব্যৱহৃত সাঁচসমূহ",
        "unusedtemplatestext": "অন্য কোনো পৃষ্ঠাত নথকা {{ns:template}} নামস্থানৰ সকলো পৃষ্ঠা ইয়াত পাব ।\nসাঁচসমূহ বিলোপ কৰাৰ আগতে সেইবোৰলৈ থকা সংযোগ পৰীক্ষা কৰক ।",
        "unusedtemplateswlh": "অন্য সংযোগসমূহ",
index 0d7f8a3..2fe57e0 100644 (file)
        "userlogin-resetlink": "¿Escaeció los datos d'accesu?",
        "userlogin-resetpassword-link": "¿Escaeció la contraseña?",
        "userlogin-helplink2": "Ayuda del aniciu de sesión",
-       "userlogin-loggedin": "Yá anició sesión como {{GENDER:$1|$1}}.\nUtilice'l formulariu de más abaxo p'aniciar sesión como otru usuariu.",
-       "userlogin-createanother": "Crear otra cuenta",
        "createacct-emailrequired": "Direición de corréu electrónicu",
        "createacct-emailoptional": "Direición de corréu electrónicu (opcional)",
        "createacct-email-ph": "Escriba la so direición de corréu electrónicu",
index 13f55ad..f977981 100644 (file)
        "userlogin-resetlink": "Забыліся на зьвесткі для ўваходу?",
        "userlogin-resetpassword-link": "Забылі пароль?",
        "userlogin-helplink2": "Дапамога з уваходам у сыстэму",
-       "userlogin-loggedin": "Вы ўжо ўвайшлі як {{GENDER:$1|$1}}.\nДля ўваходу пад іншым удзельнікам скарыстайцеся формай унізе.",
-       "userlogin-createanother": "Стварыць іншы рахунак",
        "createacct-emailrequired": "E-mail адрас",
        "createacct-emailoptional": "E-mail адрас (неабавязкова)",
        "createacct-email-ph": "Увядзіце ваш e-mail адрас",
index 929d9c4..fd2d3c4 100644 (file)
        "userlogin-resetlink": "Забыліся даныя для ўваходу?",
        "userlogin-resetpassword-link": "Забылі пароль?",
        "userlogin-helplink2": "Даведка па прадстаўленні сістэме",
-       "userlogin-loggedin": "Вы ўжо ўвайшлі ў сістэму як {{GENDER:$1|$1}}.\nСкарыстайцеся формай ніжэй, каб прадставіцца сістэме як іншы ўдзельнік.",
-       "userlogin-createanother": "Стварыць яшчэ адзін уліковы запіс",
        "createacct-emailrequired": "Адрас электроннай пошты",
        "createacct-emailoptional": "Адрас электроннай пошты (неабавязкова)",
        "createacct-email-ph": "Увядзіце ваш адрас электроннай пошты",
index 9a21f2b..f489f9c 100644 (file)
        "userlogin-resetlink": "Забравени данни за влизане в системата?",
        "userlogin-resetpassword-link": "Забравена парола?",
        "userlogin-helplink2": "Помощ за влизане",
-       "userlogin-loggedin": "Вече сте влезли в системата като {{GENDER:$1|$1}}.\nЧрез формуляра по-долу можете да влезете като друг потребител.",
-       "userlogin-createanother": "Създаване на друга сметка",
        "createacct-emailrequired": "Адрес за електронна поща",
        "createacct-emailoptional": "Адрес за електронна поща (незадължително)",
        "createacct-email-ph": "Въведете Вашия адрес за електронна поща",
index 0b94f49..fae03ef 100644 (file)
        "userlogin-resetlink": "আপনার লগইনের বিস্তারিত তথ্যাদি ভুলে গেছেন?",
        "userlogin-resetpassword-link": "পাসওয়ার্ড ভুলে গেছেন?",
        "userlogin-helplink2": "লগইন সংক্রান্ত সাহায্য",
-       "userlogin-loggedin": "আপনি বর্তমানে {{GENDER:$1|$1}} হিসাবে লগইন আছেন।\nঅন্য ব্যবহারকারী নামে লগইন করতে চাইলে নিচের ফর্মটি ব্যবহার করুন।",
-       "userlogin-createanother": "আরেকটি অ্যাকাউন্ট তৈরি করুন",
        "createacct-emailrequired": "ইমেইল ঠিকানা",
        "createacct-emailoptional": "ইমেইল ঠিকানা (ঐচ্ছিক)",
        "createacct-email-ph": "আপনার ইমেইল ঠিকানা যোগ করুন",
index cb2786f..23b840a 100644 (file)
        "userlogin-resetlink": "Ha disoñjet eo bet ho titouroù kevreañ ganeoc'h ?",
        "userlogin-resetpassword-link": "Ankouaet ho ker-tremen ganeoc'h ?",
        "userlogin-helplink2": "Skoazell evit kevreañ",
-       "userlogin-loggedin": "Kevreet oc'h dija evel {{GENDER:$1|$1}}.\nImplijit ar furmskrid amañ dindan evit kevreañ evel un implijer all.",
-       "userlogin-createanother": "Krouiñ ur gont all",
        "createacct-emailrequired": "Chomlec'h postel",
        "createacct-emailoptional": "Chomlec'h postel (diret)",
        "createacct-email-ph": "Skrivit ho chomlec'h postel",
        "parser-template-recursion-depth-warning": "Tizhet bevenn donder galvoù ar patromoù ($1)",
        "language-converter-depth-warning": "Aet eur en tu all d'ar vevenn amdreiñ yezhoù ($1)",
        "node-count-exceeded-category": "Pajennoù m'eur aet en tu all d'an niver a skoulmoù",
+       "node-count-exceeded-category-desc": "Mont a ra ar bajenn-mañ en tu all da gont uhelañ ar skoulmoù.",
        "node-count-exceeded-warning": "Pajenn hag a ya en tu all d'an niver a skoulmoù",
        "expansion-depth-exceeded-category": "Pajennoù m'eur aet dreist d'an donder astenn",
        "expansion-depth-exceeded-warning": "Pajenn a ya dreist d'an donder astenn",
        "shown-title": "Diskouez $1 {{PLURAL:$1|disoc'h|disoc'h}} dre bajenn",
        "viewprevnext": "Gwelet ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Ur bajenn anvet\"[[:$1]]\" zo war ar wiki-mañ'''",
-       "searchmenu-new": "'''Krouiñ ar bajenn \"[[:$1]]\" war ar wiki-mañ !'''",
+       "searchmenu-new": "<strong>Krouiñ ar bajenn \"[[:$1]]\" war ar wiki-mañ !</strong> {{PLURAL:$2|0=|Gwelet ivez ar bajenn kavet gant ho klask.|Gwelet ivez disoc'hoù ar c'hlask.}}",
        "searchprofile-articles": "Pajennoù gant boued",
        "searchprofile-images": "Liesmedia",
        "searchprofile-everything": "Pep tra",
        "licenses-edit": "Aozañ dibarzhioù an aotre-implijout",
        "license-nopreview": "(Dibosupl rakwelet)",
        "upload_source_url": " (Un URL reizh a c'hall bezañ tizhet gant an holl)",
-       "upload_source_file": " (ur restr war hoc'h urzhiataer)",
+       "upload_source_file": " (ar restr ho peus dibabet en hoc'h urzhiataer)",
        "listfiles-delete": "dilemel",
        "listfiles-summary": "Diskouez a ra ar bajenn dibar-mañ an holl restroù bet ezporzhiet.",
        "listfiles_search_for": "Klask anv ar skeudenn :",
        "listgrouprights-addgroup-self-all": "Gallout a ra ouzhpennañ an holl strolladoù da gont an-unan",
        "listgrouprights-removegroup-self-all": "Gallout a ra tennañ kuit an holl strolladoù eus kont an-unan.",
        "listgrouprights-namespaceprotection-namespace": "Esaouenn anv",
+       "listgrouprights-namespaceprotection-restrictedto": "Gwir(ioù) hag a aotre an implijer da aozañ",
+       "trackingcategories": "Rummadoù evezhiañ",
+       "trackingcategories-msg": "Rummad evezhiañ",
        "trackingcategories-name": "Anv ar gemennadenn",
        "broken-file-category-desc": "Er bajenn-mañ ez eus ul liamm restr torr (ul liamm da enframmañ ur restr pa n'eus ket eus ar restr-se).",
        "trackingcategories-nodesc": "N'eus deskrivadur ebet.",
        "unwatchthispage": "Paouez da evezhiañ",
        "notanarticle": "Pennad ebet",
        "notvisiblerev": "Stumm diverket",
-       "watchlist-details": "Lakaet hoc'h eus {{PLURAL:$1|$1 bajenn|$1 pajenn}} dindan evezh, anez kontañ ar pajennoù kaozeal.",
+       "watchlist-details": "Lakaet hoc'h eus {{PLURAL:$1|$1 bajenn|$1 a bajennoù}} war ho roll evezhiañ, anez kontañ ar pajennoù kaozeal.",
        "wlheader-enotif": "Gweredekaet eo ar c'has posteloù.",
        "wlheader-showupdated": "E '''tev''' emañ merket ar pajennoù bet kemmet abaoe ar wezh ziwezhañ hoc'h eus sellet outo",
-       "wlnote": "Setu aze {{PLURAL:$1|ar c'hemm diwezhañ|ar '''$1''' kemm diwezhañ}} c'hoarvezet e-kerzh an {{PLURAL:$2|eurvezh|'''$2''' eurvezh}} ziwezhañ, evit an $3 da $4.",
+       "wlnote": "Setu aze {{PLURAL:$1|ar c'hemm diwezhañ|ar '''$1''' kemm diwezhañ}} c'hoarvezet e-kerzh an {{PLURAL:$2|eurvezh|'''$2''' eurvezh}} diwezhañ, d'an $3 da $4.",
        "wlshowlast": "Diskouez an $1 eurvezh $2 devezh diwezhañ $3",
        "watchlist-options": "Dibarzhioù ar roll evezhiañ",
        "watching": "Heuliet...",
        "exbeforeblank": "A-raok diverkañ e oa an endalc'had : '$1'",
        "delete-confirm": "Diverkañ \"$1\"",
        "delete-legend": "Diverkañ",
-       "historywarning": "'''Diwallit :''' Emaoc'h war-nes diverkañ ur bajenn dezhi un istor gant e-tro {{PLURAL:$1|adweladenn|adweladenn}} :",
+       "historywarning": "<strong>Diwallit :</strong> Emaoc'h war-nes diverkañ ur bajenn dezhi un istor gant {{PLURAL:$1|adweladenn}} :",
        "confirmdeletetext": "War-nes diverkañ da viken ur bajenn pe ur skeudenn eus ar bank roadennoù emaoc'h. Diverket e vo ivez an holl stummoù kozh stag outi.\nKadarnait, mar plij, eo mat an dra-se hoc'h eus c'hoant da ober, e komprenit mat an heuliadoù, hag e rit se diouzh ar [[{{MediaWiki:Policy-url}}]].",
        "actioncomplete": "Diverkadenn kaset da benn",
        "actionfailed": "Ober c'hwitet",
        "delete-edit-reasonlist": "Kemmañ a ra an abegoù diverkañ",
        "delete-toobig": "Bras eo istor ar bajenn-mañ, ouzhpenn $1 {{PLURAL:$1|stumm|stumm}} zo. Bevennet eo bet an diverkañ pajennoù a-seurt-se kuit da zegas reuz war {{SITENAME}} dre fazi .",
        "delete-warning-toobig": "Bras eo istor ar bajenn-mañ, ouzhpenn {{PLURAL:$1|stumm|stumm}} zo.\nDiverkañ anezhi a c'hallo degas reuz war mont en-dro diaz titouroù {{SITENAME}};\ntaolit evezh bras.",
+       "deleteprotected": "Ne c'hallit ket dilemel ar bajenn-mañ rak gwarezet eo bet.",
        "rollback": "disteuler ar c'hemmoù",
        "rollback_short": "Disteuler",
        "rollbacklink": "disteuler",
        "alreadyrolled": "Dibosupl eo disteuler ar c'hemm diwezhañ graet d'ar bajenn [[:$1]] gant [[User:$2|$2]] ([[User talk:$2|Kaozeal]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nkemmet pe distaolet eo bet c'hoazh gant unan bennak all.\n\nAr c'hemm diwezhañ d'ar bajenn-mañ a oa bet graet gant [[User:$3|$3]] ([[User talk:$3|Kaozeal]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Diverradenn ar c'hemm a oa : \"''$1''\".",
        "revertpage": "Kemmoù distaolet gant [[Special:Contributions/$2|$2]] ([[User talk:$2|Kaozeal]]); adlakaet d'ar stumm diwezhañ a-gent gant [[User:$1|$1]]",
-       "revertpage-nouser": "Disteuler kemmoù un implijer kuzhet ha distreiñ d'ar stumm diwezhañ gant [[User:$1|$1]]",
+       "revertpage-nouser": "Disteuler kemmoù un implijer kuzhet ha distreiñ d'ar stumm diwezhañ gant an {{GENDER:$1|[[implijer :$1|$1]]}}",
        "rollback-success": "Disteuler kemmoù $1; distreiñ da stumm diwezhañ $2.",
        "sessionfailure-title": "Fazi dalc'h",
        "sessionfailure": "Evit doare ez eus ur gudenn gant ho talc'h;\nNullet eo bet an ober-mañ a-benn en em wareziñ diouzh an tagadennoù preizhañ.\nKlikit war \"kent\" hag adkargit ar bajenn oc'h deuet drezi; goude klaskit en-dro.",
        "cant-move-user-page": "Noc'h ket aotreet da adenvel pajennoù pennañ an implijerien (er-maez eus o ispajennoù).",
        "cant-move-to-user-page": "Noc'h ket aotreet da adenvel ur bajenn gant anv hini un implijer all (nemet un ispajenn e vefe).",
        "cant-move-category-page": "N'oc'h ket aotreet da zilec'hiañ pajennoù rummad.",
+       "cant-move-to-category-page": "N'oc'h ket aotreet da zilec'hiañ ur bajenn d'ur bajenn rummad.",
        "newtitle": "anv nevez",
        "move-watch": "Evezhiañ ar bajenn-mañ",
        "movepagebtn": "Adenvel ar pennad",
        "import-error-create": "N'eo ket bet enporzhiet ar bajenn \"$1\" peogwir n'oc'h ket aotreet da grouiñ anezhi.",
        "import-error-interwiki": "Ne vez ket enporzhiet ar bajenn \"$1\" rak miret eo an anv evit liammoù diavaez (etrewiki).",
        "import-error-special": "Ne vez ket enporzhiet ar bajenn \"$1\" rak stag eo ouzh un esaouenn anv dibar na aotre ket pajennoù.",
-       "import-error-invalid": "Ne vez ket enporzhiet ar bajenn \"$1\" rak direizh eo hec'h anv.",
+       "import-error-invalid": "N'eo ket bet enporzhiet ar bajenn \"$1\" rak direizh e vefe hec'h anv er wiki-mañ.",
        "import-options-wrong": "{{PLURAL:$2|Dibab fall|Dibaboù fall}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Pourchas a ra ar bennbajenn un titl n'eo ket reizh.",
        "import-rootpage-nosubpage": "Esaouenn anvioù \"$1\" eus ar bennpajenn ne aotre ket an ispajennoù.",
        "importlogpage": "Log an enporzhiadennoù",
        "importlogpagetext": "Enporzhiadennoù melestradurel eus pajennoù adal wikioù all gant istor ar c'hemmadennoù degaset enno.",
        "import-logentry-upload": "en/he deus enporzhiet (pellgarget) [[$1]]",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|stumm|stumm}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|adweladenn}} enporzhiet",
        "import-logentry-interwiki": "treuzwikiet $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|c'hemm|kemm}} abaoe $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|adweladenn}} enporzhiet eus $2",
        "javascripttest": "Amprouadenn JavaScript",
        "javascripttest-title": "Emeur o seveniñ $1 amprouadenn",
        "javascripttest-pagetext-noframework": "Miret eo ar bajenn-mañ evit amprouiñ JavaScript.",
        "fileduplicatesearch-noresults": "N'eus bet kavet restr ebet anvet \"$1\".",
        "specialpages": "Pajennoù dibar",
        "specialpages-note-top": "Alc'hwez",
-       "specialpages-note": "* Pajennoù dibar boutin.\n* <span class=\"mw-specialpagerestricted\">Pajennoù dibar miret strizh.</span>\n* <span class=\"mw-specialpagecached\">Pajennoù dibar krubuilhet hepken (a c'hellfe bezañ re gozh).</span>",
+       "specialpages-note": "* Pajennoù dibar ordinal.\n* <span class=\"mw-specialpagerestricted\">Pajennoù dibar miret strizh.</span>",
        "specialpages-group-maintenance": "Rentaoù-kont trezalc'h",
        "specialpages-group-other": "Pajennoù dibar all",
        "specialpages-group-login": "Kevreañ / krouiñ ur gont",
        "logentry-newusers-byemail": "Krouet eo bet ar gont implijer $3 gant $1 ha kaset eo bet ar ger-tremen dre bostel",
        "logentry-newusers-autocreate": "{{GENDER:$2|Krouet}} eo bet kont $1 ent emgefre",
        "logentry-rights-autopromote": "$1 zo bet {{GENDER:$2|anvet}} ent emgefre a $4 da $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|en deus|he deus}} ezporzhiet $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|en deus|he deus}} ezporzhiet ur stumm nevez eus $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|en deus|he deus}} ezporzhiet $3",
        "rightsnone": "(netra)",
        "feedback-bugornote": "Ma'z oc'h prest da zeskrivañ ur gudenn deknikel dre ar munud e c'hallit [$1 kemenn un draen].\nA-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc'h evezhiadenn d'ar bajenn \"[$3 $2]\", a-gevret gant hoc'h anv implijer hag anv ar merdeer a rit gantañ.",
        "feedback-subject": "Danvez :",
        "pagelang-select-lang": "Dibab ar yezh",
        "right-pagelang": "Cheñch yezh ar bajenn",
        "action-pagelang": "cheñch yezh ar bajenn",
+       "log-name-pagelang": "Cheñch yezh",
+       "log-description-pagelang": "Hemañ zo ur marilh eus ar c'hemmoù e pajenn ar yezhoù.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|en deus|he deus}} cheñchet yezh ar bajenn evit $3 eus $4 da $5.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (gweredekaet)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''diweredekaet''')"
 }
index c9ff9c8..f84897d 100644 (file)
        "userlogin-resetlink": "Zaboravili ste detalje vaše prijave?",
        "userlogin-resetpassword-link": "Zaboravili ste lozinku?",
        "userlogin-helplink2": "Pomoć pri prijavljivanju",
-       "userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nKoristite donji obrazac da biste se prijavili kao drugi korisnik.",
-       "userlogin-createanother": "Napravi još jedan račun",
        "createacct-emailrequired": "Adresa e-pošte",
        "createacct-emailoptional": "Adresa e-pošte (opcionalno)",
        "createacct-email-ph": "Unesite Vašu adresu e-pоšte",
index e9b571f..a56cb47 100644 (file)
        "gotaccount": "Ja teniu un compte? $1.",
        "gotaccountlink": "Inicia una sessió",
        "userlogin-resetlink": "Heu oblidat les vostres dades d'accés?",
-       "userlogin-resetpassword-link": "Has oblidat la teva contrasenya?",
+       "userlogin-resetpassword-link": "Heu oblidat la contrasenya?",
        "userlogin-helplink2": "Ajuda amb el registre",
-       "userlogin-loggedin": "Heu iniciat una sessió com {{GENDER:$1|$1}}.\nFeu servir el formulari de sota per iniciar la sessió com un altre usuari.",
-       "userlogin-createanother": "Crea un altre compte",
        "createacct-emailrequired": "Adreça de correu electrònic",
        "createacct-emailoptional": "Adreça de correu electrònic (opcional)",
        "createacct-email-ph": "Introduïu la vostra adreça de correu electrònic",
index cad5a9b..7a99eb3 100644 (file)
        "userlogin-resetlink": "Чуволу/йолу хаам биц бела?",
        "userlogin-resetpassword-link": "Пароль кхоссар?",
        "userlogin-helplink2": "Системин чудахаран гӀодар",
-       "userlogin-loggedin": "Хьо {{GENDER:$1|$1}} цӀарца чохь ву/ю.\nЛахара форманца кхин цӀарца чугӀо.",
-       "userlogin-createanother": "Кхолла декъашхочун кхин дӀаяздар",
        "createacct-emailrequired": "Электронан почтан адрес",
        "createacct-emailoptional": "Электронан почтан адрес (ца яздича мега)",
        "createacct-email-ph": "ДӀаязде электронан почтан адрес",
        "watchlistedit-clear-removed": "{{PLURAL:$1|ДӀаяьккхина|ДӀаяьхна}} $1 {{PLURAL:$1|дӀаяздар|дӀаяздарш}}:",
        "watchlistedit-too-many": "Кхузахь гайта тӀехь дукха агӀонаш ю.",
        "watchlisttools-clear": "Тергаман могӀам дӀацӀанбан",
-       "watchlisttools-view": "Ð\9cогÓ\80ам Ñ\87Ñ\83Ñ\80а Ð°Ð³Ó\80онаÑ\88ан хийцамаш",
+       "watchlisttools-view": "Ð\9cогÓ\80ам Ñ\87Ñ\83Ñ\80а Ð°Ð³Ó\80онийн хийцамаш",
        "watchlisttools-edit": "Хьажа/нисбé могӀам",
        "watchlisttools-raw": "Йоза санна тае",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|дийцаре]])",
index 0c468b5..97f92d1 100644 (file)
        "userlogin-resetlink": "وردەکارییەکانی چوونەژوورەوەتت لە بیر کردووە؟",
        "userlogin-resetpassword-link": "تێپەڕوشەکەت بیر کردووە؟",
        "userlogin-helplink2": "یارمەتی بۆ چوونەژوورەوە",
-       "userlogin-loggedin": "تۆ ھەر ئێستا بە ناوی {{GENDER:$1|$1}} چوویتە ژوورەوە.\nفۆرمی ژێرەوە بەکاربھێنە بۆ چوونەژوورەوە وەک بەکارھێنەرێکی تر.",
-       "userlogin-createanother": "ھەژمارێکی تر دروست بکە",
        "createacct-emailrequired": "ناونیشانی ئیمەیل",
        "createacct-emailoptional": "ناونیشانی ئیمەیل (دڵخوازانە)",
        "createacct-email-ph": "ناونیشانی ئیمەیلەکەت بنووسە",
index 37b969e..30a00e3 100644 (file)
        "userlogin-resetlink": "Zapomněli jste přihlašovací údaje?",
        "userlogin-resetpassword-link": "Zapomněli jste heslo?",
        "userlogin-helplink2": "Nápověda k přihlašování",
-       "userlogin-loggedin": "Již jste {{GENDER:$1|přihlášen|přihlášena}} jako $1.\nPomocí formuláře níže se můžete přihlásit jako jiný uživatel.",
-       "userlogin-createanother": "Vytvořit jiný účet",
        "createacct-emailrequired": "E-mailová adresa",
        "createacct-emailoptional": "E-mailová adresa (nepovinné)",
        "createacct-email-ph": "Zadejte svou e-mailovou adresu",
        "showpreview": "Ukázat náhled",
        "showdiff": "Ukázat změny",
        "blankarticle": "<strong>Upozornění:</strong> Stránka, kterou se chystáte založit, je prázdná. Pokud ještě jednou kliknete na „{{int:savearticle}}“, bude založena zcela bez obsahu.",
-       "anoneditwarning": "'''Varování:''' Nejste přihlášen(a). Vaše IP adresa bude zveřejněna v historii této stránky.",
+       "anoneditwarning": "'''Varování:''' Nejste přihlášen(a). Pokud uložíte jakoukoli editaci, bude vaše IP adresa zveřejněna v historii této stránky. Pokud se <strong>[$1 přihlásíte]</strong> nebo si <strong>[$2 vytvoříte účet]</strong>, budou vaše editace připsány vašemu uživatelskému jménu a získáte i další výhody.",
        "anonpreviewwarning": "''Nejste přihlášen(a). Uložením zveřejníte svou IP adresu v historii této stránky.''",
        "missingsummary": "'''Připomenutí:''' Nezadali jste shrnutí editace. Pokud ještě jednou kliknete na Uložit změny, bude vaše editace zapsána bez shrnutí.",
        "missingcommenttext": "Zadejte komentář",
index f5ef28b..7b34475 100644 (file)
        "userlogin-resetlink": "Har du glemt dine login oplysninger?",
        "userlogin-resetpassword-link": "Glemt din adgangskode?",
        "userlogin-helplink2": "Hjælp med at logge på",
-       "userlogin-loggedin": "Du er allerede logget på som {{GENDER:$1|$1}}.\nBrug formularen nedenfor til at logge på som en anden bruger.",
-       "userlogin-createanother": "Opret en anden konto",
        "createacct-emailrequired": "E-mailadresse",
        "createacct-emailoptional": "E-mailadresse (valgfri)",
        "createacct-email-ph": "Indtast din e-mailadresse",
        "listgrouprights-namespaceprotection-header": "Navnerumsbegrænsninger",
        "listgrouprights-namespaceprotection-namespace": "Navnerum",
        "listgrouprights-namespaceprotection-restrictedto": "Rettighed(er) der giver brugeren mulighed for at redigere",
-       "trackingcategories-desc": "Kategori optagelse kriterier",
-       "noindex-category-desc": "Siden ikke indekseres af robotter, fordi det er det magiske ord <code><nowiki>__NOINDEX__</nowiki></code> på det og er i et navneområde, hvor dette flag er tilladt.",
-       "index-category-desc": "Siden har en <code><nowiki>__INDEX__</nowiki></code> på det (og er i et navneområde, hvor dette flag er tilladt), og dermed er indekseret af robotter, hvor det normalt ikke ville være.",
+       "trackingcategories-desc": "Optagelseskriterier for kategori",
+       "noindex-category-desc": "Siden indekseres ikke af robotter, fordi den indeholder det magiske ord <code><nowiki>__NOINDEX__</nowiki></code> og er i et navnerum, hvor dette flag er tilladt.",
+       "index-category-desc": "Siden indeholder <code><nowiki>__INDEX__</nowiki></code> (og er i et navnerum, hvor dette flag er tilladt), og bliver derfor indekseret af robotter, hvor den normalt ikke ville blive det.",
        "mailnologin": "Du er ikke logget på",
        "mailnologintext": "Du skal være [[Special:UserLogin|logget på]] og have en gyldig e-mailadresse sat i dine [[Special:Preferences|indstillinger]] for at sende e-mail til andre brugere.",
        "emailuser": "E-mail til denne bruger",
index ea0b643..529053f 100644 (file)
        "userlogin-resetlink": "Die Anmeldedaten vergessen?",
        "userlogin-resetpassword-link": "Passwort vergessen?",
        "userlogin-helplink2": "Hilfe beim Anmelden",
-       "userlogin-loggedin": "Du bist bereits als {{GENDER:$1|$1}} angemeldet.\nBenutze das unten stehende Formular, um dich unter einem anderen Benutzernamen anzumelden.",
-       "userlogin-createanother": "Ein weiteres Benutzerkonto erstellen",
        "createacct-emailrequired": "E-Mail-Adresse",
        "createacct-emailoptional": "E-Mail-Adresse (optional)",
        "createacct-email-ph": "Gib deine E-Mail-Adresse ein",
        "showpreview": "Vorschau zeigen",
        "showdiff": "Änderungen zeigen",
        "blankarticle": "<strong>Warnung:</strong> Die Seite, die du erstellst, ist leer.\nWenn du erneut auf „{{int:savearticle}}“ klickst, wird die Seite ohne Inhalt erstellt.",
-       "anoneditwarning": "Du bearbeitest diese Seite unangemeldet. Wenn du sie abspeicherst, wird deine aktuelle IP-Adresse in der Versionsgeschichte aufgezeichnet und ist damit unwiderruflich '''öffentlich''' einsehbar.",
+       "anoneditwarning": "<strong>Warnung:</strong> Du bist nicht angemeldet. Deine IP-Adresse wird öffentlich sichtbar, falls du Bearbeitungen durchführst. Wenn du dich <strong>[$1 anmeldest]</strong> oder <strong>[$2 ein Benutzerkonto erstellst]</strong>, werden deine Bearbeitungen zusammen mit anderen Beiträgen deinem Benutzernamen zugeordnet.",
        "anonpreviewwarning": "''Du bist nicht angemeldet. Beim Speichern wird deine IP-Adresse in der Versionsgeschichte aufgezeichnet.''",
        "missingsummary": "'''Hinweis:''' Du hast keine Zusammenfassung angegeben. Wenn du erneut auf „{{int:savearticle}}“ klickst, wird deine Änderung ohne Zusammenfassung übernommen.",
        "missingcommenttext": "Dein Abschnitt enthält keinen Text.",
index 8e54abf..ab6f5d0 100644 (file)
        "userlogin-resetlink": "T'ét scurdê j elemèint p'r al tó ingrès?",
        "userlogin-resetpassword-link": "T' ét scurdê la cêva 'd ingrès?",
        "userlogin-helplink2": "Ajót per l'ingrès",
-       "userlogin-loggedin": "T'ét bèle coleghê {{GENDER:$1|$1}}. \nDrōva al mōdul ché sòta cme un êter utèint.",
-       "userlogin-createanother": "Fà 'n' êtra utèinsa.",
        "createacct-emailrequired": "Indirés pôsta eletrônica",
        "createacct-emailoptional": "Indirés pôsta eletrônica (se 's vōl)",
        "createacct-email-ph": "Scrév al tó indirés ed pôsta eletrônica",
index a5ec592..d7103a7 100644 (file)
        "userlogin-resetlink": "Ξεχάσατε τα στοιχεία εισόδου σας;",
        "userlogin-resetpassword-link": "Ξεχάσατε τον κωδικό πρόσβασης;",
        "userlogin-helplink2": "Βοήθεια για τη σύνδεση",
-       "userlogin-loggedin": "Είστε ήδη {{GENDER:$1|συνδεδεμένος|συνδεδεμένη}} ως $1.\nΧρησιμοποιήστε την παρακάτω φόρμα για να συνδεθείτε ως άλλος χρήστης.",
-       "userlogin-createanother": "Δημιουργήσετε έναν άλλο λογαριασμό",
        "createacct-emailrequired": "Διεύθυνση ηλεκτρονικού ταχυδρομείου",
        "createacct-emailoptional": "Διεύθυνση ηλεκτρονικού ταχυδρομείου (προαιρετικό)",
        "createacct-email-ph": "Εισάγετε το email σας",
        "showpreview": "Εμφάνιση προεπισκόπησης",
        "showdiff": "Εμφάνιση αλλαγών",
        "blankarticle": "<strong>Προειδοποίηση:</strong> Η σελίδα που δημιουργείτε είναι κενή.\nΕάν κάνετε κλικ στο κουμπί \"{{int:savearticle}}\" και πάλι, η σελίδα θα δημιουργηθεί χωρίς κανένα περιεχόμενο.",
-       "anoneditwarning": "'''Προειδοποίηση:''' Δεν έχετε συνδεθεί. Η διεύθυνση IP σας θα καταγραφεί στο ιστορικό επεξεργασίας αυτής της σελίδας.",
+       "anoneditwarning": "<strong>Προειδοποίηση:</strong> Δεν έχετε συνδεθεί. Η διεύθυνση IP σας θα είναι ορατή δημόσια αν κάνετε κάποια επεξεργασία. Αν <strong>[$1 συνδεθείτε]</strong> ή <strong>[$2 δημιουργήσετε λογαριασμό]</strong>, οι επεξεργασίες σας θα αποδοθούν στο όνομά χρήστη σας, μαζί με άλλα οφέλη.",
        "anonpreviewwarning": "''Δεν έχετε συνδεθεί. Η αποθήκευση θα καταγράψει την διεύθυνσή IP σας στο ιστορικό επεξεργασίας αυτής της σελίδας.''",
        "missingsummary": "'''Υπενθύμιση:''' Δεν έχετε συμπληρώσει τη σύνοψη επεξεργασίας. Αν κάνετε κλικ στο κουμπί Αποθήκευση πάλι, η επεξεργασία σας θα αποθηκευτεί χωρίς σύνοψη.",
        "missingcommenttext": "Παρακαλώ εισάγετε ένα σχόλιο παρακάτω.",
        "nonunicodebrowser": "'''ΠΡΟΣΟΧΗ! Ο περιηγητής σας δεν είναι συμβατός με κωδικοποίηση Unicode.'''\nΓια την ασφαλή επεξεργασία των σελίδων έχει βρεθεί ένας εναλλακτικός τρόπος: Όσοι χαρακτήρες δεν είναι ASCII θα φαίνονται στο πλαίσιο επεξεργασίας ως δεκαεξαδικοί κωδικοί.",
        "editingold": "'''Προειδοποίηση: Επεξεργάζεστε μια παλιότερη αναθεώρηση αυτής της σελίδας.'''\nΑν την αποθηκεύσετε, όσες αλλαγές έχουν γίνει μετά από αυτή την αναθεώρηση θα χαθούν.",
        "yourdiff": "Διαφορές",
-       "copyrightwarning": "Î\9fλεÏ\82 Î¿Î¹ Ï\83Ï\85νειÏ\83Ï\86οÏ\81έÏ\82 Ï\83Ï\84ο {{SITENAME}} Î¸ÎµÏ\89Ï\81οÏ\8dνÏ\84αι Ï\8cÏ\84ι Î´Î·Î¼Î¿Ï\83ιεÏ\8dονÏ\84αι Ï\83Ï\8dμÏ\86Ï\89να Î¼Îµ Ï\84ην $2 (Î\92λ. $1 Î³Î¹Î± Î»ÎµÏ\80Ï\84ομέÏ\81ειεÏ\82).\nÎ\91ν Î´ÎµÎ½ ÎµÏ\80ιθÏ\85μείÏ\84ε Ï\84α ÎºÎµÎ¯Î¼ÎµÎ½Î¬ Ï\83αÏ\82 Î½Î± Ï\84α ÎµÏ\80εξεÏ\81γαÏ\83Ï\84οÏ\8dν ÎºÎ±Ï\84ά Ï\84ην ÎºÏ\81ίÏ\83η Ï\84οÏ\85Ï\82 Î¬Î»Î»Î¿Î¹ Ï\87Ï\81ήÏ\83Ï\84εÏ\82 ÎºÎ±Î¹ Î½Î± Ï\84α Î´Î¹Î±Î´Ï\8eÏ\83οÏ\85ν ÎºÎ±Ï\84ά Î²Î¿Ï\8dληÏ\83η, Ï\80αÏ\81ακαλοÏ\8dμε Î½Î± Î¼Î·Î½ Ï\84α Î±Î½Î±Ï\81Ï\84ήÏ\83εÏ\84ε Ï\83ε Î±Ï\85Ï\84Ï\8c Ï\84ο Ï\87Ï\8eÏ\81ο. Î\8c\84ι Ï\83Ï\85νειÏ\83Ï\86έÏ\81εÏ\84ε Ï\83Ï\84ο Ï\87Ï\8eÏ\81ο Î±Ï\85Ï\84Ï\8c Ï\83ε ÎºÎµÎ¯Î¼ÎµÎ½Î±, Î´Î¹Î±Î³Ï\81άμμαÏ\84α, Ï\83Ï\84οιÏ\87εία Î® ÎµÎ¹ÎºÏ\8cνεÏ\82 Ï\80Ï\81έÏ\80ει Î½Î± ÎµÎ¯Î½Î±Î¹ Î´Î¹ÎºÎ¬ Ï\83αÏ\82 Î­Ï\81γα Î® Î½Î± Î±Î½Î®ÎºÎ¿Ï\85ν Ï\83Ï\84ο Î´Î·Î¼Ï\8cÏ\83ιο Ï\84ομέα (public domain) Î® Î½Î± Ï\80Ï\81οέÏ\81Ï\87ονÏ\84αι Î±Ï\80Ï\8c ÎµÎ»ÎµÏ\8dθεÏ\81εÏ\82 Î® Î±Î½Î¿Î¹Ï\87Ï\84έÏ\82 Ï\80ηγέÏ\82 Î¼Îµ Ï\81ηÏ\84ή Î¬Î´ÎµÎ¹Î± Î±Î½Î±Î´Î·Î¼Î¿Ï\83ίεÏ\85Ï\83ηÏ\82.<br />\nΤέλοÏ\82 Î²ÎµÎ²Î±Î¹Ï\8eνεÏ\84ε Ï\80Ï\89Ï\82 Ï\8c\84ι Î³Ï\81άÏ\86εÏ\84ε Ï\83ε Î±Ï\85Ï\84Ï\8c Ï\84ον Ï\87Ï\8eÏ\81ο ÎµÎ¯Î½Î±Î¹ Ï\80Ï\81Ï\89Ï\84Ï\8cÏ\84Ï\85Ï\80ο Î´Î¹ÎºÏ\8c Ï\83αÏ\82 Î­Ï\81γο ÎºÎ±Î¹, Î¬Ï\83Ï\87εÏ\84α Î¼Îµ Ï\84ην Î­ÎºÏ\84αÏ\83ή Ï\84οÏ\85, Î´ÎµÎ½ Î­Ï\87ει ÎµÎºÏ\87Ï\89Ï\81ηθεί Ï\83ε Ï\84Ï\81ίÏ\84οÏ\85Ï\82 Î· Î´Î·Î¼Î¿Ï\83ίεÏ\85Ï\83η ÎºÎ±Î¹ Î· ÎµÎºÎ¼ÎµÏ\84άλλεÏ\85Ï\83ή Ï\84οÏ\85.\n'''ΠÎ\91ΡÎ\91Î\9aÎ\91Î\9bÎ\9fÎ¥Î\9cÎ\95 Î\9dÎ\91 Î\9cÎ\97Î\9d Î\91Î\9dÎ\91ΡΤÎ\97ΣÎ\95ΤÎ\95 Î\9aÎ\95Î\99Î\9cÎ\95Î\9dÎ\91 Î¤Î¡Î\99ΤΩÎ\9d Î\95Î\91Î\9d Î\94Î\95Î\9d Î\95ΧÎ\95ΤÎ\95 Î¤Î\97Î\9d Î\91Î\94Î\95Î\99Î\91 Î¤Î\9fÎ¥ Î\99Î\94Î\99Î\9fÎ\9aΤÎ\97ΤÎ\97 Î¤Î\9fÎ¥ COPYRIGHT!'''",
+       "copyrightwarning": "ΠαÏ\81ακαλοÏ\8dμε Ï\83ημειÏ\8eÏ\83Ï\84ε Ï\8cÏ\84ι Ï\8cλεÏ\82 Î¿Î¹ Ï\83Ï\85νειÏ\83Ï\86οÏ\81έÏ\82 Ï\83Ï\84ον Î¹Ï\83Ï\84Ï\8cÏ\84οÏ\80ο {{SITENAME}} Î¸ÎµÏ\89Ï\81οÏ\8dνÏ\84αι Ï\8cÏ\84ι Î´Î·Î¼Î¿Ï\83ιεÏ\8dονÏ\84αι Ï\83Ï\8dμÏ\86Ï\89να Î¼Îµ Ï\84ην $2 (βλ. $1 Î³Î¹Î± Î»ÎµÏ\80Ï\84ομέÏ\81ειεÏ\82).\nÎ\91ν Î´ÎµÎ½ ÎµÏ\80ιθÏ\85μείÏ\84ε Ï\84α ÎºÎµÎ¯Î¼ÎµÎ½Î¬ Ï\83αÏ\82 Î½Î± Ï\84α ÎµÏ\80εξεÏ\81γάζονÏ\84αι Î±Î½Î·Î»ÎµÏ\8eÏ\82 Î¬Î»Î»Î¿Î¹ Ï\87Ï\81ήÏ\83Ï\84εÏ\82 ÎºÎ±Î¹ Î½Î± Ï\84α Î´Î¹Î±Î´Î¯Î´Î¿Ï\85ν ÎºÎ±Ï\84ά Î²Î¿Ï\8dληÏ\83η, Ï\84Ï\8cÏ\84ε Î½Î± Î¼Î·Î½ Ï\84α Ï\85Ï\80οβάλλεÏ\84ε ÎµÎ´Ï\8e.<br />Î\9cαÏ\82 Ï\85Ï\80Ï\8cÏ\83Ï\87εÏ\83Ï\84ε ÎµÏ\80ίÏ\83ηÏ\82 Ï\8cÏ\84ι Î±Ï\85Ï\84Ï\8c Ï\84ο Î³Ï\81άÏ\88αÏ\84ε Î¼Ï\8cνοι Ï\83αÏ\82 Î® Ï\84ο Î±Î½Ï\84ιγÏ\81άÏ\88αÏ\84ε Î±Ï\80Ï\8c ÎºÎ¬Ï\80οια ÎµÎ»ÎµÏ\8dθεÏ\81η Ï\80ηγή Ï\89Ï\82 ÎºÎ¿Î¹Î½Ï\8c ÎºÏ\84ήμα Î® ÎºÎ¬Ï\84ι Î±Î½Î¬Î»Î¿Î³Î¿.\n<strong>Î\9cην Ï\85Ï\80οβάλλεÏ\84ε Î´Î¿Ï\85λειά Ï\80οÏ\85 Ï\80Ï\81οÏ\83Ï\84αÏ\84εÏ\8dεÏ\84αι Î±Ï\80Ï\8c Ï\80νεÏ\85μαÏ\84ικά Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\87Ï\89Ï\81ίÏ\82 Î¬Î´ÎµÎ¹Î±!</strong>",
        "copyrightwarning2": "Σημειώστε ότι όλες οι συνεισφορές στον ιστότοπο {{SITENAME}} μπορούν να υποστούν επεξεργασία, να αλλαχθούν, ή να αφαιρεθούν από άλλους συνεισφέροντες. Αν δεν θέλετε τα γραπτά σας να υποστούν επεξεργασία κατά βούληση, τότε μην τα τοποθετήσετε σε αυτό το χώρο.<br />\nΕπίσης μας υπόσχεστε πως ό,τι γράφετε είναι δικό σας, ή αντιγραμμένο από μια πηγή που είναι κοινό κτήμα, ή μια παρόμοια ελεύθερη πηγή (δείτε $1 για λεπτομέρειες).\n'''ΠΑΡΑΚΑΛΟΥΜΕ ΝΑ ΜΗΝ ΤΟΠΟΘΕΤΕΙΤΕ ΠΝΕΥΜΑΤΙΚΑ ΚΑΤΟΧΥΡΩΜΕΝΟ ΕΡΓΟ ΧΩΡΙΣ ΑΔΕΙΑ!'''",
        "longpageerror": "'''Σφάλμα: Το κείμενο που καταχωρήσατε έχει μήκος {{PLURAL:$1|ένα kilobyte|$1 kilobytes}}, το οποίο είναι μεγαλύτερο από το μέγιστο {{PLURAL:$2|του ενός kilobyte|των $2 kilobytes}}.'''\nΔεν μπορεί να αποθηκευτεί.",
        "readonlywarning": "'''Προειδοποίηση: Η βάση δεδομένων έχει κλειδωθεί για συντήρηση, έτσι δεν θα μπορέσετε να αποθηκεύσετε τις επεξεργασίες σας αυτή τη στιγμή.'''\nΜπορείτε αν θέλετε να μεταφέρετε με αντιγραφή-επικόλληση το κείμενό σας σε αρχείο κειμένου και να το αποθηκεύσετε για αργότερα.\n\nΟ διαχειριστής που την κλείδωσε έδωσε την εξής εξήγηση: $1",
        "search-relatedarticle": "Σχετικά",
        "searchrelated": "σχετικά",
        "searchall": "όλα",
-       "showingresults": "Δείτε παρακάτω μέχρι τα {{PLURAL:$1|'''1'''αποτέλεσμα|'''$1''' αποτελέσματα}} ξεκινώντας με #'''$2'''.",
+       "showingresults": "Παρακάτω {{PLURAL:$1|εμφανίζεται μέχρι <strong>1</strong> αποτέλεσμα|εμφανίζονται μέχρι <strong>$1</strong> αποτελέσματα}} ξεκινώντας από το Νο <strong>$2</strong>.",
+       "showingresultsinrange": "Παρακάτω {{PLURAL:$1|εμφανίζεται μέχρι <strong>1</strong> αποτέλεσμα|εμφανίζονται μέχρι <strong>$1</strong> αποτελέσματα}} σε εύρος από το Νο <strong>$2</strong> μέχρι το Νο <strong>$3</strong>.",
        "showingresultsheader": "{{PLURAL:$5|Αποτέλεσμα '''$1''' από '''$3'''|Αποτελέσματα '''$1 - $2''' από '''$3'''}} για '''$4'''",
        "search-nonefound": "Δεν υπάρχουν αποτελέσματα που να ικανοποιούν το ερώτημα.",
        "powersearch-legend": "Αναλυτική αναζήτηση",
        "right-browsearchive": "Αναζήτηση στις διαγραμμένες σελίδες",
        "right-undelete": "Ανάκληση διαγραφής μίας σελίδας",
        "right-suppressrevision": "Επιθεώρηση και αποκατάσταση αναθεωρήσεων κρυμμένων από τους διαχειριστές",
-       "right-viewsuppressed": "Προβολή αναθεωρήσεων κρυμμέτων από κάθε χρήστη",
+       "right-viewsuppressed": "Προβολή αναθεωρήσεων κρυμμένων από κάθε χρήστη",
        "right-suppressionlog": "Προβολή ιδιωτικών καταγραφών",
        "right-block": "Φραγή άλλων χρηστών από την επεξεργασία",
        "right-blockemail": "Φραγή ενός χρήστη από την αποστολή ηλεκτρονικών μηνυμάτων",
        "recentchanges-legend-heading": "'''Υπόμνημα:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (δείτε [[Special:NewPages|κατάλογος νέων σελίδων]])",
        "rcnotefrom": "Παρακάτω είναι οι αλλαγές από τις <strong>$2</strong>  (εμφανίζονται μέχρι <strong>$1</strong> ).",
-       "rclistfrom": "Εμφάνιση νέων αλλαγών αρχίζοντας από $3 $2",
+       "rclistfrom": "Εμφάνιση νέων αλλαγών αρχίζοντας από τις $3 στις $2",
        "rcshowhideminor": "$1 μικροεπεξεργασιών",
        "rcshowhideminor-show": "Εμφάνιση",
        "rcshowhideminor-hide": "Απόκρυψη",
        "windows-nonascii-filename": "Αυτό το wiki δεν υποστηρίζει ονόματα αρχείων με ειδικούς χαρακτήρες.",
        "fileexists": "Υπάρχει ήδη αρχείο με αυτό το όνομα, παρακαλούμε ελέγξτε το <strong>[[:$1]]</strong> εάν δεν είστε {{GENDER:|σίγουρος|σίγουρη}} αν θέλετε να το αλλάξετε.\n[[$1|thumb]]",
        "filepageexists": "Η σελίδα περιγραφής για αυτό το αρχείο δημιουργήθηκε ήδη στο <strong>[[:$1]]</strong>, αλλά κανένα αρχείο με αυτό το όνομα δεν υπάρχει αυτή τη στιγμή.\nΗ περιγραφἠ που θα εισάγετε δεν θα εμφανιστεί στη σελίδα περιγραφής.\nΓια να εμφανιστεί η περιγραφή σας εκεί, θα πρέπει να την επεξεργαστείτε χειροκίνητα.\n[[$1|thumb]]",
-       "fileexists-extension": "Î\88να Î±Ï\81Ï\87είο Î¼Îµ Ï\80αÏ\81Ï\8cμοιο Ï\8cνομα Ï\85Ï\80άÏ\81Ï\87ει: [[$2|thumb]]\n* Î\8cνομα Ï\84οÏ\85 Ï\80Ï\81οÏ\82 ÎµÏ\80ιÏ\86Ï\8cÏ\81Ï\84Ï\89Ï\83η Î±Ï\81Ï\87είοÏ\85: <strong>[[:$1]]</strong>\n* Î\8cνομα Ï\85Ï\80άÏ\81Ï\87ονÏ\84οÏ\82 Î±Ï\81Ï\87είοÏ\85: <strong>[[:$2]]</strong>\nΠαÏ\81ακαλÏ\8e Î´Î¹Î±Î»Î­Î¾Ï\84ε Î­Î½Î± Î´Î¹Î±Ï\86οÏ\81εÏ\84ικÏ\8c Ï\8cνομα.",
+       "fileexists-extension": "Î¥Ï\80άÏ\81Ï\87ει Î­Î½Î± Î±Ï\81Ï\87είο Î¼Îµ Ï\80αÏ\81Ï\8cμοιο Ï\8cνομα: [[$2|thumb]]\n* Î\8cνομα Ï\84οÏ\85 Ï\80Ï\81οÏ\82 Î±Î½Î­Î²Î±Ï\83μα Î±Ï\81Ï\87είοÏ\85: <strong>[[:$1]]</strong>\n* Î\8cνομα Ï\85Ï\80άÏ\81Ï\87ονÏ\84οÏ\82 Î±Ï\81Ï\87είοÏ\85: <strong>[[:$2]]</strong>\nÎ\9cήÏ\80Ï\89Ï\82 Î¸Î± Î¸Î­Î»Î±Ï\84ε Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιήÏ\83εÏ\84ε ÎºÎ¬Ï\80οιο Ï\8cνομα Ï\80οÏ\85 Î½Î± Î¾ÎµÏ\87Ï\89Ï\81ίζει Ï\80εÏ\81ιÏ\83Ï\83Ï\8cÏ\84εÏ\81ο;",
        "fileexists-thumbnail-yes": "Το αρχείο φαίνεται ότι είναι μια εικόνα μειωμένου μεγέθους ''(μικρογραφία)''. [[$1|thumb]]\nΠαρακαλώ ελέγξτε το αρχείο <strong>[[:$1]]</strong>.\nΑν το ελεγμένο αρχείο είναι η ίδια εικόνα στο αρχικό μέγεθος δεν είναι απαραίτητο να επιφορτώσετε μια επιπλέον μικρογραφία.",
        "file-thumbnail-no": "Το όνομα αρχείου αρχίζει με <strong>$1</strong>.\nΦαίνεται πως είναι μια εικόνα μειωμένου μεγέθους ''(μικρογραφία)''.\nΑν έχετε αυτή την εικόνα σε πλήρη ανάλυση, επιφορτώστε τη, αλλιώς αλλάξτε παρακαλώ το όνομα του αρχείου.",
        "fileexists-forbidden": "Ένα αρχείο με αυτό το όνομα υπάρχει ήδη˙ εάν ακόμη θέλετε να επιφορτώσωτε αυτό το αρχείο παρακαλώ πηγαίνετε πίσω και επιφορτώστε το υπό ένα νέο όνομα. [[File:$1|thumb|center|$1]]",
        "license-header": "Αδειοδότηση",
        "nolicense": "Καμία επιλεγμένη",
        "license-nopreview": "(Μη διαθέσιμη προεπισκόπηση)",
-       "upload_source_url": " (ένα έγκυρο, δημόσια προσβάσιμο URL)",
+       "upload_source_url": "(το επιλεγμένο σας αρχείο από μια έγκυρη, δημόσια προσβάσιμη διεύθυνση URL)",
        "upload_source_file": "(το επιλεγμένο αρχείο από τον υπολογιστή σας)",
        "listfiles-delete": "διαγραφή",
        "listfiles-summary": "Αυτή η ειδική σελίδα δείχνει όλα τα επιφορτωμένα αρχεία.",
        "statistics": "Στατιστικά",
        "statistics-header-pages": "Στατιστικά σελίδων",
        "statistics-header-edits": "Στατιστικά επεξεργασιών",
-       "statistics-header-views": "Î\95μÏ\86άνιÏ\83η στατιστικών",
+       "statistics-header-views": "ΠÏ\81οβολή στατιστικών",
        "statistics-header-users": "Στατιστικά χρηστών",
        "statistics-header-hooks": "Άλλα στατιστικά",
        "statistics-articles": "Σελίδες περιεχομένου",
        "pageswithprop-submit": "Μετάβαση",
        "doubleredirects": "Διπλές ανακατευθύνσεις",
        "doubleredirectstext": "Αυτή η σελίδα συγκαταλέγει σελίδες οι οποίες ανακατευθύνουν σε άλλες σελίδες ανακατεύθυνσης. Κάθε σειρά περιέχει συνδέσμους προς την πρώτη και τη δεύτερη σελίδα ανακατεύθυνσης, όπως επίσης και την πρώτη αράδα του κειμένου στη δεύτερη σελίδα ανακατεύθυνσης η οποία και είναι, κανονικά, ο πραγματικός προορισμός της ανακατεύθυνσης -εκεί δηλαδή όπου θα έπρεπε να είχατε οδηγηθεί από την αρχή. Τα <del>διεγραμμένα</del> λήμματα έχουν επιλυθεί.",
-       "double-redirect-fixed-move": "Η [[$1]] έχει μετακινηθεί, τώρα είναι ανακατεύθυνση στην [[$2]]",
-       "double-redirect-fixed-maintenance": "Î\94ιÏ\8cÏ\81θÏ\89Ï\83η Î´Î¹Ï\80λήÏ\82 Î±Î½Î±ÎºÎ±Ï\84εÏ\8dθÏ\85νÏ\83ηÏ\82 Î±Ï\80Ï\8c Ï\84ο [[$1]] Ï\83Ï\84ο [[$2]].",
+       "double-redirect-fixed-move": "Η [[$1]] έχει μετακινηθεί.\nΕνημερώθηκε αυτόματα και τώρα είναι ανακατεύθυνση στην [[$2]].",
+       "double-redirect-fixed-maintenance": "Î\91Ï\85Ï\84Ï\8cμαÏ\84η Î´Î¹Ï\8cÏ\81θÏ\89Ï\83η Î´Î¹Ï\80λήÏ\82 Î±Î½Î±ÎºÎ±Ï\84εÏ\8dθÏ\85νÏ\83ηÏ\82 Î±Ï\80Ï\8c [[$1]] Ï\83ε [[$2]] Ï\83ε ÎµÏ\81γαÏ\83ία Ï\83Ï\85νÏ\84ήÏ\81ηÏ\83ηÏ\82.",
        "double-redirect-fixer": "Διορθωτής ανακατευθύνσεων",
        "brokenredirects": "Λανθασμένες ανακατευθύνσεις",
        "brokenredirectstext": "Οι παρακάτω ανακατευθύνσεις οδηγούν σε σελίδες που δεν υπάρχουν:",
        "activeusers-noresult": "Δεν βρέθηκε χρήστης.",
        "listgrouprights": "Δικαιώματα ομάδων χρηστών",
        "listgrouprights-summary": "Ακόλουθεί μία λίστα με τις ομάδες χρηστών σε αυτό το wiki καθώς και με τα δικαιώματα πρόσβασης αυτών.\nΕνδέχεται να περιέχει [[{{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:Δικαιώματα ομάδων",
        "listgrouprights-removegroup-self": "Μπορεί να αφαιρέσει {{PLURAL:$2|ομάδα|ομάδες}} από το δικό σας λογαριασμό: $1",
        "listgrouprights-addgroup-self-all": "Μπορεί να προσθέσει όλες τις ομάδες στο δικό σας λογαριασμό",
        "listgrouprights-removegroup-self-all": "Μπορεί να αφαιρέσει όλες τις ομάδες από το δικό σας λογαριασμό",
+       "listgrouprights-namespaceprotection-header": "Περιορισμοί ονοματοχώρων",
        "listgrouprights-namespaceprotection-namespace": "Ονοματοχώρος",
+       "listgrouprights-namespaceprotection-restrictedto": "Δικαίωμα(τα) που επιτρέπει(ουν) σε χρήστη να επεξεργαστεί",
+       "trackingcategories": "Παρακολούθηση κατηγοριών",
        "trackingcategories-name": "Όνομα μηνύματος",
        "trackingcategories-desc": "Κριτήρια συμπερίληψης κατηγορίας",
        "post-expand-template-inclusion-category-desc": "Το μέγεθος της σελίδας είναι μεγαλύτερο από <code>$wgMaxArticleSize</code> μετά την επέκταση όλων των προτύπων, έτσι ώστε ορισμένα πρότυπα δεν έχουν αναπτυχθεί.",
+       "hidden-category-category-desc": "Η κατηγορία περιέχει <code><nowiki>__HIDDENCAT__</nowiki></code> στο περιεχόμενο της σελίδας της, που την εμποδίζει εκ προεπιλογής να εμφανίζεται στο πλαίσιο συνδέσμων κατηγοριών των σελίδων.",
        "trackingcategories-nodesc": "Καμία διαθέσιμη περιγραφή.",
+       "trackingcategories-disabled": "Η κατηγορία είναι απενεργοποιημένη",
        "mailnologin": "Δεν υπάρχει διεύθυνση παραλήπτη.",
        "mailnologintext": "Πρέπει να έχετε [[Special:UserLogin|συνδεθεί]] και να έχετε δηλώσει\nμια έγκυρη ηλεκτρονική διεύθυνση στις [[Special:Preferences|Προτιμήσεις]]\nγια να στείλετε e-mail σε άλλους χρήστες.",
        "emailuser": "Αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου σε αυτόν τον χρήστη",
        "watchnologin": "Δεν έχετε συνδεθεί.",
        "addwatch": "Προσθήκη στη λίστα παρακολούθησης",
        "addedwatchtext": "Η σελίδα «[[:$1]]» έχει προστεθεί στη [[Special:Watchlist|λίστα παρακολούθησής σας]].\nΜελλοντικές αλλαγές σε αυτή τη σελίδα και στη συσχετισμένη σελίδα συζήτησής της θα εμφανίζονται εδώ.",
+       "addedwatchtext-short": "Η σελίδα «$1» έχει προστεθεί στην λίστα παρακολούθησής σας.",
        "removewatch": "Αφαίρεση από τη λίστα παρακολούθησης",
        "removedwatchtext": "Η σελίδα \"[[:$1]]\" έχει αφαιρεθεί από [[Special:Watchlist|τη λίστα παρακολούθησής σας]].",
+       "removedwatchtext-short": "Η σελίδα «$1» έχει αφαιρεθεί από τη λίστα παρακολούθησής σας.",
        "watch": "Παρακολούθηση",
        "watchthispage": "Παρακολούθηση αυτής της σελίδας",
        "unwatch": "Παύση παρακολούθησης",
        "unwatchthispage": "Παύση παρακολούθησης αυτής της σελίδας",
        "notanarticle": "Η σελίδα αυτή δεν είναι σελίδα περιεχομένου.",
        "notvisiblerev": "Η έκδοση έχει διαγραφεί",
-       "watchlist-details": "{{PLURAL:$1|$1 σελίδα|$1 σελίδες}} στη λίστα παρακολούθησης σας, χωρίς να προσμετρούνται οι σελίδες συζήτησης.",
+       "watchlist-details": "{{PLURAL:$1|$1 Ï\83ελίδα|$1 Ï\83ελίδεÏ\82}} Ï\83Ï\84η Î»Î¯Ï\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ηÏ\82 Ï\83αÏ\82, Ï\87Ï\89Ï\81ίÏ\82 Î½Î± Ï\80Ï\81οÏ\83μεÏ\84Ï\81οÏ\8dνÏ\84αι Î¾ÎµÏ\87Ï\89Ï\81ιÏ\83Ï\84ά Î¿Î¹ Ï\83ελίδεÏ\82 Ï\83Ï\85ζήÏ\84ηÏ\83ηÏ\82.",
        "wlheader-enotif": "Η ειδοποίηση ηλεκτρονικού ταχυδρομείου ενεργοποιήθηκε.",
        "wlheader-showupdated": "Σελίδες που έχουν υποστεί αλλαγές από την τελευταία φορά που τις επισκεφθήκατε εμφανίζονται με '''έντονους χαρακτήρες'''.",
-       "wlnote": "Παρακάτω είναι {{PLURAL:$1|η πιο πρόσφατη αλλαγή|οι '''$1''' πιο πρόσφατες αλλαγές}} κατά τη διάρκεια {{PLURAL:$2|της τελευταίας ώρας|των '''$2''' τελευταίων ωρών}} ως προς την $3, $4.",
+       "wlnote": "Παρακάτω είναι {{PLURAL:$1|η πιο πρόσφατη αλλαγή|οι <strong>$1</strong> πιο πρόσφατες αλλαγές}} κατά τη διάρκεια {{PLURAL:$2|της τελευταίας ώρας|των <strong>$2</strong> τελευταίων ωρών}} ως προς τις $3 στις $4.",
        "wlshowlast": "Εμφάνιση των τελευταίων $1 ωρών $2 ημερών $3",
        "watchlist-options": "Επιλογές λίστας παρακολούθησης",
        "watching": "Παρακολούθηση...",
        "enotif_lastvisited": "Δείτε το $1 για όλες τις αλλαγές που έγιναν από την τελευταία σας επίσκεψη.",
        "enotif_lastdiff": "Δείτε το $1 για να εμφανίσετε αυτή την αλλαγή.",
        "enotif_anon_editor": "ανώνυμος χρήστης $1",
-       "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Î\91γαÏ\80ηÏ\84έ|Î\91γαÏ\80ηÏ\84ή}} $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nΠεÏ\81ιγÏ\81αÏ\86ή ÎµÏ\80εξεÏ\81γαÏ\83ίαÏ\82: $PAGESUMMARY $PAGEMINOREDIT\n\nÎ\95Ï\80ικοινÏ\89νία Î¼Îµ Ï\84ο Ï\87Ï\81ήÏ\83Ï\84η Ï\80οÏ\85 Î­ÎºÎ±Î½Îµ Ï\84ην ÎµÏ\80εξεÏ\81γαÏ\83ία:\nηλεκÏ\84Ï\81ονική Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nÎ\94εν Î¸Î± Ï\85Ï\80άÏ\81ξοÏ\85ν Î¬Î»Î»ÎµÏ\82 ÎµÎ¹Î´Î¿Ï\80οιήÏ\83ειÏ\82 Ï\83ε Ï\80εÏ\81ίÏ\80Ï\84Ï\89Ï\83η Ï\80εÏ\81αιÏ\84έÏ\81Ï\89 Î´Ï\81αÏ\83Ï\84ηÏ\81ιÏ\8cÏ\84ηÏ\84αÏ\82 Î±Î½ Î´ÎµÎ½ ÎµÏ\80ιÏ\83κεÏ\86θείÏ\84ε Ï\84η Ï\83ελίδα. Î\9cÏ\80οÏ\81είÏ\84ε ÎµÏ\80ίÏ\83ηÏ\82 Î½Î± ÎµÏ\80αναÏ\86έÏ\81εÏ\84ε Ï\84ην ÎµÏ\80ιλογή ÎµÎ¹Î´Î¿Ï\80οίηÏ\83ηÏ\82 Î³Î¹Î± Ï\8cλεÏ\82 Ï\84ιÏ\82 Ï\80αÏ\81ακολοÏ\85θοÏ\8dμενεÏ\82 Ï\83ελίδεÏ\82 Ï\83Ï\84η Î»Î¯Ï\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82 Ï\83αÏ\82.\n\n                         Î¦Î¹Î»Î¹ÎºÎ¬,\n                         Tο σύστημα ειδοποίησης του ιστοχώρου {{SITENAME}}\n\n--\nΓια να αλλάξετε τις προτιμήσεις των ειδοποιήσεων ηλεκτρονικού ταχυδρομείου, επισκεφτείτε το\n{{canonicalurl:{{#special:Preferences}}}}\n\nΓια να αλλάξετε τις προτιμήσεις της λίστας παρακολούθησής σας, επισκεφτείτε το\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nΓια να διαγράψετε την σελίδα από την λίστα παρακολούθησής σας, επισκεφτείτε το\n$UNWATCHURL\n\nΠαρατηρήσεις και περισσότερη βοήθεια:\n$HELPPAGE",
+       "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Î\91γαÏ\80ηÏ\84έ|Î\91γαÏ\80ηÏ\84ή}} $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nΠεÏ\81ιγÏ\81αÏ\86ή ÎµÏ\80εξεÏ\81γαÏ\83ίαÏ\82: $PAGESUMMARY $PAGEMINOREDIT\n\nÎ\95Ï\80ικοινÏ\89νία Î¼Îµ Ï\84ο Ï\87Ï\81ήÏ\83Ï\84η Ï\80οÏ\85 Î­ÎºÎ±Î½Îµ Ï\84ην ÎµÏ\80εξεÏ\81γαÏ\83ία:\nδιεÏ\8dθÏ\85νÏ\83η Î·Î»ÎµÎºÏ\84Ï\81ονικήÏ\82 Î±Î»Î»Î·Î»Î¿Î³Ï\81αÏ\86ίαÏ\82: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nÎ\94εν Î¸Î± Ï\85Ï\80άÏ\81ξοÏ\85ν Î¬Î»Î»ÎµÏ\82 ÎµÎ¹Î´Î¿Ï\80οιήÏ\83ειÏ\82 Ï\83ε Ï\80εÏ\81ίÏ\80Ï\84Ï\89Ï\83η Ï\80εÏ\81αιÏ\84έÏ\81Ï\89 Î´Ï\81αÏ\83Ï\84ηÏ\81ιÏ\8cÏ\84ηÏ\84αÏ\82 Î±Î½ Î´ÎµÎ½ ÎµÏ\80ιÏ\83κεÏ\86θείÏ\84ε Ï\84η Ï\83ελίδα Î­Ï\87ονÏ\84αÏ\82 ÎºÎ¬Î½ÎµÎ¹ Ï\83Ï\8dνδεÏ\83η. Î\9cÏ\80οÏ\81είÏ\84ε ÎµÏ\80ίÏ\83ηÏ\82 Î½Î± ÎµÏ\80αναÏ\86έÏ\81εÏ\84ε Ï\84ην ÎµÏ\80ιλογή ÎµÎ¹Î´Î¿Ï\80οίηÏ\83ηÏ\82 Î³Î¹Î± Ï\8cλεÏ\82 Ï\84ιÏ\82 Ï\80αÏ\81ακολοÏ\85θοÏ\8dμενεÏ\82 Ï\83ελίδεÏ\82 Ï\83Ï\84η Î»Î¯Ï\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82 Ï\83αÏ\82.\n\nΦιλικά, \nÏ\84ο σύστημα ειδοποίησης του ιστοχώρου {{SITENAME}}\n\n--\nΓια να αλλάξετε τις προτιμήσεις των ειδοποιήσεων ηλεκτρονικού ταχυδρομείου, επισκεφτείτε το\n{{canonicalurl:{{#special:Preferences}}}}\n\nΓια να αλλάξετε τις προτιμήσεις της λίστας παρακολούθησής σας, επισκεφτείτε το\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nΓια να διαγράψετε την σελίδα από την λίστα παρακολούθησής σας, επισκεφτείτε το\n$UNWATCHURL\n\nΠαρατηρήσεις και περισσότερη βοήθεια:\n$HELPPAGE",
        "created": "δημιουργήθηκε",
        "changed": "έχει αλλάξει",
        "deletepage": "Διαγραφή σελίδας",
        "deletecomment": "Λόγος:",
        "deleteotherreason": "Άλλος/πρόσθετος λόγος:",
        "deletereasonotherlist": "Άλλος λόγος",
-       "deletereason-dropdown": "*Συνηθισμένοι λόγοι διαγραφής\n** Αίτηση του δημιουργού της\n** Παραβίαση των πνευματικών δικαιωμάτων\n** Βανδαλισμός",
+       "deletereason-dropdown": "* Συνηθισμένοι λόγοι διαγραφής\n** Σπαμ\n** Βανδαλισμός\n** Παραβίαση πνευματικών δικαιωμάτων\n** Αίτηση του δημιουργού της\n** Κατεστραμμένη ανακατεύθυνση",
        "delete-edit-reasonlist": "Επεξεργασία λόγων διαγραφής",
        "delete-toobig": "Αυτή η σελίδα έχει μεγάλο ιστορικό τροποποιήσεων, πάνω από $1 {{PLURAL:$1|τροποποίηση|τροποποιήσεις}}.\nΗ διαγραφή τέτοιων σελίδων έχει περιοριστεί για την αποφυγή τυχαίας αναστάτωσης του {{SITENAME}}.",
        "delete-warning-toobig": "Αυτή η σελίδα έχει μεγάλο ιστορικό τροποποιήσεων, πάνω από $1 {{PLURAL:$1|τροποποίηση|τροποποιήσεις}}.\nΗ διαγραφή της μπορεί να αναστατώσει τη λειτουργία της βάσης δεδομένων του {{SITENAME}}. Συνιστούμε μεγάλη προσοχή.",
        "protect-locked-blocked": "Δεν μπορείτε να αλλάξετε επίπεδα προστασίας ενώ είστε σε φραγή.\nΕδώ είναι οι τρέχουσες ρυθμίσεις για τη σελίδα '''$1''':",
        "protect-locked-dblock": "Τα επίπεδα προστασίας δεν μπορούν να αλλαχθούν λόγω ενός ενεργού κλεδώματος της βάσης δεδομένων.\nΕδώ είναι οι τρέχουσες ρυθμίσεις για τη σελίδα '''$1''':",
        "protect-locked-access": "Ο λογαριασμός σας δεν έχει δικαίωμα να αλλάξει τα επίπεδα προστασίας σελίδας.\nΕδώ είναι οι τρέχουσες ρυθμίσεις για τη σελίδα '''$1''':",
-       "protect-cascadeon": "Î\91Ï\85Ï\84ή Î· Ï\83ελίδα ÎµÎ¯Î½Î±Î¹ Ï\80Ï\81οÏ\82 Ï\84ο Ï\80αÏ\81Ï\8cν Ï\80Ï\81οÏ\83Ï\84αÏ\84εÏ\85μένη ÎµÏ\80ειδή Ï\80εÏ\81ιλαμβάνεÏ\84αι {{PLURAL:$1|Ï\83Ï\84ην Î±ÎºÏ\8cλοÏ\85θη Ï\83ελίδα, Î· Î¿Ï\80οία Î­Ï\87ει|Ï\83Ï\84ιÏ\82 Î±ÎºÏ\8cλοÏ\85θεÏ\82 Ï\83ελίδεÏ\82, Î¿Î¹ Î¿Ï\80οίεÏ\82 Î­Ï\87οÏ\85ν}} Ï\84η Î´Î¹Î±Î´Î¿Ï\87ική Ï\80Ï\81οÏ\83Ï\84αÏ\83ία ÎµÎ½ÎµÏ\81γοÏ\80οιημένη. Î\9cÏ\80οÏ\81είÏ\84ε Î½Î± Î±Î»Î»Î¬Î¾ÎµÏ\84ε Ï\84ο ÎµÏ\80ίÏ\80εδο Ï\80Ï\81οÏ\83Ï\84αÏ\83ίαÏ\82 Î±Ï\85Ï\84ήÏ\82 Ï\84ηÏ\82 Ï\83ελίδαÏ\82, Î±Î»Î»Î¬ Î´ÎµÎ½ Î¸Î± ÎµÏ\80ηÏ\81εάÏ\83ει τη διαδοχική προστασία.",
+       "protect-cascadeon": "Î\91Ï\85Ï\84ή Î· Ï\83ελίδα ÎµÎ¯Î½Î±Î¹ Ï\80Ï\81οÏ\82 Ï\84ο Ï\80αÏ\81Ï\8cν Ï\80Ï\81οÏ\83Ï\84αÏ\84εÏ\85μένη ÎµÏ\80ειδή Ï\80εÏ\81ιλαμβάνεÏ\84αι {{PLURAL:$1|Ï\83Ï\84ην Î±ÎºÏ\8cλοÏ\85θη Ï\83ελίδα, Î· Î¿Ï\80οία Î­Ï\87ει|Ï\83Ï\84ιÏ\82 Î±ÎºÏ\8cλοÏ\85θεÏ\82 Ï\83ελίδεÏ\82, Î¿Î¹ Î¿Ï\80οίεÏ\82 Î­Ï\87οÏ\85ν}} Ï\84η Î´Î¹Î±Î´Î¿Ï\87ική Ï\80Ï\81οÏ\83Ï\84αÏ\83ία ÎµÎ½ÎµÏ\81γοÏ\80οιημένη. Î\91λλαγέÏ\82 Ï\83Ï\84ο ÎµÏ\80ίÏ\80εδο Ï\80Ï\81οÏ\83Ï\84αÏ\83ίαÏ\82 Î±Ï\85Ï\84ήÏ\82 Ï\84ηÏ\82 Ï\83ελίδαÏ\82 Î´ÎµÎ½ Î¸Î± ÎµÏ\80ηÏ\81εάÏ\83οÏ\85ν τη διαδοχική προστασία.",
        "protect-default": "Να επιτρέπονται όλοι οι χρήστες",
        "protect-fallback": "Να επιτρέπεται μόνο σε χρήστες με δικαιώματα «$1»",
        "protect-level-autoconfirmed": "Να επιτρέπονται μόνο αυτοεπιβεβαιωμένοι χρήστες",
        "contributions-title": "Συνεισφορές χρήστη για {{GENDER:$1|τον|την}} $1",
        "mycontris": "Συνεισφορές",
        "contribsub2": "Για {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Ο λογαριασμός χρήστη «$1» δεν είναι εγγεγραμμένος.",
        "nocontribs": "Δεν βρέθηκαν αλλαγές με αυτά τα κριτήρια.",
        "uctop": "(τρέχουσα)",
        "month": "Από το μήνα (και νωρίτερα):",
        "sp-contributions-newbies-sub": "Για νέους λογαριασμούς",
        "sp-contributions-newbies-title": "Συνεισφορές χρηστών για νέους λογαριασμούς",
        "sp-contributions-blocklog": "αρχείο καταγραφών φραγών",
+       "sp-contributions-suppresslog": "διαγεγραμμένες συνεισφορές χρήστη",
        "sp-contributions-deleted": "διαγραμμένες συνεισφορές χρήστη",
        "sp-contributions-uploads": "ανεβάσματα αρχείων",
        "sp-contributions-logs": "καταγραφές",
        "sp-contributions-search": "Αναζήτηση για συνεισφορές",
        "sp-contributions-username": "Διεύθυνση IP ή όνομα χρήστη:",
        "sp-contributions-toponly": "Εμφάνιση μόνο των επεξεργασιών που είναι πρόσφατες αναθεωρήσεις",
+       "sp-contributions-newonly": "Εμφάνιση μόνο των επεξεργασιών που είναι δημιουργία σελίδας",
        "sp-contributions-submit": "Αναζήτηση",
        "whatlinkshere": "Τι συνδέει εδώ",
        "whatlinkshere-title": "Σελίδες που συνδέουν στη σελίδα «$1»",
        "blockipsuccesstext": "{{GENDER:$1|Ο|Η}} [[Special:Contributions/$1|$1]] έχει υποστεί φραγή.<br />\nΔείτε τον [[Special:BlockList|κατάλογο φραγών]] για να εποπτεύσετε τις φραγές.",
        "ipb-blockingself": "Είστε έτοιμος να επιβάλετε φραγή στον ευατό σας! Είστε σίγουροι ότι θέλετε να το κάνετε αυτό;",
        "ipb-confirmhideuser": "Είστε {{GENDER:|έτοιμος|έτοιμη}} να μπλοκάρετε ένα χρήστη με ενεργοποιημένη την \"απόκρυψη χρήστη\" . Αυτό θα καταστείλει το όνομα του χρήστη σε όλες τις λίστες και τις καταχωρήσεις ημερολογίου. Είστε {{GENDER:|σίγουρος|σίγουρη}} ότι θέλετε να το κάνετε αυτό;",
+       "ipb-confirmaction": "Εάν είστε σίγουροι ότι θέλετε πραγματικά να το κάνετε αυτό, παρακαλούμε τσεκάρετε το πεδίο «{{int:ipb-confirm}}» στο κάτω μέρος.",
        "ipb-edit-dropdown": "Επεξεργασία λόγων φραγής",
        "ipb-unblock-addr": "Τερμάτισε τη φραγή του/της $1",
        "ipb-unblock": "Τερμάτισε τη φραγή για ένα όνομα χρήστη ή μια διεύθυνση IP",
        "movepagetalktext": "Η σελίδα συζήτησης που αντιστοιχεί, εάν υπάρχει, θα μετακινηθεί αυτόματα μαζί με αυτήν '''έκτός αν:'''\n*Μετακινείτε τη σελίδα σε διαφορετική περιοχή (namespace),\n*Υπάρχει κάτω από το νέο όνομα μια σελίδα συζήτησης που δεν είναι κενή, ή\n*Έχετε αφαιρέσει τη σημείωση (check) από το κουτάκι που υπάρχει παρακάτω.\n\nΣε αυτές τις περιπτώσεις, θα πρέπει να μετακινήσετε (ή να ενσωματώσετε αν το θέλετε) τη σελίδα με αντιγραφή-και-επικόλληση.",
        "movearticle": "Μετακίνηση σελίδας",
        "moveuserpage-warning": "'''Προσοχή:''' Ετοιμάζεστε να μετακινήσετε μια σελίδα χρήστη. Σημειώστε παρακαλώ ότι θα μετακινηθεί μόνο η σελίδα και ο χρήστης '''δεν''' θα μετονομαστεί.",
+       "movecategorypage-warning": "<strong>Προειδοποίηση:</strong>Πάτε να μετακινήσετε μια σελίδα κατηγορίας. Παρακαλούμε να σημειωθεί ότι μόνο η σελίδα θα μετακινηθεί και τυχόν σελίδες στην παλιά κατηγορία <em>δεν</em> θα επανακατηγοριοποιηθούν στη νέα κατηγορία.",
        "movenologintext": "Για να μετακινήσετε μια σελίδα πρέπει να είστε εγγεγραμένος χρήστης και [[Special:UserLogin|να έχετε συνδεθεί]] στο Wiκi.",
        "movenotallowed": "Δεν έχετε άδεια να μετακινείτε σελίδες.",
        "movenotallowedfile": "Δεν έχετε άδεια να μετακινείτε αρχεία.",
        "cant-move-user-page": "Δεν έχετε άδεια για να μετακινήσετε σελίδες χρηστών (παρά μόνο υποσελίδες).",
        "cant-move-to-user-page": "Δεν έχετε άδεια για να μετακινήσετε μια σελίδα σε σελίδα χρήστη (παρά μόνο σε υποσελίδα χρήστη).",
+       "cant-move-category-page": "Δεν έχετε άδεια να μετακινείτε σελίδες κατηγοριών.",
+       "cant-move-to-category-page": "Δεν έχετε άδεια να μετακινήσετε μια σελίδα σε σελίδα της κατηγορίας.",
        "newtitle": "νέος τίτλος",
        "move-watch": "Παρακολούθησε αυτή τη σελίδα",
        "movepagebtn": "Μετακίνηση σελίδας",
        "import": "Εισαγωγή σελίδων",
        "importinterwiki": "Εισαγωγή από άλλο Wiki",
        "import-interwiki-text": "Επιλέξτε ένα wiki και τίτλο σελίδας για την εισαγωγή.\nΟι ημερομηνίες των αναθεωρήσεων και τα ονόματα των συντακτών θα διατηρηθούν.\nΌλες οι ενέργειες εισαγωγής μεταξύ wiki καταγράφονται στο [[Special:Log/import|αρχείο καταγραφής εισαγωγών]].",
+       "import-interwiki-sourcewiki": "Πηγαίο wiki:",
+       "import-interwiki-sourcepage": "Πηγαία σελίδα:",
        "import-interwiki-history": "Αντιγραφή όλων των εκδόσεων του ιστορικού για αυτή τη σελίδα",
        "import-interwiki-templates": "Συμπερίληψη όλων των προτύπων",
        "import-interwiki-submit": "Εισαγωγή",
        "import-upload": "Επιφόρτωση δεδομένων XML",
        "import-token-mismatch": "Απώλεια των στοιχείων της συνόδου. Παρακαλούμε προσπαθήστε ξανά.",
        "import-invalid-interwiki": "Δεν είναι δυνατή η εισαγωγή από το καθορισμένο wiki.",
-       "import-error-edit": "Η σελίδα \"$1\" δεν εισήχθηκε επειδή δεν επιτρέπεται να το επεξεργαστείτε.",
-       "import-error-create": "Η σελίδα \"$1\" δεν εισήχθηκε επειδή δεν επιτρέπεται να τη δημιουργήσετε.",
-       "import-error-interwiki": "Η σελίδα \" $1 \" δεν έχει εισαχθεί, επειδή το όνομα της δεσμευμένο για εξωτερική σύνδεση (interwiki).",
-       "import-error-special": "Η σελίδα \"$1\" δεν εισήχθη επειδή ανήκει σε έναν ειδικό χώρο ονομάτων που δεν επιτρέπει σελίδες.",
-       "import-error-invalid": "Η σελίδα \"$1\" δεν εισήχθη επειδή το όνομά της δεν είναι έγκυρο.",
+       "import-error-edit": "Η σελίδα «$1» δεν εισήχθη επειδή δεν σας επιτρέπεται να την επεξεργαστείτε.",
+       "import-error-create": "Η σελίδα «$1» δεν εισήχθη επειδή δεν σας επιτρέπεται να την δημιουργήσετε.",
+       "import-error-interwiki": "Η σελίδα «$1» δεν εισήχθη επειδή το όνομα της είναι δεσμευμένο για εξωτερική σύνδεση (interwiki).",
+       "import-error-special": "Η σελίδα «$1» δεν εισήχθη επειδή ανήκει σε έναν ειδικό ονοματοχώρο που δεν επιτρέπει σελίδες.",
+       "import-error-invalid": "Η σελίδα «$1» δεν εισήχθη επειδή το όνομά με το οποίο επρόκειτο να εισαχθεί δεν είναι έγκυρο σε αυτό το wiki.",
        "import-options-wrong": "Λάθος {{PLURAL:$2|επιλογή|επιλογές}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Η δεδομένη ριζική σελίδα είναι μη έγκυρος τίτλος",
        "importlogpage": "Αρχείο καταγραφής εισαγωγών",
        "importlogpagetext": "Διαχειριστικές εισαγωγές σελίδων με ιστορικό επεξεργασίας από άλλα wiki.",
        "import-logentry-upload": "εισάχθηκε η σελίδα [[$1]] με επιφόρτωση αρχείου",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|αναθεώρηση|αναθεωρήσεις}}",
+       "import-logentry-upload-detail": "{{PLURAL:$1|Εισήχθη $1 αναθεώρηση|Εισήχθησαν $1 αναθεωρήσεις}}",
        "import-logentry-interwiki": "η σελίδα $1 εισάχθηκε μεταξύ wiki",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|αναθεώρηση|αναθεωρήσεις}} από $2",
+       "import-logentry-interwiki-detail": "{{PLURAL:$1|Εισήχθη $1 αναθεώρηση|Εισήχθησαν $1 αναθεωρήσεις}} από $2",
        "javascripttest": "Δοκιμή JavaScript",
        "javascripttest-title": "Εκτελούνται  $1  δοκιμές",
        "javascripttest-pagetext-noframework": "Αυτή η σελίδα είναι δεσμευμένη για την εκτέλεση δοκιμών σε JavaScript.",
        "newimages-summary": "Αυτή η ειδική σελίδα δείχνει τα πιο πρόσφατα φορτωμένα αρχεία.",
        "newimages-legend": "Φίλτρο",
        "newimages-label": "Όνομα αρχείου (ή μέρος αυτού):",
+       "newimages-showbots": "Εμφάνιση αρχείων ανεβασμένων από ρομπότ",
        "noimages": "Δεν υπάρχουν εικόνες.",
        "ilsubmit": "Αναζήτηση",
        "bydate": "ημερομηνίας",
        "confirm-watch-top": "Προσθήκη αυτής της σελίδας στη λίστα παρακολούθησης σας;",
        "confirm-unwatch-button": "Εντάξει",
        "confirm-unwatch-top": "Κατάργηση αυτής της σελίδας από τη λίστα παρακολούθησης σας;",
-       "quotation-marks": "\"$1\"",
+       "quotation-marks": "«$1»",
        "imgmultipageprev": "← προηγούμενη σελίδα",
        "imgmultipagenext": "επόμενη σελίδα →",
        "imgmultigo": "Πήγαινε!",
        "watchlistedit-raw-done": "Η λίστα παρακολούθησής σας ενημερώθηκε.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 σελίδα|$1 σελίδες}} προστέθηκαν:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 σελίδα|$1 σελίδες}} αφαιρέθηκαν:",
+       "watchlistedit-clear-explain": "Όλοι οι τίτλοι θα αφαιρεθούν από τη λίστα παρακολούθησής σας",
        "watchlistedit-clear-titles": "Τίτλοι:",
        "watchlistedit-clear-submit": "Καθαρίστε τη λίστα παρακολούθησης (αυτό είναι μόνιμο!)",
+       "watchlistedit-clear-done": "Η λίστα παρακολούθησής σας έχει καθαριστεί.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 τίτλος αφαιρέθηκε|$1 τίτλοι αφαιρέθηκαν}}:",
        "watchlistedit-too-many": "Υπάρχουν υπερβολικά πολλές σελίδες και δεν μπορούν να εμφανιστούν εδώ.",
        "watchlisttools-view": "Προβολή σχετικών αλλαγών",
        "watchlisttools-edit": "Προβολή και επεξεργασία λίστας παρακολούθησης",
        "logentry-rights-rights": "{{GENDER:$2|Ο|Η}} $1 άλλαξε την ιδιότητα μέλους ομάδας για {{GENDER:$3|τον|την}} $3 από $4 σε $5",
        "logentry-rights-rights-legacy": "{{GENDER:$2|Ο|Η}} $1 άλλαξε την ιδιότητα μέλους ομάδας {{GENDER:$1|του|της}} $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|προωθήθηκε}} αυτόματα από το $4 στο $5",
+       "logentry-upload-upload": "{{GENDER:$2|Ο|Η}} $1 ανέβασε το $3",
+       "logentry-upload-overwrite": "{{GENDER:$2|Ο|Η}} $1 ανέβασε μια νέα έκδοση του $3",
+       "logentry-upload-revert": "{{GENDER:$2|Ο|Η}} $1 ανέβασε το $3",
        "rightsnone": "(κανένα)",
        "feedback-bugornote": "Εάν είστε έτοιμοι να περιγράψετε ένα τεχνικό πρόβλημα λεπτομερώς παρακαλούμε [$1  κάντε μια αναφορά σφάλματος].\nΔιαφορετικά, μπορείτε να χρησιμοποιήσετε την παρακάτω απλή φόρμα. Το σχόλιό σας θα προστεθεί στη σελίδα \"[$3  $2]\", μαζί με το όνομα χρήστη σας.",
        "feedback-subject": "Θέμα:",
        "api-error-overwrite": "Αντικατάσταση ενός υπάρχοντος αρχείου δεν επιτρέπεται.",
        "api-error-stashfailed": "Εσωτερικό σφάλμα: ο διακομιστής απέτυχε να αποθηκεύσει το προσωρινό αρχείο.",
        "api-error-publishfailed": "Εσωτερικό σφάλμα: ο διακομιστής απέτυχε να αποθηκεύσει το προσωρινό αρχείο.",
+       "api-error-stasherror": "Παρουσιάστηκε ένα σφάλμα κατά το ανέβασμα του αρχείου στην κρύπτη.",
        "api-error-timeout": "Ο διακομιστής δεν αποκρίθηκε εντός του αναμενόμενου χρόνου.",
        "api-error-unclassified": "Προέκυψε ένα άγνωστο σφάλμα.",
        "api-error-unknown-code": "Άγνωστο σφάλμα: \"$1\"",
        "limitreport-ppvisitednodes": "Καταμέτρηση κόμβων επισκεφθέντων από τον προεπεξεργαστή",
        "limitreport-ppgeneratednodes": "Καταμέτρηση κόμβων παραχθέντων από τον προεπεξεργαστή",
        "limitreport-postexpandincludesize": "Μέγεθος συμπερίληψης πριν την ανάπτυξη",
+       "limitreport-postexpandincludesize-value": "$1 από $2 {{PLURAL:$2|byte|bytes}}",
        "limitreport-templateargumentsize": "Μέγεθος ορισμάτων προτύπων",
+       "limitreport-templateargumentsize-value": "$1 από $2 {{PLURAL:$2|byte|bytes}}",
        "limitreport-expansiondepth": "Μεγαλύτερο βάθος ανάπτυξης",
        "limitreport-expensivefunctioncount": "Πλήθος ακριβών συναρτήσεων συντακτικού αναλυτή",
        "expandtemplates": "Επέκτεινε τα πρότυπα",
        "expand_templates_generate_xml": "Εμφάνιση δέντρου συντακτικής ανάλυσης XML",
        "expand_templates_generate_rawhtml": "Εμφάνιση ανεπεξέργαστης HTML",
        "expand_templates_preview": "Προεπισκόπηση",
+       "pagelanguage": "Επιλογέας γλώσσας σελίδας",
        "pagelang-name": "Σελίδα",
        "pagelang-language": "Γλώσσα",
        "pagelang-use-default": "Χρήση προεπιλεγμένης γλώσσας",
        "pagelang-select-lang": "Επιλογή γλώσσας",
+       "right-pagelang": "Αλλαγή γλώσσας σελίδας",
+       "action-pagelang": "αλλαγή της γλώσσας σελίδας",
        "default-skin-not-found-row-enabled": "* <code>$1</code> /$2 (ενεργοποιημένο)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''απενεργοποιημένο''')"
 }
index d6d22ff..e1143b5 100644 (file)
        "showpreview": "Show preview",
        "showdiff": "Show changes",
        "blankarticle": "<strong>Warning:</strong> The page you are creating is blank.\nIf you click \"{{int:savearticle}}\" again, the page will be created without any content.",
-       "anoneditwarning": "<strong>Warning:</strong> You are not logged in.\nYour IP address will be recorded in this page's edit history.",
+       "anoneditwarning": "<strong>Warning:</strong> You are not logged in. Your IP address will be publicly visible if you make any edits. If you <strong>[$1 log in]</strong> or <strong>[$2 create an account]</strong>, your edits will be attributed to your username, along with other benefits.",
        "anonpreviewwarning": "<em>You are not logged in. Saving will record your IP address in this page's edit history.</em>",
        "missingsummary": "<strong>Reminder:</strong> You have not provided an edit summary.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
        "missingcommenttext": "Please enter a comment below.",
index 0a7625d..2c9cf74 100644 (file)
        "userlogin-resetlink": "¿Olvidaste tus datos de acceso?",
        "userlogin-resetpassword-link": "¿Has olvidado tu contraseña?",
        "userlogin-helplink2": "Ayuda con el acceso",
-       "userlogin-loggedin": "Ya estás conectado como {{GENDER:$1|$1}}.\nUsa el formulario de abajo para iniciar sesión como otro usuario.",
-       "userlogin-createanother": "Crear otra cuenta",
        "createacct-emailrequired": "Dirección de correo electrónico",
        "createacct-emailoptional": "Dirección de correo electrónico (opcional)",
        "createacct-email-ph": "Escribe tu dirección de correo electrónico",
index 121e77e..f47b862 100644 (file)
        "userlogin-resetlink": "Kas oled unustanud oma sisselogimisandmed?",
        "userlogin-resetpassword-link": "Kas unustasid parooli?",
        "userlogin-helplink2": "Sisselogimisabi",
-       "userlogin-loggedin": "Oled juba sisse logitud nimega {{GENDER:$1|$1}}.\nKasuta allolevat vormi, et logida sisse teise kasutajaga.",
-       "userlogin-createanother": "Loo teine konto",
        "createacct-emailrequired": "E-posti aadress",
        "createacct-emailoptional": "E-posti aadress (valikuline)",
        "createacct-email-ph": "Sisesta e-posti aadress",
        "showpreview": "Näita eelvaadet",
        "showdiff": "Näita muudatusi",
        "blankarticle": "<strong>Hoiatus:</strong> Lehekülg, mida alustad, on tühi.\nKui klõpsad uuesti \"{{int:savearticle}}\", luuakse lehekülg ilma sisuta.",
-       "anoneditwarning": "'''Hoiatus:''' Sa pole sisse logitud.\nSelle lehe redigeerimislogisse salvestatakse su IP-aadress.",
+       "anoneditwarning": "<strong>Hoiatus:</strong> Sa pole sisse logitud. Sinu IP-aadress on kõigile nähtav, kui muudatusi teed. Kui <strong>[$1 logid sisse]</strong> või <strong>[$2 lood konto]</strong>, siis teiste eeliste seas omistatakse sinu muudatused sulle kasutajanime järgi.",
        "anonpreviewwarning": "''Sa pole sisse logitud. Selle lehe redigeerimislogisse salvestatakse su IP-aadress.''",
        "missingsummary": "'''Meeldetuletus:''' Sa ei ole lisanud muudatuse resümeed.\nKui vajutad uuesti salvestamise nupule, salvestatakse muudatus ilma resümeeta.",
        "missingcommenttext": "Palun sisesta siit allapoole kommentaar.",
        "session_fail_preview_html": "'''Vabandust! Meil ei õnnestunud seansiandmete kaotuse tõttu sinu muudatust töödelda.'''\n\n''Kuna {{GRAMMAR:inessive|{{SITENAME}}}} on toor-HTML lubatud, on eelvaade JavaScripti-rünnakute vastase ettevaatusabinõuna peidetud.''\n\n'''Kui see on õigustatud redigeerimiskatse, proovi palun uuesti.'''\nKui see ikka ei tööta, proovi [[Special:UserLogout|välja]] ja tagasi sisse logida.",
        "token_suffix_mismatch": "'''Muudatus lükati tagasi, kuna sinu klienttarkvara ei suuda õigesti kirjavahemärke kasutada.'''\nMuudatus lükati tagasi, et vältida lehekülje segiminekut.\nSee juhtub mõnikord siis, kui kasutatakse vigast veebipõhist anonüümsusserverit.",
        "edit_form_incomplete": "'''Redigeerimisvormi mõni osa ei jõudnud serverisse; kontrolli, kas sinu tehtud muudatused on alles, ja proovi uuesti.'''",
-       "editing": "Muutmisel on $1",
-       "creating": "Alustamisel on $1",
-       "editingsection": "Muutmisel on osa leheküljest $1",
+       "editing": "Muutmisel on \"$1\"",
+       "creating": "Alustamisel on \"$1\"",
+       "editingsection": "Muutmisel on osa leheküljest \"$1\"",
        "editingcomment": "Muutmisel on $1 (uus alaosa)",
        "editconflict": "Redigeerimiskonflikt: $1",
        "explainconflict": "Keegi teine on muutnud seda lehekülge pärast seda, kui sina seda redigeerima hakkasid.\nÜlemine toimetamiskast sisaldab teksti viimast versiooni.\nSinu muudatused on alumises kastis.\nSul tuleb need viimasesse versiooni üle viia.\nKui klõpsad nupule \"{{int:savearticle}}\", salvestub '''ainult''' ülemises toimetamiskastis olev tekst.",
        "shown-title": "Näita lehekülje kohta $1 {{PLURAL:$1|tulemus|tulemust}}",
        "viewprevnext": "Näita ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Lehekülg pealkirjaga \"[[:$1]]\" on olemas.'''",
-       "searchmenu-new": "<strong>Loo lehekülg pealkirjaga \"[[:$1]]\".</strong> {{PLURAL:$2|0=|Vaata ka leitud lehekülge.|Vaata ka leitud otsitulemusi.}}",
+       "searchmenu-new": "<strong>Alusta lehekülge \"[[:$1]]\".</strong> {{PLURAL:$2|0=|Vaata ka leitud lehekülge.|Vaata ka leitud otsitulemusi.}}",
        "searchprofile-articles": "Sisuleheküljed",
        "searchprofile-images": "Multimeedia",
        "searchprofile-everything": "Kõik",
        "lockfilenotwritable": "Andmebaasi lukufail ei ole kirjutatav.\nAndmebaasi lukustamiseks ja avamiseks peavad veebiserveril olema sellele kirjutusõigused.",
        "databasenotlocked": "Andmebaas ei ole lukustatud.",
        "lockedbyandtime": "(lukustas $1; $2, kell $3)",
-       "move-page": "Teisalda $1",
+       "move-page": "Lehekülje \"$1\" teisaldamine",
        "move-page-legend": "Lehekülje teisaldamine",
        "movepagetext": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nSaad senisele pealkirjale viitavad ümbersuunamised automaatselt parandada.\nKui sa seda ei tee, kontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge '''ei teisaldata''' juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui viimane on redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n'''Hoiatus!'''\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
        "movepagetext-noredirectfixer": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nKontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge '''ei teisaldata''' juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui olemasolev lehekülg on tühi või redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n'''Hoiatus!'''\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
index b09c7d8..a235031 100644 (file)
        "gotaccountlink": "Saioa hasi",
        "userlogin-resetlink": "Saioa hasteko datuak ahaztu dituzu?",
        "userlogin-resetpassword-link": "Zure pasahitza ahaztu duzu?",
-       "userlogin-loggedin": "Dagoeneko izena emana zaude {{GENDER:$1|$1}}.\nBeheko formularioa erabil ezazu beste erabiltzaile baten izenean sartzeko.",
-       "userlogin-createanother": "Beste kontu bat sortu",
        "createacct-emailrequired": "E-posta helbidea",
        "createacct-emailoptional": "E-posta helbidea (hautazkoa)",
        "createacct-email-ph": "Sartu zure e-posta helbidea",
index 03027ad..3e1642b 100644 (file)
                        "Mogoeilor"
                ]
        },
-       "tog-underline": "خط کشیدن زیر پیوندها:",
+       "tog-underline": "خطکشیدن زیر پیوندها:",
        "tog-hideminor": "تغییرات جزئی از فهرست تغییرات اخیر پنهان شوند",
        "tog-hidepatrolled": "ویرایش‌های گشت‌خورده از فهرست تغییرات اخیر پنهان شوند",
        "tog-newpageshidepatrolled": "صفحه‌های گشت‌خورده از فهرست صفحه‌های تازه پنهان شوند",
-       "tog-extendwatchlist": "گسترش فهرست پیگیری‌ها برای نمایش همهٔ تغییرات، نه فقط آخرین‌ها",
-       "tog-usenewrc": "گروه‌بندی تغییرات بر پایهٔ صفحه‌های تغییرات اخیر و فهرست پیگیری‌ها (نیازمند جاوااسکریپت)",
+       "tog-extendwatchlist": "گسترش فهرست پیگیری‌ها برای نمایش همهٔ تغییرات، نه فقط آخرین‌ها",
+       "tog-usenewrc": "گروه‌بندی تغییرات بر پایهٔ صفحات تغییرات اخیر و فهرست پیگیری‌ها",
        "tog-numberheadings": "شماره‌گذاری خودکار عنوان‌ها",
-       "tog-showtoolbar": "نوار ابزار جعبهٔ ویرایش نمایش یابد",
-       "tog-editondblclick": "ویرایش صفحه‌ها با دوکلیک (نیازمند جاوااسکریپت)",
-       "tog-editsectiononrightclick": "امکان ویرایش بخش‌ها با کلیک راست روی عنوان‌های بخش (نیازمند جاوااسکریپت)",
-       "tog-watchcreations": "صفحه‌هایی که می‌سازم و پرونده‌هایی که بارگذاری می‌کنم به فهرست پیگیری‌هایم افزوده شود",
-       "tog-watchdefault": "صفحه‌ها و پرونده‌هایی که ویرایش می‌کنم به فهرست پیگیری‌هایم افزوده شود",
+       "tog-showtoolbar": "نوار ابزار ویرایش نمایش یابد",
+       "tog-editondblclick": "ویرایش صفحات با دو کلیک",
+       "tog-editsectiononrightclick": "فعال‌کردن ویرایش بخش‌ها با کلیک راست روی عنوان بخش‌ها",
+       "tog-watchcreations": "صفحه‌هایی که می‌سازم و پرونده‌هایی که بارگذاری می‌کنم به فهرست پیگیری‌هایم افزوده شود",
+       "tog-watchdefault": "صفحه‌ها و پرونده‌هایی که ویرایش می‌کنم به فهرست پیگیری‌هایم افزوده شود",
        "tog-watchmoves": "صفحه‌ها و پرونده‌هایی که منتقل می‌کنم به فهرست پی‌گیری‌هایم افزوده شود",
-       "tog-watchdeletion": "صفحه‌ها و پرونده‌هایی که حذف می‌کنم به فهرست پی‌گیری‌هایم افزوده شود",
+       "tog-watchdeletion": "صفحات و پرونده‌هایی که حذف می‌کنم به فهرست پی‌گیری‌هایم افزوده شود",
        "tog-watchrollback": "افزودن صفحاتی که واگردانی کردم برای فهرست پیگیری‌هایم",
        "tog-minordefault": "همهٔ ویرایش‌ها به طور پیش‌فرض به عنوان «جزئی» علامت بخورد",
        "tog-previewontop": "پیش‌نمایش قبل از جعبهٔ ویرایش نمایش یابد",
        "category_header": "صفحه‌های ردهٔ «$1»",
        "subcategories": "زیررده‌ها",
        "category-media-header": "پرونده‌های ردهٔ «$1»",
-       "category-empty": "''این رده در حال حاضر حاوی هیچ صفحه یا پرونده‌ای نیست.''",
+       "category-empty": "<em>این رده در حال حاضر حاوی هیچ صفحه یا پرونده‌ای نیست.</em>",
        "hidden-categories": "{{PLURAL:$1|ردهٔ پنهان|رده‌های پنهان}}",
        "hidden-category-category": "رده‌های پنهان",
        "category-subcat-count": "{{PLURAL:$2|این رده تنها حاوی زیرردهٔ زیر است.|{{PLURAL:$1|این زیررده|این $1 زیررده}} در این رده قرار {{PLURAL:$1|دارد|دارند}}؛ این رده در کل حاوی $2 زیررده است.}}",
        "category-file-count": "{{PLURAL:$2|این رده تنها حاوی پروندهٔ زیر است.|{{PLURAL:$1|این پرونده|این $1 پرونده}} در این رده قرار {{PLURAL:$1|دارد|دارند}}؛ این رده در کل حاوی $2 پرونده است.}}",
        "category-file-count-limited": "{{PLURAL:$1|پروندهٔ|$1 پروندهٔ}} زیر در ردهٔ فعلی قرار دارند.",
        "listingcontinuesabbrev": "(ادامه)",
-       "index-category": "صفحه‌های نمایه‌شده",
-       "noindex-category": "صفحه‌های نمایه‌نشده",
-       "broken-file-category": "صفحه‌های دارای پیوند خراب به پرونده",
+       "index-category": "صفحات فهرست‌شده",
+       "noindex-category": "صفحات فهرست‌نشده",
+       "broken-file-category": "صفحات دارای پیوند خراب به پرونده",
        "about": "درباره",
        "article": "صفحهٔ محتوایی",
-       "newwindow": "(در Ù¾Ù\86جرÙ\87Ù\94 Ø¬Ø¯Û\8cد باز می‌شود)",
+       "newwindow": "(در Ù¾Ù\86جرÙ\87Ù\94 ØªØ§Ø²Ù\87 باز می‌شود)",
        "cancel": "لغو",
        "moredotdotdot": "بیشتر...",
        "morenotlisted": "این فهرست کامل نیست.",
        "mypage": "صفحه",
        "mytalk": "بحث",
-       "anontalk": "بحث Ø¨Ø±Ø§Û\8c Ø§Û\8cÙ\86 آی‌پی",
-       "navigation": "گشتن",
+       "anontalk": "بحث Ø¯Ø±Ø¨Ø§Ø±Ù\87 Ø§Û\8cÙ\86 Ù\86شاÙ\86Û\8c آی‌پی",
+       "navigation": "ناوبری",
        "and": "&#32;و",
        "qbfind": "یافتن",
        "qbbrowse": "مرور",
        "qbedit": "ویرایش",
        "qbpageoptions": "این صفحه",
-       "qbmyoptions": "صفحه‌های من",
+       "qbmyoptions": "صفحات من",
        "faq": "پرسش‌های متداول",
        "faqpage": "Project:پرسش‌های متداول",
        "actions": "عملکردها",
        "create-this-page": "ایجاد این صفحه",
        "delete": "حذف",
        "deletethispage": "حذف این صفحه",
-       "undeletethispage": "احÛ\8cای این صفحه",
+       "undeletethispage": "بازگرداÙ\86ی این صفحه",
        "undelete_short": "احیای {{PLURAL:$1|یک ویرایش|$1 ویرایش}}",
        "viewdeleted_short": "نمایش {{PLURAL:$1|یک ویرایش حذف‌شده|$1 ویرایش حذف‌شده}}",
        "protect": "محافظت",
        "protect_change": "تغییر",
        "protectthispage": "محافظت از این صفحه",
-       "unprotect": "تغییر سطح محافظت",
-       "unprotectthispage": "تغییر سطح محافظت این صفحه",
-       "newpage": "صÙ\81Ø­Ù\87Ù\94 Ø¬Ø¯Û\8cد",
+       "unprotect": "تغییر محافظت",
+       "unprotectthispage": "تغییر محافظت این صفحه",
+       "newpage": "صÙ\81Ø­Ù\87Ù\94 ØªØ§Ø²Ù\87",
        "talkpage": "بحث دربارهٔ این صفحه",
        "talkpagelinktext": "بحث",
        "specialpage": "صفحهٔ ویژه",
        "youhavenewmessages": "$1 دارید ($2).",
        "youhavenewmessagesfromusers": "شما از {{PLURAL:$3|یک کاربر دیگر|$3  کاربر}} $1 دارید ($2).",
        "youhavenewmessagesmanyusers": "شما از تعدادی کاربر $1 دارید ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|Ù¾Û\8cاÙ\85 Ø¬Ø¯Û\8cد|999=Ù¾Û\8cاÙ\85â\80\8cÙ\87اÛ\8c Ø¬Ø¯Û\8cد}}",
+       "newmessageslinkplural": "{{PLURAL:$1|Ù¾Û\8cاÙ\85 Ø¬Ø¯Û\8cد|999=Ù¾Û\8cاÙ\85â\80\8cÙ\87اÛ\8c ØªØ§Ø²Ù\87}}",
        "newmessagesdifflinkplural": "{{formatnum:$1}} {{PLURAL:$1|تغییر|999=تغییر}} اخیر",
        "youhavenewmessagesmulti": "پیام‌های جدیدی در $1 دارید.",
        "editsection": "ویرایش",
        "laggedslavemode": "'''هشدار:''' صفحه ممکن است به‌روزرسانی‌های اخیر را شامل نشود.",
        "readonly": "پایگاه داده قفل شد",
        "enterlockreason": "دلیلی برای قفل کردن ذکر کنید، که حاوی تقریبی از زمانی باشد که قفل برداشته خواهد شد",
-       "readonlytext": "پایگاه داده در حال حاضر در برابر تغییرات و ایجاد صفحه‌ها قفل شده‌است؛ این وضعیت احتمالاً به خاطر بهینه‌سازی و رسیدگی‌های معمول است که پس از آن وضع به حالت عادی بازخواهد گشت.\n\nمدیری که آن را قفل کرده این توضیح را ارائه کرده‌است: $1",
+       "readonlytext": "پایگاه داده در حال حاضر در برابر تغییرات و ایجاد صفحات قفل شده‌است؛ این وضعیت احتمالاً به خاطر بهینه‌سازی و رسیدگی‌های معمول است که پس از آن وضع به حالت عادی بازخواهد گشت.\n\nمدیری که آن را قفل کرده این توضیح را ارائه کرده‌است: $1",
        "missing-article": "پایگاه داده متن صفحهٔ با نام «$1» $2 را که باید پیدا می‌کرد نیافت.\n\nاین مشکل معمولاً به علت دنبال‌کردن یک پیوند تفاوت تاریخ‌گذشته یا تاریخچهٔ صفحه‌ای که حذف شده‌است، رخ می‌دهد.\n\nدر غیر این صورت ممکن است اشکالی در نرم‌افزار پیدا کرده باشد.\nلطفاً این مشکل را با ذکر نشانی اینترنتی به یکی از [[Special:ListUsers/sysop|مدیران]] گزارش دهید.",
        "missingarticle-rev": "(شمارهٔ نسخه: $1)",
        "missingarticle-diff": "(تفاوت: $1، $2)",
        "userlogin-noaccount": "حساب کاربری ندارید؟",
        "userlogin-joinproject": "در {{SITENAME}} نام‌نویسی کنید!",
        "nologin": "حساب کاربری ندارید؟ $1.",
-       "nologinlink": "Û\8cÚ© Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±Û\8c Ø¬Ø¯Û\8cد بسازید",
+       "nologinlink": "Û\8cÚ© Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±Û\8c ØªØ§Ø²Ù\87 بسازید",
        "createaccount": "ایجاد حساب کاربری",
        "gotaccount": "حساب کاربری دارید؟ $1.",
        "gotaccountlink": "به سامانه وارد شوید",
        "userlogin-resetlink": "جزئیات ورود را فراموش کرده‌اید؟",
        "userlogin-resetpassword-link": "گذرواژه‌تان را فراموش کردید؟",
        "userlogin-helplink2": "کمک با ورود",
-       "userlogin-loggedin": "شما در حال حاضر به‌عنوان {{GENDER:$1|$1}} وارد شده‌اید.\nاز فرم پایین برای ورود به‌عنوان یک کاربر دیگر استفاده کنید.",
-       "userlogin-createanother": "ایجاد یک حساب کاربری دیگر",
        "createacct-emailrequired": "نشانی رایانامه",
        "createacct-emailoptional": "نشانی رایانامه (اختیاری)",
        "createacct-email-ph": "نشانی رایانامه را وارد کنید",
        "noname": "شما نام کاربری معتبری مشخص نکرده‌اید.",
        "loginsuccesstitle": "ورود موفقیت‌آمیز به سامانه",
        "loginsuccess": "'''شما اکنون با نام «$1» به {{SITENAME}} وارد شده‌اید.'''",
-       "nosuchuser": "کاربرÛ\8c Ø¨Ø§ Ù\86اÙ\85 Â«$1» Ù\88جÙ\88د Ù\86دارد.\nÙ\86اÙ\85 Ú©Ø§Ø±Ø¨Ø±Û\8c Ø¨Ù\87 Ø¨Ø²Ø±Ú¯Û\8c Ù\88 Ú©Ù\88Ú\86Ú©Û\8c Ø­Ø±Ù\88Ù\81 Ø­Ø³Ø§Ø³ Ø§Ø³Øª.\nاÙ\85Ù\84اÛ\8c Ù\86اÙ\85 Ø±Ø§ Ø¨Ø±Ø±Ø³Û\8c Ú©Ù\86Û\8cدØ\8c Û\8cا [[Special:UserLogin/signup|Û\8cÚ© Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±Û\8c Ø¬Ø¯Û\8cد بسازید]].",
+       "nosuchuser": "کاربرÛ\8c Ø¨Ø§ Ù\86اÙ\85 Â«$1» Ù\88جÙ\88د Ù\86دارد.\nÙ\86اÙ\85 Ú©Ø§Ø±Ø¨Ø±Û\8c Ø¨Ù\87 Ø¨Ø²Ø±Ú¯Û\8c Ù\88 Ú©Ù\88Ú\86Ú©Û\8c Ø­Ø±Ù\88Ù\81 Ø­Ø³Ø§Ø³ Ø§Ø³Øª.\nاÙ\85Ù\84اÛ\8c Ù\86اÙ\85 Ø±Ø§ Ø¨Ø±Ø±Ø³Û\8c Ú©Ù\86Û\8cدØ\8c Û\8cا [[Special:UserLogin/signup|Û\8cÚ© Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±Û\8c ØªØ§Ø²Ù\87 بسازید]].",
        "nosuchusershort": "هیچ کاربری با نام ''$1'' وجود ندارد.\nاملایتان را وارسی کنید.",
        "nouserspecified": "باید یک نام کاربری مشخص کنید.",
        "login-userblocked": "این کاربر بسته شده‌است. ورود به سامانه مجاز نیست.",
        "resetpass_text": "<!-- اینجا متن اضافه کنید -->",
        "resetpass_header": "تغییر گذرواژهٔ حساب کاربری",
        "oldpassword": "گذرواژهٔ پیشین:",
-       "newpassword": "گذرÙ\88اÚ\98Ù\87Ù\94 Ø¬Ø¯Û\8cد:",
-       "retypenew": "گذرÙ\88اÚ\98Ù\87Ù\94 Ø¬Ø¯Û\8cد را دوباره وارد کنید",
+       "newpassword": "گذرÙ\88اÚ\98Ù\87Ù\94 ØªØ§Ø²Ù\87:",
+       "retypenew": "گذرÙ\88اÚ\98Ù\87Ù\94 ØªØ§Ø²Ù\87 را دوباره وارد کنید",
        "resetpass_submit": "تنظیم گذرواژه و ورود به سامانه",
        "changepassword-success": "گذرواژهٔ شما با موفقیت تغییر داده شد!",
        "changepassword-throttled": "شما به تازگی چندین‌بار برای ثبت ورود تلاش کرده‌اید.\nلطفاً پیش از آنکه دوباره تلاش کنید $1 صبر کنید.",
        "resetpass-no-info": "برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.",
        "resetpass-submit-loggedin": "تغییر گذرواژه",
        "resetpass-submit-cancel": "لغو",
-       "resetpass-wrong-oldpass": "گذرÙ\88اÚ\98Ù\87Ù\94 Ù\85Ù\88Ù\82ت Û\8cا Ø§Ø®Û\8cر Ù\86اÙ\85عتبر.\nÙ\85Ù\85Ú©Ù\86 Ø§Ø³Øª Ú©Ù\87 Ø´Ù\85ا Ù\87Ù\85Û\8cÙ\86Ú© Ú¯Ø°Ø±Ù\88اÚ\98Ù\87â\80\8cتاÙ\86 Ø±Ø§ Ø¨Ø§ Ù\85Ù\88Ù\81Ù\82Û\8cت ØªØºÛ\8cÛ\8cر Ø¯Ø§Ø¯Ù\87 Ø¨Ø§Ø´Û\8cد Û\8cا Ø¯Ø±Ø®Ù\88است Û\8cÚ© Ú¯Ø°Ø±Ù\88اÚ\98Ù\87Ù\94 Ù\85Ù\88Ù\82ت Ø¬Ø¯Û\8cد کرده باشید.",
+       "resetpass-wrong-oldpass": "گذرÙ\88اÚ\98Ù\87Ù\94 Ù\85Ù\88Ù\82ت Û\8cا Ø§Ø®Û\8cر Ù\86اÙ\85عتبر.\nÙ\85Ù\85Ú©Ù\86 Ø§Ø³Øª Ú©Ù\87 Ø´Ù\85ا Ù\87Ù\85Û\8cÙ\86Ú© Ú¯Ø°Ø±Ù\88اÚ\98Ù\87â\80\8cتاÙ\86 Ø±Ø§ Ø¨Ø§ Ù\85Ù\88Ù\81Ù\82Û\8cت ØªØºÛ\8cÛ\8cر Ø¯Ø§Ø¯Ù\87 Ø¨Ø§Ø´Û\8cد Û\8cا Ø¯Ø±Ø®Ù\88است Û\8cÚ© Ú¯Ø°Ø±Ù\88اÚ\98Ù\87Ù\94 Ù\85Ù\88Ù\82ت ØªØ§Ø²Ù\87 کرده باشید.",
        "resetpass-recycled": "لطفاً رمز عبور خود را به چیز دیگری غیر از رمز عبور فعلی تنظیم کنید.",
        "resetpass-temp-emailed": "شما با یک کد رایانامه شدهٔ موقت وارد شده‌اید.\nبرای پایان ورود، شما باید رمز عبور جدیدی اینجا وارد کنید:",
        "resetpass-temp-password": "گذرواژهٔ موقت:",
        "resetpass-abort-generic": "تغییر گذرواژه به دست یکی از افزونه‌ها لغو شده است.",
        "resetpass-expired": "رمز عبور شما منقضی شده‌است. لطفاً برای ورود رمز عبور جدیدی را تنظیم کنید.",
        "resetpass-expired-soft": "رمز عبور شما منقضی شده‌است، و نیاز به تنظیم مجدد دارد. لطفاً اکنون رمز عبور جدیدی را انتخاب کنید، یا برای تنظیم مجدد آن بعدآً، دکمه \"{{int:resetpass-submit-cancel}}\" را کلیک کنید.",
-       "resetpass-validity-soft": "گذرÙ\88اÙ\87Ù\94 Ø´Ù\85ا ØµØ­Û\8cØ­ Ù\86Û\8cست: $1\n\nÙ\84Ø·Ù\81اÙ\8b Û\8cÚ© Ú¯Ø°Ø±Ù\88اÚ\98Ù\87Ù\94 Ø¬Ø¯Û\8cد الآن انتخاب کنید یا بر «{{int:resetpass-submit-cancel}}» کلیک کنید که دوباره آن را بعداً انتخاب کنید.",
+       "resetpass-validity-soft": "گذرÙ\88اÙ\87Ù\94 Ø´Ù\85ا ØµØ­Û\8cØ­ Ù\86Û\8cست: $1\n\nÙ\84Ø·Ù\81اÙ\8b Û\8cÚ© Ú¯Ø°Ø±Ù\88اÚ\98Ù\87Ù\94 ØªØ§Ø²Ù\87 الآن انتخاب کنید یا بر «{{int:resetpass-submit-cancel}}» کلیک کنید که دوباره آن را بعداً انتخاب کنید.",
        "passwordreset": "بازنشانی گذرواژه",
        "passwordreset-text-one": "برای بازنشانی گذرواژه‌تان این فرم را کامل کنید.",
        "passwordreset-text-many": "{{PLURAL:$1|برای دریافت یک گذرواژهٔ موقت از راه رایانامه، یکی از زمینه‌ها را پر کنید.}}",
        "changeemail-text": "این فرم را تکمیل کنید تا آدرس رایانامه‌تان تغییر یابد. برای این که این تغییر را تأیید کنید لازم است گذرواژهٔ خود را وارد کنید.",
        "changeemail-no-info": "برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.",
        "changeemail-oldemail": "نشانی رایانامهٔ کنونی:",
-       "changeemail-newemail": "Ù\86شاÙ\86Û\8c Ø±Ø§Û\8cاÙ\86اÙ\85Ù\87Ù\94 Ø¬Ø¯Û\8cد:",
+       "changeemail-newemail": "Ù\86شاÙ\86Û\8c Ø±Ø§Û\8cاÙ\86اÙ\85Ù\87Ù\94 ØªØ§Ø²Ù\87:",
        "changeemail-none": "(هیچ)",
        "changeemail-password": " {{SITENAME}} رمز عبور شما:",
        "changeemail-submit": "تغییر رایانامه",
        "showpreview": "پیش‌نمایش",
        "showdiff": "نمایش تغییرات",
        "blankarticle": "<strong>هشدار:</strong> شما در حال ایجاد صفحه خالی هستید.\nاگر \"{{int:savearticle}}\" را دوباره کلیک کنید، صفحه بدون محتوا ایجاد می‌شود.",
-       "anoneditwarning": "'''هشدار:''' شما به سامانه وارد نشده‌اید.\nنشانی آی‌پی شما در تاریخچهٔ ویرایش این صفحه ثبت خواهد شد.",
+       "anoneditwarning": "<strong>هشدار:</strong> شما وارد نشده‌اید. نشانی آی‌پی شما برای عموم قابل مشاهده خواهد بود اگر هر تغییری ایجاد کنید. اگر <strong>[$1 وارد شوید]</strong> یا <strong>[$2 یک حساب کاربری بسازید]</strong>، ویرایش‌هایتان به نام کاربری‌تان نسبت داده خواهد شد، همراه با مزایای دیگر.",
        "anonpreviewwarning": "''شما به سامانه وارد نشده‌اید. ذخیره کردن باعث می‌شود که نشانی آی‌پی شما در تاریخچهٔ این صفحه ثبت گردد.''",
        "missingsummary": "'''یادآوری:''' شما خلاصهٔ ویرایش ننوشته‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
        "missingcommenttext": "لطفاً توضیحی در زیر بیفزایید.",
        "autoblockedtext": "دسترسی نشانی آی‌پی شما قطع شده‌است، زیرا این نشانی آی‌پی توسط کاربر دیگری استفاده شده که دسترسی او توسط $1 قطع شده‌است.\nدلیل ارائه‌شده چنین است:\n\n:''$2''\n\n* شروع قطع دسترسی: $8\n* پایان قطع دسترسی: $6\n* کاربری هدف قطع دسترسی: $7\n\nشما می‌توانید با $1 یا  [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.\nتوجه کنید که شما نمی‌توانید از ویژگی «فرستادن رایانامه به این کاربر» استفاده کنید مگر آنکه نشانی رایانامه معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این ویژگی برای شما قطع نشده باشد.\nنشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.\nلطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
        "blockednoreason": "دلیلی مشخص نشده‌است",
        "whitelistedittext": "برای ویرایش مقاله‌ها باید $1.",
-       "confirmedittext": "شما باید، پیش از ویرایش صفحه‌ها، نشانی رایانامهٔ خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.",
+       "confirmedittext": "شما باید، پیش از ویرایش صفحات، نشانی رایانامهٔ خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.",
        "nosuchsectiontitle": "چنین بخشی پیدا نشد",
        "nosuchsectiontext": "شما تلاش کرده‌اید یک بخش در صفحه را ویرایش کنید که وجود ندارد.\nممکن است در مدتی که شما صفحه را مشاهده می‌کردید این بخش جا به جا یا حذف شده باشد.",
        "loginreqtitle": "ورود به سامانه لازم است",
        "loginreqpagetext": "برای دیدن صفحه‌های دیگر باید $1.",
        "accmailtitle": "گذرواژه فرستاده شد.",
        "accmailtext": "یک گذرواژهٔ تصادفی برای [[User talk:$1|$1]] به $2 فرستاده شد. می‌توان آن را از صفحهٔ ''[[Special:ChangePassword|تغییر گذرواژه]]'' که هنگام ثبت ورود نمایش می‌یابد تغییر داد.",
-       "newarticle": "(جدÛ\8cد)",
+       "newarticle": "(تازÙ\87)",
        "newarticletext": "شما پیوندی را دنبال کرده‌اید و به صفحه‌ای رسیده‌اید که هنوز وجود ندارد.\nبرای ایجاد صفحه، در مستطیل زیر شروع به نوشتن کنید (برای اطلاعات بیشتر به [$1 صفحهٔ راهنما] مراجعه کنید).\nاگر به اشتباه اینجا آمده‌اید، دکمهٔ «بازگشت» مرورگرتان را بزنید.",
        "anontalkpagetext": "----''این صفحهٔ بحث برای کاربر گمنامی است که هنوز حسابی درست نکرده است یا از آن استفاده نمی‌کند.\nبنا بر این برای شناسایی‌اش مجبوریم از نشانی آی‌پی عددی استفاده کنیم.\nچنین نشانی‌های آی‌پی ممکن است توسط چندین کاربر به شکل مشترک استفاده شود.\nاگر شما کاربر گمنامی هستید و تصور می‌کنید اظهار نظرات نامربوط به شما صورت گرفته است، لطفاً برای پیشگیری از اشتباه گرفته شدن با کاربران گمنام دیگر در آینده [[Special:UserLogin/signup|حسابی ایجاد کنید]] یا [[Special:UserLogin|به سامانه وارد شوید]].''",
        "noarticletext": "این صفحه هم‌اکنون دارای هیچ متنی نیست.\nشما می‌توانید در صفحه‌های دیگر [[Special:Search/{{PAGENAME}}|عنوان این صفحه را جستجو کنید]]،\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌های مرتبط را جستجو کنید]،\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} این صفحه را ویرایش کنید]</span>.",
-       "noarticletext-nopermission": "این صفحه هم‌اکنون متنی ندارد.\nشما می‌توانید در دیگر صفحه‌ها [[Special:Search/{{PAGENAME}}|این عنوان را جستجو کنید]]،\nیا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌های مرتبط را بگردید]</span> ولی شما اجازه ایجاد این صفحه را ندارید.",
+       "noarticletext-nopermission": "این صفحه هم‌اکنون متنی ندارد.\nشما می‌توانید در دیگر صفحات [[Special:Search/{{PAGENAME}}|این عنوان را جستجو کنید]]،\nیا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌های مرتبط را بگردید]</span> ولی شما اجازه ایجاد این صفحه را ندارید.",
        "missing-revision": "ویرایش #$1 از صفحهٔ «{{FULLPAGENAME}}» موجود نیست.\n\nمعمولاً در اثر پیوند به تاریخچهٔ به‌روز نشدهٔ صفحهٔ حذف شده است.\nمی‌توانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.",
        "userpage-userdoesnotexist": "حساب کاربر «<nowiki>$1</nowiki>» ثبت نشده‌است.\nلطفاً مطمئن شوید که می‌خواهید این صفحه را ایجاد یا ویرایش کنید.",
        "userpage-userdoesnotexist-view": "حساب کاربری «$1» ثبت نشده‌است.",
        "editing": "در حال ویرایش $1",
        "creating": "ایجاد $1",
        "editingsection": "در حال ویرایش $1 (بخش)",
-       "editingcomment": "در Ø­Ø§Ù\84 Ù\88Û\8cراÛ\8cØ´ $1 (بخش Ø¬Ø¯Û\8cد)",
+       "editingcomment": "در Ø­Ø§Ù\84 Ù\88Û\8cراÛ\8cØ´ $1 (بخش ØªØ§Ø²Ù\87)",
        "editconflict": "تعارض ویرایشی: $1",
        "explainconflict": "از وقتی ویرایش این صفحه را آغاز کرده‌اید شخص دیگری آن را تغییر داده‌است.\nناحیهٔ متنی بالایی شامل متن صفحه به شکل کنونی آن است.\nتغییرات شما در ناحیهٔ متنی پایینی نشان داده شده‌است.\nشما باید تغییراتتان را با متن کنونی ترکیب کنید.\nبا فشردن دکمهٔ «{{int:savearticle}}» '''فقط''' متن ناحیهٔ متنی بالایی ذخیره خواهد شد.",
        "yourtext": "متن شما",
        "storedversion": "نسخهٔ ذخیره شده",
-       "nonunicodebrowser": "'''هشدار: مرورگر شما با استانداردهای یونیکد سازگار نیست.'''\nراه حلی به کار گرفته شده تا شما بتوانید صفحه‌ها را با امنیت ویرایش کنید: کاراکترهای غیر ASCII به صورت کدهایی در مبنای شانزده به شما نشان داده می‌شوند.",
+       "nonunicodebrowser": "'''هشدار: مرورگر شما با استانداردهای یونیکد سازگار نیست.'''\nراه حلی به کار گرفته شده تا شما بتوانید صفحات را با امنیت ویرایش کنید: کاراکترهای غیر ASCII به صورت کدهایی در مبنای شانزده به شما نشان داده می‌شوند.",
        "editingold": "'''هشدار: شما در حال ویرایش نسخه‌ای قدیمی از این صفحه هستید.'''\nاگر ذخیره‌اش کنید، هر تغییری که پس از این نسخه انجام شده‌است از بین خواهد رفت.",
        "yourdiff": "تفاوت‌ها",
        "copyrightwarning": "لطفاً توجه داشته باشید که فرض می‌شود کلیهٔ مشارکت‌های شما با {{SITENAME}} تحت «$2» منتشر می‌شوند (برای جزئیات بیشتر به $1 مراجعه کنید).\nاگر نمی‌خواهید نوشته‌هایتان بی‌رحمانه ویرایش شده و به دلخواه توزیع شود، اینجا نفرستیدشان.<br />\nهمچنین شما دارید به ما قول می‌دهید که خودتان این را نوشته‌اید، یا آن را از یک منبع آزاد با مالکیت عمومی یا مشابه آن برداشته‌اید.\n'''کارهای دارای حق تکثیر (copyright) را بی‌اجازه نفرستید!'''",
        "template-semiprotected": "(نیمه‌حفاظت‌شده)",
        "hiddencategories": "این صفحه در {{PLURAL:$1|یک ردهٔ پنهان|$1 ردهٔ پنهان}} قرار دارد:",
        "edittools": "<!-- متن این قسمت زیر صفحه‌های ویرایش و بارگذاری نشان داده می‌شود -->",
-       "nocreatetext": "{{SITENAME}} Ù\82ابÙ\84Û\8cت Ø§Û\8cجاد ØµÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c Ø¬Ø¯Û\8cد را محدود کرده‌است.\nمی‌توانید بازگردید و صفحه‌ای موجود را ویرایش کنید یا اینکه  [[Special:UserLogin|به سامانه وارد شوید یا حساب کاربری ایجاد کنید]].",
-       "nocreate-loggedin": "Ø´Ù\85ا Ø§Ø¬Ø§Ø²Ù\87Ù\94 Ø§Û\8cجاد ØµÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c Ø¬Ø¯Û\8cد را ندارید.",
+       "nocreatetext": "{{SITENAME}} Ù\82ابÙ\84Û\8cت Ø§Û\8cجاد ØµÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c ØªØ§Ø²Ù\87 را محدود کرده‌است.\nمی‌توانید بازگردید و صفحه‌ای موجود را ویرایش کنید یا اینکه  [[Special:UserLogin|به سامانه وارد شوید یا حساب کاربری ایجاد کنید]].",
+       "nocreate-loggedin": "Ø´Ù\85ا Ø§Ø¬Ø§Ø²Ù\87Ù\94 Ø§Û\8cجاد ØµÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c ØªØ§Ø²Ù\87 را ندارید.",
        "sectioneditnotsupported-title": "ویرایش بخش‌ها پشتیبانی نمی‌شود",
        "sectioneditnotsupported-text": "این صفحه از ویرایش بخش‌ها پشتیبانی نمی‌کند.",
        "permissionserrors": "خطای سطح دسترسی",
        "postedit-confirmation-created": "صفحه ایجاد شده است.",
        "postedit-confirmation-restored": "صفحه بازیابی شده است.",
        "postedit-confirmation-saved": "ویرایش شما ذخیره شد.",
-       "edit-already-exists": "اÙ\85کاÙ\86 Ø³Ø§Ø®ØªÙ\86 ØµÙ\81Ø­Ù\87Ù\94 Ø¬Ø¯Û\8cد وجود ندارد.\nاین صفحه از قبل وجود داشته‌است.",
+       "edit-already-exists": "اÙ\85کاÙ\86 Ø³Ø§Ø®ØªÙ\86 ØµÙ\81Ø­Ù\87Ù\94 ØªØ§Ø²Ù\87 وجود ندارد.\nاین صفحه از قبل وجود داشته‌است.",
        "defaultmessagetext": "متن پیش‌فرض پیغام",
        "content-failed-to-parse": "عدم موفقیت در تجزیه محتوای $2 برای مدل $1: $3",
        "invalid-content-data": "داده محتوای نامعتبر",
        "history-feed-title": "تاریخچهٔ ویرایش‌ها",
        "history-feed-description": "تاریخچهٔ ویرایش‌های این صفحه در ویکی",
        "history-feed-item-nocomment": "$1 در $2",
-       "history-feed-empty": "صفحهٔ درخواست شده وجود ندارد.\nممکن است که از ویکی حذف یا اینکه نامش تغییر داده شده باشد.\nصفحه‌های جدید را برای موارد مرتبط در این ویکی [[Special:Search|جستجو کنید]].",
+       "history-feed-empty": "صفحهٔ درخواست شده وجود ندارد.\nممکن است که از ویکی حذف یا اینکه نامش تغییر داده شده باشد.\nصفحات تازه را برای موارد مرتبط در این ویکی [[Special:Search|جستجو کنید]].",
        "rev-deleted-comment": "(خلاصه ویرایش حذف شد)",
        "rev-deleted-user": "(نام کاربری حذف شد)",
        "rev-deleted-event": "(مورد از سیاهه پاک شده)",
        "revdelete-offender": "نویسنده نسخه:",
        "suppressionlog": "سیاههٔ فرونشانی",
        "suppressionlogtext": "در زیر فهرستی از آخرین حذف‌ها و قطع دسترسی‌هایی که حاوی محتوایی هستند که از مدیران پنهان شده‌اند را می‌بینید.\nبرای مشاهدهٔ فهرستی از قطع دسترسی‌های فعال [[Special:BlockList|فهرست بسته‌شده‌ها]] را ببینید.",
-       "mergehistory": "ادغام تاریخچه صفحه‌ها",
+       "mergehistory": "ادغام تاریخچه صفحات",
        "mergehistory-header": "این صفحه به شما این امکان را می‌دهد که نسخه‌های تاریخچهٔ یک مقاله را با یک مقاله دیگر ادغام کنید.\nاطمینان حاصل کنید که این تغییر به توالی زمانی ویرایش‌ها لطمه نخواهد زد.",
        "mergehistory-box": "ادغام نسخه‌های دو صفحه:",
        "mergehistory-from": "صفحهٔ مبدأ:",
        "mergelogpagetext": "در زیر سیاههٔ آخرین موارد ادغام تاریخچهٔ یک صفحه در صفحه‌ای دیگر را می‌بینید.",
        "history-title": "$1: تاریخچهٔ ویرایش‌ها",
        "difference-title": "$1: تفاوت بین نسخه‌ها",
-       "difference-title-multipage": "$1 و $2: تفاوت بین صفحه‌ها",
-       "difference-multipage": "(تفاوت بین صفحه‌ها)",
+       "difference-title-multipage": "$1 و $2: تفاوت بین صفحات",
+       "difference-multipage": "(تفاوت بین صفحات)",
        "lineno": "سطر $1:",
        "compareselectedversions": "مقایسهٔ نسخه‌های انتخاب‌شده",
        "showhideselectedversions": "تغییر پدیداری بازبینی‌های انتخاب‌شده",
        "yourlanguage": "زبان:",
        "yourvariant": "گویش زبان محتوا:",
        "prefs-help-variant": "گویش انتخابی شما برای نمایش محتوای صفحه‌ها در این ویکی.",
-       "yournick": "اÙ\85ضاÛ\8c Ø¬Ø¯Û\8cد:",
+       "yournick": "اÙ\85ضاÛ\8c ØªØ§Ø²Ù\87:",
        "prefs-help-signature": "نظرهای نوشته‌شده در صفحهٔ بحث باید با «<nowiki>~~~~</nowiki>» امضا شوند؛ این علامت به‌صورت خودکار به امضای شما و مهر تاریخ تبدیل خواهد شد.",
        "badsig": "امضای خام نامجاز.\nلطفاً برچسب‌های اچ‌تی‌ام‌ال را بررسی کنید.",
        "badsiglength": "امضای شما بیش از اندازه طولانی است.\nامضا باید کمتر از $1 {{PLURAL:$1|نویسه}} طول داشته باشد.",
        "right-createaccount": "ایجاد حساب‌های کاربری",
        "right-minoredit": "علامت‌زدن ویرایش‌ها به‌عنوان جزئی",
        "right-move": "انتقال صفحه",
-       "right-move-subpages": "انتقال صفحÙ\87â\80\8cÙ\87ا Ø¨Ù\87 Ù\87Ù\85راÙ\87 Ø²Û\8cرâ\80\8cصÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8cشاÙ\86",
+       "right-move-subpages": "انتقال صفحات Ø¨Ù\87 Ù\87Ù\85راÙ\87 Ø²Û\8cرâ\80\8cصÙ\81حاتâ\80\8cشاÙ\86",
        "right-move-rootuserpages": "انتقال صفحه‌های کاربری سرشاخه",
        "right-move-categorypages": "انتقال صفحهٔ رده",
        "right-movefile": "انتقال پرونده‌ها",
        "right-purge": "پاک‌کردن میانگیر صفحه بدون مشاهدهٔ صفحهٔ تأیید",
        "right-autoconfirmed": "از محدودیت‌های سرعت آی‌پی‌-محور تاثیر نمی‌گیرد",
        "right-bot": "تلقی‌شده به عنوان یک فرآیند خودکار",
-       "right-nominornewtalk": "Ù\88Û\8cراÛ\8cØ´ Ø¬Ø²Ø¦Û\8c ØµÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c Ø¨Ø­Ø« Ø¨Ù\87 Ø´Ú©Ù\84Û\8c Ú©Ù\87 Ø¨Ø§Ø¹Ø« Ø§Ø¹Ù\84اÙ\86 Ù¾Û\8cغاÙ\85 Ø¬Ø¯Û\8cد نشود",
+       "right-nominornewtalk": "Ù\88Û\8cراÛ\8cØ´ Ø¬Ø²Ø¦Û\8c ØµÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c Ø¨Ø­Ø« Ø¨Ù\87 Ø´Ú©Ù\84Û\8c Ú©Ù\87 Ø¨Ø§Ø¹Ø« Ø§Ø¹Ù\84اÙ\86 Ù¾Û\8cغاÙ\85 ØªØ§Ø²Ù\87 نشود",
        "right-apihighlimits": "سقف بالاتر استفاده از API",
        "right-writeapi": "استفاده از API مربوط به نوشتن",
-       "right-delete": "حذف صفحه‌ها",
+       "right-delete": "حذف صفحات",
        "right-bigdelete": "حذف صفحه‌های دارای تاریخچهٔ بزرگ",
        "right-deletelogentry": "حذف و احیای مدخل‌های خاصی از سیاهه",
        "right-deleterevision": "حذف و احیای نسخه‌های خاصی از صفحه",
        "right-deletedhistory": "مشاهدهٔ موارد حذف‌شده از تاریخچه، بدون دیدن متن آن‌ها",
        "right-deletedtext": "مشاهدهٔ متن حذف‌شده و تغییرات بین نسخه‌های حذف‌شده",
        "right-browsearchive": "جستجوی صفحه‌های حذف‌شده",
-       "right-undelete": "احیای صفحه‌ها",
+       "right-undelete": "احیای صفحات",
        "right-suppressrevision": "مشاهده  و احیای ویرایش‌هایی که از کاربران پنهان شده‌اند",
        "right-viewsuppressed": "مشاهده نسخه‌هایی که از کاربران مخفی شده‌اند",
        "right-suppressionlog": "مشاهدهٔ سیاهه‌های خصوصی",
        "right-ipblock-exempt": "تاثیر نپذیرفتن از قطع دسترسی‌های آی‌پی، خودکار یا فاصله‌ای",
        "right-proxyunbannable": "تاثیر نپذیرفتن از قطع دسترسی خودکار پروکسی‌ها",
        "right-unblockself": "بازکردن دسترسی خود",
-       "right-protect": "تغییر میزان محافظت صفحه‌ها و ویرایش صفحه‌های محافظت‌شده آبشاری",
+       "right-protect": "تغییر میزان محافظت صفحات و ویرایش صفحات محافظت‌شده آبشاری",
        "right-editprotected": "ویرایش صفحه‌های محافظت‌شده به‌عنوان «{{int:protect-level-sysop}}»",
        "right-editsemiprotected": "ویرایش صفحه حفاظت‌شده به عنوان \"{{int:protect-level-autoconfirmed}}\"",
        "right-editinterface": "ویرایش واسط کاربری",
        "right-editmyusercss": "پرونده‌های سی‌اس‌اس کاربری خود را ویرایش کنید",
        "right-editmyuserjs": "پرونده‌های جاوااسکریپت کاربری خود را ویرایش کنید",
        "right-viewmywatchlist": "فهرست پیگیری‌های خود را ببینید",
-       "right-editmywatchlist": "فهرست پیگیری‌های خود را ویرایش کنید. توجه داشته باشید برخی از اقدامات حتی بدون این دسترسی هم صفحه‌ها را اضافه می‌کنند.",
+       "right-editmywatchlist": "فهرست پیگیری‌های خود را ویرایش کنید. توجه داشته باشید برخی از اقدامات حتی بدون این دسترسی هم صفحات را اضافه می‌کنند.",
        "right-viewmyprivateinfo": "داده‌های خصوصی خود را ببینید (مانند رایانشانی و نام واقعی)",
        "right-editmyprivateinfo": "داده‌های خصوصی خود را ویرایش کنید (مانند رایانشانی و نام واقعی)",
        "right-editmyoptions": "ترجیحات خود را ویرایش",
        "right-autopatrol": "گشت زدن خودکار ویرایش‌های خودش",
        "right-patrolmarks": "مشاهدهٔ برچسب گشت تغییرات اخیر",
        "right-unwatchedpages": "مشاهدهٔ فهرست صفحه‌هایی که پی‌گیری نمی‌شوند",
-       "right-mergehistory": "ادغام تاریخچهٔ صفحه‌ها",
+       "right-mergehistory": "ادغام تاریخچهٔ صفحات",
        "right-userrights": "ویرایش تمام اختیارات کاربرها",
        "right-userrights-interwiki": "ویرایش اختیارات کاربرهای ویکی‌های دیگر",
        "right-siteadmin": "قفل‌کردن و بازکردن پایگاه داده‌ها",
        "recentchanges-summary": "آخرین تغییرات ویکی را در این صفحه پی‌گیری کنید.",
        "recentchanges-noresult": "هیچ تغییری در طول دورهٔ تعیین‌شده با این معیارها هم‌خوانی نداشت.",
        "recentchanges-feed-description": "آخرین تغییرات ویکی را در این خوراک پی‌گیری کنید.",
-       "recentchanges-label-newpage": "اÛ\8cÙ\86 Ù\88Û\8cراÛ\8cØ´ ØµÙ\81Ø­Ù\87â\80\8cاÛ\8c Ø¬Ø¯Û\8cد ایجاد کرد",
+       "recentchanges-label-newpage": "اÛ\8cÙ\86 Ù\88Û\8cراÛ\8cØ´ ØµÙ\81Ø­Ù\87â\80\8cاÛ\8c ØªØ§Ø²Ù\87 ایجاد کرد",
        "recentchanges-label-minor": "این یک ویرایش جزئی‌است",
        "recentchanges-label-bot": "این ویرایش را یک ربات انجام داده‌است",
        "recentchanges-label-unpatrolled": "این ویرایش هنوز گشت‌زنی نشده‌است",
        "recentchanges-label-plusminus": "حجم صفحه به اندازه این بایت‌ها تغییر یافته‌است",
        "recentchanges-legend-heading": "'''اختصارها:'''",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (Ù\87Ù\85Ú\86Ù\86Û\8cÙ\86 Ø¨Ù\87 [[Special:NewPages|Ù\81Ù\87رست ØµÙ\81حات Ø¬Ø¯Û\8cد]] نگاه کنید)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (Ù\87Ù\85Ú\86Ù\86Û\8cÙ\86 Ø¨Ù\87 [[Special:NewPages|Ù\81Ù\87رست ØµÙ\81حات ØªØ§Ø²Ù\87]] نگاه کنید)",
        "recentchanges-legend-plusminus": "(<em>±۱۲۳</em>)",
        "rcnotefrom": "در زیر تغییرات از <strong>$3, $4</strong> (تا <strong>$1</strong> {{PLURAL:$5|نشان داده شده‌است|نشان داده شده‌اند}}).",
-       "rclistfrom": "Ù\86Ù\85اÛ\8cØ´ ØªØºÛ\8cÛ\8cرات Ø¬Ø¯Û\8cد با شروع از $3 $2",
+       "rclistfrom": "Ù\86Ù\85اÛ\8cØ´ ØªØºÛ\8cÛ\8cرات ØªØ§Ø²Ù\87 با شروع از $3 $2",
        "rcshowhideminor": "$1 ویرایش‌های جزئی",
        "rcshowhideminor-show": "نمایش",
        "rcshowhideminor-hide": "پنهان‌کردن",
        "upload_directory_read_only": "شاخهٔ بارگذاری ($1) از طرف سرور وب قابل نوشتن نیست.",
        "uploaderror": "خطای بارگذاری",
        "upload-recreate-warning": "'''هشدار: پرونده‌ای با این نام حذف یا منتقل شده است.'''\n\nبرای راحتی، سیاههٔ حذف و انتقال برای این صفحه در زیر آمده است:",
-       "uploadtext": "از فرم زیر برای بارگذاری کردن پرونده‌های جدید استفاده کنید.\nبرای دیدن پرونده‌هایی که قبلاً بارگذاری شده‌اند به [[Special:FileList|فهرست پرونده‌ها]] بروید. بارگذاری نیز مجدد در [[Special:Log/upload|سیاههٔ بارگذاری‌ها]] و حذف پرونده‌ها در [[Special:Log/delete|deletion log]] ثبت می‌شود.\n\nبعد از این که پرونده‌ای را بارگذاری کردید، به این سه شکل می‌توانید آن را در صفحه‌ها استفاده کنید:\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' برای استفاده از نسخه کامل پرونده\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' برای استفاده از یک نسخه ۲۰۰ پیکسلی از پرونده درون یک جعبه در سمت چپ متن که عبارت alt text در آن به عنوان توضیح استفاده شده\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' برای ایجاد یک پیونده مستقیم به پرونده بدون نمایش پرونده",
+       "uploadtext": "از فرم زیر برای بارگذاری کردن پرونده‌های جدید استفاده کنید.\nبرای دیدن پرونده‌هایی که قبلاً بارگذاری شده‌اند به [[Special:FileList|فهرست پرونده‌ها]] بروید. بارگذاری نیز مجدد در [[Special:Log/upload|سیاههٔ بارگذاری‌ها]] و حذف پرونده‌ها در [[Special:Log/delete|deletion log]] ثبت می‌شود.\n\nبعد از این که پرونده‌ای را بارگذاری کردید، به این سه شکل می‌توانید آن را در صفحات استفاده کنید:\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' برای استفاده از نسخه کامل پرونده\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' برای استفاده از یک نسخه ۲۰۰ پیکسلی از پرونده درون یک جعبه در سمت چپ متن که عبارت alt text در آن به عنوان توضیح استفاده شده\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' برای ایجاد یک پیونده مستقیم به پرونده بدون نمایش پرونده",
        "upload-permitted": "انواع مجاز پرونده‌ها: $1.",
        "upload-preferred": "انواع ترجیح‌داده شده پرونده‌ها: $1.",
        "upload-prohibited": "انواع نامجاز پرونده‌ها: $1.",
        "ignorewarning": "چشم‌پوشی از هشدار و ذخیرهٔ پرونده.",
        "ignorewarnings": "چشم‌پوشی از همهٔ هشدارها",
        "minlength1": "نام پرونده دست کم باید یک حرف باشد.",
-       "illegalfilename": "نام پرونده «$1» نویسه‌هایی را شامل می‌شود که در نام صفحه‌ها مجاز نیستند.\nلطفاً نام پرونده را تغییر دهید و آن را دوباره بارگذاری کنید.",
+       "illegalfilename": "نام پرونده «$1» نویسه‌هایی را شامل می‌شود که در نام صفحات مجاز نیستند.\nلطفاً نام پرونده را تغییر دهید و آن را دوباره بارگذاری کنید.",
        "filename-toolong": "نام پرونده نباید از ۲۴۰ بایت طولانی‌تر باشد.",
        "badfilename": "نام پرونده به «$1» تغییر کرد.",
        "filetype-mime-mismatch": "پسوند پرونده «$1.‎» با نوع MIME آن ($2) مطابقت ندارد.",
        "listduplicatedfiles-summary": "این فهرست پرونده‌هایی با نسخه‌های اخیر این پرونده تکراری است که نسخه‌های اخبر سایر پرونده‌ها است. فقط پرونده‌های محلی در نظر گرفته شده‌اند.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]][[$3|{{PLURAL:$2|یک تکرار|$2 تکرار}}]] دارد.",
        "unusedtemplates": "الگوهای استفاده‌نشده",
-       "unusedtemplatestext": "این صفحه همهٔ صفحه‌هایی در فضای نام {{ns:template}} را که در هیچ صفحه‌ای به کار نرفته‌اند، فهرست می‌کند.\nبه یاد داشته باشید که پیش از پاک‌کردن این صفحه‌ها پیوندهای دیگر به آنها را هم وارسی کنید.",
+       "unusedtemplatestext": "این صفحه همهٔ صفحاتی در فضای نام {{ns:template}} را که در هیچ صفحه‌ای به کار نرفته‌اند، فهرست می‌کند.\nبه یاد داشته باشید که پیش از پاک‌کردن این صفحات پیوندهای دیگر به آنها را هم وارسی کنید.",
        "unusedtemplateswlh": "پیوندهای دیگر",
        "randompage": "مقالهٔ تصادفی",
        "randompage-nopages": "هیچ صفحه‌ای در این {{PLURAL:$2|فضای نام|فضاهای نام}} موجود نیست: $1.",
        "randomredirect": "تغییرمسیر تصادفی",
        "randomredirect-nopages": "هیج صفحهٔ تغییرمسیری در فضای نام «$1» موجود نیست.",
        "statistics": "آمار",
-       "statistics-header-pages": "آمار صفحه‌ها",
+       "statistics-header-pages": "آمار صفحه",
        "statistics-header-edits": "آمار ویرایش‌ها",
        "statistics-header-views": "آمار بازدیدها",
        "statistics-header-users": "آمار کاربران",
        "statistics-header-hooks": "آمارهای دیگر",
        "statistics-articles": "صفحه‌های محتوایی",
-       "statistics-pages": "صفحه‌ها",
+       "statistics-pages": "صفحات",
        "statistics-pages-desc": "تمام صفحه‌های این ویکی، از جمله صفحه‌های بحث، تغییرمسیر و غیره",
        "statistics-files": "پرونده‌های بارگذاری‌شده",
        "statistics-edits": "ویرایش صفحه‌ها از هنگامی که {{SITENAME}} راه‌اندازی شده",
        "brokenredirects-edit": "ویرایش",
        "brokenredirects-delete": "حذف",
        "withoutinterwiki": "صفحه‌های بدون پیوند میان‌ویکی",
-       "withoutinterwiki-summary": "این صفحه‌ها پیوندی به صفحه‌ای به زبان دیگر نمی‌دارند:",
+       "withoutinterwiki-summary": "این صفحات پیوندی به صفحه‌ای به زبان دیگر نمی‌دارند:",
        "withoutinterwiki-legend": "پیشوند",
        "withoutinterwiki-submit": "نمایش",
        "fewestrevisions": "مقاله‌های دارای کمترین شمار ویرایش",
        "mostimages": "پرونده‌هایی که بیشتر از همه به آن‌ها پیوند داده شده‌است",
        "mostinterwikis": "صفحه‌های دارای بیشترین میان‌ویکی",
        "mostrevisions": "صفحه‌های دارای بیشترین نسخه",
-       "prefixindex": "تمام صفحه‌ها با پیشوند",
+       "prefixindex": "تمام صفحات با پیشوند",
        "prefixindex-namespace": "همهٔ صفحه‌های دارای پیشوند (فضای‌نام $1)",
        "prefixindex-strip": "حذف پیشوند در فهرست",
        "shortpages": "صفحه‌های کوتاه",
        "usercreated": "{{GENDER:$3|ایجادشده}} در تاریخ $1 در ساعت $2",
        "newpages": "صفحه‌های تازه",
        "newpages-username": "نام کاربری:",
-       "ancientpages": "قدیمی‌ترین صفحه‌ها",
+       "ancientpages": "قدیمی‌ترین صفحات",
        "move": "انتقال",
        "movethispage": "انتقال این صفحه",
        "unusedimagestext": "پرونده‌های زیر موجودند اما در هیچ صفحه‌ای به کار نرفته‌اند.\nلطفاً توجه داشته باشید که دیگر وبگاه‌ها ممکن است با یک نشانی اینترنتی مستقیم به یک پرونده پیوند دهند، و با وجود این که در استفادهٔ فعال هستند در این جا فهرست شوند.",
        "logempty": "مورد منطبق با منظور شما در سیاهه یافت نشد.",
        "log-title-wildcard": "صفحه‌هایی را جستجو کن که عنوانشان با این عبارت آغاز می‌شود",
        "showhideselectedlogentries": "تغییر پدیداری موارد انتخاب‌شده سیاهه",
-       "allpages": "همهٔ صفحه‌ها",
+       "allpages": "همهٔ صفحات",
        "nextpage": "صفحهٔ بعد ($1)",
        "prevpage": "صفحهٔ قبلی ($1)",
-       "allpagesfrom": "نمایش صفحه‌ها با شروع از:",
-       "allpagesto": "نمایش صفحه‌ها با پایان در:",
-       "allarticles": "همهٔ صفحه‌ها",
-       "allinnamespace": "همهٔ صفحه‌ها (فضای نام $1)",
+       "allpagesfrom": "نمایش صفحات با شروع از:",
+       "allpagesto": "نمایش صفحات با پایان در:",
+       "allarticles": "همهٔ صفحات",
+       "allinnamespace": "همهٔ صفحات (فضای نام $1)",
        "allpagessubmit": "برو",
        "allpagesprefix": "نمایش صفحه‌های دارای پیشوند:",
-       "allpagesbadtitle": "عنوان صفحهٔ داده‌شده نامعتبر است یا اینکه دارای پیشوندی بین‌زبانی یا بین‌ویکی‌ای است. ممکن است نویسه‌هایی بدارد که نمی‌توان از آنها در عنوان صفحه‌ها استفاده کرد.",
+       "allpagesbadtitle": "عنوان صفحهٔ داده‌شده نامعتبر است یا اینکه دارای پیشوندی بین‌زبانی یا بین‌ویکی‌ای است. ممکن است نویسه‌هایی بدارد که نمی‌توان از آنها در عنوان صفحات استفاده کرد.",
        "allpages-bad-ns": "{{SITENAME}} دارای فضای نام «$1» نیست.",
        "allpages-hide-redirects": "پنهان‌کردن تغییرمسیرها",
        "cachedspecial-viewing-cached-ttl": "شما در حال مشاهدهٔ نسخه‌ای از این صفحه که در میانگیر قرار دارد هستید که ممکن است برای $1 قبل باشد.",
        "cachedspecial-viewing-cached-ts": "شما در حال مشاهدهٔ نسخه‌ای از این صفحه که در میانگیر قرار دارد هستید، و این نسخه ممکن است کاملاً واقعی نباشد.",
        "cachedspecial-refresh-now": "مشاهده آخرین.",
        "categories": "رده‌ها",
-       "categoriespagetext": "{{PLURAL:$1|ردهٔ|رده‌های}} زیر دارای صفحه‌ها یا پرونده‌هایی {{PLURAL:$1|است|هستند}}.\n[[Special:UnusedCategories|رده‌های استفاده‌نشده]] در اینجا نمایش داده نشده‌اند.\nهمچنین [[Special:WantedCategories|رده‌های مورد نیاز]] را ببینید.",
+       "categoriespagetext": "{{PLURAL:$1|ردهٔ|رده‌های}} زیر دارای صفحات یا پرونده‌هایی {{PLURAL:$1|است|هستند}}.\n[[Special:UnusedCategories|رده‌های استفاده‌نشده]] در اینجا نمایش داده نشده‌اند.\nهمچنین [[Special:WantedCategories|رده‌های مورد نیاز]] را ببینید.",
        "categoriesfrom": "نمایش رده‌ها با شروع از:",
        "special-categories-sort-count": "مرتب کردن بر اساس تعداد",
        "special-categories-sort-abc": "مرتب کردن الفبایی",
        "watching": "پی‌گیری...",
        "unwatching": "توقف پی‌گیری...",
        "watcherrortext": "ایرادی در هنگام عوض کردن تنظیمات فهرست پیگیرتان برای «$1» رخ داد.",
-       "enotif_reset": "نشان‌گذاری همهٔ صفحه‌ها به‌عنوان بازدیدشده",
+       "enotif_reset": "نشان‌گذاری همهٔ صفحات به‌عنوان بازدیدشده",
        "enotif_impersonal_salutation": "کاربر {{SITENAME}}",
        "enotif_subject_deleted": "{{SITENAME}} صفحهٔ $1 توسط {{gender:$2|$2}} حذف شد.",
        "enotif_subject_created": "{{SITENAME}} صفحهٔ $1 توسط {{gender:$2|$2}} ایجاد شده.",
        "deletereasonotherlist": "دلیل دیگر",
        "deletereason-dropdown": "*دلایل متداول حذف\n** هرزنگار\n** خرابکاری\n** نقض حق تکثیر\n** درخواست کاربر\n** تغییرمسیر شکسته",
        "delete-edit-reasonlist": "ویرایش دلایل حذف",
-       "delete-toobig": "این صفحه تاریخچهٔ ویرایشی بزرگی دارد، که شامل بیش از $1 {{PLURAL:$1|نسخه|نسخه}} است.\nبه منظور جلوگیری از اختلال ناخواسته در {{SITENAME}} حذف این گونه صفحه‌ها محدود شده‌است.",
+       "delete-toobig": "این صفحه تاریخچهٔ ویرایشی بزرگی دارد، که شامل بیش از $1 {{PLURAL:$1|نسخه|نسخه}} است.\nبه منظور جلوگیری از اختلال ناخواسته در {{SITENAME}} حذف این گونه صفحات محدود شده‌است.",
        "delete-warning-toobig": "این صفحه تاریخچهٔ ویرایشی بزرگی دارد، که شامل بیش از $1 {{PLURAL:$1|نسخه|نسخه}} است.\nحذف آن ممکن است که عملکرد پایگاه دادهٔ {{SITENAME}} را مختل کند;\nبا احتیاط ادامه دهید.",
        "deleteprotected": "شما نمی‌توانید این صفحه را پاک کنید چون که از آن محافظت شده‌است.",
        "deleting-backlinks-warning": "''' هشدار:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|صفحه‌های دیگری]] هستند که به صفحه‌ای که شما در حال حذف آن هستید پیوند دارند یا آن را تراگنجانیده‌اند.",
        "protect_expiry_old": "زمان سرآمدن در گذشته‌است.",
        "protect-unchain-permissions": "باز کردن سایر گزینه‌های محافظت",
        "protect-text": "شما می‌توانید سطح محافظت صفحهٔ '''$1''' را ببینید و از اینجا آن را تغییر دهید.",
-       "protect-locked-blocked": "شما در مدتی که دسترسی‌تان قطع است نمی‌توانید سطح محافظت صفحه‌ها را تغییر دهید.\nتنظیمات فعلی صفحهٔ '''$1''' از این قرار است:",
+       "protect-locked-blocked": "شما در مدتی که دسترسی‌تان قطع است نمی‌توانید سطح محافظت صفحات را تغییر دهید.\nتنظیمات فعلی صفحهٔ '''$1''' از این قرار است:",
        "protect-locked-dblock": "به دلیل قفل شدن پایگاه داده، امکان تغییر سطح محافظت صفحه وجود ندارد.\nتنظیمات فعلی صفحهٔ '''$1''' به این قرار است:",
        "protect-locked-access": "حساب کاربری شما اجازهٔ تغییر سطح محافظت صفحه را ندارد.\nتنظیمات فعلی صفحهٔ '''$1''' به این قرار است:",
        "protect-cascadeon": "این صفحه  در حال حاضر محافظت شده‌است زیرا در {{PLURAL:$1|صفحهٔ|صفحه‌های}} زیر که گزینهٔ محافظت آبشاری {{PLURAL:$1|آن|آن‌ها}} فعال است، گنجانده شده است.\nتغییراتی به سطح محافظت این صفحه به محافظت ابشاری تأثیر نخواهد گذاشت.",
        "undelete-header": "برای دیدن صفحه‌های حذف‌شدهٔ اخیر [[Special:Log/delete|سیاههٔ حذف]] را ببینید.",
        "undelete-search-title": "جستجوی صفحه‌های حذف‌شده",
        "undelete-search-box": "جستجوی صفحه‌های حذف‌شده.",
-       "undelete-search-prefix": "نمایش صفحه‌ها با شروع از:",
+       "undelete-search-prefix": "نمایش صفحات با شروع از:",
        "undelete-search-submit": "برو",
        "undelete-no-results": "هیچ صفحهٔ منطبقی در بایگانی حذف‌شده‌ها یافت نشد.",
        "undelete-filename-mismatch": "امکان احیای نسخهٔ $1 وجود ندارد: نام پرونده مطابقت نمی‌کند.",
        "ipaddressorusername": "نشانی آی‌پی یا نام کاربری:",
        "ipbexpiry": "زمان سرآمدن:",
        "ipbreason": "دلیل:",
-       "ipbreason-dropdown": "*دلایل متداول قطع دسترسی\n**واردکردن اطلاعات نادرست\n**پاک‌کردن اطلاعات مفید از صفحه‌ها\n**هرزنگاری از طریق درج مکرر پیوند به وب‌گاه‌ها\n**درج چرندیات یا نوشته‌های بی‌معنا در صفحه‌ها\n**تهدید یا ارعاب دیگر کاربران\n**سوء استفاده از چند حساب کاربری\n**نام کاربری نامناسب",
+       "ipbreason-dropdown": "*دلایل متداول قطع دسترسی\n**واردکردن اطلاعات نادرست\n**پاک‌کردن اطلاعات مفید از صفحات\n**هرزنگاری از طریق درج مکرر پیوند به وب‌گاه‌ها\n**درج چرندیات یا نوشته‌های بی‌معنا در صفحات\n**تهدید یا ارعاب دیگر کاربران\n**سوء استفاده از چند حساب کاربری\n**نام کاربری نامناسب",
        "ipb-hardblock": "جلوگیری از ویرایش کردن کاربران ثبت نام کرده از طریق این نشانی آی‌پی",
        "ipbcreateaccount": "جلوگیری از ایجاد حساب",
        "ipbemailban": "جلوگیری از ارسال رایانامه",
        "ipbnounblockself": "شما مجاز به باز کردن دسترسی خود نیستید.",
        "lockdb": "قفل کردن پایگاه داده",
        "unlockdb": "از قفل در آوردن پایگاه داده",
-       "lockdbtext": "قفل کردن پایگاه داده امکان ویرایش صفحه‌ها، تغییر تنظیمات، ویرایش پی‌گیری‌ها، و سایر تغییراتی را که نیازمند تغییری در پایگاه داده است، از همهٔ کاربران سلب می‌کند.\nلطفاً تأیید کنید که همین کار را می‌خواهید انجام دهید، و در اولین فرصت پایگاه داده را از حالت قفل شده خارج خواهید کرد.",
-       "unlockdbtext": "از قفل در آوردن پایگاه داده به تمامی کاربران اجازه می‌دهد که توانایی ویرایش صفحه‌ها، تغییر تنظیمات، تغییر پی‌گیری‌ها و هر تغییر دیگری که نیازمند تغییر در پایگاه داده باشد را دوباره به دست بیاورند.\nلطفاً تأیید کنید که همین کار را می‌خواهید انجام دهید.",
+       "lockdbtext": "قفل کردن پایگاه داده امکان ویرایش صفحات، تغییر تنظیمات، ویرایش پی‌گیری‌ها، و سایر تغییراتی را که نیازمند تغییری در پایگاه داده است، از همهٔ کاربران سلب می‌کند.\nلطفاً تأیید کنید که همین کار را می‌خواهید انجام دهید، و در اولین فرصت پایگاه داده را از حالت قفل شده خارج خواهید کرد.",
+       "unlockdbtext": "از قفل در آوردن پایگاه داده به تمامی کاربران اجازه می‌دهد که توانایی ویرایش صفحات، تغییر تنظیمات، تغییر پی‌گیری‌ها و هر تغییر دیگری که نیازمند تغییر در پایگاه داده باشد را دوباره به دست بیاورند.\nلطفاً تأیید کنید که همین کار را می‌خواهید انجام دهید.",
        "lockconfirm": "بله، من جداً می‌خواهم پایگاه داده را قفل کنم.",
        "unlockconfirm": "بله، من جداً می‌خواهم پایگاه داده را از قفل در آورم.",
        "lockbtn": "قفل کردن پایگاه داده",
        "lockedbyandtime": "(به وسیلهٔ $1 در $2 ساعت $3)",
        "move-page": "انتقال $1",
        "move-page-legend": "انتقال صفحه",
-       "movepagetext": "با استفاده از فرم زیر نام صفحه تغییر خواهد کرد، و تمام تاریخچه‌اش به نام جدید منتقل خواهد شد.\nعنوان قدیمی تبدیل به یک صفحهٔ تغییرمسیر به عنوان جدید خواهد شد.\nشما می‌توانید تغییرمسیرهایی که به عنوان اصلی اشاره دارند را به صورت خودکار به‌روزرسانی کنید.\nپیوندهای که به عنوان صفحهٔ قدیمی وجود دارند، تغییر نخواهند کرد؛ حتماً تغییرمسیرهای [[Special:DoubleRedirects|دوتایی]] یا [[Special:BrokenRedirects|خراب]] را بررسی کنید.\n'''شما''' مسئول اطمینان از این هستید که پیوندها هنوز به همان‌جایی که قرار است بروند.\n\nتوجه کنید که اگر از قبل صفحه‌ای در عنوان جدید وجود داشته باشد صفحه منتقل '''نخواهد شد'''،\nمگر این آخرین ویرایش تغییرمسیر باشد و در  تاریخچهٔ ویرایشی نداشته باشد.\nاین یعنی اگر اشتباه کردید می‌توانید صفحه را به همان جایی که از آن منتقل شده بود برگردانید، و این که نمی‌توانید روی صفحه‌ها موجود بنویسید.\n\n'''هشدار!'''\nانتقال صفحه‌ها به نام جدید ممکن است تغییر اساسی و غیرمنتظره‌ای برای صفحه‌های محبوب باشد؛\nلطفاً مطمئن شوید که قبل از انتقال دادن صفحه، عواقب این کار را درک می‌کنید.",
+       "movepagetext": "با استفاده از فرم زیر نام صفحه تغییر خواهد کرد، و تمام تاریخچه‌اش به نام جدید منتقل خواهد شد.\nعنوان قدیمی تبدیل به یک صفحهٔ تغییرمسیر به عنوان جدید خواهد شد.\nشما می‌توانید تغییرمسیرهایی که به عنوان اصلی اشاره دارند را به صورت خودکار به‌روزرسانی کنید.\nپیوندهای که به عنوان صفحهٔ قدیمی وجود دارند، تغییر نخواهند کرد؛ حتماً تغییرمسیرهای [[Special:DoubleRedirects|دوتایی]] یا [[Special:BrokenRedirects|خراب]] را بررسی کنید.\n'''شما''' مسئول اطمینان از این هستید که پیوندها هنوز به همان‌جایی که قرار است بروند.\n\nتوجه کنید که اگر از قبل صفحه‌ای در عنوان جدید وجود داشته باشد صفحه منتقل '''نخواهد شد'''،\nمگر این آخرین ویرایش تغییرمسیر باشد و در  تاریخچهٔ ویرایشی نداشته باشد.\nاین یعنی اگر اشتباه کردید می‌توانید صفحه را به همان جایی که از آن منتقل شده بود برگردانید، و این که نمی‌توانید روی صفحات موجود بنویسید.\n\n'''هشدار!'''\nانتقال صفحات به نام جدید ممکن است تغییر اساسی و غیرمنتظره‌ای برای صفحات محبوب باشد؛\nلطفاً مطمئن شوید که قبل از انتقال دادن صفحه، عواقب این کار را درک می‌کنید.",
        "movepagetext-noredirectfixer": "استفاده از فرم زیر سبب تغییر نام یک صفحه و انتقال تمام تاریخچهٔ آن به نام جدید می‌شود.\nعنوان پیشین تغییرمسیری به عنوان جدید خواهد شد.\nبه خاطر داشته باشید که [[Special:DoubleRedirects|تغییرمسیرهای دوتایی]] یا [[Special:BrokenRedirects|تغییرمسیرهای خراب]] را بررسی کنید.\nشما مسئولید که مطمئن شوید پیوندها به جایی اشاره می‌کنند که قرار است بروند.\n\nتوجه کنید که اگر صفحه‌ای تحت عنوان جدید از قبل موجود باشد، انتقال انجام '''نخواهد شد'''، مگر اینکه صفحه خالی و یا تغییرمسیر باشد و تاریخچهٔ ویرایشی دیگری نداشته باشد.\nاین یعنی اگر صفحه را به نامی اشتباه منتقل کردید می‌توانید این تغییر را واگردانی کنید، اما نمی‌توانید به صفحه‌ای که از قبل موجود است انتقال دهید.\n\n'''هشدار!'''\nانتقال صفحه‌های پربیننده ممکن است عملی غیرمنتظره باشد؛\nلطفاً پیش از انتقال مطمئن شوید از نتیجهٔ کار آگاهید.",
        "movepagetalktext": "صفحهٔ بحث مربوط، اگر وجود داشته باشد، بطور خودکار همراه با مقالهٔ اصلی منتقل خواهد شد '''مگر اینکه''' :\n* در حال انتقال صفحه از این فضای نام به فضای نام دیگری باشید،\n* یک صفحهٔ بحث غیرخالی تحت این نام جدید وجود داشته باشد، یا\n* جعبهٔ زیر را تیک نزده باشید.\n\nدر این حالات، باید صفحه را بطور دستی انتقال داده و یا محتویات دو صفحه را با ویرایش ادغام کنید.",
        "movearticle": "انتقال صفحه:",
        "moveuserpage-warning": "'''هشدار:''' شما در حال انتقال دادن یک صفحهٔ کاربر هستید. توجه داشته باشید که تنها صفحه منتقل می‌شود و نام کاربر تغییر '''نمی‌یابد'''.",
        "movecategorypage-warning": "<strong>هشدار:</strong> شما در حال انتقال صفحه رده هستید. لطفاً توجه داشته باشید که فقط صفحه منتقل خواهد شد و  صفحات در رده قدیمی می‌مانند و به رده جدید <em>نمی‌روند</em>.",
-       "movenologintext": "برای انتقال صفحه‌ها باید کاربر ثبت‌شده بوده و [[Special:UserLogin|به سامانه وارد شوید]].",
-       "movenotallowed": "شما اجازهٔ انتقال دادن صفحه‌ها را ندارید.",
+       "movenologintext": "برای انتقال صفحات باید کاربر ثبت‌شده بوده و [[Special:UserLogin|به سامانه وارد شوید]].",
+       "movenotallowed": "شما اجازهٔ انتقال دادن صفحات را ندارید.",
        "movenotallowedfile": "شما اجازهٔ انتقال پرونده‌ها را ندارید.",
        "cant-move-user-page": "شما اجازه ندارید صفحه‌های کاربری سرشاخه را انتقال دهید.",
        "cant-move-to-user-page": "شما اجازه ندارید که یک صفحه را به یک صفحهٔ کاربر انتقال دهید (به استثنای زیر صفحه‌های کاربری).",
        "cant-move-category-page": "شما اجازهٔ انتقال دادن صفحهٔ رده‌ها را ندارید.",
        "cant-move-to-category-page": "شما مجوز برای انتقال صفحه به صفحه رده ندارید.",
-       "newtitle": "به‌عنوان جدید",
+       "newtitle": "به عنوان تازه:",
        "move-watch": "پی‌گیری صفحه‌های مبدأ و مقصد",
        "movepagebtn": "صفحه منتقل شود",
        "pagemovedsub": "انتقال با موفقیت انجام شد",
        "movepage-page-unmoved": "صفحهٔ $1 را نمی‌توان به $2 انتقال داد.",
        "movepage-max-pages": "حداکثر تعداد صفحه‌های ممکن ($1 {{PLURAL:$1|صفحه|صفحه}}) که می‌توان انتقال داد منتقل شدند و صفحه‌های دیگر را نمی‌توان به طور خودکار منتقل کرد.",
        "movelogpage": "سیاههٔ انتقال",
-       "movelogpagetext": "در زیر فهرستی از انتقال صفحه‌ها آمده است.",
+       "movelogpagetext": "در زیر فهرستی از انتقال صفحات آمده‌است.",
        "movesubpage": "{{PLURAL:$1|زیرصفحه|زیرصفحه‌ها}}",
        "movesubpagetext": "این صفحه $1 زیرصفحه دارد که در زیر نمایش {{PLURAL:$1|یافته‌است|یافته‌اند}}.",
        "movenosubpage": "این صفحه هیچ زیرصفحه‌ای ندارد.",
        "bad-target-model": "مقصد مورد نظر از مدل محتوایی متفاوتی استفاده می‌کند. تبدیل $1 به $2 ممکن نیست.",
        "imagenocrossnamespace": "امکان انتقال تصویر به فضای نام غیر پرونده وجود ندارد",
        "nonfile-cannot-move-to-file": "امکان انتقال محتوای غیر پرونده به فضای نام پرونده وجود ندارد",
-       "imagetypemismatch": "پسÙ\88Ù\86د Ù¾Ø±Ù\88Ù\86دÙ\87 Ø¬Ø¯Û\8cد با نوع آن سازگار نیست",
+       "imagetypemismatch": "پسÙ\88Ù\86د Ù¾Ø±Ù\88Ù\86دÙ\87 ØªØ§Ø²Ù\87 با نوع آن سازگار نیست",
        "imageinvalidfilename": "نام پروندهٔ هدف نامجاز است",
        "fix-double-redirects": "به روز کردن تمامی تغییرمسیرهایی که به مقالهٔ اصلی اشاره می‌کنند",
        "move-leave-redirect": "بر جا گذاشتن یک تغییرمسیر",
        "semiprotectedpagemovewarning": "'''تذکر:''' این صفحه قفل شده‌است به طوری که تنها کاربران ثبت نام کرده می‌توانند آن را انتقال دهند.\nآخرین موارد سیاهه در زیر آمده است:",
        "move-over-sharedrepo": "== پرونده موجود است ==\n[[:$1]] در یک مخزن مشترک وجود دارد. انتقال یک پرونده به این نام باعث باطل شدن پرونده مشترک خواهد شد.",
        "file-exists-sharedrepo": "نام پرونده انتخاب شده از قبل در یک مخزن مشترک استفاده شده‌است.\nلطفاً یک نام دیگر برگزینید.",
-       "export": "برون‌بری صفحه‌ها",
-       "exporttext": "شما می‌توانید متن و تاریخچهٔ ویرایش یک صفحهٔ مشخص یا مجموعه‌ای از صفحه‌ها را به شکل پوشیده در اکس‌ام‌ال برون‌بری کنید.\nاین اطلاعات را می‌توان در ویکی دیگری که نرم‌افزار «مدیاویکی» را اجرا می‌کند از طریق [[Special:Import|صفحهٔ درون‌ریزی]] وارد کرد.\n\nبرای برون‌بری صفحه‌ها، عنوان آن‌ها را در جعبهٔ زیر وارد کنید (در هر سطر فقط یک عنوان) و مشخص کنید که آیا نسخهٔ اخیر صفحه را به همراه نسخه‌های قدیمی‌تر و تاریخچهٔ صفحه می‌خواهید، یا تنها نسخهٔ اخیر صفحه و اطلاعات آخرین ویرایش را می‌خواهید.\n\nدر حالت دوم، شما می‌توانید از یک پیوند استفاده کنید، مثلاً [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] برای صفحهٔ «[[{{MediaWiki:Mainpage}}]]».",
-       "exportall": "برون‌بری همهٔ صفحه‌ها",
+       "export": "برون‌بری صفحات",
+       "exporttext": "شما می‌توانید متن و تاریخچهٔ ویرایش یک صفحهٔ مشخص یا مجموعه‌ای از صفحات را به شکل پوشیده در اکس‌ام‌ال برون‌بری کنید.\nاین اطلاعات را می‌توان در ویکی دیگری که نرم‌افزار «مدیاویکی» را اجرا می‌کند از طریق [[Special:Import|صفحهٔ درون‌ریزی]] وارد کرد.\n\nبرای برون‌بری صفحات، عنوان آن‌ها را در جعبهٔ زیر وارد کنید (در هر سطر فقط یک عنوان) و مشخص کنید که آیا نسخهٔ اخیر صفحه را به همراه نسخه‌های قدیمی‌تر و تاریخچهٔ صفحه می‌خواهید، یا تنها نسخهٔ اخیر صفحه و اطلاعات آخرین ویرایش را می‌خواهید.\n\nدر حالت دوم، شما می‌توانید از یک پیوند استفاده کنید، مثلاً [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] برای صفحهٔ «[[{{MediaWiki:Mainpage}}]]».",
+       "exportall": "برون‌بری همهٔ صفحات",
        "exportcuronly": "فقط نسخهٔ فعلی شامل شود، نه کل تاریخچه",
-       "exportnohistory": "----\n'''توجه:''' امکان برون‌بری تاریخچهٔ کامل صفحه‌ها از طریق این صفحه به دلایل اجرایی از کار انداخته شده‌است.",
+       "exportnohistory": "----\n'''توجه:''' امکان برون‌بری تاریخچهٔ کامل صفحات از طریق این صفحه به دلایل اجرایی از کار انداخته شده‌است.",
        "exportlistauthors": "شامل فهرست کامل مشارکت‌کنندگان هر صفحه",
        "export-submit": "برون‌بری",
-       "export-addcattext": "افزودن صفحه‌ها از رده:",
+       "export-addcattext": "افزودن صفحات از رده:",
        "export-addcat": "افزودن",
-       "export-addnstext": "افزودن صفحه‌ها از فضای نام:",
+       "export-addnstext": "افزودن صفحات از فضای نام:",
        "export-addns": "افزودن",
        "export-download": "ذخیره به صورت پرونده",
        "export-templates": "شامل شدن الگوها",
        "thumbnail_gd-library": "تنظیمات ناقص کتابخانهٔ GD: عملکرد $1 وجود ندارد",
        "thumbnail_image-missing": "پرونده به نظر گم شده‌است: $1",
        "thumbnail_image-failure-limit": "تلاش‌های ناموفق اخیر بسیاری ($1 یا بیشتر) برای ارائهٔ این تصویر کوچک وجود داشته‌ است. لطفأ بعداً دوباره تلاش کنید.",
-       "import": "درون‌ریزی صفحه‌ها",
+       "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-upload-filename": "نام پرونده:",
        "import-comment": "توضیح:",
        "importtext": "لطفاً پرونده را از ویکی منبع با کمک [[Special:Export|ابزار برون‌بری]] دریافت کنید.\nسپس آن را روی دستگاه‌تان ذخیره کنید و اینجا بارگذاری نمایید.",
-       "importstart": "در حال درون‌ریزی صفحه‌ها...",
+       "importstart": "در حال درون‌ریزی صفحات...",
        "import-revision-count": "$1 {{PLURAL:$1|ویرایش|ویرایش}}",
        "importnopages": "صفحه‌ای برای درون‌ریزی نیست.",
        "imported-log-entries": "$1 {{PLURAL:$1|مورد سیاهه|مورد سیاهه}} درون ریزی شد.",
-       "importfailed": "درون‌ریزی صفحه‌ها شکست خورد: <nowiki>$1</nowiki>",
+       "importfailed": "درون‌ریزی صفحات شکست خورد: <nowiki>$1</nowiki>",
        "importunknownsource": "نوع مأخذ درون‌ریزی معلوم نیست",
-       "importcantopen": "پروندهٔ درون‌ریزی صفحه‌ها باز نشد",
+       "importcantopen": "پروندهٔ درون‌ریزی صفحات باز نشد",
        "importbadinterwiki": "پیوند میان‌ویکی نادرست",
        "importsuccess": "درون‌ریزی با موفقیت انجام شد!",
        "importnosources": "هیچ منبعی برای درون‌ریزی اطلاعات از ویکی دیگر تعریف نشده‌است.",
        "import-rootpage-invalid": "با توجه به ریشه صفحه عنوان نامعتبر است.",
        "import-rootpage-nosubpage": "فضای نام  \"$1\" صفحهٔ مبنا اجازهٔ زیرصفحه نمی‌دهد.",
        "importlogpage": "سیاههٔ درون‌ریزی‌ها",
-       "importlogpagetext": "درون‌ریزی صفحه‌ها به همراه تاریخچهٔ ویرایش آن‌ها از ویکی‌های دیگر.",
+       "importlogpagetext": "درون‌ریزی صفحات به همراه تاریخچهٔ ویرایش آن‌ها از ویکی‌های دیگر.",
        "import-logentry-upload": "[[$1]] را از طریق بارگذاری پرونده درون‌ریزی کرد",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|نسخه|نسخه}} واردشده",
        "import-logentry-interwiki": "$1 را تراویکی کرد",
        "tooltip-ca-unwatch": "حذف این صفحه از فهرست پی‌گیری‌هایتان",
        "tooltip-search": "جستجو در {{SITENAME}}",
        "tooltip-search-go": "در صورت امکان به صفحه‌ای با همین نام برو",
-       "tooltip-search-fulltext": "جستجوی این عبارت در صفحه‌ها",
+       "tooltip-search-fulltext": "جستجوی این عبارت در صفحات",
        "tooltip-p-logo": "مشاهدهٔ صفحهٔ اصلی",
        "tooltip-n-mainpage": "مشاهدهٔ صفحهٔ اصلی",
        "tooltip-n-mainpage-description": "مشاهدهٔ صفحهٔ اصلی",
        "creditspage": "اعتبارات این صفحه",
        "nocredits": "اطلاعات سازندگان این صفحه موجود نیست.",
        "spamprotectiontitle": "پالایهٔ هرزنگاری‌ها",
-       "spamprotectiontext": "از Ø°Ø®Û\8cرÙ\87 Ú©Ø±Ø¯Ù\86 ØµÙ\81Ø­Ù\87 ØªÙ\88سط Ù¾Ø§Ù\84اÛ\8cÙ\87Ù\94 Ù\87رزÙ\86گارÛ\8câ\80\8cÙ\87ا Ø¬Ù\84Ù\88Ú¯Û\8cرÛ\8c Ø´Ø¯.\nÙ\85عÙ\85Ù\88Ù\84اÙ\8b Ø§Û\8cÙ\86 Ø§ØªÙ\81اÙ\82 Ø²Ù\85اÙ\86Û\8c Ù\85Û\8câ\80\8cاÙ\81تد Ú©Ù\87 Ù\85تÙ\86 Ø¬Ø¯Û\8cد صفحه، حاوی پیوندی به یک نشانی وب باشد که در فهرست سیاه قرار دارد.",
+       "spamprotectiontext": "از Ø°Ø®Û\8cرÙ\87 Ú©Ø±Ø¯Ù\86 ØµÙ\81Ø­Ù\87 ØªÙ\88سط Ù¾Ø§Ù\84اÛ\8cÙ\87Ù\94 Ù\87رزÙ\86گارÛ\8câ\80\8cÙ\87ا Ø¬Ù\84Ù\88Ú¯Û\8cرÛ\8c Ø´Ø¯.\nÙ\85عÙ\85Ù\88Ù\84اÙ\8b Ø§Û\8cÙ\86 Ø§ØªÙ\81اÙ\82 Ø²Ù\85اÙ\86Û\8c Ù\85Û\8câ\80\8cاÙ\81تد Ú©Ù\87 Ù\85تÙ\86 ØªØ§Ø²Ù\87 صفحه، حاوی پیوندی به یک نشانی وب باشد که در فهرست سیاه قرار دارد.",
        "spamprotectionmatch": "متن زیر چیزی‌است که پالایهٔ هرزه‌نگاری ما را به کارانداخت: $1",
        "spambot_username": "هرزه‌تمیزکارِ مدیاویکی",
        "spam_reverting": "واگردانی به آخرین نسخه‌ای که پیوندی به $1 ندارد.",
        "pageinfo-protect-cascading-yes": "بله",
        "pageinfo-protect-cascading-from": "محافظت آبشاری از",
        "pageinfo-category-info": "اطلاعات رده",
-       "pageinfo-category-pages": "تعداد صفحه‌ها",
+       "pageinfo-category-pages": "تعداد صفحات",
        "pageinfo-category-subcats": "تعداد زیررده‌ها",
        "pageinfo-category-files": "تعداد پرونده‌ها",
        "markaspatrolleddiff": "برچسب گشت بزن",
        "autosumm-blank": "صفحه را خالی کرد",
        "autosumm-replace": "جایگزینی صفحه با '$1'",
        "autoredircomment": "تغییرمسیر به [[$1]]",
-       "autosumm-new": "صÙ\81Ø­Ù\87â\80\8cاÛ\8c Ø¬Ø¯Û\8cد حاوی «$1» ایجاد کرد",
+       "autosumm-new": "صÙ\81Ø­Ù\87â\80\8cاÛ\8c ØªØ§Ø²Ù\87 حاوی «$1» ایجاد کرد",
        "autosumm-newblank": "ایجاد صفحه خالی",
        "size-bytes": "$1 بایت",
        "size-kilobytes": "$1 کیلوبایت",
        "specialpages-group-media": "گزارش بارگذاری رسانه‌ها",
        "specialpages-group-users": "کاربرها و دسترسی‌ها",
        "specialpages-group-highuse": "صفحه‌های پربازدید",
-       "specialpages-group-pages": "فهرست‌های صفحه‌ها",
-       "specialpages-group-pagetools": "ابزارهای صفحه‌ها",
+       "specialpages-group-pages": "فهرست‌های صفحات",
+       "specialpages-group-pagetools": "ابزارهای صفحات",
        "specialpages-group-wiki": "داده و ابزارها",
        "specialpages-group-redirects": "صفحه‌های ویژهٔ تغییرمسیر دهنده",
        "specialpages-group-spam": "ابزارهای هرزنگاری",
        "tags-active-no": "خیر",
        "tags-edit": "ویرایش",
        "tags-hitcount": "$1 {{PLURAL:$1|تغییر|تغییر}}",
-       "comparepages": "مقایسهٔ صفحه‌ها",
+       "comparepages": "مقایسهٔ صفحات",
        "compare-page1": "صفحهٔ ۱",
        "compare-page2": "صفحهٔ ۲",
        "compare-rev1": "نسخهٔ ۱",
        "logentry-rights-rights-legacy": "$1 گروه عضویت $3 را {{GENDER:$2|تغییر داد}}",
        "logentry-rights-autopromote": "$1 به طور خودکار از $4 به $5 {{GENDER:$2|ارتقاء داد}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|بارگذاری کرد}} $3",
-       "logentry-upload-overwrite": "$1 Û\8cÚ© Ù\86سخÙ\87Ù\94 Ø¬Ø¯Û\8cد {{GENDER:$2|بارگذاری‌کرد}} $3",
+       "logentry-upload-overwrite": "$1 Û\8cÚ© Ù\86سخÙ\87Ù\94 ØªØ§Ø²Ù\87 {{GENDER:$2|بارگذاری‌کرد}} $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|بارگذاری کرد}} $3",
        "rightsnone": "(هیچ)",
        "feedback-bugornote": "اگر آماده‌اید تا مشکلی فنی را با جزئیاتش شرح دهید لطفاً [$1 یک ایراد گزارش دهید]. در غیر این صورت می‌توانید از فرم سادهٔ زیر استفاده کنید. نظر شما به همراه نام کاربری و مرورگرتان به صفحهٔ «[$3 $2]» افزوده خواهد شد.",
        "feedback-thanks": "سپاس! بازخورد شما در صفحهٔ «[$1 $2]» ثبت شد.",
        "feedback-close": "انجام شد",
        "feedback-bugcheck": "عالی‌است! فقط بررسی کنید که از [$1 ایرادهای شناخته‌شده] نباشد.",
-       "feedback-bugnew": "بررسÛ\8c Ú©Ø±Ø¯Ù\85. Ø§Û\8cرادÛ\8c Ø¬Ø¯Û\8cد را گزارش بده",
+       "feedback-bugnew": "بررسÛ\8c Ú©Ø±Ø¯Ù\85. Ø§Û\8cرادÛ\8c ØªØ§Ø²Ù\87 را گزارش بده",
        "searchsuggest-search": "جستجو",
        "searchsuggest-containing": "صفحه‌های دربردارنده...",
        "api-error-badaccess-groups": "شما اجازهٔ بارگذاری پرونده‌ها را در این ویکی ندارید.",
index 0d165ff..698fa8e 100644 (file)
        "userlogin-resetlink": "Unohditko salasanasi?",
        "userlogin-resetpassword-link": "Unohditko salasanasi?",
        "userlogin-helplink2": "Apua sisäänkirjautumiseen",
-       "userlogin-loggedin": "Olet jo kirjautunut sisään tunnuksella {{GENDER:$1|$1}}.\nKäytä alla olevaa lomaketta kirjautuaksesi sisään toisena käyttäjänä.",
-       "userlogin-createanother": "Luo toinen käyttäjätunnus",
        "createacct-emailrequired": "Sähköpostiosoite",
        "createacct-emailoptional": "Sähköpostiosoite (vapaaehtoinen)",
        "createacct-email-ph": "Anna sähköpostiosoitteesi",
index 36ec047..972ca5e 100644 (file)
        "userlogin-resetlink": "Vous avez oublié vos détails de connexion ?",
        "userlogin-resetpassword-link": "Mot de passe oublié ?",
        "userlogin-helplink2": "Aide à la connexion",
-       "userlogin-loggedin": "Vous êtes déjà connecté{{GENDER:$1||e}} en tant que {{GENDER:$1|$1}}.\nUtilisez le formulaire ci-dessous pour vous connecter avec un autre compte utilisateur.",
-       "userlogin-createanother": "Créer un autre compte",
        "createacct-emailrequired": "Adresse de courriel",
        "createacct-emailoptional": "Adresse de courriel (facultative)",
        "createacct-email-ph": "Entrez votre adresse de courriel",
        "showpreview": "Prévisualiser",
        "showdiff": "Voir les modifications",
        "blankarticle": "<strong>Attention :</strong> La page que vous créez est vide.\nSi vous cliquez de nouveau sur « {{int:savearticle}} », la page sera créée sans aucun contenu.",
-       "anoneditwarning": "<strong>Attention :</strong> Vous n’êtes pas identifié(e). Votre adresse IP sera enregistrée dans l’historique de cette page.",
+       "anoneditwarning": "<strong>Attention :</strong> Vous n’êtes pas connecté. Votre adresse IP sera visible de tout le monde si vous faites des modifications. Si vous <strong>[$1 vous connectez]</strong> ou <strong>[$2 créez un compte]</strong>, vos modifications seront attribuées à votre nom d’utilisateur, entre autres avantages.",
        "anonpreviewwarning": "''Vous n’êtes pas identifié(e). Sauvegarder enregistrera votre adresse IP dans l’historique des modifications de la page.''",
        "missingsummary": "'''Rappel :''' vous n'avez pas encore fourni le résumé de votre modification.\nSi vous cliquez de nouveau sur le bouton « {{int:savearticle}} », la publication sera faite sans nouvel avertissement.",
        "missingcommenttext": "Veuillez entrer un commentaire ci-dessous.",
        "emailuser-title-notarget": "Envoyer un courriel à l'utilisateur",
        "emailpage": "Envoyer un courriel à l'utilisateur",
        "emailpagetext": "Vous pouvez utiliser le formulaire ci-dessous pour envoyer un courriel à {{GENDER:$1|cet utilisateur|cette utilisatrice}}.\nL'adresse électronique que vous avez indiquée dans [[Special:Preferences|vos préférences]] apparaîtra dans le champ « Expéditeur » de votre message ; ainsi, le destinataire pourra vous répondre directement.",
-       "defemailsubject": "{{SITENAME}} Courriel de l'utilisateur « $1 »",
+       "defemailsubject": "Courriel de {{SITENAME}} de l'utilisateur « $1 »",
        "usermaildisabled": "L'envoi de courriels entre utilisateurs est désactivé",
        "usermaildisabledtext": "Vous ne pouvez pas envoyer de courriels à d'autres utilisateurs sur ce wiki",
        "noemailtitle": "Aucune adresse de courriel",
index af10ca7..80a9a4c 100644 (file)
        "userlogin-resetlink": "Esqueceu os seus datos de rexistro?",
        "userlogin-resetpassword-link": "Esqueceu o contrasinal?",
        "userlogin-helplink2": "Axuda co rexistro",
-       "userlogin-loggedin": "Xa accedeu ao sistema como {{GENDER:$1|$1}}.\nUtilice o formulario inferior para acceder como outro usuario.",
-       "userlogin-createanother": "Crear outra conta",
        "createacct-emailrequired": "Enderezo de correo electrónico",
        "createacct-emailoptional": "Enderezo de correo electrónico (opcional)",
        "createacct-email-ph": "Insira o seu enderezo de correo electrónico",
index 3cd4cf8..3ce9eda 100644 (file)
        "userlogin-resetlink": "שכחת את פרטי הכניסה?",
        "userlogin-resetpassword-link": "שכחת את הסיסמה?",
        "userlogin-helplink2": "עזרה בכניסה לחשבון",
-       "userlogin-loggedin": "אתם כבר מחוברים לחשבון {{GENDER:$1|$1}}.\nהשתמשו בטופס שלהלן כדי להתחבר לחשבון אחר.",
-       "userlogin-createanother": "יצירת חשבון אחר",
        "createacct-emailrequired": "כתובת דוא\"ל",
        "createacct-emailoptional": "כתובת דוא\"ל (לא חובה)",
        "createacct-email-ph": "יש להקליד את כתובת הדוא\"ל שלך",
        "noemail": "לא רשומה כתובת דואר אלקטרוני עבור ה{{GENDER:$1|משתמש|משתמשת}} \"$1\".",
        "noemailcreate": "יש לספק כתובת דואר אלקטרוני תקינה.",
        "passwordsent": "סיסמה חדשה נשלחה לכתובת הדואר האלקטרוני הרשומה עבור \"$1\".\nאנא היכנסו חזרה לאתר אחרי שתקבלו אותה.",
-       "blocked-mailpassword": "כתובת ה־IP שלך נחסמה מעריכה, ולפיכך אינך מורשה להשתמש באפשרות שחזור הסיסמה כדי למנוע ניצול לרעה של התכונה.",
+       "blocked-mailpassword": "כתובת ה־IP שלך נחסמה מעריכה, ולפיכך אינך מורשה להשתמש באפשרות שחזור הסיסמה, וזאת כדי למנוע ניצול לרעה של התכונה.",
        "eauthentsent": "דוא\"ל אימות נשלח לכתובת הדוא\"ל שצוינה.\nלפני שדברי דוא\"ל אחרים יישלחו לחשבון הזה, יהיה עליכם לפעול לפי ההוראות בדוא\"ל, כדי לאשר שהחשבון אכן שייך לכם.",
        "throttled-mailpassword": "כבר נשלח דוא\"ל לאיפוס הסיסמה ב{{PLURAL:$1|שעה האחרונה|שעתיים האחרונות|־$1 השעות האחרונות}}.\nכדי למנוע ניצול לרעה, יכול להישלח רק דוא\"ל אחד כזה בכל {{PLURAL:$1|שעה|שעתיים|$1 שעות}}.",
        "mailerror": "שגיאה בשליחת דואר: $1",
        "showpreview": "תצוגה מקדימה",
        "showdiff": "הצגת שינויים",
        "blankarticle": "<strong>אזהרה:</strong> הדף שאתם יוצרים הוא ריק.\nאם תלחצו שוב על \"{{int:savearticle}}\", הדף ייווצר ללא תוכן.",
-       "anoneditwarning": "'''אזהרה:''' אינכם מחוברים לחשבון. כתובת ה־IP שלכם תירשם בהיסטוריית העריכות של הדף.",
+       "anoneditwarning": "<strong>אזהרה:</strong> אינכם מחוברים לחשבון. כתובת ה־IP שלכם תוצג בפומבי אם תבצעו עריכות כלשהן. אם <strong>[$1 תיכנסו לחשבון]</strong> או <strong>[$2 תיצרו חשבון]</strong>, העריכות שלכם תיוחסנה לשם המשתמש שלכם ותקבלו גם יתרונות אחרים.",
        "anonpreviewwarning": "''אינכם מחוברים לחשבון. שמירה תגרום לכתובת ה־IP שלכם להירשם בהיסטוריית העריכות של הדף.''",
        "missingsummary": "'''תזכורת:''' לא הזנתם תקציר עריכה.\nאם תלחצו שוב על הכפתור \"{{int:savearticle}}\", עריכתכם תישמר בלעדיו.",
        "missingcommenttext": "אנא הקלידו את ההודעה למטה.",
index 1aa0dbc..81a03f4 100644 (file)
        "hidetoc": "छुपाएँ",
        "collapsible-collapse": "छोटा करें",
        "collapsible-expand": "विस्तार करें",
+       "confirmable-confirm": "क्या {{GENDER:$1|आप}} निश्चित हो?",
+       "confirmable-yes": "हाँ",
+       "confirmable-no": "नहीं",
        "thisisdeleted": "$1 देखें या वापिस लाएँ?",
        "viewdeleted": "$1 दिखायें?",
        "restorelink": "{{PLURAL:$1|एक हटाया हुआ|$1 हटाये हुए}} बदलाव",
        "userlogin-resetlink": "अपनी प्रवेश जानकारी भूल गए हैं?",
        "userlogin-resetpassword-link": "अपना पासवर्ड भूल गए?",
        "userlogin-helplink2": "लॉग इन करने में सहायता",
-       "userlogin-loggedin": "आप {{GENDER:$1|$1}} के रूप में पहले से लॉग्ड इन हैं।\nकिसी अन्य सदस्य के रूप में लॉग इन करने के लिए निम्नलिखित फ़ॉर्म का प्रयोग करें।",
-       "userlogin-createanother": "एक अन्य खाता खोलें",
        "createacct-emailrequired": "ई-मेल पता",
        "createacct-emailoptional": "ई-मेल पता (वैकल्पिक)",
        "createacct-email-ph": "अपना ई-मेल पता लिखें",
index 6b07b21..35fd4d9 100644 (file)
        "gotaccountlink": "Prijavite se",
        "userlogin-resetlink": "Zaboravili ste detalje vaše prijave?",
        "userlogin-resetpassword-link": "Zaboravili ste zaporku?",
-       "userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nRabite donji obrazac da biste se prijavili kao drugi suradnik.",
-       "userlogin-createanother": "Stvori još jedan račun",
        "createacct-emailrequired": "Adresa e-pošte",
        "createacct-emailoptional": "Adresa e-pošte",
        "createacct-email-ph": "Upišite svoju adresu e-pošte",
        "login-userblocked": "Ovaj je suradnik blokiran. Prijava nije dopuštena.",
        "wrongpassword": "Lozinka koju ste unijeli nije ispravna. Pokušajte ponovno.",
        "wrongpasswordempty": "Niste unijeli lozinku. Pokušajte ponovno.",
-       "passwordtooshort": "Lozinka mora sadržavati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}.",
+       "passwordtooshort": "Zaporka mora sadržavati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}.",
        "password-name-match": "Vaša lozinka mora biti različita od Vašeg suradničkog imena.",
        "password-login-forbidden": "Uporaba ovog suradničkog imena i lozinke nije dozvoljena.",
        "mailmypassword": "Pošalji mi novu lozinku",
        "passwordremindertext": "Netko je (vjerojatno Vi, s IP adrese $1) zatražio novu lozinku za projekt {{SITENAME}} ($4).\nPrivremena lozinka za suradnika \"$2\" je postavljena na \"$3\".\nUkoliko ste to Vi učinili, molimo Vas da se prijavite i promijenite lozinku.\nPrivremena lozinka vrijedi još {{PLURAL:$5|$5 dan|$5 dana}}.\n\nUkoliko niste zatražili novu lozinku, ili ste se sjetili stare lozinke i\nviše ju ne želite promijeniti, slobodno zanemarite ovu poruku i nastavite\nkoristiti staru lozinku.",
        "noemail": "Suradnik \"$1\" nema zapisanu e-mail adresu.",
        "noemailcreate": "Morate navesti važeću e-mail adresu",
-       "passwordsent": "Nova je lozinka poslana na e-mail adresu suradnika \"$1\"",
+       "passwordsent": "Nova je zaporka poslana na adresu elektroničke pošte suradnika \"$1\"",
        "blocked-mailpassword": "Vašoj IP adresi je blokirano uređivanje stranica, a da bi se spriječila nedopuštena radnja, mogućnost zahtijevanja nove lozinke je također onemogućena.",
        "eauthentsent": "Na navedenu adresu poslana je e-poruka s potvrdom.\nPrije nego što pošaljemo daljnje poruke, molimo Vas otvorite e-poruku i slijedite u njemu sadržana uputstva kako biste potvrdili da je adresa e-pošte zaista Vaša.",
        "throttled-mailpassword": "Već Vam je poslan e-mail za promjenu zaporke, u {{PLURAL:$1|posljednjih sat vremena|posljednja $1 sata|posljednjih $1 sati}}.\nDa bi spriječili zloupotrebu, moguće je poslati samo jedan e-mail za promjenu zaporke {{PLURAL:$1|svakih sat vremena|svaka $1 sata|svakih $1 sati}}.",
        "php-mail-error-unknown": "Nepoznata pogrješka u funkciji PHP-poruke()",
        "user-mail-no-addy": "Pokušaj slanja e-maila bez e-mail adrese.",
        "user-mail-no-body": "Pokušali ste poslati e-mail bez sadržaja ili s prekratkim sadržajem.",
-       "changepassword": "Promjena lozinke",
+       "changepassword": "Promjena zaporke",
        "resetpass_announce": "Da biste završili proces mijenjanja lozinke, upišite \nnovu lozinku.",
        "resetpass_header": "Promijeni lozinku računa",
        "oldpassword": "Stara lozinka",
        "passwordreset": "Ponovno postavi lozinku",
        "passwordreset-text-one": "Ispunite ovaj obrazac ako želite ponovno postaviti Vašu zaporku.",
        "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja da biste dobili privremenu zaporku e-poštom.}}",
-       "passwordreset-legend": "Poništi lozinku",
+       "passwordreset-legend": "Poništi zaporku",
        "passwordreset-disabled": "Poništavanje lozinke je onemogućeno na ovom wikiju.",
        "passwordreset-emaildisabled": "Funkcija e-pošte je onemogućena na ovom wikiju.",
        "passwordreset-username": "Suradničko ime:",
        "passwordreset-emailsent-capture": "Poslan Vam je podsjetnik kao e-pošta (tekst je prikazan dolje).",
        "passwordreset-emailerror-capture": "Napravljena je e-poruka za ponovno postavljanje zaporke (prikazana ispod), ali njeno slanje suradniku nije uspjelo: $1",
        "changeemail": "Promijeni e-mail adresu",
-       "changeemail-header": "Promijeni e-mail adresu računa",
+       "changeemail-header": "Promijeni adresu e-pošte računa",
        "changeemail-text": "Za promjenu e-mail adrese popunite ovaj obrazac. Morat ćete unijeti svoju lozinku da potvrdite ovu promjenu.",
        "changeemail-no-info": "Morate biti prijavljeni da biste izravno pristupili ovoj stranici.",
-       "changeemail-oldemail": "Trenutna E-mail adresa:",
-       "changeemail-newemail": "Nova E-mail adresa:",
+       "changeemail-oldemail": "Trenutačna adresa e-pošte:",
+       "changeemail-newemail": "Nova adresa e-pošte:",
        "changeemail-none": "(ništa)",
        "changeemail-password": "Zaporka za {{SITENAME}}:",
        "changeemail-submit": "Promijeni E-mail",
        "autoblockedtext": "Vaša IP adresa automatski je blokirana zbog toga što ju je koristio drugi suradnik, kojeg je blokirao $1.\nRazlog blokiranja je sljedeći:\n\n:''$2''\n\n* Početak blokade: $8\n* Blokada istječe: $6\n* Ime blokiranog suradnika: $7\n\nMožete kontaktirati $1 ili jednog od [[{{MediaWiki:Grouppage-sysop}}|administratora]] kako bi Vam pojasnili razlog blokiranja.\n\nPrimijetite da ne možete rabiti opciju \"Pošalji mu e-poruku\" ako niste upisali valjanu adresu e-pošte u Vašim [[Special:Preferences|suradničkim postavkama]] i ako niste u tome onemogućeni prilikom blokiranja.\n\nVaša trenutačna IP adresa je $3, a oznaka bloka #$5. Molimo navedite ovaj broj kod svakog upita vezano za razlog blokiranja.",
        "blockednoreason": "bez obrazloženja",
        "whitelistedittext": "Za uređivanje stranice morate se $1.",
-       "confirmedittext": "Morate potvrditi Vašu e-mail adresu prije nego što Vam bude omogućeno uređivanje. Molim unesite i ovjerite Vašu e-mail adresu u [[Special:Preferences|suradničkim postavkama]].",
+       "confirmedittext": "Morate potvrditi Vašu adresu e-pošte prije nego što Vam bude omogućeno uređivanje. Molim unesite i ovjerite Vašu adresu e-pošte u [[Special:Preferences|suradničkim postavkama]].",
        "nosuchsectiontitle": "Ne mogu pronaći odlomak",
        "nosuchsectiontext": "Pokušali ste uređivati odlomak koji ne postoji.\nMožda je premješten ili izbrisan dok ste pregledavali stranicu.",
        "loginreqtitle": "Nužna prijava",
        "prefs-watchlist-token": "Token popisa praćenja:",
        "prefs-misc": "Razno",
        "prefs-resetpass": "Promijeni lozinku",
-       "prefs-changeemail": "promijeni e-mail",
+       "prefs-changeemail": "promijeni adresu e-pošte",
        "prefs-setemail": "Postavite E-mail adresu",
        "prefs-email": "Mogućnosti e-maila",
        "prefs-rendering": "Izgled",
        "markedaspatrollednotify": "Uređivanje stranice $1 označeno je pregledanim.",
        "markedaspatrollederrornotify": "Označavanje stranice pregledanom nije uspjelo.",
        "patrol-log-page": "Evidencija pregledavanja promjena",
-       "patrol-log-header": "Ovo su evidencije patroliranih izmjena.",
+       "patrol-log-header": "Ovo su evidencije ophođenih izmjena.",
        "log-show-hide-patrol": "$1 evidenciju patroliranja",
        "deletedrevision": "Izbrisana stara inačica $1",
        "filedeleteerror-short": "Pogrješka u brisanju datoteke: $1",
        "watchlistall2": "sve",
        "namespacesall": "sve",
        "monthsall": "sve",
-       "confirmemail": "Potvrda e-mail adrese",
+       "confirmemail": "Potvrdite adresu e-pošte",
        "confirmemail_noemail": "Niste unijeli važeću e-mail adresu u Vaše [[Special:Preferences|suradničke postavke]].",
        "confirmemail_text": "U ovom wikiju morate prije korištenja e-mail naredbi potvrditi svoju e-mail adresu. Kliknite na gumb ispod kako biste poslali poruku s potvrdom na Vašu adresu. U poruci će biti poveznica koju morate otvoriti u svom web pregledniku i time potvrditi svoju e-mail adresu.",
        "confirmemail_pending": "Već Vam je e-mailom poslan potvrdni kôd;\nako ste upravo otvorili suradnički račun, molimo pričekajte još nekoliko minuta da e-mail stigne prije nego što zatražite novi kôd.",
        "confirmemail_invalid": "Pogrešna potvrda. Kôd je možda istekao.",
        "confirmemail_needlogin": "Molimo $1 kako biste potvrdili Vašu e-mail adresu.",
        "confirmemail_success": "Vaša je e-mail adresa potvrđena. Možete se prijaviti i uživati u wikiju.",
-       "confirmemail_loggedin": "Vaša je e-mail adresa potvrđena.",
+       "confirmemail_loggedin": "Vaša je adresa e-pošte potvrđena.",
        "confirmemail_subject": "{{SITENAME}}: potvrda e-mail adrese",
-       "confirmemail_body": "Netko, vjerojatno Vi, s IP adrese $1 je otvorio\nsuradnički račun pod imenom \"$2\" s ovom e-mail adresom na {{SITENAME}}.\n\nKako biste potvrdili da je ovaj suradnički račun uistinu Vaš i\nomogućili e-mail funkcije na {{SITENAME}}, otvorite u Vašem\npregledniku sljedeću poveznicu:\n\n$3\n\nAko to *niste* Vi, slijedite ovaj link za poništavanje potvrde:\n\n$5\n\nValjanost ovog potvrdnog koda istječe na $4.",
+       "confirmemail_body": "Netko, vjerojatno Vi, s IP adrese $1 otvorio je\nsuradnički račun pod imenom \"$2\" s ovom adresom e-pošte na {{SITENAME}}.\n\nKako biste potvrdili da je ovaj suradnički račun uistinu Vaš i\nomogućili funkcije e-pošte na {{SITENAME}}, otvorite u Vašem\npregledniku sljedeću poveznicu:\n\n$3\n\nAko to *niste* Vi, slijedite ovu poveznicu za poništavanje potvrde:\n\n$5\n\nValjanost ovog potvrdnog kȏda istječe na $4.",
        "confirmemail_body_changed": "Netko, vjerojatno Vi, s IP adrese $1,\npromijenio je adresu e-pošte suradničkog računa \"$2\" u ovu adresu na {{SITENAME}}.\n\nKako biste potvrdili da je ovaj suradnički račun uistinu Vaš te uključili\nmogućnosti e-pošte na {{SITENAME}}, otvorite u Vašem pregledniku sljedeću poveznicu:\n\n$3\n\nUkoliko suradnički račun *ne* pripada Vama, slijedite ovu poveznicu\nza poništavanje potvrde adrese e-pošte:\n\n$5\n\nValjanost ovog potvrdnog koda istječe $4.",
        "confirmemail_body_set": "Netko, najvjerojatnije vi, s IP adrese $1,\notvorio je suradnički račun pod imenom \"$2\" s ovom adresom e-pošte na {{SITENAME}}.\n\nKako biste potvrdili da je ovaj suradnički račun uistinu vaš i uključili \nmogućnosti e-poruka na {{SITENAME}}, otvorite u vašem pregledniku sljedeću poveznicu:\n\n$3\n\nAko ovaj suradnički račun *ne* pripada vama, slijedite ovaj link \nkako biste poništili potvrdu adrese elektroničke pošte:\n\n$5\n\nValjanost ovog potvrdnog kȏda istječe u $4",
        "confirmemail_invalidated": "Potvrda E-mail adrese je otkazana",
index 8c2f8aa..ac34c51 100644 (file)
        "userlogin-resetlink": "Elfelejtetted a bejelentkezési adataidat?",
        "userlogin-resetpassword-link": "Elfelejtetted a jelszavad?",
        "userlogin-helplink2": "Segítség a bejelentkezéshez",
-       "userlogin-loggedin": "Már be vagy jelentkezve mint {{GENDER:$1|$1}}. Ha más néven akarsz belépni, alább megteheted.",
-       "userlogin-createanother": "Felhasználói fiók létrehozása",
        "createacct-emailrequired": "E-mail cím",
        "createacct-emailoptional": "E-mail cím (opcionális)",
        "createacct-email-ph": "Add meg e-mail címed",
        "preferences": "Beállítások",
        "mypreferences": "Beállítások",
        "prefs-edits": "Szerkesztéseid száma:",
-       "prefsnologintext2": "Kérjük jelentkezzen be a beállítások módosításához.",
+       "prefsnologintext2": "Kérjük, jelentkezz be a beállítások módosításához.",
        "prefs-skin": "Felület",
        "skin-preview": "előnézet",
        "datedefault": "Nincs beállítás",
        "right-editmyusercss": "A saját szerkesztői CSS-fájlok szerkesztése",
        "right-editmyuserjs": "Saját szerkesztői JavaScript-fájlok szerkesztése",
        "right-viewmywatchlist": "Saját figyelőlista megtekintése",
+       "right-editmywatchlist": "Saját figyelőlista szerkesztése. Bizonyos műveletek képesek lapok figyelőlistához adására ezen jog nélkül is.",
+       "right-viewmyprivateinfo": "Saját személyes adatok megtekintése (pl. e-mailcím, valódi név)",
+       "right-editmyprivateinfo": "Saját személyes adatok szerkesztése (pl. e-mailcím, valódi név)",
        "right-editmyoptions": "Saját beállítások szerkesztése",
        "right-rollback": "a lap utolsó szerkesztésének gyors visszaállítása",
        "right-markbotedits": "visszaállított szerkesztések botként való jelölése",
index c6c57a3..f4c0050 100644 (file)
@@ -72,7 +72,8 @@
                        "לערי ריינהארט",
                        "PeppeAeco",
                        "아라",
-                       "Lucas2"
+                       "Lucas2",
+                       "Taxandru"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "userlogin-resetlink": "Hai dimenticato i tuoi dati di accesso?",
        "userlogin-resetpassword-link": "Hai dimenticato la password?",
        "userlogin-helplink2": "Aiuto con l'accesso",
-       "userlogin-loggedin": "Sei già connesso come {{GENDER:$1|$1}}.\nUsa il modulo sottostante per accedere come altro utente.",
-       "userlogin-createanother": "Crea un'altra utenza",
        "createacct-emailrequired": "Indirizzo email",
        "createacct-emailoptional": "Indirizzo di posta elettronica (opzionale)",
        "createacct-email-ph": "Inserisci il tuo indirizzo email",
        "passwordreset-domain": "Dominio:",
        "passwordreset-capture": "Visualizzare il contenuto del messaggio e-mail?",
        "passwordreset-capture-help": "Se si seleziona questa casella, l'indirizzo e-mail (con la password temporanea), verrà mostrato a voi, oltre ad essere inviato all'utente.",
-       "passwordreset-email": "Indirizzo e-mail:",
+       "passwordreset-email": "Indirizzo email:",
        "passwordreset-emailtitle": "Dettagli dell'utente su {{SITENAME}}",
        "passwordreset-emailtext-ip": "Qualcuno (probabilmente tu, con indirizzo IP $1) ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo email sono:\n\n$2\n\n{{PLURAL:$3|Questa password temporanea scadrà|Queste password temporanee scadranno}} dopo {{PLURAL:$5|un giorno|$5 giorni}}.\nDovresti accedere e scegliere una nuova password ora. \n\nSe non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare al utilizzare la tua vecchia password.",
        "passwordreset-emailtext-user": "L'utente $1 di {{SITENAME}} ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo email sono:\n\n$2\n\n{{PLURAL:$3|Questa password temporanea scadrà|Queste password temporanee scadranno}} dopo {{PLURAL:$5|un giorno|$5 giorni}}.\nDovresti accedere e scegliere una nuova password ora. \n\nSe non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare al utilizzare la tua vecchia password.",
        "showpreview": "Visualizza anteprima",
        "showdiff": "Mostra modifiche",
        "blankarticle": "<strong>Attenzione:</strong> la pagina che stai creando è vuota.\nCliccando nuovamente su \"{{int:savearticle}}\", la pagina sarà creata senza alcun contenuto.",
-       "anoneditwarning": "'''Attenzione:''' Accesso non effettuato. Nella cronologia della pagina verrà registrato il tuo indirizzo IP.",
+       "anoneditwarning": "<strong>Attenzione:</strong> Accesso non effettuato. Se effettuerai delle modifiche il tuo indirizzo IP sarà visibile pubblicamente. Se <strong>[$1 accedi]</strong> o <strong>[$2 crei un'utenza]</strong>, le tue modifiche saranno attribuite al tuo nome utente, insieme ad altri benefici.",
        "anonpreviewwarning": "''Non è stato eseguito il login. Salvando la pagina, il proprio indirizzo IP sarà registrato nella cronologia.''",
        "missingsummary": "'''Attenzione:''' non è stato specificato l'oggetto di questa modifica. Premendo di nuovo \"{{int:savearticle}}\" la modifica verrà salvata con l'oggetto vuoto.",
        "missingcommenttext": "Inserire un commento qui sotto.",
        "noarticletext": "In questo momento la pagina richiesta è vuota. È possibile [[Special:Search/{{PAGENAME}}|cercare questo titolo]] nelle altre pagine del sito, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercare nei registri correlati] oppure [{{fullurl:{{FULLPAGENAME}}|action=edit}} modificare la pagina ora]</span>.",
        "noarticletext-nopermission": "In questo momento la pagina richiesta è vuota. È possibile [[Special:Search/{{PAGENAME}}|cercare questo titolo]] nelle altre pagine del sito o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercare nei registri correlati]</span>, ma non hai i permessi per creare questa pagina.",
        "missing-revision": "La versione #$1 della pagina \"{{FULLPAGENAME}}\" non esiste.\n\nQuesto si verifica solitamente seguendo un collegamento a una pagina cancellata, in una cronologia non aggiornata.\nI dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro delle cancellazioni].",
-       "userpage-userdoesnotexist": "L'account \"<nowiki>$1</nowiki>\" non corrisponde a un utente registrato. Verificare che si intenda davvero creare o modificare questa pagina.",
+       "userpage-userdoesnotexist": "L'account \"$1\" non corrisponde a un utente registrato.\nVerificare che si intenda davvero creare o modificare questa pagina.",
        "userpage-userdoesnotexist-view": "L'account utente \"$1\" non è registrato.",
        "blocked-notice-logextract": "Questo utente è attualmente bloccato.\nL'ultimo elemento del registro dei blocchi è riportato di seguito per informazione:",
        "clearyourcache": "'''Nota:''' dopo aver salvato, potrebbe essere necessario pulire la cache del proprio browser per vedere i cambiamenti. \n*'''Firefox / Safari''': tenere premuto il tasto delle maiuscole e fare clic su ''Ricarica'', oppure premere ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' su Mac)\n*'''Google Chrome''': premere ''Ctrl-Shift-R'' (''⌘-Shift-R'' su un Mac)\n*'''Internet Explorer''': tenere premuto il tasto ''Ctrl'' mentre si fa clic su ''Refresh'', oppure premere ''Ctrl-F5''\n*'''Opera''': svuotare completamente la cache dal menu ''Strumenti → Preferenze''",
        "mergehistory-empty": "Nessuna versione da unire.",
        "mergehistory-success": "{{PLURAL:$3|Una versione di [[:$1]] è stata unita|$3 versioni di [[:$1]] sono state unite}} alla cronologia di [[:$2]].",
        "mergehistory-fail": "Impossibile unire le cronologie. Verificare la pagina e i parametri temporali.",
-       "mergehistory-fail-toobig": "Impossibile eseguire l'unione della cronologia con oltre $1 {{PLURAL:$1|revisione|revisioni}} da spostare.",
+       "mergehistory-fail-toobig": "Impossibile eseguire l'unione della cronologia essendoci oltre $1 {{PLURAL:$1|versione|versioni}} da spostare.",
        "mergehistory-no-source": "La pagina di origine $1 non esiste.",
        "mergehistory-no-destination": "La pagina di destinazione $1 non esiste.",
        "mergehistory-invalid-source": "La pagina di origine deve avere un titolo corretto.",
index b576b2a..9625d40 100644 (file)
        "userlogin-resetlink": "ログイン情報をお忘れですか?",
        "userlogin-resetpassword-link": "パスワードをお忘れですか?",
        "userlogin-helplink2": "ログインについてのヘルプ",
-       "userlogin-loggedin": "{{GENDER:$1|$1}} として既にログインしています。\n別の利用者としてログインするには下のフォームを使用してください。",
-       "userlogin-createanother": "別アカウントを作成",
        "createacct-emailrequired": "メールアドレス",
        "createacct-emailoptional": "メールアドレス (省略可能)",
        "createacct-email-ph": "メールアドレスを入力",
index d5e1877..71bb713 100644 (file)
        "userlogin-resetlink": "ავტორიზაციის მონაცემები დაგავიწყდათ?",
        "userlogin-resetpassword-link": "დაგავიწყდათ პაროლი?",
        "userlogin-helplink2": "დახმარება:შესვლა",
-       "userlogin-createanother": "სხვა ანგარიშის შექმნა",
        "createacct-emailrequired": "ელ. ფოსტის მისამართი",
        "createacct-emailoptional": "ელ. ფოსტის მისამართი (არასავალდებულო)",
        "createacct-email-ph": "შეიყვანეთ თქვენი ელ. ფოსტის მისამართი",
index 34df836..78226e7 100644 (file)
        "userlogin-resetlink": "Қатысушы атын не құпия сөзді ұмыттыңыз ба?",
        "userlogin-resetpassword-link": "Құпия сөздіңізді ұмыттыңыз ба?",
        "userlogin-helplink2": "Кіруге көмек",
-       "userlogin-loggedin": "{{GENDER:$1|$1}} ретінде әлдеқашан кіргенсіз.\nТөмендегі пішінді басқа қатысушы кіруі ретінде қолданыңыз.",
-       "userlogin-createanother": "Басқа тіркелгі жасау",
        "createacct-emailrequired": "Е-пошта мекен-жайы",
        "createacct-emailoptional": "Е-пошта мекен-жайы (міндетті емес)",
        "createacct-email-ph": "Е-пошта мекен-жайыңызды енгізіңіз",
index d055485..5af0774 100644 (file)
        "userlogin-resetlink": "로그인 정보를 잊으셨나요?",
        "userlogin-resetpassword-link": "비밀번호를 잊으셨나요?",
        "userlogin-helplink2": "로그인에 대한 도움말",
-       "userlogin-loggedin": "이미 {{GENDER:$1|$1}} 사용자로 로그인되어 있습니다.\n다른 사용자로 로그인하려면 아래의 양식을 사용하세요.",
-       "userlogin-createanother": "다른 계정 만들기",
        "createacct-emailrequired": "이메일 주소",
        "createacct-emailoptional": "이메일 주소 (선택 사항)",
        "createacct-email-ph": "이메일 주소를 입력하세요",
index 56a22d2..9958c15 100644 (file)
        "userlogin-resetlink": "Hutt Dir d'Detailer vun Ärem Login vergiess?",
        "userlogin-resetpassword-link": "Hutt Dir Äert Passwuert vergiess?",
        "userlogin-helplink2": "Hëllef beim Aloggen",
-       "userlogin-loggedin": "Dir sidd schonn als {{GENDER:$1|$1}} ageloggt.\nBenotzt de Formulaire hei drënner fir Iech als een anere Benotzer anzeloggen.",
-       "userlogin-createanother": "Maacht een anere Benotzerkont op",
        "createacct-emailrequired": "E-Mail-Adress",
        "createacct-emailoptional": "E-Mailadress (fakultativ)",
        "createacct-email-ph": "Gitt Är E-Mail-Adress an",
index 0a3b528..b54a97d 100644 (file)
        "userlogin-resetlink": "جزییات وامین اومائن تونه د ویر بردیته",
        "userlogin-resetpassword-link": "پاسورد د ویرتو رئته؟",
        "userlogin-helplink2": "هومیاری وا مین اومائن",
-       "userlogin-loggedin": "شما ایسه د عنوان {{جنس:$1|$1}} اومایته وا مین.\nد فرم هاری سی وا مین اومائن وه عنوان کاریار هنی استفاده بکیتو.",
-       "userlogin-createanother": "يه گل حساوهنی راست بكيد",
        "createacct-emailrequired": "نشونی ايميل",
        "createacct-emailoptional": "نشونی ايميل",
        "createacct-email-ph": "نوم نشون ايميلتونه وارد بكيت",
        "badfilename": "نوم جانیا د \"$1\" آلشت بیه.",
        "filetype-mime-mismatch": "دماون جانیا «$1.‎» وا نوع MIME وه($2) یکی نئ.",
        "filetype-badmime": "جانیایی که نوع MIME ونو $1 بوئه سی سوارکرد اجازه دار نیئن.",
+       "filetype-bad-ie-mime": "نبوئه ای جانیانه سوار بکیت سی یه که اینترنت اکسپلورر ونه چی «$1» میشناسه، سی یه که وه یه گل جانیا ناصلادار و شات خطردار با.",
+       "filetype-unwanted-type": "'''«‎.‎$1»''' یه گل جانیا حاستنی نئ.\n{{PLURAL:$3|جانیا ورتیه گر|جانیایا ورتیه گر}} د ای قرارن: $2 .",
+       "filetype-banned-type": "&lrm;'''\".$1\"''' {{PLURAL:$4|یه گل جانیا ناصلاداره|جانیایایی که صلادار نیئن}}.\n{{PLURAL:$3|جانیا صلادار|جانیایا صلادار}} د ای قرارن: $2.",
+       "filetype-missing": "ای جانیا هیچ اضاف کردی ناره(چی \"جی پی جی\")",
        "empty-file": "فایلی که دئی ته حالی بیه.",
        "file-too-large": "فایلی که دئی ته فره گپ بی.",
        "filename-tooshort": "نوم فایل فره کؤچکه.",
        "filetype-banned": "چنی جانیا قدقه بیه.",
+       "verification-error": "جانیا د ازمایشت پشت راسگری نگوارد.",
+       "hookaborted": "آلشتی که میهاستیت دروس بکیت وا یه گل قلاو اضاف کرد انجوم نگرت.",
        "illegal-filename": "نوم فایل اجاره ندئه بیه.",
+       "overwrite": "نیسنن ری یه گل جانیایی که هیئش صلا ندئه بیه",
        "unknown-error": "یه گل خطا نادیار ری ون کرده.",
        "tmp-create-error": "نبوئه جانیا موقتی نه راس بکیتو.",
        "tmp-write-error": "خطا د نیسنن جانیا موقتی.",
+       "large-file": "د تو میهایم که جانیایا د $1 گپتر نبان؛\nانازه ای جانیا $2 ئه.",
+       "largefileserver": "ای جانیا د انازه ای که د وه سرور میزونکاری بیه تا ونه بیئره گپتره.",
+       "emptyfile": "جانیایی که سوار بیه د نظر میا حالی با.\nای مشگل شایت سی خطا انجومیار نویسی د نوم جانیا با.\nلطف بکید که یه نه وارسی بکیت که میهایت ونه وا ای شرایط سوار بکیت.",
+       "windows-nonascii-filename": "ای ویکی حامین دار نوم جانیایا که نیسه یا خاصی نه دارن نئ.",
+       "fileexists": "جانیایی وا ای نوم ایسه هیئش، ار دل مئکم {{GENDER:|نیئت}} که میهایت او جانیا نه آلشت بکیت، لطفن <strong>[[:$1]]</strong> نه وارسی بکیت.\n[[$1|thumb]]",
+       "filepageexists": "بلگه توضیح سی ای جانیا د دماتر د <strong>[[:$1]]</strong> دروس بیه، اما جانیایی وه ای نوم نیئش.\nچکسه ای که وارد می کیت د بلگه توضیح نشو دئه نبوئه.\nسی یه که چکسه شما نشو دئه بوئه، باید ونه وه شکل دسی ویرایشت بکیت.\n[[$1|thumb]]",
+       "fileexists-extension": "جانیایی وه نوم چی ای نوم هیئش: [[$2|thumb]]\n* نوم جانیایی که سوار می کردیت: <strong>[[:$1]]</strong>\n* نوم جانیایی که د دماتر بیئشه: <strong>[[:$2]]</strong>\nمیهایت د یه گل نوم دیارتر استفاده بکیت؟",
        "uploadwarning": "هشدار سوارکرد",
        "savefile": "جانیا نه اماییه کو",
        "uploaddisabled": "سوار کردن د کار نئ.",
index defaec7..ddddef9 100644 (file)
        "userlogin-resetlink": "Esat aizmirsis savu pieslēgšanās informāciju?",
        "userlogin-resetpassword-link": "Aizmirsi savu paroli?",
        "userlogin-helplink2": "Palīdzība ar pieslēgšanos",
-       "userlogin-loggedin": "Tu esi pieslēdzies ar lietotājvārdu {{GENDER:$1|$1}}.\nLai pieslēgtos ar citu lietotājvārdu, aizpildi šo formu.",
-       "userlogin-createanother": "Izveidot citu kontu",
        "createacct-emailrequired": "E-pasta adrese",
        "createacct-emailoptional": "E-pasta adrese (nav obligāta)",
        "createacct-email-ph": "Ievadiet savu e-pasta adresi",
index 384b026..8482e73 100644 (file)
        "filehist-thumb": "縮",
        "filehist-thumbtext": "於$1之縮",
        "filehist-nothumb": "無縮",
-       "filehist-user": "",
+       "filehist-user": "簿",
        "filehist-dimensions": "度",
        "filehist-filesize": "檔幅",
        "filehist-comment": "註",
index c81e334..ef0ed28 100644 (file)
        "userlogin-resetlink": "अपन सम्प्रवेश विवरण बिसरि गेलहुँ?",
        "userlogin-resetpassword-link": "अपन कूटशब्द बिसर गेलौ ?",
        "userlogin-helplink2": "सम्प्रवेशित करवाकलेल मदत",
-       "userlogin-loggedin": "अहा {{GENDER:$1|$1}} के रूपमे पहिले स सम्प्रवेशित छि।\nकोनो दोसर सदस्यके रुपमे सम्प्रवेशित करवाक लेल देल गेल फारमके प्रयोग करु।",
-       "userlogin-createanother": "दोसर खाता बनाउ",
        "createacct-emailrequired": "ई-पत्र संकेत",
        "createacct-emailoptional": "ई-पत्र संकेत (वैकल्पिक)",
        "createacct-email-ph": "अपन ई-पत्र संकेत सत्यापित करू",
index dd92c70..128e7aa 100644 (file)
        "userlogin-resetlink": "Си ги заборавивте податоците за најава?",
        "userlogin-resetpassword-link": "Ја заборавивте лозинката?",
        "userlogin-helplink2": "Помош за најава",
-       "userlogin-loggedin": "Веќе сте најавени како {{GENDER:$1|$1}}.\nСо образецот подолу можете да се најавите како друг корисник.",
-       "userlogin-createanother": "Направи нова сметка",
        "createacct-emailrequired": "Е-пошта",
        "createacct-emailoptional": "Е-пошта (незадолжително)",
        "createacct-email-ph": "Внесете е-пошта",
        "showpreview": "Преглед",
        "showdiff": "Прикажи промени",
        "blankarticle": "<strong>Предупредување:</strong> Страницата што ја создавате е празна.\nАко повторно стиснете на „{{int:savearticle}}“, страницата ќе биде создадена без никаква содржина во неа.",
-       "anoneditwarning": "'''Предупредување:''' Не сте најавени.\nВашата IP-адреса ќе биде заведена во историјата на уредување на страницата.",
+       "anoneditwarning": "<strong>Предупредување:</strong> Не сте најавени. Вашата IP-адреса ќе биде јавно видлива ако уредувате. Ако <strong>[$1 се најавите]</strong> или <strong>[$2 направите сметка]</strong>, тогаш уредувањата ќе се припишуваат на вашето корисничко име, покрај другите погодности.",
        "anonpreviewwarning": "''Не сте најавени. Ако ја зачувате, Вашата IP-адреса ќе биде заведена во историјата на уредување на страницата.''",
        "missingsummary": "'''Потсетник:''' Не внесовте опис на измените. Ако притиснете Зачувај повторно, вашите измени ќе се зачуваат без опис.",
        "missingcommenttext": "Ве молиме внесете коментар подолу.",
        "powersearch-togglelabel": "Одбери:",
        "powersearch-toggleall": "Сè",
        "powersearch-togglenone": "Ништо",
-       "powersearch-remember": "Запамти го изборот за идни пребарувања",
+       "powersearch-remember": "Запoмни го изборот за идни пребарувања",
        "search-external": "Надворешно пребарување",
        "searchdisabled": "{{SITENAME}} пребарувањето е оневозможено.\nВо меѓувреме, можете да пребарувате преку Google.\nДа напоменеме дека нивното индексирање на {{SITENAME}} содржините може да биде застарено.",
        "search-error": "Се појави грешка при пребарувањето: $1",
index bab2aaa..3de847e 100644 (file)
        "userlogin-resetlink": "താങ്കളുടെ ലോഗിൻ വിവരങ്ങൾ മറന്നു പോയോ?",
        "userlogin-resetpassword-link": "താങ്കൾ രഹസ്യവാക്ക് മറന്നോ?",
        "userlogin-helplink2": "പ്രവേശിക്കാൻ സഹായമാവശ്യമെങ്കിൽ",
-       "userlogin-loggedin": "താങ്കൾ ഇപ്പോൾ തന്നെ {{GENDER:$1|$1}} ആയി പ്രവേശിച്ചിരിക്കുന്നു.\nതാഴെ ഉള്ള ഫോം ഉപയോഗിച്ച് മറ്റൊരു ഉപയോക്താവായി പ്രവേശിക്കാവുന്നതാണ്.",
-       "userlogin-createanother": "മറ്റൊരു അംഗത്വമെടുക്കുക",
        "createacct-emailrequired": "ഇമെയിൽ വിലാസം",
        "createacct-emailoptional": "ഇമെയിൽ വിലാസം (നിർബന്ധമില്ല)",
        "createacct-email-ph": "താങ്കളുടെ ഇമെയിൽ വിലാസം നൽകുക",
        "showpreview": "എങ്ങനെയുണ്ടെന്നു കാണുക",
        "showdiff": "മാറ്റങ്ങൾ കാണിക്കുക",
        "blankarticle": "<strong>മുന്നറിയിപ്പ്:</strong> താങ്കൾ സൃഷ്ടിക്കുന്ന താൾ ശൂന്യമാണ്.\n\"{{int:savearticle}}\" ഒന്നുകൂടി അമർത്തിയാൽ, ഉള്ളടക്കമൊന്നുമില്ലാതെ താൾ സൃഷ്ടിക്കപ്പെടും.",
-       "anoneditwarning": "'''മുന്നറിയിപ്പ്:''' താങ്കൾ ലോഗിൻ ചെയ്തിട്ടില്ല. താങ്കളുടെ ഐ.പി. വിലാസം താളിന്റെ തിരുത്തൽ ചരിത്രത്തിൽ ചേർക്കുന്നതാണ്.",
+       "anoneditwarning": "<strong>മുന്നറിയിപ്പ്:</strong> താങ്കൾ ലോഗിൻ ചെയ്തിട്ടില്ല. താങ്കൾ തിരുത്തുകളെന്തെങ്കിലും ചെയ്യുകയാണെങ്കിൽ താങ്കളുടെ ഐ.പി. വിലാസം എല്ലാവർക്കും ലഭ്യമായിരിക്കും. താങ്കൾ <strong>[$1 ലോഗിൻ ചെയ്യുകയോ]</strong>  <strong>[$2 അംഗത്വമെടുക്കുകയോ]</strong> ചെയ്യുന്നതുവഴി മറ്റ് ഗുണങ്ങളോടൊപ്പം താങ്കളുടെ തിരുത്തുകൾ ഉപയോക്തൃനാമത്തിലാവും അറിയപ്പെടുക.",
        "anonpreviewwarning": "''താങ്കൾ ലോഗിൻ ചെയ്തിട്ടില്ല. സേവ് ചെയ്യുമ്പോൾ താളിന്റെ തിരുത്തൽ ചരിത്രത്തിൽ താങ്കളുടെ ഐ.പി. വിലാസം ചേർത്തു സൂക്ഷിക്കപ്പെടും.''",
        "missingsummary": "'''ഓർമ്മക്കുറിപ്പ്:''' താങ്കൾ തിരുത്തലിന്റെ ചുരുക്കരൂപം നൽകിയിട്ടില്ല. ''സേവ് ചെയ്യുക'' ബട്ടൺ ഒരുവട്ടം കൂടി അമർത്തിയാൽ താങ്കൾ വരുത്തിയ മാറ്റം കാത്തുസൂക്ഷിക്കുന്നതാണ്.",
        "missingcommenttext": "താങ്കളുടെ അഭിപ്രായം ദയവായി താഴെ രേഖപ്പെടുത്തുക.",
        "listfiles_count": "പതിപ്പുകൾ",
        "listfiles-show-all": "ചിത്രത്തിന്റെ പഴയ പതിപ്പുകളും ഉൾപ്പെടുത്തുക",
        "listfiles-latestversion": "ഇപ്പോഴത്തെ പതിപ്പ്",
-       "listfiles-latestversion-yes": "ശരി",
-       "listfiles-latestversion-no": "à´µàµ\87à´£àµ\8dà´\9f",
+       "listfiles-latestversion-yes": "à´\85à´¤àµ\86",
+       "listfiles-latestversion-no": "à´\85à´²àµ\8dà´²",
        "file-anchor-link": "പ്രമാണം",
        "filehist": "പ്രമാണ നാൾവഴി",
        "filehist-help": "ഏതെങ്കിലും തീയതി/സമയ കണ്ണിയിൽ ഞെക്കിയാൽ പ്രസ്തുതസമയത്ത് ഈ പ്രമാണം എങ്ങനെയായിരുന്നു എന്നു കാണാം.",
        "version-parser-function-hooks": "പാഴ്‌സർ ഫങ്ഷൻ കൊളുത്തുകൾ",
        "version-hook-name": "കൊളുത്തിന്റെ പേര്",
        "version-hook-subscribedby": "വരിക്കാരനായത്",
-       "version-version": "(പതിപ്പ് $1)",
+       "version-version": "($1)",
        "version-no-ext-name": "[[പേര് നൽകിയിട്ടില്ല]",
        "version-license": "മീഡിയവിക്കി ഉപയോഗാനുമതി",
        "version-ext-license": "അനുമതി",
index 7151271..e60c7dc 100644 (file)
        "gotaccountlink": "Нэвтрэх",
        "userlogin-resetlink": "Нэвтрэх мэдээллээ мартаа юу?",
        "userlogin-resetpassword-link": "Нууц үгээ мартсан уу?",
-       "userlogin-loggedin": "Та {{GENDER:$1|$1}} нэрээр нэвтэрсэн байна.\nӨөр нэрээр нэвтрэх бол доорх маягтыг ашиглана уу.",
-       "userlogin-createanother": "Өөр бүртгэл үүсгэх",
        "createacct-emailrequired": "Цахим шуудангийн хаяг",
        "createacct-email-ph": "Цахим шуудангийн хаягаа оруулна уу",
        "createacct-another-email-ph": "Цахим шуудангийн хаяг оруулна уу",
index 7aa480e..bd79919 100644 (file)
@@ -22,8 +22,8 @@
                ]
        },
        "tog-underline": "Garis bawah pautan:",
-       "tog-hideminor": "Sembunyikan suntingan kecil dalam perubahan terkini",
-       "tog-hidepatrolled": "Sorokkan suntingan yang telah dironda daripada perubahan terkini",
+       "tog-hideminor": "Sembunyikan suntingan kecil daripada perubahan terkini",
+       "tog-hidepatrolled": "Sembunyikan suntingan yang telah dironda daripada perubahan terkini",
        "tog-newpageshidepatrolled": "Sorokkan laman yang telah dironda daripada senarai laman baru",
        "tog-extendwatchlist": "Kembangkan senarai pantau untuk memaparkan semua perubahan, bukan hanya yang terkini",
        "tog-usenewrc": "Kumpulkan perubahan mengikut laman dalam perubahan terkini dan senarai pantau",
        "tog-showtoolbar": "Tunjukkan palang alat sunting",
        "tog-editondblclick": "Dwiklik untuk menyunting laman",
        "tog-editsectiononrightclick": "Bolehkan penyuntingan bahagian dengan mengklik kanan pada tajuk bahagian",
-       "tog-watchcreations": "Tambahkan laman-laman yang saya mencipta dan fail-fail yang saya memuat naik ke dalam senarai pantau saya",
-       "tog-watchdefault": "Tambahkan laman-laman dan fail-fail yang saya menyunting ke dalam senarai pantau saya",
-       "tog-watchmoves": "Tambahkan laman-laman dan fail-fail yang saya memindah ke dalam senarai pantau saya",
-       "tog-watchdeletion": "Tambahkan laman-laman dan fail-fail yang saya menghapus ke dalam senarai pantau saya",
-       "tog-watchrollback": "Tambahkan laman-laman di mana saya telah membuat unduran ke senarai pantau saya",
-       "tog-minordefault": "Tandakan semua suntingan sebagai kecil secara asli",
+       "tog-watchcreations": "Tambahkan laman-laman yang saya cipta dan fail-fail yang saya muat naik ke dalam senarai pantau saya",
+       "tog-watchdefault": "Tambahkan laman-laman dan fail-fail yang saya sunting ke dalam senarai pantau saya",
+       "tog-watchmoves": "Tambahkan laman-laman dan fail-fail yang saya pindah ke dalam senarai pantau saya",
+       "tog-watchdeletion": "Tambahkan laman-laman dan fail-fail yang saya hapuskan ke dalam senarai pantau saya",
+       "tog-watchrollback": "Tambahkan laman-laman yang saya undurkan ke dalam senarai pantau saya",
+       "tog-minordefault": "Tandakan semua suntingan sebagai kecil secara lalai",
        "tog-previewontop": "Tunjukkan pralihat di atas kotak sunting",
        "tog-previewonfirst": "Tunjukkan pralihat pada suntingan pertama",
-       "tog-enotifwatchlistpages": "E-melkan saya apabila sebuah laman atau fail dalam senarai pantau saya telah diubahkan",
-       "tog-enotifusertalkpages": "E-melkan saya apabila laman perbincangan saya telah diubahkan",
+       "tog-enotifwatchlistpages": "E-melkan saya apabila sebuah laman atau fail dalam senarai pantau saya diubah",
+       "tog-enotifusertalkpages": "E-melkan saya apabila laman perbincangan saya diubah",
        "tog-enotifminoredits": "Juga e-melkan saya untuk suntingan-suntingan laman dan fail yang kecil",
        "tog-enotifrevealaddr": "Serlahkan alamat e-mel saya dalam e-mel pemberitahuan",
        "tog-shownumberswatching": "Tunjukkan bilangan pemantau",
-       "tog-oldsig": "Tandatangan yang sedia ada:",
+       "tog-oldsig": "Tanda tangan yang sedia ada:",
        "tog-fancysig": "Anggap tandatangan sebagai teks wiki (tanpa pautan automatik)",
        "tog-uselivepreview": "Gunakan pralihat langsung (dalam percubaan)",
        "tog-forceeditsummary": "Tanya saya jika ringkasan suntingan kosong",
        "tog-watchlisthideown": "Sembunyikan suntingan saya daripada senarai pantau",
        "tog-watchlisthidebots": "Sembunyikan suntingan bot daripada senarai pantau",
        "tog-watchlisthideminor": "Sembunyikan suntingan kecil daripada senarai pantau",
-       "tog-watchlisthideliu": "Sembunyikan suntingan oleh pengguna yang dilog masuk daripada senarai pantau",
+       "tog-watchlisthideliu": "Sembunyikan suntingan oleh pengguna log masuk daripada senarai pantau",
        "tog-watchlisthideanons": "Sembunyikan suntingan oleh pengguna tanpa nama daripada senarai pantau",
        "tog-watchlisthidepatrolled": "Sembunyikan suntingan yang telah dironda daripada senarai pantau",
        "tog-ccmeonemails": "Kirimkan saya salinan e-mel yang saya hantar kepada pengguna lain",
        "userlogin-resetlink": "Lupa nama pengguna/kata laluan anda?",
        "userlogin-resetpassword-link": "Lupa kata laluan anda?",
        "userlogin-helplink2": "Bantuan untuk log masuk",
-       "userlogin-loggedin": "Anda sudah log masuk sebagai {{GENDER:$1|$1}}. Gunakan borang di bawah untuk log masuk sebagai pengguna lain.",
-       "userlogin-createanother": "Buka satu lagi akaun",
        "createacct-emailrequired": "Alamat e-mel",
        "createacct-emailoptional": "Alamat e-mel (pilihan)",
        "createacct-email-ph": "Isikan alamt e-mel anda",
        "watchlist-details": "$1 laman dipantau ,tidak termasuk laman perbincangan.",
        "wlheader-enotif": "Pemberitahuan melalui e-mel dibolehkan.",
        "wlheader-showupdated": "Laman-laman yang telah diubah sejak kunjungan terakhir anda dipaparkan dalam '''teks tebal'''.",
-       "wlnote": "Berikut adalah {{PLURAL:$1|perubahan|<strong>$1</strong> perubahan}} yang terkini dalam {{PLURAL:$2|sejam|<strong>$2</strong> jam}} yang lalu, tepat pada $3, $4.",
+       "wlnote": "Yang berikut ialah <strong>$1</strong> perubahan terakhir sejak $2 jam yang lalu, sehingga $3, $4.",
        "wlshowlast": "Tunjukkan $1 jam / $2 hari yang lalu / $3.",
        "watchlist-options": "Pilihan senarai pantau",
        "watching": "Memantau...",
index 3983159..1f9e32a 100644 (file)
        "userlogin-resetlink": "Insejt kif tidħol fil-kont tiegħek?",
        "userlogin-resetpassword-link": "Insejt il-kelma tad-dħul (password)?",
        "userlogin-helplink2": "Għajnuna biex tidħol fil-kont",
-       "userlogin-loggedin": "Diġà dħalt fil-kont bħala {{GENDER:$1|$1}}.\nUża l-formola t'hawn taħt biex tidħol bħala utent ieħor",
-       "userlogin-createanother": "Oħloq kont ieħor",
        "createacct-emailrequired": "Indirizz elettroniku",
        "createacct-emailoptional": "Indirizz elettroniku (mhux obbligatorju)",
        "createacct-email-ph": "Daħħal l-indirizz elettroniku tiegħek",
        "preview": "Dehra proviżorja",
        "showpreview": "Dehra proviżorja",
        "showdiff": "Uri t-tibdiliet",
-       "anoneditwarning": "'''Twissija:''' Ma rnexxilekx tidħol.\nL-indirizz tal-IP tiegħek se jiġi reġistrat fil-kronoloġija tal-modifikar ta' din il-paġna.",
+       "anoneditwarning": "'''Attenzjoni:''' Ma dħaltx f'kontok.\nL-indirizz tal-IP tiegħek se jkun jidher pubblikament meta tagħmel xi modifika. Jekk <strong>[$1 tidħol f'kontok]</strong> jew <strong>[$2 toħloq kont]</strong>, il-modifiki li tagħmel jiġu attribwiti lill-ismek ta' utent, flimkien ma benefiċċji oħra.",
        "anonpreviewwarning": "''Bħalissa mintix fil-kont tiegħek. Jekk issalva xi modifiki tiegħek, fil-kronoloġija tal-paġna se jiġi reġistrat l-indirizz IP tiegħek.''",
        "missingsummary": "'''Twissija:''' Ma pprovdejt l-ebda taqsira dwar il-modifika.\nJekk terġa' tagħfas Modifika, l-modifika se tiġi salvata mingħajr waħda.",
        "missingcommenttext": "Jekk jogħġbok ħalli kumment hawn taħt.",
        "sp-deletedcontributions-contribs": "kontribuzzjonijiet",
        "linksearch": "Fittex ħoloq esterni",
        "linksearch-pat": "Mudell ta' tfittxija:",
-       "linksearch-ns": "Spazju tal-isem:",
+       "linksearch-ns": "Spazju tal-ismijiet:",
        "linksearch-ok": "Fittex",
        "linksearch-text": "Tista' tagħmel użu minn metakarattri, per eżempju \"*.wikipedia.org\".<br />\nHuwa neċessarju minn tal-inqas dominju tal-ewwel livell, per eżempju \"*.org\".<br />\nProtokolli aċċettati: <code>$1</code> (jekk ma jiġi speċifikat l-ebda protokol, dan jiġi awtomatikament definit bħala http://).",
        "linksearch-line": "$1 hija marbuta mill-paġna $2",
        "undelete-error-long": "Kien hemm problemi waqt il-fajl kien qiegħed jiġi rkuprat:\n\n$1",
        "undelete-show-file-confirm": "Inti ċert li trid tara reviżjoni imħassra tal-fajl \"<nowiki>$1</nowiki>\" ta' nhar $2, fil-ħin ta' $3?",
        "undelete-show-file-submit": "Iva",
-       "namespace": "Spazju tal-isem:",
+       "namespace": "Spazju tal-ismijiet:",
        "invert": "Aqleb l-għażla",
        "tooltip-invert": "Agħżel din il-kaxxa biex taħbi l-modifiki lejn paġni li jinsabu fl-ispazji tal-isem magħżula (u l-ispazju tal-isem assoċjat jekk hu magħżul)",
-       "namespace_association": "Spazju tal-isem assoċjat",
+       "namespace_association": "Spazju tal-ismijiet assoċjat",
        "tooltip-namespace_association": "Agħżel din il-kaxxa sabiex tinkludi l-paġna ta' diskussjoni jew l-oġġett tal-ispazju tal-isem assoċjat mal-ispazju tal-isem magħżul",
        "blanknamespace": "(Prinċipali)",
        "contributions": "Kontributi tal-{{GENDER:$1|utent}}",
        "import": "Importa paġni",
        "importinterwiki": "Importazzjoni transwiki",
        "import-interwiki-text": "Agħżel wiki u titlu ta' paġna li se timporta.\nDati ta' reviżjonijiet u ismijiet tal-modifikaturi jiġu preservati.\nKull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special:Log/import|log ta' importazzjoni]].",
-       "import-interwiki-source": "Sors tal-wiki/paġna:",
        "import-interwiki-history": "Kopja l-verżjonijiet tal-kronoloġija kollha għal din il-paġna",
        "import-interwiki-templates": "Inkludi l-mudelli kollha",
        "import-interwiki-submit": "Importa",
        "exif-copyright": "Informazzjoni dwar il-propjetá letterarja",
        "exif-exifversion": "Verżjoni tal-format Exif",
        "exif-flashpixversion": "Verżjoni sapportata ta' Flashpix",
-       "exif-colorspace": "Spazju tal-kulur",
+       "exif-colorspace": "Spazju tal-kuluri",
        "exif-componentsconfiguration": "Tfissira dwar kull komponent",
        "exif-compressedbitsperpixel": "Għamla tal-kompressjoni tal-istampa",
        "exif-pixelydimension": "Wisa' tal-istampa",
        "exif-lightsource": "Sorġent tad-dawl",
        "exif-flash": "Flash",
        "exif-focallength": "Distanza fokali objettiva",
-       "exif-subjectarea": "Spazju tas-suġġett",
+       "exif-subjectarea": "Spazju tas-suġġetti",
        "exif-flashenergy": "Saħħa tal-flash",
        "exif-focalplanexresolution": "Riżoluzzjoni X fuq il-witja fokali",
        "exif-focalplaneyresolution": "Riżoluzzjoni Y fuq il-witja fokali",
index 917536a..c280363 100644 (file)
        "gotaccountlink": "Совамс",
        "userlogin-resetlink": "Совамо эрявикстнэнь стувтыть?",
        "userlogin-resetpassword-link": "Салававалот стувтовсь?",
-       "userlogin-createanother": "Шкак од совамотарка",
        "createaccountmail": "Тейть кодамо понгсь салававал, кучик сонзэ ало максозь е-сёрмапаргонтень",
        "createaccountreason": "Тувталось:",
        "createacct-reason": "Тувтал",
index b22d111..b93f287 100644 (file)
@@ -9,7 +9,8 @@
                        "Parthava (on mzn.wikipedia.org)",
                        "Spacebirdy",
                        "محک",
-                       "아라"
+                       "아라",
+                       "Alirezaaa"
                ]
        },
        "tog-underline": "پیوندون زیر خط دکشی بواشه",
@@ -78,7 +79,7 @@
        "june": "ژوئن",
        "july": "ژوئیه",
        "august": "آگوست",
-       "september": "سÙ\80Ù\87â\80\8cÙ¾Ù\80تÙ\80Ù\87â\80\8cÙ\85Ù\80بÙ\80ر",
+       "september": "سپتاÙ\85بر",
        "october": "اکتبر",
        "november": "نـووه‌مـبـر",
        "december": "دسامبر",
@@ -90,7 +91,7 @@
        "june-gen": "جـون",
        "july-gen": "ژوئیه",
        "august-gen": "آگوست",
-       "september-gen": "سÙ\80Ù\87â\80\8cÙ¾Ù\80تÙ\80Ù\87â\80\8cÙ\85Ù\80بÙ\80ر",
+       "september-gen": "سپتاÙ\85بر",
        "october-gen": "اکتبر",
        "november-gen": "نـووه‌مـبـر",
        "december-gen": "دسامبر",
        "revertmove": "واچـیـه‌ن",
        "delete_and_move_confirm": "أره، پاک هاکه‌ن وه ره",
        "export": "دأیابأبه‌رده‌ن ولـگ‌ئون",
-       "exporttext": "شما بتونّی متن و تاریخچهٔ دچی‌یه بیّن اتا صفحهٔ مشخص یا یتـّا مجموعه‌ از صفحه‌ها ره به شکل دپوشنی‌یه اکس‌ام‌ال دله بریم دربَورین.\n\nاین اطلاعات ره بنشنه اتا ویکی دیگه دله که نرم‌افزار «مدیاویکی» ره اجرا کانده از طریق [[Special:Import|صفحهٔ دله‌دشنی‌ین]] وارد هاکردن.\n\nبریم‌دربَوردن صفحه‌ها وسّه، وشون عنوان ره این جعبه دله دشنین (هر سطر فقط اتا عنوان) و معلوم هاکنین که تازه دگاردسته‌ئون صفحه ره همراه نسخه‌ئون قدیمی‌تر و تاریخچهٔ صفحه خوندنّی، یا تازه دگاردسته‌ئون صفحه و اطلاعات آخرین دچی‌یه ره، تیناری اشنّی.\n\nدومین حالت سَره، شما بتونّی اتا لینک جه استفاده هاکنین، مثلاً [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] صفحهٔ «[[{{MediaWiki:Mainpage}}]]» وسّه.",
+       "exporttext": "شما بتونّی متن و تاریخچهٔ دچی‌یه بیّن اتا صفحهٔ مشخص یا یتـّا مجموعه‌ از صفحات ره به شکل دپوشنی‌یه اکس‌ام‌ال دله بریم دربَورین.\n\nاین اطلاعات ره بنشنه اتا ویکی دیگه دله که نرم‌افزار «مدیاویکی» ره اجرا کانده از طریق [[Special:Import|صفحهٔ دله‌دشنی‌ین]] وارد هاکردن.\n\nبریم‌دربَوردن صفحات وسّه، وشون عنوان ره این جعبه دله دشنین (هر سطر فقط اتا عنوان) و معلوم هاکنین که تازه دگاردسته‌ئون صفحه ره همراه نسخه‌ئون قدیمی‌تر و تاریخچهٔ صفحه خوندنّی، یا تازه دگاردسته‌ئون صفحه و اطلاعات آخرین دچی‌یه ره، تیناری اشنّی.\n\nدومین حالت سَره، شما بتونّی اتا لینک جه استفاده هاکنین، مثلاً [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] صفحهٔ «[[{{MediaWiki:Mainpage}}]]» وسّه.",
        "allmessages-filter-all": "همه",
        "thumbnail-more": "گت بوو",
        "import-interwiki-submit": "بیاردن",
index 01faf1a..9a04abb 100644 (file)
        "userlogin-resetlink": "你敢袂記得你登入的資料?",
        "userlogin-resetpassword-link": "袂記得你的密碼?",
        "userlogin-helplink2": "協助你登入",
-       "userlogin-loggedin": "你已經用{{GENDER:$1|$1}}登入,用下跤的表,登入別个名。",
-       "userlogin-createanother": "開另外一个口座",
        "createacct-emailrequired": "電子批地址",
        "createacct-emailoptional": "電子批地址(無一定愛寫)",
        "createacct-email-ph": "拍你的電子批地址",
index 2cefbf5..e40a672 100644 (file)
        "versionrequiredtext": "Pe' usà sta paggena ce vò 'a verziona $1 'e MediaWiki. Vide [[Special:Version|'a paggena 'e verzione]].",
        "ok": "OK",
        "retrievedfrom": "Estratto 'e \"$1\"",
-       "youhavenewmessages": "Haje $1 ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Haje}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Tiene}} $1 'a {{PLURAL:$3|n'atu utente|$3 utente}} ($2).",
        "youhavenewmessagesmanyusers": "Tiene $1 'a tant'utente ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|na mmasciata nova|999=mmasciate nnove}}",
        "virus-unknownscanner": "antivirus scanusciuto:",
        "logouttext": "'''Site asciùte.'''\n\nNota ca arcune paggene potrebbero cuntinuà ad apparire comme se 'o logout nun fosse avvenuto finché nun venne pulita 'a cache d\"o proprio browser.",
        "welcomeuser": "Bemmenuto, $1!",
-       "welcomecreation-msg": "'O cunto tuo è stato criato.\nMo' può cagnà 'e [[Special:Preferences|preferenze 'e {{SITENAME}}]].",
+       "welcomecreation-msg": "'O cunto vuosto è stato criato.\nMo' putite cagnà 'e [[Special:Preferences|preferenze 'e {{SITENAME}}]].",
        "yourname": "Nomme utente",
        "userlogin-yourname": "Nomme utente",
        "userlogin-yourname-ph": "'Nserisce 'o tujo nomme utente",
        "userlogin-resetlink": "Haje dimenticato 'e toje date 'e acciesso?",
        "userlogin-resetpassword-link": "Te sì scurdat' 'a password?",
        "userlogin-helplink2": "Aiuto cu l'accieso",
-       "userlogin-loggedin": "Sì già connesso comme {{GENDER:$1|$1}}.\nUsa 'o modulo ccà abbascio pe trasì com'a n'atu utente.",
-       "userlogin-createanother": "Cria n'at'account",
        "createacct-emailrequired": "Indirizzo email",
        "createacct-emailoptional": "Indirizzo 'e posta elettronica (ozzionale)",
        "createacct-email-ph": "Scrive 'o nderizzo mail tuo",
        "createacct-benefit-body2": "{{PLURAL:$1|paggena|paggene}}",
        "createacct-benefit-body3": "{{PLURAL:$1|contribbutòre ricente|contribbutture ricente}}",
        "badretype": "'E passwords ch'è mis nun songe eguale.",
-       "userexists": "'O nomme utente ch'è mis è già ausàto.\nPe' piacere scigliete n'atu nomme.",
+       "userexists": "'O nomme utente ch'è mis è già ausàto.\nPe' piacere sciglite n'atu nomme.",
        "loginerror": "Probblema 'e accièsso",
        "createacct-error": "Errore 'e criazione 'e cunto",
        "createaccounterror": "Nun se può crià nu cunto: $1",
        "login-abort-generic": "'O login tujo nun ha avuto succiesso - Annullato",
        "loginlanguagelabel": "Lengua: $1",
        "suspicious-userlogout": "'A richiesta 'e disconnessione d' 'a toja è stata negate pecché pare ca fosse mannata 'a nu navigatóre rutto o nu proxy 'e \"caching\".",
-       "createacct-another-realname-tip": "'O nomme overo vuosto è ozzionale.\nSi scigliete 'e nzertà 'o nomme overo, chesto s'ausarrà pe' dà l'utente l'attribuzione d' 'a fatica fatta.",
+       "createacct-another-realname-tip": "'O nomme overo vuosto è ozzionale.\nSi sciglite 'e nzertà 'o nomme overo, chesto s'ausarrà pe' dà l'utente l'attribuzione d' 'a fatica fatta.",
        "pt-login": "Tràse",
        "pt-login-button": "Tràse",
        "pt-createaccount": "Cria nu cunto nuovo",
        "resetpass-submit-cancel": "Canciella",
        "resetpass-wrong-oldpass": "'A password temporanea o attuale nun è bbona.\n'A password putesse avé cagnato, o pure s'è addimannata na password temporanea nova.",
        "resetpass-recycled": "Pe piacere riabbìa 'a password e miette na password differénte a chella 'e mmò.",
-       "resetpass-temp-emailed": "Sì {{GENDER:$1|trasuto|trasuta}} cu nu codece temporaneo, mannato via e-mail. Pe' fà cumpleta 'a riggistraziona, avite 'e abbià na password nova ccà:",
+       "resetpass-temp-emailed": "Sì trasuto cu nu codece temporaneo, mannato via e-mail. Pe' fà cumpleta 'a riggistraziona, avite 'e abbià na password nova ccà:",
        "resetpass-temp-password": "Password temporanea:",
        "resetpass-abort-generic": "'O cagnamiento d' 'a password s'è spezzato 'a na stensione.",
        "resetpass-expired": "'A pasword è ammaturata. Avite 'e ffà na password nova pe putè trasì.",
        "passwordreset-emailerror-capture": "Na mmasciata e-mail pe' riabbià 'a password è stata mannata, 'a putite vedé ccà abbascio, ma aita sapé ca nun s'è mannata a {{GENDER:$2|l'utente}} pecché c'è stato cocch'errore: $1",
        "changeemail": "Cagna l'indirizzo e-mail",
        "changeemail-header": "Cagna l'indirizzo e-mail d' 'o cunto",
-       "changeemail-text": "Ghienche stu modulo pe' cangà l'indirizzo mail d' 'o tuojo. Sarrà necessario nzertà 'a password tuja pe' puté cunfermà stu cagnamiento.",
+       "changeemail-text": "Ghienchete stu modulo pe' cangà l'indirizzo mail d' 'o vuosto. Sarrà necessario nzertà 'a password vosta pe' puté cunfermà stu cagnamiento.",
        "changeemail-no-info": "Hè 'a trasì ('o login) pe ffà l'acciesso a sta paggena direttamente.",
        "changeemail-oldemail": "Indirizzo email 'e mmò:",
        "changeemail-newemail": "Indirizzo e-mail nuovo:",
        "changeemail-none": "(nisciuno)",
-       "changeemail-password": "'A password tuja pe' {{SITENAME}}:",
+       "changeemail-password": "'A password vosta pe' {{SITENAME}}:",
        "changeemail-submit": "Cagna e-mail",
        "changeemail-cancel": "Canciella",
        "changeemail-throttled": "Hè fatto troppe tentative 'a trasì.\nAspetta nu $1 apprimma 'e pruvà n'ata vota.",
        "resettokens": "Riabbìa 'e token",
-       "resettokens-text": "Ccà se ponno riabbià 'e chiave ca permetessero l'acciesso a determinate date private associate a 'o cunto tuojo.\n\nL'avisse 'e ffà quanno l'hè spartuto pe' sbaglio cu cocche perzona o pure quanno 'o cunto d' 'o tuojo è stato compromesso.",
+       "resettokens-text": "Ccà se ponno riabbià 'e chiave ca permetessero l'acciesso a determinate date private associate a 'o cunto vuosto.\n\nL'aviste 'e ffà quanno l'avete spartuto pe' sbaglio cu cocche perzona o pure quanno 'o cunto d' 'o vuosto è stato compromesso.",
        "resettokens-no-tokens": "Nun ce stanno token 'a riabbià.",
        "resettokens-legend": "Riabbìa 'e token",
        "resettokens-tokens": "Token:",
        "showpreview": "Vere anteprimma",
        "showdiff": "Fa veré 'e cagnamiente",
        "blankarticle": "<strong>Attenziò:</strong> 'a paggena ca staje crianno è abbacante.\nFà click ncopp'a \"{{int:savearticle}}\" n'ata vota, 'a paggena sarrà criata senza cuntenute.",
-       "anoneditwarning": "'''Attenziò:''' Nun hè fatto l'acciesso.\nDint'a cronologgia d' 'a paggena sarrà riggistrato l'indirizzo IP d' 'o tuojo.",
-       "anonpreviewwarning": "''Nun hè fatto 'o login. Sarvann' 'a paggena, l'indirizzo IP d' 'o tuojo sarrà riggistrato dint'a cronologgia.''",
+       "anoneditwarning": "'''Attenziò:''' Nun avete fatto l'acciesso. 'A cronologgia d' 'a vosta sarrà visibbele pubbrecamente si facite cocche cagnamiento. Si <strong>[$1 tràse]</strong> o <strong>[$2 crìe nu cunto]</strong>, 'e cagnamiente vuoste ve sarranno attribbuite a vvuje, nzieme a n'ati migliuramente.",
+       "anonpreviewwarning": "''Nun avite fatto 'o login. Sarvann' 'a paggena, l'indirizzo IP d' 'o vuosto sarrà riggistrato dint'a cronologgia.''",
        "missingsummary": "'''Attenziò:''' nun s'è specificato l'oggetto 'e stu cagnamiento. Clicann' 'a \"{{int:savearticle}}\" n'ata vota 'o cagnamiento sarrà sarvato cu l'oggetto abbacante.",
        "missingcommenttext": "Pe' piacere scrivete nu commento ccà abbascio.",
        "missingcommentheader": "'''Attenziò:''' nun s'è specificato l'oggetto/titolo 'e stu commento. Clicann' 'a \"{{int:savearticle}}\" n'ata vota 'o cagnamiento sarrà sarvato c' 'o titolo abbacante.",
        "summary-preview": "Anteprimma'e l'oggetto:",
        "subject-preview": "Anteprima 'e l'oggetto/intestazione:",
        "blockedtitle": "Utente bloccato.",
-       "blockedtext": "<strong>'O nomme utente o ll'IP tuojo è stato bloccato.</strong>\n\n'O blocco è stato imposlocco è stato mpustato 'a $1. 'O mutivo d' 'o blocco è chesto: ''$2''\n\n* Abbiàta d' 'o blocco: $8\n* Ammaturità d' 'o blocco: $6\n* Tiempo 'e blocco: $7\n\nPuò cuntattà $1 o n'atu [[{{MediaWiki:Grouppage-sysop}}|ammenistratore]] pe' discutere 'o blocco.\n\nVide c' 'a funzione 'Scrive a ll'utente' nun è attiva si nun s'è riggistrato 'o ndirizzo e-mail buono dint' 'e [[Special:Preferences|preferenze]] o pùre si ll'uso 'e tale funzione è stato bloccato.\n\n'O ndirizzo IP attuale è $3, 'o nummero ID d' 'o blocco è #$5.\nPe' piacere avite 'e specificà tutte sti dettaglie ccà ncoppa quanno facite cocche dumanna.",
-       "autoblockedtext": "Ll'IP tuojo è stato bloccato pecché 'o steva piglianno n'atu utente, ch'è stato bloccato pe' $1.\n\n'O mutivo d' 'o blocco è chesto:\n\n:''$2''\n\n* Abbiàta d' 'o blocco: $8\n* Ammaturità d' 'o blocco: $6\n* Tiempo 'e blocco: $7\n\nPuò cuntattà $1 o n'atu [[{{MediaWiki:Grouppage-sysop}}|ammenistratore]] pe' discutere 'o blocco.\n\nVide c' 'a funzione 'Scrive a ll'utente' nun è attiva si nun s'è riggistrato 'o ndirizzo e-mail buono dint' 'e [[Special:Preferences|preferenze]] o pùre si ll'uso 'e tale funzione è stato bloccato.\n\n'O ndirizzo IP attuale è $3, 'o nummero ID d' 'o blocco è #$5.\nPe' piacere avite 'e specificà tutte sti dettaglie ccà ncoppa quanno facite cocche dumanna.",
+       "blockedtext": "<strong>'O nomme utente o ll'IP vuosto è stato bloccato.</strong>\n\n'O blocco è stato mpustato 'a $1. 'O mutivo d' 'o blocco è chesto: ''$2''\n\n* Abbiàta d' 'o blocco: $8\n* Ammaturità d' 'o blocco: $6\n* Tiempo 'e blocco: $7\n\nPutite cuntattà $1 o n'atu [[{{MediaWiki:Grouppage-sysop}}|ammenistratore]] pe' discutere 'o blocco.\n\nVedite c' 'a funzione 'Scrivete a ll'utente' nun è attiva si nun s'è riggistrato 'o ndirizzo e-mail buono dint' 'e [[Special:Preferences|preferenze]] o pùre si ll'uso 'e tale funzione è stato bloccato.\n\n'O ndirizzo IP attuale è $3, 'o nummero ID d' 'o blocco è #$5.\nPe' piacere avite 'e specificà tutte sti dettaglie ccà ncoppa quanno facite cocche dumanna.",
+       "autoblockedtext": "Ll'IP vuosto è stato bloccato pecché 'o steva piglianno n'atu utente, ch'è stato bloccato pe' $1.\n\n'O mutivo d' 'o blocco è chesto:\n\n:''$2''\n\n* Abbiàta d' 'o blocco: $8\n* Ammaturità d' 'o blocco: $6\n* Tiempo 'e blocco: $7\n\nPutite cuntattà $1 o n'atu [[{{MediaWiki:Grouppage-sysop}}|ammenistratore]] pe' discutere 'o blocco.\n\nVedite c' 'a funzione 'Scrivete a ll'utente' nun è attiva si nun s'è riggistrato 'o ndirizzo e-mail buono dint' 'e [[Special:Preferences|preferenze]] o pùre si ll'uso 'e tale funzione è stato bloccato.\n\n'O ndirizzo IP attuale è $3, 'o nummero ID d' 'o blocco è #$5.\nPe' piacere avite 'e specificà tutte sti dettaglie ccà ncoppa quanno facite cocche dumanna.",
        "blockednoreason": "nisciuna ragione è stata indicata",
        "whitelistedittext": "Pe' cagnà 'e ppaggene è necessario $1.",
        "confirmedittext": "Pe puté cagnà paggene hè 'a cunfermà l'indirizzo e-mail.\nPe' piacere abbìa e ffà 'a validazione d' 'o ndirizzo e-mail pe' bbìa d' 'e [[Special:Preferences|preferenze d'utente]].",
        "anontalkpagetext": "----\n''Chest'è 'a paggena 'e discussione 'e n'utente anonimo, ca nun ave criàt' 'ancora n'utenza o ca nun sta ausanno. Pe' l'identificà avite 'e truvà 'o nummero d' 'o ndirizzo IP d' 'o sujo. L'indirizze IP se ponno spartì però a cchiù 'e n'utente. Si sì n'utente anonimo e pienze ca 'e commente ccà dint'a sta paggena nun parlano 'e tte, allora [[Special:UserLogin/signup|crìa n'utenza nnova]] o [[Special:UserLogin|tràse cu chella ca tiene già]] pe' nun sta' mmescato mmiez'a l'ati utente anonime n futuro.''",
        "noarticletext": "Mo' mo' 'a paggena richiesta è abbacante. Se pò [[Special:Search/{{PAGENAME}}|ascià stu titolo]] dint'a l'ati paggene d' 'o sito, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ascià dint'e riggistre azzeccate] o pure [{{fullurl:{{FULLPAGENAME}}|action=edit}} cagnà 'a paggena mo']</span>.",
        "noarticletext-nopermission": "Mo' mo' 'a paggena richiesta è abbacante. Se pò [[Special:Search/{{PAGENAME}}|ascià stu titolo]] dint'a l'ati paggene d' 'o sito, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ascià dint'e riggistre azzeccate]</span>, però nun tiene 'o permesso 'a crià sta paggena.",
-       "missing-revision": "'A verziona #$1 d' 'a paggena \"{{FULLPAGENAME}}\" nun esiste.\n\nChest'è causato quanno se và dint'a nu link a na paggena ch'è stata scancellata.\n'E dettaglie se ponno truvà dint'a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 'o riggistro 'e scancellaziune].",
+       "missing-revision": "'A verziona #$1 d' 'a paggena \"{{FULLPAGENAME}}\" nun esiste.\n\nChest'è causato quanno se và dint'a nu link a na paggena ch'è stata scancellata.\n'E dettaglie se ponno truvà dint'a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 'o riggistro 'e scancellamiente].",
        "userpage-userdoesnotexist": "'O cunto utente \"<nowiki>$1</nowiki>\" nun è riggistrato. Cuntrolla ca si buò overo crià o cagnà sta paggena.",
        "userpage-userdoesnotexist-view": "'O cunto utente \"$1\" nun è riggistrato.",
        "blocked-notice-logextract": "St'utente è bloccato mò.\nL'urdemo elemento d' 'o riggistro 'e blocche è ripurtato ccà abbascio p'avé nu riferimento:",
        "note": "'''Nota:'''",
        "previewnote": "'''Chesta è sola n'anteprimma; 'e cagnamiénte â paggena nun songo ancora sarvate!'''",
        "continue-editing": "Tràse int'a l'area 'e modifica",
-       "previewconflict": "L'anteprimma currisponne a 'o testo presente dint'a cascia 'e modifica ccà ncoppa e rappresentasse 'a paggena comme cumpare si scigliete 'e Sarvà ind'a stu mumento.",
+       "previewconflict": "L'anteprimma currisponne a 'o testo presente dint'a cascia 'e modifica ccà ncoppa e rappresentasse 'a paggena comme cumpare si sciglite 'e Sarvà ind'a stu mumento.",
        "session_fail_preview": "'''Nun è possibbile prucessà 'o cagnamiento pecché se so' sperdut' 'e date d' 'a sessione.\nProva n'ata vota.\nSi nun funziona ancora, può pruvà 'a te [[Special:UserLogout|n'ascì]] e a trasì n'ata vota.'''",
        "session_fail_preview_html": "'''Nun è possibbile prucessà 'o cagnamiento pecché se so' sperdut' 'e date d' 'a sessione.\nProva n'ata vota.'''\n''Siccome dint' 'o {{SITENAME}} è abilitato l'uso 'e l'HTML cruro, 'o buttone d'anteprimma nun è abbiàto comme misura 'e sicurezza annanza cocch'attacco JavaScript''\n'''Si chest'era nu tentativo legittimo 'e cagnamiento, prova n'ata vota. Si nun funziona ancora, può pruvà 'a te [[Special:UserLogout|n'ascì]] e a trasì n'ata vota.'''",
        "token_suffix_mismatch": "'''Stu cagnamiento nun è stato sarvato pecché 'o client ave mmustato nu sbaglio dint'o scrivere d' 'e carattere d' 'a punteggiatura token. Pe luvà na possibbile corruzione d' 'o testo dint'a paggena, s'è rifiutat' 'a modifeca.\n\nSta situazione se può truvà, quanno staje ausanno nu servizio 'e proxy anonime via web cu d' 'e bug.'''",
        "editingcomment": "Cagnamiénto 'e $1 (nova sezzione)",
        "editconflict": "Conflitto d'edizzione: $1",
        "explainconflict": "N'at'utente ave sarvato na nova verziona d' 'a paggena pe' tramente ca stive a fà 'e cagnamiente.\n'A cascia 'e mudifeca ncoppa cuntene 'o testo d' 'a paggena ca mò sta online, accussì comme è stato agghiurnato a l'at'utente.\n'A verziona ch' 'e cagnamiente tuoje è stata mmece riportata dint'a cascia 'e mudifeca abbascio.\nSi 'e bbuò cunfermà hè 'a ripurtà 'e cagnamiente d' 'e tuoje dint'o testo ca esiste (dint'a cascia ncoppa).\nSpremmendo 'o buttón '{{int:savearticle}}', sarrà sarvato '''sulamente''' 'o testo cuntenuto dint'a cascia 'e cagnamiento ncoppa.",
-       "yourtext": "'O testo tuojo",
+       "yourtext": "'O testo vuosto",
        "storedversion": "A verziona 'n memoria",
        "nonunicodebrowser": "'''Attenziò: staje ausanno nu navigatóre ca nun è compatibbele ch' 'e carattere Unicode. Pe' te permettere 'o cagnamiento d' 'e paggene senza crià ncunveniente, 'e carattere nun ASCII veneno viste dint' 'a cascia 'e cagnamiento sotto forma 'e codece esadecimale.'''",
        "editingold": "'''Attenziò: staje cagnanno na verziona nun agghiurnata d' 'a paggena. Si 'a sarve accussì, tutte 'e cagnamiente fatte aropp'a sta verziona sarranno sperdute.'''",
        "post-expand-template-argument-category": "Paggene ca cunteneno argumente nun cunziderate",
        "parser-template-loop-warning": "È stato scummigliato n'aniello d' 'o template: [[$1]]",
        "parser-template-recursion-depth-warning": "È arrivato 'o lemmeto 'e ricurzione d' 'o template ($1)",
+       "language-converter-depth-warning": "'O fùto d' 'o lemmeto d' 'o scagnatòre 'e lengua è appassato ($1)",
+       "node-count-exceeded-category": "Paggene addò 'o nummero 'e núrece è stato appassato",
+       "node-count-exceeded-category-desc": "'A paggena appassa 'o nummero massimo 'e núrece.",
+       "node-count-exceeded-warning": "Sta paggena ave appassato 'o lemmeto 'e cunto 'e núrece",
+       "expansion-depth-exceeded-category": "Paggene addò 'o fùto 'e spansiona è appassato",
+       "expansion-depth-exceeded-category-desc": "Sta paggena appassa 'o lemmeto d'espansione.",
+       "expansion-depth-exceeded-warning": "Sta paggena ha appassato 'o lemmeto 'e futo 'e spansione",
+       "parser-unstrip-loop-warning": "Scummigliato aniello Unstrip",
+       "parser-unstrip-recursion-limit": "Appassato 'o lémmeto 'e ricurzione d' Unstrip ($1)",
+       "converter-manual-rule-error": "È stato scummigliato n'errore dint'a regola manuale 'e converziona 'e lengua",
+       "undo-success": "'O cagnamiento se può annullà.\nPe' piacere vide 'e differenze mmustate nfra 'e verziune pe' te ffà capace ca 'e cuntenute songo bbuone, e astipate 'e cagnamiente ccà abbascio pe' fernì e accussì turnà arreto.",
+       "undo-failure": "Nun se può fà turnà arreto 'o cagnamiento pecché ce sta nu conflitto ch' 'e cagnamiente intermedie.",
+       "undo-norev": "Nun se può fà turnà arreto 'o cagnamiento pecché nun esiste o s'è scancellato.",
+       "undo-nochange": "Pare c' 'o cagnamiento s'è già fatto turnà arreto.",
        "undo-summary": "Canciella 'o cagnamiento $1 'e [[Special:Contributions/$2|$2]] ([[User talk:$2|Chiàcchiera]])",
+       "undo-summary-username-hidden": "Annullato 'o cagnamiento $1 pe n'utente annascunnuto",
+       "cantcreateaccounttitle": "Nun se può crià cunto",
+       "cantcreateaccount-text": "'A riggistraziona è stata bloccata 'a l'utente [[User:$3|$3]] 'a st'innerizzo IP ('''$1''').\n\n'O mutivo dato 'a $3 è chistu ccà: ''$2''",
+       "cantcreateaccount-range-text": "'A criazione 'e cunte 'a ll'indirizze int'o ntervallo '''$1''', che cummiglia 'o vuosto ('''$4'''), è stata bloccata 'a l'utente [[User:$3|$3]].\n\n'O mutivo dato 'a $3 è chistu ccà: ''$2''",
+       "viewpagelogs": "Vide 'e log azzeccate a sta paggena",
+       "nohistory": "Nun esiste na cronologgia 'e verziune pe' sta paggena.",
        "currentrev": "Verzione 'e mmo",
        "currentrev-asof": "Vversione attuale dde $1",
        "revisionasof": "Vversione delle $1",
+       "revision-info": "Verziona d' 'o $1 fatta 'a {{GENDER:$6|$2}}$7",
        "previousrevision": "← Verzione 'e primma",
        "nextrevision": "Vversione cchiù recente →",
        "currentrevisionlink": "Verzione 'e mmo",
        "cur": "corr",
+       "next": "successiva",
        "last": "prec",
+       "page_first": "primma",
+       "page_last": "úrdema",
+       "histlegend": "Confronto nfra verziune: sciglite 'e casciulelle c'attoccassero a 'e verziune che vulite cunfruntà e spremmite Invio o pure 'o buttóne ccà abbascio.\n\nLiggenda: '''({{int:cur}})''' = differenze c' 'a verzione 'e mmò, '''({{int:last}})''' = differenze c' 'a verzione 'e primma, '''{{int:minoreditletter}}''' = cagnamiento minore",
+       "history-fieldset-title": "Naviga dint' 'a cronologgia",
        "history-show-deleted": "Solo chille canciellate",
        "histfirst": "primma",
        "histlast": "urdema",
+       "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
+       "historyempty": "(abbacante)",
+       "history-feed-title": "Cronologgia",
+       "history-feed-description": "Cronologgia d' 'a paggena ncopp'a stu sito",
        "history-feed-item-nocomment": "$1 'o $2",
+       "history-feed-empty": "'A paggena addimannata nun esiste.\nPuò darsi ca è stata scancellata d' 'a wiki, o s'è cagnato 'o nomme.\nProva a vedé [[Special:Search|dint' 'a wiki]] si ce stanno nnove paggene.",
+       "rev-deleted-comment": "(Oggetto d' 'o cagnamiento luvato)",
+       "rev-deleted-user": "(nomme utente luvato)",
+       "rev-deleted-event": "(azione d' 'o log luvata)",
+       "rev-deleted-user-contribs": "[nomme utente o indirizzo IP luvato - cagnamiento annascunnuto d' 'a cronologgia]",
+       "rev-deleted-text-permission": "Sta verziona d' 'a paggena è stata '''scancellata'''.\nAscìa dint' 'o [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} riggistro d' 'e scancellamiente] pe ne sapé 'e cchiù.",
+       "rev-suppressed-text-permission": "Sta verziona d' 'a paggena è stata '''luvata'''.\nVide 'o [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistro 'e paggene luvate] pe' ne sapé 'e cchiù.",
+       "rev-deleted-text-unhide": "Sta verziona d' 'a paggena è stata '''scancellata'''.\nVide 'o [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log d' 'e scancellamiente] pe' ne sapé 'e cchiù.\nA ll'ammenistrature è cunzentito ancora [$1 'e vedé sta paggena] si vonno.",
+       "rev-suppressed-text-unhide": "Sta verziona d' 'a paggena è stata '''luvata'''.\nVide 'o [{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} riggistro 'e paggene luvate] pe' ne sapé 'e cchiù.\nA ll'ammenistrature è cunzentito ancora [$1 'e vedé sta verziona] si vonno.",
+       "rev-deleted-text-view": "Sta verziona d' 'a paggena è stata '''scancellata'''.\nLl'ammenistratore 'a ponno veré ancora; e 'a ponno ascìa dint' 'o [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistro d' 'e scancellaziune] pe ne sapé 'e cchiù.",
+       "rev-suppressed-text-view": "Sta verziona d' 'a paggena è stata '''luvata'''.\nSta verziona 'a può veré ancora, 'e dettaglie 'e può cuntrullà dint' 'o [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistro 'e paggene luvate] pe' ne sapé 'e cchiù.",
+       "rev-deleted-no-diff": "Sta cunfronto d' 'a paggena nun 'o può veré pecché una d' 'e verziune è stata '''scancellata'''.\nAscìa dint' 'o [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistro d' 'e scancellamiente] pe ne sapé 'e cchiù.",
+       "rev-suppressed-no-diff": "Nun se può vedé stu cunfronto nfra verziune pecché una d' 'e verziune è stata '''scancellata'''.",
+       "rev-deleted-unhide-diff": "Una d' 'e verziune 'e sta paggena è stata '''scancellata'''.\nVide 'o [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistro d' 'e scancellamiente] pe' ne sapé 'e cchiù.\nPuò ancora [$1 vedé sta paggena] si bbuò.",
+       "rev-suppressed-unhide-diff": "Una d' 'e verziune 'e sta paggena è stata '''luvata'''.\nVide 'o [{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} riggistro 'e paggene luvate] pe' ne sapé 'e cchiù.\nPuò ancora [$1 vedé sta verziona] si bbuò.",
+       "rev-deleted-diff-view": "Una d' 'e verziune 'e sta paggena è stata '''scancellata'''.\nPuò vedé sta verziona ancora; 'e dettaglie 'e può vedé dint' 'o [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistro d' 'e scancellaziune] pe ne sapé 'e cchiù.",
+       "rev-suppressed-diff-view": "Una d' 'e verziune 'e sta paggena è stata '''luvata'''.\nSta verziona 'a può veré ancora; 'e dettaglie 'e può cuntrullà dint' 'o [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistro 'e paggene luvate] pe' ne sapé 'e cchiù.",
        "rev-delundel": "faje vedé/annascunne",
        "rev-showdeleted": "faje vedé",
+       "revisiondelete": "Scancella o ripiglia verziune",
+       "revdelete-nooldid-title": "Verziona nun specificata",
+       "revdelete-nooldid-text": "Nun è stata specificata nisciuna verziona d' 'a paggena p' 'a secutà sta funzione, 'a verziona specificata nun esiste o pure staje truvann' 'annascónnere 'a verziona 'e mò.",
+       "revdelete-no-file": "'O file specificato nun esiste.",
+       "revdelete-show-file-confirm": "Sì sicuro ca bbuò veré 'a verziona scancellata d' 'o file \"<nowiki>$1</nowiki>\" d' 'o $2 a 'e $3?",
        "revdelete-show-file-submit": "Sì",
+       "revdelete-selected-text": "{{PLURAL:$1|Verziona scigliuta|Verziune scigliute}} 'e [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Verzione scigliuta|Verziune scigliute}} d' 'o file 'e [[:$2]]:",
+       "logdelete-selected": "{{PLURAL:$1|Fatto scigliuto d' 'o riggistro|Fatte scigliute d' 'o riggistro}}:",
+       "revdelete-text-text": "'E verziune scancellate cumpareno ancora dint' 'a cronologgia d' 'a paggena, ma na parte d' 'o cuntenuto lloro nun sarrà disponibbele a 'o pubbreco.",
+       "revdelete-text-file": "'E verziune 'e file scancellate cumpareno ancora dint' 'a cronologgia d' 'o file, ma parte d' 'o cuntenuto lloro nun sarrà disponibbele a 'o pubbreco.",
+       "logdelete-text": "'E fatte 'e riggistro scancellate cumpareno ancora dint' 'a cronologgia 'e riggistro, ma na parte d' 'o cuntenuto lloro nun sarrà disponibbele a 'o pubbreco.",
+       "revdelete-text-others": "Ll'at'ammenistrature puterranno ancora trasì e arrepiglià 'e cuntenute annascunnute, si nun so' state mpustate cchiù restrizziune.",
+       "revdelete-confirm": "Pe' piacere cunferma ca overo bbuò ffà chesto, ca cunosce 'e cunseguenze, e ca staje facenno chesto rispettanno 'e [[{{MediaWiki:Policy-url}}|linee guida]].",
+       "revdelete-suppress-text": "Sti luvamiente hana essere fatte '''unicamente''' dint' 'e situaziune ccà abbascio:\n* nfurmaziune potenzialmente diffamatorie\n* date perzunale inopportune\n*: ''indirizze, nummeri 'e telefono, codece fiscale, ecc.''",
+       "revdelete-legend": "Miette 'e limmete 'e visibilità",
+       "revdelete-hide-text": "Testo d' 'a verziona",
+       "revdelete-hide-image": "Annascunne 'e cuntenute d' 'o file",
+       "revdelete-hide-name": "Annascunne aziona e l'oggetto 'e cchesta",
+       "revdelete-hide-comment": "Modifeca oggetto",
+       "revdelete-hide-user": "Nomme o indirizzo IP 'e ll'autore",
+       "revdelete-hide-restricted": "Annascunne 'e nfurmaziune 'nnecate pure a l'ammenistrature",
+       "revdelete-radio-same": "(nun cagnà)",
        "revdelete-radio-set": "Nasconde",
        "revdelete-radio-unset": "Faje vedé",
+       "revdelete-suppress": "Annascunne 'e nfurmaziune pure a l'ammenistrature",
+       "revdelete-unsuppress": "Scancella 'e limmete ncopp' 'e verziune arripigliate",
+       "revdelete-log": "Mutivo:",
+       "revdelete-submit": "Applica {{PLURAL:$1|â virziona scigliuta|a 'e virziune scigliute}}",
+       "revdelete-success": "'''Visibbelità d' 'a verziona agghiurnata e apposto.'''",
+       "revdelete-failure": "'''Int'a sta virziona 'a visibbelità nun se può agghiurnà:'''\n$1",
+       "logdelete-success": "'''Int'a stu riggistro 'a visibbelità è stata scigliuta currettamente.'''",
+       "logdelete-failure": "'''Int'a stu riggistro 'a visibbelità nun se può scegliere:'''\n$1",
        "revdel-restore": "càgna visiblità",
+       "pagehist": "Verziune 'e primma",
+       "deletedhist": "Cronologgia scancellata",
+       "revdelete-hide-current": "Nun se ponno annasconnere ll'item  cu data 2, $1: pecché song'a la verziona 'e mmò.",
+       "revdelete-show-no-access": "Errore a mmustà ll'oggetto cu data $2, $1: St'oggetto è stato nzegnàto comme \"riservato\".\nNun tiene acciesso a chesto.",
+       "revdelete-modify-no-access": "Nun se può cagnà l'oggetto cu data $2, $1: pecché st'oggetto è stato nzegnàto comme \"riservato\".\nVuje nun avete acciesso.",
+       "revdelete-modify-missing": "Nun se può cagnà l'oggetto cu l'ID $1 pecché nun è prisente int' 'o database.",
+       "revdelete-no-change": "'''Attenziò:''' l'oggetto cu data $2, $1 teneva già 'e mpustaziune 'e visibbilità addimannate.",
+       "revdelete-concurrent-change": "Nun se può cagnà l'oggetto cu data $2, $1: 'O status 'e chisto pare ch'è stato cagnato pe cocch'utente pe' tramente ca 'o stive a cagnà.\nPe' piacere cuntrolla 'o riggistro.",
+       "revdelete-only-restricted": "Errore quanno s'annasconneva l'oggetto cu data $2, $1: Nun può luvà oggette d' 'a vista 'e ll'ammenistratore senza scegliere manco una 'e l'ati ozzione 'e visibbelità.",
+       "revdelete-reason-dropdown": "* Mutive comune pe' ffà scancellamiento\n** Violazione d' 'o copyright\n** Cummente o nfurmaziune perzunale inappropriate\n** Nomme utente inappropriato\n** Nfurmazione potenzialmente diffamatoria",
+       "revdelete-otherreason": "Ati/cchiù ragiune:",
+       "revdelete-reasonotherlist": "Ati ragiune",
+       "revdelete-edit-reasonlist": "Càgna 'e mutive pe' fà 'o scancellamiento",
+       "revdelete-offender": "Autore d' 'a verziona:",
+       "suppressionlog": "Riggistro 'e luvamiente",
+       "suppressionlogtext": "Ccà abbascio ce sta n'alenco ch' 'e scancellamiente e blocche ca teneno cuntenute annascunnuto a l'ammenistrature.\nVide l'[[Special:BlockList|alenco d' 'e blocche]] pe' l'alenco e banne e blocche attive 'e mò.",
+       "mergehistory": "Aunisce 'e cronologgie",
+       "mergehistory-header": "Sta paggena te permette d'aunì 'e verziune d' 'a cronologgia 'e na paggena origgine a na paggena nova.\nVedite ca s'avesse 'a nchiantà stu cagnamiento senza scassà 'a continuità storeca d' 'a paggena.",
+       "mergehistory-box": "Aunisce 'a cronologgia 'e ddoje ppaggene:",
+       "mergehistory-from": "Paggena d'origgene:",
+       "mergehistory-into": "Paggena 'e destinazione:",
+       "mergehistory-list": "Cronologgia 'e paggena ca fosse applicabbele pe' se ffà l'unione",
+       "mergehistory-merge": "Se ponno aunì 'e verziune 'e [[:$1]] nzignata ccà int' 'a cronologgia 'e [[:$2]]. Ausàte 'a colonna ch' 'e buttóne d'ozzione pe' ffà l'aunione 'e tutt' 'e verziune nfin' 'a data e ora nzignàte.\nVedite ca si s'ausassero 'e buttóne 'e navigazione, 'a culonna ch' 'e buttóne d' 'ozzione fosse rinnovata.",
+       "mergehistory-go": "Vide 'e cagnamiente ca se ponno aunì",
+       "mergehistory-submit": "Aunisce 'e verziune",
+       "mergehistory-empty": "Nun ce stanno virziune pe' putè ffà l'aunione.",
+       "mergehistory-success": "{{PLURAL:$3|Na virziona 'e [[:$1]] è stata aunita|$3 versiune 'e [[:$1]] so' state aunite}} â cronologgia 'e [[:$2]].",
+       "mergehistory-fail": "Nun se ponno aunì 'e cronologgie. Pe' piacere cuntrolla n'ata vota 'a paggena e li parametre tempurale.",
+       "mergehistory-fail-toobig": "Nun se può fà l'aunione d' 'a cronologgia cu nu lémmeto 'e n'ati $1 {{PLURAL:$1|revisione|rivisiune}} 'a cagnà posto.",
+       "mergehistory-no-source": "'A paggena d'origgine $1 nun esiste.",
+       "mergehistory-no-destination": "'A paggena 'e destinazione $1 nun esiste.",
+       "mergehistory-invalid-source": "'A paggena d'origgine add'avé nu titolo bbuono.",
+       "mergehistory-invalid-destination": "'A paggena 'e destinazione add'avé nu titolo bbuono.",
+       "mergehistory-autocomment": "Aunione 'e [[:$1]] int'a [[:$2]]",
+       "mergehistory-comment": "Aunione 'e [[:$1]] int'a [[:$2]]: $3",
+       "mergehistory-same-destination": "'E paggene d'origgine e destinazione nun ponno essere eguale",
+       "mergehistory-reason": "Mutivo:",
+       "mergelog": "Riggistro d'aunione",
+       "pagemerge-logentry": "song'aunite [[$1]] int'a [[$2]] (verziune nfin'a $3)",
+       "revertmerge": "Annulla aunione",
+       "mergelogpagetext": "Ccà abbascio ce sta na lista cu ll'urdeme aunione int'a cronologgia d' 'e ddoje paggene.",
+       "history-title": "$1: cronologgia d' 'e cagnamiente",
+       "difference-title": "Differenze nfra 'e verziune 'e \"$1\"",
+       "difference-title-multipage": "Differenze nfra 'e verziune \"$1\" e \"$2\"",
+       "difference-multipage": "(Differenze nfra 'e paggene)",
        "lineno": "Riga $1:",
+       "compareselectedversions": "Cunfronta 'e verziune scigliute",
+       "showhideselectedversions": "Cagna visibbelità d' 'e verziune scigliute",
        "editundo": "annulla",
+       "diff-empty": "(Nisciuna differenza)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Na verziona ntermedia|$1 verziune ntermedie}} 'e n'utente stisso nun {{PLURAL:$1|è mmustata|songo mmustate}})",
+       "diff-multi-otherusers": "({{PLURAL:$1|Na virzione ntermedia|$1 verziune ntermedie}} 'a {{PLURAL:$2|n'at'utente|$2 n'ati ddoj'utente}} nun è mmustata)",
+       "diff-multi-manyusers": "({{PLURAL:$1|Na virzione ntermedia|$1 verziune ntermedie}} 'a cchiù 'e $2 {{PLURAL:$2|utente|utente}} nun è mmustata)",
+       "difference-missing-revision": "{{PLURAL:$2|Na virziona|$2 verziune}} 'e sta differenza ($1) {{PLURAL:$2|nun è stata truvata|nun so' state truvate}}.\n\nChest'è succiesso quanno s'è secutato nu diff obsoleto a na paggena scancellata.\n'E dettaglie se ponno truvà dint'a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 'o riggistro 'e scancellamiente].",
        "searchresults": "Risultato d''a recerca",
        "searchresults-title": "Ascià risultate ppe \"$1\"",
+       "titlematches": "Currispunnenze d' 'o titolo d' 'e paggene",
+       "textmatches": "Currispunnenze d' 'o testo d' 'e paggene",
        "notextmatches": "Voce addemannata nun truvata dint' 'e teste 'e articulo",
        "prevn": "{{PLURAL:$1|precedente|precedente $1}}",
        "nextn": "{{PLURAL:$1|successivo|successive $1}}",
        "nextn-title": "{{PLURAL:$1|Risultato successivo|$1 risultate successive}}",
        "shown-title": "Fa vere {{PLURAL:$1|'nu risultato|$1 risultate}} ppe paggena",
        "viewprevnext": "Vere($1 {{int:pipe-separator}} $2) ($3).",
-       "searchmenu-new": "<strong>'''Cria a paggena \"[[:$1]]\" ncopp'â chisto wiki!'''</strong> {{PLURAL:$2|0=|Vede anche 'a paggena truovata cu 'a recerca tuja|Vede anche 'e risultate d\"a recerca}}",
+       "searchmenu-exists": "'''Ncopp' 'o sito esiste na paggena c' 'o nomme \"[[:$1]]\"'''\n{{PLURAL:$2|0=|Vedite pure dint'a l'ati risultate 'e cerca.}}",
+       "searchmenu-new": "<strong>'''Cria a paggena \"[[:$1]]\" ncopp'â chisto wiki!'''</strong> {{PLURAL:$2|0=|Vide anche 'a paggena truovata cu 'a recerca vuosta|Vede anche 'e risultate d\"a recerca}}",
        "searchprofile-articles": "Paggene 'e contenute",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Tutto",
        "searchprofile-advanced": "Avanzate",
        "searchprofile-articles-tooltip": "Circa dint'ô $1",
        "searchprofile-images-tooltip": "Circa file",
+       "searchprofile-everything-tooltip": "Ascìa int'a tutte 'e cuntenute (pure dint' 'e chiacchiere)",
        "searchprofile-advanced-tooltip": "Circa dint'e namespace perzonalizzate",
        "search-result-size": "$1 ({{PLURAL:$2|'na parola|$2 parole}})",
+       "search-result-category-size": "{{PLURAL:$1|1 utente|$1 utente}} ({{PLURAL:$2|1 sottocategurìa|$2 sottocategurìe}}, {{PLURAL:$3|1 file|$3 files}})",
        "search-redirect": "(redirect $1)",
        "search-section": "(sezzione $1)",
+       "search-file-match": "(currispunnenza dint' 'e cuntenute d' 'o file)",
        "search-suggest": "Prova chisto: $1",
        "search-interwiki-caption": "Prugiette frate",
+       "search-interwiki-default": "Risultate 'a $1:",
+       "search-interwiki-more": "(cchiù)",
+       "search-relatedarticle": "Azzeccato",
+       "searchrelated": "azzeccato",
        "searchall": "Tutte",
+       "showingresults": "Ccà abbascio {{PLURAL:$1|s'apprisentano 'o massimo '''1''' risultato|veneno apprisentate massimo '''$1''' risultate}} aropp' 'o nummero '''$2'''.",
+       "showingresultsinrange": "{{PLURAL:$1|Vene mmustato|Veneno mmustate}} abbascio {{PLURAL:$1|<strong>1</strong> risultato|<strong>$1</strong> risultate}} d' 'o <strong>$2</strong> a 'o <strong>$3</strong>.",
+       "showingresultsheader": "{{PLURAL:$5|Risultato '''$1''' 'e '''$3'''|Risultate '''$1 - $2''' 'e '''$3'''}} pe' '''$4'''",
        "search-nonefound": "'A ricerca nun ha produtto risultate.",
+       "powersearch-legend": "Ricerca avanzata",
+       "powersearch-ns": "Ascìa dint' 'o namespace:",
+       "powersearch-togglelabel": "Cuntrolla:",
+       "powersearch-toggleall": "Tutto",
+       "powersearch-togglenone": "Nisciuno",
+       "powersearch-remember": "Arricuòrdate d' 'a selezziona quanno faje ricerche nfuturo",
+       "search-external": "Ricerca 'a fore",
+       "searchdisabled": "'A ricerca dint'a {{SITENAME}} nun è attiva; pe' tramente se putesse ausà nu mutore 'e cerca sterno comm'a Google. (Avite 'e sapé però, ca sti cuntenute d' 'o {{SITENAME}} dint' 'e mutore, può darse ca nun stanno agghiurnate.)",
+       "search-error": "È succiesso n'errore pe' tramente ca se faceva 'a ricerca: $1",
+       "preferences": "Preferenze d''e mmeje",
        "mypreferences": "Preferenze d''e mmeje",
+       "prefs-edits": "Cagnamiente affettuate:",
+       "prefsnologintext2": "Pe' piacere, tràse pe' cagnà 'e preferenze tuje.",
+       "prefs-skin": "Aspetto grafeco (skin)",
+       "skin-preview": "Anteprimma",
+       "datedefault": "Nisciuna preferenza",
+       "prefs-labs": "Funzionalità sperimentale",
+       "prefs-user-pages": "Paggene utente",
+       "prefs-personal": "Profilo utente",
        "prefs-rc": "Urdeme nove",
        "prefs-watchlist": "Asservate speciale",
+       "prefs-watchlist-days": "Nummero 'e juorne 'a mmustà dint'a l'elenco 'e cuntrollo:",
+       "prefs-watchlist-days-max": "Massimo $1 {{PLURAL:$1|juorno|juorne}}",
+       "prefs-watchlist-edits": "Numero massimo 'e cagnamiente 'a mmustà ch' 'e funziune avanzate:",
+       "prefs-watchlist-edits-max": "Nummero massimo: 1000",
+       "prefs-watchlist-token": "Token 'e l'alenco 'e cuntrollo:",
+       "prefs-misc": "Varje",
+       "prefs-resetpass": "Cagna 'a password",
+       "prefs-changeemail": "Cagna l'indirizzo e-mail",
+       "prefs-setemail": "Mpizza nu ndirizzo e-mail",
+       "prefs-email": "Ozziune e-mail",
+       "prefs-rendering": "Aspetto",
        "saveprefs": "Sarva",
+       "restoreprefs": "Arripiglia 'e mpustaziune predefinite (inta tutte 'e seziune)",
+       "prefs-editing": "Cascia 'e cagnamiento",
+       "rows": "Righe:",
        "columns": "Culonne:",
        "searchresultshead": "Truova",
+       "stub-threshold": "Valore minimo p' 'e <a href=\"#\" class=\"stub\">cullegamiente a 'e stub</a>, 'n byte:",
+       "stub-threshold-disabled": "Stutato",
+       "recentchangesdays": "Nummero 'e juorne a mmustà dint'a l'urdeme cagnamiente:",
+       "recentchangesdays-max": "Massimo $1 {{PLURAL:$1|juorno|juorne}}",
+       "recentchangescount": "Nummero predefinito 'e cagnamiente 'a mmustà:",
+       "prefs-help-recentchangescount": "Chesto ntenne ll'urdeme cagnamiente, 'e cronologgie 'e paggena, e riggistre.",
+       "prefs-help-watchlist-token2": "Chest'è 'a chiave segreta pe se ffà 'o feed web 'e l'alenco 'e cuntrolo d' 'o vuosto.\nSi coccheruno 'a cunoscesse, allora putesse vedé l'alenco 'e cuntrollo, picciò nun 'a spartite. [[Special:ResetTokens|Cliccate ccà se tenite necessità d' 'a rimpizzà]].",
+       "savedprefs": "'E preferenze songo state sarvate.",
+       "timezonelegend": "Fuso orario:",
+       "localtime": "Ora lucale:",
+       "timezoneuseserverdefault": "Aúsa ora predefinita d' 'o wiki ($1)",
+       "timezoneuseoffset": "Ato (specificà 'a differenza)",
+       "servertime": "Ora d' 'o server:",
+       "guesstimezone": "Aúsa l'ora d' 'o navigatóre",
        "timezoneregion-africa": "Afreca",
+       "timezoneregion-america": "Amereca",
+       "timezoneregion-antarctica": "Antartide",
+       "timezoneregion-arctic": "Arteco",
+       "timezoneregion-asia": "Asia",
+       "timezoneregion-atlantic": "Oceano Atlanteco",
+       "timezoneregion-australia": "Australia",
+       "timezoneregion-europe": "Europa",
+       "timezoneregion-indian": "Oceano Indiano",
+       "timezoneregion-pacific": "Oceano Pacifeco",
+       "allowemail": "Abbìa 'a ricezione 'e mmasciate mannate 'a l'ati utente",
+       "prefs-searchoptions": "Ascìa",
+       "prefs-namespaces": "Namespace",
+       "default": "predefinito",
+       "prefs-files": "File",
+       "prefs-custom-css": "CSS personalizzato",
+       "prefs-custom-js": "JavaScript personalizzato",
+       "prefs-common-css-js": "CSS/JavaScript spartuto pe' tutt' 'e skin:",
+       "prefs-reset-intro": "Putisse ausà sta paggena pe' rimpizzà 'e preferenze proprie comme chille predefinite d' 'o sito.\nL'operazione nun se può annullà.",
+       "prefs-emailconfirm-label": "Cunferma 'e ll'e-mail:",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Nomme utente}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|d' 'o gruppo|d' 'e gruppe}}:",
+       "prefs-registration": "Data 'e riggistrazione:",
        "yourrealname": "Nomme vero",
        "yourlanguage": "Lengua:",
+       "yourvariant": "Variante d' 'a llengua:",
+       "prefs-help-variant": "'A variante o grafia ca preferite 'e vedé ncopp' 'e paggene 'e chesta wiki.",
+       "yournick": "Soprannomme (nickname):",
+       "prefs-help-signature": "'E cummente dint' 'e paggene 'e chiacchiera hanna essere firmate cu \"<nowiki>~~~~</nowiki>\" ca s'addeventarrà automatecamente 'a firma propria c' 'a data.",
+       "badsig": "Errore 'e firma nun standard, cuntrullate 'e tag HTML.",
+       "badsiglength": "'A firma c'avite scigliuto è troppo luonga, chesta nun avesse 'a superà $1 {{PLURAL:$1|carattere|carattere}}.",
+       "yourgender": "Comme nce referimmo a vvuje?",
+       "gender-unknown": "Preferisco 'e nun 'o ddicere",
+       "gender-male": "È riggistrato ncopp' 'a {{SITENAME}}",
+       "gender-female": "È riggistrata ncopp' 'a {{SITENAME}}",
+       "prefs-help-gender": "Mpizzà sta preferenza è ozzionale.\n'O software aúsa stu valore pe' se vutà a vuje e v'anummenà a l'ati utente ausanno 'o gennere grammatecale buono.\nCheste nfurmaziune sarranno pubbreche.",
+       "email": "E-mail",
+       "prefs-help-realname": "'O nomme overo vuosto è ozzionale.\nSi sciglite 'e nzertà 'o nomme overo, chesto s'ausarrà pe' dà l'utente l'attribuzione d' 'a fatica fatta.",
+       "prefs-help-email": "L'e-mail vuosto è ozzionale, ma permettesse 'e ricevere 'a password propria quanno v' 'a scurdate.",
+       "prefs-help-email-others": "Putite pure scegliere 'e lassà che l'at'utente ve mannassero mmasciate via e-mail cu nu cullegamiento â paggena d'utente o chiacchiera.\nLl'indirizzo e-mail vuosto nun è scummigliato quanno l'at'utente ve cuntattano.",
+       "prefs-help-email-required": "L'indirizzo e-mail è obbligatorio.",
+       "prefs-info": "Nfurmaziune bbase",
+       "prefs-i18n": "Nternaziunalizzazione",
+       "prefs-signature": "Firma",
+       "prefs-dateformat": "Furmato data",
+       "prefs-timeoffset": "Ore 'e differenza",
+       "prefs-advancedediting": "Ozziune generale",
+       "prefs-editor": "Editore",
+       "prefs-preview": "Anteprimma",
+       "prefs-advancedrc": "Ozziune avanzate",
+       "prefs-advancedrendering": "Ozziune avanzate",
+       "prefs-advancedsearchoptions": "Ozziune avanzate",
+       "prefs-advancedwatchlist": "Ozziune avanzate",
+       "prefs-displayrc": "Ozziune 'e visualizzazione",
+       "prefs-displaywatchlist": "Ozziune 'e visualizzazione",
+       "prefs-tokenwatchlist": "Token",
+       "prefs-diffs": "Differenze",
+       "prefs-help-prefershttps": "Sta preferenza averrà affetto 'a 'o prossimo acciesso vuosto.",
+       "prefs-tabs-navigation-hint": "Suggerimento: se ponno ausà 'e buttòne 'e freccia a manca e a dritta pe' ve muovere nfra 'e schede dint'a l'alenco d' 'e schede.",
+       "email-address-validity-valid": "L'indirizzo e-mail pare valido",
+       "email-address-validity-invalid": "Nzerta n'indirizzo e-mail valido",
+       "userrights": "Gestione d' 'e permesse 'e l'utente",
+       "userrights-lookup-user": "Gestione 'e gruppe d'utenza",
+       "userrights-user-editname": "Nzertàte nu nomme utente:",
+       "editusergroup": "Cagnate 'e gruppe d'utenze",
+       "editinguser": "Cagnamiento d' 'e deritte d'utente '''[[User:$1|$1]]''' $2",
+       "userrights-editusergroup": "Cagnate 'e gruppe d'utenze",
+       "saveusergroups": "Sarvate 'e gruppe d'utenza",
+       "userrights-groupsmember": "Ffà parte {{PLURAL:$1|d' 'o gruppo|d' 'e gruppe}}:",
+       "userrights-groupsmember-auto": "Membro mplicito 'e:",
+       "userrights-groups-help": "Putite cagnà 'e gruppe assegnate a l'utente:\n* Na cascia 'e spunta scigliuta significasse ca appartenenza 'e l'utente a 'o gruppo\n* Na cascia 'e spunta nun scigliuta significasse 'a nun appartenenza a 'o gruppo.\n* 'O simmolo * significasse ca nun se può scancellà l'appartenenza a 'o gruppo aropp'a ll'avé miso (o viceversa).",
+       "userrights-reason": "Mutivo:",
+       "userrights-no-interwiki": "Nun tenite permesse pe' cagnà 'e deritte 'e l'utente ncopp'a l'ati wiki.",
+       "userrights-nodatabase": "'O database $1 nun esiste o nun è nu database lucale.",
+       "userrights-nologin": "Avite 'a [[Special:UserLogin|trasì]] comme ammenistratore si vulite assegnà 'e deritte 'e l'utente.",
+       "userrights-notallowed": "Nun tenite 'e permesse pe' jognere o luvà 'e permesse utente.",
+       "userrights-changeable-col": "Gruppe ca putite cagnà",
+       "userrights-unchangeable-col": "Gruppe ca nun putite cagnà",
+       "userrights-conflict": "Conflitto 'e cagnamiento 'e deritte utente! Cuntrullate e cunfermate 'e cagnamiente vuoste.",
+       "userrights-removed-self": "Avete rimosso buono 'e deritte vuoste. Picciò nun putite trasì cchiù dint'a sta paggena.",
+       "group": "Gruppo:",
+       "group-user": "Utente",
+       "group-autoconfirmed": "Utente autocunfermate",
+       "group-bot": "Bot",
+       "group-sysop": "Ammenistrature",
+       "group-bureaucrat": "Burocrate",
+       "group-suppress": "Oversight",
+       "group-all": "(tutte)",
+       "group-user-member": "{{GENDER:$1|utente}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|utente autocunfermato|utente autocunfermata|utente autocunfermato/a}}",
+       "group-bot-member": "{{GENDER:$1|bot}}",
+       "group-sysop-member": "{{GENDER:$1|ammenistratore|ammenistratrice|ammenistratore/trice}}",
+       "group-bureaucrat-member": "{{GENDER:$1|burocrate}}",
+       "group-suppress-member": "{{GENDER:$1|oversight}}",
+       "grouppage-user": "{{ns:project}}:Utente",
+       "grouppage-autoconfirmed": "{{ns:project}}:Utente autocunfermate",
+       "grouppage-bot": "{{ns:project}}:Bot",
+       "grouppage-sysop": "{{ns:project}}:Ammenistrature",
+       "grouppage-bureaucrat": "{{ns:project}}:Burocrate",
+       "grouppage-suppress": "{{ns:project}}:Oversight",
+       "right-read": "Liegge paggene",
+       "right-edit": "Cagna paggene",
+       "right-createpage": "Crìa paggene (ca nun songo paggene 'e chiacchiera)",
+       "right-createtalk": "Crìa chiacchiere 'e paggena",
+       "right-createaccount": "Crìa utenze nove",
+       "right-minoredit": "Nzigna 'e cagnamiente comme minure",
+       "right-move": "Muove 'e paggene",
+       "right-move-subpages": "Muove 'e paggene nzieme ê sottopaggene suje",
+       "right-move-rootuserpages": "Muove 'e paggene princepale d'utente",
+       "right-move-categorypages": "Muove 'e categurìe",
+       "right-movefile": "Muove 'e file",
+       "right-suppressredirect": "Nun crià 'e redirect automateco quanno se muoveno 'e paggene",
+       "right-upload": "Carreca file",
+       "right-reupload": "Sovrascrive nu file ch'esiste",
+       "right-reupload-own": "Sovrascrive nu file esistente carrecat'a l'utente stesso",
+       "right-reupload-shared": "Sovrascrive lucalmente file prisente dint'a l'archivio spartuto",
+       "right-upload_by_url": "Carreca nu file 'a n'indirizzo URL",
+       "right-purge": "Pulezza 'a cache d' 'o sito senza cunferma",
+       "right-autoconfirmed": "Nun suggetto a 'o lemmeto d'aziune 'a l'IP",
+       "right-bot": "S'avesse 'e trattà comm'a nu prucesso automateco",
+       "right-nominornewtalk": "Fa ch' 'e cagnamiente minore a 'e paggene 'e chiacchiera nun facciano scattà l'avviso 'e mmasciata nnova",
+       "right-apihighlimits": "Usa límmete cchiù aute pe l'interrogaziune a ll'API",
+       "right-writeapi": "Usa l'API 'n scrittura",
+       "right-delete": "Scancella paggene",
+       "right-bigdelete": "Scancella paggene ch' 'e cronologgie luonghe",
+       "right-deletelogentry": "Scancella e arripiglia vvoce 'e riggistro specifiche",
+       "right-deleterevision": "Annascunne verziune specifiche d' 'e paggene",
+       "right-deletedhistory": "Vide 'e verziune d' 'a cronologgia scancellate senza 'o testo suoccio a lloro",
+       "right-deletedtext": "Vide 'o testo scancellato e cagnamiente nfra virziune scancellate",
+       "right-browsearchive": "Ascìa dint' 'e paggene scancellate",
+       "right-undelete": "Arripiglia na paggena",
+       "right-suppressrevision": "Vide, annascunne e ripiglia 'e verziune specifiche d' 'e paggene a cocherun'utente",
+       "right-viewsuppressed": "Vide 'e verziune annascunnute a coccherun'utente",
+       "right-suppressionlog": "Vide 'e riggistre private",
+       "right-block": "Blocca 'e cagnamiente 'a parte 'e l'at'utente",
+       "right-blockemail": "Blocca n'utente a mannà e-mail",
+       "right-hideuser": "Blocca n'utente e fallo sparì 'a 'o pubbreco",
+       "right-ipblock-exempt": "Ignora 'e blocche 'e l'IP, 'e blocche automatece e li blocche 'e range 'e l'IP",
+       "right-proxyunbannable": "Passa 'e blocche automatiche d' 'e proxy",
+       "right-unblockself": "Sblocca se stesso",
+       "right-protect": "Cagna 'e livelle 'e prutezione 'e cagna paggene prutette ricurzivamente",
+       "right-editprotected": "Cagna 'e paggene prutette cu \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "Cagna 'e paggene prutette cu \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editinterface": "Modifeca 'a nterfaccia utente",
+       "right-editusercssjs": "Cagna 'e file CSS e JS e l'at'utente",
+       "right-editusercss": "Cagna 'e file CSS 'e l'at'utente",
+       "right-edituserjs": "Cagna 'e file JS e l'at'utente",
+       "right-editmyusercss": "Cagna 'e proprie file CSS",
+       "right-editmyuserjs": "Cagna 'e proprie file JavaScript",
+       "right-viewmywatchlist": "Vide l'alenco 'e cuntrollo proprio",
+       "right-editmywatchlist": "Cagna l'alenco 'e cuntrollo proprio. Vedete ca cocch'azione putesse jògnere ancora paggene senza stu deritto.",
+       "right-viewmyprivateinfo": "Vide 'e proprie date private (e.g. e-mail, nomme overo)",
+       "right-editmyprivateinfo": "Cagna 'e date perzunale proprie (p'esempio: e-mail, nomme overo)",
+       "right-editmyoptions": "Cagna 'e preferenze proprie",
+       "right-rollback": "Annulla ampresso 'e cagnamiente 'e ll'urdem'utente c'avesse cagnato na paggena particolare",
+       "right-markbotedits": "Nzégna 'e cagnamiente suggette a rollback comme affettuate 'a nu bot",
+       "right-noratelimit": "Nun suggetto a lemmeto d'aziune",
+       "right-import": "Carreca paggene 'a n'ati wiki",
+       "right-importupload": "Carreca paggene 'a n'upload 'e file",
+       "right-patrol": "Nzegna 'e cagnamiente 'e l'ati utente comme cuntrullate",
+       "right-autopatrol": "Nzegna automatecamente 'e cagnamiente proprie comme cuntrullate",
+       "right-patrolmarks": "Vide ll'urdeme cagnamiente int' 'a funzione 'e cuntrollo",
+       "right-unwatchedpages": "Vide n'alenco 'e pagene nun cuntrullate",
+       "right-mergehistory": "Aunisce 'a cronologgia d' 'e paggene",
+       "right-userrights": "Cagna 'e deritte 'e ll'utente",
+       "right-userrights-interwiki": "Cagna 'e deritte 'e ll'utente int'a l'ati wiki",
+       "right-siteadmin": "Blocca e sblocca 'o database",
+       "right-override-export-depth": "Esporta 'e paggene azzeccanno 'e paggene cullegate nfin'a na profondità 'e 5",
+       "right-sendemail": "Manna na mail a ll'at'utente",
+       "right-passwordreset": "Vide 'e mmasciate 'e rimpustazione d' 'a password",
+       "newuserlogpage": "Riggistro 'e nuove utente",
+       "newuserlogpagetext": "Chest'è nu riggistro 'e criazione d'utenze.",
+       "rightslog": "Deritte 'e ll'utente",
+       "rightslogtext": "Ccà abbascio sta nu riggistro d' 'e cagnamiente a 'e deritte 'e ll'utente",
+       "action-read": "lieggere sta paggena",
        "action-edit": "càgna chesta paggena",
+       "action-createpage": "crìa paggene",
+       "action-createtalk": "crìa chiacchiere 'e paggena",
+       "action-createaccount": "crìa stu cunto utente",
+       "action-history": "vide 'a cronologgia 'e sta paggena",
+       "action-minoredit": "nzegnà stu cagnamiento comme minore",
+       "action-move": "Spusta chista paggena",
+       "action-move-subpages": "muovere sta paggena, e le sottopaggene relative",
+       "action-move-rootuserpages": "muove 'e paggene princepale d'utente",
+       "action-move-categorypages": "muove 'e categurìe",
+       "action-movefile": "muove stu file",
+       "action-upload": "carreca stu file",
+       "action-reupload": "sovrascrive stu file esistente",
+       "action-reupload-shared": "sovrascrive stu file prisente dint'a ll'archivio condiviso",
+       "action-upload_by_url": "carreca stu file 'a n'indirizzo URL",
+       "action-writeapi": "usa l'API 'n scrittura",
+       "action-delete": "scancèlla chista paggena",
+       "action-deleterevision": "scancellà sta verziona",
+       "action-deletedhistory": "vide 'a cronologgia scancellata 'e sta paggena",
+       "action-browsearchive": "ascìa dint' 'e paggene scancellate",
+       "action-undelete": "arripiglia chista paggena",
+       "action-suppressrevision": "rivedé e arripiglià 'e cagnamiente annascunnute",
+       "action-suppressionlog": "vide stu riggistro privato",
+       "action-block": "blocca 'e cagnamiente 'a parte 'e st'utente",
+       "action-protect": "cagna 'e livelle 'e prutezione pe' sta paggena",
+       "action-rollback": "annulla ampresso 'e cagnamiente 'e ll'urdem'utente c'avesse cagnato na paggena particolare",
+       "action-import": "carreca paggene 'a n'ata wiki",
+       "action-importupload": "carreca paggene 'a n'upload 'e file",
+       "action-patrol": "nzegna 'e cagnamiente 'e l'ati utente comme cuntrullate",
+       "action-autopatrol": "nzignà 'e proprie cagnamiente comme cuntrullate",
+       "action-unwatchedpages": "vide l'alenco 'e pagene nun cuntrullate",
+       "action-mergehistory": "aunisce 'a cronologgia 'e sta paggena",
+       "action-userrights": "cagna 'e deritte 'e ll'utente",
+       "action-userrights-interwiki": "cagna 'e deritte 'e ll'utente int'a l'ati wiki",
+       "action-siteadmin": "blocca o sblocca 'o database",
+       "action-sendemail": "manna e-mail",
+       "action-editmywatchlist": "cagna l'alenco 'e cuntrolo 'o tuojo",
+       "action-viewmywatchlist": "vide l'alenco 'e cuntrollo proprio",
+       "action-viewmyprivateinfo": "vide 'e date perzunale",
+       "action-editmyprivateinfo": "cagnà 'e proprie date perzunale",
+       "nchanges": "$1 {{PLURAL:$1|cagnamiento|cagnamiente}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|'a ll'urdema visita}}",
+       "enhancedrc-history": "cronologgia",
        "recentchanges": "Urdeme nove",
        "recentchanges-legend": "Opzione urdeme cagnamiénte",
-       "recentchanges-summary": "Ncoppa chesta paggena song' appresentate ll'urdeme cagnamiente fatto ê cuntenute d\"o sito.",
+       "recentchanges-summary": "Ncoppa chesta paggena song' appresentate ll'urdeme cagnamiente fatte ê cuntenute d\"o sito.",
+       "recentchanges-noresult": "Nisciuno cagnamiento dint'o periodo dato ca soddisfà sti criterie.",
+       "recentchanges-feed-description": "Ncoppa chistu feed song' appresentate ll'urdeme cagnamiente fatte ê cuntenute d\"o sito.",
        "recentchanges-label-newpage": "Chista modifica ha criato 'na nova paggena",
        "recentchanges-label-minor": "Chisto è nu cagnamiénto piccerillo",
+       "recentchanges-label-bot": "Cagnamiento affettuato 'a nu bot",
        "recentchanges-label-unpatrolled": "Chista modifica nun è stata 'ncora verificata",
+       "recentchanges-label-plusminus": "'A grannezza d' 'a paggena s'è cagnata pe' bbia 'e stu nummero 'e bytes",
+       "recentchanges-legend-heading": "'''Liggenda:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vide [[Special:NewPages|'e paggene nove]])",
+       "rcnotefrom": "Ccà abbascio {{PLURAL:$5|è alencato 'o cagnamiento appurtato|song' alincate 'e cagnamiente appurtate}} 'a <strong>$3, $4</strong> (mmustate nfin'a <strong>$1</strong>).",
        "rclistfrom": "Faje vedé 'e cagnamiénte fatte a partì 'a $3 $2",
        "rcshowhideminor": "$1 'e cagnamiénte piccerille",
+       "rcshowhideminor-show": "Faje vedé",
+       "rcshowhideminor-hide": "Annascunne",
        "rcshowhidebots": "$1 'e bot",
+       "rcshowhidebots-show": "Faje vedé",
+       "rcshowhidebots-hide": "Annascunne",
        "rcshowhideliu": "$1 ll'utente reggìstrate",
+       "rcshowhideliu-show": "Faje vedé",
+       "rcshowhideliu-hide": "Annascunne",
        "rcshowhideanons": "$1 ll'utente anonime",
+       "rcshowhideanons-show": "Faje vedé",
+       "rcshowhideanons-hide": "Annascunne",
+       "rcshowhidepatr": "$1 cagnamiente cuntrullate",
+       "rcshowhidepatr-show": "Faje vedé",
+       "rcshowhidepatr-hide": "Annascunne",
        "rcshowhidemine": "$1 'e ffatiche mmee",
+       "rcshowhidemine-show": "Faje vedé",
+       "rcshowhidemine-hide": "Annascunne",
        "rclinks": "Faje vedé ll'urdeme $1 cagnamiente dint' ll'urdeme $2 juorne<br />$3",
        "diff": "diff",
        "hist": "cron",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
+       "number_of_watching_users_pageview": "[osservata 'a {{PLURAL:$1|n'utente|$1 utente}}]",
+       "rc_categories": "Lemmeta a 'e categurìe (spartute 'a \"|\")",
        "rc_categories_any": "Qualònca",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} aropp'ô cagnamiento",
+       "newsectionsummary": "/* $1 */ sezziona nnova",
        "rc-enhanced-expand": "Fa vede dettaglie",
        "rc-enhanced-hide": "Annascunne dettaglie",
+       "rc-old-title": "origginariamente criata comme \"$1\"",
        "recentchangeslinked": "Cagnamiénte cullegate",
        "recentchangeslinked-feed": "Cagnamiénte cullegate",
        "recentchangeslinked-toolbox": "Cagnamiénte cullegate",
        "whatlinkshere-hidelinks": "$1 jonte",
        "whatlinkshere-hideimages": "$1 links ddo file",
        "whatlinkshere-filters": "Filtre",
-       "blockip": "Ferma utelizzatóre",
+       "blockip": "Blocca {{GENDER:$1|utente}}",
        "ipaddressorusername": "Nnerizzo IP o nomme utente",
        "ipboptions": "2 ore:2 hours,1 juorno:1 day,3 juorne:3 days,1 semmana:1 week,2 semmane:2 weeks,1 mise:1 month,3 mese:3 months,6 mese:6 months,1 anno:1 year,infinito:infinite",
        "blockipsuccesssub": "Blocco aseguito",
index 9085481..39ccb96 100644 (file)
        "userlogin-resetlink": "Har du glemt påloggingsdetaljene dine?",
        "userlogin-resetpassword-link": "Glemt passordet?",
        "userlogin-helplink2": "Hjelp med innlogging",
-       "userlogin-loggedin": "Du er allerede logget inn som {{GENDER:$1|$1}}.\nBruk skjemaet nedenfor for å logge inn som en annen bruker.",
-       "userlogin-createanother": "Opprett ny konto",
        "createacct-emailrequired": "E-postadresse",
        "createacct-emailoptional": "E-postadresse (valgfritt)",
        "createacct-email-ph": "Skriv inn e-postadressen din",
        "unwatchthispage": "Fjerner overvåkning",
        "notanarticle": "Ikke en artikkel",
        "notvisiblerev": "Revisjonen er slettet",
-       "watchlist-details": "{{PLURAL:$1|Én side|$1 sider}} på din overvåkningsliste, teller ikke diskusjonssider.",
+       "watchlist-details": "Du har {{PLURAL:$1|én side|$1 sider}} på overvåkningslisten din (pluss tilhørende diskusjonssider).",
        "wlheader-enotif": "E-postvarsling er slått på.",
-       "wlheader-showupdated": "Sider som har blitt forandret siden du sist besøkte dem vises i '''fet tekst'''",
+       "wlheader-showupdated": "Sider som har blitt endret siden du besøkte dem sist vises i '''fet tekst'''.",
        "wlnote": "Nedenfor er {{PLURAL:$1|den siste endringen|de siste <strong>$1</strong> endringene}} {{PLURAL:$2|den siste timen|de siste <strong>$2</strong> timene}}, per $3 kl. $4",
        "wlshowlast": "Vis siste $1 timer $2 dager $3",
        "watchlist-options": "Alternativ for overvåkningslisten",
index b2a960c..f6ab918 100644 (file)
        "userlogin-resetlink": "Bent u uw aanmeldgegevens vergeten?",
        "userlogin-resetpassword-link": "Wachtwoord vergeten?",
        "userlogin-helplink2": "Hulp bij aanmelden",
-       "userlogin-loggedin": "U bent al aangemeld als {{GENDER:$1|$1}}.\nGebruik het onderstaande formulier om aan te melden als een andere gebruiker.",
-       "userlogin-createanother": "Een andere account aanmaken",
        "createacct-emailrequired": "E-mailadres",
        "createacct-emailoptional": "E-mailadres (optioneel)",
        "createacct-email-ph": "Geef uw e-mailadres op",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|heeft}} het groepslidmaatschap gewijzigd voor $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|is}} automatisch gepromoveerd van $4 naar $5",
        "logentry-upload-upload": "$1 heeft $3 {{GENDER:$2|geupload}}",
-       "logentry-upload-overwrite": "$1 heeft een nieuwe versie van $3 {{GENDER:$2|geupload}}",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|heeft}} een nieuwe versie van $3 geüpload",
        "logentry-upload-revert": "$1 heeft $3 {{GENDER:$2|geupload}}",
        "rightsnone": "(geen)",
        "feedback-bugornote": "Als u zover bent om een technisch probleem in detail te beschrijven, [$1 rapporteer dan een bug].\nAnders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw reactie wordt dan toegevoegd aan de pagina \"[$3 $2]\", samen met uw gebruikersnaam en de browser die u gebruikt.",
index 91a323d..6c57a4c 100644 (file)
        "randomincategory": "Tilfeldig side frå kategori",
        "randomincategory-invalidcategory": "«$1» er ikkje eit gildt kategorinamn.",
        "randomincategory-nopages": "Det er ingen sider i kategorien [[:Category:$1|$1]].",
-       "randomincategory-selectcategory": "Hent tilfeldig side frå kategori: $1 $2.",
-       "randomincategory-selectcategory-submit": "Hent",
        "randomredirect": "Tilfeldig omdirigering",
        "randomredirect-nopages": "Det finst ingen omdirigeringar i namnerommet «$1».",
        "statistics": "Statistikk",
        "whatlinkshere-filters": "Filter",
        "autoblockid": "Autoblokker #$1",
        "block": "Blokker brukar",
-       "unblock": "Opphev blokkeringa av brukaren",
+       "unblock": "Opphev blokkering av brukar",
        "blockip": "Blokker brukar",
        "blockip-legend": "Blokker brukar",
        "blockiptext": "Bruk skjemaet nedanfor for å blokkere skrivetilgangen frå ei spesifikk IP-adresse eller brukarnamn. Dette bør berre gjerast for å hindre hærverk, og i samsvar med [[{{MediaWiki:Policy-url}}|retningslinene]].",
        "import": "Importer sider",
        "importinterwiki": "Transwikiimport",
        "import-interwiki-text": "Vel ei wiki og ei side å importere. Endringssdatoer og brukarar som har medverka vert bevart. Alle transwiki-importeringar vert vist i [[Special:Log/import|importloggen]].",
-       "import-interwiki-source": "Kjeldewiki/sida:",
        "import-interwiki-history": "Kopier all historikken for denne sida",
        "import-interwiki-templates": "Inkluder alle malar",
        "import-interwiki-submit": "Importer",
index 0f26891..d46b17a 100644 (file)
@@ -29,6 +29,7 @@
        "tog-watchdefault": "Apondre las paginas que modifiqui e los fichièrs qu'impòrti a ma lista de seguiment",
        "tog-watchmoves": "Apondre las paginas e los fichièrs que tòrni nomenar a ma lista de seguiment",
        "tog-watchdeletion": "Apondre las paginas e los fichièrs que suprimissi de ma lista de seguiment",
+       "tog-watchrollback": "Apondre a ma lista de seguiment las paginas sus las qualas ai efectuat una revocacion",
        "tog-minordefault": "Considerar mas modificacions coma menoras per defaut",
        "tog-previewontop": "Far veire la previsualizacion al dessús de la zòna de modificacion",
        "tog-previewonfirst": "Far veire la previsualizacion al moment de la primièra edicion",
        "jumptonavigation": "navigacion",
        "jumptosearch": "Recercar",
        "view-pool-error": "O planhèm, los servidors son subrecargats pel moment.\nTròp d’utilizaires cercan a accedir a aquesta pagina.\nEsperatz un moment abans d'ensajar d’accedir a aquesta pagina.\n\n$1",
+       "generic-pool-error": "O planhèm, los servidors son subrecargats pel moment.\nTròp d’utilizaires ensajan de consultar aquesta ressorsa.\nEsperatz un moment abans d'ensajar d’accedir a aquesta pagina.",
        "pool-timeout": "Relambi depassat pendent l'espèra del varrolh",
        "pool-queuefull": "La fila de trabalh es plena",
        "pool-errorunknown": "Error desconeguda",
+       "pool-servererror": "Lo servici de comptatge de la reserva es pas disponible ($1).",
        "aboutsite": "A prepaus de {{SITENAME}}",
        "aboutpage": "Project:A prepaus",
        "copyright": "Lo contengut es disponible jos licéncia $1 levat mencion contrària.",
        "hidetoc": "amagar",
        "collapsible-collapse": "Rebatre",
        "collapsible-expand": "Desplegar",
+       "confirmable-confirm": "Sètz segur{{GENDER:||a|(a)}} ?",
        "confirmable-yes": "Òc",
        "confirmable-no": "Non",
        "thisisdeleted": "Desiratz afichar o restablir $1?",
        "userlogin-resetlink": "Avètz doblidat vòstres detalhs de connexion ?",
        "userlogin-resetpassword-link": "Senhal doblidat ?",
        "userlogin-helplink2": "Ajuda a la connexion",
-       "userlogin-loggedin": "Sètz ja connectat en tant que {{GENDER:$1|$1}}.\nUtilizatz lo formulari çaijós per vos connectar amb un autre utilizaire.",
-       "userlogin-createanother": "Crear un autre compte",
        "createacct-emailrequired": "Adreça electronica",
        "createacct-emailoptional": "Adreça de corrièr electronic (facultativa)",
        "createacct-email-ph": "Entratz vòstra adreça de corrièr electronic",
        "resetpass-submit-cancel": "Anullar",
        "resetpass-wrong-oldpass": "Senhal actual o temporari invalid.\nBenlèu ja avètz modificat vòstre senhal o demandat un senhal temporari novèl.",
        "resetpass-recycled": "Reïnicializatz vòstre senhal a quicòm mai que l’actual.",
+       "resetpass-temp-emailed": "Sètz connect{{GENDER:|at|ada}} amb un còde temporari provesit per corrièr electronic.\nPer acabar la connexion, vos cal provesir un senhal novèl aicí :",
        "resetpass-temp-password": "Senhal temporari :",
        "resetpass-abort-generic": "La modificacion del senhal es estada anulada per una extension.",
        "resetpass-expired": "Vòstre senhal a expirat. Provesissètz-ne un novèl per vos connectar.",
+       "resetpass-expired-soft": "Vòstre senhal a expirat, e deu èsser reïnicializat. Causissètz-ne un novèl ara, o clicatz sus « {{int:resetpass-submit-cancel}} » per o far mai tard.",
+       "resetpass-validity-soft": "Vòstre senhal es pas valid : $1\n\nCausissètz un senhal novèl ara, o clicatz sus « {{int:resetpass-submit-cancel}} » per lo reïnicializar mai tard.",
        "passwordreset": "Remesa a zèro del senhal",
        "passwordreset-text-one": "Emplenatz aqueste formulari per reïnicializar vòstre senhal.",
        "passwordreset-text-many": "{{PLURAL:$1|Completatz un d'aqueles camps per recebre un senhal temporari per corrièr electronic.}}",
        "preview": "Previsualizar",
        "showpreview": "Previsualizacion",
        "showdiff": "Veire los cambiaments",
+       "blankarticle": "<strong>Atencion :</strong> La pagina que creatz es voida.\nSe clicatz tornarmai sus « {{int:savearticle}} », la pagina serà creada sens cap de contengut.",
        "anoneditwarning": "'''Atencion :''' sètz pas identificat(ada).\nVòstra adreça IP serà enregistrada dins l’istoric d'aquesta pagina.",
        "anonpreviewwarning": "''Sètz pas identificat. Salvar enregistrarà vòstra adreça IP dins l’istoric de las modificacions de la pagina.''",
        "missingsummary": "'''Atencion :''' avètz pas modificat lo resumit de vòstra modificacion. Se clicatz tornarmai sul boton « Salvar », lo salvament serà fach sens avertiment mai.",
        "parser-template-recursion-depth-warning": "Limit de longor de la recursion del modèl depassat ($1)",
        "language-converter-depth-warning": "Limit de prigondor del convertissor de lenga depassada ($1)",
        "node-count-exceeded-category": "Paginas ont nombre de nosèls es depassat",
-       "node-count-exceeded-warning": "Pagina depassant lo nombre de nosèls",
+       "node-count-exceeded-category-desc": "Aquesta pagina depassa lo nombre maximal de nosèls.",
+       "node-count-exceeded-warning": "Pagina que depassa lo nombre de nosèls",
        "expansion-depth-exceeded-category": "Paginas ont la prigondor d'espandiment es depassada",
+       "expansion-depth-exceeded-category-desc": "La pagina depassa la prigondor d’espandiment maximala.",
        "expansion-depth-exceeded-warning": "Pagina depassant la prigondor d'espandiment",
        "parser-unstrip-loop-warning": "Bocla pas desmontabla detectada",
        "parser-unstrip-recursion-limit": "Limit de recursion pas desmontable depassat ($1)",
        "rev-deleted-event": "(entrada suprimida)",
        "rev-deleted-user-contribs": "[nom d'utilizaire o adreça IP suprimida - modificacion amagada sus las contribucions]",
        "rev-deleted-text-permission": "Aquesta version de la pagina es estada '''escafada'''.\nI pòt aver de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal dels escafaments].",
+       "rev-suppressed-text-permission": "Aquesta version de la page es estada <strong>suprimida</strong>.\nLos detalhs se tròban dins lo [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jornal de las supressions].",
        "rev-deleted-text-unhide": "Aquesta version de la pagina es estada '''escafada'''.\nI pòt aver mai de detalhs dins [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} lo jornal dels escafaments].\nComa administrator, podètz encara [$1 veire aquesta version] s'o volètz.",
        "rev-suppressed-text-unhide": "Aquesta version de la pagina es estada '''suprimida'''.\nI pòt aver mai de detalhs dins [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} lo jornal de las supressions].\nComa administrator, podètz encara [$1 veire aquesta version] s'o volètz.",
        "rev-deleted-text-view": "Aquesta version de la pagina es estada '''escafada'''.\nLa podètz visualizar ; de detalhs son disponibles dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal dels escafaments].",
        "revdelete-selected-text": "{{PLURAL:$1|Revision seleccionada|Revisions seleccionadas}} de [[:$2]] :",
        "revdelete-selected-file": "{{PLURAL:$1|Version de fichièr seleccionada|Versions de fichièr seleccionadas}} de [[:$2]] :",
        "logdelete-selected": "{{PLURAL:$1|Eveniment d'istoric seleccionat|Eveniments d'istoric seleccionats}} :",
+       "revdelete-text-text": "Las revisions suprimidas contunharàn d'aparéisser dins l’istoric de la pagina, mas una partida de lor contengut serà inaccessibla al public.",
+       "revdelete-text-file": "Las versions de fichièr suprimidas contunharàn d'aparéisser dins l’istoric dels fichièrs, mas una partida de lor contengut serà indisponibla al public.",
+       "logdelete-text": "Los eveniments del jornal suprimits contunharàn d'aparéisser dins los jornals, mas una partida de lor contengut serà indisponibla al public.",
+       "revdelete-text-others": "Los autres administrators seràn totjorn en mesura d'accedir al contengut amagat e de lo restablir, levat se de restriccions suplementàrias son fixadas.",
        "revdelete-confirm": "Confirmatz que volètz efectuar aquesta accion, que ne comprenètz las consequéncias, e qu'o fasètz en acòrd amb [[{{MediaWiki:Policy-url}}|las règlas]].",
        "revdelete-suppress-text": "La supression deu èsser utilizada '''sonque''' dins los cases seguents :\n* Informacions potencialament difamatòrias\n* Informacions personalas inapropriadas\n*: ''adreça, numèro de telefòn, numèro de seguretat sociala, ...''",
        "revdelete-legend": "Metre en plaça de restriccions de version :",
        "mergehistory-empty": "Cap de revision pòt pas èsser fusionada.",
        "mergehistory-success": "$3 {{PLURAL:$3|revision|revisions}} de [[:$1]] {{PLURAL:$3|fusionada|fusionadas}} amb succès amb [[:$2]].",
        "mergehistory-fail": "Impossible de procedir a la fusion dels istorics. Seleccionatz  tornamai la pagina e mai los paramètres de data.",
+       "mergehistory-fail-toobig": "Impossible d’efectuar la fusion de l’istoric perque un nombre de {{PLURAL:$1|revisions}} superior al limit de $1 deuriá èsser desplaçat.",
        "mergehistory-no-source": "La pagina d'origina $1 existís pas.",
        "mergehistory-no-destination": "La pagina de destinacion $1 existís pas.",
        "mergehistory-invalid-source": "La pagina d’origina deu aver un títol valid.",
        "editundo": "desfar",
        "diff-empty": "(Pas cap de diferéncia)",
        "diff-multi-sameuser": "({{PLURAL:$1|Una revision intermediària pel meteis utilizaire pas afichada|$1 revisions intermediàrias pel meteis utilizaire pas afichadas}})",
+       "diff-multi-otherusers": "({{PLURAL:$1|Una revision intermediària|$1 revisions intermediàrias}} per {{PLURAL:$2|un autre utilizaire|$2 utilizaires}} pas {{PLURAL:$1|afichada|afichadas}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Una revision intermediària amagada|$1 revisions intermediàrias amagadas}}) per ({{PLURAL:$2|un utilizaire pas afichada|$2 utilizaires pas afichadas}})",
        "difference-missing-revision": "{{PLURAL:$2|Una revision|$2 revisions}} d'aquesta diferéncia ($1) {{PLURAL:$2|es pas estada trobada|son pas estadas trobadas}}.\n\nAquò se produtz en general en seguent un ligam de diferéncia obsolèta cap a una pagina qu'es estada suprimada.\nPodètz trobar de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de las supressions].",
        "searchresults": "Resultats de la recèrca",
        "powersearch-togglelabel": "Marcar :",
        "powersearch-toggleall": "Tot",
        "powersearch-togglenone": "Pas cap",
+       "powersearch-remember": "Se remembrar de la seleccion per las recèrcas venentas",
        "search-external": "Recèrca extèrna",
        "searchdisabled": "La recèrca sus {{SITENAME}} es desactivada.\nEn esperant la reactivacion, podètz efectuar una recèrca via Google.\nAtencion, lor indexacion de contengut {{SITENAME}} benlèu es pas a jorn.",
        "search-error": "Una error s'es producha en recercant : $1",
        "preferences": "Preferéncias",
        "mypreferences": "Preferéncias",
        "prefs-edits": "Nombre d’edicions :",
-       "prefsnologintext2": "$1 per definir las preferéncias d'utilizaire.",
+       "prefsnologintext2": "Connectatz-vos per modificar vòstras preferéncias.",
        "prefs-skin": "Aparéncia",
        "skin-preview": "Previsualizar",
        "datedefault": "Pas cap de preferéncia",
        "prefs-tokenwatchlist": "Geton",
        "prefs-diffs": "Diferéncias",
        "prefs-help-prefershttps": "Aquesta preferéncia serà efectiva al moment de vòstra connexion que ven.",
+       "prefs-tabs-navigation-hint": "Astúcia : Podètz utilizar las flèchas d'esquèrra e de drecha per navigar entre los onglets.",
        "email-address-validity-valid": "L'adreça electronica sembla bona",
        "email-address-validity-invalid": "entrar una adreça electronica valida",
        "userrights": "Gestion dels dreches d'utilizaire",
        "right-move": "Tornar nomenar de paginas",
        "right-move-subpages": "Desplaçar de paginas amb lor sospaginas",
        "right-move-rootuserpages": "Tornar nomenar las paginas de l’utilizaire de banca.",
+       "right-move-categorypages": "Renomenar de paginas de categoria",
        "right-movefile": "Desplaçar los fichièrs",
        "right-suppressredirect": "Crear pas de redireccion dempuèi la pagina anciana en renomenant la pagina",
        "right-upload": "Telecargar de fichièrs",
        "right-deletedtext": "Veire lo tèxte suprimit e las diferéncias entre las versions suprimidas",
        "right-browsearchive": "Recercar de paginas suprimidas",
        "right-undelete": "Restablir una pagina",
-       "right-suppressrevision": "Examinar e restablir las revisions amagadas als administrators",
+       "right-suppressrevision": "Afichar, amagar e desamagar de revisions especificas de paginas per quin utilizaire que siá.",
+       "right-viewsuppressed": "Afichar las revisions amagadas per quin utilizaire que siá",
        "right-suppressionlog": "Veire los jornals privats",
        "right-block": "Blocar d'autres utilizaires en escritura",
        "right-blockemail": "Empachar un utilizaire de mandar de corrièrs electronics",
        "action-createpage": "crear de paginas",
        "action-createtalk": "crear de paginas de discussion",
        "action-createaccount": "crear aqueste compte d'utilizaire",
+       "action-history": "afichar l’istoric d'aquesta pagina",
        "action-minoredit": "marcar aqueste cambiament coma menor",
        "action-move": "tornar nomenar aquesta pagina",
        "action-move-subpages": "tornar nomenar aquesta pagina e sas sospaginas",
        "action-move-rootuserpages": "tornar nomenar las paginas de l’utilizaire de banca.",
+       "action-move-categorypages": "Renomenar de paginas de categoria",
        "action-movefile": "tornar nomenar aqueste fichièr",
        "action-upload": "importar aqueste fichièr",
        "action-reupload": "espotir aqueste fichièr existent",
        "recentchanges-label-plusminus": "La talha de la pagina a cambiat d'aqueste nombre d’octets.",
        "recentchanges-legend-heading": "'''Legenda :'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veire tanben la [[Special:NewPages|lista de las paginas novèlas]]).",
-       "rcnotefrom": "Çaijós las modificacions efectuadas dempuèi lo <strong>$2</strong> (fins a <strong>$1</strong> afichats).",
+       "rcnotefrom": "Çaijós {{PLURAL:$5|la modificacion efectuada|las modificacions efectuadas}} dempuèi lo <strong>$3, $4</strong> (afichadas fins a <strong>$1</strong>).",
        "rclistfrom": "Afichar las modificacions novèlas dempuèi lo $3 $2",
        "rcshowhideminor": "$1 los cambiaments menors",
        "rcshowhideminor-show": "Afichar",
        "fileexists-shared-forbidden": "Un fichièr amb lo meteis nom existís ja dins la banca de donadas comuna.\nS'o volètz importar tornamai, tornatz en rèire e importatz-lo jos un autre nom. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Aqueste fichièr es un doble {{PLURAL:$1|del fichièr seguent|dels fichièrs seguents}} :",
        "file-deleted-duplicate": "Un fichièr identic a aqueste ([[:$1]]) ja es estat suprimit. Vos caldriá verificar lo jornal de las supressions d'aqueste fichièr abans de la tornar telecargar.",
+       "file-deleted-duplicate-notitle": "Un fichièr identic a aqueste fichièr es ja estat suprimit amai lo títol. \nVos caldriá demandar a qualqu'un la possibilitat de verificar lo jornal d'aqueste fichièr suprimit per tal d'examinar la situacion  abans de l'importar tornarmai.",
        "uploadwarning": "Atencion !",
        "uploadwarning-text": "Modificatz la descripcion del fichièr e ensajatz tornarmai.",
        "savefile": "Salvar lo fichièr",
        "license": "Licéncia&nbsp;:",
        "license-header": "Publicat jos licéncia(s)",
        "nolicense": "Cap de licéncia seleccionada",
+       "licenses-edit": "Modificar las opcions de licéncia",
        "license-nopreview": "(Previsualizacion impossibla)",
-       "upload_source_url": " (una URL valida e accessibla publicament)",
-       "upload_source_file": " (un fichièr sus vòstre ordenador)",
+       "upload_source_url": "(lo fichièr qu'avètz causit dempuèi una URL valida e accessibla publicament)",
+       "upload_source_file": "(vòstre fichièr causit dempuèi vòstre ordenador)",
+       "listfiles-delete": "suprimir",
        "listfiles-summary": "Aquesta pagina especiala permet de far la lista de totes los fichièrs importats.",
        "listfiles_search_for": "Recèrca del mèdia nomenat :",
        "imgfile": "fichièr",
        "randomincategory": "Pagina a l'azard dins la categoria",
        "randomincategory-invalidcategory": "« $1 » es pas un nom de categoria valid.",
        "randomincategory-nopages": "I a pas cap de pagina dins [[:Category:$1]].",
+       "randomincategory-category": "Categoria :",
+       "randomincategory-legend": "Pagina a l'azard dins la categoria",
        "randomredirect": "Una pagina de redireccion a l'azard",
        "randomredirect-nopages": "I a pas cap de redireccion dins l'espaci de nom « $1 ».",
        "statistics": "Estatisticas",
        "wantedpages-badtitle": "Títol invalid dins los resultats : $1",
        "wantedfiles": "Fichièrs desirats",
        "wantedfiletext-cat": "Los fichièrs seguents son utilizats, mas existisson pas localament. Se se tròban sus un depaus partejat, pòdon èsser listats aicí, mentre que sián, de fach, ja disponibles. Totes aqueles falses positius seràn <del>raiats</del>. Amai, las paginas qu'intègran de fichièrs qu'existisson pas son repertoriadas dins [[:$1]].",
+       "wantedfiletext-cat-noforeign": "Los fichièrs seguents son utilizats mas existisson pas. Amai, las paginas qu'intègran los fichièrs qu'existisson pas son listats dins [[:$1]].",
        "wantedfiletext-nocat": "Los fichièrs seguents son utilizats, mas existisson pas localament. Se se tròban sus un depaus partejat, pòdon èsser listats aicí, mentre que sián, de fach, ja disponibles. Totes aqueles falses positius seràn <del>raiats</del>.",
+       "wantedfiletext-nocat-noforeign": "Los fichièrs seguents son utilizats mas existisson pas.",
        "wantedtemplates": "Modèls demandats",
        "mostlinked": "Paginas mai ligadas",
        "mostlinkedcategories": "Categorias mai utilizadas",
        "mywatchlist": "Lista de seguiment",
        "watchlistfor2": "Per $1 ($2)",
        "nowatchlist": "Vòstra lista de seguiment conten pas cap d'article.",
-       "watchlistanontext": "Per poder afichar o editar los elements de vòstra lista de seguiment, vos cal vos $1.",
+       "watchlistanontext": "Connectatz-vos per visualizar o modificar los elements de vòstra lista de seguiment.",
        "watchnologin": "Vos sètz pas identificat(ada)",
        "addwatch": "Apondre a la lista de seguiment",
        "addedwatchtext": "La pagina « [[:$1]] » es estada aponduda a vòstra [[Special:Watchlist|lista de seguiment]]. Las modificacions venentas d'aquesta pagina e de la pagina de discussion associada i seràn repertoriadas.",
+       "addedwatchtext-short": "La pagina « $1 » es estada aponduda a vòstra lista de seguiment.",
        "removewatch": "Suprimir de la lista de seguiment",
        "removedwatchtext": "La pagina « [[:$1]] » es estada levada de vòstra [[Special:Watchlist|lista de seguiment]].",
+       "removedwatchtext-short": "La pagina « $1 » es estada suprimida de vòstra lista de seguiment.",
        "watch": "Seguir",
        "watchthispage": "Seguir aquesta pagina",
        "unwatch": "Arrestar de seguir",
        "watchlist-details": "I a {{PLURAL:$1|$1 pagina|$1 paginas}} dins vòstra lista de seguiment, sens comptar las paginas de discussion.",
        "wlheader-enotif": "La notificacion per corrièr electronic es activada.",
        "wlheader-showupdated": "Las paginas que son estadas modificadas dempuèi vòstra darrièra visita son afichadas en '''gras'''.",
-       "wlnote": "Çaijós {{PLURAL:$1|se tròba la darrièra modificacion efectuada|se tròban las $1 darrièras modificacions efectuadas}} pendent {{PLURAL:$2|la darrièra ora|las '''$2''' darrièras oras}} dempuèi $3, $4.",
+       "wlnote": "Çaijós {{PLURAL:$1|figura la darrièra modificacion efectuada|figuran las <strong>$1</strong> darrièras modificacions efectuadas}} pendent {{PLURAL:$2|la darrièra ora|las <strong>$2</strong> darrièras oras}}, dempuèi $3, $4.",
        "wlshowlast": "Far veire las darrièras $1 oras, los darrièrs $2 jorns, o $3.",
        "watchlist-options": "Opcions de la lista de seguiment",
        "watching": "Seguit...",
        "exbeforeblank": "lo contengut abans blanquiment èra :'$1'",
        "delete-confirm": "Escafar «$1»",
        "delete-legend": "Escafar",
-       "historywarning": "'''Atencion :''' La pagina que s�tz a mand de suprimir a un istoric que conten aproximadament $1 {{PLURAL:$1|revision|revisions}} :",
+       "historywarning": "<strong>Atencion :</strong> la pagina que sètz a mand de suprimir a un istoric amb $1 {{PLURAL:$1|version|versions}} :",
        "confirmdeletetext": "Sètz a mand de suprimir una pagina o un fichièr, e mai totas sas versions anterioras istorizadas.\nConfirmatz qu'es plan çò que volètz far, que ne comprenètz las consequéncias e que fasètz aquò en acòrdi amb las [[{{MediaWiki:Policy-url}}|règlas intèrnas]].",
        "actioncomplete": "Accion efectuada",
        "actionfailed": "L’accion a fracassat",
        "delete-edit-reasonlist": "Modifica los motius de la supression",
        "delete-toobig": "Aquesta pagina dispausa d'un istoric important, depassant {{PLURAL:$1|revision|revisions}}.\nLa supression de talas paginas es estada limitada per evitar de perturbacions accidentalas de {{SITENAME}}.",
        "delete-warning-toobig": "Aquesta pagina dispausa d'un istoric important, depassant {{PLURAL:$1|revision|revisions}}.\nLa suprimir pòt perturbar lo foncionament de la banca de donada de {{SITENAME}}.\nD'efectuar amb prudéncia.",
+       "deleteprotected": "Podètz pas suprimir aquesta pagina perque es estada protegida.",
        "rollback": "Anullar las modificacions",
        "rollback_short": "Anullar",
        "rollbacklink": "anullar",
        "autoblockid": "Blocatge automatic #$1",
        "block": "Blocar un utilizaire",
        "unblock": "Desblocar un utilizaire",
-       "blockip": "Blocar en escritura",
+       "blockip": "Blocar l’{{GENDER:$1|utilizaire|utilizaira}}",
        "blockip-legend": "Blocar en escritura",
        "blockiptext": "Utilizatz lo formulari çaijós per blocar l'accès a las modificacions a partir d'una adreça IP especifica o d'un nom d'utilizaire.\nUna tala mesura deu pas èsser presa pas que per empachar lo vandalisme e en acòrdi amb las [[{{MediaWiki:Policy-url}}|règlas intèrnas]].\nDonatz çaijós un motiu precís (per exemple en citant las paginas que son estadas vandalizadas).",
        "ipaddressorusername": "Adreça IP o nom d’utilizaire :",
        "ipb-unblock-addr": "Desblocar $1",
        "ipb-unblock": "Desblocar un compte d'utilizaire o una adreça IP",
        "ipb-blocklist": "Vejatz los blocatges existents",
-       "ipb-blocklist-contribs": "Contribucions per $1",
+       "ipb-blocklist-contribs": "Contribucions per {{GENDER:$1|$1}}",
        "unblockip": "Desblocar un utilizaire o una adreça IP",
        "unblockiptext": "Utilizatz lo formulari çaijós per restablir l'accès en escritura\na partir d'una adreça IP precedentament blocada.",
        "ipusubmit": "Suprimir aqueste blocatge",
        "movenotallowedfile": "Avètz pas la permission de desplaçar los fichièrs.",
        "cant-move-user-page": "Avètz pas la permission de tornar nomenar de paginas d'utilizaires raices sus aqueste wiki.",
        "cant-move-to-user-page": "Avètz pas la permission de tornar nomenar una pagina cap a una pagina d'utilizaire (a l'excepcion d'una sospagina).",
+       "cant-move-category-page": "Avètz pas la permission de renomenar las paginas de categorias.",
        "newtitle": "Títol novèl",
        "move-watch": "Seguir aquesta pagina",
        "movepagebtn": "Tornar nomenar l'article",
        "import": "Importar de paginas",
        "importinterwiki": "Impòrt interwiki",
        "import-interwiki-text": "Seleccionatz un wiki e un títol de pagina d'importar.\nLas datas de las versions e los noms dels editors seràn preservats.\nTotas las accions d’importacion interwiki son conservadas dins lo [[Special:Log/import|jornal d’impòrt]].",
+       "import-interwiki-sourcewiki": "Wiki font :",
+       "import-interwiki-sourcepage": "Pagina font :",
        "import-interwiki-history": "Copiar totas las versions de l'istoric d'aquesta pagina",
        "import-interwiki-templates": "Enclure totes los modèls",
        "import-interwiki-submit": "Importar",
        "import-invalid-interwiki": "Impossible d'importar dempuèi lo wiki especificat.",
        "import-error-edit": "La pagina « $1 » es pas estada importada perque sètz pas autorizat a la modificar.",
        "import-error-create": "La pagina « $1 » es pas estada importada perque sètz pas autorizat a la crear.",
-       "import-error-invalid": "Pagina « $1 » es pas importada perque son nom es pas valid.",
+       "import-error-invalid": "Pagina « $1 » es pas importada perque lo nom amb lo qual seriá estada importada es pas valid sus aqueste wiki.",
        "import-options-wrong": "{{PLURAL:$2|Marrida opcion|Marridas opcions}} : <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "La pagina raiç provesida es un títol invalid.",
        "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 (telecargament) [[$1]]",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|version|versions}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revision importada|revisions importadas}}",
        "import-logentry-interwiki": "a importat (transwiki) $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|version|versions}} dempuèi $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision importada|revisions importadas}} dempuèi $2",
        "javascripttest": "Tèst de JavaScript",
        "javascripttest-title": "Execucion dels tèsts $1",
        "javascripttest-pagetext-noframework": "Aquesta pagina es reservada per l'execucion dels tèsts JavaScript.",
        "newimages-summary": "Aquesta pagina especiala aficha los darrièrs fichièrs importats.",
        "newimages-legend": "Filtre",
        "newimages-label": "Nom del fichièr (o una partida d'aqueste) :",
+       "newimages-showbots": "Afichar los impòrts per de robòts",
        "noimages": "Cap d'imatge d'afichar pas.",
        "ilsubmit": "Cercar",
        "bydate": "per data",
        "scarytranscludetoolong": "[L’URL es tròp longa]",
        "deletedwhileediting": "'''Atencion''' : aquesta pagina es estada suprimida aprèp qu'avètz començat de la modificar !",
        "confirmrecreate": "L'utilizaire [[User:$1|$1]] ([[User talk:$1|talk]]) a suprimit aquesta pagina, alara que l'aviatz començat d'editar, pel motiu seguent:\n: ''$2''\nConfirmatz que desiratz tornar crear aqueste article.",
+       "confirmrecreate-noreason": "L'utilizaire [[User:$1|$1]] ([[User talk:$1|Discussion]]) a suprimit aquesta pagina, mentre qu'aviatz començat de la modificar. Confirmatz que desiratz tornar crear aquesta pagina.",
        "recreate": "Tornar crear",
        "confirm_purge_button": "Confirmar",
        "confirm-purge-top": "Volètz refrescar aquesta pagina (purgar l'escondedor) ?",
        "autosumm-replace": "Resumit automatic : contengut remplaçat per « $1 ».",
        "autoredircomment": "Redireccion cap a [[$1]]",
        "autosumm-new": "Creacion de la pagina amb « $1 »",
+       "autosumm-newblank": "Pagina voida creada",
        "size-bytes": "$1 o",
        "size-kilobytes": "$1 Ko",
        "size-megabytes": "$1 Mo",
        "watchlistedit-raw-done": "Vòstra lista de seguiment es estada mesa a jorn.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Una pagina es estada aponduda|$1 paginas son estadas apondudas}} :",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Una pagina es estada levada|$1 paginas son estadas levadas}} :",
+       "watchlistedit-clear-title": "Lista de seguiment voidada",
+       "watchlistedit-clear-legend": "Escafar la lista de seguiment",
+       "watchlistedit-clear-explain": "Totes los títols seràn suprimits de vòstra lista de seguiment",
+       "watchlistedit-clear-titles": "Títols :",
+       "watchlistedit-clear-submit": "Escafar la lista de seguiment (aquò es permanent !)",
+       "watchlistedit-clear-done": "Vòstra lista de seguiment es estada escafada.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Un títol es estat levat|$1 títols son estats levats}} :",
+       "watchlistedit-too-many": "I a tròp de paginas d'afichar aicí.",
+       "watchlisttools-clear": "Escafar la lista de seguiment",
        "watchlisttools-view": "Lista de seguiment",
        "watchlisttools-edit": "Veire e modificar la lista de seguiment",
        "watchlisttools-raw": "Modificar la lista (mòde brut)",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussion]])",
        "unknown_extension_tag": "Balisa d'extension « $1 » desconeguda",
        "duplicate-defaultsort": "Atencion : La clau de triada per defaut « $2 » espotís la mai recenta « $1 ».",
+       "duplicate-displaytitle": "<strong>Atencion :</strong> Lo títol d'afichatge «$2» remplaça l'ancian títol d'afichatge «$1».",
        "version": "Version",
        "version-extensions": "Extensions installadas",
        "version-skins": "Abilhatges installats",
        "version-hook-name": "Nom del croquet",
        "version-hook-subscribedby": "Definit per",
        "version-version": "(Version $1)",
+       "version-no-ext-name": "[sens nom]",
        "version-license": "Licéncia de MediaWiki",
        "version-ext-license": "Licéncia",
        "version-ext-colheader-name": "Extensions",
+       "version-skin-colheader-name": "Aparéncia",
+       "version-ext-colheader-version": "Version",
        "version-ext-colheader-license": "Licéncia",
        "version-ext-colheader-description": "Descripcion",
        "version-ext-colheader-credits": "Autors",
        "htmlform-no": "Non",
        "htmlform-yes": "Òc",
        "htmlform-chosen-placeholder": "Causir una opcion",
+       "htmlform-cloner-create": "Apondre encara",
+       "htmlform-cloner-delete": "Suprimir",
+       "htmlform-cloner-required": "Una valor al mens es obligatòria.",
        "sqlite-has-fts": "$1 amb recèrca en tèxte integral suportada",
        "sqlite-no-fts": "$1 sens recèrca en tèxte integral suportada",
        "logentry-delete-delete": "$1 {{GENDER:$2|a suprimit}} la pagina $3",
        "logentry-rights-rights": "$1 {{GENDER:$2|a modificat}} l'apartenéncia al grop per $3 de $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|a modificat}} l'apartenéncia al grop per $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|es estat promolgut}} automaticament de $4 a $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|a mandat}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|a telecargat}} una novèla version de $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|a telecargat}} $3",
        "rightsnone": "(cap)",
        "feedback-subject": "Subjècte :",
        "feedback-message": "Messatge :",
        "expand_templates_remove_nowiki": "Suprimís los marcadors <nowiki> dins lo resultat",
        "expand_templates_generate_xml": "Veire l'arborescéncia XML",
        "expand_templates_generate_rawhtml": "Afichar lo HTML brut",
-       "expand_templates_preview": "Previsualizacion"
+       "expand_templates_preview": "Previsualizacion",
+       "pagelanguage": "Selector de lenga de la pagina",
+       "pagelang-name": "Pagina",
+       "pagelang-language": "Lenga",
+       "pagelang-use-default": "Utilizar la lenga per defaut",
+       "pagelang-select-lang": "Seleccionar la lenga",
+       "right-pagelang": "Cambiar la lenga de la pagina",
+       "action-pagelang": "cambiar la lenga de la pagina",
+       "log-name-pagelang": "Traçar los cambiaments de lenga",
+       "log-description-pagelang": "Aquò es un jornal dels cambiaments dins las lengas de las paginas.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|a cambiat}} la lenga de la pagina $3 de $4 a $5.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (activat)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desactivat''')"
 }
index b655ba0..99b2f30 100644 (file)
        "userlogin-resetlink": "Zapomniałeś danych do zalogowania się?",
        "userlogin-resetpassword-link": "Nie pamiętasz hasła?",
        "userlogin-helplink2": "Pomoc przy logowaniu",
-       "userlogin-loggedin": "Zalogowano jako {{GENDER:$1|$1}}.\nUżyj poniższego formularza, aby zalogować się jako inny użytkownik.",
-       "userlogin-createanother": "Załóż nowe konto",
        "createacct-emailrequired": "Adres e‐mail",
        "createacct-emailoptional": "Adres e-mail (opcjonalnie)",
        "createacct-email-ph": "Wpisz swój adres e-mail",
index ffad648..4c96849 100644 (file)
        "userlogin-resetlink": "A l'ha dësmentià ij sò detaj për intré ant ël sistema?",
        "userlogin-resetpassword-link": "Ciav dësmentià?",
        "userlogin-helplink2": "Agiut a la conession",
-       "userlogin-loggedin": "A l'é già rintrà an ël sistema tanme {{GENDER:$1|$1}}.\nCh'a deuvra ël formolari sì-sota për rintré coma n'àutr n'utent.",
-       "userlogin-createanother": "Creé n'àutr cont",
        "createacct-emailrequired": "Adrëssa ëd pòsta eletrònica",
        "createacct-emailoptional": "Adrëssa ëd pòsta eletrònica (opsional)",
        "createacct-email-ph": "Ch'a buta soa adrëssa ëd pòsta eletrònica",
        "showpreview": "Mostré na preuva",
        "showdiff": "Smon-me le modìfiche",
        "blankarticle": "<strong>Atension:</strong> La pàgina ch'a l'ha creà a l'é veuida. S'a sgnaca torna «{{int:savearticle}}», la pàgina a sarà creà sensa contnù.",
-       "anoneditwarning": "'''Atension:''' A l'é nen rintrà ant ël sistema. Soa adrëssa IP a sarà registrà ant la stòria dle modìfiche ëd sa pàgina.",
+       "anoneditwarning": "<strong>Atension:<strong> A l'é nen rintrà ant ël sistema. Soa adrëssa IP a së sc-iairërà s'a fà dle modìfiche. Si chiel a <strong>[$1 rintra ant ël sistema]</strong> o <strong>[$2 a crea an cont]</strong>, soe modìfiche a saran atribuìe a sò stranòm, ansema a d'àutri vantagg.",
        "anonpreviewwarning": "''A l'é nen rintrà ant ël sistema. An salvand a sarà memorisà soa adrëssa IP ant la stòria dle modìfiche ëd sa pàgina.''",
        "missingsummary": "'''Nòta:''' a l'ha butà gnun resumé dla modìfica. Se a sgnaca «{{int:savearticle}}» n'àutra vira, soa modìfica a resterà salvà sensa resumé.",
        "missingcommenttext": "Për piasì, che a buta un coment sì-sota.",
        "filedelete-maintenance": "Lë scancelament e la restaurassion d'archivi a l'é al moment disabilità durant la manutension.",
        "filedelete-maintenance-title": "As peul pa scancelesse l'archivi",
        "mimesearch": "Arserca për sòrt MIME",
-       "mimesearch-summary": "Sta pàgina-sì a lassa filtré j'archivi për sòrt MIME. Buté: sòrt/sotasòrt, pr'es. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Sta pàgina-sì a lassa filtré j'archivi për sòrt MIME. Buté: sòrt/sotasòrt o sòrt/*, pr'es. <code>image/jpeg</code>.",
        "mimetype": "Sòrt MIME:",
        "download": "dëscarié",
        "unwatchedpages": "Pàgine che gnun a ten sot-euj",
        "randomincategory": "Pàgina a l'ancàpit ant la categorìa",
        "randomincategory-invalidcategory": "«$1» a l'é pa un nòm ëd categorìa bon.",
        "randomincategory-nopages": "A-i é gnun-e pàgine ant la categorìa [[:Category:$1|$1]].",
+       "randomincategory-category": "Categorìa:",
        "randomredirect": "Na ridiression qualsëssìa",
        "randomredirect-nopages": "A-i é pa gnun-a ridiression ant lë spassi nominal \"$1\".",
        "statistics": "Statìstiche",
index 9af3177..3b1701e 100644 (file)
        "userlogin-resetlink": "Esqueceu-se do seu nome de usuário ou da senha?",
        "userlogin-resetpassword-link": "Esqueceu sua senha?",
        "userlogin-helplink2": "Ajuda com o login",
-       "userlogin-loggedin": "Você já está conectado como {{GENDER:$1|$1}}.\nUse o formulário abaixo para iniciar sessão como outro usuário.",
-       "userlogin-createanother": "Crie uma outra conta",
        "createacct-emailrequired": "Endereço de e-mail",
        "createacct-emailoptional": "Endereço de e-mail (opcional)",
        "createacct-email-ph": "Confirme seu endereço de e-mail",
index 4bce31a..b2174fe 100644 (file)
        "userlogin-resetlink": "Esqueceu-se do seu nome de utilizador ou da palavra-passe?",
        "userlogin-resetpassword-link": "Esqueceu-se da sua palavra-passe?",
        "userlogin-helplink2": "Ajuda para iniciar sessão",
-       "userlogin-loggedin": "Já está {{GENDER:$1|autenticado|autenticada|autenticado}} com o nome $1.\nUse o formulário abaixo para iniciar sessão com outro nome.",
-       "userlogin-createanother": "Criar outra conta",
        "createacct-emailrequired": "Endereço de correio eletrónico",
        "createacct-emailoptional": "Endereço de correio eletrónico (opcional)",
        "createacct-email-ph": "Digite o seu endereço de correio eletrónico",
        "showpreview": "Antever resultado",
        "showdiff": "Mostrar alterações",
        "blankarticle": "<strong>Aviso:</strong> A página que está prestes a criar está em branco.  \nSe clicar \"{{int:savearticle}}\" outra vez, a página será criada sem qualquer conteúdo.",
-       "anoneditwarning": "'''Aviso''': Não iniciou sessão.\nO seu endereço IP será registado no histórico de edições desta página.",
+       "anoneditwarning": "<strong>Aviso</strong>: Não iniciou sessão. O seu endereço IP será registado no histórico de edições desta página. Se <strong>[$1 iniciar sessão]</strong> ou <strong>[$2 criar uma conta]</strong>, as suas edições serão registadas com o seu nome de utilizador(a), bem como usufruir de outros benefícios.",
        "anonpreviewwarning": "''Não iniciou sessão. Ao gravar, registará o seu endereço IP no histórico de edições da página.''",
        "missingsummary": "'''Atenção:''' Não introduziu um resumo da edição.\nSe clicar novamente \"Gravar página\" a sua edição será gravada sem resumo.",
        "missingcommenttext": "Introduza um comentário abaixo, por favor.",
index d75b8cd..29933dc 100644 (file)
        "userlogin-resetpassword-link": "Used as link text in the login form.\n\nThe link points to the local page [[Special:PasswordReset]].\n\nSee example: [[Special:UserLogin]]\n\nuserlogin-resetpassword-link may have to be shorter than the old {{msg-mw|userlogin-resetlink}}.\n{{Identical|Forgot your password}}",
        "helplogin-url": "{{doc-important|Do not translate the namespace name <code>Help</code>.}}\nUsed as name of the page that provides information about logging into the wiki.\n\nUsed as a link target in the message {{msg-mw|Userlogin-helplink}}.",
        "userlogin-helplink2": "Label for a link to login help.\n\nSee example: [[Special:UserLogin]]\n\nSee also:\n* {{msg-mw|Helplogin-url}}",
-       "userlogin-loggedin": "Used as warning on [[Special:UserLogin]] when the current user is already logged in.\n\nFollowed by the Login form.\n\nSee example: [[Special:UserLogin]].\n\nParameters:\n* $1 - user name (used for display and for gender support)",
-       "userlogin-createanother": "Used as label for the button on [[Special:UserLogin]] shown when the current user is already logged in.\n{{Identical|Create another account}}",
        "createacct-emailrequired": "Label in create account form for email field when it is required.\n\nSee also:\n* {{msg-mw|Createacct-emailoptional}}\n{{Identical|E-mail address}}",
        "createacct-emailoptional": "Label in vertical-layout create account form for email field when it is optional.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n\nSee also:\n* {{msg-mw|Createacct-emailrequired}}",
        "createacct-email-ph": "Placeholder in vertical-layout create account form for email field.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
        "showpreview": "The text of the button to preview the page you are editing. See also {{msg-mw|showdiff}} and {{msg-mw|savearticle}} for the other buttons.\n\nSee also:\n* {{msg-mw|Showpreview}}\n* {{msg-mw|Accesskey-preview}}\n* {{msg-mw|Tooltip-preview}}\n{{Identical|Show preview}}",
        "showdiff": "Button below the edit page. See also {{msg-mw|Showpreview}} and {{msg-mw|Savearticle}} for the other buttons.\n\nSee also:\n* {{msg-mw|Showdiff}}\n* {{msg-mw|Accesskey-diff}}\n* {{msg-mw|Tooltip-diff}}\n{{Identical|Show change}}",
        "blankarticle": "Notice displayed once after the user tries to save an empty page.",
-       "anoneditwarning": "Shown when editing a page anonymously.\nSee also:\n* {{msg-mw|Sf autoedit anoneditwarning}}\n* {{msg-mw|Wikibase-anonymouseditwarning-property}}\n* {{msg-mw|Wikibase-anonymouseditwarning-item}}\n* {{msg-mw|Anonpreviewwarning}}",
+       "anoneditwarning": "Shown when editing a page anonymously.\n\nParameters:\n* $1 – A link to log in, <nowiki>{{fullurl:Special:UserLogin|returnto={{FULLPAGENAMEE}}}}</nowiki>\n* $2 – A link to sign up, <nowiki>{{fullurl:Special:UserLogin/signup|returnto={{FULLPAGENAMEE}}}}</nowiki>\n\nSee also:\n* {{msg-mw|Sf autoedit anoneditwarning}}\n* {{msg-mw|Wikibase-anonymouseditwarning-property}}\n* {{msg-mw|Wikibase-anonymouseditwarning-item}}\n* {{msg-mw|Anonpreviewwarning}}",
        "anonpreviewwarning": "See also:\n* {{msg-mw|Anoneditwarning}}",
        "missingsummary": "The text \"edit summary\" is in {{msg-mw|Summary}}.\n\nSee also:\n* {{msg-mw|Missingcommentheader}}\n* {{msg-mw|Savearticle}}",
        "missingcommenttext": "This message is shown, when the textbox by a new-section is empty.",
        "group-bureaucrat": "{{doc-group|bureaucrat}}",
        "group-suppress": "{{doc-group|suppress}}\nThis is an optional (disabled by default) user group, meant for the [[mw:RevisionDelete|RevisionDelete]] feature, to change the visibility of revisions through [[Special:RevisionDelete]].\n\n{{Identical|Oversight}}",
        "group-all": "The name of the user group that contains all users, including anonymous users\n\n{{Identical|All}}",
-       "group-user-member": "{{doc-group|user|member}}",
+       "group-user-member": "{{doc-group|user|member}}\n{{Identical|User}}",
        "group-autoconfirmed-member": "{{doc-group|autoconfirmed|member}}",
        "group-bot-member": "{{doc-group|bot|member}}",
        "group-sysop-member": "{{doc-group|sysop|member}}",
        "group-bureaucrat-member": "{{doc-group|bureaucrat|member}}",
        "group-suppress-member": "{{doc-group|suppress|member}}\nThis is a member of the optional (disabled by default) user group, meant for the [[mw:RevisionDelete|RevisionDelete]] feature, to change the visibility of revisions through [[Special:RevisionDelete]].\n\n{{Identical|Oversight}}",
-       "grouppage-user": "{{doc-group|user|page}}",
+       "grouppage-user": "{{doc-group|user|page}}\n{{Identical|User}}",
        "grouppage-autoconfirmed": "{{doc-group|autoconfirmed|page}}",
        "grouppage-bot": "{{doc-group|bot|page}}\n{{Identical|Bot}}",
        "grouppage-sysop": "{{doc-group|sysop|page}}",
        "lockfilenotwritable": "'No longer needed' on wikipedia.",
        "databasenotlocked": "Used as error message in [[Special:UnlockDB]].\nThe title of this error message is {{msg-mw|Lockdb}}.\n\nSee also:\n* {{msg-mw|Lockdb|title}}\n* {{msg-mw|Databasenotlocked|message}}",
        "lockedbyandtime": "Used as part of the message when a database is locked through [[Special:LockDB]]. Parameters:\n* $1 is the user that locked the database.\n* $2 is the date on which the lock was made\n* $3 is the time at which the lock was made",
-       "move-page": "Used as page title of [[Special:MovePage]] to move pages.\n\nSee example: [[Special:MovePage/Portal:En]].\n\nParameters:\n* $1 - the name of the page to be moved (without link)",
+       "move-page": "Used as page title of [[Special:MovePage]] to move pages.\n\nSee example: [[Special:MovePage/Portal:En]].\n\nParameters:\n* $1 - the name of the page to be moved (without link)\n{{Identical|Move}}",
        "movepage-summary": "{{doc-specialpagesummary|movepage}}",
        "move-page-legend": "Legend of the fieldset around the input form of [[Special:MovePage/testpage]].\n\nSee also:\n* {{msg-mw|movearticle|label for old title}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|movereason|label for textarea}}\n* {{msg-mw|movetalk|label for checkbox}}\n* {{msg-mw|move-leave-redirect|label for checkbox}}\n* {{msg-mw|fix-double-redirects|label for checkbox}}\n* {{msg-mw|move-subpages|label for checkbox}}\n* {{msg-mw|move-talk-subpages|label for checkbox}}\n* {{msg-mw|move-watch|label for checkbox}}\n{{Identical|Move page}}",
        "movepagetext": "Introduction shown when moving a page ([[Special:MovePage]]).\n\nSpecial pages mentioned: {{msg-mw|Doubleredirects}}, {{msg-mw|Brokenredirects}}\n\nSee also:\n* {{msg-mw|Movepagetext-noredirectfixer}}",
index 65c753c..4217e27 100644 (file)
        "gotaccountlink": "T'annunziar",
        "userlogin-resetlink": "Emblidà tias datas per s'annunziar?",
        "userlogin-resetpassword-link": "Has emblidà tes pled-clav?",
-       "userlogin-loggedin": "Ti es gia t'annunzià sco {{GENDER:$1|$1}}.\nDovra il suandant formular per t'annunziar cun in auter conto.",
-       "userlogin-createanother": "Crear in auter conto",
        "createacct-emailrequired": "Adressa dad e-mail",
        "createacct-emailoptional": "Adressa dad e-mail (opziunal)",
        "createacct-email-ph": "Endatescha ti'adressa dad e-mail",
index ec60308..619779d 100644 (file)
        "userlogin-resetlink": "Ați uitat datele de autentificare?",
        "userlogin-resetpassword-link": "V-ați uitat parola?",
        "userlogin-helplink2": "Ajutor la autentificare",
-       "userlogin-loggedin": "Sunteți deja {{GENDER:$1|autentificat|autentificată}} ca {{GENDER:$1|$1}}.\nUtilizați formularul de mai jos pentru a vă autentifica cu alt nume de utilizator.",
-       "userlogin-createanother": "Creează un alt cont",
        "createacct-emailrequired": "Adresă de e-mail",
        "createacct-emailoptional": "Adresă de e-mail (opțională)",
        "createacct-email-ph": "Introduceți adresa dumnevoastră de e-mail",
        "showpreview": "Previzualizare",
        "showdiff": "Afișare diferențe",
        "blankarticle": "<strong>Atenție:</strong> Pagina pe care o creați este goală.\nDacă faceți din nou clic pe „{{int:savearticle}}”, pagina va fi creată fără niciun conținut.",
-       "anoneditwarning": "'''Atenție:''' Nu v-ați autentificat. Adresa IP vă va fi înregistrată în istoricul acestei pagini.",
+       "anoneditwarning": "<strong>Atenție:</strong> Nu v-ați autentificat. Adresa dumneavoastră IP va fi vizibilă în mod public dacă efectuați modificări. Dacă vă <strong>[$1 autentificați]</strong> sau vă <strong>[$2 creați un cont]</strong>, modificările dumneavoastră vor fi asociate numelui de utilizator, pe lângă alte beneficii.",
        "anonpreviewwarning": "''Nu v-ați autentificat. Dacă salvați pagina adresa dumneavoastră IP va fi înregistrată în istoric.''",
        "missingsummary": "'''Atenție:''' Nu ați completat caseta „descriere modificări”. Dacă apăsați din nou butonul „salvează pagina” modificările vor fi salvate fără descriere.",
        "missingcommenttext": "Vă rugăm să introduceți un comentariu.",
index 40b9db1..edbf068 100644 (file)
        "userlogin-resetlink": "Забыли данные для входа?",
        "userlogin-resetpassword-link": "Сбросить ваш пароль?",
        "userlogin-helplink2": "Помощь по входу",
-       "userlogin-loggedin": "Вы уже вошли как {{GENDER:$1|$1}}.\nИспользуйте форму ниже, чтобы войти под другой учётной записью.",
-       "userlogin-createanother": "Создать другую учётную запись",
        "createacct-emailrequired": "Адрес электронной почты",
        "createacct-emailoptional": "Адрес электронной почты (необязательно)",
        "createacct-email-ph": "Введите свой адрес электронной почты",
        "showpreview": "Предварительный просмотр",
        "showdiff": "Внесённые изменения",
        "blankarticle": "<strong>Предупреждение:</strong> Страница, которую вы создаёте, пуста.\nЕсли снова нажмёте кнопку «{{int:savearticle}}», страница будет создана без какого-либо содержания.",
-       "anoneditwarning": "'''Внимание!''' Вы не авторизовались на сайте.\nВ истории изменений этой страницы будет записан ваш IP-адрес.",
+       "anoneditwarning": "<strong>Внимание!</strong> Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы <strong>[$1 войдёте]</strong> или <strong>[$2 создадите учётную запись]</strong>, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.",
        "anonpreviewwarning": "''Вы не представились системе. Сохранение приведёт к записи вашего IP-адреса в историю изменений страницы.''",
        "missingsummary": "'''Напоминание.''' Вы не дали краткого описания изменений. При повторном нажатии на кнопку «{{int:savearticle}}», ваши изменения будут сохранены без комментария.",
        "missingcommenttext": "Пожалуйста, введите ниже ваше сообщение.",
        "pageinfo-hidden-categories": "{{PLURAL:$1|1=Скрытая категория|Скрытых категорий}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|1=Шаблон|Шаблонов}} ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|1=Включаемая страница|Включаемых страниц}} ($1)",
-       "pageinfo-toolboxlink": "Сведения о странице",
+       "pageinfo-toolboxlink": "Сведения о странице",
        "pageinfo-redirectsto": "Перенаправление",
        "pageinfo-redirectsto-info": "сведения",
        "pageinfo-contentpage": "Учитывается счётчиком как содержательная страница",
index f643b26..63186ce 100644 (file)
        "userlogin-resetlink": "Киирэр тылгын умнубуккун дуо?",
        "userlogin-resetpassword-link": "Киирии тылгын санаттараҕын дуо?",
        "userlogin-helplink2": "Киирэргэ көмө",
-       "userlogin-loggedin": "Маннык аатынан киирбиккин {{GENDER:$1|$1}}.\nАтын аатынан киирэргэ аллара көстөр форманы туһан.",
-       "userlogin-createanother": "Атын аатынан бэлиэтэн",
        "createacct-emailrequired": "Email аадырыс",
        "createacct-emailoptional": "Email аадырыс (булгуччута суох)",
        "createacct-email-ph": "Эл аадырыскын суруй",
index 61ae8f9..48d5297 100644 (file)
@@ -26,6 +26,7 @@
        "tog-watchdefault": "Agiunghe pàginas e documentos chi apo cambiadu in sa watchlist mea",
        "tog-watchmoves": "Agiunghe pàginas e documentos chi apo mòvidu in sa watchlist mea",
        "tog-watchdeletion": "Agiunghe pàginas e documentos chi apo fuliadu in sa watchlist mea",
+       "tog-watchrollback": "Pone is pàginas innue apo fatu su rollback in is pàginas annotadas",
        "tog-minordefault": "Marca comente minores pro difetu totu sos càmbios",
        "tog-previewontop": "Ammustra s'anteprima in subra de sa casella de càmbiu e no in suta",
        "tog-previewonfirst": "Ammustra s'anteprima pro sa prima muda",
@@ -45,7 +46,9 @@
        "tog-watchlisthideanons": "Cua sos càmbios de sos utentes anònimos dae sa watchlist",
        "tog-watchlisthidepatrolled": "Cua mudas verificadas dae sa watchlist",
        "tog-ccmeonemails": "Imbia·mi sas còpias de sas post.els chi imbio a sos àteros utentes",
+       "tog-diffonly": "No ammustras su cuntènnidu de sa pàgina a pustis de sa bisura de is diferèntzias",
        "tog-showhiddencats": "Ammustra sas categorias cuadas",
+       "tog-norollbackdiff": "Cua sa bisura de is diferèntzias a pustis de su rollback",
        "tog-useeditwarning": "Amonestamì si lassu una pagina cun mudantzias chena de sarvai.",
        "tog-prefershttps": "Imprea semper una lìnia segura candu fatzo s'intrada.",
        "underline-always": "Semper",
        "category_header": "Pàginas in sa categoria \"$1\"",
        "subcategories": "Subcategorias",
        "category-media-header": "Mèdios in sa categoria \"$1\"",
-       "category-empty": "''In custa categoria non b't peruna pàgina o mèdiu.''",
+       "category-empty": "''In custa categoria non b'at peruna pàgina o mèdiu.''",
        "hidden-categories": "{{PLURAL:$1|Categoria cuada|Categorias cuadas}}",
        "hidden-category-category": "Categorias cuadas",
        "category-subcat-count": "{{PLURAL:$2|Custa categoria cuntenet un'ùnica subcategoria ammustrada in suta.|Custa categoria cuntenet {{PLURAL:$1|sa subcategoria inditada|$1 subcategorias inditadas}} in suta, de $2 totales.}}",
        "youhavenewmessages": "Tenes $1 ($2).",
        "youhavenewmessagesmanyusers": "Tenes $1 dae utentes ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|unu messàggiu nou|999=messàggios noos}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|ùrtima muda|999=ùrtimas mudàntzias}}",
        "youhavenewmessagesmulti": "Tenes messàgios noos in $1",
        "editsection": "càmbia",
        "editold": "càmbia",
        "hidetoc": "cua",
        "collapsible-collapse": "Serra e istringhe",
        "collapsible-expand": "Aberi",
+       "confirmable-confirm": "Ses {{GENDER:$1|seguru|segura}}?",
        "confirmable-yes": "Eja",
        "confirmable-no": "No",
        "thisisdeleted": "Càstiare o recuperare $1?",
        "formerror": "Errore: impossìbile imbiare su modellu",
        "badarticleerror": "Operatzione non cunsentida pro custa pàgina.",
        "cannotdelete": "No est stadu possìbile burrare sa pàgina o su file \"$1\".\nPodet èsser stadu burradu dae calicunu àteru.",
+       "cannotdelete-title": "Impossìbile burrare sa pàgina \"$1\"",
        "badtitle": "Tìtulu malu",
        "badtitletext": "Su tìtulu de sa pàgina ch'as pediu est bùidu, isballiau, o iscritu in is cullegamentus inter-wiki in manera non currègia o cun caràteres no amìtius.",
        "viewsource": "Càstia mitza",
        "viewsource-title": "Càstia sa mitza de $1",
        "actionthrottled": "Atzione rimandada",
+       "viewsourcetext": "Podes bìere o copiare su còdighe mitza de custa pàgina:",
        "namespaceprotected": "Non tenes su permissu de cambiare is pàginas in su nùmene-lugu '''$1'''.",
+       "customcssprotected": "Non tenes sos permissos pro cambiare custa pàgina CSS proite cuntènnidi sas impostaduras pessonales de un'àteru impitadore.",
+       "customjsprotected": "Non tenes sos permissos pro cambiare custa pàgina JavaScript proite cuntènnidi sas impostaduras pessonales de un'àteru impitadore.",
+       "mycustomcssprotected": "Non tenes sos permissos pro cambiare custa pàgina CSS.",
+       "mycustomjsprotected": "Non tenes sos permissos pro cambiare custa pàgina JavaScript.",
        "ns-specialprotected": "Is pàginas ispetziales non podent èssere acontzadas.",
+       "titleprotected": "Sa creatzione de una pàgina cun custu tìtulu est istada arreada dae [[User:$1|$1]].\nSa motivatzione est \"<em>$2</em>\".",
        "exception-nologin": "Non ses intrau",
+       "exception-nologin-text": "Pro atzèdere a custa pàgina o atzione est netzessàriu a ti identificare.",
        "virus-scanfailed": "scansione faddida (còdixe $1)",
        "virus-unknownscanner": "antivirus disconnotu:",
        "logouttext": "<strong>As acabadu sa sessione.</strong>\n\nTene contu ca is pàginas ki sunt giai abertas in àteras bentanas podent sighire a pàrrer comente cando fias identificadu, fintzas a cando non ddas renfriscas dae su browser tuo.",
        "welcomeuser": "Benénnidu, $1!",
        "welcomecreation-msg": "Su contu tuo est istadu creadu.\nSi boles podes cambiare is [[Special:Preferences|prefèntzias tuas]] pro {{SITENAME}}",
-       "yourname": "Nùmene usuàriu",
-       "userlogin-yourname": "Nùmene usuàriu",
-       "userlogin-yourname-ph": "Inserta su nùmene usuàriu tuo",
-       "createacct-another-username-ph": "Inserta su nùmene usuàriu:",
+       "yourname": "Nùmene impitadore:",
+       "userlogin-yourname": "Nùmene impitadore",
+       "userlogin-yourname-ph": "Inserta su nùmene impitadore tuo",
+       "createacct-another-username-ph": "Inserta su nùmene impitadore:",
        "yourpassword": "Password:",
        "userlogin-yourpassword": "Password",
        "userlogin-yourpassword-ph": "Inserta sa password tua",
        "createacct-yourpasswordagain": "Cunfirma sa password",
        "createacct-yourpasswordagain-ph": "Inserta sa password torra",
        "remembermypassword": "Ammenta sa paràula de òrdine in custu carculadore (pro unu màssimu de $1 {{PLURAL:$1|die|dies}})",
+       "userlogin-remembermypassword": "Mantènnemi cullegadu",
+       "userlogin-signwithsecure": "Imprea una cunnessione segura",
        "yourdomainname": "Ispetzìfica su domìniu",
+       "password-change-forbidden": "Non podes cambiare sa password in custa wiki.",
        "login": "Intra",
        "nav-login-createaccount": "Intra / crea contu",
        "userlogin": "Intra / crea contu",
        "createaccount": "Crea contu",
        "gotaccount": "Tenes giai unu contu? $1.",
        "gotaccountlink": "Identìfica·ti",
-       "userlogin-createanother": "Crea un àteru contu",
+       "userlogin-resetpassword-link": "As ismentigadu sa password?",
+       "userlogin-helplink2": "Agiudu pro s'atzessu",
        "createacct-emailrequired": "Indirutzu Email",
        "createacct-emailoptional": "Indiritzu email (optzionale)",
        "createacct-email-ph": "Inserta s'indiritzu email tuo",
        "createacct-benefit-body1": "{{PLURAL:$1|acontzu|acontzos}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pàgina|pàginas}}",
        "badretype": "Is passwords chi as insertadu non currispondent.",
-       "userexists": "Su nùmene usuàriu insertadu est giai impreadu.\nSèbera unu nùmene diferente.",
+       "userexists": "Su nùmene impitadore insertadu est giai impreadu.\nSèbera unu nùmene diferente.",
        "loginerror": "Faddina de identificatzione",
        "createacct-error": "Faddina in sa creatzione de su contu",
-       "noname": "Su nùmene usuàriu insertadu no est vàlidu.",
+       "createaccounterror": "Impossìbile creare su contu: $1",
+       "nocookiesnew": "Su contu de s'impitadore est istadu creadu, ma no est istadu possìbile fàghere s'atzessu a {{SITENAME}} proite sos \"cookies\" sunt deativados.\nTorra a proare a pustis de los àere ativados.",
+       "noname": "Su nùmene impitadore insertadu no est vàlidu.",
        "loginsuccesstitle": "Ti ses identificadu",
-       "loginsuccess": "'''Immoe ses intradu in {{SITENAME}} cun su nùmene usuàriu \"$1\".'''",
-       "nosuchuser": "Non b'at usuàriu cun su nùmene \"$1\".\nIs nùmenes usuàriu sunt sensìbiles a is lìteras mannas.\nVerìfica su nùmene insertadu o [[Special:UserLogin/signup|crea unu contu nou]].",
-       "nouserspecified": "Deves ispetzificare unu nùmene usuàriu.",
+       "loginsuccess": "'''Immoe ses intradu in {{SITENAME}} cun su nùmene impitadore \"$1\".'''",
+       "nosuchuser": "Non b'at impitadore cun su nùmene \"$1\".\nIs nùmenes impitadore sunt sensìbiles a is lìteras mannas.\nVerìfica su nùmene insertadu o [[Special:UserLogin/signup|crea unu contu nou]].",
+       "nouserspecified": "Depes ispetzificare unu nùmene impitadore.",
+       "login-userblocked": "{{GENDER:$1|Custu impitadore est arreadu|Custa impidadora est arreada}}. Atzessu impossìbile.",
        "wrongpassword": "Sa paràula de òrdine insertada no est bona. Prova torra.",
        "wrongpasswordempty": "No as iscritu sa paràula de òrdine.\nProva torra.",
        "passwordtooshort": "Is passwords depent tènner a su mancu {{PLURAL:$1|1 caràtere|$1 caràteres}}.",
-       "password-name-match": "Sa password tua depet èsser diferente dae su nùmene usuàriu tuo.",
+       "password-name-match": "Sa password tua depet èsser diferente dae su nùmene impitadore tuo.",
+       "password-login-forbidden": "S'impreau de custu nùmene impitadore e de custa password est istadu proibidu.",
        "mailmypassword": "Resetta sa password",
        "passwordremindertitle": "Servìtziu Password Reminder de {{SITENAME}}",
-       "passwordremindertext": "Calicunu (probabilmenti tue, cun s'indiritzu IP $1) at pediu de arritziri una password noa pro intrare a {{SITENAME}} ($4).\nUna password temporanea pro s'usuàriu \"$2\" est istada impostada a \"$3\".\nChi custu fiat ne is intentziones tuas, depis intrare (log in) e scioberari una password noa.\nSa password temporanea tua at a iscadiri in {{PLURAL:$5|una die|$5 dies}}.\n\nChi non ses istadu a pediri sa password, o chi as torrau a agatare sa password torra e non da depis cambiari prus, non cunsideras custu messagiu e sighi a impreare sa password beccia.",
-       "noemail": "Peruna e-mail resurtat registrada pro s'usuàriu \"$1\".",
-       "passwordsent": "Una password noa est stada mandada a s'indiritzu e-mail de s'usuàriu \"$1\".\nPro praxere, cando dda retzis identìfica·ti torra.",
+       "passwordremindertext": "Calicunu (probabilmenti tue, cun s'indiritzu IP $1) at pediu de arritziri una password noa pro intrare a {{SITENAME}} ($4).\nUna password temporanea pro s'impitadore \"$2\" est istada impostada a \"$3\".\nChi custu fiat ne is intentziones tuas, depis intrare (log in) e scioberari una password noa.\nSa password temporanea tua at a iscadiri in {{PLURAL:$5|una die|$5 dies}}.\n\nChi non ses istadu a pediri sa password, o chi as torrau a agatare sa password torra e non da depis cambiari prus, non cunsideras custu messagiu e sighi a impreare sa password beccia.",
+       "noemail": "Peruna email resurtat registrada pro s'impitadore \"$1\".",
+       "passwordsent": "Una password noa est stada mandada a s'indiritzu email de s'impitadore \"$1\".\nPro praxere, cando dda retzis identìfica·ti torra.",
        "mailerror": "Faddina imbiende su messàgiu: $1",
        "emailauthenticated": "S'indiritzu e-mail tuo est istadu autenticau su $2 a is $3.",
        "emailconfirmlink": "Cunfirma s'indiritzu e-mail tuo",
        "accountcreated": "Contu creadu",
-       "accountcreatedtext": "Su contu de s'usuàriu [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) est stadu creadu.",
+       "accountcreatedtext": "Su contu de s'impitadore [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) est stadu creadu.",
        "createaccount-title": "Creatzione de unu contu pro {{SITENAME}}",
        "loginlanguagelabel": "Limba: $1",
        "createacct-another-realname-tip": "Su nomini beru pois fai de mancu de ddu ponni.\nSi sceberas de du ponni, at a essi imperau po arreconnosci a tui su traballu tuu.",
        "resetpass-temp-password": "Password temporànea:",
        "passwordreset": "Reseta sa password",
        "passwordreset-legend": "Reseta sa password",
-       "passwordreset-username": "Nùmene usuàriu",
+       "passwordreset-username": "Nùmene impitadore:",
        "passwordreset-domain": "Domìniu:",
        "passwordreset-email": "Indiritzu email:",
-       "passwordreset-emailtitle": "Particulares de s'usuàriu in {{SITENAME}}",
+       "passwordreset-emailtitle": "Particulares de s'impitadore in {{SITENAME}}",
        "changeemail": "Càmbia indiritzu email",
        "changeemail-header": "Càmbia s'indirìtzu email de su contu",
        "changeemail-oldemail": "Indiritzu email atuale:",
        "watchthis": "Pone custa pàgina in sa watchlist mea",
        "savearticle": "Sarva sa pàgina",
        "preview": "Antiprima",
-       "showpreview": "Amosta s'antiprima",
-       "showdiff": "Amosta is càmbios",
-       "anoneditwarning": "'''Dae cara:''' Non ses identificadu (log in).\nS'indiritzu IP tuo at a èssere registradu in s'istòria de custa pàgina.",
+       "showpreview": "Ammustra s'antiprima",
+       "showdiff": "Ammustra is càmbios",
+       "anoneditwarning": "<strong>Dae cara:</strong> Non ses identificadu.\nS'indiritzu IP tuo at a èssere annòtidu si faghes unos cantos càmbios. Si <strong>idendificas</strong> tibe o <strong>[$2 creas unu contu]</strong>, is càmbios tuos ant a esser marcados cun su nùmene impitadore tuo, paris a àteros giuamentos.",
        "anonpreviewwarning": "''Non ses identificadu. Sarvende s'indiritzu IP tuo at a èssere registradu in s'istòria de sa pàgina.''",
        "missingcommenttext": "Inserta unu cummentu inoghe suta.",
        "summary-preview": "Antiprima ogetu:",
        "subject-preview": "Antiprima tema/tìtulu:",
-       "blockedtitle": "S'usuàriu est istadu bloccadu",
-       "blockedtext": "'''Custu nùmene usuàriu o indiritzu IP est stadu bloccadu.'''\n\nSu bloccu est stadu postu dae $1. Su motivu de su bloccu est: ''$2''\n\n* Su bloccu incumentzat: $8\n* Su bloccu scadit: $6\n* Intervallu de bloccu: $7\n\nSi boles, podes tzerriare $1 o un'àteru [[{{MediaWiki:Grouppage-sysop}}|amministradore]] pro faeddare de su bloccu.\n\nNota ca sa funtzione 'Ispedi un'e-mail a custu usuàriu' no est ativa ki no est stadu registradu un'indiritzu e-mail vàlidu in is [[Special:Preferences|preferèntzias]] tuas o ki s'usu de custa funtzione est stadu bloccadu.\n\nS'indiritzu IP atuale est $3, su nùmeru ID de su bloccu est #$5.\nPro praxere spetzìfica totu is particulares in antis in carche siat pregunta de acrarimentu.",
+       "blockedtitle": "S'impitadore est istadu bloccadu",
+       "blockedtext": "<strong>Custu nùmene impitadore o indiritzu IP est stadu bloccadu.</strong>\n\nSu bloccu est stadu postu dae $1.\nSu motivu de su bloccu est: <em>$2</em>.\n\n* Su bloccu incumentzat: $8\n* Su bloccu scadit: $6\n* Intervallu de bloccu: $7\n\nSi boles, podes tzerriare $1 o un'àteru [[{{MediaWiki:Grouppage-sysop}}|amministradore]] pro faeddare de su bloccu.\nNota ca sa funtzione 'Ispedi un'email a custu impitadore' no est ativa ki no est stadu registradu un'indiritzu email vàlidu in is [[Special:Preferences|preferèntzias]] tuas o ki s'usu de custa funtzione est stadu bloccadu.\nS'indiritzu IP atuale est $3, su nùmeru ID de su bloccu est #$5.\nPro praxere spetzìfica totu is particulares in antis in carche siat pregunta de acrarimentu.",
        "blockednoreason": "perunu motivu inditadu",
        "loginreqtitle": "Identificatzione rechesta",
        "loginreqlink": "identìfica·ti",
        "accmailtitle": "Password ispedida.",
        "newarticle": "(Nou)",
        "newarticletext": "Custa pàgina no esistit galu.\nPro creare sa pàgina, scrie in su box inoghe in bàsciu (abbàida sa [$1 pàgina de agiudu] pro àteras informatziones).\nSi ses intradu inoghe pro sbàlliu, carca in su browser tuo su butone '''back/indietro'''.",
-       "anontalkpagetext": "----''Custa est sa pàgina de cuntierra de unu usuàriu anònimu ki no at creadu unu account galu, o ki non dd'usat. Pro custu impreamus su nùmeru de indiritzos IP pro ddu identificare. Is indiritzos IP podent però èsser cundivìdidos dae unos cantos usuàrios. Si ses unu usuàriu anònimu e ritenes ki custos cummentos non sunt diretos a tue, pro praxere [[Special:UserLogin/signup|crea unu contu]] o [[Special:UserLogin|identifica·ti (log in)]] pro evitare cunfusione cun àteros usuàrios anònimos.''",
+       "anontalkpagetext": "----\n<em>Custa est sa pàgina de cuntierra de unu impitadore anònimu ki no at creadu unu contu galu, o ki non dd'usat.</em>\nPro custu impreamus su nùmeru de indiritzos IP pro ddu identificare. Is indiritzos IP podent perou èsser cundivìdidos dae unos cantos impitadores. Si ses unu impitadore anònimu e ritenes ki custos cummentos non sunt diretos a tue, pro praxere [[Special:UserLogin/signup|crea unu contu]] o [[Special:UserLogin|identifica·ti (log in)]] pro evitare cunfusione cun àteros impitadore anònimos.''",
        "noarticletext": "In custu momentu sa pàgina est bùida.\nPodes [[Special:Search/{{PAGENAME}}|chircare custu tìtulu]] in àteras pàginas, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} chircare in is registros ligados] oppuru [{{fullurl:{{FULLPAGENAME}}|action=edit}} cambiare sa pàgina como]</span>.",
-       "userpage-userdoesnotexist": "Su contu de s'usuàriu \"<nowiki>$1</nowiki>\" no est stadu registradu.\nPro praxere abbàida si boles a sèriu creare/cambiare custa pàgina.",
-       "userpage-userdoesnotexist-view": "Su contu de s'usuàriu \"$1\" no est stadu registradu.",
+       "userpage-userdoesnotexist": "Su contu de s'impitadore \"<nowiki>$1</nowiki>\" no est stadu registradu.\nPro praxere abbàida si boles a sèriu creare/cambiare custa pàgina.",
+       "userpage-userdoesnotexist-view": "Su contu de s'impitadore \"$1\" no est stadu registradu.",
        "updated": "(Atualizadu)",
        "note": "'''Nota:'''",
        "previewnote": "<strong>Regorda·ti ca custa est feti una ANTIPRIMA.</strong>\nIs mudàntzias tuas non sunt galu sarbadas!",
        "histlast": "ùrtima",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "historyempty": "(bùida)",
+       "history-feed-title": "Istòria de is revisiones",
+       "history-feed-description": "Istòria de is revisiones de sa pàgina in custa wiki",
        "history-feed-item-nocomment": "$1 su $2",
+       "rev-deleted-user": "(nùmene impitadore bogadu)",
        "rev-delundel": "ammustra/cua",
        "rev-showdeleted": "ammustra",
        "revdelete-no-file": "Su documentu ispetzuficadu no esistit",
        "revdelete-show-file-submit": "Eja",
        "revdelete-radio-set": "Cua",
+       "revdelete-radio-unset": "Ammustra",
        "revdelete-log": "Motivu:",
        "revdel-restore": "Muda sa visibilidade",
        "pagehist": "Istòria de sa pàgina",
        "timezoneregion-antarctica": "Antàrtide",
        "timezoneregion-arctic": "Àrtide",
        "timezoneregion-asia": "Àsia",
+       "timezoneregion-atlantic": "Otzèanu Atlànticu",
        "timezoneregion-australia": "Austràlia",
        "timezoneregion-europe": "Europa",
+       "timezoneregion-indian": "Otzèanu Indianu",
+       "timezoneregion-pacific": "Otzèanu Patzìficu",
        "prefs-searchoptions": "Chirca",
        "prefs-namespaces": "Nùmene-logos",
        "prefs-files": "Files",
+       "prefs-emailconfirm-label": "Cunfirma de sa email:",
        "youremail": "E-mail:",
-       "username": "{{GENDER:$1|Nùmene usuàriu}}:Nùmene usuàriu",
+       "username": "{{GENDER:$1|Nùmene impitadore}}:Nùmene impitadore",
        "prefs-registration": "Ora de registratzione:",
        "yourrealname": "Nùmene beru:",
        "yourlanguage": "Limba:",
        "yournick": "Sa firma tua:",
-       "yourgender": "Natura:",
-       "gender-unknown": "Non spetzificadu",
-       "gender-male": "Mascu",
-       "gender-female": "Fèmina",
+       "yourgender": "Comente preferes a ti descrir?",
+       "gender-unknown": "Preferu a no ddu narrer",
+       "gender-male": "Issu càmbiat pàginas wiki",
+       "gender-female": "Issa càmbiat pàginas wiki",
        "email": "E-mail",
        "prefs-info": "Informatzione bàsica",
        "prefs-signature": "Firma",
        "prefs-advancedwatchlist": "Sèberos avantzados",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Diferèntzias",
-       "userrights-user-editname": "Inserta unu nùmene usuàriu:",
-       "editinguser": "Cambiamentu de is deretos usuàriu de s'usuàriu <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-user-editname": "Inserta unu nùmene impitadore:",
+       "editinguser": "Cambiamentu de is deretos impitadore de s'impitadore <strong>[[User:$1|$1]]</strong> $2",
        "userrights-reason": "Motivu:",
        "userrights-irreversible-marker": "$1*",
        "group": "Grupu:",
        "group-sysop": "Amministradores",
        "group-bureaucrat": "Buròcrates",
        "group-all": "(totus)",
-       "group-user-member": "{{GENDER:$1|usuàriu}}",
+       "group-user-member": "{{GENDER:$1|impitadore}}",
        "group-autoconfirmed-member": "{{GENDER:$1|usuàrios autocunfirmados}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|aministradore}}",
        "recentchanges": "Ùrtimas mudàntzias",
        "recentchanges-legend": "Possibilidades subra ùrtimas mudàntzias",
        "recentchanges-summary": "Sighi is ùrtimas mudàntzias a sa wiki in custa pàgina.",
-       "recentchanges-feed-description": "Custu feed riportada is ùrtimas mudàntzias a is cuntènnidos de su giassu.",
+       "recentchanges-feed-description": "Sighi is ùrtimas mudàntzias a sa wiki cun custu feed.",
        "recentchanges-label-newpage": "Custu acontzu at creadu una pàgina noa",
        "recentchanges-label-minor": "Custu est unu acontzu minore",
        "recentchanges-label-bot": "Custu acontzu est stadu fatu dae unu bot",
        "rcnotefrom": "{{PLURAL:$5|Sa chi sighit est sa mudàntzia|Sas chi sighint sunt sas mudàntzias}} dae <strong>$3, $4</strong> (amostadas fintzas a <strong>$1</strong>).",
        "rclistfrom": "Ammustra mudàntzias dae $3 $2",
        "rcshowhideminor": "$1 acontzos minores",
-       "rcshowhideminor-show": "Amosta",
+       "rcshowhideminor-show": "Ammustra",
        "rcshowhideminor-hide": "Cua",
        "rcshowhidebots": "$1 bots",
-       "rcshowhidebots-show": "Amosta",
+       "rcshowhidebots-show": "Ammustra",
        "rcshowhidebots-hide": "Cua",
        "rcshowhideliu": "$1 usuàrios registrados",
-       "rcshowhideliu-show": "Amosta",
+       "rcshowhideliu-show": "Ammustra",
        "rcshowhideliu-hide": "Cua",
        "rcshowhideanons": "$1 usuàrios anònimos",
-       "rcshowhideanons-show": "Amosta",
+       "rcshowhideanons-show": "Ammustra",
        "rcshowhideanons-hide": "Cua",
-       "rcshowhidepatr-show": "Amosta",
+       "rcshowhidepatr-show": "Ammustra",
        "rcshowhidepatr-hide": "Cua",
        "rcshowhidemine": "$1 acontzos meos",
-       "rcshowhidemine-show": "Amosta",
+       "rcshowhidemine-show": "Ammustra",
        "rcshowhidemine-hide": "Cua",
        "rclinks": "Ammustra is ùrtimas $1 mudàntzias fatas in is ùrtimas $2 dies<br />$3",
        "diff": "dif",
        "rc_categories_any": "Calesisiat",
        "rc-change-size": "$1",
        "newsectionsummary": "/* $1 */ setzione noa",
-       "rc-enhanced-expand": "Amosta particulares",
+       "rc-enhanced-expand": "Ammustra particulares",
        "rc-enhanced-hide": "Cua particulares",
        "recentchangeslinked": "Mudàntzias ligadas",
        "recentchangeslinked-feed": "Mudàntzias ligadas",
        "img-auth-nofile": "Su File \"$1\" no esistit.",
        "license": "Licèntzia:",
        "license-header": "Licèntzia",
+       "licenses-edit": "Càmbia su sèberu de sa licèntzia",
        "upload_source_file": "(su file seberadu in su computer tuo)",
+       "listfiles-delete": "Cantzella",
        "imgfile": "file",
        "listfiles": "Lista de is files",
        "listfiles_date": "Data",
        "listfiles_name": "Nùmene",
-       "listfiles_user": "Usuàriu",
+       "listfiles_user": "Impitadore",
        "listfiles_size": "Mannesa in byte",
        "listfiles_description": "Descritzione",
        "listfiles_count": "Versiones",
        "filehist-thumb": "Miniatura",
        "filehist-thumbtext": "Miniatura de sa versione de is $1",
        "filehist-nothumb": "Peruna miniatura",
-       "filehist-user": "Usuàriu",
+       "filehist-user": "Impitadore",
        "filehist-dimensions": "Dimensiones",
        "filehist-filesize": "Mannesa de su file",
        "filehist-comment": "Cummentu",
        "filedelete-success": "Su file '''$1''' est istadu fuliau.",
        "filedelete-otherreason": "Motivu diversu o agiuntivu:",
        "filedelete-reason-otherlist": "Àteru motivu",
+       "mimesearch": "Chirca MIME",
+       "mimetype": "Genia MIME:",
        "download": "scàrriga",
        "listredirects": "Lista de totu is redirects",
        "randompage": "Pàgina a sa tzurpa",
        "usereditcount": "$1 {{PLURAL:$1|acontzu|acontzos}}",
        "usercreated": "{{GENDER:$3|Creadu}} su $1 a is $2",
        "newpages": "Pàginas noas",
-       "newpages-username": "Nùmene usuàriu:",
+       "newpages-username": "Nùmene impitadore:",
        "move": "Movi",
        "movethispage": "Move custa pàgina (càmbia su tìtulu)",
        "unusedimagestext": "Is files ki sighint sunt stados carrigados ma non sunt impreados.\nDia podent essere immàgines impreadas dae àteros giassos cun unu ligàmine diretu, e tando podent essere listados inoghe comente usu ativu.",
        "listgrouprights-group": "Grupu",
        "listgrouprights-rights": "Deretos",
        "listgrouprights-members": "(lista de is cumponentes)",
+       "listgrouprights-namespaceprotection-namespace": "Nùmene-logu",
        "mailnologintext": "Depes èsser [[Special:UserLogin|identificadu (login)]] e àer registradu un'indiritzu e-mail vàlidu in is [[Special:Preferences|preferèntzias tuas]] pro imbiare e-mail a àteros usuàrios.",
-       "emailuser": "E-mail a custu usuàriu",
-       "emailpage": "Ispedi una missada a s'usuàriu",
-       "emailpagetext": "Imprea su mòdulu a suta pro ispedire una missada eletrònica a custu usuàriu.\nS'indiritzu chi as insertadu in is [[Special:Preferences|preferèntzias usuàriu tuas]] at a pàrrere comente su chi at ispedidu sa e-mail, pro fàghere sa manera chi su destinatàriu ti respundat deretu.",
-       "defemailsubject": "Missada dae s'usuàriu \"$1\" de {{SITENAME}}",
+       "emailuser": "Imbia una email a custu impitadore",
+       "emailuser-title-notarget": "Ispedi una email a s'impitadore",
+       "emailpage": "Ispedi una email a s'impitadore",
+       "emailpagetext": "Imprea su mòdulu a suta pro ispedire una email a custu impitadore.\nS'indiritzu chi as insertadu in is [[Special:Preferences|preferèntzias impitadore tuas]] at a pàrrere comente su chi at ispedidu sa e-mail, pro fàghere sa manera chi su destinatàriu ti respundat deretu.",
+       "defemailsubject": "Missada dae \"$1\", impitadore de {{SITENAME}}",
        "noemailtitle": "Perunu indiritzu e-mail",
-       "noemailtext": "Custu usuàriu no at ispetzificadu un indiritzu e-mail vàlidu.",
-       "email-legend": "Imbia una missada e-mail a un àteru usuàriu de {{SITENAME}}",
+       "noemailtext": "Custu impitadore no at ispetzificadu unu indiritzu email vàlidu.",
+       "emailusername": "Nùmene impitadore:",
+       "email-legend": "Imbia una missada e-mail a un àteru impitadore de {{SITENAME}}",
        "emailfrom": "Dae:",
        "emailto": "A:",
        "emailsubject": "Ogetu:",
        "emailsent": "E-mail ispedia",
        "emailsenttext": "Sa e-mail tua est istada imbiada.",
        "usermessage-editor": "Missu de su sistema",
-       "watchlist": "Sa watchlist mea",
+       "watchlist": "Pàginas annotadas",
        "mywatchlist": "Pàginas annotadas",
        "watchlistfor2": "Pro $1 $2",
        "nowatchlist": "No as indicadu pàginas in sa watchlist tua.",
        "unwatch": "Tira dae sa watchlist",
        "unwatchthispage": "Boga custa pàgina dae sa watchlist tua",
        "notanarticle": "Custa pàgina no est unu artìculu",
-       "watchlist-details": "Sa watchlist tua cuntènnit {{PLURAL:$1|$1 pàgina|$1 pàginas}}, chentza contare is pàginas de cuntierras.",
+       "watchlist-details": "Tenes {{PLURAL:$1|$1 pàgina annotada paris a sa pagina de cuntierra sua|$1 pàginas annotadas paris a is pàginas de cuntierra issoro}}.",
        "wlshowlast": "Ammustra is ùrtimas $1 oras $2 dies $3",
        "watchlist-options": "Possibilidades subra sa watchlist",
        "watching": "Giunghende a sa watchlist...",
        "unwatching": "Boghende dae sa watchlist...",
-       "enotif_impersonal_salutation": "Usuàriu de {{SITENAME}}",
+       "enotif_impersonal_salutation": "Impitadore de {{SITENAME}}",
+       "enotif_anon_editor": "impitadore anònimu $1",
        "created": "creada",
        "deletepage": "Fùlia pàgina",
        "confirm": "Cunfima",
        "namespace": "Nùmene-logu:",
        "invert": "Fùrria sa seletzione",
        "blanknamespace": "(Printzipale)",
-       "contributions": "Contributziones {{GENDER:$1|usuàriu}}",
+       "contributions": "Contributziones {{GENDER:$1|impitadore}}",
        "contributions-title": "Contributziones de $1",
        "mycontris": "Contributziones meas",
        "contribsub2": "Pro {{GENDER:$3|$1}} ($2)",
        "sp-contributions-logs": "registros",
        "sp-contributions-talk": "cuntierra",
        "sp-contributions-search": "Chirca contributziones",
-       "sp-contributions-username": "Indiritzu IP o nùmene usuàriu:",
+       "sp-contributions-username": "Indiritzu IP o nùmene impitadore:",
        "sp-contributions-submit": "Chirca",
        "whatlinkshere": "Pàginas chi ligant a custa",
        "whatlinkshere-title": "Pàginas chi ligant a \"$1\"",
        "whatlinkshere-hideredirs": "$1 redirects",
        "whatlinkshere-hidetrans": "$1 inclusionis",
        "whatlinkshere-hidelinks": "$1 acàpius",
+       "whatlinkshere-hideimages": "$1 ligàmine a documentu",
        "whatlinkshere-filters": "Filtros",
-       "blockip": "Blocca {{GENDER:$1|usuàriu}}",
-       "blockip-legend": "Blocca usuàriu",
+       "blockip": "Blocca {{GENDER:$1|impitadore}}",
+       "blockip-legend": "Blocca impitadore",
        "blockiptext": "Usa il modulo sottostante per bloccare l'accesso con diritto di scrittura da uno specifico indirizzo IP. Questo blocco deve essere operato SOLO per prevenire atti di vandalismo, ed in stretta osservanza dei principi tutti della [[{{MediaWiki:Policy-url}}|policy di {{SITENAME}}]]. Il blocco non può in nessun caso essere applicato per motivi ideologici.\nScrivi un motivo specifico per il quale questo indirizzo IP dovrebbe a tuo avviso essere bloccato (per esempio, cita i titoli di pagine eventualmente già oggetto di vandalismo editoriale).",
-       "ipaddressorusername": "Indiritzu IP o nùmene usuàriu:",
+       "ipaddressorusername": "Indiritzu IP o nùmene impitadore:",
        "ipbexpiry": "Scadèntzia:",
        "ipbreason": "Motivu:",
-       "ipbsubmit": "Blocca custu usuàriu",
+       "ipbsubmit": "Blocca custu impitadore",
        "ipbother": "Àteru perìodu:",
        "ipboptions": "2 oras:2 hours,1 die:1 day,3 dies:3 days,1 chida:1 week,2 chidas:2 weeks,1 mese:1 month,3 meses:3 months,6 meses:6 months,1 annu:1 year,infinidu:infinite",
        "badipaddress": "S'indiritzu IP indicadu non est currègidu.",
        "ipb-edit-dropdown": "Càmbia su motivu de su bloccu",
        "ipb-unblock-addr": "Sblocca $1",
        "ipb-blocklist-contribs": "Contributziones de {{GENDER:$1|$1}}",
-       "unblockip": "Sblocca s'usuàriu",
+       "unblockip": "Sblocca s'impitadore",
        "unblockiptext": "Usa il modulo sottostante per restituire il diritto di scrittura ad un indirizzo IP precedentemente bloccato.",
        "ipusubmit": "Boga custu bloccu",
        "ipblocklist": "Usuàrios bloccados",
        "unblocklink": "sblocca",
        "change-blocklink": "tramuda su bloccu",
        "contribslink": "contributziones",
+       "emaillink": "imbia email",
        "blocklogpage": "Bloccos de usuàrios",
        "blocklogentry": "bloccau [[$1]] pro unu tempu de $2 $3",
        "unblocklogentry": "at sbloccau $1",
        "movepagetext": "Cun custu mòdellu podes renumenare una pàgina, movende totu sa stòria sua a sa pàgina noa.\nSu tìtulu bèciu at a diventare una pàgina de reindiritzamentu a su tìtulu nou.\nPodes agiornare automaticamente is redirects ca ligant a su tìtulu originàriu.\nSi sèberas de no, assicura·ti de controllare pro [[Special:DoubleRedirects| reindiritzaduras dòpias]] o [[Special:BrokenRedirects|sballiadas]].\nSes responsàbile de t'assigurare ca is cullegamentos sighint a puntare  a ue depent puntare.\n\nAnnota ca sa pàgina <strong>non</strong> s'at a mòver si nde esistit giai un'àtera a su tìtulu nou, si no est ki siat bùida o cun sceti unu reindiritzamentu a sa bècia e siat chentza acontzos in antis. In casu de movimentu sballiadu, duncas, si podet torrare a su tìtulu bèciu, ma non podes subrascrìer una pàgina chi giai esistit.\n\n<strong>ATENTZIONE!</strong>\nUnu cambiamentu dràsticu podet creare problemas, mescamente a is pàginas prus populares;\npro praxere depes èsser seguru de àer cumpresu is cunsighèntzias prima de sighire a in antis.",
        "movepagetalktext": "Sa pàgina cuntierras asotziada, chi esistit, at a èssere movida automaticamenti impare a sa pàgina base, '''a parte in custos casos''':\n* su movimentu de sa pàgina est intre namespaces diversos;\n* in currispondèntzia de su tìtulu nou esistit giai una pàgina de cuntierras (non bùida);\n* sa casella inoe in bàsciu no est istata sceberada.\n\nIn custos casos, si cheres, depes mòvere a manu su cuntènnidu de sa pàgina.",
        "movearticle": "Move sa pàgina",
-       "movenologintext": "Depes èsser unu usuàriu registradu e [[Special:UserLogin|identificadu]] pro pòder mòver una pàgina",
+       "movenologintext": "Depes èsser unu impitadore registradu e [[Special:UserLogin|identificadu]] pro pòder mòver una pàgina",
        "newtitle": "Tìtulu nou:",
        "move-watch": "Pone ogru a custa pàgina",
        "movepagebtn": "Move sa pàgina",
        "pagemovedsub": "Movimentu andadu bene",
        "movepage-moved": "'''\"$1\" est istada mòvida a \"$2\"'''",
+       "movepage-moved-redirect": "Unu reindiritzamentu est istadu creadu.",
        "articleexists": "Una pàgina cun custu nùmene esistit giai, o su nùmene ki as seberadu no est bàlidu.\nPro praxere sèbera un'àteru nùmene.",
        "movetalk": "Move sa pàgina de cuntierra galu",
        "movelogpage": "Moviduras",
        "immobile-source-page": "Non si podet mòver custa pàgina.",
        "move-leave-redirect": "Lassa unu reindiritzamentu a palas",
        "export": "Esporta pàginas",
+       "export-submit": "Esporta",
        "export-download": "Sarba comente file",
        "allmessagesname": "Nùmene",
        "allmessages-filter-legend": "Filtru",
        "allmessages-filter-submit": "Bae",
        "allmessages-filter-translate": "Tradui",
        "thumbnail-more": "Amannia",
+       "import-interwiki-submit": "Importa",
        "import-interwiki-namespace": "Nùmene-logu de destinatzione:",
        "import-upload-filename": "Nùmene file:",
        "import-comment": "Cummentu:",
-       "tooltip-pt-userpage": "Sa pàgina usuàriu tua",
+       "importstart": "Importande is pàginas...",
+       "import-revision-count": "$1 {{PLURAL:$1|revisione|revisiones}}",
+       "tooltip-pt-userpage": "Sa pàgina impitadore tua",
        "tooltip-pt-mytalk": "Sa pàgina de is cuntierras tuas",
        "tooltip-pt-preferences": "Is preferèntzias chi podes scioberai",
        "tooltip-pt-watchlist": "Sa lista de is pàginas chi tue ses ponende ogru",
        "tooltip-t-recentchangeslinked": "Lista de is ùrtimas mudàntzias de is pàginas ki ligant a custa",
        "tooltip-feed-rss": "RSS feed pro custa pàgina",
        "tooltip-feed-atom": "Atom feed pro custa pàgina",
-       "tooltip-t-contributions": "Càstia sa lista de is contributziones de custu usuàriu",
-       "tooltip-t-emailuser": "Ispedi una missada eletronica a custu usuàriu",
+       "tooltip-t-contributions": "Càstia sa lista de is contributziones de custu impitadore",
+       "tooltip-t-emailuser": "Ispedi una email a custu impitadore",
        "tooltip-t-upload": "Càrriga file multimediale",
        "tooltip-t-specialpages": "Lista de is pàginas ispetziales",
        "tooltip-t-print": "Versione de custa pàgina pro s'imprenta",
        "tooltip-t-permalink": "Cullegamentu permanente a custa versione de sa pàgina",
        "tooltip-ca-nstab-main": "Càstia su cuntènnidu de sa pàgina",
-       "tooltip-ca-nstab-user": "Càstia sa pàgina usuàriu",
+       "tooltip-ca-nstab-user": "Càstia sa pàgina impitadore",
        "tooltip-ca-nstab-special": "Custa est una pàgina ispetziale, non dda podes cambiare",
        "tooltip-ca-nstab-project": "Càstia sa pàgina de servìtziu",
        "tooltip-ca-nstab-image": "Càstia sa pàgina de su file",
        "tooltip-upload": "Cumentza a carrigare",
        "tooltip-rollback": "\"Rollback\" annudda is mudàntzias de custa pàgina fatas dae s'ùrtimu contribudori",
        "tooltip-undo": "\"Annudda\" fùrriat custu acontzu e aberit su mòdulu de acontzu comente antiprima.\nPodes agiùnger unu motivu in s'ogetu de s'acontzu.",
-       "siteuser": "$1, {{GENDER:$1|usuàriu|usuària}} de {{SITENAME}}",
-       "anonuser": " $1, usuàriu anònimu de {{SITENAME}}",
+       "tooltip-preferences-save": "Sarva preferèntzias",
+       "siteuser": "$1, impitadore de {{SITENAME}}",
+       "anonuser": "$1, impitadore anònimu de {{SITENAME}}",
        "others": "àteros",
        "siteusers": "$1, {{PLURAL:$2|usuàriu|usuàrios}} de {{SITENAME}}",
        "anonusers": "$1, {{PLURAL:$2|usuàriu anònimu|usuàrios anònimos}} de {{SITENAME}}",
        "creditspage": "Autores de sa pàgina",
+       "pageinfo-article-id": "ID pàgina",
+       "pageinfo-contentpage-yes": "Eja",
+       "pageinfo-protect-cascading-yes": "Eja",
        "previousdiff": "← Acontzu in antis",
        "nextdiff": "Acontzu in fatu →",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|pàgina|pàginas}}",
        "file-info-size": "$1 × $2 pixels, mannesa de su file: $3, tipu de MIME: $4",
        "file-nohires": "Non si tenent risolutziones prus artas.",
        "svg-long-desc": "file in formadu SVG, mannesa nominale $1 × $2 pixel, mannesa de su file: $3",
        "word-separator": "&#32;",
        "ellipsis": "…",
        "percent": "$1%",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← pàgina in antis",
        "imgmultipagenext": "pàgina in fatu →",
        "imgmultigo": "Bae!",
        "imgmultigoto": "Bae a sa pàgina $1",
+       "img-lang-go": "Bae",
        "table_pager_first": "Primu pàgina",
        "table_pager_last": "Ùrtima pàgina",
        "table_pager_limit_submit": "Bae",
        "size-gigabytes": "$1 GB",
        "watchlistedit-normal-title": "Càmbia sa lista de annotadas",
        "watchlistedit-raw-titles": "Tìtulos:",
+       "watchlistedit-clear-titles": "Tìtulos:",
        "watchlisttools-view": "Càstia mudàntzias de importu",
        "watchlisttools-edit": "Càstia e acontza sa watchlist",
        "watchlisttools-raw": "Acontza sa watchlist dae su testu",
        "version-other": "Àteru",
        "version-version": "(Versione $1)",
        "version-license": "Licèntzia MediaWiki",
+       "version-ext-license": "Licèntzia",
+       "version-ext-colheader-license": "Licèntzia",
+       "version-poweredby-others": "àteros",
        "version-software-version": "Versione",
+       "version-entrypoints-header-url": "URL",
+       "redirect-submit": "Bae",
+       "redirect-user": "ID impitadore",
+       "redirect-page": "ID pàgina",
        "fileduplicatesearch-submit": "Chirca",
        "specialpages": "Pàginas ispetziales",
        "specialpages-note-top": "Legenda",
        "specialpages-group-login": "Intra / crea contu",
        "specialpages-group-pages": "Listas de is pàginas",
+       "tags-active-yes": "Eja",
+       "tags-active-no": "No",
        "tags-edit": "càmbia",
+       "compare-page1": "Pàgina 1",
+       "compare-page2": "Pàgina 2",
+       "compare-rev1": "Revisione 1",
+       "compare-rev2": "Revisione 2",
        "htmlform-selectorother-other": "Àteru",
+       "htmlform-no": "No",
+       "htmlform-yes": "Eja",
+       "logentry-upload-upload": "$1 {{GENDER:$2|carrigadu}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|carrigadu}} una versione noa de $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|carrigadu}} $3",
        "rightsnone": "(nisciunu)",
+       "feedback-close": "Fatu",
        "searchsuggest-search": "Chirca",
-       "expand_templates_preview": "Antiprima"
+       "expand_templates_ok": "OK",
+       "expand_templates_preview": "Antiprima",
+       "pagelang-name": "Pàgina",
+       "pagelang-select-lang": "Sèbera limba"
 }
index b527a83..fb8237a 100644 (file)
        "userlogin-resetlink": "T'ascurdasti li dittagli pâ trasuta?",
        "userlogin-resetpassword-link": "Reinizzializza la tò password",
        "userlogin-helplink2": "Aiutu pâ trasuta",
-       "userlogin-loggedin": "Vossia già trasìu comu {{GENDER:$1|$1}}.\nUsassi lu mòdulu ccassutta pi tràsiri comu autru utenti.",
-       "userlogin-createanother": "Crèa n'autru cuntu",
        "createacct-emailrequired": "Nnirizzu e-mail",
        "createacct-emailoptional": "Nnirizzu e-mail (facurtativu)",
        "createacct-email-ph": "Nzirisci lu tò nnirizzu e-mail",
index 7290105..4c41510 100644 (file)
        "gotaccountlink": "පිවිසෙන්න",
        "userlogin-resetlink": "ඔබේ පිවිසුම් තොරතුරු අමතකද?",
        "userlogin-resetpassword-link": "ඔබේ මුරපදය නැති වුනාද?",
-       "userlogin-loggedin": "ඔබ දැනටමත් {{GENDER:$1|}} ලෙස පිවිසී ඇත.\nනව පරිශීලකයෙකු ලෙස ඇතුළු වීමට පහත ආකෘතිය පුරවන්න.",
-       "userlogin-createanother": "තවත් ගිණුමක් ආරම්භ කරන්න",
        "createacct-emailrequired": "වි-තැපෑල ලිපිනය",
        "createacct-emailoptional": "වි-තැපෑල ලිපිනය (විකල්ප)",
        "createacct-email-ph": "ඔබගේ වි-තැපෑල ලිපිනය ඇතුළු කරන්න",
index 4bacc61..42520d9 100644 (file)
        "hidetoc": "skryť",
        "collapsible-collapse": "zbaliť",
        "collapsible-expand": "rozbaliť",
+       "confirmable-yes": "Áno",
+       "confirmable-no": "Nie",
        "thisisdeleted": "Zobraziť alebo obnoviť $1?",
        "viewdeleted": "Zobraziť $1?",
        "restorelink": "{{PLURAL:$1|jednu zmazanú úpravu|$1 zmazané úpravy|$1 zmazaných úprav}}",
        "userlogin-resetlink": "Zabudli ste svoje prihlasovacie údaje?",
        "userlogin-resetpassword-link": "Zabudli ste heslo?",
        "userlogin-helplink2": "Pomoc s prihlásením",
-       "userlogin-loggedin": "Ste už {{GENDER:$1|prihĺasený|prihlásená}} ako $1.\nPomocou formulára nižšie sa môžete prihlásiť ako iný redaktor.",
-       "userlogin-createanother": "Vytvoriť ďalší účet",
        "createacct-emailrequired": "E-mailová adresa",
        "createacct-emailoptional": "E-mailová adresa (nepovinné)",
        "createacct-email-ph": "Zadajte vašu e-mailovú adresu",
        "resetpass-temp-password": "Dočasné heslo:",
        "resetpass-abort-generic": "Zmena hesla bola zablokovaná rozšírením.",
        "resetpass-expired": "Platnosť vášho hesla vypršala. Pre prihlásenie si nastavte nové heslo.",
+       "resetpass-expired-soft": "Platnosť vášho hesla vypršala, musíte si nastaviť nové. Zvoľte si nové heslo nebo kliknite na „{{int:resetpass-submit-cancel}}“ a nastavte si ho neskôr.",
+       "resetpass-validity-soft": "Vaše heslo je neplatné: $1\n\nVyberte si nové heslo, alebo kliknite na „{{int:resetpass-submit-cancel}}“ a nastavte si ho neskôr.",
        "passwordreset": "Reset hesla",
        "passwordreset-text-one": "Pre získanie nového hesla vyplňte tento formulár.",
        "passwordreset-text-many": "{{PLURAL:$1|Pre získanie nového hesla zadajte jeden z údajov.}}",
        "license-nopreview": "(Náhľad nie je dostupný)",
        "upload_source_url": " (platný, verejne prístupný URL)",
        "upload_source_file": " (súbor na vašom počítači)",
+       "listfiles-delete": "zmazať",
        "listfiles-summary": "Táto špeciálna stránka zobrazuje všetky nahrané súbory.",
        "listfiles_search_for": "Hľadať názov súboru:",
        "imgfile": "súbor",
        "randomincategory": "Náhodná stránka v kategórii",
        "randomincategory-invalidcategory": "\"$1\" nie je platný názov kategórie.",
        "randomincategory-nopages": "V [[:Category:$1|kategórii $1]] nie sú žiadne stránky.",
-       "randomincategory-selectcategory": "Získať náhodnú stránku z kategórie: $1 $2",
-       "randomincategory-selectcategory-submit": "Ísť na",
+       "randomincategory-category": "Kategória:",
+       "randomincategory-legend": "Náhodná stránka v kategórii",
        "randomredirect": "Náhodná presmerovacia stránka",
        "randomredirect-nopages": "V mennom „$1“ priestore nie sú žiadne presmerovania.",
        "statistics": "Štatistiky",
        "pageswithprop-prophidden-binary": "hodnota binárnej vlastnosti bola skrytá ($1)",
        "doubleredirects": "Dvojité presmerovania",
        "doubleredirectstext": "Táto stránka obsahuje zoznam stránok, ktoré presmerovávajú na iné presmerovacie stránky.\nKaždý riadok obsahuje odkaz na prvé a druhé presmerovanie a tiež prvý riadok z textu na ktorý odkazuje druhé presmerovanie, ktoré zvyčajne odkazuje na „skutočný“ cieľ, na ktorý má odkazovať prvé presmerovanie.\n<del>Prečiarknuté</del> položky boli vyriešené.",
-       "double-redirect-fixed-move": "Stránka [[$1]] bola presunutá, teraz je presmerovaním na [[$2]]",
+       "double-redirect-fixed-move": "Stránka [[$1]] bola presunutá.\nBola automaticky aktualizovaná a teraz presmerováva na [[$2]]",
        "double-redirect-fixed-maintenance": "Opravuje sa dvojité presmerovanie z [[$1]] na [[$2]].",
        "double-redirect-fixer": "Korektor presmerovaní",
        "brokenredirects": "Pokazené presmerovania",
        "import": "Import stránok",
        "importinterwiki": "Transwiki import",
        "import-interwiki-text": "Zvoľte wiki a názov stránky, ktorá sa má importovať.\nDátumy revízií a mená používateľov budú zachované.\nVšetky transwiki importy sa zaznamenávajú v [[Special:Log/import|Zázname importov]].",
-       "import-interwiki-source": "Zdrojová wiki/stránka:",
        "import-interwiki-history": "Skopírovať všetky historické revízie tejto stránky",
        "import-interwiki-templates": "Vložiť všetky šablóny",
        "import-interwiki-submit": "Importovať",
        "watchlistedit-raw-done": "Váš zoznam sledovaných stránok bol aktualizovaný.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Jedna položka bola pridaná|$1 položky boli pridané|$1 položiek bolo pridaných}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Jedna položka bola odstránená|$1 položky boli odstránené|$1 položiek bolo odstránených}}:",
+       "watchlistedit-clear-titles": "Názvy:",
        "watchlisttools-view": "Zobraziť súvisiace zmeny",
        "watchlisttools-edit": "Zobraziť a upraviť zoznam sledovaných stránok",
        "watchlisttools-raw": "Upraviť nespracovaný zoznam sledovaných stránok",
        "version-license": "Licencia",
        "version-ext-license": "Licencia",
        "version-ext-colheader-name": "Rozšírenie",
+       "version-skin-colheader-name": "Vzhľad",
        "version-ext-colheader-version": "Verzia",
        "version-ext-colheader-license": "Licencia",
        "version-ext-colheader-description": "Popis",
        "htmlform-no": "Nie",
        "htmlform-yes": "Áno",
        "htmlform-chosen-placeholder": "Vyberte možnosť",
+       "htmlform-cloner-create": "Pridať ďalšie",
+       "htmlform-cloner-delete": "Odstrániť",
        "sqlite-has-fts": "$1 s podporou vyhľadávania v plnom texte",
        "sqlite-no-fts": "$1 bez podpory vyhľadávania v plnom texte",
        "logentry-delete-delete": "$1 zmazal stránku $3",
        "expand_templates_remove_comments": "Odstrániť komentáre",
        "expand_templates_remove_nowiki": "Potlačiť značky <nowiki> vo výsledku",
        "expand_templates_generate_xml": "Zobraziť strom XML",
-       "expand_templates_preview": "Náhľad"
+       "expand_templates_preview": "Náhľad",
+       "pagelang-name": "Stránka",
+       "pagelang-language": "Jazyk",
+       "pagelang-use-default": "Použiť predvolený jazyk",
+       "pagelang-select-lang": "Vybrať jazyk",
+       "right-pagelang": "Zmeniť jazyk stránky"
 }
index 923e8b2..5583477 100644 (file)
        "userlogin-resetlink": "Ste pozabili svoje prijavne podatke?",
        "userlogin-resetpassword-link": "Ste pozabili svoje geslo?",
        "userlogin-helplink2": "Pomoč pri prijavi",
-       "userlogin-loggedin": "Prijavljeni ste že kot {{GENDER:$1|$1}}.\nUporabite spodnji obrazec, da se prijavite kot drug uporabnik.",
-       "userlogin-createanother": "Ustvari drug račun",
        "createacct-emailrequired": "E-poštni naslov",
        "createacct-emailoptional": "E-poštni naslov (izbirno)",
        "createacct-email-ph": "Vnesite svoj e-poštni naslov",
        "showpreview": "Prikaži predogled",
        "showdiff": "Prikaži spremembe",
        "blankarticle": "<strong>Opozorilo:</strong> Stran, ki jo ustvarjate, je prazna.\nČe ponovno kliknete »{{int:savearticle}}«, bomo stran ustvarili brez kakršne koli vsebine.",
-       "anoneditwarning": "'''Opozorilo''': niste prijavljeni. V zgodovino strani se bo zapisal vaš IP-naslov.",
+       "anoneditwarning": "<strong>Opozorilo:</strong> Niste prijavljeni. Vaš IP-naslov bo javno viden, če naredite kakršno koli urejanje. Če se <strong>[$1 prijavite]</strong> ali <strong>[$2 ustvarite račun]</strong>, bodo vaša urejanja pripisana vašemu uporabniškemu imenu skupaj z drugimi prednostmi.",
        "anonpreviewwarning": "Niste prijavljeni. Ob spremembi strani se bo vaš IP-naslov zapisal v zgodovini urejanja te strani.",
        "missingsummary": "'''Opozorilo:''' Niste napisali povzetka urejanja. Ob ponovnem kliku gumba ''Shrani'' se bo vaše urejanje shranilo brez njega.",
        "missingcommenttext": "Prosimo, vpišite v spodnje polje komentar.",
index 153cf07..5dc81a0 100644 (file)
        "userlogin-resetlink": "Заборавили сте податке за пријаву?",
        "userlogin-resetpassword-link": "Заборавили сте лозинку?",
        "userlogin-helplink2": "Помоћ при пријављивању",
-       "userlogin-loggedin": "Већ сте пријављени као {{GENDER:$1|$1}}.\nКористите доњи образац да бисте се пријавили као други корисник.",
-       "userlogin-createanother": "Отвори још један налог",
        "createacct-emailrequired": "Адреса е-поште",
        "createacct-emailoptional": "Адреса е-поште (опционо)",
        "createacct-email-ph": "Унесите вашу адресу е-поште",
        "subject-preview": "Преглед теме/наслова:",
        "blockedtitle": "Корисник је блокиран",
        "blockedtext": "<strong>Ваше корисничко име или ИП адреса је блокирана.</strong>\n\nБлокирање је {{GENDER:$4|извршио|извршила}} $1.\nРазлог: <em>$2</em>.\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\nНе можете користити могућност „Пошаљи поруку овом кориснику“ ако нисте унели исправну е-адресу у [[Special:Preferences|подешавањима]].\nВаша блокирана ИП адреса је $3, а ID блокирања $5.\nНаведите све податке изнад при стварања било каквих упита.",
-       "autoblockedtext": "Ваша ИП адреса је блокирана јер ју је употребљавао други корисник, кога је {{GENDER:$1|блокирао|блокирала|блокирао}} $1.\nРазлог:\n\n:''$2''\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$1|кориснику|корисници|кориснику}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\n\nНе можете користити могућност „Пошаљи поруку овом кориснику“ ако нисте унели исправну е-адресу у [[Special:Preferences|подешавањима]].\n\nВаша блокирана ИП адреса је $3, а ИБ $5.\nНаведите све податке изнад при стварању било каквих упита.",
+       "autoblockedtext": "Ваша ИП адреса је блокирана јер ју је употребљавао други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\n\nНе можете користити могућност „Пошаљи поруку овом кориснику“ ако нисте унели исправну е-адресу у [[Special:Preferences|подешавањима]].\n\nВаша блокирана ИП адреса је $3, а ID $5.\nНаведите све податке изнад при стварању било каквих упита.",
        "blockednoreason": "разлог није наведен",
        "whitelistedittext": "За уређивање странице је потребно да будете $1.",
        "confirmedittext": "Морате да потврдите своју е-адресу пре уређивања страница.\nПоставите и потврдите адресу преко [[Special:Preferences|подешавања]].",
        "undo-summary": "Поништена измена $1 {{GENDER:$2|корисника|кориснице}} [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]])",
        "undo-summary-username-hidden": "Поништи измену $1 скривеног корисника",
        "cantcreateaccounttitle": "Не могу да отворим налог",
-       "cantcreateaccount-text": "Отварање налога с ове IP адресе ('''$1''') је {{GENDER:$3|блокирао|блокирала|блокирао}} [[User:$3|$3]].\n\nРазлог који је навео {{GENDER:$3|корисник|корисница|корисник}} $3 је ''$2''",
+       "cantcreateaccount-text": "Отварање налога с ове IP адресе (<strong>$1</strong>) је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је <em>$2</em>",
+       "cantcreateaccount-range-text": "Отварање налога са IP адреса у распону '''$1''', који укључује и вашу IP адресу ('''$4''') је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је <em>$2</em>",
        "viewpagelogs": "Погледај дневнике ове странице",
        "nohistory": "Не постоји историја измена ове странице.",
        "currentrev": "Текућа измена",
        "exbeforeblank": "садржај пре брисања је био: „$1“",
        "delete-confirm": "Брисање странице „$1“",
        "delete-legend": "Обриши",
-       "historywarning": "<strong>Упозорење:</strong> страница коју желите да обришете има историју с приближно $1 {{PLURAL:$1|изменом|измене|измена}}:",
+       "historywarning": "<strong>Упозорење:</strong> страница коју желите да обришете има историју са $1 {{PLURAL:$1|изменом|измене|измена}}:",
        "confirmdeletetext": "Управо ћете обрисати страницу, укључујући и њену историју.\nПотврдите своју намеру, да разумете последице и да ово радите у складу с [[{{MediaWiki:Policy-url}}|правилима]].",
        "actioncomplete": "Радња је завршена",
        "actionfailed": "Радња није успела",
        "emaillink": "пошаљи е-поруку",
        "autoblocker": "Аутоматски сте блокирани јер делите ИП адресу с корисником/цом [[User:$1|$1]].\nРазлог блокирања: „$2“",
        "blocklogpage": "Дневник блокирања",
-       "blocklog-showlog": "{{GENDER:$1|Овај корисник је раније блокиран|Ова корисница је раније блокирана|Овај корисник је раније блокиран}}.\nИсторија блокирања се налази испод:",
-       "blocklog-showsuppresslog": "{{GENDER:|Овај корисник је раније блокиран и сакривен|Ова корисница је раније блокирана и сакривена|Овај корисник је раније блокиран и сакривен}}.\nИсторија сакривања се налази испод:",
+       "blocklog-showlog": "{{GENDER:$1|Овај корисник је раније блокиран|Ова корисница је раније блокирана}}.\nИсторија блокирања се налази испод:",
+       "blocklog-showsuppresslog": "{{GENDER:$1|Овај корисник је раније блокиран и сакривен|Ова корисница је раније блокирана и сакривена}}.\nИсторија сакривања се налази испод:",
        "blocklogentry": "је блокирао [[$1]] с роком истицања од $2 $3",
        "reblock-logentry": "{{GENDER:|је променио|је променила|је променио}} подешавања за блокирање {{GENDER:$1|корисника|кориснице|корисника}} [[$1]] с роком истека од $2 ($3)",
        "blocklogtext": "Ово је дневник блокирања и деблокирања корисника.\nАутоматски блокиране ИП адресе нису наведене.\nТекуће забране и блокирања можете наћи [[Special:BlockList|овде]].",
        "scarytranscludefailed-httpstatus": "[Не могу да преузмем шаблон $1: HTTP $2]",
        "scarytranscludetoolong": "[URL адреса је предугачка]",
        "deletedwhileediting": "<strong>Упозорење</strong>: ова страница је обрисана након што сте почели с уређивањем!",
-       "confirmrecreate": "[[User:$1|$1]] ([[User talk:$1|разговор]]) {{GENDER:$1|је обрисао|је обрисала|обриса}} ову страницу након што сте почели да је уређујете из следећег разлога:\n: ''$2''\nПотврдите да стварно желите да направите страницу.",
+       "confirmrecreate": "Корисник [[User:$1|$1]] ([[User talk:$1|разговор]]) је обрисао ову страницу након што сте почели да је уређујете из следећег разлога:\n: <em>$2</em>\nПотврдите да стварно желите да направите страницу.",
        "confirmrecreate-noreason": "Корисник [[User:$1|$1]] ([[User talk:$1|разговор]]) је обрисао ову страницу након што сте почели да га уређујете. Потврдите да стварно желите да поново направите ову страницу.",
        "recreate": "Поново направи",
        "unit-pixel": "px",
index 4bca5d6..9a6af12 100644 (file)
        "userlogin-resetlink": "Zaboravili ste podatke za prijavu?",
        "userlogin-resetpassword-link": "Zaboravili ste lozinku?",
        "userlogin-helplink2": "Pomoć pri prijavljivanju",
-       "userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nKoristite donji obrazac da biste se prijavili kao drugi korisnik.",
-       "userlogin-createanother": "Otvori još jedan nalog",
        "createacct-emailrequired": "Adresa e-pošte",
        "createacct-emailoptional": "Adresa e-pošte (opciono)",
        "createacct-email-ph": "Unesite vašu adresu e-pоšte",
        "subject-preview": "Pregled teme/naslova:",
        "blockedtitle": "Korisnik je blokiran",
        "blockedtext": "<strong>Vaše korisničko ime ili IP adresa je blokirana.</strong>\n\nBlokiranje je {{GENDER:$4|izvršio|izvršila}} $1.\nRazlog: <em>$2</em>.\n\n* Datum blokiranja: $8\n* Blokiranje ističe: $6\n* Ime korisnika: $7\n\nObratite se {{GENDER:$4|korisniku|korisnici}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] da razjasnite stvar.\nNe možete koristiti mogućnost „Pošalji poruku ovom korisniku“ ako niste uneli ispravnu e-adresu u [[Special:Preferences|podešavanjima]].\nVaša blokirana IP adresa je $3, a ID blokiranja $5.\nNavedite sve podatke iznad pri stvaranja bilo kakvih upita.",
-       "autoblockedtext": "Vaša IP adresa je blokirana jer ju je upotrebljavao drugi korisnik, koga je {{GENDER:$1|blokirao|blokirala|blokirao}} $1.\nRazlog:\n\n:''$2''\n\n* Datum blokiranja: $8\n* Blokiranje ističe: $6\n* Ime korisnika: $7\n\nObratite se {{GENDER:$1|korisniku|korisnici|korisniku}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] da razjasnite stvar.\n\nNe možete koristiti mogućnost „Pošalji poruku ovom korisniku“ ako niste uneli ispravnu e-adresu u [[Special:Preferences|podešavanjima]].\n\nVaša blokirana IP adresa je $3, a IB $5.\nNavedite sve podatke iznad pri stvaranju bilo kakvih upita.",
+       "autoblockedtext": "Vaša IP adresa je blokirana jer ju je upotrebljavao drugi korisnik, koga je {{GENDER:$4|blokirao|blokirala}} $1.\nRazlog:\n\n:<em>$2</em>\n\n* Datum blokiranja: $8\n* Blokiranje ističe: $6\n* Ime korisnika: $7\n\nObratite se {{GENDER:$4|korisniku|korisnici}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] da razjasnite stvar.\n\nNe možete koristiti mogućnost „Pošalji poruku ovom korisniku“ ako niste uneli ispravnu e-adresu u [[Special:Preferences|podešavanjima]].\n\nVaša blokirana IP adresa je $3, a ID $5.\nNavedite sve podatke iznad pri stvaranju bilo kakvih upita.",
        "blockednoreason": "razlog nije naveden",
        "whitelistedittext": "Za uređivanje stranice je potrebno da budete $1.",
        "confirmedittext": "Morate da potvrdite svoju e-adresu pre uređivanja stranica.\nPostavite i potvrdite adresu preko [[Special:Preferences|podešavanja]].",
        "undo-summary": "Poništena izmena $1 {{GENDER:$2|korisnika|korisnice}} [[Special:Contribs/$2|$2]] ([[User talk:$2|razgovor]])",
        "undo-summary-username-hidden": "Poništi izmenu $1 skrivenog korisnika",
        "cantcreateaccounttitle": "Ne mogu da otvorim nalog",
-       "cantcreateaccount-text": "Otvaranje naloga s ove IP adrese ('''$1''') je {{GENDER:$3|blokirao|blokirala|blokirao}} [[User:$3|$3]].\n\nRazlog koji je naveo {{GENDER:$3|korisnik|korisnica|korisnik}} $3 je ''$2''",
+       "cantcreateaccount-text": "Otvaranje naloga s ove IP adrese (<strong>$1</strong>) je blokirao/la [[User:$3|$3]].\n\nRazlog koji je naveo/la $3 je <em>$2</em>",
        "viewpagelogs": "Pogledaj dnevnike ove stranice",
        "nohistory": "Ne postoji istorija izmena ove stranice.",
        "currentrev": "Tekuća izmena",
        "autoblocker": "Automatski ste blokirani jer delite IP adresu s korisnikom/com [[User:$1|$1]].\nRazlog blokiranja: „$2“",
        "blocklogpage": "Dnevnik blokiranja",
        "blocklog-showlog": "{{GENDER:$1|Ovaj korisnik je ranije blokiran|Ova korisnica je ranije blokirana|Ovaj korisnik je ranije blokiran}}.\nIstorija blokiranja se nalazi ispod:",
-       "blocklog-showsuppresslog": "{{GENDER:|Ovaj korisnik je ranije blokiran i sakriven|Ova korisnica je ranije blokirana i sakrivena|Ovaj korisnik je ranije blokiran i sakriven}}.\nIstorija sakrivanja se nalazi ispod:",
+       "blocklog-showsuppresslog": "{{GENDER:$1|Ovaj korisnik je ranije blokiran i sakriven|Ova korisnica je ranije blokirana i sakrivena}}.\nIstorija sakrivanja se nalazi ispod:",
        "blocklogentry": "je blokirao [[$1]] s rokom isticanja od $2 $3",
        "reblock-logentry": "{{GENDER:|je promenio|je promenila|je promenio}} podešavanja za blokiranje {{GENDER:$1|korisnika|korisnice|korisnika}} [[$1]] s rokom isteka od $2 ($3)",
        "blocklogtext": "Ovo je dnevnik blokiranja i deblokiranja korisnika.\nAutomatski blokirane IP adrese nisu navedene.\nTekuće zabrane i blokiranja možete naći [[Special:BlockList|ovde]].",
        "scarytranscludefailed-httpstatus": "[Ne mogu da preuzmem šablon $1: HTTP $2]",
        "scarytranscludetoolong": "[URL adresa je predugačka]",
        "deletedwhileediting": "<strong>Upozorenje</strong>: ova stranica je obrisana nakon što ste počeli s uređivanjem!",
-       "confirmrecreate": "[[User:$1|$1]] ([[User talk:$1|razgovor]]) {{GENDER:$1|je obrisao|je obrisala|je obrisao}} ovu stranicu nakon što ste počeli da je uređujete iz sledećeg razloga:\n: ''$2''\nPotvrdite da stvarno želite da napravite stranicu.",
+       "confirmrecreate": "Korisnik [[User:$1|$1]] ([[User talk:$1|razgovor]]) je obrisao ovu stranicu nakon što ste počeli da je uređujete iz sledećeg razloga:\n: <em>$2</em>\nPotvrdite da stvarno želite da napravite stranicu.",
        "confirmrecreate-noreason": "Korisnik [[User:$1|$1]] ([[User talk:$1|razgovor]]) je obrisao ovu stranicu nakon što ste počeli da ga uređujete. Potvrdite da stvarno želite da ponovo napravite ovu stranicu.",
        "recreate": "Ponovo napravi",
        "unit-pixel": "px",
index 075690c..346929e 100644 (file)
        "userlogin-resetlink": "Har du glömt dina inloggningsuppgifter?",
        "userlogin-resetpassword-link": "Glömt ditt lösenord?",
        "userlogin-helplink2": "Hjälp med inloggning",
-       "userlogin-loggedin": "Du är redan inloggad som {{GENDER:$1|$1}}.\nAnvänd formuläret nedan för att logga in som en annan användare.",
-       "userlogin-createanother": "Skapa ett annat konto",
        "createacct-emailrequired": "E-postadress",
        "createacct-emailoptional": "E-postadress (valfritt)",
        "createacct-email-ph": "Bekräfta din e-postadress",
index 051e05d..cc50bc4 100644 (file)
        "gotaccountlink": "புகுபதிகை",
        "userlogin-resetlink": "உங்கள் புகுபதிகைக் குறிப்புகளை மறந்துவிட்டீர்களா?",
        "userlogin-resetpassword-link": "உங்கள் கடவுச் சொல்லை மறந்து விட்டீர்களா?",
-       "userlogin-createanother": "மற்றொரு கணக்கு ஒன்றை உருவாக்கவும்",
        "createacct-emailrequired": "மின்னஞ்சல் முகவரி",
        "createacct-emailoptional": "மின்னஞ்சல் முகவரி (விருப்பத்தேர்வு)",
        "createacct-email-ph": "உங்கள் மின்னஞ்சல் முகவரியை உள்ளிடுக",
index cbb282c..20ab62d 100644 (file)
        "rev-showdeleted": "hatudu",
        "revisiondelete": "Halakon/restaurar versaun",
        "revdelete-show-file-submit": "Sin",
-       "revdelete-hide-user": "Subar naran edita-na'in/IP",
+       "revdelete-hide-text": "Testu versaun nian",
+       "revdelete-hide-user": "Naran edita-na'in/diresaun IP",
        "revdelete-radio-set": "Sin",
        "revdelete-radio-unset": "Lae",
        "revdelete-edit-reasonlist": "Edita lista motivu nian",
index 7c5dd9e..8ba938a 100644 (file)
        "userlogin-resetlink": "ลืมรายละเอียดล็อกอินของคุณหรือ",
        "userlogin-resetpassword-link": "ลืมรหัสผ่านหรือ",
        "userlogin-helplink2": "วิธีใช้เรื่องการล็อกอิน",
-       "userlogin-loggedin": "คุณล็อกอินในชื่อ {{GENDER:$1|$1}} แล้ว\nใช้แบบด้านล่างเพื่อล็อกอินเป็นอีกผู้ใช้หนึ่ง",
-       "userlogin-createanother": "สร้างอีกบัญชี",
        "createacct-emailrequired": "ที่อยู่อีเมล",
        "createacct-emailoptional": "ที่อยู่อีเมล (เลือกไม่ใส่ได้)",
        "createacct-email-ph": "กรอกที่อยู่อีเมล",
index 34a58bd..fbe40c2 100644 (file)
        "userlogin-resetlink": "Giriş bilgilerinizi mi unuttunuz?",
        "userlogin-resetpassword-link": "Parolanızı mı unuttunuz?",
        "userlogin-helplink2": "Oturum açma konusunda yardım alın",
-       "userlogin-loggedin": "Zaten {{GENDER:$1|$1}} olarak oturum açtınız.\nBaşka bir kullanıcı olarak oturum açmak için aşağıdaki formu kullanın.",
-       "userlogin-createanother": "Başka bir hesap oluşturun",
        "createacct-emailrequired": "E-posta adresi",
        "createacct-emailoptional": "E-posta adresi (isteğe bağlı)",
        "createacct-email-ph": "E-posta adresinizi girin",
index c5fceb9..9ed3a4d 100644 (file)
        "userlogin-resetlink": "Забули дані, потрібні для входу?",
        "userlogin-resetpassword-link": "Забули пароль?",
        "userlogin-helplink2": "Допомога з входом у систему",
-       "userlogin-loggedin": "Ви вже увійшли як {{GENDER:$1|$1}}.\nВикористайте нижче форму для входу як інший користувач.",
-       "userlogin-createanother": "Створити інший обліковий запис",
        "createacct-emailrequired": "Адреса електронної пошти",
        "createacct-emailoptional": "Адреса електронної пошти (не обов'язково)",
        "createacct-email-ph": "Введіть Вашу адресу електронної пошти",
        "shown-title": "Показувати $1 {{PLURAL:$1|запис|записи|записів}} на сторінці",
        "viewprevnext": "Переглянути ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''У цій вікі є сторінка з назвою «[[:$1]]»'''",
-       "searchmenu-new": "<strong>Створити сторінку «[[:$1]]» у цьому вікі-проекті!</strong>\n{{PLURAL:$2|0=|Див. також сторінку, знайдену по результатами вашого пошуку.|Див. також знайдені результати пошуку.}}",
+       "searchmenu-new": "<strong>Створити сторінку «[[:$1]]» у цьому вікіпроекті!</strong>\n{{PLURAL:$2|0=|Див. також сторінку, знайдену за результатами вашого пошуку.|Див. також знайдені результати пошуку.}}",
        "searchprofile-articles": "Статті",
        "searchprofile-images": "Мультимедіа",
        "searchprofile-everything": "Усюди",
index 5a6c870..c140890 100644 (file)
        "gotaccountlink": "登录",
        "userlogin-resetlink": "忘记登录细节?",
        "userlogin-resetpassword-link": "转设密码",
-       "userlogin-loggedin": "你侬用{{GENDER:$1|$1}}登进来哉。用下向个表以别样身份登进。",
-       "userlogin-createanother": "建别样账号",
        "createacct-emailrequired": "电子信地址",
        "createacct-emailoptional": "电子信地址(填弗填由你)",
        "createacct-email-ph": "畀你侬个电子信地址打进去",
index 2635330..f07949a 100644 (file)
        "userlogin-resetlink": "פארגעסן אײַערע אַרײַנלאָגירן פרטים?",
        "userlogin-resetpassword-link": "פֿאַרגעסן אײַער פאַסווארט?",
        "userlogin-helplink2": "הילף מיט ארײַנלאגירן",
-       "userlogin-loggedin": "איר זענט שוין אריינלאגירט ווי {{GENDER:$1|$1}}.\nניצט די פארעם אונטן כדי אריינלאגירן ווי אן אנדער באניצער.",
-       "userlogin-createanother": "שאפֿן נאך א קאנטע",
        "createacct-emailrequired": "בליצפּאָסט אַדרעס",
        "createacct-emailoptional": "בליצפאסט אדרעס (אפציאנאל)",
        "createacct-email-ph": "קלאַפט ארײַן אײַער בליצפּאָסט אַדרעס",
        "showpreview": "ווײַזן פֿאָרױסקוק",
        "showdiff": "ווײַז די ענדערונגען",
        "blankarticle": "<strong>אזהרה:</strong> דער בלאט איר גייט שאפן איז ליידיק.\nטאמער איר וועט דריקן אויף \"{{int:savearticle}}\" נאכאמאל, וועט דער בלאט ווערן געשאפן אן קיין אינהאלט.",
-       "anoneditwarning": "'''ווארענונג:''' איר זענט נישט אריינלאגירט אין אייער קאנטע. אייער איי פי אדרעס וועט ווערן דאקומענטירט אין דעם בלאטס היסטאריע פון ענדערונגען. אויב זארגט איר זיך פאר פריוואטקייטן, ביטע טוט זיך אריינלאגירן.",
+       "anoneditwarning": "<strong>ווארענונג:</strong> איר זענט נישט אריינלאגירט. אייער איי פי אדרעס וועט ווערן עפנטלעך זעבאר ווען איר פירט דורך  ענדערונגען . אז איר <strong>[$1 לאגירט ארײַן]</strong> אדער <strong>[$2 שאפט א קאנטע]</strong>, וועלן אײַערע רעדאקטירונגען ווערן צוגעשריבן צו אײַער באניצער-נאמען, ווי אויך אנדערע טובות.",
        "anonpreviewwarning": "''איר זענט נישט אַרײַנלאגירט. אויפֿהיטן וועט ארײַנשרײַבן אײַער IP אַדרעס אין דער רעדאַקטירונג היסטאריע פונעם בלאַט.''",
        "missingsummary": "'''דערמאנונג:''' איר האט נישט אויסגעפילט דעם קורץ ווארט אויפקלערונג אויף אייער עדיט. אויב וועט איר דרוקן נאכאמאל אויף  \"היט אפ דעם בלאט\", וועט אייער ענדערונג ווערן געהיטן אן דעם.",
        "missingcommenttext": "ביטע שטעלט אריין א אנמערקונג פון אונטן.",
        "sp-contributions-search": "זוכן בײַשטײַערונגען",
        "sp-contributions-username": "באניצער נאמען אדער IP אדרעס:",
        "sp-contributions-toponly": "בלויז ווײַזן רעדאַקטירונגען וואָס זענען די לעצטיקע רעוויזיעס",
-       "sp-contributions-newonly": "בלוז ווײַזן רעדאקטירונגען וואס זענען נײַ־געשאפענע בלעטער",
+       "sp-contributions-newonly": "×\91×\9c×\95×\99×\96 ×\95×\95ײַ×\96×\9f ×¨×¢×\93×\90ק×\98×\99ר×\95× ×\92×¢×\9f ×\95×\95×\90ס ×\96×¢× ×¢×\9f × ×²Ö·Ö¾×\92עש×\90פענע ×\91×\9c×¢×\98ער",
        "sp-contributions-submit": "זוכן",
        "whatlinkshere": "װאָס פֿאַרבינדט אַהער",
        "whatlinkshere-title": "בלעטער וואס פֿארבינדן צו $1",
index 055ab1b..88b051e 100644 (file)
        "userlogin-resetlink": "忘记你的登录信息?",
        "userlogin-resetpassword-link": "忘记密码?",
        "userlogin-helplink2": "登录帮助",
-       "userlogin-loggedin": "您已经以{{GENDER:$1|$1}}的身份登录。使用下面的表格以其他用户的身份登录。",
-       "userlogin-createanother": "创建另一个账户",
        "createacct-emailrequired": "电子邮件地址",
        "createacct-emailoptional": "电子邮件地址(可选)",
        "createacct-email-ph": "请输入你的电子邮件地址",
        "showpreview": "显示预览",
        "showdiff": "显示更改",
        "blankarticle": "<strong>警告</strong>:您创建的页面是空白的。如果您再次点击“{{int:savearticle}}”,您将真的创建没有任何内容的页面。",
-       "anoneditwarning": "<strong>警告:</strong>您没有登录。您的IP地址将被记录在该页面的编辑历史中。",
+       "anoneditwarning": "<strong>警告:</strong>您没有登录。您做出任何编辑后您的IP地址会公开可见。如果您<strong>[$1 登陆]</strong>或<strong>[$2 注册]</strong>一个账户,您的编辑将归属于您的用户名,以及有其他好处。",
        "anonpreviewwarning": "<em>你没有登录。保存会记录你的IP地址于该页面的编辑历史中。</em>",
        "missingsummary": "'''提示:'''你没有提供编辑摘要。如果你再次点击“{{int:savearticle}}”,你的编辑将不带编辑摘要保存。",
        "missingcommenttext": "请在下面输入评论。",
        "expand_templates_intro": "此特殊页面可以递归地展开所给文本中的模板。\n它同时还可展开诸如<nowiki>{{</nowiki>#language:...}}的解析器函数和诸如<nowiki>{{</nowiki>CURRENTDAY}}的变量。\n实际上,几乎所有在双重花括号中的内容都会被展开。",
        "expand_templates_title": "上下文标题,用于{{FULLPAGENAME}}等:",
        "expand_templates_input": "输入文本:",
-       "expand_templates_output": "结果",
+       "expand_templates_output": "结果",
        "expand_templates_xml_output": "XML输出",
        "expand_templates_html_output": "原始HTML输出",
        "expand_templates_ok": "确定",
index f9cff93..f48eb1f 100644 (file)
@@ -68,7 +68,7 @@
        "tog-usenewrc": "依最近變更與監視清單頁面分類顯示變更",
        "tog-numberheadings": "標題自動編號",
        "tog-showtoolbar": "顯示編輯工具列",
-       "tog-editondblclick": "啟用滑鼠雙擊編輯頁面",
+       "tog-editondblclick": "開啟滑鼠雙擊編輯頁面",
        "tog-editsectiononrightclick": "開啟滑鼠右鍵點選章節標題編輯",
        "tog-watchcreations": "將我建立的頁面和上傳的檔案加入監視清單",
        "tog-watchdefault": "將我編輯的頁面和檔案新增至監視清單",
        "userlogin-resetlink": "您忘記了登入的詳細資訊?",
        "userlogin-resetpassword-link": "忘記密碼?",
        "userlogin-helplink2": "登入協助",
-       "userlogin-loggedin": "您目前已登入 {{GENDER:$1|$1}} 使用者,\n請使用下列表單改登入另一位使用者。",
-       "userlogin-createanother": "建立另一個帳號",
        "createacct-emailrequired": "電子郵件位址",
        "createacct-emailoptional": "電子郵件位址 (選填)",
        "createacct-email-ph": "輸入您的電子郵件位址",
        "showpreview": "顯示預覽",
        "showdiff": "顯示變更",
        "blankarticle": "<strong>警告:</strong>您正在建立的頁面是空白的。\n如果您再按一下\"{{int:savearticle}}\",將建立沒有任何內容的頁面。",
-       "anoneditwarning": "<strong>警告:</strong>您尚未登入。\n您的 IP 位址將記錄在此頁的編輯歷史中。",
+       "anoneditwarning": "<strong>警告:</strong>您尚未登入。 若您進行任何的編輯您的 IP 位置將會被公開。 若您 <strong>[$1 登入]</strong> 或 <strong>[$2 建立帳號]</strong>,您的編輯將會以您的使用者名稱標示,擁有其他優點。",
        "anonpreviewwarning": "<em>您尚未登入。儲存頁面會將您的 IP 位址記錄在此頁面的編輯歷史中。</em>",
        "missingsummary": "<strong>提醒:</strong>您未填寫編輯摘要。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過摘要直接儲存您的編輯。",
        "missingcommenttext": "請在下方輸入評論。",
        "postedit-confirmation-saved": "您的編輯已儲存。",
        "edit-already-exists": "無法建立新頁面。\n該頁面已存在。",
        "defaultmessagetext": "預設訊息文字",
-       "content-failed-to-parse": "析 $2 格式的 $1 語法內容失敗:$3",
+       "content-failed-to-parse": "析 $2 格式的 $1 語法內容失敗:$3",
        "invalid-content-data": "內容資料無效",
        "content-not-allowed-here": "頁面 [[$2]] 不允許使用 \"$1\" 語法內容",
        "editwarning-warning": "離開此頁面可能會令您遺失之前所作的所有更改。\n若您已經登入,您可在偏好設定的 \"{{int:prefs-editing}}\" 項目關閉此警告。",
        "content-model-text": "純文字",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "expensive-parserfunction-warning": "<strong>警告:</strong>此頁面使用了太多消耗系統資源的析函數。\n\n使用次數應小於 $2 次,但目前使用了 $1 次。",
+       "expensive-parserfunction-warning": "<strong>警告:</strong>此頁面使用了太多消耗系統資源的析函數。\n\n使用次數應小於 $2 次,但目前使用了 $1 次。",
        "expensive-parserfunction-category": "使用了太多消耗系統資源的分析函數的頁面",
        "post-expand-template-inclusion-warning": "<strong>警告:</strong>引用樣板後大小超出限制。\n部份樣版內容將不會被使用。",
        "post-expand-template-inclusion-category": "引用樣板後大小超出限制的頁面",
        "illegal-filename": "不允許使用的檔案名稱。",
        "overwrite": "不允許覆蓋現有檔案。",
        "unknown-error": "發生不明錯誤。",
-       "tmp-create-error": "無法建立臨時檔案。",
+       "tmp-create-error": "無法建立暫存檔案。",
        "tmp-write-error": "寫入臨時檔案發生錯誤。",
        "large-file": "建議的檔案大小上限為 $1;\n此檔案為 $2。",
        "largefileserver": "此檔案大小超出伺服器設定的允許範圍。",
-       "emptyfile": "您上傳的檔案為空的。\n可能是檔案名輸入錯誤。\n請檢查您是否真的要上傳空檔案。",
+       "emptyfile": "您上傳的檔案為空的。\n可能是檔案名輸入錯誤。\n請檢查您是否真的要上傳空檔案。",
        "windows-nonascii-filename": "本 Wiki 不支援使用特殊符號的檔案名稱。",
        "fileexists": "已存在相同名稱的檔案,若{{GENDER:|您}}不確定是否要變更它,請檢查 <strong>[[:$1]]</strong>。\n[[$1|thumb]]",
        "filepageexists": "此檔案的描述頁面 <strong>[[:$1]]</strong> 已存在,但目前沒有使用此名稱的檔案。\n您在此輸入的摘要不會儲存到該描述頁面,\n您必須手動編輯該描述頁面。\n[[$1|thumb]]",
        "upload-proto-error": "通訊協定不正確",
        "upload-proto-error-text": "遠端上傳檔案需要使用以 <code>http://</code> 或 <code>ftp://</code> 開頭的 URL。",
        "upload-file-error": "內部錯誤",
-       "upload-file-error-text": "嘗試在伺服器上建立臨時檔案時發生內部錯誤。\n請連絡 [[Special:ListUsers/sysop|管理員]]。",
+       "upload-file-error-text": "嘗試在伺服器上建立暫存檔案時發生內部錯誤。\n請連絡 [[Special:ListUsers/sysop|管理員]]。",
        "upload-misc-error": "不明的上傳錯誤",
        "upload-misc-error-text": "上傳時發生不明錯誤。\n請檢查您的 URL 是否有效且可存取,然後再重試一次。\n如果仍有問題,請聯絡 [[Special:ListUsers/sysop|管理員]]。",
        "upload-too-many-redirects": "該 URL 重新導向至太多其他位址",
        "listfiles-summary": "此特殊頁面顯示所有已上傳的檔案。",
        "listfiles_search_for": "搜尋媒體名稱:",
        "imgfile": "檔案",
-       "listfiles": "檔案列表",
+       "listfiles": "檔案清單",
        "listfiles_thumb": "縮圖",
        "listfiles_date": "日期",
        "listfiles_name": "名稱",
        "index-category-desc": "命名空間允許,且含有魔術字 <code><nowiki>__INDEX__</nowiki></code> 被機器人列入索引的頁面。",
        "post-expand-template-inclusion-category-desc": "展開樣版後大小超過 <code>$wgMaxArticleSize</code> 導致部份樣版未正常展開的頁面。",
        "post-expand-template-argument-category-desc": "展開樣版參數後大小超過 <code>$wgMaxArticleSize</code> 的頁面 (有些於三括號中,如 <code>{{{Foo}}}</code>)。",
-       "expensive-parserfunction-category-desc": "頁面使用太多消耗系統資源的析器函數 (如 <code>#ifexist</code>)。\n請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]。",
+       "expensive-parserfunction-category-desc": "頁面使用太多消耗系統資源的析器函數 (如 <code>#ifexist</code>)。\n請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]。",
        "broken-file-category-desc": "含有損壞檔案連結的頁面 (內嵌檔案連結的檔案不存在)。",
        "hidden-category-category-desc": "內容中使用 <code><nowiki>__HIDDENCAT__</nowiki></code> 的分類,可隱藏預設在頁面上顯示的分類連結方塊。",
        "trackingcategories-nodesc": "沒有可用的描述。",
        "actionfailed": "操作失敗",
        "deletedtext": "已刪除 \"$1\"。\n請參考 $2 檢視最近的刪除記錄。",
        "dellogpage": "刪除日誌",
-       "dellogpagetext": "以下為最近刪除記錄的列表。",
+       "dellogpagetext": "以下為最近刪除記錄的清單。",
        "deletionlog": "刪除日誌",
        "reverted": "還原到較早的版本",
        "deletecomment": "原因:",
        "sessionfailure-title": "連線階段失敗",
        "sessionfailure": "似乎您的登入會話有問題;\n為了防止會話劫持,這個操作已經被取消。\n請返回先前的頁面,重新載入該頁面,然後重試。",
        "protectlogpage": "保護日誌",
-       "protectlogtext": "以下為變更頁面保護的列表。\n請參考 [[Special:ProtectedPages|受保護頁面列表]] 檢視目前受保護頁面。",
+       "protectlogtext": "以下為變更頁面保護的清單。\n請參考 [[Special:ProtectedPages|受保護頁面清單]] 檢視目前受保護頁面。",
        "protectedarticle": "已保護 \"[[$1]]\"",
        "modifiedarticleprotection": "已變更 \"[[$1]]\" 的保護層級",
        "unprotectedarticle": "已解除 \"[[$1]]\" 的保護",
        "thumbnail_error_remote": "來自 $1 錯誤訊息:\n$2",
        "djvu_page_error": "DjVu 頁面超出範圍",
        "djvu_no_xml": "無法在 DjVu 檔案中擷取 XML",
-       "thumbnail-temp-create": "無法建立臨時縮圖檔案",
+       "thumbnail-temp-create": "無法建立暫存縮圖檔案",
        "thumbnail-dest-create": "無法儲存縮圖至目標",
        "thumbnail_invalid_params": "無效的縮圖參數",
        "thumbnail_dest_directory": "無法建立目標目錄",
        "importsuccess": "已完成匯入!",
        "importnosources": "未定義任何 Transwiki 匯入來源且已關閉使用歷史記錄上傳功能。",
        "importnofile": "未上傳匯入檔案。",
-       "importuploaderrorsize": "上匯入檔案失敗。\n檔案大小超過允許上傳大小。",
-       "importuploaderrorpartial": "上匯入檔案失敗。\n僅上傳部份檔案。",
-       "importuploaderrortemp": "上載匯入檔案失敗。\n遺失臨時資料夾。",
-       "import-parse-failure": "XML 匯入析失敗",
+       "importuploaderrorsize": "上匯入檔案失敗。\n檔案大小超過允許上傳大小。",
+       "importuploaderrorpartial": "上匯入檔案失敗。\n僅上傳部份檔案。",
+       "importuploaderrortemp": "上傳匯入檔案失敗。\n遺失暫存資料夾。",
+       "import-parse-failure": "XML 匯入析失敗",
        "import-noarticle": "沒有任何可匯入的頁面!",
        "import-nonewrevisions": "未匯入任何修訂 (修訂已存在,或因錯誤跳過)。",
        "xml-error-string": "$1 於行 $2,欄 $3 ($4 位元組):$5",
        "tooltip-t-contributions": "此使用者的貢獻清單",
        "tooltip-t-emailuser": "傳送電子郵件給這個使用者",
        "tooltip-t-upload": "上傳檔案",
-       "tooltip-t-specialpages": "全部特殊頁面的列表",
+       "tooltip-t-specialpages": "全部特殊頁面的清單",
        "tooltip-t-print": "此頁面的可列印版本",
        "tooltip-t-permalink": "此頁面修訂的靜態連結",
        "tooltip-ca-nstab-main": "檢視頁面內容",
        "version-extensions": "已安裝的擴充套件",
        "version-skins": "已安裝的外觀",
        "version-specialpages": "特殊頁面",
-       "version-parserhooks": "èª\9eæ³\95連結(Hook)",
+       "version-parserhooks": "解æ\9e\90å\99¨連結(Hook)",
        "version-variables": "變數",
        "version-antispam": "垃圾訊息防止",
        "version-other": "其他",
        "version-mediahandlers": "媒體處理器",
        "version-hooks": "連結(Hooks)",
-       "version-parser-extensiontags": "èª\9eæ³\95擴充標籤",
+       "version-parser-extensiontags": "解æ\9e\90å\99¨擴充標籤",
        "version-parser-function-hooks": "語法函數連結",
        "version-hook-name": "連結名稱",
        "version-hook-subscribedby": "署名",
        "api-error-http": "內部錯誤:無法連線到伺服器。",
        "api-error-illegal-filename": "不允許使用的檔案名稱。",
        "api-error-internal-error": "內部錯誤:此 Wiki 在處理你的上傳時發生錯誤。",
-       "api-error-invalid-file-key": "內部錯誤:於臨時儲存庫中查無檔案。",
+       "api-error-invalid-file-key": "內部錯誤:於暫存儲存庫中查無檔案。",
        "api-error-missingparam": "內部錯誤:請求缺少參數。",
        "api-error-missingresult": "內部錯誤:無法辨識複製是否成功。",
        "api-error-mustbeloggedin": "您必須登入方可上傳檔案。",
        "api-error-overwrite": "不允許覆蓋已存在的檔案。",
        "api-error-stashfailed": "內部錯誤:伺服器儲存暫存檔案失敗。",
        "api-error-publishfailed": "內部錯誤:伺服器發佈暫存檔案失敗。",
-       "api-error-stasherror": "上檔案至儲存庫時發生錯誤。",
+       "api-error-stasherror": "上檔案至儲存庫時發生錯誤。",
        "api-error-timeout": "伺服器沒有在預期的時間內回應。",
        "api-error-unclassified": "發生不明錯誤。",
        "api-error-unknown-code": "不明錯誤:\"$1\"。",
        "duration-centuries": "$1 世紀",
        "duration-millennia": "$1 千年",
        "rotate-comment": "已順時針旋轉圖片 $1 {{PLURAL:$1|度|度}}",
-       "limitreport-title": "析器分析資料:",
+       "limitreport-title": "析器分析資料:",
        "limitreport-cputime": "CPU 使用時間",
        "limitreport-cputime-value": "$1 秒",
        "limitreport-walltime": "實際使用時間",
        "limitreport-templateargumentsize": "樣版參數大小",
        "limitreport-templateargumentsize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
        "limitreport-expansiondepth": "最高展開深度",
-       "limitreport-expensivefunctioncount": "高分析函數次數",
+       "limitreport-expensivefunctioncount": "高消耗解析器函數次數",
        "expandtemplates": "展開樣版",
-       "expand_templates_intro": "本特殊頁面會將文字中的樣版展開,可以包含支援的分析程式語法,如 <code><nowiki>{{</nowiki>#language:…}}</code> 與變數如 <code><nowiki>{{</nowiki>CURRENTDAY}}</code>。\n實際上,絕大部分在雙括號中的內容都會被展開。",
+       "expand_templates_intro": "本特殊頁面會將文字中的樣版展開,可以包含支援的解析器語法,如 <code><nowiki>{{</nowiki>#language:…}}</code> 與變數如 <code><nowiki>{{</nowiki>CURRENTDAY}}</code>。\n實際上,絕大部分在雙括號中的內容都會被展開。",
        "expand_templates_title": "上下文標題,用於 {{FULLPAGENAME}} 等:",
        "expand_templates_input": "輸入文字:",
        "expand_templates_output": "結果",
index 4bb9dc7..5f9f643 100644 (file)
@@ -42,26 +42,29 @@ class FindMissingFiles extends Maintenance {
                $mtime1 = $dbr->timestampOrNull( $this->getOption( 'mtimeafter', null ) );
                $mtime2 = $dbr->timestampOrNull( $this->getOption( 'mtimebefore', null ) );
 
-               $tables = array( 'image' );
-               $logJoinOn = array( 'log_namespace' => NS_FILE, 'log_title = img_name' );
-               $logJoinOn['log_type'] = array( 'upload', 'move', 'delete' );
-               if ( $mtime1 ) {
-                       $logJoinOn[] = "log_timestamp > {$dbr->addQuotes($mtime1)}";
-               }
-               if ( $mtime2 ) {
-                       $logJoinOn[] = "log_timestamp < {$dbr->addQuotes($mtime2)}";
-               }
+               $joinTables = array( 'image' );
+               $joinConds = array( 'image' => array( 'INNER JOIN', 'img_name = page_title' ) );
                if ( $mtime1 || $mtime2 ) {
-                       $tables[] = 'logging';
+                       $joinTables[] = 'logging';
+                       $on = array( 'log_page = page_id', 'log_type' => array( 'upload', 'move', 'delete' ) );
+                       if ( $mtime1 ) {
+                               $on[] = "log_timestamp > {$dbr->addQuotes($mtime1)}";
+                       }
+                       if ( $mtime2 ) {
+                               $on[] = "log_timestamp < {$dbr->addQuotes($mtime2)}";
+                       }
+                       $joinConds['logging'] = array( 'INNER JOIN', $on );
                }
 
                do {
-                       $res = $dbr->select( $tables,
-                               array( 'img_name' => 'DISTINCT(img_name)' ),
-                               array( "img_name >= " . $dbr->addQuotes( $lastName ) ),
+                       $res = $dbr->select(
+                               array_merge( array( 'page' ), $joinTables ),
+                               array( 'img_name' => 'DISTINCT(page_title)' ),
+                               array( 'page_namespace' => NS_FILE,
+                                       "page_title >= " . $dbr->addQuotes( $lastName ) ),
                                __METHOD__,
-                               array( 'ORDER BY' => 'img_name', 'LIMIT' => $this->mBatchSize ),
-                               array( 'logging' => array( 'INNER JOIN', $logJoinOn ) )
+                               array( 'ORDER BY' => 'page_title', 'LIMIT' => $this->mBatchSize ),
+                               $joinConds
                        );
 
                        // Check if any of these files are missing...
@@ -85,14 +88,22 @@ class FindMissingFiles extends Maintenance {
                                        array( 'oi_name' => array_keys( $pathsByName ) ),
                                        __METHOD__
                                );
+
+                               $checkPaths = array();
                                foreach ( $ores as $row ) {
                                        if ( !strlen( $row->oi_archive_name ) ) {
                                                continue; // broken row
                                        }
                                        $file = $repo->newFromArchiveName( $row->oi_name, $row->oi_archive_name );
-                                       $path = $file->getPath();
-                                       if ( $be->fileExists( array( 'src' => $path ) ) === false ) {
-                                               $this->output( "$path\n" );
+                                       $checkPaths[] = $file->getPath();
+                               }
+
+                               foreach ( array_chunk( $checkPaths, $this->mBatchSize ) as $paths ) {
+                                       $be->preloadFileStat( array( 'srcs' => $paths ) );
+                                       foreach ( $paths as $path ) {
+                                               if ( $be->fileExists( array( 'src' => $path ) ) === false ) {
+                                                       $this->output( "$path\n" );
+                                               }
                                        }
                                }
                        }
diff --git a/maintenance/populateBloomCache.php b/maintenance/populateBloomCache.php
new file mode 100644 (file)
index 0000000..40ad5fc
--- /dev/null
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Script to populate a bloom filter with a BloomFilter* 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
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Script to populate a bloom filter with a BloomFilter* class
+ *
+ * @ingroup Maintenance
+ */
+class PopulateBloomFilter extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addOption( 'cache', 'Bloom cache store name', true, true );
+               $this->addOption( 'filter', 'Bloom filter name', true, true );
+               $this->addOption( 'domain', 'Bloom filter domain', true, true );
+               $this->addOption( 'delay', 'Sleep delay between batches (us)', false, true );
+               $this->mDescription = "Populate the specified bloom filter";
+       }
+
+       public function execute() {
+               $type = $this->getOption( 'filter' );
+               $domain = $this->getOption( 'domain' );
+               $bcache = BloomCache::get( $this->getOption( 'cache' ) );
+               $delay = $this->getOption( 'delay', 1e5 );
+
+               if ( !method_exists( "BloomFilter{$type}", 'merge' ) ) {
+                       $this->error( "No \"BloomFilter{$type}::merge\" method found.", 1 );
+               }
+
+               $virtualKey = "$domain:$type";
+               $status = $bcache->getStatus( $virtualKey );
+               if ( $status == false ) {
+                       $this->error( "Could not query virtual bloom filter '$virtualKey'.", 1 );
+               }
+
+               $startTime = microtime( true );
+               $this->output( "Current timestamp is '$startTime'.\n" );
+               $this->output( "Current filter timestamp is '{$status['asOfTime']}'.\n" );
+
+               do {
+                       $status = call_user_func_array(
+                               array( "BloomFilter{$type}", 'merge' ),
+                               array( $bcache, $domain, $virtualKey, $status )
+                       );
+                       if ( $status == false ) {
+                               $this->error( "Could not query virtual bloom filter '$virtualKey'.", 1 );
+                       }
+                       $this->output( "Filter updated to timestamp '{$status['asOfTime']}'.\n" );
+                       usleep( $delay );
+               } while ( $status['asOfTime'] && $status['asOfTime'] < $startTime );
+
+               $this->output( "Done, filter $type of domain $domain reached time '$startTime'.\n" );
+       }
+}
+
+$maintClass = "PopulateBloomFilter";
+require_once RUN_MAINTENANCE_IF_MAIN;
index 4a9827a..eb36ee5 100644 (file)
@@ -920,6 +920,10 @@ return array(
                'scripts' => 'resources/src/mediawiki/mediawiki.notify.js',
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'mediawiki.pager.tablePager' => array(
+               'styles' => 'resources/src/mediawiki/mediawiki.pager.tablePager.less',
+               'position' => 'top',
+       ),
        'mediawiki.searchSuggest' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.searchSuggest.js',
                'styles' => 'resources/src/mediawiki/mediawiki.searchSuggest.css',
@@ -1032,6 +1036,7 @@ return array(
                ),
        ),
        'mediawiki.action.view.metadata' => array(
+               'styles' => 'resources/src/mediawiki.action/mediawiki.action.view.metadata.css',
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.metadata.js',
                'messages' => array(
                        'metadata-expand',
@@ -1106,6 +1111,11 @@ return array(
                                'mediawiki.cldr',
                        ),
                'targets' => array( 'desktop', 'mobile' ),
+               'messages' => array(
+                       'and',
+                       'comma-separator',
+                       'word-separator'
+               ),
        ),
 
        'mediawiki.cldr' => array(
@@ -1407,24 +1417,18 @@ return array(
        /* MediaWiki Legacy */
 
        'mediawiki.legacy.ajax' => array(
-               'scripts' => 'common/ajax.js',
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+               'scripts' => 'resources/src/mediawiki.legacy/ajax.js',
                'dependencies' => array(
                        'mediawiki.util',
                        'mediawiki.legacy.wikibits',
                ),
-               'position' => 'top', // Temporary hack for legacy support
+               'position' => 'top',
        ),
        'mediawiki.legacy.commonPrint' => array(
-               'styles' => array( 'common/commonPrint.css' => array( 'media' => 'print' ) ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+               'styles' => array( 'resources/src/mediawiki.legacy/commonPrint.css' => array( 'media' => 'print' ) ),
        ),
        'mediawiki.legacy.protect' => array(
-               'scripts' => 'common/protect.js',
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+               'scripts' => 'resources/src/mediawiki.legacy/protect.js',
                'dependencies' => array(
                        'jquery.byteLimit',
                ),
@@ -1432,19 +1436,13 @@ return array(
        ),
        'mediawiki.legacy.shared' => array(
                // Used in the web installer. Test it after modifying this definition!
-               'styles' => array( 'common/shared.css' => array( 'media' => 'screen' ) ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+               'styles' => array( 'resources/src/mediawiki.legacy/shared.css' => array( 'media' => 'screen' ) ),
        ),
        'mediawiki.legacy.oldshared' => array(
-               'styles' => array( 'common/oldshared.css' => array( 'media' => 'screen' ) ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+               'styles' => array( 'resources/src/mediawiki.legacy/oldshared.css' => array( 'media' => 'screen' ) ),
        ),
        'mediawiki.legacy.upload' => array(
-               'scripts' => 'common/upload.js',
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+               'scripts' => 'resources/src/mediawiki.legacy/upload.js',
                'dependencies' => array(
                        'jquery.spinner',
                        'mediawiki.api',
@@ -1453,9 +1451,7 @@ return array(
                ),
        ),
        'mediawiki.legacy.wikibits' => array(
-               'scripts' => 'common/wikibits.js',
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+               'scripts' => 'resources/src/mediawiki.legacy/wikibits.js',
                'dependencies' => array(
                        'mediawiki.util',
                ),
index 71f2f55..4eaf611 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs v1.0.12 optimised for jQuery
+ * OOjs v1.1.0 optimised for jQuery
  * https://www.mediawiki.org/wiki/OOjs
  *
  * Copyright 2011-2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-08-20T22:33:41Z
+ * Date: 2014-08-31T21:15:46Z
  */
 ( function ( global ) {
 
@@ -37,16 +37,16 @@ oo.initClass = function ( fn ) {
 };
 
 /**
- * Utility for common usage of Object#create for inheriting from one
- * prototype to another.
+ * Inherit from prototype to another using Object#create.
  *
  * Beware: This redefines the prototype, call before setting your prototypes.
+ *
  * Beware: This redefines the prototype, can only be called once on a function.
- *  If called multiple times on the same function, the previous prototype is lost.
- *  This is how prototypal inheritance works, it can only be one straight chain
- *  (just like classical inheritance in PHP for example). If you need to work with
- *  multiple constructors consider storing an instance of the other constructor in a
- *  property instead, or perhaps use a mixin (see OO.mixinClass).
+ * If called multiple times on the same function, the previous prototype is lost.
+ * This is how prototypal inheritance works, it can only be one straight chain
+ * (just like classical inheritance in PHP for example). If you need to work with
+ * multiple constructors consider storing an instance of the other constructor in a
+ * property instead, or perhaps use a mixin (see OO.mixinClass).
  *
  *     function Thing() {}
  *     Thing.prototype.exists = function () {};
@@ -103,13 +103,15 @@ oo.inheritClass = function ( targetFn, originFn ) {
 };
 
 /**
- * Utility to copy over *own* prototype properties of a mixin.
+ * Copy over *own* prototype properties of a mixin.
+ *
  * The 'constructor' (whether implicit or explicit) is not copied over.
  *
  * This does not create inheritance to the origin. If inheritance is needed
  * use oo.inheritClass instead.
  *
  * Beware: This can redefine a prototype property, call before setting your prototypes.
+ *
  * Beware: Don't call before oo.inheritClass.
  *
  *     function Foo() {}
@@ -216,7 +218,7 @@ oo.getObjectValues = function ( obj ) {
 };
 
 /**
- * Recursively compares properties between two objects.
+ * Recursively compare properties between two objects.
  *
  * A false result may be caused by property inequality or by properties in one object missing from
  * the other. An asymmetrical test may also be performed, which checks only that properties in the
@@ -224,8 +226,8 @@ oo.getObjectValues = function ( obj ) {
  *
  * If either a or b is null or undefined it will be treated as an empty object.
  *
- * @param {Object|undefined} a First object to compare
- * @param {Object|undefined} b Second object to compare
+ * @param {Object|undefined|null} a First object to compare
+ * @param {Object|undefined|null} b Second object to compare
  * @param {boolean} [asymmetrical] Whether to check only that b contains values from a
  * @return {boolean} If the objects contain the same values as each other
  */
@@ -330,7 +332,7 @@ oo.getHash = function ( val ) {
 };
 
 /**
- * Helper function for OO.getHash which sorts objects by key.
+ * Sort objects by key (helper function for OO.getHash).
  *
  * This is a callback passed into JSON.stringify.
  *
@@ -460,253 +462,259 @@ oo.isPlainObject = $.isPlainObject;
 
 /*global hasOwn */
 
-/**
- * @class OO.EventEmitter
- *
- * @constructor
- */
-oo.EventEmitter = function OoEventEmitter() {
-       // Properties
+( function () {
 
        /**
-        * Storage of bound event handlers by event name.
+        * @class OO.EventEmitter
         *
-        * @property
+        * @constructor
         */
-       this.bindings = {};
-};
+       oo.EventEmitter = function OoEventEmitter() {
+               // Properties
 
-oo.initClass( oo.EventEmitter );
-
-/* Methods */
+               /**
+                * Storage of bound event handlers by event name.
+                *
+                * @property
+                */
+               this.bindings = {};
+       };
 
-/**
- * Add a listener to events of a specific event.
- *
- * The listener can be a function or the string name of a method; if the latter, then the
- * name lookup happens at the time the listener is called.
- *
- * @param {string} event Type of event to listen to
- * @param {Function|string} method Function or method name to call when event occurs
- * @param {Array} [args] Arguments to pass to listener, will be prepended to emitted arguments
- * @param {Object} [context=null] Context object for function or method call
- * @throws {Error} Listener argument is not a function or a valid method name
- * @chainable
- */
-oo.EventEmitter.prototype.on = function ( event, method, args, context ) {
-       var bindings;
+       oo.initClass( oo.EventEmitter );
 
-       this.constructor.static.validateMethod( method, context );
+       /* Private helper functions */
 
-       if ( hasOwn.call( this.bindings, event ) ) {
-               bindings = this.bindings[event];
-       } else {
-               // Auto-initialize bindings list
-               bindings = this.bindings[event] = [];
+       /**
+        * Validate a function or method call in a context
+        *
+        * For a method name, check that it names a function in the context object
+        *
+        * @private
+        * @param {Function|string} method Function or method name
+        * @param {Mixed} context The context of the call
+        * @throws {Error} A method name is given but there is no context
+        * @throws {Error} In the context object, no property exists with the given name
+        * @throws {Error} In the context object, the named property is not a function
+        */
+       function validateMethod( method, context ) {
+               // Validate method and context
+               if ( typeof method === 'string' ) {
+                       // Validate method
+                       if ( context === undefined || context === null ) {
+                               throw new Error( 'Method name "' + method + '" has no context.' );
+                       }
+                       if ( !( method in context ) ) {
+                               // Technically the method does not need to exist yet: it could be
+                               // added before call time. But this probably signals a typo.
+                               throw new Error( 'Method not found: "' + method + '"' );
+                       }
+                       if ( typeof context[method] !== 'function' ) {
+                               // Technically the property could be replaced by a function before
+                               // call time. But this probably signals a typo.
+                               throw new Error( 'Property "' + method + '" is not a function' );
+                       }
+               } else if ( typeof method !== 'function' ) {
+                       throw new Error( 'Invalid callback. Function or method name expected.' );
+               }
        }
-       // Add binding
-       bindings.push( {
-               method: method,
-               args: args,
-               context: ( arguments.length < 4 ) ? null : context
-       } );
-       return this;
-};
 
-/**
- * Adds a one-time listener to a specific event.
- *
- * @param {string} event Type of event to listen to
- * @param {Function} listener Listener to call when event occurs
- * @chainable
- */
-oo.EventEmitter.prototype.once = function ( event, listener ) {
-       var eventEmitter = this,
-               listenerWrapper = function () {
-                       eventEmitter.off( event, listenerWrapper );
-                       listener.apply( eventEmitter, Array.prototype.slice.call( arguments, 0 ) );
-               };
-       return this.on( event, listenerWrapper );
-};
+       /* Methods */
 
-/**
- * Remove a specific listener from a specific event.
- *
- * @param {string} event Type of event to remove listener from
- * @param {Function|string} [method] Listener to remove. Must be in the same form as was passed
- * to "on". Omit to remove all listeners.
- * @param {Object} [context=null] Context object function or method call
- * @chainable
- * @throws {Error} Listener argument is not a function or a valid method name
- */
-oo.EventEmitter.prototype.off = function ( event, method, context ) {
-       var i, bindings;
+       /**
+        * Add a listener to events of a specific event.
+        *
+        * The listener can be a function or the string name of a method; if the latter, then the
+        * name lookup happens at the time the listener is called.
+        *
+        * @param {string} event Type of event to listen to
+        * @param {Function|string} method Function or method name to call when event occurs
+        * @param {Array} [args] Arguments to pass to listener, will be prepended to emitted arguments
+        * @param {Object} [context=null] Context object for function or method call
+        * @throws {Error} Listener argument is not a function or a valid method name
+        * @chainable
+        */
+       oo.EventEmitter.prototype.on = function ( event, method, args, context ) {
+               var bindings;
 
-       if ( arguments.length === 1 ) {
-               // Remove all bindings for event
-               delete this.bindings[event];
+               validateMethod( method, context );
+
+               if ( hasOwn.call( this.bindings, event ) ) {
+                       bindings = this.bindings[event];
+               } else {
+                       // Auto-initialize bindings list
+                       bindings = this.bindings[event] = [];
+               }
+               // Add binding
+               bindings.push( {
+                       method: method,
+                       args: args,
+                       context: ( arguments.length < 4 ) ? null : context
+               } );
                return this;
-       }
+       };
 
-       this.constructor.static.validateMethod( method, context );
+       /**
+        * Add a one-time listener to a specific event.
+        *
+        * @param {string} event Type of event to listen to
+        * @param {Function} listener Listener to call when event occurs
+        * @chainable
+        */
+       oo.EventEmitter.prototype.once = function ( event, listener ) {
+               var eventEmitter = this,
+                       listenerWrapper = function () {
+                               eventEmitter.off( event, listenerWrapper );
+                               listener.apply( eventEmitter, Array.prototype.slice.call( arguments, 0 ) );
+                       };
+               return this.on( event, listenerWrapper );
+       };
 
-       if ( !( event in this.bindings ) || !this.bindings[event].length ) {
-               // No matching bindings
-               return this;
-       }
+       /**
+        * Remove a specific listener from a specific event.
+        *
+        * @param {string} event Type of event to remove listener from
+        * @param {Function|string} [method] Listener to remove. Must be in the same form as was passed
+        * to "on". Omit to remove all listeners.
+        * @param {Object} [context=null] Context object function or method call
+        * @chainable
+        * @throws {Error} Listener argument is not a function or a valid method name
+        */
+       oo.EventEmitter.prototype.off = function ( event, method, context ) {
+               var i, bindings;
 
-       // Default to null context
-       if ( arguments.length < 3 ) {
-               context = null;
-       }
+               if ( arguments.length === 1 ) {
+                       // Remove all bindings for event
+                       delete this.bindings[event];
+                       return this;
+               }
 
-       // Remove matching handlers
-       bindings = this.bindings[event];
-       i = bindings.length;
-       while ( i-- ) {
-               if ( bindings[i].method === method && bindings[i].context === context ) {
-                       bindings.splice( i, 1 );
+               validateMethod( method, context );
+
+               if ( !( event in this.bindings ) || !this.bindings[event].length ) {
+                       // No matching bindings
+                       return this;
                }
-       }
 
-       // Cleanup if now empty
-       if ( bindings.length === 0 ) {
-               delete this.bindings[event];
-       }
-       return this;
-};
+               // Default to null context
+               if ( arguments.length < 3 ) {
+                       context = null;
+               }
 
-/**
- * Emit an event.
- *
- * TODO: Should this be chainable? What is the usefulness of the boolean
- * return value here?
- *
- * @param {string} event Type of event
- * @param {Mixed} args First in a list of variadic arguments passed to event handler (optional)
- * @return {boolean} If event was handled by at least one listener
- */
-oo.EventEmitter.prototype.emit = function ( event ) {
-       var i, len, binding, bindings, args, method;
-
-       if ( event in this.bindings ) {
-               // Slicing ensures that we don't get tripped up by event handlers that add/remove bindings
-               bindings = this.bindings[event].slice();
-               args = Array.prototype.slice.call( arguments, 1 );
-               for ( i = 0, len = bindings.length; i < len; i++ ) {
-                       binding = bindings[i];
-                       if ( typeof binding.method === 'string' ) {
-                               // Lookup method by name (late binding)
-                               method = binding.context[ binding.method ];
-                       } else {
-                               method = binding.method;
+               // Remove matching handlers
+               bindings = this.bindings[event];
+               i = bindings.length;
+               while ( i-- ) {
+                       if ( bindings[i].method === method && bindings[i].context === context ) {
+                               bindings.splice( i, 1 );
                        }
-                       method.apply(
-                               binding.context,
-                               binding.args ? binding.args.concat( args ) : args
-                       );
                }
-               return true;
-       }
-       return false;
-};
 
-/**
- * Connect event handlers to an object.
- *
- * @param {Object} context Object to call methods on when events occur
- * @param {Object.<string,string>|Object.<string,Function>|Object.<string,Array>} methods List of
- *  event bindings keyed by event name containing either method names, functions or arrays containing
- *  method name or function followed by a list of arguments to be passed to callback before emitted
- *  arguments
- * @chainable
- */
-oo.EventEmitter.prototype.connect = function ( context, methods ) {
-       var method, args, event;
-
-       for ( event in methods ) {
-               method = methods[event];
-               // Allow providing additional args
-               if ( Array.isArray( method ) ) {
-                       args = method.slice( 1 );
-                       method = method[0];
-               } else {
-                       args = [];
+               // Cleanup if now empty
+               if ( bindings.length === 0 ) {
+                       delete this.bindings[event];
                }
-               // Add binding
-               this.on( event, method, args, context );
-       }
-       return this;
-};
+               return this;
+       };
 
-/**
- * Disconnect event handlers from an object.
- *
- * @param {Object} context Object to disconnect methods from
- * @param {Object.<string,string>|Object.<string,Function>|Object.<string,Array>} [methods] List of
- * event bindings keyed by event name. Values can be either method names or functions, but must be
- * consistent with those used in the corresponding call to "connect".
- * @chainable
- */
-oo.EventEmitter.prototype.disconnect = function ( context, methods ) {
-       var i, event, bindings;
+       /**
+        * Emit an event.
+        *
+        * TODO: Should this be chainable? What is the usefulness of the boolean
+        * return value here?
+        *
+        * @param {string} event Type of event
+        * @param {Mixed} args First in a list of variadic arguments passed to event handler (optional)
+        * @return {boolean} If event was handled by at least one listener
+        */
+       oo.EventEmitter.prototype.emit = function ( event ) {
+               var i, len, binding, bindings, args, method;
+
+               if ( event in this.bindings ) {
+                       // Slicing ensures that we don't get tripped up by event handlers that add/remove bindings
+                       bindings = this.bindings[event].slice();
+                       args = Array.prototype.slice.call( arguments, 1 );
+                       for ( i = 0, len = bindings.length; i < len; i++ ) {
+                               binding = bindings[i];
+                               if ( typeof binding.method === 'string' ) {
+                                       // Lookup method by name (late binding)
+                                       method = binding.context[ binding.method ];
+                               } else {
+                                       method = binding.method;
+                               }
+                               method.apply(
+                                       binding.context,
+                                       binding.args ? binding.args.concat( args ) : args
+                               );
+                       }
+                       return true;
+               }
+               return false;
+       };
+
+       /**
+        * Connect event handlers to an object.
+        *
+        * @param {Object} context Object to call methods on when events occur
+        * @param {Object.<string,string>|Object.<string,Function>|Object.<string,Array>} methods List of
+        *  event bindings keyed by event name containing either method names, functions or arrays containing
+        *  method name or function followed by a list of arguments to be passed to callback before emitted
+        *  arguments
+        * @chainable
+        */
+       oo.EventEmitter.prototype.connect = function ( context, methods ) {
+               var method, args, event;
 
-       if ( methods ) {
-               // Remove specific connections to the context
                for ( event in methods ) {
-                       this.off( event, methods[event], context );
+                       method = methods[event];
+                       // Allow providing additional args
+                       if ( Array.isArray( method ) ) {
+                               args = method.slice( 1 );
+                               method = method[0];
+                       } else {
+                               args = [];
+                       }
+                       // Add binding
+                       this.on( event, method, args, context );
                }
-       } else {
-               // Remove all connections to the context
-               for ( event in this.bindings ) {
-                       bindings = this.bindings[event];
-                       i = bindings.length;
-                       while ( i-- ) {
-                               // bindings[i] may have been removed by the previous step's
-                               // this.off so check it still exists
-                               if ( bindings[i] && bindings[i].context === context ) {
-                                       this.off( event, bindings[i].method, context );
+               return this;
+       };
+
+       /**
+        * Disconnect event handlers from an object.
+        *
+        * @param {Object} context Object to disconnect methods from
+        * @param {Object.<string,string>|Object.<string,Function>|Object.<string,Array>} [methods] List of
+        * event bindings keyed by event name. Values can be either method names or functions, but must be
+        * consistent with those used in the corresponding call to "connect".
+        * @chainable
+        */
+       oo.EventEmitter.prototype.disconnect = function ( context, methods ) {
+               var i, event, bindings;
+
+               if ( methods ) {
+                       // Remove specific connections to the context
+                       for ( event in methods ) {
+                               this.off( event, methods[event], context );
+                       }
+               } else {
+                       // Remove all connections to the context
+                       for ( event in this.bindings ) {
+                               bindings = this.bindings[event];
+                               i = bindings.length;
+                               while ( i-- ) {
+                                       // bindings[i] may have been removed by the previous step's
+                                       // this.off so check it still exists
+                                       if ( bindings[i] && bindings[i].context === context ) {
+                                               this.off( event, bindings[i].method, context );
+                                       }
                                }
                        }
                }
-       }
 
-       return this;
-};
+               return this;
+       };
 
-/**
- * Validate a function or method call in a context
- *
- * For a method name, check that it names a function in the context object
- *
- * @static
- * @param {Function|string} method Function or method name
- * @param {Mixed} context The context of the call
- * @throws {Error} A method name is given but there is no context
- * @throws {Error} In the context object, no property exists with the given name
- * @throws {Error} In the context object, the named property is not a function
- */
-oo.EventEmitter.static.validateMethod = function ( method, context ) {
-       // Validate method and context
-       if ( typeof method === 'string' ) {
-               // Validate method
-               if ( context === undefined || context === null ) {
-                       throw new Error( 'Method name "' + method + '" has no context.' );
-               }
-               if ( !( method in context ) ) {
-                       // Technically the method does not need to exist yet: it could be
-                       // added before call time. But this probably signals a typo.
-                       throw new Error( 'Method not found: "' + method + '"' );
-               }
-               if ( typeof context[method] !== 'function' ) {
-                       // Technically the property could be replaced by a function before
-                       // call time. But this probably signals a typo.
-                       throw new Error( 'Property "' + method + '" is not a function' );
-               }
-       } else if ( typeof method !== 'function' ) {
-               throw new Error( 'Invalid callback. Function or method name expected.' );
-       }
-};
+}() );
 
 /*global hasOwn */
 
index eacb910..e850276 100644 (file)
                 * by placing buttons in a queue if this method is called before
                 * the toolbar is created.
                 *
-                * For compatiblity, passing the properties listed below as separate arguments
-                * (in the listed order) is also supported.
+                * For backwards-compatibility, passing `imageFile`, `speedTip`, `tagOpen`, `tagClose`,
+                * `sampleText` and `imageId` as separate arguments (in this order) is also supported.
                 *
-                * @param {Object} button Object with the following properties:
-                * @param {string} button.imageFile
-                * @param {string} button.speedTip
-                * @param {string} button.tagOpen
-                * @param {string} button.tagClose
-                * @param {string} button.sampleText
-                * @param {string} [button.imageId]
-                * @param {Function} [button.onClick]
+                * @param {Object} button Object with the following properties.
+                *  You are required to provide *either* the `onClick` parameter, or the three parameters
+                *  `tagOpen`, `tagClose` and `sampleText`, but not both (they're mutually exclusive).
+                * @param {string} button.imageFile Image to use for the button.
+                * @param {string} button.speedTip Tooltip displayed when user mouses over the button.
+                * @param {Function} [button.onClick] Function to be executed when the button is clicked.
+                * @param {string} [button.tagOpen]
+                * @param {string} [button.tagClose]
+                * @param {string} [button.sampleText] Alternative to `onClick`. `tagOpen`, `tagClose` and
+                *  `sampleText` together provide the markup that should be inserted into page text at
+                *  current cursor position.
+                * @param {string} [button.imageId] `id` attribute of the button HTML element.
                 */
                addButton: function () {
                        if ( isReady ) {
diff --git a/resources/src/mediawiki.action/mediawiki.action.view.metadata.css b/resources/src/mediawiki.action/mediawiki.action.view.metadata.css
new file mode 100644 (file)
index 0000000..2c8d2e6
--- /dev/null
@@ -0,0 +1,6 @@
+/*!
+ * Hide collapsable rows in a collapsed table.
+ */
+table.collapsed tr.collapsable {
+       display: none;
+}
index 1b38350..25b5acc 100644 (file)
@@ -4,9 +4,7 @@
  * Add an expand/collapse link and collapse by default if set to
  * (with JS disabled, user will see all items)
  *
- * See also:
- * - ImagePage.php#makeMetadataTable (creates the HTML)
- * - shared.css (hides tr.collapsable inside table.collapsed)
+ * See also ImagePage.php#makeMetadataTable (creates the HTML)
  */
 ( function ( mw, $ ) {
        $( function () {
index a0b5569..2e84858 100644 (file)
@@ -144,8 +144,28 @@ $.extend( mw.language, {
                        return grammarForms[form][word] || word;
                }
                return word;
-       }
+       },
 
+       /**
+        * Turn a list of string into a simple list using commas and 'and'.
+        *
+        * See Language::listToText in languages/Language.php
+        *
+        * @param {string[]} list
+        * @return {string}
+        */
+       listToText: function ( list ) {
+               var text = '', i = 0;
+               for ( ; i < list.length; i++ ) {
+                       text += list[i];
+                       if ( list.length - 2 === i ) {
+                               text += mw.msg( 'and' ) + mw.msg( 'word-separator' );
+                       } else if ( list.length - 1 !== i ) {
+                               text += mw.msg( 'comma-separator' );
+                       }
+               }
+               return text;
+       }
 } );
 
 }( mediaWiki, jQuery ) );
index 56fa0da..8bd2de9 100644 (file)
@@ -34,7 +34,7 @@
        }
 
        /**
-        * Efficiently replicate a string `n` times.
+        * Replicate a string 'n' times.
         *
         * @private
         * @param {string} str The string to replicate
@@ -47,9 +47,8 @@
                }
 
                var buf = [];
-               while (num) {
+               while ( num-- ) {
                        buf.push( str );
-                       str += str;
                }
                return buf.join( '' );
        }
                }
 
                for ( whole = valueParts[0]; whole; ) {
-                       off = whole.length - groupSize;
-
+                       off = groupSize ? whole.length - groupSize : 0;
                        pieces.push( ( off > 0 ) ? whole.substr( off ) : whole );
                        whole = ( off > 0 ) ? whole.slice( 0, off ) : '';
 
                        if ( groupSize2 ) {
                                groupSize = groupSize2;
+                               groupSize2 = null;
                        }
                }
                valueParts[0] = pieces.reverse().join( options.group );
diff --git a/resources/src/mediawiki.legacy/ajax.js b/resources/src/mediawiki.legacy/ajax.js
new file mode 100644 (file)
index 0000000..6b9464a
--- /dev/null
@@ -0,0 +1,194 @@
+/**
+ * Remote Scripting Library
+ * Copyright 2005 modernmethod, inc
+ * Under the open source BSD license
+ * http://www.modernmethod.com/sajax/
+ */
+
+/*jshint camelcase:false */
+/*global alert */
+( function ( mw ) {
+
+/**
+ * if sajax_debug_mode is true, this function outputs given the message into
+ * the element with id = sajax_debug; if no such element exists in the document,
+ * it is injected.
+ */
+function debug( text ) {
+       if ( !window.sajax_debug_mode ) {
+               return false;
+       }
+
+       var b, m,
+               e = document.getElementById( 'sajax_debug' );
+
+       if ( !e ) {
+               e = document.createElement( 'p' );
+               e.className = 'sajax_debug';
+               e.id = 'sajax_debug';
+
+               b = document.getElementsByTagName( 'body' )[0];
+
+               if ( b.firstChild ) {
+                       b.insertBefore( e, b.firstChild );
+               } else {
+                       b.appendChild( e );
+               }
+       }
+
+       m = document.createElement( 'div' );
+       m.appendChild( document.createTextNode( text ) );
+
+       e.appendChild( m );
+
+       return true;
+}
+
+/**
+ * Compatibility wrapper for creating a new XMLHttpRequest object.
+ */
+function createXhr() {
+       debug( 'sajax_init_object() called..' );
+       var a;
+       try {
+               // Try the new style before ActiveX so we don't
+               // unnecessarily trigger warnings in IE 7 when
+               // set to prompt about ActiveX usage
+               a = new XMLHttpRequest();
+       } catch ( xhrE ) {
+               try {
+                       a = new window.ActiveXObject( 'Msxml2.XMLHTTP' );
+               } catch ( msXmlE ) {
+                       try {
+                               a = new window.ActiveXObject( 'Microsoft.XMLHTTP' );
+                       } catch ( msXhrE ) {
+                               a = null;
+                       }
+               }
+       }
+       if ( !a ) {
+               debug( 'Could not create connection object.' );
+       }
+
+       return a;
+}
+
+/**
+ * Perform an AJAX call to MediaWiki. Calls are handled by AjaxDispatcher.php
+ *   func_name - the name of the function to call. Must be registered in $wgAjaxExportList
+ *   args - an array of arguments to that function
+ *   target - the target that will handle the result of the call. If this is a function,
+ *            if will be called with the XMLHttpRequest as a parameter; if it's an input
+ *            element, its value will be set to the resultText; if it's another type of
+ *            element, its innerHTML will be set to the resultText.
+ *
+ * Example:
+ *    sajax_do_call( 'doFoo', [1, 2, 3], document.getElementById( 'showFoo' ) );
+ *
+ * This will call the doFoo function via MediaWiki's AjaxDispatcher, with
+ * (1, 2, 3) as the parameter list, and will show the result in the element
+ * with id = showFoo
+ */
+function doAjaxRequest( func_name, args, target ) {
+       var i, x, uri, post_data;
+       uri = mw.util.wikiScript() + '?action=ajax';
+       if ( window.sajax_request_type === 'GET' ) {
+               if ( uri.indexOf( '?' ) === -1 ) {
+                       uri = uri + '?rs=' + encodeURIComponent( func_name );
+               } else {
+                       uri = uri + '&rs=' + encodeURIComponent( func_name );
+               }
+               for ( i = 0; i < args.length; i++ ) {
+                       uri = uri + '&rsargs[]=' + encodeURIComponent( args[i] );
+               }
+               //uri = uri + '&rsrnd=' + new Date().getTime();
+               post_data = null;
+       } else {
+               post_data = 'rs=' + encodeURIComponent( func_name );
+               for ( i = 0; i < args.length; i++ ) {
+                       post_data = post_data + '&rsargs[]=' + encodeURIComponent( args[i] );
+               }
+       }
+       x = createXhr();
+       if ( !x ) {
+               alert( 'AJAX not supported' );
+               return false;
+       }
+
+       try {
+               x.open( window.sajax_request_type, uri, true );
+       } catch ( e ) {
+               if ( location.hostname === 'localhost' ) {
+                       alert( 'Your browser blocks XMLHttpRequest to "localhost", try using a real hostname for development/testing.' );
+               }
+               throw e;
+       }
+       if ( window.sajax_request_type === 'POST' ) {
+               x.setRequestHeader( 'Method', 'POST ' + uri + ' HTTP/1.1' );
+               x.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
+       }
+       x.setRequestHeader( 'Pragma', 'cache=yes' );
+       x.setRequestHeader( 'Cache-Control', 'no-transform' );
+       x.onreadystatechange = function () {
+               if ( x.readyState !== 4 ) {
+                       return;
+               }
+
+               debug( 'received (' + x.status + ' ' + x.statusText + ') ' + x.responseText );
+
+               //if ( x.status != 200 )
+               //      alert( 'Error: ' + x.status + ' ' + x.statusText + ': ' + x.responseText );
+               //else
+
+               if ( typeof target === 'function' ) {
+                       target( x );
+               } else if ( typeof target === 'object' ) {
+                       if ( target.tagName === 'INPUT' ) {
+                               if ( x.status === 200 ) {
+                                       target.value = x.responseText;
+                               }
+                               //else alert( 'Error: ' + x.status + ' ' + x.statusText + ' (' + x.responseText + ')' );
+                       } else {
+                               if ( x.status === 200 ) {
+                                       target.innerHTML = x.responseText;
+                               } else {
+                                       target.innerHTML = '<div class="error">Error: ' + x.status +
+                                               ' ' + x.statusText + ' (' + x.responseText + ')</div>';
+                               }
+                       }
+               } else {
+                       alert( 'Bad target for sajax_do_call: not a function or object: ' + target );
+               }
+       };
+
+       debug( func_name + ' uri = ' + uri + ' / post = ' + post_data );
+       x.send( post_data );
+       debug( func_name + ' waiting..' );
+
+       return true;
+}
+
+/**
+ * @return {boolean} Whether the browser supports AJAX
+ */
+function wfSupportsAjax() {
+       var request = createXhr(),
+               supportsAjax = request ? true : false;
+
+       request = undefined;
+       return supportsAjax;
+}
+
+// Expose + Mark as deprecated
+var deprecationNotice = 'Sajax is deprecated, use jQuery.ajax or mediawiki.api instead.';
+
+// Variables
+mw.log.deprecate( window, 'sajax_debug_mode', false, deprecationNotice );
+mw.log.deprecate( window, 'sajax_request_type', 'GET', deprecationNotice );
+// Methods
+mw.log.deprecate( window, 'sajax_debug', debug, deprecationNotice );
+mw.log.deprecate( window, 'sajax_init_object', createXhr, deprecationNotice );
+mw.log.deprecate( window, 'sajax_do_call', doAjaxRequest, deprecationNotice );
+mw.log.deprecate( window, 'wfSupportsAjax', wfSupportsAjax, deprecationNotice );
+
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.legacy/commonPrint.css b/resources/src/mediawiki.legacy/commonPrint.css
new file mode 100644 (file)
index 0000000..2c477b2
--- /dev/null
@@ -0,0 +1,431 @@
+/**
+ * MediaWiki Print style sheet for CSS2-capable browsers.
+ * Copyright Gabriel Wicke, http://www.aulinx.de/
+ *
+ * Derived from the plone (http://plone.org/) styles
+ * Copyright Alexander Limi
+ */
+
+/* Thanks to A List Apart (http://alistapart.com/) for useful extras */
+
+/**
+ * Hide all the elements irrelevant for printing
+ */
+.noprint,
+div#jump-to-nav,
+.mw-jump,
+div.top,
+div#column-one,
+#colophon,
+.mw-editsection,
+.mw-editsection-like,
+.toctoggle,
+#toc.tochidden,
+div#f-poweredbyico,
+div#f-copyrightico,
+li#viewcount,
+li#about,
+li#disclaimer,
+li#mobileview,
+li#privacy,
+#footer-places,
+.mw-hidden-catlinks,
+tr.mw-metadata-show-hide-extended,
+span.mw-filepage-other-resolutions,
+#filetoc,
+.usermessage,
+.patrollink,
+#mw-navigation,
+#siteNotice {
+       display: none;
+}
+
+/**
+ * Pagination
+ */
+.wikitable, .thumb, img {
+       page-break-inside: avoid;
+}
+
+h2, h3, h4, h5, h6 {
+       page-break-after: avoid;
+}
+
+p {
+       widows: 3;
+       orphans: 3;
+}
+
+/**
+ * Generic HTML elements
+ */
+body {
+       background: white;
+       color: black;
+       margin: 0;
+       padding: 0;
+}
+
+ul {
+       list-style-type: square;
+}
+
+h1, h2, h3, h4, h5, h6 {
+       font-weight: bold;
+}
+
+dt {
+       font-weight: bold;
+}
+
+p {
+       margin: 1em 0;
+       line-height: 1.2em;
+}
+
+pre, .mw-code {
+       border: 1pt dashed black;
+       white-space: pre;
+       font-size: 8pt;
+       overflow: auto;
+       padding: 1em 0;
+       background: white;
+       color: black;
+}
+
+/**
+ * MediaWiki-specific elements
+ */
+#globalWrapper {
+       width: 100% !important;
+       min-width: 0 !important;
+}
+
+.mw-body {
+       background: white;
+       border: none !important;
+       padding: 0 !important;
+       margin: 0 !important;
+       direction: ltr;
+       color: black;
+}
+
+#column-content {
+       margin: 0 !important;
+}
+
+#column-content .mw-body {
+       padding: 1em;
+       margin: 0 !important;
+}
+
+#toc {
+       border: 1px solid #aaaaaa;
+       background-color: #f9f9f9;
+       padding: 5px;
+       display: -moz-inline-block;
+       display: inline-block;
+       display: table;
+       /* IE7 and earlier */
+       zoom: 1;
+       *display: inline;
+}
+
+#footer {
+       background: white;
+       color: black;
+       margin-top: 1em;
+       border-top: 1px solid #AAA;
+       direction: ltr;
+}
+
+img {
+       border: none;
+       vertical-align: middle;
+}
+
+/* math */
+span.texhtml {
+       font-family: serif;
+}
+
+/**
+ * Links
+ */
+a.stub,
+a.new {
+       color: #ba0000;
+       text-decoration: none;
+}
+
+a {
+       color: black !important;
+       background: none !important;
+       padding: 0 !important;
+}
+
+a:link, a:visited {
+       color: #520;
+       background: transparent;
+       text-decoration: underline;
+}
+
+/* Expand URLs for printing */
+.mw-body a.external.text:after,
+.mw-body a.external.autonumber:after {
+       content: " (" attr(href) ")";
+}
+
+/* Expand protocol-relative URLs for printing */
+.mw-body a.external.text[href^='//']:after,
+.mw-body a.external.autonumber[href^='//']:after {
+       content: " (https:" attr(href) ")";
+}
+
+/* MSIE/Win doesn't understand 'inherit' */
+a,
+a.external,
+a.new,
+a.stub {
+       color: black !important;
+       text-decoration: none !important;
+}
+
+/* Continue ... */
+a,
+a.external,
+a.new,
+a.stub {
+       color: inherit !important;
+       text-decoration: inherit !important;
+}
+
+/**
+ * Floating divs
+ */
+div.floatright {
+       float: right;
+       clear: right;
+       position: relative;
+       margin: 0.5em 0 0.8em 1.4em;
+}
+
+div.floatright p {
+       font-style: italic;
+}
+
+div.floatleft {
+       float: left;
+       clear: left;
+       position: relative;
+       margin: 0.5em 1.4em 0.8em 0;
+}
+
+div.floatleft p {
+       font-style: italic;
+}
+
+div.center {
+       text-align: center;
+}
+
+/**
+ * Thumbnails
+ */
+div.thumb {
+       border: none;
+       width: auto;
+       margin-top: 0.5em;
+       margin-bottom: 0.8em;
+       background-color: transparent;
+}
+
+div.thumbinner {
+       border: 1px solid #cccccc;
+       padding: 3px !important;
+       background-color: White;
+       font-size: 94%;
+       text-align: center;
+       overflow: hidden;
+}
+
+html .thumbimage {
+       border: 1px solid #cccccc;
+}
+
+html .thumbcaption {
+       border: none;
+       text-align: left;
+       line-height: 1.4em;
+       padding: 3px !important;
+       font-size: 94%;
+}
+
+div.magnify {
+       display: none;
+}
+
+/* @noflip */
+div.tright {
+       float: right;
+       clear: right;
+       margin: 0.5em 0 0.8em 1.4em;
+}
+
+/* @noflip */
+div.tleft {
+       float: left;
+       clear: left;
+       margin: 0.5em 1.4em 0.8em 0;
+}
+
+img.thumbborder {
+       border: 1px solid #dddddd;
+}
+
+/**
+ * Galleries (see shared.css for more info)
+ */
+li.gallerybox {
+       vertical-align: top;
+       display: inline-block;
+}
+
+ul.gallery, li.gallerybox {
+       zoom: 1;
+       *display: inline;
+}
+
+ul.gallery {
+       margin: 2px;
+       padding: 2px;
+       display: block;
+}
+
+li.gallerycaption {
+       font-weight: bold;
+       text-align: center;
+       display: block;
+       word-wrap: break-word;
+}
+
+li.gallerybox div.thumb {
+       text-align: center;
+       border: 1px solid #ccc;
+       margin: 2px;
+}
+
+div.gallerytext {
+       overflow: hidden;
+       font-size: 94%;
+       padding: 2px 4px;
+       word-wrap: break-word;
+}
+
+/**
+ * Diff rendering
+ */
+table.diff {
+       background: white;
+}
+
+td.diff-otitle {
+       background: #ffffff;
+}
+
+td.diff-ntitle {
+       background: #ffffff;
+}
+
+td.diff-addedline {
+       background: #ccffcc;
+       font-size: smaller;
+       border: solid 2px black;
+}
+
+td.diff-deletedline {
+       background: #ffffaa;
+       font-size: smaller;
+       border: dotted 2px black;
+}
+
+td.diff-context {
+       background: #eeeeee;
+       font-size: smaller;
+}
+
+.diffchange {
+       color: silver;
+       font-weight: bold;
+       text-decoration: underline;
+}
+
+/**
+ * Table rendering
+ * As on shared.css but with white background.
+ */
+table.wikitable,
+table.mw_metadata {
+       margin: 1em 0;
+       border: 1px #aaa solid;
+       background: white;
+       border-collapse: collapse;
+}
+
+table.wikitable > tr > th, table.wikitable > tr > td,
+table.wikitable > * > tr > th, table.wikitable > * > tr > td,
+.mw_metadata th, .mw_metadata td {
+       border: 1px #aaa solid;
+       padding: 0.2em;
+}
+
+table.wikitable > tr > th,
+table.wikitable > * > tr > th,
+.mw_metadata th {
+       text-align: center;
+       background: white;
+       font-weight: bold;
+}
+
+table.wikitable > caption,
+.mw_metadata caption {
+       font-weight: bold;
+}
+
+table.listing,
+table.listing td {
+       border: 1pt solid black;
+       border-collapse: collapse;
+}
+
+a.sortheader {
+       margin: 0 0.3em;
+}
+
+/**
+ * Categories
+ */
+.catlinks ul {
+       display: inline;
+       margin: 0;
+       padding: 0;
+       list-style: none;
+       list-style-type: none;
+       list-style-image: none;
+       vertical-align: middle !ie;
+}
+
+.catlinks li {
+       display: inline-block;
+       line-height: 1.15em;
+       padding: 0 .4em;
+       border-left: 1px solid #AAA;
+       margin: 0.1em 0;
+       zoom: 1;
+       display: inline !ie;
+}
+
+.catlinks li:first-child {
+       padding-left: .2em;
+       border-left: none;
+}
diff --git a/resources/src/mediawiki.legacy/images/ajax-loader.gif b/resources/src/mediawiki.legacy/images/ajax-loader.gif
new file mode 100644 (file)
index 0000000..72203fd
Binary files /dev/null and b/resources/src/mediawiki.legacy/images/ajax-loader.gif differ
diff --git a/resources/src/mediawiki.legacy/images/checker.png b/resources/src/mediawiki.legacy/images/checker.png
new file mode 100644 (file)
index 0000000..3e9e3d0
Binary files /dev/null and b/resources/src/mediawiki.legacy/images/checker.png differ
diff --git a/resources/src/mediawiki.legacy/images/feed-icon.png b/resources/src/mediawiki.legacy/images/feed-icon.png
new file mode 100644 (file)
index 0000000..00f49f6
Binary files /dev/null and b/resources/src/mediawiki.legacy/images/feed-icon.png differ
diff --git a/resources/src/mediawiki.legacy/images/feed-icon.svg b/resources/src/mediawiki.legacy/images/feed-icon.svg
new file mode 100644 (file)
index 0000000..6e5f570
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 256 256"><defs><linearGradient x1=".085" y1=".085" x2=".915" y2=".915" id="a"><stop offset="0" stop-color="#E3702D"/><stop offset=".107" stop-color="#EA7D31"/><stop offset=".35" stop-color="#F69537"/><stop offset=".5" stop-color="#FB9E3A"/><stop offset=".702" stop-color="#EA7C31"/><stop offset=".887" stop-color="#DE642B"/><stop offset="1" stop-color="#D95B29"/></linearGradient></defs><rect width="256" height="256" rx="55" ry="55" fill="#CC5D15"/><rect width="246" height="246" rx="50" ry="50" x="5" y="5" fill="#F49C52"/><rect width="236" height="236" rx="47" ry="47" x="10" y="10" fill="url(#a)"/><circle cx="68" cy="189" r="24" fill="#FFF"/><path d="M160 213h-34a82 82 0 0 0-82-82v-34a116 116 0 0 1 116 116zM184 213a140 140 0 0 0-140-140v-35a175 175 0 0 1 175 175z" fill="#FFF"/></svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.legacy/images/help-question-hover.gif b/resources/src/mediawiki.legacy/images/help-question-hover.gif
new file mode 100644 (file)
index 0000000..515138d
Binary files /dev/null and b/resources/src/mediawiki.legacy/images/help-question-hover.gif differ
diff --git a/resources/src/mediawiki.legacy/images/help-question.gif b/resources/src/mediawiki.legacy/images/help-question.gif
new file mode 100644 (file)
index 0000000..b4fc9c5
Binary files /dev/null and b/resources/src/mediawiki.legacy/images/help-question.gif differ
diff --git a/resources/src/mediawiki.legacy/images/question.png b/resources/src/mediawiki.legacy/images/question.png
new file mode 100644 (file)
index 0000000..f7405d2
Binary files /dev/null and b/resources/src/mediawiki.legacy/images/question.png differ
diff --git a/resources/src/mediawiki.legacy/images/question.svg b/resources/src/mediawiki.legacy/images/question.svg
new file mode 100644 (file)
index 0000000..98fbe8d
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="21.059" height="21.06"><path fill="#575757" d="M10.529 0c-5.814 0-10.529 4.714-10.529 10.529s4.715 10.53 10.529 10.53c5.816 0 10.529-4.715 10.529-10.53s-4.712-10.529-10.529-10.529zm-.002 16.767c-.861 0-1.498-.688-1.498-1.516 0-.862.637-1.534 1.498-1.534.828 0 1.5.672 1.5 1.534 0 .827-.672 1.516-1.5 1.516zm2.137-6.512c-.723.568-1 .931-1 1.739v.5h-2.205v-.603c0-1.517.449-2.136 1.154-2.688.707-.552 1.139-.845 1.139-1.637 0-.672-.414-1.051-1.24-1.051-.707 0-1.328.189-1.982.638l-1.051-1.807c.861-.604 1.93-1.034 3.342-1.034 1.912 0 3.516 1.051 3.516 3.066-.001 1.43-.794 2.188-1.673 2.877z"/></svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.legacy/images/spinner.gif b/resources/src/mediawiki.legacy/images/spinner.gif
new file mode 100644 (file)
index 0000000..6146be4
Binary files /dev/null and b/resources/src/mediawiki.legacy/images/spinner.gif differ
diff --git a/resources/src/mediawiki.legacy/oldshared.css b/resources/src/mediawiki.legacy/oldshared.css
new file mode 100644 (file)
index 0000000..4741074
--- /dev/null
@@ -0,0 +1,499 @@
+/**
+ * oldshared.css
+ * This file contains CSS settings common to Wikistandard, Nostalgia and
+ * CologneBlue, the old pre-Monobook skins
+ */
+
+/* For clarity, explicitly state some recommendations from
+ * http://www.w3.org/TR/CSS21/sample.html to make sure the editsection links scale right
+ */
+
+h1 {
+       font-size: 2em;
+}
+
+h2 {
+       font-size: 1.5em;
+}
+
+h3 {
+       font-size: 1.17em;
+}
+
+h4 {
+       font-size: 1.11em;
+}
+
+h5 {
+       font-size: 1.05em;
+}
+
+h6 {
+       font-size: 1em;
+}
+
+h1, h2, h3, h4, h5, h6 {
+       font-weight: bolder;
+}
+
+/* Now the custom parts */
+
+#footer {
+       clear: both;
+}
+
+/* images */
+/* @noflip */
+div.floatright {
+       float: right;
+       clear: right;
+       margin: 0 0 1em 1em;
+}
+
+/* @noflip */
+div.floatright p {
+       font-style: italic;
+}
+
+/* @noflip */
+div.floatleft {
+       float: left;
+       clear: left;
+       margin: 0.3em 0.5em 0.5em 0;
+}
+
+/* @noflip */
+div.floatleft p {
+       font-style: italic;
+}
+
+/* table standards */
+table.rimage {
+       float: right;
+       margin-left: 1em;
+       margin-bottom: 1em;
+       text-align: center;
+       font-size: smaller;
+}
+
+/* thumbnails */
+div.thumb {
+       margin-bottom: .5em;
+       border-style: solid;
+       border-color: white;
+       width: auto;
+}
+
+div.thumbinner {
+       border: 1px solid #ccc;
+       padding: 3px;
+       background-color: #f9f9f9;
+       font-size: 94%;
+       text-align: center;
+       overflow: hidden;
+}
+
+html .thumbimage {
+       border: 1px solid #ccc;
+}
+
+html .thumbcaption {
+       border: none;
+       line-height: 1.4em;
+       padding: 3px;
+       font-size: 94%;
+       text-align: left;
+}
+
+div.magnify {
+       float: right;
+       margin-left: 3px;
+}
+
+div.magnify a {
+       display: block;
+       /* Hide the text… */
+       text-indent: 15px;
+       white-space: nowrap;
+       overflow: hidden;
+       /* …and replace it with the image */
+       width: 15px;
+       height: 11px;
+       /* @embed */
+       background: url(images/magnify-clip-ltr.png) center center no-repeat;
+       /* Don't annoy people who copy-paste everything too much */
+       -moz-user-select: none;
+       -webkit-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+}
+
+/* Temporary WMF deployment hack, to be removed before 1.24 release */
+div.magnify img {
+       display: none;
+}
+
+/* @noflip */
+div.tright {
+       clear: right;
+       float: right;
+       border-width: .5em 0 .8em 1.4em;
+}
+
+/* @noflip */
+div.tleft {
+       float: left;
+       clear: left;
+       margin-right: .5em;
+       border-width: .5em 1.4em .8em 0;
+}
+
+img.thumbborder {
+       border: 1px solid #dddddd;
+}
+
+/* Page history styling */
+/* the auto-generated edit comments */
+.autocomment {
+       color: #4b4b4b;
+}
+
+img {
+       border: none;
+}
+
+#toc,
+.toc {
+       border: 1px solid #bba;
+       background-color: #f7f8ff;
+       padding: 5px;
+       font-size: 95%;
+       text-align: center;
+       display: -moz-inline-block;
+       display: inline-block;
+       display: table;
+
+       /* IE7 and earlier */
+       zoom: 1;
+       *display: inline;
+
+       padding: 7px;
+}
+
+/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
+table#toc,
+table.toc {
+       border-collapse: collapse;
+}
+
+/* Remove additional paddings inside table-cells that are not present in <div>s */
+table#toc td,
+table.toc td {
+       padding: 0;
+}
+
+#toc h2,
+.toc h2 {
+       display: inline;
+       border: none;
+       padding: 0;
+       font-size: 100%;
+       font-weight: bold;
+}
+
+#toc ul,
+.toc ul {
+       list-style-type: none;
+       list-style-image: none;
+       padding: 0;
+       text-align: left;
+}
+
+#toc ul ul,
+.toc ul ul {
+       margin: 0 0 0 2em;
+}
+
+#toc .toctoggle,
+.toc .toctoggle {
+       font-size: 94%;
+}
+
+.error {
+       color: red;
+       font-size: larger;
+}
+
+/* preference page with js-genrated toc */
+#preftoc {
+       float: left;
+       margin: 1em 1em 1em 1em;
+       width: 13em;
+}
+
+#preftoc li {
+       border: 1px solid White;
+}
+
+#preftoc li.selected {
+       background-color: #f9f9f9;
+       border: 1px dashed #aaaaaa;
+}
+
+#preftoc a,
+#preftoc a:active {
+       display: block;
+       color: #005189;
+}
+
+.mw-prefs-buttons {
+       clear: left;
+       float: left;
+       margin-top: 1em;
+}
+
+div.htmlform-tip {
+       font-size: 94%;
+       margin-top: 0.4em;
+       color: #666;
+}
+
+fieldset.prefsection {
+       margin-top: 1em;
+}
+
+fieldset.operaprefsection {
+       margin-left: 15em;
+}
+
+/* emulate center */
+.center {
+       width: 100%;
+       text-align: center;
+}
+
+*.center * {
+       margin-left: auto;
+       margin-right: auto;
+}
+
+/* small for tables and similar */
+.small {
+       font-size: 94%;
+}
+
+table.small {
+       font-size: 100%;
+}
+
+/* use this instead of #toc for page content */
+.toccolours {
+       border: 1px solid #aaaaaa;
+       background-color: #f9f9f9;
+       padding: 5px;
+       font-size: 95%;
+}
+
+#siteNotice {
+       border: 1px solid #aaaaaa;
+       padding-left: 0.5em;
+       padding-right: 0.5em;
+}
+
+.redirectText {
+       font-size: 150%;
+       margin: 5px;
+}
+
+.sharedUploadNotice {
+       font-style: italic;
+}
+
+span.unpatrolled {
+       font-weight: bold;
+       color: red;
+}
+
+span.updatedmarker {
+       color: black;
+       background-color: #00FF00;
+}
+
+div.gallerybox {
+       width: 150px;
+}
+
+span.comment {
+       font-style: italic;
+}
+
+span.changedby {
+       font-size: 95%;
+}
+
+.previewnote {
+       text-align: center;
+       color: #cc0000;
+}
+
+.editExternally {
+       border-style: solid;
+       border-width: 1px;
+       border-color: gray;
+       background: #ffffff;
+       padding: 3px;
+       margin-top: 0.5em;
+       float: left;
+       font-size: small;
+       text-align: center;
+}
+
+.editExternallyHelp {
+       font-style: italic;
+       color: gray;
+}
+
+li span.deleted {
+       text-decoration: line-through;
+       color: #888;
+       font-style: italic;
+}
+
+/* Classes for Exif data display */
+table.mw_metadata {
+       margin-left: 0.5em;
+}
+
+table.mw_metadata caption {
+       font-weight: bold;
+}
+
+table.mw_metadata th {
+       font-weight: normal;
+}
+
+table.mw_metadata td {
+       padding: 0.1em;
+}
+
+table.mw_metadata {
+       border: none;
+       border-collapse: collapse;
+}
+
+table.mw_metadata td,
+table.mw_metadata th {
+       border: 1px solid #aaaaaa;
+       padding-left: 4px;
+       padding-right: 4px;
+}
+
+table.mw_metadata th {
+       background-color: #f9f9f9;
+}
+
+table.mw_metadata td {
+       background-color: #fcfcfc;
+}
+
+table.mw_metadata td.spacer {
+       background: inherit;
+       border-top: none;
+       border-bottom: none;
+}
+
+.visualClear {
+       clear: both;
+}
+
+/* Allmessages table */
+#allmessagestable th {
+       background-color: #b2b2ff;
+}
+
+#allmessagestable tr.orig {
+       background-color: #ffe2e2;
+}
+
+#allmessagestable tr.new {
+       background-color: #e2ffe2;
+}
+
+#allmessagestable tr.def {
+       background-color: #f0f0ff;
+}
+
+#jump-to-nav {
+       display: none;
+}
+
+div.multipageimagenavbox {
+       border: solid 1px silver;
+       padding: 4px;
+       margin: 1em;
+       background: #f0f0f0;
+}
+
+div.multipageimagenavbox div.thumb {
+       border: none;
+       margin-left: 2em;
+       margin-right: 2em;
+}
+
+div.multipageimagenavbox hr {
+       margin: 6px;
+}
+
+table.multipageimage td {
+       text-align: center;
+}
+
+.templatesUsed {
+       margin-top: 1em;
+}
+
+.MediaTransformError {
+       border: thin solid #777;
+       background-color: #ccc;
+       padding: 0.1em;
+}
+
+.MediaTransformError td {
+       text-align: center;
+       vertical-align: middle;
+       font-size: 90%;
+}
+
+form#specialpages {
+       display: inline;
+}
+
+body {
+       direction: ltr;
+       unicode-bidi: embed;
+       background-color: #ffffec;
+}
+
+body.ns-0 {
+       background-color: white;
+}
+
+/** RTL specific CSS starts here **/
+
+/**
+ * Lists:
+ * The following lines don't have a visible effect on non-Gecko browsers
+ * They fix a problem with Gecko browsers rendering lists to the right of
+ * left-floated objects in an RTL layout.
+ */
+/* @noflip */
+html > body.rtl div#article ul {
+       display: table;
+}
+
+/* @noflip */
+html > body.rtl .mw-body ul#filetoc {
+       display: block;
+}
+
+/* RTL specific CSS ends here **/
diff --git a/resources/src/mediawiki.legacy/protect.js b/resources/src/mediawiki.legacy/protect.js
new file mode 100644 (file)
index 0000000..dc142ca
--- /dev/null
@@ -0,0 +1,387 @@
+( function ( mw, $ ) {
+
+var ProtectionForm = window.ProtectionForm = {
+       existingMatch: false,
+
+       /**
+        * Set up the protection chaining interface (i.e. "unlock move permissions" checkbox)
+        * on the protection form
+        *
+        * @param opts Object : parameters with members:
+        *     tableId              Identifier of the table containing UI bits
+        *     labelText            Text to use for the checkbox label
+        *     numTypes             The number of protection types
+        *     existingMatch        True if all the existing expiry times match
+        */
+       init: function ( opts ) {
+               var box, boxbody, row, cell, check, label;
+
+               if ( !( document.createTextNode && document.getElementById && document.getElementsByTagName ) ) {
+                       return false;
+               }
+
+               box = document.getElementById( opts.tableId );
+               if ( !box ) {
+                       return false;
+               }
+
+               boxbody = box.getElementsByTagName( 'tbody' )[0];
+               row = document.createElement( 'tr' );
+               boxbody.insertBefore( row, boxbody.firstChild.nextSibling );
+
+               this.existingMatch = opts.existingMatch;
+
+               cell = document.createElement( 'td' );
+               row.appendChild( cell );
+               // If there is only one protection type, there is nothing to chain
+               if ( opts.numTypes > 1 ) {
+                       check = document.createElement( 'input' );
+                       check.id = 'mwProtectUnchained';
+                       check.type = 'checkbox';
+                       $( check ).click( function () {
+                               ProtectionForm.onChainClick();
+                       } );
+
+                       label = document.createElement( 'label' );
+                       label.htmlFor = 'mwProtectUnchained';
+                       label.appendChild( document.createTextNode( opts.labelText ) );
+
+                       cell.appendChild( check );
+                       cell.appendChild( document.createTextNode( ' ' ) );
+                       cell.appendChild( label );
+
+                       check.checked = !this.areAllTypesMatching();
+                       this.enableUnchainedInputs( check.checked );
+               }
+
+               $( '#mwProtect-reason' ).byteLimit( 180 );
+
+               this.updateCascadeCheckbox();
+
+               return true;
+       },
+
+       /**
+        * Sets the disabled attribute on the cascade checkbox depending on the current selected levels
+        */
+       updateCascadeCheckbox: function () {
+               var i, lists, items, selected;
+
+               // For non-existent titles, there is no cascade option
+               if ( !document.getElementById( 'mwProtect-cascade' ) ) {
+                       return;
+               }
+               lists = this.getLevelSelectors();
+               for ( i = 0; i < lists.length; i++ ) {
+                       if ( lists[i].selectedIndex > -1 ) {
+                               items = lists[i].getElementsByTagName( 'option' );
+                               selected = items[ lists[i].selectedIndex ].value;
+                               if ( !this.isCascadeableLevel( selected ) ) {
+                                       document.getElementById( 'mwProtect-cascade' ).checked = false;
+                                       document.getElementById( 'mwProtect-cascade' ).disabled = true;
+                                       return;
+                               }
+                       }
+               }
+               document.getElementById( 'mwProtect-cascade' ).disabled = false;
+       },
+
+       /**
+        * Checks if a cerain protection level is cascadeable.
+        * @param level {String}
+        * @return {Boolean}
+        */
+       isCascadeableLevel: function (  level ) {
+               var cascadeLevels, len, i;
+
+               cascadeLevels = mw.config.get( 'wgCascadeableLevels' );
+               // cascadeLevels isn't defined on all pages
+               if ( cascadeLevels ) {
+                       for ( i = 0, len = cascadeLevels.length; i < len; i += 1 ) {
+                               if ( cascadeLevels[i] === level ) {
+                                       return true;
+                               }
+                       }
+               }
+               return false;
+       },
+
+       /**
+        * When protection levels are locked together, update the rest
+        * when one action's level changes
+        *
+        * @param source Element Level selector that changed
+        */
+       updateLevels: function ( source ) {
+               if ( !this.isUnchained() ) {
+                       this.setAllSelectors( source.selectedIndex );
+               }
+               this.updateCascadeCheckbox();
+       },
+
+       /**
+        * When protection levels are locked together, update the
+        * expiries when one changes
+        *
+        * @param source Element expiry input that changed
+        */
+
+       updateExpiry: function ( source ) {
+               var expiry, listId, list;
+
+               if ( !this.isUnchained() ) {
+                       expiry = source.value;
+                       this.forEachExpiryInput( function ( element ) {
+                               element.value = expiry;
+                       } );
+               }
+               listId = source.id.replace( /^mwProtect-(\w+)-expires$/, 'mwProtectExpirySelection-$1' );
+               list = document.getElementById( listId );
+               if ( list && list.value !== 'othertime' ) {
+                       if ( this.isUnchained() ) {
+                               list.value = 'othertime';
+                       } else {
+                               this.forEachExpirySelector( function ( element ) {
+                                       element.value = 'othertime';
+                               } );
+                       }
+               }
+       },
+
+       /**
+        * When protection levels are locked together, update the
+        * expiry lists when one changes and clear the custom inputs
+        *
+        * @param source Element expiry selector that changed
+        */
+       updateExpiryList: function ( source ) {
+               var expiry;
+               if ( !this.isUnchained() ) {
+                       expiry = source.value;
+                       this.forEachExpirySelector( function ( element ) {
+                               element.value = expiry;
+                       } );
+                       this.forEachExpiryInput( function ( element ) {
+                               element.value = '';
+                       } );
+               }
+       },
+
+       /**
+        * Update chain status and enable/disable various bits of the UI
+        * when the user changes the "unlock move permissions" checkbox
+        */
+       onChainClick: function () {
+               if ( this.isUnchained() ) {
+                       this.enableUnchainedInputs( true );
+               } else {
+                       this.setAllSelectors( this.getMaxLevel() );
+                       this.enableUnchainedInputs( false );
+               }
+               this.updateCascadeCheckbox();
+       },
+
+       /**
+        * Returns true if the named attribute in all objects in the given array are matching
+        */
+       matchAttribute: function ( objects, attrName ) {
+               var i, element, value;
+
+               // Check levels
+               value = null;
+               for ( i = 0; i < objects.length; i++ ) {
+                       element = objects[i];
+                       if ( value === null ) {
+                               value = element[attrName];
+                       } else {
+                               if ( value !== element[attrName] ) {
+                                       return false;
+                               }
+                       }
+               }
+               return true;
+       },
+
+       /**
+        * Are all actions protected at the same level, with the same expiry time?
+        *
+        * @return boolean
+        */
+       areAllTypesMatching: function () {
+               return this.existingMatch
+                       && this.matchAttribute( this.getLevelSelectors(), 'selectedIndex' )
+                       && this.matchAttribute( this.getExpirySelectors(), 'selectedIndex' )
+                       && this.matchAttribute( this.getExpiryInputs(), 'value' );
+       },
+
+       /**
+        * Is protection chaining off?
+        *
+        * @return bool
+        */
+       isUnchained: function () {
+               var element = document.getElementById( 'mwProtectUnchained' );
+               return element
+                       ? element.checked
+                       : true; // No control, so we need to let the user set both levels
+       },
+
+       /**
+        * Find the highest protection level in any selector
+        */
+       getMaxLevel: function () {
+               var maxIndex = -1;
+               this.forEachLevelSelector( function ( element ) {
+                       if ( element.selectedIndex > maxIndex ) {
+                               maxIndex = element.selectedIndex;
+                       }
+               } );
+               return maxIndex;
+       },
+
+       /**
+        * Protect all actions at the specified level
+        *
+        * @param index int Protection level
+        */
+       setAllSelectors: function ( index ) {
+               this.forEachLevelSelector( function ( element ) {
+                       if ( element.selectedIndex !== index ) {
+                               element.selectedIndex = index;
+                       }
+               } );
+       },
+
+       /**
+        * Apply a callback to each protection selector
+        *
+        * @param func callable Callback function
+        */
+       forEachLevelSelector: function ( func ) {
+               var i, selectors;
+
+               selectors = this.getLevelSelectors();
+               for ( i = 0; i < selectors.length; i++ ) {
+                       func( selectors[i] );
+               }
+       },
+
+       /**
+        * Get a list of all protection selectors on the page
+        *
+        * @return Array
+        */
+       getLevelSelectors: function () {
+               var i, ours, all, element;
+
+               all = document.getElementsByTagName( 'select' );
+               ours = [];
+               for ( i = 0; i < all.length; i++ ) {
+                       element = all[i];
+                       if ( element.id.match( /^mwProtect-level-/ ) ) {
+                               ours[ours.length] = element;
+                       }
+               }
+               return ours;
+       },
+
+       /**
+        * Apply a callback to each expiry input
+        *
+        * @param func callable Callback function
+        */
+       forEachExpiryInput: function ( func ) {
+               var i, inputs;
+
+               inputs = this.getExpiryInputs();
+               for ( i = 0; i < inputs.length; i++ ) {
+                       func( inputs[i] );
+               }
+       },
+
+       /**
+        * Get a list of all expiry inputs on the page
+        *
+        * @return Array
+        */
+       getExpiryInputs: function () {
+               var i, all, element, ours;
+
+               all = document.getElementsByTagName( 'input' );
+               ours = [];
+               for ( i = 0; i < all.length; i++ ) {
+                       element = all[i];
+                       if ( element.name.match( /^mwProtect-expiry-/ ) ) {
+                               ours[ours.length] = element;
+                       }
+               }
+               return ours;
+       },
+
+       /**
+        * Apply a callback to each expiry selector list
+        * @param func callable Callback function
+        */
+       forEachExpirySelector: function ( func ) {
+               var i, inputs;
+
+               inputs = this.getExpirySelectors();
+               for ( i = 0; i < inputs.length; i++ ) {
+                       func( inputs[i] );
+               }
+       },
+
+       /**
+        * Get a list of all expiry selector lists on the page
+        *
+        * @return Array
+        */
+       getExpirySelectors: function () {
+               var i, all, ours, element;
+
+               all = document.getElementsByTagName( 'select' );
+               ours = [];
+               for ( i = 0; i < all.length; i++ ) {
+                       element = all[i];
+                       if ( element.id.match( /^mwProtectExpirySelection-/ ) ) {
+                               ours[ours.length] = element;
+                       }
+               }
+               return ours;
+       },
+
+       /**
+        * Enable/disable protection selectors and expiry inputs
+        *
+        * @param val boolean Enable?
+        */
+       enableUnchainedInputs: function ( val ) {
+               var first = true;
+
+               this.forEachLevelSelector( function ( element ) {
+                       if ( first ) {
+                               first = false;
+                       } else {
+                               element.disabled = !val;
+                       }
+               } );
+               first = true;
+               this.forEachExpiryInput( function ( element ) {
+                       if ( first ) {
+                               first = false;
+                       } else {
+                               element.disabled = !val;
+                       }
+               } );
+               first = true;
+               this.forEachExpirySelector( function ( element ) {
+                       if ( first ) {
+                               first = false;
+                       } else {
+                               element.disabled = !val;
+                       }
+               } );
+       }
+};
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.legacy/shared.css b/resources/src/mediawiki.legacy/shared.css
new file mode 100644 (file)
index 0000000..6e7dd9a
--- /dev/null
@@ -0,0 +1,1167 @@
+/**
+ * CSS in this file is used by *all* skins (that have any CSS at all). Be
+ * careful what you put in here, since what looks good in one skin may not in
+ * another, but don't ignore the poor pre-Monobook users either.
+ */
+
+/* GENERAL CLASSES FOR DIRECTIONALITY SUPPORT */
+
+/**
+ * These classes should be used for text depending on the content direction.
+ * Content stuff like editsection, ul/ol and TOC depend on this.
+ */
+.mw-content-ltr {
+       /* @noflip */
+       direction: ltr;
+}
+
+.mw-content-rtl {
+       /* @noflip */
+       direction: rtl;
+}
+
+/* Most input fields should be in site direction */
+.sitedir-ltr textarea,
+.sitedir-ltr input {
+       /* @noflip */
+       direction: ltr;
+}
+
+.sitedir-rtl textarea,
+.sitedir-rtl input {
+       /* @noflip */
+       direction: rtl;
+}
+
+/* User-Agent styles for new HTML5 elements */
+mark {
+       background-color: yellow;
+       color: black;
+}
+
+/* Helper for wbr element on IE 8+; in HTML5, but not supported by default as of IE 11. */
+/* Note canonical HTML5 styles recommend "content: \u200B", but this doesn't work as of IE 11. */
+wbr {
+       display: inline-block;
+}
+
+/* Input types that should follow user direction, like buttons */
+/* TODO: What about buttons in wikipage content ? */
+input[type="submit"],
+input[type="button"],
+input[type="reset"],
+input[type="file"] {
+       direction: ltr;
+}
+
+/* Override default values */
+textarea[dir="ltr"],
+input[dir="ltr"] {
+       /* @noflip */
+       direction: ltr;
+}
+
+textarea[dir="rtl"],
+input[dir="rtl"] {
+       /* @noflip */
+       direction: rtl;
+}
+
+/* Default style for semantic tags */
+abbr[title],
+.explain[title] {
+       border-bottom: 1px dotted;
+       cursor: help;
+}
+
+/* Colored watchlist and recent changes numbers */
+.mw-plusminus-pos {
+       color: #006400; /* dark green */
+}
+
+.mw-plusminus-neg {
+       color: #8b0000; /* dark red */
+}
+
+.mw-plusminus-null {
+       color: #aaa; /* gray */
+}
+
+/**
+ * Links to redirects appear italicized on [[Special:AllPages]], [[Special:PrefixIndex]],
+ * [[Special:Watchlist/edit]] and in category listings.
+ */
+.allpagesredirect,
+.redirect-in-category,
+.watchlistredir {
+       font-style: italic;
+}
+
+/* Comment and username portions of RC entries */
+span.comment {
+       font-style: italic;
+}
+
+span.changedby {
+       font-size: 95%;
+}
+
+/* Math */
+.texvc {
+       direction: ltr;
+       unicode-bidi: embed;
+}
+
+img.tex {
+       vertical-align: middle;
+}
+
+span.texhtml {
+       font-family: serif;
+}
+
+/**
+ * Add a bit of margin space between the preview and the toolbar.
+ * This replaces the ugly <p><br /></p> we used to insert into the page source
+ */
+#wikiPreview.ontop {
+       margin-bottom: 1em;
+}
+
+/* Stop floats from intruding into edit area in previews */
+#editform,
+#toolbar,
+#wpTextbox1 {
+       clear: both;
+}
+
+#toolbar img {
+       cursor: pointer;
+}
+
+/**
+ * File description page
+ */
+
+div.mw-filepage-resolutioninfo {
+       font-size: smaller;
+}
+
+/**
+ * File histories
+ */
+h2#filehistory {
+       clear: both;
+}
+
+table.filehistory th,
+table.filehistory td {
+       vertical-align: top;
+}
+
+table.filehistory th {
+       text-align: left;
+}
+
+table.filehistory td.mw-imagepage-filesize,
+table.filehistory th.mw-imagepage-filesize {
+       white-space: nowrap;
+}
+
+table.filehistory td.filehistory-selected {
+       font-weight: bold;
+}
+
+/**
+ * Add a checkered background image on hover for file
+ * description pages. (bug 26470)
+ */
+.filehistory a img,
+#file img:hover {
+       /* @embed */
+       background: white url(images/checker.png) repeat;
+}
+
+/**
+ * rev_deleted stuff
+ */
+li span.deleted,
+span.history-deleted {
+       text-decoration: line-through;
+       color: #888;
+       font-style: italic;
+}
+
+/**
+ * Patrol stuff
+ */
+.not-patrolled {
+       background-color: #ffa;
+}
+
+.unpatrolled {
+       font-weight: bold;
+       color: red;
+}
+
+div.patrollink {
+       font-size: 75%;
+       text-align: right;
+}
+
+/**
+ * Forms
+ */
+td.mw-label {
+       text-align: right;
+}
+
+td.mw-input {
+       text-align: left;
+}
+
+td.mw-submit {
+       text-align: left;
+}
+
+td.mw-label {
+       vertical-align: top;
+}
+
+.prefsection td.mw-label {
+       width: 20%;
+}
+
+.prefsection table {
+       width: 100%;
+}
+
+.prefsection table.mw-htmlform-matrix {
+       width: auto;
+}
+
+.mw-icon-question {
+       /* SVG support using a transparent gradient to guarantee cross-browser
+        * compatibility (browsers able to understand gradient syntax support also SVG).
+        * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
+       background-image: url(images/question.png);
+       /* @embed */
+       background-image: -webkit-linear-gradient(transparent, transparent), url(images/question.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/question.svg);
+       background-repeat: no-repeat;
+       background-size: 13px 13px;
+       display: inline-block;
+       height: 13px;
+       width: 13px;
+       margin-left: 4px;
+}
+
+.mw-icon-question:lang(ar),
+.mw-icon-question:lang(fa),
+.mw-icon-question:lang(ur) {
+       -webkit-transform: scaleX(-1);
+       -ms-transform: scaleX(-1);
+       transform: scaleX(-1);
+}
+
+td.mw-submit {
+       white-space: nowrap;
+}
+
+table.mw-htmlform-nolabel td.mw-label {
+       width: 1px;
+}
+
+tr.mw-htmlform-vertical-label td.mw-label {
+       text-align: left !important;
+}
+
+.mw-htmlform-invalid-input td.mw-input input {
+       border-color: red;
+}
+
+.mw-htmlform-flatlist div.mw-htmlform-flatlist-item {
+       display: inline;
+       margin-right: 1em;
+       white-space: nowrap;
+}
+
+.mw-htmlform-matrix td {
+       padding-left: 0.5em;
+       padding-right: 0.5em;
+}
+
+input#wpSummary {
+       width: 80%;
+       margin-bottom: 1em;
+}
+
+/**
+ * Image captions.
+ *
+ * This is only meant to provide the most basic of styles, visual settings shouldn't be added here.
+ */
+
+/* @noflip */
+.mw-content-ltr .thumbcaption {
+       text-align: left;
+}
+
+/* @noflip */
+.mw-content-ltr .magnify {
+       float: right;
+}
+
+/* @noflip */
+.mw-content-rtl .thumbcaption {
+       text-align: right;
+}
+
+/* @noflip */
+.mw-content-rtl .magnify {
+       float: left;
+}
+
+/**
+ * Categories
+ */
+#catlinks {
+       /**
+        * Overrides text justification (user preference)
+        * See bug 31990
+        */
+       text-align: left;
+}
+
+.catlinks ul {
+       display: inline;
+       margin: 0;
+       padding: 0;
+       list-style: none;
+       list-style-type: none;
+       list-style-image: none;
+       vertical-align: middle !ie;
+}
+
+.catlinks li {
+       display: inline-block;
+       line-height: 1.25em;
+       border-left: 1px solid #AAA;
+       margin: 0.125em 0;
+       padding: 0 0.5em;
+       zoom: 1;
+       display: inline !ie;
+}
+
+.catlinks li:first-child {
+       padding-left: 0.25em;
+       border-left: none;
+}
+
+/* (bug 5346) make category redirects italic */
+.catlinks li a.mw-redirect {
+       font-style: italic;
+}
+
+/**
+ * Hidden categories
+ */
+.mw-hidden-cats-hidden {
+       display: none;
+}
+
+.catlinks-allhidden {
+       display: none;
+}
+
+/**
+ * Convenience links to edit block, delete and protect reasons
+ * and upload licenses
+ */
+p.mw-ipb-conveniencelinks,
+p.mw-protect-editreasons,
+p.mw-filedelete-editreasons,
+p.mw-delete-editreasons,
+p.mw-revdel-editreasons,
+p.mw-upload-editlicenses {
+       font-size: 90%;
+       text-align: right;
+}
+
+/* Page history styling */
+
+/* The auto-generated edit comments */
+.autocomment {
+       color: gray;
+}
+
+#pagehistory .history-user {
+       margin-left: 0.4em;
+       margin-right: 0.2em;
+}
+
+#pagehistory span.minor {
+       font-weight: bold;
+}
+
+#pagehistory li {
+       border: 1px solid white;
+}
+
+#pagehistory li.selected {
+       background-color: #f9f9f9;
+       border: 1px dashed #aaa;
+}
+
+.mw-history-revisiondelete-button, #mw-fileduplicatesearch-icon {
+       float: right;
+}
+
+/** Generic minor/bot/newpage styling (recent changes) */
+.newpage,
+.minoredit,
+.botedit {
+       font-weight: bold;
+}
+
+#shared-image-dup,
+#shared-image-conflict {
+       font-style: italic;
+}
+
+/**
+ * Recreating deleted page warning
+ * Reupload file warning
+ * Page protection warning
+ * incl. log entries for these warnings
+ */
+div.mw-warning-with-logexcerpt {
+       padding: 3px;
+       margin-bottom: 3px;
+       border: 2px solid #2F6FAB;
+       clear: both;
+}
+
+div.mw-warning-with-logexcerpt ul li {
+       font-size: 90%;
+}
+
+/* (show/hide) revision deletion links */
+span.mw-revdelundel-link,
+strong.mw-revdelundel-link {
+       font-size: 90%;
+}
+
+span.mw-revdelundel-hidden,
+input.mw-revdelundel-hidden {
+       visibility: hidden;
+}
+
+td.mw-revdel-checkbox,
+th.mw-revdel-checkbox {
+       padding-right: 10px;
+       text-align: center;
+}
+
+/* red links; see bug 36276 */
+a.new {
+       color: #BA0000;
+}
+
+/* feed links */
+a.feedlink {
+       /* SVG support using a transparent gradient to guarantee cross-browser
+        * compatibility (browsers able to understand gradient syntax support also SVG).
+        * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
+       background-image: url(images/feed-icon.png);
+       /* @embed */
+       background-image: -webkit-linear-gradient(transparent, transparent), url(images/feed-icon.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/feed-icon.svg);
+       background-position: center left;
+       background-repeat: no-repeat;
+       background-size: 12px 12px;
+       padding-left: 16px;
+}
+
+/* Plainlinks - this can be used to switch
+ * off special external link styling */
+.plainlinks a.external {
+       background: none !important;
+       padding: 0 !important;
+}
+
+/* External URLs should always be treated as LTR (bug 4330) */
+/* @noflip */ .rtl a.external.free,
+.rtl a.external.autonumber {
+       direction: ltr;
+       unicode-bidi: embed;
+}
+
+/**
+ * wikitable class for skinning normal tables
+ * keep in sync with commonPrint.css
+ */
+table.wikitable {
+       margin: 1em 0;
+       background-color: #f9f9f9;
+       border: 1px #aaa solid;
+       border-collapse: collapse;
+       color: black;
+}
+
+table.wikitable > tr > th,
+table.wikitable > tr > td,
+table.wikitable > * > tr > th,
+table.wikitable > * > tr > td {
+       border: 1px #aaa solid;
+       padding: 0.2em;
+}
+
+table.wikitable > tr > th,
+table.wikitable > * > tr > th {
+       background-color: #f2f2f2;
+       text-align: center;
+}
+
+table.wikitable > caption {
+       font-weight: bold;
+}
+
+/* success and error messages */
+.error,
+.warning,
+.success {
+       font-size: larger;
+}
+
+.error {
+       color: #cc0000;
+}
+
+.warning {
+       color: #705000;
+}
+
+.success {
+       color: #009000;
+}
+
+.errorbox,
+.warningbox,
+.successbox {
+       border: 1px solid;
+       padding: .5em 1em;
+       margin-bottom: 1em;
+       display: -moz-inline-block;
+       display: inline-block;
+       zoom: 1;
+       *display: inline;
+}
+
+.errorbox h2,
+.warningbox h2,
+.successbox h2 {
+       font-size: 1em;
+       color: inherit;
+       font-weight: bold;
+       display: inline;
+       margin: 0 .5em 0 0;
+       border: none;
+}
+
+.errorbox {
+       color: #cc0000;
+       border-color: #fac5c5;
+       background-color: #fae3e3;
+}
+
+.warningbox {
+       color: #705000;
+       border-color: #fde29b;
+       background-color: #fdf1d1;
+}
+
+.successbox {
+       color: #009000;
+       border-color: #b7fdb5;
+       background-color: #e1fddf;
+}
+
+/* general info/warning box for SP */
+.mw-infobox {
+       border: 2px solid #ff7f00;
+       margin: 0.5em;
+       clear: left;
+       overflow: hidden;
+}
+
+.mw-infobox-left {
+       margin: 7px;
+       float: left;
+       width: 35px;
+}
+
+.mw-infobox-right {
+       margin: 0.5em 0.5em 0.5em 49px;
+}
+
+/* Note on preview page */
+.previewnote {
+       color: #c00;
+       margin-bottom: 1em;
+}
+
+.previewnote p {
+       text-indent: 3em;
+       margin: 0.8em 0;
+}
+
+.visualClear {
+       clear: both;
+}
+
+/**
+ * Data table style
+ *
+ * Transparent table with suddle borders
+ * and blue row-highlighting.
+ */
+.mw-datatable {
+       border-collapse: collapse;
+}
+
+.mw-datatable,
+.mw-datatable td,
+.mw-datatable th {
+       border: 1px solid #aaaaaa;
+       padding: 0 0.15em 0 0.15em;
+}
+
+.mw-datatable th {
+       background-color: #ddddff;
+}
+
+.mw-datatable td {
+       background-color: #ffffff;
+}
+
+.mw-datatable tr:hover td {
+       background-color: #eeeeff;
+}
+
+/* filetoc */
+ul#filetoc {
+       text-align: center;
+       border: 1px solid #aaaaaa;
+       background-color: #f9f9f9;
+       padding: 5px;
+       font-size: 95%;
+       margin-bottom: 0.5em;
+       margin-left: 0;
+       margin-right: 0;
+}
+
+#filetoc li {
+       display: inline;
+       list-style-type: none;
+       padding-right: 2em;
+}
+
+/* Classes for Exif data display */
+table.mw_metadata {
+       font-size: 0.8em;
+       margin-left: 0.5em;
+       margin-bottom: 0.5em;
+       width: 400px;
+}
+
+table.mw_metadata caption {
+       font-weight: bold;
+}
+
+table.mw_metadata th {
+       font-weight: normal;
+}
+
+table.mw_metadata td {
+       padding: 0.1em;
+}
+
+table.mw_metadata {
+       border: none;
+       border-collapse: collapse;
+}
+
+table.mw_metadata td,
+table.mw_metadata th {
+       text-align: center;
+       border: 1px solid #aaaaaa;
+       padding-left: 5px;
+       padding-right: 5px;
+}
+
+table.mw_metadata th {
+       background-color: #f9f9f9;
+}
+
+table.mw_metadata td {
+       background-color: #fcfcfc;
+}
+
+table.mw_metadata ul.metadata-langlist {
+       list-style-type: none;
+       list-style-image: none;
+       padding-right: 5px;
+       padding-left: 5px;
+       margin: 0;
+}
+
+/* Correct directionality when page dir is different from site/user dir */
+.mw-content-ltr ul,
+.mw-content-rtl .mw-content-ltr ul {
+       /* @noflip */
+       margin: 0.3em 0 0 1.6em;
+       padding: 0;
+}
+
+.mw-content-rtl ul,
+.mw-content-ltr .mw-content-rtl ul {
+       /* @noflip */
+       margin: 0.3em 1.6em 0 0;
+       padding: 0;
+}
+
+.mw-content-ltr ol,
+.mw-content-rtl .mw-content-ltr ol {
+       /* @noflip */
+       margin: 0.3em 0 0 3.2em;
+       padding: 0;
+}
+
+.mw-content-rtl ol,
+.mw-content-ltr .mw-content-rtl ol {
+       /* @noflip */
+       margin: 0.3em 3.2em 0 0;
+       padding: 0;
+}
+
+/* @noflip */
+.mw-content-ltr dd,
+.mw-content-rtl .mw-content-ltr dd {
+       margin-left: 1.6em;
+       margin-right: 0;
+}
+
+/* @noflip */
+.mw-content-rtl dd,
+.mw-content-ltr .mw-content-rtl dd {
+       margin-right: 1.6em;
+       margin-left: 0;
+}
+
+/* Galleries */
+/* These display attributes look nonsensical, but are needed to support IE and FF2 */
+/* Don't forget to update commonPrint.css */
+li.gallerybox {
+       vertical-align: top;
+       display: -moz-inline-box;
+       display: inline-block;
+}
+
+ul.gallery,
+li.gallerybox {
+       zoom: 1;
+       *display: inline;
+}
+
+ul.gallery {
+       margin: 2px;
+       padding: 2px;
+       display: block;
+}
+
+li.gallerycaption {
+       font-weight: bold;
+       text-align: center;
+       display: block;
+       word-wrap: break-word;
+}
+
+li.gallerybox div.thumb {
+       text-align: center;
+       border: 1px solid #ccc;
+       background-color: #f9f9f9;
+       margin: 2px;
+}
+
+li.gallerybox div.thumb img {
+       display: block;
+       margin: 0 auto;
+}
+
+div.gallerytext {
+       overflow: hidden;
+       font-size: 94%;
+       padding: 2px 4px;
+       word-wrap: break-word;
+}
+
+/* new gallery stuff */
+ul.mw-gallery-nolines li.gallerybox div.thumb {
+       background-color: transparent;
+       border: none;
+}
+
+ul.mw-gallery-nolines li.gallerybox div.gallerytext {
+       text-align: center;
+}
+
+/* height constrained gallery */
+
+ul.mw-gallery-packed li.gallerybox div.thumb,
+ul.mw-gallery-packed-overlay li.gallerybox div.thumb,
+ul.mw-gallery-packed-hover li.gallerybox div.thumb {
+       background-color: transparent;
+       border: none;
+}
+
+ul.mw-gallery-packed li.gallerybox div.thumb img,
+ul.mw-gallery-packed-overlay li.gallerybox div.thumb img,
+ul.mw-gallery-packed-hover li.gallerybox div.thumb img {
+       margin: 0 auto;
+}
+
+ul.mw-gallery-packed-hover li.gallerybox,
+ul.mw-gallery-packed-overlay li.gallerybox {
+       position: relative;
+}
+
+ul.mw-gallery-packed-hover div.gallerytextwrapper {
+       overflow: hidden;
+       height: 0;
+}
+
+ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper,
+ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper,
+ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper {
+       position: absolute;
+       background: white;
+       background: rgba(255, 255, 255, 0.8);
+       padding: 5px 10px;
+       bottom: 0;
+       left: 0; /* Needed for IE */
+       height: auto;
+       font-weight: bold;
+       margin: 2px; /* correspond to style on div.thumb */
+}
+
+ul.mw-gallery-packed-hover,
+ul.mw-gallery-packed-overlay,
+ul.mw-gallery-packed {
+       text-align: center;
+}
+
+.mw-ajax-loader {
+       /* @embed */
+       background-image: url(images/ajax-loader.gif);
+       background-position: center center;
+       background-repeat: no-repeat;
+       padding: 16px;
+       position: relative;
+       top: -16px;
+}
+
+.mw-small-spinner {
+       padding: 10px !important;
+       margin-right: 0.6em;
+       /* @embed */
+       background-image: url(images/spinner.gif);
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+
+/* Language specific height correction for titles. Ref Bug 29405 and Bug 30809 */
+/* Languages like hi or ml require slightly more vertical space to show diacritics properly */
+h1:lang(anp),
+h1:lang(as),
+h1:lang(bh), /* Macrolanguage, used on bh.wikipedia.org, should be removed one day */
+h1:lang(bho),
+h1:lang(bn),
+h1:lang(gu),
+h1:lang(hi),
+h1:lang(kn),
+h1:lang(ks),
+h1:lang(ml),
+h1:lang(mr),
+h1:lang(my),
+h1:lang(mai),
+h1:lang(ne),
+h1:lang(new),
+h1:lang(or),
+h1:lang(pa),
+h1:lang(pi),
+h1:lang(sa),
+h1:lang(ta),
+h1:lang(te) {
+       line-height: 1.6em !important;
+}
+
+h2:lang(anp), h3:lang(anp), h4:lang(anp), h5:lang(anp), h6:lang(anp),
+h2:lang(as), h3:lang(as), h4:lang(as), h5:lang(as), h6:lang(as),
+h2:lang(bho), h3:lang(bho), h4:lang(bho), h5:lang(bho), h6:lang(bho),
+h2:lang(bh), h3:lang(bh), h4:lang(bh), h5:lang(bh), h6:lang(bh),
+h2:lang(bn), h3:lang(bn), h4:lang(bn), h5:lang(bn), h6:lang(bn),
+h2:lang(gu), h3:lang(gu), h4:lang(gu), h5:lang(gu), h6:lang(gu),
+h2:lang(hi), h3:lang(hi), h4:lang(hi), h5:lang(hi), h6:lang(hi),
+h2:lang(kn), h3:lang(kn), h4:lang(kn), h5:lang(kn), h6:lang(kn),
+h2:lang(ks), h3:lang(ks), h4:lang(ks), h5:lang(ks), h6:lang(ks),
+h2:lang(ml), h3:lang(ml), h4:lang(ml), h5:lang(ml), h6:lang(ml),
+h2:lang(mr), h3:lang(mr), h4:lang(mr), h5:lang(mr), h6:lang(mr),
+h2:lang(my), h3:lang(my), h4:lang(my), h5:lang(my), h6:lang(my),
+h2:lang(mai), h3:lang(mai), h4:lang(mai), h5:lang(mai), h6:lang(mai),
+h2:lang(ne), h3:lang(ne), h4:lang(ne), h5:lang(ne), h6:lang(ne),
+h2:lang(new), h3:lang(new), h4:lang(new), h5:lang(new), h6:lang(new),
+h2:lang(or), h3:lang(or), h4:lang(or), h5:lang(or), h6:lang(or),
+h2:lang(pa), h3:lang(pa), h4:lang(pa), h5:lang(pa), h6:lang(pa),
+h2:lang(pi), h3:lang(pi), h4:lang(pi), h5:lang(pi), h6:lang(pi),
+h2:lang(sa), h3:lang(sa), h4:lang(sa), h5:lang(sa), h6:lang(sa),
+h2:lang(ta), h3:lang(ta), h4:lang(ta), h5:lang(ta), h6:lang(ta),
+h2:lang(te), h3:lang(te), h4:lang(te), h5:lang(te), h6:lang(te) {
+       line-height: 1.2em;
+}
+
+/* Localised ordered list numbering for some languages */
+ol:lang(bcc) li,
+ol:lang(bqi) li,
+ol:lang(fa) li,
+ol:lang(glk) li,
+ol:lang(kk-arab) li,
+ol:lang(mzn) li {
+       list-style-type: -moz-persian;
+       list-style-type: persian;
+}
+
+ol:lang(ckb) li {
+       list-style-type: -moz-arabic-indic;
+       list-style-type: arabic-indic;
+}
+
+ol:lang(hi) li,
+ol:lang(mr) li {
+       list-style-type: -moz-devanagari;
+       list-style-type: devanagari;
+}
+
+ol:lang(as) li,
+ol:lang(bn) li {
+       list-style-type: -moz-bengali;
+       list-style-type: bengali;
+}
+
+ol:lang(or) li {
+       list-style-type: -moz-oriya;
+       list-style-type: oriya;
+}
+
+#toc ul, .toc ul {
+       margin: .3em 0;
+}
+
+/* Correct directionality when page dir is different from site/user dir */
+/* @noflip */ .mw-content-ltr .toc ul,
+.mw-content-ltr #toc ul,
+.mw-content-rtl .mw-content-ltr .toc ul,
+.mw-content-rtl .mw-content-ltr #toc ul {
+       text-align: left;
+}
+
+/* @noflip */ .mw-content-rtl .toc ul,
+.mw-content-rtl #toc ul,
+.mw-content-ltr .mw-content-rtl .toc ul,
+.mw-content-ltr .mw-content-rtl #toc ul {
+       text-align: right;
+}
+
+/* @noflip */ .mw-content-ltr .toc ul ul,
+.mw-content-ltr #toc ul ul,
+.mw-content-rtl .mw-content-ltr .toc ul ul,
+.mw-content-rtl .mw-content-ltr #toc ul ul {
+       margin: 0 0 0 2em;
+}
+
+/* @noflip */ .mw-content-rtl .toc ul ul,
+.mw-content-rtl #toc ul ul,
+.mw-content-ltr .mw-content-rtl .toc ul ul,
+.mw-content-ltr .mw-content-rtl #toc ul ul {
+       margin: 0 2em 0 0;
+}
+
+#toc #toctitle,
+.toc #toctitle,
+#toc .toctitle,
+.toc .toctitle {
+       direction: ltr;
+}
+
+/* tooltip styles */
+.mw-help-field-hint {
+       display: none;
+       margin-left: 2px;
+       margin-bottom: -8px;
+       padding: 0 0 0 15px;
+       /* @embed */
+       background-image: url(images/help-question.gif);
+       background-position: left center;
+       background-repeat: no-repeat;
+       cursor: pointer;
+       font-size: .8em;
+       text-decoration: underline;
+       color: #0645ad;
+}
+
+.mw-help-field-hint:hover {
+       /* @embed */
+       background-image: url(images/help-question-hover.gif);
+}
+
+.mw-help-field-data {
+       display: block;
+       background-color: #d6f3ff;
+       padding: 5px 8px 4px 8px;
+       border: 1px solid #5dc9f4;
+       margin-left: 20px;
+}
+
+#mw-clearyourcache,
+#mw-sitecsspreview,
+#mw-sitejspreview,
+#mw-usercsspreview,
+#mw-userjspreview {
+       direction: ltr;
+       unicode-bidi: embed;
+}
+
+/* Correct user & content directionality when viewing a diff */
+.diff-currentversion-title,
+.diff {
+       direction: ltr;
+       unicode-bidi: embed;
+}
+
+/* @noflip */ .diff-contentalign-right td {
+       direction: rtl;
+       unicode-bidi: embed;
+}
+
+/* @noflip */ .diff-contentalign-left td {
+       direction: ltr;
+       unicode-bidi: embed;
+}
+
+.diff-multi,
+.diff-otitle,
+.diff-ntitle,
+.diff-lineno {
+       direction: ltr !important;
+       unicode-bidi: embed;
+}
+
+#mw-revision-info,
+#mw-revision-info-current,
+#mw-revision-nav {
+       direction: ltr;
+       display: inline;
+}
+
+/* Images */
+
+/* @noflip */ div.tright,
+div.floatright,
+table.floatright {
+       clear: right;
+       float: right;
+}
+
+/* @noflip */ div.tleft,
+div.floatleft,
+table.floatleft {
+       float: left;
+       clear: left;
+}
+
+div.floatright,
+table.floatright,
+div.floatleft,
+table.floatleft {
+       position: relative;
+}
+
+/* bug 12205 */
+#mw-credits a {
+       unicode-bidi: embed;
+}
+
+/* Accessibility */
+.mw-jump,
+#jump-to-nav {
+       overflow: hidden;
+       height: 0;
+       zoom: 1; /* http://webaim.org/techniques/skipnav/#iequirk */
+}
+
+/* Print footer should be hidden by default in screen. */
+.printfooter {
+       display: none;
+}
+
+/* For developers */
+.xdebug-error {
+       position: absolute;
+       z-index: 99;
+}
+
+.mw-editsection,
+.toctoggle,
+#jump-to-nav {
+       -moz-user-select: none;
+       -webkit-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+}
+
+/* Display editsection links smaller and next to headings */
+.mw-editsection,
+.mw-editsection-like {
+       font-size: small;
+       font-weight: normal;
+       margin-left: 1em;
+       vertical-align: baseline;
+       /* Reset line-height; headings tend to have it set to larger values */
+       line-height: 1em;
+       /* As .mw-editsection is a <span> (inline element), it is treated as part */
+       /* of the heading content when selecting text by multiple clicks and thus */
+       /* selected together with heading content, despite the user-select: none; */
+       /* rule set above. This enforces non-selection without changing the look. */
+       display: inline-block;
+}
+
+/* Correct directionality when page dir is different from site/user dir */
+/* @noflip */
+.mw-content-ltr .mw-editsection,
+.mw-content-rtl .mw-content-ltr .mw-editsection {
+       margin-left: 1em;
+}
+
+/* @noflip */
+.mw-content-rtl .mw-editsection,
+.mw-content-ltr .mw-content-rtl .mw-editsection {
+       margin-right: 1em;
+}
+
+/* Prevent citations and subscripts from interfering with the line-height */
+sup,
+sub {
+       line-height: 1;
+}
diff --git a/resources/src/mediawiki.legacy/upload.js b/resources/src/mediawiki.legacy/upload.js
new file mode 100644 (file)
index 0000000..144bdf9
--- /dev/null
@@ -0,0 +1,246 @@
+/*jshint camelcase:false */
+( function ( mw, $ ) {
+       var ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
+               $license = $( '#wpLicense' ), uploadWarning, uploadLicense;
+
+       window.wgUploadWarningObj = uploadWarning = {
+               responseCache: { '': '&nbsp;' },
+               nameToCheck: '',
+               typing: false,
+               delay: 500, // ms
+               timeoutID: false,
+
+               keypress: function () {
+                       if ( !ajaxUploadDestCheck ) {
+                               return;
+                       }
+
+                       // Find file to upload
+                       if ( !$( '#wpDestFile' ).length || !$( '#wpDestFile-warning' ).length ) {
+                               return;
+                       }
+
+                       this.nameToCheck = $( '#wpDestFile' ).val();
+
+                       // Clear timer
+                       if ( this.timeoutID ) {
+                               clearTimeout( this.timeoutID );
+                       }
+                       // Check response cache
+                       if ( this.responseCache.hasOwnProperty( this.nameToCheck ) ) {
+                               this.setWarning( this.responseCache[this.nameToCheck] );
+                               return;
+                       }
+
+                       this.timeoutID = setTimeout( function () {
+                               uploadWarning.timeout();
+                       }, this.delay );
+               },
+
+               checkNow: function ( fname ) {
+                       if ( !ajaxUploadDestCheck ) {
+                               return;
+                       }
+                       if ( this.timeoutID ) {
+                               clearTimeout( this.timeoutID );
+                       }
+                       this.nameToCheck = fname;
+                       this.timeout();
+               },
+
+               timeout: function () {
+                       var $spinnerDestCheck;
+                       if ( !ajaxUploadDestCheck || this.nameToCheck === '' ) {
+                               return;
+                       }
+                       $spinnerDestCheck = $.createSpinner().insertAfter( '#wpDestFile' );
+
+                       ( new mw.Api() ).get( {
+                               action: 'query',
+                               titles: ( new mw.Title( this.nameToCheck, mw.config.get( 'wgNamespaceIds' ).file ) ).getPrefixedText(),
+                               prop: 'imageinfo',
+                               iiprop: 'uploadwarning',
+                               indexpageids: ''
+                       } ).done( function ( result ) {
+                               var resultOut = '';
+                               if ( result.query ) {
+                                       resultOut = result.query.pages[result.query.pageids[0]].imageinfo[0];
+                               }
+                               $spinnerDestCheck.remove();
+                               uploadWarning.processResult( resultOut, uploadWarning.nameToCheck );
+                       } );
+               },
+
+               processResult: function ( result, fileName ) {
+                       this.setWarning( result.html );
+                       this.responseCache[fileName] = result.html;
+               },
+
+               setWarning: function ( warning ) {
+                       $( '#wpDestFile-warning' ).html( warning );
+
+                       // Set a value in the form indicating that the warning is acknowledged and
+                       // doesn't need to be redisplayed post-upload
+                       if ( !warning ) {
+                               $( '#wpDestFileWarningAck' ).val( '' );
+                       } else {
+                               $( '#wpDestFileWarningAck' ).val( '1' );
+                       }
+
+               }
+       };
+
+       uploadLicense = {
+
+               responseCache: { '': '' },
+
+               fetchPreview: function ( license ) {
+                       var $spinnerLicense;
+                       if ( !mw.config.get( 'wgAjaxLicensePreview' ) ) {
+                               return;
+                       }
+                       if ( this.responseCache.hasOwnProperty( license ) ) {
+                               this.showPreview( this.responseCache[license] );
+                               return;
+                       }
+
+                       $spinnerLicense = $.createSpinner().insertAfter( '#wpLicense' );
+
+                       ( new mw.Api() ).get( {
+                               action: 'parse',
+                               text: '{{' + license + '}}',
+                               title: $( '#wpDestFile' ).val() || 'File:Sample.jpg',
+                               prop: 'text',
+                               pst: ''
+                       } ).done( function ( result ) {
+                               $spinnerLicense.remove();
+                               uploadLicense.processResult( result, license );
+                       } );
+               },
+
+               processResult: function ( result, license ) {
+                       this.responseCache[license] = result.parse.text['*'];
+                       this.showPreview( this.responseCache[license] );
+               },
+
+               showPreview: function ( preview ) {
+                       $( '#mw-license-preview' ).html( preview );
+               }
+
+       };
+
+       $( function () {
+               // Disable URL box if the URL copy upload source type is not selected
+               if ( !$( '#wpSourceTypeurl' ).prop( 'checked' ) ) {
+                       $( '#wpUploadFileURL' ).prop( 'disabled', true );
+               }
+
+               // AJAX wpDestFile warnings
+               if ( ajaxUploadDestCheck ) {
+                       // Insert an event handler that fetches upload warnings when wpDestFile
+                       // has been changed
+                       $( '#wpDestFile' ).change( function () {
+                               uploadWarning.checkNow( $( this ).val() );
+                       } );
+                       // Insert a row where the warnings will be displayed just below the
+                       // wpDestFile row
+                       $( '#mw-htmlform-description tbody' ).append(
+                               $( '<tr>' ).append(
+                                       $( '<td>' )
+                                               .attr( 'id', 'wpDestFile-warning' )
+                                               .attr( 'colspan', 2 )
+                               )
+                       );
+               }
+
+               if ( mw.config.get( 'wgAjaxLicensePreview' ) && $license.length ) {
+                       // License selector check
+                       $license.change( function () {
+                               // We might show a preview
+                               uploadLicense.fetchPreview( $license.val() );
+                       } );
+
+                       // License selector table row
+                       $license.closest( 'tr' ).after(
+                               $( '<tr>' ).append(
+                                       $( '<td>' ),
+                                       $( '<td>' ).attr( 'id', 'mw-license-preview' )
+                               )
+                       );
+               }
+
+               // fillDestFile setup
+               $.each( mw.config.get( 'wgUploadSourceIds' ), function ( index, sourceId ) {
+                       $( '#' + sourceId ).change( function () {
+                               var path, slash, backslash, fname;
+                               if ( !mw.config.get( 'wgUploadAutoFill' ) ) {
+                                       return;
+                               }
+                               // Remove any previously flagged errors
+                               $( '#mw-upload-permitted' ).attr( 'class', '' );
+                               $( '#mw-upload-prohibited' ).attr( 'class', '' );
+
+                               path = $( this ).val();
+                               // Find trailing part
+                               slash = path.lastIndexOf( '/' );
+                               backslash = path.lastIndexOf( '\\' );
+                               if ( slash === -1 && backslash === -1 ) {
+                                       fname = path;
+                               } else if ( slash > backslash ) {
+                                       fname = path.substring( slash + 1 );
+                               } else {
+                                       fname = path.substring( backslash + 1 );
+                               }
+
+                               // Clear the filename if it does not have a valid extension.
+                               // URLs are less likely to have a useful extension, so don't include them in the
+                               // extension check.
+                               if (
+                                       mw.config.get( 'wgStrictFileExtensions' ) &&
+                                       mw.config.get( 'wgFileExtensions' ) &&
+                                       $( this ).attr( 'id' ) !== 'wpUploadFileURL'
+                               ) {
+                                       if (
+                                               fname.lastIndexOf( '.' ) === -1 ||
+                                               $.inArray(
+                                                       fname.substr( fname.lastIndexOf( '.' ) + 1 ).toLowerCase(),
+                                                       $.map( mw.config.get( 'wgFileExtensions' ), function ( element ) {
+                                                               return element.toLowerCase();
+                                                       } )
+                                               ) === -1
+                                       ) {
+                                               // Not a valid extension
+                                               // Clear the upload and set mw-upload-permitted to error
+                                               $( this ).val( '' );
+                                               $( '#mw-upload-permitted' ).attr( 'class', 'error' );
+                                               $( '#mw-upload-prohibited' ).attr( 'class', 'error' );
+                                               // Clear wpDestFile as well
+                                               $( '#wpDestFile' ).val( '' );
+
+                                               return false;
+                                       }
+                               }
+
+                               // Replace spaces by underscores
+                               fname = fname.replace( / /g, '_' );
+                               // Capitalise first letter if needed
+                               if ( mw.config.get( 'wgCapitalizeUploads' ) ) {
+                                       fname = fname.charAt( 0 ).toUpperCase().concat( fname.substring( 1 ) );
+                               }
+
+                               // Output result
+                               if ( $( '#wpDestFile' ).length ) {
+                                       // Call decodeURIComponent function to remove possible URL-encoded characters
+                                       // from the file name (bug 30390). Especially likely with upload-form-url.
+                                       // decodeURIComponent can throw an exception if input is invalid utf-8
+                                       try {
+                                               $( '#wpDestFile' ).val( decodeURIComponent( fname ) );
+                                       } catch ( err ) {
+                                               $( '#wpDestFile' ).val( fname );
+                                       }
+                                       uploadWarning.checkNow( fname );
+                               }
+                       } );
+               } );
+       } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.legacy/wikibits.js b/resources/src/mediawiki.legacy/wikibits.js
new file mode 100644 (file)
index 0000000..5c6e63b
--- /dev/null
@@ -0,0 +1,201 @@
+/**
+ * MediaWiki legacy wikibits
+ */
+( function ( mw, $ ) {
+       var msg,
+               win = window,
+               ua = navigator.userAgent.toLowerCase(),
+               onloadFuncts = [];
+
+/**
+ * User-agent sniffing.
+ *
+ * @deprecated since 1.17 Use jquery.client instead
+ */
+
+msg = 'Use feature detection or module jquery.client instead.';
+
+mw.log.deprecate( win, 'clientPC', ua, msg );
+
+// Ignored dummy values
+mw.log.deprecate( win, 'is_gecko', false, msg );
+mw.log.deprecate( win, 'is_chrome_mac', false, msg );
+mw.log.deprecate( win, 'is_chrome', false, msg );
+mw.log.deprecate( win, 'webkit_version', false, msg );
+mw.log.deprecate( win, 'is_safari_win', false, msg );
+mw.log.deprecate( win, 'is_safari', false, msg );
+mw.log.deprecate( win, 'webkit_match', false, msg );
+mw.log.deprecate( win, 'is_ff2', false, msg );
+mw.log.deprecate( win, 'ff2_bugs', false, msg );
+mw.log.deprecate( win, 'is_ff2_win', false, msg );
+mw.log.deprecate( win, 'is_ff2_x11', false, msg );
+mw.log.deprecate( win, 'opera95_bugs', false, msg );
+mw.log.deprecate( win, 'opera7_bugs', false, msg );
+mw.log.deprecate( win, 'opera6_bugs', false, msg );
+mw.log.deprecate( win, 'is_opera_95', false, msg );
+mw.log.deprecate( win, 'is_opera_preseven', false, msg );
+mw.log.deprecate( win, 'is_opera', false, msg );
+mw.log.deprecate( win, 'ie6_bugs', false, msg );
+
+/**
+ * DOM utilities for handling of events, text nodes and selecting elements
+ *
+ * @deprecated since 1.17 Use jQuery instead
+ */
+msg = 'Use jQuery instead.';
+
+// Ignored dummy values
+mw.log.deprecate( win, 'doneOnloadHook', undefined, msg );
+mw.log.deprecate( win, 'onloadFuncts', [], msg );
+mw.log.deprecate( win, 'runOnloadHook', $.noop, msg );
+mw.log.deprecate( win, 'changeText', $.noop, msg );
+mw.log.deprecate( win, 'killEvt', $.noop, msg );
+mw.log.deprecate( win, 'addHandler', $.noop, msg );
+mw.log.deprecate( win, 'hookEvent', $.noop, msg );
+mw.log.deprecate( win, 'addClickHandler', $.noop, msg );
+mw.log.deprecate( win, 'removeHandler', $.noop, msg );
+mw.log.deprecate( win, 'getElementsByClassName', function () { return []; }, msg );
+mw.log.deprecate( win, 'getInnerText', function () { return ''; }, msg );
+
+// Run a function after the window onload event is fired
+mw.log.deprecate( win, 'addOnloadHook', function ( hookFunct ) {
+       if ( onloadFuncts ) {
+               onloadFuncts.push(hookFunct);
+       } else {
+               // If func queue is gone the event has happened already,
+               // run immediately instead of queueing.
+               hookFunct();
+       }
+}, msg );
+
+$( win ).on( 'load', function () {
+       var i, functs;
+
+       // Don't run twice
+       if ( !onloadFuncts ) {
+               return;
+       }
+
+       // Deference and clear onloadFuncts before running any
+       // hooks to make sure we don't miss any addOnloadHook
+       // calls.
+       functs = onloadFuncts.slice();
+       onloadFuncts = undefined;
+
+       // Execute the queued functions
+       for ( i = 0; i < functs.length; i++ ) {
+               functs[i]();
+       }
+} );
+
+/**
+ * Toggle checkboxes with shift selection
+ *
+ * @deprecated since 1.17 Use jquery.checkboxShiftClick instead
+ */
+msg = 'Use jquery.checkboxShiftClick instead.';
+mw.log.deprecate( win, 'checkboxes', [], msg );
+mw.log.deprecate( win, 'lastCheckbox', null, msg );
+mw.log.deprecate( win, 'setupCheckboxShiftClick', $.noop, msg );
+mw.log.deprecate( win, 'addCheckboxClickHandlers', $.noop, msg );
+mw.log.deprecate( win, 'checkboxClickHandler', $.noop, msg );
+
+/**
+ * Add a button to the default editor toolbar
+ *
+ * @deprecated since 1.17 Use mw.toolbar instead
+ */
+mw.log.deprecate( win, 'mwEditButtons', [], 'Use mw.toolbar instead.' );
+mw.log.deprecate( win, 'mwCustomEditButtons', [], 'Use mw.toolbar instead.' );
+
+/**
+ * Spinner creation, injection and removal
+ *
+ * @deprecated since 1.18 Use jquery.spinner instead
+ */
+mw.log.deprecate( win, 'injectSpinner', $.noop, 'Use jquery.spinner instead.' );
+mw.log.deprecate( win, 'removeSpinner', $.noop, 'Use jquery.spinner instead.' );
+
+/**
+ * Escape utilities
+ *
+ * @deprecated since 1.18 Use mw.html instead
+ */
+mw.log.deprecate( win, 'escapeQuotes', $.noop, 'Use mw.html instead.' );
+mw.log.deprecate( win, 'escapeQuotesHTML', $.noop, 'Use mw.html instead.' );
+
+/**
+ * Display a message to the user
+ *
+ * @deprecated since 1.17 Use mediawiki.notify instead
+ * @param {string|HTMLElement} message To be put inside the message box
+ */
+mw.log.deprecate( win, 'jsMsg', function ( message ) {
+       if ( !arguments.length || message === '' || message === null ) {
+               return true;
+       }
+       if ( typeof message !== 'object' ) {
+               message = $.parseHTML( message );
+       }
+       mw.notify( message, { autoHide: true, tag: 'legacy' } );
+       return true;
+}, 'Use mediawiki.notify instead.' );
+
+/**
+ * Misc. utilities
+ *
+ * @deprecated since 1.17 Use mediawiki.util instead
+ */
+msg = 'Use mediawiki.util instead.';
+mw.log.deprecate( win, 'updateTooltipAccessKeys', mw.util.updateTooltipAccessKeys, msg );
+mw.log.deprecate( win, 'addPortletLink', mw.util.addPortletLink, msg );
+mw.log.deprecate( win, 'appendCSS', mw.util.addCSS, msg );
+msg = 'Use jquery.accessKeyLabel instead.';
+mw.log.deprecate( win, 'tooltipAccessKeyPrefix', 'alt-', msg );
+mw.log.deprecate( win, 'tooltipAccessKeyRegexp', /\[(alt-)?(.)\]$/, msg );
+
+/**
+ * Wikipage import methods
+ */
+
+// included-scripts tracker
+win.loadedScripts = {};
+
+win.importScript = function ( page ) {
+       var uri = mw.config.get( 'wgScript' ) + '?title=' +
+               mw.util.wikiUrlencode( page ) +
+               '&action=raw&ctype=text/javascript';
+       return win.importScriptURI( uri );
+};
+
+win.importScriptURI = function ( url ) {
+       if ( win.loadedScripts[url] ) {
+               return null;
+       }
+       win.loadedScripts[url] = true;
+       var s = document.createElement( 'script' );
+       s.setAttribute( 'src', url );
+       s.setAttribute( 'type', 'text/javascript' );
+       document.getElementsByTagName( 'head' )[0].appendChild( s );
+       return s;
+};
+
+win.importStylesheet = function ( page ) {
+       var uri = mw.config.get( 'wgScript' ) + '?title=' +
+               mw.util.wikiUrlencode( page ) +
+               '&action=raw&ctype=text/css';
+       return win.importStylesheetURI( uri );
+};
+
+win.importStylesheetURI = function ( url, media ) {
+       var l = document.createElement( 'link' );
+       l.rel = 'stylesheet';
+       l.href = url;
+       if ( media ) {
+               l.media = media;
+       }
+       document.getElementsByTagName('head')[0].appendChild( l );
+       return l;
+};
+
+}( mediaWiki, jQuery ) );
index acf1157..7108fae 100644 (file)
@@ -65,7 +65,7 @@
        }
 
        &:focus {
-               box-shadow: inset .45em 0 0 #5088f7;
+               box-shadow: inset .45em 0 0 @colorProgressive;
                border-color: @colorGrayDark;
                // Remove focus glow on input[type="search"]
                outline: 0;
diff --git a/resources/src/mediawiki/images/arrow-sort-ascending.png b/resources/src/mediawiki/images/arrow-sort-ascending.png
new file mode 100644 (file)
index 0000000..f2d339d
Binary files /dev/null and b/resources/src/mediawiki/images/arrow-sort-ascending.png differ
diff --git a/resources/src/mediawiki/images/arrow-sort-ascending.svg b/resources/src/mediawiki/images/arrow-sort-ascending.svg
new file mode 100644 (file)
index 0000000..1e7a094
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12"><path d="M1 10h10l-5-8.658z" fill="#00a"/></svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki/images/arrow-sort-descending.png b/resources/src/mediawiki/images/arrow-sort-descending.png
new file mode 100644 (file)
index 0000000..8afbca9
Binary files /dev/null and b/resources/src/mediawiki/images/arrow-sort-descending.png differ
diff --git a/resources/src/mediawiki/images/arrow-sort-descending.svg b/resources/src/mediawiki/images/arrow-sort-descending.svg
new file mode 100644 (file)
index 0000000..cf11adb
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12"><path d="M1 2h10l-5 8.658z" fill="#00a"/></svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-ltr.png b/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-ltr.png
new file mode 100644 (file)
index 0000000..2a64fd0
Binary files /dev/null and b/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-ltr.png differ
diff --git a/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-rtl.png b/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-rtl.png
new file mode 100644 (file)
index 0000000..78a493e
Binary files /dev/null and b/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-rtl.png differ
diff --git a/resources/src/mediawiki/images/pager-arrow-disabled-forward-ltr.png b/resources/src/mediawiki/images/pager-arrow-disabled-forward-ltr.png
new file mode 100644 (file)
index 0000000..aa4fbf8
Binary files /dev/null and b/resources/src/mediawiki/images/pager-arrow-disabled-forward-ltr.png differ
diff --git a/resources/src/mediawiki/images/pager-arrow-disabled-forward-rtl.png b/resources/src/mediawiki/images/pager-arrow-disabled-forward-rtl.png
new file mode 100644 (file)
index 0000000..83df068
Binary files /dev/null and b/resources/src/mediawiki/images/pager-arrow-disabled-forward-rtl.png differ
diff --git a/resources/src/mediawiki/images/pager-arrow-fastforward-ltr.png b/resources/src/mediawiki/images/pager-arrow-fastforward-ltr.png
new file mode 100644 (file)
index 0000000..caf5033
Binary files /dev/null and b/resources/src/mediawiki/images/pager-arrow-fastforward-ltr.png differ
diff --git a/resources/src/mediawiki/images/pager-arrow-fastforward-rtl.png b/resources/src/mediawiki/images/pager-arrow-fastforward-rtl.png
new file mode 100644 (file)
index 0000000..52b32a5
Binary files /dev/null and b/resources/src/mediawiki/images/pager-arrow-fastforward-rtl.png differ
diff --git a/resources/src/mediawiki/images/pager-arrow-forward-ltr.png b/resources/src/mediawiki/images/pager-arrow-forward-ltr.png
new file mode 100644 (file)
index 0000000..3f8fee3
Binary files /dev/null and b/resources/src/mediawiki/images/pager-arrow-forward-ltr.png differ
diff --git a/resources/src/mediawiki/images/pager-arrow-forward-rtl.png b/resources/src/mediawiki/images/pager-arrow-forward-rtl.png
new file mode 100644 (file)
index 0000000..f363bf6
Binary files /dev/null and b/resources/src/mediawiki/images/pager-arrow-forward-rtl.png differ
diff --git a/resources/src/mediawiki/mediawiki.pager.tablePager.less b/resources/src/mediawiki/mediawiki.pager.tablePager.less
new file mode 100644 (file)
index 0000000..d37aec5
--- /dev/null
@@ -0,0 +1,84 @@
+/*!
+ * Structures generated by the TablePager PHP class
+ * in MediaWiki (used e.g. on Special:ListFiles).
+ */
+
+@import "mediawiki.mixins";
+
+.TablePager {
+       min-width: 80%;
+}
+
+.TablePager .TablePager_sort-ascending a {
+       padding-left: 15px;
+       background: none left center no-repeat;
+       .background-image-svg('images/arrow-sort-ascending.svg', 'images/arrow-sort-ascending.png');
+}
+
+.TablePager .TablePager_sort-descending a {
+       padding-left: 15px;
+       background: none left center no-repeat;
+       .background-image-svg('images/arrow-sort-descending.svg', 'images/arrow-sort-descending.png');
+}
+
+.TablePager_nav {
+       margin: 0 auto;
+}
+
+.TablePager_nav td {
+       padding: 3px;
+       text-align: center;
+       vertical-align: center;
+}
+
+.TablePager_nav a {
+       text-decoration: none;
+}
+
+.TablePager_nav td.TablePager_nav-first .TablePager_nav-disabled {
+       padding-top: 25px;
+       /* @embed */
+       background: url(images/pager-arrow-disabled-fastforward-rtl.png) center top no-repeat;
+}
+
+.TablePager_nav td.TablePager_nav-prev .TablePager_nav-disabled {
+       padding-top: 25px;
+       /* @embed */
+       background: url(images/pager-arrow-disabled-forward-rtl.png) center top no-repeat;
+}
+
+.TablePager_nav td.TablePager_nav-next .TablePager_nav-disabled {
+       padding-top: 25px;
+       /* @embed */
+       background: url(images/pager-arrow-disabled-forward-ltr.png) center top no-repeat;
+}
+
+.TablePager_nav td.TablePager_nav-last .TablePager_nav-disabled {
+       padding-top: 25px;
+       /* @embed */
+       background: url(images/pager-arrow-disabled-fastforward-ltr.png) center top no-repeat;
+}
+
+.TablePager_nav td.TablePager_nav-first .TablePager_nav-enabled {
+       padding-top: 25px;
+       /* @embed */
+       background: url(images/pager-arrow-fastforward-rtl.png) center top no-repeat;
+}
+
+.TablePager_nav td.TablePager_nav-prev .TablePager_nav-enabled {
+       padding-top: 25px;
+       /* @embed */
+       background: url(images/pager-arrow-forward-rtl.png) center top no-repeat;
+}
+
+.TablePager_nav td.TablePager_nav-next .TablePager_nav-enabled {
+       padding-top: 25px;
+       /* @embed */
+       background: url(images/pager-arrow-forward-ltr.png) center top no-repeat;
+}
+
+.TablePager_nav td.TablePager_nav-last .TablePager_nav-enabled {
+       padding-top: 25px;
+       /* @embed */
+       background: url(images/pager-arrow-fastforward-ltr.png) center top no-repeat;
+}
index 01efef4..56bb3d3 100644 (file)
@@ -7,15 +7,14 @@
 var mediaWikiLoadStart = ( new Date() ).getTime();
 
 /**
- * Returns false when run in a black-listed browser
+ * Returns false for Grade C supported browsers.
  *
- * This function will be deleted after it's used, so do not expand it to be
- * generally useful beyond startup.
+ * This function should only be used by the Startup module, do not expand it to
+ * be generally useful beyond startup.
  *
  * See also:
- * - https://www.mediawiki.org/wiki/Compatibility#Browser
- * - http://jquerymobile.com/gbs/
- * - http://jquery.com/browser-support/
+ * - https://www.mediawiki.org/wiki/Compatibility#Browsers
+ * - https://jquery.com/browser-support/
  */
 
 /*jshint unused: false */
deleted file mode 100644 (file)
index 6b9464a914398344a7ddcbd239be61441fa68fea..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,194 +0,0 @@
-/**
- * Remote Scripting Library
- * Copyright 2005 modernmethod, inc
- * Under the open source BSD license
- * http://www.modernmethod.com/sajax/
- */
-
-/*jshint camelcase:false */
-/*global alert */
-( function ( mw ) {
-
-/**
- * if sajax_debug_mode is true, this function outputs given the message into
- * the element with id = sajax_debug; if no such element exists in the document,
- * it is injected.
- */
-function debug( text ) {
-       if ( !window.sajax_debug_mode ) {
-               return false;
-       }
-
-       var b, m,
-               e = document.getElementById( 'sajax_debug' );
-
-       if ( !e ) {
-               e = document.createElement( 'p' );
-               e.className = 'sajax_debug';
-               e.id = 'sajax_debug';
-
-               b = document.getElementsByTagName( 'body' )[0];
-
-               if ( b.firstChild ) {
-                       b.insertBefore( e, b.firstChild );
-               } else {
-                       b.appendChild( e );
-               }
-       }
-
-       m = document.createElement( 'div' );
-       m.appendChild( document.createTextNode( text ) );
-
-       e.appendChild( m );
-
-       return true;
-}
-
-/**
- * Compatibility wrapper for creating a new XMLHttpRequest object.
- */
-function createXhr() {
-       debug( 'sajax_init_object() called..' );
-       var a;
-       try {
-               // Try the new style before ActiveX so we don't
-               // unnecessarily trigger warnings in IE 7 when
-               // set to prompt about ActiveX usage
-               a = new XMLHttpRequest();
-       } catch ( xhrE ) {
-               try {
-                       a = new window.ActiveXObject( 'Msxml2.XMLHTTP' );
-               } catch ( msXmlE ) {
-                       try {
-                               a = new window.ActiveXObject( 'Microsoft.XMLHTTP' );
-                       } catch ( msXhrE ) {
-                               a = null;
-                       }
-               }
-       }
-       if ( !a ) {
-               debug( 'Could not create connection object.' );
-       }
-
-       return a;
-}
-
-/**
- * Perform an AJAX call to MediaWiki. Calls are handled by AjaxDispatcher.php
- *   func_name - the name of the function to call. Must be registered in $wgAjaxExportList
- *   args - an array of arguments to that function
- *   target - the target that will handle the result of the call. If this is a function,
- *            if will be called with the XMLHttpRequest as a parameter; if it's an input
- *            element, its value will be set to the resultText; if it's another type of
- *            element, its innerHTML will be set to the resultText.
- *
- * Example:
- *    sajax_do_call( 'doFoo', [1, 2, 3], document.getElementById( 'showFoo' ) );
- *
- * This will call the doFoo function via MediaWiki's AjaxDispatcher, with
- * (1, 2, 3) as the parameter list, and will show the result in the element
- * with id = showFoo
- */
-function doAjaxRequest( func_name, args, target ) {
-       var i, x, uri, post_data;
-       uri = mw.util.wikiScript() + '?action=ajax';
-       if ( window.sajax_request_type === 'GET' ) {
-               if ( uri.indexOf( '?' ) === -1 ) {
-                       uri = uri + '?rs=' + encodeURIComponent( func_name );
-               } else {
-                       uri = uri + '&rs=' + encodeURIComponent( func_name );
-               }
-               for ( i = 0; i < args.length; i++ ) {
-                       uri = uri + '&rsargs[]=' + encodeURIComponent( args[i] );
-               }
-               //uri = uri + '&rsrnd=' + new Date().getTime();
-               post_data = null;
-       } else {
-               post_data = 'rs=' + encodeURIComponent( func_name );
-               for ( i = 0; i < args.length; i++ ) {
-                       post_data = post_data + '&rsargs[]=' + encodeURIComponent( args[i] );
-               }
-       }
-       x = createXhr();
-       if ( !x ) {
-               alert( 'AJAX not supported' );
-               return false;
-       }
-
-       try {
-               x.open( window.sajax_request_type, uri, true );
-       } catch ( e ) {
-               if ( location.hostname === 'localhost' ) {
-                       alert( 'Your browser blocks XMLHttpRequest to "localhost", try using a real hostname for development/testing.' );
-               }
-               throw e;
-       }
-       if ( window.sajax_request_type === 'POST' ) {
-               x.setRequestHeader( 'Method', 'POST ' + uri + ' HTTP/1.1' );
-               x.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
-       }
-       x.setRequestHeader( 'Pragma', 'cache=yes' );
-       x.setRequestHeader( 'Cache-Control', 'no-transform' );
-       x.onreadystatechange = function () {
-               if ( x.readyState !== 4 ) {
-                       return;
-               }
-
-               debug( 'received (' + x.status + ' ' + x.statusText + ') ' + x.responseText );
-
-               //if ( x.status != 200 )
-               //      alert( 'Error: ' + x.status + ' ' + x.statusText + ': ' + x.responseText );
-               //else
-
-               if ( typeof target === 'function' ) {
-                       target( x );
-               } else if ( typeof target === 'object' ) {
-                       if ( target.tagName === 'INPUT' ) {
-                               if ( x.status === 200 ) {
-                                       target.value = x.responseText;
-                               }
-                               //else alert( 'Error: ' + x.status + ' ' + x.statusText + ' (' + x.responseText + ')' );
-                       } else {
-                               if ( x.status === 200 ) {
-                                       target.innerHTML = x.responseText;
-                               } else {
-                                       target.innerHTML = '<div class="error">Error: ' + x.status +
-                                               ' ' + x.statusText + ' (' + x.responseText + ')</div>';
-                               }
-                       }
-               } else {
-                       alert( 'Bad target for sajax_do_call: not a function or object: ' + target );
-               }
-       };
-
-       debug( func_name + ' uri = ' + uri + ' / post = ' + post_data );
-       x.send( post_data );
-       debug( func_name + ' waiting..' );
-
-       return true;
-}
-
-/**
- * @return {boolean} Whether the browser supports AJAX
- */
-function wfSupportsAjax() {
-       var request = createXhr(),
-               supportsAjax = request ? true : false;
-
-       request = undefined;
-       return supportsAjax;
-}
-
-// Expose + Mark as deprecated
-var deprecationNotice = 'Sajax is deprecated, use jQuery.ajax or mediawiki.api instead.';
-
-// Variables
-mw.log.deprecate( window, 'sajax_debug_mode', false, deprecationNotice );
-mw.log.deprecate( window, 'sajax_request_type', 'GET', deprecationNotice );
-// Methods
-mw.log.deprecate( window, 'sajax_debug', debug, deprecationNotice );
-mw.log.deprecate( window, 'sajax_init_object', createXhr, deprecationNotice );
-mw.log.deprecate( window, 'sajax_do_call', doAjaxRequest, deprecationNotice );
-mw.log.deprecate( window, 'wfSupportsAjax', wfSupportsAjax, deprecationNotice );
-
-}( mediaWiki ) );
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..6cf8d718503709f208b5fbecec35ab55ea3d9f13
--- /dev/null
@@ -0,0 +1 @@
+../../resources/src/mediawiki.legacy/ajax.js
\ No newline at end of file
diff --git a/skins/common/commonPrint.css b/skins/common/commonPrint.css
deleted file mode 100644 (file)
index dda17fb..0000000
+++ /dev/null
@@ -1,431 +0,0 @@
-/**
- * MediaWiki Print style sheet for CSS2-capable browsers.
- * Copyright Gabriel Wicke, http://www.aulinx.de/
- *
- * Derived from the plone (http://plone.org/) styles
- * Copyright Alexander Limi
- */
-
-/* Thanks to A List Apart (http://alistapart.com/) for useful extras */
-
-/**
- * Hide all the elements irrelevant for printing
- */
-.noprint,
-div#jump-to-nav,
-.mw-jump,
-div.top,
-div#column-one,
-#colophon,
-.mw-editsection,
-.mw-editsection-like,
-.toctoggle,
-#toc.tochidden,
-div#f-poweredbyico,
-div#f-copyrightico,
-li#viewcount,
-li#about,
-li#disclaimer,
-li#mobileview,
-li#privacy,
-#footer-places,
-.mw-hidden-catlinks,
-tr.mw-metadata-show-hide-extended,
-span.mw-filepage-other-resolutions,
-#filetoc,
-.usermessage,
-.patrollink,
-#mw-navigation,
-#siteNotice {
-       display: none;
-}
-
-/**
- * Pagination
- */
-.wikitable, .thumb, img {
-       page-break-inside: avoid;
-}
-
-h2, h3, h4, h5, h6 {
-       page-break-after: avoid;
-}
-
-p {
-       widows: 3;
-       orphans: 3;
-}
-
-/**
- * Generic HTML elements
- */
-body {
-       background: white;
-       color: black;
-       margin: 0;
-       padding: 0;
-}
-
-ul {
-       list-style-type: square;
-}
-
-h1, h2, h3, h4, h5, h6 {
-       font-weight: bold;
-}
-
-dt {
-       font-weight: bold;
-}
-
-p {
-       margin: 1em 0;
-       line-height: 1.2em;
-}
-
-pre, .mw-code {
-       border: 1pt dashed black;
-       white-space: pre;
-       font-size: 8pt;
-       overflow: auto;
-       padding: 1em 0;
-       background: white;
-       color: black;
-}
-
-/**
- * MediaWiki-specific elements
- */
-#globalWrapper {
-       width: 100% !important;
-       min-width: 0 !important;
-}
-
-#content {
-       background: white;
-       border: none !important;
-       padding: 0 !important;
-       margin: 0 !important;
-       direction: ltr;
-       color: black;
-}
-
-#column-content {
-       margin: 0 !important;
-}
-
-#column-content #content {
-       padding: 1em;
-       margin: 0 !important;
-}
-
-#toc {
-       border: 1px solid #aaaaaa;
-       background-color: #f9f9f9;
-       padding: 5px;
-       display: -moz-inline-block;
-       display: inline-block;
-       display: table;
-       /* IE7 and earlier */
-       zoom: 1;
-       *display: inline;
-}
-
-#footer {
-       background: white;
-       color: black;
-       margin-top: 1em;
-       border-top: 1px solid #AAA;
-       direction: ltr;
-}
-
-img {
-       border: none;
-       vertical-align: middle;
-}
-
-/* math */
-span.texhtml {
-       font-family: serif;
-}
-
-/**
- * Links
- */
-a.stub,
-a.new {
-       color: #ba0000;
-       text-decoration: none;
-}
-
-a {
-       color: black !important;
-       background: none !important;
-       padding: 0 !important;
-}
-
-a:link, a:visited {
-       color: #520;
-       background: transparent;
-       text-decoration: underline;
-}
-
-/* Expand URLs for printing */
-#content a.external.text:after,
-#content a.external.autonumber:after {
-       content: " (" attr(href) ")";
-}
-
-/* Expand protocol-relative URLs for printing */
-#content a.external.text[href^='//']:after,
-#content a.external.autonumber[href^='//']:after {
-       content: " (https:" attr(href) ")";
-}
-
-/* MSIE/Win doesn't understand 'inherit' */
-a,
-a.external,
-a.new,
-a.stub {
-       color: black !important;
-       text-decoration: none !important;
-}
-
-/* Continue ... */
-a,
-a.external,
-a.new,
-a.stub {
-       color: inherit !important;
-       text-decoration: inherit !important;
-}
-
-/**
- * Floating divs
- */
-div.floatright {
-       float: right;
-       clear: right;
-       position: relative;
-       margin: 0.5em 0 0.8em 1.4em;
-}
-
-div.floatright p {
-       font-style: italic;
-}
-
-div.floatleft {
-       float: left;
-       clear: left;
-       position: relative;
-       margin: 0.5em 1.4em 0.8em 0;
-}
-
-div.floatleft p {
-       font-style: italic;
-}
-
-div.center {
-       text-align: center;
-}
-
-/**
- * Thumbnails
- */
-div.thumb {
-       border: none;
-       width: auto;
-       margin-top: 0.5em;
-       margin-bottom: 0.8em;
-       background-color: transparent;
-}
-
-div.thumbinner {
-       border: 1px solid #cccccc;
-       padding: 3px !important;
-       background-color: White;
-       font-size: 94%;
-       text-align: center;
-       overflow: hidden;
-}
-
-html .thumbimage {
-       border: 1px solid #cccccc;
-}
-
-html .thumbcaption {
-       border: none;
-       text-align: left;
-       line-height: 1.4em;
-       padding: 3px !important;
-       font-size: 94%;
-}
-
-div.magnify {
-       display: none;
-}
-
-/* @noflip */
-div.tright {
-       float: right;
-       clear: right;
-       margin: 0.5em 0 0.8em 1.4em;
-}
-
-/* @noflip */
-div.tleft {
-       float: left;
-       clear: left;
-       margin: 0.5em 1.4em 0.8em 0;
-}
-
-img.thumbborder {
-       border: 1px solid #dddddd;
-}
-
-/**
- * Galleries (see shared.css for more info)
- */
-li.gallerybox {
-       vertical-align: top;
-       display: inline-block;
-}
-
-ul.gallery, li.gallerybox {
-       zoom: 1;
-       *display: inline;
-}
-
-ul.gallery {
-       margin: 2px;
-       padding: 2px;
-       display: block;
-}
-
-li.gallerycaption {
-       font-weight: bold;
-       text-align: center;
-       display: block;
-       word-wrap: break-word;
-}
-
-li.gallerybox div.thumb {
-       text-align: center;
-       border: 1px solid #ccc;
-       margin: 2px;
-}
-
-div.gallerytext {
-       overflow: hidden;
-       font-size: 94%;
-       padding: 2px 4px;
-       word-wrap: break-word;
-}
-
-/**
- * Diff rendering
- */
-table.diff {
-       background: white;
-}
-
-td.diff-otitle {
-       background: #ffffff;
-}
-
-td.diff-ntitle {
-       background: #ffffff;
-}
-
-td.diff-addedline {
-       background: #ccffcc;
-       font-size: smaller;
-       border: solid 2px black;
-}
-
-td.diff-deletedline {
-       background: #ffffaa;
-       font-size: smaller;
-       border: dotted 2px black;
-}
-
-td.diff-context {
-       background: #eeeeee;
-       font-size: smaller;
-}
-
-.diffchange {
-       color: silver;
-       font-weight: bold;
-       text-decoration: underline;
-}
-
-/**
- * Table rendering
- * As on shared.css but with white background.
- */
-table.wikitable,
-table.mw_metadata {
-       margin: 1em 0;
-       border: 1px #aaa solid;
-       background: white;
-       border-collapse: collapse;
-}
-
-table.wikitable > tr > th, table.wikitable > tr > td,
-table.wikitable > * > tr > th, table.wikitable > * > tr > td,
-.mw_metadata th, .mw_metadata td {
-       border: 1px #aaa solid;
-       padding: 0.2em;
-}
-
-table.wikitable > tr > th,
-table.wikitable > * > tr > th,
-.mw_metadata th {
-       text-align: center;
-       background: white;
-       font-weight: bold;
-}
-
-table.wikitable > caption,
-.mw_metadata caption {
-       font-weight: bold;
-}
-
-table.listing,
-table.listing td {
-       border: 1pt solid black;
-       border-collapse: collapse;
-}
-
-a.sortheader {
-       margin: 0 0.3em;
-}
-
-/**
- * Categories
- */
-.catlinks ul {
-       display: inline;
-       margin: 0;
-       padding: 0;
-       list-style: none;
-       list-style-type: none;
-       list-style-image: none;
-       vertical-align: middle !ie;
-}
-
-.catlinks li {
-       display: inline-block;
-       line-height: 1.15em;
-       padding: 0 .4em;
-       border-left: 1px solid #AAA;
-       margin: 0.1em 0;
-       zoom: 1;
-       display: inline !ie;
-}
-
-.catlinks li:first-child {
-       padding-left: .2em;
-       border-left: none;
-}
diff --git a/skins/common/images/Arr_d.png b/skins/common/images/Arr_d.png
deleted file mode 100644 (file)
index 58a9fc6..0000000
Binary files a/skins/common/images/Arr_d.png and /dev/null differ
diff --git a/skins/common/images/Arr_u.png b/skins/common/images/Arr_u.png
deleted file mode 100644 (file)
index 1aa543a..0000000
Binary files a/skins/common/images/Arr_u.png and /dev/null differ
diff --git a/skins/common/images/Checker-16x16.png b/skins/common/images/Checker-16x16.png
deleted file mode 100644 (file)
index 3e9e3d0..0000000
Binary files a/skins/common/images/Checker-16x16.png and /dev/null differ
diff --git a/skins/common/images/ajax-loader.gif b/skins/common/images/ajax-loader.gif
deleted file mode 100644 (file)
index 72203fd..0000000
Binary files a/skins/common/images/ajax-loader.gif and /dev/null differ
diff --git a/skins/common/images/arrow_disabled_first_25.png b/skins/common/images/arrow_disabled_first_25.png
deleted file mode 100644 (file)
index 78a493e..0000000
Binary files a/skins/common/images/arrow_disabled_first_25.png and /dev/null differ
diff --git a/skins/common/images/arrow_disabled_last_25.png b/skins/common/images/arrow_disabled_last_25.png
deleted file mode 100644 (file)
index 2a64fd0..0000000
Binary files a/skins/common/images/arrow_disabled_last_25.png and /dev/null differ
diff --git a/skins/common/images/arrow_disabled_left_25.png b/skins/common/images/arrow_disabled_left_25.png
deleted file mode 100644 (file)
index 83df068..0000000
Binary files a/skins/common/images/arrow_disabled_left_25.png and /dev/null differ
diff --git a/skins/common/images/arrow_disabled_right_25.png b/skins/common/images/arrow_disabled_right_25.png
deleted file mode 100644 (file)
index aa4fbf8..0000000
Binary files a/skins/common/images/arrow_disabled_right_25.png and /dev/null differ
diff --git a/skins/common/images/arrow_first_25.png b/skins/common/images/arrow_first_25.png
deleted file mode 100644 (file)
index 52b32a5..0000000
Binary files a/skins/common/images/arrow_first_25.png and /dev/null differ
diff --git a/skins/common/images/arrow_last_25.png b/skins/common/images/arrow_last_25.png
deleted file mode 100644 (file)
index caf5033..0000000
Binary files a/skins/common/images/arrow_last_25.png and /dev/null differ
diff --git a/skins/common/images/arrow_left_25.png b/skins/common/images/arrow_left_25.png
deleted file mode 100644 (file)
index f363bf6..0000000
Binary files a/skins/common/images/arrow_left_25.png and /dev/null differ
diff --git a/skins/common/images/arrow_right_25.png b/skins/common/images/arrow_right_25.png
deleted file mode 100644 (file)
index 3f8fee3..0000000
Binary files a/skins/common/images/arrow_right_25.png and /dev/null differ
diff --git a/skins/common/images/closewindow19x19.png b/skins/common/images/closewindow19x19.png
deleted file mode 100644 (file)
index c96d9ff..0000000
Binary files a/skins/common/images/closewindow19x19.png and /dev/null differ
diff --git a/skins/common/images/feed-icon.png b/skins/common/images/feed-icon.png
deleted file mode 100644 (file)
index 00f49f6..0000000
Binary files a/skins/common/images/feed-icon.png and /dev/null differ
diff --git a/skins/common/images/feed-icon.svg b/skins/common/images/feed-icon.svg
deleted file mode 100644 (file)
index 6e5f570..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 256 256"><defs><linearGradient x1=".085" y1=".085" x2=".915" y2=".915" id="a"><stop offset="0" stop-color="#E3702D"/><stop offset=".107" stop-color="#EA7D31"/><stop offset=".35" stop-color="#F69537"/><stop offset=".5" stop-color="#FB9E3A"/><stop offset=".702" stop-color="#EA7C31"/><stop offset=".887" stop-color="#DE642B"/><stop offset="1" stop-color="#D95B29"/></linearGradient></defs><rect width="256" height="256" rx="55" ry="55" fill="#CC5D15"/><rect width="246" height="246" rx="50" ry="50" x="5" y="5" fill="#F49C52"/><rect width="236" height="236" rx="47" ry="47" x="10" y="10" fill="url(#a)"/><circle cx="68" cy="189" r="24" fill="#FFF"/><path d="M160 213h-34a82 82 0 0 0-82-82v-34a116 116 0 0 1 116 116zM184 213a140 140 0 0 0-140-140v-35a175 175 0 0 1 175 175z" fill="#FFF"/></svg>
\ No newline at end of file
diff --git a/skins/common/images/help-question-hover.gif b/skins/common/images/help-question-hover.gif
deleted file mode 100644 (file)
index 515138d..0000000
Binary files a/skins/common/images/help-question-hover.gif and /dev/null differ
diff --git a/skins/common/images/help-question.gif b/skins/common/images/help-question.gif
deleted file mode 100644 (file)
index b4fc9c5..0000000
Binary files a/skins/common/images/help-question.gif and /dev/null differ
diff --git a/skins/common/images/question-small.png b/skins/common/images/question-small.png
deleted file mode 100644 (file)
index f7405d2..0000000
Binary files a/skins/common/images/question-small.png and /dev/null differ
diff --git a/skins/common/images/question.svg b/skins/common/images/question.svg
deleted file mode 100644 (file)
index 98fbe8d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="21.059" height="21.06"><path fill="#575757" d="M10.529 0c-5.814 0-10.529 4.714-10.529 10.529s4.715 10.53 10.529 10.53c5.816 0 10.529-4.715 10.529-10.53s-4.712-10.529-10.529-10.529zm-.002 16.767c-.861 0-1.498-.688-1.498-1.516 0-.862.637-1.534 1.498-1.534.828 0 1.5.672 1.5 1.534 0 .827-.672 1.516-1.5 1.516zm2.137-6.512c-.723.568-1 .931-1 1.739v.5h-2.205v-.603c0-1.517.449-2.136 1.154-2.688.707-.552 1.139-.845 1.139-1.637 0-.672-.414-1.051-1.24-1.051-.707 0-1.328.189-1.982.638l-1.051-1.807c.861-.604 1.93-1.034 3.342-1.034 1.912 0 3.516 1.051 3.516 3.066-.001 1.43-.794 2.188-1.673 2.877z"/></svg>
\ No newline at end of file
diff --git a/skins/common/images/spinner.gif b/skins/common/images/spinner.gif
deleted file mode 100644 (file)
index 6146be4..0000000
Binary files a/skins/common/images/spinner.gif and /dev/null differ
diff --git a/skins/common/oldshared.css b/skins/common/oldshared.css
deleted file mode 100644 (file)
index a4e7544..0000000
+++ /dev/null
@@ -1,538 +0,0 @@
-/**
- * oldshared.css
- * This file contains CSS settings common to Wikistandard, Nostalgia and
- * CologneBlue, the old pre-Monobook skins
- */
-
-/* For clarity, explicitly state some recommendations from
- * http://www.w3.org/TR/CSS21/sample.html to make sure the editsection links scale right
- */
-
-h1 {
-       font-size: 2em;
-}
-
-h2 {
-       font-size: 1.5em;
-}
-
-h3 {
-       font-size: 1.17em;
-}
-
-h4 {
-       font-size: 1.11em;
-}
-
-h5 {
-       font-size: 1.05em;
-}
-
-h6 {
-       font-size: 1em;
-}
-
-h1, h2, h3, h4, h5, h6 {
-       font-weight: bolder;
-}
-
-/* Now the custom parts */
-
-#footer {
-       clear: both;
-}
-
-/* images */
-/* @noflip */
-div.floatright {
-       float: right;
-       clear: right;
-       margin: 0 0 1em 1em;
-}
-
-/* @noflip */
-div.floatright p {
-       font-style: italic;
-}
-
-/* @noflip */
-div.floatleft {
-       float: left;
-       clear: left;
-       margin: 0.3em 0.5em 0.5em 0;
-}
-
-/* @noflip */
-div.floatleft p {
-       font-style: italic;
-}
-
-/* table standards */
-table.rimage {
-       float: right;
-       margin-left: 1em;
-       margin-bottom: 1em;
-       text-align: center;
-       font-size: smaller;
-}
-
-/* thumbnails */
-div.thumb {
-       margin-bottom: .5em;
-       border-style: solid;
-       border-color: white;
-       width: auto;
-}
-
-div.thumbinner {
-       border: 1px solid #ccc;
-       padding: 3px;
-       background-color: #f9f9f9;
-       font-size: 94%;
-       text-align: center;
-       overflow: hidden;
-}
-
-html .thumbimage {
-       border: 1px solid #ccc;
-}
-
-html .thumbcaption {
-       border: none;
-       line-height: 1.4em;
-       padding: 3px;
-       font-size: 94%;
-       text-align: left;
-}
-
-div.magnify {
-       float: right;
-       margin-left: 3px;
-}
-
-div.magnify a {
-       display: block;
-       /* Hide the text… */
-       text-indent: 15px;
-       white-space: nowrap;
-       overflow: hidden;
-       /* …and replace it with the image */
-       width: 15px;
-       height: 11px;
-       /* @embed */
-       background: url(images/magnify-clip-ltr.png) center center no-repeat;
-       /* Don't annoy people who copy-paste everything too much */
-       -moz-user-select: none;
-       -webkit-user-select: none;
-       -ms-user-select: none;
-       user-select: none;
-}
-
-/* Temporary WMF deployment hack, to be removed before 1.24 release */
-div.magnify img {
-       display: none;
-}
-
-/* @noflip */
-div.tright {
-       clear: right;
-       float: right;
-       border-width: .5em 0 .8em 1.4em;
-}
-
-/* @noflip */
-div.tleft {
-       float: left;
-       clear: left;
-       margin-right: .5em;
-       border-width: .5em 1.4em .8em 0;
-}
-
-img.thumbborder {
-       border: 1px solid #dddddd;
-}
-
-/* Page history styling */
-/* the auto-generated edit comments */
-.autocomment {
-       color: #4b4b4b;
-}
-
-img {
-       border: none;
-}
-
-#toc,
-.toc {
-       border: 1px solid #bba;
-       background-color: #f7f8ff;
-       padding: 5px;
-       font-size: 95%;
-       text-align: center;
-       display: -moz-inline-block;
-       display: inline-block;
-       display: table;
-
-       /* IE7 and earlier */
-       zoom: 1;
-       *display: inline;
-
-       padding: 7px;
-}
-
-/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
-table#toc,
-table.toc {
-       border-collapse: collapse;
-}
-
-/* Remove additional paddings inside table-cells that are not present in <div>s */
-table#toc td,
-table.toc td {
-       padding: 0;
-}
-
-#toc h2,
-.toc h2 {
-       display: inline;
-       border: none;
-       padding: 0;
-       font-size: 100%;
-       font-weight: bold;
-}
-
-#toc ul,
-.toc ul {
-       list-style-type: none;
-       list-style-image: none;
-       padding: 0;
-       text-align: left;
-}
-
-#toc ul ul,
-.toc ul ul {
-       margin: 0 0 0 2em;
-}
-
-#toc .toctoggle,
-.toc .toctoggle {
-       font-size: 94%;
-}
-
-.error {
-       color: red;
-       font-size: larger;
-}
-
-/* preference page with js-genrated toc */
-#preftoc {
-       float: left;
-       margin: 1em 1em 1em 1em;
-       width: 13em;
-}
-
-#preftoc li {
-       border: 1px solid White;
-}
-
-#preftoc li.selected {
-       background-color: #f9f9f9;
-       border: 1px dashed #aaaaaa;
-}
-
-#preftoc a,
-#preftoc a:active {
-       display: block;
-       color: #005189;
-}
-
-.mw-prefs-buttons {
-       clear: left;
-       float: left;
-       margin-top: 1em;
-}
-
-div.htmlform-tip {
-       font-size: 94%;
-       margin-top: 0.4em;
-       color: #666;
-}
-
-fieldset.prefsection {
-       margin-top: 1em;
-}
-
-fieldset.operaprefsection {
-       margin-left: 15em;
-}
-
-/* emulate center */
-.center {
-       width: 100%;
-       text-align: center;
-}
-
-*.center * {
-       margin-left: auto;
-       margin-right: auto;
-}
-
-/* small for tables and similar */
-.small {
-       font-size: 94%;
-}
-
-table.small {
-       font-size: 100%;
-}
-
-/* use this instead of #toc for page content */
-.toccolours {
-       border: 1px solid #aaaaaa;
-       background-color: #f9f9f9;
-       padding: 5px;
-       font-size: 95%;
-}
-
-#siteNotice {
-       border: 1px solid #aaaaaa;
-       padding-left: 0.5em;
-       padding-right: 0.5em;
-}
-
-.redirectText {
-       font-size: 150%;
-       margin: 5px;
-}
-
-.sharedUploadNotice {
-       font-style: italic;
-}
-
-span.unpatrolled {
-       font-weight: bold;
-       color: red;
-}
-
-span.updatedmarker {
-       color: black;
-       background-color: #00FF00;
-}
-
-div.gallerybox {
-       width: 150px;
-}
-
-span.comment {
-       font-style: italic;
-}
-
-span.changedby {
-       font-size: 95%;
-}
-
-.previewnote {
-       text-align: center;
-       color: #cc0000;
-}
-
-.editExternally {
-       border-style: solid;
-       border-width: 1px;
-       border-color: gray;
-       background: #ffffff;
-       padding: 3px;
-       margin-top: 0.5em;
-       float: left;
-       font-size: small;
-       text-align: center;
-}
-
-.editExternallyHelp {
-       font-style: italic;
-       color: gray;
-}
-
-li span.deleted {
-       text-decoration: line-through;
-       color: #888;
-       font-style: italic;
-}
-
-/* Classes for Exif data display */
-table.mw_metadata {
-       margin-left: 0.5em;
-}
-
-table.mw_metadata caption {
-       font-weight: bold;
-}
-
-table.mw_metadata th {
-       font-weight: normal;
-}
-
-table.mw_metadata td {
-       padding: 0.1em;
-}
-
-table.mw_metadata {
-       border: none;
-       border-collapse: collapse;
-}
-
-table.mw_metadata td,
-table.mw_metadata th {
-       border: 1px solid #aaaaaa;
-       padding-left: 4px;
-       padding-right: 4px;
-}
-
-table.mw_metadata th {
-       background-color: #f9f9f9;
-}
-
-table.mw_metadata td {
-       background-color: #fcfcfc;
-}
-
-table.mw_metadata td.spacer {
-       background: inherit;
-       border-top: none;
-       border-bottom: none;
-}
-
-table.collapsed tr.collapsable {
-       display: none;
-}
-
-.visualClear {
-       clear: both;
-}
-
-/* Allmessages table */
-#allmessagestable th {
-       background-color: #b2b2ff;
-}
-
-#allmessagestable tr.orig {
-       background-color: #ffe2e2;
-}
-
-#allmessagestable tr.new {
-       background-color: #e2ffe2;
-}
-
-#allmessagestable tr.def {
-       background-color: #f0f0ff;
-}
-
-#jump-to-nav {
-       display: none;
-}
-
-div.multipageimagenavbox {
-       border: solid 1px silver;
-       padding: 4px;
-       margin: 1em;
-       background: #f0f0f0;
-}
-
-div.multipageimagenavbox div.thumb {
-       border: none;
-       margin-left: 2em;
-       margin-right: 2em;
-}
-
-div.multipageimagenavbox hr {
-       margin: 6px;
-}
-
-table.multipageimage td {
-       text-align: center;
-}
-
-/*
-  Table pager (e.g. Special:Imagelist)
-  - remove underlines from the navigation link
-  - collapse borders
-  - set the borders to outsets (similar to Special:Allmessages)
-  - remove line wrapping for all td and th, set background color
-  - restore line wrapping for the last two table cells (description and size)
-*/
-.TablePager_nav a {
-       text-decoration: none;
-}
-
-.TablePager {
-       border-collapse: collapse;
-}
-
-.TablePager,
-.TablePager td,
-.TablePager th {
-       border: 0.15em solid #777777;
-       padding: 0 0.15em 0 0.15em;
-}
-
-.TablePager th {
-       background-color: #eeeeff;
-}
-
-.TablePager td {
-       background-color: #ffffff;
-}
-
-.TablePager tr:hover td {
-       background-color: #eeeeff;
-}
-
-.templatesUsed {
-       margin-top: 1em;
-}
-
-.MediaTransformError {
-       border: thin solid #777;
-       background-color: #ccc;
-       padding: 0.1em;
-}
-
-.MediaTransformError td {
-       text-align: center;
-       vertical-align: middle;
-       font-size: 90%;
-}
-
-form#specialpages {
-       display: inline;
-}
-
-body {
-       direction: ltr;
-       unicode-bidi: embed;
-       background-color: #ffffec;
-}
-
-body.ns-0 {
-       background-color: white;
-}
-
-/** RTL specific CSS starts here **/
-
-/**
- * Lists:
- * The following lines don't have a visible effect on non-Gecko browsers
- * They fix a problem with Gecko browsers rendering lists to the right of
- * left-floated objects in an RTL layout.
- */
-/* @noflip */
-html > body.rtl div#article ul {
-       display: table;
-}
-
-/* @noflip */
-html > body.rtl div#bodyContent ul#filetoc {
-       display: block;
-}
-
-/* RTL specific CSS ends here **/
diff --git a/skins/common/protect.js b/skins/common/protect.js
deleted file mode 100644 (file)
index dc142ca..0000000
+++ /dev/null
@@ -1,387 +0,0 @@
-( function ( mw, $ ) {
-
-var ProtectionForm = window.ProtectionForm = {
-       existingMatch: false,
-
-       /**
-        * Set up the protection chaining interface (i.e. "unlock move permissions" checkbox)
-        * on the protection form
-        *
-        * @param opts Object : parameters with members:
-        *     tableId              Identifier of the table containing UI bits
-        *     labelText            Text to use for the checkbox label
-        *     numTypes             The number of protection types
-        *     existingMatch        True if all the existing expiry times match
-        */
-       init: function ( opts ) {
-               var box, boxbody, row, cell, check, label;
-
-               if ( !( document.createTextNode && document.getElementById && document.getElementsByTagName ) ) {
-                       return false;
-               }
-
-               box = document.getElementById( opts.tableId );
-               if ( !box ) {
-                       return false;
-               }
-
-               boxbody = box.getElementsByTagName( 'tbody' )[0];
-               row = document.createElement( 'tr' );
-               boxbody.insertBefore( row, boxbody.firstChild.nextSibling );
-
-               this.existingMatch = opts.existingMatch;
-
-               cell = document.createElement( 'td' );
-               row.appendChild( cell );
-               // If there is only one protection type, there is nothing to chain
-               if ( opts.numTypes > 1 ) {
-                       check = document.createElement( 'input' );
-                       check.id = 'mwProtectUnchained';
-                       check.type = 'checkbox';
-                       $( check ).click( function () {
-                               ProtectionForm.onChainClick();
-                       } );
-
-                       label = document.createElement( 'label' );
-                       label.htmlFor = 'mwProtectUnchained';
-                       label.appendChild( document.createTextNode( opts.labelText ) );
-
-                       cell.appendChild( check );
-                       cell.appendChild( document.createTextNode( ' ' ) );
-                       cell.appendChild( label );
-
-                       check.checked = !this.areAllTypesMatching();
-                       this.enableUnchainedInputs( check.checked );
-               }
-
-               $( '#mwProtect-reason' ).byteLimit( 180 );
-
-               this.updateCascadeCheckbox();
-
-               return true;
-       },
-
-       /**
-        * Sets the disabled attribute on the cascade checkbox depending on the current selected levels
-        */
-       updateCascadeCheckbox: function () {
-               var i, lists, items, selected;
-
-               // For non-existent titles, there is no cascade option
-               if ( !document.getElementById( 'mwProtect-cascade' ) ) {
-                       return;
-               }
-               lists = this.getLevelSelectors();
-               for ( i = 0; i < lists.length; i++ ) {
-                       if ( lists[i].selectedIndex > -1 ) {
-                               items = lists[i].getElementsByTagName( 'option' );
-                               selected = items[ lists[i].selectedIndex ].value;
-                               if ( !this.isCascadeableLevel( selected ) ) {
-                                       document.getElementById( 'mwProtect-cascade' ).checked = false;
-                                       document.getElementById( 'mwProtect-cascade' ).disabled = true;
-                                       return;
-                               }
-                       }
-               }
-               document.getElementById( 'mwProtect-cascade' ).disabled = false;
-       },
-
-       /**
-        * Checks if a cerain protection level is cascadeable.
-        * @param level {String}
-        * @return {Boolean}
-        */
-       isCascadeableLevel: function (  level ) {
-               var cascadeLevels, len, i;
-
-               cascadeLevels = mw.config.get( 'wgCascadeableLevels' );
-               // cascadeLevels isn't defined on all pages
-               if ( cascadeLevels ) {
-                       for ( i = 0, len = cascadeLevels.length; i < len; i += 1 ) {
-                               if ( cascadeLevels[i] === level ) {
-                                       return true;
-                               }
-                       }
-               }
-               return false;
-       },
-
-       /**
-        * When protection levels are locked together, update the rest
-        * when one action's level changes
-        *
-        * @param source Element Level selector that changed
-        */
-       updateLevels: function ( source ) {
-               if ( !this.isUnchained() ) {
-                       this.setAllSelectors( source.selectedIndex );
-               }
-               this.updateCascadeCheckbox();
-       },
-
-       /**
-        * When protection levels are locked together, update the
-        * expiries when one changes
-        *
-        * @param source Element expiry input that changed
-        */
-
-       updateExpiry: function ( source ) {
-               var expiry, listId, list;
-
-               if ( !this.isUnchained() ) {
-                       expiry = source.value;
-                       this.forEachExpiryInput( function ( element ) {
-                               element.value = expiry;
-                       } );
-               }
-               listId = source.id.replace( /^mwProtect-(\w+)-expires$/, 'mwProtectExpirySelection-$1' );
-               list = document.getElementById( listId );
-               if ( list && list.value !== 'othertime' ) {
-                       if ( this.isUnchained() ) {
-                               list.value = 'othertime';
-                       } else {
-                               this.forEachExpirySelector( function ( element ) {
-                                       element.value = 'othertime';
-                               } );
-                       }
-               }
-       },
-
-       /**
-        * When protection levels are locked together, update the
-        * expiry lists when one changes and clear the custom inputs
-        *
-        * @param source Element expiry selector that changed
-        */
-       updateExpiryList: function ( source ) {
-               var expiry;
-               if ( !this.isUnchained() ) {
-                       expiry = source.value;
-                       this.forEachExpirySelector( function ( element ) {
-                               element.value = expiry;
-                       } );
-                       this.forEachExpiryInput( function ( element ) {
-                               element.value = '';
-                       } );
-               }
-       },
-
-       /**
-        * Update chain status and enable/disable various bits of the UI
-        * when the user changes the "unlock move permissions" checkbox
-        */
-       onChainClick: function () {
-               if ( this.isUnchained() ) {
-                       this.enableUnchainedInputs( true );
-               } else {
-                       this.setAllSelectors( this.getMaxLevel() );
-                       this.enableUnchainedInputs( false );
-               }
-               this.updateCascadeCheckbox();
-       },
-
-       /**
-        * Returns true if the named attribute in all objects in the given array are matching
-        */
-       matchAttribute: function ( objects, attrName ) {
-               var i, element, value;
-
-               // Check levels
-               value = null;
-               for ( i = 0; i < objects.length; i++ ) {
-                       element = objects[i];
-                       if ( value === null ) {
-                               value = element[attrName];
-                       } else {
-                               if ( value !== element[attrName] ) {
-                                       return false;
-                               }
-                       }
-               }
-               return true;
-       },
-
-       /**
-        * Are all actions protected at the same level, with the same expiry time?
-        *
-        * @return boolean
-        */
-       areAllTypesMatching: function () {
-               return this.existingMatch
-                       && this.matchAttribute( this.getLevelSelectors(), 'selectedIndex' )
-                       && this.matchAttribute( this.getExpirySelectors(), 'selectedIndex' )
-                       && this.matchAttribute( this.getExpiryInputs(), 'value' );
-       },
-
-       /**
-        * Is protection chaining off?
-        *
-        * @return bool
-        */
-       isUnchained: function () {
-               var element = document.getElementById( 'mwProtectUnchained' );
-               return element
-                       ? element.checked
-                       : true; // No control, so we need to let the user set both levels
-       },
-
-       /**
-        * Find the highest protection level in any selector
-        */
-       getMaxLevel: function () {
-               var maxIndex = -1;
-               this.forEachLevelSelector( function ( element ) {
-                       if ( element.selectedIndex > maxIndex ) {
-                               maxIndex = element.selectedIndex;
-                       }
-               } );
-               return maxIndex;
-       },
-
-       /**
-        * Protect all actions at the specified level
-        *
-        * @param index int Protection level
-        */
-       setAllSelectors: function ( index ) {
-               this.forEachLevelSelector( function ( element ) {
-                       if ( element.selectedIndex !== index ) {
-                               element.selectedIndex = index;
-                       }
-               } );
-       },
-
-       /**
-        * Apply a callback to each protection selector
-        *
-        * @param func callable Callback function
-        */
-       forEachLevelSelector: function ( func ) {
-               var i, selectors;
-
-               selectors = this.getLevelSelectors();
-               for ( i = 0; i < selectors.length; i++ ) {
-                       func( selectors[i] );
-               }
-       },
-
-       /**
-        * Get a list of all protection selectors on the page
-        *
-        * @return Array
-        */
-       getLevelSelectors: function () {
-               var i, ours, all, element;
-
-               all = document.getElementsByTagName( 'select' );
-               ours = [];
-               for ( i = 0; i < all.length; i++ ) {
-                       element = all[i];
-                       if ( element.id.match( /^mwProtect-level-/ ) ) {
-                               ours[ours.length] = element;
-                       }
-               }
-               return ours;
-       },
-
-       /**
-        * Apply a callback to each expiry input
-        *
-        * @param func callable Callback function
-        */
-       forEachExpiryInput: function ( func ) {
-               var i, inputs;
-
-               inputs = this.getExpiryInputs();
-               for ( i = 0; i < inputs.length; i++ ) {
-                       func( inputs[i] );
-               }
-       },
-
-       /**
-        * Get a list of all expiry inputs on the page
-        *
-        * @return Array
-        */
-       getExpiryInputs: function () {
-               var i, all, element, ours;
-
-               all = document.getElementsByTagName( 'input' );
-               ours = [];
-               for ( i = 0; i < all.length; i++ ) {
-                       element = all[i];
-                       if ( element.name.match( /^mwProtect-expiry-/ ) ) {
-                               ours[ours.length] = element;
-                       }
-               }
-               return ours;
-       },
-
-       /**
-        * Apply a callback to each expiry selector list
-        * @param func callable Callback function
-        */
-       forEachExpirySelector: function ( func ) {
-               var i, inputs;
-
-               inputs = this.getExpirySelectors();
-               for ( i = 0; i < inputs.length; i++ ) {
-                       func( inputs[i] );
-               }
-       },
-
-       /**
-        * Get a list of all expiry selector lists on the page
-        *
-        * @return Array
-        */
-       getExpirySelectors: function () {
-               var i, all, ours, element;
-
-               all = document.getElementsByTagName( 'select' );
-               ours = [];
-               for ( i = 0; i < all.length; i++ ) {
-                       element = all[i];
-                       if ( element.id.match( /^mwProtectExpirySelection-/ ) ) {
-                               ours[ours.length] = element;
-                       }
-               }
-               return ours;
-       },
-
-       /**
-        * Enable/disable protection selectors and expiry inputs
-        *
-        * @param val boolean Enable?
-        */
-       enableUnchainedInputs: function ( val ) {
-               var first = true;
-
-               this.forEachLevelSelector( function ( element ) {
-                       if ( first ) {
-                               first = false;
-                       } else {
-                               element.disabled = !val;
-                       }
-               } );
-               first = true;
-               this.forEachExpiryInput( function ( element ) {
-                       if ( first ) {
-                               first = false;
-                       } else {
-                               element.disabled = !val;
-                       }
-               } );
-               first = true;
-               this.forEachExpirySelector( function ( element ) {
-                       if ( first ) {
-                               first = false;
-                       } else {
-                               element.disabled = !val;
-                       }
-               } );
-       }
-};
-
-}( mediaWiki, jQuery ) );
diff --git a/skins/common/shared.css b/skins/common/shared.css
deleted file mode 100644 (file)
index af5d82c..0000000
+++ /dev/null
@@ -1,1197 +0,0 @@
-/**
- * CSS in this file is used by *all* skins (that have any CSS at all). Be
- * careful what you put in here, since what looks good in one skin may not in
- * another, but don't ignore the poor pre-Monobook users either.
- */
-
-/* GENERAL CLASSES FOR DIRECTIONALITY SUPPORT */
-
-/**
- * These classes should be used for text depending on the content direction.
- * Content stuff like editsection, ul/ol and TOC depend on this.
- */
-.mw-content-ltr {
-       /* @noflip */
-       direction: ltr;
-}
-
-.mw-content-rtl {
-       /* @noflip */
-       direction: rtl;
-}
-
-/* Most input fields should be in site direction */
-.sitedir-ltr textarea,
-.sitedir-ltr input {
-       /* @noflip */
-       direction: ltr;
-}
-
-.sitedir-rtl textarea,
-.sitedir-rtl input {
-       /* @noflip */
-       direction: rtl;
-}
-
-/* User-Agent styles for new HTML5 elements */
-mark {
-       background-color: yellow;
-       color: black;
-}
-
-/* Helper for wbr element on IE 8+; in HTML5, but not supported by default as of IE 11. */
-/* Note canonical HTML5 styles recommend "content: \u200B", but this doesn't work as of IE 11. */
-wbr {
-       display: inline-block;
-}
-
-/* Input types that should follow user direction, like buttons */
-/* TODO: What about buttons in wikipage content ? */
-input[type="submit"],
-input[type="button"],
-input[type="reset"],
-input[type="file"] {
-       direction: ltr;
-}
-
-/* Override default values */
-textarea[dir="ltr"],
-input[dir="ltr"] {
-       /* @noflip */
-       direction: ltr;
-}
-
-textarea[dir="rtl"],
-input[dir="rtl"] {
-       /* @noflip */
-       direction: rtl;
-}
-
-/* Default style for semantic tags */
-abbr[title],
-.explain[title] {
-       border-bottom: 1px dotted;
-       cursor: help;
-}
-
-/* Colored watchlist and recent changes numbers */
-.mw-plusminus-pos {
-       color: #006400; /* dark green */
-}
-
-.mw-plusminus-neg {
-       color: #8b0000; /* dark red */
-}
-
-.mw-plusminus-null {
-       color: #aaa; /* gray */
-}
-
-/**
- * Links to redirects appear italicized on [[Special:AllPages]], [[Special:PrefixIndex]],
- * [[Special:Watchlist/edit]] and in category listings.
- */
-.allpagesredirect,
-.redirect-in-category,
-.watchlistredir {
-       font-style: italic;
-}
-
-/* Comment and username portions of RC entries */
-span.comment {
-       font-style: italic;
-}
-
-span.changedby {
-       font-size: 95%;
-}
-
-/* Math */
-.texvc {
-       direction: ltr;
-       unicode-bidi: embed;
-}
-
-img.tex {
-       vertical-align: middle;
-}
-
-span.texhtml {
-       font-family: serif;
-}
-
-/**
- * Add a bit of margin space between the preview and the toolbar.
- * This replaces the ugly <p><br /></p> we used to insert into the page source
- */
-#wikiPreview.ontop {
-       margin-bottom: 1em;
-}
-
-/* Stop floats from intruding into edit area in previews */
-#editform,
-#toolbar,
-#wpTextbox1 {
-       clear: both;
-}
-
-#toolbar img {
-       cursor: pointer;
-}
-
-/**
- * File description page
- */
-
-div.mw-filepage-resolutioninfo {
-       font-size: smaller;
-}
-
-/**
- * File histories
- */
-h2#filehistory {
-       clear: both;
-}
-
-table.filehistory th,
-table.filehistory td {
-       vertical-align: top;
-}
-
-table.filehistory th {
-       text-align: left;
-}
-
-table.filehistory td.mw-imagepage-filesize,
-table.filehistory th.mw-imagepage-filesize {
-       white-space: nowrap;
-}
-
-table.filehistory td.filehistory-selected {
-       font-weight: bold;
-}
-
-/**
- * Add a checkered background image on hover for file
- * description pages. (bug 26470)
- */
-.filehistory a img,
-#file img:hover {
-       /* @embed */
-       background: white url(images/Checker-16x16.png) repeat;
-}
-
-/**
- * rev_deleted stuff
- */
-li span.deleted,
-span.history-deleted {
-       text-decoration: line-through;
-       color: #888;
-       font-style: italic;
-}
-
-/**
- * Patrol stuff
- */
-.not-patrolled {
-       background-color: #ffa;
-}
-
-.unpatrolled {
-       font-weight: bold;
-       color: red;
-}
-
-div.patrollink {
-       font-size: 75%;
-       text-align: right;
-}
-
-/**
- * Forms
- */
-td.mw-label {
-       text-align: right;
-}
-
-td.mw-input {
-       text-align: left;
-}
-
-td.mw-submit {
-       text-align: left;
-}
-
-td.mw-label {
-       vertical-align: top;
-}
-
-.prefsection td.mw-label {
-       width: 20%;
-}
-
-.prefsection table {
-       width: 100%;
-}
-
-.prefsection table.mw-htmlform-matrix {
-       width: auto;
-}
-
-.mw-icon-question {
-       /* SVG support using a transparent gradient to guarantee cross-browser
-        * compatibility (browsers able to understand gradient syntax support also SVG).
-        * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
-       background-image: url(images/question-small.png);
-       /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/question.svg);
-       /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/question.svg);
-       background-repeat: no-repeat;
-       background-size: 13px 13px;
-       display: inline-block;
-       height: 13px;
-       width: 13px;
-       margin-left: 4px;
-}
-
-.mw-icon-question:lang(ar),
-.mw-icon-question:lang(fa),
-.mw-icon-question:lang(ur) {
-       -webkit-transform: scaleX(-1);
-       -ms-transform: scaleX(-1);
-       transform: scaleX(-1);
-}
-
-td.mw-submit {
-       white-space: nowrap;
-}
-
-table.mw-htmlform-nolabel td.mw-label {
-       width: 1px;
-}
-
-tr.mw-htmlform-vertical-label td.mw-label {
-       text-align: left !important;
-}
-
-.mw-htmlform-invalid-input td.mw-input input {
-       border-color: red;
-}
-
-.mw-htmlform-flatlist div.mw-htmlform-flatlist-item {
-       display: inline;
-       margin-right: 1em;
-       white-space: nowrap;
-}
-
-.mw-htmlform-matrix td {
-       padding-left: 0.5em;
-       padding-right: 0.5em;
-}
-
-input#wpSummary {
-       width: 80%;
-       margin-bottom: 1em;
-}
-
-/**
- * Image captions.
- *
- * This is only meant to provide the most basic of styles, visual settings shouldn't be added here.
- */
-
-/* @noflip */
-.mw-content-ltr .thumbcaption {
-       text-align: left;
-}
-
-/* @noflip */
-.mw-content-ltr .magnify {
-       float: right;
-}
-
-/* @noflip */
-.mw-content-rtl .thumbcaption {
-       text-align: right;
-}
-
-/* @noflip */
-.mw-content-rtl .magnify {
-       float: left;
-}
-
-/**
- * Categories
- */
-#catlinks {
-       /**
-        * Overrides text justification (user preference)
-        * See bug 31990
-        */
-       text-align: left;
-}
-
-.catlinks ul {
-       display: inline;
-       margin: 0;
-       padding: 0;
-       list-style: none;
-       list-style-type: none;
-       list-style-image: none;
-       vertical-align: middle !ie;
-}
-
-.catlinks li {
-       display: inline-block;
-       line-height: 1.25em;
-       border-left: 1px solid #AAA;
-       margin: 0.125em 0;
-       padding: 0 0.5em;
-       zoom: 1;
-       display: inline !ie;
-}
-
-.catlinks li:first-child {
-       padding-left: 0.25em;
-       border-left: none;
-}
-
-/* (bug 5346) make category redirects italic */
-.catlinks li a.mw-redirect {
-       font-style: italic;
-}
-
-/**
- * Hidden categories
- */
-.mw-hidden-cats-hidden {
-       display: none;
-}
-
-.catlinks-allhidden {
-       display: none;
-}
-
-/**
- * Convenience links to edit block, delete and protect reasons
- * and upload licenses
- */
-p.mw-ipb-conveniencelinks,
-p.mw-protect-editreasons,
-p.mw-filedelete-editreasons,
-p.mw-delete-editreasons,
-p.mw-revdel-editreasons,
-p.mw-upload-editlicenses {
-       font-size: 90%;
-       text-align: right;
-}
-
-/* Page history styling */
-
-/* The auto-generated edit comments */
-.autocomment {
-       color: gray;
-}
-
-#pagehistory .history-user {
-       margin-left: 0.4em;
-       margin-right: 0.2em;
-}
-
-#pagehistory span.minor {
-       font-weight: bold;
-}
-
-#pagehistory li {
-       border: 1px solid white;
-}
-
-#pagehistory li.selected {
-       background-color: #f9f9f9;
-       border: 1px dashed #aaa;
-}
-
-.mw-history-revisiondelete-button, #mw-fileduplicatesearch-icon {
-       float: right;
-}
-
-/** Generic minor/bot/newpage styling (recent changes) */
-.newpage,
-.minoredit,
-.botedit {
-       font-weight: bold;
-}
-
-#shared-image-dup,
-#shared-image-conflict {
-       font-style: italic;
-}
-
-/**
- * Recreating deleted page warning
- * Reupload file warning
- * Page protection warning
- * incl. log entries for these warnings
- */
-div.mw-warning-with-logexcerpt {
-       padding: 3px;
-       margin-bottom: 3px;
-       border: 2px solid #2F6FAB;
-       clear: both;
-}
-
-div.mw-warning-with-logexcerpt ul li {
-       font-size: 90%;
-}
-
-/* (show/hide) revision deletion links */
-span.mw-revdelundel-link,
-strong.mw-revdelundel-link {
-       font-size: 90%;
-}
-
-span.mw-revdelundel-hidden,
-input.mw-revdelundel-hidden {
-       visibility: hidden;
-}
-
-td.mw-revdel-checkbox,
-th.mw-revdel-checkbox {
-       padding-right: 10px;
-       text-align: center;
-}
-
-/* red links; see bug 36276 */
-a.new {
-       color: #BA0000;
-}
-
-/* feed links */
-a.feedlink {
-       /* SVG support using a transparent gradient to guarantee cross-browser
-        * compatibility (browsers able to understand gradient syntax support also SVG).
-        * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
-       background-image: url(images/feed-icon.png);
-       /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/feed-icon.svg);
-       /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/feed-icon.svg);
-       background-position: center left;
-       background-repeat: no-repeat;
-       background-size: 12px 12px;
-       padding-left: 16px;
-}
-
-/* Plainlinks - this can be used to switch
- * off special external link styling */
-.plainlinks a {
-       background: none !important;
-       padding: 0 !important;
-}
-
-/* External URLs should always be treated as LTR (bug 4330) */
-/* @noflip */ .rtl a.external.free,
-.rtl a.external.autonumber {
-       direction: ltr;
-       unicode-bidi: embed;
-}
-
-/**
- * wikitable class for skinning normal tables
- * keep in sync with commonPrint.css
- */
-table.wikitable {
-       margin: 1em 0;
-       background-color: #f9f9f9;
-       border: 1px #aaa solid;
-       border-collapse: collapse;
-       color: black;
-}
-
-table.wikitable > tr > th,
-table.wikitable > tr > td,
-table.wikitable > * > tr > th,
-table.wikitable > * > tr > td {
-       border: 1px #aaa solid;
-       padding: 0.2em;
-}
-
-table.wikitable > tr > th,
-table.wikitable > * > tr > th {
-       background-color: #f2f2f2;
-       text-align: center;
-}
-
-table.wikitable > caption {
-       font-weight: bold;
-}
-
-/**
- * Hide collapsable rows in a collapsed table.
- *
- * Used by ImagePage and the mediawiki.action.view.metadata module.
- */
-table.collapsed tr.collapsable {
-       display: none;
-}
-
-/* success and error messages */
-.error,
-.warning,
-.success {
-       font-size: larger;
-}
-
-.error {
-       color: #cc0000;
-}
-
-.warning {
-       color: #705000;
-}
-
-.success {
-       color: #009000;
-}
-
-.errorbox,
-.warningbox,
-.successbox {
-       border: 1px solid;
-       padding: .5em 1em;
-       margin-bottom: 1em;
-       display: -moz-inline-block;
-       display: inline-block;
-       zoom: 1;
-       *display: inline;
-}
-
-.errorbox h2,
-.warningbox h2,
-.successbox h2 {
-       font-size: 1em;
-       color: inherit;
-       font-weight: bold;
-       display: inline;
-       margin: 0 .5em 0 0;
-       border: none;
-}
-
-.errorbox {
-       color: #cc0000;
-       border-color: #fac5c5;
-       background-color: #fae3e3;
-}
-
-.warningbox {
-       color: #705000;
-       border-color: #fde29b;
-       background-color: #fdf1d1;
-}
-
-.successbox {
-       color: #009000;
-       border-color: #b7fdb5;
-       background-color: #e1fddf;
-}
-
-/* general info/warning box for SP */
-.mw-infobox {
-       border: 2px solid #ff7f00;
-       margin: 0.5em;
-       clear: left;
-       overflow: hidden;
-}
-
-.mw-infobox-left {
-       margin: 7px;
-       float: left;
-       width: 35px;
-}
-
-.mw-infobox-right {
-       margin: 0.5em 0.5em 0.5em 49px;
-}
-
-/* Note on preview page */
-.previewnote {
-       color: #c00;
-       margin-bottom: 1em;
-}
-
-.previewnote p {
-       text-indent: 3em;
-       margin: 0.8em 0;
-}
-
-.visualClear {
-       clear: both;
-}
-
-/**
- * Data table style
- *
- * Transparent table with suddle borders
- * and blue row-highlighting.
- */
-.mw-datatable {
-       border-collapse: collapse;
-}
-
-.mw-datatable,
-.mw-datatable td,
-.mw-datatable th {
-       border: 1px solid #aaaaaa;
-       padding: 0 0.15em 0 0.15em;
-}
-
-.mw-datatable th {
-       background-color: #ddddff;
-}
-
-.mw-datatable td {
-       background-color: #ffffff;
-}
-
-.mw-datatable tr:hover td {
-       background-color: #eeeeff;
-}
-
-/**
- * TablePager tables generated by the TablePager PHP class
- * in MediaWiki (e.g. Special:ListFiles).
- */
-.TablePager {
-       min-width: 80%;
-}
-
-.TablePager_nav {
-       margin: 0 auto;
-}
-
-.TablePager_nav td {
-       padding: 3px;
-       text-align: center;
-}
-
-.TablePager_nav a {
-       text-decoration: none;
-}
-
-/* filetoc */
-ul#filetoc {
-       text-align: center;
-       border: 1px solid #aaaaaa;
-       background-color: #f9f9f9;
-       padding: 5px;
-       font-size: 95%;
-       margin-bottom: 0.5em;
-       margin-left: 0;
-       margin-right: 0;
-}
-
-#filetoc li {
-       display: inline;
-       list-style-type: none;
-       padding-right: 2em;
-}
-
-/* Classes for Exif data display */
-table.mw_metadata {
-       font-size: 0.8em;
-       margin-left: 0.5em;
-       margin-bottom: 0.5em;
-       width: 400px;
-}
-
-table.mw_metadata caption {
-       font-weight: bold;
-}
-
-table.mw_metadata th {
-       font-weight: normal;
-}
-
-table.mw_metadata td {
-       padding: 0.1em;
-}
-
-table.mw_metadata {
-       border: none;
-       border-collapse: collapse;
-}
-
-table.mw_metadata td,
-table.mw_metadata th {
-       text-align: center;
-       border: 1px solid #aaaaaa;
-       padding-left: 5px;
-       padding-right: 5px;
-}
-
-table.mw_metadata th {
-       background-color: #f9f9f9;
-}
-
-table.mw_metadata td {
-       background-color: #fcfcfc;
-}
-
-table.mw_metadata ul.metadata-langlist {
-       list-style-type: none;
-       list-style-image: none;
-       padding-right: 5px;
-       padding-left: 5px;
-       margin: 0;
-}
-
-/* Correct directionality when page dir is different from site/user dir */
-.mw-content-ltr ul,
-.mw-content-rtl .mw-content-ltr ul {
-       /* @noflip */
-       margin: 0.3em 0 0 1.6em;
-       padding: 0;
-}
-
-.mw-content-rtl ul,
-.mw-content-ltr .mw-content-rtl ul {
-       /* @noflip */
-       margin: 0.3em 1.6em 0 0;
-       padding: 0;
-}
-
-.mw-content-ltr ol,
-.mw-content-rtl .mw-content-ltr ol {
-       /* @noflip */
-       margin: 0.3em 0 0 3.2em;
-       padding: 0;
-}
-
-.mw-content-rtl ol,
-.mw-content-ltr .mw-content-rtl ol {
-       /* @noflip */
-       margin: 0.3em 3.2em 0 0;
-       padding: 0;
-}
-
-/* @noflip */
-.mw-content-ltr dd,
-.mw-content-rtl .mw-content-ltr dd {
-       margin-left: 1.6em;
-       margin-right: 0;
-}
-
-/* @noflip */
-.mw-content-rtl dd,
-.mw-content-ltr .mw-content-rtl dd {
-       margin-right: 1.6em;
-       margin-left: 0;
-}
-
-/* Galleries */
-/* These display attributes look nonsensical, but are needed to support IE and FF2 */
-/* Don't forget to update commonPrint.css */
-li.gallerybox {
-       vertical-align: top;
-       display: -moz-inline-box;
-       display: inline-block;
-}
-
-ul.gallery,
-li.gallerybox {
-       zoom: 1;
-       *display: inline;
-}
-
-ul.gallery {
-       margin: 2px;
-       padding: 2px;
-       display: block;
-}
-
-li.gallerycaption {
-       font-weight: bold;
-       text-align: center;
-       display: block;
-       word-wrap: break-word;
-}
-
-li.gallerybox div.thumb {
-       text-align: center;
-       border: 1px solid #ccc;
-       background-color: #f9f9f9;
-       margin: 2px;
-}
-
-li.gallerybox div.thumb img {
-       display: block;
-       margin: 0 auto;
-}
-
-div.gallerytext {
-       overflow: hidden;
-       font-size: 94%;
-       padding: 2px 4px;
-       word-wrap: break-word;
-}
-
-/* new gallery stuff */
-ul.mw-gallery-nolines li.gallerybox div.thumb {
-       background-color: transparent;
-       border: none;
-}
-
-ul.mw-gallery-nolines li.gallerybox div.gallerytext {
-       text-align: center;
-}
-
-/* height constrained gallery */
-
-ul.mw-gallery-packed li.gallerybox div.thumb,
-ul.mw-gallery-packed-overlay li.gallerybox div.thumb,
-ul.mw-gallery-packed-hover li.gallerybox div.thumb {
-       background-color: transparent;
-       border: none;
-}
-
-ul.mw-gallery-packed li.gallerybox div.thumb img,
-ul.mw-gallery-packed-overlay li.gallerybox div.thumb img,
-ul.mw-gallery-packed-hover li.gallerybox div.thumb img {
-       margin: 0 auto;
-}
-
-ul.mw-gallery-packed-hover li.gallerybox,
-ul.mw-gallery-packed-overlay li.gallerybox {
-       position: relative;
-}
-
-ul.mw-gallery-packed-hover div.gallerytextwrapper {
-       overflow: hidden;
-       height: 0;
-}
-
-ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper,
-ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper,
-ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper {
-       position: absolute;
-       background: white;
-       background: rgba(255, 255, 255, 0.8);
-       padding: 5px 10px;
-       bottom: 0;
-       left: 0; /* Needed for IE */
-       height: auto;
-       font-weight: bold;
-       margin: 2px; /* correspond to style on div.thumb */
-}
-
-ul.mw-gallery-packed-hover,
-ul.mw-gallery-packed-overlay,
-ul.mw-gallery-packed {
-       text-align: center;
-}
-
-.mw-ajax-loader {
-       /* @embed */
-       background-image: url(images/ajax-loader.gif);
-       background-position: center center;
-       background-repeat: no-repeat;
-       padding: 16px;
-       position: relative;
-       top: -16px;
-}
-
-.mw-small-spinner {
-       padding: 10px !important;
-       margin-right: 0.6em;
-       /* @embed */
-       background-image: url(images/spinner.gif);
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-
-/* Language specific height correction for titles. Ref Bug 29405 and Bug 30809 */
-/* Languages like hi or ml require slightly more vertical space to show diacritics properly */
-h1:lang(anp),
-h1:lang(as),
-h1:lang(bh), /* Macrolanguage, used on bh.wikipedia.org, should be removed one day */
-h1:lang(bho),
-h1:lang(bn),
-h1:lang(gu),
-h1:lang(hi),
-h1:lang(kn),
-h1:lang(ks),
-h1:lang(ml),
-h1:lang(mr),
-h1:lang(my),
-h1:lang(mai),
-h1:lang(ne),
-h1:lang(new),
-h1:lang(or),
-h1:lang(pa),
-h1:lang(pi),
-h1:lang(sa),
-h1:lang(ta),
-h1:lang(te) {
-       line-height: 1.6em !important;
-}
-
-h2:lang(anp), h3:lang(anp), h4:lang(anp), h5:lang(anp), h6:lang(anp),
-h2:lang(as), h3:lang(as), h4:lang(as), h5:lang(as), h6:lang(as),
-h2:lang(bho), h3:lang(bho), h4:lang(bho), h5:lang(bho), h6:lang(bho),
-h2:lang(bh), h3:lang(bh), h4:lang(bh), h5:lang(bh), h6:lang(bh),
-h2:lang(bn), h3:lang(bn), h4:lang(bn), h5:lang(bn), h6:lang(bn),
-h2:lang(gu), h3:lang(gu), h4:lang(gu), h5:lang(gu), h6:lang(gu),
-h2:lang(hi), h3:lang(hi), h4:lang(hi), h5:lang(hi), h6:lang(hi),
-h2:lang(kn), h3:lang(kn), h4:lang(kn), h5:lang(kn), h6:lang(kn),
-h2:lang(ks), h3:lang(ks), h4:lang(ks), h5:lang(ks), h6:lang(ks),
-h2:lang(ml), h3:lang(ml), h4:lang(ml), h5:lang(ml), h6:lang(ml),
-h2:lang(mr), h3:lang(mr), h4:lang(mr), h5:lang(mr), h6:lang(mr),
-h2:lang(my), h3:lang(my), h4:lang(my), h5:lang(my), h6:lang(my),
-h2:lang(mai), h3:lang(mai), h4:lang(mai), h5:lang(mai), h6:lang(mai),
-h2:lang(ne), h3:lang(ne), h4:lang(ne), h5:lang(ne), h6:lang(ne),
-h2:lang(new), h3:lang(new), h4:lang(new), h5:lang(new), h6:lang(new),
-h2:lang(or), h3:lang(or), h4:lang(or), h5:lang(or), h6:lang(or),
-h2:lang(pa), h3:lang(pa), h4:lang(pa), h5:lang(pa), h6:lang(pa),
-h2:lang(pi), h3:lang(pi), h4:lang(pi), h5:lang(pi), h6:lang(pi),
-h2:lang(sa), h3:lang(sa), h4:lang(sa), h5:lang(sa), h6:lang(sa),
-h2:lang(ta), h3:lang(ta), h4:lang(ta), h5:lang(ta), h6:lang(ta),
-h2:lang(te), h3:lang(te), h4:lang(te), h5:lang(te), h6:lang(te) {
-       line-height: 1.2em;
-}
-
-/* Localised ordered list numbering for some languages */
-ol:lang(bcc) li,
-ol:lang(bqi) li,
-ol:lang(fa) li,
-ol:lang(glk) li,
-ol:lang(kk-arab) li,
-ol:lang(mzn) li {
-       list-style-type: -moz-persian;
-       list-style-type: persian;
-}
-
-ol:lang(ckb) li {
-       list-style-type: -moz-arabic-indic;
-       list-style-type: arabic-indic;
-}
-
-ol:lang(hi) li,
-ol:lang(mr) li {
-       list-style-type: -moz-devanagari;
-       list-style-type: devanagari;
-}
-
-ol:lang(as) li,
-ol:lang(bn) li {
-       list-style-type: -moz-bengali;
-       list-style-type: bengali;
-}
-
-ol:lang(or) li {
-       list-style-type: -moz-oriya;
-       list-style-type: oriya;
-}
-
-#toc ul, .toc ul {
-       margin: .3em 0;
-}
-
-/* Correct directionality when page dir is different from site/user dir */
-/* @noflip */ .mw-content-ltr .toc ul,
-.mw-content-ltr #toc ul,
-.mw-content-rtl .mw-content-ltr .toc ul,
-.mw-content-rtl .mw-content-ltr #toc ul {
-       text-align: left;
-}
-
-/* @noflip */ .mw-content-rtl .toc ul,
-.mw-content-rtl #toc ul,
-.mw-content-ltr .mw-content-rtl .toc ul,
-.mw-content-ltr .mw-content-rtl #toc ul {
-       text-align: right;
-}
-
-/* @noflip */ .mw-content-ltr .toc ul ul,
-.mw-content-ltr #toc ul ul,
-.mw-content-rtl .mw-content-ltr .toc ul ul,
-.mw-content-rtl .mw-content-ltr #toc ul ul {
-       margin: 0 0 0 2em;
-}
-
-/* @noflip */ .mw-content-rtl .toc ul ul,
-.mw-content-rtl #toc ul ul,
-.mw-content-ltr .mw-content-rtl .toc ul ul,
-.mw-content-ltr .mw-content-rtl #toc ul ul {
-       margin: 0 2em 0 0;
-}
-
-#toc #toctitle,
-.toc #toctitle,
-#toc .toctitle,
-.toc .toctitle {
-       direction: ltr;
-}
-
-/* tooltip styles */
-.mw-help-field-hint {
-       display: none;
-       margin-left: 2px;
-       margin-bottom: -8px;
-       padding: 0 0 0 15px;
-       /* @embed */
-       background-image: url(images/help-question.gif);
-       background-position: left center;
-       background-repeat: no-repeat;
-       cursor: pointer;
-       font-size: .8em;
-       text-decoration: underline;
-       color: #0645ad;
-}
-
-.mw-help-field-hint:hover {
-       /* @embed */
-       background-image: url(images/help-question-hover.gif);
-}
-
-.mw-help-field-data {
-       display: block;
-       background-color: #d6f3ff;
-       padding: 5px 8px 4px 8px;
-       border: 1px solid #5dc9f4;
-       margin-left: 20px;
-}
-
-#mw-clearyourcache,
-#mw-sitecsspreview,
-#mw-sitejspreview,
-#mw-usercsspreview,
-#mw-userjspreview {
-       direction: ltr;
-       unicode-bidi: embed;
-}
-
-/* Correct user & content directionality when viewing a diff */
-.diff-currentversion-title,
-.diff {
-       direction: ltr;
-       unicode-bidi: embed;
-}
-
-/* @noflip */ .diff-contentalign-right td {
-       direction: rtl;
-       unicode-bidi: embed;
-}
-
-/* @noflip */ .diff-contentalign-left td {
-       direction: ltr;
-       unicode-bidi: embed;
-}
-
-.diff-multi,
-.diff-otitle,
-.diff-ntitle,
-.diff-lineno {
-       direction: ltr !important;
-       unicode-bidi: embed;
-}
-
-#mw-revision-info,
-#mw-revision-info-current,
-#mw-revision-nav {
-       direction: ltr;
-       display: inline;
-}
-
-/* Images */
-
-/* @noflip */ div.tright,
-div.floatright,
-table.floatright {
-       clear: right;
-       float: right;
-}
-
-/* @noflip */ div.tleft,
-div.floatleft,
-table.floatleft {
-       float: left;
-       clear: left;
-}
-
-div.floatright,
-table.floatright,
-div.floatleft,
-table.floatleft {
-       position: relative;
-}
-
-/* bug 12205 */
-#mw-credits a {
-       unicode-bidi: embed;
-}
-
-/* Accessibility */
-.mw-jump,
-#jump-to-nav {
-       overflow: hidden;
-       height: 0;
-       zoom: 1; /* http://webaim.org/techniques/skipnav/#iequirk */
-}
-
-/* Print footer should be hidden by default in screen. */
-.printfooter {
-       display: none;
-}
-
-/* For developers */
-.xdebug-error {
-       position: absolute;
-       z-index: 99;
-}
-
-.mw-editsection,
-.toctoggle,
-#jump-to-nav {
-       -moz-user-select: none;
-       -webkit-user-select: none;
-       -ms-user-select: none;
-       user-select: none;
-}
-
-/* Display editsection links smaller and next to headings */
-.mw-editsection,
-.mw-editsection-like {
-       font-size: small;
-       font-weight: normal;
-       margin-left: 1em;
-       vertical-align: baseline;
-       /* Reset line-height; headings tend to have it set to larger values */
-       line-height: 1em;
-       /* As .mw-editsection is a <span> (inline element), it is treated as part */
-       /* of the heading content when selecting text by multiple clicks and thus */
-       /* selected together with heading content, despite the user-select: none; */
-       /* rule set above. This enforces non-selection without changing the look. */
-       display: inline-block;
-}
-
-/* Correct directionality when page dir is different from site/user dir */
-/* @noflip */
-.mw-content-ltr .mw-editsection,
-.mw-content-rtl .mw-content-ltr .mw-editsection {
-       margin-left: 1em;
-}
-
-/* @noflip */
-.mw-content-rtl .mw-editsection,
-.mw-content-ltr .mw-content-rtl .mw-editsection {
-       margin-right: 1em;
-}
-
-/* Prevent citations and subscripts from interfering with the line-height */
-sup,
-sub {
-       line-height: 1;
-}
diff --git a/skins/common/upload.js b/skins/common/upload.js
deleted file mode 100644 (file)
index 7933caf..0000000
+++ /dev/null
@@ -1,355 +0,0 @@
-/*jshint camelcase:false */
-( function ( mw, $ ) {
-var    licenseSelectorCheck, wgUploadWarningObj, wgUploadLicenseObj, fillDestFilename,
-       ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
-       fileExtensions = mw.config.get( 'wgFileExtensions' ),
-       $spinnerDestCheck, $spinnerLicense;
-
-licenseSelectorCheck = window.licenseSelectorCheck = function () {
-       var selector = document.getElementById( 'wpLicense' ),
-               selection = selector.options[selector.selectedIndex].value;
-       if ( selector.selectedIndex > 0 ) {
-               if ( !selection ) {
-                       // Option disabled, but browser is broken and doesn't respect this
-                       selector.selectedIndex = 0;
-               }
-       }
-       // We might show a preview
-       wgUploadLicenseObj.fetchPreview( selection );
-};
-
-function uploadSetup() {
-       // Disable URL box if the URL copy upload source type is not selected
-       var ein,
-               selector, ua, isMacIe, i,
-               optionsTable, row, td,
-               wpLicense, wpLicenseRow, wpLicenseTbody,
-               uploadSourceIds, len, onchange,
-               e = document.getElementById( 'wpSourceTypeurl' );
-       if ( e ) {
-               if ( !e.checked ) {
-                       ein = document.getElementById( 'wpUploadFileURL' );
-                       if ( ein ) {
-                               ein.disabled = true;
-                       }
-               }
-       }
-
-       // For MSIE/Mac: non-breaking spaces cause the <option> not to render.
-       // But for some reason, setting the text to itself works
-       selector = document.getElementById( 'wpLicense' );
-       if ( selector ) {
-               ua = navigator.userAgent;
-               isMacIe = ua.indexOf( 'MSIE' ) !== -1 && ua.indexOf( 'Mac' ) !== -1;
-               if ( isMacIe ) {
-                       for ( i = 0; i < selector.options.length; i++ ) {
-                               selector.options[i].text = selector.options[i].text;
-                       }
-               }
-       }
-
-       // AJAX wpDestFile warnings
-       if ( ajaxUploadDestCheck ) {
-               // Insert an event handler that fetches upload warnings when wpDestFile
-               // has been changed
-               document.getElementById( 'wpDestFile' ).onchange = function () {
-                       wgUploadWarningObj.checkNow( this.value );
-               };
-               // Insert a row where the warnings will be displayed just below the
-               // wpDestFile row
-               optionsTable = document.getElementById( 'mw-htmlform-description' ).tBodies[0];
-               row = optionsTable.insertRow( 1 );
-               td = document.createElement( 'td' );
-               td.id = 'wpDestFile-warning';
-               td.colSpan = 2;
-
-               row.appendChild( td );
-       }
-
-       wpLicense = document.getElementById( 'wpLicense' );
-       if ( mw.config.get( 'wgAjaxLicensePreview' ) && wpLicense ) {
-               // License selector check
-               wpLicense.onchange = licenseSelectorCheck;
-
-               // License selector table row
-               wpLicenseRow = wpLicense.parentNode.parentNode;
-               wpLicenseTbody = wpLicenseRow.parentNode;
-
-               row = document.createElement( 'tr' );
-               td = document.createElement( 'td' );
-               row.appendChild( td );
-               td = document.createElement( 'td' );
-               td.id = 'mw-license-preview';
-               row.appendChild( td );
-
-               wpLicenseTbody.insertBefore( row, wpLicenseRow.nextSibling );
-       }
-
-       // fillDestFile setup
-       uploadSourceIds = mw.config.get( 'wgUploadSourceIds' );
-       len = uploadSourceIds.length;
-       onchange = function () {
-               fillDestFilename( this.id );
-       };
-       for ( i = 0; i < len; i += 1 ) {
-               document.getElementById( uploadSourceIds[i] ).onchange = onchange;
-       }
-}
-
-wgUploadWarningObj = window.wgUploadWarningObj = {
-       responseCache: { '': '&nbsp;' },
-       nameToCheck: '',
-       typing: false,
-       delay: 500, // ms
-       timeoutID: false,
-
-       keypress: function () {
-               var cached, destFile, warningElt;
-
-               if ( !ajaxUploadDestCheck ) {
-                       return;
-               }
-
-               // Find file to upload
-               destFile = document.getElementById( 'wpDestFile' );
-               warningElt = document.getElementById( 'wpDestFile-warning' );
-               if ( !destFile || !warningElt ) {
-                       return;
-               }
-
-               this.nameToCheck = destFile.value;
-
-               // Clear timer
-               if ( this.timeoutID ) {
-                       clearTimeout( this.timeoutID );
-               }
-               // Check response cache
-               for ( cached in this.responseCache ) {
-                       if ( this.nameToCheck === cached ) {
-                               this.setWarning(this.responseCache[this.nameToCheck]);
-                               return;
-                       }
-               }
-
-               this.timeoutID = setTimeout( function () {
-                       wgUploadWarningObj.timeout();
-               }, this.delay );
-       },
-
-       checkNow: function ( fname ) {
-               if ( !ajaxUploadDestCheck ) {
-                       return;
-               }
-               if ( this.timeoutID ) {
-                       clearTimeout( this.timeoutID );
-               }
-               this.nameToCheck = fname;
-               this.timeout();
-       },
-
-       timeout: function () {
-               if ( !ajaxUploadDestCheck || this.nameToCheck === '' ) {
-                       return;
-               }
-               $spinnerDestCheck = $.createSpinner().insertAfter( '#wpDestFile' );
-
-               var uploadWarningObj = this;
-               ( new mw.Api() ).get( {
-                       action: 'query',
-                       titles: ( new mw.Title( this.nameToCheck, mw.config.get( 'wgNamespaceIds' ).file ) ).getPrefixedText(),
-                       prop: 'imageinfo',
-                       iiprop: 'uploadwarning',
-                       indexpageids: ''
-               } ).done( function ( result ) {
-                       var resultOut = '';
-                       if ( result.query ) {
-                               resultOut = result.query.pages[result.query.pageids[0]].imageinfo[0];
-                       }
-                       uploadWarningObj.processResult( resultOut, uploadWarningObj.nameToCheck );
-               } );
-       },
-
-       processResult: function ( result, fileName ) {
-               $spinnerDestCheck.remove();
-               $spinnerDestCheck = undefined;
-               this.setWarning( result.html );
-               this.responseCache[fileName] = result.html;
-       },
-
-       setWarning: function ( warning ) {
-               var warningElt = document.getElementById( 'wpDestFile-warning' ),
-                       ackElt = document.getElementsByName( 'wpDestFileWarningAck' );
-
-               this.setInnerHTML( warningElt, warning );
-
-               // Set a value in the form indicating that the warning is acknowledged and
-               // doesn't need to be redisplayed post-upload
-               if ( !warning ) {
-                       ackElt[0].value = '';
-               } else {
-                       ackElt[0].value = '1';
-               }
-
-       },
-       setInnerHTML: function ( element, text ) {
-               // Check for no change to avoid flicker in IE 7
-               if ( element.innerHTML !== text ) {
-                       element.innerHTML = text;
-               }
-       }
-};
-
-fillDestFilename = window.fillDestFilename = function ( id ) {
-       var e, path, slash, backslash, fname,
-               found, ext, i,
-               destFile;
-       if ( !mw.config.get( 'wgUploadAutoFill' ) ) {
-               return;
-       }
-       if ( !document.getElementById ) {
-               return;
-       }
-       // Remove any previously flagged errors
-       e = document.getElementById( 'mw-upload-permitted' );
-       if ( e ) {
-               e.className = '';
-       }
-
-       e = document.getElementById( 'mw-upload-prohibited' );
-       if ( e ) {
-               e.className = '';
-       }
-
-       path = document.getElementById( id ).value;
-       // Find trailing part
-       slash = path.lastIndexOf( '/' );
-       backslash = path.lastIndexOf( '\\' );
-       if ( slash === -1 && backslash === -1 ) {
-               fname = path;
-       } else if ( slash > backslash ) {
-               fname = path.substring( slash + 1, 10000 );
-       } else {
-               fname = path.substring( backslash + 1, 10000 );
-       }
-
-       // Clear the filename if it does not have a valid extension.
-       // URLs are less likely to have a useful extension, so don't include them in the
-       // extension check.
-       if ( mw.config.get( 'wgStrictFileExtensions' ) && fileExtensions && id !== 'wpUploadFileURL' ) {
-               found = false;
-               if ( fname.lastIndexOf( '.' ) !== -1 ) {
-                       ext = fname.substr( fname.lastIndexOf( '.' ) + 1 );
-                       for ( i = 0; i < fileExtensions.length; i += 1 ) {
-                               if ( fileExtensions[i].toLowerCase() === ext.toLowerCase() ) {
-                                       found = true;
-                                       break;
-                               }
-                       }
-               }
-               if ( !found ) {
-                       // Not a valid extension
-                       // Clear the upload and set mw-upload-permitted to error
-                       document.getElementById( id ).value = '';
-                       e = document.getElementById( 'mw-upload-permitted' );
-                       if ( e ) {
-                               e.className = 'error';
-                       }
-
-                       e = document.getElementById( 'mw-upload-prohibited' );
-                       if ( e ) {
-                               e.className = 'error';
-                       }
-
-                       // Clear wpDestFile as well
-                       e = document.getElementById( 'wpDestFile' );
-                       if ( e ) {
-                               e.value = '';
-                       }
-
-                       return false;
-               }
-       }
-
-       // Replace spaces by underscores
-       fname = fname.replace( / /g, '_' );
-       // Capitalise first letter if needed
-       if ( mw.config.get( 'wgCapitalizeUploads' ) ) {
-               fname = fname.charAt( 0 ).toUpperCase().concat( fname.substring( 1, 10000 ) );
-       }
-
-       // Output result
-       destFile = document.getElementById( 'wpDestFile' );
-       if ( destFile ) {
-               // Call decodeURIComponent function to remove possible URL-encoded characters
-               // from the file name (bug 30390). Especially likely with upload-form-url.
-               // decodeURIComponent can throw an exception in input is invalid utf-8
-               try {
-                       destFile.value = decodeURIComponent( fname );
-               } catch ( err ) {
-                       destFile.value = fname;
-               }
-               wgUploadWarningObj.checkNow( fname );
-       }
-};
-
-window.toggleFilenameFiller = function () {
-       if ( !document.getElementById ) {
-               return;
-       }
-       var destName = document.getElementById( 'wpDestFile' ).value;
-       mw.config.set( 'wgUploadAutoFill', !destName );
-};
-
-wgUploadLicenseObj = window.wgUploadLicenseObj = {
-
-       responseCache: { '': '' },
-
-       fetchPreview: function ( license ) {
-               var cached, title;
-               if ( !mw.config.get( 'wgAjaxLicensePreview' ) ) {
-                       return;
-               }
-               for ( cached in this.responseCache ) {
-                       if ( cached === license ) {
-                               this.showPreview( this.responseCache[license] );
-                               return;
-                       }
-               }
-
-               $spinnerLicense = $.createSpinner().insertAfter( '#wpLicense' );
-
-               title = document.getElementById( 'wpDestFile' ).value;
-               if ( !title ) {
-                       title = 'File:Sample.jpg';
-               }
-
-               ( new mw.Api() ).get( {
-                       action: 'parse',
-                       text: '{{' + license + '}}',
-                       title: title,
-                       prop: 'text',
-                       pst: ''
-               } ).done( function ( result ) {
-                       wgUploadLicenseObj.processResult( result, license );
-               } );
-       },
-
-       processResult: function ( result, license ) {
-               $spinnerLicense.remove();
-               $spinnerLicense = undefined;
-               this.responseCache[license] = result.parse.text['*'];
-               this.showPreview( this.responseCache[license] );
-       },
-
-       showPreview: function ( preview ) {
-               var previewPanel = document.getElementById( 'mw-license-preview' );
-               if ( previewPanel.innerHTML !== preview ) {
-                       previewPanel.innerHTML = preview;
-               }
-       }
-
-};
-
-$( uploadSetup );
-
-}( mediaWiki, jQuery ) );
deleted file mode 100644 (file)
index 5c6e63b9ee9285c2de3d2ab68b8d42e6302a4d75..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,201 +0,0 @@
-/**
- * MediaWiki legacy wikibits
- */
-( function ( mw, $ ) {
-       var msg,
-               win = window,
-               ua = navigator.userAgent.toLowerCase(),
-               onloadFuncts = [];
-
-/**
- * User-agent sniffing.
- *
- * @deprecated since 1.17 Use jquery.client instead
- */
-
-msg = 'Use feature detection or module jquery.client instead.';
-
-mw.log.deprecate( win, 'clientPC', ua, msg );
-
-// Ignored dummy values
-mw.log.deprecate( win, 'is_gecko', false, msg );
-mw.log.deprecate( win, 'is_chrome_mac', false, msg );
-mw.log.deprecate( win, 'is_chrome', false, msg );
-mw.log.deprecate( win, 'webkit_version', false, msg );
-mw.log.deprecate( win, 'is_safari_win', false, msg );
-mw.log.deprecate( win, 'is_safari', false, msg );
-mw.log.deprecate( win, 'webkit_match', false, msg );
-mw.log.deprecate( win, 'is_ff2', false, msg );
-mw.log.deprecate( win, 'ff2_bugs', false, msg );
-mw.log.deprecate( win, 'is_ff2_win', false, msg );
-mw.log.deprecate( win, 'is_ff2_x11', false, msg );
-mw.log.deprecate( win, 'opera95_bugs', false, msg );
-mw.log.deprecate( win, 'opera7_bugs', false, msg );
-mw.log.deprecate( win, 'opera6_bugs', false, msg );
-mw.log.deprecate( win, 'is_opera_95', false, msg );
-mw.log.deprecate( win, 'is_opera_preseven', false, msg );
-mw.log.deprecate( win, 'is_opera', false, msg );
-mw.log.deprecate( win, 'ie6_bugs', false, msg );
-
-/**
- * DOM utilities for handling of events, text nodes and selecting elements
- *
- * @deprecated since 1.17 Use jQuery instead
- */
-msg = 'Use jQuery instead.';
-
-// Ignored dummy values
-mw.log.deprecate( win, 'doneOnloadHook', undefined, msg );
-mw.log.deprecate( win, 'onloadFuncts', [], msg );
-mw.log.deprecate( win, 'runOnloadHook', $.noop, msg );
-mw.log.deprecate( win, 'changeText', $.noop, msg );
-mw.log.deprecate( win, 'killEvt', $.noop, msg );
-mw.log.deprecate( win, 'addHandler', $.noop, msg );
-mw.log.deprecate( win, 'hookEvent', $.noop, msg );
-mw.log.deprecate( win, 'addClickHandler', $.noop, msg );
-mw.log.deprecate( win, 'removeHandler', $.noop, msg );
-mw.log.deprecate( win, 'getElementsByClassName', function () { return []; }, msg );
-mw.log.deprecate( win, 'getInnerText', function () { return ''; }, msg );
-
-// Run a function after the window onload event is fired
-mw.log.deprecate( win, 'addOnloadHook', function ( hookFunct ) {
-       if ( onloadFuncts ) {
-               onloadFuncts.push(hookFunct);
-       } else {
-               // If func queue is gone the event has happened already,
-               // run immediately instead of queueing.
-               hookFunct();
-       }
-}, msg );
-
-$( win ).on( 'load', function () {
-       var i, functs;
-
-       // Don't run twice
-       if ( !onloadFuncts ) {
-               return;
-       }
-
-       // Deference and clear onloadFuncts before running any
-       // hooks to make sure we don't miss any addOnloadHook
-       // calls.
-       functs = onloadFuncts.slice();
-       onloadFuncts = undefined;
-
-       // Execute the queued functions
-       for ( i = 0; i < functs.length; i++ ) {
-               functs[i]();
-       }
-} );
-
-/**
- * Toggle checkboxes with shift selection
- *
- * @deprecated since 1.17 Use jquery.checkboxShiftClick instead
- */
-msg = 'Use jquery.checkboxShiftClick instead.';
-mw.log.deprecate( win, 'checkboxes', [], msg );
-mw.log.deprecate( win, 'lastCheckbox', null, msg );
-mw.log.deprecate( win, 'setupCheckboxShiftClick', $.noop, msg );
-mw.log.deprecate( win, 'addCheckboxClickHandlers', $.noop, msg );
-mw.log.deprecate( win, 'checkboxClickHandler', $.noop, msg );
-
-/**
- * Add a button to the default editor toolbar
- *
- * @deprecated since 1.17 Use mw.toolbar instead
- */
-mw.log.deprecate( win, 'mwEditButtons', [], 'Use mw.toolbar instead.' );
-mw.log.deprecate( win, 'mwCustomEditButtons', [], 'Use mw.toolbar instead.' );
-
-/**
- * Spinner creation, injection and removal
- *
- * @deprecated since 1.18 Use jquery.spinner instead
- */
-mw.log.deprecate( win, 'injectSpinner', $.noop, 'Use jquery.spinner instead.' );
-mw.log.deprecate( win, 'removeSpinner', $.noop, 'Use jquery.spinner instead.' );
-
-/**
- * Escape utilities
- *
- * @deprecated since 1.18 Use mw.html instead
- */
-mw.log.deprecate( win, 'escapeQuotes', $.noop, 'Use mw.html instead.' );
-mw.log.deprecate( win, 'escapeQuotesHTML', $.noop, 'Use mw.html instead.' );
-
-/**
- * Display a message to the user
- *
- * @deprecated since 1.17 Use mediawiki.notify instead
- * @param {string|HTMLElement} message To be put inside the message box
- */
-mw.log.deprecate( win, 'jsMsg', function ( message ) {
-       if ( !arguments.length || message === '' || message === null ) {
-               return true;
-       }
-       if ( typeof message !== 'object' ) {
-               message = $.parseHTML( message );
-       }
-       mw.notify( message, { autoHide: true, tag: 'legacy' } );
-       return true;
-}, 'Use mediawiki.notify instead.' );
-
-/**
- * Misc. utilities
- *
- * @deprecated since 1.17 Use mediawiki.util instead
- */
-msg = 'Use mediawiki.util instead.';
-mw.log.deprecate( win, 'updateTooltipAccessKeys', mw.util.updateTooltipAccessKeys, msg );
-mw.log.deprecate( win, 'addPortletLink', mw.util.addPortletLink, msg );
-mw.log.deprecate( win, 'appendCSS', mw.util.addCSS, msg );
-msg = 'Use jquery.accessKeyLabel instead.';
-mw.log.deprecate( win, 'tooltipAccessKeyPrefix', 'alt-', msg );
-mw.log.deprecate( win, 'tooltipAccessKeyRegexp', /\[(alt-)?(.)\]$/, msg );
-
-/**
- * Wikipage import methods
- */
-
-// included-scripts tracker
-win.loadedScripts = {};
-
-win.importScript = function ( page ) {
-       var uri = mw.config.get( 'wgScript' ) + '?title=' +
-               mw.util.wikiUrlencode( page ) +
-               '&action=raw&ctype=text/javascript';
-       return win.importScriptURI( uri );
-};
-
-win.importScriptURI = function ( url ) {
-       if ( win.loadedScripts[url] ) {
-               return null;
-       }
-       win.loadedScripts[url] = true;
-       var s = document.createElement( 'script' );
-       s.setAttribute( 'src', url );
-       s.setAttribute( 'type', 'text/javascript' );
-       document.getElementsByTagName( 'head' )[0].appendChild( s );
-       return s;
-};
-
-win.importStylesheet = function ( page ) {
-       var uri = mw.config.get( 'wgScript' ) + '?title=' +
-               mw.util.wikiUrlencode( page ) +
-               '&action=raw&ctype=text/css';
-       return win.importStylesheetURI( uri );
-};
-
-win.importStylesheetURI = function ( url, media ) {
-       var l = document.createElement( 'link' );
-       l.rel = 'stylesheet';
-       l.href = url;
-       if ( media ) {
-               l.media = media;
-       }
-       document.getElementsByTagName('head')[0].appendChild( l );
-       return l;
-};
-
-}( mediaWiki, jQuery ) );
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..c86af5b4cafc2d01d733615599ae1d66fe042639
--- /dev/null
@@ -0,0 +1 @@
+../../resources/src/mediawiki.legacy/wikibits.js
\ No newline at end of file
index 0078d7e..2e8fed4 100644 (file)
@@ -44,6 +44,7 @@ $wgAutoloadClasses += array(
        'ResourceLoaderTestCase' => "$testDir/phpunit/ResourceLoaderTestCase.php",
        'ResourceLoaderTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php",
        'ResourceLoaderFileModuleTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php",
+       'ResourceLoaderWikiModuleTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php",
        'TestUser' => "$testDir/phpunit/includes/TestUser.php",
        'LessFileCompilationTest' => "$testDir/phpunit/LessFileCompilationTest.php",
 
index e7b64cd..c24e386 100644 (file)
@@ -16,7 +16,6 @@ class PreferencesAppearancePage
   page_url URL.url("Special:Preferences#mw-prefsection-rendering")
 
   checkbox(:auto_number_check, id: "mw-input-wpnumberheadings")
-  checkbox(:collapse_sidebar_vector_check, id: "mw-input-wpvector-collapsiblenav")
   radio_button(:cologne_blue, id: "mw-input-wpskin-cologneblue")
   radio_button(:day_mo_year_radio, id: "mw-input-wpdate-dmy")
   checkbox(:dont_show_aft_check, id: "mw-input-wparticlefeedback-disable")
index 96eedb4..dc5549b 100644 (file)
@@ -81,3 +81,10 @@ class ResourceLoaderTestModule extends ResourceLoaderModule {
 
 class ResourceLoaderFileModuleTestModule extends ResourceLoaderFileModule {
 }
+
+class ResourceLoaderWikiModuleTestModule extends ResourceLoaderWikiModule {
+       // Override expected via PHPUnit mocks and stubs
+       protected function getPages( ResourceLoaderContext $context ) {
+               return array();
+       }
+}
index 74eb21e..03addcb 100644 (file)
@@ -4,8 +4,7 @@
 
 .selector { /*@embed*/ background-image: url(simple-ltr.gif); }
 
-/* Doesn't work! */
-/*.selector { /*@noflip* / /*@embed* / background-image: url(simple-ltr.gif); }*/
+.selector { /*@embed*/ background-image: url(simple-ltr.gif); }
 
 .selector { /*@embed*/ background-image: url(simple-ltr.gif); }
 
index bf589ad..8d0d670 100644 (file)
@@ -4,8 +4,7 @@
 
 /*@noflip*/ .selector { background-image: /*@embed*/ url(simple-ltr.gif); }
 
-/* Doesn't work! */
-/*.selector { /*@noflip* / /*@embed* / background-image: url(simple-ltr.gif); }*/
+.selector { /*@noflip*/ /*@embed*/ background-image: url(simple-ltr.gif); }
 
 .selector { /*@embed*/ /*@noflip*/ background-image: url(simple-ltr.gif); }
 
index b78780a..e7454af 100644 (file)
@@ -1,4 +1,3 @@
-/* @noflip */
 .unit-tests {
   color: green;
   border: 2px solid #eeeeee;
index 84799ff..3acc48e 100644 (file)
@@ -59,13 +59,33 @@ class GlobalTest extends MediaWikiTestCase {
                );
        }
 
+       /*
+        * Test cases for random functions could hypothetically fail,
+        * even though they shouldn't.
+        */
+
        /**
         * @covers ::wfRandom
         */
        public function testRandom() {
-               # This could hypothetically fail, but it shouldn't ;)
                $this->assertFalse(
-                       wfRandom() == wfRandom() );
+                       wfRandom() == wfRandom()
+               );
+       }
+
+       /**
+        * @covers ::wfRandomString
+        */
+       public function testRandomString() {
+               $this->assertFalse(
+                       wfRandomString() == wfRandomString()
+               );
+               $this->assertEquals(
+                       strlen( wfRandomString( 10 ) ), 10
+               );
+               $this->assertTrue(
+                       preg_match( '/^[0-9a-f]+$/i', wfRandomString() ) === 1
+               );
        }
 
        /**
index dd4f9cc..9d55e85 100644 (file)
@@ -186,4 +186,10 @@ class WfBaseConvertTest extends MediaWikiTestCase {
                        strlen( wfBaseConvert( $number, 2, 2, strlen( $number ) - 5 ) )
                );
        }
+
+       public function testLeadingZero() {
+               $this->assertSame( '24', wfBaseConvert( '010', 36, 16 ) );
+               $this->assertSame( '37d4', wfBaseConvert( '0b10', 36, 16 ) );
+               $this->assertSame( 'a734', wfBaseConvert( '0x10', 36, 16 ) );
+       }
 }
index 5c1994b..69a302d 100644 (file)
@@ -151,18 +151,26 @@ class OutputPageTest extends MediaWikiTestCase {
                                '<link rel=stylesheet href="http://127.0.0.1:8080/w/load.php?debug=false&amp;lang=en&amp;modules=test.bar%2Cbaz%2Cfoo&amp;only=styles&amp;skin=fallback&amp;*">
 '
                        ),
-                       // Load private module (scripts)
+                       // Load private module (only=scripts)
+                       // This is asserted for completion (would get two condition wrappers),
+                       // though in practice we'd never embed a module with only=scripts,
+                       // that mode is reserved for hardcoded requests. Embedded modules
+                       // would always be combined.
                        array(
                                array( 'test.quux', ResourceLoaderModule::TYPE_SCRIPTS ),
-                               '<script>if(window.mw){mw.test.baz({token:123});mw.loader.state({"test.quux":"ready"});}
-</script>
+                               '<script>if(window.mw){
+if(window.mw){mw.test.baz({token:123});mw.loader.state({"test.quux":"ready"});}
+
+}</script>
 '
                        ),
                        // Load private module (combined)
                        array(
                                array( 'test.quux', ResourceLoaderModule::TYPE_COMBINED ),
-                               '<script>mw.loader.implement("test.quux",function($,jQuery){mw.test.baz({token:123});},{"css":[".mw-icon{transition:none}\n"]},{});
-</script>
+                               '<script>if(window.mw){
+mw.loader.implement("test.quux",function($,jQuery){mw.test.baz({token:123});},{"css":[".mw-icon{transition:none}\n"]},{});
+
+}</script>
 '
                        ),
                        // Load module script with with ESI
diff --git a/tests/phpunit/includes/changes/EnhancedChangesListTest.php b/tests/phpunit/includes/changes/EnhancedChangesListTest.php
new file mode 100644 (file)
index 0000000..40a11d2
--- /dev/null
@@ -0,0 +1,132 @@
+<?php
+
+/**
+ * @covers EnhancedChangesList
+ *
+ * @group Database
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < aude.wiki@gmail.com >
+ */
+class EnhancedChangesListTest extends MediaWikiLangTestCase {
+
+       /**
+        * @var TestRecentChangesHelper
+        */
+       private $testRecentChangesHelper;
+
+       public function __construct( $name = null, array $data = array(), $dataName = '' ) {
+               parent::__construct( $name, $data, $dataName );
+
+               $this->testRecentChangesHelper = new TestRecentChangesHelper();
+       }
+
+       public function testBeginRecentChangesList_styleModules() {
+               $enhancedChangesList = $this->newEnhancedChangesList();
+               $enhancedChangesList->beginRecentChangesList();
+
+               $styleModules = $enhancedChangesList->getOutput()->getModuleStyles();
+
+               $this->assertContains(
+                       'mediawiki.special.changeslist',
+                       $styleModules,
+                       'has mediawiki.special.changeslist'
+                );
+
+               $this->assertContains(
+                       'mediawiki.special.changeslist.enhanced',
+                       $styleModules,
+                       'has mediawiki.special.changeslist.enhanced'
+               );
+       }
+
+       public function testBeginRecentChangesList_jsModules() {
+               $enhancedChangesList = $this->newEnhancedChangesList();
+               $enhancedChangesList->beginRecentChangesList();
+
+               $modules = $enhancedChangesList->getOutput()->getModules();
+
+               $this->assertContains( 'jquery.makeCollapsible', $modules, 'has jquery.makeCollapsible' );
+               $this->assertContains( 'mediawiki.icon', $modules, 'has mediawiki.icon' );
+       }
+
+       public function testBeginRecentChangesList_html() {
+               $enhancedChangesList = $this->newEnhancedChangesList();
+               $html = $enhancedChangesList->beginRecentChangesList();
+
+               $this->assertEquals( '<div class="mw-changeslist">', $html );
+       }
+
+       /**
+        * @todo more tests
+        */
+       public function testRecentChangesLine() {
+               $enhancedChangesList = $this->newEnhancedChangesList();
+               $enhancedChangesList->beginRecentChangesList();
+
+               $recentChange = $this->getEditChange( '20131103092153' );
+               $html = $enhancedChangesList->recentChangesLine( $recentChange, false );
+
+               $this->assertInternalType( 'string', $html );
+
+               $recentChange2 = $this->getEditChange( '20131103092253' );
+               $html = $enhancedChangesList->recentChangesLine( $recentChange2, false );
+
+               $this->assertEquals( '', $html );
+       }
+
+         /**
+          * @todo more tests for actual formatting, this is more of a smoke test
+          */
+         public function testEndRecentChangesList() {
+               $enhancedChangesList = $this->newEnhancedChangesList();
+               $enhancedChangesList->beginRecentChangesList();
+
+               $recentChange = $this->getEditChange( '20131103092153' );
+               $enhancedChangesList->recentChangesLine( $recentChange, false );
+
+               $recentChange2 = $this->getEditChange( '20131103092253' );
+               $enhancedChangesList->recentChangesLine( $recentChange2, false );
+
+               $html = $enhancedChangesList->endRecentChangesList();
+
+               preg_match_all( '/td class="mw-enhanced-rc-nested"/', $html, $matches );
+               $this->assertCount( 2, $matches[0] );
+         }
+
+       /**
+        * @return EnhancedChangesList
+        */
+       private function newEnhancedChangesList() {
+               $user = User::newFromId( 0 );
+               $context = $this->testRecentChangesHelper->getTestContext( $user );
+
+               return new EnhancedChangesList( $context );
+       }
+
+       /**
+        * @return RecentChange
+        */
+       private function getEditChange( $timestamp ) {
+               $user = $this->getTestUser();
+               $recentChange = $this->testRecentChangesHelper->makeEditRecentChange(
+                       $user, 'Cat', $timestamp, 5, 191, 190, 0, 0
+               );
+
+               return $recentChange;
+       }
+
+       /**
+        * @return User
+        */
+       private function getTestUser() {
+               $user = User::newFromName( 'TestRecentChangesUser' );
+
+               if ( !$user->getId() ) {
+                       $user->addToDatabase();
+               }
+
+               return $user;
+       }
+
+}
index 407f11a..e4283b0 100644 (file)
@@ -15,15 +15,27 @@ class CSSJanusTest extends MediaWikiTestCase {
 
                if ( $cssB ) {
                        $transformedA = CSSJanus::transform( $cssA );
-                       $this->assertEquals( $transformedA, $cssB, 'Test A-B transformation' );
+                       $this->assertEquals(
+                               $transformedA,
+                               str_replace( '/* @noflip */ ', '', $cssB ),
+                               'Test A-B transformation'
+                       );
 
                        $transformedB = CSSJanus::transform( $cssB );
-                       $this->assertEquals( $transformedB, $cssA, 'Test B-A transformation' );
+                       $this->assertEquals(
+                               $transformedB,
+                               str_replace( '/* @noflip */ ', '', $cssA ),
+                               'Test B-A transformation'
+                       );
                } else {
                        // If no B version is provided, it means
-                       // the output should equal the input.
+                       // the output should equal the input (modulo @noflip annotations).
                        $transformedA = CSSJanus::transform( $cssA );
-                       $this->assertEquals( $transformedA, $cssA, 'Nothing was flipped' );
+                       $this->assertEquals(
+                               $transformedA,
+                               str_replace( '/* @noflip */ ', '', $cssA ),
+                               'Nothing was flipped'
+                       );
                }
        }
 
index 12ec9dd..d72c5e7 100644 (file)
@@ -110,12 +110,12 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
 
                $this->assertEquals(
                        $expectedModule->getStyles( $contextLtr ),
-                       str_replace( '/*@noflip*/ ', '', $testModule->getStyles( $contextLtr ) ),
+                       $testModule->getStyles( $contextLtr ),
                        "/*@noflip*/ with /*@embed*/ gives correct results in LTR mode"
                );
                $this->assertEquals(
                        $expectedModule->getStyles( $contextLtr ),
-                       str_replace( '/*@noflip*/ ', '', $testModule->getStyles( $contextRtl ) ),
+                       $testModule->getStyles( $contextRtl ),
                        "/*@noflip*/ with /*@embed*/ gives correct results in RTL mode"
                );
        }
diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php
new file mode 100644 (file)
index 0000000..50f88c8
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+
+class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
+
+       /**
+        * @covers ResourceLoaderWikiModule::isKnownEmpty
+        * @dataProvider provideIsKnownEmpty
+        */
+       public function testIsKnownEmpty( $titleInfo, $group, $expected ) {
+               $module = $this->getMockBuilder( 'ResourceLoaderWikiModuleTestModule' )
+                       ->setMethods( array( 'getTitleInfo', 'getGroup' ) )
+                       ->getMock();
+               $module->expects( $this->any() )
+                       ->method( 'getTitleInfo' )
+                       ->will( $this->returnValue( $titleInfo ) );
+               $module->expects( $this->any() )
+                       ->method( 'getGroup' )
+                       ->will( $this->returnValue( $group ) );
+               $context = $this->getMockBuilder( 'ResourceLoaderContext' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $this->assertEquals( $expected, $module->isKnownEmpty( $context ) );
+       }
+
+       public function provideIsKnownEmpty() {
+               return array(
+                       // No valid pages
+                       array( array(), 'test1', true ),
+                       // 'site' module with a non-empty page
+                       array(
+                               array(
+                                       'MediaWiki:Common.js' => array(
+                                               'timestamp' => 123456789,
+                                               'length' => 1234
+                                       )
+                               ), 'site', false,
+                       ),
+                       // 'site' module with an empty page
+                       array(
+                               array(
+                                       'MediaWiki:Monobook.js' => array(
+                                               'timestamp' => 987654321,
+                                               'length' => 0,
+                                       ),
+                               ), 'site', false,
+                       ),
+                       // 'user' module with a non-empty page
+                       array(
+                               array(
+                                       'User:FooBar/common.js' => array(
+                                               'timestamp' => 246813579,
+                                               'length' => 25,
+                                       ),
+                               ), 'user', false,
+                       ),
+                       // 'user' module with an empty page
+                       array(
+                               array(
+                                       'User:FooBar/monobook.js' => array(
+                                               'timestamp' => 1357924680,
+                                               'length' => 0,
+                                       ),
+                               ), 'user', true,
+                       ),
+               );
+       }
+}
index 3bfabe4..16f90df 100644 (file)
                assert.equal( mw.language.getData( 'en', 'invalidkey' ), undefined, 'Getter setter test for mw.language with invalid key' );
        } );
 
+       QUnit.test( 'mw.language.commafy test', 9, function ( assert ) {
+               // Number grouping patterns are as per http://cldr.unicode.org/translation/number-patterns
+               assert.equal( mw.language.commafy( 1234.567, '###0.#####' ), '1234.567', 'Pattern with no digit grouping separator defined' );
+               assert.equal( mw.language.commafy( 123456789.567, '###0.#####' ), '123456789.567', 'Pattern with no digit grouping seperator defined, bigger decimal part' );
+               assert.equal( mw.language.commafy( 0.567, '###0.#####' ), '0.567', 'Decimal part 0' );
+               assert.equal( mw.language.commafy( '.567', '###0.#####' ), '0.567', 'Decimal part missing. replace with zero' );
+               assert.equal( mw.language.commafy( 1234, '##,#0.#####' ), '12,34', 'Pattern with no fractional part' );
+               assert.equal( mw.language.commafy( -1234.567, '###0.#####' ), '-1234.567', 'Negative number' );
+               assert.equal( mw.language.commafy( -1234.567, '#,###.00' ), '-1,234.56', 'Fractional part bigger than pattern.' );
+               assert.equal( mw.language.commafy( 123456789.567, '###,##0.00' ), '123,456,789.56', 'Decimal part as group of 3' );
+               assert.equal( mw.language.commafy( 123456789.567, '###,###,#0.00' ), '1,234,567,89.56', 'Decimal part as group of 3 and last one 2' );
+       } );
+
        function grammarTest( langCode, test ) {
                // The test works only if the content language is opt.language
                // because it requires [lang].js to be loaded.
                        grammarTest( langCode, test );
                }
        } );
+
+       QUnit.test( 'List to text test', 4, function ( assert ) {
+               assert.equal( mw.language.listToText( [] ), '', 'Blank list' );
+               assert.equal( mw.language.listToText( ['a'] ), 'a', 'Single item' );
+               assert.equal( mw.language.listToText( ['a', 'b'] ), 'a and b', 'Two items' );
+               assert.equal( mw.language.listToText( ['a', 'b', 'c'] ), 'a, b and c', 'More than two items' );
+       } );
 }( mediaWiki, jQuery ) );
index c3b9b3d..7dec626 100644 (file)
@@ -1,7 +1,6 @@
 /*global isCompatible: true */
 ( function ( $ ) {
        var testcases = {
-               // Supported: Compatible
                gradeA: [
                        // Chrome
                        'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16',
@@ -43,7 +42,6 @@
                        // Android
                        'Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17'
                ],
-               // Supported: Uncompatible, serve basic content
                gradeC: [
                        // Internet Explorer < 7
                        'Mozilla/2.0 (compatible; MSIE 3.03; Windows 3.1)',
@@ -90,8 +88,7 @@
                        // Google Glass
                        'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; Glass 1 Build/IMM76L; XE11) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'
                ],
-               // No explicit support for or against these browsers, they're
-               // given a shot at Grade A at their own risk.
+               // No explicit support for or against these browsers, they're given a shot at Grade A.
                gradeX: [
                        // Firefox 3.6
                        'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3',