Merge "Test improperly quoted attribute values in HTML tags and table cells"
authorSubramanya Sastry <ssastry@wikimedia.org>
Fri, 25 Jan 2013 18:15:45 +0000 (18:15 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 25 Jan 2013 18:15:45 +0000 (18:15 +0000)
322 files changed:
CREDITS
RELEASE-NOTES-1.21
UPGRADE
docs/hooks.txt
includes/AutoLoader.php
includes/Block.php
includes/CategoryViewer.php
includes/DefaultSettings.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/HttpFunctions.php
includes/ImagePage.php
includes/Linker.php
includes/MessageBlobStore.php
includes/OutputPage.php
includes/RecentChange.php
includes/Setup.php
includes/SkinTemplate.php
includes/SpecialPageFactory.php
includes/Title.php
includes/User.php
includes/WebRequest.php
includes/WikiPage.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiComparePages.php
includes/api/ApiCreateAccount.php
includes/api/ApiDelete.php
includes/api/ApiDisabled.php
includes/api/ApiEditPage.php
includes/api/ApiEmailUser.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedContributions.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFileRevert.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatDbg.php
includes/api/ApiFormatDump.php
includes/api/ApiFormatJson.php
includes/api/ApiFormatNone.php
includes/api/ApiFormatPhp.php
includes/api/ApiFormatRaw.php
includes/api/ApiFormatTxt.php
includes/api/ApiFormatWddx.php
includes/api/ApiFormatXml.php
includes/api/ApiFormatYaml.php
includes/api/ApiHelp.php
includes/api/ApiImport.php
includes/api/ApiLogin.php
includes/api/ApiLogout.php
includes/api/ApiMain.php
includes/api/ApiMove.php
includes/api/ApiOpenSearch.php
includes/api/ApiOptions.php
includes/api/ApiPageSet.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiPatrol.php
includes/api/ApiProtect.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllLinks.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryCategories.php
includes/api/ApiQueryCategoryInfo.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryDisabled.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryExtLinksUsage.php
includes/api/ApiQueryExternalLinks.php
includes/api/ApiQueryFilearchive.php
includes/api/ApiQueryIWBacklinks.php
includes/api/ApiQueryIWLinks.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryImages.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLangBacklinks.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryLinks.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryPageProps.php
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQueryRandom.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryStashImageInfo.php
includes/api/ApiQueryTags.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiQueryWatchlistRaw.php
includes/api/ApiResult.php
includes/api/ApiRollback.php
includes/api/ApiRsd.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/ApiTokens.php
includes/api/ApiUnblock.php
includes/api/ApiUndelete.php
includes/api/ApiUpload.php
includes/api/ApiUserrights.php
includes/api/ApiWatch.php
includes/content/ContentHandler.php
includes/context/RequestContext.php
includes/dao/DBAccessBase.php
includes/db/Database.php
includes/db/ORMRow.php
includes/db/ORMTable.php
includes/externalstore/ExternalStore.php
includes/filebackend/SwiftFileBackend.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/installer/Installer.i18n.php
includes/interwiki/Interwiki.php
includes/job/Job.php
includes/job/JobQueue.php
includes/job/JobQueueGroup.php
includes/libs/CSSJanus.php
includes/logging/LogEntry.php
includes/logging/LogFormatter.php
includes/logging/LogPage.php
includes/objectcache/MemcachedBagOStuff.php
includes/objectcache/MemcachedClient.php
includes/objectcache/XCacheBagOStuff.php
includes/parser/CoreParserFunctions.php
includes/parser/Parser.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/site/MediaWikiSite.php
includes/site/Site.php
includes/site/SiteArray.php [deleted file]
includes/site/SiteList.php
includes/site/SiteObject.php [deleted file]
includes/site/SiteSQLStore.php [new file with mode: 0644]
includes/site/SiteStore.php [new file with mode: 0644]
includes/site/Sites.php [deleted file]
includes/site/SitesTable.php [deleted file]
includes/specials/SpecialContributions.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialProtectedtitles.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRecentchangeslinked.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialWatchlist.php
includes/templates/Usercreate.php
includes/upload/PublishStashedFile.php
languages/Language.php
languages/messages/MessagesAf.php
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesArn.php
languages/messages/MessagesAst.php
languages/messages/MessagesAz.php
languages/messages/MessagesAzb.php
languages/messages/MessagesBcl.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBn.php
languages/messages/MessagesBo.php
languages/messages/MessagesBs.php
languages/messages/MessagesCa.php
languages/messages/MessagesCdo.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCs.php
languages/messages/MessagesCu.php
languages/messages/MessagesCy.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEs.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrp.php
languages/messages/MessagesFrr.php
languages/messages/MessagesFur.php
languages/messages/MessagesGl.php
languages/messages/MessagesGu.php
languages/messages/MessagesGv.php
languages/messages/MessagesHaw.php
languages/messages/MessagesHe.php
languages/messages/MessagesHi.php
languages/messages/MessagesHr.php
languages/messages/MessagesHsb.php
languages/messages/MessagesHu.php
languages/messages/MessagesInh.php
languages/messages/MessagesIo.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesKa.php
languages/messages/MessagesKhw.php
languages/messages/MessagesKiu.php
languages/messages/MessagesKo.php
languages/messages/MessagesKoi.php
languages/messages/MessagesKsh.php
languages/messages/MessagesKu_latn.php
languages/messages/MessagesKw.php
languages/messages/MessagesLa.php
languages/messages/MessagesLb.php
languages/messages/MessagesLez.php
languages/messages/MessagesLfn.php
languages/messages/MessagesLij.php
languages/messages/MessagesLiv.php
languages/messages/MessagesLmo.php
languages/messages/MessagesLn.php
languages/messages/MessagesLo.php
languages/messages/MessagesLtg.php
languages/messages/MessagesLzz.php
languages/messages/MessagesMg.php
languages/messages/MessagesMhr.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMr.php
languages/messages/MessagesMs.php
languages/messages/MessagesMy.php
languages/messages/MessagesNah.php
languages/messages/MessagesNb.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesNso.php
languages/messages/MessagesOc.php
languages/messages/MessagesOr.php
languages/messages/MessagesPa.php
languages/messages/MessagesPdc.php
languages/messages/MessagesPfl.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPnt.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesQu.php
languages/messages/MessagesQug.php
languages/messages/MessagesRm.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesSd.php
languages/messages/MessagesSe.php
languages/messages/MessagesSi.php
languages/messages/MessagesSl.php
languages/messages/MessagesSo.php
languages/messages/MessagesSv.php
languages/messages/MessagesTet.php
languages/messages/MessagesTh.php
languages/messages/MessagesTl.php
languages/messages/MessagesTo.php
languages/messages/MessagesTr.php
languages/messages/MessagesUk.php
languages/messages/MessagesUz.php
languages/messages/MessagesVec.php
languages/messages/MessagesVi.php
languages/messages/MessagesVot.php
languages/messages/MessagesXmf.php
languages/messages/MessagesYi.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
maintenance/Maintenance.php
maintenance/cleanupUploadStash.php
maintenance/copyFileBackend.php
maintenance/language/messageTypes.inc
maintenance/language/messages.inc
maintenance/mcc.php
maintenance/mctest.php
maintenance/refreshLinks.php
maintenance/runJobs.php
resources/Resources.php
resources/jquery/jquery.client.js
resources/mediawiki.language/mediawiki.language.js
resources/mediawiki.special/mediawiki.special.userLogin.signup.js [new file with mode: 0644]
resources/mediawiki/mediawiki.Uri.js
resources/mediawiki/mediawiki.jqueryMsg.js
skins/vector/print.css [deleted file]
tests/TestsAutoLoader.php
tests/parser/parserTests.txt
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/OutputPageTest.php [new file with mode: 0644]
tests/phpunit/includes/SanitizerTest.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/api/ApiAccountCreationTest.php
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiOptionsTest.php
tests/phpunit/includes/api/ApiParseTest.php
tests/phpunit/includes/api/ApiPurgeTest.php
tests/phpunit/includes/api/ApiQueryRevisionsTest.php
tests/phpunit/includes/api/ApiQueryTest.php
tests/phpunit/includes/api/ApiTest.php
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/ApiWatchTest.php
tests/phpunit/includes/api/format/ApiFormatPhpTest.php
tests/phpunit/includes/content/TextContentTest.php
tests/phpunit/includes/content/WikitextContentTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/libs/CSSJanusTest.php
tests/phpunit/includes/site/MediaWikiSiteTest.php
tests/phpunit/includes/site/SiteArrayTest.php [deleted file]
tests/phpunit/includes/site/SiteListTest.php
tests/phpunit/includes/site/SiteObjectTest.php [deleted file]
tests/phpunit/includes/site/SiteSQLStoreTest.php [new file with mode: 0644]
tests/phpunit/includes/site/SiteTest.php [new file with mode: 0644]
tests/phpunit/includes/site/SitesTest.php [deleted file]
tests/phpunit/includes/site/TestSites.php
tests/phpunit/languages/LanguageTest.php
tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
thumb.php

diff --git a/CREDITS b/CREDITS
index ca5d6d7..a03ad5e 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -120,6 +120,7 @@ following names for their contribution to the product.
 * Daniel Werner
 * David Baumgarten
 * Denny Vrandecic
+* Dévai Tamás
 * Edward Z. Yang
 * Elvis Stansvik
 * Erwin Dokter
index cfa979a..1efd80d 100644 (file)
@@ -83,7 +83,7 @@ production.
   in MW 1.20 (saving preferences using Special:Preferences cleared any
   additional fields) and which has been disabled in 1.20.1 as a part of
   a security fix (bug 42202).
-* Added the ability to limit the wall clock time used by shell processes, 
+* Added the ability to limit the wall clock time used by shell processes,
   as well as the CPU time. Configurable with $wgMaxShellWallClockTime.
 
 === Bug fixes in 1.21 ===
@@ -152,6 +152,8 @@ production.
 * wfMerge() now works if $wgDiff3 contains spaces
 * (bug 43052) mediawiki.action.view.dblClickEdit.dblClickEdit should trigger
   ca-edit click instead opening URL directly.
+* (bug 43964) Invalid value of "link" parameter in <gallery> no longer produces
+  a fatal error.
 
 === API changes in 1.21 ===
 * prop=revisions can now report the contentmodel and contentformat.
@@ -178,6 +180,21 @@ production.
 * BREAKING CHANGE: '??_badcontinue' error code was changed to '??badcontinue'
   for all query modules.
 * ApiQueryBase adds 'badcontinue' error code if module has 'continue' parameter.
+* (bug 35885) Removed version parameter and all getVersion() methods.
+* action=options now takes a "resetkinds" option, which allows only resetting
+  certain types of preferences when the "reset" option is set.
+* (bug 36751) ApiQueryImageInfo now returns imageinfo for the redirect target
+  when queried with &redirects=.
+* (bug 31849) ApiQueryImageInfo no longer gets confused when asked for info on
+  a redirect and its target.
+* (bug 43849) ApiQueryImageInfo no longer throws exceptions with ForeignDBRepo
+  redirects.
+* On error, any warnings generated before that error will be shown in the result.
+
+=== API internal changes in 1.21 ===
+* For debugging only, a new global $wgDebugAPI removes many API restrictions when true.
+  Never use on the production servers, as this flag introduces security holes.
+  Whenever enabled, a warning will also be added to all output.
 
 === Languages updated in 1.21 ===
 
diff --git a/UPGRADE b/UPGRADE
index 5e92806..2c6df98 100644 (file)
--- a/UPGRADE
+++ b/UPGRADE
@@ -39,8 +39,8 @@ Download the files for the new version of the software. These are available
 as a compressed "tar" archive from the Wikimedia Download Service
 (http://download.wikimedia.org/mediawiki).
 
-You can also obtain the new files directly from our Subversion source code
-repository, via a checkout or export operation.
+You can also obtain the new files directly from our Git source code
+repository.
 
 Replace the existing MediaWiki files with the new. You should preserve the
 LocalSettings.php file and the "extensions" and "images" directories.
index 8905d7e..6574c17 100644 (file)
@@ -2199,6 +2199,22 @@ $search: SpecialSearch special page object
 $profile: String: current search profile
 $engine: the search engine
 
+'SpecialSearchResultsPrepend': Called immediately before returning HTML
+on the search results page.  Useful for including an external search
+provider.  To disable the output of MediaWiki search output, return
+false.
+$specialSearch: SpecialSearch object ($this)
+$output: $wgOut
+$term: Search term specified by the user
+
+'SpecialSearchResultsAppend': Called after all search results HTML has
+been output.  Note that in some cases, this hook will not be called (no
+results, too many results, SpecialSearchResultsPrepend returned false,
+etc).
+$specialSearch: SpecialSearch object ($this)
+$output: $wgOut
+$term: Search term specified by the user
+
 'SpecialSearchResults': Called before search result display when there are
 matches.
 $term: string of search term
@@ -2473,6 +2489,7 @@ $user: User object
 'UserGetLanguageObject': Called when getting user's interface language object.
 $user: User object
 &$code: Langauge code that will be used to create the object
+$context: RequestContext object
 
 'UserGetReservedNames': Allows to modify $wgReservedUsernames at run time.
 &$reservedUsernames: $wgReservedUsernames
index 5eb497d..c188975 100644 (file)
@@ -883,11 +883,12 @@ $wgAutoloadLocalClasses = array(
        # includes/site
        'MediaWikiSite' => 'includes/site/MediaWikiSite.php',
        'Site' => 'includes/site/Site.php',
-       'SiteArray' => 'includes/site/SiteArray.php',
+       'SiteObject' => 'includes/site/Site.php',
+       'SiteArray' => 'includes/site/SiteList.php',
        'SiteList' => 'includes/site/SiteList.php',
-       'SiteObject' => 'includes/site/SiteObject.php',
-       'Sites' => 'includes/site/Sites.php',
-       'SitesTable' => 'includes/site/SitesTable.php',
+       'SiteSQLStore' => 'includes/site/SiteSQLStore.php',
+       'Sites' => 'includes/site/SiteSQLStore.php',
+       'SiteStore' => 'includes/site/SiteStore.php',
 
        # includes/specials
        'ActiveUsersPager' => 'includes/specials/SpecialActiveusers.php',
index 03ef906..b81cf3a 100644 (file)
@@ -696,7 +696,7 @@ class Block {
                wfDebug( "Autoblocking {$this->getTarget()}@" . $autoblockIP . "\n" );
                $autoblock->setTarget( $autoblockIP );
                $autoblock->setBlocker( $this->getBlocker() );
-               $autoblock->mReason = wfMessage( 'autoblocker', $this->getTarget(), $this->mReason )->inContentLanguage()->text();
+               $autoblock->mReason = wfMessage( 'autoblocker', $this->getTarget(), $this->mReason )->inContentLanguage()->plain();
                $timestamp = wfTimestampNow();
                $autoblock->mTimestamp = $timestamp;
                $autoblock->mAuto = 1;
@@ -997,9 +997,11 @@ class Block {
         * Purge expired blocks from the ipblocks table
         */
        public static function purgeExpired() {
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->delete( 'ipblocks',
-                       array( 'ipb_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ), __METHOD__ );
+               if ( !wfReadOnly() ) {
+                       $dbw = wfGetDB( DB_MASTER );
+                       $dbw->delete( 'ipblocks',
+                               array( 'ipb_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ), __METHOD__ );
+               }
        }
 
        /**
index b3741f8..7678ffe 100644 (file)
@@ -312,7 +312,10 @@ class CategoryViewer extends ContextSource {
                                ),
                                array(
                                        'categorylinks' => array( 'INNER JOIN', 'cl_from = page_id' ),
-                                       'category' => array( 'LEFT JOIN', 'cat_title = page_title AND page_namespace = ' . NS_CATEGORY )
+                                       'category' => array( 'LEFT JOIN', array(
+                                               'cat_title = page_title',
+                                               'page_namespace' => NS_CATEGORY
+                                       ))
                                )
                        );
 
index c13dbfd..d68d991 100644 (file)
@@ -3217,11 +3217,13 @@ $wgNamespacesWithSubpages = array(
        NS_TALK           => true,
        NS_USER           => true,
        NS_USER_TALK      => true,
+       NS_PROJECT        => true,
        NS_PROJECT_TALK   => true,
        NS_FILE_TALK      => true,
        NS_MEDIAWIKI      => true,
        NS_MEDIAWIKI_TALK => true,
        NS_TEMPLATE_TALK  => true,
+       NS_HELP           => true,
        NS_HELP_TALK      => true,
        NS_CATEGORY_TALK  => true
 );
@@ -5992,6 +5994,22 @@ $wgEnableAPI = true;
  */
 $wgEnableWriteAPI = true;
 
+/**
+ *
+ *     WARNING: SECURITY THREAT - debug use only
+ *
+ * Disables many security checks in the API for debugging purposes.
+ * This flag should never be used on the production servers, as it introduces
+ * a number of potential security holes. Even when enabled, the validation
+ * will still be performed, but instead of failing, API will return a warning.
+ * Also, there will always be a warning notifying that this flag is set.
+ * At this point, the flag allows GET requests to go through for modules
+ * requiring POST.
+ *
+ * @since 1.21
+ */
+$wgDebugAPI = false;
+
 /**
  * API module extensions.
  * Associative array mapping module name to class name.
index f3c0237..ce8077d 100644 (file)
@@ -577,13 +577,15 @@ class EditPage {
        }
 
        /**
-        * Does this EditPage class support section editing?
-        * This is used by EditPage subclasses to indicate their ui cannot handle section edits
+        * Returns whether section editing is supported for the current page.
+        * Subclasses may override this to replace the default behavior, which is
+        * to check ContentHandler::supportsSections.
         *
-        * @return bool
+        * @return bool true if this edit page supports sections, false otherwise.
         */
        protected function isSectionEditSupported() {
-               return true;
+               $contentHandler = ContentHandler::getForTitle( $this->mTitle );
+               return $contentHandler->supportsSections();
        }
 
        /**
@@ -597,6 +599,11 @@ class EditPage {
 
                # Section edit can come from either the form or a link
                $this->section = $request->getVal( 'wpSection', $request->getVal( 'section' ) );
+
+               if ( $this->section !== null && $this->section !== '' && !$this->isSectionEditSupported() ) {
+                       throw new ErrorPageError( 'sectioneditnotsupported-title', 'sectioneditnotsupported-text' );
+               }
+
                $this->isNew = !$this->mTitle->exists() || $this->section == 'new';
 
                if ( $request->wasPosted() ) {
@@ -617,8 +624,11 @@ class EditPage {
                                wfProfileOut( get_class( $this ) . "::importContentFormData" );
                        }
 
+                       # Trim spaces on user supplied text
+                       $summary = trim( $request->getText( 'wpSummary' ) );
+
                        # Truncate for whole multibyte characters
-                       $this->summary = $wgContLang->truncate( $request->getText( 'wpSummary' ), 255 );
+                       $this->summary = $wgContLang->truncate( $summary, 255 );
 
                        # If the summary consists of a heading, e.g. '==Foobar==', extract the title from the
                        # header syntax, e.g. 'Foobar'. This is mainly an issue when we are using wpSummary for
index 0b1bd19..2292e31 100644 (file)
@@ -1235,11 +1235,15 @@ function wfLogProfilingData() {
  *
  * @param $key String
  * @param $count Int
+ * @return void
  */
 function wfIncrStats( $key, $count = 1 ) {
        global $wgStatsMethod;
 
        $count = intval( $count );
+       if ( $count == 0 ) {
+               return;
+       }
 
        if( $wgStatsMethod == 'udp' ) {
                global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgAggregateStatsID;
@@ -2437,7 +2441,7 @@ define( 'TS_ISO_8601_BASIC', 9 );
  * @param $outputtype Mixed: A timestamp in one of the supported formats, the
  *                    function will autodetect which format is supplied and act
  *                    accordingly.
- * @param $ts Mixed: the timestamp to convert or 0 for the current timestamp
+ * @param $ts Mixed: optional timestamp to convert, default 0 for the current time
  * @return Mixed: String / false The same date in the format specified in $outputtype or false
  */
 function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) {
index ab27a74..b1092df 100644 (file)
@@ -328,10 +328,13 @@ class MWHttpRequest {
        public function proxySetup() {
                global $wgHTTPProxy;
 
-               if ( $this->proxy || !$this->noProxy ) {
+               // If there is an explicit proxy set and proxies are not disabled, then use it
+               if ( $this->proxy && !$this->noProxy ) {
                        return;
                }
 
+               // Otherwise, fallback to $wgHTTPProxy/http_proxy (when set) if this is not a machine
+               // local URL and proxies are not disabled
                if ( Http::isLocalURL( $this->url ) || $this->noProxy ) {
                        $this->proxy = '';
                } elseif ( $wgHTTPProxy ) {
index c93f38c..4965054 100644 (file)
@@ -327,7 +327,8 @@ class ImagePage extends Article {
                        $height_orig = $this->displayImg->getHeight( $page );
                        $height = $height_orig;
 
-                       $longDesc = wfMessage( 'parentheses', $this->displayImg->getLongDesc() )->text();
+                       $filename = wfEscapeWikiText( $this->displayImg->getName() );
+                       $linktext = $filename;
 
                        wfRunHooks( 'ImageOpenShowImageInlineBefore', array( &$this, &$out ) );
 
@@ -351,7 +352,7 @@ class ImagePage extends Article {
                                                # Note that $height <= $maxHeight now, but might not be identical
                                                # because of rounding.
                                        }
-                                       $msgbig = wfMessage( 'show-big-image' )->escaped();
+                                       $linktext = wfMessage( 'show-big-image' )->escaped();
                                        if ( $this->displayImg->getRepo()->canTransformVia404() ) {
                                                $thumbSizes = $wgImageLimits;
                                        } else {
@@ -397,7 +398,6 @@ class ImagePage extends Article {
                                $params['height'] = $height;
                                $thumbnail = $this->displayImg->transform( $params );
 
-                               $showLink = true;
                                $anchorclose = Html::rawElement( 'div', array( 'class' => 'mw-filepage-resolutioninfo' ), $msgsmall );
 
                                $isMulti = $this->displayImg->isMultipage() && $this->displayImg->pageCount() > 1;
@@ -471,48 +471,39 @@ class ImagePage extends Article {
                                                "<hr />$thumb1\n$thumb2<br style=\"clear: both\" /></div></td></tr></table>"
                                        );
                                }
-                       } else {
+                       } elseif ( $this->displayImg->isSafeFile() ) {
                                # if direct link is allowed but it's not a renderable image, show an icon.
-                               if ( $this->displayImg->isSafeFile() ) {
-                                       $icon = $this->displayImg->iconThumb();
-
-                                       $out->addHTML( '<div class="fullImageLink" id="file">' .
-                                               $icon->toHtml( array( 'file-link' => true ) ) .
-                                               "</div>\n" );
-                               }
+                               $icon = $this->displayImg->iconThumb();
 
-                               $showLink = true;
+                               $out->addHTML( '<div class="fullImageLink" id="file">' .
+                                       $icon->toHtml( array( 'file-link' => true ) ) .
+                                       "</div>\n" );
                        }
 
-                       if ( $showLink ) {
-                               $filename = wfEscapeWikiText( $this->displayImg->getName() );
-                               $linktext = $filename;
-                               if ( isset( $msgbig ) ) {
-                                       $linktext = wfEscapeWikiText( $msgbig );
-                               }
-                               $medialink = "[[Media:$filename|$linktext]]";
-
-                               if ( !$this->displayImg->isSafeFile() ) {
-                                       $warning = wfMessage( 'mediawarning' )->plain();
-                                       // dirmark is needed here to separate the file name, which
-                                       // most likely ends in Latin characters, from the description,
-                                       // which may begin with the file type. In RTL environment
-                                       // this will get messy.
-                                       // The dirmark, however, must not be immediately adjacent
-                                       // to the filename, because it can get copied with it.
-                                       // See bug 25277.
-                                       $out->addWikiText( <<<EOT
+                       $longDesc = wfMessage( 'parentheses', $this->displayImg->getLongDesc() )->text();
+
+                       $medialink = "[[Media:$filename|$linktext]]";
+
+                       if ( !$this->displayImg->isSafeFile() ) {
+                               $warning = wfMessage( 'mediawarning' )->plain();
+                               // dirmark is needed here to separate the file name, which
+                               // most likely ends in Latin characters, from the description,
+                               // which may begin with the file type. In RTL environment
+                               // this will get messy.
+                               // The dirmark, however, must not be immediately adjacent
+                               // to the filename, because it can get copied with it.
+                               // See bug 25277.
+                               $out->addWikiText( <<<EOT
 <div class="fullMedia"><span class="dangerousLink">{$medialink}</span> $dirmark<span class="fileInfo">$longDesc</span></div>
 <div class="mediaWarning">$warning</div>
 EOT
-                                               );
-                               } else {
-                                       $out->addWikiText( <<<EOT
+                                       );
+                       } else {
+                               $out->addWikiText( <<<EOT
 <div class="fullMedia">{$medialink} {$dirmark}<span class="fileInfo">$longDesc</span>
 </div>
 EOT
-                                       );
-                               }
+                               );
                        }
 
                        // Add cannot animate thumbnail warning
index 2f6ee22..bc0bb77 100644 (file)
@@ -1038,9 +1038,11 @@ class Linker {
         * @param $escape Boolean: do we escape the link text?
         * @param $linktype String: type of external link. Gets added to the classes
         * @param $attribs Array of extra attributes to <a>
+        * @param $title Title|null Title object used for title specific link attributes
         * @return string
         */
-       public static function makeExternalLink( $url, $text, $escape = true, $linktype = '', $attribs = array() ) {
+       public static function makeExternalLink( $url, $text, $escape = true, $linktype = '', $attribs = array(), $title = null ) {
+               global $wgTitle;
                $class = "external";
                if ( $linktype ) {
                        $class .= " $linktype";
@@ -1053,6 +1055,11 @@ class Linker {
                if ( $escape ) {
                        $text = htmlspecialchars( $text );
                }
+
+               if ( !$title ) {
+                       $title = $wgTitle;
+               }
+               $attribs['rel'] = Parser::getExternalLinkRel( $url, $title );
                $link = '';
                $success = wfRunHooks( 'LinkerMakeExternalLink',
                        array( &$url, &$text, &$link, &$attribs, $linktype ) );
index 09561bd..6322be7 100644 (file)
@@ -80,42 +80,45 @@ class MessageBlobStore {
                        return false;
                }
 
-               $dbw = wfGetDB( DB_MASTER );
-               $success = $dbw->insert( 'msg_resource', array(
-                               'mr_lang' => $lang,
-                               'mr_resource' => $name,
-                               'mr_blob' => $blob,
-                               'mr_timestamp' => $dbw->timestamp()
-                       ),
-                       __METHOD__,
-                       array( 'IGNORE' )
-               );
-
-               if ( $success ) {
-                       if ( $dbw->affectedRows() == 0 ) {
-                               // Blob was already present, fetch it
-                               $blob = $dbw->selectField( 'msg_resource', 'mr_blob', array(
-                                               'mr_resource' => $name,
-                                               'mr_lang' => $lang,
-                                       ),
-                                       __METHOD__
-                               );
-                       } else {
-                               // Update msg_resource_links
-                               $rows = array();
+               try {
+                       $dbw = wfGetDB( DB_MASTER );
+                       $success = $dbw->insert( 'msg_resource', array(
+                                       'mr_lang' => $lang,
+                                       'mr_resource' => $name,
+                                       'mr_blob' => $blob,
+                                       'mr_timestamp' => $dbw->timestamp()
+                               ),
+                               __METHOD__,
+                               array( 'IGNORE' )
+                       );
 
-                               foreach ( $module->getMessages() as $key ) {
-                                       $rows[] = array(
-                                               'mrl_resource' => $name,
-                                               'mrl_message' => $key
+                       if ( $success ) {
+                               if ( $dbw->affectedRows() == 0 ) {
+                                       // Blob was already present, fetch it
+                                       $blob = $dbw->selectField( 'msg_resource', 'mr_blob', array(
+                                                       'mr_resource' => $name,
+                                                       'mr_lang' => $lang,
+                                               ),
+                                               __METHOD__
+                                       );
+                               } else {
+                                       // Update msg_resource_links
+                                       $rows = array();
+
+                                       foreach ( $module->getMessages() as $key ) {
+                                               $rows[] = array(
+                                                       'mrl_resource' => $name,
+                                                       'mrl_message' => $key
+                                               );
+                                       }
+                                       $dbw->insert( 'msg_resource_links', $rows,
+                                               __METHOD__, array( 'IGNORE' )
                                        );
                                }
-                               $dbw->insert( 'msg_resource_links', $rows,
-                                       __METHOD__, array( 'IGNORE' )
-                               );
                        }
+               } catch ( Exception $e ) {
+                       wfDebug( __METHOD__ . " failed to update DB: $e\n" );
                }
-
                return $blob;
        }
 
@@ -141,48 +144,51 @@ class MessageBlobStore {
                $oldBlob = $row->mr_blob;
                $newBlob = self::generateMessageBlob( $module, $lang );
 
-               $newRow = array(
-                       'mr_resource' => $name,
-                       'mr_lang' => $lang,
-                       'mr_blob' => $newBlob,
-                       'mr_timestamp' => $dbw->timestamp()
-               );
+               try {
+                       $newRow = array(
+                               'mr_resource' => $name,
+                               'mr_lang' => $lang,
+                               'mr_blob' => $newBlob,
+                               'mr_timestamp' => $dbw->timestamp()
+                       );
 
-               $dbw->replace( 'msg_resource',
-                       array( array( 'mr_resource', 'mr_lang' ) ),
-                       $newRow, __METHOD__
-               );
+                       $dbw->replace( 'msg_resource',
+                               array( array( 'mr_resource', 'mr_lang' ) ),
+                               $newRow, __METHOD__
+                       );
 
-               // Figure out which messages were added and removed
-               $oldMessages = array_keys( FormatJson::decode( $oldBlob, true ) );
-               $newMessages = array_keys( FormatJson::decode( $newBlob, true ) );
-               $added = array_diff( $newMessages, $oldMessages );
-               $removed = array_diff( $oldMessages, $newMessages );
+                       // Figure out which messages were added and removed
+                       $oldMessages = array_keys( FormatJson::decode( $oldBlob, true ) );
+                       $newMessages = array_keys( FormatJson::decode( $newBlob, true ) );
+                       $added = array_diff( $newMessages, $oldMessages );
+                       $removed = array_diff( $oldMessages, $newMessages );
 
-               // Delete removed messages, insert added ones
-               if ( $removed ) {
-                       $dbw->delete( 'msg_resource_links', array(
-                                       'mrl_resource' => $name,
-                                       'mrl_message' => $removed
-                               ), __METHOD__
-                       );
-               }
+                       // Delete removed messages, insert added ones
+                       if ( $removed ) {
+                               $dbw->delete( 'msg_resource_links', array(
+                                               'mrl_resource' => $name,
+                                               'mrl_message' => $removed
+                                       ), __METHOD__
+                               );
+                       }
 
-               $newLinksRows = array();
+                       $newLinksRows = array();
 
-               foreach ( $added as $message ) {
-                       $newLinksRows[] = array(
-                               'mrl_resource' => $name,
-                               'mrl_message' => $message
-                       );
-               }
+                       foreach ( $added as $message ) {
+                               $newLinksRows[] = array(
+                                       'mrl_resource' => $name,
+                                       'mrl_message' => $message
+                               );
+                       }
 
-               if ( $newLinksRows ) {
-                       $dbw->insert( 'msg_resource_links', $newLinksRows, __METHOD__,
-                                array( 'IGNORE' ) // just in case
-                       );
+                       if ( $newLinksRows ) {
+                               $dbw->insert( 'msg_resource_links', $newLinksRows, __METHOD__,
+                                       array( 'IGNORE' ) // just in case
+                               );
+                       }
+               } catch ( Exception $e ) {
+                       wfDebug( __METHOD__ . " failed to update DB: $e\n" );
                }
-
                return $newBlob;
        }
 
@@ -192,50 +198,58 @@ class MessageBlobStore {
         * @param $key String: message key
         */
        public static function updateMessage( $key ) {
-               $dbw = wfGetDB( DB_MASTER );
-
-               // Keep running until the updates queue is empty.
-               // Due to update conflicts, the queue might not be emptied
-               // in one iteration.
-               $updates = null;
-               do {
-                       $updates = self::getUpdatesForMessage( $key, $updates );
-
-                       foreach ( $updates as $k => $update ) {
-                               // Update the row on the condition that it
-                               // didn't change since we fetched it by putting
-                               // the timestamp in the WHERE clause.
-                               $success = $dbw->update( 'msg_resource',
-                                       array(
-                                               'mr_blob' => $update['newBlob'],
-                                               'mr_timestamp' => $dbw->timestamp() ),
-                                       array(
-                                               'mr_resource' => $update['resource'],
-                                               'mr_lang' => $update['lang'],
-                                               'mr_timestamp' => $update['timestamp'] ),
-                                       __METHOD__
-                               );
+               try {
+                       $dbw = wfGetDB( DB_MASTER );
+
+                       // Keep running until the updates queue is empty.
+                       // Due to update conflicts, the queue might not be emptied
+                       // in one iteration.
+                       $updates = null;
+                       do {
+                               $updates = self::getUpdatesForMessage( $key, $updates );
+
+                               foreach ( $updates as $k => $update ) {
+                                       // Update the row on the condition that it
+                                       // didn't change since we fetched it by putting
+                                       // the timestamp in the WHERE clause.
+                                       $success = $dbw->update( 'msg_resource',
+                                               array(
+                                                       'mr_blob' => $update['newBlob'],
+                                                       'mr_timestamp' => $dbw->timestamp() ),
+                                               array(
+                                                       'mr_resource' => $update['resource'],
+                                                       'mr_lang' => $update['lang'],
+                                                       'mr_timestamp' => $update['timestamp'] ),
+                                               __METHOD__
+                                       );
 
-                               // Only requeue conflicted updates.
-                               // If update() returned false, don't retry, for
-                               // fear of getting into an infinite loop
-                               if ( !( $success && $dbw->affectedRows() == 0 ) ) {
-                                       // Not conflicted
-                                       unset( $updates[$k] );
+                                       // Only requeue conflicted updates.
+                                       // If update() returned false, don't retry, for
+                                       // fear of getting into an infinite loop
+                                       if ( !( $success && $dbw->affectedRows() == 0 ) ) {
+                                               // Not conflicted
+                                               unset( $updates[$k] );
+                                       }
                                }
-                       }
-               } while ( count( $updates ) );
+                       } while ( count( $updates ) );
 
-               // No need to update msg_resource_links because we didn't add
-               // or remove any messages, we just changed their contents.
+                       // No need to update msg_resource_links because we didn't add
+                       // or remove any messages, we just changed their contents.
+               } catch ( Exception $e ) {
+                       wfDebug( __METHOD__ . " failed to update DB: $e\n" );
+               }
        }
 
        public static function clear() {
                // TODO: Give this some more thought
                // TODO: Is TRUNCATE better?
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->delete( 'msg_resource', '*', __METHOD__ );
-               $dbw->delete( 'msg_resource_links', '*', __METHOD__ );
+               try {
+                       $dbw = wfGetDB( DB_MASTER );
+                       $dbw->delete( 'msg_resource', '*', __METHOD__ );
+                       $dbw->delete( 'msg_resource_links', '*', __METHOD__ );
+               } catch ( Exception $e ) {
+                       wfDebug( __METHOD__ . " failed to update DB: $e\n" );
+               }
        }
 
        /**
index 436e2f9..5b0f36c 100644 (file)
@@ -1435,6 +1435,9 @@ class OutputPage extends ContextSource {
         */
        public function addWikiText( $text, $linestart = true, $interface = true ) {
                $title = $this->getTitle(); // Work arround E_STRICT
+               if ( !$title ) {
+                       throw new MWException( 'Title is null' );
+               }
                $this->addWikiTextTitle( $text, $title, $linestart, /*tidy*/false, $interface );
        }
 
@@ -3512,11 +3515,15 @@ $templates
         * Transform "media" attribute based on request parameters
         *
         * @param $media String: current value of the "media" attribute
-        * @return String: modified value of the "media" attribute
+        * @return String: modified value of the "media" attribute, or null to skip
+        * this stylesheet
         */
        public static function transformCssMedia( $media ) {
                global $wgRequest, $wgHandheldForIPhone;
 
+               // http://www.w3.org/TR/css3-mediaqueries/#syntax
+               $screenMediaQueryRegex = '/^(?:only\s+)?screen\b/i';
+
                // Switch in on-screen display for media testing
                $switches = array(
                        'printable' => 'print',
@@ -3526,8 +3533,20 @@ $templates
                        if( $wgRequest->getBool( $switch ) ) {
                                if( $media == $targetMedia ) {
                                        $media = '';
-                               } elseif( $media == 'screen' ) {
-                                       return null;
+                               } elseif( preg_match( $screenMediaQueryRegex, $media ) === 1 ) {
+                                       // This regex will not attempt to understand a comma-separated media_query_list
+                                       //
+                                       // Example supported values for $media: 'screen', 'only screen', 'screen and (min-width: 982px)' ),
+                                       // Example NOT supported value for $media: '3d-glasses, screen, print and resolution > 90dpi'
+                                       //
+                                       // If it's a print request, we never want any kind of screen styesheets
+                                       // If it's a handheld request (currently the only other choice with a switch),
+                                       // we don't want simple 'screen' but we might want screen queries that
+                                       // have a max-width or something, so we'll pass all others on and let the
+                                       // client do the query.
+                                       if( $targetMedia == 'print' || $media == 'screen' ) {
+                                               return null;
+                                       }
                                }
                        }
                }
index 87fa428..56df21e 100644 (file)
@@ -235,6 +235,9 @@ class RecentChange {
                        unset( $this->mAttribs['rc_ip'] );
                }
 
+               # Trim spaces on user supplied text
+               $this->mAttribs['rc_comment'] = trim( $this->mAttribs['rc_comment'] );
+
                # Make sure summary is truncated (whole multibyte characters)
                $this->mAttribs['rc_comment'] = $wgContLang->truncate( $this->mAttribs['rc_comment'], 255 );
 
index f6c8245..2bf2507 100644 (file)
@@ -359,6 +359,7 @@ if ( $wgNewUserLog ) {
        $wgLogActionsHandlers['newusers/newusers'] = 'NewUsersLogFormatter';
        $wgLogActionsHandlers['newusers/create'] = 'NewUsersLogFormatter';
        $wgLogActionsHandlers['newusers/create2'] = 'NewUsersLogFormatter';
+       $wgLogActionsHandlers['newusers/byemail'] = 'NewUsersLogFormatter';
        $wgLogActionsHandlers['newusers/autocreate'] = 'NewUsersLogFormatter';
 }
 
index 58d443a..611223e 100644 (file)
@@ -1008,6 +1008,12 @@ class SkinTemplate extends Skin {
                                        // Gets preferred variant (note that user preference is
                                        // only possible for wiki content language variant)
                                        $preferred = $pageLang->getPreferredVariant();
+                                       if ( Action::getActionName( $this ) === 'view' ) {
+                                               $params = $request->getQueryValues();
+                                               unset( $params['title'] );
+                                       } else {
+                                               $params = array();
+                                       }
                                        // Loops over each variant
                                        foreach( $variants as $code ) {
                                                // Gets variant name from language code
@@ -1021,7 +1027,7 @@ class SkinTemplate extends Skin {
                                                $content_navigation['variants'][] = array(
                                                        'class' => ( $code == $preferred ) ? 'selected' : false,
                                                        'text' => $varname,
-                                                       'href' => $title->getLocalURL( array( 'variant' => $code ) ),
+                                                       'href' => $title->getLocalURL( array( 'variant' => $code ) + $params ),
                                                        'lang' => $code,
                                                        'hreflang' => $code
                                                );
index 4a45b44..5e5d1fc 100644 (file)
@@ -119,7 +119,7 @@ class SpecialPageFactory {
                'Upload'                    => 'SpecialUpload',
                'UploadStash'               => 'SpecialUploadStash',
 
-               // Wiki data and tools
+               // Data and tools
                'Statistics'                => 'SpecialStatistics',
                'Allmessages'               => 'SpecialAllmessages',
                'Version'                   => 'SpecialVersion',
index e02396b..442bc22 100644 (file)
@@ -689,7 +689,7 @@ class Title {
                }
 
                if( !$this->mContentModel ) {
-                       throw new MWException( "failed to determin content model!" );
+                       throw new MWException( 'Failed to determine content model!' );
                }
 
                return $this->mContentModel;
@@ -1838,10 +1838,9 @@ class Title {
         * @return Array list of errors
         */
        private function checkSpecialsAndNSPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
-               # Only 'createaccount' and 'execute' can be performed on
-               # special pages, which don't actually exist in the DB.
-               $specialOKActions = array( 'createaccount', 'execute' );
-               if ( NS_SPECIAL == $this->mNamespace && !in_array( $action, $specialOKActions ) ) {
+               # Only 'createaccount' can be performed on special pages,
+               # which don't actually exist in the DB.
+               if ( NS_SPECIAL == $this->mNamespace && $action !== 'createaccount' ) {
                        $errors[] = array( 'ns-specialprotected' );
                }
 
@@ -3504,9 +3503,11 @@ class Title {
                if ( !$wgContentHandlerUseDB &&
                                $this->getContentModel() !== $nt->getContentModel() ) {
                        // can't move a page if that would change the page's content model
-                       $errors[] = array( 'bad-target-model',
-                                                       ContentHandler::getLocalizedName( $this->getContentModel() ),
-                                                       ContentHandler::getLocalizedName( $nt->getContentModel() ) );
+                       $errors[] = array(
+                               'bad-target-model',
+                               ContentHandler::getLocalizedName( $this->getContentModel() ),
+                               ContentHandler::getLocalizedName( $nt->getContentModel() )
+                       );
                }
 
                // Image-specific checks
index 21f8dd0..86fb8f8 100644 (file)
@@ -1467,7 +1467,7 @@ class User {
        public function pingLimiter( $action = 'edit' ) {
                # Call the 'PingLimiter' hook
                $result = false;
-               if( !wfRunHooks( 'PingLimiter', array( &$this, $action, $result ) ) ) {
+               if( !wfRunHooks( 'PingLimiter', array( &$this, $action, &$result ) ) ) {
                        return $result;
                }
 
@@ -2310,10 +2310,10 @@ class User {
        }
 
        /**
-        * Return an associative array mapping preferences keys to the kind of a preference they're
-        * used for. Different kinds are handled differently when setting or reading preferences.
+        * Return a list of the types of user options currently returned by
+        * User::getOptionKinds().
         *
-        * Currently, the kind is one of:
+        * Currently, the option kinds are:
         * - 'registered' - preferences which are registered in core MediaWiki or
         *                  by extensions using the UserGetDefaultOptions hook.
         * - 'registered-multiselect' - as above, using the 'multiselect' type.
@@ -2322,6 +2322,29 @@ class User {
         * - 'unused' - preferences about which MediaWiki doesn't know anything.
         *              These are usually legacy options, removed in newer versions.
         *
+        * The API (and possibly others) use this function to determine the possible
+        * option types for validation purposes, so make sure to update this when a
+        * new option kind is added.
+        *
+        * @see User::getOptionKinds
+        * @return array Option kinds
+        */
+       public static function listOptionKinds() {
+               return array(
+                       'registered',
+                       'registered-multiselect',
+                       'userjs',
+                       'unused'
+               );
+       }
+
+       /**
+        * Return an associative array mapping preferences keys to the kind of a preference they're
+        * used for. Different kinds are handled differently when setting or reading preferences.
+        *
+        * See User::listOptionKinds for the list of valid option types that can be provided.
+        *
+        * @see User::listOptionKinds
         * @param $context IContextSource
         * @param $options array assoc. array with options keys to check as keys. Defaults to $this->mOptions.
         * @return array the key => kind mapping data
@@ -2401,6 +2424,7 @@ class User {
                        }
 
                        $optionKinds = $this->getOptionKinds( $context );
+                       $resetKinds = array_intersect( $resetKinds, self::listOptionKinds() );
                        $newOptions = array();
 
                        // Use default values for the options that should be deleted, and
@@ -4193,54 +4217,73 @@ class User {
        }
 
        /**
-        * Add a newuser log entry for this user. Before 1.19 the return value was always true.
+        * Add a newuser log entry for this user.
+        * Before 1.19 the return value was always true.
+        *
+        * @param $action string|bool: account creation type.
+        *   - String, one of the following values:
+        *     - 'create' for an anonymous user creating an account for himself.
+        *       This will force the action's performer to be the created user itself,
+        *       no matter the value of $wgUser
+        *     - 'create2' for a logged in user creating an account for someone else
+        *     - 'byemail' when the created user will receive its password by e-mail
+        *   - Boolean means whether the account was created by e-mail (deprecated):
+        *     - true will be converted to 'byemail'
+        *     - false will be converted to 'create' if this object is the same as
+        *       $wgUser and to 'create2' otherwise
         *
-        * @param $byEmail Boolean: account made by email?
         * @param $reason String: user supplied reason
         *
         * @return int|bool True if not $wgNewUserLog; otherwise ID of log item or 0 on failure
         */
-       public function addNewUserLogEntry( $byEmail = false, $reason = '' ) {
+       public function addNewUserLogEntry( $action = false, $reason = '' ) {
                global $wgUser, $wgContLang, $wgNewUserLog;
                if( empty( $wgNewUserLog ) ) {
                        return true; // disabled
                }
 
-               if( $this->getName() == $wgUser->getName() ) {
-                       $action = 'create';
-               } else {
-                       $action = 'create2';
-                       if ( $byEmail ) {
-                               if ( $reason === '' ) {
-                                       $reason = wfMessage( 'newuserlog-byemail' )->inContentLanguage()->text();
-                               } else {
-                                       $reason = $wgContLang->commaList( array(
-                                               $reason, wfMessage( 'newuserlog-byemail' )->inContentLanguage()->text() ) );
-                               }
+               if ( $action === true ) {
+                       $action = 'byemail';
+               } elseif ( $action === false ) {
+                       if ( $this->getName() == $wgUser->getName() ) {
+                               $action = 'create';
+                       } else {
+                               $action = 'create2';
                        }
                }
-               $log = new LogPage( 'newusers' );
-               return (int)$log->addEntry(
-                       $action,
-                       $this->getUserPage(),
-                       $reason,
-                       array( $this->getId() )
-               );
+
+               if ( $action === 'create' || $action === 'autocreate' ) {
+                       $performer = $this;
+               } else {
+                       $performer = $wgUser;
+               }
+
+               $logEntry = new ManualLogEntry( 'newusers', $action );
+               $logEntry->setPerformer( $performer );
+               $logEntry->setTarget( $this->getUserPage() );
+               $logEntry->setComment( $reason );
+               $logEntry->setParameters( array(
+                       '4::userid' => $this->getId(),
+               ) );
+               $logid = $logEntry->insert();
+
+               if ( $action !== 'autocreate' ) {
+                       $logEntry->publish( $logid );
+               }
+
+               return (int)$logid;
        }
 
        /**
         * Add an autocreate newuser log entry for this user
         * Used by things like CentralAuth and perhaps other authplugins.
+        * Consider calling addNewUserLogEntry() directly instead.
         *
         * @return bool
         */
        public function addNewUserLogEntryAutoCreate() {
-               global $wgNewUserLog;
-               if( !$wgNewUserLog ) {
-                       return true; // disabled
-               }
-               $log = new LogPage( 'newusers', false );
-               $log->addEntry( 'autocreate', $this->getUserPage(), '', array( $this->getId() ), $this );
+               $this->addNewUserLogEntry( 'autocreate' );
+
                return true;
        }
 
index fc1cdb5..68d22a8 100644 (file)
@@ -1314,6 +1314,10 @@ class FauxRequest extends WebRequest {
                return $this->wasPosted;
        }
 
+       public function getCookie( $key, $prefix = null, $default = null ) {
+               return $default;
+       }
+
        public function checkSessionCookie() {
                return false;
        }
index 70ed7e7..e2cd5d9 100644 (file)
@@ -2792,6 +2792,9 @@ class WikiPage extends Page implements IDBAccessObject {
                        $summary = wfMsgReplaceArgs( $summary, $args );
                }
 
+               // Trim spaces on user supplied text
+               $summary = trim( $summary );
+
                // Truncate for whole multibyte characters.
                $summary = $wgContLang->truncate( $summary, 255 );
 
index 43a03db..051fa42 100644 (file)
@@ -154,7 +154,7 @@ class HistoryAction extends FormlessAction {
                 * Option to show only revisions that have been (partially) hidden via RevisionDelete
                 */
                if ( $request->getBool( 'deleted' ) ) {
-                       $conds = array( "rev_deleted != '0'" );
+                       $conds = array( 'rev_deleted != 0' );
                } else {
                        $conds = array();
                }
index 642515b..1cca95c 100644 (file)
@@ -172,7 +172,7 @@ class InfoAction extends FormlessAction {
                $title = $this->getTitle();
                $id = $title->getArticleID();
 
-               $memcKey = wfMemcKey( 'infoaction', $title->getPrefixedText(), $this->page->getLatest() );
+               $memcKey = wfMemcKey( 'infoaction', sha1( $title->getPrefixedText() ), $this->page->getLatest() );
                $pageCounts = $wgMemc->get( $memcKey );
                if ( $pageCounts === false ) {
                        // Get page information that would be too "expensive" to retrieve by normal means
@@ -386,6 +386,22 @@ class InfoAction extends FormlessAction {
                $pageInfo['header-edits'] = array();
 
                $firstRev = $this->page->getOldestRevision();
+               $lastRev = $this->page->getRevision();
+               $batch = new LinkBatch;
+
+               $firstRevUser = $firstRev->getUserText( Revision::FOR_THIS_USER );
+               if ( $firstRevUser !== '' ) {
+                       $batch->add( NS_USER, $firstRevUser );
+                       $batch->add( NS_USER_TALK, $firstRevUser );
+               }
+
+               $lastRevUser = $lastRev->getUserText( Revision::FOR_THIS_USER );
+               if ( $lastRevUser !== '' ) {
+                       $batch->add( NS_USER, $lastRevUser );
+                       $batch->add( NS_USER_TALK, $lastRevUser );
+               }
+
+               $batch->execute();
 
                // Page creator
                $pageInfo['header-edits'][] = array(
@@ -407,7 +423,7 @@ class InfoAction extends FormlessAction {
                // Latest editor
                $pageInfo['header-edits'][] = array(
                        $this->msg( 'pageinfo-lastuser' ),
-                       Linker::revUserTools( $this->page->getRevision() )
+                       Linker::revUserTools( $lastRev )
                );
 
                // Date of latest edit
@@ -601,8 +617,8 @@ class InfoAction extends FormlessAction {
                        'revision',
                        'COUNT(rev_page)',
                        array(
-                               'rev_page' => $id ,
-                               "rev_timestamp >= $threshold"
+                               'rev_page' => $id,
+                               "rev_timestamp >= " . $dbr->addQuotes( $threshold )
                        ),
                        __METHOD__
                );
@@ -614,7 +630,7 @@ class InfoAction extends FormlessAction {
                        'COUNT(DISTINCT rev_user_text)',
                        array(
                                'rev_page' => $id,
-                               "rev_timestamp >= $threshold"
+                               "rev_timestamp >= " . $dbr->addQuotes( $threshold )
                        ),
                        __METHOD__
                );
index dd685f4..78525e0 100644 (file)
@@ -112,8 +112,12 @@ abstract class ApiBase extends ContextSource {
         * Typically includes the class name, the svn revision, timestamp, and
         * last author. Usually done with SVN's Id keyword
         * @return string
+        * @deprecated since 1.21, version string is no longer supported
         */
-       public abstract function getVersion();
+       public function getVersion() {
+               wfDeprecated( __METHOD__, '1.21' );
+               return '';
+       }
 
        /**
         * Get the name of the module being executed by this instance
@@ -299,23 +303,6 @@ abstract class ApiBase extends ContextSource {
                        }
 
                        $msg .= $this->makeHelpArrayToString( $lnPrfx, "Help page", $this->getHelpUrls() );
-
-                       if ( $this->getMain()->getShowVersions() ) {
-                               $versions = $this->getVersion();
-                               $pattern = '/(\$.*) ([0-9a-z_]+\.php) (.*\$)/i';
-                               $callback = array( $this, 'makeHelpMsg_callback' );
-
-                               if ( is_array( $versions ) ) {
-                                       foreach ( $versions as &$v ) {
-                                               $v = preg_replace_callback( $pattern, $callback, $v );
-                                       }
-                                       $versions = implode( "\n  ", $versions );
-                               } else {
-                                       $versions = preg_replace_callback( $pattern, $callback, $versions );
-                               }
-
-                               $msg .= "Version:\n  $versions\n";
-                       }
                }
 
                return $msg;
@@ -488,44 +475,6 @@ abstract class ApiBase extends ContextSource {
                }
        }
 
-       /**
-        * Callback for preg_replace_callback() call in makeHelpMsg().
-        * Replaces a source file name with a link to ViewVC
-        *
-        * @param $matches array
-        * @return string
-        */
-       public function makeHelpMsg_callback( $matches ) {
-               global $wgAutoloadClasses, $wgAutoloadLocalClasses;
-
-               $file = '';
-               if ( isset( $wgAutoloadLocalClasses[get_class( $this )] ) ) {
-                       $file = $wgAutoloadLocalClasses[get_class( $this )];
-               } elseif ( isset( $wgAutoloadClasses[get_class( $this )] ) ) {
-                       $file = $wgAutoloadClasses[get_class( $this )];
-               }
-
-               // Do some guesswork here
-               $path = strstr( $file, 'includes/api/' );
-               if ( $path === false ) {
-                       $path = strstr( $file, 'extensions/' );
-               } else {
-                       $path = 'phase3/' . $path;
-               }
-
-               // Get the filename from $matches[2] instead of $file
-               // If they're not the same file, they're assumed to be in the
-               // same directory
-               // This is necessary to make stuff like ApiMain::getVersion()
-               // returning the version string for ApiBase work
-               if ( $path ) {
-                       return "{$matches[0]}\n   https://svn.wikimedia.org/" .
-                                       "viewvc/mediawiki/trunk/" . dirname( $path ) .
-                                       "/{$matches[2]}";
-               }
-               return $matches[0];
-       }
-
        /**
         * Returns the description string for this module
         * @return mixed string or array of strings
@@ -1389,6 +1338,26 @@ abstract class ApiBase extends ContextSource {
                $this->dieUsage( $parsed['info'], $parsed['code'] );
        }
 
+       /**
+        * Will only set a warning instead of failing if the global $wgDebugAPI
+        * is set to true. Otherwise behaves exactly as dieUsageMsg().
+        * @param $error (array|string) Element of a getUserPermissionsErrors()-style array
+        * @since 1.21
+        */
+       public function dieUsageMsgOrDebug( $error ) {
+               global $wgDebugAPI;
+               if( $wgDebugAPI !== true ) {
+                       $this->dieUsageMsg( $error );
+               } else {
+                       if( is_string( $error ) ) {
+                               $error = array( $error );
+                       }
+                       $parsed = $this->parseMsg( $error );
+                       $this->setWarning( '$wgDebugAPI: ' . $parsed['code']
+                               . ' - ' . $parsed['info'] );
+               }
+       }
+
        /**
         * Return the error message related to a certain array
         * @param $error array Element of a getUserPermissionsErrors()-style array
@@ -1691,12 +1660,4 @@ abstract class ApiBase extends ContextSource {
                }
                print "\n</pre>\n";
        }
-
-       /**
-        * Returns a string that identifies the version of this class.
-        * @return string
-        */
-       public static function getBaseVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 4779067..b58be11 100644 (file)
@@ -265,8 +265,4 @@ class ApiBlock extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Block';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 6741259..230ed33 100644 (file)
@@ -172,8 +172,4 @@ class ApiComparePages extends ApiBase {
                        'api.php?action=compare&fromrev=1&torev=2' => 'Create a diff between revision 1 and 2',
                );
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 628f48e..8c49c17 100644 (file)
@@ -89,8 +89,16 @@ class ApiCreateAccount extends ApiBase {
                        // Save settings (including confirmation token)
                        $user->saveSettings();
 
-                       wfRunHooks( 'AddNewAccount', array( $user, false ) );
-                       $user->addNewUserLogEntry( $this->getUser()->isAnon(), $params['reason'] );
+                       wfRunHooks( 'AddNewAccount', array( $user, $params['mailpassword'] ) );
+
+                       if ( $params['mailpassword'] ) {
+                               $logAction = 'byemail';
+                       } elseif ( $this->getUser()->isLoggedIn() ) {
+                               $logAction = 'create2';
+                       } else {
+                               $logAction = 'create';
+                       }
+                       $user->addNewUserLogEntry( $logAction, (string)$params['reason'] );
 
                        // Add username, id, and token to result.
                        $result['username'] = $user->getName();
@@ -258,8 +266,4 @@ class ApiCreateAccount extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Account creation';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 964e0ae..cfa8035 100644 (file)
@@ -267,8 +267,4 @@ class ApiDelete extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Delete';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 13975ae..ebcfa01 100644 (file)
@@ -63,8 +63,4 @@ class ApiDisabled extends ApiBase {
        public function getExamples() {
                return array();
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index b1066cc..74d3e14 100644 (file)
@@ -649,8 +649,4 @@ class ApiEditPage extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Edit';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 4fa0343..ba8edc0 100644 (file)
@@ -160,8 +160,4 @@ class ApiEmailUser extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:E-mail';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 160f5b9..f740cf8 100644 (file)
@@ -130,8 +130,4 @@ class ApiExpandTemplates extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Parsing_wikitext#expandtemplates';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 15a377c..2f02674 100644 (file)
@@ -213,8 +213,4 @@ class ApiFeedContributions extends ApiBase {
                        'api.php?action=feedcontributions&user=Reedy',
                );
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 373abdb..7a91641 100644 (file)
@@ -233,8 +233,4 @@ class ApiFeedWatchlist extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Watchlist_feed';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 092b003..1e463e5 100644 (file)
@@ -195,8 +195,4 @@ class ApiFileRevert extends ApiBase {
                                => 'Revert Wiki.png to the version of 20110305152740',
                );
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 8ad9b8c..e8edb3d 100644 (file)
@@ -308,10 +308,6 @@ See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>,
        public function getDescription() {
                return $this->getIsHtml() ? ' (pretty-print in HTML)' : '';
        }
-
-       public static function getBaseVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
 
 /**
@@ -381,8 +377,4 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
                        ApiBase::dieDebug( __METHOD__, 'Invalid feed class/item' );
                }
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 3d2a39c..f280a29 100644 (file)
@@ -48,8 +48,4 @@ class ApiFormatDbg extends ApiFormatBase {
        public function getDescription() {
                return 'Output data in PHP\'s var_export() format' . parent::getDescription();
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 0f055e1..db66083 100644 (file)
@@ -52,8 +52,4 @@ class ApiFormatDump extends ApiFormatBase {
        public function getDescription() {
                return 'Output data in PHP\'s var_dump() format' . parent::getDescription();
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index acbc7d3..19c5e5f 100644 (file)
@@ -90,8 +90,4 @@ class ApiFormatJson extends ApiFormatBase {
                        return 'Output data in JSON format' . parent::getDescription();
                }
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index b3bde37..bee1ac9 100644 (file)
@@ -44,8 +44,4 @@ class ApiFormatNone extends ApiFormatBase {
        public function getDescription() {
                return 'Output nothing' . parent::getDescription();
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index fac2ca5..99a047a 100644 (file)
@@ -45,8 +45,4 @@ class ApiFormatPhp extends ApiFormatBase {
        public function getDescription() {
                return 'Output data in serialized PHP format' . parent::getDescription();
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 184f0a3..d278efa 100644 (file)
@@ -66,8 +66,4 @@ class ApiFormatRaw extends ApiFormatBase {
                }
                $this->printText( $data['text'] );
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 7141459..3e1f592 100644 (file)
@@ -48,8 +48,4 @@ class ApiFormatTxt extends ApiFormatBase {
        public function getDescription() {
                return 'Output data in PHP\'s print_r() format' . parent::getDescription();
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 65056e4..fd1b327 100644 (file)
@@ -112,8 +112,4 @@ class ApiFormatWddx extends ApiFormatBase {
        public function getDescription() {
                return 'Output data in WDDX format' . parent::getDescription();
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 5ccf185..8dbeae4 100644 (file)
@@ -205,7 +205,13 @@ class ApiFormatXml extends ApiFormatBase {
                                // ignore
                                break;
                        default:
-                               $retval .= $indstr . Xml::element( $elemName, null, $elemValue );
+                               // to make sure null value doesn't produce unclosed element,
+                               // which is what Xml::element( $elemName, null, null ) returns
+                               if ( $elemValue === null ) {
+                                       $retval .= $indstr . Xml::element( $elemName );
+                               } else {
+                                       $retval .= $indstr . Xml::element( $elemName, null, $elemValue );
+                               }
                                break;
                }
                return $retval;
@@ -248,8 +254,4 @@ class ApiFormatXml extends ApiFormatBase {
        public function getDescription() {
                return 'Output data in XML format' . parent::getDescription();
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 9a8e3bc..700d4a5 100644 (file)
@@ -37,8 +37,4 @@ class ApiFormatYaml extends ApiFormatJson {
        public function getDescription() {
                return 'Output data in YAML format' . ApiFormatBase::getDescription();
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 2b5de21..28bb2e9 100644 (file)
@@ -151,8 +151,4 @@ class ApiHelp extends ApiBase {
                        'https://www.mediawiki.org/wiki/API:Quick_start_guide',
                );
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 637c1ff..f5636bd 100644 (file)
@@ -186,10 +186,6 @@ class ApiImport extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Import';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
 
 /**
index 1f91fe9..3df952f 100644 (file)
@@ -278,8 +278,4 @@ class ApiLogin extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Login';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index b2f634d..00dd625 100644 (file)
@@ -75,8 +75,4 @@ class ApiLogout extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Logout';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 57ccc7a..70c31c1 100644 (file)
@@ -132,7 +132,7 @@ class ApiMain extends ApiBase {
        private $mPrinter;
 
        private $mModules, $mModuleNames, $mFormats, $mFormatNames;
-       private $mResult, $mAction, $mShowVersions, $mEnableWrite;
+       private $mResult, $mAction, $mEnableWrite;
        private $mInternalMode, $mSquidMaxage, $mModule;
 
        private $mCacheMode = 'private';
@@ -188,7 +188,6 @@ class ApiMain extends ApiBase {
                $this->mFormatNames = array_keys( $this->mFormats );
 
                $this->mResult = new ApiResult( $this );
-               $this->mShowVersions = false;
                $this->mEnableWrite = $enableWrite;
 
                $this->mSquidMaxage = - 1; // flag for executeActionWithErrorHandling()
@@ -385,7 +384,7 @@ class ApiMain extends ApiBase {
                                }
                        }
 
-                       // Handle any kind of exception by outputing properly formatted error message.
+                       // Handle any kind of exception by outputting properly formatted error message.
                        // If this fails, an unhandled exception should be thrown so that global error
                        // handler will process and log it.
 
@@ -623,7 +622,6 @@ class ApiMain extends ApiBase {
                        if ( $this->mPrinter->getWantsHelp() || $this->mAction == 'help' ) {
                                ApiResult::setContent( $errMessage, $this->makeHelpMsg() );
                        }
-
                } else {
                        global $wgShowSQLErrors, $wgShowExceptionDetails;
                        // Something is seriously wrong
@@ -640,6 +638,10 @@ class ApiMain extends ApiBase {
                        ApiResult::setContent( $errMessage, $wgShowExceptionDetails ? "\n\n{$e->getTraceAsString()}\n\n" : '' );
                }
 
+               // Remember all the warnings to re-add them later
+               $oldResult = $result->getData();
+               $warnings = isset( $oldResult['warnings'] ) ? $oldResult['warnings'] : null;
+
                $result->reset();
                $result->disableSizeCheck();
                // Re-add the id
@@ -647,11 +649,13 @@ class ApiMain extends ApiBase {
                if ( !is_null( $requestid ) ) {
                        $result->addValue( null, 'requestid', $requestid );
                }
-
                if ( $wgShowHostnames ) {
                        // servedby is especially useful when debugging errors
                        $result->addValue( null, 'servedby', wfHostName() );
                }
+               if ( $warnings !== null ) {
+                       $result->addValue( null, 'warnings', $warnings );
+               }
 
                $result->addValue( null, 'error', $errMessage );
 
@@ -681,7 +685,6 @@ class ApiMain extends ApiBase {
 
                $params = $this->extractRequestParams();
 
-               $this->mShowVersions = $params['version'];
                $this->mAction = $params['action'];
 
                if ( !is_string( $this->mAction ) ) {
@@ -787,9 +790,10 @@ class ApiMain extends ApiBase {
         * @param $params Array an array with the request parameters
         */
        protected function setupExternalResponse( $module, $params ) {
-               // Ignore mustBePosted() for internal calls
-               if ( $module->mustBePosted() && !$this->getRequest()->wasPosted() ) {
-                       $this->dieUsageMsg( array( 'mustbeposted', $this->mAction ) );
+               if ( !$this->getRequest()->wasPosted() && $module->mustBePosted() ) {
+                       // Module requires POST. GET request might still be allowed
+                       // if $wgDebugApi is true, otherwise fail.
+                       $this->dieUsageMsgOrDebug( array( 'mustbeposted', $this->mAction ) );
                }
 
                // See if custom printer is used
@@ -927,6 +931,11 @@ class ApiMain extends ApiBase {
         * @param $isError bool
         */
        protected function printResult( $isError ) {
+               global $wgDebugAPI;
+               if( $wgDebugAPI !== false ) {
+                       $this->getResult()->setWarning( 'SECURITY WARNING: $wgDebugAPI is enabled' );
+               }
+
                $this->getResult()->cleanUpUTF8();
                $printer = $this->mPrinter;
                $printer->profileIn();
@@ -968,7 +977,6 @@ class ApiMain extends ApiBase {
                                ApiBase::PARAM_DFLT => 'help',
                                ApiBase::PARAM_TYPE => $this->mModuleNames
                        ),
-                       'version' => false,
                        'maxlag'  => array(
                                ApiBase::PARAM_TYPE => 'integer'
                        ),
@@ -995,7 +1003,6 @@ class ApiMain extends ApiBase {
                return array(
                        'format' => 'The format of the output',
                        'action' => 'What action you would like to perform. See below for module help',
-                       'version' => 'When showing help, include version for each module',
                        'maxlag' => array(
                                'Maximum lag can be used when MediaWiki is installed on a database replicated cluster.',
                                'To save actions causing any more site replication lag, this parameter can make the client',
@@ -1111,8 +1118,7 @@ class ApiMain extends ApiBase {
                $this->setHelp();
                // Get help text from cache if present
                $key = wfMemcKey( 'apihelp', $this->getModuleName(),
-                       SpecialVersion::getVersion( 'nodb' ) .
-                       $this->getShowVersions() );
+                       SpecialVersion::getVersion( 'nodb' ) );
                if ( $wgAPICacheHelpTimeout > 0 ) {
                        $cached = $wgMemc->get( $key );
                        if ( $cached ) {
@@ -1202,25 +1208,11 @@ class ApiMain extends ApiBase {
        /**
         * Check whether the user wants us to show version information in the API help
         * @return bool
+        * @deprecated since 1.21, always returns false
         */
        public function getShowVersions() {
-               return $this->mShowVersions;
-       }
-
-       /**
-        * Returns the version information of this file, plus it includes
-        * the versions for all files that are not callable proper API modules
-        *
-        * @return array
-        */
-       public function getVersion() {
-               $vers = array();
-               $vers[] = 'MediaWiki: ' . SpecialVersion::getVersion() . "\n    https://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/";
-               $vers[] = __CLASS__ . ': $Id$';
-               $vers[] = ApiBase::getBaseVersion();
-               $vers[] = ApiFormatBase::getBaseVersion();
-               $vers[] = ApiQueryBase::getBaseVersion();
-               return $vers;
+               wfDeprecated( __METHOD__, '1.21' );
+               return false;
        }
 
        /**
index 9b70b56..bbf4089 100644 (file)
@@ -302,8 +302,4 @@ class ApiMove extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Move';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index ef56274..6403bd6 100644 (file)
@@ -123,8 +123,4 @@ class ApiOpenSearch extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Opensearch';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 20b4185..eff05de 100644 (file)
@@ -54,7 +54,7 @@ class ApiOptions extends ApiBase {
                }
 
                if ( $params['reset'] ) {
-                       $user->resetOptions( 'all' );
+                       $user->resetOptions( $params['resetkinds'] );
                        $changed = true;
                }
 
@@ -86,7 +86,7 @@ class ApiOptions extends ApiBase {
                                case 'registered-multiselect':
                                        // A key for a multiselect option.
                                        $validation = true;
-                                       $value = (bool)$value;
+                                       $value = $value !== null ? (bool) $value : null;
                                        break;
                                case 'userjs':
                                        // Allow non-default preferences prefixed with 'userjs-', to be set by user scripts
@@ -128,12 +128,20 @@ class ApiOptions extends ApiBase {
        }
 
        public function getAllowedParams() {
+               $optionKinds = User::listOptionKinds();
+               $optionKinds[] = 'all';
+
                return array(
                        'token' => array(
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true
                        ),
                        'reset' => false,
+                       'resetkinds' => array(
+                               ApiBase::PARAM_TYPE => $optionKinds,
+                               ApiBase::PARAM_DFLT => 'all',
+                               ApiBase::PARAM_ISMULTI => true
+                       ),
                        'change' => array(
                                ApiBase::PARAM_ISMULTI => true,
                        ),
@@ -161,8 +169,9 @@ class ApiOptions extends ApiBase {
        public function getParamDescription() {
                return array(
                        'token' => 'An options token previously obtained through the action=tokens',
-                       'reset' => 'Resets all preferences to the site defaults',
-                       'change' => 'List of changes, formatted name=value (e.g. skin=vector), value cannot contain pipe characters',
+                       'reset' => 'Resets preferences to the site defaults',
+                       'resetkinds' => 'List of types of options to reset when the "reset" option is set',
+                       'change' => 'List of changes, formatted name=value (e.g. skin=vector), value cannot contain pipe characters. If no value is given (not even an equals sign), e.g., optionname|otheroption|..., the option will be reset to its default value',
                        'optionname' => 'A name of a option which should have an optionvalue set',
                        'optionvalue' => 'A value of the option specified by the optionname, can contain pipe characters',
                );
@@ -202,8 +211,4 @@ class ApiOptions extends ApiBase {
                        'api.php?action=options&reset=&change=skin=monobook&optionname=nickname&optionvalue=[[User:Beau|Beau]]%20([[User_talk:Beau|talk]])&token=123ABC',
                );
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 5fcb132..e2f4dae 100644 (file)
@@ -791,8 +791,4 @@ class ApiPageSet extends ApiQueryBase {
                        array( 'code' => 'multisource', 'info' => "Cannot use 'revids' at the same time as 'dataSource'" ),
                ) );
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 343a262..42c490e 100644 (file)
@@ -114,10 +114,10 @@ class ApiParamInfo extends ApiBase {
                $result = $this->getResult();
                $retval['classname'] = get_class( $obj );
                $retval['description'] = implode( "\n", (array)$obj->getFinalDescription() );
-
                $retval['examples'] = '';
 
-               $retval['version'] = implode( "\n", (array)$obj->getVersion() );
+               // version is deprecated since 1.21, but needs to be returned for v1
+               $retval['version'] = '';
                $retval['prefix'] = $obj->getModulePrefix();
 
                if ( $obj->isReadMode() ) {
@@ -366,8 +366,4 @@ class ApiParamInfo extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Parameter_information';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 94b4a8b..143540b 100644 (file)
@@ -671,8 +671,4 @@ class ApiParse extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Parsing_wikitext#parse';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index cb5e081..336068f 100644 (file)
@@ -120,8 +120,4 @@ class ApiPatrol extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Patrol';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index b3ca67e..fa6da52 100644 (file)
@@ -234,8 +234,4 @@ class ApiProtect extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Protect';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index dbfa89c..e1ba759 100644 (file)
@@ -187,8 +187,4 @@ class ApiPurge extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Purge';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 56b0f4e..e5e6ca4 100644 (file)
@@ -776,12 +776,4 @@ class ApiQuery extends ApiBase {
                        'https://www.mediawiki.org/wiki/API:Lists',
                );
        }
-
-       public function getVersion() {
-               $psModule = new ApiPageSet( $this );
-               $vers = array();
-               $vers[] = __CLASS__ . ': $Id$';
-               $vers[] = $psModule->getVersion();
-               return $vers;
-       }
 }
index 6ada4aa..496a0eb 100644 (file)
@@ -231,8 +231,4 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Allcategories';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index c78f0f3..bbc5272 100644 (file)
@@ -405,8 +405,4 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Allimages';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 620a394..e355f8b 100644 (file)
@@ -297,8 +297,4 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
        public function getHelpUrls() {
                return "https://www.mediawiki.org/wiki/API:All{$this->descriptionLink}s";
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 9fd2db8..fcc3dba 100644 (file)
@@ -291,8 +291,4 @@ class ApiQueryAllMessages extends ApiQueryBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Meta#allmessages_.2F_am';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index b180572..0c6692a 100644 (file)
@@ -355,8 +355,4 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Allpages';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 79f6469..37f2b0f 100644 (file)
@@ -444,8 +444,4 @@ class ApiQueryAllUsers extends ApiQueryBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Allusers';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index bf918dd..0df2899 100644 (file)
@@ -555,8 +555,4 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
        public function getHelpUrls() {
                return $this->helpUrl;
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index e36109a..02d071b 100644 (file)
@@ -578,14 +578,6 @@ abstract class ApiQueryBase extends ApiBase {
                }
                return $errors;
        }
-
-       /**
-        * Get version string for use in the API help output
-        * @return string
-        */
-       public static function getBaseVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
 
 /**
index 7cc1755..0d2fa0d 100644 (file)
@@ -404,8 +404,4 @@ class ApiQueryBlocks extends ApiQueryBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Blocks';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index f05bb26..2b48eb0 100644 (file)
@@ -273,8 +273,4 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Properties#categories_.2F_cl';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 31517fa..fbe555c 100644 (file)
@@ -146,8 +146,4 @@ class ApiQueryCategoryInfo extends ApiQueryBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Properties#categoryinfo_.2F_ci';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index ca24f2b..6a392bd 100644 (file)
@@ -413,8 +413,4 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Categorymembers';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 9eab651..27d95ee 100644 (file)
@@ -421,8 +421,4 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Deletedrevs';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 6715969..c0929a0 100644 (file)
@@ -61,8 +61,4 @@ class ApiQueryDisabled extends ApiQueryBase {
        public function getExamples() {
                return array();
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index d4a486a..3b04426 100644 (file)
@@ -211,8 +211,4 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Properties#duplicatefiles_.2F_df';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 6081601..98380d6 100644 (file)
@@ -272,8 +272,4 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Exturlusage';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 1449a96..c4a39d6 100644 (file)
@@ -166,8 +166,4 @@ class ApiQueryExternalLinks extends ApiQueryBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Properties#extlinks_.2F_el';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index fcffc4d..8718371 100644 (file)
@@ -374,8 +374,4 @@ class ApiQueryFilearchive extends ApiQueryBase {
                        ),
                );
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 283115d..b47d31f 100644 (file)
@@ -239,8 +239,4 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
                        'api.php?action=query&generator=iwbacklinks&giwbltitle=Test&giwblprefix=wikibooks&prop=info'
                );
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 8e8a075..fc77b4e 100644 (file)
@@ -192,8 +192,4 @@ class ApiQueryIWLinks extends ApiQueryBase {
                        'api.php?action=query&prop=iwlinks&titles=Main%20Page' => 'Get interwiki links from the [[Main Page]]',
                );
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 88c41a8..b368af8 100644 (file)
@@ -76,15 +76,14 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        } else {
                                $images = RepoGroup::singleton()->findFiles( $titles );
                        }
-                       $resolveRedirects = $this->getPageSet()->isResolvingRedirects();
-                       foreach ( $images as $img ) {
-                               // Skip redirects
-                               if ( $img->getOriginalTitle()->isRedirect() && !$resolveRedirects ) {
+                       foreach ( $titles as $title ) {
+                               if ( !isset( $images[$title] ) ) {
                                        continue;
                                }
 
                                $start = $skip ? $fromTimestamp : $params['start'];
-                               $pageId = $pageIds[NS_FILE][$img->getTitle()->getDBkey()];
+                               $pageId = $pageIds[NS_FILE][$title];
+                               $img = $images[$title];
 
                                $fit = $result->addValue(
                                        array( 'query', 'pages', intval( $pageId ) ),
@@ -703,8 +702,4 @@ class ApiQueryImageInfo extends ApiQueryBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Properties#imageinfo_.2F_ii';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 16d54aa..aa7359b 100644 (file)
@@ -192,8 +192,4 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Properties#images_.2F_im';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index efbd731..94b6ad8 100644 (file)
@@ -816,8 +816,4 @@ class ApiQueryInfo extends ApiQueryBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Properties#info_.2F_in';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index d6346d3..7a4880a 100644 (file)
@@ -239,8 +239,4 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                        'api.php?action=query&generator=langbacklinks&glbltitle=Test&glbllang=fr&prop=info'
                );
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 9c54cfa..0aaa588 100644 (file)
@@ -188,8 +188,4 @@ class ApiQueryLangLinks extends ApiQueryBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Properties#langlinks_.2F_ll';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 54ee57c..138d79b 100644 (file)
@@ -247,8 +247,4 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
        public function getHelpUrls() {
                return $this->helpUrl;
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index b2eebfb..6b77898 100644 (file)
@@ -545,8 +545,4 @@ class ApiQueryLogEvents extends ApiQueryBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Logevents';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 1eef67e..189e15a 100644 (file)
@@ -146,8 +146,4 @@ class ApiQueryPageProps extends ApiQueryBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Properties#pageprops_.2F_pp';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 0205005..4aa0000 100644 (file)
@@ -264,8 +264,4 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Protectedtitles';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index a8be26d..182bc2c 100644 (file)
@@ -220,8 +220,4 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
                        'api.php?action=query&list=querypage&qppage=Ancientpages'
                );
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index ddf5841..99854c1 100644 (file)
@@ -183,8 +183,4 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
        public function getExamples() {
                return 'api.php?action=query&list=random&rnnamespace=0&rnlimit=2';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id: ApiQueryRandom.php overlordq$';
-       }
 }
index dae03a9..f7a22bd 100644 (file)
@@ -736,8 +736,4 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Recentchanges';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index ecf47a9..27ea6be 100644 (file)
@@ -854,8 +854,4 @@ class ApiQueryRevisions extends ApiQueryBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Properties#revisions_.2F_rv';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index a0a0fbe..8618339 100644 (file)
@@ -359,8 +359,4 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Search';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index bb22448..a6a6dff 100644 (file)
@@ -667,8 +667,4 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Meta#siteinfo_.2F_si';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index a310d10..1b97317 100644 (file)
@@ -138,9 +138,5 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
                );
        }
 
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
-
 }
 
index de30d06..e0637ff 100644 (file)
@@ -195,8 +195,4 @@ class ApiQueryTags extends ApiQueryBase {
                        'api.php?action=query&list=tags&tgprop=displayname|description|hitcount'
                );
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 96fea1a..4d1edf1 100644 (file)
@@ -543,8 +543,4 @@ class ApiQueryContributions extends ApiQueryBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Usercontribs';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 6690665..963c8f8 100644 (file)
@@ -303,8 +303,4 @@ class ApiQueryUserInfo extends ApiQueryBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Meta#userinfo_.2F_ui';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index e569018..03a0b79 100644 (file)
@@ -396,8 +396,4 @@ class ApiQueryUsers extends ApiQueryBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Users';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 22d98b7..dd50624 100644 (file)
@@ -518,8 +518,4 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Watchlist';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 27b6f74..2cb4d9e 100644 (file)
@@ -222,8 +222,4 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                        'api.php?action=query&generator=watchlistraw&gwrshow=changed&prop=revisions',
                );
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 91e2081..5f752b3 100644 (file)
@@ -367,8 +367,4 @@ class ApiResult extends ApiBase {
        public function execute() {
                ApiBase::dieDebug( __METHOD__, 'execute() is not supported on Result object' );
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 677df16..402bab1 100644 (file)
@@ -205,8 +205,4 @@ class ApiRollback extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Rollback';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index f0e1fad..752a6be 100644 (file)
@@ -155,10 +155,6 @@ class ApiRsd extends ApiBase {
                }
                return $outputData;
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
 
 class ApiFormatXmlRsd extends ApiFormatXml {
@@ -170,8 +166,4 @@ class ApiFormatXmlRsd extends ApiFormatXml {
        public function getMimeType() {
                return 'application/rsd+xml';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index c122f59..68160fa 100644 (file)
@@ -278,8 +278,4 @@ class ApiSetNotificationTimestamp extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:SetNotificationTimestamp';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 2c9b482..2be2b24 100644 (file)
@@ -151,8 +151,4 @@ class ApiTokens extends ApiBase {
                        'api.php?action=tokens&type=email|move' => 'Retrieve an email token and a move token'
                );
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index e34771f..5802a98 100644 (file)
@@ -178,8 +178,4 @@ class ApiUnblock extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Block';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 2ee8641..b1eeff3 100644 (file)
@@ -176,8 +176,4 @@ class ApiUndelete extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Undelete';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 2e18e8a..1d7ba0f 100644 (file)
@@ -53,6 +53,7 @@ class ApiUpload extends ApiBase {
                $request = $this->getMain()->getRequest();
                // Check if async mode is actually supported
                $this->mParams['async'] = ( $this->mParams['async'] && !wfIsWindows() );
+               $this->mParams['async'] = false; // XXX: disabled per bug 44080
                // Add the uploaded file to the params array
                $this->mParams['file'] = $request->getFileName( 'file' );
                $this->mParams['chunk'] = $request->getFileName( 'chunk' );
@@ -843,8 +844,4 @@ class ApiUpload extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Upload';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index cbb66a4..0c6ebb1 100644 (file)
@@ -141,8 +141,4 @@ class ApiUserrights extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:User_group_membership';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 275275e..16da176 100644 (file)
@@ -151,8 +151,4 @@ class ApiWatch extends ApiBase {
        public function getHelpUrls() {
                return 'https://www.mediawiki.org/wiki/API:Watch';
        }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
 }
index 7b91607..ccc9b2c 100644 (file)
@@ -788,7 +788,7 @@ abstract class ContentHandler {
         *    boolean false if no revision occurred
         *
         * @XXX &$hasHistory is extremely ugly, it's here because
-        * WikiPage::getAutoDeleteReason() and Article::getReason()
+        * WikiPage::getAutoDeleteReason() and Article::generateReason()
         * have it / want it.
         */
        public function getAutoDeleteReason( Title $title, &$hasHistory ) {
index c1ce751..96d27b0 100644 (file)
@@ -270,21 +270,29 @@ class RequestContext implements IContextSource {
        }
 
        /**
-        * Get the Language object
+        * Get the Language object.
+        * Initialization of user or request objects can depend on this.
         *
         * @return Language
         * @since 1.19
         */
        public function getLanguage() {
+               if ( isset( $this->recursion ) ) {
+                       throw new MWException( 'Recursion detected' );
+               }
+
                if ( $this->lang === null ) {
+                       $this->recursion = true;
+
                        global $wgLanguageCode, $wgContLang;
-                       $code = $this->getRequest()->getVal(
-                               'uselang',
-                               $this->getUser()->getOption( 'language' )
-                       );
+
+                       $request = $this->getRequest();
+                       $user = $this->getUser();
+
+                       $code = $request->getVal( 'uselang', $user->getOption( 'language' ) );
                        $code = self::sanitizeLangCode( $code );
 
-                       wfRunHooks( 'UserGetLanguageObject', array( $this->getUser(), &$code ) );
+                       wfRunHooks( 'UserGetLanguageObject', array( $user, &$code, $this ) );
 
                        if ( $code === $wgLanguageCode ) {
                                $this->lang = $wgContLang;
@@ -292,7 +300,10 @@ class RequestContext implements IContextSource {
                                $obj = Language::factory( $code );
                                $this->lang = $obj;
                        }
+
+                       unset( $this->recursion );
                }
+
                return $this->lang;
        }
 
@@ -388,7 +399,7 @@ class RequestContext implements IContextSource {
         * - Skin will be based on the anonymous user, should be the wiki's default skin
         *
         * @param Title $title Title to use for the extraneous request
-        * @param mixed $request A WebRequest or data to use for a FauxRequest
+        * @param WebRequest|array $request A WebRequest or data to use for a FauxRequest
         * @return RequestContext
         */
        public static function newExtraneousContext( Title $title, $request = array() ) {
index a27bef5..20cf5b4 100644 (file)
@@ -33,7 +33,7 @@ abstract class DBAccessBase implements IDBAccessObject {
         * @var String|bool $wiki The target wiki's name. This must be an ID
         * that LBFactory can understand.
         */
-       protected $wiki;
+       protected $wiki = false;
 
        /**
         * @param String|bool $wiki The target wiki's name. This must be an ID
index ffc4de0..62a3d87 100644 (file)
@@ -2030,47 +2030,39 @@ abstract class DatabaseBase implements DatabaseType {
                # Split database and table into proper variables.
                # We reverse the explode so that database.table and table both output
                # the correct table.
-               $dbDetails = array_reverse( explode( '.', $name, 2 ) );
-               if ( isset( $dbDetails[1] ) ) {
-                       list( $table, $database ) = $dbDetails;
+               $dbDetails = explode( '.', $name, 2 );
+               if ( count( $dbDetails ) == 2 ) {
+                       list( $database, $table ) = $dbDetails;
+                       # We don't want any prefix added in this case
+                       $prefix = '';
                } else {
                        list( $table ) = $dbDetails;
-               }
-               $prefix = $this->mTablePrefix; # Default prefix
-
-               # A database name has been specified in input. We don't want any
-               # prefixes added.
-               if ( isset( $database ) ) {
-                       $prefix = '';
+                       if ( $wgSharedDB !== null # We have a shared database
+                               && !$this->isQuotedIdentifier( $table ) # Paranoia check to prevent shared tables listing '`table`'
+                               && in_array( $table, $wgSharedTables ) # A shared table is selected
+                       ) {
+                               $database = $wgSharedDB;
+                               $prefix   = $wgSharedPrefix === null ? $this->mTablePrefix : $wgSharedPrefix;
+                       } else {
+                               $database = null;
+                               $prefix = $this->mTablePrefix; # Default prefix
+                       }
                }
 
-               # Note that we use the long format because php will complain in in_array if
-               # the input is not an array, and will complain in is_array if it is not set.
-               if ( !isset( $database ) # Don't use shared database if pre selected.
-                && isset( $wgSharedDB ) # We have a shared database
-                && !$this->isQuotedIdentifier( $table ) # Paranoia check to prevent shared tables listing '`table`'
-                && isset( $wgSharedTables )
-                && is_array( $wgSharedTables )
-                && in_array( $table, $wgSharedTables ) ) { # A shared table is selected
-                       $database = $wgSharedDB;
-                       $prefix   = isset( $wgSharedPrefix ) ? $wgSharedPrefix : $prefix;
+               # Quote $table and apply the prefix if not quoted.
+               $tableName = "{$prefix}{$table}";
+               if ( $format == 'quoted' && !$this->isQuotedIdentifier( $tableName ) ) {
+                       $tableName = $this->addIdentifierQuotes( $tableName );
                }
 
-               # Quote the $database and $table and apply the prefix if not quoted.
-               if ( isset( $database ) ) {
+               # Quote $database and merge it with the table name if needed
+               if ( $database !== null ) {
                        if ( $format == 'quoted' && !$this->isQuotedIdentifier( $database ) ) {
                                $database = $this->addIdentifierQuotes( $database );
                        }
+                       $tableName = $database . '.' . $tableName;
                }
 
-               $table = "{$prefix}{$table}";
-               if ( $format == 'quoted' && !$this->isQuotedIdentifier( $table ) ) {
-                       $table = $this->addIdentifierQuotes( "{$table}" );
-               }
-
-               # Merge our database and table into our final table name.
-               $tableName = ( isset( $database ) ? "{$database}.{$table}" : "{$table}" );
-
                return $tableName;
        }
 
@@ -2593,7 +2585,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $fname String name of the calling function
         *
         * @throws DBUnexpectedError
-        * @return bool
+        * @return bool|ResultWrapper
         */
        public function delete( $table, $conds, $fname = 'DatabaseBase::delete' ) {
                if ( !$conds ) {
index 5c730fb..6acc124 100644 (file)
@@ -31,7 +31,7 @@
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 
-abstract class ORMRow implements IORMRow {
+class ORMRow implements IORMRow {
 
        /**
         * The fields of the object.
index 4079315..8abfdb6 100644 (file)
@@ -19,6 +19,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @since 1.20
+ * Non-abstract since 1.21
  *
  * @file ORMTable.php
  * @ingroup ORM
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 
-abstract class ORMTable extends DBAccessBase implements IORMTable {
+class ORMTable extends DBAccessBase implements IORMTable {
 
        /**
-        * Gets the db field prefix.
+        * Cache for instances, used by the singleton method.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
-        * @return string
+        * @var ORMTable[]
         */
-       protected abstract function getFieldPrefix();
+       protected static $instanceCache = array();
 
        /**
-        * Cache for instances, used by the singleton method.
+        * @since 1.21
         *
-        * @since 1.20
-        * @var array of DBTable
+        * @var string
         */
-       protected static $instanceCache = array();
+       protected $tableName;
+
+       /**
+        * @since 1.21
+        *
+        * @var string[]
+        */
+       protected $fields = array();
+
+       /**
+        * @since 1.21
+        *
+        * @var string
+        */
+       protected $fieldPrefix = '';
+
+       /**
+        * @since 1.21
+        *
+        * @var string
+        */
+       protected $rowClass = 'ORMRow';
+
+       /**
+        * @since 1.21
+        *
+        * @var array
+        */
+       protected $defaults = array();
 
        /**
         * ID of the database connection to use for read operations.
         * Can be changed via @see setReadDb.
         *
         * @since 1.20
+        *
         * @var integer DB_ enum
         */
        protected $readDb = DB_SLAVE;
 
+       /**
+        * Constructor.
+        *
+        * @since 1.21
+        *
+        * @param string $tableName
+        * @param string[] $fields
+        * @param array $defaults
+        * @param string|null $rowClass
+        * @param string $fieldPrefix
+        */
+       public function __construct( $tableName = '', array $fields = array(), array $defaults = array(), $rowClass = null, $fieldPrefix = '' ) {
+               $this->tableName = $tableName;
+               $this->fields = $fields;
+               $this->defaults = $defaults;
+
+               if ( is_string( $rowClass ) ) {
+                       $this->rowClass = $rowClass;
+               }
+
+               $this->fieldPrefix = $fieldPrefix;
+       }
+
+       /**
+        * @see IORMTable::getName
+        *
+        * @since 1.21
+        *
+        * @return string
+        * @throws MWException
+        */
+       public function getName() {
+               if ( $this->tableName === '' ) {
+                       throw new MWException( 'The table name needs to be set' );
+               }
+
+               return $this->tableName;
+       }
+
+       /**
+        * Gets the db field prefix.
+        *
+        * @since 1.20
+        *
+        * @return string
+        */
+       protected function getFieldPrefix() {
+               return $this->fieldPrefix;
+       }
+
+       /**
+        * @see IORMTable::getRowClass
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       public function getRowClass() {
+               return $this->rowClass;
+       }
+
+       /**
+        * @see ORMTable::getFields
+        *
+        * @since 1.21
+        *
+        * @return array
+        * @throws MWException
+        */
+       public function getFields() {
+               if ( $this->fields === array() ) {
+                       throw new MWException( 'The table needs to have one or more fields' );
+               }
+
+               return $this->fields;
+       }
+
        /**
         * Returns a list of default field values.
         * field name => field value
@@ -64,7 +171,7 @@ abstract class ORMTable extends DBAccessBase implements IORMTable {
         * @return array
         */
        public function getDefaults() {
-               return array();
+               return $this->defaults;
        }
 
        /**
@@ -680,6 +787,7 @@ abstract class ORMTable extends DBAccessBase implements IORMTable {
         * Get an instance of this class.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @return IORMTable
         */
@@ -793,4 +901,4 @@ abstract class ORMTable extends DBAccessBase implements IORMTable {
                return array_key_exists( $name, $this->getFields() );
        }
 
-}
+}
\ No newline at end of file
index 1b7c29d..55c1acf 100644 (file)
@@ -1,6 +1,10 @@
 <?php
 /**
- * Data storage in external repositories.
+ * @defgroup ExternalStorage ExternalStorage
+ */
+
+/**
+ * Interface for data storage in external repositories.
  *
  * 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
  */
 
 /**
- * @defgroup ExternalStorage ExternalStorage
- */
-
-/**
- * Constructor class for data kept in external repositories
+ * Constructor class for data kept in external repositories.
+ *
+ * Objects in external stores are defined by a special URL. The URL is of
+ * the form "<store protocal>://<location>/<object name>". When an object
+ * is inserted into a store, the calling code uses a partial URL of the form
+ * "<store protocal>://<location>" and receives the full object URL on success.
+ * This is useful since object names can be sequential IDs, UUIDs, or hashes.
+ * Callers are not responsible for unique name generation.
  *
  * External repositories might be populated by maintenance/async
  * scripts, thus partial moving of data may be possible, as well
  * @ingroup ExternalStorage
  */
 class ExternalStore {
-       var $mParams;
-
        /**
-        * @param $params array
+        * Get an external store object of the given type, with the given parameters
+        *
+        * @param $proto String: type of external storage, should be a value in $wgExternalStores
+        * @param $params Array: associative array of parameters for the ExternalStore object.
+        * @return ExternalStore|bool ExternalStore class or false on error
         */
-       function __construct( $params = array() ) {
-               $this->mParams = $params;
+       public static function getStoreObject( $proto, array $params = array() ) {
+               global $wgExternalStores;
+
+               if ( !$wgExternalStores || !in_array( $proto, $wgExternalStores ) ) {
+                       return false; // protocol not enabled
+               }
+
+               $class = 'ExternalStore' . ucfirst( $proto );
+               // Any custom modules should be added to $wgAutoLoadClasses for on-demand loading
+               return MWInit::classExists( $class ) ? new $class( $params ) : false;
        }
 
        /**
@@ -49,23 +66,16 @@ class ExternalStore {
         * @param $url String: The URL of the text to get
         * @param $params Array: associative array of parameters for the ExternalStore object.
         * @return string|bool The text stored or false on error
+        * @throws MWException
         */
-       static function fetchFromURL( $url, $params = array() ) {
-               global $wgExternalStores;
-
-               if( !$wgExternalStores ) {
-                       return false;
-               }
-
+       public static function fetchFromURL( $url, array $params = array() ) {
                $parts = explode( '://', $url, 2 );
-
                if ( count( $parts ) != 2 ) {
-                       return false;
+                       return false; // invalid URL
                }
 
                list( $proto, $path ) = $parts;
-
-               if ( $path == '' ) { // Bad URL
+               if ( $path == '' ) { // bad URL
                        return false;
                }
 
@@ -77,33 +87,6 @@ class ExternalStore {
                return $store->fetchFromURL( $url );
        }
 
-       /**
-        * Get an external store object of the given type, with the given parameters
-        *
-        * @param $proto String: type of external storage, should be a value in $wgExternalStores
-        * @param $params Array: associative array of parameters for the ExternalStore object.
-        * @return ExternalStore|bool ExternalStore class or false on error
-        */
-       static function getStoreObject( $proto, $params = array() ) {
-               global $wgExternalStores;
-               if( !$wgExternalStores ) {
-                       return false;
-               }
-
-               /* Protocol not enabled */
-               if( !in_array( $proto, $wgExternalStores ) ) {
-                       return false;
-               }
-
-               $class = 'ExternalStore' . ucfirst( $proto );
-               /* Any custom modules should be added to $wgAutoLoadClasses for on-demand loading */
-               if( !MWInit::classExists( $class ) ) {
-                       return false;
-               }
-
-               return new $class($params);
-       }
-
        /**
         * Store a data item to an external store, identified by a partial URL
         * The protocol part is used to identify the class, the rest is passed to the
@@ -112,14 +95,24 @@ class ExternalStore {
         * @param $data
         * @param $params array
         * @return string|bool The URL of the stored data item, or false on error
+        * @throws MWException
         */
-       static function insert( $url, $data, $params = array() ) {
-               list( $proto, $params ) = explode( '://', $url, 2 );
+       public static function insert( $url, $data, array $params = array() ) {
+               $parts = explode( '://', $url, 2 );
+               if ( count( $parts ) != 2 ) {
+                       return false; // invalid URL
+               }
+
+               list( $proto, $path ) = $parts;
+               if ( $path == '' ) { // bad URL
+                       return false;
+               }
+
                $store = self::getStoreObject( $proto, $params );
                if ( $store === false ) {
                        return false;
                } else {
-                       return $store->store( $params, $data );
+                       return $store->store( $path, $data );
                }
        }
 
@@ -129,42 +122,41 @@ class ExternalStore {
         * itself. It also fails-over to the next possible clusters.
         *
         * @param $data String
-        * @param $storageParams Array: associative array of parameters for the ExternalStore object.
-        * @throws MWException|DBConnectionError|DBQueryError
+        * @param $params Array: associative array of parameters for the ExternalStore object.
         * @return string|bool The URL of the stored data item, or false on error
+        * @throws MWException
         */
-       public static function insertToDefault( $data, $storageParams = array() ) {
+       public static function insertToDefault( $data, array $params = array() ) {
                global $wgDefaultExternalStore;
-               $tryStores = (array)$wgDefaultExternalStore;
+
                $error = false;
+               $tryStores = (array)$wgDefaultExternalStore;
                while ( count( $tryStores ) > 0 ) {
-                       $index = mt_rand(0, count( $tryStores ) - 1);
+                       $index = mt_rand( 0, count( $tryStores ) - 1 );
                        $storeUrl = $tryStores[$index];
                        wfDebug( __METHOD__.": trying $storeUrl\n" );
-                       list( $proto, $params ) = explode( '://', $storeUrl, 2 );
-                       $store = self::getStoreObject( $proto, $storageParams );
+                       list( $proto, $path ) = explode( '://', $storeUrl, 2 );
+                       $store = self::getStoreObject( $proto, $params );
                        if ( $store === false ) {
                                throw new MWException( "Invalid external storage protocol - $storeUrl" );
                        }
                        try {
-                               $url = $store->store( $params, $data ); // Try to save the object
-                       } catch ( DBConnectionError $error ) {
-                               $url = false;
-                       } catch( DBQueryError $error ) {
+                               $url = $store->store( $path, $data ); // Try to save the object
+                       } catch ( MWException $error ) {
                                $url = false;
                        }
-                       if ( $url ) {
+                       if ( strlen( $url ) ) {
                                return $url; // Done!
                        } else {
                                unset( $tryStores[$index] ); // Don't try this one again!
                                $tryStores = array_values( $tryStores ); // Must have consecutive keys
-                               wfDebugLog( 'ExternalStorage', "Unable to store text to external storage $storeUrl" );
+                               wfDebugLog( 'ExternalStorage',
+                                       "Unable to store text to external storage $storeUrl" );
                        }
                }
                // All stores failed
                if ( $error ) {
-                       // Rethrow the last connection error
-                       throw $error;
+                       throw $error; // rethrow the last error
                } else {
                        throw new MWException( "Unable to store text to external storage" );
                }
@@ -173,8 +165,8 @@ class ExternalStore {
        /**
         * @param $data
         * @param $wiki
-        *
-        * @return string
+        * @return string|bool The URL of the stored data item, or false on error
+        * @throws MWException
         */
        public static function insertToForeignDefault( $data, $wiki ) {
                return self::insertToDefault( $data, array( 'wiki' => $wiki ) );
index f4457de..3c097a1 100644 (file)
@@ -46,6 +46,10 @@ class SwiftFileBackend extends FileBackendStore {
        protected $swiftCDNExpiry; // integer; how long to cache things in the CDN
        protected $swiftCDNPurgable; // boolean; whether object CDN purging is enabled
 
+       // Rados Gateway specific options
+       protected $rgwS3AccessKey; // string; S3 access key
+       protected $rgwS3SecretKey; // string; S3 authentication key
+
        /** @var CF_Connection */
        protected $conn; // Swift connection handle
        protected $sessionStarted = 0; // integer UNIX timestamp
@@ -87,6 +91,16 @@ class SwiftFileBackend extends FileBackendStore {
         *   - cacheAuthInfo      : Whether to cache authentication tokens in APC, XCache, ect.
         *                          If those are not available, then the main cache will be used.
         *                          This is probably insecure in shared hosting environments.
+        *   - rgwS3AccessKey     : Ragos Gateway S3 "access key" value on the account.
+        *                          Do not set this until it has been set in the backend.
+        *                          This is used for generating expiring pre-authenticated URLs.
+        *                          Only use this when using rgw and to work around
+        *                          http://tracker.newdream.net/issues/3454.
+        *   - rgwS3SecretKey     : Ragos Gateway S3 "secret key" value on the account.
+        *                          Do not set this until it has been set in the backend.
+        *                          This is used for generating expiring pre-authenticated URLs.
+        *                          Only use this when using rgw and to work around
+        *                          http://tracker.newdream.net/issues/3454.
         */
        public function __construct( array $config ) {
                parent::__construct( $config );
@@ -122,6 +136,12 @@ class SwiftFileBackend extends FileBackendStore {
                $this->swiftCDNPurgable = isset( $config['swiftCDNPurgable'] )
                        ? $config['swiftCDNPurgable']
                        : true;
+               $this->rgwS3AccessKey = isset( $config['rgwS3AccessKey'] )
+                       ? $config['rgwS3AccessKey']
+                       : '';
+               $this->rgwS3SecretKey = isset( $config['rgwS3SecretKey'] )
+                       ? $config['rgwS3SecretKey']
+                       : '';
                // Cache container information to mask latency
                $this->memCache = wfGetMainCache();
                // Process cache for container info
@@ -968,7 +988,7 @@ class SwiftFileBackend extends FileBackendStore {
                                $objects = $container->list_objects( $limit, $after, $prefix );
                                foreach ( $objects as $object ) { // files
                                        $objectDir = $this->getParentDir( $object ); // directory of object
-                                       if ( $objectDir !== false ) { // file has a parent dir
+                                       if ( $objectDir !== false && $objectDir !== $dir ) {
                                                // Swift stores paths in UTF-8, using binary sorting.
                                                // See function "create_container_table" in common/db.py.
                                                // If a directory is not "greater" than the last one,
@@ -1180,7 +1200,9 @@ class SwiftFileBackend extends FileBackendStore {
         * @return string|null
         */
        public function getFileHttpUrl( array $params ) {
-               if ( $this->swiftTempUrlKey != '' ) { // temp urls enabled
+               if ( $this->swiftTempUrlKey != '' ||
+                       ( $this->rgwS3AccessKey != '' && $this->rgwS3SecretKey != '' ) )
+               {
                        list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
                        if ( $srcRel === null ) {
                                return null; // invalid path
@@ -1188,7 +1210,31 @@ class SwiftFileBackend extends FileBackendStore {
                        try {
                                $sContObj = $this->getContainer( $srcCont );
                                $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
-                               return $obj->get_temp_url( $this->swiftTempUrlKey, 86400, "GET" );
+                               if ( $this->swiftTempUrlKey != '' ) {
+                                       return $obj->get_temp_url( $this->swiftTempUrlKey, 86400, "GET" );
+                               } else { // give S3 API URL for rgw
+                                       $expires = time() + 86400;
+                                       // Path for signature starts with the bucket
+                                       $spath = '/' . rawurlencode( $srcCont ) . '/' .
+                                               str_replace( '%2F', '/', rawurlencode( $srcRel ) );
+                                       // Calculate the hash
+                                       $signature = base64_encode( hash_hmac(
+                                               'sha1',
+                                               "GET\n\n\n{$expires}\n{$spath}",
+                                               $this->rgwS3SecretKey,
+                                               true // raw
+                                       ) );
+                                       // See http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html.
+                                       // Note: adding a newline for empty CanonicalizedAmzHeaders does not work.
+                                       return wfAppendQuery(
+                                               str_replace( '/swift/v1', '', // S3 API is the rgw default
+                                                       $sContObj->cfs_http->getStorageUrl() . $spath ),
+                                               array(
+                                                       'Signature'      => $signature,
+                                                       'Expires'        => $expires,
+                                                       'AWSAccessKeyId' => $this->rgwS3AccessKey )
+                                       );
+                               }
                        } catch ( NoSuchContainerException $e ) {
                        } catch ( CloudFilesException $e ) { // some other exception?
                                $this->handleException( $e, null, __METHOD__, $params );
@@ -1237,8 +1283,8 @@ class SwiftFileBackend extends FileBackendStore {
                $cfOps = $batch->execute();
                foreach ( $cfOps as $index => $cfOp ) {
                        $status = Status::newGood();
+                       $function = '_getResponse' . $fileOpHandles[$index]->call;
                        try { // catch exceptions; update status
-                               $function = '_getResponse' . $fileOpHandles[$index]->call;
                                $this->$function( $cfOp, $status, $fileOpHandles[$index]->params );
                                $this->purgeCDNCache( $fileOpHandles[$index]->affectedObjects );
                        } catch ( CloudFilesException $e ) { // some other exception?
@@ -1256,12 +1302,12 @@ class SwiftFileBackend extends FileBackendStore {
         *
         * $readGrps is a list of the possible criteria for a request to have
         * access to read a container. Each item is one of the following formats:
-        *   - account:user       : Grants access if the request is by the given user
-        *   - ".r:<regex>"       : Grants access if the request is from a referrer host that
-        *                          matches the expression and the request is not for a listing.
-        *                          Setting this to '*' effectively makes a container public.
-        *   -".rlistings:<regex>": Grants access if the request is from a referrer host that
-        *                          matches the expression and the request for a listing.
+        *   - account:user        : Grants access if the request is by the given user
+        *   - ".r:<regex>"        : Grants access if the request is from a referrer host that
+        *                           matches the expression and the request is not for a listing.
+        *                           Setting this to '*' effectively makes a container public.
+        *   -".rlistings:<regex>" : Grants access if the request is from a referrer host that
+        *                           matches the expression and the request for a listing.
         *
         * $writeGrps is a list of the possible criteria for a request to have
         * access to write to a container. Each item is of the following format:
index 9adcc99..bfb9197 100644 (file)
@@ -903,13 +903,14 @@ abstract class File {
                                $this->migrateThumbFile( $thumbName );
                                // Check if an up-to-date thumbnail already exists...
                                wfDebug( __METHOD__.": Doing stat for $thumbPath\n" );
-                               if ( $this->repo->fileExists( $thumbPath ) && !( $flags & self::RENDER_FORCE ) ) {
+                               if ( !( $flags & self::RENDER_FORCE ) && $this->repo->fileExists( $thumbPath ) ) {
                                        $timestamp = $this->repo->getFileTimestamp( $thumbPath );
                                        if ( $timestamp !== false && $timestamp >= $wgThumbnailEpoch ) {
                                                // XXX: Pass in the storage path even though we are not rendering anything
                                                // and the path is supposed to be an FS path. This is due to getScalerType()
                                                // getting called on the path and clobbering $thumb->getUrl() if it's false.
-                                               $thumb = $this->handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
+                                               $thumb = $this->handler->getTransform(
+                                                       $this, $thumbPath, $thumbUrl, $params );
                                                $thumb->setStoragePath( $thumbPath );
                                                break;
                                        }
index a9678b7..9babe5a 100644 (file)
@@ -996,6 +996,9 @@ class LocalFile extends File {
                        $options['headers'] = array();
                }
 
+               // Trim spaces on user supplied text
+               $comment = trim( $comment );
+
                // truncate nicely or the DB will do it for us
                // non-nicely (dangling multi-byte chars, non-truncated version in cache).
                $comment = $wgContLang->truncate( $comment, 255 );
index 23f0779..a272cfa 100644 (file)
@@ -249,7 +249,7 @@ If you do not see the database system you are trying to use listed below, then f
        'config-support-postgres'         => '* $1 is a popular open source database system as an alternative to MySQL ([http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]). There may be some minor outstanding bugs, and it is not recommended for use in a production environment.',
        'config-support-sqlite'           => '* $1 is a lightweight database system which is very well supported. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], uses PDO)',
        'config-support-oracle'           => '* $1 is a commercial enterprise database. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
-       'config-support-ibm_db2'          => '* $1 is a commercial enterprise database.',
+       'config-support-ibm_db2'          => '* $1 is a commercial enterprise database. ([http://www.php.net/manual/en/ibm-db2.installation.php How to compile PHP with IBM DB2 support])',
        'config-header-mysql'             => 'MySQL settings',
        'config-header-postgres'          => 'PostgreSQL settings',
        'config-header-sqlite'            => 'SQLite settings',
@@ -359,7 +359,7 @@ In '''UTF-8 mode''', MySQL will know what character set your data is in, and can
        'config-ns-other-default'         => 'MyWiki',
        'config-project-namespace-help'   => 'Following Wikipedia\'s example, many wikis keep their policy pages separate from their content pages, in a "\'\'\'project namespace\'\'\'".
 All page titles in this namespace start with a certain prefix, which you can specify here.
-Traditionally, this prefix is derived from the name of the wiki, but it cannot contain punctuation characters such as "#" or ":".',
+Usually, this prefix is derived from the name of the wiki, but it cannot contain punctuation characters such as "#" or ":".',
        'config-ns-invalid'               => 'The specified namespace "<nowiki>$1</nowiki>" is invalid.
 Specify a different project namespace.',
        'config-ns-conflict'               => 'The specified namespace "<nowiki>$1</nowiki>" conflicts with a default MediaWiki namespace.
@@ -391,7 +391,7 @@ You can now skip the remaining configuration and install the wiki right now.',
        'config-optional-continue'        => 'Ask me more questions.',
        'config-optional-skip'            => "I'm bored already, just install the wiki.",
        'config-profile'                  => 'User rights profile:',
-       'config-profile-wiki'             => 'Traditional wiki',
+       'config-profile-wiki'             => 'Open wiki',
        'config-profile-no-anon'          => 'Account creation required',
        'config-profile-fishbowl'         => 'Authorized editors only',
        'config-profile-private'          => 'Private wiki',
@@ -401,7 +401,7 @@ In MediaWiki, it is easy to review the recent changes, and to revert any damage
 However, many have found MediaWiki to be useful in a wide variety of roles, and sometimes it is not easy to convince everyone of the benefits of the wiki way.
 So you have the choice.
 
-A '''{{int:config-profile-wiki}}''' allows anyone to edit, without even logging in.
+The '''{{int:config-profile-wiki}}''' model allows anyone to edit, without even logging in.
 A wiki with '''{{int:config-profile-no-anon}}''' provides extra accountability, but may deter casual contributors.
 
 The '''{{int:config-profile-fishbowl}}''' scenario allows approved users to edit, but the public can view the pages, including history.
@@ -492,7 +492,7 @@ They may require additional configuration, but you can enable them now',
        'config-install-alreadydone'      => "'''Warning:''' You seem to have already installed MediaWiki and are trying to install it again.
 Please proceed to the next page.",
        'config-install-begin'            => 'By pressing "{{int:config-continue}}", you will begin the installation of MediaWiki.
-If you still want to make changes, press back.',
+If you still want to make changes, press "{{int:config-back}}".',
        'config-install-step-done'        => 'done',
        'config-install-step-failed'      => 'failed',
        'config-install-extensions'       => 'Including extensions',
@@ -608,8 +608,13 @@ Do not translate: <code>php5-mysql</code>.
 Parameters:
 * $1 is comma separated list of database types supported by MediaWiki.',
        'config-no-fts3' => 'A "[[:wikipedia:Front and back ends|backend]]" is a system or component that ordinary users don\'t interact with directly and don\'t need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are "system" or "service", or (depending on context and language) even leave it untranslated.',
+       'config-magic-quotes-runtime' => '{{Related|Config-fatal}}',
+       'config-magic-quotes-sybase' => '{{Related|Config-fatal}}',
+       'config-mbstring' => '{{Related|Config-fatal}}',
+       'config-ze1' => '{{Related|Config-fatal}}',
        'config-pcre' => 'PCRE is an initialism for "Perl-compatible regular expression". Perl is programming language whose [[:w:regular expression|regular expression]] syntax is popular and used in other languages using a library called PCRE.',
-       'config-pcre-no-utf8' => "PCRE is a name of a programmers' library for supporting regular expressions. It can probably be translated without change.",
+       'config-pcre-no-utf8' => "PCRE is a name of a programmers' library for supporting regular expressions. It can probably be translated without change.
+{{Related|Config-fatal}}",
        'config-memory-raised' => 'Parameters:
 * $1 is the configured <code>memory_limit</code>.
 * $2 is the value to which <code>memory_limit</code> was raised.',
@@ -4009,7 +4014,7 @@ Mit MediaWiki ist es einfach die letzten Änderungen nachzuvollziehen und unbrau
 
 Allerdings finden etliche Menschen Wikis auch mit anderen Bearbeitungskonzepten sinnvoll. Manchmal ist es zudem nicht einfach alle Beteiligten von den Vorteilen des „Wiki-Prinzips” zu überzeugen. Darum ist diese Auswahl möglich.
 
-Ein '''{{int:config-profile-wiki}}''' ermöglicht es jedermann, sogar ohne über ein Benutzerkonto zu verfügen, Bearbeitungen vorzunehmen.
+Das Modell „'''{{int:config-profile-wiki}}'''“ ermöglicht es jedermann, sogar ohne über ein Benutzerkonto zu verfügen, Bearbeitungen vorzunehmen.
 Ein Wiki bei dem die '''{{int:config-profile-no-anon}}''' ist, fordert von den Benutzern eine höhere Verantwortung für ihre Bearbeitungen ein, könnte allerdings Personen abschrecken, die nur gelegentlich Bearbeitungen vornehmen wollen. Ein Wiki für '''{{int:config-profile-fishbowl}}''' gestattet es nur bestimmten Benutzern, Bearbeitungen vorzunehmen. Allerdings kann dabei die Allgemeinheit die Seiten immer noch betrachten und Änderungen nachvollziehen. Ein '''{{int:config-profile-private}}''' gestattet es nur ausgewählten Benutzern, Seiten zu betrachten sowie zu bearbeiten.
 
 Komplexere Konzepte zur Zugriffssteuerung können erst nach abgeschlossenem Installationsvorgang eingerichtet werden. Hierzu gibt es weitere Informationen auf der Website mit der [//www.mediawiki.org/wiki/Manual:User_rights entsprechenden Anleitung].",
@@ -4097,7 +4102,7 @@ Es könnten zusätzliche Konfigurierungen zu einzelnen Erweiterungen erforderlic
        'config-install-alreadydone' => "'''Warnung:''' Es wurde eine vorhandene MediaWiki-Installation gefunden.
 Es muss daher mit den nächsten Seite weitergemacht werden.",
        'config-install-begin' => 'Durch Drücken von „{{int:config-continue}}“ wird die Installation von MediaWiki gestartet.
-Sofern Änderungen vorgenommen werden sollen, kann man auf „← Zurück“ klicken.',
+Sofern Änderungen vorgenommen werden sollen, kann man auf „{{int:config-back}}“ klicken.',
        'config-install-step-done' => 'erledigt',
        'config-install-step-failed' => 'gescheitert',
        'config-install-extensions' => 'Programmerweiterungen',
@@ -4324,7 +4329,7 @@ $messages['el'] = array(
        'config-admin-password-confirm' => 'Επανάληψη κωδικού πρόσβασης:',
        'config-admin-email' => 'Διεύθυνση ηλεκτρονικού ταχυδρομείου:',
        'config-optional-continue' => 'Να ερωτηθώ περισσότερες ερωτήσεις.',
-       'config-profile-wiki' => 'Παραδοσιακό wiki',
+       'config-profile-wiki' => 'Παραδοσιακό wiki', # Fuzzy
        'config-profile-no-anon' => 'Απαιτείται η δημιουργία λογαριασμού',
        'config-profile-private' => 'Ιδιωτικό wiki',
        'config-email-settings' => 'Ρυθμίσεις ηλεκτρονικού ταχυδρομείου',
@@ -5772,7 +5777,7 @@ Vous pouvez passer la configuration restante et installer immédiatement le wiki
        'config-optional-continue' => 'Me poser davantage de questions.',
        'config-optional-skip' => 'J’en ai assez, installer simplement le wiki.',
        'config-profile' => 'Profil des droits d’utilisateurs :',
-       'config-profile-wiki' => 'Wiki traditionnel',
+       'config-profile-wiki' => 'Wiki ouvert',
        'config-profile-no-anon' => 'Création de compte requise',
        'config-profile-fishbowl' => 'Éditeurs autorisés seulement',
        'config-profile-private' => 'Wiki privé',
@@ -5782,7 +5787,7 @@ Avec MediaWiki, il est facile de vérifier les modifications récentes et de ré
 Cependant, de nombreuses autres utilisations ont été trouvées au logiciel et il n’est pas toujours facile de convaincre tout le monde des bénéfices de l’esprit wiki.
 Vous avez donc le choix.
 
-'''{{int:config-profile-wiki}}''' autorise toute personne à modifier, y compris sans s’identifier.
+Le modèle '''{{int:config-profile-wiki}}''' autorise toute personne à modifier, y compris sans s’identifier.
 '''{{int:config-profile-no-anon}}''' fournit plus de contrôle, par l’identification, mais peut rebuter les contributeurs occasionnels.
 
 '''{{int:config-profile-fishbowl}}''' autorise la modification par les utilisateurs approuvés, mais le public peut toujours lire les pages et leur historique.
@@ -5871,8 +5876,8 @@ Si vous ne le connaissez pas, la valeur par défaut est 11211.",
 Elles peuvent nécessiter une configuration supplémentaire, mais vous pouvez les activer maintenant',
        'config-install-alreadydone' => "'''Attention''': Vous semblez avoir déjà installé MediaWiki et tentez de l'installer à nouveau.
 S'il vous plaît, allez à la page suivante.",
-       'config-install-begin' => "En appuyant sur {{int:config-continue}}, vous commencerez l'installation de MediaWiki.
-Si vous voulez apporter des modifications, appuyez sur Retour.",
+       'config-install-begin' => 'En appuyant sur {{int:config-continue}}, vous commencerez l\'installation de MediaWiki.
+Si vous voulez apporter des modifications, appuyez sur "{{int:config-back}}".',
        'config-install-step-done' => 'fait',
        'config-install-step-failed' => 'échec',
        'config-install-extensions' => 'Inclusion des extensions',
@@ -6590,7 +6595,7 @@ Neste paso pode saltar o resto da configuración e instalar o wiki agora mesmo.'
        'config-optional-continue' => 'Facédeme máis preguntas.',
        'config-optional-skip' => 'Xa estou canso. Instalade o wiki.',
        'config-profile' => 'Perfil dos dereitos de usuario:',
-       'config-profile-wiki' => 'Wiki tradicional',
+       'config-profile-wiki' => 'Wiki aberto',
        'config-profile-no-anon' => 'Necesítase a creación dunha conta',
        'config-profile-fishbowl' => 'Só os editores autorizados',
        'config-profile-private' => 'Wiki privado',
@@ -6599,7 +6604,7 @@ En MediaWiki, é doado revisar os cambios recentes e reverter calquera dano feit
 Porén, moita xente atopa MediaWiki útil nunha ampla variedade de papeis, e ás veces non é fácil convencer a todos dos beneficios que leva consigo o estilo wiki.
 Vostede decide.
 
-O tipo '''{{int:config-profile-wiki}}''' permite a edición por parte de calquera, mesmo sen rexistro.
+O modelo '''{{int:config-profile-wiki}}''' permite a edición por parte de calquera, mesmo sen rexistro.
 A opción '''{{int:config-profile-no-anon}}''' proporciona un control maior, pero pode desalentar os colaboradores casuais.
 
 O escenario '''{{int:config-profile-fishbowl}}''' restrinxe a edición aos usuarios aprobados, pero o público pode ollar as páxinas, incluíndo os historiais.
@@ -6690,7 +6695,7 @@ Quizais necesite algunha configuración adicional, pero pode activalas agora',
        'config-install-alreadydone' => "'''Atención:''' Semella que xa instalou MediaWiki e que o está a instalar de novo.
 Vaia ata a seguinte páxina.",
        'config-install-begin' => 'Ao premer en "{{int:config-continue}}", comezará a instalación de MediaWiki.
-Se aínda quere facer algún cambio, volva atrás.',
+Se aínda quere facer algún cambio, prema en "{{int:config-back}}".',
        'config-install-step-done' => 'feito',
        'config-install-step-failed' => 'erro',
        'config-install-extensions' => 'Incluíndo as extensións',
@@ -9686,6 +9691,15 @@ Controlla il tuo file php.ini ed assicurati che <code>session.save_path</code> 
        'config-welcome' => "=== Controllo dell'ambiente ===
 Vengono eseguiti controlli di base per vedere se questo ambiente è adatto per l'installazione di MediaWiki.
 Se hai bisogno di aiuto durante l'installazione, è necessario fornire i risultati di questi controlli.",
+       'config-sidebar' => '* [//www.mediawiki.org Pagina principale MediaWiki]
+* [//www.mediawiki.org/wiki/Aiuto:Guida ai contenuti per utenti]
+* [//www.mediawiki.org/wiki/Manuale:Guida ai contenuti per admin]
+* [//www.mediawiki.org/wiki/Manuale:FAQ FAQ]
+----
+* <doclink href=Readme>Leggimi</doclink>
+* <doclink href=ReleaseNotes>Note di versione</doclink>
+* <doclink href=Copying>Copie</doclink>
+* <doclink href=UpgradeDoc>Aggiornamenti</doclink>',
        'config-env-good' => "L'ambiente è stato controllato.
 È possibile installare MediaWiki.",
        'config-env-bad' => "L'ambiente è stato controllato.
@@ -9783,7 +9797,7 @@ Inserire un indirizzo email se si desidera effettuare l'iscrizione alla mailing
        'config-almost-done' => 'Hai quasi finito!
 Adesso puoi saltare la rimanente parte della configurazione e semplicemente installare la wiki.',
        'config-optional-continue' => 'Fammi altre domande.',
-       'config-profile-wiki' => 'Wiki tradizionale',
+       'config-profile-wiki' => 'Wiki tradizionale', # Fuzzy
        'config-profile-no-anon' => 'Creazione utenza obbligatoria',
        'config-profile-fishbowl' => 'Solo editori autorizzati',
        'config-profile-private' => 'Wiki privata',
@@ -9949,18 +9963,18 @@ Debian または Ubuntu のパッケージから PHP をインストールした
        'config-register-globals' => "'''警告:PHPの<code>[http://php.net/register_globals register_globals]</code>オプションが有効になっています。'''
 '''可能なら無効化してください。'''
 MediaWikiは動作しますが、サーバーは、潜在的なセキュリティ脆弱性を露呈します。",
-       'config-magic-quotes-runtime' => "'''致命的エラー:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]が動作しています!'''
+       'config-magic-quotes-runtime' => "'''致命的エラー: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] が動作しています!'''
 このオプションは、予期せずデータ入力を破壊します。
\81\93ã\81®ã\82ªã\83\97ã\82·ã\83§ã\83³ã\81\8cç\84¡å\8a¹å\8c\96ã\81\95ã\82\8cã\81ªã\81\84ã\81\8bã\81\8eã\82\8aã\80\81MediaWikiã\82\92ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81\97å\88©ç\94¨ã\81\99ã\82\8bã\81\93ã\81¨ã\81¯ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82",
-       'config-magic-quotes-sybase' => "'''致命的エラー:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]が動作しています!'''
\81\93ã\81®ã\82ªã\83\97ã\82·ã\83§ã\83³ã\82\92ç\84¡å\8a¹å\8c\96ã\81\97ã\81ªã\81\84é\99\90ã\82\8aã\80\81MediaWiki ã\81®ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\82\84使ç\94¨ã\81¯ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82",
+       'config-magic-quotes-sybase' => "'''致命的エラー: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] が動作しています!'''
 このオプションは、予期せずデータ入力を破壊します。
\81\93ã\81®ã\82ªã\83\97ã\82·ã\83§ã\83³ã\81\8cç\84¡å\8a¹å\8c\96ã\81\95ã\82\8cã\81ªã\81\84ã\81\8bã\81\8eã\82\8aã\80\81MediaWikiã\82\92ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81\97å\88©ç\94¨ã\81\99ã\82\8bã\81\93ã\81¨ã\81¯ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82",
-       'config-mbstring' => "'''致命的エラー:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]が動作しています!'''
-このオプションは、エラーを引き起こし、予期せずデータ入力を破壊する可能性があります。
\81\93ã\81®ã\82ªã\83\97ã\82·ã\83§ã\83³ã\81\8cç\84¡å\8a¹å\8c\96ã\81\95ã\82\8cã\81ªã\81\84ã\81\8bã\81\8eã\82\8aã\80\81MediaWikiã\82\92ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81\97å\88©ç\94¨ã\81\99ã\82\8bã\81\93ã\81¨ã\81¯ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82",
-       'config-ze1' => "'''致命的エラー:[http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]が動作しています!'''
-このオプションは、MediaWikiにおいて深刻なバグを引き起こします。
\81\93ã\81®ã\82ªã\83\97ã\82·ã\83§ã\83³ã\81\8cç\84¡å\8a¹å\8c\96ã\81\95ã\82\8cã\81ªã\81\84ã\81\8bã\81\8eã\82\8aã\80\81MediaWikiã\82\92ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81\97å\88©ç\94¨ã\81\99ã\82\8bã\81\93ã\81¨ã\81¯ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82",
\81\93ã\81®ã\82ªã\83\97ã\82·ã\83§ã\83³ã\82\92ç\84¡å\8a¹å\8c\96ã\81\97ã\81ªã\81\84é\99\90ã\82\8aã\80\81MediaWiki ã\81®ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\82\84使ç\94¨ã\81¯ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82",
+       'config-mbstring' => "'''致命的エラー: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] が動作しています!'''
+このオプションは、エラーを引き起こし、予期せずデータを破壊するおそれがあります。
\81\93ã\81®ã\82ªã\83\97ã\82·ã\83§ã\83³ã\82\92ç\84¡å\8a¹å\8c\96ã\81\97ã\81ªã\81\84é\99\90ã\82\8aã\80\81MediaWiki ã\81®ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\82\84使ç\94¨ã\81¯ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82",
+       'config-ze1' => "'''致命的エラー: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] が動作しています!'''
+このオプションは、MediaWiki において深刻なバグを引き起こします。
\81\93ã\81®ã\82ªã\83\97ã\82·ã\83§ã\83³ã\82\92ç\84¡å\8a¹å\8c\96ã\81\97ã\81ªã\81\84é\99\90ã\82\8aã\80\81MediaWiki ã\81®ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\82\84使ç\94¨ã\81¯ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82",
        'config-safe-mode' => "'''警告:''' PHPの[http://www.php.net/features.safe-mode セーフモード]が有効になっています。
 特に、ファイルのアップロードや<code>math</code>機能で、問題が発生するおそれがあります。",
        'config-xml-bad' => 'PHPのXMLモジュールが不足しています。
@@ -10178,8 +10192,8 @@ chmod a+w $3</pre>',
        'config-ns-other' => 'その他 (指定してください)',
        'config-ns-other-default' => 'マイウィキ',
        'config-project-namespace-help' => "ウィキペディアの例に従い、多くのウィキは、コンテンツのページとは分離したポリシーページを「'''プロジェクトの名前空間'''」に持っています。
-この名前空間のページのタイトルはすべて、ある接頭辞で始まります。それをここで指定することができます。
-この接頭辞はウィキの名前に由来するのが伝統的ですが、「#」や「:」のような区切り文字を含めることはできません。",
+この名前空間内のページのページ名はすべて特定の接頭辞で始まります。それをここで指定できます。
+通常、この接頭辞はウィキ名に基づきますが、「#」や「:」のような区切り文字を含めることはできません。",
        'config-ns-invalid' => '"<nowiki>$1</nowiki>"のように指定された名前空間は無効です。
 違うプロジェクト名前空間を指定してください。',
        'config-admin-box' => '管理アカウント',
@@ -10206,21 +10220,21 @@ chmod a+w $3</pre>',
        'config-optional-continue' => '私にもっと質問してください。',
        'config-optional-skip' => 'もう飽きてしまったので、とにかくウィキをインストールしてください。',
        'config-profile' => '利用者権限のプロファイル:',
-       'config-profile-wiki' => '伝統的なウィキ',
+       'config-profile-wiki' => '伝統的なウィキ', # Fuzzy
        'config-profile-no-anon' => 'アカウントの作成が必要',
        'config-profile-fishbowl' => '承認された編集者のみ',
        'config-profile-private' => '非公開ウィキ',
-       'config-profile-help' => "ã\82¦ã\82£ã\82­ã\81¯ã\80\81ã\81\9fã\81\8fã\81\95ã\82\93ã\81®äººã\81\8cå\8f¯è\83½ã\81ªé\99\90ã\82\8aã\81\9dã\81®ã\82¦ã\82£ã\82­ã\82\92ç·¨é\9b\86ã\81§ã\81\8dã\82\8bã\81¨ã\81\8dã\80\81最も優れた働きをします。
-MediaWikiã\81§ã\81¯ã\80\81æ\9c\80è¿\91ã\81®æ\9b´æ\96°ã\82\92確èª\8dã\81\97ã\80\81ç¥\9eçµ\8c質ã\81ªã\80\81ã\82\82ã\81\97ã\81\8fã\81¯æ\82ªæ\84\8fã\82\92æ\8c\81ã\81£ã\81\9få\88©ç\94¨è\80\85ã\81\8bã\82\89ã\81®æ\90\8d害ã\82\92å·®ã\81\97æ\88»ã\81\99ã\81\93ã\81¨ã\81\8cã\80\81ç°¡å\8d\98ã\81«ã\81§ã\81\8dます。
+       'config-profile-help' => "ã\82¦ã\82£ã\82­ã\81¯ã\80\81ã\81§ã\81\8dã\82\8bã\81 ã\81\91å¤\9aã\81\8fã\81®äººã\81\8cç·¨é\9b\86ã\81§ã\81\8dã\82\8bã\82\88ã\81\86ã\81«ã\81\99ã\82\8bã\81¨最も優れた働きをします。
+MediaWikiã\81§ã\81¯ã\80\81æ\9c\80è¿\91ã\81®æ\9b´æ\96°ã\82\92確èª\8dã\81\97ã\82\84ã\81\99ã\81\8fã\80\81ç¥\9eçµ\8c質ã\81ªã\80\81ã\81¾ã\81\9fã\81¯æ\82ªæ\84\8fã\82\92æ\8c\81ã\81£ã\81\9få\88©ç\94¨è\80\85ã\81\8bã\82\89ã\81®æ\90\8d害ã\82\92ç°¡å\8d\98ã\81«å·®ã\81\97æ\88»ã\81\9bます。
 
 しかし一方で、MediaWikiは、さらにさまざまな形態での利用も優れていると言われています。また、時には、すべての人にウィキ手法の利点を説得させるのは容易ではないかもしれません。
 そこで、選択肢があります。
 
-'''{{int:config-profile-wiki}}'''は、ログインしなくても、誰でも編集できるものです。
-'''{{int:config-profile-no-anon}}'''なウィキは、各編集に対してより強い説明責任を付与しますが、気軽な投稿を阻害するかもしれません。
+「'''{{int:config-profile-wiki}}'''」モデルでは、ログインしなくても、誰でも編集できます。
+「'''{{int:config-profile-no-anon}}'''」なウィキでは、各編集に対してより強い説明責任を付与しますが、気軽な投稿を阻害するかもしれません。
 
-'''{{int:config-profile-fishbowl}}'''のウィキは、承認された利用者が編集でき、一方、一般の人はページ(とその履歴)を閲覧できます。
-'''{{int:config-profile-private}}'''は、承認された利用者のみがページを閲覧でき、そのグループが編集できます。
+「'''{{int:config-profile-fishbowl}}'''」シナリオでは、承認された利用者のみが編集でき、一般の人はページ (とその履歴) を閲覧できます。
+「'''{{int:config-profile-private}}'''」では、承認された利用者のみがページを閲覧でき、そのグループが編集できます。
 
 より複雑な利用者権限の設定は、インストール後に設定できます。詳細は[//www.mediawiki.org/wiki/Manual:User_rights 関連するマニュアル]をご覧ください。",
        'config-license' => '著作権とライセンス:',
@@ -10301,7 +10315,7 @@ GFDLは有効なライセンスですが、内容を理解するのは困難で
        'config-install-alreadydone' => "'''警告:''' 既にMediaWikiがインストール済みで、再びインストールし直そうとしています。
 次のページへ進んでください。",
        'config-install-begin' => '「{{int:config-continue}}」を押すと、MediaWiki のインストールを開始できます。
-変更したい設定がある場合は、「{{int:Config-back}}」を押してください。',
+変更したい設定がある場合は、「{{int:config-back}}」を押してください。',
        'config-install-step-done' => '実行',
        'config-install-step-failed' => '失敗した',
        'config-install-extensions' => '拡張機能を含む',
@@ -10990,7 +11004,7 @@ MySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전
        'config-optional-continue' => '더 많은 질문을 물어보세요.',
        'config-optional-skip' => '지겨워요, 그냥 위키를 설치할래요.',
        'config-profile' => '사용자 권한 프로필:',
-       'config-profile-wiki' => '평범한 위키',
+       'config-profile-wiki' => '평범한 위키', # Fuzzy
        'config-profile-no-anon' => '계정 만들기 필요',
        'config-profile-fishbowl' => '승인된 편집자만 이용 가능',
        'config-profile-private' => '비공개 위키',
@@ -11006,7 +11020,7 @@ MySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전
 '''{{int:config-profile-fishbowl}}''' 같은 경우는 승인된 사용자만 편집할 수 있지만, 대중은 역사를 포함하여 페이지를 볼 수 있습니다.
 '''{{int:config-profile-private}}'''는 승인된 사용자만 같은 그룹에서 편집할 수 있고 볼 수 있습니다.
 
-더 복잡한 사용자 권한을 설정하여 설치한 후 사용할 수 있도록 하려면 [//www.mediawiki.org/wiki/Manual:User_rights 관련 매뉴얼 항목]을 참고하세요.",
+더 복잡한 사용자 권한을 설정하여 설치한 후 사용할 수 있도록 하려면 [//www.mediawiki.org/wiki/Manual:User_rights 관련 매뉴얼 항목]을 참고하세요.", # Fuzzy
        'config-license' => '저작권 및 라이선스:',
        'config-license-none' => '라이선스 바닥글 없음',
        'config-license-cc-by-sa' => '크리에이티브 커먼즈 저작자표시-동일조건변경허락',
@@ -11091,7 +11105,7 @@ GFDL 하에 라이선스 내용을 재사용하는 것도 어렵습니다.',
        'config-install-alreadydone' => "'''경고:''' 이미 미디어위키를 설치했고 다시 설치하려고 합니다.
 다음 페이지에서 진행하세요.",
        'config-install-begin' => '"{{int:config-continue}}"을 누르면 미디어위키의 설치를 시작합니다.
-그래도 바꾸는 것을 원한다면 뒤로를 누릅니다.',
+그래도 바꾸는 것을 원한다면 뒤로를 누릅니다.', # Fuzzy
        'config-install-step-done' => '완료',
        'config-install-step-failed' => '실패',
        'config-install-extensions' => '확장 기능을 포함하는 중',
@@ -12636,7 +12650,7 @@ chmod a+w $3</pre>',
        'config-optional-continue' => 'Постави ми повеќе прашања.',
        'config-optional-skip' => 'Веќе ми здосади, дај само инсталирај го викито.',
        'config-profile' => 'Профил на кориснички права:',
-       'config-profile-wiki' => 'ТÑ\80адиÑ\86ионално вики',
+       'config-profile-wiki' => 'Ð\9eÑ\82воÑ\80ено вики',
        'config-profile-no-anon' => 'Задолжително отворање сметка',
        'config-profile-fishbowl' => 'Само овластени уредници',
        'config-profile-private' => 'Приватно вики',
@@ -12646,7 +12660,7 @@ chmod a+w $3</pre>',
 Многумина имаат најдено најразлични полезни примени за МедијаВики, но понекогаш не е лесно да убедите некого во предностите на вики-концептот.
 Значи имате избор.
 
-'''{{int:config-profile-wiki}}''' — секој може да го уредува, дури и без најавување.
+'''{{int:config-profile-wiki}}''' — модел според кој секој може да уредува, дури и без најавување.
 Ако имате вики со '''задолжително отворање на сметка''', тогаш добивате повеќе контрола, но ова може даги одврати спонтаните учесници.
 
 '''{{int:config-profile-fishbowl}}''' — може да уредуваат само уредници што имаат добиено дозвола за тоа, но јавноста може да ги гледа страниците, вклучувајќи ја нивната историја.
@@ -12737,7 +12751,7 @@ chmod a+w $3</pre>',
        'config-install-alreadydone' => "'''Предупредување:''' Изгледа дека веќе го имате инсталирано МедијаВики и сега сакате да го инсталирате повторно.
 Продолжете на следната страница.",
        'config-install-begin' => 'Стискајќи на „{{int:config-continue}}“ ќе ја започнете инсталацијата на МедијаВики.
-Ако сакате да направите измени во досегашното, стиснете на „Назад“.',
+Ако сакате да направите измени во досегашното, стиснете на „{{int:config-back}}“.',
        'config-install-step-done' => 'готово',
        'config-install-step-failed' => 'не успеа',
        'config-install-extensions' => 'Вклучувам додатоци',
@@ -14113,7 +14127,7 @@ Als u wilt kunt u de overige instellingen overslaan en de wiki nu installeren.',
        'config-optional-continue' => 'Stel me meer vragen.',
        'config-optional-skip' => 'Laat dat maar, installeer gewoon de wiki.',
        'config-profile' => 'Gebruikersrechtenprofiel:',
-       'config-profile-wiki' => 'Traditionele wiki',
+       'config-profile-wiki' => 'Open wiki',
        'config-profile-no-anon' => 'Gebruiker aanmaken verplicht',
        'config-profile-fishbowl' => 'Alleen voor geautoriseerde bewerkers',
        'config-profile-private' => 'Privéwiki',
@@ -14129,7 +14143,7 @@ Een wiki met '''{{int:config-profile-no-anon}}\" biedt extra verantwoordelijkhei
 Het scenario '''{{int:config-profile-fishbowl}}''' laat gebruikers waarvoor dat is ingesteld bewerkt, maar andere gebruikers kunnen alleen pagina's bekijken, inclusief de bewerkingsgeschiedenis.
 In een '''{{int:config-profile-private}}''' kunnen alleen goedgekeurde gebruikers pagina's bekijken en bewerken.
 
-Meer complexe instellingen voor gebruikersrechten zijn te maken na de installatie; hierover is meer te lezen in de [//www.mediawiki.org/wiki/Manual:User_rights handleiding].",
+Meer complexe instellingen voor gebruikersrechten zijn te maken na de installatie; hierover is meer te lezen in de [//www.mediawiki.org/wiki/Manual:User_rights handleiding].", # Fuzzy
        'config-license' => 'Auteursrechten en licentie:',
        'config-license-none' => 'Geen licentie in de voettekst',
        'config-license-cc-by-sa' => 'Creative Commons Naamsvermelding-Gelijk delen',
@@ -14216,7 +14230,7 @@ Mogelijk moet u aanvullende instellingen maken, maar u kunt deze uitbreidingen n
        'config-install-alreadydone' => "'''Waarschuwing:''' het lijkt alsof u MediaWiki al hebt geïnstalleerd en probeert het programma opnieuw te installeren.
 Ga alstublieft door naar de volgende pagina.",
        'config-install-begin' => 'Als u nu op "{{int:config-continue}}" klikt, begint de installatie van MediaWiki.
-Als u nog wijzigingen wilt maken, klik dan op "Terug".',
+Als u nog wijzigingen wilt maken, klik dan op "Terug".', # Fuzzy
        'config-install-step-done' => 'afgerond',
        'config-install-step-failed' => 'mislukt',
        'config-install-extensions' => 'Inclusief uitbreidingen',
@@ -15583,7 +15597,7 @@ A peul adess sauté la configurassion rimanenta e instalé dlongh la wiki.",
        'config-optional-continue' => "Ciameme d'àutre chestion.",
        'config-optional-skip' => 'I son già anojà, instala mach la wiki.',
        'config-profile' => "Profil dij drit d'utent:",
-       'config-profile-wiki' => 'Wiki tradissional',
+       'config-profile-wiki' => 'Deurb wiki',
        'config-profile-no-anon' => 'A venta creé un cont',
        'config-profile-fishbowl' => 'Mach editor autorisà',
        'config-profile-private' => 'Wiki privà',
@@ -15593,7 +15607,7 @@ An MediaWiki, a l'é bel fé revisioné ij cambi recent, e buté andré minca da
 An tùit ij cas, an tanti a l'han trovà che MediaWiki a sia ùtil ant na gran varietà ëd manere, e dle vire a l'é pa bel fé convince cheidun dij vantagi dla wiki.
 Parèj a l'ha doe possibilità.
 
-Un '''{{int:config-profile-wiki}}''' a përmët a chicassìa ëd modifiché, bele sensa intré ant ël sistema.
+Ël model '''{{int:config-profile-wiki}}''' a përmët a chicassìa ëd modifiché, bele sensa intré ant ël sistema.
 Na wiki con  '''{{int:config-profile-no-anon}}''' a dà pì 'd contròl, ma a peul slontané dij contribudor casuaj.
 
 Ël senari '''{{int:config-profile-fishbowl}}''' a përmët a j'utent aprovà ëd modifiché, ma ël pùblich a peul vëdde le pàgine, comprèisa la stòria.
@@ -15682,8 +15696,8 @@ S'a conòsse nen la pòrta, cola predefinìa a l'é 11211.",
 A peulo avèj da manca ëd configurassion adissionaj, ma a peul abiliteje adess",
        'config-install-alreadydone' => "'''Avis''' A smija ch'a l'abie già instalà MediaWiki e ch'a preuva a instalelo torna.
 Për piasì, ch'a vada a la pàgina ch'a-i ven.",
-       'config-install-begin' => "An sgnacand \"{{int:config-continue}}\", a anandiërà l'istalassion ëd MediaWiki.
-S'a veul anco' fé dle modìfiche, ch'A sgnaca su andré.",
+       'config-install-begin' => 'An sgnacand "{{int:config-continue}}", a anandiërà l\'istalassion ëd MediaWiki.
+S\'a veul anco\' fé dle modìfiche, ch\'a sgnaca su "{{int:config-back}}".',
        'config-install-step-done' => 'fàit',
        'config-install-step-failed' => 'falì',
        'config-install-extensions' => "Comprende j'estension",
@@ -16669,6 +16683,7 @@ $messages['roa-tara'] = array(
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
+       'config-admin-email' => 'Indirizze e-mail:',
        'config-install-step-done' => 'fatte',
        'config-install-step-failed' => 'fallite',
        'config-install-extensions' => "'Ngludenne le estenziune",
@@ -17954,12 +17969,14 @@ MediaWiki kräver PHP $2 eller högre.',
        'config-diff3-bad' => 'GNU diff3 hittades inte.',
        'config-using-server' => 'Använder servernamn "<nowiki>$1</nowiki>".',
        'config-using-uri' => 'Använder server-URL "<nowiki>$1$2</nowiki>".',
+       'config-db-type' => 'Databastyp:',
        'config-db-wiki-settings' => 'Identifiera denna wiki',
        'config-db-name' => 'Databasnamn:',
        'config-db-name-oracle' => 'Databasschema:',
        'config-db-install-account' => 'Användarkonto för installation',
        'config-db-username' => 'Databas-användarnamn:',
        'config-db-password' => 'Databas-lösenord:',
+       'config-db-port' => 'Databasport:',
        'config-db-schema' => 'Schema för MediaWiki',
        'config-header-mysql' => 'MySQL-inställningar',
        'config-header-postgres' => 'PostgreSQL-inställningar',
@@ -17988,6 +18005,10 @@ Detta '''rekommenderas inte''' om du har problem med din wiki.",
        'config-upgrade-done-no-regenerate' => 'Uppgraderingen slutfördes.
 
 Du kan nu [$1 börja använda din wiki].',
+       'config-db-web-account-same' => 'Använd samma konto som för installation',
+       'config-db-web-create' => 'Skapa kontot om det inte redan finns',
+       'config-mysql-engine' => 'Lagringsmotor:',
+       'config-mysql-binary' => 'Binär',
        'config-mysql-utf8' => 'UTF-8',
        'config-site-name' => 'Namnet på wikin:',
        'config-site-name-blank' => 'Ange ett sidnamn.',
@@ -18014,7 +18035,7 @@ Ange ett annat användarnamn.',
 Du kan nu hoppa över återstående konfigurationer och installera wikin nu.',
        'config-optional-continue' => 'Ställ fler frågor till mig.',
        'config-optional-skip' => 'Jag är redan uttråkad, bara installera wiki.',
-       'config-profile-wiki' => 'Traditionell wiki',
+       'config-profile-wiki' => 'Öppen wiki',
        'config-profile-fishbowl' => 'Endast auktoriserade redigerare',
        'config-profile-private' => 'Privat wiki',
        'config-license' => 'Upphovsrätt och licens:',
@@ -18027,16 +18048,31 @@ Du kan nu hoppa över återstående konfigurationer och installera wikin nu.',
        'config-license-pd' => 'Allmän egendom',
        'config-license-cc-choose' => 'Välj en anpassad Creative Commons-licens',
        'config-email-settings' => 'E-postinställningar',
+       'config-email-watchlist' => 'Aktivera meddelanden för bevakningslistan',
+       'config-upload-settings' => 'Bild- och filuppladdningar',
        'config-upload-enable' => 'Aktivera filöverföringar',
+       'config-upload-deleted' => 'Mapp för raderade filer:',
        'config-logo' => 'Logotyp-URL:',
        'config-cc-again' => 'Välj igen...',
        'config-advanced-settings' => 'Avancerad konfiguration',
        'config-extensions' => 'Tillägg',
        'config-install-step-done' => 'klar',
        'config-install-step-failed' => 'misslyckades',
+       'config-install-database' => 'Konfigurerar databas',
+       'config-install-schema' => 'Skapar schema',
+       'config-install-user' => 'Skapar databasanvändare',
        'config-install-user-alreadyexists' => 'Användaren "$1" finns redan',
+       'config-install-user-create-failed' => 'Misslyckades att skapa användare "$1": $2',
+       'config-install-user-missing' => 'Den angivna användaren "$1" existerar inte.',
+       'config-install-tables' => 'Skapar tabeller',
+       'config-install-interwiki' => 'Lägger till standardtabell för interwiki',
        'config-install-interwiki-list' => 'Kunde inte läsa filen <code>interwiki.list</code>.',
+       'config-install-stats' => 'Initierar statistik',
+       'config-install-keys' => 'Genererar hemliga nycklar',
        'config-insecure-keys' => "'''Varning:''' {{PLURAL:$2|En säkerhetsnyckel|Säkerhetsnycklar}} ($1) som generades under installationen är inte helt {{PLURAL:$2|säker|säkra}} . Överväg att ändra {{PLURAL:$2|den|dem}} manuellt.",
+       'config-install-sysop' => 'Skapar administratörskonto',
+       'config-install-mainpage' => 'Skapa huvudsida med standardinnehåll',
+       'config-install-extension-tables' => 'Skapar tabeller för aktiverade tillägg',
        'config-install-done' => "'''Grattis!'''
 Du har installerat MediaWiki.
 
@@ -18059,10 +18095,10 @@ När det är klart, kan du '''[$2 gå in på din wiki]'''.",
        'mainpagedocfooter' => 'Information om hur wiki-programvaran används finns i [//meta.wikimedia.org/wiki/Help:Contents användarguiden].
 
 == Att komma igång ==
-
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista över konfigurationsinställningar]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mail list]', # Fuzzy
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mail list]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lokalisera MediaWiki för ditt språk]',
 );
 
 /** Swahili (Kiswahili)
@@ -20030,7 +20066,7 @@ chmod a+w $3</pre>',
        'config-optional-continue' => '多问我一些问题吧。',
        'config-optional-skip' => '我已经不耐烦了,赶紧安装我的wiki。',
        'config-profile' => '用户权限配置:',
-       'config-profile-wiki' => '传统wiki',
+       'config-profile-wiki' => '开放的wiki',
        'config-profile-no-anon' => '需要注册帐号',
        'config-profile-fishbowl' => '编辑受限',
        'config-profile-private' => '非公开wiki',
@@ -20107,7 +20143,7 @@ GNU自由文档许可证是维基百科曾经使用过的许可证,并迄今
 
 您可能要对它们进行额外的配置,但您现在可以启用它们。',
        'config-install-alreadydone' => "'''警告:'''您似乎已经安装了MediaWiki,并试图重新安装它。请前往下一个页面。",
-       'config-install-begin' => '点击“{{int:config-continue}}”后,您将开始安装MediaWiki。如果您还想对配置作一些修改,请点击后退。',
+       'config-install-begin' => '点击“{{int:config-continue}}”后,您将开始安装MediaWiki。如果您还想对配置作一些修改,请点击“{{int:config-back}}”。',
        'config-install-step-done' => '完成',
        'config-install-step-failed' => '失败',
        'config-install-extensions' => '正在启用扩展',
@@ -20167,7 +20203,8 @@ $3
 == 入门 ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki配置设置列表]
 * [//www.mediawiki.org/wiki/Manual:FAQ/zh-hans MediaWiki常见问题]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]', # Fuzzy
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources 本地化MediaWiki到您的语言]',
 );
 
 /** Traditional Chinese (中文(繁體)‎)
index eacf9a8..849eb86 100644 (file)
  * schema updates etc, which aren't wiki-related)
  */
 class Interwiki {
-
        // Cache - removes oldest entry when it hits limit
        protected static $smCache = array();
        const CACHE_LIMIT = 100; // 0 means unlimited, any other value is max number of entries.
 
        protected $mPrefix, $mURL, $mAPI, $mWikiID, $mLocal, $mTrans;
 
-       public function __construct( $prefix = null, $url = '', $api = '', $wikiId = '', $local = 0, $trans = 0 ) {
+       public function __construct( $prefix = null, $url = '', $api = '', $wikiId = '', $local = 0,
+               $trans = 0
+       ) {
                $this->mPrefix = $prefix;
                $this->mURL = $url;
                $this->mAPI = $api;
@@ -46,8 +47,8 @@ class Interwiki {
        /**
         * Check whether an interwiki prefix exists
         *
-        * @param $prefix String: interwiki prefix to use
-        * @return Boolean: whether it exists
+        * @param string $prefix Interwiki prefix to use
+        * @return bool Whether it exists
         */
        static public function isValidInterwiki( $prefix ) {
                $result = self::fetch( $prefix );
@@ -57,28 +58,28 @@ class Interwiki {
        /**
         * Fetch an Interwiki object
         *
-        * @param $prefix String: interwiki prefix to use
+        * @param string $prefix Interwiki prefix to use
         * @return Interwiki|null|bool
         */
        static public function fetch( $prefix ) {
                global $wgContLang;
-               if( $prefix == '' ) {
+               if ( $prefix == '' ) {
                        return null;
                }
                $prefix = $wgContLang->lc( $prefix );
-               if( isset( self::$smCache[$prefix] ) ) {
+               if ( isset( self::$smCache[$prefix] ) ) {
                        return self::$smCache[$prefix];
                }
                global $wgInterwikiCache;
-               if( $wgInterwikiCache ) {
+               if ( $wgInterwikiCache ) {
                        $iw = Interwiki::getInterwikiCached( $prefix );
                } else {
                        $iw = Interwiki::load( $prefix );
-                       if( !$iw ) {
+                       if ( !$iw ) {
                                $iw = false;
                        }
                }
-               if( self::CACHE_LIMIT && count( self::$smCache ) >= self::CACHE_LIMIT ) {
+               if ( self::CACHE_LIMIT && count( self::$smCache ) >= self::CACHE_LIMIT ) {
                        reset( self::$smCache );
                        unset( self::$smCache[key( self::$smCache )] );
                }
@@ -91,7 +92,7 @@ class Interwiki {
         *
         * @note More logic is explained in DefaultSettings.
         *
-        * @param $prefix String: interwiki prefix
+        * @param string $prefix Interwiki prefix
         * @return Interwiki object
         */
        protected static function getInterwikiCached( $prefix ) {
@@ -114,19 +115,19 @@ class Interwiki {
         *
         * @note More logic is explained in DefaultSettings.
         *
-        * @param $prefix String: database key
-        * @return String: the entry
+        * @param string $prefix Database key
+        * @return string The interwiki entry
         */
        protected static function getInterwikiCacheEntry( $prefix ) {
                global $wgInterwikiCache, $wgInterwikiScopes, $wgInterwikiFallbackSite;
                static $db, $site;
 
                wfDebug( __METHOD__ . "( $prefix )\n" );
-               if( !$db ) {
+               if ( !$db ) {
                        $db = CdbReader::open( $wgInterwikiCache );
                }
                /* Resolve site name */
-               if( $wgInterwikiScopes >= 3 && !$site ) {
+               if ( $wgInterwikiScopes >= 3 && !$site ) {
                        $site = $db->get( '__sites:' . wfWikiID() );
                        if ( $site == '' ) {
                                $site = $wgInterwikiFallbackSite;
@@ -146,15 +147,14 @@ class Interwiki {
                        $value = '';
                }
 
-
                return $value;
        }
 
        /**
         * Load the interwiki, trying first memcached then the DB
         *
-        * @param $prefix string The interwiki prefix
-        * @return Boolean: the prefix is valid
+        * @param string $prefix The interwiki prefix
+        * @return bool If $prefix is valid
         */
        protected static function load( $prefix ) {
                global $wgMemc, $wgInterwikiExpiry;
@@ -172,9 +172,9 @@ class Interwiki {
                        }
                }
 
-               if( $iwData && is_array( $iwData ) ) { // is_array is hack for old keys
+               if ( $iwData && is_array( $iwData ) ) { // is_array is hack for old keys
                        $iw = Interwiki::loadFromArray( $iwData );
-                       if( $iw ) {
+                       if ( $iw ) {
                                return $iw;
                        }
                }
@@ -203,11 +203,11 @@ class Interwiki {
        /**
         * Fill in member variables from an array (e.g. memcached result, Database::fetchRow, etc)
         *
-        * @param $mc array Associative array: row from the interwiki table
-        * @return Boolean|Interwiki whether everything was there
+        * @param array $mc Associative array: row from the interwiki table
+        * @return Interwiki|bool Interwiki object or false if $mc['iw_url'] is not set
         */
        protected static function loadFromArray( $mc ) {
-               if( isset( $mc['iw_url'] ) ) {
+               if ( isset( $mc['iw_url'] ) ) {
                        $iw = new Interwiki();
                        $iw->mURL = $mc['iw_url'];
                        $iw->mLocal = isset( $mc['iw_local'] ) ? $mc['iw_local'] : 0;
@@ -223,8 +223,8 @@ class Interwiki {
        /**
         * Fetch all interwiki prefixes from interwiki cache
         *
-        * @param $local null|string If not null, limits output to local/non-local interwikis
-        * @return Array List of prefixes
+        * @param null|string $local If not null, limits output to local/non-local interwikis
+        * @return array List of prefixes
         * @since 1.19
         */
        protected static function getAllPrefixesCached( $local ) {
@@ -232,11 +232,11 @@ class Interwiki {
                static $db, $site;
 
                wfDebug( __METHOD__ . "()\n" );
-               if( !$db ) {
+               if ( !$db ) {
                        $db = CdbReader::open( $wgInterwikiCache );
                }
                /* Resolve site name */
-               if( $wgInterwikiScopes >= 3 && !$site ) {
+               if ( $wgInterwikiScopes >= 3 && !$site ) {
                        $site = $db->get( '__sites:' . wfWikiID() );
                        if ( $site == '' ) {
                                $site = $wgInterwikiFallbackSite;
@@ -257,11 +257,11 @@ class Interwiki {
 
                $data = array();
 
-               foreach( $sources as $source ) {
+               foreach ( $sources as $source ) {
                        $list = $db->get( "__list:{$source}" );
                        foreach ( explode( ' ', $list ) as $iw_prefix ) {
                                $row = $db->get( "{$source}:{$iw_prefix}" );
-                               if( !$row ) {
+                               if ( !$row ) {
                                        continue;
                                }
 
@@ -273,8 +273,8 @@ class Interwiki {
 
                                $data[$iw_prefix] = array(
                                        'iw_prefix' => $iw_prefix,
-                                       'iw_url'    => $iw_url,
-                                       'iw_local'  => $iw_local,
+                                       'iw_url' => $iw_url,
+                                       'iw_local' => $iw_local,
                                );
                        }
                }
@@ -287,8 +287,8 @@ class Interwiki {
        /**
         * Fetch all interwiki prefixes from DB
         *
-        * @param $local string|null If not null, limits output to local/non-local interwikis
-        * @return Array List of prefixes
+        * @param string|null $local If not null, limits output to local/non-local interwikis
+        * @return array List of prefixes
         * @since 1.19
         */
        protected static function getAllPrefixesDB( $local ) {
@@ -318,8 +318,8 @@ class Interwiki {
        /**
         * Returns all interwiki prefixes
         *
-        * @param $local string|null If set, limits output to local/non-local interwikis
-        * @return Array List of prefixes
+        * @param string|null $local If set, limits output to local/non-local interwikis
+        * @return array List of prefixes
         * @since 1.19
         */
        public static function getAllPrefixes( $local = null ) {
@@ -335,15 +335,15 @@ class Interwiki {
        /**
         * Get the URL for a particular title (or with $1 if no title given)
         *
-        * @param $title String: what text to put for the article name
-        * @return String: the URL
+        * @param string $title What text to put for the article name
+        * @return string The URL
         * @note Prior to 1.19 The getURL with an argument was broken.
         *       If you if you use this arg in an extension that supports MW earlier
         *       than 1.19 please wfUrlencode and substitute $1 on your own.
         */
        public function getURL( $title = null ) {
                $url = $this->mURL;
-               if( $title !== null ) {
+               if ( $title !== null ) {
                        $url = str_replace( "$1", wfUrlencode( $title ), $url );
                }
                return $url;
@@ -352,7 +352,7 @@ class Interwiki {
        /**
         * Get the API URL for this wiki
         *
-        * @return String: the URL
+        * @return string The URL
         */
        public function getAPI() {
                return $this->mAPI;
@@ -361,7 +361,7 @@ class Interwiki {
        /**
         * Get the DB name for this wiki
         *
-        * @return String: the DB name
+        * @return string The DB name
         */
        public function getWikiID() {
                return $this->mWikiID;
@@ -371,7 +371,7 @@ class Interwiki {
         * Is this a local link from a sister project, or is
         * it something outside, like Google
         *
-        * @return Boolean
+        * @return bool
         */
        public function isLocal() {
                return $this->mLocal;
@@ -381,7 +381,7 @@ class Interwiki {
         * Can pages from this wiki be transcluded?
         * Still requires $wgEnableScaryTransclusion
         *
-        * @return Boolean
+        * @return bool
         */
        public function isTranscludable() {
                return $this->mTrans;
@@ -390,7 +390,7 @@ class Interwiki {
        /**
         * Get the name for the interwiki site
         *
-        * @return String
+        * @return string
         */
        public function getName() {
                $msg = wfMessage( 'interwiki-name-' . $this->mPrefix )->inContentLanguage();
@@ -400,7 +400,7 @@ class Interwiki {
        /**
         * Get a description for this interwiki
         *
-        * @return String
+        * @return string
         */
        public function getDescription() {
                $msg = wfMessage( 'interwiki-desc-' . $this->mPrefix )->inContentLanguage();
@@ -409,8 +409,8 @@ class Interwiki {
 
        /**
         * Return the list of interwiki fields that should be selected to create
-        * a new interwiki object.
-        * @return array
+        * a new Interwiki object.
+        * @return string[]
         */
        public static function selectFields() {
                return array(
index 927ca4e..5f3cdf5 100644 (file)
@@ -242,6 +242,13 @@ abstract class Job {
                                if ( $paramString != '' ) {
                                        $paramString .= ' ';
                                }
+
+                               if ( is_array( $value ) ) {
+                                       $value = "array(" . count( $value ) . ")";
+                               } else if ( is_object( $value ) && !method_exists( $value, '__toString' ) ) {
+                                       $value = "object(" . get_class( $value ) . ")";
+                               }
+
                                $paramString .= "$key=$value";
                        }
                }
index 6ec9b19..17f6648 100644 (file)
@@ -152,6 +152,21 @@ abstract class JobQueue {
         */
        abstract protected function doGetAcquiredCount();
 
+       /**
+        * Push a single jobs into the queue.
+        * This does not require $wgJobClasses to be set for the given job type.
+        *
+        * @param $jobs Job|Array
+        * @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
+        * @throws MWException
+        * @return bool Returns false on failure
+        */
+       final public function push( $jobs, $flags = 0 ) {
+               $jobs = is_array( $jobs ) ? $jobs : array( $jobs );
+
+               return $this->batchPush( $jobs, $flags );
+       }
+
        /**
         * Push a batch of jobs into the queue.
         * This does not require $wgJobClasses to be set for the given job type.
@@ -159,7 +174,7 @@ abstract class JobQueue {
         * @param $jobs array List of Jobs
         * @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
         * @throws MWException
-        * @return bool
+        * @return bool Returns false on failure
         */
        final public function batchPush( array $jobs, $flags = 0 ) {
                foreach ( $jobs as $job ) {
index eaa68d5..cf0215b 100644 (file)
@@ -111,7 +111,7 @@ class JobQueueGroup {
 
                $ok = true;
                foreach ( $jobsByType as $type => $jobs ) {
-                       if ( !$this->get( $type )->batchPush( $jobs ) ) {
+                       if ( !$this->get( $type )->push( $jobs ) ) {
                                $ok = false;
                        }
                }
index 4ebbc49..76c5b6a 100644 (file)
@@ -57,6 +57,7 @@ class CSSJanus {
                'lookahead_not_open_brace' => null,
                'lookahead_not_closing_paren' => null,
                'lookahead_for_closing_paren' => null,
+               'lookahead_not_letter' => '(?![a-zA-Z])',
                'lookbehind_not_letter' => '(?<![a-zA-Z])',
                'chars_within_selector' => '[^\}]*?',
                'noflip_annotation' => '\/\*\s*@noflip\s*\*\/',
@@ -104,8 +105,8 @@ class CSSJanus {
                $patterns['noflip_class'] = "/({$patterns['noflip_annotation']}{$patterns['chars_within_selector']}})/i";
                $patterns['direction_ltr'] = "/({$patterns['direction']})ltr/i";
                $patterns['direction_rtl'] = "/({$patterns['direction']})rtl/i";
-               $patterns['left'] = "/{$patterns['lookbehind_not_letter']}(left){$patterns['lookahead_not_closing_paren']}{$patterns['lookahead_not_open_brace']}/i";
-               $patterns['right'] = "/{$patterns['lookbehind_not_letter']}(right){$patterns['lookahead_not_closing_paren']}{$patterns['lookahead_not_open_brace']}/i";
+               $patterns['left'] = "/{$patterns['lookbehind_not_letter']}(left){$patterns['lookahead_not_letter']}{$patterns['lookahead_not_closing_paren']}{$patterns['lookahead_not_open_brace']}/i";
+               $patterns['right'] = "/{$patterns['lookbehind_not_letter']}(right){$patterns['lookahead_not_letter']}{$patterns['lookahead_not_closing_paren']}{$patterns['lookahead_not_open_brace']}/i";
                $patterns['left_in_url'] = "/{$patterns['lookbehind_not_letter']}(left){$patterns['lookahead_for_closing_paren']}/i";
                $patterns['right_in_url'] = "/{$patterns['lookbehind_not_letter']}(right){$patterns['lookahead_for_closing_paren']}/i";
                $patterns['ltr_in_url'] = "/{$patterns['lookbehind_not_letter']}(ltr){$patterns['lookahead_for_closing_paren']}/i";
index 1f94b43..ed9aa5a 100644 (file)
@@ -442,8 +442,11 @@ class ManualLogEntry extends LogEntryBase {
                        $this->timestamp = wfTimestampNow();
                }
 
+               # Trim spaces on user supplied text
+               $comment = trim( $this->getComment() );
+
                # Truncate for whole multibyte characters.
-               $comment = $wgContLang->truncate( $this->getComment(), 255 );
+               $comment = $wgContLang->truncate( $comment, 255 );
 
                $data = array(
                        'log_id' => $id,
index 4f699f1..ce5b053 100644 (file)
@@ -270,6 +270,7 @@ class LogFormatter {
                                                        ->inContentLanguage()->escaped();
                                                break;
                                        case 'create2':
+                                       case 'byemail':
                                                $text = wfMessage( 'newuserlog-create2-entry' )
                                                        ->rawParams( $target )->inContentLanguage()->escaped();
                                                break;
@@ -1085,7 +1086,8 @@ class PatrolLogFormatter extends LogFormatter {
 class NewUsersLogFormatter extends LogFormatter {
        protected function getMessageParameters() {
                $params = parent::getMessageParameters();
-               if ( $this->entry->getSubtype() === 'create2' ) {
+               $subtype = $this->entry->getSubtype();
+               if ( $subtype === 'create2' || $subtype === 'byemail' ) {
                        if ( isset( $params[3] ) ) {
                                $target = User::newFromId( $params[3] );
                        } else {
@@ -1108,7 +1110,8 @@ class NewUsersLogFormatter extends LogFormatter {
        }
 
        public function getPreloadTitles() {
-               if ( $this->entry->getSubtype() === 'create2' ) {
+               $subtype = $this->entry->getSubtype();
+               if ( $subtype === 'create2' || $subtype === 'byemail' ) {
                        //add the user talk to LinkBatch for the userLink
                        return array( Title::makeTitle( NS_USER_TALK, $this->entry->getTarget()->getText() ) );
                }
index 07238a0..5854e99 100644 (file)
@@ -421,6 +421,9 @@ class LogPage {
                        $comment = '';
                }
 
+               # Trim spaces on user supplied text
+               $comment = trim( $comment );
+
                # Truncate for whole multibyte characters.
                $comment = $wgContLang->truncate( $comment, 255 );
 
index 922c8e6..aebcbe7 100644 (file)
@@ -179,11 +179,6 @@ class MemcachedBagOStuff extends BagOStuff {
         * Send a debug message to the log
         */
        protected function debugLog( $text ) {
-               global $wgDebugLogGroups;
-               if( !isset( $wgDebugLogGroups['memcached'] ) ) {
-                       # Prefix message since it will end up in main debug log file
-                       $text = "memcached: $text";
-               }
                if ( substr( $text, -1 ) !== "\n" ) {
                        $text .= "\n";
                }
index 1ab59c6..faa676d 100644 (file)
@@ -1067,11 +1067,6 @@ class MWMemcached {
         * @param $text string
         */
        function _debugprint( $text ) {
-               global $wgDebugLogGroups;
-               if( !isset( $wgDebugLogGroups['memcached'] ) ) {
-                       # Prefix message since it will end up in main debug log file
-                       $text = "memcached: $text";
-               }
                wfDebugLog( 'memcached', $text );
        }
 
index f740ae8..2722e9c 100644 (file)
@@ -44,6 +44,8 @@ class XCacheBagOStuff extends BagOStuff {
                        } else {
                                $val = unserialize( $val );
                        }
+               } elseif ( is_null( $val ) ) {
+                       return false;
                }
 
                return $val;
index 8917b6d..b77309b 100644 (file)
@@ -662,21 +662,31 @@ class CoreParserFunctions {
                        $length = $cache[$page];
                } elseif( $parser->incrementExpensiveFunctionCount() ) {
                        $rev = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
-                       $id = $rev ? $rev->getPage() : 0;
+                       $pageID = $rev ? $rev->getPage() : 0;
+                       $revID = $rev ? $rev->getId() : 0;
                        $length = $cache[$page] = $rev ? $rev->getSize() : 0;
 
                        // Register dependency in templatelinks
-                       $parser->mOutput->addTemplate( $title, $id, $rev ? $rev->getId() : 0 );
+                       $parser->mOutput->addTemplate( $title, $pageID, $revID );
                }
                return self::formatRaw( $length, $raw );
        }
 
        /**
-       * Returns the requested protection level for the current page
+        * Returns the requested protection level for the current page
+        *
+        * @param Parser $parser
+        * @param string $type
+        * @param string $title
+        *
         * @return string
         */
-       static function protectionlevel( $parser, $type = '' ) {
-               $restrictions = $parser->mTitle->getRestrictions( strtolower( $type ) );
+       static function protectionlevel( $parser, $type = '', $title = '' ) {
+               $titleObject = Title::newFromText( $title );
+               if ( !( $titleObject instanceof Title ) ) {
+                       $titleObject = $parser->mTitle;
+               }
+               $restrictions = $titleObject->getRestrictions( strtolower( $type ) );
                # Title::getRestrictions returns an array, its possible it may have
                # multiple values in the future
                return implode( $restrictions, ',' );
index d47ccb9..8f892a3 100644 (file)
@@ -4492,14 +4492,14 @@ class Parser {
                        '~~~' => $sigText
                ) );
 
-               # Context links ("pipe trick"): [[|name]] and [[name (context)|]]
+               # Context links ("pipe tricks"): [[|name]] and [[name (context)|]]
                $tc = '[' . Title::legalChars() . ']';
                $nc = '[ _0-9A-Za-z\x80-\xff-]'; # Namespaces can use non-ascii!
 
-               $p1 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\))\\|]]/";                  # [[ns:page (context)|]]
-               $p4 = "/\[\[(:?$nc+:|:|)($tc+?)( ?($tc+))\\|]]/";                    # [[ns:page(context)|]] (double-width brackets, added in r40257)
-               $p3 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\)|)((?:, |,)$tc+|)\\|]]/"; # [[ns:page (context), context|]]
-               $p2 = "/\[\[\\|($tc+)]]/";                                             # [[|page]]
+               $p1 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\))\\|]]/";                   # [[ns:page (context)|]]
+               $p4 = "/\[\[(:?$nc+:|:|)($tc+?)( ?($tc+))\\|]]/";                           # [[ns:page(context)|]] (double-width brackets, added in r40257)
+               $p3 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\)|)((?:, |,)$tc+|)\\|]]/";         # [[ns:page (context), context|]] (using either single or double-width comma)
+               $p2 = "/\[\[\\|($tc+)]]/";                                              # [[|page]] (reverse pipe trick: add context from page title)
 
                # try $p1 first, to turn "[[A, B (C)|]]" into "[[A, B (C)|A, B]]"
                $text = preg_replace( $p1, '[[\\1\\2\\3|\\2]]', $text );
@@ -4988,13 +4988,17 @@ class Parser {
                                                $alt = $this->stripAltText( $match, false );
                                        }
                                        elseif( $match = $magicWordLink->matchVariableStartToEnd( $parameterMatch ) ){
-                                               $link = strip_tags($this->replaceLinkHoldersText($match));
+                                               $linkValue = strip_tags( $this->replaceLinkHoldersText( $match ) );
                                                $chars = self::EXT_LINK_URL_CLASS;
                                                $prots = $this->mUrlProtocols;
                                                //check to see if link matches an absolute url, if not then it must be a wiki link.
-                                               if(!preg_match( "/^($prots)$chars+$/u", $link)){
-                                                       $localLinkTitle = Title::newFromText($link);
-                                                       $link = $localLinkTitle->getLocalURL();
+                                               if ( preg_match( "/^($prots)$chars+$/u", $linkValue ) ) {
+                                                       $link = $linkValue;
+                                               } else {
+                                                       $localLinkTitle = Title::newFromText( $linkValue );
+                                                       if ( $localLinkTitle !== null ) {
+                                                               $link = $localLinkTitle->getLocalURL();
+                                                       }
                                                }
                                        }
                                        else {
index b4bd98c..5abe226 100644 (file)
@@ -176,6 +176,7 @@ class ResourceLoader {
                } catch ( Exception $exception ) {
                        // Return exception as a comment
                        $result = $this->makeComment( $exception->__toString() );
+                       $this->hasErrors = true;
                }
 
                wfProfileOut( __METHOD__ );
@@ -435,6 +436,7 @@ class ResourceLoader {
 
                wfProfileIn( __METHOD__ );
                $errors = '';
+               $this->hasErrors = false;
 
                // Split requested modules into two groups, modules and missing
                $modules = array();
@@ -446,6 +448,7 @@ class ResourceLoader {
                                // This is a security issue, see bug 34907.
                                if ( $module->getGroup() === 'private' ) {
                                        $errors .= $this->makeComment( "Cannot show private module \"$name\"" );
+                                       $this->hasErrors = true;
                                        continue;
                                }
                                $modules[$name] = $this->getModule( $name );
@@ -460,6 +463,7 @@ class ResourceLoader {
                } catch( Exception $e ) {
                        // Add exception to the output as a comment
                        $errors .= $this->makeComment( $e->__toString() );
+                       $this->hasErrors = true;
                }
 
                wfProfileIn( __METHOD__.'-getModifiedTime' );
@@ -477,14 +481,12 @@ class ResourceLoader {
                        } catch ( Exception $e ) {
                                // Add exception to the output as a comment
                                $errors .= $this->makeComment( $e->__toString() );
+                               $this->hasErrors = true;
                        }
                }
 
                wfProfileOut( __METHOD__.'-getModifiedTime' );
 
-               // Send content type and cache related headers
-               $this->sendResponseHeaders( $context, $mtime );
-
                // If there's an If-Modified-Since header, respond with a 304 appropriately
                if ( $this->tryRespondLastModified( $context, $mtime ) ) {
                        wfProfileOut( __METHOD__ );
@@ -501,6 +503,7 @@ class ResourceLoader {
                // response in a comment if we're in debug mode.
                if ( $context->getDebug() && strlen( $warnings = ob_get_contents() ) ) {
                        $response = $this->makeComment( $warnings ) . $response;
+                       $this->hasErrors = true;
                }
 
                // Save response to file cache unless there are errors
@@ -515,6 +518,9 @@ class ResourceLoader {
                        }
                }
 
+               // Send content type and cache related headers
+               $this->sendResponseHeaders( $context, $mtime, $this->hasErrors );
+
                // Remove the output buffer and output the response
                ob_end_clean();
                echo $response;
@@ -526,13 +532,15 @@ class ResourceLoader {
         * Send content type and last modified headers to the client.
         * @param $context ResourceLoaderContext
         * @param $mtime string TS_MW timestamp to use for last-modified
+        * @param $error bool Whether there are commented-out errors in the response
         * @return void
         */
-       protected function sendResponseHeaders( ResourceLoaderContext $context, $mtime ) {
+       protected function sendResponseHeaders( ResourceLoaderContext $context, $mtime, $errors ) {
                global $wgResourceLoaderMaxage;
                // If a version wasn't specified we need a shorter expiry time for updates
                // to propagate to clients quickly
-               if ( is_null( $context->getVersion() ) ) {
+               // If there were errors, we also need a shorter expiry time so we can recover quickly
+               if ( is_null( $context->getVersion() ) || $errors ) {
                        $maxage  = $wgResourceLoaderMaxage['unversioned']['client'];
                        $smaxage = $wgResourceLoaderMaxage['unversioned']['server'];
                // If a version was specified we can use a longer expiry time since changing
@@ -680,6 +688,7 @@ class ResourceLoader {
                        } catch ( Exception $e ) {
                                // Add exception to the output as a comment
                                $exceptions .= $this->makeComment( $e->__toString() );
+                               $this->hasErrors = true;
                        }
                } else {
                        $blobs = array();
@@ -785,6 +794,7 @@ class ResourceLoader {
                        } catch ( Exception $e ) {
                                // Add exception to the output as a comment
                                $exceptions .= $this->makeComment( $e->__toString() );
+                               $this->hasErrors = true;
 
                                // Register module as missing
                                $missing[] = $name;
index fa84843..fad0027 100644 (file)
@@ -312,15 +312,19 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                // Collect referenced files
                $this->localFileRefs = array_unique( $this->localFileRefs );
                // If the list has been modified since last time we cached it, update the cache
-               if ( $this->localFileRefs !== $this->getFileDependencies( $context->getSkin() ) && !wfReadOnly() ) {
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->replace( 'module_deps',
-                               array( array( 'md_module', 'md_skin' ) ), array(
-                                       'md_module' => $this->getName(),
-                                       'md_skin' => $context->getSkin(),
-                                       'md_deps' => FormatJson::encode( $this->localFileRefs ),
-                               )
-                       );
+               try {
+                       if ( $this->localFileRefs !== $this->getFileDependencies( $context->getSkin() ) ) {
+                               $dbw = wfGetDB( DB_MASTER );
+                               $dbw->replace( 'module_deps',
+                                       array( array( 'md_module', 'md_skin' ) ), array(
+                                               'md_module' => $this->getName(),
+                                               'md_skin' => $context->getSkin(),
+                                               'md_deps' => FormatJson::encode( $this->localFileRefs ),
+                                       )
+                               );
+                       }
+               } catch ( Exception $e ) {
+                       wfDebug( __METHOD__ . " failed to update DB: $e\n" );
                }
                return $styles;
        }
index b2e2e71..d4613aa 100644 (file)
  *
  * @ingroup Site
  */
-class MediaWikiSite extends SiteObject {
+class MediaWikiSite extends Site {
 
        const PATH_FILE = 'file_path';
        const PATH_PAGE = 'page_path';
 
        /**
         * @since 1.21
+        * @deprecated Just use the constructor or the factory Site::newForType
         *
         * @param integer $globalId
         *
         * @return MediaWikiSite
         */
        public static function newFromGlobalId( $globalId ) {
-               return SitesTable::singleton()->newRow( array(
-                       'type' => Site::TYPE_MEDIAWIKI,
-                       'global_key' => $globalId,
-               ), true );
+               $site = new static();
+               $site->setGlobalId( $globalId );
+               return $site;
+       }
+
+       /**
+        * Constructor.
+        *
+        * @since 1.21
+        *
+        * @param string $type
+        */
+       public function __construct( $type = self::TYPE_MEDIAWIKI ) {
+               parent::__construct( $type );
        }
 
        /**
@@ -167,7 +178,7 @@ class MediaWikiSite extends SiteObject {
         * @param array $externalData A reply from the API on a external server.
         * @param string $pageTitle Identifies the page at the external site, needing normalization.
         *
-        * @return array|false a 'page' structure representing the page identified by $pageTitle.
+        * @return array|boolean a 'page' structure representing the page identified by $pageTitle.
         */
        private static function extractPageRecord( $externalData, $pageTitle ) {
                // If there is a special case with only one returned page
@@ -290,16 +301,16 @@ class MediaWikiSite extends SiteObject {
        }
 
        /**
-        * @see Site::getPagePath
+        * @see Site::getPageUrl
         *
         * This implementation returns a URL constructed using the path returned by getLinkPath().
-        * In addition to the default behaviour implemented by SiteObject::getPageUrl(), this
+        * In addition to the default behaviour implemented by Site::getPageUrl(), this
         * method converts the $pageName to DBKey-format by replacing spaces with underscores
         * before using it in the URL.
         *
         * @since 1.21
         *
-        * @param $pagename string: Page name (default: false)
+        * @param string|boolean $pageName Page name or false (default: false)
         *
         * @return string
         */
@@ -325,7 +336,7 @@ class MediaWikiSite extends SiteObject {
         *
         * @since 1.21
         *
-        * @param string|false $path
+        * @param string|boolean $path
         *
         * @return string
         */
index 200a006..5394860 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Interface for site objects.
+ * Represents a single site.
  *
  * 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
@@ -26,7 +26,7 @@
  * @license GNU GPL v2+
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
-interface Site {
+class Site implements Serializable {
 
        const TYPE_UNKNOWN = 'unknown';
        const TYPE_MEDIAWIKI = 'mediawiki';
@@ -38,42 +38,140 @@ interface Site {
 
        const SOURCE_LOCAL = 'local';
 
+       const PATH_LINK = 'link';
+
+
        /**
-        * Returns the global site identifier (ie enwiktionary).
+        * A version ID that identifies the serialization structure used by getSerializationData()
+        * and unserialize(). This is useful for constructing cache keys in cases where the cache relies
+        * on serialization for storing the SiteList.
         *
+        * @var string A string uniquely identifying the version of the serialization structure.
+        */
+       const SERIAL_VERSION_ID = '2013-01-23';
+
+       /**
         * @since 1.21
         *
-        * @return string
+        * @var string|null
         */
-       public function getGlobalId();
+       protected $globalId = null;
 
        /**
-        * Sets the global site identifier (ie enwiktionary).
+        * @since 1.21
         *
+        * @var string
+        */
+       protected $type = self::TYPE_UNKNOWN;
+
+       /**
         * @since 1.21
         *
-        * @param string $globalId
+        * @var string
         */
-       public function setGlobalId( $globalId );
+       protected $group = self::GROUP_NONE;
 
        /**
-        * Returns the type of the site (ie mediawiki).
+        * @since 1.21
         *
+        * @var string
+        */
+       protected $source = self::SOURCE_LOCAL;
+
+       /**
         * @since 1.21
         *
-        * @return string
+        * @var string|null
+        */
+       protected $languageCode = null;
+
+       /**
+        * Holds the local ids for this site.
+        * local id type => [ ids for this type (strings) ]
+        *
+        * @since 1.21
+        *
+        * @var array[]
+        */
+       protected $localIds = array();
+
+       /**
+        * @since 1.21
+        *
+        * @var array
+        */
+       protected $extraData = array();
+
+       /**
+        * @since 1.21
+        *
+        * @var array
+        */
+       protected $extraConfig = array();
+
+       /**
+        * @since 1.21
+        *
+        * @var bool
         */
-       public function getType();
+       protected $forward = false;
 
        /**
-        * Sets the type of the site (ie mediawiki).
-        * TODO: remove, we cannot change this after instantiation
+        * @since 1.21
+        *
+        * @var int|null
+        */
+       protected $internalId = null;
+
+       /**
+        * Constructor.
         *
         * @since 1.21
         *
         * @param string $type
         */
-       public function setType( $type );
+       public function __construct( $type = self::TYPE_UNKNOWN ) {
+               $this->type = $type;
+       }
+
+       /**
+        * Returns the global site identifier (ie enwiktionary).
+        *
+        * @since 1.21
+        *
+        * @return string|null
+        */
+       public function getGlobalId() {
+               return $this->globalId;
+       }
+
+       /**
+        * Sets the global site identifier (ie enwiktionary).
+        *
+        * @since 1.21
+        *
+        * @param string|null $globalId
+        *
+        * @throws MWException
+        */
+       public function setGlobalId( $globalId ) {
+               if ( $globalId !== null && !is_string( $globalId ) ) {
+                       throw new MWException( '$globalId needs to be string or null' );
+               }
+
+               $this->globalId = $globalId;
+       }
+
+       /**
+        * Returns the type of the site (ie mediawiki).
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       public function getType() {
+               return $this->type;
+       }
 
        /**
         * Gets the type of the site (ie wikipedia).
@@ -82,7 +180,9 @@ interface Site {
         *
         * @return string
         */
-       public function getGroup();
+       public function getGroup() {
+               return $this->group;
+       }
 
        /**
         * Sets the type of the site (ie wikipedia).
@@ -90,8 +190,16 @@ interface Site {
         * @since 1.21
         *
         * @param string $group
+        *
+        * @throws MWException
         */
-       public function setGroup( $group );
+       public function setGroup( $group ) {
+               if ( !is_string( $group ) ) {
+                       throw new MWException( '$group needs to be a string' );
+               }
+
+               $this->group = $group;
+       }
 
        /**
         * Returns the source of the site data (ie 'local', 'wikidata', 'my-magical-repo').
@@ -100,7 +208,9 @@ interface Site {
         *
         * @return string
         */
-       public function getSource();
+       public function getSource() {
+               return $this->source;
+       }
 
        /**
         * Sets the source of the site data (ie 'local', 'wikidata', 'my-magical-repo').
@@ -108,18 +218,46 @@ interface Site {
         * @since 1.21
         *
         * @param string $source
+        *
+        * @throws MWException
         */
-       public function setSource( $source );
+       public function setSource( $source ) {
+               if ( !is_string( $source ) ) {
+                       throw new MWException( '$source needs to be a string' );
+               }
+
+               $this->source = $source;
+       }
 
        /**
-        * Returns the protocol of the site, ie 'http://', 'irc://', '//'
-        * Or false if it's not known.
+        * Gets if site.tld/path/key:pageTitle should forward users to  the page on
+        * the actual site, where "key" is the local identifier.
         *
         * @since 1.21
         *
-        * @return string|false
+        * @return boolean
         */
-       public function getProtocol();
+       public function shouldForward() {
+               return $this->forward;
+       }
+
+       /**
+        * Sets if site.tld/path/key:pageTitle should forward users to  the page on
+        * the actual site, where "key" is the local identifier.
+        *
+        * @since 1.21
+        *
+        * @param boolean $shouldForward
+        *
+        * @throws MWException
+        */
+       public function setForward( $shouldForward ) {
+               if ( !is_bool( $shouldForward ) ) {
+                       throw new MWException( '$shouldForward needs to be a boolean' );
+               }
+
+               $this->forward = $shouldForward;
+       }
 
        /**
         * Returns the domain of the site, ie en.wikipedia.org
@@ -127,9 +265,95 @@ interface Site {
         *
         * @since 1.21
         *
-        * @return string|false
+        * @return string|null
+        */
+       public function getDomain() {
+               $path = $this->getLinkPath();
+
+               if ( $path === null ) {
+                       return null;
+               }
+
+               return parse_url( $path, PHP_URL_HOST );
+       }
+
+       /**
+        * Returns the protocol of the site.
+        *
+        * @since 1.21
+        *
+        * @throws MWException
+        * @return string
+        */
+       public function getProtocol() {
+               $path = $this->getLinkPath();
+
+               if ( $path === null ) {
+                       return '';
+               }
+
+               $protocol = parse_url( $path, PHP_URL_SCHEME );
+
+               // Malformed URL
+               if ( $protocol === false ) {
+                       throw new MWException( "failed to parse URL '$path'" );
+               }
+
+               // No schema
+               if ( $protocol === null ) {
+                       // Used for protocol relative URLs
+                       $protocol = '';
+               }
+
+               return $protocol;
+       }
+
+       /**
+        * Sets the path used to construct links with.
+        * Shall be equivalent to setPath( getLinkPathType(), $fullUrl ).
+        *
+        * @param string $fullUrl
+        *
+        * @since 1.21
+        *
+        * @throws MWException
+        */
+       public function setLinkPath( $fullUrl ) {
+               $type = $this->getLinkPathType();
+
+               if ( $type === null ) {
+                       throw new MWException( "This Site does not support link paths." );
+               }
+
+               $this->setPath( $type, $fullUrl );
+       }
+
+       /**
+        * Returns the path used to construct links with or false if there is no such path.
+        *
+        * Shall be equivalent to getPath( getLinkPathType() ).
+        *
+        * @return string|null
+        */
+       public function getLinkPath() {
+               $type = $this->getLinkPathType();
+               return $type === null ? null: $this->getPath( $type );
+       }
+
+       /**
+        * Returns the main path type, that is the type of the path that should generally be used to construct links
+        * to the target site.
+        *
+        * This default implementation returns Site::PATH_LINK as the default path type. Subclasses can override this
+        * to define a different default path type, or return false to disable site links.
+        *
+        * @since 1.21
+        *
+        * @return string|null
         */
-       public function getDomain();
+       public function getLinkPathType() {
+               return self::PATH_LINK;
+       }
 
        /**
         * Returns the full URL for the given page on the site.
@@ -138,79 +362,155 @@ interface Site {
         * This generated URL is usually based upon the path returned by getLinkPath(),
         * but this is not a requirement.
         *
+        * This implementation returns a URL constructed using the path returned by getLinkPath().
+        *
         * @since 1.21
-        * @see Site::getLinkPath()
         *
-        * @param bool|String $page
+        * @param bool|String $pageName
         *
-        * @return string|false
+        * @return string|boolean false
         */
-       public function getPageUrl( $page = false );
+       public function getPageUrl( $pageName = false ) {
+               $url = $this->getLinkPath();
+
+               if ( $url === false ) {
+                       return false;
+               }
+
+               if ( $pageName !== false ) {
+                       $url = str_replace( '$1', rawurlencode( $pageName ), $url ) ;
+               }
+
+               return $url;
+       }
 
        /**
-        * Returns language code of the sites primary language.
-        * Or false if it's not known.
+        * Returns $pageName without changes.
+        * Subclasses may override this to apply some kind of normalization.
+        *
+        * @see Site::normalizePageName
         *
         * @since 1.21
         *
-        * @return string|false
+        * @param string $pageName
+        *
+        * @return string
         */
-       public function getLanguageCode();
+       public function normalizePageName( $pageName ) {
+               return $pageName;
+       }
 
        /**
-        * Sets language code of the sites primary language.
+        * Returns the type specific fields.
         *
         * @since 1.21
         *
-        * @param string $languageCode
+        * @return array
         */
-       public function setLanguageCode( $languageCode );
+       public function getExtraData() {
+               return $this->extraData;
+       }
 
        /**
-        * Returns the normalized, canonical form of the given page name.
-        * How normalization is performed or what the properties of a normalized name are depends on the site.
-        * The general contract of this method is that the normalized form shall refer to the same content
-        * as the original form, and any other page name referring to the same content will have the same normalized form.
+        * Sets the type specific fields.
         *
-        * Note that this method may call out to the target site to perform the normalization, so it may be slow
-        * and fail due to IO errors.
+        * @since 1.21
+        *
+        * @param array $extraData
+        */
+       public function setExtraData( array $extraData ) {
+               $this->extraData = $extraData;
+       }
+
+       /**
+        * Returns the type specific config.
         *
         * @since 1.21
         *
-        * @param string $pageName
+        * @return array
+        */
+       public function getExtraConfig() {
+               return $this->extraConfig;
+       }
+
+       /**
+        * Sets the type specific config.
         *
-        * @return string the normalized page name
+        * @since 1.21
+        *
+        * @param array $extraConfig
         */
-       public function normalizePageName( $pageName );
+       public function setExtraConfig( array $extraConfig ) {
+               $this->extraConfig = $extraConfig;
+       }
 
        /**
-        * Returns the interwiki link identifiers that can be used for this site.
+        * Returns language code of the sites primary language.
+        * Or null if it's not known.
         *
         * @since 1.21
         *
-        * @return array of string
+        * @return string|null
         */
-       public function getInterwikiIds();
+       public function getLanguageCode() {
+               return $this->languageCode;
+       }
 
        /**
-        * Returns the equivalent link identifiers that can be used to make
-        * the site show up in interfaces such as the "language links" section.
+        * Sets language code of the sites primary language.
         *
         * @since 1.21
         *
-        * @return array of string
+        * @param string $languageCode
         */
-       public function getNavigationIds();
+       public function setLanguageCode( $languageCode ) {
+               $this->languageCode = $languageCode;
+       }
 
        /**
-        * Adds an local identifier to the site.
+        * Returns the set internal identifier for the site.
         *
         * @since 1.21
         *
-        * @param string $type The type of the identifier, element of the Site::ID_ enum
+        * @return string|null
+        */
+       public function getInternalId() {
+               return $this->internalId;
+       }
+
+       /**
+        * Sets the internal identifier for the site.
+        * This typically is a primary key in a db table.
+        *
+        * @since 1.21
+        *
+        * @param int|null $internalId
+        */
+       public function setInternalId( $internalId = null ) {
+               $this->internalId = $internalId;
+       }
+
+       /**
+        * Adds a local identifier.
+        *
+        * @since 1.21
+        *
+        * @param string $type
         * @param string $identifier
         */
-       public function addLocalId( $type, $identifier );
+       public function addLocalId( $type, $identifier ) {
+               if ( $this->localIds === false ) {
+                       $this->localIds = array();
+               }
+
+               if ( !array_key_exists( $type, $this->localIds ) ) {
+                       $this->localIds[$type] = array();
+               }
+
+               if ( !in_array( $identifier, $this->localIds[$type] ) ) {
+                       $this->localIds[$type][] = $identifier;
+               }
+       }
 
        /**
         * Adds an interwiki id to the site.
@@ -219,7 +519,9 @@ interface Site {
         *
         * @param string $identifier
         */
-       public function addInterwikiId( $identifier );
+       public function addInterwikiId( $identifier ) {
+               $this->addLocalId( self::ID_INTERWIKI, $identifier );
+       }
 
        /**
         * Adds a navigation id to the site.
@@ -228,35 +530,66 @@ interface Site {
         *
         * @param string $identifier
         */
-       public function addNavigationId( $identifier );
+       public function addNavigationId( $identifier ) {
+               $this->addLocalId( self::ID_EQUIVALENT, $identifier );
+       }
+
+       /**
+        * Returns the interwiki link identifiers that can be used for this site.
+        *
+        * @since 1.21
+        *
+        * @return string[]
+        */
+       public function getInterwikiIds() {
+               return array_key_exists( self::ID_INTERWIKI, $this->localIds ) ? $this->localIds[self::ID_INTERWIKI] : array();
+       }
 
        /**
-        * Saves the site.
+        * Returns the equivalent link identifiers that can be used to make
+        * the site show up in interfaces such as the "language links" section.
         *
         * @since 1.21
         *
-        * @param string|null $functionName
+        * @return string[]
         */
-       public function save( $functionName = null );
+       public function getNavigationIds() {
+               return array_key_exists( self::ID_EQUIVALENT, $this->localIds ) ? $this->localIds[self::ID_EQUIVALENT] : array();
+       }
 
        /**
-        * Returns the internal ID of the site.
+        * Returns all local ids
         *
         * @since 1.21
         *
-        * @return integer
+        * @return array[]
         */
-       public function getInternalId();
+       public function getLocalIds() {
+               return $this->localIds;
+       }
 
        /**
-        * Sets the provided url as path of the specified type.
+        * Sets the path used to construct links with.
+        * Shall be equivalent to setPath( getLinkPathType(), $fullUrl ).
         *
         * @since 1.21
         *
         * @param string $pathType
         * @param string $fullUrl
+        *
+        * @throws MWException
         */
-       public function setPath( $pathType, $fullUrl );
+       public function setPath( $pathType, $fullUrl ) {
+               if ( !is_string( $fullUrl ) ) {
+                       throw new MWException( '$fullUrl needs to be a string' );
+               }
+
+               if ( !array_key_exists( 'paths', $this->extraData ) ) {
+                       $this->extraData['paths'] = array();
+               }
+
+               $this->extraData['paths'][$pathType] = $fullUrl;
+       }
 
        /**
         * Returns the path of the provided type or false if there is no such path.
@@ -265,52 +598,106 @@ interface Site {
         *
         * @param string $pathType
         *
-        * @return string|false
+        * @return string|null
         */
-       public function getPath( $pathType );
+       public function getPath( $pathType ) {
+               $paths = $this->getAllPaths();
+               return array_key_exists( $pathType, $paths ) ? $paths[$pathType] : null;
+       }
 
        /**
-        * Sets the path used to construct links with.
-        * Shall be equivalent to setPath( getLinkPathType(), $fullUrl ).
-        *
-        * @param string $fullUrl
+        * Returns the paths as associative array.
+        * The keys are path types, the values are the path urls.
         *
         * @since 1.21
+        *
+        * @return string[]
         */
-       public function setLinkPath( $fullUrl );
+       public function getAllPaths() {
+               return array_key_exists( 'paths', $this->extraData ) ? $this->extraData['paths'] : array();
+       }
 
        /**
-        * Returns the path used to construct links with or false if there is no such path.
-        * Shall be equivalent to getPath( getLinkPathType() ).
+        * Removes the path of the provided type if it's set.
+        *
+        * @since 1.21
         *
-        * @return string|false
+        * @param string $pathType
         */
-       public function getLinkPath();
+       public function removePath( $pathType ) {
+               if ( array_key_exists( 'paths', $this->extraData ) ) {
+                       unset( $this->extraData['paths'][$pathType] );
+               }
+       }
 
        /**
-        * Returns the path type used to construct links with.
+        * @since 1.21
+        *
+        * @param string $siteType
         *
-        * @return string|false
+        * @return Site
         */
-       public function getLinkPathType();
+       public static function newForType( $siteType ) {
+               global $wgSiteTypes;
+
+               if ( array_key_exists( $siteType, $wgSiteTypes ) ) {
+                       return new $wgSiteTypes[$siteType]();
+               }
+
+               return new Site();
+       }
 
        /**
-        * Returns the paths as associative array.
-        * The keys are path types, the values are the path urls.
+        * @see Serializable::serialize
         *
         * @since 1.21
         *
-        * @return array of string
+        * @return string
         */
-       public function getAllPaths();
+       public function serialize() {
+               $fields = array(
+                       'globalid' => $this->globalId,
+                       'type' => $this->type,
+                       'group' => $this->group,
+                       'source' => $this->source,
+                       'language' => $this->languageCode,
+                       'localids' => $this->localIds,
+                       'config' => $this->extraConfig,
+                       'data' => $this->extraData,
+                       'forward' => $this->forward,
+                       'internalid' => $this->internalId,
+
+               );
+
+               return serialize( $fields );
+       }
 
        /**
-        * Removes the path of the provided type if it's set.
+        * @see Serializable::unserialize
         *
         * @since 1.21
         *
-        * @param string $pathType
+        * @param string $serialized
         */
-       public function removePath( $pathType );
+       public function unserialize( $serialized ) {
+               $fields = unserialize( $serialized );
+
+               $this->__construct( $fields['type'] );
+
+               $this->setGlobalId( $fields['globalid'] );
+               $this->setGroup( $fields['group'] );
+               $this->setSource( $fields['source'] );
+               $this->setLanguageCode( $fields['language'] );
+               $this->localIds = $fields['localids'];
+               $this->setExtraConfig( $fields['config'] );
+               $this->setExtraData( $fields['data'] );
+               $this->setForward( $fields['forward'] );
+               $this->setInternalId( $fields['internalid'] );
+       }
 
-}
\ No newline at end of file
+}
+
+/**
+ * @deprecated
+ */
+class SiteObject extends Site {}
diff --git a/includes/site/SiteArray.php b/includes/site/SiteArray.php
deleted file mode 100644 (file)
index 5d2c86b..0000000
+++ /dev/null
@@ -1,260 +0,0 @@
-<?php
-
-/**
- * Implementation of SiteList using GenericArrayObject.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @since 1.21
- *
- * @file
- * @ingroup Site
- *
- * @license GNU GPL v2+
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-class SiteArray extends GenericArrayObject implements SiteList {
-       /**
-        * Update this version number when the SiteArray format
-        * changes in an incompatible way
-        *
-        * @since 1.21
-        *
-        * @var integer
-        */
-       const CACHE_VERSION = 1;
-
-       /**
-        * Version number of the SiteArray format of the currently used object
-        *
-        * @since 1.21
-        *
-        * @var integer
-        */
-       public $cacheVersion = self::CACHE_VERSION;
-
-       /**
-        * Internal site identifiers pointing to their sites offset value.
-        *
-        * @since 1.21
-        *
-        * @var array of integer
-        */
-       protected $byInternalId = array();
-
-       /**
-        * Global site identifiers pointing to their sites offset value.
-        *
-        * @since 1.21
-        *
-        * @var array of string
-        */
-       protected $byGlobalId = array();
-
-       /**
-        * @see GenericArrayObject::getObjectType
-        *
-        * @since 1.21
-        *
-        * @return string
-        */
-       public function getObjectType() {
-               return 'Site';
-       }
-
-       /**
-        * @see GenericArrayObject::preSetElement
-        *
-        * @since 1.21
-        *
-        * @param int|string $index
-        * @param Site $site
-        *
-        * @return boolean
-        */
-       protected function preSetElement( $index, $site ) {
-               if ( $this->hasSite( $site->getGlobalId() ) ) {
-                       $this->removeSite( $site->getGlobalId() );
-               }
-
-               $this->byGlobalId[$site->getGlobalId()] = $index;
-               $this->byInternalId[$site->getInternalId()] = $index;
-
-               return true;
-       }
-
-       /**
-        * @see ArrayObject::offsetUnset()
-        *
-        * @since 1.21
-        *
-        * @param mixed $index
-        */
-       public function offsetUnset( $index ) {
-               if ( $this->offsetExists( $index ) ) {
-                       /**
-                        * @var Site $site
-                        */
-                       $site = $this->offsetGet( $index );
-
-                       unset( $this->byGlobalId[$site->getGlobalId()] );
-                       unset( $this->byInternalId[$site->getInternalId()] );
-               }
-
-               parent::offsetUnset( $index );
-       }
-
-       /**
-        * @see SiteList::getGlobalIdentifiers
-        *
-        * @since 1.21
-        *
-        * @return array
-        */
-       public function getGlobalIdentifiers() {
-               return array_keys( $this->byGlobalId );
-       }
-
-       /**
-        * @see SiteList::hasSite
-        *
-        * @param string $globalSiteId
-        *
-        * @return boolean
-        */
-       public function hasSite( $globalSiteId ) {
-               return array_key_exists( $globalSiteId, $this->byGlobalId );
-       }
-
-       /**
-        * @see SiteList::getSite
-        *
-        * @since 1.21
-        *
-        * @param string $globalSiteId
-        *
-        * @return Site
-        */
-       public function getSite( $globalSiteId ) {
-               return $this->offsetGet( $this->byGlobalId[$globalSiteId] );
-       }
-
-       /**
-        * @see SiteList::removeSite
-        *
-        * @since 1.21
-        *
-        * @param string $globalSiteId
-        */
-       public function removeSite( $globalSiteId ) {
-               $this->offsetUnset( $this->byGlobalId[$globalSiteId] );
-       }
-
-       /**
-        * @see SiteList::isEmpty
-        *
-        * @since 1.21
-        *
-        * @return boolean
-        */
-       public function isEmpty() {
-               return $this->byGlobalId === array();
-       }
-
-       /**
-        * @see SiteList::hasInternalId
-        *
-        * @param integer $id
-        *
-        * @return boolean
-        */
-       public function hasInternalId( $id ) {
-               return array_key_exists( $id, $this->byInternalId );
-       }
-
-       /**
-        * @see SiteList::getSiteByInternalId
-        *
-        * @since 1.21
-        *
-        * @param integer $id
-        *
-        * @return Site
-        */
-       public function getSiteByInternalId( $id ) {
-               return $this->offsetGet( $this->byInternalId[$id] );
-       }
-
-       /**
-        * @see SiteList::removeSiteByInternalId
-        *
-        * @since 1.21
-        *
-        * @param integer $id
-        */
-       public function removeSiteByInternalId( $id ) {
-               $this->offsetUnset( $this->byInternalId[$id] );
-       }
-
-       /**
-        * @see SiteList::setSite
-        *
-        * @since 1.21
-        *
-        * @param Site $site
-        */
-       public function setSite( Site $site ) {
-               $this[] = $site;
-       }
-
-       /**
-        * @see GenericArrayObject::getSerializationData
-        *
-        * @since 1.21
-        *
-        * @return array
-        */
-       protected function getSerializationData() {
-               return array_merge(
-                       parent::getSerializationData(),
-                       array(
-                               'cacheVersion' => self::CACHE_VERSION,
-                               'internalIds' => $this->byInternalId,
-                               'globalIds' => $this->byGlobalId,
-                       )
-               );
-       }
-
-       /**
-        * @see GenericArrayObject::unserialize
-        *
-        * @since 1.21
-        *
-        * @param string $serialization
-        *
-        * @return array
-        */
-       public function unserialize( $serialization ) {
-               $serializationData = parent::unserialize( $serialization );
-
-               $this->cacheVersion = $serializationData['cacheVersion'];
-               $this->byInternalId = $serializationData['internalIds'];
-               $this->byGlobalId = $serializationData['globalIds'];
-
-               return $serializationData;
-       }
-
-}
index 6273364..97848b5 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Interface for lists of Site objects.
+ * Collection of Site objects.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * @license GNU GPL v2+
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
-interface SiteList extends Countable, Traversable, Serializable, ArrayAccess {
+class SiteList extends GenericArrayObject {
+
+       /**
+        * Internal site identifiers pointing to their sites offset value.
+        *
+        * @since 1.21
+        *
+        * @var array of integer
+        */
+       protected $byInternalId = array();
+
+       /**
+        * Global site identifiers pointing to their sites offset value.
+        *
+        * @since 1.21
+        *
+        * @var array of string
+        */
+       protected $byGlobalId = array();
+
+       /**
+        * @see GenericArrayObject::getObjectType
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       public function getObjectType() {
+               return 'Site';
+       }
+
+       /**
+        * @see GenericArrayObject::preSetElement
+        *
+        * @since 1.21
+        *
+        * @param int|string $index
+        * @param Site $site
+        *
+        * @return boolean
+        */
+       protected function preSetElement( $index, $site ) {
+               if ( $this->hasSite( $site->getGlobalId() ) ) {
+                       $this->removeSite( $site->getGlobalId() );
+               }
+
+               $this->byGlobalId[$site->getGlobalId()] = $index;
+               $this->byInternalId[$site->getInternalId()] = $index;
+
+               return true;
+       }
+
+       /**
+        * @see ArrayObject::offsetUnset()
+        *
+        * @since 1.21
+        *
+        * @param mixed $index
+        */
+       public function offsetUnset( $index ) {
+               if ( $this->offsetExists( $index ) ) {
+                       /**
+                        * @var Site $site
+                        */
+                       $site = $this->offsetGet( $index );
+
+                       unset( $this->byGlobalId[$site->getGlobalId()] );
+                       unset( $this->byInternalId[$site->getInternalId()] );
+               }
+
+               parent::offsetUnset( $index );
+       }
 
        /**
         * Returns all the global site identifiers.
@@ -36,7 +107,9 @@ interface SiteList extends Countable, Traversable, Serializable, ArrayAccess {
         *
         * @return array
         */
-       public function getGlobalIdentifiers();
+       public function getGlobalIdentifiers() {
+               return array_keys( $this->byGlobalId );
+       }
 
        /**
         * Returns if the list contains the site with the provided global site identifier.
@@ -45,7 +118,9 @@ interface SiteList extends Countable, Traversable, Serializable, ArrayAccess {
         *
         * @return boolean
         */
-       public function hasSite( $globalSiteId );
+       public function hasSite( $globalSiteId ) {
+               return array_key_exists( $globalSiteId, $this->byGlobalId );
+       }
 
        /**
         * Returns the Site with the provided global site identifier.
@@ -57,7 +132,9 @@ interface SiteList extends Countable, Traversable, Serializable, ArrayAccess {
         *
         * @return Site
         */
-       public function getSite( $globalSiteId );
+       public function getSite( $globalSiteId ) {
+               return $this->offsetGet( $this->byGlobalId[$globalSiteId] );
+       }
 
        /**
         * Removes the site with the specified global site identifier.
@@ -67,7 +144,20 @@ interface SiteList extends Countable, Traversable, Serializable, ArrayAccess {
         *
         * @param string $globalSiteId
         */
-       public function removeSite( $globalSiteId );
+       public function removeSite( $globalSiteId ) {
+               $this->offsetUnset( $this->byGlobalId[$globalSiteId] );
+       }
+
+       /**
+        * Returns if the list contains no sites.
+        *
+        * @since 1.21
+        *
+        * @return boolean
+        */
+       public function isEmpty() {
+               return $this->byGlobalId === array();
+       }
 
        /**
         * Returns if the list contains the site with the provided site id.
@@ -76,7 +166,9 @@ interface SiteList extends Countable, Traversable, Serializable, ArrayAccess {
         *
         * @return boolean
         */
-       public function hasInternalId( $id );
+       public function hasInternalId( $id ) {
+               return array_key_exists( $id, $this->byInternalId );
+       }
 
        /**
         * Returns the Site with the provided site id.
@@ -88,7 +180,9 @@ interface SiteList extends Countable, Traversable, Serializable, ArrayAccess {
         *
         * @return Site
         */
-       public function getSiteByInternalId( $id );
+       public function getSiteByInternalId( $id ) {
+               return $this->offsetGet( $this->byInternalId[$id] );
+       }
 
        /**
         * Removes the site with the specified site id.
@@ -98,7 +192,9 @@ interface SiteList extends Countable, Traversable, Serializable, ArrayAccess {
         *
         * @param integer $id
         */
-       public function removeSiteByInternalId( $id );
+       public function removeSiteByInternalId( $id ) {
+               $this->offsetUnset( $this->byInternalId[$id] );
+       }
 
        /**
         * Sets a site in the list. If the site was not there,
@@ -108,15 +204,97 @@ interface SiteList extends Countable, Traversable, Serializable, ArrayAccess {
         *
         * @param Site $site
         */
-       public function setSite( Site $site );
+       public function setSite( Site $site ) {
+               $this[] = $site;
+       }
 
        /**
-        * Returns if the site list contains no sites.
+        * Returns the sites that are in the provided group.
         *
         * @since 1.21
         *
-        * @return boolean
+        * @param string $groupName
+        *
+        * @return SiteList
+        */
+       public function getGroup( $groupName ) {
+               $group = new self();
+
+               /**
+                * @var \Site $site
+                */
+               foreach ( $this as $site ) {
+                       if ( $site->getGroup() === $groupName ) {
+                               $group[] = $site;
+                       }
+               }
+
+               return $group;
+       }
+
+       /**
+        * A version ID that identifies the serialization structure used by getSerializationData()
+        * and unserialize(). This is useful for constructing cache keys in cases where the cache relies
+        * on serialization for storing the SiteList.
+        *
+        * @var string A string uniquely identifying the version of the serialization structure,
+        *             not including any sub-structures.
+        */
+       const SERIAL_VERSION_ID = '2013-01-23';
+
+       /**
+        * Returns the version ID that identifies the serialization structure used by
+        * getSerializationData() and unserialize(), including the structure of any nested structures.
+        * This is useful for constructing cache keys in cases where the cache relies
+        * on serialization for storing the SiteList.
+        *
+        * @return string A string uniquely identifying the version of the serialization structure,
+        *                including any sub-structures.
+        */
+       public static function getSerialVersionId() {
+               return self::SERIAL_VERSION_ID . '+Site:' . Site::SERIAL_VERSION_ID;
+       }
+
+       /**
+        * @see GenericArrayObject::getSerializationData
+        *
+        * @since 1.21
+        *
+        * @return array
         */
-       public function isEmpty();
+       protected function getSerializationData() {
+               //NOTE: When changing the structure, either implement unserialize() to handle the
+               //      old structure too, or update SERIAL_VERSION_ID to kill any caches.
+               return array_merge(
+                       parent::getSerializationData(),
+                       array(
+                               'internalIds' => $this->byInternalId,
+                               'globalIds' => $this->byGlobalId,
+                       )
+               );
+       }
 
-}
\ No newline at end of file
+       /**
+        * @see GenericArrayObject::unserialize
+        *
+        * @since 1.21
+        *
+        * @param string $serialization
+        *
+        * @return array
+        */
+       public function unserialize( $serialization ) {
+               $serializationData = parent::unserialize( $serialization );
+
+               $this->byInternalId = $serializationData['internalIds'];
+               $this->byGlobalId = $serializationData['globalIds'];
+
+               return $serializationData;
+       }
+
+}
+
+/**
+ * @deprecated
+ */
+class SiteArray extends SiteList {}
\ No newline at end of file
diff --git a/includes/site/SiteObject.php b/includes/site/SiteObject.php
deleted file mode 100644 (file)
index 217f860..0000000
+++ /dev/null
@@ -1,570 +0,0 @@
-<?php
-
-/**
- * Class representing a single site.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @since 1.21
- *
- * @file
- * @ingroup Site
- *
- * @license GNU GPL v2+
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- * @author Daniel Werner
- */
-class SiteObject extends ORMRow implements Site {
-
-       const PATH_LINK = 'link';
-
-       /**
-        * Holds the local ids for this site.
-        * You can obtain them via @see getLocalIds
-        *
-        * @since 1.21
-        *
-        * @var array|false
-        */
-       protected $localIds = false;
-
-       /**
-        * @see Site::getGlobalId
-        *
-        * @since 1.21
-        *
-        * @return string
-        */
-       public function getGlobalId() {
-               return $this->getField( 'global_key' );
-       }
-
-       /**
-        * @see Site::setGlobalId
-        *
-        * @since 1.21
-        *
-        * @param string $globalId
-        */
-       public function setGlobalId( $globalId ) {
-               $this->setField( 'global_key', $globalId );
-       }
-
-       /**
-        * @see Site::getType
-        *
-        * @since 1.21
-        *
-        * @return string
-        */
-       public function getType() {
-               return $this->getField( 'type' );
-       }
-
-       /**
-        * @see Site::setType
-        *
-        * @since 1.21
-        *
-        * @param string $type
-        */
-       public function setType( $type ) {
-               $this->setField( 'type', $type );
-       }
-
-       /**
-        * @see Site::getGroup
-        *
-        * @since 1.21
-        *
-        * @return string
-        */
-       public function getGroup() {
-               return $this->getField( 'group' );
-       }
-
-       /**
-        * @see Site::setGroup
-        *
-        * @since 1.21
-        *
-        * @param string $group
-        */
-       public function setGroup( $group ) {
-               $this->setField( 'group', $group );
-       }
-
-       /**
-        * @see Site::getSource
-        *
-        * @since 1.21
-        *
-        * @return string
-        */
-       public function getSource() {
-               return $this->getField( 'source' );
-       }
-
-       /**
-        * @see Site::setSource
-        *
-        * @since 1.21
-        *
-        * @param string $source
-        */
-       public function setSource( $source ) {
-               $this->setField( 'source', $source );
-       }
-
-       /**
-        * @see Site::getDomain
-        *
-        * @since 1.21
-        *
-        * @return string|false
-        */
-       public function getDomain() {
-               $path = $this->getLinkPath();
-
-               if ( $path === false ) {
-                       return false;
-               }
-
-               return parse_url( $path, PHP_URL_HOST );
-       }
-
-       /**
-        * @see Site::getProtocol
-        *
-        * @since 1.21
-        *
-        * @throws MWException
-        * @return string|false
-        */
-       public function getProtocol() {
-               $path = $this->getLinkPath();
-
-               if ( $path === false ) {
-                       return '';
-               }
-
-               $protocol = parse_url( $path, PHP_URL_SCHEME );
-
-               // Malformed URL
-               if ( $protocol === false ) {
-                       throw new MWException( "failed to parse URL $path" );
-               }
-
-               // No schema
-               if ( $protocol === null ) {
-                       // Used for protocol relative URLs
-                       $protocol = '';
-               }
-
-               return $protocol;
-       }
-
-       /**
-        * Sets the path used to construct links with.
-        * @see Site::setLinkPath
-        *
-        * @param string $fullUrl
-        *
-        * @since 1.21
-        *
-        * @throws MWException
-        */
-       public function setLinkPath( $fullUrl ) {
-               $type = $this->getLinkPathType();
-
-               if ( $type === false ) {
-                       throw new MWException( "This SiteObject does not support link paths." );
-               }
-
-               $this->setPath( $type, $fullUrl );
-       }
-
-       /**
-        * Returns the path path used to construct links with or false if there is no such path.
-        *
-        * @see Site::getLinkPath
-        *
-        * @return string|false
-        */
-       public function getLinkPath() {
-               $type = $this->getLinkPathType();
-               return $type === false ? false : $this->getPath( $type );
-       }
-
-       /**
-        * @see Site::getLinkPathType
-        *
-        * Returns the main path type, that is the type of the path that should generally be used to construct links
-        * to the target site.
-        *
-        * This default implementation returns SiteObject::PATH_LINK as the default path type. Subclasses can override this
-        * to define a different default path type, or return false to disable site links.
-        *
-        * @since 1.21
-        *
-        * @return string|false
-        */
-       public function getLinkPathType() {
-               return self::PATH_LINK;
-       }
-
-       /**
-        * @see Site::getPageUrl
-        *
-        * This implementation returns a URL constructed using the path returned by getLinkPath().
-        *
-        * @since 1.21
-        *
-        * @param bool|String $pageName
-        *
-        * @return string|false
-        */
-       public function getPageUrl( $pageName = false ) {
-               $url = $this->getLinkPath();
-
-               if ( $url === false ) {
-                       return false;
-               }
-
-               if ( $pageName !== false ) {
-                       $url = str_replace( '$1', rawurlencode( $pageName ), $url ) ;
-               }
-
-               return $url;
-       }
-
-       /**
-        * Returns $pageName without changes.
-        * Subclasses may override this to apply some kind of normalization.
-        *
-        * @see Site::normalizePageName
-        *
-        * @since 1.21
-        *
-        * @param string $pageName
-        *
-        * @return string
-        */
-       public function normalizePageName( $pageName ) {
-               return $pageName;
-       }
-
-       /**
-        * Returns the value of a type specific field, or the value
-        * of the $default parameter in case it's not set.
-        *
-        * @since 1.21
-        *
-        * @param string $fieldName
-        * @param mixed $default
-        *
-        * @return array
-        */
-       protected function getExtraData( $fieldName, $default = null ) {
-               $data = $this->getField( 'data', array() );
-               return array_key_exists( $fieldName,$data ) ? $data[$fieldName] : $default;
-       }
-
-       /**
-        * Sets the value of a type specific field.
-        * @since 1.21
-        *
-        * @param string $fieldName
-        * @param mixed $value
-        */
-       protected function setExtraData( $fieldName, $value = null ) {
-               $data = $this->getField( 'data', array() );
-               $data[$fieldName] = $value;
-               $this->setField( 'data', $data );
-       }
-
-       /**
-        * @see Site::getLanguageCode
-        *
-        * @since 1.21
-        *
-        * @return string|false
-        */
-       public function getLanguageCode() {
-               return $this->getField( 'language', false );
-       }
-
-       /**
-        * @see Site::setLanguageCode
-        *
-        * @since 1.21
-        *
-        * @param string $languageCode
-        */
-       public function setLanguageCode( $languageCode ) {
-               $this->setField( 'language', $languageCode );
-       }
-
-       /**
-        * Returns the local identifiers of this site.
-        *
-        * @since 1.21
-        *
-        * @param string $type
-        *
-        * @return array
-        */
-       protected function getLocalIds( $type ) {
-               if ( $this->localIds === false ) {
-                       $this->loadLocalIds();
-               }
-
-               return array_key_exists( $type, $this->localIds ) ? $this->localIds[$type] : array();
-       }
-
-       /**
-        * Loads the local ids for the site.
-        *
-        * @since 1.21
-        */
-       protected function loadLocalIds() {
-               $dbr = wfGetDB( $this->getTable()->getReadDb() );
-
-               $ids = $dbr->select(
-                       'site_identifiers',
-                       array(
-                               'si_type',
-                               'si_key',
-                       ),
-                       array(
-                               'si_site' => $this->getId(),
-                       ),
-                       __METHOD__
-               );
-
-               $this->localIds = array();
-
-               foreach ( $ids as $id ) {
-                       $this->addLocalId( $id->si_type, $id->si_key );
-               }
-       }
-
-       /**
-        * Adds a local identifier.
-        *
-        * @since 1.21
-        *
-        * @param string $type
-        * @param string $identifier
-        */
-       public function addLocalId( $type, $identifier ) {
-               if ( $this->localIds === false ) {
-                       $this->localIds = array();
-               }
-
-               if ( !array_key_exists( $type, $this->localIds ) ) {
-                       $this->localIds[$type] = array();
-               }
-
-               if ( !in_array( $identifier, $this->localIds[$type] ) ) {
-                       $this->localIds[$type][] = $identifier;
-               }
-       }
-
-       /**
-        * @see Site::addInterwikiId
-        *
-        * @since 1.21
-        *
-        * @param string $identifier
-        */
-       public function addInterwikiId( $identifier ) {
-               $this->addLocalId( 'interwiki', $identifier );
-       }
-
-       /**
-        * @see Site::addNavigationId
-        *
-        * @since 1.21
-        *
-        * @param string $identifier
-        */
-       public function addNavigationId( $identifier ) {
-               $this->addLocalId( 'equivalent', $identifier );
-       }
-
-       /**
-        * @see Site::getInterwikiIds
-        *
-        * @since 1.21
-        *
-        * @return array of string
-        */
-       public function getInterwikiIds() {
-               return $this->getLocalIds( 'interwiki' );
-       }
-
-       /**
-        * @see Site::getNavigationIds
-        *
-        * @since 1.21
-        *
-        * @return array of string
-        */
-       public function getNavigationIds() {
-               return $this->getLocalIds( 'equivalent' );
-       }
-
-       /**
-        * @see Site::getInternalId
-        *
-        * @since 1.21
-        *
-        * @return integer
-        */
-       public function getInternalId() {
-               return $this->getId();
-       }
-
-       /**
-        * @see IORMRow::save
-        * @see Site::save
-        *
-        * @since 1.21
-        *
-        * @param string|null $functionName
-        *
-        * @return boolean Success indicator
-        */
-       public function save( $functionName = null ) {
-               $dbw = $this->table->getWriteDbConnection();
-
-               $trx = $dbw->trxLevel();
-
-               if ( $trx == 0 ) {
-                       $dbw->begin( __METHOD__ );
-               }
-
-               $this->setField( 'protocol', $this->getProtocol() );
-               $this->setField( 'domain', strrev( $this->getDomain() ) . '.' );
-
-               $existedAlready = $this->hasIdField();
-
-               $success = parent::save( $functionName );
-
-               if ( $success && $existedAlready ) {
-                       $dbw->delete(
-                               'site_identifiers',
-                               array( 'si_site' => $this->getId() ),
-                               __METHOD__
-                       );
-               }
-
-               if ( $success && $this->localIds !== false ) {
-                       foreach ( $this->localIds as $type => $ids ) {
-                               foreach ( $ids as $id ) {
-                                       $dbw->insert(
-                                               'site_identifiers',
-                                               array(
-                                                       'si_site' => $this->getId(),
-                                                       'si_type' => $type,
-                                                       'si_key' => $id,
-                                               ),
-                                               __METHOD__
-                                       );
-                               }
-                       }
-               }
-
-               if ( $trx == 0 ) {
-                       $dbw->commit( __METHOD__ );
-               }
-
-               return $success;
-       }
-
-       /**
-        * @since 1.21
-        *
-        * @see ORMRow::onRemoved
-        */
-       protected function onRemoved() {
-               $dbw = $this->table->getWriteDbConnection();
-
-               $dbw->delete(
-                       'site_identifiers',
-                       array(
-                               'si_site' => $this->getId()
-                       ),
-                       __METHOD__
-               );
-
-               parent::onRemoved();
-       }
-
-       /**
-        * @see Site::setPath
-        *
-        * @since 1.21
-        *
-        * @param string $pathType
-        * @param string $fullUrl
-        */
-       public function setPath( $pathType, $fullUrl ) {
-               $paths = $this->getExtraData( 'paths', array() );
-               $paths[$pathType] = $fullUrl;
-               $this->setExtraData( 'paths', $paths );
-       }
-
-       /**
-        * @see Sitres::getPath
-        *
-        * @since 1.21
-        *
-        * @param string $pathType
-        *
-        * @return string|false
-        */
-       public function getPath( $pathType ) {
-               $paths = $this->getExtraData( 'paths', array() );
-               return array_key_exists( $pathType, $paths ) ? $paths[$pathType] : false;
-       }
-
-       /**
-        * @see Sitres::getAll
-        *
-        * @since 1.21
-        *
-        * @return array of string
-        */
-       public function getAllPaths() {
-               return $this->getExtraData( 'paths', array() );
-       }
-
-       /**
-        * @see Sitres::removePath
-        *
-        * @since 1.21
-        *
-        * @param string $pathType
-        */
-       public function removePath( $pathType ) {
-               $paths = $this->getExtraData( 'paths', array() );
-               unset( $paths[$pathType] );
-               $this->setExtraData( 'paths', $paths );
-       }
-
-}
diff --git a/includes/site/SiteSQLStore.php b/includes/site/SiteSQLStore.php
new file mode 100644 (file)
index 0000000..a79c8c5
--- /dev/null
@@ -0,0 +1,480 @@
+<?php
+
+/**
+ * Represents the site configuration of a wiki.
+ * Holds a list of sites (ie SiteList) and takes care
+ * of retrieving and caching site information when appropriate.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Site
+ *
+ * @license GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class SiteSQLStore implements SiteStore {
+
+       /**
+        * @since 1.21
+        *
+        * @var SiteList|null
+        */
+       protected $sites = null;
+
+       /**
+        * @var ORMTable
+        */
+       protected $sitesTable;
+
+       /**
+        * @var string|null
+        */
+       private $cacheKey = null;
+
+       /**
+        * @since 1.21
+        *
+        * @param ORMTable|null $sitesTable
+        *
+        * @return SiteStore
+        */
+       public static function newInstance( ORMTable $sitesTable = null ) {
+               return new static( $sitesTable );
+       }
+
+       /**
+        * Constructor.
+        *
+        * @since 1.21
+        *
+        * @param ORMTable|null $sitesTable
+        */
+       protected function __construct( ORMTable $sitesTable = null ) {
+               if ( $sitesTable === null ) {
+                       $sitesTable = $this->newSitesTable();
+               }
+
+               $this->sitesTable = $sitesTable;
+       }
+
+       /**
+        * Constructs a cache key to use for caching the list of sites.
+        *
+        * This includes the concrete class name of the site list as well as a version identifier
+        * for the list's serialization, to avoid problems when unserializing site lists serialized
+        * by an older version, e.g. when reading from a cache.
+        *
+        * The cache key also includes information about where the sites were loaded from, e.g.
+        * the name of a database table.
+        *
+        * @see SiteList::getSerialVersionId
+        *
+        * @return String The cache key.
+        */
+       protected function getCacheKey() {
+               wfProfileIn( __METHOD__ );
+
+               if ( $this->cacheKey === null ) {
+                       $type = 'SiteList#' . SiteList::getSerialVersionId();
+                       $source = $this->sitesTable->getName();
+
+                       if ( $this->sitesTable->getTargetWiki() !== false ) {
+                               $source = $this->sitesTable->getTargetWiki() . '.' . $source;
+                       }
+
+                       $this->cacheKey = wfMemcKey( "$source/$type" );
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $this->cacheKey;
+       }
+
+       /**
+        * @see SiteStore::getSites
+        *
+        * @since 1.21
+        *
+        * @param string $source either 'cache' or 'recache'
+        *
+        * @return SiteList
+        */
+       public function getSites( $source = 'cache' ) {
+               wfProfileIn( __METHOD__ );
+
+               if ( $source === 'cache' ) {
+                       if ( $this->sites === null ) {
+                               $cache = wfGetMainCache();
+                               $sites = $cache->get( $this->getCacheKey() );
+
+                               if ( is_object( $sites ) ) {
+                                       $this->sites = $sites;
+                               } else {
+                                       $this->loadSites();
+                               }
+                       }
+               }
+               else {
+                       $this->loadSites();
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $this->sites;
+       }
+
+       /**
+        * Returns a new Site object constructed from the provided ORMRow.
+        *
+        * @since 1.21
+        *
+        * @param ORMRow $siteRow
+        *
+        * @return Site
+        */
+       protected function siteFromRow( ORMRow $siteRow ) {
+               wfProfileIn( __METHOD__ );
+
+               $site = Site::newForType( $siteRow->getField( 'type', Site::TYPE_UNKNOWN ) );
+
+               $site->setGlobalId( $siteRow->getField( 'global_key' ) );
+
+               $site->setInternalId( $siteRow->getField( 'id' ) );
+
+               if ( $siteRow->hasField( 'forward' ) ) {
+                       $site->setForward( $siteRow->getField( 'forward' ) );
+               }
+
+               if ( $siteRow->hasField( 'group' ) ) {
+                       $site->setGroup( $siteRow->getField( 'group' ) );
+               }
+
+               if ( $siteRow->hasField( 'language' ) ) {
+                       $site->setLanguageCode( $siteRow->getField( 'language' ) === '' ? null : $siteRow->getField( 'language' ) );
+               }
+
+               if ( $siteRow->hasField( 'source' ) ) {
+                       $site->setSource( $siteRow->getField( 'source' ) );
+               }
+
+               if ( $siteRow->hasField( 'data' ) ) {
+                       $site->setExtraData( $siteRow->getField( 'data' ) );
+               }
+
+               if ( $siteRow->hasField( 'config' ) ) {
+                       $site->setExtraConfig( $siteRow->getField( 'config' ) );
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $site;
+       }
+
+       /**
+        * Fetches the site from the database and loads them into the sites field.
+        *
+        * @since 1.21
+        */
+       protected function loadSites() {
+               wfProfileIn( __METHOD__ );
+
+               $this->sites = new SiteList();
+
+               foreach ( $this->sitesTable->select() as $siteRow ) {
+                       $this->sites[] = $this->siteFromRow( $siteRow );
+               }
+
+               // Batch load the local site identifiers.
+               $ids = wfGetDB( $this->sitesTable->getReadDb() )->select(
+                       'site_identifiers',
+                       array(
+                               'si_site',
+                               'si_type',
+                               'si_key',
+                       ),
+                       array(),
+                       __METHOD__
+               );
+
+               foreach ( $ids as $id ) {
+                       if ( $this->sites->hasInternalId( $id->si_site ) ) {
+                               $site = $this->sites->getSiteByInternalId( $id->si_site );
+                               $site->addLocalId( $id->si_type, $id->si_key );
+                               $this->sites->setSite( $site );
+                       }
+               }
+
+               $cache = wfGetMainCache();
+               $cache->set( $this->getCacheKey(), $this->sites );
+
+               wfProfileOut( __METHOD__ );
+       }
+
+       /**
+        * @see SiteStore::getSite
+        *
+        * @since 1.21
+        *
+        * @param string $globalId
+        * @param string $source
+        *
+        * @return Site|null
+        */
+       public function getSite( $globalId, $source = 'cache' ) {
+               wfProfileIn( __METHOD__ );
+
+               $sites = $this->getSites( $source );
+
+               wfProfileOut( __METHOD__ );
+               return $sites->hasSite( $globalId ) ? $sites->getSite( $globalId ) : null;
+       }
+
+       /**
+        * @see SiteStore::saveSite
+        *
+        * @since 1.21
+        *
+        * @param Site $site
+        *
+        * @return boolean Success indicator
+        */
+       public function saveSite( Site $site ) {
+               return $this->saveSites( array( $site ) );
+       }
+
+       /**
+        * @see SiteStore::saveSites
+        *
+        * @since 1.21
+        *
+        * @param Site[] $sites
+        *
+        * @return boolean Success indicator
+        */
+       public function saveSites( array $sites ) {
+               wfProfileIn( __METHOD__ );
+
+               if ( empty( $sites ) ) {
+                       wfProfileOut( __METHOD__ );
+                       return true;
+               }
+
+               $dbw = $this->sitesTable->getWriteDbConnection();
+
+               $trx = $dbw->trxLevel();
+
+               if ( $trx == 0 ) {
+                       $dbw->begin( __METHOD__ );
+               }
+
+               $success = true;
+
+               $internalIds = array();
+               $localIds = array();
+
+               foreach ( $sites as $site ) {
+                       $fields = array(
+                               // Site data
+                               'global_key' => $site->getGlobalId(), // TODO: check not null
+                               'type' => $site->getType(),
+                               'group' => $site->getGroup(),
+                               'source' => $site->getSource(),
+                               'language' => $site->getLanguageCode() === null ? '' : $site->getLanguageCode(),
+                               'protocol' => $site->getProtocol(),
+                               'domain' => strrev( $site->getDomain() ) . '.',
+                               'data' => $site->getExtraData(),
+
+                               // Site config
+                               'forward' => $site->shouldForward(),
+                               'config' => $site->getExtraConfig(),
+                       );
+
+                       if ( $site->getInternalId() !== null ) {
+                               $fields['id'] = $site->getInternalId();
+                               $internalIds[] = $site->getInternalId();
+                       }
+
+                       $siteRow = new ORMRow( $this->sitesTable, $fields );
+                       $success = $siteRow->save( __METHOD__ ) && $success;
+
+                       foreach ( $site->getLocalIds() as $idType => $ids ) {
+                               foreach ( $ids as $id ) {
+                                       $localIds[] = array( $siteRow->getId(), $idType, $id );
+                               }
+                       }
+               }
+
+               if ( $internalIds !== array() ) {
+                       $dbw->delete(
+                               'site_identifiers',
+                               array( 'si_site' => $internalIds ),
+                               __METHOD__
+                       );
+               }
+
+               foreach ( $localIds as $localId ) {
+                       $dbw->insert(
+                               'site_identifiers',
+                               array(
+                                       'si_site' => $localId[0],
+                                       'si_type' => $localId[1],
+                                       'si_key' => $localId[2],
+                               ),
+                               __METHOD__
+                       );
+               }
+
+               if ( $trx == 0 ) {
+                       $dbw->commit( __METHOD__ );
+               }
+
+               // purge cache
+               $this->reset();
+
+               wfProfileOut( __METHOD__ );
+               return $success;
+       }
+
+       /**
+        * Purges the internal and external cache of the site list, forcing the list
+        * of sites to be re-read from the database.
+        *
+        * @since 1.21
+        */
+       public function reset() {
+               wfProfileIn( __METHOD__ );
+               // purge cache
+               $cache = wfGetMainCache();
+               $cache->delete( $this->getCacheKey() );
+               $this->sites = null;
+
+               wfProfileOut( __METHOD__ );
+       }
+
+       /**
+        * Clears the list of sites stored in the database.
+        *
+        * @see SiteStore::clear()
+        *
+        * @return bool success
+        */
+       public function clear() {
+               wfProfileIn( __METHOD__ );
+               $dbw = $this->sitesTable->getWriteDbConnection();
+
+               $trx = $dbw->trxLevel();
+
+               if ( $trx == 0 ) {
+                       $dbw->begin( __METHOD__ );
+               }
+
+               $ok = $dbw->delete( 'sites', '*', __METHOD__ );
+               $ok = $dbw->delete( 'site_identifiers', '*', __METHOD__ ) && $ok;
+
+               if ( $trx == 0 ) {
+                       $dbw->commit( __METHOD__ );
+               }
+
+               $this->reset();
+
+               wfProfileOut( __METHOD__ );
+               return $ok;
+       }
+
+       /**
+        * @since 1.21
+        *
+        * @return ORMTable
+        */
+       protected function newSitesTable() {
+               return new ORMTable(
+                       'sites',
+                       array(
+                               'id' => 'id',
+
+                               // Site data
+                               'global_key' => 'str',
+                               'type' => 'str',
+                               'group' => 'str',
+                               'source' => 'str',
+                               'language' => 'str',
+                               'protocol' => 'str',
+                               'domain' => 'str',
+                               'data' => 'array',
+
+                               // Site config
+                               'forward' => 'bool',
+                               'config' => 'array',
+                       ),
+                       array(
+                               'type' => Site::TYPE_UNKNOWN,
+                               'group' => Site::GROUP_NONE,
+                               'source' => Site::SOURCE_LOCAL,
+                               'data' => array(),
+
+                               'forward' => false,
+                               'config' => array(),
+                               'language' => '',
+                       ),
+                       'ORMRow',
+                       'site_'
+               );
+       }
+
+}
+
+/**
+ * @deprecated
+ */
+class Sites extends SiteSQLStore {
+
+       /**
+        * Factory for creating new site objects.
+        *
+        * @since 1.21
+        * @deprecated
+        *
+        * @param string|boolean false $globalId
+        *
+        * @return Site
+        */
+       public static function newSite( $globalId = false ) {
+               $site = new Site();
+
+               if ( $globalId !== false ) {
+                       $site->setGlobalId( $globalId );
+               }
+
+               return $site;
+       }
+
+       /**
+        * @deprecated
+        * @return SiteStore
+        */
+       public static function singleton() {
+               return new static();
+       }
+
+       /**
+        * @deprecated
+        * @return SiteList
+        */
+       public function getSiteGroup( $group ) {
+               return $this->getSites()->getGroup( $group );
+       }
+
+}
diff --git a/includes/site/SiteStore.php b/includes/site/SiteStore.php
new file mode 100644 (file)
index 0000000..52ba8fb
--- /dev/null
@@ -0,0 +1,85 @@
+<?php
+
+/**
+ * Interface for service objects providing a storage interface for Site objects.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Site
+ *
+ * @license GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+interface SiteStore {
+
+       /**
+        * Saves the provided site.
+        *
+        * @since 1.21
+        *
+        * @param Site $site
+        *
+        * @return boolean Success indicator
+        */
+       public function saveSite( Site $site );
+
+       /**
+        * Saves the provided sites.
+        *
+        * @since 1.21
+        *
+        * @param Site[] $sites
+        *
+        * @return boolean Success indicator
+        */
+       public function saveSites( array $sites );
+
+       /**
+        * Returns the site with provided global id, or null if there is no such site.
+        *
+        * @since 1.21
+        *
+        * @param string $globalId
+        * @param string $source either 'cache' or 'recache'.
+        * If 'cache', the values are allowed (but not obliged) to come from a cache.
+        *
+        * @return Site|null
+        */
+       public function getSite( $globalId, $source = 'cache' );
+
+       /**
+        * Returns a list of all sites. By default this site is
+        * fetched from the cache, which can be changed to loading
+        * the list from the database using the $useCache parameter.
+        *
+        * @since 1.21
+        *
+        * @param string $source either 'cache' or 'recache'.
+        * If 'cache', the values are allowed (but not obliged) to come from a cache.
+        *
+        * @return SiteList
+        */
+       public function getSites( $source = 'cache' );
+
+       /**
+        * Deletes all sites from the database. After calling clear(), getSites() will return an empty
+        * list and getSite() will return null until saveSite() or saveSites() is called.
+        */
+       public function clear();
+}
diff --git a/includes/site/Sites.php b/includes/site/Sites.php
deleted file mode 100644 (file)
index a67d474..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-<?php
-
-/**
- * Represents the site configuration of a wiki.
- * Holds a list of sites (ie SiteList) and takes care
- * of retrieving and caching site information when appropriate.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @since 1.21
- *
- * @file
- * @ingroup Site
- *
- * @license GNU GPL v2+
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-class Sites {
-
-       /**
-        * @since 1.21
-        * @var SiteList|null
-        */
-       protected $sites = null;
-
-       /**
-        * Constructor.
-        *
-        * @since 1.21
-        */
-       protected function __construct() {}
-
-       /**
-        * Returns an instance of Sites.
-        *
-        * @since 1.21
-        *
-        * @return Sites
-        */
-       public static function singleton() {
-               static $instance = false;
-
-               if ( $instance === false ) {
-                       $instance = new static();
-               }
-
-               return $instance;
-       }
-
-       /**
-        * Factory for creating new site objects.
-        *
-        * @since 1.21
-        *
-        * @param string|boolean false $globalId
-        *
-        * @return Site
-        */
-       public static function newSite( $globalId = false ) {
-               /**
-                * @var Site $site
-                */
-               $site = SitesTable::singleton()->newRow( array(), true );
-
-               if ( $globalId !== false ) {
-                       $site->setGlobalId( $globalId );
-               }
-
-               return $site;
-       }
-
-       /**
-        * Returns a list of all sites. By default this site is
-        * fetched from the cache, which can be changed to loading
-        * the list from the database using the $useCache parameter.
-        *
-        * @since 1.21
-        *
-        * @param string $source either 'cache' or 'recache'
-        *
-        * @return SiteList
-        */
-       public function getSites( $source = 'cache' ) {
-               if ( $source === 'cache' ) {
-                       if ( $this->sites === null ) {
-                               $cache = wfGetMainCache();
-                               $sites = $cache->get( wfMemcKey( 'SiteList' ) );
-
-                               if ( is_object( $sites ) && isset( $sites->cacheVersion ) && $sites->cacheVersion === SiteArray::CACHE_VERSION ) {
-                                       $this->sites = $sites;
-                               } else {
-                                       $this->loadSites();
-                               }
-                       }
-               }
-               else {
-                       $this->loadSites();
-               }
-
-               return $this->sites;
-       }
-
-       /**
-        * Returns a list of sites in the given group. Calling getGroup() on any of
-        * the sites in the resulting SiteList shall return $group.
-        *
-        * @since 1.21
-        *
-        * @param string $group th group to get.
-        *
-        * @return SiteList
-        */
-       public function getSiteGroup( $group ) {
-               $sites = self::getSites();
-
-               $siteGroup = new SiteArray();
-
-               /* @var Site $site */
-               foreach ( $sites as $site ) {
-                       if ( $site->getGroup() == $group ) {
-                               $siteGroup->append( $site );
-                       }
-               }
-
-               return $siteGroup;
-       }
-
-       /**
-        * Fetches the site from the database and loads them into the sites field.
-        *
-        * @since 1.21
-        */
-       protected function loadSites() {
-               $this->sites = new SiteArray( SitesTable::singleton()->select() );
-
-               // Batch load the local site identifiers.
-               $dbr = wfGetDB( SitesTable::singleton()->getReadDb() );
-
-               $ids = $dbr->select(
-                       'site_identifiers',
-                       array(
-                               'si_site',
-                               'si_type',
-                               'si_key',
-                       ),
-                       array(),
-                       __METHOD__
-               );
-
-               foreach ( $ids as $id ) {
-                       if ( $this->sites->hasInternalId( $id->si_site ) ) {
-                               $site = $this->sites->getSiteByInternalId( $id->si_site );
-                               $site->addLocalId( $id->si_type, $id->si_key );
-                               $this->sites->setSite( $site );
-                       }
-               }
-
-               $cache = wfGetMainCache();
-               $cache->set( wfMemcKey( 'SiteList' ), $this->sites );
-       }
-
-       /**
-        * Returns the site with provided global id, or false if there is no such site.
-        *
-        * @since 1.21
-        *
-        * @param string $globalId
-        * @param string $source
-        *
-        * @return Site|false
-        */
-       public function getSite( $globalId, $source = 'cache' ) {
-               $sites = $this->getSites( $source );
-
-               return $sites->hasSite( $globalId ) ? $sites->getSite( $globalId ) : false;
-       }
-
-}
diff --git a/includes/site/SitesTable.php b/includes/site/SitesTable.php
deleted file mode 100644 (file)
index bb12740..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-<?php
-
-/**
- * Represents the sites database table.
- * All access to this table should be done through this 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
- *
- * @since 1.21
- *
- * @file
- * @ingroup Site
- *
- * @license GNU GPL v2+
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-class SitesTable extends ORMTable {
-
-       /**
-        * @see IORMTable::getName()
-        * @since 1.21
-        * @return string
-        */
-       public function getName() {
-               return 'sites';
-       }
-
-       /**
-        * @see IORMTable::getFieldPrefix()
-        * @since 1.21
-        * @return string
-        */
-       public function getFieldPrefix() {
-               return 'site_';
-       }
-
-       /**
-        * @see IORMTable::getRowClass()
-        * @since 1.21
-        * @return string
-        */
-       public function getRowClass() {
-               return 'SiteObject';
-       }
-
-       /**
-        * @see IORMTable::getFields()
-        * @since 1.21
-        * @return array
-        */
-       public function getFields() {
-               return array(
-                       'id' => 'id',
-
-                       // Site data
-                       'global_key' => 'str',
-                       'type' => 'str',
-                       'group' => 'str',
-                       'source' => 'str',
-                       'language' => 'str',
-                       'protocol' => 'str',
-                       'domain' => 'str',
-                       'data' => 'array',
-
-                       // Site config
-                       'forward' => 'bool',
-                       'config' => 'array',
-               );
-       }
-
-       /**
-        * @see IORMTable::getDefaults()
-        * @since 1.21
-        * @return array
-        */
-       public function getDefaults() {
-               return array(
-                       'type' => Site::TYPE_UNKNOWN,
-                       'group' => Site::GROUP_NONE,
-                       'source' => Site::SOURCE_LOCAL,
-                       'data' => array(),
-
-                       'forward' => false,
-                       'config' => array(),
-                       'language' => 'en', // XXX: can we default to '' instead?
-               );
-       }
-
-       /**
-        * Returns the class name for the provided site type.
-        *
-        * @since 1.21
-        *
-        * @param integer $siteType
-        *
-        * @return string
-        */
-       protected static function getClassForType( $siteType ) {
-               global $wgSiteTypes;
-               return array_key_exists( $siteType, $wgSiteTypes ) ? $wgSiteTypes[$siteType] : 'SiteObject';
-       }
-
-       /**
-        * Factory method to construct a new Site instance.
-        *
-        * @since 1.21
-        *
-        * @param array $data
-        * @param boolean $loadDefaults
-        *
-        * @return Site
-        */
-       public function newRow( array $data, $loadDefaults = false ) {
-               if ( !array_key_exists( 'type', $data ) ) {
-                       $data['type'] = Site::TYPE_UNKNOWN;
-               }
-
-               $class = static::getClassForType( $data['type'] );
-
-               return new $class( $this, $data, $loadDefaults );
-       }
-
-}
\ No newline at end of file
index 8bef55c..f7e316b 100644 (file)
@@ -727,10 +727,10 @@ class ContribsPager extends ReverseChronologicalPager {
                        }
                }
                if ( $this->deletedOnly ) {
-                       $condition[] = "rev_deleted != '0'";
+                       $condition[] = 'rev_deleted != 0';
                }
                if ( $this->topOnly ) {
-                       $condition[] = "rev_id = page_latest";
+                       $condition[] = 'rev_id = page_latest';
                }
                return array( $tables, $index, $condition, $join_conds );
        }
index 74ed537..db3f012 100644 (file)
@@ -343,11 +343,10 @@ class ProtectedPagesPager extends AlphabeticPager {
                }
 
                if( $this->indefonly ) {
-                       $db = wfGetDB( DB_SLAVE );
-                       $conds[] = "pr_expiry = {$db->addQuotes( $db->getInfinity() )} OR pr_expiry IS NULL";
+                       $conds[] = "pr_expiry = {$this->mDb->addQuotes( $this->mDb->getInfinity() )} OR pr_expiry IS NULL";
                }
                if( $this->cascadeonly ) {
-                       $conds[] = "pr_cascade = '1'";
+                       $conds[] = 'pr_cascade = 1';
                }
 
                if( $this->level )
@@ -356,7 +355,8 @@ class ProtectedPagesPager extends AlphabeticPager {
                        $conds[] = 'page_namespace=' . $this->mDb->addQuotes( $this->namespace );
                return array(
                        'tables' => array( 'page_restrictions', 'page' ),
-                       'fields' => 'pr_id,page_namespace,page_title,page_len,pr_type,pr_level,pr_expiry,pr_cascade',
+                       'fields' => array( 'pr_id', 'page_namespace', 'page_title', 'page_len',
+                               'pr_type', 'pr_level', 'pr_expiry', 'pr_cascade' ),
                        'conds' => $conds
                );
        }
index a80f0d0..cf1e2b4 100644 (file)
@@ -238,7 +238,8 @@ class ProtectedTitlesPager extends AlphabeticPager {
                        $conds[] = 'pt_namespace=' . $this->mDb->addQuotes( $this->namespace );
                return array(
                        'tables' => 'protected_titles',
-                       'fields' => 'pt_namespace,pt_title,pt_create_perm,pt_expiry,pt_timestamp',
+                       'fields' => array( 'pt_namespace', 'pt_title', 'pt_create_perm',
+                               'pt_expiry', 'pt_timestamp' ),
                        'conds' => $conds
                );
        }
index 3977673..a8166db 100644 (file)
@@ -387,8 +387,11 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        $tables[] = 'watchlist';
                        $fields[] = 'wl_user';
                        $fields[] = 'wl_notificationtimestamp';
-                       $join_conds['watchlist'] = array('LEFT JOIN',
-                               "wl_user={$uid} AND wl_title=rc_title AND wl_namespace=rc_namespace");
+                       $join_conds['watchlist'] = array('LEFT JOIN', array(
+                               'wl_user' => $uid,
+                               'wl_title=rc_title',
+                               'wl_namespace=rc_namespace'
+                       ));
                }
                if ( $this->getUser()->isAllowed( 'rollback' ) ) {
                        $tables[] = 'page';
index 67a8609..4d57bc7 100644 (file)
@@ -102,7 +102,11 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                if( $uid ) {
                        $tables[] = 'watchlist';
                        $select[] = 'wl_user';
-                       $join_conds['watchlist'] = array( 'LEFT JOIN', "wl_user={$uid} AND wl_title=rc_title AND wl_namespace=rc_namespace" );
+                       $join_conds['watchlist'] = array( 'LEFT JOIN', array(
+                               'wl_user' => $uid,
+                               'wl_title=rc_title',
+                               'wl_namespace=rc_namespace'
+                       ));
                }
                if ( $this->getUser()->isAllowed( 'rollback' ) ) {
                        $tables[] = 'page';
@@ -175,7 +179,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                                        $subconds["rc_namespace"] = $link_ns;
                                        $subjoin = "rc_title = {$pfx}_to";
                                } else {
-                                       $subjoin = "rc_namespace = {$pfx}_namespace AND rc_title = {$pfx}_title";
+                                       $subjoin = array( "rc_namespace = {$pfx}_namespace", "rc_title = {$pfx}_title" );
                                }
                        }
 
index 7c8ff84..bc90d2b 100644 (file)
@@ -288,6 +288,13 @@ class SpecialSearch extends SpecialPage {
 
                        $this->didYouMeanHtml = '<div class="searchdidyoumean">' . $this->msg( 'search-suggest' )->rawParams( $suggestLink )->text() . '</div>';
                }
+
+               if ( !wfRunHooks( 'SpecialSearchResultsPrepend', array( $this, $out, $term ) ) ) {
+                       # Hook requested termination
+                       wfProfileOut( __METHOD__ );
+                       return;
+               }
+
                // start rendering the page
                $out->addHtml(
                        Xml::openElement(
@@ -404,6 +411,7 @@ class SpecialSearch extends SpecialPage {
                if( $num || $this->offset ) {
                        $out->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
                }
+               wfRunHooks( 'SpecialSearchResultsAppend', array( $this, $out, $term ) );
                wfProfileOut( __METHOD__ );
        }
 
index 3a73ebd..d9c4244 100644 (file)
@@ -95,9 +95,9 @@ class LoginForm extends SpecialPage {
                $this->mReason = $request->getText( 'wpReason' );
                $this->mCookieCheck = $request->getVal( 'wpCookieCheck' );
                $this->mPosted = $request->wasPosted();
-               $this->mCreateaccount = $request->getCheck( 'wpCreateaccount' );
                $this->mCreateaccountMail = $request->getCheck( 'wpCreateaccountMail' )
                                                                        && $wgEnableEmail;
+               $this->mCreateaccount = $request->getCheck( 'wpCreateaccount' ) && !$this->mCreateaccountMail;
                $this->mLoginattempt = $request->getCheck( 'wpLoginattempt' );
                $this->mAction = $request->getVal( 'action' );
                $this->mRemember = $request->getCheck( 'wpRemember' );
@@ -212,7 +212,7 @@ class LoginForm extends SpecialPage {
                $result = $this->mailPasswordInternal( $u, false, 'createaccount-title', 'createaccount-text' );
 
                wfRunHooks( 'AddNewAccount', array( $u, true ) );
-               $u->addNewUserLogEntry( true, $this->mReason );
+               $u->addNewUserLogEntry( 'byemail', $this->mReason );
 
                $out = $this->getOutput();
                $out->setPageTitle( $this->msg( 'accmailtitle' ) );
@@ -274,7 +274,7 @@ class LoginForm extends SpecialPage {
                        // wrong.
                        $this->getContext()->setUser( $u );
                        wfRunHooks( 'AddNewAccount', array( $u, false ) );
-                       $u->addNewUserLogEntry();
+                       $u->addNewUserLogEntry( 'create' );
                        if( $this->hasSessionCookie() ) {
                                $this->successfulCreation();
                        } else {
@@ -286,7 +286,7 @@ class LoginForm extends SpecialPage {
                        $out->addWikiMsg( 'accountcreatedtext', $u->getName() );
                        $out->addReturnTo( $this->getTitle() );
                        wfRunHooks( 'AddNewAccount', array( $u, false ) );
-                       $u->addNewUserLogEntry( false, $this->mReason );
+                       $u->addNewUserLogEntry( 'create2', $this->mReason );
                }
                return true;
        }
@@ -1044,6 +1044,7 @@ class LoginForm extends SpecialPage {
                        $q = 'action=submitlogin&type=signup';
                        $linkq = 'type=login';
                        $linkmsg = 'gotaccount';
+                       $this->getOutput()->addModules( 'mediawiki.special.userlogin.signup' );
                } else {
                        $template = new UserloginTemplate();
                        $q = 'action=submitlogin&type=login';
@@ -1083,6 +1084,7 @@ class LoginForm extends SpecialPage {
                $template->set( 'name', $this->mUsername );
                $template->set( 'password', $this->mPassword );
                $template->set( 'retype', $this->mRetype );
+               $template->set( 'createemailset', $this->mCreateaccountMail );
                $template->set( 'email', $this->mEmail );
                $template->set( 'realname', $this->mRealName );
                $template->set( 'domain', $this->mDomain );
index 3cfa31f..afa9c78 100644 (file)
@@ -91,7 +91,9 @@ class SpecialWatchlist extends SpecialPage {
                        return;
                }
 
-               $nitems = $this->countItems();
+               $dbr = wfGetDB( DB_SLAVE, 'watchlist' );
+
+               $nitems = $this->countItems( $dbr );
                if ( $nitems == 0 ) {
                        $output->addWikiMsg( 'nowatchlist' );
                        return;
@@ -190,13 +192,11 @@ class SpecialWatchlist extends SpecialPage {
                        return;
                }
 
-               $dbr = wfGetDB( DB_SLAVE, 'watchlist' );
-
                # Possible where conditions
                $conds = array();
 
                if( $values['days'] > 0 ) {
-                       $conds[] = "rc_timestamp > '".$dbr->timestamp( time() - intval( $values['days'] * 86400 ) )."'";
+                       $conds[] = 'rc_timestamp > ' . $dbr->addQuotes( $dbr->timestamp( time() - intval( $values['days'] * 86400 ) ) );
                }
 
                # If the watchlist is relatively short, it's simplest to zip
@@ -497,11 +497,10 @@ class SpecialWatchlist extends SpecialPage {
        /**
         * Count the number of items on a user's watchlist
         *
+        * @param $dbr A database connection
         * @return Integer
         */
-       protected function countItems() {
-               $dbr = wfGetDB( DB_SLAVE, 'watchlist' );
-
+       protected function countItems( $dbr ) {
                # Fetch the raw count
                $res = $dbr->select( 'watchlist', array( 'count' => 'COUNT(*)' ),
                        array( 'wl_user' => $this->getUser()->getId() ), __METHOD__ );
index 6e1094f..569200d 100644 (file)
@@ -77,13 +77,27 @@ class UsercreateTemplate extends QuickTemplate {
                        </td>
                </tr>
                <tr>
+                       <td></td>
+                       <td class="mw-input">
+                               <?php if( $this->data['createemail'] ) {
+                                       echo Xml::checkLabel(
+                                               wfMessage( 'createaccountmail' )->text(),
+                                               'wpCreateaccountMail',
+                                               'wpCreateaccountMail',
+                                               $this->data['createemailset'],
+                                               array( 'tabindex' => '2' )
+                                       );
+                               } ?>
+                       </td>
+               </tr>
+               <tr class="mw-row-password">
                        <td class="mw-label"><label for='wpPassword2'><?php $this->msg('yourpassword') ?></label></td>
                        <td class="mw-input">
 <?php
                        echo Html::input( 'wpPassword', null, 'password', array(
                                'class' => 'loginPassword',
                                'id' => 'wpPassword2',
-                               'tabindex' => '2',
+                               'tabindex' => '3',
                                'size' => '20'
                        ) + User::passwordChangeInputAttribs() ); ?>
                        </td>
@@ -98,20 +112,20 @@ class UsercreateTemplate extends QuickTemplate {
                        <td class="mw-label"><?php $this->msg( 'yourdomainname' ) ?></td>
                        <td class="mw-input">
                                <select name="wpDomain" value="<?php $this->text( 'domain' ) ?>"
-                                       tabindex="3">
+                                       tabindex="4">
                                        <?php echo $doms ?>
                                </select>
                        </td>
                </tr>
        <?php } ?>
-               <tr>
+               <tr class="mw-row-password">
                        <td class="mw-label"><label for='wpRetype'><?php $this->msg('yourpasswordagain') ?></label></td>
                        <td class="mw-input">
                                <?php
                echo Html::input( 'wpRetype', null, 'password', array(
                        'class' => 'loginPassword',
                        'id' => 'wpRetype',
-                       'tabindex' => '4',
+                       'tabindex' => '5',
                        'size' => '20'
                ) + User::passwordChangeInputAttribs() ); ?>
                        </td>
@@ -124,7 +138,7 @@ class UsercreateTemplate extends QuickTemplate {
                echo Html::input( 'wpEmail', $this->data['email'], 'email', array(
                        'class' => 'loginText',
                        'id' => 'wpEmail',
-                       'tabindex' => '5',
+                       'tabindex' => '6',
                        'size' => '20'
                ) ); ?>
                                        <div class="prefsectiontip">
@@ -146,7 +160,7 @@ class UsercreateTemplate extends QuickTemplate {
                                        <td class="mw-label"><label for='wpRealName'><?php $this->msg('yourrealname') ?></label></td>
                                        <td class="mw-input">
                                                <input type='text' class='loginText' name="wpRealName" id="wpRealName"
-                                                       tabindex="6"
+                                                       tabindex="7"
                                                        value="<?php $this->text('realname') ?>" size='20' />
                                                <div class="prefsectiontip">
                                                        <?php $this->msgWiki('prefs-help-realname'); ?>
@@ -159,7 +173,7 @@ class UsercreateTemplate extends QuickTemplate {
                                        <td class="mw-label"><label for='wpReason'><?php $this->msg('createaccountreason') ?></label></td>
                                        <td class="mw-input">
                                                <input type='text' class='loginText' name="wpReason" id="wpReason"
-                                                       tabindex="7"
+                                                       tabindex="8"
                                                        value="<?php $this->text('reason') ?>" size='20' />
                                        </td>
                        <?php } ?>
@@ -176,14 +190,14 @@ class UsercreateTemplate extends QuickTemplate {
                                        'wpRemember',
                                        'wpRemember',
                                        $this->data['remember'],
-                                       array( 'tabindex' => '8' )
+                                       array( 'tabindex' => '9' )
                                )
                                ?>
                        </td>
                </tr>
 <?php   }
 
-               $tabIndex = 9;
+               $tabIndex = 10;
                if ( isset( $this->data['extraInput'] ) && is_array( $this->data['extraInput'] ) ) {
                        foreach ( $this->data['extraInput'] as $inputItem ) { ?>
                <tr>
@@ -234,11 +248,6 @@ class UsercreateTemplate extends QuickTemplate {
                                <input type='submit' name="wpCreateaccount" id="wpCreateaccount"
                                        tabindex="<?php echo $tabIndex++; ?>"
                                        value="<?php $this->msg('createaccount') ?>" />
-                               <?php if( $this->data['createemail'] ) { ?>
-                               <input type='submit' name="wpCreateaccountMail" id="wpCreateaccountMail"
-                                       tabindex="<?php echo $tabIndex++; ?>"
-                                       value="<?php $this->msg('createaccountmail') ?>" />
-                               <?php } ?>
                        </td>
                </tr>
        </table>
index fec3c73..8198dea 100644 (file)
@@ -112,7 +112,7 @@ class PublishStashedFile extends Maintenance {
                                array(
                                        'result' => 'Failure',
                                        'stage'  => 'publish',
-                                       'status' => Status::newFatal( 'api-error-stashfailed' )
+                                       'status' => Status::newFatal( 'api-error-publishfailed' )
                                )
                        );
                        throw $e;
index 0a1cd37..2159052 100644 (file)
@@ -245,6 +245,78 @@ class Language {
                throw new MWException( "Invalid fallback sequence for language '$code'" );
        }
 
+       /**
+        * Checks whether any localisation is available for that language tag
+        * in MediaWiki (MessagesXx.php exists).
+        *
+        * @param string $code Language tag (in lower case)
+        * @return bool Whether language is supported
+        * @since 1.21
+        */
+       public static function isSupportedLanguage( $code ) {
+               return is_readable( self::getMessagesFileName( $code ) );
+       }
+
+       /**
+        * Returns true if a language code string is a well-formed language tag
+        * according to RFC 5646.
+        * This function only checks well-formedness; it doesn't check that
+        * language, script or variant codes actually exist in the repositories.
+        *
+        * Based on regexes by Mark Davis of the Unicode Consortium:
+        * http://unicode.org/repos/cldr/trunk/tools/java/org/unicode/cldr/util/data/langtagRegex.txt
+        *
+        * @param $code string
+        * @param $lenient boolean Whether to allow '_' as separator. The default is only '-'.
+        *
+        * @return bool
+        * @since 1.21
+        */
+       public static function isWellFormedLanguageTag( $code, $lenient = false ) {
+               $alpha = '[a-z]';
+               $digit = '[0-9]';
+               $alphanum = '[a-z0-9]';
+               $x = 'x' ; # private use singleton
+               $singleton = '[a-wy-z]'; # other singleton
+               $s = $lenient ? '[-_]' : '-';
+
+               $language = "$alpha{2,8}|$alpha{2,3}$s$alpha{3}";
+               $script = "$alpha{4}"; # ISO 15924
+               $region = "(?:$alpha{2}|$digit{3})"; # ISO 3166-1 alpha-2 or UN M.49
+               $variant = "(?:$alphanum{5,8}|$digit$alphanum{3})";
+               $extension = "$singleton(?:$s$alphanum{2,8})+";
+               $privateUse = "$x(?:$s$alphanum{1,8})+";
+
+               # Define certain grandfathered codes, since otherwise the regex is pretty useless.
+               # Since these are limited, this is safe even later changes to the registry --
+               # the only oddity is that it might change the type of the tag, and thus
+               # the results from the capturing groups.
+               # http://www.iana.org/assignments/language-subtag-registry
+
+               $grandfathered = "en{$s}GB{$s}oed"
+                       . "|i{$s}(?:ami|bnn|default|enochian|hak|klingon|lux|mingo|navajo|pwn|tao|tay|tsu)"
+                       . "|no{$s}(?:bok|nyn)"
+                       . "|sgn{$s}(?:BE{$s}(?:fr|nl)|CH{$s}de)"
+                       . "|zh{$s}min{$s}nan";
+
+               $variantList = "$variant(?:$s$variant)*";
+               $extensionList = "$extension(?:$s$extension)*";
+
+               $langtag = "(?:($language)"
+                       . "(?:$s$script)?"
+                       . "(?:$s$region)?"
+                       . "(?:$s$variantList)?"
+                       . "(?:$s$extensionList)?"
+                       . "(?:$s$privateUse)?)";
+
+               # The final breakdown, with capturing groups for each of these components
+               # The variants, extensions, grandfathered, and private-use may have interior '-'
+
+               $root = "^(?:$langtag|$privateUse|$grandfathered)$";
+
+               return (bool)preg_match( "/$root/", strtolower( $code ) );
+       }
+
        /**
         * Returns true if a language code string is of a valid form, whether or
         * not it exists. This includes codes which are used solely for
@@ -4288,5 +4360,4 @@ class Language {
                $form = CLDRPluralRuleEvaluator::evaluateCompiled( $number, $pluralRules );
                return $form;
        }
-
 }
index 244c803..b239f33 100644 (file)
@@ -255,7 +255,7 @@ $messages = array(
 
 'underline-always' => 'Altyd',
 'underline-never' => 'Nooit',
-'underline-default' => 'Blaaierverstek',
+'underline-default' => 'Standaard in u omslag of webblaaier',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Lettertipe vir wysigingsvenster:',
@@ -340,6 +340,7 @@ $messages = array(
 'newwindow' => '(verskyn in nuwe venster)',
 'cancel' => 'Kanselleer',
 'moredotdotdot' => 'Meer…',
+'morenotlisted' => 'Meer nie gelys nie...',
 'mypage' => 'Gebruikersblad',
 'mytalk' => 'Bespreking',
 'anontalk' => 'Besprekingsblad vir hierdie IP',
@@ -363,7 +364,7 @@ $messages = array(
 'vector-action-protect' => 'Beskerm',
 'vector-action-undelete' => 'Ontskrap',
 'vector-action-unprotect' => 'Wysig beskerming',
-'vector-simplesearch-preference' => 'Aktiveer verbeterde soek-voorstelle (slegs vir die Vektor omslag)',
+'vector-simplesearch-preference' => 'Aktiveer vereenvoudigde soekbalk (slegs vir die Vektor-omslag)',
 'vector-view-create' => 'Skep',
 'vector-view-edit' => 'Wysig',
 'vector-view-history' => 'Wys geskiedenis',
@@ -539,13 +540,11 @@ Databasis gee foutboodskap: "$3: $4".',
 'laggedslavemode' => 'Waarskuwing: Onlangse wysigings dalk nie in bladsy vervat nie.',
 'readonly' => 'Databasis gesluit',
 'enterlockreason' => 'Rede vir die sluiting,
-en beraming van wanneer ontsluiting sal plaas vind',
-'readonlytext' => 'Die {{SITENAME}} databasis is tans gesluit vir nuwe
-artikelwysigings, waarskynlik vir roetine databasisonderhoud,
+en beraming van wanneer ontsluiting sal plaasvind',
+'readonlytext' => 'Die databasis is tans gesluit vir nuwe artikelwysigings, waarskynlik vir roetine onderhoud,
 waarna dit terug sal wees na normaal.
-Die administreerder wat dit gesluit het se verduideliking:
 
-$1',
+Die administrateur wat dit gesluit het se verduideliking: $1',
 'missing-article' => "Die databasis kon nie soos verwag die teks vir die bladsy genaamd \"\$1\" \$2 kry nie.
 
 Dit gebeur gewoonlik as mens 'n verouderde verskil- of geskiedenis-skakel volg na 'n bladsy wat reeds verwyder is.
@@ -553,7 +552,7 @@ Dit gebeur gewoonlik as mens 'n verouderde verskil- of geskiedenis-skakel volg n
 Indien dit nie die geval is nie, het u moontlik 'n fout in die sagteware ontdek. Rapporteer asseblief die probleem aan 'n [[Special:ListUsers/sysop|administrateur]], en maak 'n nota van die URL.",
 'missingarticle-rev' => '(weergawe#: $1)',
 'missingarticle-diff' => '(Wysiging: $1, $2)',
-'readonly_lag' => 'Die databasis is outomaties gesluit terwyl die slaafdatabasisse sinchroniseer met die meester',
+'readonly_lag' => 'Die databasis is outomaties gesluit terwyl die slaafdatabasisse met die meester gesinchroniseer word',
 'internalerror' => 'Interne fout',
 'internalerror_info' => 'Interne fout: $1',
 'fileappenderrorread' => 'Kon nie "$1" tydens die "append" lees nie.',
@@ -567,7 +566,7 @@ Indien dit nie die geval is nie, het u moontlik 'n fout in die sagteware ontdek.
 'unexpected' => 'Onverwagte waarde: "$1"="$2".',
 'formerror' => 'Fout: kon vorm nie stuur nie',
 'badarticleerror' => 'Die aksie kon nie op hierdie bladsy uitgevoer word nie.',
-'cannotdelete' => 'Die bladsy of lêer "$1" kon nie skrap word nie.
+'cannotdelete' => 'Die bladsy of lêer "$1" kon nie verwyder word nie.
 Iemand anders het dit moontlik reeds geskrap.',
 'cannotdelete-title' => 'Bladsy "$1" kan nie verwyder word nie',
 'delete-hook-aborted' => "Die wysiging is deur 'n hoek gekanselleer.
@@ -586,10 +585,11 @@ Navraag: $2',
 'actionthrottled' => 'Outo-rem op aksie uitgevoer',
 'actionthrottledtext' => "As 'n teen-strooi aksie, word u beperk om hierdie aksie te veel keer in 'n kort tyd uit te voer, en u het hierdie limiet oorskry.
 Probeer asseblief weer oor 'n paar minute.",
-'protectedpagetext' => 'Hierdie bladsy is beskerm om redigering te verhoed.',
+'protectedpagetext' => 'Hierdie bladsy is beskerm om wysigings en ander aksies te verhoed.',
 'viewsourcetext' => 'U mag die bronteks van hierdie bladsy lees en kopieer:',
 'viewyourtext' => "U kan '''u wysigings''' aan die bronteks van hierdie bladsy bekyk en kopieer:",
-'protectedinterface' => 'Hierdie bladsy verskaf teks vir die koppelvlak van die sagteware, en is beskerm om misbruik te voorkom.',
+'protectedinterface' => 'Hierdie bladsy verskaf teks vir die koppelvlak van die sagteware, en is beskerm om misbruik te voorkom.
+Gebruik asseblief [//translatewiki.net/ translatewiki.net] om vertalings by te voeg of te wysig.',
 'editinginterface' => "'''Waarskuwing:''' U is besig om 'n bladsy te redigeer wat koppelvlakinligting aan die programmatuur voorsien. Wysigings aan hierdie bladsy sal die voorkoms van die gebruikerskoppelvlak vir ander gebruikers beïnvloed. Vir vertalings, oorweeg om eerder [//translatewiki.net/wiki/Main_Page?setlang=af translatewiki.net] (die vertalingsprojek vir MediaWiki) te gebruik.",
 'sqlhidden' => '(SQL navraag versteek)',
 'cascadeprotected' => 'Hierdie bladsy is beskerm teen redigering omdat dit ingesluit is in die volgende {{PLURAL:$1|bladsy|bladsye}} wat beskerm is met die "kaskade" opsie aangeskakel: $2',
@@ -627,7 +627,7 @@ Moenie vergeet om u [[Special:Preferences|voorkeure vir {{SITENAME}}]] te stel n
 'securelogin-stick-https' => 'Bly verbind met HTTPS na aanmelding',
 'yourdomainname' => 'U domein:',
 'password-change-forbidden' => 'U kan nie wagwoorde op hierdie wiki verander nie.',
-'externaldberror' => "'n Databasis fout het voorgekom tydens aanmelding of u het nie toestemming om u eksterne rekening op te dateer nie.",
+'externaldberror' => "'n Databasisfout het voorgekom tydens aanmelding of u het nie toestemming om u eksterne rekening op te dateer nie.",
 'login' => 'Teken in',
 'nav-login-createaccount' => 'Teken in',
 'loginprompt' => 'U blaaier moet koekies toelaat om by {{SITENAME}} te kan aanteken.',
@@ -713,6 +713,7 @@ Wag asseblief alvorens u weer probeer.",
 # E-mail sending
 'php-mail-error-unknown' => 'Onbekende fout in PHP se mail()-funksie',
 'user-mail-no-addy' => "Geprobeer om e-pos te stuur sonder 'n e-posadres.",
+'user-mail-no-body' => "Daar is probeer om 'n leë of 'n onredelike kort boodskap te stuur.",
 
 # Change password dialog
 'resetpass' => 'Verander wagwoord',
@@ -936,9 +937,9 @@ Deur enigiets hier te plaas, beloof u dat u dit self geskryf het, of dat dit gek
 '''MOENIE WERK WAT DEUR KOPIEREG BESKERM WORD HIER PLAAS SONDER TOESTEMMING NIE!'''",
 'longpageerror' => "'''Fout: die teks wat u bygevoeg het is {{PLURAL:$1|een kilogreep|$1 kilogrepe}} groot, wat groter is as die maksimum van {{PLURAL:$2|een kilogreep|$2 kilogrepe}}.'''
 Die bladsy kan nie gestoor word nie.",
-'readonlywarning' => "'''WAARSKUWING: Die databasis is gesluit vir onderhoud. Dus sal u nie nou u wysigings kan stoor nie. Dalk wil u die teks plak in 'n lêer en stoor vir later.'''
+'readonlywarning' => "'''WAARSKUWING: Die databasis is gesluit vir onderhoud. Dus sal u nie nou u wysigings kan stoor nie. Dalk wil u die teks in 'n lêer plak en stoor vir later.'''
 
-Een administrateur het die databasis geblokkeer vir hierdie rede: $1",
+Die administrateur wat dit gesluit het se verduideliking: $1",
 'protectedpagewarning' => "'''WAARSKUWING: Hierdie bladsy is beveilig sodat slegs administrateurs die inhoud sal kan verander.''' Die nuutste logboekinskrywing word hieronder ter verwysing vertoon:",
 'semiprotectedpagewarning' => "'''Let wel:''' Hierdie artikel is beveilig sodat slegs ingetekende gebruikers dit sal kan wysig. Die nuutste logboekinskrywing word hieronder ter verwysing vertoon:",
 'cascadeprotectedwarning' => "'''Waarskuwing:''' Die bladsy was beveilig sodat dit slegs deur administrateurs gewysig kan word, omrede dit ingesluit is in die volgende {{PLURAL:$1|bladsy|bladsye}} wat kaskade-beskerming geniet:",
@@ -1139,7 +1140,9 @@ Kontroleer asseblief die logboeke.",
 'revdelete-only-restricted' => "'n Fout het voorgekom met die verberging van die item van $1, $2: u kan nie items onderdruk uit die sig van administrateurs sonder om ook een van die ander sigbaarheidsopsies te kies nie.",
 'revdelete-reason-dropdown' => '* Algemene redes vir skrapping
 ** Skending van outeursreg
-** Onbetaamlike persoonlike inligting',
+** Onbetaamlike persoonlike inligting
+** Onbetaamlike gebruikersnaam
+** Potensieel lasterlike gegewens',
 'revdelete-otherreason' => 'Ander rede:',
 'revdelete-reasonotherlist' => 'Ander rede',
 'revdelete-edit-reasonlist' => 'Wysig skrap redes',
@@ -1348,9 +1351,9 @@ Die aksie kan nie ongedaan gemaak word nie.',
 'prefs-emailconfirm-label' => 'E-posbevestiging:',
 'prefs-textboxsize' => 'Afmetings van die wysigingsvenster',
 'youremail' => 'E-pos',
-'username' => 'Gebruikersnaam:',
+'username' => '{{GENDER:$1|Gebruikersnaam}}:',
 'uid' => '{{GENDER:$1|Gebruikersnommer}}:',
-'prefs-memberingroups' => 'Lid van {{PLURAL:$1|groep|groepe}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Lid}} van {{PLURAL:$1|groep|groepe}}:',
 'prefs-registration' => 'Registrasiedatum:',
 'yourrealname' => 'Regte naam:',
 'yourlanguage' => 'Taal:',
@@ -1767,7 +1770,7 @@ As daar steeds probleme is, kontak 'n [[Special:ListUsers/sysop|administrateur]]
 'backend-fail-internal' => "'n Onbekende fout het in die agterliggende stoorspasie $1 voorgekom.",
 'backend-fail-contenttype' => 'Kon nie die inhoudstipe van die lêer bepaal om na "$1" te stoor nie.',
 'backend-fail-batchsize' => "Die agterliggende stoorspasie het 'n groep van $1 {{PLURAL:$1|operasie|operasies}} ontvang; die limiet is $2 {{PLURAL:$2|operasie|operasies}}.",
-'backend-fail-usable' => 'Kon nie na die lêer "$1" skryf nie vanweë onvoldoende regte of gidse wat nie bestaan nie.',
+'backend-fail-usable' => 'Kon nie die lêer "$1" lees of skryf nie vanweë onvoldoende regte of gidse wat nie bestaan nie.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Kon nie na die joernaal-databasis op die agterliggende stoorspasie "$1" konnekteer nie.',
@@ -2141,7 +2144,7 @@ Sie ook [[Special:WantedCategories|nie-bestaande kategorieë met verwysings]].',
 'linksearch-ok' => 'Soek',
 'linksearch-text' => 'Patrone soos "*.wikipedia.org" kan gebruik word.<br />
 Benodig ten minste een topvlakdomein, soos byvoorbeeld "*.org".<br />
-Ondersteunde protokolle: <code>$1</code> (moenie hierdie in u soektog gebruik nie)',
+{{PLURAL:$2|Ondersteunde protokol|Ondersteunde protokolle}}: <code>$1</code> (http:// word gebruik as niks gespesifiseer is nie)',
 'linksearch-line' => '$1 geskakel vanaf $2',
 'linksearch-error' => 'Patrone kan slegs aan die begin van die rekenaarnaam geplaas word.',
 
@@ -2186,7 +2189,7 @@ Daar kan [[{{MediaWiki:Listgrouprights-helppage}}|extra inligting]] oor individu
 'emailuser-title-target' => 'E-pos die {{GENDER:$1|gebruiker}}',
 'emailuser-title-notarget' => 'E-pos gebruiker',
 'emailpage' => 'Stuur e-pos na gebruiker',
-'emailpagetext' => 'As dié gebruiker \'n geldige e-posadres in sy/haar gebruikersvoorkeure het, sal hierdie vorm \'n enkele boodskap stuur. Die e-posadres in u [[Special:Preferences|gebruikersvoorkeure]] sal verkyn as die "Van"-adres van die pos. Dus sal die ontvanger kan terug antwoord.',
+'emailpagetext' => 'As {{GENDER:$1|dié gebruiker}} \'n geldige e-posadres in sy/haar gebruikersvoorkeure het, sal hierdie vorm \'n enkele boodskap stuur. Die e-posadres in u [[Special:Preferences|gebruikersvoorkeure]] sal verskyn as die "Van"-adres van die pos. Dus sal die ontvanger kan terug antwoord.',
 'usermailererror' => 'Fout met versending van e-pos:',
 'defemailsubject' => 'E-pos van {{SITENAME}}-gebruiker "$1"',
 'usermaildisabled' => 'E-pos deur gebruikers is gedeaktiveer.',
@@ -2225,9 +2228,8 @@ Daar kan [[{{MediaWiki:Listgrouprights-helppage}}|extra inligting]] oor individu
 'watchnologintext' => 'U moet [[Special:UserLogin|ingeteken]]
 wees om u dophoulys te verander.',
 'addwatch' => 'Voeg by dophoulys',
-'addedwatchtext' => "Die bladsy \"[[:\$1]]\" is by u [[Special:Watchlist|dophoulys]] bygevoeg. Toekomstige wysigings aan hierdie bladsy en sy verwante besprekingsblad sal op [[Special:Watchlist|u dophoulys]] gelys word en sal in '''vetdruk''' in die [[Special:RecentChanges|lys van onlangse wysigings]] vertoon word, sodat u dit makliker kan raaksien.
-
-As u die bladsy later van u dophoulys wil verwyder, kliek \"verwyder van dophoulys\" in die kieslys bo-aan die bladsy.",
+'addedwatchtext' => 'Die bladsy "[[:$1]]" is by u [[Special:Watchlist|dophoulys]] bygevoeg.
+Toekomstige wysigings aan hierdie bladsy en sy bybehorende besprekingsblad sal hier gelys word.',
 'removewatch' => 'Verwyder van dophoulys',
 'removedwatchtext' => 'Die bladsy "[[:$1]]" is van [[Special:Watchlist|u dophoulys]] afgehaal.',
 'watch' => 'Hou dop',
@@ -2261,14 +2263,17 @@ As u die bladsy later van u dophoulys wil verwyder, kliek \"verwyder van dophoul
 'enotif_subject_moved' => '{{SITENAME}}: bladsy $1 is geskuif deur {{GENDER:$2|$2}}',
 'enotif_subject_restored' => '{{SITENAME}}: bladsy $1 is teruggeplaas deur {{GENDER:$2|$2}}',
 'enotif_subject_changed' => '{{SITENAME}}: bladsy $1 is gewysig deur {{GENDER:$2|$2}}',
+'enotif_body_intro_deleted' => 'Die bladsy $1 op {{SITENAME}} is deur {{gender:$2|$2}} op $PAGEEDITDATE verwyder. Sien $3 vir die huidige weergawe.',
+'enotif_body_intro_created' => 'Die bladsy $1 op {{SITENAME}} is deur {{GENDER:$2|$2}} op $PAGEEDITDATE geskep. Sien $3 vir die huidige weergawe.',
+'enotif_body_intro_moved' => 'Die bladsy $1 op {{SITENAME}} is deur {{GENDER:$2|$2}} op $PAGEEDITDATE hernoem. Sien $3 vir die huidige weergawe.',
+'enotif_body_intro_restored' => 'Die bladsy $1 op {{SITENAME}} is deur {{GENDER:$2|$2}} op $PAGEEDITDATE teruggeplaas. Sien $3 vir die huidige weergawe.',
+'enotif_body_intro_changed' => 'Die bladsy $1 op {{SITENAME}} is op $PAGEEDITDATE deur {{GENDER:$2|$2}} gewysig. Sien $3 vir die huidige weergawe.',
 'enotif_lastvisited' => 'Sien $1 vir alle wysigings sedert u laaste besoek.',
-'enotif_lastdiff' => 'Sien $1 om hierdie wysiging te bekyk.',
+'enotif_lastdiff' => 'Gaan na $1 om hierdie wysiging te sien.',
 'enotif_anon_editor' => 'anonieme gebruiker $1',
 'enotif_body' => 'Beste $WATCHINGUSERNAME,
 
-Die bladsy $PAGETITLE op {{SITENAME}} is $CHANGEDORCREATED op $PAGEEDITDATE deur $PAGEEDITOR, sien $PAGETITLE_URL vir die nuutste weergawe.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Samevatting van die wysiging: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2277,9 +2282,9 @@ E-pos: $PAGEEDITOR_EMAIL
 Wiki: $PAGEEDITOR_WIKI
 
 Tensy u hierdie bladsy besoek, sal u geen verdere kennisgewings ontvang nie.
-U kan ook die waarskuwingsvlag op u dophoulys verstel.
+U kan ook die waarskuwingsvlag op u dophoulys stel.
 
-Groete van {{SITENAME}} se waarskuwingssisteem.
+Groete van {{SITENAME}} se waarskuwingsstelsel.
 
 --
 U kan u e-posvoorkeure stel by:
@@ -2366,6 +2371,8 @@ Sien die [[Special:ProtectedPages|lys van beveiligde bladsye]] vir alle bladsye
 'prot_1movedto2' => 'het [[$1]] geskuif na [[$2]]',
 'protect-badnamespace-title' => 'Nie-beskermde naamruimte',
 'protect-badnamespace-text' => 'Bladsye in hierdie naamruimte kan nie beskerm word nie.',
+'protect-norestrictiontypes-text' => 'Die bladsy kan nie beveilig word nie omdat daar geen beperkingstipes beskikbaar is nie.',
+'protect-norestrictiontypes-title' => 'Nie beveiligbare bladsy',
 'protect-legend' => 'Bevestig beskerming',
 'protectcomment' => 'Rede:',
 'protectexpiry' => 'Verval:',
@@ -2381,9 +2388,9 @@ Hier volg die huidige instellings vir bladsy '''$1''':",
 Hier is die huidige verstellings vir bladsy '''$1''':",
 'protect-cascadeon' => 'Die bladsy word beskerm want dit is ingesluit by die volgende {{PLURAL:$1|blad|blaaie}} wat kaskade-beskerming geniet. U kan die veiligheidsvlak van die bladsy verander, maar dit sal nie die ander kaskade blaaie beïnvloed nie.',
 'protect-default' => 'Laat alle gebruikers toe',
-'protect-fallback' => 'Hiervoor is "$1" regte nodig',
-'protect-level-autoconfirmed' => 'Blokkeer nuwe en ongeregistreerde gebruikers',
-'protect-level-sysop' => 'Slegs administrateurs',
+'protect-fallback' => 'Laat slegs gebruikers met "$1" regte toe',
+'protect-level-autoconfirmed' => 'Laat slegs "autoconfirmed" gebruikers toe',
+'protect-level-sysop' => 'Laat slegs administrateurs toe',
 'protect-summary-cascade' => 'kaskade',
 'protect-expiring' => 'verval op $2 om $3 (UTC)',
 'protect-expiring-local' => 'verval op $1',
@@ -2449,7 +2456,8 @@ U mag moontlik 'n foutiewe skakel hê, of die weergawe is reeds herstel of uit d
 'undeletedrevisions' => '{{PLURAL:$1|1 weergawe|$1 weergawes}} herstel',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 weergawe|$1 weergawes}} en {{PLURAL:$2|1 lêer|$2 lêers}} herstel',
 'undeletedfiles' => '{{PLURAL:$1|1 lêer|$1 lêers}} herstel',
-'cannotundelete' => 'Skrapping onsuksesvol; miskien het iemand anders dié bladsy al geskrap.',
+'cannotundelete' => 'Terugplasing was onsuksesvol:
+$1',
 'undeletedpage' => "'''$1 is teruggeplaas'''
 
 Konsulteer die [[Special:Log/delete|verwyderingslogboek]] vir 'n rekord van onlangse verwyderings en terugplasings.",
@@ -2733,14 +2741,14 @@ Kies asseblief 'n ander naam.",
 'move-subpages' => 'Skuif al die subbladsye (maksimaal $1)',
 'move-talk-subpages' => 'Skuif al die subbladsye van die besprekingsblad (maksimaal $1)',
 'movepage-page-exists' => 'Die bladsy $1 bestaan reeds en kan nie outomaties oorskryf word nie.',
-'movepage-page-moved' => 'Die bladsy $1 was na $2 geskuif.',
+'movepage-page-moved' => 'Die bladsy $1 is na $2 geskuif.',
 'movepage-page-unmoved' => 'Die bladsy $1 kon nie na $2 geskuif word nie.',
 'movepage-max-pages' => 'Die maksimum van $1 {{PLURAL:$1|bladsy|bladsye}} is geskuif. Die oorblywende bladsye na nie outomaties geskuif word nie.',
 'movelogpage' => 'Skuiflogboek',
 'movelogpagetext' => "Hier onder is 'n lys van geskuifde bladsye.",
 'movesubpage' => '{{PLURAL:$1|Subbladsy|Subbladsye}}',
 'movesubpagetext' => 'Die {{PLURAL:$1|subbladsy|$1 subbladsye}} van hierdie blad word hieronder gewys.',
-'movenosubpage' => 'Die bladsy het geen subbladsye.',
+'movenosubpage' => 'Die bladsy het geen subbladsye nie.',
 'movereason' => 'Rede:',
 'revertmove' => 'rol terug',
 'delete_and_move' => 'Skrap en skuif',
@@ -2834,6 +2842,7 @@ Alle transwiki-laaie word opgeteken in die [[Special:Log/import|invoer-logboek]]
 'import-interwiki-templates' => 'Sluit alle sjablone in',
 'import-interwiki-submit' => 'Importeer',
 'import-interwiki-namespace' => 'Doelnaamruimte:',
+'import-interwiki-rootpage' => 'Basisblad van bestemming (opsioneel):',
 'import-upload-filename' => 'Lêernaam:',
 'import-comment' => 'Opmerking:',
 'importtext' => 'Gebruik die [[Special:Export|eksport-funksie]] van die wiki waar die inligting vandaan kom.
@@ -2869,7 +2878,10 @@ Die lêer is slegs gedeeltelik opgelaai.',
 'import-error-interwiki' => 'Die bladsy "$1" is nie geïmporteer nie omdat sy naam vir eksterne skakeling (interwiki) gereserveer is.',
 'import-error-special' => 'Die bladsy "$1" is nie geïmporteer nie omdat dit aan \'n spesiale naamruimte behoort waarin geen bladsye geplaas kan word nie.',
 'import-error-invalid' => 'Die bladsy "$1" is nie geïmporteer nie omdat die naam ongeldig is.',
+'import-error-unserialize' => 'Weergawe $2 van die bladsy "$1" kon nie verwerk word nie. Die weergawe hoort inhoudsmodel $3 te gebruik met \'n serialisasie van $4.',
 'import-options-wrong' => 'Verkeerde {{PLURAL:$2|opsie|opsies}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Die gespesifiseerde basisblad is ongeldig.',
+'import-rootpage-nosubpage' => 'Die naamruimte "$1" van die basisblad laat nie subblaaie toe nie.',
 
 # Import log
 'importlogpage' => 'Invoer logboek',
@@ -3007,7 +3019,7 @@ Hierdie situasie was waarskynlik deur 'n skakel na 'n eksterne webtuiste op ons
 'pageinfo-redirects-name' => 'Aansture na die bladsy',
 'pageinfo-subpages-name' => 'Subblaaie van die bladsy',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|aanstuur|aansture}}; $3 {{PLURAL:$3|nie-aanstuur|nie-aansture}})',
-'pageinfo-firstuser' => 'Gebruiker die die bladsy geskep het',
+'pageinfo-firstuser' => 'Gebruiker wat die bladsy geskep het',
 'pageinfo-firsttime' => 'Datum waarop die bladsy geskep is',
 'pageinfo-lastuser' => 'Laatste wysiger',
 'pageinfo-lasttime' => 'Datum van laatste wysiging',
@@ -3018,6 +3030,7 @@ Hierdie situasie was waarskynlik deur 'n skakel na 'n eksterne webtuiste op ons
 'pageinfo-magic-words' => '{{PLURAL:$1|Magiese woord|Magiese woorde}} ($1)',
 'pageinfo-hidden-categories' => 'Versteekte {{PLURAL:$1|kategorie|kategorieë}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Gebruikte sjabloon|Gebruikte sjablone}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Bladsy|Bladsye}} getranskludeerd op ($1)',
 'pageinfo-toolboxlink' => 'Bladinligting',
 'pageinfo-redirectsto' => 'Stuur aan na',
 'pageinfo-redirectsto-info' => 'Inligting',
@@ -3026,6 +3039,10 @@ Hierdie situasie was waarskynlik deur 'n skakel na 'n eksterne webtuiste op ons
 'pageinfo-protect-cascading' => 'Beveiliging werk vanaf hier deur',
 'pageinfo-protect-cascading-yes' => 'Ja',
 'pageinfo-protect-cascading-from' => "Bladsy is vanuit 'n ander blad beveilig",
+'pageinfo-category-info' => 'Kategoriegegewens',
+'pageinfo-category-pages' => 'Aantal bladsye',
+'pageinfo-category-subcats' => 'Aantal subkategorieë',
+'pageinfo-category-files' => 'Aantal lêers',
 
 # Skin names
 'skinname-standard' => 'Standaard',
index 530a0ae..a162f09 100644 (file)
@@ -501,7 +501,7 @@ $messages = array(
 'tog-externaleditor' => 'استخدم محرراً خارجياً بشكل افتراضي (للخبراء فقط، يحتاج إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors لمزيد من المعلومات].)',
 'tog-externaldiff' => 'استخدم فرقاً خارجياً بشكل افتراضي (للخبراء فقط، يحتاج إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors للمزيد من المعلومات].)',
 'tog-showjumplinks' => 'مكن وصلات "اذهب إلى" المساعدة',
-'tog-uselivepreview' => 'استخدم الاستعراض السريع (جافاسكريبت)',
+'tog-uselivepreview' => 'استخدم الاستعراض السريع (جافاسكريبت) (تجريبي)',
 'tog-forceeditsummary' => 'نبهني عند إدخال ملخص تعديل فارغ',
 'tog-watchlisthideown' => 'أخف تعديلاتي من قائمة المراقبة',
 'tog-watchlisthidebots' => 'أخف تعديلات البوت من قائمة المراقبة',
@@ -2686,9 +2686,9 @@ $UNWATCHURL
 'protect-cascadeon' => 'هذه الصفحة محمية لكونها مضمنة في {{PLURAL:$1|الصفحة|الصفحات}} التالية، والتي بها خيار حماية الصفحات المدمجة فعال.
 يمكنك تغيير مستوى حماية هذه الصفحة بدون التأثير على حماية الصفحات المدمجة الأخرى.',
 'protect-default' => 'اسمح لكل المستخدمين',
-'protect-fallback' => 'يتطلب السماح "$1"',
-'protect-level-autoconfirmed' => 'اÙ\85Ù\86ع Ø§Ù\84Ù\85ستخدÙ\85Ù\8aÙ\86 Ø§Ù\84جدد Ù\88غÙ\8aر Ø§Ù\84Ù\85سجÙ\84Ù\8aÙ\86',
-'protect-level-sysop' => 'اÙ\84إدارÙ\8aÙ\88ن فقط',
+'protect-fallback' => 'السماح فقط للمستخدمين ذوي الصلاحية "$1"',
+'protect-level-autoconfirmed' => 'اÙ\84سÙ\85اح Ù\81Ù\82Ø· Ù\84Ù\84Ù\85ستخدÙ\85Ù\8aÙ\86 Ø§Ù\84Ù\85ؤÙ\83دÙ\8aÙ\86 ØªÙ\84Ù\82ائÙ\8aا',
+'protect-level-sysop' => 'اÙ\84سÙ\85اح Ù\84Ù\84إدارÙ\8aÙ\8aن فقط',
 'protect-summary-cascade' => 'مضمنة',
 'protect-expiring' => 'تنتهي في $1 (UTC)',
 'protect-expiring-local' => 'ينتهي $1',
@@ -2995,7 +2995,7 @@ $1',
 إذا اخترت أن تقوم بالتحديث يدوياً، فتأكد من عدم وجود تحويلات [[Special:DoubleRedirects|مزدوجة]] أو [[Special:BrokenRedirects|مكسورة]] وقم بتصحيحها.
 أنت المسؤول عن التأكد من أن الوصلات تصل إلى الصفحات التي يفترض أن تصل إليها.
 
-لاحظ أنه '''لن يتم''' نقل الصفحة إذا وجدت صفحة في العنوان الجديد، إلا إذا كانت فارغة أو صفحة تحويل، ولا تاريخ لها.
+لاحظ أنه '''لن يتم''' نقل الصفحة إذا وجدت صفحة في العنوان الجديد، إلا إذا كانت صفحة تحويل، ولا تاريخ لها.
 هذا يعني أنك تستطيع استرجاع الصفحة إلى مكانها لو قمت بخطأ، وأنك لا يمكنك نسخ هذه الصفحة فوق صفحة موجودة.
 
 '''تحذير!'''
index c056031..f2b1d8b 100644 (file)
@@ -253,7 +253,7 @@ $messages = array(
 'vector-action-addsection' => 'ܐܘܣܦ ܡܠܘܐܐ',
 'vector-action-delete' => 'ܫܘܦ',
 'vector-action-move' => 'ܫܢܝ',
-'vector-action-protect' => 'Ü¢Ü\9bÜ\98ܪ',
+'vector-action-protect' => 'Ü\9bܪ',
 'vector-action-undelete' => 'ܠܐ ܫܘܦ',
 'vector-action-unprotect' => 'ܫܚܠܦ ܢܛܝܪܘܬܐ',
 'vector-view-create' => 'ܒܪܝ',
@@ -289,9 +289,9 @@ $messages = array(
 'deletethispage' => 'ܫܘܦ ܦܐܬܐ ܗܕܐ',
 'undelete_short' => 'ܠܐ ܫܘܦ {{PLURAL:$1|ܚܕ ܫܘܚܠܦܐ|$1 ܫܘܚܠܦ̈ܐ}}',
 'viewdeleted_short' => 'ܚܙܝ {{PLURAL:$1|ܚܕ ܫܘܚܠܦܐ ܫܝܦܐ|$1 ܫܘܚܠܦ̈ܐ ܫܝܦ̈ܐ}}',
-'protect' => 'Ü¢Ü\9bÜ\98ܪ',
+'protect' => 'Ü\9bܪ',
 'protect_change' => 'ܫܚܠܦ',
-'protectthispage' => 'Ü¢Ü\9bÜ\98ܪ ܗܕܐ ܦܐܬܐ',
+'protectthispage' => 'Ü\9bܪ Ü ܗܕܐ ܦܐܬܐ',
 'unprotect' => 'ܫܚܠܦ ܢܛܝܪܘܬܐ',
 'unprotectthispage' => 'ܫܚܠܦ ܢܛܝܪܘܬܐ ܕܗܕܐ ܦܐܬܐ',
 'newpage' => 'ܦܐܬܐ ܚܕܬܐ',
@@ -1137,9 +1137,9 @@ $1',
 'special-categories-sort-abc' => 'ܛܟܣ ܗܓܝܢܐܝܬ',
 
 # Special:DeletedContributions
-'deletedcontributions' => 'ܫܘܬܦܘܝܬ̈ܐ ܕܡܦܠܚܢܐ ܫܝܦܬ̈ܐ',
-'deletedcontributions-title' => 'ܫܘܬܦܘܝܬ̈ܐ ܕܡܦܠܚܢܐ ܫܝܦܬ̈ܐ',
-'sp-deletedcontributions-contribs' => 'ܫܘܬܦܘܝܬ̈ܐ',
+'deletedcontributions' => 'ܫܘܬܦܘ̈ܬܐ ܫܝ̈ܦܬܐ ܕܡܦܠܚܢܐ',
+'deletedcontributions-title' => 'ܫܘܬܦܘ̈ܬܐ ܫܝ̈ܦܬܐ ܕܡܦܠܚܢܐ',
+'sp-deletedcontributions-contribs' => 'ܫܘܬܦܘ̈ܬܐ',
 
 # Special:LinkSearch
 'linksearch' => 'ܐܣܘܪ̈ܐ ܒܪ̈ܝܐ ܒܨܝܐ',
@@ -1230,6 +1230,8 @@ $1',
 'enotif_lastvisited' => 'ܚܙܝ $1 ܠܟܠ ܫܘܚܠܦ̈ܐ ܡܢ ܐܡܬܝ ܕܣܘܥܪܢܐ ܐܚܪܝܐ ܕܝܠܟ.',
 'enotif_lastdiff' => 'ܚܙܝ $1 ܠܚܙܝܐ ܕܫܘܚܠܦܐ ܗܢܐ.',
 'enotif_anon_editor' => 'ܡܦܠܚܢܐ ܠܐ ܝܕܝܥܐ $1',
+'created' => 'ܒܪܐ',
+'changed' => 'ܐܫܬܚܠܦܬ',
 
 # Delete
 'deletepage' => 'ܫܘܦ ܦܐܬܐ',
@@ -1251,7 +1253,7 @@ $1',
 # Rollback
 'rollbacklink' => 'ܐܦܢܝ',
 'editcomment' => "ܦܣܝܩܬ̈ܐ ܕܫܘܚܠܦܐ ܗܘܐ: \"''\$1''\".",
-'revertpage' => 'Ü\90Ü\97ܦÜ\9f Ü«Ü\98Ü\9aܠܦÌ\88Ü\90 Ü\92Ü\9dÜ\95 [[Special:Contributions/$2|$2]] ([[User talk:$2|Ü¡Ü¡Ü Ü\90]]) Ü Ü¬Ü¢Ü\9dܬÜ\90 Ü\90Ü\9aܪÜ\9dܬܐ ܒܝܕ [[User:$1|$1]]',
+'revertpage' => 'Ü\90Ü\97ܦÜ\9f Ü«Ü\98Ü\9aܠܦÌ\88Ü\90 Ü\92Ü\9dÜ\95 [[Special:Contributions/$2|$2]] ([[User talk:$2|Ü¡Ü¡Ü Ü Ü\90]]) Ü Ü¬Ü¢Ü\9dܬÜ\90 Ü\90Ü\9aܪܬܐ ܒܝܕ [[User:$1|$1]]',
 
 # Edit tokens
 'sessionfailure-title' => 'ܡܘܬܒܐ ܠܐ ܢܨܚܬ',
@@ -1259,8 +1261,11 @@ $1',
 # Protect
 'protectlogpage' => 'ܣܓܠܐ ܕܢܛܪܐ',
 'protectedarticle' => 'ܢܛܪ "[[$1]]"',
+'modifiedarticleprotection' => 'ܫܚܠܦ ܫܘܝܐ ܕܢܛܪܐ ܕ"[[$1]]"',
 'unprotectedarticle' => 'ܫܩܘܠ ܢܛܝܪܘܬܐ ܡܢ "[[$1]]"',
 'movedarticleprotection' => 'ܫܢܐ ܛܘܝܒ̈ܐ ܕܢܛܪܐ ܡܢ "[[$2]]" ܠ "[[$1]]"',
+'protect-title' => 'ܫܚܠܦ ܫܘܝܐ ܕܢܛܪܐ ܕ"$1"',
+'protect-title-notallowed' => 'ܚܘܝ ܫܘܝܐ ܕܢܛܪܐ ܕ"$1"',
 'prot_1movedto2' => '[[$1]] ܐܬܫܢܝܬ ܠ [[$2]]',
 'protect-legend' => 'ܫܪܪ ܢܘܛܪܐ',
 'protectcomment' => 'ܥܠܬܐ:',
@@ -1270,12 +1275,12 @@ $1',
 'protect-level-sysop' => 'ܡܕܒܪ̈ܢܐ ܒܠܚܘܕ',
 'protect-expiring' => 'ܬܦܪܘܩ ܒ $1 (UTC)',
 'protect-expiry-indefinite' => 'ܠܥܠܡ',
-'protect-othertime' => 'Ü¥Ü\95Ü¢Ü\90 Ü\90Ü\9aܪܬܐ:',
-'protect-othertime-op' => 'Ü¥Ü\95Ü¢Ü\90 Ü\90Ü\9aܪܬܐ',
+'protect-othertime' => 'Ü¥Ü\95Ü¢Ü\90 Ü\90Ü\9aܪܢܐ:',
+'protect-othertime-op' => 'Ü¥Ü\95Ü¢Ü\90 Ü\90Ü\9aܪܢܐ',
 'protect-otherreason' => 'ܥܠܬܐ ܐܚܪܬܐ/ܢܩܝܦܬܐ:',
 'protect-otherreason-op' => 'ܥܠܬܐ ܐܚܪܬܐ',
 'protect-edit-reasonlist' => 'ܫܚܠܦ ܥܠܬܐ ܕܢܛܪܐ',
-'protect-expiry-options' => '1 Ü«Ü¥Ü¬Ü\90:1 hour,1 Ü\9dÜ\98Ü¡Ü\90:1 day,1 Ü«Ü\92Ü\98Ü¥Ü\90:1 week,2 Ü«Ü\92Ü\98Ü¥Ì\88Ü\90:2 weeks,1 Ü\9dܪÜ\9aÜ\90:1 month,3 Ü\9dܪÌ\88Ü\9aÜ\90:3 months,6 Ü\9dܪÌ\88Ü\9aÜ\90:6 months,1 Ü«Ü¢Ü¬ܐ:1 year,ܠܥܠܡ:infinite',
+'protect-expiry-options' => '1 Ü«Ü¥Ü\90:1 hour,1 Ü\9dÜ\98Ü¡:1 day,1 Ü«Ü\92Ü\98Ü¥:1 week,2 Ü«Ü\92Ü\98Ü¥Ì\88Ü\9dÜ¢:2 weeks,1 Ü\9dܪÜ\9a:1 month,3 Ü\9dܪÌ\88Ü\9aÜ\9dÜ¢:3 months,6 Ü\9dܪÌ\88Ü\9aÜ\9dÜ¢:6 months,1 Ü«Ü¢ܐ:1 year,ܠܥܠܡ:infinite',
 'restriction-type' => 'ܦܣܣܐ:',
 'restriction-level' => 'ܫܘܝܐ ܕܣܘܝܟܐ:',
 'minimum-size' => 'ܡܬܚܐ ܬܚܬܝܐ  ܕܥܓܪܐ',
@@ -1323,24 +1328,24 @@ $1',
 'blanknamespace' => '(ܪܫܝܬܐ)',
 
 # Contributions
-'contributions' => 'ܫܘܬܦܘܝܬ̈ܐ ܕܡܦܠܚܢܐ',
-'contributions-title' => 'ܫܘܬܦܘܝܬ̈ܐ ܕܡܦܠܚܢܐ ܠ$1',
-'mycontris' => 'ܫܘܬܦܘܝܬ̈ܐ',
+'contributions' => 'ܫܘܬܦܘ̈ܬܐ ܕܡܦܠܚܢܐ',
+'contributions-title' => 'ܫܘܬܦܘ̈ܬܐ ܕܡܦܠܚܢܐ ܠ$1',
+'mycontris' => 'ܫܘܬܦܘ̈ܬܐ',
 'contribsub2' => 'ܕ $1 ($2)',
 'uctop' => '(ܥܠܝܐ)',
 'month' => 'ܡܢ ܝܪܚܐ ܕ (ܘܡܢ ܩܕܡ ܗܝܕܝܢ):',
 'year' => 'ܡܢ ܫܢܬ (ܘܡܢ ܩܕܡ ܗܝܕܝܢ):',
 
-'sp-contributions-newbies' => 'ܚܘܝ ܫܘܬܦܘܝܬ̈ܐ ܕ ܚܘܫܒܢ̈ܐ ܚܕ̈ܬܐ ܒܠܚܘܕ',
+'sp-contributions-newbies' => 'ܚܘܝ ܫܘܬܦܘ̈ܬܐ ܕܚܘܫܒܢ̈ܐ ܚܕ̈ܬܐ ܒܠܚܘܕ',
 'sp-contributions-newbies-sub' => 'ܠܚܘܫܒܢ̈ܐ ܚܕ̈ܬܐ',
-'sp-contributions-newbies-title' => 'ܫܘܬܦܘܝܬ̈ܐ ܕܡܦܠܚܢܐ ܠܚܘܫܒܢ̈ܐ ܚܕ̈ܬܐ',
+'sp-contributions-newbies-title' => 'ܫܘܬܦܘ̈ܬܐ ܕܡܦܠܚܢܐ ܠܚܘܫܒܢ̈ܐ ܚܕ̈ܬܐ',
 'sp-contributions-blocklog' => 'ܣܓܠܐ ܕܚܪܡܐ',
-'sp-contributions-deleted' => 'ܫܘܬܦܘܝܬ̈ܐ ܕܡܦܠܚܢܐ ܫܝܦܬ̈ܐ',
+'sp-contributions-deleted' => 'ܫܘܬܦܘ̈ܬܐ ܫܝ̈ܦܬܐ ܕܡܦܠܚܢܐ',
 'sp-contributions-uploads' => 'ܡܣܩܬ̈ܐ',
 'sp-contributions-logs' => 'ܣܓܠ̈ܐ',
 'sp-contributions-talk' => 'ܡܡܠܠܐ',
 'sp-contributions-userrights' => 'ܕܘܒܪܐ ܕܙܕ̈ܩܐ ܕܡܦܠܚܢܐ',
-'sp-contributions-search' => 'ܒܨܝ ܫܘܬܦܘܝܬ̈ܐ',
+'sp-contributions-search' => 'ܒܨܝ ܫܘܬܦܘ̈ܬܐ',
 'sp-contributions-username' => 'ܐܝ ܦܝ (IP) ܐܘ ܫܡܐ ܕܡܦܠܚܢܐ:',
 'sp-contributions-toponly' => 'ܚܘܝ ܫܘܚܠܦ̈ܐ ܕܗܢܘܢ ܬܢܝܬ̈ܐ ܐܚܪ̈ܝܬܐ ܒܠܚܘܕ',
 'sp-contributions-submit' => 'ܒܨܝ',
@@ -1376,8 +1381,8 @@ $1',
 'ipbreason' => 'ܥܠܬܐ:',
 'ipbreasonotherlist' => 'ܥܠܬܐ ܐܚܪܬܐ',
 'ipbsubmit' => 'ܚܪܘܡ ܡܦܠܚܢܐ ܗܢܐ',
-'ipbother' => 'Ü¥Ü\95Ü¢Ü\90 Ü\90Ü\9aܪܬܐ',
-'ipboptions' => '2 ܫܥܬ̈ܐ:2 hours,1 ܝܘܡܐ:1 day,3 ܝܘܡܬ̈ܐ:3 days,1 ܫܒܘܥܐ:1 week,2 ܫܒܘܥ̈ܐ:2 weeks,1 ܝܪܚܐ:1 month,3 ܝܪ̈ܚܐ:3 months,6 ܝܪ̈ܚܐ:6 months,1 ܫܢܬܐ:1 year,ܠܥܠܡ:infinite',
+'ipbother' => 'Ü¥Ü\95Ü¢Ü\90 Ü\90Ü\9aܪܢܐ',
+'ipboptions' => '2 ܫܥ̈ܝܢ:2 hours,1 ܝܘܡ:1 day,3 ܝܘܡ̈ܝܢ:3 days,1 ܫܒܘܥ:1 week,2 ܫܒܘܥ̈ܝܢ:2 weeks,1 ܝܪܚ:1 month,3 ܝܪ̈ܚܝܢ:3 months,6 ܝܪ̈ܚܝܢ:6 months,1 ܫܢܐ:1 year,ܠܥܠܡ:infinite',
 'ipbotheroption' => 'ܐܚܪܢܐ',
 'ipbotherreason' => 'ܥܠܬܐ ܐܚܪܬܐ/ܢܩܝܦܬܐ:',
 'ipbhidename' => 'ܛܫܝ ܫܡܐ ܕܡܦܠܚܢܐ ܡܢ ܫܘܚܠܦ̈ܐ ܘܡܟܬܒܘܬ̈ܐ',
@@ -1386,7 +1391,7 @@ $1',
 'ipb-edit-dropdown' => 'ܫܚܠܦ ܥܠܠܬ̈ܐ ܕܚܪܡܐ',
 'ipb-unblock-addr' => 'ܫܩܘܠ ܚܪܡܐ ܡܢ $1',
 'ipb-unblock' => 'ܫܩܘܠ ܚܪܡܐ ܡܢ ܐܝ ܦܝ (IP) ܐܘ ܫܡܐ ܕܡܦܠܚܢܐ',
-'ipb-blocklist-contribs' => 'ܫܘܬܦܘܝܬ̈ܐ ܕ $1',
+'ipb-blocklist-contribs' => 'ܫܘܬܦܘ̈ܬܐ ܕ$1',
 'unblockip' => 'ܫܩܘܠ ܚܪܡܐ ܡܢ ܡܦܠܚܢܐ',
 'ipusubmit' => 'ܫܩܘܠ ܚܪܡܐ ܗܢܐ',
 'unblocked' => 'ܐܫܬܩܠ ܚܪܡܐ ܡܢ [[User:$1|$1]]',
@@ -1402,7 +1407,7 @@ $1',
 'blocklink' => 'ܚܪܘܡ',
 'unblocklink' => 'ܫܩܘܠ ܚܪܡܐ',
 'change-blocklink' => 'ܫܚܠܦ ܚܪܡܐ',
-'contribslink' => 'ܫܘܬܦܘܝܬ̈ܐ',
+'contribslink' => 'ܫܘܬܦܘ̈ܬܐ',
 'blocklogpage' => 'ܣܓܠܐ ܕܚܪܡܐ',
 'blocklogentry' => 'ܚܪܡ [[$1]] ܠܡܬܚܐ ܕ $2 $3',
 'unblocklogentry' => 'ܫܩܠ ܚܪܡܐ ܡܢ $1',
@@ -1449,6 +1454,7 @@ Do you want to change the settings?',
 # Namespace 8 related
 'allmessages' => 'ܐܓܪ̈ܬܐ ܕܛܟܣܐ',
 'allmessagesname' => 'ܫܡܐ',
+'allmessagescurrent' => 'ܟܬܒܬܐ ܗܫܝܬܐ ܕܐܓܪܬܐ',
 'allmessages-filter-legend' => 'ܡܨܦܝܢܝܬܐ',
 'allmessages-filter-all' => 'ܟܠ',
 'allmessages-prefix' => 'ܡܨܦܝܢܝܬܐ ܐܝܟ ܫܘܪܝܐ',
@@ -1487,7 +1493,7 @@ Do you want to change the settings?',
 'tooltip-ca-addsection' => 'ܫܪܝ ܡܢܬܐ ܚܕܬܐ',
 'tooltip-ca-viewsource' => 'ܗܢܐ ܦܐܬܐ ܢܛܪܬܐ ܐܝܬܝܗܝ.
 ܡܨܐ ܐܢܬ ܕܬܚܙܐ ܡܒܘܥܐ ܕܝܠܗ',
-'tooltip-ca-protect' => 'Ü¢Ü\9bÜ\98ܪ ܗܕܐ ܦܐܬܐ',
+'tooltip-ca-protect' => 'Ü\9bܪ Ü ܗܕܐ ܦܐܬܐ',
 'tooltip-ca-delete' => 'ܫܘܦ ܦܐܬܐ ܗܕܐ',
 'tooltip-ca-move' => 'ܫܢܝ ܦܐܬܐ ܗܕܐ',
 'tooltip-search' => 'ܒܨܝ ܒܓܘ {{SITENAME}}',
index a1ea447..7ece867 100644 (file)
@@ -474,8 +474,8 @@ Rulpakünuy feychi kangelkülelu dungu.",
 'right-browsearchive' => 'kintun pakina ñamümüngelu',
 'right-undelete' => 'Wüñoñamümün kiñe pakina',
 
-# User rights log
-'rightsnone' => 'chemnorume',
+# Special:Log/newusers
+'newuserlogpage' => 'We kellufe ñi wirintukun',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'chillkatun tüfachi pakina',
@@ -633,9 +633,6 @@ Fey ñi chumngen mülelu ($2 fey ñi chumngen wülngiñ) pengeli tüfa mew.',
 # Special:ListUsers
 'listusers-submit' => 'Pengelün',
 
-# Special:Log/newusers
-'newuserlogpage' => 'We kellufe ñi wirintukun',
-
 # Special:ListGroupRights
 'listgrouprights-members' => '(koneltulu kellufe ñi wif)',
 
@@ -664,6 +661,7 @@ Fey ñi chumngen mülelu ($2 fey ñi chumngen wülngiñ) pengeli tüfa mew.',
 'unwatching' => 'Llaytumekewelay...',
 
 'enotif_impersonal_salutation' => '{{SITENAME}} kellufe',
+'created' => 'Llituy',
 
 # Delete
 'deletepage' => 'Ñamümün tüfachi pakina',
@@ -974,4 +972,7 @@ Ka dungu ellkangeay wünedullin reke.
 # HTML forms
 'htmlform-selectorother-other' => 'Kakelu',
 
+# New logging system
+'rightsnone' => 'chemnorume',
+
 );
index 7847c05..c6b25e0 100644 (file)
@@ -91,7 +91,7 @@ $messages = array(
 'tog-externaleditor' => 'Usar un editor esternu por defeutu (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
 'tog-externaldiff' => 'Usar un diff esternu por defutu (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
 'tog-showjumplinks' => 'Activar los enllaces d\'accesibilidá "saltar a"',
-'tog-uselivepreview' => 'Usar vista previa en tiempu real (necesita JavaScript)',
+'tog-uselivepreview' => 'Usar vista previa en tiempu real (necesita JavaScript) (en pruebes)',
 'tog-forceeditsummary' => "Avisame cuando grabe col resume d'edición en blanco",
 'tog-watchlisthideown' => 'Anubrir les mios ediciones na llista de vixilancia',
 'tog-watchlisthidebots' => 'Anubrir les ediciones de bots na llista de vixilancia',
index 25a7c42..619364b 100644 (file)
@@ -594,7 +594,7 @@ Müvəqqəti parol: $2',
 'changeemail' => 'E-məktub ünvanını dəyiş',
 'changeemail-oldemail' => 'Hazırki e-poçt ünvanı:',
 'changeemail-newemail' => 'Yeni e-poçt ünvanı:',
-'changeemail-none' => '(heç biri)',
+'changeemail-none' => '(yoxdur)',
 'changeemail-submit' => 'E-poçtu dəyiş',
 'changeemail-cancel' => 'İmtina',
 
@@ -2986,7 +2986,7 @@ Bu saytda texniki problemlər var.',
 'logentry-newusers-create2' => '$1 $3 üçün istifadəçi hesabı yaratdı',
 'logentry-newusers-autocreate' => '$1 hesabı avtomatik yaradıldı',
 'newuserlog-byemail' => 'parol e-maillə göndərildi',
-'rightsnone' => '(heç biri)',
+'rightsnone' => '(yoxdur)',
 
 # Feedback
 'feedback-subject' => 'Mövzu:',
index 1c64182..f92fc2a 100644 (file)
@@ -53,7 +53,7 @@ $messages = array(
 'tog-externaleditor' => 'دَییشدیرمک اوچون ائشیک یازیلیم ایشلد (یالنیز چوخ باشارانلار اوچون، بیلگی‌سایارینیزدا مخصوص تنظیملر لازیم‌دیر. [//www.mediawiki.org/wiki/Manual:External_editors آرتیق بیلگیلر])',
 'tog-externaldiff' => 'موقاییسه ائتمک اوچون ائشیک یازیلیم ایشلد (یالنیز چوخ باشارانلار اوچون، بیلگی‌سایارینیزدا مخصوص تنظیملر لازیم‌دیر. [//www.mediawiki.org/wiki/Manual:External_editors آرتیق بیلگیلر])',
 'tog-showjumplinks' => '«آتلان:» یاردیم باغلانتیلارینی آچ',
-'tog-uselivepreview' => 'دÛ\8cرÛ\8c Ø§Ø¤Ù\86â\80\8cگؤسترÛ\8cØ´ Ø§Û\8cØ´Ù\84ت (جاÙ\88ااسکرÛ\8cپت Ù\84ازÛ\8cÙ\85â\80\8cدÛ\8cر)',
+'tog-uselivepreview' => 'دÛ\8cرÛ\8c Ø§Ø¤Ù\86â\80\8cگؤسترÛ\8cØ´ Ø§Û\8cØ´Ù\84د (جاÙ\88ااسکرÛ\8cپت Ù\84ازÛ\8cÙ\85â\80\8cدÛ\8cر)(تست Ù\85رحÙ\84Ù\87â\80\8cسÛ\8cÙ\86دÙ\87)',
 'tog-forceeditsummary' => 'دَییشیکلیک قیساسی بوش قالاندا منی بیلدیر',
 'tog-watchlisthideown' => 'منیم دَییشیکلیکلریمی ایزله‌دیکلردن گیزلت',
 'tog-watchlisthidebots' => 'بوت دَییشیکلیکلرینی ایزله‌دیکلردن گیزلت',
@@ -2186,9 +2186,9 @@ $نئwپاگئ
 '$1 صحیفه‌سینده حال-حاضردا ائده بیلجیینیز عملیات‌لار بون‌لاردیر:",
 'protect-cascadeon' => 'بو صحیفه محافظه‌لی‌دیر، چونکی بو صحیفه {{PLURAL:$1|باشقا بیر}} صحیفه‌دن کاسکاد محافظه ائدیلمیش‌دیر. سیز بو صحیفه‌نین محافظه سویه‌سینی دییش‌دیره بیلرسینیز، بو کاسکاد محافظه‌یه تأثیر ائتمه‌یه‌جک.',
 'protect-default' => 'بوتون ایستیفاده‌چی‌لره ایجازه وئر',
-'protect-fallback' => '"$1" ایجازه‌سی طلب اولونور',
-'protect-level-autoconfirmed' => 'Û\8cئÙ\86Û\8c Ù\88 Ø¢Ù\86Ù\88Ù\86Û\8cÙ\85 Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8câ\80\8cÙ\84رÛ\8c Ø¨Ø§ØºÙ\84ا',
-'protect-level-sysop' => 'یالنیز ایداره‌چی‌لر',
+'protect-fallback' => 'یالنیز «$1» ایجازه‌سی اولان ایستیفاده‌چیلره ایجازه وئر',
+'protect-level-autoconfirmed' => 'Û\8cاÙ\84Ù\86Û\8cز Ø§Ù\88تÙ\88Ù\85اتÛ\8cÚ© Ø¯Ù\88غرÙ\88Ù\84اÙ\86اÙ\86 Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8cÙ\84رÙ\87 Ø§Û\8cجازÙ\87 Ù\88ئر',
+'protect-level-sysop' => 'یالنیز ایداره‌چیلره ایجازه وئر',
 'protect-summary-cascade' => 'پیلله‌لی',
 'protect-expiring' => '$1 (UTC)- تاریخینده واختی بیتیر',
 'protect-expiring-local' => '$1-ده بیتیر',
@@ -2482,18 +2482,18 @@ $1 آدلی ایستیفاده‌چی‌نین باغلانما سببی: "$2"',
 'lockedbyandtime' => '({{Gender: $1 | $1}} طرفین‌دن  $2 $3 اعتبار ایله)',
 
 # Move page
-'move-page' => '$1داشینیر',
+'move-page' => '$1 داشینیر',
 'move-page-legend' => 'صحیفه‌نین آدینی دییش',
-'movepagetext' => "آشاغÛ\8câ\80\8cداکÛ\8c Ù\81Ù\88رÙ\85اâ\80\8cداÙ\86 Ø§Û\8cستÛ\8cÙ\81Ù\87â\80\8cدÙ\87 Ø§Ø¦ØªÙ\85Ù\87 ØµØ­Û\8cÙ\81Ù\87â\80\8cÙ\86Û\8cÙ\86 Ø¢Ø¯Û\8cÙ\86Û\8cØ\8c Ø¨Ù\88تÙ\88Ù\86 ØªØ§Ø±Û\8cØ®Ú\86Ù\87â\80\8cسÛ\8cÙ\86Û\8c Ø¯Ù\87 Ú©Ø¤Ú\86Ù\88رÙ\85Ú©Ù\84Ù\87 یئنی باشلیغا دییشه‌جک.
وولکی باش‌لیق یئنی باشلیغا ایستیقامتلندیرمه صحیفه‌سینه چئوریله‌جک.
-کؤهنه صحیفه‌یه کئچیدلری آوتوماتیک اولا‌راق دییشه بیلرسینیز.
-بو سئچیمی ائتمدیگینیز حالدا، [[Special:DoubleRedirects|تکرارلانان]] و یا [[Special:BrokenRedirects|قیریق ایستیقامتلندیرمه‌لری]] یوخلاماغی یاددان چیخارمایین.
-کئچیدلرین لازیمی یئره ایستیقامتلندیریلمه‌سینی تعمین ائتمک سیزین مسولیتینیزده‌دیر.
+'movepagetext' => "آشاغÛ\8câ\80\8cداکÛ\8c Ù\81Ù\88رÙ\85داÙ\86 Ø§Û\8cستÛ\8cÙ\81ادÙ\87 Ø§Ø¦ØªÙ\85Ú©Ø\8c ØµØ­Û\8cÙ\81Ù\87â\80\8cÙ\86Û\8cÙ\86 Ø¢Ø¯Û\8cÙ\86Û\8cØ\8c Ø¨Ù\88تÙ\88Ù\86 ØªØ§Ø±Û\8cØ®Ú\86Ù\87â\80\8cسÛ\8cÙ\86Û\8c Ø¯Ù\87 Ú©Ø¤Ú\86Ù\88رÙ\85Ú©â\80\8cÙ\84Ù\87Ø\8c یئنی باشلیغا دییشه‌جک.
سکی باشلیق یئنی باشلیغا یول‌لاندیریلاجاق‌دیر.
+اسکی صحیفه‌یه اولان یول‌لاندیرماقلاری، اوتوماتیک گونجل‌له‌یه بیلرسینیز.
+بو سئچیمی ائتمه‌دیگینیز حالدا، [[Special:DoubleRedirects|تکرارلانان]] و یا [[Special:BrokenRedirects|قیریق یول‌لاندیرمالاری]] یوخلاماغی یاددان چیخارمایین.
+باغلانتیلاری اویغون یئره یول‌لاندیرماسیندان آرخایین اولماق، سیزین مسئولیتینیزده‌دیر.
 
-نظره آلین کی، هدف باش‌لیغی آلتیندا بیر صحیفه مؤوجوددورسا یئردییشمه 'باش توتمایاجاق. بونا همین صحیفه‌نین بوش اولماسی و یا ایستیقامتلندیرمه صحیفه‌سی اولماسی و کئچمیشده رئداکته ائدیلممه‌سی حال‌لاری استثنا‌دیر. بو او دئمک‌دیر کی، سهون آدینی دییشدیگینیز صحیفه‌لری گئری قایتارا بیلر، بونونلا یاناشی آرتیق مؤوجود اولان صحیفه‌نین اوزرینه باشقا صحیفه یازا بیلمزسینیز.
+نظره آلین کی، هدف باشلیق آلتیندا بیر صحیفه مؤوجود اولسا، یئردییشمه '''باش توتمایاجاق'''، مگر بوکی او صحیفه یول‌لاندیرما اولا و اؤنجه دَییشمه گئچمیشی ده اولمایا. بو او دئمک‌دیر کی، سهواً آدینی دییشدیگینیز صحیفه‌لری گئری قایتارا بیلمک اولار، بونونلا یاناشی آرتیق مؤوجود اولان صحیفه‌نین اوزرینه باشقا صحیفه یازا بیلمزسینیز.
 
-'خبردارلیق!'
-بÙ\88 Û\8cئردÛ\8cÛ\8cØ´Ù\85Ù\87 Ù¾Ù\88Ù¾Ù\88Ù\84Û\8cار ØµØ­Û\8cÙ\81Ù\87 Ø§Ù\88Ú\86Ù\88Ù\86 Ø§Ø³Ø§Ø³â\80\8cÙ\84Û\8c Ù\88 Ú¯Ø¤Ø²Ù\84Ù\86Û\8cÙ\84Ù\85ز Ø§Ù\88Ù\84ا Ø¨Û\8cÙ\84رØ\8c Ø§Ù\88Ù\86ا Ú¯Ø¤Ø±Ù\87 Ø¯Ù\87 Ø¨Ù\88 Ø¯Û\8cÛ\8cØ´Û\8cÚ©â\80\8cÙ\84Û\8cÚ¯Û\8c Û\8cئرÛ\8cÙ\86Ù\87 Û\8cئتÛ\8cرÙ\85زدÙ\86 Ø§Ù\88Ù\84Ø\8c Ø¨Ù\88Ù\86Ù\88Ù\86 Ù\85Ù\88Ù\85Ú©Ù\88Ù\86 Ù\86تÛ\8cجÙ\87â\80\8cÙ\84رÛ\8cÙ\86Û\8c Ø¨Ø§Ø´Ø§ Ø¯Ù\88شدÙ\88Ú¯Ù\88Ù\86Ù\88زدÙ\86 Ø¹Ù\85ین اولون.",
+'''خبردارلیق!'''
+بÙ\88 Û\8cئردÛ\8cÛ\8cØ´Ù\85Ù\87 Ù\85Ø´Ù\87Ù\88ر ØµØ­Û\8cÙ\81Ù\87 Ø§Ù\88Ú\86Ù\88Ù\86 Ø§Ø³Ø§Ø³â\80\8cÙ\84Û\8c Ù\88 Ú¯Ø¤Ø²Ù\84Ù\86Û\8cÙ\84Ù\85ز Ø§Ù\88Ù\84ا Ø¨Û\8cÙ\84رØ\9b Ø§Ù\88Ù\86ا Ú¯Ø¤Ø±Ù\87 Ø¯Ù\87 Ø¨Ù\88 Ø¯Û\8cÛ\8cØ´Û\8cÚ©â\80\8cÙ\84Û\8cÚ¯Û\8c Û\8cئرÛ\8cÙ\86Ù\87 Û\8cئتÛ\8cرÙ\85زدÙ\86 Ø§Ù\88Ù\84Ø\8c Ø¨Ù\88Ù\86Ù\88Ù\86 Ù\85Ù\88Ù\85Ú©Ù\88Ù\86 Ù\86تÛ\8cجÙ\87â\80\8cÙ\84رÛ\8cÙ\86Û\8c Ø¨Ø§Ø´Ø§ Ø¯Ù\88شدÙ\88Ú¯Ù\88Ù\86Ù\88زدÙ\86 Ø¢Ø±Ø®Ø§Û\8cین اولون.",
 'movepagetext-noredirectfixer' => "آشاغی‌داکی فورمو دول‌دورماق بیر صحیفنی یئنی‌دن آدلاندیریر، بوتون کئچمیشینی یئنی آدا داشیییر.
 کؤهنه مؤوزو یئنی باشلیغا بیر ایستیقامتلندیرمه صحیفه‌سی اولار.
 [[Special:DoubleRedirects|جوت]] یا دا [[Special:BrokenRedirects|نوزوک ایستیقامتلندیرمه‌لر]] صحیفه‌لرینی ایداره ائدین.
@@ -2585,9 +2585,9 @@ $1 آدلی ایستیفاده‌چی‌نین باغلانما سببی: "$2"',
 'exportlistauthors' => 'هر صحیفه‌‌ اوچون دَییشدیرمه ائدن سیياهیسینی اؤزونده ساخلايین',
 'export-submit' => 'ایخراج',
 'export-addcattext' => 'صحیفه‌لری بو بولمه دن علاوه ائت:',
-'export-addcat' => 'عÙ\84اÙ\88Ù\87 Ø§Ø¦Øª',
+'export-addcat' => 'آرتÛ\8cر',
 'export-addnstext' => 'صحیفه‌لری آدلار فزاسین‌دان علاوه ائت:',
-'export-addns' => 'عÙ\84اÙ\88Ù\87 Ø§Ø¦Øª',
+'export-addns' => 'آرتÛ\8cر',
 'export-download' => 'فایلی قئید ائت',
 'export-templates' => 'شابلون‌لاری داخیل ائت',
 'export-pagelinks' => 'باغ‌لی صحیفه‌لری داخیل درین‌لیک:',
index 59c2a1d..9f52508 100644 (file)
@@ -231,6 +231,7 @@ $messages = array(
 'newwindow' => '(minabukas sa bàgong bintanà)',
 'cancel' => 'Kanselaron',
 'moredotdotdot' => 'Kadagdagan...',
+'morenotlisted' => 'Dakol pa an bakong listado...',
 'mypage' => 'An Pahina',
 'mytalk' => 'Orolayan',
 'anontalk' => 'Olay para kaining IP address',
@@ -607,6 +608,7 @@ Pakilaog sana tabi nin sarong tugmadong koreo o pabayae na mayong laman an surat
 # E-mail sending
 'php-mail-error-unknown' => 'Bakong bantog na kasalaan sa PHP mail() function.',
 'user-mail-no-addy' => 'Nagprubar na magpadara nin e-koreo na mayo nin e-koreong address.',
+'user-mail-no-body' => 'Nagprubar na magpadara nin e-surat na mayong laman o daeng kanultulan na halipot an hawak.',
 
 # Change password dialog
 'resetpass' => 'Ribayan an sekretong panlaog',
@@ -667,6 +669,7 @@ Temporaryong sekretong panlaog: $2',
 'changeemail-oldemail' => 'Presenteng e-koreong address:',
 'changeemail-newemail' => 'Bagong e-koreong address:',
 'changeemail-none' => 'mayo tabi.',
+'changeemail-password' => 'An saimong {{SITENAME}} sikretong panlaog:',
 'changeemail-submit' => 'Ribayan an e-koreo',
 'changeemail-cancel' => 'Kanselaha',
 
@@ -1249,9 +1252,9 @@ Ini dae tabi matitingkog.',
 'prefs-emailconfirm-label' => 'Kumpirmasyon sa E-koreo',
 'prefs-textboxsize' => 'Sukol kan bintana sa pagliliwat',
 'youremail' => 'E-koreo:',
-'username' => 'Pangaran kan paragamit:',
-'uid' => 'ID kan paragamit:',
-'prefs-memberingroups' => 'Miembro kan {{PLURAL:$1|grupo|grupos}}:',
+'username' => '{{GENDER:$1|Pangaran nin paragamit}}:',
+'uid' => '{{GENDER:$1|Paragamit}} ID:',
+'prefs-memberingroups' => '{{GENDER:$2|Miyembro}} kan {{PLURAL:$1|grupo|mga grupo}}:',
 'prefs-registration' => 'Rehistrasyong oras:',
 'yourrealname' => 'Totoong pangaran:',
 'yourlanguage' => 'Tataramon:',
@@ -2022,9 +2025,9 @@ Asin man hilnga an [[Special:WantedCategories|kinakaipong mga kategorya]].',
 'linksearch-pat' => 'Pangarugan sa paghahanap:',
 'linksearch-ns' => 'Espasyong-ngaran:',
 'linksearch-ok' => 'Hanápon',
-'linksearch-text' => 'Mga tsambang baraha arog baka kan "*.wikipedia.org" puwedeng paggamiton.
+'linksearch-text' => 'Mga tsambang baraha arog baka kan "*.wikipedia.org" na puwedeng paggamiton.
 Minakaipo kisera halangkaw na kamugtakan nin kinasakupan, halimbawa "*.org".<br />
-Suportadong mga panundan: <code>$1</code> (defaults to http:// kun mayo nin panundan na pinagkaag).',
+Suportadong {{PLURAL:$2|protokol|mga protokol}}: <code>$1</code> (defaults to http:// kun mayong protokol na pinagkaag).',
 'linksearch-line' => '$1 an nakatakod sa $2',
 'linksearch-error' => 'Mga pantsambang baraha mapuwedeng magluwas sana sa poon kan hostname.',
 
@@ -2110,11 +2113,8 @@ An e-surat na estada sa saimong pinaglaog sa [[Special:Preferences|saimong parag
 'watchnologin' => 'Mayô sa laog',
 'watchnologintext' => 'Dapat ika si [[Special:UserLogin|nakalaog]] para puede kang magribay kan saimong lista nin mga pigbabantayán.',
 'addwatch' => 'Idagdag sa bantay-listahan',
-'addedwatchtext' => "Ining pahina \"[[:\$1]]\" dinugang sa saimong mga [[Special:Watchlist|Pigbabantayan]].
-An mga pagbabâgo sa páhinang ini asin sa mga páhinang olay na kapadis kaini ililista digdi,
-asin an páhina isusurat nin '''mahîbog''' sa [[Special:RecentChanges|lista nin mga kaaagi pa sanang pagbabâgo]] para madalî ining mahiling.
-
-Kun boot mong halîon an páhina sa pigbabantayan mo sa maabot na panahon, pindoton an \"Pabayaan\" ''side bar''.",
+'addedwatchtext' => 'Ining pahina "[[:$1]]" dinadagdag sa saimong mga [[Special:Watchlist|Bantay-listahan]].
+An maabot na mga pagbabâgo sa páhinang ini asin sa asosyadong páhina nin olay paglilistahon duman.',
 'removewatch' => 'Halion gikan sa bantay-listahan',
 'removedwatchtext' => 'An pahina "[[:$1]]" pinaghale gikan sa [[Special:Watchlist|saimong bantay-listahan]].',
 'watch' => 'Bantayán',
@@ -2148,7 +2148,7 @@ Kun boot mong halîon an páhina sa pigbabantayan mo sa maabot na panahon, pindo
 'enotif_subject_moved' => '{{SITENAME}} pahina $1 pinagbalyo ni {{gender:$2|$2}}',
 'enotif_subject_restored' => '{{SITENAME}} pahina $1 pinagbalik-liwat ni {{gender:$2|$2}}',
 'enotif_subject_changed' => '{{SITENAME}} pahina $1 pinagliwat ni {{gender:$2|$2}}',
-'enotif_body_intro_deleted' => 'An {{SITENAME}} pahina $1 pinagpura sa $PAGEEDITDATE ni {{gender:$2|$2}}, hilngon $3 para sa pinakahuring rebisyon.',
+'enotif_body_intro_deleted' => 'An {{SITENAME}} pahina $1 pinagpura sa $PAGEEDITDATE ni {{gender:$2|$2}}, hilngon sa $3.',
 'enotif_body_intro_created' => 'An {{SITENAME}} pahina $1 pinagmukna sa $PAGEEDITDATE ni {{gender:$2|$2}}, hilngon $3 para sa pinakahuring rebisyon.',
 'enotif_body_intro_moved' => 'An {{SITENAME}} pahina $1 pinagbalyo sa $PAGEEDITDATE ni {{gender:$2|$2}}, hilngon $3 para sa pinakahuring rebisyon.',
 'enotif_body_intro_restored' => 'An {{SITENAME}} pahina $1 pinagbalik-liwat sa $PAGEEDITDATE ni {{gender:$2|$2}}, hilngon $3 para sa pinakahuring rebisyon.',
@@ -2256,6 +2256,8 @@ Hilnga tabi an [[Special:ProtectedPages|listahan kan protektadong mga pahina]] p
 'prot_1movedto2' => '[[$1]] piglipat sa [[$2]]',
 'protect-badnamespace-title' => 'Dae maprotektaran na espasyong-ngaran',
 'protect-badnamespace-text' => 'Mga pahina kaining espasyong-ngaran dae tabi protektado.',
+'protect-norestrictiontypes-text' => 'Ining pahina dae maprotektaran ta mayo pang ikinaag na mga tipo nin restriksyon.',
+'protect-norestrictiontypes-title' => 'Dae maprotektaran na pahina',
 'protect-legend' => 'Kompermaron an proteksyon',
 'protectcomment' => 'Rason:',
 'protectexpiry' => 'Mápasó:',
@@ -2270,9 +2272,9 @@ Ini an mga puesta sa ngunyan kaining páhina '''$1''':",
 Uya an ngonyan na mga pwesto kan pahinang '''$1''':",
 'protect-cascadeon' => 'Pigproprotektaran ining pahina sa ngonyan ta sabay ini sa mga nasunod na {{PLURAL:$1|pahina, na may|mga pahina, na may}} proteksyong katarata na nakaandar. Pwede mong bàgohon an tangga nin proteksyon kaining pahina, pero mayò ning epekto sa proteksyong katarata.',
 'protect-default' => 'Tuguti an gabos na mga paragamit',
-'protect-fallback' => 'Mangipo kan "$1" na permiso',
-'protect-level-autoconfirmed' => 'Kubkubon an baguhan asin bakong rehistradong mga paragamit',
-'protect-level-sysop' => 'Para sa mga sysop sana',
+'protect-fallback' => 'Minatugot sana sa mga paragamit na igwang "$1" na permiso',
+'protect-level-autoconfirmed' => 'Minatugot sana sa awtokumpirmadong mga paragamit',
+'protect-level-sysop' => 'Minatugot sana sa mga administrador',
 'protect-summary-cascade' => 'katarata',
 'protect-expiring' => 'mápasó sa $1 (UTC)',
 'protect-expiring-local' => 'mapalso sa $1',
@@ -2565,10 +2567,9 @@ Ika dae makakamukna nin sarong panindog.',
 # Move page
 'move-page' => 'Ibalyo an $1',
 'move-page-legend' => 'Ibalyó an páhina',
-'movepagetext' => "Sa paggagamit kan porma na yaon sa ibaba mariribayan nin pangaran an sarong pahina, maibabalyo an gabos kaining historiya pasiring baguhon na pangaran.
-An lumang titulo magigin sarong panlikwat na pahina pasiring sa baguhong titulo.
+'movepagetext' => "Sa paggagamit kan porma na yaon sa ibaba mariribayan nin pangaran an sarong pahina, maibabalyo an gabos kaining historiya pasiring sa baguhon na titulo.
 Ika makakapagsumpay kan mga panlikwat na magtutukdo awtomatiko pasiring sa orihinal na titulo.
-Kun saimong pinili na dae, seguraduhon na ma-tsek kun [[Special:DoubleRedirects|doble]] o [[Special:BrokenRedirects|parasa an mga panlikwat]].
+Kun saimong pinili na dae, seguraduhon na ma-tsek para sa [[Special:DoubleRedirects|doble]] o [[Special:BrokenRedirects|nabaak namga panlikwat]].
 Ika an responsable para himoong segurado na an mga kilyaw padagos na minatukdo kun saen sinda dapat na magduman.
 
 Giromdoma na an pahina '''dae''' maibabalyo kun igwa na nin sarong pahina sa baguhon na titulo, laen lang kun ini daeng laman o sarong panlikwat asin mayo nin nakaaging historiya nin pagliwat.
@@ -2638,7 +2639,7 @@ Igwa nang páhina na "[[:$1]]". Gusto mong parâon ini tangarig maibalyó?',
 'immobile-target-namespace-iw' => 'An Interwiki na kilyaw bakong balido puntirya para sa pagbalyo nin pahina.',
 'immobile-source-page' => 'Ining pahina bakong mabalyuhon.',
 'immobile-target-page' => 'Dae makakabalyo paduman sa titulong destinasyon.',
-'bad-target-model' => 'An pinagmamawot na destinasyon naggagamit kan nalalaeng modelo nin laog. Dae maipagkonberte gikan sa $1 pasiring sa $.',
+'bad-target-model' => 'An pinagmamawot na destinasyon minagamit kan ibahong modelo nin laog. Dae makapagpalis gikan sa $1 pasiring sa $2.',
 'imagenocrossnamespace' => 'Dae makakapagbalyo nin sagunson paduman sa bakong sagunson na espasyong pangaran.',
 'nonfile-cannot-move-to-file' => 'Dae makakapagbalyo nin bakong-sagunson pasiring sa sagunson kan espasyong-pangaran',
 'imagetypemismatch' => 'An baguhon na ekstensyon nin sagunson dae mai-aampad sa tipong ini',
@@ -2754,6 +2755,7 @@ Paki-otro giraray.',
 'import-error-interwiki' => 'An pahina "$1" bakong importado nin huli ta an pangaran kaini reserbado na para sa panluwas na kasugpunan (interwiki).',
 'import-error-special' => 'An pahina "$1" bakong importado nin huli ta ini kabali sa espesyal an espasyong-ngaran na dae nagtutugot nin mga pahina.',
 'import-error-invalid' => 'An pahina "$1" bakong importado nin huli ta an ngaran kaini imbalido.',
+'import-error-unserialize' => 'An rebisyon sa $2 kan pahina "$1" dae maseryalisado. An rebisyon pinagtala na gumamit nin modelong laman na $3 na seryalisado bilang $4.',
 'import-options-wrong' => 'Salang {{PLURAL:$2|pagpipilian|mga pagpipilian}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'An pinagtaong ugat na pahina sarong imbalidong titulo.',
 'import-rootpage-nosubpage' => 'Espasyong-ngaran "$1" kan ugat na pahina dae minatugot nin pan-irarom na mga pahina.',
@@ -2909,6 +2911,7 @@ Ini hurot na pinagkausa nin sarong sugpunan pasiring sa sarong pinagbawal na pan
 'pageinfo-magic-words' => 'Mahiko {{PLURAL:$1|taramon|mga taramon}} ($1)',
 'pageinfo-hidden-categories' => 'Itinago na {{PLURAL:$1|kategorya|mga kategorya}} ($1)',
 'pageinfo-templates' => 'Kabaling pinagbalyo na {{PLURAL:$1|panguyog|mga panguyog}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Pahina|Mga Pahina}} kabaling pinagbalyo sa ($1)',
 'pageinfo-toolboxlink' => 'Pahina kan impormasyon',
 'pageinfo-redirectsto' => 'Mga panlikwat paduman sa',
 'pageinfo-redirectsto-info' => 'impo',
@@ -2917,6 +2920,10 @@ Ini hurot na pinagkausa nin sarong sugpunan pasiring sa sarong pinagbawal na pan
 'pageinfo-protect-cascading' => 'An mga proteksyon pasurunod gikan digde',
 'pageinfo-protect-cascading-yes' => 'Iyo',
 'pageinfo-protect-cascading-from' => 'An mga proteksyon pasurunod gikan sa',
+'pageinfo-category-info' => 'Impormasyon sa Kategorya',
+'pageinfo-category-pages' => 'Bilang nin mga pahina',
+'pageinfo-category-subcats' => 'Bilang nin mga sub-kategorya',
+'pageinfo-category-files' => 'Bilang nin mga sagunson',
 
 # Skin names
 'skinname-standard' => 'Klasiko',
@@ -2998,6 +3005,8 @@ Sa pagpapa-andar kaini, an saimong sistema mapupuwedeng makompromiso.",
 'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutos}}',
 'hours' => '{{PLURAL:$1|$1 oras|$1 oras}}',
 'days' => '{{PLURAL:$1|$1 aldaw|$1 mga aldaw}}',
+'months' => '{{PLURAL:$1|$1 bulan|$1 mga bulan}}',
+'years' => '{{PLURAL:$1|$1 taon|$1 mga taon}}',
 'ago' => '$1 nakaagi',
 'just-now' => 'ngunyan sana',
 
@@ -3583,7 +3592,7 @@ Pwede mo man [[Special:EditWatchlist|gamiton an standard editor]].',
 'watchlisttools-raw' => 'Hirahón an bàgong pigbabantayan',
 
 # Signatures
-'signature' => '[[{{ns:paragamit}}:$1|$2]] ([[{{ns:olay_nin_paragamit}}:$1|olay]])',
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|olay]])',
 
 # Core parser functions
 'unknown_extension_tag' => 'Bakong bistadong ekstensyon nin pagmarka "$1"',
@@ -3609,7 +3618,7 @@ Pwede mo man [[Special:EditWatchlist|gamiton an standard editor]].',
 'version-license' => 'Lisensiya',
 'version-poweredby-credits' => "An wiking ini pinagpagana kan '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'mga iba pa',
-'version-credits-summary' => 'Kami gustong rekonosiron an minasunod na mga persona para sa saindang ambag sa [[Espesyal:Bersyon|Mediawiki]].',
+'version-credits-summary' => 'Gusto niyamong rekonosiron an minasunod na mga persona nin huli kan saindang ambag sa [[Special:Version|Mediawiki]].',
 'version-license-info' => 'An MediaWiki sarong libreng kasungatan; puwede mong ipanao ini asin/o baguhon ini sa irarom kan termino nin HNU (Heneral na Pampublikong Lisensiya) bilang publisado kan Free Software Foundation; maski sa arin na bersyon 2 kan lisensiya, o (saimong pansadireng pagpipilian) arinman na huring bersyon.
 
 An MediaWiki ipinagpanao sa paglaom na ini magigin kapakinabangan, pero MAYO NIN ANUMAN NA WARANTIYA; mayo dawa ngani nin pinaghuhurot na warantiya kan MERKANTIBILIDAD o KAUYUGAN PARA SA SARONG PARTIKULAR NA KATUYUHAN. Hilngon an HNU (Heneral na Pampublikong Lisensiya) para sa kadagdagang mga detalye.
index a8ec836..7e6c649 100644 (file)
@@ -292,7 +292,7 @@ $messages = array(
 'tog-externaleditor' => 'Выкарыстоўваць вонкавы рэдактар па змоўчваньні (толькі для адмыслоўцаў, патрабуе спэцыяльных наладак на вашым кампутары. [//www.mediawiki.org/wiki/Manual:External_editors Падрабязнасьці.])',
 'tog-externaldiff' => 'Выкарыстоўваць вонкавую праграму параўнаньня вэрсіяў па змоўчваньні (толькі для адмыслоўцаў, патрабуе спэцыяльных наладак на вашым кампутары. [//www.mediawiki.org/wiki/Manual:External_editors Падрабязнасьці.])',
 'tog-showjumplinks' => 'Актываваць дапаможныя спасылкі «перайсьці да»',
-'tog-uselivepreview' => 'Выкарыстоўваць хуткі папярэдні прагляд (патрабуе JavaScript)',
+'tog-uselivepreview' => 'Выкарыстоўваць хуткі папярэдні прагляд (патрабуе JavaScript) (экспэрымэнтальна)',
 'tog-forceeditsummary' => 'Папярэджваць пра адсутнасьць кароткага апісаньня зьменаў',
 'tog-watchlisthideown' => 'Хаваць мае праўкі ў сьпісе назіраньня',
 'tog-watchlisthidebots' => 'Хаваць праўкі робатаў у сьпісе назіраньня',
@@ -990,8 +990,8 @@ $2
 '''КАЛІ ЛАСКА, НЕ ЗЬМЯШЧАЙЦЕ ТУТ БЕЗ ДАЗВОЛУ МАТЭРЫЯЛЫ, ЯКІЯ АХОЎВАЮЦЦА АЎТАРСКІМ ПРАВАМ!'''",
 'longpageerror' => "'''Памылка: Аб’ём тэксту, які Вы спрабуеце запісаць складае $1 {{PLURAL:$1|кілябайт|кілябайты|кілябайтаў}}, што болей устаноўленага абмежаваньня на $2 {{PLURAL:$2|кілябайт|кілябайты|кілябайтаў}}.'''
 Старонка ня можа быць захаваная.",
-'readonlywarning' => "'''ПАПЯРЭДЖАНЬНЕ: База зьвестак была заблякаваная для тэхнічнага абслугоўваньня, таму немагчыма зараз захаваць Вашыя зьмены.
-Вы можаце скапіяваць тэкст у файл на Вашым кампутары, а пазьней захаваць сюды.'''
+'readonlywarning' => "'''ПАПЯРЭДЖАНЬНЕ: База зьвестак была заблякаваная для тэхнічнага абслугоўваньня, таму немагчыма зараз захаваць Вашыя зьмены.'''
+Вы можаце скапіяваць тэкст у файл на Вашым кампутары, а пазьней захаваць сюды.
 
 Адміністратар, які заблякаваў базу зьвестак, прапанаваў наступнае тлумачэньне: $1",
 'protectedpagewarning' => "'''Папярэджаньне: Гэтая старонка была абароненая, таму толькі адміністратары могуць рэдагаваць яе.'''
@@ -2424,9 +2424,9 @@ $UNWATCHURL
 'protect-cascadeon' => 'Гэтая старонка часова абароненая, таму што яна ўключаная ў {{PLURAL:$1|наступную старонку, якая абароненая|наступныя старонкі, якія абароненыя|наступныя старонкі, якія абароненыя}} каскаднай абаронай.
 Вы можаце зьмяніць узровень абароны, але гэта не паўплывае на каскадную абарону.',
 'protect-default' => 'Дазволіць усім удзельнікам',
-'protect-fallback' => 'Ð\9fаÑ\82Ñ\80Ñ\8dбнÑ\8b Ð´Ð°Ð·Ð²Ð¾Ð» «$1»',
-'protect-level-autoconfirmed' => 'Ð\91лÑ\8fкаваÑ\86Ñ\8c Ð½Ð¾Ð²Ñ\8bÑ\85 Ñ\96 Ð°Ð½Ð°Ð½Ñ\96мнÑ\8bÑ\85 Ñ\83дзелÑ\8cнÑ\96каÑ\9e',
-'protect-level-sysop' => 'ТолÑ\8cкÑ\96 Ð°Ð´Ð¼Ñ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82аÑ\80Ñ\8b',
+'protect-fallback' => 'Ð\94азволÑ\96Ñ\86Ñ\8c Ñ\82олÑ\8cкÑ\96 Ñ\9eдзелÑ\8cнÑ\96кам Ð· Ð´Ð°Ð·Ð²Ð¾Ð»Ð°Ð¼ «$1»',
+'protect-level-autoconfirmed' => 'Ð\94азволÑ\96Ñ\86Ñ\8c Ñ\82олÑ\8cкÑ\96 Ð°Ñ\9eÑ\82амаÑ\82Ñ\8bÑ\87на Ð¿Ð°Ñ\86Ñ\8cвеÑ\80джанÑ\8bм',
+'protect-level-sysop' => 'Ð\94азволÑ\96Ñ\86Ñ\8c Ñ\82олÑ\8cкÑ\96 Ð°Ð´Ð¼Ñ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82аÑ\80ам',
 'protect-summary-cascade' => 'каскадная',
 'protect-expiring' => 'сканчаецца $1 (UTC)',
 'protect-expiring-local' => 'канчаецца $1',
@@ -2721,16 +2721,16 @@ $1',
 # Move page
 'move-page' => 'Перанесьці $1',
 'move-page-legend' => 'Перанесьці старонку',
-'movepagetext' => "Ð\97 Ð´Ð°Ð¿Ð°Ð¼Ð¾Ð³Ð°Ð¹ Ð³Ñ\8dÑ\82ай Ñ\84оÑ\80мÑ\8b Ð\92Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е Ð·Ñ\8cмÑ\8fнÑ\96Ñ\86Ñ\8c Ð½Ð°Ð·Ð²Ñ\83 Ñ\96 Ð³Ñ\96Ñ\81Ñ\82оÑ\80Ñ\8bÑ\8e Ñ\81Ñ\82аÑ\80онкÑ\96.
+'movepagetext' => "Ð\97 Ð´Ð°Ð¿Ð°Ð¼Ð¾Ð³Ð°Ð¹ Ð³Ñ\8dÑ\82ай Ñ\84оÑ\80мÑ\8b Ð\92Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е Ð¿ÐµÑ\80анеÑ\81Ñ\8cÑ\86Ñ\96 Ñ\81Ñ\82аÑ\80онкÑ\83, Ñ\96 Ñ\80азам Ð·Ñ\8c Ñ\91й Ñ\83Ñ\81Ñ\8e Ð³Ñ\96Ñ\81Ñ\82оÑ\80Ñ\8bÑ\8e.
 Старая назва будзе перанакіроўваць на новую.
 Вы можаце аўтаматычна абнавіць перанакіраваньні на першапачатковую назву.
 Калі вы адмовіцеся, упэўніцеся ў адсутнасьці [[Special:DoubleRedirects|падвойных]] ці [[Special:BrokenRedirects|няслушных перанакіраваньняў]].
 Адказнасьць за дакладнасьць спасылак ляжыць на тым, хто перанёс старонку.
 
-Заўважце, што старонка '''ня будзе''' перанесеная, калі пад новай назвай ужо існуе іншая старонка, за выключэньнем выпадкаў, калі яна пустая альбо зьяўляецца перанакіраваньнем і ня мае гісторыі рэдагаваньняў. Гэта азначае, што існуе магчымасьць адмяніць зьмену назвы, калі Вы памыліліся, але не магчыма выдаліць існую старонку.
+Заўважце, што старонка '''ня будзе''' перанесеная, калі пад новай назвай ужо існуе іншая старонка, за выключэньнем выпадкаў, калі яна пустая альбо зьяўляецца перанакіраваньнем і ня мае гісторыі рэдагаваньняў. Гэта азначае, што існуе магчымасьць скасаваць зьмену назвы, калі Вы памыліліся, але немагчыма выдаліць існую старонку.
 
-'''Ð\9fÐ\90Ð\9fЯРЭÐ\94Ð\96Ð\90Ð\9dЬÐ\9dÐ\95!'''
\97Ñ\8cмена Ð½Ð°Ð·Ð²Ñ\8b Ð¼Ð¾Ð¶Ð° Ð¿Ñ\80Ñ\8bвеÑ\81Ñ\8cÑ\86Ñ\96 Ð´Ð° Ð½ÐµÑ\87аканÑ\8bÑ\85 Ð·Ñ\8cменаÑ\9e Ð¿Ð°Ð¿Ñ\83лÑ\8fÑ\80нÑ\8bÑ\85 Ñ\81Ñ\82аÑ\80онак;
+'''Увага!'''
\97Ñ\8cмена Ð½Ð°Ð·Ð²Ñ\8b Ð¿Ð°Ð¿Ñ\83лÑ\8fÑ\80нÑ\8bÑ\85 Ñ\81Ñ\82аÑ\80онак Ð¼Ð¾Ð¶Ð½Ð° Ñ\81Ñ\82аÑ\86Ñ\86а Ð²ÐµÐ»Ñ\8cмÑ\96 Ð½ÐµÑ\87аканай Ñ\96 Ñ\80Ñ\8dзкай;
 калі ласка, упэўніцеся, што Вы разумееце наступствы такіх зьменаў.",
 'movepagetext-noredirectfixer' => "Скарыстаўшыся гэтай формай, Вы перанесяце старонку з усёй гісторыяй зьменаў да новай назвы.
 Старонка са старой назвай будзе перанакіроўваць на старонку з новай.
@@ -3357,7 +3357,7 @@ $1',
 'exif-copyrighted' => 'Статус аўтарскіх правоў',
 'exif-copyrightowner' => 'Уласьнік аўтарскіх правоў',
 'exif-usageterms' => 'Умовы выкарыстаньня',
-'exif-webstatement' => 'Ð\97Ñ\8cвеÑ\81Ñ\82кÑ\96 Ð¿Ñ\80а Ð°Ñ\9eÑ\82аÑ\80Ñ\81кÑ\96Ñ\8f Ð¿Ñ\80авÑ\8b Ð°Ð½Ð»Ñ\8fйн',
+'exif-webstatement' => 'Ð\97Ñ\8cвеÑ\81Ñ\82кÑ\96 Ð¿Ñ\80а Ð°Ñ\9eÑ\82аÑ\80Ñ\81кÑ\96Ñ\8f Ð¿Ñ\80авÑ\8b Ð¾Ð½-лайн',
 'exif-originaldocumentid' => 'Унікальны ідэнтыфікатар ці арыгінальны дакумэнт',
 'exif-licenseurl' => 'URL-адрас аўтарскай ліцэнзіі',
 'exif-morepermissionsurl' => 'Інфармацыя пра ўмовы карыстаньня на ўмовах іншых ліцэнзіяў',
@@ -3990,6 +3990,7 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'api-error-ok-but-empty' => 'Унутраная памылка: няма адказу ад сэрвэра.',
 'api-error-overwrite' => 'Замена існуючага файла забароненая.',
 'api-error-stashfailed' => 'Унутраная памылка: сэрвэр ня змог захаваць часовы файл.',
+'api-error-publishfailed' => 'Унутраная памылка: сэрвэр ня змог захаваць часловы файл.',
 'api-error-timeout' => 'Сэрвэр не адказаў у чаканы тэрмін.',
 'api-error-unclassified' => 'Узьнікла невядомая памылка',
 'api-error-unknown-code' => 'Невядомая памылка: «$1».',
index 25ca103..e1ae315 100644 (file)
@@ -2284,7 +2284,7 @@ $UNWATCHURL
 'protect-locked-access' => "Нямате правото да променяте нивата на защита на страниците. Ето текущите настройки за страницата „'''$1'''“:",
 'protect-cascadeon' => 'Тази страница е защитена против редактиране, защото е включена в {{PLURAL:$1|следната страница, която от своя страна има|следните страници, които от своя страна имат}} каскадна защита. Можете да промените нивото на защита на страницата, но това няма да повлияе върху каскадната защита.',
 'protect-default' => 'Позволяване за всички потребители',
-'protect-fallback' => 'Ð\9dеобÑ\85одими Ñ\81а права на „$1“',
+'protect-fallback' => 'Ð\9fозволÑ\8fване Ñ\81амо Ð·Ð° Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82ели Ñ\81 права на „$1“',
 'protect-level-autoconfirmed' => 'Блокиране на нови и нерегистрирани потребители',
 'protect-level-sysop' => 'Само за администратори',
 'protect-summary-cascade' => 'каскадно',
@@ -2753,6 +2753,7 @@ $1',
 'import-error-interwiki' => 'Страницата „$1“ не беше внесена, тъй като името ѝ е запазено за външно свързване (междууики).',
 'import-error-special' => 'Страницата „$1“ не беше внесена, тъй като принадлежи към специално именно пространство, което не позволява страници.',
 'import-error-invalid' => 'Страницата „$1“ не беше внесена, тъй като името ѝ е невалидно.',
+'import-rootpage-invalid' => 'Посочената основна страница е с невалидно заглавие.',
 'import-rootpage-nosubpage' => 'Именното пространство „$1“ на основната страница не позволява създаването на подстраници.',
 
 # Import log
@@ -2871,7 +2872,8 @@ $1',
 # Info page
 'pageinfo-title' => 'Информация за "$1"',
 'pageinfo-header-basic' => 'Основна информация',
-'pageinfo-header-edits' => 'Редакции',
+'pageinfo-header-edits' => 'История на редакциите',
+'pageinfo-header-restrictions' => 'Защита на страницата',
 'pageinfo-article-id' => 'Номер на страницата',
 'pageinfo-views' => 'Брой прегледи',
 'pageinfo-watchers' => 'Брой наблюдаващи страницата',
@@ -2882,6 +2884,7 @@ $1',
 'pageinfo-edits' => 'Общ брой редакции',
 'pageinfo-authors' => 'Общ брой на отделните автори',
 'pageinfo-magic-words' => '{{PLURAL:$1|Вълшебна думичка|Вълшебни думички}} ($1)',
+'pageinfo-toolboxlink' => 'Информация за страницата',
 'pageinfo-contentpage-yes' => 'Да',
 'pageinfo-protect-cascading-yes' => 'Да',
 
@@ -2937,6 +2940,7 @@ $1',
 'file-info-size-pages' => '$1 × $2 пиксела, размер на файла: $3, MIME тип: $4, $5 {{PLURAL:$5|страница|страници}}',
 'file-nohires' => 'Не е налична версия с по-висока разделителна способност.',
 'svg-long-desc' => 'Файл във формат SVG, основен размер: $1 × $2 пиксела, големина на файла: $3',
+'svg-long-error' => 'Невалиден SVG файл: $1',
 'show-big-image' => 'Пълна разделителна способност',
 'show-big-image-preview' => 'Размер на този преглед: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Друга разделителна способност|Други разделителни способности}}: $1.',
index be8aa07..6d36624 100644 (file)
@@ -101,7 +101,7 @@ $messages = array(
 'tog-externaleditor' => 'শুরুতেই বহিঃস্থ সম্পাদক ব্যবহার করা হোক (শুধুমাত্র দক্ষ ব্যবহারকারীদের জন্য, কম্পিউটারে বিশেষ সেটিংস এর প্রয়জোন। [//www.mediawiki.org/wiki/Manual:External_editors বিস্তারিত তথ্য।])',
 'tog-externaldiff' => 'শুরুতেই বহিঃস্থ পার্থক্য ব্যবহার করা হোক (শুধুমাত্র দক্ষ ব্যবহারকারীদের জন্য, কম্পিউটারে বিশেষ সেটিংস এর প্রয়জোন। [//www.mediawiki.org/wiki/Manual:External_editors বিস্তারিত তথ্য।])',
 'tog-showjumplinks' => '"ঝাঁপ দিন" বৈশিষ্ট্যের সংযোগ চালু করা হোক',
-'tog-uselivepreview' => 'লাà¦\87ভ à¦ªà§\8dরিভিà¦\89 à¦\9aালà§\81 à¦\95রা à¦¹à§\8bà¦\95 (à¦\9cাভাসà§\8dà¦\95à§\8dরিপà§\8dà¦\9f à¦­à¦¿à¦¤à§\8dতিক)',
+'tog-uselivepreview' => 'তাà§\8eà¦\95à§\8dষণিà¦\95 à¦ªà§\8dরাà¦\95দরà§\8dশনà§\87র à¦\95à§\8dষমতা à¦\9aালà§\81 à¦\95রা à¦¹à§\8bà¦\95 (à¦\9cাভাসà§\8dà¦\95à§\8dরিপà§\8dà¦\9f) (পরà§\80à¦\95à§\8dষামà§\82লক)',
 'tog-forceeditsummary' => 'খালি সম্পাদনা সারাংশ প্রবেশ করানোর সময় আমাকে জানানো হোক',
 'tog-watchlisthideown' => 'আমার সম্পাদনাগুলি আমার নজরতালিকায় না দেখানো হোক',
 'tog-watchlisthidebots' => 'বটের করা সম্পাদনাগুলি নজরতালিকায় না দেখানো হোক',
index cdd68b8..21f2d27 100644 (file)
@@ -531,7 +531,6 @@ $messages = array(
 
 # User rights log
 'rightslog' => 'སྤྱོད་མིའི་ཐོབ་ཐང་།',
-'rightsnone' => '(སྟོང་པ།)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'ཤོག་ངོས་འདི་ཀློག་པ།',
@@ -701,6 +700,8 @@ $messages = array(
 'unwatching' => 'ལྟ་ཐོ་ལས་འདོར་བཞིན་པ་་་',
 
 'enotif_reset' => 'ཤོག་ངོས་ཚང་མ་བལྟས་ཟིན་དུ་རྟགས་རྒྱོབ།',
+'created' => 'བཟོས་ཟིན།',
+'changed' => 'བསྒྱུར་ཟིན།',
 
 # Delete
 'deletepage' => 'ཤོག་ངོས་འདོར་བ།',
@@ -877,4 +878,7 @@ $messages = array(
 # Special:SpecialPages
 'specialpages' => 'དམིགས་གསལ་ཤོག་ངོས།',
 
+# New logging system
+'rightsnone' => '(སྟོང་པ།)',
+
 );
index a8ac5a2..eff8e5f 100644 (file)
@@ -2909,6 +2909,7 @@ Nedostaje privremeni folder.',
 'javascripttest-title' => 'Pokretanje $1 testova',
 'javascripttest-pagetext-noframework' => 'Ova stranica je određena za pokretanje JavaScript testova.',
 'javascripttest-pagetext-unknownframework' => 'Nepoznat radni okvir testiranja"$1".',
+'javascripttest-pagetext-frameworks' => 'Molimo Vas izaberite jednu od sljedećih testnih okvira: $1',
 'javascripttest-pagetext-skins' => 'Izaberite s kojom temom želite da pokrenete probu:',
 'javascripttest-qunit-intro' => 'Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.',
 
@@ -3029,9 +3030,11 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.',
 'spambot_username' => 'MediaWiki čišćenje spama',
 'spam_reverting' => 'Vraćanje na zadnju verziju koja ne sadrži linkove ka $1',
 'spam_blanking' => 'Sve revizije koje sadrže linkove ka $1, očisti',
+'spam_deleting' => 'Sve revizije koje sadrže linkove na $1, brišem',
 
 # Info page
 'pageinfo-title' => 'Informacije za "$1"',
+'pageinfo-not-current' => 'Nažalost, nemoguće je dati ove informacije za starije revizije.',
 'pageinfo-header-basic' => 'Osnovne informacije',
 'pageinfo-header-edits' => 'Historija izmjena',
 'pageinfo-header-restrictions' => 'Zaštita stranice',
@@ -3042,19 +3045,25 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.',
 'pageinfo-language' => 'Jezik sadržaja stranice',
 'pageinfo-views' => 'Broj pogleda',
 'pageinfo-watchers' => 'Broj onih koji pregledaju',
+'pageinfo-redirects-name' => 'Preusmjeravanja na ovu stranicu',
 'pageinfo-subpages-name' => 'Podstranice ove stranice',
 'pageinfo-firstuser' => 'Korisnik koji je napravio stranicu',
 'pageinfo-firsttime' => 'Datum stvaranja stranice',
 'pageinfo-lastuser' => 'Posljednji urednik stranice',
+'pageinfo-lasttime' => 'Datum posljednje izmjene',
 'pageinfo-edits' => 'Ukupan broj izmjena',
 'pageinfo-authors' => 'Ukupan broj različitih autora',
 'pageinfo-recent-edits' => 'Broj nedavnih izmjena (u poslednjih $1)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Čarobna riječ|Čarobne riječi}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Uključeni šablon|Uključeni šabloni}} ($1)',
 'pageinfo-toolboxlink' => 'Informacije o stranici',
 'pageinfo-redirectsto' => 'Preusmjerava na',
 'pageinfo-redirectsto-info' => 'Informacije',
 'pageinfo-contentpage' => 'Broji se kao stranica sa sadržajem',
 'pageinfo-contentpage-yes' => 'Da',
 'pageinfo-protect-cascading-yes' => 'Da',
+'pageinfo-category-pages' => 'Broj stranica',
 
 # Skin names
 'skinname-standard' => 'Klasično',
@@ -3076,6 +3085,8 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.',
 'markedaspatrollederror' => 'Ne može se označiti kao patrolirano',
 'markedaspatrollederrortext' => 'Morate naglasiti reviziju koju treba označiti kao patroliranu.',
 'markedaspatrollederror-noautopatrol' => 'Nije Vam dopušteno da vlastite izmjene označavate patroliranim.',
+'markedaspatrollednotify' => 'Ova izmjena na stranici „$1“ je označena kao pregledana.',
+'markedaspatrollederrornotify' => 'Označavanje stranice pregledanom nije uspjelo.',
 
 # Patrol log
 'patrol-log-page' => 'Zapisnik patroliranja',
@@ -3134,6 +3145,8 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 minuta|$1 minute|$1 minuta}}',
 'hours' => '{{PLURAL:$1|$1 sat|$1 sata|$1 sati}}',
 'days' => '{{PLURAL:$1|$1 dan|$1 dana|$1 dana}}',
+'months' => '{{PLURAL:$1|$1 mjesec|$1 mjeseci}}',
+'years' => '{{PLURAL:$1|$1 godina|$1 godine|$1 godina}}',
 'ago' => 'prije $1',
 
 # Bad image list
@@ -3838,7 +3851,7 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 * <strong class="mw-specialpagerestricted">Zaštićene posebne stranice.</strong>',
 'specialpages-group-maintenance' => 'Izvještaji za održavanje',
 'specialpages-group-other' => 'Ostale posebne stranice',
-'specialpages-group-login' => 'Prijava / Otvaranje računa',
+'specialpages-group-login' => 'Prijava / otvaranje računa',
 'specialpages-group-changes' => 'Nedavne izmjene i evidencije',
 'specialpages-group-media' => 'Mediji i postavljanje datoteka',
 'specialpages-group-users' => 'Korisnici i korisnička prava',
@@ -3931,10 +3944,12 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'logentry-patrol-patrol-auto' => '$1 je automatski označio izmjenu $4 stranice $3 pregledanim',
 'logentry-newusers-newusers' => 'Korisnički račun $1 je napravljen',
 'logentry-newusers-create' => 'Korisnički račun $1 je napravljen',
-'logentry-newusers-create2' => '$1 je napravio korisnički račun $3',
+'logentry-newusers-create2' => '$3 je {{GENDER:$2|napravio|napravila}} korisnički račun $1',
 'logentry-newusers-autocreate' => 'Korisnički račun $1 je automatski napravljen',
 'newuserlog-byemail' => 'šifra je poslana putem e-maila',
 'logentry-rights-rights' => '$1 {{GENDER:$1|je promijenio|je promijenila|je promijenio}} članstvo grupe za $3 iz $4 u $5',
+'logentry-rights-rights-legacy' => '$1 je {{GENDER:$2|promijenio|promijenila|promijenio}} članstvo grupe za $3',
+'logentry-rights-autopromote' => 'Korisničkom računu $1 {{GENDER:$1|je automatski promijenjeno članstvo|su automatski promijenjena članstva}} iz $4 u $5',
 'rightsnone' => '(nema)',
 
 # Feedback
@@ -4006,5 +4021,6 @@ Inače, možete ispuniti jednostavan obrazac ispod. Vaš komentar biti će dodan
 'duration-years' => '$1 {{PLURAL:$1|godina|godine|godina}}',
 'duration-decades' => '$1 {{PLURAL:$1|decenija|decenije|decenija}}',
 'duration-centuries' => '$1 {{PLURAL:$1|vijek|vijeka|vijekova}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milenij|milenija}}',
 
 );
index 17fc230..cdd3c93 100644 (file)
@@ -765,7 +765,7 @@ Contrasenya temporal: $2",
 'link_tip' => 'Enllaç intern',
 'extlink_sample' => "http://www.example.com títol de l'enllaç",
 'extlink_tip' => 'Enllaç extern (recordeu el prefix http://)',
-'headline_sample' => "Text per a l'encapçalament",
+'headline_sample' => "Text de l'encapçalament",
 'headline_tip' => 'Encapçalat de secció de 2n nivell',
 'nowiki_sample' => 'Inseriu ací text sense format',
 'nowiki_tip' => 'Ignora el format wiki',
@@ -2256,7 +2256,7 @@ Suggeriments i ajuda:
 'exblank' => 'la pàgina estava en blanc',
 'delete-confirm' => 'Elimina «$1»',
 'delete-legend' => 'Elimina',
-'historywarning' => "'''Avís:''' La pàgina que eliminareu té un historial amb aproximadament {{PLURAL:$1|una modificació|$1 modificacions}}:",
+'historywarning' => "'''Atenció:''' La pàgina que esteu a punt d'eliminar té un historial amb $1 {{PLURAL:$1|versió|versions}}, aproximadament:",
 'confirmdeletetext' => "Esteu a punt d'esborrar de forma permanent una pàgina o imatge i tot el seu historial de la base de dades.
 Confirmeu que realment ho voleu fer, que enteneu les
 conseqüències, i que el que esteu fent està d'acord amb la [[{{MediaWiki:Policy-url}}|política]] del projecte.",
index d47e804..4f0a236 100644 (file)
@@ -409,6 +409,9 @@ Siók-mìng: (dāng) = gâe̤ng dék sĭng bēng-buōng bī-piâng, (sèng) = g
 'group-sysop-member' => 'Guāng-lī-uòng',
 'group-bureaucrat-member' => 'Guăng-lièu-cū',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Kŭi dióng-hô̤ nĭk-cé',
+
 # Recent changes
 'recentchanges' => 'Cī-bŏng gì gāi-biéng',
 'recentchanges-summary' => 'Găk cī hiĕk dŭi-sùi wiki cī-bŏng dék sĭng gì gāi-biéng.',
@@ -567,9 +570,6 @@ Siók-mìng: (dāng) = gâe̤ng dék sĭng bēng-buōng bī-piâng, (sèng) = g
 # Special:LinkSearch
 'linksearch-ok' => 'Sìng-tō̤',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Kŭi dióng-hô̤ nĭk-cé',
-
 # E-mail user
 'emailuser' => 'Gié diêng-piĕ ké̤ṳk ĭ',
 'emailpage' => 'Gié diêng-piĕ ké̤ṳk ĭ',
index 818ae95..256e83c 100644 (file)
@@ -399,7 +399,7 @@ $1',
 
 'badaccess' => 'ھەڵە لە بە دەست ھێنان',
 'badaccess-group0' => 'ڕێگەت پێ نەدراوە بۆ بەجێهێنای ئەو ئەنجامە وا داخوازیت کردووه.',
-'badaccess-groups' => 'ئەو کردەوەیەی داوات کردووه تایبەتە بۆ بەکارھێنەرانی {{PLURAL:$2|گرووپی|ئەم گرووپانە}}: $1.',
+'badaccess-groups' => 'ئەو کردەوەیەی داوات کردووه تایبەتە بۆ بەکارھێنەرانی {{PLURAL:$2|گرووپی|گرووپەکانی}}: $1.',
 
 'versionrequired' => 'وەشانی $1ی‌ میدیاویکی پێویستە',
 'versionrequiredtext' => 'پێویستیت بە وەشانی $1ی ویکیمیدیا ھەیە بۆ بەکاربردنی ئەم پەڕەیە.
@@ -1190,7 +1190,7 @@ $1",
 'qbsettings-floatingright' => 'سەراوی ڕاست',
 
 # Preferences page
-'preferences' => 'ھەڵبژاردەکان',
+'preferences' => 'ھەڵبەژاردەکان',
 'mypreferences' => 'ھەڵبژاردەکان',
 'prefs-edits' => 'ژمارەی گۆڕانکارییەکان:',
 'prefsnologin' => 'لەژوورەوە نیت',
index 32a599b..7fc0544 100644 (file)
@@ -392,7 +392,7 @@ $messages = array(
 'tog-externaleditor' => 'Implicitně používat externí editor (pouze pro pokročilé, vyžaduje speciální nastavení počítače; [//www.mediawiki.org/wiki/Manual:External_editors další informace])',
 'tog-externaldiff' => 'Implicitně používat externí porovnávací program (pouze pro pokročilé, vyžaduje speciální nastavení počítače; [//www.mediawiki.org/wiki/Manual:External_editors další informace])',
 'tog-showjumplinks' => 'Používat odkazy „skočit na“ pro vyšší přístupnost',
-'tog-uselivepreview' => 'Používat rychlý náhled (vyžaduje JavaScript)',
+'tog-uselivepreview' => 'Používat rychlý náhled (JavaScript) (Experimentální)',
 'tog-forceeditsummary' => 'Upozornit, když nevyplním shrnutí editace',
 'tog-watchlisthideown' => 'Na seznamu sledovaných stránek skrýt moje editace',
 'tog-watchlisthidebots' => 'Na seznamu sledovaných stránek skrýt editace botů',
@@ -1083,7 +1083,8 @@ Uložením příspěvku se zavazujete, že je vaším dílem nebo je zkopírová
 Uložením příspěvku se zavazujete, že je vaším dílem nebo je zkopírován ze zdrojů, které nejsou chráněny autorským právem (tzv. <em>public domain</em>), podrobnosti najdete na $1. '''Nekopírujte díla chráněná autorským právem bez dovolení!'''",
 'longpageerror' => "'''Chyba: Pokoušíte se uložit text o velikosti {{PLURAL:$1|$1 KiB}}, přičemž dovolené maximum je {{PLURAL:$2|$2 KiB}}.'''
 Vaše změna nemůže být uložena.",
-'readonlywarning' => "'''VAROVÁNÍ: Databáze byla uzamčena kvůli údržbě, takže nebudete moci uložit své změny. Můžete si okopírovat text do souboru a uložit ho na později.'''
+'readonlywarning' => "'''Varování: Databáze byla uzamčena kvůli údržbě, takže momentálně nebudete moci uložit své změny.'''
+Můžete si okopírovat text do souboru a uložit ho na později.
 
 Správce serveru, který databázi zamkl, poskytl toto zdůvodnění: $1",
 'protectedpagewarning' => "'''Varování: Tato stránka byla zamčena, takže ji mohou editovat pouze správci.'''
@@ -2508,9 +2509,9 @@ Současné nastavení pro tuto stránku je: '''$1''':",
 Současné nastavení pro tuto stránku je: '''$1''':",
 'protect-cascadeon' => 'Tato stránka je právě zamčena, protože je vložena do {{PLURAL:$1|následující stránky zamčené|následujících stránek zamčených|následujících stránek zamčených}} kaskádovým zámkem. Můžete změnit zámky pro tuto stránku, ale nebude to mít žádný vliv na kaskádové zamčení.',
 'protect-default' => 'Povolit všem',
-'protect-fallback' => 'Vyžaduje oprávnění „$1“',
-'protect-level-autoconfirmed' => 'Zakázat novým a neregistrovaným uživatelům',
-'protect-level-sysop' => 'Pouze správci',
+'protect-fallback' => 'Povolit jen uživatelům s oprávněním „$1“',
+'protect-level-autoconfirmed' => 'Povolit jen automaticky schváleným uživatelům',
+'protect-level-sysop' => 'Povolit jen správcům',
 'protect-summary-cascade' => 'kaskádový',
 'protect-expiring' => 'vyprší $1 (UTC)',
 'protect-expiring-local' => 'vyprší $1',
@@ -2802,11 +2803,12 @@ Přesměrování na původní název můžete nechat aktualizovat automaticky.
 Pokud nenecháte, nezapomeňte poté zkontrolovat [[Special:DoubleRedirects|dvojitá]] nebo [[Special:BrokenRedirects|přerušená]] přesměrování.
 Je na vaší zodpovědnosti zajistit, aby odkazy stále vedly tam, kam mají.
 
-Stránku '''není možno''' přejmenovat, pokud pod cílovým názvem již nějaká stránka existuje, s výjimkou situace, kdy je cílová stránka prázdná nebo je přesměrováním na tuto stránku a nemá žádnou historii editací.
+Stránku '''není možno''' přejmenovat, pokud pod cílovým názvem již nějaká stránka existuje, s výjimkou situace, kdy je cílová stránka přesměrováním na tuto stránku a nemá žádnou historii editací.
 To znamená, že stránku můžete přesunout zpět na původní název, pokud uděláte chybu, a že nemůžete přepsat existující stránku.
 
 '''Upozornění!'''
-Přejmenování oblíbené stránky může být drastická a nečekaná změna; ujistěte se, prosím, že chápete důsledky svého kroku před tím, než změnu provedete.",
+Přejmenování oblíbené stránky může být drastická a nečekaná změna;
+ujistěte se, že chápete důsledky svého kroku před tím, než změnu provedete.",
 'movepagetext-noredirectfixer' => "Použitím tohoto formuláře změníte název stránky a přesunete i celou její historii na nový název.
 Původní název se stane přesměrováním na nový název.
 Nezapomeňte poté zkontrolovat [[Special:DoubleRedirects|dvojitá]] nebo [[Special:BrokenRedirects|přerušená]] přesměrování.
@@ -4129,7 +4131,8 @@ Jinak můžete využít jednoduchý formulář níže. Váš komentář bude př
 'api-error-nomodule' => 'Interní chyba: není nastaven načítací modul.',
 'api-error-ok-but-empty' => 'Interní chyba: ze serveru nepřišla odpověď.',
 'api-error-overwrite' => 'Není dovoleno přepsat existující soubor.',
-'api-error-stashfailed' => 'Vnitřní chyba: serveru se nepodařilo uložit dočasný soubor.',
+'api-error-stashfailed' => 'Vnitřní chyba: Serveru se nepodařilo uložit dočasný soubor.',
+'api-error-publishfailed' => 'Vnitřní chyba: Serveru se nepodařilo zveřejnit dočasný soubor.',
 'api-error-timeout' => 'Server neodpověděl v očekávaném čase.',
 'api-error-unclassified' => 'Došlo k neznámé chybě',
 'api-error-unknown-code' => 'Neznámá chyba: „$1“',
index 1914124..12f7f34 100644 (file)
@@ -445,6 +445,9 @@ $messages = array(
 'grouppage-sysop' => '{{ns:project}}:Съмотритєлє',
 'grouppage-bureaucrat' => '{{ns:project}}:Чинодатєлє',
 
+# Special:Log/newusers
+'newuserlogpage' => 'новъ мѣстъ сътворѥниꙗ їсторїꙗ',
+
 # User rights log
 'rightslog' => 'чинодатєльства їсторїꙗ',
 
@@ -596,9 +599,6 @@ $messages = array(
 # Special:ListUsers
 'listusers-submit' => 'виждь',
 
-# Special:Log/newusers
-'newuserlogpage' => 'новъ мѣстъ сътворѥниꙗ їсторїꙗ',
-
 # E-mail user
 'emailuser' => 'посъли єпїстолѫ',
 
@@ -616,6 +616,8 @@ $messages = array(
 'watching' => 'блюдєниѥ ...',
 'unwatching' => 'оставьлєниѥ блюдєниꙗ ...',
 
+'created' => 'сътворѥнъ ѥстъ',
+
 # Delete
 'deletepage' => 'поничьжєниѥ',
 'excontent' => "вънѫтри бѣ: '$1'",
index 75668e6..eba65c0 100644 (file)
@@ -149,7 +149,7 @@ $messages = array(
 'tog-externaleditor' => 'Defnyddio golygydd allanol trwy ragosodiad (ar gyfer arbenigwyr yn unig; mae arno angen gosodiadau arbennig ar eich cyfrifiadur. [//www.mediawiki.org/wiki/Manual:External_editors Rhagor o wybodaeth.])',
 'tog-externaldiff' => 'Defnyddio "external diff" trwy ragosodiad (ar gyfer arbenigwyr yn unig; mae arno angen gosodiadau arbennig ar eich cyfrifiadur. [//www.mediawiki.org/wiki/Manual:External_editors Rhagor o wybodaeth.])',
 'tog-showjumplinks' => 'Galluogi dolenni hygyrchedd "neidio i"',
-'tog-uselivepreview' => 'Defnyddio rhagolwg byw (angen JavaScript i hyn)',
+'tog-uselivepreview' => 'Defnyddio rhagolwg byw (JavaScript) (Arbrofol)',
 'tog-forceeditsummary' => 'Tynnu fy sylw pan adawaf flwch crynodeb golygu yn wag',
 'tog-watchlisthideown' => 'Cuddio fy ngolygiadau fy hunan yn fy rhestr wylio',
 'tog-watchlisthidebots' => 'Cuddio golygiadau bot yn fy rhestr wylio',
index 75a187c..01ad316 100644 (file)
@@ -440,7 +440,7 @@ $messages = array(
 'tog-externaleditor' => 'Externen Editor standardmäßig nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [//www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
 'tog-externaldiff' => 'Externes Programm standardmäßig für Versionsunterschiede nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [//www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
 'tog-showjumplinks' => '„Wechseln-zu“-Links aktivieren',
-'tog-uselivepreview' => 'Vorschau sofort anzeigen (benötigt JavaScript)',
+'tog-uselivepreview' => 'Vorschau sofort anzeigen (benötigt JavaScript) (experimentell)',
 'tog-forceeditsummary' => 'Warnen, sofern beim Speichern die Zusammenfassung fehlt',
 'tog-watchlisthideown' => 'Eigene Bearbeitungen in der Beobachtungsliste ausblenden',
 'tog-watchlisthidebots' => 'Bearbeitungen durch Bots in der Beobachtungsliste ausblenden',
@@ -2553,9 +2553,9 @@ Siehe die [[Special:ProtectedPages|Liste der geschützten Seiten]] für alle akt
 'protect-locked-access' => "Dein Benutzerkonto verfügt nicht über die notwendigen Rechte zur Änderung des Seitenschutzes. Hier sind die aktuellen Seitenschutzeinstellungen der Seite '''„$1“:'''",
 'protect-cascadeon' => 'Diese Seite ist gegenwärtig Teil einer Kaskadensperre. Sie ist in die {{PLURAL:$1|folgende Seite|folgenden Seiten}} eingebunden, welche durch die Kaskadensperroption geschützt {{PLURAL:$1|ist|sind}}. Der Seitenschutzstatus dieser Seite kann geändert werden, dies hat jedoch keinen Einfluss auf die Kaskadensperre:',
 'protect-default' => 'Alle Benutzer',
-'protect-fallback' => 'Es wird die „$1“-Berechtigung benötigt.',
-'protect-level-autoconfirmed' => 'Sperrung für neue und nicht registrierte Benutzer',
-'protect-level-sysop' => 'Nur Administratoren',
+'protect-fallback' => 'Nur Benutzern mit der „$1“-Berechtigung erlauben.',
+'protect-level-autoconfirmed' => 'Nur automatisch bestätigten Benutzern erlauben',
+'protect-level-sysop' => 'Nur Administratoren erlauben',
 'protect-summary-cascade' => 'kaskadierend',
 'protect-expiring' => 'bis $2, $3 Uhr (UTC)',
 'protect-expiring-local' => 'bis $1',
@@ -2850,7 +2850,7 @@ Du kannst Weiterleitungen, die auf den Originaltitel verlinken, automatisch korr
 Stelle sicher, dass du im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|kaputten Weiterleitungen]] überprüfst.
 Du bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.
 
-Die Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, diese ist leer oder eine Weiterleitung ohne Versionsgeschichte.
+Die Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, diese eine Weiterleitung ohne Versionsgeschichte.
 Dies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine Seite überschreiben.
 
 '''Warnung!'''
@@ -2861,7 +2861,7 @@ Der alte Titel wird danach zum neuen weiterleiten.
 Stelle sicher, dass du im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|kaputten Weiterleitungen]] überprüfst.
 Du bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.
 
-Die Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, diese ist leer oder eine Weiterleitung ohne Versionsgeschichte.
+Die Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, diese ist eine Weiterleitung ohne Versionsgeschichte.
 Dies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine Seite überschreiben.
 
 '''Warnung!'''
@@ -3934,6 +3934,7 @@ Du kannst auch die [[Special:EditWatchlist|Standardseite]] zum Bearbeiten benutz
 'version-variables' => 'Erweiterungen mit Variablen',
 'version-antispam' => 'Spamschutzerweiterungen',
 'version-skins' => 'Benutzeroberflächen',
+'version-api' => 'API-Erweiterungen',
 'version-other' => 'Andere Erweiterungen',
 'version-mediahandlers' => 'Mediennutzungserweiterungen',
 'version-hooks' => "Schnittstellen ''(Hooks)''",
@@ -4150,6 +4151,7 @@ Anderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kom
 'api-error-ok-but-empty' => 'Interner Fehler: Der Server reagiert nicht.',
 'api-error-overwrite' => 'Das Überschreiben einer vorhandenen Datei ist nicht erlaubt.',
 'api-error-stashfailed' => 'Interner Fehler: Der Server konnte keine temporäre Datei speichern.',
+'api-error-publishfailed' => 'Interner Fehler: Der Server konnte die temporäre Datei nicht veröffentlichen.',
 'api-error-timeout' => 'Der Server hat nicht innerhalb der erwarteten Zeit reagiert.',
 'api-error-unclassified' => 'Ein unbekannter Fehler ist aufgetreten.',
 'api-error-unknown-code' => 'Unbekannter Fehler: „$1“',
index c63fc68..8c3fed9 100644 (file)
@@ -460,7 +460,7 @@ $messages = array(
 
 # Vector skin
 'vector-action-addsection' => 'Mesel Vırazê',
-'vector-action-delete' => 'Besterne',
+'vector-action-delete' => 'Bestere',
 'vector-action-move' => 'Berê',
 'vector-action-protect' => 'Bıpawe',
 'vector-action-undelete' => 'Esterıtışi peyser bıgê',
@@ -495,7 +495,7 @@ $messages = array(
 'create' => 'Vıraze',
 'editthispage' => 'Ena pele bıvurne',
 'create-this-page' => 'Na pele bınuse',
-'delete' => 'Besterne',
+'delete' => 'Bestere',
 'deletethispage' => 'Ena perer besternê',
 'undelete_short' => '{{PLURAL:$1|Yew vurnayışi|$1 Vurnayışan}} mestere',
 'viewdeleted_short' => '{{PLURAL:$1|Yew vurnayışo esterıte|$1 Vurnayışanê esterıtan}} bımocne',
@@ -1935,7 +1935,7 @@ bıewnê keyepel akerdeyo ya zi bıne vınderê u newe ra tesel bıkerê.
 keyepel nıka zaf meşğulo yew dema herayi de newe ra tesel bıkerê.',
 
 'license' => 'Lisans:',
-'license-header' => 'Lisans',
+'license-header' => 'Lisansdayış',
 'nolicense' => 'Theba nêweçineya',
 'license-nopreview' => '(verqeydî çin o)',
 'upload_source_url' => '(yew URLê raştî, şar rê akerde yo)',
@@ -1959,7 +1959,7 @@ keyepel nıka zaf meşğulo yew dema herayi de newe ra tesel bıkerê.',
 'filehist' => 'Ravêrdê dosya',
 'filehist-help' => 'bıploxne ser yew tarih u aye tarih dı versionê dosya bıvin.',
 'filehist-deleteall' => 'hemî biestere',
-'filehist-deleteone' => 'bıestere',
+'filehist-deleteone' => 'bestere',
 'filehist-revert' => 'reyna biyere',
 'filehist-current' => 'nıkayên',
 'filehist-datetime' => 'Tarix/Zeman',
@@ -2012,7 +2012,7 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 'filedelete-intro' => "Ti ho dosyayê '''[[Media:$1|$1]]'''i u tarixê ey dosyayê hemî estereno.",
 'filedelete-intro-old' => "Ti ho versiyonê '''[[Media:$1|$1]]'''i [$4 $3, $2] estereno.",
 'filedelete-comment' => 'Sebeb:',
-'filedelete-submit' => 'Bıestere',
+'filedelete-submit' => 'Bestere',
 'filedelete-success' => "'''$1'''  esteriyayo.",
 'filedelete-success-old' => "Versiyonê'''[[Media:$1|$1]]'''î $3, $2 esteriyayo.",
 'filedelete-nofile' => "'''$1''' çin o.",
@@ -2087,7 +2087,7 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'brokenredirects' => 'Hetenayışê vengi',
 'brokenredirectstext' => 'Redireksiyonê ey ki pelanê hama çiniyeno ra link dano:',
 'brokenredirects-edit' => 'bıvurne',
-'brokenredirects-delete' => 'bıestere',
+'brokenredirects-delete' => 'bestere',
 
 'withoutinterwiki' => 'Peleyê ke zıwanan de bina re gırey cı çınyo',
 'withoutinterwiki-summary' => 'Enê pelî ke versiyonê ziwanî binî ra link nidano.',
@@ -2398,7 +2398,7 @@ Qey hemkari u pêşniyazi:
 'exbeforeblank' => "behsê verê esteriyayişi: '$1'",
 'exblank' => 'zerreyê peli vengo',
 'delete-confirm' => '"$1" bıestere',
-'delete-legend' => 'Bıestere',
+'delete-legend' => 'Bestere',
 'historywarning' => "'''Teme:''' Pela ke şıma esterenê tede yew viyarte be teqriben $1 {{PLURAL:$1|versiyon esto|versiyoni estê}}:",
 'confirmdeletetext' => 'Tı ho yew pele u tarixê pele wederneno.
 Tı ra rica keno, tı zani tı ho sekeno, tı zani neticeyanê eno wedarnayışi u tı zani tı ser [[{{MediaWiki:Policy-url}}|poliçe]] kar keno.',
index 9c5dc40..91f9190 100644 (file)
@@ -191,7 +191,7 @@ $messages = array(
 'tog-externaleditor' => 'Eksterny editor ako standard wužywaś (jano za ekspertow, pomina sebje specialne nastajenja na wašom licadle. [//www.mediawiki.org/wiki/Manual:External_editors Dalšne informacije.])',
 'tog-externaldiff' => 'Eksterny diff ako standard wužywaś (jano za ekspertow, pomina sebje specialne nastajenja na wašom licadle. [//www.mediawiki.org/wiki/Manual:External_editors Dalšne informacije.])',
 'tog-showjumplinks' => 'Wótkaze typa „źi do” zmóžniś',
-'tog-uselivepreview' => 'Live-pśeglěd wužywaś (JavaScript)',
+'tog-uselivepreview' => 'Live-pśeglěd wužywaś (JavaScript) (eksperimentelnje)',
 'tog-forceeditsummary' => 'Warnowaś, gaž pśi składowanju zespominanje felujo',
 'tog-watchlisthideown' => 'Móje změny na wobglědowańskej lisćinje schowaś',
 'tog-watchlisthidebots' => 'Změny awtomatiskich programow (botow) na wobglědowańskej lisćinje schowaś',
@@ -2272,9 +2272,9 @@ Pšosym nawroś se na bok, wót kótaregož sy pśišeł a wopytaj hyšći raz.'
 'protect-locked-access' => "Wašo wužywarske konto njama notne pšawa za změnu šćita toś togo boka. How su aktualne nastajenja šćita boka '''„$1“:'''.",
 'protect-cascadeon' => 'Toś ten bok jo tuchylu šćitany, dokulaž jo zawězany do {{PLURAL:$1|slědujucego boka|slědujuceju bokowu|slědujucych bokow}}, źož kaskadowy šćit jo aktiwěrowany. Status šćita móžo se za toś ten bok změniś, to ale njewówliwujo kaskadowy šćit:',
 'protect-default' => 'Wšyknym wužywarjam dowóliś',
-'protect-fallback' => 'Slědujuce pšawo jo notne: „$1“.',
-'protect-level-autoconfirmed' => 'Nowych a njeregistrěrowanych wužywarjow blokěrowaś',
-'protect-level-sysop' => 'Jano administratory',
+'protect-fallback' => 'Jano wužywarjow z pšawom "$1" dowóliś',
+'protect-level-autoconfirmed' => 'Jano awtomatiski wobkšuśonych wužywarjow dowóliś',
+'protect-level-sysop' => 'Jano administratorow dowóliś',
 'protect-summary-cascade' => 'kaskaděrujucy',
 'protect-expiring' => 'kóńcy $1 (UTC)',
 'protect-expiring-local' => 'płaśiwy do $1',
index 874cb50..a49218b 100644 (file)
@@ -385,7 +385,7 @@ $messages = array(
 'tog-externaleditor' => 'Χρήση εξωτερικού επεξεργαστή από προεπιλογή (για προχωρημένους μόνο, χρειάζεται ειδικές ρυθμίσεις του υπολογιστή σας. [//www.mediawiki.org/wiki/Manual:External_editors Περισσότερες πληροφορίες.])',
 'tog-externaldiff' => 'Χρήση εξωτερικού diff από προεπιλογή (για προχωρημένους μόνο, χρειάζεται ειδικές ρυθμίσεις του υπολογιστή σας. [//www.mediawiki.org/wiki/Manual:External_editors Περισσότερες πληροφορίες.])',
 'tog-showjumplinks' => 'Ενεργοποίησε τους συνδέσμους προσβασιμότητας του τύπου "μετάβαση σε"',
-'tog-uselivepreview' => 'ΧÏ\81ηÏ\83ιμοÏ\80οιήÏ\83Ï\84ε Î¬Î¼ÎµÏ\83η Ï\80Ï\81οεÏ\80ιÏ\83κÏ\8cÏ\80ηÏ\83η (αÏ\80αιÏ\84εί JavaScript)',
+'tog-uselivepreview' => 'ΧÏ\81ήÏ\83η Î¶Ï\89νÏ\84ανήÏ\82 Ï\80Ï\81οεÏ\80ιÏ\83κÏ\8cÏ\80ηÏ\83ηÏ\82 (αÏ\80αιÏ\84εί JavaScript) (Ï\80ειÏ\81αμαÏ\84ικÏ\8c)',
 'tog-forceeditsummary' => 'Να ειδοποιούμαι κατά την εισαγωγή κενής σύνοψης επεξεργασίας',
 'tog-watchlisthideown' => 'Απόκρυψη των επεξεργασιών μου από τη λίστα παρακολούθησης',
 'tog-watchlisthidebots' => 'Απόκρυψη των επεξεργασιών των bot από τη λίστα παρακολούθησης',
index 62d8932..31c8669 100644 (file)
@@ -1095,7 +1095,7 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'gotaccount'                 => 'Already have an account? $1.',
 'gotaccountlink'             => 'Log in',
 'userlogin-resetlink'        => 'Forgotten your login details?',
-'createaccountmail'          => 'By e-mail',
+'createaccountmail'          => 'Use a temporary random password and send it to the e-mail address specified below',
 'createaccountreason'        => 'Reason:',
 'badretype'                  => 'The passwords you entered do not match.',
 'userexists'                 => 'Username entered already in use.
@@ -1443,7 +1443,7 @@ You are also promising us that you wrote this yourself, or copied it from a publ
 'longpageerror'                    => "'''Error: The text you have submitted is {{PLURAL:$1|one kilobyte|$1 kilobytes}} long, which is longer than the maximum of {{PLURAL:$2|one kilobyte|$2 kilobytes}}.'''
 It cannot be saved.",
 'readonlywarning'                  => "'''Warning: The database has been locked for maintenance, so you will not be able to save your edits right now.'''
-You may wish to cut-n-paste the text into a text file and save it for later.
+You may wish to copy and paste your text into a text file and save it for later.
 
 The administrator who locked it offered this explanation: $1",
 'protectedpagewarning'             => "'''Warning: This page has been protected so that only users with administrator privileges can edit it.'''
@@ -2774,7 +2774,7 @@ Supported {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (defaults to http://
 'activeusers'            => 'Active users list',
 'activeusers-summary'    => '', # do not translate or duplicate this message to other languages
 'activeusers-intro'      => 'This is a list of users who had some kind of activity within the last $1 {{PLURAL:$1|day|days}}.',
-'activeusers-count'      => '$1 {{PLURAL:$1|edit|edits}} in the last {{PLURAL:$3|day|$3 days}}',
+'activeusers-count'      => '$1 {{PLURAL:$1|action|actions}} in the last {{PLURAL:$3|day|$3 days}}',
 'activeusers-from'       => 'Display users starting at:',
 'activeusers-hidebots'   => 'Hide bots',
 'activeusers-hidesysops' => 'Hide administrators',
@@ -2880,16 +2880,16 @@ Future changes to this page and its associated talk page will be listed there.',
 'enotif_mailer'                => '{{SITENAME}} notification mailer',
 'enotif_reset'                 => 'Mark all pages visited',
 'enotif_impersonal_salutation' => '{{SITENAME}} user',
-'enotif_subject_deleted'       => '{{SITENAME}} page $1 has been deleted by {{gender:$2|$2}}',
-'enotif_subject_created'       => '{{SITENAME}} page $1 has been created by {{gender:$2|$2}}',
-'enotif_subject_moved'         => '{{SITENAME}} page $1 has been moved by {{gender:$2|$2}}',
-'enotif_subject_restored'      => '{{SITENAME}} page $1 has been restored by {{gender:$2|$2}}',
-'enotif_subject_changed'       => '{{SITENAME}} page $1 has been changed by {{gender:$2|$2}}',
-'enotif_body_intro_deleted'    => 'The {{SITENAME}} page $1 has been deleted on $PAGEEDITDATE by {{gender:$2|$2}}, see $3.',
-'enotif_body_intro_created'    => 'The {{SITENAME}} page $1 has been created on $PAGEEDITDATE by {{gender:$2|$2}}, see $3 for the current revision.',
-'enotif_body_intro_moved'      => 'The {{SITENAME}} page $1 has been moved on $PAGEEDITDATE by {{gender:$2|$2}}, see $3 for the current revision.',
-'enotif_body_intro_restored'   => 'The {{SITENAME}} page $1 has been restored on $PAGEEDITDATE by {{gender:$2|$2}}, see $3 for the current revision.',
-'enotif_body_intro_changed'    => 'The {{SITENAME}} page $1 has been changed on $PAGEEDITDATE by {{gender:$2|$2}}, see $3 for the current revision.',
+'enotif_subject_deleted'       => '{{SITENAME}} page $1 has been {{GENDER:$2|deleted}} by $2',
+'enotif_subject_created'       => '{{SITENAME}} page $1 has been {{GENDER:$2|created}} by $2',
+'enotif_subject_moved'         => '{{SITENAME}} page $1 has been {{GENDER:$2|moved}} by $2',
+'enotif_subject_restored'      => '{{SITENAME}} page $1 has been {{GENDER:$2|restored}} by $2',
+'enotif_subject_changed'       => '{{SITENAME}} page $1 has been {{GENDER:$2|changed}} by $2',
+'enotif_body_intro_deleted'    => 'The {{SITENAME}} page $1 has been {{GENDER:$2|deleted}} on $PAGEEDITDATE by $2, see $3.',
+'enotif_body_intro_created'    => 'The {{SITENAME}} page $1 has been {{GENDER:$2|created}} on $PAGEEDITDATE by $2, see $3 for the current revision.',
+'enotif_body_intro_moved'      => 'The {{SITENAME}} page $1 has been {{GENDER:$2|moved}} on $PAGEEDITDATE by $2, see $3 for the current revision.',
+'enotif_body_intro_restored'   => 'The {{SITENAME}} page $1 has been {{GENDER:$2|restored}} on $PAGEEDITDATE by $2, see $3 for the current revision.',
+'enotif_body_intro_changed'    => 'The {{SITENAME}} page $1 has been {{GENDER:$2|changed}} on $PAGEEDITDATE by $2, see $3 for the current revision.',
 'enotif_lastvisited'           => 'See $1 for all changes since your last visit.',
 'enotif_lastdiff'              => 'See $1 to view this change.',
 'enotif_anon_editor'           => 'anonymous user $1',
@@ -3012,9 +3012,9 @@ Here are the current settings for the page '''$1''':",
 'protect-cascadeon'                => "This page is currently protected because it is included in the following {{PLURAL:$1|page, which has|pages, which have}} cascading protection turned on.
 You can change this page's protection level, but it will not affect the cascading protection.",
 'protect-default'                  => 'Allow all users',
-'protect-fallback'                 => 'Require "$1" permission',
-'protect-level-autoconfirmed'      => 'Block new and unregistered users',
-'protect-level-sysop'              => 'Administrators only',
+'protect-fallback'                 => 'Allow only users with "$1" permission',
+'protect-level-autoconfirmed'      => 'Allow only autoconfirmed users',
+'protect-level-sysop'              => 'Allow only administrators',
 'protect-summary-desc'             => '[$1=$2] ($3)', # only translate this message to other languages if you have to change it
 'protect-summary-cascade'          => 'cascading',
 'protect-expiring'                 => 'expires $1 (UTC)',
@@ -3336,7 +3336,7 @@ You can update redirects that point to the original title automatically.
 If you choose not to, be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].
 You are responsible for making sure that links continue to point where they are supposed to go.
 
-Note that the page will '''not''' be moved if there is already a page at the new title, unless it is empty or a redirect and has no past edit history.
+Note that the page will '''not''' be moved if there is already a page at the new title, unless it is a redirect and has no past edit history.
 This means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.
 
 '''Warning!'''
@@ -3347,7 +3347,7 @@ The old title will become a redirect page to the new title.
 Be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].
 You are responsible for making sure that links continue to point where they are supposed to go.
 
-Note that the page will '''not''' be moved if there is already a page at the new title, unless it is empty or a redirect and has no past edit history.
+Note that the page will '''not''' be moved if there is already a page at the new title, unless it is a redirect and has no past edit history.
 This means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.
 
 '''Warning!'''
@@ -4786,7 +4786,7 @@ Images are shown in full resolution, other file types are started with their ass
 'specialpages-group-highuse'     => 'High use pages',
 'specialpages-group-pages'       => 'Lists of pages',
 'specialpages-group-pagetools'   => 'Page tools',
-'specialpages-group-wiki'        => 'Wiki data and tools',
+'specialpages-group-wiki'        => 'Data and tools',
 'specialpages-group-redirects'   => 'Redirecting special pages',
 'specialpages-group-spam'        => 'Spam tools',
 
@@ -4886,8 +4886,8 @@ This site is experiencing technical difficulties.',
 'logentry-newusers-newusers'          => 'User account $1 was created',
 'logentry-newusers-create'            => 'User account $1 was created',
 'logentry-newusers-create2'           => 'User account $3 was created by $1',
+'logentry-newusers-byemail'           => 'User account $3 was created by $1 and password was sent by e-mail',
 'logentry-newusers-autocreate'        => 'User account $1 was created automatically',
-'newuserlog-byemail'                  => 'password sent by e-mail',
 'logentry-rights-rights'              => '$1 changed group membership for $3 from $4 to $5',
 'logentry-rights-rights-legacy'       => '$1 changed group membership for $3',
 'logentry-rights-autopromote'         => '$1 was automatically promoted from $4 to $5',
@@ -4970,6 +4970,7 @@ Otherwise, you can use the easy form below. Your comment will be added to the pa
 'api-error-ok-but-empty'                  => 'Internal error: No response from server.',
 'api-error-overwrite'                     => 'Overwriting an existing file is not allowed.',
 'api-error-stashfailed'                   => 'Internal error: Server failed to store temporary file.',
+'api-error-publishfailed'                 => 'Internal error: Server failed to publish temporary file.',
 'api-error-timeout'                       => 'The server did not respond within the expected time.',
 'api-error-unclassified'                  => 'An unknown error occurred.',
 'api-error-unknown-code'                  => 'Unknown error: "$1".',
index 56c039c..5b643c2 100644 (file)
@@ -393,7 +393,7 @@ $messages = array(
 'tog-externaleditor' => 'Utilizar editor externo por defecto (sólo para expertos: son necesarios ajustes especiales en la computadora; [//www.mediawiki.org/wiki/Manual:External_editors más información])',
 'tog-externaldiff' => "Utilizar ''diferencia'' externa por defecto (sólo para expertos: son necesarios ajustes especiales en la computadora; [//www.mediawiki.org/wiki/Manual:External_editors más información])",
 'tog-showjumplinks' => 'Habilitar los enlaces de accesibilidad «saltar a»',
-'tog-uselivepreview' => 'Usar previsualización en vivo (requiere JavaScript)',
+'tog-uselivepreview' => 'Usar previsualización en vivo (requiere JavaScript) (experimental)',
 'tog-forceeditsummary' => 'Avisarme cuando grabe la página sin introducir un resumen de edición',
 'tog-watchlisthideown' => 'Ocultar mis ediciones en la lista de seguimiento',
 'tog-watchlisthidebots' => 'Ocultar las ediciones de bots en la lista de seguimiento',
@@ -1514,7 +1514,7 @@ Esto no se puede deshacer.',
 'username' => '{{GENDER:$1|Nombre de usuario|Nombre de usuaria}}:',
 'uid' => 'ID de {{GENDER:$1|usuario|usuaria}}:',
 'prefs-memberingroups' => '{{GENDER:$2|Miembro}} {{PLURAL:$1|del grupo|de los grupos}}:',
-'prefs-registration' => 'Hora de registro:',
+'prefs-registration' => 'Fecha y hora de registro:',
 'yourrealname' => 'Nombre real:',
 'yourlanguage' => 'Idioma:',
 'yourvariant' => 'Variante lingüística del contenido:',
@@ -2515,6 +2515,7 @@ Véase [[Special:ProtectedPages|la lista de páginas protegidas]] para ver las p
 'prot_1movedto2' => 'heredando la protección al trasladar [[$1]] a [[$2]]',
 'protect-badnamespace-title' => 'Espacio de nombres no protegible',
 'protect-badnamespace-text' => 'Las páginas de este espacio de nombres no pueden ser protegidas',
+'protect-norestrictiontypes-title' => 'Página no protegible',
 'protect-legend' => 'Confirmar protección',
 'protectcomment' => 'Motivo:',
 'protectexpiry' => 'Caducidad:',
@@ -3195,6 +3196,7 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista
 'pageinfo-magic-words' => '{{PLURAL:$1|Palabra mágica|Palabras mágicas}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoría oculta|Categorías ocultas}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Plantilla incluida|Plantillas incluidas}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Página incluida|Páginas incluidas}} ($1)',
 'pageinfo-toolboxlink' => 'Información de la página',
 'pageinfo-redirectsto' => 'Redirige a',
 'pageinfo-redirectsto-info' => 'Información',
@@ -3299,6 +3301,8 @@ Ejecutarlo podría comprometer la seguridad de su equipo.",
 'minutes' => '{{PLURAL:$1|un minuto|$1 minutos}}',
 'hours' => '{{PLURAL:$1|una hora|$1 horas}}',
 'days' => '{{PLURAL:$1|un día|$1 días}}',
+'months' => '{{PLURAL:$1|$1 mes|$1 meses}}',
+'years' => '{{PLURAL:$1|$1 año|$1 años}}',
 'ago' => 'hace $1',
 'just-now' => 'Ahora mismo',
 
index 3338ab1..bb0931b 100644 (file)
@@ -562,6 +562,7 @@ $messages = array(
 'newwindow' => '(در پنجرهٔ جدید باز می‌شود)',
 'cancel' => 'لغو',
 'moredotdotdot' => 'بیشتر...',
+'morenotlisted' => 'ادامه لیست...',
 'mypage' => 'صفحه',
 'mytalk' => 'بحث',
 'anontalk' => 'بحث برای این آی‌پی',
@@ -951,6 +952,7 @@ $2',
 # E-mail sending
 'php-mail-error-unknown' => 'خطای ناشناخته در تابع  mail()‎ پی‌اچ‌پی',
 'user-mail-no-addy' => 'تلاش برای ارسال نامه بدون یک آدرس رایانامه.',
+'user-mail-no-body' => 'تلاش برای فرستادن پست‌الکترونیک بی‌دلیل کوتاه یا خالی',
 
 # Change password dialog
 'resetpass' => 'تغییر گذرواژه',
@@ -2617,6 +2619,8 @@ $PAGEINTRO $NEWPAGE
 'prot_1movedto2' => '[[$1]] به [[$2]] منتقل شد',
 'protect-badnamespace-title' => 'فضای نام بدون محافظت',
 'protect-badnamespace-text' => 'صفحه‌های موجود در این فضای نام، نمی‌توانند محافظت شوند.',
+'protect-norestrictiontypes-text' => 'امکان محافظت این صفحه به علت نبودن نوع محدودیت، مقدور نیست.',
+'protect-norestrictiontypes-title' => 'صفحهٔ غیرقابل محافظت',
 'protect-legend' => 'تأیید محافظت',
 'protectcomment' => 'دلیل:',
 'protectexpiry' => 'زمان سرآمدن:',
@@ -2633,8 +2637,8 @@ $PAGEINTRO $NEWPAGE
 'protect-cascadeon' => 'این صفحه  در حال حاضر محافظت شده‌است زیرا در {{PLURAL:$1|صفحهٔ|صفحه‌های}} زیر که گزینهٔ محافظت آبشاری {{PLURAL:$1|آن|آن‌ها}} فعال است، گنجانده شده است.
 شما می‌توانید سطح محافظت این صفحه را تغییر بدهید اما این کار تاثیری بر محافظت آبشاری صفحه نخواهد گذاشت.',
 'protect-default' => 'همهٔ کاربرها',
-'protect-fallback' => 'سطح دسترسی «$1» لازم است',
-'protect-level-autoconfirmed' => 'بستن کاربران جدید و ثبت‌نام‌نکرده',
+'protect-fallback' => 'فقط به کاربرهایی که دسترسی «$1» دارند، اجازه داده می‌شود',
+'protect-level-autoconfirmed' => 'فقط به کاربرهای تائیدشده اجازه بده',
 'protect-level-sysop' => 'فقط مدیران',
 'protect-summary-cascade' => 'آبشاری',
 'protect-expiring' => 'زمان سرآمدن $1 (UTC)',
@@ -3281,6 +3285,7 @@ $1',
 'pageinfo-magic-words' => '{{PLURAL:$1|حرف|حروف}} جادویی ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1| ردهٔ|ردهٔ}} پنهان ( $1 )',
 'pageinfo-templates' => '{{PLURAL:$1|الگو|الگو}} استفاده‌شده ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|صفحهٔ|صفحه‌های}} تراگنجایش‌شده در ($1)',
 'pageinfo-toolboxlink' => 'اطلاعات صفحه',
 'pageinfo-redirectsto' => 'تغییرمسیر به',
 'pageinfo-redirectsto-info' => 'اطلاعات',
index d1b1e68..9789e29 100644 (file)
@@ -344,7 +344,7 @@ $messages = array(
 'tog-externaleditor' => 'Käytä ulkoista tekstieditoria oletuksena. Vain kokeneille käyttäjille, vaatii selaimen asetusten muuttamista. (<span class="plainlinks">[//www.mediawiki.org/wiki/Manual:External_editors Ohje]</span>)',
 'tog-externaldiff' => 'Käytä oletuksena ulkoista työkalua sivun eri versioiden välisten erojen tarkasteluun. Vain kokeneille käyttäjille, vaatii selaimen asetusten muuttamista. (<span class="plainlinks">[//www.mediawiki.org/wiki/Manual:External_editors Ohje]</span>)',
 'tog-showjumplinks' => 'Lisää loikkaa-käytettävyyslinkit sivun alkuun',
-'tog-uselivepreview' => 'Käytä pikaesikatselua (JavaScript)',
+'tog-uselivepreview' => 'Käytä pikaesikatselua (JavaScript) (kokeellinen)',
 'tog-forceeditsummary' => 'Huomauta, jos yhteenvetoa ei ole annettu',
 'tog-watchlisthideown' => 'Piilota omat muokkaukset',
 'tog-watchlisthidebots' => 'Piilota bottien muokkaukset',
@@ -2401,6 +2401,8 @@ Viimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|k
 'prot_1movedto2' => 'siirsi sivun [[$1]] uudelle nimelle [[$2]]',
 'protect-badnamespace-title' => 'Nimiavaruus ei suojattavissa',
 'protect-badnamespace-text' => 'Tämän nimiavaruuden sivuja ei voi suojata.',
+'protect-norestrictiontypes-text' => 'Tätä sivua ei voi suojata, koska mitään rajoitusvaihtoehtoja ei ole käytettävissä.',
+'protect-norestrictiontypes-title' => 'Ei suojattavissa oleva sivu',
 'protect-legend' => 'Suojaukset',
 'protectcomment' => 'Syy',
 'protectexpiry' => 'Vanhentuu',
@@ -2415,7 +2417,7 @@ Viimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|k
 'protect-default' => 'Salli kaikki käyttäjät',
 'protect-fallback' => 'Vaadi $1-oikeus',
 'protect-level-autoconfirmed' => 'Estä uudet ja kirjautumattomat käyttäjät',
-'protect-level-sysop' => 'Vain ylläpitäjät',
+'protect-level-sysop' => 'Salli vain ylläpitäjät',
 'protect-summary-cascade' => 'laajennettu',
 'protect-expiring' => 'vanhentuu $1 (UTC)',
 'protect-expiring-local' => 'vanhentuu $1',
@@ -3058,6 +3060,7 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 'pageinfo-magic-words' => '{{PLURAL:$1|Taikasana|Taikasanat}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Piilotettu luokka|Piilotetut luokat}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Sisällytetty malline|Sisällytetyt mallineet}} ($1)',
+'pageinfo-transclusions' => 'Sisällytetty {{PLURAL:$1|sivulle|sivuille}} ($1)',
 'pageinfo-toolboxlink' => 'Sivun tiedot',
 'pageinfo-redirectsto' => 'Ohjaus sivulle',
 'pageinfo-redirectsto-info' => 'tiedot',
index 1d294f0..b6eeb76 100644 (file)
@@ -24,6 +24,7 @@
  * @author Dereckson
  * @author Diti
  * @author Dodoïste
+ * @author Drongou
  * @author Elfix
  * @author Enzoreg
  * @author Erkethan
@@ -411,7 +412,7 @@ $messages = array(
 'tog-externaleditor' => "Utiliser par défaut un éditeur de texte externe (pour les utilisateurs avancés, nécessite des réglages spécifiques sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d'informations]).",
 'tog-externaldiff' => "Utiliser un comparateur externe par défaut (pour les utilisateurs avancés, nécessite des réglages sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d'informations]).",
 'tog-showjumplinks' => 'Activer les liens « navigation » et « recherche » en haut de page',
-'tog-uselivepreview' => "Utiliser l'aperçu immédiat (nécessite JavaScript)",
+'tog-uselivepreview' => "Utiliser l'aperçu rapide (nécessite JavaScript) (expérimental)",
 'tog-forceeditsummary' => "M'avertir lorsque je n'ai pas spécifié de résumé de modification",
 'tog-watchlisthideown' => 'Masquer mes propres modifications dans la liste de suivi',
 'tog-watchlisthidebots' => 'Masquer les modifications faites par des robots dans la liste de suivi',
@@ -1216,10 +1217,10 @@ Elle a peut-être été effacée ou renommée.
 Essayez de [[Special:Search|rechercher sur le wiki]] pour trouver des pages en rapport.",
 
 # Revision deletion
-'rev-deleted-comment' => "(résumé d'édition enlevé)",
-'rev-deleted-user' => "(nom d'utilisateur supprimé)",
-'rev-deleted-event' => '(entrée supprimée)',
-'rev-deleted-user-contribs' => "[nom d'utilisateur ou adresse IP supprimée - modification cachée sur les contributions]",
+'rev-deleted-comment' => '(résumé de modification retiré)',
+'rev-deleted-user' => '(nom d’utilisateur retiré)',
+'rev-deleted-event' => '(entrée retirée)',
+'rev-deleted-user-contribs' => '[nom d’utilisateur ou adresse IP retiré - modification masquée sur les contributions]',
 'rev-deleted-text-permission' => "Cette version de la page a été '''effacée'''.
 Des détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des effacements].",
 'rev-deleted-text-unhide' => "Cette version de la page a été '''effacée'''.
@@ -1275,7 +1276,7 @@ Les autres administrateurs de {{SITENAME}} pourront toujours accéder au contenu
 'revdelete-radio-same' => '(ne pas changer)',
 'revdelete-radio-set' => 'Oui',
 'revdelete-radio-unset' => 'Non',
-'revdelete-suppress' => 'Cacher les données également pour les administrateurs',
+'revdelete-suppress' => 'Masquer également les données pour les administrateurs',
 'revdelete-unsuppress' => 'Enlever les restrictions sur les versions restaurées',
 'revdelete-log' => 'Motif :',
 'revdelete-submit' => 'Appliquer {{PLURAL:$1|à la révision sélectionnée|aux révisions sélectionnées}}',
@@ -2128,7 +2129,7 @@ N'oubliez pas de vérifier s'il n'y a pas d'autres liens vers les modèles avant
 'statistics-articles' => 'Pages de contenu',
 'statistics-pages' => 'Pages',
 'statistics-pages-desc' => 'Toutes les pages du wiki, y compris les pages de discussion, les redirections, etc.',
-'statistics-files' => 'Fichers importés',
+'statistics-files' => 'Fichiers importés',
 'statistics-edits' => "Modifications de pages depuis l'installation de {{SITENAME}}",
 'statistics-edits-average' => 'Nombre moyen de modifications par page',
 'statistics-views-total' => 'Visites',
@@ -2542,9 +2543,9 @@ Voici les réglages actuels de la page '''$1''' :",
 Voici les réglages actuels de la page '''$1''' :",
 'protect-cascadeon' => "Cette page est protégée car incluse dans {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l'option « protection en cascade » activée. Vous pouvez changer le niveau de protection de cette page sans que cela n'affecte la protection en cascade.",
 'protect-default' => 'Autoriser tous les utilisateurs',
-'protect-fallback' => 'Nécessite la permission « $1 »',
-'protect-level-autoconfirmed' => 'Bloquer les nouveaux utilisateurs et les utilisateurs anonymes',
-'protect-level-sysop' => 'Administrateurs uniquement',
+'protect-fallback' => 'Autoriser uniquement les utilisateurs avec le droit « $1 »',
+'protect-level-autoconfirmed' => 'Autoriser uniquement les utilisateurs auto-confirmés',
+'protect-level-sysop' => 'Autoriser uniquement les administrateurs',
 'protect-summary-cascade' => 'protection en cascade',
 'protect-expiring' => 'expire le $1 (UTC)',
 'protect-expiring-local' => 'expire le $1',
@@ -2722,7 +2723,7 @@ Donnez ci-dessous un motif précis (par exemple en citant les pages qui ont ét
 'ipbotherreason' => 'Motif différent ou supplémentaire :',
 'ipbhidename' => "Masquer le nom d'utilisateur des modifications et des listes",
 'ipbwatchuser' => 'Suivre les pages utilisateur et de discussion de cet utilisateur',
-'ipb-disableusertalk' => 'Empêcher cet utilisateur de modifier sa propre page de discussion pendant la durée de son blocage',
+'ipb-disableusertalk' => 'Empêcher l’utilisateur de modifier sa page de discussion pendant le blocage',
 'ipb-change-block' => 'Bloquer à nouveau cet utilisateur avec ces paramètres',
 'ipb-confirm' => 'Confirmer le blocage',
 'badipaddress' => 'Adresse IP incorrecte',
@@ -2845,7 +2846,7 @@ Pour bloquer ou débloquer la base de données, il doit être accessible par le
 'move-page-legend' => 'Renommer une page',
 'movepagetext' => "Utilisez le formulaire ci-dessous pour renommer une page, en déplaçant tout son historique vers le nouveau nom. L'ancien titre deviendra une page de redirection vers le nouveau titre. Vous pouvez mettre à jour automatiquement les redirections actuelles qui pointent vers le titre original. Si vous choisissez de ne pas le faire, assurez-vous de vérifier toute [[Special:DoubleRedirects|double redirection]] ou [[Special:BrokenRedirects|redirection cassée]]. Vous avez la responsabilité de vous assurer que les liens continuent de pointer vers leur destination supposée.
 
-Notez que la page ne sera '''pas''' renommée s'il existe déjà une page avec le nouveau titre, sauf si cette dernière a un historique de modifications vierge et est soit vide, soit une simple redirection. Ceci permet de renommer une page vers sa position d'origine si le déplacement s'avère erroné.
+Notez que la page ne sera '''pas''' renommée s'il existe déjà une page avec le nouveau titre, sauf si cette dernière a un historique de modifications vierge et est une simple redirection. Ceci permet de renommer une page vers sa position d'origine si le déplacement s'avère erroné.
 
 '''Attention !'''
 Ceci peut provoquer un changement radical et imprévu pour une page souvent consultée ; assurez-vous d'en avoir compris les conséquences avant de continuer.",
@@ -4122,7 +4123,7 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 'logentry-delete-delete' => '$1 a supprimé la page $3',
 'logentry-delete-restore' => '$1 a restauré la page $3',
 'logentry-delete-event' => "$1 a modifié la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4",
-'logentry-delete-revision' => "$1 a modifié la visibilité {{PLURAL:$5|d'une révision|de $5 révisions}} sur la page $3: $4",
+'logentry-delete-revision' => '$1 a modifié la visibilité {{PLURAL:$5|d’une révision|de $5 révisions}} sur la page $3&nbsp;: $4',
 'logentry-delete-event-legacy' => '$1 a modifié la visibilité des événements du journal sur $3',
 'logentry-delete-revision-legacy' => '$1 a modifié la visibilité des révisions sur la page $3',
 'logentry-suppress-delete' => '$1 a supprimé la page $3',
@@ -4131,11 +4132,11 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 'logentry-suppress-event-legacy' => '$1 a secrètement modifié la visibilité des événements du journal sur $3',
 'logentry-suppress-revision-legacy' => '$1 a secrètement modifié la visibilité des révisions sur la page $3',
 'revdelete-content-hid' => 'contenu masqué',
-'revdelete-summary-hid' => 'résumé de modification caché',
-'revdelete-uname-hid' => "nom d'utilisateur caché",
-'revdelete-content-unhid' => 'contenu révélé',
-'revdelete-summary-unhid' => 'résumé de modification démasqué',
-'revdelete-uname-unhid' => "nom d'utilisateur démasqué",
+'revdelete-summary-hid' => 'résumé de modification masqué',
+'revdelete-uname-hid' => 'nom d’utilisateur masqué',
+'revdelete-content-unhid' => 'contenu affiché',
+'revdelete-summary-unhid' => 'résumé de modification affiché',
+'revdelete-uname-unhid' => 'nom d’utilisateur affiché',
 'revdelete-restricted' => 'restrictions appliquées aux administrateurs',
 'revdelete-unrestricted' => 'restrictions retirées pour les administrateurs',
 'logentry-move-move' => '$1 a déplacé la page $3 vers $4',
index 0602a6a..461b83e 100644 (file)
@@ -325,7 +325,7 @@ $messages = array(
 'tog-rememberpassword' => 'Sè rapelar de mon contresegno sur ceti navigator (por lo més $1 jorn{{PLURAL:$1||s}})',
 'tog-watchcreations' => 'Apondre les pâges que fé et pués los fichiérs que tèlècharjo a ma lista de siuvu',
 'tog-watchdefault' => 'Apondre les pâges et los fichiérs que chanjo a ma lista de siuvu',
-'tog-watchmoves' => 'Apondre les pâges et los fichiérs que renomo a ma lista de siuvu',
+'tog-watchmoves' => 'Apondre les pâges et los fichiérs que dèplaço a ma lista de siuvu',
 'tog-watchdeletion' => 'Apondre les pâges et los fichiérs que suprimo a ma lista de siuvu',
 'tog-minordefault' => 'Marcar per dèfôt tôs los changements coment petiôts',
 'tog-previewontop' => 'Montrar l’apèrçu d’amont la zona de changement',
@@ -341,7 +341,7 @@ $messages = array(
 'tog-externaleditor' => 'Empleyér per dèfôt un changior de tèxto de defôr (solament por los utilisators avanciês, at fôta d’una configuracion spèciâla sur voutron ordenator. [//www.mediawiki.org/wiki/Manual:External_editors Més d’enformacions.])',
 'tog-externaldiff' => 'Empleyér per dèfôt un comparator de defôr (solament por los utilisators avanciês, at fôta d’una configuracion spèciâla sur voutron ordenator. [//www.mediawiki.org/wiki/Manual:External_editors Més d’enformacions.])',
 'tog-showjumplinks' => 'Activar los lims d’accèssibilitât « {{int:jumpto}} »',
-'tog-uselivepreview' => 'Empleyér l’apèrçu drêt (at fôta de JavaScript)',
+'tog-uselivepreview' => 'Empleyér l’apèrçu rapido (at fôta de JavaScript) (èxpèrimentâl)',
 'tog-forceeditsummary' => 'M’avèrtir quand j’é pas buchiê de rèsumâ de changement',
 'tog-watchlisthideown' => 'Cachiér los mins changements dedens la lista de siuvu',
 'tog-watchlisthidebots' => 'Cachiér los changements fêts per des robots dedens la lista de siuvu',
@@ -462,7 +462,7 @@ $messages = array(
 # Vector skin
 'vector-action-addsection' => 'Apondre na chousa',
 'vector-action-delete' => 'Suprimar',
-'vector-action-move' => 'Renomar',
+'vector-action-move' => 'Dèplaciér',
 'vector-action-protect' => 'Protègiér',
 'vector-action-undelete' => 'Refâre',
 'vector-action-unprotect' => 'Changiér la protèccion',
@@ -624,7 +624,7 @@ Pôt asse-ben étre quèstion d’una cofierie dedens la programeria empleyêe p
 'nosuchspecialpage' => 'Pâge spèciâla pas ègzistenta',
 'nospecialpagetext' => '<strong>Vos éd demandâ na pâge spèciâla qu’ègziste pas.</strong>
 
-Na lista de les pâges spèciâles justes sè trove dessus [[Special:SpecialPages|{{int:specialpages}}]].',
+Na lista de les pâges spèciâles justes sè trôve dessus [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
 'error' => 'Fôta',
@@ -1098,9 +1098,9 @@ Vos pouede tornar arriér et pués changiér na pâge ègzistenta ou ben [[Speci
 'recreate-moveddeleted-warn' => "'''Atencion : vos éte aprés refâre na pâge qu’est étâye suprimâye dês devant.'''
 
 Demandâd-vos se fôt franc continuar son changement.
-Por comoditât, lo jornal de les suprèssions et des changements de nom de cela pâge est montrâ ce-desot :",
+Por comoditât, lo jornal de les suprèssions et des dèplacements de cela pâge est montrâ ce-desot :",
 'moveddeleted-notice' => 'Ceta pâge est étâye suprimâye.
-Por refèrence, lo jornal de les suprèssions et des changements de nom est montrâ ce-desot.',
+Por refèrence, lo jornal de les suprèssions et des dèplacements de cela pâge est montrâ ce-desot.',
 'log-fulllog' => 'Vêre lo jornal complèt',
 'edit-hook-aborted' => 'Changement anulâ per un grèfon.
 Nion’èxplicacion est étâye balyêe.',
@@ -1542,40 +1542,40 @@ Cel’enformacion serat publica.',
 'editinguser' => "Changement des drêts d’utilisator de l’utilisat{{GENDER:$1|or|rice}} '''[[User:$1|$1]]''' $2",
 'userrights-editusergroup' => 'Changiér les tropes d’utilisators',
 'saveusergroups' => 'Encartar les tropes d’utilisators',
-'userrights-groupsmember' => 'Membro de :',
-'userrights-groupsmember-auto' => 'Membro emplicito de :',
-'userrights-groups-help' => 'Vos pouede changiér les tropes a lesquintes est ceti usanciér.
-* Una câsa pouentâ vôt dére que l’usanciér sè trove dens cela tropa.
-* Una câsa pas pouentâ vôt dére qu’y sè trove pas.
-* Una petiôta ètêla (*) endique que vos porréd pas enlevar cela tropa setout que vos l’aréd apondua et l’un l’ôtro.',
+'userrights-groupsmember' => 'Membr{{GENDER:$2|o|a}} de :',
+'userrights-groupsmember-auto' => '{{GENDER:$2|Membro tacito|Membra tacita}} de :',
+'userrights-groups-help' => 'Vos pouede changiér les tropes a lesquintes est cet’utilisat{{GENDER:$1|or|rice}} :
+* Na câsa pouentâye vôt dére que l’utilisat{{GENDER:$1|or|rice}} sè trôve dedens cela tropa.
+* Na câsa pas pouentâye vôt dére que s’y trôve pas.
+* Na petiôt’ètêla (*) endique que vos pouede pas enlevar cela tropa setout que vos l’éd apondua ou ben l’una l’ôtra.',
 'userrights-reason' => 'Rêson :',
-'userrights-no-interwiki' => 'Vos avéd pas la pèrmission de changiér des drêts d’usanciér dessus d’ôtros vouiquis.',
-'userrights-nodatabase' => 'La bâsa de balyês « $1 » ègziste pas ou ben el est pas locala.',
-'userrights-nologin' => 'Vos vos dête [[Special:UserLogin|branchiér]] avouéc un compto d’administrator por balyér des drêts d’usanciér.',
-'userrights-notallowed' => 'Voutron compto at pas la pèrmission de balyér ou enlevar des drêts d’usanciér.',
+'userrights-no-interwiki' => 'Vos avéd pas la pèrmission de changiér des drêts d’utilisator dessus d’ôtros vouiquis.',
+'userrights-nodatabase' => 'La bâsa de donâs « $1 » ègziste pas ou ben el est pas locala.',
+'userrights-nologin' => 'Vos vos dête [[Special:UserLogin|branchiér]] avouéc un compto d’administrator por balyér des drêts d’utilisator.',
+'userrights-notallowed' => 'Voutron compto at pas la pèrmission de balyér ou ben enlevar des drêts d’utilisator.',
 'userrights-changeable-col' => 'Les tropes que vos pouede changiér',
 'userrights-unchangeable-col' => 'Les tropes que vos pouede pas changiér',
 
 # Groups
 'group' => 'Tropa :',
-'group-user' => 'Usanciérs',
-'group-autoconfirmed' => 'Usanciérs encartâs',
-'group-bot' => 'Bots',
+'group-user' => 'Utilisators',
+'group-autoconfirmed' => 'Utilisators ôtoconfirmâs',
+'group-bot' => 'Robots',
 'group-sysop' => 'Administrators',
 'group-bureaucrat' => 'Grata-papiérs',
 'group-suppress' => 'Supèrvisors',
 'group-all' => '(tôs)',
 
-'group-user-member' => 'usanciér{{GENDER:$1||e}}',
-'group-autoconfirmed-member' => 'usanciér{{GENDER:$1||e}} encartâ',
-'group-bot-member' => '{{GENDER:$1|bot}}',
+'group-user-member' => 'utilisat{{GENDER:$1|or|rice}}',
+'group-autoconfirmed-member' => 'utilisat{{GENDER:$1|or ôtoconfirmâ|rice ôtoconfirmâye}}',
+'group-bot-member' => '{{GENDER:$1|robot}}',
 'group-sysop-member' => 'administrat{{GENDER:$1|or|rice}}',
 'group-bureaucrat-member' => '{{GENDER:$1|grata-papiér}}',
 'group-suppress-member' => 'supèrviso{{GENDER:$1|r|sa}}',
 
-'grouppage-user' => '{{ns:project}}:Usanciérs',
-'grouppage-autoconfirmed' => '{{ns:project}}:Usanciérs encartâs',
-'grouppage-bot' => '{{ns:project}}:Bots',
+'grouppage-user' => '{{ns:project}}:Utilisators',
+'grouppage-autoconfirmed' => '{{ns:project}}:Utilisators ôtoconfirmâs',
+'grouppage-bot' => '{{ns:project}}:Robots',
 'grouppage-sysop' => '{{ns:project}}:Administrators',
 'grouppage-bureaucrat' => '{{ns:project}}:Grata-papiérs',
 'grouppage-suppress' => '{{ns:project}}:Supèrvisors',
@@ -1585,106 +1585,106 @@ Cel’enformacion serat publica.',
 'right-edit' => 'Changiér les pâges',
 'right-createpage' => 'Fâre des pâges (que sont pas des pâges de discussion)',
 'right-createtalk' => 'Fâre des pâges de discussion',
-'right-createaccount' => 'Fâre des comptos usanciér novéls',
-'right-minoredit' => 'Marcar sos changements coment petiôts',
-'right-move' => 'Renomar des pâges',
-'right-move-subpages' => 'Renomar des pâges avouéc lors sot-pâges',
-'right-move-rootuserpages' => 'Renomar la pâge principâla a un usanciér',
-'right-movefile' => 'Renomar des fichiérs',
-'right-suppressredirect' => 'Pas fâre de redirèccion dês lo titro d’origina en renoment una pâge',
+'right-createaccount' => 'Fâre des comptos utilisator novéls',
+'right-minoredit' => 'Marcar los changements coment petiôts',
+'right-move' => 'Dèplaciér des pâges',
+'right-move-subpages' => 'Dèplaciér des pâges avouéc lors sot-pâges',
+'right-move-rootuserpages' => 'Dèplaciér des pâges utilisator principâles',
+'right-movefile' => 'Dèplaciér des fichiérs',
+'right-suppressredirect' => 'Pas fâre de redirèccion dês la pâge d’origina en dèplacient na pâge',
 'right-upload' => 'Tèlèchargiér des fichiérs',
 'right-reupload' => 'Ècllafar un fichiér ègzistent',
-'right-reupload-own' => 'Ècllafar un fichiér qu’on at sè-mémo tèlèchargiê',
-'right-reupload-shared' => 'Ècllafar localament un fichiér present sur un dèpôt de fichiérs partagiê',
-'right-upload_by_url' => 'Tèlèchargiér un fichiér dês una URL',
-'right-purge' => 'Purgiér lo cache de les pâges sen demanda de confirmacion',
-'right-autoconfirmed' => 'Changiér les pâges mié-protègiês',
-'right-bot' => 'Étre trètâ coment una pratica ôtomatisâ',
-'right-nominornewtalk' => 'Pas dècllenchiér la notificacion de mèssâjo novél quand on fât un petiôt changement sur la pâge de discussion a un usanciér',
-'right-apihighlimits' => 'Utilisar des limites ples hôtes dens les requétes API',
-'right-writeapi' => 'Utilisar l’API d’ècritura',
+'right-reupload-own' => 'Ècllafar un fichiér ègzistent tèlèchargiê per sè-mémo',
+'right-reupload-shared' => 'Ècllafar localament un fichiér present sur un dèpôt de fichiérs mèdia partagiê',
+'right-upload_by_url' => 'Tèlèchargiér un fichiér dês n’URL',
+'right-purge' => 'Purgiér lo cacho du seto d’una pâge sen confirmacion',
+'right-autoconfirmed' => 'Changiér les pâges mié-protègiêes',
+'right-bot' => 'Étre trètâ coment na mètoda ôtomatisâye',
+'right-nominornewtalk' => 'Pas dècllenchiér la notificacion de mèssâjo novél quand font un petiôt changement sur la pâge de discussion d’un utilisator',
+'right-apihighlimits' => 'Empleyér des limites ples hôtes dedens les demandes API',
+'right-writeapi' => 'Empleyér l’API d’ècritura',
 'right-delete' => 'Suprimar des pâges',
-'right-bigdelete' => 'Suprimar des pâges qu’ont un grant historico',
+'right-bigdelete' => 'Suprimar des pâges qu’ont un grôs historico',
 'right-deletelogentry' => 'Suprimar et refâre n’entrâ spècifica du jornal',
-'right-deleterevision' => 'Suprimar ou refâre una vèrsion spècefica d’una pâge',
-'right-deletedhistory' => 'Vêre les entrâs des historicos suprimâs mas sen lor tèxto',
-'right-deletedtext' => 'Vêre lo tèxto suprimâ et les difèrences entre les vèrsions suprimâs',
-'right-browsearchive' => 'Rechèrchiér des pâges suprimâs',
-'right-undelete' => 'Refâre una pâge suprimâ',
-'right-suppressrevision' => 'Revêre et refâre les vèrsions cachiês ux administrators',
+'right-deleterevision' => 'Suprimar et refâre na vèrsion spècifica d’una pâge',
+'right-deletedhistory' => 'Vêre les entrâs suprimâyes de l’historico sen lor tèxto',
+'right-deletedtext' => 'Vêre lo tèxto suprimâ et pués los changements entre les vèrsions suprimâyes',
+'right-browsearchive' => 'Rechèrchiér des pâges suprimâyes',
+'right-undelete' => 'Refâre na pâge',
+'right-suppressrevision' => 'Revêre et refâre les vèrsions cachiêes ux administrators',
 'right-suppressionlog' => 'Vêre los jornals privâs',
-'right-block' => 'Blocar en ècritura d’ôtros usanciérs',
-'right-blockemail' => 'Empachiér un usanciér de mandar des mèssâjos',
-'right-hideuser' => 'Blocar un usanciér en cachient son nom u publico',
-'right-ipblock-exempt' => 'Pas étre afèctâ per les adrèces IP blocâs, los blocâjos ôtomaticos et los blocâjos de plages d’adrèces IP',
-'right-proxyunbannable' => "Pas étre afèctâ per los blocâjos ôtomaticos de sèrvors mandatèros (''proxies'')",
+'right-block' => 'Blocar en ècritura d’ôtros utilisators',
+'right-blockemail' => 'Empachiér un utilisator de mandar des mèssâjos',
+'right-hideuser' => 'Blocar un utilisator en cachient son nom u publico',
+'right-ipblock-exempt' => 'Èvitar los blocâjos d’adrèces IP, los blocâjos ôtomaticos et pués los blocâjos de plages d’adrèces IP',
+'right-proxyunbannable' => 'Èvitar los blocâjos ôtomaticos de proxis',
 'right-unblockself' => 'Sè dèblocar lor-mémos',
-'right-protect' => 'Changiér lo nivél de protèccion de les pâges et changiér les pâges protègiês',
-'right-editprotected' => 'Changiér les pâges protègiês (sen protèccion en cascâda)',
-'right-editinterface' => 'Changiér l’entèrface de la programeria',
-'right-editusercssjs' => 'Changiér los fichiérs CSS et JS d’ôtros usanciérs',
-'right-editusercss' => 'Changiér los fichiérs CSS d’ôtros usanciérs',
-'right-edituserjs' => 'Changiér los fichiérs JS d’ôtros usanciérs',
-'right-rollback' => 'Rèvocar rêdo los changements u dèrriér usanciér qu’at changiê una pâge spècefica',
-'right-markbotedits' => 'Marcar des changements rèvocâs coment Ã¨yent Ã©tâ fêts per un bot',
+'right-protect' => 'Changiér lo nivél de protèccion et pués changiér les pâges protègiêes',
+'right-editprotected' => 'Changiér les pâges protègiêes (sen protèccion en cascâda)',
+'right-editinterface' => 'Changiér l’entèrface utilisator',
+'right-editusercssjs' => 'Changiér los fichiérs CSS et JavaScript d’ôtros utilisators',
+'right-editusercss' => 'Changiér los fichiérs CSS d’ôtros utilisators',
+'right-edituserjs' => 'Changiér los fichiérs JavaScript d’ôtros utilisators',
+'right-rollback' => 'Rèvocar rêdo los changements du dèrriér utilisator qu’at changiê na pâge particuliére',
+'right-markbotedits' => 'Marcar des changements rèvocâs coment Ã©tent Ã©tâs fêts per un robot',
 'right-noratelimit' => 'Pas étre afèctâ per les limites de quota',
 'right-import' => 'Importar des pâges dês d’ôtros vouiquis',
 'right-importupload' => 'Importar des pâges dês un fichiér tèlèchargiê',
-'right-patrol' => 'Marcar des changements ux ôtros coment survelyês',
-'right-autopatrol' => 'Avêr sos changements marcâs ôtomaticament coment survelyês',
-'right-patrolmarks' => 'Vêre los marcâjos de survelyence dens los dèrriérs changements',
-'right-unwatchedpages' => 'Vêre la lista de les pâges pas siuvues',
+'right-patrol' => 'Marcar los changements des ôtros coment gouardâs',
+'right-autopatrol' => 'Avêr los sins changements marcâs ôtomaticament coment gouardâs',
+'right-patrolmarks' => 'Vêre les mârques de gouârda dedens los dèrriérs changements',
+'right-unwatchedpages' => 'Vêre na lista de les pâges pas siuvues',
 'right-mergehistory' => 'Fusionar los historicos de les pâges',
-'right-userrights' => 'Changiér tôs los drêts a un usanciér',
-'right-userrights-interwiki' => 'Changiér los drêts ux usanciérs sur d’ôtros vouiquis',
-'right-siteadmin' => 'Vèrrolyér ou dèvèrrolyér la bâsa de balyês',
-'right-override-export-depth' => 'Èxportar les pâges en encllusent les pâges liyês tant qu’a una provondior de 5 nivéls',
-'right-sendemail' => 'Mandar un mèssâjo ux ôtros usanciérs',
+'right-userrights' => 'Changiér tôs los drêts d’un utilisator',
+'right-userrights-interwiki' => 'Changiér los drêts d’utilisator des utilisators que sont sur un ôtro vouiqui',
+'right-siteadmin' => 'Vèrrolyér et dèvèrrolyér la bâsa de donâs',
+'right-override-export-depth' => 'Èxportar les pâges avouéc les pâges liyêes tant qu’a na provondior de 5 nivéls',
+'right-sendemail' => 'Mandar un mèssâjo ux ôtros utilisators',
 'right-passwordreset' => 'Vêre los mèssâjos de remisa a zérô des contresegnos',
 
 # Special:Log/newusers
-'newuserlogpage' => 'Jornal de les crèacions de comptos usanciér',
-'newuserlogpagetext' => 'O est un jornal de les crèacions de comptos usanciér.',
+'newuserlogpage' => 'Jornal de les crèacions d’utilisators',
+'newuserlogpagetext' => 'O est un jornal de les crèacions d’utilisators.',
 
 # User rights log
-'rightslog' => 'Jornal des changements de statut d’usanciér',
-'rightslogtext' => 'Vê-que lo jornal des changements de statut d’usanciér.',
+'rightslog' => 'Jornal des drêts d’utilisator',
+'rightslogtext' => 'O est un jornal des changements des drêts d’utilisator.',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'liére cela pâge',
 'action-edit' => 'changiér cela pâge',
 'action-createpage' => 'fâre des pâges',
 'action-createtalk' => 'fâre des pâges de discussion',
-'action-createaccount' => 'fâre cél compto usanciér',
+'action-createaccount' => 'fâre cél compto utilisator',
 'action-minoredit' => 'marcar cél changement coment petiôt',
-'action-move' => 'renomar cela pâge',
-'action-move-subpages' => 'renomar cela pâge et ses sot-pâges',
-'action-move-rootuserpages' => 'renomar la pâge principâla a un usanciér',
-'action-movefile' => 'renomar cél fichiér',
+'action-move' => 'dèplaciér cela pâge',
+'action-move-subpages' => 'dèplaciér cela pâge et les sines sot-pâges',
+'action-move-rootuserpages' => 'dèplaciér les pâges utilisator principâles',
+'action-movefile' => 'dèplaciér cél fichiér',
 'action-upload' => 'tèlèchargiér cél fichiér',
 'action-reupload' => 'ècllafar cél fichiér ègzistent',
 'action-reupload-shared' => 'ècllafar localament cél fichiér present sur un dèpôt partagiê',
-'action-upload_by_url' => 'tèlèchargiér cél fichiér dês una URL',
-'action-writeapi' => 'utilisar l’API d’ècritura',
+'action-upload_by_url' => 'tèlèchargiér cél fichiér dês n’URL',
+'action-writeapi' => 'empleyér l’API d’ècritura',
 'action-delete' => 'suprimar cela pâge',
 'action-deleterevision' => 'suprimar cela vèrsion',
 'action-deletedhistory' => 'vêre l’historico suprimâ de cela pâge',
-'action-browsearchive' => 'rechèrchiér des pâges suprimâs',
+'action-browsearchive' => 'rechèrchiér des pâges suprimâyes',
 'action-undelete' => 'refâre cela pâge',
-'action-suppressrevision' => 'revêre et refâre cela vèrsion cachiê',
+'action-suppressrevision' => 'revêre et refâre cela vèrsion cachiêe',
 'action-suppressionlog' => 'vêre cél jornal privâ',
-'action-block' => 'blocar en ècritura cél usanciér',
+'action-block' => 'blocar en ècritura cél utilisator',
 'action-protect' => 'changiér los nivéls de protèccion por cela pâge',
-'action-rollback' => 'rèvocar rêdo los changements u dèrriér usanciér qu’at changiê una pâge spècefica',
+'action-rollback' => 'rèvocar rêdo los changements du dèrriér utilisator qu’at changiê na pâge particuliére',
 'action-import' => 'importar cela pâge dês un ôtro vouiqui',
 'action-importupload' => 'importar cela pâge dês un fichiér tèlèchargiê',
-'action-patrol' => 'marcar lo changement ux ôtros coment survelyê',
-'action-autopatrol' => 'avêr voutron changement marcâ coment survelyê',
+'action-patrol' => 'marcar lo changement des ôtros coment gouardâ',
+'action-autopatrol' => 'avêr voutron changement marcâ coment gouardâ',
 'action-unwatchedpages' => 'vêre la lista de les pâges pas siuvues',
 'action-mergehistory' => 'fusionar l’historico de cela pâge',
-'action-userrights' => 'changiér tôs los drêts d’usanciér',
-'action-userrights-interwiki' => 'changiér los drêts ux usanciérs sur d’ôtros vouiquis',
-'action-siteadmin' => 'vèrrolyér ou ben dèvèrrolyér la bâsa de balyês',
+'action-userrights' => 'changiér tôs los drêts d’utilisator',
+'action-userrights-interwiki' => 'changiér los drêts d’utilisator des utilisators que sont sur un ôtro vouiqui',
+'action-siteadmin' => 'vèrrolyér ou ben dèvèrrolyér la bâsa de donâs',
 'action-sendemail' => 'mandar des mèssâjos',
 
 # Recent changes
@@ -1692,29 +1692,29 @@ Cel’enformacion serat publica.',
 'recentchanges' => 'Dèrriérs changements',
 'recentchanges-legend' => 'Chouèx des dèrriérs changements',
 'recentchanges-summary' => 'Siude los dèrriérs changements du vouiqui sur ceta pâge.',
-'recentchanges-feed-description' => 'Siude los dèrriérs changements du vouiqui dens ceti flux.',
-'recentchanges-label-newpage' => 'Ceti changement at fêt una pâge novèla.',
-'recentchanges-label-minor' => 'Ceti changement est petiôt.',
-'recentchanges-label-bot' => 'Ceti changement at étâ fêt per un bot.',
-'recentchanges-label-unpatrolled' => 'Ceti changement at p’oncor étâ survelyê.',
+'recentchanges-feed-description' => 'Siude los dèrriérs changements du vouiqui dedens ceti flux.',
+'recentchanges-label-newpage' => 'Ceti changement at fêt na pâge novèla',
+'recentchanges-label-minor' => 'O est un petiôt changement',
+'recentchanges-label-bot' => 'Ceti changement est étâ fêt per un robot',
+'recentchanges-label-unpatrolled' => 'Ceti changement est p’oncor étâ gouardâ',
 'rcnote' => "Vê-que {{PLURAL:$1|lo dèrriér changement fêt|los '''$1''' dèrriérs changements fêts}} pendent {{PLURAL:$2|lo jorn passâ|los '''$2''' jorns passâs}} tant qu’a $5 lo $4.",
-'rcnotefrom' => "Vê-que los changements fêts dês lo '''$2''' ('''$1''' u més).",
+'rcnotefrom' => "Vê-que los changements fêts dês lo '''$2''' (tant qu’a '''$1''' montrâs).",
 'rclistfrom' => 'Montrar los novéls changements dês lo $1',
 'rcshowhideminor' => '$1 los petiôts changements',
-'rcshowhidebots' => '$1 los bots',
-'rcshowhideliu' => '$1 los usanciérs encartâs',
+'rcshowhidebots' => '$1 los robots',
+'rcshowhideliu' => '$1 los utilisators branchiês',
 'rcshowhideanons' => '$1 los utilisators anonimos',
-'rcshowhidepatr' => '$1 los changements survelyês',
-'rcshowhidemine' => '$1 mos changements',
+'rcshowhidepatr' => '$1 los changements gouardâs',
+'rcshowhidemine' => '$1 los mins changements',
 'rclinks' => 'Montrar los $1 dèrriérs changements fêts pendent los $2 jorns passâs<br />$3',
 'diff' => 'dif',
 'hist' => 'hist',
-'hide' => 'cachiér',
+'hide' => 'Cachiér',
 'show' => 'Montrar',
 'minoreditletter' => 'p',
 'newpageletter' => 'N',
-'boteditletter' => 'b',
-'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|usanciér qu’est|usanciérs que sont}} aprés siuvre]',
+'boteditletter' => 'r',
+'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|utilisator qu’est|utilisators que sont}} aprés siuvre]',
 'rc_categories' => 'Limita de les catègories (sèparacion avouéc « | »)',
 'rc_categories_any' => 'Totes',
 'rc-change-size-new' => '$1 octèt{{PLURAL:$1||s}} aprés changement',
index deadbed..48da258 100644 (file)
@@ -152,6 +152,7 @@ $messages = array(
 'newwindow' => '(wårt önj en nai waning ääm mååged)',
 'cancel' => 'Oufbreege',
 'moredotdotdot' => 'Mör ...',
+'morenotlisted' => 'Öödern, ei apfeerd ...',
 'mypage' => 'Sidj',
 'mytalk' => 'Diskusjuun',
 'anontalk' => 'Diskusjoonssid foon jüdeer IP',
@@ -185,6 +186,7 @@ $messages = array(
 'namespaces' => 'Noomerüme',
 'variants' => 'Fariante',
 
+'navigation-heading' => 'Nawigatsjuun',
 'errorpagetitle' => 'Fäägel',
 'returnto' => 'Tubääg tu jü side $1.',
 'tagline' => 'Üt {{SITENAME}}',
@@ -285,6 +287,10 @@ Sii jü [[Special:Version|Färsjoonssid]]',
 'youhavenewmessages' => 'Dü hääst $1 aw din diskusjoonssid ($2).',
 'newmessageslink' => 'naie tisinge',
 'newmessagesdifflink' => 'Leest änring',
+'youhavenewmessagesfromusers' => 'Dü heest $1 faan {{PLURAL:$3|en öödern brüker|$3 ööder brükern}} ($2).',
+'youhavenewmessagesmanyusers' => 'Dü heest $1 faan flook ööder brükern ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|ian nei nooracht|nei noorachten}}',
+'newmessagesdifflinkplural' => 'leetst {{PLURAL:$1|feranrang|feranrangen}}',
 'youhavenewmessagesmulti' => 'Dü hääst nai tisinge aw $1',
 'editsection' => 'Beårbe',
 'editsection-brackets' => '[$1]',
@@ -413,6 +419,7 @@ Di grünj faan di administraator as: „$3“.',
 'invalidtitle-knownnamespace' => 'Ferkiard auerskraft uun di nöömrüm „$2“ an tekst „$3“',
 'invalidtitle-unknownnamespace' => 'Ferkiard auerskraft uun di ünbekäänd nöömrüm „$1“ an tekst „$2“',
 'exception-nologin' => 'Ei uunmeldet',
+'exception-nologin-text' => 'Det könst dü bluas bewerke, wan dü uunmeldet beest.',
 
 # Virus scanner
 'virus-badscanner' => "Hiinje konfigurasjoon: ünbekånde fiirusscanner: ''$1''",
@@ -424,12 +431,16 @@ Di grünj faan di administraator as: „$3“.',
 
 Dü koost {{SITENAME}} nü anonüüm widerbrüke, unti de wider uner diseelew unti en oudern brükernoome <span class='plainlinks'>[$1 önjmälde]</span>.
 Påås aw, dåt hu side nuch wise koone, dåt dü önjmälded bast, sülung dü ai dan browsercache lääsimååged heest.",
+'welcomeuser' => 'Welkimen, $1!',
+'welcomecreation-msg' => 'Din brükerkonto as iinracht wurden.
+Ferjid det ei, an aachte üüb din [[Special:Preferences|{{SITENAME}} iinstelangen]].',
 'yourname' => 'Brükernoome:',
 'yourpassword' => 'Pååsuurd:',
 'yourpasswordagain' => 'Schriw pååsuurd nuch iinjsen:',
-'remembermypassword' => 'Aw diheere komputer foon duur önjmälde (maksimool for {{PLURAL:$1|däi|deege}})',
+'remembermypassword' => 'Aw diheere komputer foon duur önjmälde (maksimool for $1 {{PLURAL:$1|däi|deege}})',
 'securelogin-stick-https' => 'Eefter önjmälding ma HTTPS ferbünen bliwe',
 'yourdomainname' => 'Din domain:',
+'password-change-forbidden' => 'Üüb detheer wiki könst dü nian paaswurden feranre.',
 'externaldberror' => 'Deer läit en fäägel bai jü äkstärn autentifisiiring for, unti dü möist din äkstärn brükerkonto äi aktualisiire.',
 'login' => 'Önjmälde',
 'nav-login-createaccount' => 'Önjmälde',
@@ -519,6 +530,7 @@ Wees sü gödj än täif, bit dü wider ferseechst.',
 # E-mail sending
 'php-mail-error-unknown' => 'Ünbekäänd feeler mä det funktsjuun mail() faan PHP.',
 'user-mail-no-addy' => 'Köö niinj e-mail schake suner e-mail-adres.',
+'user-mail-no-body' => 'Dü wulst en e-mail saner tekst wechsjüür.',
 
 # Change password dialog
 'resetpass' => 'Pååsuurd änre',
@@ -575,6 +587,7 @@ Tidwis paasuurd: $2',
 'changeemail-oldemail' => 'Aktuel e-mail adres',
 'changeemail-newemail' => 'Nei e-mail adres',
 'changeemail-none' => '(niin)',
+'changeemail-password' => 'Din {{SITENAME}} paaswurd:',
 'changeemail-submit' => 'E-mail adres feranre',
 'changeemail-cancel' => 'Ufbreeg',
 
@@ -670,6 +683,10 @@ Dü koost dideere tiitel aw da ouder side [[Special:Search/{{PAGENAME}}|säke]],
 <span class="plainlinks">önj da deertuhiirende [{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} logböke säke] unti jüdeer sid [{{fullurl:{{FULLPAGENAME}}|action=edit}} beårbe]</span>.',
 'noarticletext-nopermission' => 'Üüb detdiar sidj stäänt noch niks, oober dü mutst diar uk niks iinskriiw.
 Dü könst diar üüb ööder sidjen efter [[Special:Search/{{PAGENAME}}|sjük]] of a <span class="plainlinks">[{{fullurl:{{#special:Log}}|page={{FULLPAGENAME}}}} logbuken uunluke].</span>',
+'missing-revision' => 'Det werjuun #$1 faan det sidj "{{PAGENAME}}" jaft at ei.
+
+Det komt diar miast faan, dat en ual ferwisang stregen wurden as.
+Dü könst det uun\'t [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} logbuk faan stregen sidjen] efterlees.',
 'userpage-userdoesnotexist' => "Det brükerkonto ''$1'' as ei diar.
 Wel dü detdiar sidj würelk maage/bewerke?",
 'userpage-userdoesnotexist-view' => 'Benjüterkonto "$1" bestoont ai.',
@@ -773,6 +790,15 @@ Jü wörd önjscheened sleeked.',
 'edit-already-exists' => 'Köö niinj nai sid mååge.
 Dåt bestöö ål.',
 'defaultmessagetext' => 'Standard tekst',
+'content-failed-to-parse' => "Parsing faan $2 för't model $1 ging skiaf: $3",
+'invalid-content-data' => 'Diar stäänt wat uun, wat diar ei hen hiart',
+'content-not-allowed-here' => '„$1“ mut ei skrewen wurd üüb sidj [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitekst',
+'content-model-text' => 'normool tekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Woorschauing: Jüdeer sid önjthålt tu fool apteele foon widluftie parserfunksjoone.
@@ -792,6 +818,7 @@ Deer {{PLURAL:$2|mötj ai mör ås 1 apteel|mönje ai mör ås $1 apteele}} wees
 'expansion-depth-exceeded-warning' => 'Detdiar sidj hää tuföl ütjwidjangen (expansion)',
 'parser-unstrip-loop-warning' => 'Diar as en jinsidjag ferwisang',
 'parser-unstrip-recursion-limit' => 'Tuföl jinsidjag ferwisangen bi $1',
+'converter-manual-rule-error' => "Bi't manuel reegel för't spriakferanrang lääpt wat skiaf.",
 
 # "Undo" feature
 'undo-success' => 'Detdiar feranrang koon turag nimen wurd. 
@@ -979,6 +1006,10 @@ A nawigatsjuun links saat ales weder turag üüb di ual stant.',
 'editundo' => 'tunintemååge',
 'diff-multi' => '({{PLURAL:$1|Ian wersjuun diartesken|$1 wersjuunen diartesken}} faan {{PLURAL:$2|ään brüker|$2 brükern}} {{PLURAL:$1|woort|wurd}} ei uunwiset)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Ian wersjuun diartesken|$1 wersjuunen diartesken}} faan muar üs $2 {{PLURAL:$2|brüker|brükern}} wurd ei uunwiset)',
+'difference-missing-revision' => "{{PLURAL:$2|Ian werjuun|$2 werjuunen}} faan di ferskeel ($1) {{PLURAL:$2|as|san}} ei fünjen wurden.
+
+Det komt diar miast faan, dat en ual ferwisang stregen wurden as.
+Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} logbuk faan stregen sidjen] efterlees.",
 
 # Search results
 'searchresults' => 'Säkjresultoote',
index 7d912b8..8cac7b2 100644 (file)
@@ -814,6 +814,10 @@ La tô direzion di pueste no ven mostrade cuant che i utents ti contatin.',
 
 'grouppage-sysop' => '{{ns:project}}:Aministradôrs',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Regjistri dai gnûfs utents',
+'newuserlogpagetext' => 'Ca sot tu cjatis un regjistri dai gnûfs utents creâts.',
+
 # User rights log
 'rightslog' => 'Regjistri dai dirits dai utents',
 
@@ -1112,10 +1116,6 @@ Cjale ancje lis [[Special:WantedCategories|categoriis desideradis]].',
 'activeusers-hidesysops' => 'Plate i aministradôrs',
 'activeusers-noresult' => 'Nissun utent cjatât.',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Regjistri dai gnûfs utents',
-'newuserlogpagetext' => 'Ca sot tu cjatis un regjistri dai gnûfs utents creâts.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Dirits dai grups di utents',
 'listgrouprights-group' => 'Grup',
@@ -1173,6 +1173,8 @@ e la pagjine e sarà '''gruessute''' te [[Special:RecentChanges|liste dai ultins
 'enotif_reset' => 'Segne dutis lis pagjinis come visitadis',
 'enotif_impersonal_salutation' => 'Utent di {{SITENAME}}',
 'enotif_anon_editor' => 'utent anonim $1',
+'created' => 'creade',
+'changed' => 'cambiade',
 
 # Delete
 'deletepage' => 'Elimine pagjine',
index 03fd441..14b4bc2 100644 (file)
@@ -255,7 +255,7 @@ $messages = array(
 'tog-externaleditor' => 'Usar un editor externo por defecto (só para expertos; cómpre configurar o computador. [//www.mediawiki.org/wiki/Manual:External_editors Máis información.])',
 'tog-externaldiff' => 'Usar as diferenzas externas por defecto (só para expertos; cómpre configurar o computador. [//www.mediawiki.org/wiki/Manual:External_editors Máis información.])',
 'tog-showjumplinks' => 'Permitir as ligazóns de accesibilidade "ir a"',
-'tog-uselivepreview' => 'Usar a vista previa en tempo real (cómpre JavaScript)',
+'tog-uselivepreview' => 'Usar a vista previa en tempo real (cómpre JavaScript) (experimental)',
 'tog-forceeditsummary' => 'Avisádeme cando o campo resumo estea baleiro',
 'tog-watchlisthideown' => 'Agochar as edicións propias na lista de vixilancia',
 'tog-watchlisthidebots' => 'Agochar as edicións dos bots na lista de vixilancia',
@@ -2428,9 +2428,9 @@ Velaquí a configuración actual da páxina '''$1''':",
 'protect-cascadeon' => 'Esta páxina está protexida neste momento porque está incluída {{PLURAL:$1|na seguinte páxina, que foi protexida|nas seguintes páxinas, que foron protexidas}} coa opción protección en serie activada.
 Pode mudar o nivel de protección da páxina pero iso non afectará á protección en serie.',
 'protect-default' => 'Permitir a todos os usuarios',
-'protect-fallback' => 'Cómpre ter permisos de "$1"',
-'protect-level-autoconfirmed' => 'Bloquear os usuarios novos e anónimos',
-'protect-level-sysop' => 'Só os administradores',
+'protect-fallback' => 'Permitir só aos usuarios con permisos de "$1"',
+'protect-level-autoconfirmed' => 'Permitir só aos usuarios autoconfirmados',
+'protect-level-sysop' => 'Permitir só aos administradores',
 'protect-summary-cascade' => 'protección en serie',
 'protect-expiring' => 'remata o $2 ás $3 (UTC)',
 'protect-expiring-local' => 'caduca o $1',
@@ -2731,10 +2731,10 @@ Pode actualizar automaticamente as redireccións que van dar ao título orixinal
 Se escolle non facelo, asegúrese de verificar que non hai redireccións [[Special:DoubleRedirects|dobres]] ou [[Special:BrokenRedirects|crebadas]].
 Vostede é responsábel de asegurarse de que as ligazóns continúan a apuntar cara a onde se supón que deberían.
 
-Teña en conta que a páxina '''non''' será movida se xa existe unha páxina co novo título, a menos que estea baleira ou sexa unha redirección e que non teña historial de edicións.
+Teña en conta que a páxina '''non''' será movida se xa existe unha páxina co novo título, a menos que sexa unha redirección e non teña historial de edicións.
 Isto significa que pode volver renomear unha páxina ao seu nome antigo se comete un erro, e que non pode sobrescribir unha páxina que xa existe.
 
-'''ATENCIÓN!'''
+'''Atención!'''
 Este cambio nunha páxina popular pode ser drástico e inesperado;
 por favor, asegúrese de que entende as consecuencias disto antes de proseguir.",
 'movepagetext-noredirectfixer' => "Ao usar o formulario de embaixo vai cambiar o nome da páxina, movendo todo o seu historial ao novo nome.
@@ -2742,10 +2742,10 @@ O título vello vaise converter nunha páxina de redirección ao novo título.
 Asegúrese de verificar que non hai redireccións [[Special:DoubleRedirects|dobres]] ou [[Special:BrokenRedirects|crebadas]].
 Vostede é responsábel de asegurarse de que as ligazóns continúan a apuntar cara a onde se supón que deberían.
 
-Teña en conta que a páxina '''non''' será movida se xa existe unha páxina co novo título, a menos que estea baleira ou sexa unha redirección e que non teña historial de edicións.
+Teña en conta que a páxina '''non''' será movida se xa existe unha páxina co novo título, a menos que sexa unha redirección e non teña historial de edicións.
 Isto significa que pode volver renomear unha páxina ao seu nome antigo se comete un erro, e que non pode sobrescribir unha páxina que xa existe.
 
-'''ATENCIÓN!'''
+'''Atención!'''
 Este cambio nunha páxina popular pode ser drástico e inesperado;
 por favor, asegúrese de que entende as consecuencias disto antes de proseguir.",
 'movepagetalktext' => "A páxina de conversa asociada, se existe, será automaticamente movida con esta '''agás que''':
@@ -3100,7 +3100,7 @@ Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está n
 'pageinfo-toolboxlink' => 'Información da páxina',
 'pageinfo-redirectsto' => 'Redirixe cara a',
 'pageinfo-redirectsto-info' => 'información',
-'pageinfo-contentpage' => 'Cóntase como páxina de contido',
+'pageinfo-contentpage' => 'Cóntase como páxina de contido?',
 'pageinfo-contentpage-yes' => 'Si',
 'pageinfo-protect-cascading' => 'Protección en serie activada',
 'pageinfo-protect-cascading-yes' => 'Si',
@@ -4018,7 +4018,8 @@ En caso contrario, pode empregar o formulario sinxelo inferior. O seu comentario
 'api-error-nomodule' => 'Erro interno: Non hai ningún módulo de cargas.',
 'api-error-ok-but-empty' => 'Erro interno: Non hai resposta do servidor.',
 'api-error-overwrite' => 'Non está permitido sobrescribir un ficheiro existente.',
-'api-error-stashfailed' => 'Erro interno: O servidor non puido almacenar os ficheiros temporais.',
+'api-error-stashfailed' => 'Erro interno: O servidor non puido almacenar o ficheiro temporal.',
+'api-error-publishfailed' => 'Erro interno: O servidor non puido publicar o ficheiro temporal.',
 'api-error-timeout' => 'O servidor non respondeu no tempo esperado.',
 'api-error-unclassified' => 'Houbo un erro descoñecido.',
 'api-error-unknown-code' => 'Erro descoñecido: "$1"',
index b5e0fb2..afe55ba 100644 (file)
@@ -2180,11 +2180,18 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'unwatching' => 'નજર રાખવાની બંધ કરી છે...',
 'watcherrortext' => 'તમારી ધ્યાનસૂચિ નાં સેટિંગ્સ માં "$1" માં ફેરફાર કરતી વખતે ભૂલ આવી.',
 
-'enotif_mailer' => '{{SITENAME}} àª¸à«\82àª\9aના àª\88-મà«\87લ àªªàª¾àª ક',
+'enotif_mailer' => '{{SITENAME}} àª¸à«\82àª\9aના àª\88-મà«\87લ àªªà«\8dરà«\87ષક',
 'enotif_reset' => 'બધા પાનાને મુલાકાત લેવાયેલા અંકિત કરો',
 'enotif_impersonal_salutation' => '{{SITENAME}} સભ્ય',
+'enotif_subject_deleted' => '{{SITENAME}} પૃષ્ઠ $1 {{gender:$2|$2}}એ દૂર કર્યું છે',
+'enotif_subject_created' => '{{SITENAME}}માં {{gender:$2|$2}}એ પૃષ્ઠ $1 બનાવ્યું છે',
+'enotif_subject_moved' => '{{SITENAME}} પૃષ્ઠ $1ને {{gender:$2|$2}}એ ખસેડ્યું છે',
+'enotif_subject_restored' => '{{SITENAME}} પૃષ્ઠ $1 {{gender:$2|$2}}એ પુન:સ્થાપિત કર્યું છે',
 'enotif_subject_changed' => '{{SITENAME}} પૃષ્ઠ $1માં {{gender:$2|$2}}એ ફેરફાર કર્યો છે',
-'enotif_body_intro_changed' => 'The {{SITENAME}} પૃષ્ઠ $1ને {{gender:$2|$2}}એ $PAGEEDITDATEના રોજ બદલ્યું છે, હાલની આવૃત્તિ માટે જુઓ: $3.',
+'enotif_body_intro_deleted' => '{{SITENAME}} પાનું $1 $PAGEEDITDATEના રોજ {{gender:$2|$2}}એ દૂર કર્યું છે, જુઓ $3.',
+'enotif_body_intro_created' => '{{SITENAME}}નું પાનું $1 $PAGEEDITDATEના રોજ {{gender:$2|$2}} દ્વારા બનાવવામાં આવ્યું છે, હાલની આવૃત્તિ માટે $3 જુઓ.',
+'enotif_body_intro_moved' => '{{SITENAME}} પૃષ્ઠ $1ને {{gender:$2|$2}}એ $PAGEEDITDATEના રોજ દિશાનિર્દેશન આપ્યું છે, હાલની આવૃત્તિ માટે જુઓ: $3.',
+'enotif_body_intro_changed' => '{{SITENAME}} પૃષ્ઠ $1ને {{gender:$2|$2}}એ $PAGEEDITDATEના રોજ બદલ્યું છે, હાલની આવૃત્તિ માટે જુઓ: $3.',
 'enotif_lastvisited' => 'તમારી પાછલી મુલાકાત પછી થયેલા બધા ફેરફારો માટે $1 જુઓ',
 'enotif_lastdiff' => 'આ ફેરફાર જોવા $1 જુઓ',
 'enotif_anon_editor' => 'અનામિ સભ્ય $1',
index f40ded1..6f0b4c5 100644 (file)
@@ -707,9 +707,11 @@ My bailliu eh y chiarail, bee eh ymmydit son cur gys lieh y chur dhyt er son yn
 'right-upload' => 'Laadey neese coadanyn',
 'right-delete' => 'Duillag y scryssey',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Lioar chooishyn ny h-ymmydeyryn noa',
+
 # User rights log
 'rightslog' => 'Lioar chooishyn kiartyn ymmydeyr',
-'rightsnone' => '(veg)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'y duillag shoh y lhaih',
@@ -953,9 +955,6 @@ Ta duillagyn er [[Special:Watchlist|dty rolley arrey]] ayns '''clou trome'''.",
 # Special:ListUsers
 'listusers-submit' => 'Taishbyn',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Lioar chooishyn ny h-ymmydeyryn noa',
-
 # Special:ListGroupRights
 'listgrouprights-group' => 'Possan',
 'listgrouprights-rights' => 'Kiartyn',
@@ -1028,6 +1027,8 @@ $UNWATCHURL
 
 Aaveaghey as cooney s\'odjey:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'crooit',
+'changed' => 'ceaghlit',
 
 # Delete
 'deletepage' => 'Scryss y duillag',
@@ -1467,6 +1468,9 @@ Bee adsyn elley follit dy seyr-obbragh.<br />
 # Special:Tags
 'tags-edit' => 'reaghey',
 
+# New logging system
+'rightsnone' => '(veg)',
+
 # Search suggestions
 'searchsuggest-search' => 'Ronsaghey',
 'searchsuggest-containing' => 'goaill stiagh...',
index 4501a66..a6e9b8e 100644 (file)
@@ -659,6 +659,8 @@ E ʻoluʻolu, e hōʻoia i ka hoʻokūkū ʻana i lalo, a laila, e mālama i nā
 'watching' => 'Ke kia‘i nei...',
 'unwatching' => 'Ke wehe nei i ke kiaʻi...',
 
+'changed' => 'ua loli ‘ia',
+
 # Delete
 'deletepage' => 'Kāpae ʻaoʻao',
 'actioncomplete' => 'Ua pau',
index ced3a0f..1931f90 100644 (file)
@@ -384,7 +384,7 @@ $messages = array(
 'tog-externaleditor' => 'שימוש בעורך חיצוני כברירת מחדל (למשתמשים מומחים בלבד, דורש הגדרות מיוחדות במחשב. [//www.mediawiki.org/wiki/Manual:External_editors למידע נוסף.])',
 'tog-externaldiff' => 'שימוש בתוכנת השוואת הגרסאות החיצונית כברירת מחדל (למשתמשים מומחים בלבד, דורש הגדרות מיוחדות במחשב. [//www.mediawiki.org/wiki/Manual:External_editors למידע נוסף.])',
 'tog-showjumplinks' => 'הצגת קישורי נגישות מסוג "קפוץ אל"',
-'tog-uselivepreview' => 'שימוש בתצוגה מקדימה מהירה (דרוש JavaScript)',
+'tog-uselivepreview' => 'שימוש בתצוגה מקדימה מהירה (דרוש JavaScript) (ניסיוני)',
 'tog-forceeditsummary' => 'הצגת אזהרה בעת הכנסת תקציר עריכה ריק',
 'tog-watchlisthideown' => 'הסתרת עריכות שלי ברשימת המעקב',
 'tog-watchlisthidebots' => 'הסתרת בוטים ברשימת המעקב',
@@ -2417,16 +2417,16 @@ $1',
 'enotif_mailer' => 'הודעות {{SITENAME}}',
 'enotif_reset' => 'סימון כל הדפים כאילו נצפו',
 'enotif_impersonal_salutation' => 'משתמש של {{SITENAME}}',
-'enotif_subject_deleted' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נמחק על ידי {{gender:$2|$2}}',
-'enotif_subject_created' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נוצר על ידי {{gender:$2|$2}}',
-'enotif_subject_moved' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} הועבר על ידי {{gender:$2|$2}}',
-'enotif_subject_restored' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שוחזר על ידי {{gender:$2|$2}}',
-'enotif_subject_changed' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שונה על ידי {{gender:$2|$2}}',
-'enotif_body_intro_deleted' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נמחק ב־$PAGEEDITDATE על ידי {{gender:$2|$2}}, ראו $3.',
-'enotif_body_intro_created' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נוצר ב־$PAGEEDITDATE על ידי {{gender:$2|$2}}, ראו $3 לגרסה הנוכחית.',
-'enotif_body_intro_moved' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} הועבר ב־$PAGEEDITDATE על ידי {{gender:$2|$2}}, ראו $3 לגרסה הנוכחית.',
-'enotif_body_intro_restored' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שוחזר ב־$PAGEEDITDATE על ידי {{gender:$2|$2}}, ראו $3 לגרסה הנוכחית.',
-'enotif_body_intro_changed' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שונה ב־$PAGEEDITDATE על ידי {{gender:$2|$2}}, ראו $3 לגרסה הנוכחית.',
+'enotif_subject_deleted' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נמחק על ידי $2',
+'enotif_subject_created' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נוצר על ידי $2',
+'enotif_subject_moved' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} הועבר על ידי $2',
+'enotif_subject_restored' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שוחזר על ידי $2',
+'enotif_subject_changed' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שונה על ידי $2',
+'enotif_body_intro_deleted' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נמחק ב־$PAGEEDITDATE על ידי $2, ראו $3.',
+'enotif_body_intro_created' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נוצר ב־$PAGEEDITDATE על ידי $2, ראו $3 לגרסה הנוכחית.',
+'enotif_body_intro_moved' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} הועבר ב־$PAGEEDITDATE על ידי $2, ראו $3 לגרסה הנוכחית.',
+'enotif_body_intro_restored' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שוחזר ב־$PAGEEDITDATE על ידי $2, ראו $3 לגרסה הנוכחית.',
+'enotif_body_intro_changed' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שונה ב־$PAGEEDITDATE על ידי $2, ראו $3 לגרסה הנוכחית.',
 'enotif_lastvisited' => 'ראו $1 לכל השינויים מאז ביקורכם האחרון.',
 'enotif_lastdiff' => 'ראו $1 לשינוי זה.',
 'enotif_anon_editor' => 'משתמש אנונימי $1',
@@ -2544,9 +2544,9 @@ $UNWATCHURL
 להלן ההגדרות הנוכחיות עבור הדף '''$1''':",
 'protect-cascadeon' => 'דף זה מוגן כרגע כיוון שהוא מוכלל {{PLURAL:$1|בדף הבא, שמופעלת עליו|בדפים הבאים, שמופעלת עליהם}} הגנה מדורגת. באפשרותכם לשנות את רמת ההגנה על הדף, אך זה לא ישפיע על ההגנה המדורגת.',
 'protect-default' => 'כל המשתמשים מורשים',
-'protect-fallback' => '×\9eשת×\9eש×\99×\9d ×\91×¢×\9c×\99 ×\94רש×\90ת "$1" ×\91×\9c×\91×\93',
-'protect-level-autoconfirmed' => '×\9e× ×\99עת ×\9eשת×\9eש×\99×\9d ×\97×\93ש×\99×\9d ×\95×\9c×\90 ×¨×©×\95×\9eים',
-'protect-level-sysop' => '×\9eפע×\99×\9c×\99 ×\9eער×\9bת ×\91×\9c×\91×\93',
+'protect-fallback' => 'רק ×\9eשת×\9eש×\99×\9d ×\91×¢×\9c×\99 ×\94רש×\90ת "$1" ×\9e×\95רש×\99×\9d',
+'protect-level-autoconfirmed' => 'רק ×\9eשת×\9eש×\99×\9d ×\95ת×\99ק×\99×\9d ×\9e×\95רשים',
+'protect-level-sysop' => 'רק ×\9eפע×\99×\9c×\99 ×\9eער×\9bת ×\9e×\95רש×\99×\9d',
 'protect-summary-cascade' => 'מדורג',
 'protect-expiring' => 'פוקעת $1 (UTC)',
 'protect-expiring-local' => 'פוקעת $1',
@@ -2846,7 +2846,7 @@ $1',
 אם תבחרו לא לעשות זאת, אנא ודאו שאין [[Special:DoubleRedirects|הפניות כפולות]] או [[Special:BrokenRedirects|שבורות]].
 אתם אחראים לוודא שכל הקישורים ימשיכו להצביע למקום שאליו הם אמורים להצביע.
 
-ש×\99×\9e×\95 ×\9c×\91: ×\94×\93×£ '''×\9c×\90''' ×\99×\95×¢×\91ר ×\90×\9d ×\9b×\91ר ×\99ש ×\93×£ ×ª×\97ת ×\94ש×\9d ×\94×\97×\93ש, ×\90×\9c×\90 ×\90×\9d ×\94×\93×£ ×\94×\96×\94 ×¨×\99ק, ×\90×\95 ×©×\94×\95×\90 ×\94פנ×\99×\94, ואין לו היסטוריית עריכות קודמות.
+ש×\99×\9e×\95 ×\9c×\91: ×\94×\93×£ '''×\9c×\90''' ×\99×\95×¢×\91ר ×\90×\9d ×\9b×\91ר ×\99ש ×\93×£ ×ª×\97ת ×\94ש×\9d ×\94×\97×\93ש, ×\90×\9c×\90 ×\90×\9d ×\94×\93×£ ×\94×\96×\94 ×\94×\95×\90 ×\94פנ×\99×\94 ואין לו היסטוריית עריכות קודמות.
 פירוש הדבר שאפשר לשנות חזרה את שמו של דף לשם המקורי אם נעשתה טעות, ושלא ניתן לדרוס דף קיים.
 
 '''אזהרה!'''
@@ -2857,7 +2857,7 @@ $1',
 אנא ודאו שאין [[Special:DoubleRedirects|הפניות כפולות]] או [[Special:BrokenRedirects|שבורות]].
 אתם אחראים לוודא שכל הקישורים ימשיכו להצביע למקום שאליו הם אמורים להצביע.
 
-ש×\99×\9e×\95 ×\9c×\91: ×\94×\93×£ '''×\9c×\90''' ×\99×\95×¢×\91ר ×\90×\9d ×\9b×\91ר ×\99ש ×\93×£ ×ª×\97ת ×\94ש×\9d ×\94×\97×\93ש, ×\90×\9c×\90 ×\90×\9d ×\94×\93×£ ×\94×\96×\94 ×¨×\99ק, ×\90×\95 ×©×\94×\95×\90 ×\94פנ×\99×\94, ואין לו היסטוריית עריכות קודמות.
+ש×\99×\9e×\95 ×\9c×\91: ×\94×\93×£ '''×\9c×\90''' ×\99×\95×¢×\91ר ×\90×\9d ×\9b×\91ר ×\99ש ×\93×£ ×ª×\97ת ×\94ש×\9d ×\94×\97×\93ש, ×\90×\9c×\90 ×\90×\9d ×\94×\93×£ ×\94×\96×\94 ×\94×\95×\90 ×\94פנ×\99×\94 ואין לו היסטוריית עריכות קודמות.
 פירוש הדבר שאפשר לשנות חזרה את שמו של דף לשם המקורי אם נעשתה טעות, ושלא ניתן לדרוס דף קיים.
 
 '''אזהרה!'''
@@ -4192,6 +4192,7 @@ $5
 'api-error-ok-but-empty' => 'שגיאה פנימית: אין תשובה מהשרת.',
 'api-error-overwrite' => 'לא מותרת החלפת קובץ קיים.',
 'api-error-stashfailed' => 'שגיאה פנימית: השרת נכשל באחסון הקובץ הזמני.',
+'api-error-publishfailed' => 'שגיאה פנימית: השרת נכשל בפרסום הקובץ הזמני.',
 'api-error-timeout' => 'השרת לא השיב בזמן המצופה.',
 'api-error-unclassified' => 'אירעה שגיאה בלתי ידועה.',
 'api-error-unknown-code' => 'שגיאה בלתי ידועה: "$1".',
index 821791e..b607859 100644 (file)
@@ -350,7 +350,7 @@ $messages = array(
 'errorpagetitle' => 'त्रुटि',
 'returnto' => '$1 को लौटें।',
 'tagline' => '{{SITENAME}} से',
-'help' => 'सहायता',
+'help' => 'मदद',
 'search' => 'खोज',
 'searchbutton' => 'खोजें',
 'go' => 'जाएँ',
@@ -542,6 +542,8 @@ $1',
 'cannotdelete' => '"$1" पृष्ठ या फ़ाइल को हटाया नहीं जा सकता।
 शायद किसी और ने इसे पहले ही हटा दिया हो।',
 'cannotdelete-title' => '"$1" पृष्ठ को हटाया नहीं जा सकता',
+'delete-hook-aborted' => 'हुक द्वारा हटाना बीच में ही छोड़ा गया।
+इसने कोई कारण नहीं बताया।',
 'badtitle' => 'खराब शीर्षक',
 'badtitletext' => 'आपके द्वारा अनुरोधित शीर्षक अयोग्य, ख़ाली या गलत जुड़ा हुआ अंतर-भाषीय या अंतर-विकि शीर्षक है।
 इसमें एक या एक से अधिक ऐसे कॅरेक्टर हो सकते हैं जो शीर्षक में प्रयोग नहीं किये जा सकते।',
@@ -957,6 +959,7 @@ $2
 'defaultmessagetext' => 'संदेश का डिफ़ॉल्ट पाठ',
 
 # Content models
+'content-model-wikitext' => 'विकिटेक्स्ट',
 'content-model-javascript' => 'जावास्क्रिप्ट',
 
 # Parser/template warnings
@@ -2976,7 +2979,7 @@ $1 को बाध्य करने का कारण है: "$2"',
 'pageinfo-firsttime' => 'पृष्ठ निर्माण तिथि',
 'pageinfo-lastuser' => 'नवीनतम सम्पादक',
 'pageinfo-lasttime' => 'नवीनतम सम्पादन तिथि',
-'pageinfo-edits' => 'संपादन की संख्या',
+'pageinfo-edits' => 'सà¤\82पादन à¤\95à¥\80 à¤\95à¥\81ल à¤¸à¤\82à¤\96à¥\8dया',
 'pageinfo-authors' => 'लेखकों की संख्या',
 'pageinfo-recent-edits' => 'हाल में हुए सम्पादनों की संख्या (पिछ्ले $1 में)',
 'pageinfo-magic-words' => 'जादुई {{PLURAL:$1|शब्द}} ($1)',
index c64986a..dfa3649 100644 (file)
@@ -495,7 +495,7 @@ $messages = array(
 'permalink' => 'Trajna poveznica',
 'print' => 'Ispiši',
 'view' => 'Vidi',
-'edit' => 'Uredi',
+'edit' => 'uredi',
 'create' => 'Započni',
 'editthispage' => 'Uredi ovu stranicu',
 'create-this-page' => 'Započni ovu stranicu',
index 6fb32bb..e01379c 100644 (file)
@@ -186,7 +186,7 @@ $messages = array(
 'tog-externaleditor' => 'Eksterny editor jako standard wužiwać (jenož za ekspertow, žada sej specialne nastajenja na wašim ličaku. [//www.mediawiki.org/wiki/Manual:External_editors Dalše informacije.])',
 'tog-externaldiff' => 'Eksterny diff-program jako standard wužiwać (jenož za ekspertow, žada sej specialne nastajenja na wašim ličaku. [//www.mediawiki.org/wiki/Manual:External_editors Dalše informacije.])',
 'tog-showjumplinks' => 'Wotkazy typa „dźi do” zmóžnić',
-'tog-uselivepreview' => 'Live-přehlad wužiwać (wužaduje sej JavaScript)',
+'tog-uselivepreview' => 'Live-přehlad wužiwać (wužaduje sej JavaScript) (eksperimentalny)',
 'tog-forceeditsummary' => 'Mje skedźbnić, jeli zabudu zjeće',
 'tog-watchlisthideown' => 'Moje změny we wobkedźbowankach schować',
 'tog-watchlisthidebots' => 'Změny awtomatiskich programow (botow) we wobkedźbowankach schować',
@@ -2277,9 +2277,9 @@ Hlej [[Special:ProtectedPages|lisćinu škitanych stronow]] za lisćinu tuchwilu
 'protect-locked-access' => "Nimaš trěbne prawa, zo by škit strony změnił. Tu widźiš aktualne škitne nastajenja za stronu'''„$1“:'''",
 'protect-cascadeon' => 'Tuta strona je tuchwilu škitana, dokelž je w {{PLURAL:$1|slědowacej stronje|slědowacych stronach}} zapřijata, {{PLURAL:$1|kotraž je|kotrež su}} přez kaskadowu opciju {{PLURAL:$1|škitana|škitane}}. Móžeš škitowy status strony změnić, to wšak wliw na kaskadowy škit nima.',
 'protect-default' => 'Wšěch wužiwarjow dowolić',
-'protect-fallback' => 'Prawo "$1" trěbne.',
-'protect-level-autoconfirmed' => 'Nowych a njeregistrowanych wužiwarjow blokować',
-'protect-level-sysop' => 'jenož administratorojo',
+'protect-fallback' => 'Jenož wužiwarjow z prawom "$1" dowolić',
+'protect-level-autoconfirmed' => 'Jenož awtomatisce wobkrućenych wužiwarjow dowolić',
+'protect-level-sysop' => 'Jenož administratorow dowolić',
 'protect-summary-cascade' => 'kaskadowacy',
 'protect-expiring' => 'spadnje $1 (UTC)',
 'protect-expiring-local' => 'płaćiwy hač do $1',
index 21279a1..ecbcb8a 100644 (file)
@@ -1287,7 +1287,7 @@ Győződj meg róla, hogy a laptörténet folytonossága megmarad.',
 'editundo' => 'visszavonás',
 'diff-multi' => '({{PLURAL:$2|egy|$2}} szerkesztő {{PLURAL:$1|egy|$1}} közbeeső változata nincs mutatva)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Egy közbeeső változat|$1 közbeeső változat}} nincs mutatva, amit $2 szerkesztő módosított)',
-'difference-missing-revision' => 'A(z) "{{PAGENAME}}" nevű oldal #$1 változata nem létezik.
+'difference-missing-revision' => 'A(z) "{{PAGENAME}}" nevű oldal #$1 $2 változata nem létezik.
 
 Ezt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás használata okozza. Részletek a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} törlési naplóban] találhatóak.',
 
@@ -2216,7 +2216,7 @@ Lásd még a [[Special:WantedCategories|keresett kategóriák]] listáját.',
 'linksearch-ok' => 'keresés',
 'linksearch-text' => 'Helyettesítő karaktereket is lehet használni, például "*.wikipedia.org".
 Legalább egy felső szintű tartománynak lennie kell, például "*.org"<br />
-Támogatott protokollok: <code>$1</code> (http:// az alapértelmezett, ha nincs protokoll megadva).',
+Támogatott {{PLURAL:$2|protokoll|protokollok}}: <code>$1</code> (http:// az alapértelmezett, ha nincs protokoll megadva).',
 'linksearch-line' => '$1 hivatkozva innen: $2',
 'linksearch-error' => 'Helyettesítő karakterek csak a cím elején szerepelhetnek.',
 
@@ -2456,8 +2456,8 @@ be van kapcsolva a kaszkád védelem.
 Megváltoztathatod ezen lap védelmi szintjét, de az nem lesz hatással a kaszkád védelemre.',
 'protect-default' => 'Minden szerkesztő számára engedélyezett',
 'protect-fallback' => '"$1" engedély szükséges hozzá',
-'protect-level-autoconfirmed' => 'Nem és frissen regisztrált szerkesztők blokkolása',
-'protect-level-sysop' => 'Csak adminisztrátorok',
+'protect-level-autoconfirmed' => 'Csak automatikusan ellenőrzött szerkesztőknek engedélyezett (nem vagy frissen regisztráltaknak nem)',
+'protect-level-sysop' => 'Csak adminisztrátoroknak engedélyezett',
 'protect-summary-cascade' => 'kaszkád védelem',
 'protect-expiring' => 'lejár: $1 (UTC)',
 'protect-expiring-local' => 'lejárat: $1',
index 8a011c2..fad44dd 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Amire80
+ * @author Andrijko Z.
  * @author Reedy
  * @author Sapral Mikail
  * @author Tagir
@@ -870,7 +871,7 @@ $messages = array(
 'blanknamespace' => '(Корта)',
 
 # Contributions
-'contributions' => 'Дакъалаьцархочунна къахьегам',
+'contributions' => '{{GENDER:$1|Дакъалаьцархочунна}} къахьегам',
 'contributions-title' => '$1 дакъалаьцархочунна къахьегам',
 'mycontris' => 'Са къахьегам',
 'contribsub2' => '$1 ($2) баь болх',
index ff6866c..505fa76 100644 (file)
@@ -787,9 +787,11 @@ Ol mustas ne havar plu kam $1 {{PLURAL:$1|litero|literi}}.',
 'right-browsearchive' => 'Serchar pagini efacita',
 'right-rollback' => 'Rapide retrorular la redakti da la lasta uzanto qua redaktis specigita pagino',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Uzanto-kreo-registro',
+
 # User rights log
 'rightslog' => 'Uzanto-yuri-registraro',
-'rightsnone' => '(nula)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'lektar ca pagino',
@@ -1029,9 +1031,6 @@ Volutez kontrolar <strong>[[:$1]]</strong> se vu ne esas certa pri chanjar olu.
 # Special:ActiveUsers
 'activeusers-noresult' => 'Nula uzanto trovesis.',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Uzanto-kreo-registro',
-
 # Special:ListGroupRights
 'listgrouprights-group' => 'Grupo',
 'listgrouprights-members' => '(listo di membri)',
@@ -1548,6 +1547,9 @@ Vu darfos adjuntar kauso en la rezumo.',
 'htmlform-reset' => 'Desfacar chanji',
 'htmlform-selectorother-other' => 'Altra',
 
+# New logging system
+'rightsnone' => '(nula)',
+
 # Search suggestions
 'searchsuggest-search' => 'Serchez',
 'searchsuggest-containing' => 'quan kontenas...',
index bda961a..2bf0f30 100644 (file)
@@ -304,7 +304,7 @@ $messages = array(
 'tog-externaleditor' => "Usa per default un editor di testi esterno (solo per utenti esperti, richiede l'uso di impostazioni particolari sul proprio computer. [//www.mediawiki.org/wiki/Manual:External_editors Ulteriori informazioni.])",
 'tog-externaldiff' => "Usa per default un programma di diff esterno (solo per utenti esperti, richiede l'uso di impostazioni particolari sul proprio computer. [//www.mediawiki.org/wiki/Manual:External_editors Ulteriori informazioni.])",
 'tog-showjumplinks' => 'Attiva i collegamenti accessibili "vai a"',
-'tog-uselivepreview' => "Abilita la funzione ''Live preview'' (anteprima in diretta - richiede JavaScript)",
+'tog-uselivepreview' => "Abilita la funzione ''Live preview'' (anteprima in diretta - richiede JavaScript; sperimentale)",
 'tog-forceeditsummary' => 'Chiedi conferma se il campo oggetto è vuoto',
 'tog-watchlisthideown' => 'Nascondi le mie modifiche negli osservati speciali',
 'tog-watchlisthidebots' => 'Nascondi le modifiche dei bot negli osservati speciali',
@@ -405,7 +405,7 @@ $messages = array(
 'newwindow' => '(si apre in una nuova finestra)',
 'cancel' => 'Annulla',
 'moredotdotdot' => 'Altro...',
-'morenotlisted' => 'Altro non elencato...',
+'morenotlisted' => 'Altro...',
 'mypage' => 'Pagina',
 'mytalk' => 'discussioni',
 'anontalk' => 'Discussioni per questo IP',
@@ -2397,9 +2397,9 @@ Le impostazioni correnti per la pagina sono '''$1''':",
 Le impostazioni correnti per la pagina sono '''$1''':",
 'protect-cascadeon' => 'Al momento questa pagina è bloccata perché viene inclusa {{PLURAL:$1|nella pagina indicata di seguito, per la quale|nelle pagine indicate di seguito, per le quali}} è attiva la protezione ricorsiva. È possibile modificare il livello di protezione individuale della pagina, ma le impostazioni derivanti dalla protezione ricorsiva non saranno modificate.',
 'protect-default' => 'Autorizza tutti gli utenti',
-'protect-fallback' => 'È richiesto il permesso "$1"',
-'protect-level-autoconfirmed' => 'Blocca gli utenti nuovi e i non registrati',
-'protect-level-sysop' => 'Solo amministratori',
+'protect-fallback' => 'Consentito solo agli utenti con permesso "$1"',
+'protect-level-autoconfirmed' => 'Consentito solo agli utenti "autoconfermati"',
+'protect-level-sysop' => 'Consentito solo agli amministratori',
 'protect-summary-cascade' => 'ricorsiva',
 'protect-expiring' => 'scadenza: $1 (UTC)',
 'protect-expiring-local' => 'scade il $1',
@@ -2689,7 +2689,7 @@ Ricordare di [[Special:UnlockDB|rimuovere il blocco]] dopo aver terminato le ope
 'move-page-legend' => 'Spostamento di pagina',
 'movepagetext' => "Questo modulo consente di rinominare una pagina, spostando tutta la sua cronologia al nuovo nome. La pagina attuale diverrà automaticamente un redirect al nuovo titolo. Puoi aggiornare automaticamente i redirect che puntano al titolo originale. Puoi decidere di non farlo, ma ricordati di verificare che lo spostamento non abbia creato [[Special:DoubleRedirects|doppi redirect]] o [[Special:BrokenRedirects|redirect errati]]. L'onere di garantire che i collegamenti alla pagina restino corretti spetta a chi la sposta.
 
-Si noti che la pagina '''non''' sarà spostata se ne esiste già una con il nuovo nome, a meno che non sia vuota o costituita solo da un redirect alla vecchia e sia priva di versioni precedenti. In caso di spostamento errato si può quindi tornare subito al vecchio titolo, e non è possibile sovrascrivere per errore una pagina già esistente.
+Si noti che la pagina '''non''' sarà spostata se ne esiste già una con il nuovo nome, a meno che non sia costituita solo da un redirect alla vecchia e sia priva di versioni precedenti. In caso di spostamento errato si può quindi tornare subito al vecchio titolo, e non è possibile sovrascrivere per errore una pagina già esistente.
 
 '''ATTENZIONE:'''
 Un cambiamento così drastico può creare contrattempi e problemi, soprattutto per le pagine più visitate. Accertarsi di aver valutato le conseguenze dello spostamento prima di procedere.",
@@ -3043,8 +3043,8 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 'pageinfo-recent-authors' => 'Numero di autori diversi recenti',
 'pageinfo-magic-words' => '{{PLURAL:$1|Parola magica|Parole magiche}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria nascosta|Categorie nascoste}} ($1)',
-'pageinfo-templates' => 'Template {{PLURAL:$1|incluso|inclusi}} ($1)',
-'pageinfo-transclusions' => '{{PLURAL:$1|Pagina inclusa|Pagine incluse}} su ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Template incluso}} in ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Pagina inclusa}} in ($1)',
 'pageinfo-toolboxlink' => 'Informazioni sulla pagina',
 'pageinfo-redirectsto' => 'Reindirizza a',
 'pageinfo-redirectsto-info' => 'info',
@@ -3962,6 +3962,7 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 'api-error-ok-but-empty' => 'Errore interno: nessuna risposta dal server.',
 'api-error-overwrite' => 'Sovrascrivere un file esistente non è consentito.',
 'api-error-stashfailed' => 'Errore interno: il server non è riuscito a memorizzare il documento temporaneo.',
+'api-error-publishfailed' => 'Errore interno: il server non è riuscito a pubblicare il documento temporaneo.',
 'api-error-timeout' => 'Il server non ha risposto entro il tempo previsto.',
 'api-error-unclassified' => 'Si è verificato un errore sconosciuto.',
 'api-error-unknown-code' => 'Errore sconosciuto: "$1"',
index ca0bde5..2b525a9 100644 (file)
@@ -395,7 +395,7 @@ $messages = array(
 'tog-externaleditor' => '既定で編集に外部アプリケーションを使用 (上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
 'tog-externaldiff' => '差分表示に外部アプリケーションを使用 (上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
 'tog-showjumplinks' => '利用しやすさ向上のための「{{int:jumpto}}」リンクを有効にする',
-'tog-uselivepreview' => 'ライブプレビューを使用 (JavaScriptが必要)',
+'tog-uselivepreview' => 'ライブプレビューを使用 (JavaScriptが必要) (開発中)',
 'tog-forceeditsummary' => '要約欄が空欄の場合に確認を促す',
 'tog-watchlisthideown' => 'ウォッチリストに自分の編集を表示しない',
 'tog-watchlisthidebots' => 'ウォッチリストにボットによる編集を表示しない',
@@ -496,6 +496,7 @@ $messages = array(
 'newwindow' => '(新しいウィンドウで開きます)',
 'cancel' => '中止',
 'moredotdotdot' => '続き...',
+'morenotlisted' => 'その他...',
 'mypage' => 'ページ',
 'mytalk' => 'トーク',
 'anontalk' => 'このIPアドレスのトーク',
@@ -532,7 +533,7 @@ $messages = array(
 'navigation-heading' => '案内メニュー',
 'errorpagetitle' => 'エラー',
 'returnto' => '$1 に戻る。',
-'tagline' => '提供{{SITENAME}}',
+'tagline' => '提供{{SITENAME}}',
 'help' => 'ヘルプ',
 'search' => '検索',
 'searchbutton' => '検索',
@@ -646,7 +647,7 @@ $1',
 'thisisdeleted' => '$1を閲覧または復元しますか?',
 'viewdeleted' => '$1を閲覧しますか?',
 'restorelink' => '{{PLURAL:$1|削除された$1編集}}',
-'feedlinks' => 'フィード',
+'feedlinks' => 'フィード:',
 'feed-invalid' => 'フィード形式の指定が正しくありません。',
 'feed-unavailable' => 'フィードの配信は利用できません',
 'site-rss-feed' => '$1のRSSフィード',
@@ -711,7 +712,7 @@ URL を間違って入力したか、正しくないリンクをたどった可
 'missingarticle-diff' => '(差分: $1, $2)',
 'readonly_lag' => 'データベースはスレーブのデータベースサーバーがマスターに同期するまで自動的にロックされています',
 'internalerror' => '内部エラー',
-'internalerror_info' => '内部エラー$1',
+'internalerror_info' => '内部エラー$1',
 'fileappenderrorread' => '追加中に、「$1」を読み取れませんでした。',
 'fileappenderror' => '「$1」を「$2」に追加できませんでした。',
 'filecopyerror' => 'ファイル「$1」を「$2」に複製できませんでした。',
@@ -719,9 +720,9 @@ URL を間違って入力したか、正しくないリンクをたどった可
 'filedeleteerror' => 'ファイル「$1」を削除できませんでした。',
 'directorycreateerror' => 'ディレクトリ「$1」を作成できませんでした。',
 'filenotfound' => 'ファイル「$1」が見つかりませんでした。',
-'fileexistserror' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\80\8c$1ã\80\8dã\81¸ã\81®æ\9b¸ã\81\8dè¾¼ã\81¿ã\81«å¤±æ\95\97ï¼\9aファイルが存在します。',
+'fileexistserror' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\80\8c$1ã\80\8dã\81«æ\9b¸ã\81\8dè¾¼ã\82\81ã\81¾ã\81\9bã\82\93ã\81§ã\81\97ã\81\9fファイルが存在します。',
 'unexpected' => '予期しない値「$1」=「$2」です。',
-'formerror' => 'エラーフォームを送信できませんでした。',
+'formerror' => 'エラーフォームを送信できませんでした。',
 'badarticleerror' => 'このページでは要求された操作を行えません。',
 'cannotdelete' => 'ページまたはファイル「$1」を削除できませんでした。
 他の人が既に削除した可能性があります。',
@@ -744,8 +745,8 @@ URL を間違って入力したか、正しくないリンクをたどった可
 'actionthrottledtext' => '短時間にこの操作を大量に行ったため、スパム対策として設定されている制限を超えました。
 少し時間をおいてからもう一度操作してください。',
 'protectedpagetext' => 'このページは編集や他の操作ができないように保護されています。',
-'viewsourcetext' => 'このページのソースの閲覧やコピーができます',
-'viewyourtext' => "このページへの'''あなたの編集'''のソースの閲覧やコピーができます",
+'viewsourcetext' => 'このページのソースの閲覧やコピーができます:',
+'viewyourtext' => "このページへの'''あなたの編集'''のソースの閲覧やコピーができます:",
 'protectedinterface' => 'このページにはこのウィキのソフトウェアのインターフェイスに使用されるテキストが保存されており、いたずらなどの防止のために保護されています。
 すべてのウィキに対して翻訳を追加/変更する場合は、MediaWiki の地域化プロジェクト [//translatewiki.net/ translatewiki.net] を使用してください。',
 'editinginterface' => "'''警告:''' ソフトウェアのインターフェイスに使用されるテキストのページを編集しています。
@@ -769,9 +770,9 @@ $2',
 'exception-nologin-text' => 'このページまたは操作には、このウィキへのログインが必要です。',
 
 # Virus scanner
-'virus-badscanner' => "環境設定が不適合です:不明なウイルス検知ソフトウェア:''$1''",
+'virus-badscanner' => "環境設定が不適合です: 不明なウイルス対策ソフトウェア: ''$1''",
 'virus-scanfailed' => 'スキャンに失敗しました(コード $1)',
-'virus-unknownscanner' => '不明なウイルス対策',
+'virus-unknownscanner' => '不明なウイルス対策ソフトウェア:',
 
 # Login and logout pages
 'logouttext' => "'''ログアウトしました。'''
@@ -804,7 +805,7 @@ $2',
 'gotaccountlink' => 'ログインしてください',
 'userlogin-resetlink' => 'ログイン情報をお忘れですか?',
 'createaccountmail' => 'メールで送信',
-'createaccountreason' => '理由',
+'createaccountreason' => '理由:',
 'badretype' => '入力したパスワードが一致しません。',
 'userexists' => '入力された利用者名は既に使用されています。
 他の名前を選んでください。',
@@ -855,7 +856,7 @@ Cookieを有効にしていることを確認して、このページを再読
 メールに記載された手順に従って、このアカウントの所有者であることの確認が取れると、このアカウント宛のメールを受け取れるようになります。',
 'throttled-mailpassword' => '新しいパスワードは過去 {{PLURAL:$1|$1 時間}}に送信済みです。
 悪用防止のため、パスワードの再発行は {{PLURAL:$1|$1 時間}}に 1 回のみです。',
-'mailerror' => 'ã\83¡ã\83¼ã\83«ã\81®é\80\81信中ã\81«ã\82¨ã\83©ã\83¼ã\81\8cç\99ºç\94\9fã\81\97ã\81¾ã\81\97ã\81\9fï¼\9a$1',
+'mailerror' => 'ã\83¡ã\83¼ã\83«ã\82\92é\80\81ä¿¡ã\81\99ã\82\8bé\9a\9bã\81«ã\82¨ã\83©ã\83¼ã\81\8cç\99ºç\94\9fã\81\97ã\81¾ã\81\97ã\81\9f$1',
 'acct_creation_throttle_hit' => 'あなたと同じ IP アドレスでこのウィキに訪れた人が、最近 24 時間で {{PLURAL:$1|$1 アカウント}}を作成しており、これはこの期間で作成が許可されている最大数です。
 そのため、現在この IP アドレスではアカウントをこれ以上作成できません。',
 'emailauthenticated' => 'メールアドレスは$2 $3に認証済みです。',
@@ -941,8 +942,8 @@ $2
 この申請が他の誰かによるものの場合、あるいはあなたが自分の元のパスワードを
 覚えていて、変更したくない場合は、このメッセージを無視して
 以前のパスワードを使い続けることができます。',
-'passwordreset-emailelement' => '利用者名$1
-仮パスワード$2',
+'passwordreset-emailelement' => '利用者名$1
+仮パスワード$2',
 'passwordreset-emailsent' => '確認メールをお送りしました。',
 'passwordreset-emailsent-capture' => '下記の内容の、確認メールをお送りしました。',
 'passwordreset-emailerror-capture' => '以下の内容の確認メールを生成しましたが、利用者への送信に失敗しました: $1',
@@ -967,7 +968,7 @@ $2
 'link_sample' => 'リンクの名前',
 'link_tip' => '内部リンク',
 'extlink_sample' => 'http://www.example.com リンクの名前',
-'extlink_tip' => '外部リンク(http:// を忘れずに付けてください)',
+'extlink_tip' => '外部リンク (http:// を忘れずに付けてください)',
 'headline_sample' => '見出し文',
 'headline_tip' => '2段目の見出し',
 'nowiki_sample' => 'ここにマークアップを無効にするテキストを入力します',
@@ -1915,7 +1916,7 @@ file_uploadsの設定を確認してください。',
 'sourceurl' => 'アップロード元の URL:',
 'destfilename' => '登録するファイル名:',
 'upload-maxfilesize' => 'ファイルの最大サイズ: $1',
-'upload-description' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\81®èª¬æ\98\8e',
+'upload-description' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\81®è§£èª¬',
 'upload-options' => 'アップロードのオプション',
 'watchthisupload' => 'このファイルをウォッチ',
 'filewasdeleted' => 'この名前のファイルは一度アップロードされ、その後削除されています。
@@ -2609,9 +2610,9 @@ $2による直前の版へ変更されました。',
 'protect-cascadeon' => 'このページは現在、カスケード保護が有効になっている以下の{{PLURAL:$1|ページ|ページ群}}から読み込まれているため、保護されています。
 このページの保護レベルを変更できますが、カスケード保護には影響しません。',
 'protect-default' => 'すべての利用者を許可',
-'protect-fallback' => 'ã\80\8c$1ã\80\8d権é\99\90ã\81\8cå¿\85è¦\81',
-'protect-level-autoconfirmed' => '新規利用者と匿名利用者を禁止',
-'protect-level-sysop' => '管理者のみ',
+'protect-fallback' => 'ã\80\8c$1ã\80\8d権é\99\90ã\82\92æ\8c\81ã\81¤å\88©ç\94¨è\80\85ã\81®ã\81¿ã\81«è¨±å\8f¯',
+'protect-level-autoconfirmed' => '自動承認された利用者のみに許可',
+'protect-level-sysop' => '管理者のみに許可',
 'protect-summary-desc' => '[$1=$2] ($3)',
 'protect-summary-cascade' => 'カスケード',
 'protect-expiring' => '$1(UTC)で自動的に解除',
@@ -2917,11 +2918,11 @@ $1 のブロックの理由は「''$2''」です。",
 'move-page-legend' => 'ページの移動',
 'movepagetext' => "下のフォームを使用すると、ページ名を変更でき、そのページの履歴も変更先に移動できます。
 移動元のページは移動先への転送ページになります。
-移動元のページへのリダイレクトを自動的に修正できます。
-[[Special:DoubleRedirects|二重リダイレクト]]や[[Special:BrokenRedirects|迷子のリダイレクト]]を確認する必要があります。
+移動元のページへの転送ページを自動的に修正できます。
+[[Special:DoubleRedirects|二重転送]]や[[Special:BrokenRedirects|迷子のリダイレクト]]を確認する必要があります。
 リンクを正しく維持するのは移動した人の責任です。
 
-移動先が既に存在する場合は、そのページが空またはリダイレクトで、かつ過去の版を持たない場合を除いて移動'''できません'''。つまり、間違えてページ名を変更した場合には元に戻せます。また移動によって既存のページを上書きしてしまうことはありません。
+移動先が既に存在する場合は、そのページが転送ページであり、かつ過去の版を持たない場合を除いて移動'''できません'''。つまり、間違えてページ名を変更した場合には元に戻せます。また移動によって既存のページを上書きしてしまうことはありません。
 
 '''注意!'''
 よく閲覧されるページや、他の多くのページからリンクされているページを移動すると予期しない結果が起こるかもしれません。ページの移動に伴う影響をよく考えてから踏み切るようにしてください。",
@@ -2930,7 +2931,7 @@ $1 のブロックの理由は「''$2''」です。",
 自動的な修正を選択しない場合は、[[Special:DoubleRedirects|二重転送]]や[[Special:BrokenRedirects|迷子のリダイレクト]]を確認する必要があります。
 つながるべき場所にリンクがつながるよう維持するのは移動した人の責任です。
 
-移動先が既に存在する場合は、そのページが空または転送ページで、かつ過去の版を持たない場合を除いて移動'''できません'''。
+移動先が既に存在する場合は、そのページが転送ページであり、かつ過去の版を持たない場合を除いて移動'''できません'''。
 つまり、間違えてページ名を変更した場合には元に戻せます。また移動によって既存のページを上書きしてしまうことはありません。
 
 '''警告!'''
@@ -3289,8 +3290,8 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 'pageinfo-recent-authors' => '最近の投稿者数',
 'pageinfo-magic-words' => 'マジック {{PLURAL:$1|ワード}} ($1)',
 'pageinfo-hidden-categories' => '隠し{{PLURAL:$1|カテゴリ}} ($1)',
-'pageinfo-templates' => '参照読み込みされている{{PLURAL:$1|テンプレート}} ($1)',
-'pageinfo-transclusions' => '参照読み込みされている{{PLURAL:$1|ページ}} ($1)',
+'pageinfo-templates' => 'このページが参照読み込みしている{{PLURAL:$1|テンプレート}} ($1)',
+'pageinfo-transclusions' => 'このページを参照読み込みしている{{PLURAL:$1|ページ}} ($1)',
 'pageinfo-toolboxlink' => 'ページ情報',
 'pageinfo-redirectsto' => '転送先',
 'pageinfo-redirectsto-info' => '情報',
@@ -4307,9 +4308,9 @@ MediaWikiは、有用であることを期待して配布されていますが
 'feedback-cancel' => 'キャンセル',
 'feedback-submit' => 'フィードバックを送信',
 'feedback-adding' => 'ページへのフィードバックの追加...',
-'feedback-error1' => 'エラー:APIから認識されない結果が返ってきました',
-'feedback-error2' => 'エラー編集に失敗しました',
-'feedback-error3' => 'エラー:APIからの応答がありません',
+'feedback-error1' => 'エラー: 認識できない結果を API が返しました',
+'feedback-error2' => 'エラー編集に失敗しました',
+'feedback-error3' => 'エラー: API からの応答がありません',
 'feedback-thanks' => 'ありがとうございます。フィードバックを「[$2 $1]」のページに投稿しました。',
 'feedback-close' => '完了',
 'feedback-bugcheck' => 'Great! [$1 既出のバグ]に既に含まれていないかご確認ください。',
@@ -4321,7 +4322,7 @@ MediaWikiは、有用であることを期待して配布されていますが
 
 # API errors
 'api-error-badaccess-groups' => 'このウィキへのファイルのアップロードが許可されていません。',
-'api-error-badtoken' => '内部エラートークンが正しくありません。',
+'api-error-badtoken' => '内部エラートークンが正しくありません。',
 'api-error-copyuploaddisabled' => 'URLによるアップロードはこのサーバーでは無効になっています。',
 'api-error-duplicate' => '当ウェブサイト上には、既に同じ内容の{{PLURAL:$1|[$2 他のファイル]が|[$2 他のファイルがいくつか]}}存在しています。',
 'api-error-duplicate-archive' => 'サイト上に同じ内容の{{PLURAL:$1|[$2 別のファイル]が|[$2 他のファイルがいくつか]}}既にありましたが、{{PLURAL:$1|それは|それらは}}削除されました。',
@@ -4329,7 +4330,7 @@ MediaWikiは、有用であることを期待して配布されていますが
 'api-error-duplicate-popup-title' => '重複した{{PLURAL:$1|ファイル|ファイル群}}です。',
 'api-error-empty-file' => '送信されたファイルは空でした。',
 'api-error-emptypage' => '内容がないページの新規作成は許可されていません。',
-'api-error-fetchfileerror' => '内部エラー:ファイルの取得中に問題が発生しました。',
+'api-error-fetchfileerror' => '内部エラー: ファイルを取得する際に問題が発生しました。',
 'api-error-fileexists-forbidden' => '「$1」という名前のファイルは存在しており、上書きはできません。',
 'api-error-fileexists-shared-forbidden' => '「$1」という名前のファイルは共有ファイルリポジトリに存在しており、上書きはできません。',
 'api-error-file-too-large' => '送信されたファイルは大きすぎます。',
@@ -4338,23 +4339,23 @@ MediaWikiは、有用であることを期待して配布されていますが
 'api-error-filetype-banned-type' => '$1{{PLURAL:$4|は許可されていないファイル形式です}}。許可されている{{PLURAL:$3|ファイル形式}}は$2です。',
 'api-error-filetype-missing' => 'ファイルに拡張子がありません。',
 'api-error-hookaborted' => '拡張機能のフックによって、修正が中断されました。',
-'api-error-http' => '内部エラー:サービスへの接続で問題が発生しました。',
+'api-error-http' => '内部エラー: サーバーに接続できませんでした。',
 'api-error-illegal-filename' => 'ファイル名が許可されていません。',
-'api-error-internal-error' => '内部エラーウィキ上でアップロードを処理する際に問題が発生しました。',
-'api-error-invalid-file-key' => '内部エラー一時格納場所にファイルが見つかりませんでした。',
-'api-error-missingparam' => '内部エラーリクエストのパラメーターが足りません。',
-'api-error-missingresult' => '内部エラー:複製に成功したか判断できませんでした。',
+'api-error-internal-error' => '内部エラーウィキ上でアップロードを処理する際に問題が発生しました。',
+'api-error-invalid-file-key' => '内部エラー一時格納場所にファイルが見つかりませんでした。',
+'api-error-missingparam' => '内部エラーリクエストのパラメーターが足りません。',
+'api-error-missingresult' => '内部エラー: 複製に成功したかどうか判断できませんでした。',
 'api-error-mustbeloggedin' => 'ファイルをアップロードするにはログインする必要があります。',
-'api-error-mustbeposted' => '内部エラー:リクエストはHTTP POSTである必要があります。',
+'api-error-mustbeposted' => '内部エラー: リクエストは HTTP の POST メソッドである必要があります。',
 'api-error-noimageinfo' => 'アップロードには成功しましたが、サーバーはファイルに関する情報を返しませんでした。',
-'api-error-nomodule' => '内部エラーアップロードを処理するモジュールが設定されていません。',
-'api-error-ok-but-empty' => '内部エラーサーバーからの応答がありません。',
+'api-error-nomodule' => '内部エラーアップロードを処理するモジュールが設定されていません。',
+'api-error-ok-but-empty' => '内部エラーサーバーからの応答がありません。',
 'api-error-overwrite' => '既存のファイルへの上書きは許可されていません。',
-'api-error-stashfailed' => '内部エラーサーバーは一時ファイルを格納できませんでした。',
+'api-error-stashfailed' => '内部エラーサーバーは一時ファイルを格納できませんでした。',
 'api-error-timeout' => 'サーバーが決められた時間内に応答しませんでした。',
 'api-error-unclassified' => '不明なエラーが発生しました。',
 'api-error-unknown-code' => '不明なエラー:「$1」',
-'api-error-unknown-error' => '内部エラー:ファイルのアップロードの途中で問題が発生しました。',
+'api-error-unknown-error' => '内部エラー: ファイルをアップロードする際に問題が発生しました。',
 'api-error-unknown-warning' => '不明な警告:「$1」',
 'api-error-unknownerror' => '不明なエラー:「$1」',
 'api-error-uploaddisabled' => 'このウィキではアップロードは無効になっています。',
index 240391a..4f673ff 100644 (file)
@@ -303,6 +303,7 @@ $messages = array(
 'newwindow' => '(ახალ ფანჯარაში)',
 'cancel' => 'გაუქმება',
 'moredotdotdot' => 'ვრცლად...',
+'morenotlisted' => 'მეტი არ არის ნაჩვენები...',
 'mypage' => 'გვერდი',
 'mytalk' => 'განხილვა',
 'anontalk' => 'ამ IP-ს განხილვა',
@@ -2356,7 +2357,7 @@ $UNWATCHURL
 'protect-cascadeon' => 'ეს გვერდი ამჟამად დაცულია, ვინაიდან იგი ნაწილია ამ {{PLURAL:$1|გვერდის, რომელსაც|გვერდების, რომელთაც}} კასკადური დაცვა აქვს ჩართული.
 თქვენ შეგიძლიათ ამ გვერდის დაცვის დონე შეცვალოთ, თუმცა ეს კასკადურ დაცვაზე გავლენას არ იქონიებს.',
 'protect-default' => 'ყველა მომხმარებელი',
-'protect-fallback' => 'á\83¡á\83\90á\83­á\83\98á\83 á\83\9dá\83\90 â\80\9e$1-á\83\98á\83¡â\80\9c á\83£á\83¤á\83\9aá\83\94á\83\91á\83\90',
+'protect-fallback' => 'á\83®á\83\94á\83\9aá\83\9bá\83\98á\83¡á\83\90á\83¬á\83\95á\83\93á\83\9dá\83\9bá\83\98á\83\90 á\83\9bá\83®á\83\9dá\83\9aá\83\9dá\83\93 â\80\9e$1-á\83\98á\83¡â\80\9c á\83£á\83¤á\83\9aá\83\94á\83\91á\83\98á\83¡ á\83\9bá\83¥á\83\9dá\83\9cá\83\94 á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\9aá\83\94á\83\91á\83\98á\83¡á\83\90á\83\97á\83\95á\83\98á\83¡',
 'protect-level-autoconfirmed' => 'ახალი და არარეგისტრირებული მომხმარებლებისაგან დაცვა',
 'protect-level-sysop' => 'მხოლოდ ადმინისტრატორები',
 'protect-summary-cascade' => 'იერარქიული',
@@ -2955,8 +2956,8 @@ $1',
 
 # Spam protection
 'spamprotectiontitle' => 'სპამ-ფილტრი',
-'spamprotectiontext' => 'á\83\92á\83\95á\83\94á\83 á\83\93á\83\98, á\83 á\83\9dá\83\9bá\83\9aá\83\98á\83¡ á\83¨á\83\94á\83\9cá\83\90á\83®á\83\95á\83\90á\83¡á\83\90á\83ª á\83ªá\83\93á\83\98á\83\9aá\83\9dá\83\91á\83\97 á\83\93á\83\90á\83\91á\83\9aá\83\9dá\83\99á\83\98á\83\9aá\83\98á\83\90 á\83¡á\83\9eá\83\90á\83\9b\83¤á\83\9aá\83\98ტრით.
\83¡á\83\90á\83\95á\83\90á\83 á\83\90á\83£á\83\93á\83\9dá\83\93, á\83\97á\83¥á\83\95á\83\94á\83\9cá\83¡ á\83\9bá\83\98á\83\94á\83  á\83©ამატებული ვებ-გვერდის მისამართი შავ სიაშია.',
+'spamprotectiontext' => 'á\83\98á\83\9cá\83¢á\83\94á\83 á\83\9cá\83\94á\83¢-á\83 á\83\94á\83¡á\83£á\83 á\83¡á\83\98, á\83 á\83\9dá\83\9bá\83\9aá\83\98á\83¡ á\83¨á\83\94á\83\9cá\83\90á\83®á\83\95á\83\90á\83¡á\83\90á\83ª á\83ªá\83\93á\83\98á\83\9aá\83\9dá\83\91á\83\97, á\83\93á\83\90á\83\91á\83\9aá\83\9dá\83\99á\83\98á\83\9aá\83\98á\83\90 á\83¡á\83\9eá\83\90á\83\9b\83¤á\83\98á\83\9aტრით.
\83¡á\83\90á\83\95á\83\90á\83 á\83\90á\83£á\83\93á\83\9dá\83\93, á\83\97á\83¥á\83\95á\83\94á\83\9cá\83¡ á\83\9bá\83\98á\83\94á\83  á\83\93ამატებული ვებ-გვერდის მისამართი შავ სიაშია.',
 'spamprotectionmatch' => 'მომდევნო ტექსტი იყო სპამ-ფილტრის ჩართვის მიზეზი: $1',
 'spambot_username' => 'სპამის გასუფთავება',
 'spam_reverting' => 'დაბრუნება ბოლო ვერსიასთან, რომელიც არ შეიცავს ბმულს $1-თან',
index 0470242..6bb3162 100644 (file)
@@ -141,6 +141,7 @@ $messages = array(
 'index-category' => 'نو انڈیکس صفحات',
 'noindex-category' => 'نو انڈیکس صفحات',
 'broken-file-category' => 'نس پھت صفحات',
+'categoryviewer-pagedlinks' => '($1) ($2)',
 
 'about' => 'تعارف',
 'article' => 'صفحۂ مشمول',
@@ -269,6 +270,7 @@ $1',
 [[Special:Version|version page]]',
 
 'ok' => 'ٹھیک شیر',
+'pagetitle' => '$1 - {{SITENAME}}',
 'pagetitle-view-mainpage' => '{{SITENAME}}',
 'retrievedfrom' => '‘‘$1’’ نقل کاردو',
 'youhavenewmessages' => 'تہ بچے ای $1 شیر۔ ($2)',
@@ -276,6 +278,7 @@ $1',
 'newmessagesdifflink' => 'تـجـدیـد مـاقـبل آخـراری فـرق',
 'youhavenewmessagesmulti' => 'ء$1 تہ بچے نوغ نوغ پیغامات شینی',
 'editsection' => 'ترمیم',
+'editsection-brackets' => '[$1]',
 'editold' => 'ترمیم',
 'viewsourceold' => 'مآخذو لوڑے',
 'editlink' => 'تدوین کورے',
@@ -293,6 +296,8 @@ $1',
 'site-atom-feed' => '$1 اٹوم فیڈ',
 'page-rss-feed' => '$1 آر ایس ایس فیڈ',
 'page-atom-feed' => '$1 آٹوم فیڈ',
+'feed-atom' => 'اٹوم',
+'feed-rss' => 'آر ایس ایس',
 'red-link-title' => '
 $1 (صفحہ موجود نیکی)',
 
@@ -606,6 +611,9 @@ MySQL جوابِ خطاء پرائے "$3: $4"',
 'revdel-restore-deleted' => 'حذف شدہ رویژنز',
 'revdel-restore-visible' => 'ویزیبل رویژنز',
 
+# History merging
+'mergehistory-revisionrow' => '$1 ($2) $3 . . $4 $5 $6',
+
 # Merge log
 'revertmerge' => 'غیر ضم',
 
@@ -672,6 +680,7 @@ MySQL جوابِ خطاء پرائے "$3: $4"',
 'username' => 'ممبارو نم',
 'uid' => 'ممبارو لمبار:',
 'prefs-memberingroups' => '{{PLURAL:$1|گروہ|گروہاں}} رُکن:',
+'prefs-registration-date-time' => '$1',
 'yourrealname' => '* اصلی نم',
 'yournick' => 'دسخط',
 'badsig' => "ناقص خام دسخط.
index cd89fab..f63ef54 100644 (file)
@@ -990,7 +990,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'watchthisupload' => 'Na dosya de şêr ke',
 
 'license' => 'Lisans:',
-'license-header' => 'Lisanskerdene',
+'license-header' => 'Lisansdais',
 
 # Special:ListFiles
 'imgfile' => 'dosya',
@@ -1008,7 +1008,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'filehist' => 'Tarixê dosya',
 'filehist-help' => "Serba diyaena viartê dosya tarixê ke qısımê tarix/zeman'i derê inu bıteqne.",
 'filehist-deleteall' => 'Pêrune bıestere',
-'filehist-deleteone' => 'bıestere',
+'filehist-deleteone' => 'bestere',
 'filehist-revert' => 'raçarne',
 'filehist-current' => 'nıkaên',
 'filehist-datetime' => 'Tarix/Dem',
@@ -1039,7 +1039,7 @@ Cêr [$2 pela arezekerdena dosya de] arezekerdene asnina.',
 'filedelete' => 'Bıestere $1',
 'filedelete-legend' => 'Dosya bıestere',
 'filedelete-comment' => 'Sebeb:',
-'filedelete-submit' => 'Bıestere',
+'filedelete-submit' => 'Bestere',
 'filedelete-otherreason' => 'Sebebo bin/ilaweki:',
 'filedelete-reason-otherlist' => 'Sebebo bin',
 'filedelete-edit-reasonlist' => 'Sebebunê esterıtene bıvurne',
@@ -1063,7 +1063,7 @@ Cêr [$2 pela arezekerdena dosya de] arezekerdene asnina.',
 'disambiguationspage' => 'Template:vuriyaisê maney',
 
 'brokenredirects-edit' => 'bıvurne',
-'brokenredirects-delete' => 'bıestere',
+'brokenredirects-delete' => 'bestere',
 
 'withoutinterwiki-legend' => 'Verbend',
 'withoutinterwiki-submit' => 'Bıasne',
@@ -1169,7 +1169,7 @@ Nara dıme, vurnaisê na pele u pela hurênaisê dawa alaqedare ita bena lista,
 
 # Delete
 'deletepage' => 'Pele bıestere',
-'delete-legend' => 'Bıestere',
+'delete-legend' => 'Bestere',
 'confirmdeletetext' => 'Tı hawo kena ke jü pele be tarixê dae pêro bıne ra bıesterê.
 Eke ferqê neticê na kerdene de bena u no kar be gorê [[{{MediaWiki:Policy-url}}|qeydunê esterıtene]] beno, wa gurêy tesdiq ke.',
 'actioncomplete' => 'Kar bi temam',
index 2d6b319..b6d30c2 100644 (file)
@@ -377,7 +377,7 @@ $messages = array(
 'tog-externaleditor' => '바깥 편집기를 기본 편집기로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요. [//www.mediawiki.org/wiki/Manual:External_editors 자세한 정보 보기])',
 'tog-externaldiff' => '바깥 비교 도구를 기본 도구로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요. [//www.mediawiki.org/wiki/Manual:External_editors 자세한 설명 보기])',
 'tog-showjumplinks' => '접근성을 위한 "이동" 링크 쓰기 (일부 스킨에서만 작동)',
-'tog-uselivepreview' => '실시간 미리 보기 사용하기 (자바스크립트 필요)',
+'tog-uselivepreview' => '실시간 미리 보기 사용하기 (자바스크립트 필요) (시험 기능)',
 'tog-forceeditsummary' => '편집 요약을 쓰지 않았을 때 알려주기',
 'tog-watchlisthideown' => '주시문서 목록에서 내 편집을 숨기기',
 'tog-watchlisthidebots' => '주시문서 목록에서 봇 편집을 숨기기',
@@ -809,10 +809,10 @@ $2',
 철자가 맞는지 확인하세요.',
 'nouserspecified' => '사용자 이름을 입력하지 않았습니다.',
 'login-userblocked' => '이 사용자는 차단되었습니다. 로그인할 수 없습니다.',
-'wrongpassword' => '입력한 비밀번호가 다릅니다.
\8b¤ì\8b\9c ì\8b\9cë\8f\84í\95´ ì£¼세요.',
+'wrongpassword' => '입력한 비밀번호가 잘못되었습니다.
\8b¤ì\8b\9c ì\8b\9cë\8f\84í\95\98세요.',
 'wrongpasswordempty' => '비밀번호를 입력하지 않았습니다.
\8b¤ì\8b\9c ì\8b\9cë\8f\84í\95´ ì£¼세요.',
\8b¤ì\8b\9c ì\8b\9cë\8f\84í\95\98세요.',
 'passwordtooshort' => '비밀번호는 $1 문자 이상이어야 합니다.',
 'password-name-match' => '비밀번호는 사용자 이름과 반드시 달라야 합니다.',
 'password-login-forbidden' => '이 사용자 이름과 비밀번호는 사용할 수 없습니다.',
@@ -1424,7 +1424,7 @@ $1",
 'powersearch-field' => '찾기',
 'powersearch-togglelabel' => '확인:',
 'powersearch-toggleall' => '모두 선택',
-'powersearch-togglenone' => '모두 선택하지 않음',
+'powersearch-togglenone' => '음',
 'search-external' => '바깥 찾기',
 'searchdisabled' => '{{SITENAME}} 찾기 기능이 비활성화되어 있습니다.
 기능이 작동하지 않는 동안에는 구글(Google)을 이용해 찾을 수 있습니다.
@@ -1499,7 +1499,7 @@ $1",
 'timezoneregion-arctic' => '북극',
 'timezoneregion-asia' => '아시아',
 'timezoneregion-atlantic' => '대서양',
-'timezoneregion-australia' => '오스트레일리아',
+'timezoneregion-australia' => '호주',
 'timezoneregion-europe' => '유럽',
 'timezoneregion-indian' => '인도양',
 'timezoneregion-pacific' => '태평양',
@@ -2568,9 +2568,9 @@ $UNWATCHURL
 'protect-cascadeon' => '다음 {{PLURAL:$1|문서}}에 연쇄적 보호가 작동하고 있어 그 문서에 속한 이 문서도 현재 보호됩니다.
 사용자는 이 문서의 보호 설정을 바꾸실 수 있지만 연쇄적 보호에는 영향을 주지 않습니다.',
 'protect-default' => '모든 사용자에게 허용',
-'protect-fallback' => '"$1" 권한 필요',
-'protect-level-autoconfirmed' => '등록된 사용자만 가능',
-'protect-level-sysop' => '관리자만 가능',
+'protect-fallback' => '"$1" 권한의 사용자만 허용',
+'protect-level-autoconfirmed' => '자동 인증된 사용자만 허용',
+'protect-level-sysop' => '관리자만 허용',
 'protect-summary-cascade' => '연쇄적',
 'protect-expiring' => '$1 (UTC)에 만료',
 'protect-expiring-local' => '$1에 해제',
@@ -2879,7 +2879,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 만약 이 설정을 선택하지 않았다면 [[Special:DoubleRedirects|이중 넘겨주기]]와 [[Special:BrokenRedirects|끊긴 넘겨주기]]가 있는지 확인해주세요.
 넘겨주기 링크가 제대로 향하고 있는지 확인하여야 합니다.
 
-참고ë¡\9c ì\83\88 ì \9c목ì\9c¼ë¡\9c ë\90\9c ë¬¸ì\84\9cê°\80 ì\9d´ë¯¸ ì\9e\88ì\9d\84 ë\95\8c, ë¹\84ì\96´ ì\9e\88ê±°ë\82\98 ë\84\98겨주기 ë¬¸ì\84\9cì\9d´ê³  ë¬¸ì\84\9c ì\97­ì\82¬ê°\80 ì\97\86ì\9d\84 ë\95\8cì\97\90ë§\8c ì\9d´ë\8f\99í\95\98ë©° ê·¸ë \87ì§\80 ì\95\8aì\9d\84 ê²½ì\9a°ì\97\90ë\8a\94 ì\9d´ë\8f\99í\95\98ì§\80 '''ì\95\8aì\8aµë\8b\88ë\8b¤'''.
+참고로 새 제목으로 된 문서가 이미 있을 때, 넘겨주기 문서이고 문서 역사가 없을 때에만 이동하며 그렇지 않을 경우에는 이동하지 '''않습니다'''.
 실수로 문서를 옮겼을 때 되돌릴 수는 있지만 이미 있는 문서를 덮어쓸 수 없음을 의미합니다.
 
 '''경고!'''
@@ -3543,7 +3543,7 @@ Variants for Chinese language
 'exif-lens' => '사용된 렌즈',
 'exif-serialnumber' => '카메라 일련 번호',
 'exif-cameraownername' => '카메라 소유자',
-'exif-label' => 'ë\9d¼ë²¨',
+'exif-label' => 'ë \88ì\9d´ë¸\94',
 'exif-datetimemetadata' => '메타데이터 최종 수정일',
 'exif-nickname' => '그림의 비공식적 이름',
 'exif-rating' => '평가 (5점 만점)',
@@ -4184,6 +4184,7 @@ $5
 'api-error-ok-but-empty' => '내부 오류: 서버에서 응답이 없습니다.',
 'api-error-overwrite' => '이미 있는 파일을 덮어쓸 수 없습니다.',
 'api-error-stashfailed' => '내부 오류: 서버가 임시 파일을 저장하지 못했습니다.',
+'api-error-publishfailed' => '내부 오류: 서버가 임시 파일을 게시하지 못했습니다.',
 'api-error-timeout' => '서버가 제 시간 내에 응답하지 않았습니다.',
 'api-error-unclassified' => '알 수 없는 오류가 발생했습니다.',
 'api-error-unknown-code' => '알 수 없는 오류: "$1".',
index 833cdf9..6dd4651 100644 (file)
@@ -385,6 +385,9 @@ $messages = array(
 
 'grouppage-sysop' => '{{ns:project}}:Веськöтлiссез',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Уджкерисьö гижöтчан журнал',
+
 # User rights log
 'rightslog' => 'Уджкерисьлö позяннэз сьöртi журнал',
 
@@ -489,9 +492,6 @@ $messages = array(
 # Special:LinkSearch
 'linksearch' => 'Вики сайöдз ыстöттэз',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Уджкерисьö гижöтчан журнал',
-
 # Special:ListGroupRights
 'listgrouprights-members' => '(уджкериссезлöн нимлёдз)',
 
index d2aeef2..1daf7bf 100644 (file)
@@ -243,7 +243,7 @@ $messages = array(
 'tog-externaleditor' => 'Nemm jedes Mol en extern Editor-Projramm (Doför bruchs de extra Enstellunge op Dingem Kompjutor. Dat es jet för Fachlück. Doh kanns De [//www.mediawiki.org/wiki/Manual:External_editors mieh drövver lässe])',
 'tog-externaldiff' => 'Nemm jedes Mol en extern Diff-Projramm (Doför bruchs de extra Enstellunge op Dingem Kompjutor. Dat es jet för Fachlück. Doh kanns De [//www.mediawiki.org/wiki/Manual:External_editors mieh drövver lässe])',
 'tog-showjumplinks' => '„Jangk-noh“-Links usjevve, die bei em „Zojang ohne Barrikad“ helfe dun',
-'tog-uselivepreview' => 'Dun de „Lebendije Vör-Aansich“ zeije (em Usprobierstadium, un bruch Java_Skripp)',
+'tog-uselivepreview' => 'Dun de „Lebendije Vör-Aansich“ zeije (bruch Java_Skripp)',
 'tog-forceeditsummary' => 'Froch noh, wann en däm Feld „Koot zosammejefass, Quell“ beim Avspeichere nix dren steiht',
 'tog-watchlisthideown' => 'Dun ming eije Änderunge <strong>nit</strong> en minger Oppassliss aanzeije',
 'tog-watchlisthidebots' => 'Dun jedes Mol dä Bots ehr Änderunge <strong>nit</strong> en minger Oppassliss zeije',
index 7e5038d..89bc6c9 100644 (file)
@@ -134,7 +134,7 @@ $messages = array(
 'tog-externaleditor' => 'Edîtorekî derve bike "standard" (ji yên bi ezmûn re, tercîhên taybet di komputerê de hewce ne)',
 'tog-externaldiff' => 'Birnemijekî derve biguherîne "standard" (ji yên bi ezmûn re, tercîhên taybet di komputerê de hewce ne)',
 'tog-showjumplinks' => 'Girêdanên "Here-berve" qebûlbike',
-'tog-uselivepreview' => 'Pêşdîtinê "zindî" bikarbîne (JavaScript pêwîst e) (ceribandinî)',
+'tog-uselivepreview' => 'Pêşdîtina "zindî" bi kar bîne (JavaScript pêwîst e) (ceribandinî)',
 'tog-forceeditsummary' => 'Hinga kurteyeke vala hate tomarkirin min agahdar bike',
 'tog-watchlisthideown' => 'Guherandinên min ji lîsteya şopandinê veşêre',
 'tog-watchlisthidebots' => "Guherandinên bot'an ji lîsteya şopandinê veşêre",
index 49e5d42..8a78f9c 100644 (file)
@@ -762,6 +762,9 @@ Nyns yw disqwedhys agas trigva ebost pan wrella devnydhyoryon erel kestava dhywg
 'right-upload' => 'Ughcarga restrennow',
 'right-delete' => 'Dilea folennow',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Covnoten formya acontow devnydhyer',
+
 # User rights log
 'rightslog' => 'Covnoten wiryow an devnydhyer',
 
@@ -954,9 +957,6 @@ Yma'n descrifans war y [$2 folen dhescrifans] disqwedhys a-woles.",
 # Special:ListUsers
 'listusers-submit' => 'Disqwedhes',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Covnoten formya acontow devnydhyer',
-
 # Special:ListGroupRights
 'listgrouprights-members' => '(rol esely)',
 
index e9eca2a..a5f9dd7 100644 (file)
@@ -190,7 +190,7 @@ $messages = array(
 'tog-externaleditor' => 'Utere editore externo semper (pro peritus solo, requirat speciales optiones in calculone. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-externaldiff' => 'Utere editore dissimilitudine externa semper (pro peritus solo, requirat speciales optiones in calculone. [//www.mediawiki.org/wiki/Manial:External_editors More information.])',
 'tog-showjumplinks' => 'Sinere nexus ostendi forma "salire ad" monstrata',
-'tog-uselivepreview' => 'Praevisum viventem adhibere (JavaScript necesse est)',
+'tog-uselivepreview' => 'Praevisum viventem adhibere (JavaScript)',
 'tog-forceeditsummary' => 'Si recensionem non summatim descripsero, me roga si continuare velim',
 'tog-watchlisthideown' => 'Celare recensiones meas in paginarum custoditarum indice',
 'tog-watchlisthidebots' => 'Celare recensiones automatarias in paginarum custoditarum indice',
@@ -1583,9 +1583,9 @@ ad emendationem proximam ab $2.',
 Ecce protectiones paginae '''$1''':",
 'protect-cascadeon' => 'Hanc paginam, in {{PLURAL:$1|pagina seriatim protecta|paginis seriatim protectis}} inclusam, potes deprotegere; manebit autem protectio serialis.',
 'protect-default' => 'Usoribus omnibus licet',
-'protect-fallback' => 'Postulat permissum "$1"',
-'protect-level-autoconfirmed' => 'Tironibus et conventu carentibus non licet',
-'protect-level-sysop' => 'Magistratus soli',
+'protect-fallback' => 'Sinere solum usores permissu "$1"',
+'protect-level-autoconfirmed' => 'Sinere solum usores adfirmati automaticale',
+'protect-level-sysop' => 'Sinere solum magistratus',
 'protect-summary-cascade' => 'defluens',
 'protect-expiring' => 'exit $1 (UTC)',
 'protect-expiry-indefinite' => 'infinita',
index 6168505..314f328 100644 (file)
@@ -213,7 +213,7 @@ $messages = array(
 'tog-externaleditor' => 'Externen Editeur als Standard benotzen (Nëmme fir Experten, et musse speziell Astellungen op ärem Computer gemaach ginn. [//www.mediawiki.org/wiki/Manual:External_editors Méi Informatiounen.])',
 'tog-externaldiff' => 'En Externen Diff-Programm als Standard benotzen (nëmme fir Experten, et musse speziell Astellungen op ärem Computer gemaach ginn. [//www.mediawiki.org/wiki/Manual:External_editors Méi Informatiounen])',
 'tog-showjumplinks' => 'Aktivéiere vun de "Sprang op"-Linken',
-'tog-uselivepreview' => 'Live-Preview benotzen (brauch JavaScript)',
+'tog-uselivepreview' => 'Live-Preview benotzen (JavaScript) (experimentell)',
 'tog-forceeditsummary' => 'Warnen, wa beim Späicheren de Resumé feelt',
 'tog-watchlisthideown' => 'Meng Ännerungen op menger Iwwerwaachungslëscht verstoppen',
 'tog-watchlisthidebots' => 'Ännerunge vu Botten op menger Iwwerwaachungslëscht verstoppen',
@@ -314,6 +314,7 @@ $messages = array(
 'newwindow' => '(geet an enger neier Fënster op)',
 'cancel' => 'Zréck',
 'moredotdotdot' => 'Méi …',
+'morenotlisted' => 'Méi, déi hei net stinn...',
 'mypage' => 'Säit',
 'mytalk' => 'Diskussioun',
 'anontalk' => 'Diskussioun fir dës IP Adress',
@@ -2297,6 +2298,7 @@ Kuckt d'[[Special:ProtectedPages|Lëscht vun de gespaarte Säite]] fir eng Lësc
 'prot_1movedto2' => '[[$1]] gouf op [[$2]] geréckelt',
 'protect-badnamespace-title' => 'Nummraum deen net gespaart ka ginn',
 'protect-badnamespace-text' => 'Säiten an dësem Nummraum kënnen net gespaart ginn.',
+'protect-norestrictiontypes-title' => 'Säit kann net gespaart ginn',
 'protect-legend' => "Confirméiert d'Protectioun",
 'protectcomment' => 'Grond:',
 'protectexpiry' => 'Dauer vun der Spär:',
@@ -2312,9 +2314,9 @@ Hei sinn déi aktuell Astellungen fir d'Säit '''$1''':",
 Hei sinn déi aktuell Astellunge fir d'Säit '''$1''':",
 'protect-cascadeon' => "Dës Säit ass elo gespaart well si an déi folgend {{PLURAL:$1|Säit|Säiten}} agebonn ass déi duerch eng Kaskadespär gespaart {{PLURAL:$1|ass|sinn}}. De Protectiounsniveau ka fir dës Säit geännert ginn, dat huet awer keen Afloss op d'Kaskadespär.",
 'protect-default' => 'All Benotzer erlaben',
-'protect-fallback' => 'Eng "$1"-Autorisatioun gëtt gebraucht.',
-'protect-level-autoconfirmed' => 'Spär fir nei an net ugemellte Benotzer',
-'protect-level-sysop' => 'Nëmmen Administrateuren',
+'protect-fallback' => 'Nëmme Benotzer mat enger "$1"-Autorisatioun erlaben.',
+'protect-level-autoconfirmed' => 'Nëmmen automatesch ugemellte Benotzer erlaben',
+'protect-level-sysop' => 'Nëmmen Administrateuren erlaben',
 'protect-summary-cascade' => 'Protectioun a Kaskaden',
 'protect-expiring' => 'bis $1 (UTC)',
 'protect-expiring-local' => 'bis $1',
index b6980d7..4863025 100644 (file)
@@ -689,9 +689,11 @@ $messages = array(
 'right-browsearchive' => 'Алуднавай ччинар жугъурун',
 'right-undelete' => 'Алуднавай ччинар туькIуьр хъувун',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Уртахар регистрация авунин журнал',
+
 # User rights log
 'rightslog' => 'Эхтияр Ишлемишчидин дафтlар',
-'rightsnone' => '(садни)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'И ччин кIелун',
@@ -918,9 +920,6 @@ $messages = array(
 'listusers-noresult' => 'Иштиракчияр жагъуриз хьанвач',
 'listusers-blocked' => '(блокарнава)',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Уртахар регистрация авунин журнал',
-
 # Special:ListGroupRights
 'listgrouprights-group' => 'КIеретI',
 'listgrouprights-members' => '(уьзвийрин сиягь)',
@@ -952,6 +951,9 @@ $messages = array(
 'watching' => 'Килигун...',
 'unwatching' => 'Амма клигнай',
 
+'created' => 'туькIуьрнава',
+'changed' => 'дегишнава',
+
 # Delete
 'deletepage' => 'Къакъудун хъувун',
 'confirm' => 'Тестикьун',
@@ -1321,6 +1323,9 @@ Cиягьда авай анжах (* лишандихъ галаз эгечIза
 # Special:ComparePages
 'compare-page1' => 'Чар 1',
 
+# New logging system
+'rightsnone' => '(садни)',
+
 # Feedback
 'feedback-subject' => 'Тема:',
 'feedback-message' => 'Чар:',
index 6fe00d0..4e0d64b 100644 (file)
@@ -687,6 +687,8 @@ Si tu vole sutrae la paje de tu lista de pajes oservada en la futur, clica a \"n
 'watching' => 'Oserva...',
 'unwatching' => 'No oserva...',
 
+'created' => 'Creada',
+
 # Delete
 'deletepage' => 'Sutrae la paje',
 'confirm' => 'Aproba',
index 18a6cd8..6442f4a 100644 (file)
@@ -651,6 +651,9 @@ Leggenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a v
 
 'grouppage-sysop' => '{{ns:project}}:Amministratoî',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Nêuvi utenti',
+
 # User rights log
 'rightslog' => "Diritti d'ûtente",
 
@@ -864,9 +867,6 @@ Ti te peu strinza a vista se ti te çerni un tipo de registro, un nomme de un ut
 'listusers-submit' => 'Fanni vedde',
 'listusers-noresult' => 'Utente non trovöo.',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Nêuvi utenti',
-
 # Special:ListGroupRights
 'listgrouprights-members' => '(Elenco di membri)',
 
@@ -905,6 +905,7 @@ Ti te peu strinza a vista se ti te çerni un tipo de registro, un nomme de un ut
 'unwatching' => 'Scassâ da-i osservæ speçiâli',
 
 'enotif_anon_editor' => 'ûtente anònnimo $1',
+'changed' => 'cangiâ',
 
 # Delete
 'deletepage' => 'Scassa a paggina',
index a76dd63..eaf2125 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Andrijko Z.
  * @author Erdemaslancan
  * @author Ohpuu
  * @author Warbola
@@ -372,6 +373,9 @@ Legend: '''({{int:cur}})''' = vaiţīd līdzinţõmizõks lǟndz redaktsijõks,,
 
 'grouppage-sysop' => '{{ns:project}}:Administrātord',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Kȭlbatijizt lūomiz log',
+
 # User rights log
 'rightslog' => 'Kȭlbatijiz õigõmt log',
 
@@ -488,9 +492,6 @@ Legend: '''({{int:cur}})''' = vaiţīd līdzinţõmizõks lǟndz redaktsijõks,,
 'linksearch' => 'Uļļizt siḑīmõd',
 'linksearch-line' => '$1 um sidtõd līedst $2',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Kȭlbatijizt lūomiz log',
-
 # Special:ListGroupRights
 'listgrouprights-members' => '(nõtkõmd nimkēra)',
 
@@ -560,7 +561,7 @@ Legend: '''({{int:cur}})''' = vaiţīd līdzinţõmizõks lǟndz redaktsijõks,,
 'blanknamespace' => '(Kēratõkst)',
 
 # Contributions
-'contributions' => 'Kȭlbatijiz kubsõtīe',
+'contributions' => '{{GENDER:$1|Kȭlbatijiz}} kubsõtīe',
 'contributions-title' => 'Kȭlbatijiz $1 kubsõtīe',
 'mycontris' => 'Min kubsõtīed',
 'contribsub2' => 'Kȭlbatiji $1 ($2) pierāst',
index 9a48f44..bc88182 100644 (file)
@@ -723,9 +723,11 @@ Pröa a giuntagh denanz a la tò ricerca ''all:'' per cercà in tücc i namespac
 'right-edit' => 'Edita pàgini',
 'right-createaccount' => 'Crea cünt de dovratt bej-e növ',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Rrgister di druvat növ',
+
 # User rights log
 'rightslog' => 'Dirit di druvat',
-'rightslogentry' => "l'ha mudifegaa $1 dal grüp $2 al grüp $3",
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'mudifega quela pagina chì',
@@ -939,9 +941,6 @@ La descrizión sura la sua [$2 pagina de descrizión del file] l'è mustrada ch
 # Special:ActiveUsers
 'activeusers-from' => 'Fàm vedè i dupradur a partì da:',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Rrgister di druvat növ',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Dirit del grüp di druvat',
 'listgrouprights-members' => '(Lista di member)',
@@ -996,6 +995,7 @@ Per mudifegà l\'impustazión de la lista di paginn che te tegn d\'ögg, varda
 
 Per fà di cumünicazion de servizzi e per cercà jüt:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
+'changed' => 'cambiaa',
 
 # Delete
 'deletepage' => 'Scancela la pagina',
index 9332ea9..d63187d 100644 (file)
@@ -413,6 +413,9 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 
 'group-sysop-member' => 'Moyángeli',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Zuluná ya bokeli bwa konti ya mosáleli',
+
 # User rights log
 'rightslog' => 'Zuluná ya makokí ma basáleli',
 
@@ -523,9 +526,6 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 # Special:Categories
 'categories' => 'Ndéngé',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Zuluná ya bokeli bwa konti ya mosáleli',
-
 # E-mail user
 'emailuser' => 'Kotíndela yě mɛ́lɛ',
 'defemailsubject' => '{{SITENAME}} mokánda',
@@ -551,6 +551,8 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 'watching' => 'Kolanda...',
 'unwatching' => 'Kolanda tɛ́...',
 
+'created' => 'ekomákí',
+
 # Delete
 'deletepage' => 'Kolímwisa lonkásá loye',
 'dellogpage' => 'zuluná ya bolímwisi',
index 75de322..7e9dcd7 100644 (file)
@@ -535,6 +535,10 @@ $messages = array(
 # User rights
 'editinguser' => 'ຜູ້ໃຊ້ <b>$1</b> ພວມດັດແກ້ ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])',
 
+# Special:Log/newusers
+'newuserlogpage' => 'ບັນທຶກການສ້າງບັນຊີຜູ້ໃຊ້',
+'newuserlogpagetext' => 'ນີ້ແມ່ນ ບັນທຶກການສ້າງ ບັນຊີຜູ້ໃຊ້ໃໝ່',
+
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|ການປ່ຽນແປງ|ການປ່ຽນແປງ}}',
 'recentchanges' => 'ການດັດແກ້ຫຼ້າສຸດ',
@@ -683,10 +687,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Special:ListUsers
 'listusers-submit' => 'ສະແດງ',
 
-# Special:Log/newusers
-'newuserlogpage' => 'ບັນທຶກການສ້າງບັນຊີຜູ້ໃຊ້',
-'newuserlogpagetext' => 'ນີ້ແມ່ນ ບັນທຶກການສ້າງ ບັນຊີຜູ້ໃຊ້ໃໝ່',
-
 # E-mail user
 'emailuser' => 'ສົ່ງອີເມລ ຫາ ຜູ້ໃຊ້ນີ້',
 'emailpage' => 'ສົ່ງອີເມລ ຫາ ຜູ້ໃຊ້',
@@ -722,6 +722,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'unwatching' => 'ພວມເຊົາຕິດຕາມ...',
 
 'enotif_lastvisited' => 'ເບິ່ງ $1 ເພື່ອ ທຸກໆການປ່ຽນແປງ ຕັ້ງແຕ່ເທື່ອສຸດທ້າຍ ທີ່ ທ່ານເຂົ້າຫາ.',
+'created' => 'ສ້າງແລ້ວ',
+'changed' => 'ປ່ຽນແລ້ວ',
 
 # Delete
 'confirm' => 'ຢືນຢັນ',
index b400758..d51483a 100644 (file)
@@ -453,9 +453,11 @@ n = nasvareigs lobuojums.',
 'right-upload_by_url' => 'Īsyuteit failu nu URL adresa',
 'right-delete' => 'Iztreit puslopys',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Jaunūs lītuotuoju registrs',
+
 # User rights log
 'rightslog' => 'Lītuotuoju tīseibu registrs',
-'rightsnone' => '(navā)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'skaiteit itū puslopu',
@@ -589,9 +591,6 @@ Lopys, kas ir tovā [[Special:Watchlist|puorraugamūs rokstu sarokstā]] ir '''r
 # Special:ListUsers
 'listusers-submit' => 'Paruodeit',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Jaunūs lītuotuoju registrs',
-
 # Special:ListGroupRights
 'listgrouprights-members' => '(dalinīku saroksts)',
 'listgrouprights-addgroup' => 'Dalikt {{PLURAL:$2|grupu|grupys}}: $1',
@@ -902,4 +901,7 @@ Puorejī lauki, piec nūklusiejuma, byus nūglobuoti.
 # Special:SpecialPages
 'specialpages' => 'Specialuos puslopys',
 
+# New logging system
+'rightsnone' => '(navā)',
+
 );
index 4c12a97..2e7155e 100644 (file)
@@ -401,9 +401,11 @@ Ogoruşi dudis '''all:''' pʼrefiksi okʼatute doloçʼareli na ren iri şeyi (o
 # Rights
 'right-delete' => 'Am sayfape jili',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Ağani maxmareş kʼayitʼepe',
+
 # User rights log
 'rightslog' => 'Maxmareş hakʼişi kʼayitʼepe',
-'rightsnone' => '(Va ren)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => "am sayfa ik'itxi",
@@ -503,9 +505,6 @@ Ogoruşi dudis '''all:''' pʼrefiksi okʼatute doloçʼareli na ren iri şeyi (o
 # Special:LinkSearch
 'linksearch' => 'Galeni kʼontaktʼepe',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Ağani maxmareş kʼayitʼepe',
-
 # Special:ListGroupRights
 'listgrouprights-members' => '(makʼaturepeşi listʼe)',
 
@@ -777,4 +776,7 @@ Ukʼaçxe na mulunan kʼontʼaktʼepe istʼisna oqʼopinot kʼabuli ixvenen. Mes
 # Special:SpecialPages
 'specialpages' => 'Doxmeli butʼkʼape',
 
+# New logging system
+'rightsnone' => '(Va ren)',
+
 );
index 724ab52..7b5450e 100644 (file)
@@ -349,7 +349,7 @@ $messages = array(
 'newwindow' => '(sokafy anaty takila hafa)',
 'cancel' => 'Aoka ihany',
 'moredotdotdot' => 'Tohiny...',
-'mypage' => 'Pejiko',
+'mypage' => 'Pejy',
 'mytalk' => 'Dinika',
 'anontalk' => "Resaka ho an'io adiresy IP io",
 'navigation' => 'Fikarohana',
@@ -588,11 +588,15 @@ fangatahana : $2",
 'actionthrottled' => 'Tao voafetra',
 'actionthrottledtext' => "Mba hiady amin'ny spam, ny hatetika momba ny fanaovana io otao io dia ferana ho foifoy, ary niaotra io fetra io ianao.
 Andramo indray afaka minitra vitsivitsy.",
-'protectedpagetext' => 'Voaaro mba tsy hisy hanova ity pejy ity.',
+'protectedpagetext' => 'Narovana mba tsy hisiana fanovana na tao hafa ity pejy ity.',
 'viewsourcetext' => "Azonao atao no mijery sy mandrika ny votoatin'ity pejy ity :",
 'viewyourtext' => "Azonao atao ny mijery ary mandika ny fangon'ny '''fanovanao''' tamin'ity pejy ity:",
-'protectedinterface' => "Manome lahatsoratra ho an'ny rindrankajy ity pejy ity ary voaaro izy ity mba tsy hisy hanararaotra",
-'editinginterface' => "'''Tandremo :''' manova pejy ampiasan'ny lôjisialy wiki ianao. Mety hita ny mpikambana sàsany izy io. Rehefa tia mandika teny ianao, jereo ny volavola MediaWiki ho an'ny internationalisation ny hafatra [//translatewiki.net/wiki/Main_Page?setlang=fr translatewiki.net].",
+'protectedinterface' => "Ity pejy ity dia manome ny lahatsoratra ho an'ny rindrankajy eto amin'ity Wiki ity, ary narovana mba tsy hisian'ny fanararaotana. Raha tia hanampy na hanova ny dikanteny ho an'ny wiki rehetra, ampiasao [//translatewiki.net/ translatewiki.net], izay tetikasa fandikanan ny rindrankajy Mediawiki.",
+'editinginterface' => "'''Tandremo''' : Manova pejy ampiasaina amin'ny famoahana ny hafatray ny rindrankajy ianao io.
+
+Hisy fiantraikany amin'ny fisehon'ny tranonkala amin'ny mpampiasa rehetra eto amin'ity wiki ity ny fanovana.
+
+Raha hanampy dikanteny izay tokony hihatra amin'ny wiki rehetra, ampiaao ny tranonkala [//translatewiki.net/ translatewiki.net translatewiki.net], ny tetikasa fandikana an'i MediaWiki.",
 'sqlhidden' => '(nafenina ny requête SQL)',
 'cascadeprotected' => 'Ankehitriny dia voaaro ity pejy ity satria misy pejy voaaro {{PLURAL:$1||$1}}1 mampiasa ity pejy ity. Io pejy io dia mampiasa ny fiarovana "en cascade" :
 
@@ -1120,9 +1124,10 @@ Tsy azo jerenao io.",
 'revdelete-concurrent-change' => "Tsi-fetezana teo am-panovana ny zavatra voadaty tamin'ny $1 tamin'ny $2 : ny satany dia voaovan' olon-kafa tamin'ianao nanova azy.
 Jereo ny laogy.",
 'revdelete-only-restricted' => "Tsi-fetezana teo am-panitrihana ny zavatra voadaty tamin'ny $1 tamin'ny $2 : tsy azonao fafana ireo zavatra ireo amin'ny mpandrindra raha tsy misafidy famafana.",
-'revdelete-reason-dropdown' => '* Antom-pamafana matetika miasa
-** Tsi-fanajana ny Copyright
-** Fampahalalana tsy tokony apetraka eo',
+'revdelete-reason-dropdown' => "* Antom-pamafana matetika :
+** Tsifanajakan ny zom-pamrona;
+** Famoahan-kevitra na fampahalalana ho ann'ny olon-tokana tsy tokony haseho;
+** Fampahalalana mety mifototra amin'ny lainga.",
 'revdelete-otherreason' => 'Antony hafa / antony miampy :',
 'revdelete-reasonotherlist' => 'Antony hafa',
 'revdelete-edit-reasonlist' => "Hanova ny anton'ny famafàna",
@@ -1326,9 +1331,9 @@ Fenoy araka ny datin'ny solosainan'ny mpitsidika",
 'prefs-emailconfirm-label' => 'Famarinana ny imailaka :',
 'prefs-textboxsize' => "Hangezan'ny varavarankely fanovana",
 'youremail' => 'Imailaka:',
-'username' => 'Solonanarana:',
-'uid' => "Laharan'ny mpikambana:",
-'prefs-memberingroups' => "mpikamban'ny gropy{{PLURAL:}} $1 :",
+'username' => '{{GENDER:$1}}Anaram-pikambana :',
+'uid' => '{{GENDER:$1}}mpikambana :',
+'prefs-memberingroups' => "mpikambana{{GENDER:$2}} ao amin'ny vondrona{{PLURAL:$1}} :",
 'prefs-registration' => 'Daty fidirana :',
 'yourrealname' => 'Tena anarana marina:',
 'yourlanguage' => 'Tenim-pirenena:',
@@ -1719,7 +1724,7 @@ Raha mbola misy foana ilay  olana, manorata any amin'ny [[Special:ListUsers/syso
 'backend-fail-readonly' => 'Amin\'izao fotoana dia famakiana ihany ny fitahirizana terminal an\'i "$1". "\'\'$2\'\'" no antony nomena',
 'backend-fail-connect' => 'Tsy afaka mifandray amin\'ny terminal fitahirizana "$1".',
 'backend-fail-internal' => 'Hadisoana tsy fantatra tao anatin\'ny terminal fitahirizana "$1".',
-'backend-fail-usable' => "Tsy afaka manoratra ilay rakitra $1 noho ny tsifiampian'ny zo na noho ny petra-drakitra tsy misy.",
+'backend-fail-usable' => 'Tsy afaka nanoratra ny rakitra "$1" nohon\'ny zo tsy ampy na ny tsy fisian\'ny petra-drakitra.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Tsy afaka miantso ilay banky angona laogy ho an\'ny terminal fitahirizana "$1".',
@@ -1793,8 +1798,7 @@ ity wiki ity dia no-regler-na ho sarababem-bahoaka.",
 
 # Special:ListFiles
 'listfiles-summary' => "Ahitana ny rakitra rehetra nampidirina ity pejy manokana ity.
-Napetraka eny amin'ny voalohandohany ny rakitra vao nampidirina.
-Tsindrio eo amin'ny lohan-tsanganana raha hanova ny laharam-pisehoana.",
+Rehefa sivanin'ny mpikambana iray izy ity, ny rakitra izay ahitana santiôna vaovao indrindra izay nalefan'io mpikamana io no aseho.",
 'listfiles_search_for' => 'Hitady anarana media :',
 'imgfile' => 'rakitra',
 'listfiles' => "Lisitran'ny rakitra",
@@ -1915,7 +1919,7 @@ Aza manadino manamarina raha tsy misy rohy makany amin'ny endrika hafa alohan'ny
 'statistics-users-active-desc' => "Mpikambana nanao zavatra teto tanatin'ny $1 andro{{PLURAL:}}.",
 'statistics-mostpopular' => 'Pejy voatsidika',
 
-'disambiguations' => 'pejina homonimia',
+'disambiguations' => 'Pejy misy rohy amina pejy fanalana ny fisalasalana',
 'disambiguationspage' => 'Template:homonimia',
 
 'doubleredirects' => 'Fihodinana roa',
@@ -2180,28 +2184,32 @@ Aoriana, raha irinao ny hanaisotra azy ao amin'ny pejy arahanao maso, dia tsindr
 'enotif_lastvisited' => "Jereo eto $1 ny niova rehetra hatramin'ny fitsidihanao farany.",
 'enotif_lastdiff' => 'Jereo $1 mba ahitana ireo fanovana ireo.',
 'enotif_anon_editor' => 'mpikambana tsy nisoratra anarana $1',
-'enotif_body' => '$WATCHINGUSERNAME,
-
-$CHANGEDORCREATED $PAGEEDITOR tamin\'ny $PAGEEDITDATE ny pejy $PAGETITLE tao amin\'ny sehatra {{SITENAME}}. Jereo eto $PAGETITLE_URL ny votoatiny ankehitriny.
+'enotif_body' => 'Tompoko $WATCHINGUSERNAME,
 
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
-Fanazavana tsotsotra: $PAGESUMMARY $PAGEMINOREDIT
+Ambangovangon\'ny mpikambana nanova : $PAGESUMMARY $PAGEMINOREDIT
 
-Fifandraisana amin\'ny nanova ny pejy:
-imailaka: $PAGEEDITOR_EMAIL
-wiki: $PAGEEDITOR_WIKI
+Ifandraisana amin\'io mpikambana io :
+mailaka : $PAGEEDITOR_EMAIL
+wiki : $PAGEEDITOR_WIKI
 
-Tsy handefasana fampahafantarana intsony aloha ianao momba io pejy io na dia misy manova aza izy mandra-pitsidikao azy.
-Azonao atao koa ny manajanona ny fampahafantarana anao aloha na misy manova aza ny pejy iray ao amin\'ny lisitry ny pejy arahinao maso.
+Tsy hisy fampandrenesana hafa raha misy mpikambana manova aorian\'ny nandefasana ity mailaka ity, raha tsy hoe mitsidika ilay pejy ianao. Azonao atao koa ny mamerina ho aotra ny flag fampandrenesana ho an\'ny pejy rehetra ao amin\'ny lisitry ny pejy arahanao.
 
-             Ny fitaovana fampahafantarana eto amin\'ny {{SITENAME}}
+             Ny rafitr\'i {{SITENAME}} mampandre anao.
 
 --
-Raha hanova ny fandehan\'ny momba ny lisitry ny pejy arahi-maso, jereo
+Rehefa hanova ny parametatra mikasika ny fampandrenesana amin\'ny alalan\'ny mailaka, tsidiho
+{{canonicalurl:{{#special:Preferences}}}}
+
+
+Rehefa tia hanova ny parametatray ny lisitry ny pejy arahanao, tsidiho
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
-Hevitrao sy fanampiana:
+Rehefa tsy hanaraka ilay pejy intsony ianao dia tsidiho
+$UNWATCHURL
+
+Verindrohy ary fanampiana:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 'created' => 'voaforona',
 'changed' => 'voaova',
index 53b0097..17588be 100644 (file)
@@ -591,6 +591,9 @@ $messages = array(
 'grouppage-bot' => '{{ns:project}}:Бот-влак',
 'grouppage-sysop' => '{{ns:project}}:Сайтвиктарыше-влак',
 
+# Special:Log/newusers
+'newuserlogpage' => 'У пайдаланыше регистрацийым эртарыме журнал',
+
 # User rights log
 'rightslog' => 'Пайдаланышын кертыж нерген журнал',
 
@@ -763,9 +766,6 @@ $messages = array(
 'activeusers-hidebots' => 'Бот-влакым шылташ',
 'activeusers-hidesysops' => 'Сайтвиктарыше-влакым шылташ',
 
-# Special:Log/newusers
-'newuserlogpage' => 'У пайдаланыше регистрацийым эртарыме журнал',
-
 # Special:ListGroupRights
 'listgrouprights-members' => '(тӱшкаште улшо-влак)',
 
index 544c876..6e1d506 100644 (file)
@@ -379,7 +379,7 @@ $messages = array(
 'tog-externaleditor' => 'По основно користи надворешен уредувач (само за стручњаци, потребно е посебно нагодување на сметачот. [//www.mediawiki.org/wiki/Manual:External_editors?uselang=mk Повеќе информации.])',
 'tog-externaldiff' => 'По основно користи надворешен програм за споредување верзии (само за стручњаци, потребно е специјално нагодување на сметачот. [//www.mediawiki.org/wiki/Manual:External_editors?uselang=mk Повеќе информации.])',
 'tog-showjumplinks' => 'Овозможи врски на пристапност „скокни на“',
-'tog-uselivepreview' => 'Користи преглед во живо (бара JavaScript)',
+'tog-uselivepreview' => 'Користи преглед во живо (бара JavaScript) (експериментално)',
 'tog-forceeditsummary' => 'Извести ме кога нема опис на промените',
 'tog-watchlisthideown' => 'Скриј мои уредувања од списокот на набљудувања',
 'tog-watchlisthidebots' => 'Скриј ботовски уредувања од списокот на набљудувања',
@@ -1233,12 +1233,12 @@ $2
 'rev-deleted-text-unhide' => "Оваа ревизија на страницата е '''избришана'''.
 Повеќе подробности ќе најдете во [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневникот на бришења].
 Сепак можете [$1 да ја погледнете оваа ревизија] ако сакате да продолжите.",
-'rev-suppressed-text-unhide' => "Оваа ревизија на страница е '''скриена'''.
+'rev-suppressed-text-unhide' => "Оваа ревизија на страница е '''притаена'''.
 Повеќе подробности ќе најдете во [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} дневникот на прикривања].
 Сепак можете да ја [$1 погледнете оваа ревизија] ако сакате да продолжите.",
 'rev-deleted-text-view' => "Оваа ревизија на страницата е '''избришана'''.
 Можете да ја погледнете; повеќе подробности ќе најдете во [{{fullurl:Special:Log/delete|page={{FULLPAGENAMEE}}}} дневникот на бришења].",
-'rev-suppressed-text-view' => "Оваа ревизија на страницата е '''скриена'''.
+'rev-suppressed-text-view' => "Оваа ревизија на страницата е '''притаена'''.
 Можете да ја погледнете; повеќе подробности ќе најдете во [{{fullurl:Special:Log/suppress|page={{FULLPAGENAMEE}}}} дневникот на скривања].",
 'rev-deleted-no-diff' => "Не може да ја погледнете оваа разлика бидејќи една од ревизиите била '''избришана'''.
 Може да најдете повеќе подробности во [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневникот на бришења].",
@@ -1246,12 +1246,12 @@ $2
 'rev-deleted-unhide-diff' => "Една од ревизиите на оваа разлика е '''избришана'''.
 Повеќе подробности ќе најдете во [{{fullurl:Special:Log/delete|page={{FULLPAGENAMEE}}}} дневникот на бришења].
 Сепак можете [$1 да ја видите оваа разлика] ако сакате да продолжите.",
-'rev-suppressed-unhide-diff' => "Една од ревизиите на оваа разлика е '''скриена'''.
+'rev-suppressed-unhide-diff' => "Една од ревизиите на оваа разлика е '''притаена'''.
 Повеќе подробности ќе најдете во [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} дневникот на скривања].
 Можете да [$1 ја видите оваа разлика] ако сакате да продолжите.",
 'rev-deleted-diff-view' => "Една од ревизиите на оваа разлика е '''избришана'''.
 Можете да ја погледате оваа разлика; подробности ќе најдете во [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневникот на бришење].",
-'rev-suppressed-diff-view' => "Една од ревизиите на оваа разлика е '''скриена'''.
+'rev-suppressed-diff-view' => "Една од ревизиите на оваа разлика е '''притаена'''.
 Можете да ја погледате оваа разлика; подробности ќе најдете во [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} дневникот на скривања].",
 'rev-delundel' => 'прикажи/скриј',
 'rev-showdeleted' => 'прикажи',
@@ -1283,7 +1283,7 @@ $2
 'revdelete-radio-same' => '(не менувај)',
 'revdelete-radio-set' => 'Да',
 'revdelete-radio-unset' => 'Не',
-'revdelete-suppress' => 'СкÑ\80иј податоци и од администраторите',
+'revdelete-suppress' => 'Ð\9fÑ\80иÑ\82аÑ\98Ñ\83вај податоци и од администраторите',
 'revdelete-unsuppress' => 'Отстрани ограничувања на обновени ревизии',
 'revdelete-log' => 'Причина:',
 'revdelete-submit' => 'Примени на одбрани {{PLURAL:$1|ревизија|ревизии}}',
@@ -2567,9 +2567,9 @@ $UNWATCHURL
 'protect-cascadeon' => 'Оваа страница е моментално заштитена бидејќи е вклучена во {{PLURAL:$1|следнава страница, за која е|следниве страници, за кои се}} под каскадна заштита.
 Можете да го измените степенот на заштита, но тоа нема да влијае на каскадната заштита.',
 'protect-default' => 'Допуштено за сите корисници',
-'protect-fallback' => 'Ð\91аÑ\80аÑ\98 Ð´Ð¾Ð·Ð²Ð¾Ð»Ð° Ð¾Ð´ „$1“',
-'protect-level-autoconfirmed' => 'Ð\91локиÑ\80аÑ\98 Ð½Ð¾Ð²Ð¸ Ð¸ Ð½ÐµÑ\80егиÑ\81Ñ\82Ñ\80иÑ\80ани корисници',
-'protect-level-sysop' => 'Само администратори',
+'protect-fallback' => 'Ð\94опÑ\83Ñ\88Ñ\82аÑ\98 Ñ\81амо ÐºÐ¾Ñ\80иÑ\81ниÑ\86и Ñ\81о Ð´Ð¾Ð·Ð²Ð¾Ð»Ð° „$1“',
+'protect-level-autoconfirmed' => 'Ð\94опÑ\83Ñ\88Ñ\82аÑ\98 Ñ\81амо Ð°Ð²Ñ\82опоÑ\82вÑ\80дени корисници',
+'protect-level-sysop' => 'Ð\94опÑ\83Ñ\88Ñ\82аÑ\98 Ñ\81амо администратори',
 'protect-summary-cascade' => 'каскада',
 'protect-expiring' => 'истекува на $1 (UTC)',
 'protect-expiring-local' => 'истекува $1',
@@ -2878,9 +2878,9 @@ $1',
 Ако не изберете автоматско подновување, проверете на [[Special:DoubleRedirects|двојни]] или [[Special:BrokenRedirects|прекинати пренасочувања]].
 На вас е одговорноста да се осигурате дека врските ќе продолжат да насочуваат таму за каде се предвидени.
 
\98маÑ\98Ñ\82е Ð¿Ñ\80едвид Ð´ÐµÐºÐ° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а '''Ð\9dÐ\95Ð\9cÐ\90''' Ð´Ð° Ð±Ð¸Ð´Ðµ Ð¿Ñ\80емеÑ\81Ñ\82ена Ð°ÐºÐ¾ Ð²ÐµÑ\9cе Ð¿Ð¾Ñ\81Ñ\82ои Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\81о Ð½Ð¾Ð²Ð¸Ð¾Ñ\82 Ð½Ð°Ñ\81лов, Ð¾Ñ\81вен Ð°ÐºÐ¾ Ðµ Ð¿Ñ\80азна Ð¸Ð»Ð¸ Ð°ÐºÐ¾ е пренасочување и нема историја на минати уредувања. Тоа значи дека можете да ја преименувате страницата како што била претходно доколку сте направиле грешка без да ја прекриете постоечката страница.
\98маÑ\98Ñ\82е Ð¿Ñ\80едвид Ð´ÐµÐºÐ° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а '''нема''' Ð´Ð° Ð±Ð¸Ð´Ðµ Ð¿Ñ\80емеÑ\81Ñ\82ена Ð°ÐºÐ¾ Ð²ÐµÑ\9cе Ð¿Ð¾Ñ\81Ñ\82ои Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\81о Ð½Ð¾Ð²Ð¸Ð¾Ñ\82 Ð½Ð°Ñ\81лов, Ð¾Ñ\81вен Ð°ÐºÐ¾ Ðµ Ð½Ðµ е пренасочување и нема историја на минати уредувања. Тоа значи дека можете да ја преименувате страницата како што била претходно доколку сте направиле грешка без да ја прекриете постоечката страница.
 
-'''ПРЕДУПРЕДУВАЊЕ!'''
+'''Предупредување!'''
 Ова може да биде драстична и неочекувана промена за популарна страница;
 осигурајте се дека сте ги разбрале последиците од ова пред да продолжите.",
 'movepagetext-noredirectfixer' => "Со користењето на овој образец можете да преименувате страница, преместувајќи ја целата нејзина историја под ново име.
@@ -4240,7 +4240,7 @@ $5
 'logentry-delete-revision' => '$1 ја измени видливоста на {{PLURAL:$5|ревизија|$5 ревизии}} на страницата $3: $4',
 'logentry-delete-event-legacy' => '$1 ја измени видливоста на настани во дневникот на $3',
 'logentry-delete-revision-legacy' => '$1 ја измени видливоста на ревизии на страницата $3',
-'logentry-suppress-delete' => '$1 ја потисна страницата $3',
+'logentry-suppress-delete' => '$1 ја притаи страницата $3',
 'logentry-suppress-event' => '$1 потајно ја измени видливоста на {{PLURAL:$5|настан во дневникот|$5 настани во дневникот}} на $3: $4',
 'logentry-suppress-revision' => '$1 потајно ја измени видливоста на {{PLURAL:$5|ревизија|$5 ревизии}} на страницата $3: $4',
 'logentry-suppress-event-legacy' => '$1 потајно ја измени видливоста на настани во дневникот на $3',
@@ -4320,7 +4320,8 @@ $5
 'api-error-nomodule' => 'Внатрешна грешка: нема зададено модул за подигање.',
 'api-error-ok-but-empty' => 'Внатрешна грешка: опслужувачот не одговара.',
 'api-error-overwrite' => 'Презапишувањето врз постоечки податотеки не е дозволено.',
-'api-error-stashfailed' => 'Внатрешна грешка: опслужувачот не успеа да ја складира привремената податотека.',
+'api-error-stashfailed' => 'Внатрешна грешка: Опслужувачот не успеа да ја складира привремената податотека.',
+'api-error-publishfailed' => 'Внатрешна грешка: Опслужувачот не успеа да ја објави привремената податотека.',
 'api-error-timeout' => 'Опслужувачот не одговори во очекуваното време.',
 'api-error-unclassified' => 'Се појави непозната грешка.',
 'api-error-unknown-code' => 'Непозната грешка: „$1“',
index 7c2394b..a80943d 100644 (file)
@@ -365,7 +365,7 @@ $messages = array(
 'tog-externaleditor' => 'സ്വതേ ബാഹ്യ എഡിറ്റർ ഉപയോഗിക്കുക (വിദഗ്ദ്ധ ഉപയോക്താക്കൾക്കു മാത്രം, താങ്കളുടെ കമ്പ്യൂട്ടറിൽ പ്രത്യേക സജ്ജീകരണങ്ങൾ ആവശ്യമാണ്. [//www.mediawiki.org/wiki/Manual:External_editors കൂടുതൽ വിവരങ്ങൾ.])',
 'tog-externaldiff' => 'വ്യത്യാസം അറിയാൻ സ്വതേ ബാഹ്യ ഉപകരണങ്ങൾ ഉപയോഗിക്കുക (വിദഗ്ദ്ധ ഉപയോക്താക്കൾക്കു മാത്രം, താങ്കളുടെ കമ്പ്യൂട്ടറിൽ പ്രത്യേക സജ്ജീകരണങ്ങൾ ആവശ്യമാണ്. [//www.mediawiki.org/wiki/Manual:External_editors കൂടുതൽ വിവരങ്ങൾ.])',
 'tog-showjumplinks' => '"പോവുക" ഗമ്യത കണ്ണികൾ പ്രാപ്തമാക്കുക',
-'tog-uselivepreview' => 'തത്സമയ പ്രിവ്യൂ ഉപയോഗപ്പെടുത്തുക (ജാവാസ്ക്രിപ്റ്റ് ആവശ്യമാണ്)',
+'tog-uselivepreview' => 'തത്സമയ പ്രിവ്യൂ ഉപയോഗപ്പെടുത്തുക (ജാവാസ്ക്രിപ്റ്റ് ആവശ്യമാണ്) (പരീക്ഷണാടിസ്ഥാനം)',
 'tog-forceeditsummary' => 'തിരുത്തലുകളുടെ ചുരുക്കം നൽകിയില്ലെങ്കിൽ എന്നെ ഓർമ്മിപ്പിക്കുക',
 'tog-watchlisthideown' => 'ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽനിന്ന് എന്റെ തിരുത്തലുകൾ മറയ്ക്കുക',
 'tog-watchlisthidebots' => 'ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽനിന്ന് യന്ത്രങ്ങൾ വരുത്തിയ തിരുത്തലുകൾ മറയ്ക്കുക',
@@ -449,7 +449,7 @@ $messages = array(
 'category-empty' => "''ഈ വർഗ്ഗത്തിൽ താളുകളോ പ്രമാണങ്ങളോ ഇല്ല.''",
 'hidden-categories' => '{{PLURAL:$1|മറഞ്ഞിരിക്കുന്ന വർഗ്ഗം|മറഞ്ഞിരിക്കുന്ന വർഗ്ഗങ്ങൾ}}',
 'hidden-category-category' => 'മറഞ്ഞിരിക്കുന്ന വർഗ്ഗങ്ങൾ',
-'category-subcat-count' => '{{PLURAL:$2|ഈ വർഗ്ഗത്തിനു്‌ താഴെ നൽകിയിരിക്കുന്ന ഒരു ഉപവർഗ്ഗം മാത്രമാണുള്ളത്.|ഈ വർഗ്ഗത്തിനു്‌ $2 ഉപവർഗ്ഗങ്ങളുള്ളതിൽ {{PLURAL:$1|ഒരെണ്ണം|$1 എണ്ണം}} താഴെ നൽകിയിരിക്കുന്നു.}}',
+'category-subcat-count' => '{{PLURAL:$2|ഈ വർഗ്ഗത്തിനു താഴെ നൽകിയിരിക്കുന്ന ഒരു ഉപവർഗ്ഗം മാത്രമാണുള്ളത്.|ഈ വർഗ്ഗത്തിന് ആകെ $2 ഉപവർഗ്ഗങ്ങൾ ഉള്ളതിൽ {{PLURAL:$1|ഒരു ഉപവർഗ്ഗം|$1 ഉപവർഗ്ഗങ്ങൾ}}, താഴെക്കൊടുത്തിരിക്കുന്നു.}}',
 'category-subcat-count-limited' => 'ഈ വർഗ്ഗത്തിനു താഴെ നൽകിയിരിക്കുന്ന {{PLURAL:$1|ഉപവർഗ്ഗമുണ്ട്|$1 ഉപവർഗ്ഗങ്ങളുണ്ട്}}.',
 'category-article-count' => '{{PLURAL:$2|ഈ വർഗ്ഗത്തിൽ താഴെ നൽകിയിരിക്കുന്ന ഒരു താൾ മാത്രമാണുള്ളത്.|ഈ വർഗ്ഗത്തിൽ $2 താളുകളുള്ളതിൽ {{PLURAL:$1|ഒരു താൾ|$1 എണ്ണം}} താഴെ നൽകിയിരിക്കുന്നു.}}',
 'category-article-count-limited' => 'ഈ വർഗ്ഗത്തിൽ താഴെ നൽകിയിരിക്കുന്ന {{PLURAL:$1|ഒരു താൾ ഉണ്ട്|$1 താളുകൾ ഉണ്ട്}}.',
@@ -2470,9 +2470,9 @@ $UNWATCHURL
 '''$1''' എന്ന താളിന്റെ നിലവിലുള്ള ക്രമീകരണങ്ങൾ ഇതാ:",
 'protect-cascadeon' => 'ഈ താൾ നിർഝരിതസംരക്ഷിതമായ (cascading protection) {{PLURAL:$1|ഒരു താളിൽ|പല താളുകളിൽ}} ഉൾപ്പെടുത്തപ്പെടുത്തപ്പെട്ടിരിക്കുന്നതിനാൽ ഇത് സംരക്ഷിത താളാണ്. എന്നാൽ താങ്കൾക്ക് ഈ താളിന്റെ സംരക്ഷണമാനം മാറ്റുവാൻ കഴിയും, അങ്ങനെ ചെയ്താൽ നിർഝരിതസംരക്ഷണത്തിനു മാറ്റം വരികയില്ല.',
 'protect-default' => 'എല്ലാ ഉപയോക്താക്കളെയും അനുവദിക്കുക',
-'protect-fallback' => '"$1" à´\85à´¨àµ\81വാദà´\82 à´\86വശàµ\8dയമാണàµ\8dâ\80\8c',
-'protect-level-autoconfirmed' => 'à´\85à´\82à´\97à´¤àµ\8dവമàµ\86à´\9fàµ\81à´\95àµ\8dà´\95ാതàµ\8dà´¤ à´\89പയàµ\8bà´\95àµ\8dതാà´\95àµ\8dà´\95à´³àµ\86 à´¤à´\9fà´¯àµ\81à´\95',
-'protect-level-sysop' => 'സിസàµ\8bà´ªàµ\8dà´ªàµ\81à´\95ൾ à´®à´¾à´¤àµ\8dà´°à´\82',
+'protect-fallback' => '"$1" à´\85à´¨àµ\81വാദമàµ\81à´³àµ\8dà´³ à´\89പയàµ\8bà´\95àµ\8dതാà´\95àµ\8dà´\95à´³àµ\86 à´®à´¾à´¤àµ\8dà´°à´\82 à´\85à´¨àµ\81വദിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81',
+'protect-level-autoconfirmed' => 'à´¸àµ\8dഥിരàµ\80à´\95à´°à´¿à´\95àµ\8dà´\95à´ªàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9f à´\89പയàµ\8bà´\95àµ\8dതാà´\95àµ\8dà´\95à´³àµ\86 à´®à´¾à´¤àµ\8dà´°à´\82 à´\85à´¨àµ\81വദിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81',
+'protect-level-sysop' => 'സിസàµ\8bà´ªàµ\8dà´ªàµ\81à´\95à´³àµ\86 à´®à´¾à´¤àµ\8dà´°à´\82 à´\85à´¨àµ\81വദിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81',
 'protect-summary-cascade' => 'നിർഝരിതം',
 'protect-expiring' => 'കാലാവധി തീരുന്നത് - $1 (UTC)',
 'protect-expiring-local' => '$1-നു കാലഹരണപ്പെടുന്നു',
@@ -2765,8 +2765,7 @@ $1',
 # Move page
 'move-page' => '$1 മാറ്റുക',
 'move-page-legend' => 'താൾ മാറ്റുക',
-'movepagetext' => "താഴെയുള്ള ഫോം ഒരു താളിനെ പുനർനാമകരണം ചെയ്യാനുള്ളതാണ്.
-താളിന്റെ പഴയരൂപങ്ങളും ഈ മാറ്റത്തിന് വിധേയമാക്കപ്പെടും.
+'movepagetext' => "താഴെയുള്ള ഫോം ഒരു താളിനെ പുനർനാമകരണം ചെയ്യാനുള്ളതാണ്, താളിന്റെ നാൾവഴിയും അക്കൂടെ പുതിയ പേരിലേയ്ക്ക് മാറുന്നതാണ്.
 പഴയ തലക്കെട്ട്, പുതിയ തലക്കെട്ടുള്ള താളിലേക്കുള്ള ഒരു തിരിച്ചുവിടൽ താളായി മാറും.
 പഴയ തലക്കെട്ടിലേക്കുള്ള തിരിച്ചുവിടലുകൾ യന്ത്രങ്ങൾ ഉപയോഗിച്ച് താങ്കൾക്ക് ശരിയാക്കാവുന്നതാണ്.
 അങ്ങനെ വേണ്ട എന്നാണ് താങ്കളാഗ്രഹിക്കുന്നതെങ്കിൽ [[Special:DoubleRedirects|ഇരട്ട തിരിച്ചുവിടലുകളോ]], [[Special:BrokenRedirects|ഫലപ്രദമല്ലാത്ത തിരിച്ചുവിടലുകളോ]] ഉണ്ടാകുന്നുണ്ടോയെന്ന് ദയവായി പരിശോധിക്കുക.
index aa0f6fa..a42c163 100644 (file)
@@ -43,6 +43,7 @@
  * @author कोल्हापुरी
  * @author प्रणव कुलकर्णी
  * @author शࣿरीहरि
+ * @author संतोष दहिवळ
  */
 
 $namespaceNames = array(
@@ -453,6 +454,7 @@ $messages = array(
 'newwindow' => '(नवीन खिडकीत उघडते.)',
 'cancel' => 'खोडा',
 'moredotdotdot' => 'अजून...',
+'morenotlisted' => 'आणखी यादीत नाही...',
 'mypage' => 'माझे पान',
 'mytalk' => 'माझ्या चर्चा',
 'anontalk' => 'या अंकपत्त्याचे चर्चा पान उघडा',
@@ -699,6 +701,9 @@ $2',
 'ns-specialprotected' => 'विशेष पाने संपादित करता येत नाहीत.',
 'titleprotected' => "या शीर्षकाचे पान सदस्य [[User:$1|$1]]ने निर्मीत करण्यापासून सुरक्षित केलेले आहे.
 ''$2'' हे कारण नमूद केलेले आहे.",
+'invalidtitle-knownnamespace' => '"$2" नामविश्वात "$3" हे अयोग्य शीर्षक',
+'exception-nologin' => 'प्रवेश केलेला नाही',
+'exception-nologin-text' => 'हे करण्यासाठी आपल्याला या विकिवर सदस्यनावाने प्रवेश करायला हवा.',
 
 # Virus scanner
 'virus-badscanner' => "चुकीचे कॉन्फिगरेशन: व्हायरस स्कॅनर अनोळखी: ''$1''",
@@ -710,12 +715,16 @@ $2',
 
 तुम्ही अनामिकपणे {{SITENAME}}चा उपयोग करत राहू शकता, किंवा त्याच अथवा वेगळ्या सदस्य नावाने <span class='plainlinks'>[$1  पुन्हा दाखल होऊ शकता]</span>.
 आपण स्वत:च्या न्याहाळकाची सय (cache) रिकामी करत नाही तो पर्यंत काही पाने आपण अजून दाखल आहात, असे नुसतेच दाखवत राहू शकतील.",
+'welcomeuser' => 'स्वागत, $1!',
+'welcomecreation-msg' => 'तुमचे खाते उघडण्यात आले आहे.
+आपल्या [[Special:Preferences|{{SITENAME}} पसंती]] बदलण्यास विसरू नका.',
 'yourname' => 'तुमचे नाव',
 'yourpassword' => 'तुमचा परवलीचा शब्द',
 'yourpasswordagain' => 'तुमचा परवलीचा शब्द पुन्हा लिहा',
 'remembermypassword' => 'माझा प्रवेश या संगणकावर लक्षात ठेवा (जास्तीत जास्त $1 {{PLURAL:$1|दिवस|दिवसांसाठी}})',
 'securelogin-stick-https' => 'प्रवेशानंतर एचटीटीपीएसच्या संपर्कात रहा',
 'yourdomainname' => 'तुमचे क्षेत्र (डॉमेन) :',
+'password-change-forbidden' => 'तुम्ही या विकिवर तुमचा संकेतशब्द बदलू शकत नाही.',
 'externaldberror' => 'विदागार ’खातरजमा’ (प्रमाणितीकरण) त्रुटी होती अथवा तुम्हाला तुमचे बाह्य खाते अद्ययावत  करण्याची परवानगी नाही.',
 'login' => 'प्रवेश करा',
 'nav-login-createaccount' => 'सदस्य प्रवेश',
@@ -777,6 +786,7 @@ $2',
 'emailconfirmlink' => 'आपला ई-मेल पत्ता तपासून पहा.',
 'invalidemailaddress' => 'तुम्ही दिलेला ई-मेल पत्ता चुकीचा आहे, कारण तो योग्यप्रकारे लिहिलेला नाही. कृपया योग्यप्रकारे ई-मेल पत्ता लिहा अथवा ती जागा मोकळी सोडा.',
 'cannotchangeemail' => 'या विकीवर खात्याचा ईमेल बदलता येत नाही',
+'emaildisabled' => 'हे संकेतस्थळ विपत्र पाठवू शकत नाही.',
 'accountcreated' => 'खाते उघडले.',
 'accountcreatedtext' => '$1 चे सदस्यखाते उघडले.',
 'createaccount-title' => '{{SITENAME}} साठीची सदस्य नोंदणी',
@@ -848,6 +858,7 @@ $2',
 'changeemail-oldemail' => 'सध्याचा ईमेल पत्ता :',
 'changeemail-newemail' => 'नवा ईमेल पत्ता:',
 'changeemail-none' => '(दिलेला नाही)',
+'changeemail-password' => 'तुमचा {{SITENAME}} संकेतांक:',
 'changeemail-submit' => 'ईमेल बदला',
 'changeemail-cancel' => 'रद्द करा',
 
@@ -1021,6 +1032,12 @@ $2',
 'edit-already-exists' => 'नवीन पान तयार करता येऊ शकले नाही.
 या नावाचे पान आधीच अस्तित्वात आहे.',
 
+# Content models
+'content-model-wikitext' => 'विकिमजकूर',
+'content-model-text' => 'सामान्य मजकूर',
+'content-model-javascript' => 'जावास्क्रिप्ट',
+'content-model-css' => 'सीएसएस',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => '”’इशारा:”’ या पानावर खूप सारे खर्चिक पृथक्करण क्रिया कॉल्स आहेत.
 
@@ -1747,6 +1764,7 @@ $1',
 'backend-fail-notsame' => ' $1 येथे यापेक्षा विभिन्न असलेली संचिका पूर्वीच विद्यमान आहे',
 'backend-fail-invalidpath' => '$1 हा वैध संग्राहक-पथ नाही.',
 'backend-fail-delete' => '$1 ही संचिका (फाईल) बनवता आली नाही.',
+'backend-fail-describe' => '"$1" या संचिकेसाठी आपण मेटाडाटा बदलू शकत नाही.',
 'backend-fail-alreadyexists' => '$1 ही संचिका अगोदरच अस्तित्वात आहे.',
 'backend-fail-store' => '$1 ही संचिका $2मधे साठवू शकत नाही.',
 'backend-fail-copy' => '"$1" संचिकेची "$2" ही प्रत करता आली नाही.',
@@ -1887,6 +1905,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'uploadnewversion-linktext' => 'या संचिकेची नवीन आवृत्ती चढवा',
 'shared-repo-from' => '$1 पासून',
 'shared-repo' => 'एक मुक्त कोश',
+'upload-disallowed-here' => 'या संचिकेवर आपण पुनर्लिखाण करु शकत नाही.',
 
 # File reversion
 'filerevert' => '$1 पूर्वपद',
@@ -1991,6 +2010,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|बाइट|बाइट}}',
 'ncategories' => '$1 {{PLURAL:$1|वर्ग|वर्ग}}',
+'ninterwikis' => '$1 {{PLURAL:$1|आंतरविकि|आंतरविकि दुवे}}',
 'nlinks' => '$1 {{PLURAL:$1|दुवा|दुवे}}',
 'nmembers' => '$1 {{PLURAL:$1|सदस्य|सदस्य}}',
 'nrevisions' => '$1 {{PLURAL:$1|आवर्तन|आवर्तने}}',
@@ -2019,6 +2039,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'mostlinkedtemplates' => 'सर्वाधिक जोडलेले साचे',
 'mostcategories' => 'सर्वाधिक वर्गीकृत पाने',
 'mostimages' => 'सर्वाधिक जोडलेली चित्रे',
+'mostinterwikis' => 'सर्वाधिक आंतरविकि दुवे असणारी पाने',
 'mostrevisions' => 'सर्वाधिक बदललेले लेख',
 'prefixindex' => 'उपसर्ग असणाऱ्या लेखांची यादी',
 'prefixindex-namespace' => '($1 नामविश्व) हा  उपसर्ग असणारी सर्व पाने',
@@ -2087,6 +2108,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'allpagesprefix' => 'पुढील शब्दाने सुरू होणारी पाने दाखवा:',
 'allpagesbadtitle' => 'दिलेले शीर्षक चुकीचे किंवा आंतरभाषीय किंवा आंतरविकि शब्दाने सुरू होणारे होते. त्यात एक किंवा अधिक शीर्षकात न वापरता येणारी अक्षरे असावीत.',
 'allpages-bad-ns' => '{{SITENAME}}मध्ये "$1" हे नामविश्व नाही.',
+'allpages-hide-redirects' => 'पुनर्निर्देशने लपवा',
 
 # SpecialCachedPage
 'cachedspecial-refresh-now' => 'आखेरचे दृश्य',
@@ -2153,6 +2175,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'mailnologin' => 'पाठविण्याचा पत्ता नाही',
 'mailnologintext' => 'इतर सदस्यांना विपत्र(ई-मेल) पाठवण्याकरिता तुम्ही [[Special:UserLogin|प्रवेश केलेला]] असणे आणि  प्रमाणित (ई-मेल) पत्ता तुमच्या [[Special:Preferences|पसंतीत]] नमुद असणे आवश्यक आहे.',
 'emailuser' => 'या सदस्याला ई-मेल पाठवा',
+'emailuser-title-target' => '{{GENDER:$1|सदस्याला}} विपत्र पाठवा',
 'emailuser-title-notarget' => 'विपत्र (ईमेल) उपयोगकर्ता',
 'emailpage' => 'विपत्र (ईमेल) उपयोगकर्ता',
 'emailpagetext' => 'जर या सदस्याने प्रमाणित विपत्र (ईमेल)पत्ता तीच्या अथवा त्याच्या सदस्य पसंतीत नमुद केला असेल,तर खालील सारणी तुम्हाला एक(च) संदेश पाठवेल.तुम्ही तुमच्या [[Special:Preferences|सदस्य पसंतीत]] नमुद केलेला विपत्र पत्ता "कडून" पत्त्यात येईल म्हणजे  प्राप्तकरता आपल्याला उत्तर देऊ शकेल.',
@@ -2224,6 +2247,11 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'enotif_mailer' => '{{SITENAME}} सूचना विपत्र',
 'enotif_reset' => 'सर्व पानास भेट दिल्याचे नमुद करा',
 'enotif_impersonal_salutation' => '{{SITENAME}} सदस्य',
+'enotif_subject_deleted' => '{{SITENAME}} पानाला $1 {{gender:$2|$2}} ने वगळले',
+'enotif_subject_created' => '{{SITENAME}} पान $1  {{gender:$2|$2}} ने तयार केले',
+'enotif_subject_moved' => '{{SITENAME}}पान $1  {{gender:$2|$2}} ने हलविले',
+'enotif_subject_restored' => '{{SITENAME}} पान $1  {{gender:$2|$2}} ने पुनर्स्थापित केले',
+'enotif_subject_changed' => '{{SITENAME}} पान $1  {{gender:$2|$2}} ने बदलले',
 'enotif_lastvisited' => 'तुमच्या शेवटच्या भेटीनंतरचे बदल बघणयासाठी पहा - $1.',
 'enotif_lastdiff' => 'हा बदल पहाण्याकरिता $1 पहा.',
 'enotif_anon_editor' => 'अनामिक उपयोगकर्ता $1',
@@ -2292,6 +2320,8 @@ $UNWATCHURL
 'rollback' => 'बदल वेगात माघारी न्या',
 'rollback_short' => 'द्रुतमाघार',
 'rollbacklink' => 'द्रुतमाघार',
+'rollbacklinkcount' => 'उलटवा $1 {{PLURAL:$1|संपादन|संपादने}}',
+'rollbacklinkcount-morethan' => '$1 पेक्षा अधिक उलटवा {{PLURAL:$1|संपादन|संपादने}}',
 'rollbackfailed' => 'द्रूतमाघार फसली',
 'cantrollback' => 'जुन्या आवृत्तीकडे परतवता येत नाही; शेवटचा संपादक या पानाचा एकमात्र लेखक आहे.',
 'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|Talk]] [[Special:Contributions/$2|{{int:contribslink}}]])चे शेवटाचे [[:$1]]वे संपादन माघारी परतवता येत नाही; पान आधीच कुणी माघारी परतवले आहे किंवा संपादीत केले आहे.
@@ -2318,6 +2348,8 @@ $UNWATCHURL
 'prot_1movedto2' => '"[[$1]]" हे पान "[[$2]]" मथळ्याखाली स्थानांतरित केले.',
 'protect-badnamespace-title' => 'असुरक्षणीय नामविश्व',
 'protect-badnamespace-text' => 'या नामविश्वातील पाने सुरक्षीत करता येत नाहीत',
+'protect-norestrictiontypes-text' => 'हे पान सुरक्षित होऊ शकत नाही कारण कोणताही सुरक्षापातळी प्रकार उपलब्ध नाही.',
+'protect-norestrictiontypes-title' => 'सुरक्षापातळी नसलेले पान',
 'protect-legend' => 'सुरक्षापातळीतील बदल निर्धारित करा',
 'protectcomment' => 'कारण:',
 'protectexpiry' => 'संपण्याचा कालावधी:',
@@ -2927,10 +2959,26 @@ $1',
 'pageinfo-header-basic' => 'मूलभूत माहिती',
 'pageinfo-header-edits' => 'संपादने',
 'pageinfo-header-restrictions' => 'पान सुरक्षा',
+'pageinfo-header-properties' => 'पानाची माहिती',
+'pageinfo-display-title' => 'दृश्य शीर्षक',
+'pageinfo-length' => 'पानाचा आकार (बाइट्समध्ये)',
+'pageinfo-language' => 'पानाच्या मजकूराची भाषा',
 'pageinfo-views' => 'अभिप्रायांची संख्या',
 'pageinfo-watchers' => 'पाहणाऱ्यांची संख्या',
+'pageinfo-redirects-name' => 'या पानाकडील पुनर्निर्देशने',
+'pageinfo-firsttime' => 'पान निर्मितीचा दिनांक',
+'pageinfo-lastuser' => 'अलीकडील संपादक',
+'pageinfo-lasttime' => 'अलीकडिल संपादनाचा दिनांक',
 'pageinfo-edits' => 'संपादनांची संख्या',
 'pageinfo-authors' => 'वेगळ्या लेखकांची संख्या',
+'pageinfo-toolboxlink' => 'पानाची माहिती',
+'pageinfo-redirectsto-info' => 'माहिती',
+'pageinfo-contentpage-yes' => 'होय',
+'pageinfo-protect-cascading-yes' => 'होय',
+'pageinfo-category-info' => 'वर्ग माहिती',
+'pageinfo-category-pages' => 'पानांची संख्या',
+'pageinfo-category-subcats' => 'उपवर्गांची संख्या',
+'pageinfo-category-files' => 'संचिकांची संख्या',
 
 # Skin names
 'skinname-standard' => 'अभिजात',
@@ -2984,6 +3032,7 @@ $1',
 'file-info-size-pages' => '$1 × $2 पिक्सेल, संचिका आकारमान: $3, एमआयएमई प्रकार: $4, $5 {{PLURAL:$5|पान|पाने}}',
 'file-nohires' => 'यापेक्षा मोठे चित्र उपलब्ध नाही.',
 'svg-long-desc' => 'SVG संचिका, साधारणपणे $1 × $2 pixels, संचिकेचा आकार: $3',
+'svg-long-error' => 'अयोग्य SVG प्रकारातील संचिका: $1',
 'show-big-image' => 'संपूर्ण रिजोल्यूशन',
 'show-big-image-preview' => 'या झलकेचा आकार: $1. पिक्सेल',
 'show-big-image-other' => 'इतर {{PLURAL:$2|resolution|resolutions}}: $1.',
@@ -3015,7 +3064,10 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 मिनिट|$1 मिनिट}}',
 'hours' => '{{PLURAL:$1|$1 तास|$1 तास}}',
 'days' => '{{PLURAL:$1|$1 दिवस|$1 दिवस}}',
+'months' => '{{PLURAL:$1|$1 महिना|$1 महिने}}',
+'years' => '{{PLURAL:$1|$1 वर्ष|$1 वर्षे}}',
 'ago' => '$1 पूर्वी',
+'just-now' => 'लगेच',
 
 # Bad image list
 'bad_image_list' => 'रूपरेषा खालीलप्रमाणे आहे:
@@ -3755,6 +3807,7 @@ $5
 'logentry-newusers-create2' => '$1  ने  सदस्य खाते $3  निर्मित केले  आहे.',
 'logentry-newusers-autocreate' => '$1  खाते स्वयमेव निर्मित झाले आहे.',
 'newuserlog-byemail' => 'परवलीचा शब्द ई-मेल मार्फत पाठविलेला आहे',
+'logentry-rights-rights-legacy' => '$1 ने $3 चे ग्रुप सदस्यत्व बदलले',
 'rightsnone' => '(काहीही नाही)',
 
 # Feedback
index 0d6ac5e..243b3b2 100644 (file)
@@ -223,7 +223,7 @@ $messages = array(
 'tog-externaleditor' => 'Utamakan penyunting luar (hanya untuk pakar, perlu tetapan khas pada komputer anda. [//www.mediawiki.org/wiki/Manual:External_editors Maklumat lanjut.])',
 'tog-externaldiff' => 'Utamakan pembeza luar (hanya untuk pakar, perlu tetapan khas pada komputer anda. [//www.mediawiki.org/wiki/Manual:External_editors Maklumat lanjut.])',
 'tog-showjumplinks' => 'Bolehkan pautan ketercapaian "lompat ke"',
-'tog-uselivepreview' => 'Gunakan pralihat langsung (memerlukan JavaScript)',
+'tog-uselivepreview' => 'Gunakan pralihat langsung (JavaScript) (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',
index 2eac463..421949f 100644 (file)
@@ -894,11 +894,13 @@ Your e-mail address is not revealed when other users contact you.
 'right-userrights-interwiki' => 'အခြားဝီကီများမှ အသုံးပြုသူများ၏ အသုံးပြုသူအခွင့်အရေးများကို တည်းဖြတ်ရန်',
 'right-sendemail' => 'အခြားအသုံးပြုသူများကို အီးမေးပို့ရန်',
 
+# Special:Log/newusers
+'newuserlogpage' => 'အသုံးပြုသူအသစ်ရောက်လာခြင်း မှတ်တမ်း',
+'newuserlogpagetext' => 'ဤသည်မှာ အသုံးပြုသူအသစ် ဖတ်တီးမှု မှတ်တမ်း ဖြစ်သည်။',
+
 # User rights log
 'rightslog' => 'အသုံးပြုသူ၏ အခွင့်အရေးများ မှတ်တမ်း',
 'rightslogtext' => 'ဤသည်မှာ အသုံးပြုသူအခွင့်အရေးများ၏ ပြောင်းလဲမှုများမှတ်တမ်းဖြစ်သည်။',
-'rightslogentry' => '$1 အတွက် အုပ်စုအသင်ဝင်ဖြစ်မှုကို အုပ်စု $2 မှ အုပ်စု $3 သို့ ပြောင်းလဲပြီး',
-'rightsnone' => '(ဘာမှမရှိ)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'ဤစာမျက်နှာကို ဖတ်ရန်',
@@ -1261,10 +1263,6 @@ Your e-mail address is not revealed when other users contact you.
 'activeusers-hidesysops' => 'အက်ဒမင်များကို ဝှက်ရန်',
 'activeusers-noresult' => 'အသုံးပြုသူ မတွေ့ပါ။',
 
-# Special:Log/newusers
-'newuserlogpage' => 'အသုံးပြုသူအသစ်ရောက်လာခြင်း မှတ်တမ်း',
-'newuserlogpagetext' => 'ဤသည်မှာ အသုံးပြုသူအသစ် ဖတ်တီးမှု မှတ်တမ်း ဖြစ်သည်။',
-
 # Special:ListGroupRights
 'listgrouprights' => 'အသုံးပြုသူအုပ်စု အခွင့်အရေးများ',
 'listgrouprights-group' => 'အုပ်စု',
@@ -1320,6 +1318,8 @@ Your e-mail address is not revealed when other users contact you.
 
 'enotif_impersonal_salutation' => '{{SITENAME}} အသုံးပြုသူ',
 'enotif_anon_editor' => 'အမည်မသိ အသုံးပြုသူ $1',
+'created' => 'ဖန်တီးလိုက်သည်',
+'changed' => 'ပြောင်းလဲလိုက်သည်',
 
 # Delete
 'deletepage' => 'စာမျက်နှာကိုဖျက်ပါ',
@@ -1909,6 +1909,7 @@ Your e-mail address is not revealed when other users contact you.
 'revdelete-restricted' => 'အက်ဒမင်များသို့ ကန့်သတ်ချက်များ သက်ရောက်ရန်',
 'revdelete-unrestricted' => 'အက်ဒမင်များအတွက် ကန့်သတ်ချက်များကို ဖယ်ရှားရန်',
 'newuserlog-byemail' => 'စကားဝှက်ကို အီးမေးဖြင့် ပို့လိုက်ပါပြီ။',
+'rightsnone' => '(ဘာမှမရှိ)',
 
 # API errors
 'api-error-filename-tooshort' => 'ဖိုင်အမည်သည် တိုလွန်းသည်။',
index 239339b..e464a70 100644 (file)
@@ -739,7 +739,6 @@ Intlā ticnequi, tlācah quimatīzqueh motequi.',
 
 # User rights log
 'rightslog' => 'Tlatequitiltilīlli huelītiliztli tlahcuilōlloh',
-'rightsnone' => 'ahtlein',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'ticpōhuāz inīn zāzanilli',
@@ -1058,6 +1057,8 @@ $UNWATCHURL
 
 Tētlamachītīliztli īhuān oc yeh tēpalehuiliztli:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'ōmochīuh',
+'changed' => 'ōmotlacuep',
 
 # Delete
 'deletepage' => 'Ticpolōz inīn zāzanilli',
@@ -1503,6 +1504,9 @@ Niman tihuelīti [[Special:UserLogin|timocalaqui]] auh ticpactiāz huiquitica.',
 # HTML forms
 'htmlform-selectorother-other' => 'Occē',
 
+# New logging system
+'rightsnone' => 'ahtlein',
+
 # Search suggestions
 'searchsuggest-search' => 'Tlatēmoliztli',
 
index 44266cf..89ca035 100644 (file)
@@ -449,6 +449,7 @@ $messages = array(
 'newwindow' => '(åpnes i et nytt vindu)',
 'cancel' => 'Avbryt',
 'moredotdotdot' => 'Mer …',
+'morenotlisted' => 'Mer som ikke er oppført&nbsp;…',
 'mypage' => 'Min brukerside',
 'mytalk' => 'Min diskusjonsside',
 'anontalk' => 'Brukerdiskusjon for denne IP-adressen',
@@ -513,7 +514,7 @@ $messages = array(
 'unprotectthispage' => 'Endre beskyttelsen av denne siden',
 'newpage' => 'Ny side',
 'talkpage' => 'Diskuter denne siden',
-'talkpagelinktext' => 'Diskusjon',
+'talkpagelinktext' => 'diskusjon',
 'specialpage' => 'Spesialside',
 'personaltools' => 'Personlige verktøy',
 'postcomment' => 'Ny seksjon',
@@ -819,6 +820,7 @@ Du kan ignorere denne beskjeden dersom kontoen ble opprettet ved en feil.',
 # E-mail sending
 'php-mail-error-unknown' => 'Ukjent feil i PHPs mail()-funksjon',
 'user-mail-no-addy' => 'Forsøkte å sende e-post uten e-postadresse',
+'user-mail-no-body' => 'Prøvde å sende e-post med tom eller for kort brødtekst.',
 
 # Change password dialog
 'resetpass' => 'Endre passord',
@@ -885,6 +887,7 @@ Midlertidig passord: $2',
 'changeemail-oldemail' => 'Nåværende e-postadresse:',
 'changeemail-newemail' => 'Ny e-postadresse:',
 'changeemail-none' => '(ingen)',
+'changeemail-password' => 'Ditt passord på {{SITENAME}}:',
 'changeemail-submit' => 'Endre e-post',
 'changeemail-cancel' => 'Avbryt',
 
@@ -1461,9 +1464,9 @@ Dette kan ikke tilbakestilles.',
 'prefs-emailconfirm-label' => 'E-postbekreftelse:',
 'prefs-textboxsize' => 'Størrelse på redigeringsvindu',
 'youremail' => 'E-post:',
-'username' => 'Brukernavn:',
-'uid' => 'Bruker-ID:',
-'prefs-memberingroups' => 'Medlem i følgende {{PLURAL:$1|gruppe|grupper}}:',
+'username' => '{{GENDER:$1|Brukernavn}}:',
+'uid' => '{{GENDER:$1|Bruker-ID}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Medlem}} i følgende {{PLURAL:$1|gruppe|grupper}}:',
 'prefs-registration' => 'Registreringstid:',
 'yourrealname' => 'Virkelig navn:',
 'yourlanguage' => 'Språk:',
@@ -2241,7 +2244,7 @@ Se også [[Special:WantedCategories|ønskede kategorier]].',
 'linksearch-ok' => 'Søk',
 'linksearch-text' => 'Jokertegn slik som i «*.wikipedia.org» kan brukes.
 Det kreves at det oppgis minst et toppnivådomene, for eksempel «*.org».<br />
-Støttede protokoller: <code>$1</code> (ikke legg til noen av disse i søket ditt).',
+{{PLURAL:$2|Støttede protokoller}}: <code>$1</code> (ikke legg til noen av disse i søket ditt).',
 'linksearch-line' => '$1 lenkes fra $2',
 'linksearch-error' => 'Jokertegn kan kun brukes foran tjenernavnet.',
 
@@ -2325,8 +2328,8 @@ E-postadressen du har satt i [[Special:Preferences|innstillingene dine]] vil vis
 'watchnologin' => 'Ikke logget inn',
 'watchnologintext' => 'Du må være [[Special:UserLogin|logget inn]] for å kunne endre overvåkningslisten.',
 'addwatch' => 'Legg til i overvåkningslisten',
-'addedwatchtext' => "Siden «[[:$1]]» er lagt til [[Special:Watchlist|overvåkningslisten]].
-Fremtidige endringer til denne siden og den tilhørende diskusjonssiden blir listet opp her, og siden vil fremstå '''uthevet''' i [[Special:RecentChanges|listen over siste endringer]] for å gjøre det lettere å finne den.",
+'addedwatchtext' => 'Siden «[[:$1]]» er lagt til [[Special:Watchlist|overvåkningslisten]] din.
+Fremtidige endringer til denne siden og den tilhørende diskusjonssiden blir listet opp der.',
 'removewatch' => 'Fjern fra overvåkningslisten',
 'removedwatchtext' => 'Siden «[[:$1]]» er fjernet fra [[Special:Watchlist|overvåkningslisten din]].',
 'watch' => 'Overvåk',
@@ -2360,7 +2363,7 @@ Fremtidige endringer til denne siden og den tilhørende diskusjonssiden blir lis
 'enotif_subject_moved' => '{{SITENAME}}-siden $1 har blitt flyttet av {{gender:$2|$2}}',
 'enotif_subject_restored' => '{{SITENAME}}-siden $1 har blitt gjenopprettet av {{gender:$2|$2}}',
 'enotif_subject_changed' => '{{SITENAME}}-siden $1 har blitt endret av {{gender:$2|$2}}',
-'enotif_body_intro_deleted' => '{{SITENAME}}-siden $1 ble slettet $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.',
+'enotif_body_intro_deleted' => '{{SITENAME}}-siden $1 ble slettet $PAGEEDITDATE av {{gender:$2|$2}}; se $3.',
 'enotif_body_intro_created' => '{{SITENAME}}-siden $1 ble opprettet $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.',
 'enotif_body_intro_moved' => '{{SITENAME}}-siden $1 ble flyttet $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.',
 'enotif_body_intro_restored' => '{{SITENAME}}-siden $1 ble gjenopprettet $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.',
@@ -2462,6 +2465,8 @@ Se [[Special:ProtectedPages|listen over beskyttede sider]] for listen over gjeld
 'prot_1movedto2' => '[[$1]] flyttet til [[$2]]',
 'protect-badnamespace-title' => 'Navnerom som ikke kan beskyttes',
 'protect-badnamespace-text' => 'Sider i dette navnerommet kan ikke beskyttes.',
+'protect-norestrictiontypes-text' => 'Denne siden kan ikke beskyttes fordi det ikke er noen tilgjengelige begrensningstyper.',
+'protect-norestrictiontypes-title' => 'Ubeskyttbar side',
 'protect-legend' => 'Bekreft låsing',
 'protectcomment' => 'Årsak:',
 'protectexpiry' => 'Utløper:',
@@ -2476,9 +2481,9 @@ Dette er de nåværende innstillingene for siden '''$1''':",
 'protect-cascadeon' => 'Denne siden er for tiden beskyttet fordi den er inkludert på følgende {{PLURAL:$1|side|sider}} som har dypbeskyttelse slått på.
 Du kan endre sidens beskyttelsesnivå, men det vil ikke påvirke dypbeskyttelsen.',
 'protect-default' => 'Tillat alle brukere',
-'protect-fallback' => 'Må ha «$1»-tillatelse',
-'protect-level-autoconfirmed' => 'Blokker uregistrerte og nye brukere',
-'protect-level-sysop' => 'Kun administratorer',
+'protect-fallback' => 'Tillat kun brukere med tillatelsen «$1»',
+'protect-level-autoconfirmed' => 'Tillat kun autobekreftede brukere',
+'protect-level-sysop' => 'Tillat kun administratorer',
 'protect-summary-cascade' => 'dypbeskyttelse',
 'protect-expiring' => 'utløper $1 (UTC)',
 'protect-expiring-local' => 'løper ut $1',
@@ -2953,6 +2958,7 @@ Lagre den på din egen datamaskin og last den opp her.',
 'import-error-interwiki' => 'Siden «$1» ble ikke importert fordi navnet er reservert for ekstern lenking (interwiki).',
 'import-error-special' => 'Siden «$1» ble ikke importert fordi den tilhører et spesialnavnerom som ikke tillater sider.',
 'import-error-invalid' => 'Siden «$1» ble ikke importert fordi navnet er ugyldig.',
+'import-error-unserialize' => 'Revisjon $2 av siden «$1» kunne ikke serialiseres. Det ble rapportert at revisjonen bruker innholdsmodellen $3 serialisert som $4.',
 'import-options-wrong' => 'Feil {{PLURAL:$2|opsjon|opsjoner}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Den angitte grunnsiden har en ugyldig tittel.',
 'import-rootpage-nosubpage' => 'Navnerommet "$1" til grunnsiden tillater ikke undersider.',
@@ -3122,7 +3128,8 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
 'pageinfo-recent-authors' => 'Antall nylige forfattere',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magisk|Magiske}} ord ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Skjult kategori|Skjulte kategorier}} ($1)',
-'pageinfo-templates' => 'Transkludert {{PLURAL:$1|mal|maler}} ($1)',
+'pageinfo-templates' => 'Transkluderte {{PLURAL:$1|mal|maler}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Sider}} transkludert på ($1)',
 'pageinfo-toolboxlink' => 'Sideinformasjon',
 'pageinfo-redirectsto' => 'Omdirigerer til',
 'pageinfo-redirectsto-info' => 'info',
index b877974..cbb1938 100644 (file)
@@ -386,7 +386,7 @@ $messages = array(
 'tog-externaleditor' => 'Standaard een externe tekstbewerker gebruiken (alleen voor experts - voor deze functie zijn speciale instellingen nodig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informatie]).',
 'tog-externaldiff' => 'Standaard een extern vergelijkingsprogramma gebruiken (alleen voor experts - voor deze functie zijn speciale instellingen nodig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informatie]).',
 'tog-showjumplinks' => '"ga naar"-toegankelijkheidskoppelingen inschakelen',
-'tog-uselivepreview' => 'Live voorvertoning gebruiken (vereist JavaScript)',
+'tog-uselivepreview' => '"live voorvertoning" gebruiken (vereist JavaScript – experimenteel)',
 'tog-forceeditsummary' => 'Een melding geven bij een lege bewerkingssamenvatting',
 'tog-watchlisthideown' => 'Eigen bewerkingen op mijn volglijst verbergen',
 'tog-watchlisthidebots' => 'Botbewerkingen op mijn volglijst verbergen',
@@ -2594,9 +2594,9 @@ Dit zijn de huidige instellingen voor de pagina '''$1''':",
 'protect-cascadeon' => "Deze pagina is beveiligd, omdat die in de volgende {{PLURAL:$1|pagina|pagina's}} is opgenomen, die beveiligd {{PLURAL:$1|is|zijn}} met de cascade-optie.
 Het beveiligingsniveau wijzigen heeft geen enkel effect.",
 'protect-default' => 'Toestaan voor alle gebruikers',
-'protect-fallback' => 'Hiervoor is het recht "$1" nodig',
-'protect-level-autoconfirmed' => 'Blokkeren voor nieuwe en anonieme gebruikers',
-'protect-level-sysop' => 'Alleen beheerders',
+'protect-fallback' => 'Alleen gebruikers met het recht "$1" toestaan',
+'protect-level-autoconfirmed' => 'Alleen automatisch bevestigde gebruikers toestaan',
+'protect-level-sysop' => 'Alleen beheerders toestaan',
 'protect-summary-cascade' => 'cascade',
 'protect-expiring' => 'vervalt op $2 om $3 (UTC)',
 'protect-expiring-local' => 'vervalt op $1',
index dea9cf7..5d202e1 100644 (file)
@@ -346,7 +346,7 @@ $messages = array(
 'tog-externaldiff' => 'Bruk eit eksternt skilnadprogram som standard (berre for vidarekomne, krev eit spesielt oppsett på maskina di.
 [//www.mediawiki.org/wiki/Manual:External_editors Meir informasjon.])',
 'tog-showjumplinks' => 'Slå på «gå til»-lenkjer',
-'tog-uselivepreview' => 'Bruk levande førehandsvising (krev JavaScript)',
+'tog-uselivepreview' => 'Bruk levande førehandsvising (eksperimentelt JavaScript)',
 'tog-forceeditsummary' => 'Spør meg når eg ikkje har skrive noko i endringssamandraget',
 'tog-watchlisthideown' => 'Gøym endringane mine i overvakingslista',
 'tog-watchlisthidebots' => 'Gøym endringar gjorde av robotar i overvakingslista',
@@ -803,6 +803,7 @@ Du kan sjå bort frå denne meldinga dersom kontoen vart oppretta med eit uhell.
 # E-mail sending
 'php-mail-error-unknown' => 'Ukjend feil i PHPs mail()-funksjon',
 'user-mail-no-addy' => '↓Prøvde å senda e-post utan e-postadresse',
+'user-mail-no-body' => 'Freista å senda e-post med tom eller urimeleg stutt brødtekst.',
 
 # Change password dialog
 'resetpass' => 'Endra passord',
@@ -1327,7 +1328,7 @@ For å søkja i alle, bruk prefikset ''all:'' (det inkluderer diskusjonssider, m
 'powersearch-ns' => 'Søk i namnerom:',
 'powersearch-redir' => 'Vis omdirigeringar',
 'powersearch-field' => 'Søk etter',
-'powersearch-togglelabel' => 'Haka av:',
+'powersearch-togglelabel' => 'Hak av:',
 'powersearch-toggleall' => 'Alle',
 'powersearch-togglenone' => 'Ingen',
 'search-external' => 'Eksternt søk',
@@ -2423,9 +2424,9 @@ Sjå [[Special:ProtectedPages|lista over verna sider]] for lista over vern som n
 Her er dei noverande innstillingane for sida '''$1''':",
 'protect-cascadeon' => 'Denne sida er verna fordi ho er inkludert på {{PLURAL:$1|den opplista sida|dei opplista sidene}} som har djupvern slått på. Du kan endre på nivået til vernet av denne sida, men det vil ikkje ha innverknad på djupvernet.',
 'protect-default' => 'Tillat alle brukarar',
-'protect-fallback' => 'Må ha «$1»-tilgang',
-'protect-level-autoconfirmed' => 'Blokker nye og uregistrerte brukarar',
-'protect-level-sysop' => 'Berre administratorar',
+'protect-fallback' => 'Berre tillat brukarar med løyvet «$1»',
+'protect-level-autoconfirmed' => 'Berre tillat autostadfeste brukarar',
+'protect-level-sysop' => 'Berre tillat administratorar',
 'protect-summary-cascade' => 'djupvern',
 'protect-expiring' => 'endar $1 (UTC)',
 'protect-expiring-local' => 'endar $1',
@@ -2468,8 +2469,8 @@ Her er dei noverande innstillingane for sida '''$1''':",
 'viewdeletedpage' => 'Sjå sletta sider',
 'undeletepagetext' => '{{PLURAL:$1|Den følgjande sida er sletta, men ho|Dei følgjande $1 sidene er sletta, men dei}} finst enno i arkivet og kan attopprettast. Arkivet blir periodevis sletta.',
 'undelete-fieldset-title' => 'Attenderull endringar',
-'undeleteextrahelp' => "For å attoppretta heile historikken til sida, lat alle boksane vera vera tomme og trykk '''''{{int:undeletebtn}}'''''.
-For å berre attopretta delar av historikken, haka av boksane til dei relevante endringane og trykk '''''{{int:undeletebtn}}'''''.",
+'undeleteextrahelp' => "For å attoppretta heile historikken til sida, lat alle boksane vera tomme og trykk '''''{{int:undeletebtn}}'''''.
+For å berre attopretta delar av historikken, hak av boksane til dei relevante endringane og trykk '''''{{int:undeletebtn}}'''''.",
 'undeleterevisions' => '{{PLURAL:$1|Éin versjon arkivert|$1 versjonar arkiverte}}',
 'undeletehistory' => 'Om du gjenopprettar sida vil alle endringar i historikken også bli gjenoppretta. Dersom ei ny side med same namn er oppretta etter slettinga, vil dei gjenoppretta endringane dukke opp før denne i endringshistorikken.',
 'undeleterevdel' => 'Gjenoppretting kan ikkje utførast om det resulterer i at den øvste endringa delvis vert sletta. I slike tilfelle må du fjerne merkinga av den siste sletta endringa.',
@@ -2514,9 +2515,9 @@ $1',
 # Namespace form on various pages
 'namespace' => 'Namnerom:',
 'invert' => 'Vreng val',
-'tooltip-invert' => 'Haka av boksen for å gøyma endringar på sider i det valde namnerommet (og det tilknytte namnerommet om det er haka av)',
+'tooltip-invert' => 'Hak av boksen for å gøyma endringar på sider i det valde namnerommet (og det tilknytte namnerommet om det er haka av)',
 'namespace_association' => 'Tilknytt namnerom',
-'tooltip-namespace_association' => 'Haka av boksen for at diskusjonssida eller emnenamnerommet knytt til det valde namnerommet skal vera med òg',
+'tooltip-namespace_association' => 'Hak av boksen for at diskusjonssida eller emnenamnerommet knytt til det valde namnerommet skal vera med òg',
 'blanknamespace' => '(Hovud)',
 
 # Contributions
@@ -2621,7 +2622,7 @@ Sjå [[Special:BlockList|blokkeringslista]] for alle blokkeringane.',
 'blocklist-tempblocks' => 'Gøym mellombelse blokkeringar',
 'blocklist-addressblocks' => 'Gøym einskilde IP-blokkeringar',
 'blocklist-rangeblocks' => 'Gøym intervallblokkeringar',
-'blocklist-timestamp' => 'Tidsmerkje',
+'blocklist-timestamp' => 'Tidsmerke',
 'blocklist-target' => 'Mål',
 'blocklist-expiry' => 'Endar',
 'blocklist-by' => 'Blokkerande admin',
@@ -2707,11 +2708,15 @@ IP-adresser som blir automatisk blokkerte er ikkje lista her. Sjå [[Special:Blo
 # Move page
 'move-page' => 'Flytt $1',
 'move-page-legend' => 'Flytt side',
-'movepagetext' => "Ved å bruke skjemaet nedanfor kan du få omdøypt ei side og flytt heile historikken til det nye namnet. Den gamle tittelen vil bli ei omdirigeringsside til den nye tittelen. Lenkjer til den gamle tittelen vil ikkje bli endra. Pass på å sjekke for doble eller dårlege omdirigeringar. Du er ansvarleg for at alle lenkjene stadig peiker dit det er meininga at dei skal peike.
+'movepagetext' => "Ved å bruka skjemaet nedanfor kan du få omdøypt ei side og flytt heile historikken til det nye namnet.
+Den gamle tittelen vil verta ei omdirigeringsside til den nye.
+Du kan oppdatera omdirigeringar som peikar til den opphavlege tittelen automatisk.
+Vel du å ikkje gjera dette, pass på å sjå etter [[Special:DoubleRedirects|doble]] eller [[Special:BrokenRedirects|øydelagde omdirigeringar]].
 
-Merk at sida '''ikkje''' kan flyttast dersom det allereie finst ei side med den nye tittelen. Du kan likevel flytte ei side attende dit ho vart flytt frå dersom du gjer ein feil, så lenge den sida du flytter attende til ikkje er vorten endra sidan flyttinga.
+Merk at sida '''ikkje''' vert flytt dersom det alt finst ei side med den nye tittelen, minder ho er ei omdirigering og ikkje har nokon endringshistorikk. Detter tyder at du kan omdøypa ei side attende til der ho vart omdøypt frå om du gjorde eit mistak, og du kan ikkje skriva over sider som finst.
 
-<b>ÅTVARING!</b> Dette kan vera ei drastisk og uventa endring for ei populær side; ver sikker på at du skjønner konsekvensane av dette før du fortset.",
+'''ÅTVARING!'''
+Dette kan vera ei drastisk og uventa endring for ei populær side; ver viss på at du skjøner konsekvensane av dette før du held fram.",
 'movepagetext-noredirectfixer' => "Nyttar ein skjemaet under får ein døypt om ei side og flytt heile historikken til det nye namnet. 
 Den gamle tittelen vil verta ei omdirigeringsside for den nye tittelen. 
 Pass på å sjå etter [[Special:DoubleRedirects|doble]] eller [[Special:BrokenRedirects|uverksame]] omdirigeringar. 
@@ -2727,7 +2732,7 @@ ver viss på at du skjøner konsekvensane av flyttinga før du held fram.",
 *ei ikkje-tom diskusjonsside alt finst under det nye namnet, eller
 *du fjernar avhakinga i boksen nedanfor.
 
-I desse falla lyt du flytta eller fletta sida manuelt, om ynskeleg.",
+I desse falla lyt du flytta eller fletta sida manuelt, om ynskjeleg.",
 'movearticle' => 'Flytt side:',
 'moveuserpage-warning' => "'''Åtvaring:''' Du er i ferd med å flytta ei brukarside. Merk at berre sida vert flytt og at brukarnamnet '''ikkje''' vert endra.",
 'movenologin' => 'Ikkje innlogga',
@@ -2815,7 +2820,7 @@ Dersom du berre vil ha noverande versjon, kan du også bruke ei lenkje, til døm
 'allmessages' => 'Systemmeldingar',
 'allmessagesname' => 'Namn',
 'allmessagesdefault' => 'Standardtekst',
-'allmessagescurrent' => 'Noverande tekst',
+'allmessagescurrent' => 'Gjeldande meldingstekst',
 'allmessagestext' => 'Dette er ei liste over systemmeldingar i MediaWiki-namnerommet.
 Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//translatewiki.net translatewiki.net] om du ynskjer å bidra til den generelle omsetjinga av MediaWiki.',
 'allmessagesnotsupportedDB' => "Denne sida kan ein ikkje bruka fordi «'''\$wgUseDatabaseMessages'''» er slått av.",
@@ -3054,6 +3059,7 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 'pageinfo-magic-words' => '{{PLURAL:$1|Trylleord}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Løynd kategori|Løynde kategoriar}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Inkludert mal|Inkluderte malar}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Side inkludert|Sider inkluderte}} på ($1)',
 'pageinfo-toolboxlink' => 'Sideinformasjon',
 'pageinfo-redirectsto' => 'Omdirigerer til',
 'pageinfo-redirectsto-info' => 'info',
index 0eca8f6..9c73019 100644 (file)
@@ -647,6 +647,9 @@ Ga re fane ka e-poso ya gago go bašumiši ba bangwe ge ba polela le wena ka yon
 'right-edit' => 'Fetola matlakala',
 'right-move' => 'Huduša matlakala',
 
+# Special:Log/newusers
+'newuserlogpage' => '"Log" yago hlola mošumiši',
+
 # User rights log
 'rightslog' => "''log'' ya ditumello tša mošomiši",
 
@@ -863,9 +866,6 @@ Matlakala ago ba [[Special:Watchlist|lenanong la gago la matlakala ditlhapetšo]
 # Special:ListUsers
 'listusers-submit' => 'Bontšha',
 
-# Special:Log/newusers
-'newuserlogpage' => '"Log" yago hlola mošumiši',
-
 # Special:ListGroupRights
 'listgrouprights-members' => '(Lenano la ditho)',
 
@@ -906,6 +906,8 @@ Ga eba o nyaka go hloša letlaka le go lenano la ditlhapetšo tša gago, šomiš
 'enotif_impersonal_salutation' => '{{SITENAME}} mošumiši',
 'enotif_lastvisited' => 'Lebelela  $1 go bona diphetogo ka moka gotloga ge go tsena la mafelelo.',
 'enotif_lastdiff' => 'Bona $1 go nyakorela phetogo ye.',
+'created' => 'tlhodilwe',
+'changed' => 'fetotšwe',
 
 # Delete
 'deletepage' => 'Phumula letlakala',
index 3e7b519..68f7974 100644 (file)
@@ -298,7 +298,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Amagar las modificacions susvelhadas dels darrièrs cambiaments',
 'tog-newpageshidepatrolled' => 'Amagar las paginas susvelhadas de la lista de las paginas novèlas',
 'tog-extendwatchlist' => 'Espandir la lista de seguiment per afichar totas las modificacions e non pas solament las mai recentas',
-'tog-usenewrc' => 'Utilizar los darrièrs cambiaments melhorats (necessita JavaScript)',
+'tog-usenewrc' => 'Agropar los cambiaments dins los darrièrs cambiaments e la lista de seguiment (necessita JavaScript)',
 'tog-numberheadings' => 'Numerotar automaticament los títols',
 'tog-showtoolbar' => 'Far veire la barra de menut de modificacion (JavaScript)',
 'tog-editondblclick' => 'Modificar una pagina amb un clic doble (JavaScript)',
@@ -306,23 +306,23 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Modificar una seccion en fasent un clic drech sus son títol (JavaScript)',
 'tog-showtoc' => "Afichar l'ensenhador (per las paginas de mai de 3 seccions)",
 'tog-rememberpassword' => 'Se remembrar de mon senhal sus aqueste ordinator (al mai $1 {{PLURAL:$1|jorn|jorns}})',
-'tog-watchcreations' => 'Apondre las paginas que creï a ma lista de seguiment',
-'tog-watchdefault' => 'Apondre las paginas que modifiqui a ma lista de seguiment',
-'tog-watchmoves' => 'Apondre las paginas que tòrni nomenar a ma lista de seguiment',
-'tog-watchdeletion' => 'Apondre las paginas que suprimissi de ma lista de seguiment',
+'tog-watchcreations' => "Apondre las paginas que creï e los fichièrs qu'impòrti a ma lista de seguiment",
+'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-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',
 'tog-nocache' => "Desactivar l'amagatal de paginas",
-'tog-enotifwatchlistpages' => 'M’avertir per corrièr electronic quand una pagina de ma lista de seguiment es modificada',
+'tog-enotifwatchlistpages' => 'M’avertir per corrièr electronic quand una pagina o un fichièr de ma lista de seguiment es modificat',
 'tog-enotifusertalkpages' => 'M’avertir per corrièr electronic en cas de modificacion de ma pagina de discussion',
-'tog-enotifminoredits' => 'M’avertir per corrièr electronic quitament en cas de modificacions menoras',
+'tog-enotifminoredits' => 'M’avertir per corrièr electronic quitament en cas de modificacions menoras de las paginas o dels fichièrs',
 'tog-enotifrevealaddr' => 'Afichar mon adreça electronica dins la los corrièrs electronics d’avertiment',
 'tog-shownumberswatching' => "Afichar lo nombre d'utilizaires que seguisson aquesta pagina",
 'tog-oldsig' => 'Apercebut de la signatura existenta :',
 'tog-fancysig' => 'Tractar la signatura coma de wikitèxte (sens ligam automatic)',
 'tog-externaleditor' => 'Utilizar un editor extèrne per defaut (pels utilizaires avançats, necessita una configuracion especiala sus vòstre ordinator)',
-'tog-externaldiff' => 'Utilizar un comparator extèrne per defaut (pels utilizaires avançats, necessita una configuracion especiala sus vòstre ordenador)',
+'tog-externaldiff' => "Utilizar un comparador extèrne per defaut (pels utilizaires avançats, necessita una configuracion especiala sus vòstre ordenador, [//www.mediawiki.org/wiki/Manual:External_editors/fr mai d'informacions]).",
 'tog-showjumplinks' => 'Activar los ligams « navigacion » e « recèrca » en naut de pagina (aparéncias Myskin e autres)',
 'tog-uselivepreview' => 'Utilizar l’apercebut rapid (JavaScript) (experimental)',
 'tog-forceeditsummary' => "M'avertir quand ai pas completat lo contengut de la bóstia de comentaris",
@@ -340,7 +340,7 @@ $messages = array(
 
 'underline-always' => 'Totjorn',
 'underline-never' => 'Pas jamai',
-'underline-default' => 'Segon lo navigador',
+'underline-default' => 'Valor per defaut del navigador o del tèma',
 
 # Font style option in Special:Preferences
 'editfont-style' => "Estil de poliça de la zòna d'edicion :",
@@ -425,8 +425,9 @@ $messages = array(
 'newwindow' => '(dobrís una fenèstra novèla)',
 'cancel' => 'Anullar',
 'moredotdotdot' => 'E mai...',
-'mypage' => 'Ma pagina',
-'mytalk' => 'Ma pagina de discussion',
+'morenotlisted' => 'Mai pas listat…',
+'mypage' => 'Pagina',
+'mytalk' => 'Discussion',
 'anontalk' => 'Discussion amb aquesta adreça IP',
 'navigation' => 'Navigacion',
 'and' => '&#32;e',
@@ -448,6 +449,7 @@ $messages = array(
 'vector-action-protect' => 'Protegir',
 'vector-action-undelete' => 'Restablir',
 'vector-action-unprotect' => 'Suprimir la proteccion',
+'vector-simplesearch-preference' => "Activar la barra de recèrca simplificada (solament per l'abilhatge Vector)",
 'vector-view-create' => 'Crear',
 'vector-view-edit' => 'Modificar',
 'vector-view-history' => "Veire l'istoric",
@@ -457,6 +459,7 @@ $messages = array(
 'namespaces' => 'Espacis de noms',
 'variants' => 'Variantas',
 
+'navigation-heading' => 'Menú de navigacion',
 'errorpagetitle' => 'Error de títol',
 'returnto' => 'Tornar a la pagina $1.',
 'tagline' => 'Un article de {{SITENAME}}.',
@@ -494,7 +497,7 @@ $messages = array(
 'articlepage' => "Vejatz l'article",
 'talk' => 'Discussion',
 'views' => 'Afichatges',
-'toolbox' => "Bóstia d'espleches",
+'toolbox' => "Bóstia d'aisinas",
 'userpage' => "Pagina d'utilizaire",
 'projectpage' => 'Pagina meta',
 'imagepage' => 'Veire la pagina del fichièr',
@@ -517,6 +520,8 @@ Tròp d’utilizaires cercan a accedir a aquesta pagina.
 Esperatz un moment abans d'ensajar d’accedir a aquesta pagina.
 
 $1",
+'pool-timeout' => "Relambi depassat pendent l'espèra del varrolh",
+'pool-queuefull' => 'La fila de trabalh es plena',
 'pool-errorunknown' => 'Error desconeguda',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
@@ -551,6 +556,10 @@ $1",
 'youhavenewmessages' => 'Avètz $1 ($2).',
 'newmessageslink' => 'de messatges novèls',
 'newmessagesdifflink' => 'darrièr cambiament',
+'youhavenewmessagesfromusers' => "Avètz $1 {{PLURAL:$3|d'un autre utilizaire|de $3 autres utilizaires}} ($2).",
+'youhavenewmessagesmanyusers' => 'Avètz $1 de fòrça utilizaires ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|un novèl messatge|de novèls messatges}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|darrièr cambiament|darrièrs cambiaments}}',
 'youhavenewmessagesmulti' => 'Avètz de messatges novèls sus $1',
 'editsection' => 'modificar',
 'editold' => 'modificar',
@@ -644,10 +653,12 @@ Informatz-ne un [[Special:ListUsers/sysop|administrator]] aprèp aver notada l
 'cannotdelete' => 'Impossible de suprimir la pagina o lo fichièr « $1 ».
 Benlèu la supression ja es estada efectuada per qualqu’un mai.',
 'cannotdelete-title' => 'Impossible de suprimir la pagina "$1"',
+'delete-hook-aborted' => "Supression anullada per una extension.
+Cap d'explicacion es pas estada provesida.",
 'badtitle' => 'Títol marrit',
 'badtitletext' => 'Lo títol de la pagina demandada es invalid, void o s’agís d’un títol interlenga o interprojècte mal ligat. Benlèu conten un o maites caractèrs que pòdon pas èsser utilizats dins los títols.',
-'perfcached' => 'Aquò es una version en amagatal e es benlèu pas a jorn. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => "Las donadas que segon son dins l'amagatal, son doncas pas forçadament a jorn. La darrièra actualizacion data del $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+'perfcached' => "Las donadas seguendas son en escondedor e benlèu, son pas a jorn. Un maximum de {{PLURAL:$1|un resultat|$1 resultats}} es disponible dins l'escondedor.",
+'perfcachedts' => "Las donadas seguendas son en escondedor e benlèu, son pas a jorn. Un maximum de {{PLURAL:$1|un resultat|$1 resultats}} es disponible dins l'escondedor.",
 'querypage-no-updates' => 'Las mesas a jorn per aquesta pagina son actualamnt desactivadas. Las donadas çaijós son pas mesas a jorn.',
 'wrong_wfQuery_params' => 'Paramètres incorrèctes sus wfQuery()<br />
 Foncion : $1<br />
@@ -656,8 +667,9 @@ Requèsta : $2',
 'viewsource-title' => 'Veire la font de $1',
 'actionthrottled' => 'Accion limitada',
 'actionthrottledtext' => "Per luchar contra lo spam, l’utilizacion d'aquesta accion es limitada a un cèrt nombre de còps dins una sosta pro corta. S'avèra qu'avètz depassat aqueste limit. Ensajatz tornamai dins qualques minutas.",
-'protectedpagetext' => 'Aquesta pagina es estada protegida per empachar sa modificacion.',
+'protectedpagetext' => "Aquesta pagina es estada protegida per empachar sa modificacion o d'autras accions.",
 'viewsourcetext' => 'Podètz veire e copiar lo contengut de l’article per poder trabalhar dessús :',
+'viewyourtext' => "Podètz veire e copiar lo contengut de '''vòstras modificacions''' a aquesta pagina :",
 'protectedinterface' => 'Aquesta pagina provesís de tèxte d’interfàcia pel logicial e es protegida per evitar los abuses.',
 'editinginterface' => "'''Atencion :''' sètz a editar una pagina utilizada per crear lo tèxte de l’interfàcia del logicial. Los cambiaments se repercutaràn, segon lo contèxte, sus totas o d'unas paginas visiblas pels autres utilizaires. Per las traduccions, vos convidam a utilizar lo projècte MediaWiki d'internacionalizacion dels messatges [//translatewiki.net/wiki/Main_Page?setlang=oc translatewiki.net].",
 'sqlhidden' => '(Requèsta SQL amagada)',
@@ -669,6 +681,7 @@ $2",
 'ns-specialprotected' => 'Las paginas dins l’espaci de noms « {{ns:special}} » pòdon pas èsser modificadas',
 'titleprotected' => "Aqueste títol es estat protegit a la creacion per [[User:$1|$1]].
 Lo motiu avançat es « ''$2'' ».",
+'exception-nologin' => 'Pas connectat',
 
 # Virus scanner
 'virus-badscanner' => "Marrida configuracion : escaner de virús desconegut : ''$1''",
@@ -680,11 +693,16 @@ Lo motiu avançat es « ''$2'' ».",
 
 Podètz contunhar d'utilizar {{SITENAME}} anonimament, o vos podètz <span class='plainlinks'>[$1 tornar connectar]</span> jol meteis nom o amb un autre nom.
 Notatz que d'unas paginas pòdon èsser encara afichadas coma s'eratz encara connect{{GENDER:||at|ada}}, fins al moment qu'escafaretz l'amagatal de vòstre navigador.",
-'yourname' => "Vòstre nom d'utilizaire :",
+'welcomeuser' => 'Benvenguda, $1&nbsp;!',
+'welcomecreation-msg' => "Vòstre compte d'utilizaire es estat creat.
+Doblidetz pas de modificar [[Special:Preferences|vòstras preferéncias per {{SITENAME}}]].",
+'yourname' => "Nom d'utilizaire :",
 'yourpassword' => 'Vòstre senhal :',
-'yourpasswordagain' => 'Picatz vòstre senhal tornarmai :',
+'yourpasswordagain' => 'Confirmar lo senhal :',
 'remembermypassword' => 'Me reconnectar automaticament a las visitas venentas (al maximum $1 {{PLURAL:$1|jorn|jorns}})',
+'securelogin-stick-https' => 'Demorar connectat en HTTPS aprèp la connexion',
 'yourdomainname' => 'Vòstre domeni',
+'password-change-forbidden' => 'Podètz pas modificar los senhals sus aqueste wiki.',
 'externaldberror' => 'Siá una error s’es producha amb la banca de donadas d’autentificacion extèrna, siá sètz pas autorizat a metre a jorn vòstre compte extèrne.',
 'login' => 'Identificacion',
 'nav-login-createaccount' => 'Crear un compte o se connectar',
@@ -699,7 +717,7 @@ Notatz que d'unas paginas pòdon èsser encara afichadas coma s'eratz encara con
 'createaccount' => 'Crear un compte novèl',
 'gotaccount' => "Ja avètz un compte ? '''$1'''.",
 'gotaccountlink' => 'Identificatz-vos',
-'userlogin-resetlink' => 'Vos doblidèretz las informacions de conneccion?',
+'userlogin-resetlink' => 'Avètz doblidat vòstres detalhs de connexion ?',
 'createaccountmail' => 'per corrièr electronic',
 'createaccountreason' => 'Motiu :',
 'badretype' => "Los senhals qu'avètz picats son pas identics.",
@@ -751,6 +769,7 @@ Atal los visitors qu'utilizan aquesta adreça IP pòdon pas crear mai de compte
 'emailconfirmlink' => 'Confirmatz vòstra adreça de corrièr electronic',
 'invalidemailaddress' => "Aquesta adreça de corrièr electronic pòt pas èsser acceptada perque sembla qu'a un format incorrècte.
 Picatz una adreça plan formatada o daissatz aqueste camp void.",
+'emaildisabled' => 'Aqueste site pòt pas mandar de corrièls.',
 'accountcreated' => 'Compte creat.',
 'accountcreatedtext' => "Lo compte d'utilizaire de $1 es estat creat.",
 'createaccount-title' => "Creacion d'un compte per {{SITENAME}}",
@@ -760,9 +779,13 @@ Ignoratz aqueste messatge se aqueste compte es estat creat per error.",
 'usernamehasherror' => "Lo nom d'utilizaire pòt pas conténer de caractèrs de hachage",
 'login-throttled' => 'Avètz ensajat tròp de temptativas de connexion darrièrament.
 Esperatz abans d’ensajar tornamai.',
+'login-abort-generic' => 'Vòstra temptativa de connexion a fracassat',
 'loginlanguagelabel' => 'Lenga: $1',
 'suspicious-userlogout' => 'Vòstra demanda de desconnexion es estada refusada perque sembla qu’es estada mandada per un navigador copat o la mesa en escondedor d’un proxy.',
 
+# E-mail sending
+'php-mail-error-unknown' => 'Error desconeguda dins la foncion mail() de PHP.',
+
 # Change password dialog
 'resetpass' => 'Cambiar lo senhal del compte',
 'resetpass_announce' => 'Vos sètz enregistrat amb un senhal temporari mandat per corrièr electronic. Per acabar l’enregistrament, vos cal picar un senhal novèl aicí :',
@@ -909,8 +932,9 @@ La darrièra entrada del jornal dels blocatges es indicada çaijós a títol d
 'userinvalidcssjstitle' => "'''Atencion :''' existís pas d'estil « $1 ». Remembratz-vos que las paginas personalas amb extensions .css e .js utilizan de títols en minusculas, per exemple, {{ns:user}}:Foo/vector.css e non pas {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Mes a jorn)',
 'note' => "'''Nòta :'''",
-'previewnote' => "'''Atencion, aqueste tèxte es sonque una previsualizacion e es pas encara estat salvat !'''",
-'continue-editing' => "Contunhar l'edicion",
+'previewnote' => "'''Remembratz-vos qu'es pas qu'una previsualizacion.'''
+Vòstras modificacions son pas encara estadas enregistradas !",
+'continue-editing' => 'Anar a la zòna de modificacion',
 'previewconflict' => 'Aquesta previsualizacion fa veire lo tèxte de la bóstia de modificacion superiora coma apareisserà se causissètz de lo salvar.',
 'session_fail_preview' => "'''Podèm pas enregistrar vòstra modificacion a causa d’una pèrda d’informacions concernent vòstra sesilha.
 Ensajatz tornarmai.
@@ -981,6 +1005,12 @@ Sembla que siá estada suprimida.',
 Existís ja.',
 'defaultmessagetext' => 'Messatge per defaut',
 
+# Content models
+'content-model-wikitext' => 'wikitèxte',
+'content-model-text' => 'tèxte brut',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Atencion : Aquesta pagina conten tròp d’apèls dispendioses de foncions del parser.
 
@@ -1167,7 +1197,7 @@ Asseguratz-vos qu'aqueste cambiament pòsca conservar la continuitat de l'istori
 'mergelogpagetext' => "Vaquí, çaijós, la lista de las fusions las mai recentas de l'istoric d'una pagina amb una autra.",
 
 # Diffs
-'history-title' => 'Istoric de las versions de « $1 »',
+'history-title' => '$1 : Istoric de las versions',
 'difference-multipage' => '(Diferéncias entre las paginas)',
 'lineno' => 'Linha $1 :',
 'compareselectedversions' => 'Comparar las versions seleccionadas',
@@ -1242,8 +1272,8 @@ En esperant la reactivacion, podètz efectuar una recèrca via Google.
 Atencion, lor indexacion de contengut {{SITENAME}} benlèu es pas a jorn.',
 
 # Quickbar
-'qbsettings' => "Barra d'espleches",
-'qbsettings-none' => 'Cap',
+'qbsettings' => "Barra d'aisinas",
+'qbsettings-none' => 'Pas cap',
 'qbsettings-fixedleft' => 'Esquèrra',
 'qbsettings-fixedright' => 'Drecha',
 'qbsettings-floatingleft' => 'Flotanta a esquèrra',
@@ -1251,7 +1281,7 @@ Atencion, lor indexacion de contengut {{SITENAME}} benlèu es pas a jorn.',
 
 # Preferences page
 'preferences' => 'Preferéncias',
-'mypreferences' => 'Mas preferéncias',
+'mypreferences' => 'Preferéncias',
 'prefs-edits' => 'Nombre d’edicions :',
 'prefsnologin' => 'Vos sètz pas identificat(ada)',
 'prefsnologintext' => 'Vos cal èsser <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} connectat(ada)]</span> per modificar vòstras preferéncias d’utilizaire.',
@@ -1262,11 +1292,12 @@ Atencion, lor indexacion de contengut {{SITENAME}} benlèu es pas a jorn.',
 'prefs-beta' => 'Foncionalitats bèta',
 'prefs-datetime' => 'Data e ora',
 'prefs-labs' => 'Foncionalitats « labs »',
+'prefs-user-pages' => "Paginas d'utilizaire",
 'prefs-personal' => 'Entresenhas personalas',
 'prefs-rc' => 'Darrièrs cambiaments',
 'prefs-watchlist' => 'Lista de seguiment',
 'prefs-watchlist-days' => "Nombre de jorns d'afichar dins la lista de seguiment :",
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => '(maximum $1 jorn{{PLURAL:$1||s}})',
 'prefs-watchlist-edits' => "Nombre de modificacions d'afichar dins la lista de seguiment espandida :",
 'prefs-watchlist-edits-max' => 'Nombre maximum : 1000',
 'prefs-watchlist-token' => 'Geton per la lista de seguiment :',
@@ -1325,9 +1356,9 @@ Vaquí una valor generada aleatòriament que podètz utilizar : $1',
 'prefs-emailconfirm-label' => 'Confirmacion del corrièr electronic :',
 'prefs-textboxsize' => 'Talha de la fenèstra de modificacion',
 'youremail' => 'Adreça de corrièr electronic :',
-'username' => "Nom de l'utilizaire :",
-'uid' => 'Numèro de l’utilizaire :',
-'prefs-memberingroups' => 'Membre {{PLURAL:$1|del grop|dels gropes}} :',
+'username' => "{{GENDER:$1|Nom d'utilizaire|Nom d'utilizaira}}:",
+'uid' => "Numèro d'{{GENDER:$1|utilizaire|utilizaira}}:",
+'prefs-memberingroups' => '{{GENDER:$2|Membre|Membra}} {{PLURAL:$1|del grop|dels gropes}}:',
 'prefs-registration' => 'Data de creacion del compte :',
 'yourrealname' => 'Nom vertadièr :',
 'yourlanguage' => "Lenga de l'interfàcia :",
@@ -1346,6 +1377,7 @@ Deu aver, al maximum $1 caractèr{{PLURAL:$1||s}}.',
 'prefs-help-realname' => "(facultatiu) : se l'especificatz, serà utilizat per vos atribuir vòstras contribucions.",
 'prefs-help-email' => 'L’adreça de corrièr electronic es facultativa mas vos permet de reçaupre lo senhal se lo doblidatz.
 Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagina d’utilizaire o la de discussion sens sofracha de desvelar vòstra idenditat.',
+'prefs-help-email-others' => "Tanben podètz causir de daissar los autres vos contactar sus vòstra pagina de discussion d'utilizaire sens que siá necessari de revelar vòstra identitat.",
 'prefs-help-email-required' => 'Una adreça de corrièr electronic es requesa.',
 'prefs-info' => 'Informacion de basa',
 'prefs-i18n' => 'Internationalizacion',
@@ -1699,6 +1731,27 @@ Se lo problèma persistís, contactatz un [[Special:ListUsers/sysop|administrato
 'upload-unknown-size' => 'Talha desconeguda',
 'upload-http-error' => 'Una error HTTP es intervenguda : $1',
 
+# File backend
+'backend-fail-stream' => 'Impossible de legir lo fichièr $1.',
+'backend-fail-backup' => 'Impossible de salvar lo fichièr $1.',
+'backend-fail-notexists' => 'Lo fichièr $1 existís pas.',
+'backend-fail-alreadyexists' => 'Lo fichièr $1 existís ja.',
+'backend-fail-store' => "Impossible d'emmagazinar lo fichièr « $1 » dins « $2 ».",
+'backend-fail-copy' => 'Impossible de copiar lo fichièr « $1 » dins « $2 ».',
+'backend-fail-move' => 'Impossible de desplaçar lo fichièr « $1 » cap a « $2 ».',
+'backend-fail-opentemp' => 'Impossible de dobrir lo fichièr temporari.',
+'backend-fail-writetemp' => "Impossible d'escriure dins lo fichièr temporari.",
+'backend-fail-closetemp' => 'Impossible de tampar lo fichièr temporari.',
+'backend-fail-read' => 'Impossible de legir lo fichièr $1.',
+'backend-fail-create' => "Impossible d'escriure lo fichièr $1.",
+
+# Lock manager
+'lockmanager-fail-closelock' => 'Impossible de tampar lo fichièr de varrolh per « $1 ».',
+'lockmanager-fail-deletelock' => 'Impossible de suprimir lo fichièr de varrolh per « $1 ».',
+'lockmanager-fail-acquirelock' => "Impossible d'obténer lo fichièr de varrolh per « $1 ».",
+'lockmanager-fail-openlock' => 'Impossible de dobrir lo fichièr de varrolh per « $1 ».',
+'lockmanager-fail-releaselock' => 'Impossible de daissar anar lo fichièr de varrolh per « $1 ».',
+
 # img_auth script messages
 'img-auth-accessdenied' => 'Accès refusat',
 'img-auth-nopathinfo' => 'PATH_INFO mancant.
@@ -1938,7 +1991,7 @@ Las entradas <del>barradas</del> son estadas resolgudas.',
 'listusers-editsonly' => "Far veire sonque los utilizaires qu'an al mens una contribucion",
 'listusers-creationsort' => 'Triar per data de creacion',
 'usereditcount' => '$1 {{PLURAL:$1|cambiament|cambiaments}}',
-'usercreated' => 'Creat lo $1 a $2',
+'usercreated' => '{{GENDER:$3|Creat}} lo $1 a $2',
 'newpages' => 'Paginas novèlas',
 'newpages-username' => "Nom d'utilizaire :",
 'ancientpages' => 'Articles mai ancians',
@@ -1964,8 +2017,8 @@ Notatz que d’autres sites pòdon aver un ligam dirècte cap a un fichièr, e d
 'booksources-invalid-isbn' => "Lo numèro ISBN balhat sembla pas èsser valid ; verificatz s'avètz fach una error al moment de la còpia dempuèi la font.",
 
 # Special:Log
-'specialloguserlabel' => 'Utilizaire :',
-'speciallogtitlelabel' => 'Títol :',
+'specialloguserlabel' => 'Autor :',
+'speciallogtitlelabel' => 'Cibla (títol o utilizaire):',
 'log' => 'Jornals',
 'all-logs-page' => 'Totas las operacions publicas',
 'alllogstext' => 'Afichatge combinat de totes los jornals de {{SITENAME}}.
@@ -2005,7 +2058,7 @@ Vejatz tanben [[Special:WantedCategories|las categorias demandadas]].',
 'sp-deletedcontributions-contribs' => 'contribucions',
 
 # Special:LinkSearch
-'linksearch' => 'Ligams extèrnes',
+'linksearch' => 'Recèrca de ligams extèrnes',
 'linksearch-pat' => 'Recercar l’expression :',
 'linksearch-ns' => 'Espacis de noms :',
 'linksearch-ok' => 'Recercar',
@@ -2053,11 +2106,13 @@ I pòt aver [[{{MediaWiki:Listgrouprights-helppage}}|d'entresenhas complementàr
 e aver indicat una adreça electronica valida dins vòstras [[Special:Preferences|preferéncias]]
 per poder mandar un messatge a un autre utilizaire.',
 'emailuser' => 'Mandar un messatge a aqueste utilizaire',
+'emailuser-title-target' => 'Mandar un corrièl a {{GENDER:$1|aqueste utilizaire|aquesta utilizaira}}',
+'emailuser-title-notarget' => 'Mandar un corrièr electronic a l’utilizaire',
 'emailpage' => 'Mandar un corrièr electronic a l’utilizaire',
-'emailpagetext' => "Podètz utilizar lo formulari çaijós per mandar un corrièr electronic a aqueste utilizaire.
+'emailpagetext' => "Podètz utilizar lo formulari çaijós per mandar un corrièr electronic a {{GENDER:$1|aqueste utilizaire|aquesta utilizaira}}.
 L'adreça electronica qu'avètz indicada dins [[Special:Preferences|vòstras preferéncias]] apareisserà dins lo camp « Expeditor » de vòstre messatge. E mai, lo destinatari vos poirà respondre dirèctament.",
 'usermailererror' => 'Error dins lo subjècte del corrièr electronic :',
-'defemailsubject' => 'Corrièr electronic mandat dempuèi {{SITENAME}}',
+'defemailsubject' => "{{SITENAME}} Corrièl de l'utilizaire « $1 »",
 'usermaildisabled' => 'Lo mandadís de corrièrs electronics entre utilizairers es desactivat',
 'usermaildisabledtext' => "Podètz pas mandar de corrièrs electronics a d'autres utilizaires sur aquel wiki",
 'noemailtitle' => "Pas d'adreça electronica",
@@ -2121,6 +2176,11 @@ Las modificacions venentas d\'aquesta pagina e de la pagina de discussion associ
 'enotif_mailer' => 'Sistèma d’expedicion de notificacion de {{SITENAME}}',
 'enotif_reset' => 'Marcar totas las paginas coma visitadas',
 'enotif_impersonal_salutation' => 'Utilizaire de {{SITENAME}}',
+'enotif_subject_deleted' => 'La pagina $1 sus {{SITENAME}} es estada suprimida per {{GENDER:$2|$2}}',
+'enotif_subject_created' => 'La pagina $1 sus {{SITENAME}} es estada creada per {{GENDER:$2|$2}}',
+'enotif_subject_moved' => 'La pagina $1 sus {{SITENAME}} es estada renomenada per {{GENDER:$2|$2}}',
+'enotif_subject_restored' => 'La pagina $1 sus {{SITENAME}} es estada restablida per {{GENDER:$2|$2}}',
+'enotif_subject_changed' => 'La pagina $1 sus {{SITENAME}} es estada modificada per {{GENDER:$2|$2}}',
 'enotif_lastvisited' => 'Consultatz $1 per totes los cambiaments dempuèi vòstra darrièra visita.',
 'enotif_lastdiff' => 'Consultatz $1 per veire aquesta modificacion.',
 'enotif_anon_editor' => 'utilizaire anonim $1',
@@ -2191,6 +2251,8 @@ D'efectuar amb prudéncia.",
 'rollback' => 'Anullar las modificacions',
 'rollback_short' => 'Anullar',
 'rollbacklink' => 'anullar',
+'rollbacklinkcount' => 'revocar $1 {{PLURAL:$1|modificacion|modificacions}}',
+'rollbacklinkcount-morethan' => 'revocar mai de $1 {{PLURAL:$1|modificacion|modificacions}}',
 'rollbackfailed' => "L'anullacion a pas capitat",
 'cantrollback' => "Impossible d'anullar : l'autor es la sola persona a aver efectuat de modificacions sus aqueste article",
 'alreadyrolled' => "Impossible d'anullar la darrièra modificacion de l'article « [[:$1]] » efectuada per [[User:$2|$2]] ([[User talk:$2|Discutir]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ;
@@ -2210,12 +2272,14 @@ Clicatz sus « Precedent » e tornatz cargar la pagina d’ont venètz, puèi en
 
 # Protect
 'protectlogpage' => 'Istoric de las proteccions',
-'protectlogtext' => 'Vejatz las [[Special:ProtectedPages|directivas]] per mai d’informacion.',
+'protectlogtext' => 'Aquí una lista de las modificacions de las proteccions de paginas.
+Consultatz la [[Special:ProtectedPages|lista de las paginas protegidas]] per la lista de las proteccions actualament operacionalas.',
 'protectedarticle' => 'a protegit « [[$1]] »',
 'modifiedarticleprotection' => 'a modificat lo nivèl de proteccion de « [[$1]] »',
-'unprotectedarticle' => 'a desprotegit « [[$1]] »',
+'unprotectedarticle' => 'a suprimit la proteccion de « [[$1]] »',
 'movedarticleprotection' => 'a desplaçat los paramètres de proteccion dempuèi « [[$2]] » cap a « [[$1]] »',
 'protect-title' => 'Cambiar lo nivèl de proteccion de « $1 »',
+'protect-title-notallowed' => 'Veire lo nivèl de proteccion de « $1 »',
 'prot_1movedto2' => 'a renomenat [[$1]] en [[$2]]',
 'protect-legend' => 'Confirmar la proteccion',
 'protectcomment' => 'Rason :',
@@ -2229,9 +2293,9 @@ Clicatz sus « Precedent » e tornatz cargar la pagina d’ont venètz, puèi en
 'protect-locked-access' => "Avètz pas los dreches necessaris per modificar la proteccion de la pagina. Vaquí los reglatges actuals de la pagina '''$1''' :",
 'protect-cascadeon' => "Aquesta pagina es actualament protegida perque es inclusa dins {{PLURAL:$1|la pagina seguenta|las paginas seguentas}}, {{PLURAL:$1|qu'es estada protegida|que son estadas protegidas}} amb l’opcion « proteccion en cascada » activada. Podètz cambiar lo nivèl de proteccion d'aquesta pagina sens qu'aquò afècte la proteccion en cascada.",
 'protect-default' => 'Autorizar totes los utilizaires',
-'protect-fallback' => 'Necessita l’abilitacion «$1»',
-'protect-level-autoconfirmed' => 'Blocar los utilizaires novèls e los utilizaires anonims',
-'protect-level-sysop' => 'Administrators unicament',
+'protect-fallback' => 'Autorizar unicament los utilizaires amb lo drech « $1 »',
+'protect-level-autoconfirmed' => 'Autorizar unicament los utilizaires autoconfirmats',
+'protect-level-sysop' => 'Autorizar unicament los administrators',
 'protect-summary-cascade' => 'proteccion en cascada',
 'protect-expiring' => 'expira lo $1',
 'protect-expiring-local' => 'expira lo $1',
@@ -2323,9 +2387,9 @@ $1",
 'blanknamespace' => '(Principal)',
 
 # Contributions
-'contributions' => "Contribucions d'aqueste contributor",
+'contributions' => "Contribucions de l'{{GENDER:$1|utilizaire|utilizaira}}",
 'contributions-title' => 'Tièra de las contribucions de l’utilizaire $1',
-'mycontris' => 'Mas contribucions',
+'mycontris' => 'Contribucions',
 'contribsub2' => 'Lista de las contribucions de $1 ($2). Las paginas que son estadas escafadas son pas afichadas.',
 'nocontribs' => 'Cap de modificacion correspondenta a aquestes critèris es pas estada trobada.',
 'uctop' => '(darrièra)',
@@ -2365,10 +2429,11 @@ La darrièra intrada del jornal dels blocatges es indicada çaijós a títol d
 'whatlinkshere-hideredirs' => '$1 redireccions',
 'whatlinkshere-hidetrans' => '$1 transclusions',
 'whatlinkshere-hidelinks' => '$1 ligams',
-'whatlinkshere-hideimages' => '$1 ligams de fichièrs',
+'whatlinkshere-hideimages' => '$1 los fichièrs ligats',
 'whatlinkshere-filters' => 'Filtres',
 
 # Block/unblock
+'autoblockid' => 'Blocatge automatic #$1',
 'block' => 'Blocar un utilizaire',
 'unblock' => 'Desblocar un utilizaire',
 'blockip' => 'Blocar en escritura',
@@ -2421,6 +2486,9 @@ a partir d'una adreça IP precedentament blocada.",
 'blocklist' => 'Utilizaires o adreças IP blocats',
 'ipblocklist' => 'Utilizaires o adreças IP blocats',
 'ipblocklist-legend' => 'Cercar un utilizaire blocat',
+'blocklist-target' => 'Cibla',
+'blocklist-expiry' => "Data d'expiracion",
+'blocklist-reason' => 'Motiu',
 'ipblocklist-submit' => 'Recercar',
 'ipblocklist-localblock' => 'Blocatge local',
 'ipblocklist-otherblocks' => '{{PLURAL:$1|Autre blocatge|Autres blocatges}}',
@@ -2502,11 +2570,12 @@ Doblidetz pas de la desvarrolhar quand auretz acabat vòstra operacion de manten
 # Move page
 'move-page' => 'Tornar nomenar $1',
 'move-page-legend' => 'Tornar nomenar una pagina',
-'movepagetext' => "Utilizatz lo formulari çaijós per tornar nomenar una pagina, en desplaçant tot son istoric cap al nom novèl. Lo títol ancian vendrà una pagina de redireccion cap al títol novèl. Los ligams cap al títol de la pagina anciana seràn pas cambiats ; verificatz qu'aqueste desplaçament a pas creat de [[Special:DoubleRedirects|redireccion dobla]] o de [[Special:BrokenRedirects|redireccion copada]].
+'movepagetext' => "Utilizatz lo formulari çaijós per tornar nomenar una pagina, en desplaçant tot son istoric cap al nom novèl. Lo títol ancian vendrà una pagina de redireccion cap al títol novèl. Podètz metre a jorn automaticament las redireccions actualas que puntan cap al títol original. Se causissètz de lo far pas, asseguratz-vos de verificar tota [[Special:DoubleRedirects|redireccion dobla]] o [[Special:BrokenRedirects|redireccion copada]]. Avètz la responsabilitat de vos assegurar que los ligams contunhen de puntar cap a lor destinacion supausada.
 
-Avètz la responsabilitat de vos assegurar que los ligams contunhen de puntar cap a lor destinacion supausada. Una pagina serà pas desplaçada se la pagina del títol novèl existís ja, a mens qu'aquesta darrièra siá voida o en redireccion, e qu’aja pas d’istoric. Aquò vòl dire que podètz tornar nomenar una pagina cap a sa posicion d’origina s'avètz fach una error, mas que podètz pas escafar una pagina qu'existís ja amb aqueste procediment.
+Notatz que la pagina serà '''pas''' renomada s'existís ja una pagina amb lo novèl títol, levat se aquesta darrièra a un istoric de modificacions verge e es una simpla redireccion. Aquò permet de renomenar una pagina cap a sa posicion d'origina se lo desplaçament s'avera erronèu.
 
-'''ATENCION !''' Aquò pòt provocar un cambiament radical e imprevist per una pagina consultada frequentament. Asseguratz-vos de n'aver comprés las consequéncias abans de contunhar.",
+'''ATENCION !'''
+Aquò pòt provocar un cambiament radical e imprevist per una pagina consultada frequentament. Asseguratz-vos de n'aver comprés las consequéncias abans de contunhar.",
 'movepagetalktext' => "La pagina de discussion associada, se presenta, serà automaticament desplaçada amb ''' levat se :'''
 *Desplaçatz una pagina cap a un autre espaci,
 *Una pagina de discussion ja existís amb lo nom novèl, o
@@ -2633,9 +2702,11 @@ Totas las accions d’importacion interwiki son conservadas dins lo [[Special:Lo
 'import-interwiki-templates' => 'Enclure totes los modèls',
 'import-interwiki-submit' => 'Importar',
 'import-interwiki-namespace' => 'Espaci de noms de destinacion :',
+'import-interwiki-rootpage' => 'Pagina raiç de destinacion (opcionala):',
 'import-upload-filename' => 'Nom del fichièr :',
 'import-comment' => 'Comentari :',
-'importtext' => 'Exportatz lo fichièr dempuèi lo wiki d’origina en utilizant l’esplech Special:Export, salvatz-lo sus vòstre disc dur e copiatz-lo aicí.',
+'importtext' => "Exportatz lo fichièr dempuèi lo wiki d’origina en utilizant [[Special:Export|aisina d'exportacion]].
+Salvatz-lo sus vòstre disc dur puèi importatz-lo aicí.",
 'importstart' => 'Impòrt de las paginas...',
 'import-revision-count' => '$1 {{PLURAL:$1|version|versions}}',
 'importnopages' => "Cap de pagina d'importar.",
@@ -2786,9 +2857,36 @@ Aquò es probablament causat per un ligam sus lista negra que punta cap a un sit
 'spam_blanking' => 'Totas las versions que contenon de ligams cap a $1 son blanquidas',
 
 # Info page
+'pageinfo-title' => 'Informacions per « $1 »',
+'pageinfo-header-basic' => 'Informacions de basa',
+'pageinfo-header-edits' => 'Istoric de las modificacions',
+'pageinfo-header-restrictions' => 'Proteccion de la pagina',
+'pageinfo-header-properties' => 'Proprietats de la pagina',
+'pageinfo-display-title' => 'Títol afichat',
+'pageinfo-default-sort' => 'Clau de triada per defaut',
+'pageinfo-length' => 'Talha de la pagina (en octets)',
+'pageinfo-article-id' => 'Numèro de la pagina',
+'pageinfo-robot-policy' => 'Estatut de motor de recèrca',
+'pageinfo-robot-index' => 'Indexable',
+'pageinfo-robot-noindex' => 'Pas indexable',
 'pageinfo-views' => 'Nombre de vistas',
-'pageinfo-edits' => "Nombre d'edicions",
-'pageinfo-authors' => "Nombre d'autors distints",
+'pageinfo-redirects-name' => 'Redireccions cap a aquesta pagina',
+'pageinfo-subpages-name' => "Sospaginas d'aquesta pagina",
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redireccion|redireccions}}; $3 {{PLURAL:$3|non-redireccion|non-redireccions}})',
+'pageinfo-firstuser' => 'Creator de la pagina',
+'pageinfo-firsttime' => 'Data de creacion de la pagina',
+'pageinfo-lastuser' => 'Darrièr contributor',
+'pageinfo-lasttime' => 'Data de la darrièra modificacion',
+'pageinfo-edits' => 'Nombre total de modificacions',
+'pageinfo-authors' => "Nombre total d'autors distinctes",
+'pageinfo-recent-edits' => 'Nombre de modificacions recentas (dins los darrièrs $1)',
+'pageinfo-recent-authors' => "Nombre d'autors distinctes recents",
+'pageinfo-magic-words' => '{{PLURAL:$1|Mot magic|Mots magics}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria amagada|Categorias amagadas}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Modèl inclús|Modèls incluses}} ($1)',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage-yes' => 'Òc',
+'pageinfo-protect-cascading-yes' => 'Òc',
 
 # Skin names
 'skinname-standard' => 'Estandard',
@@ -2839,11 +2937,19 @@ Se l'executatz, vòstre sistèma pòt èsser compromés.",
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pagina|paginas}}',
 'file-info' => 'Talha del fichièr: $1, tipe MIME: $2',
 'file-info-size' => '$1 × $2 pixèl, talha del fichièr: $3, tipe MIME: $4',
+'file-info-size-pages' => '$1 × $2 pixèls, talha de fichièr: $3, tipe MIME: $4, $5 {{PLURAL:$5|pagina|paginas}}',
 'file-nohires' => 'Pas de resolucion mai nauta disponibla.',
 'svg-long-desc' => 'Fichièr SVG, resolucion de $1 × $2 pixèls, talha : $3',
+'svg-long-desc-animated' => 'Fichièr SVG animat, talha $1 x $2 pixèls, talha del fichièr : $3',
 'show-big-image' => 'Imatge en resolucion mai nauta',
+'show-big-image-preview' => "Talha d'aqueste apercebut : $1.",
+'show-big-image-other' => '{{PLURAL:$2|Autra resolucion|Autras resolucions}} : $1.',
+'show-big-image-size' => '$1 × $2 pixèls',
 'file-info-gif-looped' => 'en bocla',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|imatge|imatges}}',
+'file-info-png-looped' => 'en bocla',
+'file-info-png-repeat' => 'jogat $1 {{PLURAL:$1|còp|còps}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|imatge|imatges}}',
 
 # Special:NewFiles
 'newimages' => 'Galariá dels fichièrs novèls',
@@ -2857,6 +2963,13 @@ Se l'executatz, vòstre sistèma pòt èsser compromés.",
 'bydate' => 'per data',
 'sp-newimages-showfrom' => 'Afichar los imatges novèls importats dempuèi lo $2, $1',
 
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 segonda|$1 segondas}}',
+'minutes' => '{{PLURAL:$1|$1 minuta|$1 minutas}}',
+'hours' => '{{PLURAL:$1|$1 ora|$1 oras}}',
+'days' => '{{PLURAL:$1|$1 jorn|$1 jorns}}',
+'ago' => 'I a $1',
+
 # Bad image list
 'bad_image_list' => "Lo format es lo seguent :
 
@@ -2923,8 +3036,8 @@ Los autres ligams sus la meteissa linha son considerats coma d'excepcions, per e
 'exif-colorspace' => 'Espaci colorimetric',
 'exif-componentsconfiguration' => 'Significacion de cada compausanta',
 'exif-compressedbitsperpixel' => 'Mòde de compression de l’imatge',
-'exif-pixelydimension' => 'Largor d’imatge valida',
-'exif-pixelxdimension' => 'Nautor d’imatge valida',
+'exif-pixelydimension' => 'Largor de l’imatge',
+'exif-pixelxdimension' => 'Nautor de l’imatge',
 'exif-usercomment' => "Comentaris de l'utilizaire",
 'exif-relatedsoundfile' => 'Fichièr àudio associat',
 'exif-datetimeoriginal' => 'Data e ora de la generacion de donadas',
@@ -2938,9 +3051,9 @@ Los autres ligams sus la meteissa linha son considerats coma d'excepcions, per e
 'exif-exposureprogram' => 'Programa d’exposicion',
 'exif-spectralsensitivity' => 'Sensibilitat espectrala',
 'exif-isospeedratings' => 'Sensibilitat ISO',
-'exif-shutterspeedvalue' => 'Velocitat d’obturacion',
-'exif-aperturevalue' => 'Dobertura',
-'exif-brightnessvalue' => 'Luminositat',
+'exif-shutterspeedvalue' => "velocitat d’obturacion de l'APEX",
+'exif-aperturevalue' => "Dobertura de l'APEX",
+'exif-brightnessvalue' => 'Luminança APEX',
 'exif-exposurebiasvalue' => 'Correccion d’exposicion',
 'exif-maxaperturevalue' => 'Camp de dobertura maximal',
 'exif-subjectdistance' => 'Distància del subjècte',
@@ -3002,9 +3115,66 @@ Los autres ligams sus la meteissa linha son considerats coma d'excepcions, per e
 'exif-gpsareainformation' => 'Nom de la zòna GPS',
 'exif-gpsdatestamp' => 'Data GPS',
 'exif-gpsdifferential' => 'Correccion diferenciala GPS',
+'exif-jpegfilecomment' => 'Comentari de fichièr JPEG',
+'exif-keywords' => 'Mots claus',
+'exif-worldregiondest' => 'Region del mond representada',
+'exif-countrydest' => 'País representat',
+'exif-countrycodedest' => 'Còde del país representat',
+'exif-provinceorstatedest' => 'Província o Estat representat',
+'exif-citydest' => 'Vila representada',
+'exif-sublocationdest' => 'Partida de la vila representada',
+'exif-objectname' => 'Títol cort',
+'exif-specialinstructions' => 'Instruccions especialas',
+'exif-headline' => 'Títol',
+'exif-credit' => 'Credit / provesidor',
+'exif-source' => 'Font',
+'exif-editstatus' => "Estatut editorial de l'imatge",
+'exif-urgency' => 'Urgéncia',
+'exif-fixtureidentifier' => 'Nom element recurrent',
+'exif-locationdest' => 'Luòc representat',
+'exif-locationdestcode' => 'Còde del luòc representat',
+'exif-objectcycle' => 'Moment de la jornada al qual aqueste mèdia es destinat',
+'exif-contact' => 'Informacions de contacte',
+'exif-writer' => 'Autor',
+'exif-languagecode' => 'Lenga',
+'exif-iimversion' => 'version IIM',
+'exif-iimcategory' => 'Categoria',
+'exif-iimsupplementalcategory' => 'Categorias suplementàrias',
+'exif-datetimeexpires' => 'Utilizar pas aprèp',
+'exif-datetimereleased' => 'Paregut lo',
+'exif-originaltransmissionref' => 'Còde de localizacion de la transmission originala',
+'exif-identifier' => 'Identificant',
+'exif-lens' => 'Lentilha utilizada',
+'exif-serialnumber' => "Numèro de seria de l'aparelh de fòto",
+'exif-cameraownername' => "Proprietari de l'aparelh de fòto",
+'exif-label' => 'Libellat',
+'exif-rating' => 'Nòta (sus 5)',
+'exif-rightscertificate' => 'Certificat de gestion dels dreches',
+'exif-copyrighted' => "Estatut del drech d'autor",
+'exif-copyrightowner' => "Detentor del drech d'autor",
+'exif-usageterms' => "Condicions d'utilizacion",
+'exif-webstatement' => "Declaracion de dreches d'autor en linha",
+'exif-pngfilecomment' => 'Comentari de fichièr JPEG',
+'exif-disclaimer' => 'Desistiment',
+'exif-contentwarning' => 'Avertiment sul contengut',
+'exif-giffilecomment' => 'Comentari de fichièr GIF',
+'exif-intellectualgenre' => "Tipe d'element",
+'exif-subjectnewscode' => 'Còde del subjècte',
+'exif-scenecode' => 'Còde de scèna IPTC',
+'exif-event' => 'Eveniment representat',
+'exif-organisationinimage' => 'Organizacion representada',
+'exif-personinimage' => 'Persona representada',
+'exif-originalimageheight' => "Nautor de l'imatge abans d'èsser requadrada",
+'exif-originalimagewidth' => "Largor de l'imatge abans d'èsser requadrada",
 
 # EXIF attributes
 'exif-compression-1' => 'Sens compression',
+'exif-compression-2' => "CCITT Grop 3 Longor de l'encodatge Huffman modificat de dimension 1",
+'exif-compression-3' => 'CCITT Grop 3 encodatge del fax',
+'exif-compression-4' => 'CCITT Grop 4 encodatge del fax',
+
+'exif-copyrighted-true' => "Somés al drech d'autor",
+'exif-copyrighted-false' => 'Domeni public',
 
 'exif-unknowndate' => 'Data desconeguda',
 
@@ -3013,9 +3183,9 @@ Los autres ligams sus la meteissa linha son considerats coma d'excepcions, per e
 'exif-orientation-3' => 'Virada de 180°',
 'exif-orientation-4' => 'Inversada verticalament',
 'exif-orientation-5' => 'Virada de 90° dins lo sens antiorari e inversada verticalament',
-'exif-orientation-6' => 'Virada de 90° dins lo sens orari',
+'exif-orientation-6' => 'Virada de 90° dins lo sens antiorari',
 'exif-orientation-7' => 'Virada de 90° dins lo sens orari e inversada verticalament',
-'exif-orientation-8' => 'Virada de 90° dins lo sens antiorari',
+'exif-orientation-8' => 'Virada de 90° dins lo sens orari',
 
 'exif-planarconfiguration-1' => 'Donadas atenentas',
 'exif-planarconfiguration-2' => 'Donadas separadas',
@@ -3086,7 +3256,7 @@ Los autres ligams sus la meteissa linha son considerats coma d'excepcions, per e
 'exif-sensingmethod-7' => 'Captador trilinear',
 'exif-sensingmethod-8' => 'Captador de color linear sequencial',
 
-'exif-filesource-3' => 'Aparelh fotografic numeric',
+'exif-filesource-3' => 'Aparelh de fòto numeric',
 
 'exif-scenetype-1' => 'Imatge dirèctament fotografiat',
 
@@ -3136,6 +3306,10 @@ Los autres ligams sus la meteissa linha son considerats coma d'excepcions, per e
 'exif-gpslongitude-e' => 'Longitud Èst',
 'exif-gpslongitude-w' => 'Longitud Oèst',
 
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|mètre|mètres}} en dessús del nivèl de la mar',
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|mètre|mètres}} en dejós del nivèl de la mar',
+
 'exif-gpsstatus-a' => 'Mesura en cors',
 'exif-gpsstatus-v' => 'Interoperabilitat de la mesura',
 
@@ -3152,19 +3326,58 @@ Los autres ligams sus la meteissa linha son considerats coma d'excepcions, per e
 'exif-gpsdestdistance-m' => 'Milas anglesas',
 'exif-gpsdestdistance-n' => 'Milas nauticas',
 
+'exif-gpsdop-excellent' => 'Excellenta ($1)',
+'exif-gpsdop-good' => 'Bona ($1)',
+'exif-gpsdop-moderate' => 'Mejana ($1)',
+'exif-gpsdop-fair' => 'Passable ($1)',
+'exif-gpsdop-poor' => 'Marrida ($1)',
+
+'exif-objectcycle-a' => 'Matin solament',
+'exif-objectcycle-p' => 'Serada solament',
+'exif-objectcycle-b' => 'Matin e ser',
+
 # Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
 'exif-gpsdirection-t' => 'Direccion vertadièra',
 'exif-gpsdirection-m' => 'Nòrd magnetic',
 
+'exif-ycbcrpositioning-1' => 'Centrat',
+'exif-ycbcrpositioning-2' => 'Cosituat',
+
+'exif-dc-contributor' => 'Contributors',
+'exif-dc-coverage' => 'Portada espaciala o temporala del mèdia',
+'exif-dc-date' => 'Data(s)',
+'exif-dc-publisher' => 'Editor',
+'exif-dc-relation' => 'Mèdias connèxes',
+'exif-dc-rights' => 'dreches',
+'exif-dc-source' => 'Mèdia font',
+'exif-dc-type' => 'Tipe de mèdia',
+
+'exif-rating-rejected' => 'Regetat',
+
+'exif-isospeedratings-overflow' => 'Mai grand que 65535',
+
+'exif-iimcategory-ace' => 'Arts, cultura e lésers',
+'exif-iimcategory-clj' => 'Crime e drech',
+'exif-iimcategory-dis' => 'Catastròfas e accidents',
+'exif-iimcategory-fin' => 'Economia e afars',
 'exif-iimcategory-edu' => 'Educacion',
 'exif-iimcategory-evn' => 'Environament',
 'exif-iimcategory-hth' => 'Santat',
+'exif-iimcategory-hum' => 'Interès uman',
 'exif-iimcategory-lab' => 'Tribailh',
+'exif-iimcategory-lif' => 'Mòde de vida e de lésers',
 'exif-iimcategory-pol' => 'Politic',
 'exif-iimcategory-rel' => 'Religion e cresenças',
 'exif-iimcategory-sci' => 'Sciéncia e tecnologia',
+'exif-iimcategory-soi' => 'Questions socialas',
 'exif-iimcategory-spo' => 'Espòrts',
 'exif-iimcategory-war' => 'Guèrra, conflictes',
+'exif-iimcategory-wea' => 'Metèo',
+
+'exif-urgency-normal' => 'Normala ($1)',
+'exif-urgency-low' => 'Febla ($1)',
+'exif-urgency-high' => 'Nauta ($1)',
+'exif-urgency-other' => "Urgéncia definida per l'utilizaire ($1)",
 
 # External editor support
 'edit-externally' => 'Modificar aqueste fichièr en utilizant una aplicacion extèrna',
@@ -3369,7 +3582,7 @@ Picatz lo nom del fichièr sens lo prefix « {{ns:file}}: »",
 * <strong class="mw-specialpagerestricted">en gras</strong> son restrenhudas.',
 'specialpages-group-maintenance' => 'Rapòrts de mantenença',
 'specialpages-group-other' => 'Autras paginas especialas',
-'specialpages-group-login' => 'Se connectar / s’enregistrar',
+'specialpages-group-login' => "S'identificar / s'inscriure",
 'specialpages-group-changes' => 'Darrièrs cambiaments e jornals',
 'specialpages-group-media' => 'Rapòrts dels fichièrs de mèdias e dels impòrts',
 'specialpages-group-users' => 'Utilizaires e dreches estacats',
@@ -3408,9 +3621,15 @@ Picatz lo nom del fichièr sens lo prefix « {{ns:file}}: »",
 'tags-hitcount' => '$1 {{PLURAL:$1|cambiament|cambiaments}}',
 
 # Special:ComparePages
+'comparepages' => 'Comparar de paginas',
+'compare-selector' => 'Comparar las versions de las paginas',
 'compare-page1' => 'Pagina 1',
 'compare-page2' => 'Pagina 2',
+'compare-rev1' => 'Version 1',
+'compare-rev2' => 'Version 2',
 'compare-submit' => 'Comparar',
+'compare-invalid-title' => "Lo títol qu'avètz especificat es incorrècte.",
+'compare-title-not-exists' => "Lo títol qu'avètz especificat existís pas",
 
 # Database error messages
 'dberr-header' => 'Aqueste wiki a un problèma',
@@ -3434,13 +3653,51 @@ Picatz lo nom del fichièr sens lo prefix « {{ns:file}}: »",
 'htmlform-selectorother-other' => 'Autre',
 
 # New logging system
+'revdelete-content-hid' => 'contengut amagat',
+'revdelete-summary-hid' => 'resumit de modificacion amagat',
+'revdelete-uname-hid' => 'nom d’utilizaire amagat',
+'revdelete-content-unhid' => 'contengut afichat',
+'revdelete-summary-unhid' => 'resumit de modificacion afichat',
+'revdelete-uname-unhid' => 'nom d’utilizaire afichat',
 'revdelete-restricted' => 'aplicar las restriccions als administrators',
 'revdelete-unrestricted' => 'restriccions levadas pels administrators',
+'logentry-move-move' => '$1 a deplaçat la pagina $3 cap a $4',
+'logentry-move-move-noredirect' => '$1 a deplaçat la pagina $3 cap a $4 sens daissar cap de redireccion',
+'logentry-move-move_redir' => '$1 a deplaçat la pagina $3 cap a $4 per dessús una redireccion',
+'logentry-move-move_redir-noredirect' => '$1 a deplaçat la pagina $3 cap a $4 per dessús una redireccion sens daissar cap de redireccion',
+'logentry-newusers-newusers' => "Lo compte d'utilizaire $1 es estat creat",
+'logentry-newusers-create' => "Lo compte d'utilizaire $1 es estat creat",
+'logentry-newusers-create2' => "Lo compte d'utilizaire $3 es estat creat per $1",
+'logentry-newusers-autocreate' => 'Lo compte $1 es estat creat automaticament',
 'newuserlog-byemail' => 'senhal mandat per corrièr electronic',
 'rightsnone' => '(cap)',
 
+# Feedback
+'feedback-subject' => 'Subjècte :',
+'feedback-message' => 'Messatge :',
+'feedback-cancel' => 'Anullar',
+'feedback-submit' => 'Mandar vòstres comentaris',
+'feedback-close' => 'Fach',
+
 # Search suggestions
 'searchsuggest-search' => 'Recercar',
 'searchsuggest-containing' => 'que conten...',
 
+# API errors
+'api-error-unknown-code' => 'Error desconeguda : « $1 »',
+'api-error-unknown-warning' => 'Avertiment desconegut : $1',
+'api-error-unknownerror' => 'Error desconeguda : « $1 »',
+'api-error-uploaddisabled' => 'Lo cargament es desactivat sus aqueste wiki.',
+
+# Durations
+'duration-seconds' => '$1 segonda{{PLURAL:$1||s}}',
+'duration-minutes' => '$1 minuta{{PLURAL:$1||s}}',
+'duration-hours' => '$1 ora{{PLURAL:$1||s}}',
+'duration-days' => '$1 jorn{{PLURAL:$1||s}}',
+'duration-weeks' => '$1 setmana{{PLURAL:$1||s}}',
+'duration-years' => '$1 annada{{PLURAL:$1||s}}',
+'duration-decades' => '$1 decenni{{PLURAL:$1||s}}',
+'duration-centuries' => '$1 sègle{{PLURAL:$1||s}}',
+'duration-millennia' => '$1 milleni{{PLURAL:$1||s}}',
+
 );
index ab98175..6e9b9cb 100644 (file)
@@ -289,7 +289,7 @@ $messages = array(
 'tog-externaleditor' => 'ବାହାର ସମ୍ପାଦକଟି ଆପଣାଛାଏଁ ବ୍ୟବହାର କରିବେ (କେବଳ ପଟୁ ସଭ୍ୟଙ୍କ ପାଇଁ, ଏଥି ନିମନ୍ତେ ଆପଣଙ୍କ କମ୍ପୁଟରରେ ବିଶେଷ ସଜାଣି ଲୋଡ଼ା । [//www.mediawiki.org/wiki/Manual:External_editors ଅଧିକ ସୂଚନା])',
 'tog-externaldiff' => 'ବାହାର ବାଛିବା (external diff) ଆପଣାଛାଏଁ ବ୍ୟବହାର କରିବେ (କେବଳ ପଟୁ ସଭ୍ୟଙ୍କ ପାଇଁ, ଏଥି ନିମନ୍ତେ ଆପଣଙ୍କ କମ୍ପୁଟରରେ ବିଶେଷ ସଜାଣି ଲୋଡ଼ା । [//www.mediawiki.org/wiki/Manual:External_editors ଅଧିକ ସୂଚନା])',
 'tog-showjumplinks' => '"ଡେଇଁଯିବେ" ଲିଙ୍କସବୁକୁ ସଚଳ କରିବେ',
-'tog-uselivepreview' => 'ଲà­\87à¬\96ିବା à¬¬à­\87ଳà­\87 à¬¬à¬¦à¬³ à¬¦à­\87à¬\96ିବà­\87(ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
+'tog-uselivepreview' => 'ସାଥà­\87 à¬¸à¬¾à¬¥à­\87 à¬\9aାଲିଥିବା à¬¦à­\87à¬\96ଣା à¬¬à­\8dà­\9fବହାର à¬\95ରିବà­\87 (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
 'tog-forceeditsummary' => 'ଖାଲି ସମ୍ପାଦନା ସାରକଥାକୁ ଯିବା ବେଳେ ମୋତେ ଜଣାଇବେ',
 'tog-watchlisthideown' => 'ମୋ ଦେଖଣା ତାଲିକାରେ ମୋ ନିଜର ସମ୍ପାଦନାଗୁଡ଼ିକ ଲୁଚାଇବେ',
 'tog-watchlisthidebots' => 'ଦେଖଣା ତାଲିକାରେ ବଟ ଦେଇ ବଦଳ ଗୁଡ଼ିକ ଲୁଚାଇବେ',
index ae0a53d..ff05c7b 100644 (file)
@@ -294,7 +294,7 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'vector-action-protect' => 'ਸੁਰੱਖਿਅਤ ਕਰੋ',
 'vector-action-undelete' => 'ਅਣ-ਮਿਟਾਉਣਾ',
 'vector-action-unprotect' => 'ਸੁਰੱਖਿਆ ਬਦਲੋ',
-'vector-simplesearch-preference' => 'ਵਾਧà©\82 à¨\96à©\8bà¨\9c à¨¸à¨²à¨¾à¨¹à¨¾à¨\82 ਯੋਗ ਕਰੋ (ਸਿਰਫ਼ ਵਿਕਟਰ ਸਕਿੰਨ ਵਿਚ)',
+'vector-simplesearch-preference' => 'ਸਧਾਰਨ à¨\96à©\8bà¨\9c à¨¸à¨²à¨¾à¨¹ à¨ªà©±à¨\9fà©\80 ਯੋਗ ਕਰੋ (ਸਿਰਫ਼ ਵਿਕਟਰ ਸਕਿੰਨ ਵਿਚ)',
 'vector-view-create' => 'ਬਣਾਓ',
 'vector-view-edit' => 'ਸੰਪਾਦਨ',
 'vector-view-history' => 'ਇਤਿਹਾਸ ਵੇਖੋ',
@@ -328,7 +328,7 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'undelete_short' => '{{PLURAL:$1|ਇੱਕ ਸੋਧ|$1 ਸੋਧਾਂ}} ਅਣ-ਮਿਟਾਓ',
 'viewdeleted_short' => '{{PLURAL:$1|ਇਕ ਮਿਟਾਈ ਸੋਧ|$1 ਮਿਟਾਈਆਂ ਸੋਧਾਂ}} ਵੇਖੋ',
 'protect' => 'ਸੁਰੱਖਿਆ',
-'protect_change' => 'ਤਬਦà©\80ਲੀ',
+'protect_change' => 'ਬਦਲੀ',
 'protectthispage' => 'ਇਹ ਸਫ਼ਾ ਸੁਰੱਖਿਅਤ ਕਰੋ',
 'unprotect' => 'ਸੁਰੱਖਿਆ ਬਦਲੋ',
 'unprotectthispage' => 'ਇਹ ਸਫ਼ੇ ਦੀ ਸੁਰੱਖਿਆ ਬਦਲੋ',
@@ -399,7 +399,7 @@ $1',
 'retrievedfrom' => '"$1" ਤੋਂ ਲਿਆ',
 'youhavenewmessages' => 'ਤੁਹਾਡੇ ਲਈ $1। ($2)',
 'newmessageslink' => 'ਨਵੇਂ ਸੁਨੇਹੇ',
-'newmessagesdifflink' => 'à¨\86à¨\96ਰà©\80 à¨¤à¨¬à¨¦à©\80ਲੀ',
+'newmessagesdifflink' => 'ਪਿà¨\9bਲà©\80 à¨¬à¨¦ਲੀ',
 'youhavenewmessagesfromusers' => '{{PLURAL:$3|ਇੱਕ ਵਰਤੋਂਕਾਰ|$3 ਵਰਤੋਂਕਾਰਾਂ}} ਵੱਲੋਂ ਤੁਹਾਨੂੰ $1 ($2)।',
 'youhavenewmessagesmanyusers' => 'ਕਈ ਵਰਤੋਂਕਾਰਾਂ ਵੱਲੋਂ ਤੁਹਾਨੂੰ $1 ($2)।',
 'newmessageslinkplural' => '{{PLURAL:$1|ਇੱਕ ਨਵਾਂ ਸੁਨੇਹਾ|ਨਵੇਂ ਸੁਨੇਹੇ}} {{PLURAL:$1|ਹੈ|ਹਨ}}',
@@ -432,7 +432,7 @@ $1',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'ਪੰਨਾ',
-'nstab-user' => 'ਮà©\88à¨\82ਬਰ ਪੰਨੇ',
+'nstab-user' => 'ਵਰਤà©\8bà¨\82à¨\95ਾਰ ਪੰਨੇ',
 'nstab-media' => 'ਮੀਡੀਆ ਸਫ਼ਾ',
 'nstab-special' => 'ਖਾਸ ਪੰਨਾ',
 'nstab-project' => 'ਪਰਿਯੋਜਨਾ ਪੰਨਾ',
@@ -458,18 +458,17 @@ $1',
 ਹੋ ਸਕਦਾ ਹੈ ਇਹ ਤਰੁ੍ੱਟੀ ਸਾਫ਼ਟਵੇਅਰ ਦੀ ਹੋਵੇ।
 ਇਸ ਗਣਿਤਫ਼ਲ "<tt>$2</tt>" ਵਿਚੌਂ ਪਿਛਲੀ ਡੈਟਬਾਸ ਪੁੱਛ ਗਿੱਛ ਸੀ: <blockquote><tt>$1</tt></blockquote.
 ਡੈਟਾਬੇਸ ਨੇ ਇਹ ਤਰੁੱਟੀ "<tt>$3: $4</tt>"ਜਵਾਬ ਵਿਚ ਦਿੱਤੀ।',
-'dberrortextcl' => 'ਡੈਟਾਬੇਸ ਪੁ੍ਛ ਗਿੱਛ ਵਿਚ ਹਿਦਾਇਤਾਂ ਦੀ ਤਰੁੱਟੀ ਮਿਲੀ ਹੈ।
-ਹੋ ਸਕਦਾ ਹੈ ਇਹ ਤਰੁੱਟੀ ਸਾਫ਼ਟਵੇਅਰ ਦੀ ਹੋਵੇ।
-ਇਸ ਗਣਿਤਫ਼ਲ "$2" ਵਿਚੌਂ ਪਿਛਲੀ ਡੈਟਬਾਸ ਪੁੱਛ ਗਿੱਛ ਸੀ: "$1".
-ਡੈਟਾਬੇਸ ਨੇ ਇਹ ਤਰੁੱਟੀ "$1"ਜਵਾਬ ਵਿਚ ਦਿੱਤੀ।',
+'dberrortextcl' => 'ਡੈਟਾਬੇਸ ਪੁੱਛਗਿੱਛ ਵਿਚ ਹਿਦਾਇਤ ਗਲਤੀ ਮਿਲੀ ਹੈ।
+ਫੰਕਸ਼ਨ "$2" ਤੋਂ ਪਿਛਲੀ ਡਾਟਬਾਸ ਪੁੱਛ ਗਿੱਛ ਸੀ: "$1".
+ਡੈਟਾਬੇਸ ਨੇ ਇਹ ਗਲਤੀ "$3:$4" ਦਿੱਤੀ',
 'laggedslavemode' => "'''ਖ਼ਬਰਦਾਰ:''' ਹੋ ਸਕਦਾ ਹੈ ਸਫ਼ੇ ਵਿਚ ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਸ਼ਾਮਲ ਨਾ ਹੋਣ।",
 'readonly' => 'ਡਾਟਾਬੇਸ ਲਾਕ ਹੈ',
 'enterlockreason' => 'ਤਾਲਾ-ਬੰਦੀ ਲਈ ਕਾਰਨ ਦਾਖ਼ਲ ਕਰੋ, ਨਾਲ਼ ਹੀ ਤਾਲਾ-ਬੰਦੀ ਦੇ ਰਿਲੀਜ਼ ਹੋਣ ਦਾ ਅੰਦਾਜ਼ਨ ਵਕਤ',
 'readonlytext' => 'ਡੈਟਾਬੇਸ ਨੂੰ ਇਸ ਵੇਲ਼ੇ ਤਾਲਾ ਲੱਗਾ ਹੋਇਆ ਹੈ, ਸ਼ਾਇਦ ਆਮ ਰੱਖ-ਰਖਾਵ ਲਈ, ਇਸਤੋਂ ਬਾਅਦ ਇਹ ਆਮ ਵਾਂਗ ਉਪਲੱਬਧ ਹੋਵੇਗਾ।
 ਜਿਸ ਪ੍ਰਬੰਧਕ ਨੇ ਇਸਨੂੰ ਤਾਲਾ ਲਾਇਆ ਹੈ ਉਸਦਾ ਕਹਿਣਾ ਹੈ ਕਿ: $1',
 'missing-article' => "ਡਾਟਾਬੇਸ ਨੂੰ ''$1'' $2 ਨਾਮ ਦਾ ਕੋਈ ਪੰਨਾ ਨਹੀਂ ਮਿਲਿਆ।
-à¨\86ਮ à¨¤à©\8cਰ à¨¤à©\87 à¨®à¨¿à¨\9fਾà¨\8f à¨\9cਾ à¨\9aà©\81ੱà¨\95à©\87 à¨ªà©°à¨¨à©\87 à¨¦à©\80 à¨\85ਤà©\80ਤ ਕੜੀ ਦੀ ਵਰਤੋਂ ਕਰਨ ਨਾਲ ਇੰਝ ਹੁੰਦਾ ਹੈ।
-à¨\9cà©\87 à¨\87ਹ à¨\97ੱਲ à¨¨à¨¹à©\80à¨\82 à¨¤à¨¾à¨\82 à¨¹à©\8b à¨¸à¨\95ਦਾ à¨¹à©\88 à¨¤à©\81ਹਾਨà©\82à©° à¨¸à¨¾à¨«à¨¼à¨\9fਵà©\87à¨\85ਰ à¨µà¨¿à¨\9a à¨\96ਾਮà©\80 à¨®à¨¿à¨² à¨\97à¨\88 à¨¹à©\88। à¨®à¨¿à¨¹à¨°à¨¬à¨¾à¨¨à©\80 ਕਰਕੇ ਪੰਨੇ ਦੇ ਪਤੇ ਸਮੇਤ [[Special:ListUsers/sysop|administrator]] ਨੂੰ ਇਤਲਾਹ ਦਿਓ।",
+à¨\86ਮ à¨¤à©\8cਰ à¨¤à©\87 à¨¹à¨\9fਾà¨\88 à¨\9cਾ à¨\9aà©\81ੱà¨\95à©\87 à¨ªà©°à¨¨à©\87 à¨¦à¨¾ à¨\87ਤਿਹਾਸ ਕੜੀ ਦੀ ਵਰਤੋਂ ਕਰਨ ਨਾਲ ਇੰਝ ਹੁੰਦਾ ਹੈ।
+à¨\9cà©\87 à¨\87ਹ à¨\97ੱਲ à¨¨à¨¹à©\80à¨\82 à¨¤à¨¾à¨\82 à¨¹à©\8b à¨¸à¨\95ਦਾ à¨¹à©\88 à¨¤à©\81ਹਾਨà©\82à©° à¨¸à¨¾à¨«à¨¼à¨\9fਵà©\87à¨\85ਰ à¨µà¨¿à¨\9a à¨\96ਾਮà©\80 à¨®à¨¿à¨² à¨\97à¨\88 à¨¹à©\88। à¨\95ਿਰਪਾ ਕਰਕੇ ਪੰਨੇ ਦੇ ਪਤੇ ਸਮੇਤ [[Special:ListUsers/sysop|administrator]] ਨੂੰ ਇਤਲਾਹ ਦਿਓ।",
 'missingarticle-rev' => '(ਬਦਲਾਅ#: $1)',
 'missingarticle-diff' => '(ਫ਼ਰਕ: $1, $2)',
 'readonly_lag' => 'ਜਦੌਂ ਤਕ ਅਧੀਨ ਡੇਟਾਬੇਸ ਸਰਵਰ ਸੁਤੰਤਰ ਡੈਟਾਬੇਸ ਸਰਵਰ ਦੀ ਪਕੜ ਵਿਚ ਨਹੀਂ ਆ ਜਾਂਦੇ ਡੈਟਾਬੇਸ ਸਵੈ ਜਕੜਿਆ ਗਿਆ ਹੈ।',
@@ -496,7 +495,7 @@ $1',
 'viewsource' => 'ਸਰੋਤ ਵੇਖੋ',
 'viewsource-title' => '$1 ਲਈ ਸਰੋਤ ਵੇਖੋ',
 'actionthrottled' => 'ਕਾਰਜ ਬੰਦ ਕਰ ਦਿੱਤਾ ਗਿਆ ਹੈ',
-'protectedpagetext' => 'à¨\87ਹ à¨¸à¨«à¨¼à¨¾ à¨«à©\87ਰ-ਬਦਲ à¨\95ਰਨ à¨\96਼ਿਲਾਫ਼ à¨¸à©\81ਰੱà¨\96ਿà¨\85ਤ ਹੈ।',
+'protectedpagetext' => 'à¨\87ਹ à¨ªà©°à¨¨à©\87 à¨¸à©°à¨ªà¨¾à¨¦à¨¨ à¨\85ਤà©\87 à¨¹à©\8bਰ à¨\95ੰਮ à¨¤à©\8bà¨\82 à¨¸à©\81ਰੱà¨\96ਿà¨\85ਤ à¨\95à©\80ਤਾ à¨¹à©\8bà¨\87à¨\86 ਹੈ।',
 'viewsourcetext' => 'ਤੁਸੀਂ ਇਸ ਸਫ਼ੇ ਦਾ ਸਰੋਤ ਵੇਖ ਅਤੇ ਨਕਲ ਕਰ ਸਕਦੇ ਹੋ:',
 'viewyourtext' => 'ਤੁਸੀਂ ਇਸ ਸਫ਼ੇ ’ਤੇ ਕੀਤੀਆਂ "ਆਪਣੀਆਂ ਸੋਧਾਂ" ਦਾ ਸਰੋਤ ਵੇਖ ਅਤੇ ਨਕਲ ਕਰ ਸਕਦੇ ਹੋ:',
 'protectedinterface' => 'ਇਹ ਪੰਨਾ ਸਾਫ਼ਟਵੇਅਰ ਇੰਟਰਫ਼ੇਸ ਦਾ ਮੂਲ ਪਾਠ ਹੈ ,ਅਤੇ ਦੁਰਵਰਤੌਂ ਤੌਂ ਬਚਾਅ ਲਈ ਰਾਖਵਾਂ ਕੀਤਾ ਗਿਆ ਹੈ।',
@@ -677,7 +676,7 @@ $2
 # Edit pages
 'summary' => 'ਸਾਰ:',
 'subject' => 'ਵਿਸ਼ਾ/ਹੈੱਡਲਾਈਨ:',
-'minoredit' => 'à¨\87ਹ à¨\87ੱà¨\95 à¨\9bà©\8bà¨\9fà©\80 à¨¤à¨¬à¨¦à©\80ਲੀ ਹੈ',
+'minoredit' => 'à¨\87ਹ à¨\87ੱà¨\95 à¨\9bà©\8bà¨\9fà©\80 à¨¬à¨¦ਲੀ ਹੈ',
 'watchthis' => 'ਇਸ ਪੰਨੇ ’ਤੇ ਧਿਆਨ ਰੱਖੋ',
 'savearticle' => 'ਪੰਨਾ ਸਾਂਭੋ',
 'preview' => 'ਝਲਕ',
@@ -747,7 +746,7 @@ sysop}}|administrator]] ਨਾਲ ਰਾਬਤਾ ਕਰ ਸਕਦੇ ਹੋ।
 '''ਇਹ ਹਾਲੇ ਸਾਂਭੀ ਨਹੀਂ ਗਈ ਹੈ!'''",
 'updated' => '(ਅੱਪਡੇਟ)',
 'note' => "'''ਨੋਟ:'''",
-'previewnote' => "'''ਯਾਦ à¨°à©±à¨\96à©\8b à¨\87ਹ à¨¸à¨¿à¨°à¨«à¨¼ à¨\87à¨\95 à¨\9dਲà¨\95 à¨¹à©\88।''' à¨¤à©\81ਹਾਡà©\80à¨\86à¨\82 à¨¤à¨¬à¨¦à©\80ਲੀਆਂ ਹਾਲੇ ਸਾਂਭੀਆਂ ਨਹੀਂ ਗਈਆਂ!",
+'previewnote' => "'''ਯਾਦ à¨°à©±à¨\96à©\8b à¨\87ਹ à¨\95à©\87ਵਲ à¨\87ੱà¨\95 à¨\9dਲà¨\95 à¨¹à©\88।''' à¨¤à©\81ਹਾਡà©\80à¨\86à¨\82 à¨¬à¨¦ਲੀਆਂ ਹਾਲੇ ਸਾਂਭੀਆਂ ਨਹੀਂ ਗਈਆਂ!",
 'continue-editing' => 'ਸੰਪਾਦਨ ਜਾਰੀ ਰੱਖੋ',
 'previewconflict' => 'ਇਹ ਝਲਕ ਲਿਖਤ ਦਾ ਓਹ ਅਕਸ ਪੇਸ਼ ਕਰਦੀ ਹੈ ਜਿਵੇਂ ਓਹ ਤੁਹਾਡੇ ਸਾਂਭੇ ਜਾਣ ਤੋਂ ਬਾਅਦ ਦਿੱਸੇਗਾ।',
 'editing' => '$1 ਸੰਪਾਦਨ',
@@ -783,13 +782,13 @@ $1 ਲੁਕਵੀਆਂ ਸ਼੍ਰੇਣੀਆਂ}} ਦਾ ਮੈਂਬਰ 
 'permissionserrors' => 'ਅਧਿਕਾਰ ਗਲਤੀਆਂ',
 'permissionserrorstext' => 'ਤੁਹਾਨੂੰ ਇੰਝ ਕਰਨ ਦੇ ਅਧਿਕਾਰ ਨਹੀਂ ਹਨ। ਹੇਠ ਦਿੱਤੇ {{PLURAL:$1|ਕਾਰਨ|ਕਾਰਨ}} ਨੇ:',
 'permissionserrorstext-withaction' => '{{PLURAL:$1|ਇਸ ਕਾਰਨ|ਇਹਨਾਂ ਕਾਰਨਾਂ}} ਕਰਕੇ ਤੁਹਾਨੂੰ $2 ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ:',
-'recreate-moveddeleted-warn' => "'''à¨\96ਬਰਦਾਰ:
+'recreate-moveddeleted-warn' => "'''à¨\9aਿਤਾਵਣà©\80:
 ਤੁਸੀਂ ਐਸਾ ਪੰਨਾ ਬਣਾ ਰਹੇ ਹੋ ਜੋ ਪਹਿਲਾਂ ਹਟਾਇਆ ਜਾ ਚੁੱਕਾ ਹੈ।'''
 
 ਖਿਆਲ ਕਰੋ ਕਿ ਕੀ ਇਸ ਪੰਨੇ ਦਾ ਕਾਇਮ ਰਹਿਣਾ ਠੀਕ ਹੈ।
 ਇਸਨੂੰ ਮਿਟਾਉਣ ਜਾਂ ਸਿਰਲੇਖ ਬਦਲੀ ਦਾ ਚਿੱਠਾ ਹੇਠਾਂ ਦਿੱਤਾ ਗਿਆ ਹੈ।",
 'moveddeleted-notice' => 'ਇਹ ਪੰਨਾ ਹਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ।
-à¨\87ਸਦà©\87 à¨®à¨¿ਟਾਉਣ ਜਾਂ ਸਿਰਲੇਖ ਬਦਲੀ ਦਾ ਚਿੱਠਾ ਹਵਾਲੇ ਲਈ ਹੇਠ ਦਿੱਤਾ ਗਿਆ ਹੈ।',
+à¨\87ਸਦà©\87 à¨¹ਟਾਉਣ ਜਾਂ ਸਿਰਲੇਖ ਬਦਲੀ ਦਾ ਚਿੱਠਾ ਹਵਾਲੇ ਲਈ ਹੇਠ ਦਿੱਤਾ ਗਿਆ ਹੈ।',
 'log-fulllog' => 'ਪੂਰਾ ਚਿੱਠਾ ਵੇਖੋ',
 'edit-gone-missing' => 'ਸਫ਼ਾ ਅਪਡੇਟ ਨਹੀਂ ਹੋ ਸਕਿਆ।
 ਲਗਦਾ ਹੈ ਮਿਟਾਇਆ ਜਾ ਚੁੱਕਾ ਹੈ।',
@@ -837,7 +836,7 @@ $3 ਨੇ ਕਾਰਨ ਇਹ ਦੱਸਿਆ ਹੈ, ''$2''",
 ਲੈਜਅੰਡ:
 '''({{int:cur}})''' = ਨਵੇਂ ਰੀਵਿਜਨ ਨਾਲੋਂ ਫ਼ਰਕ, '''({{int:last}})''' = ਆਖਰੀ ਰੀਵਿਜਨ ਨਾਲੋਂ ਫ਼ਰਕ, '''({{int:minoreditletter}})''' = ਛੋਟੀ ਸੋਧ।",
 'history-fieldset-title' => 'ਇਤਿਹਾਸ ਨੂੰ ਬ੍ਰਾਊਜ਼ ਕਰੋ',
-'history-show-deleted' => 'ਸਿਰਫ਼ à¨®à¨¿ਟਾਏ ਗਏ',
+'history-show-deleted' => 'ਸਿਰਫ਼ à¨¹ਟਾਏ ਗਏ',
 'histfirst' => 'ਸਭ ਤੋਂ ਪਹਿਲਾਂ ਦੇ',
 'histlast' => 'ਸਭ ਤੋਂ ਨਵਾਂ',
 'historysize' => '($1 ਬਾਈਟ)',
@@ -895,7 +894,7 @@ page={{FULLPAGENAMEE}}}} ਜ਼ਬਤੀ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵ
 'revdelete-radio-unset' => 'ਨਹੀਂ',
 'revdelete-unsuppress' => 'ਮੁੜ ਬਹਾਲ ਕੀਤੀਆਂ ਰੀਵਿਜ਼ਨਾਂ ਤੋਂ ਰੋਕਾਂ ਹਟਾਓ',
 'revdelete-log' => 'ਕਾਰਨ:',
-'revdelete-submit' => 'à¨\9aà©\81ਣà©\87 à¨°à©\80ਵਿà¨\9c਼ਨ à¨\89ੱਤà©\87 à¨²à¨¾à¨\97à©\82 à¨\95ਰà©\8b',
+'revdelete-submit' => 'ਚੁਣੇ ਰੀਵਿਜਨ ਉੱਤੇ ਲਾਗੂ ਕਰੋ',
 'logdelete-success' => "'''ਚਿੱਠੇ ਦੀ ਦਿੱਖ ਕਾਮਯਾਬੀ ਨਾਲ਼ ਸੈੱਟ ਕੀਤੀ।'''",
 'logdelete-failure' => "'''ਚਿੱਠੇ ਦੀ ਦਿੱਖ ਸੈੱਟ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ:''' $1",
 'revdel-restore' => 'ਦਿੱਖ ਬਦਲੋ',
@@ -1068,8 +1067,8 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'prefs-emailconfirm-label' => 'ਈ-ਮੇਲ ਤਸਦੀਕ:',
 'prefs-textboxsize' => 'ਸੋਧ ਖਿੜਕੀ ਦਾ ਅਕਾਰ',
 'youremail' => 'ਈ-ਮੇਲ:',
-'username' => 'ਯà©\82à¨\9c਼ਰ à¨¨à¨¾à¨\82:',
-'uid' => 'ਯà©\82à¨\9c਼ਰ ID:',
+'username' => 'ਵਰਤà©\8bà¨\82à¨\95ਾਰਨਾਮ:',
+'uid' => 'ਵਰਤà©\8bà¨\82à¨\95ਾਰ ID:',
 'prefs-memberingroups' => '{{PLURAL:$1|ਗਰੁੱਪ|ਗਰੁੱਪਾਂ}} ਦਾ ਮੈਂਬਰ:',
 'prefs-registration' => 'ਰਜਿਸਟ੍ਰੇਸ਼ਨ ਦਾ ਵਕਤ:',
 'yourrealname' => 'ਅਸਲੀ ਨਾਮ:',
@@ -1084,8 +1083,8 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'email' => 'ਈਮੇਲ',
 'prefs-help-realname' => 'ਅਸਲੀ ਨਾਂ ਚੋਣਵਾਂ ਹੈ, ਅਤੇ ਜੇ ਤੁਸੀਂ ਇਹ ਦਿੱਤਾ ਹੈ ਤਾਂ ਤੁਹਾਡੇ ਕੰਮ ਵਾਸਤੇ ਗੁਣ ਦੇ ਤੌਰ ਉੱਤੇ ਵਰਤਿਆ ਜਾਵੇਗਾ।',
 'prefs-help-email' => 'ਤੁਹਾਡੀ ਮਰਜ਼ੀ ਹੈ ਈਮੇਲ ਪਤਾ ਦਿਓ ਜਾਂ ਨਾ ਦਿਓ ਪਰ ਪਾਸਵਰਡ ਭੁੱਲ ਜਾਣ ਤੇ ਨਵਾਂ ਪਾਸਵਰਡ ਹਾਸਲ ਕਰਨ ਲਈ ਇਹ ਜ਼ਰੂਰੀ ਹੈ।',
-'prefs-help-email-others' => 'ਤà©\81ਸà©\80à¨\82 à¨\87ਹ à¨µà©\80 à¨\9aà©\81ਣ à¨¸à¨\95ਦà©\87 à¨¹à©\8b à¨\95ਿ à¨¤à©\81ਹਾਡà©\87 à¨®à©\88à¨\82ਬਰ à¨\9cਾà¨\82 à¨\9aਰà¨\9aਾ à¨ªà©°à¨¨à©\87 à¨¤à©\8bà¨\82 à¨¹à©\8bਰ à¨®à©\88à¨\82ਬਰ ਤੁਹਾਨੂੰ ਈ-ਮੇਲ ਭੇਜ ਸਕਣ?
-à¨\9cਦà©\8bà¨\82 à¨¹à©\8bਰ à¨®à©\88à¨\82ਬਰ ਤੁਹਾਨੂੰ ਈ-ਮੇਲ ਭੇਜਦੇ ਹਨ ਤਾਂ ਤੁਹਾਡਾ ਈ-ਮੇਲ ਪਤਾ ਜ਼ਾਹਰ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ।',
+'prefs-help-email-others' => 'ਤà©\81ਸà©\80à¨\82 à¨\87ਹ à¨µà©\80 à¨\9aà©\81ਣ à¨¸à¨\95ਦà©\87 à¨¹à©\8b à¨\95ਿ à¨¤à©\81ਹਾਡà©\87 à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ à¨\9cਾà¨\82 à¨\9aਰà¨\9aਾ à¨ªà©°à¨¨à©\87 à¨¤à©\8bà¨\82 à¨¹à©\8bਰ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ ਤੁਹਾਨੂੰ ਈ-ਮੇਲ ਭੇਜ ਸਕਣ?
+à¨\9cਦà©\8bà¨\82 à¨¹à©\8bਰ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ ਤੁਹਾਨੂੰ ਈ-ਮੇਲ ਭੇਜਦੇ ਹਨ ਤਾਂ ਤੁਹਾਡਾ ਈ-ਮੇਲ ਪਤਾ ਜ਼ਾਹਰ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ।',
 'prefs-help-email-required' => 'ਈ-ਮੇਲ ਪਤਾ ਚਾਹੀਦਾ ਹੈ।',
 'prefs-info' => 'ਮੁੱਢਲੀ ਜਾਣਕਾਰੀ',
 'prefs-signature' => 'ਦਸਤਖ਼ਤ',
@@ -1106,7 +1105,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'userrights-lookup-user' => 'ਯੂਜ਼ਰ ਗਰੁੱਪ ਦੇਖਭਾਲ',
 'userrights-user-editname' => 'ਇੱਕ ਯੂਜ਼ਰ ਨਾਂ ਦਿਓ:',
 'editusergroup' => 'ਯੂਜ਼ਰ ਗਰੁੱਪ ਸੋਧ',
-'editinguser' => '<b>$1</b> à¨¯à©\82à¨\9c਼ਰ ਸੋਧਿਆ ਜਾ ਰਿਹਾ ਹੈ ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])',
+'editinguser' => '<b>$1</b> à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ ਸੋਧਿਆ ਜਾ ਰਿਹਾ ਹੈ ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])',
 'userrights-editusergroup' => 'ਯੂਜ਼ਰ ਗਰੁੱਪ ਸੋਧ',
 'saveusergroups' => 'ਯੂਜ਼ਰ ਗਰੁੱਪ ਸੰਭਾਲੋ',
 'userrights-groupsmember' => 'ਇਸ ਦਾ ਮੈਂਬਰ:',
@@ -1183,31 +1182,31 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'action-sendemail' => 'ਈ-ਮੇਲਾਂ ਭੇਜਣ',
 
 # Recent changes
-'nchanges' => '$1 {{PLURAL:$1|ਤਬਦà©\80ਲੀ|
-ਤਬਦà©\80ਲੀਆਂ}}',
+'nchanges' => '$1 {{PLURAL:$1|ਬਦਲੀ|
+ਬਦਲੀਆਂ}}',
 'recentchanges' => 'ਹਾਲ ਹੀ ’ਚ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ',
-'recentchanges-legend' => 'ਹਾਲ à¨¦à©\80à¨\86à¨\82 à¨¤à¨¬à¨¦à©\80ਲੀਆਂ ਸਬੰਧੀ ਚੋਣਾਂ',
+'recentchanges-legend' => 'ਹਾਲ à¨¦à©\80à¨\86à¨\82 à¨¬à¨¦ਲੀਆਂ ਸਬੰਧੀ ਚੋਣਾਂ',
 'recentchanges-summary' => 'ਇਸ ਵਿਕੀ ’ਤੇ ਹੋਈਆਂ ਸਭ ਤੋਂ ਨਵੀਆਂ ਤਬਦੀਲੀਆਂ ਇਸ ਸਫ਼ੇ ’ਤੇ ਵੇਖੋ।',
-'recentchanges-feed-description' => 'à¨\87ਸ à¨µà¨¿à¨\95à©\80 â\80\99ਤà©\87 à¨¹à¨¾à¨² à¨¹à©\80 à¨µà¨¿à¨\9a à¨¹à©\8bà¨\88à¨\86à¨\82 à¨¤à¨¬à¨¦à©\80ਲੀਆਂ ਇਸ ਫ਼ੀਡ ’ਚ ਵੇਖੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ।',
+'recentchanges-feed-description' => 'à¨\87ਸ à¨µà¨¿à¨\95à©\80 â\80\99ਤà©\87 à¨¹à¨¾à¨² à¨¹à©\80 à¨µà¨¿à¨\9a à¨¹à©\8bà¨\88à¨\86à¨\82 à¨¬à¨¦ਲੀਆਂ ਇਸ ਫ਼ੀਡ ’ਚ ਵੇਖੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ।',
 'recentchanges-label-newpage' => 'ਇਹ ਸੰਪਾਦਨ ਨੇ ਨਵਾਂ ਪੰਨਾ ਬਣਾਇਆ ਹੈ',
 'recentchanges-label-minor' => 'ਇਹ ਇੱਕ ਛੋਟਾ ਸੰਪਾਦਨ ਹੈ',
 'recentchanges-label-bot' => 'ਇਹ ਸੰਪਾਦਨ ਬੋਟ ਵਲੋਂ ਕੀਤੀ ਗਈ ਹੈ',
 'recentchanges-label-unpatrolled' => 'ਇਹ ਫੇਰ-ਬਦਲ ਹਾਲੇ ਵੇਖਿਆ ਨਹੀਂ ਗਿਆ',
-'rcnote' => "$4, $5 à¨¤à©±à¨\95 à¨\86à¨\96ਰà©\80 {{PLURAL:$2|ਦਿਨ|'''$2''' à¨¦à¨¿à¨¨à¨¾à¨\82}} à¨µà¨¿à©±à¨\9a {{PLURAL:$1|'''1''' à¨¤à¨¬à¨¦à©\80ਲà©\80 à¨¹à©\8bà¨\88 à¨¹à©\88।|'''$1''' à¨¤à¨¬à¨¦à©\80ਲੀਆਂ ਹੋਈਆਂ ਹਨ।}}",
+'rcnote' => "$4, $5 à¨¤à©±à¨\95 à¨\86à¨\96ਰà©\80 {{PLURAL:$2|ਦਿਨ|'''$2''' à¨¦à¨¿à¨¨à¨¾à¨\82}} à¨µà¨¿à©±à¨\9a {{PLURAL:$1|'''1''' à¨¬à¨¦à¨²à©\80 à¨¹à©\8bà¨\88 à¨¹à©\88।|'''$1''' à¨¬à¨¦ਲੀਆਂ ਹੋਈਆਂ ਹਨ।}}",
 'rcnotefrom' => "'''$2''' ਤੱਕ ('''$1''' ਤੱਕ ਦਿੱਸਦੀਆਂ) ਤਬਦੀਲੀਆਂ ਹੇਠ ਦਿੱਤੀਆਂ ਹਨ।",
-'rclistfrom' => '$1 à¨¤à©\8bà¨\82 à¨¸à¨¼à©\81ਰà©\82 à¨\95ਰà¨\95à©\87 à¨¨à¨µà©\80à¨\86à¨\82 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨¦à¨¿ਖਾਓ',
-'rcshowhideminor' => '$1 à¨\9bà©\8bà¨\9fà©\80à¨\86à¨\82 à¨¤à¨¬à¨¦à©\80ਲੀਆਂ',
+'rclistfrom' => '$1 à¨¤à©\8bà¨\82 à¨¸à¨¼à©\81ਰà©\82 à¨\95ਰà¨\95à©\87 à¨¨à¨µà©\80à¨\86à¨\82 à¨¬à¨¦à¨²à©\80à¨\86à¨\82 à¨µà©\87ਖਾਓ',
+'rcshowhideminor' => '$1 à¨\9bà©\8bà¨\9fà©\80à¨\86à¨\82 à¨¬à¨¦ਲੀਆਂ',
 'rcshowhidebots' => '$1 ਬੋਟ',
 'rcshowhideliu' => '$1 ਲਾਗਇਨ ਹੋਏ ਮੈਂਬਰ',
-'rcshowhideanons' => '$1 à¨\97à©\81ਮਨਾਮ à¨®à©\88à¨\82ਬਰ',
+'rcshowhideanons' => '$1 à¨\97à©\81ਮਨਾਮ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ',
 'rcshowhidepatr' => 'ਜਾਂਚੇ ਹੋਏ ਸੰਪਾਦਨ $1',
-'rcshowhidemine' => 'ਮà©\87ਰà©\80à¨\86à¨\82 à¨¤à¨¬à¨¦à©\80ਲੀਆਂ $1',
-'rclinks' => 'ਪਿà¨\9bਲà©\87 $2 à¨¦à¨¿à¨¨à¨¾à¨\82 à¨µà¨¿à©±à¨\9a à¨¹à©\8bà¨\88à¨\86à¨\82 $1 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨¦à¨¿à¨\96ਾà¨\93 <br /> $3',
+'rcshowhidemine' => 'ਮà©\87ਰà©\80à¨\86à¨\82 à¨¬à¨¦ਲੀਆਂ $1',
+'rclinks' => 'ਪਿà¨\9bਲà©\87 $2 à¨¦à¨¿à¨¨à¨¾à¨\82 à¨µà¨¿à©±à¨\9a à¨¹à©\8bà¨\88à¨\86à¨\82 $1 à¨¬à¨¦à¨²à©\80à¨\86à¨\82 à¨µà©\87à¨\96ਾà¨\93<br /> $3',
 'diff' => 'ਫ਼ਰਕ',
 'hist' => 'ਇਤਿਹਾਸ',
 'hide' => 'ਲੁਕਾਓ',
 'show' => 'ਵਖਾਓ',
-'minoreditletter' => 'ਛ',
+'minoreditletter' => 'ਛ',
 'newpageletter' => 'ਨ',
 'boteditletter' => 'ਬ',
 'rc_categories_any' => 'ਕੋਈ ਵੀ',
@@ -1217,10 +1216,10 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 # Recent changes linked
 'recentchangeslinked' => 'ਸਬੰਧਤ ਤਬਦੀਲੀਆਂ',
 'recentchangeslinked-feed' => 'ਸਬੰਧਤ ਤਬਦੀਲੀਆਂ',
-'recentchangeslinked-toolbox' => 'ਸਬੰਧਿਤ à¨¤à¨¬à¨¦à©\80ਲੀਆਂ',
+'recentchangeslinked-toolbox' => 'ਸਬੰਧਿਤ à¨¬à¨¦ਲੀਆਂ',
 'recentchangeslinked-title' => '"$1" ਨਾਲ ਸਬੰਧਿਤ ਤਬਦੀਲੀਆਂ',
-'recentchangeslinked-noresult' => 'à¨\9cà©\81à©\9cà©\87 à¨ªà©°à¨¨à¨¿à¨\86à¨\82 â\80\99ਤà©\87, à¨¦à¨¿à©±à¨¤à©\87 à¨¸à¨®à©\87à¨\82 â\80\99à¨\9a à¨\95à©\8bà¨\88 à¨¤à¨¬à¨¦à©\80ਲੀ ਨਹੀਂ ਹੋਈ।',
-'recentchangeslinked-summary' => 'à¨\87ਹ à¨¸à©\82à¨\9aà©\80 à¨\87ੱà¨\95 à¨\96ਾਸ à¨ªà©°à¨¨à©\87 à¨¨à¨¾à¨² à¨¸à¨¬à©°à¨§à¨¿à¨¤ à¨ªà©°à¨¨à¨¿à¨\86à¨\82 à¨\9cਾà¨\82 à¨\95ਿਸà©\87 à¨\96ਾਸ à¨¸à¨¼à©\8dਰà©\87ਣà©\80 à¨¦à©\87 à¨®à©\88à¨\82ਬਰਾà¨\82 à¨¦à©\87 à¨¹à¨¾à¨² à¨µà¨¿à©±à¨\9a à¨¹à©\8bà¨\88à¨\86à¨\82 à¨¤à¨¬à¨¦à©\80ਲੀਆਂ ਨੂੰ ਦਰਸਾਂਉਦੀ ਹੈ। [[Special:Watchlist|ਤੁਹਾਡੀ ਧਿਆਨਸੂਚੀ]] ਵਿੱਚ ਮੌਜੂਦ ਪੰਨੇ ਮੋਟੇ ਅੱਖਰਾਂ ਵਿੱਚ ਦਿਖਾਈ ਦੇਣਗੇ।',
+'recentchangeslinked-noresult' => 'à¨\9cà©\81à©\9cà©\87 à¨ªà©°à¨¨à¨¿à¨\86à¨\82 â\80\99ਤà©\87, à¨¦à¨¿à©±à¨¤à©\87 à¨¸à¨®à©\87à¨\82 â\80\99à¨\9a à¨\95à©\8bà¨\88 à¨¬à¨¦ਲੀ ਨਹੀਂ ਹੋਈ।',
+'recentchangeslinked-summary' => 'à¨\87ਹ à¨¸à©\82à¨\9aà©\80 à¨\87ੱà¨\95 à¨\96ਾਸ à¨ªà©°à¨¨à©\87 à¨¨à¨¾à¨² à¨¸à¨¬à©°à¨§à¨¿à¨¤ à¨ªà©°à¨¨à¨¿à¨\86à¨\82 à¨\9cਾà¨\82 à¨\95ਿਸà©\87 à¨\96ਾਸ à¨¸à¨¼à©\8dਰà©\87ਣà©\80 à¨¦à©\87 à¨®à©\88à¨\82ਬਰਾà¨\82 à¨¦à©\87 à¨¹à¨¾à¨² à¨µà¨¿à©±à¨\9a à¨¹à©\8bà¨\88à¨\86à¨\82 à¨¬à¨¦ਲੀਆਂ ਨੂੰ ਦਰਸਾਂਉਦੀ ਹੈ। [[Special:Watchlist|ਤੁਹਾਡੀ ਧਿਆਨਸੂਚੀ]] ਵਿੱਚ ਮੌਜੂਦ ਪੰਨੇ ਮੋਟੇ ਅੱਖਰਾਂ ਵਿੱਚ ਦਿਖਾਈ ਦੇਣਗੇ।',
 'recentchangeslinked-page' => 'ਪੰਨੇ ਦਾ ਨਾਮ:',
 'recentchangeslinked-to' => 'ਇਸਦੇ ਬਦਲੇ ਇਸ ਪੰਨੇ ਨਾਲ ਜੁੜੇ ਪੰਨਿਆਂ ਵਿੱਚ ਹੋਏ ਬਦਲਾਅ ਦਿਖਾਓ',
 
@@ -1323,7 +1322,7 @@ to upload files.',
 'filehist-thumb' => 'ਨਮੂਨਾ',
 'filehist-thumbtext' => '$1 ਦੇ ਸਮੇਂ ਦੇ ਸੰਸਕਰਨ ਦਾ ਅੰਗੂਠਾਕਾਰ ਪ੍ਰਤੀਰੂਪ',
 'filehist-nothumb' => 'ਕੋਈ ਨਮੂਨਾ-ਤਸਵੀਰ ਨਹੀਂ',
-'filehist-user' => 'ਮà©\88à¨\82ਬਰ',
+'filehist-user' => 'ਵਰਤà©\8bà¨\82à¨\95ਾਰ',
 'filehist-dimensions' => 'ਨਾਪ',
 'filehist-filesize' => 'ਫਾਇਲ ਆਕਾਰ',
 'filehist-comment' => 'ਟਿੱਪਣੀ',
@@ -1335,7 +1334,7 @@ to upload files.',
 'sharedupload' => 'ਇਹ ਫ਼ਾਈਲ $1 ਤੋਂ ਹੈ ਅਤੇ ਸ਼ਾਇਦ ਦੂਜੇ ਪ੍ਰੋਜੈਕਟਾਂ ਤੇ ਵਰਤੀ ਜਾ ਸਕਦੀ ਹੈ।',
 'sharedupload-desc-there' => 'ਇਹ ਫ਼ਾਈਲ $1 ਤੋਂ ਹੈ ਅਤੇ ਸ਼ਾਇਦ ਦੂਜੇ ਪ੍ਰੋਜੈਕਟਾਂ ਦੁਆਰਾ ਵਰਤੀ ਜਾ ਸਕਦੀ ਹੈ।
 ਜ਼ਿਆਦਾ ਜਾਣਕਾਰੀ ਲਈ ਮਿਹਰਬਾਨੀ ਕਰਕੇ [$2 ਫ਼ਾਈਲ ਦਾ ਵੇਰਵਾ ਸਫ਼ਾ] ਵੇਖੋ।',
-'sharedupload-desc-here' => 'à¨\87ਹ à¨«à¨¼à¨¾à¨\88ਲ $1 à¨¦à©\80 à¨¹à©\88 à¨\85ਤà©\87 à¨¹à©\8bਰ à¨ªà©\8dਰਾà¨\9cà©\88à¨\95à¨\9fਾà¨\82 à¨µà¨¿à¨\9a à¨µà©\80 à¨µà¨°à¨¤à©\80 à¨\9cਾ à¨¸à¨\95ਦà©\80 à¨¹à©\88 à¥¤ à¨\87ਸ [$2 à¨«à¨¼à¨¾à¨\88ਲ à¨¦à©\87 à¨µà©\87ਰਵਾ à¨¸à¨«à¨¼à©\87] à¨µà¨¿ਚ ਮੌਜੂਦ ਵੇਰਵਾ ਹੇਠ ਦਿਸ ਰਿਹਾ ਹੈ।',
+'sharedupload-desc-here' => 'à¨\87ਹ à¨«à¨¼à¨¾à¨\88ਲ $1 à¨¦à©\80 à¨¹à©\88 à¨\85ਤà©\87 à¨¹à©\8bਰ à¨ªà¨°à¨¿à¨¯à©\8bà¨\9cਨਾਵਾà¨\82 à¨µà¨¿à©±à¨\9a à¨µà©\80 à¨µà¨°à¨¤à©\80 à¨\9cਾ à¨¸à¨\95ਦà©\80 à¨¹à©\88 à¥¤ à¨\87ਸ [$2 à¨«à¨¼à¨¾à¨\88ਲ à¨¦à©\87 à¨µà©\87ਰਵਾ à¨ªà©°à¨¨à©\87] à¨µà¨¿à©±ਚ ਮੌਜੂਦ ਵੇਰਵਾ ਹੇਠ ਦਿਸ ਰਿਹਾ ਹੈ।',
 'sharedupload-desc-edit' => 'ਇਹ ਫ਼ਾਈਲ $1 ਤੋਂ ਹੈ ਅਤੇ ਸ਼ਾਇਦ ਦੂਜੇ ਪ੍ਰੋਜੈਕਟਾਂ ਦੁਆਰਾ ਵਰਤੀ ਜਾ ਸਕਦੀ ਹੈ।
 ਸ਼ਾਇਦ ਤੁਸੀਂ [$2 ਫ਼ਾਈਲ ਦੇ ਵੇਰਵੇ ਸਫ਼ੇ] ਤੇ ਇਸਦਾ ਵੇਰਵਾ ਬਦਲਣਾ ਚਾਹੋ।',
 'sharedupload-desc-create' => 'ਇਹ ਫ਼ਾਈਲ $1 ਤੋਂ ਹੈ ਅਤੇ ਸ਼ਾਇਦ ਦੂਜੇ ਪ੍ਰੋਜੈਕਟਾਂ ਦੁਆਰਾ ਵਰਤੀ ਜਾ ਸਕਦੀ ਹੈ।
@@ -1457,14 +1456,14 @@ to upload files.',
 'pager-older-n' => '{{PLURAL:$1|1 ਪੁਰਾਣਾ|$1 ਪੁਰਾਣੇ}}',
 
 # Book sources
-'booksources' => 'à¨\95ਿਤਾਬ ਸਰੋਤ',
-'booksources-search-legend' => 'à¨\95ਿਤਾਬ ਸਰੋਤ ਖੋਜੋ',
+'booksources' => 'ਪà©\81ਸਤà¨\95ਾà¨\82 à¨¦à©\87 ਸਰੋਤ',
+'booksources-search-legend' => 'ਪà©\81ਸਤà¨\95ਾà¨\82 à¨¦à©\87 ਸਰੋਤ ਖੋਜੋ',
 'booksources-go' => 'ਜਾਓ',
 'booksources-invalid-isbn' => 'ਦਿੱਤਾ ਗਿਆ ISBN ਸਹੀ ਨਹੀਂ ਲਗਦਾ, ਅਸਲੀ ਸਰੋਤ ਤੋਂ ਨਕਲ ਕਰਦੇ ਵਕਤ ਹੋਈਆਂ ਗ਼ਲਤੀਆਂ ਜਾਂਚੋ।',
 
 # Special:Log
-'specialloguserlabel' => 'ਯà©\82à¨\9c਼ਰ:',
-'speciallogtitlelabel' => 'à¨\9fਾà¨\87à¨\9fਲ:',
+'specialloguserlabel' => 'à¨\95ਰਤਾ:',
+'speciallogtitlelabel' => 'ਸਿਰਲà©\87à¨\96:',
 'log' => 'ਚਿੱਠੇ',
 'all-logs-page' => 'ਸਾਰੇ ਆਮ ਚਿੱਠੇ',
 'logempty' => 'ਚਿੱਠੇ ’ਚ ਮੇਲ ਖਾਂਦੀ ਕੋਈ ਚੀਜ਼ ਨਹੀਂ ਹੈ।',
@@ -1503,7 +1502,7 @@ to upload files.',
 'sp-deletedcontributions-contribs' => 'ਯੋਗਦਾਨ',
 
 # Special:LinkSearch
-'linksearch' => 'ਬਾਹਰà©\80 à¨²à¨¿à©°à¨\95',
+'linksearch' => 'ਬਾਹਰà©\80 à¨\95à©\9cà©\80 à¨\96à©\8bà¨\9cà©\8b',
 'linksearch-ns' => 'ਥਾਂ-ਨਾਮ:',
 'linksearch-ok' => 'ਖੋਜੋ',
 'linksearch-line' => '$2 ਵਿੱਚ $1 ਬਾਹਰੀ ਸਿਰਨਾਵਾਂ ਹੈ',
@@ -1527,14 +1526,14 @@ to upload files.',
 'listgrouprights-group' => 'ਗਰੁੱਪ',
 'listgrouprights-rights' => 'ਹੱਕ',
 'listgrouprights-helppage' => 'Help:ਗਰੁੱਪ ਹੱਕ',
-'listgrouprights-members' => '(ਮà©\88à¨\82ਬਰਾਂ ਦੀ ਸੂਚੀ)',
+'listgrouprights-members' => '(ਵਰਤà©\8bà¨\82à¨\95ਾਰਾਂ ਦੀ ਸੂਚੀ)',
 'listgrouprights-addgroup-all' => 'ਸਾਰੇ ਗਰੁੱਪ ਜੋੜੋ',
 'listgrouprights-removegroup-all' => 'ਸਾਰੇ ਗਰੁੱਪ ਹਟਾਓ',
 
 # E-mail user
 'mailnologin' => 'ਕੋਈ ਭੇਜਣ ਐਡਰੈੱਸ ਨਹੀਂ',
 'mailnologintext' => 'ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਈ-ਮੇਲ ਭੇਜਣ ਲਈ ਤੁਹਾਨੂੰ [[Special:UserLogin|ਲਾਗਇਨ]] ਹੋਣਾ ਅਤੇ ਆਪਣੀਆਂ [[Special:Preferences|ਪਸੰਦਾਂ]] ਵਿਚ ਇਕ ਸਹੀ ਈ-ਮੇਲ ਪਤਾ ਦੇਣਾ ਪਵੇਗਾ।',
-'emailuser' => 'à¨\87ਸ à¨®à©\88à¨\82ਬਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
+'emailuser' => 'à¨\87ਸ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
 'emailpage' => 'ਯੂਜ਼ਰ ਨੂੰ ਈਮੇਲ ਕਰੋ',
 'defemailsubject' => '{{SITENAME}} ਈਮੇਲ',
 'usermaildisabled' => 'ਮੈਂਬਰ ਈ-ਮੇਲ ਬੰਦ ਹੈ',
@@ -1568,8 +1567,8 @@ to upload files.',
 'watchnologin' => 'ਲਾਗਇਨ ਨਹੀਂ',
 'watchnologintext' => 'ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਫੇਰ-ਬਦਲ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ [[Special:UserLogin|ਲਾਗਇਨ]] ਕਰਨਾ ਪਵੇਗਾ।',
 'addwatch' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ’ਚ ਜੋੜੋ',
-'addedwatchtext' => "ਸਫ਼ਾ \"[[:\$1]]\" à¨¤à©\81ਹਾਡà©\80 [[Special:Watchlist|ਨਿà¨\97ਰਾਨà©\80-ਲਿਸà¨\9f]] ’ਚ ਜੁੜ ਚੁੱਕਾ ਹੈ।
-à¨\87ਸ à¨\85ਤà©\87 à¨\87ਸਦà©\87 à¨\97ੱਲ-ਬਾਤ à¨¸à¨«à¨¼à©\87 â\80\99à¨\9a à¨¹à©\8bà¨\88à¨\86à¨\82 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨\93ਥà©\87 à¨µà¨\96ਾà¨\88 à¨¦à©\87ਣà¨\97à©\80à¨\86à¨\82 à¨\85ਤà©\87 à¨µà©\87à¨\96ਣ à¨¦à©\80 à¨¸à©\8cà¨\96 à¨²à¨\88 [[Special:RecentChanges|ਤਾà¨\9c਼ਾ à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨¦à©\80 à¨²à¨¿à¨¸à¨\9f]] à¨µà¨¿à¨\9a à¨\87ਹ à¨¸à¨«à¨¼ਾ '''ਗੂੜ੍ਹਾ''' ਦਿਖਾਈ ਦੇਵੇਗਾ।",
+'addedwatchtext' => "ਪੰਨਾ \"[[:\$1]]\" à¨¤à©\81ਹਾਡà©\80 [[Special:Watchlist|ਧਿà¨\86ਨਸà©\82à¨\9aà©\80]] ’ਚ ਜੁੜ ਚੁੱਕਾ ਹੈ।
+à¨\87ਸ à¨\85ਤà©\87 à¨\87ਸਦà©\87 à¨\9aਰà¨\9aਾ à¨ªà©°à¨¨à©\87 â\80\99à¨\9a à¨¹à©\8bà¨\88à¨\86à¨\82 à¨¬à¨¦à¨²à©\80à¨\86à¨\82 à¨\93ਥà©\87 à¨µà¨\96ਾà¨\88 à¨¦à©\87ਣà¨\97à©\80à¨\86à¨\82 à¨\85ਤà©\87 à¨µà©\87à¨\96ਣ à¨¦à©\80 à¨¸à©\8cà¨\96 à¨²à¨\88 [[Special:RecentChanges|ਹਾਲ à¨¹à©\80 â\80\99à¨\9a à¨¹à©\8bà¨\88à¨\86à¨\82 à¨¬à¨¦à¨²à©\80à¨\86à¨\82]] à¨µà¨¿à©±à¨\9a à¨\87ਹ à¨ªà©°à¨¨ਾ '''ਗੂੜ੍ਹਾ''' ਦਿਖਾਈ ਦੇਵੇਗਾ।",
 'removewatch' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ’ਚੋਂ ਹਟਾਓ',
 'removedwatchtext' => 'ਸਫ਼ਾ "[[:$1]]" [[Special:Watchlist|ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ]] ’ਚੋਂ ਹਟ ਚੁੱਕਾ ਹੈ।',
 'watch' => 'ਧਿਆਨ ਰੱਖੋ',
@@ -1609,7 +1608,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'actionfailed' => 'ਕਾਰਵਾਈ ਨਾਕਾਮ',
 'deletedtext' => '"$1" ਮਿਟਾਇਆ ਜਾ ਚੁੱਕਾ ਹੈ।
 ਤਾਜ਼ੀਆਂ ਮਿਟਾਉਣਾਂ ਦੇ ਰਿਕਾਰਡ ਲਈ $2 ਵੇਖੋ।',
-'dellogpage' => 'ਮਿਟਾਉਣ ਦਾ ਚਿੱਠਾ',
+'dellogpage' => 'ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ',
 'dellogpagetext' => 'ਹੇਠਾਂ ਸਭ ਤੋਂ ਤਾਜ਼ਾ ਮਿਟਾਉਣਾਂ ਦੀ ਲਿਸਟ ਹੈ।',
 'deletionlog' => 'ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ',
 'deletecomment' => 'ਕਾਰਨ:',
@@ -1648,8 +1647,8 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'protect-text' => "ਇੱਥੇ ਸ਼ਾਇਦ ਤੁਸੀਂ ਸਫ਼ਾ '''$1''' ਦਾ ਸੁਰੱਖਿਆ ਦਰਜਾ ਵੇਖ ਅਤੇ ਬਦਲ ਸਕਦੇ ਹੋ।",
 'protect-default' => 'ਸਭ ਯੂਜ਼ਰ ਮਨਜ਼ੂਰ',
 'protect-fallback' => '"$1" ਅਧਿਕਾਰ ਲੋੜੀਦਾ ਹੈ',
-'protect-level-autoconfirmed' => 'ਨਵà©\87à¨\82 à¨¤à©\87 à¨\97਼à©\88ਰ-ਰà¨\9cਿਸà¨\9fਰ à¨¯à©\82à¨\9c਼ਰਾਂ ਉੱਤੇ ਪਾਬੰਦੀ',
-'protect-level-sysop' => 'à¨\95à©\87ਵਲ à¨ªà¨°à¨¸à¨¼à¨¾à¨¸à¨¼ਕ',
+'protect-level-autoconfirmed' => 'ਨਵà©\87à¨\82 à¨¤à©\87 à¨\97à©\88ਰ-ਰà¨\9cਿਸà¨\9fਰ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰਾਂ ਉੱਤੇ ਪਾਬੰਦੀ',
+'protect-level-sysop' => 'à¨\95à©\87ਵਲ à¨ªà©\8dਰਬੰਧਕ',
 'protect-summary-cascade' => 'ਕਾਸਕੇਡਿੰਗ',
 'protect-cascade' => 'ਇਸ ਸਫ਼ੇ ਵਿਚ ਸ਼ਾਮਲ ਸਫ਼ੇ ਸੁਰੱਖਿਅਤ ਕਰੋ (ਕਾਸਕੇਡਿੰਗ ਸੁਰੱਖਿਆ)',
 'protect-cantedit' => 'ਤੁਸੀਂ ਇਸ ਸਫ਼ੇ ਦਾ ਸੁਰੱਖਿਆ ਦਰਜਾ ਨਹੀਂ ਬਦਲ ਸਕਦੇ ਕਿਉਂਕਿ ਤੁਹਾਨੂੰ ਇਸਨੂੰ ਸੋਧਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
@@ -1687,8 +1686,8 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'undeleteviewlink' => 'ਵੇਖੋ',
 'undeletereset' => 'ਰੀ-ਸੈੱਟ',
 'undeletecomment' => 'ਟਿੱਪਣੀ:',
-'undelete-header' => 'ਤਾà¨\9c਼à©\87 à¨®à¨¿à¨\9fਾà¨\8f à¨\97à¨\8f à¨¸à¨«à¨¼ਿਆਂ ਲਈ [[Special:Log/
-delete|ਮਿà¨\9fਾà¨\89ਣਾà¨\82 ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
+'undelete-header' => 'ਤਾà¨\9c਼à©\87 à¨¹à¨\9fਾà¨\8f à¨\97à¨\8f à¨ªà©°à¨¨ਿਆਂ ਲਈ [[Special:Log/
+delete|ਹà¨\9fਾà¨\89ਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'undelete-search-title' => 'ਮਿਟਾਏ ਹੋਏ ਸਫ਼ੇ ਖੋਜੋ',
 'undelete-search-box' => 'ਮਿਟਾਏ ਹੋਏ ਸਫ਼ੇ ਖੋਜੋ',
 'undelete-search-submit' => 'ਖੋਜੋ',
@@ -1708,7 +1707,7 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'month' => 'ਇਸ (ਅਤੇ ਪਿਛਲੇ) ਮਹੀਨੇ ਤੋਂ :',
 'year' => 'ਇਸ (ਅਤੇ ਪਿਛਲੇ) ਸਾਲ ਤੋਂ :',
 
-'sp-contributions-newbies' => 'ਸਿਰਫ਼ à¨¨à¨µà©\87à¨\82 à¨®à©\88à¨\82ਬਰਾਂ ਦੇ ਯੋਗਦਾਨ ਵਖਾਓ',
+'sp-contributions-newbies' => 'ਸਿਰਫ਼ à¨¨à¨µà©\87à¨\82 à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰਾਂ ਦੇ ਯੋਗਦਾਨ ਵਖਾਓ',
 'sp-contributions-newbies-sub' => 'ਨਵੇਂ ਅਕਾਊਂਟਾਂ ਲਈ',
 'sp-contributions-blocklog' => 'ਪਾਬੰਦੀ ਚਿੱਠਾ',
 'sp-contributions-uploads' => 'ਅਪਲੋਡ',
@@ -1719,8 +1718,8 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'sp-contributions-blocked-notice-anon' => 'ਇਹ IP ਪਤਾ ਇਸ ਵੇਲ਼ੇ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ।
 ਪਾਬੰਦੀ ਚਿੱਠੇ ਦਾ ਤਾਜ਼ਾ ਦਾਖ਼ਲਾ ਹਵਾਲੇ ਲਈ ਹੇਠਾਂ ਦਿੱਤਾ ਗਿਆ ਹੈ:',
 'sp-contributions-search' => 'ਯੋਗਦਾਨ ਖੋਜੋ',
-'sp-contributions-username' => 'IP à¨ªà¨¤à¨¾ à¨\9cਾà¨\82 à¨®à©\88à¨\82ਬਰ ਨਾਮ:',
-'sp-contributions-toponly' => 'à¨\95à©\87ਵਲ à¨\89ਨà©\8dਹਾà¨\82 à¨¸à©°à¨ªà¨¾à¨¦à¨¨à¨¾à¨\82 à¨¨à©\82à©° à¨¦à¨¿à¨\96ਾਵਾà¨\82 ਜੋ ਨਵੀਨਤਮ ਸੰਸ਼ੋਧਨ ਹਨ',
+'sp-contributions-username' => 'IP à¨ªà¨¤à¨¾ à¨\9cਾà¨\82 à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰਨਾਮ:',
+'sp-contributions-toponly' => 'à¨\95à©\87ਵਲ à¨\89ਨà©\8dਹਾà¨\82 à¨¸à©°à¨ªà¨¾à¨¦à¨¨à¨¾à¨\82 à¨¨à©\82à©° à¨µà¨\96ਾà¨\93 ਜੋ ਨਵੀਨਤਮ ਸੰਸ਼ੋਧਨ ਹਨ',
 'sp-contributions-submit' => 'ਖੋਜੋ',
 
 # What links here
@@ -1767,7 +1766,7 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'unblocked-range' => '$1 ਪਾਬੰਦੀ ਮੁਕਤ ਹੋ ਚੁੱਕੀ ਹੈ',
 'unblocked-id' => 'ਪਾਬੰਦੀ $1 ਹਟ ਚੁੱਕੀ ਹੈ',
 'blocklist' => 'ਪਾਬੰਦੀਸ਼ੁਦਾ ਮੈਂਬਰ',
-'ipblocklist' => 'ਪਾਬੰਦà©\80ਸ਼à©\81ਦਾ à¨®à©\88à¨\82ਬਰ',
+'ipblocklist' => 'ਪਾਬੰਦà©\80ਸ਼à©\81ਦਾ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ',
 'ipblocklist-legend' => 'ਪਾਬੰਦੀਸ਼ੁਦਾ ਮੈਂਬਰ ਲੱਭੋ',
 'blocklist-userblocks' => 'ਖਾਤਾ ਪਾਬੰਦੀਆਂ ਲੁਕਾਓ',
 'blocklist-tempblocks' => 'ਆਰਜ਼ੀ ਪਾਬੰਦੀਆਂ ਲੁਕਾਓ',
@@ -1848,7 +1847,7 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 # Namespace 8 related
 'allmessages' => 'ਸਿਸਟਮ ਸੁਨੇਹੇ',
 'allmessagesname' => 'ਨਾਮ',
-'allmessagesdefault' => 'ਡਿਫਾਲà¨\9f à¨\9fà©\88à¨\95ਸà¨\9f',
+'allmessagesdefault' => 'ਡਿਫਾਲà¨\9f à¨ªà¨¾à¨ ',
 'allmessagescurrent' => 'ਮੌਜੂਦਾ ਟੈਕਸਟ',
 'allmessages-filter-legend' => 'ਛਾਨਣਾ',
 'allmessages-filter-all' => 'ਸਭ',
@@ -1873,10 +1872,10 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 
 # Import log
 'importlogpage' => 'ਇੰਪੋਰਟ ਲਾਗ',
-'import-logentry-upload-detail' => '$1 à¨°à©\80ਵਿà¨\9c਼ਨ',
+'import-logentry-upload-detail' => '$1 ਰੀਵਿਜਨ',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'ਤà©\81ਹਾਡਾ à¨®à©\88à¨\82ਬਰ ਪੰਨਾ',
+'tooltip-pt-userpage' => 'ਤà©\81ਹਾਡਾ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ ਪੰਨਾ',
 'tooltip-pt-mytalk' => 'ਤੁਹਾਡਾ ਚਰਚਾ ਪੰਨਾ',
 'tooltip-pt-preferences' => 'ਤੁਹਾਡੀਆਂ ਪਸੰਦਾਂ',
 'tooltip-pt-watchlist' => 'ਓਹਨਾਂ ਪੰਨਿਆਂ ਦੀ ਸੂਚੀ ਜੋ ਤੁਸੀਂ ਤਬਦੀਲੀਆਂ ਲਈ ਵੇਖ ਰਹੇ ਹੋ',
@@ -1904,29 +1903,29 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'tooltip-n-mainpage-description' => 'ਮੁੱਖ ਪੰਨੇ ’ਤੇ ਜਾਓ',
 'tooltip-n-portal' => 'ਪਰਿਯੋਜਨਾ ਬਾਰੇ, ਤੁਸੀਂ ਕੀ ਕਰ ਸਕਦੇ ਹੋ, ਕਿੱਥੇ ਕੁਝ ਲੱਭਣਾ ਹੈ',
 'tooltip-n-currentevents' => 'ਮੌਜੂਦਾ ਸਮਾਗਮ ਬਾਰੇ ਪਿਛਲੀ ਜਾਣਕਾਰੀ ਲੱਭੋ',
-'tooltip-n-recentchanges' => 'ਵਿਕੀ ’ਚ ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਦੀ ਸੂਚੀ',
+'tooltip-n-recentchanges' => 'ਵਿਕੀ ਵਿੱਚ ਹਾਲ ’ਚ ਹੋਈਆਂ ਬਦਲੀਆਂ ਦੀ ਸੂਚੀ',
 'tooltip-n-randompage' => 'ਇੱਕ ਰਲਵਾਂ ਪੰਨਾ ਲੋਡ ਕਰੋ',
 'tooltip-n-help' => 'ਖੋਜਣ ਲਈ ਥਾਂ',
 'tooltip-t-whatlinkshere' => 'ਵਿਕੀ ਦੇ ਸਾਰੇ ਪੰਨਿਆਂ ਦੀ ਸੂਚੀ, ਜੋ ਇੱਥੇ ਜੋੜਦੇ ਹਨ',
 'tooltip-t-recentchangeslinked' => 'ਇਸ ਪੰਨੇ ਤੋਂ ਲਿੰਕ ਕੀਤੇ ਪੰਨਿਆਂ ਵਿੱਚ ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ',
 'tooltip-feed-atom' => 'ਇਸ ਪੰਨੇ ਦੀ ਐਟਮ ਫ਼ੀਡ',
-'tooltip-t-contributions' => 'à¨\87ਸ à¨®à©\88à¨\82ਬਰ ਦੇ ਯੋਗਦਾਨ ਦੀ ਸੂਚੀ',
-'tooltip-t-emailuser' => 'à¨\87ਸ à¨®à©\88à¨\82ਬਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
+'tooltip-t-contributions' => 'à¨\87ਸ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ ਦੇ ਯੋਗਦਾਨ ਦੀ ਸੂਚੀ',
+'tooltip-t-emailuser' => 'à¨\87ਸ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
 'tooltip-t-upload' => 'ਚਿੱਤਰ ਜਾਂ ਮੀਡੀਆ ਫਾਈਲਾਂ ਅੱਪਲੋਡ ਕਰੋ',
-'tooltip-t-specialpages' => 'ਸਾਰà©\87 à¨\96ਾਸ ਪੰਨਿਆਂ ਦੀ ਸੂਚੀ',
+'tooltip-t-specialpages' => 'ਸਾਰà©\87 à¨µà¨¿à¨¸à¨¼à©\87ਸ਼ ਪੰਨਿਆਂ ਦੀ ਸੂਚੀ',
 'tooltip-t-print' => 'ਇਹ ਪੰਨੇ ਦਾ ਛਪਣਯੋਗ ਵਰਜਨ',
 'tooltip-t-permalink' => 'ਪੰਨੇ ਦੇ ਇਸ ਰੀਵਿਜਨ ਲਈ ਪੱਕਾ ਲਿੰਕ',
 'tooltip-ca-nstab-main' => 'ਸਮੱਗਰੀ ਪੰਨਾ ਵੇਖੋ',
 'tooltip-ca-nstab-user' => 'ਮੈਂਬਰ ਪੰਨਾ ਵੇਖੋ',
 'tooltip-ca-nstab-media' => 'ਮੀਡਿਆ ਪੇਜ ਵੇਖੋ',
-'tooltip-ca-nstab-special' => 'à¨\87ਹ à¨\96ਾਸ ਪੰਨਾ ਹੈ, ਤੁਸੀਂ ਇਸ ਪੰਨੇ ਨੂੰ ਬਦਲ ਨਹੀਂ ਸਕਦੇ।',
+'tooltip-ca-nstab-special' => 'à¨\87ਹ à¨µà¨¿à¨¸à¨¼à©\87ਸ਼ ਪੰਨਾ ਹੈ, ਤੁਸੀਂ ਇਸ ਪੰਨੇ ਨੂੰ ਬਦਲ ਨਹੀਂ ਸਕਦੇ।',
 'tooltip-ca-nstab-project' => 'ਪਰਿਯੋਜਨਾ ਪੰਨਾ ਵੇਖੋ',
 'tooltip-ca-nstab-image' => 'ਫ਼ਾਈਲ ਪੰਨਾ ਵੇਖੋ',
 'tooltip-ca-nstab-mediawiki' => 'ਸਿਸਟਮ ਸੁਨੇਹੇ ਵੇਖੋ',
 'tooltip-ca-nstab-template' => 'ਸਾਂਚਾ ਵੇਖੋ',
 'tooltip-ca-nstab-help' => 'ਮੱਦਦ ਪੇਜ ਵੇਖੋ',
 'tooltip-ca-nstab-category' => 'ਸ਼੍ਰੇਣੀ ਪੰਨਾ ਵੇਖੋ',
-'tooltip-minoredit' => 'à¨\87ਸ â\80\99ਤà©\87 à¨¬à¨¤à©\8cਰ à¨\9bà©\8bà¨\9fà©\80 à¨¤à¨¬à¨¦à©\80ਲੀ ਨਿਸ਼ਾਨ ਲਾਓ',
+'tooltip-minoredit' => 'à¨\87ਸ â\80\99ਤà©\87 à¨¬à¨¤à©\8cਰ à¨\9bà©\8bà¨\9fà©\80 à¨¬à¨¦ਲੀ ਨਿਸ਼ਾਨ ਲਾਓ',
 'tooltip-save' => 'ਆਪਣੀਆਂ ਤਬਦੀਲੀਆਂ ਸਾਂਭੋ',
 'tooltip-preview' => 'ਆਪਣੀ ਤਬਦੀਲੀ ਦੀ ਝਲਕ ਵੇਖੋ, ਸਾਂਭਣ ਤੋਂ ਪਹਿਲਾਂ ਇਹ ਵਰਤੋਂ!',
 'tooltip-diff' => 'ਤੁਹਾਡੇ ਦੁਆਰਾ ਲਿਖਤ ਵਿੱਚ ਕੀਤੀਆਂ ਤਬਦੀਲੀਆਂ ਵਖਾਉਂਦਾ ਹੈ',
@@ -1944,7 +1943,7 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 # Attribution
 'lastmodifiedatby' => 'ਇਹ ਸਫ਼ਾ ਆਖ਼ਰੀ ਵਾਰ $1 ਨੂੰ $2 ’ਤੇ $3 ਨੇ ਸੋਧਿਆ ਸੀ।',
 'others' => 'ਹੋਰ',
-'siteusers' => '{{SITENAME}} ਯੂਜ਼ਰ $1',
+'siteusers' => '{{SITENAME}} {{PLURAL:$2|ਵਰਤੋਂਕਾਰ|ਵਰਤੋਂਕਾਰਾਂ}} $1',
 'creditspage' => 'ਪੇਜ ਮਾਣ',
 
 # Spam protection
@@ -1963,12 +1962,12 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'skinname-simple' => 'ਸੈਂਪਲ',
 
 # Browsing diffs
-'previousdiff' => 'â\86\90 à¨\87ਸ à¨¤à©\8bà¨\82 à¨ªà©\81ਰਾਣà©\80 à¨¤à¨¬à¨¦à©\80ਲੀ',
+'previousdiff' => 'â\86\90 à¨\87ਸ à¨¤à©\8bà¨\82 à¨ªà©\81ਰਾਣà©\80 à¨¬à¨¦ਲੀ',
 'nextdiff' => 'ਤਾਜ਼ਾ ਸੰਪਾਦਨ →',
 
 # Media information
 'thumbsize' => 'ਥੰਮਨੇਲ ਆਕਾਰ:',
-'widthheightpage' => '$1 × $2, $3 ਪੇਜ਼',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|ਪੰਨਾ|ਪੰਨੇ}}',
 'file-info' => 'ਫਾਇਲ ਆਕਾਰ: $1, MIME ਕਿਸਮ: $2',
 'file-info-size' => '$1 × $2 ਪਿਕਸਲ, ਫ਼ਾਈਲ ਆਕਾਰ: $3, MIME ਕਿਸਮ: $4',
 'file-nohires' => 'ਇਸ ਤੋਂ ਵੱਡੀ ਚਿੱਤਰ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।',
@@ -2031,6 +2030,11 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'exif-gpsspeed-k' => 'ਕਿਲੋਮੀਟਰ ਪ੍ਰਤੀ ਘੰਟਾ',
 'exif-gpsspeed-m' => 'ਮੀਲ ਪ੍ਰਤੀ ਘੰਟਾ',
 
+'exif-iimcategory-war' => 'ਯੁੱਧ, ਸੰਘਰਸ਼ ਅਤੇ ਅਸ਼ਾਂਟੀ',
+'exif-iimcategory-wea' => 'ਮੌਸਮ',
+
+'exif-urgency-normal' => 'ਸਧਾਰਨ ($1)',
+
 # External editor support
 'edit-externally' => 'ਬਾਹਰੀ ਐਪਲੀਕੇਸ਼ਨ ਵਰਤਦੇ ਹੋਏ ਇਸ ਫ਼ਾਈਲ ਨੂੰ ਸੰਪਾਦਨ ਕਰੋ।',
 'edit-externally-help' => '(ਜ਼ਿਆਦਾ ਜਾਣਕਾਰੀ ਲਈ [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] ਵੇਖੋ)',
@@ -2039,6 +2043,7 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'watchlistall2' => 'ਸਭ',
 'namespacesall' => 'ਸਭ',
 'monthsall' => 'ਸਭ',
+'limitall' => 'ਸਭ',
 
 # E-mail address confirmation
 'confirmemail' => 'ਈਮੇਲ ਐਡਰੈੱਸ ਪੁਸ਼ਟੀ',
@@ -2082,12 +2087,14 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'livepreview-ready' => 'ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...ਤਿਆਰ!',
 
 # Watchlist editor
+'watchlistedit-normal-title' => 'ਧਿਆਨਸੂਚੀ ਬਦਲੋ',
 'watchlistedit-raw-titles' => 'ਟਾਇਟਲ:',
+'watchlistedit-raw-submit' => 'ਧਿਆਨਸੂਚੀ ਨੂੰ ਅਪਡੇਟ ਕਰੋ',
 'watchlistedit-raw-added' => '{{PLURAL:$1|1 title was|$1 titles were}} ਸ਼ਾਮਲ:',
 'watchlistedit-raw-removed' => '{{PLURAL:$1|1 title was|$1 titles were}} ਹਟਾਓ:',
 
 # Watchlist editing tools
-'watchlisttools-view' => 'ਮà©\8cà¨\95à©\87 à¨®à©\81ਤਾਬà¨\95 à¨¤à¨¬à¨¦à©\80ਲੀਆਂ ਵੇਖੋ',
+'watchlisttools-view' => 'ਮà©\8cà¨\95à©\87 à¨®à©\81ਤਾਬà¨\95 à¨¬à¨¦ਲੀਆਂ ਵੇਖੋ',
 'watchlisttools-edit' => 'ਧਿਆਨਸੂਚੀ ਵੇਖੋ ’ਤੇ ਸੰਪਾਦਨ ਕਰੋ',
 'watchlisttools-raw' => 'ਕੱਚੀ ਧਿਆਨਸੂਚੀ ਸੰਪਾਦਨ ਕਰੋ',
 
@@ -2096,10 +2103,16 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 
 # Special:Version
 'version' => 'ਵਰਜਨ',
+'version-other' => 'ਹੋਰ',
+
+# Special:FilePath
+'filepath-page' => 'ਫਾਈਲ:',
+'filepath-submit' => 'ਜਾਓ',
 
 # Special:SpecialPages
-'specialpages' => 'à¨\96ਾਸ ਪੰਨੇ',
+'specialpages' => 'ਵਿਸ਼à©\87ਸ਼ ਪੰਨੇ',
 'specialpages-group-login' => 'ਲਾਗਇਨ / ਖਾਤਾ ਬਣਾਓ',
+'specialpages-group-users' => 'ਵਰਤੋਂਕਾਰਾਂ ਅਤੇ ਅਧਿਕਾਰ',
 
 # Special:BlankPage
 'blankpage' => 'ਖ਼ਾਲੀ ਸਫ਼ਾ',
@@ -2116,6 +2129,8 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 
 # Special:Tags
 'tag-filter' => '[[Special:Tags|ਟੈਗ]] ਛਾਨਣੀ:',
+'tags-tag' => 'ਟੈਗ ਦਾ ਨਾਮ',
+'tags-edit' => 'ਸੰਪਾਦਨ',
 
 # HTML forms
 'htmlform-submit' => 'ਭੇਜੋ',
@@ -2123,8 +2138,17 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'htmlform-selectorother-other' => 'ਹੋਰ',
 
 # New logging system
+'logentry-move-move' => "$1 ਨੇ $3 ਪੰਨੇ $4 'ਤੇ ਸਥਾਨਾਂਤਰਿਤ ਕੀਤਾ",
+'logentry-newusers-newusers' => 'ਮੈਂਬਰ ਖਾਤਾ $1 ਬਣਾਇਆ ਗਿਆ',
+'logentry-newusers-create' => 'ਵਰਤੋਂਕਾਰ ਖਾਤਾ $1 ਬਣਾਇਆ ਗਿਆ',
+'logentry-newusers-create2' => 'ਵਰਤੋਂਕਾਰ ਖਾਤਾ $3 $1 ਦੁਆਰਾ ਬਣਾਇਆ ਗਿਆ ਸੀ',
 'rightsnone' => '(ਕੋਈ ਨਹੀਂ)',
 
+# Feedback
+'feedback-subject' => 'ਵਿਸ਼ਾ:',
+'feedback-message' => 'ਸੁਨੇਹਾ:',
+'feedback-cancel' => 'ਰੱਦ ਕਰੋ',
+
 # Search suggestions
 'searchsuggest-search' => 'ਖੋਜ',
 
index a8d240b..ab3f5ce 100644 (file)
@@ -487,8 +487,8 @@ Paesswatt fer nau: $2',
 'right-writeapi' => 'Yuus vun write API',
 'right-delete' => 'Bledder lesche',
 
-# User rights log
-'rightsnone' => '(ken)',
+# Special:Log/newusers
+'newuserlogpage' => 'Logbuch vun neie Yuuser',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'es Blatt zu lese',
@@ -668,9 +668,6 @@ Paesswatt fer nau: $2',
 'activeusers-hidebots' => 'Waddefresser verschwinne losse',
 'activeusers-hidesysops' => 'Verwalter verschwinne losse',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Logbuch vun neie Yuuser',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Rechte vun Yuuser-Druppe',
 'listgrouprights-group' => 'Druppe',
@@ -707,6 +704,7 @@ Paesswatt fer nau: $2',
 'unwatching' => 'Nimmi watsche...',
 
 'enotif_impersonal_salutation' => '{{SITENAME}}-Yuuser',
+'changed' => 'gennert',
 
 # Delete
 'deletepage' => 'Blatt lesche',
@@ -1012,6 +1010,9 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
 'htmlform-reset' => 'Enneringe losmache',
 'htmlform-selectorother-other' => 'Annere',
 
+# New logging system
+'rightsnone' => '(ken)',
+
 # Feedback
 'feedback-message' => 'Melding:',
 
index 8c68c08..5121c2e 100644 (file)
@@ -19,6 +19,7 @@ $fallback = 'de';
 $messages = array(
 # User preference toggles
 'tog-showtoolbar' => "Werkzaich zum Bearwaide zaische (dodezu brauchd's JavaScript)",
+'tog-showhiddencats' => 'Zaisch vaschdeglde Kadegorije',
 
 'underline-always' => 'Immer',
 'underline-never' => 'Garnet',
@@ -369,6 +370,7 @@ Erklärung: '''({{int:cur}})''' = Unnerschied zu jetzert,
 'resetprefs' => 'Oischdellunge verwerfe',
 'guesstimezone' => 'Aus em Browser iwwernemme',
 'yourrealname' => 'Birscherlischer Nome:',
+'yourlanguage' => 'Schbrooch:',
 'gender-unknown' => 'Ghoim gkalde',
 
 # Groups
@@ -378,9 +380,9 @@ Erklärung: '''({{int:cur}})''' = Unnerschied zu jetzert,
 'group-bureaucrat' => 'Birokrade',
 'group-all' => '(alle)',
 
-'group-bot-member' => 'Bot',
-'group-sysop-member' => 'Adminischdrador',
-'group-bureaucrat-member' => 'Birokrad',
+'group-bot-member' => '{{GENDER:$1|Bot}}',
+'group-sysop-member' => '{{GENDER:$1|Adminischdrador}}',
+'group-bureaucrat-member' => '{{GENDER:$1|Birokrad}}',
 
 'grouppage-sysop' => '{{ns:project}}:Adminischtratore',
 
@@ -408,7 +410,7 @@ Erklärung: '''({{int:cur}})''' = Unnerschied zu jetzert,
 'rcshowhidemine' => 'Mai Bearwaidunge $1',
 'rclinks' => 'Zeich die letschte $1 Ännerunge in de letschte $2 Dache<br />$3',
 'diff' => 'Unnerschied',
-'hist' => 'Gschicht',
+'hist' => 'Gschichd',
 'hide' => 'vaschdeggle',
 'show' => 'zaische',
 'minoreditletter' => 'k',
@@ -432,8 +434,9 @@ Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
 'uploadbtn' => 'Datei hochlade',
 'uploadlogpage' => 'Dateie-Logbuch',
 'filedesc' => 'Zommefassung',
+'fileuploadsummary' => 'Zommefassung:',
 'savefile' => 'Datei schbeichere',
-'uploadedimage' => 'hot „[[$1]]“ hochglade',
+'uploadedimage' => 'hod „[[$1]]“ nuffglade',
 
 # Lock manager
 'lockmanager-notlocked' => '„$1“ hod ned uffgmachd were kenne, die isch ganed gschberd gwesd.',
@@ -517,6 +520,7 @@ Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
 # Watchlist
 'watchlist' => 'Beowachdungslischd',
 'mywatchlist' => 'Beowachdungslischd',
+'watchlistfor2' => 'Vun $1 $2',
 'addedwatchtext' => "Die Said \"[[:\$1]]\" isch zu Dainer [[Special:Watchlist|Beowachdungslischt]] zugefiecht worre.
 Zukimftiche Ännerunge an derre Said un de Dischbediersaid, wu dezu ghert, werre doo aagezaicht, un d Said werd '''fett''' aagezaicht in de [[Special:RecentChanges|Letschte Ännerunge]] fer dass es ääfacher isch zum finne.",
 'removedwatchtext' => 'D Said "[[:$1]]" isch aus [[Special:Watchlist|Dainer Beowachdungslischt]] rausgenumme worre.',
@@ -809,6 +813,9 @@ Annere Medadaade sinn noamalawais verschdegld.
 
 # Special:SpecialPages
 'specialpages' => 'Spezialsaide',
+'specialpages-group-other' => 'Onare bsundare Saide',
+'specialpages-group-pagetools' => 'Wergzaisch fa Saide',
+'specialpages-group-wiki' => 'Daade un Wergzaisch',
 
 # Special:Tags
 'tags-edit' => 'bearwaide',
index 6b1a177..562583a 100644 (file)
@@ -329,7 +329,7 @@ $messages = array(
 'tog-externaleditor' => 'Domyślnie używaj zewnętrznego edytora (tylko dla zaawansowanych użytkowników; wymaga odpowiedniego skonfigurowania komputera)',
 'tog-externaldiff' => 'Domyślnie używaj zewnętrznego programu pokazującego zmiany (tylko dla zaawansowanych użytkowników; wymaga odpowiedniego skonfigurowania komputera)',
 'tog-showjumplinks' => 'Włącz odnośniki „skocz do”',
-'tog-uselivepreview' => 'Używaj dynamicznego podglądu (JavaScript)',
+'tog-uselivepreview' => 'Używaj dynamicznego podglądu (JavaScript; eksperymentalny)',
 'tog-forceeditsummary' => 'Informuj o niewypełnieniu opisu zmian',
 'tog-watchlisthideown' => 'Ukryj moje edycje na liście obserwowanych',
 'tog-watchlisthidebots' => 'Ukryj edycje botów na liście obserwowanych',
@@ -3076,7 +3076,7 @@ Pozwala na wpisanie powodu w opisie zmian.',
 'print.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd wydruku */',
 'handheld.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd na urządzeniach kieszonkowych skórki ustawionej w zmiennej $wgHandheldStyle */',
 'noscript.css' => '/* Umieszczony tu arkusz stylów CSS będzie wykorzystywany dla użytkowników z wyłączoną obsługą JavaScript */',
-'group-autoconfirmed.css' => '/* CSS tutaj umieszczony będzie dotyczyć tylko samoczynnie potwierdzonych użytkowników */',
+'group-autoconfirmed.css' => '/* CSS tutaj umieszczony będzie dotyczyć tylko automatycznie zatwierdzonych użytkowników */',
 'group-bot.css' => '/* CSS tutaj umieszczony będzie obowiązywał tylko dla botów */',
 
 # Scripts
index 7973bf5..b5bf0aa 100644 (file)
@@ -74,7 +74,7 @@ $messages = array(
 'tog-externaleditor' => "Dovré coma stàndard n'editor estern (mach për espert, a-i é dabzògn d'ampostassion speciaj dzora a sò ordinator. [//www.mediawiki.org/wiki/Manual:External_editors Për savèjne ëd pi.])",
 'tog-externaldiff' => "Dovré për stàndard un programa comparator estern (mach për espert, a-i é dabzògn d'ampostassion speciaj ansima a sò ordinator [//www.mediawiki.org/wiki/Manual:External_editors Për savèjne ëd pi.])",
 'tog-showjumplinks' => 'Dovré j\'anliure d\'acessibilità dla sòrt "Va a"',
-'tog-uselivepreview' => "Dovré la fonsion ''Preuva dal viv'' (a-i va JavaScript e a l'é mach sperimental)",
+'tog-uselivepreview' => "Dovré la fonsion ''Preuva dal viv'' (a-i va JavaScript) (sperimental)",
 'tog-forceeditsummary' => "Ciama conferma se ël somari dla modìfica a l'é veujd",
 'tog-watchlisthideown' => 'Stërma mie modìfiche ant la ròba che im ten-o sot euj',
 'tog-watchlisthidebots' => 'Stërma le modìfiche fàite daj trigomiro ant la lista dle ròbe che im ten-o sot euj',
@@ -2215,9 +2215,9 @@ Ambelessì a-i son le regolassion corente për la pàgina '''$1''':",
 Ambelessì a-i son j'ampostassion atuaj për la pàgina '''$1''':",
 'protect-cascadeon' => "Sta pàgina për adess a l'é blocà përchè a-i intra ant {{PLURAL:$1|la pàgina sì-sota, ch'a l'ha|le-pàgine sì sota, ch'a l'han}} na protession a sàut anvisca. A peul cambie-je sò livel ëd protession a sta pàgina-sì ma lòn a tochërà pa la protession a sàut.",
 'protect-default' => "Autorisé tùit j'utent",
-'protect-fallback' => 'A-i va ël përmess «$1»',
-'protect-level-autoconfirmed' => "Bloca j'utent neuv e coj nen registrà",
-'protect-level-sysop' => "mach për j'aministrator",
+'protect-fallback' => "Përmëtt mach a j'utent con ël përmess «$1»",
+'protect-level-autoconfirmed' => "Përmëtt mach j'utent autoconfirmà",
+'protect-level-sysop' => "Përmëtt mach a j'aministrator",
 'protect-summary-cascade' => 'a sàut',
 'protect-expiring' => 'scadensa: $1 (UTC)',
 'protect-expiring-local' => 'a finiss ai $1',
index 455e78f..88b7195 100644 (file)
@@ -704,9 +704,11 @@ $messages = array(
 'right-import' => "Έμπαζμαν σελιδίων ασ' άλλα βίκι",
 'right-siteadmin' => 'Ασπάλισον κι άνοιξον τη βάση δογμενίων',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Αρχείον ποισιματίων λογαρίων χρήστε',
+
 # User rights log
 'rightslog' => 'Αρχείον δικαιωματίων',
-'rightsnone' => '(τιδέν)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'δεάβασον αβούτεν την σελίδαν',
@@ -941,9 +943,6 @@ $messages = array(
 # Special:ListUsers
 'listusers-submit' => 'Δείξον',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Αρχείον ποισιματίων λογαρίων χρήστε',
-
 # Special:ListGroupRights
 'listgrouprights-group' => 'Ομάδαν',
 'listgrouprights-rights' => 'Δικαιώματα',
@@ -978,6 +977,8 @@ $messages = array(
 
 'enotif_impersonal_salutation' => '{{SITENAME}} χρήστες',
 'enotif_anon_editor' => 'ανώνυμον χρήστες $1',
+'created' => 'έντον',
+'changed' => 'ελλάγεν',
 
 # Delete
 'deletepage' => 'Σβήσον τη σελίδαν',
@@ -1437,6 +1438,9 @@ $messages = array(
 'htmlform-reset' => "Κλώσον τ'αλλαγάς",
 'htmlform-selectorother-other' => 'Άλλον',
 
+# New logging system
+'rightsnone' => '(τιδέν)',
+
 # Search suggestions
 'searchsuggest-search' => 'Αράεμαν',
 
index 98d541b..63e8d72 100644 (file)
@@ -2502,7 +2502,7 @@ Pode alterar o nível de protecção desta página, mas isso não afectará a pr
 'protect-summary-cascade' => 'em cascata',
 'protect-expiring' => 'expira a $1 (UTC)',
 'protect-expiring-local' => 'expira a $1',
-'protect-expiry-indefinite' => 'tempo indefinido',
+'protect-expiry-indefinite' => 'indefinidamente',
 'protect-cascade' => 'Proteja quaisquer páginas que estejam incluídas nesta (protecção em cascata)',
 'protect-cantedit' => 'Não pode alterar o nível de protecção desta página, porque não tem permissão para editá-la.',
 'protect-othertime' => 'Outra duração:',
index 13a2380..fafccb0 100644 (file)
@@ -744,7 +744,7 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências no
 'userlogin' => 'Entrar / criar conta',
 'userloginnocreate' => 'Entrar',
 'logout' => 'Sair',
-'userlogout' => 'Desconectar',
+'userlogout' => 'Sair',
 'notloggedin' => 'Não autenticado',
 'nologin' => 'Não possui uma conta? $1.',
 'nologinlink' => 'Criar uma conta',
@@ -2509,7 +2509,7 @@ Esta é a configuração atual para a página '''$1''':",
 'protect-summary-cascade' => 'p. progressiva',
 'protect-expiring' => 'expira em $1 (UTC)',
 'protect-expiring-local' => 'expira $1',
-'protect-expiry-indefinite' => 'tempo indefinido',
+'protect-expiry-indefinite' => 'indefinidamente',
 'protect-cascade' => '"Proteção progressiva" - proteja quaisquer páginas que estejam incluídas nesta.',
 'protect-cantedit' => 'Você não pode alterar o nível de proteção desta página uma vez que você não se encontra habilitado a editá-la.',
 'protect-othertime' => 'Outra duração:',
@@ -3141,9 +3141,9 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext
 'pageinfo-recent-authors' => 'Número recente de autores distintos',
 'pageinfo-magic-words' => '{{PLURAL:$1|Palavra mágica|Palavras mágicas}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria oculta|Categorias ocultas}} ($1)',
-'pageinfo-templates' => '{{PLURAL:$1|predefinição transcluída|predefinições transcluídas}}',
+'pageinfo-templates' => '{{PLURAL:$1|Predefinição transcluída|Predefinições transcluídas ($1)}}',
 'pageinfo-toolboxlink' => 'Informações da página',
-'pageinfo-redirectsto' => 'Redirecionar para',
+'pageinfo-redirectsto' => 'Redireciona para',
 'pageinfo-redirectsto-info' => 'informações',
 'pageinfo-contentpage' => 'Contado como uma página de conteúdo',
 'pageinfo-contentpage-yes' => 'Sim',
index 36ef6a2..425043e 100644 (file)
@@ -350,8 +350,15 @@ Possible alternatives to the word 'content' are 'subject matter' or 'wiki subjec
 'cancel' => '{{doc-actionlink}}
 Message shown below the edit form, and if you click on it, you stop with editing the page and go back to the normal page view.
 {{Identical|Cancel}}',
-'moredotdotdot' => '{{Identical|More...}}',
-'morenotlisted' => 'An indication that more of a certain list is not shown.',
+'moredotdotdot' => 'Used as "More..." link for {{msg-mw|pageinfo-transclusions}} field, in the "templates used on this page" list.
+
+Similar to {{msg-mw|morenotlisted}}.
+{{Identical|More...}}',
+'morenotlisted' => 'An indication that more of a templates list is not shown.
+
+Used as "More..." link for {{msg-mw|pageinfo-templates}} field.
+
+Similar to {{msg-mw|moredotdotdot}}.',
 'mypage' => "A text for the link to the user's user page in the links at the top of the page.
 {{Identical|Page}}",
 'mytalk' => 'In the personal URLs page section - right upper corner.
@@ -2577,13 +2584,13 @@ Basic right to read any page.',
 'right-edit' => '{{doc-right|edit}}
 Basic right to edit pages that are not protected.',
 'right-createpage' => '{{doc-right|createpage}}
-Basic right to create pages. The right to edit discussion/talk pages is {{msg-mw|right-createtalk|pl=yes}}.',
+Basic right to create pages. The right to edit discussion/talk pages is {{msg-mw|right-createtalk}}.',
 'right-createtalk' => '{{doc-right|createtalk}}
-Basic right to create discussion/talk pages. The right to edit other pages is {{msg-mw|right-createpage|pl=yes}}.',
+Basic right to create discussion/talk pages. The right to edit other pages is {{msg-mw|right-createpage}}.',
 'right-createaccount' => '{{doc-right|createaccount}}
 The right to [[Special:CreateAccount|create a user account]].',
 'right-minoredit' => '{{doc-right|minoredit}}
-The right to use the "This is a minor edit" checkbox. See {{msg-mw|minoredit|pl=yes}} for the message used for that checkbox.',
+The right to use the "This is a minor edit" checkbox. See {{msg-mw|minoredit}} for the message used for that checkbox.',
 'right-move' => '{{doc-right|move}}
 The right to move any page that is not protected from moving.
 {{Identical|Move page}}',
@@ -2649,13 +2656,13 @@ See also
 'right-undelete' => '{{doc-right|undelete}}',
 'right-suppressrevision' => '{{doc-right|suppressrevision}}
 This user right is part of the [[mw:RevisionDelete|RevisionDelete]] feature.
-It can be given to the group {{msg-mw|group-suppress|pl=yes}}, although that group is disabled by default.
+It can be given to the group {{msg-mw|group-suppress}}, although that group is disabled by default.
 
 See also:
-* {{msg-mw|right-suppressionlog|pl=yes}}
-* {{msg-mw|right-hideuser|pl=yes}}
-* {{msg-mw|right-deletelogentry|pl=yes}}
-* {{msg-mw|right-deleterevision|pl=yes}}',
+* {{msg-mw|right-suppressionlog}}
+* {{msg-mw|right-hideuser}}
+* {{msg-mw|right-deletelogentry}}
+* {{msg-mw|right-deleterevision}}',
 'right-suppressionlog' => '{{doc-right|suppressionlog}}
 This user right is part of the [[mw:RevisionDelete|RevisionDelete]] feature.
 It can be given to the group {{msg-mw|group-suppress}}, although that group is disabled by default.
@@ -2799,7 +2806,8 @@ Similar to {{msg-mw|wlnote}} which is used on [[Special:Watchlist]].
 {{Identical|$1 bots}}",
 'rcshowhideliu' => 'Option text in [[Special:RecentChanges]]',
 'rcshowhideanons' => "Option text in [[Special:RecentChanges]]. Parameters:
-* $1 is the 'show/hide' command, with the text taken from either {{msg-mw|show}} or {{msg-mw|hide}}.",
+* $1 is the 'show/hide' command, with the text taken from either {{msg-mw|show}} or {{msg-mw|hide}}.
+{{Identical|Anonymous user}}",
 'rcshowhidepatr' => "Option text in [[Special:RecentChanges]]. Parameters:
 * $1 is the 'show/hide' command, with the text taken from either {{msg-mw|show}} or {{msg-mw|hide}}.",
 'rcshowhidemine' => "Option text in [[Special:RecentChanges]]. Parameters:
@@ -4034,8 +4042,8 @@ You can apparently use 'URL' instead of 'hostname'.",
 'activeusers' => 'Title of [[Special:ActiveUsers]]',
 'activeusers-intro' => 'Used as introduction in [[Special:ActiveUsers]]. Parameters:
 * $1 - number of days (<code>$wgActiveUserDays</code>)',
-'activeusers-count' => "Used in [[Special:ActiveUsers]] to show the active user's recent edit count in brackets ([]).
-* $1 is the number of recent edits
+'activeusers-count' => "Used in [[Special:ActiveUsers]] to show the active user's recent action count in brackets ([]).
+* $1 is the number of recent actions
 * $2 is the user's name for use with GENDER (optional)
 * $3 is the maximum number of days of the RecentChangesList",
 'activeusers-from' => 'Used as label for checkbox in the form on [[Special:ActiveUsers]].
@@ -4324,7 +4332,7 @@ See also:
 **{{msg-mw|enotif body intro deleted}}
 **{{msg-mw|enotif body intro created}}
 **{{msg-mw|enotif body intro moved}}
-**{{msg-mw|enotif body intro restored}} 
+**{{msg-mw|enotif body intro restored}}
 **{{msg-mw|enotif body intro changed}} (for all the other cases).
 *$NEWPAGE consists of either
 **if the page is new (in older releases), {{msg-mw|enotif newpagetext}}
@@ -4412,7 +4420,7 @@ See also:
 'rollback' => '{{Identical|Rollback}}',
 'rollback_short' => '{{Identical|Rollback}}',
 'rollbacklink' => '{{Identical|Rollback}}
-This link text appears on the recent changes page to users who have the "rollback" right.  
+This link text appears on the recent changes page to users who have the "rollback" right.
 This message has a tooltip {{msg-mw|tooltip-rollback}}
 
 {{Doc-actionlink}}',
@@ -5376,8 +5384,14 @@ See also:
 
 Special pages mentioned: {{msg-mw|Doubleredirects}}, {{msg-mw|Brokenredirects}}
 
-See also {{msg-mw|Movepagetext-noredirectfixer|notext=1}}',
-'movepagetext-noredirectfixer' => 'A variant of {{msg-mw|Movepagetext|notext=1}} displayed when the automatic redirect fixer is not enabled.',
+See also:
+* {{msg-mw|Movepagetext-noredirectfixer}}',
+'movepagetext-noredirectfixer' => "A variant of the following message ''Movepagetext'' displayed when the automatic redirect fixer is not enabled.
+
+Special pages mentioned: {{msg-mw|Doubleredirects}}, {{msg-mw|Brokenredirects}}
+
+See also:
+* {{msg-mw|Movepagetext}}",
 'movepagetalktext' => "Text on the special 'Move page'. This text only appears if the talk page is not empty.",
 'movearticle' => 'The text before the name of the page that you are moving. Can be translated as "Page that is going to be moved". Used in [[Special:MovePage]].
 
@@ -5894,7 +5908,8 @@ See also:
 Import failed: XML import parse failure at line 1, col 1 (byte 3; "- <mediawiki xml"): Empty document',
 'import-upload' => 'Used on [[Special:Import]].
 
-Related messages: {{msg-mw|right-importupload|pl=yes}} (the user right for this).',
+Related messages:
+* {{msg-mw|right-importupload}} (the user right for this)',
 'import-token-mismatch' => 'Used as error message in [[Special:Import]].
 
 See also:
@@ -6527,7 +6542,7 @@ Used as link text, linked to '{{int:Prefixindex}}' page ([[Special:PrefixIndex]]
 'pageinfo-hidden-categories' => 'The list of hidden categories on the page. Parameters:
 * $1 is the number of hidden categories on the page.',
 'pageinfo-templates' => 'The list of templates transcluded within the page. Parameters:
-* $1 is the number of templates transcluded within the page.
+* $1 is the number of templates transcluded within the current page.
 See also:
 * {{msg-mw|Pageinfo-transclusions}}',
 'pageinfo-transclusions' => 'The list of pages on which this page is transcluded. Parameters:
@@ -6761,7 +6776,8 @@ Part of variable $1 in {{msg-mw|Ago}}',
 
 See also {{msg-mw|Minutes-abbrev}}
 
-Part of variable $1 in {{msg-mw|Ago}}',
+Part of variable $1 in {{msg-mw|Ago}}.
+{{Identical|Minute}}',
 'hours' => 'Full word for "hours". $1 is the number of hours.
 
 See also {{msg-mw|Hours-abbrev}}
@@ -8510,7 +8526,10 @@ Parameter $4, the target page, is also not visible to parser functions.',
 $4 is the gender of the target user.',
 'logentry-newusers-create2' => '{{Logentry}}
 
-$4 is the name of the target user.',
+$4 is the name of the user that was created.',
+'logentry-newusers-byemail' => '{{Logentry}}
+
+$4 is the name of the user that was created.',
 'logentry-newusers-autocreate' => '{{Logentry}}
 
 $4 is the gender of the target user.',
@@ -8605,6 +8624,7 @@ $4 is the gender of the target user.',
 'api-error-ok-but-empty' => 'API error message that can be used for client side localisation of API errors.',
 'api-error-overwrite' => 'API error message that can be used for client side localisation of API errors.',
 'api-error-stashfailed' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-publishfailed' => 'API error message that can be used for client side localisation of API errors.',
 'api-error-timeout' => 'API error message that can be used for client side localisation of API errors.',
 'api-error-unclassified' => 'API error message that can be used for client side localisation of API errors.',
 'api-error-unknown-code' => 'API error message that can be used for client side localisation of API errors. Parameters:
@@ -8619,7 +8639,8 @@ $4 is the gender of the target user.',
 
 # Durations
 'duration-seconds' => '{{Related|Duration}}',
-'duration-minutes' => '{{Related|Duration}}',
+'duration-minutes' => '{{Related|Duration}}
+{{Identical|Minute}}',
 'duration-hours' => '{{Related|Duration}}',
 'duration-days' => '{{Related|Duration}}',
 'duration-weeks' => '{{Related|Duration}}',
index c31b6c9..3c2be5f 100644 (file)
@@ -314,7 +314,7 @@ $messages = array(
 
 'underline-always' => "Hayk'appas",
 'underline-never' => "Mana hayk'appas",
-'underline-default' => "Wamp'unap kikinmanta chanin",
+'underline-default' => "Qarap icha wamp'unap kikinmanta chanin",
 
 # Font style option in Special:Preferences
 'editfont-style' => "Llamk'apuy k'itichapi sanampa rik'chakuynin:",
@@ -637,7 +637,7 @@ Tapuna: $2',
 'viewsource-title' => "$1 sutiyuq p'anqap pukyu qillqanta qhaway",
 'actionthrottled' => "Rurayniykiqa hark'asqam",
 'actionthrottledtext' => "Spam nisqa millay rurayta hark'anapaq, manam saqillasunkichu kayta nisyu kutikunata rurayta ratulla mit'api. Nisyutam ruraykachanki. Ama hina kaspa, huk minutukunamanta musuqmanta ruraykachay.",
-'protectedpagetext' => "Kay p'anqaqa llamk'apuymanta amachasqam.",
+'protectedpagetext' => "Kay p'anqaqa llamk'apuymanta hukchaymantapas amachasqam.",
 'viewsourcetext' => "Kay p'anqap pukyu qillqantam qhawayta iskaychaytapas atinki:",
 'viewyourtext' => "'''Qampa llamk'apusqayki'''p pukyu qillqantam qhawayta iskaychaytapas atinki:",
 'protectedinterface' => "Kay p'anqapiqa wakichintinpa uyapuranpaq qillqam. Wandalismu nisqamanta amachasqam kachkan.
@@ -669,6 +669,7 @@ Amachaq kamachiqqa kayrayku amachani nispa nirqanmi: "$3".',
 'logouttext' => "'''Llamk'apuy tiyayniykiqa puchukasqañam.'''
 
 Sutinnaq kaspaykipas {{SITENAME}}pi wamp'uytam atinki. Mana hinataq munaspaykiqa, <span class='plainlinks'>[$1 musuqmanta yaykuy]</span> ñawpaq icha huk sutiwan. Huk p'anqakunaqa kaqllam rikch'akunqa, ''cache'' nisqa pakasqa hallch'ata mana ch'usaqchaptiykiqa.",
+'welcomeuser' => 'Allinmi hamusqayki, $1!',
 'yourname' => 'Ruraq sutiyki:',
 'yourpassword' => 'Yaykuna rimayki',
 'yourpasswordagain' => 'Yaykuna rimaykita kutipayay',
@@ -1001,6 +1002,7 @@ Qullusqachá.",
 'edit-already-exists' => "Manam atinichu musuq p'anqata kamariyta.
 Kachkañam.",
 'defaultmessagetext' => 'Ñawpaq qillqa',
+'invalid-content-data' => 'Samiqmanta willaykunaqa manam allinchu',
 
 # Content models
 'content-model-wikitext' => 'wiki qillqa',
@@ -1362,9 +1364,9 @@ Chaytataq manam kutichiyta atinkichu.",
 'prefs-emailconfirm-label' => 'E-chaskita takyachiy:',
 'prefs-textboxsize' => "Llamk'apuna wintanap chhikan kaynin",
 'youremail' => 'E-chaski imamaytayki',
-'username' => 'Ruraqpa sutin:',
-'uid' => 'Ruraqpa ID-nin:',
-'prefs-memberingroups' => 'Kay {{PLURAL:$1|huñuman|huñukunaman}} kapuq:',
+'username' => '{{GENDER:$1|Ruraqpa sutin}}:',
+'uid' => '{{GENDER:$1|Ruraqpa}} ID-nin:',
+'prefs-memberingroups' => 'Kay {{PLURAL:$1|huñuman|huñukunaman}} {{GENDER:$2|kapuq}}:',
 'prefs-registration' => "Hallch'ay pacha:",
 'yourrealname' => 'Chiqap sutiyki*',
 'yourlanguage' => 'Rimay',
@@ -1879,6 +1881,7 @@ Ama hina kaspa, [$2 willañiqi ch'uyanchana p'anqata] qhaway astawan willachikun
 'uploadnewversion-linktext' => 'Kay willañiqi ñaqha musuqchasqata churkuy',
 'shared-repo-from' => '$1-manta',
 'shared-repo' => 'rakinakusqa qullqa',
+'upload-disallowed-here' => 'Manam atinkichu kay willañiqita huknachayta.',
 
 # File reversion
 'filerevert' => '$1-ta kutichiy',
@@ -1969,7 +1972,7 @@ P'anqa [[MediaWiki:Disambiguationspage]] plantillayuq kaspaqa sut'ichana qillqam
 'double-redirect-fixed-maintenance' => '[[$1]]-manta [[$2]]-man iskaylla pusapunata allinchaspa.',
 'double-redirect-fixer' => 'Pusapuna allinchaq',
 
-'brokenredirects' => 'Panta pusapunakuna',
+'brokenredirects' => "P'akisqa pusapunakuna",
 'brokenredirectstext' => "Kay pusapuna p'anqakunaqa mana kachkaq p'anqakunamanmi pusapuchkan:",
 'brokenredirects-edit' => "llamk'apuy",
 'brokenredirects-delete' => 'qulluy',
@@ -1984,6 +1987,7 @@ P'anqa [[MediaWiki:Disambiguationspage]] plantillayuq kaspaqa sut'ichana qillqam
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|byte}}',
 'ncategories' => '$1 {{PLURAL:$1|katiguriya|katiguriyakuna}}',
+'ninterwikis' => '{{PLURAL:$1|huk wikipura|$1 wikipura}}',
 'nlinks' => "$1 {{PLURAL:$1|t'inki|t'inkikuna}}",
 'nmembers' => '$1 {{PLURAL:$1|qillqa|qillqakuna}}',
 'nrevisions' => "$1 {{PLURAL:$1|llamk'apusqa|llamk'apusqakuna}}",
@@ -2012,6 +2016,7 @@ P'anqa [[MediaWiki:Disambiguationspage]] plantillayuq kaspaqa sut'ichana qillqam
 'mostlinkedtemplates' => "Lliwmanta aswan t'inkimuqniyuq plantillakuna",
 'mostcategories' => "Lliwmanta aswan katiguriyayuq p'anqakuna",
 'mostimages' => "Lliwmanta astawan llamk'achisqa rikchakuna",
+'mostinterwikis' => "Lliwmanta aswan wikipurayuq p'anqakuna",
 'mostrevisions' => 'Lliwmanta aswan hukchasqayuq qillqakuna',
 'prefixindex' => "Tukuy p'anqakuna ñawpa k'askaqchayuq",
 'prefixindex-namespace' => "Tukuy qallarina k'askaqniyuq p'anqakuna ($1 suti k'itipi)",
@@ -2065,6 +2070,7 @@ Ama hina kaspa musyariy, huk llika tiyaykunachá chiqalla t'inkimun huk rikchap
 Rikuyniykitaqa k'ullkuchaytam atinki hallch'a layata, ruraqpa sutinta (uchuy icha hatun sanampakunata musyaq) icha chayachisqa p'anqata (uchuy icha hatun sanampakunata musyaq) akllaspa.",
 'logempty' => "Manam hallch'asqakuna kachkanchu.",
 'log-title-wildcard' => "Kaywan qallariq p'anqa sutikunata maskay",
+'showhideselectedlogentries' => "Akllasqa hallch'asqakunata rikuchiy/pakay",
 
 # Special:AllPages
 'allpages' => "Tukuy p'anqakuna",
@@ -2110,7 +2116,7 @@ Rikuyniykitaqa k'ullkuchaytam atinki hallch'a layata, ruraqpa sutinta (uchuy ich
 'linksearch-ok' => 'Maskay',
 'linksearch-text' => 'Ima rantipas sananchawanpas maskayta saqillasunkim, ahinataq "*.wikipedia.org".
 Hawa kaq duminyullapas kanam, ahinataq "*.org".<br />
-Q\'imichisqa tantari qillqa: <code>$1</code> (maskaspaykiqa kaykunamanta ama mayqintapas yapaychu).',
+Q\'imichisqa tantari {{PLURAL:$2|qillqa|qillqakuna}}: <code>$1</code> (mana mayqintapas akllaptiykiqa, http:// nisqam kanqa).',
 'linksearch-line' => "$1-man $2-manta t'inkimusqa",
 'linksearch-error' => 'Ima rantipas sananchaqa (* ?) tiyaypa qallariyninpim kanman chaylla.',
 
@@ -2152,8 +2158,10 @@ Chay kikinkunap hayñinkunamanta astawan ñawirinaykipaqqa [[{{MediaWiki:Listgro
 'mailnologin' => 'Imamaytataqa ama kachaychu',
 'mailnologintext' => '[[Special:UserLogin|Yaykunaykim]], [[Special:Preferences|allinkachinaykikunapi]] chaniyuq e-chaski imamaytappas kananmi tiyan huk ruraqkunaman e-chaskita kachanaykipaq.',
 'emailuser' => 'Kay ruraqman e-chaskita kachay',
+'emailuser-title-target' => 'Kay {{GENDER:$1|ruraqman}} e-chaskita kachay',
+'emailuser-title-notarget' => 'E-chaski kay ruraqman:',
 'emailpage' => 'E-chaski kay ruraqman:',
-'emailpagetext' => "Kay hunt'ana p'anqatam llamk'achiyta atinki e-chaskita kachanaykipaq.
+'emailpagetext' => "Kay uranpi kaq hunt'ana p'anqatam llamk'achiyta atinki kay {{GENDER:$1|ruraqman}} e-chaskita kachanaykipaq.
 Qampa [[Special:Preferences|allinkachinaykikunapi]] qillqakamachisqayki imamaytaqa paqarinqa kachasqayki e-chaskipi chaskiqpa kutichisunaykita atinanpaq.",
 'usermailererror' => 'Chaski llikaqa pantasqatam kutichimurqan:',
 'defemailsubject' => '{{SITENAME}} p\'anqamanta chaski "$1" sutiyuq ruraqmanta',
@@ -2185,14 +2193,14 @@ Qampa [[Special:Preferences|allinkachinaykikunapi]] qillqakamachisqayki imamayta
 
 # Watchlist
 'watchlist' => "Watiqasqa p'anqakuna",
-'mywatchlist' => 'Watiqasqaykuna',
+'mywatchlist' => "Watiqasqay p'anqakuna",
 'watchlistfor2' => '$1-paq $2',
 'nowatchlist' => 'Manam watiqasqakunachu kachkan.',
 'watchlistanontext' => 'Ama hina kaspa, $1 watiqana sutisuyuykipi imakunatapas qhawanaykipaq icha hukchanaykipaq.',
 'watchnologin' => 'Manam yaykurqankichu',
 'watchnologintext' => '[[Special:UserLogin|Yaykunaykim]] tiyan watiqana sutisuyuykita hukchanaykipaq.',
 'addwatch' => 'Watiqasqaykunaman yapay',
-'addedwatchtext' => "Kunanqa «[[:\$1]]» sutiyuq p'anqa [[Special:Watchlist|watiqanykipim]] kachkañam. Chay p'anqapi rimachinanpipas hukchanakunaqa kay watiqana p'anqapim rikunki. Watiqasqayki p'anqaqa [[Special:RecentChanges|ñaqha hukchasqakunapi]] '''yanasapa''' qillqasqa rikuchisqa kanqa aswan sikllalla tarinaykipaq. <p>Manaña watiqayta munaptiykiqa, uma siq'ipi \"amaña watiqaychu\" ñit'iy.",
+'addedwatchtext' => "Kunanqa \"[[:\$1]]\" sutiyuq p'anqa [[Special:Watchlist|watiqasqayki p'anqakunaman]] yapasqañam. Chay p'anqapi rimanakuy p'anqanpipas hukchanakunata kay watiqana p'anqapim rikunki.",
 'removewatch' => 'Watiqasqaykunamanta qichuy',
 'removedwatchtext' => '"[[:$1]]" sutiyuq p\'anqaqa [[Special:Watchlist|watiqasqaykikunamanta]] qichusqam.',
 'watch' => 'Watiqay',
@@ -2221,14 +2229,22 @@ Qampa [[Special:Preferences|allinkachinaykikunapi]] qillqakamachisqayki imamayta
 'enotif_mailer' => '{{SITENAME}}pa chaski musyachina sirwiqnin',
 'enotif_reset' => "Tukuy p'anqakunata watukusqakama sananchay",
 'enotif_impersonal_salutation' => '{{SITENAME}}pa ruraqnin',
+'enotif_subject_deleted' => "{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p'anqatam qullurqañam",
+'enotif_subject_created' => "{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p'anqatam kamarirqañam",
+'enotif_subject_moved' => "{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p'anqatam astarqañam",
+'enotif_subject_restored' => "{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p'anqatam qullusqamanta paqarichirqañam",
+'enotif_subject_changed' => "{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p'anqatam hukcharqañam",
+'enotif_body_intro_deleted' => '{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p\'anqatam $PAGEEDITDATE p\'unchawpi qullurqañam, kaypi qhaway: $3.',
+'enotif_body_intro_created' => '{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p\'anqatam $PAGEEDITDATE p\'unchawpi kamarirqañam, kunan musuqchasqatataq kaypi qhaway: $3.',
+'enotif_body_intro_moved' => '{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p\'anqatam $PAGEEDITDATE p\'unchawpi astarqañam, kunan musuqchasqatataq kaypi qhaway: $3.',
+'enotif_body_intro_restored' => '{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p\'anqatam qullusqamanta $PAGEEDITDATE p\'unchawpi paqarichirqañam, kunan musuqchasqatataq kaypi qhaway: $3.',
+'enotif_body_intro_changed' => '{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p\'anqatam $PAGEEDITDATE p\'unchawpi hukcharqañam, kunan musuqchasqatataq kaypi qhaway: $3.',
 'enotif_lastvisited' => "$1 sutiyuq p'anqata qhaway qayna watukamusqaykimantapacha tukuy hukchasqakunata rikunaykipaq.",
 'enotif_lastdiff' => "$1 sutiyuq p'anqata qhaway kay hukchasqata rikunaykipaq.",
 'enotif_anon_editor' => 'sutinnaq ruraq $1',
 'enotif_body' => 'Munakusqa $WATCHINGUSERNAME,
 
-{{SITENAME}}pi $PAGETITLE sutiyuq p\'anqataqa $PAGEEDITOR sutiyuq ruraqmi $CHANGEDORCREATED $PAGEEDITDATE pachapi, $PAGETITLE_URL sutiyuq p\'anqata qhaway kunan hukchasqata rikunaykipaq.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Llamk\'apuqpa willasqan: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2236,7 +2252,7 @@ Llamk\'apuqta tapuy:
 e-chaski: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-Kay p\'anqata mana musuqmanta watukamuptiykiqa, manam huk hukchasqakunamanta willasqaykichu. Tukuy watiqasqayki p\'anqakunapaq musyachina sananchakunatapas kutichiytam atinkiman.
+Kay p\'anqata mana musuqmanta watukamuptiykiqa, manam huk ruraykunamanta willasqaykichu. Tukuy watiqasqayki p\'anqakunapaq musyachina sananchakunatapas kutichiytam atinkiman.
 
              Tukuy sunquwan, {{SITENAME}}pa e-chaski musyachina llikan
 
@@ -2290,6 +2306,8 @@ $2 nisqa p\'anqata qhaway ñaqha qullusqakunata rikunaykipaq.',
 'rollback' => 'Hukchasqakunata kutichiy',
 'rollback_short' => 'Kutichiy',
 'rollbacklink' => 'Kutichiy',
+'rollbacklinkcount' => '$1 {{PLURAL:$1|hukchasqata}} kutichiy',
+'rollbacklinkcount-morethan' => '$1-manta aswan {{PLURAL:$1|hukchasqakunata}} kutichiy',
 'rollbackfailed' => 'Manam kutichiyta atinchu',
 'cantrollback' => "Manam atinichu llamk'apusqata kutichiyta; qhipaq kaq llamk'apuqqa kay p'anqap hukllam ruraqnin.",
 'alreadyrolled' => "Manam atinichu [[User:$2|$2]]-pa ([[User talk:$2|rimanakuy]]) [[$1]] nisqa qhipaq llamk'apusqanta kutichiyta; pipas kay p'anqataqa llamk'apurqunñam icha kutichirqunñam.
@@ -2318,6 +2336,8 @@ Ama hina kaspa, llika wamp'unaykipi \"Ñawpaqman\" (\"Back\") ñit'ispa ñawpaq
 'prot_1movedto2' => '«[[$1]]» «[[$2]]»-man astasqa',
 'protect-badnamespace-title' => "Mana amachanalla suti k'iti",
 'protect-badnamespace-text' => "Kay suti k'iti kaq p'anqakunaqa manam amachanallachu.",
+'protect-norestrictiontypes-text' => "Kay p'anqaqa manam amachanapaqchu, saywachana rikch'aqkuna (llamk'apuna icha kamarina hina) mana kaptinmi.",
+'protect-norestrictiontypes-title' => "Mana amachana p'anqa",
 'protect-legend' => 'Amachayta takyachiy',
 'protectcomment' => 'Kayrayku:',
 'protectexpiry' => 'Amachaypa puchukaynin',
@@ -2332,8 +2352,8 @@ Kay qatiqpiqa '''$1''' sutiyuq p'anqap kunan allinkachinankunatam rikunki:",
 Kay qatiqpiqa '''$1''' sutiyuq p'anqap kunan allinkachinankunatam rikunki:",
 'protect-cascadeon' => "Kay p'anqaqa amachasqam kachkan, kay phaqchalla amachasqa {{PLURAL:$1|p'anqapi|p'anqakunapi}} ch'aqtasqa kaspanmi. Kay p'anqap amachasqa kachkayninta hukchaytam atinki, hinaspapas manam phaqcha nisqa amachasqa kaynintachu hukchanki.",
 'protect-default' => 'Tukuy ruraqkunapaq',
-'protect-fallback' => '"$1" saqillanam',
-'protect-level-autoconfirmed' => 'Mana llullu rakiqunayuq ruraqkunallapaq',
+'protect-fallback' => '"$1" saqillanayuq ruraqkunallapaq',
+'protect-level-autoconfirmed' => 'Kikin rakiqunayuq ruraqkunallapaq',
 'protect-level-sysop' => 'Kamachiqkunallapaq',
 'protect-summary-cascade' => "''phaqcha'' nisqapi",
 'protect-expiring' => 'puchukanqa $1 (UTC)',
@@ -2426,7 +2446,7 @@ $1',
 'blanknamespace' => '(Uma)',
 
 # Contributions
-'contributions' => "Ruraqpa llamk'apusqankuna",
+'contributions' => "{{GENDER:$1|Ruraqpa}} llamk'apusqankuna",
 'contributions-title' => "$1 sutiyuq ruraqpa llamk'apusqankuna",
 'mycontris' => "Llamk'apusqaykuna",
 'contribsub2' => '$1 ($2)',
@@ -2468,7 +2488,7 @@ Qhipaq hark'ay hallch'a yaykuchisqatam kay qatiqpi rikunki:",
 'whatlinkshere-hideredirs' => '$1 pusapunakuna',
 'whatlinkshere-hidetrans' => "$1 plantilla ch'aqtanakuna",
 'whatlinkshere-hidelinks' => "$1 t'inkikuna",
-'whatlinkshere-hideimages' => "$1 rikcha t'inkikuna",
+'whatlinkshere-hideimages' => "$1 rikchaman t'inkikuna",
 'whatlinkshere-filters' => "Ch'illchinakuna",
 
 # Block/unblock
@@ -2614,14 +2634,14 @@ Willariy imaraykum hark'anki (ahinataq: sapaq wandaluchasqa p'anqakunamanta will
 # Move page
 'move-page' => '$1-ta astay',
 'move-page-legend' => "P'anqata astay",
-'movepagetext' => "Kay hunt'ana p'anqawanqa huk p'anqam tukuy wiñay kawsasqanpas astasqa kanqa. Mawk'a sutinqa musuq sutiman pusapuq p'anqam tukunqa. Mawk'a sutiman t'inkimuq p'anqakunaqa manam hukyanqachu. Paqtataq iskaylla pusapuna p'anqakunata allinchallay. Ama panta t'inkimuqkunata saqiychu.
+'movepagetext' => "Kay hunt'ana p'anqawanqa huk p'anqam tukuy wiñay kawsasqanpas astasqa kanqa. Mawk'a sutinqa musuq sutiman pusapuq p'anqam tukunqa. Mawk'a sutiman t'inkimuq p'anqakunaqa manam hukyanqachu. Paqtataq [[Special:DoubleRedirects|iskayllapas]] [[Special:BrokenRedirects|p'akisqapas]] pusapuna p'anqakunata allinchallay. Ama panta t'inkimuqkunata saqiychu.
 
 
 Nisqayki musuq sutiyuq wiñay kawsasqayuq p'anqaña kachkaptinqa, kay p'anqa '''manam''' astasqa kanqachu.
 
 Huklla kuti astasqa p'anqataqa mawk'a sutinman astayta atinkim, manataq huk mawk'a kachkaqña p'anqamanchu.
 
-<b>PAQTATAQ!</b>
+'''Paqtataq!'''
 Kay astayqa ancha riqsisqa p'anqata hatun mana suyapusqa hukchaymi kayta atinman;
 ama hina kaspa, yuyarillay imachus kay astanaykita saqispa tukunata atinman.",
 'movepagetext-noredirectfixer' => "Kay hunt'ana p'anqawanqa huk p'anqam tukuy wiñay kawsasqanpas musuq sutiman astasqa kanqa.
@@ -2686,6 +2706,7 @@ Tukuna p\'anqaqa ("[[:$1]]") kachkañam. Astanapaq qulluyta munankichu?',
 'immobile-target-namespace-iw' => "Wikipura t'inkiqa p'anqa astanapaq manam allin taripanachu.",
 'immobile-source-page' => "Kay p'anqaqa manam astanallachu.",
 'immobile-target-page' => 'Manam atinichu chay taripana sutiman astayta.',
+'bad-target-model' => "Munakusqa taripanaqa wakin samiq qatillanayuqmi. Manam atinichu $1-manta $2-man t'ikrayta.",
 'imagenocrossnamespace' => "Manam atinichu p'anqata astayta mana willañiqipaq suti k'itiman",
 'nonfile-cannot-move-to-file' => "Manam atinichu mana willañiqi kaqta astayta willañiqipaq suti k'itiman",
 'imagetypemismatch' => "Willañiqip musuq mast'arinanqa kay layapaq manam allinchu",
@@ -2764,6 +2785,7 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
 'import-interwiki-templates' => 'Tukuy plantillakunapas',
 'import-interwiki-submit' => 'Hawamanta chaskiy',
 'import-interwiki-namespace' => "Kay suti k'itiman churay:",
+'import-interwiki-rootpage' => "Taripana saphi p'anqa (akllanalla):",
 'import-upload-filename' => 'Willañiqip sutin:',
 'import-comment' => 'Willayniyki:',
 'importtext' => "Ama hina kaspa, willañiqita qallariy wikimanta [[Special:Export|hawaman quna llamk'anawan]] hawaman quy antañiqiqniykipi waqaychaspa, chaymantataq kaypi churkuy.",
@@ -2795,6 +2817,9 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
 'import-error-interwiki' => '"$1" sutiyuq p\'anqaqa hawamanta manam chaskisqachu, sutin wikipura (interwiki) nisqapaq hallch\'asqa kaptinmi.',
 'import-error-special' => '"$1" sutiyuq p\'anqaqa hawamanta manam chaskisqachu, mana p\'anqapaq kaq sapaq suti k\'itiman kapuspanmi.',
 'import-error-invalid' => '"$1" sutiyuq p\'anqaqa hawamanta manam chaskisqachu, sutin mana allin kaptinmi.',
+'import-options-wrong' => 'Pantasqa {{PLURAL:$2|akllasqa|akllasqakuna}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => "Qusqa saphi p'anqaqa manam allin sutichu.",
+'import-rootpage-nosubpage' => 'Saphi p\'anqap "$1" sutisuyunpiqa urin p\'anqakuna manam kanqachu.',
 
 # Import log
 'importlogpage' => "Hawamanta chaskiy hallch'a",
@@ -2929,24 +2954,46 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
 'spambot_username' => 'MediaWiki-ta spam nisqamanta pichay',
 'spam_reverting' => "Qhipaq kaq mana $1-man t'inkimuqniyuq llamk'apusqaman kutichispa",
 'spam_blanking' => "Tukuy llamk'apusqakunaqa $1-manmi t'inkimuq, ch'usaqchaspa",
+'spam_deleting' => "Tukuy musuqchasqakunaqa $1-manmi t'inkimun, qulluspa",
 
 # Info page
 'pageinfo-title' => '"$1" sutiyuq p\'anqamanta willay',
+'pageinfo-header-basic' => 'Tiksi willaykuna',
 'pageinfo-header-edits' => "Llamk'apusqakunap wiñay kawsaynin",
+'pageinfo-header-restrictions' => "P'anqap amachaynin",
+'pageinfo-header-properties' => "P'anqap kaqninkuna",
+'pageinfo-display-title' => "P'anqa sutita rikuchiy",
+'pageinfo-default-sort' => 'Kikinmanta ñiqichana llawi',
+'pageinfo-length' => "P'anqap chhikan (byte)",
+'pageinfo-article-id' => "P'anqap ID-nin",
+'pageinfo-language' => "P'anqap rimaynin",
+'pageinfo-robot-policy' => 'Maskana kuyuchinap kachkaynin',
+'pageinfo-robot-index' => 'Maskana yuyarinapaqpas',
+'pageinfo-robot-noindex' => 'Mana maskana yuyarinapaq',
 'pageinfo-views' => "Hayk'a qhawaykuna",
 'pageinfo-watchers' => "P'anqata hayk'a watiqaqkuna",
+'pageinfo-redirects-name' => "Kay p'anqaman pusampuqkuna",
+'pageinfo-subpages-name' => "Kay p'anqap urin p'anqankuna",
 'pageinfo-firstuser' => "P'anqap kamariqnin",
 'pageinfo-firsttime' => "P'anqa kamariypa p'unchawnin",
 'pageinfo-lastuser' => "Ñaqha llamk'apuqnin",
 'pageinfo-lasttime' => "Ñaqha llamk'apuypa p'unchawnin",
 'pageinfo-edits' => "Tukuymanta hayk'a hukchasqakuna",
 'pageinfo-authors' => "Tukuymanta hayk'a sapaq kaq ruraqkuna",
+'pageinfo-magic-words' => 'Layqa {{PLURAL:$1|simi|simikuna}} ($1)',
+'pageinfo-hidden-categories' => 'Pakasqa {{PLURAL:$1|katiguriya|katiguriyakuna}} ($1)',
+'pageinfo-templates' => "Ch'aqtasqa {{PLURAL:$1|plantilla|plantillakuna}} ($1)",
+'pageinfo-transclusions' => "Kaypi ch'aqtasqa {{PLURAL:$1|p'anqa|p'anqakuna}} ($1)",
 'pageinfo-toolboxlink' => "P'anqamanta willakuna",
 'pageinfo-redirectsto' => 'Kayman pusampun:',
 'pageinfo-redirectsto-info' => 'willachikuy',
 'pageinfo-contentpage' => "Samiqniyuq p'anqa hinam chaninchasqa",
 'pageinfo-contentpage-yes' => 'Arí',
 'pageinfo-protect-cascading-yes' => 'Arí',
+'pageinfo-category-info' => 'Katiguriyamanta willaykuna',
+'pageinfo-category-pages' => "Hayk'a p'anqakuna",
+'pageinfo-category-subcats' => "Hayk'a urin katiguriyakuna",
+'pageinfo-category-files' => "Hayk'a willañiqikuna",
 
 # Patrolling
 'markaspatrolleddiff' => 'Qhawakipasqaman sananchay',
@@ -2958,6 +3005,8 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
 'markedaspatrollederror' => 'Manam atinichu qhawakipasqaman sananchayta',
 'markedaspatrollederrortext' => "Huk llamk'apusqata akllanaykim tiyan qhawakipasqaman sananchanaykipaq.",
 'markedaspatrollederror-noautopatrol' => "Manam saqillasunkichu qampa llamk'apusqaykikunata qhawakipasqaman sananchayta.",
+'markedaspatrollednotify' => "Kay $1 sutiyuq p'anqapi hukchasqaqa qhawakipasqa nisqa sananchasqañam.",
+'markedaspatrollederrornotify' => 'Qhawakipasqa niyqa manam aypanchu.',
 
 # Patrol log
 'patrol-log-page' => "Qhawakipay hallch'a",
@@ -2990,6 +3039,8 @@ Payta rurachiyqa antañiqiqniykita llikaykitapas waqllinqachá.",
 'file-info-size-pages' => "$1 × $2 iñu, willañiqip chhikan kaynin: $3; MIME laya: $4, $5 {{PLURAL:$5|p'anqa|p'anqa}}",
 'file-nohires' => 'Manam kanchu aswan huyakuyuq rikcha.',
 'svg-long-desc' => 'SVG willañiqi, rimasqakama $1 × $2 iñuyuq, willañiqip chhikan kaynin: $3',
+'svg-long-desc-animated' => 'Kuyuchisqa SVG willañiqi, rimasqakama $1 × $2 iñuyuq, willañiqip chhikan kaynin: $3',
+'svg-long-error' => 'Mana allin SVG willañiqi: $1',
 'show-big-image' => 'Qallariy huyaku',
 'show-big-image-preview' => 'Kay ñawpaq qhawariypa chhikan kaynin: $1.',
 'show-big-image-other' => 'Huk {{PLURAL:$2|huyaku|huyakukuna}}: $1.',
@@ -3017,7 +3068,10 @@ Payta rurachiyqa antañiqiqniykita llikaykitapas waqllinqachá.",
 'minutes' => '{{PLURAL:$1|huk minutu|$1 minutu}}',
 'hours' => '{{PLURAL:$1|huk ura|$1 ura}}',
 'days' => "{{PLURAL:$1|huk p'unchaw|$1 p'unchaw}}",
+'months' => '{{PLURAL:$1|huk killa|$1 killa}}',
+'years' => '{{PLURAL:$1|huk wata|$1 wata}}',
 'ago' => '$1 ñaqha',
+'just-now' => 'kunallan',
 
 # Bad image list
 'bad_image_list' => "Chantaqa kay hinam:
@@ -3747,9 +3801,9 @@ Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapus
 'logentry-move-move_redir-noredirect' => "$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man pusapunata huknachaspa mana pusapunata saqispa",
 'logentry-patrol-patrol' => "$1 sutiyuq ruraqqa $3 nisqa p'anqamanta $4 musuqchasqatam patrullasqa nispa sananchan",
 'logentry-patrol-patrol-auto' => "$1 sutiyuq ruraqqa $3 nisqa p'anqamanta $4 musuqchasqatam kikinmanta patrullasqa nispa sananchan",
-'logentry-newusers-newusers' => '$1 sutiyuq ruraqqa rakiqunatam kamarin',
-'logentry-newusers-create' => '$1 sutiyuq ruraqqa rakiqunatam kamarin',
-'logentry-newusers-create2' => '$1 sutiyuq ruraqqa rakiqunatam kamarin $3',
+'logentry-newusers-newusers' => '$1 sutiyuq rakiquna kamarisqañam',
+'logentry-newusers-create' => '$1 sutiyuq rakiquna kamarisqañam',
+'logentry-newusers-create2' => '$1 sutiyuq ruraqqa $3 sutiyuq rakiqunatam kamarirqanñam',
 'logentry-newusers-autocreate' => '$1 sutiyuq rakiqunaqa kikinmanta kamarisqam',
 'newuserlog-byemail' => 'e-chaskiwan kachasqa yaykuna rima',
 'rightsnone' => '(-)',
index a2c2820..1585ced 100644 (file)
@@ -348,11 +348,12 @@ Shina kakpika, shuk rurakka ña pankata pichankacha.',
 'viewsource' => 'Pukyu killkata rikuna',
 'actionthrottled' => 'Rurayta harkashka',
 'actionthrottledtext' => 'Spam rurashpa nalli runakunaka ama yapata chaskikuna kachankapak, mana chayta kutin ñapash rurana ushapankichu. Ama shinachu kapay, ashata shuyashpa  (wakin minutoskuna) kutin rurapay.',
-'protectedpagetext' => 'Kay pankata ama shukchinkapak harkashkami kan.',
+'protectedpagetext' => 'Kay pankaka ama shukchinkapak harkashkami kan.',
 'viewsourcetext' => 'Kay pankapak wiki killkayta rikunata, ishkachinatapash ushapankimi.',
 'protectedinterface' => 'Kay pankaka kapak willaykunata charinmi, ama nalli runakunaka kaypi killkankapak harkashkami kapan.',
 
 # Login and logout pages
+'welcomeuser' => '¡Alli shamushka, $1!',
 'yourname' => 'Rurak shuti:',
 'yourpassword' => 'Yaykunkapak rimay:',
 'yourpasswordagain' => 'Yaykunapak rimayta kutin killkapay:',
@@ -525,6 +526,9 @@ Shuk rurakkunaka kikinpa e-chaski ''dirección''ta mana yachankachu.",
 
 'grouppage-sysop' => '{{ns:project}}:Kamachik',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Rurakkununata kamaykunapa kamu',
+
 # User rights log
 'rightslog' => 'Rurakpa hayñikunapa kamu',
 
@@ -640,9 +644,6 @@ Shuk rurakkunaka kikinpa e-chaski ''dirección''ta mana yachankachu.",
 'linksearch' => 'hawaman tinkikunata maskana',
 'linksearch-line' => '$1 pankaka $2-manta tinkishkami kan',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Rurakkununata kamaykunapa kamu',
-
 # Special:ListGroupRights
 'listgrouprights-members' => '(Kay tantanakuypa rurakkunapa shutikuna)',
 
@@ -686,9 +687,9 @@ $2 rikpika, ima pankakunaka pichashkami kan yachakupanki.',
 'protect_expiry_invalid' => "''Ima pachakaman'' mana alli nishkami.",
 'protect_expiry_old' => "''Ima pachakaman'' mana alli nishkami : kay pachaka ñawpak pachapi kapanmi !",
 'protect-default' => 'Rukuy runakunaman ari nipay',
-'protect-fallback' => '«$1» hayñita mutsupanki',
-'protect-level-autoconfirmed' => 'Mushuk rurakkunata mana shutiyuk rurakkunatapash wichkana',
-'protect-level-sysop' => 'Kipukamayukkunalla',
+'protect-fallback' => '«$1» hayñiyuk rurakkunallapak',
+'protect-level-autoconfirmed' => 'Kikin shutiyuk rurakkunallapak',
+'protect-level-sysop' => 'Kipukamayukkunallapak',
 'protect-expiring' => '$1 (UTC) pachakaman',
 'restriction-type' => 'Hayñi:',
 
@@ -702,7 +703,7 @@ $2 rikpika, ima pankakunaka pichashkami kan yachakupanki.',
 'blanknamespace' => 'Kapak',
 
 # Contributions
-'contributions' => 'Kay rurakpa killkaykuna',
+'contributions' => '{{GENDER:$1|Kay rurakpa}} killkaykuna',
 'contributions-title' => '$1 shutiyuq rurakpa killkaykuna',
 'mycontris' => 'Nukapak killkaykuna',
 'contribsub2' => '$1 ($2)',
index fc5a5c3..d9b8e65 100644 (file)
@@ -75,7 +75,7 @@ $messages = array(
 'tog-externaleditor' => 'Utilisar sco standard in editur extern (be per experts, basegna ina configuraziun speziala da des computer. [//www.mediawiki.org/wiki/Manual:External_editors Dapli infurmaziuns.])',
 'tog-externaldiff' => 'Utilisar sco standard in program extern per visualisar differenzas tranter versiuns (be per experts, basegna ina configuraziun speziala da des computer. [//www.mediawiki.org/wiki/Manual:External_editors Dapli infurmaziuns.])',
 'tog-showjumplinks' => 'Activar las colliaziuns "seglir a"',
-'tog-uselivepreview' => 'Utilisar la prevista dinamica (basegna JavaScript)',
+'tog-uselivepreview' => 'Utilisar la prevista dinamica (basegna JavaScript) (experiment!)',
 'tog-forceeditsummary' => 'Avertir durant memoriar sche la resumaziun manca',
 'tog-watchlisthideown' => "Zuppentar mias modificaziuns en la glista d'observaziun",
 'tog-watchlisthidebots' => "Zuppentar modificaziuns da bots en la glista d'observaziun",
index 91001cd..0ef9e67 100644 (file)
@@ -331,7 +331,7 @@ pe titlul secțiunii (JavaScript)',
 'tog-externaleditor' => 'Utilizează, în mod implicit, un editor extern (Doar pentru experți; necesită setări speciale pe calculatorul dumneavoastră. [//www.mediawiki.org/wiki/Manual:External_editors Mai multe informații.])',
 'tog-externaldiff' => 'Utilizează, în mod implicit, un program extern pentru diferențele între versiuni (Doar pentru experți; necesită setări speciale pe calculatorul dumneavoastră. [//www.mediawiki.org/wiki/Manual:External_editors Mai multe informații.])',
 'tog-showjumplinks' => 'Activează legăturile de accesibilitate „sari la”',
-'tog-uselivepreview' => 'Folosește previzualizarea în timp real (JavaScript)',
+'tog-uselivepreview' => 'Folosește previzualizarea în timp real (JavaScript) (experimental)',
 'tog-forceeditsummary' => 'Avertizează-mă când uit să descriu modificările',
 'tog-watchlisthideown' => 'Ascunde modificările mele la lista mea de urmărire',
 'tog-watchlisthidebots' => 'Ascunde modificările boților la lista mea de urmărire',
@@ -2478,9 +2478,9 @@ Aici sunt setările curente pentru pagina '''$1''':",
 'protect-cascadeon' => 'Această pagină este protejată deoarece este inclusă în {{PLURAL:$1|următoarea pagină, ce are|următoarele pagini ce au}} activată protejarea la modificare în cascadă.
 Puteți schimba nivelul de protejare al acestei pagini, dar asta nu va afecta protecția în cascadă.',
 'protect-default' => 'Permis pentru toți utilizatorii',
-'protect-fallback' => 'Cere permisiunea "$1"',
-'protect-level-autoconfirmed' => 'Blochează utilizatorii noi și neînregistrați',
-'protect-level-sysop' => 'Numai administratorii',
+'protect-fallback' => 'Autorizat doar pentru utilizatorii cu permisiunea „$1”',
+'protect-level-autoconfirmed' => 'Autorizat doar pentru utilizatorii autoconfirmați',
+'protect-level-sysop' => 'Autorizat doar pentru administratori',
 'protect-summary-cascade' => 'în cascadă',
 'protect-expiring' => 'expiră $1 (UTC)',
 'protect-expiring-local' => 'expiră la $1',
@@ -2785,8 +2785,7 @@ nu uitați să verificați dacă nu există redirecționări [[Special:DoubleRed
 
 Vă rugăm să rețineți că sunteți responsabil(ă) pentru a face legăturile vechi să rămână valide.
 
-Rețineți că pagina '''nu va fi redenumită''' dacă există deja o pagină cu noul titlu, în afara cazurilor în care cea din urmă nu are conținut sau este deja
-o redirecționare; în plus, aceasta nu trebuie să aibă un istoric de modificări.
+Rețineți că pagina '''nu va fi redenumită''' dacă există deja o pagină cu noul titlu, în afara cazului în care cea din urmă este deja o redirecționare; în plus, aceasta nu trebuie să aibă un istoric de modificări.
 Cu alte cuvinte, veți putea redenumi înapoi o pagină pe care ați redenumit-o greșit, dar nu veți putea suprascrie o pagină validă existentă prin redenumirea alteia.
 
 '''ATENȚIE!'''
@@ -4040,6 +4039,7 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 'api-error-ok-but-empty' => 'Eroare internă: niciun răspuns de la server.',
 'api-error-overwrite' => 'Nu este permisă suprascrierea unui fișier existent.',
 'api-error-stashfailed' => 'Eroare internă: serverul nu a putut stoca fișierul temporar.',
+'api-error-publishfailed' => 'Eroare internă: serverul nu a putut publica fișierul temporar.',
 'api-error-timeout' => 'Serverul nu a răspuns în timp util.',
 'api-error-unclassified' => 'A apărut o eroare necunoscută.',
 'api-error-unknown-code' => 'Eroare necunoscută: „$1”',
index fdf346f..1ca5108 100644 (file)
@@ -59,7 +59,7 @@ $messages = array(
 'tog-externaldiff' => "Ause 'na differenze esterne pe default (sulamende pe l'esperte, abbesogne de 'na configuraziona speciele sus a 'u computer tune. <br />
 [//www.mediawiki.org/wiki/Manual:External_editors More information.])",
 'tog-showjumplinks' => 'Abbilite "zumbe a" pe accedere a le collegaminde',
-'tog-uselivepreview' => "Ause l'andeprime all'istande (richiede JavaScript) (Sperimendale)",
+'tog-uselivepreview' => "Ause l'andeprime da 'u vive (JavaScript) (Sperimendele)",
 'tog-forceeditsummary' => "Ciercheme conferme quanne stoche a 'nzerische 'nu riepighe vianghe",
 'tog-watchlisthideown' => "Scunne le cangiaminde mie da 'a liste de le pàgene condrollete",
 'tog-watchlisthidebots' => "Scunne le cangiaminde de le not da 'a liste de le pàgene condrollete",
@@ -790,10 +790,10 @@ Tu ne stè promitte ca quidde ca scrive tu, o lè scritte cu 'u penziere tue o l
 '''NO REGGISTRA' FATIJE CUPERTE DA 'U COPYRIGHT SENZA PERMESSE! NO FA STUDECARIE!'''",
 'longpageerror' => "'''ERRORE: 'U teste ca tu vuè ccu reggistre è luenghe {{PLURAL:$1|'nu kilobyte|$1 kilobyte}}, invece 'u limite massime jè de {{PLURAL:$2|'nu kilobyte|$2 kilobyte}}.'''
 Non ge puè reggistrà sta pàggene.",
-'readonlywarning' => "'''FA ATTENZIO': 'U database ha state bloccate pe manutenziona, e allore tu non ge puè reggistrà le cangiaminde ca ste face mò.'''
-Tu puè fa 'na bella cose, tagghie e 'nzicche le cangiaminde jndr'à 'nu file de teste sus a 'u combiuter tue e pò cchiù tarde le reggistre sus 'a Uicchi.
+'readonlywarning' => "'''FA ATTENZIO': 'U database ha state bloccate pe manutenzione, e allore tu non ge puè reggistrà le cangiaminde ca ste face mò.'''
+Tu puè fa 'na bella cose, tagghie e 'nzicche le cangiaminde jndr'à 'nu file de teste sus a 'u combiuter tune e pò cchiù tarde le reggistre sus 'a Uicchi.
 
-L'amministratore ca ha bloccate 'u database ha scritte stu mutive: $1",
+L'amministratore ca ha bloccate 'u database ha date stu mutive: $1",
 'protectedpagewarning' => "'''ATTENZIO': Sta pàgene ha state bloccate e allore sulamende le utinde cu le privilegge de ''sysop'' ponne cangiarle.'''
 L'urteme archivie de le trasute ha state previste aqquà sotte pe referimende:",
 'semiprotectedpagewarning' => "'''Fà attenzione:''' Sta pàgene ha state bloccate accussì sulamende l'utinde reggistrete ponne fà cangiaminde.
@@ -2268,9 +2268,9 @@ Chiste sonde le configuraziune corrende p'a pàgene '''$1''':",
 'protect-cascadeon' => "Sta pàgene mò jè  prutette purcè jè ingluse jndr'à {{PLURAL:$1|'a seguende pàgene, ca tène|le seguende pàggene, ca tènene}} a protezione a cascata appizzechete.
 Tu puè cangià 'u levèlle de protezione de sta pàgene ma stu cangiamende non ge tène effette a cascata.",
 'protect-default' => "Permitte a tutte l'utinde",
-'protect-fallback' => 'Richieste \'u permesse "$1"',
-'protect-level-autoconfirmed' => "Blocche l'utinde nuève e chidde non reggistrete",
-'protect-level-sysop' => 'Sulamende pe le Sysops',
+'protect-fallback' => 'Richieste d\'u permesse "$1"',
+'protect-level-autoconfirmed' => "Blocche l'utinde nuève e chidde non reggistrate",
+'protect-level-sysop' => 'Sulamende pe le Amministrature',
 'protect-summary-cascade' => 'a caschete',
 'protect-expiring' => "more 'u $1 (UTC)",
 'protect-expiring-local' => "scade 'u $1",
@@ -2574,18 +2574,18 @@ Pe bloccà o sbloccà 'u database quiste abbesogne de essere scritte da 'nu web
 # Move page
 'move-page' => 'Spuèste $1',
 'move-page-legend' => "Spuèste 'a pàgene",
-'movepagetext' => "Ausanne 'u form aqquà sotte ste cange 'u nome d'a pàgene, spustanne tutte a storia soje sus a 'u nome néve.
-U' vecchie titele devènde 'nu ridirezionamende sus 'a pàgena nove.
-Tu puè aggiornà 'u ridirezionamende ca apponde da 'u titele automaticamende.
-Ce tu no fece ninde condrolle ca non ccreje [[Special:DoubleRedirects|doppie ridirezionaminde ]] o [[Special:BrokenRedirects|ridirezionaminde scuasciete]].
-Tu si 'u responsabbile de quidde ca cumbine, allore me raccomande fa attenzione.
+'movepagetext' => "Ausanne 'u form aqquà sotte ste cange 'u nome d'a pàgene, spustanne tutte 'a storia soje sus a 'u nome nuéve.
+U' vecchie titole devènde 'nu ridirezionamende sus 'a pàgena nove.
+Tu puè aggiornà 'u ridirezionamende ca apponde a 'u titole origgenale automaticamende.
+Ce tu no ste scacchie, sta secure de condrollà [[Special:DoubleRedirects|doppie ridirezionaminde]] o [[Special:BrokenRedirects|ridirezionaminde scuasciate]].
+Tu si 'u responsabbile de quidde ca cumbine, assicurate ca 'u collegamende condinue a appondà addò avessa scè.
 
-Vide Bbuene ca 'a pàgene non g'avene spustete ce esiste n'otra pàgene cu 'u titele nuéve, a mene ca jè vacande o jè 'na pàgene de ridirezionamende senza storie.
-Quieste significhe ca tu puè fà turnà 'u vecchie nome 'a pàgene ce jedde ha state renomenete e t'è rese conde ca è fatte 'na studecarije sovrascrevènne 'na pàgene esistende.
+Vide Bbuene ca 'a pàgene '''non''' g'avene spustate ce esiste n'otra pàgene cu 'u titole nuéve, a mene ca jè vacande o jè 'na pàgene de ridirezionamende senza storie.
+Quieste significhe ca tu puè fà turnà 'u vecchie nome 'a pàgene ce jedde ha state renomenate e t'è rese conde ca è fatte 'na studecarije sovrascrevènne 'na pàgene esistende.
 
 '''ATTENZIONE!'''
-Quiste pò essere 'nu cangiamende drastiche e inaspettete de 'na pàgene famose assaje;
-pe piacere a essere secure-secure de le conseguenze prime de procedere.",
+Quiste pò essere 'nu cangiamende drastiche e inaspettate de 'na pàgene famose assaje;
+pe piacere a essere secure-secure de le conseguenze apprime de condinuà.",
 'movepagetext-noredirectfixer' => "Ausanne 'u module aqquà sotte puè renomenà 'na pàgene, spustanne tutte 'a storia soje sotte a 'u nome nuève.
 'U titele vecchie addevende 'na pàgene de ridirezionamende a 'u titele nuève.
 Me raccomande condrolle le redirezionaminde [[Special:DoubleRedirects|a doppie]] o [[Special:BrokenRedirects|scuasciate]].
@@ -4067,6 +4067,7 @@ Ce nò, tu puè ausà 'u module facile aqquà sotte. 'U commende tune avène agg
 'api-error-ok-but-empty' => "Errore inderne: Nisciune resposte da 'u server.",
 'api-error-overwrite' => "'A sovrascritture de 'nu file ca esiste non ge se pò fà.",
 'api-error-stashfailed' => "Errore inderne: 'U server ha fallite 'a reggistrazione de le file temboranèe.",
+'api-error-publishfailed' => "Errore inderne: 'U server ha fallite 'a pubblecazione d'u file temboranèe.",
 'api-error-timeout' => "'U server non g'ave resposte jndr'à 'u tiembe ca 'u spettave.",
 'api-error-unclassified' => "'N'errore scanusciute s'a verificate",
 'api-error-unknown-code' => 'Errore scanusciute: "$1"',
index ae20421..642c35f 100644 (file)
@@ -24,6 +24,7 @@
  * @author Chilin
  * @author Claymore
  * @author Comp1089
+ * @author Cryptocoryne
  * @author DCamer
  * @author Daniyar
  * @author Dim Grits
@@ -433,7 +434,7 @@ $messages = array(
 'tog-externaleditor' => 'Использовать по умолчанию внешний редактор (только для специалистов, необходима особая настройка компьютера; [//www.mediawiki.org/wiki/Manual:External_editors подробнее])',
 'tog-externaldiff' => 'Использовать по умолчанию внешнюю программу сравнения (только для специалистов, необходима особая настройка компьютера; [//www.mediawiki.org/wiki/Manual:External_editors подробнее])',
 'tog-showjumplinks' => 'Включить вспомогательные ссылки «перейти к»',
-'tog-uselivepreview' => 'Использовать быстрый предварительный просмотр (требуется JavaScript)',
+'tog-uselivepreview' => 'Использовать быстрый предварительный просмотр (JavaScript, экспериментально)',
 'tog-forceeditsummary' => 'Предупреждать, когда не заполнено поле описания правки',
 'tog-watchlisthideown' => 'Скрывать мои правки из списка наблюдения',
 'tog-watchlisthidebots' => 'Скрывать правки ботов из списка наблюдения',
@@ -1147,7 +1148,7 @@ $2
 '''НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!'''",
 'longpageerror' => "'''ОШИБКА: записываемый вами текст имеет размер {{PLURAL:$1|$1 килобайт|$1 килобайта|$1 килобайт}}, что больше, чем установленный предел в {{PLURAL:$2|$2 килобайт|$2 килобайта|$2 килобайт}}. Страница не может быть сохранена.'''",
 'readonlywarning' => "'''Предупреждение. База данных заблокирована в связи с процедурами обслуживания, поэтому вы не можете записать ваши изменения прямо сейчас.'''
\92озможно, Ð²Ð°Ð¼ Ñ\81ледÑ\83еÑ\82 Ñ\81оÑ\85Ñ\80аниÑ\82Ñ\8c Ñ\82екÑ\81Ñ\82 Ð² Ñ\84айл, Ñ\87Ñ\82обÑ\8b Ð²Ð¾Ñ\81полÑ\8cзоваÑ\82Ñ\8cÑ\81Ñ\8f Ñ\8dÑ\82им Ñ\82екÑ\81Ñ\82ом Ð¿Ð¾Ð·Ð¶е.
\92озможно, Ð²Ð°Ð¼ Ñ\81ледÑ\83еÑ\82 Ñ\81копиÑ\80оваÑ\82Ñ\8c Ñ\8dÑ\82оÑ\82 Ñ\82екÑ\81Ñ\82 Ð² Ñ\82екÑ\81Ñ\82овÑ\8bй Ñ\84айл, Ñ\87Ñ\82обÑ\8b Ñ\81оÑ\85Ñ\80аниÑ\82Ñ\8c ÐµÐ³Ð¾ Ð½Ð° Ð±Ñ\83дÑ\83Ñ\89ее.
 
 Администратор, заблокировавший базу данных, оставил следующее объяснение: $1",
 'protectedpagewarning' => "'''Предупреждение. Эта страница защищена от изменений, её могут редактировать только участники с полномочиями администраторов.'''
@@ -1660,7 +1661,7 @@ $1",
 'right-move-subpages' => 'переименование страниц с их подстраницами',
 'right-move-rootuserpages' => 'переименование корневых страниц участников',
 'right-movefile' => 'переименование файлов',
-'right-suppressredirect' => 'не создаётся перенаправление со старого имени при переименовании страницы',
+'right-suppressredirect' => 'не создавать перенаправление со старого имени при переименовании страницы',
 'right-upload' => 'загрузка файлов',
 'right-reupload' => 'запись файлов поверх существующих',
 'right-reupload-own' => 'перезапись файлов тем же участником',
@@ -1687,14 +1688,14 @@ $1",
 'right-hideuser' => 'запрет имени участника и его сокрытие',
 'right-ipblock-exempt' => 'обход блокировок по IP, автоблокировок и блокировок диапазонов',
 'right-proxyunbannable' => 'обход автоматической блокировки прокси',
-'right-unblockself' => 'Ñ\80азблокиÑ\80ование Ñ\81ебÑ\8f Ñ\81амого',
+'right-unblockself' => 'Ñ\80азблокиÑ\80овка Ñ\81амого Ñ\81ебÑ\8f',
 'right-protect' => 'изменение уровня защиты страниц и правка защищённых страниц',
 'right-editprotected' => 'правка защищённых страниц (без каскадной защиты)',
 'right-editinterface' => 'изменение пользовательского интерфейса',
 'right-editusercssjs' => 'правка CSS- и JS-файлов других участников',
 'right-editusercss' => 'правка CSS-файлов других участников',
 'right-edituserjs' => 'правка JavaScript-файлов других участников',
-'right-rollback' => 'бÑ\8bÑ\81Ñ\82Ñ\80Ñ\8bй Ð¾Ñ\82каÑ\82 Ð¿Ñ\80авок Ð¿Ð¾Ñ\81леднего Ñ\83Ñ\87аÑ\81Ñ\82ника Ð½Ð° Ð½ÐµÐºÐ¾Ñ\82оÑ\80ой странице',
+'right-rollback' => 'бÑ\8bÑ\81Ñ\82Ñ\80Ñ\8bй Ð¾Ñ\82каÑ\82 Ð¿Ñ\80авок Ð¿Ð¾Ñ\81леднего Ñ\83Ñ\87аÑ\81Ñ\82ника Ð½Ð° Ð¾Ð¿Ñ\80еделенной странице',
 'right-markbotedits' => 'отметка откатываемых правок как правок бота',
 'right-noratelimit' => 'нет ограничений по скорости',
 'right-import' => 'импорт страниц из других вики',
@@ -1704,7 +1705,7 @@ $1",
 'right-patrolmarks' => 'просмотр отметок о патрулировании в свежих правках',
 'right-unwatchedpages' => 'просмотр списка ненаблюдаемых страниц',
 'right-mergehistory' => 'объединение историй страниц',
-'right-userrights' => 'изменение Ð¿Ñ\80ав Ð²Ñ\81еÑ\85 участников',
+'right-userrights' => 'изменение Ð²Ñ\81еÑ\85 Ð¿Ñ\80ав участников',
 'right-userrights-interwiki' => 'изменение прав участников на других вики-сайтах',
 'right-siteadmin' => 'блокировка и разблокировка базы данных',
 'right-override-export-depth' => 'экспортирование страниц, включая связанные страницы с глубиной до 5',
@@ -2588,9 +2589,9 @@ $UNWATCHURL
 'protect-locked-access' => "У вашей учётной записи недостаточно прав для изменения уровня защиты страницы. Текущие установки для страницы '''$1''':",
 'protect-cascadeon' => 'Эта страница защищена в связи с тем, что она включена {{PLURAL:$1|в указанную ниже страницу, на которую|в нижеследующие страницы, на которые}} установлена каскадная защита. Вы можете изменить уровень защиты этой страницы, но это не повлияет на каскадную защиту.',
 'protect-default' => 'Без защиты',
-'protect-fallback' => 'ТÑ\80ебÑ\83еÑ\82Ñ\81Ñ\8f Ñ\80азÑ\80еÑ\88ение «$1»',
-'protect-level-autoconfirmed' => 'Ð\97аÑ\89иÑ\82иÑ\82Ñ\8c Ð¾Ñ\82 Ð½Ð¾Ð²Ñ\8bÑ\85 Ð¸ Ð½ÐµÐ·Ð°Ñ\80егиÑ\81Ñ\82Ñ\80иÑ\80ованнÑ\8bÑ\85 Ñ\83Ñ\87аÑ\81Ñ\82ников',
-'protect-level-sysop' => 'ТолÑ\8cко Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\8b',
+'protect-fallback' => 'РазÑ\80еÑ\88ено Ñ\82олÑ\8cко Ñ\83Ñ\87аÑ\81Ñ\82никам Ñ\81 Ð¿Ñ\80авами «$1»',
+'protect-level-autoconfirmed' => 'РазÑ\80еÑ\88ено Ñ\82олÑ\8cко Ð°Ð²Ñ\82оподÑ\82веÑ\80ждÑ\91ннÑ\8bм Ñ\83Ñ\87аÑ\81Ñ\82никам',
+'protect-level-sysop' => 'РазÑ\80еÑ\88ено Ñ\82олÑ\8cко Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80ам',
 'protect-summary-cascade' => 'каскадная',
 'protect-expiring' => 'истекает $1 (UTC)',
 'protect-expiring-local' => 'истекает $1',
@@ -2883,17 +2884,17 @@ $1',
 # Move page
 'move-page' => '$1 — переименование',
 'move-page-legend' => 'Переименование страницы',
-'movepagetext' => "Воспользовавшись формой ниже, вы переименуете страницу, одновременно переместив на новое место её журнал изменений.
-Старое название станет перенаправлением на новое название.
+'movepagetext' => "Воспользовавшись нижеприведённой формой, вы переименуете страницу, одновременно переместив на новое место её журнал изменений.
+Старое название станет перенаправлением на новое.
 Вы можете автоматически обновить перенаправления, которые вели на старое название.
 Если вы этого не сделаете, пожалуйста, проверьте наличие [[Special:DoubleRedirects|двойных]] и [[Special:BrokenRedirects|разорванных перенаправлений]].
-Вы отвечаете за то, что бы ссылки продолжали и далее указывают туда, куда предполагалось.
+Вы отвечаете за то, чтобы ссылки продолжали и далее указывать туда, куда предполагалось.
 
\9eбÑ\80аÑ\82иÑ\82е Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ, Ñ\87Ñ\82о Ñ\81Ñ\82Ñ\80аниÑ\86а '''не Ð±Ñ\83деÑ\82''' Ð¿ÐµÑ\80еименована, ÐµÑ\81ли Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\81 Ð½Ð¾Ð²Ñ\8bм Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼ Ñ\83же Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82, ÐºÑ\80оме Ñ\81лÑ\83Ñ\87аев, ÐµÑ\81ли Ð¾Ð½Ð° Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð¿ÐµÑ\80енапÑ\80авлением Ð¸Ð»Ð¸ Ð¿Ñ\83Ñ\81Ñ\82а Ð¸ не имеет истории правок.
-Это означает, что вы можете переименовать страницу обратно в то название, которое у него только что было, если вы переименовали по ошибке, но вы не можете случайно затереть существующую страницу.
\9eбÑ\80аÑ\82иÑ\82е Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ, Ñ\87Ñ\82о Ñ\81Ñ\82Ñ\80аниÑ\86а '''не Ð±Ñ\83деÑ\82''' Ð¿ÐµÑ\80еименована, ÐµÑ\81ли Ñ\83же Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82 Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\81 Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼, Ð¸Ð´ÐµÐ½Ñ\82иÑ\87нÑ\8bм Ð²Ñ\8bбÑ\80анномÑ\83, ÐºÑ\80оме Ñ\81лÑ\83Ñ\87аев, ÐºÐ¾Ð³Ð´Ð° Ñ\82акаÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð¿ÐµÑ\80енапÑ\80авлением Ð¸Ð»Ð¸ Ð¿Ñ\83Ñ\81Ñ\82а, Ð¸ Ð¿Ñ\80и Ñ\8dÑ\82ом не имеет истории правок.
+Это означает, что вы можете переименовать страницу обратно в то название, которое у него только что было, если вы сделали преименование ошибочно, но вы не можете случайно затереть существующую страницу.
 
-'''ПРЕДУПРЕЖДЕНИЕ!'''
-Переименование может привести к масштабным и неожиданным изменениям для ''популярных'' страниц.
+'''Предупреждение!'''
+Переименование ''популярных'' страниц может привести к масштабным и неожиданным изменениям.
 Пожалуйста, прежде чем вы продолжите, убедитесь, что вы понимаете все возможные последствия.",
 'movepagetext-noredirectfixer' => "Воспользовавшись формой ниже, вы переименуете страницу, одновременно переместив на новое место её журнал изменений.
 Старое название станет перенаправлением на новое название.
@@ -4258,6 +4259,7 @@ MediaWiki распространяется в надежде, что она бу
 'api-error-ok-but-empty' => 'Внутренняя ошибка: нет ответа от сервера.',
 'api-error-overwrite' => 'Не допускается замена существующего файла.',
 'api-error-stashfailed' => 'Внутренняя ошибка: сервер не смог сохранить временный файл.',
+'api-error-publishfailed' => 'Внутренняя ошибка: сервер не смог сохранить временный файл.',
 'api-error-timeout' => 'Сервер не отвечает в течение ожидаемого времени.',
 'api-error-unclassified' => 'Произошла неизвестная ошибка',
 'api-error-unknown-code' => 'Неизвестная ошибка: «$1»',
index 7b37ec7..880e9b5 100644 (file)
@@ -713,6 +713,9 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننڍي هوڻ گھرجي.',
 'watching' => 'ٽيٽيندي...',
 'unwatching' => 'اڻ ٽيٽيندي...',
 
+'created' => 'ٺهي چڪو',
+'changed' => 'تبديل ٿي ويو',
+
 # Delete
 'deletepage' => 'صفحو ڊاهيو',
 'confirm' => 'پڪ ڪريو',
index e485747..31bd8ea 100644 (file)
@@ -708,8 +708,6 @@ $1 {{int:pipe-separator}} $2',
 # User rights log
 'rightslog' => 'Logga geavaheaddjirievttiin',
 'rightslogtext' => 'Vuolábealde lea logga geavaheaddjirivttiid rievdadusain.',
-'rightslogentry' => 'Geavaheaddji $1 rievttit rievdaduvvoi joavkkuin $2 joavkkuide $3',
-'rightsnone' => '(eai rievttit)',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|rievdadus|rievdadusa}}',
@@ -1044,6 +1042,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'enotif_lastvisited' => 'Čujuhusas $1 leat buot rievdadusat du maŋimus geavahangearddi maŋŋá.',
 'enotif_lastdiff' => 'Rievdadus lea čujuhusas $1.',
 'enotif_anon_editor' => 'registereretkeahtes geavaheaddji $1',
+'created' => 'álggahan siiddu',
+'changed' => 'rievdadan siiddu',
 
 # Delete
 'deletepage' => 'Sihko siiddu',
@@ -1465,6 +1465,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'logentry-move-move_redir-noredirect' => '$1 sirddii siiddu $3 nammii $4 iige ráhkadan ođđasitstivrema',
 'logentry-newusers-create' => '$1 ráhkadii dovddaldaga',
 'logentry-newusers-autocreate' => 'Dovddaldat $1 ráhkaduvvui automáhtalaččat',
+'rightsnone' => '(eai rievttit)',
 
 # Search suggestions
 'searchsuggest-search' => 'Oza',
index bdc6d74..a7909c3 100644 (file)
@@ -2334,9 +2334,9 @@ $2 ගේ අවසන් අනුවාදය වෙතට යළි වෙන
 'protect-cascadeon' => 'තීරු දර්ශන ආරක්ෂණය (cascading protection) බල ගන්වා ඇති පහත  {{PLURAL:$1|පිටුව|පිටු}} අන්තර්ගත වීම හේතුවෙන් මෙම පිටුව දැනට ආරක්ෂණයට ලක්ව ඇත.
 පිටුවෙහි ආරක්ෂණ මට්ටම ඔබ විසින් වෙනස් කල හැකි නමුදු, එම ක්‍රියාව තීරු දර්ශන ආරක්ෂණය කෙරෙහි බලපෑම් ඇති නොකරනු ඇත.',
 'protect-default' => 'සියළු පරිශිලකයන්ට ඉඩ සලසන්න',
-'protect-fallback' => '"$1" à¶\85à·\80à·\83රය à\85à·\80à·\81à·\8aâ\80\8dය à·\80à·\9a',
-'protect-level-autoconfirmed' => 'නà·\80 à·\83à·\84 à¶½à·\92යà·\8fපදà·\92à¶\82චà·\92 à·\80à·\93 à¶±à·\9cමà·\90තà·\92 à¶´à¶»à·\92à·\81à·\93ලà¶\9aයනà·\8a à·\80à·\8fරණය à¶\9aරන්න',
-'protect-level-sysop' => 'පරà·\92පà·\8fලà¶\9aà·\80රà·\94නà·\8aට à¶´à¶¸à¶«à¶ºà·\92',
+'protect-fallback' => '"$1" à¶\85à·\80à·\83රය à·\83à·\84à·\92ත à¶´à¶»à·\92à·\81à·\93ලà¶\9aයනà·\8aට à¶´à¶¸à¶«à¶\9aà·\8a à¶\89ඩදà·\99නà·\8aන',
+'protect-level-autoconfirmed' => 'à·\83à·\8aà·\80යà¶\82තà·\84à·\80à·\94රà·\94 à¶\9aල à¶´à¶»à·\92à·\81à·\93ලà¶\9aයනà·\8aට à¶´à¶¸à¶«à¶\9aà·\8a à¶\89ඩදà·\99න්න',
+'protect-level-sysop' => 'පරà·\92පà·\8fලà¶\9aà·\80රà·\94නà·\8aට à¶´à¶¸à¶«à¶\9aà·\8a à¶\89ඩදà·\99නà·\8aන',
 'protect-summary-cascade' => 'තීරු දර්ශනය (cascading)',
 'protect-expiring' => 'ඉකුත් වේ  $1 (යූටීසි)',
 'protect-expiring-local' => 'කල් ඉකුත්වීම $1',
index ee01bd6..7486c60 100644 (file)
@@ -218,7 +218,7 @@ $messages = array(
 'tog-externaleditor' => 'Po privzetem uporabljaj zunanji urejevalnik (samo za strokovnjake; potrebuje posebne nastavitve na vašem računalniku; [//www.mediawiki.org/wiki/Manual:External_editors več informacij])',
 'tog-externaldiff' => 'Po privzetem uporabljaj zunanje primerjanje (samo za strokovnjake; potrebuje posebne nastavitve na vašem računalniku; [//www.mediawiki.org/wiki/Manual:External_editors več informacij])',
 'tog-showjumplinks' => 'Prikaži pomožni povezavi »Skoči na«',
-'tog-uselivepreview' => 'Uporabi hitri predogled (zahteva JavaScript)',
+'tog-uselivepreview' => 'Uporabi hitri predogled (zahteva JavaScript) (preizkusno)',
 'tog-forceeditsummary' => 'Ob vpisu praznega povzetka urejanja me opozori',
 'tog-watchlisthideown' => 'Na spisku nadzorov skrij moja urejanja',
 'tog-watchlisthidebots' => 'Na spisku nadzorov skrij urejanja botov',
@@ -2393,9 +2393,9 @@ Trenutne nastavitve za stran '''$1''' so:",
 'protect-cascadeon' => 'Ta stran je trenutno uaščitena, ker je vključena v {{PLURAL:$1|naslednjo stran, ki ima|naslednji strani, ki imata|naslednje strani, ki imajo|naslednjih strani, ki imajo}} vključeno kaskadno zaščito.
 Stopnjo zaščite te strani lahko spremenite, vendar to ne bo vplivalo na kaskadno zaščito.',
 'protect-default' => 'Dovoli vsem uporabnikom',
-'protect-fallback' => 'Potrebujete pravice »$1«',
-'protect-level-autoconfirmed' => 'Blokiraj nove in neregistrirane uporabnike',
-'protect-level-sysop' => 'Samo administratorji',
+'protect-fallback' => 'Dovoli samo uporabnikom s pravico »$1«',
+'protect-level-autoconfirmed' => 'Dovoli samo samodejno potrjenim uporabnikom',
+'protect-level-sysop' => 'Dovoli samo administratorjem',
 'protect-summary-cascade' => 'kaskadno',
 'protect-expiring' => 'poteče $1 (UTC)',
 'protect-expiring-local' => 'poteče $1',
@@ -2702,7 +2702,7 @@ Samodejno lahko posodobite preusmeritve, ki kažejo na dosedanji naslov.
 Če se za to ne odločite, ne pozabite preveriti vseh [[Special:DoubleRedirects|dvojnih]] ali [[Special:BrokenRedirects|pretrganih preusmeritev]].
 Odgovorni ste, da bodo povezave še naprej kazale na prava mesta.
 
-Kjer stran z izbranim novim imenom že obstaja, dejanje '''ne''' bo izvedeno, razen če je sedanja stran prazna ali preusmeritvena in brez zgodovine urejanj.
+Kjer stran z izbranim novim imenom že obstaja, dejanje '''ne''' bo izvedeno, razen če je sedanja stran preusmeritev in brez zgodovine urejanj.
 To pomeni, da lahko, če se zmotite, strani vrnete prvotno ime, ne morete pa prepisati že obstoječe strani.
 
 '''Opozorilo!'''
@@ -3956,6 +3956,7 @@ V nasprotnem primeru lahko uporabite preprost obrazec spodaj. Vašo pripombo bom
 'api-error-ok-but-empty' => 'Notranja napaka: strežnik se ne odziva.',
 'api-error-overwrite' => 'Prepisovanje obstoječe datoteke ni dovoljeno.',
 'api-error-stashfailed' => 'Notranja napaka: strežnik ni uspel shraniti začasne datoteke.',
+'api-error-publishfailed' => 'Notranja napaka: strežnik ni uspel objaviti začasne datoteke.',
 'api-error-timeout' => 'Strežnik se ni odzval v pričakovanem času.',
 'api-error-unclassified' => 'Prišlo je do neznane napake',
 'api-error-unknown-code' => 'Neznana napaka: »$1«',
index c5c7d6d..d69ce96 100644 (file)
@@ -1107,6 +1107,8 @@ Hadii aad rabootid in aad boggan ka saartid wardiyeynta, dhagsii \"Ha' wardiyeyn
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Daawasho...',
 
+'enotif_subject_created' => '{{SITENAME}} Bogga $1 Qof ayaa sameeyey {{gender:$2|$2}}',
+'enotif_body_intro_created' => 'Bogga {{SITENAME}} ga $1 waxaa la sameeyey $PAGEEDITDATE qof {{gender:$2|$2}}, eeg $3 sida laga dhigay hadda.',
 'enotif_body_intro_changed' => 'Bogga {{SITENAME}} ga $1 waxaa la badelay $PAGEEDITDATE qof {{gender:$2|$2}}, eeg $3 sida laga dhigay hadda.',
 'enotif_lastvisited' => 'Eeg $1 Dhamaan isbedeleda ilaa goortii kuugu dambaysay.',
 'enotif_lastdiff' => 'Eeg $1 si aad u aragto bedelkaan.',
@@ -1461,6 +1463,9 @@ waxaad awoodaa [[Special:EditWatchlist/raw|Liiska wax ka bedel]].',
 # Special:BlankPage
 'blankpage' => 'Bog masaxan',
 
+# Special:Tags
+'tag-filter' => '[[Special:Tags|Filtaraha]] tag:',
+
 # Database error messages
 'dberr-usegoogle' => 'Waxaa baroobeen kartaa in aad ka raadiso google',
 
index ffe3701..1b89b61 100644 (file)
@@ -353,7 +353,7 @@ $messages = array(
 'tog-externaldiff' => 'Använd externt diff-verktyg som förval (endast för avancerade användare, kräver speciella inställningar i din dator.
 [//www.mediawiki.org/wiki/Manual:External_editors Mer information.])',
 'tog-showjumplinks' => 'Aktivera "hoppa till"-tillgänglighetslänkar',
-'tog-uselivepreview' => 'Använd direktuppdaterad förhandsgranskning (kräver JavaScript)',
+'tog-uselivepreview' => 'Använd direktuppdaterad förhandsgranskning (Javascript, på försöksstadiet)',
 'tog-forceeditsummary' => 'Påminn mig om jag inte fyller i en redigeringskommentar',
 'tog-watchlisthideown' => 'Visa inte mina redigeringar i bevakningslistan',
 'tog-watchlisthidebots' => 'Visa inte robotredigeringar i bevakningslistan',
@@ -454,6 +454,7 @@ $messages = array(
 'newwindow' => '(öppnas i ett nytt fönster)',
 'cancel' => 'Avbryt',
 'moredotdotdot' => 'Mer...',
+'morenotlisted' => 'Mer som inte är listad...',
 'mypage' => 'Min sida',
 'mytalk' => 'Diskussion',
 'anontalk' => 'Diskussionssida för denna IP-adress',
@@ -2470,6 +2471,7 @@ Se [[Special:ProtectedPages|listan över skyddade sidor]] för listan över akti
 'protect-badnamespace-title' => 'Namnrymd som inte kan skrivskyddas',
 'protect-badnamespace-text' => 'Sidor i den här namnrymden kan inte skrivskyddas.',
 'protect-norestrictiontypes-text' => 'Denna sida kan inte skyddas eftersom det inte finns några begränsningstyper tillgängliga.',
+'protect-norestrictiontypes-title' => 'Oskyddbar sida',
 'protect-legend' => 'Bekräfta skrivskydd av sida',
 'protectcomment' => 'Anledning:',
 'protectexpiry' => 'Varaktighet:',
@@ -2486,7 +2488,7 @@ Nuvarande skrivskyddsinställning för sidan '''$1''' är:",
 'protect-cascadeon' => 'Den här sidan är skrivskyddad eftersom den inkluderas på följande {{PLURAL:$1|sida|sidor}} som har ett kaskaderande skydd.
 Du kan ändra skyddet av den här sidan, men det påverkar inte det kaskaderande skyddet.',
 'protect-default' => 'Tillåt alla användare',
-'protect-fallback' => 'Kräver "$1"-behörighet',
+'protect-fallback' => 'Kräv "$1"-behörighet',
 'protect-level-autoconfirmed' => 'Blockera nya och oregistrerade användare',
 'protect-level-sysop' => 'Enbart administratörer',
 'protect-summary-cascade' => 'kaskaderande',
@@ -2787,7 +2789,7 @@ Du kan välja att automatiskt uppdatera omdirigeringar som leder till den gamla
 Om du väljer att inte göra det, kontrollera då att du inte skapar några [[Special:DoubleRedirects|dubbla]] eller [[Special:BrokenRedirects|trasiga omdirigeringar]].
 Du bör också se till att länkar fortsätter att peka dit de ska.
 
-Notera att sidan '''inte''' kan flyttas om det redan finns en sida under den nya sidtiteln, såvida inte den sidan är tom eller en omdirigering till den gamla titeln och saknar annan versionshistorik.
+Notera att sidan '''inte''' kan flyttas om det redan finns en sida under den nya sidtiteln, såvida inte den sidan är en omdirigering till den gamla titeln och saknar annan versionshistorik.
 Det innebär att du kan flytta tillbaks en sida om du råkar göra fel, och att du inte kan skriva över existerande sidor.
 
 '''VARNING!'''
@@ -3154,6 +3156,7 @@ Detta orsakades troligen av en länk till en svartlistad webbplats.',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magiskt|Magiska}} ord ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Dold kategori|Dolda kategorier}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Inkluderad mall|Inkluderade mallar}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Sida|Sidor}} mallinkluderas på ($1)',
 'pageinfo-toolboxlink' => 'Sidinformation',
 'pageinfo-redirectsto' => 'Omdirigerar till',
 'pageinfo-redirectsto-info' => 'info',
@@ -4071,6 +4074,7 @@ Annars kan du använda det enkla formuläret nedan. Din kommentar kommer att lä
 'api-error-ok-but-empty' => 'Internt fel: Inget svar från servern.',
 'api-error-overwrite' => 'Det är inte tillåtet att skriva över en befintlig fil.',
 'api-error-stashfailed' => 'Internt fel: servern kunde inte lagra temporär fil.',
+'api-error-publishfailed' => 'Internt fel: Servern kunde inte publicera temporär fil.',
 'api-error-timeout' => 'Servern svarade inte inom förväntad tid.',
 'api-error-unclassified' => 'Ett okänt fel uppstod',
 'api-error-unknown-code' => 'Okänt fel: "$1"',
index 8eeee27..b614b9f 100644 (file)
@@ -481,11 +481,13 @@ Ita-nia mudansa la armazenadu seidauk!",
 'right-userrights' => "Edita priviléjiu uza-na'in hotu",
 'right-userrights-interwiki' => "Edita priviléjiu uza-na'in iha wiki seluk sira",
 
+# Special:Log/newusers
+'newuserlogpage' => "Lista kria uza-na'in",
+'newuserlogpagetext' => "Ne'e lista kria uza-na'in.",
+
 # User rights log
 'rightslog' => "Lista mudansa priviléjiu uza-na'in",
 'rightslogtext' => "Ne'e lista mudansa priviléjiu uza-na'in sira nian.",
-'rightslogentry' => 'muda grupu "$1" nian husi "$2" ba "$3"',
-'rightsnone' => '(mamuk)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => "lee pájina ne'e",
@@ -627,10 +629,6 @@ Ita-nia mudansa la armazenadu seidauk!",
 'activeusers-hidebots' => 'Subar bot sira',
 'activeusers-hidesysops' => 'Subar administradór sira',
 
-# Special:Log/newusers
-'newuserlogpage' => "Lista kria uza-na'in",
-'newuserlogpagetext' => "Ne'e lista kria uza-na'in.",
-
 # Special:ListGroupRights
 'listgrouprights-group' => 'Grupu',
 'listgrouprights-rights' => 'Priviléjiu',
@@ -658,6 +656,8 @@ Ita-nia mudansa la armazenadu seidauk!",
 'unwatching' => 'La hateke...',
 
 'enotif_impersonal_salutation' => "Uza-na'in {{SITENAME}} nian",
+'created' => 'kria ona',
+'changed' => 'muda ona',
 
 # Delete
 'deletepage' => 'Halakon pájina',
@@ -975,4 +975,7 @@ Ligasaun seluk iha liña - ne'e pájina sira iha ne'ebé bele inklui imajen aat.
 # Database error messages
 'dberr-header' => "Wiki ne'e iha problema",
 
+# New logging system
+'rightsnone' => '(mamuk)',
+
 );
index c247482..d79544b 100644 (file)
@@ -229,7 +229,7 @@ $messages = array(
 'tog-externaleditor' => 'ใช้โปรแกรมแก้ไขภายนอกโดยปริยาย (สำหรับผู้เชี่ยวชาญเท่านั้น ต้องการการตั้งค่าพิเศษบนคอมพิวเตอร์ของคุณ [//www.mediawiki.org/wiki/Manual:External_editors ข้อมูลเพิ่มเติม])',
 'tog-externaldiff' => 'ใช้โปรแกรมเปรียบเทียบภายนอกโดยปริยาย (สำหรับผู้เชี่ยวชาญเท่านั้น ต้องการการตั้งค่าพิเศษบนคอมพิวเตอร์ของคุณ [//www.mediawiki.org/wiki/Manual:External_editors ข้อมูลเพิ่มเติม])',
 'tog-showjumplinks' => 'เปิดใช้งาน "กระโดด" อัตโนมัติไปตามลิงก์',
-'tog-uselivepreview' => 'à¹\81สà¸\94à¸\87à¸\95ัวอยà¹\88าà¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\97ัà¸\99à¸\97ี (à¸\88าวาสà¸\84ริà¸\9bà¸\95à¹\8c)',
+'tog-uselivepreview' => 'à¹\81สà¸\94à¸\87à¸\95ัวอยà¹\88าà¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\81à¸\9aà¸\9aà¸\97ัà¸\99à¸\97ี (à¸\88าวาสà¸\84ริà¸\9bà¸\95à¹\8c) (à¸\97à¸\94ลอà¸\87)',
 'tog-forceeditsummary' => 'เตือนเมื่อช่องคำอธิบายอย่างย่อว่าง',
 'tog-watchlisthideown' => 'ซ่อนการแก้ไขของฉันจากรายการเฝ้าดู',
 'tog-watchlisthidebots' => 'ซ่อนการแก้ไขของบอตจากรายการเฝ้าดู',
@@ -461,8 +461,8 @@ $1',
 'youhavenewmessages' => 'คุณมี$1 ($2)',
 'newmessageslink' => 'ข้อความใหม่',
 'newmessagesdifflink' => 'การเปลี่ยนแปลงล่าสุด',
-'youhavenewmessagesfromusers' => 'คุณมี$1จาก{{PLURAL:$3|ผู้ใช้คนอื่น|ผู้ใช้ $3 คน}} ($2)',
-'youhavenewmessagesmanyusers' => 'คุณมี$1จากผู้ใช้หลายคน ($2)',
+'youhavenewmessagesfromusers' => 'คุณมี $1จาก{{PLURAL:$3|ผู้ใช้คนอื่น|ผู้ใช้ $3 คน}} ($2)',
+'youhavenewmessagesmanyusers' => 'คุณมี $1จากผู้ใช้หลายคน ($2)',
 'newmessageslinkplural' => '$1 ข้อความใหม่',
 'newmessagesdifflinkplural' => '$1 การเปลี่ยนแปลงล่าสุด',
 'youhavenewmessagesmulti' => 'คุณมีข้อความใหม่ที่ $1',
index d3597db..fd69b3e 100644 (file)
@@ -369,7 +369,7 @@ $messages = array(
 'viewcount' => 'Namataan na pahinang ito nang {{PLURAL:$1|isang|$1}} beses.',
 'protectedpage' => 'Pahinang nakasanggalang',
 'jumpto' => 'Tumalon sa:',
-'jumptonavigation' => 'paglilibot (nabigasyon)',
+'jumptonavigation' => 'paglilibot',
 'jumptosearch' => 'paghahanap',
 'view-pool-error' => 'Paumanhin, ngunit masyado pong abala ang mga serbidor sa sandaling ito.
 Masyadong maraming tagagamit ay sinusubukang tingnan ang pahinang ito.
@@ -440,9 +440,9 @@ Tingnan ang [[Special:Version|pahina ng bersiyon]].',
 'feed-invalid' => 'Hindi tanggap na uri ng serbisyo ng pagpaparating.',
 'feed-unavailable' => 'Walang serbisyo mula sa sindikasyong pangpaglalathala',
 'site-rss-feed' => 'Kargang RSS ng $1',
-'site-atom-feed' => 'Kargang Atom ng $1',
+'site-atom-feed' => 'Sindikasyong Atom ng $1',
 'page-rss-feed' => 'Kargang RSS ng "$1"',
-'page-atom-feed' => 'Kargang Atom ng "$1"',
+'page-atom-feed' => 'Sindikasyong Atom ng "$1"',
 'feed-atom' => 'Atom',
 'feed-rss' => 'RSS',
 'red-link-title' => '$1 (hindi umiiral ang pahina)',
@@ -567,6 +567,9 @@ Ang tagapangasiwang nagkandado nito ay nag-alok ng ganitong paliwanag: "$3".',
 
 Maaari kang tumuloy sa paggamit ng {{SITENAME}} nang hindi nakikilala (anonimo), o maaaring kang <span class='plainlinks'>[$1 lumagda/tumala muli]</span> bilang kapareho o ibang tagagamit.
 Tandaan na may ilang pahinang maaaring magpatuloy na nagpapakitang parang nakalagda ka pa rin, hanggang sa linisin mo ang iyong baunang pambasa-basa (''browser cache'').",
+'welcomeuser' => 'Mabuhay, $1!',
+'welcomecreation-msg' => 'Nilikha na ang iyong kuwenta.
+Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SITENAME}}]].',
 'yourname' => 'Bansag:',
 'yourpassword' => 'Hudyat:',
 'yourpasswordagain' => 'Hudyat mo uli:',
@@ -948,6 +951,10 @@ Tila binura na ito.',
 Umiiral na ito.',
 'defaultmessagetext' => 'Nakatakdang teksto ng mensahe',
 
+# Content models
+'content-model-wikitext' => 'wikiteksto',
+'content-model-text' => 'purong teksto',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Babala: Naglalaman ang pahinang ito ng napakaraming mamahaling mga tawag na pantungkulin.
 
@@ -1309,7 +1316,7 @@ Hindi ito maibabalik sa dating gawi.',
 'prefs-emailconfirm-label' => 'Kumpirmasyon ng e-liham:',
 'prefs-textboxsize' => 'Sukat ng bintana ng pagbabago',
 'youremail' => 'E-liham:',
-'username' => 'Bansag:',
+'username' => '{{GENDER:$1|Bansag}}:',
 'uid' => 'ID ng tagagamit:',
 'prefs-memberingroups' => 'Kasapi ng {{PLURAL:$1|na pangkat|na mga pangkat}}:',
 'prefs-memberingroups-type' => '$1',
@@ -1711,6 +1718,7 @@ Kapag nagpatuloy ang suliranin, makipagugnayan sa isang [[Special:ListUsers/syso
 'backend-fail-notsame' => 'Isang hindi kamukhang talaksan ang umiiral na sa $1.',
 'backend-fail-invalidpath' => 'Ang $1 ay hindi isang katanggap-tanggap na landas ng imbakan.',
 'backend-fail-delete' => 'Hindi mabura ang talaksang $1.',
+'backend-fail-describe' => 'Hindi mapalitan ang metadatos para sa talaksang "$1".',
 'backend-fail-alreadyexists' => 'Umiiral na ang pahinang $1.',
 'backend-fail-store' => 'Hindi maimbak ang talaksang $1 sa $2.',
 'backend-fail-copy' => 'Hindi makopya ang talaksang $1 sa $2.',
@@ -2180,7 +2188,7 @@ Ang ipinasok mong direksiyong e-liham sa [[Special:Preferences|iyong mga kagustu
 
 # Watchlist
 'watchlist' => 'Mga binabantayan ko',
-'mywatchlist' => 'Bantayan ko',
+'mywatchlist' => 'Bantayan',
 'watchlistfor2' => 'Para sa $1 $2',
 'nowatchlist' => 'Wala kang pahinang binabantayan.',
 'watchlistanontext' => 'Paki $1 upang makita o mabago ang mga aytem sa iyong binabantayan.',
@@ -2428,7 +2436,7 @@ $1',
 'undelete-revisionrow' => '$1 $2 ($3) $4 . . $5 $6 $7',
 
 # Namespace form on various pages
-'namespace' => 'Espasyo ng pangalan:',
+'namespace' => 'Ngalan-espasyo:',
 'invert' => 'Baligtarin and pinili',
 'tooltip-invert' => 'Tsekan ang kahong ito upang ikubli ang mga pagbabago sa mga pahina sa loob ng napiling mga puwang ng pangalan (at ang kaugnay na puwang ng pangalan kung may tsek)',
 'namespace_association' => 'Kaugnay na mga puwang na pampangalan',
@@ -2561,8 +2569,8 @@ Tingnan ang [[Special:BlockList|talaan ng mga hinadlangan]] upang suriin ang mga
 'blocklist-nousertalk' => 'hindi mo mababago ang iyong pansariling pahina ng usapan',
 'ipblocklist-empty' => 'Walang laman ang talaan ng pagharang/paghadlang.',
 'ipblocklist-no-results' => 'Nakaharang ang hiniling na IP address o bansag.',
-'blocklink' => 'harangin/hadlangan',
-'unblocklink' => 'tanggalin ang pagharang/paghadlang',
+'blocklink' => 'harangin',
+'unblocklink' => 'tanggalin ang pagharang',
 'change-blocklink' => 'baguhin ang pagharang/paghadlang',
 'contribslink' => 'ambag',
 'emaillink' => 'ipadala ang e-liham',
@@ -2858,7 +2866,7 @@ Sagipin mo ito sa iyong kompyuter at papaitaas na ikarga ito rito.',
 'tooltip-pt-logout' => 'Umalis sa pagkakalagda',
 'tooltip-ca-talk' => 'Usapan tungkol sa nilalaman ng pahinang ito',
 'tooltip-ca-edit' => 'Maaaring baguhin ang pahinang ito. Paki gamit ang buton ng paunang tingin bago itala.',
-'tooltip-ca-addsection' => 'Magsimula ng isang bagong seksyon',
+'tooltip-ca-addsection' => 'Magsimula ng isang bagong seksiyon',
 'tooltip-ca-viewsource' => 'Nakaprotekta ang pahinang ito. Makikita mo lamang ang pinagmulan (source) nito.',
 'tooltip-ca-history' => 'Nakaraang bersyon ng pahinang ito.',
 'tooltip-ca-protect' => 'Iprotekta ang pahinang ito',
@@ -2882,12 +2890,12 @@ Sagipin mo ito sa iyong kompyuter at papaitaas na ikarga ito rito.',
 'tooltip-t-whatlinkshere' => 'Tala ng lahat ng pahina ng mga wiking nakakawing dito',
 'tooltip-t-recentchangeslinked' => 'Kamakailang mga pagbabago na nakakawing mula sa pahinang ito',
 'tooltip-feed-rss' => 'Subo/Kargang RSS para sa pahinang ito',
-'tooltip-feed-atom' => 'Subo/kargang Atom para sa pahinang ito',
+'tooltip-feed-atom' => 'Sindikasyong Atom para sa pahinang ito',
 'tooltip-t-contributions' => 'Tunghayan ang tala ng mga ambag ng tagagamit na ito',
 'tooltip-t-emailuser' => 'Magpadala ng isang e-liham sa tagagamit na ito',
 'tooltip-t-upload' => 'Magkarga ng mga talaksan',
 'tooltip-t-specialpages' => 'Tala ng lahat ng mga natatanging pahina',
-'tooltip-t-print' => 'Nalilimbag na bersyon ng pahinang ito',
+'tooltip-t-print' => 'Bersiyong maililimbag ng pahinang ito',
 'tooltip-t-permalink' => 'Palagiang kawing sa bersyong ito ng pahina',
 'tooltip-ca-nstab-main' => 'Tingnan ang pahina ng nilalaman',
 'tooltip-ca-nstab-user' => 'Tingnan ang pahina ng tagagamit',
@@ -3056,7 +3064,7 @@ Maaaring manganib ang iyong sistema kapag ipinagana mo ito.",
 'widthheight' => '$1 × $2',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pahina|mga pahina}}',
 'file-info' => 'sukat ng talaksan: $1, tipo ng MIME: $2',
-'file-info-size' => '$1 × $2 piksel, sukat ng talaksan: $3, tipo ng MIME: $4',
+'file-info-size' => '$1 × $2 piksel, laki ng talaksan: $3, uri ng MIME: $4',
 'file-info-size-pages' => '$1 × $2 mga piksel, sukat ng talaksan: $3, uri ng MIME: $4, $5 {{PLURAL:$5|pahina|mga pahina}}',
 'file-nohires' => 'Walang makuhang mas mataas na resolusyon (kalinawan).',
 'svg-long-desc' => 'Talaksang SVG, nasa mga bilang na $1 × $2 mga piksel, sukat ng talaksan: $3',
@@ -3959,7 +3967,7 @@ Ipinapakita ang mga larawan sa buong kalinawan, tuwirang sinisimulan ang ibang u
 
 # Special:Tags
 'tags' => 'Tanggap na mga tatak ng pagbabago',
-'tag-filter' => '[[Special:Tags|Tatakan]] ang pansala:',
+'tag-filter' => 'Pansala ng [[Special:Tags|tatak]]:',
 'tag-filter-submit' => 'Pansala',
 'tags-title' => 'Mga tatak',
 'tags-intro' => 'Itinatala ng pahinang ito ang mga tatak na maaaring ipantatak ng sopwer sa isang pagbabago, at ang kanilang kahulugan.',
index 3284456..afaeb6c 100644 (file)
@@ -495,10 +495,13 @@ Ko e ʻuhinga loka ko e $1 ia.",
 'group-sysop-member' => 'Pule fakafounga',
 'group-bureaucrat-member' => 'Pulelahi',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Tohinoa ʻo e fakatupu kau ʻetita',
+'newuserlogpagetext' => 'Ko e tohinoa ʻeni ʻo e fakatupu kau ʻetita.',
+
 # User rights log
 'rightslog' => 'Tohinoa ʻo e kau ʻetita honau maʻu mafai',
 'rightslogtext' => 'Ko e tohinoa ʻeni ʻo e ngaah liliu ʻo e kau ʻetita ʻenau maʻu mafai',
-'rightsnone' => '(hala)',
 
 # Recent changes
 'recentchanges' => 'Ngaahi toki liliu',
@@ -727,10 +730,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'listusersfrom' => 'ʻAsi mai kau ʻetita mei he:',
 'listusers-submit' => 'ʻAsi mai',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Tohinoa ʻo e fakatupu kau ʻetita',
-'newuserlogpagetext' => 'Ko e tohinoa ʻeni ʻo e fakatupu kau ʻetita.',
-
 # E-mail user
 'mailnologin' => 'ʻOku ʻikai ha tuʻasila ke tohila ki ai',
 'emailuser' => 'Tohila ki he ʻetitá ni',
@@ -777,6 +776,9 @@ Kapau ʻaho ʻe taha, te ke fietoʻo ʻa e pēsí mei hoʻo hokohoko leʻo, lomi
 'watching' => 'ʻOku leʻo...',
 'unwatching' => 'ʻOku taʻeleʻo...',
 
+'created' => 'kuo fakatupu',
+'changed' => 'ʻosi liliu',
+
 # Delete
 'deletepage' => 'Tāmateʻi peesi',
 'confirm' => 'Fakamoʻoniʻi',
@@ -1227,4 +1229,7 @@ Kātaki fakapapauʻi te ke fie toe fatu ʻa e kupu ni.",
 # Special:SpecialPages
 'specialpages' => 'Ngaahi peesi makehe',
 
+# New logging system
+'rightsnone' => '(hala)',
+
 );
index cb67928..a9b015f 100644 (file)
@@ -380,7 +380,7 @@ $messages = array(
 'tog-externaleditor' => 'Varsayılan olarak harici düzenleyici kullan (deneyimli kullanıcılar içindir ve bilgisayarınızda özel ayarlar gerektirir. [//www.mediawiki.org/wiki/Manual:External_editors Ayrıntılı bilgi için tıklayın.])',
 'tog-externaldiff' => 'Varsayılan olarak harici karşılaştırıcı kullan (deneyimli kullanıcılar içindir ve bilgisayarınızda özel ayarlar gerektirir. [//www.mediawiki.org/wiki/Manual:External_editors Ayrıntılı bilgi için tıklayın.])',
 'tog-showjumplinks' => '"{{int:jumpto}}" erişilebilirlik bağlantısı etkinleştir',
-'tog-uselivepreview' => 'Canlı ön izlemeyi kullan (JavaScript gerektirir)',
+'tog-uselivepreview' => 'Canlı ön izlemeyi kullan (JavaScript gerektirir ve özellik deneme aşamasındadır)',
 'tog-forceeditsummary' => 'Özeti boş bıraktığımda beni uyar',
 'tog-watchlisthideown' => 'İzleme listemden düzenlemelerimi gizle',
 'tog-watchlisthidebots' => 'İzleme listemden bot değişikliklerini gizle',
index 60fad96..2963c19 100644 (file)
@@ -32,6 +32,7 @@
  * @author NickK
  * @author Olvin
  * @author Prima klasy4na
+ * @author RLuts
  * @author Riwnodennyk
  * @author Sodmy
  * @author Urhixidur
@@ -386,7 +387,7 @@ $messages = array(
 'tog-externaleditor' => "Використовувати зовнішній редактор за умовчанням (тільки для досвідчених користувачів, вимагає спеціальних налаштувань вашого комп'ютера [//www.mediawiki.org/wiki/Manual:External_editors Детальніше.])",
 'tog-externaldiff' => "Використовувати зовнішню програму порівняння версій за умовчанням (тільки для експертів, вимагає спеціальних налаштувань вашого комп'ютера. [//www.mediawiki.org/wiki/Manual:External_editors Детальніше.])",
 'tog-showjumplinks' => 'Активізувати допоміжні посилання «перейти до»',
-'tog-uselivepreview' => 'Ð\97аÑ\81Ñ\82оÑ\81овÑ\83ваÑ\82и Ñ\88видкий Ð¿Ð¾Ð¿ÐµÑ\80еднÑ\96й Ð¿ÐµÑ\80еглÑ\8fд (поÑ\82Ñ\80ебÑ\83Ñ\94 JavaScript)',
+'tog-uselivepreview' => 'Ð\92икоÑ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ñ\88видкий Ð¿Ð¾Ð¿ÐµÑ\80еднÑ\96й Ð¿ÐµÑ\80еглÑ\8fд (JavaScript, ÐµÐºÑ\81пеÑ\80именÑ\82алÑ\8cно)',
 'tog-forceeditsummary' => 'Попереджати, коли не зазначений короткий опис редагування',
 'tog-watchlisthideown' => 'Приховати мої редагування у списку спостереження',
 'tog-watchlisthidebots' => 'Приховати редагування ботів у списку спостереження',
@@ -1361,7 +1362,7 @@ $1",
 'editundo' => 'скасувати',
 'diff-multi' => '({{PLURAL:$1|Одна проміжна версія одного користувача не показана|$1 проміжні версії {{PLURAL:$2|одного користувача|$2 користувачів}} не показані|$1 проміжних версій {{PLURAL:$2|одного користувача|$2 користувачів}} не показані}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|не показана $1 проміжна я версія|не показані $1 проміжні версії|не показано $1 проміжних версій}}, зроблених більш, ніж {{PLURAL:$2|$1 користувачем|$2 користувачами}})',
-'difference-missing-revision' => '{{PLURAL:$2|$2 Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\8f|$2 Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\97|$2 Ð²ÐµÑ\80Ñ\81Ñ\96й}} Ð´Ð»Ñ\8f Ñ\86Ñ\8cого Ð¿Ð¾Ñ\80Ñ\96внÑ\8fннÑ\8f ($1) Ð½Ðµ {{PLURAL:$2|знайдене|знайдені}}.
+'difference-missing-revision' => '{{PLURAL:$2|$2 Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\8f|$2 Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\97|$2 Ð²ÐµÑ\80Ñ\81Ñ\96й}} Ð´Ð»Ñ\8f Ñ\86Ñ\8cого Ð¿Ð¾Ñ\80Ñ\96внÑ\8fннÑ\8f ($1) Ð½Ðµ {{PLURAL:$2|знайдена|знайдені}}.
 
 Імовірно, ви перейшли за застарілим посиланням на порівняння версій вилученої сторінки.
 Подробиці можна дізнатися з [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журналу вилучень].',
@@ -1452,7 +1453,7 @@ $1",
 'prefs-labs' => 'Експериментальні функції',
 'prefs-user-pages' => 'Сторінки користувача',
 'prefs-personal' => 'Особисті дані',
-'prefs-rc' => 'СÑ\82оÑ\80Ñ\96нка Ð¾Ñ\81Ñ\82аннÑ\96х редагувань',
+'prefs-rc' => 'СÑ\82оÑ\80Ñ\96нка Ð½Ð¾Ð²Ð¸х редагувань',
 'prefs-watchlist' => 'Список спостереження',
 'prefs-watchlist-days' => 'Кількість днів, що відображаються у списку спостережень:',
 'prefs-watchlist-days-max' => 'Максимум $1 {{PLURAL:$1|день|дні|днів}}',
@@ -1629,7 +1630,7 @@ $1",
 'right-purge' => 'Очищення кешу для сторінки без сторінки підтвердження',
 'right-autoconfirmed' => 'Редагування частково захищених сторінок',
 'right-bot' => 'Автоматична обробка',
-'right-nominornewtalk' => 'Ð\92Ñ\96дÑ\81Ñ\83Ñ\82нÑ\96Ñ\81Ñ\82Ñ\8c Ð½ÐµÐ·Ð½Ð°Ñ\87ниÑ\85 Ñ\80едагÑ\83ванÑ\8c Ð½Ð° Ñ\81Ñ\82оÑ\80Ñ\96нкаÑ\85 Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ\80енÑ\8c Ð²ÐºÐ»Ñ\8eÑ\87аÑ\94 Ñ\80ежим Ð½Ð¾Ð²Ð¸Ñ\85 Ð¿Ð¾Ð²Ñ\96домленÑ\8c',
+'right-nominornewtalk' => 'Ð\9dезнаÑ\87нÑ\96 Ñ\80едагÑ\83ваннÑ\8f Ð½Ð° Ñ\81Ñ\82оÑ\80Ñ\96нкаÑ\85 Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ\80енÑ\8c ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в Ð½Ðµ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ\8eÑ\82Ñ\8c Ð¿Ð¾Ð¿ÐµÑ\80едженнÑ\8f Ð¿Ñ\80о Ð½Ð¾Ð²Ñ\96 Ð¿Ð¾Ð²Ñ\96домленнÑ\8f',
 'right-apihighlimits' => 'Розширення обмежень на виконання API-запитів',
 'right-writeapi' => 'Використання API для запису',
 'right-delete' => 'Вилучення сторінок',
@@ -2561,9 +2562,9 @@ $UNWATCHURL
 Поточні установки для сторінки: '''$1''':",
 'protect-cascadeon' => 'Ця сторінка захищена, бо вона включена {{PLURAL:$1|до зазначеної нижче сторінки, на яку|до нижчезазначених сторінок, на які}} встановлено каскадний захист. Ви можете змінити рівень захисту цієї сторінки, але це не вплине на каскадний захист.',
 'protect-default' => 'Дозволити всім користувачам',
-'protect-fallback' => 'Ð\9fоÑ\82Ñ\80Ñ\96бен Ð´Ð¾Ð·Ð²Ñ\96л «$1»',
-'protect-level-autoconfirmed' => 'Ð\97аÑ\85иÑ\81Ñ\82иÑ\82и Ð²Ñ\96д Ð½Ð¾Ð²Ð¸Ñ\85 Ñ\96 Ð½ÐµÐ·Ð°Ñ\80еÑ\94Ñ\81Ñ\82Ñ\80ованиÑ\85 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в',
-'protect-level-sysop' => 'ТÑ\96лÑ\8cки Ð°Ð´Ð¼Ñ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80и',
+'protect-fallback' => 'Ð\94озволено Ñ\82Ñ\96лÑ\8cки ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87ам Ñ\96з Ð´Ð¾Ð·Ð²Ð¾Ð»Ð¾Ð¼ «$1»',
+'protect-level-autoconfirmed' => 'Ð\94озволено Ñ\82Ñ\96лÑ\8cки Ð°Ð²Ñ\82опÑ\96дÑ\82веÑ\80дженим ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87ам',
+'protect-level-sysop' => 'Ð\94озволено Ñ\82Ñ\96лÑ\8cки Ð°Ð´Ð¼Ñ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80ам',
 'protect-summary-cascade' => 'каскадний',
 'protect-expiring' => 'закінчується $1 (UTC)',
 'protect-expiring-local' => 'закінчується $1',
index d083992..e713bb8 100644 (file)
@@ -502,6 +502,10 @@ Siz sharhlamoqchi bo'lgan bo'lim o'chirilgan yoki boshqa sarlavhaga jildirilgan
 'newarticletext' => "Bu sahifa hali mavjud emas.
 Sahifani yaratish uchun quyida matn kiritishingiz mumkin (qoʻshimcha axborot uchun [[{{MediaWiki:Helppage}}|yordam sahifasini]] koʻring).
 Agar bu sahifaga xatolik sabab kelib qolgan boʻlsangiz brauzeringizning '''orqaga''' tugmasini bosing.",
+'anontalkpagetext' => "----''Ushbu munozara sahifasi hali hisob yozuvini yaratmagan, yoki undan foydalanmaydigan anonim ishtirokchiga tegishli.
+Shu sababli tenglashtirish uchun raqamli IP-manzildan foydalaniladi.
+Ushbu manzilning oʻzi bir nechta boshqa ishtirokchilarga ham mos kelishi mumkin.
+Agar siz anonim ishtirokchi boʻlsangiz va siz oʻzingizga yoʻnaltirilmagan xabar oldim deb taxmin qilsangiz, iltimos, boshqa anonim ishtirokchilar bilan mumkin boʻlgan chalkashliklarni chetlab oʻtish uchun [[Special:UserLogin/signup|hisob yozuvi yarating]] yoki [[Special:UserLogin|tizimga kiring]].''",
 'noarticletext' => 'Bu sahifada hozircha hech qanday matn yoʻq. Siz bu sarlavhani boshqa sahifalardan [[Special:Search/{{PAGENAME}}|qidirishingiz]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tegishli qaydlarga qarashingiz] yoki bu sahifani [{{fullurl:{{FULLPAGENAME}}|action=edit}} tahrirlashingiz]</span> mumkin.',
 'clearyourcache' => "'''Eslatma.''' Saqlaganingizdan so'ng o'zgarishlarni ko'rish uchun siz o'z brauzeringiz keshini tozalashingizga to'gri kelishi mumkin.
 * '''Firefox / Safari:''' ''Shift'' tugmasini bosgan holda, ''Yangilash'' unsurlar darchasini bosing, yoki ''Ctrl-F5'' yoki ''Ctrl-R'' (Macda ''⌘-R'') ni bosing
@@ -1010,10 +1014,12 @@ Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
 'prevpage' => 'Avvalgi sahifa ($1)',
 'allpagesfrom' => 'Quyidagidan boshlanuvchi sahifalarni koʻrsatish:',
 'allarticles' => 'Barcha sahifalar',
+'allnotinnamespace' => 'Barcha sahifalar ("$1" nomfazolaridan tashqari)',
 'allpagesprev' => 'Oldingi',
 'allpagesnext' => 'Keyingi',
 'allpagessubmit' => 'Oʻtish',
 'allpagesprefix' => 'Shunday prefiksli sahifalarni koʻrsatish:',
+'allpages-hide-redirects' => 'Yoʻnaltirishlarni yashirish',
 
 # SpecialCachedPage
 'cachedspecial-refresh-now' => "Oxirgi versiyasini ko'rish",
@@ -1123,10 +1129,10 @@ Agar siz bu sahifani kuzatuv ro'yxatingizdan o'chirmoqchi bo'lsangiz \"Kuzatmasl
 'enotif_subject_restored' => '{{SITENAME}} loyihasining $1 nomli sahifasi foydalanuvchi {{gender:$2|$2}} tomonidan tiklandi',
 'enotif_subject_changed' => '{{SITENAME}} loyihasining $1 nomli sahifasi foydalanuvchi {{gender:$2|$2}} tomonidan oʻzgartirildi',
 'enotif_body_intro_deleted' => '{{SITENAME}} loyihasining $1 nomli sahifasi $PAGEEDITDATEda foydalanuvchi {{gender:$2|$2}} tomonidan o‘chirildi, qarang: $3.',
-'enotif_body_intro_created' => '{{SITENAME}} loyihasining $1 nomli sahifasi $PAGEEDITDATEda foydalanuvchi {{gender:$2|$2}} tomonidan yaratildi, joriy variantini ko‘rish uchun $3ga qarang.',
-'enotif_body_intro_moved' => '{{SITENAME}} loyihasining $1 nomli sahifasi $PAGEEDITDATEda foydalanuvchi {{gender:$2|$2}} tomonidan qayta nomlandi, joriy variantini ko‘rish uchun $3ga qarang.',
-'enotif_body_intro_restored' => '{{SITENAME}} loyihasining $1 nomli sahifasi $PAGEEDITDATEda foydalanuvchi {{gender:$2|$2}} tomonidan tiklandi, joriy variantini ko‘rish uchun $3ga qarang.',
-'enotif_body_intro_changed' => '{{SITENAME}} loyihasining $1 nomli sahifasi $PAGEEDITDATEda foydalanuvchi {{gender:$2|$2}} tomonidan o‘zgartirildi, joriy variantini ko‘rish uchun $3ga qarang.',
+'enotif_body_intro_created' => '{{SITENAME}} loyihasining $1 nomli sahifasi $PAGEEDITDATEda foydalanuvchi {{gender:$2|$2}} tomonidan yaratildi, joriy variantini ko‘rish uchun $3 ga qarang.',
+'enotif_body_intro_moved' => '{{SITENAME}} loyihasining $1 nomli sahifasi $PAGEEDITDATEda foydalanuvchi {{gender:$2|$2}} tomonidan qayta nomlandi, joriy variantini ko‘rish uchun $3 ga qarang.',
+'enotif_body_intro_restored' => '{{SITENAME}} loyihasining $1 nomli sahifasi $PAGEEDITDATEda foydalanuvchi {{gender:$2|$2}} tomonidan tiklandi, joriy variantini ko‘rish uchun $3 ga qarang.',
+'enotif_body_intro_changed' => '{{SITENAME}} loyihasining $1 nomli sahifasi $PAGEEDITDATEda foydalanuvchi {{gender:$2|$2}} tomonidan o‘zgartirildi, joriy variantini ko‘rish uchun $3 ga qarang.',
 'enotif_lastvisited' => "Oxirgi tashrifingizdan buyon sodir bo'lgan barcha o'zgarishlarni ko'rish uchun $1 ga qarang.",
 'enotif_lastdiff' => "O'zgarishlar bilan tanishish uchun $1 ga qarang.",
 'enotif_anon_editor' => 'anonim ishtirokchi $1',
@@ -1148,10 +1154,10 @@ Agar siz sahifaga o‘tib ko‘rmasangiz, u holda uning keyingi o‘zgarishlari
 Xabar berish moslamalarini o‘zgartirish uchun quyidagi havola bo‘yicha o‘ting
 {{canonicalurl:{{#special:Preferences}}}}
 
-O‘z kuzatuv ro‘yxatingiz moslamalarini o‘zgartirish uchun quyidagi havola bo‘yicha o‘ting
+Oʻz kuzatuv roʻyxatingiz moslamalarini o‘zgartirish uchun quyidagi havola bo‘yicha o‘ting
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
-O‘z kuzatuv ro\'yxatingizdan sahifani o‘chirish uchun quyidagi havola bo‘yicha o‘ting
+Oʻz kuzatuv roʻyxatingizdan sahifani o‘chirish uchun quyidagi havola bo‘yicha o‘ting
 $UNWATCHURL
 
 Qayta aloqa va yordam
index 16df9de..e626377 100644 (file)
@@ -156,7 +156,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Scondi i canbiamenti verificà in tei "Ultimi canbiamenti"',
 'tog-newpageshidepatrolled' => "Scondi łe pajine verifegae da l'elenco de łe pajine pì resenti",
 'tog-extendwatchlist' => "Mostra tute łe modifeghe a i oservai spesałi, no soło l'ultima",
-'tog-usenewrc' => 'Utiłisa łe ulteme modifeghe avansae (el richiede JavaScript)',
+'tog-usenewrc' => "Ragrupa łe modifeghe par pàjina inte i ultimi canbiamenti e inte łe tegnùe d'ocio (el dimanda JavaScript)",
 'tog-numberheadings' => 'Numerasion automatega de i titołi de sesion',
 'tog-showtoolbar' => 'Mostra ła bara de i strumenti de modifega (el richiede JavaScript)',
 'tog-editondblclick' => 'Modifega de łe pajine tramite dopio clic (el richiede JavaScript)',
@@ -164,17 +164,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Modifega de łe sesion tramite clic destro sol titoło (el richiede JavaScript)',
 'tog-showtoc' => "Mostra l'indexe par łe pajine con pì de 3 sesion",
 'tog-rememberpassword' => 'Tiente in mente la me password so sto computer (par un massimo de $1 {{PLURAL:$1|zorno|zorni}})',
-'tog-watchcreations' => 'Zonta łe pajine creae a i oservai spesałi',
-'tog-watchdefault' => 'Zonta łe pajine modifegae a i oservai spesałi',
-'tog-watchmoves' => 'Zonta łe pajine spostae a i oservai spesałi',
-'tog-watchdeletion' => 'Zonta łe pajine scansełae a i oservai spesałi',
+'tog-watchcreations' => "Xonta łe pàjine creae e i file cargai a łe tegnùe d'ocio",
+'tog-watchdefault' => "Xonta łe pàjine e i file modifegai a łe tegnùe d'ocio",
+'tog-watchmoves' => "Xonta łe pàjine e i file spostai a łe tegnùe d'ocio",
+'tog-watchdeletion' => "Xonta łe pàjine e i file scansełai a łe tegnùe d'ocio",
 'tog-minordefault' => 'Segna ogni canbiamento come picenin (solo come predefinìo)',
 'tog-previewontop' => "Mostra l'anteprima sora ła caseła de modifega e no soto",
 'tog-previewonfirst' => "Mostra l'anteprima par ła prima modifega",
 'tog-nocache' => 'Disativa ła cache par łe pajine del browser',
-'tog-enotifwatchlistpages' => 'Segnałame via e-mail łe modifeghe a łe pajine oservae',
+'tog-enotifwatchlistpages' => "Segnałame via e-mail có vien canbià na pàjina o un file prexente inte ła lista de łe tegnùe d'ocio",
 'tog-enotifusertalkpages' => 'Avìseme par e-mail se i scrive su la me pagina de discussion',
-'tog-enotifminoredits' => 'Avìseme par e-mail anca par i canbiamenti picenini',
+'tog-enotifminoredits' => "Avìxeme par e-mail anca pa' i canbiamenti picenini de pàjine e file",
 'tog-enotifrevealaddr' => 'Fà védar el me indirisso e-mail in tei messagi de aviso',
 'tog-shownumberswatching' => 'Mostra el numaro de utenti che i ga ła pajina en oservasion',
 'tog-oldsig' => 'Anteprima de ła firma:',
@@ -182,7 +182,7 @@ $messages = array(
 'tog-externaleditor' => "Dopara par default un editor de testo esterno (soło par utenti esperti. Richiede l'uxo de inpostasion particołari sol proprio computer)",
 'tog-externaldiff' => "Dopara par default un programa de diff esterno (soło par utenti esperti. Richiede l'uxo de inpostasion particołari sol proprio computer)",
 'tog-showjumplinks' => 'Ativa i cołegamenti acesibiłi "va a"',
-'tog-uselivepreview' => 'Ativa ła funsion "Line preview" (el richiede JavaScript; sperimentałe)',
+'tog-uselivepreview' => 'Ativa ła funsion "Line preview" (el dimanda JavaScript; sperimentałe)',
 'tog-forceeditsummary' => "Chiedi conferma se l'ozeto de ła modifega el xé vodo",
 'tog-watchlisthideown' => 'Scondi łe me modifeghe ne i oservai spesałi',
 'tog-watchlisthidebots' => 'Scondi łe modifeghe de i bot ne i oservai spesałi',
@@ -197,7 +197,7 @@ $messages = array(
 
 'underline-always' => 'Senpre',
 'underline-never' => 'Mai',
-'underline-default' => 'Mantieni łe inpostasion del browser',
+'underline-default' => 'Mantien łe inpostasion del browser o de ła skin',
 
 # Font style option in Special:Preferences
 'editfont-style' => "Stiłe font de l'area de modifega:",
@@ -282,7 +282,8 @@ $messages = array(
 'newwindow' => '(se verze in te na finestra nova)',
 'cancel' => 'Lassa star',
 'moredotdotdot' => 'Altro...',
-'mypage' => 'La me pagina',
+'morenotlisted' => 'Altro nó elencà',
+'mypage' => 'Pàjina',
 'mytalk' => 'Discussion',
 'anontalk' => 'Discusion par sto IP',
 'navigation' => 'Navigasion',
@@ -305,10 +306,10 @@ $messages = array(
 'vector-action-protect' => 'Protezi',
 'vector-action-undelete' => 'Recupera',
 'vector-action-unprotect' => 'Canbia ła protesion',
-'vector-simplesearch-preference' => "Intaca i sugerimenti di ricerca avansadi (solo par l'interfacia Vector)",
+'vector-simplesearch-preference' => "Abiłita ła sbara par ła riserca senplifegà (soło che par l'interfacia Vector)",
 'vector-view-create' => 'Crea',
 'vector-view-edit' => 'Canbia',
-'vector-view-history' => 'Varda la storia',
+'vector-view-history' => "Varda ła 'storia",
 'vector-view-view' => 'Lezi',
 'vector-view-viewsource' => 'Varda el testo',
 'actions' => 'Asion',
@@ -467,12 +468,12 @@ L'elenco de le pagine speciali te lo cati su [[Special:SpecialPages|{{int:specia
 # General errors
 'error' => 'Erore',
 'databaseerror' => 'Erore del database',
-'dberrortext' => 'Erore de sintassi ne ła richiesta inoltrà al database.
-Ciò podaria indicare ła presensa de on bug nel software.
-L\'ultima query invià al database xè sta:
+'dberrortext' => 'Eror de sintasi inte ła dimanda inoltrà al database.
+Ciò podaria indicar ła prexensa de un bug inte\'l software.
+L\'ultema query invià al database ła xè sta:
 <blockquote><tt>$1</tt></blockquote>
 riciamà da ła funsion "<tt>$2</tt>".
-El database el ga restituio el seguente erore "<tt>$3: $4</tt>".',
+El database el ga restituio el seguente eror "<tt>$3: $4</tt>".',
 'dberrortextcl' => 'Erore de sintasi ne ła richiesta inoltrà al database.
 L\'ultima query invià al database xè sta:
 "$1"
@@ -509,6 +510,8 @@ Se prega de dìrghelo a un [[Special:ListUsers/sysop|aministradore]] indicando l
 'cannotdelete' => 'No xè sta posibiłe scansełare el file "$1".
 Podaria esare sta zà scansełà da qualcun altro.',
 'cannotdelete-title' => 'Inposibiłe ełiminare ła pajina "$1"',
+'delete-hook-aborted' => 'Modifega abortìa da parte del hook.
+No xe stà dà nisuna spiegasion in merito.',
 'badtitle' => 'Titoło mia justo',
 'badtitletext' => "El titoło de ła pajina richiesta xè vodo, erà o con carateri no amesi opure el deriva da n'erore ne i cołegamenti tra siti wiki diversi o version en łengue diverse de ło steso sito.",
 'perfcached' => 'Sti dati vien tiradi fora da na copia "cache" del database e łi podarìa no esare ajornadi. Inte ła cache xe {{PLURAL:$1|disponibiłe un rixultado|xe disponibiłi $1 rixultadi}}.',
@@ -522,12 +525,13 @@ Query: $2',
 'viewsource-title' => 'Varda el testo de $1',
 'actionthrottled' => 'Asion ritardà',
 'actionthrottledtext' => "Come misura de sicuresa contro e o spam, l'esecusion de alcune asion e a xè limità a on numaro masimo de volte en on determinà periodo de tenpo, limite che en questo caso xè sta superà. Se prega de riprovare tra qualche minuto.",
-'protectedpagetext' => 'Sta pagina la xe stà proteta de modo che nissuni possa canbiarla.',
+'protectedpagetext' => 'Sta pàjina ła xe stà proteta de modo che nisun posa canbiarla o far altre operasion.',
 'viewsourcetext' => 'Se pole vardar e copiar el testo de sta pagina:',
 'viewyourtext' => "Xè posibile vedàre e copiare el codexe sorzente de le '''to modifighe''' a sta pajina:",
-'protectedinterface' => "Sta pagina la gà drento un testo de l'interfacia utente del software, quindi la xe proteta parché nissuni la strussia.",
-'editinginterface' => "'''Ocio:''' El testo de sta pajina el fa parte de l'interfacia utente del sito. Tute łe modifeghe aportae a sta pajina se riflete so i mesaji visuałizà par tuti i utenti.
-Par łe tradusion, considera ła posibiłità de usare [//translatewiki.net/wiki/Main_Page?setlang=vec translatewiki.net], el projeto MediaWiki par ła localizasion.",
+'protectedinterface' => "Sta pàjina ła gà drento un testo de l'interfacia utente del software de sto sito, quindi la xe proteta parché nisuni ła strusie.
+Par xontar o modifegar tradusion par tute łe wiki doparar [//translatewiki.net/ translatewiki.net], el projeto de locałixasion de MediaWiki.",
+'editinginterface' => "'''Ocio:''' El testo de sta pàjina el fa parte de l'interfacia utente del sito. Tute łe modifeghe aportae a sta pajina se riflete so i mesaji visuałixà par tuti i utenti so sta wiki.
+Par xontare o modifegar łe tradusion vałide so tute łe wiki, considera ła posibiłità de doparar [//translatewiki.net/wiki/Main_Page?setlang=vec translatewiki.net], el projeto MediaWiki par ła localixasion.",
 'sqlhidden' => '(ła query SQL ła xè sta sconta)',
 'cascadeprotected' => 'So sta pajina no xè posibiłe efetuare modifeghe parché xè sta inclusa {{PLURAL:$1|ne ła pajina indicà de seguito, che xè sta proteta|ne łe pajine indicae de seguito, che e xè sta protete}} sełesionando ła protesion "ricorsiva":
 $2',
@@ -543,6 +547,7 @@ L\'aministradore che ło ga blocà ga fornìo sta spiegasion: "$3".',
 'invalidtitle-knownnamespace' => 'Titoło no vałido co namespace "$2" e testo "$3"',
 'invalidtitle-unknownnamespace' => 'Titoło no vałido co namespace sconosùo "$1" e testo "$2"',
 'exception-nologin' => 'Acesso mia efetuà',
+'exception-nologin-text' => "Sta pàjina o asion ła richiede che te gapi efetuà 'l aceso so sta wiki.",
 
 # Virus scanner
 'virus-badscanner' => 'Erore de configurasion: antivirus sconossuo: "$1"',
@@ -555,12 +560,15 @@ L\'aministradore che ło ga blocà ga fornìo sta spiegasion: "$3".',
 Te poli 'ndar vanti doparando {{SITENAME}} come utente anonimo o se nò <span class='plainlinks'>[$1 entrar da novo]</span>, col stesso nome utente o uno difarente.
 Ocio che serte pagine podarìa èssar che ti 'e vedi come se te fussi 'ncora drento col to nome de prima, fin che no te neti la ''cache'' del to browser.",
 'welcomeuser' => 'Benvegnù, $1!',
+'welcomecreation-msg' => 'El to nome utente el xe stà creà.
+Nó desmentegarte de personałixare łe [[Special:Preferences|prefarense de {{SITENAME}}]].',
 'yourname' => 'Nome utente:',
 'yourpassword' => 'Password:',
 'yourpasswordagain' => 'De novo la password:',
 'remembermypassword' => 'Tiente in mente la password su sto conputer (par un massimo de $1 {{PLURAL:$1|zorno|zorni}})',
 'securelogin-stick-https' => 'Resta tacà par HTTPS dopo èssar entrà',
 'yourdomainname' => 'Spesifegare el dominio',
+'password-change-forbidden' => 'Nó xe posibiłe canbiar ła password so sta wiki.',
 'externaldberror' => "Se xè verifegà n'erore con el server de autenticasion esterno, opure no se dispone de łe autorizasion nesesarie par ajornare el proprio aceso esterno.",
 'login' => 'Entra',
 'nav-login-createaccount' => 'Entra / Regìstrete',
@@ -641,6 +649,7 @@ Spèta un tocheto prima de proàr da novo.',
 # E-mail sending
 'php-mail-error-unknown' => "Erore sconosudo nte'l funsionamento deła posta ełetronega PHP",
 'user-mail-no-addy' => 'Te ghe provà spedire un mesajo de posta ełetronega sensa un indiriso.',
+'user-mail-no-body' => 'Tentà de inviar na e-mail có un testo vodo o masa curto.',
 
 # Change password dialog
 'resetpass' => 'Cànbia la password',
@@ -702,6 +711,7 @@ Password tenporanea: $2',
 'changeemail-oldemail' => 'Indiriso de posta ełetronega atuałe:',
 'changeemail-newemail' => 'Novo indiriso de posta ełetronega:',
 'changeemail-none' => '(nisun)',
+'changeemail-password' => 'Ła password so {{SITENAME}}:',
 'changeemail-submit' => 'Canbia indiriso de posta ełetronega',
 'changeemail-cancel' => 'Anuła',
 
@@ -800,16 +810,16 @@ o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
 'noarticletext-nopermission' => 'In sto momento no ghe xe nissun testo su sta pagina.
 Te pol [[Special:Search/{{PAGENAME}}|sercar sto titolo de pagina]] in altre pagine,
 o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sercar in tei registri ligà a sta pagina]</span>, ma no te ghè el parmesso de crear sta pagina.',
+'missing-revision' => 'Ła revixion #$1 de ła pàjina "{{PAGENAME}}" nó ła existe.',
 'userpage-userdoesnotexist' => 'L\'account "<nowiki>$1</nowiki>" no\'l corisponde mìa a un utente registrà. Verifica se te voli dal bon crear o modificar sta pagina.',
 'userpage-userdoesnotexist-view' => 'L\'utensa "$1" no la xe gnancora registrà.',
 'blocked-notice-logextract' => "Sto utente xè atualmente blocà.
 L'ultimo ełemento del rejistro de i blochi xè riportà de seguito par informasion:",
-'clearyourcache' => "Ocio: dopo aver salvà, połe darse che te gabi da netare ła cache del to browser par védar i canbiamenti.
+'clearyourcache' => "Ocio: dopo 'ver salvà, pol darse che te gabi da netare ła cache del to browser par védar i canbiamenti.
 *Par '''Firefox / Safari:''' tien macà el boton de łe majuscołe e schicia \"Recarga\", o senò maca ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' se te ghè el Mac)
-*Par '''Google Chrome''':schicia ''Ctrl-Shift-R'' (''⌘-Shift-R'' co' un Mac)
+*Par '''Google Chrome''':schicia ''Ctrl-Shift-R'' (''⌘-Shift-R'' có un Mac)
 *Par '''Internet Explorer''': tien schicià el boton \"Ctrl\" fin che te schici '''Recarga''', senò schicia '''Ctrl+F5'''
-*Par '''Konqueror''': schicia \"Recarga\" o maca ''F5'';
-*Par '''Opera:''' néta la cache in ''Strumenti → Preferense;''",
+*Par '''Opera:''' néta la cache in ''Strumenti → Prefarense;''",
 'usercssyoucanpreview' => "'''Sugerimento:''' se consiglia de doparar el boton \"{{int:showpreview}} par proàr i novi CSS prima de salvarli.",
 'userjsyoucanpreview' => "'''Sugerimento:''' se consiglia de doparar el boton \"{{int:showpreview}}\" par proàr i novi JavaScript prima de salvarli.",
 'usercsspreview' => "'''Sta qua la xe solo n'anteprima del proprio CSS personal.
@@ -821,7 +831,7 @@ Le modifiche no le xe gnancora stà salvà!'''",
 'updated' => '(Agiornà)',
 'note' => "'''Nota:'''",
 'previewnote' => "Sta cua ła xe soło n'anteprima; i canbiamenti a ła pajina NO i xe gnancora stà salvài!",
-'continue-editing' => 'Continua modifegare',
+'continue-editing' => "Va a l'area de modifega",
 'previewconflict' => 'Sta anteprima la corisponde al testo ne la casèla de edizion de sora, e la fa védar come vegnarà fora la pagina se te machi "Salva la pagina" in sto momento.',
 'session_fail_preview' => "No xè stà possibiłe salvar le to modifiche parché i dati de la session i xè andai persi.
 Par piaser, riproa da novo.
@@ -895,6 +905,9 @@ Pararìa che la sìpia stà scancelà.',
 'edit-already-exists' => 'No se pol crear na pagina nova.
 La esiste de zà.',
 'defaultmessagetext' => 'Testo predefinìo',
+'content-failed-to-parse' => "Inposibiłe anałixare $2 pa'l modèl $1: $3",
+'invalid-content-data' => 'Dati contegnui nó vałidi',
+'content-not-allowed-here' => 'Contegnùo in "$1" nó consentio inte ła pàjina [[$2]]',
 
 # Content models
 'content-model-wikitext' => 'wikitesto',
@@ -922,6 +935,7 @@ Sti argomenti i xe stà omessi.",
 'expansion-depth-exceeded-warning' => 'Sta pajina ga superà el limite de profondità de espansion',
 'parser-unstrip-loop-warning' => 'Xe sta riłevà un ciclo de Unstrip',
 'parser-unstrip-recursion-limit' => 'Superadi i limiti de recursion de Unstrip ($1)',
+'converter-manual-rule-error' => 'Rilevà eror inte ła regoła manuałe de conversion de ła lèngua',
 
 # "Undo" feature
 'undo-success' => 'Sta modifica la pode èssar anulà. Verifica el confronto presentà de seguito par èssar sicuro che el contenuto el sia come te lo voli e quindi salva le modifiche par conpletar la procedura de anulamento.',
@@ -1051,9 +1065,11 @@ No ti gà acesso su de ela.',
 'revdelete-no-change' => "''Ocio:''' la version datà $1 a le $2 la gà zà le inpostassion de visibilità da ti richieste.",
 'revdelete-concurrent-change' => "No se riesse a modificar la version datà $1 a le $2: pararìa che qualchidun altro el gavesse canbià el stato de la version intanto che ti te sercavi de far la stessa roba. Daghe n'ociada sui registri.",
 'revdelete-only-restricted' => "Eròr sercando de scondar l'elemento datà $1 a le $2: no te podi inpedirghe ai aministradori de vardar na revision se no te selessioni al tenpo stesso una de le altre opzioni de restrizion.",
-'revdelete-reason-dropdown' => '*Motivassion pi comuni par la scancelassion
-** Violassion de copyright
-** Informassion personali inapropriàe',
+'revdelete-reason-dropdown' => '*Motivasion pi comuni par la scansełasion
+** Viołasion de copyright
+** Comenti o informasion personali inapropriàe
+** Nome utente inapropià
+** Informasion potensialmente difamatoria',
 'revdelete-otherreason' => 'Altro:',
 'revdelete-reasonotherlist' => 'Altra motivassion',
 'revdelete-edit-reasonlist' => 'Modifica le motivazion par la scancelazion',
@@ -1103,6 +1119,10 @@ Assicùrete che la continuità storica de la pagina no la vegna alterà.',
 'editundo' => 'tira indrìo',
 'diff-multi' => '({{PLURAL:$1|Una revision intermedia|$1 revision intermedie}} de {{PLURAL:$2|un utente|$2 utenti}} mia mostrà)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Una revision intermedia|$1 revision intermedie}} de pi de {{PLURAL:$2|un utente|$2 utenti}} mia mostrà)',
+'difference-missing-revision' => "{{PLURAL:$2|Na version|$2 version}} de sta difarensa ($1) {{PLURAL:$2|nó ła xe sta trovà|nó łe xe stae trovae}}.
+
+Cuesto se verifega de sołito seguendo un ligamente vecio de un dif a na pàjina scansełà.
+I detaji i pol esar catai inte'l [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de łe scansełasion].",
 
 # Search results
 'searchresults' => 'Risultati de la riserca',
@@ -1189,11 +1209,12 @@ Prova a métarghe \"all:\" davanti al testo che te serchi par vardar in tuti i n
 'prefs-beta' => 'Funsionałidà beta',
 'prefs-datetime' => 'Data e ora',
 'prefs-labs' => 'Funsionałidà de i laboratori',
+'prefs-user-pages' => 'Pàjine utente',
 'prefs-personal' => 'Profiło utente',
 'prefs-rc' => 'Ultime modifeghe',
-'prefs-watchlist' => 'Tegnùi de òcio',
+'prefs-watchlist' => "Pàjine tegnùe d'ocio",
 'prefs-watchlist-days' => 'Nùmaro de giòrni da far védar nei osservati speciali:',
-'prefs-watchlist-days-max' => 'Masimo $1 ',
+'prefs-watchlist-days-max' => 'Masimo $1 {{PLURAL:$1|xorno|xorni}}',
 'prefs-watchlist-edits' => 'Nùmaro de modifiche da far védar con le funzion avanzade:',
 'prefs-watchlist-edits-max' => 'Numaro massimo: 1000',
 'prefs-watchlist-token' => "Segnal par le pagine tegnùe d'ocio:",
@@ -1238,7 +1259,7 @@ Prova a métarghe \"all:\" davanti al testo che te serchi par vardar in tuti i n
 'timezoneregion-indian' => 'Oceano Indian',
 'timezoneregion-pacific' => 'Oceano Pacifico',
 'allowemail' => 'Consenti la ricezion de e-mail da altri utenti<sup>1</sup>',
-'prefs-searchoptions' => 'Opsioni de riserca',
+'prefs-searchoptions' => 'Riserca',
 'prefs-namespaces' => 'Namespace',
 'defaultns' => 'Serca in sti namespace se no diversamente specificà:',
 'default' => 'predefinìo',
@@ -1251,9 +1272,9 @@ Sta operassion no la pol èssar anulà.',
 'prefs-emailconfirm-label' => "Conferma de l'e-mail:",
 'prefs-textboxsize' => 'Dimension de la casèla de modifica',
 'youremail' => 'La to e-mail',
-'username' => 'Nome utente',
-'uid' => 'ID utente:',
-'prefs-memberingroups' => 'Menbro {{PLURAL:$1|del grupo|dei grupi}}:',
+'username' => '{{GENDER:$1|Nome utente}}:',
+'uid' => '{{GENDER:$1|ID utente}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Menbro}} {{PLURAL:$1|del grupo|de i grupi}}:',
 'prefs-registration' => 'Data de registrassion:',
 'yourrealname' => 'El to vero nome:',
 'yourlanguage' => 'Lengua:',
@@ -1365,6 +1386,7 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
 'right-writeapi' => "Doparar l'API par la modifica de la wiki",
 'right-delete' => 'Scancela pagine',
 'right-bigdelete' => 'Scancela pagine con cronologie longhe',
+'right-deletelogentry' => 'Scanseła e ripristina voxe de registrio spesifeghe',
 'right-deleterevision' => 'Scondi version specifiche de le pagine',
 'right-deletedhistory' => 'Varda i record scancelà de la cronologia, ma sensa el testo associà a lori',
 'right-deletedtext' => 'Vardar el testo scancelà e i canbiamenti tra dele revision scancelà',
@@ -1476,7 +1498,7 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
 'number_of_watching_users_pageview' => '[osservà da {{PLURAL:$1|un utente|$1 utenti}}]',
 'rc_categories' => 'Limita a le categorie (separà da "|")',
 'rc_categories_any' => 'Qualsiasi',
-'rc-change-size-new' => '$1 byte dopo ła modifega',
+'rc-change-size-new' => '$1 {{PLURAL:$|byte}} dopo ła modifega',
 'newsectionsummary' => '/* $1 */ sezion nova',
 'rc-enhanced-expand' => 'Mostra detaji (richiede JavaScript)',
 'rc-enhanced-hide' => 'Scondi detaji',
@@ -1548,7 +1570,7 @@ Varda la [[Special:NewFiles|galerìa dei file nóvi]] par na vision de insieme.'
 'hookaborted' => 'La modifica che te voli fare la xe stà interota da un hook de na estension.',
 'illegal-filename' => 'El nome del file no xe parmesso.',
 'overwrite' => 'No xe parmesso de sorascrìvar un file esistente.',
-'unknown-error' => 'Se gà verifica un eror sconossùo.',
+'unknown-error' => 'Se gà verifegà un eror sconosùo.',
 'tmp-create-error' => 'Inpussibile creare el file tenporaneo.',
 'tmp-write-error' => 'Eror de scritura del file temporaneo.',
 'large-file' => 'Se racomanda de no superar mìa le dimension de $1 par ciascun file; sto file el xe grando $2.',
@@ -1631,6 +1653,7 @@ Se el problema el persiste, contatar un [[Special:ListUsers/sysop|aministrador]]
 'backend-fail-notsame' => 'Existe xà un file no identico a  $1 .',
 'backend-fail-invalidpath' => '$1 no xe un percorso de archiviasion vałido.',
 'backend-fail-delete' => 'Inposibiłe scançełare el file "$1".',
+'backend-fail-describe' => 'Inposibiłe modifegar i metadati del file "$1".',
 'backend-fail-alreadyexists' => 'El file $1 existe xà.',
 'backend-fail-store' => 'Inposibiłe memorixare el file  $1  in  $2 .',
 'backend-fail-copy' => 'Inposibiłe copiare el file "$1" in "$2".',
@@ -1645,12 +1668,48 @@ Se el problema el persiste, contatar un [[Special:ListUsers/sysop|aministrador]]
 'backend-fail-synced' => 'El file "$1" xe incoerente rento i backend de ła memoria interna.',
 'backend-fail-connect' => 'Inposibiłe conétarse al backend de memoria "$1".',
 'backend-fail-internal' => 'Se ga verifegà on erore sconosùo nte\'l backend de memoria "$1".',
-'backend-fail-usable' => 'Inposibiłe modifegare el file $1 a cauxa de autorixasion insuficenti o directory mancanti.',
+'backend-fail-contenttype' => 'Inposibiłe determinar ła tipołoxia del file da archiviar in "$1".',
+'backend-fail-batchsize' => 'El backend de memoria el ga programà na serie de $1 {{PLURAL:$1|operasion}} su file; el limite el xe de $2 {{PLURAL:$2|operasion}}.',
+'backend-fail-usable' => 'Inposibiłe lexare o scrivare el file $1 a cauxa de autorixasion insuficenti o directory/contenidori mancanti.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Inposibiłe coneterse al database journal par l\'archiviasion back-end "$1".',
+'filejournal-fail-dbquery' => 'Inposibiłe axornar el database journal par l\'archiviasion back-end "$1".',
+
+# Lock manager
+'lockmanager-notlocked' => 'Inposibiłe sblocar "$1"; nó \'l xe blocà.',
+'lockmanager-fail-closelock' => 'Nó riusia ła sarada del file de bloco par "$1".',
+'lockmanager-fail-deletelock' => 'Nó riusia ła scansełasion del file de bloco par "$1".',
+'lockmanager-fail-acquirelock' => 'Nó riusia acuixision bloco par "$1".',
+'lockmanager-fail-openlock' => 'Nó riusia l\'apertura del file de bloco par "$1".',
+'lockmanager-fail-releaselock' => 'Nó riusio rełaso del bloco par "$1".',
+'lockmanager-fail-db-bucket' => "Inposibiłe contatar i necesari database de bloco inte'l bucket $1.",
+'lockmanager-fail-db-release' => "Inposibiłe revocar i blochi so'l database $1.",
+'lockmanager-fail-svr-acquire' => "Inposibiłe acuixir blochi so'l server $1.",
+'lockmanager-fail-svr-release' => "Inposibiłe revocar i blochi so'l server $1.",
+
+# ZipDirectoryReader
+'zip-file-open-error' => "S'à verifegà un eror co se jera drio verxare el file pa' i controłi ZIP.",
+'zip-wrong-format' => "El file spesifegà no'l xe un file ZIP.",
+'zip-bad' => "El file el xe un file ZIP coroto o ilexibiłe.
+Nó 'l pol esar controłà par sicuresa.",
+'zip-unsupported' => "El file el xe un file ZIP che'l dopara carateristeghe ZIP nó suportae da MediaWiki.
+Nó 'l pol esar controła par sicuresa.",
+
+# Special:UploadStash
+'uploadstash' => 'Carga stash',
+'uploadstash-summary' => "Sta pàjina ła consente 'l aceso a i file che xe sta cargai (o i xe in faxe de cargamento) ma che nó xe stai ncora pùbicai so ła wiki. Sti file i xe vixibiłi soło che al utente che i ga cargai.",
+'uploadstash-clear' => 'Elimina i file in stash',
+'uploadstash-nofiles' => 'Nó te ghe file in stash.',
+'uploadstash-badtoken' => 'Sta asion nó ła ga vuo suceso, forsi parché łe to credeniałi de modifega łe xe scadue. Prova ncora.',
+'uploadstash-errclear' => 'Ła scansełasion de i file nó ła ga vù suceso.',
+'uploadstash-refresh' => "Axorna 'l elenco de i file",
+'invalid-chunk-offset' => 'Offset de ła parte nó vałido',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Acesso negà',
 'img-auth-nopathinfo' => "Manca el PATH_INFO.
-El to server no'l xe mia configurà par passar sta informassion.
+El to server no'l xe mia configurà par pasar sta informasion.
 Magari el xe basà su CGI e no'l suporta img_auth.
 Varda https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
 'img-auth-notindir' => "El percorso richiesto no'l se cata in te la cartèla de caricamento configurà.",
@@ -1727,17 +1786,23 @@ De seguito xe elencà solo {{PLURAL:$1|la prima pagina che ponta|le prime $1 pag
 Se pode védar un [[Special:WhatLinksHere/$2|elenco par intiero]].',
 'nolinkstoimage' => 'Nissuna pàxena la punta a sto file.',
 'morelinkstoimage' => 'Varda i [[Special:WhatLinksHere/$1|altri colegamenti]] verso sto file.',
+'linkstoimage-redirect' => '$1 (rimando file) $2',
 'duplicatesoffile' => '{{PLURAL:$1|El file seguente el xe un dopion|I $1 file seguenti i xe dei dopioni}} de sto file ([[Special:FileDuplicateSearch/$2|ulteriori detagli]]):',
 'sharedupload' => 'Sto file el vien da $1 e se pole dopararlo anca su altri progeti.',
 'sharedupload-desc-there' => 'Sto file el vien da $1 e se pode dopararlo su altri projeti.
 Consulta la [$2 pàxena de descrission del file] par ulteriori informassion.',
 'sharedupload-desc-here' => 'Sto file el vien da $1 e se pode dopararlo su altri projeti.
 Qua soto vien mostrà la descrission presente in te la [$2 pàxena de descrission del file].',
+'sharedupload-desc-edit' => "Sto file el vien da $1 e 'l pol esar doparà da altri projeti.
+Probabilmente te vui modifegar ła descrision prexente inte ła [$2 pàjina de descrision del file].",
+'sharedupload-desc-create' => "Sto file el vien da $1 e 'l pol esar doparà da altri projeti.
+Probabilmente te vui modifegar ła descrision prexente inte ła [$2 pàjina de descrision del file].",
 'filepage-nofile' => 'No ghe xe nissun file co sto nome.',
 'filepage-nofile-link' => 'NO ghe xe un file co sto nome, ma te podi [$1 cargarlo su].',
 'uploadnewversion-linktext' => 'Carga na nova version de sto file',
 'shared-repo-from' => 'da $1',
 'shared-repo' => 'un archivio condiviso',
+'upload-disallowed-here' => 'Inposibiłe sovrascrivere sto file.',
 
 # File reversion
 'filerevert' => 'Ripristina $1',
@@ -1767,6 +1832,7 @@ Qua soto vien mostrà la descrission presente in te la [$2 pàxena de descrissio
 ** File duplicà',
 'filedelete-edit-reasonlist' => 'Modifica le motivazion par la scancelazion',
 'filedelete-maintenance' => 'La scancelassion e el riprìstino dei file i xe disabilità par un tocheto par manutension.',
+'filedelete-maintenance-title' => 'Inposibiłe scansełar el file.',
 
 # MIME search
 'mimesearch' => 'Serca in base al tipo MIME',
@@ -1816,14 +1882,16 @@ Qua soto vien mostrà la descrission presente in te la [$2 pàxena de descrissio
 
 'disambiguations' => 'Pajine cołegade a pajine de dixanbiguasion',
 'disambiguationspage' => 'Template:Disambigua',
-'disambiguations-text' => "Le pagine ne la lista che segue le contien dei colegamenti a '''pagine de disanbiguazion''' e no a l'argomento a cui le dovarìà far riferimento.<br />
-Vien considerà pagine de disanbiguazion tute quele che contien i modèi elencà in [[MediaWiki:Disambiguationspage]]",
+'disambiguations-text' => "Łe pàjine inte ła lista cuà soto łe ga drento almanco un ligamento a na '''pàjina de dixanbiguasion'''.
+Łe podaria dover puntar a na pàjina pì apropià.<br />
+Vien considerae pàjine de dixanbiguasion tute cuełe che łe ga drento i modełi elencai in [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Redirect dopi',
 'doubleredirectstext' => 'Sta pagina le elenca pagine che rimanda a altre pagine de rimando.
 Ogni riga la contien dei colegamenti al primo e al secondo rimando, oltre a la destinassion del secondo rimando, che de solito la xe la "vera" pagina de destinassion, a cui dovarìa pontar el primo rimando.
 Le righe <del>sbarà</del> le xe xà stà sistemà.',
 'double-redirect-fixed-move' => '[[$1]] xe stà spostà, desso el xe solo un rimando a [[$2]]',
+'double-redirect-fixed-maintenance' => 'Coreto dopio rimando da [[$1]] a [[$2]].',
 'double-redirect-fixer' => 'Coretòr de redirect',
 
 'brokenredirects' => 'Redirect mìa giusti',
@@ -1841,6 +1909,7 @@ Le righe <del>sbarà</del> le xe xà stà sistemà.',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|byte}}',
 'ncategories' => '$1 {{PLURAL:$1|categoria|categorie}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki}}',
 'nlinks' => '$1 {{PLURAL:$1|colegamento|colegamenti}}',
 'nmembers' => '$1 {{PLURAL:$1|elemento|elementi}}',
 'nrevisions' => '$1 {{PLURAL:$1|revision|revision}}',
@@ -1861,14 +1930,18 @@ Le righe <del>sbarà</del> le xe xà stà sistemà.',
 'wantedpages' => 'Pagine pì domandà',
 'wantedpages-badtitle' => 'Titolo mia valido nel grupo de risultati: $1',
 'wantedfiles' => 'File domandà',
+'wantedfiletext-cat' => 'I seguenti file i xe riciamai da wikilink, ma nó i existe. I file ospitai so repository esterni i podaria esar elencai anca se de fato existenti. Sti falsi poxitivi i sarà <del>sbarai</del>. Łe pàjine che incorpora i file che nó existe łe xe elencae in [[:$1]].',
+'wantedfiletext-nocat' => 'I seguenti file i xe riciamai da wikilink, ma nó i existe. I file ospitai so repository esterni i podaria esar elencai anca se de fato existenti. Sti falsi poxitivi i sarà <del>sbarai</del>.',
 'wantedtemplates' => 'Modèi domandà',
 'mostlinked' => 'Pagine piassè puntà',
 'mostlinkedcategories' => 'Categorie piassè riciamae',
 'mostlinkedtemplates' => 'Modèi piassè doparà',
 'mostcategories' => 'Pagine con piassè categorie',
 'mostimages' => 'File piassè riciamà',
+'mostinterwikis' => 'Pàjine có pì interwiki',
 'mostrevisions' => 'Pagine con piassè revisión',
 'prefixindex' => 'Tute le pagine che taca con...',
+'prefixindex-namespace' => "Tute łe pàjine có 'l prefiso del namespace $1",
 'shortpages' => 'Pagine curte',
 'longpages' => 'Pagine longhe',
 'deadendpages' => 'Pagine sensa uscita',
@@ -1901,6 +1974,7 @@ Par piaser tien conto che altri siti web i podarìa realizar colegamenti ai file
 'pager-newer-n' => '{{PLURAL:$1|quel pi novo|i $1 pi novi}}',
 'pager-older-n' => '{{PLURAL:$1|quel pi vecio|i $1 pi vèci}}',
 'suppress' => 'Supervision',
+'querypage-disabled' => 'Sta pàjina speciałe ła xe dixativà par motivi de prestasion.',
 
 # Book sources
 'booksources' => 'Fonti librarie',
@@ -1918,6 +1992,7 @@ Par piaser tien conto che altri siti web i podarìa realizar colegamenti ai file
 Te podi restrénzar i criteri de riçerca selezionando el tipo de registro, el nome utente, o la pàxena interessà (ocio che sti ultimi du i distingue tra majuscolo e minuscolo).',
 'logempty' => "El registro no'l contien mìa elementi corispondenti a la riçerca.",
 'log-title-wildcard' => 'Riçerca dei titoli che scuminsia con',
+'showhideselectedlogentries' => 'Mostra/scondi łe voxe de registro sełesionae',
 
 # Special:AllPages
 'allpages' => 'Tute le pagine',
@@ -1938,6 +2013,8 @@ Te podi restrénzar i criteri de riçerca selezionando el tipo de registro, el n
 'allpages-hide-redirects' => 'Scondi rimandi',
 
 # SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Te si drio vardar na version de sta pàjina memorixà inte ła cache, che ła pol esar vecia al masimo de $1.',
+'cachedspecial-viewing-cached-ts' => 'Te si drio vardar na version de sta pàjina memorixà inte ła cache, che ła podaria nó esar conpletamente axornà.',
 'cachedspecial-refresh-now' => "Varda l'ultima.",
 
 # Special:Categories
@@ -1959,9 +2036,9 @@ Varda anca le [[Special:WantedCategories|categorie domandà]].',
 'linksearch-pat' => 'Espression de riserca:',
 'linksearch-ns' => 'Namespace:',
 'linksearch-ok' => 'Serca',
-'linksearch-text' => 'Xe posibiłe doparare metacarateri, come "*.wikipedia.org".<br />
-Xe necesario almanco un dominio de primo liveło, tipo "*.org".<br />
-Protocołi suportadi: <code>$1</code> (no sta xontare nesuno de sti cuà inte ła to riçerca).',
+'linksearch-text' => 'Xe posibiłe doparare metacarateri, come "*.wikipedia.org".
+Xe nesesario almanco un dominio de primo liveło, tipo "*.org".<br />
+{{PLURAL:$2|Protocoło suportà|Protocołi suportai}}: <code>$1</code> (predefinio http:// se nisun protocoło el xe spesifegà).',
 'linksearch-line' => '$1 presente ne la pagina $2',
 'linksearch-error' => "I metacaràteri i pode vegner doparài solo a l'inizio del nome de l'host.",
 
@@ -2006,16 +2083,18 @@ Se pol consultar anca dele altre [[{{MediaWiki:Listgrouprights-helppage}}|inform
 'emailuser-title-target' => 'Scrivi na e-mail a {{GENDER:$1|sto|sta}} utente',
 'emailuser-title-notarget' => "Scrivi na e-mail a l'utente",
 'emailpage' => "Scrivi na e-mail a l'utente",
-'emailpagetext' => 'Te podi usar el modulo chi soto par mandare na e-mail a sto utente.
-La e-mail che te ghè indicà ne le [[Special:Preferences|to preferense]] la vegnarà fora nel canpo "Da" de la mail, così che el destinatario el possa rispóndarte a ti diretamente.',
+'emailpagetext' => 'Te podi usar el moduło chi soto par mandare na e-mail a sto {{GENDER:$1|utente}}.
+Ła e-mail che te ghè indicà inte łe [[Special:Preferences|to prefarense]] ła vegnarà fora inte\'l canpo "Da" de la mail, cusì che\'l destinatario el posa rispóndarte diretamente a ti.',
 'usermailererror' => "L'ogeto mail el gà restituìo l'eror:",
-'defemailsubject' => 'Messagio da {{SITENAME}}',
+'defemailsubject' => 'Mesajo da {{SITENAME}} dal utente "$1"',
 'usermaildisabled' => 'e-mail utente disabiłità',
 'usermaildisabledtext' => 'No xè posibiłe inviare e-mail ad altri utenti so sto wiki',
 'noemailtitle' => 'Nissun indirisso e-mail',
 'noemailtext' => "Sto utente no'l gà indicà nissuna casela e-mail valida.",
 'nowikiemailtitle' => 'Posta elétronega mia parmessa',
 'nowikiemailtext' => 'Sto utente el ga sielto de no ricévar e-mail da i altri utenti.',
+'emailnotarget' => 'Nome utente del destinatario inexistente o nó vałido.',
+'emailtarget' => 'Inserisi el nome utente del destinatario',
 'emailusername' => 'Nome utente:',
 'emailusernamesubmit' => 'Manda',
 'email-legend' => "Màndeghe na e-mail a n'altro utente de {{SITENAME}}",
@@ -2036,15 +2115,16 @@ La e-mail che te ghè indicà ne le [[Special:Preferences|to preferense]] la veg
 
 # Watchlist
 'watchlist' => "Pagine tegnùe d'ocio",
-'mywatchlist' => "Pagine tegnùe d'ocio",
+'mywatchlist' => "Pàjine tegnùe d'ocio",
 'watchlistfor2' => 'De $1 $2',
 'nowatchlist' => "No te ghè indicà pagine da tegner d'ocio.",
 'watchlistanontext' => "Per vardar e modifegar l'ełenco de i osservati speciałi bisogna $1.",
 'watchnologin' => 'Acesso mia efetuà',
 'watchnologintext' => 'Te ghè prima da far el [[Special:UserLogin|login]] par modificar la to lista de osservati speciali.',
 'addwatch' => "Tien d'ocio",
-'addedwatchtext' => "La pagina \"[[:\$1]]\" la xe stà zontà a la to [[Special:Watchlist|lista de pagine da tegner d'ocio]].
-I futuri canbiamenti a sta pagina e a la so pagina de discussion i se vedarà fora qua, e la pagina la se vedarà in '''grosso''' sui [[Special:RecentChanges|ultimi canbiamenti]] par tegnerla d'ocio mejo.",
+'addedwatchtext' => 'Ła pagina "[[:$1]]" ła xe stà xontà a ła to [[Special:Watchlist|lista de pàjine da tegner d\'ocio]].
+I futuri canbiamenti a sta pàjina e a ła so pàjina de discusion i vegnarà elencai in cheła pàjina là.',
+'removewatch' => "Cava da łe tegnùe d'ocio",
 'removedwatchtext' => 'La pagina "[[:$1]]" la xe stà cavà da le to [[Special:Watchlist|pagine tegnùe de ocio]].',
 'watch' => "Tien d'ocio",
 'watchthispage' => "Tien d'ocio sta pagina",
@@ -2060,45 +2140,56 @@ I futuri canbiamenti a sta pagina e a la so pagina de discussion i se vedarà fo
 'watchmethod-list' => 'controło de i osservati speciałi par modifeghe recenti',
 'watchlistcontains' => 'La lista de i osservati speciałi la contien {{PLURAL:$1|una pagina|$1 pagine}}.',
 'iteminvalidname' => "Problemi con la voxe '$1', nome mìa vałido...",
-'wlnote' => "Qua soto te cati {{PLURAL:$1|l'ultimo canbiamento|i ultimi '''$1''' canbiamenti}} ne {{PLURAL:$2|l'ultima ora|le ultime '''$2''' ore}}.",
+'wlnote' => "Cuà soto te cati {{PLURAL:$1|'l ultimo canbiamento|i ultimi '''$1''' canbiamenti}} inte {{PLURAL:$2|l'ultema ora|łe ultime '''$2''' ore}}; i dati i xe axornai a łe $4 del $3.",
 'wlshowlast' => 'Mostra le ultime $1 ore $2 zorni $3',
 'watchlist-options' => "Inpostassion de le pagine tegnùe d'ocio",
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => "Taco a tegner d'ocio...",
 'unwatching' => "Desmeto de tegner d'ocio...",
+'watcherrortext' => 'S\'à verifegà un eror durante ła modifega de łe tegnùe d\'ocio par "$1".',
 
 'enotif_mailer' => 'Sistema de notifica via e-mail de {{SITENAME}}',
 'enotif_reset' => 'Segna tute le pagine come zà viste',
 'enotif_impersonal_salutation' => 'Utente de {{SITENAME}}',
+'enotif_subject_deleted' => 'Ła pàjina $1 de {{SITENAME}} ła xe sta scansełà da {{gender:$2|$2}}',
+'enotif_subject_created' => 'Ła pàjina $1 de {{SITENAME}} ła xe sta creà da {{gender:$2|$2}}',
+'enotif_subject_moved' => 'Ła pàjina $1 de {{SITENAME}} ła xe sta spostà da {{gender:$2|$2}}',
+'enotif_subject_restored' => 'Ła pàjina $1 de {{SITENAME}} ła xe sta ripristinà da {{gender:$2|$2}}',
+'enotif_subject_changed' => 'Ła pàjina $1 de {{SITENAME}} ła xe sta canbià da {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'Ła pàjina $1 de {{SITENAME}} ła xe sta scansełà da {{gender:$2|$2}} el $PAGEEDITDATE (varda $3 par ła version atuałe).',
+'enotif_body_intro_created' => 'Ła pàjina $1 de {{SITENAME}} ła xe sta creà da {{gender:$2|$2}} el $PAGEEDITDATE (varda $3 par ła version atuałe).',
+'enotif_body_intro_moved' => 'Ła pàjina $1 de {{SITENAME}} ła xe sta spostà da {{gender:$2|$2}} el $PAGEEDITDATE (varda $3 par ła version atuałe).',
+'enotif_body_intro_restored' => 'Ła pàjina $1 de {{SITENAME}} ła xe sta ripristinà da {{gender:$2|$2}} el $PAGEEDITDATE (varda $3 par ła version atuałe).',
+'enotif_body_intro_changed' => 'Ła pàjina $1 de {{SITENAME}} ła xe sta canbià da {{gender:$2|$2}} el $PAGEEDITDATE (varda $3 par ła version atuałe).',
 'enotif_lastvisited' => 'Varda $1 par tute le modifiche da la to ultima visita.',
 'enotif_lastdiff' => 'Varda $1 par visualizar la modifica.',
 'enotif_anon_editor' => 'utente anonimo $1',
 'enotif_body' => 'Caro/a $WATCHINGUSERNAME,
 
-ła pàxena $PAGETITLE de {{SITENAME}} la xè stà $CHANGEDORCREATED el $PAGEEDITDATE da $PAGEEDITOR, varda $PAGETITLE_URL par ła version atuałe.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
-Somario del redator: $PAGESUMMARY $PAGEMINOREDIT
+Ogeto del intervento, inserio dal autor: $PAGESUMMARY $PAGEMINOREDIT
 
-Contatta el redator:
-mail: $PAGEEDITOR_EMAIL
-wiki: $PAGEEDITOR_WIKI
+Contata l\'autor:
+via posta eletronega: $PAGEEDITOR_EMAIL
+so\'l sito: $PAGEEDITOR_WIKI
 
-No ghe sarà altre notifiche in caso de ulteriori canbiamenti, a manco che ti no te visiti sta pàxena.
-Te podi anca reinpostar l\'avixo de notifica par tuti i osservati speciałi de ła to łista.
+Nó vegnarà inviae altre notifeghe in caxo de ulteriori atività, se nó te vixiti ła pàjina. Inoltre, xe posibiłe modifegar łe inpostasion de notifega par tute łe pàjine inte ła lista de łe tegnùe d\'ocio.
 
-             El to amichevole sistema de notifica de {{SITENAME}}
+             El sistema de notifega de {{SITENAME}}, al to servisio
 
 --
-Par canbiar łe inpostassion de i to osservati speciałi, visita
-{{canonicalurl:Special:Watchlist/edit}}
+Par modifegar łe inpostasion de łe notifeghe via posta eletronega, varda 
+{{canonicalurl:{{#special:Preferences}}}}
 
-Par cavar la pagina da i to osservati speciałi, visita
+Par modifegar ła lista de łe tegnùe d\'ocio, varda 
+{{canonicalurl:{{#special:EditWatchlist}}}}
+
+Par cavar ła pàjina da ła lista de łe tegnùe d\'ocio, varda
 $UNWATCHURL
 
-Par riscontri e ulteriore assistensa:
+Par comentare e risevere ajuto:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 'created' => 'creà',
 'changed' => 'canbià',
@@ -2137,6 +2228,8 @@ Varda $2 par n'elenco de le ultime pagine scanselà.",
 'rollback' => 'Anuła łe modifighe',
 'rollback_short' => 'Rollback',
 'rollbacklink' => 'tira indrìo i canbiamenti',
+'rollbacklinkcount' => 'rollback de {{PLURAL:$1|na modifega|$1 modifeghe}}',
+'rollbacklinkcount-morethan' => 'rollback de pì de {{PLURAL:$1|na modifega|$1 modifeghe}}',
 'rollbackfailed' => 'Ripristino mìa riussìo',
 'cantrollback' => "No xè mia possibiłe tornar a na versión precedente: l'ultima modifica la xè stà aportà da l'unico utente che gà laorà a sto articoło.",
 'alreadyrolled' => "No xè mia possibile efetuar el ripristino de [[:$1]] da [[User:$2|$2]] ([[User talk:$2|discussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); qualcun altro gà xà modificà o efetuà el ripristino de sta voxe.
@@ -2162,6 +2255,10 @@ Vedi ła [[Special:ProtectedPages|lista dełe pajine protete]] pa l'elenco de ł
 'protect-title' => 'Canbia el livèl de protezion par "$1"',
 'protect-title-notallowed' => 'Varda el livelo de protesion de " $1 "',
 'prot_1movedto2' => '[[$1]] spostà a [[$2]]',
+'protect-badnamespace-title' => 'Namespace nò protexibiłe',
+'protect-badnamespace-text' => 'Łe pàjine in sto namespace nò łe pol esar protete.',
+'protect-norestrictiontypes-text' => 'Sta pàjina nò ła pol esar proteta parché nò ghe xe gnaun tipo de restrision disponibiłe.',
+'protect-norestrictiontypes-title' => 'Pàjina nò protexibiłe',
 'protect-legend' => 'Conferma la protezion',
 'protectcomment' => 'Motivassion:',
 'protectexpiry' => 'Scadensa:',
@@ -2176,11 +2273,12 @@ Le inpostazion corenti par la pagina le xe '''$1''':",
 Le impostazion atuali par la pagina le xe '''$1''':",
 'protect-cascadeon' => 'Al momento sta pagina la xe blocà parché la xe inclusa {{PLURAL:$1|ne la pagina indicà de seguito, par la quale|ne le pagine indichè de seguito, par le quali}} xe ativa la protezion ricorsiva. Se pol modificar el livel de protezion individual de la pagina, ma le inpostazion derivanti da la protezion ricorsiva no le sarà mìa modificà.',
 'protect-default' => 'Autoriza tuti i utenti',
-'protect-fallback' => 'Ghe vole el parmesso de "$1"',
-'protect-level-autoconfirmed' => 'Bloca i utenti novi o mia registrà',
-'protect-level-sysop' => 'Solo aministradori',
+'protect-fallback' => 'Consentio soło che a i utenti có parmeso "$1"',
+'protect-level-autoconfirmed' => 'Consentio soło che a i utenti "autoconfermai"',
+'protect-level-sysop' => 'Consentio soło che a i aministradori',
 'protect-summary-cascade' => 'ricorsiva',
 'protect-expiring' => 'scadensa: $1 (UTC)',
+'protect-expiring-local' => 'scade el $1',
 'protect-expiry-indefinite' => 'infinìo',
 'protect-cascade' => "Protezion ricorsiva (l'estende la protezion a tute le pagine incluse in sta qua).",
 'protect-cantedit' => 'No te pol canbiar i livèi de protezion par la pagina, parché no te ghè mìa i parmessi necessari par modifegar la pagina stessa.',
@@ -2222,8 +2320,8 @@ Le impostazion atuali par la pagina le xe '''$1''':",
 'undeletepagetext' => "{{PLURAL:$1|La pàxena qua de sèvito la xe stà scancelà, ma la ghe xe 'ncora in archivio e pertanto se pole 'ncora recuperarla|Le $1 pàxene qua de sèvito le xe stà scancelè, ma le ghe xe 'ncora in archivio e pertanto se pole 'ncora recuperarle}}.
 L'archivio el vien svodà periodicamente.",
 'undelete-fieldset-title' => 'Recupera version',
-'undeleteextrahelp' => "Par recuperar la storia de la pàxena par intiero, lassa tute łe casełe desełezionàe e struca '''''Ripristina'''''.
-Par efetuar un ripristino sełetivo, seleziona łe casełe corispondenti a łe revixion da ripristinar e struca '''''Ripristina'''''. Strucando '''''Reset''''' vegnarà deselezionàe tute łe casełe e svodà el posto par el comento.",
+'undeleteextrahelp' => "Par recuperar l'intiera storia de ła pàjina, łasar tute łe caxełe desełesionae e strucar so '''''{{int:undeletebtn}}'''''.
+Par efetuar un ripristino sełetivo, sełesionar łe caxełe corispondenti a łe revixion da ripristinar e strucar so '''''{{int:undeletebtn}}'''''.",
 'undeleterevisions' => '{{PLURAL:$1|Una revision|$1 revision}} in archivio',
 'undeletehistory' => 'Recuperando sta pàxena, tute łe so revixion le vegnarà inserìe da novo ne ła rełativa cronołogia.
 Se dopo ła scancełazion xè stà creà na nova pàxena col stesso titoło, łe revixion recuperà le sarà inserìe ne ła cronołogia preçedente.',
@@ -2241,11 +2339,13 @@ Se dopo ła scancełazion xè stà creà na nova pàxena col stesso titoło, łe
 'undeletedrevisions' => '{{PLURAL:$1|Una revision recuperà|$1 revision recuperà}}',
 'undeletedrevisions-files' => '{{PLURAL:$1|Una revision|$1 revision}} e $2 file recuperà',
 'undeletedfiles' => '{{PLURAL:$1|Un file recuperà|$1 file recuperà}}',
-'cannotundelete' => "El recupero no'l xè riussìo: qualchedun altro el podarià aver xà recuperà ła pàxena.",
+'cannotundelete' => 'Ripristino nó riusìo:
+$1',
 'undeletedpage' => "'''$1 la xè stà recuperà'''
 
 Consulta el [[Special:Log/delete|registro de le scancełassion]] par vardare łe scancełassion e i recuperi pì reçenti.",
 'undelete-header' => 'Varda el [[Special:Log/delete|registro de le scancelazion]] par védar le scancelazion piassè reçenti.',
+'undelete-search-title' => 'Serca inte łe pàjine scanselae',
 'undelete-search-box' => 'Serca ne le pagine scancelà',
 'undelete-search-prefix' => 'Mostra le pagine el cui titolo scuminsia con:',
 'undelete-search-submit' => 'Serca',
@@ -2254,6 +2354,7 @@ Consulta el [[Special:Log/delete|registro de le scancełassion]] par vardare łe
 'undelete-bad-store-key' => "No se pol anular la scancelazion de la revision del file con data/ora $1: el file no'l xera disponibile prima de la scancelazion.",
 'undelete-cleanup-error' => 'Eror ne la scancelazion del file de archivio non doparà "$1".',
 'undelete-missing-filearchive' => "No se pol ripristinar l'ID $1 de l'archivio file in quanto no'l ghe xe mìà nel database. El podarìa èssar stà zà ripristinà.",
+'undelete-error' => "Eror inte'l ripristino de ła pàjina",
 'undelete-error-short' => 'Eror nel ripristino del file: $1',
 'undelete-error-long' => 'Se gà verificà dei erori nel tentativo de anular la scancelazion del file:
 
@@ -2264,6 +2365,9 @@ $1',
 # Namespace form on various pages
 'namespace' => 'Namespace:',
 'invert' => 'Inverti la selession',
+'tooltip-invert' => "Sełesion sta caxeła par scondare łe modifeghe a łe pàjine drento del namespace sełesionà (e 'l rełativo namespace, se sełesionà)",
+'namespace_association' => 'Namespace asocià',
+'tooltip-namespace_association' => "Sełesiona sta caxeła pa' includare anca ła pàjina de discusion o 'l ogeto del namespace asocià cò 'n namespace sełesionà",
 'blanknamespace' => '(Prinsipale)',
 
 # Contributions
@@ -2350,6 +2454,9 @@ $1',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] xe stà blocà.<br />
 Varda [[Special:BlockList|lista IP blocadi]] par vedare tuti i blochi.',
 'ipb-blockingself' => 'Sito drio blocar te steso! Sito sicuro de voerlo fare?',
+'ipb-confirmhideuser' => 'Se sta par blocar un utente cò l\'opsion "Scondi utente" abiłità.
+In sto modo se evita che\'l nome utente el vegne fora inte łeliste e łe voxe del registro.
+Sito seguro de vołer continuar?',
 'ipb-edit-dropdown' => 'Motivi par el bloco',
 'ipb-unblock-addr' => 'Sbloca $1',
 'ipb-unblock' => 'Sbloca un utente o un indirizo IP',
@@ -2361,8 +2468,19 @@ Varda [[Special:BlockList|lista IP blocadi]] par vedare tuti i blochi.',
 'unblocked' => '[[User:$1|$1]] el xe stà sblocà',
 'unblocked-range' => '$1 xè stà sblocà',
 'unblocked-id' => 'El bloco $1 el xe stà cavà',
+'blocklist' => 'Utenti blocai',
 'ipblocklist' => 'Utenti blocà',
 'ipblocklist-legend' => 'Cata fora un utente blocà',
+'blocklist-userblocks' => 'Scondi i blochi de i account',
+'blocklist-tempblocks' => 'Scondi i blochi tenporanei',
+'blocklist-addressblocks' => 'Scondi i blochi de un IP ugnoło',
+'blocklist-rangeblocks' => 'Scondi i blochi de range',
+'blocklist-timestamp' => 'Date e ora',
+'blocklist-target' => 'Destinasion',
+'blocklist-expiry' => 'Scade',
+'blocklist-by' => 'Aministrador che ga blocà',
+'blocklist-params' => 'Parametri de bloco',
+'blocklist-reason' => 'Motivo',
 'ipblocklist-submit' => 'Serca',
 'ipblocklist-localblock' => 'Bloco local',
 'ipblocklist-otherblocks' => '{{PLURAL:$1|Altro bloco|Altri blochi}}',
@@ -2404,6 +2522,7 @@ Qua soto ghe xe el registro de le sopression:',
 'ipb_already_blocked' => 'L\'utente "$1" el xe zà blocà',
 'ipb-needreblock' => '$1 xe xà blocà. Vuto canbiar le inpostassion?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Altro bloco|Altri blochi}}',
+'unblock-hideuser' => "Nò te poi sblocar sto utente, parché el so nome utente 'l'è sta sconto.",
 'ipb_cant_unblock' => 'Eror: Inpossibile catar el bloco con ID $1. El bloco el podarìa èssar zà stà cavà.',
 'ipb_blocked_as_range' => "Eror: L'indirizo IP $1 no'l xe sogeto a bloco individual e no'l pol èssar sblocà. El bloco el xe invesse ativo a livel de l'intervalo $2, che el pol èssar sblocà.",
 'ip_range_invalid' => 'Intervało de indirissi IP mìa vałido.',
@@ -2443,18 +2562,18 @@ Tiente in mente de [[Special:UnlockDB|sblocarlo]] co te ghè finìo de far manut
 # Move page
 'move-page' => 'Spostamento de $1',
 'move-page-legend' => 'Spostamento de pagina',
-'movepagetext' => "Col modulo qua soto te podi rinominar na pagina, spostando anca tuta la so storia al titolo novo.
-El vecio titolo el deventarà automaticamente un rimando (redirect) che punta al titolo novo.
-Te podi agiornar automaticamente i rimandi che punta al vecio titolo.
-Se te siegli de no farlo, tiente in mente de controlar ben che no se crea [[Special:DoubleRedirects|dopi redirect]] o [[Special:BrokenRedirects|redirect interoti]].
-Resta ne la to responsabilità de controlar che i colegamenti i continua a puntar dove che i deve.
+'movepagetext' => "Có 'l moduło cuà soto te podi rinominar na pàjina, spostando anca tuta ła so storia al titoło novo.
+El vecio titoło el devegnarà automategamente un rimando (redirect) che ponta al titoło novo.
+Te podi axornar automategamente i rimandi che ponta al vecio titoło.
+Se te siełi de nó farlo, tiente inamente de controłar ben che nó se cree [[Special:DoubleRedirects|dopi rimandi]] o [[Special:BrokenRedirects|rimandi interoti]].
+Resta inte ła to responsabiłità de controłar che i ligamenti i continue a pontar 'ndove che i deve.
 
-Ocio: la pagina '''no''' la sarà spostà se ghe fusse zà na pagina col titolo novo, a meno che no la sia na pagina voda o un rimando, e senpre che no la gabia na storia.
-Questo significa che, se te fè un eror, te podi da novo rinominar na pagina col vecio titolo, ma no te podi sovrascrìvar na pagina zà esistente.
+Ocio: ła pàjina '''nó''' ła sarà spostà se ghe fuse xà na pàjina có 'l titoło novo, a meno che nó ła sia un rimando, e senpre che nó ła gabia na storia.
+Cuesto signifega che, se te fè un eror, te podi da novo rinominar na pàjina có 'l vecio titoło, ma nó te podi sovrascrìvar na pàjina xà existente.
 
 '''OCIO!'''
-Sto canbiamento drastico el podarìa dar problemi che no se se speta, specialmente se se trata de na pagina molto visità.
-Stà ben tento a le conseguense del spostamento, prima de farlo.",
+Sto canbiamento drastico el podarìa dar problemi che nó se se speta, spesalmente se se trata de na pàjina molto vixità.
+Stà ben tento a łe conseguense del spostamento, prima de farlo.",
 'movepagetext-noredirectfixer' => "Col modulo qua soto te podi rinominar na pagina, spostando anca tuta la so storia al titolo novo.
 El vecio titolo el deventarà automaticamente un rimando (redirect) che punta al titolo novo.
 Tiente in mente de controlar ben che no se crea [[Special:DoubleRedirects|dopi redirect]] o [[Special:BrokenRedirects|redirect interoti]].
@@ -2509,13 +2628,14 @@ Par piaser, métighe un titolo difarente.",
 
 La voxe specificà come destinassion "[[:$1]]" l\'esiste xà. Vóto scancełarla par proseguir con ło spostamento?',
 'delete_and_move_confirm' => 'Sì, scancèla la pagina',
-'delete_and_move_reason' => "Scancelà par spostar n'altra pagina a sto titolo",
+'delete_and_move_reason' => 'Scanselà par rendar posibiłe el spostamento da "[[$1]]"',
 'selfmove' => 'No se pol spostar, el titolo novo el xe conpagno del vecio.',
 'immobile-source-namespace' => 'No te pol spostar pàxene in tel namespace "$1"',
 'immobile-target-namespace' => 'No te pol spostar pàxene \'ntel namespace "$1"',
 'immobile-target-namespace-iw' => "El colegamento interwiki no'l xe na valida destinassion in do spostar na pàxena.",
 'immobile-source-page' => 'Sta pàxena no la pol vegner spostà.',
 'immobile-target-page' => 'No te pol spostar a sto titolo.',
+'bad-target-model' => 'Ła destinasion dexiderà ła dopara un modèl de contegnui difarente. Nò xe posibiłe convertir da $1 a $2.',
 'imagenocrossnamespace' => 'No se pol spostar un file verso un namespace diverso da quelo dei file.',
 'nonfile-cannot-move-to-file' => 'Tuto quel che no xe un file, no se pode spostarlo al namespace dei file.',
 'imagetypemismatch' => "L'estension nova del file no la corisponde mìa al tipo de file",
@@ -2537,9 +2657,11 @@ Questo el pode in seguito vegner inportà in te n\'altro wiki che dòpara el sof
 Par esportar le pàxene, scrivi i tìtoli in te la casèla qua soto, un tìtolo par riga, e selessiona se te voli la version ùltima con tute le version preçedenti e el storico de le modìfeghe, opure la version ùltima con solo le informassion de l\'ùltima modìfega.
 
 Nel secondo caso te poli anca doparar un colegamento, par esenpio [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] par la pàxena "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Esporta tute łe pàjine',
 'exportcuronly' => "Includi soło ła version attuałe, no l'intera cronołogia",
 'exportnohistory' => "----
 '''Ocio!''' Par motivi ligà a le prestazion del sistema xè stà disabiłità l'esportazion de tuta ła storia de łe pàxene fata co sto modulo.",
+'exportlistauthors' => "Includi 'l elenco conpleto de i contribudori pa' ogni pajina",
 'export-submit' => 'Esporta',
 'export-addcattext' => 'Zonta pagine da la categoria:',
 'export-addcat' => 'Zonta',
@@ -2572,6 +2694,8 @@ Par piaser visita [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
 'thumbnail_error' => 'Eror ne la creazion de la miniatura: $1',
 'djvu_page_error' => 'Nùmaro de pagina DjVu sbaglià',
 'djvu_no_xml' => "Inpossibile otegner l'XML par el file DjVu",
+'thumbnail-temp-create' => 'Inposibiłe crear el file tenporaneo de łe miniadure',
+'thumbnail-dest-create' => 'Inposibiłe salvar ła miniadura inte ła destinasion',
 'thumbnail_invalid_params' => 'Parametri anteprima mìa giusti',
 'thumbnail_dest_directory' => 'Inpossibile crear la directory de destinazion',
 'thumbnail_image-type' => 'Tipo de imagine mia suportà',
@@ -2589,6 +2713,7 @@ Tute łe operazion de inportazion trans-wiki łe xè notà nel [[Special:Log/imp
 'import-interwiki-templates' => 'Tira dentro tuti i modèi',
 'import-interwiki-submit' => 'Inporta',
 'import-interwiki-namespace' => 'Namespace de destinassion:',
+'import-interwiki-rootpage' => 'Pàjina prinsipałe de destinasion (opsionałe):',
 'import-upload-filename' => 'Nome del file:',
 'import-comment' => 'Comento:',
 'importtext' => "Se połe esportare el file da ła fonte wiki doparando ła [[Special:Export|funsion de esportasion]].
@@ -2616,6 +2741,15 @@ Salveło so'l to conpiuter e carghelo cuà.",
 'import-upload' => 'Carga dati XML',
 'import-token-mismatch' => "I dati relativi a la session i xe 'ndài persi. Par piaser, próa da novo.",
 'import-invalid-interwiki' => 'No se pode inportar da la wiki indicà.',
+'import-error-edit' => 'Ła pàjina "$1" nò ła xe sta inportà parché no te si autorixà a modifegarla.',
+'import-error-create' => 'Ła pàjina "$1" nò ła xe sta inportà parché no te si autorixà a crearla.',
+'import-error-interwiki' => 'Ła pàjina "$1" nò ła vien inportà parché el so nome el xe riservà pa\'l ligamento foresto (interwiki).',
+'import-error-special' => 'Ła pàjina "$1" nò ła vien inportà parché ła apartien a un namespace speciałe che nò \'l permete pàjine.',
+'import-error-invalid' => 'Ła pàjina "$1" nò ła vien inportà parché el so nome nò \'l xe vałido.',
+'import-error-unserialize' => 'Ła version $2 de ła pàjina "$1" nó ła pol esar de-seriałixà. Ła version ła xe sta segnałà par doparar el modèl de contegnùo $3 seriałixà cofà $4.',
+'import-options-wrong' => '{{PLURAL:$2|Opsion sbałià|Opsion sbałiae}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Ła pàjina prinsipałe fornia nó ła xe un titoło vałido.',
+'import-rootpage-nosubpage' => 'El namespace "$1" de ła pàjina prinsipałe nó \'l permete de \'ver sotopajine.',
 
 # Import log
 'importlogpage' => 'Inportassion',
@@ -2625,6 +2759,16 @@ Salveło so'l to conpiuter e carghelo cuà.",
 'import-logentry-interwiki' => 'gà trasferìo da altra wiki ła pàxena $1',
 'import-logentry-interwiki-detail' => '{{PLURAL:$1|una revixion importà|$1 revixion importae}} da $2',
 
+# JavaScriptTest
+'javascripttest' => 'Sperimentasion JavaScript',
+'javascripttest-title' => 'In execusion test par $1',
+'javascripttest-pagetext-noframework' => "Sta pàjina ła xe riservà a l'execusion de test de JavaScript.",
+'javascripttest-pagetext-unknownframework' => 'Framework de test sconosùo "$1".',
+'javascripttest-pagetext-frameworks' => "Par piasere, siełi uno de i seguenti framework pa' i test: $1",
+'javascripttest-pagetext-skins' => 'Siełi na skin có cui exeguir i test:',
+'javascripttest-qunit-intro' => 'Varda so mediawiki.org ła [$1 documentasion rivardante i test].',
+'javascripttest-qunit-heading' => 'Suite de test de JavaScript par QUnit in MediaWiki',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'La to pagina utente',
 'tooltip-pt-anonuserpage' => 'La pàxena utente de sto indirizo IP',
@@ -2685,6 +2829,8 @@ Salveło so'l to conpiuter e carghelo cuà.",
 'tooltip-diff' => 'Varda i canbiamenti fati al testo',
 'tooltip-compareselectedversions' => 'Varda le difarense tra le do version selessionà de sta pagina.',
 'tooltip-watch' => "Tien d'ocio sta pagina",
+'tooltip-watchlistedit-normal-submit' => 'Cava i titołi',
+'tooltip-watchlistedit-raw-submit' => "Axorna ła lista de łe tegnùe d'ocio",
 'tooltip-recreate' => 'Ricrea ła pàxena anca se la xè stà scancełà',
 'tooltip-upload' => 'Intaca el caricamento',
 'tooltip-rollback' => 'El "tira indrio" el desfa i canbiamenti a sta pagina fati de l\'ultimo che gà messo le mane.',
@@ -2715,9 +2861,11 @@ Questo xe probabilmente dovùo a la presenza de un colegamento a un sito foresto
 'spambot_username' => 'MediaWiki - sistema de rimozion del spam',
 'spam_reverting' => "Ripristinà l'ultima version priva de colegamenti a $1",
 'spam_blanking' => 'Pàxena svodà, tute łe version le contegneva cołegamenti a $1',
+'spam_deleting' => 'Pàjina scansełà, tute łe version łe contegneva ligamenti a $1',
 
 # Info page
 'pageinfo-title' => 'Informasion par "$1"',
+'pageinfo-not-current' => 'Ne disipiaxe, ma xe inposibiłe fornir sta informasion par vecie version.',
 'pageinfo-header-basic' => 'Informassion de base',
 'pageinfo-header-edits' => 'Storia dei canbiamenti',
 'pageinfo-header-restrictions' => 'Protession de la pagina',
@@ -2746,6 +2894,7 @@ Questo xe probabilmente dovùo a la presenza de un colegamento a un sito foresto
 'pageinfo-magic-words' => '{{PLURAL:$1|Parola magica|Parole magiche}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria sconta|Categorie sconte}} ($1)',
 'pageinfo-templates' => 'Template {{PLURAL:$1|incluso|inclusi}}  ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Pàjina incluxa|Pàjine incluxe}} so ($1)',
 'pageinfo-toolboxlink' => 'Informassion su sta pagina',
 'pageinfo-redirectsto' => 'La rimanda a',
 'pageinfo-redirectsto-info' => 'info',
@@ -2754,6 +2903,10 @@ Questo xe probabilmente dovùo a la presenza de un colegamento a un sito foresto
 'pageinfo-protect-cascading' => 'Protession ricorsiva da qua',
 'pageinfo-protect-cascading-yes' => 'Sì',
 'pageinfo-protect-cascading-from' => 'Protession ricorsiva eredità da',
+'pageinfo-category-info' => 'Informasion so ła categoria',
+'pageinfo-category-pages' => 'Nùmaro de pàjine',
+'pageinfo-category-subcats' => 'Nùmaro de sotocategorie',
+'pageinfo-category-files' => 'Nùmaro de file',
 
 # Patrolling
 'markaspatrolleddiff' => 'Segna la modifica come verificà',
@@ -2765,6 +2918,8 @@ Questo xe probabilmente dovùo a la presenza de un colegamento a un sito foresto
 'markedaspatrollederror' => 'No se pol contrassegnar ła voxe come verificà',
 'markedaspatrollederrortext' => 'Bisogna speçificare na revixion da contrassegnar come verificà.',
 'markedaspatrollederror-noautopatrol' => 'No te ghè i parmessi necessari par segnar le to stesse modifiche come verificàe.',
+'markedaspatrollednotify' => 'Ła modifega a $1 ła xe sta segnà come verifegà.',
+'markedaspatrollederrornotify' => 'Eror durante ła verifega.',
 
 # Patrol log
 'patrol-log-page' => 'Modifiche verificàe',
@@ -2794,15 +2949,22 @@ La so esecuzion la podarìa danegiar el to computer.",
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pagina|pagine}}',
 'file-info' => 'Dimensioni: $1, tipo MIME: $2',
 'file-info-size' => '$1 × $2 pixel, dimension del file: $3, tipo MIME: $4',
+'file-info-size-pages' => '$1 × $2 pixel, dimension del file: $3, tipo MIME: $4, $5 {{PLURAL:$5|pàjina|pàjine}}',
 'file-nohires' => 'No ghe xe version a risolussion pì granda.',
 'svg-long-desc' => 'file en formato SVG, dimension nominałi $1 × $2 pixel, dimension del file: $3',
+'svg-long-desc-animated' => 'file in formato SVG animà, dimension nominałi $1 × $2 pixel, dimension del file: $3',
+'svg-long-error' => 'File SVG mìa valido: $1',
 'show-big-image' => 'Version ad alta risołusion',
+'show-big-image-preview' => 'Dimension de sta anteprima: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Altra risołusion|Altre risołusion}}: $1.',
 'show-big-image-size' => '$1 × $2 pixel',
 'file-info-gif-looped' => 'ripetù',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|frame|frame}}',
 'file-info-png-looped' => 'ripetù',
 'file-info-png-repeat' => 'ripetù $1 {{PLURAL:$1|olta|olte}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|fotograma|fotogrami}}',
+'file-no-thumb-animation' => "'''Nota: a cauxa de limitasion teniche, łe miniadure de sto file nó łe sarà animae.'''",
+'file-no-thumb-animation-gif' => "'''Nota: a cauxa de limitasion teniche, łe miniadure de łe imaxeni GIF a alta risołusion come cuesta nó łe sarà animae.'''",
 
 # Special:NewFiles
 'newimages' => 'Galeria dei file novi',
@@ -2821,6 +2983,8 @@ La so esecuzion la podarìa danegiar el to computer.",
 'minutes' => '{{PLURAL:$1|un minuto|$1 minuti}}',
 'hours' => "{{PLURAL:$1|un'ora|$1 ore}}",
 'days' => '{{PLURAL:$1|un zorno|$1 zorni}}',
+'months' => '{{PLURAL:$1|$1 mexe|$1 mexi}}',
+'years' => '{{PLURAL:$1|$1 ano|$1 ani}}',
 'ago' => '$1 fa',
 'just-now' => 'giusto desso',
 
@@ -2964,10 +3128,79 @@ I colegamenti dopo, su la stessa riga, i xe considerai come ecession (cioè, pag
 'exif-gpsareainformation' => 'Nome de ła xòna GPS',
 'exif-gpsdatestamp' => 'Data GPS',
 'exif-gpsdifferential' => 'Corezion diferensiałe GPS',
+'exif-jpegfilecomment' => 'Comento del file JPEG',
+'exif-keywords' => 'Parołe ciave',
+'exif-worldregioncreated' => "Rejon del Mondo in cui l'imaxene ła xe sta fata",
+'exif-countrycreated' => 'Paexe dove xe sta fata ła someja',
+'exif-countrycodecreated' => "Còdexe del paexe 'ndove xe sta fata ła someja",
+'exif-provinceorstatecreated' => "Provincia o stato 'ndove xe sta fata ła someja",
+'exif-citycreated' => "Sità 'ndove xe sta fata ła someja",
+'exif-sublocationcreated' => 'Parte de ła sità in cui xe sta fata ła someja',
+'exif-worldregiondest' => 'Rejon del Mondo mostrà',
+'exif-countrydest' => 'Paexe mostrà',
+'exif-countrycodedest' => 'Còdexe del Paexe mostrà',
+'exif-provinceorstatedest' => 'Provincia o stato mostrà',
+'exif-citydest' => 'Sità mostrà',
+'exif-sublocationdest' => 'Parte de ła sità mostrà',
 'exif-objectname' => 'Titoło curto',
+'exif-specialinstructions' => 'Istrusion speciałi',
+'exif-headline' => 'Titoło',
+'exif-credit' => 'Crediti',
+'exif-source' => 'Fonte',
+'exif-editstatus' => "Stato de edision de l'imaxene",
+'exif-urgency' => 'Urgensa',
+'exif-fixtureidentifier' => 'Nome del riferimento',
+'exif-locationdest' => 'Locałità rafegurà',
+'exif-locationdestcode' => 'Còdexe del liogo rafegurà',
+'exif-objectcycle' => "Momento del xorno pa'l cuałe el medium el xe progetà",
+'exif-contact' => 'Informasion de contato',
+'exif-writer' => 'Scritor',
+'exif-languagecode' => 'Léngua',
+'exif-iimversion' => 'Version IIM',
+'exif-iimcategory' => 'Categoria',
+'exif-iimsupplementalcategory' => 'Categorie xontive',
+'exif-datetimeexpires' => 'Nó doparar dopo',
+'exif-datetimereleased' => 'Rełasà el',
+'exif-originaltransmissionref' => 'Còdexe del liogo de trasmision orixenaria',
+'exif-identifier' => 'Identifegativo',
+'exif-lens' => 'Lente doparà',
+'exif-serialnumber' => 'Nùmaro de serie de ła fotocamera',
+'exif-cameraownername' => 'Paron de ła fotocamera',
+'exif-label' => 'Eticheta',
+'exif-datetimemetadata' => "Data in cui i metadata i xe stai modifegai l'ultema volta",
+'exif-nickname' => "Nome informałe de l'imaxene",
+'exif-rating' => 'Vałutasion (so 5)',
+'exif-rightscertificate' => 'Certificato de gestion de i diriti',
+'exif-copyrighted' => "Informasion so'l copyright",
+'exif-copyrightowner' => 'Detentor del copyright',
+'exif-usageterms' => "Termini d'utiłixo",
+'exif-webstatement' => 'Dichiarasion online de copyright',
+'exif-originaldocumentid' => 'ID univoco del documento orixenałe',
+'exif-licenseurl' => 'URL par ła licensa del copyright',
+'exif-morepermissionsurl' => 'Informasion so łe license alternadive',
+'exif-attributionurl' => "Pa'l riutiłixo de sta òpara, se prega de inserir un ligamento ipertestuałe a",
+'exif-preferredattributionname' => "Pa'l riutiłixo de sta òpara, se prega de atribuighine ła paternidà a",
+'exif-pngfilecomment' => 'Comento del file PNG',
+'exif-disclaimer' => 'Avertense',
+'exif-contentwarning' => "Avixo so'l contegnùo",
+'exif-giffilecomment' => 'Comento del file GIF',
+'exif-intellectualgenre' => 'Tipo de elemento',
+'exif-subjectnewscode' => 'Còdexe del ogeto',
+'exif-scenecode' => 'Còdexe de sèna IPTC',
+'exif-event' => 'Evento rafegurà',
+'exif-organisationinimage' => 'Organixasion rafegurà',
+'exif-personinimage' => 'Persona rafegurà',
+'exif-originalimageheight' => "Altesa de l'imaxene prima che ła fuse tajà",
+'exif-originalimagewidth' => "Larghesa de l'imaxene prima che ła fuse tajà",
 
 # EXIF attributes
 'exif-compression-1' => 'No conpresso',
+'exif-compression-2' => 'CCITT grupo 3 monodimensionałe - codifega run length de Huffman modifegà',
+'exif-compression-3' => 'Codifega fax CCITT Group 3',
+'exif-compression-4' => 'Codifega fax CCITT gruppo 4',
+
+'exif-copyrighted-true' => 'Proteto da copyright',
+'exif-copyrighted-false' => 'Dominio pùblico',
 
 'exif-unknowndate' => 'Data sconossiùa',
 
@@ -2986,6 +3219,8 @@ I colegamenti dopo, su la stessa riga, i xe considerai come ecession (cioè, pag
 'exif-xyresolution-i' => '$1 punti par połiçe (dpi)',
 'exif-xyresolution-c' => '$1 punti par çentimetro (dpc)',
 
+'exif-colorspace-65535' => 'Nó całibrià',
+
 'exif-componentsconfiguration-0' => 'no esiste',
 
 'exif-exposureprogram-0' => 'Non definio',
@@ -3103,6 +3338,10 @@ I colegamenti dopo, su la stessa riga, i xe considerai come ecession (cioè, pag
 'exif-gpslongitude-e' => 'Longitudine Est',
 'exif-gpslongitude-w' => 'Longitudine Ovest',
 
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => "$1 {{PLURAL:$1|metro|metri}} so'l liveło del mar",
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|metro|metri}} soto el liveło del mar',
+
 'exif-gpsstatus-a' => 'Mixurassion in corso',
 'exif-gpsstatus-v' => 'Mixurassion interoperabiłe',
 
@@ -3119,10 +3358,59 @@ I colegamenti dopo, su la stessa riga, i xe considerai come ecession (cioè, pag
 'exif-gpsdestdistance-m' => 'Mija',
 'exif-gpsdestdistance-n' => 'Mija nàutiche',
 
+'exif-gpsdop-excellent' => 'Esełente ($1)',
+'exif-gpsdop-good' => 'Bon ($1)',
+'exif-gpsdop-moderate' => 'Moderà ($1)',
+'exif-gpsdop-fair' => 'Discreto ($1)',
+'exif-gpsdop-poor' => 'Scarso ($1)',
+
+'exif-objectcycle-a' => 'Soło che ła matina',
+'exif-objectcycle-p' => 'Soło che ła sera',
+'exif-objectcycle-b' => 'Matina e sera',
+
 # Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
 'exif-gpsdirection-t' => 'Diression reałe',
 'exif-gpsdirection-m' => 'Diression magnetica',
 
+'exif-ycbcrpositioning-1' => 'Centrà',
+'exif-ycbcrpositioning-2' => 'Co-situà',
+
+'exif-dc-contributor' => 'Cołaboradori',
+'exif-dc-coverage' => 'Anbito spasiałe o tenporałe de i media',
+'exif-dc-date' => 'Data (e)',
+'exif-dc-publisher' => 'Editor',
+'exif-dc-relation' => 'File ligai',
+'exif-dc-rights' => 'Diriti',
+'exif-dc-source' => 'Fonte del file',
+'exif-dc-type' => 'Tipo de file',
+
+'exif-rating-rejected' => 'Rifiutà',
+
+'exif-isospeedratings-overflow' => 'Maxor de 65535',
+
+'exif-iimcategory-ace' => 'Arte, cultura e spetacoło',
+'exif-iimcategory-clj' => 'Criminałità e dirito',
+'exif-iimcategory-dis' => 'Dixastri e insidenti',
+'exif-iimcategory-fin' => 'Economia e afari',
+'exif-iimcategory-edu' => 'Istrusion',
+'exif-iimcategory-evn' => 'Anbiente',
+'exif-iimcategory-hth' => 'Sałute',
+'exif-iimcategory-hum' => 'Interese uman',
+'exif-iimcategory-lab' => 'Laoro',
+'exif-iimcategory-lif' => 'Stiłe de vita e tenpo libaro',
+'exif-iimcategory-pol' => 'Pułitega',
+'exif-iimcategory-rel' => 'Rełijon e fè',
+'exif-iimcategory-sci' => 'Siensa e tenołoxia',
+'exif-iimcategory-soi' => 'Cuestion sociałi',
+'exif-iimcategory-spo' => 'Spor',
+'exif-iimcategory-war' => 'Guera, radeghi e dixordeni',
+'exif-iimcategory-wea' => 'Meteo',
+
+'exif-urgency-normal' => 'Normałe ($1)',
+'exif-urgency-low' => 'Basa ($1)',
+'exif-urgency-high' => 'Alta ($1)',
+'exif-urgency-other' => 'Priorità definie dal utente ($1)',
+
 # External editor support
 'edit-externally' => 'Modifega sto file usando on programa foresto',
 'edit-externally-help' => '(Par saverghene de pì consultare łe [//www.mediawiki.org/wiki/Manual:External_editors istrusion])',
@@ -3191,6 +3479,7 @@ El codexe de conferma el scadarà en automatego a łe $4.',
 # Scary transclusion
 'scarytranscludedisabled' => "[L'inclusion de pagine tra siti wiki no la xe ativa]",
 'scarytranscludefailed' => '[Inpossibile otegner el modèl $1]',
+'scarytranscludefailed-httpstatus' => '[Eror: inposibiłe otegner el modèl $1: HTTP $2]',
 'scarytranscludetoolong' => '[La URL la xe massa longa]',
 
 # Delete conflict
@@ -3198,6 +3487,8 @@ El codexe de conferma el scadarà en automatego a łe $4.',
 'confirmrecreate' => "L'utente [[User:$1|$1]] ([[User talk:$1|discussion]]) el ga scancełà sta voxe dopo che te ghè scuminsià a modificarla, con ła seguente motivazion:
 : ''$2''
 Par piaser, conferma che te vołi dal bon ricrear sta voxe.",
+'confirmrecreate-noreason' => 'El utente [[User:$1|$1]] ([[User talk:$1|discussion]]) el ga scansełà sta voxe dopo che te ghè scuminsià a modifegarla.
+Par piaser, conferma che te vołi dal bon ricrear sta voxe.',
 'recreate' => 'Ricrea',
 
 # action=purge
@@ -3207,7 +3498,9 @@ Par piaser, conferma che te vołi dal bon ricrear sta voxe.",
 
 # action=watch/unwatch
 'confirm-watch-button' => 'Va ben',
+'confirm-watch-top' => "Xonto sta pàjina a ła to lista de łe tegnùe d'ocio?",
 'confirm-unwatch-button' => 'Va ben',
+'confirm-unwatch-top' => "Cavo sta pàjina da ła to lista de łe tegnùe d'ocio?",
 
 # Multipage image navigation
 'imgmultipageprev' => '← la pagina prima',
@@ -3285,6 +3578,7 @@ Nota che te pol anca [[Special:EditWatchlist|modificar la lista con l'interfacia
 'version-specialpages' => 'Pagine speciali',
 'version-parserhooks' => 'Hook del parser',
 'version-variables' => 'Variabili',
+'version-antispam' => 'Prevension del spam',
 'version-skins' => 'Aspeto grafego',
 'version-other' => 'Altro',
 'version-mediahandlers' => 'Gestori de contenuti multimediài',
@@ -3298,6 +3592,7 @@ Nota che te pol anca [[Special:EditWatchlist|modificar la lista con l'interfacia
 'version-license' => 'Licensa',
 'version-poweredby-credits' => "Sta wiki la va con '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'altri',
+'version-credits-summary' => "Semo contenti de riconosare łe seguenti persone p' 'ver contribuio a [[Special:Version|MediaWiki]].",
 'version-license-info' => "MediaWiki xe un software lìbaro; te pol redistribuirlo e/o modificarlo secondo i termini de la Licensa Publica Zeneral GNU publicà da la Free Software Foundation; secondo la version 2 de la Licensa, o (a scelta tua) una qualunque altra version sucessiva.
 
 MediaWiki el xe distribuìo sperando che el possa vegner utile, ma SENSA NISSUNA GARANSIA; sensa gnanca la garansia inplicita de COMERCIALIZASSION o de ADATAMENTO A UN USO PARTICOLARE. Varda la Licensa Publica Zeneral GNU par ulteriori detagli.
@@ -3306,6 +3601,8 @@ Insieme co sto programa te dovaressi 'ver ricevùo na copia de la Licensa Public
 'version-software' => 'Software instalà',
 'version-software-product' => 'Prodoto',
 'version-software-version' => 'Version',
+'version-entrypoints' => 'URL de aceso',
+'version-entrypoints-header-entrypoint' => 'Punti de aceso',
 'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
@@ -3324,15 +3621,16 @@ Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tip
 'fileduplicatesearch-info' => '$1 × $2 pixel<br />Dimension: $3<br />Tipo MIME: $4',
 'fileduplicatesearch-result-1' => 'No ghe xe duplicati conpagni del file "$1".',
 'fileduplicatesearch-result-n' => 'Ghe xe {{PLURAL:$2|un duplicato conpagno|$2 duplicati conpagni}} al file "$1".',
+'fileduplicatesearch-noresults' => 'Nisun file de nome "$1" trovà.',
 
 # Special:SpecialPages
 'specialpages' => 'Pagine speciali',
 'specialpages-note' => '----
-* Pagine speciali normali.
-* <strong class="mw-specialpagerestricted">Pagine speciali ad acesso limità.</strong>',
+* Pàjine speciałi normałi.
+* <span class="mw-specialpagerestricted">Pàjine speciałi a aceso limità.</span>',
 'specialpages-group-maintenance' => 'Resoconti de manutenzion',
 'specialpages-group-other' => 'Altre pagine speciali',
-'specialpages-group-login' => 'Login / registrazion',
+'specialpages-group-login' => 'Login / registrasion',
 'specialpages-group-changes' => 'Ultime modifiche e registri',
 'specialpages-group-media' => 'Resoconti e caricamenti dei file multimediài',
 'specialpages-group-users' => 'Utenti e diriti',
@@ -3378,6 +3676,9 @@ Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tip
 'compare-rev1' => 'Revisión 1',
 'compare-rev2' => 'Revisión 2',
 'compare-submit' => 'Confronta',
+'compare-invalid-title' => "El titoło che te ghè indicà nó 'l xe mia valido.",
+'compare-title-not-exists' => "El titoło che te ghe spesifegà nó 'l existe.",
+'compare-revision-not-exists' => 'Ła revixion che te ghe spesifegà nó ła existe.',
 
 # Database error messages
 'dberr-header' => 'Sta wiki la ga un problema',
@@ -3430,23 +3731,77 @@ Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tip
 'logentry-move-move_redir-noredirect' => '$1 ga spostà la pajina $3 a $4 al posto de un rimando sensa metare un rimando',
 'logentry-patrol-patrol' => '$1 ga segnà la revixion $4 de la pajina $3 come verifegà',
 'logentry-patrol-patrol-auto' => '$1 ga segnà automategamente la revixion $4 de la pajina $3 come verifegà',
-'logentry-newusers-newusers' => '$1 ga creà na utensa',
-'logentry-newusers-create' => '$1 ga creà na utensa',
-'logentry-newusers-create2' => '$1 ga creà na utensa $3',
+'logentry-newusers-newusers' => "L'utensa $1 xe sta creà",
+'logentry-newusers-create' => "L'utensa $1 xe sta creà",
+'logentry-newusers-create2' => 'Lutensa $3 xe sta creà da $1',
 'logentry-newusers-autocreate' => "L'utensa $1 xè stà creà automategamente",
 'newuserlog-byemail' => 'password spedìa par e-mail',
+'logentry-rights-rights' => "$1 ga canbià l'apartenensa de $3 dal grupo $4 al grupo $5",
+'logentry-rights-rights-legacy' => "$1 ga canbià l'apartenensa a grupi de $3",
+'logentry-rights-autopromote' => '$1 xe stà automategamente promoso/a da $4 a $5',
 'rightsnone' => '(nissun)',
 
 # Feedback
+'feedback-bugornote' => 'Se se xe in grado de descrivare el problema tenico riscontrà in maniera precixa, [$1 segnałare el bug]. In alternadiva, se pol doparar el moduło senplifegà cuà soto. El comento inserio el sarà xontà a ła pàjina "[$3 $2]", insieme al propio nome utente.',
 'feedback-subject' => 'Ogeto:',
 'feedback-message' => 'Messajo:',
 'feedback-cancel' => 'Anuła',
+'feedback-submit' => 'Invia feedback',
+'feedback-adding' => 'Inserimento del feedback inte ła pàjina...',
+'feedback-error1' => 'Eror: Da ła API xe rivà un rexultà nó riconosùo',
+'feedback-error2' => 'Eror: Nó xe sta posibiłe exeguir ła modifega',
+'feedback-error3' => 'Errore: Nisuna risposta da ła API',
+'feedback-thanks' => 'Grasie! El to feedback el xe sta publicà a ła pàjina "[$2 $1]".',
 'feedback-close' => 'Fato',
+'feedback-bugcheck' => "Otimo! Verifega che nó 'l sia xà infrà i [$1 bug conosui].",
+'feedback-bugnew' => 'Controło efetuà. Segnała un novo bug',
 
 # Search suggestions
 'searchsuggest-search' => 'Serca',
 'searchsuggest-containing' => 'che contien...',
 
+# API errors
+'api-error-badaccess-groups' => 'Nó te si autorixà a cargar documenti so sta wiki.',
+'api-error-badtoken' => 'Eror interno: token fałà.',
+'api-error-copyuploaddisabled' => 'El cargamento tramite URL el xe dixabiłità so sto server.',
+'api-error-duplicate' => "So'l sito {{PLURAL:$1|ghe xe xà [$2 'n altro documento]|ghe xe xà [$2 altri documenti]}} có 'l steso contegnuo.",
+'api-error-duplicate-archive' => "{{PLURAL:$1|Ghe xera [$2 'n altro file]|Ghe xera [$2 altri file]}} xà inte'l sito có 'l steso contegnuo, ma {{PLURAL:$1|el xe sta scansełà|i xe stai scansełai}}.",
+'api-error-duplicate-archive-popup-title' => 'File duplic{{PLURAL:$1|à che xe xà sta scansełà|ai che i xe xà stai scansełai}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|documento duplicà|documenti duplicai}}',
+'api-error-empty-file' => 'El file sełesionà el gera vodo.',
+'api-error-emptypage' => 'Ła creasion de nove pàjine vode nó ła xe consentia.',
+'api-error-fetchfileerror' => 'Eror interno: ghe xe sta un problema durante el recupero del documento.',
+'api-error-fileexists-forbidden' => 'Un file de nome "$1" \'l existe xà e nò \'l pol esar sovrascrito.',
+'api-error-fileexists-shared-forbidden' => 'Un file de nome "$1" \'l existe xà inte\'l repository condivixo e nó \'l pol esar sovrascrito.',
+'api-error-file-too-large' => 'El file sełesionà el gera masa grando.',
+'api-error-filename-tooshort' => 'El nome del file el xe massa curto.',
+'api-error-filetype-banned' => 'Sto tipo de file el xe vietà.',
+'api-error-filetype-banned-type' => "$1 {{PLURAL:$4|nó 'l xe un tipo de file consentio|nó i xe tipi de file consentìi}}. {{PLURAL:$3|El tipo de file consentio el xe|I tipi de file consentìi i xe}} $2.",
+'api-error-filetype-missing' => "Al file ghe manca l'estension.",
+'api-error-hookaborted' => 'Ła modifega che te ghe proà a far ła xe sta interota da na estension.',
+'api-error-http' => 'Eror interno: inposibiłe conetarse al server.',
+'api-error-illegal-filename' => "El nome del file nó 'l xe parmeso.",
+'api-error-internal-error' => "Eror interno: calcosa xe ndà storo có l'elaborasion del to cargamento so ła wiki.",
+'api-error-invalid-file-key' => 'Eror interno: file nó prexente inte ła carteła de i file tenporanei.',
+'api-error-missingparam' => 'Eror interno: parametri de ła dimanda mancanti.',
+'api-error-missingresult' => 'Eror interno: inposibiłe determinar se ła copia ła xe riusia.',
+'api-error-mustbeloggedin' => "Te ghe da efetuar 'l aceso par cargar i file.",
+'api-error-mustbeposted' => 'Eror interno: ła dimanda dimanda HTTP POST.',
+'api-error-noimageinfo' => "El cargamento el xe riusio, ma 'l server nó el ne ga dato gnauna informasion so'l file.",
+'api-error-nomodule' => 'Eror interno: nó xe sta inpostà el moduło de cargamento.',
+'api-error-ok-but-empty' => 'Eror interno: nisuna risposta dal server.',
+'api-error-overwrite' => 'Nó xe parmeso de sorascrìvar un file existente.',
+'api-error-stashfailed' => "Eror interno: el server nó 'l xe riusio a memorixar el documento tenporaneo.",
+'api-error-publishfailed' => "Eror interno: el server nó 'l xe riusio a publicar el documento tenporaneo.",
+'api-error-timeout' => "El server nó 'l ga risposto entro el tenpo previsto.",
+'api-error-unclassified' => 'Se gà verifegà un eror sconosùo.',
+'api-error-unknown-code' => 'Eror sconosùo: "$1"',
+'api-error-unknown-error' => 'Eror interno: calcosa xe ndà storto có se jera drio proar a cargar el file.',
+'api-error-unknown-warning' => 'Avixo sconosùo: "$1".',
+'api-error-unknownerror' => 'Eror sconosùo: "$1".',
+'api-error-uploaddisabled' => 'El cargamento el xe dixabiłità so sta wiki.',
+'api-error-verification-error' => "Sto file el podaria esar danegià, o 'ver l'estension sbałià.",
+
 # Durations
 'duration-seconds' => '$1 {{PLURAL:$1|secondo|secondi}}',
 'duration-minutes' => '$1 {{PLURAL:$1|minuto|minuti}}',
index 4052825..e2b618d 100644 (file)
@@ -328,7 +328,7 @@ $messages = array(
 'tog-externaleditor' => 'Mặc định dùng trình soạn thảo bên ngoài (chỉ dành cho người thành thạo, cần thiết lập đặc biệt trên máy tính của bạn; [//www.mediawiki.org/wiki/Manual:External_editors?uselang=vi chi tiết])',
 'tog-externaldiff' => 'Mặc định dùng trình so sánh bên ngoài (chỉ dành cho người thành thạo, cần thiết lập đặc biệt trên máy tính của bạn; [//www.mediawiki.org/wiki/Manual:External_editors?uselang=vi chi tiết])',
 'tog-showjumplinks' => 'Bật liên kết “bước tới” trên đầu trang cho bộ trình duyệt thuần văn bản hay âm thanh',
-'tog-uselivepreview' => 'Xem thử trực tiếp (cần JavaScript)',
+'tog-uselivepreview' => 'Xem thử trực tiếp (JavaScript; chưa ổn định)',
 'tog-forceeditsummary' => 'Nhắc tôi khi tôi quên tóm lược sửa đổi',
 'tog-watchlisthideown' => 'Ẩn các sửa đổi của tôi khỏi danh sách theo dõi',
 'tog-watchlisthidebots' => 'Ẩn các sửa đổi của robot khỏi danh sách theo dõi',
@@ -2455,9 +2455,9 @@ hiện tại của trang '''$1''':",
 Đây là trạng thái hiện tại của trang '''$1''':",
 'protect-cascadeon' => 'Trang này hiện bị khóa vì nó được nhúng vào {{PLURAL:$1|những trang|trang}} dưới đây bị khóa với tùy chọn “khóa theo tầng” được kích hoạt. Bạn có thể đổi mức độ khóa của trang này, nhưng nó sẽ không ảnh hưởng đến việc khóa theo tầng.',
 'protect-default' => 'Cho phép mọi thành viên',
-'protect-fallback' => 'Cần quyền “$1”',
-'protect-level-autoconfirmed' => 'Cấm thành viên mới và người dùng chưa mở tài khoản',
-'protect-level-sysop' => 'Cấm mọi thành viên (trừ bảo quản viên)',
+'protect-fallback' => 'Chỉ cho phép những người dùng có quyền “$1”',
+'protect-level-autoconfirmed' => 'Chỉ cho phép các thành viên tự động xác nhận',
+'protect-level-sysop' => 'Chỉ cho phép các bảo quản viên',
 'protect-summary-cascade' => 'khóa theo tầng',
 'protect-expiring' => 'hết hạn $1 (UTC)',
 'protect-expiring-local' => 'hết hạn $1',
@@ -2756,7 +2756,7 @@ Bạn có thể cập nhật tự động các trang đổi hướng đến tên
 Nếu bạn chọn không cập nhật, hãy nhớ kiểm tra [[Special:DoubleRedirects|đổi hướng kép]] hoặc [[Special:BrokenRedirects|đổi hướng đến trang không tồn tại]].
 Bạn phải chịu trách nhiệm đảm bảo các liên kết đó tiếp tục trỏ đến nơi chúng cần đến.
 
-Chú ý rằng trang sẽ '''không''' bị di chuyển nếu đã có một trang tại tên mới, trừ khi nó rỗng hoặc là trang đổi hướng và không có lịch sử sửa đổi trước đây.
+Chú ý rằng trang sẽ '''không''' bị di chuyển nếu đã có một trang tại tên mới, trừ khi nó là trang đổi hướng và không có lịch sử sửa đổi trước đây.
 Điều này có nghĩa là bạn có thể đổi tên trang lại như cũ nếu bạn có nhầm lẫn, và bạn không thể ghi đè lên một trang đã có sẵn.
 
 '''CẢNH BÁO!'''
index 58893e6..895d82e 100644 (file)
@@ -445,9 +445,11 @@ Proovvi lizät etsün alkuu ''all:'', nii ettsü etsib kõikkõõ sisältoo (taa
 'grouppage-user' => '{{ns:project}}:Сäüttijäd',
 'grouppage-sysop' => '{{ns:project}}:Praviťeľad',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Uuvvõd cäüttijäd',
+
 # User rights log
 'rightslog' => 'Cäütteminõikuslogi',
-'rightsnone' => '(eb õõ)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'muutu sitä cülciä',
@@ -598,9 +600,6 @@ Seness [$2 kuvauhsõ lehocülless] informaattsija on alapallõ annõttu.',
 # Special:ListUsers
 'listusers-submit' => 'Näüt väľľää',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Uuvvõd cäüttijäd',
-
 # Special:ListGroupRights
 'listgrouprights-members' => '(selttsilainspiiska)',
 
@@ -963,6 +962,9 @@ Kui faili on muutõttu, siiz detaaľid võivad õlla kahõllaizõd muutõtull fa
 # HTML forms
 'htmlform-selectorother-other' => 'Muu',
 
+# New logging system
+'rightsnone' => '(eb õõ)',
+
 # Feedback
 'feedback-message' => 'Ilmottamin:',
 'feedback-cancel' => 'Otmeńoit',
index d15992a..2deb341 100644 (file)
@@ -458,6 +458,9 @@ $messages = array(
 'grouppage-user' => '{{ns:project}}:მახვარებუეფ',
 'grouppage-sysop' => '{{ns:project}}:ხემანჯღვერეფი',
 
+# Special:Log/newusers
+'newuserlogpage' => 'მახვარებუშ რეგისტრაციაშ ჟურნალ',
+
 # User rights log
 'rightslog' => 'მახვარებუშ ნებეფიშ ჟურნალ',
 
@@ -600,9 +603,6 @@ $messages = array(
 'linksearch' => 'გალენ რცხიეფ',
 'linksearch-line' => '$1 მერცხიილი რე $2-შე',
 
-# Special:Log/newusers
-'newuserlogpage' => 'მახვარებუშ რეგისტრაციაშ ჟურნალ',
-
 # Special:ListGroupRights
 'listgrouprights-members' => '(მაკათურეფიშ ერკებული)',
 
index 4813332..b11e2d0 100644 (file)
@@ -215,7 +215,7 @@ $messages = array(
 'tog-externaldiff' => 'ניצן א דרויסנדיגן פֿאַרגלײַכער גרונטלעך (נאר פֿאר מומחים, דאס פֿאדערט באזונדערע קאמפיוטער שטעלונגען)
 [//www.mediawiki.org/wiki/Manual:External_editors ווײַטערע אינפֿארמאַציע.]',
 'tog-showjumplinks' => 'באמעגלעך צוטריט לינקס פון "שפרינג צו"',
-'tog-uselivepreview' => '×\91×\90× ×\95צ×\98 ×\96×\99×\9a ×\9e×\99×\98 ×\96×\90פ×\90ר×\98×\9f ×¤×\90ר×\90×\95×\99סק×\95ק (JavaScript)',
+'tog-uselivepreview' => '×\91×\90× ×\95צ×\98 ×\96×\99×\9a ×\9e×\99×\98 ×\9c×\99×\99×\95×\95 ×¤×\90ר×\90×\95×\99ס×\93×\99×\92×¢ ×\95×\95×\99×\99×\96×\95× ×\92 (JavaScript) (עקספ×\99רענ×\9e×¢×\98×\9c)',
 'tog-forceeditsummary' => 'ווארן מיך ווען איך לייג א ליידיג קורץ ווארט ענדערונג',
 'tog-watchlisthideown' => 'באהאלט מיינע ענדערונגען פון דער אויפפאסן ליסטע',
 'tog-watchlisthidebots' => 'באהאלט באט עדיטס פון אויפפאסן ליסטע',
index 7d1ca57..6157330 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author A911504820
  * @author Alebcay
  * @author Anakmalaysia
  * @author Arlin
@@ -16,6 +17,7 @@
  * @author Chenxiaoqino
  * @author Chenzw
  * @author Chinalace
+ * @author Cicku
  * @author Dimension
  * @author Dingyuang
  * @author Fantasticfears
@@ -366,7 +368,7 @@ $messages = array(
 'tog-minordefault' => '默认标记编辑为小编辑',
 'tog-previewontop' => '在编辑框上方显示预览',
 'tog-previewonfirst' => '首次编辑时显示预览',
-'tog-nocache' => '用浏览器页面缓存',
+'tog-nocache' => '用浏览器页面缓存',
 'tog-enotifwatchlistpages' => '当我的监视列表中的页面或文件更改时发送电子邮件通知我',
 'tog-enotifusertalkpages' => '当我的讨论页更改时发送电子邮件通知我',
 'tog-enotifminoredits' => '当页面和文件有小编辑时发送电子邮件通知我',
@@ -377,7 +379,7 @@ $messages = array(
 'tog-externaleditor' => '默认使用外部编辑器(供高级用户使用,需要在您的计算机上作出一些特别设置。[//www.mediawiki.org/wiki/Manual:External_editors 更多信息。])',
 'tog-externaldiff' => '默认使用外部差异分析(供高级用户使用,需要在您的计算机上作出一些特别设置。[//www.mediawiki.org/wiki/Manual:External_editors 更多信息。])',
 'tog-showjumplinks' => '启用“跳转到”访问链接',
-'tog-uselivepreview' => '使用实时预览(需要Javascript)(试验中)',
+'tog-uselivepreview' => '使用实时预览(需要 Javascript 支持)(实验功能)',
 'tog-forceeditsummary' => '未输入编辑摘要时提醒我',
 'tog-watchlisthideown' => '在监视列表中隐藏我的编辑',
 'tog-watchlisthidebots' => '在监视列表中隐藏机器人的编辑',
@@ -386,7 +388,7 @@ $messages = array(
 'tog-watchlisthideanons' => '在监视列表中隐藏匿名用户',
 'tog-watchlisthidepatrolled' => '在监视列表中隐藏已巡查的编辑',
 'tog-ccmeonemails' => '把我给其他用户发送的电子邮件的副本发送给我',
-'tog-diffonly' => '比较差异时不显示页面内容',
+'tog-diffonly' => '对比差异时不显示页面内容',
 'tog-showhiddencats' => '显示隐藏分类',
 'tog-noconvertlink' => '停用链接文字转换',
 'tog-norollbackdiff' => '执行回退后不显示差异',
@@ -478,6 +480,7 @@ $messages = array(
 'newwindow' => '(将于新窗口中打开)',
 'cancel' => '取消',
 'moredotdotdot' => '更多',
+'morenotlisted' => '更多未被列出...',
 'mypage' => '页面',
 'mytalk' => '讨论',
 'anontalk' => '该IP地址的讨论',
@@ -597,7 +600,7 @@ $1',
 'privacypage' => 'Project:隐私权政策',
 
 'badaccess' => '权限错误',
-'badaccess-group0' => '你被禁止执行你刚才请求的操作。',
+'badaccess-group0' => '您被禁止执行您刚才请求的操作。',
 'badaccess-groups' => '您刚才请求的操作只有{{PLURAL:$2|这个用户组|以下用户组}}中的用户才能使用: $1',
 
 'versionrequired' => '需要版本为$1的MediaWiki',
@@ -606,14 +609,14 @@ $1',
 
 'ok' => '确定',
 'retrievedfrom' => '来自“$1”',
-'youhavenewmessages' => '有$1($2)。',
+'youhavenewmessages' => '有$1($2)。',
 'newmessageslink' => '新信息',
 'newmessagesdifflink' => '最后更改',
-'youhavenewmessagesfromusers' => '有来自{{PLURAL:$3| 另一位用户| $3位用户}}的$1($2)。',
-'youhavenewmessagesmanyusers' => '有来自多位用户的$1($2)。',
+'youhavenewmessagesfromusers' => '有来自{{PLURAL:$3| 另一位用户| $3位用户}}的$1($2)。',
+'youhavenewmessagesmanyusers' => '有来自多位用户的$1($2)。',
 'newmessageslinkplural' => '{{PLURAL:$1|一条新信息|新信息}}',
 'newmessagesdifflinkplural' => '最新{{PLURAL:$1|更改}}',
-'youhavenewmessagesmulti' => '在$1有新信息',
+'youhavenewmessagesmulti' => '在$1有新信息',
 'editsection' => '编辑',
 'editold' => '编辑',
 'viewsourceold' => '查看源代码',
@@ -653,7 +656,7 @@ $1',
 
 # Main script and global functions
 'nosuchaction' => '这个命令不存在',
-'nosuchactiontext' => 'URL指定的命令无效。你可能误输入了URL地址,或者点击了错误的链接。这一错误亦有可能是由{{SITENAME}}所使用软件自身的错误导致的。',
+'nosuchactiontext' => 'URL 指定的命令无效。您可能误输入了 URL 地址,或者点击了错误的链接。这一错误也有可能是由{{SITENAME}}所使用软件自身的错误导致的。',
 'nosuchspecialpage' => '此特殊页面不存在',
 'nospecialpagetext' => '<strong>您请求的特殊页面无效。</strong>
 
@@ -737,8 +740,8 @@ $2',
 执行锁定的管理员给出如下解释:$3。',
 'invalidtitle-knownnamespace' => '使用名字空间“$2”和文本“$3”的无效标题',
 'invalidtitle-unknownnamespace' => '使用未知名字空间编号$1和文本“$2”的无效标题',
-'exception-nologin' => '未登陆',
-'exception-nologin-text' => '此动作需要先登陆到此 wiki',
+'exception-nologin' => '尚未登录',
+'exception-nologin-text' => '此操作需要您先登录。',
 
 # Virus scanner
 'virus-badscanner' => "错误的配置:未知的病毒扫描程序:''$1''",
@@ -750,19 +753,19 @@ $2',
 
 您可以继续以匿名方式使用{{SITENAME}},或再次以相同或不同用户身份<span class='plainlinks'>[$1 登录]</span>。请注意一些页面可能仍然显示您为登录状态,直到您清空您的浏览器缓存为止。",
 'welcomeuser' => '欢迎,$1!',
-'welcomecreation-msg' => '你的账户已创建。
-请别忘记更改你的[[Special:Preferences|{{SITENAME}}参数设置]]。',
+'welcomecreation-msg' => '您的帐户已创建。
+请不要忘记更改您的[[Special:Preferences|{{SITENAME}}个人设置]]。',
 'yourname' => '用户名:',
 'yourpassword' => '密码:',
 'yourpasswordagain' => '再次输入密码:',
-'remembermypassword' => '在此浏览器上保留我的登录信息(最长$1{{PLURAL:$1|日|日}})',
-'securelogin-stick-https' => '登后继续使用 HTTPS 连接',
+'remembermypassword' => '自动登录(最长$1{{PLURAL:$1|天|天}})',
+'securelogin-stick-https' => '登后继续使用 HTTPS 连接',
 'yourdomainname' => '您的域名:',
-'password-change-forbidden' => '您不能更改此wiki上的密码。',
+'password-change-forbidden' => '您不能在此 wiki 上修改密码。',
 'externaldberror' => '这可能是由于验证数据库错误或您被禁止更新您的外部账号。',
 'login' => '登录',
 'nav-login-createaccount' => '登录/创建账户',
-'loginprompt' => '你必须启用Cookies才能登录{{SITENAME}}。',
+'loginprompt' => '您必须启用 Cookies 才能登录{{SITENAME}}。',
 'userlogin' => '登录/创建账户',
 'userloginnocreate' => '登录',
 'logout' => '退出',
@@ -773,25 +776,25 @@ $2',
 'createaccount' => '创建账户',
 'gotaccount' => '已经拥有账户?请$1。',
 'gotaccountlink' => '登录',
-'userlogin-resetlink' => '忘记了的登录信息?',
+'userlogin-resetlink' => '忘记了的登录信息?',
 'createaccountmail' => '通过电子邮件',
 'createaccountreason' => '原因:',
 'badretype' => '您所输入的密码并不相同。',
 'userexists' => '用户名已存在,请使用其他名称。',
 'loginerror' => '登录错误',
 'createaccounterror' => '无法建立账户:$1',
-'nocookiesnew' => '已成功创建新账户!侦测到您已关闭Cookies,请开启它并登录。',
-'nocookieslogin' => '本站å\88©ç\94¨Cookiesè¿\9bè¡\8cç\94¨æ\88·ç\99»å½\95ï¼\8c侦æµ\8bå\88°æ\82¨å·²å\85³é\97­Cookiesï¼\8c请å¼\80å\90¯å®\83并é\87\8dæ\96°ç\99»å½\95ã\80\82',
-'nocookiesfornew' => 'è¿\99ä½\8dç\94¨æ\88·ç\9a\84è´¦æ\88·æ\9cªå»ºç«\8bï¼\8c我们不能确认它的来源。
-请è\82¯å®\9aæ\82¨å·²ç»\8få¼\80å\90¯ cookiesï¼\8cé\87\8dè½½å\90\8eå\86\8dè¯\95ã\80\82',
-'noname' => '没有输入有效的用户名。',
+'nocookiesnew' => '已成功创建新账户!检测到您已禁用 Cookies,请先启用然后登录。',
+'nocookieslogin' => '本站使ç\94¨ Cookies è¿\9bè¡\8cç\99»å½\95ï¼\8cæ£\80æµ\8bå\88°æ\82¨å·²ç¦\81ç\94¨ Cookiesï¼\8c请å\85\88å\90¯ç\94¨ç\84¶å\90\8eé\87\8dè¯\95ã\80\82',
+'nocookiesfornew' => '该ç\94¨æ\88·è´¦æ\88·å°\9aæ\9cªå\88\9b建ï¼\8cå\9b ä¸º我们不能确认它的来源。
+请ç¡®ä¿\9dæ\82¨å·²ç»\8få\90¯ç\94¨ Cookiesï¼\8cå\88·æ\96°æ\9c¬é¡µå\90\8eé\87\8dè¯\95ã\80\82',
+'noname' => '没有输入有效的用户名。',
 'loginsuccesstitle' => '登录成功',
 'loginsuccess' => "'''“$1”,欢迎登录{{SITENAME}}。'''",
-'nosuchuser' => '找不到用户“$1”。用户名是大小写敏感且区分繁简体的。请检查您的拼写,或者[[Special:UserLogin/signup|建立一个新账户]]。',
-'nosuchusershort' => '没æ\9c\89å\90\8d为â\80\9c$1â\80\9dç\9a\84ç\94¨æ\88·ã\80\82请æ£\80æ\9f¥æ\82¨è¾\93å\85¥ç\9a\84æ\96\87å­\97是否有错误。',
-'nouserspecified' => '需要指定一个用户名。',
+'nosuchuser' => '找不到用户“$1”。用户名对大小写和繁简体是区分的。请检查您的拼写是否有错误,或者[[Special:UserLogin/signup|注册]]。',
+'nosuchusershort' => 'æ\89¾ä¸\8då\88°ç\94¨æ\88·â\80\9c$1â\80\9dã\80\82请æ£\80æ\9f¥æ\82¨ç\9a\84æ\8b¼å\86\99是否有错误。',
+'nouserspecified' => '需要指定一个用户名。',
 'login-userblocked' => '该用户已被封禁,禁止登录。',
-'wrongpassword' => '您输入的密码错误,请再试一次。',
+'wrongpassword' => '密码错误,请重试。',
 'wrongpasswordempty' => '您没有输入密码,请重试!',
 'passwordtooshort' => '您的密码至少需要$1个字符。',
 'password-name-match' => '您的密码必须和您的用户名不相同。',
@@ -809,13 +812,13 @@ $2',
 'noemailcreate' => '您需要提供一个有效的电子邮件地址',
 'passwordsent' => '用户"$1"的新密码已经寄往所登记的电子邮件地址。
 请在收到后再登录。',
-'blocked-mailpassword' => '您的IP地址已被禁止编辑,同时为了防止密码恢复功能被滥用,亦已禁用该功能。',
+'blocked-mailpassword' => '您的 IP 地址已被禁止编辑,同时为了防止密码恢复功能被滥用,已禁用该功能。',
 'eauthentsent' => '一封确认信已经发送到推荐的地址。在发送其它邮件到此账户前,您必须首先依照这封信中的指导确认这个电子邮箱真实有效。',
 'throttled-mailpassword' => '密码提醒已在最近$1小时内发送。为了安全起见,在每$1小时内只能发送一个密码提醒。',
 'mailerror' => '发送邮件错误:$1',
-'acct_creation_throttle_hit' => '抱歉!您已经创建了$1个账号。你不能再创建了。',
+'acct_creation_throttle_hit' => '抱歉!您已经创建了$1个账号,已经达到最大允许注册数量。目前使用本 IP 的来访者将不能再创建任何账户。',
 'emailauthenticated' => '您的电子邮箱地址已经于$2 $3确认有效。',
-'emailnotauthenticated' => '您的邮箱地址<strong>还没被认证</strong>。以下功能将不会发送任何邮件。',
+'emailnotauthenticated' => '您的邮箱地址<strong>尚未被认证</strong>。下列功能将不会发送任何邮件。',
 'noemailprefs' => '指定一个电子邮箱地址以使用此功能。',
 'emailconfirmlink' => '确认您的邮箱地址',
 'invalidemailaddress' => '邮箱地址格式不正确,请输入正确的邮箱地址或清空该输入框。',
@@ -828,15 +831,16 @@ $2',
 
 如果该账户创建错误的话,您可以忽略此信息。',
 'usernamehasherror' => '用户名中不可包含哈希(hash)字符',
-'login-throttled' => '您已经尝试多次的登录动作
-请稍ç­\89å¤\9aä¸\80ä¼\9aå\86\8dè¯\95ã\80\82',
-'login-abort-generic' => 'ç\99»å\85¥å¤±è´¥ - æ\94¾å¼\83',
+'login-throttled' => '您最近已经尝试多次登录
+请稍å\90\8eé\87\8dè¯\95ã\80\82',
+'login-abort-generic' => 'ç\99»å½\95失败 - å·²ç»\88æ­¢',
 'loginlanguagelabel' => '语言:$1',
-'suspicious-userlogout' => '登出要求被拒绝,因为它似乎是由有设计缺陷的浏览器或缓存代理发出的。',
+'suspicious-userlogout' => '注销请求被拒绝,因为它似乎是由有设计缺陷的浏览器或缓存代理发出的。',
 
 # E-mail sending
 'php-mail-error-unknown' => '在 PHP 的 mail() 函数中的未知错误',
 'user-mail-no-addy' => '尝试发送邮件而不附带电子邮件地址。',
+'user-mail-no-body' => '试图发送空的或者主体短得不合理的电子邮件。',
 
 # Change password dialog
 'resetpass' => '更改密码',
@@ -857,7 +861,7 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => '重置密码',
-'passwordreset-text' => '完成此表格以接收一个电邮以提示你的帐户详情。',
+'passwordreset-text' => '完成此表格以接收一封包含您的帐户详情的提醒邮件。',
 'passwordreset-legend' => '重置密码',
 'passwordreset-disabled' => '此wiki已经禁用密码重置。',
 'passwordreset-pretext' => '{{PLURAL:$1||输入下面的数据块之一}}',
@@ -867,16 +871,16 @@ $2',
 'passwordreset-capture-help' => '如果您选中此框,电子邮件(包括临时密码)将显示,并发送给用户。',
 'passwordreset-email' => '电子邮件地址:',
 'passwordreset-emailtitle' => '在 {{SITENAME}} 的帐户详细信息',
-'passwordreset-emailtext-ip' => '有人通过IP地址 $1 (也许是你)要求获取 {{SITENAME}} ($4)上相关账户的密码提示。{{PLURAL:$3|以下账户|此账户}}与该email地址关联:
+'passwordreset-emailtext-ip' => '有人通过IP地址 $1 (可能是您)请求获取 {{SITENAME}} ($4)上相关账户的密码提示。{{PLURAL:$3|以下账户|此账户}}与该电子邮件地址关联:
 
 $2
 
-{{PLURAL:$3|è¿\99个|è¿\99äº\9b}}临æ\97¶å¯\86ç \81ä¼\9aå\9c¨{{PLURAL:$5|ä¸\80天|$5 å¤©}}å\86\85è¿\87æ\9c\9fã\80\82请ç\8e°å\9c¨ç\99»å\85¥å¹¶è®¾ç½®æ\96°ç\9a\84å¯\86ç \81ã\80\82å¦\82æ\9e\9c请æ±\82æ\98¯å\85¶ä»\96人æ\8f\90å\87ºç\9a\84ï¼\8cæ\88\96è\80\85æ\82¨è®°èµ·ä½ ç\9a\84æ\97§å¯\86ç \81并ä¸\8då\86\8dé\9c\80è¦\81æ\9b´æ\94¹ï¼\8cæ\82¨å\8f¯ä»¥æ\97 è§\86æ\9c¬æ\9d¡æ¶\88æ\81¯å¹¶ç»§ç»­ä½¿ç\94¨æ\97§æ\9c\89密码。',
-'passwordreset-emailtext-user' => 'ç\94¨æ\88· $1 è¦\81æ±\82è\8e·å\8f\96 {{SITENAME}} ($4)ä¸\8aä½ ç\9a\84è´¦æ\88·ç\9a\84å¯\86ç \81æ\8f\90示ã\80\82{{PLURAL:$3|以ä¸\8bè´¦æ\88·|此账æ\88·}}ä¸\8e该email地址关联:
+{{PLURAL:$3|è¿\99个|è¿\99个}}临æ\97¶å¯\86ç \81å°\86ä¼\9aå\9c¨{{PLURAL:$5|ä¸\80天|$5 å¤©}}å\90\8eè¿\87æ\9c\9fã\80\82请ç«\8bå\8d³ç\99»å½\95并设置æ\96°ç\9a\84å¯\86ç \81ã\80\82å¦\82æ\9e\9c请æ±\82æ\98¯å\85¶ä»\96人å\8f\91å\87ºç\9a\84ï¼\8cæ\88\96è\80\85æ\82¨å·²å\9b\9eå¿\86èµ·æ\82¨ç\9a\84æ\97§å¯\86ç \81并ä¸\8då\86\8dé\9c\80è¦\81æ\9b´æ\94¹ï¼\8cæ\82¨å\8f¯ä»¥å¿½ç\95¥æ\9c¬æ\9d¡æ¶\88æ\81¯å¹¶ç»§ç»­ä½¿ç\94¨å\8e\9f密码。',
+'passwordreset-emailtext-user' => 'ç\94¨æ\88· $1 è¯·æ±\82è\8e·å\8f\96 {{SITENAME}} ($4)ä¸\8aæ\82¨ç\9a\84è´¦æ\88·ç\9a\84å¯\86ç \81æ\8f\90示ã\80\82{{PLURAL:$3|以ä¸\8bè´¦æ\88·|此账æ\88·}}ä¸\8e该ç\94µå­\90é\82®ä»¶地址关联:
 
 $2
 
-{{PLURAL:$3|è¿\99个|è¿\99äº\9b}}临æ\97¶å¯\86ç \81ä¼\9aå\9c¨{{PLURAL:$5|ä¸\80天|$5 å¤©}}å\86\85è¿\87æ\9c\9fã\80\82请ç\8e°å\9c¨ç\99»å\85¥å¹¶è®¾ç½®æ\96°ç\9a\84å¯\86ç \81ã\80\82å¦\82æ\9e\9c请æ±\82æ\98¯å\85¶ä»\96人æ\8f\90å\87ºç\9a\84ï¼\8cæ\88\96è\80\85æ\82¨è®°èµ·ä½ ç\9a\84æ\97§å¯\86ç \81并ä¸\8då\86\8dé\9c\80è¦\81æ\9b´æ\94¹ï¼\8cæ\82¨å\8f¯ä»¥æ\97 è§\86æ\9c¬æ\9d¡æ¶\88æ\81¯å¹¶ç»§ç»­ä½¿ç\94¨æ\97§æ\9c\89密码。',
+{{PLURAL:$3|è¿\99个|è¿\99个}}临æ\97¶å¯\86ç \81å°\86ä¼\9aå\9c¨{{PLURAL:$5|ä¸\80天|$5 å¤©}}å\90\8eè¿\87æ\9c\9fã\80\82请ç«\8bå\8d³ç\99»å½\95并设置æ\96°ç\9a\84å¯\86ç \81ã\80\82å¦\82æ\9e\9c请æ±\82æ\98¯å\85¶ä»\96人å\8f\91å\87ºç\9a\84ï¼\8cæ\88\96è\80\85æ\82¨å·²å\9b\9eå¿\86èµ·æ\82¨ç\9a\84æ\97§å¯\86ç \81并ä¸\8då\86\8dé\9c\80è¦\81æ\9b´æ\94¹ï¼\8cæ\82¨å\8f¯ä»¥å¿½ç\95¥æ\9c¬æ\9d¡æ¶\88æ\81¯å¹¶ç»§ç»­ä½¿ç\94¨å\8e\9f密码。',
 'passwordreset-emailelement' => '用户名:$1
 临时密码:$2',
 'passwordreset-emailsent' => '已发送提醒电子邮件。',
@@ -909,7 +913,9 @@ $2
 'headline_tip' => '2级标题文字',
 'nowiki_sample' => '在此插入非格式文本',
 'nowiki_tip' => '插入非格式文本',
+'image_sample' => '示例.jpg',
 'image_tip' => '插入文件',
+'media_sample' => '示例.ogg',
 'media_tip' => '文件链接',
 'sig_tip' => '带时间戳的签名',
 'hr_tip' => '水平线(请小心使用)',
@@ -927,33 +933,33 @@ $2
 'anoneditwarning' => "'''警告:'''您没有登录。
 您的IP地址将记录在此页的编辑历史中。",
 'anonpreviewwarning' => "''您没有登录。保存页面将会把您的IP地址记录在此页的编辑历史中。''",
-'missingsummary' => "'''提示:'''你没有提供编辑摘要。如果你再次点击“{{int:savearticle}}”,你的编辑将不带编辑摘要保存。",
+'missingsummary' => "'''提示:'''您没有提供编辑摘要。如果您再次点击“{{int:savearticle}}”,您的编辑将不带编辑摘要保存。",
 'missingcommenttext' => '请在下面输入评论。',
-'missingcommentheader' => "'''提示:''' 您没有为此评论提供一个标题。如果您再次单击“{{int:savearticle}}”,您的编辑将不带标题保存。",
+'missingcommentheader' => "'''提示:''' 您还没有为此评论提供一个标题。如果您再次点击“{{int:savearticle}}”,您的编辑将不带标题保存。",
 'summary-preview' => '摘要预览:',
 'subject-preview' => '标题预览:',
 'blockedtitle' => '用户被封禁',
-'blockedtext' => "'''您的用户名或IP地址已被封禁。'''
+'blockedtext' => "'''您的用户名或 IP 地址已被封禁。'''
 
­¤次封禁操作由$1完成,封禁原因为''$2''。
\9c¬次封禁操作由$1完成,封禁原因为''$2''。
 
-* 始时间:$8
-* ç»\88æ­¢时间:$6
+* 始时间:$8
+* ç»\93æ\9d\9f时间:$6
 * 拟封禁对象:$7
 
-您可以联系$1或其他的[[{{MediaWiki:Grouppage-sysop}}|管理员]]讨论此次封禁。若您已在[[Special:Preferences|帐号设置]]中配置了一个有效的电子邮件地址,且未被封禁电子邮件功能,则您可通过“发送电子邮件给这位用户”功能来联络相关管理员。您当前的IP地址是$3,此次封禁的ID为#$5。请在您的查询中注明上述所有信息。",
-'autoblockedtext' => "您的IP地址因与另一位已封禁用户相同而被自动封禁,该用户是由$1封禁的。封禁原因如下:
+您可以联系$1或其他的[[{{MediaWiki:Grouppage-sysop}}|管理员]]以申诉此次封禁。若您已在[[Special:Preferences|个人设置]]中设置了一个有效的电子邮件地址,且未被封禁电子邮件功能,则您可通过“发送邮件”功能来联系相关管理员。您当前的 IP 地址为$3,此次封禁的 ID 为#$5。请在您的查询中注明上述所有信息。",
+'autoblockedtext' => "您的 IP 地址因与另一位已封禁用户的相同而被自动封禁,该用户是由$1封禁的。封禁原因如下:
 
 :''$2''
 
-* 始时间:$8
-* ç»\88æ­¢时间:$6
+* 始时间:$8
+* ç»\93æ\9d\9f时间:$6
 * 拟封禁对象:$7
 
-您可以联系$1或其他的[[{{MediaWiki:Grouppage-sysop}}|管理员]]讨论此次封禁。若您已在[[Special:Preferences|帐号设置]]中配置了一个有效的电子邮件地址,且未被封禁电子邮件功能,则您可通过“发送电子邮件给这位用户”功能来联络相关管理员。您当前的IP地址是$3,此次封禁的ID为#$5。请在您的查询中注明上述所有信息。",
+您可以联系$1或其他的[[{{MediaWiki:Grouppage-sysop}}|管理员]]以申诉此次封禁。若您已在[[Special:Preferences|个人设置]]中设置了一个有效的电子邮件地址,且未被封禁电子邮件功能,则您可通过“发送邮件”功能来联系相关管理员。您当前的 IP 地址是$3,此次封禁的 ID 为#$5。请在您的查询中注明上述所有信息。",
 'blockednoreason' => '无给出原因',
 'whitelistedittext' => '您必须先$1才可编辑页面。',
-'confirmedittext' => '你必须确认你的电子邮件地址才能编辑本页。请通过[[Special:Preferences|用户资料设置]]设置并确认你的电子邮件地址。',
+'confirmedittext' => '您必须确认您的电子邮件地址才能编辑本页。请通过[[Special:Preferences|个人设置]]页面设置并确认。',
 'nosuchsectiontitle' => '没有这个段落',
 'nosuchsectiontext' => '您尝试编辑的章节并不存在。
 可能是在您查看页面时已经移动或删除。',
@@ -967,21 +973,21 @@ $2
 要创建该页面,请在下面的编辑框中输入内容(详情参见[[{{MediaWiki:Helppage}}|帮助页]])。
 如果您误入此页,请点击浏览器中的“返回”按钮。',
 'anontalkpagetext' => "---- ''这是一个还未建立账户的匿名用户的讨论页, 因此我们只能用IP地址来与他或她联络。该IP地址可能由几名用户共享。如果您是一名匿名用户并认为此页上的评语与您无关,请[[Special:UserLogin/signup|创建新账户]]或[[Special:UserLogin|登录]]以避免在未来与其他匿名用户混淆。''",
-'noarticletext' => '本页面目前没有内容。你可以在其他页面中[[Special:Search/{{PAGENAME}}|搜索该页标题]]、<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 编辑本页面]。</span>',
+'noarticletext' => '本页面目前没有内容。您可以在其他页面中[[Special:Search/{{PAGENAME}}|搜索该页标题]]、<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 编辑本页]。</span>',
 'noarticletext-nopermission' => '此页目前没有内容。
 您可以在其它页[[Special:Search/{{PAGENAME}}|搜寻此页标题]],或<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜寻有关日志]</span>,但您没有权限建立此页。',
 'missing-revision' => '“{{PAGENAME}}”的修订#$1不存在。
 
 这通常是因为进入了一个已被删除的页面的历史链接。
 详细信息可以在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。',
-'userpage-userdoesnotexist' => '用户账户"$1"未注册。
+'userpage-userdoesnotexist' => '用户账户"$1"未注册。
 请在创建/编辑该页之前进行核对。',
 'userpage-userdoesnotexist-view' => '用户账户“$1”未曾创建。',
 'blocked-notice-logextract' => '这位用户目前已被封禁。以下提供最近的封禁日志以供参考:',
-'clearyourcache' => "'''注意:'''保存之后,必须清除浏览器缓存才能看到做出的更改。
-* '''火狐(Firefox)/Safari:'''按住“Shift”,同时击“刷新”,或按“Ctrl-F5”或“Ctrl-R”(Mac为“⌘-R”)
+'clearyourcache' => "'''注意:'''保存之后,必须清除浏览器缓存才能看到做出的更改。
+* '''火狐(Firefox)/Safari:'''按住“Shift”,同时击“刷新”,或按“Ctrl-F5”或“Ctrl-R”(Mac为“⌘-R”)
 * '''谷歌浏览器(Google Chrome):'''按“Ctrl-Shift-R”(Mac为“⌘-Shift-R”)
-* '''Internet Explorer:'''按住“Ctrl”,同时击“刷新”,或按“Ctrl-F5”
+* '''Internet Explorer:'''按住“Ctrl”,同时击“刷新”,或按“Ctrl-F5”
 * '''Opera:'''在“工具→首选项”中清除缓存",
 'usercssyoucanpreview' => "'''提示:''' 在保存前请用“{{int:showpreview}}”按钮来测试您新的 CSS 。",
 'userjsyoucanpreview' => "'''提示:''' 在保存前请用“{{int:showpreview}}”按钮来测试您新的 JavaScript 。",
@@ -989,41 +995,41 @@ $2
 '''还没有保存!'''",
 'userjspreview' => "'''记住您只是在测试/预览您的个人 JavaScript。'''
 '''还没有保存!'''",
-'sitecsspreview' => "'''记住现在只是预览此 CSS。'''
-'''还没有保存!'''",
-'sitejspreview' => "'''记住现在只是预览此 JavaScript 代码。'''
-'''还没有保存!'''",
+'sitecsspreview' => "'''记住现在只是预览此 CSS。'''
+'''尚未保存!'''",
+'sitejspreview' => "'''记住现在只是预览此 JavaScript 代码。'''
+'''尚未保存!'''",
 'userinvalidcssjstitle' => "'''警告:''' 不存在皮肤\"\$1\"。注意自定义的 .css 和 .js 页要使用小写标题,例如,{{ns:user}}:Foo/vector.css 不同于 {{ns:user}}:Foo/Vector.css。",
 'updated' => '(已更新)',
 'note' => "'''注意:'''",
 'previewnote' => "'''请记住这仅为预览。'''您的更改还未保存!",
 'continue-editing' => '往编辑框',
-'previewconflict' => '这个预览显示了上面文字编辑区中的内容。它将在你选择保存后出现。',
-'session_fail_preview' => "'''抱歉!由于会话数据丢失,我们不能处理你的编辑。'''请重试。如果再次失败,请尝试[[Special:UserLogout|退出]]后重新登录。",
-'session_fail_preview_html' => "'''抱歉!我们不能处理你在进程数据丢失时的编辑。'''
+'previewconflict' => '这个预览显示了上面文字编辑区中的内容。它们将在您保存后出现。',
+'session_fail_preview' => "'''抱歉!由于会话数据丢失,我们不能处理您的编辑。'''请重试。如果仍然失败,请尝试[[Special:UserLogout|注销]]然后重新登录。",
+'session_fail_preview_html' => "'''抱歉!我们不能处理您在会话数据丢失时的编辑。'''
 
 ''由于{{SITENAME}}允许使用原始的 HTML,为了防范 JavaScript 攻击,预览已被隐藏。''
 
-'''如果这是一次合法的编辑,请重新进行尝试。'''如果还不行,请[[Special:UserLogout|退出]]并重新登录。",
+'''如果这是一次合法的编辑,请尝试重试。'''如果依然不行,请[[Special:UserLogout|注销]]并重新登录。",
 'token_suffix_mismatch' => "'''由于您用户端中的编辑令牌毁损了一些标点符号字元,您的编辑已经被拒绝。'''
 此次编辑被拒绝以防止页面文本损坏。
 这种情况通常在您使用含有故障的网页式匿名代理服务的时候出现。",
-'edit_form_incomplete' => "'''编辑表单的某些部分没有到达服务器 ;请检查您的编辑内容是否完整并再试一次。'''",
+'edit_form_incomplete' => "'''编辑表单的某些部分没有传送至服务器;请检查您的编辑内容是否完整并重试。'''",
 'editing' => '编辑“$1”',
 'creating' => '创建 $1',
 'editingsection' => '编辑“$1”(段落)',
 'editingcomment' => '编辑“$1”(新段落)',
 'editconflict' => '编辑冲突:$1',
-'explainconflict' => "有人在开始编辑后更改了页面。
+'explainconflict' => "有人在开始编辑后更改了页面。
 上面的文字框内显示的是目前本页的内容。
-所做的修改显示在下面的文字框中。
-你应当将你所做的修改加入现有的内容中。
-'''只有'''在上面文字框中的内容会在点击“{{int:savearticle}}”后被保存。",
-'yourtext' => '的文字',
+所做的修改显示在下面的文字框中。
+您应当将您的修改加入至现有的内容中。
+'''只有'''在上面文字框中的内容会在点击“{{int:savearticle}}”后被保存。",
+'yourtext' => '的文字',
 'storedversion' => '已保存的版本',
 'nonunicodebrowser' => "'''警告:您的浏览器不兼容Unicode编码。'''这里有一个工作区将使您能安全地编辑页面:非ASCII字符将以十六进制编码方式出现在编辑框中。",
-'editingold' => "'''警告:正在编辑的是本页的旧版本。'''
-如果你保存它的话,在本版本之后的任何修改都会丢失。",
+'editingold' => "'''警告:正在编辑的是本页的旧版本。'''
+如果您保存它的话,在旧版本之后的任何修改都将丢失。",
 'yourdiff' => '差异',
 'copyrightwarning' => "请注意您对{{SITENAME}}的所有贡献都被认为是在$2下发布,请查看在$1的细节。
 如果您不希望您的文字被任意修改和再散布,请不要提交。<br />
@@ -1050,16 +1056,16 @@ $2
 'template-semiprotected' => '(半保护)',
 'hiddencategories' => '本页面属于$1个隐藏分类:',
 'edittools' => '<!-- 这里的文字将显示在编辑和上传表格下面。 -->',
-'nocreatetext' => '{{SITENAME}}限制了创建新页面的功能。你可以返回并编辑已有的页面,或者[[Special:UserLogin|登录或创建新账户]]。',
-'nocreate-loggedin' => '没有权限创建新页面。',
+'nocreatetext' => '{{SITENAME}}限制了创建新页面功能。您可以返回并编辑已有的页面,或者[[Special:UserLogin|登录或创建新账户]]。',
+'nocreate-loggedin' => '没有权限创建新页面。',
 'sectioneditnotsupported-title' => '段落编辑不支持',
 'sectioneditnotsupported-text' => '本页面不支持段落编辑。',
 'permissionserrors' => '权限错误',
-'permissionserrorstext' => 'å\9b ä¸ºä»¥ä¸\8b{{PLURAL:$1|å\8e\9få\9b }}ï¼\8c你没æ\9c\89æ\9d\83é\99\90è¿\9b行该操作:',
-'permissionserrorstext-withaction' => 'å\9b ä¸ºä»¥ä¸\8b{{PLURAL:$1|å\8e\9få\9b }}ï¼\8cä½ 没有权限$2:',
-'recreate-moveddeleted-warn' => "'''警告:正在重新创建曾经被删除的页面。'''
+'permissionserrorstext' => 'å\9b ä¸ºä¸\8bå\88\97{{PLURAL:$1|å\8e\9få\9b }}ï¼\8cæ\82¨æ²¡æ\9c\89æ\9d\83é\99\90æ\89§行该操作:',
+'permissionserrorstext-withaction' => 'å\9b ä¸ºä¸\8bå\88\97{{PLURAL:$1|å\8e\9få\9b }}ï¼\8cæ\82¨没有权限$2:',
+'recreate-moveddeleted-warn' => "'''警告:正在重新创建曾经被删除的页面。'''
 
-应该考虑继续编辑本页是否合适。这里提供本页的删除和移动记录以供参考:",
+应该考虑继续编辑本页是否合适。这里提供本页的删除和移动记录以供参考:",
 'moveddeleted-notice' => '本页面已被删除。下面提供本页的删除和移动日志以供参考。',
 'log-fulllog' => '查看完整日志',
 'edit-hook-aborted' => '编辑被hook指令取消。
@@ -1067,7 +1073,7 @@ $2
 'edit-gone-missing' => '不能更新页面。
 它可能刚刚被删除。',
 'edit-conflict' => '编辑冲突。',
-'edit-no-change' => '您的编辑已经略过,因为文字无任何改动。',
+'edit-no-change' => '由于文字无任何改动,您的编辑已被忽略。',
 'edit-already-exists' => '不可以建立一个新页面。
 它已经存在。',
 'defaultmessagetext' => '默认消息文本',
@@ -1104,7 +1110,7 @@ $2
 'converter-manual-rule-error' => '手动语言转换规则中检测到错误',
 
 # "Undo" feature
-'undo-success' => '此编辑可以被撤销。请检查以下比较以核实这正是您想做的,然后保存以下更改完成撤销编辑。',
+'undo-success' => '此编辑可被撤销。请检查以下对比以核实这正是您想做的,然后保存以下更改完成撤销编辑。',
 'undo-failure' => '因存在冲突的中间编辑,本编辑不能撤销。',
 'undo-norev' => '由于其修订版本不存在或已删除,此编辑不能撤销。',
 'undo-summary' => '撤销由[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])所作出的修订$1',
@@ -1152,13 +1158,13 @@ $3的理由是''$2''",
 'rev-deleted-event' => '(日志条目被删除)',
 'rev-deleted-user-contribs' => '[用户名或IP地址被删除 - 编辑在贡献中隐藏]',
 'rev-deleted-text-permission' => "本页面版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]。",
-'rev-deleted-text-unhide' => "æ\9c¬é¡µé\9d¢ç\89\88æ\9c¬å·²è¢«'''å\88 é\99¤'''ã\80\82详æ\83\85请è§\81[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} å\88 é\99¤æ\97¥å¿\97\80\82å¦\82æ\9e\9cä½ æ\83³ç»§ç»­æ\93\8dä½\9cï¼\8cä½ ä»\8dç\84¶å\8f¯ä»¥[$1 æ\9f¥ç\9c\8bæ\9c¬ç\89\88æ\9c¬]。",
+'rev-deleted-text-unhide' => "æ\9c¬é¡µé\9d¢ç\9a\84修订ç\89\88已被'''å\88 é\99¤'''ã\80\82详æ\83\85请è§\81[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} å\88 é\99¤æ\97¥å¿\97\80\82æ\82¨å\8f¯ä»¥[$1 æ\9f¥ç\9c\8bå½\93å\89\8dç\89\88æ\9c¬]以继续。",
 'rev-suppressed-text-unhide' => "该页面修订已经被'''监督隐藏'''。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。如果您想继续的话,您可以仍然[$1 去查看这次修订]。",
-'rev-deleted-text-view' => "æ\9c¬é¡µé\9d¢ç\89\88æ\9c¬å·²è¢«'''å\88 é\99¤'''ã\80\82ä½ 可以查看它,详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
+'rev-deleted-text-view' => "æ\9c¬é¡µé\9d¢ç\9a\84修订ç\89\88已被'''å\88 é\99¤'''ã\80\82æ\82¨可以查看它,详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
 'rev-suppressed-text-view' => "该页面修订已经被'''监督隐藏'''。您可以查看它。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。",
 'rev-deleted-no-diff' => "因为其中一次修订已被'''删除''',您不可以查看这个差异。
 在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中可以找到更多的信息。",
-'rev-suppressed-no-diff' => "该页面的其中一次修订已经被'''删除''',你不可以查看这次的修订。",
+'rev-suppressed-no-diff' => "该页面的其中一次修订版已被'''删除''',您无法查看这个对比。",
 'rev-deleted-unhide-diff' => "该差异对比其中的一个修订版本已经被'''删除'''。在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中可以找到更多的信息。如果您想继续的话,您仍然可以[$1 查看这次修订]。",
 'rev-suppressed-unhide-diff' => "该页面的其中一次修订已经被'''监督隐藏'''。
 在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到更多的资料。如果您想继续的话,您可以仍然[$1 去查看这次修订]。",
@@ -1175,16 +1181,16 @@ $3的理由是''$2''",
 'revdelete-nologid-title' => '无效的日志项目',
 'revdelete-nologid-text' => '您尚未指定一个目标日志项目去进行这个动作或指定的项目不存在。',
 'revdelete-no-file' => '指定的文件不存在。',
-'revdelete-show-file-confirm' => '你是否真的要查看文件“<nowiki>$1</nowiki>”在$2 $3时的已删除修订?',
+'revdelete-show-file-confirm' => '您是否想查看文件“<nowiki>$1</nowiki>”于$2 $3时的已被删除的修订版本?',
 'revdelete-show-file-submit' => '是',
 'revdelete-selected' => "'''选取'''[[:$1]]'''的$2次修订:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|选取的日志项目}}:'''",
 'revdelete-text' => "'''删除的修订仍将显示在页面历史中, 但它们的文本内容已不能被公众访问。'''
 在{{SITENAME}}的其他管理员将仍能访问隐藏的内容并通过与此相同的界面恢复删除,除非站点工作者进行了一些附加的限制。",
 'revdelete-confirm' => '请确认您肯定去做的话,您就要明白到后果,以及这个程序符合[[{{MediaWiki:Policy-url}}|政策]]。',
-'revdelete-suppress-text' => "'''å\8fªæ\9c\89'''å\87ºç\8e°ä»¥ä¸\8bç\9a\84情况下才应阻止访问:
-* 不合适的个人信息
-*: ''家庭地址、电话号码、身份证号码等。''",
+'revdelete-suppress-text' => "'''å\8fªæ\9c\89'''å\87ºç\8e°ä¸\8bå\88\97情况下才应阻止访问:
+* 可能虚假的个人信息
+*: ''家庭地址、电话号码、身份证号码等。''",
 'revdelete-legend' => '设置可见性之限制',
 'revdelete-hide-text' => '隐藏版本文字',
 'revdelete-hide-image' => '隐藏文件内容',
@@ -1238,7 +1244,7 @@ $1",
 'mergehistory-from' => '来源页面:',
 'mergehistory-into' => '目的页面:',
 'mergehistory-list' => '可以合并的编辑历史',
-'mergehistory-merge' => '以ä¸\8b[[:$1]]的修订可以合并到[[:$2]]。用该选项按钮列去合并只有在指定时间以前所创建的修订。要留意的是使用导航链接便会重设这一栏。',
+'mergehistory-merge' => 'ä¸\8bå\88\97[[:$1]]的修订可以合并到[[:$2]]。用该选项按钮列去合并只有在指定时间以前所创建的修订。要留意的是使用导航链接便会重设这一栏。',
 'mergehistory-go' => '显示可以合并的编辑',
 'mergehistory-submit' => '合并版本',
 'mergehistory-empty' => '没有可以合并的版本。',
@@ -1324,7 +1330,7 @@ $1",
 'showingresults' => "下面显示从第'''$2'''条结果开始的'''$1'''条结果。",
 'showingresultsnum' => "下面显示从第'''$2'''条结果开始的'''$3'''条结果。",
 'showingresultsheader' => "关于'''$4'''的{{PLURAL:$5|第'''$1'''条至第'''$3'''条结果|第'''$1'''条至第'''$2'''条结果,共'''$3'''条结果}}",
-'nonefound' => "'''注意''':只有部分名字空间的页面会被默认搜索。尝试在您的搜索语句前添加“all:”前缀,这样可以搜索全部页面(包括讨论页、模板等),或者可使用所需名字空间作为前缀。",
+'nonefound' => "'''注意''':只有部分名字空间的页面会被默认搜索。尝试在您的搜索语句前添加“all:”前缀,这样可以搜索全部页面(包括讨论页、模板等),或者您也可使用所需名字空间作为前缀。",
 'search-nonefound' => '找不到和查询相匹配的结果。',
 'powersearch' => '高级搜索',
 'powersearch-legend' => '高级搜索',
@@ -1347,8 +1353,8 @@ $1",
 'qbsettings-directionality' => '根据您的语言文本方向固定位置',
 
 # Preferences page
-'preferences' => '系统设置',
-'mypreferences' => '系统设置',
+'preferences' => '个人设置',
+'mypreferences' => '个人设置',
 'prefs-edits' => '编辑数量:',
 'prefsnologin' => '尚未登录',
 'prefsnologintext' => '您必须先<span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} 登录]</span>才能设置个人参数。',
@@ -1384,13 +1390,13 @@ $1",
 'searchresultshead' => '搜索',
 'resultsperpage' => '每页显示链接数:',
 'stub-threshold' => '<a href="#" class="stub">短页面链接</a>格式阈值(字节):',
-'stub-threshold-disabled' => '已用',
+'stub-threshold-disabled' => '已用',
 'recentchangesdays' => '最近更改中显示的天数:',
 'recentchangesdays-max' => '最多$1天',
 'recentchangescount' => '默认显示的编辑数:',
 'prefs-help-recentchangescount' => '该项包含最近更改、页面历史和日志。',
 'prefs-help-watchlist-token' => '此栏填写的密钥可以生成您监视列表的RSS源。任何知晓本栏密钥的人都能阅读您的监视列表,因此请使用安全的数值。这里已提供了一个随机生成的数值供您选择:$1',
-'savedprefs' => '的系统设置已经保存。',
+'savedprefs' => '的系统设置已经保存。',
 'timezonelegend' => '时区:',
 'localtime' => '当地时间:',
 'timezoneuseserverdefault' => '使用wiki默认值($1)',
@@ -1414,10 +1420,10 @@ $1",
 'defaultns' => '否则在这些名字空间中搜索:',
 'default' => '默认',
 'prefs-files' => '文件',
-'prefs-custom-css' => '自定义CSS',
-'prefs-custom-js' => '自定义JavaScript',
+'prefs-custom-css' => '自定义 CSS',
+'prefs-custom-js' => '自定义 JavaScript',
 'prefs-common-css-js' => '所有皮肤共用的CSS/JavaScript:',
-'prefs-reset-intro' => '你可以使用本页面重置你的系统设置为网站默认值。该操作不能撤销。',
+'prefs-reset-intro' => '您可以通过本页面重置您的系统设置为默认值。此操作不可撤销。',
 'prefs-emailconfirm-label' => '电子邮件确认:',
 'prefs-textboxsize' => '编辑框大小',
 'youremail' => '电子邮件:',
@@ -1430,7 +1436,7 @@ $1",
 'yourvariant' => '内容语言变种:',
 'prefs-help-variant' => '您希望用于显示本站内容的语种或拼写语系。',
 'yournick' => '新签名:',
-'prefs-help-signature' => '讨论页面上的评论应该使用“<nowiki>~~~~</nowiki>”签名,它会自动转换为你的签名及时间戳。',
+'prefs-help-signature' => '讨论页面上的评论应使用“<nowiki>~~~~</nowiki>”签名,它会自动转换为您的签名和时间戳。',
 'badsig' => '错误的原始签名。请检查HTML标签。',
 'badsiglength' => '签名过长。请不超过$1个字符。',
 'yourgender' => '性别:',
@@ -1439,9 +1445,9 @@ $1",
 'gender-female' => '女',
 'prefs-help-gender' => '选填项目。使软件使用正确的性别称呼。该信息将会公开。',
 'email' => '电子邮件',
-'prefs-help-realname' => '真实姓名是选填项目。如果你选择提供它,它将会用于贡献署名。',
-'prefs-help-email' => '电子邮件地址是选填项目。但是在你忘记密码需要重置密码时需要电子邮件地址。',
-'prefs-help-email-others' => '你亦可以选择让其他用户通过你的用户页或讨论页上的链接用电子邮件联系你。其他用户联系你时你的电子邮件地址不会显示。',
+'prefs-help-realname' => '真实姓名是可选的项目。如果您选择提供它,它将会用于贡献署名。',
+'prefs-help-email' => '电子邮件地址是可选的项目。但是在您忘记密码需要重置密码时需要它。',
+'prefs-help-email-others' => '您也可以选择让其他用户通过您的用户页或讨论页上的链接用电子邮件联系您。其他用户联系您时,您的电子邮件地址将不会被显示。',
 'prefs-help-email-required' => '电子邮件地址是必填项目。',
 'prefs-info' => '基本信息',
 'prefs-i18n' => '界面语言',
@@ -1472,7 +1478,7 @@ $1",
 'saveusergroups' => '保存用户组',
 'userrights-groupsmember' => '用户组:',
 'userrights-groupsmember-auto' => '自动用户组:',
-'userrights-groups-help' => '可以更改该用户的用户组:
+'userrights-groups-help' => '可以更改该用户的用户组:
 * 选中的选项框表示该用户属于该用户组。
 * 未选中的选项框表示该用户不属于该用户组。
 * 星号(*)表示一旦添加该用户组后不能删除,反之亦然。',
@@ -1480,9 +1486,9 @@ $1",
 'userrights-no-interwiki' => '您并没有权限去编辑在其它wiki上的用户权限。',
 'userrights-nodatabase' => '数据库$1不存在或并非为本地的。',
 'userrights-nologin' => '您必须要以管理员帐户[[Special:UserLogin|登录]]之后才可以指定用户权限。',
-'userrights-notallowed' => 'æ\82¨ç\9a\84å¸\90æ\88·æ\97 æ\9d\83é\99\90æ·»å\8a æ\88\96å\88 é\99¤ç\94¨æ\88·权限。',
-'userrights-changeable-col' => '可以更改的用户组',
-'userrights-unchangeable-col' => '不能更改的用户组',
+'userrights-notallowed' => 'æ\82¨ç\9a\84å¸\90æ\88·æ\97 æ·»å\8a æ\88\96å\88 é\99¤ç\94¨æ\88·æ\9d\83é\99\90ç\9a\84权限。',
+'userrights-changeable-col' => '可以更改的用户组',
+'userrights-unchangeable-col' => '不能更改的用户组',
 
 # Groups
 'group' => '用户组:',
@@ -1542,7 +1548,7 @@ $1",
 'right-suppressrevision' => '审查和恢复管理员隐藏的版本',
 'right-suppressionlog' => '查看非公开日志',
 'right-block' => '阻止其他用户编辑',
-'right-blockemail' => '阻止用户电邮联系',
+'right-blockemail' => '阻止用户发送邮件',
 'right-hideuser' => '封禁并隐藏用户名',
 'right-ipblock-exempt' => '避开IP封禁、自动封禁和IP段封禁',
 'right-proxyunbannable' => '避开代理服务器的自动封禁',
@@ -1567,7 +1573,7 @@ $1",
 'right-userrights-interwiki' => '编辑其它wiki的用户的用户权限',
 'right-siteadmin' => '锁定和解锁数据库',
 'right-override-export-depth' => '导出含有链接页面深度为5的页面',
-'right-sendemail' => '电邮联系其他用户',
+'right-sendemail' => '向其他用户发送邮件',
 'right-passwordreset' => '查看密码重置电子邮件',
 
 # Special:Log/newusers
@@ -1607,13 +1613,13 @@ $1",
 'action-import' => '从其他wiki导入本页面',
 'action-importupload' => '从文件上传导入本页面',
 'action-patrol' => '标记他人的编辑为已巡查',
-'action-autopatrol' => '使你的编辑标记为已巡查',
+'action-autopatrol' => '将您的编辑标记为已巡查',
 'action-unwatchedpages' => '查看未受监视页面的列表',
 'action-mergehistory' => '合并本页面的历史',
 'action-userrights' => '编辑所有用户的权限',
 'action-userrights-interwiki' => '编辑其它wiki的用户的用户权限',
 'action-siteadmin' => '锁定或解锁数据库',
-'action-sendemail' => '电邮联系其他用户',
+'action-sendemail' => '通过邮件联系其他用户',
 
 # Recent changes
 'nchanges' => '$1次更改',
@@ -1736,22 +1742,22 @@ $1",
 请仔细检查该文件<strong>[[:$1]]</strong>。
 如果被检查文件与原始大小的图像是同一幅图像,您无需上传多余的缩略图。",
 'file-thumbnail-no' => "文件名以<strong>$1</strong>开头。它可能是另一幅图像的缩小版本''(缩略图)''。
-如果有该图像完整分辨率的版本,请上传该完整版本。否则请修改文件名。",
+如果有该图像完整分辨率的版本,请上传该完整版本。否则请修改文件名。",
 'fileexists-forbidden' => '已存在相同名称的文件,且不能覆盖;请返回并用一个新的名称来上传此文件。[[File:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => '在共享文件库中已存在此名称的文件。
-如果你仍然想去上传它的话,请返回并用一个新的名称来上传此文件。[[File:$1|thumb|center|$1]]',
-'file-exists-duplicate' => 'è¿\99个æ\96\87件ä¸\8e以ä¸\8b{{PLURAL:$1|一|多}}个文件重复:',
+'fileexists-shared-forbidden' => '在共享文件库中已存在同名文件。
+如果您仍然想继续上传,请返回并使用一个新的文件名来上传此文件。[[File:$1|thumb|center|$1]]',
+'file-exists-duplicate' => 'è¿\99个æ\96\87件ä¸\8eä¸\8bå\88\97{{PLURAL:$1|一|多}}个文件重复:',
 'file-deleted-duplicate' => '一个相同名称的文件 ([[:$1]]) 在先前删除过。您应该在重新上传之前检查一下该文件之删除纪录。',
 'uploadwarning' => '上传警告',
 'uploadwarning-text' => '请修改下面的文件说明并重试。',
 'savefile' => '保存文件',
 'uploadedimage' => '上传“[[$1]]”',
 'overwroteimage' => '上传“[[$1]]”的新版本',
-'uploaddisabled' => '上传己用。',
-'copyuploaddisabled' => '通过网址上传功能未开通。',
+'uploaddisabled' => '上传己用。',
+'copyuploaddisabled' => '通过网址上传功能已禁用。',
 'uploadfromurl-queued' => '上传已被列入队列。',
-'uploaddisabledtext' => '文件上传已用。',
-'php-uploaddisabledtext' => 'PHP 文件上传已经停用。请检查 file_uploads 设置。',
+'uploaddisabledtext' => '文件上传已用。',
+'php-uploaddisabledtext' => 'PHP 设置已禁用文件上传功能。请检查 file_uploads 设置。',
 'uploadscripted' => '该文件包含可能被网络浏览器错误解释的 HTML 或脚本代码。',
 'uploadvirus' => '该文件包含病毒!
 详情:$1',
@@ -1842,8 +1848,8 @@ $1',
 'uploadstash' => '文件贮藏',
 'uploadstash-summary' => '这个页面提供已经上传(或者上传中)但未发布到wiki之文件存取。这些文件除了上传的用户之外不会被其他人可见。',
 'uploadstash-clear' => '清除贮藏文件',
-'uploadstash-nofiles' => '没有已贮藏的文件。',
-'uploadstash-badtoken' => 'è¿\9bè¡\8cè¿\99个å\8a¨ä½\9cä¸\8dæ\88\90å\8a\9fï¼\8cæ\88\96è\80\85ä½ ç\9a\84ç¼\96è¾\91ä¿¡æ\81¯å·²ç»\8fè¿\87æ\9c\9fã\80\82请å\86\8dè¯\95ã\80\82',
+'uploadstash-nofiles' => '没有已贮藏的文件。',
+'uploadstash-badtoken' => 'æ\89§è¡\8cæ\93\8dä½\9cä¸\8dæ\88\90å\8a\9fï¼\8cæ\88\96è\80\85æ\82¨ç\9a\84ç¼\96è¾\91ä¿¡æ\81¯å·²ç»\8fè¿\87æ\9c\9fã\80\82请é\87\8dè¯\95ã\80\82',
 'uploadstash-errclear' => '清除文件不成功。',
 'uploadstash-refresh' => '更新文件清单',
 'invalid-chunk-offset' => '无效区块偏移量',
@@ -1860,7 +1866,7 @@ $1',
 'img-auth-nofile' => '文件“$1”不存在。',
 'img-auth-isdir' => '您正试图访问目录“$1”。您只能访问文件。',
 'img-auth-streaming' => '流式化“$1”中。',
-'img-auth-public' => 'img_auth.php的功能是从私有wiki输出文件。但本wiki已被设置为公共wiki。出于安全考虑,img_auth.php已被停用。',
+'img-auth-public' => 'img_auth.php 的功能是从私有 wiki 输出文件。但本 wiki 已被设置为公共 wiki。出于安全考虑,img_auth.php 已被禁用。',
 'img-auth-noread' => '用户无权读取“$1”。',
 'img-auth-bad-query-string' => 'URL 有一个无效的查询字符串。',
 
@@ -1903,7 +1909,7 @@ $1',
 # File description page
 'file-anchor-link' => '文件',
 'filehist' => '文件历史',
-'filehist-help' => '查看某一时刻的文件,请击相应的日期/时间。',
+'filehist-help' => '查看某一时刻的文件,请击相应的日期/时间。',
 'filehist-deleteall' => '删除全部',
 'filehist-deleteone' => '删除',
 'filehist-revert' => '恢复',
@@ -1918,14 +1924,14 @@ $1',
 'filehist-comment' => '评论',
 'filehist-missing' => '文件遗失',
 'imagelinks' => '文件用途',
-'linkstoimage' => '以ä¸\8bç\9a\84$1个页面链接到本文件:',
+'linkstoimage' => 'ä¸\8bå\88\97$1个页面链接到本文件:',
 'linkstoimage-more' => '多于$1个页面连接到这个文件。
 下面的列表只列示了连去这个文件的最首$1个页面。
 一个[[Special:WhatLinksHere/$2|完整的列表]]可以提供。',
 'nolinkstoimage' => '没有页面链接到本文件。',
 'morelinkstoimage' => '查看连接到这个文件的[[Special:WhatLinksHere/$1|更多链接]]。',
 'linkstoimage-redirect' => '$1(文件重定向)$2',
-'duplicatesoffile' => '以ä¸\8bç\9a\84$1个æ\96\87件è·\9fè¿\99个文件重复([[Special:FileDuplicateSearch/$2|更多细节]]):',
+'duplicatesoffile' => 'ä¸\8bå\88\97$1个æ\96\87件ä¸\8e该文件重复([[Special:FileDuplicateSearch/$2|更多细节]]):',
 'sharedupload' => '该文件来自于$1,它可能在其它计划项目中被应用。',
 'sharedupload-desc-there' => '该文件来自于$1,它可能在其它计划项目中被应用。
 请参阅在[$2 文件描述页面]以了解其相关信息。',
@@ -1956,8 +1962,8 @@ $1',
 # File deletion
 'filedelete' => '删除$1',
 'filedelete-legend' => '删除文件',
-'filedelete-intro' => "您现正删除文件'''[[Media:$1|$1]]'''。",
-'filedelete-intro-old' => "你现正删除'''[[Media:$1|$1]]'''于[$4 $2 $3]的版本。",
+'filedelete-intro' => "您删除文件'''[[Media:$1|$1]]'''。",
+'filedelete-intro-old' => "您正在删除'''[[Media:$1|$1]]'''于[$4 $2 $3]的版本。",
 'filedelete-comment' => '原因:',
 'filedelete-submit' => '删除',
 'filedelete-success' => "'''$1'''已经删除。",
@@ -1971,7 +1977,7 @@ $1',
 ** 侵犯版权
 ** 重复文件',
 'filedelete-edit-reasonlist' => '编辑删除埋由',
-'filedelete-maintenance' => 'å½\93å\9c¨ç»´æ\8a¤æ\97¶å·²ç»\8fæ\9a\82æ\97¶å\81\9c用文件删除和恢复。',
+'filedelete-maintenance' => 'å¤\84äº\8eç»´æ\8a¤æ\97¶å°\86æ\9a\82æ\97¶ç¦\81用文件删除和恢复。',
 'filedelete-maintenance-title' => '无法删除文件',
 
 # MIME search
@@ -2025,7 +2031,7 @@ $1',
 'disambiguations-text' => "以下的页面都有到'''消歧义页'''的链接,但它们可能可以链接到更适当的页面。<br />一个页面如果使用了[[MediaWiki:Disambiguationspage]]内的模板,则会被视为消歧义页。",
 
 'doubleredirects' => '双重重定向页',
-'doubleredirectstext' => '此页å\88\97å\87ºäº\86æ\89\80æ\9c\89é\87\8då®\9aå\90\91å\88°å\8f¦ä¸\80é\87\8då®\9aå\90\91页é\9d¢ç\9a\84页é\9d¢ã\80\82æ¯\8fä¸\80è¡\8cé\83½å\8c\85å\90«æ\9c\89å\88°ç¬¬ä¸\80å\92\8c第äº\8c个é\87\8då®\9aå\90\91页é\9d¢ç\9a\84é\93¾æ\8e¥ï¼\8c以å\8f\8a第äº\8c个é\87\8då®\9aå\90\91页é\9d¢ç\9a\84ç\9b®æ \87â\80\94â\80\94é\80\9a常就æ\98¯â\80\9cç\9c\9fæ­£ç\9a\84â\80\9dç\9b®æ \87页é\9d¢ï¼\8c亦å\8d³æ\98¯ç¬¬ä¸\80个é\87\8då®\9aå\90\91页é\9d¢åº\94该æ\8c\87å\90\91ç\9a\84页é\9d¢ã\80\82<del>å·²å\88\92å\8e»</del>ç\9a\84为已经解决的项目。',
+'doubleredirectstext' => '此页å\88\97å\87ºäº\86æ\89\80æ\9c\89é\87\8då®\9aå\90\91å\88°å\8f¦ä¸\80é\87\8då®\9aå\90\91页é\9d¢ç\9a\84页é\9d¢ã\80\82æ¯\8fä¸\80è¡\8cé\83½å\8c\85å\90«æ\9c\89å\88°ç¬¬ä¸\80å\92\8c第äº\8c个é\87\8då®\9aå\90\91页é\9d¢ç\9a\84é\93¾æ\8e¥ï¼\8c以å\8f\8a第äº\8c个é\87\8då®\9aå\90\91页é\9d¢ç\9a\84ç\9b®æ \87â\80\94â\80\94é\80\9a常就æ\98¯â\80\9cç\9c\9fæ­£ç\9a\84â\80\9dç\9b®æ \87页é\9d¢ï¼\8cä¹\9få°±æ\98¯ç¬¬ä¸\80个é\87\8då®\9aå\90\91页é\9d¢åº\94该æ\8c\87å\90\91ç\9a\84页é\9d¢ã\80\82<del>å·²å\88\92å\8e»</del>ç\9a\84æ\9d¡ç\9b®æ\98¯已经解决的项目。',
 'double-redirect-fixed-move' => '[[$1]]已被移动。它现在重定向至[[$2]]。',
 'double-redirect-fixed-maintenance' => '修复双重重定向自[[$1]]至[[$2]]。',
 'double-redirect-fixer' => '重定向页修复器',
@@ -2052,7 +2058,7 @@ $1',
 'nviews' => '$1次浏览',
 'nimagelinks' => '用于$1个页面中',
 'ntransclusions' => '用于$1个页面中',
-'specialpage-empty' => 'è¿\99个æ\8a¥å\91\8aç\9a\84结果为空。',
+'specialpage-empty' => '该æ\8a¥å\91\8a结果为空。',
 'lonelypages' => '孤立页面',
 'lonelypagestext' => '以下页面尚未被{{SITENAME}}中的其它页面链接或被之包含。',
 'uncategorizedpages' => '未归类页面',
@@ -2110,7 +2116,7 @@ $1',
 'pager-newer-n' => '前$1个',
 'pager-older-n' => '后$1个',
 'suppress' => '监督',
-'querypage-disabled' => '此特殊页面基于效能的原因已经被停用。',
+'querypage-disabled' => '此特殊页面由于性能原因已被禁用。',
 
 # Book sources
 'booksources' => '网络书源',
@@ -2125,7 +2131,7 @@ $1',
 'speciallogtitlelabel' => '目标(标题或用户):',
 'log' => '日志',
 'all-logs-page' => '所有公开日志',
-'alllogstext' => '所有{{SITENAME}}公开日志的联合展示。可以通过选择日志类型、输入用户名(区分大小写)或相关页面(区分大小写)筛选日志条目。',
+'alllogstext' => '所有{{SITENAME}}公开日志的联合展示。 您可以通过选择日志类型、输入用户名(区分大小写)或相关页面(区分大小写)筛选日志条目。',
 'logempty' => '在日志中不存在匹配项。',
 'log-title-wildcard' => '搜索以该文字开头的标题',
 'showhideselectedlogentries' => '显示/隐藏所选日志项',
@@ -2149,7 +2155,7 @@ $1',
 'allpages-hide-redirects' => '隐藏重定向页',
 
 # SpecialCachedPage
-'cachedspecial-viewing-cached-ttl' => '正在浏览本页的缓存版本,至多可能存在 $1 的延迟。',
+'cachedspecial-viewing-cached-ttl' => '正在浏览本页的缓存版本,至多可能存在 $1 的延迟。',
 'cachedspecial-viewing-cached-ts' => '您正浏览此页的缓存版本,不一定是最新的完整版本。',
 'cachedspecial-refresh-now' => '查看最新的。',
 
@@ -2212,18 +2218,18 @@ $1',
 'listgrouprights-removegroup-self-all' => '删除自己的账户的所有用户组',
 
 # E-mail user
-'mailnologin' => 'æ\97 ç\94µé\82®地址',
-'mailnologintext' => '你必须[[Special:UserLogin|登录]]并在你的[[Special:Preferences|系统设置]]中拥有有效的电子邮件地址才能向其他用户发送电子邮件。',
+'mailnologin' => '没æ\9c\89å\8f\91é\80\81地址',
+'mailnologintext' => '您必须[[Special:UserLogin|登录]]并在您的[[Special:Preferences|个人设置]]中设置一个有效的电子邮件地址才能向其他用户发送电子邮件。',
 'emailuser' => '电邮联系',
-'emailuser-title-target' => '电邮联系该{{GENDER:$1|用户}}',
-'emailuser-title-notarget' => '电邮联系',
-'emailpage' => '电邮联系',
+'emailuser-title-target' => '邮件联系该{{GENDER:$1|用户}}',
+'emailuser-title-notarget' => '邮件联系',
+'emailpage' => '邮件联系',
 'emailpagetext' => '您可以使用下面的表单向该{{GENDER:$1|用户}}发送电子邮件消息。
\82¨å\9c¨[[Special:Preferences|ä½ ç\9a\84ç³»ç»\9f设置]]中è¾\93å\85¥ç\9a\84ç\94µå­\90é\82®ä»¶å\9c°å\9d\80å°\86æ\98¾ç¤ºä¸ºè¯¥é\82®ä»¶ç\9a\84â\80\9cå\8f\91件人â\80\9då\9c°å\9d\80ï¼\8cæ\89\80以æ\94¶ä»¶äººå°\86å\8f¯ä»¥ç\9b´æ\8e¥å\9b\9eå¤\8dä½ 。',
\82¨å\9c¨[[Special:Preferences|个人设置]]中è¾\93å\85¥ç\9a\84ç\94µå­\90é\82®ä»¶å\9c°å\9d\80å°\86æ\98¾ç¤ºä¸ºè¯¥é\82®ä»¶ç\9a\84â\80\9cå\8f\91件人â\80\9då\9c°å\9d\80ï¼\8cæ\89\80以æ\94¶ä»¶äººå\8f¯ä»¥ç\9b´æ\8e¥å\9b\9eå¤\8dç»\99æ\82¨。',
 'usermailererror' => 'Mail 对象返回错误:',
 'defemailsubject' => '{{SITENAME}}来自用户“$1”的电子邮件',
-'usermaildisabled' => '用户电邮已停用',
-'usermaildisabledtext' => '您不可以发送电邮到这个wiki上的其他用户',
+'usermaildisabled' => '邮件发送功能已禁用',
+'usermaildisabledtext' => '您不可以给这个 wiki 上的其他用户发送邮件',
 'noemailtitle' => '无电子邮件地址',
 'noemailtext' => '该用户还没有指定一个有效的电子邮件地址。',
 'nowikiemailtitle' => '禁止电子邮件',
@@ -2242,7 +2248,7 @@ $1',
 'emailccsubject' => '您发送给$1的消息的副本:$2',
 'emailsent' => '电子邮件已发送',
 'emailsenttext' => '您的电子邮件已经发出。',
-'emailuserfooter' => '这封电邮是由$1寄给$2经{{SITENAME}}的“电邮用户”功能发出的。',
+'emailuserfooter' => '本邮件由{{SITENAME}}的“电邮用户”功能从$1发送至$2。',
 
 # User Messenger
 'usermessage-summary' => '留下系统信息。',
@@ -2252,15 +2258,15 @@ $1',
 'watchlist' => '监视列表',
 'mywatchlist' => '监视列表',
 'watchlistfor2' => '$1的监视列表$2',
-'nowatchlist' => '的监视列表为空。',
+'nowatchlist' => '的监视列表为空。',
 'watchlistanontext' => '请$1以查看或编辑您的监视列表。',
 'watchnologin' => '未登录',
 'watchnologintext' => '您必须先[[Special:UserLogin|登录]]才能更改您的监视列表。',
 'addwatch' => '添加至监视列表',
-'addedwatchtext' => '页面“[[:$1]]”已添加至的[[Special:Watchlist|监视列表]]。
+'addedwatchtext' => '页面“[[:$1]]”已添加至的[[Special:Watchlist|监视列表]]。
 本页面及其讨论页面的新增更改将会列入监视列表。',
 'removewatch' => '从监视列表中删除',
-'removedwatchtext' => '页面“[[:$1]]”已从[[Special:Watchlist|的监视列表]]中删除。',
+'removedwatchtext' => '页面“[[:$1]]”已从[[Special:Watchlist|的监视列表]]中删除。',
 'watch' => '监视',
 'watchthispage' => '监视本页',
 'unwatch' => '取消监视',
@@ -2268,9 +2274,9 @@ $1',
 'notanarticle' => '非内容页面',
 'notvisiblerev' => '上次由不同用户所作的修订版本已经删除',
 'watchnochange' => '在显示的时间段内您所监视的页面没有更改。',
-'watchlist-details' => '不计讨论页面,你的监视列表中有$1个页面。',
+'watchlist-details' => '不包括讨论页面,您的监视列表中有$1个页面。',
 'wlheader-enotif' => '* 已经启动电子邮件通知功能。',
-'wlheader-showupdated' => "* 在你上次查看后有被修改过的页面会显示为'''粗体'''",
+'wlheader-showupdated' => "* 在您上次查看后有被修改过的页面会以'''粗体'''的形式被显示",
 'watchmethod-recent' => '检查被监视页面的最近编辑',
 'watchmethod-list' => '查看监视页中的最新修改',
 'watchlistcontains' => '您的监视列表包含$1个页面。',
@@ -2296,21 +2302,21 @@ $1',
 'enotif_body_intro_created' => '{{SITENAME}}页面$1已于$PAGEEDITDATE被{{gender:$2|$2}}创建,在 $3 可以查看当前版本。',
 'enotif_body_intro_moved' => '{{SITENAME}}页面$1已于$PAGEEDITDATE被{{gender:$2|$2}}移动,在 $3 可以查看当前版本。',
 'enotif_body_intro_restored' => '{{SITENAME}}页面$1已于$PAGEEDITDATE被{{gender:$2|$2}}恢复,在 $3 可以查看当前版本。',
-'enotif_body_intro_changed' => '{{SITENAME}}页面$1已于$PAGEEDITDATE被{{gender:$2|$2}}变更,在 $3 可以查看当前版本。',
-'enotif_lastvisited' => '请æµ\8fè§\88 $1 æ\9f¥ç\9c\8bä½ 上次访问后的所有更改。',
+'enotif_body_intro_changed' => '{{SITENAME}}页面$1已于$PAGEEDITDATE被{{gender:$2|$2}}修改,在 $3 可以查看当前版本。',
+'enotif_lastvisited' => '请æµ\8fè§\88 $1 æ\9f¥ç\9c\8bä»\8eæ\82¨上次访问后的所有更改。',
 'enotif_lastdiff' => '请浏览 $1 查看该更改。',
 'enotif_anon_editor' => '匿名用户$1',
-'enotif_body' => '亲爱的$WATCHINGUSERNAME:
+'enotif_body' => '亲爱的 $WATCHINGUSERNAME:
 
 $PAGEINTRO $NEWPAGE
 
 编辑摘要:$PAGESUMMARY $PAGEMINOREDIT
 
-你可以通过以下方式联系编者:
+您可以通过以下方式联系编辑者:
 电子邮件:$PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-在你访问该页面之前,我们不会发送新增更改的通知。你也可以重设你的监视列表中所有监视页面的通知标志。
+在您访问该页面之前,我们不会发送新增更改的通知。您也可以重设您的监视列表中所有监视页面的通知标志。
 
 友好的{{SITENAME}}通知系统
 
@@ -2319,7 +2325,7 @@ wiki: $PAGEEDITOR_WIKI
 {{canonicalurl:{{#special:Preferences}}}}
 更改监视列表设置:
 {{canonicalurl:{{#special:EditWatchlist}}}}
-从监视列表中删除该页面
+从监视列表中删除本页
 $UNWATCHURL
 反馈与其他帮助:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
@@ -2390,21 +2396,23 @@ $UNWATCHURL
 'prot_1movedto2' => '[[$1]]移动至[[$2]]',
 'protect-badnamespace-title' => '不可被保护的名字空间',
 'protect-badnamespace-text' => '这个名字空间内的页面无法被保护。',
+'protect-norestrictiontypes-text' => '无法保护此页,因为没有可用的保护类型',
+'protect-norestrictiontypes-title' => '不可保护页面',
 'protect-legend' => '确认保护',
 'protectcomment' => '原因:',
 'protectexpiry' => '到期:',
 'protect_expiry_invalid' => '输入的终止时间无效。',
 'protect_expiry_old' => '终止时间已过去。',
 'protect-unchain-permissions' => '解除锁定更多的保护选项',
-'protect-text' => '可以在这里浏览和修改对页面<strong>$1</strong>的保护级别。',
+'protect-text' => '可以在这里浏览和修改对页面<strong>$1</strong>的保护级别。',
 'protect-locked-blocked' => "您不能在被封禁时更改保护级别。以下是页面'''$1'''的当前设置:",
 'protect-locked-dblock' => "您不能在数据库锁定时更改保护级别。以下是页面'''$1'''的当前设置:",
 'protect-locked-access' => "您的帐户没有足够的权限去更改保护级别。以下是页面'''$1'''的当前设置:",
 'protect-cascadeon' => '以下的{{PLURAL:$1|一个|多个}}页面包含  本页面的同时,启动了连锁保护,因此本页面目前也被保护,未能编辑。您可以设置本页面的保护级别,但这并不会对连锁保护有所影响。',
 'protect-default' => '允许所有用户',
-'protect-fallback' => '需要“$1”的许可',
-'protect-level-autoconfirmed' => '禁止新的和未注册的用户',
-'protect-level-sysop' => '仅管理员',
+'protect-fallback' => '仅允许拥有“$1”权限的用户',
+'protect-level-autoconfirmed' => '仅允许自动确认用户',
+'protect-level-sysop' => '仅允许管理员',
 'protect-summary-cascade' => '联锁',
 'protect-expiring' => '终止于$1(UTC)',
 'protect-expiring-local' => '$1到期',
@@ -2451,7 +2459,7 @@ $UNWATCHURL
 'undeleterevisions' => '$1版本存档',
 'undeletehistory' => '如果您恢复了该页面,所有版本都会被恢复到修订历史中。
 如果本页删除后有一个同名的新页面建立,被恢复的版本将会出现在先前的历史中。',
-'undeleterevdel' => '如果把最新修订部份删除,反删除便无法进行。如果遇到这种情况,您必须反选或反隐藏最新已删除的修订。',
+'undeleterevdel' => '如果把最新修订部分删除,反删除将会无法进行。如果遇到这种情况,您必须反选或反隐藏最新已删除的修订。',
 'undeletehistorynoadmin' => '这个页面已被删除。删除原因显示在下方编辑摘要中,被删除前的所有修订文本连同删除前贡献用户的细节信息只对管理员可见。',
 'undelete-revision' => '$1由$3(在$4 $5)所编写的已删除修订版本:',
 'undeleterevision-missing' => '无效或丢失的修订版本。您可能使用了错误的链接,或者此修订版本已经被从存档中恢复或移除。',
@@ -2491,7 +2499,7 @@ $1',
 # Namespace form on various pages
 'namespace' => '名字空间:',
 'invert' => '反选',
-'tooltip-invert' => 'é\80\89中此å¤\8dé\80\89æ¡\86æ\9d¥é\9a\90è\97\8fé\80\89å®\9aå\90\8då­\97空é\97´ï¼\88å\8f\8aå\85¶ç\9b¸å\85³å\90\8då­\97空é\97´ï¼\8cè\8b¥è¯¥é\80\89项亦被选中)范围内的页面更改',
+'tooltip-invert' => 'é\80\89中此å¤\8dé\80\89æ¡\86æ\9d¥é\9a\90è\97\8fé\80\89å®\9aå\90\8då­\97空é\97´ï¼\88å\8f\8aå\85¶ç\9b¸å\85³å\90\8då­\97空é\97´ï¼\8cè\8b¥è¯¥é\80\89项ä¹\9f被选中)范围内的页面更改',
 'namespace_association' => '相关名字空间',
 'tooltip-namespace_association' => '选中此复选框可包括与选定名字空间相关的讨论页或子页面',
 'blanknamespace' => '(主要)',
@@ -2567,7 +2575,7 @@ $1',
 ** 不能接受的用户名',
 'ipb-hardblock' => '阻止登录用户使用该IP地址编辑',
 'ipbcreateaccount' => '阻止创建新账号',
-'ipbemailban' => '阻止用户发送电邮',
+'ipbemailban' => '阻止用户发送邮件',
 'ipbenableautoblock' => '自动封禁该用户最后使用的IP地址,以及他们随后试图用于编辑的所有IP地址',
 'ipbsubmit' => '封禁该用户',
 'ipbother' => '其它时间:',
@@ -2615,9 +2623,9 @@ $1',
 'infiniteblock' => '无限期',
 'expiringblock' => '$1 $2到期',
 'anononlyblock' => '仅匿名用户',
-'noautoblockblock' => 'è\87ªå\8a¨å°\81ç¦\81å\81\9c用',
-'createaccountblock' => '账户创建停用',
-'emailblock' => '电子邮件停用',
+'noautoblockblock' => 'è\87ªå\8a¨å°\81ç¦\81å·²ç¦\81用',
+'createaccountblock' => '创建帐户已禁用',
+'emailblock' => '发送邮件已禁用',
 'blocklist-nousertalk' => '不能编辑自己的讨论页面',
 'ipblocklist-empty' => '封禁列表为空。',
 'ipblocklist-no-results' => '请求的IP地址或用户名没有被封禁。',
@@ -2625,7 +2633,7 @@ $1',
 'unblocklink' => '解封',
 'change-blocklink' => '更改封禁',
 'contribslink' => '贡献',
-'emaillink' => '发送电邮',
+'emaillink' => '发送邮件',
 'autoblocker' => '由于您与“[[User:$1|$1]]”共享一个IP地址而被自动封禁。
 $1被封禁的理由是:“$2”',
 'blocklogpage' => '封禁日志',
@@ -2636,9 +2644,9 @@ $1被封禁的理由是:“$2”',
 'blocklogtext' => '这是用户封禁和解封操作的日志。自动封禁IP地址没有列出。请见[[Special:BlockList|封禁列表]]查看目前正在进行的阻止和封禁的列表。',
 'unblocklogentry' => '解封$1',
 'block-log-flags-anononly' => '仅限匿名用户',
-'block-log-flags-nocreate' => '账户创建停用',
-'block-log-flags-noautoblock' => 'è\87ªå\8a¨å°\81ç¦\81å\81\9c用',
-'block-log-flags-noemail' => '电子邮件停用',
+'block-log-flags-nocreate' => '创建帐户已禁用',
+'block-log-flags-noautoblock' => 'è\87ªå\8a¨å°\81ç¦\81å·²ç¦\81用',
+'block-log-flags-noemail' => '邮件功能已禁用',
 'block-log-flags-nousertalk' => '不能编辑自己的讨论页面',
 'block-log-flags-angry-autoblock' => '已启用增强型自动封禁',
 'block-log-flags-hiddenname' => '隐藏用户名',
@@ -2688,20 +2696,18 @@ $1被封禁的理由是:“$2”',
 # Move page
 'move-page' => '移动$1',
 'move-page-legend' => '移动页面',
-'movepagetext' => "用下面的表单来重命名一个页面,并将其修订历史同时移动到新页面。
-老的页面将成为新页面的重定向页
-您可以自动地更新指到原标题的重定向
-如果您选择不去做的话,请检查[[Special:DoubleRedirects|双重]]或[[Special:BrokenRedirects|损坏重定向]]链接。
-您应当负责确定所有链接依然会链到指定的页面
+'movepagetext' => "您可以使用下面的表单来重命名一个页面,同时将其修订历史移动到新页面。
+同时老的条目将会被重定向到新条目
+您可以自动地将重定向更新到原条目
+如果您不选择这样做的话,请检查[[Special:DoubleRedirects|双重]]或[[Special:BrokenRedirects|损坏重定向]]链接。
+您有责任确保链接会被正确指向他们应该被指向的地方
 
-注意如果新页面已经有内容的话,页面将'''不会'''被移动,
-除非新页面无内容或是重定向页,而且没有修订历史。
-这意味着您再必要时可以在移动到新页面后再移回老的页面,
-同时您也无法覆盖现有页面。
+注意:即使新条目已经有对应页面,此页面也'''不会'''被移动,除非新页面无任何编辑历史或是重定向页。
+这意味着您可在误操作后将页面移回原处,同时,您也无法覆盖现有页面。
 
 '''警告!'''
-对一个经常被访问的页面而言这可能是一个重大与唐突的更改;
-请在行动前先了解其所可能带来的后果。",
+对这样一个经常被访问的页面而言这可能是一个重大且唐突的更改;
+请在行动前先了解您的修改可能带来的一切后果。",
 'movepagetext-noredirectfixer' => "用下面的表单来重命名一个页面,并将其修订历史同时移动到新页面。
 老的页面将成为新页面的重定向页。
 请检查[[Special:DoubleRedirects|双重重定向]]或[[Special:BrokenRedirects|损坏重定向]]链接。
@@ -2721,14 +2727,14 @@ $1被封禁的理由是:“$2”',
 
 在这些情况下,您在必要时必须手工移动或合并页面。",
 'movearticle' => '移动页面:',
-'moveuserpage-warning' => "'''警告:'''将移动一个用户页面。请注意,只有该页面会被移动,该用户''不''会被更名。",
+'moveuserpage-warning' => "'''警告:'''将移动一个用户页面。请注意,只有该页面会被移动,该用户''不''会被更名。",
 'movenologin' => '未登录',
 'movenologintext' => '您必须是一名登记用户并且[[Special:UserLogin|登录]]
 后才可移动一个页面。',
-'movenotallowed' => '没有权限移动页面。',
-'movenotallowedfile' => '没有权限移动文件。',
-'cant-move-user-page' => '没有权限移动用户页面(子页面除外)。',
-'cant-move-to-user-page' => '没有权限移动页面至用户页面(用户子页面除外)。',
+'movenotallowed' => '没有权限移动页面。',
+'movenotallowedfile' => '没有权限移动文件。',
+'cant-move-user-page' => '没有权限移动用户页面(子页面除外)。',
+'cant-move-to-user-page' => '没有权限移动页面至用户页面(用户子页面除外)。',
 'newtitle' => '新标题:',
 'move-watch' => '监视来源页面和目标页面',
 'movepagebtn' => '移动页面',
@@ -2782,11 +2788,11 @@ $1被封禁的理由是:“$2”',
 
 # Export
 'export' => '导出页面',
-'exporttext' => '您可以将特定页面或一组页面的文本以及编辑历史以XML格式导出;这样可以将有关页面通过“[[Special:Import|导入页面]]”页面导入到另一个运行MediaWiki的网站。
+'exporttext' => '您可以将特定页面或一组页面的文本以及编辑历史以 XML 格式导出;这样可以将有关页面通过“[[Special:Import|导入页面]]”导入到另一个运行 MediaWiki 的网站。
 
-要导出页面,请在下面的文本框中输入页面标题,每行一个标题,并选择你是否需要导出带有页面历史的以前的修订本,或是只选择导出带有最后一次编辑信息的当前修订版本。
+要导出页面,请在下面的文本框中输入页面标题,每行一个标题,并选择您是否需要导出带有页面历史的以前的修订版本,或是只选择导出带有最后一次编辑信息的当前修订版本。
 
-此外你还可以利用链接导出文件,例如你可以使用[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]导出“[[{{MediaWiki:Mainpage}}]]”页面。',
+此外您还可以利用链接导出文件,例如您可以使用[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]导出“[[{{MediaWiki:Mainpage}}]]”页面。',
 'exportall' => '导出所有页面',
 'exportcuronly' => '仅包含当前的修订,而不是全部的历史。',
 'exportnohistory' => "----
@@ -2890,43 +2896,43 @@ $1被封禁的理由是:“$2”',
 # JavaScriptTest
 'javascripttest' => 'JavaScript测试',
 'javascripttest-title' => '运行$1测试',
-'javascripttest-pagetext-noframework' => '此页é\9d¢è¢«ä¿\9dç\95\99ç\94¨äº\8eè¿\90è¡\8cJavaScript测试。',
+'javascripttest-pagetext-noframework' => '此页é\9d¢è¢«ä¿\9dç\95\99ç\94¨ä½\9cæ\89§è¡\8c JavaScript 测试。',
 'javascripttest-pagetext-unknownframework' => '未知的框架“$1”。',
 'javascripttest-pagetext-frameworks' => '请选择以下的框架之一:$1',
 'javascripttest-pagetext-skins' => '选择外观来运行测试:',
-'javascripttest-qunit-intro' => '请浏览mediawiki.org参阅[$1 测试文档]。',
+'javascripttest-qunit-intro' => '请浏览 mediawiki.org 查看[$1 测试文档]。',
 'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit 测试套件',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => '的用户页面',
-'tooltip-pt-anonuserpage' => '你用于编辑的IP地址的用户页面',
-'tooltip-pt-mytalk' => '的讨论页面',
+'tooltip-pt-userpage' => '的用户页面',
+'tooltip-pt-anonuserpage' => '您用于编辑的 IP 地址的用户页面',
+'tooltip-pt-mytalk' => '的讨论页面',
 'tooltip-pt-anontalk' => '有关本IP地址的编辑的讨论',
-'tooltip-pt-preferences' => '的系统设置',
-'tooltip-pt-watchlist' => '你正在监视更改的页面的列表',
-'tooltip-pt-mycontris' => '的贡献列表',
-'tooltip-pt-login' => '我们鼓励你登录,不过这不是强制的',
-'tooltip-pt-anonlogin' => '我们鼓励你登录,不过这不是强制的',
-'tooltip-pt-logout' => '退出登录',
+'tooltip-pt-preferences' => '的系统设置',
+'tooltip-pt-watchlist' => '您正在监视的页面的列表',
+'tooltip-pt-mycontris' => '的贡献列表',
+'tooltip-pt-login' => '我们鼓励您登录,但这不是必须的',
+'tooltip-pt-anonlogin' => '我们鼓励您登录,但这不是必须的',
+'tooltip-pt-logout' => '注销',
 'tooltip-ca-talk' => '有关内容页面的讨论',
-'tooltip-ca-edit' => '你可以编辑本页面。请在保存前使用预览按钮。',
+'tooltip-ca-edit' => '您可以编辑本页。请在保存前使用预览按钮查看修改。',
 'tooltip-ca-addsection' => '开始新段落',
-'tooltip-ca-viewsource' => '本页面受到保护。你可以查看其源代码。',
-'tooltip-ca-history' => '本页面过去的版本',
+'tooltip-ca-viewsource' => '本页面受保护。您可以查看它的源代码。',
+'tooltip-ca-history' => '本页面的历史版本',
 'tooltip-ca-protect' => '保护本页',
 'tooltip-ca-unprotect' => '更改本页面的保护',
 'tooltip-ca-delete' => '删除本页',
 'tooltip-ca-undelete' => '将这个页面恢复到被删除以前的状态',
 'tooltip-ca-move' => '移动本页',
-'tooltip-ca-watch' => '添加本页面至的监视列表',
-'tooltip-ca-unwatch' => '从你的监视列表删除本页面',
+'tooltip-ca-watch' => '添加本页面至的监视列表',
+'tooltip-ca-unwatch' => '从您的监视列表中删除本页',
 'tooltip-search' => '在{{SITENAME}}中搜索',
 'tooltip-search-go' => '如果相同的标题存在的话便直接前往该页面',
 'tooltip-search-fulltext' => '搜索含这些文字的页面',
 'tooltip-p-logo' => '访问首页',
 'tooltip-n-mainpage' => '访问首页',
 'tooltip-n-mainpage-description' => '访问首页',
-'tooltip-n-portal' => '关于本项目,你可以做什么,在哪里找到你需要的事物',
+'tooltip-n-portal' => '关于本项目,您可以做些什么,在哪里可以找到您需要的东西',
 'tooltip-n-currentevents' => '查看当前事件的背景信息',
 'tooltip-n-recentchanges' => '本wiki的最近更改列表',
 'tooltip-n-randompage' => '载入一个随机页面',
@@ -2944,7 +2950,7 @@ $1被封禁的理由是:“$2”',
 'tooltip-ca-nstab-main' => '查看内容页面',
 'tooltip-ca-nstab-user' => '查看用户页面',
 'tooltip-ca-nstab-media' => '查看媒体文件页面',
-'tooltip-ca-nstab-special' => '本页为特殊页面,你不能编辑本页',
+'tooltip-ca-nstab-special' => '这是一个特殊页面,您不能编辑本页',
 'tooltip-ca-nstab-project' => '查看项目页面',
 'tooltip-ca-nstab-image' => '查看文件页面',
 'tooltip-ca-nstab-mediawiki' => '查看系统信息',
@@ -2956,14 +2962,14 @@ $1被封禁的理由是:“$2”',
 'tooltip-preview' => '预览您的更改,请在保存前使用此功能!',
 'tooltip-diff' => '显示您对该文字所做的更改',
 'tooltip-compareselectedversions' => '查看此页面两个选定的修订版本间的差异。',
-'tooltip-watch' => '添加本页面至的监视列表',
+'tooltip-watch' => '添加本页面至的监视列表',
 'tooltip-watchlistedit-normal-submit' => '删除标题',
 'tooltip-watchlistedit-raw-submit' => '更新监视列表',
 'tooltip-recreate' => '重建该页面,无论是否被删除。',
 'tooltip-upload' => '开始上传',
-'tooltip-rollback' => '击“回退”恢复上一位贡献者对本页的编辑',
+'tooltip-rollback' => '击“回退”恢复上一位贡献者对本页的编辑',
 'tooltip-undo' => '“撤销”可以恢复该编辑并在预览模式下打开编辑表单。它允许在摘要中加入原因。',
-'tooltip-preferences-save' => '保存设',
+'tooltip-preferences-save' => '保存设',
 'tooltip-summary' => '请输入简短的摘要',
 
 # Stylesheets
@@ -3053,6 +3059,7 @@ $1被封禁的理由是:“$2”',
 'pageinfo-magic-words' => '魔术字($1)',
 'pageinfo-hidden-categories' => '隐藏分类($1)',
 'pageinfo-templates' => '使用的模板($1)',
+'pageinfo-transclusions' => '$1个包含此页的页面',
 'pageinfo-toolboxlink' => '页面信息',
 'pageinfo-redirectsto' => '重定向到',
 'pageinfo-redirectsto-info' => '信息',
@@ -3061,6 +3068,10 @@ $1被封禁的理由是:“$2”',
 'pageinfo-protect-cascading' => '从这里开始连锁保护',
 'pageinfo-protect-cascading-yes' => '是',
 'pageinfo-protect-cascading-from' => '保护级联自',
+'pageinfo-category-info' => '分类信息',
+'pageinfo-category-pages' => '页数',
+'pageinfo-category-subcats' => '子类别数',
+'pageinfo-category-files' => '文件数',
 
 # Skin names
 'skinname-standard' => '标准',
@@ -3077,8 +3088,8 @@ $1被封禁的理由是:“$2”',
 'rcpatroldisabled' => '最新更改检查被关闭',
 'rcpatroldisabledtext' => '最新更改检查的功能目前已关闭。',
 'markedaspatrollederror' => '不能标志为已检查',
-'markedaspatrollederrortext' => '你需要指定某个版本才能标志为已检查。',
-'markedaspatrollederror-noautopatrol' => '您无法将自己所作的更改标记为已检查。',
+'markedaspatrollederrortext' => '您需要指定某个版本才能标记为已检查。',
+'markedaspatrollederror-noautopatrol' => '您无法将自己所作的更改标记为已检查。',
 'markedaspatrollednotify' => '$1的更改已被标记为已巡查。',
 'markedaspatrollederrornotify' => '标记为已巡查失败。',
 
@@ -3103,7 +3114,7 @@ $1',
 'nextdiff' => '下一编辑→',
 
 # Media information
-'mediawarning' => "'''警告''':该文件类型可能含有恶意代码。执行后你的系统可能受损。",
+'mediawarning' => "'''警告''':该类型的文件可能包含恶意代码。执行后您的系统可能会受损。",
 'imagemaxsize' => '图像大小限制:<br /><u>(文件描述页)</u>',
 'thumbsize' => '缩略图大小:',
 'widthheightpage' => '$1×$2,$3页',
@@ -3143,6 +3154,8 @@ $1',
 'minutes' => '$1分',
 'hours' => '$1小时',
 'days' => '$1天',
+'months' => '{{PLURAL:$1|$1个月|$1个月}}',
+'years' => '{{PLURAL:$1|$1年|$1年}}',
 'ago' => '$1前',
 'just-now' => '刚刚',
 
@@ -3600,7 +3613,7 @@ Variants for Chinese language
 
 # E-mail address confirmation
 'confirmemail' => '确认邮箱地址',
-'confirmemail_noemail' => '你还没有在你的[[Special:Preferences|用户资料设置]]中设置有效的电子邮件地址。',
+'confirmemail_noemail' => '您还没有在您的[[Special:Preferences|个人设置]]中设置有效的电子邮件地址。',
 'confirmemail_text' => '{{SITENAME}}要求您在使用邮件功能之前验证您的邮箱地址。
 点击以下按钮可向您的邮箱发送一封确认邮件。该邮件包含有一行代码链接;
 请在您的浏览器中加载此链接以确认您的邮箱地址是有效的。',
@@ -3615,8 +3628,8 @@ Variants for Chinese language
 'confirmemail_needlogin' => '您需要$1以确认您的邮箱地址。',
 'confirmemail_success' => '您的邮箱已经被确认。您现在可以[[Special:UserLogin|登录]]并使用此网站了。',
 'confirmemail_loggedin' => '您的邮箱地址现在已被确认。',
-'confirmemail_error' => '你的确认过程发生错误。',
-'confirmemail_subject' => '{{SITENAME}}电子邮件地址确认',
+'confirmemail_error' => '在确认您的过程中发生错误。',
+'confirmemail_subject' => '来自{{SITENAME}}的电子邮件地址确认函',
 'confirmemail_body' => '来自IP地址$1的用户(可能是您)在{{SITENAME}}上创建了账户“$2”,并提交了您
 的电子邮箱地址。
 
@@ -3655,8 +3668,8 @@ $3
 $5
 
 确认码会在$4过期。',
-'confirmemail_invalidated' => '电邮地址确认已取消',
-'invalidateemail' => '取消电邮确认',
+'confirmemail_invalidated' => '邮件地址确认已取消',
+'invalidateemail' => '取消邮件地址确认',
 
 # Scary transclusion
 'scarytranscludedisabled' => '[跨网站的编码转换不可用]',
@@ -3729,16 +3742,16 @@ $5
 'lag-warn-high' => '由于数据库的过度延迟,过去$1秒的更改未必会在这个列表中显示。',
 
 # Watchlist editor
-'watchlistedit-numitems' => '不计讨论页面,你的监视列表包含$1个标题。',
-'watchlistedit-noitems' => '的监视列表中没有标题。',
+'watchlistedit-numitems' => '不包括讨论页面,您的监视列表包含$1个标题。',
+'watchlistedit-noitems' => '的监视列表中没有标题。',
 'watchlistedit-normal-title' => '编辑监视列表',
 'watchlistedit-normal-legend' => '删除监视列表中的标题',
-'watchlistedit-normal-explain' => '你的监视列表中的标题显示在下方。要删除标题,请勾选它前面选择框并单击“{{int:Watchlistedit-normal-submit}}”。你也可以[[Special:EditWatchlist/raw|编辑原始列表]]。',
+'watchlistedit-normal-explain' => '您的监视列表中的标题会显示在下方。要删除标题,请勾选它前面的选择框并点击“{{int:Watchlistedit-normal-submit}}”。您也可以[[Special:EditWatchlist/raw|编辑原始列表]]。',
 'watchlistedit-normal-submit' => '删除标题',
-'watchlistedit-normal-done' => '已从你的监视列表删除$1个标题:',
+'watchlistedit-normal-done' => '已从您的监视列表删除了$1个标题:',
 'watchlistedit-raw-title' => '编辑原始监视列表',
 'watchlistedit-raw-legend' => '编辑原始监视列表',
-'watchlistedit-raw-explain' => 'æ\82¨ç\9a\84ç\9b\91è§\86å\88\97表中ç\9a\84æ \87é¢\98å\9c¨ä¸\8bé\9d¢æ\98¾ç¤ºï¼\8cå\90\8cæ\97¶äº¦é\83½å\8f¯ä»¥é\80\9aè¿\87ç¼\96è¾\91è¿\99个表å\8e»å\8a å\85¥ä»¥å\8f\8a移é\99¤æ \87é¢\98ï¼\9bä¸\80è¡\8cä¸\80个æ \87é¢\98ã\80\82å½\93å®\8cæ\88\90以å\90\8eï¼\8cç\82¹å\87»{{int:Watchlistedit-raw-submit}}ã\80\82你亦é\83½å\8f¯ä»¥å\8e»用[[Special:EditWatchlist|标准编辑器]]。',
+'watchlistedit-raw-explain' => 'æ\82¨ç\9a\84ç\9b\91è§\86å\88\97表中ç\9a\84æ \87é¢\98å\9c¨ä¸\8bé\9d¢æ\98¾ç¤ºï¼\8cå\90\8cæ\97¶ä¹\9få\8f¯ä»¥å\8f¯ä»¥é\80\9aè¿\87ç¼\96è¾\91è¿\99个表å\8e»å\8a å\85¥ä»¥å\8f\8a移é\99¤æ \87é¢\98ï¼\9bä¸\80è¡\8cä¸\80个æ \87é¢\98ã\80\82å½\93å®\8cæ\88\90以å\90\8eï¼\8cç\82¹å\87»{{int:Watchlistedit-raw-submit}}ã\80\82æ\82¨ä¹\9få\8f¯ä»¥ä½¿用[[Special:EditWatchlist|标准编辑器]]。',
 'watchlistedit-raw-titles' => '标题:',
 'watchlistedit-raw-submit' => '更新监视列表',
 'watchlistedit-raw-done' => '您的监视列表已经更新。',
@@ -3778,11 +3791,11 @@ $5
 'version-poweredby-credits' => "本Wiki由'''[//www.mediawiki.org/ MediaWiki]'''驱动,版权所有 © 2001-$1 $2。",
 'version-poweredby-others' => '其他',
 'version-credits-summary' => '我们感谢下列人士为[[Special:Version|MediaWiki]]作出的贡献。',
-'version-license-info' => 'MediaWiki为自由软件;您可依据自由软件基金会所发表的GNU通用公共授权条款规定,就本程序再为发布与/或修改;无论您依据的是本授权的第二版或(您自行选择的)任一日后发行的版本
+'version-license-info' => 'MediaWiki 是一款自由软件;您可根据自由软件基金会所发表的 GNU 通用公共许可证条款规定,无论您依据的是本授权的第二版或(您自行选择的)任一日后发行的版本,将本程序再发布与/或做出修改
 
-MediaWiki是基于使用目的而加以发布,然而不负任何担保责任;亦无对适售性或特定目的适用性所为的默示性担保。详情请参照GNU通用公共授权
+MediaWiki 是基于使用目的而加以发布,然而不负任何担保责任;也没有对适售性或特定目的适用性所为的默示性担保。详情请参照 GNU 通用公共许可证条款
 
-您应已收到附随于本程序的[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU通用公共授权的副本];如果没有,请写信至自由软件基金会:51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或[//www.gnu.org/licenses/old-licenses/gpl-2.0.html 在线阅读]。',
+您应已收到附随于本程序的[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU 通用公共许可证副本];如果没有,请发送邮件至自由软件基金会:51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或[//www.gnu.org/licenses/old-licenses/gpl-2.0.html 在线阅读]。',
 'version-software' => '已安装的软件',
 'version-software-product' => '产品',
 'version-software-version' => '版本',
@@ -3796,7 +3809,7 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 'filepath' => '文件路径',
 'filepath-page' => '文件名:',
 'filepath-submit' => '提交',
-'filepath-summary' => 'æ­¤ç\89¹æ®\8a页é\9d¢è¿\94å\9b\9eæ\96\87件ç\9a\84å®\8cæ\95´è·¯å¾\84ã\80\82å\9b¾å\83\8fä¼\9a以å®\8cæ\95´ç\9a\84å\88\86辨ç\8e\87æ\98¾ç¤ºï¼\8cå\85¶å®\83ç\9a\84æ\96\87件类å\9e\8b亦将直接通过关联的应用程序打开。',
+'filepath-summary' => 'æ­¤ç\89¹æ®\8a页é\9d¢è¿\94å\9b\9eæ\96\87件ç\9a\84å®\8cæ\95´è·¯å¾\84ã\80\82å\9b¾å\83\8fä¼\9a以å®\8cæ\95´ç\9a\84å\88\86辨ç\8e\87æ\98¾ç¤ºï¼\8cå\85¶å®\83ç\9a\84æ\96\87件类å\9e\8bä¹\9f将直接通过关联的应用程序打开。',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => '搜索重复文件',
@@ -3864,7 +3877,7 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 'compare-submit' => '对比',
 'compare-invalid-title' => '您指定的标题无效。',
 'compare-title-not-exists' => '您指定的标题不存在。',
-'compare-revision-not-exists' => '你指定的版本不存在。',
+'compare-revision-not-exists' => '您指定的修订版本不存在。',
 
 # Database error messages
 'dberr-header' => '本wiki出现了问题',
@@ -3872,7 +3885,7 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 本网站出现了一些技术问题。',
 'dberr-again' => '请等待几分钟后重试。',
 'dberr-info' => '(无法连接到数据库服务器:$1)',
-'dberr-usegoogle' => '在此期间您可以尝试用Google来搜索。',
+'dberr-usegoogle' => '在此期间您可以尝试用 Google 来搜索。',
 'dberr-outofdate' => '须注意他们索引出来的内容可能不是最新的。',
 'dberr-cachederror' => '这是所请求页面的缓存副本,可能不是最新的。',
 
@@ -3929,7 +3942,7 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 'rightsnone' => '(无)',
 
 # Feedback
-'feedback-bugornote' => '如果你准备好详细描述一个技术问题,请[$1 报告bug]。或者你可以使用下面的简单表格。你的评论将被添加至页面“[$3 $2]”,附有你的用户名和使用的浏览器。',
+'feedback-bugornote' => '如果您准备好详细描述一个技术问题,请[$1 报告bug]。或者您也可以使用下面的简单表格。您的评论将被添加至页面“[$3 $2]”,附有您的用户名和所使用的浏览器。',
 'feedback-subject' => '主题:',
 'feedback-message' => '信息:',
 'feedback-cancel' => '取消',
@@ -3938,7 +3951,7 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 'feedback-error1' => '错误:从API返回无法识别的结果',
 'feedback-error2' => '错误:编辑失败',
 'feedback-error3' => '错误:API没有响应',
-'feedback-thanks' => '谢谢!的反馈已发布至页面“[$2 $1]”。',
+'feedback-thanks' => '谢谢!的反馈已发布至页面“[$2 $1]”。',
 'feedback-close' => '完成',
 'feedback-bugcheck' => '请检查本bug是否为[$1 已知bug]。',
 'feedback-bugnew' => '我检查了。报告新bug',
@@ -3948,7 +3961,7 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 'searchsuggest-containing' => '含有...',
 
 # API errors
-'api-error-badaccess-groups' => '你没有将文件上传到此wiki的权限。',
+'api-error-badaccess-groups' => '您没有将文件上传到此 wiki 的权限。',
 'api-error-badtoken' => '内部错误:会话无效。',
 'api-error-copyuploaddisabled' => '通过URL上传的功能已被此服务器禁用。',
 'api-error-duplicate' => '在网站上已经具有相同内容的{{PLURAL:$1|[$2 另一个文件]|[$2 另一些文件]}}。',
@@ -3965,10 +3978,10 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 'api-error-filetype-banned' => '此类文件被禁止。',
 'api-error-filetype-banned-type' => '$1{{PLURAL:$4|不是允许的文件类型}}。允许的{{PLURAL:$3|文件类型是|文件类型有}}$2。',
 'api-error-filetype-missing' => '该文件没有扩展名。',
-'api-error-hookaborted' => '试图进行的修改被一个扩展钩子终止。',
+'api-error-hookaborted' => '试图进行的修改被一个扩展钩子终止。',
 'api-error-http' => '内部错误:无法连接到服务器。',
 'api-error-illegal-filename' => '文件名非法。',
-'api-error-internal-error' => '内部错误:此wiki在处理的上传数据时出现了错误。',
+'api-error-internal-error' => '内部错误:此wiki在处理的上传数据时出现了错误。',
 'api-error-invalid-file-key' => '内部错误:找不到临时文件。',
 'api-error-missingparam' => '内部错误:请求中缺少参数。',
 'api-error-missingresult' => '内部错误:无法确定是否复制成功。',
@@ -3979,13 +3992,14 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 'api-error-ok-but-empty' => '内部错误:服务器没有响应。',
 'api-error-overwrite' => '不允许覆盖现有文件。',
 'api-error-stashfailed' => '内部错误:服务器保存临时文件失败。',
+'api-error-publishfailed' => '内部错误:服务器发布临时文件失败。',
 'api-error-timeout' => '服务器没有在预期内响应。',
 'api-error-unclassified' => '出现未知错误。',
 'api-error-unknown-code' => '未知错误:$1',
 'api-error-unknown-error' => '内部错误:尝试上传文件时出错。',
 'api-error-unknown-warning' => '未知的警告:$1',
 'api-error-unknownerror' => '未知错误:$1。',
-'api-error-uploaddisabled' => '该wiki停用上传。',
+'api-error-uploaddisabled' => '该 wiki 禁用上传功能。',
 'api-error-verification-error' => '该文件可能损坏或扩展名错误。',
 
 # Durations
index e5262f8..613a60d 100644 (file)
@@ -243,7 +243,7 @@ $messages = array(
 'tog-externaleditor' => '預設使用外部編輯器 (進階者專用,需要在您的電腦上作出一些特別設定。[//www.mediawiki.org/wiki/Manual:External_editors 更多信息。])',
 'tog-externaldiff' => '預設使用外部差異分析 (進階者專用,需要在您的電腦上作出一些特別設定。[//www.mediawiki.org/wiki/Manual:External_editors 更多信息。])',
 'tog-showjumplinks' => '啟用「跳轉到」訪問連結',
-'tog-uselivepreview' => '使用實時預覽 (需要JavaScript)',
+'tog-uselivepreview' => '使用實時預覽 (需要JavaScript)(試驗中)',
 'tog-forceeditsummary' => '當沒有輸入摘要時提醒我',
 'tog-watchlisthideown' => '監視列表中隱藏我的編輯',
 'tog-watchlisthidebots' => '監視列表中隱藏機器人的編輯',
@@ -560,20 +560,20 @@ $1',
 'readonly_lag' => '附屬資料庫伺服器正在將快取更新到主伺服器,資料庫已被自動鎖定',
 'internalerror' => '內部錯誤',
 'internalerror_info' => '內部錯誤:$1',
-'fileappenderrorread' => '當附加時無法讀取"$1"。',
-'fileappenderror' => '不能附加"$1"到"$2"。',
-'filecopyerror' => '無法複製檔案"$1"到"$2"。',
-'filerenameerror' => '無法重新命名檔案"$1"到"$2"。',
+'fileappenderrorread' => '當附加時無法讀取「$1」。',
+'fileappenderror' => '不能附加「$1」到「$2」。',
+'filecopyerror' => '無法複製檔案「$1」到「$2」。',
+'filerenameerror' => '無法重新命名檔案「$1」到「$2」。',
 'filedeleteerror' => '無法刪除「$1」檔案。',
-'directorycreateerror' => '無法建立目錄"$1"。',
+'directorycreateerror' => '無法建立目錄「$1」。',
 'filenotfound' => '找不到「$1」檔案。',
 'fileexistserror' => '無法寫入檔案"$1": 檔案已存在',
 'unexpected' => '不正常值:"$1"="$2"。',
 'formerror' => '錯誤:無法提交表單',
 'badarticleerror' => '無法在此頁進行該操作。',
-'cannotdelete' => '無法刪除頁面或圖片“$1”
+'cannotdelete' => '無法刪除頁面或圖片「$1」
 它可能已經被其他人刪除了。',
-'cannotdelete-title' => '無法刪除“$1”',
+'cannotdelete-title' => '無法刪除頁面「$1」',
 'delete-hook-aborted' => '刪除被勾點中止。
 它沒有提供解釋。',
 'badtitle' => '錯誤的標題',
@@ -606,9 +606,9 @@ $2',
 'customjsprotected' => '你並無權限去編輯此JavaScript頁面,因為他包含了另一位用戶的個人設定。',
 'ns-specialprotected' => '特殊頁面是不可以編輯的。',
 'titleprotected' => "這個標題已經被[[User:$1|$1]]保護以防止建立。理由是''$2''。",
-'filereadonlyerror' => '無法修改文件" $1 "因為文件庫" $2 "處於唯讀模式。 !
-管理員鎖定它的解釋是:" $3 "。',
-'invalidtitle-knownnamespace' => '使用名字空間“$2”和文本“$3”的無效標題',
+'filereadonlyerror' => '無法修改文件「$1」因為文件庫「$2」處於唯讀模式。 !
+管理員鎖定它的解釋是:「$3」。',
+'invalidtitle-knownnamespace' => '使用名字空間「$2」和文本「$3」的無效標題',
 'invalidtitle-unknownnamespace' => '使用未知名字空間編號$1和文本“$2”的無效標題',
 'exception-nologin' => '未登入',
 'exception-nologin-text' => '你需要登錄此wiki查閲此頁或進行操作。',
@@ -681,9 +681,9 @@ $2',
 
 如果是其他人發出了該請求,或者您已經記起了您的密碼並不準備改變它,
 您可以忽略此消息並繼續使用您的舊密碼。',
-'noemail' => '用戶"$1"沒有登記電子郵件地址。',
+'noemail' => '用戶「$1」沒有登記電子郵件地址。',
 'noemailcreate' => '您需要提供一個有效的電子郵件地址',
-'passwordsent' => '用戶"$1"的新密碼已經寄往所登記的電子郵件地址。
+'passwordsent' => '用戶「$1」的新密碼已經寄往所登記的電子郵件地址。
 請在收到後再登入。',
 'blocked-mailpassword' => '您的IP地址處於查封狀態而不允許編輯,為了安全起見,密碼恢復功能已被禁用。',
 'eauthentsent' => '一封確認信已經發送到所示的地址。在發送其它郵件到此賬戶前,您必須首先依照這封信中的指導確認這個電子郵件信箱真實有效。',
@@ -867,7 +867,8 @@ $2
 
 這通常是因為過時的頁面歷史鏈接被刪除。
 詳情請閱[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。',
-'userpage-userdoesnotexist' => '未曾創建用戶名「<nowiki>$1</nowiki>」。請在創建/編輯這個頁面前先檢查一下。',
+'userpage-userdoesnotexist' => '用戶「$1」尚未註冊。
+請在建立/編輯這個頁面前先檢查一下。',
 'userpage-userdoesnotexist-view' => '未曾建立用戶名「$1」。',
 'blocked-notice-logextract' => '這位用戶現正被封鎖。
 下面有最近的封鎖紀錄以供參考:',
@@ -886,7 +887,8 @@ $2
 '''還沒有儲存!'''",
 'sitejspreview' => "'''記住你現在只是預覽此 JavaScript 代碼。'''
 '''還沒有儲存!'''",
-'userinvalidcssjstitle' => "'''警告:''' 不存在面板\"\$1\"。注意自訂的 .css 和 .js 頁要使用小寫標題,例如,{{ns:user}}:Foo/vector.css 不同於 {{ns:user}}:Foo/Vector.css。",
+'userinvalidcssjstitle' => "'''警告:''' 不存在面板「$1」。
+注意自訂的 .css 和 .js 頁要使用小寫標題,例如,{{ns:user}}:Foo/vector.css 不同於 {{ns:user}}:Foo/Vector.css。",
 'updated' => '(已更新)',
 'note' => "'''注意:'''",
 'previewnote' => "'''請記住這只是預覽。'''
@@ -906,8 +908,8 @@ $2
 'edit_form_incomplete' => '編輯表單的某些部分沒有到達伺服器 ;請檢查您的編輯內容是否完整並再試一次。',
 'editing' => '編輯「$1」',
 'creating' => '創建$1',
-'editingsection' => '編輯“$1”(段落)',
-'editingcomment' => '編輯“$1”(新段落)',
+'editingsection' => '編輯「$1」(段落)',
+'editingcomment' => '編輯「$1」(新段落)',
 'editconflict' => '編輯衝突:$1',
 'explainconflict' => "有人在{{GENDER:|你|妳|你}}開始編輯後更改了頁面。
 上面的文字框內顯示的是目前本頁的內容。
@@ -931,7 +933,8 @@ $2
 '''不要在未獲授權的情況下發表!'''",
 'longpageerror' => "'''錯誤:您所提交的文本長度有{{PLURAL:$1|1|$1}}KB,這大於{{PLURAL:$2|1|$2}}KB的最大值。 '''
 因此,該文本無法保存。",
-'readonlywarning' => "'''警告: 資料庫被鎖定以進行維護,所以您目前將無法保存您的修改。'''您或許希望先將本段文字複製並保存到文字檔案,然後等一會兒再修改。
+'readonlywarning' => "'''警告: 資料庫被鎖定以進行維護,所以您目前將無法保存您的修改。'''
+您可先複製您的文字並保存到文字檔案,然後等一會兒再修改。
 
 鎖定資料庫的管理員有如下解釋:$1",
 'protectedpagewarning' => "'''警告:本頁已經被保護,只有擁有管理員許可權的用戶才可修改。'''
@@ -973,7 +976,7 @@ $2
 'defaultmessagetext' => '預設訊息文字',
 'content-failed-to-parse' => '未能轉換$2 內容成為$1:$3',
 'invalid-content-data' => '內容資料無效',
-'content-not-allowed-here' => '[[$2]]不允許"$1"頁上的內容',
+'content-not-allowed-here' => '[[$2]]頁面上不允許「$1」內容',
 
 # Content models
 'content-model-wikitext' => 'wiki語法',
@@ -1076,7 +1079,7 @@ $2
 'revdelete-nologid-title' => '無效的日誌項目',
 'revdelete-nologid-text' => '您尚未指定一個目標日誌項目去進行這個動作或指定的項目不存在。',
 'revdelete-no-file' => '指定的檔案不存在。',
-'revdelete-show-file-confirm' => '{{GENDER:|你|妳|你}}是否真的是想去檢視於$2 $3刪除 "$1" 的檔案修訂?',
+'revdelete-show-file-confirm' => '{{GENDER:|你|妳|你}}是否真的是想去檢視於$2 $3刪除「<nowiki>$1</nowiki>」的檔案修訂?',
 'revdelete-show-file-submit' => '是',
 'revdelete-selected' => "'''選取[[:$1]]的$2次修訂:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|選取的日誌項目}}:'''",
@@ -1164,7 +1167,7 @@ $1",
 # Diffs
 'history-title' => '「$1」的修訂歷史',
 'difference-title' => '$1:修訂版本之間的差異',
-'difference-title-multipage' => '"$1"和"$2": 頁面之間的差異',
+'difference-title-multipage' => '頁面「$1」與「$2」之間的差異',
 'difference-multipage' => '(頁面間的差異)',
 'lineno' => '第$1行:',
 'compareselectedversions' => '比較選定的修訂版本',
@@ -1180,9 +1183,9 @@ $1",
 # Search results
 'searchresults' => '搜尋結果',
 'searchresults-title' => '對「$1」的搜尋結果',
-'searchresulttext' => '有關搜索{{SITENAME}}的更多詳情,參見[[{{MediaWiki:Helppage}}|{{int:help}}]]。',
-'searchsubtitle' => '查詢\'\'\'[[:$1]]\'\'\'([[Special:Prefixindex/$1|所有以 "$1" 開頭的頁面]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|所有連結到 "$1" 的頁面]])',
-'searchsubtitleinvalid' => '查詢"$1"',
+'searchresulttext' => '有關搜索{{SITENAME}}的更多詳情參見[[{{MediaWiki:Helppage}}|{{int:help}}]]。',
+'searchsubtitle' => "查詢'''[[:$1]]'''([[Special:Prefixindex/$1|所有以「$1」開頭的頁面]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|所有連結到「$1」的頁面]])",
+'searchsubtitleinvalid' => "查詢'''$1'''",
 'toomanymatches' => '過多的匹配已回應,請嘗試一個不同的查詢',
 'titlematches' => '頁面標題相符',
 'notitlematches' => '沒有找到匹配頁面題目',
@@ -1555,7 +1558,7 @@ $1",
 'newsectionsummary' => '/* $1 */ 新段落',
 'rc-enhanced-expand' => '顯示細節 (需要 JavaScript)',
 'rc-enhanced-hide' => '隱藏細節',
-'rc-old-title' => 'æ\9c\80å\88\9då\89µå»ºç\82º"$1"',
+'rc-old-title' => 'æ\9c\80å\88\9d建ç«\8bç\82ºã\80\8c$1ã\80\8d',
 
 # Recent changes linked
 'recentchangeslinked' => '相關更改',
@@ -1606,12 +1609,12 @@ $1",
 'ignorewarning' => '忽略警告並儲存檔案',
 'ignorewarnings' => '忽略所有警告',
 'minlength1' => '檔案名字必須至少有一個字母。',
-'illegalfilename' => '檔案名“$1”包含有頁面標題所禁止的字符。請改名後重新上傳。',
+'illegalfilename' => '檔案名「$1」包含有頁面標題所禁止的字符。請改名後重新上傳。',
 'filename-toolong' => '文件名不能超過240字節。',
 'badfilename' => '檔案名已被改為「$1」。',
 'filetype-mime-mismatch' => '檔案擴展名 ".$1" 不配所偵測檔案的MIME類型 ($2)。',
-'filetype-badmime' => 'MIME類別"$1"不是容許的檔案格式。',
-'filetype-bad-ie-mime' => '不可以上傳這個檔案,因為 Internet Explorer 會將它偵測為 "$1",它是一種不容許以及有潛在危險性之檔案類型。',
+'filetype-badmime' => 'MIME類別「$1」不是容許的檔案格式。',
+'filetype-bad-ie-mime' => '不可以上傳這個檔案,因為 Internet Explorer 會將它偵測為「$1」,它是一種不容許以及有潛在危險性之檔案類型。',
 'filetype-unwanted-type' => "'''\".\$1\"'''是一種不需要的檔案類型。
 建議的{{PLURAL:\$3|一種|多種}}檔案類型有\$2。",
 'filetype-banned-type' => "'''「.$1」'''{{PLURAL:$4|不是允許的檔案類型|是不允許的檔案類型}}。 
@@ -1692,33 +1695,33 @@ $1',
 'upload-too-many-redirects' => '在網址中有太多重新定向',
 'upload-unknown-size' => '未知的大小',
 'upload-http-error' => '已發生一個HTTP錯誤:$1',
-'upload-copy-upload-invalid-domain' => '不能從該域名上載檔ð£\97\88å\89¯æ\9c¬ã\80\82',
+'upload-copy-upload-invalid-domain' => '不能從該域名上載檔æ¡\88å\89¯æ\9c¬ã\80\82',
 
 # File backend
-'backend-fail-stream' => '無法流傳送文件$1。',
-'backend-fail-backup' => '無法備份文件$1。',
+'backend-fail-stream' => '無法流傳送文件「$1」。',
+'backend-fail-backup' => '無法備份文件「$1」。',
 'backend-fail-notexists' => '條目$1不存在。',
 'backend-fail-hashes' => '比較無法獲取文件hashes',
-'backend-fail-notsame' => '$1已存在不同的文件。',
-'backend-fail-invalidpath' => '$1不是有效的存儲路徑。',
+'backend-fail-notsame' => '「$1」已存在不同的檔案。',
+'backend-fail-invalidpath' => '「$1」不是有效的存儲路徑。',
 'backend-fail-delete' => '無法刪除「$1」檔案。',
 'backend-fail-describe' => '無法修改檔案「$1」的元數據。',
-'backend-fail-alreadyexists' => '“$1”頁面已存在',
+'backend-fail-alreadyexists' => '檔案「$1」已存在。',
 'backend-fail-store' => '無法在$2存儲文件$1。',
 'backend-fail-copy' => '無法複製文件$1到$2。',
 'backend-fail-move' => '無法移動文件$1到$2。',
 'backend-fail-opentemp' => '無法打開臨時文件。',
 'backend-fail-writetemp' => '無法寫臨時文件。',
 'backend-fail-closetemp' => '無法創建臨時文件。',
-'backend-fail-read' => 'æ\89¾ä¸\8då\88°æ\96\87件â\80\9c$1â\80\9d。',
-'backend-fail-create' => '無法寫入檔案  $1。',
-'backend-fail-maxsize' => '無法寫入檔𣗈$1​​,因為它大於$2字節。',
+'backend-fail-read' => 'æ\89¾ä¸\8då\88°æª\94æ¡\88ã\80\8c$1ã\80\8d。',
+'backend-fail-create' => '無法寫入檔案「$1」。',
+'backend-fail-maxsize' => '無法寫入檔案「$1」​​,因為它大於$2字節。',
 'backend-fail-readonly' => '「$1」儲存後端目前是唯讀模式,因為:「$2」',
-'backend-fail-synced' => '文件"$1"在內部存儲後端是不一致的區域。',
-'backend-fail-connect' => '無法連結至存儲後方“$1”。',
-'backend-fail-internal' => '存儲後方“$1”發生了一個未知錯誤。',
-'backend-fail-contenttype' => '無法確定檔案的內容類型以存儲於“$1”。',
-'backend-fail-batchsize' => '存儲後端被給予了$1次æª\94ð£\97\88 {{PLURAL:$1|æ\93\8dä½\9c\93\8dä½\9c}} ï¼\9bé\99\90å\88¶æ\98¯$2次{{PLURAL:$2|æ\93\8dä½\9c\93\8dä½\9c}}ã\80\82',
+'backend-fail-synced' => '文件「$1」在內部存儲後端是不一致的區域。',
+'backend-fail-connect' => '無法連結至存儲後方「$1」。',
+'backend-fail-internal' => '存儲後方「$1」發生了一個未知錯誤。',
+'backend-fail-contenttype' => '無法確定檔案的內容類型以存儲於「$1」。',
+'backend-fail-batchsize' => '存儲後端被給予了ã\80\8c$1ã\80\8d次æª\94æ¡\88 {{PLURAL:$1|æ\93\8dä½\9c\93\8dä½\9c}} ï¼\9bé\99\90å\88¶æ\98¯$2次{{PLURAL:$2|æ\93\8dä½\9c\93\8dä½\9c}}ã\80\82',
 'backend-fail-usable' => '由於沒有足夠的權限或缺少路徑/容器,所以無法讀取或寫入檔案 $1 。',
 
 # File journal errors
@@ -1762,16 +1765,16 @@ $1',
 它可能是基於CGI的,因而不支持img_auth。
 請參見 https://www.mediawiki.org/wiki/Manual:Image_Authorization',
 'img-auth-notindir' => '所請求的路徑不在已經設定的上載目錄。',
-'img-auth-badtitle' => '不能夠由"$1"建立一個有效標題。',
-'img-auth-nologinnWL' => '您而家並未登入,"$1"不在白名單上。',
-'img-auth-nofile' => '檔案"$1"不存在。',
-'img-auth-isdir' => '您嘗試過存取一個目錄"$1"
+'img-auth-badtitle' => '不能夠由「$1」建立一個有效標題。',
+'img-auth-nologinnWL' => '您而家並未登入,「$1」不在白名單上。',
+'img-auth-nofile' => '檔案「$1」不存在。',
+'img-auth-isdir' => '您嘗試過存取一個目錄「$1」
 只是可以存取檔案。',
-'img-auth-streaming' => '串流中"$1"。',
+'img-auth-streaming' => '串流「$1」中。',
 'img-auth-public' => 'img_auth.php的功能是由一個公共wiki中輸出檔案。
 這個wiki是已經設定做一個公共wiki。
 基於保安最佳化,img_auth.php已經停用。',
-'img-auth-noread' => '用戶無存取權去讀"$1"。',
+'img-auth-noread' => '用戶無權讀取「$1」。',
 'img-auth-bad-query-string' => 'URL有一個無效的查詢字符串',
 
 # HTTP errors
@@ -1908,7 +1911,7 @@ $1',
 
 # Random redirect
 'randomredirect' => '隨機重定向頁面',
-'randomredirect-nopages' => '在 "$1" 名字空間中沒有重定向頁面。',
+'randomredirect-nopages' => '在「$1」名字空間中沒有重定向頁面。',
 
 # Statistics
 'statistics' => '統計',
@@ -2063,7 +2066,7 @@ Template:消除歧義',
 'allpagessubmit' => '提交',
 'allpagesprefix' => '顯示具有此前綴(名字空間)的頁面:',
 'allpagesbadtitle' => '給定的頁面標題是非法的,或者具有一個內部語言或內部 wiki 的前綴。它可能包含一個或更多的不能用於標題的字元。',
-'allpages-bad-ns' => '在{{SITENAME}}中沒有一個叫做"$1"的名字空間。',
+'allpages-bad-ns' => '在{{SITENAME}}中沒有一個叫做「$1」的名字空間。',
 'allpages-hide-redirects' => '隱藏重定向頁',
 
 # SpecialCachedPage
@@ -2141,7 +2144,7 @@ Template:消除歧義',
 'emailpagetext' => '您可以用下面的表格去寄一封電郵給這位{{Gender:$1|用戶}}。
 您在[[Special:Preferences|您的參數設置]]中所輸入的電子郵件地址將出現在郵件「發件人」一欄中,這樣該用戶就可以回覆您。',
 'usermailererror' => '目標郵件地址返回錯誤:',
-'defemailsubject' => '{{SITENAME}}來自用戶“$1”的電子郵件',
+'defemailsubject' => '{{SITENAME}}來自用戶「$1」的電子郵件',
 'usermaildisabled' => '用戶電郵已停用',
 'usermaildisabledtext' => '您不可以發送電郵到這個wiki上的其他用戶',
 'noemailtitle' => '無e-mail地址',
@@ -2202,7 +2205,7 @@ Template:消除歧義',
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => '正在監視...',
 'unwatching' => '正在停止監視...',
-'watcherrortext' => '在更改你的監視列表設定"$1"時發生了錯誤',
+'watcherrortext' => '更改「$1」的監視列表設定時發生錯誤。',
 
 'enotif_mailer' => '{{SITENAME}}郵件通知器',
 'enotif_reset' => '將所有頁面標為已閱讀',
@@ -2312,7 +2315,7 @@ $UNWATCHURL
 'unprotectedarticle' => '已解除"[[$1]]"保護',
 'movedarticleprotection' => '已將「[[$2]]」的保護設定移動至「[[$1]]」',
 'protect-title' => '更改「$1」的保護等級',
-'protect-title-notallowed' => '查看“$1”的保護等級',
+'protect-title-notallowed' => '查看「$1」的保護等級',
 'prot_1movedto2' => '[[$1]]移動到[[$2]]',
 'protect-badnamespace-title' => '不可被保護的名字空間',
 'protect-badnamespace-text' => '這個名字空間內的頁面無法被保護。',
@@ -2333,9 +2336,9 @@ $UNWATCHURL
 以下是'''$1'''現時的保護級別:",
 'protect-cascadeon' => '以下的{{PLURAL:$1|一個|多個}}頁面包含着本頁面的同時,啟動了連鎖保護,因此本頁面目前也被保護,未能編輯。您可以設定本頁面的保護級別,但這並不會對連鎖保護有所影響。',
 'protect-default' => '容許所有用戶',
-'protect-fallback' => '需要"$1"的許可',
-'protect-level-autoconfirmed' => '禁止新的和未註冊的用戶',
-'protect-level-sysop' => '僅操作員',
+'protect-fallback' => '僅允許有「$1」權限的用戶',
+'protect-level-autoconfirmed' => '僅允許自動確認使用者',
+'protect-level-sysop' => '僅允許管理員',
 'protect-summary-cascade' => '連鎖',
 'protect-expiring' => '終止於 $1 (UTC)',
 'protect-expiring-local' => '$1到期',
@@ -2409,7 +2412,7 @@ $UNWATCHURL
 'undelete-no-results' => '刪除記錄裡沒有符合的結果。',
 'undelete-filename-mismatch' => '不能刪除帶有時間截記的檔案修訂 $1: 檔案不匹配',
 'undelete-bad-store-key' => '不能刪除帶有時間截記的檔案修訂 $1: 檔案於刪除前遺失。',
-'undelete-cleanup-error' => '刪除無用的存檔檔案 "$1" 時發生錯誤。',
+'undelete-cleanup-error' => '刪除無用的存檔檔案「$1」時發生錯誤。',
 'undelete-missing-filearchive' => '由於檔案存檔 ID $1 不在資料庫中,不能在檔案存檔中恢復。它可能已經反刪除了。',
 'undelete-error' => '恢復已刪除頁面時出錯',
 'undelete-error-short' => '反刪除檔案時發生錯誤: $1',
@@ -2629,7 +2632,7 @@ $1被封禁的理由是“$2”',
 您應當負責確定所有連結依然會連到指定的頁面。
 
 注意如果新頁面已經有內容的話,頁面將'''不會'''被移動,
-除非新頁面無內容或是重定向頁,而且沒有修訂歷史。
+除非新頁面是重定向頁,而且沒有修訂歷史。
 這意味著您再必要時可以在移動到新頁面後再移回老的頁面,
 同時您也無法覆蓋現有頁面。
 
@@ -2812,8 +2815,8 @@ $1被封禁的理由是“$2”',
 'import-error-edit' => '「$1」無法導入,因為您不准編輯它。',
 'import-error-create' => '「$1」無法導入,因為您不准創造它。',
 'import-error-interwiki' => '頁面"$1"未能導入,這是因為他的頁面名稱預留了供跨維基連結使用。',
-'import-error-special' => '"$1"未能導入因為該頁面使用一個不能創建頁面的特殊名字空間。',
-'import-error-invalid' => '"$1"不能導入,因為名字無效。',
+'import-error-special' => '「$1」未能導入因為該頁面使用一個不能創建頁面的特殊名字空間。',
+'import-error-invalid' => '「$1」不能導入,因為名字無效。',
 'import-error-unserialize' => '頁面「$1」的修訂版本「$2」不能反序列。該修訂版本是以$3內容模式序列為$4。',
 'import-options-wrong' => '{{PLURAL:$2|選項}}出錯:<nowiki>$1</nowiki>',
 'import-rootpage-invalid' => '指定的根頁標題無效。',
@@ -2831,7 +2834,7 @@ $1被封禁的理由是“$2”',
 'javascripttest' => 'JavaScript測試',
 'javascripttest-title' => '運行$1測試。',
 'javascripttest-pagetext-noframework' => '這個頁面預留了作JavaScript測試。',
-'javascripttest-pagetext-unknownframework' => '未知框架"$1"',
+'javascripttest-pagetext-unknownframework' => '未知的測試框架「$1」。',
 'javascripttest-pagetext-frameworks' => '請選擇以下其中一個測試框架:$1',
 'javascripttest-pagetext-skins' => '選擇運行測試的外觀:',
 'javascripttest-qunit-intro' => '請看mediawiki.org的[$1 測試說明]',
@@ -3038,10 +3041,10 @@ $1被封禁的理由是“$2”',
 'filedeleteerror-long' => '當刪除檔案時遇到錯誤:
 
 $1',
-'filedelete-missing' => '因為檔案 "$1" 不存在,所以它不可以刪除。',
-'filedelete-old-unregistered' => '所指定的檔案修訂 "$1" 在資料庫中不存在。',
-'filedelete-current-unregistered' => '所指定的檔案 "$1" 在資料庫中不存在。',
-'filedelete-archive-read-only' => '存檔目錄 "$1" 在網頁伺服器中不可寫。',
+'filedelete-missing' => '因為檔案「$1」不存在,所以它不可以刪除。',
+'filedelete-old-unregistered' => '所指定的檔案修訂「$1」在資料庫中不存在。',
+'filedelete-current-unregistered' => '所指定的檔案「$1」在資料庫中不存在。',
+'filedelete-archive-read-only' => '存檔目錄「$1」在網頁伺服器中不可寫。',
 
 # Browsing diffs
 'previousdiff' => '←上一版本',
@@ -3700,8 +3703,8 @@ $5
 'signature' => '[[{{ns:user}}:$1|$2]]([[{{ns:user_talk}}:$1|留言]])',
 
 # Core parser functions
-'unknown_extension_tag' => '不明的擴展標籤 "$1"',
-'duplicate-defaultsort' => '警告: 預設的排序鍵 "$2" 覆蓋先前的預設排序鍵 "$1"。',
+'unknown_extension_tag' => '不明的擴展標籤「$1」',
+'duplicate-defaultsort' => '警告: 預設的排序鍵「$2」覆蓋先前的預設排序鍵「$1」。',
 
 # Special:Version
 'version' => '版本',
@@ -3749,9 +3752,9 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'fileduplicatesearch-filename' => '檔案名稱:',
 'fileduplicatesearch-submit' => '搜尋',
 'fileduplicatesearch-info' => '$1 × $2 像素<br />檔案大小:$3<br />MIME 類型:$4',
-'fileduplicatesearch-result-1' => '檔案 "$1" 無完全相同的重覆。',
-'fileduplicatesearch-result-n' => '檔案 "$1" 有$2項完全相同的重覆。',
-'fileduplicatesearch-noresults' => '沒有發現名為"$1"的文件。',
+'fileduplicatesearch-result-1' => '檔案「$1」無完全相同的重覆。',
+'fileduplicatesearch-result-n' => '檔案「$1」有$2項完全相同的重覆。',
+'fileduplicatesearch-noresults' => '沒有發現名為「$1」的文件。',
 
 # Special:SpecialPages
 'specialpages' => '特殊頁面',
@@ -3923,7 +3926,8 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'api-error-nomodule' => '內部錯誤:缺少上傳模塊集。',
 'api-error-ok-but-empty' => '內部錯誤:伺服器沒有響應。',
 'api-error-overwrite' => '不允許覆蓋現有檔案。',
-'api-error-stashfailed' => '內部錯誤:伺服器保存臨時文件失敗。',
+'api-error-stashfailed' => '內部錯誤:伺服器保存臨時檔案失敗。',
+'api-error-publishfailed' => '內部錯誤:伺服器發佈臨時檔案失敗。',
 'api-error-timeout' => '伺服器沒有在預期的時間內回應。',
 'api-error-unclassified' => '發生未知錯誤。',
 'api-error-unknown-code' => '未知錯誤:$1',
index b0371c0..45df0e9 100644 (file)
@@ -952,7 +952,10 @@ abstract class Maintenance {
                $this->output( 'Searching for active text records in archive table...' );
                $res = $dbw->query( "SELECT DISTINCT ar_text_id FROM $tbl_arc" );
                foreach ( $res as $row ) {
-                       $cur[] = $row->ar_text_id;
+                       # old pre-MW 1.5 records can have null ar_text_id's.
+                       if ( $row->ar_text_id !== null ) {
+                               $cur[] = $row->ar_text_id;
+                       }
                }
                $this->output( "done.\n" );
 
index dc03c34..441e8ae 100644 (file)
@@ -44,6 +44,7 @@ class UploadStashCleanup extends Maintenance {
                global $wgUploadStashMaxAge;
 
                $repo = RepoGroup::singleton()->getLocalRepo();
+               $tempRepo = $repo->getTempRepo();
 
                $dbr = $repo->getSlaveDb();
 
@@ -58,54 +59,80 @@ class UploadStashCleanup extends Maintenance {
                        __METHOD__
                );
 
-               if( !is_object( $res ) || $res->numRows() == 0 ) {
-                       $this->output( "No files to cleanup!\n" );
-                       // nothing to do.
-                       return;
-               }
-
-               // finish the read before starting writes.
-               $keys = array();
-               foreach( $res as $row ) {
-                       array_push( $keys, $row->us_key );
-               }
+               // Delete all registered stash files...
+               if ( $res->numRows() == 0 ) {
+                       $this->output( "No stashed files to cleanup according to the DB.\n" );
+               } else {
+                       // finish the read before starting writes.
+                       $keys = array();
+                       foreach( $res as $row ) {
+                               array_push( $keys, $row->us_key );
+                       }
 
-               $this->output( 'Removing ' . count( $keys ) . " file(s)...\n" );
-               // this could be done some other, more direct/efficient way, but using
-               // UploadStash's own methods means it's less likely to fall accidentally
-               // out-of-date someday
-               $stash = new UploadStash( $repo );
+                       $this->output( 'Removing ' . count( $keys ) . " file(s)...\n" );
+                       // this could be done some other, more direct/efficient way, but using
+                       // UploadStash's own methods means it's less likely to fall accidentally
+                       // out-of-date someday
+                       $stash = new UploadStash( $repo );
 
-               $i = 0;
-               foreach( $keys as $key ) {
-                       $i++;
-                       try {
-                               $stash->getFile( $key, true );
-                               $stash->removeFileNoAuth( $key );
-                       } catch ( UploadStashBadPathException $ex ) {
-                               $this->output( "Failed removing stashed upload with key: $key\n"  );
-                       } catch ( UploadStashZeroLengthFileException $ex ) {
-                               $this->output( "Failed removing stashed upload with key: $key\n"  );
-                       }
-                       if ( $i % 100 == 0 ) {
-                               $this->output( "$i\n" );
+                       $i = 0;
+                       foreach( $keys as $key ) {
+                               $i++;
+                               try {
+                                       $stash->getFile( $key, true );
+                                       $stash->removeFileNoAuth( $key );
+                               } catch ( UploadStashBadPathException $ex ) {
+                                       $this->output( "Failed removing stashed upload with key: $key\n"  );
+                               } catch ( UploadStashZeroLengthFileException $ex ) {
+                                       $this->output( "Failed removing stashed upload with key: $key\n"  );
+                               }
+                               if ( $i % 100 == 0 ) {
+                                       $this->output( "$i\n" );
+                               }
                        }
+                       $this->output( "$i done\n" );
                }
-               $this->output( "$i done\n" );
 
-               $tempRepo = $repo->getTempRepo();
+               // Delete all the corresponding thumbnails...
                $dir      = $tempRepo->getZonePath( 'thumb' );
                $iterator = $tempRepo->getBackend()->getFileList( array( 'dir' => $dir ) );
-
                $this->output( "Deleting old thumbnails...\n" );
                $i = 0;
                foreach ( $iterator as $file ) {
-                       $i++;
                        if ( wfTimestamp( TS_UNIX, $tempRepo->getFileTimestamp( "$dir/$file" ) ) < $cutoff ) {
-                               $tempRepo->quickPurge( "$dir/$file" );
+                               $status = $tempRepo->quickPurge( "$dir/$file" );
+                               if ( !$status->isOK() ) {
+                                       $this->error( print_r( $status->getErrorsArray(), true ) );
+                               }
+                               if ( ( ++$i % 100 ) == 0 ) {
+                                       $this->output( "$i\n" );
+                               }
                        }
-                       if ( $i % 100 == 0 ) {
-                               $this->output( "$i\n" );
+               }
+               $this->output( "$i done\n" );
+
+               // Apparently lots of stash files are not registered in the DB...
+               $dir      = $tempRepo->getZonePath( 'public' );
+               $iterator = $tempRepo->getBackend()->getFileList( array( 'dir' => $dir ) );
+               $this->output( "Deleting orphaned temp files...\n" );
+               if ( strpos( $dir, '/local-temp' ) === false ) { // sanity check
+                       $this->error( "Temp repo is not using the temp container.", 1 ); // die
+               }
+               $i = 0;
+               foreach ( $iterator as $file ) {
+                       // Absolute sanity check for stashed files and file segments
+                       if ( !preg_match( '#(^\d{14}!|\.\d+\.\w+\.\d+$)#', basename( $file ) ) ) {
+                               $this->output( "Skipped non-stash $file\n" );
+                               continue;
+                       }
+                       if ( wfTimestamp( TS_UNIX, $tempRepo->getFileTimestamp( "$dir/$file" ) ) < $cutoff ) {
+                               $status = $tempRepo->quickPurge( "$dir/$file" );
+                               if ( !$status->isOK() ) {
+                                       $this->error( print_r( $status->getErrorsArray(), true ) );
+                               }
+                               if ( ( ++$i % 100 ) == 0 ) {
+                                       $this->output( "$i\n" );
+                               }
                        }
                }
                $this->output( "$i done\n" );
index aebdee1..4e3c7fa 100644 (file)
@@ -134,6 +134,17 @@ class CopyFileBackend extends Maintenance {
                $ops = array();
                $fsFiles = array();
                $copiedRel = array(); // for output message
+
+               // Download the batch of source files into backend cache...
+               if ( $this->hasOption( 'missingonly' ) ) {
+                       $srcPaths = array();
+                       foreach ( $srcPathsRel as $srcPathRel ) {
+                               $srcPaths[] = $src->getRootStoragePath() . "/$backendRel/$srcPathRel";
+                       }
+                       $fsFiles = $src->getLocalReferenceMulti( array( 'srcs' => $srcPaths, 'latest' => 1 ) );
+               }
+
+               // Determine what files need to be copied over...
                foreach ( $srcPathsRel as $srcPathRel ) {
                        $srcPath = $src->getRootStoragePath() . "/$backendRel/$srcPathRel";
                        $dstPath = $dst->getRootStoragePath() . "/$backendRel/$srcPathRel";
@@ -144,8 +155,9 @@ class CopyFileBackend extends Maintenance {
                                $this->output( "Already have $srcPathRel.\n" );
                                continue; // assume already copied...
                        }
-                       // Note: getLocalReference() is fast for FS backends
-                       $fsFile = $src->getLocalReference( array( 'src' => $srcPath, 'latest' => 1 ) );
+                       $fsFile = array_key_exists( $srcPath, $fsFiles )
+                               ? $fsFiles[$srcPath]
+                               : $src->getLocalReference( array( 'src' => $srcPath, 'latest' => 1 ) );
                        if ( !$fsFile ) {
                                $this->error( "Could not get local copy of $srcPath.", 1 ); // die
                        } elseif ( !$fsFile->exists() ) {
@@ -167,6 +179,7 @@ class CopyFileBackend extends Maintenance {
                        $copiedRel[] = $srcPathRel;
                }
 
+               // Copy in the batch of source files...
                $t_start = microtime( true );
                $status = $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) );
                if ( !$status->isOK() ) {
index 87bc1c2..3b2292f 100644 (file)
@@ -214,7 +214,6 @@ $wgIgnoredMessages = array(
        '1movedto2',
        '1movedto2_redir',
        'move-redirect-suppressed',
-       // 'newuserlog-byemail',
        'newuserlog-create-entry',
        'newuserlog-create2-entry',
        'newuserlog-autocreate-entry',
index 50a6f2e..1ab22e2 100644 (file)
@@ -3735,8 +3735,8 @@ $wgMessageStructure = array(
                'logentry-newusers-newusers',
                'logentry-newusers-create',
                'logentry-newusers-create2',
+               'logentry-newusers-byemail',
                'logentry-newusers-autocreate',
-               'newuserlog-byemail',
                'logentry-rights-rights',
                'logentry-rights-rights-legacy',
                'logentry-rights-autopromote',
@@ -3761,7 +3761,6 @@ $wgMessageStructure = array(
                '1movedto2',
                '1movedto2_redir',
                'move-redirect-suppressed',
-               // 'newuserlog-byemail',
                'newuserlog-create-entry',
                'newuserlog-create2-entry',
                'newuserlog-autocreate-entry',
@@ -3823,6 +3822,7 @@ $wgMessageStructure = array(
                'api-error-ok-but-empty',
                'api-error-overwrite',
                'api-error-stashfailed',
+               'api-error-publishfailed',
                'api-error-timeout',
                'api-error-unclassified',
                'api-error-unknown-code',
index e07e62d..4e0f291 100644 (file)
 /** */
 require_once( __DIR__ . '/commandLine.inc' );
 
-$mcc = new MWMemcached( array( 'persistent' => true/*, 'debug' => true*/ ) );
-$mcc->set_servers( $wgMemCachedServers );
-# $mcc->set_debug( true );
+$debug = in_array( '--debug', $argv );
+$help = in_array( '--help', $argv );
 
-function mccShowHelp( $command ) {
+if( $help ) {
+       mccShowUsage();
+       exit( 0 );
+}
+$mcc = new MWMemcached( array(
+       'persistent' => true,
+       'debug' => $debug,
+) );
+
+if ( $wgMainCacheType === CACHE_MEMCACHED ) {
+       $mcc->set_servers( $wgMemCachedServers );
+} elseif( isset( $wgObjectCaches[$wgMainCacheType] ) ) {
+       $mcc->set_servers( $wgObjectCaches[$wgMainCacheType]['servers'] );
+} else {
+       print "MediaWiki isn't configured for Memcached usage\n";
+       exit( 1 );
+}
+
+/**
+ * Show this command line tool usage.
+ */
+function mccShowUsage() {
+       echo <<<EOF
+Usage:
+       mcc.php [--debug]
+       mcc.php --help
+
+MemCached Command (mcc) is an interactive command tool that let you interact
+with the MediaWiki memcached cache.
+
+Options:
+       --debug Set debug mode on the memcached connection.
+       --help  This help screen.
+
+Interactive commands:
+
+EOF;
+       print "\t";
+       print str_replace( "\n", "\n\t", mccGetHelp( false ) );
+       print "\n";
+}
+
+function mccGetHelp( $command ) {
+       $output = '';
        $commandList = array(
                'get' => 'grabs something',
                'getsock' => 'lists sockets',
@@ -48,13 +90,15 @@ function mccShowHelp( $command ) {
        if ( $command === 'fullhelp' ) {
                $max_cmd_len = max( array_map( 'strlen', array_keys( $commandList ) ) );
                foreach ( $commandList as $cmd => $desc ) {
-                       printf( "%-{$max_cmd_len}s: %s\n", $cmd, $desc );
+                       $output .= sprintf( "%-{$max_cmd_len}s: %s\n", $cmd, $desc );
                }
        } elseif ( isset( $commandList[$command] ) ) {
-               print "$command: $commandList[$command]\n";
+               $output .= "$command: $commandList[$command]\n";
        } else {
-               print "$command: command does not exist or no help for it\n";
+               $output .= "$command: command does not exist or no help for it\n";
        }
+
+       return $output;
 }
 
 do {
@@ -72,8 +116,8 @@ do {
        switch ( $command ) {
                case 'help':
                        // show an help message
-                       mccShowHelp( array_shift( $args ) );
-               break;
+                       print mccGetHelp( array_shift( $args ) );
+                       break;
 
                case 'get':
                        $sub = '';
@@ -93,7 +137,7 @@ do {
                        } else {
                                var_dump( $res );
                        }
-               break;
+                       break;
 
                case 'getsock':
                        $res = $mcc->get( $args[0] );
index 691b832..42461c5 100644 (file)
@@ -40,14 +40,21 @@ class mcTest extends Maintenance {
        }
 
        public function execute() {
-               global $wgMemCachedServers, $wgMemCachedTimeout;
+               global $wgMainCacheType, $wgMemCachedTimeout, $wgObjectCaches;
 
                $iterations = $this->getOption( 'i', 100 );
                if ( $this->hasArg() ) {
-                       $wgMemCachedServers = array( $this->getArg() );
+                       $servers = array( $this->getArg() );
+               } elseif ( $wgMainCacheType === CACHE_MEMCACHED ) {
+                       global $wgMemCachedServers;
+                       $servers = $wgMemCachedServers ;
+               } elseif( isset( $wgObjectCaches[$wgMainCacheType] ) ) {
+                       $servers = $wgObjectCaches[$wgMainCacheType]['servers'];
+               } else {
+                       $this->error( "MediaWiki isn't configured for Memcached usage", 1 );
                }
 
-               foreach ( $wgMemCachedServers as $server ) {
+               foreach ( $servers as $server ) {
                        $this->output( $server . " ", $server );
                        $mcc = new MemCachedClientforWiki( array(
                                'persistant' => true,
index fe03f51..7b25566 100644 (file)
@@ -176,8 +176,16 @@ class RefreshLinks extends Maintenance {
        }
 
        /**
-        * Update the redirect entry for a given page
-        * @param $id int The page_id of the redirect
+        * Update the redirect entry for a given page.
+        *
+        * This methods bypasses the "redirect" table to get the redirect target,
+        * and parses the page's content to fetch it. This allows to be sure that
+        * the redirect target is up to date and valid.
+        * This is particularly useful when modifying namespaces to be sure the
+        * entry in the "redirect" table points to the correct page and not to an
+        * invalid one.
+        *
+        * @param $id int The page ID to check
         */
        private function fixRedirect( $id ) {
                $page = WikiPage::newFromID( $id );
@@ -191,14 +199,25 @@ class RefreshLinks extends Maintenance {
                        return;
                }
 
-               $rt = $page->getRedirectTarget();
+               $rt = null;
+               $content = $page->getContent( Revision::RAW );
+               if ( $content !== null ) {
+                       $rt = $content->getUltimateRedirectTarget();
+               }
 
                if ( $rt === null ) {
                        // The page is not a redirect
                        // Delete any redirect table entry for it
-                       $dbw->delete( 'redirect', array( 'rd_from' => $id ),
-                               __METHOD__ );
+                       $dbw->delete( 'redirect', array( 'rd_from' => $id ), __METHOD__ );
+                       $fieldValue = 0;
+               } else {
+                       $page->insertRedirectEntry( $rt );
+                       $fieldValue = 1;
                }
+
+               // Update the page table to be sure it is an a consistent state
+               $dbw->update( 'page', array( 'page_is_redirect' => $fieldValue ),
+                       array( 'page_id' => $id ), __METHOD__ );
        }
 
        /**
index d401dec..8d2819d 100644 (file)
@@ -53,6 +53,10 @@ class RunJobs extends Maintenance {
        public function execute() {
                global $wgTitle;
 
+               if ( wfReadOnly() ) {
+                       $this->error( "Unable to run jobs; the wiki is in read-only mode.", 1 ); // die
+               }
+
                if ( $this->hasOption( 'procs' ) ) {
                        $procs = intval( $this->getOption( 'procs' ) );
                        if ( $procs < 1 || $procs > 1000 ) {
index 8a760ac..950855f 100644 (file)
  * @file
  */
 
+if( !defined( 'MEDIAWIKI' ) ) {
+       die( 'Not an entry point.' );
+}
+
 return array(
 
        /* Special modules who have their own classes */
@@ -97,7 +101,6 @@ return array(
                        'common/commonInterface.css' => array( 'media' => 'screen' ),
                        'vector/screen.css' => array( 'media' => 'screen' ),
                        'vector/screen-hd.css' => array( 'media' => 'screen and (min-width: 982px)' ),
-                       'vector/print.css' => array( 'media' => 'print' ),
                ),
                'scripts' => 'vector/vector.js',
                'remoteBasePath' => $GLOBALS['wgStylePath'],
@@ -923,6 +926,9 @@ return array(
                ),
                'dependencies' => array( 'mediawiki.libs.jpegmeta', 'mediawiki.util' ),
        ),
+       'mediawiki.special.userlogin.signup' => array(
+               'scripts' => 'resources/mediawiki.special/mediawiki.special.userLogin.signup.js',
+       ),
        'mediawiki.special.javaScriptTest' => array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.javaScriptTest.js',
                'messages' => array_merge( Skin::getSkinNameMessages(), array(
index ae6f2b0..cddd4ec 100644 (file)
 
                        var conditions, dir, i, op, val;
                        profile = $.isPlainObject( profile ) ? profile : $.client.profile();
-
                        dir = $( 'body' ).is( '.rtl' ) ? 'rtl' : 'ltr';
                        // Check over each browser condition to determine if we are running in a compatible client
                        if ( typeof map[dir] !== 'object' || map[dir][profile.name] === undefined ) {
                                return true;
                        }
                        conditions = map[dir][profile.name];
+                       if ( conditions === false ) {
+                               return false;
+                       }
                        for ( i = 0; i < conditions.length; i++ ) {
                                op = conditions[i][0];
                                val = conditions[i][1];
-                               if ( val === false ) {
-                                       return false;
-                               }
                                if ( typeof val === 'string' ) {
                                        if ( !( eval( 'profile.version' + op + '"' + val + '"' ) ) ) {
                                                return false;
                                        }
                                }
                        }
+
                        return true;
                }
        };
index 514dbd5..f8af0a0 100644 (file)
@@ -77,17 +77,20 @@ var language = {
        /**
         * Converts a number using digitTransformTable.
         *
-        * @param {num} number Value to be converted
+        * @param {Number} number Value to be converted
         * @param {boolean} integer Convert the return value to an integer
+        * @return {Number|String} formatted number
         */
        convertNumber: function ( num, integer ) {
                var i, tmp, transformTable, numberString, convertedNumber;
 
-               if ( !mw.language.digitTransformTable ) {
+               // Set the target Transform table:
+               transformTable = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'digitTransformTable' );
+
+               if ( !transformTable ) {
                        return num;
                }
-               // Set the target Transform table:
-               transformTable = mw.language.digitTransformTable;
+
                // Check if the "restore" to Latin number flag is set:
                if ( integer ) {
                        if ( parseInt( num, 10 ) === num ) {
diff --git a/resources/mediawiki.special/mediawiki.special.userLogin.signup.js b/resources/mediawiki.special/mediawiki.special.userLogin.signup.js
new file mode 100644 (file)
index 0000000..bba4260
--- /dev/null
@@ -0,0 +1,10 @@
+/**
+ * JavaScript for Special:UserLogin/signup
+ */
+jQuery( document ).ready( function ( $ ) {
+       $( '#wpCreateaccountMail' )
+               .on( 'change', function() {
+                       $( '.mw-row-password' ).toggle( !$( this ).attr( 'checked' ) );
+               } )
+               .trigger( 'change' );
+} );
index 2cb4c3a..643e5c3 100644 (file)
@@ -76,8 +76,8 @@
 
        // Regular expressions to parse many common URIs.
        var parser = {
-               strict: /^(?:([^:\/?#]+):)?(?:\/\/(?:(?:([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)?((?:[^?#\/]*\/)*[^?#]*)(?:\?([^#]*))?(?:#(.*))?/,
-               loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?(?:(?:([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?((?:\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?[^?#\/]*)(?:\?([^#]*))?(?:#(.*))?/
+               strict: /^(?:([^:\/?#]+):)?(?:\/\/(?:(?:([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?([^:\/?#]*)(?::(\d*))?)?((?:[^?#\/]*\/)*[^?#]*)(?:\?([^#]*))?(?:#(.*))?/,
+               loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?(?:(?:([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?([^:\/?#]*)(?::(\d*))?((?:\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?[^?#\/]*)(?:\?([^#]*))?(?:#(.*))?/
        },
 
        // The order here matches the order of captured matches in the above parser regexes.
index c599f4b..934e906 100644 (file)
                 */
                return function () {
                        var $target = this.empty();
+                       // TODO: Simply $target.append( failableParserFn( arguments ).contents() )
+                       // or Simply $target.append( failableParserFn( arguments ) )
                        $.each( failableParserFn( arguments ).contents(), function ( i, node ) {
                                $target.append( node );
                        } );
                                                $span.append( childNode );
                                        } );
                                } else {
-                                       // strings, integers, anything else
-                                       $span.append( node );
+                                       // Let jQuery append nodes, arrays of nodes and jQuery objects
+                                       // other things (strings, numbers, ..) are appended as text nodes (not as HTML strings)
+                                       $span.append( $.type( node ) === 'object' ? node : document.createTextNode( node ) );
                                }
                        } );
                        return $span;
                 * Note that we expect the parsed parameter to be zero-based. i.e. $1 should have become [ 0 ].
                 * if the specified parameter is not found return the same string
                 * (e.g. "$99" -> parameter 98 -> not found -> return "$99" )
-                * TODO throw error if nodes.length > 1 ?
+                * TODO: Throw error if nodes.length > 1 ?
                 * @param {Array} of one element, integer, n >= 0
                 * @return {String} replacement
                 */
                        var index = parseInt( nodes[0], 10 );
 
                        if ( index < replacements.length ) {
-                               if ( typeof arg === 'string' ) {
-                                       // replacement is a string, escape it
-                                       return mw.html.escape( replacements[index] );
-                               } else {
-                                       // replacement is no string, don't touch!
-                                       return replacements[index];
-                               }
+                               return replacements[index];
                        } else {
                                // index not found, fallback to displaying variable
                                return '$' + ( index + 1 );
                 */
                int: function ( nodes ) {
                        return mw.jqueryMsg.getMessageFunction()( nodes[0].toLowerCase() );
+               },
+
+               /**
+                * Takes an unformatted number (arab, no group separators and . as decimal separator)
+                * and outputs it in the localized digit script and formatted with decimal
+                * separator, according to the current language
+                * @param {Array} of nodes
+                * @return {Number|String} formatted number
+                */
+               formatnum: function ( nodes ) {
+                       var isInteger = ( nodes[1] && nodes[1] === 'R' ) ? true : false,
+                               number = nodes[0];
+
+                       return this.language.convertNumber( number, isInteger );
                }
        };
        // Deprecated! don't rely on gM existing.
diff --git a/skins/vector/print.css b/skins/vector/print.css
deleted file mode 100644 (file)
index 1bc0146..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-div#footer {
-       margin-left: 0;
-}
index 8373b51..30b9f94 100644 (file)
@@ -77,7 +77,7 @@ $wgAutoloadClasses += array(
        'GenericArrayObjectTest' => "$testDir/phpunit/includes/libs/GenericArrayObjectTest.php",
 
        # tests/phpunit/includes/site
-       'SiteObjectTest' => "$testDir/phpunit/includes/site/SiteObjectTest.php",
+       'SiteTest' => "$testDir/phpunit/includes/site/SiteTest.php",
        'TestSites' => "$testDir/phpunit/includes/site/TestSites.php",
 
        # tests/phpunit/languages
index df3a9e8..e6d6c2c 100644 (file)
@@ -785,6 +785,24 @@ x <div>foo</div> z
 
 !! end
 
+!! test
+Empty lines between block tags to test open p-tags are closed between the block tags
+!! input
+<div></div>
+
+
+<div></div>a
+
+b
+!! result
+<div></div>
+<p><br />
+</p>
+<div></div>a
+<p>b
+</p>
+!! end
+
 ###
 ### Preformatted text
 ###
@@ -1207,6 +1225,23 @@ c
 
 !!end
 
+!!test
+2c. Indent-Pre and tables (bug 42252)
+!!input
+{|
+ |+ foo
+ !  | bar
+|}
+!!result
+<table>
+<caption> foo
+</caption>
+<tr>
+<th> bar
+</th></tr></table>
+
+!!end
+
 !!test
 3a. Indent-Pre and block tags (single-line html)
 !!input
@@ -1291,6 +1326,20 @@ c
 
 !!end
 
+!! test
+5. White-space in indent-pre
+NOTE: the white-space char on 2nd line is significant
+!! input
+ a<br/>
+ b
+!! result
+<pre>a<br />
+
+b
+</pre>
+!! end
+
 ###
 ### HTML-pre (some to spec PHP parser behavior and some Parsoid-RT-centric)
 ###
@@ -3663,6 +3712,24 @@ language=kaa
 </p>
 !! end
 
+!! test
+Parsoid-centric test: Whitespace in ext- and wiki-links should be preserved
+!! input
+[[Foo|  bar]]
+
+[[Foo|  ''bar'']]
+
+[http://wp.org   foo]
+
+[http://wp.org   ''foo'']
+!! result
+<p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">  bar</a>
+</p><p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">  <i>bar</i></a>
+</p><p><a rel="nofollow" class="external text" href="http://wp.org">foo</a>
+</p><p><a rel="nofollow" class="external text" href="http://wp.org"><i>foo</i></a>
+</p>
+!! end
+
 ###
 ### Interwiki links (see maintenance/interwiki.sql)
 ###
@@ -4159,6 +4226,20 @@ disabled
 </li></ul>
 !! end
 
+!! test
+Unclosed formatting tags that straddle lists are closed and reopened
+(Disabled since php parser generates broken html -- relies on Tidy to fix up)
+!! options
+disabled
+!! input
+# <s> a
+# b </s>
+!! result
+<ol><li> <s> a </s>
+</li><li> <s> b </s>
+</li></ol>
+!! end
+
 !! test
 List items are not parsed correctly following a <pre> block (bug 785)
 !! input
@@ -4648,7 +4729,7 @@ Magic links: RFC (bug 479)
 !! input
 RFC 822
 !! result
-<p><a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc822">RFC 822</a>
+<p><a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc822">RFC 822</a>
 </p>
 !! end
 
@@ -4666,7 +4747,7 @@ Magic links: PMID incorrectly converts space to underscore
 !! input
 PMID 1234
 !! result
-<p><a class="external mw-magiclink-pmid" href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract">PMID 1234</a>
+<p><a class="external mw-magiclink-pmid" rel="nofollow" href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract">PMID 1234</a>
 </p>
 !! end
 
@@ -6826,7 +6907,7 @@ BUG 1887: A RFC with a thumbnail
 !! input
 [[Image:foobar.jpg|thumb|This is RFC 12354]]
 !! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is <a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc12354">RFC 12354</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is <a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc12354">RFC 12354</a></div></div></div>
 
 !! end
 
@@ -10436,7 +10517,7 @@ Double RFC
 !! input
 RFC RFC 1234
 !! result
-<p>RFC <a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc1234">RFC 1234</a>
+<p>RFC <a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc1234">RFC 1234</a>
 </p>
 !! end
 
@@ -10454,7 +10535,7 @@ RFC code coverage
 !! input
 RFC   983&#x20;987
 !! result
-<p><a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc983">RFC 983</a>&#x20;987
+<p><a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc983">RFC 983</a>&#x20;987
 </p>
 !! end
 
@@ -12594,6 +12675,23 @@ File:foobar.jpg|caption|alt=galleryalt|link=" onclick="alert('malicious javascri
 
 !! end
 
+!!test
+Gallery with invalid title as link (bug 43964)
+!! input
+<gallery>
+File:foobar.jpg|link=<
+</gallery>
+!! result
+<ul class="gallery">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+</ul>
+
+!! end
+
 !!test
 Language parser function
 !! input
@@ -13179,6 +13277,23 @@ disabled
 </tbody></table>
 !! end
 
+!! test
+Tables: 4d. No escaping needed
+!! input
+{|
+||+1
+||-2
+|}
+!! result
+<table>
+<tr>
+<td>+1
+</td>
+<td>-2
+</td></tr></table>
+
+!! end
+
 #### --------------- Links ---------------
 #### 1. Quote marks in link text
 #### 2. Wikilinks: Escapes needed
index 0dc18a2..1a02cb8 100644 (file)
@@ -496,6 +496,7 @@ class GlobalTest extends MediaWikiTestCase {
         * @param String $expectedText: Text after merge has been completed
         *
         * @dataProvider provideMerge()
+        * @group medium
         */
        public function testMerge( $old, $mine, $yours, $expectedMergeResult, $expectedText ) {
                $this->checkHasDiff3();
diff --git a/tests/phpunit/includes/OutputPageTest.php b/tests/phpunit/includes/OutputPageTest.php
new file mode 100644 (file)
index 0000000..8b68703
--- /dev/null
@@ -0,0 +1,172 @@
+<?php
+
+/**
+ *
+ * @author Matthew Flaschen
+ *
+ * @group Output
+ *
+ */
+class OutputPageTest extends MediaWikiTestCase {
+       const SCREEN_MEDIA_QUERY = 'screen and (min-width: 982px)';
+       const SCREEN_ONLY_MEDIA_QUERY = 'only screen and (min-width: 982px)';
+
+       /**
+        * Tests a particular case of transformCssMedia, using the given input, globals,
+        * expected return, and message
+        *
+        * Asserts that $expectedReturn is returned.
+        *
+        * options['printableQuery'] - value of query string for printable, or omitted for none
+        * options['handheldQuery'] - value of query string for handheld, or omitted for none
+        * options['handheldForIPhone'] - value of the $wgHandheldForIPhone global
+        * options['media'] - passed into the method under the same name
+        * options['expectedReturn'] - expected return value
+        * options['message'] - PHPUnit message for assertion
+        *
+        * @param array $args key-value array of arguments as shown above
+        */
+       protected function assertTransformCssMediaCase($args) {
+               $queryData = array();
+               if ( isset( $args['printableQuery'] ) ) {
+                       $queryData['printable'] = $args['printableQuery'];
+               }
+
+               if ( isset( $args['handheldQuery'] ) ) {
+                       $queryData['handheld'] = $args['handheldQuery'];
+               }
+
+               $fauxRequest = new FauxRequest( $queryData, false );
+               $this->setMWGlobals( array(
+                               'wgRequest' => $fauxRequest,
+                               'wgHandheldForIPhone' => $args['handheldForIPhone']
+               ) );
+
+               $actualReturn = OutputPage::transformCssMedia( $args['media'] );
+               $this->assertSame( $args['expectedReturn'], $actualReturn, $args['message']);
+       }
+
+       /**
+        * Tests a case of transformCssMedia with both values of wgHandheldForIPhone.
+        * Used to verify that behavior is orthogonal to that option.
+        *
+        * If the value of wgHandheldForIPhone should matter, use assertTransformCssMediaCase.
+        *
+        * @param array $args key-value array of arguments as shown in assertTransformCssMediaCase.
+        * Will be mutated.
+        */
+       protected function assertTransformCssMediaCaseWithBothHandheldForIPhone($args) {
+               $message = $args['message'];
+               foreach( array( true, false ) as $handheldForIPhone ) {
+                       $args['handheldForIPhone'] = $handheldForIPhone;
+                       $stringHandheldForIPhone = var_export($handheldForIPhone, true);
+                       $args['message'] = "$message. \$wgHandheldForIPhone was $stringHandheldForIPhone";
+                       $this->assertTransformCssMediaCase( $args );
+               }
+       }
+
+       /**
+        * Tests print requests
+        */
+       public function testPrintRequests() {
+               $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+                       'printableQuery' => '1',
+                       'media' => 'screen',
+                       'expectedReturn' => null,
+                       'message' => 'On printable request, screen returns null'
+               ) );
+
+               $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+                       'printableQuery' => '1',
+                       'media' => self::SCREEN_MEDIA_QUERY,
+                       'expectedReturn' => null,
+                       'message' => 'On printable request, screen media query returns null'
+               ) );
+
+               $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+                       'printableQuery' => '1',
+                       'media' => self::SCREEN_ONLY_MEDIA_QUERY,
+                       'expectedReturn' => null,
+                       'message' => 'On printable request, screen media query with only returns null'
+               ) );
+
+               $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+                       'printableQuery' => '1',
+                       'media' => 'print',
+                       'expectedReturn' => '',
+                       'message' => 'On printable request, media print returns empty string'
+               ) );
+       }
+
+       /**
+        * Tests screen requests, without either query parameter set
+        */
+       public function testScreenRequests() {
+               $this->assertTransformCssMediaCase( array(
+                       'handheldForIPhone' => false,
+                       'media' => 'screen',
+                       'expectedReturn' => 'screen',
+                       'message' => 'On screen request, with handheldForIPhone false, screen media type is preserved'
+               ) );
+
+               $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+                       'media' => self::SCREEN_MEDIA_QUERY,
+                       'expectedReturn' => self::SCREEN_MEDIA_QUERY,
+                       'message' => 'On screen request, screen media query is preserved.'
+               ) );
+
+               $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+                       'media' => self::SCREEN_ONLY_MEDIA_QUERY,
+                       'expectedReturn' => self::SCREEN_ONLY_MEDIA_QUERY,
+                       'message' => 'On screen request, screen media query with only is preserved.'
+               ) );
+
+               $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+                       'media' => 'print',
+                       'expectedReturn' => 'print',
+                       'message' => 'On screen request, print media type is preserved'
+               ) );
+       }
+
+       /**
+        * Tests handheld and wgHandheldForIPhone behavior
+        */
+       public function testHandheld() {
+               $this->assertTransformCssMediaCaseWithBothHandheldForIPhone(array(
+                       'handheldQuery' => '1',
+                       'media' => 'handheld',
+                       'expectedReturn' => '',
+                       'message' => 'On request with handheld querystring and media is handheld, returns empty string'
+               ) );
+
+               $this->assertTransformCssMediaCaseWithBothHandheldForIPhone(array(
+                       'handheldQuery' => '1',
+                       'media' => 'screen',
+                       'expectedReturn' => null,
+                       'message' => 'On request with handheld querystring and media is screen, returns null'
+               ) );
+
+               // A bit counter-intuitively, $wgHandheldForIPhone should only matter if the query handheld is false or omitted
+               $this->assertTransformCssMediaCase(array(
+                       'handheldQuery' => '0',
+                       'media' => 'screen',
+                       'handheldForIPhone' => true,
+                       'expectedReturn' => 'screen and (min-device-width: 481px)',
+                       'message' => 'With $wgHandheldForIPhone true, screen media type is transformed'
+               ) );
+
+               $this->assertTransformCssMediaCase(array(
+                       'media' => 'handheld',
+                       'handheldForIPhone' => true,
+                       'expectedReturn' => 'handheld, only screen and (max-device-width: 480px)',
+                       'message' => 'With $wgHandheldForIPhone true, handheld media type is transformed'
+               ) );
+
+               $this->assertTransformCssMediaCase( array(
+                       'media' => 'handheld',
+                       'handheldForIPhone' => false,
+                       'expectedReturn' => 'handheld',
+                       'message' => 'With $wgHandheldForIPhone false, handheld media type is preserved'
+               ) );
+       }
+}
index 5930d6c..28e2e30 100644 (file)
@@ -112,57 +112,70 @@ class SanitizerTest extends MediaWikiTestCase {
                        'Self-closing closing div'
                );
        }
-       
-       function testDecodeTagAttributes() {
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=bar' ), array( 'foo' => 'bar' ), 'Unquoted attribute' );
-               $this->assertEquals( Sanitizer::decodeTagAttributes( '    foo   =   bar    ' ), array( 'foo' => 'bar' ), 'Spaced attribute' );
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo="bar"' ), array( 'foo' => 'bar' ), 'Double-quoted attribute' );
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=\'bar\'' ), array( 'foo' => 'bar' ), 'Single-quoted attribute' );
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=\'bar\'   baz="foo"' ), array( 'foo' => 'bar', 'baz' => 'foo' ), 'Several attributes' );
-               
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=\'bar\'   baz="foo"' ), array( 'foo' => 'bar', 'baz' => 'foo' ), 'Several attributes' );
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=\'bar\'   baz="foo"' ), array( 'foo' => 'bar', 'baz' => 'foo' ), 'Several attributes' );
-               
-               $this->assertEquals( Sanitizer::decodeTagAttributes( ':foo=\'bar\'' ), array( ':foo' => 'bar' ), 'Leading :' );
-               $this->assertEquals( Sanitizer::decodeTagAttributes( '_foo=\'bar\'' ), array( '_foo' => 'bar' ), 'Leading _' );
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'Foo=\'bar\'' ), array( 'foo' => 'bar' ), 'Leading capital' );
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'FOO=BAR' ), array( 'foo' => 'BAR' ), 'Attribute keys are normalized to lowercase' );
-               
-               # Invalid beginning
-               $this->assertEquals( Sanitizer::decodeTagAttributes( '-foo=bar' ), array(), 'Leading - is forbidden' );
-               $this->assertEquals( Sanitizer::decodeTagAttributes( '.foo=bar' ), array(), 'Leading . is forbidden' );
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo-bar=bar' ), array( 'foo-bar' => 'bar' ), 'A - is allowed inside the attribute' );
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo-=bar' ), array( 'foo-' => 'bar' ), 'A - is allowed inside the attribute' );
-               
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo.bar=baz' ), array( 'foo.bar' => 'baz' ), 'A . is allowed inside the attribute' );
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo.=baz' ), array( 'foo.' => 'baz' ), 'A . is allowed as last character' );
-               
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo6=baz' ), array( 'foo6' => 'baz' ), 'Numbers are allowed' );
-               
-               # This bit is more relaxed than XML rules, but some extensions use it, like ProofreadPage (see bug 27539)
-               $this->assertEquals( Sanitizer::decodeTagAttributes( '1foo=baz' ), array( '1foo' => 'baz' ), 'Leading numbers are allowed' );
-               
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo$=baz' ), array(), 'Symbols are not allowed' );
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo@=baz' ), array(), 'Symbols are not allowed' );
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo~=baz' ), array(), 'Symbols are not allowed' );
-               
-               
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=1[#^`*%w/(' ), array( 'foo' => '1[#^`*%w/(' ), 'All kind of characters are allowed as values' );
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo="1[#^`*%\'w/("' ), array( 'foo' => '1[#^`*%\'w/(' ), 'Double quotes are allowed if quoted by single quotes' );
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=\'1[#^`*%"w/(\'' ), array( 'foo' => '1[#^`*%"w/(' ), 'Single quotes are allowed if quoted by double quotes' );
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=&amp;&quot;' ), array( 'foo' => '&"' ), 'Special chars can be provided as entities' );
-               $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=&foobar;' ), array( 'foo' => '&foobar;' ), 'Entity-like items are accepted' );
+
+
+       /**
+        * @dataProvider provideTagAttributesToDecode
+        * @cover Sanitizer::decodeTagAttributes
+        */
+       function testDecodeTagAttributes( $expected, $attributes, $message = '' ) {
+               $this->assertEquals( $expected,
+                       Sanitizer::decodeTagAttributes( $attributes ),
+                       $message
+               );
+       }
+
+       function provideTagAttributesToDecode() {
+               return array(
+                       array( array( 'foo' => 'bar' ), 'foo=bar', 'Unquoted attribute' ),
+                       array( array( 'foo' => 'bar' ), '    foo   =   bar    ', 'Spaced attribute' ),
+                       array( array( 'foo' => 'bar' ), 'foo="bar"', 'Double-quoted attribute' ),
+                       array( array( 'foo' => 'bar' ), 'foo=\'bar\'', 'Single-quoted attribute' ),
+                       array( array( 'foo' => 'bar', 'baz' => 'foo' ), 'foo=\'bar\'   baz="foo"', 'Several attributes' ),
+                       array( array( 'foo' => 'bar', 'baz' => 'foo' ), 'foo=\'bar\'   baz="foo"', 'Several attributes' ),
+                       array( array( 'foo' => 'bar', 'baz' => 'foo' ), 'foo=\'bar\'   baz="foo"', 'Several attributes' ),
+                       array( array( ':foo' => 'bar' ), ':foo=\'bar\'', 'Leading :' ),
+                       array( array( '_foo' => 'bar' ), '_foo=\'bar\'', 'Leading _' ),
+                       array( array( 'foo' => 'bar' ), 'Foo=\'bar\'', 'Leading capital' ),
+                       array( array( 'foo' => 'BAR' ), 'FOO=BAR', 'Attribute keys are normalized to lowercase' ),
+
+                       # Invalid beginning
+                       array( array(), '-foo=bar', 'Leading - is forbidden' ),
+                       array( array(), '.foo=bar', 'Leading . is forbidden' ),
+                       array( array( 'foo-bar' => 'bar' ), 'foo-bar=bar', 'A - is allowed inside the attribute' ),
+                       array( array( 'foo-' => 'bar' ), 'foo-=bar', 'A - is allowed inside the attribute' ),
+                       array( array( 'foo.bar' => 'baz' ), 'foo.bar=baz', 'A . is allowed inside the attribute' ),
+                       array( array( 'foo.' => 'baz' ), 'foo.=baz', 'A . is allowed as last character' ),
+                       array( array( 'foo6' => 'baz' ), 'foo6=baz', 'Numbers are allowed' ),
+
+
+                       # This bit is more relaxed than XML rules, but some extensions use
+                       # it, like ProofreadPage (see bug 27539)
+                       array( array( '1foo' => 'baz' ), '1foo=baz', 'Leading numbers are allowed' ),
+                       array( array(), 'foo$=baz', 'Symbols are not allowed' ),
+                       array( array(), 'foo@=baz', 'Symbols are not allowed' ),
+                       array( array(), 'foo~=baz', 'Symbols are not allowed' ),
+                       array( array( 'foo' => '1[#^`*%w/(' ), 'foo=1[#^`*%w/(', 'All kind of characters are allowed as values' ),
+                       array( array( 'foo' => '1[#^`*%\'w/(' ), 'foo="1[#^`*%\'w/("', 'Double quotes are allowed if quoted by single quotes' ),
+                       array( array( 'foo' => '1[#^`*%"w/(' ), 'foo=\'1[#^`*%"w/(\'', 'Single quotes are allowed if quoted by double quotes' ),
+                       array( array( 'foo' => '&"' ), 'foo=&amp;&quot;', 'Special chars can be provided as entities' ),
+                       array( array( 'foo' => '&foobar;' ), 'foo=&foobar;', 'Entity-like items are accepted' ),
+               );
        }
 
        /**
         * @dataProvider provideDeprecatedAttributes
+        * @cover Sanitizer::fixTagAttributes
         */
-       function testDeprecatedAttributesUnaltered( $inputAttr, $inputEl ) {
-
-               $this->assertEquals( " $inputAttr", Sanitizer::fixTagAttributes( $inputAttr, $inputEl ) );
+       function testDeprecatedAttributesUnaltered( $inputAttr, $inputEl, $message = '' ) {
+               $this->assertEquals( " $inputAttr",
+                       Sanitizer::fixTagAttributes( $inputAttr, $inputEl ),
+                       $message
+               );
        }
 
        public static function provideDeprecatedAttributes() {
+               /** array( <attribute>, <element>, [message] ) */
                return array(
                        array( 'clear="left"', 'br' ),
                        array( 'clear="all"', 'br' ),
@@ -180,10 +193,10 @@ class SanitizerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideCssCommentsFixtures
+        * @cover Sanitizer::checkCss
         */
        function testCssCommentsChecking( $expected, $css, $message = '' ) {
-               $this->assertEquals(
-                       $expected,
+               $this->assertEquals( $expected,
                        Sanitizer::checkCss( $css ),
                        $message
                );
index 3a30b12..05f1408 100644 (file)
@@ -356,8 +356,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 
                $this->assertEquals( array( array( 'badaccess-group0' ), array( 'ns-specialprotected' ) ),
                                                         $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
-               $this->assertEquals( array( array( 'badaccess-group0' ) ),
-                                                        $this->title->getUserPermissionsErrors( 'execute', $this->user ) );
 
                $this->setTitle( NS_MAIN );
                $this->setUserPerm( 'bogus' );
index a764e9d..60f6537 100644 (file)
@@ -3,6 +3,7 @@
 /**
  * @group Database
  * @group API
+ * @group medium
  */
 class ApiCreateAccountTest extends ApiTestCase {
        function setUp() {
@@ -31,7 +32,7 @@ class ApiCreateAccountTest extends ApiTestCase {
                        'action' => 'createaccount',
                        'name' => 'Apitestnew',
                        'password' => $password,
-                       'email' => 'test@example.com',
+                       'email' => 'test@domain.test',
                        'realname' => 'Test Name'
                ) );
 
@@ -88,6 +89,13 @@ class ApiCreateAccountTest extends ApiTestCase {
                $a = $result['login']['result'];
 
                $this->assertEquals( 'Success', $a );
+
+               // log out to destroy the session
+               $ret = $this->doApiRequest( array(
+                       'action' => 'logout',
+                       ), $ret[2]
+               );
+               $this->assertEquals( array(), $ret[0] );
        }
 
        /**
@@ -133,12 +141,16 @@ class ApiCreateAccountTest extends ApiTestCase {
         * @expectedException UsageException
         */
        function testInvalidEmail() {
+               global $wgEnableEmail;
+               if( !$wgEnableEmail ) {
+                       $this->markTestSkipped( 'email is not enabled, so createaccount does not check it' );
+               }
                $this->doApiRequest( array(
                        'action' => 'createaccount',
                        'name' => 'Test User',
                        'token' => LoginForm::getCreateaccountToken(),
                        'password' => 'password',
-                       'email' => 'sjlfsjklj',
+                       'email' => 'invalid',
                ) );
        }
 }
index 52f1d28..dd4d598 100644 (file)
@@ -3,6 +3,7 @@
 /**
  * @group API
  * @group Database
+ * @group medium
  */
 class ApiBlockTest extends ApiTestCase {
 
index 2331459..902b7b8 100644 (file)
@@ -198,7 +198,8 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
 
        public function testReset() {
                $this->mUserMock->expects( $this->once() )
-                       ->method( 'resetOptions' );
+                       ->method( 'resetOptions' )
+                       ->with( $this->equalTo( array( 'all' ) ) );
 
                $this->mUserMock->expects( $this->never() )
                        ->method( 'setOption' );
@@ -213,6 +214,24 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                $this->assertEquals( self::$Success, $response );
        }
 
+       public function testResetKinds() {
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'resetOptions' )
+                       ->with( $this->equalTo( array( 'registered' ) ) );
+
+               $this->mUserMock->expects( $this->never() )
+                       ->method( 'setOption' );
+
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'saveSettings' );
+
+               $request = $this->getSampleRequest( array( 'reset' => '', 'resetkinds' => 'registered' ) );
+
+               $response = $this->executeQuery( $request );
+
+               $this->assertEquals( self::$Success, $response );
+       }
+
        public function testOptionWithValue() {
                $this->mUserMock->expects( $this->never() )
                        ->method( 'resetOptions' );
@@ -237,7 +256,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
 
                $this->mUserMock->expects( $this->once() )
                        ->method( 'setOption' )
-                       ->with( $this->equalTo( 'name' ), $this->equalTo( null ) );
+                       ->with( $this->equalTo( 'name' ), $this->identicalTo( null ) );
 
                $this->mUserMock->expects( $this->once() )
                        ->method( 'saveSettings' );
@@ -257,7 +276,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
 
                $this->mUserMock->expects( $this->at( 3 ) )
                        ->method( 'setOption' )
-                       ->with( $this->equalTo( 'willBeNull' ), $this->equalTo( null ) );
+                       ->with( $this->equalTo( 'willBeNull' ), $this->identicalTo( null ) );
 
                $this->mUserMock->expects( $this->at( 4 ) )
                        ->method( 'getOptions' );
@@ -322,19 +341,19 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
 
                $this->mUserMock->expects( $this->at( 2 ) )
                        ->method( 'setOption' )
-                       ->with( $this->equalTo( 'testmultiselect-opt1' ), $this->equalTo( true ) );
+                       ->with( $this->equalTo( 'testmultiselect-opt1' ), $this->identicalTo( true ) );
 
                $this->mUserMock->expects( $this->at( 3 ) )
                        ->method( 'setOption' )
-                       ->with( $this->equalTo( 'testmultiselect-opt2' ), $this->equalTo( false ) );
+                       ->with( $this->equalTo( 'testmultiselect-opt2' ), $this->identicalTo( null ) );
 
                $this->mUserMock->expects( $this->at( 4 ) )
                        ->method( 'setOption' )
-                       ->with( $this->equalTo( 'testmultiselect-opt3' ), $this->equalTo( false ) );
+                       ->with( $this->equalTo( 'testmultiselect-opt3' ), $this->identicalTo( false ) );
 
                $this->mUserMock->expects( $this->at( 5 ) )
                        ->method( 'setOption' )
-                       ->with( $this->equalTo( 'testmultiselect-opt4' ), $this->equalTo( false ) );
+                       ->with( $this->equalTo( 'testmultiselect-opt4' ), $this->identicalTo( false ) );
 
                $this->mUserMock->expects( $this->once() )
                        ->method( 'saveSettings' );
index b5dabf0..93ff24a 100644 (file)
@@ -3,6 +3,7 @@
 /**
  * @group API
  * @group Database
+ * @group medium
  */
 class ApiParseTest extends ApiTestCase {
 
index d903714..3ab77fd 100644 (file)
@@ -3,6 +3,7 @@
 /**
  * @group API
  * @group Database
+ * @group medium
  */
 class ApiPurgeTest extends ApiTestCase {
 
index 28dcb97..19da81c 100644 (file)
@@ -3,6 +3,7 @@
 /**
  * @group API
  * @group Database
+ * @group medium
  */
 class ApiQueryRevisionsTest extends ApiTestCase {
 
index dbf02f7..1b1886e 100644 (file)
@@ -3,6 +3,7 @@
 /**
  * @group API
  * @group Database
+ * @group medium
  */
 class ApiQueryTest extends ApiTestCase {
 
index a1b941d..2f2f5f9 100644 (file)
@@ -3,6 +3,7 @@
 /**
  * @group API
  * @group Database
+ * @group medium
  */
 class ApiTest extends ApiTestCase {
 
index 7e054a4..fcd581a 100644 (file)
@@ -147,6 +147,17 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                        'prop' => 'info' ), $session, false, $user->user );
                return $data;
        }
+
+       public function testApiTestGroup() {
+               $groups = PHPUnit_Util_Test::getGroups( get_class( $this ) );
+               $constraint = PHPUnit_Framework_Assert::logicalOr(
+                       $this->contains( 'medium' ),
+                       $this->contains( 'large' )
+               );
+               $this->assertThat( $groups, $constraint,
+                       'ApiTestCase::setUp can be slow, tests must be "medium" or "large"'
+               );
+       }
 }
 
 class UserWrapper {
index b7ae292..4fecec0 100644 (file)
@@ -3,6 +3,7 @@
 /**
  * @group API
  * @group Database
+ * @group medium
  * @todo This test suite is severly broken and need a full review
  */
 class ApiWatchTest extends ApiTestCase {
index 8209f59..d34e799 100644 (file)
@@ -3,6 +3,7 @@
 /**
  * @group API
  * @group Database
+ * @group medium
  */
 class ApiFormatPhpTest extends ApiFormatTestBase {
 
index 3501aec..ca387a2 100644 (file)
@@ -349,12 +349,15 @@ class TextContentTest extends MediaWikiLangTestCase {
         * @dataProvider dataGetDeletionUpdates
         */
        public function testDeletionUpdates( $title, $model, $text, $expectedStuff ) {
-               $title = Title::newFromText( $title );
-               $title->resetArticleID( 2342 ); //dummy id. fine as long as we don't try to execute the updates!
+               $ns = $this->getDefaultWikitextNS();
+               $title = Title::newFromText( $title, $ns );
 
                $content = ContentHandler::makeContent( $text, $title, $model );
 
-               $updates = $content->getDeletionUpdates( WikiPage::factory( $title ) );
+               $page = WikiPage::factory( $title );
+               $page->doEditContent( $content, '' );
+
+               $updates = $content->getDeletionUpdates( $page );
 
                // make updates accessible by class name
                foreach ( $updates as $update ) {
@@ -377,6 +380,8 @@ class TextContentTest extends MediaWikiLangTestCase {
                                $this->assertEquals( $value, $v, "unexpected value for field $field in instance of $class" );
                        }
                }
+
+               $page->doDeleteArticle( '' );
        }
 
        public static function provideConvert() {
index b76e9aa..7cf473e 100644 (file)
@@ -69,11 +69,14 @@ more stuff
         * @group Database
         */
        public function testGetSecondaryDataUpdates( $title, $model, $text, $expectedStuff ) {
-               $title = Title::newFromText( $title );
-               $title->resetArticleID( 2342 ); //dummy id. fine as long as we don't try to execute the updates!
+               $ns = $this->getDefaultWikitextNS();
+               $title = Title::newFromText( $title, $ns );
 
                $content = ContentHandler::makeContent( $text, $title, $model );
 
+               $page = WikiPage::factory( $title );
+               $page->doEditContent( $content, '' );
+
                $updates = $content->getSecondaryDataUpdates( $title );
 
                // make updates accessible by class name
@@ -92,6 +95,8 @@ more stuff
                                $this->assertEquals( $value, $v, "unexpected value for field $field in instance of $class" );
                        }
                }
+
+               $page->doDeleteArticle( '' );
        }
 
        public static function dataGetSection() {
index 7beb4fe..0cb8105 100644 (file)
@@ -1998,12 +1998,22 @@ class FileBackendTest extends MediaWikiTestCase {
 
                $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
 
+               $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/e/subdir1" ) );
+               $items = is_array( $iter ) ? $iter : iterator_to_array( $iter );
+               $this->assertEquals( array(), $items, "Directory listing is empty." );
+
                foreach ( $files as $file ) { // clean up
                        $this->backend->doOperation( array( 'op' => 'delete', 'src' => $file ) );
                }
 
                $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/not/exists" ) );
-               foreach ( $iter as $iter ) {} // no errors
+               foreach ( $iter as $file ) {} // no errors
+               $items = is_array( $iter ) ? $iter : iterator_to_array( $iter );
+               $this->assertEquals( array(), $items, "Directory listing is empty." );
+
+               $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/e/not/exists" ) );
+               $items = is_array( $iter ) ? $iter : iterator_to_array( $iter );
+               $this->assertEquals( array(), $items, "Directory listing is empty." );
        }
 
        public function testLockCalls() {
index 54f6607..2cd86ea 100644 (file)
@@ -458,6 +458,16 @@ class CSSJanusTest extends MediaWikiTestCase {
                                ".foo\t{\tleft\t:\t0;}",
                                ".foo\t{\tright\t:\t0;}"
                        ),
+
+                       // Guard against partial keys
+                       array(
+                               '.foo { leftxx: 0; }',
+                               '.foo { leftxx: 0; }'
+                       ),
+                       array(
+                               '.foo { rightxx: 0; }',
+                               '.foo { rightxx: 0; }'
+                       ),
                );
        }
 
@@ -534,16 +544,6 @@ class CSSJanusTest extends MediaWikiTestCase {
         */
        function provideTransformBrokenCases() {
                return array(
-                       // Guard against partial keys
-                       array(
-                               '.foo { leftxx: 0; }',
-                               '.foo { leftxx: 0; }'
-                       ),
-                       array(
-                               '.foo { rightxx: 0; }',
-                               '.foo { rightxx: 0; }'
-                       ),
-
                        // Guard against selectors that look flippable
                        array(
                                # <foo-left-x attr="x">
index 208ab1e..0cecdee 100644 (file)
  * @ingroup Test
  *
  * @group Site
- * @group Database
  *
  * @licence GNU GPL v2+
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
-class MediaWikiSiteTest extends SiteObjectTest {
-
-       public function setUp() {
-               parent::setUp();
-
-               static $hasSites = false;
-
-               if ( !$hasSites ) {
-                       TestSites::insertIntoDb();
-                       $hasSites = true;
-               }
-       }
-
-       public function testFactoryConstruction() {
-               $this->assertInstanceOf( 'MediaWikiSite', MediaWikiSite::newFromGlobalId( 'enwiki' ) );
-               $this->assertInstanceOf( 'Site', MediaWikiSite::newFromGlobalId( 'enwiki' ) );
-               $this->assertInstanceOf( 'MediaWikiSite', SitesTable::singleton()->newRow( array( 'type' => Site::TYPE_MEDIAWIKI ) ) );
-       }
+class MediaWikiSiteTest extends SiteTest {
 
        public function testNormalizePageTitle() {
-               $site = MediaWikiSite::newFromGlobalId( 'enwiki' );
+               $site = new MediaWikiSite();
+               $site->setGlobalId( 'enwiki' );
 
                //NOTE: this does not actually call out to the enwiki site to perform the normalization,
                //      but uses a local Title object to do so. This is hardcoded on SiteLink::normalizePageTitle
@@ -73,8 +56,7 @@ class MediaWikiSiteTest extends SiteObjectTest {
         * @dataProvider fileUrlProvider
         */
        public function testGetFileUrl( $url, $filePath, $pathArgument, $expected ) {
-               $site = MediaWikiSite::newFromGlobalId( 'enwiki' );
-
+               $site = new MediaWikiSite();
                $site->setFilePath( $url . $filePath );
 
                $this->assertEquals( $expected, $site->getFileUrl( $pathArgument ) );
@@ -97,10 +79,9 @@ class MediaWikiSiteTest extends SiteObjectTest {
         * @dataProvider provideGetPageUrl
         */
        public function testGetPageUrl( $path, $page, $expected ) {
-               /* @var MediaWikiSite $site */
-               $site = MediaWikiSite::newFromGlobalId( 'enwiki' );
-
+               $site = new MediaWikiSite();
                $site->setLinkPath( $path );
+
                $this->assertContains( $path, $site->getPageUrl() );
                $this->assertContains( $expected, $site->getPageUrl( $page ) );
        }
diff --git a/tests/phpunit/includes/site/SiteArrayTest.php b/tests/phpunit/includes/site/SiteArrayTest.php
deleted file mode 100644 (file)
index 613f63f..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-
-/**
- * Tests for the SiteArray class.
- * The tests for methods defined in the SiteList interface are in SiteListTest.
- *
- * 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
- *Both
- * Bith
- * @file
- * @since 1.21
- *
- * @ingroup Site
- * @ingroup Test
- *
- * @group Site
- *
- * @licence GNU GPL v2+
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-class SiteArrayTest extends GenericArrayObjectTest {
-
-       /**
-        * @see GenericArrayObjectTest::elementInstancesProvider
-        *
-        * @since 1.21
-        *
-        * @return array
-        */
-       public function elementInstancesProvider() {
-               $sites = TestSites::getSites();
-
-               $siteArrays = array();
-
-               $siteArrays[] = $sites;
-
-               $siteArrays[] = array( array_shift( $sites ) );
-
-               $siteArrays[] = array( array_shift( $sites ), array_shift( $sites ) );
-
-               return $this->arrayWrap( $siteArrays );
-       }
-
-       /**
-        * @see GenericArrayObjectTest::getInstanceClass
-        *
-        * @since 1.21
-        *
-        * @return array
-        */
-       public function getInstanceClass() {
-               return 'SiteArray';
-       }
-
-       /**
-        * @dataProvider instanceProvider
-        *
-        * @since 1.21
-        *
-        * @param SiteArray $list
-        */
-       public function testSerializationMore( SiteArray $list ) {
-               $serialization = serialize( $list );
-               /**
-                * @var SiteArray $copy
-                */
-               $copy = unserialize( $serialization );
-
-               $this->assertArrayEquals( $list->getGlobalIdentifiers(), $copy->getGlobalIdentifiers() );
-
-               /**
-                * @var Site $site
-                */
-               foreach ( $list as $site ) {
-                       $this->assertTrue( $copy->hasInternalId( $site->getInternalId() ) );
-               }
-       }
-
-}
\ No newline at end of file
index bb8367f..7b88212 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Tests for the SiteList implementing classes.
+ * Tests for the SiteList 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
@@ -41,7 +41,7 @@ class SiteListTest extends MediaWikiTestCase {
                $listInstances = array();
 
                foreach ( $sitesArrays as $sitesArray ) {
-                       $listInstances[] = new SiteArray( $sitesArray[0] );
+                       $listInstances[] = new SiteList( $sitesArray[0] );
                }
 
                return $this->arrayWrap( $listInstances );
@@ -164,5 +164,28 @@ class SiteListTest extends MediaWikiTestCase {
                $this->assertArrayEquals( $expected, $identifiers );
        }
 
+       /**
+        * @dataProvider siteListProvider
+        *
+        * @since 1.21
+        *
+        * @param SiteList $list
+        */
+       public function testSerialization( SiteList $list ) {
+               $serialization = serialize( $list );
+               /**
+                * @var SiteArray $copy
+                */
+               $copy = unserialize( $serialization );
+
+               $this->assertArrayEquals( $list->getGlobalIdentifiers(), $copy->getGlobalIdentifiers() );
+
+               /**
+                * @var Site $site
+                */
+               foreach ( $list as $site ) {
+                       $this->assertTrue( $copy->hasInternalId( $site->getInternalId() ) );
+               }
+       }
 
 }
\ No newline at end of file
diff --git a/tests/phpunit/includes/site/SiteObjectTest.php b/tests/phpunit/includes/site/SiteObjectTest.php
deleted file mode 100644 (file)
index 207f46c..0000000
+++ /dev/null
@@ -1,294 +0,0 @@
-<?php
-
-/**
- * Tests for the SiteObject class.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @since 1.21
- *
- * @ingroup Site
- * @ingroup Test
- *
- * @group Site
- * @group Database
- *
- * @licence GNU GPL v2+
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-class SiteObjectTest extends ORMRowTest {
-
-       /**
-        * @see ORMRowTest::getRowClass
-        * @since 1.21
-        * @return string
-        */
-       protected function getRowClass() {
-               return 'SiteObject';
-       }
-
-       /**
-        * @see ORMRowTest::getTableInstance
-        * @since 1.21
-        * @return IORMTable
-        */
-       protected function getTableInstance() {
-               return SitesTable::singleton();
-       }
-
-       /**
-        * @see ORMRowTest::constructorTestProvider
-        * @since 1.21
-        * @return array
-        */
-       public function constructorTestProvider() {
-               $argLists = array();
-
-               $argLists[] = array( 'global_key' => 'foo' );
-
-               $argLists[] = array( 'global_key' => 'bar', 'type' => Site::TYPE_MEDIAWIKI );
-
-               $constructorArgs = array();
-
-               foreach ( $argLists as $argList ) {
-                       $constructorArgs[] = array( $argList, true );
-               }
-
-               return $constructorArgs;
-       }
-
-       /**
-        * @dataProvider instanceProvider
-        * @param Site $site
-        */
-       public function testGetInterwikiIds( Site $site ) {
-               $this->assertInternalType( 'array', $site->getInterwikiIds() );
-       }
-
-       /**
-        * @dataProvider instanceProvider
-        * @param Site $site
-        */
-       public function testGetNavigationIds( Site $site ) {
-               $this->assertInternalType( 'array', $site->getNavigationIds() );
-       }
-
-       /**
-        * @dataProvider instanceProvider
-        * @param Site $site
-        */
-       public function testAddNavigationId( Site $site ) {
-               $site->addNavigationId( 'foobar' );
-               $this->assertTrue( in_array( 'foobar', $site->getNavigationIds(), true ) );
-       }
-
-       /**
-        * @dataProvider instanceProvider
-        * @param Site $site
-        */
-       public function testAddInterwikiId( Site $site ) {
-               $site->addInterwikiId( 'foobar' );
-               $this->assertTrue( in_array( 'foobar', $site->getInterwikiIds(), true ) );
-       }
-
-       /**
-        * @dataProvider instanceProvider
-        * @param Site $site
-        */
-       public function testGetLanguageCode( Site $site ) {
-               $this->assertTypeOrFalse( 'string', $site->getLanguageCode() );
-       }
-
-       /**
-        * @dataProvider instanceProvider
-        * @param Site $site
-        */
-       public function testSetLanguageCode( Site $site ) {
-               $site->setLanguageCode( 'en' );
-               $this->assertEquals( 'en', $site->getLanguageCode() );
-       }
-
-       /**
-        * @dataProvider instanceProvider
-        * @param Site $site
-        */
-       public function testNormalizePageName( Site $site ) {
-               $this->assertInternalType( 'string', $site->normalizePageName( 'Foobar' ) );
-       }
-
-       /**
-        * @dataProvider instanceProvider
-        * @param Site $site
-        */
-       public function testGetGlobalId( Site $site ) {
-               $this->assertInternalType( 'string', $site->getGlobalId() );
-       }
-
-       /**
-        * @dataProvider instanceProvider
-        * @param Site $site
-        */
-       public function testSetGlobalId( Site $site ) {
-               $site->setGlobalId( 'foobar' );
-               $this->assertEquals( 'foobar', $site->getGlobalId() );
-       }
-
-       /**
-        * @dataProvider instanceProvider
-        * @param Site $site
-        */
-       public function testGetType( Site $site ) {
-               $this->assertInternalType( 'string', $site->getType() );
-       }
-
-       /**
-        * @dataProvider instanceProvider
-        * @param Site $site
-        */
-       public function testGetPath( Site $site ) {
-               $this->assertTypeOrFalse( 'string', $site->getPath( 'page_path' ) );
-               $this->assertTypeOrFalse( 'string', $site->getPath( 'file_path' ) );
-               $this->assertTypeOrFalse( 'string', $site->getPath( 'foobar' ) );
-       }
-
-       /**
-        * @dataProvider instanceProvider
-        * @param Site $site
-        */
-       public function testGetAllPaths( Site $site ) {
-               $this->assertInternalType( 'array', $site->getAllPaths() );
-       }
-
-       /**
-        * @dataProvider instanceProvider
-        * @param Site $site
-        */
-       public function testSetAndRemovePath( Site $site ) {
-               $count = count( $site->getAllPaths() );
-
-               $site->setPath( 'spam', 'http://www.wikidata.org/$1' );
-               $site->setPath( 'spam', 'http://www.wikidata.org/foo/$1' );
-               $site->setPath( 'foobar', 'http://www.wikidata.org/bar/$1' );
-
-               $this->assertEquals( $count + 2, count( $site->getAllPaths() ) );
-
-               $this->assertInternalType( 'string', $site->getPath( 'foobar' ) );
-               $this->assertEquals( 'http://www.wikidata.org/foo/$1', $site->getPath( 'spam' ) );
-
-               $site->removePath( 'spam' );
-               $site->removePath( 'foobar' );
-
-               $this->assertEquals( $count, count( $site->getAllPaths() ) );
-
-               $this->assertFalse( $site->getPath( 'foobar' ) );
-               $this->assertFalse( $site->getPath( 'spam' ) );
-       }
-
-       public function testSetLinkPath() {
-               /* @var SiteObject $site */
-               $site = $this->getRowInstance( $this->getMockFields(), false );
-               $path = "TestPath/$1";
-
-               $site->setLinkPath( $path );
-               $this->assertEquals( $path, $site->getLinkPath() );
-       }
-
-       public function testGetLinkPathType() {
-               /* @var SiteObject $site */
-               $site = $this->getRowInstance( $this->getMockFields(), false );
-
-               $path = 'TestPath/$1';
-               $site->setLinkPath( $path );
-               $this->assertEquals( $path, $site->getPath( $site->getLinkPathType() ) );
-
-               $path = 'AnotherPath/$1';
-               $site->setPath( $site->getLinkPathType(), $path );
-               $this->assertEquals( $path, $site->getLinkPath() );
-       }
-
-       public function testSetPath() {
-               /* @var SiteObject $site */
-               $site = $this->getRowInstance( $this->getMockFields(), false );
-
-               $path = 'TestPath/$1';
-               $site->setPath( 'foo', $path );
-
-               $this->assertEquals( $path, $site->getPath( 'foo' ) );
-       }
-
-       public function testProtocolRelativePath() {
-               /* @var SiteObject $site */
-               $site = $this->getRowInstance( $this->getMockFields(), false );
-
-               $type = $site->getLinkPathType();
-               $path = '//acme.com/'; // protocol-relative URL
-               $site->setPath( $type, $path );
-
-               $this->assertEquals( '', $site->getProtocol() );
-       }
-
-       public function provideGetPageUrl() {
-               //NOTE: the assumption that the URL is built by replacing $1
-               //      with the urlencoded version of $page
-               //      is true for SiteObject but not guaranteed for subclasses.
-               //      Subclasses need to override this provider appropriately.
-
-               return array(
-                       array( #0
-                               'http://acme.test/TestPath/$1',
-                               'Foo',
-                               '/TestPath/Foo',
-                       ),
-                       array( #1
-                               'http://acme.test/TestScript?x=$1&y=bla',
-                               'Foo',
-                               'TestScript?x=Foo&y=bla',
-                       ),
-                       array( #2
-                               'http://acme.test/TestPath/$1',
-                               'foo & bar/xyzzy (quux-shmoox?)',
-                               '/TestPath/foo%20%26%20bar%2Fxyzzy%20%28quux-shmoox%3F%29',
-                       ),
-               );
-       }
-
-       /**
-        * @dataProvider provideGetPageUrl
-        */
-       public function testGetPageUrl( $path, $page, $expected ) {
-               /* @var SiteObject $site */
-               $site = $this->getRowInstance( $this->getMockFields(), false );
-
-               //NOTE: the assumption that getPageUrl is based on getLinkPath
-               //      is true for SiteObject but not guaranteed for subclasses.
-               //      Subclasses need to override this test case appropriately.
-               $site->setLinkPath( $path );
-               $this->assertContains( $path, $site->getPageUrl() );
-
-               $this->assertContains( $expected, $site->getPageUrl( $page ) );
-       }
-
-       protected function assertTypeOrFalse( $type, $value ) {
-               if ( $value === false ) {
-                       $this->assertTrue( true );
-               }
-               else {
-                       $this->assertInternalType( $type, $value );
-               }
-       }
-
-}
\ No newline at end of file
diff --git a/tests/phpunit/includes/site/SiteSQLStoreTest.php b/tests/phpunit/includes/site/SiteSQLStoreTest.php
new file mode 100644 (file)
index 0000000..cf4ce94
--- /dev/null
@@ -0,0 +1,123 @@
+<?php
+
+/**
+ * Tests for the SiteSQLStore class.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.21
+ *
+ * @ingroup Site
+ * @ingroup Test
+ *
+ * @group Site
+ * @group Database
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class SiteSQLStoreTest extends MediaWikiTestCase {
+
+       public function testGetSites() {
+               $expectedSites = TestSites::getSites();
+               TestSites::insertIntoDb();
+
+               $store = SiteSQLStore::newInstance();
+
+               $sites = $store->getSites();
+
+               $this->assertInstanceOf( 'SiteList', $sites );
+
+               /**
+                * @var Site $site
+                */
+               foreach ( $sites as $site ) {
+                       $this->assertInstanceOf( 'Site', $site );
+               }
+
+               foreach ( $expectedSites as $site ) {
+                       if ( $site->getGlobalId() !== null ) {
+                               $this->assertTrue( $sites->hasSite( $site->getGlobalId() ) );
+                       }
+               }
+       }
+
+       public function testSaveSites() {
+               $store = SiteSQLStore::newInstance();
+
+               $sites = array();
+
+               $site = new Site();
+               $site->setGlobalId( 'ertrywuutr' );
+               $site->setLanguageCode( 'en' );
+               $sites[] = $site;
+
+               $site = new MediaWikiSite();
+               $site->setGlobalId( 'sdfhxujgkfpth' );
+               $site->setLanguageCode( 'nl' );
+               $sites[] = $site;
+
+               $this->assertTrue( $store->saveSites( $sites ) );
+
+               $site = $store->getSite( 'ertrywuutr' );
+               $this->assertInstanceOf( 'Site', $site );
+               $this->assertEquals( 'en', $site->getLanguageCode() );
+               $this->assertTrue( is_integer( $site->getInternalId() ) );
+               $this->assertTrue( $site->getInternalId() >= 0 );
+
+               $site = $store->getSite( 'sdfhxujgkfpth' );
+               $this->assertInstanceOf( 'Site', $site );
+               $this->assertEquals( 'nl', $site->getLanguageCode() );
+               $this->assertTrue( is_integer( $site->getInternalId() ) );
+               $this->assertTrue( $site->getInternalId() >= 0 );
+       }
+
+       public function testReset() {
+               $store1 = SiteSQLStore::newInstance();
+               $store2 = SiteSQLStore::newInstance();
+
+               // initialize internal cache
+               $this->assertGreaterThan( 0, $store1->getSites()->count() );
+               $this->assertGreaterThan( 0, $store2->getSites()->count() );
+
+               // Clear actual data. Will purge the external cache and reset the internal
+               // cache in $store1, but not the internal cache in store2.
+               $this->assertTrue( $store1->clear() );
+
+               // sanity check: $store2 should have a stale cache now
+               $this->assertNotNull( $store2->getSite( 'enwiki' ) );
+
+               // purge cache
+               $store2->reset();
+
+               // ...now the internal cache of $store2 should be updated and thus empty.
+               $site = $store2->getSite( 'enwiki' );
+               $this->assertNull( $site );
+       }
+
+       public function testClear() {
+               $store = SiteSQLStore::newInstance();
+               $this->assertTrue( $store->clear() );
+
+               $site = $store->getSite( 'enwiki' );
+               $this->assertNull( $site );
+
+               $sites = $store->getSites();
+               $this->assertEquals( 0, $sites->count() );
+       }
+
+}
diff --git a/tests/phpunit/includes/site/SiteTest.php b/tests/phpunit/includes/site/SiteTest.php
new file mode 100644 (file)
index 0000000..255e2de
--- /dev/null
@@ -0,0 +1,268 @@
+<?php
+
+/**
+ * Tests for the Site class.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.21
+ *
+ * @ingroup Site
+ * @ingroup Test
+ *
+ * @group Site
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class SiteTest extends MediaWikiTestCase {
+
+       public function instanceProvider() {
+               return $this->arrayWrap( TestSites::getSites() );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testGetInterwikiIds( Site $site ) {
+               $this->assertInternalType( 'array', $site->getInterwikiIds() );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testGetNavigationIds( Site $site ) {
+               $this->assertInternalType( 'array', $site->getNavigationIds() );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testAddNavigationId( Site $site ) {
+               $site->addNavigationId( 'foobar' );
+               $this->assertTrue( in_array( 'foobar', $site->getNavigationIds(), true ) );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testAddInterwikiId( Site $site ) {
+               $site->addInterwikiId( 'foobar' );
+               $this->assertTrue( in_array( 'foobar', $site->getInterwikiIds(), true ) );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testGetLanguageCode( Site $site ) {
+               $this->assertTypeOrValue( 'string', $site->getLanguageCode(), null );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testSetLanguageCode( Site $site ) {
+               $site->setLanguageCode( 'en' );
+               $this->assertEquals( 'en', $site->getLanguageCode() );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testNormalizePageName( Site $site ) {
+               $this->assertInternalType( 'string', $site->normalizePageName( 'Foobar' ) );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testGetGlobalId( Site $site ) {
+               $this->assertTypeOrValue( 'string', $site->getGlobalId(), null );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testSetGlobalId( Site $site ) {
+               $site->setGlobalId( 'foobar' );
+               $this->assertEquals( 'foobar', $site->getGlobalId() );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testGetType( Site $site ) {
+               $this->assertInternalType( 'string', $site->getType() );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testGetPath( Site $site ) {
+               $this->assertTypeOrValue( 'string', $site->getPath( 'page_path' ), null );
+               $this->assertTypeOrValue( 'string', $site->getPath( 'file_path' ), null );
+               $this->assertTypeOrValue( 'string', $site->getPath( 'foobar' ), null );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testGetAllPaths( Site $site ) {
+               $this->assertInternalType( 'array', $site->getAllPaths() );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testSetAndRemovePath( Site $site ) {
+               $count = count( $site->getAllPaths() );
+
+               $site->setPath( 'spam', 'http://www.wikidata.org/$1' );
+               $site->setPath( 'spam', 'http://www.wikidata.org/foo/$1' );
+               $site->setPath( 'foobar', 'http://www.wikidata.org/bar/$1' );
+
+               $this->assertEquals( $count + 2, count( $site->getAllPaths() ) );
+
+               $this->assertInternalType( 'string', $site->getPath( 'foobar' ) );
+               $this->assertEquals( 'http://www.wikidata.org/foo/$1', $site->getPath( 'spam' ) );
+
+               $site->removePath( 'spam' );
+               $site->removePath( 'foobar' );
+
+               $this->assertEquals( $count, count( $site->getAllPaths() ) );
+
+               $this->assertNull( $site->getPath( 'foobar' ) );
+               $this->assertNull( $site->getPath( 'spam' ) );
+       }
+
+       public function testSetLinkPath() {
+               $site = new Site();
+               $path = "TestPath/$1";
+
+               $site->setLinkPath( $path );
+               $this->assertEquals( $path, $site->getLinkPath() );
+       }
+
+       public function testGetLinkPathType() {
+               $site = new Site();
+
+               $path = 'TestPath/$1';
+               $site->setLinkPath( $path );
+               $this->assertEquals( $path, $site->getPath( $site->getLinkPathType() ) );
+
+               $path = 'AnotherPath/$1';
+               $site->setPath( $site->getLinkPathType(), $path );
+               $this->assertEquals( $path, $site->getLinkPath() );
+       }
+
+       public function testSetPath() {
+               $site = new Site();
+
+               $path = 'TestPath/$1';
+               $site->setPath( 'foo', $path );
+
+               $this->assertEquals( $path, $site->getPath( 'foo' ) );
+       }
+
+       public function testProtocolRelativePath() {
+               $site = new Site();
+
+               $type = $site->getLinkPathType();
+               $path = '//acme.com/'; // protocol-relative URL
+               $site->setPath( $type, $path );
+
+               $this->assertEquals( '', $site->getProtocol() );
+       }
+
+       public function provideGetPageUrl() {
+               //NOTE: the assumption that the URL is built by replacing $1
+               //      with the urlencoded version of $page
+               //      is true for Site but not guaranteed for subclasses.
+               //      Subclasses need to override this provider appropriately.
+
+               return array(
+                       array( #0
+                               'http://acme.test/TestPath/$1',
+                               'Foo',
+                               '/TestPath/Foo',
+                       ),
+                       array( #1
+                               'http://acme.test/TestScript?x=$1&y=bla',
+                               'Foo',
+                               'TestScript?x=Foo&y=bla',
+                       ),
+                       array( #2
+                               'http://acme.test/TestPath/$1',
+                               'foo & bar/xyzzy (quux-shmoox?)',
+                               '/TestPath/foo%20%26%20bar%2Fxyzzy%20%28quux-shmoox%3F%29',
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetPageUrl
+        */
+       public function testGetPageUrl( $path, $page, $expected ) {
+               $site = new Site();
+
+               //NOTE: the assumption that getPageUrl is based on getLinkPath
+               //      is true for Site but not guaranteed for subclasses.
+               //      Subclasses need to override this test case appropriately.
+               $site->setLinkPath( $path );
+               $this->assertContains( $path, $site->getPageUrl() );
+
+               $this->assertContains( $expected, $site->getPageUrl( $page ) );
+       }
+
+       protected function assertTypeOrFalse( $type, $value ) {
+               if ( $value === false ) {
+                       $this->assertTrue( true );
+               }
+               else {
+                       $this->assertInternalType( $type, $value );
+               }
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testSerialization( Site $site ) {
+               $this->assertInstanceOf( 'Serializable', $site );
+
+               $serialization = serialize( $site );
+               $newInstance = unserialize( $serialization );
+
+               $this->assertInstanceOf( 'Site', $newInstance );
+
+               $this->assertEquals( $serialization, serialize( $newInstance ) );
+       }
+
+}
\ No newline at end of file
diff --git a/tests/phpunit/includes/site/SitesTest.php b/tests/phpunit/includes/site/SitesTest.php
deleted file mode 100644 (file)
index 7675d42..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-
-/**
- * Tests for the Sites class.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @since 1.21
- *
- * @ingroup Site
- * @ingroup Test
- *
- * @group Site
- * @group Database
- *
- * @licence GNU GPL v2+
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-class SitesTest extends MediaWikiTestCase {
-
-       public function setUp() {
-               parent::setUp();
-               TestSites::insertIntoDb();
-       }
-
-       public function testSingleton() {
-               $this->assertInstanceOf( 'Sites', Sites::singleton() );
-               $this->assertTrue( Sites::singleton() === Sites::singleton() );
-       }
-
-       public function testGetSites() {
-               $this->assertInstanceOf( 'SiteList', Sites::singleton()->getSites() );
-       }
-
-
-       public function testGetSite() {
-               $count = 0;
-               $sites = Sites::singleton()->getSites();
-
-               /**
-                * @var Site $site
-                */
-               foreach ( $sites as $site ) {
-                       $this->assertInstanceOf( 'Site', $site );
-
-                       $this->assertEquals(
-                               $site,
-                               Sites::singleton()->getSite( $site->getGlobalId() )
-                       );
-
-                       if ( ++$count > 100 ) {
-                               break;
-                       }
-               }
-       }
-
-       public function testNewSite() {
-               $this->assertInstanceOf( 'Site', Sites::newSite() );
-               $this->assertInstanceOf( 'Site', Sites::newSite( 'enwiki' ) );
-       }
-
-       public function testGetGroup() {
-               $wikipedias = Sites::singleton()->getSiteGroup( "wikipedia" );
-
-               $this->assertFalse( $wikipedias->isEmpty() );
-
-               /* @var Site $site */
-               foreach ( $wikipedias as $site ) {
-                       $this->assertEquals( 'wikipedia', $site->getGroup() );
-               }
-       }
-
-}
index 6003a8d..b57fe9f 100644 (file)
@@ -39,21 +39,22 @@ class TestSites {
        public static function getSites() {
                $sites = array();
 
-               $site = Sites::newSite( 'foobar' );
+               $site = new Site();
+               $site->setGlobalId( 'foobar' );
                $sites[] = $site;
 
-               $site = Sites::newSite( 'enwiktionary' );
+               $site = new MediaWikiSite();
+               $site->setGlobalId( 'enwiktionary' );
                $site->setGroup( 'wiktionary' );
-               $site->setType( Site::TYPE_MEDIAWIKI );
                $site->setLanguageCode( 'en' );
                $site->addNavigationId( 'enwiktionary' );
                $site->setPath( MediaWikiSite::PATH_PAGE, "https://en.wiktionary.org/wiki/$1" );
                $site->setPath( MediaWikiSite::PATH_FILE, "https://en.wiktionary.org/w/$1" );
                $sites[] = $site;
 
-               $site = Sites::newSite( 'dewiktionary' );
+               $site = new MediaWikiSite();
+               $site->setGlobalId( 'dewiktionary' );
                $site->setGroup( 'wiktionary' );
-               $site->setType( Site::TYPE_MEDIAWIKI );
                $site->setLanguageCode( 'de' );
                $site->addInterwikiId( 'dewiktionary' );
                $site->addInterwikiId( 'wiktionaryde' );
@@ -61,9 +62,9 @@ class TestSites {
                $site->setPath( MediaWikiSite::PATH_FILE, "https://de.wiktionary.org/w/$1" );
                $sites[] = $site;
 
-               $site = Sites::newSite( 'spam' );
+               $site = new Site();
+               $site->setGlobalId( 'spam' );
                $site->setGroup( 'spam' );
-               $site->setType( Site::TYPE_UNKNOWN );
                $site->setLanguageCode( 'en' );
                $site->addNavigationId( 'spam' );
                $site->addNavigationId( 'spamz' );
@@ -72,9 +73,9 @@ class TestSites {
                $sites[] = $site;
 
                foreach ( array( 'en', 'de', 'nl', 'sv', 'sr', 'no', 'nn' ) as $langCode ) {
-                       $site = Sites::newSite( $langCode . 'wiki' );
+                       $site = new MediaWikiSite();
+                       $site->setGlobalId( $langCode . 'wiki' );
                        $site->setGroup( 'wikipedia' );
-                       $site->setType( Site::TYPE_MEDIAWIKI );
                        $site->setLanguageCode( $langCode );
                        $site->addInterwikiId( $langCode );
                        $site->addNavigationId( $langCode );
@@ -92,23 +93,9 @@ class TestSites {
         * @since 0.1
         */
        public static function insertIntoDb() {
-               $dbw = wfGetDB( DB_MASTER );
-
-               $dbw->begin( __METHOD__ );
-
-               $dbw->delete( 'sites', '*', __METHOD__ );
-               $dbw->delete( 'site_identifiers', '*', __METHOD__ );
-
-               /**
-                * @var Site $site
-                */
-               foreach ( TestSites::getSites() as $site ) {
-                       $site->save();
-               }
-
-               $dbw->commit( __METHOD__ );
-
-               Sites::singleton()->getSites( false ); // re-cache
+               $sitesTable = SiteSQLStore::newInstance();
+               $sitesTable->clear();
+               $sitesTable->saveSites( TestSites::getSites() );
        }
 
 }
\ No newline at end of file
index 785c21c..5594670 100644 (file)
@@ -307,6 +307,118 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
+       /**
+        * Test Language::isWellFormedLanguageTag()
+        * @dataProvider provideWellFormedLanguageTags
+        */
+       function testWellFormedLanguageTag( $code, $message = '' ) {
+               $this->assertTrue(
+                       Language::isWellFormedLanguageTag( $code ),
+                       "validating code $code $message"
+               );
+       }
+
+       /**
+        * The test cases are based on the tests in the GaBuZoMeu parser
+        * written by Stéphane Bortzmeyer <bortzmeyer@nic.fr>
+        * and distributed as free software, under the GNU General Public Licence.
+        * http://www.bortzmeyer.org/gabuzomeu-parsing-language-tags.html
+        */
+       function provideWellFormedLanguageTags() {
+               return array(
+                       array( 'fr', 'two-letter code' ),
+                       array( 'fr-latn', 'two-letter code with lower case script code' ),
+                       array( 'fr-Latn-FR', 'two-letter code with title case script code and uppercase country code' ),
+                       array( 'fr-Latn-419', 'two-letter code with title case script code and region number' ),
+                       array( 'fr-FR', 'two-letter code with uppercase' ),
+                       array( 'ax-TZ', 'Not in the registry, but well-formed' ),
+                       array( 'fr-shadok', 'two-letter code with variant' ),
+                       array( 'fr-y-myext-myext2', 'non-x singleton' ),
+                       array( 'fra-Latn', 'ISO 639 can be 3-letters' ),
+                       array( 'fra', 'three-letter language code' ),
+                       array( 'fra-FX', 'three-letter language code with country code' ),
+                       array( 'i-klingon', 'grandfathered with singleton' ),
+                       array( 'I-kLINgon', 'tags are case-insensitive...' ),
+                       array( 'no-bok', 'grandfathered without singleton' ),
+                       array( 'i-enochian', 'Grandfathered' ),
+                       array( 'x-fr-CH', 'private use' ),
+                       array( 'es-419', 'two-letter code with region number' ),
+                       array( 'en-Latn-GB-boont-r-extended-sequence-x-private', 'weird, but well-formed' ),
+                       array( 'ab-x-abc-x-abc', 'anything goes after x' ),
+                       array( 'ab-x-abc-a-a', 'anything goes after x, including several non-x singletons' ),
+                       array( 'i-default', 'grandfathered' ),
+                       array( 'abcd-Latn', 'Language of 4 chars reserved for future use' ),
+                       array( 'AaBbCcDd-x-y-any-x', 'Language of 5-8 chars, registered' ),
+                       array( 'de-CH-1901', 'with country and year' ),
+                       array( 'en-US-x-twain', 'with country and singleton' ),
+                       array( 'zh-cmn', 'three-letter variant' ),
+                       array( 'zh-cmn-Hant', 'three-letter variant and script' ),
+                       array( 'zh-cmn-Hant-HK', 'three-letter variant, script and country' ),
+                       array( 'xr-p-lze', 'Extension' ),
+               );
+       }
+
+       /**
+        * Negative test for Language::isWellFormedLanguageTag()
+        * @dataProvider provideMalformedLanguageTags
+        */
+       function testMalformedLanguageTag( $code, $message = '' ) {
+               $this->assertFalse(
+                       Language::isWellFormedLanguageTag( $code ),
+                       "validating that code $code is a malformed language tag - $message"
+               );
+       }
+
+       /**
+        * The test cases are based on the tests in the GaBuZoMeu parser
+        * written by Stéphane Bortzmeyer <bortzmeyer@nic.fr>
+        * and distributed as free software, under the GNU General Public Licence.
+        * http://www.bortzmeyer.org/gabuzomeu-parsing-language-tags.html
+        */
+       function provideMalformedLanguageTags() {
+               return array(
+                       array( 'f', 'language too short' ),
+                       array( 'f-Latn', 'language too short with script' ),
+                       array( 'xr-lxs-qut', 'variants too short' ), # extlangS
+                       array( 'fr-Latn-F', 'region too short' ),
+                       array( 'a-value', 'language too short with region' ),
+                       array( 'tlh-a-b-foo', 'valid three-letter with wrong variant' ),
+                       array( 'i-notexist', 'grandfathered but not registered: invalid, even if we only test well-formedness' ),
+                       array( 'abcdefghi-012345678', 'numbers too long' ),
+                       array( 'ab-abc-abc-abc-abc', 'invalid extensions' ),
+                       array( 'ab-abcd-abc', 'invalid extensions' ),
+                       array( 'ab-ab-abc', 'invalid extensions' ),
+                       array( 'ab-123-abc', 'invalid extensions' ),
+                       array( 'a-Hant-ZH', 'short language with valid extensions' ),
+                       array( 'a1-Hant-ZH', 'invalid character in language' ),
+                       array( 'ab-abcde-abc', 'invalid extensions' ),
+                       array( 'ab-1abc-abc', 'invalid characters in extensions' ),
+                       array( 'ab-ab-abcd', 'invalid order of extensions' ),
+                       array( 'ab-123-abcd', 'invalid order of extensions' ),
+                       array( 'ab-abcde-abcd', 'invalid extensions' ),
+                       array( 'ab-1abc-abcd', 'invalid characters in extensions' ),
+                       array( 'ab-a-b', 'extensions too short' ),
+                       array( 'ab-a-x', 'extensions too short, even with singleton' ),
+                       array( 'ab--ab', 'two separators' ),
+                       array( 'ab-abc-', 'separator in the end' ),
+                       array( '-ab-abc', 'separator in the beginning' ),
+                       array( 'abcd-efg', 'language too long' ),
+                       array( 'aabbccddE', 'tag too long' ),
+                       array( 'pa_guru', 'A tag with underscore is invalid in strict mode' ),
+                       array( 'de-f', 'subtag too short' ),
+               );
+       }
+
+       /**
+        * Negative test for Language::isWellFormedLanguageTag()
+        */
+       function testLenientLanguageTag() {
+               $this->assertTrue(
+                       Language::isWellFormedLanguageTag( 'pa_guru', true ),
+                       'pa_guru is a well-formed language tag in lenient mode'
+               );
+       }
+
        /**
         * Test Language::isValidBuiltInCode()
         * @dataProvider provideLanguageCodes
@@ -1155,5 +1267,21 @@ class LanguageTest extends LanguageClassesTestCase {
                $this->assertEquals( "a{$c}b{$and}{$s}c", $lang->listToText( array( 'a', 'b', 'c' ) ) );
                $this->assertEquals( "a{$c}b{$c}c{$and}{$s}d", $lang->listToText( array( 'a', 'b', 'c', 'd' ) ) );
        }
+
+       /**
+        * @dataProvider provideIsSupportedLanguage
+        */
+       function testIsSupportedLanguage( $code, $expected, $comment ) {
+               $this->assertEquals( $expected, Language::isSupportedLanguage( $code ), $comment );
+       }
+
+       static function provideIsSupportedLanguage() {
+               return array(
+                       array( 'en', true, 'is supported language' ),
+                       array( 'fi', true, 'is supported language' ),
+                       array( 'bunny', false, 'is not supported language' ),
+                       array( 'FI', false, 'is not supported language, input should be in lower case' ),
+               );
+       }
 }
 
index 7fc7453..9eb2efc 100644 (file)
                assert.ok( relativePath.indexOf( uri.fragment ) >= 0, 'fragement in relative path' );
        } );
 
+       QUnit.test( 'Parse a uri with an @ symbol in the path and query', 1, function ( assert ) {
+               var uri = new mw.Uri( 'http://www.example.com/test@test?x=@uri&y@=uri&z@=@' );
+
+               assert.deepEqual(
+                       {
+                               protocol: uri.protocol,
+                               user: uri.user,
+                               password: uri.password,
+                               host: uri.host,
+                               port: uri.port,
+                               path: uri.path,
+                               query: uri.query,
+                               fragment: uri.fragment,
+                               queryString: uri.getQueryString()
+                       },
+                       {
+                               protocol: 'http',
+                               user: undefined,
+                               password: undefined,
+                               host: 'www.example.com',
+                               port: undefined,
+                               path: '/test@test',
+                               query: { x: '@uri', 'y@': 'uri', 'z@': '@' },
+                               fragment: undefined,
+                               queryString: 'x=%40uri&y%40=uri&z%40=%40'
+                       },
+                       'basic object properties'
+               );
+       } );
+
        QUnit.test( 'Handle protocol-relative URLs', 5, function ( assert ) {
                var UriRel, uri;
 
index 29e94a5..d7c73e5 100644 (file)
@@ -1,6 +1,6 @@
 ( function ( mw, $ ) {
 
-var mwLanguageCache = {}, oldGetOuterHtml;
+var mwLanguageCache = {}, oldGetOuterHtml, formatnumTests;
 
 QUnit.module( 'mediawiki.jqueryMsg', QUnit.newMwEnvironment( {
        setup: function () {
@@ -49,6 +49,59 @@ function getMwLanguage( langCode, cb ) {
        });
 }
 
+QUnit.test( 'Replace', 9, function ( assert ) {
+       var parser = mw.jqueryMsg.getMessageFunction();
+
+       mw.messages.set( 'simple', 'Foo $1 baz $2' );
+
+       assert.equal( parser( 'simple' ), 'Foo $1 baz $2', 'Replacements with no substitutes' );
+       assert.equal( parser( 'simple', 'bar' ), 'Foo bar baz $2', 'Replacements with less substitutes' );
+       assert.equal( parser( 'simple', 'bar', 'quux' ), 'Foo bar baz quux', 'Replacements with all substitutes' );
+
+       mw.messages.set( 'plain-input', '<foo foo="foo">x$1y&lt;</foo>z' );
+
+       assert.equal(
+               parser( 'plain-input', 'bar' ),
+               '&lt;foo foo="foo"&gt;xbary&amp;lt;&lt;/foo&gt;z',
+               'Input is not considered html'
+       );
+
+       mw.messages.set( 'plain-replace', 'Foo $1' );
+
+       assert.equal(
+               parser( 'plain-replace', '<bar bar="bar">&gt;</bar>' ),
+               'Foo &lt;bar bar="bar"&gt;&amp;gt;&lt;/bar&gt;',
+               'Replacement is not considered html'
+       );
+
+       mw.messages.set( 'object-replace', 'Foo $1' );
+
+       assert.equal(
+               parser( 'object-replace', $( '<div class="bar">&gt;</div>' ) ),
+               'Foo <div class="bar">&gt;</div>',
+               'jQuery objects are preserved as raw html'
+       );
+
+       assert.equal(
+               parser( 'object-replace', $( '<div class="bar">&gt;</div>' ).get( 0 ) ),
+               'Foo <div class="bar">&gt;</div>',
+               'HTMLElement objects are preserved as raw html'
+       );
+
+       assert.equal(
+               parser( 'object-replace', $( '<div class="bar">&gt;</div>' ).toArray() ),
+               'Foo <div class="bar">&gt;</div>',
+               'HTMLElement[] arrays are preserved as raw html'
+       );
+
+       mw.messages.set( 'wikilink-replace', 'Foo [$1 bar]' );
+       assert.equal(
+               parser( 'wikilink-replace', 'http://example.org/?x=y&z' ),
+               'Foo <a href="http://example.org/?x=y&amp;z">bar</a>',
+               'Href is not double-escaped in wikilink function'
+       );
+} );
+
 QUnit.test( 'Plural', 3, function ( assert ) {
        var parser = mw.jqueryMsg.getMessageFunction();
 
@@ -58,7 +111,6 @@ QUnit.test( 'Plural', 3, function ( assert ) {
        assert.equal( parser( 'plural-msg', 2 ), 'Found 2 items', 'Plural test for english' );
 } );
 
-
 QUnit.test( 'Gender', 11, function ( assert ) {
        // TODO: These tests should be for mw.msg once mw.msg integrated with mw.jqueryMsg
        // TODO: English may not be the best language for these tests. Use a language like Arabic or Russian
@@ -144,7 +196,7 @@ QUnit.test( 'Grammar', 2, function ( assert ) {
        assert.equal( parser( 'grammar-msg-wrong-syntax' ), 'Przeszukaj ' , 'Grammar Test with wrong grammar template syntax' );
 } );
 
-QUnit.test( 'Output matches PHP parser', mw.libs.phpParserData.tests.length, function ( assert ) {
+QUnit.test( 'Match PHP parser', mw.libs.phpParserData.tests.length, function ( assert ) {
        mw.messages.set( mw.libs.phpParserData.messages );
        $.each( mw.libs.phpParserData.tests, function ( i, test ) {
                QUnit.stop();
@@ -165,7 +217,7 @@ QUnit.test( 'Output matches PHP parser', mw.libs.phpParserData.tests.length, fun
        } );
 });
 
-QUnit.test( 'Links', 6, function ( assert ) {
+QUnit.test( 'Wikilink', 6, function ( assert ) {
        var parser = mw.jqueryMsg.getMessageFunction(),
                expectedListUsers,
                expectedDisambiguationsText,
@@ -191,12 +243,12 @@ QUnit.test( 'Links', 6, function ( assert ) {
                'Piped wikilink'
        );
 
-       expectedDisambiguationsText = 'The following pages contain at least one link to a disambiguation page.\nThey may have to link to a more appropriate page instead.<br>\nA page is treated as a disambiguation page if it uses a template that is linked from ' +
+       expectedDisambiguationsText = 'The following pages contain at least one link to a disambiguation page.\nThey may have to link to a more appropriate page instead.\nA page is treated as a disambiguation page if it uses a template that is linked from ' +
                $( '<a>' ).attr( {
                        title: 'MediaWiki:Disambiguationspage',
                        href: mw.util.wikiGetlink( 'MediaWiki:Disambiguationspage' )
                } ).text( 'MediaWiki:Disambiguationspage' ).getOuterHtml() + '.';
-       mw.messages.set( 'disambiguations-text', 'The following pages contain at least one link to a disambiguation page.\nThey may have to link to a more appropriate page instead.<br />\nA page is treated as a disambiguation page if it uses a template that is linked from [[MediaWiki:Disambiguationspage]].' );
+       mw.messages.set( 'disambiguations-text', 'The following pages contain at least one link to a disambiguation page.\nThey may have to link to a more appropriate page instead.\nA page is treated as a disambiguation page if it uses a template that is linked from [[MediaWiki:Disambiguationspage]].' );
        assert.equal(
                parser( 'disambiguations-text' ),
                expectedDisambiguationsText,
@@ -214,7 +266,7 @@ QUnit.test( 'Links', 6, function ( assert ) {
        mw.messages.set( 'pipe-trick', '[[Tampa, Florida|]]' );
        assert.equal(
                parser( 'pipe-trick' ),
-               'Error: Parse error at position 0 in input: [[Tampa, Florida|]]',
+               'pipe-trick: Parse error at position 0 in input: [[Tampa, Florida|]]',
                'Pipe trick should return error string.'
        );
 
@@ -243,7 +295,7 @@ QUnit.test( 'Links', 6, function ( assert ) {
        );
 });
 
-QUnit.test( 'Int magic word', 4, function ( assert ) {
+QUnit.test( 'Int', 4, function ( assert ) {
        var parser = mw.jqueryMsg.getMessageFunction(),
            newarticletextSource = 'You have followed a link to a page that does not exist yet. To create the page, start typing in the box below (see the [[{{Int:Helppage}}|help page]] for more info). If you are here by mistake, click your browser\'s back button.',
                expectedNewarticletext;
@@ -292,7 +344,7 @@ QUnit.test( 'Int magic word', 4, function ( assert ) {
 
 // Tests that getMessageFunction is used for messages with curly braces or square brackets,
 // but not otherwise.
-QUnit.test( 'Calls to mw.msg', 8, function ( assert ) {
+QUnit.test( 'mw.msg()', 8, function ( assert ) {
        // Should be
        var map, oldGMF, outerCalled, innerCalled;
 
@@ -329,4 +381,81 @@ QUnit.test( 'Calls to mw.msg', 8, function ( assert ) {
        mw.jqueryMsg.getMessageFunction = oldGMF;
 } );
 
+formatnumTests = [
+       {
+               lang: 'en',
+               number: 987654321.654321,
+               result: '987654321.654321',
+               description: 'formatnum test for English, decimal seperator'
+       },
+       {
+               lang: 'ar',
+               number: 987654321.654321,
+               result: '٩٨٧٦٥٤٣٢١٫٦٥٤٣٢١',
+               description: 'formatnum test for Arabic, with decimal seperator'
+       },
+       {
+               lang: 'ar',
+               number: '٩٨٧٦٥٤٣٢١٫٦٥٤٣٢١',
+               result: 987654321,
+               integer: true,
+               description: 'formatnum test for Arabic, with decimal seperator, reverse'
+       },
+       {
+               lang: 'ar',
+               number: -12.89,
+               result: '-١٢٫٨٩',
+               description: 'formatnum test for Arabic, negative number'
+       },
+       {
+               lang: 'ar',
+               number: '-١٢٫٨٩',
+               result: -12,
+               integer: true,
+               description: 'formatnum test for Arabic, negative number, reverse'
+       },
+       {
+               lang: 'nl',
+               number: 987654321.654321,
+               result: '987654321,654321',
+               description: 'formatnum test for Nederlands, decimal seperator'
+       },
+       {
+               lang: 'nl',
+               number: -12.89,
+               result: '-12,89',
+               description: 'formatnum test for Nederlands, negative number'
+       },
+       {
+               lang: 'nl',
+               number: 'invalidnumber',
+               result: 'invalidnumber',
+               description: 'formatnum test for Nederlands, invalid number'
+       }
+];
+
+QUnit.test( 'formatnum', formatnumTests.length, function ( assert ) {
+       mw.messages.set( 'formatnum-msg', '{{formatnum:$1}}' );
+       mw.messages.set( 'formatnum-msg-int', '{{formatnum:$1|R}}' );
+       $.each( formatnumTests, function ( i, test ) {
+               QUnit.stop();
+               getMwLanguage( test.lang, function ( langClass ) {
+                       QUnit.start();
+                       if ( !langClass ) {
+                               assert.ok( false, 'Language "' + test.lang + '" failed to load' );
+                               return;
+                       }
+                       mw.messages.set(test.message );
+                       mw.config.set( 'wgUserLanguage', test.lang ) ;
+                       var parser = new mw.jqueryMsg.parser( { language: langClass } );
+                       assert.equal(
+                               parser.parse( test.integer ? 'formatnum-msg-int' : 'formatnum-msg',
+                                       [ test.number ] ).html(),
+                               test.result,
+                               test.description
+                       );
+               } );
+       } );
+});
+
 }( mediaWiki, jQuery ) );
index f59ee0f..7816860 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -170,11 +170,11 @@ function wfStreamThumb( array $params ) {
 
        // Check the source file storage path
        if ( !$img->exists() ) {
-               wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' );
+               wfThumbError( 404, "The source file '$fileName' does not exist." );
                wfProfileOut( __METHOD__ );
                return;
        } elseif ( $img->getPath() === false ) {
-               wfThumbError( 500, 'The source file is not locally accessible.' );
+               wfThumbError( 500, "The source file '$fileName' is not locally accessible." );
                wfProfileOut( __METHOD__ );
                return;
        }