Merge "Concatenate two literals"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 26 Feb 2013 01:50:44 +0000 (01:50 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 26 Feb 2013 01:50:44 +0000 (01:50 +0000)
137 files changed:
.gitignore
RELEASE-NOTES-1.21
includes/Article.php
includes/AutoLoader.php
includes/DefaultSettings.php
includes/OutputPage.php
includes/Setup.php
includes/SiteConfiguration.php
includes/SpecialPageFactory.php
includes/Title.php
includes/WebResponse.php
includes/api/ApiEditPage.php
includes/api/ApiMain.php
includes/api/ApiQuery.php
includes/api/ApiQueryPagePropNames.php [new file with mode: 0644]
includes/api/ApiQueryPagesWithProp.php [new file with mode: 0644]
includes/api/ApiQuerySiteinfo.php
includes/filebackend/FileBackend.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignDBFile.php
includes/filerepo/file/LocalFile.php
includes/installer/Installer.i18n.php
includes/installer/MysqlUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/job/JobQueue.php
includes/job/JobQueueAggregator.php [new file with mode: 0644]
includes/job/JobQueueAggregatorMemc.php [new file with mode: 0644]
includes/job/JobQueueAggregatorRedis.php [new file with mode: 0644]
includes/job/JobQueueDB.php
includes/job/JobQueueGroup.php
includes/job/JobQueueRedis.php
includes/normal/Utf8Test.php
includes/normal/UtfNormalBench.php
includes/normal/UtfNormalMemStress.php
includes/normal/UtfNormalTest.php
includes/specials/SpecialPagesWithProp.php [new file with mode: 0644]
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBho.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesCa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesEn.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesEu.php
languages/messages/MessagesGl.php
languages/messages/MessagesHsb.php
languages/messages/MessagesHu.php
languages/messages/MessagesIlo.php
languages/messages/MessagesJa.php
languages/messages/MessagesKa.php
languages/messages/MessagesKo.php
languages/messages/MessagesLa.php
languages/messages/MessagesMg.php
languages/messages/MessagesMin.php
languages/messages/MessagesMk.php
languages/messages/MessagesNe.php
languages/messages/MessagesOc.php
languages/messages/MessagesOr.php
languages/messages/MessagesQqq.php
languages/messages/MessagesRu.php
languages/messages/MessagesScn.php
languages/messages/MessagesSh.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSo.php
languages/messages/MessagesTh.php
languages/messages/MessagesUk.php
languages/messages/MessagesVi.php
languages/messages/MessagesWar.php
languages/messages/MessagesYo.php
languages/messages/MessagesZh_hans.php
maintenance/Maintenance.php
maintenance/Makefile
maintenance/archives/patch-page_props-propname-page-index.sql [new file with mode: 0644]
maintenance/getConfiguration.php [new file with mode: 0644]
maintenance/jsduck/MetaTags.rb [new file with mode: 0644]
maintenance/jsduck/categories.json [new file with mode: 0644]
maintenance/jsduck/config.json [new file with mode: 0644]
maintenance/jsduck/eg-iframe.html [new file with mode: 0644]
maintenance/jsduck/external.js [new file with mode: 0644]
maintenance/language/generateNormalizerData.php
maintenance/language/messageTypes.inc
maintenance/language/messages.inc
maintenance/language/validate.php
maintenance/mwjsduck-gen [new file with mode: 0755]
maintenance/nextJobDB.php
maintenance/postgres/tables.sql
maintenance/runJobs.php
maintenance/sql.php
maintenance/storage/blobs.sql
maintenance/tables.sql
resources/jquery/jquery.localize.js
resources/jquery/jquery.suggestions.js
resources/mediawiki.api/mediawiki.api.category.js
resources/mediawiki.api/mediawiki.api.edit.js
resources/mediawiki.api/mediawiki.api.js
resources/mediawiki.api/mediawiki.api.parse.js
resources/mediawiki.api/mediawiki.api.titleblacklist.js
resources/mediawiki.api/mediawiki.api.watch.js
resources/mediawiki.language/languages/ru.js
resources/mediawiki/mediawiki.Title.js
resources/mediawiki/mediawiki.js
resources/mediawiki/mediawiki.notification.js
resources/mediawiki/mediawiki.notify.js
resources/mediawiki/mediawiki.util.js
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/phpunit/MediaWikiPHPUnitCommand.php
tests/phpunit/includes/ExtraParserTest.php
tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php
tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php
tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php
tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php
tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php
tests/phpunit/includes/GlobalFunctions/wfParseUrlTest.php [new file with mode: 0644]
tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php
tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php
tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
tests/phpunit/includes/jobqueue/JobQueueTest.php
tests/phpunit/includes/parser/MagicVariableTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/parser/TagHooksTest.php
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.hidpi.test.js
tests/qunit/suites/resources/jquery/jquery.mwExtension.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
tests/selenium/installer/MediaWikiInstallerTestSuite.php

index ceff243..8dcba4e 100644 (file)
@@ -18,6 +18,7 @@ sublime-*
 
 # MediaWiki install & usage
 cache
+docs/js
 images/[0-9a-f]
 images/archive
 images/deleted
index 3afd4bf..2db9153 100644 (file)
@@ -99,6 +99,10 @@ production.
 * WikiText now permits the use of WAI-ARIA's role="presentation" inside of
   html elements and tables. This allows presentational markup, especially
   tables. To be marked up as such.
+* maintenance/sql.php learned the --cluster option. Let you run the script
+  on some external cluster instead of the primary cluster for a given wiki.
+* (bug 20281) test the parsing of inline URLs.
+* Added Special:PagesWithProp, which lists pages using a particular page property.
 
 === Bug fixes in 1.21 ===
 * (bug 40353) SpecialDoubleRedirect should support interwiki redirects.
@@ -221,6 +225,12 @@ production.
 * (bug 43251) prop=pageprops&ppprop= now accepts multiple props to query.
 * ApiQueryImageInfo will now limit the number of calls to File::transform made
   in any one query. If there are too many, iicontinue will be returned.
+* action=query&meta=siteinfo&siprop=general will now return the regexes used for
+  link trails and link prefices. Added for Parsoid support.
+* Added an API query module list=pageswithprop, which lists pages using a
+  particular page property.
+* Added an API query module list=pagepropnames, which lists all page prop names
+  currently in use on the wiki.
 
 === API internal changes in 1.21 ===
 * For debugging only, a new global $wgDebugAPI removes many API restrictions when true.
index 1dc27a7..ed9c305 100644 (file)
@@ -1089,6 +1089,7 @@ class Article implements Page {
        public function showMissingArticle() {
                global $wgSend404Code;
                $outputPage = $this->getContext()->getOutput();
+               $validUserPage = false;
 
                # Show info in user (talk) namespace. Does the user exist? Is he blocked?
                if ( $this->getTitle()->getNamespace() == NS_USER || $this->getTitle()->getNamespace() == NS_USER_TALK ) {
@@ -1115,6 +1116,9 @@ class Article implements Page {
                                                )
                                        )
                                );
+                               $validUserPage = true;
+                       } else {
+                               $validUserPage = true;
                        }
                }
 
@@ -1128,7 +1132,7 @@ class Article implements Page {
                                'msgKey' => array( 'moveddeleted-notice' ) )
                );
 
-               if ( !$this->mPage->hasViewableContent() && $wgSend404Code ) {
+               if ( !$this->mPage->hasViewableContent() && $wgSend404Code && !$validUserPage ) {
                        // If there's no backing content, send a 404 Not Found
                        // for better machine handling of broken links.
                        $this->getContext()->getRequest()->response()->header( "HTTP/1.1 404 Not Found" );
index 23cf411..5b64e65 100644 (file)
@@ -408,6 +408,8 @@ $wgAutoloadLocalClasses = array(
        'ApiQueryLogEvents' => 'includes/api/ApiQueryLogEvents.php',
        'ApiQueryORM' => 'includes/api/ApiQueryORM.php',
        'ApiQueryPageProps' => 'includes/api/ApiQueryPageProps.php',
+       'ApiQueryPagesWithProp' => 'includes/api/ApiQueryPagesWithProp.php',
+       'ApiQueryPagePropNames' => 'includes/api/ApiQueryPagePropNames.php',
        'ApiQueryProtectedTitles' => 'includes/api/ApiQueryProtectedTitles.php',
        'ApiQueryQueryPage' => 'includes/api/ApiQueryQueryPage.php',
        'ApiQueryRandom' => 'includes/api/ApiQueryRandom.php',
@@ -661,6 +663,9 @@ $wgAutoloadLocalClasses = array(
        # includes/job
        'Job' => 'includes/job/Job.php',
        'JobQueue' => 'includes/job/JobQueue.php',
+       'JobQueueAggregator' => 'includes/job/JobQueueAggregator.php',
+       'JobQueueAggregatorMemc' => 'includes/job/JobQueueAggregatorMemc.php',
+       'JobQueueAggregatorRedis' => 'includes/job/JobQueueAggregatorRedis.php',
        'JobQueueDB' => 'includes/job/JobQueueDB.php',
        'JobQueueGroup' => 'includes/job/JobQueueGroup.php',
        'JobQueueRedis' => 'includes/job/JobQueueRedis.php',
@@ -964,6 +969,7 @@ $wgAutoloadLocalClasses = array(
        'SpecialNewFiles' => 'includes/specials/SpecialNewimages.php',
        'SpecialNewpages' => 'includes/specials/SpecialNewpages.php',
        'SpecialPasswordReset' => 'includes/specials/SpecialPasswordReset.php',
+       'SpecialPagesWithProp' => 'includes/specials/SpecialPagesWithProp.php',
        'SpecialPermanentLink' => 'includes/SpecialPage.php',
        'SpecialPreferences' => 'includes/specials/SpecialPreferences.php',
        'SpecialPrefixindex' => 'includes/specials/SpecialPrefixindex.php',
index 173f31e..731c1a1 100644 (file)
@@ -473,7 +473,9 @@ $wgFileBackends = array();
  * Each backend configuration has the following parameters:
  *  - 'name'        : A unique name for the lock manager
  *  - 'class'       : The lock manger class to use
- * Additional parameters are specific to the class used.
+ *
+ * See LockManager::__construct() for more details.
+ * Additional parameters are specific to the lock manager class used.
  * These settings should be global to all wikis.
  */
 $wgLockManagers = array();
@@ -5536,6 +5538,14 @@ $wgJobTypeConf = array(
        'default' => array( 'class' => 'JobQueueDB', 'order' => 'random' ),
 );
 
+/**
+ * Which aggregator to use for tracking which queues have jobs.
+ * These settings should be global to all wikis.
+ */
+$wgJobQueueAggregator = array(
+       'class' => 'JobQueueAggregatorMemc'
+);
+
 /**
  * Additional functions to be performed with updateSpecialPages.
  * Expensive Querypages are already updated.
@@ -5869,6 +5879,7 @@ $wgSpecialPageGroups = array(
        'Listredirects' => 'pages',
        'Categories' => 'pages',
        'Disambiguations' => 'pages',
+       'PagesWithProp' => 'pages',
 
        'Randompage' => 'redirects',
        'Randomredirect' => 'redirects',
@@ -6205,7 +6216,7 @@ $wgMaxShellTime = 180;
 $wgMaxShellWallClockTime = 180;
 
 /**
- * Under Linux: a cgroup directory used to constrain memory usage of shell 
+ * Under Linux: a cgroup directory used to constrain memory usage of shell
  * commands. The directory must be writable by the user which runs MediaWiki.
  *
  * If specified, this is used instead of ulimit, which is inaccurate, and
@@ -6213,7 +6224,7 @@ $wgMaxShellWallClockTime = 180;
  * them segfault or deadlock.
  *
  * A wrapper script will create a cgroup for each shell command that runs, as
- * a subgroup of the specified cgroup. If the memory limit is exceeded, the 
+ * a subgroup of the specified cgroup. If the memory limit is exceeded, the
  * kernel will send a SIGKILL signal to a process in the subgroup.
  *
  * @par Example:
@@ -6223,7 +6234,7 @@ $wgMaxShellWallClockTime = 180;
  *    echo '$wgShellCgroup = "/sys/fs/cgroup/memory/mediawiki/job";' >> LocalSettings.php
  * @endcode
  *
- * The reliability of cgroup cleanup can be improved by installing a 
+ * The reliability of cgroup cleanup can be improved by installing a
  * notify_on_release script in the root cgroup, see e.g.
  * https://gerrit.wikimedia.org/r/#/c/40784
  */
index 577d610..f719421 100644 (file)
@@ -248,6 +248,11 @@ class OutputPage extends ContextSource {
         */
        private $mRedirectedFrom = null;
 
+       /**
+        * Additional key => value data
+        */
+       private $mProperties = array();
+
        /**
         * Constructor for OutputPage. This should not be called directly.
         * Instead a new RequestContext should be created and it will implicitly create
@@ -620,6 +625,32 @@ class OutputPage extends ContextSource {
                return $this->mArticleBodyOnly;
        }
 
+       /**
+        * Set an additional output property
+        * @since 1.21
+        *
+        * @param string $name
+        * @param mixed $value
+        */
+       public function setProperty( $name, $value ) {
+               $this->mProperties[$name] = $value;
+       }
+
+       /**
+        * Get an additional output property
+        * @since 1.21
+        *
+        * @param $name
+        * @return mixed: Property value or null if not found
+        */
+       public function getProperty( $name ) {
+               if ( isset( $this->mProperties[$name] ) ) {
+                       return $this->mProperties[$name];
+               } else {
+                       return null;
+               }
+       }
+
        /**
         * checkLastModified tells the client to use the client-cached page if
         * possible. If successful, the OutputPage is disabled so that
@@ -2926,7 +2957,7 @@ $templates
         * DO NOT CALL THIS FROM OUTSIDE OF THIS CLASS OR Skin::makeGlobalVariablesScript().
         * This is only public until that function is removed. You have been warned.
         *
-        * Do not add things here which can be evaluated in ResourceLoaderStartupScript
+        * Do not add things here which can be evaluated in ResourceLoaderStartUpModule
         * - in other words, page-independent/site-wide variables (without state).
         * You will only be adding bloat to the html page and causing page caches to
         * have to be purged on configuration changes.
index 7f4d634..0853df1 100644 (file)
@@ -337,7 +337,7 @@ if ( !$wgHtml5Version && $wgHtml5 && $wgAllowRdfaAttributes ) {
 }
 
 # Blacklisted file extensions shouldn't appear on the "allowed" list
-$wgFileExtensions = array_diff ( $wgFileExtensions, $wgFileBlacklist );
+$wgFileExtensions = array_values( array_diff ( $wgFileExtensions, $wgFileBlacklist ) );
 
 if ( $wgArticleCountMethod === null ) {
        $wgArticleCountMethod = $wgUseCommaCount ? 'comma' : 'link';
index 7e96d45..11d7fd6 100644 (file)
@@ -161,6 +161,12 @@ class SiteConfiguration {
         */
        public $siteParamsCallback = null;
 
+       /**
+        * Configuration cache for getConfig()
+        * @var array
+        */
+       protected $cfgCache = array();
+
        /**
         * Retrieves a configuration setting for a given wiki.
         * @param $settingName String ID of the setting name to retrieve
@@ -486,6 +492,67 @@ class SiteConfiguration {
                return array( $site, $lang );
        }
 
+       /**
+        * Get the resolved (post-setup) configuration of a potentially foreign wiki.
+        * For foreign wikis, this is expensive, and only works if maintenance
+        * scripts are setup to handle the --wiki parameter such as in wiki farms.
+        *
+        * @param string $wiki
+        * @param array|string $settings A setting name or array of setting names
+        * @return Array|mixed Array if $settings is an array, otherwise the value
+        * @throws MWException
+        * @since 1.21
+        */
+       public function getConfig( $wiki, $settings ) {
+               global $IP;
+
+               $multi = is_array( $settings );
+               $settings = (array)$settings;
+               if ( $wiki === wfWikiID() ) { // $wiki is this wiki
+                       $res = array();
+                       foreach ( $settings as $name ) {
+                               if ( !preg_match( '/^wg[A-Z]/', $name ) ) {
+                                       throw new MWException( "Variable '$name' does start with 'wg'." );
+                               } elseif ( !isset( $GLOBALS[$name] ) ) {
+                                       throw new MWException( "Variable '$name' is not set." );
+                               }
+                               $res[$name] = $GLOBALS[$name];
+                       }
+               } else { // $wiki is a foreign wiki
+                       if ( isset( $this->cfgCache[$wiki] ) ) {
+                               $res = array_intersect_key( $this->cfgCache[$wiki], array_flip( $settings ) );
+                               if ( count( $res ) == count( $settings ) ) {
+                                       return $res; // cache hit
+                               }
+                       } elseif ( !in_array( $wiki, $this->wikis ) ) {
+                               throw new MWException( "No such wiki '$wiki'." );
+                       } else {
+                               $this->cfgCache[$wiki] = array();
+                       }
+                       $retVal = 1;
+                       $cmd = wfShellWikiCmd(
+                               "$IP/maintenance/getConfiguration.php",
+                               array(
+                                       '--wiki', $wiki,
+                                       '--settings', implode( ' ', $settings ),
+                                       '--format', 'PHP'
+                               )
+                       );
+                       // ulimit5.sh breaks this call
+                       $data = trim( wfShellExec( $cmd, $retVal, array(), array( 'memory' => 0 ) ) );
+                       if ( $retVal != 0 || !strlen( $data ) ) {
+                               throw new MWException( "Failed to run getConfiguration.php." );
+                       }
+                       $res = unserialize( $data );
+                       if ( !is_array( $res ) ) {
+                               throw new MWException( "Failed to unserialize configuration array." );
+                       }
+                       $this->cfgCache[$wiki] = $this->cfgCache[$wiki] + $res;
+               }
+
+               return $multi ? $res : current( $res );
+       }
+
        /**
         * Returns true if the given vhost is handled locally.
         * @param $vhost String
index add7efc..c94c358 100644 (file)
@@ -80,6 +80,7 @@ class SpecialPageFactory {
                'Categories'                => 'SpecialCategories',
                'Disambiguations'           => 'DisambiguationsPage',
                'Listredirects'             => 'ListredirectsPage',
+               'PagesWithProp'             => 'SpecialPagesWithProp',
 
                // Login/create account
                'Userlogin'                 => 'LoginForm',
index c1782e5..40e5b09 100644 (file)
@@ -681,6 +681,7 @@ class Title {
        public function getContentModel() {
                if ( !$this->mContentModel ) {
                        $linkCache = LinkCache::singleton();
+                       $linkCache->addLinkObj( $this );
                        $this->mContentModel = $linkCache->getGoodLinkFieldObj( $this, 'model' );
                }
 
@@ -2944,22 +2945,21 @@ class Title {
         * @return Bool
         */
        public function isRedirect( $flags = 0 ) {
-               if ( !is_null( $this->mRedirect ) ) {
+               if ( !( $flags & Title::GAID_FOR_UPDATE ) && !is_null( $this->mRedirect ) ) {
                        return $this->mRedirect;
                }
-               # Calling getArticleID() loads the field from cache as needed
+
                if ( !$this->getArticleID( $flags ) ) {
                        return $this->mRedirect = false;
                }
 
                $linkCache = LinkCache::singleton();
+               $linkCache->addLinkObj( $this );
                $cached = $linkCache->getGoodLinkFieldObj( $this, 'redirect' );
+
                if ( $cached === null ) {
-                       // TODO: check the assumption that the cache actually knows about this title
-                       // and handle this, such as get the title from the database.
-                       // See https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
-                       wfDebug( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
-                       wfDebug( wfBacktrace() );
+                       // Should not happen
+                       throw new MWException( "LinkCache doesn't know redirect status of this title: " . $this->getPrefixedDBkey() );
                }
 
                $this->mRedirect = (bool)$cached;
@@ -2975,20 +2975,21 @@ class Title {
         * @return Int
         */
        public function getLength( $flags = 0 ) {
-               if ( $this->mLength != -1 ) {
+               if ( !( $flags & Title::GAID_FOR_UPDATE ) && $this->mLength != -1 ) {
                        return $this->mLength;
                }
-               # Calling getArticleID() loads the field from cache as needed
+
                if ( !$this->getArticleID( $flags ) ) {
                        return $this->mLength = 0;
                }
+
                $linkCache = LinkCache::singleton();
+               $linkCache->addLinkObj( $this );
                $cached = $linkCache->getGoodLinkFieldObj( $this, 'length' );
-               if ( $cached === null ) { # check the assumption that the cache actually knows about this title
-                       # XXX: this does apparently happen, see https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
-                       #      as a stop gap, perhaps log this, but don't throw an exception?
-                       wfDebug( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
-                       wfDebug( wfBacktrace() );
+
+               if ( $cached === null ) {
+                       // Should not happen
+                       throw new MWException( "LinkCache doesn't know redirect status of this title: " . $this->getPrefixedDBkey() );
                }
 
                $this->mLength = intval( $cached );
@@ -3007,17 +3008,18 @@ class Title {
                if ( !( $flags & Title::GAID_FOR_UPDATE ) && $this->mLatestID !== false ) {
                        return intval( $this->mLatestID );
                }
-               # Calling getArticleID() loads the field from cache as needed
+
                if ( !$this->getArticleID( $flags ) ) {
                        return $this->mLatestID = 0;
                }
+
                $linkCache = LinkCache::singleton();
                $linkCache->addLinkObj( $this );
                $cached = $linkCache->getGoodLinkFieldObj( $this, 'revision' );
-               if ( $cached === null ) { # check the assumption that the cache actually knows about this title
-                       # XXX: this does apparently happen, see https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
-                       #      as a stop gap, perhaps log this, but don't throw an exception?
-                       throw new MWException( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
+
+               if ( $cached === null ) {
+                       // Should not happen
+                       throw new MWException( "LinkCache doesn't know latest revision ID of this title: " . $this->getPrefixedDBkey() );
                }
 
                $this->mLatestID = intval( $cached );
index 37dbef4..4276fb0 100644 (file)
@@ -42,7 +42,8 @@ class WebResponse {
         * Set the browser cookie
         * @param $name String: name of cookie
         * @param $value String: value to give cookie
-        * @param $expire Int: number of seconds til cookie expires
+        * @param $expire Int: Unix timestamp (in seconds) when the cookie should expire.
+        *        0 (the default) causes it to expire $wgCookieExpiration seconds from now.
         * @param $prefix String: Prefix to use, if not $wgCookiePrefix (use '' for no prefix)
         * @param $domain String: Cookie domain to use, if not $wgCookieDomain
         * @param $forceSecure Bool:
@@ -69,7 +70,11 @@ class WebResponse {
                        $secureCookie = $forceSecure;
                }
 
-               $httpOnlySafe = wfHttpOnlySafe() && $wgCookieHttpOnly;
+               // Mark the cookie as httpOnly if $wgCookieHttpOnly is true,
+               // unless the requesting user-agent is known to have trouble with
+               // httpOnly cookies.
+               $httpOnlySafe = $wgCookieHttpOnly && wfHttpOnlySafe();
+
                wfDebugLog( 'cookie',
                        'setcookie: "' . implode( '", "',
                                array(
index 1d6dc66..b642c6d 100644 (file)
@@ -303,12 +303,12 @@ class ApiEditPage extends ApiBase {
                // TODO: Make them not or check if they still do
                $wgTitle = $titleObj;
 
-               $articleObject = new Article( $titleObj );
-
                $articleContext = new RequestContext;
                $articleContext->setRequest( $req );
-               $articleContext->setTitle( $titleObj );
-               $articleObject->setContext( $articleContext );
+               $articleContext->setWikiPage( $pageObj );
+               $articleContext->setUser( $this->getUser() );
+
+               $articleObject = Article::newFromWikiPage( $pageObj, $articleContext );
 
                $ep = new EditPage( $articleObject );
 
@@ -409,7 +409,6 @@ class ApiEditPage extends ApiBase {
                                } else {
                                        $r['oldrevid'] = intval( $oldRevId );
                                        $r['newrevid'] = intval( $newRevId );
-                                       $pageObj->clear();
                                        $r['newtimestamp'] = wfTimestamp( TS_ISO_8601,
                                                $pageObj->getTimestamp() );
                                }
index fed515b..c3ae8b1 100644 (file)
@@ -921,7 +921,13 @@ class ApiMain extends ApiBase {
                $paramsUsed = $this->getParamsUsed();
                $allParams = $this->getRequest()->getValueNames();
 
-               $unusedParams = array_diff( $allParams, $paramsUsed );
+               // Printer has not yet executed; don't warn that its parameters are unused
+               $printerParams = array_map(
+                       array( $this->mPrinter, 'encodeParamName' ),
+                       array_keys( $this->mPrinter->getFinalParams() ?: array() )
+               );
+
+               $unusedParams = array_diff( $allParams, $paramsUsed, $printerParams );
                if( count( $unusedParams ) ) {
                        $s = count( $unusedParams ) > 1 ? 's' : '';
                        $this->setWarning( "Unrecognized parameter$s: '" . implode( $unusedParams, "', '" ) . "'" );
index a25e78c..118355c 100644 (file)
@@ -80,6 +80,8 @@ class ApiQuery extends ApiBase {
                'iwbacklinks' => 'ApiQueryIWBacklinks',
                'langbacklinks' => 'ApiQueryLangBacklinks',
                'logevents' => 'ApiQueryLogEvents',
+               'pageswithprop' => 'ApiQueryPagesWithProp',
+               'pagepropnames' => 'ApiQueryPagePropNames',
                'protectedtitles' => 'ApiQueryProtectedTitles',
                'querypage' => 'ApiQueryQueryPage',
                'random' => 'ApiQueryRandom',
diff --git a/includes/api/ApiQueryPagePropNames.php b/includes/api/ApiQueryPagePropNames.php
new file mode 100644 (file)
index 0000000..08c883d
--- /dev/null
@@ -0,0 +1,116 @@
+<?php
+/**
+ * Created on January 21, 2013
+ *
+ * Copyright © 2013 Brad Jorsch <bjorsch@wikimedia.org>
+ *
+ * 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
+ * @author Brad Jorsch
+ */
+
+/**
+ * A query module to list used page props
+ *
+ * @ingroup API
+ * @since 1.21
+ */
+class ApiQueryPagePropNames extends ApiQueryBase {
+
+       public function __construct( $query, $moduleName ) {
+               parent::__construct( $query, $moduleName, 'ppn' );
+       }
+
+       public function getCacheMode( $params ) {
+               return 'public';
+       }
+
+       public function execute() {
+               $params = $this->extractRequestParams();
+
+               $this->addTables( 'page_props' );
+               $this->addFields( 'pp_propname' );
+               $this->addOption( 'DISTINCT' );
+               $this->addOption( 'ORDER BY', 'pp_propname' );
+
+               if ( $params['continue'] ) {
+                       $cont = explode( '|', $params['continue'] );
+                       $this->dieContinueUsageIf( count( $cont ) != 1 );
+
+                       // Add a WHERE clause
+                       $this->addWhereRange( 'pp_propname', 'newer', $cont[0], null );
+               }
+
+               $limit = $params['limit'];
+               $this->addOption( 'LIMIT', $limit + 1 );
+
+               $result = $this->getResult();
+               $count = 0;
+               foreach ( $this->select( __METHOD__ ) as $row ) {
+                       if ( ++$count > $limit ) {
+                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                               $this->setContinueEnumParameter( 'continue', $row->pp_propname );
+                               break;
+                       }
+
+                       $vals = array();
+                       $vals['propname'] = $row->pp_propname;
+                       $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
+                       if ( !$fit ) {
+                               $this->setContinueEnumParameter( 'continue', $row->pp_propname );
+                               break;
+                       }
+               }
+
+               $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'p' );
+       }
+
+       public function getAllowedParams() {
+               return array(
+                       'continue' => null,
+                       'limit' => array(
+                               ApiBase::PARAM_TYPE => 'limit',
+                               ApiBase::PARAM_DFLT => 10,
+                               ApiBase::PARAM_MIN => 1,
+                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+                       ),
+               );
+       }
+
+       public function getParamDescription() {
+               return array(
+                       'continue' => 'When more results are available, use this to continue',
+                       'limit' => 'The maximum number of pages to return',
+               );
+       }
+
+       public function getDescription() {
+               return 'List all page prop names in use on the wiki';
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=query&list=pagepropnames' => 'Get first 10 prop names',
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Pagepropnames';
+       }
+}
diff --git a/includes/api/ApiQueryPagesWithProp.php b/includes/api/ApiQueryPagesWithProp.php
new file mode 100644 (file)
index 0000000..0132fc3
--- /dev/null
@@ -0,0 +1,189 @@
+<?php
+/**
+ * Created on December 31, 2012
+ *
+ * Copyright © 2012 Brad Jorsch <bjorsch@wikimedia.org>
+ *
+ * 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
+ * @author Brad Jorsch
+ */
+
+/**
+ * A query module to enumerate pages that use a particular prop
+ *
+ * @ingroup API
+ * @since 1.21
+ */
+class ApiQueryPagesWithProp extends ApiQueryGeneratorBase {
+
+       public function __construct( $query, $moduleName ) {
+               parent::__construct( $query, $moduleName, 'pwp' );
+       }
+
+       public function execute() {
+               $this->run();
+       }
+
+       public function getCacheMode( $params ) {
+               return 'public';
+       }
+
+       public function executeGenerator( $resultPageSet ) {
+               $this->run( $resultPageSet );
+       }
+
+       /**
+        * @param $resultPageSet ApiPageSet
+        * @return void
+        */
+       private function run( $resultPageSet = null ) {
+               $params = $this->extractRequestParams();
+
+               $prop = array_flip( $params['prop'] );
+               $fld_ids = isset( $prop['ids'] );
+               $fld_title = isset( $prop['title'] );
+               $fld_value = isset( $prop['value'] );
+
+               if ( $resultPageSet === null ) {
+                       $this->addFields( array( 'page_id' ) );
+                       $this->addFieldsIf( array( 'page_title', 'page_namespace' ), $fld_title );
+                       $this->addFieldsIf( 'pp_value', $fld_value );
+               } else {
+                       $this->addFields( $resultPageSet->getPageTableFields() );
+               }
+               $this->addTables( array( 'page_props', 'page' ) );
+               $this->addWhere( 'pp_page=page_id' );
+               $this->addWhereFld( 'pp_propname', $params['propname'] );
+
+               $dir = ( $params['dir'] == 'ascending' ) ? 'newer' : 'older';
+
+               if ( $params['continue'] ) {
+                       $cont = explode( '|', $params['continue'] );
+                       $this->dieContinueUsageIf( count( $cont ) != 1 );
+
+                       // Add a WHERE clause
+                       $from = (int)$cont[0];
+                       $this->addWhereRange( 'pp_page', $dir, $from, null );
+               }
+
+               $sort = ( $params['dir'] === 'descending' ? ' DESC' : '' );
+               $this->addOption( 'ORDER BY', 'pp_page' . $sort );
+
+               $limit = $params['limit'];
+               $this->addOption( 'LIMIT', $limit + 1 );
+
+               $result = $this->getResult();
+               $count = 0;
+               foreach ( $this->select( __METHOD__ ) as $row ) {
+                       if ( ++$count > $limit ) {
+                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                               $this->setContinueEnumParameter( 'continue', $row->page_id );
+                               break;
+                       }
+
+                       if ( $resultPageSet === null ) {
+                               $vals = array();
+                               if ( $fld_ids ) {
+                                       $vals['pageid'] = (int)$row->page_id;
+                               }
+                               if ( $fld_title ) {
+                                       $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+                                       ApiQueryBase::addTitleInfo( $vals, $title );
+                               }
+                               if ( $fld_value ) {
+                                       $vals['value'] = $row->pp_value;
+                               }
+                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
+                               if ( !$fit ) {
+                                       $this->setContinueEnumParameter( 'continue', $row->page_id );
+                                       break;
+                               }
+                       } else {
+                               $resultPageSet->processDbRow( $row );
+                       }
+               }
+
+               if ( $resultPageSet === null ) {
+                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'page' );
+               }
+       }
+
+       public function getAllowedParams() {
+               return array(
+                       'propname' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true,
+                       ),
+                       'prop' => array(
+                               ApiBase::PARAM_DFLT => 'ids|title',
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_TYPE => array (
+                                       'ids',
+                                       'title',
+                                       'value',
+                               )
+                       ),
+                       'continue' => null,
+                       'limit' => array(
+                               ApiBase::PARAM_TYPE => 'limit',
+                               ApiBase::PARAM_DFLT => 10,
+                               ApiBase::PARAM_MIN => 1,
+                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+                       ),
+                       'dir' => array(
+                               ApiBase::PARAM_DFLT => 'ascending',
+                               ApiBase::PARAM_TYPE => array(
+                                       'ascending',
+                                       'descending',
+                               )
+                       ),
+               );
+       }
+
+       public function getParamDescription() {
+               return array(
+                       'propname' => 'Page prop for which to enumerate pages',
+                       'prop' => array(
+                               'What pieces of information to include',
+                               ' ids   - Adds the page ID',
+                               ' title - Adds the title and namespace ID of the page',
+                               ' value - Adds the value of the page prop',
+                       ),
+                       'dir' => 'In which direction to sort',
+                       'continue' => 'When more results are available, use this to continue',
+                       'limit' => 'The maximum number of pages to return',
+               );
+       }
+
+       public function getDescription() {
+               return 'List all pages using a given page prop';
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=query&list=pageswithprop&pwppropname=displaytitle&pwpprop=ids|title|value' => 'Get first 10 pages using {{DISPLAYTITLE:}}',
+                       'api.php?action=query&generator=pageswithprop&gpwppropname=notoc&prop=info' => 'Get page info about first 10 pages using __NOTOC__',
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Pageswithprop';
+       }
+}
index 624711a..ac13589 100644 (file)
@@ -114,7 +114,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendGeneralInfo( $property ) {
-               global $wgContLang;
+               global $wgContLang,
+                       $wgDisableLangConversion,
+                       $wgDisableTitleConversion;
 
                $data = array();
                $mainPage = Title::newMainPage();
@@ -127,6 +129,23 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['dbtype'] = $GLOBALS['wgDBtype'];
                $data['dbversion'] = $this->getDB()->getServerVersion();
 
+               if ( !$wgDisableLangConversion ) {
+                       $data['langconversion'] = '';
+               }
+
+               if ( !$wgDisableTitleConversion ) {
+                       $data['titleconversion'] = '';
+               }
+
+               if ( $wgContLang->linkPrefixExtension() ) {
+                       $data['linkprefix'] = wfMessage( 'linkprefix' )->inContentLanguage()->text();
+               }
+
+               $linktrail = $wgContLang->linkTrail();
+               if ( $linktrail ) {
+                       $data['linktrail'] = $linktrail;
+               }
+
                $git = SpecialVersion::getGitHeadSha1( $GLOBALS['IP'] );
                if ( $git ) {
                        $data['git-hash'] = $git;
index c282a07..3ebfdb1 100644 (file)
@@ -283,7 +283,7 @@ abstract class FileBackend {
         * $opts is an associative of boolean flags, including:
         *   - force               : Operation precondition errors no longer trigger an abort.
         *                           Any remaining operations are still attempted. Unexpected
-        *                           failures may still cause remaning operations to be aborted.
+        *                           failures may still cause remaining operations to be aborted.
         *   - nonLocking          : No locks are acquired for the operations.
         *                           This can increase performance for non-critical writes.
         *                           This has no effect unless the 'force' flag is set.
index f371115..bf2749f 100644 (file)
@@ -1414,8 +1414,12 @@ abstract class File {
         * @param $copyStatus string
         * @param $source string
         * @param $watch bool
+        * @param $timestamp string|bool
+        * @param $user User object or null to use $wgUser
+        * @return bool
+        * @throws MWException
         */
-       function recordUpload( $oldver, $desc, $license = '', $copyStatus = '', $source = '', $watch = false ) {
+       function recordUpload( $oldver, $desc, $license = '', $copyStatus = '', $source = '', $watch = false, $timestamp = false, User $user = null ) {
                $this->readOnlyError();
        }
 
index b0a1ebf..610f556 100644 (file)
@@ -73,11 +73,12 @@ class ForeignDBFile extends LocalFile {
         * @param $source string
         * @param $watch bool
         * @param $timestamp bool|string
+        * @param $user User object or null to use $wgUser
         * @return bool
         * @throws MWException
         */
        function recordUpload( $oldver, $desc, $license = '', $copyStatus = '', $source = '',
-               $watch = false, $timestamp = false ) {
+               $watch = false, $timestamp = false, User $user = null ) {
                $this->readOnlyError();
        }
 
index ee49448..11eab1e 100644 (file)
@@ -71,6 +71,7 @@ class LocalFile extends File {
                $extraDataLoaded,  # Whether or not lazy-loaded data has been loaded from the database
                $upgraded,         # Whether the row was upgraded on load
                $locked,           # True if the image row is locked
+               $lockedOwnTrx,     # True if the image row is locked with a lock initiated transaction
                $missing,          # True if file is not present in file system. Not to be cached in memcached
                $deleted;          # Bitfield akin to rev_deleted
 
@@ -1119,20 +1120,25 @@ class LocalFile extends File {
         * @param $source string
         * @param $watch bool
         * @param $timestamp string|bool
+        * @param $user User object or null to use $wgUser
         * @return bool
         */
        function recordUpload( $oldver, $desc, $license = '', $copyStatus = '', $source = '',
-               $watch = false, $timestamp = false )
+               $watch = false, $timestamp = false, User $user = null )
        {
+               if ( !$user ) {
+                       global $wgUser;
+                       $user = $wgUser;
+               }
+
                $pageText = SpecialUpload::getInitialPageText( $desc, $license, $copyStatus, $source );
 
-               if ( !$this->recordUpload2( $oldver, $desc, $pageText, false, $timestamp ) ) {
+               if ( !$this->recordUpload2( $oldver, $desc, $pageText, false, $timestamp, $user ) ) {
                        return false;
                }
 
                if ( $watch ) {
-                       global $wgUser;
-                       $wgUser->addWatch( $this->getTitle() );
+                       $user->addWatch( $this->getTitle() );
                }
                return true;
        }
@@ -1669,7 +1675,10 @@ class LocalFile extends File {
                $dbw = $this->repo->getMasterDB();
 
                if ( !$this->locked ) {
-                       $dbw->begin( __METHOD__ );
+                       if ( !$dbw->trxLevel() ) {
+                               $dbw->begin( __METHOD__ );
+                               $this->lockedOwnTrx = true;
+                       }
                        $this->locked++;
                }
 
@@ -1684,9 +1693,10 @@ class LocalFile extends File {
        function unlock() {
                if ( $this->locked ) {
                        --$this->locked;
-                       if ( !$this->locked ) {
+                       if ( !$this->locked && $this->lockedOwnTrx ) {
                                $dbw = $this->repo->getMasterDB();
                                $dbw->commit( __METHOD__ );
+                               $this->lockedOwnTrx = false;
                        }
                }
        }
@@ -1698,6 +1708,7 @@ class LocalFile extends File {
                $this->locked = false;
                $dbw = $this->repo->getMasterDB();
                $dbw->rollback( __METHOD__ );
+               $this->lockedOwnTrx = false;
        }
 
        /**
index 7263392..ecee84c 100644 (file)
@@ -668,6 +668,7 @@ If you\'re translating this message to a right-to-left language, consider writin
        'config-admin-password' => '{{Identical|Password}}',
        'config-admin-email' => '{{Identical|E-mail address}}',
        'config-subscribe' => 'Used as label for the installer checkbox',
+       'config-subscribe-help' => '"Low-volume" in this context means that there will be few e-mails to that mailing list per time period.',
        'config-profile-help' => 'Messages referenced:
 * {{msg-mw|config-profile-wiki}}
 * {{msg-mw|config-profile-no-anon}}
@@ -1129,16 +1130,63 @@ $messages['as'] = array(
 );
 
 /** Asturian (asturianu)
+ * @author Xuacu
  */
 $messages['ast'] = array(
+       'config-desc' => "L'instalador pa MediaWiki",
+       'config-title' => 'Instalación de MediaWiki $1',
+       'config-information' => 'Información',
+       'config-localsettings-upgrade' => "Detectose un ficheru <code>LocalSettings.php</code>.
+P'anovar esta instalación, escriba'l valor de
+<code>\$wgUpgradeKey</code> nel cuadru d'abaxo.
+Alcontraralu en <code>LocalSettings.php</code>.",
+       'config-localsettings-cli-upgrade' => "Deteutose un ficheru <code>LocalSettings.php</code>.
+P'anovar esta instalación, execute <code>update.php</code>",
+       'config-localsettings-key' => "Clave d'anovamientu:",
+       'config-localsettings-badkey' => 'La clave que dio ye incorreuta.',
+       'config-upgrade-key-missing' => "Deteutose una instalación esistente de MediaWiki.
+P'anovar esta instalación, ponga la llinia siguiente al final del ficheru <code>LocalSettings.php</code>:
+
+$1",
+       'config-localsettings-incomplete' => 'Paez que\'l ficheru <code>LocalSettings.php</code> esistente ta incompletu.
+La variable $1 nun ta definida.
+Camude\'l ficheru <code>LocalSettings.php</code> pa qu\'esta variable quede definida y calque "{{int:Config-continue}}".',
+       'config-localsettings-connection-error' => 'Alcontrose un error al conectar cola base de datos usando la configuración especificada en <code>LocalSettings.php</code> o <code>AdminSettings.php</code>. Corrixa esta configuración y vuelva a intentalo.
+
+$1',
+       'config-your-language' => 'La so llingua:',
+       'config-your-language-help' => "Seleicione la llingua a emplegar nel procesu d'instalación.",
+       'config-wiki-language' => 'Llingua de la wiki:',
+       'config-wiki-language-help' => "Seleicione la llingua que s'usará preferentemente na wiki.",
+       'config-back' => '← Atrás',
+       'config-continue' => 'Siguir →',
+       'config-page-language' => 'Llingua',
+       'config-page-welcome' => '¡Bienveníu a MediaWiki!',
+       'config-page-dbconnect' => 'Conectar cola base de datos',
+       'config-page-upgrade' => 'Anovar instalación esistente',
+       'config-page-dbsettings' => 'Configuración de la base de datos',
+       'config-page-name' => 'Nome',
+       'config-page-options' => 'Opciones',
+       'config-page-install' => 'Instalar',
+       'config-page-complete' => '¡Completo!',
+       'config-page-restart' => 'Reaniciar la instalación',
+       'config-page-readme' => 'Llei-me',
+       'config-page-releasenotes' => 'Notes de la versión',
+       'config-page-copying' => 'Copiar',
+       'config-page-upgradedoc' => 'Anovando',
+       'config-page-existingwiki' => 'Wiki esistente',
+       'config-download-localsettings' => 'Descargar <code>LocalSettings.php</code>',
+       'config-help' => 'Ayuda',
+       'config-nofile' => 'Nun pudo atopase\'l ficheru "$1". ¿Desaniciose?',
        'mainpagetext' => "'''MediaWiki instalóse correchamente.'''",
-       'mainpagedocfooter' => "Visita la [//meta.wikimedia.org/wiki/Help:Contents Guía d'usuariu] pa saber cómo usar esti software wiki.
+       'mainpagedocfooter' => 'Visita la [//meta.wikimedia.org/wiki/Help:Contents Guía del usuariu] pa saber cómo usar esti software wiki.
 
 == Empecipiando ==
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Llista de les opciones de configuración]
 * [//www.mediawiki.org/wiki/Manual:FAQ FAQ de MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de corréu de les ediciones de MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de corréu de les ediciones de MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Llocaliza MediaWiki na to llingua]',
 );
 
 /** Kotava (Kotava)
@@ -3656,6 +3704,7 @@ $messages['da'] = array(
  * @author Rillke
  * @author The Evil IP address
  * @author Umherirrender
+ * @author Wikinaut
  * @author 아라
  */
 $messages['de'] = array(
@@ -3707,7 +3756,7 @@ Die Datei <code>php.ini</code> muss geprüft und es muss dabei sichergestellt we
        'config-page-copying' => 'Kopie der Lizenz',
        'config-page-upgradedoc' => 'Aktualisiere',
        'config-page-existingwiki' => 'Vorhandenes Wiki',
-       'config-help-restart' => 'Sollen alle bereits eingegebene Daten gelöscht und der Installationsvorgang erneut gestartet werden?',
+       'config-help-restart' => 'Sollen alle bereits eingegebenen Daten gelöscht und der Installationsvorgang erneut gestartet werden?',
        'config-restart' => 'Ja, erneut starten',
        'config-welcome' => '=== Prüfung der Installationsumgebung ===
 Die Basisprüfungen werden durchgeführt, um festzustellen, ob die Installationsumgebung für die Installation von MediaWiki geeignet ist.
@@ -7717,7 +7766,7 @@ Změń ju jenož, jeli su přeswědčiwe přičiny za to.',
        'config-support-mysql' => '* $1 je primarny cil za MediaWiki a podpěruje so najlěpje ([http://www.php.net/manual/en/mysql.installation.php Nawod ke kompilowanju  PHP z  MySQL-podpěru])',
        'config-support-postgres' => '* $1 je popularny system datoweje banki zjawneho žórła jako alternatiwa k MySQL ([http://www.php.net/manual/en/pgsql.installation.php nawod za kompilowanje PHP z podpěru PostgreSQL]). Móhło hišće někotre zmylki eksistować, a njeporuča so jón w produktiwnej wokolinje wužiwać.',
        'config-support-oracle' => '* $1 je komercielna předewzaćelska datowa banka. ([http://www.php.net/manual/en/oci8.installation.php Nawod za kompilowanje PHP z OCI8-podpěru])',
-       'config-support-ibm_db2' => '* $1 je komercielna předewzaćelska datowa banka.', # Fuzzy
+       'config-support-ibm_db2' => '* $1 je komercielna předewzaćelska datowa banka. ([http://www.php.net/manual/en/ibm-db2.installation.php How to compile PHP with IBM DB2 support])',
        'config-header-mysql' => 'Nastajenja MySQL',
        'config-header-postgres' => 'Nastajenja PostgreSQL',
        'config-header-sqlite' => 'Nastajenja SQLite',
@@ -7809,7 +7858,7 @@ Móžeš nětko zbytnu konfiguraciju přeskočić a wiki hnydom instalować.',
        'config-optional-continue' => 'Dalše prašenja?',
        'config-optional-skip' => 'Instaluj nětko wiki.',
        'config-profile' => 'Profil wužiwarskich prawow:',
-       'config-profile-wiki' => 'Tradicionelny wiki', # Fuzzy
+       'config-profile-wiki' => 'Zjawny wiki',
        'config-profile-no-anon' => 'Załoženje konto je trěbne',
        'config-profile-fishbowl' => 'Jenož awtorizowani wobdźěłarjo',
        'config-profile-private' => 'Priwatny wiki',
@@ -7867,7 +7916,7 @@ To móže sej přidatnu konfiguraciju wužadać, ale móžeš je nětko zmóžni
        'config-install-alreadydone' => "'''Warnowanje:''' Zda so, zo sy hižo MediaWiki instalował a pospytuješ jón znowa instalować.
 Prošu pokročuj z přichodnej stronu.",
        'config-install-begin' => 'Přez kliknjenje na "{{int:config-continue}}" budźe so instalacija MediaWiki startować.
-Jeli hišće chceš něšto změnić, klikń na "Wróćo".', # Fuzzy
+Jeli hišće chceš něšto změnić, klikń na "{{int:config-back}}".',
        'config-install-step-done' => 'dokónčene',
        'config-install-step-failed' => 'njeporadźiło',
        'config-install-extensions' => 'Inkluziwnje rozšěrjenja',
@@ -7913,7 +7962,8 @@ Standardna lisćina sp přeskakuje.",
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Wo nastajenjach]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]', # Fuzzy
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]',
 );
 
 /** Haitian (Kreyòl ayisyen)
@@ -9976,12 +10026,12 @@ php.ini 内で <code>session.save_path</code> が適切なディレクトリに
        'config-copyright' => '=== 著作権および規約 ===
 $1
 
-この作品はフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行するGNU一般公衆利用許諾書 (GNU General Public License)(バージョン2、またはそれ以降のライセンス)の規約に基づき、このライブラリを再配布および改変できます。
+この作品はフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行するGNU一般公衆利用許諾書 (GNU General Public License) (バージョン2、またはそれ以降のライセンス) の規約に基づき、このライブラリを再配布および改変できます。
 
 この作品は、有用であることを期待して配布されていますが、商用あるいは特定の目的に適するかどうかも含めて、暗黙的にも、一切保証されません。
 詳しくは、GNU一般公衆利用許諾書をご覧ください。
 
-あなたはこのプログラムと共に、<doclink href=Copying>GNU一般公衆利用許諾契約書の複製</doclink>を一部受け取ったはずです。もし受け取っていなければ、フリーソフトウェア財団(宛先は the Free Software Foundation, Inc., 59Temple Place, Suite 330, Boston, MA 02111-1307 USA)まで請求してください。',
+あなたはこのプログラムと共に、<doclink href=Copying>GNU一般公衆利用許諾契約書の複製</doclink>を一部受け取ったはずです。受け取っていない場合は、フリーソフトウェア財団 (宛先は the Free Software Foundation, Inc., 59Temple Place, Suite 330, Boston, MA 02111-1307 USA) まで請求してください。',
        'config-sidebar' => '* [//www.mediawiki.org MediaWikiのホーム]
 * [//www.mediawiki.org/wiki/Help:Contents 利用者向け案内]
 * [//www.mediawiki.org/wiki/Manual:Contents 管理者向け案内]
@@ -10045,8 +10095,8 @@ MediaWiki を正しく動作させるには、UTF-8 対応が必要です。",
        'config-no-cache' => "'''警告:''' [http://www.php.net/apc APC]、[http://xcache.lighttpd.net/ XCache]、[http://www.iis.net/download/WinCacheForPhp WinCache] のいずれも見つかりませんでした。
 オブジェクトのキャッシュは有効化されません。",
        'config-diff3-bad' => 'GNU diff3 が見つかりません。',
-       'config-imagemagick' => 'ImageMagickが見つかりました<code>$1</code>。
\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81\8cæ\9c\89å\8a¹ã\81ªã\82\89ã\80\81ç\94»å\83\8fã\81®ã\82µã\83 ã\83\8dã\82¤ã\83«ã\81\8c利用できます。',
+       'config-imagemagick' => 'ImageMagickが見つかりました<code>$1</code>。
\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81\8cæ\9c\89å\8a¹ã\81§ã\81\82ã\82\8cã\81°ã\80\81ç\94»å\83\8fã\81®ã\82µã\83 ã\83\8dã\82¤ã\83«ã\82\92利用できます。',
        'config-gd' => 'GD画像ライブラリが内蔵されていることが確認されました。
 アップロードが有効なら、画像のサムネイルが利用できます。',
        'config-no-scaling' => 'GDライブラリもImageMagickも見つかりませんでした。
@@ -10266,7 +10316,7 @@ chmod a+w $3</pre>',
        'config-admin-error-user' => '"<nowiki>$1</nowiki>"という名前の管理者を作成する際に内部エラーが発生しました。',
        'config-admin-error-password' => '管理者"<nowiki>$1</nowiki>"のパスワードを設定する際に内部エラーが発生しました: <pre>$2</pre>',
        'config-subscribe' => '[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce リリース告知のメーリングリスト]を購読する。',
-       'config-subscribe-help' => 'これは、リリースの告知(重要なセキュリティに関する案内を含む)に使われる、低容量のメーリングリストです。
+       'config-subscribe-help' => 'これは、リリースの告知 (重要なセキュリティに関する案内を含む) に使用される、流量が少ないメーリングリストです。
 このメーリングリストを購読して、新しいバージョンが出た場合にMediaWikiを更新してください。',
        'config-almost-done' => 'これでほぼ終わりました!
 残りの設定を飛ばして、ウィキを今すぐインストールできます。',
index a19637e..6a2d50f 100644 (file)
@@ -228,6 +228,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        array( 'addField', 'uploadstash',      'us_props',      'patch-uploadstash-us_props.sql' ),
                        array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ),
                        array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ),
+                       array( 'addIndex', 'page_props', 'pp_propname_page',  'patch-page_props-propname-page-index.sql' ),
                );
        }
 
index ff9e271..0a4b5e6 100644 (file)
@@ -225,6 +225,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgIndex', 'oldimage',      'oi_sha1',                '(oi_sha1)' ),
                        array( 'addPgIndex', 'page',          'page_mediawiki_title',   '(page_title) WHERE page_namespace = 8' ),
                        array( 'addPgIndex', 'pagelinks',     'pagelinks_title',        '(pl_title)' ),
+                       array( 'addPgIndex', 'page_props',    'pp_propname_page',       '(pp_propname, pp_page)' ),
                        array( 'addPgIndex', 'revision',      'rev_text_id_idx',        '(rev_text_id)' ),
                        array( 'addPgIndex', 'recentchanges', 'rc_timestamp_bot',       '(rc_timestamp) WHERE rc_bot = 0' ),
                        array( 'addPgIndex', 'templatelinks', 'templatelinks_from',     '(tl_from)' ),
index b5cd640..cd7a2c9 100644 (file)
@@ -108,6 +108,7 @@ class SqliteUpdater extends DatabaseUpdater {
                        array( 'addField', 'uploadstash',      'us_props',      'patch-uploadstash-us_props.sql' ),
                        array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ),
                        array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ),
+                       array( 'addIndex', 'page_props', 'pp_propname_page',  'patch-page_props-propname-page-index.sql' ),
                );
        }
 
index 7ce654b..4996a9e 100644 (file)
@@ -33,11 +33,10 @@ abstract class JobQueue {
        protected $type; // string; job type
        protected $order; // string; job priority for pop()
        protected $claimTTL; // integer; seconds
+       protected $maxTries; // integer; maximum number of times to try a job
 
        const QoS_Atomic = 1; // integer; "all-or-nothing" job insertions
 
-       const MAX_ATTEMPTS = 3; // integer; number of times to try a job
-
        /**
         * @param $params array
         */
@@ -46,6 +45,7 @@ abstract class JobQueue {
                $this->type     = $params['type'];
                $this->order    = isset( $params['order'] ) ? $params['order'] : 'random';
                $this->claimTTL = isset( $params['claimTTL'] ) ? $params['claimTTL'] : 0;
+               $this->maxTries = isset( $params['maxTries'] ) ? $params['maxTries'] : 3;
        }
 
        /**
@@ -62,6 +62,8 @@ abstract class JobQueue {
         *                by timestamp, allowing for some jobs to be popped off out of order.
         *                If "random" is used, pop() will pick jobs in random order. This might be
         *                useful for improving concurrency depending on the queue storage medium.
+        *                Note that "random" really means "don't care", so it may actually be FIFO
+        *                or only weakly random (e.g. pop() takes one of the first X jobs randomly).
         *   - claimTTL : If supported, the queue will recycle jobs that have been popped
         *                but not acknowledged as completed after this many seconds. Recycling
         *                of jobs simple means re-inserting them into the queue. Jobs can be
@@ -162,6 +164,7 @@ abstract class JobQueue {
        /**
         * Push a single jobs into the queue.
         * This does not require $wgJobClasses to be set for the given job type.
+        * Outside callers should use JobQueueGroup::push() instead of this function.
         *
         * @param $jobs Job|Array
         * @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
@@ -169,14 +172,13 @@ abstract class JobQueue {
         * @throws MWException
         */
        final public function push( $jobs, $flags = 0 ) {
-               $jobs = is_array( $jobs ) ? $jobs : array( $jobs );
-
-               return $this->batchPush( $jobs, $flags );
+               return $this->batchPush( is_array( $jobs ) ? $jobs : array( $jobs ), $flags );
        }
 
        /**
         * Push a batch of jobs into the queue.
         * This does not require $wgJobClasses to be set for the given job type.
+        * Outside callers should use JobQueueGroup::push() instead of this function.
         *
         * @param $jobs array List of Jobs
         * @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
@@ -184,11 +186,15 @@ abstract class JobQueue {
         * @throws MWException
         */
        final public function batchPush( array $jobs, $flags = 0 ) {
+               if ( !count( $jobs ) ) {
+                       return true; // nothing to do
+               }
                foreach ( $jobs as $job ) {
                        if ( $job->getType() !== $this->type ) {
                                throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
                        }
                }
+
                wfProfileIn( __METHOD__ );
                $ok = $this->doBatchPush( $jobs, $flags );
                wfProfileOut( __METHOD__ );
@@ -204,8 +210,9 @@ abstract class JobQueue {
        /**
         * Pop a job off of the queue.
         * This requires $wgJobClasses to be set for the given job type.
+        * Outside callers should use JobQueueGroup::pop() instead of this function.
         *
-        * @return Job|bool Returns false on failure
+        * @return Job|bool Returns false if there are no jobs
         * @throws MWException
         */
        final public function pop() {
@@ -234,6 +241,7 @@ abstract class JobQueue {
         * Acknowledge that a job was completed.
         *
         * This does nothing for certain queue classes or if "claimTTL" is not set.
+        * Outside callers should use JobQueueGroup::ack() instead of this function.
         *
         * @param $job Job
         * @return bool
@@ -369,4 +377,15 @@ abstract class JobQueue {
         * @return void
         */
        protected function doFlushCaches() {}
+
+       /**
+        * Namespace the queue with a key to isolate it for testing
+        *
+        * @param $key string
+        * @return void
+        * @throws MWException
+        */
+       public function setTestingPrefix( $key ) {
+               throw new MWException( "Queue namespacing not supported for this queue type." );
+       }
 }
diff --git a/includes/job/JobQueueAggregator.php b/includes/job/JobQueueAggregator.php
new file mode 100644 (file)
index 0000000..3dba3c5
--- /dev/null
@@ -0,0 +1,139 @@
+<?php
+/**
+ * Job queue aggregator code.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle tracking information about all queues
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+abstract class JobQueueAggregator {
+       /** @var JobQueueAggregator */
+       protected static $instance = null;
+
+       /**
+        * @param array $params
+        */
+       protected function __construct( array $params ) {}
+
+       /**
+        * @return JobQueueAggregator
+        */
+       final public static function singleton() {
+               global $wgJobQueueAggregator;
+
+               if ( !isset( self::$instance ) ) {
+                       $class = $wgJobQueueAggregator['class'];
+                       $obj = new $class( $wgJobQueueAggregator );
+                       if ( !( $obj instanceof JobQueueAggregator ) ) {
+                               throw new MWException( "Class '$class' is not a JobQueueAggregator class." );
+                       }
+                       self::$instance = $obj;
+               }
+
+               return self::$instance;
+       }
+
+       /**
+        * Destroy the singleton instance
+        *
+        * @return void
+        */
+       final public static function destroySingleton() {
+               self::$instance = null;
+       }
+
+       /**
+        * Mark a queue as being empty
+        *
+        * @param string $wiki
+        * @param string $type
+        * @return bool Success
+        */
+       final public function notifyQueueEmpty( $wiki, $type ) {
+               wfProfileIn( __METHOD__ );
+               $ok = $this->doNotifyQueueEmpty( $wiki, $type );
+               wfProfileOut( __METHOD__ );
+               return $ok;
+       }
+
+       /**
+        * @see JobQueueAggregator::notifyQueueEmpty()
+        */
+       abstract protected function doNotifyQueueEmpty( $wiki, $type );
+
+       /**
+        * Mark a queue as being non-empty
+        *
+        * @param string $wiki
+        * @param string $type
+        * @return bool Success
+        */
+       final public function notifyQueueNonEmpty( $wiki, $type ) {
+               wfProfileIn( __METHOD__ );
+               $ok = $this->doNotifyQueueNonEmpty( $wiki, $type );
+               wfProfileOut( __METHOD__ );
+               return $ok;
+       }
+
+       /**
+        * @see JobQueueAggregator::notifyQueueNonEmpty()
+        */
+       abstract protected function doNotifyQueueNonEmpty( $wiki, $type );
+
+       /**
+        * Get the list of all of the queues with jobs
+        *
+        * @return Array (job type => (list of wiki IDs))
+        */
+       final public function getAllReadyWikiQueues() {
+               wfProfileIn( __METHOD__ );
+               $res = $this->doGetAllReadyWikiQueues();
+               wfProfileOut( __METHOD__ );
+               return $res;
+       }
+
+       /**
+        * @see JobQueueAggregator::getAllReadyWikiQueues()
+        */
+       abstract protected function doGetAllReadyWikiQueues();
+
+       /**
+        * Get all databases that have a pending job.
+        * This poll all the queues and is this expensive.
+        *
+        * @return Array (job type => (list of wiki IDs))
+        */
+       protected function findPendingWikiQueues() {
+               global $wgLocalDatabases;
+
+               $pendingDBs = array(); // (job type => (db list))
+               foreach ( $wgLocalDatabases as $db ) {
+                       foreach ( JobQueueGroup::singleton( $db )->getQueuesWithJobs() as $type ) {
+                               $pendingDBs[$type][] = $db;
+                       }
+               }
+
+               return $pendingDBs;
+       }
+}
diff --git a/includes/job/JobQueueAggregatorMemc.php b/includes/job/JobQueueAggregatorMemc.php
new file mode 100644 (file)
index 0000000..4b82cf9
--- /dev/null
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Job queue aggregator code that uses BagOStuff.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle tracking information about all queues using BagOStuff
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+class JobQueueAggregatorMemc extends JobQueueAggregator {
+       /** @var BagOStuff */
+       protected $cache;
+
+       protected $cacheTTL; // integer; seconds
+
+       /**
+        * @params include:
+        *   - objectCache : Name of an object cache registered in $wgObjectCaches.
+        *                   This defaults to the one specified by $wgMainCacheType.
+        *   - cacheTTL    : Seconds to cache the aggregate data before regenerating.
+        * @param array $params
+        */
+       protected function __construct( array $params ) {
+               parent::__construct( $params );
+               $this->cache = isset( $params['objectCache'] )
+                       ? wfGetCache( $params['objectCache'] )
+                       : wfGetMainCache();
+               $this->cacheTTL = isset( $params['cacheTTL'] ) ? $params['cacheTTL'] : 180; // 3 min
+       }
+
+       /**
+        * @see JobQueueAggregator::doNotifyQueueEmpty()
+        */
+       protected function doNotifyQueueEmpty( $wiki, $type ) {
+               $key = $this->getReadyQueueCacheKey();
+               // Delist the queue from the "ready queue" list
+               if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
+                       $curInfo = $this->cache->get( $key );
+                       if ( is_array( $curInfo ) && isset( $curInfo['pendingDBs'][$type] ) ) {
+                               if ( in_array( $wiki, $curInfo['pendingDBs'][$type] ) ) {
+                                       $curInfo['pendingDBs'][$type] = array_diff(
+                                               $curInfo['pendingDBs'][$type], array( $wiki ) );
+                                       $this->cache->set( $key, $curInfo );
+                               }
+                       }
+                       $this->cache->delete( "$key:lock" ); // unlock
+               }
+               return true;
+       }
+
+       /**
+        * @see JobQueueAggregator::doNotifyQueueNonEmpty()
+        */
+       protected function doNotifyQueueNonEmpty( $wiki, $type ) {
+               return true; // updated periodically
+       }
+
+       /**
+        * @see JobQueueAggregator::doAllGetReadyWikiQueues()
+        */
+       protected function doGetAllReadyWikiQueues() {
+               $key = $this->getReadyQueueCacheKey();
+               // If the cache entry wasn't present, is stale, or in .1% of cases otherwise,
+               // regenerate the cache. Use any available stale cache if another process is
+               // currently regenerating the pending DB information.
+               $pendingDbInfo = $this->cache->get( $key );
+               if ( !is_array( $pendingDbInfo )
+                       || ( time() - $pendingDbInfo['timestamp'] ) > $this->cacheTTL
+                       || mt_rand( 0, 999 ) == 0
+               ) {
+                       if ( $this->cache->add( "$key:rebuild", 1, 1800 ) ) { // lock
+                               $pendingDbInfo = array(
+                                       'pendingDBs' => $this->findPendingWikiQueues(),
+                                       'timestamp'  => time()
+                               );
+                               for ( $attempts=1; $attempts <= 25; ++$attempts ) {
+                                       if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
+                                               $this->cache->set( $key, $pendingDbInfo );
+                                               $this->cache->delete( "$key:lock" ); // unlock
+                                               break;
+                                       }
+                               }
+                               $this->cache->delete( "$key:rebuild" ); // unlock
+                       }
+               }
+               return is_array( $pendingDbInfo )
+                       ? $pendingDbInfo['pendingDBs']
+                       : array(); // cache is both empty and locked
+       }
+
+       /**
+        * @return string
+        */
+       private function getReadyQueueCacheKey() {
+               return "jobqueue:aggregator:ready-queues:v1"; // global
+       }
+}
diff --git a/includes/job/JobQueueAggregatorRedis.php b/includes/job/JobQueueAggregatorRedis.php
new file mode 100644 (file)
index 0000000..74e9171
--- /dev/null
@@ -0,0 +1,165 @@
+<?php
+/**
+ * Job queue aggregator code that uses PhpRedis.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle tracking information about all queues using PhpRedis
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+class JobQueueAggregatorRedis extends JobQueueAggregator {
+       /** @var RedisConnectionPool */
+       protected $redisPool;
+
+       /**
+        * @params include:
+        *   - redisConfig : An array of parameters to RedisConnectionPool::__construct().
+        *   - redisServer : A hostname/port combination or the absolute path of a UNIX socket.
+        *                   If a hostname is specified but no port, the standard port number
+        *                   6379 will be used. Required.
+        * @param array $params
+        */
+       protected function __construct( array $params ) {
+               parent::__construct( $params );
+               $this->server = $params['redisServer'];
+               $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
+       }
+
+       /**
+        * @see JobQueueAggregator::doNotifyQueueEmpty()
+        */
+       protected function doNotifyQueueEmpty( $wiki, $type ) {
+               $conn = $this->getConnection();
+               if ( !$conn ) {
+                       return false;
+               }
+               try {
+                       $conn->hDel( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ) );
+                       return true;
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+                       return false;
+               }
+       }
+
+       /**
+        * @see JobQueueAggregator::doNotifyQueueNonEmpty()
+        */
+       protected function doNotifyQueueNonEmpty( $wiki, $type ) {
+               $conn = $this->getConnection();
+               if ( !$conn ) {
+                       return false;
+               }
+               try {
+                       $conn->hSet( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ), time() );
+                       return true;
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+                       return false;
+               }
+       }
+
+       /**
+        * @see JobQueueAggregator::doAllGetReadyWikiQueues()
+        */
+       protected function doGetAllReadyWikiQueues() {
+               $conn = $this->getConnection();
+               if ( !$conn ) {
+                       return array();
+               }
+               try {
+                       $conn->multi( Redis::PIPELINE );
+                       $conn->exists( $this->getReadyQueueKey() );
+                       $conn->hGetAll( $this->getReadyQueueKey() );
+                       list( $exists, $map ) = $conn->exec();
+
+                       if ( $exists ) { // cache hit
+                               $pendingDBs = array(); // (type => list of wikis)
+                               foreach ( $map as $key => $time ) {
+                                       list( $type, $wiki ) = $this->dencQueueName( $key );
+                                       $pendingDBs[$type][] = $wiki;
+                               }
+                       } else { // cache miss
+                               $pendingDBs = $this->findPendingWikiQueues(); // (type => list of wikis)
+
+                               $now = time();
+                               $map = array();
+                               foreach ( $pendingDBs as $type => $wikis ) {
+                                       foreach ( $wikis as $wiki ) {
+                                               $map[$this->encQueueName( $type, $wiki )] = $now;
+                                       }
+                               }
+                               $conn->hMSet( $this->getReadyQueueKey(), $map );
+                       }
+
+                       return $pendingDBs;
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+                       return array();
+               }
+       }
+
+       /**
+        * Get a connection to the server that handles all sub-queues for this queue
+        *
+        * @return Array (server name, Redis instance)
+        * @throws MWException
+        */
+       protected function getConnection() {
+               return $this->redisPool->getConnection( $this->server );
+       }
+
+       /**
+        * @param RedisConnRef $conn
+        * @param RedisException $e
+        * @return void
+        */
+       protected function handleException( RedisConnRef $conn, $e ) {
+               $this->redisPool->handleException( $this->server, $conn, $e );
+       }
+
+       /**
+        * @return string
+        */
+       private function getReadyQueueKey() {
+               return "jobqueue:aggregator:h-ready-queues:v1"; // global
+       }
+
+       /**
+        * @param string $type
+        * @param string $wiki
+        * @return string
+        */
+       private function encQueueName( $type, $wiki ) {
+               return rawurlencode( $type ) . '/' . rawurlencode( $wiki );
+       }
+
+       /**
+        * @param string $name
+        * @return string
+        */
+       private function dencQueueName( $name ) {
+               list( $type, $wiki ) = explode( '/', $name, 2 );
+               return array( rawurldecode( $type ), rawurldecode( $wiki ) );
+       }
+}
index 6e42305..fd64895 100644 (file)
@@ -150,12 +150,11 @@ class JobQueueDB extends JobQueue {
                                }
                        }
 
+                       $key = $this->getCacheKey( 'empty' );
                        $atomic = ( $flags & self::QoS_Atomic );
-                       $key    = $this->getCacheKey( 'empty' );
-                       $ttl    = self::CACHE_TTL_LONG;
 
                        $dbw->onTransactionIdle(
-                               function() use ( $dbw, $rowSet, $rowList, $atomic, $key, $ttl, $scope
+                               function() use ( $dbw, $rowSet, $rowList, $atomic, $key, $scope
                        ) {
                                global $wgMemc;
 
@@ -197,7 +196,7 @@ class JobQueueDB extends JobQueue {
                                        $dbw->commit( __METHOD__ );
                                }
 
-                               $wgMemc->set( $key, 'false', $ttl ); // queue is not empty
+                               $wgMemc->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
                        } );
                }
 
@@ -424,7 +423,7 @@ class JobQueueDB extends JobQueue {
                                        'job_cmd' => $this->type,
                                        "job_token != {$dbw->addQuotes( '' )}", // was acquired
                                        "job_token_timestamp < {$dbw->addQuotes( $claimCutoff )}", // stale
-                                       "job_attempts < {$dbw->addQuotes( self::MAX_ATTEMPTS )}" ), // retries left
+                                       "job_attempts < {$dbw->addQuotes( $this->maxTries )}" ), // retries left
                                __METHOD__
                        );
                        $ids = array_map( function( $o ) { return $o->job_id; }, iterator_to_array( $res ) );
@@ -454,7 +453,7 @@ class JobQueueDB extends JobQueue {
                        "job_token_timestamp < {$dbw->addQuotes( $pruneCutoff )}" // stale
                );
                if ( $this->claimTTL > 0 ) { // only prune jobs attempted too many times...
-                       $conds[] = "job_attempts >= {$dbw->addQuotes( self::MAX_ATTEMPTS )}";
+                       $conds[] = "job_attempts >= {$dbw->addQuotes( $this->maxTries )}";
                }
                // Get the IDs of jobs that are considered stale and should be removed. Selecting
                // the IDs first means that the UPDATE can be done by primary key (less deadlocks).
index 6d9d590..23a5494 100644 (file)
@@ -39,16 +39,18 @@ class JobQueueGroup {
        const TYPE_DEFAULT = 1; // integer; jobs popped by default
        const TYPE_ANY     = 2; // integer; any job
 
-       const USE_CACHE = 1; // integer; use process cache
+       const USE_CACHE = 1; // integer; use process or persistent cache
 
        const PROC_CACHE_TTL = 15; // integer; seconds
 
+       const CACHE_VERSION = 1; // integer; cache version
+
        /**
         * @param $wiki string Wiki ID
         */
        protected function __construct( $wiki ) {
                $this->wiki = $wiki;
-               $this->cache = new ProcessCacheLRU( 1 );
+               $this->cache = new ProcessCacheLRU( 10 );
        }
 
        /**
@@ -73,8 +75,10 @@ class JobQueueGroup {
        }
 
        /**
+        * Get the job queue object for a given queue type
+        *
         * @param $type string
-        * @return JobQueue Job queue object for a given queue type
+        * @return JobQueue
         */
        public function get( $type ) {
                global $wgJobTypeConf;
@@ -91,7 +95,9 @@ class JobQueueGroup {
 
        /**
         * Insert jobs into the respective queues of with the belong.
-        * This inserts the jobs into the queue specified by $wgJobTypeConf.
+        *
+        * This inserts the jobs into the queue specified by $wgJobTypeConf
+        * and updates the aggregate job queue information cache as needed.
         *
         * @param $jobs Job|array A single Job or a list of Jobs
         * @throws MWException
@@ -111,7 +117,9 @@ class JobQueueGroup {
 
                $ok = true;
                foreach ( $jobsByType as $type => $jobs ) {
-                       if ( !$this->get( $type )->push( $jobs ) ) {
+                       if ( $this->get( $type )->push( $jobs ) ) {
+                               JobQueueAggregator::singleton()->notifyQueueNonEmpty( $this->wiki, $type );
+                       } else {
                                $ok = false;
                        }
                }
@@ -129,35 +137,47 @@ class JobQueueGroup {
        /**
         * Pop a job off one of the job queues
         *
-        * @param $queueType integer JobQueueGroup::TYPE_* constant
+        * This pops a job off a queue as specified by $wgJobTypeConf and
+        * updates the aggregate job queue information cache as needed.
+        *
+        * @param $qtype integer|string JobQueueGroup::TYPE_DEFAULT or type string
         * @param $flags integer Bitfield of JobQueueGroup::USE_* constants
         * @return Job|bool Returns false on failure
         */
-       public function pop( $queueType = self::TYPE_DEFAULT, $flags = 0 ) {
-               if ( $flags & self::USE_CACHE ) {
-                       if ( !$this->cache->has( 'queues-ready', 'list', self::PROC_CACHE_TTL ) ) {
-                               $this->cache->set( 'queues-ready', 'list', $this->getQueuesWithJobs() );
+       public function pop( $qtype = self::TYPE_DEFAULT, $flags = 0 ) {
+               if ( is_string( $qtype ) ) { // specific job type
+                       $job = $this->get( $qtype )->pop();
+                       if ( !$job ) {
+                               JobQueueAggregator::singleton()->notifyQueueEmpty( $this->wiki, $qtype );
+                       }
+                       return $job;
+               } else { // any job in the "default" jobs types
+                       if ( $flags & self::USE_CACHE ) {
+                               if ( !$this->cache->has( 'queues-ready', 'list', self::PROC_CACHE_TTL ) ) {
+                                       $this->cache->set( 'queues-ready', 'list', $this->getQueuesWithJobs() );
+                               }
+                               $types = $this->cache->get( 'queues-ready', 'list' );
+                       } else {
+                               $types = $this->getQueuesWithJobs();
                        }
-                       $types = $this->cache->get( 'queues-ready', 'list' );
-               } else {
-                       $types = $this->getQueuesWithJobs();
-               }
-
-               if ( $queueType == self::TYPE_DEFAULT ) {
-                       $types = array_intersect( $types, $this->getDefaultQueueTypes() );
-               }
-               shuffle( $types ); // avoid starvation
 
-               foreach ( $types as $type ) { // for each queue...
-                       $job = $this->get( $type )->pop();
-                       if ( $job ) { // found
-                               return $job;
-                       } else { // not found
-                               $this->cache->clear( 'queues-ready' );
+                       if ( $qtype == self::TYPE_DEFAULT ) {
+                               $types = array_intersect( $types, $this->getDefaultQueueTypes() );
+                       }
+                       shuffle( $types ); // avoid starvation
+
+                       foreach ( $types as $type ) { // for each queue...
+                               $job = $this->get( $type )->pop();
+                               if ( $job ) { // found
+                                       return $job;
+                               } else { // not found
+                                       JobQueueAggregator::singleton()->notifyQueueEmpty( $this->wiki, $type );
+                                       $this->cache->clear( 'queues-ready' );
+                               }
                        }
-               }
 
-               return false; // no jobs found
+                       return false; // no jobs found
+               }
        }
 
        /**
@@ -187,9 +207,7 @@ class JobQueueGroup {
         * @return array List of strings
         */
        public function getQueueTypes() {
-               global $wgJobClasses;
-
-               return array_keys( $wgJobClasses );
+               return array_keys( $this->getCachedConfigVar( 'wgJobClasses' ) );
        }
 
        /**
@@ -204,6 +222,8 @@ class JobQueueGroup {
        }
 
        /**
+        * Get the list of job types that have non-empty queues
+        *
         * @return Array List of job types that have non-empty queues
         */
        public function getQueuesWithJobs() {
@@ -216,19 +236,6 @@ class JobQueueGroup {
                return $types;
        }
 
-       /**
-        * @return Array List of default job types that have non-empty queues
-        */
-       public function getDefaultQueuesWithJobs() {
-               $types = array();
-               foreach ( $this->getDefaultQueueTypes() as $type ) {
-                       if ( !$this->get( $type )->isEmpty() ) {
-                               $types[] = $type;
-                       }
-               }
-               return $types;
-       }
-
        /**
         * Execute any due periodic queue maintenance tasks for all queues.
         *
@@ -282,4 +289,27 @@ class JobQueueGroup {
 
                return $count;
        }
+
+       /**
+        * @param $name string
+        * @return mixed
+        */
+       private function getCachedConfigVar( $name ) {
+               global $wgConf, $wgMemc;
+
+               if ( $this->wiki === wfWikiID() ) {
+                       return $GLOBALS[$name]; // common case
+               } else {
+                       list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+                       $key = wfForeignMemcKey( $db, $prefix, 'configvalue', $name );
+                       $value = $wgMemc->get( $key ); // ('v' => ...) or false
+                       if ( is_array( $value ) ) {
+                               return $value['v'];
+                       } else {
+                               $value = $wgConf->getConfig( $this->wiki, $name );
+                               $wgMemc->set( $key, array( 'v' => $value ), 86400 + mt_rand( 0, 86400 ) );
+                               return $value;
+                       }
+               }
+       }
 }
index 3e7a47c..2ce47bb 100644 (file)
@@ -36,18 +36,20 @@ class JobQueueRedis extends JobQueue {
        const ROOTJOB_TTL   = 1209600; // integer; seconds to remember root jobs (14 days)
        const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed (7 days)
 
+       protected $key; // string; key to prefix the queue keys with (used for testing)
+
        /**
         * @params include:
-        *   - redisConf : An array of parameters to RedisConnectionPool::__construct().
-        *   - server    : A hostname/port combination or the absolute path of a UNIX socket.
-        *                 If a hostname is specified but no port, the standard port number
-        *                 6379 will be used. Required.
+        *   - redisConfig : An array of parameters to RedisConnectionPool::__construct().
+        *   - redisServer : A hostname/port combination or the absolute path of a UNIX socket.
+        *                   If a hostname is specified but no port, the standard port number
+        *                   6379 will be used. Required.
         * @param array $params
         */
        public function __construct( array $params ) {
                parent::__construct( $params );
-               $this->server = $params['redisConf']['server'];
-               $this->redisPool = RedisConnectionPool::singleton( $params['redisConf'] );
+               $this->server = $params['redisServer'];
+               $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
        }
 
        /**
@@ -56,10 +58,6 @@ class JobQueueRedis extends JobQueue {
         * @throws MWException
         */
        protected function doIsEmpty() {
-               if ( mt_rand( 0, 99 ) == 0 ) {
-                       $this->doInternalMaintenance();
-               }
-
                $conn = $this->getConnection();
                try {
                        return ( $conn->lSize( $this->getQueueKey( 'l-unclaimed' ) ) == 0 );
@@ -74,10 +72,6 @@ class JobQueueRedis extends JobQueue {
         * @throws MWException
         */
        protected function doGetSize() {
-               if ( mt_rand( 0, 99 ) == 0 ) {
-                       $this->doInternalMaintenance();
-               }
-
                $conn = $this->getConnection();
                try {
                        return $conn->lSize( $this->getQueueKey( 'l-unclaimed' ) );
@@ -92,17 +86,12 @@ class JobQueueRedis extends JobQueue {
         * @throws MWException
         */
        protected function doGetAcquiredCount() {
-               if ( mt_rand( 0, 99 ) == 0 ) {
-                       $this->doInternalMaintenance();
+               if ( $this->claimTTL <= 0 ) {
+                       return 0; // no acknowledgements
                }
-
                $conn = $this->getConnection();
                try {
-                       if ( $this->claimTTL > 0 ) {
-                               return $conn->lSize( $this->getQueueKey( 'l-claimed' ) );
-                       } else {
-                               return 0;
-                       }
+                       return $conn->lSize( $this->getQueueKey( 'l-claimed' ) );
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $this->server, $conn, $e );
                }
@@ -190,8 +179,8 @@ class JobQueueRedis extends JobQueue {
        protected function doPop() {
                $job = false;
 
-               if ( mt_rand( 0, 99 ) == 0 ) {
-                       $this->doInternalMaintenance();
+               if ( $this->claimTTL <= 0 && mt_rand( 0, 99 ) == 0 ) {
+                       $this->cleanupClaimedJobs(); // prune jobs and IDs from the "garbage" list
                }
 
                $conn = $this->getConnection();
@@ -340,25 +329,16 @@ class JobQueueRedis extends JobQueue {
                return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
        }
 
-       /**
-        * Do any job recycling or queue cleanup as needed
-        *
-        * @return void
-        * @return integer Number of jobs recycled/deleted
-        * @throws MWException
-        */
-       protected function doInternalMaintenance() {
-               return ( $this->claimTTL > 0 ) ?
-                       $this->recycleAndDeleteStaleJobs() : $this->cleanupClaimedJobs();
-       }
-
        /**
         * Recycle or destroy any jobs that have been claimed for too long
         *
         * @return integer Number of jobs recycled/deleted
         * @throws MWException
         */
-       protected function recycleAndDeleteStaleJobs() {
+       public function recycleAndDeleteStaleJobs() {
+               if ( $this->claimTTL <= 0 ) { // sanity
+                       throw new MWException( "Cannot recycle jobs since acknowledgements are disabled." );
+               }
                $count = 0;
                // For each job item that can be retried, we need to add it back to the
                // main queue and remove it from the list of currenty claimed job items.
@@ -392,7 +372,7 @@ class JobQueueRedis extends JobQueue {
                                        if ( $ctime < $claimCutoff ) {
                                                // Get the number of failed attempts
                                                $attempts = isset( $info['attempts'] ) ? $info['attempts'] : 0;
-                                               if ( $attempts < self::MAX_ATTEMPTS ) {
+                                               if ( $attempts < $this->maxTries ) {
                                                        $uidsPush[] = $uid; // retry it
                                                } elseif ( $ctime < $pruneCutoff ) {
                                                        $uidsRemove[] = $uid; // just remove it
@@ -488,6 +468,22 @@ class JobQueueRedis extends JobQueue {
                return $count;
        }
 
+       /**
+        * @return Array
+        */
+       protected function doGetPeriodicTasks() {
+               if ( $this->claimTTL > 0 ) {
+                       return array(
+                               'recycleAndDeleteStaleJobs' => array(
+                                       'callback' => array( $this, 'recycleAndDeleteStaleJobs' ),
+                                       'period'   => ceil( $this->claimTTL / 2 )
+                               )
+                       );
+               } else {
+                       return array();
+               }
+       }
+
        /**
         * @param $job Job
         * @return array
@@ -560,7 +556,11 @@ class JobQueueRedis extends JobQueue {
         */
        private function getQueueKey( $prop ) {
                list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
-               return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, $prop );
+               if ( strlen( $this->key ) ) { // namespaced queue (for testing)
+                       return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, $this->key, $prop );
+               } else {
+                       return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, $prop );
+               }
        }
 
        /**
@@ -606,4 +606,12 @@ class JobQueueRedis extends JobQueue {
                }
                return $res;
        }
+
+       /**
+        * @param $key string
+        * @return void
+        */
+       public function setTestingPrefix( $key ) {
+               $this->key = $key;
+       }
 }
index 904a27f..c5c1be5 100644 (file)
 
 /** */
 
+if ( PHP_SAPI != 'cli' ) {
+       die( "Run me from the command line please.\n" );
+}
+
 require_once 'UtfNormalDefines.php';
 require_once 'UtfNormalUtil.php';
 require_once 'UtfNormal.php';
@@ -34,9 +38,6 @@ mb_internal_encoding( "utf-8" );
 
 $verbose = false;
 #$verbose = true;
-if( PHP_SAPI != 'cli' ) {
-       die( "Run me from the command line please.\n" );
-}
 
 $in = fopen( "UTF-8-test.txt", "rt" );
 if( !$in ) {
index 392ba2b..89de929 100644 (file)
  * @ingroup UtfNormal
  */
 
+if( PHP_SAPI != 'cli' ) {
+       die( "Run me from the command line please.\n" );
+}
+
 if( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
        dl( 'php_utfnormal.so' );
 }
@@ -34,10 +38,6 @@ require_once 'UtfNormal.php';
 
 define( 'BENCH_CYCLES', 5 );
 
-if( PHP_SAPI != 'cli' ) {
-       die( "Run me from the command line please.\n" );
-}
-
 $testfiles = array(
        'testdata/washington.txt' => 'English text',
        'testdata/berlin.txt' => 'German text',
index 257e105..9732d76 100644 (file)
  * @ingroup UtfNormal
  */
 
+if( PHP_SAPI != 'cli' ) {
+       die( "Run me from the command line please.\n" );
+}
+
 if( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
        dl( 'php_utfnormal.so' );
 }
@@ -38,10 +42,6 @@ define( 'BENCH_CYCLES', 1 );
 define( 'BIGSIZE', 1024 * 1024 * 10); // 10m
 ini_set('memory_limit', BIGSIZE + 120 * 1024 * 1024);
 
-if( PHP_SAPI != 'cli' ) {
-       die( "Run me from the command line please.\n" );
-}
-
 $testfiles = array(
        'testdata/washington.txt' => 'English text',
        'testdata/berlin.txt' => 'German text',
index 22e6471..661e53f 100644 (file)
  * @ingroup UtfNormal
  */
 
+if( PHP_SAPI != 'cli' ) {
+       die( "Run me from the command line please.\n" );
+}
+
 $verbose = true;
 #define( 'PRETTY_UTF8', true );
 
@@ -54,10 +58,6 @@ require_once 'UtfNormalDefines.php';
 require_once 'UtfNormalUtil.php';
 require_once 'UtfNormal.php';
 
-if( PHP_SAPI != 'cli' ) {
-       die( "Run me from the command line please.\n" );
-}
-
 $in = fopen("NormalizationTest.txt", "rt");
 if( !$in ) {
        print "Couldn't open NormalizationTest.txt -- can't run tests.\n";
diff --git a/includes/specials/SpecialPagesWithProp.php b/includes/specials/SpecialPagesWithProp.php
new file mode 100644 (file)
index 0000000..189798d
--- /dev/null
@@ -0,0 +1,134 @@
+<?php
+/**
+ * Implements Special:PagesWithProp
+ *
+ * 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 SpecialPage
+ * @author Brad Jorsch
+ */
+
+
+/**
+ * Special:PagesWithProp to search the page_props table
+ * @ingroup SpecialPage
+ * @since 1.21
+ */
+class SpecialPagesWithProp extends QueryPage {
+       private $propName = null;
+
+       function __construct( $name = 'PagesWithProp' ) {
+               parent::__construct( $name );
+       }
+
+       function isCacheable() {
+               return false;
+       }
+
+       function execute( $par ) {
+               $this->setHeaders();
+               $this->outputHeader();
+
+               $request = $this->getRequest();
+               $propname = $request->getVal( 'propname', $par );
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select(
+                       'page_props',
+                       'pp_propname',
+                       '',
+                       __METHOD__,
+                       array( 'DISTINCT', 'ORDER BY' => 'pp_propname' )
+               );
+               foreach ( $res as $row ) {
+                       $propnames[$row->pp_propname] = $row->pp_propname;
+               }
+
+               $form = new HTMLForm( array(
+                       'propname' => array(
+                               'type' => 'selectorother',
+                               'name' => 'propname',
+                               'options' => $propnames,
+                               'default' => $propname,
+                               'label-message' => 'pageswithprop-prop',
+                               'required' => true,
+                       ),
+               ), $this->getContext() );
+               $form->setMethod( 'get' );
+               $form->setAction( $this->getTitle()->getFullUrl() );
+               $form->setSubmitCallback( array( $this, 'onSubmit' ) );
+               $form->setWrapperLegend( $this->msg( 'pageswithprop-legend' ) );
+               $form->addHeaderText( $this->msg( 'pageswithprop-text' )->parseAsBlock() );
+               $form->setSubmitTextMsg( 'pageswithprop-submit' );
+
+               $form->prepareForm();
+               $form->displayForm( false );
+               if ( $propname !== '' && $propname !== null ) {
+                       $form->trySubmit();
+               }
+       }
+
+       public function onSubmit( $data, $form ) {
+               $this->propName = $data['propname'];
+               parent::execute( $data['propname'] );
+       }
+
+       /**
+        * Disable RSS/Atom feeds
+        * @return bool
+        */
+       function isSyndicated() {
+               return false;
+       }
+
+       function getQueryInfo() {
+               return array(
+                       'tables' => array( 'page_props', 'page' ),
+                       'fields' => array(
+                               'page_id' => 'pp_page',
+                               'page_namespace',
+                               'page_title',
+                               'page_len',
+                               'page_is_redirect',
+                               'page_latest',
+                               'pp_value',
+                       ),
+                       'conds' => array(
+                               'page_id = pp_page',
+                               'pp_propname' => $this->propName,
+                       ),
+                       'options' => array()
+               );
+       }
+
+       function getOrderFields() {
+               return array( 'page_id' );
+       }
+
+       function formatResult( $skin, $result ) {
+               $title = Title::newFromRow( $result );
+               $ret = Linker::link( $title, null, array(), array(), array( 'known' ) );
+               if ( $result->pp_value !== '' ) {
+                       $value = $this->msg( 'parentheses' )
+                               ->rawParams( Xml::span( $result->pp_value, 'prop-value' ) )
+                               ->escaped();
+                       $ret .= " $value";
+               }
+               return $ret;
+       }
+}
index 3a743a7..25b82cc 100644 (file)
@@ -1533,7 +1533,7 @@ $1",
 'search-interwiki-default' => '$1 نتيجة:',
 'search-interwiki-more' => '(المزيد)',
 'search-relatedarticle' => 'مرتبطة',
-'mwsuggest-disable' => 'عطÙ\84 Ø§Ù\82تراحات Ø£Ø¬Ø§Ù\83س',
+'mwsuggest-disable' => 'تعطÙ\8aÙ\84 Ø§Ù\82تراحات AJAX',
 'searcheverything-enable' => 'ابحث في جميع النطاقات',
 'searchrelated' => 'مرتبطة',
 'searchall' => 'الكل',
index e2f4c67..a992f44 100644 (file)
@@ -419,7 +419,7 @@ $1',
 'viewsourcetext' => 'ܡܨܐ ܐܢܬ ܕܬܚܙܐ ܘܬܢܣܚ ܠܡܒܘ̈ܥܐ ܕܗܕܐ ܦܐܬܐ:',
 'protectedinterface' => 'ܗܕܐ ܦܐܬܐ ܡܘܬܪܐ ܟܬܝܒܬܐ ܕܦܐܬܐ ܠܚܘܪܙܐ ܒܗܢܐ ܘܝܩܝ, ܘܐܝܬܝܗܝ ܢܛܪܬܐ ܠܡܘܢܥ ܚܘܒܠܐ.
 ܠܡܘܣܦ ܐܘ ܫܘܚܠܦ ܬܘܪ̈ܓܡܐ ܕܟܠܗܘܢ ܘܝܩܝ، ܐܦܠܚ [//translatewiki.net/ translatewiki.net]، ܬܪܡܝܬܐ ܕܬܘܪܓܡܐ ܕܡܝܕܝܐܘܝܩܝ.',
-'editinginterface' => "'''Ü\99Ü\98Ü\97ܪÜ\90:''' Ü\90ܢܬ Ü«Ü\9aܠܦܬ ܦܐܬܐ ܕܡܬܦܠܚܬ ܒܚܙܝܐ ܟܬܝܒܝܐ ܕܬܚܪܙܬܐ.
+'editinginterface' => "'''Ü\99Ü\98Ü\97ܪÜ\90:''' Ü\90ܢܬ Ü¬Ü«Ü\9aܠܦ ܦܐܬܐ ܕܡܬܦܠܚܬ ܒܚܙܝܐ ܟܬܝܒܝܐ ܕܬܚܪܙܬܐ.
 ܟܠ ܫܘܚܠܦܐ ܒܦܐܬܐ ܗܕܐ ܢܗܘܐ ܠܗ ܡܥܒܕܢܘܬܐ ܥܠ ܐܣܟܡܐ ܕܦܐܬܐ ܕܡܦܠܚܢܐ ܕܡܦܠܚܢ̈ܐ ܐܚܪ̈ܢܐ ܒܘܝܩܝ ܗܢܐ.
 ܠܡܘܣܦ ܐܘ ܫܘܚܠܦ ܬܘܪ̈ܓܡܐ ܕܟܠܗܘܢ ܘܝܩܝ، ܐܦܠܚ [//translatewiki.net/ translatewiki.net]، ܬܪܡܝܬܐ ܕܬܘܪܓܡܐ ܕܡܝܕܝܐܘܝܩܝ.",
 'sqlhidden' => '(ܒܘܬܬܐ SQL ܛܫܝܐ)',
@@ -841,6 +841,7 @@ $1',
 
 # User rights log
 'rightslog' => 'ܣܓܠܐ ܕܙܕ̈ܩܐ ܕܡܦܠܚܢܐ',
+'rightslogtext' => 'ܗܢܘ ܣܓܠܐ ܕܫܘܚܠܦ̈ܐ ܕܙܕ̈ܩܐ ܕܡܦܠܚܢܐ.',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'ܩܪܝ ܦܐܬܐ ܗܕܐ',
@@ -1256,6 +1257,7 @@ $1',
 'actioncomplete' => 'ܥܡܠܝܬܐ ܓܡܪܬ',
 'actionfailed' => 'ܥܡܠܝܬܐ ܠܐ ܢܨܚܬ',
 'dellogpage' => 'ܣܓܠܐ ܕܫܝܦܐ',
+'dellogpagetext' => 'ܠܬܚܬ ܡܟܬܒܘܬܐ ܕܦܐܬܬ̈ܐ ܫܝܦܬ̈ܐ ܚܕ̈ܬܬܐ.',
 'deletionlog' => 'ܣܓܠܐ ܕܫܝܦܐ',
 'deletecomment' => 'ܥܠܬܐ:',
 'deleteotherreason' => 'ܥܠܬܐ ܐܚܪܬܐ/ܝܬܝܪܬܐ:',
index 308bf30..5c69c17 100644 (file)
@@ -1066,7 +1066,7 @@ $2
 'undo-success' => 'Рэдагаваньне можа быць адмененае. Калі ласка, параўнайце адрозьненьні паміж вэрсіямі, каб упэўніцца, што гэта адпаведныя зьмены, а потым запішыце зьмены для сканчэньня рэдагаваньня.',
 'undo-failure' => 'Рэдагаваньне ня можа быць скасаванае праз канфлікт паміж папярэднімі рэдагаваньнямі.',
 'undo-norev' => 'Рэдагаваньне ня можа быць адмененае, таму што яно не існуе альбо было выдаленае.',
-'undo-summary' => 'Скасаваньне праўкі $1 удзельніка [[Special:Contributions/$2|$2]] ([[User talk:$2|гутаркі]])',
+'undo-summary' => 'Скасаваньне праўкі $1 {{GENDER:$2|удзельніка|удзельніцы}} [[Special:Contributions/$2|$2]] ([[User talk:$2|гутаркі]])',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Немагчыма стварыць рахунак',
@@ -1322,7 +1322,7 @@ $1",
 'qbsettings-none' => 'Не паказваць',
 'qbsettings-fixedleft' => 'Замацаваная зьлева',
 'qbsettings-fixedright' => 'Замацаваная справа',
-'qbsettings-floatingleft' => 'РÑ\83Ñ\85омаÑ\8f зьлева',
+'qbsettings-floatingleft' => 'Ð\9fлавае зьлева',
 'qbsettings-floatingright' => 'Плавае справа',
 'qbsettings-directionality' => 'Замацаваная, у залежнасьці ад накірунку напісаньня ў Вашай мове',
 
@@ -1598,7 +1598,7 @@ $1",
 'action-userrights' => 'рэдагаваньне правоў усіх удзельнікаў',
 'action-userrights-interwiki' => 'рэдагаваньне правоў удзельнікаў у іншых вікі',
 'action-siteadmin' => 'блякаваньне і разблякаваньне базы зьвестак',
-'action-sendemail' => 'адпÑ\80аÑ\9eкÑ\83 Ñ\8dлекÑ\82Ñ\80оннÑ\8bÑ\85 Ð»Ñ\96Ñ\81Ñ\82оÑ\9e іншым удзельнікам',
+'action-sendemail' => 'адпÑ\80аÑ\9eлÑ\8fÑ\86Ñ\8c Ð»Ñ\96Ñ\81Ñ\82Ñ\8b іншым удзельнікам',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}',
@@ -1710,10 +1710,8 @@ $1",
 'largefileserver' => 'Памер гэтага файла перавышае максымальна дазволены.',
 'emptyfile' => 'Загружаны файл, здаецца, пусты. Магчыма гэты адбылося з-за памылкі ў назьве файла.
 Удакладніце, ці Вы сапраўды жадаеце загрузіць гэты файл.',
-'windows-nonascii-filename' => '{{SITENAME}} не падтрымлівае назвы файлаў з спэцыяльнымі сымбалямі.',
-'fileexists' => 'Файл з такой назвай ужо існуе.
-Калі ласка, праверце <strong>[[:$1]]</strong>, калі Вы ня ўпэўненыя, што жадаеце яго замяніць.
-[[$1|thumb]]',
+'windows-nonascii-filename' => 'Гэтая вікі не падтрымлівае назвы файлаў з спэцыяльнымі сымбалямі.',
+'fileexists' => 'Файл з такой назвай ужо існуе. Калі ласка, праверце <strong>[[:$1]]</strong>, калі Вы ня ўпэўненыя, што жадаеце яго замяніць. [[$1|thumb]]',
 'filepageexists' => 'Старонка апісаньня для гэтага файла ўжо існуе як <strong>[[:$1]]</strong>, але файла з такой назвай няма.
 Апісаньне якое Вы дадалі ня зьявіцца на старонцы апісаньня.
 Каб яно там зьявілася, Вам трэба рэдагаваць яе самастойна.
@@ -2100,9 +2098,9 @@ $1',
 'listusers-editsonly' => 'Паказаць толькі ўдзельнікаў, якія маюць рэдагаваньні',
 'listusers-creationsort' => 'Адсартаваць па даце стварэньня',
 'usereditcount' => '$1 {{PLURAL:$1|рэдагаваньне|рэдагаваньні|рэдагаваньняў}}',
-'usercreated' => '{{GENDER:$3|}}Створаны $1 у $2',
+'usercreated' => '{{GENDER:$3|Створаны|Створаная}} $1 у $2',
 'newpages' => 'Новыя старонкі',
-'newpages-username' => 'Імя ўдзельніка/ўдзельніцы:',
+'newpages-username' => 'Імя ўдзельніка:',
 'ancientpages' => 'Найстарэйшыя старонкі',
 'move' => 'Перанесьці',
 'movethispage' => 'Перанесьці гэтую старонку',
@@ -2250,7 +2248,7 @@ $1',
 'emailccsubject' => 'Копія Вашага ліста да $1: $2',
 'emailsent' => 'Ліст адасланы',
 'emailsenttext' => 'Ваш ліст быў адасланы.',
-'emailuserfooter' => 'Гэты ліст быў дасланы ўдзельнікам $1 да ўдзельніка $2 з дапамогай функцыі «Даслаць ліст» праекту {{SITENAME}}.',
+'emailuserfooter' => 'Гэты ліст быў дасланы ўдзельнікам $1 да {{GENDER:$2|ўдзельніка|ўдзельніцы}} $2 з дапамогай функцыі «Даслаць ліст» {{GRAMMAR:родны|{{SITENAME}}}}.',
 
 # User Messenger
 'usermessage-summary' => 'Паведамленьне пра выхад з сыстэмы.',
@@ -3904,7 +3902,7 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'sqlite-no-fts' => '$1 без падтрымкі поўнатэкстнага пошуку',
 
 # New logging system
-'logentry-delete-delete' => '$1 выдаліў старонку $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|выдаліў|выдаліла}} старонку $3',
 'logentry-delete-restore' => '$1 аднавіў старонку $3',
 'logentry-delete-event' => '$1 зьмяніў бачнасьць $5 {{PLURAL:$5|падзеі ў журнале|падзеяў у журнале|падзеяў у журнале}} на $3: $4',
 'logentry-delete-revision' => '$1 зьмяніў бачнасьць $5 {{PLURAL:$5|вэрсіі|вэрсіяў|вэрсіяў}} старонкі $3: $4',
@@ -3923,7 +3921,7 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'revdelete-uname-unhid' => 'імя ўдзельніка адкрытае',
 'revdelete-restricted' => 'ужыць абмежаваньні для адміністратараў',
 'revdelete-unrestricted' => 'зьнятыя абмежаваньні для адміністратараў',
-'logentry-move-move' => '$1 перанёс старонку $3 у $4',
+'logentry-move-move' => '$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4',
 'logentry-move-move-noredirect' => '$1 перанёс старонку $3 у $4 без пакінутага перанакіраваньня',
 'logentry-move-move_redir' => '$1 перанёс старонку $3 у $4 паўзьверх перанакіраваньня',
 'logentry-move-move_redir-noredirect' => '$1 перанёс старонку $3 у $4 паўзьверх перанакіраваньня без пакінутага перанакіраваньня',
index 71ce78c..7e76a2d 100644 (file)
@@ -667,7 +667,7 @@ $2',
 'gotaccount' => "Имате ли вече сметка? '''$1'''.",
 'gotaccountlink' => 'Влизане',
 'userlogin-resetlink' => 'Забравени данни за влизане в системата?',
-'createaccountmail' => 'с писмо по електронната поща',
+'createaccountmail' => 'Използване на временна парола, която се изпраща по електронната поща, посочена по-долу',
 'createaccountreason' => 'Причина:',
 'badretype' => 'Въведените пароли не съвпадат.',
 'userexists' => 'Въведеното потребителско име вече се използва.
@@ -915,8 +915,8 @@ $2
 'userinvalidcssjstitle' => "'''Внимание:''' Не съществува облик „$1“. Необходимо е да се знае, че имената на потребителските ви страници за CSS и Джаваскрипт трябва да се състоят от малки букви, например: „{{ns:user}}:Иван/vector.css“ (а не „{{ns:user}}:Иван/Vector.css“).",
 'updated' => '(обновена)',
 'note' => "'''Забележка:'''",
-'previewnote' => "'''Това е само предварителен преглед. Промените все още не са съхранени!'''",
-'continue-editing' => 'Ð\9fÑ\80одÑ\8aлжаване Ð½Ð° Ñ\80едакÑ\82иÑ\80анеÑ\82о',
+'previewnote' => "'''Ð\92ажно Ðµ Ð´Ð° Ñ\81е Ð¿Ð¾Ð¼Ð½Ð¸, Ñ\87е Ñ\82ова е само предварителен преглед. Промените все още не са съхранени!'''",
+'continue-editing' => 'Ð\9fÑ\80одÑ\8aлжаване ÐºÑ\8aм Ð¿Ð¾Ð»ÐµÑ\82о Ð·Ð° Ñ\80едакÑ\82иÑ\80ане',
 'previewconflict' => 'Този предварителен преглед отразява текста в горната текстова кутия така, както би се показал, ако съхраните.',
 'session_fail_preview' => "'''За съжаление редакцията ви не успя да бъде обработена поради загуба на данните за текущата сесия. Опитайте отново. Ако все още не работи, опитайте да [[Special:UserLogout|излезете]] и да влезете отново.'''",
 'session_fail_preview_html' => "'''За съжаление редакцията ви не беше записана поради изтичането на сесията ви.'''
@@ -2279,6 +2279,7 @@ $UNWATCHURL
 'prot_1movedto2' => '„[[$1]]“ преместена като „[[$2]]“',
 'protect-badnamespace-title' => 'Незащитимо именно пространство',
 'protect-badnamespace-text' => 'Страниците в това именно пространство не могат да бъдат защитени.',
+'protect-norestrictiontypes-title' => 'Незащитима страница',
 'protect-legend' => 'Потвърждение на защитата',
 'protectcomment' => 'Причина:',
 'protectexpiry' => 'Изтича на:',
@@ -2712,6 +2713,7 @@ $1',
 'thumbnail_error' => 'Грешка при създаване на миникартинка: $1',
 'djvu_page_error' => 'Номерът на DjVu-страницата е извън обхвата',
 'djvu_no_xml' => 'Не е възможно вземането на XML за DjVu-файла',
+'thumbnail-temp-create' => 'Временния файл с миникартинка не може да бъде създаден.',
 'thumbnail_invalid_params' => 'Параметрите за миникартинка са невалидни',
 'thumbnail_dest_directory' => 'Целевата директория не може да бъде създадена',
 'thumbnail_image-type' => 'Типът картинка не се поддържа',
@@ -2774,6 +2776,7 @@ $1',
 
 # JavaScriptTest
 'javascripttest-pagetext-noframework' => 'Тази страница е запазена за изпълнение на Джаваскрипт тестове.',
+'javascripttest-pagetext-skins' => 'Избор на облик за тестванията:',
 'javascripttest-qunit-intro' => 'Вижте [$1 тестовата документация] на mediawiki.org.',
 
 # Tooltip help for the actions
@@ -2885,8 +2888,10 @@ $1',
 'pageinfo-article-id' => 'Номер на страницата',
 'pageinfo-views' => 'Брой прегледи',
 'pageinfo-watchers' => 'Брой наблюдаващи страницата',
+'pageinfo-few-watchers' => 'Под $1 {{PLURAL:$1|наблюдаващ|наблюдаващи}}',
 'pageinfo-redirects-name' => 'Пренасочвания към тази страница',
 'pageinfo-subpages-name' => 'Подстраници на тази страница',
+'pageinfo-firsttime' => 'Дата на създаване на страницата',
 'pageinfo-lastuser' => 'Последeн редактор',
 'pageinfo-lasttime' => 'Дата на последнoто редактиране',
 'pageinfo-edits' => 'Общ брой редакции',
@@ -2895,6 +2900,9 @@ $1',
 'pageinfo-toolboxlink' => 'Информация за страницата',
 'pageinfo-contentpage-yes' => 'Да',
 'pageinfo-protect-cascading-yes' => 'Да',
+'pageinfo-category-pages' => 'Брой страници',
+'pageinfo-category-subcats' => 'Брой подкатегории',
+'pageinfo-category-files' => 'Брой файлове',
 
 # Skin names
 'skinname-standard' => 'Класика',
@@ -2958,6 +2966,8 @@ $1',
 'file-info-png-looped' => 'зациклен',
 'file-info-png-repeat' => 'изпълнено $1 {{PLURAL:$1|път|пъти}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|кадър|кадъра}}',
+'file-no-thumb-animation' => "'''Забележка: По технически причини миниатюрите на този файл няма да бъдат анимирани.'''",
+'file-no-thumb-animation-gif' => "'''Забележка: По технически причини миниатюрите на GIF файловете с висока резолюция като този няма да бъдат анимирани.'''",
 
 # Special:NewFiles
 'newimages' => 'Галерия на новите файлове',
@@ -3121,8 +3131,14 @@ $1',
 'exif-gpsdifferential' => 'Диференциална корекция на GPS',
 'exif-jpegfilecomment' => 'Kоментар на JPEG файл',
 'exif-keywords' => 'Ключови думи',
+'exif-worldregioncreated' => 'Регион на света, където е направена снимката',
+'exif-countrycreated' => 'Държава, в която е направена снимката',
+'exif-countrycodecreated' => 'Код на държавата, където е направена снимката',
+'exif-provinceorstatecreated' => 'Област или щат, където е направена снимката',
+'exif-citycreated' => 'Град, в който е направена снимката',
 'exif-objectname' => 'Кратко заглавие',
 'exif-specialinstructions' => 'Специални инструкции',
+'exif-source' => 'Източник',
 'exif-contact' => 'Информация за контакти',
 'exif-languagecode' => 'Език',
 'exif-iimversion' => 'IIM версия',
@@ -3659,7 +3675,10 @@ MediaWiki се разпространява с надеждата, че ще б
 'logentry-newusers-newusers' => 'Потребителската сметка $1 беше създадена',
 'logentry-newusers-create' => 'Потребителската сметка $1 беше създадена',
 'logentry-newusers-create2' => '$1 създаде потребителска сметка $3',
+'logentry-newusers-byemail' => '$1 създаде потребителската сметка $3, паролата беше изпратена по електронна поща',
 'logentry-newusers-autocreate' => 'Сметката $1 беше създадена автоматично',
+'logentry-rights-rights' => '$1 промени потребителската група на $3 от $4 на $5',
+'logentry-rights-rights-legacy' => '$1 промени потребителската група на $3',
 'logentry-rights-autopromote' => '
 $1 е автоматично повишен от $4 до $5',
 'rightsnone' => '(никакви)',
index 5f7d58d..2b2a528 100644 (file)
@@ -283,6 +283,7 @@ $1',
 'yourname' => 'प्रयोगकर्ता नाम',
 'yourpassword' => 'गुप्त शब्द',
 'yourpasswordagain' => 'गुप्त-शब्द पुन:डालीं:',
+'remembermypassword' => 'इ ब्राउजर पर हमार प्रवेश जारी रहे (अधिकतम $1 {{PLURAL:$1|दिन|दिन}})',
 'login' => 'खाता में प्रवेश',
 'nav-login-createaccount' => 'खाता प्रवेश / खाता बनाईं',
 'loginprompt' => '{{SITENAME}} में प्रवेश खातिर राउर कुकिज चालू होवे के चाहीं',
@@ -576,6 +577,7 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 
 # Special:AllPages
 'alphaindexline' => '$1 से $2',
+'allarticles' => 'सभी पन्ना',
 'allpagessubmit' => 'जाईं',
 'allpagesprefix' => 'उपसर्ग के साथे पन्ना प्रदर्शन:',
 
index 4a50a6f..0098433 100644 (file)
@@ -737,6 +737,7 @@ Ger-tremen da c'hortoz : $2",
 'changeemail-oldemail' => "Chomlec'h postel a-vremañ :",
 'changeemail-newemail' => "Chomlec'h postel nevez :",
 'changeemail-none' => '(hini ebet)',
+'changeemail-password' => 'Ho ker-tremen war {{SITENAME}}:',
 'changeemail-submit' => "Cheñch chomlec'h postel",
 'changeemail-cancel' => 'Nullañ',
 
@@ -973,10 +974,10 @@ A-gostez eo bet lezet an arventenn-se.',
 'converter-manual-rule-error' => 'Fazi dinodet  er reolenn cheñch yezh dre zorn',
 
 # "Undo" feature
-'undo-success' => "Gallout a reer disteurel ar c'hemmoù-mañ. Gwiriit, mar plij, gant ar geñveriadenn a-is evit bezañ sur eo an dra-se a fell deoc'h ober; goude-se enrollit ar c'hemmoù a-is a-benn echuiñ disteurel ar c'hemmoù.",
+'undo-success' => "Gallout a reer dizober ar c'hemmoù-mañ. Gwiriit, mar plij, gant ar geñveriadenn a-is evit bezañ sur eo an dra-se a fell deoc'h ober; goude-se enrollit ar c'hemmoù a-is a-benn echuiñ disteurel ar c'hemmoù.",
 'undo-failure' => "N'eus ket bet tu da zisteuler ar c'hemm-mañ abalamour d'un tabut gant kemmoù degaset e-keit-se.",
 'undo-norev' => "N'eus ket bet gallet degas ar c'hemmoù-mañ rak pe n'eus ket anezho pe int bet diverket.",
-'undo-summary' => 'Disteurel kemmoù $1 a-berzh [[Special:Contributions/$2|$2]] ([[User talk:$2|kaozeal]])',
+'undo-summary' => 'Dizober kemmoù $1 a-berzh [[Special:Contributions/$2|$2]] ([[User talk:$2|kaozeal]])',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Dibosupl krouiñ ar gont',
@@ -1707,6 +1708,7 @@ Ma talc'h ar gudenn, kit e darempred gant [[Special:ListUsers/sysop|merourien ar
 'backend-fail-notsame' => "Ur restr disheñvel zo e $1 c'hoazh.",
 'backend-fail-invalidpath' => "$1 n'eo ket un hent stokañ reizh.",
 'backend-fail-delete' => 'Dibosupl eo diverkañ ar restr $1.',
+'backend-fail-describe' => 'N\'eus ket bet gallet cheñch ar metaroadennoù evit ar restr "$1".',
 'backend-fail-alreadyexists' => 'Ar restr "$1" zo anezhi c\'hoazh.',
 'backend-fail-store' => 'Dibosupl stokañ ar restr $1 e $2.',
 'backend-fail-copy' => 'Dibosupl eilañ ar restr "$1" war-du "$2".',
@@ -2106,7 +2108,7 @@ Rekis eo dezho un domani a-us da nebeutañ evel, da skouer, "*.org".<br />
 # Special:ActiveUsers
 'activeusers' => 'Roll an implijerien oberiant',
 'activeusers-intro' => 'Setu aze ur roll eus an implijerien zo bet oberiant mui pe vui e-pad an $1 {{PLURAL:$1|deiz|deiz}} diwezhañ.',
-'activeusers-count' => '$1 {{PLURAL:$1|degasadenn}} abaoe an {{PLURAL:$3|deiz|$3 deiz}} diwezhañ',
+'activeusers-count' => '$1 {{PLURAL:$1|oberiadenn}} abaoe an {{PLURAL:$3|deiz|$3 deiz}} diwezhañ',
 'activeusers-from' => 'Diskouez an implijerien adal :',
 'activeusers-hidebots' => 'Kuzhat ar robotoù',
 'activeusers-hidesysops' => 'Kuzhat ar verourien',
@@ -2181,9 +2183,7 @@ E maezienn \"Kaser\" ho postel e vo merket ar chomlec'h postel resisaet ganeoc'h
 a-benn gellout kemmañ ho roll evezhiañ.",
 'addwatch' => "Ouzhpennañ d'ar roll evezhiañ",
 'addedwatchtext' => 'Ouzh ho [[Special:Watchlist|rollad evezhiañ]] eo bet ouzhpennet ar bajenn "[[:$1]]".
-Kemmoù da zont ar bajenn-mañ ha re ar bajenn gaozeal stag outi a vo rollet amañ hag e teuio ar bajenn <b>e tev</b> er [[Special:RecentChanges|roll kemmoù diwezhañ]] evit bezañ gwelet aesoc\'h ganeoc\'h.
-
-Evit tennañ ar bajenn-mañ a-ziwar ho rollad evezhiañ, klikit war "Paouez da evezhiañ" er framm merdeiñ.',
+Amañ e vo rollet ar c\'hemmoù da zont evit ar bajenn-mañ hag ar bajenn gaozeal stag outi.',
 'removewatch' => 'Lemel a-ziwar ar roll evezhiañ',
 'removedwatchtext' => 'Lamet eo bet ar bajenn "[[:$1]]" a-ziwar ho [[Special:Watchlist|roll evezhiañ]].',
 'watch' => 'Evezhiañ',
@@ -2284,8 +2284,8 @@ taolit evezh bras.",
 'rollback' => "disteuler ar c'hemmoù",
 'rollback_short' => 'Disteuler',
 'rollbacklink' => 'disteuler',
-'rollbacklinkcount' => 'terriñ $1 {{PLURAL:$1|kemm|kemmañ}}',
-'rollbacklinkcount-morethan' => 'terriñ ouzhpenn $1 {{PLURAL:$1|kemm|kemmoù}}',
+'rollbacklinkcount' => 'disteurel $1 {{PLURAL:$1|kemm}}',
+'rollbacklinkcount-morethan' => 'disteurel ouzhpenn $1 {{PLURAL:$1|kemm}}',
 'rollbackfailed' => "C'hwitet eo bet an distaoladenn",
 'cantrollback' => 'Dibosupl da zisteuler: an aozer diwezhañ eo an hini nemetañ da vezañ kemmet ar pennad-mañ',
 'alreadyrolled' => "Dibosupl eo disteuler ar c'hemm diwezhañ graet d'ar bajenn [[:$1]] gant [[User:$2|$2]] ([[User talk:$2|Kaozeal]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
@@ -2330,8 +2330,8 @@ Setu doare a-vremañ ar bajenn '''$1''' :",
 Setu an doare a-vremañ evit ar bajenn-mañ '''$1''':",
 'protect-cascadeon' => "Gwarezet eo ar bajenn-mañ peogwir he c'haver er {{PLURAL:$1|bajenn|pajennoù}} da-heul zo gweredekaet enno ar gwareziñ dre skalierad. Gallout a rit kemmañ al live gwareziñ met ne cheñcho ket ar gwareziñ dre skalierad.",
 'protect-default' => 'Aotren an holl implijerien',
-'protect-fallback' => 'Ezhomm zo aotre "$1"',
-'protect-level-autoconfirmed' => "Stankañ an implijerien nevez hag ar re n'int ket enrollet",
+'protect-fallback' => 'Degemer hepken an implijerien gant an aotre "$1"',
+'protect-level-autoconfirmed' => 'Degemer hepken an implijerien emgadarnaet',
 'protect-level-sysop' => 'Aotren ar verourien hepken',
 'protect-summary-cascade' => 'Gwareziñ dre skalierad',
 'protect-expiring' => "a zeu d'e dermen d'an $1",
@@ -2621,10 +2621,17 @@ Kadarnait, mar plij, eo se hoc'h eus c'hoant da ober.",
 # Move page
 'move-page' => "Dilec'hiañ $1",
 'move-page-legend' => 'Adenvel ur pennad',
-'movepagetext' => "Grit gant ar furmskrid a-is evit adenvel ur pennad hag adkas an holl stummoù kent anezhañ war-du an anv nevez.
-Dont a raio an titl kentañ da vezañ ur bajenn adkas war-du an titl nevez.
+'movepagetext' => "Grit gant ar furmskrid a-is evit adenvel ur pennad hag adkas an holl stummoù kent anezhañ war-zu an anv nevez.
+Dont a raio an titl kozh da vezañ ur bajenn adkas war-zu an titl nevez.
+Gallout a rit nevesaat ent emgefre an adkasoù a-vremañ a gas d'an titl orin.
 Ne vo ket kemmet liammoù an titl kozh ha ne vo ket dilec'hiet ar bajenn gaozeal, ma'z eus anezhi.
 
+Ma rit ho soñj chom hep en ober, gwiriit mat an holl [[Special:DoubleRedirects|adkasoù doubl]] pe [[Special:BrokenRedirects|adkasoù torret]].
+C'hwi eo zo karget da wiriañ e kas mat al liammoù d'al lec'h int sañset kas.
+
+Notit mat '''ne vo ket''' dilec'hiet ma'z eus dija ur bajenn ganti an anv nevez, nemet e vefe un adkas ha ne vefe tamm istor ebet stag outi.
+Dre se e c'haller adkas ur bajenn war-zu he lec'h orin ma oa kamm an adkas.
+
 '''DIWALLIT!'''
 Gallout a ra kement-se bezañ ur c'hemm bras ha dic'hortoz evit ur pennad a vez sellet outi alies;
 bezit sur e komprenit mat an heuliadoù a-raok kenderc'hel ganti.",
@@ -2984,6 +2991,7 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.",
 'pageinfo-redirectsto-info' => 'Titouroù',
 'pageinfo-contentpage-yes' => 'Ya',
 'pageinfo-protect-cascading-yes' => 'Ya',
+'pageinfo-category-info' => 'Titouroù ar rummad',
 'pageinfo-category-pages' => 'Niver a bajennoù',
 'pageinfo-category-subcats' => 'Niver a isrummadoù',
 'pageinfo-category-files' => 'Niver a restroù',
@@ -3072,7 +3080,10 @@ Ma vez erounezet ganeoc'h e c'hallje tagañ ho reizhiad.",
 'minutes' => '{{PLURAL:$1|$1 vunutenn|$1 munutenn}}',
 'hours' => '{{PLURAL:$1|$1 eurvezh|$1 eurvezh}}',
 'days' => '{{PLURAL:$1|$1 deiz|$1 deiz}}',
+'months' => '{{PLURAL: $1|$1 miz|$1 miz}}',
+'years' => '{{PLURAL: $1|$1 bloaz|$1 bloaz}}',
 'ago' => '$1 zo',
+'just-now' => 'bremañ diouzhtu',
 
 # Bad image list
 'bad_image_list' => "Setu doare ar furmad :
@@ -3568,6 +3579,7 @@ Mont a raio ar c'hod-mañ d'e dermen d'ar \$4.",
 # Scary transclusion
 'scarytranscludedisabled' => '[Diweredekaet eo an treuzkludañ etrewiki]',
 'scarytranscludefailed' => "[N'eus ket bet gallet tapout ar patrom evit $1]",
+'scarytranscludefailed-httpstatus' => "[c'hwitet adtapout ar patrom evit $1: HTTP $2]",
 'scarytranscludetoolong' => '[URL re hir]',
 
 # Delete conflict
index 5b20968..b41c354 100644 (file)
@@ -671,6 +671,7 @@ $2',
 'ns-specialprotected' => 'Specijalne stranice se ne mogu uređivati.',
 'titleprotected' => 'Naslov stranice je zaštićen od postavljanja od strane korisnika [[User:$1|$1]].
 Iz razloga "\'\'$2\'\'".',
+'invalidtitle-knownnamespace' => 'Neispravan naslov s imenskim prostorom "$2" i tekstom "$3"',
 'exception-nologin' => 'Niste prijavljeni',
 'exception-nologin-text' => 'Ova stranica ili aktivnost zahtijeva da budete prijavljeni na ovom wikiju.',
 
@@ -1825,10 +1826,22 @@ Ako se problem ne riješi, kontaktirajte [[Special:ListUsers/sysop|administrator
 'backend-fail-store' => 'Ne može se spremiti datoteka $1 na $2.',
 'backend-fail-copy' => 'Nije uspjelo kopiranje datoteke "$1" u "$2".',
 'backend-fail-move' => 'Nije uspjelo premještanje datoteke "$1" u "$2".',
+'backend-fail-opentemp' => 'Ne mogu otvoriti privremenu datoteku.',
+'backend-fail-writetemp' => 'Ne mogu pisati u privremenu datoteku.',
+'backend-fail-closetemp' => 'Ne mogu zatvoriti privremenu datoteku.',
 'backend-fail-read' => 'Ne mogu čitati datoteku $1.',
 'backend-fail-create' => 'Ne mogu napraviti datoteku $1.',
+'backend-fail-contenttype' => 'Ne mogu da utvrdim kakav sadržaj ima datoteka koju treba da smjestim u "$1".',
 
 # Lock manager
+'lockmanager-notlocked' => 'Ne mogu otključati "$1"; nije zaključan.',
+'lockmanager-fail-closelock' => 'Ne mogu zatvoriti "lock"-datoteku za "$1".',
+'lockmanager-fail-deletelock' => 'Ne mogu obrisati "lock"-datoteku za "$1".',
+'lockmanager-fail-acquirelock' => 'Ne mogu dobiti "lock"-datoteku za "$1".',
+'lockmanager-fail-openlock' => 'Ne mogu otvoriti "lock"-datoteku za "$1".',
+'lockmanager-fail-releaselock' => 'Ne mogu osloboditi katanac za „$1“.',
+'lockmanager-fail-db-bucket' => 'Ne mogu da kontaktiram s dovoljno "lock"-baza u kanti $1.',
+'lockmanager-fail-db-release' => 'Ne mogu osloboditi katance u bazi $1.',
 'lockmanager-fail-svr-release' => 'Ne mogu se otključati katanci na serveru file $1.',
 
 # ZipDirectoryReader
@@ -1847,6 +1860,7 @@ Ne može se dobro provjeriti u vezi sigurnosti.',
 'uploadstash-badtoken' => 'Izvršavanje ove akcije je bilo neuspješno, možda zato što su vaša uređivačka odobrenja istekla. Pokušajte ponovo.',
 'uploadstash-errclear' => 'Brisanje sakrivenih datoteka je bilo neuspješno.',
 'uploadstash-refresh' => 'Osvježi spisak datoteka',
+'invalid-chunk-offset' => 'Neispravna polazna tačka',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Pristup onemogućen',
@@ -2071,6 +2085,8 @@ Svaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju tekst
 'wantedpages' => 'Tražene stranice',
 'wantedpages-badtitle' => 'Nevaljan naslov u setu rezultata: $1',
 'wantedfiles' => 'Tražene datoteke',
+'wantedfiletext-cat' => 'Sljedeće datoteke se koriste, ali ne postoje. Datoteke iz drugih baza mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbrisane</del> sa spiska. Pored toga, stranice koje sadrže nepostojeće datoteke se nalaze u [[:$1]].',
+'wantedfiletext-nocat' => 'Sljedeće datoteke se koriste, ali ne postoje. Datoteke iz drugih baza mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbrisane</del> sa spiska.',
 'wantedtemplates' => 'Potrebni šabloni',
 'mostlinked' => 'Članci sa najviše linkova',
 'mostlinkedcategories' => 'Kategorije sa najviše linkova',
@@ -2399,6 +2415,8 @@ Pogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za pregled tr
 'protect-title' => 'Zaštićuje se "$1"',
 'protect-title-notallowed' => 'Pregled stepena zaštite za "$1"',
 'prot_1movedto2' => 'članak [[$1]] premješten na [[$2]]',
+'protect-badnamespace-title' => 'Nezaštitljiv imenski prostor',
+'protect-badnamespace-text' => 'Stranice u ovom imenskom prostoru se ne mogu zaštititi.',
 'protect-legend' => 'Potvrdite zaštitu',
 'protectcomment' => 'Razlog:',
 'protectexpiry' => 'Ističe:',
@@ -2619,6 +2637,7 @@ ili korisničkom imenu.',
 'blocklist-userblocks' => 'Sakrij blokade računa',
 'blocklist-tempblocks' => 'Sakrij privremene blokade',
 'blocklist-addressblocks' => 'Sakrij pojedinačne IP blokade',
+'blocklist-rangeblocks' => 'Sakrij blokiranja opsega',
 'blocklist-timestamp' => 'Vremenska oznaka',
 'blocklist-target' => 'Cilj',
 'blocklist-expiry' => 'Ističe',
@@ -2852,6 +2871,7 @@ Molimo posjetite [//www.mediawiki.org/wiki/Localisation MediaWiki lokalizaciju]
 'djvu_page_error' => 'DjVu stranica je van opsega',
 'djvu_no_xml' => 'Za XML-datoteku se ne može pozvati DjVu datoteka',
 'thumbnail-temp-create' => 'Ne mogu da napravim privremenu smanjenu sliku',
+'thumbnail-dest-create' => 'Ne mogu da sačuvam smanjenu sliku ("thumbnail") na destinaciju',
 'thumbnail_invalid_params' => 'Pogrešne postavke smanjenog prikaza',
 'thumbnail_dest_directory' => 'Ne može se napraviti odredišni folder',
 'thumbnail_image-type' => 'Tip slike nije podržan',
@@ -2899,6 +2919,11 @@ Nedostaje privremeni folder.',
 'import-upload' => 'Postavljanje XML podataka',
 'import-token-mismatch' => 'Izgubljeni podaci sesije. Molimo pokušajte ponovno.',
 'import-invalid-interwiki' => 'Ne može se uvesti iz navedenog wikija.',
+'import-error-edit' => 'Stranica "$1" nije uvezena jer vam nije dopušteno da je uređujete.',
+'import-error-create' => 'Stranica "$1" nije uvezena jer vam nije dozvoljeno da je napravite.',
+'import-error-interwiki' => 'Stranica "$1" nije uvezena jer je njen naziv rezerviran za vanjsko povezivanje (interwiki).',
+'import-error-special' => 'Stranica "$1" nije uvezena jer pripada posebnom imenskom prostoru koje ne prihvata stranice.',
+'import-error-invalid' => 'Stranica "$1" nije uvezena jer je njen naziv neispravan.',
 'import-options-wrong' => '{{PLURAL:$2|Pogrešna opcija|Pogrešne opcije}}: <nowiki>$1</nowiki>',
 
 # Import log
@@ -3049,7 +3074,7 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.',
 'pageinfo-article-id' => 'ID stranice',
 'pageinfo-language' => 'Jezik sadržaja stranice',
 'pageinfo-views' => 'Broj pogleda',
-'pageinfo-watchers' => 'Broj onih koji pregledaju',
+'pageinfo-watchers' => 'Broj pratitelja stranice',
 'pageinfo-redirects-name' => 'Preusmjeravanja na ovu stranicu',
 'pageinfo-subpages-name' => 'Podstranice ove stranice',
 'pageinfo-firstuser' => 'Korisnik koji je napravio stranicu',
@@ -3863,7 +3888,7 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'specialpages-group-highuse' => 'Najčešće korištene stranice',
 'specialpages-group-pages' => 'Spiskovi stranica',
 'specialpages-group-pagetools' => 'Alati stranice',
-'specialpages-group-wiki' => 'Wiki podaci i alati',
+'specialpages-group-wiki' => 'Podaci i alati',
 'specialpages-group-redirects' => 'Preusmjeravanje posebnih stranica',
 'specialpages-group-spam' => 'Alati za spam',
 
index 36a1df5..44f7c31 100644 (file)
@@ -1373,15 +1373,15 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'userrights-lookup-user' => "Gestiona els grups d'usuari",
 'userrights-user-editname' => "Introduïu un nom d'usuari:",
 'editusergroup' => "Edita els grups d'usuaris",
-'editinguser' => "S'està canviant els permisos de l'usuari '''[[User:$1|$1]]''' $2",
+'editinguser' => "Modificació dels permisos de {{GENDER:$1|l’usuari|la usuària}} '''[[User:$1|$1]]''' $2",
 'userrights-editusergroup' => "Edita els grups d'usuaris",
 'saveusergroups' => "Desa els grups d'usuari",
 'userrights-groupsmember' => 'Membre de:',
 'userrights-groupsmember-auto' => 'Membre implícit de:',
-'userrights-groups-help' => "Podeu modificar els grups als quals pertany aquest usuari.
-* Els requadres marcats indiquen que l'usuari és dins del grup.
-* Els requadres sense marcar indiquen que l'usuari no hi pertany.
-* Un asterisc (*) indica que no el podreu treure del grup una vegada l'hàgiu afegit o viceversa.",
+'userrights-groups-help' => "Podeu modificar els grups als quals pertany {{GENDER:$1|aquest usuari|aquesta usuària}}.
+* Una casella marcada significa que {{GENDER:$1|l’usuari|la usuària}} pertany a aquest grup.
+* Una casella no marcada significa que {{GENDER:$1|l’usuari|la usuària}} no pertany a aquest grup.
+* Un asterisc (*) indica que no {{GENDER:$1|el|la}} podreu treure del grup una vegada l'hàgiu afegit o viceversa.",
 'userrights-reason' => 'Motiu:',
 'userrights-no-interwiki' => "No teniu permisos per a editar els permisos d'usuari d'altres wikis.",
 'userrights-nodatabase' => 'La base de dades $1 no existeix o no és local.',
@@ -2132,7 +2132,7 @@ i tenir una direcció electrònica vàlida en les vostres [[Special:Preferences|
 per enviar un correu electrònic a altres usuaris.",
 'emailuser' => 'Envia un missatge de correu electrònic a aquest usuari',
 'emailuser-title-target' => 'Enviar un correu electrònic a {{GENDER:$1|aquest usuari|aquesta usuària}}',
-'emailuser-title-notarget' => "Enviar un correu electrònic a l'usuari",
+'emailuser-title-notarget' => 'Enviar un correu electrònic a un usuari',
 'emailpage' => 'Correu electrònic a usuari',
 'emailpagetext' => "Podeu usar el següent formulari per a enviar un missatge de correu electrònic a {{GENDER:$1|aquest usuari|aquesta usuària}}.
 L'adreça electrònica que vau indicar a [[Special:Preferences|les vostres preferències d'usuari]] apareixerà com a remitent del correu electrònic, de manera que el destinatari us podrà respondre directament.",
@@ -2500,8 +2500,8 @@ quines pàgines en concret estan sent vandalitzades).",
 ** Abús de comptes d'usuari múltiples
 ** Nom d'usuari no acceptable",
 'ipb-hardblock' => "Impedeix que els usuaris registrats puguin editar des d'aquesta adreça IP",
-'ipbcreateaccount' => 'Evita la creació de comptes',
-'ipbemailban' => "Evita que l'usuari enviï correu electrònic",
+'ipbcreateaccount' => 'Impedeix la creació de comptes',
+'ipbemailban' => "Impedeix que l'usuari enviï correus electrònics",
 'ipbenableautoblock' => "Bloca l'adreça IP d'aquest usuari, i totes les subseqüents adreces des de les quals intenti registrar-se",
 'ipbsubmit' => 'Bloqueja aquesta adreça',
 'ipbother' => 'Un altre termini',
@@ -2772,7 +2772,7 @@ En el darrer cas, podeu fer servir un enllaç com ara [[{{#Special:Export}}/{{Me
 'thumbnail_image-missing' => 'Sembla que falta el fitxer: $1',
 
 # Special:Import
-'import' => 'Importa les pàgines',
+'import' => 'Importació de pàgines',
 'importinterwiki' => 'Importa interwiki',
 'import-interwiki-text' => "Trieu un web basat en wiki i un títol de pàgina per a importar.
 Es conservaran les dates de les versions i els noms dels editors.
@@ -2796,7 +2796,7 @@ Deseu-lo al vostre ordinador i carregueu-ne una còpia ací.",
 'importcantopen' => "No ha estat possible d'obrir el fitxer a importar",
 'importbadinterwiki' => "Enllaç d'interwiki incorrecte",
 'importnotext' => 'Buit o sense text',
-'importsuccess' => "S'ha acabat d'importar.",
+'importsuccess' => 'Importació completada!',
 'importhistoryconflict' => "Hi ha un conflicte de versions en l'historial (la pàgina podria haver sigut importada abans)",
 'importnosources' => "No s'ha definit cap font d'origen interwiki i s'ha inhabilitat la càrrega directa d'una còpia de l'historial",
 'importnofile' => "No s'ha pujat cap fitxer d'importació.",
@@ -2883,7 +2883,7 @@ Deseu-lo al vostre ordinador i carregueu-ne una còpia ací.",
 'tooltip-t-print' => "Versió per a impressió d'aquesta pàgina",
 'tooltip-t-permalink' => 'Enllaç permanent a aquesta versió de la pàgina',
 'tooltip-ca-nstab-main' => 'Vegeu el contingut de la pàgina.',
-'tooltip-ca-nstab-user' => "Vegeu la pàgina de l'usuari.",
+'tooltip-ca-nstab-user' => "Vegeu la pàgina d'usuari",
 'tooltip-ca-nstab-media' => "Vegeu la pàgina de l'element multimèdia",
 'tooltip-ca-nstab-special' => 'Aquesta és una pàgina especial, no podeu modificar-la',
 'tooltip-ca-nstab-project' => 'Vegeu la pàgina del projecte',
index 2fcb072..654bd05 100644 (file)
@@ -1501,7 +1501,7 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'columns' => 'Spalten:',
 'searchresultshead' => 'Suche',
 'resultsperpage' => 'Treffer pro Seite:',
-'stub-threshold' => 'Linkformatierung <a href="#" class="stub">kleiner Seiten</a> (in Byte):',
+'stub-threshold' => 'Linkformatierung <a href="#" class="stub">kleiner Seiten</a> (in Bytes):',
 'stub-threshold-disabled' => 'Deaktiviert',
 'recentchangesdays' => 'Anzahl der standardmäßig einbezogenen Tage:',
 'recentchangesdays-max' => 'Maximal $1 {{PLURAL:$1|Tag|Tage}}',
@@ -1771,7 +1771,7 @@ Stand: $4, $5 Uhr.",
 'rc_categories' => 'Nur Seiten aus den Kategorien (getrennt mit „|“):',
 'rc_categories_any' => 'Alle',
 'rc-change-size' => '$1 {{PLURAL:$1|Byte|Bytes}}',
-'rc-change-size-new' => '$1 {{PLURAL:$1|Byte|Byte}} nach der Änderung',
+'rc-change-size-new' => '$1 {{PLURAL:$1|Byte|Bytes}} nach der Änderung',
 'newsectionsummary' => 'Neuer Abschnitt /* $1 */',
 'rc-enhanced-expand' => 'Details anzeigen (benötigt JavaScript)',
 'rc-enhanced-hide' => 'Details verstecken',
@@ -1825,7 +1825,7 @@ Um ein '''Bild''' in einer Seite zu verwenden, nutze einen Link in der folgenden
 'ignorewarnings' => 'Warnungen ignorieren',
 'minlength1' => 'Dateinamen müssen mindestens einen Buchstaben lang sein.',
 'illegalfilename' => 'Der Dateiname „$1“ enthält mindestens ein nicht erlaubtes Zeichen. Bitte benenne die Datei um und versuche, sie erneut hochzuladen.',
-'filename-toolong' => 'Dateinamen dürfen nicht größer als 240 Byte sein.',
+'filename-toolong' => 'Dateinamen dürfen nicht größer als 240 Bytes sein.',
 'badfilename' => 'Der Dateiname wurde in „$1“ geändert.',
 'filetype-mime-mismatch' => 'Dateierweiterung „.$1“ stimmt nicht mit dem MIME-Typ ($2) überein.',
 'filetype-badmime' => 'Dateien mit dem MIME-Typ „$1“ dürfen nicht hochgeladen werden.',
@@ -1951,7 +1951,7 @@ Wenn das Problem weiter besteht, informiere einen [[Special:ListUsers/sysop|Syst
 'backend-fail-closetemp' => 'Die temporäre Datei konnte nicht geschlossen werden.',
 'backend-fail-read' => 'Die Datei $1 konnte nicht gelesen werden.',
 'backend-fail-create' => 'Die Datei $1 konnte nicht gespeichert werden.',
-'backend-fail-maxsize' => 'Die Datei $1 konnte nicht gespeichert werden, da sie größer als {{PLURAL:$2|ein Byte|$2 Byte}} ist.',
+'backend-fail-maxsize' => 'Die Datei $1 konnte nicht gespeichert werden, da sie größer als {{PLURAL:$2|ein Byte|$2 Bytes}} ist.',
 'backend-fail-readonly' => 'Das Speicher-Backend „$1“ befindet sich derzeit im Lesemodus. Der angegebene Grund lautet: „$2“',
 'backend-fail-synced' => 'Die Datei „$1“ befindet sich, innerhalb des internen Speicher-Backends, in einem inkonsistenten Zustand.',
 'backend-fail-connect' => 'Es konnte keine Verbindung zum Speicher-Backend „$1“ hergestellt werden.',
@@ -3195,8 +3195,8 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
 'pageinfo-header-restrictions' => 'Seitenschutz',
 'pageinfo-header-properties' => 'Seiteneigenschaften',
 'pageinfo-display-title' => 'Anzeigetitel',
-'pageinfo-default-sort' => 'Standardsortierkriterium',
-'pageinfo-length' => 'Seitenlänge (in Byte)',
+'pageinfo-default-sort' => 'Standard-Sortierschlüssel',
+'pageinfo-length' => 'Seitenlänge (in Bytes)',
 'pageinfo-article-id' => 'Seitenkennnummer',
 'pageinfo-language' => 'Seiteninhaltssprache',
 'pageinfo-robot-policy' => 'Suchmaschinenstatus',
index bec8ca6..95c7b88 100644 (file)
@@ -3220,6 +3220,8 @@ Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
 'minutes' => 'verdê {{PLURAL:$1|$1 daka|$1 daka}}',
 'hours' => 'Verdê {{PLURAL:$1|$1 seata|$1 seata}}',
 'days' => 'Verdê {{PLURAL:$1|$1 rocan|$1 rocan}}',
+'months' => '{{PLURAL:$1|aşmi|$1 aşman}}',
+'years' => '{{PLURAL:$1|$1 ser|$1 seran}}',
 'ago' => 'Verdê $1',
 'just-now' => 'Hema newke',
 
index d3f1327..a9fdf35 100644 (file)
@@ -429,6 +429,7 @@ $specialPageAliases = array(
        'Myuploads'                 => array( 'MyUploads' ),
        'Newimages'                 => array( 'NewFiles', 'NewImages' ),
        'Newpages'                  => array( 'NewPages' ),
+       'PagesWithProp'             => array( 'PagesWithProp', 'Pageswithprop', 'PagesByProp', 'Pagesbyprop' ),
        'PasswordReset'             => array( 'PasswordReset' ),
        'PermanentLink'             => array( 'PermanentLink', 'PermaLink' ),
        'Popularpages'              => array( 'PopularPages' ),
@@ -2565,6 +2566,13 @@ Remember to check for other links to the templates before deleting them.',
 They may have to link to a more appropriate page instead.<br />
 A page is treated as a disambiguation page if it uses a template that is linked from [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop'         => 'Pages with a page property',
+'pageswithprop-summary' => '', # do not translate or duplicate this message to other languages
+'pageswithprop-legend'  => 'Pages with a page property',
+'pageswithprop-text'    => 'This page lists pages that use a particular page property.',
+'pageswithprop-prop'    => 'Property name:',
+'pageswithprop-submit'  => 'Go',
+
 'doubleredirects'                   => 'Double redirects',
 'doubleredirects-summary'           => '', # do not translate or duplicate this message to other languages
 'doubleredirectstext'               => 'This page lists pages that redirect to other redirect pages.
index 4e6b235..42bd97b 100644 (file)
@@ -2341,7 +2341,7 @@ Puede haber información adicional sobre privilegios individuales en [[{{MediaWi
 'emailuser' => 'Enviar un correo electrónico a {{GENDER:{{BASEPAGENAME}}|este usuario|esta usuaria}}',
 'emailuser-title-target' => 'Enviar un correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}',
 'emailuser-title-notarget' => 'Enviar un correo electrónico al usuario',
-'emailpage' => 'Correo electrónico a usuario',
+'emailpage' => 'Enviar un correo electrónico a un usuario',
 'emailpagetext' => 'Puedes usar el formulario de abajo para enviar un correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}.
 La dirección de correo electrónico que indicaste en [[Special:Preferences|tus preferencias de usuario]] aparecerá en el campo "Remitente" o "De" para que el destinatario pueda responderte.',
 'usermailererror' => 'El sistema de correo devolvió un error:',
@@ -2797,7 +2797,7 @@ Sin embargo, está bloqueada como parte del rango $2, que puede ser desbloqueado
 'proxyblocksuccess' => 'Hecho.',
 'sorbsreason' => 'Su dirección IP está listada como proxy abierto en DNSBL.',
 'sorbs_create_account_reason' => 'Su dirección IP está listada como proxy abierto en DNSBL. No puede crear una cuenta',
-'cant-block-while-blocked' => 'No puedes bloquear a otros usuarios mientras estás bloqueado.',
+'cant-block-while-blocked' => 'No puedes bloquear a otros usuarios mientras estás bloquead{{GENDER:|o|a}}.',
 'cant-see-hidden-user' => 'El usuario que está intentando bloquear ya ha sido bloqueado y oculto. Puesto que usted no tiene el derecho hideuser, usted no puede ver o editar los bloqueos del usuario.',
 'ipbblocked' => 'No puedes bloquear o desbloquear a otros usuarios porque estás bloqueado',
 'ipbnounblockself' => 'No puedes desbloquearte',
index 07e256c..d914a18 100644 (file)
@@ -425,7 +425,7 @@ $messages = array(
 'moredotdotdot' => 'Veel...',
 'mypage' => 'Minu lehekülg',
 'mytalk' => 'Arutelu',
-'anontalk' => 'Arutelu selle IP jaoks',
+'anontalk' => 'Selle IP-aadressi artuelu',
 'navigation' => 'Navigeerimine',
 'and' => '&#32;ja',
 
@@ -701,7 +701,7 @@ Võid jätkata {{GRAMMAR:genitive|{{SITENAME}}}} kasutamist anonüümselt, aga k
 Pane tähele, et seni kuni sa pole oma võrgulehitseja puhvrit tühjendanud, võidakse mõni lehekülg endiselt nii kuvada nagu oleksid ikka sisse logitud.",
 'welcomeuser' => 'Tere tulemast, $1!',
 'welcomecreation-msg' => 'Sinu konto on loodud.
-Ära unusta seada oma {{GRAMMAR:genitive|{{SITENAME}}}} [[Eri:Eelistused|eelistusi]].',
+Ära unusta seada oma {{GRAMMAR:genitive|{{SITENAME}}}} [[Special:Preferences|eelistusi]].',
 'yourname' => 'Kasutajanimi:',
 'yourpassword' => 'Parool:',
 'yourpasswordagain' => 'Sisesta parool uuesti:',
@@ -744,7 +744,7 @@ Kontrollige kirjapilti või [[Special:UserLogin/signup|looge uus kasutajakonto]]
 'nosuchusershort' => 'Kasutajat nimega "$1" ei ole olemas. Kontrollige kirjapilti.',
 'nouserspecified' => 'Kasutajanimi puudub.',
 'login-userblocked' => 'See kasutaja on blokeeritud. Sisselogimine pole lubatud.',
-'wrongpassword' => 'Vale parool. Proovige uuesti.',
+'wrongpassword' => 'Vale parool. Proovi uuesti.',
 'wrongpasswordempty' => 'Parool jäi sisestamata. Palun proovi uuesti.',
 'passwordtooshort' => 'Parool peab koosnema vähemalt {{PLURAL:$1|ühest|$1}} tähemärgist.',
 'password-name-match' => 'Parool peab kasutajanimest erinema.',
@@ -1699,7 +1699,7 @@ Faili lisamiseks artiklile kasuta linki ühel kujul järgnevatest.
 'ignorewarning' => 'Ignoreeri hoiatust ja salvesta fail hoiatusest hoolimata',
 'ignorewarnings' => 'Ignoreeri hoiatusi',
 'minlength1' => 'Faili nimes peab olema vähemalt üks kirjamärk.',
-'illegalfilename' => 'Faili "$1" nimi sisaldab sümboleid, mis pole pealkirjades lubatud. Palun nimetage fail ümber ja proovige uuesti.',
+'illegalfilename' => 'Failinimi "$1" sisaldab märke, mis pole pealkirjades lubatud. Palun nimeta fail ümber ja proovi uuesti.',
 'filename-toolong' => 'Failinimed ei või olla pikemad kui 240 baiti.',
 'badfilename' => 'Pildi nimi on muudetud. Uus nimi on "$1".',
 'filetype-mime-mismatch' => 'Faililaiend ".$1" ei vasta faili ($2) MIME tüübile.',
index f24a0d9..e7fbd65 100644 (file)
@@ -2208,7 +2208,7 @@ Blokeo erregistroa azken sarrera ematen da azpian erreferentziarako:',
 # What links here
 'whatlinkshere' => 'Honanzko lotura duten orriak',
 'whatlinkshere-title' => '$1(e)ra lotura duten orriak',
-'whatlinkshere-page' => 'Orrialdea:',
+'whatlinkshere-page' => 'Orria:',
 'linkshere' => "Hauek dute '''[[:$1]]''' orrialderako lotura:",
 'nolinkshere' => "Ez dago '''[[:$1]]''' lotura duen orrialderik.",
 'nolinkshere-ns' => "Hautatutako izen-tartean ez dago '''[[:$1]]''' orrialderako lotura duenik.",
index f34b8f2..040dc1c 100644 (file)
@@ -495,7 +495,7 @@ $1',
 'helppage' => 'Help:Axuda',
 'mainpage' => 'Portada',
 'mainpage-description' => 'Portada',
-'policy-url' => 'Project:Política e normas',
+'policy-url' => 'Project:Políticas e normas',
 'portal' => 'Portal da comunidade',
 'portal-url' => 'Project:Portal da comunidade',
 'privacy' => 'Política de protección de datos',
index 8b9cef2..c8b66e6 100644 (file)
@@ -420,7 +420,7 @@ $1',
 'newmessagesdifflink' => 'poslednja změna',
 'youhavenewmessagesfromusers' => 'Maš $1 wot {{PLURAL:$3|druheho wužiwarja|$3 wužiwarjow|$3 wužiwarjow|$3 wužiwarjow}} ($2).',
 'youhavenewmessagesmanyusers' => 'Maš $1 wot wjele wužiwarjow ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|nowa powěsć|nowej powěsći|nowe powěsće|nowe powěsće}}',
+'newmessageslinkplural' => '{{PLURAL:$1|nowu powěsć|nowej powěsći|nowe powěsće}}',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|poslednja změna|poslednjej změnje|poslednje změny|poslednje změny}}',
 'youhavenewmessagesmulti' => 'Maš nowe powěsće: $1',
 'editsection' => 'wobdźěłać',
index c07fa9a..fdb1293 100644 (file)
@@ -446,6 +446,7 @@ $messages = array(
 'newwindow' => '(új ablakban nyílik meg)',
 'cancel' => 'Mégse',
 'moredotdotdot' => 'Tovább…',
+'morenotlisted' => 'Tovább…',
 'mypage' => 'Lapom',
 'mytalk' => 'Vitalap',
 'anontalk' => 'Az IP-címhez tartozó vitalap',
@@ -744,7 +745,7 @@ Ne felejtsd el módosítani a [[Special:Preferences|{{SITENAME}} beállításaid
 'gotaccount' => "Ha már korábban regisztráltál, '''$1'''!",
 'gotaccountlink' => 'Bejelentkezés',
 'userlogin-resetlink' => 'Elfelejtetted a bejelentkezési adataidat?',
-'createaccountmail' => 'e-mailben',
+'createaccountmail' => 'Átmeneti, véletlenszerű jelszó használata és kiküldése az alábbi e-mail címre',
 'createaccountreason' => 'Indoklás:',
 'badretype' => 'A megadott jelszavak nem egyeznek.',
 'userexists' => 'A megadott felhasználónév már foglalt.
@@ -817,6 +818,7 @@ Várj egy kicsit, mielőtt újra próbálkozol.',
 # E-mail sending
 'php-mail-error-unknown' => 'Ismeretlen hiba a PHP mail() függvényében',
 'user-mail-no-addy' => 'E-mail üzenetet próbáltál küldeni e-mail cím megadása nélkül.',
+'user-mail-no-body' => 'Üres vagy nagyon rövid email-t próbáltál küldeni.',
 
 # Change password dialog
 'resetpass' => 'Jelszó módosítása',
@@ -1035,8 +1037,8 @@ Azt is megígéred, hogy ezt magadtól írtad, vagy egy közkincsből vagy más
 '''NE KÜLDJ BE JOGVÉDETT MUNKÁT ENGEDÉLY NÉLKÜL!'''",
 'longpageerror' => "'''HIBA: Az általad beküldött szöveg {{PLURAL:$1|egy kilobájt|$1 kilobájt}} hosszú, ami több az engedélyezett {{PLURAL:$2|egy kilobájtnál|$2 kilobájtnál}}.
 A szerkesztést nem lehet elmenteni.'''",
-'readonlywarning' => "'''FIGYELMEZTETÉS: A wiki adatbázisát karbantartás miatt zárolták, ezért most nem fogod tudni elmenteni a szerkesztéseidet.
-A lap szöveget kimásolhatod egy szövegfájlba, amit elmenthetsz későbbre.'''
+'readonlywarning' => "FIGYELMEZTETÉS: A wiki adatbázisát karbantartás miatt zárolták, ezért most nem fogod tudni elmenteni a szerkesztéseidet!
+A lap szövegét másold egy szövegfájlba, amit később felhasználhatsz!'''
 
 Az adatbázist lezáró adminisztrátor az alábbi magyarázatot adta: $1",
 'protectedpagewarning' => "'''Figyelem: Ez a lap le van védve, így csak adminisztrátori jogosultságokkal rendelkező szerkesztők módosíthatják.'''
@@ -2230,7 +2232,7 @@ Támogatott {{PLURAL:$2|protokoll|protokollok}}: <code>$1</code> (http:// az ala
 # Special:ActiveUsers
 'activeusers' => 'Aktív szerkesztők listája',
 'activeusers-intro' => 'Ez a lap azon felhasználók listáját tartalmazza, akik csináltak valamilyen tevékenységet az elmúlt {{PLURAL:$1|egy|$1}} napban.',
-'activeusers-count' => '{{PLURAL:$1|egy|$1}} szerkesztés az utolsó {{PLURAL:$3|egy|$3}} napban',
+'activeusers-count' => '$1 szerkesztés az utolsó $3 napban',
 'activeusers-from' => 'Szerkesztők listázása a következő névtől kezdve:',
 'activeusers-hidebots' => 'Botok elrejtése',
 'activeusers-hidesysops' => 'Adminisztrátorok elrejtése',
@@ -2760,11 +2762,11 @@ ha nem teszed, ellenőrizd a [[Special:DoubleRedirects|dupla]] vagy [[Special:Br
 Neked kell biztosítanod, hogy a linkek továbbra is oda mutassanak, ahová mutatniuk kell.
 
 A lap '''nem''' nevezhető át, ha már van egy ugyanilyen című lap, hacsak nem üres vagy átirányítás, és nincs laptörténete.
-Ez azt jelenti, hogy vissza tudsz nevezni egy tévedésből átnevezett lapot, és nem tudsz egy már létező lapot véletlenül felülírni.
+Ez azt jelenti, hogy vissza tudsz nevezni egy tévedésből átnevezett lapot, és nem tudsz létező lapot véletlenül felülírni.
 
 '''FIGYELEM!'''
 Népszerű oldalak esetén ez drasztikus és nem várt változtatás lehet;
-győződj meg a folytatás előtt arról, hogy tisztában vagy-e a következményekkel.",
+győződj meg a folytatás előtt arról, hogy tisztában vagy a következményekkel.",
 'movepagetext-noredirectfixer' => "Az alábbi űrlap használatával nevezhetsz át egy lapot, és helyezheted át teljes laptörténetét az új nevére.
 A régi cím az új címre való átirányítás lesz.
 Ellenőrizd a [[Special:DoubleRedirects|dupla]] és a [[Special:BrokenRedirects|hibás átirányításoknál]], hogy a linkek továbbra is oda mutatnak, ahová mutatniuk kell.
@@ -3110,6 +3112,7 @@ Ez valószínűleg egy olyan link miatt van, ami egy feketelistán lévő oldalr
 'pageinfo-robot-noindex' => 'Nem indexelhető',
 'pageinfo-views' => 'Megtekintések száma',
 'pageinfo-watchers' => 'Figyelők száma',
+'pageinfo-few-watchers' => 'Kevesebb mint $1 szerkesztő figyeli',
 'pageinfo-redirects-name' => 'Átirányítások erre a lapra',
 'pageinfo-subpages-name' => 'Az lap allapjai',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|átirányítás}}; $3 {{PLURAL:$3|nem átirányítás}})',
@@ -3130,6 +3133,7 @@ Ez valószínűleg egy olyan link miatt van, ami egy feketelistán lévő oldalr
 'pageinfo-contentpage' => 'Tartalmi lapnak számít',
 'pageinfo-contentpage-yes' => 'Igen',
 'pageinfo-protect-cascading-yes' => 'Igen',
+'pageinfo-category-info' => 'Kategória információk',
 'pageinfo-category-pages' => 'Lapok száma',
 'pageinfo-category-subcats' => 'Alkategóriák száma',
 'pageinfo-category-files' => 'Fájlok száma',
@@ -3971,6 +3975,7 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozz
 'logentry-newusers-newusers' => '$1 felhasználói fiók létrehozva',
 'logentry-newusers-create' => '$1 felhasználói fiók létrehozva',
 'logentry-newusers-create2' => '$1 létrehozta $3 felhasználói fiókját',
+'logentry-newusers-byemail' => 'Szerkesztői lap $3 néven létrehozva $1 által, jelszó kiküldve emailben.',
 'logentry-newusers-autocreate' => '$1 fiók automatikusan létrehozva',
 'logentry-rights-rights' => '$1 megváltoztatta $3 csoport tagságát erről: $4 erre: $5',
 'logentry-rights-rights-legacy' => '$1 megváltoztatta $3 csoport tagságát',
@@ -4028,6 +4033,7 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozz
 'api-error-ok-but-empty' => 'Belső hiba: nem érkezett válasz a kiszolgálótól.',
 'api-error-overwrite' => 'Létező fájlok felülírására nem engedélyezett.',
 'api-error-stashfailed' => 'Belső hiba: a kiszolgálünak nem sikerült eltárolni az ideiglenes fájlt.',
+'api-error-publishfailed' => 'Belső hiba: a kiszolgálónak nem sikerült közzétennie az ideiglenes fájlt.',
 'api-error-timeout' => 'A kiszolgáló nem adott választ a várt időn belül.',
 'api-error-unclassified' => 'Ismeretlen hiba történt',
 'api-error-unknown-code' => 'Ismeretlen hiba: „$1”',
index 6fff6a9..51f3ea6 100644 (file)
@@ -152,7 +152,7 @@ $messages = array(
 'category-empty' => "''Daytoy a kategoria ket agdama a saan nga aglaon kadagiti panid wenno midia.''",
 'hidden-categories' => '{{PLURAL:$1|Nailemmeng a kategoria|Nailemmeng a katkategoria}}',
 'hidden-category-category' => 'Nailemmeng a katkategoria',
-'category-subcat-count' => '{{PLURAL:$2|Daytoy a kategoria ket adda laeng ti sumaganad nga apo ti kategoria.|Daytoy a kategoria ket adda kadagiti sumaganad nga {{PLURAL:$1|nga apo ti kategoria|$1 nga apo dagiti kategoria}}, manipud ti dagup nga $2.}}',
+'category-subcat-count' => '{{PLURAL:$2|Daytoy a kategoria ket adda laeng ti sumaganad a subkategoria.|Daytoy a kategoria ket adda ti sumaganad {{PLURAL:$1|a subkategoria|$1 a dagiti subkategoria}}, manipud ti dagup nga $2.}}',
 'category-subcat-count-limited' => 'Daytoy a kategoria ket adda ti sumaganad  {{PLURAL:$1|nga apo ti kategoria|$1 nga apo dagiti kategoria}}.',
 'category-article-count' => '{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng ti sumaganad a panid.|Ti sumaganad  {{PLURAL:$1|a panid|$1 a pampanid}} ket adda iti daytoy a kategoria, manipud ti dagup nga $2.}}',
 'category-article-count-limited' => 'Ti sumaganad {{PLURAL:$1|a panid |$1 a pampanid}} ket adda iti agdama a kategoria.',
@@ -168,6 +168,7 @@ $messages = array(
 'newwindow' => '(aglukat iti sabali a tawa)',
 'cancel' => 'Ukasen',
 'moredotdotdot' => 'Adu pay...',
+'morenotlisted' => 'Adu a saan a nailista...',
 'mypage' => 'Panid',
 'mytalk' => 'Tungtungan',
 'anontalk' => 'Tungtungan para iti daytoy a pagtaengan ti IP',
@@ -473,7 +474,7 @@ Dimo liplipatan a sukatan dagiti kakaykayatam idiay [[Special:Preferences|{{SITE
 'gotaccount' => "Addaanka kadin ti pakabilangam? '''$1'''.",
 'gotaccountlink' => 'Sumrek',
 'userlogin-resetlink' => 'Nalipatam dagiti salaysay ti pagserrek mo?',
-'createaccountmail' => 'Babaen ti e-surat',
+'createaccountmail' => 'Agusar ti maysa a temporario a pugto a kontrasenias ken ipatulod idiay e-surat a pagtaengan a nainganan dita baba',
 'createaccountreason' => 'Rason:',
 'badretype' => 'Saan nga agpada dagiti impanmo a kontrasenias.',
 'userexists' => 'Maus-usaren ti nagan a kayatmo.
@@ -555,6 +556,7 @@ Pangaasi nga agurayka sakbay nga agipadas manen.',
 # E-mail sending
 'php-mail-error-unknown' => 'Di am-ammo a biddut iti surat ti PHP  () a pamay-an.',
 'user-mail-no-addy' => 'Pinadas nga impatulod ti e-surat nga awan ti e-surat a pagtaengan.',
+'user-mail-no-body' => 'Nangpadaska a nangipatulod ti e-surat nga awan linaonna wenno ababa laeng a bagi.',
 
 # Change password dialog
 'resetpass' => 'Sukatan ti kontrasenias',
@@ -622,6 +624,7 @@ Temporario a kontrasenias: $2',
 'changeemail-oldemail' => 'Agdama nga E-surat a pagtaengam:',
 'changeemail-newemail' => 'Baro nga e-surat a pagtaengan:',
 'changeemail-none' => '(awan)',
+'changeemail-password' => 'Ti bukodmo a kontrasenias ti {{SITENAME}}:',
 'changeemail-submit' => 'Sukatan ti e-surat',
 'changeemail-cancel' => 'Ukasen',
 
@@ -1103,7 +1106,7 @@ Dagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete
 'search-interwiki-default' => '$1 dagiti nagbanagan:',
 'search-interwiki-more' => '(adu pay)',
 'search-relatedarticle' => 'Mainaig',
-'mwsuggest-disable' => 'Pagsardengen dagiti AJAX a naisingasing',
+'mwsuggest-disable' => 'Ibaldado dagiti singasing ti panagbiruk',
 'searcheverything-enable' => 'Agbirukka kadagiti amin a nagan ti lugar',
 'searchrelated' => 'mainaig',
 'searchall' => 'amin',
@@ -1214,9 +1217,9 @@ Ngem saanto a mabalinen nga ipasubli.',
 'prefs-emailconfirm-label' => 'Pagsingkedan ti e-surat:',
 'prefs-textboxsize' => 'Ti kadakkel ti pagurnosan a tawa',
 'youremail' => 'E-surat:',
-'username' => 'Nagan ti agar-aramat:',
-'uid' => 'ID ti agar-aramat:',
-'prefs-memberingroups' => 'Kameng {{PLURAL:$1|ti grupo|dagiti grupo}}:',
+'username' => '{{GENDER:$1|Nagan ti agar-aramat}}:',
+'uid' => 'ID ti {{GENDER:$1|Agar-aramat}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Kameng}} ti {{PLURAL:$1|a grupo|a grupgrupo}}:',
 'prefs-registration' => 'Oras a nagrehistro:',
 'yourrealname' => 'Pudno a nagan:',
 'yourlanguage' => 'Pagsasao:',
@@ -2001,7 +2004,7 @@ Kitaen met [[Special:WantedCategories|dagiti makidkiddaw a kategoria]].',
 'linksearch-ok' => 'Biruken',
 'linksearch-text' => 'Ti naataap a tarheta a kas ti "*.wikipedia.org" ket mabalin nga usaren.
 Masapul ti kangatuan a pagturayan, a kaspagarigan "*.org".<br />
-{PLURAL:$2|Ti protokol|Dagiti protokol}} a nasuportaran: <code>$1</code> (naipakasigud ti http:// no awan ti protokol a nainaganan).',
+{{PLURAL:$2|Ti protokol|Dagiti protokol}} a nasuportaran: <code>$1</code> (naipakasigud ti http:// no awan ti protokol a nainaganan).',
 'linksearch-line' => 'Ti $1 ket nakasilpo idiay $2',
 'linksearch-error' => 'Ti naatap a tarheta ket agparang laeng iti pinagrugi ti nagan ti agsangaili.',
 
@@ -2120,7 +2123,7 @@ Dagiti masakbayan a panagsukat iti daytoy a panid ken dagiti mainaig a tungtunga
 'enotif_subject_moved' => 'Ti {{SITENAME}} panid ti $1 ket naiyalis idin babaen ni {{gender:$2|$2}}',
 'enotif_subject_restored' => 'Ti {{SITENAME}} a panid ti $1 ket naipasubli idin babaen ni {{gender:$2|$2}}',
 'enotif_subject_changed' => 'Ti {{SITENAME}} a panid ti $1 ket nasukatan idin babaen ni {{gender:$2|$2}}',
-'enotif_body_intro_deleted' => 'Ti {{SITENAME}} a panid ti $1 ket naikkat idin idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.',
+'enotif_body_intro_deleted' => 'Ti {{SITENAME}} a panid tie $1 ket {{GENDER:$2|naikkaten}} idiay $PAGEEDITDATE babaen ni $2, kitaen ti $3.',
 'enotif_body_intro_created' => 'Ti {{SITENAME}} a panid ti $1 ket napartuat idin idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.',
 'enotif_body_intro_moved' => 'Ti {{SITENAME}} a panid ti $1 ket naiyalis idin idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.',
 'enotif_body_intro_restored' => 'Ti {{SITENAME}} a panid ti $1 ket naipasubli idi idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.',
@@ -2229,6 +2232,8 @@ Kitaen ti [[Special:ProtectedPages|listaan kadagiti nasalakniban a panid]] ti li
 'prot_1movedto2' => '[[$1]] naiyalis iti [[$2]]',
 'protect-badnamespace-title' => 'Saan a mabalin a salakniban a nagan ti lugar',
 'protect-badnamespace-text' => 'Dagiti panid ditoy  a nagan ti lugar ket saan a mabalin a masalakniban.',
+'protect-norestrictiontypes-text' => 'Daytoy a panid ket saan a mabalin a masalakniban gaputa awan dagiti maiparit a kita a magun-od.',
+'protect-norestrictiontypes-title' => 'Di masalakniban a panid',
 'protect-legend' => 'Pasingkedan ti panagsalaknib',
 'protectcomment' => 'Rason:',
 'protectexpiry' => 'Agpaso:',
@@ -2555,7 +2560,7 @@ Mapabarom a kas automatiko dagiti baw-ing a nakatudo dita kasisigud a titulo.
 No agpilika a saanmo a kayat, pasaraduam a kitaen ti [[Special:DoubleRedirects|doble]] wenno [[Special:BrokenRedirects|nadadael a baw-ing]].
 Renbbengmo ti mangpatalged nga amin a silpo ket agtultuloy a nakatudo iti nasken a papananda.
 
-Laglagipen a ti panid ket '''saan''' a maiyalis no addan sigud a panid iti baro a titulo, malaksid no daytoy ket maysa a baw-ing ken awan ti napalabas a pakasaritaan ti panag-urnos. 
+Laglagipen a ti panid ket '''saan''' a maiyalis no addan sigud a panid iti baro a titulo, malaksid no ti kinaudi ket maysa a baw-ing ken awan ti napalabas a pakasaritaan ti panag-urnos. 
 Kayat a sawen daytoy a mabalinmo a suktan ti nagan ti maysa a panid manipud iti punto ti pannakasukat ti nagan no nagbiddutka, ken saan mo a mabalin a suratan manen ti addaan a panid.
 
 '''Ballaag!'''
@@ -2741,6 +2746,7 @@ Pangngaasi a padasem manen.',
 'import-error-interwiki' => 'Ti panid ti "$1" ket saan a naala ngamin ket ti nagan ket nailasin para iti ruar a panagsilpo (interwiki).',
 'import-error-special' => 'Ti panid ti "$1" ket saan a naala ngamin ket bukod ti  espesial a nagan a lugar a saan nga agpalubos ti pampanid.',
 'import-error-invalid' => 'Ti panid ti "$1" ket saan a naala ngamin ket ti nagan ket imbalido.',
+'import-error-unserialize' => 'Ti panagbaliw ti $2 iti panid ti "$1" ket di maipagsasaruno. Ti panagbalbaliw ket naireporta idi nga agus-usar ti modelo ti $3 a naipagsasaruno a kas $4.',
 'import-options-wrong' => 'Saan nga husto {{PLURAL:$2|a pagpilian|a pagpilpilian}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Ti naited a ramut ti panid ket imbalido a titulo.',
 'import-rootpage-nosubpage' => 'Ti nagan ti lugar ti "$1" iti ramut ti panid ket saan amangpalubos kadagiti apo ti panid.',
@@ -2875,6 +2881,7 @@ Daytoy ket mabalin a gapuanan babaen ti panilpo a naiparit ti akin ruar a pagsaa
 'pageinfo-robot-noindex' => 'Saan a mabalin a maipasurotan',
 'pageinfo-views' => 'Bilang dagiti panagkita',
 'pageinfo-watchers' => 'Bilang dagiti agbuybuya ti panid',
+'pageinfo-few-watchers' => 'Basbassit ngem $1 {{PLURAL:$1|ti agbuybuya|dagiti agbuybuya}}',
 'pageinfo-redirects-name' => 'Maibaw-ing ti daytoy a panid',
 'pageinfo-subpages-name' => 'Apo dagiti panid ti daytoy a panid',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|baw-ing|bawbaw-ing}}; $3 {{PLURAL:$3|saan a baw-ing|saan a bawbaw-ing}})',
@@ -2889,6 +2896,7 @@ Daytoy ket mabalin a gapuanan babaen ti panilpo a naiparit ti akin ruar a pagsaa
 'pageinfo-magic-words' => 'Salamangka  {{PLURAL:$1|a balikas|a balbalikas}} ($1)',
 'pageinfo-hidden-categories' => 'Nailemmeng {{PLURAL:$1|a kategoria|a katkategoria}} ($1)',
 'pageinfo-templates' => 'Nailak-am  {{PLURAL:$1|a plantilia|a planplantilia}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|A panid|A pampanid}} ti nailak-an=m idiay ($1)',
 'pageinfo-toolboxlink' => 'Pakaammo ti panid',
 'pageinfo-redirectsto' => 'Maibaw-ing idiay',
 'pageinfo-redirectsto-info' => 'pakaammo',
@@ -2897,6 +2905,10 @@ Daytoy ket mabalin a gapuanan babaen ti panilpo a naiparit ti akin ruar a pagsaa
 'pageinfo-protect-cascading' => 'Dagiti panagsalaknib ket agsariap manipud ditoy',
 'pageinfo-protect-cascading-yes' => 'Wen',
 'pageinfo-protect-cascading-from' => 'Dagiti panagsalaknib ket agsariap manipud idiay',
+'pageinfo-category-info' => 'Pakaammo ti kategoria',
+'pageinfo-category-pages' => 'Bilang dagiti panid',
+'pageinfo-category-subcats' => 'Bilang dagiti subkategoria',
+'pageinfo-category-files' => 'Bilang dagiti papeles',
 
 # Patrolling
 'markaspatrolleddiff' => 'Markaan a kas napatruliaan',
@@ -2973,6 +2985,8 @@ No usarem daytoy, baka makompromiso ti sistema.",
 'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutos}}',
 'hours' => '{{PLURAL:$1|$1 oras$1 oras}}',
 'days' => '{{PLURAL:$1|$1 aldaw|$1 al-aldaw}}',
+'months' => '{{PLURAL:$1|$1 a bulan|$1 a bulbulan}}',
+'years' => '{{PLURAL:$1|$1 a tawen|$1 a tawtawen}}',
 'ago' => '$1 nagtapos',
 'just-now' => 'tatta laeng',
 
@@ -3725,6 +3739,7 @@ Daytoy a pagsaadan ket agdadama ti teknikal a pagrigrigatan.',
 'logentry-newusers-newusers' => 'Nagpartuat idi ti $1 a pakabilangan ti agar-aramat',
 'logentry-newusers-create' => 'Nagpartuat idi ti $1 a pakabilangan ti agar-aramat',
 'logentry-newusers-create2' => 'Nagpartuat ni ti $3 a pakabilangan ti agar-aramat babaen ni $1',
+'logentry-newusers-byemail' => 'Ti pakabilangan a $3 ket pinartuat idi babaen ni $1 ken ti kontrasenias ket naipatulod idi babaen ti e-surat',
 'logentry-newusers-autocreate' => 'Ti pakabilangan ni $1 ket automatiko a napartuat',
 'logentry-rights-rights' => 'Ni $1 ket nangbaliw ti grupo a panakaikameng para kenni $3 manipud ti $4 iti $5',
 'logentry-rights-rights-legacy' => 'Ni $1 ket nangbaliw ti grupo a panakaikameng para kenni $3',
@@ -3783,6 +3798,7 @@ Nupay kasta, mau-sarmo ti nakabuklan dita baba. Ti komentario nga itedmo ket mai
 'api-error-ok-but-empty' => 'Kinauneg a biddut: Awan ti sungbat manipud idiay server.',
 'api-error-overwrite' => 'Saan a mabalin a suratan manen iti papeles nga adda ditan.',
 'api-error-stashfailed' => 'Kinauneg a biddut: Napaay ti server ti agidulin ti temporario a papeles',
+'api-error-publishfailed' => 'Kinauneg a biddut: Napaay ti server a nagipablaak ti temporario a papeles.',
 'api-error-timeout' => 'Saan a simmungbat ti server iti nanamnama nga oras.',
 'api-error-unclassified' => 'Adda di amammo a biddut a rumsua.',
 'api-error-unknown-code' => 'Di amamo a biddut: "$1"',
index 9c5ef40..0c5a42d 100644 (file)
@@ -644,8 +644,8 @@ $1',
 'hidetoc' => '非表示',
 'collapsible-collapse' => '折り畳む',
 'collapsible-expand' => '展開する',
-'thisisdeleted' => '$1を閲覧または復元しますか',
-'viewdeleted' => '$1を閲覧しますか',
+'thisisdeleted' => '$1を閲覧または復元しますか?',
+'viewdeleted' => '$1を閲覧しますか?',
 'restorelink' => '{{PLURAL:$1|削除された$1編集}}',
 'feedlinks' => 'フィード:',
 'feed-invalid' => 'フィード形式の指定が正しくありません。',
@@ -656,7 +656,7 @@ $1',
 'page-atom-feed' => '「$1」のAtomフィード',
 'feed-atom' => 'Atom',
 'feed-rss' => 'RSS',
-'red-link-title' => '$1(存在しないページ)',
+'red-link-title' => '$1 (存在しないページ)',
 'sort-descending' => '降順に並べ替え',
 'sort-ascending' => '昇順に並べ替え',
 
@@ -701,7 +701,7 @@ URL を間違って入力したか、正しくないリンクをたどった可
 'enterlockreason' => 'ロックの理由とロック解除の予定を入力してください',
 'readonlytext' => 'データベースは現在、新しいページの追加や編集を受け付けない「ロック状態」になっています。これはおそらくデータベースの定期メンテナンスのためで、メンテナンス終了後は正常な状態に復帰します。
 
-データベースをロックした管理者による説明は以下の通りです$1',
+データベースをロックした管理者による説明は以下の通りです$1',
 'missing-article' => '指定されたページ「$1」$2 の本文がデータベース内で見つかりませんでした。
 
 通常、削除されたページの版への古い差分表示や固定リンクをたどった際に、このようなことが起きます。
@@ -771,7 +771,7 @@ $2',
 
 # Virus scanner
 'virus-badscanner' => "環境設定が不適合です: 不明なウイルス対策ソフトウェア: ''$1''",
-'virus-scanfailed' => 'スキャンに失敗しました(コード $1)',
+'virus-scanfailed' => 'スキャンに失敗しました (コード $1)',
 'virus-unknownscanner' => '不明なウイルス対策ソフトウェア:',
 
 # Login and logout pages
@@ -803,7 +803,7 @@ $2',
 'createaccount' => 'アカウント作成',
 'gotaccount' => 'アカウントを既に持っている場合、$1。',
 'gotaccountlink' => 'ログインしてください',
-'userlogin-resetlink' => 'ログイン情報をお忘れですか',
+'userlogin-resetlink' => 'ログイン情報をお忘れですか?',
 'createaccountmail' => '一時的でランダムなパスワードを生成して、以下に指定したメールアドレスに送信する',
 'createaccountreason' => '理由:',
 'badretype' => '入力したパスワードが一致しません。',
@@ -871,7 +871,7 @@ Cookieを有効にしていることを確認して、このページを再読
 'accountcreated' => 'アカウントを作成しました',
 'accountcreatedtext' => '利用者アカウント「$1」を作成しました。',
 'createaccount-title' => '{{SITENAME}}のアカウント作成',
-'createaccount-text' => '誰か(おそらくあなた)が、{{SITENAME}} ($4) にあなたのメールアドレスのアカウントを作成しました。
+'createaccount-text' => '誰か (おそらくあなた) が、{{SITENAME}} ($4) にあなたのメールアドレスのアカウントを作成しました。
 アカウント名「$2」、パスワード「$3」です。
 今すぐログインしてパスワードを変更してください。
 
@@ -891,7 +891,7 @@ Cookieを有効にしていることを確認して、このページを再読
 # Change password dialog
 'resetpass' => 'パスワードの変更',
 'resetpass_announce' => 'メールでお送りした仮パスワードでログインしました。
-ログインを完了するには、ここで新しいパスワードを設定する必要があります',
+ログインを完了するには、ここで新しいパスワードを設定する必要があります:',
 'resetpass_text' => '<!-- ここに文を挿入 -->',
 'resetpass_header' => 'アカウントのパスワードの変更',
 'oldpassword' => '古いパスワード:',
@@ -917,7 +917,7 @@ Cookieを有効にしていることを確認して、このページを再読
 'passwordreset-username' => '利用者名:',
 'passwordreset-domain' => 'ドメイン:',
 'passwordreset-capture' => 'お送りするメールの内容を表示しますか?',
-'passwordreset-capture-help' => 'このボックスにチェックを入れると、利用者に送信されるメールの内容(仮パスワードを含む)をあなたも閲覧できます。',
+'passwordreset-capture-help' => 'このボックスにチェックを入れると、利用者に送信されるメールの内容 (仮パスワードを含む) をあなたも閲覧できます。',
 'passwordreset-email' => 'メールアドレス:',
 'passwordreset-emailtitle' => '{{SITENAME}}上のアカウントの詳細',
 'passwordreset-emailtext-ip' => '誰か (おそらくあなた、IP アドレス $1) が {{SITENAME}} ($4) での
@@ -978,7 +978,7 @@ $2
 'media_sample' => 'サンプル.ogg',
 'media_tip' => 'ファイルへのリンク',
 'sig_tip' => '時刻印付きの署名',
-'hr_tip' => '水平線を挿入(利用は控えめに)',
+'hr_tip' => '水平線を挿入 (利用は控えめに)',
 
 # Edit pages
 'summary' => '編集内容の要約:',
@@ -1006,9 +1006,9 @@ $2
 ブロックは$1によって実施されました。
 ブロックの理由は ''$2'' です。
 
-* ã\83\96ã\83­ã\83\83ã\82¯é\96\8bå§\8bæ\99\82æ\9c\9fï¼\9a$8
-* ブロック解除予定$6
-* ブロック対象$7
+* ã\83\96ã\83­ã\83\83ã\82¯é\96\8bå§\8bæ\97¥æ\99\82$8
+* ブロック解除予定$6
+* ブロック対象$7
 
 このブロックについて、$1もしくは他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]に問い合わせることができます。
 ただし、[[Special:Preferences|個人設定]]で有効なメールアドレスが登録されていない場合、またはメール送信機能の使用がブロックされている場合、「この利用者にメールを送信」の機能は使えません。
@@ -1019,9 +1019,9 @@ $2
 
 :''$2''
 
-* ブロックの開始:$8
-* ブロック解除予定$6
-* 意図されているブロック対象者:$7
+* ブロック開始日時: $8
+* ブロック解除予定$6
+* ブロック対象: $7
 
 $1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのブロックについて問い合わせることができます。
 
@@ -1193,14 +1193,14 @@ IP アドレスは複数の利用者で共有されている場合がありま
 これらの引数を省略しました。",
 'post-expand-template-argument-category' => '省略されたテンプレート引数を含むページ',
 'parser-template-loop-warning' => 'テンプレートのループを検出しました: [[$1]]',
-'parser-template-recursion-depth-warning' => 'テンプレートの再帰の深さ($1)が上限を超えました',
-'language-converter-depth-warning' => '言語変換機能の深さ($1)が制限を超えました',
+'parser-template-recursion-depth-warning' => 'テンプレートの再帰の深さ ($1) が上限を超えました',
+'language-converter-depth-warning' => '言語変換機能の深さ ($1) が制限を超えました',
 'node-count-exceeded-category' => 'ノード数が制限を超えたページ',
 'node-count-exceeded-warning' => 'ページがノード数の制限を超えました',
 'expansion-depth-exceeded-category' => '展開の深さ制限を超えたページ',
 'expansion-depth-exceeded-warning' => 'ページが展開の深さ制限を超えました',
-'parser-unstrip-loop-warning' => 'Unstrip のループが検出されました',
-'parser-unstrip-recursion-limit' => 'Unstrip の再帰($1)が上限を超えました',
+'parser-unstrip-loop-warning' => 'unstrip のループを検出しました',
+'parser-unstrip-recursion-limit' => 'unstrip の再帰 ($1) が上限を超えました',
 'converter-manual-rule-error' => '手動の言語変換規則でエラーを検出しました。',
 
 # "Undo" feature
@@ -1354,9 +1354,9 @@ $1",
 'mergehistory' => 'ページの履歴の統合',
 'mergehistory-header' => 'このページでは、ある元ページの履歴を新しいページに統合できます。
 この変更を行ってもページの履歴の連続性が確実に保たれるようにしてください。',
-'mergehistory-box' => '2ページの過去の版を統合する',
-'mergehistory-from' => '統合元となるページ',
-'mergehistory-into' => '統合先のページ',
+'mergehistory-box' => '2ページの過去の版を統合する:',
+'mergehistory-from' => '統合元となるページ:',
+'mergehistory-into' => '統合先のページ:',
 'mergehistory-list' => '統合できる編集履歴',
 'mergehistory-merge' => '以下の [[:$1]] の履歴を [[:$2]] に統合できます。
 特定の日時以前に作成された版のみを統合するには、ラジオボタンで版を選択してください。
@@ -1371,22 +1371,22 @@ $1",
 'mergehistory-invalid-source' => '統合元のページは有効な名前でなければなりません。',
 'mergehistory-invalid-destination' => '統合先のページは有効な名前でなければなりません。',
 'mergehistory-autocomment' => '[[:$1]]を[[:$2]]に統合',
-'mergehistory-comment' => '[[:$1]]を[[:$2]]に統合$3',
+'mergehistory-comment' => '[[:$1]]を[[:$2]]に統合$3',
 'mergehistory-same-destination' => '統合元と統合先のページを同じにはできません',
-'mergehistory-reason' => '理由',
+'mergehistory-reason' => '理由:',
 
 # Merge log
 'mergelog' => '統合記録',
-'pagemerge-logentry' => '[[$1]]を[[$2]]に統合($3 版まで)',
+'pagemerge-logentry' => '[[$1]]を[[$2]]に統合 ($3 版まで)',
 'revertmerge' => '統合解除',
 'mergelogpagetext' => '以下は、最近行われたあるページから別のページへの統合の一覧です。',
 
 # Diffs
 'history-title' => '「$1」の変更履歴',
-'difference-title' => '$1:版間の差分',
-'difference-title-multipage' => '$1 と $2:ページ間の差分',
+'difference-title' => '「$1」の版間の差分',
+'difference-title-multipage' => 'ページ「$1」と「$2」の間の差分',
 'difference-multipage' => '(ページ間の差分)',
-'lineno' => '$1行',
+'lineno' => '$1行:',
 'compareselectedversions' => '選択した版同士を比較',
 'showhideselectedversions' => '選択した版を表示/非表示',
 'editundo' => '取り消し',
@@ -1401,7 +1401,7 @@ $1",
 'searchresults' => '検索結果',
 'searchresults-title' => '「$1」の検索結果',
 'searchresulttext' => '{{SITENAME}}の検索に関する詳しい情報は、[[{{MediaWiki:Helppage}}|{{int:help}}]]をご覧ください。',
-'searchsubtitle' => "'''[[:$1]]'''の検索([[Special:Prefixindex/$1|「$1」から始まるページ]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|「$1」へリンクしている全ページ]])",
+'searchsubtitle' => "'''[[:$1]]'''の検索 ([[Special:Prefixindex/$1|「$1」から始まるページ]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|「$1」へリンクしている全ページ]])",
 'searchsubtitleinvalid' => "'''$1'''を検索しました",
 'toomanymatches' => '一致したページが多すぎます。他の検索語を指定してください。',
 'titlematches' => 'ページ名と一致',
@@ -1447,7 +1447,7 @@ $1",
 'showingresultsnum' => "'''$2''' 件目以降の {{PLURAL:$3|'''$3''' 件の結果}}を表示しています。",
 'showingresultsheader' => "「'''$4'''」の検索結果 {{PLURAL:$5|'''$3''' 件中の '''$1''' 件目|'''$3''' 件中の '''$1''' 件目から '''$2''' 件目}}",
 'nonefound' => "'''注意''': 既定では一部の名前空間のみを検索します。
-''all:''を前に付けると、すべて(トークページやテンプレートなどを含む)を対象にできます。検索する名前空間を前に付けることもできます。",
+''all:''を前に付けると、すべて (トークページやテンプレートなどを含む) を対象にできます。検索する名前空間を前に付けることもできます。",
 'search-nonefound' => '問い合わせに合致する検索結果はありませんでした。',
 'powersearch' => '高度な検索',
 'powersearch-legend' => '高度な検索',
@@ -1521,7 +1521,7 @@ $1",
 'timezonelegend' => 'タイムゾーン:',
 'localtime' => 'ローカルの時刻:',
 'timezoneuseserverdefault' => 'ウィキの既定を使用 ($1)',
-'timezoneuseoffset' => 'その他(時差を指定)',
+'timezoneuseoffset' => 'その他 (時差を指定)',
 'timezoneoffset' => '時差¹:',
 'servertime' => 'サーバーの時刻:',
 'guesstimezone' => 'ブラウザーの設定から入力',
@@ -1611,7 +1611,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'userrights-groups-help' => 'この利用者が属するグループを変更できます。
 * チェックが入っているボックスは、この利用者がそのグループに属していることを意味します。
 * チェックが入っていないボックスは、この利用者がそのグループに属していないことを意味します。
-* 「*」はグループに一旦追加した場合に除去(あるいはその逆)ができないことを示しています。',
+* 「*」はグループに一旦追加した場合に除去 (あるいはその逆) ができないことを示しています。',
 'userrights-reason' => '理由:',
 'userrights-no-interwiki' => '他ウィキ上における利用者権限の編集権限はありません。',
 'userrights-nodatabase' => 'データベース$1は存在しないか、ローカル上にありません。',
@@ -1648,7 +1648,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 # Rights
 'right-read' => 'ページを閲覧',
 'right-edit' => 'ページを編集',
-'right-createpage' => 'ページ(議論ページ以外)を作成',
+'right-createpage' => 'ページ (議論ページ以外) を作成',
 'right-createtalk' => '議論ページを作成',
 'right-createaccount' => '新しい利用者アカウントを作成',
 'right-minoredit' => '細部の編集の印を付ける',
@@ -1672,7 +1672,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'right-bigdelete' => '大きな履歴があるページを削除',
 'right-deletelogentry' => '特定の記録項目を削除/復元',
 'right-deleterevision' => 'ページの特定の版を削除/復元',
-'right-deletedhistory' => '削除された履歴項目(関連する本文を除く)を閲覧',
+'right-deletedhistory' => '削除された履歴項目 (関連する本文を除く) を閲覧',
 'right-deletedtext' => '削除された本文と削除された版間の差分を閲覧',
 'right-browsearchive' => '削除されたページを検索',
 'right-undelete' => 'ページを復元',
@@ -1685,7 +1685,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'right-proxyunbannable' => 'プロキシの自動ブロックを回避',
 'right-unblockself' => '自身に対するブロックを解除',
 'right-protect' => '保護レベルを変更し、保護されたページを編集',
-'right-editprotected' => '保護ページ(カスケード保護を除く)を編集',
+'right-editprotected' => '保護ページ (カスケード保護を除く) を編集',
 'right-editinterface' => 'ユーザーインターフェイスを編集',
 'right-editusercssjs' => '他の利用者のCSSファイル/JavaScriptファイルを編集',
 'right-editusercss' => '他の利用者のCSSファイルを編集',
@@ -1781,12 +1781,12 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'boteditletter' => 'ボ',
 'unpatrolledletter' => '!',
 'number_of_watching_users_pageview' => '[{{PLURAL:$1|$1 人の利用者}}がウォッチしています]',
-'rc_categories' => 'カテゴリを限定(「|」で区切る)',
+'rc_categories' => 'カテゴリを限定 (「|」で区切る)',
 'rc_categories_any' => 'すべて',
 'rc-change-size' => '$1',
 'rc-change-size-new' => '変更後は $1 {{PLURAL:$1|バイト}}',
 'newsectionsummary' => '/* $1 */ 新しい節',
-'rc-enhanced-expand' => '詳細を表示(JavaScript が必要)',
+'rc-enhanced-expand' => '詳細を表示 (JavaScript が必要)',
 'rc-enhanced-hide' => '詳細を非表示',
 'rc-old-title' => '作成時のページ名は「$1」',
 
@@ -1796,7 +1796,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'recentchangeslinked-toolbox' => '関連ページの更新状況',
 'recentchangeslinked-title' => '「$1」と関連する変更',
 'recentchangeslinked-noresult' => '指定期間中に指定ページのリンク先に変更はありませんでした。',
-'recentchangeslinked-summary' => "これは指定したページからリンクされている(または指定したカテゴリに含まれている)ページの最近の変更の一覧です。
+'recentchangeslinked-summary' => "これは指定したページからリンクされている (または指定したカテゴリに含まれている) ページの最近の変更の一覧です。
 [[Special:Watchlist|自分のウォッチリスト]]にあるページは'''太字'''で表示されます。",
 'recentchangeslinked-page' => 'ページ名:',
 'recentchangeslinked-to' => 'このページへのリンク元での変更の表示に切り替え',
@@ -1876,15 +1876,15 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 新しい概要を表示させるには、説明ページを手動で編集する必要があります。
 [[$1|thumb]]',
 'fileexists-extension' => '類似した名前のファイルが既に存在します: [[$2|thumb]]
-* アップロード中のファイルの名前<strong>[[:$1]]</strong>
+* アップロード中のファイルの名前<strong>[[:$1]]</strong>
 * 既存ファイルの名前: <strong>[[:$2]]</strong>
 違う名前を選択してください。',
-'fileexists-thumbnail-yes' => "このファイルは元の画像から縮小されたもの''(サムネイル)''のようです。
+'fileexists-thumbnail-yes' => "このファイルは元の画像から縮小されたもの ''(サムネイル)'' のようです。
 [[$1|thumb]]
-ファイル<strong>[[:$1]]</strong>を確認してください。
+ファイル <strong>[[:$1]]</strong> を確認してください。
 確認したファイルが同じ画像の元のサイズの版の場合は、サムネイルを別途アップロードする必要はありません。",
-'file-thumbnail-no' => "ファイル名が<strong>$1</strong>から始まっています。
-他の画像から縮小されたもの''(サムネイル)''のようです。
+'file-thumbnail-no' => "ファイル名が <strong>$1</strong> で始まっています。
+他の画像から縮小されたもの ''(サムネイル)'' のようです。
 より高精細な画像をお持ちの場合はそれをアップロードしてください。お持ちではない場合はファイル名を変更してください。",
 'fileexists-forbidden' => 'この名前のファイルは既に存在しており、上書きできません。
 アップロードを継続したい場合は、前のページに戻り、別のファイル名を使用してください。
@@ -1892,8 +1892,8 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'fileexists-shared-forbidden' => 'この名前のファイルは共有ファイルリポジトリに既に存在しています。
 アップロードを継続したい場合は、前のページに戻り、別のファイル名を使用してください。
 [[File:$1|thumb|center|$1]]',
-'file-exists-duplicate' => 'このファイルは以下の{{PLURAL:$1|ファイル|ファイル群}}と重複しています',
-'file-deleted-duplicate' => 'このファイル([[:$1]])と同一のファイルが以前に削除されています。
+'file-exists-duplicate' => 'このファイルは以下の{{PLURAL:$1|ファイル|ファイル群}}と重複しています:',
+'file-deleted-duplicate' => 'このファイル ([[:$1]]) と同一のファイルが以前に削除されています。
 再度アップロードをする前に、以前削除されたファイルの削除記録を確認してください。',
 'uploadwarning' => 'アップロード警告',
 'uploadwarning-text' => '下記のファイル解説を修正して再試行してください。',
@@ -1957,7 +1957,7 @@ $1',
 それでもこのエラーが発生する場合は、[[Special:ListUsers/sysop|管理者]]に連絡してください。',
 'upload-too-many-redirects' => 'そのURLに含まれるリダイレクトが多すぎます',
 'upload-unknown-size' => 'サイズ不明',
-'upload-http-error' => 'HTTPエラー発生:$1',
+'upload-http-error' => 'HTTP エラー発生: $1',
 'upload-copy-upload-invalid-domain' => 'このドメインからのアップロードは許可されていません。',
 
 # File backend
@@ -2041,14 +2041,14 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization をご覧ください
 'img-auth-bad-query-string' => 'URLの中に無効なクエリ文字列があります。',
 
 # HTTP errors
-'http-invalid-url' => '無効なURL$1',
+'http-invalid-url' => '無効なURL$1',
 'http-invalid-scheme' => 'スキーム「$1」の URL には未対応です。',
 'http-request-error' => '不明なエラーによりHTTPリクエストに失敗しました。',
 'http-read-error' => 'HTTP読み込みエラーです。',
 'http-timed-out' => 'HTTP要求がタイムアウトしました。',
 'http-curl-error' => 'URLからの取得に失敗しました: $1',
 'http-host-unreachable' => 'URLに到達できません。',
-'http-bad-status' => 'HTTP要求中に問題が発生しました:$1$2',
+'http-bad-status' => 'HTTP リクエストで問題が発生しました: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'URLに到達できませんでした',
@@ -2098,7 +2098,7 @@ URLが正しいものであり、ウェブサイトが稼働していること
 'filehist-comment' => 'コメント',
 'filehist-missing' => 'ファイルがありません',
 'imagelinks' => 'ファイルの使用状況',
-'linkstoimage' => '以下の {{PLURAL:$1| ページ|$1 ページ}}が、このファイルへリンクしています:',
+'linkstoimage' => '以下の{{PLURAL:1|ページ|&#32;$1 ページ}}がこのファイルにリンクしています:',
 'linkstoimage-more' => 'このファイルへは $1 を超える数のページからリンクがあります。
 以下の一覧ではこのファイルにリンクしている最初の $1 ページのみを表示しています。
 [[Special:WhatLinksHere/$2|完全な一覧]]も参照してください。',
@@ -2175,7 +2175,7 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 
 # Random page
 'randompage' => 'おまかせ表示',
-'randompage-nopages' => '以下の{{PLURAL:$2|名前空間}}にはページがありません:$1。',
+'randompage-nopages' => '以下の{{PLURAL:$2|名前空間}}にはページがありません: $1',
 
 # Random redirect
 'randomredirect' => 'おまかせリダイレクト',
@@ -2331,7 +2331,7 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 'allpagesprev' => '前へ',
 'allpagesnext' => '次へ',
 'allpagessubmit' => '表示',
-'allpagesprefix' => '次の文字列から始まるページを表示',
+'allpagesprefix' => '次の文字列から始まるページを表示:',
 'allpagesbadtitle' => '指定したページ名は無効か、言語間またはインターウィキ接頭辞を含んでいます。
 ページ名に使用できない文字が1つ以上含まれている可能性があります。',
 'allpages-bad-ns' => '{{SITENAME}}に「$1」という名前空間はありません。',
@@ -2347,7 +2347,7 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 'categoriespagetext' => '以下の{{PLURAL:$1|カテゴリ}}にはページまたはメディアがあります。
 [[Special:UnusedCategories|未使用のカテゴリ]]はここには表示していません。
 [[Special:WantedCategories|望まれるカテゴリ]]も参照してください。',
-'categoriesfrom' => '最初に表示するカテゴリ',
+'categoriesfrom' => '最初に表示するカテゴリ:',
 'special-categories-sort-count' => '項目数順に並べ替え',
 'special-categories-sort-abc' => '辞書順に並べ替え',
 
@@ -2394,12 +2394,12 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 'listgrouprights-members' => '(該当者一覧)',
 'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 (<code>$2</code>)</span>',
 'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 (<code>$2</code>)</span>',
-'listgrouprights-addgroup' => '{{PLURAL:$2|グループ}}を追加$1',
-'listgrouprights-removegroup' => '{{PLURAL:$2|グループ}}を除去$1',
+'listgrouprights-addgroup' => '{{PLURAL:$2|グループ}}を追加$1',
+'listgrouprights-removegroup' => '{{PLURAL:$2|グループ}}を除去$1',
 'listgrouprights-addgroup-all' => '全グループを追加可能',
 'listgrouprights-removegroup-all' => '全グループを除去可能',
-'listgrouprights-addgroup-self' => '自分のアカウントに{{PLURAL:$2|グループ}}を追加:$1',
-'listgrouprights-removegroup-self' => '自分のアカウントから{{PLURAL:$2|グループ}}を除去:$1',
+'listgrouprights-addgroup-self' => '自身のアカウントに{{PLURAL:$2|グループ}}を追加: $1',
+'listgrouprights-removegroup-self' => '自身のアカウントから{{PLURAL:$2|グループ}}を除去: $1',
 'listgrouprights-addgroup-self-all' => '自分のアカウントに全グループを追加可能',
 'listgrouprights-removegroup-self-all' => '自分のアカウントから全グループを除去可能',
 
@@ -2412,7 +2412,7 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 'emailpage' => '利用者にメールを送信',
 'emailpagetext' => '以下のフォームを使用してこの{{GENDER:$1|利用者}}にメールを送信できます。
 「差出人」として、[[Special:Preferences|利用者の個人設定]]で入力したメールアドレスが設定されます。これにより、受信者があなたに直接返信できるようになります。',
-'usermailererror' => 'メールが以下のエラーを返しました',
+'usermailererror' => 'メールが以下のエラーを返しました:',
 'defemailsubject' => '{{SITENAME}} 利用者「$1」からのメール',
 'usermaildisabled' => '利用者メール機能は無効です',
 'usermaildisabledtext' => 'このウィキでは他の利用者にメールを送信できません',
@@ -2496,27 +2496,27 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 
 $PAGEINTRO $NEWPAGE
 
-編集内容の要約:$PAGESUMMARY($PAGEMINOREDIT)
+編集内容の要約: $PAGESUMMARY ($PAGEMINOREDIT)
 
-投稿者の連絡先
-メール$PAGEEDITOR_EMAIL
-ウィキ$PAGEEDITOR_WIKI
+投稿者の連絡先:
+メール$PAGEEDITOR_EMAIL
+ウィキ$PAGEEDITOR_WIKI
 
 このページを訪れない限り、これ以上の活動に対する通知は送信されません。ウォッチリスト内のすべてのページについて、通知を再設定することもできます。
 
                          {{SITENAME}}通知システム
 
 --
-メール通知の設定は、以下のページで変更してください
+メール通知の設定は、以下のページで変更してください:
 {{canonicalurl:{{#special:Preferences}}}}
 
-ウォッチリストの設定は、以下のページで変更してください
+ウォッチリストの設定は、以下のページで変更してください:
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
-このページは、以下のページでウォッチリストから削除できます
+このページは、以下のページでウォッチリストから削除できます:
 $UNWATCHURL
 
-ご意見、お問い合わせ
+ご意見、お問い合わせ:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 'created' => '作成',
 'changed' => '変更',
@@ -2564,13 +2564,13 @@ $UNWATCHURL
 'rollbackfailed' => '巻き戻しに失敗しました',
 'cantrollback' => '編集を差し戻せません。
 最後の投稿者が、このページの唯一の作者です。',
-'alreadyrolled' => 'ページ[[:$1]]の[[User:$2|$2]]([[User talk:$2|トーク]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])による編集を巻き戻せません。
+'alreadyrolled' => 'ページ[[:$1]]の[[User:$2|$2]] ([[User talk:$2|トーク]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) による編集を巻き戻せません。
 他の利用者が既に編集または巻き戻しを行ったためです。
 
-このページの最後の編集は[[User:$3|$3]]([[User talk:$3|トーク]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])によるものです。',
+このページの最後の編集は[[User:$3|$3]] ([[User talk:$3|トーク]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) によるものです。',
 'editcomment' => "編集内容の要約:「''$1''」",
-'revertpage' => '[[Special:Contributions/$2|$2]]([[User talk:$2|トーク]])による編集を[[User:$1|$1]]による直前の版へ差し戻しました',
-'revertpage-nouser' => '(利用者名削除)による編集を[[User:$1|$1]]による直前の版へ差し戻しました',
+'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|トーク]]) による編集を[[User:$1|$1]]による直前の版へ差し戻しました',
+'revertpage-nouser' => '(利用者名削除) による編集を[[User:$1|$1]]による直前の版へ差し戻しました',
 'rollback-success' => '$1による編集を差し戻しました。
 $2による直前の版へ変更されました。',
 
@@ -2937,7 +2937,7 @@ $1 のブロックの理由は「''$2''」です。",
 移動先が既に存在する場合は、そのページが転送ページであり、かつ過去の版を持たない場合を除いて移動'''できません'''。
 つまり、間違えてページ名を変更した場合には元に戻せます。また移動によって既存のページを上書きしてしまうことはありません。
 
-'''警告'''
+'''警告!'''
 多く閲覧されるページや多くリンクされているページを移動すると、予期しない大きな変化が起こるかもしれないことにご注意ください。
 ページの移動に伴う影響をよく考えてから移動してください。",
 'movepagetalktext' => "関連付けられたトークページも一緒に、自動的に移動されます。ただし、'''以下の場合を除きます:'''
@@ -3127,8 +3127,8 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 'javascripttest-title' => '$1 のテストの実行',
 'javascripttest-pagetext-noframework' => 'このページは JavaScript のテストを実行するために予約されています。',
 'javascripttest-pagetext-unknownframework' => 'テストフレームワーク「$1」は不明です。',
-'javascripttest-pagetext-frameworks' => '次のテストフレームワークからひとつを選択してください:$1',
-'javascripttest-pagetext-skins' => 'テストを実行する外装を選択してください',
+'javascripttest-pagetext-frameworks' => '以下のテストフレームワークから1つ選択してください: $1',
+'javascripttest-pagetext-skins' => 'テストを実行する外装を選択してください:',
 'javascripttest-qunit-intro' => 'mediawiki.org上の[$1 テストのドキュメント]を参照してください。',
 'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit テストスイート',
 
@@ -3256,7 +3256,7 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 'spamprotectiontitle' => 'スパム防御フィルター',
 'spamprotectiontext' => '保存しようとした文章はスパムフィルターによってブロックされました。
 これはおそらく、ブラックリストにある外部サイトへのリンクが原因で発生します。',
-'spamprotectionmatch' => '以下の文章はスパムフィルターが発動したものです$1',
+'spamprotectionmatch' => '以下の文章はスパムフィルターが発動したものです$1',
 'spambot_username' => 'MediaWikiスパム除去',
 'spam_reverting' => '$1へのリンクを含まない最新の版に差し戻し',
 'spam_blanking' => 'すべての版が$1へのリンクを含んでいます。白紙化します。',
@@ -3407,11 +3407,11 @@ $1',
 'just-now' => 'ちょうど今',
 
 # Bad image list
-'bad_image_list' => '書式は以下の通りです
+'bad_image_list' => '書式は以下の通りです:
 
-箇条書き項目(*で始まる行)のみが考慮されます。
-各行最初のリンクは、好ましくないファイルへのリンクとしてください。
\90\8cã\81\98è¡\8cã\81§それ以降にあるリンクは例外、つまりインライン挿入されてもいいページと見なされます。',
+箇条書き項目 (*で始まる行) のみが考慮されます。
+各行の最初のリンクは、好ましくないファイルへのリンクにしてください。
\90\8cã\81\98è¡\8cã\81®それ以降にあるリンクは例外、つまりインライン挿入されてもいいページと見なされます。',
 
 /*
 Short names for language variants used for language conversion links.
@@ -3579,7 +3579,7 @@ Variants for Chinese language
 'exif-gpslongitude' => '経度',
 'exif-gpsaltituderef' => '高度の基準',
 'exif-gpsaltitude' => '高度',
-'exif-gpstimestamp' => 'GPS日時(原子時計)',
+'exif-gpstimestamp' => 'GPS日時 (原子時計)',
 'exif-gpssatellites' => '測位に用いた衛星信号',
 'exif-gpsstatus' => 'GPS受信機の状態',
 'exif-gpsmeasuremode' => 'GPSの測位方法',
@@ -3644,7 +3644,7 @@ Variants for Chinese language
 'exif-label' => 'ラベル',
 'exif-datetimemetadata' => 'メタデータの最終更新日',
 'exif-nickname' => '画像の非公式名',
-'exif-rating' => '評価(5点満点)',
+'exif-rating' => '評価 (5点満点)',
 'exif-rightscertificate' => '権利管理証明書',
 'exif-copyrighted' => '著作権情報',
 'exif-copyrightowner' => '著作権者',
@@ -3924,26 +3924,26 @@ Variants for Chinese language
 $3
 
 もしアカウントの登録をした覚えがない場合は、
-次のURLをブラウザーで開いて、メールアドレスの確認を中止してください:
+次のURLをブラウザーで開いて、メールアドレスの確認をキャンセルしてください:
 
 $5
 
 この確認用コードは、$4に期限切れになります。',
-'confirmemail_body_changed' => '誰か(おそらくあなた)が IP アドレス $1 から、
+'confirmemail_body_changed' => '誰か (おそらくあなた) が IP アドレス $1 から、
 {{SITENAME}} のアカウント「$2」のメールアドレスをこのアドレスに変更しました。
 
 このアカウントが本当にあなたのものであれば、以下のリンクをブラウザーで開いて、
-{{SITENAME}} のメール機能を再び有効にしてください
+{{SITENAME}} のメール機能を再び有効にしてください:
 
 $3
 
 もしあなたのアカウント *ではない* 場合は、
-ブラウザーで以下のリンクを開いて、メールアドレスの確認をキャンセルしてください
+ブラウザーで以下のリンクを開いて、メールアドレスの確認をキャンセルしてください:
 
 $5
 
 この確認コードは $4 に期限切れになります。',
-'confirmemail_body_set' => '誰か(おそらくあなた)が IP アドレス $1 から
+'confirmemail_body_set' => '誰か (おそらくあなた) が IP アドレス $1 から
 {{SITENAME}} のアカウント「$2」のメールアドレスをこのアドレスに設定しました。
 
 このアカウントが本当にあなたのものであれば、以下のリンクをブラウザーで開いて、
@@ -3952,7 +3952,7 @@ $5
 $3
 
 もしあなたのアカウントではない場合は、
-次のリンクをブラウザーで開いて、メールアドレスの確認をキャンセルしてください
+次のリンクをブラウザーで開いて、メールアドレスの確認をキャンセルしてください:
 
 $5
 
@@ -4126,7 +4126,7 @@ $5
 'hebrew-calendar-m12-gen' => 'エルール',
 
 # Signatures
-'signature' => '[[{{ns:user}}:$1|$2]]([[{{ns:user_talk}}:$1|トーク]])',
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|トーク]])',
 
 # Core parser functions
 'unknown_extension_tag' => '不明な拡張機能タグ「$1」です',
@@ -4153,11 +4153,11 @@ $5
 'version-poweredby-credits' => "このウィキは、'''[//www.mediawiki.org/ MediaWiki]'''(copyright © 2001-$1 $2)で動作しています。",
 'version-poweredby-others' => 'その他',
 'version-credits-summary' => '[[Special:Version|MediaWiki]] に貢献した以下の人たちに感謝します。',
-'version-license-info' => 'MediaWikiはフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行するGNU一般公衆利用許諾書 (GNU General Public License)(バージョン2、またはそれ以降のライセンス)の規約に基づき、このライブラリを再配布および改変できます。
+'version-license-info' => 'MediaWikiはフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行するGNU一般公衆利用許諾書 (GNU General Public License) (バージョン2、またはそれ以降のライセンス) の規約に基づき、このライブラリを再配布および改変できます。
 
 MediaWikiは、有用であることを期待して配布されていますが、商用あるいは特定の目的に適するかどうかも含めて、暗黙的にも、一切保証されません。詳しくは、GNU一般公衆利用許諾書をご覧ください。
 
-あなたはこのプログラムと共に、[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU一般公衆利用許諾契約書の複製]を受け取ったはずです。もし受け取っていなければ、フリーソフトウェア財団(the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA)まで請求するか、[//www.gnu.org/licenses/old-licenses/gpl-2.0.html オンラインで閲覧]してください。',
+あなたはこのプログラムと共に、[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU一般公衆利用許諾契約書の複製]を受け取ったはずです。受け取っていない場合は、フリーソフトウェア財団 (the Free Software Foundation, Inc., 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' => 'バージョン',
@@ -4209,8 +4209,8 @@ MediaWikiは、有用であることを期待して配布されていますが
 
 # External image whitelist
 'external_image_whitelist' => '  #この行はこのままにしておいてください<pre>
-#この下に正規表現(//の間に入る記述)を置いてください
-#外部の(ホットリンクされている)画像の URL と一致するか検査されます
+#この下に正規表現 (//の間に入る記述) を置いてください
+#外部の (ホットリンクされている) 画像の URL と一致するか検査されます
 #一致する場合は画像として、一致しない場合は画像へのリンクとして表示されます
 #行の頭に # を付けるとコメントとして扱われます
 #大文字と小文字は区別されません
@@ -4219,7 +4219,7 @@ MediaWikiは、有用であることを期待して配布されていますが
 
 # Special:Tags
 'tags' => '有効な変更タグ',
-'tag-filter' => '[[Special:Tags|タグ]]絞り込み',
+'tag-filter' => '[[Special:Tags|タグ]]絞り込み:',
 'tag-filter-submit' => '絞り込み',
 'tags-title' => 'タグ',
 'tags-intro' => 'このページは、ソフトウェアが編集に対して付けるタグとその意味の一覧です。',
@@ -4265,19 +4265,19 @@ MediaWikiは、有用であることを期待して配布されていますが
 'htmlform-selectorother-other' => 'その他',
 
 # SQLite database support
-'sqlite-has-fts' => '$1(全文検索あり)',
-'sqlite-no-fts' => '$1(全文検索なし)',
+'sqlite-has-fts' => '$1 (全文検索あり)',
+'sqlite-no-fts' => '$1 (全文検索なし)',
 
 # New logging system
 'logentry-delete-delete' => '$1 がページ「$3」を削除しました',
 'logentry-delete-restore' => '$1 がページ「$3」を復元しました',
-'logentry-delete-event' => '$1 が$3の{{PLURAL:$5|記録項目$5件}}の閲覧レベルを変更しました$4',
-'logentry-delete-revision' => '$1 がページ「$3」の{{PLURAL:$5|$5版}}の閲覧レベルを変更しました$4',
+'logentry-delete-event' => '$1 が$3の{{PLURAL:$5|記録項目$5件}}の閲覧レベルを変更しました$4',
+'logentry-delete-revision' => '$1 がページ「$3」の{{PLURAL:$5|$5版}}の閲覧レベルを変更しました$4',
 'logentry-delete-event-legacy' => '$1 が「$3」の記録項目の閲覧レベルを変更しました',
 'logentry-delete-revision-legacy' => '$1 がページ「$3」の版の閲覧レベルを変更しました',
 'logentry-suppress-delete' => '$1 がページ「$3」を隠蔽しました',
-'logentry-suppress-event' => '$1 が$3の{{PLURAL:$5|記録項目$5件}}の閲覧レベルを見えない形で変更しました$4',
-'logentry-suppress-revision' => '$1 がページ「$3」の{{PLURAL:$5|$5版}}の閲覧レベルを見えない形で変更しました$4',
+'logentry-suppress-event' => '$1 が$3の{{PLURAL:$5|記録項目$5件}}の閲覧レベルを見えない形で変更しました$4',
+'logentry-suppress-revision' => '$1 がページ「$3」の{{PLURAL:$5|$5版}}の閲覧レベルを見えない形で変更しました$4',
 'logentry-suppress-event-legacy' => '$1 が$3で記録項目の閲覧レベルを見えない形で変更しました',
 'logentry-suppress-revision-legacy' => '$1 がページ「$3」の版の閲覧レベルを見えない形で変更しました',
 'revdelete-content-hid' => '本文の不可視化',
@@ -4307,8 +4307,8 @@ MediaWikiは、有用であることを期待して配布されていますが
 # Feedback
 'feedback-bugornote' => '技術的な問題の詳細を説明する準備ができている場合は、[$1 バグ報告]をお願いします。
 準備ができていない場合は、下の簡易フォームを使用してください。あなたのコメントと利用者名が、ページ「[$3 $2]」に追加されます。',
-'feedback-subject' => '件名',
-'feedback-message' => 'メッセージ',
+'feedback-subject' => '件名:',
+'feedback-message' => 'メッセージ:',
 'feedback-cancel' => 'キャンセル',
 'feedback-submit' => 'フィードバックを送信',
 'feedback-adding' => 'ページへのフィードバックの追加...',
index 8fd65db..97bb77b 100644 (file)
@@ -3306,7 +3306,7 @@ $1',
 'exif-lens' => 'გამოყენებული ლინზა',
 'exif-serialnumber' => 'კამერის სერიული ნომერი',
 'exif-cameraownername' => 'კამერის მფლობელი',
-'exif-label' => 'á\83\98á\83\90á\83 á\83\9aá\83\98á\83§ი',
+'exif-label' => 'á\83¡á\83\90á\83®á\83\94á\83\9aი',
 'exif-datetimemetadata' => 'მეტამონაცემების ბოლო ცვლილების თარიღი',
 'exif-nickname' => 'სურათის არაფორმალური სახელი',
 'exif-rating' => 'რეიტინგი (5-დან)',
index 4fc3915..8470efd 100644 (file)
@@ -2620,7 +2620,7 @@ $UNWATCHURL
 'undeletehistory' => '문서를 되살리면 모든 역사가 같이 복구됩니다.
 문서가 삭제된 뒤 같은 이름의 문서가 만들어졌다면, 복구되는 역사는 지금 역사의 과거 부분에 나타날 것입니다.',
 'undeleterevdel' => '복구하려는 문서의 최신판이 삭제되어 있는 경우 문서를 복구시킬 수 없습니다.
-이러한 경우, 삭제된 최신판 문서의 체크박스를 선택 해제하거나 숨김을 해제해야 합니다.',
+이러한 경우 삭제된 최신판 문서의 확인 상자를 선택 해제하거나 숨김을 해제해야 합니다.',
 'undeletehistorynoadmin' => '이 문서는 삭제되었습니다.
 삭제된 이유와 삭제되기 전에 이 문서를 편집한 사용자가 아래에 나와 있습니다.
 삭제된 문서의 내용을 보려면 관리자 권한이 필요합니다.',
@@ -3247,7 +3247,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'pageinfo-authors' => '총 서로 다른 편집자 수',
 'pageinfo-recent-edits' => '최근 편집 수 (지난 $1 이내)',
 'pageinfo-recent-authors' => '최근 기여자 수',
-'pageinfo-magic-words' => '매직 {{PLURAL:$1|워드}} ($1개)',
+'pageinfo-magic-words' => '특수 {{PLURAL:$1|명령}} ($1개)',
 'pageinfo-hidden-categories' => '숨은 {{PLURAL:$1|분류}} ($1개)',
 'pageinfo-templates' => '포함한 {{PLURAL:$1|틀}} ($1개)',
 'pageinfo-transclusions' => '포함한 {{PLURAL:$1|문서}} ($1개)',
@@ -3933,7 +3933,7 @@ $5
 'watchlistedit-normal-title' => '주시문서 목록 편집하기',
 'watchlistedit-normal-legend' => '주시문서 목록에서 문서 제거하기',
 'watchlistedit-normal-explain' => '주시문서 목록에 있는 문서의 제목이 아래에 나열되어 있습니다.
-주시문서 목록에서 제거하려는 문서가 있으면, 각 항목의 체크박스를 선택한 다음 "{{int:Watchlistedit-normal-submit}}"를 클릭해주세요.
+주시문서 목록에서 제거하려는 문서가 있으면 각 항목의 확인 상자를 선택한 다음 "{{int:Watchlistedit-normal-submit}}"를 클릭해주세요.
 또는 [[Special:EditWatchlist/raw|목록을 직접 편집]]할 수도 있습니다.',
 'watchlistedit-normal-submit' => '항목 삭제',
 'watchlistedit-normal-done' => '주시문서 목록에서 다음 {{PLURAL:$1|항목}}을 주시하지 않습니다:',
index 346dd04..e7a1a67 100644 (file)
@@ -1969,6 +1969,20 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
 'siteusers' => '{{PLURAL:$2|usor|usores}} {{grammar:genitive|{{SITENAME}}}} $1',
 'creditspage' => 'Auctores paginae',
 
+# Info page
+'pageinfo-title' => 'Res quae ad "$1" pertinent',
+'pageinfo-header-basic' => 'De hac pagina',
+'pageinfo-display-title' => 'Titulus ut in pagina ipsa monstratur',
+'pageinfo-length' => 'Magnitudo paginae (octeti)',
+'pageinfo-article-id' => 'Identificatio paginis',
+'pageinfo-language' => 'Lingua verborum in pagina',
+'pageinfo-firstuser' => 'Creator paginae',
+'pageinfo-firsttime' => 'Dies et tempus creationis paginae',
+'pageinfo-lastuser' => 'Usor qui ultimam recensionem fecit',
+'pageinfo-lasttime' => 'Dies ultimae emendationis',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria celata|Categoriae celatae}} ($1)',
+'pageinfo-toolboxlink' => 'De hac pagina',
+
 # Skin names
 'skinname-standard' => 'Norma',
 'skinname-cologneblue' => 'Caerulus Colonia',
index 050dc83..fd1d848 100644 (file)
@@ -1319,7 +1319,7 @@ Fenoy araka ny datin'ny solosainan'ny mpitsidika",
 'timezoneregion-europe' => 'Eoropa',
 'timezoneregion-indian' => 'Ranomasimbe Indianina',
 'timezoneregion-pacific' => 'Ranomasimbe Pasifika',
-'allowemail' => "Ekeo ny handraisana imailaka avy amin'ny mpikambana hafa",
+'allowemail' => "Hanaiky ny fandefasana mailaka avy amin'ny mpikambana hafa",
 'prefs-searchoptions' => 'Karoka',
 'prefs-namespaces' => "Toeran'anarana",
 'defaultns' => "Fikarohana tsipalotra anatin'ireo anaran-tsehatra ireo :",
index bc0b926..29a9ad8 100644 (file)
@@ -30,7 +30,7 @@ $messages = array(
 'tog-hideminor' => 'Suruakkan suntingan ketek di parubahan tabaru',
 'tog-hidepatrolled' => 'Suruakkan suntingan nan lah dijago di parubahan tabaru',
 'tog-newpageshidepatrolled' => 'Suruakkan laman nan lah dijago dari dafta laman baru',
-'tog-extendwatchlist' => 'Kambangkan dafta pantauan untuak malihek sado parubahan, indak nan baru se',
+'tog-extendwatchlist' => 'Kambangkan dafta pantau untuak malihek sado parubahan, indak nan baru se',
 'tog-usenewrc' => 'Gunokan tampilan parubahan tingkek lanjuik (paralu JavaScript)',
 'tog-numberheadings' => 'Agiah nomor judua sacaro otomatis',
 'tog-showtoolbar' => 'Tampilkan bilah suntiang (paralu JavaScript)',
@@ -39,16 +39,16 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Hiduikkan bagian panyuntiangan jo mangklik kanan pado judul bagian (paralu JavaScript)',
 'tog-showtoc' => 'Tunjuakkan dafta isi (untuak laman nan labiah dari 3 subbagian)',
 'tog-rememberpassword' => 'Ingek log masuak denai di paramban ko (salamo $1 {{PLURAL:$1|hari}})',
-'tog-watchcreations' => 'Tambahkan laman nan den buek jo gambar nan den unggah ka dafta pantauan',
-'tog-watchdefault' => 'Tambahkan laman jo gamba nan den suntiang ka dafta pantauan',
-'tog-watchmoves' => 'Tambahkan laman jo gamba nan den pindah ka dafta pantauan',
-'tog-watchdeletion' => 'Tambahkan laman jo gamba nan den hapuih ka dafta pantauan',
+'tog-watchcreations' => 'Tambahkan laman nan den buek jo gambar nan den unggah ka dafta pantau',
+'tog-watchdefault' => 'Tambahkan laman jo gamba nan den suntiang ka dafta pantau',
+'tog-watchmoves' => 'Tambahkan laman jo gamba nan den pindah ka dafta pantau',
+'tog-watchdeletion' => 'Tambahkan laman jo gamba nan den hapuih ka dafta pantau',
 'tog-minordefault' => 'Tandoi sadoalah suntiangan sabagai suntiangan ketek sacaro baku',
 'tog-previewontop' => 'Tampilkan pratonton sabalun kotak suntiang',
 'tog-previewonfirst' => 'Tunjuakkan pratonton pado suntiangan patamo',
 'tog-nocache' => 'Matikan panyinggahan laman paramban',
-'tog-enotifwatchlistpages' => 'Kirimkan surel, kalau laman atau gambar pado daftar pantauan den lah barubah',
-'tog-enotifusertalkpages' => "Kirimkan denai surel ko' laman diskusi den lah barubah",
+'tog-enotifwatchlistpages' => 'Kirimkan surel, kok laman atau gambar pado dafta pantau Ambo lah barubah',
+'tog-enotifusertalkpages' => 'Kirimkan surel, koq laman diskusi Ambo lah barubah',
 'tog-enotifminoredits' => 'Kirimkan surel juo untuk saketek suntingan pado laman jo gambar',
 'tog-enotifrevealaddr' => 'Tunjuakkan alamaik surel ambo pado pambaritauan surel',
 'tog-shownumberswatching' => 'Tunjuakkan jumlah pamantau',
@@ -59,13 +59,13 @@ $messages = array(
 'tog-showjumplinks' => 'Aktifkan tautan pambantu "langsuang ka"',
 'tog-uselivepreview' => 'Gunokan pratayang langsuang (JavaScript) (eksperimental)',
 'tog-forceeditsummary' => 'Ingekkan awak bilo kotak ringkasan suntiangan masih kosoang',
-'tog-watchlisthideown' => 'Suruakkan suntiangan surang di dafta pantauan',
-'tog-watchlisthidebots' => 'Suruakkan suntiangan bot di dafta pantauan',
-'tog-watchlisthideminor' => 'Suruakkan suntiangan ketek di dafta pantauan',
-'tog-watchlisthideliu' => 'Suruakkan suntiangan pangguno masuak log di dafta pantauan',
-'tog-watchlisthideanons' => 'Suruakkan suntiangan pangguno indak di kana di dafta pantauan',
-'tog-watchlisthidepatrolled' => 'Suruakkan suntiangan tapatroli di dafta pantauan',
-'tog-ccmeonemails' => 'Kiriman awak salinan surel nan dikiriman ka urang lain',
+'tog-watchlisthideown' => 'Suruakkan suntiangan surang di dafta pantau',
+'tog-watchlisthidebots' => 'Suruakkan suntiangan bot di dafta pantau',
+'tog-watchlisthideminor' => 'Suruakkan suntiangan ketek di dafta pantau',
+'tog-watchlisthideliu' => 'Suruakkan suntiangan pangguno masuak log di dafta pantau',
+'tog-watchlisthideanons' => 'Suruakkan suntiangan pangguno indak di kana di dafta pantau',
+'tog-watchlisthidepatrolled' => 'Suruakkan suntiangan tapatroli di dafta pantau',
+'tog-ccmeonemails' => 'Kiriman Ambo salinan surel nan dikiriman ka urang lain',
 'tog-diffonly' => 'Jan tampilan isi laman di bawah pabedoan suntiangan',
 'tog-showhiddencats' => 'Tampilan kategori tasambunyi',
 'tog-norollbackdiff' => 'Jan tampilan pabedoan sasudah malakukan pangambalian',
@@ -240,20 +240,20 @@ $messages = array(
 'viewtalkpage' => 'Caliak laman diskusi',
 'otherlanguages' => 'Dalam bahaso lain',
 'redirectedfrom' => '(Dialiahkan dari $1)',
-'redirectpagesub' => 'Laman pengalihan',
+'redirectpagesub' => 'Laman pangaliahan',
 'lastmodifiedat' => 'Laman ko taakia diubah pado $2, $1.',
-'viewcount' => 'Laman iko alah diakses sabanyak {{PLURAL:$1|ciek kali|$1 kali}}.<br />',
-'protectedpage' => 'Laman nan dilindungi',
+'viewcount' => 'Laman ko lah dicaliak {{PLURAL:$1|$1 kali}}.',
+'protectedpage' => 'Laman nan dilinduangi',
 'jumpto' => 'Lompek ka:',
 'jumptonavigation' => 'pinteh',
 'jumptosearch' => 'cari',
-'view-pool-error' => 'Maaf, server sadang sibuak pado kini ko.
-Talalu banyak pangguno barusaho mancaliak laman ko.
-Tunggu sabanta sabalum Sanak mancubo baliak mangakses laman ko.
+'view-pool-error' => 'Maaf, server sadang kalabiahan baban.
+Banyak bana nan barusaho mancaliak laman ko.
+Tunggu santa koq nio mancubo baliak ka laman ko.
 
 $1',
-'pool-timeout' => 'Lewat waktu manunggu kunci',
-'pool-queuefull' => 'Kumpulan antrean panuah',
+'pool-timeout' => 'Abih wakatu',
+'pool-queuefull' => 'Antrian panuah',
 'pool-errorunknown' => 'Kasalahan nan indak dikatahui',
 
 # 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).
@@ -266,7 +266,7 @@ $1',
 'disclaimers' => 'Sanggah',
 'disclaimerpage' => 'Project:Sanggahan umum',
 'edithelp' => 'Bantuan suntiangan',
-'edithelppage' => 'Help:Suntingan',
+'edithelppage' => 'Help:Panyuntiangan',
 'helppage' => 'Help:Isi',
 'mainpage' => 'Palanta',
 'mainpage-description' => 'Palanta',
@@ -302,7 +302,7 @@ $1',
 'editlink' => 'suntiang',
 'viewsourcelink' => 'caliak sumber',
 'editsectionhint' => 'Suntiang bagian: $1',
-'toc' => 'Daftar isi',
+'toc' => 'Dafta isi',
 'showtoc' => 'tampilkan',
 'hidetoc' => 'suruakkan',
 'collapsible-collapse' => 'Ketekan',
@@ -503,7 +503,7 @@ Untuak manghindari panyalahgunoan, hanyo ciek kato sandi nan akan dikiriman sati
 'mailerror' => 'Kasalahan dalam mangirimkan surel: $1',
 'acct_creation_throttle_hit' => 'Pangunjung wiki iko jo alamaik IP nan samo jo Sanak alah mambuek {{PLURAL:$1|1 akun|$1 akun}} dalam sahari tarakhir, hinggo jumlah maksimum nan diizinan.
 Karanonyo, pangunjuang jo alamaik IP iko indak dapek baliak mambuek akun lain untuak samantaro.',
-'emailauthenticated' => 'Alamaik surel Sanak alah dikonfirmasi pado $3, $2.',
+'emailauthenticated' => 'Alamaik surel Sanak lah dikonfirmasi pado $3, $2.',
 'emailnotauthenticated' => 'Alamaik surel Sanak alum dikonfirmasi. Sabalun dikonfirmasi Sanak ndak bisa manggunokan fitur surel.',
 'noemailprefs' => 'Sanak harus mamasukan alamaik surel di preferensi Sanak untuak dapek manggunokan fitur-fitur iko.',
 'emailconfirmlink' => 'Konfirmasikan alamaik surel Sanak',
@@ -902,14 +902,23 @@ Rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAME
 'pagehist' => 'Riwayaik laman',
 'revdelete-otherreason' => 'Alasan lain/tambahan:',
 'revdelete-reasonotherlist' => 'Alasan lain',
+'revdelete-edit-reasonlist' => 'Alasan mangapuih laman',
+
+# History merging
+'mergehistory-reason' => 'Alasan:',
 
 # Merge log
+'mergelog' => 'Log panggabuangan',
 'revertmerge' => 'Batal gabuang',
 
 # Diffs
 'history-title' => 'Riwayaik revisi dari "$1"',
+'difference-title' => 'Pabedoan antaro revisi dari "$1"',
+'difference-title-multipage' => 'Pabedoan antaro laman "$1" jo "$2"',
+'difference-multipage' => '(Pabedoan antaro laman)',
 'lineno' => 'Barih $1:',
 'compareselectedversions' => 'Bandiangan versi tapiliah',
+'showhideselectedversions' => 'Tampilkan/suruakan versi tapiliah',
 'editundo' => 'batal',
 'diff-multi' => '({{PLURAL:$1|$1 revisi antaro}} oleh {{PLURAL:$2|$2 pangguno}} indak ditampilkan)',
 
@@ -917,19 +926,23 @@ Rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAME
 'searchresults' => 'Hasil pancarian',
 'searchresults-title' => 'Hasil pancarian untuak "$1"',
 'searchresulttext' => 'Untuak informasi labiah lanjuik tantang pancarian {{SITENAME}}, caliak [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => 'Awak mancari \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|sado laman yang dimulai jo "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|sado laman nan tapauik ka "$1"]])',
-'searchsubtitleinvalid' => "Awak mancari '''$1'''",
+'searchsubtitle' => 'Sanak mancari \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|sado laman nan dimulai jo "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|sado laman nan tapauik ka "$1"]])',
+'searchsubtitleinvalid' => "Sanak mancari '''$1'''",
+'titlematches' => 'Judul laman pas',
 'notitlematches' => 'Indak ado judul nan pas',
+'textmatches' => 'Teks laman pas',
 'notextmatches' => 'Indak ado judul nan pas',
 'prevn' => '{{PLURAL:$1|$1}} sabalunnyo',
-'nextn' => '{{PLURAL:$1|$1}} salanjuiknyo',
+'nextn' => '{{PLURAL:$1|$1}} barikuiknyo',
 'prevn-title' => '$1 {{PLURAL:$1|hasil}} sabalunnyo',
 'nextn-title' => '$1 {{PLURAL:$1|hasil}} barikuiknyo',
 'shown-title' => 'Tampilkan $1 {{PLURAL:$1|hasil}} per laman',
 'viewprevnext' => 'Caliakkan ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-legend' => 'Atua pancarian',
 'searchmenu-exists' => "'''Ado laman nan banamo \"[[:\$1]]\" pado wiki ko.'''",
 'searchmenu-new' => "'''Buek laman \"[[:\$1]]\" di wiki ko!'''",
 'searchhelp-url' => 'Help:Isi',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Cari laman jo awalan ko]]',
 'searchprofile-articles' => 'Laman isi',
 'searchprofile-project' => 'Laman Bantuan jo Proyek',
 'searchprofile-images' => 'Multimedia',
@@ -948,7 +961,10 @@ Rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAME
 'search-suggest' => 'Mungkin makasuiknyo: $1',
 'search-interwiki-caption' => 'Proyek badunsanak',
 'search-interwiki-default' => 'Hasil $1:',
-'search-interwiki-more' => '(selanjutnyo)',
+'search-interwiki-more' => '(salanjuiknyo)',
+'search-relatedarticle' => 'Bakaitan',
+'mwsuggest-disable' => 'Matian saran pancarian',
+'searcheverything-enable' => 'Cari di sagalo ruang namo',
 'searchrelated' => 'bakaitan',
 'searchall' => 'sado',
 'showingresults' => "Di bawah ko dikaluaan sampai {{PLURAL:$1|'''$1''' hasil}}, dimulai dari #'''$2'''.",
@@ -969,6 +985,7 @@ Cubo awali permintaan awak tu jo ''all:'' untuak mancari sado kandungan (tamasua
 # Preferences page
 'preferences' => 'Pangaturan',
 'mypreferences' => 'Pangaturan',
+'prefs-edits' => 'Jumlah suntiangan:',
 'prefsnologintext' => 'Sanak musti <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} masuak log]</span> untuak mengeset pangaturan.',
 'changepassword' => 'Tuka kato sandi',
 'prefs-skin' => 'Kulik',
@@ -980,10 +997,10 @@ Cubo awali permintaan awak tu jo ''all:'' untuak mancari sado kandungan (tamasua
 'prefs-user-pages' => 'Laman pangguno',
 'prefs-personal' => 'Profil pangguno',
 'prefs-rc' => 'Parubahan tabaru',
-'prefs-watchlist' => 'Dafta pantauan',
-'prefs-watchlist-days' => 'Lamonyo dalam daftar pantauan:',
+'prefs-watchlist' => 'Dafta pantau',
+'prefs-watchlist-days' => 'Lamonyo dalam dafta pantau:',
 'prefs-watchlist-days-max' => 'Maksimum $1 {{PLURAL:$1|hari}}',
-'prefs-watchlist-edits' => 'Jumlah suntiangan maksimum nan ditampilkan di dafta pantauan nan labiah langkok:',
+'prefs-watchlist-edits' => 'Jumlah suntiangan maksimum nan ditampilkan didafta pantaun nan labiah langkok:',
 'prefs-watchlist-edits-max' => 'Nilai maksimum: 1000',
 'prefs-watchlist-token' => 'Token pantauan:',
 'prefs-misc' => 'Lain-lain',
@@ -994,7 +1011,7 @@ Cubo awali permintaan awak tu jo ''all:'' untuak mancari sado kandungan (tamasua
 'prefs-rendering' => 'Tampilan',
 'saveprefs' => 'Simpan',
 'resetprefs' => 'Batalan parubahan',
-'restoreprefs' => 'Baliakkan ka setelan bawaan',
+'restoreprefs' => 'Baliakan ka setelan awal',
 'prefs-editing' => 'Panyuntiangan',
 'prefs-edit-boxsize' => 'Ukuran kotak panyuntiangan.',
 'rows' => 'Barih:',
@@ -1007,8 +1024,8 @@ Cubo awali permintaan awak tu jo ''all:'' untuak mancari sado kandungan (tamasua
 'recentchangesdays-max' => 'Maksimum $1 {{PLURAL:$1|hari}}',
 'recentchangescount' => 'Standar jumlah suntiangan nan ditampilkan:',
 'prefs-help-recentchangescount' => 'Iko untuak parubahan tabaru, riwayaik laman nan lalu, sarato log.',
-'prefs-help-watchlist-token' => 'Mangisi kotak ko jo kunci rasio (PIN) akan manghasilkan sindikasi RSS untuak dafta pantauan Angku. Sia juo nan tau jo kunci ko dapek mambaco dafta pantauan Angku, jadi hati-hatilah mamiliah nilainyo 
-Barikuik ko nilai acak nan dapek Angku gunoan: $1',
+'prefs-help-watchlist-token' => 'Mangisi kotak ko jo kunci rasio (PIN) akan manghasilkan sindikasi RSS untuak dafta pantau Sanak. Sia juo nan tau jo kunci ko dapek mambaco dafta pantau Sanak, jadi hati-hatilah mamiliah nilainyo. 
+Barikuik ko nilai acak nan dapek Sanak gunoan: $1',
 'savedprefs' => 'Pangaturan lah tasimpan',
 'timezonelegend' => 'Zona wakatu:',
 'localtime' => 'Wakatu satampaik:',
@@ -1035,13 +1052,15 @@ Barikuik ko nilai acak nan dapek Angku gunoan: $1',
 'prefs-files' => 'Berkas',
 'prefs-custom-css' => 'CSS pribadi',
 'prefs-custom-js' => 'JS pribadi',
-'prefs-common-css-js' => 'CSS/JS babagi untuak sado kulik:',
+'prefs-common-css-js' => 'CSS/JS untuak kasado kulik:',
 'prefs-reset-intro' => 'Angku dapek manggunokan laman ko untuak mangambalikan pangaturan ka setelan baku situs ko.
 Pangambalian pangaturan indak dapek dibatalan.',
 'prefs-emailconfirm-label' => 'Surel konfirmasi:',
 'prefs-textboxsize' => 'Ukuran kotak suntiang',
 'youremail' => 'Surel:',
 'username' => '{{GENDER:$1|Namo pangguno}}:',
+'uid' => 'ID {{GENDER:$1|pangguno}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Anggota}} {{PLURAL:$1|kalompok}}:',
 'prefs-registration' => 'Wakatu pandaftaran:',
 'yourrealname' => 'Namo sabananyo:',
 'yourlanguage' => 'Bahaso',
@@ -1060,7 +1079,7 @@ Jan labiah dari $1 {{PLURAL:$1|karakter}}.',
 'email' => 'Surel',
 'prefs-help-realname' => "Namo asli sifaiknyo opsional.
 Jiko' Angku manambahkannyo, namo asli Angku akan digunoan untuak mengenal hasil karaja Angku.",
-'prefs-help-email' => 'Alamaik surel ko hanyo tambahan se, namun paralu untuak maulang kato kunci, jikok Sanak lupo kato kunci.',
+'prefs-help-email' => "Alamaik surel ko hanyolah tambahan, tapi paralu untuak ma-''reset'' kato sandi, bilo Sanak lupo kato sandi.",
 'prefs-help-email-others' => 'Sanak dapek mamiliah untuak mangizinkan urang lain manghubungi jo surel malalui laman pangguno atau laman diskusi.
 Alamaik surel tu indakkan tau dek urang nan manghubungi sanak tu.',
 'prefs-help-email-required' => 'Alamaik surel wajib diisi.',
@@ -1159,7 +1178,7 @@ Alamaik surel tu indakkan tau dek urang nan manghubungi sanak tu.',
 'recentchangeslinked-title' => 'Parubahan nan takaik jo "$1"',
 'recentchangeslinked-noresult' => 'Indak ado parubahan pado laman nan tapauik salamo periode nan ditantuan',
 'recentchangeslinked-summary' => "Iko dafta parubahan tarakhir pado laman nan tahubuang dari laman tatantu (atau anggota dari kategori tatantu).
-Laman pado [[Special:Watchlist|pantauan Sanak]] ditandoi jo '''cetak taba'''.",
+Laman pado [[Special:Watchlist|dafta pantau Sanak]] ditandoi jo '''cetak taba'''.",
 'recentchangeslinked-page' => 'Namo laman:',
 'recentchangeslinked-to' => 'Tampilkan parubahan dari laman nan takaik jo laman nan ko',
 
@@ -1182,6 +1201,12 @@ Laman pado [[Special:Watchlist|pantauan Sanak]] ditandoi jo '''cetak taba'''.",
 'filetype-mime-mismatch' => 'Ekstensi berkas ".$1" indak cocok jo MIME nan tadeteksi dari berkas ($2).',
 'filetype-badmime' => 'Berkas batipe MIME "$1" indak buliah dimuek.',
 'filetype-bad-ie-mime' => 'Indak dapek mamuek berkas dek Internet Explorer mandeteksinyo sabagai "$1", nan indak diizinkan dan marupokan tipe berkas bapotensi bahayo.',
+'fileexists-thumbnail-yes' => "Berkas ko nampaknyo marupoan gambar nan ukurannyo dipaketek ''(miniatua)''. [[$1|thumb]]
+Cubo pareso berkas <strong>[[:$1]]</strong> tasabuik.
+Koq berkas tu samemang marupoan gambar dalam ukuran aslinyo, Sanak indak paralu untuak mamuak baliak miniatur lainnyo.",
+'file-thumbnail-no' => "Namo berkas dimulai jo <strong>$1</strong>.
+Nampaknyo berkas ko marupoan gambar jo ukuran dipaketek ''(miniatua)''.
+Koq Sanak ado versi resolusi panuah dari gambar ko, cubolah muekan berkas tasabuik. Koq indak, harap ubah namo berkas ko.",
 'uploadedimage' => 'muek "[[$1]]"',
 
 'license' => 'Lisensi:',
@@ -1221,17 +1246,57 @@ Informasi dari [$2 laman katarangannyo] ado di bawah.',
 
 # Statistics
 'statistics' => 'Statistik',
-
+'statistics-header-pages' => 'Statistik laman',
+'statistics-header-edits' => 'Statistik suntiangan',
+'statistics-header-views' => 'Statistik tampilan',
+'statistics-header-users' => 'Statistik pangguno',
+'statistics-header-hooks' => 'Statistik lainnyo',
+'statistics-articles' => 'Laman konten',
+'statistics-pages' => 'Jumlah laman',
+'statistics-pages-desc' => 'Sado laman pado wiki, tamasuak laman maota, pangaliahan, dll.',
+'statistics-files' => 'Berkas nan lah dimuek',
+'statistics-edits' => 'Jumlah suntiangan sangkek {{SITENAME}} ko dimulai',
+'statistics-edits-average' => 'Rato-rato suntiangan per-laman',
+'statistics-views-total' => 'Jumlah tampilan laman',
+'statistics-views-total-desc' => 'Tampilan ka laman nan indak ado jo laman khusus nan indak ikuik',
+'statistics-views-peredit' => 'Tampilan per-suntiangan',
+'statistics-users' => 'Jumlah [[Special:ListUsers|pangguno tadafta]]',
+'statistics-users-active' => 'Pangguno aktip',
+'statistics-users-active-desc' => 'Pangguno nan aktip dalam {{PLURAL:$1|$1 ari}} tarakhia.',
+'statistics-mostpopular' => 'Laman nan paliang banyak ditampilkan',
+
+'disambiguations' => 'Laman nan tahubuang ka laman disambiguasi',
 'disambiguationspage' => 'Template:sanamo',
 
+'doubleredirects' => 'Pangaliahan ganda',
+
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bita}}',
+'ncategories' => '$1 {{PLURAL:$1|kategori}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki}}',
+'nlinks' => '$1 {{PLURAL:$1|pautan}}',
 'nmembers' => '$1 {{PLURAL:$1|anggota}}',
+'nrevisions' => '$1 {{PLURAL:$1|revisi}}',
+'nviews' => 'dilihek $1 {{PLURAL:$1|kali}}',
+'nimagelinks' => 'Digunoan pado $1 {{PLURAL:$1|laman}}',
+'ntransclusions' => 'digunoan pado $1 {{PLURAL:$1|laman}}',
+'lonelypages' => 'Laman yatim',
 'prefixindex' => 'Sado laman jo awalan',
+'prefixindex-namespace' => 'Sado laman jo awalan (ruang namo $1)',
+'shortpages' => 'Laman pendek',
+'longpages' => 'Laman panjang',
+'deadendpages' => 'Laman buntu',
+'deadendpagestext' => 'Laman-laman ko indak ad pautan ka laman lain di {{SITENAME}}.',
+'protectedpages' => 'Laman nan dilinduangi',
+'usereditcount' => '$1 {{PLURAL:$1|suntiangan}}',
 'usercreated' => '{{GENDER:$3|Dibuek}} pado $1 pukua $2',
 'newpages' => 'Laman baru',
+'newpages-username' => 'Namo pangguno:',
+'ancientpages' => 'Laman paliang lamo',
 'move' => 'Pindah',
 'movethispage' => 'Pindahan laman ko',
+'unusedimagestext' => 'Berkas barikuik ado tapi indak takaik jo laman mana pun.
+Harap paratikan bahwa situs web lain mungkin ado tautan ka suatu berkas jo URL langsung, dan  masih tadafta di siko walaupun  indak digunoan aktif.',
 'pager-newer-n' => '{{PLURAL:$1|$1 labiah baru}}',
 'pager-older-n' => '{{PLURAL:$1|$1 labiah lamo}}',
 
@@ -1266,23 +1331,39 @@ Lihek pulo [[Special:WantedCategories|kategori nan diinginkan]].',
 'listgrouprights-members' => '(dafta anggota)',
 
 # E-mail user
-'emailuser' => 'Kirim surel pangguno ko',
+'emailuser' => 'Surel pangguno',
+'emailuser-title-target' => 'Kirim surel ka {{GENDER:$1|panggun}} ko',
+'emailuser-title-notarget' => 'Kirim surel',
+'emailpage' => 'Kirim surel ka pangguno ko',
 'emailpagetext' => 'Sanak dapek manggunoan formulir di bawah ko untuak mangirimkan surel ka {{GENDER:$1|pangguna}} ko.
 Alamaik surel nan Sanak masuakkan di [[Special:Preferences|pangaturan akun]] akan kalua sabagai alamaik "Dari" pado surel tasabuik, jadi panarimo dapek langsuang mambalehnyo.',
+'usermaildisabled' => 'Surel pangguno non-aktif',
+'emailtarget' => 'Masuakan namo pangguno nan ka manarimo surel',
+'emailusername' => 'Namo pangguno:',
+'emailusernamesubmit' => 'Kirim',
+'email-legend' => 'Kirim surel ka pangguno {{SITENAME}} lainnyo',
+'emailfrom' => 'Dari:',
+'emailto' => 'Untuak:',
+'emailsubject' => 'Perihal:',
+'emailmessage' => 'Pasan:',
+'emailsend' => 'Kirim',
+'emailccme' => 'Kirimkan denai salinan pasan.',
 
 # Watchlist
-'watchlist' => 'Daftapantau',
-'mywatchlist' => 'Daftapantau',
+'watchlist' => 'Dafta pantau',
+'mywatchlist' => 'Dafta pantau',
 'watchlistfor2' => 'Untuak $1 $2',
 'addedwatchtext' => "Laman \"[[:\$1]]\" lah ditambahkan ka [[Special:Watchlist|senarai pantauan awak]].
 Parubahan laman ko tamasuak laman otanyo akan ditampilkan dalam '''cetak taba''' pado [[Special:RecentChanges|senarai parubahan]] agar lebih mudah manjagonyo.",
-'removedwatchtext' => 'Laman "[[:$1]]" lah dihapuih dari [[Special:Watchlist|senarai pantauan awak]].',
+'removewatch' => 'Hapuih dari dafta pantau',
+'removedwatchtext' => 'Laman "[[:$1]]" lah dihapuih dari [[Special:Watchlist|dafta pantau Sanak]].',
 'watch' => 'Pantau',
 'watchthispage' => 'Pantau laman ko',
 'unwatch' => 'Batal pantau',
-'watchlist-details' => '{{PLURAL:$1|$1 laman}} dalam daftapantau awak, indak tamasuak laman diskusi.',
+'unwatchthispage' => 'Batal pantau laman ko',
+'watchlist-details' => '{{PLURAL:$1|$1 laman}} dalam dafta pantau awak, indak tamasuak laman rundiangnyo.',
 'wlshowlast' => 'Tampilkan $1 jam $2 hari tarakhia $3',
-'watchlist-options' => 'Piliahan daftapantau',
+'watchlist-options' => 'Piliahan dafta pantau',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Mamantau...',
@@ -1290,6 +1371,7 @@ Parubahan laman ko tamasuak laman otanyo akan ditampilkan dalam '''cetak taba'''
 
 # Delete
 'deletepage' => 'Hapuih laman',
+'confirm' => 'Konfirmasi',
 'confirmdeletetext' => 'Awak akan mahapuih laman atau berkas basamo riwayatnyo.
 Pastikan awak mainginkannyo, dan awak lah tahu sagalo akibatnyo dan sasuai jo [[{{MediaWiki:Policy-url}}|kebijakan]] yang balaku.',
 'actioncomplete' => 'Proses salasai',
@@ -1302,7 +1384,12 @@ Caliak $2 untuak rakam jajak laman nan lah dihapuih.',
 'deletereasonotherlist' => 'Alasan lain',
 
 # Rollback
-'rollbacklink' => 'baliakkan',
+'rollback' => 'Baliakan suntiangan',
+'rollback_short' => 'Baliakan',
+'rollbacklink' => 'baliakan',
+'rollbacklinkcount' => 'baliakan $1 {{PLURAL:$1|suntiangan}}',
+'rollbacklinkcount-morethan' => 'baliakan labiah dari $1 {{PLURAL:$1|suntiangan}}',
+'rollbackfailed' => 'Gagal mambaliakan',
 
 # Protect
 'protectlogpage' => 'Log palinduangan',
@@ -1318,18 +1405,31 @@ Berikut ko pengaturan yang balaku untuak laman '''$1''':",
 'protect-cascadeon' => 'Laman ko sedang dilindungi karano tamasuak dalam {{PLURAL:$1|laman|laman}} aktif perlindungan batingkek.
 Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlindungan batingkeknyo.',
 'protect-default' => 'Semua pangguno diizinkan',
-'protect-fallback' => 'Memerlukan hak akses "$1"',
-'protect-level-autoconfirmed' => 'Blokir pangguno baru dan indak terdaftar',
-'protect-level-sysop' => 'Hanya pengurus',
+'protect-fallback' => 'Cumo untuak pangguno jo izin  "$1"',
+'protect-level-autoconfirmed' => 'Cumo untuak pangguno takonfirmasi otomatis',
+'protect-level-sysop' => 'Cumo untuak panguruih',
 'protect-summary-cascade' => 'batingkek',
-'protect-expiring' => 'kadaluwarsa $1 (UTC)',
-'protect-cascade' => 'Lindungi semua laman yang bakaik jo laman ko (perlindungan batingkek)',
-'protect-cantedit' => 'Awak indak dapek maubah tingkek perlindungan laman ko, karano awak indak berhak.',
+'protect-expiring' => 'sampai $1 (UTC)',
+'protect-expiring-local' => 'sampai $1',
+'protect-expiry-indefinite' => 'sataruihnyo',
+'protect-cascade' => 'Linduangi laman nan takaik jo laman ko (palinduangan batingkek)',
+'protect-cantedit' => 'Sanak indak dapek maubah tingkek palinduangan laman ko, karano indak ado izin untuak itu.',
+'protect-othertime' => 'Wakatu lain:',
+'protect-othertime-op' => 'wakatu lain',
+'protect-existing-expiry' => 'Alah sampai: $3, $2',
+'protect-otherreason' => 'Alasan lain/tambahan:',
+'protect-otherreason-op' => 'Alasan lain',
 'restriction-type' => 'Perlindungan:',
 'restriction-level' => 'Tingkek larangan:',
+'minimum-size' => 'Ukuran min',
+'maximum-size' => 'Ukuran max',
+'pagesize' => '(bita)',
 
 # Restrictions (nouns)
-'restriction-move' => 'Pindahan',
+'restriction-edit' => 'Suntiang',
+'restriction-move' => 'Pindah',
+'restriction-create' => 'Buek',
+'restriction-upload' => 'Muek',
 
 # Undelete
 'undeletelink' => 'caliak/cegakkan',
@@ -1414,20 +1514,21 @@ Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlind
 'ipb-change-block' => 'Sakek baliak pangguno jo setelan ko',
 'ipb-confirm' => 'Konfirmasi sakek',
 'badipaddress' => 'Alamaik IP salah',
-'blockipsuccesssub' => 'Sakek berasil',
+'blockipsuccesssub' => 'Sakek barasil',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] lah disakek.<br />
 Liek [[Special:BlockList|dafta sakek]] buek maninjaunyo.',
 'ipb-blockingself' => 'Angku ka manyakek diri surang! Lai yakin apo nan dikarajoan?',
 'ipb-edit-dropdown' => 'Suntiang alasan manyakek',
 'ipb-unblock-addr' => 'Lapeh sakek $1',
+'blocklist' => 'Pangguno tablokir',
 'ipblocklist' => 'Pangguno tablokir',
 'blocklink' => 'sakek',
-'unblocklink' => 'hilangkan blokir',
+'unblocklink' => 'hilangkan sakek',
 'change-blocklink' => 'ubah sakek',
 'contribslink' => 'jariah',
 'blocklogpage' => 'Log pamblokiran',
-'blocklogentry' => 'mamblokir [[$1]] dalam maso $2 $3',
-'unblocklogentry' => 'mahilangkan blokir $1',
+'blocklogentry' => 'Manyakek [[$1]] dalam maso $2 $3',
+'unblocklogentry' => 'mahilangkan sakek $1',
 'block-log-flags-nocreate' => 'mambuek akun dimatikan',
 'blockme' => 'Sakek denai',
 
@@ -1473,13 +1574,13 @@ Dalam kasus tu, kok amuah Angku dapek mamindahkan ataupun manggabuangkan laman s
 'thumbnail_error' => 'Gagal mambuek miniatur: $1',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Laman pangguno sanak',
+'tooltip-pt-userpage' => 'Laman pangguno Sanak',
 'tooltip-pt-anonuserpage' => 'Laman pangguno IP Sanak',
-'tooltip-pt-mytalk' => 'Laman diskusi sanak',
-'tooltip-pt-anontalk' => 'Diskusi tantang suntiangan dari alamat IP ko',
+'tooltip-pt-mytalk' => 'Laman rundiang Sanak',
+'tooltip-pt-anontalk' => 'Parundiangan tantang suntiangan dari IP ko',
 'tooltip-pt-preferences' => 'Pangaturan denai',
 'tooltip-pt-watchlist' => 'Dafta laman nan dipantau.',
-'tooltip-pt-mycontris' => 'Daftar jariah Sanak',
+'tooltip-pt-mycontris' => 'Dafta jariah Sanak',
 'tooltip-pt-login' => 'Sanak disaranan untuak masuak log; walaupun indak wajib',
 'tooltip-pt-logout' => 'Kalua log',
 'tooltip-ca-talk' => 'Parudiangan tantang isi laman',
@@ -1489,10 +1590,11 @@ Dalam kasus tu, kok amuah Angku dapek mamindahkan ataupun manggabuangkan laman s
 Sanak hanyo buliah mancaliak sumbernyo sajo',
 'tooltip-ca-history' => 'Revisi sabalunnyo dari laman ko',
 'tooltip-ca-protect' => 'Linduangi laman ko',
+'tooltip-ca-unprotect' => 'Tuka palinduangan laman ko',
 'tooltip-ca-delete' => 'Hapuih laman ko',
 'tooltip-ca-move' => 'Pindahan laman ko',
-'tooltip-ca-watch' => 'Tambahkan laman ko ka dafta pantauan sanak',
-'tooltip-ca-unwatch' => 'Kaluaan laman ko dari daftapantau',
+'tooltip-ca-watch' => 'Tambahkan laman ko ka dafta pantau sanak',
+'tooltip-ca-unwatch' => 'Kaluaan laman ko dari dafta pantau',
 'tooltip-search' => 'Cari {{SITENAME}}',
 'tooltip-search-go' => 'Cari laman jo namo nan samo jikok ado',
 'tooltip-search-fulltext' => 'Cari laman untuak teks ko',
@@ -1509,7 +1611,7 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'tooltip-feed-rss' => 'Umpan RSS untuak laman ko',
 'tooltip-feed-atom' => 'Umpan Atom untuak laman ko',
 'tooltip-t-contributions' => 'Caliak dafta jariah pangguno ko',
-'tooltip-t-emailuser' => 'Kirim surel ka pangguno ko',
+'tooltip-t-emailuser' => 'Kirimkan surel pado pangguno ko',
 'tooltip-t-upload' => 'Muek berkas',
 'tooltip-t-specialpages' => 'Dafta dari sado laman istimewa',
 'tooltip-t-print' => 'Versi cetak dari laman ko',
@@ -1528,7 +1630,7 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'tooltip-preview' => 'Caliak dulu nan diubah, gunokan ko sabalun manyimpan',
 'tooltip-diff' => 'Caliak parubahan nan alah awak buek tu',
 'tooltip-compareselectedversions' => 'Caliak pabedoan antaro duo revisi pilihan laman ko',
-'tooltip-watch' => 'Tambahkan laman ko ka daftapantau',
+'tooltip-watch' => 'Tambahkan laman ko ka dafta pantau',
 'tooltip-recreate' => 'Buek baliak laman walaupun sabananyo pernah dihapuih',
 'tooltip-upload' => 'Mulai mamuek',
 'tooltip-rollback' => '"Baliakkan" uruangkan suntiang laman ko pado kontribusi tarakhir dalam sakali klik',
@@ -1546,6 +1648,7 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'anonymous' => '{{PLURAL:$1|Pangguno}} anonim {{SITENAME}}',
 'siteuser' => 'pangguno {{SITENAME}} $1',
 'anonuser' => 'pangguno anonim {{SITENAME}} $1',
+'others' => 'lainnyo',
 'siteusers' => '{{PLURAL:$2|pangguno}} {{SITENAME}} $1',
 'anonusers' => '{{PLURAL:$2|pangguno}} anonim {{SITENAME}} $1',
 'creditspage' => 'Panghargaan laman',
@@ -1560,6 +1663,7 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'pageinfo-length' => 'Panjang laman (dalam bita)',
 'pageinfo-article-id' => 'ID Laman',
 'pageinfo-firstuser' => 'Pambuek laman',
+'pageinfo-toolboxlink' => 'Informasi laman',
 
 # Skin names
 'skinname-standard' => 'Klasik',
@@ -1572,12 +1676,18 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'skinname-modern' => 'Moderen',
 'skinname-vector' => 'Vektor',
 
+# Patrolling
+'markaspatrolleddiff' => 'Tandoi lah dipatroli',
+'markaspatrolledtext' => 'Tandoi laman ko lah dipatroli',
+'markedaspatrolled' => 'Tandoi lah dipatroli',
+
 # Browsing diffs
 'previousdiff' => '← Revisi sabalunnyo',
 'nextdiff' => 'Revisi salanjuiknyo →',
 
 # Media information
-'thumbsize' => 'Ukuran miniatur:',
+'imagemaxsize' => "Bateh ukuran gambar:<br />''(untuak laman katarangan berkas)''",
+'thumbsize' => 'Ukuran miniatua:',
 'widthheight' => '$1 × $2',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|laman}}',
 'file-info' => 'ukuran berkas: $1, tipe MIME: $2',
@@ -1586,6 +1696,7 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'file-nohires' => 'Indak tasadio resolusi nan labiah gadang.',
 'svg-long-desc' => 'Berkas SVG, $1 × $2 piksel, ukuran berkas: $3',
 'svg-long-desc-animated' => 'Berkas anmasi SVG, $1 × $2 piksel, ukuran berkas: $3',
+'svg-long-error' => 'Berkas SVG indak sah: $1',
 'show-big-image' => 'Resolusi panuah',
 'show-big-image-preview' => 'Ukuran pratonton ko: $1',
 'show-big-image-other' => '{{PLURAL:$2|Resolusi}} lainnyo: $1.',
@@ -1597,7 +1708,7 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'file-info-png-frames' => '$1 {{PLURAL:$1|bingkai}}',
 
 # Special:NewFiles
-'newimages-legend' => 'Panyaring',
+'newimages-legend' => 'Panyariang',
 'newimages-label' => 'Namo berkas (atau sabagian darinyo):',
 'showhidebots' => '($1 bot)',
 'noimages' => 'Indak ado nan dicaliak.',
@@ -1615,7 +1726,10 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'minutes' => '{{PLURAL:$1|$1 minik}}',
 'hours' => '{{PLURAL:$1|$1 jam}}',
 'days' => '{{PLURAL:$1|$1 hari}}',
+'months' => '{{PLURAL:$1|$1 bulan}}',
+'years' => '{{PLURAL:$1|$1 taun}}',
 'ago' => '$1 nan lalu',
+'just-now' => 'kini ko',
 
 # Bad image list
 'bad_image_list' => 'Formatnyo adolah sabagai barikuik:
@@ -1709,10 +1823,11 @@ Nan lainnyo akan tasuruak sacaro baku.
 'watchlistall2' => 'kasadonyo',
 'namespacesall' => 'sadonyo',
 'monthsall' => 'sadonyo',
+'limitall' => 'sadonyo',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Tampilkan parubahan takaik',
-'watchlisttools-edit' => 'Tampilkan sarato suntiang daftapantau',
+'watchlisttools-edit' => 'Tampilkan sarato suntiang dafta pantau',
 'watchlisttools-raw' => 'Suntiang pantauan mantah',
 
 # Signatures
@@ -1722,21 +1837,38 @@ Nan lainnyo akan tasuruak sacaro baku.
 'duplicate-defaultsort' => '\'\'\'Peringatan:\'\'\' Kunci panguruitan default "$2" sabalunnyo mangabaikan kunci panguruitan default "$1".',
 
 # Special:Version
+'version' => 'Versi',
+'version-extensions' => 'Ekstensi tarinstal',
+'version-specialpages' => 'Laman istimewa',
+'version-parserhooks' => 'Kaik parser',
+'version-variables' => 'Variabel',
+'version-antispam' => 'Pancagahan spam',
 'version-skins' => 'Kulik',
 'version-other' => 'Lain-lain',
+'version-version' => '(Versi $1)',
 'version-license' => 'Lisensi',
+'version-poweredby-credits' => "Wiki ko didukuang jo '''[//www.mediawiki.org/ MediaWiki]''', hak cipta © 2001-$1 $2.",
+'version-poweredby-others' => 'lainnyo',
+'version-software-version' => 'Versi',
+'version-entrypoints-header-url' => 'URL',
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Artikel path]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Skrip path]',
 
 # Special:FilePath
+'filepath' => 'Lokasi berkas',
 'filepath-page' => 'Berkas:',
+'filepath-submit' => 'Cari',
 
 # Special:FileDuplicateSearch
-'fileduplicatesearch-result-n' => 'Berkas "$1" punyo {{PLURAL:$2|1 duplikat identik|$2 duplikat identik}}.',
+'fileduplicatesearch-result-n' => 'Berkas "$1" ado {{PLURAL:$2|$2 duplikat nan samo}}.',
 'fileduplicatesearch-noresults' => 'Indak basobok berkas banamo "$1".',
 
 # Special:SpecialPages
 'specialpages' => 'Laman istimewa',
+'specialpages-group-login' => 'Masuak log / mandafta',
+
+# Special:BlankPage
+'blankpage' => 'Laman kosong',
 
 # External image whitelist
 'external_image_whitelist' => '#Bia se barih ko apo adonyo<pre>
@@ -1767,6 +1899,6 @@ Nan lainnyo akan tasuruak sacaro baku.
 'searchsuggest-containing' => 'Barisi...',
 
 # Durations
-'duration-millennia' => '$1 {{PLURAL:$1|millennium|millenia}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milenium}}',
 
 );
index d1722b4..5ee3452 100644 (file)
@@ -2489,7 +2489,7 @@ $UNWATCHURL
 'exblank' => 'страницата беше празна',
 'delete-confirm' => 'Избриши „$1“',
 'delete-legend' => 'Бришење',
-'historywarning' => "'''Предупредување:''' Страницата којашто сакате да ја избришете има историја со околу $1 {{PLURAL:$1|ревизија|ревизии}}:",
+'historywarning' => "'''Предупредување:''' Страницата што сакате да ја избришете има историја со околу $1 {{PLURAL:$1|ревизија|ревизии}}:",
 'confirmdeletetext' => 'На пат сте трајно да избришете страница заедно со нејзината историја.
 Потврдете дека имате намера да го направите ова, дека ги разбирате последиците од тоа, дека го правите ова во согласност со [[{{MediaWiki:Policy-url}}|политиката]].',
 'actioncomplete' => 'Дејството е спроведено',
index 512ed32..9e40c5a 100644 (file)
@@ -189,6 +189,7 @@ $messages = array(
 'newwindow' => '(नयाँ विन्डोमा खुल्छ)',
 'cancel' => 'रद्द',
 'moredotdotdot' => 'थप...',
+'morenotlisted' => 'थप जानकारी दिइएको  छैन',
 'mypage' => 'पृष्ठ',
 'mytalk' => 'वार्ता',
 'anontalk' => 'यस IP को वारेमा वार्तालाप गर्नुहोस्',
index d71b899..2e34445 100644 (file)
@@ -300,7 +300,7 @@ $messages = array(
 'tog-extendwatchlist' => 'Espandir la lista de seguiment per afichar totas las modificacions e non pas solament las mai recentas',
 '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-showtoolbar' => 'Far veire la barra de menú de modificacion (JavaScript)',
 'tog-editondblclick' => 'Modificar una pagina amb un clic doble (JavaScript)',
 'tog-editsection' => 'Modificar una seccion via los ligams [modificar]',
 'tog-editsectiononrightclick' => 'Modificar una seccion en fasent un clic drech sus son títol (JavaScript)',
@@ -670,7 +670,8 @@ Requèsta : $2',
 '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.',
+'protectedinterface' => 'Aquesta pagina provesís de tèxte d’interfàcia pel logicial susaqueste wiki, e es protegida per evitar los abuses.
+Per apondre o modificar de traduccions sus totes los wikis, utilizatz [//translatewiki.net/ translatewiki.net], lo projècte de localizacion de MediaWiki.',
 '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)',
 'cascadeprotected' => "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 :
@@ -718,7 +719,7 @@ Doblidetz pas de modificar [[Special:Preferences|vòstras preferéncias per {{SI
 'gotaccount' => "Ja avètz un compte ? '''$1'''.",
 'gotaccountlink' => 'Identificatz-vos',
 'userlogin-resetlink' => 'Avètz doblidat vòstres detalhs de connexion ?',
-'createaccountmail' => 'per corrièr electronic',
+'createaccountmail' => 'Utilizar un senhal aleatòri temporari e lo mandar a l’adreça de corrièl especificada çaijós',
 'createaccountreason' => 'Motiu :',
 'badretype' => "Los senhals qu'avètz picats son pas identics.",
 'userexists' => "Lo nom d'utilizaire qu'avètz picat ja es utilizat.
@@ -809,6 +810,7 @@ Benlèu ja avètz modificat vòstre senhal o demandat un senhal temporari novèl
 'passwordreset-legend' => 'Reïnicializar lo senhal',
 'passwordreset-username' => "Nom d'utilizaire :",
 'passwordreset-domain' => 'Domeni:',
+'passwordreset-capture' => 'Veire lo corrièl resultant ?',
 'passwordreset-email' => 'Adreça de corrièr electronic :',
 'passwordreset-emailtitle' => "Detailhs d'un compte per {{SITENAME}}",
 'passwordreset-emailelement' => 'Utilizaire: $1
@@ -1752,6 +1754,9 @@ Se lo problèma persistís, contactatz un [[Special:ListUsers/sysop|administrato
 '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 ».',
 
+# Special:UploadStash
+'uploadstash' => "Escondedor d'impòrt",
+
 # img_auth script messages
 'img-auth-accessdenied' => 'Accès refusat',
 'img-auth-nopathinfo' => 'PATH_INFO mancant.
@@ -1918,7 +1923,7 @@ Doblidetz pas de verificar se i a pas d’autre ligam cap als modèls abans de l
 'statistics-users-active-desc' => "Utilizaires qu'an fach al mens una accion durant {{PLURAL:$1|lo darrièr jorn|los $1 darrièrs jorns}}",
 'statistics-mostpopular' => 'Paginas mai consultadas',
 
-'disambiguations' => "Paginas d'omonimia",
+'disambiguations' => "Paginas qu'an de ligams cap a de paginas d'omonimia",
 'disambiguationspage' => 'Template:Omonimia',
 'disambiguations-text' => "Las paginas seguentas puntan cap a una '''pagina d’omonimia'''.
 Deurián puslèu puntar cap a una pagina apropriada.<br />
@@ -2138,7 +2143,7 @@ L'adreça electronica qu'avètz indicada dins [[Special:Preferences|vòstras pre
 'usermessage-editor' => 'Messatgièr del sistèma',
 
 # Watchlist
-'watchlist' => 'Ma lista de seguiment',
+'watchlist' => 'Lista de seguiment',
 'mywatchlist' => 'Lista de seguiment',
 'watchlistfor2' => 'Per $1 ($2)',
 'nowatchlist' => "Vòstra lista de seguiment conten pas cap d'article.",
@@ -2624,7 +2629,7 @@ jol nom novèl. Se vos plai, fusionatz-las manualament.",
 L’article de destinacion « [[:$1]] » existís ja.
 Lo volètz suprimir per permetre lo cambiament de nom ?',
 'delete_and_move_confirm' => 'Òc, accèpti de suprimir la pagina de destinacion per permetre lo cambiament de nom.',
-'delete_and_move_reason' => 'Pagina suprimida per permetre un cambiament de nom',
+'delete_and_move_reason' => 'Pagina suprimida per permetre lo cambiament de nom dempuèi « [[$1]] »',
 'selfmove' => 'Los títols d’origina e de destinacion son los meteisses : impossible de tornar nomenar una pagina sus ela-meteissa.',
 'immobile-source-namespace' => "Podètz pas tornar nomenar de paginas dins l'espaci de noms « $1 »",
 'immobile-target-namespace' => "Podètz pas desplaçar de paginas cap a l'espaci de noms « $1 »",
@@ -2650,6 +2655,7 @@ Causissètz un autre nom.',
 Per exportar de paginas, entratz lors títols dins la bóstia de tèxte çaijós, un títol per linha, e seleccionatz s'o desiratz o pas la version actuala amb totas las versions ancianas, amb la pagina d’istoric, o simplament la pagina actuala amb d'informacions sus la darrièra modificacion.
 
 Dins aqueste darrièr cas, podètz tanben utilizar un ligam, coma [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] per la pagina [[{{MediaWiki:Mainpage}}]].",
+'exportall' => 'Exportar totas las paginas',
 'exportcuronly' => 'Exportar unicament la version correnta sens l’istoric complet',
 'exportnohistory' => "----
 '''Nòta :''' l’exportacion completa de l’istoric de las paginas amb l’ajuda d'aqueste formulari es estada desactivada per de rasons de performàncias.",
@@ -2739,6 +2745,10 @@ Salvatz-lo sus vòstre disc dur puèi importatz-lo aicí.",
 'import-logentry-interwiki' => 'a importat (transwiki) $1',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|version|versions}} dempuèi $2',
 
+# JavaScriptTest
+'javascripttest' => 'Tèst de JavaScript',
+'javascripttest-title' => 'Execucion dels tèsts $1',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => "Vòstra pagina d'utilizaire",
 'tooltip-pt-anonuserpage' => "La pagina d'utilizare de l’IP amb la quala contribuissètz",
@@ -2756,7 +2766,7 @@ Salvatz-lo sus vòstre disc dur puèi importatz-lo aicí.",
 'tooltip-ca-viewsource' => 'Aquesta pagina es protegida. Çaquelà, ne podètz veire lo contengut.',
 'tooltip-ca-history' => "Los autors e versions precedentas d'aquesta pagina.",
 'tooltip-ca-protect' => 'Protegir aquesta pagina',
-'tooltip-ca-unprotect' => 'Desprotegir aquesta pagina',
+'tooltip-ca-unprotect' => "Cambiar la proteccion d'aquesta pagina",
 'tooltip-ca-delete' => 'Suprimir aquesta pagina',
 'tooltip-ca-undelete' => 'Restablir aquesta pagina',
 'tooltip-ca-move' => 'Tornar nomenar aquesta pagina',
@@ -2799,6 +2809,8 @@ Salvatz-lo sus vòstre disc dur puèi importatz-lo aicí.",
 'tooltip-diff' => "Permet de visualizar los cambiaments qu'avètz efectuats",
 'tooltip-compareselectedversions' => "Afichar las diferéncias entre doas versions d'aquesta pagina",
 'tooltip-watch' => 'Apondre aquesta pagina a vòstra lista de seguiment',
+'tooltip-watchlistedit-normal-submit' => 'Levar los títols',
+'tooltip-watchlistedit-raw-submit' => 'Mesa a jorn de la lista de seguiment',
 'tooltip-recreate' => 'Tornar crear la pagina, quitament se es estada escafada',
 'tooltip-upload' => 'Amodar lo mandadís',
 'tooltip-rollback' => '"Revocar" anulla en un clic la o las edicion(s) sus aquesta pagina del darrièr contributor.',
@@ -2884,9 +2896,15 @@ Aquò es probablament causat per un ligam sus lista negra que punta cap a un sit
 '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-toolboxlink' => 'Informacion sus la pagina',
+'pageinfo-redirectsto' => 'Redirigir cap a',
 'pageinfo-redirectsto-info' => 'info',
 'pageinfo-contentpage-yes' => 'Òc',
 'pageinfo-protect-cascading-yes' => 'Òc',
+'pageinfo-category-info' => 'Informacions sus la categoria',
+'pageinfo-category-pages' => 'Nombre de paginas',
+'pageinfo-category-subcats' => 'Nombre de soscategorias',
+'pageinfo-category-files' => 'Nombre de fichièrs',
 
 # Skin names
 'skinname-standard' => 'Estandard',
@@ -2969,6 +2987,7 @@ Se l'executatz, vòstre sistèma pòt èsser compromés.",
 'hours' => '{{PLURAL:$1|$1 ora|$1 oras}}',
 'days' => '{{PLURAL:$1|$1 jorn|$1 jorns}}',
 'ago' => 'I a $1',
+'just-now' => 'sulpic',
 
 # Bad image list
 'bad_image_list' => "Lo format es lo seguent :
@@ -3561,9 +3580,8 @@ Ensajatz la previsualizacion normala.',
 'filepath' => "Camin d'accès d'un fichièr",
 'filepath-page' => 'Fichièr :',
 'filepath-submit' => 'Validar',
-'filepath-summary' => "Aquesta pagina especiala balha lo camin d'accès complet d’un fichièr ; los imatges son mostrats en nauta resolucion, los fichièrs audiò e vidèo s’executan amb lor programa associat.
-
-Picatz lo nom del fichièr sens lo prefix « {{ns:file}}: »",
+'filepath-summary' => "Aquesta pagina especiala retorna lo camin d'accès complet d’un fichièr.
+Los imatges son afichats en nauta resolucion, los fichièrs àudio e vidèo son cargats e aviats dirèctament amb lor programa associat.",
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Recèrca dels fichièrs en doble',
@@ -3574,12 +3592,14 @@ Picatz lo nom del fichièr sens lo prefix « {{ns:file}}: »",
 'fileduplicatesearch-info' => '$1 × $2 pixèls<br />Talha del fichièr : $3<br />MIME type : $4',
 'fileduplicatesearch-result-1' => 'Lo fichièr « $1 » a pas de doble identic.',
 'fileduplicatesearch-result-n' => 'Lo fichièr « $1 » a {{PLURAL:$2|1 doble identic|$2 dobles identics}}.',
+'fileduplicatesearch-noresults' => 'Cap de fichièr nomenat « $1 » es pas estat trobat.',
 
 # Special:SpecialPages
 'specialpages' => 'Paginas especialas',
 'specialpages-note' => '----
-* Las paginas especialas
-* <strong class="mw-specialpagerestricted">en gras</strong> son restrenhudas.',
+* Paginas especialas normalas.
+* <span class="mw-specialpagerestricted">Paginas especialas restrenchas.</span>
+* <span class="mw-specialpagecached">Paginas especialas solament en escondedor (poirián èsser obsolètas).</span>',
 'specialpages-group-maintenance' => 'Rapòrts de mantenença',
 'specialpages-group-other' => 'Autras paginas especialas',
 'specialpages-group-login' => "S'identificar / s'inscriure",
@@ -3589,7 +3609,7 @@ Picatz lo nom del fichièr sens lo prefix « {{ns:file}}: »",
 'specialpages-group-highuse' => 'Utilizacion intensa de las paginas',
 'specialpages-group-pages' => 'Listas de paginas',
 'specialpages-group-pagetools' => 'Aisinas per las paginas',
-'specialpages-group-wiki' => 'Donadas del wiki e aisinas',
+'specialpages-group-wiki' => 'Donadas e aisinas',
 'specialpages-group-redirects' => 'Redireccions',
 'specialpages-group-spam' => 'Aisinas antispam',
 
@@ -3653,6 +3673,8 @@ Picatz lo nom del fichièr sens lo prefix « {{ns:file}}: »",
 'htmlform-selectorother-other' => 'Autre',
 
 # New logging system
+'logentry-delete-delete' => '$1 a suprimit la pagina $3',
+'logentry-delete-restore' => '$1 a restablit la pagina $3',
 'revdelete-content-hid' => 'contengut amagat',
 'revdelete-summary-hid' => 'resumit de modificacion amagat',
 'revdelete-uname-hid' => 'nom d’utilizaire amagat',
index 1342417..fbfbb57 100644 (file)
@@ -423,7 +423,7 @@ $messages = array(
 'namespaces' => 'ନେମସ୍ପେସ',
 'variants' => 'ନିଆରା',
 
-'navigation-heading' => 'ଦିà¬\97ବାରà­\87ଣà­\80 à¬®à¬¿ନୁ',
+'navigation-heading' => 'ଦିà¬\97ବାରà­\87ଣି à¬®à­\87ନୁ',
 'errorpagetitle' => 'ଭୁଲ',
 'returnto' => '$1କୁ ଫେରିଯାନ୍ତୁ ।',
 'tagline' => '{{SITENAME}} ରୁ',
index 8c26034..9c968ac 100644 (file)
@@ -724,9 +724,8 @@ The format is: "{{int:youhavenewmessagesmulti| [[MediaWiki:Newmessageslink/{{SUB
 
 {{Identical|View source}}',
 'editsectionhint' => "Tool tip shown when hovering the mouse over the link to '[{{MediaWiki:Editsection}}]' a section. Example: Edit section: Heading name",
-'toc' => 'This is the title of the table of contents displayed in pages with more than 3 sections
-
-{{Identical|Contents}}',
+'toc' => 'This is the title of the table of contents displayed in pages with more than 3 sections.
+{{Identical|Content}}',
 'showtoc' => 'This is the link used to show the table of contents
 
 {{Identical|Show}}',
@@ -746,8 +745,14 @@ See also:
 
 See the following example:
 {{Identical|Expand}}',
-'thisisdeleted' => 'Message shown on a deleted page when the user has the undelete right. $1 is a link to [[Special:Undelete]], with {{msg-mw|restorelink}} as the text. See also {{msg-mw|viewdeleted}}.',
-'viewdeleted' => 'Message shown on a deleted page when the user does not have the undelete right (but has the deletedhistory right). $1 is a link to [[Special:Undelete]], with {{msg-mw|restorelink}} as the text. See also {{msg-mw|thisisdeleted}}.',
+'thisisdeleted' => 'Message shown on a deleted page when the user has the undelete right. Parameters:
+* $1 - a link to [[Special:Undelete]], with {{msg-mw|restorelink}} as the text
+See also:
+* {{msg-mw|viewdeleted}}',
+'viewdeleted' => 'Message shown on a deleted page when the user does not have the undelete right (but has the deletedhistory right). Parameters:
+* $1 - a link to [[Special:Undelete]], with {{msg-mw|restorelink}} as the text
+See also:
+* {{msg-mw|thisisdeleted}}',
 'restorelink' => "This text is always displayed in conjunction with the {{msg-mw|thisisdeleted}} message (View or restore $1?). The user will see
 View or restore <nowiki>{{PLURAL:$1|one deleted edit|$1 deleted edits}}</nowiki>?    i.e ''View or restore one deleted edit?''     or
 ''View or restore n deleted edits?''",
@@ -1631,18 +1636,29 @@ See also:
 Parameters:
 * <tt>$1</tt> is the value of the depth limit
 * <tt>$2</tt> is the value of the max depth limit',
-'parser-unstrip-loop-warning' => 'This error is shown when a parser extension tag such as &lt;pre> includes a reference to itself in its own output.
+'parser-unstrip-loop-warning' => '{{Doc-important|Do not translate function name "<code>unstrip</code>".}}
+This error is shown when a parser extension tag such as &lt;pre> includes a reference to itself in its own output.
+
 The reference must be to the exact same invocation of the tag at the same location in the source, merely writing &lt;pre>&lt;pre>&lt;/pre>&lt;/pre> will not do it.
+
 This is usually impossible and unlikely to happen by accident, so translation is not essential.
-"Unstrip" refers to the internal function of the parser, called \'unstrip\', which recursively puts the output of parser functions in the place of the parser function call and which would enter an infinite loop in the situation above. See also:
+
+"Unstrip" refers to the internal function of the parser, called \'unstrip\', which recursively puts the output of parser functions in the place of the parser function call and which would enter an infinite loop in the situation above.
+
+See also:
 *{{msg-mw|Parser-unstrip-recursion-limit}}',
-'parser-unstrip-recursion-limit' => 'This message is shown when the recursion limit for nested parser extension tags is exceeded.
+'parser-unstrip-recursion-limit' => '{{doc-important|Do not translate function name "<code>unstrip</code>".}}
+This message is shown when the recursion limit for nested parser extension tags is exceeded.
+
 This warning may be encountered due to input text like &lt;ref>&lt;ref>&lt;ref>...&lt;/ref>&lt;/ref>&lt;/ref>.
 
-* <tt>$1</tt> is the depth limit
+Parameters:
+* $1 - the depth limit
+
+"Unstrip" refers to the internal function of the parser, called \'unstrip\', which recursively puts the output of parser functions in the place of the parser function call and which would enter an infinite loop in the situation above.
 
-"Unstrip" refers to the internal function of the parser, called \'unstrip\', which recursively puts the output of parser functions in the place of the parser function call and which would enter an infinite loop in the situation above. See also:
-*{{msg-mw|Parser-unstrip-loop-warning}}',
+See also:
+* {{msg-mw|Parser-unstrip-loop-warning}}',
 'converter-manual-rule-error' => "This message is shown when a manual conversion rule for the language converter has errors. For example it's not using the correct syntax, or not supplying text in all variants.",
 
 # "Undo" feature
@@ -3164,15 +3180,29 @@ See also:
 * {{msg-mw|hookaborted}}
 * {{msg-mw|filename-toolong}}
 * {{msg-mw|unknown-error}}',
-'fileexists' => "{{doc-important|''thumb'' is a magic word. Leave it untranslated!}}",
+'fileexists' => "{{doc-important|''thumb'' is a magic word. Leave it untranslated!}}
+Parameters:
+* $1 - name of the existing file",
 'filepageexists' => "{{doc-important|''thumb'' is a magic word. Leave it untranslated!}}
-Shown on [[Special:Upload]], $1 is link to the page. This message is displayed if a description page exists, but a file with the same name does not yet exists, and a user tries to upload a file with that name. In that case the description page is not changed, even if the uploading user specifies a description with the upload.",
-'fileexists-extension' => "{{doc-important|''thumb'' is a magic word. Leave it untranslated!}}",
-'fileexists-thumbnail-yes' => "{{doc-important|''thumb'' is a magic word. Leave it untranslated!}}",
-'file-thumbnail-no' => 'Error message at [[Special:Upload]]',
-'fileexists-forbidden' => "{{doc-important|''thumb'' and ''center'' are magic words. Leave it untranslated!}}",
+Shown on [[Special:Upload]]. Parameters:
+* $1 - link to the page
+This message is displayed if a description page exists, but a file with the same name does not yet exists, and a user tries to upload a file with that name. In that case the description page is not changed, even if the uploading user specifies a description with the upload.",
+'fileexists-extension' => "{{doc-important|''thumb'' is a magic word. Leave it untranslated!}}
+Parameters:
+* $1 - name of the uploading file
+* $2 - name of the existing file",
+'fileexists-thumbnail-yes' => "{{doc-important|''thumb'' is a magic word. Leave it untranslated!}}
+Parameters:
+* $1 - name of thumbnail file",
+'file-thumbnail-no' => 'Error message at [[Special:Upload]]. Parameters:
+* $1 - String (e.g. "180px-")',
+'fileexists-forbidden' => "{{doc-important|''thumb'' and ''center'' are magic words. Leave it untranslated!}}
+Parameters:
+* $1 - name of the existing file",
 'fileexists-shared-forbidden' => "{{doc-important|''thumb'' and ''center'' are magic words. Leave it untranslated!}}
-Error message at [[Special:Upload]]",
+Error message at [[Special:Upload]].
+Parameters:
+* $1 - name of the existing file",
 'file-exists-duplicate' => 'Used as warning in [[Special:Upload]].
 This message is followed by the gallery of the duplicate files.
 
@@ -3510,7 +3540,9 @@ See also:
 * {{msg-mw|Http-request-error}}
 * {{msg-mw|Http-read-error}}
 * {{msg-mw|Http-timed-out|28}}',
-'http-bad-status' => '$1 is an HTTP error code (e.g. 404), $2 is the HTTP error message (e.g. File Not Found)',
+'http-bad-status' => 'Parameters:
+* $1 - an HTTP error code (e.g. 404)
+* $2 - the HTTP error message (e.g. File Not Found)',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'See also:
@@ -3567,7 +3599,8 @@ See also:
 {{Identical|Size}}',
 'listfiles_description' => 'Column header for the result table displayed on [[Special:ListFiles]].
 {{Identical|Description}}',
-'listfiles_count' => 'One of the table column headers in [[Special:Listfiles]] denoting the amount of saved versions of that file.',
+'listfiles_count' => 'One of the table column headers in [[Special:Listfiles]] denoting the amount of saved versions of that file.
+{{Identical|Version}}',
 
 # File description page
 'file-anchor-link' => '{{Identical|File}}',
@@ -3818,6 +3851,12 @@ This block of text is shown on [[:Special:Disambiguations]].
 
 \'\'\'Background information:\'\'\' Beyond telling about links going to disambiguation pages, that they are generally bad, it should explain which pages in the article namespace are seen as disambiguations: [[MediaWiki:Disambiguationspage]] usually holds a list of disambiguation templates of the local wiki. Pages linking to one of them (by transclusion) will count as disambiguation pages. Pages linking to these disambiguation pages, instead to the disambiguated article itself, are listed on [[:Special:Disambiguations]].',
 
+'pageswithprop'         => 'Title for [[Special:PagesWithProp]]',
+'pageswithprop-legend'  => 'Legend for the input form on [[Special:PagesWithProp]]',
+'pageswithprop-text'    => 'Introductory text for the input form on [[Special:PagesWithProp]]',
+'pageswithprop-prop'    => 'Label for the property name input field on [[Special:PagesWithProp]]',
+'pageswithprop-submit'  => 'Label for the submit button on [[Special:PagesWithProp]]',
+
 'doubleredirects' => 'Name of [[Special:DoubleRedirects]] displayed in [[Special:SpecialPages]]',
 'doubleredirectstext' => 'Shown on top of [[Special:Doubleredirects]]',
 'double-redirect-fixed-move' => 'This is the message in the log when the software (under the username {{msg|double-redirect-fixer}}) updates the redirects after a page move. See also {{msg|fix-double-redirects}}.',
@@ -4029,7 +4068,8 @@ In order to translate ''Unused categories'' and ''wanted categories'' see {{msg|
 'deletedcontributions-title' => 'Title of [[Special:DeletedContributions]] (extension), a special page with a list of edits to pages which were deleted. Only viewable by sysops.
 
 {{Identical|Deleted user contributions}}',
-'sp-deletedcontributions-contribs' => 'Link to user’s contributions on [[Special:DeletedContributions]]',
+'sp-deletedcontributions-contribs' => 'Link to user’s contributions on [[Special:DeletedContributions]].
+{{Identical|Contribution}}',
 
 # Special:LinkSearch
 'linksearch' => 'Title of [[Special:LinkSearch|special page]] and legend of fieldset on that page.
@@ -5860,7 +5900,8 @@ See also:
 * {{msg-mw|Import-interwiki-templates}}
 * {{msg-mw|Import-interwiki-namespace}}
 * {{msg-mw|Import-interwiki-rootpage}}
-* {{msg-mw|Import-interwiki-submit}}',
+* {{msg-mw|Import-interwiki-submit}}
+{{Identical|Comment}}',
 'importtext' => 'Used in the Import form on [[Special:Import]].',
 'importstart' => 'Used in [[Special:Import]].
 
@@ -6471,7 +6512,8 @@ See also [[MediaWiki:Lastmodifiedat/{{SUBPAGENAME}}]].",
 * $2: optional, the count of names in $1',
 'others' => 'The following explanation is guesswork. This message is shown when viewing the credits of a page (example: {{fullurl:Main Page|action=credits}}). Note that this action is disabled by default (currently enabled on translatewiki.net - to use type <nowiki>&action=credits</nowiki> at the end of any URL in the address bar).
 
-The message appears at the end of the list of credits given in the message [[Mediawiki:Othercontribs/{{SUBPAGENAME}}]] if the number of contributors is above a certain level.',
+The message appears at the end of the list of credits given in the message [[Mediawiki:Othercontribs/{{SUBPAGENAME}}]] if the number of contributors is above a certain level.
+{{Identical|Other}}',
 'siteusers' => 'This message is shown when viewing the credits of a page (example: {{fullurl:Main Page|action=credits}}). Note that this action is disabled by default (currently enabled on translatewiki.net).
 It should be in a form that fits with [[MediaWiki:Othercontribs/{{SUBPAGENAME}}|othercontribs]].
 
@@ -7759,7 +7801,8 @@ See also:
 See: http://www.awaresystems.be/imaging/tiff/tifftags/ycbcrpositioning.html
 {{Related|Exif-ycbcrpositioning}}',
 
-'exif-dc-contributor' => 'People who helped make the resource, but are secondary in contribution to the author.',
+'exif-dc-contributor' => 'People who helped make the resource, but are secondary in contribution to the author.
+{{Identical|Contributor}}',
 'exif-dc-coverage' => '"The extent or scope of the resource" see dc:coverage in http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart2.pdf',
 'exif-dc-date' => 'One or more dates associated with the image. How they are associated is not really defined. From the dc:date XMP property.',
 'exif-dc-publisher' => 'One or more publisher of resource.
@@ -8588,7 +8631,8 @@ $4 is the gender of the target user.',
 'feedback-bugornote' => 'When feedback dialog box is opened, this introductory message in small print explains the options to report a bug or add simple feedback. We expect that people in a hurry will not read this.',
 'feedback-subject' => 'Label for a text input
 {{Identical|Subject}}',
-'feedback-message' => 'Label for a textarea; signature referrs to a Wikitext signature.',
+'feedback-message' => 'Label for a textarea; signature referrs to a Wikitext signature.
+{{Identical|Message}}',
 'feedback-cancel' => 'Button label
 {{Identical|Cancel}}',
 'feedback-submit' => 'Button label
index 48d8dbe..fc02919 100644 (file)
@@ -1454,7 +1454,7 @@ $1",
 'search-interwiki-default' => '$1 результ.:',
 'search-interwiki-more' => '(ещё)',
 'search-relatedarticle' => 'Связанный',
-'mwsuggest-disable' => 'Отключить AJAX-подсказки',
+'mwsuggest-disable' => 'Отключить подсказки поиска',
 'searcheverything-enable' => 'Поиск по всем пространствам имён',
 'searchrelated' => 'связанный',
 'searchall' => 'все',
@@ -2892,11 +2892,11 @@ $1',
 Вы отвечаете за то, чтобы ссылки продолжали и далее указывать туда, куда предполагалось.
 
 Обратите внимание, что страница '''не будет''' переименована, если уже существует страница с названием, идентичным выбранному, кроме случаев, когда такая страница является перенаправлением или пуста, и при этом не имеет истории правок.
-ЭÑ\82о Ð¾Ð·Ð½Ð°Ñ\87аеÑ\82, Ñ\87Ñ\82о Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿ÐµÑ\80еименоваÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ð¾Ð±Ñ\80аÑ\82но Ð² Ñ\82о Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ, ÐºÐ¾Ñ\82оÑ\80ое Ñ\83 Ð½ÐµÐ³Ð¾ Ñ\82олÑ\8cко Ñ\87Ñ\82о Ð±Ñ\8bло, ÐµÑ\81ли Ð²Ñ\8b Ñ\81делали Ð¿Ñ\80еименование Ð¾Ñ\88ибоÑ\87но, но вы не можете случайно затереть существующую страницу.
+ЭÑ\82о Ð¾Ð·Ð½Ð°Ñ\87аеÑ\82, Ñ\87Ñ\82о ÐµÑ\81ли Ð²Ñ\8b Ñ\81делали Ð¿Ñ\80еименование Ð¾Ñ\88ибоÑ\87но, Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿ÐµÑ\80еименоваÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ð¾Ð±Ñ\80аÑ\82но Ð² Ñ\82о Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ, ÐºÐ¾Ñ\82оÑ\80ое Ñ\83 Ð½ÐµÑ\91 Ñ\82олÑ\8cко Ñ\87Ñ\82о Ð±Ñ\8bло, но вы не можете случайно затереть существующую страницу.
 
 '''Предупреждение!'''
 Переименование ''популярных'' страниц может привести к масштабным и неожиданным изменениям.
\9fожалÑ\83йÑ\81Ñ\82а, Ð¿Ñ\80ежде Ñ\87ем Ð²Ñ\8b Ð¿Ñ\80одолжиÑ\82е, Ñ\83бедиÑ\82еÑ\81Ñ\8c, Ñ\87Ñ\82о Ð²Ñ\8b понимаете все возможные последствия.",
\9fожалÑ\83йÑ\81Ñ\82а, Ð¿Ñ\80ежде Ñ\87ем Ð¿Ñ\80одолжаÑ\82Ñ\8c, Ñ\83бедиÑ\82еÑ\81Ñ\8c, Ñ\87Ñ\82о понимаете все возможные последствия.",
 'movepagetext-noredirectfixer' => "Воспользовавшись формой ниже, вы переименуете страницу, одновременно переместив на новое место её журнал изменений.
 Старое название станет перенаправлением на новое название.
 Пожалуйста, проверьте наличие [[Special:DoubleRedirects|двойных]] и [[Special:BrokenRedirects|разорванных перенаправлений]].
@@ -3242,6 +3242,7 @@ The wiki server can't provide data in a format your client can read.",
 'pageinfo-robot-noindex' => 'Не индексируется',
 'pageinfo-views' => 'Количество просмотров',
 'pageinfo-watchers' => 'Число наблюдающих',
+'pageinfo-few-watchers' => 'Менее $1 {{PLURAL:$1|следящего|следящих}}',
 'pageinfo-redirects-name' => 'Перенаправления на эту страницу',
 'pageinfo-redirects-value' => '$1',
 'pageinfo-subpages-name' => 'Подстраницы данной страницы',
index 0701bb4..3e1d325 100644 (file)
@@ -1715,7 +1715,7 @@ Talìa macari li [[Special:WantedCategories|catigurìi addumannati]].',
 'linksearch' => 'Lijami di fora',
 'linksearch-pat' => 'Mudellu di circata:',
 'linksearch-ns' => 'Namespace:',
-'linksearch-ok' => 'Cerca',
+'linksearch-ok' => 'Arriscedi',
 'linksearch-text' => 'C\'è la pussibbilitati di fari usu di metacaràttiri, p\'asèmpiu "*.wikipedia.org".<br />
 Protucolli suppurtati: <code>$1</code>',
 'linksearch-line' => '$1 prisenti ntâ pàggina $2',
@@ -2017,7 +2017,7 @@ $1',
 'sp-contributions-search' => 'Ricerca cuntribbuti',
 'sp-contributions-username' => 'Nnirizzu IP o nomu utenti:',
 'sp-contributions-toponly' => "Ammuscia sulu li cuntribbuti ca sunnu l'ùrtimi rivisioni pâ pàggina",
-'sp-contributions-submit' => 'Ricerca',
+'sp-contributions-submit' => 'Risciduta',
 
 # What links here
 'whatlinkshere' => 'Chi punta ccà',
@@ -2082,7 +2082,7 @@ Pi maggiuri nfurmazzioni, talìa la [[Special:BlockList|lista di l'IP bluccati]]
 'unblocked-id' => 'Lu bloccu $1 hà statu cacciatu',
 'ipblocklist' => 'Utiloizzatura bluccati',
 'ipblocklist-legend' => "Atrova n'utenti bluccatu",
-'ipblocklist-submit' => 'Ricerca',
+'ipblocklist-submit' => 'Risciduta',
 'infiniteblock' => 'nfinitu',
 'expiringblock' => 'scadi lu $1 ê $2',
 'anononlyblock' => 'sulu anònimi',
@@ -3001,7 +3001,7 @@ Mèttiri lu nomu dû file senza lu prifissu "{{ns:file}}:"',
 'rightsnone' => '(nuddu)',
 
 # Search suggestions
-'searchsuggest-search' => 'Ricerca',
+'searchsuggest-search' => 'Risciduta',
 
 # API errors
 'api-error-nomodule' => 'Erruri nternu: nun fu mpustatu lu mòdulu di carricamentu',
index b323f35..c33c931 100644 (file)
@@ -340,6 +340,7 @@ $messages = array(
 'newwindow' => '(otvara se u novom prozoru)',
 'cancel' => 'Poništi',
 'moredotdotdot' => 'Još...',
+'morenotlisted' => 'Više nije prikazano...',
 'mypage' => 'Stranica',
 'mytalk' => 'Razgovor',
 'anontalk' => 'Razgovor za ovu IP adresu',
@@ -642,7 +643,7 @@ Ne zaboravite izmijeniti vlastite [[Special:Preferences|{{SITENAME}} postavke]].
 'gotaccount' => "Imate račun? '''$1'''.",
 'gotaccountlink' => 'Prijavi se',
 'userlogin-resetlink' => 'Zaboravili ste detalje vaše prijave?',
-'createaccountmail' => 'e-mailom',
+'createaccountmail' => 'Koristite privremenu slučajno stvorenu lozinku i pošaljite na dolje specificiranu e-mail adresu',
 'createaccountreason' => 'Razlog:',
 'badretype' => 'Lozinke koje ste unijeli se ne poklapaju.',
 'userexists' => 'Uneseno korisničko ime već je u upotrebi.
@@ -719,6 +720,7 @@ Molimo Vas da sačekate prije nego što pokušate ponovo.',
 # E-mail sending
 'php-mail-error-unknown' => 'Nepoznata greška u PHP funkciji mail()',
 'user-mail-no-addy' => 'Pokušaj slanja e-maila bez e-mail adrese.',
+'user-mail-no-body' => 'Pokušano slanje e-maila s praznim ili nerazumno kratkim sadržajem.',
 
 # Change password dialog
 'resetpass' => 'Promijeni korisničku šifru',
@@ -783,6 +785,7 @@ Privremena šifra: $2',
 'changeemail-oldemail' => 'Trenutna e-mail adresa:',
 'changeemail-newemail' => 'Nova e-mail adresa:',
 'changeemail-none' => '(ništa)',
+'changeemail-password' => 'Tvoja šifra/lozinka za {{SITENAME}}:',
 'changeemail-submit' => 'Promijeni e-mail',
 'changeemail-cancel' => 'Odustani',
 
@@ -951,8 +954,8 @@ Također nam garantujete da ste ovo Vi napisali, ili da ste ga kopirali iz javne
 '''NE ŠALJITE DJELA ZAŠTIĆENA AUTORSKIM PRAVOM BEZ DOZVOLE!'''",
 'longpageerror' => "'''Greška: tekst koji ste uneli je veličine {{PLURAL:$1|jedan kilobajt|$1 kilobajta|$1 kilobajta}}, što je veće od {{PLURAL:$2|dozvoljenog jednog kilobajta|dozvoljena $2 kilobajta|dozvoljenih $2 kilobajta}}.'''
 Stranica ne može biti sačuvana.",
-'readonlywarning' => "'''PAŽNJA: Baza je zaključana zbog održavanja, tako da nećete moći da snimite svoje izmjene za sada.
-Možda želite da kopirate i nalijepite tekst u tekst editor i sačuvate ga za kasnije.'''
+'readonlywarning' => "'''PAŽNJA: Baza je zaključana zbog održavanja, tako da nećete moći da sačuvate svoje izmjene za sada.'''
+Možda želite da kopirate i nalijepite tekst u tekst editor i sačuvate ga za kasnije.
 
 Administrator koji je zaključao bazu je naveo slijedeće objašnjenje: $1",
 'protectedpagewarning' => "'''PAŽNJA: Ova stranica je zaključana tako da samo korisnici sa administratorskim privilegijama mogu da je mijenjaju.'''
@@ -1260,7 +1263,7 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'search-interwiki-default' => '$1 rezultati:',
 'search-interwiki-more' => '(više)',
 'search-relatedarticle' => 'Povezano',
-'mwsuggest-disable' => 'Onemogući AJAX prijedloge',
+'mwsuggest-disable' => 'Onemogući prijedloge pretrage',
 'searcheverything-enable' => 'Pretraga u svim imenskim prostorima',
 'searchrelated' => 'povezano',
 'searchall' => 'sve',
@@ -1370,9 +1373,9 @@ Ovo se ne može vratiti unazad.',
 'prefs-emailconfirm-label' => 'E-mail potvrda:',
 'prefs-textboxsize' => 'Veličina prozora za uređivanje',
 'youremail' => 'E-mail:',
-'username' => 'Korisničko ime:',
-'uid' => 'Korisnički ID:',
-'prefs-memberingroups' => 'Član {{PLURAL:$1|grupe|grupa}}:',
+'username' => 'Ime {{GENDER:$1|korisnika|korisnice}}:',
+'uid' => '{{GENDER:$1|Korisnički}} ID:',
+'prefs-memberingroups' => '{{GENDER:$2|Korisnik|Korisnica}} je član {{PLURAL:$1|grupe|grupâ}}:',
 'prefs-registration' => 'Vrijeme registracije:',
 'yourrealname' => 'Vaše pravo ime:',
 'yourlanguage' => 'Jezik:',
@@ -2152,9 +2155,9 @@ Vidi također [[Special:WantedCategories|zatražene kategorije]].',
 'linksearch-pat' => 'Šema pretrage:',
 'linksearch-ns' => 'Imenski prostor:',
 'linksearch-ok' => 'Traži',
-'linksearch-text' => 'Mogu se koristiti džokeri poput "*.wikipedia.org".<br />
-Potreban je najviši domen, na primjer "*.org".<br />
-Podržani protokoli: <tt>$1</tt> (zadaje http:// ako ne navedete protokol).',
+'linksearch-text' => 'Možete koristiti džoker znakove poput "*.wikipedia.org".
+Potrebno je navesti osnovnu domenu (TLD), npr. "*.org".<br />
+Podržani {{PLURAL:$2|protokol|protokoli}}: <code>$1</code> (default je http:// ako nijedan protokol nije naveden).',
 'linksearch-line' => '$1 je povezan od $2',
 'linksearch-error' => 'Džokeri se mogu pojavljivati samo na početku naziva servera.',
 
@@ -2167,7 +2170,7 @@ Podržani protokoli: <tt>$1</tt> (zadaje http:// ako ne navedete protokol).',
 # Special:ActiveUsers
 'activeusers' => 'Spisak aktivnih korisnika',
 'activeusers-intro' => 'Ovo je spisak korisnika koji su napravili neku aktivnost u {{PLURAL:$1|zadnji $1 dan|zadnja $1 dana|zadnjih $1 dana}}.',
-'activeusers-count' => '{{PLURAL:$1|nedavna $1 izmjena|nedavne $1 izmjene|nedavnih $1 izmjena}} u {{PLURAL:$3|posljednji $3 dan|posljednja $3 dana|posljednjih $3 dana}}',
+'activeusers-count' => '{{PLURAL:$1|$1 izmjena|$1 izmjene|$1 izmjena}} u {{PLURAL:$3|posljednji $3 dan|posljednja $3 dana|posljednjih $3 dana}}',
 'activeusers-from' => 'Prikaži korisnike koji počinju sa:',
 'activeusers-hidebots' => 'Sakrij botove',
 'activeusers-hidesysops' => 'Sakrij administratore',
@@ -2230,7 +2233,7 @@ E-mail koju ste uneli u vašim [[Special:Preferences|postavkama]] će se prikaza
 'usermessage-editor' => 'Sistem za poruke',
 
 # Watchlist
-'watchlist' => 'Moj spisak praćenja',
+'watchlist' => 'Spisak praćenja',
 'mywatchlist' => 'Spisak praćenja',
 'watchlistfor2' => 'Za $1 $2',
 'nowatchlist' => 'Nemate ništa na svom spisku praćenih članaka.',
@@ -2238,8 +2241,8 @@ E-mail koju ste uneli u vašim [[Special:Preferences|postavkama]] će se prikaza
 'watchnologin' => 'Niste prijavljeni',
 'watchnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]] da bi ste mijenjali spisak praćenih članaka.',
 'addwatch' => 'Dodaj u popis praćenja',
-'addedwatchtext' => "Stranica \"[[:\$1]]\" je dodana [[Special:Watchlist|vašoj listi praćenih stranica]].
-Buduće promjene ove stranice i njoj pridružene stranice za razgovor će biti navedene ovdje, te će stranica izgledati '''podebljana''' u [[Special:RecentChanges|listi nedavnih]] izmjena kako bi se lakše uočila.",
+'addedwatchtext' => 'Stranica "[[:$1]]" je dodata vašem [[Special:Watchlist|spisku praćenih članaka]]. 
+Buduće promjene ove stranice i njoj pridružene stranice za razgovor će biti navedene ovde.',
 'removewatch' => 'Ukloni sa spiska praćenja',
 'removedwatchtext' => 'Stranica "[[:$1]]" je uklonjena s [[Special:Watchlist|vaše liste praćenja]].',
 'watch' => 'Prati',
@@ -2273,7 +2276,7 @@ Buduće promjene ove stranice i njoj pridružene stranice za razgovor će biti n
 'enotif_subject_moved' => '{{SITENAME}} stranicu $1 {{gender:|je premijestio|je premjestila|je premjestio}} $2',
 'enotif_subject_restored' => '{{SITENAME}} stranicu $1 {{gender:|je obnovio|je obnovila|je obnovio}} $2',
 'enotif_subject_changed' => '{{SITENAME}} stranicu $1 {{gender:|je promijenio|je promijenila|je promijenio}} $2',
-'enotif_body_intro_deleted' => '{{SITENAME}} stranica $1 je izbrisana na $PAGEEDITDATE od {{GENDER:|korisnika|korisnice|korisnika}} $2, v. $3 za trenutnu verziju.',
+'enotif_body_intro_deleted' => 'Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|obrisao|obrisala}} je dana $PAGEEDITDATE {{GENDER:$2|korisnik|korisnica}} $2, pogledajte $3.',
 'enotif_body_intro_created' => '{{SITENAME}} stranica $1 je stvorena na $PAGEEDITDATE od {{GENDER:|korisnika|korisnice|korisnika}} $2, v. $3 za trenutnu verziju.',
 'enotif_body_intro_moved' => '{{SITENAME}} stranica $1 je premještena na $PAGEEDITDATE od {{GENDER:|korisnika|korisnice|korisnika}} $2, v. $3 za trenutnu verziju.',
 'enotif_body_intro_restored' => '{{SITENAME}} stranica $1 je obnovljena na $PAGEEDITDATE od {{GENDER:|korisnika|korisnice|korisnika}} $2, v. $3 za trenutnu verziju.',
@@ -2380,6 +2383,8 @@ Pogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za pregled tr
 'prot_1movedto2' => '[[$1]] premješten na [[$2]]',
 'protect-badnamespace-title' => 'Nezaštitljiv imenski prostor',
 'protect-badnamespace-text' => 'Stranice u ovom imenskom prostoru se ne mogu zaštititi.',
+'protect-norestrictiontypes-text' => 'Ova stranica se ne može zaštititi jer nema dostupnih oblika ograničenja.',
+'protect-norestrictiontypes-title' => 'Stranica koju nije moguće zaštititi',
 'protect-legend' => 'Potvrdite zaštitu',
 'protectcomment' => 'Razlog:',
 'protectexpiry' => 'Ističe:',
@@ -2396,9 +2401,9 @@ Slijede trenutne postavke stranice '''$1''':",
 'protect-cascadeon' => 'Ova stranica je trenutno zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju|stranice, koje imaju}} uključenu prenosnu (kaskadnu) zaštitu.
 Možete promijeniti stepen zaštite ove stranice, ali to neće uticati na prenosnu zaštitu.',
 'protect-default' => 'Dozvoli svim korisnicima',
-'protect-fallback' => 'Potrebno je imati "$1" ovlasti',
-'protect-level-autoconfirmed' => 'Blokiraj nove i neregistrovane korisnike',
-'protect-level-sysop' => 'Samo administratori',
+'protect-fallback' => 'Dopušteno samo korisnicima s dozvolom "$1"',
+'protect-level-autoconfirmed' => 'Dopušteno samo automatski potvrđenim korisnicima',
+'protect-level-sysop' => 'Dopušteno samo administratorima',
 'protect-summary-cascade' => 'prenosna (kaskadna) zaštita',
 'protect-expiring' => 'ističe $1 (UTC)',
 'protect-expiring-local' => 'ističe $1',
@@ -2702,18 +2707,18 @@ Ako želite otključati ili zaključati bazu, ova datoteka mora biti omogućena
 # Move page
 'move-page' => 'Preusmjeravanje $1',
 'move-page-legend' => 'Premjestite stranicu',
-'movepagetext' => "Korištenjem donjeg formulara možete preimenovati stranicu, preusmjerivši njenu historiju na novi naziv.
-Stari naslov će postati stranica za preusmjerenje na novi naslov.
-Možete updateirati preusmjerenja koja idu na originalni naslov automatski.
-Ako to ne učinite, budite sigurni da ste provjerili [[Special:DoubleRedirects|dupla]] ili [[Special:BrokenRedirects|mrtva preusmjerenja]].
-Odgovorni ste za to da poveznice nastave povezivati stranice kojima su namijenjene.
-
-Uzmite u obzir da stranica '''neće''' biti preusmjerena ako već postoji stranica s novim naslovom, osim ako je prazna ili ako je preusmjerenje bez prethodne historije uređivanja.
-To znači da stranicu možete ponovno preimenovati u stari naslov ako je u pitanju bila pogreška, te da ne možete presnimiti već postojeću stranicu.
-
-'''UPOZORENJE!'''
-Ovo može biti drastična i neočekivana promjena za popularnu stranicu;
-budite sigurni da ste shvatili sve posljedice prije nego što nastavite.",
+'movepagetext' => "Korištenjem ovog formulara možete preimenovati stranicu, premještajući cijelu historiju na novo ime.
+Članak pod starim imenom će postati stranica koja preusmjerava na članak pod novim imenom. 
+Možete automatski izmjeniti preusmjerenje do izvornog naslova.
+Ako se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].
+Dužni ste provjeriti da svi linkovi i dalje nastave voditi na prave stranice.
+
+Imajte na umu da članak '''neće''' biti preusmjeren ukoliko već postoji članak pod imenom na koje namjeravate da preusmjerite osim u slučaju stranice za preusmjeravanje koja nema nikakvih starih izmjena.
+To znači da možete vratiti stranicu na prethodno mjesto ako pogriješite, ali ne možete zamijeniti postojeću stranicu.
+
+'''Pažnja!'''
+Ovo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice;
+Molimo dobro razmislite prije nego što preimenujete stranicu.",
 'movepagetext-noredirectfixer' => "Koristeći obrazac ispod ćete preimenovati stranicu i premjestiti cijelu njenu historiju na novi naziv.
 Stari naziv će postati preusmjerenje na novi naziv.
 Molimo provjerite da li postoje [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].
@@ -2893,6 +2898,7 @@ Molimo pokušajte ponovno.',
 'import-error-interwiki' => 'Ne mogu da uvezem stranicu „$1“ jer je njen naziv rezervisan za spoljno povezivanje (interwiki).',
 'import-error-special' => 'Ne mogu da uvezem stranicu „$1“ jer ona pripada posebnom imenskom prostoru koje ne prihvata stranice.',
 'import-error-invalid' => 'Ne mogu da uvezem stranicu „$1“ jer je njen naziv neispravan.',
+'import-error-unserialize' => 'Verzija $2 stranice "$1" ne može biti pročitana/uvezena. Zapisano je da verzija koristi $3 tip sadržaja u $4 formatu.',
 'import-options-wrong' => '{{PLURAL:$2|Pogrešna opcija|Pogrešne opcije}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Navedena osnovna stranica ima neispravan naslov.',
 'import-rootpage-nosubpage' => 'Imenski prostor „$1“ osnovne stranice ne dozvoljava podstranice.',
@@ -3029,6 +3035,7 @@ Ovo je vjerovatno izazvano vezom ka vanjskoj nepoželjnoj stranici.',
 'pageinfo-robot-noindex' => 'Ne može se indeksirati',
 'pageinfo-views' => 'Broj pregleda',
 'pageinfo-watchers' => 'Broj pratitelja stranice',
+'pageinfo-few-watchers' => 'Manje od $1 {{PLURAL:$1|pratioca|pratilaca}}',
 'pageinfo-redirects-name' => 'Preusmjeravanja na ovu stranicu',
 'pageinfo-subpages-name' => 'Podstranice ove stranice',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|preusmjerenje|preusmjerenja|preusmjerenja}}; $3 {{PLURAL:$3|nepreusmjerenje|nepreusmjerenja|nepreusmjerenja}})',
@@ -3043,6 +3050,7 @@ Ovo je vjerovatno izazvano vezom ka vanjskoj nepoželjnoj stranici.',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magična riječ|Magične 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-transclusions' => '{{PLURAL:$1|Stranica|Stranice}} uključene u ($1)',
 'pageinfo-toolboxlink' => 'Informacije o stranici',
 'pageinfo-redirectsto' => 'Preusmjerava na',
 'pageinfo-redirectsto-info' => 'Informacije',
@@ -3051,6 +3059,10 @@ Ovo je vjerovatno izazvano vezom ka vanjskoj nepoželjnoj stranici.',
 'pageinfo-protect-cascading' => 'Prenosiva zaštita stranica važi odavde',
 'pageinfo-protect-cascading-yes' => 'Da',
 'pageinfo-protect-cascading-from' => 'Stranice sa prenosivom zaštitom od',
+'pageinfo-category-info' => 'Informacije o kategoriji',
+'pageinfo-category-pages' => 'Broj stranica',
+'pageinfo-category-subcats' => 'Broj potkategorija',
+'pageinfo-category-files' => 'Broj datoteka',
 
 # Patrolling
 'markaspatrolleddiff' => 'Označi kao patrolirano',
@@ -3127,6 +3139,8 @@ Njegovim izvršavanjem možete da ugrozite Vaš sistem.",
 'minutes' => '{{PLURAL:$1|$1 minut|$1 minuta|$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',
 'just-now' => 'upravo sada',
 
@@ -3787,7 +3801,7 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'specialpages-group-highuse' => 'Često korištene stranice',
 'specialpages-group-pages' => 'Spiskovi stranica',
 'specialpages-group-pagetools' => 'Alati za stranice',
-'specialpages-group-wiki' => 'Wiki podaci i alati',
+'specialpages-group-wiki' => 'Podaci i alati',
 'specialpages-group-redirects' => 'Preusmjeravanje posebnih stranica',
 'specialpages-group-spam' => 'Spam alati',
 
@@ -3884,6 +3898,7 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'logentry-newusers-newusers' => 'Korisnički račun $1 je napravljen',
 'logentry-newusers-create' => 'Korisnički račun $1 je napravljen',
 'logentry-newusers-create2' => 'Korisnički račun $3 {{GENDER:|je napravio|je napravila|je napravio}} $1',
+'logentry-newusers-byemail' => 'Korisnički račun $3 je napravio $1 i lozinka/šifra je poslana putem e-maila',
 'logentry-newusers-autocreate' => 'Račun $1 je samostalno otvoren',
 '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 {{GENDER:$1|je promenio|je promenila|je promenio}} članstvo grupe za $3',
@@ -3942,6 +3957,7 @@ U suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajat
 'api-error-ok-but-empty' => 'Unutrašnja greška: nema odgovora od servera.',
 'api-error-overwrite' => 'Pisanje preko postojeće datoteke nije dopušteno.',
 'api-error-stashfailed' => 'Unutrašnja greška: server nije mogao da spremi privremenu datoteku.',
+'api-error-publishfailed' => 'Unutrašnja greška: server nije mogao da spremi privremenu datoteku.',
 'api-error-timeout' => 'Server nije odgovorio unutar očekivanog vremena.',
 'api-error-unclassified' => 'Desila se nepoznata greška',
 'api-error-unknown-code' => 'Nepoznata greška: "$1"',
index c8e03a6..34d3fbe 100644 (file)
@@ -2173,7 +2173,7 @@ Môžete zúžiť rozsah, ak zvolíte typ záznamu, používateľské meno alebo
 'allpagesprev' => 'Predchádzajúci',
 'allpagesnext' => 'Ďalší',
 'allpagessubmit' => 'Vykonať',
-'allpagesprefix' => 'Zobraziť stránky s predponou:',
+'allpagesprefix' => 'Zobraziť stránky začínajúce na:',
 'allpagesbadtitle' => 'Zadaný názov stránky je neplatný alebo mal medzijazykový alebo interwiki prefix. Môže obsahovať jeden alebo viac znakov, ktoré nie je možné použiť v názve stránky.',
 'allpages-bad-ns' => '{{SITENAME}} nemá menný priestor „$1“.',
 'allpages-hide-redirects' => 'Skryť presmerovania',
index ce5cac7..bd709c6 100644 (file)
@@ -1553,7 +1553,7 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 'nchanges' => '$1 {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb|sprememb}}',
 'recentchanges' => 'Zadnje spremembe',
 'recentchanges-legend' => 'Možnosti zadnjih sprememb',
-'recentchanges-summary' => 'Na tej strani lahko spremljajte najnedavnejše spremembe wikija.',
+'recentchanges-summary' => 'Na tej strani lahko spremljate najnovejše spremembe wikija.',
 'recentchanges-feed-description' => 'Spremljajte zadnje spremembe wikija prek tega vira.',
 'recentchanges-label-newpage' => 'S tem urejanjem je bila ustvarjena nova stran',
 'recentchanges-label-minor' => 'Manjše urejanje',
index 6767d65..d93c164 100644 (file)
@@ -975,6 +975,7 @@ ku saabsan: $1',
 'filehist-thumb' => 'Sawir yar',
 'filehist-thumbtext' => 'Sawirka yar nuuciisa ahaa $1',
 'filehist-user' => 'Isticmaale',
+'filehist-dimensions' => 'Cabirka',
 'filehist-comment' => 'Ka hadalka',
 'imagelinks' => 'Faylka lagu isticmaalay',
 'linkstoimage' => 'Boggagaan soo socota ee  {{PLURAL:$1|ah waxey la xiriiraan|$1 ah waxey la xiriiraan}} faylkan:',
index 86a55d5..7b4cbe5 100644 (file)
@@ -197,7 +197,7 @@ $linkTrail = '/^([a-z]+)(.*)\$/sD';
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'à¸\82ีà¸\94à¹\80สà¹\89à¸\99à¹\83à¸\95à¹\89ลิà¸\87à¸\81à¹\8c',
+'tog-underline' => 'à¸\81ารà¸\82ีà¸\94à¹\80สà¹\89à¸\99à¹\83à¸\95à¹\89ลิà¸\87à¸\81à¹\8c:',
 'tog-justify' => 'จัดย่อหน้าชิดขอบ',
 'tog-hideminor' => 'ซ่อนการแก้ไขเล็กน้อยในหน้าปรับปรุงล่าสุด',
 'tog-hidepatrolled' => 'ซ่อนการแก้ไขที่ตรวจแล้วในหน้าปรับปรุงล่าสุด',
@@ -248,7 +248,7 @@ $messages = array(
 'underline-default' => 'ค่าโดยปริยายของหน้าตาหรือเบราว์เซอร์',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'รูà¸\9bà¹\81à¸\9aà¸\9aà¸\95ัวอักษรในพื้นที่แก้ไข:',
+'editfont-style' => 'รูà¸\9bà¹\81à¸\9aà¸\9aà¸\8aุà¸\94à¹\81à¸\9aà¸\9aอักษรในพื้นที่แก้ไข:',
 'editfont-default' => 'ค่าตั้งต้นของเบราว์เซอร์',
 'editfont-monospace' => 'ชุดอักษรแบบความกว้างคงที่',
 'editfont-sansserif' => 'ชุดอักษรแบบไม่มีเชิง',
@@ -333,7 +333,7 @@ $messages = array(
 'morenotlisted' => 'มีที่ยังไม่แสดงอีก...',
 'mypage' => 'หน้า',
 'mytalk' => 'พูดคุย',
-'anontalk' => 'พูดคุยกับไอพีนี้',
+'anontalk' => 'à¸\9eูà¸\94à¸\84ุยà¸\81ัà¸\9aà¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\99ีà¹\89',
 'navigation' => 'ป้ายบอกทาง',
 'and' => '&#32;และ',
 
@@ -369,8 +369,8 @@ $messages = array(
 'returnto' => 'กลับไป $1',
 'tagline' => 'จาก {{SITENAME}}',
 'help' => 'คำอธิบาย',
-'search' => 'สืà¸\9aà¸\84à¹\89à¸\99',
-'searchbutton' => 'สืà¸\9aà¸\84à¹\89à¸\99',
+'search' => 'à¸\84à¹\89à¸\99หา',
+'searchbutton' => 'à¸\84à¹\89à¸\99หา',
 'go' => 'ไป',
 'searcharticle' => 'ไป',
 'history' => 'ประวัติหน้า',
@@ -391,14 +391,14 @@ $messages = array(
 'protect' => 'ล็อก',
 'protect_change' => 'เปลี่ยน',
 'protectthispage' => 'ล็อกหน้านี้',
-'unprotect' => 'à¹\80à¸\9bลีà¹\88ยà¸\99à¸\84à¹\88าà¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99',
+'unprotect' => 'เปลี่ยนการป้องกัน',
 'unprotectthispage' => 'เปลี่ยนการป้องกันหน้านี้',
 'newpage' => 'หน้าใหม่',
 'talkpage' => 'อภิปรายหน้านี้',
 'talkpagelinktext' => 'พูดคุย',
 'specialpage' => 'หน้าพิเศษ',
 'personaltools' => 'เครื่องมือส่วนตัว',
-'postcomment' => 'à¸\95อนใหม่',
+'postcomment' => 'สà¹\88วนใหม่',
 'articlepage' => 'ดูหน้าเนื้อหา',
 'talk' => 'อภิปราย',
 'views' => 'ดู',
@@ -419,18 +419,18 @@ $messages = array(
 'protectedpage' => 'หน้าถูกล็อก',
 'jumpto' => 'ข้ามไปยัง:',
 'jumptonavigation' => 'นำทาง',
-'jumptosearch' => 'สืà¸\9aà¸\84à¹\89à¸\99',
+'jumptosearch' => 'à¸\84à¹\89à¸\99หา',
 'view-pool-error' => 'ขออภัย ขณะนี้เซิร์ฟเวอร์มีภาระเกิน
 ผู้ใช้พยายามเข้าดูหน้านี้มากเกินไป
 กรุณารอสักครู่ก่อนที่จะเข้าดูหน้านี้อีกครั้งหนึ่ง
 
 $1',
-'pool-timeout' => 'à¹\80à¸\81ิà¸\99à¹\80วลารอà¸\81ารลà¹\87อà¸\84',
+'pool-timeout' => 'à¹\80à¸\81ิà¸\99à¹\80วลารอà¸\81ารลà¹\87อà¸\81',
 'pool-queuefull' => 'พื้นที่รองรับคิวเต็ม',
-'pool-errorunknown' => 'à¹\80à¸\81ิà¸\94à¸\84วามผิดพลาดไม่ทราบสาเหตุ',
+'pool-errorunknown' => 'à¹\80à¸\81ิà¸\94à¸\82à¹\89อผิดพลาดไม่ทราบสาเหตุ',
 
 # 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).
-'aboutsite' => 'เกี่ยวกับ {{SITENAME}}',
+'aboutsite' => 'เกี่ยวกับ{{SITENAME}}',
 'aboutpage' => 'Project:เกี่ยวกับ',
 'copyright' => 'เนื้อหาอนุญาตให้เผยแพร่ภายใต้ $1',
 'copyrightpage' => '{{ns:project}}:ลิขสิทธิ์',
@@ -450,8 +450,8 @@ $1',
 'privacypage' => 'Project:นโยบายสิทธิส่วนบุคคล',
 
 'badaccess' => 'มีข้อผิดพลาดในการใช้สิทธิ',
-'badaccess-group0' => 'à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\95ามà¸\97ีà¹\88รà¹\89อà¸\87à¸\82อ',
-'badaccess-groups' => 'à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารà¸\97ีà¹\88à¸\84ุà¸\93รà¹\89อà¸\87à¸\82อà¸\99ีà¹\89สà¸\87วà¸\99à¹\84วà¹\89à¹\80à¸\89à¸\9eาะà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\83à¸\99{{PLURAL:$2|à¸\81ลุà¹\88ม|à¸\81ลุà¹\88มหà¸\99ึà¹\88à¸\87à¸\81ลุà¹\88มà¹\83à¸\94 à¸\94ัà¸\87à¸\99ีà¹\89}}: $1',
+'badaccess-group0' => 'คุณไม่ได้รับอนุญาตให้ดำเนินการตามที่ขอ',
+'badaccess-groups' => 'ปฏิบัติการที่คุณขอนี้สงวนไว้เฉพาะผู้ใช้ใน{{PLURAL:$2|กลุ่ม|กลุ่มหนึ่งกลุ่มใด ดังนี้}}: $1',
 
 'versionrequired' => 'ต้องการมีเดียวิกิรุ่น $1',
 'versionrequiredtext' => 'ต้องการมีเดียวิกิรุ่น $1 สำหรับใช้งานหน้านี้ ดู[[Special:Version|หน้ารุ่น]]',
@@ -477,7 +477,7 @@ $1',
 'hidetoc' => 'ซ่อน',
 'collapsible-collapse' => 'ยุบ',
 'collapsible-expand' => 'ขยาย',
-'thisisdeleted' => 'à¹\81สà¸\94à¸\87หรือà¹\80รียà¸\81à¸\94ู $1',
+'thisisdeleted' => 'à¸\94ูหรือà¸\81ูà¹\89à¸\84ืà¸\99 $1 à¸«à¸£à¸·à¸­à¹\84มà¹\88',
 'viewdeleted' => 'ดู $1',
 'restorelink' => '$1 การแก้ไขที่ถูกลบ',
 'feedlinks' => 'ฟีด',
@@ -553,18 +553,18 @@ $1',
 'fileexistserror' => 'ไม่สามารถเขียนไฟล์ "$1" ได้ เนื่องจากมีไฟล์อยู่แล้ว',
 'unexpected' => 'ผลที่ไม่คาดคิด: "$1"="$2"',
 'formerror' => 'ผิดพลาด: ไม่สามารถส่งแบบได้',
-'badarticleerror' => 'à¹\84มà¹\88สามารà¸\96à¸\94ำà¹\80à¸\99ิà¸\99à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารà¸\99ี้ในหน้านี้',
+'badarticleerror' => 'à¸\81ารà¸\81ระà¸\97ำà¸\99ีà¹\89à¹\84มà¹\88สามารà¸\96à¸\97ำà¹\84à¸\94้ในหน้านี้',
 'cannotdelete' => 'ไม่สามารถลบหน้าหรือไฟล์ "$1" 
 อาจมีผู้อื่นลบไปแล้ว',
 'cannotdelete-title' => "ไม่สามารถลบหน้า ''$1''",
 'delete-hook-aborted' => 'การลบถูกฮุกยกเลิก
-à¹\84มà¹\88มีà¸\84ำอà¸\98ิà¸\9aายสำหรัà¸\9aà¸\81ารยà¸\81à¹\80ลิà¸\81à¸\99ีà¹\89',
-'badtitle' => 'à¸\8aืà¹\88อà¹\84มà¹\88à¹\80หมาะสม',
-'badtitletext' => 'à¸\8aืà¹\88อà¸\82อà¸\87หà¸\99à¹\89าà¸\97ีà¹\88รà¹\89อà¸\87à¸\82อà¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87 à¸­à¸²à¸\88à¹\80à¸\9bà¹\87à¸\99à¸\8aืà¹\88อวà¹\88าà¸\87 à¸«à¸£à¸·à¸­à¸\8aืà¹\88อà¸\97ีà¹\88à¸\9cิà¸\94à¸\9eลาà¸\94à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81ลิà¸\87à¸\81à¹\8cà¸\82à¹\89ามมาà¸\88าà¸\81ภาษาอืà¹\88à¸\99
-หรือà¹\84มà¹\88à¸\8aืà¹\88อà¸\97ีà¹\88à¹\83à¸\8aà¹\89อาà¸\88มีà¸\95ัวอัà¸\81ษรà¸\97ีà¹\88à¹\84มà¹\88สามารà¸\96à¸\9bราà¸\81à¸\8fà¹\83à¸\99à¸\8aืà¹\88อà¸\81à¹\87à¹\84à¸\94à¹\89',
-'perfcached' => 'à¸\82à¹\89อมูลà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¸\96ูà¸\81à¹\80à¸\81à¹\87à¸\9aà¹\84วà¹\89à¹\83à¸\99à¹\81à¸\84à¸\8a à¹\81ละอาà¸\88ลà¹\89าสมัย à¸¡à¸µà¸\9cลà¸\81ารà¸\84à¹\89à¸\99หาสูà¸\87สุà¸\94 $1 à¸£à¸²à¸¢à¸\81ารà¹\83à¸\99à¹\81à¸\84à¸\8a',
-'perfcachedts' => 'à¸\82à¹\89อมูลà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¸\96ูà¸\81à¹\80à¸\81à¹\87à¸\9aà¹\84วà¹\89à¹\83à¸\99หà¸\99à¹\88วยà¸\84วามà¸\88ำà¹\81à¸\84à¸\8a à¹\81ละà¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\9bรัà¸\9aลà¹\88าสุà¸\94à¹\80มืà¹\88อ $1 à¸\84à¹\88าสูà¸\87สุà¸\94 $4 à¸\9cลลัà¸\9eà¸\98à¹\8cสามารà¸\96à¹\80à¸\81à¹\87à¸\9aà¹\84วà¹\89à¹\83à¸\99หà¸\99à¹\88วยà¸\84วามà¸\88ำแคชได้',
-'querypage-no-updates' => 'à¸\82à¸\93ะà¸\99ีà¹\89à¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81ระà¸\87ัà¸\9a à¸\82à¹\89อมูลà¹\83à¸\99à¸\97ีà¹\88à¸\99ีà¹\88จะไม่รีเฟรชเป็นปัจจุบัน',
+à¹\82à¸\94ยà¹\84มà¹\88มีà¸\84ำอà¸\98ิà¸\9aาย',
+'badtitle' => 'à¹\83à¸\8aà¹\89à¸\8aืà¹\88อหัวà¸\82à¹\89อà¸\99ีà¹\89à¹\84มà¹\88à¹\84à¸\94à¹\89',
+'badtitletext' => 'à¸\8aืà¹\88อหà¸\99à¹\89าà¸\97ีà¹\88à¸\82อà¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87 à¹\80à¸\9bà¹\87à¸\99à¸\8aืà¹\88อวà¹\88าà¸\87 à¸«à¸£à¸·à¸­à¸\8aืà¹\88อà¸\82à¹\89ามภาษาหรือà¸\82à¹\89ามวิà¸\81ิà¸\97ีà¹\88à¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87à¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87
+อาà¸\88มีอัà¸\81à¸\82ระà¸\97ีà¹\88à¹\84มà¹\88สามารà¸\96à¹\83à¸\8aà¹\89à¹\83à¸\99à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¹\84à¸\94à¹\89',
+'perfcached' => 'ข้อมูลต่อไปนี้ถูกเก็บในแคช และอาจล้าสมัย มีผลการค้นหาสูงสุด $1 รายการในแคช',
+'perfcachedts' => 'à¸\82à¹\89อมูลà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¸\96ูà¸\81à¹\80à¸\81à¹\87à¸\9aà¹\83à¸\99à¹\81à¸\84à¸\8a à¹\81ละà¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\9bรัà¸\9aลà¹\88าสุà¸\94à¹\80มืà¹\88อ $1 à¸\9cลลัà¸\9eà¸\98à¹\8cสูà¸\87สุà¸\94 $4 à¸£à¸²à¸¢à¸\81ารสามารà¸\96à¹\80à¸\81à¹\87à¸\9aà¹\83à¸\99แคชได้',
+'querypage-no-updates' => 'à¸\82à¸\93ะà¸\99ีà¹\89à¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81ระà¸\87ัà¸\9a à¸\82à¹\89อมูลà¹\83à¸\99à¸\97ีà¹\88à¸\99ีà¹\89จะไม่รีเฟรชเป็นปัจจุบัน',
 'wrong_wfQuery_params' => 'พารามิเตอร์ที่ส่งไป wfQuery() ไม่ถูกต้อง<br />
 ฟังก์ชั่น: $1<br />
 คำค้น: $2',
@@ -588,13 +588,15 @@ $1',
 'ns-specialprotected' => 'หน้าพิเศษไม่สามารถแก้ไขได้',
 'titleprotected' => "ชื่อเรื่องนี้ถูกป้องกันมิให้สร้างโดย [[User:$1|$1]] 
 เหตุผลที่ให้ไว้คือ ''$2''",
-'invalidtitle-knownnamespace' => 'ชื่อที่มีเนมสเปซ "$2" กับข้อความ "$3" ไม่ถูกต้อง',
-'invalidtitle-unknownnamespace' => 'ชื่อที่ไม่ทราบเนมสเปซหมายเลข $1 กับข้อความ "$2" ไม่ถูกต้อง',
+'filereadonlyerror' => 'ไม่สามารถแก้ไขไฟล์ "$1" เพราะที่เก็บไฟล์ "$2" อยู่ในภาวะอ่านอย่างเดียว
+ผู้ดูแลระบบที่ล็อกให้คำอธิบายว่า: "$3"',
+'invalidtitle-knownnamespace' => 'ชื่อเรื่องที่มีเนมสเปซ "$2" กับข้อความ "$3" ไม่ถูกต้อง',
+'invalidtitle-unknownnamespace' => 'ชื่อเรื่องที่ไม่ทราบเนมสเปซหมายเลข $1 กับข้อความ "$2" ไม่ถูกต้อง',
 'exception-nologin' => 'ไม่ได้ล็อกอิน',
-'exception-nologin-text' => 'หน้าหรือปฏิบัติการนี้กำหนดให้คุณล็อกอินเข้าสู่วิกินี้ก่อน',
+'exception-nologin-text' => 'หà¸\99à¹\89าหรือà¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารà¸\99ีà¹\89à¸\81ำหà¸\99à¸\94à¹\83หà¹\89à¸\84ุà¸\93à¸\95à¹\89อà¸\87ลà¹\87อà¸\81อิà¸\99à¹\80à¸\82à¹\89าสูà¹\88วิà¸\81ิà¸\99ีà¹\89à¸\81à¹\88อà¸\99',
 
 # Virus scanner
-'virus-badscanner' => "à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าผิดพลาด: ไม่รู้จักตัวสแกนไวรัส: ''$1''",
+'virus-badscanner' => "à¹\82à¸\84รà¸\87à¹\81à¸\9aà¸\9aผิดพลาด: ไม่รู้จักตัวสแกนไวรัส: ''$1''",
 'virus-scanfailed' => 'การสแกนล้มเหลว (โค้ด $1)',
 'virus-unknownscanner' => 'ไม่รู้จักโปรแกรมป้องกันไวรัสตัวนี้:',
 
@@ -602,7 +604,7 @@ $1',
 'logouttext' => "'''ขณะนี้คุณได้ล็อกเอาต์แล้ว'''
 
 คุณสามารถใช้งาน {{SITENAME}} ต่อในฐานะผู้ใช้นิรนาม หรือคุณสามารถ<span class='plainlinks'>[$1 ล็อกอินกลับเข้าไป]</span>ด้วยชื่อผู้ใช้เดิมหรือชื่อผู้ใช้อื่น
-อย่างไรก็ตามอาจมีบางหน้าที่แสดงผลเสมือนคุณกำลังล็อกอินอยู่ จนกว่าคุณจะล้างแคชเบราว์เซอร์ของคุณ",
+อยà¹\88าà¸\87à¹\84รà¸\81à¹\87à¸\95ามอาà¸\88มีà¸\9aาà¸\87หà¸\99à¹\89าà¸\97ีà¹\88à¹\81สà¸\94à¸\87à¸\9cลà¹\80สมือà¸\99วà¹\88าà¸\84ุà¸\93à¸\81ำลัà¸\87ลà¹\87อà¸\81อิà¸\99อยูà¹\88 à¸\88à¸\99à¸\81วà¹\88าà¸\84ุà¸\93à¸\88ะลà¹\89าà¸\87à¹\81à¸\84à¸\8aà¹\80à¸\9aราวà¹\8cà¹\80à¸\8bอรà¹\8cà¸\82อà¸\87à¸\84ุà¸\93",
 'welcomeuser' => 'ยินดีต้อนรับ $1!',
 'welcomecreation-msg' => 'บัญชีของคุณถูกสร้างขึ้นแล้ว
 อย่าลืมเปลี่ยนแปลง[[Special:Preferences|การตั้งค่าใน {{SITENAME}}]] ของคุณ',
@@ -654,24 +656,24 @@ $1',
 'password-login-forbidden' => 'ห้ามใช้ชื่อผู้ใช้และรหัสผ่านนี้',
 'mailmypassword' => 'อีเมลรหัสผ่านใหม่',
 'passwordremindertitle' => 'รหัสผ่านชั่วคราวใหม่สำหรับ {{SITENAME}}',
-'passwordremindertext' => 'à¸\9cูà¹\89à¹\83à¸\94à¸\9cูà¹\89หà¸\99ึà¹\88à¸\87 (à¸\8bึà¹\88à¸\87อาà¸\88à¹\80à¸\9bà¹\87à¸\99à¸\84ุà¸\93 à¸\97ีà¹\88à¹\83à¸\8aà¹\89หมายà¹\80ลà¸\82à¹\84อà¸\9eี $1) à¸\82อà¹\83หà¹\89สà¹\88à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\82อà¸\87 {{SITENAME}} ($4) à¸£à¸«à¸±à¸ªà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราวสำหรัà¸\9aà¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89 "$2" à¸\96ูà¸\81สรà¹\89าà¸\87à¸\82ึà¹\89à¸\99 à¹\81ละà¸\81ำหà¸\99à¸\94à¹\80à¸\9bà¹\87à¸\99 "$3" à¸«à¸²à¸\81เป็นเจตนาของคุณ คุณจำต้องล็อกอินและเลือกรหัสผ่านใหม่ ณ ขณะนี้ รหัสผ่านชั่วคราวของคุณจะหมดอายุใน $5 วัน
+'passwordremindertext' => 'à¸\9cูà¹\89à¹\83à¸\94à¸\9cูà¹\89หà¸\99ึà¹\88à¸\87 (à¸\8bึà¹\88à¸\87อาà¸\88à¹\80à¸\9bà¹\87à¸\99à¸\84ุà¸\93 à¸\97ีà¹\88à¹\83à¸\8aà¹\89à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eี $1) à¸\82อà¹\83หà¹\89สà¹\88à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\82อà¸\87 {{SITENAME}} ($4) à¸£à¸«à¸±à¸ªà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราวสำหรัà¸\9aà¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89 "$2" à¸\96ูà¸\81สรà¹\89าà¸\87à¸\82ึà¹\89à¸\99 à¹\81ละà¸\81ำหà¸\99à¸\94à¹\80à¸\9bà¹\87à¸\99 "$3" à¸«à¸²à¸\81à¸\81ารà¸\82อรหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\99ีà¹\89เป็นเจตนาของคุณ คุณจำต้องล็อกอินและเลือกรหัสผ่านใหม่ ณ ขณะนี้ รหัสผ่านชั่วคราวของคุณจะหมดอายุใน $5 วัน
 
-หาà¸\81à¸\9aุà¸\84à¸\84ลอืà¹\88à¸\99à¸\9aุà¸\84à¸\84ลà¹\83à¸\94ขอรหัสผ่านใหม่ หรือหากคุณจำรหัสผ่านของคุณได้แล้ว และไม่ต้องการเปลี่ยนรหัสผ่านใหม่อีกต่อไป คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป',
+หาà¸\81à¹\80à¸\9bà¹\87à¸\99à¸\9aุà¸\84à¸\84ลอืà¹\88à¸\99à¸\97ีà¹\88ขอรหัสผ่านใหม่ หรือหากคุณจำรหัสผ่านของคุณได้แล้ว และไม่ต้องการเปลี่ยนรหัสผ่านใหม่อีกต่อไป คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป',
 'noemail' => 'ไม่มีที่อยู่อีเมลบันทึกไว้สำหรับผู้ใช้ "$1"',
 'noemailcreate' => 'คุณจำต้องใส่ที่อยู่อีเมลให้ถูกต้อง',
-'passwordsent' => 'รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¹\84à¸\94à¹\89à¸\96ูà¸\81สà¹\88à¸\87à¹\84à¸\9bยัà¸\87à¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\97ีà¹\88ลà¸\87à¸\97ะà¹\80à¸\9aียà¸\99à¹\84วà¹\89à¸\82อà¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89 "$1"
-à¸\81รุà¸\93าลà¹\87อà¸\81อิà¸\99อีà¸\81à¸\84รัà¹\89à¸\87หลัà¸\87à¸\88าà¸\81à¸\84ุà¸\93à¹\84à¸\94à¹\89รัà¸\9aอีà¹\80มล',
-'blocked-mailpassword' => 'หมายà¹\80ลà¸\82ไอพีของคุณถูกบล็อกมิให้แก้ไข ฉะนั้น จึงไม่ได้รับอนุญาตให้ใช้ฟังก์ชันขอกู้รหัสผ่านเพื่อป้องกันการกระทำผิด',
-'eauthentsent' => 'อีà¹\80มลยืà¸\99ยัà¸\99à¹\84à¸\94à¹\89à¸\96ูà¸\81สà¹\88à¸\87à¹\84à¸\9bà¸\97ีà¹\88อีà¹\80มลà¸\97ีà¹\88à¹\84à¸\94à¹\89à¸\96ูà¸\81à¹\80สà¸\99อ à¸\81à¹\88อà¸\99à¸\97ีà¹\88อีà¹\80มลà¸\88ะà¸\96ูà¸\81สà¹\88à¸\87à¹\84à¸\9bà¸\97ีà¹\88à¸\8aืà¹\88อà¸\9aัà¸\8dà¸\8aีà¸\99ัà¹\89à¸\99 à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\95ามà¸\84ำà¹\81à¸\99ะà¸\99ำà¹\83à¸\99อีà¹\80มลà¹\80à¸\9eืà¹\88อยืà¸\99ยัà¸\99วà¹\88าหมายà¹\80ลยà¸\9aัà¸\8dà¸\8aีà¸\99ัà¹\89à¸\99à¹\80à¸\9bà¹\87à¸\99à¸\82อà¸\87à¸\84ุà¸\93',
+'passwordsent' => 'รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\96ูà¸\81สà¹\88à¸\87à¹\84à¸\9bยัà¸\87à¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\97ีà¹\88ลà¸\87à¸\97ะà¹\80à¸\9aียà¸\99à¹\84วà¹\89à¸\82อà¸\87 "$1"
+กรุณาล็อกอินอีกครั้งหลังได้รับอีเมล',
+'blocked-mailpassword' => 'à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88ไอพีของคุณถูกบล็อกมิให้แก้ไข ฉะนั้น จึงไม่ได้รับอนุญาตให้ใช้ฟังก์ชันขอกู้รหัสผ่านเพื่อป้องกันการกระทำผิด',
+'eauthentsent' => 'อีà¹\80มลยืà¸\99ยัà¸\99à¹\84à¸\94à¹\89à¸\96ูà¸\81สà¹\88à¸\87à¹\84à¸\9bà¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\97ีà¹\88à¹\80สà¸\99อ à¸\81à¹\88อà¸\99à¸\97ีà¹\88อีà¹\80มลà¸\88ะà¸\96ูà¸\81สà¹\88à¸\87à¹\84à¸\9bà¸\97ีà¹\88à¸\8aืà¹\88อà¸\9aัà¸\8dà¸\8aีà¸\99ัà¹\89à¸\99 à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\95ามà¸\84ำà¹\81à¸\99ะà¸\99ำà¹\83à¸\99อีà¹\80มลà¹\80à¸\9eืà¹\88อยืà¸\99ยัà¸\99วà¹\88าà¸\9aัà¸\8dà¸\8aีà¸\99ัà¹\89à¸\99à¹\80à¸\9bà¹\87à¸\99à¸\82อà¸\87à¸\84ุà¸\93à¸\88ริà¸\87 à¹\86',
 'throttled-mailpassword' => 'ตัวเตือนรหัสผ่านได้ถูกส่งไปแล้วใน $1 ชั่วโมงที่ผ่านมา ตัวเตือนรหัสผ่านนี้จะถูกส่งได้หนึ่งครั้งต่อ $1 ชั่วโมงเท่านั้น เพื่อป้องกันการกระทำผิด',
-'mailerror' => 'à¹\84มà¹\88สามารà¸\96สà¹\88à¸\87อีà¹\80มลà¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81 $1',
-'acct_creation_throttle_hit' => 'à¸\9cูà¹\89à¹\80à¸\82à¹\89าà¸\8aมà¸\97ีà¹\88à¹\83à¸\8aà¹\89หมายà¹\80ลà¸\82à¹\84อà¸\9eีà¸\82อà¸\87à¸\84ุà¸\93à¹\83à¸\99วิà¸\81ิà¸\99ีà¹\89 à¹\84à¸\94à¹\89สรà¹\89าà¸\87à¸\8aืà¹\88อà¸\9aัà¸\8dà¸\8aีà¹\81ลà¹\89ว $1 à¸\9aัà¸\8dà¸\8aีà¹\83à¸\99วัà¸\99à¸\97ีà¹\88à¸\9cà¹\88าà¸\99มา à¸\8bึà¹\88à¸\87à¹\80à¸\9bà¹\87à¸\99à¸\88ำà¸\99วà¸\99มาà¸\81à¸\97ีà¹\88สุดที่อนุญาตในช่วงเวลาดังกล่าว
-à¸\88ึà¸\87สà¹\88à¸\87à¸\9cลà¹\83หà¹\89à¸\9cูà¹\89à¹\80à¸\82à¹\89าà¸\8aมà¸\97ีà¹\88à¹\83à¸\8aà¹\89หมายà¹\80ลà¸\82ไอพีนี้ ไม่สามารถสร้างบัญชีได้อีกในขณะนี้',
-'emailauthenticated' => 'อีเมลของคุณได้รับการยืนยันเมื่อวันที่ $2 เวลา $3',
+'mailerror' => 'à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารสà¹\88à¸\87à¹\80มล: $1',
+'acct_creation_throttle_hit' => 'à¸\9cูà¹\89à¹\80à¸\82à¹\89าà¸\8aมวิà¸\81ิà¸\99ีà¹\89à¸\97ีà¹\88à¹\83à¸\8aà¹\89à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\82อà¸\87à¸\84ุà¸\93 à¹\84à¸\94à¹\89สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีà¹\81ลà¹\89ว $1 à¸\9aัà¸\8dà¸\8aีà¹\83à¸\99วัà¸\99à¸\97ีà¹\88à¸\9cà¹\88าà¸\99มา à¸\8bึà¹\88à¸\87à¹\80à¸\9bà¹\87à¸\99à¸\88ำà¸\99วà¸\99สูà¸\87สุดที่อนุญาตในช่วงเวลาดังกล่าว
+à¸\88ึà¸\87สà¹\88à¸\87à¸\9cลà¹\83หà¹\89à¸\9cูà¹\89à¹\80à¸\82à¹\89าà¸\8aมà¸\97ีà¹\88à¹\83à¸\8aà¹\89à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88ไอพีนี้ ไม่สามารถสร้างบัญชีได้อีกในขณะนี้',
+'emailauthenticated' => 'à¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\82อà¸\87à¸\84ุà¸\93à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารยืà¸\99ยัà¸\99à¹\80มืà¹\88อวัà¸\99à¸\97ีà¹\88 $2 à¹\80วลา $3',
 'emailnotauthenticated' => 'ที่อยู่อีเมลของคุณยังไม่ได้รับการยืนยัน 
 ไม่มีการส่งอีเมลสำหรับคุณลักษณะใด ๆ ต่อไปนี้',
 'noemailprefs' => 'ระบุที่อยู่อีเมลในการตั้งค่าของคุณเพื่อให้คุณลักษณะเหล่านี้ทำงานได้',
-'emailconfirmlink' => 'ยืนยันอีเมลของคุณ',
+'emailconfirmlink' => 'ยืà¸\99ยัà¸\99à¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\82อà¸\87à¸\84ุà¸\93',
 'invalidemailaddress' => 'ไม่สามารถรับที่อยู่อีเมลได้ เพราะดูมีรูปแบบไม่ถูกต้อง
 โปรดใส่ที่อยู่ให้มีรูปแบบถูกต้อง หรือเว้นช่องนั้น',
 'cannotchangeemail' => 'ไม่สามารถเปลี่ยนที่อยู่อีเมลบนวิกินี้',
@@ -682,16 +684,17 @@ $1',
 'createaccount-text' => 'มีบางคนสร้างบัญชีโดยใช้ที่อยู่อีเมลของคุณบน {{SITENAME}} ($4) โดยใช้ชื่อ "$2" และรหัสผ่าน "$3" คุณควรล็อกอินเพื่อเปลี่ยนรหัสผ่านทันที
 
 คุณอาจเพิกเฉยข้อความนี้ หากการสร้างบัญชีนี้เกิดจากความผิดพลาด',
-'usernamehasherror' => 'à¹\83à¸\99à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\95à¹\89อà¸\87à¹\84มà¹\88มีà¸\95ัวอัà¸\81ษร "#"',
-'login-throttled' => 'à¸\84ุà¸\93à¹\84à¸\94à¹\89พยายามล็อกอินมากครั้งเกินไป
+'usernamehasherror' => 'à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\95à¹\89อà¸\87à¹\84มà¹\88มีอัà¸\81à¸\82ระà¹\81ฮà¸\8a',
+'login-throttled' => 'à¸\97ีà¹\88à¸\9cà¹\88าà¸\99มาà¸\84ุà¸\93พยายามล็อกอินมากครั้งเกินไป
 กรุณารอสักครู่แล้วลองใหม่อีกครั้ง',
 'login-abort-generic' => 'การเข้าสู่ระบบของคุณไม่ประสบความสำเร็จ - ล้มเลิกแล้ว',
 'loginlanguagelabel' => 'ภาษา: $1',
-'suspicious-userlogout' => 'à¸\84ำà¸\82อà¸\82อà¸\87à¸\84ุà¸\93à¹\80à¸\9eืà¹\88อออà¸\81à¸\88าà¸\81ระà¸\9aà¸\9aà¸\96ูà¸\81à¸\9bà¸\8fิà¹\80สà¸\98 à¹\80à¸\9eราะà¸\94ูà¹\80หมือà¸\99วà¹\88าà¸\88ะสà¹\88à¸\87มาà¸\88าà¸\81à¹\80à¸\9aราวà¹\8cà¹\80à¸\8bอรà¹\8cหรือà¸\9eรà¹\87อà¸\81à¸\8bีà¹\88แคชที่เสีย',
+'suspicious-userlogout' => 'à¸\84ำà¸\82อลà¹\87อà¸\81à¹\80อาà¸\95à¹\8cà¸\82อà¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¸\9bà¸\8fิà¹\80สà¸\98à¹\80à¸\9eราะà¸\94ูà¹\80หมือà¸\99สà¹\88à¸\87มาà¸\88าà¸\81à¹\80à¸\9aราวà¹\8cà¹\80à¸\8bอรà¹\8cหรือà¸\9eรà¹\87อà¸\81à¸\8bีแคชที่เสีย',
 
 # E-mail sending
-'php-mail-error-unknown' => 'ข้อผิดพลาดไม่ทราบสาเหตุในฟังก์ชัน mail() ของพีเอชพี',
+'php-mail-error-unknown' => 'à¹\80à¸\81ิà¸\94à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¹\84มà¹\88à¸\97ราà¸\9aสาà¹\80หà¸\95ุà¹\83à¸\99à¸\9fัà¸\87à¸\81à¹\8cà¸\8aัà¸\99 mail() à¸\82อà¸\87à¸\9eีà¹\80อà¸\8aà¸\9eี',
 'user-mail-no-addy' => 'พยายามส่งอีเมลโดยไม่มีที่อยู่อีเมล',
+'user-mail-no-body' => 'พยายามส่งอีเมลที่มีเนื้อหาว่างหรือสั้นอย่างไร้เหตุผล',
 
 # Change password dialog
 'resetpass' => 'เปลี่ยนรหัสผ่าน',
@@ -708,21 +711,35 @@ $1',
 'resetpass-submit-loggedin' => 'เปลี่ยนรหัสผ่าน',
 'resetpass-submit-cancel' => 'ยกเลิก',
 'resetpass-wrong-oldpass' => 'รหัสผ่านชั่วคราวหรือปัจจุบันไม่ถูกต้อง
-à¸\84ุà¸\93อาà¸\88à¹\80à¸\9bลีà¹\88ยà¸\99รหัสà¸\9cà¹\88าà¸\99à¸\82อà¸\87à¸\84ุà¸\93à¹\84à¸\9bà¹\81ลà¹\89ว à¸«à¸£à¸·à¸­à¸£à¹\89อà¸\87à¸\82อรหัสà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราวà¹\83หมà¹\88à¹\81ลà¹\89ว',
+คุณอาจเปลี่ยนรหัสผ่านของคุณไปแล้ว หรือขอรหัสผ่านชั่วคราวใหม่แล้ว',
 'resetpass-temp-password' => 'รหัสผ่านชั่วคราว:',
 
 # Special:PasswordReset
 'passwordreset' => 'ตั้งรหัสผ่านใหม่',
-'passwordreset-text' => 'à¸\81รอà¸\81à¹\81à¸\9aà¸\9aà¸\99ีà¹\89à¹\80à¸\9eืà¹\88อรัà¸\9aà¸\95ัวà¹\80à¸\95ือà¸\99อีà¹\80มลà¸\82อà¸\87รายละà¹\80อียà¸\94à¸\9aัà¸\8dà¸\8aีà¸\82อà¸\87à¸\84ุà¸\93',
+'passwordreset-text' => 'กรอกแบบนี้เพื่อรับตัวเตือนอีเมลรายละเอียดบัญชีของคุณ',
 'passwordreset-legend' => 'เปลี่ยนรหัสผ่าน',
 'passwordreset-disabled' => 'การตั้งรหัสผ่านใหม่ปิดใช้งานบนวิกินี้',
 'passwordreset-username' => 'ชื่อผู้ใช้:',
 'passwordreset-domain' => 'โดเมน:',
 'passwordreset-email' => 'ที่อยู่อีเมล:',
 'passwordreset-emailtitle' => 'รายละเอียดบัญชีบน {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'ใครบางคน (ซึ่งอาจเป็นคุณ ที่ใช้เลขที่อยู่ไอพี $1) ขอตัวเตือนรายละเอียดบัญชีของคุณบน {{SITENAME}} ($4) บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:
+
+$2
+
+{{PLURAL:$3|รหัสผ่านชั่วคราวนี้|รหัสผ่านชั่วคราวเหล่านี้}}จะหมดอายุใน $5 วัน
+ตอนนี้คุณควรล็อกอินและเลือกรหัสผ่านใหม่ หากบุคคลอื่นขอตัวเตือนรายละเอียดบัญชี หรือคุณจำรหัสผ่านเดิมของคุณได้แล้ว และคุณไม่ต้องการเปลี่ยนรหัสผ่านอีกต่อไป คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเก่าของคุณต่อไป',
+'passwordreset-emailtext-user' => 'ผู้ใช้ $1 ขอตัวเตือนรายละเอียดบัญชีของคุณบน {{SITENAME}} ($4) {{PLURAL:$3||}}บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:
+
+$2
+
+{{PLURAL:$3|รหัสผ่านชั่วคราวนี้|รหัสผ่านชั่วคราวเหล่านี้}}จะหมดอายุใน $5 วัน
+ตอนนี้คุณควรล็อกอินและเลือกรหัสผ่านใหม่ หากบุคคลอื่นขอตัวเตือนรายละเอียดบัญชี หรือคุณจำรหัสผ่านเดิมของคุณได้แล้ว และคุณไม่ต้องการเปลี่ยนรหัสผ่านอีกต่อไป คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเก่าของคุณต่อไป',
 'passwordreset-emailelement' => 'ชื่อผู้ใช้: $1
 รหัสผ่านชั่วคราว: $2',
 'passwordreset-emailsent' => 'อีเมลแจ้งเตือนได้ถูกส่งไปแล้ว',
+'passwordreset-emailsent-capture' => 'อีเมลแจ้งเตือนได้ถูกส่งไปแล้ว ซึ่งแสดงด้านล่าง',
+'passwordreset-emailerror-capture' => 'อีเมลแจ้งเตือนถูกสร้างขึ้นแล้ว ซึ่งแสดงข้างล่าง แต่การส่งไปยังผู้ใช้ล้มเหลว: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'เปลี่ยนที่อยู่อีเมล',
@@ -766,47 +783,45 @@ $1',
 'showpreview' => 'แสดงตัวอย่าง',
 'showlivepreview' => 'แสดงตัวอย่างทันที',
 'showdiff' => 'แสดงความเปลี่ยนแปลง',
-'anoneditwarning' => "'''คำเตือน:''' คุณมิได้ล็อกอิน ที่อยู่ไอพีของคุณจะถูกบันทึกไว้ในประวัติการแก้ไขของหน้านี้",
-'anonpreviewwarning' => "'''คุณมิได้ล็อกอิน การบันทึกจะเก็บที่อยู่ไอพีของคุณในประวัติการแก้ไขของหน้านี้'''",
+'anoneditwarning' => "'''à¸\84ำà¹\80à¸\95ือà¸\99:''' à¸\84ุà¸\93มิà¹\84à¸\94à¹\89ลà¹\87อà¸\81อิà¸\99 à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\82อà¸\87à¸\84ุà¸\93à¸\88ะà¸\96ูà¸\81à¸\9aัà¸\99à¸\97ึà¸\81à¹\84วà¹\89à¹\83à¸\99à¸\9bระวัà¸\95ิà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89",
+'anonpreviewwarning' => "'''à¸\84ุà¸\93มิà¹\84à¸\94à¹\89ลà¹\87อà¸\81อิà¸\99 à¸\81ารà¸\9aัà¸\99à¸\97ึà¸\81à¸\88ะà¹\80à¸\81à¹\87à¸\9aà¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\82อà¸\87à¸\84ุà¸\93à¹\83à¸\99à¸\9bระวัà¸\95ิà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89'''",
 'missingsummary' => "'''อย่าลืม:''' คุณยังไม่ได้ระบุคำอธิบายการแก้ไข ถ้าคุณกด \"บันทึก\" อีกครั้ง การแก้ไขของคุณจะถูกบันทึกโดยไม่มีคำอธิบายการแก้ไข",
 'missingcommenttext' => 'กรุณาใส่ความเห็นด้านล่าง',
 'missingcommentheader' => "'''ประกาศเตือน:''' คุณยังไม่ได้ใส่หัวข้อ/จ่าหัวสำหรับความเห็นนี้ ถ้าคุณกด \"{{int:savearticle}}\" อีกครั้ง การแก้ไขของคุณจะถูกบันทึกโดยไม่มีหัวข้อ",
 'summary-preview' => 'ตัวอย่างคำอธิบายการแก้ไข:',
 'subject-preview' => 'ตัวอย่างหัวข้อ:',
-'blockedtitle' => 'ผู้ใช้ถูกบล็อก',
-'blockedtext' => "'''à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89หรือหมายà¹\80ลà¸\82ไอพีของคุณถูกบล็อก'''
+'blockedtitle' => 'ผู้ใช้ถูกบล็อกอยู่',
+'blockedtext' => "'''à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89หรือà¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88ไอพีของคุณถูกบล็อก'''
 
 การบล็อกนี้ดำเนินการโดย $1
-à¸\8bึà¹\88à¸\87ระà¸\9aุà¹\80หà¸\95ุà¸\9cลà¹\84วà¹\89วà¹\88า ''$2''
+ซึ่งระบุเหตุผลว่า ''$2''
 
 * เริ่มการบล็อก: $8
 * หมดเขตการบล็อก: $6
 * ผู้ถูกบล็อก: $7
 
 คุณสามารถติดต่อ $1 หรือ[[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]]คนอื่นเพื่ออภิปรายการบล็อกนี้ได้
-คุณไม่สามารถใช้ 'ส่งอีเมลหาผู้ใช้รายนี้ได้' จนกว่าจะระบุที่อยู่อีเมลให้ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกบล็อกไม่ให้ใช้ความสามารถนี้
+คุณไม่สามารถใช้คุณลักษณะ 'ส่งอีเมลหาผู้ใช้รายนี้ได้' จนกว่าจะระบุที่อยู่อีเมลให้ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกบล็อกไม่ให้ใช้ความสามารถนี้
 เลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5 
 โปรดแสดงรายละเอียดข้างต้นทั้งหมดนี้ในการอภิปรายเกี่ยวกับการบล็อกของคุณด้วย",
-'autoblockedtext' => "เลขที่อยู่ไอพีของคุณถูกบล็อกอัตโนมัติ เพราะมีผู้ใช้อื่นมาก่อน ซึ่งถูกบล็อกโดย $1
-à¹\80หà¸\95ุà¸\9cลà¸\97ีà¹\88à¹\83หà¹\89à¹\84วà¹\89à¹\83à¸\99à¸\81ารà¸\9aลà¹\87อà¸\81à¸\84ือ:
+'autoblockedtext' => "à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\82อà¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81อัà¸\95à¹\82à¸\99มัà¸\95ิ à¹\80à¸\9eราะมีà¸\9cูà¹\89à¹\83à¸\8aà¹\89อืà¹\88à¸\99à¹\83à¸\8aà¹\89มาà¸\81à¹\88อà¸\99 à¸\8bึà¹\88à¸\87à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¹\82à¸\94ย $1
+à¹\82à¸\94ยระà¸\9aุà¹\80หà¸\95ุà¸\9cลวà¹\88า
 
 :''$2''
 
 * เริ่มการบล็อก: $8
 * สิ้นสุดการบล็อก: $6
-* ผู้ถูกบล็อกโดยเจตนา: $7
-
-คุณอาจติดต่อ $1 หรือ[[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]]คนอื่นเพื่อหารือการบล็อกนี้
+* ผู้ถูกบล็อก: $7
 
 คุณสามารถติดต่อ $1 หรือ[[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]]คนอื่นเพื่อหารือการบล็อกนี้ 
-คุณไม่สามารถใช้คุณลักษณะ 'ส่งอีเมลหาผู้ใช้รายนี้ได้' จนกว่าจะระบุที่อยู่อีเมลที่ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกบล็อกไม่ให้
+คุณไม่สามารถใช้คุณลักษณะ 'ส่งอีเมลหาผู้ใช้รายนี้ได้' จนกว่าจะระบุที่อยู่อีเมลที่ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกบล็อกไม่ให้ใช้
 เลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5 
 โปรดรวมรายละเอียดข้างต้นทั้งหมดในการสอบถามใด ๆ",
 'blockednoreason' => 'ไม่ได้ให้เหตุผลไว้',
-'whitelistedittext' => 'à¸\84ุà¸\93à¸\95à¹\89อà¸\87$1à¹\80à¸\9eืà¹\88อà¸\97ำà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89า',
+'whitelistedittext' => 'คุณต้อง$1เพื่อแก้ไขหน้า',
 'confirmedittext' => 'คุณต้องยืนยันที่อยู่อีเมลของคุณก่อนแก้ไขหน้า โปรดกำหนดที่อยู่อีเมลของคุณและทำให้ถูกต้องผ่าน[[Special:Preferences|การตั้งค่าผู้ใช้]]',
-'nosuchsectiontitle' => 'à¹\84มà¹\88à¸\9eà¸\9aหัวà¸\82à¹\89อยà¹\88อย',
-'nosuchsectiontext' => 'à¸\84ุà¸\93à¸\9eยายามà¹\81à¸\81à¹\89à¹\84à¸\82à¸\95อà¸\99à¸\97ีà¹\88à¹\84มà¹\88มีอยูà¹\88 à¸\95อนดังกล่าวอาจถูกย้ายหรือลบขณะที่คุณดูหน้าอยู่',
+'nosuchsectiontitle' => 'à¹\84มà¹\88à¸\9eà¸\9aสà¹\88วà¸\99',
+'nosuchsectiontext' => 'à¸\84ุà¸\93à¸\9eยายามà¹\81à¸\81à¹\89à¹\84à¸\82สà¹\88วà¸\99à¸\97ีà¹\88à¹\84มà¹\88มีอยูà¹\88 à¸ªà¹\88วนดังกล่าวอาจถูกย้ายหรือลบขณะที่คุณดูหน้าอยู่',
 'loginreqtitle' => 'จำเป็นต้องล็อกอิน',
 'loginreqlink' => 'ล็อกอิน',
 'loginreqpagetext' => 'คุณต้อง$1เพื่อดูหน้าอื่น',
@@ -817,58 +832,60 @@ $1',
 'newarticle' => '(ใหม่)',
 'newarticletext' => "คุณตามลิงก์ไปยังหน้าที่ยังไม่มีในขณะนี้
 ในการสร้างหน้า เริ่มพิมพ์ในกล่องด้านล่าง (ดูข้อมูลเพิ่มเติมใน[[{{MediaWiki:Helppage}}|หน้าคำอธิบาย]])
-à¸\96à¹\89าà¸\84ุà¸\93มาà¹\82à¸\94ยอุà¸\9aัà¸\95ิà¹\80หà¸\95ุ à¹\83หà¹\89à¸\81à¸\94'''à¸\96อยหลัà¸\87''' (back) à¸\97ีà¹\88เบราว์เซอร์",
-'anontalkpagetext' => "----''หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99หà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยสำหรัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ิรà¸\99าม à¸\8bึà¹\88à¸\87ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89
¹\82à¸\94ยà¸\97าà¸\87à¹\80ราà¸\88ำà¹\80à¸\9bà¹\87à¸\99à¸\95à¹\89อà¸\87ระà¸\9aุà¸\95ัวà¸\95à¸\99à¸\9cà¹\88าà¸\99à¸\97าà¸\87หมายà¹\80ลà¸\82à¹\84อà¸\9eี
¸\8bึà¹\88à¸\87หมายà¹\80ลà¸\82à¹\84อà¸\9eีà¸\99ีà¹\89อาà¸\88à¸\96ูà¸\81à¹\83à¸\8aà¹\89รà¹\88วมà¸\81ัà¸\99à¹\82à¸\94ยà¸\9cูà¹\89à¹\83à¸\8aà¹\89หลายคน
+à¸\96à¹\89าà¸\84ุà¸\93à¹\80à¸\82à¹\89ามาหà¸\99à¹\89าà¸\99ีà¹\89à¹\82à¸\94ยà¸\9cิà¸\94à¸\9eลาà¸\94 à¹\83หà¹\89à¸\81à¸\94à¸\9bุà¹\88ม'''à¸\96อยหลัà¸\87''' (back) à¸\82อà¸\87เบราว์เซอร์",
+'anontalkpagetext' => "----''หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99หà¸\99à¹\89าà¸\84ุยà¸\81ัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89สำหรัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ิรà¸\99ามà¸\8bึà¹\88à¸\87ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีหรือà¹\84มà¹\88à¹\84à¸\94à¹\89ลà¹\87อà¸\81อิà¸\99
¸\94ัà¸\87à¸\99ัà¹\89à¸\99à¹\80ราà¸\88ึà¸\87ระà¸\9aุà¸\95ัวà¸\95à¸\99à¹\82à¸\94ยà¹\83à¸\8aà¹\89à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¹\81à¸\97à¸\99
¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\99ีà¹\89อาà¸\88มีà¸\9cูà¹\89à¹\83à¸\8aà¹\89รà¹\88วมà¸\81ัà¸\99หลายคน
 ถ้าคุณเป็นผู้ใช้นิรนาม และรู้สึกว่าความเห็นที่คุณได้รับไม่เกี่ยวข้องกับคุณแต่อย่างใด กรุณา[[Special:UserLogin/signup|สร้างบัญชีผู้ใช้]]หรือ[[Special:UserLogin|ล็อกอิน]] เพื่อป้องกันการสับสนกับผู้ใช้นิรนามรายอื่น''",
-'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> แต่คุณไม่มีสิทธิ์สร้างหน้านี้',
+'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' => 'ไม่มีรุ่น #$1 ของหน้าชื่อ "{{PAGENAME}}" 
+
+โดยปกติเกิดจากการเข้าลิงก์ประวัติเก่าของหน้าที่ถูกลบไปแล้ว
+ดูรายละเอียดได้ที่[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]',
 'userpage-userdoesnotexist' => 'บัญชีผู้ใช้ "<nowiki>$1</nowiki>" มิได้ลงทะเบียน กรุณาตรวจสอบก่อนว่าคุณต้องการสร้างหรือแก้ไขหน้านี้',
 'userpage-userdoesnotexist-view' => 'บัญชีผู้ใช้ "$1" มิได้ลงทะเบียน',
 'blocked-notice-logextract' => 'ปัจจุบันเลขที่อยู่ไอพีนี้ถูกบล็อก
-รายการบล็อกล่าสุดแสดงด้านล่างนี้เพื่อการอ้างอิง:',
-'clearyourcache' => "'''หมายเหตุ:''' หลังจากบันทึกแล้ว คุณอาจจะต้องล้างแคชเว็บเบราว์เซอร์ของคุณเพื่อดูการเปลี่ยนแปลง
-* '''ไฟร์ฟอกซ์ / ซาฟารี:''' กดปุ่ม ''Shift'' ค้างไว้ขณะคลิก ''Reload'' หรือกดปุ่ม ''Ctrl-F5'' หรือ ''Ctrl-R'' (''⌘-R'' บนแมคอินทอช)
-* '''กูเกิล โครม:''' กดปุ่ม ''Ctrl-Shift-R'' (''⌘-Shift-R'' บนแมคอินทอช)
-* '''อินเทอร์เน็ตเอกซ์พลอเรอร์:''' กดปุ่ม ''Ctrl'' ค้างไว้ขณะคลิก ''Refresh'' หรือกดปุ่ม ''Ctrl-F5''
-* '''คองเคอเรอร์:''' คลิก ''Reload'' หรือกดปุ่ม ''F5''
-* '''โอเปร่า:''' ล้างแคชในเมนู ''Tools → Preferences''",
-'usercssyoucanpreview' => "'''คำแนะนำ:''' กดปุ่ม \"{{int:showpreview}}\" เพื่อทดสอบสไตล์ชีท CSS ก่อนบันทึก",
-'userjsyoucanpreview' => "'''คำแนะนำ:''' กดปุ่ม \"แสดงตัวอย่าง\" เพื่อทดสอบจาวาสคริปต์ใหม่ก่อนบันทึก",
+หน่วยบล็อกล่าสุดแสดงด้านล่างนี้เพื่อการอ้างอิง:',
+'clearyourcache' => "'''หมายเหตุ:''' หลังจากบันทึก คุณอาจต้องล้างแคชเว็บเบราว์เซอร์ของคุณเพื่อดูการเปลี่ยนแปลง
+* '''ไฟร์ฟอกซ์ / ซาฟารี:''' กดปุ่ม ''Shift'' ค้างไว้ขณะคลิก ''Reload'' หรือกด ''Ctrl-F5'' หรือ ''Ctrl-R'' (''⌘-R'' บนแมค)
+* '''กูเกิล โครม:''' กดปุ่ม ''Ctrl-Shift-R'' (''⌘-Shift-R'' บนแมค)
+* '''อินเทอร์เน็ตเอกซ์พลอเรอร์:''' กดปุ่ม ''Ctrl'' ค้างไว้ขณะคลิก ''Refresh'' หรือกด ''Ctrl-F5''
+* '''โอเปร่า:''' ล้างแคชใน ''Tools → Preferences''",
+'usercssyoucanpreview' => "'''คำแนะนำ:''' กดปุ่ม \"{{int:showpreview}}\" เพื่อทดสอบ CSS ใหม่ของคุณก่อนบันทึก",
+'userjsyoucanpreview' => "'''คำแนะนำ:''' กดปุ่ม \"{{int:showpreview}}\" เพื่อทดสอบจาวาสคริปต์ใหม่ของคุณก่อนบันทึก",
 'usercsspreview' => "'''อย่าลืมว่าคุณกำลังดูตัวอย่าง CSS ผู้ใช้ของคุณ'''
 '''ยังไม่ได้ถูกบันทึก!'''",
 'userjspreview' => "'''อย่าลืมว่าคุณกำลังทดสอบ/ดูตัวอย่างจาวาสคริปต์ผู้ใช้ของคุณ'''
 '''ยังไม่ถูกบันทึก!'''",
 'sitecsspreview' => "'''พึงระลึกว่าคุณกำลังแสดงตัวอย่าง CSS นี้เท่านั้น'''
-'''มัà¸\99ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89à¸\96ูà¸\81à¸\9aัà¸\99à¸\97ึà¸\81!'''",
+'''ยังไม่ได้ถูกบันทึก!'''",
 'sitejspreview' => "'''พึงระลึกว่าคุณกำลังแสดงตัวอย่างโค้ดจาวาสคริปต์นี้เท่านั้น'''
-'''มัà¸\99ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89à¸\96ูà¸\81à¸\9aัà¸\99à¸\97ึà¸\81!'''",
-'userinvalidcssjstitle' => "'''à¸\84ำà¹\80à¸\95ือà¸\99:''' à¹\84มà¹\88มีหà¸\99à¹\89าà¸\95า \"\$1\" à¸«à¸\99à¹\89า .css à¹\81ละ .js à¸\97ีà¹\88à¸\9bรัà¸\9aà¹\81à¸\95à¹\88à¸\87à¹\80อà¸\87 à¹\83à¸\8aà¹\89à¸\95ัวà¸\9eิมà¸\9eà¹\8cà¹\80ลà¹\87à¸\81à¸\97ัà¹\89à¸\87หมà¸\94 à¹\80à¸\8aà¹\88à¸\99 à¹\83à¸\8aà¹\89 {{ns:user}}:Foo/vector.css à¹\81à¸\97à¸\99à¸\97ีà¹\88à¸\88ะà¹\80à¸\9bà¹\87à¸\99 {{ns:user}}:Foo/Vector.css",
-'updated' => '(à¸\9bรัà¸\9aà¸\9bรุà¸\87à¹\81ลà¹\89ว)',
-'note' => "'''à¸\84ำà¹\81à¸\99ะà¸\99ำ:'''",
-'previewnote' => "'''พึงระลึกว่านี่เป็นเพียงตัวอย่างเท่านั้น'''
+'''ยังไม่ได้ถูกบันทึก!'''",
+'userinvalidcssjstitle' => "'''à¸\84ำà¹\80à¸\95ือà¸\99:''' à¹\84มà¹\88มีหà¸\99à¹\89าà¸\95า \"\$1\" à¸«à¸\99à¹\89า .css à¹\81ละ .js à¸\97ีà¹\88à¸\9bรัà¸\9aà¹\81à¸\95à¹\88à¸\87à¹\80อà¸\87 à¹\83à¸\8aà¹\89à¸\95ัวà¹\80ลà¹\87à¸\81à¸\97ัà¹\89à¸\87หมà¸\94 à¹\80à¸\8aà¹\88à¸\99 {{ns:user}}:Foo/vector.css à¸¡à¸´à¹\83à¸\8aà¹\88 {{ns:user}}:Foo/Vector.css",
+'updated' => '(ปรับแล้ว)',
+'note' => "'''หมายà¹\80หà¸\95ุ:'''",
+'previewnote' => "'''à¸\9eึà¸\87ระลึà¸\81วà¹\88าà¸\99ีà¹\88à¹\80à¸\9bà¹\87à¸\99à¹\80à¸\9eียà¸\87à¸\81ารà¹\81สà¸\94à¸\87à¸\95ัวอยà¹\88าà¸\87à¹\80à¸\97à¹\88าà¸\99ัà¹\89à¸\99'''
 การเปลี่ยนแปลงของคุณยังไม่ได้ถูกบันทึก!",
 'continue-editing' => 'ไปยังพื้นที่แก้ไข',
-'previewconflict' => 'à¸\81ารà¹\81สà¸\94à¸\87à¸\9cลสà¹\88วà¸\99à¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99à¸\95ัวอยà¹\88าà¸\87à¸\82อà¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\94à¹\89าà¸\99à¸\9aà¸\99  à¸\96à¹\89าà¸\81à¸\94à¸\9aัà¸\99à¸\97ึà¸\81à¸\81ารà¹\81สà¸\94à¸\87à¸\9cลà¸\88ะà¹\81สà¸\94à¸\87à¹\83à¸\99ลัà¸\81ษà¸\93ะà¸\99ีà¹\89à¸\97ัà¸\99à¸\97ี',
-'session_fail_preview' => "'''à¸\82ออภัย à¹\84มà¹\88สามารà¸\96à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\95à¹\88อà¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\82à¹\89อมูลà¹\80à¸\8aืà¹\88อมà¸\95à¹\88อสูà¸\8dหาย
-à¹\83หà¹\89à¸\97à¸\94ลอà¸\87à¹\81à¸\81à¹\89à¹\84à¸\82อีà¸\81à¸\84รัà¹\89à¸\87หà¸\99ึà¹\88à¸\87 à¸\96à¹\89ายัà¸\87à¹\84มà¹\88สามารà¸\96à¸\97ำà¹\84à¸\94à¹\89 à¹\83หà¹\89ลอà¸\87ลà¹\87อà¸\81à¹\80อาà¸\95à¹\8cà¹\81ละลà¹\87อà¸\81อิà¸\99à¸\81ลัà¸\9aมาอีà¸\81à¸\84รัà¹\89à¸\87'''",
-'session_fail_preview_html' => "'''à¸\82ออภัย à¹\84มà¹\88สามารà¸\96à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\95à¹\88อà¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\82à¹\89อมูลà¹\80à¸\8aืà¹\88อมà¸\95à¹\88อสูญหาย'''
+'previewconflict' => 'à¸\81ารà¹\81สà¸\94à¸\87à¸\95ัวอยà¹\88าà¸\87à¸\99ีà¹\89สะà¸\97à¹\89อà¸\99à¸\82à¹\89อà¸\84วามà¹\83à¸\99à¸\9eืà¹\89à¸\99à¸\97ีà¹\88à¹\81à¸\81à¹\89à¹\84à¸\82à¸\82à¹\89อà¸\84วามสà¹\88วà¸\99à¸\9aà¸\99à¸\8bึà¹\88à¸\87à¸\88ะà¸\9bราà¸\81à¸\8fหาà¸\81à¸\84ุà¸\93à¹\80ลือà¸\81à¸\9aัà¸\99à¸\97ึà¸\81',
+'session_fail_preview' => "'''à¸\82ออภัย à¹\84มà¹\88สามารà¸\96à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\95à¹\88อà¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\82à¹\89อมูลà¸\8aà¹\88วà¸\87à¹\80วลาสืà¹\88อสารสูà¸\8dหาย'''
+à¹\82à¸\9bรà¸\94à¸\97à¸\94ลอà¸\87อีà¸\81à¸\84รัà¹\89à¸\87 à¸«à¸²à¸\81ยัà¸\87à¹\80สียอยูà¹\88 à¸¥à¸­à¸\87[[Special:UserLogout|ลà¹\87อà¸\81à¹\80อาà¸\95à¹\8c]]à¹\81ละลà¹\87อà¸\81อิà¸\99à¸\81ลัà¸\9aมา",
+'session_fail_preview_html' => "'''à¸\82ออภัย à¹\84มà¹\88สามารà¸\96à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\95à¹\88อà¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\82à¹\89อมูลà¸\8aà¹\88วà¸\87à¹\80วลาสืà¹\88อสารสูญหาย'''
 
-''à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81 {{SITENAME}} à¹\83à¸\8aà¹\89รูà¸\9bà¹\81à¸\9aà¸\9aà¹\80อà¸\8aà¸\97ีà¹\80อà¹\87มà¹\81อลลà¹\89วà¸\99 à¸\81ารà¹\81สà¸\94à¸\87à¸\95ัวอยà¹\88าà¸\87à¸\88ะà¸\96ูà¸\81à¸\8bà¹\88อà¸\99à¹\84วà¹\89à¹\80à¸\9eืà¹\88อà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¸\81ารà¹\82à¸\95มตีด้วยจาวาสคริปต์''
+''à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81 {{SITENAME}} à¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\80อà¸\8aà¸\97ีà¹\80อà¹\87มà¹\81อลลà¹\89วà¸\99 à¸\81ารà¹\81สà¸\94à¸\87à¸\95ัวอยà¹\88าà¸\87à¸\88ะà¸\96ูà¸\81à¸\8bà¹\88อà¸\99à¹\84วà¹\89à¹\80à¸\9eืà¹\88อà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¸\81ารà¹\82à¸\88มตีด้วยจาวาสคริปต์''
 
-'''à¸\96à¹\89าà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\84รัà¹\89à¸\87à¸\99ีà¹\89à¸\96ูà¸\81à¸\95à¹\89อà¸\87 à¹\83หà¹\89à¸\97à¸\94ลอà¸\87à¹\81à¸\81à¹\89à¹\84à¸\82อีà¸\81à¸\84รัà¹\89à¸\87หà¸\99ึà¹\88à¸\87 à¸\96à¹\89ายัà¸\87à¹\84มà¹\88สามารà¸\96à¸\97ำà¹\84à¸\94à¹\89 à¹\83หà¹\89ลอà¸\87[[Special:UserLogout|ลà¹\87อà¸\81à¹\80อาà¸\95à¹\8c]]à¹\81ละลà¹\87อà¸\81อิà¸\99à¸\81ลัà¸\9aมาอีà¸\81à¸\84รัà¹\89à¸\87'''",
-'token_suffix_mismatch' => "'''à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93à¹\84à¸\94à¹\89à¸\96ูà¸\81à¸\9bà¸\8fิà¹\80สà¸\98 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¹\80à¸\84รืà¹\88อà¸\87ลูà¸\81à¸\82à¹\88ายà¸\97ีà¹\88à¸\84ุà¸\93à¹\83à¸\8aà¹\89อยูà¹\88à¹\84à¸\94à¹\89à¸\97ำลายรูà¸\9bà¹\81à¸\9aà¸\9aà¹\80à¸\84รืà¹\88อà¸\87หมายวรรà¸\84à¸\95อà¸\99à¹\83à¸\99à¸\95ราสารà¸\9bระà¸\88ำà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82 (edit token)'''
-ระà¸\9aà¸\9aà¹\84มà¹\88รัà¸\9aà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93à¹\80à¸\9eืà¹\88อà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¸\82อà¸\87à¸\82à¹\89อมูล
¹\83à¸\99à¸\9aาà¸\87à¸\84รัà¹\89à¸\87à¸\9bัà¸\8dหาà¸\99ีà¹\89à¸\88ะà¹\80à¸\81ิà¸\94à¸\82ึà¹\89à¸\99à¸\96à¹\89าคุณใช้บริการเว็บพร็อกซีนิรนามที่มีบั๊ก",
+'''หาà¸\81à¸\99ีà¹\88à¹\80à¸\9bà¹\87à¸\99à¸\84วามà¸\9eยายามà¹\81à¸\81à¹\89à¹\84à¸\82à¹\82à¸\94ยà¸\8aอà¸\9a à¹\82à¸\9bรà¸\94ลอà¸\87อีà¸\81à¸\84รัà¹\89à¸\87หà¸\99ึà¹\88à¸\87''' à¸«à¸²à¸\81ยัà¸\87à¹\80สียอยูà¹\88 à¸¥à¸­à¸\87[[Special:UserLogout|ลà¹\87อà¸\81à¹\80อาà¸\95à¹\8c]]à¹\81ละลà¹\87อà¸\81อิà¸\99à¸\81ลัà¸\9aมา",
+'token_suffix_mismatch' => "'''à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¸\9bà¸\8fิà¹\80สà¸\98 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¹\80à¸\84รืà¹\88อà¸\87ลูà¸\81à¸\82à¹\88ายà¸\97ีà¹\88à¸\84ุà¸\93à¹\83à¸\8aà¹\89à¸\97ำà¹\83หà¹\89อัà¸\81à¸\82ระà¹\80à¸\84รืà¹\88อà¸\87หมายวรรà¸\84à¸\95อà¸\99à¹\83à¸\99à¸\95ราสารà¸\9bระà¸\88ำà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82 (edit token) à¹\80สีย'''
+à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\99ีà¹\89à¸\96ูà¸\81à¸\9bà¸\8fิà¹\80สà¸\98à¹\80à¸\9eืà¹\88อà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¸\81ารวิà¸\9aัà¸\95ิà¸\82อà¸\87à¸\82à¹\89อà¸\84วามหà¸\99à¹\89า
¸\9aาà¸\87à¸\84รัà¹\89à¸\87à¹\80à¸\81ิà¸\94à¸\9bัà¸\8dหาà¸\99ีà¹\89à¸\82ึà¹\89à¸\99à¹\80มืà¹\88อคุณใช้บริการเว็บพร็อกซีนิรนามที่มีบั๊ก",
 'edit_form_incomplete' => "'''แบบแก้ไขบางส่วนไปไม่ถึงเซิร์ฟเวอร์ ตรวจสอบอีกครั้งว่าการแก้ไขของคุณยังอยู่และลองอีกครั้ง'''",
 'editing' => 'กำลังแก้ไข $1',
 'creating' => 'กำลังสร้าง $1',
 'editingsection' => 'กำลังแก้ไข $1 (เฉพาะส่วน)',
-'editingcomment' => 'à¸\81ำลัà¸\87à¹\81à¸\81à¹\89à¹\84à¸\82 $1 (à¸\95อนใหม่)',
+'editingcomment' => 'à¸\81ำลัà¸\87à¹\81à¸\81à¹\89à¹\84à¸\82 $1 (สà¹\88วนใหม่)',
 'editconflict' => 'แก้ไขชนกัน: $1',
 'explainconflict' => "ใครบางคนได้เปลี่ยนแปลงหน้านี้ตั้งแต่คุณกำลังแก้ไข
 พื้นที่ข้อความส่วนบนมีข้อความหน้าที่มีอยู่ในปัจจุบัน
@@ -1001,41 +1018,41 @@ $1',
 'rev-deleted-comment' => '(คำอธิบายอย่างย่อถูกลบออก)',
 'rev-deleted-user' => '(ชื่อผู้ใช้ถูกลบออก)',
 'rev-deleted-event' => '(ปฏิบัติการปูมถูกลบออก)',
-'rev-deleted-user-contribs' => '[à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89หรือหมายà¹\80ลà¸\82ไอพีถูกลบแล้ว - การแก้ไขถูกซ่อนจากรายการแก้ไข]',
-'rev-deleted-text-permission' => "รุà¹\88à¸\99à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89'''à¸\96ูà¸\81ลà¸\9a'''
+'rev-deleted-user-contribs' => '[à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89หรือà¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88ไอพีถูกลบแล้ว - การแก้ไขถูกซ่อนจากรายการแก้ไข]',
+'rev-deleted-text-permission' => "รุ่นหน้านี้'''ถูกลบ'''
 รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
-'rev-deleted-text-unhide' => "รุà¹\88à¸\99à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89'''à¸\96ูà¸\81ลà¸\9a'''
+'rev-deleted-text-unhide' => "รุ่นหน้านี้'''ถูกลบ'''
 รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]
 คุณยังสามารถ[$1 ดูรุ่นนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
-'rev-suppressed-text-unhide' => "รุà¹\88à¸\99à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89'''à¸\96ูà¸\81ยัà¸\9aยัà¹\89à¸\87'''
+'rev-suppressed-text-unhide' => "รุ่นหน้านี้'''ถูกยับยั้ง'''
 รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]
 คุณยังสามารถ[$1 ดูรุ่นนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
-'rev-deleted-text-view' => "รุà¹\88à¸\99à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89'''à¸\96ูà¸\81ลà¸\9a'''
+'rev-deleted-text-view' => "รุ่นหน้านี้'''ถูกลบ'''
 คุณสามารถดูรุ่นนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
-'rev-suppressed-text-view' => "รุà¹\88à¸\99à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89'''à¸\96ูà¸\81ยัà¸\9aยัà¹\89à¸\87'''
+'rev-suppressed-text-view' => "รุ่นหน้านี้'''ถูกยับยั้ง'''
 คุณสามารถดูรุ่นนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]",
-'rev-deleted-no-diff' => "à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\80รียà¸\81à¸\94ูà¸\84วามà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลงนี้ เพราะมีบางรุ่น'''ถูกลบ'''
+'rev-deleted-no-diff' => "à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\80รียà¸\81à¸\94ูà¸\9cลà¸\95à¹\88างนี้ เพราะมีบางรุ่น'''ถูกลบ'''
 รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
-'rev-suppressed-no-diff' => "à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¸\94ูà¸\84วามà¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87ระหวà¹\88าà¸\87รุà¹\88à¸\99à¸\97ีà¹\88à¹\80ลือà¸\81à¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81มีà¸\84วามà¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87ระหวà¹\88าà¸\87รุà¹\88à¸\99ที่'''ถูกลบ'''",
-'rev-deleted-unhide-diff' => "รุà¹\88à¸\99หà¸\99ึà¹\88à¸\87à¸\82อà¸\87รายà¸\81ารà¸\84วามà¹\81à¸\95à¸\81ต่างนี้'''ถูกลบ'''
+'rev-suppressed-no-diff' => "à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¸\94ูà¸\9cลà¸\95à¹\88าà¸\87à¸\99ีà¹\89à¹\84à¸\94à¹\89 à¹\80à¸\9eราะมีà¸\9cลà¸\95à¹\88าà¸\87หà¸\99ึà¹\88à¸\87ที่'''ถูกลบ'''",
+'rev-deleted-unhide-diff' => "รุà¹\88à¸\99หà¸\99ึà¹\88à¸\87à¸\82อà¸\87à¸\9cลต่างนี้'''ถูกลบ'''
 รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]
-à¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¸\94ูà¸\84วามà¹\81à¸\95à¸\81ต่างนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
-'rev-suppressed-unhide-diff' => "รุà¹\88à¸\99หà¸\99ึà¹\88à¸\87à¸\82อà¸\87รายà¸\81ารà¸\84วามà¹\81à¸\95à¸\81ต่างนี้'''ถูกยับยั้ง'''
+à¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¸\94ูà¸\9cลต่างนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
+'rev-suppressed-unhide-diff' => "รุà¹\88à¸\99หà¸\99ึà¹\88à¸\87à¸\82อà¸\87à¸\9cลต่างนี้'''ถูกยับยั้ง'''
 รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]
-à¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¸\94ูà¸\84วามà¹\81à¸\95à¸\81ต่างนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
-'rev-deleted-diff-view' => "รุà¹\88à¸\99หà¸\99ึà¹\88à¸\87à¸\82อà¸\87รายà¸\81ารà¸\84วามà¹\81à¸\95à¸\81ต่างนี้'''ถูกลบ'''
-à¸\84ุà¸\93สามารà¸\96à¸\94ูà¸\84วามà¹\81à¸\95à¸\81ต่างนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
-'rev-suppressed-diff-view' => "รุà¹\88à¸\99หà¸\99ึà¹\88à¸\87à¸\82อà¸\87รายà¸\81ารà¸\84วามà¹\81à¸\95à¸\81ต่างนี้'''ถูกยับยั้ง'''
-à¸\84ุà¸\93สามารà¸\96à¸\94ูà¸\84วามà¹\81à¸\95à¸\81ต่างนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]",
+à¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¸\94ูà¸\9cลต่างนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
+'rev-deleted-diff-view' => "รุà¹\88à¸\99หà¸\99ึà¹\88à¸\87à¸\82อà¸\87à¸\9cลต่างนี้'''ถูกลบ'''
+à¸\84ุà¸\93สามารà¸\96à¸\94ูà¸\9cลต่างนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
+'rev-suppressed-diff-view' => "รุà¹\88à¸\99หà¸\99ึà¹\88à¸\87à¸\82อà¸\87à¸\9cลต่างนี้'''ถูกยับยั้ง'''
+à¸\84ุà¸\93สามารà¸\96à¸\94ูà¸\9cลต่างนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]",
 'rev-delundel' => 'แสดง/ซ่อน',
 'rev-showdeleted' => 'แสดง',
 'revisiondelete' => 'ลบ/กู้คืนรุ่น',
 'revdelete-nooldid-title' => 'ไม่มีรุ่นที่ต้องการ',
 'revdelete-nooldid-text' => 'คุณมิได้เจาะจงรุ่นเป้าหมายเพื่อดำเนินการฟังก์ชันนี้ หรือไม่มีรุ่นที่เจาะจง หรือคุณกำลังพยายามซ่อนรุ่นปัจจุบันอย่างใดอย่างหนึ่ง',
 'revdelete-nologtype-title' => 'ไม่ได้ระบุประเภทของปูม',
-'revdelete-nologtype-text' => 'à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89à¹\80à¸\88าะà¸\88à¸\87à¸\9bระà¹\80ภà¸\97à¸\82อà¸\87à¸\9bูมà¹\80à¸\9eืà¹\88อà¸\94ำà¹\80à¸\99ิà¸\99à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารà¸\99ีà¹\89à¸\95à¹\88อ',
-'revdelete-nologid-title' => 'à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\83à¸\99รายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82ไม่ถูกต้อง',
-'revdelete-nologid-text' => 'à¸\84ุà¸\93มิà¹\84à¸\94à¹\89à¹\80à¸\88าะà¸\88à¸\87รายà¸\81ารà¸\9bูมà¹\80à¸\9bà¹\89าหมายà¹\80à¸\9eืà¹\88อà¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\9fัà¸\87à¸\81à¹\8cà¸\8aัà¸\99à¸\99ีà¹\89 à¸«à¸£à¸·à¸­à¹\84มà¹\88มีรายà¸\81ารที่เจาะจงอย่างใดอย่างหนึ่ง',
+'revdelete-nologtype-text' => 'à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89à¹\80à¸\88าะà¸\88à¸\87à¸\9bระà¹\80ภà¸\97à¸\82อà¸\87à¸\9bูมà¸\97ีà¹\88à¸\88ะà¸\94ำà¹\80à¸\99ิà¸\99à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารà¸\99ีà¹\89',
+'revdelete-nologid-title' => 'หà¸\99à¹\88วยà¸\9bูมไม่ถูกต้อง',
+'revdelete-nologid-text' => 'à¸\84ุà¸\93มิà¹\84à¸\94à¹\89à¹\80à¸\88าะà¸\88à¸\87รายà¸\81ารà¸\9bูมà¹\80à¸\9bà¹\89าหมายà¹\80à¸\9eืà¹\88อà¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\9fัà¸\87à¸\81à¹\8cà¸\8aัà¸\99à¸\99ีà¹\89 à¸«à¸£à¸·à¸­à¹\84มà¹\88มีหà¸\99à¹\88วยที่เจาะจงอย่างใดอย่างหนึ่ง',
 'revdelete-no-file' => 'ไม่มีไฟล์ที่ระบุ',
 'revdelete-show-file-confirm' => 'คุณแน่ใจที่จะดูรุ่นที่ถูกลบของไฟล์ "<nowiki>$1</nowiki>" เมื่อวันที่ $2 เวลา $3 หรือไม่',
 'revdelete-show-file-submit' => 'ใช่',
@@ -1043,7 +1060,7 @@ $1',
 'logdelete-selected' => "'''{{PLURAL:$1|เหตุการณ์ปูมที่เลือก|เหตุการณ์ปูมที่เลือก}} :'''",
 'revdelete-text' => "'''รุ่นการปรับปรุงและเหตุการณ์ที่ถูกลบยังปรากฏในประวัติและปูมของหน้า แต่สาธารณะไม่สามารถเข้าถึงเนื้อหาบางส่วนได้'''
 ผู้ดูแลระบบคนอื่นบน {{SITENAME}} ยังสามารถเข้าถึงเนื้อหาที่ถูกซ่อน และสามารถกู้คืนอีกครั้งในลักษณะเดิมเช่นนี้ เว้นแต่จะมีการกำหนดการจำกัดเพิ่มเติม",
-'revdelete-confirm' => 'à¸\81รุà¸\93ายืà¸\99ยัà¸\99วà¹\88าà¸\84ุà¸\93มีà¹\80à¸\88à¸\95à¸\99าลà¸\9aà¸\88ริà¸\87 à¹\81ละà¹\80à¸\82à¹\89าà¹\83à¸\88à¸\9cลà¸\81ระà¸\97à¸\9a และกระทำภายใต้[[{{MediaWiki:Policy-url}}|นโยบาย]]',
+'revdelete-confirm' => 'à¸\81รุà¸\93ายืà¸\99ยัà¸\99วà¹\88าà¸\84ุà¸\93มีà¹\80à¸\88à¸\95à¸\99าลà¸\9aà¸\88ริà¸\87 à¹\81ละà¹\80à¸\82à¹\89าà¹\83à¸\88à¸\9cลลัà¸\9eà¸\98à¹\8c และกระทำภายใต้[[{{MediaWiki:Policy-url}}|นโยบาย]]',
 'revdelete-suppress-text' => "การระงับควรใช้ '''เฉพาะ''' กรณีต่อไปนี้:
 * ข้อมูลที่อาจหมิ่นประมาท
 * ข้อมูลส่วนบุคคลที่ไม่เหมาะสม
@@ -1053,7 +1070,7 @@ $1',
 'revdelete-hide-image' => 'ซ่อนเนื้อหาไฟล์',
 'revdelete-hide-name' => 'ซ่อนปฏิบัติการและเป้าหมาย',
 'revdelete-hide-comment' => 'ซ่อนคำอธิบายอย่างย่อ',
-'revdelete-hide-user' => 'à¸\8bà¹\88อà¸\99à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89¸«à¸¡à¸²à¸¢à¹\80ลà¸\82ไอพีผู้เขียน',
+'revdelete-hide-user' => 'à¸\8bà¹\88อà¸\99à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88ไอพีผู้เขียน',
 'revdelete-hide-restricted' => 'ระงับข้อมูลจากผู้ดูแลระบบเช่นเดียวกับผู้ใช้อื่น',
 'revdelete-radio-same' => '(ไม่เปลี่ยนแปลง)',
 'revdelete-radio-set' => 'ใช่',
@@ -1078,12 +1095,12 @@ $1",
 'revdelete-show-no-access' => 'เกิดความผิดพลาดในการแสดงรุ่นเมื่อวันที่ $2 เวลา $1: ฉบับปรับปรุงนี้ถูกกำหนดให้ "ถูกจำกัด"
 คุณไม่มีสิทธิเข้าถึงรุ่นดังกล่าว',
 'revdelete-modify-no-access' => 'เกิดความผิดพลาดในการแก้ไขรุ่นการแก้ไขเมื่อวันที่ $2 เวลา $1: รุ่นการแก้ไขนี้ถูกกำหนดให้ "ถูกจำกัด"
-à¸\84ุà¸\93à¹\84มà¹\88มีสิà¸\97à¸\98ิà¹\8cà¹\80à¸\82à¹\89าà¸\96ึà¸\87รุà¹\88à¸\99à¸\94ัà¸\87à¸\81ลà¹\88าว',
-'revdelete-modify-missing' => 'à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\89à¸\9aัà¸\9aà¸\9bรัà¸\87à¸\9bรุà¸\87หมายเลข $1: รายการนี้สูญหายจากฐานข้อมูล!',
-'revdelete-no-change' => "'''à¸\84ำà¹\80à¸\95ือà¸\99:''' à¸£à¸¸à¹\88à¸\99à¹\80มืà¹\88อวัà¸\99à¸\97ีà¹\88 $2 à¹\80วลา $1 à¸¡à¸µà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\97ัศà¸\99วิสัยà¸\95ามà¸\97ีà¹\88à¸\82ออยูà¹\88à¹\81ลà¹\89ว",
-'revdelete-concurrent-change' => 'à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82รุà¹\88à¸\99à¹\80มืà¹\88อวัà¸\99à¸\97ีà¹\88 $2 à¹\80วลา $1: มีผู้อื่นเปลี่ยนสถานะของรุ่นขณะที่คุณพยายามแก้ไข
+คุณไม่มีสิทธิเข้าถึงรุ่นดังกล่าว',
+'revdelete-modify-missing' => 'à¹\80à¸\81ิà¸\94à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82รุà¹\88à¸\99หมายเลข $1: รายการนี้สูญหายจากฐานข้อมูล!',
+'revdelete-no-change' => "'''คำเตือน:''' รุ่นเมื่อวันที่ $2 เวลา $1 ตั้งค่าทัศนวิสัยตามที่ขออยู่แล้ว",
+'revdelete-concurrent-change' => 'à¹\80à¸\81ิà¸\94à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82รุà¹\88à¸\99à¹\80มืà¹\88อวัà¸\99à¸\97ีà¹\88 $2 à¹\80วลา $1: à¸\94ูà¹\80หมือà¸\99มีผู้อื่นเปลี่ยนสถานะของรุ่นขณะที่คุณพยายามแก้ไข
 กรุณาตรวจสอบปูม',
-'revdelete-only-restricted' => 'à¹\80à¸\81ิà¸\94à¸\84วามผิดพลาดในการซ่อนรุ่นเมื่อวันที่ $2 เวลา $1: คุณไม่สามารถยับยั้งผู้ดูแลระบบมิให้ดูรุ่นนี้ได้โดยไม่เลือกตัวเลือกทัศนวิสัยอื่นด้วย',
+'revdelete-only-restricted' => 'à¹\80à¸\81ิà¸\94à¸\82à¹\89อผิดพลาดในการซ่อนรุ่นเมื่อวันที่ $2 เวลา $1: คุณไม่สามารถยับยั้งผู้ดูแลระบบมิให้ดูรุ่นนี้ได้โดยไม่เลือกตัวเลือกทัศนวิสัยอื่นด้วย',
 'revdelete-reason-dropdown' => '*เหตุผลการลบทั่วไป
 ** ละเมิดลิขสิทธิ์
 ** ความเห็นไม่เหมาะสมหรือข้อมูลส่วนบุคคล
@@ -1101,8 +1118,8 @@ $1",
 
 # History merging
 'mergehistory' => 'ประวัติการรวมหน้า',
-'mergehistory-header' => 'หà¸\99à¹\89าà¸\99ีà¹\89à¹\84วà¹\89à¹\83หà¹\89à¸\84ุà¸\93à¹\83à¸\8aà¹\89รวมรุà¹\88à¸\99à¸\95à¹\88าà¸\87à¹\86 à¹\83à¸\99à¸\9bระวัà¸\95ิà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87หà¸\99à¹\89าà¸\95à¹\89à¸\99à¸\97าà¸\87 à¹\84à¸\9bยัà¸\87หà¸\99à¹\89าà¹\83หมà¹\88.
-à¸\81à¹\88อà¸\99à¸\94ำà¹\80à¸\99ิà¸\99à¸\81าร à¸\84วรà¹\83หà¹\89à¹\81à¸\99à¹\88à¹\83à¸\88à¸\81à¹\88อà¸\99วà¹\88าà¸\81ารà¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\99ีà¹\89à¸\88ะà¹\84มà¹\88à¸\97ำà¹\83หà¹\89à¸\84วามà¸\84วามà¸\95à¹\88อà¹\80à¸\99ืà¹\88อà¸\87à¸\82อà¸\87à¸\9bระวัà¸\95ิหà¸\99à¹\89าà¹\80à¸\81à¹\88าà¹\86 à¹\80สียà¹\84à¸\9b.',
+'mergehistory-header' => 'หà¸\99à¹\89าà¸\99ีà¹\89à¹\84วà¹\89à¹\83หà¹\89à¸\84ุà¸\93à¹\83à¸\8aà¹\89รวมรุà¹\88à¸\99à¹\83à¸\99à¸\9bระวัà¸\95ิà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87หà¸\99à¹\89าà¸\95à¹\89à¸\99à¸\97าà¸\87หà¸\99ึà¹\88à¸\87à¹\84à¸\9bยัà¸\87หà¸\99à¹\89าà¹\83หมà¹\88
+à¸\81à¹\88อà¸\99à¸\94ำà¹\80à¸\99ิà¸\99à¸\81าร à¸\84วรà¹\83หà¹\89à¹\81à¸\99à¹\88à¹\83à¸\88à¸\81à¹\88อà¸\99วà¹\88าà¸\81ารà¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\99ีà¹\89ยัà¸\87รัà¸\81ษาà¸\84วามà¸\95à¹\88อà¹\80à¸\99ืà¹\88อà¸\87à¸\82อà¸\87à¸\9bระวัà¸\95ิหà¸\99à¹\89าà¹\80à¸\81à¹\88า',
 'mergehistory-box' => 'รวมรุ่นของหน้าทั้งสอง:',
 'mergehistory-from' => 'หน้าต้นทาง:',
 'mergehistory-into' => 'หน้าปลายทาง:',
@@ -1115,38 +1132,42 @@ $1",
 'mergehistory-fail' => 'ไม่สามารถรวมประวัติการแก้ไขได้ โปรดตรวจสอบค่าตัวแปรหน้าและเวลาอีกครั้ง',
 'mergehistory-no-source' => 'ไม่มีหน้าต้นทาง $1 อยู่ในสารบบ',
 'mergehistory-no-destination' => 'ไม่มีหน้าปลายทาง $1 อยู่ในสารบบ',
-'mergehistory-invalid-source' => 'หัวà¹\80รืà¹\88อà¸\87à¸\82องหน้าต้นทางต้องสมเหตุสมผล',
-'mergehistory-invalid-destination' => 'à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¸\82อà¸\87หà¸\99à¹\89าà¸\9bลายà¸\97าà¸\87à¸\95à¹\89อà¸\87สมà¹\80หà¸\95ุสมà¸\9cล',
-'mergehistory-autocomment' => 'ยà¹\89าย [[:$1]] à¹\84à¸\9bยัà¸\87 [[:$2]]',
-'mergehistory-comment' => 'ยà¹\89าย [[:$1]] à¹\84à¸\9bยัà¸\87 [[:$2]]: $3',
+'mergehistory-invalid-source' => 'à¸\8aืà¹\88อà¹\80รืà¹\88องหน้าต้นทางต้องสมเหตุสมผล',
+'mergehistory-invalid-destination' => 'ชื่อเรื่องหน้าปลายทางต้องสมเหตุสมผล',
+'mergehistory-autocomment' => 'รวม [[:$1]] à¹\80à¸\82à¹\89าà¸\81ัà¸\9a [[:$2]]',
+'mergehistory-comment' => 'รวม [[:$1]] à¹\80à¸\82à¹\89าà¸\81ัà¸\9a [[:$2]]: $3',
 'mergehistory-same-destination' => 'หน้าต้นทางและปลายทางเป็นหน้าเดียวกันไม่ได้',
 'mergehistory-reason' => 'เหตุผล:',
 
 # Merge log
 'mergelog' => 'ปูมการรวมหน้า',
-'pagemerge-logentry' => 'ยà¹\89าย [[$1]] à¹\84à¸\9bยัà¸\87 [[$2]] (รุ่นขึ้นอยู่กับ $3)',
+'pagemerge-logentry' => 'รวม [[$1]] à¹\80à¸\82à¹\89าà¸\81ัà¸\9a [[$2]] (รุ่นขึ้นอยู่กับ $3)',
 'revertmerge' => 'ยกเลิกการรวมหน้า',
-'mergelogpagetext' => 'à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\99ีà¹\89à¹\81สà¸\94à¸\87รายà¸\81ารลà¹\88าสุà¸\94à¸\82อà¸\87à¸\81ารรวมà¸\9bระวัà¸\95ิหà¸\99à¹\89าหà¸\99ึà¹\88à¸\87à¹\80à¸\82à¹\89าà¸\81ัà¸\9aอีà¸\81หà¸\99à¹\89าหà¸\99ึà¹\88à¸\87',
+'mergelogpagetext' => 'à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ารรวมà¸\9bระวัà¸\95ิà¸\82อà¸\87หà¸\99à¹\89าหà¸\99ึà¹\88à¸\87à¹\80à¸\82à¹\89าà¸\81ัà¸\9aà¸\82อà¸\87อีà¸\81หà¸\99à¹\89าหà¸\99ึà¹\88à¸\87ลà¹\88าสุà¸\94',
 
 # Diffs
 'history-title' => 'ประวัติรุ่นปรับปรุงของ "$1"',
-'difference-title' => 'à¸\84วามà¹\81à¸\95à¸\81ต่างระหว่างรุ่นของ "$1"',
-'difference-title-multipage' => 'à¸\84วามà¹\81à¸\95à¸\81ต่างระหว่างหน้า "$1" และ "$2"',
-'difference-multipage' => '(à¸\84วามà¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87ระหวà¹\88าà¸\87หà¸\99à¹\89าà¸\95à¹\88าà¸\87 à¹\86)',
+'difference-title' => 'à¸\9cลต่างระหว่างรุ่นของ "$1"',
+'difference-title-multipage' => 'à¸\9cลต่างระหว่างหน้า "$1" และ "$2"',
+'difference-multipage' => '(à¸\9cลà¸\95à¹\88าà¸\87ระหวà¹\88าà¸\87หà¸\99à¹\89า)',
 'lineno' => 'แถว $1:',
 'compareselectedversions' => 'เปรียบเทียบสองรุ่นที่เลือก',
 'showhideselectedversions' => 'แสดง/ซ่อนรุ่นที่เลือก',
 'editundo' => 'ย้อน',
-'diff-multi' => '(มิได้แสดง $1 รุ่นระหว่างรุ่นที่เปรียบเทียบโดย{{PLURAL:$2|ผู้ใช้คนหนึ่ง|ผู้ใช้ $2 คน}})',
-'diff-multi-manyusers' => '(มิได้แสดง $1 รุ่นระหว่างรุ่นที่เปรียบเทียบโดยผู้ใช้กว่า $2 คน)',
+'diff-multi' => '(มิได้แสดง $1 รุ่นระหว่างกลางโดย{{PLURAL:$2|ผู้ใช้คนหนึ่ง|ผู้ใช้ $2 คน}})',
+'diff-multi-manyusers' => '(มิได้แสดง $1 รุ่นระหว่างกลางโดยผู้ใช้กว่า $2 คน)',
+'difference-missing-revision' => 'ไม่พบรุ่น{{PLURAL:$2|รุ่น| $2 รุ่น}}ของผลต่างนี้ ($1)
+
+โดยปกติเกิดจากการเข้าลิงก์ผลต่างของหน้าที่ถูกลบไปแล้ว 
+ดูรายละเอียดได้ที่[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]',
 
 # Search results
 'searchresults' => 'ผลการค้นหา',
 'searchresults-title' => 'ผลการค้นหาสำหรับ "$1"',
-'searchresulttext' => 'สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการค้น {{SITENAME}} ดูที่ [[{{MediaWiki:Helppage}}|{{int:help}}]]',
-'searchsubtitle' => 'à¸\84ุà¸\93à¹\84à¸\94à¹\89สืà¸\9aà¸\84à¹\89à¸\99หา \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|à¸\97ุà¸\81หà¸\99à¹\89าà¸\97ีà¹\88à¸\82ึà¹\89à¸\99à¸\95à¹\89à¸\99à¸\94à¹\89วย "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|à¸\97ุà¸\81หà¸\99à¹\89าà¸\97ีà¹\88à¹\82ยà¸\87มาà¸\97ีà¹\88 "$1"]])',
-'searchsubtitleinvalid' => "à¸\84à¹\89à¸\99หาà¹\80à¸\81ีà¹\88ยวà¸\81ัà¸\9a '''$1'''",
-'toomanymatches' => 'พบตรงกันมากเกินไป กรุณาใช้คำค้นหาอื่น',
+'searchresulttext' => 'สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการค้นหา {{SITENAME}} ดูที่ [[{{MediaWiki:Helppage}}|{{int:help}}]]',
+'searchsubtitle' => 'คุณได้ค้นหา \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|ทุกหน้าที่ขึ้นต้นด้วย "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|ทุกหน้าที่โยงมาที่ "$1"]])',
+'searchsubtitleinvalid' => "à¸\84ุà¸\93à¹\84à¸\94à¹\89à¸\84à¹\89à¸\99หาà¸\84ำวà¹\88า '''$1'''",
+'toomanymatches' => 'à¸\9eà¸\9aà¸\95รà¸\87à¸\81ัà¸\99มาà¸\81à¹\80à¸\81ิà¸\99à¹\84à¸\9b à¸\81รุà¸\93าลอà¸\87à¹\83à¸\8aà¹\89à¸\84ำà¸\84à¹\89à¸\99หาอืà¹\88à¸\99',
 'titlematches' => 'พบชื่อเรื่องหน้าตรงกัน',
 'notitlematches' => 'ไม่พบชื่อเรื่องหน้าตรงกัน',
 'textmatches' => 'พบคำนี้ในหน้า',
@@ -1161,7 +1182,7 @@ $1",
 'searchmenu-exists' => "'''มีหน้าชื่อ \"[[:\$1]]\" บนวิกินี้'''",
 'searchmenu-new' => "'''สร้างหน้า \"[[:\$1]]\" บนวิกินี้'''",
 'searchhelp-url' => 'Help:สารบัญ',
-'searchmenu-prefix' => '[[Special:PrefixIndex/$1|สืà¸\9aà¸\84à¹\89à¸\99หน้าที่มีคำขึ้นต้นนี้]]',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|à¸\84à¹\89à¸\99à¸\94ูหน้าที่มีคำขึ้นต้นนี้]]',
 'searchprofile-articles' => 'หน้าเนื้อหา',
 'searchprofile-project' => 'คำอธิบายและหน้าโครงการ',
 'searchprofile-images' => 'มัลติมีเดีย',
@@ -1182,16 +1203,16 @@ $1",
 'search-interwiki-default' => '$1 ผลลัพธ์:',
 'search-interwiki-more' => '(เพิ่มเติม)',
 'search-relatedarticle' => 'สัมพันธ์',
-'mwsuggest-disable' => 'ยà¸\81à¹\80ลิà¸\81à¸\81ารà¹\81à¸\99ะà¸\99ำà¹\83à¸\99ลัà¸\81ษà¸\93ะà¹\80อà¹\81à¸\88à¹\87à¸\81à¸\8bà¹\8c',
-'searcheverything-enable' => 'สืà¸\9aà¸\84à¹\89à¸\99à¹\83à¸\99à¹\80à¸\99มสà¹\80à¸\9bà¸\8bà¸\97ัà¹\89à¸\87หมà¸\94',
+'mwsuggest-disable' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารà¹\80สà¸\99อà¹\81à¸\99ะà¸\81ารà¸\84à¹\89à¸\99หา',
+'searcheverything-enable' => 'à¸\84à¹\89à¸\99หาà¹\83à¸\99à¸\97ุà¸\81à¹\80à¸\99มสà¹\80à¸\9bà¸\8b',
 'searchrelated' => 'สัมพันธ์',
 'searchall' => 'ทั้งหมด',
-'showingresults' => "à¹\81สà¸\94à¸\87 $1 à¸£à¸²à¸¢à¸\81าร à¹\80ริà¹\88มà¸\95à¹\89à¸\99à¸\88าà¸\81รายการที่ '''$2'''",
-'showingresultsnum' => "à¹\81สà¸\94à¸\87 $3 à¸£à¸²à¸¢à¸\81าร à¹\80ริà¹\88มà¸\95à¹\89à¸\99à¸\88าà¸\81รายการที่  '''$2'''",
-'showingresultsheader' => "{{PLURAL:$5|à¸\9cลà¸\81ารสืà¸\9aà¸\84à¹\89à¸\99 '''$1''' à¸\88าà¸\81 '''$3'''|à¸\9cลà¸\81ารสืà¸\9aà¸\84à¹\89à¸\99 '''$1 - $2''' จาก '''$3'''}} สำหรับ '''$4'''",
-'nonefound' => "'''à¸\84ำà¹\80à¸\95ือà¸\99''': à¸¡à¸µà¹\80à¸\9eียà¸\87à¸\9aาà¸\87à¹\80à¸\99มสà¹\80à¸\9bà¸\8bà¸\97ีà¹\88à¸\88ะà¸\96ูà¸\81à¸\84à¹\89à¸\99โดยปริยาย
-ลอà¸\87à¹\80ลือà¸\81à¸\84ำà¸\82ึà¹\89à¸\99à¸\95à¹\89à¸\99à¸\81ารà¸\84à¹\89à¸\99หาà¸\94à¹\89วย ''all:'' à¸ªà¸³à¸«à¸£à¸±à¸\9aà¸\84à¹\89à¸\99à¹\80à¸\99ืà¹\89อหาà¸\97ัà¹\89à¸\87หมà¸\94 (รวมหà¸\99à¹\89าอภิà¸\9bราย à¹\81มà¹\88à¹\81à¸\9aà¸\9a à¸¯à¸¥à¸¯) à¸«à¸£à¸·à¸­à¹\80ลือà¸\81เนมสเปซที่ต้องการ",
-'search-nonefound' => 'à¹\84มà¹\88มีà¸\9cลลัà¸\9eà¸\98à¹\8cà¸\95ามà¸\84ำà¸\84à¹\89à¸\99à¸\97ีà¹\88à¸\81ำหà¸\99à¸\94',
+'showingresults' => "à¹\81สà¸\94à¸\87 $1 à¸£à¸²à¸¢à¸\81าร à¹\80ริà¹\88มà¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88รายการที่ '''$2'''",
+'showingresultsnum' => "à¹\81สà¸\94à¸\87 $3 à¸£à¸²à¸¢à¸\81าร à¹\80ริà¹\88มà¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88รายการที่  '''$2'''",
+'showingresultsheader' => "{{PLURAL:$5|à¸\9cลà¸\81ารà¸\84à¹\89à¸\99หา '''$1''' à¸\88าà¸\81 '''$3'''|à¸\9cลà¸\81ารà¸\84à¹\89à¸\99หา '''$1 - $2''' จาก '''$3'''}} สำหรับ '''$4'''",
+'nonefound' => "'''à¸\84ำà¹\80à¸\95ือà¸\99''': à¸¡à¸µà¹\80à¸\9eียà¸\87à¸\9aาà¸\87à¹\80à¸\99มสà¹\80à¸\9bà¸\8bà¹\80à¸\97à¹\88าà¸\99ัà¹\89à¸\99à¸\97ีà¹\88à¸\88ะà¸\96ูà¸\81à¸\84à¹\89à¸\99หาโดยปริยาย
+ลอà¸\87à¸\82ึà¹\89à¸\99à¸\95à¹\89à¸\99à¸\81ารà¸\84à¹\89à¸\99หาà¸\94à¹\89วย ''all:'' à¹\80à¸\9eืà¹\88อà¸\84à¹\89à¸\99หาà¹\80à¸\99ืà¹\89อหาà¸\97ัà¹\89à¸\87หมà¸\94 (รวมหà¸\99à¹\89าอภิà¸\9bราย à¹\81มà¹\88à¹\81à¸\9aà¸\9a à¸¯à¸¥à¸¯) à¸«à¸£à¸·à¸­à¹\83à¸\8aà¹\89à¸\84ำà¸\82ึà¹\89à¸\99à¸\95à¹\89à¸\99à¹\80à¸\9bà¹\87à¸\99เนมสเปซที่ต้องการ",
+'search-nonefound' => 'à¹\84มà¹\88มีà¸\9cลลัà¸\9eà¸\98à¹\8cà¸\95รà¸\87à¸\81ัà¸\9aà¸\84ำà¸\84à¹\89à¸\99',
 'powersearch' => 'ค้นหาระดับสูง',
 'powersearch-legend' => 'ค้นหาระดับสูง',
 'powersearch-ns' => 'ค้นหาในเนมสเปซ:',
@@ -1200,14 +1221,14 @@ $1",
 'powersearch-togglelabel' => 'เลือก:',
 'powersearch-toggleall' => 'ทั้งหมด',
 'powersearch-togglenone' => 'ไม่เลือก',
-'search-external' => 'à¸\84à¹\89à¸\99หาà¸\88าà¸\81ภายà¸\99อà¸\81',
-'searchdisabled' => 'ระà¸\9aà¸\9aà¸\81ารà¸\84à¹\89à¸\99หาà¹\83à¸\99 {{SITENAME}} à¹\84มà¹\88à¹\80à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99 à¸\84ุà¸\93สามารà¸\96à¸\84à¹\89à¸\99หาà¹\83à¸\99à¸\81ูà¹\80à¸\81ิลหรือà¹\80à¸\8bิรà¹\8cà¸\8aà¹\80อà¸\99à¸\88ิà¸\99อืà¹\88à¸\99 à¹\82à¸\9bรà¸\94à¸\97ราà¸\9aวà¹\88าเนื้อหาของ {{SITENAME}} บนเซิร์ชเอนจินอาจเป็นข้อมูลเก่า',
+'search-external' => 'ค้นหาภายนอก',
+'searchdisabled' => 'à¸\81ารà¸\84à¹\89à¸\99หา {{SITENAME}} à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99 à¸\84ุà¸\93สามารà¸\96à¸\84à¹\89à¸\99หาà¸\9cà¹\88าà¸\99à¸\81ูà¹\80à¸\81ิลหรือà¹\80à¸\8bิรà¹\8cà¸\8aà¹\80อà¸\99à¸\88ิà¸\99อืà¹\88à¸\99à¹\83à¸\99à¹\80วลาà¹\84มà¹\88à¸\99าà¸\99 à¹\82à¸\9bรà¸\94à¸\97ราà¸\9aวà¹\88าà¸\94ัà¸\8aà¸\99ีเนื้อหาของ {{SITENAME}} บนเซิร์ชเอนจินอาจเป็นข้อมูลเก่า',
 
 # Quickbar
 'qbsettings' => 'แถบพิเศษ',
 'qbsettings-none' => 'ไม่มี',
-'qbsettings-fixedleft' => 'อยูà¹\88ทางซ้าย',
-'qbsettings-fixedright' => 'อยูà¹\88ทางขวา',
+'qbsettings-fixedleft' => 'à¸\95รึà¸\87à¹\84วà¹\89ทางซ้าย',
+'qbsettings-fixedright' => 'à¸\95รึà¸\87à¹\84วà¹\89ทางขวา',
 'qbsettings-floatingleft' => 'ด้านซ้าย',
 'qbsettings-floatingright' => 'ด้านขวา',
 
@@ -1225,7 +1246,7 @@ $1",
 'prefs-datetime' => 'วันที่และเวลา',
 'prefs-labs' => 'คุณสมบัติทดลอง',
 'prefs-user-pages' => 'หน้าผู้ใช้',
-'prefs-personal' => 'รายละà¹\80อียà¸\94ผู้ใช้',
+'prefs-personal' => 'à¹\82à¸\9eรà¹\84à¸\9fลà¹\8cผู้ใช้',
 'prefs-rc' => 'ปรับปรุงล่าสุด',
 'prefs-watchlist' => 'รายการเฝ้าดู',
 'prefs-watchlist-days' => 'จำนวนวันที่แสดงในรายการเฝ้าดู:',
@@ -1237,7 +1258,7 @@ $1",
 'prefs-resetpass' => 'เปลี่ยนรหัสผ่าน',
 'prefs-changeemail' => 'เปลี่ยนที่อยู่อีเมล',
 'prefs-setemail' => 'ตั้งที่อยู่อีเมล',
-'prefs-email' => 'à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าอีเมล',
+'prefs-email' => 'à¸\95ัวà¹\80ลือà¸\81อีเมล',
 'prefs-rendering' => 'รูปลักษณ์',
 'saveprefs' => 'บันทึก',
 'resetprefs' => 'ล้างการเปลี่ยนแปลงที่ยังไม่บันทึก',
@@ -1246,10 +1267,10 @@ $1",
 'prefs-edit-boxsize' => 'ขนาดหน้าจอกล่องแก้ไข',
 'rows' => 'แถว:',
 'columns' => 'คอลัมน์:',
-'searchresultshead' => 'สืà¸\9aà¸\84à¹\89à¸\99',
-'resultsperpage' => 'รายà¸\81ารต่อหน้า:',
-'stub-threshold' => 'à¸\82ีà¸\94à¹\81à¸\9aà¹\88à¸\87สำหรัà¸\9a <a href="#" class="stub">รูà¸\9bà¹\81à¸\9aà¸\9aà¹\82à¸\84รà¸\87</a> (à¸\84วามยาวà¸\9aà¸\97à¸\84วาม):',
-'stub-threshold-disabled' => 'à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99',
+'searchresultshead' => 'à¸\84à¹\89à¸\99หา',
+'resultsperpage' => 'à¸\81ารà¹\80à¸\9bิà¸\94à¸\94ูต่อหน้า:',
+'stub-threshold' => 'à¸\82ีà¸\94à¹\81à¸\9aà¹\88à¸\87สำหรัà¸\9a <a href="#" class="stub">ลิà¸\87à¸\81à¹\8cà¹\82à¸\84รà¸\87</a> (à¹\84à¸\9aà¸\95à¹\8c):',
+'stub-threshold-disabled' => 'ปิดใช้งาน',
 'recentchangesdays' => 'จำนวนวันที่แสดงในปรับปรุงล่าสุด:',
 'recentchangesdays-max' => 'มากสุด $1 วัน',
 'recentchangescount' => 'จำนวนการแก้ไขที่แสดงโดยปริยาย:',
@@ -1284,47 +1305,47 @@ $1",
 'prefs-custom-css' => 'สไตล์ชีตปรับแต่งเอง',
 'prefs-custom-js' => 'จาวาสคริปต์ปรับแต่งเอง',
 'prefs-common-css-js' => 'CSS / จาวาสคริปต์ที่ใช้ร่วมกันกับทุกหน้าตา:',
-'prefs-reset-intro' => 'à¸\84ุà¸\93สามารà¸\96à¹\83à¸\8aà¹\89หà¸\99à¹\89าà¸\99ีà¹\89à¸\95ัà¹\89à¸\87à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\82อà¸\87à¸\84ุà¸\93à¸\81ลัà¸\9aà¹\80à¸\9bà¹\87à¸\99à¸\84à¹\88าà¸\95ัà¹\89à¸\87à¸\95à¹\89à¸\99à¸\82อà¸\87à¹\84à¸\8bà¸\95à¹\8cใหม่
¹\80มืà¹\88อลà¹\89าà¸\87à¹\81ลà¹\89วà¸\88ะà¹\84มà¹\88สามารà¸\96ยà¹\89อà¸\99กลับได้',
+'prefs-reset-intro' => 'à¸\84ุà¸\93สามารà¸\96à¹\83à¸\8aà¹\89หà¸\99à¹\89าà¸\99ีà¹\89à¸\95ัà¹\89à¸\87à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\82อà¸\87à¸\84ุà¸\93à¸\81ลัà¸\9aà¹\84à¸\9bยัà¸\87à¸\84à¹\88าà¸\95ัà¹\89à¸\87à¸\95à¹\89à¸\99à¸\82อà¸\87à¹\80วà¹\87à¸\9aใหม่
¸\8bึà¹\88à¸\87à¹\84มà¹\88สามารà¸\96à¸\97ำกลับได้',
 'prefs-emailconfirm-label' => 'การยืนยันอีเมล:',
-'prefs-textboxsize' => 'à¸\82à¸\99าà¸\94à¸\82อà¸\87หà¸\99à¹\89าà¸\95à¹\88าà¸\87à¹\81à¸\81à¹\89à¹\84à¸\82',
+'prefs-textboxsize' => 'ขนาดหน้าต่างแก้ไข',
 'youremail' => 'อีเมล:',
 'username' => '{{GENDER:$1|ชื่อผู้ใช้}}:',
 'uid' => 'รหัสประจำตัว{{GENDER:$1|ผู้ใช้}}:',
 'prefs-memberingroups' => '{{GENDER:$2|สมาชิก}}ใน{{PLURAL:$1|กลุ่ม|กลุ่ม}}:',
-'prefs-registration' => 'วัà¸\99à¹\80วลาà¸\97ีà¹\88ลงทะเบียน:',
+'prefs-registration' => 'à¹\80วลาลงทะเบียน:',
 'yourrealname' => 'ชื่อจริง:',
 'yourlanguage' => 'ภาษา:',
 'yourvariant' => 'อักษรต่างรูปของเนื้อหา:',
 'yournick' => 'ลายเซ็น:',
-'prefs-help-signature' => 'à¸\84วามà¹\80หà¹\87à¸\99à¹\83à¸\99หà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¸\84วรà¸\88ะลà¸\87ลายà¹\80à¸\8bà¹\87à¸\99à¸\94à¹\89วย "<nowiki>~~~~</nowiki>" à¸\8bึà¹\88à¸\87à¸\88ะà¸\96ูà¸\81à¹\81à¸\9bลà¸\87à¹\80à¸\9bà¹\87à¸\99ลายà¹\80à¸\8bà¹\87à¸\99และตราเวลา',
-'badsig' => 'ลายà¹\80à¸\8bà¹\87à¸\99à¸\97ีà¹\88à¹\83à¸\8aà¹\89à¸\9cิà¸\94à¸\9eลาà¸\94 à¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9aà¸\84ำสัà¹\88à¸\87เอชทีเอ็มแอล',
+'prefs-help-signature' => 'à¸\84วามà¹\80หà¹\87à¸\99à¹\83à¸\99หà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¸\84วรลà¸\87ลายà¹\80à¸\8bà¹\87à¸\99à¸\94à¹\89วย "<nowiki>~~~~</nowiki>" à¸\8bึà¹\88à¸\87à¸\88ะà¸\96ูà¸\81à¹\81à¸\9bลà¸\87à¹\80à¸\9bà¹\87à¸\99ลายà¹\80à¸\8bà¹\87à¸\99à¸\82อà¸\87à¸\84ุà¸\93และตราเวลา',
+'badsig' => 'ลายà¹\80à¸\8bà¹\87à¸\99à¸\94ิà¸\9aà¹\84มà¹\88สมà¹\80หà¸\95ุสมà¸\9cล à¸\95รวà¸\88สอà¸\9aà¸\9bà¹\89ายระà¸\9aุเอชทีเอ็มแอล',
 'badsiglength' => 'ลายเซ็นของคุณยาวเกินไป ต้องยาวไม่เกิน $1 ตัวอักษร',
 'yourgender' => 'เพศ:',
 'gender-unknown' => 'ไม่ระบุ',
 'gender-male' => 'ชาย',
 'gender-female' => 'หญิง',
-'prefs-help-gender' => 'à¹\80à¸\9bà¹\87à¸\99à¸\82à¹\89อมูลà¹\80สริม: à¹\83à¸\8aà¹\89à¹\80à¸\9eืà¹\88อà¹\83หà¹\89à¸\8bอà¸\9fà¸\95à¹\8cà¹\81วรà¹\8cà¹\81ยà¸\81à¹\81ยะà¹\80à¸\9eศà¸\82อà¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\84à¸\94à¹\89 à¸\82à¹\89อมูลà¸\99ีà¹\89à¸\88ะà¹\80à¸\9bà¹\87à¸\99à¸\97ีà¹\88à¹\80à¸\9bิà¸\94à¹\80à¸\9cย',
+'prefs-help-gender' => 'à¹\80à¸\9bà¹\87à¸\99à¸\82à¹\89อมูลà¹\80สริม: à¹\83à¸\8aà¹\89à¹\80à¸\9eืà¹\88อà¹\83หà¹\89à¸\8bอà¸\9fà¸\95à¹\8cà¹\81วรà¹\8cà¹\81ยà¸\81à¹\81ยะà¹\80à¸\9eศà¸\82อà¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\84à¸\94à¹\89 à¸\82à¹\89อมูลà¸\99ีà¹\89à¸\88ะà¹\80à¸\9bิà¸\94à¹\80à¸\9cยà¸\95à¹\88อสาà¸\98ารà¸\93ะ',
 'email' => 'อีเมล',
-'prefs-help-realname' => 'à¹\84มà¹\88à¸\88ำà¹\80à¸\9bà¹\87à¸\99à¸\95à¹\89อà¸\87à¹\83à¸\8aà¹\89à¸\8aืà¹\88อà¸\88ริà¸\87 à¸\96à¹\89าà¸\84ุà¸\93à¹\80ลือà¸\81à¸\97ีà¹\88à¸\88ะà¹\83à¸\8aà¹\89à¸\8aืà¹\88อà¸\88ริà¸\87 à¸\88ะà¹\83à¸\8aà¹\89à¹\80à¸\9eืà¹\88อà¹\83หà¹\89à¹\80à¸\81ียรà¸\95ิà¹\81à¸\81à¹\88à¸\87าà¸\99à¸\82อà¸\87à¸\84ุà¸\93',
-'prefs-help-email' => 'à¹\84มà¹\88à¸\95à¹\89อà¸\87à¹\83สà¹\88à¸\97ีà¹\88อยูà¹\88อีà¹\80มล à¹\81à¸\95à¹\88à¸\88ำà¹\80à¸\9bà¹\87à¸\99สำหรัà¸\9aà¸\81ารà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¹\80มืà¹\88อà¸\84ุà¸\93ลืมรหัสà¸\9cà¹\88าà¸\99à¸\82อà¸\87à¸\84ุà¸\93',
+'prefs-help-realname' => 'ไม่จำเป็นต้องใช้ชื่อจริง ถ้าคุณเลือกใช้ชื่อจริง จะใช้เพื่อให้เกียรติแก่งานของคุณ',
+'prefs-help-email' => 'à¹\84มà¹\88à¸\88ำà¹\80à¸\9bà¹\87à¸\99à¸\95à¹\89อà¸\87à¹\83สà¹\88à¸\97ีà¹\88อยูà¹\88อีà¹\80มล à¹\81à¸\95à¹\88à¸\88ำà¹\80à¸\9bà¹\87à¸\99สำหรัà¸\9aà¸\81ารà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¹\80มืà¹\88อà¸\84ุà¸\93ลืมรหัสà¸\9cà¹\88าà¸\99',
 'prefs-help-email-others' => 'คุณยังสามารถเลือกให้ผู้อื่นติดต่อคุณโดยอีเมลผ่านลิงก์บนหน้าผู้ใช้หรือหน้าพูดคุยกับผู้ใช้ของคุณ
 ที่อยู่อีเมลของคุณไม่ถูกเปิดเผยเมื่อผู้ใช้อื่นติดต่อคุณ',
 'prefs-help-email-required' => 'ต้องการที่อยู่อีเมล',
 'prefs-info' => 'ข้อมูลเบื้องต้น',
-'prefs-i18n' => 'ระà¸\9aà¸\9aภาษาหรือà¹\80à¸\82à¸\95à¸\9eืà¹\89à¸\99à¸\97ีà¹\88',
+'prefs-i18n' => 'สาà¸\81ลวิวัà¸\95à¸\99à¹\8c',
 'prefs-signature' => 'ลายเซ็น',
 'prefs-dateformat' => 'รูปแบบวันที่',
 'prefs-timeoffset' => 'ส่วนต่างเวลา',
-'prefs-advancedediting' => 'à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าขั้นสูง',
-'prefs-advancedrc' => 'à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าขั้นสูง',
-'prefs-advancedrendering' => 'à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าขั้นสูง',
-'prefs-advancedsearchoptions' => 'à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าขั้นสูง',
-'prefs-advancedwatchlist' => 'à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าขั้นสูง',
-'prefs-displayrc' => 'à¸\84à¹\88าà¸\81ารà¹\81สà¸\94à¸\87à¸\9cล',
-'prefs-displaysearchoptions' => 'à¸\84à¹\88าà¸\81ารà¹\81สà¸\94à¸\87à¸\9cล',
-'prefs-displaywatchlist' => 'à¸\84à¹\88าà¸\81ารà¹\81สà¸\94à¸\87à¸\9cล',
-'prefs-diffs' => 'à¹\81à¸\95à¸\81ต่าง',
+'prefs-advancedediting' => 'à¸\95ัวà¹\80ลือà¸\81ขั้นสูง',
+'prefs-advancedrc' => 'à¸\95ัวà¹\80ลือà¸\81ขั้นสูง',
+'prefs-advancedrendering' => 'à¸\95ัวà¹\80ลือà¸\81ขั้นสูง',
+'prefs-advancedsearchoptions' => 'à¸\95ัวà¹\80ลือà¸\81ขั้นสูง',
+'prefs-advancedwatchlist' => 'à¸\95ัวà¹\80ลือà¸\81ขั้นสูง',
+'prefs-displayrc' => 'à¸\95ัวà¹\80ลือà¸\81à¸\9cลà¹\81สà¸\94à¸\87',
+'prefs-displaysearchoptions' => 'à¸\95ัวà¹\80ลือà¸\81à¸\9cลà¹\81สà¸\94à¸\87',
+'prefs-displaywatchlist' => 'à¸\95ัวà¹\80ลือà¸\81à¸\9cลà¹\81สà¸\94à¸\87',
+'prefs-diffs' => 'à¸\9cลต่าง',
 
 # User preference: e-mail validation using jQuery
 'email-address-validity-valid' => 'ที่อยู่อีเมลดูถูกต้อง',
@@ -1339,14 +1360,14 @@ $1",
 'userrights-editusergroup' => 'แก้ไขกลุ่มผู้ใช้',
 'saveusergroups' => 'ตกลง',
 'userrights-groupsmember' => 'สมาชิกในกลุ่ม:',
-'userrights-groupsmember-auto' => 'สมาà¸\8aิà¸\81à¹\82à¸\94ยà¸\99ัยของ:',
-'userrights-groups-help' => 'คุณสามารถเปลี่ยนแปลงกลุ่มที่ผู้ใช้รายนี้อยู่ใน:
-* à¸\81ลà¹\88อà¸\87à¸\97ีà¹\88à¸\96ูà¸\81à¹\80ลือà¸\81หมายà¸\84วามวà¹\88าผู้ใช้อยู่ในกลุ่มนั้น
-* à¸\81ลà¹\88อà¸\87à¸\97ีà¹\88à¹\84มà¹\88à¸\96ูà¸\81à¹\80ลือà¸\81หมายà¸\84วามวà¹\88าผู้ใช้ไม่ได้อยู่ในกลุ่มนั้น
-* à¹\80à¸\84รืà¹\88อà¸\87หมาย * à¸\8aีà¹\89วà¹\88าà¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\80อาà¸\81ลุà¹\88มà¸\99ัà¹\89à¸\99ออà¸\81à¹\84à¸\94à¹\89à¹\80มืà¹\88อà¹\83à¸\94à¸\81à¹\87à¸\95ามà¸\97ีà¹\88คุณเพิ่มกลุ่มนั้นไปแล้ว หรือกลับกัน',
+'userrights-groupsmember-auto' => 'สมาà¸\8aิà¸\81à¹\82à¸\94ยà¸\9bริยายของ:',
+'userrights-groups-help' => 'คุณสามารถเปลี่ยนแปลงกลุ่มที่ผู้ใช้รายนี้อยู่:
+* à¸\81ลà¹\88อà¸\87à¸\97ีà¹\88มีà¹\80à¸\84รืà¹\88อà¸\87หมายà¸\96ูà¸\81 à¸«à¸¡à¸²à¸¢à¸\84วามวà¹\88า ผู้ใช้อยู่ในกลุ่มนั้น
+* à¸\81ลà¹\88อà¸\87à¸\97ีà¹\88à¹\84มà¹\88มีà¹\80à¸\84รืà¹\88อà¸\87หมายà¸\96ูà¸\81 à¸«à¸¡à¸²à¸¢à¸\84วามวà¹\88า ผู้ใช้ไม่ได้อยู่ในกลุ่มนั้น
+* à¹\80à¸\84รืà¹\88อà¸\87หมาย * à¸\8aีà¹\89วà¹\88าà¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¸\99ำà¸\81ลุà¹\88มà¸\99ัà¹\89à¸\99ออà¸\81à¹\84à¸\94à¹\89à¹\80มืà¹\88อคุณเพิ่มกลุ่มนั้นไปแล้ว หรือกลับกัน',
 'userrights-reason' => 'เหตุผล:',
-'userrights-no-interwiki' => 'à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aสิà¸\97à¸\98ิà¹\83à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82สิà¸\97à¸\98ิà¸\82อà¸\87ผู้ใช้บนวิกิอื่น',
-'userrights-nodatabase' => 'ไม่มีฐานข้อมูล $1 อยู่ หรือ ฐานข้อมูลอยู่บนเครื่องอื่น',
+'userrights-no-interwiki' => 'à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aสิà¸\97à¸\98ิà¹\81à¸\81à¹\89à¹\84à¸\82สิà¸\97à¸\98ิผู้ใช้บนวิกิอื่น',
+'userrights-nodatabase' => 'ไม่มีฐานข้อมูล $1 อยู่ หรือฐานข้อมูลอยู่บนเครื่องอื่น',
 'userrights-nologin' => 'คุณต้อง[[Special:UserLogin|ล็อกอิน]]ด้วยบัญชีผู้ดูแลระบบก่อน จึงจะกำหนดสิทธิผู้ใช้ได้',
 'userrights-notallowed' => 'บัญชีของคุณไม่ได้รับอนุญาตให้เพิ่มหรือลดสิทธิของผู้ใช้',
 'userrights-changeable-col' => 'กลุ่มที่คุณสามารถเปลี่ยนได้',
@@ -1354,27 +1375,27 @@ $1",
 
 # Groups
 'group' => 'กลุ่ม:',
-'group-user' => 'ผู้ใช้ใหม่',
+'group-user' => 'ผู้ใช้',
 'group-autoconfirmed' => 'ผู้ใช้ทั่วไป',
 'group-bot' => 'บอต',
-'group-sysop' => 'ผู้ดูแล',
+'group-sysop' => 'ผู้ดูแลระบบ',
 'group-bureaucrat' => 'ผู้ดูแลสิทธิแต่งตั้ง',
-'group-suppress' => 'à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\94ัà¸\9aสูà¸\87',
+'group-suppress' => 'à¸\9cูà¹\89à¸\94ูà¹\81ลà¸\9bระวัà¸\95ิ',
 'group-all' => '(ทั้งหมด)',
 
-'group-user-member' => '{{GENDER:$1|ผู้ใช้ใหม่}}',
+'group-user-member' => '{{GENDER:$1|ผู้ใช้}}',
 'group-autoconfirmed-member' => '{{GENDER:$1|ผู้ใช้ทั่วไป}}',
 'group-bot-member' => '{{GENDER:$1|บอต}}',
 'group-sysop-member' => '{{GENDER:$1|ผู้ดูแลระบบ}}',
 'group-bureaucrat-member' => '{{GENDER:$1|ผู้ดูแลสิทธิแต่งตั้ง}}',
-'group-suppress-member' => '{{GENDER:$1|oversight}}',
+'group-suppress-member' => '{{GENDER:$1|ผู้ดูแลประวัติ}}',
 
 'grouppage-user' => '{{ns:project}}:ผู้ใช้',
 'grouppage-autoconfirmed' => '{{ns:project}}:ผู้ใช้ทั่วไป',
 'grouppage-bot' => '{{ns:project}}:บอต',
 'grouppage-sysop' => '{{ns:project}}:ผู้ดูแล',
 'grouppage-bureaucrat' => '{{ns:project}}:ผู้ดูแลสิทธิแต่งตั้ง',
-'grouppage-suppress' => '{{ns:project}}:à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\94ัà¸\9aสูà¸\87',
+'grouppage-suppress' => '{{ns:project}}:à¸\9cูà¹\89à¸\94ูà¹\81ลà¸\9bระวัà¸\95ิ',
 
 # Rights
 'right-read' => 'อ่านหน้า',
@@ -1382,7 +1403,7 @@ $1",
 'right-createpage' => 'สร้างหน้า (ที่ไม่ใช่หน้าอภิปราย)',
 'right-createtalk' => 'สร้างหน้าอภิปราย',
 'right-createaccount' => 'สร้างบัญชีผู้ใช้ใหม่',
-'right-minoredit' => 'ทำเครื่องหมายการแก้ไขเล็กน้อย',
+'right-minoredit' => 'à¸\97ำà¹\80à¸\84รืà¹\88อà¸\87หมายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80à¸\9bà¹\87à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80ลà¹\87à¸\81à¸\99à¹\89อย',
 'right-move' => 'ย้ายหน้า',
 'right-move-subpages' => 'ย้ายหน้าพร้อมหน้าย่อย',
 'right-move-rootuserpages' => 'ย้ายหน้าผู้ใช้หลัก',
@@ -1395,42 +1416,42 @@ $1",
 'right-upload_by_url' => 'อัปโหลดไฟล์จากยูอาร์แอล',
 'right-purge' => 'ล้างแคชของเว็บไซต์โดยไม่มีการยืนยัน',
 'right-autoconfirmed' => 'แก้ไขหน้าที่ถูกกึ่งล็อก',
-'right-bot' => 'à¸\81ำหà¸\99à¸\94วà¹\88าà¹\80à¸\9bà¹\87à¸\99à¸\81ระà¸\9aวà¸\99à¸\81ารอัà¸\95à¹\82à¸\99มัà¸\95ิ',
-'right-nominornewtalk' => 'à¹\84มà¹\88มีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80ลà¹\87à¸\81à¸\99à¹\89อยà¸\97ีà¹\88หà¸\99à¹\89าสà¸\99à¸\97à¸\99าà¸\97ีà¹\88à¸\97ำà¹\83หà¹\89à¸\81ารà¹\80à¸\95ือà¸\99ข้อความใหม่ปรากฏ',
+'right-bot' => 'กำหนดเป็นกระบวนการอัตโนมัติ',
+'right-nominornewtalk' => 'à¹\84มà¹\88มีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80ลà¹\87à¸\81à¸\99à¹\89อยà¹\83à¸\99หà¸\99à¹\89าอภิà¸\9bรายà¸\97ีà¹\88à¸\97ำà¹\83หà¹\89à¸\81ารà¹\81à¸\88à¹\89à¸\87ข้อความใหม่ปรากฏ',
 'right-apihighlimits' => 'ใช้ข้อจำกัดที่สูงขึ้นในคำสั่งเอพีไอ',
 'right-writeapi' => 'ใช้การเขียนเอพีไอ',
 'right-delete' => 'ลบหน้า',
 'right-bigdelete' => 'ลบหน้าที่มีประวัติขนาดใหญ่',
-'right-deletelogentry' => 'ลà¸\9aà¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99รายà¸\81ารปูมที่เจาะจง',
-'right-deleterevision' => 'ลà¸\9aà¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99รุà¹\88à¸\99à¸\97ีà¹\88à¹\80à¸\88าะà¸\88à¸\87à¸\82อà¸\87หà¸\99à¹\89าà¸\95à¹\88าà¸\87 à¹\86',
-'right-deletedhistory' => 'à¸\94ูรายà¸\81ารประวัติที่ถูกลบ โดยไม่มีข้อความที่เกี่ยวข้อง',
-'right-deletedtext' => 'à¹\80รียà¸\81à¸\94ูà¸\82à¹\89อà¸\84วามà¸\97ีà¹\88à¸\96ูà¸\81ลà¸\9aà¹\81ละà¸\84วามเปลี่ยนแปลงระหว่างรุ่นที่ถูกลบ',
+'right-deletelogentry' => 'ลà¸\9aà¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99หà¸\99à¹\88วยปูมที่เจาะจง',
+'right-deleterevision' => 'ลà¸\9aà¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99รุà¹\88à¸\99à¸\88ำà¹\80à¸\9eาะà¸\82อà¸\87หà¸\99à¹\89า',
+'right-deletedhistory' => 'à¸\94ูหà¸\99à¹\88วยประวัติที่ถูกลบ โดยไม่มีข้อความที่เกี่ยวข้อง',
+'right-deletedtext' => 'à¸\94ูà¸\82à¹\89อà¸\84วามà¸\97ีà¹\88à¸\96ูà¸\81ลà¸\9aà¹\81ละà¸\81ารเปลี่ยนแปลงระหว่างรุ่นที่ถูกลบ',
 'right-browsearchive' => 'ค้นหาหน้าที่ถูกลบ',
-'right-undelete' => 'à¹\80รียà¸\81คืนหน้า',
+'right-undelete' => 'à¸\81ูà¹\89คืนหน้า',
 'right-suppressrevision' => 'ดูและกู้คืนรุ่นที่ซ่อนจากผู้ดูแลระบบ',
 'right-suppressionlog' => 'ดูปูมส่วนตัว',
-'right-block' => 'à¸\9aลà¹\87อà¸\81à¸\9cูà¹\89à¹\83à¸\8aà¹\89อืà¹\88à¸\99มิà¹\83หà¹\89แก้ไข',
-'right-blockemail' => 'à¸\9aลà¹\87อà¸\81à¸\9cูà¹\89à¹\83à¸\8aà¹\89มิà¹\83ห้ส่งอีเมล',
-'right-hideuser' => 'à¸\9aลà¹\87อà¸\81à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\81ละà¸\8bà¹\88อà¸\99à¹\84มà¹\88à¹\83หà¹\89à¸\9cูà¹\89อืà¹\88à¸\99เห็น',
-'right-ipblock-exempt' => 'à¸\9cà¹\88าà¸\99à¸\81ารà¸\9aลà¹\87อà¸\81หมายà¹\80ลà¸\82à¹\84อà¸\9eี à¸\9aลà¹\87อà¸\81à¹\81à¸\9aà¸\9aอัà¸\95à¹\82à¸\99มัà¸\95ิ à¹\81ละà¸\9aลà¹\87อà¸\81à¹\80à¸\9bà¹\87à¸\99ช่วง',
-'right-proxyunbannable' => 'à¸\9cà¹\88าà¸\99à¸\81ารà¸\9aลà¹\87อà¸\81à¹\81à¸\9aà¸\9aอัตโนมัติของพร็อกซี',
-'right-unblockself' => 'ยà¸\81à¹\80ลิà¸\81à¸\81ารบล็อกตนเอง',
+'right-block' => 'à¸\9aลà¹\87อà¸\81มิà¹\83หà¹\89à¸\9cูà¹\89à¹\83à¸\8aà¹\89อืà¹\88à¸\99แก้ไข',
+'right-blockemail' => 'à¸\9aลà¹\87อà¸\81มิà¹\83หà¹\89à¸\9cูà¹\89à¹\83à¸\8a้ส่งอีเมล',
+'right-hideuser' => 'à¸\9aลà¹\87อà¸\81à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89 à¸\8bà¹\88อà¸\99à¹\84มà¹\88à¹\83หà¹\89สาà¸\98ารà¸\93ะเห็น',
+'right-ipblock-exempt' => 'อà¹\89อมà¸\81ารà¸\9aลà¹\87อà¸\81à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eี à¸\9aลà¹\87อà¸\81อัà¸\95à¹\82à¸\99มัà¸\95ิ à¹\81ละà¸\9aลà¹\87อà¸\81ช่วง',
+'right-proxyunbannable' => 'à¹\80ลีà¹\88ยà¸\87à¸\81ารà¸\9aลà¹\87อà¸\81อัตโนมัติของพร็อกซี',
+'right-unblockself' => 'à¸\9bลà¸\94บล็อกตนเอง',
 'right-protect' => 'เปลี่ยนระดับการล็อกและแก้ไขหน้าที่ถูกล็อก',
-'right-editprotected' => 'à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81ลà¹\87อà¸\81 (ที่ไม่ล็อกแบบสืบทอด)',
-'right-editinterface' => 'à¹\81à¸\81à¹\89à¹\84à¸\82อิà¸\99à¹\80à¸\95อรà¹\8cà¹\80à¸\9fà¸\8bà¸\82อà¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89',
-'right-editusercssjs' => 'แก้ไข CSS และ JS ของผู้ใช้คนอื่น',
-'right-editusercss' => 'แก้ไข CSS ของผู้ใช้คนอื่น',
-'right-edituserjs' => 'แก้ไข JS ของผู้ใช้คนอื่น',
-'right-rollback' => 'ยà¹\89อà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89ลà¹\88าสุà¸\94à¸\97ีà¹\88à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¹\82à¸\94ยà¹\80à¸\89à¸\9eาะอยà¹\88าà¸\87รวà¸\94à¹\80รà¹\87ว',
+'right-editprotected' => 'หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81ลà¹\87อà¸\81à¹\80à¸\95à¹\87มà¸\97ีà¹\88 (ที่ไม่ล็อกแบบสืบทอด)',
+'right-editinterface' => 'แก้ไขอินเตอร์เฟซผู้ใช้',
+'right-editusercssjs' => 'แก้ไขไฟล์ CSS และจาวาสคริปต์ของผู้ใช้อื่น',
+'right-editusercss' => 'แก้ไขไฟล์ CSS ของผู้ใช้อื่น',
+'right-edituserjs' => 'แก้ไขไฟล์จาวาสคริปต์ของผู้ใช้อื่น',
+'right-rollback' => 'ย้อนการแก้ไขของผู้ใช้ล่าสุดที่แก้ไขหน้าเฉพาะอย่างรวดเร็ว',
 'right-markbotedits' => 'ทำเครื่องหมายการย้อนว่าเป็นการแก้ไขโดยบอต',
-'right-noratelimit' => 'à¹\84มà¹\88มีà¸\9cลà¸\81ระà¸\97à¸\9aà¸\88าà¸\81à¸\81ารà¸\88ำà¸\81ัà¸\94สิà¸\97à¸\98ิà¸\95ามà¹\80วลา',
+'right-noratelimit' => 'à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aà¸\9cลà¸\81ระà¸\97à¸\9aà¸\88าà¸\81à¸\82ีà¸\94à¸\88ำà¸\81ัà¸\94อัà¸\95รา',
 'right-import' => 'นำเข้าหน้าจากวิกิอื่น',
 'right-importupload' => 'นำเข้าหน้าจากไฟล์ที่อัปโหลด',
 'right-patrol' => 'ทำเครื่องหมายการแก้ไขของผู้อื่นว่าตรวจสอบแล้ว',
-'right-autopatrol' => 'à¸\95ัà¹\89à¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\95à¸\99à¹\80อà¸\87วà¹\88าตรวจสอบแล้วอัตโนมัติ',
+'right-autopatrol' => 'à¹\83หà¹\89à¸\97ำà¹\80à¸\84รืà¹\88อà¸\87หมายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\95à¸\99à¹\80อà¸\87à¹\80à¸\9bà¹\87à¸\99ตรวจสอบแล้วอัตโนมัติ',
 'right-patrolmarks' => 'ดูการเปลี่ยนแปลงล่าสุดของการทำเครื่องหมายตรวจสอบ',
 'right-unwatchedpages' => 'ดูรายการหน้าที่ไม่มีผู้เฝ้าดู',
-'right-mergehistory' => 'รวมà¸\9bระวัà¸\95ิà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89า',
+'right-mergehistory' => 'รวมประวัติหน้า',
 'right-userrights' => 'แก้ไขสิทธิผู้ใช้ทั้งหมด',
 'right-userrights-interwiki' => 'แก้ไขสิทธิผู้ใช้ของผู้ใช้บนวิกิอื่น',
 'right-siteadmin' => 'ล็อกและปลดล็อกฐานข้อมูล',
@@ -1439,8 +1460,8 @@ $1",
 'right-passwordreset' => 'ดูอีเมลตั้งรหัสผ่านใหม่',
 
 # Special:Log/newusers
-'newuserlogpage' => 'à¸\9bูมà¸\81ารสรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89',
-'newuserlogpagetext' => 'à¸\99ีà¹\88à¸\84ือà¸\9bูมà¸\81ารสรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89',
+'newuserlogpage' => 'ปูมการสร้างผู้ใช้',
+'newuserlogpagetext' => 'นี่คือปูมการสร้างผู้ใช้',
 
 # User rights log
 'rightslog' => 'ปูมสิทธิผู้ใช้',
@@ -1452,7 +1473,7 @@ $1",
 'action-createpage' => 'สร้างหน้า',
 'action-createtalk' => 'สร้างหน้าอภิปราย',
 'action-createaccount' => 'สร้างบัญชีผู้ใช้นี้',
-'action-minoredit' => 'เป็นการแก้ไขเล็กน้อย',
+'action-minoredit' => 'à¸\97ำà¹\80à¸\84รืà¹\88อà¸\87หมายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80ลà¹\87à¸\81à¸\99à¹\89อย',
 'action-move' => 'ย้ายหน้านี้',
 'action-move-subpages' => 'ย้ายหน้านี้ รวมทั้งหน้าย่อย',
 'action-move-rootuserpages' => 'ย้ายหน้าผู้ใช้หลัก',
@@ -1467,18 +1488,19 @@ $1",
 'action-deletedhistory' => 'ดูประวัติที่ถูกลบของหน้านี้',
 'action-browsearchive' => 'ค้นหาหน้าที่ถูกลบ',
 'action-undelete' => 'กู้คืนหน้านี้',
-'action-suppressrevision' => 'à¸\95รวà¸\88à¸\94ูและกู้คืนรุ่นที่ซ่อนอยู่นี้',
-'action-suppressionlog' => 'ดูปูมส่วนตัว',
+'action-suppressrevision' => 'à¸\97à¸\9aà¸\97วà¸\99และกู้คืนรุ่นที่ซ่อนอยู่นี้',
+'action-suppressionlog' => 'ดูปูมส่วนตัวนี้',
 'action-block' => 'บล็อกผู้ใช้รายนี้มิให้แก้ไข',
 'action-protect' => 'เปลี่ยนระดับการล็อกสำหรับหน้านี้',
+'action-rollback' => 'ย้อนการแก้ไขของผู้ใช้ล่าสุดที่แก้ไขหน้าเฉพาะอย่างรวดเร็ว',
 'action-import' => 'นำเข้าหน้านี้จากวิกิอื่น',
-'action-importupload' => 'à¸\99ำà¹\80à¸\82à¹\89าหà¸\99à¹\89าà¸\99ีà¹\89à¸\88าà¸\81à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88อัà¸\9bà¹\82หลà¸\94à¹\81ลà¹\89ว',
-'action-patrol' => 'ทำเครื่องหมายการแก้ไขของผู้ใช้อื่นว่าตรวจแล้ว',
-'action-autopatrol' => 'ทำเครื่องหมายการแก้ไขของคุณว่าตรวจแล้ว',
+'action-importupload' => 'à¸\99ำà¹\80à¸\82à¹\89าหà¸\99à¹\89าà¸\99ีà¹\89à¸\88าà¸\81à¸\81ารอัà¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8c',
+'action-patrol' => 'à¸\97ำà¹\80à¸\84รืà¹\88อà¸\87หมายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89อืà¹\88à¸\99วà¹\88าà¸\95รวà¸\88สอà¸\9aà¹\81ลà¹\89ว',
+'action-autopatrol' => 'à¸\97ำà¹\80à¸\84รืà¹\88อà¸\87หมายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93วà¹\88าà¸\95รวà¸\88สอà¸\9aà¹\81ลà¹\89ว',
 'action-unwatchedpages' => 'ดูรายการหน้าที่ไม่มีผู้เฝ้าดู',
 'action-mergehistory' => 'รวมประวัติหน้านี้',
 'action-userrights' => 'แก้ไขสิทธิผู้ใช้ทั้งหมด',
-'action-userrights-interwiki' => 'à¹\81à¸\81à¹\89à¹\84à¸\82สิà¸\97à¸\98ิà¸\9cูà¹\89à¹\83à¸\8aà¹\89สำหรัà¸\9aวิà¸\81ิà¸\99ีà¹\89',
+'action-userrights-interwiki' => 'à¹\81à¸\81à¹\89à¹\84à¸\82สิà¸\97à¸\98ิà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\82อà¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\9aà¸\99วิà¸\81ิอืà¹\88à¸\99',
 'action-siteadmin' => 'ล็อกหรือปลดล็อกฐานข้อมูล',
 'action-sendemail' => 'ส่งอีเมล',
 
@@ -1486,15 +1508,15 @@ $1",
 'nchanges' => '$1 การแก้ไข',
 'recentchanges' => 'ปรับปรุงล่าสุด',
 'recentchanges-legend' => 'ตัวเลือกปรับปรุงล่าสุด',
-'recentchanges-summary' => 'à¹\83à¸\99หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารลà¹\88าสุà¸\94à¸\97ีà¹\88มีà¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87',
-'recentchanges-feed-description' => 'à¸\9fีà¸\94à¸\99ีà¹\89à¹\81สà¸\94à¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87ลà¹\88าสุà¸\94',
-'recentchanges-label-newpage' => 'à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99à¸\81ารสรà¹\89าà¸\87หà¸\99à¹\89าà¹\83หมà¹\88',
+'recentchanges-summary' => 'à¹\83à¸\99หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87ลà¹\88าสุà¸\94à¸\9aà¸\99วิà¸\81ิà¸\99ีà¹\89',
+'recentchanges-feed-description' => 'à¸\95ิà¸\94à¸\95ามà¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87ลà¹\88าสุà¸\94à¹\83à¸\99วิà¸\81ิà¸\99ีà¹\89à¹\83à¸\99à¸\9fีà¸\94à¸\99ีà¹\89',
+'recentchanges-label-newpage' => 'การแก้ไขนี้สร้างหน้าใหม่',
 'recentchanges-label-minor' => 'เป็นการแก้ไขเล็กน้อย',
 'recentchanges-label-bot' => 'การแก้ไขนี้กระทำโดยบอต',
 'recentchanges-label-unpatrolled' => 'การแก้ไขนี้ยังไม่ได้ตรวจสอบ',
 'rcnote' => "รายการด้านล่างคือการแก้ไข {{PLURAL:$1|'''1''' รายการ|ล่าสุด '''$1''' รายการ}} ในช่วง '''$2''' วันที่ผ่านมา จนถึง $5, $4",
-'rcnotefrom' => "à¹\81สà¸\94à¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88 '''$2''' (à¹\81สà¸\94à¸\87 '''$1''' รายการ)",
-'rclistfrom' => 'แสดงการเปลี่ยนแปลงตั้งแต่ $1',
+'rcnotefrom' => "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88 '''$2''' (มาà¸\81สุà¸\94 '''$1''' รายการ)",
+'rclistfrom' => 'à¹\81สà¸\94à¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\83หมà¹\88à¹\80ริà¹\88มà¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88 $1',
 'rcshowhideminor' => '$1การแก้ไขเล็กน้อย',
 'rcshowhidebots' => '$1บอต',
 'rcshowhideliu' => '$1ผู้ใช้ล็อกอิน',
@@ -1515,7 +1537,7 @@ $1",
 'rc_categories_any' => 'ใด ๆ',
 'rc-change-size-new' => '$1 ไบต์หลังปรับปรุง',
 'newsectionsummary' => '/* $1 */ หัวข้อใหม่',
-'rc-enhanced-expand' => 'à¹\81สà¸\94à¸\87รายละà¹\80อียà¸\94 (à¸\95à¹\89อà¸\87à¹\83à¸\8aà¹\89à¸\88าวาสà¸\84ริà¸\9bà¸\95à¹\8c)',
+'rc-enhanced-expand' => 'แสดงรายละเอียด (จาวาสคริปต์)',
 'rc-enhanced-hide' => 'ซ่อนรายละเอียด',
 'rc-old-title' => 'เดิมถูกสร้างในชื่อ "$1"',
 
@@ -1525,7 +1547,7 @@ $1",
 'recentchangeslinked-toolbox' => 'การปรับปรุงที่เกี่ยวโยง',
 'recentchangeslinked-title' => 'การปรับปรุงที่โยงมายัง "$1"',
 'recentchangeslinked-noresult' => 'ไม่มีการเปลี่ยนแปลงในหน้าที่ถูกโยงไป ในช่วงเวลาที่กำหนด',
-'recentchangeslinked-summary' => "หà¸\99à¹\89าà¸\99ีà¹\89à¹\81สà¸\94à¸\87รายการปรับปรุงล่าสุดของหน้าที่ถูกโยงไป (หรือไปยังหน้าต่าง ๆ ของหมวดหมู่ที่กำหนด) โดยหน้าที่อยู่ใน[[Special:Watchlist|รายการเฝ้าดู]]แสดงเป็น'''ตัวหนา'''",
+'recentchangeslinked-summary' => "หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99รายการปรับปรุงล่าสุดของหน้าที่ถูกโยงไป (หรือไปยังหน้าต่าง ๆ ของหมวดหมู่ที่กำหนด) โดยหน้าที่อยู่ใน[[Special:Watchlist|รายการเฝ้าดู]]แสดงเป็น'''ตัวหนา'''",
 'recentchangeslinked-page' => 'ชื่อหน้า:',
 'recentchangeslinked-to' => 'แสดงการเปลี่ยนแปลงที่เชื่อมโยงมายังหน้านี้แทน',
 
@@ -1533,52 +1555,53 @@ $1",
 'upload' => 'อัปโหลดไฟล์',
 'uploadbtn' => 'อัปโหลดไฟล์',
 'reuploaddesc' => 'ยกเลิกการอัปโหลดและกลับไปยังแบบอัปโหลด',
-'upload-tryagain' => 'สà¹\88à¸\87à¸\84ำอà¸\98ิà¸\9aายà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\9bรัà¸\9aà¹\81à¸\95à¹\88à¸\87แล้ว',
+'upload-tryagain' => 'สà¹\88à¸\87à¸\84ำอà¸\98ิà¸\9aายà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\94ัà¸\94à¹\81à¸\9bรแล้ว',
 'uploadnologin' => 'ไม่ได้ล็อกอิน',
 'uploadnologintext' => 'ต้อง[[Special:UserLogin|ล็อกอิน]]ก่อนจึงจะอัปโหลดไฟล์ได้',
 'upload_directory_missing' => 'ไดเรกทอรีสำหรับอัปโหลด ($1) หายไป และเว็บเซิร์ฟเวอร์ไม่สามารถสร้างได้',
-'upload_directory_read_only' => 'à¹\84มà¹\88สามารà¸\96à¹\80à¸\81à¹\87à¸\9aà¸\82à¹\89อมูลà¹\83à¸\99à¹\84à¸\94à¹\80รà¸\81à¸\97อรี ($1) à¸\9bัà¸\8dหาà¹\80à¸\81ิà¸\94à¸\97ีà¹\88à¹\80วà¹\87à¸\9aà¹\80à¸\8bิรà¹\8cà¸\9fà¹\80วอรà¹\8c',
-'uploaderror' => 'à¸\81ารอัà¸\9bà¹\82หลà¸\94à¹\80à¸\81ิà¸\94à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94',
+'upload_directory_read_only' => 'à¹\80วà¹\87à¸\9aà¹\80à¸\8bิรà¹\8cà¸\9fà¹\80วอรà¹\8cà¹\84มà¹\88สามารà¸\96à¹\80à¸\81à¹\87à¸\9aà¸\82à¹\89อมูลà¹\83à¸\99à¹\84à¸\94à¹\80รà¸\81à¸\97อรี ($1)',
+'uploaderror' => 'การอัปโหลดผิดพลาด',
 'upload-recreate-warning' => "'''คำเตือน: ไฟล์ชื่อนั้นถูกลบหรือเปลี่ยนชื่อแล้ว'''
 
 ปูมการลบและปูมการย้ายของหน้านี้ถูกนำมาไว้ด้านล่างเพื่อความสะดวก:",
 'uploadtext' => "กรุณาใช้แบบด้านล่างในการอัปโหลดไฟล์
-สำหรัà¸\9aà¸\81ารà¸\94ูหรือà¸\81ารà¸\84à¹\89à¸\99หาà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¹\80à¸\84ยอัà¸\9bà¹\82หลà¸\94à¸\81à¹\88อà¸\99หà¸\99à¹\89าà¸\99ีà¹\89 à¹\83หà¹\89à¹\84à¸\9bà¸\97ีà¹\88[[Special:FileList|รายà¸\8aืà¹\88อไฟล์ที่ถูกอัปโหลด]] การอัปโหลดและการอัปโหลดซ้ำดูได้ที่[[Special:Log/upload|ปูมการอัปโหลด]] และการลบไฟล์ดูได้ที่[[Special:Log/delete|ปูมการลบ]]
+สำหรัà¸\9aà¸\81ารà¸\94ูหรือà¸\81ารà¸\84à¹\89à¸\99หาà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¹\80à¸\84ยอัà¸\9bà¹\82หลà¸\94à¸\81à¹\88อà¸\99หà¸\99à¹\89าà¸\99ีà¹\89 à¹\83หà¹\89à¹\84à¸\9bà¸\97ีà¹\88[[Special:FileList|รายà¸\81ารไฟล์ที่ถูกอัปโหลด]] การอัปโหลดและการอัปโหลดซ้ำดูได้ที่[[Special:Log/upload|ปูมการอัปโหลด]] และการลบไฟล์ดูได้ที่[[Special:Log/delete|ปูมการลบ]]
 
 ถ้าต้องการแทรกไฟล์ลงในหน้าหนึ่ง ๆ ให้ใช้คำสั่งหนึ่งในรูปแบบต่อไปนี้
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' เพื่อใช้รูปขนาดเต็ม
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|ข้อความอธิบาย]]</nowiki></code>''' เพื่อใช้รูปย่อขนาดกว้าง 200 พิกเซลในกล่องที่จัดชิดซ้าย โดยมี \"ข้อความอธิบาย\" เป็นคำบรรยายใต้ภาพ
 * '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' สำหรับการเชื่อมโยงไฟล์โดยตรง โดยไม่ปรากฏไฟล์นั้นออกมา",
-'upload-permitted' => 'à¸\8aà¸\99ิà¸\94à¸\82อà¸\87à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88อà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\83à¸\8aà¹\89à¹\84à¸\94à¹\89: $1',
-'upload-preferred' => 'à¸\8aà¸\99ิà¸\94à¸\82อà¸\87à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\84วรà¹\83à¸\8aà¹\89: $1',
-'upload-prohibited' => 'à¸\8aà¸\99ิà¸\94à¸\82อà¸\87à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¹\84มà¹\88อà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\83à¸\8aà¹\89: $1',
+'upload-permitted' => 'à¸\8aà¸\99ิà¸\94à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88อà¸\99ุà¸\8dาà¸\95: $1',
+'upload-preferred' => 'ชนิดไฟล์ที่ควรใช้: $1',
+'upload-prohibited' => 'à¸\8aà¸\99ิà¸\94à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¹\84มà¹\88อà¸\99ุà¸\8dาà¸\95: $1',
 'uploadlog' => 'ปูมการอัปโหลด',
 'uploadlogpage' => 'ปูมการอัปโหลด',
-'uploadlogpagetext' => 'รายการแสดงไฟล์ที่อัปโหลดล่าสุด',
+'uploadlogpagetext' => 'ด้านล่างเป็นรายการการอัปโหลดไฟล์ล่าสุด
+ดูภาพรวมที่ [[Special:NewFiles|แกลอรีไฟล์ใหม่]]',
 'filename' => 'ชื่อไฟล์',
 'filedesc' => 'รายละเอียดไฟล์',
 'fileuploadsummary' => 'รายละเอียดไฟล์:',
-'filereuploadsummary' => 'à¹\84à¸\9fลà¹\8cà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87:',
+'filereuploadsummary' => 'à¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\84à¸\9fลà¹\8c:',
 'filestatus' => 'สถานะลิขสิทธิ์:',
 'filesource' => 'แหล่งที่มา:',
 'uploadedfiles' => 'ไฟล์ที่อัปโหลดแล้ว',
 'ignorewarning' => 'บันทึกไฟล์โดยละเลยคำเตือน',
-'ignorewarnings' => 'à¹\84มà¹\88à¹\81สà¸\94à¸\87à¸\84ำà¹\80à¸\95ือà¸\99',
+'ignorewarnings' => 'ละà¹\80ลยà¸\84ำà¹\80à¸\95ือà¸\99à¸\97ัà¹\89à¸\87หมà¸\94',
 'minlength1' => 'ชื่อไฟล์ต้องมีตัวอักษรอย่างน้อยหนึ่งตัว',
-'illegalfilename' => 'à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8c  "$1" à¸¡à¸µà¸\95ัวอัà¸\81ษรà¸\97ีà¹\88à¹\84มà¹\88อà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¸\9bราà¸\81à¸\8fà¹\83à¸\99à¸\8aืà¹\88อ à¸\81รุà¸\93าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¹\81ละอัปโหลดอีกครั้ง',
+'illegalfilename' => 'à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8c  "$1" à¸¡à¸µà¸­à¸±à¸\81à¸\82ระà¸\97ีà¹\88à¹\84มà¹\88อà¸\99ุà¸\8dาà¸\95à¹\83à¸\99à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87หà¸\99à¹\89า à¸\81รุà¸\93าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¹\81ละลอà¸\87อัปโหลดอีกครั้ง',
 'filename-toolong' => 'ชื่อไฟล์ไม่อาจยาวกว่า 240 ไบต์',
 'badfilename' => 'ชื่อไฟล์ถูกเปลี่ยนเป็น "$1"',
-'filetype-mime-mismatch' => 'นามสกุลไฟล์ ".$1" ไม่ตรงกับชนิด MIME ของแฟ้มที่ตรวจพบ ($2)',
+'filetype-mime-mismatch' => 'นามสกุลไฟล์ ".$1" ไม่ตรงกับชนิดไมม์ของไฟล์ที่ตรวจพบ ($2)',
 'filetype-badmime' => 'ไม่อนุญาตให้อัปโหลดไฟล์ที่เป็นไมม์ชนิด "$1"',
-'filetype-bad-ie-mime' => 'ไม่สามารถอัปโหลดไฟล์นี้เนื่องจาก Internet Explorer จะตรวจจับว่าเป็น "$1" ซึ่งเป็นชนิดไฟล์ที่ไม่อนุญาตและอาจเป็นอันตราย',
+'filetype-bad-ie-mime' => 'ไม่สามารถอัปโหลดไฟล์นี้เนื่องจากอินเทอร์เน็ตเอกซ์พลอเรอร์จะตรวจจับว่าเป็น "$1" ซึ่งเป็นชนิดไฟล์ที่ไม่อนุญาตและอาจเป็นอันตราย',
 'filetype-unwanted-type' => "{{PLURAL:\$3|ไฟล์|ไฟล์}}ชนิด '''\".\$1\"''' เป็นไฟล์ที่ไม่สามารถอัปโหลดได้ ไฟล์ที่สามารถใช้ได้ ได้แก่ \$2",
 'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL: $4|เป็นชนิดไฟล์ที่ไม่อนุญาต|เป็นชนิดไฟล์ที่ไม่อนุญาต}}
-{{PLURAL: $3|ชนิดไฟล์|ชนิดไฟล์}}ที่อนุญาตคือ $2',
+{{PLURAL:$3|ชนิดไฟล์|ชนิดไฟล์}}ที่อนุญาตคือ $2',
 'filetype-missing' => 'นามสกุลไฟล์หายไป (เช่น ".jpg")',
-'empty-file' => 'à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\84ุà¸\93สà¹\88à¸\87มาà¸\99ัà¹\89à¸\99à¹\84มà¹\88มีà¸\82à¹\89อมูล',
+'empty-file' => 'à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\84ุà¸\93สà¹\88à¸\87มาà¸\99ัà¹\89à¸\99วà¹\88าà¸\87',
 'file-too-large' => 'ไฟล์ที่คุณส่งมามีขนาดใหญ่เกินไป',
 'filename-tooshort' => 'ชื่อไฟล์สั้นเกินไป',
-'filetype-banned' => 'à¹\84à¸\9fลà¹\8cà¸\9bระà¹\80ภà¸\97นี้ถูกห้าม',
+'filetype-banned' => 'à¹\84à¸\9fลà¹\8cà¸\8aà¸\99ิà¸\94นี้ถูกห้าม',
 'verification-error' => 'ไฟล์นี้ไม่ผ่านการพิสูจน์ยืนยันไฟล์',
 'hookaborted' => 'สิ่งที่คุณพยายามปรับเปลี่ยนถูกยกเลิกโดยส่วนขยาย',
 'illegal-filename' => 'ชื่อไฟล์นี้ไม่ได้รับอนุญาต',
@@ -1586,57 +1609,58 @@ $1",
 'unknown-error' => 'เกิดข้อผิดพลาดไม่ทราบสาเหตุ',
 'tmp-create-error' => 'ไม่สามารถสร้างไฟล์ชั่วคราว',
 'tmp-write-error' => 'เกิดข้อผิดพลาดในการเขียนไฟล์ชั่วคราว',
-'large-file' => 'ไฟล์ไม่ควรมีขนาดใหญ่กว่า $1 ไฟล์นี้มีขนาด $2',
-'largefileserver' => 'à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มีà¸\82à¸\99าà¸\94à¹\83หà¸\8dà¹\88à¸\81วà¹\88าà¸\84à¹\88าà¸\97ีà¹\88อà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\83à¸\8aà¹\89à¹\84à¸\94à¹\89',
-'emptyfile' => 'à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88อัà¸\9bà¹\82หลà¸\94มาà¹\80หมือà¸\99à¹\84à¸\9fลà¹\8cวà¹\88าà¸\87 à¸­à¸²à¸\88à¹\80à¸\81ิà¸\94à¸\88าà¸\81à¸\9bัà¸\8dหาà¸\9eิมà¸\9eà¹\8cà¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¸\9cิà¸\94 à¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9aà¹\84à¸\9fลà¹\8cอีà¸\81à¸\84รัà¹\89à¸\87 à¹\81ละà¹\81à¸\99à¹\88à¹\83à¸\88วà¹\88าà¸\95à¹\89อà¸\87à¸\81ารà¸\97ีà¹\88à¸\88ะอัà¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89',
-'windows-nonascii-filename' => 'วิà¸\81ิà¸\99ีà¹\89à¹\84มà¹\88รอà¸\87รัà¸\9aà¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88มีà¸\95ัวอัà¸\81ษรพิเศษ',
+'large-file' => 'à¹\81à¸\99ะà¸\99ำวà¹\88าà¹\84à¸\9fลà¹\8cà¹\84มà¹\88à¸\84วรมีà¸\82à¸\99าà¸\94à¹\83หà¸\8dà¹\88à¸\81วà¹\88า $1 à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มีà¸\82à¸\99าà¸\94 $2',
+'largefileserver' => 'à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มีà¸\82à¸\99าà¸\94à¹\83หà¸\8dà¹\88à¸\81วà¹\88าà¸\97ีà¹\88à¹\80à¸\8bิรà¹\8cà¸\9fà¹\80วอรà¹\8cอà¸\99ุà¸\8dาà¸\95',
+'emptyfile' => 'à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\84ุà¸\93อัà¸\9bà¹\82หลà¸\94à¹\80หมือà¸\99à¹\80à¸\9bà¹\87à¸\99à¹\84à¸\9fลà¹\8cวà¹\88าà¸\87 à¸­à¸²à¸\88à¹\80à¸\81ิà¸\94à¸\88าà¸\81à¸\9bัà¸\8dหาà¸\9eิมà¸\9eà¹\8cà¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¸\9cิà¸\94 à¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9aวà¹\88า à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารอัà¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¸\88ริà¸\87 à¹\86',
+'windows-nonascii-filename' => 'วิà¸\81ิà¸\99ีà¹\89à¹\84มà¹\88รอà¸\87รัà¸\9aà¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88มีอัà¸\81à¸\82ระพิเศษ',
 'fileexists' => 'มีไฟล์ชื่อนี้อยู่แล้ว กรุณาตรวจสอบ <strong>[[:$1]]</strong> หากคุณไม่แน่ใจว่าต้องการเปลี่ยนแปลงไฟล์นี้หรือไม่ [[$1|thumb]]',
-'filepageexists' => 'หà¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aายสำหรัà¸\9aà¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¹\84à¸\94à¹\89à¸\96ูà¸\81สรà¹\89าà¸\87à¹\84วà¹\89à¹\81ลà¹\89วà¸\97ีà¹\88 <strong>[[:$1]]</strong> à¹\81à¸\95à¹\88à¹\84à¸\9fลà¹\8cà¸\8aืà¹\88อà¸\99ีà¹\89à¹\84มà¹\88มีอยูà¹\88à¹\83à¸\99à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99
-สาระสำà¸\84ัà¸\8dà¸\97ีà¹\88à¸\84ุà¸\93à¸\9aัà¸\99à¸\97ึกจะไม่ปรากฏบนหน้าคำอธิบาย
-à¹\80à¸\9eืà¹\88อà¹\83หà¹\89สาระสำà¸\84ัà¸\8dปรากฏขึ้น คุณจำเป็นต้องแก้ไขด้วยตนเอง
+'filepageexists' => 'หน้าคำอธิบายสำหรับไฟล์นี้ได้ถูกสร้างแล้วที่ <strong>[[:$1]]</strong> แต่ไฟล์ชื่อนี้ไม่มีอยู่ในปัจจุบัน
+à¸\84ำอà¸\98ิà¸\9aายอยà¹\88าà¸\87ยà¹\88อà¸\97ีà¹\88à¸\84ุà¸\93à¸\81รอกจะไม่ปรากฏบนหน้าคำอธิบาย
+à¹\80à¸\9eืà¹\88อà¹\83หà¹\89à¸\84ำอà¸\98ิà¸\9aายอยà¹\88าà¸\87ยà¹\88อปรากฏขึ้น คุณจำเป็นต้องแก้ไขด้วยตนเอง
 [[$1|thumb]]',
-'fileexists-extension' => 'à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¹\82หลà¸\94มีà¸\8aืà¹\88อà¹\83à¸\81ลà¹\89à¹\80à¸\84ียà¸\87: [[$2|thumb]]
+'fileexists-extension' => 'มีà¹\84à¸\9fลà¹\8cà¸\8aืà¹\88อà¸\84ลà¹\89ายà¸\81ัà¸\99: [[$2|thumb]]
 * ชื่อไฟล์ที่กำลังอัปโหลด: <strong>[[:$1]]</strong>
-* ชื่อไฟล์ที่มีอยู่แล้ว: <strong>[[:$2]]</strong>
-à¸\81รุà¸\93าà¹\80ลือà¸\81à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¹\83หมà¹\88',
-'fileexists-thumbnail-yes' => "ไฟล์นี้ดูเหมือนจะเป็นภาพที่ถูกลดขนาดมา ''(รูปย่อ)''
+* ชื่อไฟล์ที่มีอยู่: <strong>[[:$2]]</strong>
+à¸\81รุà¸\93าà¹\80ลือà¸\81à¸\8aืà¹\88ออืà¹\88à¸\99',
+'fileexists-thumbnail-yes' => "ไฟล์นี้ดูเหมือนจะเป็นภาพที่ถูกลดขนาด ''(รูปย่อ)''
 [[$1|thumb]]
 กรุณาตรวจสอบไฟล์ <strong>[[:$1]]</strong>
-à¸\96à¹\89าà¸\95รวà¸\88สอà¸\9aà¹\81ลà¹\89วà¹\81ละà¸\9eà¸\9aวà¹\88าà¹\80à¸\9bà¹\87à¸\99ภาà¸\9eà¹\80à¸\94ียวà¸\81ัà¸\99à¸\81ัà¸\9aภาà¸\9eต้นฉบับ ไฟล์นั้นไม่จำเป็นต้องอัปโหลดเพิ่ม",
+à¸\96à¹\89าà¸\95รวà¸\88สอà¸\9aà¹\81ลà¹\89วà¹\81ละà¸\9eà¸\9aวà¹\88าà¹\80à¸\9bà¹\87à¸\99ภาà¸\9eà¸\82à¸\99าà¸\94à¹\80à¸\94ียวà¸\81ัà¸\9aต้นฉบับ ไฟล์นั้นไม่จำเป็นต้องอัปโหลดเพิ่ม",
 'file-thumbnail-no' => "ชื่อไฟล์ขึ้นต้นด้วย <strong>$1</strong>
-ภาพนี้ดูเหมือนว่าจะเป็นภาพที่ถูกลดขนาดมา ''(thumbnail)''
-ถ้าคุณมีไฟล์ต้นฉบับขนาดใหญ่กว่านี้ กรุณาอัปโหลดไฟล์ต้นฉบับ หรือเปลี่ยนชื่อไฟล์ด้วย",
-'fileexists-forbidden' => 'ไฟล์ชื่อนี้มีอยู่แล้วในระบบ และไม่สามารถอัปโหลดทับได้
-หากคุณยังคงต้องการอัปโหลดไฟล์ของคุณ กรุณาย้อนกลับและใช้ชื่อใหม่ [[ไฟล์:$1|thumb|center|$1]]',
+ภาพนี้ดูเหมือนว่าจะเป็นภาพที่ถูกลดขนาด ''(thumbnail)''
+ถ้าคุณมีภาพนี้ในความละเอียดเต็ม ให้อัปโหลดภาพนี้ มิฉะนั้นแล้วโปรดเปลี่ยนชื่อไฟล์",
+'fileexists-forbidden' => 'มีไฟล์ชื่อนี้แล้ว และไม่สามารถเขียนทับได้
+หากคุณยังต้องการอัปโหลดไฟล์ของคุณ กรุณาย้อนกลับและใช้ชื่อใหม่ 
+[[ไฟล์:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'ไฟล์ที่ใช้ชื่อนี้มีอยู่แล้วในระบบเก็บไฟล์ในส่วนกลาง
 ถ้าคุณยังคงต้องการอัปโหลดไฟล์ของคุณ กรุณาย้อนกลับไปตั้งชื่อใหม่
 [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'ไฟล์นี้ซ้ำกับ{{PLURAL:$1|ไฟล์|ไฟล์}}ต่อไปนี้:',
-'file-deleted-duplicate' => 'à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\95รà¸\87à¸\81ัà¸\9aà¸\8aืà¹\88อà¸\99ีà¹\89 ([[:$1]]) à¹\80à¸\84ยà¸\96ูà¸\81ลà¸\9aà¹\84à¸\9bà¸\81à¹\88อà¸\99หà¸\99à¹\89า
+'file-deleted-duplicate' => 'à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¹\80หมือà¹\84à¸\9fลà¹\8cà¸\99ีà¹\89 ([[:$1]]) à¹\80à¸\84ยà¸\96ูà¸\81ลà¸\9aà¹\84à¸\9bà¸\81à¹\88อà¸\99หà¸\99à¹\89าà¸\99ีà¹\89à¹\81ลà¹\89ว
 คุณควรตรวจสอบว่าประวัติการลบของไฟล์ก่อนดำเนินการอัปโหลดใหม่',
 'uploadwarning' => 'คำเตือนการอัปโหลด',
 'uploadwarning-text' => 'กรุณาแก้ไขคำอธิบายไฟล์ด้านล่างนี้ แล้วลองใหม่อีกครั้ง',
 'savefile' => 'บันทึกไฟล์',
 'uploadedimage' => 'อัปโหลด "[[$1]]"',
 'overwroteimage' => 'อัปโหลดรุ่นใหม่ของ "[[$1]]"',
-'uploaddisabled' => 'à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99อัปโหลด',
-'copyuploaddisabled' => 'à¸\81ารอัà¸\9bà¹\82หลà¸\94à¹\82à¸\94ย URL à¹\84à¸\94à¹\89à¸\96ูà¸\81à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\84วà¹\89',
-'uploadfromurl-queued' => 'à¸\81ารอัà¸\9eà¹\82หลà¸\94à¸\82อà¸\87à¸\84ุà¸\93à¹\84à¸\94à¹\89à¸\96ูà¸\81à¸\88ัà¸\94à¹\83à¸\99คิวแล้ว',
-'uploaddisabledtext' => 'à¸\81ารอัà¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8cà¸\96ูà¸\81à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99',
-'php-uploaddisabledtext' => 'à¸\81ารอัà¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8cà¸\96ูà¸\81à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\83à¸\99 PHP
+'uploaddisabled' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารอัปโหลด',
+'copyuploaddisabled' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารอัà¸\9bà¹\82หลà¸\94à¹\82à¸\94ยยูอารà¹\8cà¹\81อล',
+'uploadfromurl-queued' => 'à¸\81ารอัà¸\9bà¹\82หลà¸\94à¸\82อà¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¸\88ัà¸\94คิวแล้ว',
+'uploaddisabledtext' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารอัà¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8c',
+'php-uploaddisabledtext' => 'à¹\80à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารอัà¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8cà¹\83à¸\99à¸\9eีà¹\80อà¸\8aà¸\9eี
 กรุณาตรวจสอบการตั้งค่า file_uploads',
 'uploadscripted' => 'ไฟล์นี้มีส่วนประกอบของโค้ดเอชทีเอ็มแอลหรือสคริปต์ ซึ่งอาจก่อให้เกิดความผิดพลาดในการแสดงผลของเว็บเบราว์เซอร์',
 'uploadvirus' => 'ไฟล์นี้มีไวรัส! รายละเอียด: $1',
 'upload-source' => 'ไฟล์ต้นทาง',
 'sourcefilename' => 'ชื่อไฟล์ต้นทาง:',
-'sourceurl' => 'URL ที่มา:',
-'destfilename' => 'à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\95à¹\89อà¸\87à¸\81าร:',
+'sourceurl' => 'ยูอาร์แอลที่มา:',
+'destfilename' => 'à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¸\9bลายà¸\97าà¸\87:',
 'upload-maxfilesize' => 'ขนาดไฟล์ที่ใหญ่ที่สุดที่อนุญาต: $1',
 'upload-description' => 'คำอธิบายไฟล์',
 'upload-options' => 'ตัวเลือกอัปโหลด',
 'watchthisupload' => 'เฝ้าดูไฟล์นี้',
-'filewasdeleted' => 'à¹\84à¸\9fลà¹\8cà¹\83à¸\99à¸\8aืà¹\88อà¸\99ีà¹\89à¹\84à¸\94à¹\89à¸\96ูà¸\81อัà¸\9bà¹\82หลà¸\94à¸\81à¹\88อà¸\99หà¸\99à¹\89าà¹\81ละà¸\96ูà¸\81ลà¸\9aà¹\84à¸\9bà¹\81ลà¹\89ว à¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9a $1 à¸\81à¹\88อà¸\99à¸\97ีà¹\88à¸\88ะอัà¸\9bà¹\82หลà¸\94à¹\83หมà¹\88อีกครั้ง',
-'filename-bad-prefix' => "à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\84ุà¸\93à¸\81ำลัà¸\87à¸\88ะอัà¸\9bà¹\82หลà¸\94à¹\80à¸\82à¹\89ามาà¸\99ีà¹\89มีà¸\8aืà¹\88อà¸\97ีà¹\88à¸\82ึà¹\89à¸\99à¸\95à¹\89à¸\99à¸\94à¹\89วย '''\"\$1\"''' à¸\8bึà¹\88à¸\87à¹\80à¸\9bà¹\87à¸\99à¸\8aืà¹\88อà¸\97ีà¹\88à¹\84มà¹\88สืà¹\88อà¸\84วามหมายà¹\83à¸\94 à¹\86 à¸\97ีà¹\88à¹\82à¸\94ยà¸\9bà¸\81à¸\95ิà¹\81ลà¹\89วà¸\8aืà¹\88อà¸\99ีà¹\89à¸\88ะà¸\96ูà¸\81à¸\95ัà¹\89à¸\87à¹\82à¸\94ยà¸\81ลà¹\89อà¸\87à¸\96à¹\88ายรูà¸\9bà¸\94ิà¸\88ิà¸\97ัลอัà¸\95à¹\82à¸\99มัà¸\95ิ à¸\81รุà¸\93าà¸\95ัà¹\89à¸\87à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¹\83หมà¹\88à¸\97ีà¹\88สื่อความหมายกว่าเดิม",
+'filewasdeleted' => 'à¹\84à¸\9fลà¹\8cà¸\8aืà¹\88อà¸\99ีà¹\89à¸\96ูà¸\81อัà¸\9bà¹\82หลà¸\94à¸\81à¹\88อà¸\99หà¸\99à¹\89าà¹\81ละà¸\96ูà¸\81ลà¸\9aà¹\84à¸\9bà¹\81ลà¹\89ว à¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9a $1 à¸\81à¹\88อà¸\99อัà¸\9bà¹\82หลà¸\94อีกครั้ง',
+'filename-bad-prefix' => "à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\84ุà¸\93à¸\81ำลัà¸\87อัà¸\9bà¹\82หลà¸\94à¸\82à¹\89à¸\99à¸\95à¹\89à¸\99à¸\94à¹\89วย '''\"\$1\"''' à¸\8bึà¹\88à¸\87à¹\80à¸\9bà¹\87à¸\99à¸\8aืà¹\88อà¸\97ีà¹\88à¹\84มà¹\88สืà¹\88อà¸\84วามหมายà¹\83à¸\94 à¹\86 à¸\97ีà¹\88à¹\82à¸\94ยà¸\9bà¸\81à¸\95ิà¹\81ลà¹\89วà¸\81ลà¹\89อà¸\87à¸\96à¹\88ายรูà¸\9bà¸\94ิà¸\88ิà¸\97ัลà¸\95ัà¹\89à¸\87à¹\83หà¹\89อัà¸\95à¹\82à¸\99มัà¸\95ิ à¸\81รุà¸\93าà¸\95ัà¹\89à¸\87à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¹\83หมà¹\88à¹\83หà¹\89สื่อความหมายกว่าเดิม",
 'upload-success-subj' => 'อัปโหลดสำเร็จ',
 'upload-success-msg' => 'การอัปโหลดของคุณจาก [$2] สำเร็จแล้ว และสามารถใช้ไฟล์ได้ที่นี่: [[:{{ns:file}}:$1]]',
 'upload-failure-subj' => 'ปัญหาการอัปโหลด',
@@ -1644,21 +1668,22 @@ $1",
 
 $1',
 'upload-warning-subj' => 'คำเตือนการอัปโหลด',
-'upload-warning-msg' => 'à¸\9eà¸\9aà¸\9bัà¸\8dหาà¸\81ารอัà¸\9bà¹\82หลà¸\94à¸\82อà¸\87à¸\84ุà¸\93à¸\88าà¸\81 [$2] à¸\84ุà¸\93อาà¸\88à¸\81ลัà¸\9aà¹\84à¸\9bยัà¸\87[[Special:Upload/stash/$1|à¸\9fอรà¹\8cมอัปโหลด]]เพื่อแก้ไขปัญหานี้',
+'upload-warning-msg' => 'à¸\9eà¸\9aà¸\9bัà¸\8dหาà¸\81ารอัà¸\9bà¹\82หลà¸\94à¸\82อà¸\87à¸\84ุà¸\93à¸\88าà¸\81 [$2] à¸\84ุà¸\93อาà¸\88à¸\81ลัà¸\9aà¹\84à¸\9bยัà¸\87[[Special:Upload/stash/$1|à¹\81à¸\9aà¸\9aอัปโหลด]]เพื่อแก้ไขปัญหานี้',
 
 'upload-proto-error' => 'โพรโทคอลไม่ถูกต้อง',
 'upload-proto-error-text' => 'การอัปโหลดโดยตรงจากเว็บต้องการยูอาร์แอลที่ขึ้นต้นด้วย <code>http://</code> หรือ <code>ftp://</code>',
 'upload-file-error' => 'เกิดความผิดพลาดภายใน',
-'upload-file-error-text' => 'เกิดความผิดพลาดภายใน จากปัญหาการสร้างไฟล์ชั่วคราวที่เซิร์ฟเวอร์ กรุณาติดต่อ[[Special:ListUsers/sysop|ผู้ดูแลระบบ]]',
-'upload-misc-error' => 'à¹\80à¸\81ิà¸\94à¸\9bัà¸\8dหาอัà¸\9bà¹\82หลà¸\94',
-'upload-misc-error-text' => 'à¹\80à¸\81ิà¸\94à¸\9bัà¸\8dหาระหวà¹\88าà¸\87à¸\81ารอัà¸\9bà¹\82หลà¸\94 à¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9aวà¹\88ายูอารà¹\8cà¹\81อลà¸\99ัà¹\89à¸\99à¸\96ูà¸\81à¸\95à¹\89อà¸\87 à¸\96à¹\89ายัà¸\87à¸\84à¸\87มีà¸\9bัà¸\8dหาà¹\83หà¹\89à¸\95ิà¸\94à¸\95à¹\88อà¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9a',
-'upload-too-many-redirects' => 'URL ที่ระบุมีการเปลี่ยนทางมากเกินไป',
+'upload-file-error-text' => 'เกิดความผิดพลาดภายในขณะพยายามสร้างไฟล์ชั่วคราวบนเซิร์ฟเวอร์ กรุณาติดต่อ[[Special:ListUsers/sysop|ผู้ดูแลระบบ]]',
+'upload-misc-error' => 'à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารอัà¸\9bà¹\82หลà¸\94à¹\82à¸\94ยà¹\84มà¹\88à¸\97ราà¸\9aสาà¹\80หà¸\95ุ',
+'upload-misc-error-text' => 'à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\84มà¹\88à¸\97ราà¸\9aสาà¹\80หà¸\95ุระหวà¹\88าà¸\87อัà¸\9bà¹\82หลà¸\94 à¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9aวà¹\88ายูอารà¹\8cà¹\81อลà¸\99ัà¹\89à¸\99à¸\96ูà¸\81à¸\95à¹\89อà¸\87à¹\81ละà¹\80à¸\82à¹\89าà¸\96ึà¸\87à¹\84à¸\94à¹\89 à¹\81ละลอà¸\87อีà¸\81à¸\84รัà¹\89à¸\87 à¸\96à¹\89ายัà¸\87มีà¸\9bัà¸\8dหา à¹\83หà¹\89à¸\95ิà¸\94à¸\95à¹\88อ[[Special:ListUsers/sysop|à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9a]]',
+'upload-too-many-redirects' => 'ยูอาร์แอลที่ระบุมีการเปลี่ยนทางมากเกินไป',
 'upload-unknown-size' => 'ไม่ทราบขนาด',
-'upload-http-error' => 'เกิดข้อผิดพลาด HTTP: $1',
+'upload-http-error' => 'เกิดข้อผิดพลาดเอชทีทีพี: $1',
+'upload-copy-upload-invalid-domain' => 'การอัปโหลดสำเนาไม่สามารถทำได้จากโดเมนนี้',
 
 # File backend
 'backend-fail-backup' => 'ไม่สามารถสำรองข้อมูลไฟล์ $1.',
-'backend-fail-notexists' => 'à¹\84มà¹\88à¸\9eà¸\9aà¹\84à¸\9fลà¹\8c $1 à¸\97ีà¹\88à¸\95à¹\89อà¸\87à¸\81าร',
+'backend-fail-notexists' => 'à¹\84มà¹\88มีà¹\84à¸\9fลà¹\8c $1',
 'backend-fail-delete' => 'ไม่สามารถลบไฟล์ $1 ได้',
 'backend-fail-alreadyexists' => 'มีไฟล์ "$1" อยู่แล้ว',
 'backend-fail-store' => 'ไม่สามารถเก็บไฟล์ "$1" ที่ "$2" ได้',
@@ -1689,9 +1714,9 @@ $1',
 เซิร์ฟเวอร์ของคุณอาจไม่ได้ถูกตั้งให้ส่งข้อมูลนี้
 หรือเซิร์ฟเวอร์อาจเป็นแบบ CGI-based และไม่สนับสนุนข้อมูล img_auth
 ดูที่ https://www.mediawiki.org/wiki/Manual:Image_Authorization',
-'img-auth-notindir' => 'à¸\97ีà¹\88อยูà¹\88à¸\97ีà¹\88รà¹\89อà¸\87à¸\82อà¹\84มà¹\88à¹\84à¸\94à¹\89อยูà¹\88à¹\83à¸\99à¹\84à¸\94à¹\80รà¹\87à¸\81à¸\97อรีอัà¸\9eà¹\82หลà¸\94à¸\97ีà¹\88à¸\81ำหà¸\99à¸\94à¹\84à¹\89วà¹\89',
+'img-auth-notindir' => 'ที่อยู่ที่ร้องขอไม่ได้อยู่ในไดเร็กทอรีอัพโหลดที่กำหนดไว้',
 'img-auth-badtitle' => 'ไม่สามารถสร้างชื่อเรื่องที่ถูกต้องจาก "$1" ได้',
-'img-auth-nologinnWL' => 'à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89ลà¸\87à¸\8aืà¹\88อà¹\80à¸\82à¹\89าà¹\83à¸\8aà¹\89และ "$1" ไม่ได้อยู่ในรายชื่อผู้ใช้ที่ดี (whitelist)',
+'img-auth-nologinnWL' => 'à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89ลà¹\87อà¸\81อิà¸\99และ "$1" ไม่ได้อยู่ในรายชื่อผู้ใช้ที่ดี (whitelist)',
 'img-auth-nofile' => 'ไม่มีไฟล์ "$1"',
 'img-auth-isdir' => 'คุณกำลังพยายามเข้าถึงไดเร็กทอรี "$1"
 ซึ่งคุณสามารถเข้าถึงได้เฉพาะไฟล์เท่านั้น',
@@ -1718,11 +1743,11 @@ $1',
 'upload-curl-error28' => 'เวลาอัปโหลดถูกตัด',
 'upload-curl-error28-text' => 'เว็บไซต์นี้ใช้เวลานานเกินไปในการเชื่อมต่อ กรุณาตรวจสอบว่าเว็บนี้ยังใช้งานได้ตามปกติ หรืออาจจะรอสักครู่แล้วลองอัปโหลดใหม่',
 
-'license' => 'ลิà¸\82สิà¸\97à¸\98ิà¹\8c:',
-'license-header' => 'à¸\81ารอà¸\99ุà¸\8dาà¸\95à¹\82à¸\94ยà¹\80à¸\88à¹\89าà¸\82อà¸\87ลิà¸\82สิà¸\97à¸\98ิà¹\8c',
+'license' => 'à¸\81ารอà¸\99ุà¸\8dาà¸\95à¹\83à¸\8aà¹\89สิà¸\97à¸\98ิ:',
+'license-header' => 'à¸\81ารอà¸\99ุà¸\8dาà¸\95à¹\83à¸\8aà¹\89สิà¸\97à¸\98ิ',
 'nolicense' => 'ไม่ได้เลือก',
 'license-nopreview' => '(ไม่สามารถแสดงตัวอย่าง)',
-'upload_source_url' => ' (ยูอารà¹\8cà¹\81อลà¸\97ีà¹\88à¸\9aุà¸\84à¸\84ลà¸\97ัà¹\88วà¹\84à¸\9bสามารถเข้าถึงได้)',
+'upload_source_url' => ' (ยูอารà¹\8cà¹\81อลà¸\96ูà¸\81à¸\95à¹\89อà¸\87à¸\97ีà¹\88สาà¸\98ารà¸\93ะสามารถเข้าถึงได้)',
 'upload_source_file' => ' (ไฟล์จากคอมพิวเตอร์คุณ)',
 
 # Special:ListFiles
@@ -1757,23 +1782,23 @@ $1',
 'filehist-comment' => 'ความเห็น',
 'filehist-missing' => 'ไฟล์หายไป',
 'imagelinks' => 'การใช้ไฟล์',
-'linkstoimage' => '$1 หน้าลิงก์มายังไฟล์นี้:',
-'linkstoimage-more' => 'à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มีà¸\81ารà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87มาà¸\81à¸\81วà¹\88า $1 à¹\81หà¹\88à¸\87
-รายà¸\81ารà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¹\81สà¸\94à¸\87à¸\81ารà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87 $1 à¹\81หà¹\88à¸\87แรกที่มายังไฟล์นี้เท่านั้น
-à¸\94ูà¹\80à¸\9eิà¹\88มà¹\84à¸\94à¹\89à¸\97ีà¹\88[[Special:WhatLinksHere/$2|รายà¸\8aืà¹\88อเต็ม]]',
-'nolinkstoimage' => 'à¹\84มà¹\88มีหà¸\99à¹\89าà¸\97ีà¹\88ลิà¸\87à¸\81à¹\8cมาไฟล์นี้',
-'morelinkstoimage' => 'à¸\94ู[[Special:WhatLinksHere/$1|หà¸\99à¹\89าà¸\97ีà¹\88ลิà¸\87à¸\81à¹\8c]]มายังไฟล์นี้เพิ่มเติม',
-'linkstoimage-redirect' => '$1 (à¹\81à¸\9fà¹\89มเปลี่ยนทาง) $2',
-'duplicatesoffile' => '$1 ไฟล์ต่อไปนี้ เป็นไฟล์เดียวกับไฟล์นี้ ([[Special:FileDuplicateSearch/$2|รายละเอียดเพิ่ม]]):',
+'linkstoimage' => 'มี $1 หน้าเชื่อมโยงมายังไฟล์นี้:',
+'linkstoimage-more' => 'à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มีหà¸\99à¹\89าà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87มาà¸\81วà¹\88า $1 à¸«à¸\99à¹\89า
+รายà¸\81ารà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¹\81สà¸\94à¸\87à¸\81ารà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87 $1 à¸«à¸\99à¹\89าแรกที่มายังไฟล์นี้เท่านั้น
+à¸\94ูà¹\80à¸\9eิà¹\88มà¹\84à¸\94à¹\89à¸\97ีà¹\88[[Special:WhatLinksHere/$2|รายà¸\81ารเต็ม]]',
+'nolinkstoimage' => 'à¹\84มà¹\88มีหà¸\99à¹\89าà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87มายัà¸\87ไฟล์นี้',
+'morelinkstoimage' => 'à¸\94ู[[Special:WhatLinksHere/$1|à¸\81ารà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87]]มายังไฟล์นี้เพิ่มเติม',
+'linkstoimage-redirect' => '$1 (à¹\84à¸\9fลà¹\8cเปลี่ยนทาง) $2',
+'duplicatesoffile' => '$1 ไฟล์ต่อไปนี้ เป็นไฟล์เดียวกับไฟล์นี้ ([[Special:FileDuplicateSearch/$2|รายละเอียดเพิ่มเติม]]):',
 'sharedupload' => 'ไฟล์นี้มาจาก $1 และอาจมีการใช้ในโครงการอื่น',
-'sharedupload-desc-there' => 'ไฟล์นี้มาจาก $1 และอาจถูกใช้บนโครงการอื่น ๆ
-กรุณาดู [หน้าคำอธิบายของไฟล์ $2] สำหรับข้อมูลเพิ่มเติม',
+'sharedupload-desc-there' => 'ไฟล์นี้มาจาก $1 และอาจถูกใช้บนโครงการอื่น
+กรุณาดู[หน้าคำอธิบายไฟล์ $2] สำหรับข้อมูลเพิ่มเติม',
 'sharedupload-desc-here' => 'ไฟล์นี้มาจาก $1 และอาจมีใช้ในโครงการอื่น
-à¸\84ำอà¸\98ิà¸\9aายà¹\83à¸\99[$2 à¸«à¸\99à¹\89าà¹\84à¸\9fลà¹\8c]à¹\84à¸\94à¹\89แสดงไว้ข้างล่างนี้',
-'sharedupload-desc-edit' => 'à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มาà¸\88าà¸\81 $1 à¹\81ละอาà¸\88มีà¸\81ารà¹\83à¸\8aà¹\89à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¹\83à¸\99à¹\82à¸\84รà¸\87à¸\81ารอืà¹\88à¸\99 à¹\86 à¸­à¸µà¸\81
-หากคุณต้องการแก้ไขคำอธิบาย ให้ดำเนินการ[$2 ที่นี่]',
-'sharedupload-desc-create' => 'ไฟล์นี้มาจาก $1 และอาจมีการใช้ไฟล์นี้ในโครงการอื่น ๆ อีก
-หากคุณต้องการแก้ไขคำอธิบาย ให้ดำเนินการ[$2 ที่นี่]',
+à¸\84ำอà¸\98ิà¸\9aายà¹\83à¸\99[$2 à¸«à¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aายà¹\84à¸\9fลà¹\8c]แสดงไว้ข้างล่างนี้',
+'sharedupload-desc-edit' => 'à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มาà¸\88าà¸\81 $1 à¹\81ละอาà¸\88มีà¹\83à¸\8aà¹\89à¹\83à¸\99à¹\82à¸\84รà¸\87à¸\81ารอืà¹\88à¸\99
+หากคุณต้องการแก้ไขคำอธิบาย ให้ดำเนินการบน[$2 หน้าคำอธิบายไฟล์]',
+'sharedupload-desc-create' => 'ไฟล์นี้มาจาก $1 และอาจมีการใช้ไฟล์นี้ในโครงการอื่น
+หากคุณต้องการแก้ไขคำอธิบาย ให้ดำเนินการบน[$2 หน้าคำอธิบายไฟล์]',
 'filepage-nofile' => 'ไม่มีไฟล์ชื่อนี้',
 'filepage-nofile-link' => 'ไม่มีไฟล์ชื่อนี้ แต่คุณสามารถ[$1 อัปโหลด]ได้',
 'uploadnewversion-linktext' => 'อัปโหลดรุ่นใหม่ของไฟล์นี้',
@@ -1796,7 +1821,7 @@ $1',
 # File deletion
 'filedelete' => 'ลบ $1',
 'filedelete-legend' => 'ลบไฟล์',
-'filedelete-intro' => "à¸\84ุà¸\93à¸\81ำลัà¸\87à¸\88ะลà¸\9aà¹\84à¸\9fลà¹\8c '''[[Media:$1|$1]]''' à¹\84à¸\9bà¸\9eรà¹\89อมà¸\81ัà¸\9aà¸\9bระวัà¸\95ิของไฟล์นี้",
+'filedelete-intro' => "à¸\84ุà¸\93à¸\81ำลัà¸\87ลà¸\9aà¹\84à¸\9fลà¹\8c '''[[Media:$1|$1]]''' à¸\9eรà¹\89อมà¸\81ัà¸\9aà¸\9bระวัà¸\95ิà¸\97ัà¹\89à¸\87หมà¸\94ของไฟล์นี้",
 'filedelete-intro-old' => "คุณกำลังลบ '''[[Media:$1|$1]]''' รุ่น [$4 $3, $2]",
 'filedelete-comment' => 'เหตุผล:',
 'filedelete-submit' => 'ลบ',
@@ -1810,12 +1835,13 @@ $1',
 ** ละเมิดลิขสิทธิ์
 ** ไฟล์ซ้ำ',
 'filedelete-edit-reasonlist' => 'แก้ไขเหตุผลการลบ',
-'filedelete-maintenance' => 'à¸\9bิà¸\94à¸\81ารลà¸\9aà¹\81ละà¹\80รียà¸\81à¸\84ืà¸\99à¹\84à¸\9fลà¹\8cà¹\84วà¹\89à¸\8aัà¹\88วà¸\84ราว à¹\83à¸\99ระหวà¹\88าà¸\87à¸\81ารà¸\8bà¹\88อมà¸\9aำรุà¸\87',
+'filedelete-maintenance' => 'à¸\81ารลà¸\9aà¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99à¹\84à¸\9fลà¹\8cà¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\84มà¹\88à¹\84à¸\94à¹\89à¸\8aัà¹\88วà¸\84ราวระหวà¹\88าà¸\87à¸\81ารà¸\9aำรุà¸\87รัà¸\81ษา',
 'filedelete-maintenance-title' => 'ไม่สามารถลบไฟล์',
 
 # MIME search
 'mimesearch' => 'ค้นหาตามชนิดไมม์',
-'mimesearch-summary' => 'หน้านี้แสดงไฟล์ตามการแบ่งของชนิดไมม์ (MIME) ของแต่ละไฟล์ ใส่ค่า: contenttype/subtype เช่น <code>image/jpeg</code>.',
+'mimesearch-summary' => 'หน้านี้แสดงไฟล์ตามการแบ่งของชนิดไมม์ของแต่ละไฟล์ 
+ใส่ค่า: contenttype/subtype เช่น <code>image/jpeg</code>',
 'mimetype' => 'ชนิดไมม์:',
 'download' => 'ดาวน์โหลด',
 
@@ -1827,8 +1853,8 @@ $1',
 
 # Unused templates
 'unusedtemplates' => 'แม่แบบไม่ได้ใช้',
-'unusedtemplatestext' => 'หà¸\99à¹\89าà¸\99ีà¹\89à¹\81สà¸\94à¸\87รายà¸\81ารà¸\9aà¸\97à¸\84วามà¸\97ัà¹\89à¸\87หมà¸\94à¹\83à¸\99à¹\80à¸\99มสà¹\80à¸\9bà¸\8b {{ns:template}} à¸\8bึà¹\88à¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89à¸\96ูà¸\81รวมอยูà¹\88à¹\83à¸\99หà¸\99à¹\89าอืà¹\88à¸\99 à¸\81à¹\88อà¸\99à¸\97ีà¹\88à¸\88ะลà¸\9aสà¹\88วà¸\99à¸\99ีà¹\89à¹\83หà¹\89à¸\97ำà¸\81ารà¸\95รวà¸\88สอà¸\9aหà¸\99à¹\89าà¸\97ีà¹\88ลิà¸\87à¸\81à¹\8cมาà¸\81à¹\88อà¸\99à¸\97ุà¸\81à¸\84รัà¹\89à¸\87',
-'unusedtemplateswlh' => 'ลิà¸\87à¸\81à¹\8cมา',
+'unusedtemplatestext' => 'หà¸\99à¹\89าà¸\99ีà¹\89à¹\81สà¸\94à¸\87รายà¸\81ารหà¸\99à¹\89าà¸\97ัà¹\89à¸\87หมà¸\94à¹\83à¸\99à¹\80à¸\99มสà¹\80à¸\9bà¸\8b {{ns:template}} à¸\8bึà¹\88à¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89à¸\96ูà¸\81รวมอยูà¹\88à¹\83à¸\99หà¸\99à¹\89าอืà¹\88à¸\99 à¸­à¸¢à¹\88าลืมà¸\95รวà¸\88สอà¸\9aà¸\81ารà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87มายัà¸\87à¹\81มà¹\88à¹\81à¸\9aà¸\9aอืà¹\88à¸\99à¸\81à¹\88อà¸\99ลà¸\9a',
+'unusedtemplateswlh' => 'à¸\81ารà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87อืà¹\88à¸\99',
 
 # Random page
 'randompage' => 'สุ่มหน้า',
@@ -1855,46 +1881,48 @@ $1',
 'statistics-views-total-desc' => 'ไม่นับรวมจำนวนการเข้าชมหน้าที่ไม่มีอยู่และหน้าพิเศษ',
 'statistics-views-peredit' => 'จำนวนการเข้าดูต่อการแก้ไข:',
 'statistics-users' => '[[Special:ListUsers|ผู้ใช้]]ลงทะเบียน',
-'statistics-users-active' => 'à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88ยัà¸\87à¹\81à¸\81à¹\89à¹\84à¸\82อยูà¹\88',
+'statistics-users-active' => 'à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88ยัà¸\87มีà¸\84วามà¹\80à¸\84ลืà¹\88อà¸\99à¹\84หว',
 'statistics-users-active-desc' => 'ผู้ใช้ที่ดำเนินปฏิบัติการในช่วง $1 วันที่ผ่านมา',
 'statistics-mostpopular' => 'หน้าที่มีการเข้าชมมากที่สุด',
 
-'disambiguations' => 'หà¸\99à¹\89าà¸\97ีà¹\88à¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87à¸\81ัà¸\9aหน้าแก้ความกำกวม',
+'disambiguations' => 'หà¸\99à¹\89าà¸\97ีà¹\88à¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87à¹\84à¸\9bยัà¸\87หน้าแก้ความกำกวม',
 'disambiguationspage' => 'Template:แก้กำกวม',
-'disambiguations-text' => "หà¸\99à¹\89าà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89มีอยà¹\88าà¸\87à¸\99à¹\89อยหà¸\99ึà¹\88à¸\87ลิà¸\87à¸\81à¹\8cà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87à¹\84à¸\9bยัà¸\87'''หà¸\99à¹\89าà¸\84วามà¸\81ำà¸\81วม'''
-à¸\8bึà¹\88à¸\87อาà¸\88à¸\95à¹\89อà¸\87ลิà¸\87à¸\81à¹\8cà¹\84à¸\9bยัà¸\87หà¸\99à¹\89าà¸\97ีà¹\88à¹\80หมาะสมแทน<br />
-หà¸\99à¹\89าà¹\83à¸\94à¸\97ีà¹\88à¹\83à¸\8aà¹\89à¹\81มà¹\88à¹\81à¸\9aà¸\9aà¸\97ีà¹\88ลิà¸\87à¸\81à¹\8cมาà¸\88าà¸\81 [[MediaWiki:Disambiguationspage]] à¸«à¸\99à¹\89าà¹\80หลà¹\88าà¸\99ัà¹\89à¸\99à¸\88ะà¸\96ูà¸\81à¸\99ัà¸\9aรวมเป็นหน้าความกำกวม",
+'disambiguations-text' => "หà¸\99à¹\89าà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89มีà¸\81ารà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87à¹\84à¸\9bยัà¸\87'''หà¸\99à¹\89าà¸\84วามà¸\81ำà¸\81วม'''อยà¹\88าà¸\87à¸\99à¹\89อยหà¸\99ึà¹\88à¸\87à¹\81หà¹\88à¸\87
+à¸\8bึà¹\88à¸\87อาà¸\88à¸\95à¹\89อà¸\87à¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87à¹\84à¸\9bยัà¸\87หà¸\99à¹\89าà¸\97ีà¹\88à¹\80หมาะสมà¸\81วà¹\88าแทน<br />
+หà¸\99à¹\89าà¹\83à¸\94à¸\97ีà¹\88à¹\83à¸\8aà¹\89à¹\81มà¹\88à¹\81à¸\9aà¸\9aà¸\97ีà¹\88à¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87มาà¸\88าà¸\81 [[MediaWiki:Disambiguationspage]] à¸\88ะà¸\96ูà¸\81à¸\99ัà¸\9aเป็นหน้าความกำกวม",
 
 'doubleredirects' => 'หน้าเปลี่ยนทางซ้ำซ้อน',
-'doubleredirectstext' => 'หน้านี้แสดงรายการชื่อที่เปลี่ยนทางไปยังหน้าเปลี่ยนทางอื่น
-แต่ละแถวคือลิงก์ของการเปลี่ยนทางครั้งแรกและครั้งที่สอง พร้อมกับหน้าปลายทางของการเปลี่ยนทางครั้งที่สอง ซึ่งควรแก้ไขการเปลี่ยนทางครั้งแรกเป็นหน้าปลายทางดังกล่าว
-รายการที่ <del>ขีดฆ่า</del> คือรายการที่แก้ไขแล้ว',
-'double-redirect-fixed-move' => '[[$1]] ถูกเปลี่ยนชื่อแล้ว และเปลี่ยนทางไปยัง [[$2]]',
+'doubleredirectstext' => 'หน้านี้แสดงรายการหน้าที่เปลี่ยนทางไปยังหน้าเปลี่ยนทางอื่น
+แต่ละแถวมีการเชื่อมโยงไปยังการเปลี่ยนทางครั้งแรกและครั้งที่สอง เช่นเดียวกับเป้าหมายของการเปลี่ยนทางครั้งที่สอง ซึ่งมักเป็นหน้าเป้าหมาย "ที่แท้จริง" ที่การเปลี่ยนแปลงครั้งแรกควรชี้ไป
+หน่วยที่<del>ขีดฆ่า</del> คือ รายการที่ได้แก้ไขแล้ว',
+'double-redirect-fixed-move' => '[[$1]] ถูกเปลี่ยนชื่อแล้ว 
+ขณะนี้เปลี่ยนทางไปยัง [[$2]]',
 'double-redirect-fixed-maintenance' => 'การแก้ไขการเปลี่ยนทางซ้ำซ้อนจาก [[$1]] ไปยัง [[$2]]',
-'double-redirect-fixer' => 'Redirect fixer',
+'double-redirect-fixer' => 'ผู้ซ่อมหน้าเปลี่ยนทาง',
 
 'brokenredirects' => 'หน้าเปลี่ยนทางเสีย',
-'brokenredirectstext' => 'หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87à¹\84à¸\9bยัà¸\87หà¸\99à¹\89าà¸\97ีà¹\88à¹\84มà¹\88มี:',
+'brokenredirectstext' => 'หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87à¹\84à¸\9bยัà¸\87หà¸\99à¹\89าà¸\97ีà¹\88ยัà¸\87à¹\84มà¹\88à¸\96ูà¸\81สรà¹\89าà¸\87:',
 'brokenredirects-edit' => 'แก้ไข',
 'brokenredirects-delete' => 'ลบ',
 
 'withoutinterwiki' => 'หน้าที่ไม่มีลิงก์ข้ามภาษา',
 'withoutinterwiki-summary' => 'หน้าต่อไปนี้ไม่มีลิงก์ข้ามไปภาษาอื่น',
-'withoutinterwiki-legend' => 'à¸\84ำà¸\99ำหà¸\99à¹\89า',
+'withoutinterwiki-legend' => 'à¸\84ำà¸\82ึà¹\89à¸\99à¸\95à¹\89à¸\99',
 'withoutinterwiki-submit' => 'แสดง',
 
-'fewestrevisions' => 'หà¸\99à¹\89าà¸\97ีà¹\88มีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82น้อยสุด',
+'fewestrevisions' => 'หà¸\99à¹\89าà¸\97ีà¹\88มีรุà¹\88à¸\99น้อยสุด',
 
 # Miscellaneous special pages
 'nbytes' => '$1 ไบต์',
 'ncategories' => '$1 หมวดหมู่',
-'nlinks' => '$1 {{PLURAL:$1|ลิงก์|ลิงก์}}',
+'ninterwikis' => '$1 ลิงก์ข้ามโครงการ',
+'nlinks' => '$1 ลิงก์',
 'nmembers' => '$1 หน้า',
-'nrevisions' => '$1 à¸\84รัà¹\89à¸\87',
+'nrevisions' => '$1 à¸£à¸¸à¹\88à¸\99',
 'nviews' => '$1 ครั้ง',
 'nimagelinks' => 'ใช้ใน $1 {{PLURAL: $1|หน้า|หน้า}}',
 'ntransclusions' => 'ใช้ใน $1 {{PLURAL: $1|หน้า|หน้า}}',
-'specialpage-empty' => 'à¹\84มà¹\88มีหà¸\99à¹\89าà¸\97ีà¹\88à¹\80รียà¸\81à¸\94ู',
+'specialpage-empty' => 'à¹\84มà¹\88มีà¸\9cลลัà¸\9eà¸\98à¹\8cรายà¸\87าà¸\99à¸\99ีà¹\89',
 'lonelypages' => 'หน้าสุดทาง',
 'lonelypagestext' => 'หน้าต่อไปนี้ไม่มีการเชื่อมโยงหรือถูกรวมไว้ในหน้าอื่นใน {{SITENAME}}',
 'uncategorizedpages' => 'หน้าที่ไม่ได้จัดหมวดหมู่',
@@ -1906,30 +1934,30 @@ $1',
 'popularpages' => 'หน้าที่มีการเข้าดูมาก',
 'wantedcategories' => 'หมวดหมู่ที่ต้องการ',
 'wantedpages' => 'หน้าที่ต้องการ',
-'wantedpages-badtitle' => 'ชื่อเรื่อง $1 ไม่ถูกต้องในรายการผลลัพธ์',
+'wantedpages-badtitle' => 'ชื่อเรื่องไม่สมเหตุสมผลในเซตผลลัพธ์: $1',
 'wantedfiles' => 'ไฟล์ที่ต้องการ',
 'wantedtemplates' => 'แม่แบบที่ต้องการ',
-'mostlinked' => 'หà¸\99à¹\89าà¸\97ีà¹\88มีà¸\81ารลิà¸\87à¸\81à¹\8cหามาà¸\81',
-'mostlinkedcategories' => 'หมวà¸\94หมูà¹\88à¸\97ีà¹\88มีà¸\81ารà¹\82ยà¸\87หามาà¸\81',
-'mostlinkedtemplates' => 'à¹\81มà¹\88à¹\81à¸\9aà¸\9aà¸\97ีà¹\88à¹\83à¸\8aà¹\89มาà¸\81',
-'mostcategories' => 'หน้าที่มีหมวดหมู่มาก',
-'mostimages' => 'ภาà¸\9eà¸\97ีà¹\88à¹\83à¸\8aà¹\89มาà¸\81',
-'mostinterwikis' => 'หà¸\99à¹\89าà¸\97ีà¹\88มีลิà¸\87à¸\81à¹\8cà¸\82à¹\89ามภาษามากที่สุด',
-'mostrevisions' => 'หà¸\99à¹\89าà¸\97ีà¹\88มีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82มาà¸\81',
-'prefixindex' => 'หà¸\99à¹\89าà¸\97ัà¹\89à¸\87หมà¸\94à¸\95ามà¸\94ัà¸\8aà¸\99ีคำขึ้นต้น',
-'prefixindex-namespace' => 'à¸\97ุà¸\81หà¸\99à¹\89าà¸\97ีà¹\88มีà¸\84ำà¸\82ึà¹\89à¸\99à¸\95à¹\89à¸\99 ($1 à¹\80à¸\99มสà¹\80à¸\9bà¸\8b)',
-'shortpages' => 'หน้าสั้นมาก',
-'longpages' => 'หน้ายาวมาก',
+'mostlinked' => 'หà¸\99à¹\89าà¸\97ีà¹\88มีà¸\81ารà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87หามาà¸\81à¸\97ีà¹\88สุà¸\94',
+'mostlinkedcategories' => 'หมวà¸\94หมูà¹\88à¸\97ีà¹\88มีà¸\81ารà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87หามาà¸\81à¸\97ีà¹\88สุà¸\94',
+'mostlinkedtemplates' => 'à¹\81มà¹\88à¹\81à¸\9aà¸\9aà¸\97ีà¹\88มีà¸\81ารà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87หามาà¸\81à¸\97ีà¹\88สุà¸\94',
+'mostcategories' => 'หน้าที่มีหมวดหมู่มากที่สุด',
+'mostimages' => 'ภาà¸\9eà¸\97ีà¹\88มีà¸\81ารà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87หามาà¸\81à¸\97ีà¹\88สุà¸\94',
+'mostinterwikis' => 'หà¸\99à¹\89าà¸\97ีà¹\88มีลิà¸\87à¸\81à¹\8cà¸\82à¹\89ามà¹\82à¸\84รà¸\87à¸\81ารมากที่สุด',
+'mostrevisions' => 'หà¸\99à¹\89าà¸\97ีà¹\88มีรุà¹\88à¸\99มาà¸\81à¸\97ีà¹\88สุà¸\94',
+'prefixindex' => 'à¸\97ุà¸\81หà¸\99à¹\89าà¸\9eรà¹\89อมคำขึ้นต้น',
+'prefixindex-namespace' => 'à¸\97ุà¸\81หà¸\99à¹\89าà¸\9eรà¹\89อมà¸\84ำà¸\82ึà¹\89à¸\99à¸\95à¹\89à¸\99 (à¹\80à¸\99มสà¹\80à¸\9bà¸\8b $1)',
+'shortpages' => 'หน้าสั้น',
+'longpages' => 'หน้ายาว',
 'deadendpages' => 'หน้าสุดทาง',
-'deadendpagestext' => 'หà¸\99à¹\89าà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¹\84มà¹\88à¹\84à¸\94à¹\89ลิà¸\87à¸\81à¹\8cไปหน้าอื่นใน {{SITENAME}}',
-'protectedpages' => 'หน้าถูกล็อก',
-'protectedpages-indef' => 'à¸\81ารลà¹\87อà¸\81à¹\81à¸\9aà¸\9aà¹\84มà¹\88à¸\88ำà¸\81ัดเท่านั้น',
+'deadendpagestext' => 'หà¸\99à¹\89าà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¹\84มà¹\88à¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87ไปหน้าอื่นใน {{SITENAME}}',
+'protectedpages' => 'หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81ลà¹\87อà¸\81',
+'protectedpages-indef' => 'à¸\81ารลà¹\87อà¸\81à¹\81à¸\9aà¸\9aà¹\84มà¹\88มีà¸\81ำหà¸\99ดเท่านั้น',
 'protectedpages-cascade' => 'การล็อกแบบสืบทอดเท่านั้น',
-'protectedpagestext' => 'หà¸\99à¹\89าà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¸\96ูà¸\81ลà¹\87อà¸\81หà¹\89ามà¹\81à¸\81à¹\89à¹\84à¸\82หรือà¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อ',
-'protectedpagesempty' => 'à¹\84มà¹\88มีหà¸\99à¹\89าà¹\83à¸\94à¸\97ีà¹\88à¸\96ูà¸\81ลà¹\87อà¸\81à¸\95ามà¸\84à¹\88าà¸\97ีà¹\88à¹\80ลือà¸\81',
+'protectedpagestext' => 'หà¸\99à¹\89าà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¸\96ูà¸\81ลà¹\87อà¸\81มิà¹\83หà¹\89ยà¹\89ายหรือà¹\81à¸\81à¹\89à¹\84à¸\82',
+'protectedpagesempty' => 'à¸\82à¸\93ะà¸\99ีà¹\89à¹\84มà¹\88มีหà¸\99à¹\89าà¹\83à¸\94à¸\96ูà¸\81ลà¹\87อà¸\81à¸\95ามà¸\9eารามิà¹\80à¸\95อรà¹\8cà¹\80หลà¹\88าà¸\99ีà¹\89',
 'protectedtitles' => 'ชื่อเรื่องที่ถูกป้องกัน',
 'protectedtitlestext' => 'ชื่อเรื่องต่อไปนี้ถูกป้องกันมิให้สร้าง',
-'protectedtitlesempty' => 'à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¹\84มà¹\88มีหัวà¹\80รืà¹\88อà¸\87à¸\97ีà¹\88à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¸\94à¹\89วยà¸\84à¹\88าà¸\95à¹\88อà¹\84à¸\9bนี้',
+'protectedtitlesempty' => 'à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¹\84มà¹\88มีหัวà¹\80รืà¹\88อà¸\87à¸\97ีà¹\88à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¸\94à¹\89วยà¸\9eารามิà¹\80à¸\95อรà¹\8cà¹\80หลà¹\88านี้',
 'listusers' => 'รายนามผู้ใช้',
 'listusers-editsonly' => 'แสดงเฉพาะผู้ใช้ที่มีการแก้ไข',
 'listusers-creationsort' => 'เรียงลำดับตามวันสร้าง',
@@ -1941,22 +1969,22 @@ $1',
 'move' => 'เปลี่ยนชื่อ',
 'movethispage' => 'เปลี่ยนชื่อหน้านี้',
 'unusedimagestext' => 'ไฟล์ต่อไปนี้มีอยู่ แต่ไม่มีการเรียกใช้ในหน้าใด ๆ เลย
-หมายà¹\80หà¸\95ุวà¹\88า à¹\80วà¹\87à¸\9aà¹\84วà¸\95à¹\8cอืà¹\88à¸\99อาà¸\88ลิà¸\87à¸\81à¹\8cมายัà¸\87à¹\84à¸\9fลà¹\8cà¸\94à¹\89วยยูอารà¹\8cà¹\81อลà¹\82à¸\94ยà¸\95รà¸\87 à¸\89ะà¸\99ัà¹\89à¸\99à¸\88ึà¸\87อาà¸\88ยัà¸\87มีà¸\8aืà¹\88ออยู่ที่นี่แม้จะมีการใช้อย่างต่อเนื่อง',
-'unusedcategoriestext' => 'หมวดหมู่ต่อไปนี้ยังมีอยู่ถึงแม้ว่าจะไม่มีว่าไม่มีหน้าไหนหรือบทความไหนใช้ส่วนนี้',
-'notargettitle' => 'à¹\84มà¹\88à¸\9eà¸\9aหà¸\99à¹\89าà¸\9bลายà¸\97าà¸\87',
+หมายà¹\80หà¸\95ุวà¹\88า à¹\80วà¹\87à¸\9aà¹\84à¸\8bà¸\95à¹\8cอืà¹\88à¸\99อาà¸\88à¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87มายัà¸\87à¹\84à¸\9fลà¹\8cà¸\94à¹\89วยยูอารà¹\8cà¹\81อลà¹\82à¸\94ยà¸\95รà¸\87 à¸\89ะà¸\99ัà¹\89à¸\99à¸\88ึà¸\87à¸\8aืà¹\88ออาà¸\88ยัà¸\87à¹\81สà¸\94à¸\87รายà¸\81ารอยู่ที่นี่แม้จะมีการใช้อย่างต่อเนื่อง',
+'unusedcategoriestext' => 'หมวดหมู่ต่อไปนี้ยังมีอยู่ แม้ไม่มีหน้าอื่นหรือหมวดหมู่ใดใช้ส่วนนี้',
+'notargettitle' => 'à¹\84มà¹\88à¸\9eà¸\9aà¹\80à¸\9bà¹\89าหมาย',
 'notargettext' => 'คุณมิได้ระบุหน้าหรือผู้ใช้เป้าหมายที่จะดำเนินการฟังก์ชันนี้',
 'nopagetitle' => 'ไม่มีหน้าเป้าหมายดังกล่าว',
 'nopagetext' => 'หน้าเป้าหมายที่คุณระบุไม่มีอยู่',
 'pager-newer-n' => 'ใหม่กว่า $1',
 'pager-older-n' => 'เก่ากว่า $1',
-'suppress' => 'Oversight',
-'querypage-disabled' => 'หà¸\99à¹\89าà¸\9eิà¹\80ศษà¸\99ีà¹\89à¸\96ูà¸\81à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\94à¹\89วยà¹\80หà¸\95ุà¸\9cลà¸\94à¹\89าà¸\99à¸\9bระสิà¸\97à¸\98ิภาà¸\9e',
+'suppress' => 'ผู้ดูแลประวัติ',
+'querypage-disabled' => 'หà¸\99à¹\89าà¸\9eิà¹\80ศษà¸\99ีà¹\89à¸\96ูà¸\81à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81มีà¸\9bระสิà¸\97à¸\98ิภาà¸\9eà¸\95à¹\88ำ',
 
 # Book sources
-'booksources' => 'à¸\84à¹\89à¸\99หาหนังสือ',
-'booksources-search-legend' => 'ค้นหาหนังสือ',
+'booksources' => 'à¹\81หลà¹\88à¸\87หนังสือ',
+'booksources-search-legend' => 'à¸\84à¹\89à¸\99หาà¹\81หลà¹\88à¸\87หà¸\99ัà¸\87สือ',
 'booksources-go' => 'ค้นหา',
-'booksources-text' => 'รายà¸\81ารà¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\81สà¸\94à¸\87à¹\80วà¹\87à¸\9aà¹\84à¸\8bà¸\95à¹\8cà¸\97ีà¹\88à¸\82ายหà¸\99ัà¸\87สือà¹\83หมà¹\88หรือหà¸\99ัà¸\87สือà¹\83à¸\8aà¹\89à¹\81ลà¹\89ว à¸\8bึà¹\88à¸\87อาà¸\88มีà¸\82à¹\89อมูลà¸\82อà¸\87หà¸\99ัà¸\87สือà¸\97ีà¹\88à¸\84ุà¸\93à¸\81ำลัà¸\87à¸\84à¹\89à¸\99หา:',
+'booksources-text' => 'à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ารà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87à¹\84à¸\9bยัà¸\87à¹\80วà¹\87à¸\9aà¹\84à¸\8bà¸\95à¹\8cอืà¹\88à¸\99à¸\97ีà¹\88à¸\82ายหà¸\99ัà¸\87สือà¹\83หมà¹\88à¹\81ละหà¸\99ัà¸\87สือà¹\83à¸\8aà¹\89à¹\81ลà¹\89ว à¹\81ละอาà¸\88มีสารสà¸\99à¹\80à¸\97ศà¹\80à¸\9eิà¹\88มà¹\80à¸\95ิมà¹\80à¸\81ีà¹\88ยวà¸\81ัà¸\9aหà¸\99ัà¸\87สือà¸\97ีà¹\88à¸\84ุà¸\93à¸\81ำลัà¸\87มอà¸\87หา:',
 'booksources-invalid-isbn' => 'รหัส ISBN ที่ให้ไว้ไม่ถูกต้อง กรุณาตรวจสอบจากต้นฉบับอีกครั้ง',
 
 # Special:Log
@@ -1967,22 +1995,22 @@ $1',
 'alllogstext' => 'การแสดงผลรวมปูมที่มีทั้งหมดของ {{SITENAME}}
 คุณสามารถค้นหาให้ละเอียดขึ้นโดยเลือกประเภทปูม ชื่อผู้ใช้หรือหน้าที่ต้องการ (ไวต่ออักษรใหญ่เล็ก)',
 'logempty' => 'ไม่พบรายการตรงกันในปูม',
-'log-title-wildcard' => 'à¸\84à¹\89à¸\99หาà¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¸\94à¹\89วยà¸\84ำà¸\82ึà¹\89à¸\99à¸\95à¹\89à¸\99',
-'showhideselectedlogentries' => 'à¹\81สà¸\94à¸\87/à¸\8bà¹\88อà¸\99รายà¸\81ารปูมที่เลือก',
+'log-title-wildcard' => 'à¸\84à¹\89à¸\99หาà¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¸\94à¹\89วยà¸\82à¹\89อà¸\84วามà¸\99ีà¹\89',
+'showhideselectedlogentries' => 'à¹\81สà¸\94à¸\87/à¸\8bà¹\88อà¸\99หà¸\99à¹\88วยปูมที่เลือก',
 
 # Special:AllPages
 'allpages' => 'ทุกหน้า',
 'alphaindexline' => '$1 ถึง $2',
 'nextpage' => 'ถัดไป ($1)',
 'prevpage' => 'ก่อนหน้า ($1)',
-'allpagesfrom' => 'à¹\80ริà¹\88มà¹\81สà¸\94à¸\87à¸\9cลจาก:',
-'allpagesto' => 'à¸\88à¸\9aà¸\81ารà¹\81สà¸\94à¸\87à¸\9cลที่:',
+'allpagesfrom' => 'à¹\81สà¸\94à¸\87หà¸\99à¹\89าà¹\82à¸\94ยà¹\80ริà¹\88มจาก:',
+'allpagesto' => 'à¹\81สà¸\94à¸\87หà¸\99à¹\89าà¸\88à¸\9aที่:',
 'allarticles' => 'ทุกหน้า',
-'allinnamespace' => 'หน้าทุกหน้า ($1 เนมสเปซ)',
-'allnotinnamespace' => 'หน้าทุกหน้า (ไม่อยู่ใน $1 เนมสเปซ)',
+'allinnamespace' => 'หน้าทุกหน้า (เนมสเปซ $1)',
+'allnotinnamespace' => 'หน้าทุกหน้า (ไม่อยู่ในเนมสเปซ $1)',
 'allpagesprev' => 'ก่อนหน้า',
 'allpagesnext' => 'ถัดไป',
-'allpagessubmit' => 'à¸\84à¹\89à¸\99หา',
+'allpagessubmit' => 'à¸\94ู',
 'allpagesprefix' => 'แสดงหน้าที่ขึ้นต้นด้วย:',
 'allpagesbadtitle' => 'ชื่อเรื่องนี้ไม่ถูกต้อง อาจสะกดผิด ลิงก์มาจากภาษาอื่นหรือวิกิอื่น หรือมีตัวอักษรที่ไม่สามารถใช้เป็นชื่อเรื่องได้',
 'allpages-bad-ns' => '{{SITENAME}} ไม่มีเนมสเปซ "$1"',
@@ -1990,10 +2018,10 @@ $1',
 
 # Special:Categories
 'categories' => 'หมวดหมู่',
-'categoriespagetext' => '{{PLURAL:$1|หมวà¸\94หมูà¹\88à¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89}}มีหà¸\99à¹\89าหรือสืà¹\88อà¸\95à¹\88าà¸\87
+'categoriespagetext' => '{{PLURAL:$1|หมวà¸\94หมูà¹\88à¸\99ีà¹\89|หมวà¸\94หมูà¹\88à¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89}}มีหà¸\99à¹\89าหรือสืà¹\88อà¸\95à¹\88าà¸\87 
 [[Special:UnusedCategories|หมวดหมู่ที่ไม่ได้ใช้]]จะไม่แสดงในที่นี้
-ดูเพิ่มที่[[Special:WantedCategories|หมวดหมู่ที่ต้องการ]]',
-'categoriesfrom' => 'à¹\81สà¸\94à¸\87หมวà¸\94หมูà¹\88à¹\82à¸\94ยà¹\80ริà¹\88มà¸\88าà¸\81:',
+ดูเพิ่มที่ [[Special:WantedCategories|หมวดหมู่ที่ต้องการ]]',
+'categoriesfrom' => 'แสดงหมวดหมู่เริ่มจาก:',
 'special-categories-sort-count' => 'เรียงตามจำนวน',
 'special-categories-sort-abc' => 'เรียงตามตัวอักษร',
 
@@ -2003,69 +2031,70 @@ $1',
 'sp-deletedcontributions-contribs' => 'เรื่องที่เขียน',
 
 # Special:LinkSearch
-'linksearch' => 'à¸\84à¹\89à¸\99หาลิà¸\87à¸\81à¹\8cà¸\88าà¸\81ภายà¸\99อà¸\81à¹\80วà¹\87à¸\9aà¹\84à¸\8bà¸\95à¹\8c',
+'linksearch' => 'à¸\84à¹\89à¸\99หาลิà¸\87à¸\81à¹\8cภายà¸\99อà¸\81',
 'linksearch-pat' => 'รูปแบบการค้นหา:',
 'linksearch-ns' => 'เนมสเปซ:',
-'linksearch-ok' => 'สืà¸\9aà¸\84à¹\89à¸\99',
-'linksearch-text' => 'อัà¸\81à¸\82ระà¸\95ัวà¹\81à¸\97à¸\99à¹\80à¸\8aà¹\88à¸\99 "*.wikipedia.org" à¸ªà¸²à¸¡à¸²à¸£à¸\96à¹\83à¸\8aà¹\89ได้
+'linksearch-ok' => 'à¸\84à¹\89à¸\99หา',
+'linksearch-text' => 'สามารà¸\96à¹\83à¸\8aà¹\89à¸\95ัวà¹\81à¸\97à¸\99à¹\80à¸\8aà¹\88à¸\99 "*.wikipedia.org" ได้
 ต้องการโดเมนระดับบนสุดเป็นอย่างน้อย เช่น "*.org"<br />
-à¹\82à¸\9eรà¹\82à¸\97à¸\84อลà¸\97ีà¹\88รอà¸\87รัà¸\9a: <code>$1</code> (à¸\84à¹\88าà¹\82à¸\94ยà¸\9bริยายà¹\80à¸\9bà¹\89น http:// หากไม่ระบุโพรโทคอล)',
+à¹\82à¸\9eรà¹\82à¸\97à¸\84อลà¸\97ีà¹\88รอà¸\87รัà¸\9a: <code>$1</code> (à¸\84à¹\88าà¹\82à¸\94ยà¸\9bริยายà¹\80à¸\9bà¹\87น http:// หากไม่ระบุโพรโทคอล)',
 'linksearch-line' => '$1 ถูกลิงก์จาก $2',
-'linksearch-error' => 'à¹\80à¸\84รืà¹\88อà¸\87หมายà¹\81à¸\97à¸\99อัà¸\81à¸\82ระ (wildcard) à¸­à¸¢à¸¹à¹\88หà¸\99à¹\89าà¸\8aืà¹\88อà¹\82ฮสà¸\95à¹\8cà¹\84à¸\94à¹\89เท่านั้น',
+'linksearch-error' => 'อัà¸\81à¸\82ระà¸\95ัวà¹\81à¸\97à¸\99อยูà¹\88à¹\84à¸\94à¹\89à¹\80à¸\89à¸\9eาะหà¸\99à¹\89าà¸\8aืà¹\88อà¹\82ฮสà¸\95à¹\8cเท่านั้น',
 
 # Special:ListUsers
-'listusersfrom' => 'à¹\81สà¸\94à¸\87à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\82à¸\94ยà¹\80ริà¹\88มà¸\95à¹\89à¸\99จาก:',
+'listusersfrom' => 'à¹\81สà¸\94à¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\80ริà¹\88มจาก:',
 'listusers-submit' => 'แสดง',
-'listusers-noresult' => 'à¹\84มà¹\88à¸\9eà¸\9aà¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¸\95à¹\89อà¸\87à¸\81าร',
+'listusers-noresult' => 'à¹\84มà¹\88à¸\9eà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89',
 'listusers-blocked' => '(ถูกบล็อก)',
 
 # Special:ActiveUsers
-'activeusers' => 'รายà¸\81ารà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\9bระà¸\88ำ',
-'activeusers-intro' => 'à¸\99ีà¹\88à¸\84ือรายà¸\99ามà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88มีà¸\81ิà¸\88à¸\81รรมà¹\83à¸\94 à¹\86 à¹\83à¸\99 $1 วันที่ผ่านมา',
+'activeusers' => 'รายà¸\81ารà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88มีà¸\84วามà¹\80à¸\84ลืà¹\88อà¸\99à¹\84หว',
+'activeusers-intro' => 'à¸\99ีà¹\88à¸\84ือรายà¸\81ารà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88มีà¸\81ิà¸\88à¸\81รรมà¹\83à¸\94 à¹\86 à¹\83à¸\99à¸\8aà¹\88วà¸\87 $1 วันที่ผ่านมา',
 'activeusers-count' => '{{PLURAL:$1|ปฏิบัติการล่าสุด|ปฏิบัติการล่าสุด $1 รายการ}} ในช่วง $3 วันที่ผ่านมา',
-'activeusers-from' => 'à¹\81สà¸\94à¸\87à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\82à¸\94ยเริ่มจาก:',
+'activeusers-from' => 'à¹\81สà¸\94à¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89เริ่มจาก:',
 'activeusers-hidebots' => 'ซ่อนบอต',
 'activeusers-hidesysops' => 'ซ่อนผู้ดูแลระบบ',
-'activeusers-noresult' => 'à¹\84มà¹\88à¸\9eà¸\9aà¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89',
+'activeusers-noresult' => 'ไม่พบผู้ใช้',
 
 # Special:ListGroupRights
-'listgrouprights' => 'สิทธิของกลุ่มผู้ใช้',
-'listgrouprights-summary' => 'รายชื่อกลุ่มผู้ใช้ต่อไปนี้ถูกกำหนดไว้บน {{SITENAME}} โดยมีสิทธิการเข้าถึงที่เกี่ยวข้อง และอาจมี[[{{MediaWiki:Listgrouprights-helppage}}|ข้อมูลเพิ่มเติม]]เกี่ยวกับสิทธิของแต่ละบุคคล',
-'listgrouprights-key' => '* <span class="listgrouprights-granted">สิทธิ์ที่ถูกให้</span>
-* <span class="listgrouprights-revoked">สิทธิ์ที่ถูกยกเลิก</span>',
+'listgrouprights' => 'สิทธิกลุ่มผู้ใช้',
+'listgrouprights-summary' => 'ด้านล่างเป็นรายการกลุ่มผู้ใช้ที่นิยามบนวิกินี้ และสิทธิการเข้าถึงที่เกี่ยวข้อง
+อาจมี[[{{MediaWiki:Listgrouprights-helppage}}|ข้อมูลเพิ่มเติม]]เกี่ยวกับสิทธิหนึ่ง ๆ',
+'listgrouprights-key' => '* <span class="listgrouprights-granted">สิทธิที่ได้รับแต่งตั้ง</span>
+* <span class="listgrouprights-revoked">สิทธิที่ถูกเพิกถอน</span>',
 'listgrouprights-group' => 'กลุ่ม',
 'listgrouprights-rights' => 'สิทธิ',
-'listgrouprights-helppage' => 'Help:สิà¸\97à¸\98ิà¸\82อà¸\87à¸\81ลุà¹\88ม',
-'listgrouprights-members' => '(รายà¸\8aืà¹\88อสมาชิก)',
-'listgrouprights-addgroup' => 'สามารà¸\96à¹\80à¸\9eิà¹\88ม{{PLURAL:$2|à¸\81ลุà¹\88มà¸\99ีà¹\89|à¸\81ลุà¹\88มà¹\80หลà¹\88าà¸\99ีà¹\89}}à¹\84à¸\94à¹\89: $1',
-'listgrouprights-removegroup' => 'สามารà¸\96ลà¸\9a{{PLURAL:$2|à¸\81ลุà¹\88มà¸\99ีà¹\89|à¸\81ลุà¹\88มà¹\80หลà¹\88าà¸\99ีà¹\89}}à¹\84à¸\94à¹\89: $1',
-'listgrouprights-addgroup-all' => 'สามารà¸\96à¹\80à¸\9eิà¹\88มà¸\81ลุà¹\88มà¸\97ัà¹\89à¸\87หมà¸\94à¹\84à¸\94à¹\89',
-'listgrouprights-removegroup-all' => 'สามารà¸\96ลà¸\9aà¸\81ลุà¹\88มà¸\97ัà¹\89à¸\87หมà¸\94à¹\84à¸\94à¹\89',
-'listgrouprights-addgroup-self' => 'à¹\80à¸\9eิà¹\88ม{{PLURAL:$2|à¸\81ลุà¹\88ม|à¸\81ลุà¹\88ม}}à¹\80à¸\82à¹\89าà¹\84à¸\9bà¹\83à¸\99à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89: $1',
-'listgrouprights-removegroup-self' => 'ลà¸\9a{{PLURAL:$2|à¸\81ลุà¹\88ม|à¸\81ลุà¹\88ม}}ออà¸\81à¸\88าà¸\81à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89: $1',
-'listgrouprights-addgroup-self-all' => 'à¹\80à¸\9eิà¹\88มà¸\97ุà¸\81à¸\81ลุà¹\88มà¹\80à¸\82à¹\89าà¹\84à¸\9bà¹\83à¸\99à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89นี้',
-'listgrouprights-removegroup-self-all' => 'ลà¸\9aà¸\97ุà¸\81à¸\81ลุà¹\88มออà¸\81à¸\88าà¸\81à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89นี้',
+'listgrouprights-helppage' => 'Help:สิทธิกลุ่ม',
+'listgrouprights-members' => '(รายà¸\81ารสมาชิก)',
+'listgrouprights-addgroup' => 'à¹\80à¸\9eิà¹\88ม{{PLURAL:$2|à¸\81ลุà¹\88มà¸\99ีà¹\89|à¸\81ลุà¹\88มà¹\80หลà¹\88าà¸\99ีà¹\89}}: $1',
+'listgrouprights-removegroup' => 'à¸\99ำ{{PLURAL:$2|à¸\81ลุà¹\88มà¸\99ีà¹\89|à¸\81ลุà¹\88มà¹\80หลà¹\88าà¸\99ีà¹\89}}ออà¸\81: $1',
+'listgrouprights-addgroup-all' => 'à¹\80à¸\9eิà¹\88มà¸\81ลุà¹\88มà¸\97ัà¹\89à¸\87หมà¸\94',
+'listgrouprights-removegroup-all' => 'à¸\99ำà¸\81ลุà¹\88มà¸\97ัà¹\89à¸\87หมà¸\94ออà¸\81',
+'listgrouprights-addgroup-self' => 'à¹\80à¸\9eิà¹\88ม{{PLURAL:$2|à¸\81ลุà¹\88ม|à¸\81ลุà¹\88ม}}à¹\80à¸\82à¹\89าà¹\84à¸\9bà¹\83à¸\99à¸\9aัà¸\8dà¸\8aี: $1',
+'listgrouprights-removegroup-self' => 'ลà¸\9a{{PLURAL:$2|à¸\81ลุà¹\88ม|à¸\81ลุà¹\88ม}}ออà¸\81à¸\88าà¸\81à¸\9aัà¸\8dà¸\8aี: $1',
+'listgrouprights-addgroup-self-all' => 'à¹\80à¸\9eิà¹\88มà¸\97ุà¸\81à¸\81ลุà¹\88มà¹\80à¸\82à¹\89าà¹\84à¸\9bà¹\83à¸\99à¸\9aัà¸\8dà¸\8aีนี้',
+'listgrouprights-removegroup-self-all' => 'à¸\99ำà¸\97ุà¸\81à¸\81ลุà¹\88มออà¸\81à¸\88าà¸\81à¸\9aัà¸\8dà¸\8aีนี้',
 
 # E-mail user
-'mailnologin' => 'à¹\84มà¹\88มีà¸\81ารสà¹\88à¸\87อีà¹\80มล',
-'mailnologintext' => 'à¸\95à¹\89อà¸\87à¸\81ารà¸\97ำ[[Special:UserLogin|ลà¹\87อà¸\81อิà¸\99]]à¹\81ละà¸\95ัà¹\89à¸\87à¸\84à¹\88าอีà¹\80มลà¹\83à¸\99สà¹\88วà¸\99[[Special:Preferences|à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88า]] à¹\80à¸\9eืà¹\88อà¸\88ะสà¹\88à¸\87อีà¹\80มลหาà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\84à¸\99อื่น',
+'mailnologin' => 'à¹\84มà¹\88มีà¸\97ีà¹\88อยูà¹\88สà¹\88à¸\87',
+'mailnologintext' => 'à¸\84ุà¸\93à¸\95à¹\89อà¸\87[[Special:UserLogin|ลà¹\87อà¸\81อิà¸\99]]à¹\81ละมีà¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\97ีà¹\88สมà¹\80หà¸\95ุสมà¸\9cลà¹\83à¸\99[[Special:Preferences|à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88า]]à¸\82อà¸\87à¸\84ุà¸\93 à¹\83à¸\99à¸\81ารสà¹\88à¸\87อีà¹\80มลหาà¸\9cูà¹\89à¹\83à¸\8aà¹\89อื่น',
 'emailuser' => 'ส่งอีเมลหาผู้ใช้นี้',
 'emailuser-title-target' => 'ส่งอีเมลหา{{GENDER:$1|ผู้ใช้}}',
 'emailuser-title-notarget' => 'อีเมลผู้ใช้',
 'emailpage' => 'อีเมลผู้ใช้',
-'emailpagetext' => 'à¸\84ุà¸\93สามารà¸\96à¹\83à¸\8aà¹\89à¹\81à¸\9aà¸\9aà¸\9fอรà¹\8cมà¸\94à¹\89าà¸\99ลà¹\88าà¸\87สà¹\88à¸\87อีà¹\80มลหา{{GENDER:$1|à¸\9cูà¹\89à¹\83à¸\8aà¹\89}}à¸\99ีà¹\89
+'emailpagetext' => 'คุณสามารถใช้แบบด้านล่างส่งอีเมลหา{{GENDER:$1|ผู้ใช้}}นี้
 ที่อยู่อีเมลที่คุณกรอกใน[[Special:Preferences|การตั้งค่าส่วนตัวของคุณ]]จะปรากฏเป็นที่อยู่ "จาก" ของอีเมล ซึ่งผู้รับสามารถตอบกลับคุณได้โดยตรง',
 'usermailererror' => 'การส่งอีเมลผิดพลาด:',
 'defemailsubject' => 'อีเมล {{SITENAME}} จากผู้ใช้ "$1"',
-'usermaildisabled' => 'สà¹\88à¸\87อีà¹\80มลหาà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99',
-'usermaildisabledtext' => 'à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96สà¹\88à¸\87อีà¹\80มลà¹\84à¸\9bหาà¸\9cูà¹\89à¹\83à¸\8aà¹\89อืà¹\88à¸\99à¸\9aà¸\99วิà¸\81ิà¸\99ีà¹\89',
+'usermaildisabled' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารสà¹\88à¸\87อีà¹\80มลหาà¸\9cูà¹\89à¹\83à¸\8aà¹\89',
+'usermaildisabledtext' => 'คุณไม่สามารถส่งอีเมลหาผู้ใช้อื่นบนวิกินี้',
 'noemailtitle' => 'ไม่มีที่อยู่อีเมล',
 'noemailtext' => 'ผู้ใช้คนนี้ระบุที่อยู่อีเมลไม่ถูกต้อง',
 'nowikiemailtitle' => 'ไม่อนุญาตให้ใช้อีเมล',
 'nowikiemailtext' => 'ผู้ใช้คนนี้เลือกไม่รับอีเมลจากผู้ใช้อื่น',
 'emailnotarget' => 'ไม่มีชื่อผู้ใช้ของผู้รับหรือชื่อผู้ใช้ไม่ถูกต้อง',
 'emailtarget' => 'กรอกชื่อผู้ใช้ของผู้รับ',
-'emailusername' => 'ชื่อผู้ใช้ :',
+'emailusername' => 'ชื่อผู้ใช้:',
 'emailusernamesubmit' => 'ส่ง',
 'email-legend' => 'ส่งอีเมลถึงผู้ใช้ {{SITENAME}} อีกคน',
 'emailfrom' => 'จาก:',
@@ -2092,7 +2121,7 @@ $1',
 'watchnologin' => 'ไม่ได้ล็อกอิน',
 'watchnologintext' => 'ต้อง[[Special:UserLogin|ล็อกอิน]]เพื่อแก้ไขรายการเฝ้าดูของคุณ',
 'addwatch' => 'เพิ่มเข้ารายการเฝ้าดู',
-'addedwatchtext' => 'หà¸\99à¹\89า "[[:$1]]" à¸\96ูà¸\81à¹\80à¸\9eิà¹\88มà¹\80à¸\82à¹\89า[[Special:Watchlist|รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ู]]à¸\82อà¸\87à¸\84ุà¸\93 à¸\96à¹\89ามีà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\83à¸\99หà¸\99à¹\89าà¸\99ีà¹\89 à¹\81ละหà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¸\97ีà¹\88à¹\80à¸\81ีà¹\88ยวà¸\82à¹\89อà¸\87à¸\88ะà¹\81สà¸\94à¸\87รายการด้านล่าง',
+'addedwatchtext' => 'หà¸\99à¹\89า "[[:$1]]" à¹\84à¸\94à¹\89à¹\80à¸\9eิà¹\88มลà¸\87à¹\83à¸\99[[Special:Watchlist|รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ู]]à¸\82อà¸\87à¸\84ุà¸\93à¹\81ลà¹\89ว à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\83à¸\99หà¸\99à¹\89าà¸\99ีà¹\89หรือหà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¸\97ีà¹\88à¹\80à¸\81ีà¹\88ยวà¸\82à¹\89อà¸\87à¸\88ะà¹\81สà¸\94à¸\87à¹\83à¸\99รายการด้านล่าง',
 'removewatch' => 'นำออกจากรายการเฝ้าดู',
 'removedwatchtext' => 'หน้า "[[:$1]]" ถูกนำออกจาก[[Special:Watchlist|รายการเฝ้าดูของคุณ]]',
 'watch' => 'เฝ้าดู',
@@ -2100,17 +2129,17 @@ $1',
 'unwatch' => 'เลิกเฝ้าดู',
 'unwatchthispage' => 'เลิกเฝ้าดูหน้านี้',
 'notanarticle' => 'ไม่ใช่หน้าเนื้อหา',
-'notvisiblerev' => 'รุà¹\88à¸\99à¸\94ัà¸\87à¸\81ลà¹\88าวà¸\96ูà¸\81ลà¸\9aà¹\80รียà¸\9aรà¹\89อยแล้ว',
-'watchnochange' => 'à¹\84มà¹\88มีหà¸\99à¹\89าà¸\97ีà¹\88à¸\84ุà¸\93à¹\80à¸\9dà¹\89าà¸\94ูà¸\96ูà¸\81à¹\81à¸\81à¹\89à¹\84à¸\82ในระยะเวลาที่แสดง',
+'notvisiblerev' => 'รุà¹\88à¸\99ลà¹\88าสุà¸\94à¹\82à¸\94ยà¸\9cูà¹\89à¹\83à¸\8aà¹\89อีà¸\81à¸\84à¸\99à¸\96ูà¸\81ลà¸\9aแล้ว',
+'watchnochange' => 'à¹\84มà¹\88มีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\97ีà¹\88à¸\84ุà¸\93à¹\80à¸\9dà¹\89าà¸\94ูในระยะเวลาที่แสดง',
 'watchlist-details' => 'มี $1 หน้าในรายการเฝ้าดูของคุณ ไม่รวมหน้าอภิปราย',
 'wlheader-enotif' => '* แจ้งเตือนผ่านอีเมลถูกเปิดใช้งาน',
 'wlheader-showupdated' => "* หน้าที่มีการเปลี่ยนแปลงตั้งแต่การเข้าชมครั้งล่าสุดของคุณแสดงใน'''ตัวหนา'''",
 'watchmethod-recent' => 'ตรวจสอบการปรับปรุงล่าสุดกับหน้าเฝ้าดู',
 'watchmethod-list' => 'ตรวจสอบหน้าเฝ้าดูกับการแก้ไขล่าสุด',
 'watchlistcontains' => 'รายการเฝ้าดูของคุณมี $1 หน้า',
-'iteminvalidname' => "à¹\80à¸\81ิà¸\94à¸\9bัà¸\8dหาà¸\8aืà¹\88อà¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87à¸\81ัà¸\9a '$1'...",
-'wlnote' => "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82{{PLURAL:$1|สุà¸\94à¸\97à¹\89าย|ล่าสุด '''$1''' รายการ}} ใน{{PLURAL:$2|ชั่วโมง|ช่วง '''$2''' ชั่วโมง}}ที่ผ่านมา จนถึง $3, $4",
-'wlshowlast' => 'แสดงล่าสุดใน $1 ชั่วโมง $2 วัน $3',
+'iteminvalidname' => "à¹\80à¸\81ิà¸\94à¸\9bัà¸\8dหาà¸\81ัà¸\9aรายà¸\81าร '$1' à¸\8aืà¹\88อà¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87...",
+'wlnote' => "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82{{PLURAL:$1|ลà¹\88าสุà¸\94|ล่าสุด '''$1''' รายการ}} ใน{{PLURAL:$2|ชั่วโมง|ช่วง '''$2''' ชั่วโมง}}ที่ผ่านมา จนถึง $3, $4",
+'wlshowlast' => 'แสดง $1 ชั่วโมง $2 วันล่าสุด $3',
 'watchlist-options' => 'ตัวเลือกรายการเฝ้าดู',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -2121,17 +2150,17 @@ $1',
 '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_deleted' => 'หน้า $1 บน {{SITENAME}} ถูกลบโดย {{gender:$2|$2}}',
+'enotif_subject_created' => 'หน้า $1 บน {{SITENAME}} ถูกสร้างโดย {{gender:$2|$2}}',
+'enotif_subject_moved' => 'หน้า $1 บน {{SITENAME}} ถูกย้ายโดย {{gender:$2|$2}}',
 'enotif_subject_restored' => 'หน้า $1 บน {{SITENAME}} ถูก{{GENDER:$2|กู้คืน}}โดย $2',
-'enotif_subject_changed' => '{{SITENAME}} หน้า $1 ได้เปลี่ยนแล้วโดย {{gender:$2|$2}}',
+'enotif_subject_changed' => 'หน้า $1 บน {{SITENAME}} มีการเปลี่ยนแปลงโดย {{gender:$2|$2}}',
 'enotif_body_intro_deleted' => 'หน้า $1 บน {{SITENAME}} ถูก{{GENDER:$2|ลบ}}เมื่อ $PAGEEDITDATE โดย $2 ดู $3',
 'enotif_body_intro_created' => 'หน้า $1 บน {{SITENAME}} ถูก{{GENDER:$2|สร้าง}}เมื่อ $PAGEEDITDATE โดย $2 ดูรุ่นปัจจุบันที่ $3',
 'enotif_body_intro_moved' => 'หน้า $1 บน {{SITENAME}} ถูก{{GENDER:$2|เปลี่ยนชื่อ}}เมื่อ $PAGEEDITDATE โดย $2 ดูรุ่นปัจจุบันที่ $3',
 'enotif_body_intro_restored' => 'หน้า $1 บน {{SITENAME}} ถูก{{GENDER:$2|กู้คืน}}เมื่อ $PAGEEDITDATE โดย $2 ดูรุ่นปัจจุบันที่ $3',
 'enotif_body_intro_changed' => 'หน้า $1 บน {{SITENAME}} ถูก{{GENDER:$2|เปลี่ยนแปลง}}เมื่อ $PAGEEDITDATE โดย $2 ดูรุ่นปัจจุบันที่ $3',
-'enotif_lastvisited' => 'à¸\94ู $1 à¸ªà¸³à¸«à¸£à¸±à¸\9aà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\97ัà¹\89à¸\87หมà¸\94à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88à¸\84รัà¹\89à¸\87ลà¹\88าสุà¸\94à¸\97ีà¹\88à¸\84ุà¸\93à¹\80à¸\82à¹\89าà¸\8aม',
+'enotif_lastvisited' => 'à¸\94ู $1 à¸ªà¸³à¸«à¸£à¸±à¸\9aà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\97ัà¹\89à¸\87หมà¸\94à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88à¸\84ุà¸\93à¹\80à¸\82à¹\89าà¸\8aมà¸\84รัà¹\89à¸\87ลà¹\88าสุà¸\94',
 'enotif_lastdiff' => 'ดู $1 เพื่อดูการเปลี่ยนแปลงนี้',
 'enotif_anon_editor' => 'ผู้ใช้นิรนาม $1',
 'enotif_body' => 'เรียน $WATCHINGUSERNAME
@@ -2167,14 +2196,14 @@ $UNWATCHURL
 'deletepage' => 'ลบหน้า',
 'confirm' => 'ยืนยัน',
 'excontent' => "เนื้อหาเดิม: '$1'",
-'excontentauthor' => "à¹\80à¸\99ืà¹\89อหาà¹\80à¸\94ิม: '$1' (à¹\81ละมีà¸\9cูà¹\89à¹\80à¸\82ียà¸\99à¸\84à¸\99à¹\80à¸\94ียว à¸\84ือ '[[Special:Contributions/$2|$2]]')",
+'excontentauthor' => "เนื้อหาเดิม: '$1' (และผู้เขียนคนเดียว คือ '[[Special:Contributions/$2|$2]]')",
 'exbeforeblank' => "เนื้อหาก่อนถูกทำว่างคือ: '$1'",
 'exblank' => 'หน้าว่าง',
 'delete-confirm' => 'ลบ "$1"',
 'delete-legend' => 'ลบ',
-'historywarning' => 'คำเตือน: หน้าที่คุณกำลังจะลบ มีประวัติการแก้ไขโดยประมาณ $1 {{PLURAL:$1|รุ่น}}:',
+'historywarning' => "'''คำเตือน:'''' หน้าที่คุณกำลังลบมีประวัติการแก้ไขประมาณ $1 {{PLURAL:$1|รุ่น}}:",
 'confirmdeletetext' => 'คุณกำลังลบหน้า รวมทั้งประวัติทั้งหมดของหน้า
-à¸\81รุà¸\93ายืà¸\99ยัà¸\99วà¹\88าà¸\84ุà¸\93à¹\80à¸\88à¸\95à¸\99า à¹\81ละà¸\84ุà¸\93à¹\80à¸\82à¹\89าà¹\83à¸\88à¸\9cลà¸\81ระà¸\97à¸\9a à¹\81ละà¸\81ารà¸\81ระà¸\97ำà¸\99ีà¹\89สอà¸\94à¸\84ลà¹\89อà¸\87à¸\81ัà¸\9a[[{{MediaWiki:Policy-url}}|à¸\99à¹\82ยà¸\9aาย]]',
+กรุณายืนยันว่าคุณเจตนา เข้าใจผลกระทบ และการกระทำนี้สอดคล้องกับ[[{{MediaWiki:Policy-url}}|นโยบาย]]',
 'actioncomplete' => 'ปฏิบัติการสำเร็จ',
 'actionfailed' => 'ปฏิบัติการล้มเหลว',
 'deletedtext' => '"$1" ถูกลบ
@@ -2211,21 +2240,23 @@ $UNWATCHURL
 'rollback-success' => 'ย้อนรุ่นที่แก้ไขโดย $1 ไปยังรุ่นล่าสุดโดย $2',
 
 # Edit tokens
-'sessionfailure-title' => 'Session นี้ล้มเหลว',
-'sessionfailure' => 'เหมือนจะมีปัญหาเกี่ยวการล็อกอินในช่วงเวลานี้ เกิดจากทางระบบป้องกันการลักลอบการขโมยล็อกอิน กรุณาย้อนกลับไปหน้าก่อนหน้า และลองโหลดใหม่อีกครั้ง',
+'sessionfailure-title' => 'ช่วงเวลาสื่อสารล้มเหลว',
+'sessionfailure' => 'ดูเหมือนมีปัญหากับช่วงเวลาสื่อสารล็อกอินของคุณ
+การกระทำนี้ถูกยกเลิกเป็นการป้องกันการลักลอบช่วงเวลาสื่อสารไว้ก่อน 
+กลับไปหน้าที่แล้ว โหลดหน้าใหม่ แล้วลองอีกครั้ง',
 
 # Protect
 'protectlogpage' => 'ปูมการล็อก',
-'protectlogtext' => 'à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\99ีà¹\89à¸\84ือรายà¸\81ารà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99หน้า
-à¸\94ู[[Special:ProtectedPages|รายà¸\81ารหà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81à¸\9bà¹\89อà¸\87à¸\81ัà¸\99]]สำหรัà¸\9aà¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99หà¸\99à¹\89าในปัจจุบัน',
-'protectedarticle' => 'à¸\9bà¹\89อà¸\87à¸\81ัà¸\99 "[[$1]]"',
-'modifiedarticleprotection' => 'à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81สำหรัà¸\9a "[[$1]]"',
-'unprotectedarticle' => 'ยà¸\81à¹\80ลิà¸\81à¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99จาก "[[$1]]" แล้ว',
+'protectlogtext' => 'à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\81ารลà¹\87อà¸\81หน้า
+à¸\94ู[[Special:ProtectedPages|รายà¸\81ารหà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81ลà¹\87อà¸\81]]สำหรัà¸\9aà¸\81ารลà¹\87อà¸\81หà¸\99à¹\89าà¸\97ีà¹\88มีà¸\9cลอยูà¹\88ในปัจจุบัน',
+'protectedarticle' => 'ลà¹\87อà¸\81 "[[$1]]"',
+'modifiedarticleprotection' => 'à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81à¸\82อà¸\87 "[[$1]]"',
+'unprotectedarticle' => 'ยà¸\81à¹\80ลิà¸\81à¸\81ารลà¹\87อà¸\81จาก "[[$1]]" แล้ว',
 'movedarticleprotection' => 'ย้ายการตั้งค่าการล็อกจาก "[[$2]]" ไปยัง "[[$1]]"',
 'protect-title' => 'กำลังล็อกหน้า "$1"',
-'protect-title-notallowed' => 'à¸\94ูระà¸\94ัà¸\9aà¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99ของ "$1"',
+'protect-title-notallowed' => 'à¸\94ูระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81ของ "$1"',
 'prot_1movedto2' => '[[$1]] ถูกเปลี่ยนชื่อเป็น [[$2]]',
-'protect-badnamespace-title' => 'à¹\80à¸\99มสà¹\80à¸\9bà¸\8bà¸\9bà¹\89อà¸\87à¸\81ัà¸\99ไม่ได้',
+'protect-badnamespace-title' => 'à¹\80à¸\99มสà¹\80à¸\9bà¸\8bลà¹\87อà¸\81ไม่ได้',
 'protect-badnamespace-text' => 'หน้าในเนมสเปซนี้ไม่สามารถป้องกันได้',
 'protect-norestrictiontypes-text' => 'หน้านี้ไม่สามารถถูกล็อก เพราะไม่มีประเภทการจำกัดที่ใช้ได้',
 'protect-norestrictiontypes-title' => 'หน้าที่ล็อกไม่ได้',
@@ -2234,28 +2265,28 @@ $UNWATCHURL
 'protectexpiry' => 'หมดอายุ:',
 'protect_expiry_invalid' => 'เวลาหมดอายุไม่ถูกต้อง',
 'protect_expiry_old' => 'เวลาหมดอายุผ่านมาแล้ว',
-'protect-unchain-permissions' => 'à¸\9bลà¸\94ลà¹\87อà¸\81à¸\95ัวà¹\80ลือà¸\81à¸\9bà¹\89อà¸\87à¸\81ัà¸\99อื่น ๆ',
-'protect-text' => "à¸\94ูà¹\81ละà¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81สำหรัà¸\9aหà¸\99à¹\89า '''$1'''.",
-'protect-locked-blocked' => "à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81หà¸\99à¹\89าà¸\82à¸\93ะà¸\97ีà¹\88à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¹\84à¸\94à¹\89 à¸\94ูระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81à¸\82อà¸\87หà¸\99à¹\89า '''$1''':",
-'protect-locked-dblock' => "à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81หà¸\99à¹\89าà¹\84à¸\94à¹\89à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\90าà¸\99à¸\82à¹\89อมูลà¸\96ูà¸\81ลà¹\87อà¸\81 à¸\94ูระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81à¸\82อà¸\87หà¸\99à¹\89า '''$1''':",
-'protect-locked-access' => "à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81หà¸\99à¹\89าà¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\84ุà¸\93à¹\84มà¹\88มีสิà¸\97à¸\98ิ  à¸\94ูระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81à¸\82อà¸\87หà¸\99à¹\89า '''$1''':",
-'protect-cascadeon' => 'หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81ลà¹\87อà¸\81à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¹\80à¸\9bà¹\87à¸\99สà¹\88วà¸\99หà¸\99ึà¹\88à¸\87à¸\82อà¸\87{{PLURAL:$1|หà¸\99à¹\89า|หà¸\99à¹\89า}}à¸\97ีà¹\88à¸\96ูà¸\81ล็อกแบบสืบทอด
+'protect-unchain-permissions' => 'à¸\9bลà¸\94ลà¹\87อà¸\81à¸\95ัวà¹\80ลือà¸\81à¸\81ารลà¹\87อà¸\81อื่น ๆ',
+'protect-text' => "à¸\97ีà¹\88à¸\99ีà¹\88à¸\84ุà¸\93สามารà¸\96à¸\94ูà¹\81ละà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81à¸\82อà¸\87หà¸\99à¹\89า '''$1''' à¹\84à¸\94à¹\89",
+'protect-locked-blocked' => "à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81หà¸\99à¹\89าà¸\82à¸\93ะà¸\97ีà¹\88à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¹\84à¸\94à¹\89 à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¸\82อà¸\87หà¸\99à¹\89า '''$1''' à¸\84ือ:",
+'protect-locked-dblock' => "à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81à¹\84à¸\94à¹\89à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\90าà¸\99à¸\82à¹\89อมูลà¸\96ูà¸\81ลà¹\87อà¸\81 à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¸\82อà¸\87หà¸\99à¹\89า '''$1''' à¸\84ือ:",
+'protect-locked-access' => "à¸\9aัà¸\8dà¸\8aีà¸\82อà¸\87à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81หà¸\99à¹\89า à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¸\82อà¸\87หà¸\99à¹\89า '''$1''' à¸\84ือ:",
+'protect-cascadeon' => 'หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81ลà¹\87อà¸\81à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¹\80à¸\9bà¹\87à¸\99สà¹\88วà¸\99หà¸\99ึà¹\88à¸\87à¸\82อà¸\87{{PLURAL:$1|หà¸\99à¹\89า|หà¸\99à¹\89า}}à¸\97ีà¹\88à¹\80à¸\9bิà¸\94à¸\81ารล็อกแบบสืบทอด
 คุณสามารถเปลี่ยนระดับการล็อกได้ แต่จะไม่มีผลต่อการล็อกแบบสืบทอด',
 'protect-default' => 'อนุญาตผู้ใช้ทั้งหมด',
 'protect-fallback' => 'อนุญาตเฉพาะผู้ใช้ที่มีสิทธิ "$1"',
-'protect-level-autoconfirmed' => 'à¸\9aลà¹\87อà¸\81à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\83หมà¹\88à¹\81ละà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\84มà¹\88ลà¸\87à¸\97ะà¹\80à¸\9aียà¸\99',
+'protect-level-autoconfirmed' => 'อà¸\99ุà¸\8dาà¸\95à¹\80à¸\89à¸\9eาะà¸\9cูà¹\89à¹\83à¸\8aà¹\89ยืà¸\99ยัà¸\99อัà¸\95à¹\82à¸\99มัà¸\95ิ',
 'protect-level-sysop' => 'อนุญาตเฉพาะผู้ดูแลระบบ',
 'protect-summary-cascade' => 'สืบทอด',
 'protect-expiring' => 'หมดอายุ $1 (UTC)',
 'protect-expiring-local' => 'หมดอายุ $1',
 'protect-expiry-indefinite' => 'ไม่มีกำหนด',
 'protect-cascade' => 'ล็อกหน้าที่เป็นส่วนหนึ่งของหน้านี้ (ล็อกแบบสืบทอด)',
-'protect-cantedit' => 'à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aสิà¸\97à¸\98ิà¹\83à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82สิà¹\88à¸\87à¸\99ัà¹\89à¸\99',
+'protect-cantedit' => 'à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89 à¹\80à¸\9eราะà¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\81à¸\81à¹\89à¹\84à¸\82ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81',
 'protect-othertime' => 'ระยะเวลาอื่น:',
 'protect-othertime-op' => 'ระยะเวลาอื่น',
 'protect-existing-expiry' => 'ระยะเวลาการป้องกัน: $3, $2',
-'protect-otherreason' => 'เหตุผลอื่นเพิ่มเติม:',
-'protect-otherreason-op' => 'สาà¹\80หà¸\95ุอื่น',
+'protect-otherreason' => 'เหตุผลอื่น/เพิ่มเติม:',
+'protect-otherreason-op' => 'à¹\80หà¸\95ุà¸\9cลอื่น',
 'protect-dropdown' => '* เหตุผลการป้องกันทั่วไป
 ** การก่อกวนจำนวนมาก
 ** สแปมจำนวนมาก
@@ -2276,33 +2307,37 @@ $UNWATCHURL
 'restriction-upload' => 'อัปโหลด',
 
 # Restriction levels
-'restriction-level-sysop' => 'ลà¹\87อà¸\81à¹\80à¸\95à¹\87มà¸\97ีà¹\88',
-'restriction-level-autoconfirmed' => 'ลà¹\87อà¸\81à¸\9cูà¹\89à¹\84มà¹\88ลà¹\87อà¸\81อิà¸\99',
-'restriction-level-all' => 'ระดับ',
+'restriction-level-sysop' => 'ลà¹\87อà¸\81สมà¸\9aูรà¸\93à¹\8c',
+'restriction-level-autoconfirmed' => 'à¸\81ึà¹\88à¸\87ลà¹\87อà¸\81',
+'restriction-level-all' => 'à¸\97ุà¸\81ระà¸\94ัà¸\9a',
 
 # Undelete
 'undelete' => 'ดูหน้าที่ถูกลบ',
 'undeletepage' => 'ดูและกู้คืนหน้าที่ถูกลบ',
-'undeletepagetitle' => "'''ต่อไปนี้เป็นรุ่นการแก้ไขของ [[:$1|$1]] ที่ถูกลบ'''",
-'viewdeletedpage' => 'หน้าที่ถูกลบ',
-'undeletepagetext' => '{{PLURAL:$1|หน้า|หน้า}}ต่อไปนี้ถูกลบไปแล้ว แต่ยังคงอยู่ในกรุซึ่งสามารถเรียกคืนได้ กรุข้อมูลอาจถูกลบเป็นระยะ',
-'undelete-fieldset-title' => 'กู้คืนรุ่นต่าง ๆ',
+'undeletepagetitle' => "'''ต่อไปนี้เป็นรุ่นการแก้ไขที่ถูกลบของ [[:$1|$1]]'''",
+'viewdeletedpage' => 'ดูหน้าที่ถูกลบ',
+'undeletepagetext' => '{{PLURAL:$1||$1 }}หน้าต่อไปนี้ถูกลบไปแล้ว แต่เนื้อหายังคงอยู่ในกรุและสามารถกู้คืนได้ 
+กรุอาจถูกลบเป็นระยะได้',
+'undelete-fieldset-title' => 'กู้คืนรุ่น',
 'undeleteextrahelp' => "ถ้าต้องการกู้ประวัติของหน้าคืนทั้งหมด ไม่ต้องเลือกกล่องใดเลย แล้วกดปุ่ม '''''กู้คืน'''''
 ถ้าต้องการกู้ประวัติคืนเฉพาะบางส่วน ให้เลือกกล่องที่มีประวัติส่วนที่ต้องการกู้ แล้วกด'''''กู้คืน'''''
 กด '''''ล้างค่า''''' เพื่อลบค่าในกล่องความเห็นและกล่องตัวเลือกทั้งหมด",
 'undeleterevisions' => '$1 รุ่นการแก้ไขถูกเก็บไว้',
 'undeletehistory' => 'เมื่อคุณกู้หน้าใดหน้าหนึ่ง รุ่นทั้งหมดจะถูกกู้คืนไปยังประวัติ หากมีหน้าใหม่ในชื่อเดียวกันถูกสร้างขึ้นหลังจากการลบ รุ่นที่กู้คืนนั้นจะปรากฏในประวัติที่มีมาก่อน',
-'undeleterevdel' => 'จะกู้คืนไม่ได้หากการกู้คืนนั้นส่งผลให้รุ่นล่าสุดของหน้าหรือไฟล์ถูกลบไปบางส่วน ในกรณีเช่นนั้น คุณต้องไม่เลือกหรือแสดงรุ่นใหม่สุดที่ถูกลบไปก่อน',
-'undeletehistorynoadmin' => 'หน้านี้ถูกลบก่อนหน้านี้ โดยสาเหตุการลบและรายชื่อผู้ร่วมแก้ไขก่อนหน้าแสดงผลด้านล่าง สำหรับข้อมูลที่ถูกลบจะดูได้เฉพาะผู้ดูแลระบบ',
+'undeleterevdel' => 'จะกู้คืนไม่ได้หากการกู้คืนนั้นส่งผลให้รุ่นล่าสุดของหน้าหรือไฟล์ถูกลบไปบางส่วน 
+ในกรณีเช่นนั้น คุณต้องไม่เลือกหรือแสดงรุ่นใหม่สุดที่ถูกลบไปก่อน',
+'undeletehistorynoadmin' => 'หน้านี้ถูกลบไปแล้ว
+มีสาเหตุการลบแสดงไว้ในคำอธิบายอย่างย่อข้างล่าง ร่วมกับรายละเอียดผู้ใช้ที่เคยแก้ไขหน้านี้ก่อนลบ
+ข้อความแท้จริงของรุ่นที่ถูกลบดูได้เฉพาะผู้ดูแลระบบ',
 'undelete-revision' => 'รุ่นที่ถูกลบของหน้า $1 (ตั้งแต่ $4 เมื่อ $5) โดย $3:',
 'undeleterevision-missing' => 'รุ่นไม่ถูกต้องหรือสูญหาย
 คุณอาจมีลิงก์เสีย หรือรุ่นอาจถูกกู้คืนหรือนำออกจากกรุ',
 'undelete-nodiff' => 'ไม่พบรุ่นก่อนหน้า',
 'undeletebtn' => 'กู้คืน',
 'undeletelink' => 'ดู/กู้คืน',
-'undeleteviewlink' => 'à¹\80รียà¸\81à¸\94ู',
-'undeletereset' => 'ลà¹\89าà¸\87à¸\84à¹\88า',
-'undeleteinvert' => 'à¸\81ลัà¸\9aà¸\84à¹\88าà¸\97ีà¹\88เลือก',
+'undeleteviewlink' => 'ดู',
+'undeletereset' => 'à¸\95ัà¹\89à¸\87à¹\83หมà¹\88',
+'undeleteinvert' => 'à¸\81ลัà¸\9aà¸\81ารเลือก',
 'undeletecomment' => 'เหตุผล:',
 'undeletedrevisions' => '$1 รุ่นการแก้ไขถูกกู้คืน',
 'undeletedrevisions-files' => '$1 รุ่น และ $2 ไฟล์ถูกกู้คืน',
@@ -2315,19 +2350,20 @@ $1',
 'undelete-header' => 'ดู [[Special:Log/delete|ปูมการลบ]] สำหรับหน้าที่ถูกลบล่าสุด',
 'undelete-search-title' => 'ค้นหาหน้าที่ถูกลบ',
 'undelete-search-box' => 'ค้นหาหน้าที่ถูกลบ',
-'undelete-search-prefix' => 'à¸\84à¹\89à¸\99หาหà¸\99à¹\89าà¸\97ีà¹\88à¹\80ริà¹\88มต้นด้วย:',
-'undelete-search-submit' => 'สืà¸\9aà¸\84à¹\89à¸\99',
+'undelete-search-prefix' => 'à¸\84à¹\89à¸\99หาหà¸\99à¹\89าà¸\97ีà¹\88à¸\82ึà¹\89à¸\99ต้นด้วย:',
+'undelete-search-submit' => 'à¸\84à¹\89à¸\99หา',
 'undelete-no-results' => 'ไม่พบหน้าที่ตรงกันในกรุการลบ',
-'undelete-filename-mismatch' => 'ไม่สามารถกู้คืนไฟล์ $1: ชื่อไฟล์ไม่ถูกต้อง',
-'undelete-bad-store-key' => 'ไม่สามารถกู้คืนไฟล์ $1: ไม่มีไฟล์ก่อนที่จะถูกลบ',
-'undelete-cleanup-error' => 'เกิดปัญหาการลบไฟล์เก่า "$1"',
-'undelete-missing-filearchive' => 'ไม่สามารถกู้คืนไฟล์เก่ารุ่น $1 เพราะไม่มีไฟล์อยู่ในฐานข้อมูล ไฟล์อาจถูกกู้คืนไปแล้ว',
-'undelete-error' => 'เกิดข้อผิดพลาด ไม่สามารถลบหน้าเวปได้',
-'undelete-error-short' => 'เกิดปัญหาในการกู้คืนไฟล์: $1',
-'undelete-error-long' => 'เกิดความผิดพลาดระหว่างการลบไฟล์:
+'undelete-filename-mismatch' => 'ไม่สามารถกู้คืนรุ่นไฟล์ที่มีตราเวลา $1: ชื่อไฟล์ไม่ตรง',
+'undelete-bad-store-key' => 'ไม่สามารถกู้คืนรุ่นไฟล์ที่มีตราเวลา $1: ไฟล์สูญหายก่อนถูกลบ',
+'undelete-cleanup-error' => 'เกิดความผิดพลาดในการลบไฟล์กรุที่ไม่ใช้แล้ว "$1"',
+'undelete-missing-filearchive' => 'ไม่สามารถกู้คืนไฟล์เก่าหมายเลข $1 เพราะไม่มีในฐานข้อมูล 
+ไฟล์อาจถูกกู้คืนไปแล้ว',
+'undelete-error' => 'เกิดข้อผิดพลาดในการกู้คืนหน้า',
+'undelete-error-short' => 'เกิดข้อผิดพลาดในการกู้คืนไฟล์: $1',
+'undelete-error-long' => 'เกิดข้อผิดพลาดขณะกู้คืนไฟล์:
 
 $1',
-'undelete-show-file-confirm' => 'à¹\81à¸\99à¹\88à¹\83à¸\88หรือà¹\84มà¹\88วà¹\88าà¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารà¸\88ะà¸\94ูรุà¹\88à¸\99à¸\97ีà¹\88à¸\96ูà¸\81ลà¸\9aà¹\84à¸\9b à¸ªà¸³à¸«à¸£à¸±à¸\9aไฟล์ "<nowiki>$1</nowiki>" ตั้งแต่ $2 เมื่อ $3',
+'undelete-show-file-confirm' => 'à¸\84ุà¸\93à¹\81à¸\99à¹\88à¹\83à¸\88หรือวà¹\88าà¸\95à¹\89อà¸\87à¸\81ารà¸\94ูรุà¹\88à¸\99à¸\97ีà¹\88à¸\96ูà¸\81ลà¸\9aà¸\82อà¸\87ไฟล์ "<nowiki>$1</nowiki>" ตั้งแต่ $2 เมื่อ $3',
 'undelete-show-file-submit' => 'ใช่',
 
 # Namespace form on various pages
@@ -2348,8 +2384,8 @@ $1',
 'month' => 'จากเดือน (และก่อนหน้า):',
 'year' => 'จากปี (และก่อนหน้า):',
 
-'sp-contributions-newbies' => 'à¹\81สà¸\94à¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89ใหม่เท่านั้น',
-'sp-contributions-newbies-sub' => 'สำหรัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89ใหม่',
+'sp-contributions-newbies' => 'à¹\81สà¸\94à¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\9aัà¸\8dà¸\8aีใหม่เท่านั้น',
+'sp-contributions-newbies-sub' => 'สำหรัà¸\9aà¸\9aัà¸\8dà¸\8aีใหม่',
 'sp-contributions-newbies-title' => 'เรื่องที่เขียนโดยบัญชีใหม่',
 'sp-contributions-blocklog' => 'ปูมการบล็อก',
 'sp-contributions-deleted' => 'การแก้ไขที่ถูกลบ',
@@ -2421,9 +2457,9 @@ $1',
 'ipb-change-block' => 'บล็อกผู้ใช้อีกครั้งด้วยการตั้งค่าเหล่านี้',
 'ipb-confirm' => 'ยืนยันการบล็อก',
 'badipaddress' => 'เลขที่อยู่ไอพีไม่ถูกต้อง',
-'blockipsuccesssub' => 'à¸\9aลà¹\87อà¸\81สำà¹\80รà¹\87à¸\88',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81<br />
-ดู[[Special:BlockList|รายการบล็อก]]เพื่อทบทวนการบล็อก',
+'blockipsuccesssub' => 'à¸\9aลà¹\87อà¸\81à¹\80รียà¸\9aรà¹\89อย',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] à¹\84à¸\94à¹\89à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¹\81ลà¹\89ว<br />
+ดู[[Special:BlockList|รายการบล็อก]]เพื่อทบทวนการบล็อกดังกล่าว',
 'ipb-blockingself' => 'คุณกำลังบล็อกตัวเอง! แน่ใจแล้วหรือว่าต้องการทำอย่างนั้น',
 'ipb-confirmhideuser' => 'คุณกำลังบล็อกผู้ใช้โดยเป็นผู้ใช้ "ซ่อนผู้ใช้" ซึ่งจะระงับชื่อผู้ใช้ในรายการและหน่วยปูมทั้งหมด คุณแน่ใจหรือว่าต้องการดำเนินการเช่นนั้น',
 'ipb-edit-dropdown' => 'แก้ไขสาเหตุการบล็อก',
@@ -2642,7 +2678,7 @@ $1',
 # Namespace 8 related
 'allmessages' => 'ข้อความของระบบ',
 'allmessagesname' => 'ชื่อ',
-'allmessagesdefault' => 'ข้อความตั้งต้น',
+'allmessagesdefault' => 'à¸\82à¹\89อà¸\84วามà¸\95ามà¸\84à¹\88าà¸\95ัà¹\89à¸\87à¸\95à¹\89à¸\99',
 'allmessagescurrent' => 'ข้อความปัจจุบัน',
 'allmessagestext' => 'รายการข้อความของระบบ อยู่ในเนมสเปซมีเดียวิกิ
 กรุณาไปที่ [//www.mediawiki.org/wiki/Localisation มีเดียวิกิ] และ [//translatewiki.new translatewiki.net] ถ้าคุณยังอยากที่จะแปลข้อความของระบบมีเดียวิกิ',
@@ -2828,7 +2864,7 @@ $1',
 'notacceptable' => 'เซิร์ฟเวอร์ของวิกิไม่สามารถให้ข้อมูลในรูปแบบที่ไคลเอนต์สามารถอ่านได้',
 
 # Attribution
-'anonymous' => '{{PLURAL:$1|ผู้ใช้}}นิรนามของ {{SITENAME}}',
+'anonymous' => 'ผู้ใช้นิรนามของ{{SITENAME}}',
 'siteuser' => 'ผู้ใช้ $1 จาก {{SITENAME}}',
 'anonuser' => 'ผู้ใช้นิรนามจาก {{SITENAME}} $1',
 'lastmodifiedatby' => 'แก้ไขล่าสุดเมื่อเวลา $2 $1 โดย $3',
@@ -2958,7 +2994,7 @@ $1',
 'showhidebots' => '($1 บอต)',
 'noimages' => 'ไม่มีให้ดู',
 'ilsubmit' => 'สืบค้น',
-'bydate' => 'วันที่',
+'bydate' => 'à¸\95ามวัà¸\99à¸\97ีà¹\88',
 'sp-newimages-showfrom' => 'แสดงภาพใหม่เริ่มต้นจาก $2, $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
index daf43ee..907b52e 100644 (file)
@@ -4131,6 +4131,8 @@ MediaWiki поширюється в надії, що вона буде кори
 'version-entrypoints' => 'URL-адреса точки входу',
 'version-entrypoints-header-entrypoint' => 'Точка входу',
 'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Шлях до статей]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Шлях до скриптів]',
 
 # Special:FilePath
 'filepath' => 'Шлях до файлу',
index e8deacd..eb32c04 100644 (file)
@@ -1123,9 +1123,8 @@ Lý do được $3 đưa ra là ''$2''",
 'last' => 'trước',
 'page_first' => 'đầu',
 'page_last' => 'cuối',
-'histlegend' => 'Chọn so sánh: đánh dấu để chọn các phiên bản để so sánh rồi nhấn enter hoặc nút ở dưới.<br />
-Chú giải: (hiện) = khác với phiên bản hiện hành,
-(trước) = khác với phiên bản trước, n = sửa đổi nhỏ.',
+'histlegend' => "Chọn so sánh: Đánh dấu để chọn các phiên bản để so sánh rồi nhấn Enter hoặc nút ở dưới.<br />
+Chú giải: '''({{int:cur}})''' = khác với phiên bản hiện hành, '''({{int:last}})''' = khác với phiên bản trước, '''{{int:minoreditletter}}''' = sửa đổi nhỏ.",
 'history-fieldset-title' => 'Tìm trong lịch sử',
 'history-show-deleted' => 'Chỉ bị xóa',
 'histfirst' => 'Cũ nhất',
index e3dbb83..766b3e5 100644 (file)
@@ -487,7 +487,7 @@ An magdudurmara nga nagtrangka hini in naghatag hini nga eksplenasyon: "$3".',
 'gotaccount' => '¿Mayda kana akawnt? $1.',
 'gotaccountlink' => 'Sakob',
 'userlogin-resetlink' => 'Nangalimot han imo detalye han pagsakob?',
-'createaccountmail' => 'Ha e-mail',
+'createaccountmail' => 'Gamiti hin temporaryo nga bisan ano nag password ngan igpadangat ngada ha e-mail address nga nakasurat ha ubos',
 'createaccountreason' => 'Rason:',
 'badretype' => 'Diri naangay an mga tigaman-pagsulod nga im ginbutang',
 'userexists' => 'An agnay hiton gumaramit nga im ginbutang in gingamit na.
@@ -516,6 +516,11 @@ Alayon pagutro pagbutang.',
 'passwordremindertitle' => 'Bag-o nga diri-pirmihan nga tigaman-pagsulod para han {{SITENAME}}',
 'noemail' => 'Waray e-mail nga adres nga ginrekord para han nágámit "$1".',
 'noemailcreate' => 'Kinahanglan nim maghatag hin may hinungdan nga e-mail address',
+'passwordsent' => 'Uska bag-o nga password in ginpadangat ha e-mail address nga nakarehistro kan "$1".
+Alayon paglog-in utro kahuman mo makarawat ini.',
+'blocked-mailpassword' => 'An imo IP address in ginpugong ha pag-edit, ngan tungod hini in diri gintutugotan paggamit han password recovery function para malikyan an abuso.',
+'eauthentsent' => 'Uska kompirmasyon nga e-mail in ginpadangan ha gin-ngaranan nga e-mail address.
+San-o matagan pa hin iba nga e-mail para ha imo akawnt, kinahanglan mo sundon an mga surundan nga nakasurat ha e-mail, para makompirma nga imo gud ito akawnt.',
 'mailerror' => 'Sayop han pagpadangat hin surat: $1',
 'emailauthenticated' => 'Ginpamatuod an imo e-mail adres han $2 ha $3.',
 'emailconfirmlink' => 'Igkompirma an imo e-mail address',
@@ -536,6 +541,7 @@ Alayon pagutro pagbutang.',
 'oldpassword' => 'Daan nga tigaman-pagsulod:',
 'newpassword' => 'Bag-o nga tigaman-pagsulod:',
 'retypenew' => 'Utroha pagbutang an bag-o nga tigaman-pagsulod:',
+'resetpass_submit' => 'Igbutang an password ngan log in',
 'resetpass_success' => 'Malinamposon nga nasalyuan na an imo tigaman-pagsulod!
 Ikaw in naglalog-in yana...',
 'resetpass_forbidden' => 'Diri mababalyoan an mga tigaman-pagsulod',
@@ -664,6 +670,7 @@ An taramdan han pagpara ngan pagbalhin para han pakli in ginhahatag ha ubos para
 'edit-already-exists' => 'Diri nakakahimo hin bag-o nga pakli.
 Aada na ito.',
 'defaultmessagetext' => 'Aada-nga-daan nga teksto han mensahe',
+'invalid-content-data' => 'Sayop nga sulod nga datos',
 'content-not-allowed-here' => 'An sulod nga "$1" in diri gintutugotan ha pakli nga [[$2]]',
 
 # Content models
@@ -722,6 +729,7 @@ Leyenda: '''({{int:cur}})''' = kaibhan ha giuurhii nga pag-bag-o, '''({{int:last
 'rev-showdeleted' => 'igpakita',
 'revisiondelete' => 'Pagpara/pagtanggal han pagpara nga mga rebisyon',
 'revdelete-nologtype-title' => 'Waray ginhatag nga klase hit talaan',
+'revdelete-nologid-title' => 'Sayop nga log entry',
 'revdelete-show-file-confirm' => 'Sigurado ka nga gusto mo makita an ginpara nga pagliwat han file "<nowiki>$1</nowiki>" tikang $2 ha $3?',
 'revdelete-show-file-submit' => 'Oo',
 'revdelete-hide-text' => 'Tagoon an rebisyon han teksto',
index 604f5fe..1ae93eb 100644 (file)
@@ -2082,7 +2082,7 @@ Orúkọ ibiàyè pọndandan, fún àpẹrẹ "*.org".<br />
 'usermessage-editor' => 'Sìstẹ́mú olúránṣẹ́',
 
 # Watchlist
-'watchlist' => 'Ìmójútó mi',
+'watchlist' => 'Ìmójútó',
 'mywatchlist' => 'Ìmójútó',
 'watchlistfor2' => 'Fún $1 $2',
 'nowatchlist' => 'Ẹ kò ní ohun kankan nínú ìmójútó yín.',
@@ -2252,7 +2252,7 @@ Bí a ṣe to ojúewé '''$1''' nì yí:",
 'protect-default' => 'Ẹ gba gbogbo àwọn oníṣe láàyè',
 'protect-fallback' => 'Ìyọ̀nda "$1" pọn dandan',
 'protect-level-autoconfirmed' => 'Dínà àwọn oníṣe tuntun àti tíkòforúkọ sílẹ́',
-'protect-level-sysop' => 'Alámùójútó nìkan',
+'protect-level-sysop' => 'Gba àwọn alámùójútó nìkan láyè',
 'protect-summary-cascade' => 'títẹ̀léra',
 'protect-expiring' => 'parí ní $1 (UTC)',
 'protect-expiring-local' => 'yíò parí ní $1',
@@ -2899,6 +2899,8 @@ Fáìlì náà jẹ́ rírùsóké ní àbọ̀.',
 'pageinfo-protect-cascading' => 'Àbò bẹ̀rẹ̀ láti ibí',
 'pageinfo-protect-cascading-yes' => 'Bẹ́ẹ̀ni',
 'pageinfo-protect-cascading-from' => 'Àbò bẹ̀rẹ̀ láti',
+'pageinfo-category-pages' => 'Iye àwọn ojúewé',
+'pageinfo-category-files' => 'Iye àwọn fáìlì',
 
 # Patrolling
 'markaspatrolleddiff' => 'Ìṣààmí sí bíi sísọ́',
@@ -3456,7 +3458,7 @@ $5
 'specialpages-group-highuse' => 'Àwọn ojúewé ìlò gíga',
 'specialpages-group-pages' => 'Àkójọ àwọn ojúewé',
 'specialpages-group-pagetools' => 'Àwọn irinṣẹ́ ojúewé',
-'specialpages-group-wiki' => 'Àwọn irinṣẹ́ àti dátà wiki',
+'specialpages-group-wiki' => 'Àwọn irinṣẹ́ àti dátà',
 'specialpages-group-redirects' => 'Ìtúnjúwe àwọn ojúewé pàtàkì',
 'specialpages-group-spam' => 'Irínṣẹ́ spam',
 
index 97ac129..9354cda 100644 (file)
@@ -1133,7 +1133,7 @@ $3的理由是''$2''",
 'history-fieldset-title' => '浏览历史',
 'history-show-deleted' => '仅被删除的',
 'histfirst' => '最早',
-'histlast' => '最',
+'histlast' => '最',
 'historysize' => '($1字节)',
 'historyempty' => '(空)',
 
index b2bbf9b..a13453d 100644 (file)
@@ -513,8 +513,11 @@ abstract class Maintenance {
                define( 'MEDIAWIKI', true );
 
                $wgCommandLineMode = true;
+
                # Turn off output buffering if it's on
-               @ob_end_flush();
+               while( ob_get_level() > 0 ) {
+                       ob_end_flush();
+               }
 
                $this->validateParamsAndArgs();
        }
index 30b568d..2555475 100644 (file)
@@ -8,7 +8,9 @@ test:
 
 doc:
        php mwdocgen.php --all
-       @echo 'Doc generation done. Look at ./docs/html/'
+       ./mwjsduck-gen
+       @echo 'PHP documentation (by Doxygen) in ./docs/html/'
+       @echo 'JS documentation (by JSDuck) in ./docs/js/'
 
 man:
        php mwdocgen.php --all --generate-man
diff --git a/maintenance/archives/patch-page_props-propname-page-index.sql b/maintenance/archives/patch-page_props-propname-page-index.sql
new file mode 100644 (file)
index 0000000..822fa04
--- /dev/null
@@ -0,0 +1,4 @@
+--
+-- Creates the pp_propname_page index on page_props
+--
+CREATE UNIQUE INDEX /*i*/pp_propname_page ON /*_*/page_props (pp_propname, pp_page);
diff --git a/maintenance/getConfiguration.php b/maintenance/getConfiguration.php
new file mode 100644 (file)
index 0000000..83b5b02
--- /dev/null
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Print serialized output of MediaWiki config vars
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ * @author Tim Starling
+ * @author Antoine Musso
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Print serialized output of MediaWiki config vars
+ *
+ * @ingroup Maintenance
+ */
+class GetConfiguration extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Get serialized MediaWiki site configuration";
+               $this->addOption( 'settings', 'Space-separated list of wg* variables', true, true );
+               $this->addOption( 'format', 'PHP or JSON', true, true );
+               $this->addOption( 'wiki', 'Wiki ID', true, true );
+       }
+
+       public function execute() {
+               $res = array();
+               foreach ( explode( ' ', $this->getOption( 'settings' ) ) as $name ) {
+                       if ( !preg_match( '/^wg[A-Z]/', $name ) ) {
+                               throw new MWException( "Variable '$name' does start with 'wg'." );
+                       } elseif ( !isset( $GLOBALS[$name] ) ) {
+                               throw new MWException( "Variable '$name' is not set." );
+                       } elseif ( !$this->isAllowedVariable( $GLOBALS[$name] ) ) {
+                               throw new MWException( "Variable '$name' includes non-array, non-scalar, items." );
+                       }
+                       $res[$name] = $GLOBALS[$name];
+               }
+
+               $out = null;
+               switch( $this->getOption( 'format' ) ) {
+                       case 'PHP':
+                               $out = serialize( $res );
+                               break;
+                       case 'JSON':
+                               $out = FormatJson::encode( $res );
+                               break;
+                       default:
+                               throw new MWException( "Invalid serialization format given." );
+               }
+               if ( !is_string( $out ) ) {
+                       throw new MWException( "Failed to serialize the requested settings." );
+               }
+
+               $this->output( $out . "\n" );
+       }
+
+       private function isAllowedVariable( $value ) {
+               if ( is_array( $value ) ) {
+                       foreach ( $value as $k => $v ) {
+                               if ( !$this->isAllowedVariable( $v ) ) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               } elseif ( is_scalar( $value ) ) {
+                       return true;
+               }
+               return false;
+       }
+}
+
+$maintClass = "GetConfiguration";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/jsduck/MetaTags.rb b/maintenance/jsduck/MetaTags.rb
new file mode 100644 (file)
index 0000000..84e4021
--- /dev/null
@@ -0,0 +1,53 @@
+# See also:
+# - https://github.com/senchalabs/jsduck/wiki/Tags
+# - https://github.com/senchalabs/jsduck/wiki/Custom-tags
+require 'jsduck/meta_tag'
+
+class ContextTag < JsDuck::MetaTag
+  def initialize
+    @name = 'context'
+  end
+
+  # @param tags All matches of this tag on one class.
+  def to_html(tags)
+    return '<h3 class="pa">Context</h3>' +  render_long_context(tags.last)
+  end
+
+  def render_long_context(tag)
+    if tag =~ /\A([^\s]+)/m
+      name = $1
+      return format("`this` : {@link #{name}}")
+    end
+  end
+end
+
+class SeeTag < JsDuck::MetaTag
+  def initialize
+    @name = 'see'
+    @multiline = true
+  end
+
+  # @param tags All matches of this tag on one class.
+  def to_html(tags)
+    doc = []
+    doc << '<h3 class="pa">Related</h3>'
+    doc << [
+        '<ul>',
+        tags.map {|tag| render_long_see(tag) },
+        '</ul>',
+      ]
+    doc
+  end
+
+  def render_long_see(tag)
+    if tag =~ /\A([^\s]+)( .*)?\Z/m
+      name = $1
+      doc = $2 ? ': ' + $2 : ''
+      return [
+        '<li>',
+        format("{@link #{name}} #{doc}"),
+        '</li>'
+      ]
+    end
+  end
+end
diff --git a/maintenance/jsduck/categories.json b/maintenance/jsduck/categories.json
new file mode 100644 (file)
index 0000000..4a8ba8c
--- /dev/null
@@ -0,0 +1,54 @@
+[
+       {
+               "name": "MediaWiki",
+               "groups": [
+                       {
+                               "name": "Base",
+                               "classes": [
+                                       "mw",
+                                       "mw.Map",
+                                       "mw.Message",
+                                       "mw.loader",
+                                       "mw.html",
+                                       "mw.html.Cdata",
+                                       "mw.html.Raw"
+                               ]
+                       },
+                       {
+                               "name": "General",
+                               "classes": [
+                                       "mw.Title",
+                                       "mw.notification",
+                                       "mw.util",
+                                       "mw.plugin.notify"
+                               ]
+                       },
+                       {
+                               "name": "API",
+                               "classes": ["mw.Api*"]
+                       }
+               ]
+       },
+       {
+               "name": "jQuery",
+               "groups": [
+                       {
+                               "name": "Core",
+                               "classes": ["jQuery", "jQuery.Event", "jQuery.Promise", "jQuery.Deferred", "jQuery.jqXHR"]
+                       },
+                       {
+                               "name": "Plugins",
+                               "classes": ["jQuery.plugin.*"]
+                       }
+               ]
+       },
+       {
+               "name": "Misc",
+               "groups": [
+                       {
+                               "name": "Native",
+                               "classes": ["Array", "Boolean", "Date", "Function", "Number", "Object", "RegExp", "String"]
+                       }
+               ]
+       }
+]
diff --git a/maintenance/jsduck/config.json b/maintenance/jsduck/config.json
new file mode 100644 (file)
index 0000000..c4705d8
--- /dev/null
@@ -0,0 +1,18 @@
+{
+       "--title": "MediaWiki Code Documentation",
+       "--categories": "./categories.json",
+       "--meta-tags": "./MetaTags.rb",
+       "--warnings": ["-no_doc"],
+       "--builtin-classes": true,
+       "--output": "../../docs/js",
+       "--": [
+               "./external.js",
+               "../../resources/mediawiki/mediawiki.js",
+               "../../resources/mediawiki/mediawiki.util.js",
+               "../../resources/mediawiki/mediawiki.Title.js",
+               "../../resources/mediawiki/mediawiki.notify.js",
+               "../../resources/mediawiki/mediawiki.notification.js",
+               "../../resources/mediawiki.api",
+               "../../resources/jquery/jquery.localize.js"
+       ]
+}
\ No newline at end of file
diff --git a/maintenance/jsduck/eg-iframe.html b/maintenance/jsduck/eg-iframe.html
new file mode 100644 (file)
index 0000000..f53b404
--- /dev/null
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>MediaWiki Examples</title>
+    <script>
+        function loadInlineExample(code, options, callback) {
+            try {
+                document.body.innerHTML = '';
+                eval(code);
+                callback && callback(true);
+            } catch (e) {
+                document.body.innerHTML = document.createTextNode(e);
+                callback && callback(false, e);
+            }
+        }
+    </script>
+</head>
+<body></body>
+</html>
diff --git a/maintenance/jsduck/external.js b/maintenance/jsduck/external.js
new file mode 100644 (file)
index 0000000..8ab102f
--- /dev/null
@@ -0,0 +1,26 @@
+/**
+ * @class jQuery
+ */
+
+/**
+ * @method ajax
+ * @return {jqXHR}
+ */
+
+/**
+ * @class jQuery.Event
+ */
+
+/**
+ * @class jQuery.Promise
+ */
+
+/**
+ * @class jQuery.Deferred
+ * @mixins jQuery.Promise
+ */
+
+/**
+ * @class jQuery.jqXHR
+ * @alternateClassName jqXHR
+ */
index 33163d4..c03162c 100644 (file)
  * @ingroup MaintenanceLanguage
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
-
 require_once( __DIR__ . '/../../includes/normal/UtfNormalUtil.php' );
 
+require_once( __DIR__ . '/../Maintenance.php' );
+
 /**
  * Generates normalizer data files for Arabic and Malayalam.
  * For NFC see includes/normal.
index 3b2292f..66cc1dc 100644 (file)
@@ -181,6 +181,7 @@ $wgIgnoredMessages = array(
        'deadendpages-summary',
        'protectedpages-summary',
        'disambiguations-summary',
+       'pageswithprop-summary',
        'doubleredirects-summary',
        'lonelypages-summary',
        'unusedtemplates-summary',
index e2997c4..0d6de10 100644 (file)
@@ -1637,6 +1637,13 @@ $wgMessageStructure = array(
                'disambiguationspage',
                'disambiguations-text',
        ),
+       'pageswithprop' => array(
+               'pageswithprop',
+               'pageswithprop-summary',
+               'pageswithprop-text',
+               'pageswithprop-prop',
+               'pageswithprop-ok',
+       ),
        'doubleredirects' => array(
                'doubleredirects',
                'doubleredirects-summary',
@@ -3928,6 +3935,7 @@ XHTML id names.",
        'randomredirect'      => 'Random redirect',
        'statistics'          => 'Statistics',
        'disambiguations'     => '',
+       'pageswithprop'       => '',
        'doubleredirects'     => '',
        'brokenredirects'     => '',
        'withoutinterwiki'    => '',
index 751e744..4f00496 100644 (file)
  * @ingroup MaintenanceLanguage
  */
 
+if ( PHP_SAPI != 'cli' ) {
+       die( "Run me from the command line please.\n" );
+}
+
 if ( !isset( $argv[1] ) ) {
        print "Usage: php {$argv[0]} <filename>\n";
        exit( 1 );
diff --git a/maintenance/mwjsduck-gen b/maintenance/mwjsduck-gen
new file mode 100755 (executable)
index 0000000..fbd428f
--- /dev/null
@@ -0,0 +1,2 @@
+#!/usr/bin/env sh
+jsduck --config=$(cd $(dirname $0)/..; pwd)/maintenance/jsduck/config.json && echo 'JSDuck execution finished.'
index fc38938..6cc8566 100644 (file)
@@ -37,51 +37,27 @@ class nextJobDB extends Maintenance {
        }
 
        public function execute() {
-               global $wgMemc;
+               global $wgMemc, $wgJobTypesExcludedFromDefaultQueue;
 
                $type = false; // job type required/picked
+
                if ( $this->hasOption( 'types' ) ) {
                        $types = explode( ' ', $this->getOption( 'types' ) );
                } elseif ( $this->hasOption( 'type' ) ) {
                        $types = array( $this->getOption( 'type' ) );
                } else {
-                       $types = JobQueueGroup::singleton()->getDefaultQueueTypes();
+                       $types = false;
                }
 
                // Handle any required periodic queue maintenance
                $this->executeReadyPeriodicTasks();
 
-               $memcKey = 'jobqueue:dbs:v3';
-               $pendingDbInfo = $wgMemc->get( $memcKey );
-
-               // If the cache entry wasn't present, is stale, or in .1% of cases otherwise,
-               // regenerate the cache. Use any available stale cache if another process is
-               // currently regenerating the pending DB information.
-               if ( !is_array( $pendingDbInfo )
-                       || ( time() - $pendingDbInfo['timestamp'] ) > 300 // 5 minutes
-                       || mt_rand( 0, 999 ) == 0
-               ) {
-                       if ( $wgMemc->add( "$memcKey:rebuild", 1, 1800 ) ) { // lock
-                               $pendingDbInfo = array(
-                                       'pendingDBs' => $this->getPendingDbs(),
-                                       'timestamp'  => time()
-                               );
-                               for ( $attempts=1; $attempts <= 25; ++$attempts ) {
-                                       if ( $wgMemc->add( "$memcKey:lock", 1, 60 ) ) { // lock
-                                               $wgMemc->set( $memcKey, $pendingDbInfo );
-                                               $wgMemc->delete( "$memcKey:lock" ); // unlock
-                                               break;
-                                       }
-                               }
-                               $wgMemc->delete( "$memcKey:rebuild" ); // unlock
-                       }
-               }
-
-               if ( !is_array( $pendingDbInfo ) || !$pendingDbInfo['pendingDBs'] ) {
+               // Get all the queues with jobs in them
+               $pendingDBs = JobQueueAggregator::singleton()->getAllReadyWikiQueues();
+               if ( !count( $pendingDBs ) ) {
                        return; // no DBs with jobs or cache is both empty and locked
                }
 
-               $pendingDBs = $pendingDbInfo['pendingDBs']; // convenience
                do {
                        $again = false;
 
@@ -89,7 +65,10 @@ class nextJobDB extends Maintenance {
                        // Flatten the tree of candidates into a flat list so that a random
                        // item can be selected, weighing each queue (type/db tuple) equally.
                        foreach ( $pendingDBs as $type => $dbs ) {
-                               if ( in_array( $type, $types ) ) {
+                               if (
+                                       ( is_array( $types ) && in_array( $type, $types ) ) ||
+                                       ( $types === false && !in_array( $type, $wgJobTypesExcludedFromDefaultQueue ) )
+                               ) {
                                        foreach ( $dbs as $db ) {
                                                $candidates[] = array( $type, $db );
                                        }
@@ -101,20 +80,8 @@ class nextJobDB extends Maintenance {
 
                        list( $type, $db ) = $candidates[ mt_rand( 0, count( $candidates ) - 1 ) ];
                        if ( !$this->checkJob( $type, $db ) ) { // queue is actually empty?
-                               $pendingDBs = $this->delistDB( $pendingDBs, $db, $type );
-                               // Update the cache to remove the outdated information.
-                               // Make sure that this does not race (especially with full rebuilds).
-                               if ( $wgMemc->add( "$memcKey:lock", 1, 60 ) ) { // lock
-                                       $curInfo = $wgMemc->get( $memcKey );
-                                       if ( is_array( $curInfo ) ) {
-                                               $curInfo['pendingDBs'] =
-                                                       $this->delistDB( $curInfo['pendingDBs'], $db, $type );
-                                               $wgMemc->set( $memcKey, $curInfo );
-                                               // May as well make use of this newer information
-                                               $pendingDBs = $curInfo['pendingDBs'];
-                                       }
-                                       $wgMemc->delete( "$memcKey:lock" ); // unlock
-                               }
+                               $pendingDBs[$type] = array_diff( $pendingDBs[$type], $db );
+                               JobQueueAggregator::singleton()->notifyQueueEmpty( $db, $type );
                                $again = true;
                        }
                } while ( $again );
@@ -126,19 +93,6 @@ class nextJobDB extends Maintenance {
                }
        }
 
-       /**
-        * Remove a type/DB entry from the list of queues with jobs
-        *
-        * @param $pendingDBs array
-        * @param $db string
-        * @param $type string
-        * @return Array
-        */
-       private function delistDB( array $pendingDBs, $db, $type ) {
-               $pendingDBs[$type] = array_diff( $pendingDBs[$type], array( $db ) );
-               return $pendingDBs;
-       }
-
        /**
         * Check if the specified database has a job of the specified type in it.
         * The type may be false to indicate "all".
@@ -150,23 +104,6 @@ class nextJobDB extends Maintenance {
                return !JobQueueGroup::singleton( $dbName )->get( $type )->isEmpty();
        }
 
-       /**
-        * Get all databases that have a pending job
-        * @return array
-        */
-       private function getPendingDbs() {
-               global $wgLocalDatabases;
-
-               $pendingDBs = array(); // (job type => (db list))
-               foreach ( $wgLocalDatabases as $db ) {
-                       foreach ( JobQueueGroup::singleton( $db )->getQueuesWithJobs() as $type ) {
-                               $pendingDBs[$type][] = $db;
-                       }
-               }
-
-               return $pendingDBs;
-       }
-
        /**
         * Do all ready periodic jobs for all databases every 5 minutes (and .1% of the time)
         * @return integer
index cb3df8d..9cbabfd 100644 (file)
@@ -154,6 +154,7 @@ CREATE TABLE page_props (
 );
 ALTER TABLE page_props ADD CONSTRAINT page_props_pk PRIMARY KEY (pp_page,pp_propname);
 CREATE INDEX page_props_propname ON page_props (pp_propname);
+CREATE UNIQUE INDEX pp_propname_page ON page_props (pp_propname,pp_page);
 
 CREATE TABLE archive (
   ar_namespace      SMALLINT     NOT NULL,
index ff09683..f9557ce 100644 (file)
@@ -85,35 +85,39 @@ class RunJobs extends Maintenance {
                do {
                        $job = ( $type === false )
                                ? $group->pop( JobQueueGroup::TYPE_DEFAULT, JobQueueGroup::USE_CACHE )
-                               : $group->get( $type )->pop(); // job from a single queue
+                               : $group->pop( $type ); // job from a single queue
                        if ( $job ) { // found a job
-                               // Perform the job (logging success/failure and runtime)...
-                               $t = microtime( true );
                                $this->runJobsLog( $job->toString() . " STARTING" );
 
-                               $status = $job->run();
-                               if ( !is_bool( $status ) ) {
-                                       wfWarn( $job->getType() . " job failed to return a boolean." );
-                                       $status = true; // sanity
+                               // Run the job...
+                               $t = microtime( true );
+                               try {
+                                       $status = $job->run();
+                                       $error = $job->getLastError();
+                               } catch ( MWException $e ) {
+                                       $status = false;
+                                       $error = get_class( $e ) . ': ' . $e->getMessage();
                                }
-                               if ( $status || !$job->allowRetries() ) {
+                               $timeMs = intval( ( microtime( true ) - $t ) * 1000 );
+
+                               // Mark the job as done on success or when the job cannot be retried
+                               if ( $status !== false || !$job->allowRetries() ) {
                                        $group->ack( $job ); // done
                                }
 
-                               $t = microtime( true ) - $t;
-                               $timeMs = intval( $t * 1000 );
                                if ( !$status ) {
-                                       $this->runJobsLog( $job->toString() . " t=$timeMs error={$job->error}" );
+                                       $this->runJobsLog( $job->toString() . " t=$timeMs error={$error}" );
                                } else {
                                        $this->runJobsLog( $job->toString() . " t=$timeMs good" );
                                }
+
                                // Break out if we hit the job count or wall time limits...
                                if ( $maxJobs && ++$n >= $maxJobs ) {
                                        break;
-                               }
-                               if ( $maxTime && ( time() - $startTime ) > $maxTime ) {
+                               } elseif ( $maxTime && ( time() - $startTime ) > $maxTime ) {
                                        break;
                                }
+
                                // Don't let any slaves/backups fall behind...
                                $group->get( $job->getType() )->waitForBackups();
                        }
index 9b0b576..1169990 100644 (file)
@@ -33,13 +33,19 @@ class MwSql extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Send SQL queries to a MediaWiki database";
+               $this->addOption( 'cluster', 'Use an external cluster by name', false, true );
        }
 
        public function execute() {
-               $dbw = wfGetDB( DB_MASTER );
-               if ( $this->hasArg() ) {
-                       $fileName = $this->getArg();
-                       $file = fopen( $fileName, 'r' );
+               // Get a DB handle (with this wiki's DB select) from the appropriate load balancer
+               if ( $this->hasOption( 'cluster' ) ) {
+                       $lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ) );
+                       $dbw = $lb->getConnection( DB_MASTER ); // master for external LB
+               } else {
+                       $dbw = wfGetDB( DB_MASTER ); // master for primary LB for this wiki
+               }
+               if ( $this->hasArg( 0 ) ) {
+                       $file = fopen( $this->getArg( 0 ), 'r' );
                        if ( !$file ) {
                                $this->error( "Unable to open input file", true );
                        }
@@ -95,6 +101,7 @@ class MwSql extends Maintenance {
                                $this->error( $e, $doDie );
                        }
                }
+               wfWaitForSlaves();
        }
 
        /**
index 623dd7b..979e68a 100644 (file)
@@ -4,5 +4,4 @@ CREATE TABLE /*$wgDBprefix*/blobs (
        blob_id integer UNSIGNED NOT NULL AUTO_INCREMENT,
        blob_text longblob,
        PRIMARY KEY  (blob_id)
-) ENGINE=MyISAM MAX_ROWS=100000000 AVG_ROW_LENGTH=100000;
-
+) ENGINE=InnoDB;
index 14d7422..97d6ff2 100644 (file)
@@ -1417,6 +1417,7 @@ CREATE TABLE /*_*/page_props (
 ) /*$wgDBTableOptions*/;
 
 CREATE UNIQUE INDEX /*i*/pp_page_propname ON /*_*/page_props (pp_page,pp_propname);
+CREATE UNIQUE INDEX /*i*/pp_propname_page ON /*_*/page_props (pp_propname,pp_page);
 
 
 -- A table to log updates, one text key row per update.
index 3e786ec..d9a2b19 100644 (file)
@@ -1,9 +1,31 @@
 /**
- * Simple Placeholder-based Localization
+ * @class jQuery.plugin.localize
+ */
+( function ( $, mw ) {
+
+/**
+ * Gets a localized message, using parameters from options if present.
+ * @ignore
+ *
+ * @param {Object} options
+ * @param {string} key
+ * @returns {string} Localized message
+ */
+function msg( options, key ) {
+       var args = options.params[key] || [];
+       // Format: mw.msg( key [, p1, p2, ...] )
+       args.unshift( options.prefix + ( options.keys[key] || key ) );
+       return mw.msg.apply( mw, args );
+}
+
+/**
+ * Localizes a DOM selection by replacing <html:msg /> elements with localized text and adding
+ * localized title and alt attributes to elements with title-msg and alt-msg attributes
+ * respectively.
  *
- * Call on a selection of HTML which contains <html:msg key="message-key" /> elements or elements
+ * Call on a selection of HTML which contains `<html:msg key="message-key" />` elements or elements
  * with title-msg="message-key", alt-msg="message-key" or placeholder-msg="message-key" attributes.
- * <html:msg /> elements will be replaced with localized text, *-msg attributes will be replaced
+ * `<html:msg />` elements will be replaced with localized text, *-msg attributes will be replaced
  * with attributes that do not have the "-msg" suffix and contain a localized message.
  *
  * Example:
  * Appends something like this to the body...
  *     <p>You may not get there all in one piece.</p>
  *
- */
-( function ( $, mw ) {
-
-/**
- * Gets a localized message, using parameters from options if present.
- *
- * @function
- * @param {String} key Message key to get localized message for
- * @returns {String} Localized message
- */
-function msg( options, key ) {
-       var args = options.params[key] || [];
-       // Format: mw.msg( key [, p1, p2, ...] )
-       args.unshift( options.prefix + ( options.keys[key] || key ) );
-       return mw.msg.apply( mw, args );
-}
-
-/**
- * Localizes a DOM selection by replacing <html:msg /> elements with localized text and adding
- * localized title and alt attributes to elements with title-msg and alt-msg attributes
- * respectively.
- *
  * @method
  * @param {Object} options Map of options to be used while localizing
- * @param {String} options.prefix String to prepend to all message keys
+ * @param {string} options.prefix String to prepend to all message keys
  * @param {Object} options.keys Message key aliases, used for remapping keys to a template
  * @param {Object} options.params Lists of parameters to use with certain message keys
- * @returns {jQuery} This selection
+ * @return {jQuery}
  */
 $.fn.localize = function ( options ) {
        var $target = this,
@@ -162,4 +162,9 @@ $.fn.localize = function ( options ) {
 // Let IE know about the msg tag before it's used...
 document.createElement( 'msg' );
 
+/**
+ * @class jQuery
+ * @mixins jQuery.plugin.localize
+ */
+
 }( jQuery, mediaWiki ) );
index 3448b7a..44382f0 100644 (file)
@@ -309,11 +309,11 @@ $.suggestions = {
                var selected = context.data.$container.find( '.suggestions-result-current' );
                if ( !result.get || selected.get( 0 ) !== result.get( 0 ) ) {
                        if ( result === 'prev' ) {
-                               if( selected.is( '.suggestions-special' ) ) {
+                               if( selected.hasClass( 'suggestions-special' ) ) {
                                        result = context.data.$container.find( '.suggestions-result:last' );
                                } else {
                                        result = selected.prev();
-                                       if ( !( result.length && result.hasClass( '.suggestions-result' ) ) ) {
+                                       if ( !( result.length && result.hasClass( 'suggestions-result' ) ) ) {
                                                // there is something in the DOM between selected element and the wrapper, bypass it
                                                result = selected.parents( '.suggestions-results > *' ).prev().find( '.suggestions-result' ).eq(0);
                                        }
@@ -337,12 +337,12 @@ $.suggestions = {
                                        }
                                } else {
                                        result = selected.next();
-                                       if ( !( result.length && result.hasClass( '.suggestions-result' ) ) ) {
+                                       if ( !( result.length && result.hasClass( 'suggestions-result' ) ) ) {
                                                // there is something in the DOM between selected element and the wrapper, bypass it
                                                result = selected.parents( '.suggestions-results > *' ).next().find( '.suggestions-result' ).eq(0);
                                        }
 
-                                       if ( selected.is( '.suggestions-special' ) ) {
+                                       if ( selected.hasClass( 'suggestions-special' ) ) {
                                                result = $( [] );
                                        } else if (
                                                result.length === 0 &&
index cc6f704..4de5291 100644 (file)
 /**
- * Additional mw.Api methods to assist with API calls related to categories.
+ * @class mw.Api.plugin.category
  */
 ( function ( mw, $ ) {
 
        $.extend( mw.Api.prototype, {
                /**
                 * Determine if a category exists.
-                * @param title {mw.Title}
-                * @param success {Function} callback to pass boolean of category's existence
-                * @param err {Function} optional callback to run if api error
-                * @return ajax call object
+                * @param {mw.Title} title
+                * @param {Function} [ok] Success callback (deprecated)
+                * @param {Function} [err] Error callback (deprecated)
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {boolean} return.done.isCategory Whether the category exists.
                 */
-               isCategory: function ( title, success, err ) {
-                       var params, ok;
-                       params = {
-                               prop: 'categoryinfo',
-                               titles: title.toString()
-                       };
-                       ok = function ( data ) {
-                               var exists = false;
-                               if ( data.query && data.query.pages ) {
-                                       $.each( data.query.pages, function ( id, page ) {
-                                               if ( page.categoryinfo ) {
-                                                       exists = true;
-                                               }
-                                       } );
-                               }
-                               success( exists );
-                       };
+               isCategory: function ( title, ok, err ) {
+                       var d = $.Deferred();
+                       // Backwards compatibility (< MW 1.20)
+                       d.done( ok );
+                       d.fail( err );
 
-                       return this.get( params, { ok: ok, err: err } );
+                       this.get( {
+                                       prop: 'categoryinfo',
+                                       titles: title.toString()
+                               } )
+                               .done( function ( data ) {
+                                       var exists = false;
+                                       if ( data.query && data.query.pages ) {
+                                               $.each( data.query.pages, function ( id, page ) {
+                                                       if ( page.categoryinfo ) {
+                                                               exists = true;
+                                                       }
+                                               } );
+                                       }
+                                       d.resolve( exists );
+                               })
+                               .fail( d.reject );
+
+                       return d.promise();
                },
 
                /**
                 * Get a list of categories that match a certain prefix.
                 *   e.g. given "Foo", return "Food", "Foolish people", "Foosball tables" ...
-                * @param prefix {String} prefix to match
-                * @param success {Function} callback to pass matched categories to
-                * @param err {Function} optional callback to run if api error
-                * @return {jqXHR}
+                * @param {string} prefix Prefix to match.
+                * @param {Function} [ok] Success callback (deprecated)
+                * @param {Function} [err] Error callback (deprecated)
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {String[]} return.done.categories Matched categories
                 */
-               getCategoriesByPrefix: function ( prefix, success, err ) {
+               getCategoriesByPrefix: function ( prefix, ok, err ) {
+                       var d = $.Deferred();
+                       // Backwards compatibility (< MW 1.20)
+                       d.done( ok );
+                       d.fail( err );
+
                        // Fetch with allpages to only get categories that have a corresponding description page.
-                       var params, ok;
-                       params = {
-                               'list': 'allpages',
-                               'apprefix': prefix,
-                               'apnamespace': mw.config.get('wgNamespaceIds').category
-                       };
-                       ok = function ( data ) {
-                               var texts = [];
-                               if ( data.query && data.query.allpages ) {
-                                       $.each( data.query.allpages, function ( i, category ) {
-                                               texts.push( new mw.Title( category.title ).getNameText() );
-                                       } );
-                               }
-                               success( texts );
-                       };
+                       this.get( {
+                                       list: 'allpages',
+                                       apprefix: prefix,
+                                       apnamespace: mw.config.get('wgNamespaceIds').category
+                               } )
+                               .done( function ( data ) {
+                                       var texts = [];
+                                       if ( data.query && data.query.allpages ) {
+                                               $.each( data.query.allpages, function ( i, category ) {
+                                                       texts.push( new mw.Title( category.title ).getNameText() );
+                                               } );
+                                       }
+                                       d.resolve( texts );
+                               })
+                               .fail( d.reject );
 
-                       return this.get( params, { ok: ok, err: err } );
+                       return d.promise();
                },
 
 
                /**
                 * Get the categories that a particular page on the wiki belongs to
-                * @param title {mw.Title}
-                * @param success {Function} callback to pass categories to (or false, if title not found)
-                * @param err {Function} optional callback to run if api error
-                * @param async {Boolean} optional asynchronousness (default = true = async)
-                * @return {jqXHR}
+                * @param {mw.Title} title
+                * @param {Function} [ok] Success callback (deprecated)
+                * @param {Function} [err] Error callback (deprecated)
+                * @param {boolean} [async=true] Asynchronousness
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {boolean|mw.Title[]} return.done.categories List of category titles or false
+                *  if title was not found.
                 */
-               getCategories: function ( title, success, err, async ) {
-                       var params, ok;
-                       params = {
-                               prop: 'categories',
-                               titles: title.toString()
-                       };
-                       if ( async === undefined ) {
-                               async = true;
-                       }
-                       ok = function ( data ) {
-                               var ret = false;
-                               if ( data.query && data.query.pages ) {
-                                       $.each( data.query.pages, function ( id, page ) {
-                                               if ( page.categories ) {
-                                                       if ( typeof ret !== 'object' ) {
-                                                               ret = [];
+               getCategories: function ( title, ok, err, async ) {
+                       var d = $.Deferred();
+                       // Backwards compatibility (< MW 1.20)
+                       d.done( ok );
+                       d.fail( err );
+
+                       this.get( {
+                                       prop: 'categories',
+                                       titles: title.toString()
+                               }, {
+                                       async: async === undefined ? true : async
+                               } )
+                               .done( function ( data ) {
+                                       var ret = false;
+                                       if ( data.query && data.query.pages ) {
+                                               $.each( data.query.pages, function ( id, page ) {
+                                                       if ( page.categories ) {
+                                                               if ( typeof ret !== 'object' ) {
+                                                                       ret = [];
+                                                               }
+                                                               $.each( page.categories, function ( i, cat ) {
+                                                                       ret.push( new mw.Title( cat.title ) );
+                                                               } );
                                                        }
-                                                       $.each( page.categories, function ( i, cat ) {
-                                                               ret.push( new mw.Title( cat.title ) );
-                                                       } );
-                                               }
-                                       } );
-                               }
-                               success( ret );
-                       };
+                                               } );
+                                       }
+                                       d.resolve( ret );
+                               })
+                               .fail( d.reject );
 
-                       return this.get( params, { ok: ok, err: err, async: async } );
+                       return d.promise();
                }
 
        } );
 
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.category
+        */
+
 }( mediaWiki, jQuery ) );
index 49af937..3c775ad 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Additional mw.Api methods to assist with API calls related to editing wiki pages.
+ * @class mw.Api.plugin.edit
  */
 ( function ( mw, $ ) {
 
                 * If we have a cached token try using that, and if it fails, blank out the
                 * cached token and start over.
                 *
-                * @param params {Object} API parameters
-                * @param ok {Function} callback for success
-                * @param err {Function} [optional] error callback
-                * @return {jqXHR}
+                * @param {Object} params API parameters
+                * @param {Function} [ok] Success callback (deprecated)
+                * @param {Function} [err] Error callback (deprecated)
+                * @return {jQuery.Promise} See #post
                 */
                postWithEditToken: function ( params, ok, err ) {
                        var useTokenToPost, getTokenIfBad,
                },
 
                /**
-                * Api helper to grab an edit token
+                * Api helper to grab an edit token.
                 *
-                * token callback has signature ( String token )
-                * error callback has signature ( String code, Object results, XmlHttpRequest xhr, Exception exception )
-                * Note that xhr and exception are only available for 'http_*' errors
-                *  code may be any http_* error code (see mw.Api), or 'token_missing'
-                *
-                * @param tokenCallback {Function} received token callback
-                * @param err {Function} error callback
-                * @return {jqXHR}
+                * @param {Function} [ok] Success callback
+                * @param {Function} [err] Error callback
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {string} return.done.token Received token.
                 */
-               getEditToken: function ( tokenCallback, err ) {
-                       var parameters = {
+               getEditToken: function ( ok, err ) {
+                       var d = $.Deferred();
+                       // Backwards compatibility (< MW 1.20)
+                       d.done( ok );
+                       d.fail( err );
+
+                       this.get( {
                                        action: 'tokens',
                                        type: 'edit'
-                               },
-                               ok = function ( data ) {
+                               }, {
+                                       // Due to the API assuming we're logged out if we pass the callback-parameter,
+                                       // we have to disable jQuery's callback system, and instead parse JSON string,
+                                       // by setting 'jsonp' to false.
+                                       // TODO: This concern seems genuine but no other module has it. Is it still
+                                       // needed and/or should we pass this by default?
+                                       jsonp: false
+                               } )
+                               .done( function ( data ) {
                                        var token;
                                        // If token type is not available for this user,
                                        // key 'edittoken' is missing or can contain Boolean false
                                        if ( data.tokens && data.tokens.edittoken ) {
                                                token = data.tokens.edittoken;
                                                cachedToken = token;
-                                               tokenCallback( token );
+                                               d.resolve( token );
                                        } else {
-                                               err( 'token-missing', data );
+                                               d.reject( 'token-missing', data );
                                        }
-                               },
-                               ajaxOptions = {
-                                       ok: ok,
-                                       err: err,
-                                       // Due to the API assuming we're logged out if we pass the callback-parameter,
-                                       // we have to disable jQuery's callback system, and instead parse JSON string,
-                                       // by setting 'jsonp' to false.
-                                       jsonp: false
-                               };
+                               })
+                               .fail( d.reject );
 
-                       return this.get( parameters, ajaxOptions );
+                       return d.promise();
                },
 
                /**
                 * Create a new section of the page.
-                * @param title {mw.Title|String} target page
-                * @param header {String}
-                * @param message {String} wikitext message
-                * @param ok {Function} success handler
-                * @param err {Function} error handler
-                * @return {jqXHR}
+                * @see #postWithEditToken
+                * @param {mw.Title|String} title Target page
+                * @param {string} header
+                * @param {string} message wikitext message
+                * @param {Function} [ok] Success handler
+                * @param {Function} [err] Error handler
+                * @return {jQuery.Promise}
                 */
                newSection: function ( title, header, message, ok, err ) {
-                       var params = {
+                       return this.postWithEditToken( {
                                action: 'edit',
                                section: 'new',
                                format: 'json',
                                title: title.toString(),
                                summary: header,
                                text: message
-                       };
-                       return this.postWithEditToken( params, ok, err );
+                       }, ok, err );
                }
 
         } );
 
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.edit
+        */
+
 }( mediaWiki, jQuery ) );
index a184e3c..cf7443f 100644 (file)
@@ -1,15 +1,9 @@
-/**
- * mw.Api objects represent the API of a particular MediaWiki server.
- */
 ( function ( mw, $ ) {
 
-       /**
-        * @var defaultOptions {Object}
-        * We allow people to omit these default parameters from API requests
-        * there is very customizable error handling here, on a per-call basis
-        * wondering, would it be simpler to make it easy to clone the api object,
-        * change error handling, and use that instead?
-        */
+       // We allow people to omit these default parameters from API requests
+       // there is very customizable error handling here, on a per-call basis
+       // wondering, would it be simpler to make it easy to clone the api object,
+       // change error handling, and use that instead?
        var defaultOptions = {
 
                        // Query parameters for API requests
 
        /**
         * Constructor to create an object to interact with the API of a particular MediaWiki server.
+        * mw.Api objects represent the API of a particular MediaWiki server.
+        *
+        * TODO: Share API objects with exact same config.
         *
-        * @todo Share API objects with exact same config.
-        * @example
-        * <code>
-        * var api = new mw.Api();
-        * api.get( {
-        *     action: 'query',
-        *     meta: 'userinfo'
-        * }, {
-        *     ok: function () { console.log( arguments ); }
-        * } );
-        * </code>
+        *     var api = new mw.Api();
+        *     api.get( {
+        *         action: 'query',
+        *         meta: 'userinfo'
+        *     } ).done ( function ( data ) {
+        *         console.log( data );
+        *     } );
+        *
+        * @class
         *
         * @constructor
-        * @param options {Object} See defaultOptions documentation above. Ajax options can also be
-        * overridden for each individual request to jQuery.ajax() later on.
+        * @param {Object} options See defaultOptions documentation above. Ajax options can also be
+        *  overridden for each individual request to {@link jQuery#ajax} later on.
         */
        mw.Api = function ( options ) {
 
                /**
                 * Normalize the ajax options for compatibility and/or convenience methods.
                 *
-                * @param {undefined|Object|Function} An object contaning one or more of options.ajax,
-                * or just a success function (options.ajax.ok).
+                * @param {Object} [arg] An object contaning one or more of options.ajax.
                 * @return {Object} Normalized ajax options.
                 */
                normalizeAjaxOptions: function ( arg ) {
                        // Arg argument is usually empty
-                       // (before MW 1.20 it was often used to pass ok/err callbacks)
+                       // (before MW 1.20 it was used to pass ok callbacks)
                        var opts = arg || {};
                        // Options can also be a success callback handler
                        if ( typeof arg === 'function' ) {
@@ -87,8 +81,8 @@
                /**
                 * Perform API get request
                 *
-                * @param {Object} request parameters
-                * @param {Object|Function} [optional] ajax options
+                * @param {Object} parameters
+                * @param {Object|Function} [ajaxOptions]
                 * @return {jQuery.Promise}
                 */
                get: function ( parameters, ajaxOptions ) {
 
                /**
                 * Perform API post request
-                * @todo Post actions for nonlocal will need proxy
                 *
-                * @param {Object} request parameters
-                * @param {Object|Function} [optional] ajax options
+                * TODO: Post actions for non-local hostnames will need proxy.
+                *
+                * @param {Object} parameters
+                * @param {Object|Function} [ajaxOptions]
                 * @return {jQuery.Promise}
                 */
                post: function ( parameters, ajaxOptions ) {
                /**
                 * Perform the API call.
                 *
-                * @param {Object} request parameters
-                * @param {Object} ajax options
-                * @return {jQuery.Promise}
-                * - done: API response data as first argument
-                * - fail: errorcode as first arg, details (string or object) as second arg.
+                * @param {Object} parameters
+                * @param {Object} [ajaxOptions]
+                * @return {jQuery.Promise} Done: API response data. Fail: Error code
                 */
                ajax: function ( parameters, ajaxOptions ) {
                        var token,
        };
 
        /**
-        * @var {Array} List of errors we might receive from the API.
+        * @static
+        * @property {Array}
+        * List of errors we might receive from the API.
         * For now, this just documents our expectation that there should be similar messages
         * available.
         */
        ];
 
        /**
-        * @var {Array} List of warnings we might receive from the API.
+        * @static
+        * @property {Array}
+        * List of warnings we might receive from the API.
         * For now, this just documents our expectation that there should be similar messages
         * available.
         */
index e8d1b3e..ea0388c 100644 (file)
@@ -1,42 +1,43 @@
 /**
- * mw.Api methods for parsing wikitext.
+ * @class mw.Api.plugin.parse
  */
 ( function ( mw, $ ) {
 
        $.extend( mw.Api.prototype, {
                /**
-                * Convinience method for 'action=parse'. Parses wikitext into HTML.
+                * Convinience method for 'action=parse'.
                 *
-                * @param wikiText {String}
-                * @param ok {Function} [optional] deprecated (success callback)
-                * @param err {Function} [optional] deprecated (error callback)
+                * @param {string} wikitext
+                * @param {Function} [ok] Success callback (deprecated)
+                * @param {Function} [err] Error callback (deprecated)
                 * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {string} return.done.data Parsed HTML of `wikitext`.
                 */
-               parse: function ( wikiText, ok, err ) {
-                       var apiDeferred = $.Deferred();
-
+               parse: function ( wikitext, ok, err ) {
+                       var d = $.Deferred();
                        // Backwards compatibility (< MW 1.20)
-                       if ( ok ) {
-                               apiDeferred.done( ok );
-                       }
-                       if ( err ) {
-                               apiDeferred.fail( err );
-                       }
+                       d.done( ok );
+                       d.fail( err );
 
                        this.get( {
                                        action: 'parse',
-                                       text: wikiText
+                                       text: wikitext
                                } )
                                .done( function ( data ) {
                                        if ( data.parse && data.parse.text && data.parse.text['*'] ) {
-                                               apiDeferred.resolve( data.parse.text['*'] );
+                                               d.resolve( data.parse.text['*'] );
                                        }
                                } )
-                               .fail( apiDeferred.reject );
+                               .fail( d.reject );
 
-                       // Return the promise
-                       return apiDeferred.promise();
+                       return d.promise();
                }
        } );
 
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.parse
+        */
+
 }( mediaWiki, jQuery ) );
index 1f7e275..8c46717 100644 (file)
@@ -1,33 +1,39 @@
 /**
- * Additional mw.Api methods to assist with API calls to the API module of the TitleBlacklist extension.
+ * @class mw.Api.plugin.titleblacklist
  */
-
 ( function ( mw, $ ) {
 
        $.extend( mw.Api.prototype, {
                /**
-                * Convinience method for 'action=titleblacklist'.
+                * Convinience method for `action=titleblacklist`.
                 * Note: This action is not provided by MediaWiki core, but as part of the TitleBlacklist extension.
                 *
-                * @param title {mw.Title}
-                * @param success {Function} Called on successfull request. First argument is false if title wasn't blacklisted,
-                *  object with 'reason', 'line' and 'message' properties if title was blacklisted.
-                * @param err {Function} optional callback to run if api error
-                * @return {jqXHR}
+                * @param {mw.Title|string} title
+                * @param {Function} [ok] Success callback (deprecated)
+                * @param {Function} [err] Error callback (deprecated)
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {Object|boolean} return.done.result False if title wasn't blacklisted, an object with 'reason', 'line'
+                *  and 'message' properties if title was blacklisted.
                 */
-               isBlacklisted: function ( title, success, err ) {
-                       var     params = {
+               isBlacklisted: function ( title, ok, err ) {
+                       var d = $.Deferred();
+                       // Backwards compatibility (< MW 1.20)
+                       d.done( ok );
+                       d.fail( err );
+
+                       this.get( {
                                        action: 'titleblacklist',
                                        tbaction: 'create',
                                        tbtitle: title.toString()
-                               },
-                               ok = function ( data ) {
+                               } )
+                               .done( function ( data ) {
                                        var result;
 
                                        // this fails open (if nothing valid is returned by the api, allows the title)
                                        // also fails open when the API is not present, which will be most of the time
                                        // as this API module is part of the TitleBlacklist extension.
-                                       if ( data.titleblacklist && data.titleblacklist.result && data.titleblacklist.result === 'blacklisted') {
+                                       if ( data.titleblacklist && data.titleblacklist.result && data.titleblacklist.result === 'blacklisted' ) {
                                                if ( data.titleblacklist.reason ) {
                                                        result = {
                                                                reason: data.titleblacklist.reason,
                                                                message: data.titleblacklist.message
                                                        };
                                                } else {
-                                                       mw.log('mw.Api.titleblacklist::isBlacklisted> no reason data for blacklisted title', 'debug');
-                                                       result = { reason: 'Blacklisted, but no reason supplied', line: 'Unknown', message: null };
+                                                       mw.log( 'mw.Api.titleblacklist::isBlacklisted> no reason data for blacklisted title', 'debug' );
+                                                       result = {
+                                                               reason: 'Blacklisted, but no reason supplied',
+                                                               line: 'Unknown',
+                                                               message: null
+                                                       };
                                                }
-                                               success( result );
+                                               d.resolve( result );
                                        } else {
-                                               success ( false );
+                                               d.resolve( false );
                                        }
-                               };
+                               } )
+                               .fail( d.reject );
 
-                       return this.get( params, { ok: ok, err: err } );
+                       return d.promise();
                }
 
        } );
 
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.titleblacklist
+        */
+
 }( mediaWiki, jQuery ) );
index 6cbccbf..c86a90a 100644 (file)
@@ -1,56 +1,72 @@
 /**
- * Additional mw.Api methods to assist with (un)watching wiki pages.
+ * @class mw.Api.plugin.watch
  * @since 1.19
  */
 ( function ( mw, $ ) {
 
        /**
-        * @context {mw.Api}
+        * @private
+        * @context mw.Api
+        *
+        * @param {String|mw.Title} page Full page name or instance of mw.Title
+        * @param {Function} [ok] Success callback (deprecated)
+        * @param {Function} [err] Error callback (deprecated)
+        * @return {jQuery.Promise}
+        * @return {Function} return.done
+        * @return {Object} return.done.watch
+        * @return {string} return.done.watch.title Full pagename
+        * @return {boolean} return.done.watch.watched
+        * @return {string} return.done.watch.message Parsed HTML of the confirmational interface message
         */
-       function doWatchInternal( page, success, err, addParams ) {
-               var params = {
+       function doWatchInternal( page, ok, err, addParams ) {
+               var params, d = $.Deferred();
+               // Backwards compatibility (< MW 1.20)
+               d.done( ok );
+               d.fail( err );
+
+               params = {
                        action: 'watch',
                        title: String( page ),
                        token: mw.user.tokens.get( 'watchToken' ),
                        uselang: mw.config.get( 'wgUserLanguage' )
                };
-               function ok( data ) {
-                       success( data.watch );
-               }
+
                if ( addParams ) {
                        $.extend( params, addParams );
                }
-               return this.post( params, { ok: ok, err: err } );
+
+               this.post( params )
+                       .done( function ( data ) {
+                               d.resolve( data.watch );
+                       } )
+                       .fail( d.reject );
+
+               return d.promise();
        }
 
        $.extend( mw.Api.prototype, {
                /**
-                * Convenience method for 'action=watch'.
+                * Convenience method for `action=watch`.
                 *
-                * @param page {String|mw.Title} Full page name or instance of mw.Title
-                * @param success {Function} Callback to which the watch object will be passed.
-                * Watch object contains properties 'title' (full pagename), 'watched' (boolean) and
-                * 'message' (parsed HTML of the 'addedwatchtext' message).
-                * @param err {Function} Error callback (optional)
-                * @return {jqXHR}
+                * @inheritdoc #doWatchInternal
                 */
-               watch: function ( page, success, err ) {
-                       return doWatchInternal.call( this, page, success, err );
+               watch: function ( page, ok, err ) {
+                       return doWatchInternal.call( this, page, ok, err );
                },
                /**
-                * Convenience method for 'action=watch&unwatch=1'.
+                * Convenience method for `action=watch&unwatch=1`.
                 *
-                * @param page {String|mw.Title} Full page name or instance of mw.Title
-                * @param success {Function} Callback to which the watch object will be passed.
-                * Watch object contains properties 'title' (full pagename), 'watched' (boolean) and
-                * 'message' (parsed HTML of the 'removedwatchtext' message).
-                * @param err {Function} Error callback (optional)
-                * @return {jqXHR}
+                * @inheritdoc #doWatchInternal
                 */
-               unwatch: function ( page, success, err ) {
-                       return doWatchInternal.call( this, page, success, err, { unwatch: 1 } );
+               unwatch: function ( page, ok, err ) {
+                       return doWatchInternal.call( this, page, ok, err, { unwatch: 1 } );
                }
 
        } );
 
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.watch
+        */
+
 }( mediaWiki, jQuery ) );
index b27dea4..1bc0632 100644 (file)
@@ -2,16 +2,20 @@
  * Russian (Русский) language functions
  */
 
+// These tests were originally made for names of Wikimedia
+// websites, so they don't currently cover all the possible
+// cases.
+
 mediaWiki.language.convertGrammar = function ( word, form ) {
-       /*jshint noempty:false, onecase:true */
+       'use strict';
+
        var grammarForms = mediaWiki.language.getData( 'ru', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
                return grammarForms[form][word];
        }
        switch ( form ) {
                case 'genitive': // родительный падеж
-                       if ( (  word.substr( word.length - 4 ) === 'вики' ) || (  word.substr( word.length - 4 ) === 'Вики' ) ) {
-                       } else if ( word.substr( word.length - 1 ) === 'ь' ) {
+                       if ( word.substr( word.length - 1 ) === 'ь' ) {
                                word = word.substr(0, word.length - 1 ) + 'я';
                        } else if ( word.substr( word.length - 2 ) === 'ия' ) {
                                word = word.substr(0, word.length - 2 ) + 'ии';
@@ -21,10 +25,29 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                                word = word.substr(0, word.length - 2 ) + 'тей';
                        } else if ( word.substr( word.length - 2 ) === 'ды' ) {
                                word = word.substr(0, word.length - 2 ) + 'дов';
+                       } else if ( word.substr( word.length - 3 ) === 'ные' ) {
+                               word = word.substr(0, word.length - 3 ) + 'ных';
                        } else if ( word.substr( word.length - 3 ) === 'ник' ) {
                                word = word.substr(0, word.length - 3 ) + 'ника';
                        }
                        break;
+               case 'prepositional': // предложный падеж
+                       if ( word.substr( word.length - 1 ) === 'ь' ) {
+                               word = word.substr(0, word.length - 1 ) + 'е';
+                       } else if ( word.substr( word.length - 2 ) === 'ия' ) {
+                               word = word.substr(0, word.length - 2 ) + 'ии';
+                       } else if ( word.substr( word.length - 2 ) === 'ка' ) {
+                               word = word.substr(0, word.length - 2 ) + 'ке';
+                       } else if ( word.substr( word.length - 2 )  === 'ти' ) {
+                               word = word.substr(0, word.length - 2 ) + 'тях';
+                       } else if ( word.substr( word.length - 2 ) === 'ды' ) {
+                               word = word.substr(0, word.length - 2 ) + 'дах';
+                       } else if ( word.substr( word.length - 3 ) === 'ные' ) {
+                               word = word.substr(0, word.length - 3 ) + 'ных';
+                       } else if ( word.substr( word.length - 3 ) === 'ник' ) {
+                               word = word.substr(0, word.length - 3 ) + 'нике';
+                       }
+                       break;
        }
        return word;
 };
index dad6021..b86a14b 100644 (file)
@@ -1,6 +1,4 @@
-/**
- * mediaWiki.Title
- *
+/*!
  * @author Neil Kandalgaonkar, 2010
  * @author Timo Tijhof, 2011
  * @since 1.18
        /* Local space */
 
        /**
-        * Title
-        * @constructor
+        * @class mw.Title
         *
-        * @param title {String} Title of the page. If no second argument given,
+        * @constructor
+        * @param {string} title Title of the page. If no second argument given,
         * this will be searched for a namespace.
-        * @param namespace {Number} (optional) Namespace id. If given, title will be taken as-is.
-        * @return {Title} this
+        * @param {number} [namespace] Namespace id. If given, title will be taken as-is.
         */
        function Title( title, namespace ) {
                this.ns = 0; // integer namespace id
        }
 
 var
-       /**
-        * Public methods (defined later)
-        */
+       /* Public methods (defined later) */
        fn,
 
        /**
         * Strip some illegal chars: control chars, colon, less than, greater than,
         * brackets, braces, pipe, whitespace and normal spaces. This still leaves some insanity
         * intact, like unicode bidi chars, but it's a good start..
-        * @param s {String}
-        * @return {String}
+        * @ignore
+        * @param {string} s
+        * @return {string}
         */
        clean = function ( s ) {
                if ( s !== undefined ) {
@@ -55,8 +51,9 @@ var
 
        /**
         * Convert db-key to readable text.
-        * @param s {String}
-        * @return {String}
+        * @ignore
+        * @param {string} s
+        * @return {string}
         */
        text = function ( s ) {
                if ( s !== null && s !== undefined ) {
@@ -68,13 +65,15 @@ var
 
        /**
         * Sanitize name.
+        * @ignore
         */
        fixName = function ( s ) {
                return clean( $.trim( s ) );
        },
 
        /**
-        * Sanitize name.
+        * Sanitize extension.
+        * @ignore
         */
        fixExt = function ( s ) {
                return clean( s );
@@ -82,6 +81,7 @@ var
 
        /**
         * Sanitize namespace id.
+        * @ignore
         * @param id {Number} Namespace id.
         * @return {Number|Boolean} The id as-is or boolean false if invalid.
         */
@@ -99,8 +99,8 @@ var
 
        /**
         * Get namespace id from namespace name by any known namespace/id pair (localized, canonical or alias).
-        *
-        * @example On a German wiki this would return 6 for any of 'File', 'Datei', 'Image' or even 'Bild'.
+        * Example: On a German wiki this would return 6 for any of 'File', 'Datei', 'Image' or even 'Bild'.
+        * @ignore
         * @param ns {String} Namespace name (case insensitive, leading/trailing space ignored).
         * @return {Number|Boolean} Namespace id or boolean false if unrecognized.
         */
@@ -125,8 +125,9 @@ var
        /**
         * Helper to extract namespace, name and extension from a string.
         *
-        * @param title {mw.Title}
-        * @param raw {String}
+        * @ignore
+        * @param {mw.Title} title
+        * @param {string} raw
         * @return {mw.Title}
         */
        setAll = function ( title, s ) {
@@ -153,8 +154,9 @@ var
        /**
         * Helper to extract name and extension from a string.
         *
-        * @param title {mw.Title}
-        * @param raw {String}
+        * @ignore
+        * @param {mw.Title} title
+        * @param {string} raw
         * @return {mw.Title}
         */
        setNameAndExtension = function ( title, raw ) {
@@ -179,8 +181,9 @@ var
 
        /**
         * Whether this title exists on the wiki.
-        * @param title {mixed} prefixed db-key name (string) or instance of Title
-        * @return {mixed} Boolean true/false if the information is available. Otherwise null.
+        * @static
+        * @param {Mixed} title prefixed db-key name (string) or instance of Title
+        * @return {Mixed} Boolean true/false if the information is available. Otherwise null.
         */
        Title.exists = function ( title ) {
                var type = $.type( title ), obj = Title.exist.pages, match;
@@ -198,20 +201,27 @@ var
        };
 
        /**
-        * @var Title.exist {Object}
+        * @static
+        * @property
         */
        Title.exist = {
                /**
-                * @var Title.exist.pages {Object} Keyed by PrefixedDb title.
+                * @static
+                * @property {Object} exist.pages Keyed by PrefixedDb title.
                 * Boolean true value indicates page does exist.
                 */
                pages: {},
                /**
-                * @example Declare existing titles: Title.exist.set(['User:John_Doe', ...]);
-                * @example Declare titles nonexistent: Title.exist.set(['File:Foo_bar.jpg', ...], false);
-                * @param titles {String|Array} Title(s) in strict prefixedDb title form.
-                * @param state {Boolean} (optional) State of the given titles. Defaults to true.
-                * @return {Boolean}
+                * Example to declare existing titles:
+                *     Title.exist.set(['User:John_Doe', ...]);
+                * Eample to declare titles nonexistent:
+                *     Title.exist.set(['File:Foo_bar.jpg', ...], false);
+                *
+                * @static
+                * @property exist.set
+                * @param {string|Array} titles Title(s) in strict prefixedDb title form.
+                * @param {boolean} [state] State of the given titles. Defaults to true.
+                * @return {boolean}
                 */
                set: function ( titles, state ) {
                        titles = $.isArray( titles ) ? titles : [titles];
@@ -231,7 +241,7 @@ var
 
                /**
                 * Get the namespace number.
-                * @return {Number}
+                * @return {number}
                 */
                getNamespaceId: function (){
                        return this.ns;
@@ -240,7 +250,7 @@ var
                /**
                 * Get the namespace prefix (in the content-language).
                 * In NS_MAIN this is '', otherwise namespace name plus ':'
-                * @return {String}
+                * @return {string}
                 */
                getNamespacePrefix: function (){
                        return mw.config.get( 'wgFormattedNamespaces' )[this.ns].replace( / /g, '_' ) + (this.ns === 0 ? '' : ':');
@@ -248,7 +258,7 @@ var
 
                /**
                 * The name, like "Foo_bar"
-                * @return {String}
+                * @return {string}
                 */
                getName: function () {
                        if ( $.inArray( this.ns, mw.config.get( 'wgCaseSensitiveNamespaces' ) ) !== -1 ) {
@@ -260,7 +270,7 @@ var
 
                /**
                 * The name, like "Foo bar"
-                * @return {String}
+                * @return {string}
                 */
                getNameText: function () {
                        return text( this.getName() );
@@ -269,6 +279,7 @@ var
                /**
                 * Get full name in prefixed DB form, like File:Foo_bar.jpg,
                 * most useful for API calls, anything that must identify the "title".
+                * @return {string}
                 */
                getPrefixedDb: function () {
                        return this.getNamespacePrefix() + this.getMain();
@@ -276,7 +287,7 @@ var
 
                /**
                 * Get full name in text form, like "File:Foo bar.jpg".
-                * @return {String}
+                * @return {string}
                 */
                getPrefixedText: function () {
                        return text( this.getPrefixedDb() );
@@ -284,7 +295,7 @@ var
 
                /**
                 * The main title (without namespace), like "Foo_bar.jpg"
-                * @return {String}
+                * @return {string}
                 */
                getMain: function () {
                        return this.getName() + this.getDotExtension();
@@ -292,7 +303,7 @@ var
 
                /**
                 * The "text" form, like "Foo bar.jpg"
-                * @return {String}
+                * @return {string}
                 */
                getMainText: function () {
                        return text( this.getMain() );
@@ -300,7 +311,7 @@ var
 
                /**
                 * Get the extension (returns null if there was none)
-                * @return {String|null} extension
+                * @return {string|null}
                 */
                getExtension: function () {
                        return this.ext;
@@ -308,7 +319,7 @@ var
 
                /**
                 * Convenience method: return string like ".jpg", or "" if no extension
-                * @return {String}
+                * @return {string}
                 */
                getDotExtension: function () {
                        return this.ext === null ? '' : '.' + this.ext;
@@ -316,7 +327,8 @@ var
 
                /**
                 * Return the URL to this title
-                * @return {String}
+                * @see mw.util#wikiGetlink
+                * @return {string}
                 */
                getUrl: function () {
                        return mw.util.wikiGetlink( this.toString() );
@@ -324,7 +336,8 @@ var
 
                /**
                 * Whether this title exists on the wiki.
-                * @return {mixed} Boolean true/false if the information is available. Otherwise null.
+                * @see #static-method-exists
+                * @return {boolean|null} If the information is available. Otherwise null.
                 */
                exists: function () {
                        return Title.exists( this );
index 68a3a09..b5b42e1 100644 (file)
@@ -13,14 +13,13 @@ var mw = ( function ( $, undefined ) {
        /* Object constructors */
 
        /**
-        * Map
-        *
         * Creates an object that can be read from or written to from prototype functions
         * that allow both single and multiple variables at once.
+        * @class mw.Map
         *
-        * @param global boolean Whether to store the values in the global window
+        * @constructor
+        * @param {boolean} global Whether to store the values in the global window
         *  object or a exclusively in the object property 'values'.
-        * @return Map
         */
        function Map( global ) {
                this.values = global === true ? window : {};
@@ -39,7 +38,7 @@ var mw = ( function ( $, undefined ) {
                 *  If selection was an array, returns an object of key/values (value is null if not found),
                 *  If selection was not passed or invalid, will return the 'values' object member (be careful as
                 *  objects are always passed by reference in JavaScript!).
-                * @return Values as a string or object, null if invalid/inexistant.
+                * @return {string|Object|null} Values as a string or object, null if invalid/inexistant.
                 */
                get: function ( selection, fallback ) {
                        var results, i;
@@ -98,7 +97,7 @@ var mw = ( function ( $, undefined ) {
                 * Checks if one or multiple keys exist.
                 *
                 * @param selection {mixed} String key or array of keys to check
-                * @return {Boolean} Existence of key(s)
+                * @return {boolean} Existence of key(s)
                 */
                exists: function ( selection ) {
                        var s;
@@ -116,15 +115,14 @@ var mw = ( function ( $, undefined ) {
        };
 
        /**
-        * Message
-        *
         * Object constructor for messages,
         * similar to the Message class in MediaWiki PHP.
+        * @class mw.Message
         *
-        * @param map Map Instance of mw.Map
-        * @param key String
-        * @param parameters Array
-        * @return Message
+        * @constructor
+        * @param {mw.Map} map Message storage
+        * @param {string} key
+        * @param {Array} [parameters]
         */
        function Message( map, key, parameters ) {
                this.format = 'text';
@@ -156,8 +154,8 @@ var mw = ( function ( $, undefined ) {
                /**
                 * Appends (does not replace) parameters for replacement to the .parameters property.
                 *
-                * @param parameters Array
-                * @return Message
+                * @param {Array} parameters
+                * @chainable
                 */
                params: function ( parameters ) {
                        var i;
@@ -170,7 +168,7 @@ var mw = ( function ( $, undefined ) {
                /**
                 * Converts message object to it's string form based on the state of format.
                 *
-                * @return string Message as a string in the current form or <key> if key does not exist.
+                * @return {string} Message as a string in the current form or `<key>` if key does not exist.
                 */
                toString: function () {
                        var text;
@@ -253,13 +251,19 @@ var mw = ( function ( $, undefined ) {
                /**
                 * Checks if message exists
                 *
-                * @return {string} String form of parsed message
+                * @see mw.Map#exists
+                * @return {boolean}
                 */
                exists: function () {
                        return this.map.exists( this.key );
                }
        };
 
+       /**
+        * @class mw
+        * @alternateClassName mediaWiki
+        * @singleton
+        */
        return {
                /* Public Members */
 
@@ -269,77 +273,72 @@ var mw = ( function ( $, undefined ) {
                 */
                log: function () { },
 
-               /**
-                * @var constructor Make the Map constructor publicly available.
-                */
+               // Make the Map constructor publicly available.
                Map: Map,
 
-               /**
-                * @var constructor Make the Message constructor publicly available.
-                */
+               // Make the Message constructor publicly available.
                Message: Message,
 
                /**
                 * List of configuration values
                 *
                 * Dummy placeholder. Initiated in startUp module as a new instance of mw.Map().
-                * If $wgLegacyJavaScriptGlobals is true, this Map will have its values
+                * If `$wgLegacyJavaScriptGlobals` is true, this Map will have its values
                 * in the global window object.
+                * @property
                 */
                config: null,
 
                /**
-                * @var object
-                *
                 * Empty object that plugins can be installed in.
+                * @property
                 */
                libs: {},
 
                /* Extension points */
 
+               /**
+                * @property
+                */
                legacy: {},
 
                /**
                 * Localization system
+                * @property {mw.Map}
                 */
                messages: new Map(),
 
                /* Public Methods */
 
                /**
-                * Gets a message object, similar to wfMessage()
+                * Gets a message object, similar to wfMessage().
                 *
-                * @param key string Key of message to get
-                * @param parameter1 mixed First argument in a list of variadic arguments,
-                *  each a parameter for $N replacement in messages.
-                * @return Message
+                * @param {string} key Key of message to get
+                * @param {Mixed...} parameters Parameters for the $N replacements in messages.
+                * @return {mw.Message}
                 */
-               message: function ( key, parameter1 ) {
-                       var parameters;
-                       // Support variadic arguments
-                       if ( parameter1 !== undefined ) {
-                               parameters = slice.call( arguments );
-                               parameters.shift();
-                       } else {
-                               parameters = [];
-                       }
+               message: function ( key ) {
+                       // Variadic arguments
+                       var parameters = slice.call( arguments, 1 );
                        return new Message( mw.messages, key, parameters );
                },
 
                /**
                 * Gets a message string, similar to wfMessage()
                 *
-                * @param key string Key of message to get
-                * @param parameters mixed First argument in a list of variadic arguments,
-                *  each a parameter for $N replacement in messages.
-                * @return String.
+                * @see mw.Message#toString
+                * @param {string} key Key of message to get
+                * @param {Mixed...} parameters Parameters for the $N replacements in messages.
+                * @return {string}
                 */
-               msg: function ( /* key, parameter_1, parameter_2, .. */ ) {
+               msg: function ( /* key, parameters... */ ) {
                        return mw.message.apply( mw.message, arguments ).toString();
                },
 
                /**
                 * Client-side module loader which integrates with the MediaWiki ResourceLoader
+                * @class mw.loader
+                * @singleton
                 */
                loader: ( function () {
 
@@ -358,29 +357,32 @@ var mw = ( function ( $, undefined ) {
                         * mw.loader.implement.
                         *
                         * Format:
-                        *      {
-                        *              'moduleName': {
-                        *                      'version': ############## (unix timestamp),
-                        *                      'dependencies': ['required.foo', 'bar.also', ...], (or) function () {}
-                        *                      'group': 'somegroup', (or) null,
-                        *                      'source': 'local', 'someforeignwiki', (or) null
-                        *                      'state': 'registered', 'loading', 'loaded', 'ready', 'error' or 'missing'
-                        *                      'script': ...,
-                        *                      'style': ...,
-                        *                      'messages': { 'key': 'value' },
-                        *              }
-                        *      }
+                        *     {
+                        *         'moduleName': {
+                        *             'version': ############## (unix timestamp),
+                        *             'dependencies': ['required.foo', 'bar.also', ...], (or) function () {}
+                        *             'group': 'somegroup', (or) null,
+                        *             'source': 'local', 'someforeignwiki', (or) null
+                        *             'state': 'registered', 'loading', 'loaded', 'ready', 'error' or 'missing'
+                        *             'script': ...,
+                        *             'style': ...,
+                        *             'messages': { 'key': 'value' },
+                        *         }
+                        *     }
+                        *
+                        * @property
+                        * @private
                         */
                        var registry = {},
-                               /**
-                                * Mapping of sources, keyed by source-id, values are objects.
-                                * Format:
-                                *      {
-                                *              'sourceId': {
-                                *                      'loadScript': 'http://foo.bar/w/load.php'
-                                *              }
-                                *      }
-                                */
+                               //
+                               // Mapping of sources, keyed by source-id, values are objects.
+                               // Format:
+                               //      {
+                               //              'sourceId': {
+                               //                      'loadScript': 'http://foo.bar/w/load.php'
+                               //              }
+                               //      }
+                               //
                                sources = {},
                                // List of modules which will be loaded as when ready
                                batch = [],
@@ -412,10 +414,11 @@ var mw = ( function ( $, undefined ) {
                        /**
                         * Create a new style tag and add it to the DOM.
                         *
-                        * @param text String: CSS text
-                        * @param nextnode mixed: [optional] An Element or jQuery object for an element where
-                        * the style tag should be inserted before. Otherwise appended to the <head>.
-                        * @return HTMLStyleElement
+                        * @private
+                        * @param {string} text CSS text
+                        * @param {Mixed} [nextnode] An Element or jQuery object for an element where
+                        * the style tag should be inserted before. Otherwise appended to the `<head>`.
+                        * @return {HTMLElement} Node reference to the created `<style>` tag.
                         */
                        function addStyleTag( text, nextnode ) {
                                var s = document.createElement( 'style' );
@@ -452,11 +455,15 @@ var mw = ( function ( $, undefined ) {
                         * Checks if certain cssText is safe to append to
                         * a stylesheet.
                         *
-                        * Right now it only makes sure that cssText containing @import
+                        * Right now it only makes sure that cssText containing `@import`
                         * rules will end up in a new stylesheet (as those only work when
                         * placed at the start of a stylesheet; bug 35562).
                         * This could later be extended to take care of other bugs, such as
                         * the IE cssRules limit - not the same as the IE styleSheets limit).
+                        * @private
+                        * @param {jQuery} $style
+                        * @param {string} cssText
+                        * @return {boolean}
                         */
                        function canExpandStylesheetWith( $style, cssText ) {
                                return cssText.indexOf( '@import' ) === -1;
@@ -465,12 +472,12 @@ var mw = ( function ( $, undefined ) {
                        function addEmbeddedCSS( cssText ) {
                                var $style, styleEl;
                                $style = getMarker().prev();
-                               // Re-use <style> tags if possible, this to try to stay
+                               // Re-use `<style>` tags if possible, this to try to stay
                                // under the IE stylesheet limit (bug 31676).
                                // Also verify that the the element before Marker actually is one
                                // that came from ResourceLoader, and not a style tag that some
                                // other script inserted before our marker, or, more importantly,
-                               // it may not be a style tag at all (could be <meta> or <script>).
+                               // it may not be a style tag at all (could be `<meta>` or `<script>`).
                                if (
                                        $style.data( 'ResourceLoaderDynamicStyleTag' ) === true &&
                                        canExpandStylesheetWith( $style, cssText )
@@ -495,6 +502,7 @@ var mw = ( function ( $, undefined ) {
 
                        /**
                         * Generates an ISO8601 "basic" string from a UNIX timestamp
+                        * @private
                         */
                        function formatVersionNumber( timestamp ) {
                                var     d = new Date();
@@ -511,15 +519,16 @@ var mw = ( function ( $, undefined ) {
                        /**
                         * Resolves dependencies and detects circular references.
                         *
-                        * @param module String Name of the top-level module whose dependencies shall be
+                        * @private
+                        * @param {string} module Name of the top-level module whose dependencies shall be
                         *   resolved and sorted.
-                        * @param resolved Array Returns a topological sort of the given module and its
+                        * @param {Array} resolved Returns a topological sort of the given module and its
                         *   dependencies, such that later modules depend on earlier modules. The array
                         *   contains the module names. If the array contains already some module names,
                         *   this function appends its result to the pre-existing array.
-                        * @param unresolved Object [optional] Hash used to track the current dependency
+                        * @param {Object} [unresolved] Hash used to track the current dependency
                         *   chain; used to report loops in the dependency graph.
-                        * @throws Error if any unregistered module or a dependency loop is encountered
+                        * @throws {Error} If any unregistered module or a dependency loop is encountered
                         */
                        function sortDependencies( module, resolved, unresolved ) {
                                var n, deps, len;
@@ -568,9 +577,10 @@ var mw = ( function ( $, undefined ) {
                         * Gets a list of module names that a module depends on in their proper dependency
                         * order.
                         *
-                        * @param module string module name or array of string module names
-                        * @return list of dependencies, including 'module'.
-                        * @throws Error if circular reference is detected
+                        * @private
+                        * @param {string} module Module name or array of string module names
+                        * @return {Array} list of dependencies, including 'module'.
+                        * @throws {Error} If circular reference is detected
                         */
                        function resolve( module ) {
                                var m, resolved;
@@ -599,10 +609,11 @@ var mw = ( function ( $, undefined ) {
                         * One can also filter for 'unregistered', which will return the
                         * modules names that don't have a registry entry.
                         *
-                        * @param states string or array of strings of module states to filter by
-                        * @param modules array list of module names to filter (optional, by default the entire
+                        * @private
+                        * @param {string|string[]} states Module states to filter by
+                        * @param {Array} modules List of module names to filter (optional, by default the entire
                         * registry is used)
-                        * @return array list of filtered module names
+                        * @return {Array} List of filtered module names
                         */
                        function filter( states, modules ) {
                                var list, module, s, m;
@@ -644,9 +655,9 @@ var mw = ( function ( $, undefined ) {
                         * Determine whether all dependencies are in state 'ready', which means we may
                         * execute the module or job now.
                         *
-                        * @param dependencies Array dependencies (module names) to be checked.
-                        *
-                        * @return Boolean true if all dependencies are in state 'ready', false otherwise
+                        * @private
+                        * @param {Array} dependencies Dependencies (module names) to be checked.
+                        * @return {boolean} True if all dependencies are in state 'ready', false otherwise
                         */
                        function allReady( dependencies ) {
                                return filter( 'ready', dependencies ).length === dependencies.length;
@@ -658,8 +669,9 @@ var mw = ( function ( $, undefined ) {
                         * Gets console references in each invocation, so that delayed debugging tools work
                         * fine. No need for optimization here, which would only result in losing logs.
                         *
-                        * @param msg String text for the log entry.
-                        * @param e Error [optional] to also log.
+                        * @private
+                        * @param {string} msg text for the log entry.
+                        * @param {Error} [e]
                         */
                        function log( msg, e ) {
                                var console = window.console;
@@ -681,7 +693,8 @@ var mw = ( function ( $, undefined ) {
                         * state up the dependency tree; otherwise, execute all jobs/modules that now have all their
                         * dependencies satisfied. On jobs depending on a failed module, run the error callback, if any.
                         *
-                        * @param module String name of module that entered one of the states 'ready', 'error', or 'missing'.
+                        * @private
+                        * @param {string} module Name of module that entered one of the states 'ready', 'error', or 'missing'.
                         */
                        function handlePending( module ) {
                                var j, job, hasErrors, m, stateChange;
@@ -749,8 +762,9 @@ var mw = ( function ( $, undefined ) {
                         * Adds a script tag to the DOM, either using document.write or low-level DOM manipulation,
                         * depending on whether document-ready has occurred yet and whether we are in async mode.
                         *
-                        * @param src String: URL to script, will be used as the src attribute in the script tag
-                        * @param callback Function: Optional callback which will be run when the script is done
+                        * @private
+                        * @param {string} src URL to script, will be used as the src attribute in the script tag
+                        * @param {Function} [callback] Callback which will be run when the script is done
                         */
                        function addScript( src, callback, async ) {
                                /*jshint evil:true */
@@ -824,7 +838,8 @@ var mw = ( function ( $, undefined ) {
                        /**
                         * Executes a loaded module, making it ready to use
                         *
-                        * @param module string module name to execute
+                        * @private
+                        * @param {string} module Module name to execute
                         */
                        function execute( module ) {
                                var key, value, media, i, urls, script, markModuleReady, nestedAddScript;
@@ -842,6 +857,7 @@ var mw = ( function ( $, undefined ) {
                                /**
                                 * Define loop-function here for efficiency
                                 * and to avoid re-using badly scoped variables.
+                                * @ignore
                                 */
                                function addLink( media, url ) {
                                        var el = document.createElement( 'link' );
@@ -952,11 +968,12 @@ var mw = ( function ( $, undefined ) {
                         * Adds a dependencies to the queue with optional callbacks to be run
                         * when the dependencies are ready or fail
                         *
-                        * @param dependencies string module name or array of string module names
-                        * @param ready function callback to execute when all dependencies are ready
-                        * @param error function callback to execute when any dependency fails
-                        * @param async (optional) If true, load modules asynchronously even if
-                        *  document ready has not yet occurred
+                        * @private
+                        * @param {string|string[]} dependencies Module name or array of string module names
+                        * @param {Function} ready Callback to execute when all dependencies are ready
+                        * @param {Function} error Callback to execute when any dependency fails
+                        * @param {boolean} [async] If true, load modules asynchronously even if
+                        *  document ready has not yet occurred.
                         */
                        function request( dependencies, ready, error, async ) {
                                var n;
@@ -1011,6 +1028,7 @@ var mw = ( function ( $, undefined ) {
                        /**
                         * Converts a module map of the form { foo: [ 'bar', 'baz' ], bar: [ 'baz, 'quux' ] }
                         * to a query string of the form foo.bar,baz|bar.baz,quux
+                        * @private
                         */
                        function buildModulesString( moduleMap ) {
                                var arr = [], p, prefix;
@@ -1024,10 +1042,11 @@ var mw = ( function ( $, undefined ) {
                        /**
                         * Asynchronously append a script tag to the end of the body
                         * that invokes load.php
-                        * @param moduleMap {Object}: Module map, see buildModulesString()
-                        * @param currReqBase {Object}: Object with other parameters (other than 'modules') to use in the request
-                        * @param sourceLoadScript {String}: URL of load.php
-                        * @param async {Boolean}: If true, use an asynchrounous request even if document ready has not yet occurred
+                        * @private
+                        * @param {Object} moduleMap Module map, see #buildModulesString
+                        * @param {Object} currReqBase Object with other parameters (other than 'modules') to use in the request
+                        * @param {string} sourceLoadScript URL of load.php
+                        * @param {boolean} async If true, use an asynchrounous request even if document ready has not yet occurred
                         */
                        function doRequest( moduleMap, currReqBase, sourceLoadScript, async ) {
                                var request = $.extend(
@@ -1182,10 +1201,10 @@ var mw = ( function ( $, undefined ) {
                                /**
                                 * Register a source.
                                 *
-                                * @param id {String}: Short lowercase a-Z string representing a source, only used internally.
-                                * @param props {Object}: Object containing only the loadScript property which is a url to
-                                * the load.php location of the source.
-                                * @return {Boolean}
+                                * @param {string} id Short lowercase a-Z string representing a source, only used internally.
+                                * @param {Object} props Object containing only the loadScript property which is a url to
+                                *  the load.php location of the source.
+                                * @return {boolean}
                                 */
                                addSource: function ( id, props ) {
                                        var source;
@@ -1264,20 +1283,20 @@ var mw = ( function ( $, undefined ) {
                                 *
                                 * All arguments are required.
                                 *
-                                * @param {String} module Name of module
+                                * @param {string} module Name of module
                                 * @param {Function|Array} script Function with module code or Array of URLs to
-                                *  be used as the src attribute of a new <script> tag.
+                                *  be used as the src attribute of a new `<script>` tag.
                                 * @param {Object} style Should follow one of the following patterns:
-                                *  { "css": [css, ..] }
-                                *  { "url": { <media>: [url, ..] } }
-                                *  And for backwards compatibility (needs to be supported forever due to caching):
-                                *  { <media>: css }
-                                *  { <media>: [url, ..] }
+                                *     { "css": [css, ..] }
+                                *     { "url": { <media>: [url, ..] } }
+                                * And for backwards compatibility (needs to be supported forever due to caching):
+                                *     { <media>: css }
+                                *     { <media>: [url, ..] }
                                 *
-                                *  The reason css strings are not concatenated anymore is bug 31676. We now check
-                                *  whether it's safe to extend the stylesheet (see canExpandStylesheetWith).
+                                * The reason css strings are not concatenated anymore is bug 31676. We now check
+                                * whether it's safe to extend the stylesheet (see #canExpandStylesheetWith).
                                 *
-                                * @param {Object} msgs List of key/value pairs to be passed through mw.messages.set
+                                * @param {Object} msgs List of key/value pairs to be added to {@link mw#messages}.
                                 */
                                implement: function ( module, script, style, msgs ) {
                                        // Validate input
@@ -1511,7 +1530,11 @@ var mw = ( function ( $, undefined ) {
                        };
                }() ),
 
-               /** HTML construction helper functions */
+               /**
+                * HTML construction helper functions
+                * @class mw.html
+                * @singleton
+                */
                html: ( function () {
                        function escapeCallback( s ) {
                                switch ( s ) {
@@ -1531,7 +1554,7 @@ var mw = ( function ( $, undefined ) {
                        return {
                                /**
                                 * Escape a string for HTML. Converts special characters to HTML entities.
-                                * @param s The string to escape
+                                * @param {string} s The string to escape
                                 */
                                escape: function ( s ) {
                                        return s.replace( /['"<>&]/g, escapeCallback );
@@ -1539,7 +1562,7 @@ var mw = ( function ( $, undefined ) {
 
                                /**
                                 * Wrapper object for raw HTML passed to mw.html.element().
-                                * @constructor
+                                * @class mw.html.Raw
                                 */
                                Raw: function ( value ) {
                                        this.value = value;
@@ -1547,7 +1570,7 @@ var mw = ( function ( $, undefined ) {
 
                                /**
                                 * Wrapper object for CDATA element contents passed to mw.html.element()
-                                * @constructor
+                                * @class mw.html.Cdata
                                 */
                                Cdata: function ( value ) {
                                        this.value = value;
index 35cc6d8..fd34e7e 100644 (file)
@@ -1,25 +1,24 @@
-/**
- * Implements mediaWiki.notification library
- */
 ( function ( mw, $ ) {
        'use strict';
 
        var notification,
                isPageReady = false,
-               isInitialized = false,
                preReadyNotifQueue = [],
-               /**
-                * @var {jQuery}
-                * The #mw-notification-area div that all notifications are contained inside.
-                */
+               // The #mw-notification-area div that all notifications are contained inside.
                $area = null;
 
        /**
         * Creates a Notification object for 1 message.
-        * Does not insert anything into the document (see .start()).
+        * Does not insert anything into the document (see #start).
+        *
+        * The "_" in the name is to avoid a bug (http://github.com/senchalabs/jsduck/issues/304)
+        * It is not part of the actual class name.
+        *
+        * @class mw.Notification_
+        * @alternateClassName mw.Notification
+        * @private
         *
         * @constructor
-        * @see mw.notification.notify
         */
        function Notification( message, options ) {
                var $notification, $notificationTitle, $notificationContent;
         *
         * @param {Object} options An object containing options for the closing of the notification.
         *  These are typically only used internally.
+        *
         *  - speed: Use a close speed different than the default 'slow'.
         *  - placeholder: Set to false to disable the placeholder transition.
         */
 
        /**
         * Helper function, take a list of notification divs and call
-        * a function on the Notification instance attached to them
+        * a function on the Notification instance attached to them.
         *
         * @param {jQuery} $notifications A jQuery object containing notification divs
         * @param {string} fn The name of the function to call on the Notification instance
        }
 
        /**
-        * Initialisation
-        * (don't call before document ready)
+        * Initialisation.
+        * Must only be called once, and not before the document is ready.
+        * @ignore
         */
        function init() {
-               if ( !isInitialized ) {
-                       isInitialized = true;
-                       $area = $( '<div id="mw-notification-area"></div>' )
-                               // Pause auto-hide timers when the mouse is in the notification area.
-                               .on( {
-                                       mouseenter: notification.pause,
-                                       mouseleave: notification.resume
-                               } )
-                               // When clicking on a notification close it.
-                               .on( 'click', '.mw-notification', function () {
-                                       var notif = $( this ).data( 'mw.notification' );
-                                       if ( notif ) {
-                                               notif.close();
-                                       }
-                               } )
-                               // Stop click events from <a> tags from propogating to prevent clicking.
-                               // on links from hiding a notification.
-                               .on( 'click', 'a', function ( e ) {
-                                       e.stopPropagation();
-                               } );
-
-                       // Prepend the notification area to the content area and save it's object.
-                       mw.util.$content.prepend( $area );
-               }
+               $area = $( '<div id="mw-notification-area"></div>' )
+                       // Pause auto-hide timers when the mouse is in the notification area.
+                       .on( {
+                               mouseenter: notification.pause,
+                               mouseleave: notification.resume
+                       } )
+                       // When clicking on a notification close it.
+                       .on( 'click', '.mw-notification', function () {
+                               var notif = $( this ).data( 'mw.notification' );
+                               if ( notif ) {
+                                       notif.close();
+                               }
+                       } )
+                       // Stop click events from <a> tags from propogating to prevent clicking.
+                       // on links from hiding a notification.
+                       .on( 'click', 'a', function ( e ) {
+                               e.stopPropagation();
+                       } );
+
+               // Prepend the notification area to the content area and save it's object.
+               mw.util.$content.prepend( $area );
        }
 
+       /**
+        * @class mw.notification
+        * @singleton
+        */
        notification = {
                /**
                 * Pause auto-hide timers for all notifications.
                 * Notifications will not auto-hide until resume is called.
+                * @see mw.Notification#pause
                 */
                pause: function () {
                        callEachNotification(
 
                /**
                 * Resume any paused auto-hide timers from the beginning.
-                * Only the first {autoHideLimit} timers will be resumed.
+                * Only the first #autoHideLimit timers will be resumed.
                 */
                resume: function () {
                        callEachNotification(
-                               // Only call resume on the first {autoHideLimit} notifications.
-                               // Exclude noautohide notifications to avoid bugs where {autoHideLimit}
-                               // { autoHide: false } notifications are at the start preventing any
+                               // Only call resume on the first #autoHideLimit notifications.
+                               // Exclude noautohide notifications to avoid bugs where #autoHideLimit
+                               // `{ autoHide: false }` notifications are at the start preventing any
                                // auto-hide notifications from being autohidden.
                                $area.children( '.mw-notification-autohide' ).slice( 0, notification.autoHideLimit ),
                                'resume'
                /**
                 * Display a notification message to the user.
                 *
-                * @param {mixed} message The DOM-element, jQuery object, mw.Message instance,
-                *  or plaintext string to be used as the message.
+                * @param {HTMLElement|jQuery|mw.Message|string} message
                 * @param {Object} options The options to use for the notification.
-                *  See mw.notification.defaults for details.
+                *  See #defaults for details.
                 */
                notify: function ( message, options ) {
                        var notif;
                },
 
                /**
-                * @var {Object}
-                * The defaults for mw.notification.notify's options parameter
-                *   autoHide:
-                *     A boolean indicating whether the notifification should automatically
-                *     be hidden after shown. Or if it should persist.
+                * @property {Object}
+                * The defaults for #notify options parameter.
+                *
+                * - autoHide:
+                *   A boolean indicating whether the notifification should automatically
+                *   be hidden after shown. Or if it should persist.
                 *
-                *   tag:
-                *     An optional string. When a notification is tagged only one message
-                *     with that tag will be displayed. Trying to display a new notification
-                *     with the same tag as one already being displayed will cause the other
-                *     notification to be closed and this new notification to open up inside
-                *     the same place as the previous notification.
+                * - tag:
+                *   An optional string. When a notification is tagged only one message
+                *   with that tag will be displayed. Trying to display a new notification
+                *   with the same tag as one already being displayed will cause the other
+                *   notification to be closed and this new notification to open up inside
+                *   the same place as the previous notification.
                 *
-                *   title:
-                *     An optional title for the notification. Will be displayed above the
-                *     content. Usually in bold.
+                * - title:
+                *   An optional title for the notification. Will be displayed above the
+                *   content. Usually in bold.
                 */
                defaults: {
                        autoHide: true,
                },
 
                /**
-                * @var {number}
+                * @property {number}
                 * Number of seconds to wait before auto-hiding notifications.
                 */
                autoHideSeconds: 5,
 
                /**
-                * @var {number}
+                * @property {number}
                 * Maximum number of notifications to count down auto-hide timers for.
-                * Only the first {autoHideLimit} notifications being displayed will
+                * Only the first #autoHideLimit notifications being displayed will
                 * auto-hide. Any notifications further down in the list will only start
                 * counting down to auto-hide after the first few messages have closed.
                 *
                 * This basically represents the number of notifications the user should
-                * be able to process in {autoHideSeconds} time.
+                * be able to process in #autoHideSeconds time.
                 */
                autoHideLimit: 3
        };
index 3bf2a89..83d95b6 100644 (file)
@@ -1,11 +1,13 @@
 /**
- * Implements mediaWiki.notify function
+ * @class mw.plugin.notify
  */
 ( function ( mw ) {
        'use strict';
 
        /**
-        * @see mw.notification.notify
+        * @see mw.notification#notify
+        * @param message
+        * @param options
         */
        mw.notify = function ( message, options ) {
                // Don't bother loading the whole notification system if we never use it.
@@ -17,4 +19,9 @@
                } );
        };
 
-}( mediaWiki ) );
\ No newline at end of file
+       /**
+        * @class mw
+        * @mixins mw.plugin.notify
+        */
+
+}( mediaWiki ) );
index 9b2faa8..cb7dd63 100644 (file)
@@ -1,10 +1,11 @@
-/**
- * Implements mediaWiki.util library
- */
 ( function ( mw, $ ) {
        'use strict';
 
-       // Local cache and alias
+       /**
+        * Utility library
+        * @class mw.util
+        * @singleton
+        */
        var util = {
 
                /**
                /**
                 * Encode the string like PHP's rawurlencode
                 *
-                * @param str string String to be encoded
+                * @param {string} str String to be encoded.
                 */
                rawurlencode: function ( str ) {
                        str = String( str );
                 * We want / and : to be included as literal characters in our title URLs
                 * as they otherwise fatally break the title
                 *
-                * @param str string String to be encoded
+                * @param {string} str String to be encoded.
                 */
                wikiUrlencode: function ( str ) {
                        return util.rawurlencode( str )
                },
 
                /**
-                * Get the link to a page name (relative to wgServer)
+                * Get the link to a page name (relative to `wgServer`),
                 *
-                * @param str String: Page name to get the link for.
-                * @return String: Location for a page with name of 'str' or boolean false on error.
+                * @param {string} str Page name to get the link for.
+                * @return {string} Location for a page with name of `str` or boolean false on error.
                 */
                wikiGetlink: function ( str ) {
                        return mw.config.get( 'wgArticlePath' ).replace( '$1',
 
                /**
                 * Get address to a script in the wiki root.
-                * For index.php use mw.config.get( 'wgScript' )
+                * For index.php use `mw.config.get( 'wgScript' )`.
                 *
                 * @since 1.18
                 * @param str string Name of script (eg. 'api'), defaults to 'index'
 
                /**
                 * Append a new style block to the head and return the CSSStyleSheet object.
-                * Use .ownerNode to access the <style> element, or use mw.loader.addStyleTag.
+                * Use .ownerNode to access the `<style>` element, or use mw.loader#addStyleTag.
                 * This function returns the styleSheet object for convience (due to cross-browsers
                 * difference as to where it is located).
-                * @example
-                * <code>
-                * var sheet = mw.util.addCSS('.foobar { display: none; }');
-                * $(foo).click(function () {
-                *     // Toggle the sheet on and off
-                *     sheet.disabled = !sheet.disabled;
-                * });
-                * </code>
                 *
-                * @param text string CSS to be appended
-                * @return CSSStyleSheet (use .ownerNode to get to the <style> element)
+                *     var sheet = mw.util.addCSS('.foobar { display: none; }');
+                *     $(foo).click(function () {
+                *         // Toggle the sheet on and off
+                *         sheet.disabled = !sheet.disabled;
+                *     });
+                *
+                * @param {string} text CSS to be appended
+                * @return {CSSStyleSheet} Use .ownerNode to get to the `<style>` element.
                 */
                addCSS: function ( text ) {
                        var s = mw.loader.addStyleTag( text );
                /**
                 * Hide/show the table of contents element
                 *
-                * @param $toggleLink jQuery A jQuery object of the toggle link.
-                * @param callback function Function to be called after the toggle is
-                * completed (including the animation) (optional)
-                * @return mixed Boolean visibility of the toc (true if it's visible)
+                * @param {jQuery} $toggleLink A jQuery object of the toggle link.
+                * @param {Function} [callback] Function to be called after the toggle is
+                *  completed (including the animation).
+                * @return {Mixed} Boolean visibility of the toc (true if it's visible)
                 * or Null if there was no table of contents.
                 */
                toggleToc: function ( $toggleLink, callback ) {
                 * Grab the URL parameter value for the given parameter.
                 * Returns null if not found.
                 *
-                * @param param string The parameter name.
-                * @param url string URL to search through (optional)
-                * @return mixed Parameter value or null.
+                * @param {string} param The parameter name.
+                * @param {string} [url] URL to search through.
+                * @return {Mixed} Parameter value or null.
                 */
                getParamValue: function ( param, url ) {
                        if ( url === undefined ) {
                },
 
                /**
-                * @var string
+                * @property {string}
                 * Access key prefix. Will be re-defined based on browser/operating system
-                * detection in mw.util.init().
+                * detection in mw.util#init.
                 */
                tooltipAccessKeyPrefix: 'alt-',
 
                /**
-                * @var RegExp
+                * @property {RegExp}
                 * Regex to match accesskey tooltips.
                 */
                tooltipAccessKeyRegexp: /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
                 * otherwise, all the nodes that will probably have accesskeys by
                 * default are updated.
                 *
-                * @param $nodes {Array|jQuery} [optional] A jQuery object, or array
-                * of elements to update.
+                * @param {Array|jQuery} [$nodes] A jQuery object, or array of nodes to update.
                 */
                updateTooltipAccessKeys: function ( $nodes ) {
                        if ( !$nodes ) {
                },
 
                /*
-                * @var jQuery
-                * A jQuery object that refers to the content area element
-                * Populated by init().
+                * @property {jQuery}
+                * A jQuery object that refers to the content area element.
+                * Populated by #init.
                 */
                $content: null,
 
                 *
                 * By default the new link will be added to the end of the list. To
                 * add the link before a given existing item, pass the DOM node
-                * (document.getElementById( 'foobar' )) or the jQuery-selector
-                * ( '#foobar' ) of that item.
+                * (e.g. `document.getElementById( 'foobar' )`) or a jQuery-selector
+                * (e.g. `'#foobar'`) for that item.
                 *
-                * @example mw.util.addPortletLink(
-                *       'p-tb', 'http://mediawiki.org/',
-                *       'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org ', 'm', '#t-print'
-                * )
+                *     mw.util.addPortletLink(
+                *         'p-tb', 'http://mediawiki.org/',
+                *         'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org ', 'm', '#t-print'
+                *     );
                 *
-                * @param portlet string ID of the target portlet ( 'p-cactions' or 'p-personal' etc.)
-                * @param href string Link URL
-                * @param text string Link text
-                * @param id string ID of the new item, should be unique and preferably have
-                * the appropriate prefix ( 'ca-', 'pt-', 'n-' or 't-' )
-                * @param tooltip string Text to show when hovering over the link, without accesskey suffix
-                * @param accesskey string Access key to activate this link (one character, try
-                * to avoid conflicts. Use $( '[accesskey=x]' ).get() in the console to
-                * see if 'x' is already used.
-                * @param nextnode mixed DOM Node or jQuery-selector string of the item that the new
-                * item should be added before, should be another item in the same
-                * list, it will be ignored otherwise
+                * @param {string} portlet ID of the target portlet ( 'p-cactions' or 'p-personal' etc.)
+                * @param {string} href Link URL
+                * @param {string} text Link text
+                * @param {string} [id] ID of the new item, should be unique and preferably have
+                *  the appropriate prefix ( 'ca-', 'pt-', 'n-' or 't-' )
+                * @param {string} [tooltip] Text to show when hovering over the link, without accesskey suffix
+                * @param {string} [accesskey] Access key to activate this link (one character, try
+                *  to avoid conflicts. Use `$( '[accesskey=x]' ).get()` in the console to
+                *  see if 'x' is already used.
+                * @param {HTMLElement|jQuery|string} [nextnode] Element or jQuery-selector string to the item that
+                *  the new item should be added before, should be another item in the same
+                *  list, it will be ignored otherwise
                 *
-                * @return mixed The DOM Node of the added item (a ListItem or Anchor element,
+                * @return {HTMLElement|null} The added element (a ListItem or Anchor element,
                 * depending on the skin) or null if no element was added to the document.
                 */
                addPortletLink: function ( portlet, href, text, id, tooltip, accesskey, nextnode ) {
                 * something, replacing any previous message.
                 * Calling with no arguments, with an empty string or null will hide the message
                 *
-                * @param message {mixed} The DOM-element, jQuery object or HTML-string to be put inside the message box.
+                * @param {Mixed} message The DOM-element, jQuery object or HTML-string to be put inside the message box.
                 * to allow CSS/JS to hide different boxes. null = no class used.
-                * @depreceated Use mw.notify
+                * @deprecated Use mw#notify
                 */
                jsMessage: function ( message ) {
                        if ( !arguments.length || message === '' || message === null ) {
                 * according to HTML5 specification. Please note the specification
                 * does not validate a domain with one character.
                 *
-                * @todo FIXME: should be moved to or replaced by a JavaScript validation module.
+                * FIXME: should be moved to or replaced by a validation module.
                 *
-                * @param mailtxt string E-mail address to be validated.
-                * @return mixed Null if mailtxt was an empty string, otherwise true/false
-                * is determined by validation.
+                * @param {string} mailtxt E-mail address to be validated.
+                * @return {boolean|null} Null if `mailtxt` was an empty string, otherwise true/false
+                * as determined by validation.
                 */
                validateEmail: function ( mailtxt ) {
                        var rfc5322Atext, rfc1034LdhStr, html5EmailRegexp;
                                return null;
                        }
 
-                       /**
-                        * HTML5 defines a string as valid e-mail address if it matches
-                        * the ABNF:
-                        *      1 * ( atext / "." ) "@" ldh-str 1*( "." ldh-str )
-                        * With:
-                        * - atext      : defined in RFC 5322 section 3.2.3
-                        * - ldh-str : defined in RFC 1034 section 3.5
-                        *
-                        * (see STD 68 / RFC 5234 http://tools.ietf.org/html/std68):
-                        */
-
-                       /**
-                        * First, define the RFC 5322 'atext' which is pretty easy:
-                        * atext = ALPHA / DIGIT / ; Printable US-ASCII
-                                                "!" / "#" /     ; characters not including
-                                                "$" / "%" /     ; specials. Used for atoms.
-                                                "&" / "'" /
-                                                "*" / "+" /
-                                                "-" / "/" /
-                                                "=" / "?" /
-                                                "^" / "_" /
-                                                "`" / "{" /
-                                                "|" / "}" /
-                                                "~"
-                       */
+                       // HTML5 defines a string as valid e-mail address if it matches
+                       // the ABNF:
+                       //      1 * ( atext / "." ) "@" ldh-str 1*( "." ldh-str )
+                       // With:
+                       // - atext      : defined in RFC 5322 section 3.2.3
+                       // - ldh-str : defined in RFC 1034 section 3.5
+                       //
+                       // (see STD 68 / RFC 5234 http://tools.ietf.org/html/std68)
+                       // First, define the RFC 5322 'atext' which is pretty easy:
+                       // atext = ALPHA / DIGIT / ; Printable US-ASCII
+                       //     "!" / "#" /    ; characters not including
+                       //     "$" / "%" /    ; specials. Used for atoms.
+                       //     "&" / "'" /
+                       //     "*" / "+" /
+                       //     "-" / "/" /
+                       //     "=" / "?" /
+                       //     "^" / "_" /
+                       //     "`" / "{" /
+                       //     "|" / "}" /
+                       //     "~"
                        rfc5322Atext = 'a-z0-9!#$%&\'*+\\-/=?^_`{|}~';
 
-                       /**
-                        * Next define the RFC 1034 'ldh-str'
-                        *      <domain> ::= <subdomain> | " "
-                        *      <subdomain> ::= <label> | <subdomain> "." <label>
-                        *      <label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
-                        *      <ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
-                        *      <let-dig-hyp> ::= <let-dig> | "-"
-                        *      <let-dig> ::= <letter> | <digit>
-                        */
+                       // Next define the RFC 1034 'ldh-str'
+                       //      <domain> ::= <subdomain> | " "
+                       //      <subdomain> ::= <label> | <subdomain> "." <label>
+                       //      <label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
+                       //      <ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
+                       //      <let-dig-hyp> ::= <let-dig> | "-"
+                       //      <let-dig> ::= <letter> | <digit>
                        rfc1034LdhStr = 'a-z0-9\\-';
 
                        html5EmailRegexp = new RegExp(
                /**
                 * Note: borrows from IP::isIPv4
                 *
-                * @param address string
-                * @param allowBlock boolean
-                * @return boolean
+                * @param {string} address
+                * @param {boolean} allowBlock
+                * @return {boolean}
                 */
                isIPv4Address: function ( address, allowBlock ) {
                        if ( typeof address !== 'string' ) {
                /**
                 * Note: borrows from IP::isIPv6
                 *
-                * @param address string
-                * @param allowBlock boolean
-                * @return boolean
+                * @param {string} address
+                * @param {boolean} allowBlock
+                * @return {boolean}
                 */
                isIPv6Address: function ( address, allowBlock ) {
                        if ( typeof address !== 'string' ) {
index aa56e6e..13217e2 100644 (file)
@@ -631,7 +631,7 @@ class ParserTest {
                        self::getOptionValue( 'wgLinkHolderBatchSize', $opts, 1000 );
 
                $settings = array(
-                       'wgServer' => 'http://Britney-Spears',
+                       'wgServer' => 'http://example.org',
                        'wgScript' => '/index.php',
                        'wgScriptPath' => '/',
                        'wgArticlePath' => '/wiki/$1',
index 1f84aae..ede4ae9 100644 (file)
@@ -162,6 +162,16 @@ baz
 </p>
 !! end
 
+!! test
+Parsing an URL
+!! input
+http://fr.wikipedia.org/wiki/🍺
+<!-- EasterEgg we love beer, better be able be able to link to it -->
+!! result
+<p><a rel="nofollow" class="external free" href="http://fr.wikipedia.org/wiki/🍺">http://fr.wikipedia.org/wiki/🍺</a>
+</p>
+!! end
+
 !! test
 Simple list
 !! input
@@ -2638,6 +2648,21 @@ External link containing double-single-quotes with no space separating the url f
 </p>
 !! end
 
+!!test
+Text in square brackets that is not a link should parse as text
+!!input
+[foo]
+[{{echo|foo}}]
+[url={{echo|foo}}]
+[url=http://example.com]
+!!result
+<p>[foo]
+[foo]
+[url=foo]
+[url=<a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>]
+</p>
+!!end
+
 !! test
 URL-encoding in URL functions (single parameter)
 !! input
@@ -4601,7 +4626,7 @@ Magic Word: {{SERVER}}
 !! input
 {{SERVER}}
 !! result
-<p><a rel="nofollow" class="external free" href="http://Britney-Spears">http://Britney-Spears</a>
+<p><a rel="nofollow" class="external free" href="http://example.org">http://example.org</a>
 </p>
 !! end
 
@@ -4610,7 +4635,7 @@ Magic Word: {{SERVERNAME}}
 !! input
 {{SERVERNAME}}
 !! result
-<p>Britney-Spears
+<p>example.org
 </p>
 !! end
 
@@ -7040,6 +7065,15 @@ Image caption containing a newline
 </p>
 !!end
 
+!!test
+Parsoid: Image caption containing leading space
+(The leading space should not trigger nowiki escaping in wt2wt mode)
+!! input
+[[Image:Foobar.jpg|thumb| bar]]
+!! 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>bar</div></div></div>
+
+!!end
 
 !! test
 Bug 3090: External links other than http: in image captions
@@ -8737,9 +8771,9 @@ Sanitizer: Validating that <meta> and <link> work, but only for Microdata
        &lt;meta http-equiv="refresh" content="5"&gt;
        <meta itemprop="hello" content="5" />
 </p>
-       <link itemprop="hello" href="http&#58;//Britney-Spears" />
-       &lt;link rel="stylesheet" href="<a rel="nofollow" class="external free" href="http://Britney-Spears">http://Britney-Spears</a>"&gt;
-       <link itemprop="hello" href="http&#58;//Britney-Spears" />
+       <link itemprop="hello" href="http&#58;//example.org" />
+       &lt;link rel="stylesheet" href="<a rel="nofollow" class="external free" href="http://example.org">http://example.org</a>"&gt;
+       <link itemprop="hello" href="http&#58;//example.org" />
 </div>
 
 !! end
index c139f0b..12c2e00 100644 (file)
@@ -7,6 +7,7 @@ class MediaWikiPHPUnitCommand extends PHPUnit_TextUI_Command {
                'file=' => false,
                'use-filebackend=' => false,
                'use-bagostuff=' => false,
+               'use-jobqueue=' => false,
                'keep-uploads' => false,
                'use-normal-tables' => false,
                'reuse-db' => false,
index 067cfc4..e0e5535 100644 (file)
@@ -26,7 +26,11 @@ class ExtraParserTest extends MediaWikiTestCase {
                MagicWord::clearCache();
        }
 
-       // Bug 8689 - Long numeric lines kill the parser
+       /**
+        * Bug 8689 - Long numeric lines kill the parser
+        *
+        * @group Database
+        */
        function testBug8689() {
                global $wgUser;
                $longLine = '1.' . str_repeat( '1234567890', 100000 ) . "\n";
@@ -37,13 +41,20 @@ class ExtraParserTest extends MediaWikiTestCase {
                        $this->parser->parse( $longLine, $t, $options )->getText() );
        }
 
-       /* Test the parser entry points */
+       /**
+        * Test the parser entry points
+        *
+        * @group Database
+        */
        function testParse() {
                $title = Title::newFromText( __FUNCTION__ );
                $parserOutput = $this->parser->parse( "Test\n{{Foo}}\n{{Bar}}", $title, $this->options );
                $this->assertEquals( "<p>Test\nContent of <i>Template:Foo</i>\nContent of <i>Template:Bar</i>\n</p>", $parserOutput->getText() );
        }
 
+       /**
+        * @group Database
+        */
        function testPreSaveTransform() {
                global $wgUser;
                $title = Title::newFromText( __FUNCTION__ );
@@ -52,6 +63,9 @@ class ExtraParserTest extends MediaWikiTestCase {
                $this->assertEquals( "Test\nContent of ''Template:Foo''\n{{Bar}}", $outputText );
        }
 
+       /**
+        * @group Database
+        */
        function testPreprocess() {
                $title = Title::newFromText( __FUNCTION__ );
                $outputText = $this->parser->preprocess( "Test\n{{Foo}}\n{{Bar}}", $title, $this->options );
index 21fff68..4bd8c68 100644 (file)
@@ -1,9 +1,8 @@
 <?php
 /**
- * Unit tests for wfAssembleUrl()
+ * Tests for wfAssembleUrl()
  */
-
-class wfAssembleUrl extends MediaWikiTestCase {
+class WfAssembleUrlTest extends MediaWikiTestCase {
        /** @dataProvider provideURLParts */
        public function testWfAssembleUrl( $parts, $output ) {
                $partsDump = print_r( $parts, true );
index 0b048b4..8df038d 100644 (file)
@@ -1,8 +1,8 @@
 <?php
 /**
- * Unit tests for wfBCP47()
+ * Tests for wfBCP47()
  */
-class wfBCP47 extends MediaWikiTestCase {
+class WfBCP47Test extends MediaWikiTestCase {
        /**
         * test @see wfBCP47().
         * Please note the BCP explicitly state that language codes are case
index 1731fa0..10b62b3 100644 (file)
@@ -1,9 +1,8 @@
 <?php
-
 /**
  * Tests for wfBaseConvert()
  */
-class wfBaseConvertTest extends MediaWikiTestCase {
+class WfBaseConvertTest extends MediaWikiTestCase {
        public static function provideSingleDigitConversions() {
                return array(
                        //      2    3    5    8   10   16   36
index f90c8d0..407be8d 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Tests for wfBaseName()
  */
-class wfBaseName extends MediaWikiTestCase {
+class WfBaseNameTest extends MediaWikiTestCase {
        /**
         * @dataProvider providePaths
         */
index ac39c80..c1225e3 100644 (file)
@@ -1,9 +1,8 @@
 <?php
 /**
- * Unit tests for wfExpandUrl()
+ * Tests for wfExpandUrl()
  */
-
-class wfExpandUrl extends MediaWikiTestCase {
+class WfExpandUrlTest extends MediaWikiTestCase {
        /** @dataProvider provideExpandableUrls */
        public function testWfExpandUrl( $fullUrl, $shortUrl, $defaultProto, $server, $canServer, $httpsMode, $message ) {
                // Fake $wgServer and $wgCanonicalServer
index 3b4ac65..58cf6b9 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-class wfGetCaller extends MediaWikiTestCase {
+class WfGetCallerTest extends MediaWikiTestCase {
 
        function testZero() {
                $this->assertEquals( __METHOD__, wfGetCaller( 1 ) );
@@ -11,7 +11,7 @@ class wfGetCaller extends MediaWikiTestCase {
        }
 
        function testOne() {
-               $this->assertEquals( "wfGetCaller::testOne", self::callerOne() );
+               $this->assertEquals( 'WfGetCallerTest::testOne', self::callerOne() );
        }
 
        function intermediateFunction( $level = 2, $n = 0 ) {
@@ -22,14 +22,14 @@ class wfGetCaller extends MediaWikiTestCase {
        }
 
        function testTwo() {
-               $this->assertEquals( "wfGetCaller::testTwo", self::intermediateFunction() );
+               $this->assertEquals( 'WfGetCallerTest::testTwo', self::intermediateFunction() );
        }
 
        function testN() {
-               $this->assertEquals( "wfGetCaller::testN", self::intermediateFunction( 2, 0 ) );
-               $this->assertEquals( "wfGetCaller::intermediateFunction", self::intermediateFunction( 1, 0 ) );
+               $this->assertEquals( 'WfGetCallerTest::testN', self::intermediateFunction( 2, 0 ) );
+               $this->assertEquals( 'WfGetCallerTest::intermediateFunction', self::intermediateFunction( 1, 0 ) );
 
                for ( $i = 0; $i < 10; $i++ )
-                       $this->assertEquals( "wfGetCaller::intermediateFunction", self::intermediateFunction( $i + 1, $i ) );
+                       $this->assertEquals( 'WfGetCallerTest::intermediateFunction', self::intermediateFunction( $i + 1, $i ) );
        }
 }
diff --git a/tests/phpunit/includes/GlobalFunctions/wfParseUrlTest.php b/tests/phpunit/includes/GlobalFunctions/wfParseUrlTest.php
new file mode 100644 (file)
index 0000000..841a1b1
--- /dev/null
@@ -0,0 +1,143 @@
+<?php
+/**
+ * Tests for wfParseUrl()
+ *
+ * Copyright © 2013 Alexandre Emsenhuber
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class WfParseUrlTest extends MediaWikiTestCase {
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( 'wgUrlProtocols', array(
+                       '//', 'http://', 'file://', 'mailto:',
+               ) );
+       }
+
+       /** @dataProvider provideURLs */
+       public function testWfParseUrl( $url, $parts ) {
+               $partsDump = var_export( $parts, true );
+               $this->assertEquals(
+                       $parts,
+                       wfParseUrl( $url ),
+                       "Testing $url parses to $partsDump"
+               );
+       }
+
+       /**
+        * Provider of URLs for testing wfParseUrl()
+        *
+        * @return array
+        */
+       public static function provideURLs() {
+               return array(
+                       array(
+                               '//example.org',
+                               array(
+                                       'scheme' => '',
+                                       'delimiter' => '//',
+                                       'host' => 'example.org',
+                               )
+                       ),
+                       array(
+                               'http://example.org',
+                               array(
+                                       'scheme' => 'http',
+                                       'delimiter' => '://',
+                                       'host' => 'example.org',
+                               )
+                       ),
+                       array(
+                               'http://id:key@example.org:123/path?foo=bar#baz',
+                               array(
+                                       'scheme' => 'http',
+                                       'delimiter' => '://',
+                                       'user' => 'id',
+                                       'pass' => 'key',
+                                       'host' => 'example.org',
+                                       'port' => 123,
+                                       'path' => '/path',
+                                       'query' => 'foo=bar',
+                                       'fragment' => 'baz',
+                               )
+                       ),
+                       array(
+                               'file://example.org/etc/php.ini',
+                               array(
+                                       'scheme' => 'file',
+                                       'delimiter' => '://',
+                                       'host' => 'example.org',
+                                       'path' => '/etc/php.ini',
+                               )
+                       ),
+                       array(
+                               'file:///etc/php.ini',
+                               array(
+                                       'scheme' => 'file',
+                                       'delimiter' => '://',
+                                       'host' => '',
+                                       'path' => '/etc/php.ini',
+                               )
+                       ),
+                       array(
+                               'file:///c:/',
+                               array(
+                                       'scheme' => 'file',
+                                       'delimiter' => '://',
+                                       'host' => '',
+                                       'path' => '/c:/',
+                               )
+                       ),
+                       array(
+                               'mailto:id@example.org',
+                               array(
+                                       'scheme' => 'mailto',
+                                       'delimiter' => ':',
+                                       'host' => 'id@example.org',
+                                       'path' => '',
+                               )
+                       ),
+                       array(
+                               'mailto:id@example.org?subject=Foo',
+                               array(
+                                       'scheme' => 'mailto',
+                                       'delimiter' => ':',
+                                       'host' => 'id@example.org',
+                                       'path' => '',
+                                       'query' => 'subject=Foo',
+                               )
+                       ),
+                       array(
+                               'mailto:?subject=Foo',
+                               array(
+                                       'scheme' => 'mailto',
+                                       'delimiter' => ':',
+                                       'host' => '',
+                                       'path' => '',
+                                       'query' => 'subject=Foo',
+                               )
+                       ),
+                       array(
+                               'invalid://test/',
+                               false
+                       ),
+               );
+       }
+}
index af784bd..67861ee 100644 (file)
@@ -1,9 +1,8 @@
 <?php
 /**
- * Unit tests for wfRemoveDotSegments()
+ * Tests for wfRemoveDotSegments()
  */
-
-class wfRemoveDotSegments extends MediaWikiTestCase {
+class WfRemoveDotSegmentsTest extends MediaWikiTestCase {
        /** @dataProvider providePaths */
        public function testWfRemoveDotSegments( $inputPath, $outputPath ) {
                $this->assertEquals(
index da6c936..9d66d6b 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-class wfShorthandToIntegerTest extends MediaWikiTestCase {
+class WfShorthandToIntegerTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideABunchOfShorthands
         */
index 5fd0ed0..cf1830f 100644 (file)
@@ -1,9 +1,8 @@
 <?php
-
 /*
  * Tests for wfTimestamp()
  */
-class wfTimestamp extends MediaWikiTestCase {
+class WfTimestampTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideNormalTimestamps
         */
index 285a2d6..77685d5 100644 (file)
@@ -1,11 +1,10 @@
 <?php
 /**
- * Tests for includes/GlobalFunctions.php -> wfUrlencode()
+ * Tests for wfUrlencode()
  *
  * The function only need a string parameter and might react to IIS7.0
  */
-
-class wfUrlencodeTest extends MediaWikiTestCase {
+class WfUrlencodeTest extends MediaWikiTestCase {
        #### TESTS ##############################################################
 
        /** @dataProvider provideURLS */
index 367a8b3..453cec3 100644 (file)
@@ -6,6 +6,8 @@
  * @group Database
  */
 class JobQueueTest extends MediaWikiTestCase {
+       protected $key;
+       protected $queueRand, $queueRandTTL, $queueFifo, $queueFifoTTL;
        protected $old = array();
 
        function  __construct( $name = null, array $data = array(), $dataName = '' ) {
@@ -15,18 +17,34 @@ class JobQueueTest extends MediaWikiTestCase {
        }
 
        protected function setUp() {
-               global $wgMemc;
+               global $wgMemc, $wgJobTypeConf;
                parent::setUp();
                $this->old['wgMemc'] = $wgMemc;
                $wgMemc = new HashBagOStuff();
-               $this->queueRand = JobQueue::factory( array( 'class' => 'JobQueueDB',
-                       'wiki' => wfWikiID(), 'type' => 'null', 'order' => 'random' ) );
-               $this->queueRandTTL = JobQueue::factory( array( 'class' => 'JobQueueDB',
-                       'wiki' => wfWikiID(), 'type' => 'null', 'order' => 'random', 'claimTTL' => 10 ) );
-               $this->queueFifo = JobQueue::factory( array( 'class' => 'JobQueueDB',
-                       'wiki' => wfWikiID(), 'type' => 'null', 'order' => 'fifo' ) );
-               $this->queueFifoTTL = JobQueue::factory( array( 'class' => 'JobQueueDB',
-                       'wiki' => wfWikiID(), 'type' => 'null', 'order' => 'fifo', 'claimTTL' => 10 ) );
+               if ( $this->getCliArg( 'use-jobqueue=' ) ) {
+                       $name = $this->getCliArg( 'use-jobqueue=' );
+                       if ( !isset( $wgJobTypeConf[$name] ) ) {
+                               throw new MWException( "No \$wgJobTypeConf entry for '$name'." );
+                       }
+                       $baseConfig = $wgJobTypeConf[$name];
+               } else {
+                       $baseConfig = array( 'class' => 'JobQueueDB' );
+               }
+               $baseConfig['type'] = 'null';
+               $baseConfig['wiki'] = wfWikiID();
+               $this->queueRand = JobQueue::factory(
+                       array( 'order' => 'random', 'claimTTL' => 0 ) + $baseConfig );
+               $this->queueRandTTL = JobQueue::factory(
+                       array( 'order' => 'random', 'claimTTL' => 10 ) + $baseConfig );
+               $this->queueFifo = JobQueue::factory(
+                       array( 'order' => 'fifo', 'claimTTL' => 0 ) + $baseConfig );
+               $this->queueFifoTTL = JobQueue::factory(
+                       array( 'order' => 'fifo', 'claimTTL' => 10 ) + $baseConfig );
+               if ( $baseConfig['class'] !== 'JobQueueDB' ) { // DB namespace with prefix or temp tables
+                       foreach ( array( 'queueRand', 'queueRandTTL', 'queueFifo', 'queueFifoTTL' ) as $q ) {
+                               $this->$q->setTestingPrefix( 'unittests-' . wfRandomString( 32 ) );
+                       }
+               }
        }
 
        protected function tearDown() {
@@ -239,7 +257,7 @@ class JobQueueTest extends MediaWikiTestCase {
                        $queue->ack( $job );
                }
 
-               $this->assertFalse( $queue->isEmpty(), "Queue is not empty ($desc)" );
+               $this->assertFalse( $queue->pop(), "Queue is not empty ($desc)" );
 
                $queue->flushCaches();
                $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
index dfcdafd..51643ce 100644 (file)
@@ -65,44 +65,68 @@ class MagicVariableTest extends MediaWikiTestCase {
 
        # day
 
-       /** @dataProvider MediaWikiProvide::Days */
+       /**
+        * @dataProvider MediaWikiProvide::Days
+        * @group Database
+        */
        function testCurrentdayIsUnPadded( $day ) {
                $this->assertUnPadded( 'currentday', $day );
        }
 
-       /** @dataProvider MediaWikiProvide::Days */
+       /**
+        * @dataProvider MediaWikiProvide::Days
+        * @group Database
+        */
        function testCurrentdaytwoIsZeroPadded( $day ) {
                $this->assertZeroPadded( 'currentday2', $day );
        }
 
-       /** @dataProvider MediaWikiProvide::Days */
+       /**
+        * @dataProvider MediaWikiProvide::Days
+        * @group Database
+        */
        function testLocaldayIsUnPadded( $day ) {
                $this->assertUnPadded( 'localday', $day );
        }
 
-       /** @dataProvider MediaWikiProvide::Days */
+       /**
+        * @dataProvider MediaWikiProvide::Days
+        * @group Database
+        */
        function testLocaldaytwoIsZeroPadded( $day ) {
                $this->assertZeroPadded( 'localday2', $day );
        }
 
        # month
 
-       /** @dataProvider MediaWikiProvide::Months */
+       /**
+        * @dataProvider MediaWikiProvide::Months
+        * @group Database
+        */
        function testCurrentmonthIsZeroPadded( $month ) {
                $this->assertZeroPadded( 'currentmonth', $month );
        }
 
-       /** @dataProvider MediaWikiProvide::Months */
+       /**
+        * @dataProvider MediaWikiProvide::Months
+        * @group Database
+        */
        function testCurrentmonthoneIsUnPadded( $month ) {
                $this->assertUnPadded( 'currentmonth1', $month );
        }
 
-       /** @dataProvider MediaWikiProvide::Months */
+       /**
+        * @dataProvider MediaWikiProvide::Months
+        * @group Database
+        */
        function testLocalmonthIsZeroPadded( $month ) {
                $this->assertZeroPadded( 'localmonth', $month );
        }
 
-       /** @dataProvider MediaWikiProvide::Months */
+       /**
+        * @dataProvider MediaWikiProvide::Months
+        * @group Database
+        */
        function testLocalmonthoneIsUnPadded( $month ) {
                $this->assertUnPadded( 'localmonth1', $month );
        }
@@ -110,24 +134,36 @@ class MagicVariableTest extends MediaWikiTestCase {
 
        # revision day
 
-       /** @dataProvider MediaWikiProvide::Days */
+       /**
+        * @dataProvider MediaWikiProvide::Days
+        * @group Database
+        */
        function testRevisiondayIsUnPadded( $day ) {
                $this->assertUnPadded( 'revisionday', $day );
        }
 
-       /** @dataProvider MediaWikiProvide::Days */
+       /**
+        * @dataProvider MediaWikiProvide::Days
+        * @group Database
+        */
        function testRevisiondaytwoIsZeroPadded( $day ) {
                $this->assertZeroPadded( 'revisionday2', $day );
        }
 
        # revision month
 
-       /** @dataProvider MediaWikiProvide::Months */
+       /**
+        * @dataProvider MediaWikiProvide::Months
+        * @group Database
+        */
        function testRevisionmonthIsZeroPadded( $month ) {
                $this->assertZeroPadded( 'revisionmonth', $month );
        }
 
-       /** @dataProvider MediaWikiProvide::Months */
+       /**
+        * @dataProvider MediaWikiProvide::Months
+        * @group Database
+        */
        function testRevisionmonthoneIsUnPadded( $month ) {
                $this->assertUnPadded( 'revisionmonth1', $month );
        }
@@ -135,6 +171,7 @@ class MagicVariableTest extends MediaWikiTestCase {
        /**
         * Rough tests for {{SERVERNAME}} magic word
         * Bug 31176
+        * @group Database
         */
        function testServernameFromDifferentProtocols() {
                global $wgServer;
index ec9ee1a..f8d0c37 100644 (file)
@@ -275,7 +275,7 @@ class NewParserTest extends MediaWikiTestCase {
                }
 
                $settings = array(
-                       'wgServer' => 'http://Britney-Spears',
+                       'wgServer' => 'http://example.org',
                        'wgScript' => '/index.php',
                        'wgScriptPath' => '/',
                        'wgArticlePath' => '/wiki/$1',
index ed60079..d643264 100644 (file)
@@ -20,6 +20,7 @@ class TagHookTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideValidNames
+        * @group Database
         */
        function testTagHooks( $tag ) {
                global $wgParserConf, $wgContLang;
@@ -47,6 +48,7 @@ class TagHookTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideValidNames
+        * @group Database
         */
        function testFunctionTagHooks( $tag ) {
                global $wgParserConf, $wgContLang;
index c89656d..77db213 100644 (file)
                liveMessages = mw.messages.values;
 
                function freshConfigCopy( custom ) {
-                       // "deep=true" is important here.
-                       // Otherwise we just create a new object with values referring to live config.
-                       // e.g. mw.config.set( 'wgFileExtensions', [] ) would not effect liveConfig,
-                       // but mw.config.get( 'wgFileExtensions' ).push( 'png' ) would as the array
-                       // was passed by reference in $.extend's loop.
-                       return $.extend( /*deep=*/true, {}, liveConfig, custom );
+                       // Tests should mock all factors that directly influence the tested code.
+                       // For backwards compatibility though we set mw.config to a copy of the live config
+                       // and extend it with the (optionally) given custom settings for this test
+                       // (instead of starting blank with only the given custmo settings).
+                       // This is a shallow copy, so we don't end up with settings taking an array value
+                       // extended with the custom settings - setting a config property means you override it,
+                       // not extend it.
+                       return $.extend( {}, liveConfig, custom );
                }
 
                function freshMessagesCopy( custom ) {
index 140da38..906369e 100644 (file)
@@ -1,12 +1,12 @@
 ( function ( $ ) {
        QUnit.module( 'jquery.hidpi', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'devicePixelRatio', function ( assert ) {
+       QUnit.test( 'devicePixelRatio', 1, function ( assert ) {
                var devicePixelRatio = $.devicePixelRatio();
                assert.equal( typeof devicePixelRatio, 'number', '$.devicePixelRatio() returns a number' );
        } );
 
-       QUnit.test( 'matchSrcSet', function ( assert ) {
+       QUnit.test( 'matchSrcSet', 6, function ( assert ) {
                var srcset = 'onefive.png 1.5x, two.png 2x';
 
                // Nice exact matches
index 2765498..5fae065 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( $ ) {
        QUnit.module( 'jquery.mwExtension', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'String functions', function ( assert ) {
+       QUnit.test( 'String functions', 7, function ( assert ) {
                assert.equal( $.trimLeft( '  foo bar  ' ), 'foo bar  ', 'trimLeft' );
                assert.equal( $.trimRight( '  foo bar  ' ), '  foo bar', 'trimRight' );
                assert.equal( $.ucFirst( 'foo' ), 'Foo', 'ucFirst' );
@@ -15,7 +15,7 @@
                assert.equal( $.escapeRE( '0123456789' ), '0123456789', 'escapeRE - Leave numbers alone' );
        } );
 
-       QUnit.test( 'Is functions', function ( assert ) {
+       QUnit.test( 'Is functions', 15, function ( assert ) {
                assert.strictEqual( $.isDomElement( document.getElementById( 'qunit-header' ) ), true,
                        'isDomElement: #qunit-header Node' );
                assert.strictEqual( $.isDomElement( document.getElementById( 'random-name' ) ), false,
                assert.strictEqual( $.isDomElement( { foo: 1 } ), false,
                        'isDomElement: Object' );
 
-               assert.strictEqual( $.isEmpty( 'string' ), false, 'isEmptry: "string"' );
-               assert.strictEqual( $.isEmpty( '0' ), true, 'isEmptry: "0"' );
-               assert.strictEqual( $.isEmpty( '' ), true, 'isEmptry: ""' );
-               assert.strictEqual( $.isEmpty( 1 ), false, 'isEmptry: 1' );
-               assert.strictEqual( $.isEmpty( [] ), true, 'isEmptry: []' );
-               assert.strictEqual( $.isEmpty( {} ), true, 'isEmptry: {}' );
+               assert.strictEqual( $.isEmpty( 'string' ), false, 'isEmpty: "string"' );
+               assert.strictEqual( $.isEmpty( '0' ), true, 'isEmpty: "0"' );
+               assert.strictEqual( $.isEmpty( '' ), true, 'isEmpty: ""' );
+               assert.strictEqual( $.isEmpty( 1 ), false, 'isEmpty: 1' );
+               assert.strictEqual( $.isEmpty( [] ), true, 'isEmpty: []' );
+               assert.strictEqual( $.isEmpty( {} ), true, 'isEmpty: {}' );
 
                // Documented behaviour
-               assert.strictEqual( $.isEmpty( { length: 0 } ), true, 'isEmptry: { length: 0 }' );
+               assert.strictEqual( $.isEmpty( { length: 0 } ), true, 'isEmpty: { length: 0 }' );
        } );
 
-       QUnit.test( 'Comparison functions', function ( assert ) {
+       QUnit.test( 'Comparison functions', 5, function ( assert ) {
                assert.ok( $.compareArray( [0, 'a', [], [2, 'b'] ], [0, 'a', [], [2, 'b'] ] ),
                        'compareArray: Two deep arrays that are excactly the same' );
                assert.ok( !$.compareArray( [1], [2] ), 'compareArray: Two different arrays (false)' );
index c61365e..95a16c8 100644 (file)
@@ -81,7 +81,7 @@
                        } );
        }
 
-       QUnit.test( 'Replace', 9, function ( assert ) {
+       QUnit.test( 'Replace', 7, function ( assert ) {
                var parser = mw.jqueryMsg.getMessageFunction();
 
                mw.messages.set( 'simple', 'Foo $1 baz $2' );
index 7cfa46a..9ca434f 100644 (file)
@@ -1,4 +1,5 @@
 ( function ( mw, $ ) {
+       'use strict';
 
        QUnit.module( 'mediawiki.language', QUnit.newMwEnvironment( {
                setup: function () {
@@ -32,6 +33,7 @@
                } );
        }
 
+       // These tests run only for the current UI language.
        var grammarTests = {
                bs: [
                        {
                                word: 'тесть',
                                grammarForm: 'genitive',
                                expected: 'тестя',
-                               description: 'Grammar test for genitive case'
+                               description: 'Grammar test for genitive case, тесть -> тестя'
                        },
                        {
                                word: 'привилегия',
                                grammarForm: 'genitive',
                                expected: 'привилегии',
-                               description: 'Grammar test for genitive case'
+                               description: 'Grammar test for genitive case, привилегия -> привилегии'
                        },
                        {
                                word: 'установка',
                                grammarForm: 'genitive',
                                expected: 'установки',
-                               description: 'Grammar test for genitive case'
+                               description: 'Grammar test for genitive case, установка -> установки'
                        },
                        {
                                word: 'похоти',
                                grammarForm: 'genitive',
                                expected: 'похотей',
-                               description: 'Grammar test for genitive case'
+                               description: 'Grammar test for genitive case, похоти -> похотей'
                        },
                        {
                                word: 'доводы',
                                grammarForm: 'genitive',
                                expected: 'доводов',
-                               description: 'Grammar test for genitive case'
+                               description: 'Grammar test for genitive case, доводы -> доводов'
                        },
                        {
                                word: 'песчаник',
                                grammarForm: 'genitive',
                                expected: 'песчаника',
-                               description: 'Grammar test for genitive case'
+                               description: 'Grammar test for genitive case, песчаник -> песчаника'
+                       },
+                       {
+                               word: 'данные',
+                               grammarForm: 'genitive',
+                               expected: 'данных',
+                               description: 'Grammar test for genitive case, данные -> данных'
+                       },
+                       {
+                               word: 'тесть',
+                               grammarForm: 'prepositional',
+                               expected: 'тесте',
+                               description: 'Grammar test for prepositional case, тесть -> тесте'
+                       },
+                       {
+                               word: 'привилегия',
+                               grammarForm: 'prepositional',
+                               expected: 'привилегии',
+                               description: 'Grammar test for prepositional case, привилегия -> привилегии'
+                       },
+                       {
+                               word: 'установка',
+                               grammarForm: 'prepositional',
+                               expected: 'установке',
+                               description: 'Grammar test for prepositional case, установка -> установке'
+                       },
+                       {
+                               word: 'похоти',
+                               grammarForm: 'prepositional',
+                               expected: 'похотях',
+                               description: 'Grammar test for prepositional case, похоти -> похотях'
+                       },
+                       {
+                               word: 'доводы',
+                               grammarForm: 'prepositional',
+                               expected: 'доводах',
+                               description: 'Grammar test for prepositional case, доводы -> доводах'
+                       },
+                       {
+                               word: 'песчаник',
+                               grammarForm: 'prepositional',
+                               expected: 'песчанике',
+                               description: 'Grammar test for prepositional case, песчаник -> песчанике'
+                       },
+                       {
+                               word: 'данные',
+                               grammarForm: 'prepositional',
+                               expected: 'данных',
+                               description: 'Grammar test for prepositional case, данные -> данных'
                        }
                ],
 
-
                hu: [
                        {
                                word: 'Wikipédiá',
index 03ffbfd..1356ce6 100644 (file)
@@ -27,7 +27,6 @@
  *
  */
 
-require_once 'PHPUnit/Framework.php';
 require_once 'PHPUnit/Framework/TestSuite.php';
 
 require_once ( __DIR__ . '/MediaWikiUserInterfaceTestCase.php' );