Merge "Cleanups to MigrateFileRepoLayout"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 5 Oct 2015 23:50:38 +0000 (23:50 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 5 Oct 2015 23:50:38 +0000 (23:50 +0000)
82 files changed:
RELEASE-NOTES-1.27
autoload.php
includes/Block.php
includes/DefaultSettings.php
includes/Export.php
includes/FileDeleteForm.php
includes/MediaWiki.php
includes/Revision.php
includes/RevisionList.php
includes/SiteStats.php
includes/Title.php
includes/User.php
includes/UserRightsProxy.php
includes/api/ApiBase.php
includes/api/ApiModuleManager.php
includes/api/ApiPageSet.php
includes/api/i18n/ja.json
includes/api/i18n/pl.json
includes/api/i18n/ps.json
includes/cache/BacklinkCache.php
includes/cache/LinkBatch.php
includes/cache/MessageBlobStore.php
includes/changetags/ChangeTagsLogList.php
includes/changetags/ChangeTagsRevisionList.php
includes/db/Database.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/DatabaseSqlite.php
includes/deferred/SiteStatsUpdate.php
includes/externalstore/ExternalStoreDB.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/installer/i18n/ps.json
includes/installer/i18n/zh-hant.json
includes/libs/objectcache/BagOStuff.php
includes/logging/LogEventsList.php
includes/media/XMP.php
includes/objectcache/MultiWriteBagOStuff.php
includes/objectcache/SqlBagOStuff.php
includes/page/WikiPage.php
includes/parser/ParserCache.php
includes/resourceloader/ResourceLoader.php
includes/search/SearchDatabase.php
includes/search/SearchResult.php
includes/search/SearchResultSet.php
includes/upload/UploadStash.php
includes/utils/BatchRowIterator.php
includes/utils/BatchRowWriter.php
includes/utils/IP.php
languages/i18n/ace.json
languages/i18n/anp.json
languages/i18n/ast.json
languages/i18n/be-tarask.json
languages/i18n/bgn.json
languages/i18n/ca.json
languages/i18n/ext.json
languages/i18n/fr.json
languages/i18n/he.json
languages/i18n/id.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/lb.json
languages/i18n/lt.json
languages/i18n/mr.json
languages/i18n/nah.json
languages/i18n/nap.json
languages/i18n/olo.json
languages/i18n/pl.json
languages/i18n/ps.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sl.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
resources/Resources.php
resources/src/mediawiki/mediawiki.jqueryMsg.js
tests/phpunit/includes/SampleTest.php
tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js

index 1670552..65e0799 100644 (file)
@@ -14,6 +14,8 @@ production.
   $wgResourceLoaderMinifierMaxLineLength, because there was little value in
   making the behavior configurable. The default values (`false` for the former,
   1000 for the latter) are now hard-coded.
+* $wgDebugDumpSqlLength was removed (deprecated in 1.24).
+* $wgDebugDBTransactions was removed (deprecated in 1.20).
 
 === New features in 1.27 ===
 * $wgDataCenterId and $wgDataCenterRoles where added, which will serve as
index 9c859b7..6820fc7 100644 (file)
@@ -290,6 +290,7 @@ $wgAutoloadLocalClasses = array(
        'DBSiteStore' => __DIR__ . '/includes/site/DBSiteStore.php',
        'DBUnexpectedError' => __DIR__ . '/includes/db/DatabaseError.php',
        'DataUpdate' => __DIR__ . '/includes/deferred/DataUpdate.php',
+       'Database' => __DIR__ . '/includes/db/Database.php',
        'DatabaseBase' => __DIR__ . '/includes/db/Database.php',
        'DatabaseInstaller' => __DIR__ . '/includes/installer/DatabaseInstaller.php',
        'DatabaseLag' => __DIR__ . '/maintenance/lag.php',
@@ -933,7 +934,6 @@ $wgAutoloadLocalClasses = array(
        'PostgresBlob' => __DIR__ . '/includes/db/DatabasePostgres.php',
        'PostgresField' => __DIR__ . '/includes/db/DatabasePostgres.php',
        'PostgresInstaller' => __DIR__ . '/includes/installer/PostgresInstaller.php',
-       'PostgresTransactionState' => __DIR__ . '/includes/db/DatabasePostgres.php',
        'PostgresUpdater' => __DIR__ . '/includes/installer/PostgresUpdater.php',
        'Preferences' => __DIR__ . '/includes/Preferences.php',
        'PreferencesForm' => __DIR__ . '/includes/Preferences.php',
index c5a16fc..0ec4ad1 100644 (file)
@@ -452,7 +452,7 @@ class Block {
         * Insert a block into the block table. Will fail if there is a conflicting
         * block (same name and options) already in the database.
         *
-        * @param DatabaseBase $dbw If you have one available
+        * @param IDatabase $dbw If you have one available
         * @return bool|array False on failure, assoc array on success:
         *      ('id' => block ID, 'autoIds' => array of autoblock IDs)
         */
@@ -556,7 +556,7 @@ class Block {
 
        /**
         * Get an array suitable for passing to $dbw->insert() or $dbw->update()
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return array
         */
        protected function getDatabaseArray( $db = null ) {
index 339ae9b..deb85f5 100644 (file)
@@ -5453,13 +5453,6 @@ $wgDebugRawPage = false;
  */
 $wgDebugComments = false;
 
-/**
- * Extensive database transaction state debugging
- *
- * @since 1.20
- */
-$wgDebugDBTransactions = false;
-
 /**
  * Write SQL queries to the debug log.
  *
@@ -5470,13 +5463,6 @@ $wgDebugDBTransactions = false;
  */
 $wgDebugDumpSql = false;
 
-/**
- * Trim logged SQL queries to this many bytes. Set 0/false/null to do no
- * trimming.
- * @since 1.24
- */
-$wgDebugDumpSqlLength = 500;
-
 /**
  * Performance expectations for DB usage
  *
index adab21c..b4d7737 100644 (file)
@@ -79,7 +79,7 @@ class WikiExporter {
         * make additional queries to pull source data while the
         * main query is still running.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param int|array $history One of WikiExporter::FULL, WikiExporter::CURRENT,
         *   WikiExporter::RANGE or WikiExporter::STABLE, or an associative array:
         *   - offset: non-inclusive offset at which to start the query
index bcd6db2..ae186bc 100644 (file)
@@ -195,9 +195,7 @@ class FileDeleteForm {
                                // or revision is missing, so check for isOK() rather than isGood()
                                if ( $deleteStatus->isOK() ) {
                                        $status = $file->delete( $reason, $suppress, $user );
-                                       if ( $status->isOK() ) {
-                                               $dbw->commit( __METHOD__ );
-                                       } else {
+                                       if ( !$status->isOK() ) {
                                                $dbw->rollback( __METHOD__ );
                                        }
                                }
index f3fb158..e29319b 100644 (file)
@@ -471,7 +471,6 @@ class MediaWiki {
         */
        public function run() {
                try {
-                       $this->checkMaxLag();
                        try {
                                $this->main();
                        } catch ( ErrorPageError $e ) {
@@ -554,33 +553,6 @@ class MediaWiki {
                }
        }
 
-       /**
-        * Checks if the request should abort due to a lagged server,
-        * for given maxlag parameter.
-        * @return bool
-        */
-       private function checkMaxLag() {
-               $maxLag = $this->context->getRequest()->getVal( 'maxlag' );
-               if ( !is_null( $maxLag ) ) {
-                       list( $host, $lag ) = wfGetLB()->getMaxLag();
-                       if ( $lag > $maxLag ) {
-                               $resp = $this->context->getRequest()->response();
-                               $resp->statusHeader( 503 );
-                               $resp->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) );
-                               $resp->header( 'X-Database-Lag: ' . intval( $lag ) );
-                               $resp->header( 'Content-Type: text/plain' );
-                               if ( $this->config->get( 'ShowHostnames' ) ) {
-                                       echo "Waiting for $host: $lag seconds lagged\n";
-                               } else {
-                                       echo "Waiting for a database server: $lag seconds lagged\n";
-                               }
-
-                               exit;
-                       }
-               }
-               return true;
-       }
-
        private function main() {
                global $wgTitle, $wgTrxProfilerLimits;
 
index a7a87e8..24c025f 100644 (file)
@@ -223,7 +223,7 @@ class Revision implements IDBAccessObject {
         * Load a page revision from a given revision ID number.
         * Returns null if no such revision can be found.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param int $id
         * @return Revision|null
         */
@@ -236,7 +236,7 @@ class Revision implements IDBAccessObject {
         * that's attached to a given page. If not attached
         * to that page, will return null.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param int $pageid
         * @param int $id
         * @return Revision|null
@@ -256,7 +256,7 @@ class Revision implements IDBAccessObject {
         * that's attached to a given page. If not attached
         * to that page, will return null.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param Title $title
         * @param int $id
         * @return Revision|null
@@ -281,7 +281,7 @@ class Revision implements IDBAccessObject {
         * WARNING: Timestamps may in some circumstances not be unique,
         * so this isn't the best key to use.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param Title $title
         * @param string $timestamp
         * @return Revision|null
@@ -333,7 +333,7 @@ class Revision implements IDBAccessObject {
         * Given a set of conditions, fetch a revision from
         * the given database connection.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param array $conditions
         * @param int $flags (optional)
         * @return Revision|null
@@ -375,7 +375,7 @@ class Revision implements IDBAccessObject {
         * which will return matching database rows with the
         * fields necessary to build Revision objects.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param array $conditions
         * @param int $flags (optional)
         * @return ResultWrapper
@@ -519,7 +519,7 @@ class Revision implements IDBAccessObject {
 
        /**
         * Do a batched query to get the parent revision lengths
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param array $revIds
         * @return array
         */
@@ -1206,7 +1206,7 @@ class Revision implements IDBAccessObject {
         * Get previous revision Id for this page_id
         * This is used to populate rev_parent_id on save
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return int
         */
        private function getPreviousRevisionId( $db ) {
@@ -1359,7 +1359,7 @@ class Revision implements IDBAccessObject {
         * Insert a new revision into the database, returning the new revision ID
         * number on success and dies horribly on failure.
         *
-        * @param DatabaseBase $dbw (master connection)
+        * @param IDatabase $dbw (master connection)
         * @throws MWException
         * @return int
         */
@@ -1596,7 +1596,7 @@ class Revision implements IDBAccessObject {
         * Such revisions can for instance identify page rename
         * operations and other such meta-modifications.
         *
-        * @param DatabaseBase $dbw
+        * @param IDatabase $dbw
         * @param int $pageId ID number of the page to read from
         * @param string $summary Revision's summary
         * @param bool $minor Whether the revision should be considered as minor
@@ -1746,7 +1746,7 @@ class Revision implements IDBAccessObject {
        /**
         * Get count of revisions per page...not very efficient
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param int $id Page id
         * @return int
         */
@@ -1762,7 +1762,7 @@ class Revision implements IDBAccessObject {
        /**
         * Get count of revisions per page...not very efficient
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param Title $title
         * @return int
         */
@@ -1782,7 +1782,7 @@ class Revision implements IDBAccessObject {
         * @since 1.20
         * @deprecated since 1.24
         *
-        * @param DatabaseBase|int $db The Database to perform the check on. May be given as a
+        * @param IDatabase|int $db The Database to perform the check on. May be given as a
         *        Database object or a database identifier usable with wfGetDB.
         * @param int $pageId The ID of the page in question
         * @param int $userId The ID of the user in question
index e417473..1df0ca0 100644 (file)
@@ -121,7 +121,7 @@ abstract class RevisionListBase extends ContextSource {
 
        /**
         * Do the DB query to iterate through the objects.
-        * @param DatabaseBase $db DatabaseBase object to use for the query
+        * @param IDatabase $db DatabaseBase object to use for the query
         */
        abstract public function doQuery( $db );
 
@@ -264,7 +264,7 @@ class RevisionList extends RevisionListBase {
        }
 
        /**
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return mixed
         */
        public function doQuery( $db ) {
index 81172a1..64e5ea0 100644 (file)
@@ -98,7 +98,7 @@ class SiteStats {
        }
 
        /**
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return bool|ResultWrapper
         */
        static function doLoad( $db ) {
@@ -364,7 +364,7 @@ class SiteStatsInit {
         * Do all updates and commit them. More or less a replacement
         * for the original initStats, but without output.
         *
-        * @param DatabaseBase|bool $database
+        * @param IDatabase|bool $database
         * - Boolean: whether to use the master DB
         * - DatabaseBase: database connection to use
         * @param array $options Array of options, may contain the following values
index eac712b..e2cbc8e 100644 (file)
@@ -530,7 +530,7 @@ class Title {
         * @param string $title Database key form
         * @param string $fragment The link fragment (after the "#")
         * @param string $interwiki Interwiki prefix
-        * @return Title The new object, or null on an error
+        * @return Title|null The new object, or null on an error
         */
        public static function makeTitleSafe( $ns, $title, $fragment = '', $interwiki = '' ) {
                if ( !MWNamespace::exists( $ns ) ) {
@@ -4383,7 +4383,7 @@ class Title {
        /**
         * Updates page_touched for this page; called from LinksUpdate.php
         *
-        * @param integer $purgeTime TS_MW timestamp [optional]
+        * @param string $purgeTime [optional] TS_MW timestamp
         * @return bool True if the update succeeded
         */
        public function invalidateCache( $purgeTime = null ) {
@@ -4430,7 +4430,7 @@ class Title {
        /**
         * Get the last touched timestamp
         *
-        * @param DatabaseBase $db Optional db
+        * @param IDatabase $db Optional db
         * @return string Last-touched timestamp
         */
        public function getTouched( $db = null ) {
index 4822f53..e523b68 100644 (file)
@@ -935,7 +935,7 @@ class User implements IDBAccessObject {
         * the cached User object, we assume that whatever mechanism is setting
         * the expiration date is also expiring the User cache.
         * @since 1.23
-        * @return string|bool The datestamp of the expiration, or null if not set
+        * @return string|null The datestamp of the expiration, or null if not set
         */
        public function getPasswordExpireDate() {
                $this->load();
index 2c7032f..0d1708f 100644 (file)
@@ -31,7 +31,7 @@ class UserRightsProxy {
         *
         * @see newFromId()
         * @see newFromName()
-        * @param DatabaseBase $db Db connection
+        * @param IDatabase $db Db connection
         * @param string $database Database name
         * @param string $name User name
         * @param int $id User ID
index f5ceb33..1465543 100644 (file)
@@ -2820,7 +2820,7 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * @deprecated since 1.25, always returns empty string
-        * @param DatabaseBase|bool $db
+        * @param IDatabase|bool $db
         * @return string
         */
        public function getModuleProfileName( $db = false ) {
index ba6c144..7c0a430 100644 (file)
@@ -275,7 +275,7 @@ class ApiModuleManager extends ContextSource {
        /**
         * Returns the group name for the given module
         * @param string $moduleName
-        * @return string Group name or null if missing
+        * @return string|null Group name or null if missing
         */
        public function getModuleGroup( $moduleName ) {
                if ( isset( $this->mModules[$moduleName] ) ) {
index ceb0905..17c148e 100644 (file)
@@ -701,7 +701,7 @@ class ApiPageSet extends ApiBase {
         * Note that the query result must include the columns returned by
         * $this->getPageTableFields().
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param ResultWrapper $queryResult Query result object
         */
        public function populateFromQueryResult( $db, $queryResult ) {
index 519fd05..ee74804 100644 (file)
        "apihelp-query+allcategories-param-from": "列挙を開始するカテゴリ。",
        "apihelp-query+allcategories-param-to": "列挙を終了するカテゴリ。",
        "apihelp-query+allcategories-param-prefix": "この値で始まるタイトルのカテゴリを検索します。",
+       "apihelp-query+allcategories-param-dir": "並べ替えの方向。",
        "apihelp-query+allcategories-param-limit": "返すカテゴリの数。",
+       "apihelp-query+allcategories-param-prop": "取得するプロパティ:",
        "apihelp-query+allcategories-example-generator": "<kbd>List</kbd> で始まるカテゴリページに関する情報を取得する。",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "<var>$3user</var> と同時に使用できません。",
        "apihelp-query+alldeletedrevisions-param-start": "列挙の始点となるタイムスタンプ。",
        "apihelp-query+allfileusages-param-from": "列挙を開始するファイルのタイトル。",
        "apihelp-query+allfileusages-param-to": "列挙を終了するファイルのタイトル。",
        "apihelp-query+allfileusages-param-prefix": "この値で始まるすべてのファイルのタイトルを検索する。",
+       "apihelp-query+allimages-param-sort": "並べ替えに使用するプロパティ。",
        "apihelp-query+allimages-param-from": "列挙の始点となる画像タイトル。$1sort=name を指定した場合のみ使用できます。",
        "apihelp-query+allimages-param-to": "列挙の終点となる画像タイトル。$1sort=name を指定した場合のみ使用できます。",
        "apihelp-query+allimages-param-start": "列挙の始点となるタイムスタンプ。$1sort=timestamp を指定した場合のみ使用できます。",
        "apihelp-query+alllinks-param-to": "列挙を終了するリンクのページ名。",
        "apihelp-query+alllinks-param-prefix": "この値で始まるすべてのリンクされたページを検索する。",
        "apihelp-query+alllinks-example-B": "<kbd>B</kbd> で始まるリンクされたページ (存在しないページも含む)を、リンク元のページIDとともに表示する。",
+       "apihelp-query+allmessages-param-prop": "取得するプロパティ:",
        "apihelp-query+allmessages-param-args": "メッセージ中に展開される引数。",
        "apihelp-query+allmessages-param-filter": "この文字列を含んだ名前のメッセージのみを返す。",
        "apihelp-query+allmessages-param-customised": "変更された状態のメッセージのみを返す。",
        "apihelp-query+allpages-param-to": "列挙を終了するページ名。",
        "apihelp-query+allpages-param-prefix": "この値で始まるすべてのページ名を検索します。",
        "apihelp-query+allpages-param-prtype": "保護されているページに絞り込む。",
+       "apihelp-query+allpages-param-prlevel": "保護レベルで絞り込む ($1type= パラメーターと同時に使用しなければなりません)。",
        "apihelp-query+allpages-param-limit": "返すページの総数。",
        "apihelp-query+allpages-example-B": "<kbd>B</kbd> で始まるページの一覧を表示する。",
        "apihelp-query+allpages-example-generator": "<kbd>T</kbd> で始まる4つのページに関する情報を表示する。",
        "apihelp-query+allusers-param-from": "列挙を開始する利用者名。",
        "apihelp-query+allusers-param-to": "列挙を終了する利用者名。",
        "apihelp-query+allusers-param-prefix": "この値で始まるすべての利用者を検索する。",
+       "apihelp-query+allusers-param-dir": "並べ替えの方向。",
        "apihelp-query+allusers-param-group": "このグループに所属する利用者のみを結果に含める。",
        "apihelp-query+allusers-param-excludegroup": "このグループに所属する利用者を結果から除外する。",
        "apihelp-query+allusers-param-limit": "返す利用者名の総数。",
        "apihelp-query+blocks-param-ids": "一覧表示するブロックIDのリスト (任意)。",
        "apihelp-query+blocks-param-users": "検索対象の利用者のリスト (任意)。",
        "apihelp-query+blocks-param-limit": "一覧表示するブロックの最大数。",
+       "apihelp-query+blocks-param-prop": "取得するプロパティ:",
        "apihelp-query+blocks-example-simple": "ブロックを一覧表示する。",
        "apihelp-query+blocks-example-users": "利用者<kbd>Alice</kbd> および <kbd>Bob</kbd> のブロックを一覧表示する。",
        "apihelp-query+categories-param-limit": "返すカテゴリの数。",
        "apihelp-query+categorymembers-param-title": "一覧表示するカテゴリ (必須)。<kbd>{{ns:category}}:</kbd> 接頭辞を含まなければなりません。<var>$1pageid</var> とは同時に使用できません。",
        "apihelp-query+categorymembers-param-pageid": "一覧表示するカテゴリのページID. <var>$1title</var> とは同時に使用できません。",
        "apihelp-query+categorymembers-param-limit": "返すページの最大数。",
+       "apihelp-query+categorymembers-param-sort": "並べ替えに使用するプロパティ。",
        "apihelp-query+categorymembers-param-start": "列挙の始点となるタイムスタンプ。<kbd>$1sort=timestamp</kbd>を指定した場合のみ使用できます。",
        "apihelp-query+categorymembers-param-end": "列挙の終点となるタイムスタンプ。<kbd>$1sort=timestamp</kbd>を指定した場合のみ使用できます。",
        "apihelp-query+categorymembers-param-startsortkeyprefix": "列挙の始点となるソートキーの接頭辞。<kbd>$1sort=sortkey</kbd>を指定した場合のみ使用できます。<var>$1starthexsortkey</var>をオーバーライドします。",
        "apihelp-query+exturlusage-description": "与えられたURLを含むページを一覧表示します。",
        "apihelp-query+exturlusage-example-simple": "<kbd>http://www.mediawiki.org</kbd> にリンクしているページを一覧表示する。",
        "apihelp-query+filearchive-example-simple": "削除されたファイルの一覧を表示する。",
+       "apihelp-query+fileusage-param-prop": "取得するプロパティ:",
        "apihelp-query+fileusage-example-simple": "[[:File:Example.jpg]] を使用しているページの一覧を取得する。",
        "apihelp-query+fileusage-example-generator": "[[:File:Example.jpg]] を使用しているページの情報を取得する。",
+       "apihelp-query+imageinfo-param-prop": "取得するファイル情報:",
        "apihelp-query+imageinfo-param-start": "一覧表示の始点となるタイムスタンプ。",
        "apihelp-query+imageinfo-param-end": "一覧表示の終点となるタイムスタンプ。",
        "apihelp-query+images-description": "与えられたページに含まれるすべてのファイルを返します。",
        "apihelp-query+imageusage-example-simple": "[[:File:Albert Einstein Head.jpg]] を使用しているページを表示する。",
        "apihelp-query+imageusage-example-generator": "[[:File:Albert Einstein Head.jpg]] を使用しているページに関する情報を取得する。",
        "apihelp-query+info-description": "ページの基本的な情報を取得します。",
+       "apihelp-query+info-param-prop": "追加で取得するプロパティ:",
        "apihelp-query+info-paramvalue-prop-protection": "それぞれのページの保護レベルを一覧表示する。",
        "apihelp-query+info-example-simple": "<kbd>Main Page</kbd> に関する情報を取得する。",
+       "apihelp-query+iwbacklinks-param-prop": "取得するプロパティ:",
        "apihelp-query+iwbacklinks-example-simple": "[[wikibooks:Test]] へリンクしているページを取得する。",
        "apihelp-query+iwbacklinks-example-generator": "[[wikibooks:Test]] へリンクしているページの情報を取得する。",
        "apihelp-query+iwlinks-param-limit": "返すウィキ間リンクの数。",
        "apihelp-query+langbacklinks-param-lang": "言語間リンクの言語。",
        "apihelp-query+langbacklinks-param-title": "検索する言語間リンク。$1lang と同時に使用しなければなりません。",
        "apihelp-query+langbacklinks-param-limit": "返すページの総数。",
+       "apihelp-query+langbacklinks-param-prop": "取得するプロパティ:",
        "apihelp-query+langbacklinks-example-simple": "[[:fr:Test]] へリンクしているページを取得する。",
        "apihelp-query+langbacklinks-example-generator": "[[:fr:Test]] へリンクしているページの情報を取得する。",
        "apihelp-query+langlinks-param-limit": "返す言語間リンクの数。",
        "apihelp-query+links-example-simple": "<kbd>Main Page</kbd> からのリンクを取得する。",
        "apihelp-query+links-example-generator": "<kbd>Main Page</kbd> からリンクされているページに関する情報を取得する。",
        "apihelp-query+links-example-namespaces": "<kbd>Main Page</kbd> からの {{ns:user}} および {{ns:template}} 名前空間へのリンクを取得する。",
+       "apihelp-query+linkshere-param-prop": "取得するプロパティ:",
        "apihelp-query+linkshere-example-simple": "[[Main Page]] にリンクしているページの一覧を取得する。",
        "apihelp-query+linkshere-example-generator": "<kbd>[[Main Page]]<kbd> にリンクしているページの情報を取得する。",
+       "apihelp-query+logevents-param-prop": "取得するプロパティ:",
        "apihelp-query+logevents-param-start": "列挙の始点となるタイムスタンプ。",
        "apihelp-query+logevents-param-end": "列挙の終点となるタイムスタンプ。",
        "apihelp-query+logevents-param-user": "与えられた利用者による記録項目に絞り込む。",
        "apihelp-query+protectedtitles-param-limit": "返すページの総数。",
        "apihelp-query+protectedtitles-param-start": "一覧表示の始点となる保護タイムスタンプ。",
        "apihelp-query+protectedtitles-param-end": "一覧表示の終点となる保護タイムスタンプ。",
+       "apihelp-query+protectedtitles-param-prop": "取得するプロパティ:",
        "apihelp-query+protectedtitles-example-simple": "保護されているページを一覧表示する。",
        "apihelp-query+protectedtitles-example-generator": "標準名前空間にある保護されたページへのリンクを検索する。",
        "apihelp-query+querypage-param-page": "特別ページの名前です。これは大文字小文字を区別することに注意。",
        "apihelp-query+recentchanges-param-toponly": "最新の版である変更のみを一覧表示する。",
        "apihelp-query+recentchanges-example-simple": "最近の更新を一覧表示する。",
        "apihelp-query+redirects-description": "ページへのすべての転送を返します。",
+       "apihelp-query+redirects-param-prop": "取得するプロパティ:",
        "apihelp-query+redirects-param-limit": "返す転送の数。",
        "apihelp-query+redirects-example-simple": "[[Main Page]] への転送の一覧を取得する。",
        "apihelp-query+redirects-example-generator": "[[Main Page]] へのすべての転送ページに関する情報を取得する。",
        "apihelp-query+search-param-search": "この値を含むページ名または本文を検索します。Wikiの検索バックエンド実装に応じて、あなたは特別な検索機能を呼び出すための文字列を検索することができます。",
        "apihelp-query+search-param-namespace": "この名前空間内のみを検索します。",
        "apihelp-query+search-param-what": "実行する検索の種類です。",
+       "apihelp-query+search-param-prop": "返すプロパティ:",
        "apihelp-query+search-param-limit": "返すページの総数です。",
        "apihelp-query+search-example-simple": "<kbd>meaning</kbd> を検索する。",
        "apihelp-query+search-example-generator": "<kbd>meaning</kbd> の検索で返されたページのページ情報を取得する。",
        "apihelp-query+tags-description": "変更タグを一覧表示します。",
        "apihelp-query+tags-param-limit": "一覧表示するタグの最大数。",
+       "apihelp-query+tags-param-prop": "取得するプロパティ:",
        "apihelp-query+tags-example-simple": "利用可能なタグを一覧表示する。",
        "apihelp-query+templates-description": "与えられたページでトランスクルードされているすべてのページを返します。",
        "apihelp-query+templates-param-namespace": "この名前空間のテンプレートのみ表示する。",
        "apihelp-query+tokens-example-simple": "csrfトークンを取得する (既定)。",
        "apihelp-query+tokens-example-types": "ウォッチトークンおよび巡回トークンを取得する。",
        "apihelp-query+transcludedin-description": "与えられたページをトランスクルードしているすべてのページを検索します。",
+       "apihelp-query+transcludedin-param-prop": "取得するプロパティ:",
        "apihelp-query+transcludedin-example-simple": "<kbd>Main Page</kbd> をトランスクルードしているページの一覧を取得する。",
        "apihelp-query+transcludedin-example-generator": "<kbd>Main Page</kbd> をトランスクルードしているページに関する情報を取得する。",
        "apihelp-query+usercontribs-description": "利用者によるすべての編集を取得します。",
        "apihelp-query+watchlist-param-namespace": "この名前空間の変更のみに絞り込む。",
        "apihelp-query+watchlist-param-user": "この利用者による変更のみを一覧表示する。",
        "apihelp-query+watchlist-param-excludeuser": "この利用者による変更を一覧表示しない。",
+       "apihelp-query+watchlist-param-prop": "追加で取得するプロパティ:",
        "apihelp-query+watchlistraw-description": "現在の利用者のウォッチリストにあるすべてのページを取得します。",
        "apihelp-query+watchlistraw-param-namespace": "この名前空間に含まれるページのみを一覧表示します。",
+       "apihelp-query+watchlistraw-param-prop": "追加で取得するプロパティ:",
        "apihelp-revisiondelete-description": "版の削除および復元を行います。",
        "apihelp-revisiondelete-param-reason": "削除または復元の理由。",
        "apihelp-revisiondelete-example-revision": "<kbd>Main Page</kbd> の版 <kbd>12345</kbd> の本文を隠す。",
index 3192291..07875f4 100644 (file)
        "apihelp-query+alltransclusions-param-namespace": "Przestrzeń nazw do emulacji.",
        "apihelp-query+allusers-param-witheditsonly": "Tylko użytkownicy, którzy edytowali.",
        "apihelp-query+backlinks-param-namespace": "Przestrzeń nazw do emulacji.",
+       "apihelp-query+backlinks-example-simple": "Pokazuj linki do <kbd>Main page</kbd>.",
        "apihelp-query+blocks-param-ids": "Lista zablokowanych ID do wylistowania (opcjonalne).",
        "apihelp-query+blocks-param-users": "Lista użytkowników do wyszukania (opcjonalne).",
        "apihelp-query+blocks-param-limit": "Maksymalna liczba blokad do wylistowania.",
index 76d94e2..dd7a21c 100644 (file)
@@ -28,7 +28,7 @@
        "apihelp-login-param-domain": "شپول (اختياري).",
        "apihelp-login-example-login": "ننوتل.",
        "apihelp-move-description": "يو مخ لېږدول.",
-       "apihelp-query+search-example-simple": "د <kbd>meaning</kbd> پلټل.",
+       "apihelp-query+search-example-simple": "د <kbd>مانا</kbd> پلټل.",
        "apihelp-query+search-example-text": "د <kbd>مانا</kbd> لپاره متنونه پلټل.",
        "apihelp-query+watchlist-paramvalue-prop-title": "د يو مخ سرليک ورگډوي.",
        "apihelp-tag-param-reason": "د بدلون سبب.",
index 1296c13..549ac84 100644 (file)
@@ -133,7 +133,7 @@ class BacklinkCache {
        /**
         * Set the Database object to use
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         */
        public function setDB( $db ) {
                $this->db = $db;
index 698b304..d98888f 100644 (file)
@@ -231,7 +231,7 @@ class LinkBatch {
         * Construct a WHERE clause which will match all the given titles.
         *
         * @param string $prefix The appropriate table's field name prefix ('page', 'pl', etc)
-        * @param DatabaseBase $db DatabaseBase object to use
+        * @param IDatabase $db DatabaseBase object to use
         * @return string|bool String with SQL where clause fragment, or false if no items.
         */
        public function constructSet( $prefix, $db ) {
index 19349b2..63d8c7e 100644 (file)
@@ -167,7 +167,7 @@ class MessageBlobStore {
         * @param string $name Module name
         * @param ResourceLoaderModule $module
         * @param string $lang Language code
-        * @return string Regenerated message blob, or null if there was no blob for
+        * @return string|null Regenerated message blob, or null if there was no blob for
         *   the given module/language pair.
         */
        public function updateModule( $name, ResourceLoaderModule $module, $lang ) {
index 4526ee3..3bffbdf 100644 (file)
@@ -29,7 +29,7 @@ class ChangeTagsLogList extends ChangeTagsList {
        }
 
        /**
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return mixed
         */
        public function doQuery( $db ) {
index ec401bc..f0dfc0f 100644 (file)
@@ -29,7 +29,7 @@ class ChangeTagsRevisionList extends ChangeTagsList {
        }
 
        /**
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return mixed
         */
        public function doQuery( $db ) {
index 05d1934..ebcf540 100644 (file)
@@ -479,11 +479,7 @@ abstract class DatabaseBase implements IDatabase {
         *   - DBO_PERSISTENT: use persistant database connection
         */
        public function setFlag( $flag ) {
-               global $wgDebugDBTransactions;
                $this->mFlags |= $flag;
-               if ( ( $flag & DBO_TRX ) && $wgDebugDBTransactions ) {
-                       wfDebug( "Implicit transactions are now enabled.\n" );
-               }
        }
 
        /**
@@ -498,11 +494,7 @@ abstract class DatabaseBase implements IDatabase {
         *   - DBO_PERSISTENT: use persistant database connection
         */
        public function clearFlag( $flag ) {
-               global $wgDebugDBTransactions;
                $this->mFlags &= ~$flag;
-               if ( ( $flag & DBO_TRX ) && $wgDebugDBTransactions ) {
-                       wfDebug( "Implicit transactions are now disabled.\n" );
-               }
        }
 
        /**
@@ -607,7 +599,7 @@ abstract class DatabaseBase implements IDatabase {
         * @param array $params Parameters passed from DatabaseBase::factory()
         */
        function __construct( array $params ) {
-               global $wgDBprefix, $wgDBmwschema, $wgCommandLineMode, $wgDebugDBTransactions;
+               global $wgDBprefix, $wgDBmwschema, $wgCommandLineMode;
 
                $server = $params['host'];
                $user = $params['user'];
@@ -622,14 +614,8 @@ abstract class DatabaseBase implements IDatabase {
                if ( $this->mFlags & DBO_DEFAULT ) {
                        if ( $wgCommandLineMode ) {
                                $this->mFlags &= ~DBO_TRX;
-                               if ( $wgDebugDBTransactions ) {
-                                       wfDebug( "Implicit transaction open disabled.\n" );
-                               }
                        } else {
                                $this->mFlags |= DBO_TRX;
-                               if ( $wgDebugDBTransactions ) {
-                                       wfDebug( "Implicit transaction open enabled.\n" );
-                               }
                        }
                }
 
@@ -926,7 +912,7 @@ abstract class DatabaseBase implements IDatabase {
         *     for a successful read query, or false on failure if $tempIgnore set
         */
        public function query( $sql, $fname = __METHOD__, $tempIgnore = false ) {
-               global $wgUser, $wgDebugDBTransactions, $wgDebugDumpSqlLength;
+               global $wgUser;
 
                $this->mLastQuery = $sql;
 
@@ -956,9 +942,6 @@ abstract class DatabaseBase implements IDatabase {
                $commentedSql = preg_replace( '/\s|$/', " /* $fname $userName */ ", $sql, 1 );
 
                if ( !$this->mTrxLevel && $this->getFlag( DBO_TRX ) && $this->isTransactableQuery( $sql ) ) {
-                       if ( $wgDebugDBTransactions ) {
-                               wfDebug( "Implicit transaction start.\n" );
-                       }
                        $this->begin( __METHOD__ . " ($fname)" );
                        $this->mTrxAutomatic = true;
                }
@@ -990,15 +973,7 @@ abstract class DatabaseBase implements IDatabase {
                }
 
                if ( $this->debug() ) {
-                       static $cnt = 0;
-
-                       $cnt++;
-                       $sqlx = $wgDebugDumpSqlLength ? substr( $commentedSql, 0, $wgDebugDumpSqlLength )
-                               : $commentedSql;
-                       $sqlx = strtr( $sqlx, "\t\n", '  ' );
-
-                       $master = $isMaster ? 'master' : 'slave';
-                       wfDebug( "Query {$this->mDBname} ($cnt) ($master): $sqlx\n" );
+                       wfDebugLog( 'queries', sprintf( "%s: %s", $this->mDBname, $sql ) );
                }
 
                $queryId = MWDebug::query( $sql, $fname, $isMaster );
@@ -1754,7 +1729,7 @@ abstract class DatabaseBase implements IDatabase {
         *
         * @return string
         */
-       static function generalizeSQL( $sql ) {
+       protected static function generalizeSQL( $sql ) {
                # This does the same as the regexp below would do, but in such a way
                # as to avoid crashing php on some large strings.
                # $sql = preg_replace( "/'([^\\\\']|\\\\.)*'|\"([^\\\\\"]|\\\\.)*\"/", "'X'", $sql );
@@ -3438,8 +3413,6 @@ abstract class DatabaseBase implements IDatabase {
         * @throws DBError
         */
        final public function begin( $fname = __METHOD__ ) {
-               global $wgDebugDBTransactions;
-
                if ( $this->mTrxLevel ) { // implicit commit
                        if ( $this->mTrxAtomicLevels ) {
                                // If the current transaction was an automatic atomic one, then we definitely have
@@ -3460,9 +3433,8 @@ abstract class DatabaseBase implements IDatabase {
                                        ) )
                                );
                        } else {
-                               // if the transaction was automatic and has done write operations,
-                               // log it if $wgDebugDBTransactions is enabled.
-                               if ( $this->mTrxDoneWrites && $wgDebugDBTransactions ) {
+                               // if the transaction was automatic and has done write operations
+                               if ( $this->mTrxDoneWrites ) {
                                        wfDebug( "$fname: Automatic transaction with writes in progress" .
                                                " (from {$this->mTrxFname}), performing implicit commit!\n"
                                        );
@@ -4246,3 +4218,8 @@ abstract class DatabaseBase implements IDatabase {
                }
        }
 }
+
+abstract class Database extends DatabaseBase {
+       // B/C until nothing type hints for DatabaseBase
+       // @TODO: finish renaming DatabaseBase => Database
+}
index 354afc5..5acbc6c 100644 (file)
@@ -28,7 +28,7 @@
 /**
  * @ingroup Database
  */
-class DatabaseMssql extends DatabaseBase {
+class DatabaseMssql extends Database {
        protected $mInsertId = null;
        protected $mLastResult = null;
        protected $mAffectedRows = null;
index ac7ce10..feca114 100644 (file)
@@ -29,7 +29,7 @@
  * @since 1.22
  * @see Database
  */
-abstract class DatabaseMysqlBase extends DatabaseBase {
+abstract class DatabaseMysqlBase extends Database {
        /** @var MysqlMasterPos */
        protected $lastKnownSlavePos;
        /** @var string Method to detect slave lag */
@@ -572,6 +572,12 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                return $sQuoted;
        }
 
+       /**
+        * @param string $s
+        * @return mixed
+        */
+       abstract protected function mysqlRealEscapeString( $s );
+
        /**
         * MySQL uses `backticks` for identifier quoting instead of the sql standard "double quotes".
         *
@@ -1250,7 +1256,7 @@ class MySQLField implements Field {
         * @return string
         */
        function tableName() {
-               return $this->tableName;
+               return $this->tablename;
        }
 
        /**
index ad38c1d..66004ec 100644 (file)
@@ -185,7 +185,7 @@ class ORAField implements Field {
 /**
  * @ingroup Database
  */
-class DatabaseOracle extends DatabaseBase {
+class DatabaseOracle extends Database {
        /** @var resource */
        protected $mLastResult = null;
 
index aaa1c6e..c9d7b35 100644 (file)
@@ -128,89 +128,6 @@ SQL;
        }
 }
 
-/**
- * Used to debug transaction processing
- * Only used if $wgDebugDBTransactions is true
- *
- * @since 1.19
- * @ingroup Database
- */
-class PostgresTransactionState {
-       private static $WATCHED = array(
-               array(
-                       "desc" => "%s: Connection state changed from %s -> %s\n",
-                       "states" => array(
-                               PGSQL_CONNECTION_OK => "OK",
-                               PGSQL_CONNECTION_BAD => "BAD"
-                       )
-               ),
-               array(
-                       "desc" => "%s: Transaction state changed from %s -> %s\n",
-                       "states" => array(
-                               PGSQL_TRANSACTION_IDLE => "IDLE",
-                               PGSQL_TRANSACTION_ACTIVE => "ACTIVE",
-                               PGSQL_TRANSACTION_INTRANS => "TRANS",
-                               PGSQL_TRANSACTION_INERROR => "ERROR",
-                               PGSQL_TRANSACTION_UNKNOWN => "UNKNOWN"
-                       )
-               )
-       );
-
-       /** @var array */
-       private $mNewState;
-
-       /** @var array */
-       private $mCurrentState;
-
-       public function __construct( $conn ) {
-               $this->mConn = $conn;
-               $this->update();
-               $this->mCurrentState = $this->mNewState;
-       }
-
-       public function update() {
-               $this->mNewState = array(
-                       pg_connection_status( $this->mConn ),
-                       pg_transaction_status( $this->mConn )
-               );
-       }
-
-       public function check() {
-               global $wgDebugDBTransactions;
-               $this->update();
-               if ( $wgDebugDBTransactions ) {
-                       if ( $this->mCurrentState !== $this->mNewState ) {
-                               $old = reset( $this->mCurrentState );
-                               $new = reset( $this->mNewState );
-                               foreach ( self::$WATCHED as $watched ) {
-                                       if ( $old !== $new ) {
-                                               $this->log_changed( $old, $new, $watched );
-                                       }
-                                       $old = next( $this->mCurrentState );
-                                       $new = next( $this->mNewState );
-                               }
-                       }
-               }
-               $this->mCurrentState = $this->mNewState;
-       }
-
-       protected function describe_changed( $status, $desc_table ) {
-               if ( isset( $desc_table[$status] ) ) {
-                       return $desc_table[$status];
-               } else {
-                       return "STATUS " . $status;
-               }
-       }
-
-       protected function log_changed( $old, $new, $watched ) {
-               wfDebug( sprintf( $watched["desc"],
-                       $this->mConn,
-                       $this->describe_changed( $old, $watched["states"] ),
-                       $this->describe_changed( $new, $watched["states"] )
-               ) );
-       }
-}
-
 /**
  * Manage savepoints within a transaction
  * @ingroup Database
@@ -252,11 +169,7 @@ class SavepointPostgres {
        }
 
        protected function query( $keyword, $msg_ok, $msg_failed ) {
-               global $wgDebugDBTransactions;
                if ( $this->dbw->doQuery( $keyword . " " . $this->id ) !== false ) {
-                       if ( $wgDebugDBTransactions ) {
-                               wfDebug( sprintf( $msg_ok, $this->id ) );
-                       }
                } else {
                        wfDebug( sprintf( $msg_failed, $this->id ) );
                }
@@ -291,7 +204,7 @@ class SavepointPostgres {
 /**
  * @ingroup Database
  */
-class DatabasePostgres extends DatabaseBase {
+class DatabasePostgres extends Database {
        /** @var resource */
        protected $mLastResult = null;
 
@@ -307,9 +220,6 @@ class DatabasePostgres extends DatabaseBase {
        /** @var string Connect string to open a PostgreSQL connection */
        private $connectString;
 
-       /** @var PostgresTransactionState */
-       private $mTransactionState;
-
        /** @var string */
        private $mCoreSchema;
 
@@ -428,7 +338,6 @@ class DatabasePostgres extends DatabaseBase {
                }
 
                $this->mOpened = true;
-               $this->mTransactionState = new PostgresTransactionState( $this->mConn );
 
                global $wgCommandLineMode;
                # If called from the command-line (e.g. importDump), only show errors
@@ -486,12 +395,10 @@ class DatabasePostgres extends DatabaseBase {
                if ( function_exists( 'mb_convert_encoding' ) ) {
                        $sql = mb_convert_encoding( $sql, 'UTF-8' );
                }
-               $this->mTransactionState->check();
                if ( pg_send_query( $this->mConn, $sql ) === false ) {
                        throw new DBUnexpectedError( $this, "Unable to post new query to PostgreSQL\n" );
                }
                $this->mLastResult = pg_get_result( $this->mConn );
-               $this->mTransactionState->check();
                $this->mAffectedRows = null;
                if ( pg_result_error( $this->mLastResult ) ) {
                        return false;
index e909597..bb3028d 100644 (file)
@@ -25,7 +25,7 @@
 /**
  * @ingroup Database
  */
-class DatabaseSqlite extends DatabaseBase {
+class DatabaseSqlite extends Database {
        /** @var bool Whether full text is enabled */
        private static $fulltextEnabled = null;
 
@@ -1032,6 +1032,14 @@ class DatabaseSqlite extends DatabaseBase {
 
                return $endArray;
        }
+
+       /**
+        * @return string
+        */
+       public function __toString() {
+               return 'SQLite ' . (string)$this->mConn->getAttribute( PDO::ATTR_SERVER_VERSION );
+       }
+
 } // end DatabaseSqlite class
 
 /**
index ae75a75..d135a80 100644 (file)
@@ -125,7 +125,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
        }
 
        /**
-        * @param DatabaseBase $dbw
+        * @param IDatabase $dbw
         * @return bool|mixed
         */
        public static function cacheUpdate( $dbw ) {
index 952bf63..cc70960 100644 (file)
@@ -156,7 +156,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
        /**
         * Get the 'blobs' table name for this database
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return string Table name ('blobs' by default)
         */
        function getTable( $db ) {
index 9a7c21c..43d1eb5 100644 (file)
@@ -574,7 +574,7 @@ abstract class File implements IDBAccessObject {
         * In files that support multiple language, what is the default language
         * to use if none specified.
         *
-        * @return string Lang code, or null if filetype doesn't support multiple languages.
+        * @return string|null Lang code, or null if filetype doesn't support multiple languages.
         * @since 1.23
         */
        public function getDefaultRenderLanguage() {
@@ -922,7 +922,7 @@ abstract class File implements IDBAccessObject {
         *
         * @param array $params Handler-specific parameters
         * @param int $flags Bitfield that supports THUMB_* constants
-        * @return string
+        * @return string|null
         */
        public function thumbName( $params, $flags = 0 ) {
                $name = ( $this->repo && !( $flags & self::THUMB_FULL_NAME ) )
@@ -937,7 +937,7 @@ abstract class File implements IDBAccessObject {
         *
         * @param string $name
         * @param array $params Parameters which will be passed to MediaHandler::makeParamString
-        * @return string
+        * @return string|null
         */
        public function generateThumbName( $name, $params ) {
                if ( !$this->getHandler() ) {
index 0092e17..0db3195 100644 (file)
@@ -433,7 +433,7 @@ class LocalFile extends File {
        }
 
        /**
-        * @param DatabaseBase $dbr
+        * @param IDatabase $dbr
         * @param string $fname
         * @return array|bool
         */
index 8f2a0fd..7bcb58f 100644 (file)
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] نصب شو",
        "config-apc": "[http://www.php.net/apc APC] نصب شو",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] نصب شو",
+       "config-diff3-bad": "جي ان يو ډيف3 و نه موندل شو.",
+       "config-using-server": "د پالنگر نوم \"<nowiki>$1</nowiki>\" کارېږي.",
+       "config-using-uri": "د پالنگر URL \"<nowiki>$1$2</nowiki>\" کارېږي.",
        "config-db-type": "د توکبنسټ ډول:",
        "config-db-host": "د توکبنسټ کوربه:",
        "config-db-host-oracle": "د توکبنسټ TNS:",
        "config-db-wiki-settings": "دا ويکي پېژندل",
        "config-db-name": "د توکبنسټ نوم:",
+       "config-db-name-oracle": "د اومتوکبنسټ طرحه:",
        "config-db-username": "د توکبنسټ کارن-نوم:",
        "config-db-password": "د توکبنسټ پټنوم:",
        "config-charset-mysql5-binary": "مای اس کيو ال 4.1/5.0 دوييز",
        "config-profile": "د کارن رښتو پېژنليک:",
        "config-profile-wiki": "پرانيستې ويکي",
        "config-profile-private": "شخصي ويکي",
+       "config-license": "منښتليک او د خپرولو رښته:",
+       "config-license-none": "بې پايڅوړه منښتليک",
        "config-license-pd": "ټولگړی شپول",
        "config-email-settings": "د برېښليک امستنې",
        "config-email-user": "کارن تر کارن برېښليک چارنول",
+       "config-upload-enable": "دوتنې پورته کېدنې چارنول",
+       "config-logo": "د نښې يو آر ال:",
        "config-extensions": "شاتاړي",
        "config-skins": "پوښۍ",
        "config-skins-use-as-default": "همدا پوښۍ په تلواليزه توگه کارول",
index d6f88a7..1079be0 100644 (file)
        "config-email-watchlist-help": "若使用者在個人偏好開啟了此功能,允許使用者收到與其監視清單有關的通知。",
        "config-email-auth": "開啟電子郵件身份認證",
        "config-email-auth-help": "若開啟此選項,使用者不論設定或者更改電子郵件地址,都必須透過收信的方式確認沒有問題。\n只有驗證過的電子郵件地址可以收到來自其他使用者或修改通知的信件。\n公開的 Wiki 會 <strong>建議</strong> 設定此選項,以防使用者濫用電子郵件功能。",
-       "config-email-sender": "電子郵件回覆址:",
+       "config-email-sender": "電子郵件回覆址:",
        "config-email-sender-help": "請輸入要用來做為外寄郵件的電子郵件回覆地址。\n該郵件地址會收到被拒收的信件。\n許多郵件伺服器會要求使用有效的網域名稱。",
        "config-upload-settings": "圖片和檔案上傳",
        "config-upload-enable": "開啟檔案上傳",
index ddbe8ea..31bffd4 100644 (file)
@@ -62,6 +62,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
 
        /** Bitfield constants for get()/getMulti() */
        const READ_LATEST = 1; // use latest data for replicated stores
+       const READ_VERIFIED = 2; // promise that caller can tell when keys are stale
 
        public function __construct( array $params = array() ) {
                if ( isset( $params['logger'] ) ) {
@@ -87,16 +88,24 @@ abstract class BagOStuff implements LoggerAwareInterface {
        }
 
        /**
-        * Get an item with the given key. Returns false if it does not exist.
+        * Get an item with the given key
+        *
+        * If the key includes a determistic input hash (e.g. the key can only have
+        * the correct value) or complete staleness checks are handled by the caller
+        * (e.g. nothing relies on the TTL), then the READ_VERIFIED flag should be set.
+        * This lets tiered backends know they can safely upgrade a cached value to
+        * higher tiers using standard TTLs.
+        *
         * @param string $key
         * @param mixed $casToken [optional]
-        * @param integer $flags Bitfield; supports READ_LATEST [optional]
-        * @return mixed Returns false on failure
+        * @param integer $flags Bitfield of BagOStuff::READ_* constants [optional]
+        * @return mixed Returns false on failure and if the item does not exist
         */
        abstract public function get( $key, &$casToken = null, $flags = 0 );
 
        /**
-        * Set an item.
+        * Set an item
+        *
         * @param string $key
         * @param mixed $value
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
@@ -105,7 +114,8 @@ abstract class BagOStuff implements LoggerAwareInterface {
        abstract public function set( $key, $value, $exptime = 0 );
 
        /**
-        * Delete an item.
+        * Delete an item
+        *
         * @param string $key
         * @return bool True if the item was deleted or not found, false on failure
         */
index 1b56584..4c0bd8e 100644 (file)
@@ -646,7 +646,7 @@ class LogEventsList extends ContextSource {
        /**
         * SQL clause to skip forbidden log types for this user
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param string $audience Public/user
         * @param User $user User to check, or null to use $wgUser
         * @return string|bool String on success, false on failure.
index fb840c2..6d19700 100644 (file)
@@ -1269,6 +1269,7 @@ class XMPReader implements LoggerAwareInterface {
                }
        }
 
+       // @codingStandardsIgnoreStart Generic.Files.LineLength
        /**
         * Process attributes.
         * Simple values can be stored as either a tag or attribute
@@ -1276,16 +1277,15 @@ class XMPReader implements LoggerAwareInterface {
         * Often the initial "<rdf:Description>" tag just has all the simple
         * properties as attributes.
         *
-        * @codingStandardsIgnoreStart Long line that cannot be broken
         * @par Example:
         * @code
         * <rdf:Description rdf:about="" xmlns:exif="http://ns.adobe.com/exif/1.0/" exif:DigitalZoomRatio="0/10">
         * @endcode
-        * @codingStandardsIgnoreEnd
         *
         * @param array $attribs Array attribute=>value
         * @throws RuntimeException
         */
+       // @codingStandardsIgnoreEnd
        private function doAttribs( $attribs ) {
                // first check for rdf:parseType attribute, as that can change
                // how the attributes are interperted.
index cb3754a..b690772 100644 (file)
@@ -34,6 +34,11 @@ class MultiWriteBagOStuff extends BagOStuff {
        /** @var bool Use async secondary writes */
        protected $asyncWrites = false;
 
+       /** Idiom for "write to all backends" */
+       const ALL = INF;
+
+       const UPGRADE_TTL = 3600; // TTL when a key is copied to a higher cache tier
+
        /**
         * $params include:
         *   - caches:      This should have a numbered array of cache parameter
@@ -79,17 +84,28 @@ class MultiWriteBagOStuff extends BagOStuff {
         * @param bool $debug
         */
        public function setDebug( $debug ) {
-               $this->doWrite( 'setDebug', $debug );
+               $this->doWrite( self::ALL, 'setDebug', $debug );
        }
 
        public function get( $key, &$casToken = null, $flags = 0 ) {
+               $misses = 0; // number backends checked
+               $value = false;
                foreach ( $this->caches as $cache ) {
                        $value = $cache->get( $key, $casToken, $flags );
                        if ( $value !== false ) {
-                               return $value;
+                               break;
                        }
+                       ++$misses;
+               }
+
+               if ( $value !== false
+                       && $misses > 0
+                       && ( $flags & self::READ_VERIFIED ) == self::READ_VERIFIED
+               ) {
+                       $this->doWrite( $misses, 'set', $key, $value, self::UPGRADE_TTL );
                }
-               return false;
+
+               return $value;
        }
 
        /**
@@ -99,7 +115,7 @@ class MultiWriteBagOStuff extends BagOStuff {
         * @return bool
         */
        public function set( $key, $value, $exptime = 0 ) {
-               return $this->doWrite( 'set', $key, $value, $exptime );
+               return $this->doWrite( self::ALL, 'set', $key, $value, $exptime );
        }
 
        /**
@@ -107,7 +123,7 @@ class MultiWriteBagOStuff extends BagOStuff {
         * @return bool
         */
        public function delete( $key ) {
-               return $this->doWrite( 'delete', $key );
+               return $this->doWrite( self::ALL, 'delete', $key );
        }
 
        /**
@@ -117,7 +133,7 @@ class MultiWriteBagOStuff extends BagOStuff {
         * @return bool
         */
        public function add( $key, $value, $exptime = 0 ) {
-               return $this->doWrite( 'add', $key, $value, $exptime );
+               return $this->doWrite( self::ALL, 'add', $key, $value, $exptime );
        }
 
        /**
@@ -126,7 +142,7 @@ class MultiWriteBagOStuff extends BagOStuff {
         * @return bool|null
         */
        public function incr( $key, $value = 1 ) {
-               return $this->doWrite( 'incr', $key, $value );
+               return $this->doWrite( self::ALL, 'incr', $key, $value );
        }
 
        /**
@@ -135,7 +151,7 @@ class MultiWriteBagOStuff extends BagOStuff {
         * @return bool
         */
        public function decr( $key, $value = 1 ) {
-               return $this->doWrite( 'decr', $key, $value );
+               return $this->doWrite( self::ALL, 'decr', $key, $value );
        }
 
        /**
@@ -166,7 +182,7 @@ class MultiWriteBagOStuff extends BagOStuff {
         * @return bool Success
         */
        public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
-               return $this->doWrite( 'merge', $key, $callback, $exptime );
+               return $this->doWrite( self::ALL, 'merge', $key, $callback, $exptime );
        }
 
        public function getLastError() {
@@ -178,15 +194,22 @@ class MultiWriteBagOStuff extends BagOStuff {
        }
 
        /**
+        * Apply a write method to the first $count backing caches
+        *
+        * @param integer $count
         * @param string $method
+        * @param mixed ...
         * @return bool
         */
-       protected function doWrite( $method /*, ... */ ) {
+       protected function doWrite( $count, $method /*, ... */ ) {
                $ret = true;
-               $args = func_get_args();
-               array_shift( $args );
+               $args = array_slice( func_get_args(), 2 );
 
                foreach ( $this->caches as $i => $cache ) {
+                       if ( $i >= $count ) {
+                               break; // ignore the lower tiers
+                       }
+
                        if ( $i == 0 || !$this->asyncWrites ) {
                                // First store or in sync mode: write now and get result
                                if ( !call_user_func_array( array( $cache, $method ), $args ) ) {
index e08fec9..91189c8 100644 (file)
@@ -131,8 +131,6 @@ class SqlBagOStuff extends BagOStuff {
         * @throws MWException
         */
        protected function getDB( $serverIndex ) {
-               global $wgDebugDBTransactions;
-
                if ( !isset( $this->conns[$serverIndex] ) ) {
                        if ( $serverIndex >= $this->numServers ) {
                                throw new MWException( __METHOD__ . ": Invalid server index \"$serverIndex\"" );
@@ -147,9 +145,6 @@ class SqlBagOStuff extends BagOStuff {
 
                        # If server connection info was given, use that
                        if ( $this->serverInfos ) {
-                               if ( $wgDebugDBTransactions ) {
-                                       $this->logger->debug( "Using provided serverInfo for SqlBagOStuff" );
-                               }
                                $info = $this->serverInfos[$serverIndex];
                                $type = isset( $info['type'] ) ? $info['type'] : 'mysql';
                                $host = isset( $info['host'] ) ? $info['host'] : '[unknown]';
@@ -173,9 +168,7 @@ class SqlBagOStuff extends BagOStuff {
                                        $db = wfGetDB( $index );
                                }
                        }
-                       if ( $wgDebugDBTransactions ) {
-                               $this->logger->debug( sprintf( "Connection %s will be used for SqlBagOStuff", $db ) );
-                       }
+                       $this->logger->debug( sprintf( "Connection %s will be used for SqlBagOStuff", $db ) );
                        $this->conns[$serverIndex] = $db;
                }
 
index d3978ea..98cc80a 100644 (file)
@@ -298,7 +298,7 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Fetch a page record with the given conditions
-        * @param DatabaseBase $dbr
+        * @param IDatabase $dbr
         * @param array $conditions
         * @param array $options
         * @return object|bool Database result resource, or false on failure
@@ -319,7 +319,7 @@ class WikiPage implements Page, IDBAccessObject {
         * Fetch a page record matching the Title object's namespace and title
         * using a sanitized title string
         *
-        * @param DatabaseBase $dbr
+        * @param IDatabase $dbr
         * @param Title $title
         * @param array $options
         * @return object|bool Database result resource, or false on failure
@@ -333,7 +333,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Fetch a page record matching the requested ID
         *
-        * @param DatabaseBase $dbr
+        * @param IDatabase $dbr
         * @param int $id
         * @param array $options
         * @return object|bool Database result resource, or false on failure
@@ -1194,7 +1194,7 @@ class WikiPage implements Page, IDBAccessObject {
         * or else the record will be left in a funky state.
         * Best if all done inside a transaction.
         *
-        * @param DatabaseBase $dbw
+        * @param IDatabase $dbw
         * @return int|bool The newly created page_id key; false if the title already existed
         */
        public function insertOn( $dbw ) {
@@ -1228,7 +1228,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Update the page record to point to a newly saved revision.
         *
-        * @param DatabaseBase $dbw
+        * @param IDatabase $dbw
         * @param Revision $revision For ID number, and text used to set
         *   length and redirect status fields
         * @param int $lastRevision If given, will not overwrite the page field
@@ -1295,7 +1295,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Add row to the redirect table if this is a redirect, remove otherwise.
         *
-        * @param DatabaseBase $dbw
+        * @param IDatabase $dbw
         * @param Title $redirectTitle Title object pointing to the redirect target,
         *   or NULL if this is not a redirect
         * @param null|bool $lastRevIsRedirect If given, will optimize adding and
@@ -1334,7 +1334,7 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @deprecated since 1.24, use updateRevisionOn instead
         *
-        * @param DatabaseBase $dbw
+        * @param IDatabase $dbw
         * @param Revision $revision
         * @return bool
         */
@@ -1421,7 +1421,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @param string $edittime Revision timestamp or null to use the current revision.
         *
         * @throws MWException
-        * @return string New complete article text, or null if error.
+        * @return string|null New complete article text, or null if error.
         *
         * @deprecated since 1.21, use replaceSectionAtRev() instead
         */
@@ -1473,7 +1473,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @param string $edittime Revision timestamp or null to use the current revision.
         *
         * @throws MWException
-        * @return Content New complete article content, or null if error.
+        * @return Content|null New complete article content, or null if error.
         *
         * @since 1.21
         * @deprecated since 1.24, use replaceSectionAtRev instead
@@ -1512,7 +1512,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @param int|null $baseRevId
         *
         * @throws MWException
-        * @return Content New complete article content, or null if error.
+        * @return Content|null New complete article content, or null if error.
         *
         * @since 1.24
         */
index c03b5c2..0eba166 100644 (file)
@@ -139,7 +139,9 @@ class ParserCache {
                }
 
                // Determine the options which affect this article
-               $optionsKey = $this->mMemc->get( $this->getOptionsKey( $article ) );
+               $casToken = null;
+               $optionsKey = $this->mMemc->get(
+                       $this->getOptionsKey( $article ), $casToken, BagOStuff::READ_VERIFIED );
                if ( $optionsKey instanceof CacheTime ) {
                        if ( !$useOutdated && $optionsKey->expired( $article->getTouched() ) ) {
                                wfIncrStats( "pcache.miss.expired" );
@@ -198,7 +200,8 @@ class ParserCache {
                        return false;
                }
 
-               $value = $this->mMemc->get( $parserOutputKey );
+               $casToken = null;
+               $value = $this->mMemc->get( $parserOutputKey, $casToken, BagOStuff::READ_VERIFIED );
                if ( !$value ) {
                        wfDebug( "ParserOutput cache miss.\n" );
                        wfIncrStats( "pcache.miss.absent" );
index 002b4ea..77ceff6 100644 (file)
@@ -1580,7 +1580,7 @@ MESSAGE;
         * @return bool Whether $moduleName is a valid module name
         */
        public static function isValidModuleName( $moduleName ) {
-               return !preg_match( '/[|,!]/', $moduleName ) && strlen( $moduleName ) <= 255;
+               return strcspn( $moduleName, '!,|', 0, 255 ) === strlen( $moduleName );
        }
 
        /**
index 82d0907..5b18b7c 100644 (file)
  */
 class SearchDatabase extends SearchEngine {
        /**
-        * @var DatabaseBase Slave database for reading from for results
+        * @var IDatabase Slave database for reading from for results
         */
        protected $db;
 
        /**
         * Constructor
-        * @param DatabaseBase $db The database to search from
+        * @param IDatabase $db The database to search from
         */
-       public function __construct( DatabaseBase $db = null ) {
+       public function __construct( IDatabase $db = null ) {
                if ( $db ) {
                        $this->db = $db;
                } else {
index d384ae9..7bfcd45 100644 (file)
@@ -165,7 +165,7 @@ class SearchResult {
        }
 
        /**
-        * @return Title Title object for the redirect to this page, null if none or not supported
+        * @return Title|null Title object for the redirect to this page, null if none or not supported
         */
        function getRedirectTitle() {
                return null;
@@ -179,7 +179,7 @@ class SearchResult {
        }
 
        /**
-        * @return Title Title object (pagename+fragment) for the section, null if none or not supported
+        * @return Title|null Title object (pagename+fragment) for the section, null if none or not supported
         */
        function getSectionTitle() {
                return null;
index 8d18b0e..6178756 100644 (file)
@@ -98,7 +98,7 @@ class SearchResultSet {
        }
 
        /**
-        * @return string Suggested query, null if none
+        * @return string|null Suggested query, null if none
         */
        function getSuggestionQuery() {
                return null;
index 1f796a4..b9a1bbf 100644 (file)
@@ -625,7 +625,7 @@ class UploadStashFile extends UnregisteredLocalFile {
         *
         * @param array $params Handler-specific parameters
         * @param int $flags Bitfield that supports THUMB_* constants
-        * @return string Base name for URL, like '120px-12345.jpg', or null if there is no handler
+        * @return string|null Base name for URL, like '120px-12345.jpg', or null if there is no handler
         */
        function thumbName( $params, $flags = 0 ) {
                return $this->generateThumbName( $this->getUrlName(), $params );
index fb2ae2a..59350e6 100644 (file)
@@ -78,13 +78,13 @@ class BatchRowIterator implements RecursiveIterator {
        private $key;
 
        /**
-        * @param DatabaseBase $db         The database to read from
+        * @param IDatabase $db The database to read from
         * @param string       $table      The name of the table to read from
         * @param string|array $primaryKey The name or names of the primary key columns
         * @param integer      $batchSize  The number of rows to fetch per iteration
         * @throws MWException
         */
-       public function __construct( DatabaseBase $db, $table, $primaryKey, $batchSize ) {
+       public function __construct( IDatabase $db, $table, $primaryKey, $batchSize ) {
                if ( $batchSize < 1 ) {
                        throw new MWException( 'Batch size must be at least 1 row.' );
                }
index 04c00a3..377ed85 100644 (file)
@@ -37,11 +37,11 @@ class BatchRowWriter {
        protected $clusterName;
 
        /**
-        * @param DatabaseBase $db          The database to write to
+        * @param IDatabase $db The database to write to
         * @param string       $table       The name of the table to update
         * @param string|bool  $clusterName A cluster name valid for use with LBFactory
         */
-       public function __construct( DatabaseBase $db, $table, $clusterName = false ) {
+       public function __construct( IDatabase $db, $table, $clusterName = false ) {
                $this->db = $db;
                $this->table = $table;
                $this->clusterName = $clusterName;
index 666660a..9f52249 100644 (file)
@@ -659,7 +659,7 @@ class IP {
         * unusual representations may be added later.
         *
         * @param string $addr Something that might be an IP address
-        * @return string Valid dotted quad IPv4 address or null
+        * @return string|null Valid dotted quad IPv4 address or null
         */
        public static function canonicalize( $addr ) {
                // remove zone info (bug 35738)
index 5bab69a..3cbac2d 100644 (file)
        "searchbutton": "Mita",
        "go": "Jak u",
        "searcharticle": "Jak u",
-       "history": "Riwayat laman",
+       "history": "Riwayat miëng",
        "history_short": "Riwayat",
        "updatedmarker": "geuubah yôh seunaweue keuneulheueh lôn phôn kön",
        "printableversion": "Seunalén rakam",
        "site-atom-feed": "Umpeuën Atôm $1",
        "page-rss-feed": "Umpeuën RSS \"$1\"",
        "page-atom-feed": "Umpeuën Atom \"$1\"",
-       "red-link-title": "$1 (laman hana)",
+       "red-link-title": "$1 (miëng hana)",
        "sort-descending": "Peuurôt tren",
        "sort-ascending": "Peuurôt ék",
-       "nstab-main": "Laman",
+       "nstab-main": "Miëng",
        "nstab-user": "Ureuëng ngui",
        "nstab-media": "Laman media",
-       "nstab-special": "Laman kusuih",
+       "nstab-special": "Miëng kusuih",
        "nstab-project": "Laman buët",
        "nstab-image": "Beureukaih",
        "nstab-mediawiki": "Peusan",
        "nstab-template": "Seunaleuëk",
        "nstab-help": "Beunantu",
        "nstab-category": "Kawan",
+       "mainpage-nstab": "Ôn keuë",
        "nosuchaction": "Hana buët nyan",
        "nosuchactiontext": "Buët nyang geulakèë lé URL nyan hana sah. Droeneuh kadang salah neukeutik URL, atawa neuseutöt saboh neuhubông nyang hana beutôi. Hai nyoë kadang jeuët keu lageuëm saboh bug bak alat leumiëk nyang geungui lé {{SITENAME}}.",
        "nosuchspecialpage": "Hana laman kusuih lagèë nyan",
        "summary": "Éhtisa:",
        "subject": "Bhah/nan:",
        "minoredit": "Nyoë lôn andam bacut",
-       "watchthis": "Kalön laman nyoë",
-       "savearticle": "Keubah laman",
+       "watchthis": "Kalön miëng nyoë",
+       "savearticle": "Keubah miëng",
        "preview": "Eu dilèë",
        "showpreview": "Peuleumah hasé",
        "showdiff": "Peuleumah neuubah",
        "currentrev": "Geunantoë jinoë",
        "currentrev-asof": "Geunantoë barô bak $1",
        "revisionasof": "Geunantoë tiëp $1",
-       "revision-info": "Geunantoë tiëp $1; $2",
+       "revision-info": "Revisi per $1 lé {{GENDER:$6|$2}}$7",
        "previousrevision": "← Geunantoë awai",
        "nextrevision": "Geunantoë lheuëh nyan→",
        "currentrevisionlink": "Geunantoë jinoë",
        "viewprevnext": "Eu ($1 {{int:pipe-separator}} $2)($3)",
        "searchmenu-exists": "'''Na laman ngön nan \"[[:$1]]\" bak wiki nyoe.'''",
        "searchmenu-new": "<strong>Peugöt laman \"[[:$1]]\" bak wiki nyoë!</strong> {{PLURAL:$2|0=|Eu cit laman nyang geurumpok nibak meunita droëneuh.|Eu cit hasé mita nyang geurumpok.}}",
-       "searchprofile-articles": "Laman asoë",
+       "searchprofile-articles": "Miëng asoë",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Ban dum",
        "searchprofile-advanced": "Tingkat lanjut",
        "searchprofile-articles-tooltip": "Mita bak $1",
        "searchprofile-images-tooltip": "Mita beureukaih",
-       "searchprofile-everything-tooltip": "Mita ban dum laman asoë (rôh ôn marit)",
+       "searchprofile-everything-tooltip": "Mita ban dum miëng asoë (rôh ôn marit)",
        "searchprofile-advanced-tooltip": "Mita bak ruweuëng nan meupat-pat",
        "search-result-size": "$1 ({{PLURAL:$2|1 narit|$2 narit}})",
        "search-result-category-size": "{{PLURAL:$1|1 anggeeta|$1 anggeeta}} ({{PLURAL:$2|1 aneuk kawan|$2 aneuk kawan}}, {{PLURAL:$3|1 beureukaih|$3 beureukaih}})",
        "recentchanges-summary": "Di yup nyoë nakeuh neuubah barô nyang na bak Wikipèdia nyoë.\nHareutoë: (bida) = neuubah, (riwayat) = riwayat teumuléh, '''B''' = laman barô, '''u''' = neuandam ubeut, '''b''' = neuandam bot, (± ''bit'') = jeumeulah asoë meutamah/meukureuëng, → = neuandam bideuëng, ← = mohtasa otomatis.\n----",
        "recentchanges-noresult": "Hana neuubah lam lheuëng watèë nyoë nyang paih ngön syarat",
        "recentchanges-feed-description": "Seutöt neuubah barô lam wiki bak umpeuën nyoë.",
-       "recentchanges-label-newpage": "Neuandam nyoë jipeugöt laman barô",
+       "recentchanges-label-newpage": "Neuandam nyoë jipeugöt miëng barô",
        "recentchanges-label-minor": "Nyoe neuandam ubeut",
        "recentchanges-label-bot": "Neuandam nyoe geupubuet le bot",
        "recentchanges-label-unpatrolled": "Neuandam nyoe goh lom geukalon",
        "recentchangeslinked-toolbox": "Neuubah teukaw'èt",
        "recentchangeslinked-title": "Neuubah nyang meukaw'èt ngön $1",
        "recentchangeslinked-summary": "Nyoë nakeuh dapeuta neuubah nyang geupeugèt ban-ban nyoë keu on-on nyang meuhubông nibak ôn ka kusuih (atawa keu anggèëta kawan kusuih).\nÔn-ôn bak [[Special:Watchlist|keunalon droeneuh]] geucitak '''teubay'''.",
-       "recentchangeslinked-page": "Nan laman:",
+       "recentchangeslinked-page": "Nan miëng:",
        "recentchangeslinked-to": "Peuleumah neuubah nibak laman-laman nyang mupawôt ngön laman nyang geubri",
        "upload": "Peutamöng beureukaih",
        "uploadbtn": "Peutamong beureukaih",
        "filehist-filesize": "Rayek beureukah",
        "filehist-comment": "Seuneu'ôt",
        "imagelinks": "Seuneungui beureukaih",
-       "linkstoimage": "{{PLURAL:$1|laman}} di yup nyoë mupawôt u beureukaih nyoë:",
+       "linkstoimage": "{{PLURAL:$1|miëng}} di yup nyoë mupawôt u beureukaih nyoë:",
        "nolinkstoimage": "Hana laman nyang na meupawôt u beureukaih nyoë.",
        "sharedupload": "Beureukah nyoë dari $1 ngön kadang geunguy lé buët-buët la’én.",
        "sharedupload-desc-here": "Beureukaih nyoe nejih nibak $1 ngon kadang geunguy le proyek-proyek la'en.\nTeuneurang bak [$2 on teuneurangjih] geupeuleumah di yup nyoe.",
        "mimesearch": "Mita MIME",
        "listredirects": "Dapeuta peuninah",
        "unusedtemplates": "Templat nyang hana geungui",
-       "randompage": "Laman baranggari",
+       "randompage": "Miëng baranggari",
        "randomredirect": "Peuninah saban sakri",
        "statistics": "Keunira",
        "doubleredirects": "Peuninah ganda",
        "protectedpages": "Laman nyang geulindông",
        "listusers": "Dapeuta ureuëng ngui",
        "usercreated": "{{GENDER:$3|Geupeugot}} bak $1 poh $2",
-       "newpages": "Laman barô",
+       "newpages": "Miëng barô",
        "newpages-username": "Ureuëng ngui:",
        "ancientpages": "Laman paléng awai",
        "move": "Pupinah",
        "sp-contributions-submit": "Mita",
        "whatlinkshere": "Peunawôt balék",
        "whatlinkshere-title": "Laman nyang mupawôt u $1",
-       "whatlinkshere-page": "Laman:",
+       "whatlinkshere-page": "Miëng:",
        "linkshere": "Laman-laman nyoë meupawôt u '''[[:$1]]''':",
        "nolinkshere": "Hana halaman nyang teukaw'et u '''[[:$1]]'''.",
        "isredirect": "laman peuninah",
        "block-log-flags-nocreate": "pumeugöt akun geupumaté",
        "movepagetext": "Formulir di yup nyoë geunguy keu jak ubah nan saboh ôn ngön jak peupinah ban dum data riwayat u nan barô. Nan nyang trép euntreuk jeuët keu ôn peupinah u nan nyang barô. Hubông u nan trép hana meu’ubah. Neupeupaseuti keu neupréksa peuninah ôn nyang reulöh atawa meuganda lheuëh neupinah. Droëneuh nyang mat tanggông jaweuëb keu neupeupaseuti meunyo hubông laju teusambông u ôn nyang patôt.\n\nBeu neuingat that meunyo ôn '''h’an''' jan geupeupinah meunyo ka na ôn nyang geunguy nan barô, keucuali meunyo ôn nyan soh atawa nakeuh ôn peuninah ngön hana riwayat andam. Nyoë areutijih Droëneuh jeuët neu’ubah nan ôn keulayi lagèë söt meunyo Droëneuh neupeugöt seunalah, ngön Droëneuh h‘an jeuët neutimpa ôn nyang ka na.\n'''INGAT'''\nNyoë jeuët geupeuakébat neu’ubah nyang h’an neuduga ngön kreuëh ngön bacah keu ôn nyang meuceuhu. Neupeupaseuti Droëneuh meuphôm akébat nibak buët nyoë sigohlom neulanjut.",
        "movepagetalktext": "Ôn peugah haba nyang na hubôngan euntreuk teupinah keudroë '''keucuali meunyo:'''\n\n*Saboh ôn peugah haba nyang hana soh ka na di yup nan barô, atawa\n*Droëneuh hana neubôh tanda cunténg bak kutak di yup nyoë\n\nLam masalah nyoë, meunyo neuhawa, Droëneuh jeuët neupeupinah atawa neupeugabông ôn keudroë.",
-       "movearticle": "Peupinah laman:",
        "newtitle": "U nan barô:",
        "move-watch": "Kalön laman nyoë",
        "movepagebtn": "Peupinah laman",
        "movelogpage": "Log pinah",
        "movereason": "Choë:",
        "revertmove": "peuriwang",
-       "export": "Peuteubiët laman",
+       "export": "Peuteubiët miëng",
        "allmessages": "Peusan sistem",
        "allmessagesname": "Nan",
        "allmessagesdefault": "Naseukah pukok",
        "tooltip-pt-login": "Droëneuh geupadan keu tamong log, bah pih nyan hana geupeuwajéb.",
        "tooltip-pt-logout": "Teubiët",
        "tooltip-pt-createaccount": "Droëneuh geupadan keu neupeugöt saboh akun ngön neutamöng; bah pih nyan hana wajéb",
-       "tooltip-ca-talk": "Marit laman asoë",
-       "tooltip-ca-edit": "Droëneuh jeuët neuandam laman nyoë. Neungui tumbôi eu dilèë sigoh neukeubah.",
+       "tooltip-ca-talk": "Marit miëng asoë",
+       "tooltip-ca-edit": "Andam miëng nyoë",
        "tooltip-ca-addsection": "Puphôn beunagi barô",
        "tooltip-ca-viewsource": "Laman nyoë geulindông.\nDroëneuh jeuët neu’eu nèjih mantöng.",
-       "tooltip-ca-history": "Geunantoë awai nibak laman nyoë",
+       "tooltip-ca-history": "Geunantoë awai nibak miëng nyoë",
        "tooltip-ca-protect": "Peulindông laman nyoë",
        "tooltip-ca-delete": "Sampôh laman nyoë",
        "tooltip-ca-move": "Pupinah laman nyoë",
-       "tooltip-ca-watch": "Tamah laman nyoë u dapeuta kalön droëneuh",
+       "tooltip-ca-watch": "Tamah miëng nyoë u dapeuta kalön droëneuh",
        "tooltip-ca-unwatch": "Sampôh laman nyoë nibak dapeuta kalön droëneuh",
        "tooltip-search": "Mita {{SITENAME}}",
-       "tooltip-search-go": "Mita saboh laman ngon nan nyang peureuséh lagèë nyoë meunyo na",
-       "tooltip-search-fulltext": "Mita laman nyang na asoë lagèë nyoë",
+       "tooltip-search-go": "Mita saboh miëng ngon nan nyang peureuséh lagèë nyoë meunyo na",
+       "tooltip-search-fulltext": "Mita miëng nyang na asoë lagèë nyoë",
        "tooltip-p-logo": "Saweuë ôn keuë",
        "tooltip-n-mainpage": "Saweuë ôn keuë",
        "tooltip-n-mainpage-description": "Saweuë ôn keuë",
        "tooltip-n-portal": "Bhaih buët, peuë nyang jeuët neupubuët, pat keu mita sipeuë hai",
        "tooltip-n-currentevents": "Mita haba barô",
        "tooltip-n-recentchanges": "Dapeuta neuubah barô lam wiki.",
-       "tooltip-n-randompage": "Peudeuih laman baranggari",
+       "tooltip-n-randompage": "Peudeuih miëng baranggari",
        "tooltip-n-help": "Bak mita bantu.",
-       "tooltip-t-whatlinkshere": "Dapeuta ban dum laman wiki nyang mupawôt keunoë",
+       "tooltip-t-whatlinkshere": "Dapeuta ban dum miëng wiki nyang mupawôt keunoë",
        "tooltip-t-recentchangeslinked": "Neuubah barô lam laman nyang meupawôt nibak laman nyoë",
        "tooltip-feed-rss": "Umpeuën RSS keu laman nyoë",
-       "tooltip-feed-atom": "Umpeuën Atom keu laman nyoë",
+       "tooltip-feed-atom": "Umpeuën Atom keu miëng nyoë",
        "tooltip-t-contributions": "Dapeuta beuneuri ureuëng ngui nyoë",
        "tooltip-t-emailuser": "Peu'ét surat-e keu ureuëng ngui nyoë",
        "tooltip-t-upload": "Peutamong beureukaih",
-       "tooltip-t-specialpages": "Dapeuta ban dum laman kusuih",
-       "tooltip-t-print": "Seunalén rakam laman nyoë",
-       "tooltip-t-permalink": "Peunawôt teutap keu geunantoë laman nyoë",
-       "tooltip-ca-nstab-main": "Eu laman asoë",
-       "tooltip-ca-nstab-user": "Eu laman ureuëng ngui",
-       "tooltip-ca-nstab-special": "Nyoë nakeuh laman kusuih nyang h’an jeuët geuandam.",
+       "tooltip-t-specialpages": "Dapeuta ban dum miëng kusuih",
+       "tooltip-t-print": "Seunalén rakam miëng nyoë",
+       "tooltip-t-permalink": "Peunawôt teutap keu geunantoë miëng nyoë",
+       "tooltip-ca-nstab-main": "Eu miëng asoë",
+       "tooltip-ca-nstab-user": "Eu miëng ureuëng ngui",
+       "tooltip-ca-nstab-special": "Nyoë nakeuh miëng kusuih, ngön h’an jeuët geuandam.",
        "tooltip-ca-nstab-project": "Eu laman buët",
-       "tooltip-ca-nstab-image": "Eu laman beureukaih",
+       "tooltip-ca-nstab-image": "Eu miëng beureukaih",
        "tooltip-ca-nstab-template": "Eu seunaleuëk",
        "tooltip-ca-nstab-help": "Eu laman beunantu",
-       "tooltip-ca-nstab-category": "Eu laman kawan",
+       "tooltip-ca-nstab-category": "Eu miëng kawan",
        "tooltip-minoredit": "Bôh tanda keu nyoë sibagoë andam bacut",
        "tooltip-save": "Keubah neuubah Droëneuh",
        "tooltip-preview": "Peuleumah neuubah Droëneuh, neungui nyoë sigohlom neukeubah!",
        "tooltip-summary": "Pasoë éhtisa paneuk",
        "interlanguage-link-title": "$1 – $2",
        "simpleantispam-label": "Paréksa anti-spam.\n<strong>BÈK</strong> neupasoë!",
-       "pageinfo-toolboxlink": "Teuneurang laman",
+       "pageinfo-toolboxlink": "Teuneurang miëng",
        "previousdiff": "← Bida awai",
        "nextdiff": "Geunantoë lheuëh nyan →",
        "file-info-size": "$1 × $2 piksel, rayek beureukaih: $3, MIME jeunèh: $4",
        "exif-yresolution": "Rèsolusi buju",
        "exif-software": "Software geungui",
        "exif-exifversion": "Versi Exif",
+       "exif-colorspace": "Ruweuëng wareuna",
        "exif-datetimedigitized": "Uroë buleuën ngön watèë digital",
        "exif-orientation-1": "Biasa",
        "namespacesall": "ban dum",
        "duplicate-defaultsort": "'''Ingat:''' Gunci meuurot pukok \"$2\" jipeuhiro gunci meuurot pukok \"$1\" sigohlomjih.",
        "version": "Curak",
        "fileduplicatesearch-submit": "Mita",
-       "specialpages": "Laman kusuih",
+       "specialpages": "Miëng kusuih",
        "specialpages-note": "* Laman kusuih biasa.\n* <span class=\"mw-specialpagerestricted\">Laman kusuih geutheun.</span>",
        "specialpages-group-maintenance": "Beuneuri thèë plara",
        "specialpages-group-other": "La'én-la'én",
index f15aa68..66d452e 100644 (file)
        "viewsource-title": "$1 लेली स्रोत देखऽ",
        "actionthrottled": "कार्य समाप्त करलऽ गेलै",
        "protectedpagetext": "इ पन्ना संपादन आरू अन्य कार्यो स॑ सुरक्षित रखलऽ गेलऽ छै.",
+       "viewsourcetext": "आपनै इ पन्ना केरौ स्त्रोत क देखै आरू कापी करै सकै छियै.",
        "protectedinterface": "इ पन्ना इ विकी के सॉफ़्टवेयर क॑ इंटरफ़ेस पाठ दै छै, आरू एखरऽ गलत प्रयोग स॑ बचाबै लेली सुरक्षित करी देलऽ गेलऽ छै.\nसब्भे विकि लेली अनुवाद जोड़ै या बदलै लेली कृपया मीडियाविकि केरऽ क्षेत्रीयकरण प्रकल्प [//translatewiki.net/ translatewiki.net] केर प्रयोग करऽ.",
+       "editinginterface": "<strong>चेतावनी:</strong> आपनै एगो ऐसनौ पन्ना क बदली रहलौ छियै जे सॉफ़्टवेयर केरौ इंटरफ़ेस पाठ प्रदान करै छै।\nइ पन्ना क॑ बदलला स अन्य सदस्यो केरौ प्रदर्शित इंटरफ़ेस केरौ शक्लोसूरत म बदलाव ऐतै ।",
        "yourname": "सदस्यनाम:",
        "userlogin-yourname": "यूजरनाम",
        "userlogin-yourname-ph": "अपनऽ सदस्यनाम लिखऽ",
index 29062ca..48de7c7 100644 (file)
        "viewsource": "Ver fonte",
        "viewsource-title": "Ver la fonte de $1",
        "actionthrottled": "Aición llendada",
-       "actionthrottledtext": "Como midida anti-spam, nun se pue repetir esta aición munches vegaes en pocu tiempu, y trespasasti esi llímite.\nPor favor vuelvi intentalo nunos minutos.",
+       "actionthrottledtext": "Como midida escontra abusos, nun se pué repetir esta aición munches vegaes en pocu tiempu, y trespasasti esa llende.\nVuelve a intentalo n'unos minutos.",
        "protectedpagetext": "Esta páxina ta candada pa torgar ediciones y otres aiciones.",
        "viewsourcetext": "Pues ver y copiar la fonte d'esta páxina.",
        "viewyourtext": "Pues ver y copiar la fonte de <strong>les tos ediciones</strong> d'esta páxina.",
        "passwordreset-emailtext-ip": "Dalguién (seique vusté, dende la direición IP $1)solicitó'l reaniciu de la so contraseña de {{SITENAME}} ($4).\n{{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}}\na esta direición de corréu electrónicu:\n\n$2\n\n{{PLURAL:$3|Esta contraseña provisional caduca|Estes contraseñes provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.\nTendría d'aniciar sesión y escoyer una contraseña nueva agora. Si esta solicitú la fizo otra persona,\no si recordó la clave orixinal y yá nun quier camudala, pue escaecer esti mensaxe y siguir\nusando la contraseña antigua.",
        "passwordreset-emailtext-user": "L'usuariu $1 de {{SITENAME}} solicitó un reaniciu de la so contraseña de {{SITENAME}} ($4). {{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}} con esta direición de corréu electrónicu:\n\n$2\n\n{{PLURAL:$3|Esta contraseña provisional caduca|Estes contraseñes provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.\nTendría d'aniciar sesión y escoyer una contraseña nueva agora. Si esta solicitú la fizo otra persona, o si recordó la clave orixinal y yá nun quier camudala, pue escaecer esti mensaxe y siguir usando la contraseña antigua.",
        "passwordreset-emailelement": "Nome d'usuariu: \n$1\n\nContraseña temporal: \n$2",
-       "passwordreset-emailsent": "Unvióse un corréu electrónicu pa reaniciar la contraseña.",
+       "passwordreset-emailsent": "Si esta ye una direición de corréu electrónicu rexistrada pa la to cuenta, unviaráse un corréu pa reaniciar la contraseña.",
        "passwordreset-emailsent-capture": "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo.",
        "passwordreset-emailerror-capture": "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo, pero falló l'unviu {{GENDER:$2|al usuariu|a la usuaria}}: $1",
        "changeemail": "Camudar o desaniciar la dirección de corréu electrónicu",
        "upload-options": "Opciones de xubía",
        "watchthisupload": "Vixilar esti ficheru",
        "filewasdeleted": "Yá se xubió y se desanició depués un ficheru con esti nome.\nHabríes comprobar el $1 enantes de volver a xubilu.",
+       "filename-thumb-name": "Esto paez un títulu de miniatura. Por favor, nun xubas miniatures a la mesma wiki de la que salieron. D'otra manera, igua'l nome del ficheru pa que tenga más significáu, y que nun tenga'l prefixu de miniatura.",
        "filename-bad-prefix": "El nome del ficheru que tas xubiendo entama con '''\"$1\"''', que ye un nome non descriptivu que de vezu conseñen automáticamente les cámares dixitales.\nPor favor escueyi un nome más descriptivu pal to ficheru.",
        "filename-prefix-blacklist": " #<!-- dexa esta llinia exactamente como ta --> <pre>\n# La sintaxis ye la siguiente:\n#   * Lo que va del caráuter \"#\" al fin de llinia ye un comentariu\n#   * Toa llinia non-balera ye un prefixu pa los nomes de ficheru típicos que ponen les cámares dixitales\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # dellos teléfonos móviles\nIMG # xenéricu\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- dexa esta llinia exactamente como ta -->",
        "upload-success-subj": "Xubida correuta",
index c3b2c20..f3bd212 100644 (file)
        "textmatches": "Супадзеньні ў тэкстах старонак",
        "notextmatches": "Супадзеньні ў тэкстах старонак ня знойдзеныя",
        "prevn": "{{PLURAL:$1|1=папярэдняя|папярэднія}} $1",
-       "nextn": "{{PLURAL:$1|наступная|наступныя|наступныя}} $1",
+       "nextn": "{{PLURAL:$1|1=наступная|наступныя}} $1",
        "prev-page": "папярэдняя старонка",
        "next-page": "наступная старонка",
        "prevn-title": "{{PLURAL:$1|Папярэдні $1 вынік|Папярэднія $1 вынікі|Папярэднія $1 вынікаў}}",
        "group-bot-member": "робат",
        "group-sysop-member": "{{GENDER:$1|адміністратар|адміністратарка}}",
        "group-bureaucrat-member": "{{GENDER:$1|бюракрат|бюракратка}}",
-       "group-suppress-member": "{{GENDER:$1|рэвізор|рэвізорка}}",
+       "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}}:РÑ\8dвÑ\96зоÑ\80Ñ\8b",
+       "grouppage-suppress": "{{ns:project}}:Ð\9fадаÑ\9eлÑ\8fлÑ\8cнÑ\96кÑ\96_вÑ\8dÑ\80Ñ\81Ñ\96Ñ\8fÑ\9e",
        "right-read": "прагляд старонак",
        "right-edit": "рэдагаваньне старонак",
        "right-createpage": "стварэньне старонак (акрамя старонак абмеркаваньняў)",
index 2b87a2f..c0c8120 100644 (file)
        "filerevert-legend": "بیئرگردینتین فایلی",
        "filerevert-intro": "شما بی حالی بیئرگردینتینا '''[[Media:$1|$1]]''' بی [$4 نخسه تاریخ $2 سائت $3] هستیت.",
        "filerevert-comment": "دلیل:",
-       "filerevert-defaultcomment": "بÛ\8cئرگردÛ\8cÙ\86تÛ\8cÙ\86 Ø¨Ø¦ $1 Ø¦Û\8c Ù\86خسÙ\87 Ø¦Ø§ Ø³Ø§Ø¦Øª $2 ($3)",
+       "filerevert-defaultcomment": "بÛ\8eرگردÛ\8cÙ\86تÛ\8cÙ\86 Ø¨Ù\90Ù\87 Ù\86خسÙ\87 $2Ø\8c Ø³Ø§Ø¦Øª $1 ($3)",
        "filerevert-submit": "بیئرگشت",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> بی [$4 نخسه ئی بی تاریخی $2 سائت $3] ئا بیئرگشتینته بوت.",
        "filerevert-badversion": "قدیمیتیرین نخسه شه ای فایلا موجود نه اینت.",
index 2f31c3a..90f37de 100644 (file)
        "undeletepage": "Mostra i restaura pàgines esborrades",
        "undeletepagetitle": "'''A continuació teniu revisions eliminades de [[:$1]]'''.",
        "viewdeletedpage": "Visualitza les pàgines eliminades",
-       "undeletepagetext": "{{PLURAL:|S'ha eliminat la pàgina següent, però encara és a l'arxiu i pot ser restaurada|S'han eliminat les $1 pàgines següents, però encara són a l'arxiu i poden ser restaurades}}.\nL'arxiu pot ser netejat periòdicament.",
+       "undeletepagetext": "{{PLURAL:$1|S'ha eliminat la pàgina següent, però encara és a l'arxiu i pot ser restaurada|S'han eliminat les $1 pàgines següents, però encara són a l'arxiu i poden ser restaurades}}.\nL'arxiu pot ser netejat periòdicament.",
        "undelete-fieldset-title": "Restaura revisions",
        "undeleteextrahelp": "Per a restaurar l'historial sencer de la pàgina, deixeu totes les caselles sense seleccionar i feu clic a '''''{{int:undeletebtn}}'''''.\nPer a realitzar una restauració selectiva, marqueu les caselles que corresponguin a les revisions que voleu recuperar, i feu clic a '''''{{int:undeletebtn}}'''''.",
        "undeleterevisions": "{{PLURAL:$1|Una revisió suprimida|$1 revisions suprimides}}",
index 594b0ea..ad61892 100644 (file)
        "confirmdeletetext": "Vas a esborral una páhina/imahin i el su estorial de horma permanenti.\nPol favol, confirma que realmenti quieis hazel esu, qu'entiendis las consecuencias, i que lo hazis dalcuerdu cola\n[[{{MediaWiki:Policy-url}}]].",
        "actioncomplete": "Ación acabihá",
        "deletedtext": "S'á esborrau \"$1\" corretamenti.\nConsurta $2 pa vel los úrtimus esborraus.",
-       "dellogpage": "Rustrihu d´esborrau",
+       "dellogpage": "Rustrihu d'esborrau",
        "dellogpagetext": "Embahu se muestra una lista colos úrtimus esborraus.",
        "deletionlog": "rustrihu d´esborrau",
        "reverted": "Revertiu a la úrtima revisión",
index 72e0678..0a1f8ee 100644 (file)
        "move-page-legend": "Renommer une page",
        "movepagetext": "Utilisez le formulaire ci-dessous pour renommer une page, en déplaçant tout son historique vers le nouveau nom. L'ancien titre deviendra une page de redirection vers le nouveau titre. Vous pouvez mettre à jour automatiquement les redirections actuelles qui pointent vers le titre original. Si vous choisissez de ne pas le faire, assurez-vous de vérifier toute [[Special:DoubleRedirects|double redirection]] ou [[Special:BrokenRedirects|redirection cassée]]. Vous avez la responsabilité de vous assurer que les liens continuent de pointer vers leur destination supposée.\n\nNotez que la page ne sera '''pas''' renommée s'il existe déjà une page avec le nouveau titre, sauf si cette dernière est une simple redirection avec un historique de modifications vierge. Ceci permet de renommer une page vers sa position d'origine si le déplacement s'avère erroné.\n\n'''Attention !'''\nCeci peut provoquer un changement radical et imprévu pour une page souvent consultée ; assurez-vous d'en avoir compris les conséquences avant de continuer.",
        "movepagetext-noredirectfixer": "Utilisez le formulaire ci-dessous pour renommer une page, en déplaçant tout son historique vers le nouveau nom.\nL'ancien titre deviendra une page de redirection vers le nouveau titre.\nVérifiez bien les [[Special:DoubleRedirects|doubles redirections]] ou les [[Special:BrokenRedirects|redirections cassées]].\nVous avez la responsabilité de vous assurer que les liens continuent de pointer vers leur destination supposée.\n\nNotez que la page ne sera '''pas''' déplacée s'il existe déjà une page avec le nouveau titre, sauf si cette dernière a un historique de modifications vierge et est soit vide, soit une simple redirection. Ceci permet de renommer une page vers sa position d'origine si le déplacement s'avère erroné, et il est impossible d'écraser une page existante.\n\n'''Attention !'''\nCeci peut provoquer un changement radical et imprévu pour une page souvent consultée ; assurez-vous d'en avoir compris les conséquences avant de continuer.",
-       "movepagetalktext": "Si vous cochez cette case, la page de discussion associée sera automatiquement renommée, à moins qu’une page de discussion non vide existe déjà sous le nouveau nom.\n\nDans ce cas, vous devrez renommer ou fusionner cette page de discussion manuellement si vous le désirez.",
+       "movepagetalktext": "Si vous cochez cette case, la page de discussion associée sera automatiquement renommée, à moins qu’une page de discussion non vide existe déjà sous ce nouveau nom.\n\nDans ce cas, vous devrez renommer ou fusionner cette page de discussion manuellement si vous le désirez.",
        "moveuserpage-warning": "'''Attention :''' Vous êtes sur le point de renommer une page d’utilisateur. Veuillez noter que seule la page sera renommée et que l’utilisateur '''ne''' sera '''pas''' renommé.",
        "movecategorypage-warning": "<strong>Avertissement :</strong> Vous êtes sur le point de renommer une page de catégorie. Veuillez noter que seule la catégorie sera renommée et <em>qu’aucune</em> des pages de l’ancienne catégorie ne sera transférée dans la nouvelle.",
        "movenologintext": "Pour pouvoir renommer une page, vous devez être [[Special:UserLogin|identifié{{GENDER:||e}}]] avec un compte utilisateur enregistré et d'ancienneté suffisante.",
index f4a5dc0..9ce3772 100644 (file)
        "exif-bitspersample": "ביטים לרכיב",
        "exif-compression": "תבנית דחיסה",
        "exif-photometricinterpretation": "הרכב פיקסלים",
-       "exif-orientation": "×\9b×\99×\95×\95× ×\99×\95ת",
+       "exif-orientation": "×\9b×\99×\95×\95×\9f ×\9eצ×\9c×\9e×\94",
        "exif-samplesperpixel": "מספר רכיבים",
        "exif-planarconfiguration": "סידור מידע",
        "exif-ycbcrsubsampling": "הפחתת יחס Y ל־C",
index ba0d180..ced910d 100644 (file)
        "permissionserrorstext-withaction": "Anda tidak memiliki hak akses untuk $2, karena {{PLURAL:$1|alasan|alasan}} berikut:",
        "recreate-moveddeleted-warn": "'''Peringatan: Anda membuat ulang suatu halaman yang sudah pernah dihapus.'''\n\nHarap pertimbangkan apakah layak untuk melanjutkan suntingan Anda.\nBerikut adalah log penghapusan dan pemindahan dari halaman ini:",
        "moveddeleted-notice": "Halaman ini telah dihapus.\nSebagai referensi, berikut adalah log penghapusan dan pemindahan halaman ini.",
+       "moveddeleted-notice-recent": "Maaf, halaman ini telah dihapus (dalam 24 jam ini). Sebagai referensi, berikut adalah log penghapusan atau pemindahan halaman ini.",
        "log-fulllog": "Lihat seluruh log",
        "edit-hook-aborted": "Suntingan dibatalkan oleh kait parser\ntanpa ada keterangan.",
        "edit-gone-missing": "Tidak dapat memperbaharui halaman.\nHalaman kemungkinan telah dihapus.",
index 24fde00..d01dc9a 100644 (file)
@@ -90,7 +90,8 @@
                        "Aquatech",
                        "Statix64",
                        "CassiodoroVicinetti",
-                       "Bultro"
+                       "Bultro",
+                       "Oggioniale"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "viewsource": "Visualizza wikitesto",
        "viewsource-title": "Visualizza wikitesto di $1",
        "actionthrottled": "Azione ritardata",
-       "actionthrottledtext": "Come misura di sicurezza contro lo spam, l'esecuzione di alcune azioni è limitata a un numero massimo di volte in un determinato periodo di tempo, limite che in questo caso è stato superato. Si prega di riprovare tra qualche minuto.",
+       "actionthrottledtext": "Come misura di sicurezza contro lo spam, l'esecuzione di alcune azioni è limitata a un numero massimo di volte in un determinato periodo di tempo, limite che tu hai superato. Si prega di riprovare tra qualche minuto.",
        "protectedpagetext": "Questa pagina è stata protetta per impedirne la modifica o altre operazioni.",
        "viewsourcetext": "È possibile visualizzare e copiare il codice sorgente di questa pagina.",
        "viewyourtext": "È possibile visualizzare e copiare il codice sorgente delle <strong>tue modifiche</strong> a questa pagina.",
        "upload-options": "Opzioni di caricamento",
        "watchthisupload": "Aggiungi agli osservati speciali",
        "filewasdeleted": "Un file con questo nome è stato già caricato e cancellato in passato. Verificare il log delle $1 prima di caricarlo di nuovo.",
+       "filename-thumb-name": "Questo sembra essere il titolo di una miniatura. Non caricare le miniature sulla stessa wiki. Oppure, modifica il nome del file in modo che sia più significativo e non abbia il prefisso della miniatura.",
        "filename-bad-prefix": "Il nome del file che si sta caricando inizia con '''\"$1\"''', che è un nome generico simile a quelli assegnati automaticamente dalle fotocamere digitali. Si prega di scegliere un nome più descrittivo per il file.",
        "filename-prefix-blacklist": " #<!-- lascia questa riga esattamente com'è --> <pre>\n# La sintassi è la seguente:\n#   * Tutto ciò che segue il carattere \"#\" sino alla fine della riga è un commento\n#   * Ogni riga non vuota è un prefisso per nomi di file tipici assegnati automaticamente da fotocamere digitali\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # alcuni telefonini\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- lascia questa riga esattamente com'è -->",
        "upload-success-subj": "Caricamento completato",
index 5f89dd5..f82502a 100644 (file)
        "move-page-legend": "ページの移動",
        "movepagetext": "下のフォームを使用すると、ページ名を変更でき、そのページの履歴も変更先に移動できます。\n移動元のページは移動先への転送ページになります。\n移動元のページへの転送ページを自動的に修正できます。\n[[Special:DoubleRedirects|二重転送]]や[[Special:BrokenRedirects|迷子のリダイレクト]]を確認する必要があります。\nリンクを正しく維持するのは移動した人の責任です。\n\n移動先のページが既に存在する場合は、その移動先が転送ページであり、かつ過去の版を持たない場合以外は移動<strong>できません</strong>。\nつまり、間違えてページ名を変更した場合には元に戻せます。また移動によって既存のページを上書きしてしまうことはありません。\n\n<strong>注意!</strong>\nよく閲覧されるページや、他の多くのページからリンクされているページを移動すると予期しない結果が起こるかもしれません。\nページの移動に伴う影響をよく考えてから踏み切るようにしてください。",
        "movepagetext-noredirectfixer": "下のフォームを使用すると、ページ名を変更でき、そのページの履歴も変更先に移動できます。\n移動元のページは移動先への転送ページになります。\n自動的な修正を選択しない場合は、[[Special:DoubleRedirects|二重転送]]や[[Special:BrokenRedirects|迷子のリダイレクト]]を確認する必要があります。\nつながるべき場所にリンクがつながるよう維持するのは移動した人の責任です。\n\n移動先が既に存在する場合は、そのページが転送ページであり、かつ過去の版を持たない場合を除いて移動<strong>できません</strong>。\nつまり、間違えてページ名を変更した場合には元に戻せます。また移動によって既存のページを上書きしてしまうことはありません。\n\n<strong>警告!</strong>\n多く閲覧されるページや多くリンクされているページを移動すると、予期しない大きな変化が起こるかもしれないことにご注意ください。\nページの移動に伴う影響をよく考えてから移動してください。",
-       "movepagetalktext": "ã\81\93ã\81\93ã\81«ã\83\81ã\82§ã\83\83ã\82¯ã\82\92ä»\98ã\81\91ã\82\8bã\81¨ã\80\81é\96¢é\80£ä»\98ã\81\91ã\82\89ã\82\8cã\81\9fã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\82\82ä¸\80ç·\92ã\81«ã\80\81è\87ªå\8b\95ç\9a\84ã\81«æ\96°ã\81\97ã\81\84ã\82¿ã\82¤ã\83\88ã\83«ã\81«ç§»å\8b\95ã\81\95ã\82\8cã\81¾ã\81\99ã\80\82ã\81\9fã\81 ã\81\97ã\80\81移å\8b\95å\85\88ã\81«ã\80\81空ではないトークページが既に存在する場合を除きます。\n\nこの場合、手動でトークページを移動または統合する必要があります。",
+       "movepagetalktext": "ã\81\93ã\81\93ã\81«ã\83\81ã\82§ã\83\83ã\82¯ã\82\92ä»\98ã\81\91ã\82\8bã\81¨ã\80\81é\96¢é\80£ä»\98ã\81\91ã\82\89ã\82\8cã\81\9fã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\82\82ä¸\80ç·\92ã\81«ã\80\81è\87ªå\8b\95ç\9a\84ã\81«æ\96°ã\81\97ã\81\84ã\83\9aã\83¼ã\82¸å\90\8dã\81«ç§»å\8b\95ã\81\95ã\82\8cã\81¾ã\81\99ã\80\82ã\81\9fã\81 ã\81\97ã\80\81移å\8b\95å\85\88ã\81«空ではないトークページが既に存在する場合を除きます。\n\nこの場合、手動でトークページを移動または統合する必要があります。",
        "moveuserpage-warning": "<strong>警告:</strong> 利用者ページを移動しようとしています。この操作ではページのみが移動され、利用者名は<em>変更されない</em>点に注意してください。",
        "movecategorypage-warning": "<strong>警告:</strong> カテゴリのページを移動させようとしています。カテゴリのページのみが移動するため、元のカテゴリに属していたどのページも新しいカテゴリには移動 <em>しない</em> ことにご注意ください。",
        "movenologintext": "ページを移動するためには、登録利用者でありかつ、[[Special:UserLogin|ログイン]]している必要があります。",
index 8c2c566..f7583af 100644 (file)
        "group-bot-member": "{{GENDER:$1|Bot}}",
        "group-sysop-member": "{{GENDER:$1|Administrateur|Administratrice}}",
        "group-bureaucrat-member": "{{GENDER:$1|Bürokrat|Bürokratin}}",
-       "group-suppress-member": "{{GENDER:$1|Iwwersiicht}}",
+       "group-suppress-member": "{{GENDER:$1|Ënnerdrécker}}",
        "grouppage-user": "{{ns:project}}:Benotzer",
        "grouppage-autoconfirmed": "{{ns:project}}:Registréiert Benotzer",
        "grouppage-bot": "{{ns:project}}:Botten",
        "upload-form-label-infoform-description": "Beschreiwung",
        "upload-form-label-usage-title": "Benotzung",
        "upload-form-label-usage-filename": "Numm vum Fichier",
+       "foreign-structured-upload-form-label-own-work": "Dëst ass mäin eegent Wierk",
        "foreign-structured-upload-form-label-infoform-categories": "Kategorien",
        "foreign-structured-upload-form-label-infoform-date": "Datum",
        "backend-fail-stream": "De Fichier $1 konnt net iwwerdroe ginn.",
index 0d7637f..0631cea 100644 (file)
        "recentchangeslinked-summary": "Tai paskutinių keitimų, atliktų puslapiuose, į kuriuos yra nuoroda iš nurodyto puslapio (arba į nurodytos kategorijos narius), sąrašas.\nPuslapiai iš jūsų [[Special:Watchlist|stebimųjų sąrašo]] yra '''paryškinti'''.",
        "recentchangeslinked-page": "Puslapio pavadinimas:",
        "recentchangeslinked-to": "Rodyti su duotuoju puslapiu susijusių puslapių pakeitimus",
+       "recentchanges-page-added-to-category": "[[:$1]] pridėta prie kategorijos",
+       "recentchanges-page-removed-from-category": "[[:$1]] pašalinta iš kategorijos",
+       "autochange-username": "MediaWiki automatinis pakeitimas",
        "upload": "Įkelti rinkmeną",
        "uploadbtn": "Įkelti rinkmeną",
        "reuploaddesc": "Atšaukti įkėlimą ir grįžti į įkėlimo formą.",
index bd0ffff..d0fa15e 100644 (file)
        "nstab-template": "साचा",
        "nstab-help": "साहाय्य पान",
        "nstab-category": "वर्ग",
+       "mainpage-nstab": "मुख्य पान",
        "nosuchaction": "अशी कृती अस्तित्वात नाही",
        "nosuchactiontext": "URL ने नमूद केलेली कृती चुकीची आहे.\nतुम्ही कदाचित URL चुकीची दिली असेल, किंवा चुकीच्या दुव्यावर टिचकी दिली असेल.\nकदाचित, ही कृती {{SITENAME}} वापरत असलेल्या सॉफ्टवेअर मधील गणकदोष \nसुद्धा दर्शवीत असेल.",
        "nosuchspecialpage": "असे कोणतेही विशेष पृष्ठ अस्तित्वात नाही",
        "viewsource": "स्रोत पहा",
        "viewsource-title": "$1 चा उगम बघा",
        "actionthrottled": "कृती नियामक(थ्रॉटल) केली",
-       "actionthrottledtext": "à¤\86à¤\82तरà¤\9cाल-à¤\9aिà¤\96लणà¥\80 à¤µà¤¿à¤°à¥\8bधà¥\80 à¤\89पायाà¤\9aà¥\8dया à¤¦à¥\83षà¥\8dà¤\9fà¥\80नà¥\87(à¤\85à¤\81à¤\9fà¥\80 à¤¸à¥\8dपà¥\85म à¤®à¥\87à¤\9dर ), à¤¹à¥\80 à¤\95à¥\83तà¥\80 à¤¥à¥\8bडà¥\8dया à¤\95ालावधà¥\80त à¤\85सà¤\82à¤\96à¥\8dयवà¥\87ळा à¤\95रणà¥\8dयापासà¥\82न, à¤¤à¥\81मà¥\8dहाला à¤ªà¥\8dरतिबà¤\82धित à¤\95रणà¥\8dयात à¤\86लà¥\87 à¤\86हà¥\87, à¤\86णि à¤\86पण à¤¯à¤¾ à¤®à¤°à¥\8dयादà¥\87à¤\9aà¥\87 à¤\89लà¥\8dलà¤\82à¤\98न à¤\95à¥\87लà¥\87 à¤\86हà¥\87. à¤\95à¥\83पया à¤¥à¥\8bडà¥\8dया à¤µà¥\87ळानà¥\87 पुन्हा प्रयत्न करा.",
+       "actionthrottledtext": "à¤\85पशबà¥\8dद-विरà¥\8bधà¥\80 à¤\89पायाà¤\9aà¥\8dया à¤¦à¥\83षà¥\8dà¤\9fà¥\80नà¥\87(à¤\85à¤\81à¤\9fà¥\80-à¤\85बà¥\8dयà¥\81à¤\9c à¤®à¥\87à¤\9dर ),हà¥\80 à¤\95à¥\83तà¥\80 à¤¥à¥\8bडà¥\8dया à¤\95ालावधà¥\80त à¤\85सà¤\82à¤\96à¥\8dयवà¥\87ळा à¤\95रणà¥\8dयापासà¥\82न, à¤¤à¥\81मà¥\8dहाला à¤ªà¥\8dरतिबà¤\82धित à¤\95रणà¥\8dयात à¤\86लà¥\87 à¤\86हà¥\87, à¤\86णि à¤\86पण à¤¯à¤¾ à¤®à¤°à¥\8dयादà¥\87à¤\9aà¥\87 à¤\89लà¥\8dलà¤\82à¤\98न à¤\95à¥\87लà¥\87 à¤\86हà¥\87. à¤\95à¥\83पया à¤\95ाहà¥\80 à¤®à¤¿à¤¨à¥\80à¤\9fाà¤\82नà¤\82तर पुन्हा प्रयत्न करा.",
        "protectedpagetext": "हे पान बदल अथवा इतर कृती होऊ नयेत म्हणून सुरक्षित केले आहे.",
        "viewsourcetext": "तुम्ही या पानाचा स्रोत पाहू शकता व प्रत करू शकता:",
        "viewyourtext": "तुम्ही या पानाची, '''तुमची संपादने''' पाहू शकता व त्याची प्रत करू शकता:",
        "createacct-captcha": "सुरक्षा तपासणी",
        "createacct-imgcaptcha-ph": "वर दिसत असलेला मजकूर येथे टाका",
        "createacct-submit": "आपले खाते निर्माण करा",
-       "createacct-another-submit": "दà¥\81सरà¥\87 à¤¨à¤µà¥\80न à¤\96ातà¥\87 à¤¤à¤¯à¤¾à¤° à¤\95रा",
+       "createacct-another-submit": "खाते तयार करा",
        "createacct-benefit-heading": "{{SITENAME}} हे आपल्यासारख्याच लोकांनी बनविलेले आहे.",
        "createacct-benefit-body1": "{{PLURAL:$1|edit|संपादने}}",
        "createacct-benefit-body2": "{{PLURAL:$1|लेख}}",
        "passwordreset-emailtext-ip": "कुणीतरी (कदाचित तुम्ही, अंकपत्ता $1 वरुन) {{SITENAME}}($4) करिता नविन 'परवलीचा शब्द' पुनर्स्थापनेबद्दल विनंती केली आहे.\nखालील{{PLURAL:$3|सदस्यखाते}}या विपत्रपत्त्याशी निगडीत आहे: \n\"$2\"\n{{PLURAL:$3|हा तात्पुरता परवलीचा शब्द|हे तात्पुरते परवलीचे शब्द}}{{PLURAL:$5|एक दिवस|$5 दिवसात}} मुदतबाह्य होतील.आता आपण लॉग-ईन करून  नविन परवलीचा शब्द निवडा.जर ईतर कोणी ही विनंती केली असेल,किंवा जर आपणास परवलीच शब्द आठवला असेल तर,व जर आपण तो बदलु इच्छित नसाल तर आपण हा संदेश टाळा व आपला जुना परवलीचा शब्द वापरणे सुरू ठेवा.",
        "passwordreset-emailtext-user": " {{SITENAME}}वरील सदस्य $1ने {{SITENAME}}($4) करिता नविन 'परवलीचा शब्द' पुनर्स्थापनेबद्दल विनंती केली आहे.\nखालील{{PLURAL:$3|सदस्यखाते}}या विपत्रपत्त्याशी निगडीत आहे: \n\n\"$2\"\n\n{{PLURAL:$3|हा तात्पुरता परवलीचा शब्द|हे तात्पुरते परवलीचे शब्द}}{{PLURAL:$5|एक दिवस|$5 दिवसात}} मुदतबाह्य होतील.आता आपण लॉग-ईन करून  नविन परवलीचा शब्द निवडा.जर ईतर कोणी ही विनंती केली असेल,किंवा जर आपणास परवलीच शब्द आठवला असेल तर,व, जर आपण तो बदलु इच्छित नसाल तर आपण हा संदेश टाळा व आपला जुना परवलीचा शब्द वापरणे सुरू ठेवा.",
        "passwordreset-emailelement": "सदस्यनाव: \n$1\n\nअस्थायी परवलीचा शब्द: \n$2",
-       "passwordreset-emailsent": "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र पाठवण्यात आले आहे.",
+       "passwordreset-emailsent": "जर हा आपल्या खात्याचा नोंदणिकृत विपत्रपत्ता असेल तर, परवलीच्या शब्दाच्या पुनर्स्थापनेबाबत एक विपत्र पाठवण्यात येईल.",
        "passwordreset-emailsent-capture": "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र पाठवण्यात आले आहे जे खाली दर्शविण्यात आले आहे.",
        "passwordreset-emailerror-capture": "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र निर्माण करण्यात आले, जे खाली दर्शविण्यात आले आहे.परंतु,{{GENDER:$2|सदस्य}}ला पाठविणे असफल झाले: $1",
-       "changeemail": "à¤\88-मà¥\87ल à¤ªà¤¤à¥\8dता à¤¬à¤¦à¤²ा",
-       "changeemail-text": "आपला ई-मेल पत्त बदलण्यासाठी हे आवेदनपत्र भरा. या बदलाची पुष्टी करण्यासाठी तुम्हाला तुमचा परवलीचा शब्द टाकावा लागेल.",
+       "changeemail": "विपतà¥\8dरपतà¥\8dता à¤¬à¤¦à¤²à¤¾ à¤\95िà¤\82वा à¤¹à¤\9fवा",
+       "changeemail-text": "आपला ई-मेल पत्त बदलण्यासाठी हे आवेदनपत्र भरा. या बदलाची पुष्टी करण्यासाठी तुम्हाला तुमचा परवलीचा शब्द टाकावा लागेल.जर आपणास आपल्या खात्याशी असलेली विपत्रपत्त्याची संलग्नता हटवायची असेल तर,हे आवेदन सादर करतेवेळी नविन विपत्रपत्त्याचा रकाना रिकामा ठेवा.",
        "changeemail-no-info": "हे पान थेट बघण्यासठी तुम्हाला सनोंद-प्रवेशित असावे लागेल.",
        "changeemail-oldemail": "सध्याचा ईमेल पत्ता :",
        "changeemail-newemail": "नवा ईमेल पत्ता:",
        "prefs-watchlist-token": "निरीक्षणसूचीचा बिल्ला:",
        "prefs-misc": "किरकोळ",
        "prefs-resetpass": "परवलीचा शब्द बदला.",
-       "prefs-changeemail": "विपत्रपत्ता बदला",
+       "prefs-changeemail": "विपत्रपत्ता बदला किंवा हटवा",
        "prefs-setemail": "तुमचा ई-मेल पत्ता लिहा.",
        "prefs-email": "विपत्र पर्याय",
        "prefs-rendering": "देखावा",
        "upload-too-many-redirects": "या आंतरजालपत्त्यात खूप पुनर्निर्देशने आहेत",
        "upload-http-error": "एक एचटीटीपी चूक उद्भवली: $1",
        "upload-copy-upload-invalid-domain": "संक्रमित केलेली महिती अधिक्षेत्रात उपलब्ध नाही.",
+       "foreign-structured-upload-form-label-own-work": "हे माझे स्वत:चे काम आहे",
        "backend-fail-stream": "$1 या संचिकेचा स्त्रोत शोधता आला नाही.",
        "backend-fail-backup": "$1 या संचिकेची आधारप्रत बनविता आली नाही.",
        "backend-fail-notexists": "$1 ही संचिका अस्तित्वात नाही.",
        "deletepage": "पान वगळा",
        "confirm": "निश्चीत",
        "excontent": "मजकूर होता: '$1'",
-       "excontentauthor": "मजकूर होता: '$1' (आणि फक्त '[[Special:Contributions/$2|$2]]' यांचे योगदान होते.)",
+       "excontentauthor": "मजकूर होता: \"$1\" आणि फक्त [[Special:Contributions/$2|$2]]  ([[User talk:$2|चर्चा]])यांचेच योगदान होते.",
        "exbeforeblank": "वगळण्यापूर्वीचा मजकूर पुढीलप्रमाणे: '$1'",
        "delete-confirm": "\"$1\" वगळा",
        "delete-legend": "वगळा",
        "movenotallowedfile": "तुम्हाला संचिका स्थानांतरीत करण्याची परवानगी नाही.",
        "cant-move-user-page": "तुम्हाला सदस्यपान स्थानांतरीत करण्याची परवानगी नाही.(उपपानाव्यतिरिक्त)",
        "cant-move-to-user-page": "तुम्हाला एखाद्या पानास सदस्य पानांवर (सदस्य उप-पाने सोडून) घेऊन जाण्यास परवानगी नाही.",
-       "newtitle": "नवीन शीर्षकाकडे:",
+       "newtitle": "नवीन शीर्षक:",
        "move-watch": "स्रोत पान व लक्ष  पानांवर निगराणी ठेवा",
        "movepagebtn": "स्थानांतरण करा",
        "pagemovedsub": "स्थानांतरण यशस्वी",
index 5466950..f00d523 100644 (file)
        "editfont-monospace": "Cencoyāhualiztli machiyōtlahtōliztli",
        "editfont-sansserif": "Sans-serif machiyōtlahtōliztli",
        "editfont-serif": "Serif machiyōtlahtōliztli",
-       "sunday": "ic cemilhuitl",
-       "monday": "ic ōmilhuitl",
-       "tuesday": "ic ēyilhuitl",
-       "wednesday": "ic nāhuilhuitl",
-       "thursday": "ic mācuīlilhuitl",
-       "friday": "ic chicuacemilhuitl",
-       "saturday": "ic chicōmilhuitl",
-       "sun": "cemilhui",
-       "mon": "ōmilhui",
-       "tue": "ēyilhui",
-       "wed": "nāhuilhui",
-       "thu": "mācuīlilhui",
-       "fri": "chicuacemilhui",
-       "sat": "chicōmilhui",
-       "january": "Àtemòstli",
-       "february": "Iskalli",
-       "march": "Àtlakàwalo",
-       "april": "Tlàkaxipèwalistli",
-       "may_long": "Tosostli",
-       "june": "Toxkatl",
-       "july": "Tèkòilwitl",
-       "august": "Tlaxòchimàko",
-       "september": "Xokowetzi",
-       "october": "Teòtlêko",
-       "november": "Tepèilwitl",
-       "december": "Pànketzalistli",
+       "sunday": "Īccemilhuitl",
+       "monday": "Īcōmilhuitl",
+       "tuesday": "Īcyēyilhuitl",
+       "wednesday": "Īcnāhuilhuitl",
+       "thursday": "Īcmācuīlilhuitl",
+       "friday": "Īcchicuacemilhuitl",
+       "saturday": "Īcchicōmilhuitl",
+       "sun": "ilhui",
+       "mon": "ilhui",
+       "tue": "ilhui",
+       "wed": "ilhui",
+       "thu": "ilhui",
+       "fri": "ilhui",
+       "sat": "ilhui",
+       "january": "Īccēmētztli",
+       "february": "Īcōmēmētztli",
+       "march": "Īcyēyimētztli",
+       "april": "Īcnāuhtetlmētztli",
+       "may_long": "Īcmācuīllimētztli",
+       "june": "Īcchicuacemmētztli",
+       "july": "Īcchicōmemētztli",
+       "august": "Īcchicuēyimētztli",
+       "september": "Īcchiucnāhuimētztli",
+       "october": "Īcmahtlāctlimētztli",
+       "november": "Īcmahtlāctlioncēmētztli",
+       "december": "Īcmahtlāctliomōmemētztli",
        "january-gen": "Īccēmētztli",
        "february-gen": "Īcōmemētztli",
        "march-gen": "Īcyēyimētztli",
        "july-gen": "Īcchicōmemētztli",
        "august-gen": "Īcchicuēyimētztli",
        "september-gen": "Īcchiucnāhuimētztli",
-       "october-gen": "Īcmahtlactetlmētztli",
+       "october-gen": "Īcmahtlāctetlmētztli",
        "november-gen": "Īcmahtlāctetloncēmētztli",
-       "december-gen": "ic mahtlāctetl omōme mētztli",
-       "jan": "ic cē",
-       "feb": "ic ōme",
-       "mar": "ic ēyi",
-       "apr": "ic nāuh",
-       "may": "ic mācuīl",
-       "jun": "ic chicuacē",
-       "jul": "ic chicōme",
-       "aug": "ic chicuēyi",
-       "sep": "ic chiucnāuh",
-       "oct": "ic mahtlāc",
-       "nov": "ic mahtlāctli oncē",
-       "dec": "ic mahtlāctli omōme",
+       "december-gen": "Īcmahtlāctetlomōmemētztli",
+       "jan": "1 Mētz",
+       "feb": "2 Mētz",
+       "mar": "3 Mētz",
+       "apr": "4 Mētz",
+       "may": "5 Mētz",
+       "jun": "6 Mētz",
+       "jul": "7 Mētz",
+       "aug": "8 Mētz",
+       "sep": "9 Mētz",
+       "oct": "10 Mētz",
+       "nov": "11 Mētz",
+       "dec": "12 Mētz",
        "january-date": "Īccēmētztli $1",
        "february-date": "Īcōmemētztli $1",
        "march-date": "Īquēyimētztli $1",
        "category-file-count": "{{PLURAL:$2|Inìn tlaìxmatkàtlàlilòtl san kipia|Inìn tlaìxmatkàtlalilòtl kimpia {{PLURAL:$1|inìn èwalli|inîkë $1 èwaltìn}}, ìwikpa $2.}}",
        "category-file-count-limited": "{{PLURAL:$1|Inìn tlâkuilòlèwalli kä|Inîkë $1 tlâkuilòlèwaltìn katêkë}} ìpan inìn tlaìxmatkàtlàlilòtl.",
        "listingcontinuesabbrev": "niman",
-       "about": "Ītechpa",
+       "about": "Ītechcopa",
        "article": "Tlâkuilòpilli",
        "newwindow": "(Motlapoāz cē yancuīc tlanexillōtl)",
-       "cancel": "Ticcuepāz",
+       "cancel": "Ticcāhuaz",
        "moredotdotdot": "Huehca ōmpa...",
        "mypage": "Noāmauh",
        "mytalk": "Notēixnāmiquiliz",
        "and": "&#32;īhuān",
        "qbfind": "Tlatēmōz",
        "qbbrowse": "Titlatēmōz",
-       "qbedit": "Ticpatlāz",
+       "qbedit": "Ticpatlaz",
        "qbpageoptions": "Inīn zāzanilli",
        "qbmyoptions": "Nozāzanil",
        "faq": "Zan īc tētlatlanīliztli",
        "searchbutton": "Tlatēmōz",
        "go": "Yāuh",
        "searcharticle": "Yāuh",
-       "history": "tlahcuilōlloh",
-       "history_short": "Tlahcuilōlloh",
+       "history": "Tlaīxtli ītlahtōllo",
+       "history_short": "Tlahtōllōtl",
        "updatedmarker": "ōmoyancuīx īhuīcpa xōcoyōc notlahpololiz",
        "printableversion": "Tepoztlahcuilōlli",
        "permalink": "Mochipa tzonhuiliztli",
        "edit-local": "Ticpatlaz nicān tlahtōlli",
        "create": "Ticchīhuaz",
        "create-local": "Ticahxiltīz nicān tlahtōlli",
-       "editthispage": "Ticpatlaz inīn zāzanilli",
-       "create-this-page": "Ticchīhuaz inīn zāzanilli",
+       "editthispage": "Ticpatlaz inīn tlaīxtli",
+       "create-this-page": "Ticchīhuaz inīn tlaīxtli",
        "delete": "Ticpolōz",
-       "deletethispage": "Ticpolōz inīn zāzanilli",
+       "deletethispage": "Ticpolōz inīn tlaīxtli",
+       "undeletethispage": "Ticmāquīxtīz inīn tlaīxtli",
        "undelete_short": "Ahticpolōz {{PLURAL:$1|cē tlapatlaliztli|$1 tlapatlaliztli}}",
        "viewdeleted_short": "Mà mỏta {{PLURAL:$1|se tlatlaìxpôpolòlli tlayèktlàlilistli|$1 tlatlaìxpôpolòltin tlayèktlàlilistin}}",
        "protect": "Ticquīxtīz",
        "protectthispage": "Ticquīxtiāz inīn zāzanilli",
        "unprotect": "Ticpatlaz in tlaquīxtīliztli",
        "unprotectthispage": "Ticpatlaz inīn āmatl ītlaquīxtīliz",
-       "newpage": "Yancuīc zāzanilli",
+       "newpage": "Yancuic tlaīxtli",
        "talkpage": "Tictlahtōz inīn zāzaniltechcopa",
-       "talkpagelinktext": "Tèìxnàmikilistli",
+       "talkpagelinktext": "Zānīlli",
        "specialpage": "Nònkuâkìskàtlaìxtlapalli",
        "personaltools": "In tlein nitēquitiltilia",
-       "articlepage": "Xiquittaz in tlahcuilōlli",
+       "articlepage": "Tiquittaz in tlahcuilōlli",
        "talk": "tēixnāmiquiliztli",
        "views": "Tlachiyaliztli",
        "toolbox": "Tlachihchīhualōni",
        "importlogpage": "Tiquincōhuāz tlahcuilōlloh",
        "tooltip-pt-userpage": "Notlatequitiltilīlzāzanil",
        "tooltip-pt-mytalk": "Notēixnāmiquiliz",
-       "tooltip-pt-preferences": "Notlaēlēhuiliz",
+       "tooltip-pt-preferences": "Mopanitlatlālīl",
        "tooltip-pt-watchlist": "Zāzaniltin tiquintlachiya ic tlapatlaliztli",
        "tooltip-pt-mycontris": "Notlahcuilōl",
        "tooltip-pt-login": "Tihuelīti timocalaqui, tēl ahmo tihuīquilia.",
index b85cf97..cb73ce4 100644 (file)
        "viewsource": "Vere sorgente",
        "viewsource-title": "Vere surgente 'e $1",
        "actionthrottled": "Azione ritardata",
-       "actionthrottledtext": "Comme misura anti-spam, site lemmetato 'a ffà st'azione troppe vote dint'a nu curto spazio 'e tiempo, e mò stu lèmmeto è stato superato.\nPe' piacere pruvate n'ata vota dint'a cocche minuto.",
+       "actionthrottledtext": "Comme misura anti-abuse, site lemmetato 'a ffà st'azione troppe vote dint'a nu curto spazio 'e tiempo, e mò stu lèmmeto è stato superato.\nPe' piacere pruvate n'ata vota dint'a cocche minuto.",
        "protectedpagetext": "Sta paggena s'è prutetta pe' ne bloccà 'a mudifeca o n'ata azione.",
        "viewsourcetext": "Putite vedé e copià 'o codece surgiva 'e sta paggena.",
        "viewyourtext": "Putite vedé e copià 'o codice surgiva d' 'e <strong>cagnamiénte vuoste</strong> a sta paggena.",
        "passwordreset-emailtext-ip": "Coccherun (può darse ca sì tu, cu n'indirizzo IP $1) ha addimannato na mmasciata c' 'a password nova pe' putè trasì a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|L'utente associate}} a st'indirizze e-mail songo:\n\n$2\n\n{{PLURAL:$3|Sta password temporanea ammaturarrà|Sti password temporanee ammaturarranno}} aropp'a {{PLURAL:$5|nu juorno|$5 ghiuorne}}.\nHè 'a trasì e scegliere na password nova mò. \n\nSi nun sì stato tu a fà sta richiesta, o te sì scurdat' 'a password origginale e nun 'a buò cagnà cchiù, lassa perde sta mmasciata e usa 'a password viecchia.",
        "passwordreset-emailtext-user": "L'utente $1 di {{SITENAME}} ha addimannato na mmasciata c' 'a password nova pe' putè trasì a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|L'utente associate}} a st'indirizze e-mail songo:\n\n$2\n\n{{PLURAL:$3|Sta password temporanea ammaturarrà|Sti password temporanee ammaturarranno}} aropp'a {{PLURAL:$5|nu juorno|$5 ghiuorne}}.\nHè 'a trasì e scegliere na password nova mò. \n\nSi nun sì stato tu a fà sta richiesta, o te sì scurdat' 'a password origginale e nun 'a buò cagnà cchiù, lassa perde sta mmasciata e usa 'a password viecchia.",
        "passwordreset-emailelement": "Nomme utente: \n$1\n\nPassword temporanea: \n$2",
-       "passwordreset-emailsent": "Na mmasciata e-mail pe' riabbià 'a password è stata mannata.",
+       "passwordreset-emailsent": "Si chesto fosse nu cunto riggistrato e-mail, allora buò dicere ca se mannarrà na mmasciata e-mail pe' riabbià 'a password.",
        "passwordreset-emailsent-capture": "Na mmasciata e-mail pe' riabbià 'a password è stata mannata, chista mmasciata 'a putite vedé ccà abbascio.",
        "passwordreset-emailerror-capture": "Na mmasciata e-mail pe' riabbià 'a password è stata mannata, 'a putite vedé ccà abbascio, ma aita sapé ca nun s'è mannata a {{GENDER:$2|l'utente}} pecché c'è stato cocch'errore: $1",
        "changeemail": "Cagna o lèva l'indirizzo e-mail",
        "upload-options": "Opziune 'e carreca",
        "watchthisupload": "Tiene d'uocchio chistu file",
        "filewasdeleted": "Nu file ca se chiamave cumm'a chillo c'avete primma carrecato e pò è stato scancellato.\nVedite 'e cuntrullà 'o $1 apprimma ca cuntinuate c' 'a carreca.",
+       "filename-thumb-name": "Chesto pare nu titolo 'e miniatura. Pe' piacere nun carrecate miniature 'a stessa wiki. 'E n'atu modo, cagnate pe' piacere 'o nomme d' 'o file, facenno chesto cchiù significativo e senza prefisso 'e miniatura.",
        "filename-bad-prefix": "'O nomme d' 'o file ca state a carrecà accummencia pe' ''\"$1\"''', ca nurmalmente è 'o nomme c'assegnasse na machina fotografeca automatecamente ed è nu nomme nun descrittivo.\nPe' piacere scigliete n'atu nomme ca fosse cchiù descrittivo.",
        "upload-success-subj": "Carreca ngarrata",
        "upload-success-msg": "'A carreca tuja d' 'o [$2] è asciuta bona. Mò è a disposizione ccà: [[:{{ns:file}}:$1]]",
index 9167d5b..56eca63 100644 (file)
@@ -32,6 +32,7 @@
        "tog-oldsig": "Nygöine allekirjutus:",
        "tog-uselivepreview": "Käytä välittömiä ezikaččeluu",
        "tog-forceeditsummary": "Huomavuta minuu, gu en olle kirjutannuh yhtehveduo",
+       "tog-watchlisthideown": "Peittiä minun korjavukset valvonduluvettelospäi",
        "tog-watchlisthideliu": "Peitä kirjutannuhuoloin käyttäjien kohendukset valvondulistalpäi",
        "tog-watchlisthideanons": "Peitä registriiruičemattomien käyttäjien kohendukset valvondulistalpäi",
        "tog-watchlisthidepatrolled": "Peitä muutoksientarkistajien hyväksytyt kohendukset valvondulistalpäi",
@@ -42,6 +43,7 @@
        "underline-always": "Ainos",
        "underline-never": "Nikonzu",
        "editfont-style": "Edituičendualovehen kirjainstiil'u:",
+       "editfont-default": "Livaimen piäazetus",
        "editfont-sansserif": "Sans-serif -fontu",
        "editfont-serif": "Serif-fontu",
        "sunday": "Pyhäpäivy",
        "createacct-email-ph": "Kirjuta sinun sähköpoštuadressu",
        "createacct-another-email-ph": "Kirjuta sinun sähköpoštuadressu",
        "createacct-realname": "Tovelline nimi (omatahtoine tiedo)",
+       "createaccountreason": "Syy:",
+       "createacct-reason": "Syy",
        "createacct-reason-ph": "Mindäh olet luadimas tostu käyttäitilii",
        "createacct-captcha": "Turvallizusvarmistus",
        "createacct-imgcaptcha-ph": "Kirjuta ylähän olii tekstu",
        "createacct-benefit-body2": "{{PLURAL:$1|sivu|sivuu}}",
        "createacct-benefit-body3": "{{PLURAL:$1|Jälgimäime käyttäi|Jälgimäzet käyttäjät}}",
        "badretype": "Sinun kirjutetut peittosanat ei oldu yhtenjyttymät.",
+       "usernameinprogress": "Tunnuksen luadimine tälle käyttäinimele on nygöi kesken. Ole hyvä da vuota.",
+       "userexists": "Syötetty käyttäjän nimi on jo käytös. Ole hyvä, keksi toine nimi.",
        "loginerror": "Kirjuttuanduhaireh",
        "createacct-error": "Haireh käyttäitunnuksen luadimizes",
        "createaccounterror": "Ei voinuh luadie tilii: $1",
+       "loginsuccesstitle": "Olet kirjutannuhes",
        "loginsuccess": "<strong>Olet kirjutannuhes sivule {{SITENAME}} käyttäitunnuksel \"$1\".</strong>",
        "nosuchusershort": "Ei ole käyttäjiä nimel \"$1\". Tarkista kirjutitgo oigein.",
        "nouserspecified": "Käyttäinimi pidäy.",
        "passwordremindertitle": "Uuzi väliaigaine peittosana {{SITENAME}}-sivuh niškoi",
        "passwordremindertext": "Kentah IP-adressispäi $1 kyzyi työndämäh uuttu peittosanua saitale {{SITENAME}} ($4). Väliaigaine peittosana käyttäjäle $2 on nygöi $3. Kirjuttai da vaihta peittosana. Väliaigaine peittosana vahnenou {{PLURAL:$5|yhten päivän|$5 päivän}} jälles.\n\nOllou kentah toine työndänyh tämän pakičuksen, libo ku ollet mustanuh sinun peittosanan da et tahto vaihtua sidä, voit jättiä tämän viestin huomivottah da jatkua vahnan peittosanan käyttyö.",
        "mailerror": "Haireh työndäjes sähköpoštua: $1",
+       "emaildisabled": "Tämä verkosivusto ei voi työndiä sähköpoštuviestilöi.",
        "accountcreated": "Tili luajittu",
+       "createaccount-title": "{{SITENAME}}: käyttäitunnuksen luadimine",
        "loginlanguagelabel": "Kieli: $1",
        "pt-login": "Kirjuttai",
        "pt-login-button": "Kirjuttai",
        "pt-userlogout": "Kirjuttai ullos",
        "user-mail-no-addy": "Opit työndiä sähköpoštan sähköpoštuadressittah.",
        "changepassword": "Vaihta peittosana",
+       "resetpass_announce": "Suaja sizähkirjuamine loppuh, sinul pidäy keksie uuzi peittosana.",
        "resetpass_header": "Vaihta tilin peittosana",
        "oldpassword": "Vahnu peittosana:",
        "newpassword": "Uuzi peittosana:",
+       "retypenew": "Kirjuta peittosana uvvessah:",
+       "resetpass_submit": "Azeta peittosana da kirjuttai sistiemah:",
        "changepassword-success": "Sinun peittosana on vaihtettu!",
        "resetpass_forbidden": "Ei voi vaihtua peittosanua",
        "resetpass-no-info": "Et voi nähtä tädä sivuu kuni et ole kirjutannuhes.",
index 0096b60..d8dbd57 100644 (file)
        "passwordreset-emailtext-ip": "Ktoś (prawdopodobnie Ty, spod adresu IP $1) poprosił o zresetowanie twojego hasła w {{GRAMMAR:MS.lp{{SITENAME}}}} ($4). Z tym adresem e‐mailowym powiązane {{PLURAL:$3|jest konto użytkownika|są następujące konta użytkowników:}}\n\n$2\n\n{{PLURAL:$3|Tymczasowego hasła|Tymczasowych haseł}} można użyć w ciągu {{PLURAL:$5|jednego dnia|$5 dni}}.\nPowinieneś zalogować się i zmienić hasło na nowe. Jeśli to ktoś inny poprosił o wysłanie przypomnienia lub jeśli pamiętasz aktualne hasło i nie chcesz go zmieniać wystarczy, że zignorujesz tę wiadomość i będziesz nadal korzystać ze swojego starego hasła.",
        "passwordreset-emailtext-user": "Użytkownik $1 poprosił o zresetowanie twojego hasła w {{GRAMMAR:MS.lp{{SITENAME}}}} ($4). Z tym adresem e‐mailowym powiązane {{PLURAL:$3|jest konto użytkownika|są następujące konta użytkowników:}}\n\n$2\n\n{{PLURAL:$3|Tymczasowego hasła|Tymczasowych haseł}} można użyć w ciągu {{PLURAL:$5|jednego dnia|$5 dni}}.\nPowinieneś zalogować się i zmienić hasło na nowe. Jeśli to ktoś inny poprosił o wysłanie przypomnienia lub jeśli pamiętasz aktualne hasło i nie chcesz go zmieniać wystarczy, że zignorujesz tę wiadomość i będziesz nadal korzystać ze swojego starego hasła.",
        "passwordreset-emailelement": "Nazwa użytkownika: \n$1\n\nTymczasowe hasło: \n$2",
-       "passwordreset-emailsent": "E‐mail resetowania hasła został wysłany.",
+       "passwordreset-emailsent": "Jeśli adres e‐mail przypisany do Twojego konta został zarejestrowany, zostanie wysłany e-mail do odzyskiwania hasła.",
        "passwordreset-emailsent-capture": "Wyświetlony poniżej e‐mail pozwalający na zresetowanie hasła został wysłany.",
        "passwordreset-emailerror-capture": "Poniżej wyświetlony e‐mail pozwalający na zresetowanie hasła został wygenerowany, ale nie udało się wysłać go do {{GENDER:$2|użytkownika|użytkowniczki}}: $1",
        "changeemail": "Zmiana lub usunięcie adresu e‐mail",
index 8dbc0fa..e415225 100644 (file)
        "createacct-captcha": "امنيتي تدبير",
        "createacct-imgcaptcha-ph": "پورته ښکاره شوی متن دلته وټاپئ",
        "createacct-submit": "گڼون مو جوړ کړئ",
-       "createacct-another-submit": "بل گڼون جوړول",
+       "createacct-another-submit": "گڼون جوړول",
        "createacct-benefit-heading": "{{SITENAME}} ستاسې په شان خلکو لخوا جوړ شوی.",
        "createacct-benefit-body1": "{{PLURAL:$1|سمون|سمونونه}}",
        "createacct-benefit-body2": "{{PLURAL:$1|مخ|مخونه}}",
        "group-bot": "روباټونه",
        "group-sysop": "پازوالان",
        "group-bureaucrat": "بيوروکراټان",
-       "group-suppress": "Ú\85ارونکي",
+       "group-suppress": "Ú\81Ù¾Ù\88ونکي",
        "group-all": "(ټول)",
        "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|Ú\85ارÙ\86}}",
+       "group-suppress-member": "{{GENDER:$1|Ú\81Ù¾Ù\88Ù\88Ù\86Ú©Û\8c}}",
        "grouppage-user": "{{ns:project}}:کارنان",
        "grouppage-autoconfirmed": "{{ns:project}}:تاييد شوي کارنان",
        "grouppage-bot": "{{ns:project}}:روباټان",
        "grouppage-sysop": "{{ns:project}}:پازوالان",
        "grouppage-bureaucrat": "{{ns:project}}:بيوروکراټان",
-       "grouppage-suppress": "{{ns:project}}:Ú\85ارÙ\86",
+       "grouppage-suppress": "{{ns:project}}:Ú\81Ù¾Ù\84",
        "right-read": "مخونه لوستل",
        "right-edit": "مخونه سمول",
        "right-createpage": "مخونه جوړول (هغه چې د خبرو اترو مخونه نه دي)",
        "nopagetext": "کوم مخ مو چې وښوده هغه نشته.",
        "pager-newer-n": "{{PLURAL:$1|نوی 1|نوي $1}}",
        "pager-older-n": "{{PLURAL:$1|زوړ 1|زاړه $1}}",
-       "suppress": "Ú\85ارÙ\86",
+       "suppress": "Ú\81Ù¾Ù\84",
        "apihelp": "API لارښود",
        "apihelp-no-such-module": "د \"$1\" ماډيول و نه موندل شو.",
        "booksources": "د کتاب سرچينې",
index 3a561ad..7b89801 100644 (file)
        "viewsource": "Vide 'u sorgende",
        "viewsource-title": "Vide 'a sorgende pe $1",
        "actionthrottled": "Azione inderrotte",
-       "actionthrottledtext": "Cumme 'na mesure andi-spam, tu è state limitete da fà st'azione troppe vote jndr'à 'nu timbe piccinne e tu è subranete stu limite.\nPe piacere prueve cchiù tarde.",
+       "actionthrottledtext": "Cumme 'na mesure andi-abbuse, tu è state limitate da fà st'azione troppe vote jndr'à 'nu tiembe curte e tu è subranate stu limite.\nPe piacere pruéve cchiù tarde.",
        "protectedpagetext": "Sta pàgene ha state prutette pe no fa fà cangiaminde o otre aziune a uecchje.",
        "viewsourcetext": "Tu puè 'ndrucà e cupià 'a sorgente de sta pàgene.",
        "viewyourtext": "Tu puè 'ndrucà e copià 'a sorgende de <strong>le cangiaminde tune</strong> a sta pàgene.",
        "passwordreset-emailtext-ip": "Quacchedune (pò essere tu, da 'u 'ndirizze IP $1) ha richieste 'na mail pe arrecurdarse de le dettaglie d'u cunde sue pe {{SITENAME}} ($4). {{PLURAL:$3|'U cunde utende seguende jè|le cunde utinde seguende sonde}} associate cu st'indirizze e-mail:\n\n$2\n\n{{PLURAL:$3|Sta passuord temboranèe scade|Ste passuord temboranèe scadene}} 'mbrà {{PLURAL:$5|'nu sciurne|$5 sciurne}}.\nTu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta richieste, o ce tu t'è arrecurdate 'a passuord origgenale toje, e non g'a vuè ccu cange cchiù, tu puè ignorà stu messagge e condinuà ausanne 'a passuord vecchie.",
        "passwordreset-emailtext-user": "L'utende $1 sus a {{SITENAME}} ave richieste 'na mail pe arrecurdarse le dettaglie d'u cunde sue pe {{SITENAME}}\n($4). {{PLURAL:$3|'U cunde utende seguende jè|le cunde utinde seguende sonde}} associate cu st'indirizze e-mail:\n\n$2\n\n{{PLURAL:$3|Sta passuord temboranèe scade|Ste passuord temboranèe scadene}}  'mbrà {{PLURAL:$5|'nu sciurne|$5 sciurne}}.\nTu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta richieste, o ce tu t'è arrecurdate 'a passuord origgenale toje, e non g'a vuè ccu cange cchiù, tu puè ignorà stu messagge e condinuà ausanne 'a passuord vecchie.",
        "passwordreset-emailelement": "Nome utende: \n$1\n\nPassuord temboranèe: \n$2",
-       "passwordreset-emailsent": "'N'e-mail pe arrecurdarte ha state mannate.",
+       "passwordreset-emailsent": "Ce quiste jè 'n'e-mail pu cunde tune, allore 'na password azzerate ha state mannate addà.",
        "passwordreset-emailsent-capture": "'Na e-mail pe azzeramende d'a passuord ha state mannate, ca jè fatte vedè aqquà sotte.",
        "passwordreset-emailerror-capture": "'Na e-mail de azzeramende d'a passuord ha state generate, ca jè fatte vedè aqquà sotte, ma 'u 'nvie a {{GENDER:$2|l'utende}} ha fallite: $1",
        "changeemail": "Cange 'u 'ndirizze e-mail",
index 4b79cdd..0afec04 100644 (file)
        "recentchanges-page-added-to-category-bundled": "[[:$1]] и {{PLURAL:$2|одна страница|$2 страниц}} добавлены в категорию",
        "recentchanges-page-removed-from-category": "[[:$1]] убрана из категории",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] и {{PLURAL:$2|одна страница|$2 страниц}} убраны из категории",
+       "autochange-username": "Автоматическое изменение MediaWiki",
        "upload": "Загрузить файл",
        "uploadbtn": "Загрузить файл",
        "reuploaddesc": "Вернуться к форме загрузки",
        "cant-move-to-user-page": "У вас нет прав переименовывать страницу в страницу участника (можно переименовать в подстраницу).",
        "cant-move-category-page": "У вас нет разрешения переименовывать страницы категорий.",
        "cant-move-to-category-page": "У вас нет разрешения переименовывать страницы в страницу категории.",
-       "newtitle": "Новое название",
+       "newtitle": "Новое название:",
        "move-watch": "Включить эту страницу в список наблюдения",
        "movepagebtn": "Переименовать страницу",
        "pagemovedsub": "Страница переименована",
index 28213c9..85e43d7 100644 (file)
        "viewsource": "Izvorno besedilo",
        "viewsource-title": "Ogled vira $1",
        "actionthrottled": "Dejanje zaustavljeno",
-       "actionthrottledtext": "Kot ukrep proti smetju, je število izvajanj tega dejanja v časovnem obdobju omejeno, in vi ste ta limit presegli.\nProsimo, poskusite znova čez nekaj minut.",
+       "actionthrottledtext": "Kot ukrep proti zlorabam je število izvajanj tega dejanja v časovnem obdobju omejeno, in vi ste ta limit presegli.\nProsimo, poskusite znova čez nekaj minut.",
        "protectedpagetext": "Ta stran je bila zaklenjena za preprečitev urejanja ali drugih dejanj.",
        "viewsourcetext": "Vsebino te strani si lahko ogledate in kopirate.",
        "viewyourtext": "Lahko si ogledate in kopirate vsebino <strong>vaših urejanj</strong> te strani.",
index 48b6984..0868cae 100644 (file)
        "nocookiesfornew": "该用户账户未被创建,我们不能确认它的来源。请确保你已启用Cookie,刷新本页后再试。",
        "noname": "你没有指定有效的用户名。",
        "loginsuccesstitle": "登录成功",
-       "loginsuccess": "'''“$1”,欢迎登录{{SITENAME}}。'''",
+       "loginsuccess": "<strong>您现在已经以\"$1\"的身份登录了{{SITENAME}}。</strong>",
        "nosuchuser": "没有名为“$1”的用户。用户名区分大小写。请检查你的拼写或[[Special:UserLogin/signup|创建新账户]]。",
        "nosuchusershort": "没有名为“$1”的用户。请检查你的拼写。",
        "nouserspecified": "你必须指定用户名。",
        "undo-summary": "撤销[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])的版本$1",
        "undo-summary-username-hidden": "取消由一匿名用户所作的版本$1",
        "cantcreateaccounttitle": "无法创建账户",
-       "cantcreateaccount-text": "从该IP地址('''$1''')创建账户已被[[User:$3|$3]]禁止。\n\n$3的理由是''$2''",
+       "cantcreateaccount-text": "从该IP地址(<strong>$1</strong>)创建账户已被[[User:$3|$3]]禁止。\n\n$3的理由是<em>$2</em>",
        "cantcreateaccount-range-text": "从该IP地址段'''$1'''的账户创建已被[[User:$3|$3]]禁止,而这也包括了您的IP地址('''$4''')。\n\n$3给出的原因是 $2。",
        "viewpagelogs": "查看该页面的日志",
        "nohistory": "本页面没有编辑历史记录。",
        "shared-repo-from": "来自$1",
        "shared-repo": "一个共享文件库",
        "shared-repo-name-wikimediacommons": "维基共享资源",
-       "filepage.css": "/* 放置于此的CSS会包含在文件描述页上,并包含在其他客户端wiki上 */",
+       "filepage.css": "/* 这里放置的CSS会包含在文件描述页上,并包含在其他客户端wiki上 */",
        "upload-disallowed-here": "您不可以覆盖此文件。",
        "filerevert": "恢复$1",
        "filerevert-legend": "恢复文件",
        "tooltip-summary": "请输入简短的摘要",
        "interlanguage-link-title": "$1 – $2",
        "interlanguage-link-title-nonlang": "$1——$2",
-       "common.css": "/* 放置于这里的CSS将应用于所有皮肤 */",
-       "print.css": "/* 放置于这里的CSS将影响打印输出 */",
-       "noscript.css": "/* 放置于这里的CSS将影响停用JavaScript的用户 */",
+       "common.css": "/* 这里放置的CSS将应用于所有皮肤 */",
+       "print.css": "/* 这里放置的CSS将影响打印输出 */",
+       "noscript.css": "/* 这里放置的CSS将影响停用JavaScript的用户 */",
        "group-autoconfirmed.css": "/* 这里放置的CSS将只影响自动确认用户 */",
        "group-user.css": "/* 这里放置的CSS将只影响注册用户 */",
        "group-bot.css": "/* 这里放置的CSS将只影响机器人 */",
index 4450c6c..3a2138e 100644 (file)
        "nocookiesfornew": "這個使用者的帳號未建立,我們不能確認它的來源。\n請確認您已開啟 Cookie,重新載入後再試。",
        "noname": "您輸入的使用者名稱無效。",
        "loginsuccesstitle": "登入成功",
-       "loginsuccess": "<strong>{{GENDER:|你|妳|你}}正使用 \"$1\" 的身份登入 {{SITENAME}}。</strong>",
+       "loginsuccess": "<strong>{{GENDER:|您|妳|你}}現在已經以 \"$1\" 的身分登入了 {{SITENAME}}。</strong>",
        "nosuchuser": "查無使用者 \"$1\"。\n使用者名稱有大小寫區分,\n請檢查您拼寫是否正確,或者 [[Special:UserLogin/signup|建立新帳號]]。",
        "nosuchusershort": "查無使用者 \"$1\",\n請檢查您拼寫是否正確。",
        "nouserspecified": "您必須指定一個使用者名稱。",
        "undo-summary": "取消由 [[Special:Contributions/$2|$2]] ([[User talk:$2|對話]]) 所作出的修訂 $1",
        "undo-summary-username-hidden": "還原隱藏使用者的修訂 $1",
        "cantcreateaccounttitle": "無法建立帳號",
-       "cantcreateaccount-text": "來自這個 IP 位址 (<strong>$1</strong>) 建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n $3 封鎖的原因是 <em>$2</em>",
+       "cantcreateaccount-text": "自這個 IP 位址(<strong>$1</strong>)建立帳號已經被 [[User:$3|$3]] 封鎖。\n\n$3 封鎖的原因是 <em>$2</em>",
        "cantcreateaccount-range-text": "來自 IP 位址範圍 '''$1''',包含您的 IP 位址 ('''$4''') 所建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n$3 封鎖的原因是 ''$2''",
        "viewpagelogs": "檢視此頁面的日誌",
        "nohistory": "此頁沒有任何的修訂記錄。",
        "upload-form-label-infoform-description": "描述",
        "upload-form-label-usage-title": "用法",
        "upload-form-label-usage-filename": "檔案名稱",
+       "foreign-structured-upload-form-label-infoform-categories": "分類",
        "backend-fail-stream": "無法傳輸檔案 \"$1\"。",
        "backend-fail-backup": "無法備份檔案 \"$1\"。",
        "backend-fail-notexists": "檔案 $1 不存在。",
        "ipb-blocklist": "檢視目前的封鎖",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}} 的貢獻",
        "unblockip": "解除封鎖使用者",
-       "unblockiptext": "填寫以下單據以取消先前封鎖的 IP 位址或使用者名稱。",
-       "ipusubmit": "移除這個封鎖",
+       "unblockiptext": "使用以下表單以還原之前被封鎖的 IP 位址或使用者名稱的寫入存取。",
+       "ipusubmit": "移除封鎖",
        "unblocked": "[[User:$1|$1]] 的封鎖已經解除。",
        "unblocked-range": "已解除封鎖 $1。",
        "unblocked-id": "已經移除 $1 的封鎖。",
        "import-interwiki-text": "請選擇一個 Wiki 與頁面標題以進行匯入。\n會同時記錄修訂日期和編輯者的名稱。\n所有的從跨 Wiki 匯入操作都會被記錄在 [[Special:Log/import|匯入日誌]]。",
        "import-interwiki-sourcewiki": "來源 Wiki:",
        "import-interwiki-sourcepage": "來源頁面:",
-       "import-interwiki-history": "複製此頁的所有歷史修訂",
+       "import-interwiki-history": "複製此頁的所有歷史修訂",
        "import-interwiki-templates": "包含所有模板",
        "import-interwiki-submit": "匯入",
        "import-mapping-default": "匯入至預設位置",
        "javascripttest-pagetext-skins": "選擇執行測試的外觀:",
        "javascripttest-qunit-intro": "請參考 mediawiki.org 的 [$1 測試說明文件]。",
        "tooltip-pt-userpage": "您的使用者頁面",
-       "tooltip-pt-anonuserpage": "您正使用以下身份編輯該 IP 位址的使用者頁面 :",
+       "tooltip-pt-anonuserpage": "您正在作為以下身分編輯此 IP 位址的使用者頁面",
        "tooltip-pt-mytalk": "您的對話頁面",
        "tooltip-pt-anontalk": "有關來自此 IP 位址編輯的討論",
        "tooltip-pt-preferences": "您的偏好設定",
        "tooltip-n-help": "尋求協助的地方",
        "tooltip-t-whatlinkshere": "列出所有連結此頁面的頁面",
        "tooltip-t-recentchangeslinked": "此頁面連結到其他頁面的近期變更",
-       "tooltip-feed-rss": "訂閱此頁面的 RSS feed",
-       "tooltip-feed-atom": "訂閱此頁面的 Atom feed",
+       "tooltip-feed-rss": "此頁面的 RSS 摘要",
+       "tooltip-feed-atom": "此頁面的 Atom 摘要",
        "tooltip-t-contributions": "此使用者的貢獻清單",
        "tooltip-t-emailuser": "傳送電子郵件聯絡這位使用者",
        "tooltip-t-info": "更多關於此頁面的資訊",
        "tooltip-save": "儲存您的變更",
        "tooltip-preview": "請在儲存前預覽您的變更!",
        "tooltip-diff": "顯示您對內容所做的變更",
-       "tooltip-compareselectedversions": "檢è¦\96æ­¤é \81兩個已選擇的修訂間的差異",
+       "tooltip-compareselectedversions": "æ\9f¥é\96±æ­¤é \81é\9d¢兩個已選擇的修訂間的差異",
        "tooltip-watch": "加入此頁面至您的監視清單",
        "tooltip-watchlistedit-normal-submit": "移除標題",
        "tooltip-watchlistedit-raw-submit": "更新監視清單",
index 9affe26..afcd589 100644 (file)
@@ -1244,7 +1244,7 @@ return array(
                'dependencies' => array(
                        'mediawiki.ForeignStructuredUpload',
                        'mediawiki.Upload.BookletLayout',
-                       'mediawiki.widgets',
+                       'mediawiki.widgets.CategorySelector',
                        'mediawiki.widgets.DateInputWidget',
                        'mediawiki.jqueryMsg',
                ),
@@ -1974,8 +1974,6 @@ return array(
                        'resources/src/mediawiki.widgets/mw.widgets.ComplexTitleInputWidget.js',
                        'resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js',
                        'resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js',
-                       'resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js',
-                       'resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js',
                ),
                'skinStyles' => array(
                        'default' => array(
@@ -1991,6 +1989,8 @@ return array(
                        'jquery.byteLimit',
                        // TitleOptionWidget
                        'jquery.autoEllipsis',
+                       // FIXME: Kept for bc
+                       'mediawiki.widgets.CategorySelector',
                ),
                'messages' => array(
                        // NamespaceInputWidget
@@ -2034,6 +2034,17 @@ return array(
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'mediawiki.widgets.CategorySelector' => array(
+               'scripts' => array(
+                       'resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js',
+               ),
+               'dependencies' => array(
+                       'oojs-ui',
+                       'mediawiki.api',
+               ),
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
 
        /* es5-shim */
        'es5-shim' => array(
index c9c0455..7dd9ade 100644 (file)
@@ -60,6 +60,9 @@
         * Wrapper around jQuery append that converts all non-objects to TextNode so append will not
         * convert what it detects as an htmlString to an element.
         *
+        * If our own htmlEmitter jQuery object is given, its children will be unwrapped and appended to
+        * new parent.
+        *
         * Object elements of children (jQuery, HTMLElement, TextNode, etc.) will be left as is.
         *
         * @private
@@ -78,6 +81,9 @@
                        if ( typeof children[ i ] !== 'object' ) {
                                children[ i ] = document.createTextNode( children[ i ] );
                        }
+                       if ( children[ i ] instanceof jQuery && children[ i ].hasClass( 'mediaWiki_htmlEmitter' ) ) {
+                               children[ i ] = children[ i ].contents();
+                       }
                }
 
                return $parent.append( children );
                        .replace( /&amp;/g, '&' );
        }
 
+       /**
+        * Turn input into a string.
+        *
+        * @private
+        * @param {string|jQuery} input
+        * @return {string} Textual value of input
+        */
+       function textify( input ) {
+               if ( input instanceof jQuery ) {
+                       input = input.text();
+               }
+               return String( input );
+       }
+
        /**
         * Given parser options, return a function that parses a key and replacements, returning jQuery object
         *
 
                return function () {
                        var $target = this.empty();
-                       // TODO: Simply appendWithoutParsing( $target, failableParserFn( arguments ).contents() )
-                       // or Simply appendWithoutParsing( $target, failableParserFn( arguments ) )
-                       $.each( failableParserFn( arguments ).contents(), function ( i, node ) {
-                               appendWithoutParsing( $target, node );
-                       } );
+                       appendWithoutParsing( $target, failableParserFn( arguments ) );
                        return $target;
                };
        };
                                escapedOrLiteralWithoutSpace, escapedOrLiteralWithoutBar, escapedOrRegularLiteral,
                                whitespace, dollar, digits, htmlDoubleQuoteAttributeValue, htmlSingleQuoteAttributeValue,
                                htmlAttributeEquals, openHtmlStartTag, optionalForwardSlash, openHtmlEndTag, closeHtmlTag,
-                               openExtlink, closeExtlink, wikilinkPage, wikilinkContents, openWikilink, closeWikilink, templateName, pipe, colon,
+                               openExtlink, closeExtlink, wikilinkContents, openWikilink, closeWikilink, templateName, pipe, colon,
                                templateContents, openTemplate, closeTemplate,
                                nonWhitespaceExpression, paramExpression, expression, curlyBraceTransformExpression, result,
                                settings = this.settings,
                                return result === null ? null : result.join( '' );
                        }
 
-                       // Used for wikilink page names.  Like literalWithoutBar, but
-                       // without allowing escapes.
-                       function unescapedLiteralWithoutBar() {
-                               var result = nOrMore( 1, regularLiteralWithoutBar )();
-                               return result === null ? null : result.join( '' );
-                       }
-
                        function literal() {
                                var result = nOrMore( 1, escapedOrRegularLiteral )();
                                return result === null ? null : result.join( '' );
                        closeExtlink = makeStringParser( ']' );
                        // this extlink MUST have inner contents, e.g. [foo] not allowed; [foo bar] [foo <i>bar</i>], etc. are allowed
                        function extlink() {
-                               var result, parsedResult;
+                               var result, parsedResult, target;
                                result = null;
                                parsedResult = sequence( [
                                        openExtlink,
-                                       nonWhitespaceExpression,
+                                       nOrMore( 1, nonWhitespaceExpression ),
                                        whitespace,
                                        nOrMore( 1, expression ),
                                        closeExtlink
                                ] );
                                if ( parsedResult !== null ) {
-                                       result = [ 'EXTLINK', parsedResult[ 1 ] ];
-                                       // TODO (mattflaschen, 2013-03-22): Clean this up if possible.
-                                       // It's avoiding CONCAT for single nodes, so they at least doesn't get the htmlEmitter span.
-                                       if ( parsedResult[ 3 ].length === 1 ) {
-                                               result.push( parsedResult[ 3 ][ 0 ] );
-                                       } else {
-                                               result.push( [ 'CONCAT' ].concat( parsedResult[ 3 ] ) );
-                                       }
+                                       // When the entire link target is a single parameter, we can't use CONCAT, as we allow
+                                       // passing fancy parameters (like a whole jQuery object or a function) to use for the
+                                       // link. Check only if it's a single match, since we can either do CONCAT or not for
+                                       // singles with the same effect.
+                                       target = parsedResult[ 1 ].length === 1 ?
+                                               parsedResult[ 1 ][ 0 ] :
+                                               [ 'CONCAT' ].concat( parsedResult[ 1 ] );
+                                       result = [
+                                               'EXTLINK',
+                                               target,
+                                               [ 'CONCAT' ].concat( parsedResult[ 3 ] )
+                                       ];
                                }
                                return result;
                        }
-                       // this is the same as the above extlink, except that the url is being passed on as a parameter
-                       function extLinkParam() {
-                               var result = sequence( [
-                                       openExtlink,
-                                       dollar,
-                                       digits,
-                                       whitespace,
-                                       expression,
-                                       closeExtlink
-                               ] );
-                               if ( result === null ) {
-                                       return null;
-                               }
-                               return [ 'EXTLINKPARAM', parseInt( result[ 2 ], 10 ) - 1, result[ 4 ] ];
-                       }
                        openWikilink = makeStringParser( '[[' );
                        closeWikilink = makeStringParser( ']]' );
                        pipe = makeStringParser( '|' );
                                return result === null ? null : result[ 1 ];
                        }
 
-                       wikilinkPage = choice( [
-                               unescapedLiteralWithoutBar,
-                               template
-                       ] );
-
                        function pipedWikilink() {
                                var result = sequence( [
-                                       wikilinkPage,
+                                       nOrMore( 1, paramExpression ),
                                        pipe,
                                        nOrMore( 1, expression )
                                ] );
-                               return result === null ? null : [ result[ 0 ], [ 'CONCAT' ].concat( result[ 2 ] ) ];
+                               return result === null ? null : [
+                                       [ 'CONCAT' ].concat( result[ 0 ] ),
+                                       [ 'CONCAT' ].concat( result[ 2 ] )
+                               ];
+                       }
+
+                       function unpipedWikilink() {
+                               var result = sequence( [
+                                       nOrMore( 1, paramExpression )
+                               ] );
+                               return result === null ? null : [
+                                       [ 'CONCAT' ].concat( result[ 0 ] )
+                               ];
                        }
 
                        wikilinkContents = choice( [
                                pipedWikilink,
-                               wikilinkPage // unpiped link
+                               unpipedWikilink
                        ] );
 
                        function wikilink() {
                        nonWhitespaceExpression = choice( [
                                template,
                                wikilink,
-                               extLinkParam,
                                extlink,
                                replacement,
                                literalWithoutSpace
                        paramExpression = choice( [
                                template,
                                wikilink,
-                               extLinkParam,
                                extlink,
                                replacement,
                                literalWithoutBar
                        expression = choice( [
                                template,
                                wikilink,
-                               extLinkParam,
                                extlink,
                                replacement,
                                html,
                concat: function ( nodes ) {
                        var $span = $( '<span>' ).addClass( 'mediaWiki_htmlEmitter' );
                        $.each( nodes, function ( i, node ) {
-                               if ( node instanceof jQuery && node.hasClass( 'mediaWiki_htmlEmitter' ) ) {
-                                       $.each( node.contents(), function ( j, childNode ) {
-                                               appendWithoutParsing( $span, childNode );
-                                       } );
-                               } else {
-                                       // Let jQuery append nodes, arrays of nodes and jQuery objects
-                                       // other things (strings, numbers, ..) are appended as text nodes (not as HTML strings)
-                                       appendWithoutParsing( $span, node );
-                               }
+                               // Let jQuery append nodes, arrays of nodes and jQuery objects
+                               // other things (strings, numbers, ..) are appended as text nodes (not as HTML strings)
+                               appendWithoutParsing( $span, node );
                        } );
                        return $span;
                },
                 * @param {string[]} nodes
                 */
                wikilink: function ( nodes ) {
-                       var page, anchor, url;
+                       var page, anchor, url, $el;
 
-                       page = nodes[ 0 ];
+                       page = textify( nodes[ 0 ] );
                        url = mw.util.getUrl( page );
 
                        if ( nodes.length === 1 ) {
                                anchor = nodes[ 1 ];
                        }
 
-                       return $( '<a>' ).attr( {
+                       $el = $( '<a>' ).attr( {
                                title: page,
                                href: url
-                       } )
-                               // FIXME This means that you can't have anything with formatting inside a wikilink.
-                               .text( anchor.jquery ? anchor.text() : anchor );
+                       } );
+                       return appendWithoutParsing( $el, anchor );
                },
 
                /**
                },
 
                /**
-                * Transform parsed structure into external link
-                * If the href is a jQuery object, treat it as "enclosing" the link text.
+                * Transform parsed structure into external link.
                 *
-                * - ... function, treat it as the click handler.
-                * - ... string, treat it as a URI.
+                * The "href" can be:
+                * - a jQuery object, treat it as "enclosing" the link text.
+                * - a function, treat it as the click handler.
+                * - a string, or our htmlEmitter jQuery object, treat it as a URI after stringifying.
                 *
                 * TODO: throw an error if nodes.length > 2 ?
                 *
                        var $el,
                                arg = nodes[ 0 ],
                                contents = nodes[ 1 ];
-                       if ( arg instanceof jQuery ) {
+                       if ( arg instanceof jQuery && !arg.hasClass( 'mediaWiki_htmlEmitter' ) ) {
                                $el = arg;
                        } else {
                                $el = $( '<a>' );
                                        } )
                                        .click( arg );
                                } else {
-                                       $el.attr( 'href', arg.toString() );
+                                       $el.attr( 'href', textify( arg ) );
                                }
                        }
                        return appendWithoutParsing( $el, contents );
                },
 
-               /**
-                * This is basically use a combination of replace + external link (link with parameter
-                * as url), but we don't want to run the regular replace here-on: inserting a
-                * url as href-attribute of a link will automatically escape it already, so
-                * we don't want replace to (manually) escape it as well.
-                *
-                * TODO: throw error if nodes.length > 1 ?
-                *
-                * @param {Array} nodes List of one element, integer, n >= 0
-                * @param {Array} replacements List of at least n strings
-                * @return {string} replacement
-                */
-               extlinkparam: function ( nodes, replacements ) {
-                       var replacement,
-                               index = parseInt( nodes[ 0 ], 10 );
-                       if ( index < replacements.length ) {
-                               replacement = replacements[ index ];
-                       } else {
-                               replacement = '$' + ( index + 1 );
-                       }
-                       return this.extlink( [ replacement, nodes[ 1 ] ] );
-               },
-
                /**
                 * Transform parsed structure into pluralization
                 * n.b. The first node may be a non-integer (for instance, a string representing an Arabic number).
                        for ( formIndex = 0; formIndex < forms.length; formIndex++ ) {
                                form = forms[ formIndex ];
 
-                               if ( form.jquery && form.hasClass( 'mediaWiki_htmlEmitter' ) ) {
+                               if ( form instanceof jQuery && form.hasClass( 'mediaWiki_htmlEmitter' ) ) {
                                        // This is a nested node, may be an explicit plural form like 5=[$2 linktext]
                                        firstChild = form.contents().get( 0 );
                                        if ( firstChild && firstChild.nodeType === Node.TEXT_NODE ) {
                // Caching is somewhat problematic, because we do need different message functions for different maps, so
                // we'd have to cache the parser as a member of this.map, which sounds a bit ugly.
                // Do not use mw.jqueryMsg unless required
-               if ( this.format === 'plain' || !/\{\{|[\[<>]/.test( this.map.get( this.key ) ) ) {
+               if ( this.format === 'plain' || !/\{\{|[\[<>&]/.test( this.map.get( this.key ) ) ) {
                        // Fall back to mw.msg's simple parser
                        return oldParser.apply( this );
                }
index c5944d1..4b06e83 100644 (file)
@@ -57,12 +57,12 @@ class TestSample extends MediaWikiLangTestCase {
                );
        }
 
+       // @codingStandardsIgnoreStart Generic.Files.LineLength
        /**
         * @dataProvider provideTitles
-        * @codingStandardsIgnoreStart Ignore long line warning
         * See http://phpunit.de/manual/3.7/en/appendixes.annotations.html#appendixes.annotations.dataProvider
-        * @codingStandardsIgnoreEnd
         */
+       // @codingStandardsIgnoreEnd
        public function testCreateBasicListOfTitles( $titleName, $ns, $text ) {
                $title = Title::newFromText( $titleName, $ns );
                $this->assertEquals( $text, "$title", "see if '$titleName' matches '$text'" );
@@ -95,7 +95,7 @@ class TestSample extends MediaWikiLangTestCase {
                $this->assertTrue( $title->isLocal() );
        }
 
-       // @codingStandardsIgnoreStart Ignore long line warning
+       // @codingStandardsIgnoreStart Generic.Files.LineLength
        /**
         * @expectedException InvalidArgumentException
         * See http://phpunit.de/manual/3.7/en/appendixes.annotations.html#appendixes.annotations.expectedException
index 42ea58e..8c09471 100644 (file)
@@ -79,6 +79,10 @@ class FakeDatabaseMysqlBase extends DatabaseMysqlBase {
        protected function mysqlPing() {
        }
 
+       protected function mysqlRealEscapeString( $s ) {
+
+       }
+
        // From interface DatabaseType
        function insertId() {
        }
index 9307b0c..0db7af9 100644 (file)
@@ -482,4 +482,12 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 
                $this->assertTrue( $db->close(), "closing database" );
        }
+
+       public function testToString() {
+               $db = DatabaseSqlite::newStandaloneInstance( ':memory:' );
+
+               $toString = (string)$db;
+
+               $this->assertContains( 'SQLite ', $toString );
+       }
 }
index f287caa..7e488ee 100644 (file)
                process( tasks, QUnit.start );
        } );
 
-       QUnit.test( 'Links', 7, function ( assert ) {
-               var expectedDisambiguationsText,
+       QUnit.test( 'Links', 11, function ( assert ) {
+               var testCases,
+                       expectedDisambiguationsText,
                        expectedMultipleBars,
                        expectedSpecialCharacters;
 
                        expectedListUsersSitename,
                        'Piped wikilink with parser function in the text'
                );
+
+               testCases = [
+                       [
+                               'extlink-html-full',
+                               'asd [http://example.org <strong>Example</strong>] asd',
+                               'asd <a href="http://example.org"><strong>Example</strong></a> asd'
+                       ],
+                       [
+                               'extlink-html-partial',
+                               'asd [http://example.org foo <strong>Example</strong> bar] asd',
+                               'asd <a href="http://example.org">foo <strong>Example</strong> bar</a> asd'
+                       ],
+                       [
+                               'wikilink-html-full',
+                               'asd [[Example|<strong>Example</strong>]] asd',
+                               'asd <a title="Example" href="/wiki/Example"><strong>Example</strong></a> asd'
+                       ],
+                       [
+                               'wikilink-html-partial',
+                               'asd [[Example|foo <strong>Example</strong> bar]] asd',
+                               'asd <a title="Example" href="/wiki/Example">foo <strong>Example</strong> bar</a> asd'
+                       ]
+               ];
+
+               $.each( testCases, function () {
+                       var
+                               key = this[ 0 ],
+                               input = this[ 1 ],
+                               output = this[ 2 ];
+                       mw.messages.set( key, input );
+                       assert.htmlEqual(
+                               formatParse( key ),
+                               output,
+                               'HTML in links: ' + key
+                       );
+               } );
+       } );
+
+       QUnit.test( 'Replacements in links', 14, function ( assert ) {
+               var testCases = [
+                       [
+                               'extlink-param-href-full',
+                               'asd [$1 Example] asd',
+                               'asd <a href="http://example.com">Example</a> asd'
+                       ],
+                       [
+                               'extlink-param-href-partial',
+                               'asd [$1/example Example] asd',
+                               'asd <a href="http://example.com/example">Example</a> asd'
+                       ],
+                       [
+                               'extlink-param-text-full',
+                               'asd [http://example.org $2] asd',
+                               'asd <a href="http://example.org">Text</a> asd'
+                       ],
+                       [
+                               'extlink-param-text-partial',
+                               'asd [http://example.org Example $2] asd',
+                               'asd <a href="http://example.org">Example Text</a> asd'
+                       ],
+                       [
+                               'extlink-param-both-full',
+                               'asd [$1 $2] asd',
+                               'asd <a href="http://example.com">Text</a> asd'
+                       ],
+                       [
+                               'extlink-param-both-partial',
+                               'asd [$1/example Example $2] asd',
+                               'asd <a href="http://example.com/example">Example Text</a> asd'
+                       ],
+                       [
+                               'wikilink-param-href-full',
+                               'asd [[$1|Example]] asd',
+                               'asd <a title="Example" href="/wiki/Example">Example</a> asd'
+                       ],
+                       [
+                               'wikilink-param-href-partial',
+                               'asd [[$1/Test|Example]] asd',
+                               'asd <a title="Example/Test" href="/wiki/Example/Test">Example</a> asd'
+                       ],
+                       [
+                               'wikilink-param-text-full',
+                               'asd [[Example|$2]] asd',
+                               'asd <a title="Example" href="/wiki/Example">Text</a> asd'
+                       ],
+                       [
+                               'wikilink-param-text-partial',
+                               'asd [[Example|Example $2]] asd',
+                               'asd <a title="Example" href="/wiki/Example">Example Text</a> asd'
+                       ],
+                       [
+                               'wikilink-param-both-full',
+                               'asd [[$1|$2]] asd',
+                               'asd <a title="Example" href="/wiki/Example">Text</a> asd'
+                       ],
+                       [
+                               'wikilink-param-both-partial',
+                               'asd [[$1/Test|Example $2]] asd',
+                               'asd <a title="Example/Test" href="/wiki/Example/Test">Example Text</a> asd'
+                       ],
+                       [
+                               'wikilink-param-unpiped-full',
+                               'asd [[$1]] asd',
+                               'asd <a title="Example" href="/wiki/Example">Example</a> asd'
+                       ],
+                       [
+                               'wikilink-param-unpiped-partial',
+                               'asd [[$1/Test]] asd',
+                               'asd <a title="Example/Test" href="/wiki/Example/Test">Example/Test</a> asd'
+                       ]
+               ];
+
+               $.each( testCases, function () {
+                       var
+                               key = this[ 0 ],
+                               input = this[ 1 ],
+                               output = this[ 2 ],
+                               paramHref = key.slice( 0, 8 ) === 'wikilink' ? 'Example' : 'http://example.com',
+                               paramText = 'Text';
+                       mw.messages.set( key, input );
+                       assert.htmlEqual(
+                               formatParse( key, paramHref, paramText ),
+                               output,
+                               'Replacements in links: ' + key
+                       );
+               } );
        } );
 
        // Tests that {{-transformation vs. general parsing are done as requested
        } );
 
        // HTML in wikitext
-       QUnit.test( 'HTML', 26, function ( assert ) {
+       QUnit.test( 'HTML', 32, function ( assert ) {
                mw.messages.set( 'jquerymsg-italics-msg', '<i>Very</i> important' );
 
                assertBothModes( assert, [ 'jquerymsg-italics-msg' ], mw.messages.get( 'jquerymsg-italics-msg' ), 'Simple italics unchanged' );
                        'Mismatched HTML start and end tag treated as text'
                );
 
-               // TODO (mattflaschen, 2013-03-18): It's not a security issue, but there's no real
-               // reason the htmlEmitter span needs to be here. It's an artifact of how emitting works.
                mw.messages.set( 'jquerymsg-script-and-external-link', '<script>alert( "jquerymsg-script-and-external-link test" );</script> [http://example.com <i>Foo</i> bar]' );
                assert.htmlEqual(
                        formatParse( 'jquerymsg-script-and-external-link' ),
-                       '&lt;script&gt;alert( "jquerymsg-script-and-external-link test" );&lt;/script&gt; <a href="http://example.com"><span class="mediaWiki_htmlEmitter"><i>Foo</i> bar</span></a>',
+                       '&lt;script&gt;alert( "jquerymsg-script-and-external-link test" );&lt;/script&gt; <a href="http://example.com"><i>Foo</i> bar</a>',
                        'HTML tags in external links not interfering with escaping of other tags'
                );
 
                mw.messages.set( 'jquerymsg-link-script', '[http://example.com <script>alert( "jquerymsg-link-script test" );</script>]' );
                assert.htmlEqual(
                        formatParse( 'jquerymsg-link-script' ),
-                       '<a href="http://example.com"><span class="mediaWiki_htmlEmitter">&lt;script&gt;alert( "jquerymsg-link-script test" );&lt;/script&gt;</span></a>',
+                       '<a href="http://example.com">&lt;script&gt;alert( "jquerymsg-link-script test" );&lt;/script&gt;</a>',
                        'Non-whitelisted HTML tag in external link anchor treated as text'
                );
 
                mw.messages.set( 'jquerymsg-wikitext-contents-script', '<i><script>Script inside</script></i>' );
                assert.htmlEqual(
                        formatParse( 'jquerymsg-wikitext-contents-script' ),
-                       '<i><span class="mediaWiki_htmlEmitter">&lt;script&gt;Script inside&lt;/script&gt;</span></i>',
+                       '<i>&lt;script&gt;Script inside&lt;/script&gt;</i>',
                        'Contents of valid tag are treated as wikitext, so invalid HTML element is treated as text'
                );
 
                        'Foo&lt;tag/&gt;bar',
                        'Self-closing tags don\'t cause a parse error'
                );
+
+               mw.messages.set( 'jquerymsg-entities1', 'A&B' );
+               mw.messages.set( 'jquerymsg-entities2', 'A&gt;B' );
+               mw.messages.set( 'jquerymsg-entities3', 'A&rarr;B' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities1' ),
+                       'A&amp;B',
+                       'Lone "&" is escaped in text'
+               );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities2' ),
+                       'A&amp;gt;B',
+                       '"&gt;" entity is double-escaped in text' // (WHY?)
+               );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities3' ),
+                       'A&amp;rarr;B',
+                       '"&rarr;" entity is double-escaped in text'
+               );
+
+               mw.messages.set( 'jquerymsg-entities-attr1', '<i title="A&B"></i>' );
+               mw.messages.set( 'jquerymsg-entities-attr2', '<i title="A&gt;B"></i>' );
+               mw.messages.set( 'jquerymsg-entities-attr3', '<i title="A&rarr;B"></i>' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities-attr1' ),
+                       '<i title="A&amp;B"></i>',
+                       'Lone "&" is escaped in attribute'
+               );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities-attr2' ),
+                       '<i title="A&gt;B"></i>',
+                       '"&gt;" entity is not double-escaped in attribute' // (WHY?)
+               );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities-attr3' ),
+                       '<i title="A&amp;rarr;B"></i>',
+                       '"&rarr;" entity is double-escaped in attribute'
+               );
        } );
 
        QUnit.test( 'Behavior in case of invalid wikitext', 3, function ( assert ) {