Merge "Test ApiQuerySiteinfo"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 2 Aug 2018 02:44:38 +0000 (02:44 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 2 Aug 2018 02:44:38 +0000 (02:44 +0000)
124 files changed:
.travis.yml
RELEASE-NOTES-1.32
includes/FileDeleteForm.php
includes/MagicWordArray.php
includes/MagicWordFactory.php
includes/OutputPage.php
includes/Pingback.php
includes/Title.php
includes/actions/InfoAction.php
includes/api/ApiQuerySiteinfo.php
includes/api/i18n/ar.json
includes/api/i18n/de.json
includes/api/i18n/es.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/it.json
includes/api/i18n/nb.json
includes/api/i18n/pt-br.json
includes/api/i18n/pt.json
includes/api/i18n/ru.json
includes/api/i18n/uk.json
includes/api/i18n/zh-hans.json
includes/content/WikitextContent.php
includes/content/WikitextContentHandler.php
includes/jobqueue/jobs/DoubleRedirectJob.php
includes/libs/rdbms/database/DatabaseSqlite.php
includes/logging/LogEventsList.php
includes/pager/ReverseChronologicalPager.php
includes/parser/CoreParserFunctions.php
includes/parser/Parser.php
includes/services/ServiceContainer.php
includes/specials/SpecialNewpages.php
languages/i18n/az.json
languages/i18n/be-tarask.json
languages/i18n/bn.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/en.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fr.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hyw.json
languages/i18n/inh.json
languages/i18n/ka.json
languages/i18n/kw.json
languages/i18n/mk.json
languages/i18n/nan.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nl.json
languages/i18n/pl.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/ru.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sw.json
languages/i18n/te.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/zgh.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesUr.php
resources/Resources.php
resources/lib/jquery.i18n/CODE_OF_CONDUCT.md [new file with mode: 0644]
resources/lib/jquery.i18n/CREDITS
resources/lib/jquery.i18n/README.md
resources/lib/jquery.i18n/package.json [deleted file]
resources/lib/jquery.i18n/src/jquery.i18n.emitter.bidi.js
resources/lib/jquery.i18n/src/jquery.i18n.emitter.js
resources/lib/jquery.i18n/src/jquery.i18n.fallbacks.js
resources/lib/jquery.i18n/src/jquery.i18n.js
resources/lib/jquery.i18n/src/jquery.i18n.language.js
resources/lib/jquery.i18n/src/jquery.i18n.messagestore.js
resources/lib/jquery.i18n/src/jquery.i18n.parser.js
resources/lib/jquery.i18n/src/languages/bs.js
resources/lib/jquery.i18n/src/languages/dsb.js
resources/lib/jquery.i18n/src/languages/fi.js
resources/lib/jquery.i18n/src/languages/ga.js
resources/lib/jquery.i18n/src/languages/he.js
resources/lib/jquery.i18n/src/languages/hsb.js
resources/lib/jquery.i18n/src/languages/hu.js
resources/lib/jquery.i18n/src/languages/hy.js
resources/lib/jquery.i18n/src/languages/la.js
resources/lib/jquery.i18n/src/languages/ml.js
resources/lib/jquery.i18n/src/languages/os.js
resources/lib/jquery.i18n/src/languages/ru.js
resources/lib/jquery.i18n/src/languages/sl.js
resources/lib/jquery.i18n/src/languages/uk.js
resources/src/mediawiki.action/mediawiki.action.delete.file.js
resources/src/mediawiki.htmlform.ooui.styles.less
resources/src/mediawiki.special/newpages.less
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/PrefixSearchTest.php
tests/phpunit/includes/Storage/NameTableStoreTest.php
tests/phpunit/includes/Storage/RevisionStoreDbTestBase.php
tests/phpunit/includes/Storage/SqlBlobStoreTest.php
tests/phpunit/includes/api/ApiBaseTest.php
tests/phpunit/includes/api/query/ApiQueryUserContribsTest.php
tests/phpunit/includes/changetags/ChangeTagsTest.php
tests/phpunit/includes/content/JavaScriptContentTest.php
tests/phpunit/includes/content/WikitextContentTest.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/page/PageArchiveTestBase.php
tests/phpunit/includes/page/WikiPageDbTestBase.php
tests/phpunit/includes/services/ServiceContainerTest.php
tests/phpunit/includes/specials/SpecialPageExecutor.php
tests/phpunit/includes/user/UserTest.php
tests/phpunit/maintenance/deleteAutoPatrolLogsTest.php
tests/phpunit/tests/MediaWikiTestCaseSchema1Test.php
tests/phpunit/tests/MediaWikiTestCaseSchema2Test.php
tests/selenium/specs/user.js

index 2fc6d64..ad35b76 100644 (file)
@@ -39,7 +39,6 @@ matrix:
       php: hhvm-3.18
   allow_failures:
     - php: 7.2
-    - env: dbtype=postgres dbuser=travis
     - php: hhvm-3.18
     - php: hhvm-3.21
     - php: hhvm-3.24
index baa520c..006476f 100644 (file)
@@ -79,6 +79,7 @@ production.
 * Updated wikimedia/wrappedstring from 2.3.0 to 3.0.1.
 * Updated mediawiki/mediawiki-codesniffer from v20.0.0 to v21.0.0.
 * Updated composer/spdx-licenses from 1.3.0 to 1.4.0.
+* Updated jquery.i18n from 1.0.4 to 1.0.5.
 
 ==== New external libraries ====
 * Added wikimedia/xmp-reader 0.5.1
@@ -231,6 +232,9 @@ because of Phabricator reports.
   * getItemsData: Use getItems instead and get the data property
 * Two OutputPage methods, addMetadataLink() and getMetadataAttribute(), were
   removed.  Use addLink() instead.
+* Another two OutputPage methods, setPageTitleActionText() and
+  getPageTitleActionText(), were removed.  They did nothing since 1.15 (almost
+  ten years).  Use setHTMLTitle() directly.
 * All MagicWord static member variables have been removed.  Use appropriate
   hooks or MagicWordFactory methods instead.
 * MagicWord::clearCache() has been removed.  Instead, create a new
index ce75037..c362ec0 100644 (file)
@@ -79,7 +79,7 @@ class FileDeleteForm {
                $this->oldimage = $wgRequest->getText( 'oldimage', false );
                $token = $wgRequest->getText( 'wpEditToken' );
                # Flag to hide all contents of the archived revisions
-               $suppress = $wgRequest->getVal( 'wpSuppress' ) && $wgUser->isAllowed( 'suppressrevision' );
+               $suppress = $wgRequest->getCheck( 'wpSuppress' ) && $wgUser->isAllowed( 'suppressrevision' );
 
                if ( $this->oldimage ) {
                        $this->oldfile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName(
@@ -249,101 +249,140 @@ class FileDeleteForm {
                $conf = RequestContext::getMain()->getConfig();
                $oldCommentSchema = $conf->get( 'CommentTableSchemaMigrationStage' ) === MIGRATION_OLD;
 
-               if ( $wgUser->isAllowed( 'suppressrevision' ) ) {
-                       $suppress = "<tr id=\"wpDeleteSuppressRow\">
-                                       <td></td>
-                                       <td class='mw-input'><strong>" .
-                                               Xml::checkLabel( wfMessage( 'revdelete-suppress' )->text(),
-                                                       'wpSuppress', 'wpSuppress', false, [ 'tabindex' => '3' ] ) .
-                                       "</strong></td>
-                               </tr>";
-               } else {
-                       $suppress = '';
-               }
-
                $wgOut->addModules( 'mediawiki.action.delete.file' );
 
                $checkWatch = $wgUser->getBoolOption( 'watchdeletion' ) || $wgUser->isWatched( $this->title );
-               $form = Xml::openElement( 'form', [ 'method' => 'post', 'action' => $this->getAction(),
-                       'id' => 'mw-img-deleteconfirm' ] ) .
-                       Xml::openElement( 'fieldset' ) .
-                       Xml::element( 'legend', null, wfMessage( 'filedelete-legend' )->text() ) .
-                       Html::hidden( 'wpEditToken', $wgUser->getEditToken( $this->oldimage ) ) .
-                       $this->prepareMessage( 'filedelete-intro' ) .
-                       Xml::openElement( 'table', [ 'id' => 'mw-img-deleteconfirm-table' ] ) .
-                       "<tr>
-                               <td class='mw-label'>" .
-                                       Xml::label( wfMessage( 'filedelete-comment' )->text(), 'wpDeleteReasonList' ) .
-                               "</td>
-                               <td class='mw-input'>" .
-                                       Xml::listDropDown(
-                                               'wpDeleteReasonList',
-                                               wfMessage( 'filedelete-reason-dropdown' )->inContentLanguage()->text(),
-                                               wfMessage( 'filedelete-reason-otherlist' )->inContentLanguage()->text(),
-                                               '',
-                                               'wpReasonDropDown',
-                                               1
-                                       ) .
-                               "</td>
-                       </tr>
-                       <tr>
-                               <td class='mw-label'>" .
-                                       Xml::label( wfMessage( 'filedelete-otherreason' )->text(), 'wpReason' ) .
-                               "</td>
-                               <td class='mw-input'>" .
-                                       Xml::input( 'wpReason', 60, $wgRequest->getText( 'wpReason' ), [
-                                               'type' => 'text',
-                                               // HTML maxlength uses "UTF-16 code units", which means that characters outside BMP
-                                               // (e.g. emojis) count for two each. This limit is overridden in JS to instead count
-                                               // Unicode codepoints (or 255 UTF-8 bytes for old schema).
-                                               'maxlength' => $oldCommentSchema ? 255 : CommentStore::COMMENT_CHARACTER_LIMIT,
-                                               'tabindex' => '2',
-                                               'id' => 'wpReason'
-                                       ] ) .
-                               "</td>
-                       </tr>
-                       {$suppress}";
+
+               $wgOut->enableOOUI();
+
+               $options = Xml::listDropDownOptions(
+                       $wgOut->msg( 'filedelete-reason-dropdown' )->inContentLanguage()->text(),
+                       [ 'other' => $wgOut->msg( 'filedelete-reason-otherlist' )->inContentLanguage()->text() ]
+               );
+               $options = Xml::listDropDownOptionsOoui( $options );
+
+               $fields[] = new OOUI\LabelWidget( [ 'label' => new OOUI\HtmlSnippet(
+                       $this->prepareMessage( 'filedelete-intro' ) ) ]
+               );
+
+               $fields[] = new OOUI\FieldLayout(
+                       new OOUI\DropdownInputWidget( [
+                               'name' => 'wpDeleteReasonList',
+                               'inputId' => 'wpDeleteReasonList',
+                               'tabIndex' => 1,
+                               'infusable' => true,
+                               'value' => '',
+                               'options' => $options,
+                       ] ),
+                       [
+                               'label' => $wgOut->msg( 'filedelete-comment' )->text(),
+                               'align' => 'top',
+                       ]
+               );
+
+               // HTML maxlength uses "UTF-16 code units", which means that characters outside BMP
+               // (e.g. emojis) count for two each. This limit is overridden in JS to instead count
+               // Unicode codepoints (or 255 UTF-8 bytes for old schema).
+               $fields[] = new OOUI\FieldLayout(
+                       new OOUI\TextInputWidget( [
+                               'name' => 'wpReason',
+                               'inputId' => 'wpReason',
+                               'tabIndex' => 2,
+                               'maxLength' => $oldCommentSchema ? 255 : CommentStore::COMMENT_CHARACTER_LIMIT,
+                               'infusable' => true,
+                               'value' => $wgRequest->getText( 'wpReason' ),
+                               'autofocus' => true,
+                       ] ),
+                       [
+                               'label' => $wgOut->msg( 'filedelete-otherreason' )->text(),
+                               'align' => 'top',
+                       ]
+               );
+
+               if ( $wgUser->isAllowed( 'suppressrevision' ) ) {
+                       $fields[] = new OOUI\FieldLayout(
+                               new OOUI\CheckboxInputWidget( [
+                                       'name' => 'wpSuppress',
+                                       'inputId' => 'wpSuppress',
+                                       'tabIndex' => 3,
+                                       'selected' => false,
+                               ] ),
+                               [
+                                       'label' => $wgOut->msg( 'revdelete-suppress' )->text(),
+                                       'align' => 'inline',
+                                       'infusable' => true,
+                               ]
+                       );
+               }
+
                if ( $wgUser->isLoggedIn() ) {
-                       $form .= "
-                       <tr>
-                               <td></td>
-                               <td class='mw-input'>" .
-                                       Xml::checkLabel( wfMessage( 'watchthis' )->text(),
-                                               'wpWatch', 'wpWatch', $checkWatch, [ 'tabindex' => '3' ] ) .
-                               "</td>
-                       </tr>";
+                       $fields[] = new OOUI\FieldLayout(
+                               new OOUI\CheckboxInputWidget( [
+                                       'name' => 'wpWatch',
+                                       'inputId' => 'wpWatch',
+                                       'tabIndex' => 3,
+                                       'selected' => $checkWatch,
+                               ] ),
+                               [
+                                       'label' => $wgOut->msg( 'watchthis' )->text(),
+                                       'align' => 'inline',
+                                       'infusable' => true,
+                               ]
+                       );
                }
-               $form .= "
-                       <tr>
-                               <td></td>
-                               <td class='mw-submit'>" .
-                                       Xml::submitButton(
-                                               wfMessage( 'filedelete-submit' )->text(),
-                                               [
-                                                       'name' => 'mw-filedelete-submit',
-                                                       'id' => 'mw-filedelete-submit',
-                                                       'tabindex' => '4'
-                                               ]
-                                       ) .
-                               "</td>
-                       </tr>" .
-                       Xml::closeElement( 'table' ) .
-                       Xml::closeElement( 'fieldset' ) .
-                       Xml::closeElement( 'form' );
-
-                       if ( $wgUser->isAllowed( 'editinterface' ) ) {
-                               $title = wfMessage( 'filedelete-reason-dropdown' )->inContentLanguage()->getTitle();
-                               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
-                               $link = $linkRenderer->makeKnownLink(
-                                       $title,
-                                       wfMessage( 'filedelete-edit-reasonlist' )->text(),
-                                       [],
-                                       [ 'action' => 'edit' ]
-                               );
-                               $form .= '<p class="mw-filedelete-editreasons">' . $link . '</p>';
-                       }
 
-               $wgOut->addHTML( $form );
+               $fields[] = new OOUI\FieldLayout(
+                       new OOUI\ButtonInputWidget( [
+                               'name' => 'mw-filedelete-submit',
+                               'inputId' => 'mw-filedelete-submit',
+                               'tabIndex' => 4,
+                               'value' => $wgOut->msg( 'filedelete-submit' )->text(),
+                               'label' => $wgOut->msg( 'filedelete-submit' )->text(),
+                               'flags' => [ 'primary', 'destructive' ],
+                               'type' => 'submit',
+                       ] ),
+                       [
+                               'align' => 'top',
+                       ]
+               );
+
+               $fieldset = new OOUI\FieldsetLayout( [
+                       'label' => $wgOut->msg( 'filedelete-legend' )->text(),
+                       'items' => $fields,
+               ] );
+
+               $form = new OOUI\FormLayout( [
+                       'method' => 'post',
+                       'action' => $this->getAction(),
+                       'id' => 'mw-img-deleteconfirm',
+               ] );
+               $form->appendContent(
+                       $fieldset,
+                       new OOUI\HtmlSnippet(
+                               Html::hidden( 'wpEditToken', $wgUser->getEditToken( $this->oldimage ) )
+                       )
+               );
+
+               $wgOut->addHTML(
+                       new OOUI\PanelLayout( [
+                               'classes' => [ 'deletepage-wrapper' ],
+                               'expanded' => false,
+                               'padded' => true,
+                               'framed' => true,
+                               'content' => $form,
+                       ] )
+               );
+
+               if ( $wgUser->isAllowed( 'editinterface' ) ) {
+                       $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+                       $link = $linkRenderer->makeKnownLink(
+                               $wgOut->msg( 'filedelete-reason-dropdown' )->inContentLanguage()->getTitle(),
+                               wfMessage( 'filedelete-edit-reasonlist' )->text(),
+                               [],
+                               [ 'action' => 'edit' ]
+                       );
+                       $wgOut->addHTML( '<p class="mw-filedelete-editreasons">' . $link . '</p>' );
+               }
        }
 
        /**
index 4010ec7..20ac680 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Class for handling an array of magic words
@@ -32,6 +33,9 @@ class MagicWordArray {
        /** @var array */
        public $names = [];
 
+       /** @var MagicWordFactory */
+       private $factory;
+
        /** @var array */
        private $hash;
 
@@ -41,9 +45,14 @@ class MagicWordArray {
 
        /**
         * @param array $names
+        * @param MagicWordFactory|null $factory
         */
-       public function __construct( $names = [] ) {
+       public function __construct( $names = [], MagicWordFactory $factory = null ) {
                $this->names = $names;
+               $this->factory = $factory;
+               if ( !$factory ) {
+                       $this->factory = MediaWikiServices::getInstance()->getMagicWordFactory();
+               }
        }
 
        /**
@@ -75,7 +84,7 @@ class MagicWordArray {
                        global $wgContLang;
                        $this->hash = [ 0 => [], 1 => [] ];
                        foreach ( $this->names as $name ) {
-                               $magic = MagicWord::get( $name );
+                               $magic = $this->factory->get( $name );
                                $case = intval( $magic->isCaseSensitive() );
                                foreach ( $magic->getSynonyms() as $syn ) {
                                        if ( !$case ) {
@@ -97,7 +106,7 @@ class MagicWordArray {
                        $this->baseRegex = [ 0 => '', 1 => '' ];
                        $allGroups = [];
                        foreach ( $this->names as $name ) {
-                               $magic = MagicWord::get( $name );
+                               $magic = $this->factory->get( $name );
                                $case = intval( $magic->isCaseSensitive() );
                                foreach ( $magic->getSynonyms() as $i => $syn ) {
                                        // Group name must start with a non-digit in PCRE 8.34+
index 11ed0a7..15a7678 100644 (file)
@@ -254,8 +254,18 @@ class MagicWordFactory {
        public function getDoubleUnderscoreArray() {
                if ( is_null( $this->mDoubleUnderscoreArray ) ) {
                        Hooks::run( 'GetDoubleUnderscoreIDs', [ &$this->mDoubleUnderscoreIDs ] );
-                       $this->mDoubleUnderscoreArray = new MagicWordArray( $this->mDoubleUnderscoreIDs );
+                       $this->mDoubleUnderscoreArray = $this->newArray( $this->mDoubleUnderscoreIDs );
                }
                return $this->mDoubleUnderscoreArray;
        }
+
+       /**
+        * Get a new MagicWordArray with provided $names
+        *
+        * @param array $names
+        * @return MagicWordArray
+        */
+       public function newArray( array $names = [] ) : MagicWordArray {
+               return new MagicWordArray( $names, $this );
+       }
 }
index 19810fc..aa517e7 100644 (file)
@@ -222,9 +222,6 @@ class OutputPage extends ContextSource {
         */
        public $mNoGallery = false;
 
-       /** @var string */
-       private $mPageTitleActionText = '';
-
        /** @var int Cache stuff. Looks like mEnableClientCache */
        protected $mCdnMaxage = 0;
        /** @var int Upper limit on mCdnMaxage */
@@ -894,25 +891,6 @@ class OutputPage extends ContextSource {
                }
        }
 
-       /**
-        * Set the new value of the "action text", this will be added to the
-        * "HTML title", separated from it with " - ".
-        *
-        * @param string $text New value of the "action text"
-        */
-       public function setPageTitleActionText( $text ) {
-               $this->mPageTitleActionText = $text;
-       }
-
-       /**
-        * Get the value of the "action text"
-        *
-        * @return string
-        */
-       public function getPageTitleActionText() {
-               return $this->mPageTitleActionText;
-       }
-
        /**
         * "HTML title" means the contents of "<title>".
         * It is stored as plain, unescaped text and will be run through htmlspecialchars in the skin file.
index ee608c2..8d7c3b6 100644 (file)
@@ -99,7 +99,7 @@ class Pingback {
                return $dbw->upsert(
                        'updatelog',
                        [ 'ul_key' => $this->key, 'ul_value' => $timestamp ],
-                       [ 'ul_key' => $this->key ],
+                       [ 'ul_key' ],
                        [ 'ul_value' => $timestamp ],
                        __METHOD__
                );
index d3e0622..cc7d722 100644 (file)
@@ -2377,14 +2377,25 @@ class Title implements LinkTarget {
         */
        private function checkSiteConfigPermissions( $action, $user, $errors, $rigor, $short ) {
                if ( $action != 'patrol' ) {
+                       $error = null;
                        // Sitewide CSS/JSON/JS changes, like all NS_MEDIAWIKI changes, also require the
                        // editinterface right. That's implemented as a restriction so no check needed here.
                        if ( $this->isSiteCssConfigPage() && !$user->isAllowed( 'editsitecss' ) ) {
-                               $errors[] = [ 'sitecssprotected', $action ];
+                               $error = [ 'sitecssprotected', $action ];
                        } elseif ( $this->isSiteJsonConfigPage() && !$user->isAllowed( 'editsitejson' ) ) {
-                               $errors[] = [ 'sitejsonprotected', $action ];
+                               $error = [ 'sitejsonprotected', $action ];
                        } elseif ( $this->isSiteJsConfigPage() && !$user->isAllowed( 'editsitejs' ) ) {
-                               $errors[] = [ 'sitejsprotected', $action ];
+                               $error = [ 'sitejsprotected', $action ];
+                       }
+
+                       if ( $error ) {
+                               if ( $user->isAllowed( 'editinterface' ) ) {
+                                       // Most users / site admins will probably find out about the new, more restrictive
+                                       // permissions by failing to edit something. Give them more info.
+                                       // TODO remove this a few release cycles after 1.32
+                                       $error = [ 'interfaceadmin-info', wfMessage( $error[0], $error[1] ) ];
+                               }
+                               $errors[] = $error;
                        }
                }
 
index 98dfeb3..e77cdf7 100644 (file)
@@ -209,12 +209,14 @@ class InfoAction extends FormlessAction {
        protected function pageInfo() {
                global $wgContLang;
 
+               $services = MediaWikiServices::getInstance();
+
                $user = $this->getUser();
                $lang = $this->getLanguage();
                $title = $this->getTitle();
                $id = $title->getArticleID();
                $config = $this->context->getConfig();
-               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+               $linkRenderer = $services->getLinkRenderer();
 
                $pageCounts = $this->pageCounts( $this->page );
 
@@ -599,7 +601,7 @@ class InfoAction extends FormlessAction {
                ];
 
                // Array of MagicWord objects
-               $magicWords = MagicWord::getDoubleUnderscoreArray();
+               $magicWords = $services->getMagicWordFactory()->getDoubleUnderscoreArray();
 
                // Array of magic word IDs
                $wordIDs = $magicWords->names;
index 90435c5..c65dfa5 100644 (file)
@@ -806,7 +806,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        public function appendVariables( $property ) {
-               $variables = MagicWord::getVariableIDs();
+               $variables = MediaWikiServices::getInstance()->getMagicWordFactory()->getVariableIDs();
                ApiResult::setArrayType( $variables, 'BCarray' );
                ApiResult::setIndexedTagName( $variables, 'v' );
 
index 313cb02..8c69b9d 100644 (file)
        "apierror-sectionsnotsupported": "الأقسام غير مدعومة لنموذج المحتوى $1.",
        "apierror-sectionsnotsupported-what": "الأقسام غير مدعومة بواسطة $1.",
        "apierror-show": "وسيط غير صحيحة; قد لا يتم تقديم قيم خاصة متبادلة.",
-       "apierror-siteinfo-includealldenied": "يمكن عرض جميع معلومات الخوادم ما لم يكن <var>$wgShowHostNames</var> صحيحا.",
+       "apierror-siteinfo-includealldenied": "يمكن عرض جميع معلومات الخوادم ما لم يكن <var>$wgShowHostnames</var> صحيحا.",
        "apierror-sizediffdisabled": "تم تعطيل فرق الحجم في وضع Miser.",
        "apierror-spamdetected": "تم رفض تعديلك لأنه يحتوي على جزء من الرسائل غير المرغوب فيها: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "ليست لديك صلاحية لعرض نتائج هذه الصفحة الخاصة.",
        "apiwarn-checktoken-percentencoding": "تحقق من أن الرموز مثل \"+\" في الرمز المميز يتم ترميزها بشكل صحيح في المسار.",
        "apiwarn-compare-nocontentmodel": "لا يمكن تحديد نموذج محتوى، على افتراض $1.",
        "apiwarn-deprecation-deletedrevs": "تم إيقاف <kbd>list=deletedrevs</kbd>; الرجاء استخدام <kbd>prop=deletedrevisions</kbd> or <kbd>list=alldeletedrevisions</kbd> بدلا من ذلك.",
-       "apiwarn-deprecation-expandtemplates-prop": "نظرا لعدم تحديد أية قيم للوسيط <var>prop</var>; تم استخدام تنسيق قديم للإخراج، تم إيقاف هذا التنسيق، وفي المستقبل، سيتم تعيين قيمة افتراضية للوسيط <var>prop</var>، مما يؤدي إلى استخدام التنسيق الجديد دائما.",
        "apiwarn-deprecation-httpsexpected": "HTTP المستخدمة عند توقع HTTPS.",
        "apiwarn-deprecation-login-botpw": "تم إيقاف تسجيل الدخول إلى الحساب الرئيسي عبر <kbd>action=login</kbd> وقد يتوقف عن العمل دون سابق إنذار، لمتابعة تسجيل الدخول باستخدام <kbd>action=login</kbd>; راجع [[Special:BotPasswords]]، لمتابعة استخدام تسجيل الدخول إلى الحساب الرئيسي بأمان; راجع <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "تم إيقاف تسجيل الدخول إلى الحساب الرئيسي عبر <kbd>action=login</kbd>، وقد يتوقف عن العمل دون سابق إنذار، لتسجيل الدخول بأمان; راجع <kbd>action=clientlogin</kbd>.",
index 54fbef8..5bdc3c9 100644 (file)
        "apihelp-query+revisions+base-paramvalue-prop-user": "Benutzer, der die Version erstellt hat.",
        "apihelp-query+revisions+base-paramvalue-prop-userid": "Benutzerkennung des Versionserstellers.",
        "apihelp-query+revisions+base-paramvalue-prop-size": "Länge in Bytes der Version.",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsize": "Länge (Bytes) eines jeden Versionsschlitzes.",
        "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1-Prüfsumme (Basis 16) der Version.",
-       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "Inhaltsmodell-Kennung der Version.",
-       "apihelp-query+revisions+base-paramvalue-prop-content": "Text der Version.",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsha1": "SHA-1 (Basis 16) eines jeden Versionsschlitzes.",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "Inhaltsmodell-Kennung eines jeden Versionsschlitzes.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Inhalt eines jeden Versionsschlitzes.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Markierungen für die Version.",
+       "apihelp-query+revisions+base-paramvalue-prop-roles": "Die Liste enthält Schlitzregeln, die in der Version vorhanden sind.",
        "apihelp-query+search-param-what": "Welcher Suchtyp ausgeführt werden soll.",
        "apihelp-query+search-param-info": "Welche Metadaten zurückgegeben werden sollen.",
        "apihelp-query+search-param-prop": "Eigenschaften zur Rückgabe:",
        "apierror-unknownerror-nocode": "Unbekannter Fehler.",
        "apierror-unknownerror": "Unbekannter Fehler: „$1“.",
        "apierror-unknownformat": "Nicht erkanntes Format „$1“.",
+       "apiwarn-deprecation-missingparam": "Da <var>$1</var> nicht angegeben wurde, wurde ein veraltetes Format für die Ausgabe verwendet. Dieses Format ist veraltet und in Zukunft wird immer das neue Format benutzt.",
        "apiwarn-ignoring-invalid-templated-value": "Ignorieren des Wertes <kbd>$2</kbd> in <var>$1</var> bei der Verarbeitung von Vorlagenparametern.",
        "apiwarn-invalidcategory": "„$1“ ist keine Kategorie.",
        "apiwarn-invalidtitle": "„$1“ ist kein gültiger Titel.",
index b23a5f8..f807411 100644 (file)
        "apierror-sectionsnotsupported": "Las secciones no son compatibles con el modelo de contenido $1.",
        "apierror-sectionsnotsupported-what": "Las secciones no son compatibles con $1.",
        "apierror-show": "Parámetro incorrecto: no se pueden proporcionar valores mutuamente excluyentes.",
-       "apierror-siteinfo-includealldenied": "No se puede ver la información de todos los servidores a menos que <var>$wgShowHostNames</var> tenga valor verdadero.",
+       "apierror-siteinfo-includealldenied": "No se puede ver la información de todos los servidores a menos que <var>$wgShowHostnames</var> tenga valor verdadero.",
        "apierror-sizediffdisabled": "La diferencia de tamaño está deshabilitada en el modo avaro.",
        "apierror-spamdetected": "Tu edición fue rechazada por contener un fragmento de spam: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "No tienes permiso para ver los resultados de esta página especial.",
        "apiwarn-badurlparam": "No se pudo analizar <var>$1urlparam</var> para $2. Se utilizarán solamente la anchura y altura.",
        "apiwarn-badutf8": "El valor pasado para <var>$1</var> contiene datos no válidos o no normalizados. Los datos textuales deberían estar en Unicode válido, normalizado en NFC y sin caracteres de control C0 excepto HT (\\t), LF (\\n) y CR (\\r).",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> ha quedado obsoleto. En su lugar, utiliza <kbd>prop=deletedrevisions</kbd> o <kbd>list=alldeletedrevisions</kbd>.",
-       "apiwarn-deprecation-expandtemplates-prop": "Como no se ha especificado ningún valor para el parámetro <var>prop</var>, se ha utilizado un formato heredado para la salida. Este formato está en desuso y, en el futuro, el parámetro <var>prop</var> tendrá un valor predeterminado, de forma que siempre se utilizará el formato nuevo.",
        "apiwarn-deprecation-httpsexpected": "Se ha utilizado HTTP cuando se esperaba HTTPS.",
        "apiwarn-deprecation-login-botpw": "El inicio de sesión con la cuenta principal mediante <kbd>action=login</kbd> está en desuso y puede dejar de funcionar sin aviso previo. Para proseguir el inicio de sesión mediante <kbd>action=login</kbd>, véase [[Special:BotPasswords]]. Para proseguir el inicio de sesión con la cuenta principal de forma segura, véase <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "El inicio de sesión con la cuenta principal mediante <kbd>action=login</kbd> está en desuso y puede dejar de funcionar sin aviso previo. Para iniciar sesión de forma segura, véase <kbd>action=clientlogin</kbd>.",
index 32c0192..5652404 100644 (file)
        "apihelp-query+revisions+base-paramvalue-prop-user": "L’utilisateur qui a fait la révision.",
        "apihelp-query+revisions+base-paramvalue-prop-userid": "L’ID de l’utilisateur créateur de la révision.",
        "apihelp-query+revisions+base-paramvalue-prop-size": "Longueur (en octets) de la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsize": "Longueur (en octets) de chaque emplacement de révision.",
        "apihelp-query+revisions+base-paramvalue-prop-sha1": "Hachage SHA-1 (base 16) de la révision.",
-       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "ID du modèle de contenu de la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsha1": "SHA-1 (base 16) de chaque emplacement de révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "ID du modèle de contenu de chaque emplacement de révision.",
        "apihelp-query+revisions+base-paramvalue-prop-comment": "Commentaire de l’utilisateur sur la révision.",
        "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "Commentaire analysé de l’utilisateur sur la révision.",
-       "apihelp-query+revisions+base-paramvalue-prop-content": "Texte de la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Contenu de chaque emplacement de révision.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Balises de la révision.",
-       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "<span class=\"apihelp-deprecated\">Deprecated.</span> Utiliser  <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> ou <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> à la place. L’arbre d’analyse XML du contenu de la révision (nécessite le modèle de contenu <code>$1</code>).",
+       "apihelp-query+revisions+base-paramvalue-prop-roles": "Lister les rôles d’emplacement de contenu qui existent dans la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Utiliser  <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> ou <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> à la place. L’arbre d’analyse XML du contenu de la révision (nécessite le modèle de contenu <code>$1</code>).",
+       "apihelp-query+revisions+base-param-slots": "Pour quels emplacements de révision renvoyer des données, quand les propriétés relatives aux emplacements sont incluses dans <var>$1props</var>. Si omis, les données de l’emplacement <kbd>main</kbd> seront renvoyées dans un format rétro-compatible.",
        "apihelp-query+revisions+base-param-limit": "Limiter le nombre de révisions retournées.",
        "apihelp-query+revisions+base-param-expandtemplates": "Utiliser <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> à la place. Développer les modèles dans le contenu de la révision (nécessite $1prop=content).",
        "apihelp-query+revisions+base-param-generatexml": "Utiliser <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> ou <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> à la place. Générer l’arbre d’analyse XML pour le contenu de la révision (nécessite $1prop=content).",
        "apierror-sectionsnotsupported": "Les sections ne sont pas prises en charge pour le modèle de contenu $1.",
        "apierror-sectionsnotsupported-what": "Les sections ne sont pas prises en charge par $1.",
        "apierror-show": "Paramètre incorrect - des valeurs mutuellement exclusives ne peuvent pas être fournies.",
-       "apierror-siteinfo-includealldenied": "Impossible d’afficher toutes les informatiosn du serveur, sauf si <var>$wgShowHostNames</var> vaut vrai.",
+       "apierror-siteinfo-includealldenied": "Impossible d’afficher toutes les informatiosn du serveur, sauf si <var>$wgShowHostnames</var> vaut vrai.",
        "apierror-sizediffdisabled": "La différence de taille est désactivée dans le mode Miser.",
        "apierror-spamdetected": "Votre modification a été refusée parce qu’elle contenait un fragment de pourriel : <code>$1</code>.",
        "apierror-specialpage-cantexecute": "Vous n'avez pas l'autorisation d'afficher les résultats de cette page spéciale.",
        "apiwarn-checktoken-percentencoding": "Vérifier que les symboles tels que \"+\" dans le jeton sont correctement  codés avec des pourcents dans l'URL.",
        "apiwarn-compare-nocontentmodel": "Aucun modèle de contenu n’a pu être déterminé, $1 est supposé.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> est devenu désuet. Veuillez utiliser <kbd>prop=deletedrevisions</kbd> ou <kbd>list=alldeletedrevisions</kbd> à la place.",
-       "apiwarn-deprecation-expandtemplates-prop": "Comme aucune valeur n’a été spécifiée pour le paramètre <var>prop</var>, un format patrimonial a été utilisé pour la sortie. Ce format est désuet et, dans le futur, une valeur par défaut sera fixée pour le paramètre <var>prop</var>, provoquant ainsi l’utilisation systématique du nouveau format.",
        "apiwarn-deprecation-httpsexpected": "HTTP est utilisé alors que HTTPS est attendu.",
        "apiwarn-deprecation-login-botpw": "La connexion au compte principal via <kbd>action=login</kbd> est désuète et peut cesser de fonctionner sans avertissement. Pour continuer à vous connecter avec <kbd>action=login</kbd>, voyez [[Special:BotPasswords]]. Pour continuer à utiliser la connexion au compte principal en toute sécurité, voyez <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "La connexion au compte principal via <kbd>action=login</kbd> est désuète et peut cesser de fonctionner sans avertissement. Pour vous connecter en toute sécurité, voyez <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-token": "La récupération d’un jeton via <kbd>action=login</kbd> est désuète. Utilisez <kbd>action=query&meta=tokens&type=login</kbd> à la place.",
+       "apiwarn-deprecation-missingparam": "Comme <var>$1</var> n’a pas été spécifié, un format ancien a été utilisé pour la sortie. Ce format est obsolète, et dans le futur, le nouveau format sera toujours utilisé.",
        "apiwarn-deprecation-parameter": "Le paramètre <var>$1</var> est désuet.",
        "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> est désuet depuis MédiaWiki 1.28. Utilisez <kbd>prop=headhtml</kbd> lors de la création de nouveaux documents HTML, ou <kbd>prop=modules|jsconfigvars</kbd> lors de la mise à jour d’un document côté client.",
        "apiwarn-deprecation-purge-get": "L’utilisation de <kbd>action=purge</kbd> via un GET est désuète. Utiliser POST à la place.",
index da839f4..5103bd3 100644 (file)
        "apierror-sectionsnotsupported": "As seccións non son compatibles co modelo de contido $1.",
        "apierror-sectionsnotsupported-what": "As seccións non son compatibles con $1.",
        "apierror-show": "Parámetro incorrecto - non se poden proporcionar valores mutuamente excluíntes.",
-       "apierror-siteinfo-includealldenied": "Non se pode ver a información de tódolos servidores a menos que <var>$wgShowHostNames</var> teña valor verdadeiro.",
+       "apierror-siteinfo-includealldenied": "Non se pode ver a información de tódolos servidores a menos que <var>$wgShowHostnames</var> teña valor verdadeiro.",
        "apierror-sizediffdisabled": "A diferenza de tamaño está deshabilitada no modo Miser.",
        "apierror-spamdetected": "A súa edición foi rexeitada por conter un fragmento de publicidade: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "Non ten permiso para ver os resultados desta páxina especial.",
        "apiwarn-badurlparam": "Non se puido analizar <var>$1urlparam</var> para $2. Só se usará a anchura e a altura.",
        "apiwarn-badutf8": "O valor pasado para <var>$1</var> contén datos non válidos ou non normalizados. Os datos de texto deberían estar en formato Unicode válido, normalizado en NFC e sen caracteres de control C0 distintos de HT (\\t), LF (\\n) e CR (\\r).",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> quedou obsoleto. No seu lugar, utilice <kbd>prop=deletedrevisions</kbd> ou <kbd>list=alldeletedrevisions</kbd>.",
-       "apiwarn-deprecation-expandtemplates-prop": "Como non se especificou ningún valor para o parámetro <var>prop</var>, utilizouse un formato herdado para a saída. Este formato está en desuso e, no futuro, o parámetro <var>prop</var> terá un valor predeterminado, de forma que sempre se utilizará o formato novo.",
        "apiwarn-deprecation-httpsexpected": "Utilizouse HTTP cando esperábase HTTPS.",
        "apiwarn-deprecation-login-botpw": "O inicio de sesión coa conta principal mediante <kbd>action=login</kbd> está en desuso e pode deixar de funcionar sen aviso previo. Para proseguir o inicio de sesión mediante <kbd>action=login</kbd>, consulte [[Special:BotPasswords]]. Para proseguir o inicio de sesión coa conta principal de forma segura, consulte <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "O inicio de sesión coa conta principal mediante <kbd>action=login</kbd> está en desuso e pode deixar de funcionar sen aviso previo. Para iniciar sesión de forma segura, consulte <kbd>action=clientlogin</kbd>.",
index 5cc5795..e2c73c2 100644 (file)
        "apierror-sectionsnotsupported": "מקטעים אינם נתמכים במודל התוכן $1.",
        "apierror-sectionsnotsupported-what": "מקטעים אינם נתמכים ב־$1.",
        "apierror-show": "פרמטר לא נכון – אי־אפשר לספק ערכים שמבטלים זה את זה.",
-       "apierror-siteinfo-includealldenied": "לא ניתן להציג את המידע של כל השרתים אלא אם <var dir=\"ltr\">$wgShowHostNames</var> מוגדר להיות true.",
+       "apierror-siteinfo-includealldenied": "לא ניתן להציג את המידע של כל השרתים אלא אם <var dir=\"ltr\">$wgShowHostnames</var> מוגדר להיות true.",
        "apierror-sizediffdisabled": "ההבדל בגודל כבוי במצב קמצן.",
        "apierror-spamdetected": "העריכה שלך סורבה כי הכילה חלק ספאם: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "אין לך הרשאה להציג את התוצאות של הדף המיוחד הזה.",
        "apiwarn-checktoken-percentencoding": "נא לבדוק שסימנים כמו \"+\" באסימון מקודדים עם אחוזים בצורה נכונה ב־URL.",
        "apiwarn-compare-nocontentmodel": "לא היה אפשר לקבוע את מודל התוכן, נניח שזה $1.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> הוצהר בתור מיושן. נא להשתמש ב־ <kbd>prop=deletedrevisions</kbd> או ב־<kbd>list=alldeletedrevisions</kbd> במקום זה.",
-       "apiwarn-deprecation-expandtemplates-prop": "מכיוון שלא ניתנו ערכים לפרמטר <var>prop</var>, תסדיר מיושן ישמש לפלט. התסדיר הזה מיושן, ובעתיד יינתן ערך בררת מחדל לפרמטר <var>prop</var>, כך שתמיד ישמש התסדיר החדש.",
        "apiwarn-deprecation-httpsexpected": "משמש HTTP כשהיה צפוי HTTPS.",
        "apiwarn-deprecation-login-botpw": "כניסה לחשבון עיקרי (main-account) דרך <kbd>action=login</kbd> מיושנת ועלולה להפסיק לעבוד ללא אזהרה נוספת. כדי להמשיך להיכנס עם <kbd>action=login</kbd>, ר' [[Special:BotPasswords]]. כדי להמשיך באופן מאובטח באמצעות חשבון עיקרי, ר' <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "כניסה בחשבון ראשי עם <kbd>action=login</kbd> מיושנת ויכולה להפסיק לעבוד ללא אזהרה. כדי להיכנס באופן מאובטח, ר' <kbd>action=clientlogin</kbd>.",
index 2bcaef1..ceb2d42 100644 (file)
        "apihelp-query+revisions+base-paramvalue-prop-timestamp": "Il timestamp della versione.",
        "apihelp-query+revisions+base-paramvalue-prop-user": "Utente che ha effettuato la versione.",
        "apihelp-query+revisions+base-paramvalue-prop-userid": "ID utente dell'autore della versione.",
-       "apihelp-query+revisions+base-paramvalue-prop-content": "Testo della versione.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Contenuto di ogni slot di versione.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Etichette della versione.",
        "apihelp-query+search-summary": "Eseguire una ricerca di testo completa.",
        "apihelp-query+search-param-what": "Quale tipo di ricerca effettuare.",
index c43960b..be6e798 100644 (file)
        "apierror-sectionreplacefailed": "Kunne ikke flette oppdatert seksjon.",
        "apierror-sectionsnotsupported": "Seksjoner støttes ikke for innholdsmodellen $1.",
        "apierror-sectionsnotsupported-what": "Seksjoner støttes ikke av $1.",
-       "apierror-siteinfo-includealldenied": "Kan ikke vise alle tjenernes info med mindre </var>$wgShowHostNames</var> er sann.",
+       "apierror-siteinfo-includealldenied": "Kan ikke vise alle tjenernes info med mindre </var>$wgShowHostnames</var> er sann.",
        "apierror-sizediffdisabled": "Størrelsesforskjell er slått av i Miser-modus.",
        "apierror-timeout": "Tjeneren svarte ikke innenfor forventet tid.",
        "apiwarn-validationfailed": "Bekreftelsesfeil <kbd>$1</kbd>: $2"
index e6724d4..0b8a992 100644 (file)
        "apihelp-query+revisions+base-paramvalue-prop-user": "Usuário que fez a revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-userid": "ID de usuário do criador da revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-size": "Comprimento (bytes) da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsize": "O comprimento (em bytes) de cada segmento de revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (base 16) da revisão.",
-       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "ID do modelo de conteúdo da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsha1": "O resumo criptográfico SHA-1 (base 16) de cada segmento de revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "O identificador do modelo de conteúdo de cada segmento de revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-comment": "Comentário do usuário para a revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "Analisar comentário do usuário para a revisão.",
-       "apihelp-query+revisions+base-paramvalue-prop-content": "Texto da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Conteúdo de cada segmento de revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Etiquetas para a revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-roles": "Listar as funções dos segmentos de conteúdo que existem na revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-parsetree": "<span class=\"apihelp-deprecated\">Obsoleto.</span> Use <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> ou <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> em vez. A árvore de análise XML de conteúdo da revisão (requer o modelo de conteúdo <code>$1</code>).",
+       "apihelp-query+revisions+base-param-slots": "Quais os segmentos de revisão cujos dados devem ser devolvidos quando propriedades relacionadas com segmentos são incluídas em <var>$1props</var>. Se for omitido, serão devolvidos dados do segmento principal (<kbd>main</kbd>) num formato compatível com versões anteriores.",
        "apihelp-query+revisions+base-param-limit": "Limita quantas revisões serão retornadas.",
        "apihelp-query+revisions+base-param-expandtemplates": "Use <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> em vez disso. Expande predefinições no conteúdo de revisão (requer $1prop=content).",
        "apihelp-query+revisions+base-param-generatexml": "Use <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> ou <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> em vez disso. Gerar árvore de analise XML para o conteúdo de revisão (requer $1prop=content).",
        "apierror-emptynewsection": "A criação de novas seções vazias não é possível.",
        "apierror-emptypage": "Não é permitido criar páginas novas e vazias.",
        "apierror-exceptioncaught": "[$1] Exceção detectada: $2",
+       "apierror-exceptioncaughttype": "[$1] Foi capturada uma exceção do tipo $2",
        "apierror-filedoesnotexist": "Arquivo não existe.",
        "apierror-fileexists-sharedrepo-perm": "O arquivo de destino existe em um repositório compartilhado. Use o parâmetro <var>ignorewarnings</var> para substituí-lo.",
        "apierror-filenopath": "Não é possível obter o caminho do arquivo local.",
        "apierror-sectionsnotsupported": "As seções não são suportadas para o modelo de conteúdo $1.",
        "apierror-sectionsnotsupported-what": "As seções não são suportadas por $1.",
        "apierror-show": "Parâmetro incorreto - valores mutuamente exclusivos podem não ser fornecidos.",
-       "apierror-siteinfo-includealldenied": "Não é possível visualizar a informação de todos os servidores, a menos que <var>$wgShowHostNames</var> seja true.",
+       "apierror-siteinfo-includealldenied": "Não é possível visualizar a informação de todos os servidores, a menos que <var>$wgShowHostnames</var> seja true.",
        "apierror-sizediffdisabled": "A diferença de tamanho está desativada no Miser Mode.",
        "apierror-spamdetected": "Sua edição foi bloqueada porque contem um fragmento de spam: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "Você não tem permissão para ver os resultados desta página especial.",
        "apiwarn-checktoken-percentencoding": "Verificar se os símbolos, como \"+\" no token, estão codificados corretamente na URL.",
        "apiwarn-compare-nocontentmodel": "Nenhum modelo de conteúdo pode ser determinado, assumindo $1.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> foi depreciado. Por favor, use <kbd>prop=deletedrevisions</kbd> ou <kbd>list=alldeletedrevisions</kbd> em vez.",
-       "apiwarn-deprecation-expandtemplates-prop": "Como nenhum valor foi especificado para o parâmetro <var>prop</var>, um formato herdado foi usado para a saída. Este formato está obsoleto e no futuro um valor padrão será definido para o parâmetro <var>prop</var>, fazendo com que o novo formato sempre seja usado.",
        "apiwarn-deprecation-httpsexpected": "HTTP usado quando o HTTPS era esperado.",
        "apiwarn-deprecation-login-botpw": "O login da conta principal via <kbd>action=login</kbd> está obsoleto e pode parar de funcionar sem aviso prévio. Para continuar com o login com <kbd>action=login</ kbd>, consulte [[Special:BotPasswords]]. Para continuar com segurança usando o login da conta principal, veja <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "O login da conta principal via <kbd>action=login</kbd> está obsoleto e pode parar de funcionar sem aviso prévio. Para fazer login com segurança, veja <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-token": "Obter um token via <kbd>action=login</kbd> está obsoleto. Use <kbd>action=query&meta=tokens&type=login</kbd> em vez.",
+       "apiwarn-deprecation-missingparam": "Foi usado um formato antigo para a saída, porque <var>$1</var> não foi especificado. Este formato foi descontinuado e de futuro será sempre usado o formato novo.",
        "apiwarn-deprecation-parameter": "O parâmetro <var>$1</var> é obsoleto.",
        "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> está depreciado desde o MediaWiki 1.28. Use <kbd>prop=headhtml</kbd> quando for criar novos documentos HTML, ou <kbd>prop=modules|jsconfigvars</kbd> quando for atualizar um documento no lado do cliente.",
        "apiwarn-deprecation-purge-get": "O uso de <kbd>action=purge</kbd> via GET está obsoleto. Use o POST em vez disso.",
index 49b66a7..0cc3238 100644 (file)
        "apihelp-query+revisions+base-paramvalue-prop-timestamp": "A data e hora da revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-user": "O utilizador que fez a revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-userid": "O identificador de utilizador do criador da revisão.",
-       "apihelp-query+revisions+base-paramvalue-prop-size": "O tamanho (em bytes) da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-size": "O comprimento (em bytes) da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsize": "O comprimento (em bytes) de cada segmento de revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-sha1": "O resumo criptográfico SHA-1 (na base 16) da revisão.",
-       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "O identificador do modelo de conteúdo da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsha1": "O resumo criptográfico SHA-1 (base 16) de cada segmento de revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "O identificador do modelo de conteúdo de cada segmento de revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-comment": "O comentário do utilizador para a revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "O comentário do utilizador para a revisão, após a análise sintática.",
-       "apihelp-query+revisions+base-paramvalue-prop-content": "O texto da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Conteúdo de cada segmento de revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "As etiquetas para a revisão.",
-       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "<span class=\"apihelp-deprecated\">Descontinuado.</span> Em substituição, use <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> ou <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>. A árvore de análise XML do conteúdo da revisão (requer o modelo de conteúdo <code>$1</code>).",
+       "apihelp-query+revisions+base-paramvalue-prop-roles": "Listar as funções dos segmentos de conteúdo que existem na revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Usar antes <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> ou <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>. A árvore XML da análise sintática do conteúdo da revisão <code>$1</code>).",
+       "apihelp-query+revisions+base-param-slots": "Quais os segmentos de revisão cujos dados devem ser devolvidos quando propriedades relacionadas com segmentos são incluídas em <var>$1props</var>. Se for omitido, serão devolvidos dados do segmento principal (<kbd>main</kbd>) num formato compatível com versões anteriores.",
        "apihelp-query+revisions+base-param-limit": "Limitar o número de revisões que serão devolvidas.",
        "apihelp-query+revisions+base-param-expandtemplates": "Em substituição, use <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd>. Expandir predefinições no conteúdo da revisão (requer $1prop=content).",
        "apihelp-query+revisions+base-param-generatexml": "Em substituição, use <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> ou <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>. Gerar a árvore de análise sintática em XML do conteúdo da revisão (requer $1prop=content).",
        "apierror-sectionsnotsupported": "Secções não são suportadas pelo modelo de conteúdo $1.",
        "apierror-sectionsnotsupported-what": "Secções não são suportadas por $1.",
        "apierror-show": "Parâmetro incorreto - não podem ser fornecidos valores mutuamente exclusivos.",
-       "apierror-siteinfo-includealldenied": "Não é possível ver a informação de todos os servidores, a menos que <var>$wgShowHostNames</var> tenha o valor \"true\".",
+       "apierror-siteinfo-includealldenied": "Não é possível ver a informação de todos os servidores, a menos que <var>$wgShowHostnames</var> tenha o valor \"true\".",
        "apierror-sizediffdisabled": "A diferença de tamanho está desativada no modo avarento.",
        "apierror-spamdetected": "A sua edição foi recusada porque continha um fragmento de spam: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "Não tem permissão para ver os resultados desta página especial.",
        "apiwarn-checktoken-percentencoding": "Verifique que símbolos como \"+\" na chave estão devidamente codificados com percentagem no URL.",
        "apiwarn-compare-nocontentmodel": "Não foi possível determinar nenhum modelo de conteúdo; será assumido $1.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> foi descontinuado. Em substituição, use <kbd>prop=deletedrevisions</kbd> ou <kbd>list=alldeletedrevisions</kbd>, por favor.",
-       "apiwarn-deprecation-expandtemplates-prop": "Dado que não foi especificado nenhum valor para o parâmetro <var>prop</var> foi usado um formato antigo para o resultado. Esse formato está descontinuado e, de futuro, será definido um valor por omissão para o parâmetro <var>prop</var>, de forma que seja sempre usado um formato novo.",
        "apiwarn-deprecation-httpsexpected": "Foi usado HTTP quando era esperado HTTPS.",
        "apiwarn-deprecation-login-botpw": "O início de sessões com uma conta principal através de <kbd>action=login</kbd> foi descontinuado e poderá deixar de funcionar sem aviso prévio. Para continuar a iniciar sessões com <kbd>action=login</kbd>, consulte [[Special:BotPasswords]]. Para continuar a iniciar sessões com a conta principal de forma segura, consulte <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "O início de sessões com uma conta principal através de <kbd>action=login</kbd> foi descontinuado e poderá deixar de funcionar sem aviso prévio. Para iniciar uma sessão de forma segura, consulte <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-token": "A obtenção de uma chave através de <kbd>action=login</kbd> foi descontinuada. Em substituição, use <kbd>action=query&meta=tokens&type=login</kbd>.",
+       "apiwarn-deprecation-missingparam": "Foi usado um formato antigo para a saída, porque <var>$1</var> não foi especificado. Este formato foi descontinuado e de futuro será sempre usado o formato novo.",
        "apiwarn-deprecation-parameter": "O parâmetro <var>$1</var> foi descontinuado.",
        "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> está obsoleto desde o MediaWiki 1.28. Use <kbd>prop=headhtml</kbd> ao criar novos documentos de HTML, ou <kbd>prop=modules|jsconfigvars</kbd> ao atualizar um documento no lado do cliente.",
        "apiwarn-deprecation-purge-get": "O uso de <kbd>action=purge</kbd> através de um GET foi descontinuado. Em substituição, use um POST.",
index 6bfe059..bae0948 100644 (file)
        "apierror-sectionsnotsupported": "Разбиение на секции не поддерживается моделью содержимого $1.",
        "apierror-sectionsnotsupported-what": "Разбиение на секции не поддерживается $1.",
        "apierror-show": "Некорректный параметр — вручную исключённые значения не могут быть обработаны.",
-       "apierror-siteinfo-includealldenied": "Невозможно отобразить информацию о всех серверах, если <var>$wgShowHostNames</var> не истинно.",
+       "apierror-siteinfo-includealldenied": "Невозможно отобразить информацию о всех серверах, если <var>$wgShowHostnames</var> не истинно.",
        "apierror-sizediffdisabled": "Подсчёт разницы размеров отключён в жадном режиме.",
        "apierror-spamdetected": "Ваша правка была отклонена, так как содержит спам: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "У вас нет прав, чтобы просматривать результаты этой служебной страницы.",
        "apiwarn-checktoken-percentencoding": "Проверьте, что символы вроде «+» в токене корректно закодированы %-последовательностями в ссылке.",
        "apiwarn-compare-nocontentmodel": "Модель содержимого не может быть определена, предполагается $1.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> устарел. Пожалуйста, вместо него используйте <kbd>prop=deletedrevisions</kbd> или <kbd>list=alldeletedrevisions</kbd>.",
-       "apiwarn-deprecation-expandtemplates-prop": "Поскольку никакие значения не были указаны в параметре <var>prop</var>, был использован наследованный формат. Этот формат является устаревшим, и в будущем параметру <var>prop</var> будет присвоено значение по умолчанию, что приведёт к повсеместному использованию нового формата.",
        "apiwarn-deprecation-httpsexpected": "Использован HTTP, где ожидался HTTPS.",
        "apiwarn-deprecation-login-botpw": "Вход в основной аккаунт через <kbd>action=login</kbd> устарел и может быть отключен без предупреждения. Для продолжения авторизации с <kbd>action=login</kbd>, см.\n[[Special:BotPasswords]]. Для безопасного продолжения использования входа в основной аккаунт, см. <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "Вход в основной аккаунт через <kbd>action=login</kbd> не поддерживается и может быть отключен без предупреждения. Для безопасной авторизации, см. <kbd>action=clientlogin</kbd>.",
index 95cd709..e9078e0 100644 (file)
        "apierror-sectionsnotsupported": "Розділи не підтримуються для контентної моделі $1.",
        "apierror-sectionsnotsupported-what": "Розділи не підтримуються $1.",
        "apierror-show": "Неправильний параметр — не можна надавати взаємовиключні значення.",
-       "apierror-siteinfo-includealldenied": "Не можна переглядати інформацію щодо всіх серверів, якщо тільки <var>$wgShowHostNames</var> не вказано як «true».",
+       "apierror-siteinfo-includealldenied": "Не можна переглядати інформацію щодо всіх серверів, якщо тільки <var>$wgShowHostnames</var> не вказано як «true».",
        "apierror-sizediffdisabled": "Різниця у розмірах вимкнена в скупому режимі.",
        "apierror-spamdetected": "Ваше редагування було відхилено, оскільки воно містило фрагмент спаму: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "Ви не маєте прав на перегляд результатів цієї спеціальної сторінки.",
        "apiwarn-checktoken-percentencoding": "Перевірте, чи символи, такі як «+» у токені, пройшли правильне процентне кодування в URL.",
        "apiwarn-compare-nocontentmodel": "Не вдалося визначити контентну модель, припускаємо $1.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> є застарілим. Будь ласка, використовуйте замість нього <kbd>prop=deletedrevisions</kbd> або <kbd>list=alldeletedrevisions</kbd>.",
-       "apiwarn-deprecation-expandtemplates-prop": "Оскільки не задано жодних значень для параметра <var>prop</var>, як вихідні дані було використано старий формат. Цей формат є застарілим, і в майбутньому параметру <var>prop</var> буде задано стандартне значення, наслідком чого стане те, що завжди використовуватиметься новий формат.",
        "apiwarn-deprecation-httpsexpected": "Використано HTTP, тоді як очікувалося використання HTTPS.",
        "apiwarn-deprecation-login-botpw": "Вхід в основний обліковий запис через <kbd>action=login</kbd> є застарілим, і може припинити працювати, без попередження. Щоб продовжити вхід у систему через <kbd>action=login</kbd>, див. [[Special:BotPasswords]]. Щоб безпечно продовжити, використовуючи вхід в основний обліковий запис, див. <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "Вхід в основний обліковий запис через <kbd>action=login</kbd> є застарілим, і може припинити працювати, без попередження. Щоб безпечно увійти в систему, див. <kbd>action=clientlogin</kbd>.",
index 2509d8d..8d618ea 100644 (file)
        "apihelp-query+revisions+base-paramvalue-prop-user": "做出修订的用户。",
        "apihelp-query+revisions+base-paramvalue-prop-userid": "修订创建者的用户ID。",
        "apihelp-query+revisions+base-paramvalue-prop-size": "修订的长度(字节)。",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsize": "每次修订间隔的长度(字节)。",
        "apihelp-query+revisions+base-paramvalue-prop-sha1": "修订的SHA-1(base 16)。",
-       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "修订的内容模型ID。",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsha1": "每次修订间隔的SHA-1(base 16)。",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "每次修订间隔的内容模型ID。",
        "apihelp-query+revisions+base-paramvalue-prop-comment": "由用户对修订做出的摘要。",
        "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "由用户对修订做出的被解析的摘要。",
-       "apihelp-query+revisions+base-paramvalue-prop-content": "修订文本。",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "每次修订间隔的内容。",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "修订标签。",
-       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "<span class=\"apihelp-deprecated\">已弃用。</span>请改用<kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd>或<kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>。修订内容的XML解析树(需要内容模型<code>$1</code>)。",
+       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "请改用<kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd>或<kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>。修订内容的XML解析树(需要内容模型<code>$1</code>)。",
        "apihelp-query+revisions+base-param-limit": "限制返回多少修订。",
        "apihelp-query+revisions+base-param-expandtemplates": "请改用<kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd>。展开修订内容中的模板(需要$1prop=content)。",
        "apihelp-query+revisions+base-param-generatexml": "请改用<kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd>或<kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>。生成用于修订内容的XML解析树(需要$1prop=content;被<kbd>$1prop=parsetree</kbd>所取代)。",
        "apierror-sectionsnotsupported": "内容模型$1不支持章节。",
        "apierror-sectionsnotsupported-what": "章节不被$1所支持。",
        "apierror-show": "不正确的参数——不可提供互斥值。",
-       "apierror-siteinfo-includealldenied": "除非<var>$wgShowHostNames</var>为真,否则不能查看所有服务器的信息。",
+       "apierror-siteinfo-includealldenied": "除非<var>$wgShowHostnames</var>为真,否则不能查看所有服务器的信息。",
        "apierror-sizediffdisabled": "大小差异在Miser模式中被禁用。",
        "apierror-spamdetected": "您的编辑被拒绝,因为它包含垃圾部分:<code>$1</code>。",
        "apierror-specialpage-cantexecute": "您没有权限查看此特殊页面的结果。",
        "apiwarn-checktoken-percentencoding": "在令牌中检查例如“+”的符号会在URL中适当进行百分号编码。",
        "apiwarn-compare-nocontentmodel": "没有可以定义的模型,假定为$1。",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd>已弃用。请改用<kbd>prop=deletedrevisions</kbd>或<kbd>list=alldeletedrevisions</kbd>。",
-       "apiwarn-deprecation-expandtemplates-prop": "因为没有为<var>prop</var>参数指定值,所以在输出上使用了遗留格式。这种格式已弃用,并且将来会为<var>prop</var>参数设置默认值,这会导致新格式总会被使用。",
        "apiwarn-deprecation-httpsexpected": "当应为HTTPS时,HTTP被使用。",
        "apiwarn-deprecation-login-botpw": "通过<kbd>action=login</kbd>的主账户登录已被弃用,并可能在未事先警告的情况下停止工作。要继续通过<kbd>action=login</kbd>登录,请参见[[Special:BotPasswords]]。要安全继续使用主账户登录,请参见<kbd>action=clientlogin</kbd>。",
        "apiwarn-deprecation-login-nobotpw": "通过<kbd>action=login</kbd>的主账户登录已被弃用,并可能在未事先警告的情况下停止工作。要安全登录,请参见<kbd>action=clientlogin</kbd>。",
        "apiwarn-deprecation-login-token": "通过<kbd>action=login</kbd>取得令牌已弃用。请改用<kbd>action=query&meta=tokens&type=login</kbd>。",
+       "apiwarn-deprecation-missingparam": "因为未指定<var>$1</var>,输出已使用既往格式。此格式已弃用,并且今后将总是使用新格式。",
        "apiwarn-deprecation-parameter": "参数<var>$1</var>已被弃用。",
        "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd>从MediaWiki 1.28版开始已弃用。在创建新HTML文档时请使用<kbd>prop=headhtml</kbd>,或当更新文档客户端时请使用<kbd>prop=modules|jsconfigvars</kbd>。",
        "apiwarn-deprecation-purge-get": "通过GET使用<kbd>action=purge</kbd>已弃用。请改用POST。",
index 5beef31..21947d2 100644 (file)
@@ -25,6 +25,8 @@
  * @author Daniel Kinzler
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Content object for wiki text pages.
  *
@@ -182,7 +184,7 @@ class WikitextContent extends TextContent {
                        return $this->redirectTargetAndText;
                }
 
-               $redir = MagicWord::get( 'redirect' );
+               $redir = MediaWikiServices::getInstance()->getMagicWordFactory()->get( 'redirect' );
                $text = ltrim( $this->getNativeData() );
                if ( $redir->matchStartAndRemove( $text ) ) {
                        // Extract the first link and see if it's usable
index 9c26ae1..ab157f5 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup Content
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Content handler for wiki text pages.
  *
@@ -60,7 +62,7 @@ class WikitextContentHandler extends TextContentHandler {
                        }
                }
 
-               $mwRedir = MagicWord::get( 'redirect' );
+               $mwRedir = MediaWikiServices::getInstance()->getMagicWordFactory()->get( 'redirect' );
                $redirectText = $mwRedir->getSynonym( 0 ) .
                        ' [[' . $optionalColon . $destination->getFullText() . ']]';
 
index 74c446f..1bcbd30 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup JobQueue
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Job to fix double redirects after moving a page
  *
@@ -116,7 +118,7 @@ class DoubleRedirectJob extends Job {
                }
 
                // Check for a suppression tag (used e.g. in periodically archived discussions)
-               $mw = MagicWord::get( 'staticredirect' );
+               $mw = MediaWikiServices::getInstance()->getMagicWordFactory()->get( 'staticredirect' );
                if ( $content->matchMagicWord( $mw ) ) {
                        wfDebug( __METHOD__ . ": skipping: suppressed with __STATICREDIRECT__\n" );
 
index ca44572..b0fd12a 100644 (file)
@@ -220,10 +220,6 @@ class DatabaseSqlite extends Database {
                return false;
        }
 
-       public function selectDB( $db ) {
-               return false; // doesn't make sense
-       }
-
        /**
         * @return string SQLite DB file path
         * @since 1.25
index 559ac87..f032efc 100644 (file)
@@ -144,7 +144,8 @@ class LogEventsList extends ContextSource {
                // Date menu
                $formDescriptor['date'] = [
                        'type' => 'date',
-                       'label-message' => 'date'
+                       'label-message' => 'date',
+                       'default' => sprintf( "%04d-%02d-%02d", $year, $month, $day ),
                ];
 
                // Tag filter
index 9eef728..51824d2 100644 (file)
@@ -81,14 +81,16 @@ abstract class ReverseChronologicalPager extends IndexPager {
                        return null;
                }
 
-               // Treat the given time in the wiki timezone and get a UTC timestamp for the database lookup
                $timestamp = self::getOffsetDate( $year, $month, $day );
-               $timestamp->setTimezone( $this->getConfig()->get( 'Localtimezone' ) );
 
                try {
-                       $this->mYear = (int)$timestamp->format( 'Y' );
-                       $this->mMonth = (int)$timestamp->format( 'm' );
-                       $this->mDay = (int)$timestamp->format( 'd' );
+                       // The timestamp used for DB queries is at midnight of the *next* day after the selected date.
+                       $selectedDate = new DateTime( $timestamp->getTimestamp( TS_ISO_8601 ) );
+                       $selectedDate = $selectedDate->modify( '-1 day' );
+
+                       $this->mYear = (int)$selectedDate->format( 'Y' );
+                       $this->mMonth = (int)$selectedDate->format( 'm' );
+                       $this->mDay = (int)$selectedDate->format( 'd' );
                        $this->mOffset = $this->mDb->timestamp( $timestamp->getTimestamp() );
                } catch ( TimestampException $e ) {
                        // Invalid user provided timestamp (T149257)
index 10da0b0..3c47de3 100644 (file)
@@ -171,7 +171,8 @@ class CoreParserFunctions {
        public static function urlencode( $parser, $s = '', $arg = null ) {
                static $magicWords = null;
                if ( is_null( $magicWords ) ) {
-                       $magicWords = new MagicWordArray( [ 'url_path', 'url_query', 'url_wiki' ] );
+                       $magicWords =
+                               $parser->getMagicWordFactory()->newArray( [ 'url_path', 'url_query', 'url_wiki' ] );
                }
                switch ( $magicWords->matchStartToEnd( $arg ) ) {
                        // Encode as though it's a wiki page, '_' for ' '.
@@ -296,9 +297,11 @@ class CoreParserFunctions {
         * @return string
         */
        public static function formatnum( $parser, $num = '', $arg = null ) {
-               if ( self::matchAgainstMagicword( 'rawsuffix', $arg ) ) {
+               if ( self::matchAgainstMagicword( $parser->getMagicWordFactory(), 'rawsuffix', $arg ) ) {
                        $func = [ $parser->getFunctionLang(), 'parseFormattedNumber' ];
-               } elseif ( self::matchAgainstMagicword( 'nocommafysuffix', $arg ) ) {
+               } elseif (
+                       self::matchAgainstMagicword( $parser->getMagicWordFactory(), 'nocommafysuffix', $arg )
+               ) {
                        $func = [ $parser->getFunctionLang(), 'formatNumNoSeparators' ];
                } else {
                        $func = [ $parser->getFunctionLang(), 'formatNum' ];
@@ -391,7 +394,8 @@ class CoreParserFunctions {
 
                static $magicWords = null;
                if ( is_null( $magicWords ) ) {
-                       $magicWords = new MagicWordArray( [ 'displaytitle_noerror', 'displaytitle_noreplace' ] );
+                       $magicWords = $parser->getMagicWordFactory()->newArray(
+                               [ 'displaytitle_noerror', 'displaytitle_noreplace' ] );
                }
                $arg = $magicWords->matchStartToEnd( $uarg );
 
@@ -475,16 +479,20 @@ class CoreParserFunctions {
        /**
         * Matches the given value against the value of given magic word
         *
+        * @param MagicWordFactory $magicWordFactory A factory to get the word from, e.g., from
+        *   $parser->getMagicWordFactory()
         * @param string $magicword Magic word key
         * @param string $value Value to match
         * @return bool True on successful match
         */
-       private static function matchAgainstMagicword( $magicword, $value ) {
+       private static function matchAgainstMagicword(
+               MagicWordFactory $magicWordFactory, $magicword, $value
+       ) {
                $value = trim( strval( $value ) );
                if ( $value === '' ) {
                        return false;
                }
-               $mwObject = MagicWord::get( $magicword );
+               $mwObject = $magicWordFactory->get( $magicword );
                return $mwObject->matchStartToEnd( $value );
        }
 
@@ -494,10 +502,18 @@ class CoreParserFunctions {
         * @param int|float $num
         * @param string $raw
         * @param Language|StubUserLang $language
+        * @param MagicWordFactory|null $magicWordFactory To evaluate $raw
         * @return string
         */
-       public static function formatRaw( $num, $raw, $language ) {
-               if ( self::matchAgainstMagicword( 'rawsuffix', $raw ) ) {
+       public static function formatRaw(
+               $num, $raw, $language, MagicWordFactory $magicWordFactory = null
+       ) {
+               if ( $raw !== null && !$magicWordFactory ) {
+                       $magicWordFactory = MediaWikiServices::getInstance()->getMagicWordFactory();
+               }
+               if (
+                       $raw !== null && self::matchAgainstMagicword( $magicWordFactory, 'rawsuffix', $raw )
+               ) {
                        return $num;
                } else {
                        return $language->formatNum( $num );
@@ -729,7 +745,7 @@ class CoreParserFunctions {
                global $wgContLang;
                static $magicWords = null;
                if ( is_null( $magicWords ) ) {
-                       $magicWords = new MagicWordArray( [
+                       $magicWords = $parser->getMagicWordFactory()->newArray( [
                                'pagesincategory_all',
                                'pagesincategory_pages',
                                'pagesincategory_subcats',
@@ -739,7 +755,7 @@ class CoreParserFunctions {
                static $cache = [];
 
                // split the given option to its variable
-               if ( self::matchAgainstMagicword( 'rawsuffix', $arg1 ) ) {
+               if ( self::matchAgainstMagicword( $parser->getMagicWordFactory(), 'rawsuffix', $arg1 ) ) {
                        // {{pagesincategory:|raw[|type]}}
                        $raw = $arg1;
                        $type = $magicWords->matchStartToEnd( $arg2 );
@@ -966,7 +982,8 @@ class CoreParserFunctions {
        public static function defaultsort( $parser, $text, $uarg = '' ) {
                static $magicWords = null;
                if ( is_null( $magicWords ) ) {
-                       $magicWords = new MagicWordArray( [ 'defaultsort_noerror', 'defaultsort_noreplace' ] );
+                       $magicWords = $parser->getMagicWordFactory()->newArray(
+                               [ 'defaultsort_noerror', 'defaultsort_noreplace' ] );
                }
                $arg = $magicWords->matchStartToEnd( $uarg );
 
index a0da0ae..2778ea6 100644 (file)
@@ -957,6 +957,16 @@ class Parser {
                return $this->mLinkRenderer;
        }
 
+       /**
+        * Get the MagicWordFactory that this Parser is using
+        *
+        * @since 1.32
+        * @return MagicWordFactory
+        */
+       public function getMagicWordFactory() {
+               return $this->magicWordFactory;
+       }
+
        /**
         * Replaces all occurrences of HTML-style comments and the given tags
         * in the text with a random marker and returns the next text. The output
@@ -2871,8 +2881,8 @@ class Parser {
                $variableIDs = $this->magicWordFactory->getVariableIDs();
                $substIDs = $this->magicWordFactory->getSubstIDs();
 
-               $this->mVariables = new MagicWordArray( $variableIDs );
-               $this->mSubstWords = new MagicWordArray( $substIDs );
+               $this->mVariables = $this->magicWordFactory->newArray( $variableIDs );
+               $this->mSubstWords = $this->magicWordFactory->newArray( $substIDs );
        }
 
        /**
@@ -5056,7 +5066,7 @@ class Parser {
                                unset( $paramMap['img_width'] );
                        }
 
-                       $mwArray = new MagicWordArray( array_keys( $paramMap ) );
+                       $mwArray = $this->magicWordFactory->newArray( array_keys( $paramMap ) );
 
                        $label = '';
                        $alt = '';
@@ -5175,7 +5185,8 @@ class Parser {
                                }
                        }
                        $this->mImageParams[$handlerClass] = $paramMap;
-                       $this->mImageParamsMagicArray[$handlerClass] = new MagicWordArray( array_keys( $paramMap ) );
+                       $this->mImageParamsMagicArray[$handlerClass] =
+                               $this->magicWordFactory->newArray( array_keys( $paramMap ) );
                }
                return [ $this->mImageParams[$handlerClass], $this->mImageParamsMagicArray[$handlerClass] ];
        }
index 5ea49ee..30f8295 100644 (file)
@@ -55,6 +55,11 @@ class ServiceContainer implements DestructibleService {
         */
        private $serviceInstantiators = [];
 
+       /**
+        * @var callable[][]
+        */
+       private $serviceManipulators = [];
+
        /**
         * @var bool[] disabled status, per service name
         */
@@ -151,6 +156,22 @@ class ServiceContainer implements DestructibleService {
                        $this->serviceInstantiators,
                        $newInstantiators
                );
+
+               $newManipulators = array_diff(
+                       array_keys( $container->serviceManipulators ),
+                       $skip
+               );
+
+               foreach ( $newManipulators as $name ) {
+                       if ( isset( $this->serviceManipulators[$name] ) ) {
+                               $this->serviceManipulators[$name] = array_merge(
+                                       $this->serviceManipulators[$name],
+                                       $container->serviceManipulators[$name]
+                               );
+                       } else {
+                               $this->serviceManipulators[$name] = $container->serviceManipulators[$name];
+                       }
+               }
        }
 
        /**
@@ -199,7 +220,7 @@ class ServiceContainer implements DestructibleService {
         * Define a new service. The service must not be known already.
         *
         * @see getService().
-        * @see replaceService().
+        * @see redefineService().
         *
         * @param string $name The name of the service to register, for use with getService().
         * @param callable $instantiator Callback that returns a service instance.
@@ -224,7 +245,9 @@ class ServiceContainer implements DestructibleService {
         *
         * @see defineService().
         *
-        * @note This causes any previously instantiated instance of the service to be discarded.
+        * @note This will fail if the service was already instantiated. If the service was previously
+        * disabled, it will be re-enabled by this call. Any manipulators registered for the service
+        * will remain in place.
         *
         * @param string $name The name of the service to register.
         * @param callable $instantiator Callback function that returns a service instance.
@@ -233,7 +256,8 @@ class ServiceContainer implements DestructibleService {
         *        Any extra instantiation parameters provided to the constructor will be
         *        passed as subsequent parameters when invoking the instantiator.
         *
-        * @throws RuntimeException if $name is not a known service.
+        * @throws NoSuchServiceException if $name is not a known service.
+        * @throws CannotReplaceActiveServiceException if the service was already instantiated.
         */
        public function redefineService( $name, callable $instantiator ) {
                Assert::parameterType( 'string', $name, '$name' );
@@ -250,6 +274,46 @@ class ServiceContainer implements DestructibleService {
                unset( $this->disabled[$name] );
        }
 
+       /**
+        * Add a service manipulator callback for the given service.
+        * This method may be used by extensions that need to wrap, replace, or re-configure a
+        * service. It would typically be called from a MediaWikiServices hook handler.
+        *
+        * The manipulator callback is called just after the service is instantiated.
+        * It can call methods on the service to change configuration, or wrap or otherwise
+        * replace it.
+        *
+        * @see defineService().
+        * @see redefineService().
+        *
+        * @note This will fail if the service was already instantiated.
+        *
+        * @since 1.32
+        *
+        * @param string $name The name of the service to manipulate.
+        * @param callable $manipulator Callback function that manipulates, wraps or replaces a
+        * service instance. The callback receives the new service instance and this the
+        * ServiceContainer as parameters, as well as any extra instantiation parameters specified
+        * when constructing this ServiceContainer. If the callback returns a value, that
+        * value replaces the original service instance.
+        *
+        * @throws NoSuchServiceException if $name is not a known service.
+        * @throws CannotReplaceActiveServiceException if the service was already instantiated.
+        */
+       public function addServiceManipulator( $name, callable $manipulator ) {
+               Assert::parameterType( 'string', $name, '$name' );
+
+               if ( !$this->hasService( $name ) ) {
+                       throw new NoSuchServiceException( $name );
+               }
+
+               if ( isset( $this->services[$name] ) ) {
+                       throw new CannotReplaceActiveServiceException( $name );
+               }
+
+               $this->serviceManipulators[$name][] = $manipulator;
+       }
+
        /**
         * Disables a service.
         *
@@ -359,6 +423,23 @@ class ServiceContainer implements DestructibleService {
                                $this,
                                ...$this->extraInstantiationParams
                        );
+
+                       if ( isset( $this->serviceManipulators[$name] ) ) {
+                               foreach ( $this->serviceManipulators[$name] as $callback ) {
+                                       $ret = call_user_func_array(
+                                               $callback,
+                                               array_merge( [ $service, $this ], $this->extraInstantiationParams )
+                                       );
+
+                                       // If the manipulator callback returns an object, that object replaces
+                                       // the original service instance. This allows the manipulator to wrap
+                                       // or fully replace the service.
+                                       if ( $ret !== null ) {
+                                               $service = $ret;
+                                       }
+                               }
+                       }
+
                        // NOTE: when adding more wiring logic here, make sure importWiring() is kept in sync!
                } else {
                        throw new NoSuchServiceException( $name );
index ddf52f1..b8dfc04 100644 (file)
@@ -189,6 +189,13 @@ class SpecialNewpages extends IncludableSpecialPage {
                $changed = $this->opts->getChangedValues();
                unset( $changed['offset'] ); // Reset offset if query type changes
 
+               // wfArrayToCgi(), called from LinkRenderer/Title, will not output null and false values
+               // to the URL, which would omit some options (T158504). Fix it by explicitly setting them
+               // to 0 or 1.
+               $changed = array_map( function ( $value ) {
+                       return $value ? '1' : '0';
+               }, $changed );
+
                $self = $this->getPageTitle();
                $linkRenderer = $this->getLinkRenderer();
                foreach ( $filters as $key => $msg ) {
@@ -281,7 +288,7 @@ class SpecialNewpages extends IncludableSpecialPage {
                                'div',
                                null,
                                $this->filterLinks()
-                       ) )
+                       ) . $hidden )
                        ->show();
                $out->addModuleStyles( 'mediawiki.special' );
        }
index fa2b983..9049d61 100644 (file)
        "group-autoconfirmed": "Avtotəsdiqlənmiş istifadəçilər",
        "group-bot": "Botlar",
        "group-sysop": "İdarəçilər",
+       "group-interface-admin": "İnterfeys idarəçiləri",
        "group-bureaucrat": "Bürokratlar",
        "group-suppress": "Gizlədənlər",
        "group-all": "(bütün)",
        "group-autoconfirmed-member": "Avtotəsdiqlənmiş istifadəçilər",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|idarəçi}}",
+       "group-interface-admin-member": "{{GENDER:$1|interfeys idarəçisi}}",
        "group-bureaucrat-member": "{{GENDER:$1|bürokrat}}",
        "group-suppress-member": "{{GENDER:$1|gizlədən}}",
        "grouppage-user": "{{ns:project}}:İstifadəçilər",
        "grouppage-autoconfirmed": "{{ns:project}}:Avtotəsdiqlənmiş istifadəçilər",
        "grouppage-bot": "{{ns:project}}:Botlar",
        "grouppage-sysop": "{{ns:project}}:İdarəçilər",
+       "grouppage-interface-admin": "{{ns:project}}:İnterfeys idarəçiləri",
        "grouppage-bureaucrat": "{{ns:project}}:Bürokratlar",
        "grouppage-suppress": "{{ns:project}}:Gizlədənlər",
        "right-read": "Səhifələrin oxunması",
index 15c6487..f0b219c 100644 (file)
        "customjsprotected": "Вы ня маеце правоў на рэдагаваньне гэтай старонкі JavaScript, таму што яна ўтрымлівае пэрсанальныя налады іншага ўдзельніка.",
        "sitecssprotected": "Вы ня маеце дазволу на рэдагаваньне гэтай CSS-старонкі, бо гэта можа паўплываць на ўсіх удзельнікаў",
        "sitejsonprotected": "Вы ня маеце дазволу на рэдагаваньне гэтай JSON-старонкі, бо гэта можа паўплываць на ўсіх удзельнікаў",
+       "sitejsprotected": "Вы ня маеце дазволу на рэдагаваньне гэтай JavaScript-старонкі, бо гэта можа паўплываць на ўсіх наведнікаў",
        "mycustomcssprotected": "Вы ня маеце дазволу рэдагаваць гэтую CSS-старонку.",
        "mycustomjsonprotected": "Вы ня маеце дазволу на рэдагаваньне гэтай JSON-старонкі.",
        "mycustomjsprotected": "Вы ня маеце дазволу рэдагаваць гэтую JavaScript-старонку.",
        "group-autoconfirmed": "Аўтаматычна пацьверджаныя ўдзельнікі",
        "group-bot": "Робаты",
        "group-sysop": "Адміністрацыя",
+       "group-interface-admin": "Адміністратары інтэрфэйсу",
        "group-bureaucrat": "Бюракраты",
        "group-suppress": "Падаўляльнікі вэрсіяў",
        "group-all": "(усе)",
index f8b9881..f07c2c3 100644 (file)
        "protectedpagetext": "সম্পাদনা অথবা অন্যান্য কাজে বাধা দিতে এই পাতাটিকে সুরক্ষিত করা হয়েছে।",
        "viewsourcetext": "আপনি এই পাতাটি দেখতে এবং উৎসের প্রতিলিপি করতে পারবেন।",
        "viewyourtext": "আপনি এই পাতায় করা <strong>আপনার সম্পাদনাগুলি</strong> দেখতে এবং প্রতিলিপি করতে পারেন।",
-       "protectedinterface": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦° à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦\8fà¦\87 à¦\89à¦\87à¦\95ি à¦¸à¦«à¦\9fà¦\93য়à§\8dযারà§\87র à¦\8fà¦\95à¦\9fি à¦\87নà§\8dà¦\9fারফà§\87স à¦¬à¦¾à¦°à§\8dতা à¦ªà§\8dরদান à¦\95রà§\87, à¦¤à¦¾à¦\87 à¦\8fà¦\9fি à¦¯à¦¾à¦¤à§\87 à¦\85পবà§\8dযবহারà§\87 à¦¨à¦¾ à¦\95রা à¦¹à¦¯à¦¼, à¦¸à§\87à¦\9cনà§\8dয à¦\8fà¦\9fিà¦\95à§\87 à¦¸à§\81রà¦\95à§\8dষিত à¦\95রà§\87 à¦°à¦¾à¦\96া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nসà¦\95ল à¦\89à¦\87à¦\95ির à¦\85নà§\81বাদà§\87 à¦\95à§\8bনà§\8b à¦§à¦°à¦¨à§\87র à¦¸à¦\82যà§\8bà¦\9cন à¦¬à¦¾ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87 à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ি স্থানীয়করণ প্রকল্প [https://translatewiki.net/ translatewiki.net] ব্যবহার করুন।",
+       "protectedinterface": "à¦\8fà¦\87 à¦\89à¦\87à¦\95িতà§\87 à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à¦«à¦\9fà¦\93য়à§\8dযারà§\87র à¦\9cনà§\8dয à¦\87নà§\8dà¦\9fারফà§\87সà§\87র à¦¬à¦¾à¦°à§\8dতা à¦¸à¦°à¦¬à¦°à¦¾à¦¹ à¦\95রà§\87, à¦¤à¦¾à¦\87 à¦\85পবà§\8dযবহার à¦°à§\8bধ à¦\95রার à¦\9cনà§\8dয à¦\8fà¦\9fিà¦\95à§\87 à¦¸à§\81রà¦\95à§\8dষিত à¦\95রà§\87 à¦°à¦¾à¦\96া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nসà¦\95ল à¦\89à¦\87à¦\95ির à¦\9cনà§\8dয à¦\85নà§\81বাদà§\87 à¦\95à§\8bনà§\8b à¦§à¦°à¦¨à§\87র à¦¸à¦\82যà§\8bà¦\9cন à¦¬à¦¾ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87, à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ির স্থানীয়করণ প্রকল্প [https://translatewiki.net/ translatewiki.net] ব্যবহার করুন।",
        "editinginterface": "<strong>সতর্ক বার্তা:</strong> আপনি এমন একটি পাতা সম্পাদনা করছেন যা সফটওয়্যারের জন্য ইন্টারফেস লেখা সরবরাহ করে।\nএই পাতাতে সংঘটিত পরিবর্তন এই উইকির অন্যান্য ব্যবহারকারীদের জন্য দৃশ্যমান ইন্টারফেসে প্রভাব ফেলবে।",
        "translateinterface": "সকল উইকির জন্য অনুবাদ যোগ বা পরিবর্তন করতে দয়া করে [https://translatewiki.net/ translatewiki.net], মিডিয়াউইকি স্থানীয়করণ প্রকল্প ব্যবহার করুন।",
        "cascadeprotected": "এই পাতাটিকে সম্পাদনা করা থেকে সুরক্ষিত করা হয়েছে, কারণ এটি নিম্নোক্ত {{PLURAL:$1|পাতায়|পাতাগুলিতে}} অন্তর্ভুক্ত, {{PLURAL:$1|যেটি|যেগুলি}} \"প্রপাতাকার\" বৈশিষ্ট্য সহযোগে সুরক্ষিত করা আছে:\n$2",
        "customcssprotected": "আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
        "customjsonprotected": "আপনার এই JSON পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এই পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
        "customjsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
+       "sitecssprotected": "আপনার এই CSS পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এটি সমস্ত পরিদর্শককে প্রভাবিত করতে পারে",
+       "sitejsonprotected": "আপনার এই JSON পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এটি সমস্ত পরিদর্শককে প্রভাবিত করতে পারে",
+       "sitejsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এটি সমস্ত পরিদর্শককে প্রভাবিত করতে পারে",
        "mycustomcssprotected": "আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই।",
        "mycustomjsonprotected": "আপনার এই JSON পাতাটি সম্পাদনা করার অনুমতি নেই।",
        "mycustomjsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই।",
        "diff-paragraph-moved-toold": "অনুচ্ছেদ স্থানান্তর করা হয়েছে। পুরনো অবস্থানে যাওয়ার জন্য ক্লিক করুন।",
        "difference-missing-revision": "এই পার্থক্যের ($1) অন্তর্গত {{PLURAL:$2|একটি সংশোধিত সংস্করণ|$2টি সংশোধিত সংস্করণ}} খুঁজে পাওয়া যাচ্ছে না।\n\nসাধারণত মুছে ফেলা হয়েছে এমন পাতার মেয়াদ উত্তীর্ণ ইতিহাস পাতার লিংক খোলার কারণে এটি হতে পারে। \n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} পাতা অবলুপ্তি লগে] বিস্তারিত তথ্য জানা যাবে।",
        "searchresults": "অনুসন্ধানের ফলাফল",
+       "search-filter-title-prefix": "শুধুমাত্র \"$1\" শিরোনাম দিয়ে শুরু হওয়া পাতাগুলি খোঁজা হচ্ছে",
        "search-filter-title-prefix-reset": "সব পাতা অনুসন্ধান করুন",
        "searchresults-title": "\"$1\" অনুসন্ধানের ফলাফল",
        "titlematches": "নিবন্ধের শিরোনাম মিলেছে",
        "group-autoconfirmed": "স্বয়ংনিশ্চিতকৃত ব্যবহারকারী",
        "group-bot": "বট",
        "group-sysop": "প্রশাসক",
+       "group-interface-admin": "ইন্টারফেস প্রশাসক",
        "group-bureaucrat": "ব্যুরোক্র্যাট",
        "group-suppress": "দমনকারী",
        "group-all": "(সমস্ত)",
        "group-autoconfirmed-member": "{{GENDER:$1|স্বয়ংনিশ্চিতকৃত ব্যবহারকারী}}",
        "group-bot-member": "বট",
        "group-sysop-member": "প্রশাসক",
+       "group-interface-admin-member": "{{GENDER:$1|ইন্টারফেস প্রশাসক}}",
        "group-bureaucrat-member": "ব্যুরোক্র্যাট",
        "group-suppress-member": "{{GENDER:$1|দমনকারী}}",
        "grouppage-user": "{{ns:project}}:ব্যবহারকারী",
        "grouppage-autoconfirmed": "{{ns:project}}:স্বয়ংক্রিয়ভাবে নিশ্চিতকৃত ব্যবহারকারী",
        "grouppage-bot": "{{ns:project}}:বট",
        "grouppage-sysop": "{{ns:project}}:প্রশাসক",
+       "grouppage-interface-admin": "{{ns:project}}:ইন্টারফেস প্রশাসক",
        "grouppage-bureaucrat": "{{ns:project}}:ব্যুরোক্র্যাট",
        "grouppage-suppress": "{{ns:project}}:দমনকারী",
        "right-read": "যেকোন পাতা পড়া",
-       "right-edit": "পাতা সম্পাদনা করা",
+       "right-edit": "পাতাগুলি সম্পাদনা করা",
        "right-createpage": "আলাপ পাতা নয়, এমন পাতা তৈরি করা",
        "right-createtalk": "আলাপ পাতা তৈরি করা",
        "right-createaccount": "নতুন ব্যবহারকারীর অ্যাকাউন্ট তৈরি করুন",
        "right-editusercss": "অন্য ব্যবহারকারীগণের CSS ফাইল সম্পাদনা",
        "right-edituserjson": "অন্য ব্যবহারকারীগণের JSON ফাইল সম্পাদনা",
        "right-edituserjs": "অন্য ব্যবহারকারীগণের JS ফাইল সম্পাদনা",
+       "right-editsitecss": "সাইটব্যাপী CSS সম্পাদনা করা",
+       "right-editsitejson": "সাইটব্যাপী JSON সম্পাদনা করা",
+       "right-editsitejs": "সাইটব্যাপী জাভাস্ক্রিপ্ট সম্পাদনা করা",
        "right-editmyusercss": "আপনার নিজস্ব ব্যবহারকারী সিএসএস ফাইল সম্পাদনা করুন",
        "right-editmyuserjson": "আপনার নিজস্ব ব্যবহারকারী JSON ফাইল সম্পাদনা করা",
        "right-editmyuserjs": "আপনার নিজস্ব ব্যবহারকারী জাভাস্ক্রিপ্ট ফাইল সম্পাদনা করুন",
        "grant-createaccount": "অ্যাকাউন্ট তৈরি করুন",
        "grant-createeditmovepage": "পাতা তৈরি, সম্পাদনা এবং স্থানান্তর করুন",
        "grant-delete": "পাতা, পুনর্বিবেচনা ও লগ ভুক্তিসমূহ মুছে ফেলুন।",
-       "grant-editinterface": "মিডিয়াà¦\89à¦\87à¦\95ি à¦¨à¦¾à¦®à¦¸à§\8dথান à¦\8fবà¦\82 à¦¬à§\8dযবহারà¦\95ারà§\80র à¦¸à¦¿à¦\8fসà¦\8fস/JSON/à¦\9cাভাসà§\8dà¦\95à§\8dরিপà§\8dà¦\9f সম্পাদনা করে",
+       "grant-editinterface": "মিডিয়াà¦\89à¦\87à¦\95ি à¦¨à¦¾à¦®à¦¸à§\8dথান à¦\8fবà¦\82 à¦¸à¦¾à¦\87à¦\9fবà§\8dযাপà§\80/বà§\8dযবহারà¦\95ারà§\80র JSON সম্পাদনা করে",
        "grant-editmycssjs": "আপনার ব্যবহারকারী সিএসএস/জেএসওএন/জাভাস্ক্রিপ্ট সম্পাদনা করুন",
        "grant-editmyoptions": "আপনার ব্যবহারকারী পছন্দসমূহ সম্পাদনা করুন",
        "grant-editmywatchlist": "আপনার নজরতালিকা সম্পাদনা করুন",
+       "grant-editsiteconfig": "সাইটব্যাপী ও ব্যবহারকারীর CSS/JS সম্পাদনা করা",
        "grant-editpage": "বিদ্যমান পাতা সম্পাদনা করুন",
        "grant-editprotected": "সংরক্ষিত পাতা সম্পাদনা করুন",
        "grant-highvolume": "উচ্চ-মাত্রার সম্পাদনা",
        "recentchanges-page-removed-from-category": "বিষয়শ্রেণী থেকে [[:$1]] সরানো হয়েছে",
        "recentchanges-page-removed-from-category-bundled": "বিষয়শ্রেণীতে [[:$1]] সরানো হয়েছে, [[Special:WhatLinksHere/$1|এই পাতাটি অন্য পাতাগুলির মধ্যে অন্তর্ভুক্তকৃত]]",
        "autochange-username": "মিডিয়াউইকি স্বয়ংক্রিয় পরিবর্তন",
-       "upload": "আপলোড",
+       "upload": "আপলোড করুন",
        "uploadbtn": "ফাইল আপলোড করুন",
        "reuploaddesc": "আপলোড বাতিল করুন এবং আপলোড ফর্মে ফেরত যান",
        "upload-tryagain": "পরিবর্তিত ফাইল বর্ণনা জমা দিন",
        "uploadstash-zero-length": "ফাইলটির দৈর্ঘ্য শূন্য।",
        "invalid-chunk-offset": "ত্রুটিপূর্ণ চাংক অফসেট",
        "img-auth-accessdenied": "প্রবেশাধিকার নাই",
-       "img-auth-nopathinfo": "PATH_INFO পাওয়া যাচ্ছে না।\nআপনার সার্ভার থেকে এই তথ্য পাঠানোর জন্য কনফিগার করা হয়নি।\nএটি হয়তো CGI ভিত্তিক এবং img_auth সমর্থন করে না।\nবিস্তারিত দেখুন https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization।",
+       "img-auth-nopathinfo": "পথের তথ্য পাওয়া যাচ্ছে না।\nআপনার সার্ভার অবশ্যই REQUEST_URI ও/বা PATH_INFO চলক অতিক্রম করাতে সমর্থ হতে হবে।\nযদি এটি তাই হয়, তবে $wgUsePathInfo সক্রিয় করার চেষ্টা করুন।\nবিস্তারিত জানতে https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization দেখুন।",
        "img-auth-notindir": "অনুরোধকৃত পাথটি কনফিগার করা আপলোড ডিরেক্টরী নয়।",
        "img-auth-badtitle": "\"$1\" থেকে একটি সঠিক শিরনাম তৈরী করা যাচ্ছে না।",
        "img-auth-nologinnWL": "আপনি প্রবেশ করেননি এবং \"$1\" নজরতালিকায় নেই।",
        "tooltip-ca-history": "এই পাতার পুরনো সংস্করণগুলি",
        "tooltip-ca-protect": "এই পাতাকে সুরক্ষিত করো",
        "tooltip-ca-unprotect": "এই পাতার সুরক্ষা পরিবর্তন করো",
-       "tooltip-ca-delete": "পাতাà¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লà§\8b",
+       "tooltip-ca-delete": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\85পসারণ à¦\95রà§\81ন",
        "tooltip-ca-undelete": "পাতাটি অপসারণের আগে যে সম্পাদনাগুলি করা হয়েছিল সেগুলি উদ্ধার করা হোক",
        "tooltip-ca-move": "পাতাটি স্থানান্তর করুন",
        "tooltip-ca-watch": "এই পাতাটি আপনার নজরতালিকায় যোগ করুন",
index 21e3132..2913625 100644 (file)
        "rcfilters-liveupdates-button-title-off": "Керла хийцамаш ма-бинехь гайта",
        "rcfilters-preference-label": "Керла хийцамийн дика кечйина верси къайлаяккха",
        "rcfilters-preference-help": "2017 шеран интерфейсан редизайн а, оцу хенахь дуьйна тӀетоьхна гӀирсаш а къайлайоху.",
+       "rcfilters-watchlist-preference-label": "Дика кечбина тергаме могӀам къайлабаккха",
+       "rcfilters-watchlist-preference-help": "ДӀайоху 2017 шеран интерфейсан редизайн, а оцу хенахь а, цул тӀехьа а тӀетоьхна болу гӀирсаш а.",
        "rcfilters-filter-showlinkedfrom-label": "Хьажоргаш йолучу агӀонашна тӀехь нисдарш гайта",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Хаьржиначунна хьажоргаш йолу агӀонаш</strong>",
        "rcfilters-filter-showlinkedto-label": "Хьажоргаш йолучу агӀонашна тӀехь нисдарш гайта",
index cf485b7..1e84913 100644 (file)
        "group-autoconfirmed": "بەکارھێنەرە خۆبەخۆ پەسندکراوەکان",
        "group-bot": "بۆتەکان",
        "group-sysop": "بەڕێوەبەران",
+       "group-interface-admin": "بەڕێوەبەرانی ڕووکار",
        "group-bureaucrat": "بیوروکراتەکان",
        "group-suppress": "چاودێرەکان",
        "group-all": "(ھەموو)",
        "grouppage-autoconfirmed": "{{ns:project}}:بەکارھێنەرە خۆبەخۆ پەسندکراوەکان",
        "grouppage-bot": "{{ns:project}}:بۆت",
        "grouppage-sysop": "{{ns:project}}:بەڕێوەبەران",
+       "grouppage-interface-admin": "{{ns:project}}:بەڕێوەبەرانی ڕووکار",
        "grouppage-bureaucrat": "{{ns:project}}:بیوروکراتەکان",
        "grouppage-suppress": "{{ns:project}}:چاودێر",
        "right-read": "خوێندنەوەی پەڕەکان",
        "uctop": "(ھەنووکە)",
        "month": "لە مانگی (و پێشترەوە):",
        "year": "لە ساڵی (و پێشترەوە):",
+       "date": "لە ڕێکەوتی (و پێشترەوە)",
        "sp-contributions-newbies": "تەنیا بەشدارییەکانی ھەژمارە نوێکان نیشان بدە",
        "sp-contributions-newbies-sub": "بۆ ھەژمارە نوێکان",
        "sp-contributions-newbies-title": "بەشدارییەکانی بەکارھێنەر بۆ ھەژمارە نوێکان",
        "date-range-to": "بۆ ڕێکەوتی:",
        "log-action-filter-block": "جۆری بلۆک:",
        "log-action-filter-contentmodel": "جۆری گۆڕینی مۆدێلی ناوەڕۆک:",
+       "log-action-filter-delete": "جۆری سڕینەوە:",
        "log-action-filter-all": "ھەموو",
        "log-action-filter-upload-upload": "بارکردنی نوێ",
        "authmanager-email-label": "ئیمەیڵ"
index eee6de0..7e824a6 100644 (file)
        "edit-error-long": "Chyby:\n\n$1",
        "revid": "revize $1",
        "pageid": "Stránka s ID $1",
+       "interfaceadmin-info": "$1\n\nOprávnění editovat celoprojektové soubory s CSS/JS/JSON bylo nedávno odděleno od práva <code>editinterface</code>. Pokud nerozumíte tomu, proč vidíte tuto chybu, podívejte se na [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "Značky &lt;html&gt; nelze používat mimo běžné stránky.",
        "gotointerwiki": "Opustit {{GRAMMAR:4sg|{{SITENAME}}}}",
        "gotointerwiki-invalid": "Zadaný název je neplatný.",
index c139ebb..8d4d08d 100644 (file)
        "cachedspecial-refresh-now": "Aktuelle Version ansehen.",
        "categories": "Kategorien",
        "categories-submit": "Anzeigen",
-       "categoriespagetext": "Folgende {{PLURAL:$1|Kategorie enthält|Kategorien enthalten}} Seiten oder Dateien.\n[[Special:UnusedCategories|Verwaiste Kategorien]] werden hier nicht aufgeführt.\nSiehe auch die Liste der [[Special:WantedCategories|gewünschten Kategorien]].",
+       "categoriespagetext": "Die {{PLURAL:$1|folgende Kategorie ist|folgenden Kategorien sind}} auf dem Wiki vorhanden und {{PLURAL:$1|könnte|könnten}} verwendet werden oder nicht.\nSiehe auch die Liste der [[Special:WantedCategories|gewünschten Kategorien]].",
        "categoriesfrom": "Zeige Kategorien ab:",
        "deletedcontributions": "Gelöschte Beiträge",
        "deletedcontributions-title": "Gelöschte Beiträge",
        "edit-error-long": "Fehler:\n\n$1",
        "revid": "Version $1",
        "pageid": "Seitenkennung $1",
+       "interfaceadmin-info": "$1\n\nBerechtigungen für das Bearbeiten von wikiweiten CSS/JS/JSON-Dateien wurden kürzlich von dem Recht <code>editinterface</code> getrennt. Falls du nicht verstehst, warum du diesen Fehler erhältst, siehe bitte [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "&lt;html&gt;-Tags können nicht außerhalb von normalen Seiten verwendet werden.",
        "gotointerwiki": "{{SITENAME}} verlassen",
        "gotointerwiki-invalid": "Der angegebene Titel ist ungültig.",
index a9bd1f5..0948136 100644 (file)
        "categories": "Categories",
        "categories-summary": "",
        "categories-submit": "Show",
-       "categoriespagetext": "The following {{PLURAL:$1|category contains|categories contain}} pages or media.\n[[Special:UnusedCategories|Unused categories]] are not shown here.\nAlso see [[Special:WantedCategories|wanted categories]].",
+       "categoriespagetext": "The following {{PLURAL:$1|category exists|categories exist}} on the wiki, and may or may not be unused.\nAlso see [[Special:WantedCategories|wanted categories]].",
        "categoriesfrom": "Display categories starting at:",
        "deletedcontributions": "Deleted user contributions",
        "deletedcontributions-summary": "",
        "edit-error-long": "Errors:\n\n$1",
        "revid": "revision $1",
        "pageid": "page ID $1",
+       "interfaceadmin-info": "$1\n\nPermissions for editing of sitewide CSS/JS/JSON files were recently separated from the <code>editinterface</code> right. If you do not understand why you are getting this error, see [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "&lt;html&gt; tags cannot be used outside of normal pages.",
        "gotointerwiki": "Leaving {{SITENAME}}",
        "gotointerwiki-invalid": "The specified title is invalid.",
index 5b31d45..e425e94 100644 (file)
        "undo-failure": "Ezin izan da aldaketa desegin tarteko aldaketekin gatazkak direla-eta.",
        "undo-main-slot-only": "Aldaketa ezin da desegin, slot nagusitik kanpoko edukia daukalako.",
        "undo-norev": "Aldaketa ezin da desegin ez delako existitzen edo ezabatu zutelako.",
-       "undo-nochange": "Aldaketa hau honezkero desegin da.",
+       "undo-nochange": "Aldaketa hau dagoeneko desegin da.",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|eztabaida]]) wikilariaren $1 berrikuspena desegin da",
        "undo-summary-username-hidden": "Deuseztatu ezkutuko erabiltzaile batek egindako $1 berrikusketa",
        "cantcreateaccount-text": "IP helbide honetatik ('''$1''') kontu berria sortzeko aukera blokeatu du [[User:$3|$3]](e)k.\n\n$3(e)k emandako arrazoia: ''$2''",
index e853143..a7aaabe 100644 (file)
        "rcfilters-filter-humans-description": "ویرایش توسط انسان.",
        "rcfilters-filtergroup-reviewstatus": "وضعیت بازبینی",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "گشت‌نخورده",
+       "rcfilters-filter-reviewstatus-manual-label": "به طور دستی گشت خورد",
        "rcfilters-filtergroup-significance": "اهمیت",
        "rcfilters-filter-minor-label": "ویرایش‌های جزئی",
        "rcfilters-filter-minor-description": "ویرایش‌هایی که به عنوان جزئی برچسب خورده‌اند.",
index 199787d..92d6ee5 100644 (file)
        "edit-error-long": "Erreurs :\n\n$1",
        "revid": "version $1",
        "pageid": "ID de page $1",
+       "interfaceadmin-info": "$1\n\nLes droits pour modifier les fichiers CSS/JS/JSON globaux au site ont été récemment séparés du droit <code>editinterface</code>. Si vous ne comprenez pas pourquoi vous avez cette erreur, voyez [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "Les balises &lt;html&gt; ne peuvent pas être utilisées en dehors des pages normales.",
        "gotointerwiki": "Quitter {{SITENAME}}",
        "gotointerwiki-invalid": "Le titre spécifié n’est pas valide.",
index 5b124c7..bb27dcc 100644 (file)
        "edit-error-long": "שגיאות:\n\n$1",
        "revid": "גרסה $1",
        "pageid": "מזהה דף $1",
+       "interfaceadmin-info": "$1\n\nההרשאות לעריכה של קובצי CSS/JS/JSON עבור כל האתר הופרדו לאחרונה מההרשאה <code>editinterface</code>. אם לא ברור לך מדוע קיבלת את השגיאה הזאת, ר' [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "לא ניתן להשתמש בתגיות &lt;html&gt; מחוץ לדפים רגילים.",
        "gotointerwiki": "עזיבת {{SITENAME}}",
        "gotointerwiki-invalid": "הכותרת שצוינה אינה תקינה.",
index dc678af..938791d 100644 (file)
        "group-autoconfirmed": "Automatski potvrđeni suradnici",
        "group-bot": "Botovi",
        "group-sysop": "Administratori",
+       "group-interface-admin": "Administratori sučelja",
        "group-bureaucrat": "Birokrati",
        "group-suppress": "Otajnici",
        "group-all": "(svi)",
        "group-autoconfirmed-member": "{{GENDER:$1|automatski potvrđeni suradnik|automatski potvrđena suradnica}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrator|administratorica}}",
+       "group-interface-admin-member": "{{GENDER:$1|administrator sučelja|administratorica sučelja}}",
        "group-bureaucrat-member": "{{GENDER:$1|birokrat|birokratica}}",
        "group-suppress-member": "{{GENDER:$1|otajnik|otajnica}}",
        "grouppage-user": "{{ns:project}}:Suradnici",
        "grouppage-autoconfirmed": "{{ns:project}}:automatski potvrđeni suradnici",
        "grouppage-bot": "{{ns:project}}:Botovi",
        "grouppage-sysop": "{{ns:project}}:Administratori",
+       "grouppage-interface-admin": "{{ns:project}}:Administratori sučelja",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrati",
        "grouppage-suppress": "{{ns:project}}:Otajnost",
        "right-read": "Čitanje stranica",
index 90cbf86..a5c4009 100644 (file)
        "editundo": "Յետարկել",
        "diff-empty": "(Տարբերութիւն չկայ)",
        "diff-multi-sameuser": "(նոյն մասնակիցի ցոյց չտրուած {{PLURAL:$1|մէկ միջանկեալ խմբագրում|$1 միջանկեալ խմբագրումներ}})",
-       "diff-multi-otherusers": "(նոյն մասնակիցի ցոյց չտրուած {{PLURAL:$1|մէկ միջանկեալ վերանայում|$1 միջանկեալ վերանայումներ}})",
+       "diff-multi-otherusers": "(նոյն մասնակիցի ցոյց չտրուած {{PLURAL:$1|մէկ միջանկեալ վերանայում|$2 միջանկեալ վերանայումներ}})",
        "searchresults": "Որոնման արդիւնքներ",
        "searchresults-title": "«$1»-ի որոնման արդիւնքները",
        "prevn": "նախորդ {{PLURAL:$1|$1}}",
        "recentchangeslinked-feed": "Առնչուած փոփոխութիւններ",
        "recentchangeslinked-toolbox": "Առնչուող փոփոխութիւններ",
        "recentchangeslinked-title": "«$1» էջին առնչուած փոփոխութիւնները",
-       "recentchangeslinked-summary": "Õ\86Õ·Õ¥Õ¬ Ô·Õ»Õ« Õ©Õ«Ö\82Õ¨ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬Õ¸Ö\82 Õ°Õ¡Õ´Õ¡Ö\80 Õ¡ÕµÕ¤ Õ§Õ»Õ«Õ¶ Õ¯Õ¡Õ´ Õ§Õ»Õ§Õ¶ ÕµÕ²Õ¸Ö\82Õ¸Õ² Ö\83Õ¸Ö\83Õ¸Õ­Õ¸Ö\82Õ©Õ«Ö\82Õ¶Õ¶Õ¥Ö\80Õ¨Ö\89 (Õ\8dÕ¿Õ¸Ö\80Õ¸Õ£Õ¸Ö\82Õ©Õ¥Õ¡Õ¶ Õ´Õ¨ Õ¡Õ¶Õ¤Õ¡Õ´Õ¶Õ¥Ö\80Õ¨ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬Õ¸Ö\82 Õ°Õ¡Õ´Õ¡Ö\80, Õ¶Õ·Õ¥Õ¬ {{ns:category}}:Õ\8dÕ¿Õ¸Ö\80Õ¸Õ£Õ¸Ö\82Õ©Õ¥Õ¡Õ¶ Õ¡Õ¶Õ¸Ö\82Õ¶Õ¨))Ö\89\n[[Special:Õ\80Õ½Õ¯Õ¸Õ²Õ¸Ö\82Õ©Õ¥Õ¡Õ¶ Ö\81Õ¡Õ¶Õ¯|Õ±Õ¥Ö\80 Õ°Õ½Õ¯Õ¸Õ²Õ¸Ö\82Õ©Õ¥Õ¡Õ¶ Ö\81Õ¡Õ¶Õ¯]]Õ« Õ§Õ»Õ«Õ¶ Õ¾Ö\80Õ¡Õµ Õ£Õ¿Õ¶Õ¸Ö\82Õ¸Õ² Ö\83Õ¸Ö\83Õ¸Õ­Õ¸Ö\82Õ©Õ«Ö\82Õ¶Õ¶Õ¥Ö\80Õ¨ <strong>Õ·Õ¥Õ·Õ¿Õ¸Ö\82Õ¡Õ® Õ¿Õ¡Õ¼Õ¥Ö\80Õ¸Õ¾</strong> Õ¥Õ¶։",
+       "recentchangeslinked-summary": "Õ\86Õ·Õ¥Õ¬ Ô·Õ»Õ« Õ©Õ«Ö\82Õ¨ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬Õ¸Ö\82 Õ°Õ¡Õ´Õ¡Ö\80 Õ¡ÕµÕ¤ Õ§Õ»Õ«Õ¶ Õ¯Õ¡Õ´ Õ§Õ»Õ§Õ¶ ÕµÕ²Õ¸Ö\82Õ¸Õ² Ö\83Õ¸Ö\83Õ¸Õ­Õ¸Ö\82Õ©Õ«Ö\82Õ¶Õ¶Õ¥Ö\80Õ¨Ö\89 (Õ\8dÕ¿Õ¸Ö\80Õ¸Õ£Õ¸Ö\82Õ©Õ¥Õ¡Õ¶ Õ´Õ¨ Õ¡Õ¶Õ¤Õ¡Õ´Õ¶Õ¥Ö\80Õ¨ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬Õ¸Ö\82 Õ°Õ¡Õ´Õ¡Ö\80, Õ¶Õ·Õ¥Õ¬ {{ns:category}}:Õ\8dÕ¿Õ¸Ö\80Õ¡Õ£Õ¸Ö\82Õ©Õ¥Õ¡Õ¶ Õ¡Õ¶Õ¸Ö\82Õ¶Õ¨))Ö\89\n[[Special:Õ\80Õ½Õ¯Õ¸Õ²Õ¸Ö\82Õ©Õ¥Õ¡Õ¶ Ö\81Õ¡Õ¶Õ¯|Õ±Õ¥Ö\80 Õ°Õ½Õ¯Õ¸Õ²Õ¸Ö\82Õ©Õ¥Õ¡Õ¶ Ö\81Õ¡Õ¶Õ¯]]Õ« Õ§Õ»Õ«Õ¶ Õ¾Ö\80Õ¡Õµ Õ£Õ¿Õ¶Õ¸Ö\82Õ¸Õ² Ö\83Õ¸Ö\83Õ¸Õ­Õ¸Ö\82Õ©Õ«Ö\82Õ¶Õ¶Õ¥Ö\80Õ¨ <strong>Õ·Õ¥Õ·Õ¿Õ¸Ö\82Õ¡Õ® Õ¿Õ¡Õ¼Õ¥Ö\80Õ¸Õ¾ Õ¥Õ¶</strong>։",
        "recentchangeslinked-page": "Էջին անունը՝",
        "recentchangeslinked-to": "Փոխարէնը ցոյց տալ տուեալ էջին առնչուած էջերուն մէջ կատարուած փոփոխութիւնները։",
        "upload": "Վերբեռնել նիշք",
        "watchlisttools-raw": "Խմբագրել հում հսկողութեան ցանկը",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|քննարկում]])",
        "redirect": "Վերայղում նիշքի, մասնակիցի, էջի, տարբերակի կամ տեղեկատետրի ինքնութեան համարէն",
-       "redirect-summary": "Այս յատուկ էջը կը վերայղուի նիշքի մը (տրուած ըլլալով նիշքին անունը), էջի մը (տրուած ըլլալով վերանայման կամ էջի ինքնութեան համարը), մասնակիցի էջի մը .տրուած ըլլալով մասնակիցի մը թուային ինքնութեան համարը), եւ կամ տեղեկատետրի մը մէջ տողի մը, (տրուած ըլլալով տեղեկատետրի ինքնութեան համարը)։ Գործածութիւն՝  [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].",
+       "redirect-summary": "Այս յատուկ էջը կը վերայղուի նիշքի մը (տրուած ըլլալով նիշքին անունը), էջի մը (տրուած ըլլալով վերանայման կամ էջի ինքնութեան համարը), մասնակիցի էջի մըտրուած ըլլալով մասնակիցի մը թուային ինքնութեան համարը), եւ կամ տեղեկատետրի մը մէջ տողի մը, (տրուած ըլլալով տեղեկատետրի ինքնութեան համարը)։ Գործածութիւն՝  [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Յառաջ",
        "redirect-lookup": "Որոնում՝",
        "redirect-value": "Արժէք՝",
index 9b87ad7..e54666d 100644 (file)
        "thu": "ера",
        "fri": "пIаьраска",
        "sat": "шоатта",
-       "january": "АгIой",
-       "february": "Саь-кур",
-       "march": "Мутт-хьал",
-       "april": "Тушоли",
-       "may_long": "Села",
-       "june": "Этинга",
+       "january": "АгIой ''(январь)''",
+       "february": "Саь-кур ''(февраль)''",
+       "march": "Мутт-хьал ''(март)''",
+       "april": "Тушол ''(апрель)''",
+       "may_long": "Села ''(май)''",
+       "june": "Этинга ''(июнь)''",
        "july": "Баьцамеа",
        "august": "Мяцхали",
        "september": "Михий",
        "october": "АьрхIий",
        "november": "Лай чилла",
        "december": "Чан-тар",
-       "january-gen": "АгIой",
-       "february-gen": "Саь-кур",
-       "march-gen": "Мутт-хьал",
-       "april-gen": "Тушоли",
-       "may-gen": "Села",
-       "june-gen": "Этинга",
+       "january-gen": "АгIой ''(январь)'' бетта",
+       "february-gen": "Саь-кур ''(февраль)'' бетта",
+       "march-gen": "Мутт-хьал ''(март)'' бетта",
+       "april-gen": "Тушол ''(апрель)'' бетта",
+       "may-gen": "Села ''(май)'' бетта",
+       "june-gen": "Этинга ''(июнь)'' бетта",
        "july-gen": "Баьцамеа",
        "august-gen": "Мяцхали",
        "september-gen": "Михий",
        "october-gen": "АьрхIий",
        "november-gen": "Лай чилла",
        "december-gen": "Чан-тар",
-       "jan": "АгIой",
-       "feb": "Саь-кур",
-       "mar": "Мутт-хьал",
+       "jan": "АгIой ''(янв)''",
+       "feb": "Саь-кур ''(фев)''",
+       "mar": "Мутт-хьал ''(мар)''",
        "apr": "Tушоли",
-       "may": "Села",
-       "jun": "Этинга",
+       "may": "Села ''(май)''",
+       "jun": "Этинга ''(июн)''",
        "jul": "Баьцамеа",
        "aug": "Мяцхали",
        "sep": "Михий",
        "oct": "АьрхIий",
        "nov": "Лай чилла",
        "dec": "Чан-тар",
-       "january-date": "АгIой $1",
-       "february-date": "Саь-кур $1",
-       "march-date": "Мутт-хьал $1",
-       "april-date": "Тушоли $1",
-       "may-date": "Села $1",
-       "june-date": "Этинга $1",
+       "january-date": "АгIой ''(Январь)'' $1",
+       "february-date": "Саь-кур ''(февраль)'' $1",
+       "march-date": "Мутт-хьал ''(март)'' $1",
+       "april-date": "Тушол ''(апрель)'' $1",
+       "may-date": "Села ''(май)'' $1",
+       "june-date": "Этинга ''(июнь)'' $1",
        "july-date": "Баьцамеа $1",
        "august-date": "Мяцхали $1",
        "september-date": "Михий $1",
index ef0f171..64a68cc 100644 (file)
        "rcfilters-other-review-tools": "შემოწმების სხვა ხელსაწყოები",
        "rcfilters-group-results-by-page": "ჯგუფის შედეგები გვერდების მიხედვით",
        "rcfilters-activefilters": "აქტიური ფილტრები",
+       "rcfilters-activefilters-hide": "დამალვა",
+       "rcfilters-activefilters-show": "ჩვენება",
+       "rcfilters-activefilters-hide-tooltip": "აქტიური ფილტრების ადგილის დამალვა",
+       "rcfilters-activefilters-show-tooltip": "აქტიური ფილტრების ადგილის ჩვენება",
        "rcfilters-advancedfilters": "გაფართოებული ფილტრები",
        "rcfilters-limit-title": "ცვლილელების ნახვა",
        "rcfilters-limit-and-date-label": "{{PLURAL:$1|ცვლილება|$1 ცვლილება}}, $2",
        "rcfilters-preference-help": "გათიშავს 2017 წლის ინტერფეისის დიზაინზე გაკეთებულ განახლებას, გაითიშება მას შემდეგ დამატებული ყველა ხელსაწყო.",
        "rcfilters-watchlist-preference-label": "კონტროლის სიის გაუმჯობესებული ვერსიის დამალვა",
        "rcfilters-watchlist-preference-help": "აუქმებს 2017 წლის ინტერფეისისა და ყველა ხელსაწყოს რედიზაინს დამატებულს მაშინ და შემდგომ.",
+       "rcfilters-filter-showlinkedfrom-label": "ცვლილებების ჩვენება დაკავშირებულ გვერდებზე",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>არჩეულზე, დაკავშირებული</strong> გვერდები",
        "rcnotefrom": "ქვემოთ {{PLURAL:$5|ნაჩვენებია ცვლილება|ნაჩვენებია ცვლილებები}} <strong>$3, $4</strong>-დან (ნაჩვენებია არაუმეტეს <strong>$1</strong>).",
        "rclistfromreset": "თარიღის საწყის კონფიგურაციაზე დაბრუნება",
        "rclistfrom": "ახალი ცვლილებების ჩვენება დაწყებული $3 $2-დან",
        "filedelete-edit-reasonlist": "წაშლის მიზეზების რედაქტირება",
        "filedelete-maintenance": "ფაილების წაშლა და აღდგენა დროებით გათიშულია ტექნიკური სამუშაობის განმავლობაში.",
        "filedelete-maintenance-title": "ფაილის წაშლა ვერ ხერხდება",
-       "mimesearch": "MIME ძიება",
+       "mimesearch": "MIME-ის ძიება",
        "mimesearch-summary": "ამ გვერდის მეშვეობით შესაძლებელია ფაილების მოძიება მათი MIME-ტიპის მიხედვით. შეტანის ფორმა: შიგთავსის ტიპი/ქვეტიპი, მაგ <code>image/jpeg</code>.",
        "mimetype": "MIME ტიპი:",
        "download": "გადმოტვირთვა",
        "pagedata-title": "გვერდის მონაცემი",
        "pagedata-text": "ეს გვერდი აჩვენებს მონაცემის ინტერფეისს გვერდებზე. გთხოვთ წარმოადგინეთ გვერდის სათაური URL-ში, ქვეგვერდის სინტაქსის გამოყენებით.\n* Content negotiation მუშაობს კლიენტის Accept ჰედერზე დაფუძნებით. ეს ნიშნავს, რომ გვერდის მონაცემი გამოჩნდება თქვენი კლიენტის ფორმატით.",
        "pagedata-not-acceptable": "შესაბამისი ფორმატი ვერ მოიძებნა. მხარდაჭერილი MIME ტიპები: $1",
-       "pagedata-bad-title": "არასწორი სათაური: \"$1\"."
+       "pagedata-bad-title": "არასწორი სათაური: \"$1\".",
+       "passwordpolicies": "პაროლების პოლიტიკა"
 }
index 466d339..89b7548 100644 (file)
        "otherlanguages": "Yn tavosow erel",
        "redirectedfrom": "(Daskevarwodhys dhyworth $1)",
        "redirectpagesub": "Folen dhaskedya",
+       "redirectto": "Daskidya dhe:",
        "lastmodifiedat": "Diwettha chanj an folen ma a veu an $1, dhe $2.",
        "protectedpage": "Folen dhifresys",
        "jumpto": "Lamma dhe:",
        "pool-errorunknown": "Gwall ankoth",
        "aboutsite": "A-dro dhe {{SITENAME}}",
        "aboutpage": "Project:Kedhlow",
-       "copyright": "Kavadow yw an dalgh yn-dann $1.",
+       "copyright": "Kavadow yw an dalgh yn-dann $1, marnas avisyes yn ken maner.",
        "copyrightpage": "{{ns:project}}:Gwirbryntyansow",
        "currentevents": "Hwarvosow a-lemmyn",
        "currentevents-url": "Project:Hwarvosow a-lemmyn",
        "youhavenewmessages": "$1 a'gas beus ($2).",
        "youhavenewmessagesfromusers": "Hwi a'gas beus $1 dhyworth {{PLURAL:$3|devnydhyer aral|$3 devnydhyer}} ($2).",
        "youhavenewmessagesmanyusers": "Hwi a'gas beus $1 dhyworth lies devnydhyer ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|messach nowyth|messajys nowyth}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|chanj|chanjyow}} diwettha",
+       "newmessageslinkplural": "{{PLURAL:$1|messach nowydh|999=messajys nowydh}}",
+       "newmessagesdifflinkplural": "an {{PLURAL:$1|chanj|999=chanjyow}} diwettha",
        "youhavenewmessagesmulti": "Messajys nowyth a'gas beus war $1",
        "editsection": "chanjya",
        "editold": "chanjya",
        "filenotfound": "Ny allas kavos an restren \"$1\".",
        "cannotdelete-title": "Ny yllir dilea an folen \"$1\"",
        "badtitle": "Titel drog",
+       "badtitletext": "Drog po gwag o an folen wovynnys, po titel kammkevrennys kesyeth po keswiki o.\nMartesen yma unn lytheren po moy ynno na yllir usya yn titlys.",
        "viewsource": "Gweles an bennfenten",
        "viewsource-title": "Gweles an bennfenten rag $1",
        "protectedpagetext": "Difresys yw an folen ma dhe witha rag chanjya po gwriansow erel.",
        "image_tip": "Restren neythys",
        "media_tip": "Kevren restren",
        "sig_tip": "Agas sinans ha stampa-termyn",
+       "hr_tip": "Linen worwelyek (na usyowgh re)",
        "summary": "Berrskrif:",
        "subject": "Testen:",
        "minoredit": "Chanj byghan yw hemma",
        "template-semiprotected": "(hanter-difresys)",
        "hiddencategories": "Esel a {{PLURAL:$1|1 glass kudhys|$1 klass kudhys}} yw an folen ma:",
        "permissionserrorstext-withaction": "Nyns eus kummyas dhywgh dhe $2, rag an {{PLURAL:$1|acheson|achesonys}} a syw:",
-       "moveddeleted-notice": "Diles veu an folen ma.\nA-woles yma kovnotennow dhilea ha gwaya an folen.",
+       "recreate-moveddeleted-warn": "<strong>Gwarnyans: Yth esowgh ow kul folen a veu diles kens.</strong>\n\nY tal dhywgh prederi mars yw gwiw pesya ow chanjya an folen ma.\nOttomma kovnoten dhilea ha gwaya an folen ma:",
+       "moveddeleted-notice": "Diles veu an folen ma.\nA-woles yma kovnotennow dhilea, difres ha gwaya an folen.",
        "log-fulllog": "Gweles an govnoten dhien",
        "editwarning-warning": "Mar kesowgh an folen ma, hwi a allsa kelli chanjyow gwrys genowgh.\nMars owgh hwi omgelmys, hwi a yll diallosegi an gwarnyans ma yn tregh \"{{int:prefs-editing}}\" agas dewisyow.",
+       "content-model-wikitext": "wikitekst",
        "undo-success": "Y hyllir diswul an chanj-ma.\nCheckyewgh mar pleg an kehevelyans a-woles rag gwirya bos hemma an pyth a vynnowgh, hag ena gwithewgh an chanjyow a-woles rag gorfenna diswul an chanj.",
        "undo-summary": "Amendyans $1 gans [[Special:Contributions/$2|$2]] ([[User talk:$2|keskows]]) diswrys",
        "viewpagelogs": "Gweles kovnotennow an folen ma",
        "page_first": "kynsa",
        "page_last": "diwettha",
        "histlegend": "Dewis dyffransow: Merkyewgh kistennow radyo a'n amendyansow dhe geheveli, ha gweskewgh 'entra' po an boton orth goles an folen.<br />\nAlhwedh: '''({{int:cur}})''' = an dyffrans dhyworth an amendyans diwettha, '''({{int:last}})''' = an dyffrans dhyworth an amendyans kyns, '''{{int:minoreditletter}}''' = chanj byhan.",
-       "history-fieldset-title": "Peuri an istori",
+       "history-fieldset-title": "Hwilas amendyansow",
        "history-show-deleted": "Diles hepken",
-       "histfirst": "An moyha a-varr",
-       "histlast": "An diwettha",
+       "histfirst": "an kottha",
+       "histlast": "an nowettha",
        "historysize": "({{PLURAL:$1|1 bayt}})",
        "historyempty": "(gwag)",
        "history-feed-title": "Istori amendya",
        "compareselectedversions": "Keheveli an amendyansow dewisyes",
        "showhideselectedversions": "Diskwedhes/kudha amendyansow dewisyes",
        "editundo": "diswul",
+       "diff-empty": "(Dihevelepter vyth)",
+       "diff-multi-sameuser": "(Nyns yw diskwedhys {{PLURAL:$1|unn janj|$1 chanj}} kresel gans an keth devnydhyer)",
+       "diff-multi-otherusers": "(Nyns yw diskwedhys {{PLURAL:$1|unn janj|$1 chanj}} kresel gans {{PLURAL:$2|unn devnydhyer aral|$2 usyer}})",
        "searchresults": "Sewyansow hwilas",
        "searchresults-title": "Sewyansow hwilas rag \"$1\"",
        "notextmatches": "Nyns eus tekst folen vyth owth omdhesedha",
        "right-move": "Gwaya folennow",
        "right-movefile": "Gwaya restrennow",
        "right-upload": "Ughkarga restrennow",
+       "right-writeapi": "Devnydh a'n API skrifa",
        "right-delete": "Dilea folennow",
        "newuserlogpage": "Kovnoten gwruthyl akontow devnydhyer",
        "rightslog": "Kovnoten wiryow an devnydhyer",
        "action-edit": "chanjya an folen-ma",
+       "action-createaccount": "formya an akont usyer ma",
        "action-move": "gwaya an folen ma",
        "action-movefile": "gwaya an restren-ma",
        "action-upload": "ughkarga an restren-ma",
        "rcfilters-filter-pageedits-label": "Chanjyow dhe folennow",
        "rcfilters-filter-newpages-label": "Folennow gwrys",
        "rcfilters-liveupdates-button": "Nowedhansow byw",
+       "rcnotefrom": "A-woles yma {{PLURAL:$5|an chanj|an chanjyow}} a-dhia <strong>$3, $4</strong> (ow tiskwedhes bys yn <strong>$1</strong>).",
        "rclistfrom": "Diskwedhes chanjyow nowydh a-dhia $3 $2",
        "rcshowhideminor": "$1 chanjyow byghan",
+       "rcshowhideminor-show": "Diskwedhes",
        "rcshowhideminor-hide": "Kudha",
        "rcshowhidebots": "$1 bottow",
        "rcshowhidebots-show": "Diskwedhes",
        "rcshowhidebots-hide": "Kudha",
        "rcshowhideliu": "$1 devnydhoryon govskrifys",
+       "rcshowhideliu-show": "Diskwedhes",
        "rcshowhideliu-hide": "Kudha",
        "rcshowhideanons": "$1 devnydhyoryon dhihanow",
        "rcshowhideanons-show": "Diskwedhes",
        "rcshowhideanons-hide": "Kudha",
        "rcshowhidepatr-hide": "Kudha",
        "rcshowhidemine": "$1 ow chanjyow",
+       "rcshowhidemine-show": "Diskwedhes",
        "rcshowhidemine-hide": "Kudha",
        "rcshowhidecategorization-hide": "Kudha",
        "rclinks": "Diskwedhes an $1 chanj diwettha gwrys y'n $2 dydh diwettha",
        "newsectionsummary": "/* $1 */ tregh nowyth",
        "rc-enhanced-expand": "Diskwedhes an manylyon (res yw JavaScript)",
        "rc-enhanced-hide": "Kudha an manylyon",
+       "rc-old-title": "gwrys yn kensa avel \"$1\"",
        "recentchangeslinked": "Chanjyow kelmys",
        "recentchangeslinked-feed": "Chanjyow kelmys",
        "recentchangeslinked-toolbox": "Chanjyow kelmys",
        "recentchangeslinked-title": "Chanjyow kelmys dhe \"$1\"",
-       "recentchangeslinked-summary": "Homm yw rol a janjyow gwrys a-dhiwedhes dhe folennow yw kevrennys dhyworth folen res (po dhe eseli a glass res).\n'''Tew''' yw folennow eus war agas [[Special:Watchlist|rol wolya]].",
+       "recentchangeslinked-summary": "Entrowgh hanow folen rag gweles chanjyow war folennow kevrennys a po bys y'n folen na. (Rag gweles eseli klass, entrowgh {{ns:category}}:Hanow an klass). Skrifys yn <strong>tew</strong> yw chanjyow dhe folennow war [[Special:Watchlist|agas rol golya]].",
        "recentchangeslinked-page": "Hanow an folen:",
        "recentchangeslinked-to": "Diskwedhes chanjyow dhe folennow kevrennys dhe'n folen res yn le",
        "upload": "Ughkarga restren",
        "filesource": "Pennfenten:",
        "savefile": "Gwitha restren",
        "watchthisupload": "Golya an folen-ma",
+       "license-header": "Leshyans",
        "imgfile": "restren",
        "listfiles_date": "Dedhyans",
        "listfiles_name": "Hanow",
        "linkstoimage-more": "Yma moy es $1 {{PLURAL:$1|folen}} ow kevrenna dhe'n restren-ma.\nNy dhiskwa an rol a syw marnas an {{PLURAL:$1|kynsa kevren folen|kynsa $1 kevren folen}} dhe'n restren-ma.\nYma [[Special:WhatLinksHere/$2|rol leun]] kavadow.",
        "nolinkstoimage": "Nyns eus folen vyth ow kevrenna dhe'n restren-ma.",
        "morelinkstoimage": "Gweles [[Special:WhatLinksHere/$1|moy kevrennow]] dhe'n restren-ma.",
+       "linkstoimage-redirect": "$1 (ow taskidya restren) $2",
        "sharedupload": "An folen ma a dheu a $1 hag a allsa bos usys gans ragdresow erel.",
        "sharedupload-desc-here": "Yma an restren ma dhe $1 ha ragdresow erel a allsa bos orth hy devnydhya.\nDiskwedhys a-woles yma an deskrifans war hy [$2 folen dheskrifans] ena.",
+       "filepage-nofile": "Nyns eus folen henwys yndelma.",
        "uploadnewversion-linktext": "Ughkarga versyon nowyth a'n restren-ma",
+       "upload-disallowed-here": "Ny yllowgh gorskrifa an restren ma.",
        "filedelete": "Dilea $1",
        "filedelete-legend": "Dilea an restren",
        "filedelete-submit": "Dilea",
        "pager-older-n": "{{PLURAL:$1|1 kottha|$1 kottha}}",
        "booksources": "Pennfentynyow lyver",
        "booksources-search-legend": "Hwilas pennfentynyow lyver",
+       "booksources-search": "Hwilas",
        "specialloguserlabel": "Awtour:",
        "speciallogtitlelabel": "Kosten (titel po devnydhyer):",
        "log": "Kovnotennow",
        "watchlist-details": "Yma {{PLURAL:$1|$1 folen}} war agas rol wolya, marnas folennow keskows.",
        "wlheader-showupdated": "Yn '''tew''' y tiskwedhir folennow re beu chanjyes a-dhia agas vysytyans diwettha.",
        "wlnote": "A-woles yma an {{PLURAL:$1|chanj diwettha|'''$1''' chanj diwettha}} y'n {{PLURAL:$2|our|'''$2''' our}} diwettha, a-dhia $3, $4.",
-       "wlshowlast": "Diskwedhes an $1 our diwettha, an $2 dydh diwettha, po",
+       "wlshowlast": "Diskwedhes an $1 our $2 dydh diwettha",
        "watchlist-hide": "Kudha",
        "watchlist-options": "Etholyow an rol wolya",
        "watching": "Ow kolya...",
        "deleteotherreason": "Acheson aral/keworansel:",
        "deletereasonotherlist": "Acheson aral",
        "rollbacklink": "rolya war-dhelergh",
+       "rollbacklinkcount": "rolya $1 {{PLURAL:$1|janj|chanj}} war-dhelergh",
        "protectlogpage": "Kovnoten dhifres",
        "protectedarticle": "\"[[$1]]\" difresys",
+       "modifiedarticleprotection": "a janjyas nivel difresans \"[[$1]]\"",
        "prot_1movedto2": "[[$1]] gwayys dhe [[$2]]",
        "protectcomment": "Acheson:",
        "protectexpiry": "Ow tiwedha:",
        "undelete-show-file-submit": "Ya",
        "namespace": "Spas hanow:",
        "invert": "Trebuchya an dewisyans",
+       "tooltip-invert": "Tyckyowgh an gist ma rag kudha chanjyow dhe folennow y'n hanow spas dewisyes (ha'n hanow spas kevrennys, mars yw tyckyes)",
        "namespace_association": "Spas hanow kelmys",
+       "tooltip-namespace_association": "Tyckyowgh an gist ma dhe geworra ynwedh an hanow spas keskows po testen kevrennys dhe'n hanow spas dewisyes",
        "blanknamespace": "(Penn)",
        "contributions": "Kevrohow an {{GENDER:$1|devnydhyer}}",
        "contributions-title": "Kevrohow $1",
        "mycontris": "Kevrohow",
-       "contribsub2": "Rag $1 ($2)",
-       "uctop": "(gwartha)",
+       "anoncontribs": "Kevrohow",
+       "contribsub2": "Gans {{GENDER:$3|$1}} ($2)",
+       "uctop": "(a-lemmyn)",
        "month": "Dhyworth an mis (ha moy a-varr):",
        "year": "Dhyworth an vledhen (ha moy a-varr):",
        "sp-contributions-newbies": "Diskwedhes yn unnik kevrohow akontow nowyth",
        "sp-contributions-search": "Hwilas kevrohow",
        "sp-contributions-username": "Trigva IP po hanow devnydhyer:",
        "sp-contributions-toponly": "Diskwedhes yn unnik chanjyow yw amendyansow diwettha",
+       "sp-contributions-newonly": "Diskwedhes yn unnik chanjyow a wrug folennow nowydh",
        "sp-contributions-submit": "Hwilas",
        "whatlinkshere": "Folennow kevrennys",
        "whatlinkshere-title": "Folennow ow kevrenna dhe \"$1\"",
        "whatlinkshere-prev": "{{PLURAL:$1|kyns|$1 kyns}}",
        "whatlinkshere-next": "{{PLURAL:$1|nessa|nessa $1}}",
        "whatlinkshere-links": "← kevrennow",
-       "whatlinkshere-hideredirs": "$1 daskedyansow",
-       "whatlinkshere-hidetrans": "$1 treuskludyans",
+       "whatlinkshere-hideredirs": "$1 daskidyansow",
+       "whatlinkshere-hidetrans": "$1 treuskludyansow",
        "whatlinkshere-hidelinks": "$1 kevrennow",
        "whatlinkshere-hideimages": "$1 kevrennow restren",
        "whatlinkshere-filters": "Sidhlow",
        "import-upload-filename": "Hanow an restren:",
        "importstart": "Owth ymperthi folennow...",
        "import-noarticle": "Nyns eus folen vyth dhe ymperthi!",
-       "tooltip-pt-userpage": "Agas folen dhevnydhyer",
-       "tooltip-pt-mytalk": "Agas folen gows",
-       "tooltip-pt-preferences": "Agas dewisyow",
+       "tooltip-pt-userpage": "{{GENDER:|Agas folen dhevnydhyer}}",
+       "tooltip-pt-mytalk": "{{GENDER:|Agas folen gows}}",
+       "tooltip-pt-preferences": "{{GENDER:|Agas dewisyow}}",
        "tooltip-pt-watchlist": "Rol a folennow esowgh ow kolya rag chanjyow",
-       "tooltip-pt-mycontris": "Rol a'gas kevrohow",
+       "tooltip-pt-mycontris": "Rol {{GENDER:|a'gas kevrohow}}",
        "tooltip-pt-login": "Ni a gomend hwi dhe omgelmi, mes nyns yw bysi",
        "tooltip-pt-logout": "Omdenna",
        "tooltip-pt-createaccount": "Ni a gomend hwi dhe wruthyl akont hag omgelmi; byttegyns nyns yw bysi",
        "tooltip-t-recentchangeslinked": "Chanjyow a-dhiwedhes yn folennow kevrennys dhyworth an folen ma",
        "tooltip-feed-rss": "Feed RSS rag an folen-ma",
        "tooltip-feed-atom": "Feed Atom rag an folen ma",
-       "tooltip-t-contributions": "Gweles rol a gevrohow an devnydhyer ma",
-       "tooltip-t-emailuser": "Danvon ebost dhe'n devnydhyer-ma",
+       "tooltip-t-contributions": "Rol a gevrohow gans {{GENDER:$1|an usyer ma}}",
+       "tooltip-t-emailuser": "Danvon ebost dhe'n {{GENDER:$1|usyer|usyores}} ma",
        "tooltip-t-upload": "Ughkarga restrennow",
        "tooltip-t-specialpages": "Rol a geniver folen arbennek",
        "tooltip-t-print": "Versyon pryntyadow a'n folen ma",
        "tooltip-ca-nstab-special": "Folen arbennek yw homma; ny yllir hy chanjya",
        "tooltip-ca-nstab-project": "Gweles folen an wiki",
        "tooltip-ca-nstab-image": "Gweles folen an restren",
+       "tooltip-ca-nstab-mediawiki": "Gweles messach an system",
        "tooltip-ca-nstab-template": "Gweles an skantlyn",
        "tooltip-ca-nstab-category": "Gweles folen an klass",
        "tooltip-minoredit": "Merkya hemma avel chanj byhan",
        "siteuser": "devnydhyer {{SITENAME}} $1",
        "lastmodifiedatby": "Chanj diwettha an folen ma a veu dhe $2 an $1 gans $3.",
        "siteusers": "{{PLURAL:$2|devnydhyer|devnydhyoryon}} {{SITENAME}} $1",
+       "simpleantispam-label": "Prov gorth-spam.\n<strong>Na</strong> lenwowgh hemma!",
+       "pageinfo-title": "Kedhlow \"$1\"",
+       "pageinfo-header-edits": "Istori chanjya",
+       "pageinfo-watchers": "Niver a dus ow kolya",
+       "pageinfo-few-watchers": "Le es $1 {{PLURAL:$1|golyer|golyoryon}}",
+       "pageinfo-firstuser": "Gwrier an folen",
+       "pageinfo-firsttime": "Dedhyans gwrians an folen",
+       "pageinfo-edits": "Niver a janjyow",
        "pageinfo-toolboxlink": "Kedhlow an folen",
        "previousdiff": "← Chanj kottha",
        "nextdiff": "Chanj nowyttha →",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|folen}}",
        "file-info-size": "$1 × $2 piksel, myns an restren: $3, eghen MIME: $4",
        "file-nohires": "Nyns eus klerder ughella kavadow.",
        "svg-long-desc": "Restren SVG, $1 × $2 piksel yn hanow, myns an restren: $3",
        "metadata-collapse": "Kudha manylyon ystynnys",
        "exif-imagewidth": "Les",
        "exif-imagelength": "Uhelder",
+       "exif-xresolution": "Klerder gorwelyek",
+       "exif-yresolution": "Klerder plommwedhek",
        "exif-artist": "Awtour",
        "exif-meteringmode-255": "Aral",
        "exif-contrast-0": "Usadow",
        "version": "Versyon",
        "version-other": "Aral",
        "version-version": "($1)",
+       "redirect-submit": "Mos",
+       "redirect-lookup": "Hwilas:",
+       "redirect-user": "ID an usyer",
+       "redirect-page": "ID an folen",
+       "redirect-revision": "Amendyans an folen",
+       "redirect-file": "Hanow an restren",
        "fileduplicatesearch-filename": "Hanow an restren:",
        "fileduplicatesearch-submit": "Hwilas",
        "specialpages": "Folennow arbennek",
        "tag-filter": "Sidhel [[Special:Tags|tagyow]]:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tagg|Taggys}}]]: $2)",
        "tags-title": "Taggys",
+       "tags-active-no": "Nag yw",
        "tags-edit": "chanjya",
        "dberr-problems": "Drog yw genen! An wiasva-ma a's teves kaletter teknogel.",
        "dberr-again": "Assayewgh gortos pols ha daskarga.",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|a wayas}} an folen $3 dhe $4 heb gasa daskedyans",
        "logentry-move-move_redir": "$1 {{GENDER:$2|a wayas}} an folen $3 dhe $4 dres daskedyans",
        "logentry-newusers-create": "{{GENDER:$2|Gwruthys}} veu an akont devnydhyer $1",
-       "searchsuggest-search": "Hwilas",
+       "logentry-newusers-autocreate": "{{GENDER:$2|Gwrys}} veu an akont usyer $1 yn awtomatek",
+       "logentry-upload-upload": "$1 {{GENDER:$2|a ughkargas}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|a ughkargas}} versyon nowydh a $3",
+       "searchsuggest-search": "Hwilas yn {{SITENAME}}",
        "searchsuggest-containing": "ynni...",
+       "duration-days": "$1 {{PLURAL:$1|jydh|dydh}}",
        "special-characters-group-latin": "Latin",
        "special-characters-group-latinextended": "Latin ystynnys",
        "special-characters-group-ipa": "IPA",
index fb304eb..55ce3fe 100644 (file)
        "grouppage-bureaucrat": "{{ns:project}}:Бирократи",
        "grouppage-suppress": "{{ns:project}}:Притајување",
        "right-read": "Читање страници",
-       "right-edit": "Уредување страници",
+       "right-edit": "Уредување на страници",
        "right-createpage": "Создавање на страници (кои не се разговорни страници)",
        "right-createtalk": "Создавање на разговорни страници",
        "right-createaccount": "Создавање на нови кориснички сметки",
        "edit-error-long": "Грешки:\n\n$1",
        "revid": "преработка $1",
        "pageid": "назнака на страницата $1",
+       "interfaceadmin-info": "$1\n\nДозволите за уредување на податотеки од типовите CSS/JS/JSON низ цело вики неодамна беа одвоени од правото <code>editinterface</code>. Доколку не ви е јасно зошто ви се покажува оваа грешка, погледајте на [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "&lt;html&gt;-ознаките не може да се користат вон нормалните страници.",
        "gotointerwiki": "Го напуштате {{SITENAME}}",
        "gotointerwiki-invalid": "Укажаниот наслов е неважечки.",
index 38beb03..78f521b 100644 (file)
        "recentchanges-label-plusminus": "Hit ia̍h kái liáu; cheng-chha ê ūi-goân-cho͘",
        "recentchanges-legend-heading": "<strong>Ké-soeh:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (請參考[[Special:NewPages|新頁清單]])",
+       "rcfilters-tag-remove": "Thâi-tiāu '$1'",
        "rcfilters-legend-heading": "<strong>Kán-siá lia̍t-toaⁿ:</strong>",
+       "rcfilters-other-review-tools": "Kî-tha ê kiám-cha ke-si",
+       "rcfilters-activefilters": "Chok-iōng ê lū-thai",
+       "rcfilters-activefilters-hide": "Chhàng-tiāu",
+       "rcfilters-activefilters-show": "Tián-sī",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|kang}}",
+       "rcfilters-days-show-hours": "$1 {{PLURAL:$1|tiám-cheng}}",
+       "rcfilters-quickfilters": "Pó-chûn ê lū-thai",
+       "rcfilters-savedqueries-rename": "Têng-hō-miâ",
+       "rcfilters-savedqueries-remove": "Thâi-tiāu",
+       "rcfilters-savedqueries-new-name-label": "Hō-miâ",
        "rcfilters-savedqueries-cancel-label": "Chhú-siau",
+       "rcfilters-search-placeholder": "Lū-thai kái-ōaⁿ (ēng me-niú ia̍h chha-sûn chhōe lū-thai ê miâ)",
+       "rcfilters-filterlist-title": "Lū-thai",
+       "rcfilters-filter-bots-label": "Bot",
        "rcfilters-filter-humans-label": "Jîn-lūi (m̄-sī bot)",
+       "rcfilters-liveupdates-button": "Chek-sî kái-sin",
        "rcnotefrom": "Ē-kha sī <b>$2</b> kàu taⁿ ê kái-piàn (ke̍k-ke hián-sī <b>$1</b> hāng).",
        "rclistfrom": "Hián-sī tùi $3 $2 kàu taⁿ ê sin kái-piàn",
        "rcshowhideminor": "$1 sió siu-kái",
index 0b30dfe..bc7c9dd 100644 (file)
        "customcssprotected": "Du har ikke tillatelse til å redigere denne CSS-siden fordi den inneholder en annen brukers personlige innstillinger.",
        "customjsonprotected": "Du har ikke tillatelse til å redigere denne JSON-siden fordi den inneholder en annen bruker sine personlige innstillinger.",
        "customjsprotected": "Du har ikke tillatelse til å redigere denne JavaScript-siden fordi den inneholder en annen brukers personlige innstillinger.",
+       "sitecssprotected": "Du har ikke tillatelse til å redigere denne CSS-siden fordi det kan påvirke alle besøkende",
+       "sitejsonprotected": "Du har ikke tillatelse til å redigere denne JSON-siden fordi det kan påvirke alle besøkende",
+       "sitejsprotected": "Du har ikke tillatelse til å redigere denne JavaScript-siden fordi det kan påvirke alle besøkende",
        "mycustomcssprotected": "Du har ikke rettigheter til å redigere denne CSS-siden.",
        "mycustomjsonprotected": "Du har ikke tillatelse til å redigere denne JSON-siden.",
        "mycustomjsprotected": "Du har ikke rettigheter til å redigere denne Javascript-siden.",
        "group-autoconfirmed": "Autobekreftede brukere",
        "group-bot": "Roboter",
        "group-sysop": "Administratorer",
+       "group-interface-admin": "Grensesnittadministratorer",
        "group-bureaucrat": "Byråkrater",
        "group-suppress": "Sidefjernere",
        "group-all": "(alle)",
        "group-autoconfirmed-member": "{{GENDER:$1|autobekreftet bruker}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrator}}",
+       "group-interface-admin-member": "{{GENDER:$1|grensesnittadministrator}}",
        "group-bureaucrat-member": "{{GENDER:$1|byråkrat}}",
        "group-suppress-member": "{{GENDER:$1|historikkrydder}}",
        "grouppage-user": "{{ns:project}}:Brukere",
        "grouppage-autoconfirmed": "{{ns:project}}:Autobekreftede brukere",
        "grouppage-bot": "{{ns:project}}:Roboter",
        "grouppage-sysop": "{{ns:project}}:Administratorer",
+       "grouppage-interface-admin": "{{ns:project}}:Grensesnittadministratorer",
        "grouppage-bureaucrat": "{{ns:project}}:Byråkrater",
        "grouppage-suppress": "{{ns:project}}:Historikkrydding",
        "right-read": "Se sider",
        "right-editusercss": "Redigere andre brukeres CSS-filer",
        "right-edituserjson": "Rediger andre brukere sine JSON-filer",
        "right-edituserjs": "Redigere andre brukeres JS-filer",
+       "right-editsitecss": "Redigere CSS for hele nettstedet",
+       "right-editsitejson": "Redigere JSON for hele nettstedet",
+       "right-editsitejs": "Redigere JavaScript for hele nettstedet",
        "right-editmyusercss": "Redigere sine egne CSS-filer",
        "right-editmyuserjson": "Rediger din egen bruker sine JSON-filer",
        "right-editmyuserjs": "Redigere sine egne JavaScript-filer",
        "grant-createaccount": "Opprette kontoer",
        "grant-createeditmovepage": "Opprette, redigere eller flytte sider",
        "grant-delete": "Slette sider, revisjoner og logginnlegg",
-       "grant-editinterface": "Redigere MediaWiki-navnerommet og CSS/JSON/JavaScript i brukernavnerommet",
+       "grant-editinterface": "Redigere MediaWiki-navnerommet og JSON for helle nettstedet og i brukernavnerommet",
        "grant-editmycssjs": "Redigere din bruker-CSS/JSON/JavaScript",
        "grant-editmyoptions": "Rediger dine brukerinnstillinger",
        "grant-editmywatchlist": "Redigere overvåkningslisten din",
+       "grant-editsiteconfig": "Redigere CSS og JavaScript for hele nettstedet og i brukernavnerommet",
        "grant-editpage": "Redigere eksisterende sider",
        "grant-editprotected": "Redigere beskyttede sider",
        "grant-highvolume": "Høy&shy;volum&shy;redigering",
        "uploadstash-zero-length": "Filen har en lengde på null.",
        "invalid-chunk-offset": "Ugyldig delforskyvning",
        "img-auth-accessdenied": "Ingen tilgang",
-       "img-auth-nopathinfo": "Manglende PATH_INFO.\nTjeneren din er ikke satt opp til å gi denne informasjonen.\nDen er kanskje CGI-basert og støtter ikke img_auth.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Se bildeautorisasjon.",
+       "img-auth-nopathinfo": "Manglende stiinformasjon.\nTjeneren må være satt opp til å sende variablene REQUEST_URI og/eller PATH_INFO.\nOm den er det, prøv å slå på $wgUsePathInfo.\nSe https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization .",
        "img-auth-notindir": "Den ønskede stien finnes ikke i den oppsatte opplastingsmappa.",
        "img-auth-badtitle": "Kunne ikke lage en gyldig tittel ut fra «$1».",
        "img-auth-nologinnWL": "Du er ikke logget inn, og «$1» er ikke på hvitelista.",
        "passwordpolicies-policy-passwordcannotmatchusername": "Passordet kan ikke være det samme som brukernavnet",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Passordet kan ikke matche spesifikt svartelistede passord",
        "passwordpolicies-policy-maximalpasswordlength": "Passordet må være på minst $1 {{PLURAL:$1|tegn}}",
-       "passwordpolicies-policy-passwordcannotbepopular": "Passordet kan ikke være {{PLURAL:$1|det populære passordet|i lista over $1 populære passord}}"
+       "passwordpolicies-policy-passwordcannotbepopular": "Passordet kan ikke være {{PLURAL:$1|det populære passordet|i lista over $1 populære passord}}",
+       "easydeflate-invaliddeflate": "Det gitte innholdet er ikke riktig komprimert"
 }
index a03d104..c3c8b24 100644 (file)
        "autosumm-blank": "Zied leegemaakt",
        "autosumm-replace": "Tekste vervöngen deur '$1'",
        "autoredircomment": "döärverwysing når [[$1]]",
+       "autosumm-changed-redirect-target": "Döärverwysingsdool ewysigd van [[$1]] når [[$2]]",
        "autosumm-new": "Nieje zied: '$1'",
        "size-kilobytes": "$1 kB",
        "lag-warn-normal": "Wiezigingen die niejer bin as $1 {{PLURAL:$1|seconde|seconden}} staon misschien nog niet in de lieste.",
        "tag-list-wrapper": "([[Special:Tags|Etiket{{PLURAL:$1||ten}}]]: $2)",
        "tag-mw-new-redirect": "Nye döärverwysing",
        "tag-mw-removed-redirect": "Döärverwysing vortedån",
+       "tag-mw-changed-redirect-target": "Döärverwysingsdool ewysigd",
        "tags-title": "Etiket",
        "tags-intro": "Op disse zied staon de etiketten waormee de programmatuur elke bewarking kan markeren, en de betekenisse dervan.",
        "tags-tag": "Etiketnaam",
index d8e0678..fff1097 100644 (file)
        "cachedspecial-refresh-now": "Meest recente weergeven.",
        "categories": "Categorieën",
        "categories-submit": "Weergeven",
-       "categoriespagetext": "De volgende {{PLURAL:$1|categorie bevat|categorieën bevatten}} pagina's of mediabestanden.\n[[Special:UnusedCategories|Ongebruikte categorieën]] worden hier niet weergegeven.\nZie ook [[Special:WantedCategories|niet-bestaande categorieën met koppelingen]].",
+       "categoriespagetext": "De volgende {{PLURAL:$1|categorie bestaat|categorieën bestaan}} op de wiki en kunnen mogelijk ongebruikt zijn.\nZie ook [[Special:WantedCategories|niet-bestaande categorieën met de meeste koppelingen]].",
        "categoriesfrom": "Categorieën weergeven vanaf:",
        "deletedcontributions": "Verwijderde bijdragen",
        "deletedcontributions-title": "Verwijderde gebruikersbijdragen",
        "edit-error-long": "Fouten:\n\n$1",
        "revid": "versie $1",
        "pageid": "Pagina-ID $1",
+       "interfaceadmin-info": "$1\n\nRechten voor het bewerken van wikibrede CSS/JS/JSON bestanden zijn recentelijk gescheiden van het <code>editinterface</code> recht. Als u niet begrijpt waarom u deze foutmelding te zien krijgt, ga dan naar [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "&lt;html&gt; tags kunnen alleen op normale pagina's geplaatst worden.",
        "gotointerwiki": "{{SITENAME}} verlaten",
        "gotointerwiki-invalid": "De opgegeven titel is ongeldig.",
index 3e5b262..c5a4235 100644 (file)
        "customcssprotected": "Nie jesteś uprawniony do edytowania tej strony CSS, ponieważ zawiera ona ustawienia osobiste innego użytkownika.",
        "customjsonprotected": "Nie jesteś uprawniony do edytowania tej strony JSON, ponieważ zawiera ona ustawienia osobiste innego użytkownika.",
        "customjsprotected": "Nie jesteś uprawniony do edytowania tej strony JavaScript, ponieważ zawiera ona ustawienia osobiste innego użytkownika.",
+       "sitecssprotected": "Nie masz uprawnień do edytowania tej strony CSS, ponieważ może to wpłynąć na wszystkich odwiedzających",
+       "sitejsonprotected": "Nie masz uprawnień do edytowania tej strony JSON, ponieważ może to wpłynąć na wszystkich odwiedzających",
        "sitejsprotected": "Nie masz uprawnień do edytowania tej strony JavaScript, ponieważ może to wpłynąć na wszystkich odwiedzających",
        "mycustomcssprotected": "Nie masz uprawnień do edytowania tej strony CSS.",
        "mycustomjsonprotected": "Nie masz uprawnień do edytowania tej strony JSON.",
        "right-editusercss": "Edycja plików CSS innych użytkowników",
        "right-edituserjson": "Edycja plików JSON innych użytkowników",
        "right-edituserjs": "Edycja plików JS innych użytkowników",
+       "right-editsitecss": "Edycja plików CSS projektu",
+       "right-editsitejson": "Edycja plików JSON projektu",
+       "right-editsitejs": "Edycja plików JavaScript projektu",
        "right-editmyusercss": "Edycja swoich plików CSS",
        "right-editmyuserjson": "Edycja swoich plików JSON",
        "right-editmyuserjs": "Edycja swoich plików JavaScript",
        "grant-createaccount": "Tworzenie kont",
        "grant-createeditmovepage": "Tworzenie, edycja i przenoszenie stron",
        "grant-delete": "Usuwanie stron, wersji stron i wpisów rejestru",
-       "grant-editinterface": "Edycja przestrzeni nazw MediaWiki oraz CSS/JSON/JavaScript użytkownika",
+       "grant-editinterface": "Edycja przestrzeni nazw MediaWiki oraz plików JSON projektu i innych użytkowników",
        "grant-editmycssjs": "Edycja swoich plików CSS/JSON/JavaScript",
        "grant-editmyoptions": "Edycja swoich preferencji",
        "grant-editmywatchlist": "Edycja listy obserwowanych",
+       "grant-editsiteconfig": "Edycja plików CSS i JS projektu i innych użytkowników",
        "grant-editpage": "Edycja istniejących stron",
        "grant-editprotected": "Edycja stron zabezpieczonych",
        "grant-highvolume": "Masowe edytowanie",
        "uploadstash-zero-length": "Plik ma zerowy rozmiar.",
        "invalid-chunk-offset": "Nieprawidłowe przesunięcie fragmentu",
        "img-auth-accessdenied": "Odmowa dostępu",
-       "img-auth-nopathinfo": "Brak PATH_INFO.\nSerwer nie został skonfigurowany, tak aby przekazywał tę informację.\nMożliwe, że jest oparty na CGI i nie może obsługiwać img_auth.\nWięcej o informacji o autoryzacji grafik na https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Brak informacji o ścieżce.\nSerwer musi być skonfigurowany tak, aby przekazywał zmienne REQUEST_URI lub PATH_INFO.\nJeżeli jest już odpowiednio skonfigurowany, spróbuj włączyć $wgUsePathInfo.\nWięcej o informacji o autoryzacji grafik na https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Żądana ścieżka nie jest w obrębie katalogu skonfigurowanego do przesyłania plików.",
        "img-auth-badtitle": "Nie można wygenerować prawidłowego tytuł z „$1”.",
        "img-auth-nologinnWL": "Nie jesteś zalogowany, a „$1” nie jest na białej liście.",
index 07604da..af43e93 100644 (file)
        "customcssprotected": "Você não tem permissão para editar esta página CSS, porque ele contém configurações pessoais de outro usuário.",
        "customjsonprotected": "Você não tem permissão para editar esta página JSON porque ela contém as configurações pessoais de outro usuário.",
        "customjsprotected": "Você não tem permissão para editar esta página de JavaScript, porque ele contém configurações pessoais de outro usuário.",
+       "sitecssprotected": "Não tem permissão para editar esta página de CSS porque ela pode afetar todos os visitantes",
+       "sitejsonprotected": "Não tem permissão para editar esta página de JSON porque ela pode afetar todos os visitantes",
+       "sitejsprotected": "Não tem permissão para editar esta página de JavaScript porque ela pode afetar todos os visitantes",
        "mycustomcssprotected": "Você não tem permissão para editar esta página CSS",
        "mycustomjsonprotected": "Você não tem permissão para editar esta página JSON.",
        "mycustomjsprotected": "Você não tem permissão para editar esta página JavaScript",
        "group-autoconfirmed": "Usuários autoconfirmados",
        "group-bot": "Robôs",
        "group-sysop": "Administradores",
+       "group-interface-admin": "Administradores da interface",
        "group-bureaucrat": "Burocratas",
        "group-suppress": "Supressores",
        "group-all": "(todos)",
        "group-autoconfirmed-member": "{{GENDER:$1|usuário autoconfirmado|usuária autoconfirmada|usuário(a) autoconfirmado(a)}}",
        "group-bot-member": "robô",
        "group-sysop-member": "{{GENDER:$1|administrador|administradora|administrador(a)}}",
+       "group-interface-admin-member": "{{GENDER:$1|administrador|administradora}} da interface",
        "group-bureaucrat-member": "burocrata",
        "group-suppress-member": "{{GENDER:$1|supressor|supressora|supressor(a)}}",
        "grouppage-user": "{{ns:project}}:Usuários",
        "grouppage-autoconfirmed": "{{ns:project}}:Auto-confirmados",
        "grouppage-bot": "{{ns:project}}:Robôs",
        "grouppage-sysop": "{{ns:project}}:Administradores",
+       "grouppage-interface-admin": "{{ns:project}}:Administradores da interface",
        "grouppage-bureaucrat": "{{ns:project}}:Burocratas",
        "grouppage-suppress": "{{ns:project}}:Oversight",
        "right-read": "Ler páginas",
        "right-editusercss": "Editar os arquivos CSS de outros usuários",
        "right-edituserjson": "\nEditar arquivos JSON de outros usuários",
        "right-edituserjs": "Editar os arquivos JS de outros usuários",
+       "right-editsitecss": "Editar CSS global do ''site''",
+       "right-editsitejson": "Editar JSON global do ''site''",
+       "right-editsitejs": "Editar JavaScript global do ''site''",
        "right-editmyusercss": "Edite seu próprio arquivo CSS de usuário",
        "right-editmyuserjson": "Edite seus próprios arquivos JSON do usuário",
        "right-editmyuserjs": "Edite seu próprio arquivo JavaScript de usuário",
        "grant-createaccount": "Criar contas",
        "grant-createeditmovepage": "Criar, editar e mover páginas",
        "grant-delete": "Excluir páginas, revisões e entradas de registro",
-       "grant-editinterface": "Editar o domínio MediaWiki e o CSS/JSON/JavaScript do usuário",
+       "grant-editinterface": "Editar o espaço nominal/domínio MediaWiki e o JSON dos usuários ou global do ''site''",
        "grant-editmycssjs": "Editar o seu CSS/JSON/JavaScript personalizado",
        "grant-editmyoptions": "Editar suas preferências de usuário",
        "grant-editmywatchlist": "Editar sua lista de páginas vigiadas",
+       "grant-editsiteconfig": "Editar o CSS e JS dos usuários ou global do ''site''",
        "grant-editpage": "Editar páginas existentes",
        "grant-editprotected": "Editar páginas protegidas",
        "grant-highvolume": "Edição de grandes volumes",
        "uploadstash-zero-length": "O arquivo tem tamanho zero.",
        "invalid-chunk-offset": "Deslocamento de fragmento inválido",
        "img-auth-accessdenied": "Acesso negado",
-       "img-auth-nopathinfo": "PATH_INFO em falta.\nO seu servidor não está configurado para passar esta informação.\nPode ser baseado em CGI e não consegue suportar img_auth.\nConsulte a documentação em [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Image Authorization].",
+       "img-auth-nopathinfo": "Informação do caminho em falta.\nO seu servidor tem de estar configurado para passar as variáveis REQUEST_URI e/ou PATH_INFO.\nSe já está, tente ativar $wgUsePathInfo.\nConsulte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "O caminho solicitado não está no diretório configurado para envios.",
        "img-auth-badtitle": "Não é possível criar um título válido a partir de \"$1\".",
        "img-auth-nologinnWL": "Você não está logado e \"$1\" não está na lista branca.",
        "edit-error-long": "Erros:\n$1",
        "revid": "revisão $1",
        "pageid": "ID da página $1",
+       "interfaceadmin-info": "$1\n\nAs permissões de edição de arquivos CSS/JS/JSON que afetam todo o ''site'' foram recentemente separadas do privilégio <code>editinterface</code>. Se não compreende porque está a receber este erro, consulte [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "As tags &lt;html&gt; não podem ser usadas fora das páginas normais.",
        "gotointerwiki": "Saindo {{SITENAME}}",
        "gotointerwiki-invalid": "O título especificado é inválido.",
        "passwordpolicies-policy-passwordcannotmatchusername": "Senha não pode ser o mesmo que nome de usuário",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "A senha não pode corresponder senhas especificamente na lista negra",
        "passwordpolicies-policy-maximalpasswordlength": "A senha deve ser menor que $1 {{PLURAL:$1|caráter|caracteres}}",
-       "passwordpolicies-policy-passwordcannotbepopular": "A senha não pode {{PLURAL:$1|ser a mais popular|estar na lista das $1 palavras-passe mais populares}}"
+       "passwordpolicies-policy-passwordcannotbepopular": "A senha não pode {{PLURAL:$1|ser a mais popular|estar na lista das $1 palavras-passe mais populares}}",
+       "easydeflate-invaliddeflate": "O conteúdo fornecido não está devidamente comprimido"
 }
index dca810c..6e15906 100644 (file)
        "converter-manual-rule-error": "Erro detetado na regra de conversão de língua manual",
        "undo-success": "É possível desfazer a edição.\nVerifique a comparação abaixo, por favor, para se certificar de que corresponde ao que pretende fazer.\nDepois grave as alterações, para finalizar e desfazer a edição.",
        "undo-failure": "Não foi possível desfazer a edição por conflito com alterações intermédias.",
-       "undo-main-slot-only": "Não foi possível desfazer a edição porque ela envolve conteúdo fora da zona principal.",
+       "undo-main-slot-only": "Não foi possível desfazer a edição porque ela envolve conteúdo fora do segmento de revisão principal.",
        "undo-norev": "Não foi possível desfazer a edição porque não existe ou foi apagada.",
        "undo-nochange": "A edição parece já ter sido desfeita.",
        "undo-summary": "Desfez a edição $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussão]])",
        "upload_source_file": "(um ficheiro no seu computador)",
        "listfiles-delete": "eliminar",
        "listfiles-summary": "Esta página especial mostra todos os ficheiros carregados.",
-       "listfiles_search_for": "Pesquisar por nome de média:",
+       "listfiles_search_for": "Pesquisar pelo nome do ficheiro multimédia:",
        "listfiles-userdoesnotexist": "A conta de utilizador \"$1\" não está registada.",
        "imgfile": "ficheiro",
        "listfiles": "Ficheiros",
        "edit-error-long": "Erros:\n\n$1",
        "revid": "revisão $1",
        "pageid": "identificador de página $1",
+       "interfaceadmin-info": "$1\n\nAs permissões de edição de ficheiros CSS/JS/JSON que afetam todo o ''site'' foram recentemente separadas do privilégio <code>editinterface</code>. Se não compreende porque está a receber este erro, consulte [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "As etiquetas &lt;html&gt; não podem ser utilizadas fora de páginas normais.",
        "gotointerwiki": "A sair da wiki {{SITENAME}}",
        "gotointerwiki-invalid": "O título especificado é inválido.",
index e8740e6..41765df 100644 (file)
        "grouppage-bureaucrat": "{{doc-group|bureaucrat|page}}",
        "grouppage-suppress": "{{doc-group|suppress|page}}\n{{Identical|Suppress}}",
        "right-read": "{{doc-right|read}}\nBasic right to read any page.",
-       "right-edit": "Description of edit right",
+       "right-edit": "{{doc-right|edit}}\nBasic right to edit pages that are not protected.\n{{Identical|Edit page}}",
        "right-createpage": "{{doc-right|createpage}}\nBasic right to create pages. The right to edit discussion/talk pages is {{msg-mw|right-createtalk}}.",
        "right-createtalk": "{{doc-right|createtalk}}\nBasic right to create discussion/talk pages. The right to edit other pages is {{msg-mw|right-createpage}}.",
        "right-createaccount": "{{doc-right|createaccount}}\nThe right to [[Special:CreateAccount|create a user account]].",
        "categories": "The page name of [[Special:Categories]].\n{{Identical|Category}}",
        "categories-summary": "{{doc-specialpagesummary|categories}}",
        "categories-submit": "Submit button on [[Special:Categories]]\n{{Identical|Show}}",
-       "categoriespagetext": "{{doc-important|Do not translate or change links.}}\nText displayed in [[Special:Categories]].\n\nIn order to translate \"Unused categories\" and \"wanted categories\" see {{msg-mw|Unusedcategories}} and {{msg-mw|Wantedcategories}}.\n\nParameters:\n* $1 - number of categories",
+       "categoriespagetext": "{{doc-important|Do not translate or change links.}}\nText displayed in [[Special:Categories]].\n\nIn order to translate \"wanted categories\" see {{msg-mw|Wantedcategories}}.\n\nParameters:\n* $1 - number of categories",
        "categoriesfrom": "Used as label for the input box in [[Special:Categories]].\n\nThis message follows the fieldset label {{msg-mw|categories}}, and is followed by the input box.",
        "deletedcontributions": "The message is shown as a link on [[Special:SpecialPages]] to [[Special:DeletedContributions]].\n\n{{Identical|Deleted user contributions}}",
        "deletedcontributions-summary": "{{doc-specialpagesummary|deletedcontributions}}",
        "edit-error-long": "Error message. Parameters:\n* $1 - the error details\nSee also:\n* {{msg-mw|edit-error-short}}\n{{Identical|Error}}",
        "revid": "Used to format a revision ID number in text. Parameters:\n* $1 - Revision ID number.\n{{Identical|Revision}}",
        "pageid": "Used to format a page ID number in text. Parameters:\n* $1 - Page ID number.",
+       "interfaceadmin-info": "Used to wrap the normal permission error for actions which used to only require editinterface but now require more permissions. Parameters:\n* $1 - The normal permission error.",
        "rawhtml-notallowed": "Error message given when $wgRawHtml = true; is set and a user uses an &lt;html&gt; tag in a system message or somewhere other than a normal page.",
        "gotointerwiki": "{{doc-special|GoToInterwiki}}\n\nSpecial:GoToInterwiki is a warning page displayed before redirecting users to external interwiki links. Its triggered by people going to something like [[Special:Search/google:foo]].\n{{Identical|Leaving}}",
        "gotointerwiki-invalid": "Message shown on Special:GoToInterwiki if given an invalid title.",
index c734d04..9bc8be5 100644 (file)
        "rcfilters-quickfilters-placeholder-description": "Chillch'ina churasqakunata qhipaqta llamk'achinaypaq waqaychanaykipaqqa, urapi kaq Llamk'achkaq Ch'illchina suyuchapi sananchana rikch'achata ñit'iy.",
        "rcfilters-savedqueries-defaultlabel": "Waqaychasqa ch'illchinakuna",
        "rcfilters-search-placeholder": "Hukchasqakunata ch'illchiy (sutisuyuta llamk'achiy icha ch'illchinap sutinta maskay)",
+       "rcfilters-filter-editsbyself-description": "Kikiykip llamk'apusqaykikuna.",
        "rcfilters-filter-bots-label": "Rurana antacha",
        "rcfilters-filter-bots-description": "Rurana antachakunap llamk'apusqankuna.",
        "rcfilters-filter-humans-label": "Chiqap runa",
index 12408f4..2b4c144 100644 (file)
        "right-viewmyprivateinfo": "просмотр собственных личных данных (например, адрес электронной почты, настоящее имя)",
        "right-editmyprivateinfo": "правка собственных личных данных (например, адрес электронной почты, настоящее имя)",
        "right-editmyoptions": "редактирование собственных настроек",
-       "right-rollback": "быстрый откат правок последнего участника",
+       "right-rollback": "быстрый откат правок последнего участника, который редактировал страницу",
        "right-markbotedits": "отметка откатываемых правок как правок бота",
        "right-noratelimit": "обход ограничений скорости",
        "right-import": "импорт страниц из других вики",
        "uploadstash-zero-length": "Файл нулевой длины.",
        "invalid-chunk-offset": "Недопустимое смещение фрагмента",
        "img-auth-accessdenied": "Доступ запрещён",
-       "img-auth-nopathinfo": "Отсутствует <code>PATH_INFO</code>.\nВаш сервер не настроен для передачи этих сведений.\nВозможно, он работает на основе CGI и не поддерживает <code>img_auth</code>.\nСм. https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Отсутствует информация о пути.\nВаш сервер должен быть настроен для передачи переменных REQUEST_URI и/или PATH_INFO.\nЕсли это так, попробуйте включить $wgUsePathInfo.\nСм. https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Запрашиваемый путь не относится к настроенной папке загрузок.",
        "img-auth-badtitle": "Невозможно построить правильный заголовок из «$1».",
        "img-auth-nologinnWL": "Вы не вошли в систему, а «$1» не входит в белый список.",
        "cachedspecial-refresh-now": "Просмотреть последнюю версию.",
        "categories": "Категории",
        "categories-submit": "Показать",
-       "categoriespagetext": "{{PLURAL:$1|1=Следующая категория содержит|Следующие категории содержат}} страницы или медиафайлы.\nЗдесь не показаны [[Special:UnusedCategories|неиспользуемые категории]].\nСм. также [[Special:WantedCategories|список требуемых категорий]].",
+       "categoriespagetext": "{{PLURAL:$1|1=Следующая категория существуют|Следующие категории существуют}} на этой вики, и они могут быть неиспользованы.\nСм. также [[Special:WantedCategories|список требуемых категорий]].",
        "categoriesfrom": "Показать категории, начинающиеся с:",
        "deletedcontributions": "Удалённый вклад участника",
        "deletedcontributions-title": "Удалённый вклад",
index 4accf55..0d4bb24 100644 (file)
        "group-autoconfirmed": "Automaticky schválení používatelia",
        "group-bot": "Boti",
        "group-sysop": "Správcovia",
+       "group-interface-admin": "Správcovia rozhrania",
        "group-bureaucrat": "Byrokrati",
        "group-suppress": "Dozorcovia",
        "group-all": "(všetci)",
        "group-autoconfirmed-member": "automaticky {{GENDER:$1|schválený používateľ|schválená používateľka|schválený používateľ}}",
        "group-bot-member": "{{GENDER:$1|bot|botka|bot}}",
        "group-sysop-member": "{{GENDER:$1|správca|správkyňa|správca}}",
+       "group-interface-admin-member": "{{GENDER:$1|správca|správkyňa}} rozhrania",
        "group-bureaucrat-member": "{{GENDER:$1|byrokrat|byrokratka|byrokrat}}",
        "group-suppress-member": "{{GENDER:$1|dozorca|dozorkyňa|dozorca}}",
        "grouppage-user": "{{ns:project}}:Používatelia",
        "grouppage-autoconfirmed": "{{ns:project}}:Automaticky schválení používatelia",
        "grouppage-bot": "{{ns:project}}:Boti",
        "grouppage-sysop": "{{ns:project}}:Správcovia",
+       "grouppage-interface-admin": "{{ns:project}}:Správcovia rozhrania",
        "grouppage-bureaucrat": "{{ns:project}}:Byrokrati",
        "grouppage-suppress": "{{ns:project}}:Dozor",
        "right-read": "Čítať stránky",
        "right-reupload-shared": "Nahrávať lokálne súbory, ktoré majú prednosť pred zdieľaným úložiskom",
        "right-upload_by_url": "Nahrávať súbor z URL adresy",
        "right-purge": "Čistiť vyrovnávaciu pamäť stránky bez potvrdzovacej stránky",
-       "right-autoconfirmed": "Neovplyvnený rýchlostnými limitmi na základe IP adresy",
+       "right-autoconfirmed": "Imunita voči rýchlostným limitom na základe IP adresy",
        "right-bot": "Byť považovaný za automatický proces",
        "right-nominornewtalk": "Pri drobných úpravách diskusnej stránky nevypisovať hlásenie o nových správach",
        "right-apihighlimits": "Používať vyššie limity v požiadavkách API",
        "right-editsemiprotected": "Upravovať stránky zamknuté ako „{{int:protect-level-autoconfirmed}}“",
        "right-editcontentmodel": "Upravovať model obsahu stránky",
        "right-editinterface": "Upravovať správy používateľského rozhrania",
-       "right-editusercss": "Upravovať CSS súbory ostatných používateľov",
-       "right-edituserjson": "Upravovať JSON súbory ostatných používateľov",
-       "right-edituserjs": "Upravovať JS súbory ostatných používateľov",
+       "right-editusercss": "Upravovať CSS súbory iných používateľov",
+       "right-edituserjson": "Upravovať JSON súbory iných používateľov",
+       "right-edituserjs": "Upravovať JavaScript súbory iných používateľov",
+       "right-editsitecss": "Upravovať projektové CSS súbory",
+       "right-editsitejson": "Upravovať projektové JSON súbory",
+       "right-editsitejs": "Upravovať projektové JavaScript súbory",
        "right-editmyusercss": "Upraviť svoje vlastné používateľské súbory CSS",
        "right-editmyuserjson": "Upraviť svoje vlastné používateľské súbory JSON",
        "right-editmyuserjs": "Upraviť svoje vlastné používateľské súbory JavaScript",
        "right-editmyoptions": "Upraviť vlastné nastavenia",
        "right-rollback": "Rýchlo vrátiť úpravy posledného používateľa, ktorý upravoval danú stránku",
        "right-markbotedits": "Označiť vrátené úpravy ako úpravy robota",
-       "right-noratelimit": "Neovplyvnené obmedzeniami",
+       "right-noratelimit": "Imunita voči rýchlostným limitom",
        "right-import": "Importovať stránky z iných wiki",
        "right-importupload": "Importovať stránky nahraním súboru",
        "right-patrol": "Označovanie cudzích úprav ako preverených",
        "grant-createaccount": "Vytvárať účty",
        "grant-createeditmovepage": "Vytvárať, upravovať a presúvať stránky",
        "grant-delete": "Odstraňovať stránky, revízie a položky záznamu",
-       "grant-editinterface": "Upravovať menný priestor MediaWiki a používateľský CSS/JavaScript",
+       "grant-editinterface": "Upravovať menný priestor MediaWiki a projektový/používateľský JSON",
        "grant-editmycssjs": "Upravovať váš používateľský CSS/JavaScript",
        "grant-editmyoptions": "Upravovať nastavenia vášho používateľského účtu",
        "grant-editmywatchlist": "Upravovať váš zoznam sledovaných stránok",
+       "grant-editsiteconfig": "Upravovať projektové a používateľské CSS/JS súbory",
        "grant-editpage": "Upravovať existujúce stránky",
        "grant-editprotected": "Upravovať chránené stránky",
        "grant-highvolume": "Úpravy vo veľkom objeme",
        "activeusers-from": "Zobraziť používateľov počínajúc:",
        "activeusers-noresult": "Neboli nájdení žiadni používatelia.",
        "activeusers-submit": "Zobraziť aktívnych používateľov",
-       "listgrouprights": "Práva skupiny používateľov",
+       "listgrouprights": "Práva skupín používateľov",
        "listgrouprights-summary": "Toto je zoznam skupín používateľov definovaných na tejto wiki a ich prístupových práv.\nMôžete si prečítať [[{{MediaWiki:Listgrouprights-helppage}}|ďalšie informácie]] o jednotlivých právach.",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Udelené právo</span>\n* <span class=\"listgrouprights-revoked\">Odobrané právo</span>",
        "listgrouprights-group": "Skupina",
index a0d4524..75aa015 100644 (file)
        "cachedspecial-refresh-now": "Ogled najnovejše.",
        "categories": "Kategorije",
        "categories-submit": "Prikaži",
-       "categoriespagetext": "{{PLURAL:$1|Naslednja $1 kategorija vsebuje|Naslednji $1 kategoriji vsebujeta|Naslednje $1 kategorije vsebujejo|Naslednjih $1 kategorij vsebuje}} strani ali datoteke.\n[[Special:UnusedCategories|Neuporabljene kategorije]] niso prikazane.\nGlej tudi [[Special:WantedCategories|želene kategorije]].",
+       "categoriespagetext": "{{PLURAL:$1|Naslednja $1 kategorija obstaja|Naslednji $1 kategoriji obstajata|Naslednje $1 kategorije obstajajo|Naslednjih $1 kategorij obstaja}} na tem wikiju in {{PLURAL:$1|je ali pa ni neuporabljena|sta ali pa nista neuporabljeni|so ali pa niso neuporabljene}}.\nGlej tudi [[Special:WantedCategories|želene kategorije]].",
        "categoriesfrom": "Prikaži kategorije, ki se začnejo na:",
        "deletedcontributions": "Izbrisani uporabnikovi prispevki",
        "deletedcontributions-title": "Izbrisani uporabnikovi prispevki",
        "edit-error-long": "Napake:\n\n$1",
        "revid": "redakcija $1",
        "pageid": "ID strani $1",
+       "interfaceadmin-info": "$1\n\nDovoljenja za urejanje datotek CSS/JS/JSON spletišča smo nedavno ločili od dovoljenja <code>editinterface</code>. Če ne razumete, zakaj smo vam izpisali to napako, si oglejte [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "Oznak &lt;html&gt; ni možno uporabljati izven normalnih strani.",
        "gotointerwiki": "Zapuščate {{GRAMMAR:tožilnik|{{SITENAME}}}}",
        "gotointerwiki-invalid": "Naveden naslov je neveljaven.",
index 963b58e..388d26f 100644 (file)
        "speciallogtitlelabel": "Циљ (наслов или {{ns:user}}:корисничко име):",
        "log": "Дневници",
        "logeventslist-submit": "Прикажи",
-       "logeventslist-more-filters": "Ð\9fÑ\80икажи Ð´Ð¾Ð´Ð°Ñ\82не Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÐµ:",
+       "logeventslist-more-filters": "Ð\9fÑ\80иказ Ð´Ð¾Ð´Ð°Ñ\82ниÑ\85 Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÐ°:",
        "logeventslist-patrol-log": "Дневник патролирања",
        "logeventslist-tag-log": "Дневник ознака",
        "all-logs-page": "Сви јавни дневници",
index 083df6b..fb6aa0d 100644 (file)
        "grouppage-bureaucrat": "{{ns:project}}:Warasimu",
        "grouppage-suppress": "{{ns:project}}:Usimamizi",
        "right-read": "Kusoma kurasa",
-       "right-edit": "Kuhariri kurasa",
+       "right-edit": "Hariri kurasa",
        "right-createpage": "Kuanzisha kurasa (ambazo si kurasa za majadiliano)",
        "right-createtalk": "Kuanzisha kurasa za majadiliano",
        "right-createaccount": "Kufungua akaunti mpya za watumiaji",
index 92c9f29..62f4248 100644 (file)
        "trackingcategories-msg": "పహారా కాయు వర్గము",
        "trackingcategories-name": "సందేశం పేరు",
        "trackingcategories-desc": "వర్గపు చేర్పు క్రైటేరియా",
+       "post-expand-template-argument-category-desc": "ఓ మూస పరామితిని విస్తరించాక (మూడు మీసాల బ్రాకెట్ల మధ్య ఉన్నవి, ఇలా: <code>{{{Foo}}}</code>), ఈ పేజీ <code>$wgMaxArticleSize</code> కంటే పెద్దదిగా ఉంది.",
+       "expensive-parserfunction-category-desc": "ఈ పేజీ ఖరీదైన పార్సరు ఫంక్షన్లు చాలా వాటిని వాడుతోంది (<code>#ifexist</code> లాంటివి). [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] చూడండి.",
        "broken-file-category-desc": "ఈ పుటలో విరిగిన దస్త్ర లంకె ఉన్నది (దస్త్రం ఉనికిలో లేనప్పుడు దస్త్రానికి ఎంబెడ్ చేయు లంకె).",
        "trackingcategories-nodesc": "వివరణ లేదు.",
        "trackingcategories-disabled": "వర్గం అచేతనమై ఉంది",
        "delete-warning-toobig": "ఈ పేజీకి $1 {{PLURAL:$1|కూర్పుకు|కూర్పులకు}} మించిన, చాలా పెద్ద దిద్దుబాటు చరితం ఉంది. దాన్ని తొలగిస్తే {{SITENAME}}కి చెందిన డేటాబేసు కార్యాలకు ఆటంకం కలగొచ్చు; అప్రమత్తతో ముందుకుసాగండి.",
        "deleteprotected": "ఈ పేజీ సంరక్షణలో ఉంది కనుక మీరు తొలగించలేరు.",
        "deleting-backlinks-warning": "<strong>హెచ్చరిక:</strong> మీరు తొలగించబోతున్న పేజీకి [[Special:WhatLinksHere/{{FULLPAGENAME}}|ఇతర పేజీల]] నుండి లింకులు ఉన్నాయి. లేదా ఇతర పేజీల్లో అది ట్రాన్స్‍క్లూడు అవుతోంది.",
+       "deleting-subpages-warning": "<strong>హెచ్చరిక:</strong> మీరు తొలగించబోతున్న పేజీకి [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|ఒక ఉపపేజీ ఉంది|$1 ఉపపేజీలున్నాయి|51=50 కి పైగా ఉపపేజీలున్నాయి}}]].",
        "rollback": "దిద్దుబాట్లను రద్దుచేయి",
        "rollbacklink": "రద్దుచేయి",
        "rollbacklinkcount": "$1 {{PLURAL:$1|మార్పును|మార్పులను}} రద్దుచేయి",
        "rollbacklinkcount-morethan": "$1 కంటే ఎక్కువ {{PLURAL:$1|మార్పును|మార్పులను}} రద్దుచేయి",
        "rollbackfailed": "రద్దుచేయటం విఫలమైంది",
+       "rollback-missingrevision": "కూర్పు డేటాను లోడు చెయ్యలేకపోయాం.",
        "cantrollback": "రచనను వెనక్కి తీసుకువెళ్ళలేము; ఈ పేజీకి ఇదొక్కటే రచన.",
        "alreadyrolled": "[[:$1]]లో [[User:$2|$2]] ([[User talk:$2|చర్చ]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) చేసిన చివరి మార్పును రద్దు చెయ్యలేము;\nమరెవరో ఆ పేజీని వెనక్కి మళ్ళించారు, లేదా మార్చారు.\n\nచివరి మార్పులు చేసినవారు: [[User:$3|$3]] ([[User talk:$3|చర్చ]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "దిద్దుబాటు సారాశం: <em>$1</em>.",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|చర్చ]]) చేసిన మార్పులను [[User:$1|$1]] చివరి కూర్పు వరకు తిప్పికొట్టారు.",
        "revertpage-nouser": "దాగి ఉన్న వాడుకరి చేసిన మార్పులను [[User:$1|$1]] చివరి కూర్పు వరకు తిప్పికొట్టారు",
-       "rollback-success": "$1 చేసిన దిద్దుబాట్లను వెనక్కు తీసుకెళ్ళాం; తిరిగి $2 చేసిన చివరి కూర్పుకు మార్చాం.",
+       "rollback-success": "{{GENDER:$3|$1}} చేసిన దిద్దుబాట్లను వెనక్కు తీసుకెళ్ళాం; తిరిగి {{GENDER:$4|$2}} చేసిన చివరి కూర్పుకు మార్చాం.",
+       "rollback-success-notify": "$1 చేసిన దిద్దుబాట్లను వెనక్కు తీసుకెళ్ళాం;\nతిరిగి $2 చేసిన చివరి కూర్పుకు మార్చాం. [$3 మార్పులు చూపించు]",
        "sessionfailure-title": "సెషను వైఫల్యం",
        "sessionfailure": "మీ లాగిన్ సెషనుతో ఏదో సమస్య ఉన్నట్లుంది;\nసెషను హైజాకు కాకుండా ఈ చర్యను రద్దు చేసాం.\nఫారమును తిరిగి సమర్పించండి.",
        "changecontentmodel": "పేజీ కంటెంటు మోడలును మార్చు",
        "namespace": "పేరుబరి:",
        "invert": "ఎంపికను తిరగవెయ్యి",
        "tooltip-invert": "ఎంచుకున్న పేరుబరి (చెక్ చేసి ఉంటే అనుబంధ పేరుబరి కూడా) లోని పేజీల్లో జరిగిన మార్పులను దాచేందుకు ఈ పెట్టెను చెక్ చెయ్యండి",
+       "tooltip-whatlinkshere-invert": "ఎంచుకున్న పేరుబరి లోని పేజీల నుండి వచ్చే లింకులను దాచేందుకు ఈ పెట్టెను చెక్ చెయ్యండి.",
        "namespace_association": "సంబంధిత పేరుబరి",
        "tooltip-namespace_association": "ఎంచుకున్న పేరుబరికి చెందిన చర్చ లేదా విషయం పేరుబరిని కూడా ఎంచుకునేందుకు ఈ పెట్టెను చెక్ చెయ్యండి.",
        "blanknamespace": "(మొదటి)",
        "uctop": "(ప్రస్తుత)",
        "month": "ఈ నెల నుండి (అంతకు ముందువి):",
        "year": "ఈ సంవత్సరం నుండి (అంతకు ముందువి):",
+       "date": "ఈ తేదీవి (అంతకు ముందువీ):",
        "sp-contributions-newbies": "కొత్త ఖాతాల యొక్క రచనలని మాత్రమే చూపించు",
        "sp-contributions-newbies-sub": "కొత్త ఖాతాల కోసం",
        "sp-contributions-newbies-title": "కొత్త ఖాతాల వాడుకరుల మార్పుచేర్పులు",
        "sp-contributions-uploads": "ఎక్కింపులు",
        "sp-contributions-logs": "చిట్టాలు",
        "sp-contributions-talk": "చర్చ",
-       "sp-contributions-userrights": "వాడుకరి హక్కుల నిర్వహణ",
+       "sp-contributions-userrights": "{{GENDER:$1|వాడుకరి}} హక్కుల నిర్వహణ",
        "sp-contributions-blocked-notice": "ఈ వాడుకరిపై ప్రస్తుతం నిరోధం ఉంది.\nనిరోధపు చిట్టాలోని చివరి పద్దుని మీ సమాచారంకోసం ఇస్తున్నాం:",
        "sp-contributions-blocked-notice-anon": "ఈ ఐపీ చిరునామాపై ప్రస్తుతం నిరోధం ఉంది.\nనిరోధపు చిట్టాలోని చివరి పద్దుని మీ సమాచారంకోసం ఇస్తున్నాం:",
        "sp-contributions-search": "రచనల కోసం అన్వేషణ",
        "sp-contributions-newonly": "పేజీని సృష్టించిన మార్పులను మాత్రమే చూపించు",
        "sp-contributions-hideminor": "చిన్న మార్పులను దాచు",
        "sp-contributions-submit": "వెతుకు",
+       "sp-contributions-outofrange": "ఫలితాలేమీ చూపించలేక పోయాం. అడిగిన IP శ్రేణి CIDR పరిమితి అయిన /$1 కంటే పెద్దదిగా ఉంది.",
        "whatlinkshere": "ఇక్కడికి లింకైనవి",
        "whatlinkshere-title": "\"$1\"కి లింకున్న పుటలు",
        "whatlinkshere-page": "పేజీ:",
        "unblocked-id": "$1 అనే నిరోధాన్ని తొలగించాం",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] పైనున్న నిరోధాన్ని ఎత్తివేసాం.",
        "blocklist": "నిరోధిత వాడుకరులు",
+       "autoblocklist": "ఆటోబ్లాకులు",
        "autoblocklist-submit": "వెతుకు",
+       "autoblocklist-legend": "ఆటోబ్లాకుల జాబితా",
+       "autoblocklist-localblocks": "స్థానిక {{PLURAL:$1|ఆటోబ్లాకు|ఆటోబ్లాకులు}}",
+       "autoblocklist-total-autoblocks": "ఆటోబ్లాకుల మొత్తం సంఖ్య: $1",
+       "autoblocklist-empty": "ఆటోబ్లాకుల జాబితా ఖాళీగా ఉంది.",
+       "autoblocklist-otherblocks": "ఇతర {{PLURAL:$1|ఆటోబ్లాకు|ఆటోబ్లాకులు}}",
        "ipblocklist": "నిరోధించబడిన వాడుకరులు",
        "ipblocklist-legend": "నిరోధించబడిన వాడుకరిని వెతకండి",
        "blocklist-userblocks": "ఖాతా నిరోధాలను దాచు",
        "tooltip-pt-mycontris": "{{GENDER:|మీ}} మార్పుచేర్పుల జాబితా",
        "tooltip-pt-anoncontribs": "ఈ IP అడ్రసు నుండి చేసిన దిద్దుబాట్ల జాబితా",
        "tooltip-pt-login": "మిమ్మల్ని లాగినవమని ప్రోత్సహిస్తున్నాం; కానీ అది తప్పనిసరేమీ కాదు.",
+       "tooltip-pt-login-private": "ఈ వికీని వాడాలంటే మీరు లాగినై ఉండాలి.",
        "tooltip-pt-logout": "లాగౌటవండి",
        "tooltip-pt-createaccount": "మీరొక ఖాతాని సృష్టించుకొని ప్రవేశించటాన్ని సమర్ధిస్తున్నాము; కానీ, అది అవసరం కాదు, ఐచ్ఛికం మాత్రమే.",
        "tooltip-ca-talk": "విషయపు పేజీ గురించి చర్చ",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|చర్చ]])",
        "timezone-local": "స్థానిక",
        "duplicate-defaultsort": "హెచ్చరిక: డిఫాల్టు పేర్చు కీ \"$2\", గత డిఫాల్టు పేర్చు కీ \"$1\" ని అతిక్రమిస్తుంది.",
+       "invalid-indicator-name": "<strong>లోపం:</strong> పేజీ స్థితి సూచిక <code>పేరు</code> విశేషణం ఖాళీగా ఉండరాదు.",
        "version": "సంచిక",
        "version-extensions": "స్థాపించిన పొడగింతలు",
        "version-skins": "స్థాపించిన అలంకారాలు",
        "version-specialpages": "ప్రత్యేక పేజీలు",
        "version-parserhooks": "పార్సరు కొక్కాలు",
        "version-variables": "చరరాశులు",
+       "version-editors": "ఎడిటర్లు",
        "version-antispam": "స్పాము నివారణ",
        "version-other": "ఇతర",
        "version-mediahandlers": "మీడియాను ఫైళ్లను నడిపించే పొడిగింపులు",
        "version-entrypoints": "ప్రవేశ బిందు చిరునామాలు",
        "version-entrypoints-header-entrypoint": "ప్రవేశ బిందువు",
        "version-entrypoints-header-url": "చిరునామా",
+       "version-libraries": "స్థాపిత లైబ్రరీలు",
        "version-libraries-library": "గ్రంథాలయం",
        "version-libraries-version": "సంచిక",
        "version-libraries-license": "లైసెన్సు",
        "redirect-page": "పేజీ ఐడీ",
        "redirect-revision": "పేజీ కూర్పు",
        "redirect-file": "దస్త్రపు పేరు",
+       "redirect-logid": "లాగ్ ID",
        "redirect-not-exists": "విలువ కనబడలేదు",
        "fileduplicatesearch": "ఫైళ్ల మారుప్రతుల కోసం వెతుకు",
        "fileduplicatesearch-summary": "మారుప్రతుల కోసం ఫైళ్ల హాష్ విలువ ఆధారంగా వెతుకు.",
        "tag-filter": "[[Special:Tags|ట్యాగుల]] వడపోత:",
        "tag-filter-submit": "వడపోయి",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ట్యాగు|ట్యాగులు}}]]: $2)",
+       "tag-mw-contentmodelchange-description": "పేజీ [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel కంటెంటు మోడలును మార్చేసే] దిద్దుబాట్లు",
        "tag-mw-new-redirect": "కొత్త దారిమార్పు",
+       "tag-mw-new-redirect-description": "కొత్త దారిమార్పును సృష్టించే లేదా ఓ పేజీని దారిమార్పుగా మార్చేసే దిద్దుబాట్లు",
+       "tag-mw-removed-redirect-description": "ఓ దారిమార్పును దారిమార్పు-కానిది గా మార్చే దిద్దుబాట్లు",
+       "tag-mw-changed-redirect-target": "దారిమార్పు లక్ష్యాన్ని మార్చారు",
+       "tag-mw-changed-redirect-target-description": "దారిమార్పు లక్ష్యాన్ని మార్చే దిద్దుబాట్లు",
        "tag-mw-blank": "తుడిచివేత",
        "tag-mw-blank-description": "పేజీని తుడిచివేసే దిద్దుబాట్లు",
+       "tag-mw-replace-description": "పేజీలోని పాఠ్యంలో 90% కి పైగా తీసివేసే దిద్దుబాట్లు",
        "tags-title": "టాగులు",
        "tags-intro": "మార్పుచేర్పులకు సాఫ్టువేరు ఇచ్చే ట్యాగులను, వాటి అర్ధాలనూ ఈ పేజీ చూపిస్తుంది.",
        "tags-tag": "ట్యాగు పేరు",
index f8d296b..f81415e 100644 (file)
        "nstab-media": "Pahina ng midya",
        "nstab-special": "Natatanging pahina",
        "nstab-project": "Pahina ng proyekto",
-       "nstab-image": "Talaksan",
+       "nstab-image": "File",
        "nstab-mediawiki": "Mensahe",
        "nstab-template": "Padron",
        "nstab-help": "Pahina ng tulong",
        "createacct-another-username-ph": "Ilagay ang Pangalan",
        "yourpassword": "Password:",
        "userlogin-yourpassword": "Password",
-       "userlogin-yourpassword-ph": "Ipasok ang iyong hudyat",
-       "createacct-yourpassword-ph": "Ilagay ang hudyat",
+       "userlogin-yourpassword-ph": "Ipasok ang iyong password",
+       "createacct-yourpassword-ph": "Ilagay ang password",
        "yourpasswordagain": "Password mo uli:",
-       "createacct-yourpasswordagain": "Tiyakin ang hudyat",
-       "createacct-yourpasswordagain-ph": "Muling ilagay ang hudyat",
-       "userlogin-remembermypassword": "Panatilihin akong nakalagda",
+       "createacct-yourpasswordagain": "Tiyakin ang password",
+       "createacct-yourpasswordagain-ph": "Muling ilagay ang password",
+       "userlogin-remembermypassword": "Panatilihin akong naka-login",
        "userlogin-signwithsecure": "Gumamit ng ligtas na koneksyon",
        "cannotlogin-title": "Hindi maka-log in",
        "cannotlogin-text": "Imposible and pag-log in.",
        "yourdomainname": "Dominyo mo:",
        "password-change-forbidden": "Hindi mo maaaring palitan ang mga password sa wiking ito.",
        "externaldberror": "Maaaring may kamalian sa pagpapatotoo ng database o kaya hindi ka pinahintulutang isapanahon ng iyong panlabas na account.",
-       "login": "Lumagda",
+       "login": "Mag-login",
        "login-security": "Patunayan ang iyong pagkakakilanlan",
-       "nav-login-createaccount": "Lumagda / lumikha ng account",
+       "nav-login-createaccount": "Mag-login / lumikha ng account",
        "logout": "Umalis sa pagkaka-login",
        "userlogout": "Umalis sa pagkaka-login",
        "notloggedin": "Hindi naka-login",
-       "userlogin-noaccount": "Wala ka pa bang kuwenta?",
+       "userlogin-noaccount": "Wala ka pa bang account?",
        "userlogin-joinproject": "Sumali sa {{SITENAME}}",
        "createaccount": "Lumikha ng account",
-       "userlogin-resetpassword-link": "Nakalimutan ba ang iyong hudyat?",
-       "userlogin-helplink2": "Tulong sa paglagda",
+       "userlogin-resetpassword-link": "Nakalimutan ba ang iyong password?",
+       "userlogin-helplink2": "Tulong sa pag-login",
        "userlogin-loggedin": "Naka-login ka na bilang {{GENDER:$1|$1}}. Gamitin ang form sa ibaba upang maka-login bilang ibang tagagamit o user.",
        "userlogin-reauth": "Kailangan mong mag-log in muli para mapatunayan na ikaw si {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Lumikha ng iba pang account",
        "createacct-emailrequired": "Direksiyong e-liham:",
-       "createacct-emailoptional": "Direksiyong e-liham (hindi kailangan)",
-       "createacct-email-ph": "Ipasok ang iyong direksiyong e-liham",
+       "createacct-emailoptional": "Email (hindi kailangan)",
+       "createacct-email-ph": "Ipasok ang iyong email address",
        "createacct-another-email-ph": "Ipasok ang email address",
        "createaccountmail": "Gumamit ng pansamantalang random na password at ipadala ito sa email na nakasaad sa ibaba",
        "createaccountmail-help": "Maaaring magamit para gumawa ng account para sa isang tao ng hindi nalalaman ang password.",
        "createacct-reason": "Dahilan",
        "createacct-reason-ph": "Bakit ka gagawa ng isa pang account?",
        "createacct-reason-help": "Mensaheng ipinapakita sa listahan ng paggawa ng account",
-       "createacct-submit": "Likhain ang iyong kuwenta",
+       "createacct-submit": "Likhain ang iyong account",
        "createacct-another-submit": "Lumikha ng account",
        "createacct-continue-submit": "Ituloy ang paggawa ng account",
        "createacct-another-continue-submit": "Ituloy ang paggawa ng account",
        "loginerror": "Kamalian sa paglagda",
        "createacct-error": "May pagkakamali sa paglikha ng account",
        "createaccounterror": "Hindi mailikha ang account: $1",
-       "nocookiesnew": "Nalikha ang account ng tagagamit, ngunit hindi ka nakalogin.\nGumagamit ang {{SITENAME}} ng cookies upang makalogin ang mga tagagamit.\nHindi pinapagana ng browser mo ang cookies.\nPaganahin ito at subukang lumagda na kasama ang bagong pangalan at password.",
+       "nocookiesnew": "Nalikha ang account ng tagagamit, ngunit hindi ka naka-login.\nGumagamit ang {{SITENAME}} ng cookies upang maka-login ang mga tagagamit.\nHindi pinapagana ng browser mo ang cookies.\nPaganahin ito at subukang mag-login na kasama ang bagong pangalan at password.",
        "nocookieslogin": "Gumagamit ang {{SITENAME}} ng mga kuki (''cookies'') para mailagda ang mga tagagamit.\nHindi mo pinagagana ang mga kuki.\nPaki-andar mo ang mga ito at sumubok uli.",
        "nocookiesfornew": "Hindi nalikha ang account ng tagagamit, dahil hindi namin matiyak ang pinagmulan nito. \nTiyaking mayroon kang pinagaganang cookies, ikarga muli ang pahinang ito at subukan muli.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
        "wrongpasswordempty": "Walang laman ang ipinasok na password.\nPakisubok muli.",
        "passwordtooshort": "Ang mga password ay dapat mayroong {{PLURAL:$1|1 panitik|$1 panitik}} (karakter).",
        "passwordtoolong": "Ang mga password ay hindi maaaring mas mahaba sa {{PLURAL:$1|1 panitik|$1 panitik}}.",
-       "passwordtoopopular": "Hindi maaaring gamitin ang mga hudyat (''password'') na pangkaraniwang pinipili. Mangyaring pumili ng higit na natatanging hudyat.",
+       "passwordtoopopular": "Hindi maaaring gamitin ang mga piniling pangkaraniwang password. Mangyaring pumili ng higit na natatanging password na mahirap hulaan.",
        "password-name-match": "Dapat magkaiba ang password mo sa bansag o username mo.",
        "password-login-forbidden": "Ipinagbabawal ang paggamit ng ganitong pangalan ng tagagamit at password.",
        "mailmypassword": "Baguhin ang password",
        "loginlanguagelabel": "Wika: $1",
        "suspicious-userlogout": "Tinanggihan ang inyong kahilingang umalis sa pagkalagda dahil tila ito ay ipinadala ng sirang pambasa-basa o apoderadong pambaon (''caching proxy'')",
        "createacct-another-realname-tip": "Hindi kinakailangan ang tunay na pangalan.\nKung nais mo na ibigay ito, gagamitin ito para sa pagbibigay ng atribusyon para sa kanilang gawa.",
-       "pt-login": "Lumagda",
-       "pt-login-button": "Lumagda",
+       "pt-login": "Mag-login",
+       "pt-login-button": "Mag-login",
        "pt-login-continue-button": "Magpatuloy sa paglagda",
-       "pt-createaccount": "Lumikha ng kuwenta",
+       "pt-createaccount": "Lumikha ng account",
        "pt-userlogout": "Umalis sa pagkakatala",
        "php-mail-error-unknown": "Hindi malamang kamalian sa tungkulin ng liham ng PHP ()",
        "user-mail-no-addy": "Sinubukang magpadala ng e-liham na walang tirahan na para sa e-liham.",
        "botpasswords": "Mga password ng bot",
        "botpasswords-label-appid": "Pangalan ng bot:",
        "botpasswords-label-delete": "Burahin",
-       "botpasswords-label-resetpassword": "Itakdang-muli/baguhin ang hudyat (password)",
+       "botpasswords-label-resetpassword": "Itakdang-muli/baguhin ang password",
        "botpasswords-label-grants-column": "Ipinagkaloob na",
        "resetpass_forbidden": "Hindi mababago ang mga password",
        "resetpass-no-info": "Nakalagda ka dapat para tuwirang mapuntahan ang pahina ito.",
        "resetpass-expired": "Paso na ang iyong password. Pakipalit ng bagong password upang maka-login.",
        "resetpass-expired-soft": "Napaso na ang iyong password at kailangan i-reset. Pumili ng bagong password o i-klik ang \"{{int:authprovider-resetpass-skip-label}}\" upang i-reset sa ibang pagkakataon.",
        "resetpass-validity-soft": "Hindi matanggap ang iyong password: $1\n\nPumili ng bagong password ngayon, o i-klik ang \"{{int:authprovider-resetpass-skip-label}}\" para i-reset ito sa ibang pagkakataon.",
-       "passwordreset": "Muling pagtatakda ng hudyat",
+       "passwordreset": "Muling pagtatakda ng password",
        "passwordreset-text-one": "Ikumpleto ang form na ito upang makatanggap ng pansamantalang password sa pamamagitan ng email.",
        "passwordreset-text-many": "{{PLURAL:$1|Ipasok sa isa sa mga field upang makatanggap ng isang pansamantalang password sa pamamagitan ng email.}}",
        "passwordreset-disabled": "Hindi pinagagana sa wiking ito ang muling mga pagtatakda ng password.",
        "passwordreset-email": "Direksiyong e-liham:",
        "passwordreset-emailtitle": "Mga detalye ng account sa {{SITENAME}}",
        "passwordreset-emailtext-ip": "Isang tao (marahil ay ikaw, mula sa IP address na $1) ang humiling ng isang paalala sa iyong mga detalye ng account para sa {{SITENAME}} ($4). Ang sumusunod na {{PLURAL:$3|account ng tagagamit ay|mga account ng tagagamit ay}} may kaugnayan sa email address na ito:\n\n$2\n\n{{PLURAL:$3|Ang pansamantalang password na ito|Ang mga pansamantalang password na ito}} ay mawawalan ng bisa sa loob ng {{PLURAL:$5|isang araw|$5 araw}}.\nDapat kang mag-login at pumili ng isang bagong password ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang orihinal mong password, at hindi mo na nais palitan ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng luma mong password.",
-       "passwordreset-emailtext-user": "Ang tagagamit na si $1 sa {{SITENAME}} ay humiling ng isang reset ng iyong password para sa {{SITENAME}}\n($4). Ang sumusunod na pangtagagamit na {{PLURAL:$3|akawnt ay|mga akawnt ay}} may kaugnayan sa tirahang ito ng e-liham:\n\n$2\n\n{{PLURAL:$3|Ang pansamantalang hudyat na ito|Ang pansamantalang mga hudyat na ito}} mawawalan ng bias sa loob ng {{PLURAL:$5|isang araw|$5 mga araw}}.\nDapat kang lumagda at pumili ng isang hudyat ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang iyong orihinal na hudyat, at hindi mo na nais palitan pa ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng iyong lumang hudyat.",
+       "passwordreset-emailtext-user": "Ang tagagamit na si $1 sa {{SITENAME}} ay humiling ng isang reset ng iyong password para sa {{SITENAME}}\n($4). Ang sumusunod na pangtagagamit na {{PLURAL:$3|account ay|mga account ay}} may kaugnayan sa tirahang ito ng e-mail:\n\n$2\n\n{{PLURAL:$3|Ang pansamantalang password na ito|Ang pansamantalang mga password na ito}} mawawalan ng bisa sa loob ng {{PLURAL:$5|isang araw|$5 mga araw}}.\nDapat kang mag-login at pumili ng isang password ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang iyong orihinal na password, at hindi mo na nais palitan pa ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng iyong lumang password.",
        "passwordreset-emailelement": "Pangalan ng tagagamit: \n$1\n\nPansamantalang password: \n$2",
        "passwordreset-emailsentemail": "Kapag ang e-liham na address na ito ay nauugnay sa iyong account, mayroong isang pag-reset ng password na e-liham na maipapadala.",
        "changeemail": "Baguhin ang direksiyong e-liham",
        "changeemail-header": "Kumpletuhin ang form na ito para mabago ang iyong e-liham na address. Kung gusto mong tanggalin ang pagkaugnay ng kahit anong e-liham na address mula sa iyong account, iwanan ang bagong e-liham na address na blanko kapag ipapasa ang form.",
-       "changeemail-no-info": "Kailangan mong lumagda upang tuwirang mapuntahan ang pahinang ito.",
+       "changeemail-no-info": "Kailangan mong mag-login upang tuwirang mapuntahan ang pahinang ito.",
        "changeemail-oldemail": "Kasalukuyang direksiyong e-liham:",
        "changeemail-newemail": "Bagong direksiyong e-liham:",
        "changeemail-none": "(wala)",
        "nowiki_sample": "Isingit ang hindi nakapormat na teksto dito",
        "nowiki_tip": "Balewalain ang pormat na pangwiki",
        "image_sample": "Halimbawa.jpg",
-       "image_tip": "Talaksang nakabaon",
+       "image_tip": "File na naka-embed",
        "media_sample": "Halimbawa.ogg",
-       "media_tip": "Kawing ng talaksan",
+       "media_tip": "Link ng file",
        "sig_tip": "Lagda mo na may tatak ng oras",
        "hr_tip": "Pahalagang na guhit (gamitin nang madalang)",
        "summary": "Buod:",
        "nosuchsectiontitle": "Hindi mahanap ang seksyon",
        "nosuchsectiontext": "Sinubukan mong baguhin ang isang seksyong hindi umiiral.\nMaaaring inilipat o ibinura ito habang tinitingnan mo ang pahina.",
        "loginreqtitle": "Paglagda/Pagtala Kailangan",
-       "loginreqlink": "lumagda/tumala",
+       "loginreqlink": "mag-login",
        "loginreqpagetext": "Kailangan mong $1 para matanaw ang ibang mga pahina.",
        "accmailtitle": "Ipinadala na ang password.",
        "accmailtext": "Ipinadala na sa $2 ang isang password na nilikha ng pagkakataon para kay [[User talk:$1|$1]].  Maaari itong baguhin sa pahinang ''[[Special:ChangePassword|palitan ang password]]'' kapag nag-login.",
        "newarticle": "(Bago)",
        "newarticletext": "Sinundan mo ang isang kawing para sa isang pahinang hindi pa umiiral.\nPara likhain ang pahina, magsimulang magmakinilya sa loob ng kahong nasa ibaba (tingnan ang [$1 pahina ng tulong] para sa mas maraming kabatiran).\nKung napunta ka rito dahil sa pagkakamali, pakipindot ang pinduntang '''balik''' ('''''back''''') ng iyong pantingin-tingin (''browser'').",
-       "anontalkpagetext": "Ito ang pahinang usapan para sa isang hindi nakikilalang tagagamit na hindi pa lumilikha ng account, o kaya hindi ito ginagamit.\nKaya't kinailangan naming gamitin ang may bilang na IP address para makilala siya.\nMaaaring pagsaluhan ng ilang mga tagagamit ang ganiyang  IP address.\nKung isa kang hindi nagpapakilalang tagagamit at nakadaramang may mga walang saysay na komentong patungkol sa iyo, [[Special:CreateAccount|pakilikha ng isang account]] o [[Special:UserLogin|lumagda]] para maiwasan ang kalituhan o mapagkamalan ka bilang ibang hindi nakikilalang mga tagagamit sa hinaharap.",
+       "anontalkpagetext": "Ito ang pahinang usapan para sa isang hindi nakikilalang tagagamit na hindi pa lumilikha ng account, o kaya hindi ito ginagamit.\nKaya't kinailangan naming gamitin ang may bilang na IP address para makilala siya.\nMaaaring pagsaluhan ng ilang mga tagagamit ang ganiyang  IP address.\nKung isa kang hindi nagpapakilalang tagagamit at nakadaramang may mga walang saysay na komentong patungkol sa iyo, [[Special:CreateAccount|pakilikha ng isang account]] o [[Special:UserLogin|mag-login]] para maiwasan ang kalituhan o mapagkamalan ka bilang ibang hindi nakikilalang mga tagagamit sa hinaharap.",
        "noarticletext": "Kasalukuyang walang teksto sa loob ng pahinang ito.\nMaaari mong [[Special:Search/{{PAGENAME}}|hanapin ang pamagat ng pahinang ito]] sa loob iba pang mga pahina,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} maghanap sa kaugnay na mga talaan],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} baguhin ang pahinang ito]</span>.",
        "noarticletext-nopermission": "Kasalukuyang walang teksto sa pahinang ito.\nMaaari mong [[Special:Search/{{PAGENAME}}|hanapin ang pamagat ng pahinang ito]] sa ibang mga pahina,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} maghanap sa kaugnay na mga talaan]</span>.",
        "missing-revision": "Hindi umiiral ang rebisyong #$1 ng pahinang napangalanang \"{{FULLPAGENAME}}\".\n\nKaraniwang itong dulot ng pagsunod sa isang wala na sa panahong kawing ng kasaysayan na papunta sa isang pahinang nabura na.\nMatatagpuan ang mga detalye sa loob ng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan ng pagbura].",
        "searchprofile-everything": "Lahat ng bagay",
        "searchprofile-advanced": "Mas mataas na antas",
        "searchprofile-articles-tooltip": "Hanapin sa $1",
-       "searchprofile-images-tooltip": "Maghanap ng mga talaksan",
+       "searchprofile-images-tooltip": "Maghanap ng mga file",
        "searchprofile-everything-tooltip": "Hanapin ang lahat ng nilalaman (kabilang ang mga pahina ng usapan)",
        "searchprofile-advanced-tooltip": "Hanapin sa pinasadyang mga espasyo ng pangalan",
        "search-result-size": "$1 ({{PLURAL:$2|1 salita|$2 salita}})",
        "action-move-subpages": "ilipat itong pahina, pati ang mga kabahaging pahina (subpahina) nito",
        "action-move-rootuserpages": "ilipat ang mga pinagugatang mga pahina ng tagagamit",
        "action-movefile": "ilipat ang talaksang ito",
-       "action-upload": "ikarga itong talaksan",
+       "action-upload": "i-upload itong file",
        "action-reupload": "patungan itong pahinang umiiral",
        "action-reupload-shared": "daigin itong talaksan sa isang pinagsasaluhang taguan/repositoryo",
        "action-upload_by_url": "ikarga itong talaksan mula sa isang adres ng URL",
        "recentchangeslinked-summary": "Ito ang tala ng mga pagbabagong ginawa kamakailan sa mga pahinang naka-link mula sa isang tinukoy na pahina (o sa mga kasapi ng isang tinukoy na kategorya). <strong>Makapal na teksto</strong> ang mga pahinang [[Special:Watchlist|iyong mga binabantayan]].",
        "recentchangeslinked-page": "Pangalan ng pahina:",
        "recentchangeslinked-to": "Ipakita ang mga pagbabago sa mga pahinang nakaugnay sa isang binigay na pahina sa halip",
-       "upload": "Magkarga ng talaksan",
+       "upload": "Mag-upload ng file",
        "uploadbtn": "Mag-upload ng file",
        "reuploaddesc": "Kanselahin/Iurong ang pagkarga at magbalik sa pormularyo ng pagkakarga",
        "upload-tryagain": "Ipasa ang binagong paglalarawan ng talaksan",
        "upload_source_file": " (isang talaksan sa iyong kompyuter)",
        "listfiles-summary": "Ipinapakita ng natatanging pahinang ito ang lahat ng naikargang mga talaksan.\nKapag sinala ng tagagamit, tanging mga talaksan lang kung saan nagkarga ang tagagamit na iyan ng pinaka kamakailang bersiyon ng talaksan ang ipinapakita.",
        "listfiles_search_for": "Hanapin ang pangalan ng midya:",
-       "imgfile": "talaksan",
+       "imgfile": "file",
        "listfiles": "Talaan ng file",
        "listfiles_thumb": "Kagyat",
        "listfiles_date": "Petsa",
        "listfiles_count": "Mga bersiyon",
        "listfiles-latestversion-yes": "Oo",
        "listfiles-latestversion-no": "Hindi",
-       "file-anchor-link": "Talaksan",
-       "filehist": "Kasaysayan ng talaksan",
+       "file-anchor-link": "File",
+       "filehist": "Kasaysayan ng file",
        "filehist-help": "Pindutin ang isang petsa/oras para makita ang anyo ng talaksan noong panahong iyon.",
        "filehist-deleteall": "burahin lahat",
        "filehist-deleteone": "burahin",
        "filehist-revert": "ibalik",
        "filehist-current": "kasalukuyan",
        "filehist-datetime": "Petsa/Oras",
-       "filehist-thumb": "Kagyat",
+       "filehist-thumb": "Thumbnail",
        "filehist-thumbtext": "Kagyat (''thumbnail'') para sa bersyon mula noong $1",
        "filehist-nothumb": "Walang kagyat (''thumbnail'')",
        "filehist-user": "Tagagamit",
        "filehist-dimensions": "Sukat",
        "filehist-filesize": "Sukat ng talaksan",
        "filehist-comment": "Komento",
-       "imagelinks": "Paggamit ng talaksan",
+       "imagelinks": "Paggamit ng file",
        "linkstoimage": "Nakakawing ang sumusunod na {{PLURAL:$1|pahina|$1 pahina}} sa talaksang ito:",
        "linkstoimage-more": "Mahigit sa $1 {{PLURAL:$1|pahina|mga pahina}} ang nakakawing sa talaksang ito.\nIpinapakita sa sumusunod na talaan ang {{PLURAL:$1|unang pahina lamang|unang $1 mga pahina lamang}} na nakakawing sa talaksang ito.\nMayroong makukuhang [[Special:WhatLinksHere/$2|buong talaan]].",
        "nolinkstoimage": "Walang pahinang nakakawing sa talaksang ito.",
        "tooltip-pt-watchlist": "Ang talaan ng mga pagbabago sa mga pahinang binabantayan mo",
        "tooltip-pt-mycontris": "Talaan ng mga ambag {{GENDER:|mo}}",
        "tooltip-pt-anoncontribs": "Mga tala ng binago ng IP address na ito",
-       "tooltip-pt-login": "Hinihikayat kang lumagda; gayunpaman, hindi ito kinakailangan.",
+       "tooltip-pt-login": "Hinihikayat kang mag-login; gayunpaman, hindi ito kinakailangan.",
        "tooltip-pt-logout": "Umalis sa pagkaka-login",
-       "tooltip-pt-createaccount": "Hinihikayat kang lumikha ng kuwenta at lumagda; gayunpaman, hindi ito kinakailangan",
+       "tooltip-pt-createaccount": "Hinihikayat kang lumikha ng account at mag-login; gayunpaman, hindi ito kinakailangan",
        "tooltip-ca-talk": "Usapan tungkol sa nilalaman ng pahinang ito",
        "tooltip-ca-edit": "Baguhin ang pahinang ito",
        "tooltip-ca-addsection": "Magsimula ng bagong seksiyon",
        "tooltip-feed-atom": "Sindikasyong Atom para sa pahinang ito",
        "tooltip-t-contributions": "Listahan ng mga ambag ng {{GENDER:$1|tagagamit na ito}}",
        "tooltip-t-emailuser": "Magpadala ng e-liham sa {{GENDER:$1|tagagamit na ito}}",
-       "tooltip-t-upload": "Magkarga ng mga talaksan",
+       "tooltip-t-upload": "Mag-upload ng mga file",
        "tooltip-t-specialpages": "Tala ng lahat ng mga natatanging pahina",
        "tooltip-t-print": "Bersiyong maililimbag ng pahinang ito",
        "tooltip-t-permalink": "Palagiang link sa bersyong ito ng pahina",
        "file-nohires": "Walang makuhang mas mataas na resolusyon (kalinawan).",
        "svg-long-desc": "Talaksang SVG, nasa mga bilang na $1 × $2 mga piksel, sukat ng talaksan: $3",
        "svg-long-desc-animated": "Animadong talaksang SVG, nasa mga bilang na $1 × $2 mga piksel, sukat ng talaksan: $3",
-       "show-big-image": "Orihinal na talaksan",
+       "show-big-image": "Orihinal na file",
        "show-big-image-preview": "Sukat ng paunang-tingin na ito: $1.",
        "show-big-image-other": "Ibang {{PLURAL:$2|resolusyon|mga resolusyon}}: $1.",
        "show-big-image-size": "$1 x $2 mga piksel",
index 196f1f0..84e047d 100644 (file)
        "protectedtitles-submit": "Başlıkları görüntüle",
        "listusers": "Kullanıcı listesi",
        "listusers-editsonly": "Sadece değişiklik yapan kullanıcıları göster",
+       "listusers-temporarygroupsonly": "Yalnızca geçici kullanıcı gruplarında olan kullanıcıları göster",
        "listusers-creationsort": "Oluşturma tarihine göre sırala",
        "listusers-desc": "Azalan sırada sırala",
        "usereditcount": "$1 {{PLURAL:$1|değişiklik|değişiklik}}",
index c8e05b7..bd8a3fb 100644 (file)
        "right-editusercss": "редагування CSS-файлів інших користувачів",
        "right-edituserjson": "редагування JSON-файлів інших користувачів",
        "right-edituserjs": "редагування JS-файлів інших користувачів",
+       "right-editsitecss": "Редагувати загальний CSS",
+       "right-editsitejson": "Редагувати загальний JSON",
+       "right-editsitejs": "Редагувати загальний JavaScript",
        "right-editmyusercss": "редагування власних CSS-файлів користувача",
        "right-editmyuserjson": "редагування власних JSON-файлів користувача",
        "right-editmyuserjs": "редагування власних JavaScript-файлів користувача",
        "grant-createaccount": "Створювати облікові записи",
        "grant-createeditmovepage": "Створювати, редагувати та перейменовувати сторінки",
        "grant-delete": "Вилучати сторінки, версії і записи журналів",
-       "grant-editinterface": "Редагувати простір назв MediaWiki та CSS/JSON/JavaScript користувача",
+       "grant-editinterface": "Редагувати простір назв MediaWiki та загальний/користувацький JSON",
        "grant-editmycssjs": "Редагувати Ваш користувацький CSS/JSON/JavaScript",
        "grant-editmyoptions": "Редагувати Ваші налаштування користувача",
        "grant-editmywatchlist": "Редагувати Ваш список спостереження",
+       "grant-editsiteconfig": "Редагувати загальний та користувацький CSS/JS",
        "grant-editpage": "Редагувати наявні сторінки",
        "grant-editprotected": "Редагувати захищені сторінки",
        "grant-highvolume": "Редагування у великих обсягах",
        "http-timed-out": "Перевищення часу очікування HTTP-запиту.",
        "http-curl-error": "Помилка звертання до URL: $1",
        "http-bad-status": "Під час HTTP-запиту виникла проблема: $1 $2",
+       "http-internal-error": "Внутрішня помилка HTTP.",
        "upload-curl-error6": "Неможливо досягнути вказану адресу.",
        "upload-curl-error6-text": "Неможливо досягнути вказану адресу. Будь-ласка, перевірте, що вказана адреса вірна, а сайт доступний.",
        "upload-curl-error28": "Час виділений на завантаження вичерпано",
        "passwordpolicies-policy-passwordcannotmatchusername": "Пароль не може збігатися з назвою облікового запису",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Пароль не може збігатися з паролями із чорного списку",
        "passwordpolicies-policy-maximalpasswordlength": "Пароль повинен бути коротшим $1 {{PLURAL:$1|символа|символів}}",
-       "passwordpolicies-policy-passwordcannotbepopular": "Пароль не може бути {{PLURAL:$1|часто вживаним|будь-яким з $1 часто вживаних паролів}}"
+       "passwordpolicies-policy-passwordcannotbepopular": "Пароль не може бути {{PLURAL:$1|часто вживаним|будь-яким з $1 часто вживаних паролів}}",
+       "easydeflate-invaliddeflate": "Наданий вміст не стиснений належним чином"
 }
index 8bc3135..29e111e 100644 (file)
        "subject": "عنوان:",
        "minoredit": "معمولی ترمیم",
        "watchthis": "اس صفحہ کو زیر نظر کریں",
-       "savearticle": "محفوظ",
+       "savearticle": "صفحہ محفوظ کریں",
        "savechanges": "تبدیلیاں محفوظ کریں",
        "publishpage": "شائع کریں",
        "publishchanges": "تبدیلیاں شائع کریں",
-       "savearticle-start": "صفحہ محفوظ کریں",
+       "savearticle-start": "صفحہ محفوظ",
        "savechanges-start": "تبدیلیاں محفوظ کریں",
        "publishpage-start": "صفحہ شائع کریں",
        "publishchanges-start": "تبدیلیاں شائع کریں",
        "session_fail_preview_html": "معاف کیجیے گا!سیشن ڈاٹا کے نقصان کی وجہ سے ہم آپ کی تبدیلی نافذنہیں کرسکتے.\n<em>چونکہ{{SITENAME}}نے نامکملHTMLکوفعال کررکھاہے,اس لئےنمائش کوجاوااسکرپٹ کےحملوں سےحفاظت کےلئےپوشیدہ کردیاگیاہے.</em>\n<strong>اگرتبدیلی کی یہ جدوجہدقانونی ہےتوبرائےمہربانی دوبارہ کوشش کریں.<strong>\nاگراس کےبعدبھی کام نہ کرے تو[[Special:UserLogout|logging out]]لاگ آؤٹ ہوکردوبارہ لاگ ان کیجیے.اورجانچ کیجیے کہ آپ کابراؤزراس سائٹ کےکوکیزکی اجأزت دیتاہےیانہیں.",
        "token_suffix_mismatch": "<strong>آپ کی ترمیم رد کردی گئی ہے کیونکہ آپ کے اسامی نے ٹوکن ترمیم میں رموزو اوقاف علامتوں کی دھجیاں اڑا دی تھیں۔</strong>\n\nترمیم صفحے کے متن میں خرابی سے روکنے کے لیے رد کی گئی ہے۔\nیہ بعض دفعہ تب ہوتا ہے جب آپ buggy ویب پر مبنی نامعلوم پروکسی سروس کا استعمال کررہے ہوں۔",
        "edit_form_incomplete": "<strong>خانہ ترمیم سے کچھ حصے سرور تک نہیں پہنچ سکے ہیں؛ براہ کرم اپنی ترامیم کو دوبارہ جانچ لیں کہ آیا وہ برقرار ہیں یا نہیں اور دوبارہ کوشش کریں۔</strong>",
-       "editing": "آپ \"$1\" میں ترمیم کر رہے ہیں۔",
+       "editing": "آپ «$1» میں ترمیم کر رہے ہیں",
        "creating": "زیر تخلیق $1",
        "editingsection": "«$1» کے قطعہ کی ترمیم",
-       "editingcomment": "زیرترمیم $1 (نیا قطعہ)",
+       "editingcomment": "زیر ترمیم $1 (نیا قطعہ)",
        "editconflict": "تنازع ترمیم:$1",
        "explainconflict": "آپکی تدوین شروع ہونے کے بعد شاید کسی نے یہ صفحہ تبدیل کردیا ہے.\nبالائی خانۂ متن میں صفحہ کا موجودہ مواد ہے.\nآپ کی تبدیلیاں نچلے متن خانہ میں دکھائی گئی ہیں.\nآپ کو اپنی تبدیلیاں موجودہ متن میں ضم کرنا ہوں گی.\n\"محفوظ\" کا بٹن ٹک کرنے سے '''صرف''' بالائی متن محفوظ ہوگا.",
        "yourtext": "آپ کی تحریر",
index 9cc2440..cebaa6c 100644 (file)
        "tog-enotifwatchlistpages": "ⴰⵣⵏ ⵢⵉ ⵏⵏ ⴳ ⵉⵎⴰⵢⵍ ⴰⴽⵓⴷ ⵏⵏⴰ ⵜⵡⴰⵙⵙⵏⴼⵍ ⴽⵔⴰ ⵏ ⵜⴰⵙⵏⴰ ⵏⵖ ⴰⴼⴰⵢⵍⵓ ⵉⵍⵍⴰⵏ ⴳ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ ⵉⵏⵓ",
        "tog-enotifusertalkpages": "ⴰⵣⵏ ⵢⵢⵉ ⵏⵏ ⵉⵎⴰⵢⵍ ⴰⴽⵓⴷ ⵏⵏⴰ ⵜⵡⴰⵙⵙⵏⴼⵍ ⵜⴰⵙⵏⴰ ⵏ ⵓⵎⵙⴰⵡⴰⵍ ⵉⵏⵓ",
        "tog-enotifminoredits": "ⴰⵣⵏ ⵢⵢⵉ ⵏⵏ ⴰⵍⵜⵓ ⵉⵎⴰⵢⵍ ⵅⴼ ⵉⵙⵏⴼⵍⵏ ⵉⵎⵣⵢⴰⵏⵏ ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⴷ ⵉⴼⴰⵢⵍⵓⵜⵏ",
+       "tog-oldsig": "ⴰⵙⴳⵎⴹ ⵏⵏⴽ ⵏ ⴷⵖⵉⴽⴽ",
        "tog-watchlisthideown": "ⵙⵙⵏⵜⵍ ⵉⵙⵏⵉⴼⵉⵍⵏ ⵉⵏⵓ ⵙⴳ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ",
        "tog-watchlisthidebots": "ⵙⵙⵏⵜⵍ ⵉⵙⵏⵉⴼⵉⵍⵏ ⵏ ⵉⵔⵓⴱⵓⵜⵏ ⵙⴳ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ",
        "tog-watchlisthideminor": "ⵙⵙⵏⵜⵍ ⵉⵙⵏⵉⴼⵉⵍⵏ ⵉⵎⵥⵢⴰⵏⴻⵏ ⵙⴳ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ",
+       "tog-watchlisthidecategorization": "ⵙⵙⵏⵜⵍ ⴰⵙⵙⵓⵔⵜⵢ ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ",
        "tog-ccmeonemails": "ⴰⵣⵏ ⵉⵢⵉ ⴷ ⵜⵓⵏⵖⵉⵍⵉⵏ ⵏ ⵉⵎⴰⵢⵍⵏ ⵏⵏⴰ ⵓⵣⵏⵖ ⵉ ⵉⵎⵙⵙⵎⵔⵙⵏ ⵢⴰⴹⵏ",
        "tog-diffonly": "ⴰⴷ ⵓⵔ ⵜⵙⵙⴽⴷ ⵜⵓⵎⴰⵢⵜ ⵏ ⵜⴰⵙⵏⴰ ⴷⴷⵓ ⵉⵎⵣⴰⵔⴰⵢⵏ",
        "tog-showhiddencats": "ⵙⴽⵏ ⵜⴰⴳⴳⴰⵢⵉⵏ ⵉⵜⵜⵓⵃⴹⴰⵏ",
        "toc": "ⵜⵓⵎⴰⵢⵉⵏ",
        "showtoc": "ⵙⴽⵏ",
        "hidetoc": "ⵙⵙⵏⵜⵍ",
+       "confirmable-confirm": "ⵉⵙ ⵜⵏⵥⵉⴷ",
        "confirmable-yes": "ⵢⴰⵀ",
        "confirmable-no": "ⵓⵀⵓ",
+       "thisisdeleted": "ⴰⴷ ⵜⵙⴽⵏⴷ ⵏⵖ ⴷ ⴰⴷ ⴷ ⵜⵔⴰⵔⴷ $1?",
        "viewdeleted": "ⵥⵕ $1?",
        "site-atom-feed": "ⴰⵏⴳⵉ ⵏ ⴰⵜⵓⵎ ⵏ $1",
        "page-atom-feed": "ⴰⵏⴳⵉ ⵏ ⴰⵜⵓⵎ ⵏ $1",
        "error": "ⵜⴰⵣⴳⵍⵜ",
        "databaseerror-function": "ⵜⴰⵙⵖⵏⵜ: $1",
        "databaseerror-error": "ⵜⴰⵣⴳⵍⵜ: $1",
+       "missingarticle-diff": "(ⴰⵎⵣⴰⵔⴰⵢ : $1, $2)",
+       "internalerror": "ⴰⵣⴳⴰⵍ ⴰⴳⵏⵙⴰⵏ",
+       "internalerror_info": "ⴰⵣⴳⴰⵍ ⴰⴳⵏⵙⴰⵏ : $1",
+       "filedeleteerror": "ⵓⵔ ⵜⴰⵍⵍⴼⵓⵙ ⵜⵓⴽⴽⵙⴰ ⵏ ⵓⴼⴰⵢⵍⵓ « $1 ».",
+       "directorycreateerror": "ⵓⵔ ⵢⴰⵍⵍⴼⵓⵙ ⵓⵙⵏⵓⵍⴼⵓ ⵏ ⵓⴽⴰⵔⴰⵎ « $1 ».",
+       "directoryreadonlyerror": "ⴰⴽⴰⵔⴰⵎ « $1 » ⵉⴳⴰ ⵖⴰⵙ ⵉ ⵜⵖⵔⵉ.",
+       "directorynotreadableerror": "ⴰⴽⴰⵔⴰⵎ « $1 » ⵓⵔ ⴷⴰ ⵉⵜⵜⵓⵖⵔⴰ.",
+       "filenotfound": "ⵓⵔ ⵜⴰⵍⵍⴼⵓⵙ ⵜⵉⴼⵉ ⵏ ⵓⴼⴰⵢⵍⵓ « $1 ».",
+       "unexpected": "ⴰⵣⴰⵍ ⵓⵔ ⵉⵜⵜⵓⴳⴰⵏⵏⵢⵏ : « $1 » = « $2 ».",
+       "cannotdelete-title": "ⵓⵔ ⵜⴰⵍⵍⴼⵓⵙ ⵜⵓⴽⴽⵙⴰ ⵏ ⵜⴰⵙⵏⴰ \"$1\"",
        "badtitle": "ⴳⴰⵔ ⴰⵣⵡⵍ",
        "badtitletext": "ⴰⵣⵡⵍ ⵏ ⵜⴰⵙⵏⴰ ⵉⵜⵜⵡⴰⵜⵜⴰⵔⵏ ⵢⴰ ⵓⵔ ⵉⵏⵉⵎ ⵢⴰ ⵢⵓⵔⴰ ⵢⴰ ⵓⵔ ⵢⵉⵍⵉⵖ ⵎⵍⵉⵃ ⵎⴽ ⵉⴳⴰ ⵢⴰⵏ ⵓⵣⵡⵍ ⵉⵙⵎⴰⵏⴻⵏ ⵙⵏⴰⵜ ⵜⵓⵜⵍⴰⵢⵉⵏ ⵏⵖ ⵙⵉⵏ ⵢⵉⵙⵏⴼⴰⵔⵏ. ⵄⵏⵉⵖ ⴷⵉⴳⵙ ⵢⴰⵏ ⵏⵖ ⵎⵏⵏⴰⵡ ⵏ ⵢⵉⵙⴽⴽⵉⵍⵏ ⵙ ⵓⵔ ⵉⵙⵙⵉⵏ ⴰⴷ ⵜⵜⵓⵙⵎⵔⵙⵏ ⴳ ⵢⵉⵣⵡⵍⴰⵏ.",
        "viewsource": "ⵙⴽⵏ ⴰⵙⴰⴳⵎ",
        "viewsource-title": "ⵥⵕ ⴰⵖⴱⴰⵍⵓ ⵉ $1",
+       "actionthrottled": "ⵜⵓⵜⵜⵓⵙⵉⵡⵖ ⵜⵉⴳⴰⵡⵜ",
+       "actionthrottledtext": "ⴰⵎⵓⵔ ⵏⵏⴽ, ⴰⵔⵎ ⴷⵉⵖ ⴷⴼⴼⵉⵔ ⵢⴰⵏ ⵉⵎⵉⴽⴽ ⵏ ⵜⵓⵙⴷⵉⴷⵉⵏ.",
        "viewsourcetext": "ⵜⵣⵎⵔⴷ ⴰⴷ ⵜⵥⵔⴷ ⴷ ⴰⴷ ⵜⵙⵙⵏⵖⵍⴷ ⴰⵙⴰⴳⵎ ⵏ ⵜⴰⵙⵏⴰ ⴰⴷ",
        "exception-nologin": "ⵓⵔ ⵢⵓⴷⵉⴼ",
        "welcomeuser": "ⴰⵏⵙⵓⴼ, $1!",
        "createacct-yourpasswordagain": "ⵙⵙⵍⴽⵏ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ",
        "createacct-yourpasswordagain-ph": "ⵙⵙⴽⵛⵎ ⴷⴰⵖ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ",
        "userlogin-remembermypassword": "ⴰⴷⵊ ⵉⵢⵉ ⴽⵛⵎⵖ",
+       "cannotlogin-title": "ⵓⵔ ⵢⴰⵍⵍⴼⵓⵙ ⵓⴽⵛⵛⵓⵎ",
+       "cannotlogin-text": "ⴰⴽⵛⵛⵓⵎ ⵓⵔ ⵢⴰⵍⵍⴼⵓⵙ.",
+       "cannotloginnow-title": "ⵓⵔ ⵢⴰⵍⵍⴼⵓⵙ ⵓⴽⵛⵛⵓⵎ ⴷⵖⵉⴽⴽ",
+       "cannotcreateaccount-title": "ⵓⵔ ⵢⴰⵍⵍⴼⵓⵙ ⵓⵙⵏⵓⵍⴼⵓ ⵏ ⵉⵎⵉⴹⴰⵏⴻⵏ",
        "login": "ⴽⵛⵎ",
        "login-security": "ⵙⵙⵉⴷⴻⴷ ⵜⴰⵎⴰⴳⵉⵜ ⵏⵏⴽ",
        "logout": "ⴼⴼⵖ",
        "createaccount": "ⵔⵥⵎ ⴽⵔⴰ ⵏ ⵓⵎⵉⴹⴰⵏ",
        "userlogin-resetpassword-link": "ⵜⴻⵜⵜⵓⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⵏⵎ/ⴽ?",
        "userlogin-helplink2": "ⵜⵉⵡⵉⵙⵉ ⴳ ⵓⴽⵛⵛⵓⵎ",
+       "userlogin-createanother": "ⵙⴽⵔ ⴰⵎⵉⴹⴰⵏ ⵢⴰⴹⵏ",
        "createacct-emailrequired": "ⵉⵎⴰⵢⵍ",
        "createacct-emailoptional": "ⵉⵎⴰⵢⵍ (ⴰⵔⵓⵛⵛⵉⵍ)",
        "createacct-email-ph": "ⵙⵙⴽⵛⵎ ⴰⵏⵙⴰ ⵉⵎⴰⵢⵍ ⵏⵏⴽ",
        "createacct-another-email-ph": "ⵙⵙⴽⵛⵎ ⴰⵏⵙⴰ ⵉⵎⴰⵢⵍ ⵏⵏⴽ",
        "createacct-realname": "ⵉⵙⵎ ⵏ ⵜⵉⴷⵜ (‍ⵎ ⵜⵔⵉⵜ)",
        "createacct-reason": "ⵜⴰⵎⵏⵜⵉⵍⵜ",
+       "createacct-reason-ph": "ⵎⴰⵖ ⴰⵍⵍⵉⴳ ⴰⵔ ⵜⵙⴽⴰⵔⴷ ⴰⵎⵉⴹⴰⵏ ⵢⴰⴹⵏ",
+       "createacct-reason-help": "ⵜⵓⵣⵉⵏⵜ ⵉⵜⵜⵓⵙⴽⴰⵏⴻⵏ ⴳ ⵜⵎⵙⵙⴽⵜⵉⵜ ⵏ ⵓⵙⵏⵓⵍⴼⵓ ⵏ ⵓⵎⵉⴹⴰⵏ",
        "createacct-submit": "ⵔⵥⵎ ⴰⵎⵉⴹⴰⵏ {{GENDER:|ⵏⵏⴽ|ⵏⵏⵎ}}",
        "createacct-another-submit": "ⵙⵏⴼⵍⵓⵍ ⴰⵎⵉⴹⴰⵏ",
+       "createacct-continue-submit": "ⵣⴷⵉ ⴳ ⵓⵙⵏⵓⵍⴼⵓ ⵏ ⵓⵎⵉⴹⴰⵏ",
+       "createacct-another-continue-submit": "ⵣⴷⵉ ⴳ ⵓⵙⵏⵓⵍⴼⵓ ⵏ ⵓⵎⵉⴹⴰⵏ",
        "createacct-benefit-heading": "{{SITENAME}} ⵜⴻⵜⵜⵓⴽ ⵙⴳ ⵎⵉⴷⴷⵏ ⴰⵎ ⴽⵢⵢⵉⵏ",
        "createacct-benefit-body1": "{{PLURAL:$1|ⴰⵙⵏⴼⵍ|ⵉⵙⵏⴼⴰⵍ}}",
        "createacct-benefit-body2": "{{PLURAL:$1|ⵜⴰⵙⵏⴰ|ⵜⴰⵙⵏⵉⵡⵉⵏ}}",
        "createacct-benefit-body3": "{{PLURAL:$1|ⴰⵏⴰⵎⵓ|ⵉⵏⴰⵎⵓⵜⵏ}} {{PLURAL:$1|ⴰⵎⴳⴳⴰⵔⵓ|ⵉⵎⴳⴳⵓⵔⴰ}}",
+       "badretype": "ⵜⴰⴳⵓⵔⵉ  ⵏ ⵓⵣⵔⴰⵢ ⵏⵏⴰ ⵜⵙⴽⵛⵎⴷ ⵓⵔ ⵜⵎⵙⴰⵙⴰ",
+       "usernameinprogress": "ⵉⵏⵜⴰ ⵢⴰⴷ ⵢⴰⵏ ⵓⵙⵏⵓⵍⴼⵓ ⵏ ⵓⵎⵉⴹⴰⵏ ⵉ ⵢⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⴰⴷ. ⴰⵎⵓⵔ ⵏⵏⴽ ⵔⴰⵊⴰ.",
+       "userexists": "ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵉ ⵜⵙⴽⵛⵎⴷ ⵉⵜⵜⵓⵙⵎⵔⵙ ⵢⴰⴷ.\nⴰⵎⵓⵔ ⵏⵏⴽ ⵙⵜⵉ ⵉⵙⵎ ⵢⴰⴹⵏ.",
+       "loginerror": "ⴰⵣⴳⴰⵍ ⴳ ⵓⴽⵛⵛⵓⵎ",
+       "createacct-error": "ⴰⵣⴳⴰⵍ ⴳ ⵓⵙⵏⵓⵍⴼⵓ ⵏ ⵓⵎⵉⴹⴰⵏ",
+       "createaccounterror": "ⵓⵔ ⵢⴰⵍⵍⴼⵓⵙ ⵓⵙⴽⴽⵉⵔ ⵏ ⵓⵎⵉⴹⴰⵏ: $1",
+       "noname": "ⵓⵔ ⵜⵙⴽⵛⵉⵎⴷ ⵢⴰⵏ ⵢⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵉⴱⵓⵏⴰⵏ.",
+       "loginsuccesstitle": "ⵜⴽⵛⵎⴷ",
+       "loginsuccess": "<strong>ⵜⴽⵛⵎ ⴷⵖⵉⴽⴽ ⵙ {{SITENAME}} ⵙ ⵢⵉⵙⵎ ⵏ « $1 ».</strong>",
+       "login-userblocked": "ⵉⵜⵜⵓⴳⴷⴰⵍ ⵓⵏⵙⵙⵎⵔⵙ ⴰⴷ. ⵓⵔ ⵉⵜⵜⵡⴰⴼⵔⴰⴳ ⵓⴽⵛⵛⵓⵎ.",
+       "wrongpassword": "ⵓⵔ ⵉⴱⵓⵏⵉ ⵢⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵏⵖ ⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⵏⴰ ⵜⵙⴽⵛⵎⴷ.\nⴰⵎⵓⵔ ⵏⵏⴽ ⴰⵔⵎ ⴷⴰⵖ.",
+       "wrongpasswordempty": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⵏⴰ ⵜⵙⴽⵛⵎⴷ ⵜⵓⵔⴰ.\nⴰⵎⵓⵔ ⵏⵏⴽ ⴰⵔⵎ ⴷⴰⵖ.",
        "mailmypassword": "ⵔⴰⵔ ⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ",
        "loginlanguagelabel": "ⵜⵓⵜⵍⴰⵢⵜ: $1",
        "pt-login": "ⴽⵛⵎ",
        "exif-orientation": "ⴰⵙⵡⴰⵍⴰ",
        "exif-xresolution": "ⵜⵉⵙⴷⴷⵉ ⵜⴰⵛⴰⵛⴼⴰⵍⵜ",
        "exif-yresolution": "ⵜⵉⵙⴷⴷⵉ ⵜⴰⴱⴷⴷⴰⵢⵜ",
+       "exif-stripoffsets": "ⴰⵏⵙⴰ ⵏ ⵉⵙⴼⴽⴰ ⵏ ⵜⵓⴳⵏⴰ",
        "exif-datetime": "ⴰⵙⴰⴽⵓⴷ ⴷ ⵡⴰⴽⵓⴷ ⵏ ⵓⵙⵏⴼⵍ ⵏ ⵓⴼⴰⵢⵍⵓ",
+       "exif-imagedescription": "ⴰⵣⵡⵍ ⵏ ⵜⵓⴳⵏⴰ",
        "exif-make": "ⴰⵎⴽⵓⵏ ⵏ ⵜⵎⵙⵙⵓⵍⴰⴼⵜ",
        "exif-model": "ⴰⵏⴰⵡ ⵏ ⵜⵙⵡⵍⴰⴼⵜ",
        "exif-software": "ⴰⵙⵖⵥⴰⵏ ⵉⵜⵜⵓⵙⵎⵔⵙⵏ",
        "exif-exifversion": "ⵜⴰⵎⵓⵖⵍⵉ Exif",
        "exif-colorspace": "ⵜⵉⵔⵉⵡⵜ ⵏ ⵓⴽⵍⵓ",
+       "exif-pixelydimension": "ⵜⴰⵜⵜⴰⵢⵜ ⵏ ⵜⵓⴳⵏⴰ",
        "exif-datetimeoriginal": "ⴰⵙⴰⴽⵓⴷ ⴷ ⵜⵉⵣⵉ ⵏ ⵓⵙⴽⴽⵉⵔ ⵏ ⵉⵙⴼⴽⴰ",
        "exif-datetimedigitized": "ⴰⵙⴰⴽⵓⴷ ⴷ ⵜⵉⵣⵉ ⵏ ⵓⵙⵓⵟⵟⵏ",
+       "exif-imageuniqueid": "ⴰⵎⵙⵎⴰⴳⵉ ⴰⵙⵓⴼ ⵏ ⵜⵓⴳⵏⴰ",
+       "exif-gpsimgdirectionref": "ⴰⵙⴰⵖⵓⵍ ⵖⵔ ⵜⵏⵉⵍⴰ ⵏ ⵜⵓⴳⵏⴰ",
+       "exif-worldregioncreated": "ⴰⵏⵙⴰ ⴳ ⵎⵉ ⵜⴻⵜⵜⵡⴰⵙⴽⴰⵔ ⵜⵡⵍⴰⴼⵜ",
+       "exif-countrycreated": "ⵜⴰⵎⵓⵔⵜ ⴳ ⵎⵉ ⵜⴰⵜⵜⵡⴰⵙⴽⴰⵔ ⵜⵡⵍⴰⴼⵜ",
+       "exif-countrycodecreated": "ⵜⴰⵏⴳⴰⵍⵜ ⵏ ⵜⵎⵓⵔⵜ ⴳ ⵎⵉ ⵜⴻⵜⵜⵡⴰⵙⴽⴰⵔ ⵜⵡⵍⴰⴼⵜ",
+       "exif-provinceorstatecreated": "ⵜⴰⵙⴳⴰ ⵏⵖ ⴷ ⴰⵡⴰⵏⴽ ⴳ ⵎⵉ ⵜⴻⵜⵜⵡⴰⵙⴽⴰⵔ ⵜⵡⵍⴰⴼⵜ",
+       "exif-citycreated": "ⵜⴰⵎⴷⵉⵏⵜ ⴳ ⵎⵉ ⵜⴰⵜⵜⵡⴰⵙⴽⴰⵔ ⵜⵡⵍⴰⴼⵜ",
+       "exif-sublocationcreated": "ⴰⵏⵙⴰ ⴳ ⵜⵎⴷⵉⵏⵜ ⴳ ⵎⵉ ⵜⴻⵜⵜⵡⴰⵙⴽⴰⵔ ⵜⵡⵍⴰⴼⵜ",
        "exif-languagecode": "ⵜⵓⵜⵍⴰⵢⵜ",
+       "exif-nickname": "ⵉⵙⵎ ⴰⵔⵓⵏⵚⵉⴱ ⵏ ⵜⵓⴳⵏⴰ",
        "exif-orientation-1": "ⴰⵎⴳⵏⵓ",
        "exif-dc-contributor": "ⵉⵏⴰⵎⵓⵜⵏ",
        "exif-iimcategory-edu": "ⴰⵙⴳⵎⵉ",
        "imgmultigo": "ⴷⴷⵓ!",
        "imgmultigoto": "ⴷⴷⵓ ⵖⵔ ⵜⴰⵙⵏⴰ ⴰⴷ $1",
        "img-lang-default": "(ⵜⵓⵜⵍⴰⵢⵜ ⵙ ⵓⵡⵏⵓⵍ)",
+       "img-lang-info": "ⵔⴰⵔ ⵜⴰⵡⵍⴰⴼⵜ ⴰⴷ ⵙ $1. $2",
        "img-lang-go": "ⴷⴷⵓ",
        "table_pager_limit_submit": "ⴷⴷⵓ",
        "watchlistedit-clear-explain": "ⵎⴰⵕⵕⴰ",
        "pagelang-name": "ⵜⴰⵙⵏⴰ",
        "pagelang-language": "ⵜⵓⵜⵍⴰⵢⵜ",
        "right-pagelang": "ⵙⵏⴼⵍ ⵜⵓⵜⵍⴰⵢⵜ ⵏ ⵜⴰⵙⵏⴰ",
+       "mediastatistics-header-drawing": "ⴰⵙⵙⵓⵏⵖ (ⵜⵓⴳⵏⴰ ⵜⴰⵎⴰⵡⴰⵢⵜ)",
        "mediastatistics-header-total": "ⵎⴰⵕⵕⴰ ⵉⴼⵓⵍⵢⴰ",
        "randomrootpage": "ⵜⴰⵙⵏⴰ ⴰⵥⵓⵔ ⵜⴰⵡⴳⴰⵛⵓⵔⵜ",
        "log-action-filter-all": "ⵎⴰⵕⵕⴰ",
index 3f2dbc6..5e80398 100644 (file)
        "group-autoconfirmed-member": "{{GENDER:$1|自动确认用户}}",
        "group-bot-member": "{{GENDER:$1|机器人}}",
        "group-sysop-member": "{{GENDER:$1|管理员}}",
-       "group-interface-admin-member": "{{GENDER:$1|ç\95\8cé\9d¢ç¼\96è¾\91è\80\85}}",
+       "group-interface-admin-member": "{{GENDER:$1|ç\95\8cé\9d¢ç®¡ç\90\86å\91\98}}",
        "group-bureaucrat-member": "{{GENDER:$1|行政员}}",
        "group-suppress-member": "{{GENDER:$1|Flow监督员}}",
        "grouppage-user": "{{ns:project}}:用户",
        "grouppage-autoconfirmed": "{{ns:project}}:自动确认用户",
        "grouppage-bot": "{{ns:project}}:机器人",
        "grouppage-sysop": "{{ns:project}}:管理员",
-       "grouppage-interface-admin": "{{ns:project}}:ç\95\8cé\9d¢ç¼\96è¾\91è\80\85",
+       "grouppage-interface-admin": "{{ns:project}}:ç\95\8cé\9d¢ç®¡ç\90\86å\91\98",
        "grouppage-bureaucrat": "{{ns:project}}:行政员",
        "grouppage-suppress": "{{ns:project}}:监督",
        "right-read": "阅读页面",
        "grant-createaccount": "创建账户",
        "grant-createeditmovepage": "创建、编辑和移动页面",
        "grant-delete": "删除页面、修订和日志记录",
-       "grant-editinterface": "编辑MediaWiki名字空间和用户CSS/JSON/JavaScript",
+       "grant-editinterface": "编辑MediaWiki名字空间和全站/用户的JSON",
        "grant-editmycssjs": "编辑您的用户CSS/JSON/JavaScript",
        "grant-editmyoptions": "编辑您的用户参数设置",
        "grant-editmywatchlist": "编辑您的监视列表",
+       "grant-editsiteconfig": "编辑全站和用户的CSS/JS",
        "grant-editpage": "编辑存在的页面",
        "grant-editprotected": "编辑受保护页面",
        "grant-highvolume": "大容量编辑",
        "uploadstash-zero-length": "文件长度为零。",
        "invalid-chunk-offset": "无效区块偏移量",
        "img-auth-accessdenied": "拒绝访问",
-       "img-auth-nopathinfo": "PATH_INFO缺失。\n您的服务器尚未设置传送该信息。\n它可能基于CGI,因而不支持img_auth。\n请参见https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization。",
+       "img-auth-nopathinfo": "缺少路径信息。您的服务器必须适当配置以跳过REQUEST_URI和/或PATH_INFO变量。如果有,请尝试启用$wgUsePathInfo。请参见https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization。",
        "img-auth-notindir": "在已设置的上传目录中找不到请求的路径。",
        "img-auth-badtitle": "无法为“$1”创建合法的标题。",
        "img-auth-nologinnWL": "您尚未登录,且“$1”不在白名单上。",
        "edit-error-long": "错误:\n\n$1",
        "revid": "修订版本$1",
        "pageid": "页面ID$1",
+       "interfaceadmin-info": "$1\n\n编辑全站CSS/JS/JSON文件的权限刚刚从<code>editinterface</code>权限中拆分。如果您不知道为何收到此错误,请参见[[mw:MediaWiki_1.32/interface-admin]]。",
        "rawhtml-notallowed": "&lt;html&gt;标签不能在一般页面以外使用。",
        "gotointerwiki": "离开{{SITENAME}}",
        "gotointerwiki-invalid": "指定的标题无效。",
        "passwordpolicies-policy-passwordcannotmatchusername": "密码不能与用户名相同",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "密码不能匹配特定列入黑名单的密码",
        "passwordpolicies-policy-maximalpasswordlength": "密码长度必须少于$1个{{PLURAL:$1|字符}}",
-       "passwordpolicies-policy-passwordcannotbepopular": "密码不能{{PLURAL:$1|是最常见的密码|在$1个最常见密码的列表中}}"
+       "passwordpolicies-policy-passwordcannotbepopular": "密码不能{{PLURAL:$1|是最常见的密码|在$1个最常见密码的列表中}}",
+       "easydeflate-invaliddeflate": "提供的内容未被适当缩小"
 }
index beaab45..eba36f7 100644 (file)
        "right-editusercss": "編輯其他使用者的 CSS 檔",
        "right-edituserjson": "編輯其他使用者的 JSON 檔",
        "right-edituserjs": "編輯其他使用者的 JavaScript 檔",
-       "right-editsitecss": "編輯站台範圍 CSS",
-       "right-editsitejson": "編輯站台範圍 JSON",
-       "right-editsitejs": "編輯站台範圍 JavaScript",
+       "right-editsitecss": "編輯全站CSS",
+       "right-editsitejson": "編輯全站JSON",
+       "right-editsitejs": "編輯全站JavaScript",
        "right-editmyusercss": "編輯自己的使用者 CSS 檔",
        "right-editmyuserjson": "編輯您自己的使用者 JSON 檔",
        "right-editmyuserjs": "編輯自己的使用者 JavaScript 檔",
        "edit-error-long": "錯誤:\n\n$1",
        "revid": "修訂 $1",
        "pageid": "頁面 ID $1",
+       "interfaceadmin-info": "$1\n\n編輯全站 CSS/JS/JSON 檔案的權限,剛剛已從 <code>editinterface</code> 權限裡拆分。若您不清楚為何會收到此錯誤,請查看 [[mw:MediaWiki_1.32/interface-admin]]。",
        "rawhtml-notallowed": "&lt;html&gt; 標籤無法在一般頁面之外使用。",
        "gotointerwiki": "離開 {{SITENAME}}",
        "gotointerwiki-invalid": "指定的標題無效。",
index 19ece46..dc8ad55 100644 (file)
@@ -357,7 +357,7 @@ $magicWords = [
 ];
 
 # LinkTrail for Urdu language
-$linkTrail = "/^([ابپتٹثجچحخدڈذر​ڑ​زژسشصضطظعغفقکگل​م​نوؤہھیئےآأءۃ]+)(.*)$/sDu";
+$linkTrail = "/^([ابپتٹثجچحخدڈذر​ڑ​زژسشصضطظعغفقکگل​م​نںوؤہھیئےآأءۃ]+)(.*)$/sDu";
 
 $defaultDateFormat = 'dmy';
 
index 92cbdfc..c63eb96 100644 (file)
@@ -1426,6 +1426,7 @@ return [
        'mediawiki.action.delete.file' => [
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.delete.file.js',
                'dependencies' => [
+                       'oojs-ui-core',
                        'jquery.lengthLimit',
                ],
                'messages' => [
diff --git a/resources/lib/jquery.i18n/CODE_OF_CONDUCT.md b/resources/lib/jquery.i18n/CODE_OF_CONDUCT.md
new file mode 100644 (file)
index 0000000..d8e5d08
--- /dev/null
@@ -0,0 +1 @@
+The development of this software is covered by a [Code of Conduct](https://www.mediawiki.org/wiki/Code_of_Conduct).
index 3a4eb5e..0ab6e56 100644 (file)
@@ -1,9 +1,24 @@
 Credits
 =======
 
-Santhosh Thottingal
-Amir E. Aharoni
-Siebrand Mazeland
-Niklas Laxström
-Neil Kandalgaonkar
-David Chan
+Major contributors
+
+Santhosh Thottingal <santhosh.thottingal@gmail.com>
+Amir E. Aharoni <amir.aharoni@mail.huji.ac.il>
+Niklas Laxström <niklas.laxstrom@gmail.com>
+James D. Forrester <jforrester@wikimedia.org>
+Siebrand Mazeland <s.mazeland@xs4all.nl>
+Kartik Mistry <kartik.mistry@gmail.com>
+Ricordisamoa <ricordisamoa@openmailbox.org>
+Timo Tijhof <krinklemail@gmail.com>
+Neil Kandalgaonkar <neilk@brevity.org>
+David Chan <david@troi.org>
+
+Libraries used
+
+CLDRPluralRuleParser
+ - https://github.com/santhoshtr/CLDRPluralRuleParser
+ – MIT license
+ - Santhosh Thottingal and other contributors
+
+And thanks to all patch contributors
\ No newline at end of file
index da82c2b..126cc93 100644 (file)
@@ -3,7 +3,7 @@ jQuery.i18n
 
 jQuery.i18n is a jQuery based Javascript internationalization library. It helps you to internationalize your web applications easily.
 
-This is a project by Wikimedia foundation's [Language Engineering team](http://wikimediafoundation.org/wiki/Language_Engineering_team) and used in some of the Wikimedia Foundation projects like Universal Language Selector.
+This is a project by Wikimedia foundation's [Language Engineering team](https://www.mediawiki.org/wiki/Wikimedia_Language_engineering) and used in some of the Wikimedia Foundation projects like Universal Language Selector.
 
 The jquery.i18n library uses a json based localization file format, "banana", which is used as the localization file format for  MediaWiki and other projects.
 
@@ -20,7 +20,7 @@ Features
 * Dynamic change of interface language without refreshing a webpage.
 * Nestable grammar, plural, gender support. These constructs can be nested to any arbitrary level for supporting sophisticated message localization
 * Message documentation through special language code ```qqq```
-* Extensible message parser to add or customize magic words in the messages. Example: ```{sitename}``` or ```[[link]]``
+* Extensible message parser to add or customize magic words in the messages. Example: ```{sitename}``` or ```[[link]]```
 
 
 Quick start
@@ -231,7 +231,7 @@ It is also possible to refer messages from an external URL. See below example
 $.i18n().load( {
        en: {
                message_hello: 'Hello World',
-       message_welcome: 'Welcome'
+               message_welcome: 'Welcome'
        },
        hi: 'i18n/messages-hi.json', // Messages for Hindi
        de: 'i18n/messages-de.json'
@@ -244,7 +244,7 @@ Messages for a locale can be also loaded in parts. Example
 $.i18n().load( {
        en: {
                message_hello: 'Hello World',
-       message_welcome: 'Welcome'
+               message_welcome: 'Welcome'
        }
 } );
 
@@ -273,7 +273,7 @@ $.i18n( 'message-key-sample1' );
 $.i18n( 'message-key-sample1' );
 $.i18n( 'Found $1 {{plural:$1|result|results}}', 10 ); // Message key itself is message text
 $.i18n( 'Showing $1 out of $2 {{plural:$2|result|results}}', 5,100 );
-$.i18n(User X updated {{gender|his|her}} profile', 'male' );
+$.i18n( 'User X updated {{gender|his|her}} profile', 'male' );
 
 $( '#foo' ).i18n(); // to translate the element matching jquery selector based on data-i18n key
 ```
@@ -299,7 +299,7 @@ Note that if data-i18n contains html markup, that html will not be used as the e
 Examples
 ========
 
-See http://thottingal.in/projects/js/jquery.i18n/demo/
+See https://thottingal.in/projects/js/jquery.i18n/demo/
 
 Message format
 ==============
@@ -327,7 +327,20 @@ $.i18n(message, 4); // This gives "Found 4 results"
 ```
 Note that {{PLURAL:...}} is not case sensitive. It can be {{plural:...}} too.
 
-In case of English, there are only 2 plural forms, but many languages use more than 2 plural forms. All the plural forms can be given in the above syntax, separated by pipe(|)
+In case of English, there are only 2 plural forms, but many languages use more than 2 plural forms. All the plural forms can be given in the above syntax, separated by pipe(|). The number of plural forms for each language is defined in [CLDR](https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html). You need to provide all those plural forms for a language.
+
+For example, English has 2 plural forms and the message format will look like `{{PLURAL:$1|one|other}}`. for Arabic there are 6 plural forms and format will look like `{{PLURAL:$1|zero|one|two|few|many|other}}`.
+
+You cannot skip a plural form from the middle or beginning. However you can skip from end. For example, in arabic, if the message is like
+`{{PLURAL:$1|A|B}}`, for 0, A will be used, for numbers that fall under one,two,few,many,other categories B will be used.
+
+If there is an explicit plural form to be given for a specific number, it is possible with the following syntax
+
+```
+var message = 'Box has {{PLURAL:$1|one egg|$1 eggs|12=a dozen eggs}}.';
+$.i18n(message, 4 ); // Gives "Box has 4 eggs."
+$.i18n(message, 12 ); // Gives "Box has a dozen eggs."
+```
 
 ## Gender
 Similar to plural, depending on gender of placeholders, mostly user names, the syntax changes dynamically. An example in English is "Alice changed her profile picture" and "Bob changed his profile picture". To support this {{GENDER...}} syntax can be used as show in example
@@ -397,13 +410,13 @@ $.extend( $.i18n.parser.emitter, {
 
 This will parse the message
 ```javascript
-$.i18n( '{{link:{{SITENAME}}|http://en.wikipedia.org}}' );
+$.i18n( '{{link:{{SITENAME}}|https://en.wikipedia.org}}' );
 ```
 
 to
 
 ```html
-<a href="http://en.wikipedia.org">Wikipedia</a>
+<a href="https://en.wikipedia.org">Wikipedia</a>
 ```
 
 Message documentation
diff --git a/resources/lib/jquery.i18n/package.json b/resources/lib/jquery.i18n/package.json
deleted file mode 100644 (file)
index d1c7f84..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-{
-  "name": "jquery.i18n",
-  "version": "1.0.4",
-  "description": "jQuery based internationalization library",
-  "homepage": "https://github.com/wikimedia/jquery.i18n",
-  "keywords": [
-    "internationalization",
-    "localization",
-    "i18n",
-    "jquery",
-    "l10n"
-  ],
-  "author": {
-    "name": "Santhosh Thottingal",
-    "email": "santhosh.thottingal@gmail.com"
-  },
-  "contributors": [
-    "Amir Aharoni <amir.aharoni@mail.huji.ac.il>",
-    "Niklas Laxström <nlaxstrom@wikimedia.org>",
-    "Neil Kandalgaonkar <neilk@brevity.org>",
-    "David Chan <david@troi.org>"
-  ],
-  "devDependencies": {
-    "qunit": "0.7.6",
-    "grunt": "0.4.5",
-    "grunt-cli": "0.1.13",
-    "grunt-contrib-jshint": "0.11.3",
-    "grunt-contrib-connect": "0.10.1",
-    "grunt-contrib-qunit": "0.7.0",
-    "grunt-contrib-watch": "0.6.1",
-    "grunt-jscs": "1.8.0"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/wikimedia/jquery.i18n.git"
-  },
-  "bugs": {
-      "url" : "http://github.com/wikimedia/jquery.i18n/issues"
-  },
-  "engine": {
-    "node": ">=0.8.x"
-  },
-  "license": "(MIT OR GPL-2.0)",
-  "scripts": {
-    "test": "grunt test --verbose"
-  }
-}
index 3a5b625..e245557 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * BIDI embedding support for jQuery.i18n
  *
  * Copyright (C) 2015, David Chan
@@ -24,7 +24,7 @@
         * Does not match if there is no strong directionality codepoint.
         *
         * Generated by UnicodeJS (see tools/strongDir) from the UCD; see
-        * https://git.wikimedia.org/summary/unicodejs.git .
+        * https://phabricator.wikimedia.org/diffusion/GUJS/ .
         */
        strongDirRegExp = new RegExp(
                '(?:' +
         *
         * TODO: Does not handle BIDI control characters inside the text.
         * TODO: Does not handle unallocated characters.
+        *
+        * @param {string} text The text from which to extract initial directionality.
+        * @return {string} Directionality (either 'ltr' or 'rtl')
         */
        function strongDirFromContent( text ) {
                var m = text.match( strongDirRegExp );
                if ( !m ) {
                        return null;
                }
-               if ( m[2] === undefined ) {
+               if ( m[ 2 ] === undefined ) {
                        return 'ltr';
                }
                return 'rtl';
                 * strong directional codepoint" rule. Essentially, this works round the fact that
                 * there is no embedding equivalent of U+2068 FSI (isolation with heuristic
                 * direction inference). The latter is cleaner but still not widely supported.
+                *
+                * @param {string[]} nodes The text nodes from which to take the first item.
+                * @return {string} Wrapped String of content as needed.
                 */
                bidi: function ( nodes ) {
-                       var dir = strongDirFromContent( nodes[0] );
+                       var dir = strongDirFromContent( nodes[ 0 ] );
                        if ( dir === 'ltr' ) {
                                // Wrap in LEFT-TO-RIGHT EMBEDDING ... POP DIRECTIONAL FORMATTING
-                               return '\u202A' + nodes[0] + '\u202C';
+                               return '\u202A' + nodes[ 0 ] + '\u202C';
                        }
                        if ( dir === 'rtl' ) {
                                // Wrap in RIGHT-TO-LEFT EMBEDDING ... POP DIRECTIONAL FORMATTING
-                               return '\u202B' + nodes[0] + '\u202C';
+                               return '\u202B' + nodes[ 0 ] + '\u202C';
                        }
                        // No strong directionality: do not wrap
-                       return nodes[0];
+                       return nodes[ 0 ];
                }
        } );
 }( jQuery ) );
index b26f147..330e50c 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * jQuery Internationalization library
  *
  * Copyright (C) 2011-2013 Santhosh Thottingal, Neil Kandalgaonkar
@@ -17,7 +17,7 @@
        'use strict';
 
        var MessageParserEmitter = function () {
-               this.language = $.i18n.languages[String.locale] || $.i18n.languages['default'];
+               this.language = $.i18n.languages[ String.locale ] || $.i18n.languages[ 'default' ];
        };
 
        MessageParserEmitter.prototype = {
                                messageParserEmitter = this;
 
                        switch ( typeof node ) {
-                       case 'string':
-                       case 'number':
-                               ret = node;
-                               break;
-                       case 'object':
+                               case 'string':
+                               case 'number':
+                                       ret = node;
+                                       break;
+                               case 'object':
                                // node is an array of nodes
-                               subnodes = $.map( node.slice( 1 ), function ( n ) {
-                                       return messageParserEmitter.emit( n, replacements );
-                               } );
+                                       subnodes = $.map( node.slice( 1 ), function ( n ) {
+                                               return messageParserEmitter.emit( n, replacements );
+                                       } );
 
-                               operation = node[0].toLowerCase();
+                                       operation = node[ 0 ].toLowerCase();
 
-                               if ( typeof messageParserEmitter[operation] === 'function' ) {
-                                       ret = messageParserEmitter[operation]( subnodes, replacements );
-                               } else {
-                                       throw new Error( 'unknown operation "' + operation + '"' );
-                               }
+                                       if ( typeof messageParserEmitter[ operation ] === 'function' ) {
+                                               ret = messageParserEmitter[ operation ]( subnodes, replacements );
+                                       } else {
+                                               throw new Error( 'unknown operation "' + operation + '"' );
+                                       }
 
-                               break;
-                       case 'undefined':
+                                       break;
+                               case 'undefined':
                                // Parsing the empty string (as an entire expression, or as a
                                // paramExpression in a template) results in undefined
                                // Perhaps a more clever parser can detect this, and return the
                                // empty string? Or is that useful information?
                                // The logical thing is probably to return the empty string here
                                // when we encounter undefined.
-                               ret = '';
-                               break;
-                       default:
-                               throw new Error( 'unexpected type in AST: ' + typeof node );
+                                       ret = '';
+                                       break;
+                               default:
+                                       throw new Error( 'unexpected type in AST: ' + typeof node );
                        }
 
                        return ret;
@@ -80,7 +80,7 @@
                 * in our children and pass them upwards
                 *
                 * @param {Array} nodes Mixed, some single nodes, some arrays of nodes.
-                * @return String
+                * @return {string}
                 */
                concat: function ( nodes ) {
                        var result = '';
                 * @return {string} replacement
                 */
                replace: function ( nodes, replacements ) {
-                       var index = parseInt( nodes[0], 10 );
+                       var index = parseInt( nodes[ 0 ], 10 );
 
                        if ( index < replacements.length ) {
                                // replacement is not a string, don't touch!
-                               return replacements[index];
+                               return replacements[ index ];
                        } else {
                                // index not found, fallback to displaying variable
                                return '$' + ( index + 1 );
                 * convertNumber.
                 *
                 * @param {Array} nodes List [ {String|Number}, {String}, {String} ... ]
-                * @return {String} selected pluralized form according to current
+                * @return {string} selected pluralized form according to current
                 *  language.
                 */
                plural: function ( nodes ) {
-                       var count = parseFloat( this.language.convertNumber( nodes[0], 10 ) ),
+                       var count = parseFloat( this.language.convertNumber( nodes[ 0 ], 10 ) ),
                                forms = nodes.slice( 1 );
 
                        return forms.length ? this.language.convertPlural( count, forms ) : '';
                 * {{gender:gender|masculine|feminine|neutral}}.
                 *
                 * @param {Array} nodes List [ {String}, {String}, {String} , {String} ]
-                * @return {String} selected gender form according to current language
+                * @return {string} selected gender form according to current language
                 */
                gender: function ( nodes ) {
-                       var gender = nodes[0],
+                       var gender = nodes[ 0 ],
                                forms = nodes.slice( 1 );
 
                        return this.language.gender( gender, forms );
                 * putting {{grammar:form|word}} in a message
                 *
                 * @param {Array} nodes List [{Grammar case eg: genitive}, {String word}]
-                * @return {String} selected grammatical form according to current
+                * @return {string} selected grammatical form according to current
                 *  language.
                 */
                grammar: function ( nodes ) {
-                       var form = nodes[0],
-                               word = nodes[1];
+                       var form = nodes[ 0 ],
+                               word = nodes[ 1 ];
 
                        return word && form && this.language.convertGrammar( word, form );
                }
index 4584c5f..74b16f2 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * jQuery Internationalization library
  *
  * Copyright (C) 2012 Santhosh Thottingal
@@ -11,7 +11,7 @@
  * @licence GNU General Public Licence 2.0 or later
  * @licence MIT License
  */
-( function ( $, undefined ) {
+( function ( $ ) {
        'use strict';
 
        $.i18n = $.i18n || {};
index 9236e4e..ef2fcc2 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * jQuery Internationalization library
  *
  * Copyright (C) 2012 Santhosh Thottingal
@@ -16,7 +16,7 @@
 ( function ( $ ) {
        'use strict';
 
-       var nav, I18N,
+       var I18N,
                slice = Array.prototype.slice;
        /**
         * @constructor
                this.locale = this.options.locale;
                this.messageStore = this.options.messageStore;
                this.languages = {};
-
-               this.init();
        };
 
        I18N.prototype = {
                /**
-                * Initialize by loading locales and setting up
-                * String.prototype.toLocaleString and String.locale.
+                * Localize a given messageKey to a locale.
+                * @param {String} messageKey
+                * @return {String} Localized message
                 */
-               init: function () {
-                       var i18n = this;
-
-                       // Set locale of String environment
-                       String.locale = i18n.locale;
-
-                       // Override String.localeString method
-                       String.prototype.toLocaleString = function () {
-                               var localeParts, localePartIndex, value, locale, fallbackIndex,
-                                       tryingLocale, message;
-
-                               value = this.valueOf();
-                               locale = i18n.locale;
-                               fallbackIndex = 0;
+               localize: function ( messageKey ) {
+                       var localeParts, localePartIndex, locale, fallbackIndex,
+                               tryingLocale, message;
 
-                               while ( locale ) {
-                                       // Iterate through locales starting at most-specific until
-                                       // localization is found. As in fi-Latn-FI, fi-Latn and fi.
-                                       localeParts = locale.split( '-' );
-                                       localePartIndex = localeParts.length;
+                       locale = this.locale;
+                       fallbackIndex = 0;
 
-                                       do {
-                                               tryingLocale = localeParts.slice( 0, localePartIndex ).join( '-' );
-                                               message = i18n.messageStore.get( tryingLocale, value );
+                       while ( locale ) {
+                               // Iterate through locales starting at most-specific until
+                               // localization is found. As in fi-Latn-FI, fi-Latn and fi.
+                               localeParts = locale.split( '-' );
+                               localePartIndex = localeParts.length;
 
-                                               if ( message ) {
-                                                       return message;
-                                               }
+                               do {
+                                       tryingLocale = localeParts.slice( 0, localePartIndex ).join( '-' );
+                                       message = this.messageStore.get( tryingLocale, messageKey );
 
-                                               localePartIndex--;
-                                       } while ( localePartIndex );
-
-                                       if ( locale === 'en' ) {
-                                               break;
+                                       if ( message ) {
+                                               return message;
                                        }
 
-                                       locale = ( $.i18n.fallbacks[i18n.locale] && $.i18n.fallbacks[i18n.locale][fallbackIndex] ) ||
-                                               i18n.options.fallbackLocale;
-                                       $.i18n.log( 'Trying fallback locale for ' + i18n.locale + ': ' + locale );
+                                       localePartIndex--;
+                               } while ( localePartIndex );
 
-                                       fallbackIndex++;
+                               if ( locale === 'en' ) {
+                                       break;
                                }
 
-                               // key not found
-                               return '';
-                       };
+                               locale = ( $.i18n.fallbacks[ this.locale ] &&
+                                               $.i18n.fallbacks[ this.locale ][ fallbackIndex ] ) ||
+                                               this.options.fallbackLocale;
+                               $.i18n.log( 'Trying fallback locale for ' + this.locale + ': ' + locale + ' (' + messageKey + ')' );
+
+                               fallbackIndex++;
+                       }
+
+                       // key not found
+                       return '';
                },
 
                /*
                 * If the data argument is null/undefined/false,
                 * all cached messages for the i18n instance will get reset.
                 *
-                * @param {String|Object} source
-                * @param {String} locale Language tag
-                * @returns {jQuery.Promise}
+                * @param {string|Object} source
+                * @param {string} locale Language tag
+                * @return {jQuery.Promise}
                 */
                load: function ( source, locale ) {
                        var fallbackLocales, locIndex, fallbackLocale, sourceMap = {};
                                source = 'i18n/' + $.i18n().locale + '.json';
                                locale = $.i18n().locale;
                        }
-                       if ( typeof source === 'string' &&
-                               source.split( '.' ).pop() !== 'json'
+                       if ( typeof source === 'string' &&
+                               // source extension should be json, but can have query params after that.
+                               source.split( '?' )[ 0 ].split( '.' ).pop() !== 'json'
                        ) {
-                               // Load specified locale then check for fallbacks when directory is specified in load()
-                               sourceMap[locale] = source + '/' + locale + '.json';
-                               fallbackLocales = ( $.i18n.fallbacks[locale] || [] )
+                               // Load specified locale then check for fallbacks when directory is
+                               // specified in load()
+                               sourceMap[ locale ] = source + '/' + locale + '.json';
+                               fallbackLocales = ( $.i18n.fallbacks[ locale ] || [] )
                                        .concat( this.options.fallbackLocale );
-                               for ( locIndex in fallbackLocales ) {
-                                       fallbackLocale = fallbackLocales[locIndex];
-                                       sourceMap[fallbackLocale] = source + '/' + fallbackLocale + '.json';
+                               for ( locIndex = 0; locIndex < fallbackLocales.length; locIndex++ ) {
+                                       fallbackLocale = fallbackLocales[ locIndex ];
+                                       sourceMap[ fallbackLocale ] = source + '/' + fallbackLocale + '.json';
                                }
                                return this.load( sourceMap );
                        } else {
                 * @return {string}
                 */
                parse: function ( key, parameters ) {
-                       var message = key.toLocaleString();
+                       var message = this.localize( key );
                        // FIXME: This changes the state of the I18N object,
                        // should probably not change the 'this.parser' but just
                        // pass it to the parser.
-                       this.parser.language = $.i18n.languages[$.i18n().locale] || $.i18n.languages['default'];
+                       this.parser.language = $.i18n.languages[ $.i18n().locale ] || $.i18n.languages[ 'default' ];
                        if ( message === '' ) {
                                message = key;
                        }
                // NOTE: It should only change language for this one call.
                // Then cache instances of I18N somewhere.
                if ( options && options.locale && i18n && i18n.locale !== options.locale ) {
-                       String.locale = i18n.locale = options.locale;
+                       i18n.locale = options.locale;
                }
 
                if ( !i18n ) {
                        i18n = new I18N();
                        $.data( document, 'i18n', i18n );
                }
-               String.locale = i18n.locale;
+
                return this.each( function () {
                        var $this = $( this ),
-                               messageKey = $this.data( 'i18n' );
+                               messageKey = $this.data( 'i18n' ),
+                               lBracket, rBracket, type, key;
 
                        if ( messageKey ) {
-                               $this.text( i18n.parse( messageKey ) );
+                               lBracket = messageKey.indexOf( '[' );
+                               rBracket = messageKey.indexOf( ']' );
+                               if ( lBracket !== -1 && rBracket !== -1 && lBracket < rBracket ) {
+                                       type = messageKey.slice( lBracket + 1, rBracket );
+                                       key = messageKey.slice( rBracket + 1 );
+                                       if ( type === 'html' ) {
+                                               $this.html( i18n.parse( key ) );
+                                       } else {
+                                               $this.attr( type, i18n.parse( key ) );
+                                       }
+                               } else {
+                                       $this.text( i18n.parse( messageKey ) );
+                               }
                        } else {
                                $this.find( '[data-i18n]' ).i18n();
                        }
                } );
        };
 
-       String.locale = String.locale || $( 'html' ).attr( 'lang' );
+       function getDefaultLocale() {
+               var nav, locale = $( 'html' ).attr( 'lang' );
 
-       if ( !String.locale ) {
-               if ( typeof window.navigator !== undefined ) {
-                       nav = window.navigator;
-                       String.locale = nav.language || nav.userLanguage || '';
-               } else {
-                       String.locale = '';
+               if ( !locale ) {
+                       if ( typeof window.navigator !== undefined ) {
+                               nav = window.navigator;
+                               locale = nav.language || nav.userLanguage || '';
+                       } else {
+                               locale = '';
+                       }
                }
+               return locale;
        }
 
        $.i18n.languages = {};
                parse: function ( message, parameters ) {
                        return message.replace( /\$(\d+)/g, function ( str, match ) {
                                var index = parseInt( match, 10 ) - 1;
-                               return parameters[index] !== undefined ? parameters[index] : '$' + match;
+                               return parameters[ index ] !== undefined ? parameters[ index ] : '$' + match;
                        } );
                },
                emitter: {}
        };
        /* Static members */
        I18N.defaults = {
-               locale: String.locale,
+               locale: getDefaultLocale(),
                fallbackLocale: 'en',
                parser: $.i18n.parser,
                messageStore: $.i18n.messageStore
index e596fbc..4e34576 100644 (file)
@@ -1,7 +1,8 @@
-/*global pluralRuleParser */
+/* global pluralRuleParser */
 ( function ( $ ) {
        'use strict';
 
+       // jscs:disable
        var language = {
                // CLDR plural rules generated using
                // libs/CLDRPluralRuleParser/tools/PluralXML2JSON.html
                                few: 'n % 100 = 3..10',
                                many: 'n % 100 = 11..99'
                        },
+                       ars: {
+                               zero: 'n = 0',
+                               one: 'n = 1',
+                               two: 'n = 2',
+                               few: 'n % 100 = 3..10',
+                               many: 'n % 100 = 11..99'
+                       },
+                       as: {
+                               one: 'i = 0 or n = 1'
+                       },
                        be: {
                                one: 'n % 10 = 1 and n % 100 != 11',
                                few: 'n % 10 = 2..4 and n % 100 != 12..14',
                        da: {
                                one: 'n = 1 or t != 0 and i = 0,1'
                        },
+                       dsb: {
+                               one: 'v = 0 and i % 100 = 1 or f % 100 = 1',
+                               two: 'v = 0 and i % 100 = 2 or f % 100 = 2',
+                               few: 'v = 0 and i % 100 = 3..4 or f % 100 = 3..4'
+                       },
                        fa: {
                                one: 'i = 0 or n = 1'
                        },
@@ -62,7 +78,7 @@
                                one: 'i = 0,1'
                        },
                        fil: {
-                               one: 'i = 0..1 and v = 0'
+                               one: 'v = 0 and i = 1,2,3 or v = 0 and i % 10 != 4,6,9 or v != 0 and f % 10 != 4,6,9'
                        },
                        fr: {
                                one: 'i = 0,1'
                                one: 'n = 0..1'
                        },
                        gv: {
-                               one: 'n % 10 = 1',
-                               two: 'n % 10 = 2',
-                               few: 'n % 100 = 0,20,40,60'
+                               one: 'v = 0 and i % 10 = 1',
+                               two: 'v = 0 and i % 10 = 2',
+                               few: 'v = 0 and i % 100 = 0,20,40,60,80',
+                               many: 'v != 0'
                        },
                        he: {
                                one: 'i = 1 and v = 0',
                                one: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',
                                few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'
                        },
+                       hsb: {
+                               one: 'v = 0 and i % 100 = 1 or f % 100 = 1',
+                               two: 'v = 0 and i % 100 = 2 or f % 100 = 2',
+                               few: 'v = 0 and i % 100 = 3..4 or f % 100 = 3..4'
+                       },
                        hy: {
                                one: 'i = 0,1'
                        },
                                few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14',
                                many: 'v = 0 and i != 1 and i % 10 = 0..1 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 12..14'
                        },
-                       pt: {
-                               one: 'i = 1 and v = 0 or i = 0 and t = 1'
+                       prg: {
+                               zero: 'n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19',
+                               one: 'n % 10 = 1 and n % 100 != 11 or v = 2 and f % 10 = 1 and f % 100 != 11 or v != 2 and f % 10 = 1'
                        },
-                       // jscs:disable requireCamelCaseOrUpperCaseIdentifiers
-                       pt_PT: {
-                               one: 'n = 1 and v = 0'
+                       pt: {
+                               one: 'i = 0..1'
                        },
-                       // jscs:enable requireCamelCaseOrUpperCaseIdentifiers
                        ro: {
                                one: 'i = 1 and v = 0',
                                few: 'v != 0 or n = 0 or n != 1 and n % 100 = 1..19'
                        },
                        ru: {
                                one: 'v = 0 and i % 10 = 1 and i % 100 != 11',
+                               few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14',
                                many: 'v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14'
                        },
                        se: {
                                one: 'n = 0..1'
                        },
                        tl: {
-                               one: 'i = 0..1 and v = 0'
+                               one: 'v = 0 and i = 1,2,3 or v = 0 and i % 10 != 4,6,9 or v != 0 and f % 10 != 4,6,9'
                        },
                        tzm: {
                                one: 'n = 0..1 or n = 11..99'
                                one: 'i = 0 or n = 1'
                        }
                },
+               // jscs:enable
 
                /**
                 * Plural form transformations, needed for some languages.
                 *
-                * @param count
-                *            integer Non-localized quantifier
-                * @param forms
-                *            array List of plural forms
-                * @return string Correct form for quantifier in this language
+                * @param {integer} count
+                *            Non-localized quantifier
+                * @param {Array} forms
+                *            List of plural forms
+                * @return {string} Correct form for quantifier in this language
                 */
                convertPlural: function ( count, forms ) {
                        var pluralRules,
 
                        // Handle for Explicit 0= & 1= values
                        for ( index = 0; index < forms.length; index++ ) {
-                               form = forms[index];
+                               form = forms[ index ];
                                if ( explicitPluralPattern.test( form ) ) {
-                                       formCount = parseInt( form.substring( 0, form.indexOf( '=' ) ), 10 );
+                                       formCount = parseInt( form.slice( 0, form.indexOf( '=' ) ), 10 );
                                        if ( formCount === count ) {
-                                               return ( form.substr( form.indexOf( '=' ) + 1 ) );
+                                               return ( form.slice( form.indexOf( '=' ) + 1 ) );
                                        }
-                                       forms[index] = undefined;
+                                       forms[ index ] = undefined;
                                }
                        }
 
                                }
                        } );
 
-                       pluralRules = this.pluralRules[$.i18n().locale];
+                       pluralRules = this.pluralRules[ $.i18n().locale ];
 
                        if ( !pluralRules ) {
                                // default fallback.
-                               return ( count === 1 ) ? forms[0] : forms[1];
+                               return ( count === 1 ) ? forms[ 0 ] : forms[ 1 ];
                        }
 
                        pluralFormIndex = this.getPluralForm( count, pluralRules );
                        pluralFormIndex = Math.min( pluralFormIndex, forms.length - 1 );
 
-                       return forms[pluralFormIndex];
+                       return forms[ pluralFormIndex ];
                },
 
                /**
                 * For the number, get the plural for index
                 *
-                * @param number
-                * @param pluralRules
-                * @return plural form index
+                * @param {integer} number
+                * @param {Object} pluralRules
+                * @return {integer} plural form index
                 */
                getPluralForm: function ( number, pluralRules ) {
                        var i,
                                pluralFormIndex = 0;
 
                        for ( i = 0; i < pluralForms.length; i++ ) {
-                               if ( pluralRules[pluralForms[i]] ) {
-                                       if ( pluralRuleParser( pluralRules[pluralForms[i]], number ) ) {
+                               if ( pluralRules[ pluralForms[ i ] ] ) {
+                                       if ( pluralRuleParser( pluralRules[ pluralForms[ i ] ], number ) ) {
                                                return pluralFormIndex;
                                        }
 
                 *
                 * @param {number} num Value to be converted
                 * @param {boolean} integer Convert the return value to an integer
+                * @return {string} The number converted into a String.
                 */
                convertNumber: function ( num, integer ) {
                        var tmp, item, i,
                                tmp = [];
 
                                for ( item in transformTable ) {
-                                       tmp[transformTable[item]] = item;
+                                       tmp[ transformTable[ item ] ] = item;
                                }
 
                                transformTable = tmp;
                        }
 
                        for ( i = 0; i < numberString.length; i++ ) {
-                               if ( transformTable[numberString[i]] ) {
-                                       convertedNumber += transformTable[numberString[i]];
+                               if ( transformTable[ numberString[ i ] ] ) {
+                                       convertedNumber += transformTable[ numberString[ i ] ];
                                } else {
-                                       convertedNumber += numberString[i];
+                                       convertedNumber += numberString[ i ];
                                }
                        }
 
                 * Override this method for languages that need special grammar rules
                 * applied dynamically.
                 *
-                * @param word {String}
-                * @param form {String}
-                * @return {String}
+                * @param {string} word
+                * @param {string} form
+                * @return {string}
                 */
-               convertGrammar: function ( word, form ) { /*jshint unused: false */
+               // eslint-disable-next-line no-unused-vars
+               convertGrammar: function ( word, form ) {
                        return word;
                },
 
                 *
                 * These details may be overriden per language.
                 *
-                * @param gender
-                *      string male, female, or anything else for neutral.
-                * @param forms
-                *      array List of gender forms
+                * @param {string} gender
+                *      male, female, or anything else for neutral.
+                * @param {Array} forms
+                *      List of gender forms
                 *
-                * @return string
+                * @return {string}
                 */
                gender: function ( gender, forms ) {
                        if ( !forms || forms.length === 0 ) {
                        }
 
                        while ( forms.length < 2 ) {
-                               forms.push( forms[forms.length - 1] );
+                               forms.push( forms[ forms.length - 1 ] );
                        }
 
                        if ( gender === 'male' ) {
-                               return forms[0];
+                               return forms[ 0 ];
                        }
 
                        if ( gender === 'female' ) {
-                               return forms[1];
+                               return forms[ 1 ];
                        }
 
-                       return ( forms.length === 3 ) ? forms[2] : forms[0];
+                       return ( forms.length === 3 ) ? forms[ 2 ] : forms[ 0 ];
                },
 
                /**
                 * Get the digit transform table for the given language
                 * See http://cldr.unicode.org/translation/numbering-systems
-                * @param language
-                * @returns {Array|boolean} List of digits in the passed language or false
+                *
+                * @param {string} language
+                * @return {Array|boolean} List of digits in the passed language or false
                 * representation, or boolean false if there is no information.
                 */
                digitTransformTable: function ( language ) {
                                bo: '༠༡༢༣༤༥༦༧༨༩' // FIXME use iso 639 codes
                        };
 
-                       if ( !tables[language] ) {
+                       if ( !tables[ language ] ) {
                                return false;
                        }
 
-                       return tables[language].split( '' );
+                       return tables[ language ].split( '' );
                }
        };
 
index 759295c..350be10 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * jQuery Internationalization library - Message Store
  *
  * Copyright (C) 2012 Santhosh Thottingal
@@ -12,7 +12,7 @@
  * @licence MIT License
  */
 
-( function ( $, window, undefined ) {
+( function ( $ ) {
        'use strict';
 
        var MessageStore = function () {
                this.sources = {};
        };
 
+       function jsonMessageLoader( url ) {
+               var deferred = $.Deferred();
+
+               $.getJSON( url )
+                       .done( deferred.resolve )
+                       .fail( function ( jqxhr, settings, exception ) {
+                               $.i18n.log( 'Error in loading messages from ' + url + ' Exception: ' + exception );
+                               // Ignore 404 exception, because we are handling fallabacks explicitly
+                               deferred.resolve();
+                       } );
+
+               return deferred.promise();
+       }
+
        /**
         * See https://github.com/wikimedia/jquery.i18n/wiki/Specification#wiki-Message_File_Loading
         */
@@ -41,8 +55,8 @@
                 * null/undefined/false,
                 * all cached messages for the i18n instance will get reset.
                 *
-                * @param {String|Object} source
-                * @param {String} locale Language tag
+                * @param {string|Object} source
+                * @param {string} locale Language tag
                 * @return {jQuery.Promise}
                 */
                load: function ( source, locale ) {
@@ -74,7 +88,7 @@
                                                locale = key;
                                                // No {locale} given, assume data is a group of languages,
                                                // call this function again for each language.
-                                               deferreds.push( messageStore.load( source[key], locale ) );
+                                               deferreds.push( messageStore.load( source[ key ], locale ) );
                                        }
                                }
                                return $.when.apply( $, deferreds );
                /**
                 * Set messages to the given locale.
                 * If locale exists, add messages to the locale.
-                * @param locale
-                * @param messages
+                *
+                * @param {string} locale
+                * @param {Object} messages
                 */
                set: function ( locale, messages ) {
-                       if ( !this.messages[locale] ) {
-                               this.messages[locale] = messages;
+                       if ( !this.messages[ locale ] ) {
+                               this.messages[ locale ] = messages;
                        } else {
-                               this.messages[locale] = $.extend( this.messages[locale], messages );
+                               this.messages[ locale ] = $.extend( this.messages[ locale ], messages );
                        }
                },
 
                /**
                 *
-                * @param locale
-                * @param messageKey
-                * @returns {Boolean}
+                * @param {string} locale
+                * @param {string} messageKey
+                * @return {boolean}
                 */
                get: function ( locale, messageKey ) {
-                       return this.messages[locale] && this.messages[locale][messageKey];
+                       return this.messages[ locale ] && this.messages[ locale ][ messageKey ];
                }
        };
 
-       function jsonMessageLoader( url ) {
-               var deferred = $.Deferred();
-
-               $.getJSON( url )
-                       .done( deferred.resolve )
-                       .fail( function ( jqxhr, settings, exception ) {
-                               $.i18n.log( 'Error in loading messages from ' + url + ' Exception: ' + exception );
-                               // Ignore 404 exception, because we are handling fallabacks explicitly
-                               deferred.resolve();
-                       } );
-
-               return deferred.promise();
-       }
-
        $.extend( $.i18n.messageStore, new MessageStore() );
-}( jQuery, window ) );
+}( jQuery ) );
index 3dea284..8c47e55 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * jQuery Internationalization library
  *
  * Copyright (C) 2011-2013 Santhosh Thottingal, Neil Kandalgaonkar
@@ -18,7 +18,7 @@
 
        var MessageParser = function ( options ) {
                this.options = $.extend( {}, $.i18n.parser.defaults, options );
-               this.language = $.i18n.languages[String.locale] || $.i18n.languages['default'];
+               this.language = $.i18n.languages[ String.locale ] || $.i18n.languages[ 'default' ];
                this.emitter = $.i18n.parser.emitter;
        };
 
@@ -30,7 +30,7 @@
                        return message.replace( /\$(\d+)/g, function ( str, match ) {
                                var index = parseInt( match, 10 ) - 1;
 
-                               return parameters[index] !== undefined ? parameters[index] : '$' + match;
+                               return parameters[ index ] !== undefined ? parameters[ index ] : '$' + match;
                        } );
                },
 
@@ -39,8 +39,8 @@
                                return this.simpleParse( message, replacements );
                        }
 
-                       this.emitter.language = $.i18n.languages[$.i18n().locale] ||
-                               $.i18n.languages['default'];
+                       this.emitter.language = $.i18n.languages[ $.i18n().locale ] ||
+                               $.i18n.languages[ 'default' ];
 
                        return this.emitter.emit( this.ast( message ), replacements );
                },
@@ -58,7 +58,7 @@
                                        var i, result;
 
                                        for ( i = 0; i < parserSyntax.length; i++ ) {
-                                               result = parserSyntax[i]();
+                                               result = parserSyntax[ i ]();
 
                                                if ( result !== null ) {
                                                        return result;
@@ -78,7 +78,7 @@
                                        result = [];
 
                                for ( i = 0; i < parserSyntax.length; i++ ) {
-                                       res = parserSyntax[i]();
+                                       res = parserSyntax[ i ]();
 
                                        if ( res === null ) {
                                                pos = originalPos;
                                return function () {
                                        var result = null;
 
-                                       if ( message.substr( pos, len ) === s ) {
+                                       if ( message.slice( pos, pos + len ) === s ) {
                                                result = s;
                                                pos += len;
                                        }
 
                        function makeRegexParser( regex ) {
                                return function () {
-                                       var matches = message.substr( pos ).match( regex );
+                                       var matches = message.slice( pos ).match( regex );
 
                                        if ( matches === null ) {
                                                return null;
                                        }
 
-                                       pos += matches[0].length;
+                                       pos += matches[ 0 ].length;
 
-                                       return matches[0];
+                                       return matches[ 0 ];
                                };
                        }
 
                        anyCharacter = makeRegexParser( /^./ );
                        dollar = makeStringParser( '$' );
                        digits = makeRegexParser( /^\d+/ );
-                       regularLiteral = makeRegexParser( /^[^{}\[\]$\\]/ );
-                       regularLiteralWithoutBar = makeRegexParser( /^[^{}\[\]$\\|]/ );
-                       regularLiteralWithoutSpace = makeRegexParser( /^[^{}\[\]$\s]/ );
+                       regularLiteral = makeRegexParser( /^[^{}[\]$\\]/ );
+                       regularLiteralWithoutBar = makeRegexParser( /^[^{}[\]$\\|]/ );
+                       regularLiteralWithoutSpace = makeRegexParser( /^[^{}[\]$\s]/ );
 
                        // There is a general pattern:
                        // parse a thing;
                        function escapedLiteral() {
                                var result = sequence( [ backslash, anyCharacter ] );
 
-                               return result === null ? null : result[1];
+                               return result === null ? null : result[ 1 ];
                        }
 
                        choice( [ escapedLiteral, regularLiteralWithoutSpace ] );
                                        return null;
                                }
 
-                               return [ 'REPLACE', parseInt( result[1], 10 ) - 1 ];
+                               return [ 'REPLACE', parseInt( result[ 1 ], 10 ) - 1 ];
                        }
 
                        templateName = transform(
                                // see $wgLegalTitleChars
                                // not allowing : due to the need to catch "PLURAL:$1"
-                               makeRegexParser( /^[ !"$&'()*,.\/0-9;=?@A-Z\^_`a-z~\x80-\xFF+\-]+/ ),
+                               makeRegexParser( /^[ !"$&'()*,./0-9;=?@A-Z^_`a-z~\x80-\xFF+-]+/ ),
 
                                function ( result ) {
                                        return result.toString();
                                        return null;
                                }
 
-                               expr = result[1];
+                               expr = result[ 1 ];
 
                                // use a "CONCAT" operator if there are multiple nodes,
                                // otherwise return the first node, raw.
-                               return expr.length > 1 ? [ 'CONCAT' ].concat( expr ) : expr[0];
+                               return expr.length > 1 ? [ 'CONCAT' ].concat( expr ) : expr[ 0 ];
                        }
 
                        function templateWithReplacement() {
                                var result = sequence( [ templateName, colon, replacement ] );
 
-                               return result === null ? null : [ result[0], result[2] ];
+                               return result === null ? null : [ result[ 0 ], result[ 2 ] ];
                        }
 
                        function templateWithOutReplacement() {
                                var result = sequence( [ templateName, colon, paramExpression ] );
 
-                               return result === null ? null : [ result[0], result[2] ];
+                               return result === null ? null : [ result[ 0 ], result[ 2 ] ];
                        }
 
                        templateContents = choice( [
                                                nOrMore( 0, templateParam )
                                        ] );
 
-                                       return res === null ? null : res[0].concat( res[1] );
+                                       return res === null ? null : res[ 0 ].concat( res[ 1 ] );
                                },
                                function () {
                                        var res = sequence( [ templateName, nOrMore( 0, templateParam ) ] );
                                                return null;
                                        }
 
-                                       return [ res[0] ].concat( res[1] );
+                                       return [ res[ 0 ] ].concat( res[ 1 ] );
                                }
                        ] );
 
                        function template() {
                                var result = sequence( [ openTemplate, templateContents, closeTemplate ] );
 
-                               return result === null ? null : result[1];
+                               return result === null ? null : result[ 1 ];
                        }
 
                        expression = choice( [ template, replacement, literal ] );
                        /*
                         * For success, the pos must have gotten to the end of the input
                         * and returned a non-null.
-                        * n.b. This is part of language infrastructure, so we do not throw an internationalizable message.
+                        * n.b. This is part of language infrastructure, so we do not throw an
+                        * internationalizable message.
                         */
                        if ( result === null || pos !== message.length ) {
                                throw new Error( 'Parse error at position ' + pos.toString() + ' in input: ' + message );
index 5370069..41862ac 100644 (file)
@@ -4,15 +4,15 @@
 ( function ( $ ) {
        'use strict';
 
-       $.i18n.languages.bs = $.extend( {}, $.i18n.languages['default'], {
+       $.i18n.languages.bs = $.extend( {}, $.i18n.languages[ 'default' ], {
                convertGrammar: function ( word, form ) {
                        switch ( form ) {
-                       case 'instrumental': // instrumental
-                               word = 's ' + word;
-                               break;
-                       case 'lokativ': // locative
-                               word = 'o ' + word;
-                               break;
+                               case 'instrumental': // instrumental
+                                       word = 's ' + word;
+                                       break;
+                               case 'lokativ': // locative
+                                       word = 'o ' + word;
+                                       break;
                        }
 
                        return word;
index cc069eb..a1d33ac 100644 (file)
@@ -4,7 +4,7 @@
 ( function ( $ ) {
        'use strict';
 
-       $.i18n.languages.dsb = $.extend( {}, $.i18n.languages['default'], {
+       $.i18n.languages.dsb = $.extend( {}, $.i18n.languages[ 'default' ], {
                convertGrammar: function ( word, form ) {
                        switch ( form ) {
                                case 'instrumental': // instrumental
index d8e9578..3452601 100644 (file)
@@ -7,7 +7,7 @@
 ( function ( $ ) {
        'use strict';
 
-       $.i18n.languages.fi = $.extend( {}, $.i18n.languages['default'], {
+       $.i18n.languages.fi = $.extend( {}, $.i18n.languages[ 'default' ], {
                convertGrammar: function ( word, form ) {
                        // vowel harmony flag
                        var aou = word.match( /[aou][^äöy]*$/i ),
                        }
 
                        switch ( form ) {
-                       case 'genitive':
-                               word += 'n';
-                               break;
-                       case 'elative':
-                               word += ( aou ? 'sta' : 'stä' );
-                               break;
-                       case 'partitive':
-                               word += ( aou ? 'a' : 'ä' );
-                               break;
-                       case 'illative':
+                               case 'genitive':
+                                       word += 'n';
+                                       break;
+                               case 'elative':
+                                       word += ( aou ? 'sta' : 'stä' );
+                                       break;
+                               case 'partitive':
+                                       word += ( aou ? 'a' : 'ä' );
+                                       break;
+                               case 'illative':
                                // Double the last letter and add 'n'
-                               word += word.substr( word.length - 1 ) + 'n';
-                               break;
-                       case 'inessive':
-                               word += ( aou ? 'ssa' : 'ssä' );
-                               break;
-                       default:
-                               word = origWord;
-                               break;
+                                       word += word.slice( -1 ) + 'n';
+                                       break;
+                               case 'inessive':
+                                       word += ( aou ? 'ssa' : 'ssä' );
+                                       break;
+                               default:
+                                       word = origWord;
+                                       break;
                        }
 
                        return word;
index 1aceab7..843673a 100644 (file)
@@ -4,31 +4,31 @@
 ( function ( $ ) {
        'use strict';
 
-       $.i18n.languages.ga = $.extend( {}, $.i18n.languages['default'], {
+       $.i18n.languages.ga = $.extend( {}, $.i18n.languages[ 'default' ], {
                convertGrammar: function ( word, form ) {
                        if ( form === 'ainmlae' ) {
                                switch ( word ) {
-                               case 'an Domhnach':
-                                       word = 'Dé Domhnaigh';
-                                       break;
-                               case 'an Luan':
-                                       word = 'Dé Luain';
-                                       break;
-                               case 'an Mháirt':
-                                       word = 'Dé Mháirt';
-                                       break;
-                               case 'an Chéadaoin':
-                                       word = 'Dé Chéadaoin';
-                                       break;
-                               case 'an Déardaoin':
-                                       word = 'Déardaoin';
-                                       break;
-                               case 'an Aoine':
-                                       word = 'Dé hAoine';
-                                       break;
-                               case 'an Satharn':
-                                       word = 'Dé Sathairn';
-                                       break;
+                                       case 'an Domhnach':
+                                               word = 'Dé Domhnaigh';
+                                               break;
+                                       case 'an Luan':
+                                               word = 'Dé Luain';
+                                               break;
+                                       case 'an Mháirt':
+                                               word = 'Dé Mháirt';
+                                               break;
+                                       case 'an Chéadaoin':
+                                               word = 'Dé Chéadaoin';
+                                               break;
+                                       case 'an Déardaoin':
+                                               word = 'Déardaoin';
+                                               break;
+                                       case 'an Aoine':
+                                               word = 'Dé hAoine';
+                                               break;
+                                       case 'an Satharn':
+                                               word = 'Dé Sathairn';
+                                               break;
                                }
                        }
 
index cbbe90b..b593429 100644 (file)
@@ -4,25 +4,25 @@
 ( function ( $ ) {
        'use strict';
 
-       $.i18n.languages.he = $.extend( {}, $.i18n.languages['default'], {
+       $.i18n.languages.he = $.extend( {}, $.i18n.languages[ 'default' ], {
                convertGrammar: function ( word, form ) {
                        switch ( form ) {
-                       case 'prefixed':
-                       case 'תחילית': // the same word in Hebrew
-                               // Duplicate prefixed "Waw", but only if it's not already double
-                               if ( word.substr( 0, 1 ) === 'ו' && word.substr( 0, 2 ) !== 'וו' ) {
-                                       word = 'ו' + word;
-                               }
+                               case 'prefixed':
+                               case 'תחילית': // the same word in Hebrew
+                                       // Duplicate prefixed "Waw", but only if it's not already double
+                                       if ( word.slice( 0, 1 ) === 'ו' && word.slice( 0, 2 ) !== 'וו' ) {
+                                               word = 'ו' + word;
+                                       }
 
-                               // Remove the "He" if prefixed
-                               if ( word.substr( 0, 1 ) === 'ה' ) {
-                                       word = word.substr( 1, word.length );
-                               }
+                                       // Remove the "He" if prefixed
+                                       if ( word.slice( 0, 1 ) === 'ה' ) {
+                                               word = word.slice( 1 );
+                                       }
 
-                               // Add a hyphen (maqaf) before numbers and non-Hebrew letters
-                               if ( word.substr( 0, 1 ) < 'א' || word.substr( 0, 1 ) > 'ת' ) {
-                                       word = '־' + word;
-                               }
+                                       // Add a hyphen (maqaf) before numbers and non-Hebrew letters
+                                       if ( word.slice( 0, 1 ) < 'א' || word.slice( 0, 1 ) > 'ת' ) {
+                                               word = '־' + word;
+                                       }
                        }
 
                        return word;
index 957616f..2beb8de 100644 (file)
@@ -4,15 +4,15 @@
 ( function ( $ ) {
        'use strict';
 
-       $.i18n.languages.hsb = $.extend( {}, $.i18n.languages['default'], {
+       $.i18n.languages.hsb = $.extend( {}, $.i18n.languages[ 'default' ], {
                convertGrammar: function ( word, form ) {
                        switch ( form ) {
-                       case 'instrumental': // instrumental
-                               word = 'z ' + word;
-                               break;
-                       case 'lokatiw': // lokatiw
-                               word = 'wo ' + word;
-                               break;
+                               case 'instrumental': // instrumental
+                                       word = 'z ' + word;
+                                       break;
+                               case 'lokatiw': // lokatiw
+                                       word = 'wo ' + word;
+                                       break;
                        }
 
                        return word;
index 1177b85..ec52f4c 100644 (file)
@@ -6,18 +6,18 @@
 ( function ( $ ) {
        'use strict';
 
-       $.i18n.languages.hu = $.extend( {}, $.i18n.languages['default'], {
+       $.i18n.languages.hu = $.extend( {}, $.i18n.languages[ 'default' ], {
                convertGrammar: function ( word, form ) {
                        switch ( form ) {
-                       case 'rol':
-                               word += 'ról';
-                               break;
-                       case 'ba':
-                               word += 'ba';
-                               break;
-                       case 'k':
-                               word += 'k';
-                               break;
+                               case 'rol':
+                                       word += 'ról';
+                                       break;
+                               case 'ba':
+                                       word += 'ba';
+                                       break;
+                               case 'k':
+                                       word += 'k';
+                                       break;
                        }
 
                        return word;
index 9c56899..5ecf7ba 100644 (file)
@@ -5,15 +5,15 @@
 ( function ( $ ) {
        'use strict';
 
-       $.i18n.languages.hy = $.extend( {}, $.i18n.languages['default'], {
+       $.i18n.languages.hy = $.extend( {}, $.i18n.languages[ 'default' ], {
                convertGrammar: function ( word, form ) {
                        if ( form === 'genitive' ) { // սեռական հոլով
-                               if ( word.substr( -1 ) === 'ա' ) {
-                                       word = word.substr( 0, word.length - 1 ) + 'այի';
-                               } else if ( word.substr( -1 ) === 'ո' ) {
-                                       word = word.substr( 0, word.length - 1 ) + 'ոյի';
-                               } else if ( word.substr( -4 ) === 'գիրք' ) {
-                                       word = word.substr( 0, word.length - 4 ) + 'գրքի';
+                               if ( word.slice( -1 ) === 'ա' ) {
+                                       word = word.slice( 0, -1 ) + 'այի';
+                               } else if ( word.slice( -1 ) === 'ո' ) {
+                                       word = word.slice( 0, -1 ) + 'ոյի';
+                               } else if ( word.slice( -4 ) === 'գիրք' ) {
+                                       word = word.slice( 0, -4 ) + 'գրքի';
                                } else {
                                        word = word + 'ի';
                                }
index 11c1122..1a6c92b 100644 (file)
@@ -7,45 +7,45 @@
 ( function ( $ ) {
        'use strict';
 
-       $.i18n.languages.la = $.extend( {}, $.i18n.languages['default'], {
+       $.i18n.languages.la = $.extend( {}, $.i18n.languages[ 'default' ], {
                convertGrammar: function ( word, form ) {
                        switch ( form ) {
-                       case 'genitive':
+                               case 'genitive':
                                // only a few declensions, and even for those mostly the singular only
-                               word = word.replace( /u[ms]$/i, 'i' ); // 2nd declension singular
-                               word = word.replace( /ommunia$/i, 'ommunium' ); // 3rd declension neuter plural (partly)
-                               word = word.replace( /a$/i, 'ae' ); // 1st declension singular
-                               word = word.replace( /libri$/i, 'librorum' ); // 2nd declension plural (partly)
-                               word = word.replace( /nuntii$/i, 'nuntiorum' ); // 2nd declension plural (partly)
-                               word = word.replace( /tio$/i, 'tionis' ); // 3rd declension singular (partly)
-                               word = word.replace( /ns$/i, 'ntis' );
-                               word = word.replace( /as$/i, 'atis' );
-                               word = word.replace( /es$/i, 'ei' ); // 5th declension singular
-                               break;
-                       case 'accusative':
+                                       word = word.replace( /u[ms]$/i, 'i' ); // 2nd declension singular
+                                       word = word.replace( /ommunia$/i, 'ommunium' ); // 3rd declension neuter plural (partly)
+                                       word = word.replace( /a$/i, 'ae' ); // 1st declension singular
+                                       word = word.replace( /libri$/i, 'librorum' ); // 2nd declension plural (partly)
+                                       word = word.replace( /nuntii$/i, 'nuntiorum' ); // 2nd declension plural (partly)
+                                       word = word.replace( /tio$/i, 'tionis' ); // 3rd declension singular (partly)
+                                       word = word.replace( /ns$/i, 'ntis' );
+                                       word = word.replace( /as$/i, 'atis' );
+                                       word = word.replace( /es$/i, 'ei' ); // 5th declension singular
+                                       break;
+                               case 'accusative':
                                // only a few declensions, and even for those mostly the singular only
-                               word = word.replace( /u[ms]$/i, 'um' ); // 2nd declension singular
-                               word = word.replace( /ommunia$/i, 'am' ); // 3rd declension neuter plural (partly)
-                               word = word.replace( /a$/i, 'ommunia' ); // 1st declension singular
-                               word = word.replace( /libri$/i, 'libros' ); // 2nd declension plural (partly)
-                               word = word.replace( /nuntii$/i, 'nuntios' );// 2nd declension plural (partly)
-                               word = word.replace( /tio$/i, 'tionem' ); // 3rd declension singular (partly)
-                               word = word.replace( /ns$/i, 'ntem' );
-                               word = word.replace( /as$/i, 'atem' );
-                               word = word.replace( /es$/i, 'em' ); // 5th declension singular
-                               break;
-                       case 'ablative':
+                                       word = word.replace( /u[ms]$/i, 'um' ); // 2nd declension singular
+                                       word = word.replace( /ommunia$/i, 'am' ); // 3rd declension neuter plural (partly)
+                                       word = word.replace( /a$/i, 'ommunia' ); // 1st declension singular
+                                       word = word.replace( /libri$/i, 'libros' ); // 2nd declension plural (partly)
+                                       word = word.replace( /nuntii$/i, 'nuntios' );// 2nd declension plural (partly)
+                                       word = word.replace( /tio$/i, 'tionem' ); // 3rd declension singular (partly)
+                                       word = word.replace( /ns$/i, 'ntem' );
+                                       word = word.replace( /as$/i, 'atem' );
+                                       word = word.replace( /es$/i, 'em' ); // 5th declension singular
+                                       break;
+                               case 'ablative':
                                // only a few declensions, and even for those mostly the singular only
-                               word = word.replace( /u[ms]$/i, 'o' ); // 2nd declension singular
-                               word = word.replace( /ommunia$/i, 'ommunibus' ); // 3rd declension neuter plural (partly)
-                               word = word.replace( /a$/i, 'a' ); // 1st declension singular
-                               word = word.replace( /libri$/i, 'libris' ); // 2nd declension plural (partly)
-                               word = word.replace( /nuntii$/i, 'nuntiis' ); // 2nd declension plural (partly)
-                               word = word.replace( /tio$/i, 'tione' ); // 3rd declension singular (partly)
-                               word = word.replace( /ns$/i, 'nte' );
-                               word = word.replace( /as$/i, 'ate' );
-                               word = word.replace( /es$/i, 'e' ); // 5th declension singular
-                               break;
+                                       word = word.replace( /u[ms]$/i, 'o' ); // 2nd declension singular
+                                       word = word.replace( /ommunia$/i, 'ommunibus' ); // 3rd declension neuter plural (partly)
+                                       word = word.replace( /a$/i, 'a' ); // 1st declension singular
+                                       word = word.replace( /libri$/i, 'libris' ); // 2nd declension plural (partly)
+                                       word = word.replace( /nuntii$/i, 'nuntiis' ); // 2nd declension plural (partly)
+                                       word = word.replace( /tio$/i, 'tione' ); // 3rd declension singular (partly)
+                                       word = word.replace( /ns$/i, 'nte' );
+                                       word = word.replace( /as$/i, 'ate' );
+                                       word = word.replace( /es$/i, 'e' ); // 5th declension singular
+                                       break;
                        }
 
                        return word;
index f724b7b..d9c82cf 100644 (file)
@@ -7,40 +7,40 @@
 ( function ( $ ) {
        'use strict';
 
-       $.i18n.languages.ml = $.extend( {}, $.i18n.languages['default'], {
+       $.i18n.languages.ml = $.extend( {}, $.i18n.languages[ 'default' ], {
                convertGrammar: function ( word, form ) {
                        form = form.toLowerCase();
                        switch ( form ) {
                                case 'ഉദ്ദേശിക':
                                case 'dative':
-                                       if ( word.substr( -1 ) === 'ു' ||
-                                               word.substr( -1 ) === 'ൂ' ||
-                                               word.substr( -1 ) === 'ൗ' ||
-                                               word.substr( -1 ) === 'ൌ'
+                                       if ( word.slice( -1 ) === 'ു' ||
+                                               word.slice( -1 ) === 'ൂ' ||
+                                               word.slice( -1 ) === 'ൗ' ||
+                                               word.slice( -1 ) === 'ൌ'
                                        ) {
                                                word += 'വിന്';
-                                       } else if ( word.substr( -1 ) === 'ം' ) {
-                                               word = word.substr( 0, word.length - 1 ) + 'ത്തിന്';
-                                       } else if ( word.substr( -1 ) === 'ൻ' ) {
+                                       } else if ( word.slice( -1 ) === 'ം' ) {
+                                               word = word.slice( 0, -1 ) + 'ത്തിന്';
+                                       } else if ( word.slice( -1 ) === 'ൻ' ) {
                                                // Atomic chillu n. അവൻ -> അവന്
-                                               word = word.substr( 0, word.length - 1 ) + 'ന്';
-                                       } else if ( word.substr( -3 ) === 'ന്\u200d' ) {
+                                               word = word.slice( 0, -1 ) + 'ന്';
+                                       } else if ( word.slice( -3 ) === 'ന്\u200d' ) {
                                                // chillu n. അവൻ -> അവന്
-                                               word = word.substr( 0, word.length - 1 );
-                                       } else if ( word.substr( -1 ) === 'ൾ' || word.substr( -3 ) === 'ള്\u200d' ) {
+                                               word = word.slice( 0, -1 );
+                                       } else if ( word.slice( -1 ) === 'ൾ' || word.slice( -3 ) === 'ള്\u200d' ) {
                                                word += 'ക്ക്';
-                                       } else if ( word.substr( -1 ) === 'ർ' || word.substr( -3 ) === 'ര്\u200d' ) {
+                                       } else if ( word.slice( -1 ) === 'ർ' || word.slice( -3 ) === 'ര്\u200d' ) {
                                                word += 'ക്ക്';
-                                       } else if ( word.substr( -1 ) === 'ൽ' ) {
+                                       } else if ( word.slice( -1 ) === 'ൽ' ) {
                                                // Atomic chillu ൽ , ഫയൽ -> ഫയലിന്
-                                               word = word.substr( 0, word.length - 1 ) + 'ലിന്';
-                                       } else if ( word.substr( -3 ) === 'ല്\u200d' ) {
+                                               word = word.slice( 0, -1 ) + 'ലിന്';
+                                       } else if ( word.slice( -3 ) === 'ല്\u200d' ) {
                                                // chillu ല്\u200d , ഫയല്\u200d -> ഫയലിന്
-                                               word = word.substr( 0, word.length - 2 ) + 'ിന്';
-                                       } else if ( word.substr( -2 ) === 'ു്' ) {
-                                               word = word.substr( 0, word.length - 2 ) + 'ിന്';
-                                       } else if ( word.substr( -1 ) === '്' ) {
-                                               word = word.substr( 0, word.length - 1 ) + 'ിന്';
+                                               word = word.slice( 0, -2 ) + 'ിന്';
+                                       } else if ( word.slice( -2 ) === 'ു്' ) {
+                                               word = word.slice( 0, -2 ) + 'ിന്';
+                                       } else if ( word.slice( -1 ) === '്' ) {
+                                               word = word.slice( 0, -1 ) + 'ിന്';
                                        } else {
                                                // കാവ്യ -> കാവ്യയ്ക്ക്, ഹരി -> ഹരിയ്ക്ക്, മല -> മലയ്ക്ക്
                                                word += 'യ്ക്ക്';
                                        break;
                                case 'സംബന്ധിക':
                                case 'genitive':
-                                       if ( word.substr( -1 ) === 'ം' ) {
-                                               word = word.substr( 0, word.length - 1 ) + 'ത്തിന്റെ';
-                                       } else if ( word.substr( -2 ) === 'ു്' ) {
-                                               word = word.substr( 0, word.length - 2 ) + 'ിന്റെ';
-                                       } else if ( word.substr( -1 ) === '്' ) {
-                                               word = word.substr( 0, word.length - 1 ) + 'ിന്റെ';
-                                       } else if (  word.substr( -1 ) === 'ു' ||
-                                               word.substr( -1 ) === 'ൂ' ||
-                                               word.substr( -1 ) === 'ൗ' ||
-                                               word.substr( -1 ) === 'ൌ'
+                                       if ( word.slice( -1 ) === 'ം' ) {
+                                               word = word.slice( 0, -1 ) + 'ത്തിന്റെ';
+                                       } else if ( word.slice( -2 ) === 'ു്' ) {
+                                               word = word.slice( 0, -2 ) + 'ിന്റെ';
+                                       } else if ( word.slice( -1 ) === '്' ) {
+                                               word = word.slice( 0, -1 ) + 'ിന്റെ';
+                                       } else if ( word.slice( -1 ) === 'ു' ||
+                                               word.slice( -1 ) === 'ൂ' ||
+                                               word.slice( -1 ) === 'ൗ' ||
+                                               word.slice( -1 ) === 'ൌ'
                                        ) {
                                                word += 'വിന്റെ';
-                                       } else if ( word.substr( -1 ) === 'ൻ' ) {
+                                       } else if ( word.slice( -1 ) === 'ൻ' ) {
                                                // Atomic chillu n. അവൻ -> അവന്റെ
-                                               word = word.substr( 0, word.length - 1 ) + 'ന്റെ';
-                                       } else if ( word.substr( -3 ) === 'ന്\u200d' ) {
+                                               word = word.slice( 0, -1 ) + 'ന്റെ';
+                                       } else if ( word.slice( -3 ) === 'ന്\u200d' ) {
                                                // chillu n. അവൻ -> അവന്റെ
-                                               word = word.substr( 0, word.length - 1 ) + 'റെ';
-                                       } else if ( word.substr( -3 ) === 'ള്\u200d' ) {
+                                               word = word.slice( 0, -1 ) + 'റെ';
+                                       } else if ( word.slice( -3 ) === 'ള്\u200d' ) {
                                                // chillu n. അവൾ -> അവളുടെ
-                                               word = word.substr( 0, word.length - 2 ) + 'ുടെ';
-                                       } else if ( word.substr( -1 ) === 'ൾ' ) {
+                                               word = word.slice( 0, -2 ) + 'ുടെ';
+                                       } else if ( word.slice( -1 ) === 'ൾ' ) {
                                                // Atomic chillu n. അവള്\u200d -> അവളുടെ
-                                               word = word.substr( 0, word.length - 1 ) + 'ളുടെ';
-                                       } else if ( word.substr( -1 ) === 'ൽ' ) {
+                                               word = word.slice( 0, -1 ) + 'ളുടെ';
+                                       } else if ( word.slice( -1 ) === 'ൽ' ) {
                                                // Atomic l. മുയല്\u200d -> മുയലിന്റെ
-                                               word = word.substr( 0, word.length - 1 ) + 'ലിന്റെ';
-                                       } else if ( word.substr( -3 ) === 'ല്\u200d' ) {
+                                               word = word.slice( 0, -1 ) + 'ലിന്റെ';
+                                       } else if ( word.slice( -3 ) === 'ല്\u200d' ) {
                                                // chillu l. മുയല്\u200d -> അവളുടെ
-                                               word = word.substr( 0, word.length - 2 ) + 'ിന്റെ';
-                                       } else if ( word.substr( -3 ) === 'ര്\u200d' ) {
+                                               word = word.slice( 0, -2 ) + 'ിന്റെ';
+                                       } else if ( word.slice( -3 ) === 'ര്\u200d' ) {
                                                // chillu r. അവര്\u200d -> അവരുടെ
-                                               word = word.substr( 0, word.length - 2 ) + 'ുടെ';
-                                       } else if ( word.substr( -1 ) === 'ർ' ) {
+                                               word = word.slice( 0, -2 ) + 'ുടെ';
+                                       } else if ( word.slice( -1 ) === 'ർ' ) {
                                                // Atomic chillu r. അവർ -> അവരുടെ
-                                               word = word.substr( 0, word.length - 1 ) + 'രുടെ';
+                                               word = word.slice( 0, -1 ) + 'രുടെ';
                                        } else {
                                                word += 'യുടെ';
                                        }
index 4744367..e788db9 100644 (file)
@@ -7,7 +7,7 @@
 ( function ( $ ) {
        'use strict';
 
-       $.i18n.languages.os = $.extend( {}, $.i18n.languages['default'], {
+       $.i18n.languages.os = $.extend( {}, $.i18n.languages[ 'default' ], {
                convertGrammar: function ( word, form ) {
                        var endAllative, jot, hyphen, ending;
 
@@ -22,7 +22,7 @@
 
                        if ( word.match( /тæ$/i ) ) {
                                // Checking if the $word is in plural form
-                               word = word.substring( 0, word.length - 1 );
+                               word = word.slice( 0, -1 );
                                endAllative = 'æм';
                        } else if ( word.match( /[аæеёиоыэюя]$/i ) ) {
                                // Works if word is in singular form.
@@ -34,8 +34,7 @@
                                // vowel 'U' in cyrillic Ossetic.
                                // Examples: {{grammar:genitive|аунеу}} = аунеуы,
                                // {{grammar:genitive|лæппу}} = лæппуйы.
-                               if ( !word.substring( word.length - 2, word.length - 1 )
-                                               .match( /[аæеёиоыэюя]$/i ) ) {
+                               if ( !word.slice( -2, -1 ).match( /[аæеёиоыэюя]$/i ) ) {
                                        jot = 'й';
                                }
                        } else if ( !word.match( /[бвгджзйклмнопрстфхцчшщьъ]$/i ) ) {
                        }
 
                        switch ( form ) {
-                       case 'genitive':
-                               ending = hyphen + jot + 'ы';
-                               break;
-                       case 'dative':
-                               ending = hyphen + jot + 'æн';
-                               break;
-                       case 'allative':
-                               ending = hyphen + endAllative;
-                               break;
-                       case 'ablative':
-                               if ( jot === 'й' ) {
-                                       ending = hyphen + jot + 'æ';
-                               } else {
-                                       ending = hyphen + jot + 'æй';
-                               }
-                               break;
-                       case 'superessive':
-                               ending = hyphen + jot + 'ыл';
-                               break;
-                       case 'equative':
-                               ending = hyphen + jot + 'ау';
-                               break;
-                       case 'comitative':
-                               ending = hyphen + 'имæ';
-                               break;
+                               case 'genitive':
+                                       ending = hyphen + jot + 'ы';
+                                       break;
+                               case 'dative':
+                                       ending = hyphen + jot + 'æн';
+                                       break;
+                               case 'allative':
+                                       ending = hyphen + endAllative;
+                                       break;
+                               case 'ablative':
+                                       if ( jot === 'й' ) {
+                                               ending = hyphen + jot + 'æ';
+                                       } else {
+                                               ending = hyphen + jot + 'æй';
+                                       }
+                                       break;
+                               case 'superessive':
+                                       ending = hyphen + jot + 'ыл';
+                                       break;
+                               case 'equative':
+                                       ending = hyphen + jot + 'ау';
+                                       break;
+                               case 'comitative':
+                                       ending = hyphen + 'имæ';
+                                       break;
                        }
 
                        return word + ending;
index 893b238..60fefff 100644 (file)
@@ -5,21 +5,21 @@
 ( function ( $ ) {
        'use strict';
 
-       $.i18n.languages.ru = $.extend( {}, $.i18n.languages['default'], {
+       $.i18n.languages.ru = $.extend( {}, $.i18n.languages[ 'default' ], {
                convertGrammar: function ( word, form ) {
                        if ( form === 'genitive' ) { // родительный падеж
-                               if ( word.substr( -1 ) === 'ь' ) {
-                                       word = word.substr( 0, word.length - 1 ) + 'я';
-                               } else if ( word.substr( -2 ) === 'ия' ) {
-                                       word = word.substr( 0, word.length - 2 ) + 'ии';
-                               } else if ( word.substr( -2 ) === 'ка' ) {
-                                       word = word.substr( 0, word.length - 2 ) + 'ки';
-                               } else if ( word.substr( -2 ) === 'ти' ) {
-                                       word = word.substr( 0, word.length - 2 ) + 'тей';
-                               } else if ( word.substr( -2 ) === 'ды' ) {
-                                       word = word.substr( 0, word.length - 2 ) + 'дов';
-                               } else if ( word.substr( -3 ) === 'ник' ) {
-                                       word = word.substr( 0, word.length - 3 ) + 'ника';
+                               if ( word.slice( -1 ) === 'ь' ) {
+                                       word = word.slice( 0, -1 ) + 'я';
+                               } else if ( word.slice( -2 ) === 'ия' ) {
+                                       word = word.slice( 0, -2 ) + 'ии';
+                               } else if ( word.slice( -2 ) === 'ка' ) {
+                                       word = word.slice( 0, -2 ) + 'ки';
+                               } else if ( word.slice( -2 ) === 'ти' ) {
+                                       word = word.slice( 0, -2 ) + 'тей';
+                               } else if ( word.slice( -2 ) === 'ды' ) {
+                                       word = word.slice( 0, -2 ) + 'дов';
+                               } else if ( word.slice( -3 ) === 'ник' ) {
+                                       word = word.slice( 0, -3 ) + 'ника';
                                }
                        }
 
index a3aafc3..0e14ed5 100644 (file)
@@ -5,7 +5,7 @@
 ( function ( $ ) {
        'use strict';
 
-       $.i18n.languages.sl = $.extend( {}, $.i18n.languages['default'], {
+       $.i18n.languages.sl = $.extend( {}, $.i18n.languages[ 'default' ], {
                convertGrammar: function ( word, form ) {
                        switch ( form ) {
                                // locative
index 8e69efc..f5292cf 100644 (file)
@@ -5,31 +5,31 @@
 ( function ( $ ) {
        'use strict';
 
-       $.i18n.languages.uk = $.extend( {}, $.i18n.languages['default'], {
+       $.i18n.languages.uk = $.extend( {}, $.i18n.languages[ 'default' ], {
                convertGrammar: function ( word, form ) {
                        switch ( form ) {
-                       case 'genitive': // родовий відмінок
-                               if ( word.substr( -1 ) === 'ь' ) {
-                                       word = word.substr( 0, word.length - 1 ) + 'я';
-                               } else if ( word.substr( -2 ) === 'ія' ) {
-                                       word = word.substr( 0, word.length - 2 ) + 'ії';
-                               } else if ( word.substr( -2 ) === 'ка' ) {
-                                       word = word.substr( 0, word.length - 2 ) + 'ки';
-                               } else if ( word.substr( -2 ) === 'ти' ) {
-                                       word = word.substr( 0, word.length - 2 ) + 'тей';
-                               } else if ( word.substr( -2 ) === 'ды' ) {
-                                       word = word.substr( 0, word.length - 2 ) + 'дов';
-                               } else if ( word.substr( -3 ) === 'ник' ) {
-                                       word = word.substr( 0, word.length - 3 ) + 'ника';
-                               }
+                               case 'genitive': // родовий відмінок
+                                       if ( word.slice( -1 ) === 'ь' ) {
+                                               word = word.slice( 0, -1 ) + 'я';
+                                       } else if ( word.slice( -2 ) === 'ія' ) {
+                                               word = word.slice( 0, -2 ) + 'ії';
+                                       } else if ( word.slice( -2 ) === 'ка' ) {
+                                               word = word.slice( 0, -2 ) + 'ки';
+                                       } else if ( word.slice( -2 ) === 'ти' ) {
+                                               word = word.slice( 0, -2 ) + 'тей';
+                                       } else if ( word.slice( -2 ) === 'ды' ) {
+                                               word = word.slice( 0, -2 ) + 'дов';
+                                       } else if ( word.slice( -3 ) === 'ник' ) {
+                                               word = word.slice( 0, -3 ) + 'ника';
+                                       }
 
-                               break;
-                       case 'accusative': // знахідний відмінок
-                               if ( word.substr( -2 ) === 'ія' ) {
-                                       word = word.substr( 0, word.length - 2 ) + 'ію';
-                               }
+                                       break;
+                               case 'accusative': // знахідний відмінок
+                                       if ( word.slice( -2 ) === 'ія' ) {
+                                               word = word.slice( 0, -2 ) + 'ію';
+                                       }
 
-                               break;
+                                       break;
                        }
 
                        return word;
index 7dcdc81..c282d6a 100644 (file)
@@ -6,11 +6,11 @@
                var colonSeparator = mw.message( 'colon-separator' ).text(),
                        summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
                        summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
-                       $wpDeleteReasonList = $( '#wpDeleteReasonList' ),
-                       $wpReason = $( '#wpReason' ),
+                       reasonList = OO.ui.infuse( $( '#wpDeleteReasonList' ).closest( '.oo-ui-widget' ) ),
+                       reason = OO.ui.infuse( $( '#wpReason' ).closest( '.oo-ui-widget' ) ),
                        filterFn = function ( input ) {
                                // Should be built the same as in SpecialRevisionDelete::submit()
-                               var comment = $wpDeleteReasonList.val();
+                               var comment = reasonList.getValue();
                                if ( comment === 'other' ) {
                                        comment = input;
                                } else if ( input !== '' ) {
@@ -22,9 +22,9 @@
 
                // Limit to bytes or UTF-8 codepoints, depending on MediaWiki's configuration
                if ( summaryCodePointLimit ) {
-                       $wpReason.codePointLimit( summaryCodePointLimit, filterFn );
+                       reason.$input.codePointLimit( summaryCodePointLimit, filterFn );
                } else if ( summaryByteLimit ) {
-                       $wpReason.byteLimit( summaryByteLimit, filterFn );
+                       reason.$input.byteLimit( summaryByteLimit, filterFn );
                }
        } );
 
index 0b56df1..a156e88 100644 (file)
                width: 100%;
        }
 
+       // Default OOUI styles produce a larger margin here
+       .mw-htmlform-field-HTMLSizeFilterField {
+               margin-top: @ooui-spacing-medium;
+       }
+
        .mw-htmlform-matrix {
                border-spacing: 0 2px;
 
index bac0846..835cab8 100644 (file)
@@ -9,7 +9,6 @@
 @ooui-spacing-medium: 12 / @ooui-font-size-browser / @ooui-font-size-base; // equals `0.8571429em`≈`12px`
 @ooui-spacing-large: 16 / @ooui-font-size-browser / @ooui-font-size-base; // equals `1.1428571em`≈`16px`
 
-.mw-htmlform-ooui .mw-htmlform-field-HTMLSizeFilterField,
 .mw-htmlform-ooui .mw-htmlform-submit-buttons + div {
        margin-top: @ooui-spacing-medium;
 }
index 8aacdee..5416d95 100644 (file)
@@ -2216,6 +2216,18 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                return $loaded;
        }
 
+       /**
+        * Skip the test if using the specified database type
+        *
+        * @param string $type Database type
+        * @since 1.32
+        */
+       protected function markTestSkippedIfDbType( $type ) {
+               if ( $this->db->getType() === $type ) {
+                       $this->markTestSkipped( "The $type database type isn't supported for this test" );
+               }
+       }
+
        /**
         * Used as a marker to prevent wfResetOutputBuffers from breaking PHPUnit.
         * @param string $buffer
index d3c7af5..efd61a7 100644 (file)
@@ -452,19 +452,6 @@ class OutputPageTest extends MediaWikiTestCase {
                $this->assertContains( '<meta name="robots" content="noindex,nofollow"/>', $links );
        }
 
-       // @todo mPageTitleActionText has done nothing and has no callers for a long time:
-       //
-       //   * e4d21170 inadvertently made it do nothing (Apr 2009)
-       //   * 10ecfcb0/cadc951d removed the dead code that would have at least indicated what it was
-       //   supposed to do (Nov 2010)
-       //   * 9e230f30/2d045fa1 removed from history pages because it did nothing (Oct/Aug 2011)
-       //   * e275ea28 removed from articles (Oct 2011)
-       //   * ae45908c removed from EditPage (Oct 2011)
-       //
-       // Nice if we had had tests so these things couldn't happen by mistake, right?!
-       //
-       // https://phabricator.wikimedia.org/T200643
-
        private function extractHTMLTitle( OutputPage $op ) {
                $html = $op->headElement( $op->getContext()->getSkin() );
 
index 98ec7e0..5606924 100644 (file)
@@ -202,6 +202,8 @@ class PrefixSearchTest extends MediaWikiLangTestCase {
         * @covers PrefixSearch::searchBackend
         */
        public function testSearch( array $case ) {
+               // FIXME: fails under postgres
+               $this->markTestSkippedIfDbType( 'postgres' );
                $this->searchProvision( null );
 
                $namespaces = $case['namespaces'] ?? [];
@@ -226,6 +228,8 @@ class PrefixSearchTest extends MediaWikiLangTestCase {
         * @covers PrefixSearch::searchBackend
         */
        public function testSearchWithOffset( array $case ) {
+               // FIXME: fails under postgres
+               $this->markTestSkippedIfDbType( 'postgres' );
                $this->searchProvision( null );
 
                $namespaces = $case['namespaces'] ?? [];
index e5104d8..b5b2e0d 100644 (file)
@@ -299,6 +299,9 @@ class NameTableStoreTest extends MediaWikiTestCase {
        }
 
        public function testGetAndAcquireIdInsertCallback() {
+               // FIXME: fails under postgres
+               $this->markTestSkippedIfDbType( 'postgres' );
+
                $store = $this->getNameTableSqlStore(
                        new EmptyBagOStuff(),
                        1,
index 110f032..ad1e013 100644 (file)
@@ -397,6 +397,9 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
        public function testInsertRevisionOn_successes(
                array $revDetails = []
        ) {
+               // FIXME: fails under postgres
+               $this->markTestSkippedIfDbType( 'postgres' );
+
                $title = $this->getTestPageTitle();
                $rev = $this->getRevisionRecordFromDetailsArray( $revDetails );
 
index b5f7322..a40f09c 100644 (file)
@@ -244,6 +244,8 @@ class SqlBlobStoreTest extends MediaWikiTestCase {
         * @covers \MediaWiki\Storage\SqlBlobStore::getBlob
         */
        public function testSimpleStoreGetBlobSimpleRoundtripWindowsLegacyEncodingGzip( $blob ) {
+               // FIXME: fails under postgres
+               $this->markTestSkippedIfDbType( 'postgres' );
                $store = $this->getBlobStore( 'windows-1252', true );
                $address = $store->storeBlob( $blob );
                $this->assertSame( $blob, $store->getBlob( $address ) );
index 866848b..121820a 100644 (file)
@@ -175,6 +175,9 @@ class ApiBaseTest extends ApiTestCase {
        }
 
        public function testGetTitleOrPageIdInvalidPageId() {
+               // FIXME: fails under postgres
+               $this->markTestSkippedIfDbType( 'postgres' );
+
                $this->setExpectedException( ApiUsageException::class,
                        'There is no page with ID 2147483648.' );
                $mock = new MockApi();
index 82f3b92..ac86377 100644 (file)
@@ -57,6 +57,8 @@ class ApiQueryUserContribsTest extends ApiTestCase {
                        // https://bugs.mysql.com/bug.php?id=10327
                        $this->markTestSkipped( 'MySQL bug 10327 - can\'t reopen temporary tables' );
                }
+               // FIXME: fails under sqlite
+               $this->markTestSkippedIfDbType( 'sqlite' );
 
                $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', $stage );
                $this->overrideMwServices();
index 03d0579..3ef4f05 100644 (file)
@@ -382,6 +382,9 @@ class ChangeTagsTest extends MediaWikiTestCase {
        }
 
        public function testUpdateTagsMigrationWriteBoth() {
+               // FIXME: fails under postgres
+               $this->markTestSkippedIfDbType( 'postgres' );
+
                $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_WRITE_BOTH );
                $dbw = wfGetDB( DB_MASTER );
                $dbw->delete( 'change_tag', '*' );
index 823be6f..9506c36 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group ContentHandler
  * @group Database
@@ -207,7 +209,7 @@ class JavaScriptContentTest extends TextContentTest {
         * @covers JavaScriptContent::matchMagicWord
         */
        public function testMatchMagicWord() {
-               $mw = MagicWord::get( "staticredirect" );
+               $mw = MediaWikiServices::getInstance()->getMagicWordFactory()->get( "staticredirect" );
 
                $content = $this->newContent( "#REDIRECT [[FOO]]\n__STATICREDIRECT__" );
                $this->assertFalse(
index c78bc5b..687c7e0 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group ContentHandler
  *
@@ -303,7 +305,7 @@ just a test"
         * @covers WikitextContent::matchMagicWord
         */
        public function testMatchMagicWord() {
-               $mw = MagicWord::get( "staticredirect" );
+               $mw = MediaWikiServices::getInstance()->getMagicWordFactory()->get( "staticredirect" );
 
                $content = $this->newContent( "#REDIRECT [[FOO]]\n__STATICREDIRECT__" );
                $this->assertTrue( $content->matchMagicWord( $mw ), "should have matched magic word" );
index 5cd55ba..de861b6 100644 (file)
@@ -580,6 +580,8 @@ class LBFactoryTest extends MediaWikiTestCase {
        }
 
        public function testInvalidSelectDB() {
+               // FIXME: fails under sqlite
+               $this->markTestSkippedIfDbType( 'sqlite' );
                $dbname = 'unittest-domain'; // explodes if DB is selected
                $factory = $this->newLBFactoryMulti(
                        [ 'localDomain' => ( new DatabaseDomain( $dbname, null, '' ) )->getId() ],
index 27e5861..2dd4ba1 100644 (file)
@@ -187,6 +187,9 @@ abstract class PageArchiveTestBase extends MediaWikiTestCase {
         * @covers PageArchive::listRevisions
         */
        public function testListRevisions() {
+               // FIXME: fails under postgres
+               $this->markTestSkippedIfDbType( 'postgres' );
+
                $revisions = $this->archivedPage->listRevisions();
                $this->assertEquals( 2, $revisions->numRows() );
 
index aaaa73b..5973d9e 100644 (file)
@@ -1051,6 +1051,9 @@ more stuff
         * @covers WikiPage::commitRollback
         */
        public function testDoRollback() {
+               // FIXME: fails under postgres
+               $this->markTestSkippedIfDbType( 'postgres' );
+
                $admin = $this->getTestSysop()->getUser();
                $user1 = $this->getTestUser()->getUser();
                // Use the confirmed group for user2 to make sure the user is different
@@ -1569,6 +1572,9 @@ more stuff
                $expectedSuccess,
                $expectedRowCount
        ) {
+               // FIXME: fails under sqlite and postgres
+               $this->markTestSkippedIfDbType( 'sqlite' );
+               $this->markTestSkippedIfDbType( 'postgres' );
                static $pageCounter = 0;
                $pageCounter++;
 
index a760908..aca88aa 100644 (file)
@@ -186,9 +186,26 @@ class ServiceContainerTest extends PHPUnit\Framework\TestCase {
 
                $services->applyWiring( $wiring );
 
+               $services->addServiceManipulator( 'Foo', function ( $service ) {
+                       return $service . '+X';
+               } );
+
+               $services->addServiceManipulator( 'Car', function ( $service ) {
+                       return $service . '+X';
+               } );
+
                $newServices = $this->newServiceContainer();
 
-               // define a service before importing, so we can later check that
+               // create a service with manipulator
+               $newServices->defineService( 'Foo', function () {
+                       return 'Foo!';
+               } );
+
+               $newServices->addServiceManipulator( 'Foo', function ( $service ) {
+                       return $service . '+Y';
+               } );
+
+               // create a service before importing, so we can later check that
                // existing service instances survive importWiring()
                $newServices->defineService( 'Car', function () {
                        return 'Car!';
@@ -207,7 +224,7 @@ class ServiceContainerTest extends PHPUnit\Framework\TestCase {
                $newServices->importWiring( $services, [ 'Bar' ] );
 
                $this->assertNotContains( 'Bar', $newServices->getServiceNames(), 'Skip `Bar` service' );
-               $this->assertSame( 'Foo!', $newServices->getService( 'Foo' ) );
+               $this->assertSame( 'Foo!+Y+X', $newServices->getService( 'Foo' ) );
 
                // import all wiring, but preserve existing service instance
                $newServices->importWiring( $services );
@@ -326,6 +343,73 @@ class ServiceContainerTest extends PHPUnit\Framework\TestCase {
                } );
        }
 
+       public function testAddServiceManipulator() {
+               $services = $this->newServiceContainer( [ 'Foo' ] );
+
+               $theService1 = new stdClass();
+               $theService2 = new stdClass();
+               $name = 'TestService92834576';
+
+               $services->defineService(
+                       $name,
+                       function ( $actualLocator, $extra ) use ( $services, $theService1 ) {
+                               PHPUnit_Framework_Assert::assertSame( $services, $actualLocator );
+                               PHPUnit_Framework_Assert::assertSame( 'Foo', $extra );
+                               return $theService1;
+                       }
+               );
+
+               $services->addServiceManipulator(
+                       $name,
+                       function (
+                               $theService, $actualLocator, $extra
+                       ) use (
+                               $services, $theService1, $theService2
+                       ) {
+                               PHPUnit_Framework_Assert::assertSame( $theService1, $theService );
+                               PHPUnit_Framework_Assert::assertSame( $services, $actualLocator );
+                               PHPUnit_Framework_Assert::assertSame( 'Foo', $extra );
+                               return $theService2;
+                       }
+               );
+
+               // force instantiation, check result
+               $this->assertSame( $theService2, $services->getService( $name ) );
+       }
+
+       public function testAddServiceManipulator_fail_undefined() {
+               $services = $this->newServiceContainer();
+
+               $theService = new stdClass();
+               $name = 'TestService92834576';
+
+               $this->setExpectedException( MediaWiki\Services\NoSuchServiceException::class );
+
+               $services->addServiceManipulator( $name, function () use ( $theService ) {
+                       return $theService;
+               } );
+       }
+
+       public function testAddServiceManipulator_fail_in_use() {
+               $services = $this->newServiceContainer( [ 'Foo' ] );
+
+               $theService = new stdClass();
+               $name = 'TestService92834576';
+
+               $services->defineService( $name, function () use ( $theService ) {
+                       return $theService;
+               } );
+
+               // create the service, so it can no longer be redefined
+               $services->getService( $name );
+
+               $this->setExpectedException( MediaWiki\Services\CannotReplaceActiveServiceException::class );
+
+               $services->addServiceManipulator( $name, function () {
+                       return 'Foo';
+               } );
+       }
+
        public function testDisableService() {
                $services = $this->newServiceContainer( [ 'Foo' ] );
 
index e7cfca7..9572e30 100644 (file)
@@ -73,6 +73,9 @@ class SpecialPageExecutor {
 
                $this->setEditTokenFromUser( $context );
 
+               // Make sure the skin context is correctly set https://phabricator.wikimedia.org/T200771
+               $context->getSkin()->setContext( $context );
+
                return $context;
        }
 
index 169a7c5..2ac91d5 100644 (file)
@@ -539,6 +539,9 @@ class UserTest extends MediaWikiTestCase {
         * @covers User::findUsersByGroup
         */
        public function testFindUsersByGroup() {
+               // FIXME: fails under postgres
+               $this->markTestSkippedIfDbType( 'postgres' );
+
                $users = User::findUsersByGroup( [] );
                $this->assertEquals( 0, iterator_count( $users ) );
 
index 19e93de..42569d7 100644 (file)
@@ -245,6 +245,9 @@ class DeleteAutoPatrolLogsTest extends MaintenanceBaseTestCase {
         * @dataProvider runProvider
         */
        public function testRun( $expected, $args ) {
+               // FIXME: fails under postgres
+               $this->markTestSkippedIfDbType( 'postgres' );
+
                $this->maintenance->loadWithArgv( $args );
 
                $this->maintenance->execute();
index aebd0bf..3b270b3 100644 (file)
@@ -13,9 +13,8 @@ class MediaWikiTestCaseSchema1Test extends MediaWikiTestCase {
 
        public function setUp() {
                parent::setUp();
-               if ( $this->db->getType() == 'postgres' ) {
-                       $this->markTestSkipped( __CLASS__ . ' does not support postgres' );
-               }
+               // FIXME: fails under postgres
+               $this->markTestSkippedIfDbType( 'postgres' );
        }
 
        public function getSchemaOverrides( IMaintainableDatabase $db ) {
index c0673a1..391eec7 100644 (file)
@@ -16,9 +16,8 @@ class MediaWikiTestCaseSchema2Test extends MediaWikiTestCase {
 
        public function setUp() {
                parent::setUp();
-               if ( $this->db->getType() == 'postgres' ) {
-                       $this->markTestSkipped( __CLASS__ . ' does not support postgres' );
-               }
+               // FIXME: fails under postgres
+               $this->markTestSkippedIfDbType( 'postgres' );
        }
 
        public function testMediaWikiTestCaseSchemaTestOrder() {
index b64d9f5..4884ded 100644 (file)
@@ -42,7 +42,8 @@ describe( 'User', function () {
                assert.strictEqual( UserLoginPage.userPage.getText(), username );
        } );
 
-       it( 'should be able to change preferences', function () {
+       // Disabled due to flakiness (T199446)
+       it.skip( 'should be able to change preferences', function () {
                var realName = Util.getTestString();
 
                // create