Merge "Delete autoload.ide.php"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sun, 12 Aug 2018 07:36:34 +0000 (07:36 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sun, 12 Aug 2018 07:36:34 +0000 (07:36 +0000)
236 files changed:
RELEASE-NOTES-1.32
autoload.php
includes/ActorMigration.php
includes/CategoryViewer.php
includes/CommentStore.php
includes/CommentStoreComment.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/Html.php
includes/Linker.php
includes/MWGrants.php
includes/MediaWiki.php
includes/MediaWikiServices.php
includes/Message.php
includes/OutputPage.php
includes/Preferences.php
includes/PrefixSearch.php
includes/Revision.php
includes/ServiceWiring.php
includes/Storage/DerivedPageDataUpdater.php
includes/TemplateParser.php
includes/Title.php
includes/WebRequest.php
includes/WebRequestUpload.php
includes/Xml.php
includes/actions/Action.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/actions/RevertAction.php
includes/api/ApiBase.php
includes/api/ApiHelp.php
includes/api/ApiMain.php
includes/api/ApiPageSet.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiResult.php
includes/api/i18n/ar.json
includes/api/i18n/ko.json
includes/api/i18n/ru.json
includes/api/i18n/zh-hant.json
includes/auth/AuthManager.php
includes/cache/HTMLFileCache.php
includes/cache/LinkBatch.php
includes/cache/MessageCache.php
includes/collation/Collation.php
includes/collation/IdentityCollation.php
includes/collation/NumericUppercaseCollation.php
includes/content/ContentHandler.php
includes/content/TextContent.php
includes/content/WikitextContent.php
includes/context/RequestContext.php
includes/db/DatabaseOracle.php
includes/deferred/LinksUpdate.php
includes/deferred/SearchUpdate.php
includes/diff/DifferenceEngine.php
includes/export/XmlDumpWriter.php
includes/filerepo/FileRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/file/ForeignAPIFile.php
includes/gallery/ImageGalleryBase.php
includes/gallery/TraditionalImageGallery.php
includes/htmlform/fields/HTMLTitleTextField.php
includes/import/WikiImporter.php
includes/installer/CliInstaller.php
includes/installer/MysqlUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerName.php
includes/installer/i18n/da.json
includes/installer/i18n/ia.json
includes/installer/i18n/sr-ec.json
includes/installer/i18n/tt-cyrl.json
includes/interwiki/ClassicInterwikiLookup.php
includes/jobqueue/jobs/ThumbnailRenderJob.php
includes/libs/JavaScriptMinifier.php
includes/libs/MapCacheLRU.php
includes/logging/LogFormatter.php
includes/logging/LogPage.php
includes/logging/ProtectLogFormatter.php
includes/logging/RightsLogFormatter.php
includes/mail/EmailNotification.php
includes/media/FormatMetadata.php
includes/media/SVGMetadataExtractor.php
includes/page/Article.php
includes/page/ImageHistoryList.php
includes/page/WikiPage.php
includes/parser/CoreParserFunctions.php
includes/parser/DateFormatter.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserFactory.php [new file with mode: 0644]
includes/parser/ParserOptions.php
includes/parser/Sanitizer.php
includes/password/PasswordPolicyChecks.php
includes/preferences/DefaultPreferencesFactory.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/search/SearchEngine.php
includes/search/SearchHighlighter.php
includes/search/SearchMssql.php
includes/search/SearchMySQL.php
includes/search/SearchOracle.php
includes/search/SearchSqlite.php
includes/session/SessionBackend.php
includes/skins/Skin.php
includes/skins/SkinTemplate.php
includes/specialpage/PageQueryPage.php
includes/specialpage/QueryPage.php
includes/specialpage/SpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialAncientpages.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialExport.php
includes/specials/SpecialFewestrevisions.php
includes/specials/SpecialFileDuplicateSearch.php
includes/specials/SpecialListgrouprights.php
includes/specials/SpecialLockdb.php
includes/specials/SpecialMIMEsearch.php
includes/specials/SpecialMostlinkedcategories.php
includes/specials/SpecialMyLanguage.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialRandompage.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUnwatchedpages.php
includes/specials/SpecialWantedcategories.php
includes/specials/formfields/Licenses.php
includes/specials/forms/UploadForm.php
includes/specials/pagers/AllMessagesTablePager.php
includes/title/NaiveForeignTitleFactory.php
includes/title/NaiveImportTitleFactory.php
includes/user/User.php
includes/widget/search/BasicSearchResultSetWidget.php
includes/widget/search/SearchFormWidget.php
languages/Language.php
languages/LanguageConverter.php
languages/data/Names.php
languages/i18n/ar.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/cs.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/fr.json
languages/i18n/frr.json
languages/i18n/gcr.json
languages/i18n/gl.json
languages/i18n/ha.json
languages/i18n/he.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/ja.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/mai.json
languages/i18n/mk.json
languages/i18n/mnw.json
languages/i18n/mr.json
languages/i18n/my.json
languages/i18n/nb.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/pl.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/ru.json
languages/i18n/sat.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sv.json
languages/i18n/te.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/uk.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesKo.php
languages/messages/MessagesMnw.php [new file with mode: 0644]
maintenance/benchmarks/benchmarkTidy.php
maintenance/cleanupCaps.php
maintenance/cleanupImages.php
maintenance/cleanupTitles.php
maintenance/cleanupWatchlist.php
maintenance/convertLinks.php
maintenance/deleteEqualMessages.php
maintenance/dumpTextPass.php
maintenance/generateSitemap.php
maintenance/importDump.php
maintenance/language/dumpMessages.php
maintenance/namespaceDupes.php
maintenance/orphans.php
maintenance/parse.php
maintenance/preprocessorFuzzTest.php
maintenance/rebuildImages.php
resources/src/jquery.tablesorter/jquery.tablesorter.js
resources/src/jquery/jquery.makeCollapsible.styles.less
resources/src/mediawiki.special.search.interwikiwidget.styles.less
resources/src/startup/mediawiki.js
tests/phpunit/MediaWikiLangTestCase.php
tests/phpunit/data/media/comma_separated_viewbox.svg [new file with mode: 0644]
tests/phpunit/includes/CommentStoreTest.php
tests/phpunit/includes/EditPageTest.php
tests/phpunit/includes/ExportTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/MediaWikiVersionFetcherTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/ServiceWiringTest.php [new file with mode: 0644]
tests/phpunit/includes/Storage/DerivedPageDataUpdaterTest.php
tests/phpunit/includes/TimeAdjustTest.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/auth/AuthManagerTest.php
tests/phpunit/includes/cache/MessageCacheTest.php
tests/phpunit/includes/content/TextContentTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/content/WikitextContentTest.php
tests/phpunit/includes/libs/JavaScriptMinifierTest.php
tests/phpunit/includes/media/SVGMetadataExtractorTest.php
tests/phpunit/includes/parser/ParserFactoryTest.php [new file with mode: 0644]
tests/phpunit/includes/parser/ParserOptionsTest.php
tests/phpunit/includes/parser/ParserPreloadTest.php
tests/phpunit/includes/parser/PreprocessorTest.php
tests/phpunit/includes/parser/TagHooksTest.php
tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php
tests/phpunit/includes/specialpage/SpecialPageFactoryTest.php
tests/phpunit/includes/specials/SpecialMyLanguageTest.php
tests/phpunit/languages/LanguageConverterTest.php
tests/phpunit/maintenance/backup_LogTest.php
tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js

index 495c0b1..92d7b9e 100644 (file)
@@ -151,6 +151,7 @@ because of Phabricator reports.
 * (T137491) Added language support for Standard Moroccan Amazigh (zgh).
 * (T198132) Added language support for Manipuri (mni).
 * (T201276) Added language support for Western Armenian (hyw).
+* (T201583) Added language support for Mon (mnw).
 
 === Breaking changes in 1.32 ===
 * $wgRequestTime, deprecated in 1.25, was removed. Use
index e02a743..feddcdd 100644 (file)
@@ -1078,6 +1078,7 @@ $wgAutoloadLocalClasses = [
        'Parser' => __DIR__ . '/includes/parser/Parser.php',
        'ParserCache' => __DIR__ . '/includes/parser/ParserCache.php',
        'ParserDiffTest' => __DIR__ . '/includes/parser/ParserDiffTest.php',
+       'ParserFactory' => __DIR__ . '/includes/parser/ParserFactory.php',
        'ParserOptions' => __DIR__ . '/includes/parser/ParserOptions.php',
        'ParserOutput' => __DIR__ . '/includes/parser/ParserOutput.php',
        'ParsoidVirtualRESTService' => __DIR__ . '/includes/libs/virtualrest/ParsoidVirtualRESTService.php',
index 161c7a9..51dfa60 100644 (file)
@@ -220,7 +220,7 @@ class ActorMigration {
         * @param UserIdentity $user User to set in the update
         * @return array with two values:
         *  - array to merge into `$values` to `IDatabase->update()` or `$a` to `IDatabase->insert()`
-        *  - callback to call with the the primary key for the main table insert
+        *  - callback to call with the primary key for the main table insert
         *    and extra fields needed for the temp table.
         */
        public function getInsertValuesWithTempTable( IDatabase $dbw, $key, UserIdentity $user ) {
index 79ab8b4..46a1473 100644 (file)
@@ -221,8 +221,6 @@ class CategoryViewer extends ContextSource {
         * @return string
         */
        function getSubcategorySortChar( $title, $sortkey ) {
-               global $wgContLang;
-
                if ( $title->getPrefixedText() == $sortkey ) {
                        $word = $title->getDBkey();
                } else {
@@ -231,7 +229,7 @@ class CategoryViewer extends ContextSource {
 
                $firstChar = $this->collation->getFirstLetter( $word );
 
-               return $wgContLang->convert( $firstChar );
+               return MediaWikiServices::getInstance()->getContentLanguage()->convert( $firstChar );
        }
 
        /**
@@ -242,7 +240,6 @@ class CategoryViewer extends ContextSource {
         * @param bool $isRedirect
         */
        function addImage( Title $title, $sortkey, $pageLength, $isRedirect = false ) {
-               global $wgContLang;
                if ( $this->showGallery ) {
                        $flip = $this->flip['file'];
                        if ( $flip ) {
@@ -253,8 +250,8 @@ class CategoryViewer extends ContextSource {
                } else {
                        $this->imgsNoGallery[] = $this->generateLink( 'image', $title, $isRedirect );
 
-                       $this->imgsNoGallery_start_char[] = $wgContLang->convert(
-                               $this->collation->getFirstLetter( $sortkey ) );
+                       $this->imgsNoGallery_start_char[] = MediaWikiServices::getInstance()->
+                               getContentLanguage()->convert( $this->collation->getFirstLetter( $sortkey ) );
                }
        }
 
@@ -266,12 +263,10 @@ class CategoryViewer extends ContextSource {
         * @param bool $isRedirect
         */
        function addPage( $title, $sortkey, $pageLength, $isRedirect = false ) {
-               global $wgContLang;
-
                $this->articles[] = $this->generateLink( 'page', $title, $isRedirect );
 
-               $this->articles_start_char[] = $wgContLang->convert(
-                       $this->collation->getFirstLetter( $sortkey ) );
+               $this->articles_start_char[] = MediaWikiServices::getInstance()->
+                       getContentLanguage()->convert( $this->collation->getFirstLetter( $sortkey ) );
        }
 
        function finaliseCategoryState() {
index d03a00e..bf3e3d6 100644 (file)
@@ -98,7 +98,7 @@ class CommentStore {
 
        /**
         * @param Language $lang Language to use for comment truncation. Defaults
-        *  to $wgContLang.
+        *  to content language.
         * @param int $migrationStage One of the MIGRATION_* constants
         */
        public function __construct( Language $lang, $migrationStage ) {
@@ -114,10 +114,11 @@ class CommentStore {
         * @return CommentStore
         */
        public static function newKey( $key ) {
-               global $wgCommentTableSchemaMigrationStage, $wgContLang;
+               global $wgCommentTableSchemaMigrationStage;
                // TODO uncomment once not used in extensions
                // wfDeprecated( __METHOD__, '1.31' );
-               $store = new CommentStore( $wgContLang, $wgCommentTableSchemaMigrationStage );
+               $store = new CommentStore( MediaWikiServices::getInstance()->getContentLanguage(),
+                       $wgCommentTableSchemaMigrationStage );
                $store->key = $key;
                return $store;
        }
index 7ed86d6..af866cd 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * CommentStoreComment represents a comment stored by CommentStore. The fields
@@ -63,8 +64,6 @@ class CommentStoreComment {
         * @return CommentStoreComment
         */
        public static function newUnsavedComment( $comment, array $data = null ) {
-               global $wgContLang;
-
                if ( $comment instanceof CommentStoreComment ) {
                        return $comment;
                }
@@ -79,7 +78,8 @@ class CommentStoreComment {
 
                if ( $comment instanceof Message ) {
                        $message = clone $comment;
-                       $text = $message->inLanguage( $wgContLang ) // Avoid $wgForceUIMsgAsContentMsg
+                       // Avoid $wgForceUIMsgAsContentMsg
+                       $text = $message->inLanguage( MediaWikiServices::getInstance()->getContentLanguage() )
                                ->setInterfaceMessageFlag( true )
                                ->text();
                        return new CommentStoreComment( null, $text, $message, $data );
index 5f9ce0b..7f209d4 100644 (file)
@@ -1171,8 +1171,6 @@ class EditPage {
         * @since 1.21
         */
        protected function getContentObject( $def_content = null ) {
-               global $wgContLang;
-
                $content = false;
 
                $user = $this->context->getUser();
@@ -1235,7 +1233,8 @@ class EditPage {
 
                                                if ( $undoMsg === null ) {
                                                        $oldContent = $this->page->getContent( Revision::RAW );
-                                                       $popts = ParserOptions::newFromUserAndLang( $user, $wgContLang );
+                                                       $popts = ParserOptions::newFromUserAndLang(
+                                                               $user, MediaWikiServices::getInstance()->getContentLanguage() );
                                                        $newContent = $content->preSaveTransform( $this->mTitle, $user, $popts );
                                                        if ( $newContent->getModel() !== $oldContent->getModel() ) {
                                                                // The undo may change content
@@ -3461,8 +3460,6 @@ ERROR;
         * save and then make a comparison.
         */
        public function showDiff() {
-               global $wgContLang;
-
                $oldtitlemsg = 'currentrev';
                # if message does not exist, show diff against the preloaded default
                if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI && !$this->mTitle->exists() ) {
@@ -3492,7 +3489,8 @@ ERROR;
                        Hooks::run( 'EditPageGetDiffContent', [ $this, &$newContent ] );
 
                        $user = $this->context->getUser();
-                       $popts = ParserOptions::newFromUserAndLang( $user, $wgContLang );
+                       $popts = ParserOptions::newFromUserAndLang( $user,
+                               MediaWikiServices::getInstance()->getContentLanguage() );
                        $newContent = $newContent->preSaveTransform( $this->mTitle, $user, $popts );
                }
 
@@ -3603,10 +3601,10 @@ ERROR;
         * Get the Limit report for page previews
         *
         * @since 1.22
-        * @param ParserOutput $output ParserOutput object from the parse
+        * @param ParserOutput|null $output ParserOutput object from the parse
         * @return string HTML
         */
-       public static function getPreviewLimitReport( $output ) {
+       public static function getPreviewLimitReport( ParserOutput $output = null ) {
                global $wgLang;
 
                if ( !$output || !$output->getLimitReportData() ) {
@@ -4047,8 +4045,7 @@ ERROR;
         * @return string
         */
        public static function getEditToolbar( $title = null ) {
-               global $wgContLang, $wgOut;
-               global $wgEnableUploads, $wgForeignFileRepos;
+               global $wgOut, $wgEnableUploads, $wgForeignFileRepos;
 
                $imagesAvailable = $wgEnableUploads || count( $wgForeignFileRepos );
                $showSignature = true;
@@ -4056,6 +4053,8 @@ ERROR;
                        $showSignature = MWNamespace::wantSignatures( $title->getNamespace() );
                }
 
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+
                /**
                 * $toolarray is an array of arrays each of which includes the
                 * opening tag, the closing tag, optionally a sample text that is
@@ -4103,14 +4102,14 @@ ERROR;
                        ],
                        $imagesAvailable ? [
                                'id'     => 'mw-editbutton-image',
-                               'open'   => '[[' . $wgContLang->getNsText( NS_FILE ) . ':',
+                               'open'   => '[[' . $contLang->getNsText( NS_FILE ) . ':',
                                'close'  => ']]',
                                'sample' => wfMessage( 'image_sample' )->text(),
                                'tip'    => wfMessage( 'image_tip' )->text(),
                        ] : false,
                        $imagesAvailable ? [
                                'id'     => 'mw-editbutton-media',
-                               'open'   => '[[' . $wgContLang->getNsText( NS_MEDIA ) . ':',
+                               'open'   => '[[' . $contLang->getNsText( NS_MEDIA ) . ':',
                                'close'  => ']]',
                                'sample' => wfMessage( 'media_sample' )->text(),
                                'tip'    => wfMessage( 'media_tip' )->text(),
index 4a09b9c..567db85 100644 (file)
@@ -1308,11 +1308,11 @@ function wfGetLangObj( $langcode = false ) {
                return $langcode;
        }
 
-       global $wgContLang, $wgLanguageCode;
+       global $wgLanguageCode;
        if ( $langcode === true || $langcode === $wgLanguageCode ) {
                # $langcode is the language code of the wikis content language object.
                # or it is a boolean and value is true
-               return $wgContLang;
+               return MediaWikiServices::getInstance()->getContentLanguage();
        }
 
        global $wgLang;
@@ -1330,7 +1330,7 @@ function wfGetLangObj( $langcode = false ) {
 
        # $langcode is a string, but not a valid language code; use content language.
        wfDebug( "Invalid language code passed to wfGetLangObj, falling back to content language.\n" );
-       return $wgContLang;
+       return MediaWikiServices::getInstance()->getContentLanguage();
 }
 
 /**
index ad0130b..32375c1 100644 (file)
@@ -22,6 +22,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * This class is a collection of static functions that serve two purposes:
@@ -824,8 +825,6 @@ class Html {
         * @return array
         */
        public static function namespaceSelectorOptions( array $params = [] ) {
-               global $wgContLang;
-
                $options = [];
 
                if ( !isset( $params['exclude'] ) || !is_array( $params['exclude'] ) ) {
@@ -838,7 +837,8 @@ class Html {
                        $options[$params['all']] = wfMessage( 'namespacesall' )->text();
                }
                // Add all namespaces as options (in the content language)
-               $options += $wgContLang->getFormattedNamespaces();
+               $options +=
+                       MediaWikiServices::getInstance()->getContentLanguage()->getFormattedNamespaces();
 
                $optionsOut = [];
                // Filter out namespaces below 0 and massage labels
@@ -851,7 +851,8 @@ class Html {
                                // main we don't use "" but the user message describing it (e.g. "(Main)" or "(Article)")
                                $nsName = wfMessage( 'blanknamespace' )->text();
                        } elseif ( is_int( $nsId ) ) {
-                               $nsName = $wgContLang->convertNamespace( $nsId );
+                               $nsName = MediaWikiServices::getInstance()->getContentLanguage()->
+                                       convertNamespace( $nsId );
                        }
                        $optionsOut[$nsId] = $nsName;
                }
index f160fd6..56e377d 100644 (file)
@@ -184,14 +184,13 @@ class Linker {
         * @return string
         */
        public static function getInvalidTitleDescription( IContextSource $context, $namespace, $title ) {
-               global $wgContLang;
-
                // First we check whether the namespace exists or not.
                if ( MWNamespace::exists( $namespace ) ) {
                        if ( $namespace == NS_MAIN ) {
                                $name = $context->msg( 'blanknamespace' )->text();
                        } else {
-                               $name = $wgContLang->getFormattedNsText( $namespace );
+                               $name = MediaWikiServices::getInstance()->getContentLanguage()->
+                                       getFormattedNsText( $namespace );
                        }
                        return $context->msg( 'invalidtitle-knownnamespace', $namespace, $name, $title )->text();
                } else {
@@ -1227,10 +1226,11 @@ class Linker {
                                ([^[]*) # 3. link trail (the text up until the next link)
                        /x',
                        function ( $match ) use ( $title, $local, $wikiId ) {
-                               global $wgContLang;
-
                                $medians = '(?:' . preg_quote( MWNamespace::getCanonicalName( NS_MEDIA ), '/' ) . '|';
-                               $medians .= preg_quote( $wgContLang->getNsText( NS_MEDIA ), '/' ) . '):';
+                               $medians .= preg_quote(
+                                       MediaWikiServices::getInstance()->getContentLanguage()->getNsText( NS_MEDIA ),
+                                       '/'
+                               ) . '):';
 
                                $comment = $match[0];
 
@@ -1264,7 +1264,11 @@ class Linker {
                                                $match[1] = substr( $match[1], 1 );
                                        }
                                        if ( $match[1] !== false && $match[1] !== '' ) {
-                                               if ( preg_match( $wgContLang->linkTrail(), $match[3], $submatch ) ) {
+                                               if ( preg_match(
+                                                       MediaWikiServices::getInstance()->getContentLanguage()->linkTrail(),
+                                                       $match[3],
+                                                       $submatch
+                                               ) ) {
                                                        $trail = $submatch[1];
                                                } else {
                                                        $trail = "";
@@ -1655,8 +1659,7 @@ class Linker {
         * @return array
         */
        static function splitTrail( $trail ) {
-               global $wgContLang;
-               $regex = $wgContLang->linkTrail();
+               $regex = MediaWikiServices::getInstance()->getContentLanguage()->linkTrail();
                $inside = '';
                if ( $trail !== '' ) {
                        $m = [];
index 769e5b4..3079c65 100644 (file)
@@ -193,12 +193,10 @@ class MWGrants {
         * @return string Wikitext
         */
        public static function getGrantsWikiText( $grantsFilter, $lang = null ) {
-               global $wgContLang;
-
                if ( is_string( $lang ) ) {
                        $lang = Language::factory( $lang );
                } elseif ( $lang === null ) {
-                       $lang = $wgContLang;
+                       $lang = MediaWikiServices::getInstance()->getContentLanguage();
                }
 
                $s = '';
index a67cb9b..3620047 100644 (file)
@@ -66,8 +66,6 @@ class MediaWiki {
         * @return Title Title object to be $wgTitle
         */
        private function parseTitle() {
-               global $wgContLang;
-
                $request = $this->context->getRequest();
                $curid = $request->getInt( 'curid' );
                $title = $request->getVal( 'title' );
@@ -88,12 +86,13 @@ class MediaWiki {
                        if ( !is_null( $ret ) && $ret->getNamespace() == NS_MEDIA ) {
                                $ret = Title::makeTitle( NS_FILE, $ret->getDBkey() );
                        }
+                       $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                        // Check variant links so that interwiki links don't have to worry
                        // about the possible different language variants
-                       if ( $wgContLang->hasVariants()
-                               && !is_null( $ret ) && $ret->getArticleID() == 0
+                       if (
+                               $contLang->hasVariants() && !is_null( $ret ) && $ret->getArticleID() == 0
                        ) {
-                               $wgContLang->findVariantLink( $title, $ret );
+                               $contLang->findVariantLink( $title, $ret );
                        }
                }
 
index fd9b472..79e55f8 100644 (file)
@@ -39,6 +39,7 @@ use MimeAnalyzer;
 use ObjectCache;
 use Parser;
 use ParserCache;
+use ParserFactory;
 use PasswordFactory;
 use ProxyLookup;
 use SearchEngine;
@@ -403,128 +404,117 @@ class MediaWikiServices extends ServiceContainer {
        // CONVENIENCE GETTERS ////////////////////////////////////////////////////
 
        /**
-        * Returns the Config object containing the bootstrap configuration.
-        * Bootstrap configuration would typically include database credentials
-        * and other information that may be needed before the ConfigFactory
-        * service can be instantiated.
-        *
-        * @note This should only be used during bootstrapping, in particular
-        * when creating the MainConfig service. Application logic should
-        * use getMainConfig() to get a Config instances.
-        *
-        * @since 1.27
-        * @return Config
+        * @since 1.31
+        * @return ActorMigration
         */
-       public function getBootstrapConfig() {
-               return $this->getService( 'BootstrapConfig' );
+       public function getActorMigration() {
+               return $this->getService( 'ActorMigration' );
        }
 
        /**
-        * @since 1.27
-        * @return ConfigFactory
+        * @since 1.31
+        * @return BlobStore
         */
-       public function getConfigFactory() {
-               return $this->getService( 'ConfigFactory' );
+       public function getBlobStore() {
+               return $this->getService( '_SqlBlobStore' );
        }
 
        /**
-        * Returns the Config object that provides configuration for MediaWiki core.
-        * This may or may not be the same object that is returned by getBootstrapConfig().
-        *
-        * @since 1.27
-        * @return Config
+        * @since 1.31
+        * @return BlobStoreFactory
         */
-       public function getMainConfig() {
-               return $this->getService( 'MainConfig' );
+       public function getBlobStoreFactory() {
+               return $this->getService( 'BlobStoreFactory' );
        }
 
        /**
+        * Returns the Config object containing the bootstrap configuration.
+        * Bootstrap configuration would typically include database credentials
+        * and other information that may be needed before the ConfigFactory
+        * service can be instantiated.
+        *
+        * @note This should only be used during bootstrapping, in particular
+        * when creating the MainConfig service. Application logic should
+        * use getMainConfig() to get a Config instances.
+        *
         * @since 1.27
-        * @return SiteLookup
+        * @return Config
         */
-       public function getSiteLookup() {
-               return $this->getService( 'SiteLookup' );
+       public function getBootstrapConfig() {
+               return $this->getService( 'BootstrapConfig' );
        }
 
        /**
-        * @since 1.27
-        * @return SiteStore
+        * @since 1.32
+        * @return NameTableStore
         */
-       public function getSiteStore() {
-               return $this->getService( 'SiteStore' );
+       public function getChangeTagDefStore() {
+               return $this->getService( 'ChangeTagDefStore' );
        }
 
        /**
-        * @since 1.28
-        * @return InterwikiLookup
+        * @since 1.31
+        * @return CommentStore
         */
-       public function getInterwikiLookup() {
-               return $this->getService( 'InterwikiLookup' );
+       public function getCommentStore() {
+               return $this->getService( 'CommentStore' );
        }
 
        /**
         * @since 1.27
-        * @return IBufferingStatsdDataFactory
+        * @return ConfigFactory
         */
-       public function getStatsdDataFactory() {
-               return $this->getService( 'StatsdDataFactory' );
+       public function getConfigFactory() {
+               return $this->getService( 'ConfigFactory' );
        }
 
        /**
         * @since 1.32
-        * @return IBufferingStatsdDataFactory
-        */
-       public function getPerDbNameStatsdDataFactory() {
-               return $this->getService( 'PerDbNameStatsdDataFactory' );
-       }
-
-       /**
-        * @since 1.27
-        * @return EventRelayerGroup
+        * @return ConfigRepository
         */
-       public function getEventRelayerGroup() {
-               return $this->getService( 'EventRelayerGroup' );
+       public function getConfigRepository() {
+               return $this->getService( 'ConfigRepository' );
        }
 
        /**
-        * @since 1.27
-        * @return SearchEngine
+        * @since 1.29
+        * @return \ConfiguredReadOnlyMode
         */
-       public function newSearchEngine() {
-               // New engine object every time, since they keep state
-               return $this->getService( 'SearchEngineFactory' )->create();
+       public function getConfiguredReadOnlyMode() {
+               return $this->getService( 'ConfiguredReadOnlyMode' );
        }
 
        /**
-        * @since 1.27
-        * @return SearchEngineFactory
+        * @since 1.32
+        * @return \Language
         */
-       public function getSearchEngineFactory() {
-               return $this->getService( 'SearchEngineFactory' );
+       public function getContentLanguage() {
+               return $this->getService( 'ContentLanguage' );
        }
 
        /**
-        * @since 1.27
-        * @return SearchEngineConfig
+        * @since 1.31
+        * @return NameTableStore
         */
-       public function getSearchEngineConfig() {
-               return $this->getService( 'SearchEngineConfig' );
+       public function getContentModelStore() {
+               return $this->getService( 'ContentModelStore' );
        }
 
        /**
-        * @since 1.27
-        * @return SkinFactory
+        * @since 1.28
+        * @return CryptHKDF
         */
-       public function getSkinFactory() {
-               return $this->getService( 'SkinFactory' );
+       public function getCryptHKDF() {
+               return $this->getService( 'CryptHKDF' );
        }
 
        /**
         * @since 1.28
-        * @return LBFactory
+        * @deprecated since 1.32, use random_bytes()/random_int()
+        * @return CryptRand
         */
-       public function getDBLoadBalancerFactory() {
-               return $this->getService( 'DBLoadBalancerFactory' );
+       public function getCryptRand() {
+               return $this->getService( 'CryptRand' );
        }
 
        /**
@@ -537,91 +527,69 @@ class MediaWikiServices extends ServiceContainer {
 
        /**
         * @since 1.28
-        * @return WatchedItemStoreInterface
-        */
-       public function getWatchedItemStore() {
-               return $this->getService( 'WatchedItemStore' );
-       }
-
-       /**
-        * @since 1.28
-        * @return WatchedItemQueryService
+        * @return LBFactory
         */
-       public function getWatchedItemQueryService() {
-               return $this->getService( 'WatchedItemQueryService' );
+       public function getDBLoadBalancerFactory() {
+               return $this->getService( 'DBLoadBalancerFactory' );
        }
 
        /**
-        * @since 1.28
-        * @deprecated since 1.32, use random_bytes()/random_int()
-        * @return CryptRand
+        * @since 1.27
+        * @return EventRelayerGroup
         */
-       public function getCryptRand() {
-               return $this->getService( 'CryptRand' );
+       public function getEventRelayerGroup() {
+               return $this->getService( 'EventRelayerGroup' );
        }
 
        /**
-        * @since 1.28
-        * @return CryptHKDF
+        * @since 1.31
+        * @return \ExternalStoreFactory
         */
-       public function getCryptHKDF() {
-               return $this->getService( 'CryptHKDF' );
+       public function getExternalStoreFactory() {
+               return $this->getService( 'ExternalStoreFactory' );
        }
 
        /**
         * @since 1.28
-        * @return MediaHandlerFactory
+        * @return GenderCache
         */
-       public function getMediaHandlerFactory() {
-               return $this->getService( 'MediaHandlerFactory' );
+       public function getGenderCache() {
+               return $this->getService( 'GenderCache' );
        }
 
        /**
-        * @since 1.28
-        * @return MimeAnalyzer
+        * @since 1.31
+        * @return HttpRequestFactory
         */
-       public function getMimeAnalyzer() {
-               return $this->getService( 'MimeAnalyzer' );
+       public function getHttpRequestFactory() {
+               return $this->getService( 'HttpRequestFactory' );
        }
 
        /**
         * @since 1.28
-        * @return ProxyLookup
-        */
-       public function getProxyLookup() {
-               return $this->getService( 'ProxyLookup' );
-       }
-
-       /**
-        * @since 1.29
-        * @return Parser
-        */
-       public function getParser() {
-               return $this->getService( 'Parser' );
-       }
-
-       /**
-        * @since 1.30
-        * @return ParserCache
+        * @return InterwikiLookup
         */
-       public function getParserCache() {
-               return $this->getService( 'ParserCache' );
+       public function getInterwikiLookup() {
+               return $this->getService( 'InterwikiLookup' );
        }
 
        /**
         * @since 1.28
-        * @return GenderCache
+        * @return LinkCache
         */
-       public function getGenderCache() {
-               return $this->getService( 'GenderCache' );
+       public function getLinkCache() {
+               return $this->getService( 'LinkCache' );
        }
 
        /**
+        * LinkRenderer instance that can be used
+        * if no custom options are needed
+        *
         * @since 1.28
-        * @return LinkCache
+        * @return LinkRenderer
         */
-       public function getLinkCache() {
-               return $this->getService( 'LinkCache' );
+       public function getLinkRenderer() {
+               return $this->getService( 'LinkRenderer' );
        }
 
        /**
@@ -633,30 +601,30 @@ class MediaWikiServices extends ServiceContainer {
        }
 
        /**
-        * LinkRenderer instance that can be used
-        * if no custom options are needed
-        *
         * @since 1.28
-        * @return LinkRenderer
+        * @return \BagOStuff
         */
-       public function getLinkRenderer() {
-               return $this->getService( 'LinkRenderer' );
+       public function getLocalServerObjectCache() {
+               return $this->getService( 'LocalServerObjectCache' );
        }
 
        /**
-        * @since 1.28
-        * @return TitleFormatter
+        * @since 1.32
+        * @return MagicWordFactory
         */
-       public function getTitleFormatter() {
-               return $this->getService( 'TitleFormatter' );
+       public function getMagicWordFactory() {
+               return $this->getService( 'MagicWordFactory' );
        }
 
        /**
-        * @since 1.28
-        * @return TitleParser
+        * Returns the Config object that provides configuration for MediaWiki core.
+        * This may or may not be the same object that is returned by getBootstrapConfig().
+        *
+        * @since 1.27
+        * @return Config
         */
-       public function getTitleParser() {
-               return $this->getService( 'TitleParser' );
+       public function getMainConfig() {
+               return $this->getService( 'MainConfig' );
        }
 
        /**
@@ -677,90 +645,106 @@ class MediaWikiServices extends ServiceContainer {
 
        /**
         * @since 1.28
-        * @return \BagOStuff
+        * @return MediaHandlerFactory
         */
-       public function getLocalServerObjectCache() {
-               return $this->getService( 'LocalServerObjectCache' );
+       public function getMediaHandlerFactory() {
+               return $this->getService( 'MediaHandlerFactory' );
        }
 
        /**
         * @since 1.28
-        * @return VirtualRESTServiceClient
+        * @return MimeAnalyzer
         */
-       public function getVirtualRESTServiceClient() {
-               return $this->getService( 'VirtualRESTServiceClient' );
+       public function getMimeAnalyzer() {
+               return $this->getService( 'MimeAnalyzer' );
        }
 
        /**
-        * @since 1.29
-        * @return \ConfiguredReadOnlyMode
+        * @since 1.32
+        * @return OldRevisionImporter
         */
-       public function getConfiguredReadOnlyMode() {
-               return $this->getService( 'ConfiguredReadOnlyMode' );
+       public function getOldRevisionImporter() {
+               return $this->getService( 'OldRevisionImporter' );
        }
 
        /**
         * @since 1.29
-        * @return \ReadOnlyMode
+        * @return Parser
         */
-       public function getReadOnlyMode() {
-               return $this->getService( 'ReadOnlyMode' );
+       public function getParser() {
+               return $this->getService( 'Parser' );
        }
 
        /**
-        * @since 1.31
-        * @return \UploadRevisionImporter
+        * @since 1.30
+        * @return ParserCache
         */
-       public function getWikiRevisionUploadImporter() {
-               return $this->getService( 'UploadRevisionImporter' );
+       public function getParserCache() {
+               return $this->getService( 'ParserCache' );
        }
 
        /**
-        * @since 1.31
-        * @return \OldRevisionImporter
+        * @since 1.32
+        * @return ParserFactory
         */
-       public function getWikiRevisionOldRevisionImporter() {
-               return $this->getService( 'OldRevisionImporter' );
+       public function getParserFactory() {
+               return $this->getService( 'ParserFactory' );
        }
 
        /**
-        * @since 1.31
-        * @return \OldRevisionImporter
+        * @since 1.32
+        * @return PasswordFactory
         */
-       public function getWikiRevisionOldRevisionImporterNoUpdates() {
-               return $this->getService( 'WikiRevisionOldRevisionImporterNoUpdates' );
+       public function getPasswordFactory() {
+               return $this->getService( 'PasswordFactory' );
        }
 
        /**
-        * @since 1.30
-        * @return CommandFactory
+        * @since 1.32
+        * @return IBufferingStatsdDataFactory
         */
-       public function getShellCommandFactory() {
-               return $this->getService( 'ShellCommandFactory' );
+       public function getPerDbNameStatsdDataFactory() {
+               return $this->getService( 'PerDbNameStatsdDataFactory' );
        }
 
        /**
         * @since 1.31
-        * @return \ExternalStoreFactory
+        * @return PreferencesFactory
         */
-       public function getExternalStoreFactory() {
-               return $this->getService( 'ExternalStoreFactory' );
+       public function getPreferencesFactory() {
+               return $this->getService( 'PreferencesFactory' );
+       }
+
+       /**
+        * @since 1.28
+        * @return ProxyLookup
+        */
+       public function getProxyLookup() {
+               return $this->getService( 'ProxyLookup' );
+       }
+
+       /**
+        * @since 1.29
+        * @return \ReadOnlyMode
+        */
+       public function getReadOnlyMode() {
+               return $this->getService( 'ReadOnlyMode' );
        }
 
        /**
         * @since 1.31
-        * @return BlobStoreFactory
+        * @return RevisionFactory
         */
-       public function getBlobStoreFactory() {
-               return $this->getService( 'BlobStoreFactory' );
+       public function getRevisionFactory() {
+               return $this->getService( 'RevisionFactory' );
        }
 
        /**
         * @since 1.31
-        * @return BlobStore
+        * @return RevisionLookup
         */
-       public function getBlobStore() {
-               return $this->getService( '_SqlBlobStore' );
+       public function getRevisionLookup() {
+               return $this->getService( 'RevisionLookup' );
        }
 
        /**
@@ -780,75 +764,92 @@ class MediaWikiServices extends ServiceContainer {
        }
 
        /**
-        * @since 1.31
-        * @return RevisionLookup
+        * @since 1.27
+        * @return SearchEngine
         */
-       public function getRevisionLookup() {
-               return $this->getService( 'RevisionLookup' );
+       public function newSearchEngine() {
+               // New engine object every time, since they keep state
+               return $this->getService( 'SearchEngineFactory' )->create();
        }
 
        /**
-        * @since 1.31
-        * @return RevisionFactory
+        * @since 1.27
+        * @return SearchEngineConfig
         */
-       public function getRevisionFactory() {
-               return $this->getService( 'RevisionFactory' );
+       public function getSearchEngineConfig() {
+               return $this->getService( 'SearchEngineConfig' );
        }
 
        /**
-        * @since 1.31
-        * @return NameTableStore
+        * @since 1.27
+        * @return SearchEngineFactory
         */
-       public function getContentModelStore() {
-               return $this->getService( 'ContentModelStore' );
+       public function getSearchEngineFactory() {
+               return $this->getService( 'SearchEngineFactory' );
        }
 
        /**
-        * @since 1.31
-        * @return NameTableStore
+        * @since 1.30
+        * @return CommandFactory
         */
-       public function getSlotRoleStore() {
-               return $this->getService( 'SlotRoleStore' );
+       public function getShellCommandFactory() {
+               return $this->getService( 'ShellCommandFactory' );
        }
 
        /**
-        * @since 1.32
-        * @return NameTableStore
+        * @since 1.27
+        * @return SiteLookup
         */
-       public function getChangeTagDefStore() {
-               return $this->getService( 'ChangeTagDefStore' );
+       public function getSiteLookup() {
+               return $this->getService( 'SiteLookup' );
        }
 
        /**
-        * @since 1.31
-        * @return PreferencesFactory
+        * @since 1.27
+        * @return SiteStore
         */
-       public function getPreferencesFactory() {
-               return $this->getService( 'PreferencesFactory' );
+       public function getSiteStore() {
+               return $this->getService( 'SiteStore' );
        }
 
        /**
-        * @since 1.31
-        * @return HttpRequestFactory
+        * @since 1.27
+        * @return SkinFactory
         */
-       public function getHttpRequestFactory() {
-               return $this->getService( 'HttpRequestFactory' );
+       public function getSkinFactory() {
+               return $this->getService( 'SkinFactory' );
        }
 
        /**
         * @since 1.31
-        * @return CommentStore
+        * @return NameTableStore
         */
-       public function getCommentStore() {
-               return $this->getService( 'CommentStore' );
+       public function getSlotRoleStore() {
+               return $this->getService( 'SlotRoleStore' );
        }
 
        /**
-        * @since 1.31
-        * @return ActorMigration
+        * @since 1.27
+        * @return IBufferingStatsdDataFactory
         */
-       public function getActorMigration() {
-               return $this->getService( 'ActorMigration' );
+       public function getStatsdDataFactory() {
+               return $this->getService( 'StatsdDataFactory' );
+       }
+
+       /**
+        * @since 1.28
+        * @return TitleFormatter
+        */
+       public function getTitleFormatter() {
+               return $this->getService( 'TitleFormatter' );
+       }
+
+       /**
+        * @since 1.28
+        * @return TitleParser
+        */
+       public function getTitleParser() {
+               return $this->getService( 'TitleParser' );
        }
 
        /**
@@ -860,43 +861,51 @@ class MediaWikiServices extends ServiceContainer {
        }
 
        /**
-        * @since 1.32
-        * @return OldRevisionImporter
+        * @since 1.28
+        * @return VirtualRESTServiceClient
         */
-       public function getOldRevisionImporter() {
-               return $this->getService( 'OldRevisionImporter' );
+       public function getVirtualRESTServiceClient() {
+               return $this->getService( 'VirtualRESTServiceClient' );
        }
 
        /**
-        * @since 1.32
-        * @return ConfigRepository
+        * @since 1.28
+        * @return WatchedItemQueryService
         */
-       public function getConfigRepository() {
-               return $this->getService( 'ConfigRepository' );
+       public function getWatchedItemQueryService() {
+               return $this->getService( 'WatchedItemQueryService' );
        }
 
        /**
-        * @since 1.32
-        * @return MagicWordFactory
+        * @since 1.28
+        * @return WatchedItemStoreInterface
         */
-       public function getMagicWordFactory() {
-               return $this->getService( 'MagicWordFactory' );
+       public function getWatchedItemStore() {
+               return $this->getService( 'WatchedItemStore' );
        }
 
        /**
-        * @since 1.32
-        * @return \Language
+        * @since 1.31
+        * @return \OldRevisionImporter
         */
-       public function getContentLanguage() {
-               return $this->getService( 'ContentLanguage' );
+       public function getWikiRevisionOldRevisionImporter() {
+               return $this->getService( 'OldRevisionImporter' );
        }
 
        /**
-        * @since 1.32
-        * @return PasswordFactory
+        * @since 1.31
+        * @return \OldRevisionImporter
         */
-       public function getPasswordFactory() {
-               return $this->getService( 'PasswordFactory' );
+       public function getWikiRevisionOldRevisionImporterNoUpdates() {
+               return $this->getService( 'WikiRevisionOldRevisionImporterNoUpdates' );
+       }
+
+       /**
+        * @since 1.31
+        * @return \UploadRevisionImporter
+        */
+       public function getWikiRevisionUploadImporter() {
+               return $this->getService( 'UploadRevisionImporter' );
        }
 
        ///////////////////////////////////////////////////////////////////////////
index 5ca0942..e2fe254 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @author Niklas Laxström
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * The Message class provides methods which fulfil two basic services:
@@ -469,18 +470,20 @@ class Message implements MessageSpecifier, Serializable {
         * @since 1.26
         */
        public function getTitle() {
-               global $wgContLang, $wgForceUIMsgAsContentMsg;
+               global $wgForceUIMsgAsContentMsg;
 
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                $title = $this->key;
                if (
-                       !$this->language->equals( $wgContLang )
+                       !$this->language->equals( $contLang )
                        && in_array( $this->key, (array)$wgForceUIMsgAsContentMsg )
                ) {
                        $code = $this->language->getCode();
                        $title .= '/' . $code;
                }
 
-               return Title::makeTitle( NS_MEDIAWIKI, $wgContLang->ucfirst( strtr( $title, ' ', '_' ) ) );
+               return Title::makeTitle(
+                       NS_MEDIAWIKI, $contLang->ucfirst( strtr( $title, ' ', '_' ) ) );
        }
 
        /**
@@ -766,8 +769,7 @@ class Message implements MessageSpecifier, Serializable {
                        return $this;
                }
 
-               global $wgContLang;
-               $this->inLanguage( $wgContLang );
+               $this->inLanguage( MediaWikiServices::getInstance()->getContentLanguage() );
                return $this;
        }
 
index 3b91331..f6d5dc9 100644 (file)
@@ -255,6 +255,11 @@ class OutputPage extends ContextSource {
 
        private $mIndexPolicy = 'index';
        private $mFollowPolicy = 'follow';
+
+       /**
+        * @var array Headers that cause the cache to vary.  Key is header name, value is an array of
+        * options for the Key header.
+        */
        private $mVaryHeader = [
                'Accept-Encoding' => [ 'match=gzip' ],
        ];
@@ -1240,8 +1245,6 @@ class OutputPage extends ContextSource {
         * @param array $categories Mapping category name => sort key
         */
        public function addCategoryLinks( array $categories ) {
-               global $wgContLang;
-
                if ( !$categories ) {
                        return;
                }
@@ -1265,7 +1268,8 @@ class OutputPage extends ContextSource {
                        'OutputPageMakeCategoryLinks',
                        [ &$outputPage, $categories, &$this->mCategoryLinks ] )
                ) {
-                       $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+                       $services = MediaWikiServices::getInstance();
+                       $linkRenderer = $services->getLinkRenderer();
                        foreach ( $categories as $category => $type ) {
                                // array keys will cast numeric category names to ints, so cast back to string
                                $category = (string)$category;
@@ -1274,11 +1278,11 @@ class OutputPage extends ContextSource {
                                if ( !$title ) {
                                        continue;
                                }
-                               $wgContLang->findVariantLink( $category, $title, true );
+                               $services->getContentLanguage()->findVariantLink( $category, $title, true );
                                if ( $category != $origcategory && array_key_exists( $category, $categories ) ) {
                                        continue;
                                }
-                               $text = $wgContLang->convertHtml( $title->getText() );
+                               $text = $services->getContentLanguage()->convertHtml( $title->getText() );
                                $this->mCategories[$type][] = $title->getText();
                                $this->mCategoryLinks[$type][] = $linkRenderer->makeLink( $title, new HtmlArmor( $text ) );
                        }
@@ -1749,7 +1753,7 @@ class OutputPage extends ContextSource {
         * @since 1.24
         * @param ParserOutput $parserOutput
         */
-       public function addParserOutputMetadata( $parserOutput ) {
+       public function addParserOutputMetadata( ParserOutput $parserOutput ) {
                $this->mLanguageLinks =
                        array_merge( $this->mLanguageLinks, $parserOutput->getLanguageLinks() );
                $this->addCategoryLinks( $parserOutput->getCategories() );
@@ -1787,7 +1791,7 @@ class OutputPage extends ContextSource {
                foreach ( $parserOutput->getOutputHooks() as $hookInfo ) {
                        list( $hookName, $data ) = $hookInfo;
                        if ( isset( $parserOutputHooks[$hookName] ) ) {
-                               call_user_func( $parserOutputHooks[$hookName], $this, $parserOutput, $data );
+                               $parserOutputHooks[$hookName]( $this, $parserOutput, $data );
                        }
                }
 
@@ -1826,7 +1830,7 @@ class OutputPage extends ContextSource {
         * @param ParserOutput $parserOutput
         * @param array $poOptions Options to ParserOutput::getText()
         */
-       public function addParserOutputContent( $parserOutput, $poOptions = [] ) {
+       public function addParserOutputContent( ParserOutput $parserOutput, $poOptions = [] ) {
                $this->addParserOutputText( $parserOutput, $poOptions );
 
                $this->addModules( $parserOutput->getModules() );
@@ -1843,7 +1847,7 @@ class OutputPage extends ContextSource {
         * @param ParserOutput $parserOutput
         * @param array $poOptions Options to ParserOutput::getText()
         */
-       public function addParserOutputText( $parserOutput, $poOptions = [] ) {
+       public function addParserOutputText( ParserOutput $parserOutput, $poOptions = [] ) {
                $text = $parserOutput->getText( $poOptions );
                // Avoid PHP 7.1 warning of passing $this by reference
                $outputPage = $this;
@@ -1857,7 +1861,7 @@ class OutputPage extends ContextSource {
         * @param ParserOutput $parserOutput
         * @param array $poOptions Options to ParserOutput::getText()
         */
-       function addParserOutput( $parserOutput, $poOptions = [] ) {
+       function addParserOutput( ParserOutput $parserOutput, $poOptions = [] ) {
                $this->addParserOutputMetadata( $parserOutput );
                $this->addParserOutputText( $parserOutput, $poOptions );
        }
@@ -1876,9 +1880,9 @@ class OutputPage extends ContextSource {
         *
         * @param string $text
         * @param bool $linestart Is this the start of a line?
-        * @param bool $interface Use interface language ($wgLang instead of
-        *   $wgContLang) while parsing language sensitive magic words like GRAMMAR and PLURAL.
-        *   This also disables LanguageConverter.
+        * @param bool $interface Use interface language (instead of content language) while parsing
+        *   language sensitive magic words like GRAMMAR and PLURAL.  This also disables
+        *   LanguageConverter.
         * @param Language|null $language Target language object, will override $interface
         * @throws MWException
         * @return string HTML
@@ -1920,9 +1924,8 @@ class OutputPage extends ContextSource {
         *
         * @param string $text
         * @param bool $linestart Is this the start of a line?
-        * @param bool $interface Use interface language ($wgLang instead of
-        *   $wgContLang) while parsing language sensitive magic
-        *   words like GRAMMAR and PLURAL
+        * @param bool $interface Use interface language (instead of content language) while parsing
+        *   language sensitive magic words like GRAMMAR and PLURAL
         * @return string HTML
         */
        public function parseInline( $text, $linestart = true, $interface = false ) {
@@ -1940,7 +1943,10 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Lower the value of the "s-maxage" part of the "Cache-control" HTTP header
+        * Set the value of the "s-maxage" part of the "Cache-control" HTTP header to $maxage if that is
+        * lower than the current s-maxage.  Either way, $maxage is now an upper limit on s-maxage, so
+        * that future calls to setCdnMaxage() will no longer be able to raise the s-maxage above
+        * $maxage.
         *
         * @param int $maxage Maximum cache time on the CDN, in seconds
         * @since 1.27
@@ -1958,9 +1964,10 @@ class OutputPage extends ContextSource {
         * TTL is 90% of the age of the object, subject to the min and max.
         *
         * @param string|int|float|bool|null $mtime Last-Modified timestamp
-        * @param int $minTTL Mimimum TTL in seconds [default: 1 minute]
+        * @param int $minTTL Minimum TTL in seconds [default: 1 minute]
         * @param int $maxTTL Maximum TTL in seconds [default: $wgSquidMaxage]
-        * @return int TTL in seconds
+        * @return int TTL in seconds passed to lowerCdnMaxage() (may not be the same as the new
+        *  s-maxage)
         * @since 1.28
         */
        public function adaptCdnTTL( $mtime, $minTTL = 0, $maxTTL = 0 ) {
@@ -1983,16 +1990,16 @@ class OutputPage extends ContextSource {
        /**
         * Use enableClientCache(false) to force it to send nocache headers
         *
-        * @param bool $state
+        * @param bool|null $state New value, or null to not set the value
         *
-        * @return bool
+        * @return bool Old value
         */
        public function enableClientCache( $state ) {
                return wfSetVar( $this->mEnableClientCache, $state );
        }
 
        /**
-        * Get the list of cookies that will influence on the cache
+        * Get the list of cookie names that will influence the cache
         *
         * @return array
         */
@@ -2045,7 +2052,8 @@ class OutputPage extends ContextSource {
                if ( !is_array( $option ) ) {
                        $option = [];
                }
-               $this->mVaryHeader[$header] = array_unique( array_merge( $this->mVaryHeader[$header], $option ) );
+               $this->mVaryHeader[$header] =
+                       array_unique( array_merge( $this->mVaryHeader[$header], $option ) );
        }
 
        /**
@@ -2120,14 +2128,13 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * T23672: Add Accept-Language to Vary and Key headers
-        * if there's no 'variant' parameter existed in GET.
+        * T23672: Add Accept-Language to Vary and Key headers if there's no 'variant' parameter in GET.
         *
         * For example:
-        *   /w/index.php?title=Main_page should always be served; but
-        *   /w/index.php?title=Main_page&variant=zh-cn should never be served.
+        *   /w/index.php?title=Main_page will vary based on Accept-Language; but
+        *   /w/index.php?title=Main_page&variant=zh-cn will not.
         */
-       function addAcceptLanguage() {
+       private function addAcceptLanguage() {
                $title = $this->getTitle();
                if ( !$title instanceof Title ) {
                        return;
@@ -2140,16 +2147,15 @@ class OutputPage extends ContextSource {
                        foreach ( $variants as $variant ) {
                                if ( $variant === $lang->getCode() ) {
                                        continue;
-                               } else {
-                                       $aloption[] = 'substr=' . $variant;
-
-                                       // IE and some other browsers use BCP 47 standards in
-                                       // their Accept-Language header, like "zh-CN" or "zh-Hant".
-                                       // We should handle these too.
-                                       $variantBCP47 = LanguageCode::bcp47( $variant );
-                                       if ( $variantBCP47 !== $variant ) {
-                                               $aloption[] = 'substr=' . $variantBCP47;
-                                       }
+                               }
+
+                               $aloption[] = "substr=$variant";
+
+                               // IE and some other browsers use BCP 47 standards in their Accept-Language header,
+                               // like "zh-CN" or "zh-Hant".  We should handle these too.
+                               $variantBCP47 = LanguageCode::bcp47( $variant );
+                               if ( $variantBCP47 !== $variant ) {
+                                       $aloption[] = "substr=$variantBCP47";
                                }
                        }
                        $this->addVaryHeader( 'Accept-Language', $aloption );
@@ -2307,8 +2313,6 @@ class OutputPage extends ContextSource {
         * @throws MWException
         */
        public function output( $return = false ) {
-               global $wgContLang;
-
                if ( $this->mDoNothing ) {
                        return $return ? '' : null;
                }
@@ -2355,7 +2359,8 @@ class OutputPage extends ContextSource {
                ob_start();
 
                $response->header( 'Content-type: ' . $config->get( 'MimeType' ) . '; charset=UTF-8' );
-               $response->header( 'Content-language: ' . $wgContLang->getHtmlCode() );
+               $response->header( 'Content-language: ' .
+                       MediaWikiServices::getInstance()->getContentLanguage()->getHtmlCode() );
 
                if ( !$this->mArticleBodyOnly ) {
                        $sk = $this->getSkin();
@@ -2751,7 +2756,7 @@ class OutputPage extends ContextSource {
                                $this->rlClientContext = new DerivativeResourceLoaderContext( $this->rlClientContext );
                                $this->rlClientContext->setContentOverrideCallback( function ( Title $title ) {
                                        foreach ( $this->contentOverrideCallbacks as $callback ) {
-                                               $content = call_user_func( $callback, $title );
+                                               $content = $callback( $title );
                                                if ( $content !== null ) {
                                                        return $content;
                                                }
@@ -2853,10 +2858,8 @@ class OutputPage extends ContextSource {
         * @return string The doctype, opening "<html>", and head element.
         */
        public function headElement( Skin $sk, $includeStyle = true ) {
-               global $wgContLang;
-
                $userdir = $this->getLanguage()->getDir();
-               $sitedir = $wgContLang->getDir();
+               $sitedir = MediaWikiServices::getInstance()->getContentLanguage()->getDir();
 
                $pieces = [];
                $pieces[] = Html::htmlHeader( Sanitizer::mergeAttributes(
@@ -3054,8 +3057,6 @@ class OutputPage extends ContextSource {
         * @return array
         */
        public function getJSVars() {
-               global $wgContLang;
-
                $curRevisionId = 0;
                $articleId = 0;
                $canonicalSpecialPageName = false; # T23115
@@ -3139,8 +3140,9 @@ class OutputPage extends ContextSource {
                        $vars['wgUserNewMsgRevisionId'] = $user->getNewMessageRevisionId();
                }
 
-               if ( $wgContLang->hasVariants() ) {
-                       $vars['wgUserVariant'] = $wgContLang->getPreferredVariant();
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+               if ( $contLang->hasVariants() ) {
+                       $vars['wgUserVariant'] = $contLang->getPreferredVariant();
                }
                // Same test as SkinTemplate
                $vars['wgIsProbablyEditable'] = $title->quickUserCan( 'edit', $user )
index a8a312c..d66da93 100644 (file)
@@ -35,12 +35,12 @@ class Preferences {
         * @return DefaultPreferencesFactory
         */
        protected static function getDefaultPreferencesFactory() {
-               global $wgContLang;
                $authManager = AuthManager::singleton();
                $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                $config = MediaWikiServices::getInstance()->getMainConfig();
                $preferencesFactory = new DefaultPreferencesFactory(
-                       $config, $wgContLang, $authManager, $linkRenderer
+                       $config, MediaWikiServices::getInstance()->getContentLanguage(), $authManager,
+                       $linkRenderer
                );
                return $preferencesFactory;
        }
index 63a4d9c..e32b439 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Handles searching prefixes of titles and finding any page
  * names that match. Used largely by the OpenSearch implementation.
@@ -81,9 +83,8 @@ abstract class PrefixSearch {
                // if the content language has variants, try to retrieve fallback results
                $fallbackLimit = $limit - count( $searches );
                if ( $fallbackLimit > 0 ) {
-                       global $wgContLang;
-
-                       $fallbackSearches = $wgContLang->autoConvertToAllVariants( $search );
+                       $fallbackSearches = MediaWikiServices::getInstance()->getContentLanguage()->
+                               autoConvertToAllVariants( $search );
                        $fallbackSearches = array_diff( array_unique( $fallbackSearches ), [ $search ] );
 
                        foreach ( $fallbackSearches as $fbs ) {
@@ -167,8 +168,6 @@ abstract class PrefixSearch {
         * @return array
         */
        protected function specialSearch( $search, $limit, $offset ) {
-               global $wgContLang;
-
                $searchParts = explode( '/', $search, 2 );
                $searchKey = $searchParts[0];
                $subpageSearch = $searchParts[1] ?? null;
@@ -192,23 +191,24 @@ abstract class PrefixSearch {
                }
 
                # normalize searchKey, so aliases with spaces can be found - T27675
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                $searchKey = str_replace( ' ', '_', $searchKey );
-               $searchKey = $wgContLang->caseFold( $searchKey );
+               $searchKey = $contLang->caseFold( $searchKey );
 
                // Unlike SpecialPage itself, we want the canonical forms of both
                // canonical and alias title forms...
                $keys = [];
                foreach ( SpecialPageFactory::getNames() as $page ) {
-                       $keys[$wgContLang->caseFold( $page )] = [ 'page' => $page, 'rank' => 0 ];
+                       $keys[$contLang->caseFold( $page )] = [ 'page' => $page, 'rank' => 0 ];
                }
 
-               foreach ( $wgContLang->getSpecialPageAliases() as $page => $aliases ) {
+               foreach ( $contLang->getSpecialPageAliases() as $page => $aliases ) {
                        if ( !in_array( $page, SpecialPageFactory::getNames() ) ) {# T22885
                                continue;
                        }
 
                        foreach ( $aliases as $key => $alias ) {
-                               $keys[$wgContLang->caseFold( $alias )] = [ 'page' => $alias, 'rank' => $key ];
+                               $keys[$contLang->caseFold( $alias )] = [ 'page' => $alias, 'rank' => $key ];
                        }
                }
                ksort( $keys );
@@ -307,10 +307,8 @@ abstract class PrefixSearch {
         * @return array (default: contains only NS_MAIN)
         */
        protected function validateNamespaces( $namespaces ) {
-               global $wgContLang;
-
-               // We will look at each given namespace against wgContLang namespaces
-               $validNamespaces = $wgContLang->getNamespaces();
+               // We will look at each given namespace against content language namespaces
+               $validNamespaces = MediaWikiServices::getInstance()->getContentLanguage()->getNamespaces();
                if ( is_array( $namespaces ) && count( $namespaces ) > 0 ) {
                        $valid = [];
                        foreach ( $namespaces as $ns ) {
index 7ff73dd..6d684a8 100644 (file)
@@ -1013,7 +1013,7 @@ class Revision implements IDBAccessObject {
         * @param stdClass $row The text data
         * @param string $prefix Table prefix (default 'old_')
         * @param string|bool $wiki The name of the wiki to load the revision text from
-        *   (same as the the wiki $row was loaded from) or false to indicate the local
+        *   (same as the wiki $row was loaded from) or false to indicate the local
         *   wiki (this is the default). Otherwise, it must be a symbolic wiki database
         *   identifier as understood by the LoadBalancer class.
         * @return string|false Text the text requested or false on failure
index 671544e..e5ebe2d 100644 (file)
 use MediaWiki\Auth\AuthManager;
 use MediaWiki\Config\ConfigRepository;
 use MediaWiki\Interwiki\ClassicInterwikiLookup;
+use MediaWiki\Interwiki\InterwikiLookup;
+use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\Linker\LinkRendererFactory;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Preferences\PreferencesFactory;
 use MediaWiki\Preferences\DefaultPreferencesFactory;
 use MediaWiki\Shell\CommandFactory;
+use MediaWiki\Storage\BlobStore;
 use MediaWiki\Storage\BlobStoreFactory;
 use MediaWiki\Storage\NameTableStore;
+use MediaWiki\Storage\RevisionFactory;
+use MediaWiki\Storage\RevisionLookup;
+use MediaWiki\Storage\RevisionStore;
 use MediaWiki\Storage\RevisionStoreFactory;
-use Wikimedia\ObjectFactory;
+use MediaWiki\Storage\SqlBlobStore;
 
 return [
-       'DBLoadBalancerFactory' => function ( MediaWikiServices $services ) {
-               $mainConfig = $services->getMainConfig();
-
-               $lbConf = MWLBFactory::applyDefaultConfig(
-                       $mainConfig->get( 'LBFactoryConf' ),
-                       $mainConfig,
-                       $services->getConfiguredReadOnlyMode()
+       'ActorMigration' => function ( MediaWikiServices $services ) : ActorMigration {
+               return new ActorMigration(
+                       $services->getMainConfig()->get( 'ActorTableSchemaMigrationStage' )
                );
-               $class = MWLBFactory::getLBFactoryClass( $lbConf );
-
-               $instance = new $class( $lbConf );
-               MWLBFactory::setSchemaAliases( $instance, $mainConfig );
-
-               return $instance;
        },
 
-       'DBLoadBalancer' => function ( MediaWikiServices $services ) {
-               // just return the default LB from the DBLoadBalancerFactory service
-               return $services->getDBLoadBalancerFactory()->getMainLB();
+       'BlobStore' => function ( MediaWikiServices $services ) : BlobStore {
+               return $services->getService( '_SqlBlobStore' );
        },
 
-       'SiteStore' => function ( MediaWikiServices $services ) {
-               $rawSiteStore = new DBSiteStore( $services->getDBLoadBalancer() );
-
-               // TODO: replace wfGetCache with a CacheFactory service.
-               // TODO: replace wfIsHHVM with a capabilities service.
-               $cache = wfGetCache( wfIsHHVM() ? CACHE_ACCEL : CACHE_ANYTHING );
-
-               return new CachingSiteStore( $rawSiteStore, $cache );
+       'BlobStoreFactory' => function ( MediaWikiServices $services ) : BlobStoreFactory {
+               return new BlobStoreFactory(
+                       $services->getDBLoadBalancer(),
+                       $services->getMainWANObjectCache(),
+                       $services->getMainConfig(),
+                       $services->getContentLanguage()
+               );
        },
 
-       'SiteLookup' => function ( MediaWikiServices $services ) {
-               $cacheFile = $services->getMainConfig()->get( 'SitesCacheFile' );
+       'ChangeTagDefStore' => function ( MediaWikiServices $services ) : NameTableStore {
+               return new NameTableStore(
+                       $services->getDBLoadBalancer(),
+                       $services->getMainWANObjectCache(),
+                       LoggerFactory::getInstance( 'NameTableSqlStore' ),
+                       'change_tag_def',
+                       'ctd_id',
+                       'ctd_name',
+                       null,
+                       false,
+                       function ( $insertFields ) {
+                               $insertFields['ctd_user_defined'] = 0;
+                               $insertFields['ctd_count'] = 0;
+                               return $insertFields;
+                       }
+               );
+       },
 
-               if ( $cacheFile !== false ) {
-                       return new FileBasedSiteLookup( $cacheFile );
-               } else {
-                       // Use the default SiteStore as the SiteLookup implementation for now
-                       return $services->getSiteStore();
-               }
+       'CommentStore' => function ( MediaWikiServices $services ) : CommentStore {
+               return new CommentStore(
+                       $services->getContentLanguage(),
+                       $services->getMainConfig()->get( 'CommentTableSchemaMigrationStage' )
+               );
        },
 
-       'ConfigFactory' => function ( MediaWikiServices $services ) {
+       'ConfigFactory' => function ( MediaWikiServices $services ) : ConfigFactory {
                // Use the bootstrap config to initialize the ConfigFactory.
                $registry = $services->getBootstrapConfig()->get( 'ConfigRegistry' );
                $factory = new ConfigFactory();
@@ -104,133 +113,192 @@ return [
                return $factory;
        },
 
-       'ConfigRepository' => function ( MediaWikiServices $services ) {
+       'ConfigRepository' => function ( MediaWikiServices $services ) : ConfigRepository {
                return new ConfigRepository( $services->getConfigFactory() );
        },
 
-       'MainConfig' => function ( MediaWikiServices $services ) {
-               // Use the 'main' config from the ConfigFactory service.
-               return $services->getConfigFactory()->makeConfig( 'main' );
+       'ConfiguredReadOnlyMode' => function ( MediaWikiServices $services ) : ConfiguredReadOnlyMode {
+               return new ConfiguredReadOnlyMode( $services->getMainConfig() );
        },
 
-       'InterwikiLookup' => function ( MediaWikiServices $services ) {
-               $config = $services->getMainConfig();
-               return new ClassicInterwikiLookup(
-                       $services->getContentLanguage(),
+       'ContentLanguage' => function ( MediaWikiServices $services ) : Language {
+               return Language::factory( $services->getMainConfig()->get( 'LanguageCode' ) );
+       },
+
+       'ContentModelStore' => function ( MediaWikiServices $services ) : NameTableStore {
+               return new NameTableStore(
+                       $services->getDBLoadBalancer(),
                        $services->getMainWANObjectCache(),
-                       $config->get( 'InterwikiExpiry' ),
-                       $config->get( 'InterwikiCache' ),
-                       $config->get( 'InterwikiScopes' ),
-                       $config->get( 'InterwikiFallbackSite' )
+                       LoggerFactory::getInstance( 'NameTableSqlStore' ),
+                       'content_models',
+                       'model_id',
+                       'model_name'
+                       /**
+                        * No strtolower normalization is added to the service as there are examples of
+                        * extensions that do not stick to this assumption.
+                        * - extensions/examples/DataPages define( 'CONTENT_MODEL_XML_DATA','XML_DATA' );
+                        * - extensions/Scribunto define( 'CONTENT_MODEL_SCRIBUNTO', 'Scribunto' );
+                        */
                );
        },
 
-       'StatsdDataFactory' => function ( MediaWikiServices $services ) {
-               return new BufferingStatsdDataFactory(
-                       rtrim( $services->getMainConfig()->get( 'StatsdMetricPrefix' ), '.' )
+       'CryptHKDF' => function ( MediaWikiServices $services ) : CryptHKDF {
+               $config = $services->getMainConfig();
+
+               $secret = $config->get( 'HKDFSecret' ) ?: $config->get( 'SecretKey' );
+               if ( !$secret ) {
+                       throw new RuntimeException( "Cannot use MWCryptHKDF without a secret." );
+               }
+
+               // In HKDF, the context can be known to the attacker, but this will
+               // keep simultaneous runs from producing the same output.
+               $context = [ microtime(), getmypid(), gethostname() ];
+
+               // Setup salt cache. Use APC, or fallback to the main cache if it isn't setup
+               $cache = $services->getLocalServerObjectCache();
+               if ( $cache instanceof EmptyBagOStuff ) {
+                       $cache = ObjectCache::getLocalClusterInstance();
+               }
+
+               return new CryptHKDF( $secret, $config->get( 'HKDFAlgorithm' ), $cache, $context );
+       },
+
+       'CryptRand' => function () : CryptRand {
+               return new CryptRand();
+       },
+
+       'DBLoadBalancer' => function ( MediaWikiServices $services ) : Wikimedia\Rdbms\LoadBalancer {
+               // just return the default LB from the DBLoadBalancerFactory service
+               return $services->getDBLoadBalancerFactory()->getMainLB();
+       },
+
+       'DBLoadBalancerFactory' =>
+       function ( MediaWikiServices $services ) : Wikimedia\Rdbms\LBFactory {
+               $mainConfig = $services->getMainConfig();
+
+               $lbConf = MWLBFactory::applyDefaultConfig(
+                       $mainConfig->get( 'LBFactoryConf' ),
+                       $mainConfig,
+                       $services->getConfiguredReadOnlyMode()
                );
+               $class = MWLBFactory::getLBFactoryClass( $lbConf );
+
+               $instance = new $class( $lbConf );
+               MWLBFactory::setSchemaAliases( $instance, $mainConfig );
+
+               return $instance;
+       },
+
+       'EventRelayerGroup' => function ( MediaWikiServices $services ) : EventRelayerGroup {
+               return new EventRelayerGroup( $services->getMainConfig()->get( 'EventRelayerConfig' ) );
        },
 
-       'PerDbNameStatsdDataFactory' => function ( MediaWikiServices $services ) {
+       'ExternalStoreFactory' => function ( MediaWikiServices $services ) : ExternalStoreFactory {
                $config = $services->getMainConfig();
-               $wiki = $config->get( 'DBname' );
-               return new BufferingStatsdDataFactory(
-                       rtrim( $services->getMainConfig()->get( 'StatsdMetricPrefix' ), '.' ) . '.' . $wiki
+
+               return new ExternalStoreFactory(
+                       $config->get( 'ExternalStores' )
                );
        },
 
-       'EventRelayerGroup' => function ( MediaWikiServices $services ) {
-               return new EventRelayerGroup( $services->getMainConfig()->get( 'EventRelayerConfig' ) );
+       'GenderCache' => function ( MediaWikiServices $services ) : GenderCache {
+               return new GenderCache();
        },
 
-       'SearchEngineFactory' => function ( MediaWikiServices $services ) {
-               return new SearchEngineFactory( $services->getSearchEngineConfig() );
+       'HttpRequestFactory' =>
+       function ( MediaWikiServices $services ) : \MediaWiki\Http\HttpRequestFactory {
+               return new \MediaWiki\Http\HttpRequestFactory();
        },
 
-       'SearchEngineConfig' => function ( MediaWikiServices $services ) {
-               return new SearchEngineConfig( $services->getMainConfig(),
-                       $services->getContentLanguage() );
+       'InterwikiLookup' => function ( MediaWikiServices $services ) : InterwikiLookup {
+               $config = $services->getMainConfig();
+               return new ClassicInterwikiLookup(
+                       $services->getContentLanguage(),
+                       $services->getMainWANObjectCache(),
+                       $config->get( 'InterwikiExpiry' ),
+                       $config->get( 'InterwikiCache' ),
+                       $config->get( 'InterwikiScopes' ),
+                       $config->get( 'InterwikiFallbackSite' )
+               );
        },
 
-       'SkinFactory' => function ( MediaWikiServices $services ) {
-               $factory = new SkinFactory();
+       'LinkCache' => function ( MediaWikiServices $services ) : LinkCache {
+               return new LinkCache(
+                       $services->getTitleFormatter(),
+                       $services->getMainWANObjectCache()
+               );
+       },
 
-               $names = $services->getMainConfig()->get( 'ValidSkinNames' );
+       'LinkRenderer' => function ( MediaWikiServices $services ) : LinkRenderer {
+               global $wgUser;
 
-               foreach ( $names as $name => $skin ) {
-                       $factory->register( $name, $skin, function () use ( $name, $skin ) {
-                               $class = "Skin$skin";
-                               return new $class( $name );
-                       } );
+               if ( defined( 'MW_NO_SESSION' ) ) {
+                       return $services->getLinkRendererFactory()->create();
+               } else {
+                       return $services->getLinkRendererFactory()->createForUser( $wgUser );
                }
-               // Register a hidden "fallback" skin
-               $factory->register( 'fallback', 'Fallback', function () {
-                       return new SkinFallback;
-               } );
-               // Register a hidden skin for api output
-               $factory->register( 'apioutput', 'ApiOutput', function () {
-                       return new SkinApi;
-               } );
-
-               return $factory;
        },
 
-       'WatchedItemStore' => function ( MediaWikiServices $services ) {
-               $store = new WatchedItemStore(
-                       $services->getDBLoadBalancer(),
-                       new HashBagOStuff( [ 'maxKeys' => 100 ] ),
-                       $services->getReadOnlyMode(),
-                       $services->getMainConfig()->get( 'UpdateRowsPerQuery' )
+       'LinkRendererFactory' => function ( MediaWikiServices $services ) : LinkRendererFactory {
+               return new LinkRendererFactory(
+                       $services->getTitleFormatter(),
+                       $services->getLinkCache()
                );
-               $store->setStatsdDataFactory( $services->getStatsdDataFactory() );
-
-               if ( $services->getMainConfig()->get( 'ReadOnlyWatchedItemStore' ) ) {
-                       $store = new NoWriteWatchedItemStore( $store );
-               }
+       },
 
-               return $store;
+       'LocalServerObjectCache' => function ( MediaWikiServices $services ) : BagOStuff {
+               $cacheId = \ObjectCache::detectLocalServerCache();
+               return \ObjectCache::newFromId( $cacheId );
        },
 
-       'WatchedItemQueryService' => function ( MediaWikiServices $services ) {
-               return new WatchedItemQueryService(
-                       $services->getDBLoadBalancer(),
-                       $services->getCommentStore(),
-                       $services->getActorMigration()
-               );
+       'MagicWordFactory' => function ( MediaWikiServices $services ) : MagicWordFactory {
+               return new MagicWordFactory( $services->getContentLanguage() );
        },
 
-       'CryptRand' => function () {
-               return new CryptRand();
+       'MainConfig' => function ( MediaWikiServices $services ) : Config {
+               // Use the 'main' config from the ConfigFactory service.
+               return $services->getConfigFactory()->makeConfig( 'main' );
        },
 
-       'CryptHKDF' => function ( MediaWikiServices $services ) {
-               $config = $services->getMainConfig();
+       'MainObjectStash' => function ( MediaWikiServices $services ) : BagOStuff {
+               $mainConfig = $services->getMainConfig();
 
-               $secret = $config->get( 'HKDFSecret' ) ?: $config->get( 'SecretKey' );
-               if ( !$secret ) {
-                       throw new RuntimeException( "Cannot use MWCryptHKDF without a secret." );
+               $id = $mainConfig->get( 'MainStash' );
+               if ( !isset( $mainConfig->get( 'ObjectCaches' )[$id] ) ) {
+                       throw new UnexpectedValueException(
+                               "Cache type \"$id\" is not present in \$wgObjectCaches." );
                }
 
-               // In HKDF, the context can be known to the attacker, but this will
-               // keep simultaneous runs from producing the same output.
-               $context = [ microtime(), getmypid(), gethostname() ];
+               return \ObjectCache::newFromParams( $mainConfig->get( 'ObjectCaches' )[$id] );
+       },
 
-               // Setup salt cache. Use APC, or fallback to the main cache if it isn't setup
-               $cache = $services->getLocalServerObjectCache();
-               if ( $cache instanceof EmptyBagOStuff ) {
-                       $cache = ObjectCache::getLocalClusterInstance();
+       'MainWANObjectCache' => function ( MediaWikiServices $services ) : WANObjectCache {
+               $mainConfig = $services->getMainConfig();
+
+               $id = $mainConfig->get( 'MainWANCache' );
+               if ( !isset( $mainConfig->get( 'WANObjectCaches' )[$id] ) ) {
+                       throw new UnexpectedValueException(
+                               "WAN cache type \"$id\" is not present in \$wgWANObjectCaches." );
                }
 
-               return new CryptHKDF( $secret, $config->get( 'HKDFAlgorithm' ), $cache, $context );
+               $params = $mainConfig->get( 'WANObjectCaches' )[$id];
+               $objectCacheId = $params['cacheId'];
+               if ( !isset( $mainConfig->get( 'ObjectCaches' )[$objectCacheId] ) ) {
+                       throw new UnexpectedValueException(
+                               "Cache type \"$objectCacheId\" is not present in \$wgObjectCaches." );
+               }
+               $params['store'] = $mainConfig->get( 'ObjectCaches' )[$objectCacheId];
+
+               return \ObjectCache::newWANCacheFromParams( $params );
        },
 
-       'MediaHandlerFactory' => function ( MediaWikiServices $services ) {
+       'MediaHandlerFactory' => function ( MediaWikiServices $services ) : MediaHandlerFactory {
                return new MediaHandlerFactory(
                        $services->getMainConfig()->get( 'MediaHandlers' )
                );
        },
 
-       'MimeAnalyzer' => function ( MediaWikiServices $services ) {
+       'MimeAnalyzer' => function ( MediaWikiServices $services ) : MimeAnalyzer {
                $logger = LoggerFactory::getInstance( 'Mime' );
                $mainConfig = $services->getMainConfig();
                $params = [
@@ -289,21 +357,19 @@ return [
                return new MimeMagic( $params );
        },
 
-       'ProxyLookup' => function ( MediaWikiServices $services ) {
-               $mainConfig = $services->getMainConfig();
-               return new ProxyLookup(
-                       $mainConfig->get( 'SquidServers' ),
-                       $mainConfig->get( 'SquidServersNoPurge' )
+       'OldRevisionImporter' => function ( MediaWikiServices $services ) : OldRevisionImporter {
+               return new ImportableOldRevisionImporter(
+                       true,
+                       LoggerFactory::getInstance( 'OldRevisionImporter' ),
+                       $services->getDBLoadBalancer()
                );
        },
 
-       'Parser' => function ( MediaWikiServices $services ) {
-               $conf = $services->getMainConfig()->get( 'ParserConf' );
-               return ObjectFactory::constructClassInstance( $conf['class'],
-                       [ $conf, $services->getMagicWordFactory() ] );
+       'Parser' => function ( MediaWikiServices $services ) : Parser {
+               return $services->getParserFactory()->create();
        },
 
-       'ParserCache' => function ( MediaWikiServices $services ) {
+       'ParserCache' => function ( MediaWikiServices $services ) : ParserCache {
                $config = $services->getMainConfig();
                $cache = ObjectCache::getInstance( $config->get( 'ParserCacheType' ) );
                wfDebugLog( 'caches', 'parser: ' . get_class( $cache ) );
@@ -314,138 +380,97 @@ return [
                );
        },
 
-       'LinkCache' => function ( MediaWikiServices $services ) {
-               return new LinkCache(
-                       $services->getTitleFormatter(),
-                       $services->getMainWANObjectCache()
+       'ParserFactory' => function ( MediaWikiServices $services ) : ParserFactory {
+               return new ParserFactory(
+                       $services->getMainConfig()->get( 'ParserConf' ),
+                       $services->getMagicWordFactory(),
+                       $services->getContentLanguage(),
+                       wfUrlProtocols()
                );
        },
 
-       'LinkRendererFactory' => function ( MediaWikiServices $services ) {
-               return new LinkRendererFactory(
-                       $services->getTitleFormatter(),
-                       $services->getLinkCache()
+       'PasswordFactory' => function ( MediaWikiServices $services ) : PasswordFactory {
+               $config = $services->getMainConfig();
+               return new PasswordFactory(
+                       $config->get( 'PasswordConfig' ),
+                       $config->get( 'PasswordDefault' )
                );
        },
 
-       'LinkRenderer' => function ( MediaWikiServices $services ) {
-               global $wgUser;
-
-               if ( defined( 'MW_NO_SESSION' ) ) {
-                       return $services->getLinkRendererFactory()->create();
-               } else {
-                       return $services->getLinkRendererFactory()->createForUser( $wgUser );
-               }
-       },
-
-       'GenderCache' => function ( MediaWikiServices $services ) {
-               return new GenderCache();
+       'PerDbNameStatsdDataFactory' =>
+       function ( MediaWikiServices $services ) : IBufferingStatsdDataFactory {
+               $config = $services->getMainConfig();
+               $wiki = $config->get( 'DBname' );
+               return new BufferingStatsdDataFactory(
+                       rtrim( $services->getMainConfig()->get( 'StatsdMetricPrefix' ), '.' ) . '.' . $wiki
+               );
        },
 
-       '_MediaWikiTitleCodec' => function ( MediaWikiServices $services ) {
-               return new MediaWikiTitleCodec(
+       'PreferencesFactory' => function ( MediaWikiServices $services ) : PreferencesFactory {
+               $factory = new DefaultPreferencesFactory(
+                       $services->getMainConfig(),
                        $services->getContentLanguage(),
-                       $services->getGenderCache(),
-                       $services->getMainConfig()->get( 'LocalInterwikis' )
+                       AuthManager::singleton(),
+                       $services->getLinkRendererFactory()->create()
                );
-       },
-
-       'TitleFormatter' => function ( MediaWikiServices $services ) {
-               return $services->getService( '_MediaWikiTitleCodec' );
-       },
+               $factory->setLogger( LoggerFactory::getInstance( 'preferences' ) );
 
-       'TitleParser' => function ( MediaWikiServices $services ) {
-               return $services->getService( '_MediaWikiTitleCodec' );
+               return $factory;
        },
 
-       'MainObjectStash' => function ( MediaWikiServices $services ) {
+       'ProxyLookup' => function ( MediaWikiServices $services ) : ProxyLookup {
                $mainConfig = $services->getMainConfig();
-
-               $id = $mainConfig->get( 'MainStash' );
-               if ( !isset( $mainConfig->get( 'ObjectCaches' )[$id] ) ) {
-                       throw new UnexpectedValueException(
-                               "Cache type \"$id\" is not present in \$wgObjectCaches." );
-               }
-
-               return \ObjectCache::newFromParams( $mainConfig->get( 'ObjectCaches' )[$id] );
+               return new ProxyLookup(
+                       $mainConfig->get( 'SquidServers' ),
+                       $mainConfig->get( 'SquidServersNoPurge' )
+               );
        },
 
-       'MainWANObjectCache' => function ( MediaWikiServices $services ) {
-               $mainConfig = $services->getMainConfig();
-
-               $id = $mainConfig->get( 'MainWANCache' );
-               if ( !isset( $mainConfig->get( 'WANObjectCaches' )[$id] ) ) {
-                       throw new UnexpectedValueException(
-                               "WAN cache type \"$id\" is not present in \$wgWANObjectCaches." );
-               }
-
-               $params = $mainConfig->get( 'WANObjectCaches' )[$id];
-               $objectCacheId = $params['cacheId'];
-               if ( !isset( $mainConfig->get( 'ObjectCaches' )[$objectCacheId] ) ) {
-                       throw new UnexpectedValueException(
-                               "Cache type \"$objectCacheId\" is not present in \$wgObjectCaches." );
-               }
-               $params['store'] = $mainConfig->get( 'ObjectCaches' )[$objectCacheId];
-
-               return \ObjectCache::newWANCacheFromParams( $params );
+       'ReadOnlyMode' => function ( MediaWikiServices $services ) : ReadOnlyMode {
+               return new ReadOnlyMode(
+                       $services->getConfiguredReadOnlyMode(),
+                       $services->getDBLoadBalancer()
+               );
        },
 
-       'LocalServerObjectCache' => function ( MediaWikiServices $services ) {
-               $cacheId = \ObjectCache::detectLocalServerCache();
-               return \ObjectCache::newFromId( $cacheId );
+       'RevisionFactory' => function ( MediaWikiServices $services ) : RevisionFactory {
+               return $services->getRevisionStore();
        },
 
-       'VirtualRESTServiceClient' => function ( MediaWikiServices $services ) {
-               $config = $services->getMainConfig()->get( 'VirtualRestConfig' );
-
-               $vrsClient = new VirtualRESTServiceClient( new MultiHttpClient( [] ) );
-               foreach ( $config['paths'] as $prefix => $serviceConfig ) {
-                       $class = $serviceConfig['class'];
-                       // Merge in the global defaults
-                       $constructArg = $serviceConfig['options'] ?? [];
-                       $constructArg += $config['global'];
-                       // Make the VRS service available at the mount point
-                       $vrsClient->mount( $prefix, [ 'class' => $class, 'config' => $constructArg ] );
-               }
-
-               return $vrsClient;
+       'RevisionLookup' => function ( MediaWikiServices $services ) : RevisionLookup {
+               return $services->getRevisionStore();
        },
 
-       'ConfiguredReadOnlyMode' => function ( MediaWikiServices $services ) {
-               return new ConfiguredReadOnlyMode( $services->getMainConfig() );
+       'RevisionStore' => function ( MediaWikiServices $services ) : RevisionStore {
+               return $services->getRevisionStoreFactory()->getRevisionStore();
        },
 
-       'ReadOnlyMode' => function ( MediaWikiServices $services ) {
-               return new ReadOnlyMode(
-                       $services->getConfiguredReadOnlyMode(),
-                       $services->getDBLoadBalancer()
+       'RevisionStoreFactory' => function ( MediaWikiServices $services ) : RevisionStoreFactory {
+               $config = $services->getMainConfig();
+               $store = new RevisionStoreFactory(
+                       $services->getDBLoadBalancerFactory(),
+                       $services->getBlobStoreFactory(),
+                       $services->getMainWANObjectCache(),
+                       $services->getCommentStore(),
+                       $services->getActorMigration(),
+                       $config->get( 'MultiContentRevisionSchemaMigrationStage' ),
+                       LoggerFactory::getProvider(),
+                       $config->get( 'ContentHandlerUseDB' )
                );
-       },
 
-       'UploadRevisionImporter' => function ( MediaWikiServices $services ) {
-               return new ImportableUploadRevisionImporter(
-                       $services->getMainConfig()->get( 'EnableUploads' ),
-                       LoggerFactory::getInstance( 'UploadRevisionImporter' )
-               );
+               return $store;
        },
 
-       'OldRevisionImporter' => function ( MediaWikiServices $services ) {
-               return new ImportableOldRevisionImporter(
-                       true,
-                       LoggerFactory::getInstance( 'OldRevisionImporter' ),
-                       $services->getDBLoadBalancer()
-               );
+       'SearchEngineConfig' => function ( MediaWikiServices $services ) : SearchEngineConfig {
+               return new SearchEngineConfig( $services->getMainConfig(),
+                       $services->getContentLanguage() );
        },
 
-       'WikiRevisionOldRevisionImporterNoUpdates' => function ( MediaWikiServices $services ) {
-               return new ImportableOldRevisionImporter(
-                       false,
-                       LoggerFactory::getInstance( 'OldRevisionImporter' ),
-                       $services->getDBLoadBalancer()
-               );
+       'SearchEngineFactory' => function ( MediaWikiServices $services ) : SearchEngineFactory {
+               return new SearchEngineFactory( $services->getSearchEngineConfig() );
        },
 
-       'ShellCommandFactory' => function ( MediaWikiServices $services ) {
+       'ShellCommandFactory' => function ( MediaWikiServices $services ) : CommandFactory {
                $config = $services->getMainConfig();
 
                $limits = [
@@ -464,77 +489,51 @@ return [
                return $factory;
        },
 
-       'ExternalStoreFactory' => function ( MediaWikiServices $services ) {
-               $config = $services->getMainConfig();
-
-               return new ExternalStoreFactory(
-                       $config->get( 'ExternalStores' )
-               );
-       },
+       'SiteLookup' => function ( MediaWikiServices $services ) : SiteLookup {
+               $cacheFile = $services->getMainConfig()->get( 'SitesCacheFile' );
 
-       'RevisionStore' => function ( MediaWikiServices $services ) {
-               return $services->getRevisionStoreFactory()->getRevisionStore();
+               if ( $cacheFile !== false ) {
+                       return new FileBasedSiteLookup( $cacheFile );
+               } else {
+                       // Use the default SiteStore as the SiteLookup implementation for now
+                       return $services->getSiteStore();
+               }
        },
 
-       'RevisionStoreFactory' => function ( MediaWikiServices $services ) {
-               $config = $services->getMainConfig();
-               $store = new RevisionStoreFactory(
-                       $services->getDBLoadBalancerFactory(),
-                       $services->getBlobStoreFactory(),
-                       $services->getMainWANObjectCache(),
-                       $services->getCommentStore(),
-                       $services->getActorMigration(),
-                       $config->get( 'MultiContentRevisionSchemaMigrationStage' ),
-                       LoggerFactory::getProvider(),
-                       $config->get( 'ContentHandlerUseDB' )
-               );
-
-               return $store;
-       },
+       'SiteStore' => function ( MediaWikiServices $services ) : SiteStore {
+               $rawSiteStore = new DBSiteStore( $services->getDBLoadBalancer() );
 
-       'RevisionLookup' => function ( MediaWikiServices $services ) {
-               return $services->getRevisionStore();
-       },
+               // TODO: replace wfGetCache with a CacheFactory service.
+               // TODO: replace wfIsHHVM with a capabilities service.
+               $cache = wfGetCache( wfIsHHVM() ? CACHE_ACCEL : CACHE_ANYTHING );
 
-       'RevisionFactory' => function ( MediaWikiServices $services ) {
-               return $services->getRevisionStore();
+               return new CachingSiteStore( $rawSiteStore, $cache );
        },
 
-       'BlobStoreFactory' => function ( MediaWikiServices $services ) {
-               return new BlobStoreFactory(
-                       $services->getDBLoadBalancer(),
-                       $services->getMainWANObjectCache(),
-                       $services->getMainConfig(),
-                       $services->getContentLanguage()
-               );
-       },
+       'SkinFactory' => function ( MediaWikiServices $services ) : SkinFactory {
+               $factory = new SkinFactory();
 
-       'BlobStore' => function ( MediaWikiServices $services ) {
-               return $services->getService( '_SqlBlobStore' );
-       },
+               $names = $services->getMainConfig()->get( 'ValidSkinNames' );
 
-       '_SqlBlobStore' => function ( MediaWikiServices $services ) {
-               return $services->getBlobStoreFactory()->newSqlBlobStore();
-       },
+               foreach ( $names as $name => $skin ) {
+                       $factory->register( $name, $skin, function () use ( $name, $skin ) {
+                               $class = "Skin$skin";
+                               return new $class( $name );
+                       } );
+               }
+               // Register a hidden "fallback" skin
+               $factory->register( 'fallback', 'Fallback', function () {
+                       return new SkinFallback;
+               } );
+               // Register a hidden skin for api output
+               $factory->register( 'apioutput', 'ApiOutput', function () {
+                       return new SkinApi;
+               } );
 
-       'ContentModelStore' => function ( MediaWikiServices $services ) {
-               return new NameTableStore(
-                       $services->getDBLoadBalancer(),
-                       $services->getMainWANObjectCache(),
-                       LoggerFactory::getInstance( 'NameTableSqlStore' ),
-                       'content_models',
-                       'model_id',
-                       'model_name'
-                       /**
-                        * No strtolower normalization is added to the service as there are examples of
-                        * extensions that do not stick to this assumption.
-                        * - extensions/examples/DataPages define( 'CONTENT_MODEL_XML_DATA','XML_DATA' );
-                        * - extensions/Scribunto define( 'CONTENT_MODEL_SCRIBUNTO', 'Scribunto' );
-                        */
-               );
+               return $factory;
        },
 
-       'SlotRoleStore' => function ( MediaWikiServices $services ) {
+       'SlotRoleStore' => function ( MediaWikiServices $services ) : NameTableStore {
                return new NameTableStore(
                        $services->getDBLoadBalancer(),
                        $services->getMainWANObjectCache(),
@@ -546,68 +545,90 @@ return [
                );
        },
 
-       'ChangeTagDefStore' => function ( MediaWikiServices $services ) {
-               return new NameTableStore(
-                       $services->getDBLoadBalancer(),
-                       $services->getMainWANObjectCache(),
-                       LoggerFactory::getInstance( 'NameTableSqlStore' ),
-                       'change_tag_def',
-                       'ctd_id',
-                       'ctd_name',
-                       null,
-                       false,
-                       function ( $insertFields ) {
-                               $insertFields['ctd_user_defined'] = 0;
-                               $insertFields['ctd_count'] = 0;
-                               return $insertFields;
-                       }
+       'StatsdDataFactory' => function ( MediaWikiServices $services ) : IBufferingStatsdDataFactory {
+               return new BufferingStatsdDataFactory(
+                       rtrim( $services->getMainConfig()->get( 'StatsdMetricPrefix' ), '.' )
                );
        },
 
-       'PreferencesFactory' => function ( MediaWikiServices $services ) {
-               $authManager = AuthManager::singleton();
-               $linkRenderer = $services->getLinkRendererFactory()->create();
-               $config = $services->getMainConfig();
-               $factory = new DefaultPreferencesFactory( $config, $services->getContentLanguage(),
-                       $authManager, $linkRenderer );
-               $factory->setLogger( LoggerFactory::getInstance( 'preferences' ) );
-
-               return $factory;
+       'TitleFormatter' => function ( MediaWikiServices $services ) : TitleFormatter {
+               return $services->getService( '_MediaWikiTitleCodec' );
        },
 
-       'HttpRequestFactory' => function ( MediaWikiServices $services ) {
-               return new \MediaWiki\Http\HttpRequestFactory();
+       'TitleParser' => function ( MediaWikiServices $services ) : TitleParser {
+               return $services->getService( '_MediaWikiTitleCodec' );
        },
 
-       'CommentStore' => function ( MediaWikiServices $services ) {
-               return new CommentStore(
-                       $services->getContentLanguage(),
-                       $services->getMainConfig()->get( 'CommentTableSchemaMigrationStage' )
+       'UploadRevisionImporter' => function ( MediaWikiServices $services ) : UploadRevisionImporter {
+               return new ImportableUploadRevisionImporter(
+                       $services->getMainConfig()->get( 'EnableUploads' ),
+                       LoggerFactory::getInstance( 'UploadRevisionImporter' )
                );
        },
 
-       'ActorMigration' => function ( MediaWikiServices $services ) {
-               return new ActorMigration(
-                       $services->getMainConfig()->get( 'ActorTableSchemaMigrationStage' )
+       'VirtualRESTServiceClient' =>
+       function ( MediaWikiServices $services ) : VirtualRESTServiceClient {
+               $config = $services->getMainConfig()->get( 'VirtualRestConfig' );
+
+               $vrsClient = new VirtualRESTServiceClient( new MultiHttpClient( [] ) );
+               foreach ( $config['paths'] as $prefix => $serviceConfig ) {
+                       $class = $serviceConfig['class'];
+                       // Merge in the global defaults
+                       $constructArg = $serviceConfig['options'] ?? [];
+                       $constructArg += $config['global'];
+                       // Make the VRS service available at the mount point
+                       $vrsClient->mount( $prefix, [ 'class' => $class, 'config' => $constructArg ] );
+               }
+
+               return $vrsClient;
+       },
+
+       'WatchedItemQueryService' =>
+       function ( MediaWikiServices $services ) : WatchedItemQueryService {
+               return new WatchedItemQueryService(
+                       $services->getDBLoadBalancer(),
+                       $services->getCommentStore(),
+                       $services->getActorMigration()
                );
        },
 
-       'MagicWordFactory' => function ( MediaWikiServices $services ) {
-               return new MagicWordFactory( $services->getContentLanguage() );
+       'WatchedItemStore' => function ( MediaWikiServices $services ) : WatchedItemStore {
+               $store = new WatchedItemStore(
+                       $services->getDBLoadBalancer(),
+                       new HashBagOStuff( [ 'maxKeys' => 100 ] ),
+                       $services->getReadOnlyMode(),
+                       $services->getMainConfig()->get( 'UpdateRowsPerQuery' )
+               );
+               $store->setStatsdDataFactory( $services->getStatsdDataFactory() );
+
+               if ( $services->getMainConfig()->get( 'ReadOnlyWatchedItemStore' ) ) {
+                       $store = new NoWriteWatchedItemStore( $store );
+               }
+
+               return $store;
        },
 
-       'ContentLanguage' => function ( MediaWikiServices $services ) {
-               return Language::factory( $services->getMainConfig()->get( 'LanguageCode' ) );
+       'WikiRevisionOldRevisionImporterNoUpdates' =>
+       function ( MediaWikiServices $services ) : ImportableOldRevisionImporter {
+               return new ImportableOldRevisionImporter(
+                       false,
+                       LoggerFactory::getInstance( 'OldRevisionImporter' ),
+                       $services->getDBLoadBalancer()
+               );
        },
 
-       'PasswordFactory' => function ( MediaWikiServices $services ) {
-               $config = $services->getMainConfig();
-               return new PasswordFactory(
-                       $config->get( 'PasswordConfig' ),
-                       $config->get( 'PasswordDefault' )
+       '_MediaWikiTitleCodec' => function ( MediaWikiServices $services ) : MediaWikiTitleCodec {
+               return new MediaWikiTitleCodec(
+                       $services->getContentLanguage(),
+                       $services->getGenderCache(),
+                       $services->getMainConfig()->get( 'LocalInterwikis' )
                );
        },
 
+       '_SqlBlobStore' => function ( MediaWikiServices $services ) : SqlBlobStore {
+               return $services->getBlobStoreFactory()->newSqlBlobStore();
+       },
+
        ///////////////////////////////////////////////////////////////////////////
        // NOTE: When adding a service here, don't forget to add a getter function
        // in the MediaWikiServices class. The convenience getter should just call
index 3ad19d4..a00766f 100644 (file)
@@ -110,7 +110,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
        /**
         * @var Language
         */
-       private $contentLanguage;
+       private $contLang;
 
        /**
         * @var LoggerInterface
@@ -251,7 +251,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
         * @param ParserCache $parserCache
         * @param JobQueueGroup $jobQueueGroup
         * @param MessageCache $messageCache
-        * @param Language $contentLanguage
+        * @param Language $contLang
         * @param LoggerInterface|null $saveParseLogger
         */
        public function __construct(
@@ -260,7 +260,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                ParserCache $parserCache,
                JobQueueGroup $jobQueueGroup,
                MessageCache $messageCache,
-               Language $contentLanguage,
+               Language $contLang,
                LoggerInterface $saveParseLogger = null
        ) {
                $this->wikiPage = $wikiPage;
@@ -269,7 +269,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                $this->revisionStore = $revisionStore;
                $this->jobQueueGroup = $jobQueueGroup;
                $this->messageCache = $messageCache;
-               $this->contentLanguage = $contentLanguage;
+               $this->contLang = $contLang;
 
                // XXX: replace all wfDebug calls with a Logger. Do we nede more than one logger here?
                $this->saveParseLogger = $saveParseLogger ?: new NullLogger();
@@ -320,7 +320,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
 
        /**
         * Checks whether this DerivedPageDataUpdater can be re-used for running updates targeting
-        * the the given revision.
+        * the given revision.
         *
         * @param UserIdentity|null $user The user creating the revision in question
         * @param RevisionRecord|null $revision New revision (after save, if already saved)
@@ -762,7 +762,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                        $this->canonicalParserOutput = $output;
                }
 
-               $userPopts = ParserOptions::newFromUserAndLang( $user, $this->contentLanguage );
+               $userPopts = ParserOptions::newFromUserAndLang( $user, $this->contLang );
                Hooks::run( 'ArticlePrepareTextForEdit', [ $wikiPage, $userPopts ] );
 
                $this->user = $user;
index dc7d31e..4210a96 100644 (file)
@@ -67,7 +67,7 @@ class TemplateParser {
        }
 
        /**
-        * Constructs the location of the the source Mustache template
+        * Constructs the location of the source Mustache template
         * @param string $templateName The name of the template
         * @return string
         * @throws UnexpectedValueException If $templateName attempts upwards directory traversal
index cc7d722..f2c6adb 100644 (file)
@@ -745,12 +745,10 @@ class Title implements LinkTarget {
        public static function makeName( $ns, $title, $fragment = '', $interwiki = '',
                $canonicalNamespace = false
        ) {
-               global $wgContLang;
-
                if ( $canonicalNamespace ) {
                        $namespace = MWNamespace::getCanonicalName( $ns );
                } else {
-                       $namespace = $wgContLang->getNsText( $ns );
+                       $namespace = MediaWikiServices::getInstance()->getContentLanguage()->getNsText( $ns );
                }
                $name = $namespace == '' ? $title : "$namespace:$title";
                if ( strval( $interwiki ) != '' ) {
@@ -1051,8 +1049,8 @@ class Title implements LinkTarget {
         * @return string Namespace text
         */
        public function getSubjectNsText() {
-               global $wgContLang;
-               return $wgContLang->getNsText( MWNamespace::getSubject( $this->mNamespace ) );
+               return MediaWikiServices::getInstance()->getContentLanguage()->
+                       getNsText( MWNamespace::getSubject( $this->mNamespace ) );
        }
 
        /**
@@ -1061,8 +1059,8 @@ class Title implements LinkTarget {
         * @return string Namespace text
         */
        public function getTalkNsText() {
-               global $wgContLang;
-               return $wgContLang->getNsText( MWNamespace::getTalk( $this->mNamespace ) );
+               return MediaWikiServices::getInstance()->getContentLanguage()->
+                       getNsText( MWNamespace::getTalk( $this->mNamespace ) );
        }
 
        /**
@@ -1632,8 +1630,6 @@ class Title implements LinkTarget {
         * @return string The prefixed text
         */
        private function prefix( $name ) {
-               global $wgContLang;
-
                $p = '';
                if ( $this->isExternal() ) {
                        $p = $this->mInterwiki . ':';
@@ -1644,7 +1640,8 @@ class Title implements LinkTarget {
 
                        if ( $nsText === false ) {
                                // See T165149. Awkward, but better than erroneously linking to the main namespace.
-                               $nsText = $wgContLang->getNsText( NS_SPECIAL ) . ":Badtitle/NS{$this->mNamespace}";
+                               $nsText = MediaWikiServices::getInstance()->getContentLanguage()->
+                                       getNsText( NS_SPECIAL ) .  ":Badtitle/NS{$this->mNamespace}";
                        }
 
                        $p .= $nsText . ':';
@@ -1979,7 +1976,7 @@ class Title implements LinkTarget {
                                $titleRef = $this;
                                Hooks::run( 'GetLocalURL::Article', [ &$titleRef, &$url ] );
                        } else {
-                               global $wgVariantArticlePath, $wgActionPaths, $wgContLang;
+                               global $wgVariantArticlePath, $wgActionPaths;
                                $url = false;
                                $matches = [];
 
@@ -2002,7 +1999,8 @@ class Title implements LinkTarget {
                                if ( $url === false
                                        && $wgVariantArticlePath
                                        && preg_match( '/^variant=([^&]*)$/', $query, $matches )
-                                       && $this->getPageLanguage()->equals( $wgContLang )
+                                       && $this->getPageLanguage()->equals(
+                                               MediaWikiServices::getInstance()->getContentLanguage() )
                                        && $this->getPageLanguage()->hasVariants()
                                ) {
                                        $variant = urldecode( $matches[1] );
@@ -3677,10 +3675,8 @@ class Title implements LinkTarget {
         * @return string Containing capitalized title
         */
        public static function capitalize( $text, $ns = NS_MAIN ) {
-               global $wgContLang;
-
                if ( MWNamespace::isCapitalized( $ns ) ) {
-                       return $wgContLang->ucfirst( $text );
+                       return MediaWikiServices::getInstance()->getContentLanguage()->ucfirst( $text );
                } else {
                        return $text;
                }
@@ -4227,8 +4223,6 @@ class Title implements LinkTarget {
         *     $parent => $currentarticle
         */
        public function getParentCategories() {
-               global $wgContLang;
-
                $data = [];
 
                $titleKey = $this->getArticleID();
@@ -4247,9 +4241,11 @@ class Title implements LinkTarget {
                );
 
                if ( $res->numRows() > 0 ) {
+                       $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                        foreach ( $res as $row ) {
-                               // $data[] = Title::newFromText($wgContLang->getNsText ( NS_CATEGORY ).':'.$row->cl_to);
-                               $data[$wgContLang->getNsText( NS_CATEGORY ) . ':' . $row->cl_to] = $this->getFullText();
+                               // $data[] = Title::newFromText( $contLang->getNsText ( NS_CATEGORY ).':'.$row->cl_to);
+                               $data[$contLang->getNsText( NS_CATEGORY ) . ':' . $row->cl_to] =
+                                       $this->getFullText();
                        }
                }
                return $data;
@@ -4733,11 +4729,11 @@ class Title implements LinkTarget {
                        // message content will be displayed, same for language subpages-
                        // Use always content language to avoid loading hundreds of languages
                        // to get the link color.
-                       global $wgContLang;
+                       $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                        list( $name, ) = MessageCache::singleton()->figureMessage(
-                               $wgContLang->lcfirst( $this->getText() )
+                               $contLang->lcfirst( $this->getText() )
                        );
-                       $message = wfMessage( $name )->inLanguage( $wgContLang )->useDatabase( false );
+                       $message = wfMessage( $name )->inLanguage( $contLang )->useDatabase( false );
                        return $message->exists();
                }
 
@@ -4750,14 +4746,12 @@ class Title implements LinkTarget {
         * @return string|bool
         */
        public function getDefaultMessageText() {
-               global $wgContLang;
-
                if ( $this->getNamespace() != NS_MEDIAWIKI ) { // Just in case
                        return false;
                }
 
                list( $name, $lang ) = MessageCache::singleton()->figureMessage(
-                       $wgContLang->lcfirst( $this->getText() )
+                       MediaWikiServices::getInstance()->getContentLanguage()->lcfirst( $this->getText() )
                );
                $message = wfMessage( $name )->inLanguage( $lang )->useDatabase( false );
 
@@ -4884,7 +4878,6 @@ class Title implements LinkTarget {
         * @return string XML 'id' name
         */
        public function getNamespaceKey( $prepend = 'nstab-' ) {
-               global $wgContLang;
                // Gets the subject namespace of this title
                $subjectNS = MWNamespace::getSubject( $this->getNamespace() );
                // Prefer canonical namespace name for HTML IDs
@@ -4894,7 +4887,7 @@ class Title implements LinkTarget {
                        $namespaceKey = $this->getSubjectNsText();
                }
                // Makes namespace key lowercase
-               $namespaceKey = $wgContLang->lc( $namespaceKey );
+               $namespaceKey = MediaWikiServices::getInstance()->getContentLanguage()->lc( $namespaceKey );
                // Uses main
                if ( $namespaceKey == '' ) {
                        $namespaceKey = 'main';
@@ -5043,7 +5036,7 @@ class Title implements LinkTarget {
 
        /**
         * Get the language in which the content of this page is written in
-        * wikitext. Defaults to $wgContLang, but in certain cases it can be
+        * wikitext. Defaults to content language, but in certain cases it can be
         * e.g. $wgLang (such as special pages, which are in the user language).
         *
         * @since 1.18
@@ -5081,7 +5074,7 @@ class Title implements LinkTarget {
 
        /**
         * Get the language in which the content of this page is written when
-        * viewed by user. Defaults to $wgContLang, but in certain cases it can be
+        * viewed by user. Defaults to content language, but in certain cases it can be
         * e.g. $wgLang (such as special pages, which are in the user language).
         *
         * @since 1.20
index e31d3f9..327dd54 100644 (file)
@@ -162,11 +162,12 @@ class WebRequest {
                                        $router->add( $wgActionPaths, [ 'action' => '$key' ] );
                                }
 
-                               global $wgVariantArticlePath, $wgContLang;
+                               global $wgVariantArticlePath;
                                if ( $wgVariantArticlePath ) {
                                        $router->add( $wgVariantArticlePath,
                                                [ 'variant' => '$2' ],
-                                               [ '$2' => $wgContLang->getVariants() ]
+                                               [ '$2' => MediaWikiServices::getInstance()->getContentLanguage()->
+                                               getVariants() ]
                                        );
                                }
 
@@ -306,7 +307,7 @@ class WebRequest {
        /**
         * Check for title, action, and/or variant data in the URL
         * and interpolate it into the GET variables.
-        * This should only be run after $wgContLang is available,
+        * This should only be run after the content language is available,
         * as we may need the list of language variants to determine
         * available variant URLs.
         */
@@ -364,9 +365,8 @@ class WebRequest {
                                $data[$key] = $this->normalizeUnicode( $val );
                        }
                } else {
-                       global $wgContLang;
-                       $data = isset( $wgContLang ) ?
-                               $wgContLang->normalize( $data ) :
+                       $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+                       $data = $contLang ? $contLang->normalize( $data ) :
                                UtfNormal\Validator::cleanUp( $data );
                }
                return $data;
@@ -386,12 +386,12 @@ class WebRequest {
                # Work around PHP *feature* to avoid *bugs* elsewhere.
                $name = strtr( $name, '.', '_' );
                if ( isset( $arr[$name] ) ) {
-                       global $wgContLang;
                        $data = $arr[$name];
                        if ( isset( $_GET[$name] ) && !is_array( $data ) ) {
                                # Check for alternate/legacy character encoding.
-                               if ( isset( $wgContLang ) ) {
-                                       $data = $wgContLang->checkTitleEncoding( $data );
+                               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+                               if ( $contLang ) {
+                                       $data = $contLang->checkTitleEncoding( $data );
                                }
                        }
                        $data = $this->normalizeUnicode( $data );
index 916a10c..34c6062 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Object to access the $_FILES array
  *
@@ -63,13 +65,12 @@ class WebRequestUpload {
                        return null;
                }
 
-               global $wgContLang;
                $name = $this->fileInfo['name'];
 
                # Safari sends filenames in HTML-encoded Unicode form D...
                # Horrid and evil! Let's try to make some kind of sense of it.
                $name = Sanitizer::decodeCharReferences( $name );
-               $name = $wgContLang->normalize( $name );
+               $name = MediaWikiServices::getInstance()->getContentLanguage()->normalize( $name );
                wfDebug( __METHOD__ . ": {$this->fileInfo['name']} normalized to '$name'\n" );
                return $name;
        }
index 8c65461..9744aee 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Module of static functions for generating XML
  */
@@ -79,9 +81,8 @@ class Xml {
        }
 
        /**
-        * Format an XML element as with self::element(), but run text through the
-        * $wgContLang->normalize() validator first to ensure that no invalid UTF-8
-        * is passed.
+        * Format an XML element as with self::element(), but run text through the content language's
+        * normalize() validator first to ensure that no invalid UTF-8 is passed.
         *
         * @param string $element
         * @param array $attribs Name=>value pairs. Values will be escaped.
@@ -89,12 +90,12 @@ class Xml {
         * @return string
         */
        public static function elementClean( $element, $attribs = [], $contents = '' ) {
-               global $wgContLang;
                if ( $attribs ) {
                        $attribs = array_map( [ 'UtfNormal\Validator', 'cleanUp' ], $attribs );
                }
                if ( $contents ) {
-                       $contents = $wgContLang->normalize( $contents );
+                       $contents =
+                               MediaWikiServices::getInstance()->getContentLanguage()->normalize( $contents );
                }
                return self::element( $element, $attribs, $contents );
        }
index fb22445..66f4d59 100644 (file)
@@ -19,6 +19,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @defgroup Actions Action done on pages
  */
@@ -386,8 +388,7 @@ abstract class Action implements MessageLocalizer {
         * @since 1.25
         */
        public function addHelpLink( $to, $overrideBaseUrl = false ) {
-               global $wgContLang;
-               $msg = wfMessage( $wgContLang->lc(
+               $msg = wfMessage( MediaWikiServices::getInstance()->getContentLanguage()->lc(
                        self::getActionName( $this->getContext() )
                        ) . '-helppage' );
 
index 1a15fc0..2778a1d 100644 (file)
@@ -358,12 +358,13 @@ class HistoryAction extends FormlessAction {
                        $rev->getComment()
                );
                if ( $rev->getComment() == '' ) {
-                       global $wgContLang;
+                       $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                        $title = $this->msg( 'history-feed-item-nocomment',
                                $rev->getUserText(),
-                               $wgContLang->timeanddate( $rev->getTimestamp() ),
-                               $wgContLang->date( $rev->getTimestamp() ),
-                               $wgContLang->time( $rev->getTimestamp() ) )->inContentLanguage()->text();
+                               $contLang->timeanddate( $rev->getTimestamp() ),
+                               $contLang->date( $rev->getTimestamp() ),
+                               $contLang->time( $rev->getTimestamp() )
+                       )->inContentLanguage()->text();
                } else {
                        $title = $rev->getUserText() .
                                $this->msg( 'colon-separator' )->inContentLanguage()->text() .
index e77cdf7..dc661aa 100644 (file)
@@ -207,8 +207,6 @@ class InfoAction extends FormlessAction {
         * @return array
         */
        protected function pageInfo() {
-               global $wgContLang;
-
                $services = MediaWikiServices::getInstance();
 
                $user = $this->getUser();
@@ -607,7 +605,7 @@ class InfoAction extends FormlessAction {
                $wordIDs = $magicWords->names;
 
                // Array of IDs => localized magic words
-               $localizedWords = $wgContLang->getMagicWords();
+               $localizedWords = $services->getContentLanguage()->getMagicWords();
 
                $listItems = [];
                foreach ( $pageProperties as $property => $value ) {
index a914c9b..68a0325 100644 (file)
@@ -23,6 +23,8 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * File reversion user interface
  *
@@ -78,8 +80,6 @@ class RevertAction extends FormAction {
        }
 
        protected function getFormFields() {
-               global $wgContLang;
-
                $timestamp = $this->oldFile->getTimestamp();
 
                $user = $this->getUser();
@@ -88,8 +88,9 @@ class RevertAction extends FormAction {
                $userTime = $lang->userTime( $timestamp, $user );
                $siteTs = MWTimestamp::getLocalInstance( $timestamp );
                $ts = $siteTs->format( 'YmdHis' );
-               $siteDate = $wgContLang->date( $ts, false, false );
-               $siteTime = $wgContLang->time( $ts, false, false );
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+               $siteDate = $contLang->date( $ts, false, false );
+               $siteTime = $contLang->time( $ts, false, false );
                $tzMsg = $siteTs->getTimezoneMessage()->inContentLanguage()->text();
 
                return [
index e546c4a..ac07eeb 100644 (file)
@@ -1246,8 +1246,8 @@ abstract class ApiBase extends ContextSource {
                        // Preserve U+001F for self::parseMultiValue(), or error out if that won't be called
                        if ( isset( $value ) && substr( $rawValue, 0, 1 ) === "\x1f" ) {
                                if ( $multi ) {
-                                       // This loses the potential $wgContLang->checkTitleEncoding() transformation
-                                       // done by WebRequest for $_GET. Let's call that a feature.
+                                       // This loses the potential checkTitleEncoding() transformation done by
+                                       // WebRequest for $_GET. Let's call that a feature.
                                        $value = implode( "\x1f", $request->normalizeUnicode( explode( "\x1f", $rawValue ) ) );
                                } else {
                                        $this->dieWithError( 'apierror-badvalue-notmultivalue', 'badvalue_notmultivalue' );
index 041b024..72509c2 100644 (file)
@@ -91,8 +91,6 @@ class ApiHelp extends ApiBase {
         * @param array $options Formatting options (described above)
         */
        public static function getHelp( IContextSource $context, $modules, array $options ) {
-               global $wgContLang;
-
                if ( !is_array( $modules ) ) {
                        $modules = [ $modules ];
                }
@@ -108,10 +106,12 @@ class ApiHelp extends ApiBase {
                }
                $out->setPageTitle( $context->msg( 'api-help-title' ) );
 
-               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               $services = MediaWikiServices::getInstance();
+               $cache = $services->getMainWANObjectCache();
                $cacheKey = null;
                if ( count( $modules ) == 1 && $modules[0] instanceof ApiMain &&
-                       $options['recursivesubmodules'] && $context->getLanguage() === $wgContLang
+                       $options['recursivesubmodules'] &&
+                       $context->getLanguage()->equals( $services->getContentLanguage() )
                ) {
                        $cacheHelpTimeout = $context->getConfig()->get( 'APICacheHelpTimeout' );
                        if ( $cacheHelpTimeout > 0 ) {
index e5e384c..672ec8f 100644 (file)
@@ -244,8 +244,7 @@ class ApiMain extends ApiBase {
                        // for uselang=user (see T85635).
                } else {
                        if ( $uselang === 'content' ) {
-                               global $wgContLang;
-                               $uselang = $wgContLang->getCode();
+                               $uselang = MediaWikiServices::getInstance()->getContentLanguage()->getCode();
                        }
                        $code = RequestContext::sanitizeLangCode( $uselang );
                        $this->getContext()->setLanguage( $code );
@@ -265,8 +264,7 @@ class ApiMain extends ApiBase {
                        if ( $errorLangCode === 'uselang' ) {
                                $errorLang = $this->getLanguage();
                        } elseif ( $errorLangCode === 'content' ) {
-                               global $wgContLang;
-                               $errorLang = $wgContLang;
+                               $errorLang = MediaWikiServices::getInstance()->getContentLanguage();
                        } else {
                                $errorLangCode = RequestContext::sanitizeLangCode( $errorLangCode );
                                $errorLang = Language::factory( $errorLangCode );
index ea2a85f..19629da 100644 (file)
@@ -512,11 +512,10 @@ class ApiPageSet extends ApiBase {
         * @since 1.21
         */
        public function getNormalizedTitlesAsResult( $result = null ) {
-               global $wgContLang;
-
                $values = [];
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                foreach ( $this->getNormalizedTitles() as $rawTitleStr => $titleStr ) {
-                       $encode = ( $wgContLang->normalize( $rawTitleStr ) !== $rawTitleStr );
+                       $encode = $contLang->normalize( $rawTitleStr ) !== $rawTitleStr;
                        $values[] = [
                                'fromencoded' => $encode,
                                'from' => $encode ? rawurlencode( $rawTitleStr ) : $rawTitleStr,
@@ -1198,15 +1197,14 @@ class ApiPageSet extends ApiBase {
                                $this->mInterwikiTitles[$unconvertedTitle] = $titleObj->getInterwiki();
                        } else {
                                // Variants checking
-                               global $wgContLang;
-                               if ( $this->mConvertTitles &&
-                                       $wgContLang->hasVariants() &&
-                                       !$titleObj->exists()
+                               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+                               if (
+                                       $this->mConvertTitles && $contLang->hasVariants() && !$titleObj->exists()
                                ) {
                                        // Language::findVariantLink will modify titleText and titleObj into
                                        // the canonical variant if possible
                                        $titleText = is_string( $title ) ? $title : $titleObj->getPrefixedText();
-                                       $wgContLang->findVariantLink( $titleText, $titleObj );
+                                       $contLang->findVariantLink( $titleText, $titleObj );
                                        $titleWasConverted = $unconvertedTitle !== $titleObj->getPrefixedText();
                                }
 
index 40abcaf..1d57c3c 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * A query action to return messages from site message cache
  *
@@ -110,15 +112,13 @@ class ApiQueryAllMessages extends ApiQueryBase {
                // Whether we have any sort of message customisation filtering
                $customiseFilterEnabled = $params['customised'] !== 'all';
                if ( $customiseFilterEnabled ) {
-                       global $wgContLang;
-
                        $customisedMessages = AllMessagesTablePager::getCustomisedStatuses(
                                array_map(
                                        [ $langObj, 'ucfirst' ],
                                        $messages_target
                                ),
                                $langObj->getCode(),
-                               !$langObj->equals( $wgContLang )
+                               !$langObj->equals( MediaWikiServices::getInstance()->getContentLanguage() )
                        );
 
                        $customised = $params['customised'] === 'modified';
index 8994e06..18d2804 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * A query action to get image information and upload history.
  *
@@ -369,14 +371,12 @@ class ApiQueryImageInfo extends ApiQueryBase {
         * @return array Result array
         */
        public static function getInfo( $file, $prop, $result, $thumbParams = null, $opts = false ) {
-               global $wgContLang;
-
                $anyHidden = false;
 
                if ( !$opts || is_string( $opts ) ) {
                        $opts = [
                                'version' => $opts ?: 'latest',
-                               'language' => $wgContLang,
+                               'language' => MediaWikiServices::getInstance()->getContentLanguage(),
                                'multilang' => false,
                                'extmetadatafilter' => [],
                                'revdelUser' => null,
@@ -650,8 +650,6 @@ class ApiQueryImageInfo extends ApiQueryBase {
        }
 
        public function getAllowedParams() {
-               global $wgContLang;
-
                return [
                        'prop' => [
                                ApiBase::PARAM_ISMULTI => true,
@@ -690,7 +688,8 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        ],
                        'extmetadatalanguage' => [
                                ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_DFLT => $wgContLang->getCode(),
+                               ApiBase::PARAM_DFLT =>
+                                       MediaWikiServices::getInstance()->getContentLanguage()->getCode(),
                        ],
                        'extmetadatamultilang' => [
                                ApiBase::PARAM_TYPE => 'boolean',
index 1d3c110..0cf6b04 100644 (file)
@@ -764,12 +764,12 @@ class ApiQueryInfo extends ApiQueryBase {
        }
 
        private function getAllVariants( $text, $ns = NS_MAIN ) {
-               global $wgContLang;
                $result = [];
-               foreach ( $wgContLang->getVariants() as $variant ) {
-                       $convertTitle = $wgContLang->autoConvert( $text, $variant );
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+               foreach ( $contLang->getVariants() as $variant ) {
+                       $convertTitle = $contLang->autoConvert( $text, $variant );
                        if ( $ns !== NS_MAIN ) {
-                               $convertNs = $wgContLang->convertNamespace( $ns, $variant );
+                               $convertNs = $contLang->convertNamespace( $ns, $variant );
                                $convertTitle = $convertNs . ':' . $convertTitle;
                        }
                        $result[$variant] = $convertTitle;
index 2d8e44c..f33a67f 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * A query module to list all langlinks (links to corresponding foreign language pages).
  *
@@ -140,7 +142,6 @@ class ApiQueryLangLinks extends ApiQueryBase {
        }
 
        public function getAllowedParams() {
-               global $wgContLang;
                return [
                        'prop' => [
                                ApiBase::PARAM_ISMULTI => true,
@@ -160,7 +161,7 @@ class ApiQueryLangLinks extends ApiQueryBase {
                                        'descending'
                                ]
                        ],
-                       'inlanguagecode' => $wgContLang->getCode(),
+                       'inlanguagecode' => MediaWikiServices::getInstance()->getContentLanguage()->getCode(),
                        'limit' => [
                                ApiBase::PARAM_DFLT => 10,
                                ApiBase::PARAM_TYPE => 'limit',
index f5461e0..d4f0396 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Query module to perform full text search within wiki titles and content
  *
@@ -48,7 +50,6 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
         * @return void
         */
        private function run( $resultPageSet = null ) {
-               global $wgContLang;
                $params = $this->extractRequestParams();
 
                // Extract parameters
@@ -152,7 +153,8 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                }
 
                // Add the search results to the result
-               $terms = $wgContLang->convertForSearchResult( $matches->termMatches() );
+               $terms = MediaWikiServices::getInstance()->getContentLanguage()->
+                       convertForSearchResult( $matches->termMatches() );
                $titles = [];
                $count = 0;
                $limit = $params['limit'];
index c65dfa5..c26bb62 100644 (file)
@@ -125,8 +125,6 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendGeneralInfo( $property ) {
-               global $wgContLang;
-
                $config = $this->getConfig();
 
                $data = [];
@@ -164,8 +162,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['langconversion'] = !$config->get( 'DisableLangConversion' );
                $data['titleconversion'] = !$config->get( 'DisableTitleConversion' );
 
-               if ( $wgContLang->linkPrefixExtension() ) {
-                       $linkPrefixCharset = $wgContLang->linkPrefixCharset();
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+               if ( $contLang->linkPrefixExtension() ) {
+                       $linkPrefixCharset = $contLang->linkPrefixCharset();
                        $data['linkprefixcharset'] = $linkPrefixCharset;
                        // For backwards compatibility
                        $data['linkprefix'] = "/^((?>.*[^$linkPrefixCharset]|))(.+)$/sDu";
@@ -174,7 +173,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $data['linkprefix'] = '';
                }
 
-               $linktrail = $wgContLang->linkTrail();
+               $linktrail = $contLang->linkTrail();
                $data['linktrail'] = $linktrail ?: '';
 
                $data['legaltitlechars'] = Title::legalChars();
@@ -197,26 +196,26 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['lang'] = $config->get( 'LanguageCode' );
 
                $fallbacks = [];
-               foreach ( $wgContLang->getFallbackLanguages() as $code ) {
+               foreach ( $contLang->getFallbackLanguages() as $code ) {
                        $fallbacks[] = [ 'code' => $code ];
                }
                $data['fallback'] = $fallbacks;
                ApiResult::setIndexedTagName( $data['fallback'], 'lang' );
 
-               if ( $wgContLang->hasVariants() ) {
+               if ( $contLang->hasVariants() ) {
                        $variants = [];
-                       foreach ( $wgContLang->getVariants() as $code ) {
+                       foreach ( $contLang->getVariants() as $code ) {
                                $variants[] = [
                                        'code' => $code,
-                                       'name' => $wgContLang->getVariantname( $code ),
+                                       'name' => $contLang->getVariantname( $code ),
                                ];
                        }
                        $data['variants'] = $variants;
                        ApiResult::setIndexedTagName( $data['variants'], 'lang' );
                }
 
-               $data['rtl'] = $wgContLang->isRTL();
-               $data['fallback8bitEncoding'] = $wgContLang->fallback8bitEncoding();
+               $data['rtl'] = $contLang->isRTL();
+               $data['fallback8bitEncoding'] = $contLang->fallback8bitEncoding();
 
                $data['readonly'] = wfReadOnly();
                if ( $data['readonly'] ) {
@@ -280,11 +279,13 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendNamespaces( $property ) {
-               global $wgContLang;
                $data = [
                        ApiResult::META_TYPE => 'assoc',
                ];
-               foreach ( $wgContLang->getFormattedNamespaces() as $ns => $title ) {
+               foreach (
+                       MediaWikiServices::getInstance()->getContentLanguage()->getFormattedNamespaces()
+                       as $ns => $title
+               ) {
                        $data[$ns] = [
                                'id' => intval( $ns ),
                                'case' => MWNamespace::isCapitalized( $ns ) ? 'first-letter' : 'case-sensitive',
@@ -314,10 +315,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendNamespaceAliases( $property ) {
-               global $wgContLang;
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                $aliases = array_merge( $this->getConfig()->get( 'NamespaceAliases' ),
-                       $wgContLang->getNamespaceAliases() );
-               $namespaces = $wgContLang->getNamespaces();
+                       $contLang->getNamespaceAliases() );
+               $namespaces = $contLang->getNamespaces();
                $data = [];
                foreach ( $aliases as $title => $ns ) {
                        if ( $namespaces[$ns] == $title ) {
@@ -339,9 +340,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendSpecialPageAliases( $property ) {
-               global $wgContLang;
                $data = [];
-               $aliases = $wgContLang->getSpecialPageAliases();
+               $aliases = MediaWikiServices::getInstance()->getContentLanguage()->getSpecialPageAliases();
                foreach ( SpecialPageFactory::getNames() as $specialpage ) {
                        if ( isset( $aliases[$specialpage] ) ) {
                                $arr = [ 'realname' => $specialpage, 'aliases' => $aliases[$specialpage] ];
@@ -355,9 +355,11 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendMagicWords( $property ) {
-               global $wgContLang;
                $data = [];
-               foreach ( $wgContLang->getMagicWords() as $magicword => $aliases ) {
+               foreach (
+                       MediaWikiServices::getInstance()->getContentLanguage()->getMagicWords()
+                       as $magicword => $aliases
+               ) {
                        $caseSensitive = array_shift( $aliases );
                        $arr = [ 'name' => $magicword, 'aliases' => $aliases ];
                        $arr['case-sensitive'] = (bool)$caseSensitive;
index 3b7c181..c4a31c7 100644 (file)
@@ -18,6 +18,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This class represents the result of the API operations.
  * It simply wraps a nested array structure, adding some functions to simplify
@@ -330,8 +332,6 @@ class ApiResult implements ApiSerializable {
         * @return array|mixed|string
         */
        private static function validateValue( $value ) {
-               global $wgContLang;
-
                if ( is_object( $value ) ) {
                        // Note we use is_callable() here instead of instanceof because
                        // ApiSerializable is an informal protocol (see docs there for details).
@@ -374,7 +374,7 @@ class ApiResult implements ApiSerializable {
                } elseif ( is_float( $value ) && !is_finite( $value ) ) {
                        throw new InvalidArgumentException( 'Cannot add non-finite floats to ApiResult' );
                } elseif ( is_string( $value ) ) {
-                       $value = $wgContLang->normalize( $value );
+                       $value = MediaWikiServices::getInstance()->getContentLanguage()->normalize( $value );
                } elseif ( $value !== null && !is_scalar( $value ) ) {
                        $type = gettype( $value );
                        if ( is_resource( $value ) ) {
index 8c69b9d..241e71a 100644 (file)
        "apihelp-query+revisions+base-paramvalue-prop-user": "المستخدم الذي أجرى المراجعة.",
        "apihelp-query+revisions+base-paramvalue-prop-userid": "معرف المستخدم لمنشئ المراجعة.",
        "apihelp-query+revisions+base-paramvalue-prop-size": "طول (بايت) المراجعة.",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsize": "طول (بايت) كل فتحة مراجعة.",
        "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (القاعدة 16) المراجعة.",
-       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "معرف نموذج المحتوى للمراجعة.",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsha1": "SHA-1 (القاعدة 16) لكل فتحة مراجعة.",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "معرف نموذج المحتوى لكل فتحة مراجعة.",
        "apihelp-query+revisions+base-paramvalue-prop-comment": "تعليق من قبل المستخدم للمراجعة.",
        "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "تعليق محلل من قبل المستخدم للمراجعة.",
-       "apihelp-query+revisions+base-paramvalue-prop-content": "Ù\86ص Ø§Ù\84مراجعة.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Ù\85حتÙ\88Ù\89 Ù\83Ù\84 Ù\81تحة مراجعة.",
        "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-roles": "أدرج أدوار فتحة المحتوى الموجودة في المراجعة.",
+       "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).",
        "apierror-emptynewsection": "إنشاء أقسام جديدة فارغة غير ممكن.",
        "apierror-emptypage": "لا يُسمَح بإنشاء صفحات جديدة فارغة.",
        "apierror-exceptioncaught": "[$1] تم اكتشاف الاستثناء: $2",
+       "apierror-exceptioncaughttype": "[$1] تم اكتشافها باستثناء النوع $2",
        "apierror-filedoesnotexist": "الملف غير موجود.",
        "apierror-fileexists-sharedrepo-perm": "الملف الهدف موجود في مستودع مشترك; استخدم الوسيط <var>ignorewarnings</var> لتجاوزه.",
        "apierror-filenopath": "لا يمكن الحصول على مسار الملف المحلي.",
index 56a6507..084dfac 100644 (file)
        "apihelp-query+allcategories-summary": "모든 분류를 열거합니다.",
        "apihelp-query+allcategories-param-prefix": "이 값으로 시작하는 모든 분류 제목을 검색합니다.",
        "apihelp-query+allcategories-param-dir": "정렬 방향.",
-       "apihelp-query+allcategories-param-limit": "ë°\98í\99\98í\95  ë¶\84ë¥\98ì\9d\98 ê°¯수입니다.",
+       "apihelp-query+allcategories-param-limit": "ë°\98í\99\98í\95  ë¶\84ë¥\98ì\9d\98 ê°\9c수입니다.",
        "apihelp-query+allcategories-param-prop": "얻고자 하는 속성:",
        "apihelp-query+allcategories-paramvalue-prop-size": "페이지 수를 분류에 추가합니다.",
        "apihelp-query+alldeletedrevisions-summary": "사용자에 의해서나 이름공간 안에서 삭제된 모든 판을 나열합니다.",
        "apihelp-query+allredirects-param-namespace": "열거할 이름공간.",
        "apihelp-query+allredirects-param-limit": "반환할 총 항목 수입니다.",
        "apihelp-query+allrevisions-summary": "모든 판 표시.",
-       "apihelp-query+mystashedfiles-param-limit": "ê°\80ì ¸ì\98¬ í\8c\8cì\9d¼ì\9d\98 ê°¯ì\88\98.",
+       "apihelp-query+mystashedfiles-param-limit": "ê°\80ì ¸ì\98¬ í\8c\8cì\9d¼ì\9d\98 ê°\9cì\88\98ì\9e\85ë\8b\88ë\8b¤.",
        "apihelp-query+alltransclusions-summary": "존재하지 않는 문서를 포함하여 끼워넣은 모든 문서(&#123;&#123;x&#125;&#125;를 사용하여 끼워넣은 문서)를 나열합니다.",
        "apihelp-query+alltransclusions-param-prop": "포함할 정보:",
        "apihelp-query+alltransclusions-param-namespace": "열거할 이름공간.",
        "apihelp-query+blocks-paramvalue-prop-reason": "차단 이유를 추가합니다.",
        "apihelp-query+blocks-paramvalue-prop-range": "차단에 영향을 받는 IP 주소 대역을 추가합니다.",
        "apihelp-query+categories-summary": "문서가 속하는 모든 분류를 나열합니다.",
-       "apihelp-query+categories-param-limit": "ë°\98í\99\98í\95  ë¶\84ë¥\98ì\9d\98 ê°¯수입니다.",
+       "apihelp-query+categories-param-limit": "ë°\98í\99\98í\95  ë¶\84ë¥\98ì\9d\98 ê°\9c수입니다.",
        "apihelp-query+categoryinfo-summary": "제시된 분류의 정보를 반환합니다.",
        "apihelp-query+categorymembers-summary": "제시된 분류의 모든 문서를 나열합니다.",
        "apihelp-query+categorymembers-paramvalue-prop-ids": "페이지 ID를 추가합니다.",
        "apihelp-query+iwbacklinks-summary": "제시된 인터위키 링크에 연결된 모든 문서를 찾습니다.",
        "apihelp-query+iwbacklinks-param-prefix": "인터위키의 접두사.",
        "apihelp-query+iwbacklinks-param-title": "검색할 인터위키 링크. <var>$1blprefix</var>와 함께 사용해야 합니다.",
-       "apihelp-query+iwbacklinks-param-limit": "ë°\98í\99\9cí\95\9c ì´\9d ë¬¸ì\84\9c ì\88\98.",
+       "apihelp-query+iwbacklinks-param-limit": "ë°\98í\99\98í\95  ì´\9d ë¬¸ì\84\9c ì\88\98ì\9e\85ë\8b\88ë\8b¤.",
        "apihelp-query+iwbacklinks-param-prop": "얻고자 하는 속성:",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "인터위키의 접두사를 추가합니다.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "인터위키의 제목을 추가합니다.",
index e47e6c0..d712765 100644 (file)
        "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "Распарсенное описание правки.",
        "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).",
index 952825c..4e98cb2 100644 (file)
@@ -59,6 +59,7 @@
        "apihelp-compare-param-totitle": "要比對的第二個標題。",
        "apihelp-compare-param-toid": "要比對的第二個頁面 ID。",
        "apihelp-compare-param-torev": "要比對的第二個修訂。",
+       "apihelp-compare-param-prop": "要取得的資訊部份。",
        "apihelp-compare-example-1": "建立修訂 1 與 1 的差異檔",
        "apihelp-createaccount-summary": "建立新使用者帳號。",
        "apihelp-createaccount-param-name": "使用者名稱。",
@@ -76,6 +77,7 @@
        "apihelp-delete-param-title": "您欲刪除的頁面標題。 無法與 <var>$1pageid</var> 同時使用。",
        "apihelp-delete-param-pageid": "您欲刪除頁面的頁面 ID。 無法與 <var>$1title</var> 同時使用。",
        "apihelp-delete-param-reason": "刪除的原因。 若未設定,將會使用自動產生的原因。",
+       "apihelp-delete-param-tags": "在刪除日誌裡更改套用到項目的標籤。",
        "apihelp-delete-param-watch": "加入目前頁面至您的監視清單。",
        "apihelp-delete-param-watchlist": "無條件使用設置將頁面加入或移除目前使用者的監視清單或者是不更改監視清單。",
        "apihelp-delete-param-unwatch": "從您的監視清單中移除目前頁面。",
@@ -90,6 +92,7 @@
        "apihelp-edit-param-sectiontitle": "新章節的標題。",
        "apihelp-edit-param-text": "頁面內容。",
        "apihelp-edit-param-summary": "編輯摘要。 當未設定 $1section=new 與 $1sectiontitle 時也會當做章節標題。",
+       "apihelp-edit-param-tags": "更改套用到修訂的標籤。",
        "apihelp-edit-param-minor": "小編輯。",
        "apihelp-edit-param-notminor": "非小編輯。",
        "apihelp-edit-param-bot": "標記此編輯為機器人編輯。",
        "apihelp-edit-param-nocreate": "若頁面不存在,則產生錯誤。",
        "apihelp-edit-param-watch": "加入目前頁面至您的監視清單。",
        "apihelp-edit-param-unwatch": "從您的監視清單中移除目前頁面。",
+       "apihelp-edit-param-contentformat": "用於輸入文字的內容序列化格式。",
+       "apihelp-edit-param-contentmodel": "新內容的內容模組。",
        "apihelp-edit-example-edit": "編輯頁面",
        "apihelp-emailuser-summary": "寄送電子郵件給使用者。",
        "apihelp-emailuser-param-target": "電子郵件的收件使用者。",
        "apihelp-expandtemplates-param-text": "要轉換的 Wikitext。",
        "apihelp-feedcontributions-summary": "回傳使用者貢獻 Feed。",
        "apihelp-feedcontributions-param-feedformat": "Feed 的格式。",
+       "apihelp-feedcontributions-param-year": "起始年份(更早之前)。",
+       "apihelp-feedcontributions-param-month": "起始月份(更早之前)。",
+       "apihelp-feedcontributions-param-deletedonly": "僅顯示已刪除的貢獻。",
+       "apihelp-feedcontributions-param-toponly": "只顯示最新修訂的編輯。",
+       "apihelp-feedcontributions-param-newonly": "只顯示建立頁面的編輯。",
        "apihelp-feedcontributions-param-hideminor": "隱藏小修改。",
        "apihelp-feedcontributions-param-showsizediff": "顯示修訂版本之間的差異大小。",
        "apihelp-feedcontributions-example-simple": "返回使用者<kbd>Example</kbd>的貢獻。",
        "apihelp-opensearch-param-suggest": "若<var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var>設定為false,則不做任何事。",
        "apihelp-opensearch-param-redirects": "如何處理重定向:\n;return:傳回重定向本身。\n;resolve:傳回目標頁面,傳回的結果數目可能少於$1limit。\n由於歷史原因,$1format=json的預設值為「return」,其他格式則為「resolve」。",
        "apihelp-opensearch-param-format": "輸出的格式。",
+       "apihelp-options-summary": "更改目前使用者的偏好設定。",
        "apihelp-options-param-reset": "重設偏好設定為網站預設值。",
        "apihelp-options-example-reset": "重設所有偏好設定",
+       "apihelp-parse-param-summary": "解析摘要。",
+       "apihelp-parse-param-pageid": "解析此頁面的內容。覆蓋 <var>$1page</var>。",
+       "apihelp-parse-param-preview": "在預覽模式下解析。",
        "apihelp-parse-example-page": "解析頁面。",
        "apihelp-parse-example-text": "解析 wikitext。",
        "apihelp-parse-example-texttitle": "解析 wikitext,指定頁面標題。",
        "apihelp-protect-param-watchlist": "無條件地將該頁面加入至或移除自目前使用者的監視列表、使用偏好設定或不更改監視。",
        "apihelp-protect-example-protect": "保護一個頁面。",
        "apihelp-purge-summary": "為指定標題清除快取。",
+       "apihelp-purge-param-forcelinkupdate": "更新連結表格。",
        "apihelp-purge-example-generator": "重新整理主要命名空間的前10個頁面。",
        "apihelp-query-summary": "擷取來自及有關MediaWiki的數據。",
+       "apihelp-query-param-list": "要取得的清單。",
+       "apihelp-query-param-meta": "要取得的詮釋資料。",
+       "apihelp-query+allcategories-param-dir": "排序的方向。",
        "apihelp-query+allcategories-param-limit": "要回傳的分類數量。",
        "apihelp-query+allcategories-param-prop": "要取得的屬性。",
+       "apihelp-query+allcategories-paramvalue-prop-size": "在分類裡添加頁面數。",
        "apihelp-query+alldeletedrevisions-param-start": "起始列舉的時間戳記。",
+       "apihelp-query+alldeletedrevisions-param-from": "在此標題開始列出。",
+       "apihelp-query+alldeletedrevisions-param-to": "在此標題停止列出。",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "添加檔案標題。",
        "apihelp-query+allfileusages-param-limit": "要回傳的項目總數。",
        "apihelp-query+allimages-param-limit": "要回傳的圖片總數。",
        "apihelp-query+alllinks-param-limit": "要回傳的項目總數。",
        "apihelp-query+allmessages-summary": "返回來自該網站的訊息。",
        "apihelp-query+allpages-param-limit": "要回傳的頁面總數。",
+       "apihelp-query+allredirects-summary": "列出至命名空間的所有重新導向。",
        "apihelp-query+allredirects-param-limit": "要回傳的項目總數。",
        "apihelp-query+allrevisions-summary": "列出所有修訂版本。",
        "apihelp-query+allrevisions-param-start": "起始列舉的時間戳記。",
        "apihelp-query+categorymembers-param-limit": "回傳的頁面數量上限。",
        "apihelp-query+contributors-param-limit": "要回傳的貢獻人員數量。",
        "apihelp-query+deletedrevs-param-start": "起始列舉的時間戳記。",
+       "apihelp-query+deletedrevs-param-from": "在此標題開始列出。",
+       "apihelp-query+deletedrevs-param-to": "在此標題停止列出。",
        "apihelp-query+duplicatefiles-param-limit": "要回傳的重複檔案數量。",
        "apihelp-query+embeddedin-param-filterredir": "如何過濾重新導向。",
        "apihelp-query+embeddedin-param-limit": "要回傳的頁面總數。",
        "apihelp-query+extlinks-param-limit": "要回傳的連結數量。",
        "apihelp-query+exturlusage-param-limit": "要回傳的頁面數量。",
        "apihelp-query+filearchive-param-limit": "要回傳的圖片總數。",
+       "apihelp-query+filearchive-paramvalue-prop-mime": "添加圖片的 MIME。",
+       "apihelp-query+filearchive-paramvalue-prop-mediatype": "添加圖片的多媒體類型。",
        "apihelp-query+fileusage-param-prop": "要取得的屬性。",
        "apihelp-query+fileusage-param-limit": "要回傳的數量。",
        "apihelp-query+imageinfo-summary": "回傳檔案資訊與上傳日誌。",
        "apihelp-query+info-summary": "取得基本頁面訊息。",
        "apihelp-query+iwbacklinks-param-prop": "要取得的屬性。",
        "apihelp-query+iwlinks-summary": "回傳指定頁面的所有 interwiki 連結。",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "添加完整的 URL。",
        "apihelp-query+iwlinks-param-limit": "要回傳的跨 Wiki 連結數量。",
        "apihelp-query+langbacklinks-param-limit": "要回傳的頁面總數。",
        "apihelp-query+langbacklinks-param-prop": "要取得的屬性。",
        "apihelp-query+langlinks-summary": "回傳指定頁面的所有跨語言連結。",
        "apihelp-query+langlinks-param-limit": "要回傳的 langlinks 數量。",
+       "apihelp-query+langlinks-paramvalue-prop-url": "添加完整的 URL。",
+       "apihelp-query+langlinks-param-dir": "列出時所採用的方向。",
+       "apihelp-query+langlinks-param-inlanguagecode": "用於本地化語言名稱的語言代碼。",
        "apihelp-query+links-summary": "回傳指定頁面的所有連結。",
        "apihelp-query+links-param-limit": "要回傳的連結數量。",
        "apihelp-query+linkshere-param-prop": "要取得的屬性。",
+       "apihelp-query+linkshere-paramvalue-prop-title": "各頁面的標題。",
+       "apihelp-query+linkshere-paramvalue-prop-redirect": "若頁面為重新導向,則做出標記。",
        "apihelp-query+linkshere-param-limit": "要回傳的數量。",
        "apihelp-query+logevents-summary": "從日誌中獲取事件。",
        "apihelp-query+logevents-param-prop": "要取得的屬性。",
        "apihelp-query+logevents-param-end": "結束列舉的時間戳記。",
        "apihelp-query+logevents-param-limit": "要回傳的事件項目總數。",
        "apihelp-query+pagepropnames-param-limit": "回傳的名稱數量上限。",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "添加頁面 ID。",
        "apihelp-query+pageswithprop-param-limit": "回傳的頁面數量上限。",
+       "apihelp-query+prefixsearch-param-search": "搜尋字串。",
+       "apihelp-query+prefixsearch-param-namespace": "搜尋的命名空間。若 <var>$1search</var> 以有效的命名空間前綴為開頭則會被忽略。",
        "apihelp-query+prefixsearch-param-limit": "回傳的結果數量上限。",
+       "apihelp-query+prefixsearch-param-offset": "要略過的結果數量。",
        "apihelp-query+protectedtitles-param-limit": "要回傳的頁面總數。",
        "apihelp-query+protectedtitles-param-prop": "要取得的屬性。",
        "apihelp-query+querypage-param-limit": "回傳的結果數量。",
        "apihelp-query+recentchanges-summary": "列舉出最近變更。",
        "apihelp-query+recentchanges-param-start": "起始列舉的時間戳記。",
        "apihelp-query+recentchanges-param-end": "結束列舉的時間戳記。",
+       "apihelp-query+recentchanges-param-user": "此列出由該使用者作出的更改。",
+       "apihelp-query+recentchanges-param-excludeuser": "不要列出由該使用者作出的更改。",
        "apihelp-query+recentchanges-param-limit": "要回傳變更總數。",
        "apihelp-query+recentchanges-example-simple": "最近變更清單",
        "apihelp-query+redirects-summary": "回傳連結至指定頁面的所有重新導向。",
        "apihelp-query+redirects-param-prop": "要取得的屬性。",
+       "apihelp-query+redirects-paramvalue-prop-title": "各重新導向的標題。",
        "apihelp-query+redirects-param-limit": "要回傳的重新導向數量。",
+       "apihelp-query+revisions-summary": "取得修訂的資訊。",
+       "apihelp-query+revisions+base-paramvalue-prop-ids": "修訂 ID。",
+       "apihelp-query+search-param-info": "要回傳的詮釋資料。",
+       "apihelp-query+search-param-prop": "要回傳的屬性:",
        "apihelp-query+search-paramvalue-prop-score": "已忽略",
        "apihelp-query+search-paramvalue-prop-hasrelated": "已忽略",
        "apihelp-query+search-param-limit": "要回傳的頁面總數。",
+       "apihelp-query+siteinfo-example-simple": "索取站台資訊。",
+       "apihelp-query+siteinfo-example-interwiki": "索取本地端跨 wiki 前綴的清單。",
        "apihelp-query+stashimageinfo-summary": "回傳多筆儲藏檔案的檔案資訊。",
        "apihelp-query+stashimageinfo-example-simple": "回傳儲藏檔案的檔案資訊。",
        "apihelp-query+tags-summary": "列出變更標記。",
        "apihelp-query+tags-param-prop": "要取得的屬性。",
+       "apihelp-query+tags-paramvalue-prop-name": "添加標籤名稱。",
+       "apihelp-query+tags-paramvalue-prop-displayname": "添加標籤的系統訊息。",
+       "apihelp-query+tags-paramvalue-prop-description": "添加標籤的描述。",
+       "apihelp-query+tags-example-simple": "列出可用標籤。",
        "apihelp-query+templates-summary": "回傳指定頁面中所有引用的頁面。",
        "apihelp-query+templates-param-limit": "要回傳的模板數量。",
        "apihelp-query+tokens-param-type": "要求的權杖類型。",
        "apihelp-query+tokens-example-simple": "接收 csrf 密鑰 (預設)。",
        "apihelp-query+tokens-example-types": "接收監視密鑰以及巡邏密鑰。",
        "apihelp-query+transcludedin-param-prop": "要取得的屬性。",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "各頁面的頁面 ID。",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "各頁面的標題。",
+       "apihelp-query+transcludedin-paramvalue-prop-redirect": "若頁面為重新導向,則做出標記。",
        "apihelp-query+transcludedin-param-limit": "回傳的數量。",
        "apihelp-query+usercontribs-param-limit": "回傳的貢獻數量上限。",
+       "apihelp-query+users-summary": "取得有關使用者清單的資訊。",
        "apihelp-query+watchlist-param-start": "起始列舉的時間戳記。",
        "apihelp-query+watchlist-param-end": "結束列舉的時間戳記。",
        "apihelp-query+watchlist-param-limit": "每個請求要回傳的結果總數。",
+       "apihelp-query+watchlist-paramvalue-prop-title": "添加頁面標題。",
+       "apihelp-query+watchlist-paramvalue-prop-flags": "添加編輯的標籤。",
+       "apihelp-query+watchlist-paramvalue-type-log": "日誌項目。",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "分類成員更改。",
        "apihelp-query+watchlistraw-param-limit": "每個請求要回傳的結果總數。",
+       "apihelp-query+watchlistraw-param-dir": "列出時所採用的方向。",
        "apihelp-removeauthenticationdata-summary": "為目前使用者移除身分核對資料。",
        "apihelp-revisiondelete-summary": "刪除和取消刪除修訂。",
        "apihelp-stashedit-param-title": "正在編輯此頁面的標題。",
        "apihelp-unblock-summary": "解除封鎖一位使用者。",
        "apihelp-unblock-param-reason": "解除封鎖的原因。",
        "apihelp-unblock-example-id": "解除封銷 ID #<kbd>105</kbd>。",
+       "apihelp-undelete-param-title": "要恢復的頁面標題。",
        "apihelp-undelete-param-reason": "還原的原因。",
+       "apihelp-upload-param-filename": "目標檔案名稱。",
+       "apihelp-upload-param-comment": "上傳註釋。如果 <var>$1text</var> 未指定的話,也會作為新檔案用的初始頁面文字。",
+       "apihelp-upload-param-file": "檔案內容。",
+       "apihelp-upload-example-url": "從 URL 上傳。",
        "apihelp-userrights-summary": "變更一位使用者的群組成員。",
        "apihelp-userrights-param-user": "使用者名稱。",
        "apihelp-userrights-param-userid": "使用者ID。",
        "apihelp-userrights-param-add": "加入使用者至這些群組;若已是成員,則更新失效時間。",
        "apihelp-userrights-param-remove": "從這些群組移除使用者。",
        "apihelp-userrights-param-reason": "變更的原因。",
+       "apihelp-validatepassword-param-password": "要驗證的密碼。",
+       "apihelp-watch-example-watch": "監視頁面 <kbd>Main Page</kbd>。",
        "apihelp-format-example-generic": "以 $1 格式傳回查詢結果。",
        "apihelp-json-summary": "使用 JSON 格式輸出資料。",
        "apihelp-jsonfm-summary": "使用 JSON 格式輸出資料 (使用 HTML 格式顯示)。",
        "api-help-flag-writerights": "此模組需要寫入權限。",
        "api-help-flag-mustbeposted": "此模組僅接受 POST 請求。",
        "api-help-flag-generator": "此模組可作為產生器使用。",
+       "api-help-source": "來源:$1",
+       "api-help-source-unknown": "來源:<span class=\"apihelp-unknown\">未知</span>",
        "api-help-license": "協定:[[$1|$2]]",
        "api-help-license-noname": "協定:[[$1|查看連結]]",
        "api-help-license-unknown": "協定:<span class=\"apihelp-unknown\">未知</span>",
        "api-help-param-required": "此參數為必填。",
        "api-help-datatypes-header": "資料類型",
        "api-help-datatypes": "至MediaWiki的輸入值應為NFC標準化的UTF-8。MediaWiki可以嘗試轉換其他輸入值,但這可能導致一些操作失敗(例如附帶MD5檢查的[[Special:ApiHelp/edit|編輯]])。\n\n一些在API請求中的參數類型需要更進一步解釋:\n;boolean\n:布林參數產生作用就像HTML複選框一樣:如果參數被指定,無論何值都被視為真(true)。如果要假值(false),則必須省略參數。\n;timestamp\n:時間戳記可被指定為多種格式。推荐使用ISO 8601日期和時間標準。所有時間為UTC時間,包含的任何時區都會被忽略。\n:* ISO 8601日期和時間,<kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd>(標點和<kbd>Z</kbd>為選用)\n:* 帶小數秒(會被忽略)的ISO 8601日期和時間,<kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd>(破折號、冒號和<kbd>Z</kbd>為選用)\n:* MediaWiki格式,<kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* 一般數字格式,<kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>(<kbd>GMT</kbd>、<kbd>+<var>##</var></kbd>或<kbd>-<var>##</var></kbd>的選用時區會被忽略)\n:* EXIF格式,<kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 2822格式(時區可省略),<kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 850格式(時區可省略),<kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime格式,<kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* 從1970-01-01T00:00:00Z開始的秒數,作為1到13位數的整數(除了<kbd>0</kbd>)\n:* 字串<kbd>now</kbd>\n;替代多值分隔符號\n:使用多個值的參數通常會與垂直線符號(|)分隔的值一起提交,例如<kbd>param=value1|value2</kbd>或<kbd>param=value1%7Cvalue2</kbd>。如果值必須包含垂直線符號,使用U+001F(單位分隔符號)作為分隔符號,''並且''在值前加前綴U+001F,例如<kbd>param=%1Fvalue1%1Fvalue2</kbd>。",
+       "api-help-templatedparams-header": "模板參數",
        "api-help-param-type-limit": "類型:整數或<kbd>max</kbd>",
        "api-help-param-type-integer": "類型:{{PLURAL:$1|1=整數|2=整數列表}}",
        "api-help-param-type-boolean": "類型:布林值([[Special:ApiHelp/main#main/datatypes|詳細資訊]])",
        "api-help-authmanagerhelper-returnurl": "為第三方身份驗證流程傳回URL,必須為絕對值。需要此值或<var>$1continue</var>兩者之一。\n\n在接收<samp>REDIRECT</samp>回應時,一般狀況下您將打開瀏覽器或網站瀏覽功能到特定的<samp>redirecttarget</samp> URL以進行第三方身份驗證流程。當它完成時,第三方會將瀏覽器或網站瀏覽功能送至此URL。您應當提取任何來自URL的查詢或POST參數,並將之作為<var>$1continue</var>請求傳遞至此API模組。",
        "api-help-authmanagerhelper-continue": "此請求是在先前的<samp>UI</samp>或<samp>REDIRECT</samp>回應之後的後續動作。必須為此值或<var>$1returnurl</var>。",
        "api-help-authmanagerhelper-additional-params": "此模組允許額外參數,取決於可用的身份驗證請求。使用<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>与<kbd>amirequestsfor=$1</kbd>(或之前來自此模組的回應,如果合適)以決定可用請求及其使用的欄位。",
+       "apierror-badip": "IP 參數無效。",
+       "apierror-badmd5": "提供的 MD5 雜湊不正確。",
+       "apierror-badquery": "無效的查詢。",
+       "apierror-copyuploadbadurl": "不允許從此 URL 來上傳。",
+       "apierror-filedoesnotexist": "檔案不存在。",
+       "apierror-filenopath": "無法取得本地端檔案路徑。",
+       "apierror-import-unknownerror": "未知的匯入錯誤:$1",
+       "apierror-invalidsha1hash": "所提供的 SHA1 雜湊無效。",
        "apierror-missingparam": "<var>$1</var>參數必須被設定。",
+       "apierror-missingtitle": "您所指定的頁面不存在。",
        "apierror-mustbeloggedin-changeauth": "必須登入,才能變更身分核對資取。",
+       "apierror-mustbeloggedin-generic": "您必須登入。",
        "apierror-mustbeloggedin-removeauth": "必須登入,才能移除身分核對資取。",
+       "apierror-nodeleteablefile": "沒有這樣檔案的舊版本。",
+       "apierror-noedit-anon": "匿名使用者不可編輯頁面。",
+       "apierror-noedit": "您沒有權限來編輯頁面。",
+       "apierror-nouploadmodule": "未設定上傳模組。",
        "apierror-permissiondenied": "您沒有權限$1。",
+       "apierror-permissiondenied-unblock": "您沒有權限來解封使用者。",
+       "apierror-readonly": "Wiki 目前為唯讀模式。",
        "apierror-reauthenticate": "於本工作階段還未核對身分,請重新核對。",
        "apierror-timeout": "伺服器未有在預計的時間內回應。",
+       "apierror-unknownerror-editpage": "不明編輯頁面錯誤:$1。",
+       "apierror-unknownerror-nocode": "不明錯誤。",
+       "apierror-unknownerror": "不明錯誤:\"$1\"。",
+       "apierror-unknownformat": "無法識別的格式\"$1\"。",
+       "apierror-upload-missingresult": "狀態資料裡沒有結果。",
        "api-feed-error-title": "錯誤($1)",
        "api-credits-header": "製作群",
        "api-credits": "API 開發人員:\n* Roan Kattouw (首席開發者 Sep 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (創立者,首席開發者 Sep 2006–Sep 2007)\n* Brad Jorsch (首席開發者 2013–present)\n\n請傳送您的評論、建議以及問題至 mediawiki-api@lists.wikimedia.org\n或者回報問題至 https://phabricator.wikimedia.org/。"
index d3fd5fc..ab7ba0f 100644 (file)
@@ -2408,15 +2408,15 @@ class AuthManager implements LoggerAwareInterface {
         * @param bool $useContextLang Use 'uselang' to set the user's language
         */
        private function setDefaultUserOptions( User $user, $useContextLang ) {
-               global $wgContLang;
-
                $user->setToken();
 
-               $lang = $useContextLang ? \RequestContext::getMain()->getLanguage() : $wgContLang;
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+
+               $lang = $useContextLang ? \RequestContext::getMain()->getLanguage() : $contLang;
                $user->setOption( 'language', $lang->getPreferredVariant() );
 
-               if ( $wgContLang->hasVariants() ) {
-                       $user->setOption( 'variant', $wgContLang->getPreferredVariant() );
+               if ( $contLang->hasVariants() ) {
+                       $user->setOption( 'variant', $contLang->getPreferredVariant() );
                }
        }
 
index f8cd754..3a89066 100644 (file)
@@ -91,7 +91,6 @@ class HTMLFileCache extends FileCacheBase {
         * @return bool
         */
        public static function useFileCache( IContextSource $context, $mode = self::MODE_NORMAL ) {
-               global $wgContLang;
                $config = MediaWikiServices::getInstance()->getMainConfig();
 
                if ( !$config->get( 'UseFileCache' ) && $mode !== self::MODE_REBUILD ) {
@@ -124,7 +123,8 @@ class HTMLFileCache extends FileCacheBase {
                $ulang = $context->getLanguage();
 
                // Check that there are no other sources of variation
-               if ( $user->getId() || !$ulang->equals( $wgContLang ) ) {
+               if ( $user->getId() ||
+                       !$ulang->equals( MediaWikiServices::getInstance()->getContentLanguage() ) ) {
                        return false;
                }
 
@@ -145,7 +145,6 @@ class HTMLFileCache extends FileCacheBase {
         * @return void
         */
        public function loadFromFileCache( IContextSource $context, $mode = self::MODE_NORMAL ) {
-               global $wgContLang;
                $config = MediaWikiServices::getInstance()->getMainConfig();
 
                wfDebug( __METHOD__ . "()\n" );
@@ -158,7 +157,8 @@ class HTMLFileCache extends FileCacheBase {
 
                $context->getOutput()->sendCacheControl();
                header( "Content-Type: {$config->get( 'MimeType' )}; charset=UTF-8" );
-               header( "Content-Language: {$wgContLang->getHtmlCode()}" );
+               header( 'Content-Language: ' .
+                       MediaWikiServices::getInstance()->getContentLanguage()->getHtmlCode() );
                if ( $this->useGzip() ) {
                        if ( wfClientAcceptsGzip() ) {
                                header( 'Content-Encoding: gzip' );
index 30d105b..c1aef59 100644 (file)
@@ -222,8 +222,7 @@ class LinkBatch {
                        return false;
                }
 
-               global $wgContLang;
-               if ( !$wgContLang->needsGenderDistinction() ) {
+               if ( !MediaWikiServices::getInstance()->getContentLanguage()->needsGenderDistinction() ) {
                        return false;
                }
 
index 7a172be..5c14818 100644 (file)
@@ -88,6 +88,8 @@ class MessageCache {
        protected $clusterCache;
        /** @var BagOStuff */
        protected $srvCache;
+       /** @var Language */
+       protected $contLang;
 
        /**
         * Singleton instance
@@ -112,7 +114,8 @@ class MessageCache {
                                        ? MediaWikiServices::getInstance()->getLocalServerObjectCache()
                                        : new EmptyBagOStuff(),
                                $wgUseDatabaseMessages,
-                               $wgMsgCacheExpiry
+                               $wgMsgCacheExpiry,
+                               MediaWikiServices::getInstance()->getContentLanguage()
                        );
                }
 
@@ -135,13 +138,11 @@ class MessageCache {
         * @return string Normalized message key
         */
        public static function normalizeKey( $key ) {
-               global $wgContLang;
-
                $lckey = strtr( $key, ' ', '_' );
                if ( ord( $lckey ) < 128 ) {
                        $lckey[0] = strtolower( $lckey[0] );
                } else {
-                       $lckey = $wgContLang->lcfirst( $lckey );
+                       $lckey = MediaWikiServices::getInstance()->getContentLanguage()->lcfirst( $lckey );
                }
 
                return $lckey;
@@ -153,13 +154,15 @@ class MessageCache {
         * @param BagOStuff $serverCache
         * @param bool $useDB Whether to look for message overrides (e.g. MediaWiki: pages)
         * @param int $expiry Lifetime for cache. @see $mExpiry.
+        * @param Language|null $contLang Content language of site
         */
        public function __construct(
                WANObjectCache $wanCache,
                BagOStuff $clusterCache,
                BagOStuff $serverCache,
                $useDB,
-               $expiry
+               $expiry,
+               Language $contLang = null
        ) {
                $this->wanCache = $wanCache;
                $this->clusterCache = $clusterCache;
@@ -169,6 +172,7 @@ class MessageCache {
 
                $this->mDisable = !$useDB;
                $this->mExpiry = $expiry;
+               $this->contLang = $contLang ?? MediaWikiServices::getInstance()->getContentLanguage();
        }
 
        /**
@@ -581,7 +585,7 @@ class MessageCache {
                // (b) Update the shared caches in a deferred update with a fresh DB snapshot
                DeferredUpdates::addCallableUpdate(
                        function () use ( $title, $msg, $code ) {
-                               global $wgContLang, $wgMaxMsgCacheEntrySize;
+                               global $wgMaxMsgCacheEntrySize;
                                // Allow one caller at a time to avoid race conditions
                                $scopedLock = $this->getReentrantScopedLock(
                                        $this->clusterCache->makeKey( 'messages', $code )
@@ -627,7 +631,7 @@ class MessageCache {
                                // Purge the message in the message blob store
                                $resourceloader = RequestContext::getMain()->getOutput()->getResourceLoader();
                                $blobStore = $resourceloader->getMessageBlobStore();
-                               $blobStore->updateMessage( $wgContLang->lcfirst( $msg ) );
+                               $blobStore->updateMessage( $this->contLang->lcfirst( $msg ) );
 
                                Hooks::run( 'MessageCacheReplace', [ $title, $text ] );
                        },
@@ -860,8 +864,6 @@ class MessageCache {
         * @return string|bool The message, or false if not found
         */
        protected function getMessageFromFallbackChain( $lang, $lckey, $useDB ) {
-               global $wgContLang;
-
                $alreadyTried = [];
 
                // First try the requested language.
@@ -871,7 +873,7 @@ class MessageCache {
                }
 
                // Now try checking the site language.
-               $message = $this->getMessageForLang( $wgContLang, $lckey, $useDB, $alreadyTried );
+               $message = $this->getMessageForLang( $this->contLang, $lckey, $useDB, $alreadyTried );
                return $message;
        }
 
@@ -886,13 +888,11 @@ class MessageCache {
         * @return string|bool The message, or false if not found
         */
        private function getMessageForLang( $lang, $lckey, $useDB, &$alreadyTried ) {
-               global $wgContLang;
-
                $langcode = $lang->getCode();
 
                // Try checking the database for the requested language
                if ( $useDB ) {
-                       $uckey = $wgContLang->ucfirst( $lckey );
+                       $uckey = $this->contLang->ucfirst( $lckey );
 
                        if ( !isset( $alreadyTried[$langcode] ) ) {
                                $message = $this->getMsgFromNamespace(
@@ -1241,8 +1241,6 @@ class MessageCache {
         * @return array Array of message keys (strings)
         */
        public function getAllMessageKeys( $code ) {
-               global $wgContLang;
-
                $this->load( $code );
                if ( !$this->cache->has( $code ) ) {
                        // Apparently load() failed
@@ -1257,7 +1255,7 @@ class MessageCache {
                $cache = array_diff( $cache, [ '!NONEXISTENT' ] );
 
                // Keys may appear with a capital first letter. lcfirst them.
-               return array_map( [ $wgContLang, 'lcfirst' ], array_keys( $cache ) );
+               return array_map( [ $this->contLang, 'lcfirst' ], array_keys( $cache ) );
        }
 
        /**
@@ -1268,8 +1266,6 @@ class MessageCache {
         * @since 1.29
         */
        public function updateMessageOverride( Title $title, Content $content = null ) {
-               global $wgContLang;
-
                $msgText = $this->getMessageTextFromContent( $content );
                if ( $msgText === null ) {
                        $msgText = false; // treat as not existing
@@ -1277,8 +1273,8 @@ class MessageCache {
 
                $this->replace( $title->getDBkey(), $msgText );
 
-               if ( $wgContLang->hasVariants() ) {
-                       $wgContLang->updateConversionTable( $title );
+               if ( $this->contLang->hasVariants() ) {
+                       $this->contLang->updateConversionTable( $title );
                }
        }
 
index b1ccdc2..25b3d94 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @since 1.16.3
  * @author Tim Starling
@@ -46,13 +48,12 @@ abstract class Collation {
         * @return Collation
         */
        public static function factory( $collationName ) {
-               global $wgContLang;
-
                switch ( $collationName ) {
                        case 'uppercase':
                                return new UppercaseCollation;
                        case 'numeric':
-                               return new NumericUppercaseCollation( $wgContLang );
+                               return new NumericUppercaseCollation(
+                                       MediaWikiServices::getInstance()->getContentLanguage() );
                        case 'identity':
                                return new IdentityCollation;
                        case 'uca-default':
index 46e7f38..8e5871b 100644 (file)
@@ -18,6 +18,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Collation class that's essentially a no-op.
  *
@@ -33,12 +35,11 @@ class IdentityCollation extends Collation {
        }
 
        public function getFirstLetter( $string ) {
-               global $wgContLang;
                // Copied from UppercaseCollation.
                // I'm kind of unclear on when this could happen...
                if ( $string[0] == "\0" ) {
                        $string = substr( $string, 1 );
                }
-               return $wgContLang->firstChar( $string );
+               return MediaWikiServices::getInstance()->getContentLanguage()->firstChar( $string );
        }
 }
index 4a2d776..d249640 100644 (file)
@@ -35,7 +35,7 @@
 class NumericUppercaseCollation extends UppercaseCollation {
 
        /**
-        * @var $digitTransformLang Language How to convert digits (usually $wgContLang)
+        * @var $digitTransformLang Language How to convert digits (usually the content language)
         */
        private $digitTransformLang;
 
@@ -43,7 +43,7 @@ class NumericUppercaseCollation extends UppercaseCollation {
         * @param Language $lang How to convert digits.
         *  For example, if given language "my" than ၇ is treated like 7.
         *
-        * It is expected that usually this is given $wgContLang.
+        * It is expected that usually this is given the content language.
         */
        public function __construct( Language $lang ) {
                $this->digitTransformLang = $lang;
index 79bbba8..004e38a 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
 use MediaWiki\Search\ParserOutputSearchDataExtractor;
 
 /**
@@ -642,7 +643,7 @@ abstract class ContentHandler {
        /**
         * Get the language in which the content of the given page is written.
         *
-        * This default implementation just returns $wgContLang (except for pages
+        * This default implementation just returns the content language (except for pages
         * in the MediaWiki namespace)
         *
         * Note that the pages language is not cacheable, since it may in some
@@ -659,8 +660,8 @@ abstract class ContentHandler {
         * @return Language The page's language
         */
        public function getPageLanguage( Title $title, Content $content = null ) {
-               global $wgContLang, $wgLang;
-               $pageLang = $wgContLang;
+               global $wgLang;
+               $pageLang = MediaWikiServices::getInstance()->getContentLanguage();
 
                if ( $title->getNamespace() == NS_MEDIAWIKI ) {
                        // Parse mediawiki messages with correct target language
index c058296..20bce37 100644 (file)
@@ -25,6 +25,8 @@
  * @author Daniel Kinzler
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Content object implementation for representing flat text.
  *
@@ -71,13 +73,10 @@ class TextContent extends AbstractContent {
        }
 
        public function getTextForSummary( $maxlength = 250 ) {
-               global $wgContLang;
-
                $text = $this->getNativeData();
 
-               $truncatedtext = $wgContLang->truncateForDatabase(
-                       preg_replace( "/[\n\r]/", ' ', $text ),
-                       max( 0, $maxlength ) );
+               $truncatedtext = MediaWikiServices::getInstance()->getContentLanguage()->
+                       truncateForDatabase( preg_replace( "/[\n\r]/", ' ', $text ), max( 0, $maxlength ) );
 
                return $truncatedtext;
        }
@@ -195,20 +194,18 @@ class TextContent extends AbstractContent {
         *
         * @param Content $that The other content object to compare this content object to.
         * @param Language|null $lang The language object to use for text segmentation.
-        *    If not given, $wgContentLang is used.
+        *    If not given, the content language is used.
         *
         * @return Diff A diff representing the changes that would have to be
         *    made to this content object to make it equal to $that.
         */
        public function diff( Content $that, Language $lang = null ) {
-               global $wgContLang;
-
                $this->checkModelID( $that->getModel() );
 
                // @todo could implement this in DifferenceEngine and just delegate here?
 
                if ( !$lang ) {
-                       $lang = $wgContLang;
+                       $lang = MediaWikiServices::getInstance()->getContentLanguage();
                }
 
                $otext = $this->getNativeData();
index 21947d2..a7021b1 100644 (file)
@@ -35,6 +35,12 @@ use MediaWiki\MediaWikiServices;
 class WikitextContent extends TextContent {
        private $redirectTargetAndText = null;
 
+       /**
+        * @var bool Tracks if the parser set the user-signature flag when creating this content, which
+        *   would make it expire faster in ApiStashEdit.
+        */
+       private $hadSignature = false;
+
        public function __construct( $text ) {
                parent::__construct( $text, CONTENT_MODEL_WIKITEXT );
        }
@@ -140,7 +146,17 @@ class WikitextContent extends TextContent {
                $text = $this->getNativeData();
                $pst = $wgParser->preSaveTransform( $text, $title, $user, $popts );
 
-               return ( $text === $pst ) ? $this : new static( $pst );
+               if ( $text === $pst ) {
+                       return $this;
+               }
+
+               $ret = new static( $pst );
+
+               if ( $wgParser->getOutput()->getFlag( 'user-signature' ) ) {
+                       $ret->hadSignature = true;
+               }
+
+               return $ret;
        }
 
        /**
@@ -337,6 +353,11 @@ class WikitextContent extends TextContent {
                                $output->addModuleStyles( 'mediawiki.action.view.redirectPage' );
                        }
                }
+
+               // Pass along user-signature flag
+               if ( $this->hadSignature ) {
+                       $output->setFlag( 'user-signature' );
+               }
        }
 
        /**
index 7563330..16c304c 100644 (file)
@@ -325,8 +325,6 @@ class RequestContext implements IContextSource, MutableContext {
                } elseif ( $this->lang === null ) {
                        $this->recursion = true;
 
-                       global $wgContLang;
-
                        try {
                                $request = $this->getRequest();
                                $user = $this->getUser();
@@ -340,7 +338,7 @@ class RequestContext implements IContextSource, MutableContext {
                                Hooks::run( 'UserGetLanguageObject', [ $user, &$code, $this ] );
 
                                if ( $code === $this->getConfig()->get( 'LanguageCode' ) ) {
-                                       $this->lang = $wgContLang;
+                                       $this->lang = MediaWikiServices::getInstance()->getContentLanguage();
                                } else {
                                        $obj = Language::factory( $code );
                                        $this->lang = $obj;
index f4f04f1..4977762 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup Database
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\Blob;
 use Wikimedia\Rdbms\ResultWrapper;
@@ -446,8 +447,6 @@ class DatabaseOracle extends Database {
         * @throws DBUnexpectedError
         */
        private function insertOneRow( $table, $row, $fname ) {
-               global $wgContLang;
-
                $table = $this->tableName( $table );
                // "INSERT INTO tables (a, b, c)"
                $sql = "INSERT INTO " . $table . " (" . implode( ',', array_keys( $row ) ) . ')';
@@ -493,7 +492,8 @@ class DatabaseOracle extends Database {
                                        $val = $this->getInfinity();
                                }
 
-                               $val = ( $wgContLang != null ) ? $wgContLang->checkTitleEncoding( $val ) : $val;
+                               $val = MediaWikiServices::getInstance()->getContentLanguage()->
+                                       checkTitleEncoding( $val );
                                if ( oci_bind_by_name( $stmt, ":$col", $val, -1, SQLT_CHR ) === false ) {
                                        $e = oci_error( $stmt );
                                        $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
@@ -1067,9 +1067,9 @@ class DatabaseOracle extends Database {
        }
 
        function addQuotes( $s ) {
-               global $wgContLang;
-               if ( isset( $wgContLang->mLoaded ) && $wgContLang->mLoaded ) {
-                       $s = $wgContLang->checkTitleEncoding( $s );
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+               if ( isset( $contLang->mLoaded ) && $contLang->mLoaded ) {
+                       $s = $contLang->checkTitleEncoding( $s );
                }
 
                return "'" . $this->strencode( $s ) . "'";
@@ -1092,15 +1092,15 @@ class DatabaseOracle extends Database {
        }
 
        private function wrapFieldForWhere( $table, &$col, &$val ) {
-               global $wgContLang;
-
                $col_info = $this->fieldInfoMulti( $table, $col );
                $col_type = $col_info != false ? $col_info->type() : 'CONSTANT';
                if ( $col_type == 'CLOB' ) {
                        $col = 'TO_CHAR(' . $col . ')';
-                       $val = $wgContLang->checkTitleEncoding( $val );
+                       $val =
+                               MediaWikiServices::getInstance()->getContentLanguage()->checkTitleEncoding( $val );
                } elseif ( $col_type == 'VARCHAR2' ) {
-                       $val = $wgContLang->checkTitleEncoding( $val );
+                       $val =
+                               MediaWikiServices::getInstance()->getContentLanguage()->checkTitleEncoding( $val );
                }
        }
 
@@ -1225,8 +1225,6 @@ class DatabaseOracle extends Database {
         * @throws DBUnexpectedError
         */
        function update( $table, $values, $conds, $fname = __METHOD__, $options = [] ) {
-               global $wgContLang;
-
                $table = $this->tableName( $table );
                $opts = $this->makeUpdateOptions( $options );
                $sql = "UPDATE $opts $table SET ";
@@ -1270,7 +1268,8 @@ class DatabaseOracle extends Database {
                                        $val = '31-12-2030 12:00:00.000000';
                                }
 
-                               $val = ( $wgContLang != null ) ? $wgContLang->checkTitleEncoding( $val ) : $val;
+                               $val = MediaWikiServices::getInstance()->getContentLanguage()->
+                                       checkTitleEncoding( $val );
                                if ( oci_bind_by_name( $stmt, ":$col", $val ) === false ) {
                                        $e = oci_error( $stmt );
                                        $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
index 141888c..ae3c660 100644 (file)
@@ -581,12 +581,13 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
         * @return array
         */
        private function getCategoryInsertions( $existing = [] ) {
-               global $wgContLang, $wgCategoryCollation;
+               global $wgCategoryCollation;
                $diffs = array_diff_assoc( $this->mCategories, $existing );
                $arr = [];
                foreach ( $diffs as $name => $prefix ) {
                        $nt = Title::makeTitleSafe( NS_CATEGORY, $name );
-                       $wgContLang->findVariantLink( $name, $nt, true );
+                       MediaWikiServices::getInstance()->getContentLanguage()->
+                               findVariantLink( $name, $nt, true );
 
                        $type = MWNamespace::getCategoryLinkType( $this->mTitle->getNamespace() );
 
index 0d1de1a..105877b 100644 (file)
@@ -117,15 +117,14 @@ class SearchUpdate implements DeferrableUpdate {
         * @return string
         */
        public function updateText( $text, SearchEngine $se = null ) {
-               global $wgContLang;
-
                # Language-specific strip/conversion
-               $text = $wgContLang->normalizeForSearch( $text );
+               $text = MediaWikiServices::getInstance()->getContentLanguage()->normalizeForSearch( $text );
                $se = $se ?: MediaWikiServices::getInstance()->newSearchEngine();
                $lc = $se->legalSearchChars() . '&#;';
 
+               # Strip HTML markup
                $text = preg_replace( "/<\\/?\\s*[A-Za-z][^>]*?>/",
-                       ' ', $wgContLang->lc( " " . $text . " " ) ); # Strip HTML markup
+                       ' ', MediaWikiServices::getInstance()->getContentLanguage()->lc( " " . $text . " " ) );
                $text = preg_replace( "/(^|\\n)==\\s*([^\\n]+)\\s*==(\\s)/sD",
                        "\\1\\2 \\2 \\2\\3", $text ); # Emphasize headings
 
@@ -200,15 +199,13 @@ class SearchUpdate implements DeferrableUpdate {
         * @return string A stripped-down title string ready for the search index
         */
        private function getNormalizedTitle( SearchEngine $search ) {
-               global $wgContLang;
-
                $ns = $this->title->getNamespace();
                $title = $this->title->getText();
 
                $lc = $search->legalSearchChars() . '&#;';
-               $t = $wgContLang->normalizeForSearch( $title );
+               $t = MediaWikiServices::getInstance()->getContentLanguage()->normalizeForSearch( $title );
                $t = preg_replace( "/[^{$lc}]+/", ' ', $t );
-               $t = $wgContLang->lc( $t );
+               $t = MediaWikiServices::getInstance()->getContentLanguage()->lc( $t );
 
                # Handle 's, s'
                $t = preg_replace( "/([{$lc}]+)'s( |$)/", "\\1 \\1's ", $t );
index aa0a1f7..5138655 100644 (file)
@@ -992,8 +992,6 @@ class DifferenceEngine extends ContextSource {
         * @return bool|string
         */
        protected function textDiff( $otext, $ntext ) {
-               global $wgContLang;
-
                $otext = str_replace( "\r\n", "\n", $otext );
                $ntext = str_replace( "\r\n", "\n", $ntext );
 
@@ -1067,11 +1065,12 @@ class DifferenceEngine extends ContextSource {
                }
 
                # Native PHP diff
-               $ota = explode( "\n", $wgContLang->segmentForDiff( $otext ) );
-               $nta = explode( "\n", $wgContLang->segmentForDiff( $ntext ) );
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+               $ota = explode( "\n", $contLang->segmentForDiff( $otext ) );
+               $nta = explode( "\n", $contLang->segmentForDiff( $ntext ) );
                $diffs = new Diff( $ota, $nta );
                $formatter = new TableDiffFormatter();
-               $difftext = $wgContLang->unsegmentForDiff( $formatter->format( $diffs ) );
+               $difftext = $contLang->unsegmentForDiff( $formatter->format( $diffs ) );
                $difftext .= $this->debug( 'native PHP' );
 
                return $difftext;
index e1c12de..e6f1fd7 100644 (file)
@@ -23,6 +23,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @ingroup Dump
  */
@@ -38,7 +40,6 @@ class XmlDumpWriter {
         * @return string
         */
        function openStream() {
-               global $wgContLang;
                $ver = WikiExporter::schemaVersion();
                return Xml::element( 'mediawiki', [
                        'xmlns'              => "http://www.mediawiki.org/xml/export-$ver/",
@@ -55,8 +56,8 @@ class XmlDumpWriter {
                         */
                        'xsi:schemaLocation' => "http://www.mediawiki.org/xml/export-$ver/ " .
                                "http://www.mediawiki.org/xml/export-$ver.xsd",
-                       'version'            => $ver,
-                       'xml:lang'           => $wgContLang->getHtmlCode() ],
+                       'version' => $ver,
+                       'xml:lang' => MediaWikiServices::getInstance()->getContentLanguage()->getHtmlCode() ],
                        null ) .
                        "\n" .
                        $this->siteInfo();
@@ -123,9 +124,11 @@ class XmlDumpWriter {
         * @return string
         */
        function namespaces() {
-               global $wgContLang;
                $spaces = "<namespaces>\n";
-               foreach ( $wgContLang->getFormattedNamespaces() as $ns => $title ) {
+               foreach (
+                       MediaWikiServices::getInstance()->getContentLanguage()->getFormattedNamespaces()
+                       as $ns => $title
+               ) {
                        $spaces .= '      ' .
                                Xml::element( 'namespace',
                                        [
@@ -434,8 +437,8 @@ class XmlDumpWriter {
                        return $title->getPrefixedText();
                }
 
-               global $wgContLang;
-               $prefix = $wgContLang->getFormattedNsText( $title->getNamespace() );
+               $prefix = MediaWikiServices::getInstance()->getContentLanguage()->
+                       getFormattedNsText( $title->getNamespace() );
 
                // @todo Emit some kind of warning to the user if $title->getNamespace() !==
                // NS_MAIN and $prefix === '' (viz. pages in an unregistered namespace)
index 3d9a904..858e124 100644 (file)
@@ -7,6 +7,8 @@
  * @details
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Base code for file repositories.
  *
@@ -638,11 +640,10 @@ class FileRepo {
         * @return string
         */
        public function getNameFromTitle( Title $title ) {
-               global $wgContLang;
                if ( $this->initialCapital != MWNamespace::isCapitalized( NS_FILE ) ) {
                        $name = $title->getUserCaseDBKey();
                        if ( $this->initialCapital ) {
-                               $name = $wgContLang->ucfirst( $name );
+                               $name = MediaWikiServices::getInstance()->getContentLanguage()->ucfirst( $name );
                        }
                } else {
                        $name = $title->getDBkey();
@@ -1350,7 +1351,7 @@ class FileRepo {
        }
 
        /**
-        * Checks existence of a file
+        * Checks existence of a file
         *
         * @param string $file Virtual URL (or storage path) of file to check
         * @return bool
index 9a6ef22..789ed4c 100644 (file)
@@ -278,7 +278,6 @@ class LocalRepo extends FileRepo {
                $applyMatchingFiles = function ( ResultWrapper $res, &$searchSet, &$finalFiles )
                        use ( $fileMatchesSearch, $flags )
                {
-                       global $wgContLang;
                        $info = $this->getInfo();
                        foreach ( $res as $row ) {
                                $file = $this->newFileFromRow( $row );
@@ -287,7 +286,8 @@ class LocalRepo extends FileRepo {
                                $dbKeysLook = [ strtr( $file->getName(), ' ', '_' ) ];
                                if ( !empty( $info['initialCapital'] ) ) {
                                        // Search keys for "hi.png" and "Hi.png" should use the "Hi.png file"
-                                       $dbKeysLook[] = $wgContLang->lcfirst( $file->getName() );
+                                       $dbKeysLook[] = MediaWikiServices::getInstance()->getContentLanguage()->
+                                               lcfirst( $file->getName() );
                                }
                                foreach ( $dbKeysLook as $dbKey ) {
                                        if ( isset( $searchSet[$dbKey] )
index 0e48195..2ed4853 100644 (file)
@@ -355,9 +355,8 @@ class ForeignAPIFile extends File {
        }
 
        function purgeDescriptionPage() {
-               global $wgContLang;
-
-               $url = $this->repo->getDescriptionRenderUrl( $this->getName(), $wgContLang->getCode() );
+               $url = $this->repo->getDescriptionRenderUrl(
+                       $this->getName(), MediaWikiServices::getInstance()->getContentLanguage()->getCode() );
                $key = $this->repo->getLocalCacheKey( 'RemoteFileDescription', 'url', md5( $url ) );
 
                MediaWikiServices::getInstance()->getMainWANObjectCache()->delete( $key );
index 09e40a2..6e8c8c9 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Image gallery
  *
@@ -99,7 +101,6 @@ abstract class ImageGalleryBase extends ContextSource {
         * @throws MWException
         */
        static function factory( $mode = false, IContextSource $context = null ) {
-               global $wgContLang;
                self::loadModes();
                if ( !$context ) {
                        $context = RequestContext::getMainAndWarn( __METHOD__ );
@@ -109,7 +110,7 @@ abstract class ImageGalleryBase extends ContextSource {
                        $mode = $galleryOptions['mode'];
                }
 
-               $mode = $wgContLang->lc( $mode );
+               $mode = MediaWikiServices::getInstance()->getContentLanguage()->lc( $mode );
 
                if ( isset( self::$modeMapping[$mode] ) ) {
                        $class = self::$modeMapping[$mode];
index 479ca5d..5ede631 100644 (file)
@@ -170,8 +170,8 @@ class TraditionalImageGallery extends ImageGalleryBase {
                        }
 
                        // @todo Code is incomplete.
-                       // $linkTarget = Title::newFromText( $wgContLang->getNsText( MWNamespace::getUser() ) .
-                       // ":{$ut}" );
+                       // $linkTarget = Title::newFromText( MediaWikiServices::getInstance()->
+                       // getContentLanguage()->getNsText( MWNamespace::getUser() ) . ":{$ut}" );
                        // $ul = Linker::link( $linkTarget, $ut );
 
                        $meta = [];
index 0ad41d4..93d09e7 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
 use MediaWiki\Widget\TitleInputWidget;
 
 /**
@@ -56,8 +57,8 @@ class HTMLTitleTextField extends HTMLTextField {
                                $title = Title::newFromTextThrow( $value );
                        } else {
                                // Can't use Title::makeTitleSafe(), because it doesn't throw useful exceptions
-                               global $wgContLang;
-                               $namespaceName = $wgContLang->getNsText( $this->mParams['namespace'] );
+                               $namespaceName = MediaWikiServices::getInstance()->getContentLanguage()->
+                                       getNsText( $this->mParams['namespace'] );
                                $title = Title::newFromTextThrow( $namespaceName . ':' . $value );
                        }
                } catch ( MalformedTitleException $e ) {
index e5dacd7..00a7b52 100644 (file)
@@ -24,6 +24,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * XML file reader for the page data importer.
  *
@@ -286,11 +288,10 @@ class WikiImporter {
                                $status->fatal( 'import-rootpage-invalid' );
                        } else {
                                if ( !MWNamespace::hasSubpages( $title->getNamespace() ) ) {
-                                       global $wgContLang;
-
                                        $displayNSText = $title->getNamespace() == NS_MAIN
                                                ? wfMessage( 'blanknamespace' )->text()
-                                               : $wgContLang->getNsText( $title->getNamespace() );
+                                               : MediaWikiServices::getInstance()->getContentLanguage()->
+                                                       getNsText( $title->getNamespace() );
                                        $status->fatal( 'import-rootpage-nosubpage', $displayNSText );
                                } else {
                                        // set namespace to 'all', so the namespace check in processTitle() can pass
index 4f531da..aee51e7 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Deployment
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Class for the core installer command line interface.
  *
@@ -69,9 +71,9 @@ class CliInstaller extends Installer {
                if ( isset( $option['lang'] ) ) {
                        global $wgLang, $wgLanguageCode;
                        $this->setVar( '_UserLang', $option['lang'] );
-                       $wgContLang = Language::factory( $option['lang'] );
-                       $wgLang = Language::factory( $option['lang'] );
                        $wgLanguageCode = $option['lang'];
+                       $wgContLang = MediaWikiServices::getInstance()->getContentLanguage();
+                       $wgLang = Language::factory( $option['lang'] );
                        RequestContext::getMain()->setLanguage( $wgLang );
                }
 
index 99d6b35..ac0a520 100644 (file)
@@ -756,8 +756,9 @@ class MysqlUpdater extends DatabaseUpdater {
                        'Converting links and brokenlinks tables to pagelinks'
                );
 
-               global $wgContLang;
-               foreach ( $wgContLang->getNamespaces() as $ns => $name ) {
+               foreach (
+                       MediaWikiServices::getInstance()->getContentLanguage()->getNamespaces() as $ns => $name
+               ) {
                        if ( $ns == 0 ) {
                                continue;
                        }
index 739d9f2..d8281b0 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Deployment
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Class for the core installer web interface.
  *
@@ -500,14 +502,14 @@ class WebInstaller extends Installer {
 
                if ( $this->getSession( 'test' ) === null && !$this->request->wasPosted() ) {
                        $wgLanguageCode = $this->getAcceptLanguage();
-                       $wgLang = $wgContLang = Language::factory( $wgLanguageCode );
+                       $wgLang = Language::factory( $wgLanguageCode );
                        RequestContext::getMain()->setLanguage( $wgLang );
                        $this->setVar( 'wgLanguageCode', $wgLanguageCode );
                        $this->setVar( '_UserLang', $wgLanguageCode );
                } else {
                        $wgLanguageCode = $this->getVar( 'wgLanguageCode' );
-                       $wgContLang = Language::factory( $wgLanguageCode );
                }
+               $wgContLang = MediaWikiServices::getInstance()->getContentLanguage();
        }
 
        /**
index 09fc0f3..8314fd2 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Deployment
  */
 
+use MediaWiki\MediaWikiServices;
+
 class WebInstallerName extends WebInstallerPage {
 
        /**
@@ -186,8 +188,7 @@ class WebInstallerName extends WebInstallerPage {
                }
 
                // Make sure it won't conflict with any existing namespaces
-               global $wgContLang;
-               $nsIndex = $wgContLang->getNsIndex( $name );
+               $nsIndex = MediaWikiServices::getInstance()->getContentLanguage()->getNsIndex( $name );
                if ( $nsIndex !== false && $nsIndex !== NS_PROJECT ) {
                        $this->parent->showError( 'config-ns-conflict', $name );
                        $retVal = false;
index 2afd2ca..94abdba 100644 (file)
@@ -7,7 +7,8 @@
                        "Thomsen",
                        "MGA73",
                        "Mads Haupt",
-                       "Joedalton"
+                       "Joedalton",
+                       "Saederup92"
                ]
        },
        "config-desc": "Installationsprogrammet til MediaWiki",
@@ -53,7 +54,7 @@
        "config-db-install-username": "Indtast brugernavnet som vil blive brugt til at forbinde til databasen under installationsprocessen.\nDette er ikke brugernavnet for MediaWiki-kontoen; det er brugernavnet på din database.",
        "config-mysql-old": "MySQL $1 eller nyere kræves. Du har $2.",
        "config-type-mssql": "Microsoft SQL-server",
-       "config-header-mysql": "MySQL-indstillinger",
+       "config-header-mysql": "MariaDB/MySQL-indstillinger",
        "config-header-postgres": "PostgreSQL-indstillinger",
        "config-header-sqlite": "SQLite-indstillinger",
        "config-header-oracle": "Oracle-indstillinger",
@@ -78,6 +79,6 @@
        "config-upload-deleted": "Mappe for slettede filer:",
        "config-help": "hjælp",
        "config-help-tooltip": "klik for at udvide",
-       "mainpagetext": "'''MediaWiki er nu installeret.'''",
+       "mainpagetext": "<strong>MediaWiki er nu installeret.</strong>",
        "mainpagedocfooter": "Se [https://meta.wikimedia.org/wiki/Help:Contents brugervejledningen] for oplysninger om brugen af wikiprogrammellet.\n\n== At komme i gang ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Listen over opsætningsmuligheder]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki ofte stillede spørgsmål]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Postliste angående udgivelser af MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Oversæt MediaWiki til dit sprog]"
 }
index 0a7d1f0..b526d5a 100644 (file)
        "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki supporta le sequente systemas de base de datos:\n\n$1\n\nSi tu non vide hic infra le systema de base de datos que tu tenta usar, alora seque le instructiones ligate hic supra pro activar le supporto.",
-       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] es le systema primari pro MediaWiki e le melio supportate. MediaWiki functiona anque con [{{int:version-db-mariadb-url}} MariaDB] e con [{{int:version-db-percona-url}} Percona Server], le quales es compatibile con MySQL. ([https://secure.php.net/manual/en/mysqli.installation.php Como compilar PHP con supporto de MySQL])",
+       "config-dbsupport-mysql": "* [{{int:version-db-mariadb-url}} MariaDB] es le systema primari pro MediaWiki e le melio supportate. MediaWiki functiona anque con [{{int:version-db-mysql-url}} MySQL] e con [{{int:version-db-percona-url}} Percona Server], le quales es compatibile con MariaDB. ([https://secure.php.net/manual/en/mysqli.installation.php Como compilar PHP con supporto de MySQL])",
        "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] es un systema de base de datos popular e open source, alternativa a MySQL. ([https://secure.php.net/manual/en/pgsql.installation.php Como compilar PHP con supporto de PostgreSQL])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] es un systema de base de datos legier que es multo ben supportate. ([https://secure.php.net/manual/en/pdo.installation.php Como compilar PHP con supporto de SQLite], usa PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] es un banca de datos commercial pro interprisas. ([https://secure.php.net/manual/en/oci8.installation.php Como compilar PHP con supporto de OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] es un base de datos de interprisa commercial pro Windows. ([https://secure.php.net/manual/en/sqlsrv.installation.php Como compilar PHP con supporto de SQLSRV])",
-       "config-header-mysql": "Configuration de MySQL",
+       "config-header-mysql": "Configuration de MariaDB/MySQL",
        "config-header-postgres": "Configuration de PostgreSQL",
        "config-header-sqlite": "Configuration de SQLite",
        "config-header-oracle": "Configuration de Oracle",
index d1127d2..c816d4b 100644 (file)
@@ -71,8 +71,8 @@
        "config-mysql-innodb": "InnoDB (препоручено)",
        "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "Тип потврде идентитета:",
-       "config-mssql-sqlauth": "Ð\9fоÑ\82вÑ\80да Ð¸Ð´ÐµÐ½Ñ\82иÑ\82еÑ\82а SQL Server-а",
-       "config-mssql-windowsauth": "Ð\9fоÑ\82вÑ\80да Ð¸Ð´ÐµÐ½Ñ\82иÑ\82еÑ\82а Ð\92индоÑ\83Ñ\81а",
+       "config-mssql-sqlauth": "Ð\90Ñ\83Ñ\82енÑ\82иÑ\84икаÑ\86иÑ\98а Ð·Ð° Ð¡Ð\9aÑ\83Ð\9b Ð¡ÐµÑ\80веÑ\80",
+       "config-mssql-windowsauth": "Ð\90Ñ\83Ñ\82енÑ\82иÑ\84икаÑ\86иÑ\98а Ð·Ð° Ð\92индоÑ\83Ñ\81",
        "config-site-name": "Име викија:",
        "config-site-name-blank": "Унесите име сајта.",
        "config-project-namespace": "Именски простор пројекта:",
        "config-skins-screenshots": "„$1” (снимци екрана: $2)",
        "config-skins-screenshot": "$1 ($2)",
        "config-screenshot": "снимак екрана",
-       "mainpagetext": "<strong>Медијавики је успешно инсталиран.</strong>",
+       "mainpagetext": "<strong>Медијавики је инсталиран.</strong>",
        "mainpagedocfooter": "Погледајте [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents кориснички водич] за коришћење програма.\n\n== Увод ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Помоћ у вези са подешавањима]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Често постављана питања]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописни списак о издањима Медијавикија]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научите како да се борите против спама на својој вики]"
 }
index 9ebbc27..5565354 100644 (file)
        "config-page-upgradedoc": "Яңарту",
        "config-page-existingwiki": "Хәзерге вики",
        "config-restart": "Әйе, яңадан башларга",
+       "config-env-php": "PHP $1 куелды.",
+       "config-env-hhvm": "HHVM $1 куелды.",
        "config-apc": "[https://secure.php.net/apc APC] куелды",
        "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] куелды",
        "config-diff3-bad": "GNU diff3 табылмады.",
        "config-git": "Git юрамалар идарә итү системасы табылды: <code>$1</code>.",
+       "config-using-server": "«<nowiki>$1</nowiki>» сервер исеме файдаланыла.",
+       "config-using-uri": "«<nowiki>$1$2</nowiki>» URL исемле сервер файдаланыла.",
        "config-db-type": "Мәгълүмат базасы төре:",
        "config-db-host": "Мәгълүмат базасы хосты:",
        "config-db-host-oracle": "TNS мәгълүмат базасы:",
+       "config-db-wiki-settings": "Бу вики идентификациясе",
+       "config-db-name": "Мәгълүмат базасы исеме:",
        "config-db-name-oracle": "Мәгълүмат базасы төзелеше:",
        "config-db-username": "Мәгълүмат базасын кулланучы исеме:",
        "config-db-password": "Мәгълүмат базасының серсүзе:",
        "config-db-port": "Мәгълүмат базасы порты:",
        "config-db-schema": "MediaWiki өчен төзелеш:",
-       "config-mysql-innodb": "InnoDB",
+       "config-type-mysql": "MariaDB, MySQL яисә ярашлы",
+       "config-type-mssql": "Microsoft SQL Server",
+       "config-header-mysql": "MariaDB/MySQL көйләнмәләре",
+       "config-header-postgres": "PostgreSQL көйләнмәләре",
+       "config-header-sqlite": "SQLite көйләнмәләре",
+       "config-header-oracle": "Oracle көйләнмәләре",
+       "config-header-mssql": "Microsoft SQL Server көйләнмәләре",
+       "config-invalid-db-type": "Ялган бирелмәләр базасы төре",
+       "config-upgrade-done-no-regenerate": "Яңартү тәмамланды.\n\nХәзер сез [$1 вики] белән эшли аласыз.",
+       "config-regenerate": "LocalSettings.php яңадан төзү →",
+       "config-show-table-status": "«<code>SHOW TABLE STATUS</code>» таләбе эшләнмәде!",
+       "config-mysql-engine": "Саклау системасы:",
+       "config-mysql-innodb": "InnoDB (тәкъдим ителә)",
        "config-mysql-myisam": "MyISAM",
+       "config-mssql-auth": "Аутентификация төре:",
+       "config-mssql-sqlauth": "SQL Server чынлыгын раслау",
+       "config-mssql-windowsauth": "Windows чынлыгын раслау",
+       "config-site-name": "Вики исеме:",
+       "config-site-name-blank": "Сайт исемен языгыз.",
+       "config-project-namespace": "Проектның исемнәр киңлеге:",
        "config-ns-generic": "Проект",
+       "config-ns-site-name": "Вики исеме сыман: $1",
        "config-ns-other": "Башка (күрсәтегез)",
        "config-ns-other-default": "MyWiki",
+       "config-admin-box": "Иларәченең хисап язмасы",
+       "config-admin-name": "Кулланучы исемегез:",
        "config-admin-password": "Серсүз:",
        "config-admin-password-confirm": "Серсүзне кабатлагыз:",
        "config-admin-email": "Электрон почта адресы:",
        "config-logo": "Логотип URL:",
        "config-cc-again": "Кабат сайлагыз...",
        "config-advanced-settings": "Өстәмә көйләнмәләр",
+       "config-memcached-servers": "Memcached серверлары:",
        "config-extensions": "Киңәйтүләр",
        "config-skins": "Бизәлеш",
        "config-install-step-done": "әзер",
        "config-install-step-failed": "булмады",
+       "config-install-schema": "Схема төзү",
+       "config-install-tables": "Табын төзү",
+       "config-install-stats": "Инициализация статистикасы",
+       "config-download-localsettings": "<code>LocalSettings.php</code> йөкләү",
        "config-help": "ярдәм",
+       "config-help-tooltip": "ачу өчен басыгыз",
+       "config-skins-screenshots": "$1 (скриншотлар: $2)",
+       "config-extensions-requires": "$1 ($2 кирәк)",
+       "config-screenshot": "скриншот",
        "mainpagetext": "<strong>«MediaWiki» куелды.</strong>",
        "mainpagedocfooter": "Бу вики турында мәгълүматны [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/ru биредә] табып була.\n\n== Кайбер файдалы ресурслар ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Көйләнмәләр исемлеге (рус.)];\n* [https://www.mediawiki.org/wiki/Manual:FAQ/ru MediaWiki турында еш бирелгән сораулар һәм җаваплар (рус.)];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki сәхифәсенең яңа юрамалары турында хәбәрләр яздырып алу].\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki сәхифәсен туган телегезгә тәрҗемә итү]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Үзегезнең викида ничек спам белән көрәшү турында мәгълүмат]"
 }
index eada9d4..05cf933 100644 (file)
@@ -53,7 +53,7 @@ class ClassicInterwikiLookup implements InterwikiLookup {
        /**
         * @var Language
         */
-       private $contentLanguage;
+       private $contLang;
 
        /**
         * @var WANObjectCache
@@ -91,7 +91,7 @@ class ClassicInterwikiLookup implements InterwikiLookup {
        private $thisSite = null;
 
        /**
-        * @param Language $contentLanguage Language object used to convert prefixes to lower case
+        * @param Language $contLang Language object used to convert prefixes to lower case
         * @param WANObjectCache $objectCache Cache for interwiki info retrieved from the database
         * @param int $objectCacheExpiry Expiry time for $objectCache, in seconds
         * @param bool|array|string $cdbData The path of a CDB file, or
@@ -104,7 +104,7 @@ class ClassicInterwikiLookup implements InterwikiLookup {
         * @param string $fallbackSite The code to assume for the local site,
         */
        function __construct(
-               Language $contentLanguage,
+               Language $contLang,
                WANObjectCache $objectCache,
                $objectCacheExpiry,
                $cdbData,
@@ -113,7 +113,7 @@ class ClassicInterwikiLookup implements InterwikiLookup {
        ) {
                $this->localCache = new MapCacheLRU( 100 );
 
-               $this->contentLanguage = $contentLanguage;
+               $this->contLang = $contLang;
                $this->objectCache = $objectCache;
                $this->objectCacheExpiry = $objectCacheExpiry;
                $this->cdbData = $cdbData;
@@ -144,7 +144,7 @@ class ClassicInterwikiLookup implements InterwikiLookup {
                        return null;
                }
 
-               $prefix = $this->contentLanguage->lc( $prefix );
+               $prefix = $this->contLang->lc( $prefix );
                if ( $this->localCache->has( $prefix ) ) {
                        return $this->localCache->get( $prefix );
                }
index cf3155d..49eabbb 100644 (file)
@@ -43,29 +43,18 @@ class ThumbnailRenderJob extends Job {
                        if ( $wgUploadThumbnailRenderMethod === 'jobqueue' ) {
                                $thumb = $file->transform( $transformParams, File::RENDER_NOW );
 
-                               if ( $thumb && !$thumb->isError() ) {
-                                       return true;
-                               } else {
-                                       $this->setLastError( __METHOD__ . ': thumbnail couln\'t be generated' );
+                               if ( !$thumb || $thumb->isError() ) {
+                                       if ( $thumb instanceof MediaTransformError ) {
+                                               $this->setLastError( __METHOD__ . ': thumbnail couln\'t be generated:' .
+                                                       $thumb->toText() );
+                                       } else {
+                                               $this->setLastError( __METHOD__ . ': thumbnail couln\'t be generated' );
+                                       }
                                        return false;
                                }
+                               return true;
                        } elseif ( $wgUploadThumbnailRenderMethod === 'http' ) {
-                               $thumbUrl = '';
-                               $status = $this->hitThumbUrl( $file, $transformParams, $thumbUrl );
-
-                               wfDebug( __METHOD__ . ": received status {$status}\n" );
-
-                               // 400 happens when requesting a size greater or equal than the original
-                               if ( $status === 200 || $status === 301 || $status === 302 || $status === 400 ) {
-                                       return true;
-                               } elseif ( $status ) {
-                                       $this->setLastError( __METHOD__ . ': incorrect HTTP status ' .
-                                               $status . ' when hitting ' . $thumbUrl );
-                                       return false;
-                               } else {
-                                       $this->setLastError( __METHOD__ . ': HTTP request failure' );
-                                       return false;
-                               }
+                               return $this->hitThumbUrl( $file, $transformParams );
                        } else {
                                $this->setLastError( __METHOD__ . ': unknown thumbnail render method ' .
                                        $wgUploadThumbnailRenderMethod );
@@ -77,16 +66,35 @@ class ThumbnailRenderJob extends Job {
                }
        }
 
-       protected function hitThumbUrl( LocalFile $file, $transformParams, &$thumbUrl ) {
+       /**
+        * @param LocalFile $file
+        * @param array $transformParams
+        * @return bool Success status (error will be set via setLastError() when false)
+        */
+       protected function hitThumbUrl( LocalFile $file, $transformParams ) {
                global $wgUploadThumbnailRenderHttpCustomHost, $wgUploadThumbnailRenderHttpCustomDomain;
 
+               $handler = $file->getHandler();
+               if ( !$handler ) {
+                       $this->setLastError( __METHOD__ . ': could not get handler' );
+                       return false;
+               } elseif ( !$handler->normaliseParams( $file, $transformParams ) ) {
+                       $this->setLastError( __METHOD__ . ': failed to normalize' );
+                       return false;
+               }
                $thumbName = $file->thumbName( $transformParams );
                $thumbUrl = $file->getThumbUrl( $thumbName );
 
+               if ( $thumbUrl === null ) {
+                       $this->setLastError( __METHOD__ . ': could not get thumb URL' );
+                       return false;
+               }
+
                if ( $wgUploadThumbnailRenderHttpCustomDomain ) {
                        $parsedUrl = wfParseUrl( $thumbUrl );
 
                        if ( !$parsedUrl || !isset( $parsedUrl['path'] ) || !strlen( $parsedUrl['path'] ) ) {
+                               $this->setLastError( __METHOD__ . ": invalid thumb URL: $thumbUrl" );
                                return false;
                        }
 
@@ -105,7 +113,19 @@ class ThumbnailRenderJob extends Job {
                }
 
                $status = $request->execute();
-
-               return $request->getStatus();
+               $statusCode = $request->getStatus();
+               wfDebug( __METHOD__ . ": received status {$statusCode}\n" );
+
+               // 400 happens when requesting a size greater or equal than the original
+               // TODO use proper error signaling. 400 could mean a number of other things.
+               if ( $statusCode === 200 || $statusCode === 301 || $statusCode === 302 || $statusCode === 400 ) {
+                       return true;
+               } elseif ( $statusCode ) {
+                       $this->setLastError( __METHOD__ . ": incorrect HTTP status $statusCode when hitting $thumbUrl" );
+               } else {
+                       $this->setLastError( __METHOD__ . ': HTTP request failure: '
+                               . Status::wrap( $status )->getWikiText( null, null, 'en' ) );
+               }
+               return false;
        }
 }
index 2e8b591..bf78ce3 100644 (file)
  * slow, because they construct a complete parse tree before outputting the code minified.
  * So this class is meant to allow arbitrary (but syntactically correct) input, while being
  * fast enough to be used for on-the-fly minifying.
+ *
+ * This class was written with ECMA-262 Edition 3 in mind ("ECMAScript 3"). Parsing features
+ * new to ECMAScript 5 or later might not be supported. However, Edition 5.1 better reflects
+ * how actual JS engines worked and work and is simpler and more readable prose. As such,
+ * the below code will refer to sections of the 5.1 specification.
+ *
+ * See <https://www.ecma-international.org/ecma-262/5.1/>.
  */
 class JavaScriptMinifier {
 
@@ -44,33 +51,38 @@ class JavaScriptMinifier {
        const PROPERTY_EXPRESSION_FUNC = 15;
 
        /* Token types */
-       const TYPE_UN_OP       = 1; // unary operators
-       const TYPE_INCR_OP     = 2; // ++ and --
-       const TYPE_BIN_OP      = 3; // binary operators
-       const TYPE_ADD_OP      = 4; // + and - which can be either unary or binary ops
-       const TYPE_HOOK        = 5; // ?
-       const TYPE_COLON       = 6; // :
-       const TYPE_COMMA       = 7; // ,
-       const TYPE_SEMICOLON   = 8; // ;
-       const TYPE_BRACE_OPEN  = 9; // {
-       const TYPE_BRACE_CLOSE = 10; // }
-       const TYPE_PAREN_OPEN  = 11; // ( and [
-       const TYPE_PAREN_CLOSE = 12; // ) and ]
-       const TYPE_RETURN      = 13; // keywords: break, continue, return, throw
-       const TYPE_IF          = 14; // keywords: catch, for, with, switch, while, if
-       const TYPE_DO          = 15; // keywords: case, var, finally, else, do, try
-       const TYPE_FUNC        = 16; // keywords: function
-       const TYPE_LITERAL     = 17; // all literals, identifiers and unrecognised tokens
+       const TYPE_UN_OP       = 101; // unary operators
+       const TYPE_INCR_OP     = 102; // ++ and --
+       const TYPE_BIN_OP      = 103; // binary operators
+       const TYPE_ADD_OP      = 104; // + and - which can be either unary or binary ops
+       const TYPE_HOOK        = 105; // ?
+       const TYPE_COLON       = 106; // :
+       const TYPE_COMMA       = 107; // ,
+       const TYPE_SEMICOLON   = 108; // ;
+       const TYPE_BRACE_OPEN  = 109; // {
+       const TYPE_BRACE_CLOSE = 110; // }
+       const TYPE_PAREN_OPEN  = 111; // ( and [
+       const TYPE_PAREN_CLOSE = 112; // ) and ]
+       const TYPE_RETURN      = 113; // keywords: break, continue, return, throw
+       const TYPE_IF          = 114; // keywords: catch, for, with, switch, while, if
+       const TYPE_DO          = 115; // keywords: case, var, finally, else, do, try
+       const TYPE_FUNC        = 116; // keywords: function
+       const TYPE_LITERAL     = 117; // all literals, identifiers and unrecognised tokens
 
        // Sanity limit to avoid excessive memory usage
        const STACK_LIMIT = 1000;
 
        /**
-        * NOTE: This isn't a strict maximum. Longer lines will be produced when
-        *       literals (e.g. quoted strings) longer than this are encountered
-        *       or when required to guard against semicolon insertion.
+        * Maximum line length
+        *
+        * This is not a strict maximum, but a guideline. Longer lines will be
+        * produced when literals (e.g. quoted strings) longer than this are
+        * encountered, or when required to guard against semicolon insertion.
+        *
+        * This is a private member (instead of constant) to allow tests to
+        * set it to 1, to verify ASI and line-breaking behaviour.
         */
-       const MAX_LINE_LENGTH = 1000;
+       private static $maxLineLength = 1000;
 
        /**
         * Returns minified JavaScript code.
@@ -81,109 +93,191 @@ class JavaScriptMinifier {
        public static function minify( $s ) {
                // First we declare a few tables that contain our parsing rules
 
-               // $opChars : characters, which can be combined without whitespace in between them
+               // $opChars : Characters which can be combined without whitespace between them.
                $opChars = [
-                       '!' => true,
-                       '"' => true,
-                       '%' => true,
-                       '&' => true,
-                       "'" => true,
+                       // ECMAScript 5.1 § 7.7 Punctuators
+                       // Unlike the spec, these are individual symbols, not sequences.
+                       '{' => true,
+                       '}' => true,
                        '(' => true,
                        ')' => true,
-                       '*' => true,
-                       '+' => true,
-                       ',' => true,
-                       '-' => true,
+                       '[' => true,
+                       ']' => true,
                        '.' => true,
-                       '/' => true,
-                       ':' => true,
                        ';' => true,
+                       ',' => true,
                        '<' => true,
-                       '=' => true,
                        '>' => true,
-                       '?' => true,
-                       '[' => true,
-                       ']' => true,
-                       '^' => true,
-                       '{' => true,
+                       '=' => true,
+                       '!' => true,
+                       '+' => true,
+                       '-' => true,
+                       '*' => true,
+                       '%' => true,
+                       '&' => true,
                        '|' => true,
-                       '}' => true,
-                       '~' => true
+                       '^' => true,
+                       '~' => true,
+                       '?' => true,
+                       ':' => true,
+                       '/' => true,
+                       // ECMAScript 5.1 § 7.8.4 String Literals
+                       '"' => true,
+                       "'" => true,
                ];
 
-               // $tokenTypes : maps keywords and operators to their corresponding token type
+               // $tokenTypes : Map keywords and operators to their corresponding token type
                $tokenTypes = [
-                       '!'          => self::TYPE_UN_OP,
-                       '~'          => self::TYPE_UN_OP,
-                       'delete'     => self::TYPE_UN_OP,
+                       // ECMAScript 5.1 § 11.4 Unary Operators
+                       // ECMAScript 5.1 § 11.6 Additive Operators
+                       // UnaryExpression includes PostfixExpression, which includes 'new'.
                        'new'        => self::TYPE_UN_OP,
-                       'typeof'     => self::TYPE_UN_OP,
+                       'delete'     => self::TYPE_UN_OP,
                        'void'       => self::TYPE_UN_OP,
+                       'typeof'     => self::TYPE_UN_OP,
                        '++'         => self::TYPE_INCR_OP,
                        '--'         => self::TYPE_INCR_OP,
+                       '+'          => self::TYPE_ADD_OP,
+                       '-'          => self::TYPE_ADD_OP,
+                       '~'          => self::TYPE_UN_OP,
+                       '!'          => self::TYPE_UN_OP,
+                       // ECMAScript 5.1 § 11.5 Multiplicative Operators
+                       '*'          => self::TYPE_BIN_OP,
+                       '/'          => self::TYPE_BIN_OP,
+                       '%'          => self::TYPE_BIN_OP,
+                       // ECMAScript 5.1 § 11.7 Bitwise Shift Operators
+                       '<<'         => self::TYPE_BIN_OP,
+                       '>>'         => self::TYPE_BIN_OP,
+                       '>>>'        => self::TYPE_BIN_OP,
+                       // ECMAScript 5.1 § 11.8 Relational Operators
+                       '<'          => self::TYPE_BIN_OP,
+                       '>'          => self::TYPE_BIN_OP,
+                       '<='         => self::TYPE_BIN_OP,
+                       '>='         => self::TYPE_BIN_OP,
+                       // ECMAScript 5.1 § 11.9 Equality Operators
+                       '=='         => self::TYPE_BIN_OP,
                        '!='         => self::TYPE_BIN_OP,
+                       '==='        => self::TYPE_BIN_OP,
                        '!=='        => self::TYPE_BIN_OP,
-                       '%'          => self::TYPE_BIN_OP,
-                       '%='         => self::TYPE_BIN_OP,
+                       'instanceof' => self::TYPE_BIN_OP,
+                       'in'         => self::TYPE_BIN_OP,
+                       // ECMAScript 5.1 § 11.10 Binary Bitwise Operators
                        '&'          => self::TYPE_BIN_OP,
+                       '^'          => self::TYPE_BIN_OP,
+                       '|'          => self::TYPE_BIN_OP,
+                       // ECMAScript 5.1 § 11.11 Binary Logical Operators
                        '&&'         => self::TYPE_BIN_OP,
-                       '&='         => self::TYPE_BIN_OP,
-                       '*'          => self::TYPE_BIN_OP,
+                       '||'         => self::TYPE_BIN_OP,
+                       // ECMAScript 5.1 § 11.12 Conditional Operator
+                       // Also known as ternary.
+                       '?'          => self::TYPE_HOOK,
+                       ':'          => self::TYPE_COLON,
+                       // ECMAScript 5.1 § 11.13 Assignment Operators
+                       '='          => self::TYPE_BIN_OP,
                        '*='         => self::TYPE_BIN_OP,
+                       '/='         => self::TYPE_BIN_OP,
+                       '%='         => self::TYPE_BIN_OP,
                        '+='         => self::TYPE_BIN_OP,
                        '-='         => self::TYPE_BIN_OP,
-                       '.'          => self::TYPE_BIN_OP,
-                       '/'          => self::TYPE_BIN_OP,
-                       '/='         => self::TYPE_BIN_OP,
-                       '<'          => self::TYPE_BIN_OP,
-                       '<<'         => self::TYPE_BIN_OP,
                        '<<='        => self::TYPE_BIN_OP,
-                       '<='         => self::TYPE_BIN_OP,
-                       '='          => self::TYPE_BIN_OP,
-                       '=='         => self::TYPE_BIN_OP,
-                       '==='        => self::TYPE_BIN_OP,
-                       '>'          => self::TYPE_BIN_OP,
-                       '>='         => self::TYPE_BIN_OP,
-                       '>>'         => self::TYPE_BIN_OP,
                        '>>='        => self::TYPE_BIN_OP,
-                       '>>>'        => self::TYPE_BIN_OP,
                        '>>>='       => self::TYPE_BIN_OP,
-                       '^'          => self::TYPE_BIN_OP,
+                       '&='         => self::TYPE_BIN_OP,
                        '^='         => self::TYPE_BIN_OP,
-                       '|'          => self::TYPE_BIN_OP,
                        '|='         => self::TYPE_BIN_OP,
-                       '||'         => self::TYPE_BIN_OP,
-                       'in'         => self::TYPE_BIN_OP,
-                       'instanceof' => self::TYPE_BIN_OP,
-                       '+'          => self::TYPE_ADD_OP,
-                       '-'          => self::TYPE_ADD_OP,
-                       '?'          => self::TYPE_HOOK,
-                       ':'          => self::TYPE_COLON,
+                       // ECMAScript 5.1 § 11.14 Comma Operator
                        ','          => self::TYPE_COMMA,
-                       ';'          => self::TYPE_SEMICOLON,
-                       '{'          => self::TYPE_BRACE_OPEN,
-                       '}'          => self::TYPE_BRACE_CLOSE,
-                       '('          => self::TYPE_PAREN_OPEN,
-                       '['          => self::TYPE_PAREN_OPEN,
-                       ')'          => self::TYPE_PAREN_CLOSE,
-                       ']'          => self::TYPE_PAREN_CLOSE,
-                       'break'      => self::TYPE_RETURN,
+
+                       // The keywords that disallow LineTerminator before their
+                       // (sometimes optional) Expression or Identifier.
+                       //
+                       //    keyword ;
+                       //    keyword [no LineTerminator here] Identifier ;
+                       //    keyword [no LineTerminator here] Expression ;
+                       //
+                       // See also ECMAScript 5.1:
+                       // - § 12.7 The continue Statement
+                       // - $ 12.8 The break Statement
+                       // - § 12.9 The return Statement
+                       // - § 12.13 The throw Statement
                        'continue'   => self::TYPE_RETURN,
+                       'break'      => self::TYPE_RETURN,
                        'return'     => self::TYPE_RETURN,
                        'throw'      => self::TYPE_RETURN,
+
+                       // The keywords require a parenthesised Expression or Identifier
+                       // before the next Statement.
+                       //
+                       //     keyword ( Expression ) Statement
+                       //     keyword ( Identifier ) Statement
+                       //
+                       // See also ECMAScript 5.1:
+                       // - § 12.5 The if Statement
+                       // - § 12.6 Iteration Statements (do, while, for)
+                       // - § 12.10 The with Statement
+                       // - § 12.11 The switch Statement
+                       // - § 12.13 The throw Statement
+                       'if'         => self::TYPE_IF,
                        'catch'      => self::TYPE_IF,
+                       'while'      => self::TYPE_IF,
                        'for'        => self::TYPE_IF,
-                       'if'         => self::TYPE_IF,
                        'switch'     => self::TYPE_IF,
-                       'while'      => self::TYPE_IF,
                        'with'       => self::TYPE_IF,
-                       'case'       => self::TYPE_DO,
-                       'do'         => self::TYPE_DO,
+
+                       // The keywords followed by an Identifier, Statement,
+                       // Expression, or Block.
+                       //
+                       //     var Identifier
+                       //     else Statement
+                       //     do Statement
+                       //     case Expression
+                       //     try Block
+                       //     finally Block
+                       //
+                       // See also ECMAScript 5.1:
+                       // - § 12.2 Variable Statement
+                       // - § 12.5 The if Statement (else)
+                       // - § 12.6 Iteration Statements (do, while, for)
+                       // - § 12.11 The switch Statement (case)
+                       // - § 12.14 The try Statement
+                       'var'        => self::TYPE_DO,
                        'else'       => self::TYPE_DO,
-                       'finally'    => self::TYPE_DO,
+                       'do'         => self::TYPE_DO,
+                       'case'       => self::TYPE_DO,
                        'try'        => self::TYPE_DO,
-                       'var'        => self::TYPE_DO,
-                       'function'   => self::TYPE_FUNC
+                       'finally'    => self::TYPE_DO,
+
+                       // ECMAScript 5.1 § 13 Function Definition
+                       'function'   => self::TYPE_FUNC,
+
+                       // Can be one of:
+                       // - DecimalLiteral (ECMAScript 5.1 § 7.8.3 Numeric Literals)
+                       // - MemberExpression (ECMAScript 5.1 § 11.2 Left-Hand-Side Expressions)
+                       '.'          => self::TYPE_BIN_OP,
+
+                       // Can be one of:
+                       // - Block (ECMAScript 5.1 § 12.1 Block)
+                       // - ObjectLiteral (ECMAScript 5.1 § 11.1 Primary Expressions)
+                       '{'          => self::TYPE_BRACE_OPEN,
+                       '}'          => self::TYPE_BRACE_CLOSE,
+
+                       // Can be one of:
+                       // - Parenthesised Identifier or Expression after a
+                       //   TYPE_IF or TYPE_FUNC keyword.
+                       // - PrimaryExpression (ECMAScript 5.1 § 11.1 Primary Expressions)
+                       // - CallExpression (ECMAScript 5.1 § 11.2 Left-Hand-Side Expressions)
+                       '('          => self::TYPE_PAREN_OPEN,
+                       ')'          => self::TYPE_PAREN_CLOSE,
+
+                       // Can be one of:
+                       // - ArrayLiteral (ECMAScript 5.1 § 11.1 Primary Expressions)
+                       '['          => self::TYPE_PAREN_OPEN,
+                       ']'          => self::TYPE_PAREN_CLOSE,
+
+                       // Can be one of:
+                       // - End of any statement
+                       // - EmptyStatement (ECMAScript 5.1 § 12.3 Empty Statement)
+                       ';'          => self::TYPE_SEMICOLON,
                ];
 
                // $goto : This is the main table for our state machine. For every state/token pair
@@ -340,6 +434,7 @@ class JavaScriptMinifier {
                                self::TYPE_PAREN_OPEN => self::PROPERTY_EXPRESSION_OP
                        ],
                        self::PROPERTY_EXPRESSION_OP => [
+                               self::TYPE_BRACE_OPEN => self::PROPERTY_EXPRESSION_OP,
                                self::TYPE_PAREN_OPEN => self::PROPERTY_EXPRESSION_OP
                        ],
                        self::PROPERTY_EXPRESSION_FUNC => [
@@ -583,7 +678,7 @@ class JavaScriptMinifier {
                                $out .= "\n";
                                $state = self::STATEMENT;
                                $lineLength = 0;
-                       } elseif ( $lineLength + $end - $pos > self::MAX_LINE_LENGTH &&
+                       } elseif ( $lineLength + $end - $pos > self::$maxLineLength &&
                                        !isset( $semicolon[$state][$type] ) && $type !== self::TYPE_INCR_OP ) {
                                // This line would get too long if we added $token, so add a newline first.
                                // Only do this if it won't trigger semicolon insertion and if it won't
index ad5e58d..864880a 100644 (file)
@@ -64,7 +64,7 @@ class MapCacheLRU implements IExpiringStore, Serializable {
                Assert::parameter( $maxKeys > 0, '$maxKeys', 'must be above zero' );
 
                $this->maxCacheKeys = $maxKeys;
-               // Use the current time as the default "as of" timesamp of entries
+               // Use the current time as the default "as of" timestamp of entries
                $this->epoch = $this->getCurrentTime();
        }
 
index 0e39b7a..e14c485 100644 (file)
@@ -227,8 +227,6 @@ class LogFormatter {
         * @return string Text
         */
        public function getIRCActionText() {
-               global $wgContLang;
-
                $this->plaintext = true;
                $this->irctext = true;
 
@@ -238,6 +236,7 @@ class LogFormatter {
                // Text of title the action is aimed at.
                $target = $entry->getTarget()->getPrefixedText();
                $text = null;
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                switch ( $entry->getType() ) {
                        case 'move':
                                switch ( $entry->getSubtype() ) {
@@ -383,12 +382,12 @@ class LogFormatter {
                                                        $rawDuration = $parameters['5::duration'];
                                                        $rawFlags = $parameters['6::flags'];
                                                }
-                                               $duration = $wgContLang->translateBlockExpiry(
+                                               $duration = $contLang->translateBlockExpiry(
                                                        $rawDuration,
                                                        null,
                                                        wfTimestamp( TS_UNIX, $entry->getTimestamp() )
                                                );
-                                               $flags = BlockLogFormatter::formatBlockFlags( $rawFlags, $wgContLang );
+                                               $flags = BlockLogFormatter::formatBlockFlags( $rawFlags, $contLang );
                                                $text = wfMessage( 'blocklogentry' )
                                                        ->rawParams( $target, $duration, $flags )->inContentLanguage()->escaped();
                                                break;
@@ -397,12 +396,13 @@ class LogFormatter {
                                                        ->rawParams( $target )->inContentLanguage()->escaped();
                                                break;
                                        case 'reblock':
-                                               $duration = $wgContLang->translateBlockExpiry(
+                                               $duration = $contLang->translateBlockExpiry(
                                                        $parameters['5::duration'],
                                                        null,
                                                        wfTimestamp( TS_UNIX, $entry->getTimestamp() )
                                                );
-                                               $flags = BlockLogFormatter::formatBlockFlags( $parameters['6::flags'], $wgContLang );
+                                               $flags = BlockLogFormatter::formatBlockFlags( $parameters['6::flags'],
+                                                       $contLang );
                                                $text = wfMessage( 'reblock-logentry' )
                                                        ->rawParams( $target, $duration, $flags )->inContentLanguage()->escaped();
                                                break;
index 265a41c..673c929 100644 (file)
@@ -223,10 +223,10 @@ class LogPage {
        public static function actionText( $type, $action, $title = null, $skin = null,
                $params = [], $filterWikilinks = false
        ) {
-               global $wgLang, $wgContLang, $wgLogActions;
+               global $wgLang, $wgLogActions;
 
                if ( is_null( $skin ) ) {
-                       $langObj = $wgContLang;
+                       $langObj = MediaWikiServices::getInstance()->getContentLanguage();
                        $langObjOrNull = null;
                } else {
                        $langObj = $wgLang;
index 931829a..02a6972 100644 (file)
@@ -22,6 +22,8 @@
  * @since 1.26
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This class formats protect log entries.
  *
@@ -146,13 +148,12 @@ class ProtectLogFormatter extends LogFormatter {
        }
 
        public function formatParametersForApi() {
-               global $wgContLang;
-
                $ret = parent::formatParametersForApi();
                if ( isset( $ret['details'] ) && is_array( $ret['details'] ) ) {
                        foreach ( $ret['details'] as &$detail ) {
                                if ( isset( $detail['expiry'] ) ) {
-                                       $detail['expiry'] = $wgContLang->formatExpiry( $detail['expiry'], TS_ISO_8601, 'infinite' );
+                                       $detail['expiry'] = MediaWikiServices::getInstance()->getContentLanguage()->
+                                               formatExpiry( $detail['expiry'], TS_ISO_8601, 'infinite' );
                                }
                        }
                }
index 6e527e8..c958947 100644 (file)
@@ -23,6 +23,8 @@
  * @since 1.22
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This class formats rights log entries.
  *
  */
 class RightsLogFormatter extends LogFormatter {
        protected function makePageLink( Title $title = null, $parameters = [], $html = null ) {
-               global $wgContLang, $wgUserrightsInterwikiDelimiter;
+               global $wgUserrightsInterwikiDelimiter;
 
                if ( !$this->plaintext ) {
-                       $text = $wgContLang->ucfirst( $title->getDBkey() );
+                       $text = MediaWikiServices::getInstance()->getContentLanguage()->
+                               ucfirst( $title->getDBkey() );
                        $parts = explode( $wgUserrightsInterwikiDelimiter, $text, 2 );
 
                        if ( count( $parts ) === 2 ) {
index 67b7142..3144504 100644 (file)
@@ -452,7 +452,7 @@ class EmailNotification {
         * @private
         */
        function sendPersonalised( $watchingUser, $source ) {
-               global $wgContLang, $wgEnotifUseRealName;
+               global $wgEnotifUseRealName;
                // From the PHP manual:
                //   Note: The to parameter cannot be an address in the form of
                //   "Something <someone@example.com>". The mail command will not parse
@@ -462,14 +462,15 @@ class EmailNotification {
                # $PAGEEDITDATE is the time and date of the page change
                # expressed in terms of individual local time of the notification
                # recipient, i.e. watching user
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                $body = str_replace(
                        [ '$WATCHINGUSERNAME',
                                '$PAGEEDITDATE',
                                '$PAGEEDITTIME' ],
                        [ $wgEnotifUseRealName && $watchingUser->getRealName() !== ''
                                ? $watchingUser->getRealName() : $watchingUser->getName(),
-                               $wgContLang->userDate( $this->timestamp, $watchingUser ),
-                               $wgContLang->userTime( $this->timestamp, $watchingUser ) ],
+                               $contLang->userDate( $this->timestamp, $watchingUser ),
+                               $contLang->userTime( $this->timestamp, $watchingUser ) ],
                        $this->body );
 
                $headers = [];
@@ -490,19 +491,18 @@ class EmailNotification {
         * @return Status|null
         */
        function sendImpersonal( $addresses ) {
-               global $wgContLang;
-
                if ( empty( $addresses ) ) {
                        return null;
                }
 
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                $body = str_replace(
                        [ '$WATCHINGUSERNAME',
                                '$PAGEEDITDATE',
                                '$PAGEEDITTIME' ],
                        [ wfMessage( 'enotif_impersonal_salutation' )->inContentLanguage()->text(),
-                               $wgContLang->date( $this->timestamp, false, false ),
-                               $wgContLang->time( $this->timestamp, false, false ) ],
+                               $contLang->date( $this->timestamp, false, false ),
+                               $contLang->time( $this->timestamp, false, false ) ],
                        $this->body );
 
                return UserMailer::send( $addresses, $this->from, $this->subject, $body, [
index f647a9d..345b3cb 100644 (file)
@@ -1003,13 +1003,12 @@ class FormatMetadata extends ContextSource {
        public static function flattenArrayContentLang( $vals, $type = 'ul',
                $noHtml = false, $context = false
        ) {
-               global $wgContLang;
                $obj = new FormatMetadata;
                if ( $context ) {
                        $obj->setContext( $context );
                }
                $context = new DerivativeContext( $obj->getContext() );
-               $context->setLanguage( $wgContLang );
+               $context->setLanguage( MediaWikiServices::getInstance()->getContentLanguage() );
                $obj->setContext( $context );
 
                return $obj->flattenArrayReal( $vals, $type, $noHtml );
@@ -1056,7 +1055,7 @@ class FormatMetadata extends ContextSource {
                         */
                        switch ( $type ) {
                                case 'lang':
-                                       // Display default, followed by ContLang,
+                                       // Display default, followed by ContentLanguage,
                                        // followed by the rest in no particular
                                        // order.
 
@@ -1218,13 +1217,15 @@ class FormatMetadata extends ContextSource {
         * @return string The text content of "exif-$tag-$val" message in lower case
         */
        private function exifMsg( $tag, $val, $arg = null, $arg2 = null ) {
-               global $wgContLang;
-
                if ( $val === '' ) {
                        $val = 'value';
                }
 
-               return $this->msg( $wgContLang->lc( "exif-$tag-$val" ), $arg, $arg2 )->text();
+               return $this->msg(
+                       MediaWikiServices::getInstance()->getContentLanguage()->lc( "exif-$tag-$val" ),
+                       $arg,
+                       $arg2
+               )->text();
        }
 
        /**
index e00a5b3..e52bf0b 100644 (file)
@@ -325,7 +325,7 @@ class SVGReader {
 
                if ( $this->reader->getAttribute( 'viewBox' ) ) {
                        // min-x min-y width height
-                       $viewBox = preg_split( '/\s+/', trim( $this->reader->getAttribute( 'viewBox' ) ) );
+                       $viewBox = preg_split( '/\s*[\s,]\s*/', trim( $this->reader->getAttribute( 'viewBox' ) ) );
                        if ( count( $viewBox ) == 4 ) {
                                $viewWidth = $this->scaleSVGUnit( $viewBox[2] );
                                $viewHeight = $this->scaleSVGUnit( $viewBox[3] );
@@ -380,7 +380,11 @@ class SVGReader {
                        '' => 1.0, // "User units" pixels by default
                ];
                $matches = [];
-               if ( preg_match( '/^\s*(\d+(?:\.\d+)?)(em|ex|px|pt|pc|cm|mm|in|%|)\s*$/', $length, $matches ) ) {
+               if ( preg_match(
+                       '/^\s*([-+]?\d*(?:\.\d+|\d+)(?:[Ee][-+]?\d+)?)\s*(em|ex|px|pt|pc|cm|mm|in|%|)\s*$/',
+                       $length,
+                       $matches
+               ) ) {
                        $length = floatval( $matches[1] );
                        $unit = $matches[2];
                        if ( $unit == '%' ) {
index 49912c7..3a7b18e 100644 (file)
@@ -750,7 +750,7 @@ class Article implements Page {
         * @return array The policy that should be set
         * @todo actions other than 'view'
         */
-       public function getRobotPolicy( $action, $pOutput = null ) {
+       public function getRobotPolicy( $action, ParserOutput $pOutput = null ) {
                global $wgArticleRobotPolicies, $wgNamespaceRobotPolicies, $wgDefaultRobotPolicy;
 
                $ns = $this->getTitle()->getNamespace();
index bb8ed24..1f87d93 100644 (file)
@@ -18,6 +18,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Builds the image revision log shown on image pages
  *
@@ -111,8 +113,6 @@ class ImageHistoryList extends ContextSource {
         * @return string
         */
        public function imageHistoryLine( $iscur, $file ) {
-               global $wgContLang;
-
                $user = $this->getUser();
                $lang = $this->getLanguage();
                $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
@@ -264,8 +264,9 @@ class ImageHistoryList extends ContextSource {
                        $row .= '<td><span class="history-deleted">' .
                                $this->msg( 'rev-deleted-comment' )->escaped() . '</span></td>';
                } else {
-                       $row .= '<td dir="' . $wgContLang->getDir() . '">' .
-                               Linker::formatComment( $description, $this->title ) . '</td>';
+                       $row .=
+                               '<td dir="' . MediaWikiServices::getInstance()->getContentLanguage()->getDir() .
+                               '">' .  Linker::formatComment( $description, $this->title ) . '</td>';
                }
 
                $rowClass = null;
index a1b2e57..661faa7 100644 (file)
@@ -1625,7 +1625,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @return DerivedPageDataUpdater
         */
        private function newDerivedDataUpdater() {
-               global $wgContLang, $wgRCWatchCategoryMembership, $wgArticleCountMethod;
+               global $wgRCWatchCategoryMembership, $wgArticleCountMethod;
 
                $derivedDataUpdater = new DerivedPageDataUpdater(
                        $this, // NOTE: eventually, PageUpdater should not know about WikiPage
@@ -1633,7 +1633,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $this->getParserCache(),
                        JobQueueGroup::singleton(),
                        MessageCache::singleton(),
-                       $wgContLang,
+                       MediaWikiServices::getInstance()->getContentLanguage(),
                        LoggerFactory::getInstance( 'SaveParse' )
                );
 
@@ -2301,14 +2301,13 @@ class WikiPage implements Page, IDBAccessObject {
         * @return string
         */
        protected function formatExpiry( $expiry ) {
-               global $wgContLang;
-
                if ( $expiry != 'infinity' ) {
+                       $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                        return wfMessage(
                                'protect-expiring',
-                               $wgContLang->timeanddate( $expiry, false, false ),
-                               $wgContLang->date( $expiry, false, false ),
-                               $wgContLang->time( $expiry, false, false )
+                               $contLang->timeanddate( $expiry, false, false ),
+                               $contLang->date( $expiry, false, false ),
+                               $contLang->time( $expiry, false, false )
                        )->inContentLanguage()->text();
                } else {
                        return wfMessage( 'protect-expiry-indefinite' )
@@ -2366,13 +2365,12 @@ class WikiPage implements Page, IDBAccessObject {
         * @return string
         */
        public function protectDescriptionLog( array $limit, array $expiry ) {
-               global $wgContLang;
-
                $protectDescriptionLog = '';
 
                foreach ( array_filter( $limit ) as $action => $restrictions ) {
                        $expiryText = $this->formatExpiry( $expiry[$action] );
-                       $protectDescriptionLog .= $wgContLang->getDirMark() .
+                       $protectDescriptionLog .=
+                               MediaWikiServices::getInstance()->getContentLanguage()->getDirMark() .
                                "[$action=$restrictions] ($expiryText)";
                }
 
@@ -2841,7 +2839,7 @@ class WikiPage implements Page, IDBAccessObject {
        public function commitRollback( $fromP, $summary, $bot,
                &$resultDetails, User $guser, $tags = null
        ) {
-               global $wgUseRCPatrol, $wgContLang;
+               global $wgUseRCPatrol;
 
                $dbw = wfGetDB( DB_MASTER );
 
@@ -2922,13 +2920,14 @@ class WikiPage implements Page, IDBAccessObject {
                $targetEditorForPublic = $target->getUser( RevisionRecord::FOR_PUBLIC );
 
                // Allow the custom summary to use the same args as the default message
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                $args = [
                        $targetEditorForPublic ? $targetEditorForPublic->getName() : null,
                        $currentEditorForPublic ? $currentEditorForPublic->getName() : null,
                        $s->rev_id,
-                       $wgContLang->timeanddate( wfTimestamp( TS_MW, $s->rev_timestamp ) ),
+                       $contLang->timeanddate( wfTimestamp( TS_MW, $s->rev_timestamp ) ),
                        $current->getId(),
-                       $wgContLang->timeanddate( $current->getTimestamp() )
+                       $contLang->timeanddate( $current->getTimestamp() )
                ];
                if ( $summary instanceof Message ) {
                        $summary = $summary->params( $args )->inContentLanguage()->text();
index 3c47de3..ae7ca6d 100644 (file)
@@ -135,14 +135,13 @@ class CoreParserFunctions {
        }
 
        public static function ns( $parser, $part1 = '' ) {
-               global $wgContLang;
                if ( intval( $part1 ) || $part1 == "0" ) {
                        $index = intval( $part1 );
                } else {
-                       $index = $wgContLang->getNsIndex( str_replace( ' ', '_', $part1 ) );
+                       $index = $parser->getContentLanguage()->getNsIndex( str_replace( ' ', '_', $part1 ) );
                }
                if ( $index !== false ) {
-                       return $wgContLang->getFormattedNsText( $index );
+                       return $parser->getContentLanguage()->getFormattedNsText( $index );
                } else {
                        return [ 'found' => false ];
                }
@@ -197,13 +196,11 @@ class CoreParserFunctions {
        }
 
        public static function lcfirst( $parser, $s = '' ) {
-               global $wgContLang;
-               return $wgContLang->lcfirst( $s );
+               return $parser->getContentLanguage()->lcfirst( $s );
        }
 
        public static function ucfirst( $parser, $s = '' ) {
-               global $wgContLang;
-               return $wgContLang->ucfirst( $s );
+               return $parser->getContentLanguage()->ucfirst( $s );
        }
 
        /**
@@ -212,8 +209,7 @@ class CoreParserFunctions {
         * @return string
         */
        public static function lc( $parser, $s = '' ) {
-               global $wgContLang;
-               return $parser->markerSkipCallback( $s, [ $wgContLang, 'lc' ] );
+               return $parser->markerSkipCallback( $s, [ $parser->getContentLanguage(), 'lc' ] );
        }
 
        /**
@@ -222,8 +218,7 @@ class CoreParserFunctions {
         * @return string
         */
        public static function uc( $parser, $s = '' ) {
-               global $wgContLang;
-               return $parser->markerSkipCallback( $s, [ $wgContLang, 'uc' ] );
+               return $parser->markerSkipCallback( $s, [ $parser->getContentLanguage(), 'uc' ] );
        }
 
        public static function localurl( $parser, $s = '', $arg = null ) {
@@ -742,7 +737,6 @@ class CoreParserFunctions {
         * @return string
         */
        public static function pagesincategory( $parser, $name = '', $arg1 = null, $arg2 = null ) {
-               global $wgContLang;
                static $magicWords = null;
                if ( is_null( $magicWords ) ) {
                        $magicWords = $parser->getMagicWordFactory()->newArray( [
@@ -772,7 +766,7 @@ class CoreParserFunctions {
                if ( !$title ) { # invalid title
                        return self::formatRaw( 0, $raw, $parser->getFunctionLang() );
                }
-               $wgContLang->findVariantLink( $name, $title, true );
+               $parser->getContentLanguage()->findVariantLink( $name, $title, true );
 
                // Normalize name for cache
                $name = $title->getDBkey();
index 2aefc03..3be4353 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Parser
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Date formatter, recognises dates in plain text and formats them according to user preferences.
  * @todo preferences, OutputPage
@@ -131,9 +133,9 @@ class DateFormatter {
         * @return DateFormatter
         */
        public static function getInstance( Language $lang = null ) {
-               global $wgContLang, $wgMainCacheType;
+               global $wgMainCacheType;
 
-               $lang = $lang ?: $wgContLang;
+               $lang = $lang ?: MediaWikiServices::getInstance()->getContentLanguage();
                $cache = ObjectCache::getLocalServerInstance( $wgMainCacheType );
 
                static $dateFormatter = false;
index 66fd723..f4856be 100644 (file)
@@ -282,8 +282,6 @@ class LinkHolderArray {
                        return;
                }
 
-               global $wgContLang;
-
                $colours = [];
                $linkCache = MediaWikiServices::getInstance()->getLinkCache();
                $output = $this->parent->getOutput();
@@ -364,7 +362,7 @@ class LinkHolderArray {
                }
 
                # Do a second query for different language variants of links and categories
-               if ( $wgContLang->hasVariants() ) {
+               if ( $this->parent->getContentLanguage()->hasVariants() ) {
                        $this->doVariants( $colours );
                }
 
@@ -452,7 +450,6 @@ class LinkHolderArray {
         * @param array &$colours
         */
        protected function doVariants( &$colours ) {
-               global $wgContLang;
                $linkBatch = new LinkBatch();
                $variantMap = []; // maps $pdbkey_Variant => $keys (of link holders)
                $output = $this->parent->getOutput();
@@ -480,7 +477,8 @@ class LinkHolderArray {
                }
 
                // Now do the conversion and explode string to text of titles
-               $titlesAllVariants = $wgContLang->autoConvertToAllVariants( rtrim( $titlesToBeConverted, "\0" ) );
+               $titlesAllVariants = $this->parent->getContentLanguage()->
+                       autoConvertToAllVariants( rtrim( $titlesToBeConverted, "\0" ) );
                $allVariantsName = array_keys( $titlesAllVariants );
                foreach ( $titlesAllVariants as &$titlesVariant ) {
                        $titlesVariant = explode( "\0", $titlesVariant );
@@ -521,7 +519,7 @@ class LinkHolderArray {
                foreach ( $output->getCategoryLinks() as $category ) {
                        $categoryTitle = Title::makeTitleSafe( NS_CATEGORY, $category );
                        $linkBatch->addObj( $categoryTitle );
-                       $variants = $wgContLang->autoConvertToAllVariants( $category );
+                       $variants = $this->parent->getContentLanguage()->autoConvertToAllVariants( $category );
                        foreach ( $variants as $variant ) {
                                if ( $variant !== $category ) {
                                        $variantTitle = Title::makeTitleSafe( NS_CATEGORY, $variant );
index 4073864..96bf892 100644 (file)
@@ -263,13 +263,25 @@ class Parser {
        /** @var MagicWordFactory */
        private $magicWordFactory;
 
+       /** @var Language */
+       private $contLang;
+
+       /** @var ParserFactory */
+       private $factory;
+
        /**
-        * @param array $conf
+        * @param array $conf See $wgParserConf documentation
         * @param MagicWordFactory|null $magicWordFactory
+        * @param Language|null $contLang Content language
+        * @param ParserFactory|null $factory
+        * @param string|null $urlProtocols As returned from wfUrlProtocols()
         */
-       public function __construct( $conf = [], MagicWordFactory $magicWordFactory = null ) {
+       public function __construct(
+               array $conf = [], MagicWordFactory $magicWordFactory = null, Language $contLang = null,
+               ParserFactory $factory = null, $urlProtocols = null
+       ) {
                $this->mConf = $conf;
-               $this->mUrlProtocols = wfUrlProtocols();
+               $this->mUrlProtocols = $urlProtocols ?? wfUrlProtocols();
                $this->mExtLinkBracketedRegex = '/\[(((?i)' . $this->mUrlProtocols . ')' .
                        self::EXT_LINK_ADDR .
                        self::EXT_LINK_URL_CLASS . '*)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F\\x{FFFD}]*?)\]/Su';
@@ -289,10 +301,12 @@ class Parser {
                }
                wfDebug( __CLASS__ . ": using preprocessor: {$this->mPreprocessorClass}\n" );
 
-               $this->magicWordFactory = $magicWordFactory;
-               if ( !$magicWordFactory ) {
-                       $this->magicWordFactory = MediaWikiServices::getInstance()->getMagicWordFactory();
-               }
+               $this->magicWordFactory = $magicWordFactory ??
+                       MediaWikiServices::getInstance()->getMagicWordFactory();
+
+               $this->contLang = $contLang ?? MediaWikiServices::getInstance()->getContentLanguage();
+
+               $this->factory = $factory ?? MediaWikiServices::getInstance()->getParserFactory();
        }
 
        /**
@@ -972,7 +986,7 @@ class Parser {
         * @return Language
         */
        public function getContentLanguage() {
-               return $this->magicWordFactory->getContentLanguage();
+               return $this->contLang;
        }
 
        /**
@@ -2154,7 +2168,7 @@ class Parser {
                if ( $useLinkPrefixExtension ) {
                        # Match the end of a line for a word that's not followed by whitespace,
                        # e.g. in the case of 'The Arab al[[Razi]]', 'al' will be matched
-                       $charset = $this->getContentLanguage()->linkPrefixCharset();
+                       $charset = $this->contLang->linkPrefixCharset();
                        $e2 = "/^((?>.*[^$charset]|))(.+)$/sDu";
                }
 
@@ -2710,11 +2724,10 @@ class Parser {
                                break;
                        case 'namespace':
                                $value = str_replace( '_', ' ',
-                                       $this->getContentLanguage()->getNsText( $this->mTitle->getNamespace() ) );
+                                       $this->contLang->getNsText( $this->mTitle->getNamespace() ) );
                                break;
                        case 'namespacee':
-                               $value = wfUrlencode( $this->getContentLanguage()->
-                                       getNsText( $this->mTitle->getNamespace() ) );
+                               $value = wfUrlencode( $this->contLang->getNsText( $this->mTitle->getNamespace() ) );
                                break;
                        case 'namespacenumber':
                                $value = $this->mTitle->getNamespace();
@@ -2863,7 +2876,7 @@ class Parser {
                if ( !$this->getRevisionObject() ) {
                        # Get the timezone-adjusted timestamp $mtts seconds in the future
                        $resThen = substr(
-                               $this->getContentLanguage()->userAdjust( wfTimestamp( TS_MW, time() + $mtts ), '' ),
+                               $this->contLang->userAdjust( wfTimestamp( TS_MW, time() + $mtts ), '' ),
                                $start,
                                $len
                        );
@@ -3415,7 +3428,7 @@ class Parser {
                        $function = $this->mFunctionSynonyms[1][$function];
                } else {
                        # Case insensitive functions
-                       $function = $this->getContentLanguage()->lc( $function );
+                       $function = $this->contLang->lc( $function );
                        if ( isset( $this->mFunctionSynonyms[0][$function] ) ) {
                                $function = $this->mFunctionSynonyms[0][$function];
                        } else {
@@ -4519,14 +4532,14 @@ class Parser {
         */
        private function pstPass2( $text, $user ) {
                # Note: This is the timestamp saved as hardcoded wikitext to the database, we use
-               # $this->getContentLanguage() here in order to give everyone the same signature and use the
-               # default one rather than the one selected in each user's preferences.  (see also T14815)
+               # $this->contLang here in order to give everyone the same signature and use the default one
+               # rather than the one selected in each user's preferences.  (see also T14815)
                $ts = $this->mOptions->getTimestamp();
                $timestamp = MWTimestamp::getLocalInstance( $ts );
                $ts = $timestamp->format( 'YmdHis' );
                $tzMsg = $timestamp->getTimezoneMessage()->inContentLanguage()->text();
 
-               $d = $this->getContentLanguage()->timeanddate( $ts, false, false ) . " ($tzMsg)";
+               $d = $this->contLang->timeanddate( $ts, false, false ) . " ($tzMsg)";
 
                # Variable replacement
                # Because mOutputType is OT_WIKI, this will only process {{subst:xxx}} type tags
@@ -4892,7 +4905,7 @@ class Parser {
                foreach ( $synonyms as $syn ) {
                        # Case
                        if ( !$sensitive ) {
-                               $syn = $this->getContentLanguage()->lc( $syn );
+                               $syn = $this->contLang->lc( $syn );
                        }
                        # Add leading hash
                        if ( !( $flags & self::SFH_NO_HASH ) ) {
@@ -5736,8 +5749,7 @@ class Parser {
                        # Since this value will be saved into the parser cache, served
                        # to other users, and potentially even used inside links and such,
                        # it needs to be consistent for all visitors.
-                       $this->mRevisionTimestamp = $this->getContentLanguage()->userAdjust( $timestamp, '' );
-
+                       $this->mRevisionTimestamp = $this->contLang->userAdjust( $timestamp, '' );
                }
                return $this->mRevisionTimestamp;
        }
@@ -6192,9 +6204,8 @@ class Parser {
         * @return Parser A parser object that is not parsing anything
         */
        public function getFreshParser() {
-               global $wgParserConf;
                if ( $this->mInParse ) {
-                       return new $wgParserConf['class']( $wgParserConf );
+                       return $this->factory->create();
                } else {
                        return $this;
                }
index e6326e6..5e6081d 100644 (file)
@@ -294,7 +294,13 @@ class ParserCache {
         * @param string|null $cacheTime TS_MW timestamp when the cache was generated
         * @param int|null $revId Revision ID that was parsed
         */
-       public function save( $parserOutput, $page, $popts, $cacheTime = null, $revId = null ) {
+       public function save(
+               ParserOutput $parserOutput,
+               $page,
+               $popts,
+               $cacheTime = null,
+               $revId = null
+       ) {
                $expire = $parserOutput->getCacheExpiry();
                if ( $expire > 0 && !$this->mMemc instanceof EmptyBagOStuff ) {
                        $cacheTime = $cacheTime ?: wfTimestampNow();
diff --git a/includes/parser/ParserFactory.php b/includes/parser/ParserFactory.php
new file mode 100644 (file)
index 0000000..646f855
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Parser
+ */
+
+/**
+ * @since 1.32
+ */
+class ParserFactory {
+       /** @var array */
+       private $conf;
+
+       /** @var MagicWordFactory */
+       private $magicWordFactory;
+
+       /** @var Language */
+       private $contLang;
+
+       /** @var string */
+       private $urlProtocols;
+
+       /**
+        * @param array $conf See $wgParserConf documentation
+        * @param MagicWordFactory $magicWordFactory
+        * @param Language $contLang Content language
+        * @param string $urlProtocols As returned from wfUrlProtocols()
+        * @since 1.32
+        */
+       public function __construct(
+               array $conf, MagicWordFactory $magicWordFactory, Language $contLang, $urlProtocols
+       ) {
+               $this->conf = $conf;
+               $this->magicWordFactory = $magicWordFactory;
+               $this->contLang = $contLang;
+               $this->urlProtocols = $urlProtocols;
+       }
+
+       /**
+        * @return Parser
+        * @since 1.32
+        */
+       public function create() : Parser {
+               return new Parser( $this->conf, $this->magicWordFactory, $this->contLang, $this,
+                       $this->urlProtocols );
+       }
+}
index e4b064e..b30c116 100644 (file)
@@ -968,8 +968,8 @@ class ParserOptions {
         * @return ParserOptions
         */
        public static function newFromAnon() {
-               global $wgContLang;
-               return new ParserOptions( new User, $wgContLang );
+               return new ParserOptions( new User,
+                       MediaWikiServices::getInstance()->getContentLanguage() );
        }
 
        /**
@@ -1021,7 +1021,7 @@ class ParserOptions {
         * @param IContextSource|string|User|null $context
         *  - If an IContextSource, the options are initialized based on the source's User and Language.
         *  - If the string 'canonical', the options are initialized with an anonymous user and
-        *    $wgContLang.
+        *    the content language.
         *  - If a User or null, the options are initialized for that User (or $wgUser if null).
         *    'userlang' is taken from the $userLang parameter, defaulting to $wgLang if that is null.
         * @param Language|StubObject|null $userLang (see above)
@@ -1061,7 +1061,7 @@ class ParserOptions {
                        $wgMaxArticleSize, $wgMaxPPNodeCount, $wgMaxTemplateDepth, $wgMaxPPExpandDepth,
                        $wgCleanSignatures, $wgExternalLinkTarget, $wgExpensiveParserFunctionLimit,
                        $wgMaxGeneratedPPNodeCount, $wgDisableLangConversion, $wgDisableTitleConversion,
-                       $wgEnableMagicLinks, $wgContLang;
+                       $wgEnableMagicLinks;
 
                if ( self::$defaults === null ) {
                        // *UPDATE* ParserOptions::matches() if any of this changes as needed
@@ -1115,7 +1115,7 @@ class ParserOptions {
                        'numberheadings' => User::getDefaultOption( 'numberheadings' ),
                        'thumbsize' => User::getDefaultOption( 'thumbsize' ),
                        'stubthreshold' => 0,
-                       'userlang' => $wgContLang,
+                       'userlang' => MediaWikiServices::getInstance()->getContentLanguage(),
                ];
        }
 
@@ -1329,8 +1329,8 @@ class ParserOptions {
                if ( !is_null( $title ) ) {
                        $confstr .= $title->getPageLanguage()->getExtraHashOptions();
                } else {
-                       global $wgContLang;
-                       $confstr .= $wgContLang->getExtraHashOptions();
+                       $confstr .=
+                               MediaWikiServices::getInstance()->getContentLanguage()->getExtraHashOptions();
                }
 
                $confstr .= $wgRenderHashAppend;
index 4614402..d885e24 100644 (file)
@@ -24,6 +24,8 @@
  * @ingroup Parser
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * HTML sanitizer for MediaWiki
  * @ingroup Parser
@@ -1657,7 +1659,6 @@ class Sanitizer {
         * @return string Still normalized, without entities
         */
        public static function decodeCharReferencesAndNormalize( $text ) {
-               global $wgContLang;
                $text = preg_replace_callback(
                        self::CHAR_REFS_REGEX,
                        [ self::class, 'decodeCharReferencesCallback' ],
@@ -1667,7 +1668,7 @@ class Sanitizer {
                );
 
                if ( $count ) {
-                       return $wgContLang->normalize( $text );
+                       return MediaWikiServices::getInstance()->getContentLanguage()->normalize( $text );
                } else {
                        return $text;
                }
index 502f1e0..837e959 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 use Cdb\Reader as CdbReader;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Functions to check passwords against a policy requirement
@@ -81,10 +82,12 @@ class PasswordPolicyChecks {
         * @return Status error if username and password match, and policy is true
         */
        public static function checkPasswordCannotMatchUsername( $policyVal, User $user, $password ) {
-               global $wgContLang;
                $status = Status::newGood();
                $username = $user->getName();
-               if ( $policyVal && $wgContLang->lc( $password ) === $wgContLang->lc( $username ) ) {
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+               if (
+                       $policyVal && $contLang->lc( $password ) === $contLang->lc( $username )
+               ) {
                        $status->error( 'password-name-match' );
                }
                return $status;
index 830da06..07d8b0b 100644 (file)
@@ -66,7 +66,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
        /** @var Config */
        protected $config;
 
-       /** @var Language The wiki's content language, equivalent to $wgContLang. */
+       /** @var Language The wiki's content language. */
        protected $contLang;
 
        /** @var AuthManager */
index 7018f16..3bf309d 100644 (file)
@@ -129,9 +129,8 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
         * @return bool
         */
        public function getFlip( $context ) {
-               global $wgContLang;
-
-               return $wgContLang->getDir() !== $context->getDirection();
+               return MediaWikiServices::getInstance()->getContentLanguage()->getDir() !==
+                       $context->getDirection();
        }
 
        /**
index 53c10df..2457fe8 100644 (file)
@@ -20,6 +20,8 @@
  * @author Roan Kattouw
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Module for ResourceLoader initialization.
  *
@@ -53,7 +55,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        return $this->configVars[$hash];
                }
 
-               global $wgContLang;
                $conf = $this->getConfig();
 
                // We can't use Title::newMainPage() if 'mainpage' is in
@@ -71,10 +72,11 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                 * - wgNamespaceIds: Key-value pairs of all localized, canonical and aliases for namespaces.
                 * - wgCaseSensitiveNamespaces: Array of namespaces that are case-sensitive.
                 */
-               $namespaceIds = $wgContLang->getNamespaceIds();
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+               $namespaceIds = $contLang->getNamespaceIds();
                $caseSensitiveNamespaces = [];
                foreach ( MWNamespace::getCanonicalNamespaces() as $index => $name ) {
-                       $namespaceIds[$wgContLang->lc( $name )] = $index;
+                       $namespaceIds[$contLang->lc( $name )] = $index;
                        if ( !MWNamespace::isCapitalized( $index ) ) {
                                $caseSensitiveNamespaces[] = $index;
                        }
@@ -101,13 +103,13 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgServer' => $conf->get( 'Server' ),
                        'wgServerName' => $conf->get( 'ServerName' ),
                        'wgUserLanguage' => $context->getLanguage(),
-                       'wgContentLanguage' => $wgContLang->getCode(),
+                       'wgContentLanguage' => $contLang->getCode(),
                        'wgTranslateNumerals' => $conf->get( 'TranslateNumerals' ),
                        'wgVersion' => $conf->get( 'Version' ),
                        'wgEnableAPI' => true, // Deprecated since MW 1.32
                        'wgEnableWriteAPI' => true, // Deprecated since MW 1.32
                        'wgMainPageTitle' => $mainPage->getPrefixedText(),
-                       'wgFormattedNamespaces' => $wgContLang->getFormattedNamespaces(),
+                       'wgFormattedNamespaces' => $contLang->getFormattedNamespaces(),
                        'wgNamespaceIds' => $namespaceIds,
                        'wgContentNamespaces' => MWNamespace::getContentNamespaces(),
                        'wgSiteName' => $conf->get( 'Sitename' ),
index 30c2271..e3088c1 100644 (file)
@@ -232,10 +232,8 @@ abstract class SearchEngine {
         * @return string
         */
        public function normalizeText( $string ) {
-               global $wgContLang;
-
                // Some languages such as Chinese require word segmentation
-               return $wgContLang->segmentByWord( $string );
+               return MediaWikiServices::getInstance()->getContentLanguage()->segmentByWord( $string );
        }
 
        /**
@@ -257,8 +255,8 @@ abstract class SearchEngine {
         * @return SearchNearMatcher
         */
        public function getNearMatcher( Config $config ) {
-               global $wgContLang;
-               return new SearchNearMatcher( $config, $wgContLang );
+               return new SearchNearMatcher( $config,
+                       MediaWikiServices::getInstance()->getContentLanguage() );
        }
 
        /**
@@ -415,8 +413,6 @@ abstract class SearchEngine {
                $withAllKeyword = true,
                $withPrefixSearchExtractNamespaceHook = false
        ) {
-               global $wgContLang;
-
                $parsed = $query;
                if ( strpos( $query, ':' ) === false ) { // nothing to do
                        return false;
@@ -445,7 +441,7 @@ abstract class SearchEngine {
 
                if ( !$allQuery && strpos( $query, ':' ) !== false ) {
                        $prefix = str_replace( ' ', '_', substr( $query, 0, strpos( $query, ':' ) ) );
-                       $index = $wgContLang->getNsIndex( $prefix );
+                       $index = MediaWikiServices::getInstance()->getContentLanguage()->getNsIndex( $prefix );
                        if ( $index !== false ) {
                                $extractedNamespace = [ $index ];
                                $parsed = substr( $query, strlen( $prefix ) + 1 );
@@ -625,9 +621,8 @@ abstract class SearchEngine {
                $results = $this->completionSearchBackendOverfetch( $search );
                $fallbackLimit = 1 + $this->limit - $results->getSize();
                if ( $fallbackLimit > 0 ) {
-                       global $wgContLang;
-
-                       $fallbackSearches = $wgContLang->autoConvertToAllVariants( $search );
+                       $fallbackSearches = MediaWikiServices::getInstance()->getContentLanguage()->
+                               autoConvertToAllVariants( $search );
                        $fallbackSearches = array_diff( array_unique( $fallbackSearches ), [ $search ] );
 
                        foreach ( $fallbackSearches as $fbs ) {
index 2cec241..5dfc4df 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Search
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Highlight bits of wikitext
  *
@@ -49,7 +51,7 @@ class SearchHighlighter {
         * @return string
         */
        public function highlightText( $text, $terms, $contextlines, $contextchars ) {
-               global $wgContLang, $wgSearchHighlightBoundaries;
+               global $wgSearchHighlightBoundaries;
 
                if ( $text == '' ) {
                        return '';
@@ -84,7 +86,10 @@ class SearchHighlighter {
                                                if ( $key == 2 ) {
                                                        // see if this is an image link
                                                        $ns = substr( $val[0], 2, -1 );
-                                                       if ( $wgContLang->getNsIndex( $ns ) != NS_FILE ) {
+                                                       if (
+                                                               MediaWikiServices::getInstance()->getContentLanguage()->
+                                                               getNsIndex( $ns ) != NS_FILE
+                                                       ) {
                                                                break;
                                                        }
 
@@ -313,9 +318,10 @@ class SearchHighlighter {
         * @return string
         */
        function caseCallback( $matches ) {
-               global $wgContLang;
                if ( strlen( $matches[0] ) > 1 ) {
-                       return '[' . $wgContLang->lc( $matches[0] ) . $wgContLang->uc( $matches[0] ) . ']';
+                       $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+                       return '[' . $contLang->lc( $matches[0] ) .
+                               $contLang->uc( $matches[0] ) . ']';
                } else {
                        return $matches[0];
                }
@@ -480,9 +486,8 @@ class SearchHighlighter {
                if ( $colon === false ) {
                        return $matches[2]; // replace with caption
                }
-               global $wgContLang;
                $ns = substr( $matches[1], 0, $colon );
-               $index = $wgContLang->getNsIndex( $ns );
+               $index = MediaWikiServices::getInstance()->getContentLanguage()->getNsIndex( $ns );
                if ( $index !== false && ( $index == NS_FILE || $index == NS_CATEGORY ) ) {
                        return $matches[0]; // return the whole thing
                } else {
@@ -503,8 +508,6 @@ class SearchHighlighter {
         * @return string
         */
        public function highlightSimple( $text, $terms, $contextlines, $contextchars ) {
-               global $wgContLang;
-
                $lines = explode( "\n", $text );
 
                $terms = implode( '|', $terms );
@@ -514,6 +517,7 @@ class SearchHighlighter {
                $lineno = 0;
 
                $extract = "";
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                foreach ( $lines as $line ) {
                        if ( 0 == $contextlines ) {
                                break;
@@ -525,12 +529,12 @@ class SearchHighlighter {
                        }
                        --$contextlines;
                        // truncate function changes ... to relevant i18n message.
-                       $pre = $wgContLang->truncateForVisual( $m[1], - $contextchars, '...', false );
+                       $pre = $contLang->truncateForVisual( $m[1], - $contextchars, '...', false );
 
                        if ( count( $m ) < 3 ) {
                                $post = '';
                        } else {
-                               $post = $wgContLang->truncateForVisual( $m[3], $contextchars, '...', false );
+                               $post = $contLang->truncateForVisual( $m[3], $contextchars, '...', false );
                        }
 
                        $found = $m[2];
index 289f925..0e85f9d 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup Search
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IResultWrapper;
 
 /**
@@ -133,7 +134,6 @@ class SearchMssql extends SearchDatabase {
         * @return string
         */
        private function parseQuery( $filteredText, $fulltext ) {
-               global $wgContLang;
                $lc = $this->legalSearchChars( self::CHARS_NO_SYNTAX );
                $this->searchTerms = [];
 
@@ -144,7 +144,8 @@ class SearchMssql extends SearchDatabase {
                if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
                        $filteredText, $m, PREG_SET_ORDER ) ) {
                        foreach ( $m as $terms ) {
-                               $q[] = $terms[1] . $wgContLang->normalizeForSearch( $terms[2] );
+                               $q[] = $terms[1] . MediaWikiServices::getInstance()->getContentLanguage()->
+                                       normalizeForSearch( $terms[2] );
 
                                if ( !empty( $terms[3] ) ) {
                                        $regexp = preg_quote( $terms[3], '/' );
index 6253b55..806db7d 100644 (file)
@@ -24,6 +24,8 @@
  * @ingroup Search
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Search engine hook for MySQL 4+
  * @ingroup Search
@@ -43,8 +45,6 @@ class SearchMySQL extends SearchDatabase {
         * @return array
         */
        private function parseQuery( $filteredText, $fulltext ) {
-               global $wgContLang;
-
                $lc = $this->legalSearchChars( self::CHARS_NO_SYNTAX ); // Minus syntax chars (" and *)
                $searchon = '';
                $this->searchTerms = [];
@@ -76,7 +76,8 @@ class SearchMySQL extends SearchDatabase {
 
                                // Some languages such as Serbian store the input form in the search index,
                                // so we may need to search for matches in multiple writing system variants.
-                               $convertedVariants = $wgContLang->autoConvertToAllVariants( $term );
+                               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+                               $convertedVariants = $contLang->autoConvertToAllVariants( $term );
                                if ( is_array( $convertedVariants ) ) {
                                        $variants = array_unique( array_values( $convertedVariants ) );
                                } else {
@@ -87,9 +88,7 @@ class SearchMySQL extends SearchDatabase {
                                // around problems with minimum lengths and encoding in MySQL's
                                // fulltext engine.
                                // For Chinese this also inserts spaces between adjacent Han characters.
-                               $strippedVariants = array_map(
-                                       [ $wgContLang, 'normalizeForSearch' ],
-                                       $variants );
+                               $strippedVariants = array_map( [ $contLang, 'normalizeForSearch' ], $variants );
 
                                // Some languages such as Chinese force all variants to a canonical
                                // form when stripping to the low-level search index, so to be sure
@@ -134,10 +133,8 @@ class SearchMySQL extends SearchDatabase {
        }
 
        private function regexTerm( $string, $wildcard ) {
-               global $wgContLang;
-
                $regex = preg_quote( $string, '/' );
-               if ( $wgContLang->hasWordBreaks() ) {
+               if ( MediaWikiServices::getInstance()->getContentLanguage()->hasWordBreaks() ) {
                        if ( $wildcard ) {
                                // Don't cut off the final bit!
                                $regex = "\b$regex";
@@ -389,8 +386,6 @@ class SearchMySQL extends SearchDatabase {
         * @return mixed|string
         */
        function normalizeText( $string ) {
-               global $wgContLang;
-
                $out = parent::normalizeText( $string );
 
                // MySQL fulltext index doesn't grok utf-8, so we
@@ -398,7 +393,7 @@ class SearchMySQL extends SearchDatabase {
                $out = preg_replace_callback(
                        "/([\\xc0-\\xff][\\x80-\\xbf]*)/",
                        [ $this, 'stripForSearchCallback' ],
-                       $wgContLang->lc( $out ) );
+                       MediaWikiServices::getInstance()->getContentLanguage()->lc( $out ) );
 
                // And to add insult to injury, the default indexing
                // ignores short words... Pad them so we can pass them
index 6d7e988..9cd245a 100644 (file)
@@ -24,6 +24,8 @@
  * @ingroup Search
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Search engine hook base class for Oracle (ConText).
  * @ingroup Search
@@ -173,7 +175,6 @@ class SearchOracle extends SearchDatabase {
         * @return string
         */
        private function parseQuery( $filteredText, $fulltext ) {
-               global $wgContLang;
                $lc = $this->legalSearchChars( self::CHARS_NO_SYNTAX );
                $this->searchTerms = [];
 
@@ -185,7 +186,8 @@ class SearchOracle extends SearchDatabase {
                        foreach ( $m as $terms ) {
                                // Search terms in all variant forms, only
                                // apply on wiki with LanguageConverter
-                               $temp_terms = $wgContLang->autoConvertToAllVariants( $terms[2] );
+                               $temp_terms = MediaWikiServices::getInstance()->getContentLanguage()->
+                                       autoConvertToAllVariants( $terms[2] );
                                if ( is_array( $temp_terms ) ) {
                                        $temp_terms = array_unique( array_values( $temp_terms ) );
                                        foreach ( $temp_terms as $t ) {
@@ -212,8 +214,7 @@ class SearchOracle extends SearchDatabase {
        }
 
        private function escapeTerm( $t ) {
-               global $wgContLang;
-               $t = $wgContLang->normalizeForSearch( $t );
+               $t = MediaWikiServices::getInstance()->getContentLanguage()->normalizeForSearch( $t );
                $t = isset( $this->reservedWords[strtoupper( $t )] ) ? '{' . $t . '}' : $t;
                $t = preg_replace( '/^"(.*)"$/', '($1)', $t );
                $t = preg_replace( '/([-&|])/', '\\\\$1', $t );
index 0ed477a..0bc2d37 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Search
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Search engine hook for SQLite
  * @ingroup Search
@@ -43,7 +45,6 @@ class SearchSqlite extends SearchDatabase {
         * @return string
         */
        private function parseQuery( $filteredText, $fulltext ) {
-               global $wgContLang;
                $lc = $this->legalSearchChars( self::CHARS_NO_SYNTAX ); // Minus syntax chars (" and *)
                $searchon = '';
                $this->searchTerms = [];
@@ -70,7 +71,8 @@ class SearchSqlite extends SearchDatabase {
 
                                // Some languages such as Serbian store the input form in the search index,
                                // so we may need to search for matches in multiple writing system variants.
-                               $convertedVariants = $wgContLang->autoConvertToAllVariants( $term );
+                               $convertedVariants = MediaWikiServices::getInstance()->getContentLanguage()->
+                                       autoConvertToAllVariants( $term );
                                if ( is_array( $convertedVariants ) ) {
                                        $variants = array_unique( array_values( $convertedVariants ) );
                                } else {
@@ -82,7 +84,8 @@ class SearchSqlite extends SearchDatabase {
                                // fulltext engine.
                                // For Chinese this also inserts spaces between adjacent Han characters.
                                $strippedVariants = array_map(
-                                       [ $wgContLang, 'normalizeForSearch' ],
+                                       [ MediaWikiServices::getInstance()->getContentLanguage(),
+                                               'normalizeForSearch' ],
                                        $variants );
 
                                // Some languages such as Chinese force all variants to a canonical
@@ -123,10 +126,8 @@ class SearchSqlite extends SearchDatabase {
        }
 
        private function regexTerm( $string, $wildcard ) {
-               global $wgContLang;
-
                $regex = preg_quote( $string, '/' );
-               if ( $wgContLang->hasWordBreaks() ) {
+               if ( MediaWikiServices::getInstance()->getContentLanguage()->hasWordBreaks() ) {
                        if ( $wildcard ) {
                                // Don't cut off the final bit!
                                $regex = "\b$regex";
@@ -171,13 +172,12 @@ class SearchSqlite extends SearchDatabase {
        }
 
        protected function searchInternal( $term, $fulltext ) {
-               global $wgContLang;
-
                if ( !$this->fulltextSearchSupported() ) {
                        return null;
                }
 
-               $filteredTerm = $this->filter( $wgContLang->lc( $term ) );
+               $filteredTerm =
+                       $this->filter( MediaWikiServices::getInstance()->getContentLanguage()->lc( $term ) );
                $resultSet = $this->db->query( $this->getQuery( $filteredTerm, $fulltext ) );
 
                $total = null;
index 58163c6..f3bfb2b 100644 (file)
@@ -612,7 +612,7 @@ final class SessionBackend {
         * Save the session
         *
         * Update both the backend data and the associated WebRequest(s) to
-        * reflect the state of the the SessionBackend. This might include
+        * reflect the state of the SessionBackend. This might include
         * persisting or unpersisting the session.
         *
         * @param bool $closing Whether the session is being closed
index ff2a9ea..83d02a0 100644 (file)
@@ -1306,7 +1306,7 @@ abstract class Skin extends ContextSource {
                                [
                                        'checkKeys' => [
                                                // Unless there is both no exact $code override nor an i18n definition
-                                               // in the the software, the only MediaWiki page to check is for $code.
+                                               // in the software, the only MediaWiki page to check is for $code.
                                                $msgCache->getCheckKey( $this->getLanguage()->getCode() )
                                        ],
                                        'lockTSE' => 30
@@ -1526,7 +1526,7 @@ abstract class Skin extends ContextSource {
         *   should fall back to the next notice in its sequence
         */
        private function getCachedNotice( $name ) {
-               global $wgRenderHashAppend, $wgContLang;
+               global $wgRenderHashAppend;
 
                $needParse = false;
 
@@ -1559,12 +1559,13 @@ abstract class Skin extends ContextSource {
                        }
                );
 
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                return Html::rawElement(
                        'div',
                        [
                                'id' => 'localNotice',
-                               'lang' => $wgContLang->getHtmlCode(),
-                               'dir' => $wgContLang->getDir()
+                               'lang' => $contLang->getHtmlCode(),
+                               'dir' => $contLang->getDir()
                        ],
                        $parsed
                );
index 7b2d79e..ceebf12 100644 (file)
@@ -268,7 +268,7 @@ class SkinTemplate extends Skin {
         * @return QuickTemplate The template to be executed by outputPage
         */
        protected function prepareQuickTemplate() {
-               global $wgContLang, $wgScript, $wgStylePath, $wgMimeType, $wgJsMimeType,
+               global $wgScript, $wgStylePath, $wgMimeType, $wgJsMimeType,
                        $wgSitename, $wgLogo, $wgMaxCredits,
                        $wgShowCreditsIfMax, $wgArticlePath,
                        $wgScriptPath, $wgServer;
@@ -363,7 +363,11 @@ class SkinTemplate extends Skin {
                // heading for the page title. Defaults to empty string.
                $tpl->set( 'prebodyhtml', '' );
 
-               if ( $userLangCode !== $wgContLang->getHtmlCode() || $userLangDir !== $wgContLang->getDir() ) {
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+               if (
+                       $userLangCode !== $contLang->getHtmlCode() ||
+                       $userLangDir !== $contLang->getDir()
+               ) {
                        $escUserlang = htmlspecialchars( $userLangCode );
                        $escUserdir = htmlspecialchars( $userLangDir );
                        // Attributes must be in double quotes because htmlspecialchars() doesn't
@@ -783,9 +787,8 @@ class SkinTemplate extends Skin {
                if ( $msg->exists() ) {
                        $text = $msg->text();
                } else {
-                       global $wgContLang;
-                       $text = $wgContLang->getConverter()->convertNamespace(
-                               MWNamespace::getSubject( $title->getNamespace() ) );
+                       $text = MediaWikiServices::getInstance()->getContentLanguage()->getConverter()->
+                               convertNamespace( MWNamespace::getSubject( $title->getNamespace() ) );
                }
 
                // Avoid PHP 7.1 warning of passing $this by reference
index 7d6db05..ad66e31 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
@@ -50,12 +51,11 @@ abstract class PageQueryPage extends QueryPage {
         * @return string
         */
        public function formatResult( $skin, $row ) {
-               global $wgContLang;
-
                $title = Title::makeTitleSafe( $row->namespace, $row->title );
 
                if ( $title instanceof Title ) {
-                       $text = $wgContLang->convert( $title->getPrefixedText() );
+                       $text = MediaWikiServices::getInstance()->getContentLanguage()->
+                               convert( $title->getPrefixedText() );
                        return $this->getLinkRenderer()->makeLink( $title, $text );
                } else {
                        return Html::element( 'span', [ 'class' => 'mw-invalidtitle' ],
index 96f50bf..16a6d30 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 use Wikimedia\Rdbms\DBError;
@@ -690,8 +691,6 @@ abstract class QueryPage extends SpecialPage {
         * @param int $offset Paging offset
         */
        protected function outputResults( $out, $skin, $dbr, $res, $num, $offset ) {
-               global $wgContLang;
-
                if ( $num > 0 ) {
                        $html = [];
                        if ( !$this->listoutput ) {
@@ -726,7 +725,7 @@ abstract class QueryPage extends SpecialPage {
                        }
 
                        $html = $this->listoutput
-                               ? $wgContLang->listToText( $html )
+                               ? MediaWikiServices::getInstance()->getContentLanguage()->listToText( $html )
                                : implode( '', $html );
 
                        $out->addHTML( $html );
index 7a39b3c..13287bd 100644 (file)
@@ -628,10 +628,9 @@ class SpecialPage implements MessageLocalizer {
         * @param string $summaryMessageKey Message key of the summary
         */
        function outputHeader( $summaryMessageKey = '' ) {
-               global $wgContLang;
-
                if ( $summaryMessageKey == '' ) {
-                       $msg = $wgContLang->lc( $this->getName() ) . '-summary';
+                       $msg = MediaWikiServices::getInstance()->getContentLanguage()->lc( $this->getName() ) .
+                               '-summary';
                } else {
                        $msg = $summaryMessageKey;
                }
@@ -832,8 +831,9 @@ class SpecialPage implements MessageLocalizer {
                        return;
                }
 
-               global $wgContLang;
-               $msg = $this->msg( $wgContLang->lc( $this->getName() ) . '-helppage' );
+               $msg = $this->msg(
+                       MediaWikiServices::getInstance()->getContentLanguage()->lc( $this->getName() ) .
+                       '-helppage' );
 
                if ( !$msg->isDisabled() ) {
                        $helpUrl = Skin::makeUrl( $msg->plain() );
index b3b63b0..9645811 100644 (file)
@@ -22,6 +22,7 @@
  * @defgroup SpecialPage SpecialPage
  */
 use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
 use Wikimedia\ObjectFactory;
 
 /**
@@ -270,9 +271,9 @@ class SpecialPageFactory {
         * @return array
         */
        private static function getAliasList() {
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                if ( is_null( self::$aliases ) ) {
-                       global $wgContLang;
-                       $aliases = $wgContLang->getSpecialPageAliases();
+                       $aliases = $contLang->getSpecialPageAliases();
                        $pageList = self::getPageList();
 
                        self::$aliases = [];
@@ -280,7 +281,7 @@ class SpecialPageFactory {
 
                        // Force every canonical name to be an alias for itself.
                        foreach ( $pageList as $name => $stuff ) {
-                               $caseFoldedAlias = $wgContLang->caseFold( $name );
+                               $caseFoldedAlias = $contLang->caseFold( $name );
                                self::$aliases[$caseFoldedAlias] = $name;
                                $keepAlias[$caseFoldedAlias] = 'canonical';
                        }
@@ -290,7 +291,7 @@ class SpecialPageFactory {
                                foreach ( $aliases as $realName => $aliasList ) {
                                        $aliasList = array_values( $aliasList );
                                        foreach ( $aliasList as $i => $alias ) {
-                                               $caseFoldedAlias = $wgContLang->caseFold( $alias );
+                                               $caseFoldedAlias = $contLang->caseFold( $alias );
 
                                                if ( isset( self::$aliases[$caseFoldedAlias] ) &&
                                                        $realName === self::$aliases[$caseFoldedAlias]
@@ -327,10 +328,10 @@ class SpecialPageFactory {
         * @return array Array( String, String|null ), or array( null, null ) if the page is invalid
         */
        public static function resolveAlias( $alias ) {
-               global $wgContLang;
                $bits = explode( '/', $alias, 2 );
 
-               $caseFoldedAlias = $wgContLang->caseFold( $bits[0] );
+               $caseFoldedAlias = MediaWikiServices::getInstance()->getContentLanguage()->
+                       caseFold( $bits[0] );
                $caseFoldedAlias = str_replace( ' ', '_', $caseFoldedAlias );
                $aliases = self::getAliasList();
                if ( isset( $aliases[$caseFoldedAlias] ) ) {
@@ -646,15 +647,15 @@ class SpecialPageFactory {
         * @return string
         */
        public static function getLocalNameFor( $name, $subpage = false ) {
-               global $wgContLang;
-               $aliases = $wgContLang->getSpecialPageAliases();
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+               $aliases = $contLang->getSpecialPageAliases();
                $aliasList = self::getAliasList();
 
                // Find the first alias that maps back to $name
                if ( isset( $aliases[$name] ) ) {
                        $found = false;
                        foreach ( $aliases[$name] as $alias ) {
-                               $caseFoldedAlias = $wgContLang->caseFold( $alias );
+                               $caseFoldedAlias = $contLang->caseFold( $alias );
                                $caseFoldedAlias = str_replace( ' ', '_', $caseFoldedAlias );
                                if ( isset( $aliasList[$caseFoldedAlias] ) &&
                                        $aliasList[$caseFoldedAlias] === $name
@@ -690,7 +691,7 @@ class SpecialPageFactory {
                        $name = "$name/$subpage";
                }
 
-               return $wgContLang->ucfirst( $name );
+               return $contLang->ucfirst( $name );
        }
 
        /**
index ecc030e..ff44bda 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Implements Special:Ancientpages
  *
@@ -74,14 +76,13 @@ class AncientPagesPage extends QueryPage {
         * @return string
         */
        function formatResult( $skin, $result ) {
-               global $wgContLang;
-
                $d = $this->getLanguage()->userTimeAndDate( $result->value, $this->getUser() );
                $title = Title::makeTitle( $result->namespace, $result->title );
                $linkRenderer = $this->getLinkRenderer();
                $link = $linkRenderer->makeKnownLink(
                        $title,
-                       $wgContLang->convert( $title->getPrefixedText() )
+                       MediaWikiServices::getInstance()->getContentLanguage()->
+                               convert( $title->getPrefixedText() )
                );
 
                return $this->getLanguage()->specialList( $link, htmlspecialchars( $d ) );
index 72e0b88..c187156 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Special page outputs information on sourcing a book with a particular ISBN
  * The parser creates links to this page when dealing with ISBNs in wikitext
@@ -154,8 +156,6 @@ class SpecialBookSources extends SpecialPage {
        private function showList( $isbn ) {
                $out = $this->getOutput();
 
-               global $wgContLang;
-
                $isbn = self::cleanIsbn( $isbn );
                # Hook to allow extensions to insert additional HTML,
                # e.g. for API-interacting plugins and so on
@@ -183,7 +183,7 @@ class SpecialBookSources extends SpecialPage {
                # Fall back to the defaults given in the language file
                $out->addWikiMsg( 'booksources-text' );
                $out->addHTML( '<ul>' );
-               $items = $wgContLang->getBookstoreList();
+               $items = MediaWikiServices::getInstance()->getContentLanguage()->getBookstoreList();
                foreach ( $items as $label => $url ) {
                        $out->addHTML( $this->makeListItem( $isbn, $label, $url ) );
                }
index 7491f86..7013e40 100644 (file)
@@ -535,8 +535,6 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         * @return HTMLForm
         */
        protected function getNormalForm() {
-               global $wgContLang;
-
                $fields = [];
                $count = 0;
 
@@ -582,7 +580,8 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 
                                $nsText = ( $ns == NS_MAIN )
                                        ? $this->msg( 'blanknamespace' )->escaped()
-                                       : htmlspecialchars( $wgContLang->getFormattedNsText( $ns ) );
+                                       : htmlspecialchars( MediaWikiServices::getInstance()->getContentLanguage()->
+                                               getFormattedNsText( $ns ) );
                                $this->toc .= Linker::tocLine( "editwatchlist-{$data['section']}", $nsText,
                                        $this->getLanguage()->formatNum( ++$tocLength ), 1 ) . Linker::tocLineEnd();
                        }
index 5a98bb9..4407259 100644 (file)
@@ -421,8 +421,6 @@ class SpecialExport extends SpecialPage {
         * @return array
         */
        private function getPagesFromCategory( $title ) {
-               global $wgContLang;
-
                $maxPages = $this->getConfig()->get( 'ExportPagelistLimit' );
 
                $name = $title->getDBkey();
@@ -441,7 +439,8 @@ class SpecialExport extends SpecialPage {
                foreach ( $res as $row ) {
                        $n = $row->page_title;
                        if ( $row->page_namespace ) {
-                               $ns = $wgContLang->getNsText( $row->page_namespace );
+                               $ns = MediaWikiServices::getInstance()->getContentLanguage()->getNsText(
+                                       $row->page_namespace );
                                $n = $ns . ':' . $n;
                        }
 
@@ -456,8 +455,6 @@ class SpecialExport extends SpecialPage {
         * @return array
         */
        private function getPagesFromNamespace( $nsindex ) {
-               global $wgContLang;
-
                $maxPages = $this->getConfig()->get( 'ExportPagelistLimit' );
 
                $dbr = wfGetDB( DB_REPLICA );
@@ -475,7 +472,8 @@ class SpecialExport extends SpecialPage {
                        $n = $row->page_title;
 
                        if ( $row->page_namespace ) {
-                               $ns = $wgContLang->getNsText( $row->page_namespace );
+                               $ns = MediaWikiServices::getInstance()->getContentLanguage()->getNsText(
+                                       $row->page_namespace );
                                $n = $ns . ':' . $n;
                        }
 
index f20829f..4a57c95 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Special page for listing the articles with the fewest revisions.
  *
@@ -68,8 +70,6 @@ class FewestrevisionsPage extends QueryPage {
         * @return string
         */
        function formatResult( $skin, $result ) {
-               global $wgContLang;
-
                $nt = Title::makeTitleSafe( $result->namespace, $result->title );
                if ( !$nt ) {
                        return Html::element(
@@ -83,7 +83,8 @@ class FewestrevisionsPage extends QueryPage {
                        );
                }
                $linkRenderer = $this->getLinkRenderer();
-               $text = $wgContLang->convert( $nt->getPrefixedText() );
+               $text = MediaWikiServices::getInstance()->getContentLanguage()->
+                       convert( $nt->getPrefixedText() );
                $plink = $linkRenderer->makeLink( $nt, $text );
 
                $nl = $this->msg( 'nrevisions' )->numParams( $result->value )->text();
index 83e18c2..3115adc 100644 (file)
@@ -207,11 +207,9 @@ class FileDuplicateSearchPage extends QueryPage {
         * @return string HTML
         */
        function formatResult( $skin, $result ) {
-               global $wgContLang;
-
                $linkRenderer = $this->getLinkRenderer();
                $nt = $result->getTitle();
-               $text = $wgContLang->convert( $nt->getText() );
+               $text = MediaWikiServices::getInstance()->getContentLanguage()->convert( $nt->getText() );
                $plink = $linkRenderer->makeLink(
                        $nt,
                        $text
index 6091a64..8802a38 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This special page lists all defined user groups and the associated rights.
  * See also @ref $wgGroupPermissions.
@@ -133,7 +135,6 @@ class SpecialListGroupRights extends SpecialPage {
        }
 
        private function outputNamespaceProtectionInfo() {
-               global $wgContLang;
                $out = $this->getOutput();
                $namespaceProtection = $this->getConfig()->get( 'NamespaceProtection' );
 
@@ -169,7 +170,8 @@ class SpecialListGroupRights extends SpecialPage {
                        if ( $namespace == NS_MAIN ) {
                                $namespaceText = $this->msg( 'blanknamespace' )->text();
                        } else {
-                               $namespaceText = $wgContLang->convertNamespace( $namespace );
+                               $namespaceText = MediaWikiServices::getInstance()->getContentLanguage()->
+                                       convertNamespace( $namespace );
                        }
 
                        $out->addHTML(
index fb04b90..a2c2530 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * A form to make the database readonly (eg for maintenance purposes).
  *
@@ -74,8 +76,6 @@ class SpecialLockdb extends FormSpecialPage {
        }
 
        public function onSubmit( array $data ) {
-               global $wgContLang;
-
                if ( !$data['Confirm'] ) {
                        return Status::newFatal( 'locknoconfirm' );
                }
@@ -92,10 +92,11 @@ class SpecialLockdb extends FormSpecialPage {
                }
                fwrite( $fp, $data['Reason'] );
                $timestamp = wfTimestampNow();
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                fwrite( $fp, "\n<p>" . $this->msg( 'lockedbyandtime',
                        $this->getUser()->getName(),
-                       $wgContLang->date( $timestamp, false, false ),
-                       $wgContLang->time( $timestamp, false, false )
+                       $contLang->date( $timestamp, false, false ),
+                       $contLang->time( $timestamp, false, false )
                )->inContentLanguage()->text() . "</p>\n" );
                fclose( $fp );
 
index f43ed9b..18c163e 100644 (file)
@@ -22,6 +22,8 @@
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Searches the database for files of the requested MIME type, comparing this with the
  * 'img_major_mime' and 'img_minor_mime' fields in the image table.
@@ -182,11 +184,9 @@ class MIMEsearchPage extends QueryPage {
         * @return string
         */
        function formatResult( $skin, $result ) {
-               global $wgContLang;
-
                $linkRenderer = $this->getLinkRenderer();
                $nt = Title::makeTitle( $result->namespace, $result->title );
-               $text = $wgContLang->convert( $nt->getText() );
+               $text = MediaWikiServices::getInstance()->getContentLanguage()->convert( $nt->getText() );
                $plink = $linkRenderer->makeLink(
                        Title::newFromText( $nt->getPrefixedText() ),
                        $text
index f238f6c..b80e518 100644 (file)
@@ -24,6 +24,7 @@
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
@@ -71,8 +72,6 @@ class MostlinkedCategoriesPage extends QueryPage {
         * @return string
         */
        function formatResult( $skin, $result ) {
-               global $wgContLang;
-
                $nt = Title::makeTitleSafe( NS_CATEGORY, $result->title );
                if ( !$nt ) {
                        return Html::element(
@@ -85,7 +84,7 @@ class MostlinkedCategoriesPage extends QueryPage {
                        );
                }
 
-               $text = $wgContLang->convert( $nt->getText() );
+               $text = MediaWikiServices::getInstance()->getContentLanguage()->convert( $nt->getText() );
                $plink = $this->getLinkRenderer()->makeLink( $nt, $text );
                $nlinks = $this->msg( 'nmembers' )->numParams( $result->value )->escaped();
 
index 37d96f4..537db9e 100644 (file)
@@ -23,6 +23,8 @@
  * @copyright Copyright © 2010-2013 Niklas Laxström, Siebrand Mazeland
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Unlisted special page just to redirect the user to the translated version of
  * a page, if it exists.
@@ -90,17 +92,17 @@ class SpecialMyLanguage extends RedirectSpecialArticle {
                        $base = $page->getRedirectTarget();
                }
 
-               $uiCode = $this->getLanguage()->getCode();
-               $wikiLangCode = $this->getConfig()->get( 'LanguageCode' );
+               $uiLang = $this->getLanguage();
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
 
-               if ( $uiCode === $wikiLangCode ) {
+               if ( $uiLang->equals( $contLang ) ) {
                        // Short circuit when the current UI language is the
                        // wiki's default language to avoid unnecessary page lookups.
                        return $base;
                }
 
                // Check for a subpage in current UI language
-               $proposed = $base->getSubpage( $uiCode );
+               $proposed = $base->getSubpage( $uiLang->getCode() );
                if ( $proposed && $proposed->exists() ) {
                        return $proposed;
                }
@@ -111,9 +113,9 @@ class SpecialMyLanguage extends RedirectSpecialArticle {
                }
 
                // Check for fallback languages specified by the UI language
-               $possibilities = Language::getFallbacksFor( $uiCode );
+               $possibilities = $uiLang->getFallbackLanguages();
                foreach ( $possibilities as $lang ) {
-                       if ( $lang !== $wikiLangCode ) {
+                       if ( $lang !== $contLang->getCode() ) {
                                $proposed = $base->getSubpage( $lang );
                                if ( $proposed && $proposed->exists() ) {
                                        return $proposed;
index 693b8aa..7526c3e 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 class SpecialNewFiles extends IncludableSpecialPage {
        /** @var FormOptions */
        protected $opts;
@@ -213,13 +215,15 @@ class SpecialNewFiles extends IncludableSpecialPage {
         * Send the text to be displayed above the options
         */
        function setTopText() {
-               global $wgContLang;
-
                $message = $this->msg( 'newimagestext' )->inContentLanguage();
                if ( !$message->isDisabled() ) {
+                       $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                        $this->getOutput()->addWikiText(
                                Html::rawElement( 'p',
-                                       [ 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ],
+                                       [
+                                               'lang' => $contLang->getHtmlCode(),
+                                               'dir' => $contLang->getDir()
+                                       ],
                                        "\n" . $message->plain() . "\n"
                                ),
                                /* $lineStart */ false,
index 2a8a09d..f7906db 100644 (file)
@@ -48,8 +48,6 @@ class SpecialPrefixindex extends SpecialAllPages {
         * @param string $par Becomes "FOO" when called like Special:Prefixindex/FOO (default null)
         */
        function execute( $par ) {
-               global $wgContLang;
-
                $this->setHeaders();
                $this->outputHeader();
 
@@ -65,7 +63,7 @@ class SpecialPrefixindex extends SpecialAllPages {
                $this->hideRedirects = $request->getBool( 'hideredirects', $this->hideRedirects );
                $this->stripPrefix = $request->getBool( 'stripprefix', $this->stripPrefix );
 
-               $namespaces = $wgContLang->getNamespaces();
+               $namespaces = MediaWikiServices::getInstance()->getContentLanguage()->getNamespaces();
                $out->setPageTitle(
                        ( $namespace > 0 && array_key_exists( $namespace, $namespaces ) )
                                ? $this->msg( 'prefixindex-namespace', str_replace( '_', ' ', $namespaces[$namespace] ) )
@@ -143,15 +141,13 @@ class SpecialPrefixindex extends SpecialAllPages {
         * @param string|null $from List all pages from this name (default false)
         */
        protected function showPrefixChunk( $namespace, $prefix, $from = null ) {
-               global $wgContLang;
-
                if ( $from === null ) {
                        $from = $prefix;
                }
 
                $fromList = $this->getNamespaceKeyAndText( $namespace, $from );
                $prefixList = $this->getNamespaceKeyAndText( $namespace, $prefix );
-               $namespaces = $wgContLang->getNamespaces();
+               $namespaces = MediaWikiServices::getInstance()->getContentLanguage()->getNamespaces();
                $res = null;
                $n = 0;
                $nextRow = null;
index e3b567d..7e5a73f 100644 (file)
@@ -22,6 +22,8 @@
  * @author Rob Church <robchur@gmail.com>, Ilmari Karonen
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Special page to direct the user to a random page
  *
@@ -54,12 +56,11 @@ class RandomPage extends SpecialPage {
        }
 
        public function execute( $par ) {
-               global $wgContLang;
-
                if ( is_string( $par ) ) {
                        // Testing for stringiness since we want to catch
                        // the empty string to mean main namespace only.
-                       $this->setNamespace( $wgContLang->getNsIndex( $par ) );
+                       $this->setNamespace(
+                               MediaWikiServices::getInstance()->getContentLanguage()->getNsIndex( $par ) );
                }
 
                $title = $this->getRandomTitle();
@@ -85,17 +86,17 @@ class RandomPage extends SpecialPage {
         * @return string
         */
        private function getNsList() {
-               global $wgContLang;
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                $nsNames = [];
                foreach ( $this->namespaces as $n ) {
                        if ( $n === NS_MAIN ) {
                                $nsNames[] = $this->msg( 'blanknamespace' )->plain();
                        } else {
-                               $nsNames[] = $wgContLang->getNsText( $n );
+                               $nsNames[] = $contLang->getNsText( $n );
                        }
                }
 
-               return $wgContLang->commaList( $nsNames );
+               return $contLang->commaList( $nsNames );
        }
 
        /**
index 2496192..983f74c 100644 (file)
@@ -578,10 +578,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
         * @param FormOptions $opts Unused
         */
        function setTopText( FormOptions $opts ) {
-               global $wgContLang;
-
                $message = $this->msg( 'recentchangestext' )->inContentLanguage();
                if ( !$message->isDisabled() ) {
+                       $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                        // Parse the message in this weird ugly way to preserve the ability to include interlanguage
                        // links in it (T172461). In the future when T66969 is resolved, perhaps we can just use
                        // $message->parse() instead. This code is copied from Message::parseText().
@@ -592,7 +591,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                                // Message class sets the interface flag to false when parsing in a language different than
                                // user language, and this is wiki content language
                                /*interface*/false,
-                               $wgContLang
+                               $contLang
                        );
                        $content = $parserOutput->getText( [
                                'enableSectionEditLinks' => false,
@@ -601,8 +600,8 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        $this->getOutput()->addParserOutputMetadata( $parserOutput );
 
                        $langAttributes = [
-                               'lang' => $wgContLang->getHtmlCode(),
-                               'dir' => $wgContLang->getDir(),
+                               'lang' => $contLang->getHtmlCode(),
+                               'dir' => $contLang->getDir(),
                        ];
 
                        $topLinksAttributes = [ 'class' => 'mw-recentchanges-toplinks' ];
index 2cff90e..78a54f5 100644 (file)
@@ -269,8 +269,6 @@ class SpecialSearch extends SpecialPage {
         * @param string $term
         */
        public function showResults( $term ) {
-               global $wgContLang;
-
                if ( $this->searchEngineType !== null ) {
                        $this->setExtraParam( 'srbackend', $this->searchEngineType );
                }
@@ -281,7 +279,8 @@ class SpecialSearch extends SpecialPage {
                        $this->searchConfig,
                        $this->getSearchProfiles()
                );
-               $filePrefix = $wgContLang->getFormattedNsText( NS_FILE ) . ':';
+               $filePrefix = MediaWikiServices::getInstance()->getContentLanguage()->
+                       getFormattedNsText( NS_FILE ) . ':';
                if ( trim( $term ) === '' || $filePrefix === trim( $term ) ) {
                        // Empty query -- straight view of search form
                        if ( !Hooks::run( 'SpecialSearchResultsPrepend', [ $this, $out, $term ] ) ) {
index 0ea7dfa..a3a9bc6 100644 (file)
@@ -24,6 +24,7 @@
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
@@ -109,15 +110,14 @@ class UnwatchedpagesPage extends QueryPage {
         * @return string
         */
        function formatResult( $skin, $result ) {
-               global $wgContLang;
-
                $nt = Title::makeTitleSafe( $result->namespace, $result->title );
                if ( !$nt ) {
                        return Html::element( 'span', [ 'class' => 'mw-invalidtitle' ],
                                Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
                }
 
-               $text = $wgContLang->convert( $nt->getPrefixedText() );
+               $text = MediaWikiServices::getInstance()->getContentLanguage()->
+                       convert( $nt->getPrefixedText() );
 
                $linkRenderer = $this->getLinkRenderer();
 
index d323c9e..2accef6 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * A querypage to list the most wanted categories - implements Special:Wantedcategories
  *
@@ -88,10 +90,8 @@ class WantedCategoriesPage extends WantedQueryPage {
         * @return string
         */
        function formatResult( $skin, $result ) {
-               global $wgContLang;
-
                $nt = Title::makeTitle( $result->namespace, $result->title );
-               $text = $wgContLang->convert( $nt->getText() );
+               $text = MediaWikiServices::getInstance()->getContentLanguage()->convert( $nt->getText() );
 
                if ( !$this->isCached() ) {
                        // We can assume the freshest data
index 0b6c165..51e63d9 100644 (file)
@@ -23,6 +23,8 @@
  * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * A License class for use on Special:Upload
  */
@@ -57,8 +59,6 @@ class Licenses extends HTMLFormField {
         * @return string
         */
        protected static function getMessageFromParams( $params ) {
-               global $wgContLang;
-
                if ( !empty( $params['licenses'] ) ) {
                        return $params['licenses'];
                }
@@ -72,7 +72,8 @@ class Licenses extends HTMLFormField {
                // Also see https://phabricator.wikimedia.org/T3495
                $defaultMsg = wfMessage( 'licenses' )->inContentLanguage();
                if ( !$defaultMsg->exists() || $defaultMsg->plain() === '-' ) {
-                       $defaultMsg = wfMessage( 'licenses' )->inLanguage( $wgContLang );
+                       $defaultMsg = wfMessage( 'licenses' )->inLanguage(
+                               MediaWikiServices::getInstance()->getContentLanguage() );
                }
 
                return $defaultMsg->plain();
index e37200f..da4398a 100644 (file)
@@ -260,12 +260,11 @@ class UploadForm extends HTMLForm {
                                $file = null;
                        }
                        if ( $file ) {
-                               global $wgContLang;
-
                                $mto = $file->transform( [ 'width' => 120 ] );
                                if ( $mto ) {
                                        $this->addHeaderText(
-                                               '<div class="thumb t' . $wgContLang->alignEnd() . '">' .
+                                               '<div class="thumb t' .
+                                               MediaWikiServices::getInstance()->getContentLanguage()->alignEnd() . '">' .
                                                Html::element( 'img', [
                                                        'src' => $mto->getUrl(),
                                                        'class' => 'thumbimage',
index 5addd9c..2e451ec 100644 (file)
@@ -19,6 +19,7 @@
  * @ingroup Pager
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\FakeResultWrapper;
 
 /**
@@ -27,8 +28,6 @@ use Wikimedia\Rdbms\FakeResultWrapper;
  *
  * @ingroup Pager
  */
-use MediaWiki\MediaWikiServices;
-
 class AllMessagesTablePager extends TablePager {
 
        protected $filter, $prefix, $langcode, $displayPrefix;
@@ -54,13 +53,12 @@ class AllMessagesTablePager extends TablePager {
                $this->mDefaultDirection = IndexPager::DIR_DESCENDING;
                $this->mLimitsShown = [ 20, 50, 100, 250, 500, 5000 ];
 
-               global $wgContLang;
-
                $this->talk = $this->msg( 'talkpagelinktext' )->escaped();
 
-               $this->lang = $langObj ?: $wgContLang;
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+               $this->lang = $langObj ?: $contLang;
                $this->langcode = $this->lang->getCode();
-               $this->foreign = !$this->lang->equals( $wgContLang );
+               $this->foreign = !$this->lang->equals( $contLang );
 
                $request = $this->getRequest();
 
index 44cf90d..307050b 100644 (file)
@@ -18,6 +18,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * A parser that translates page titles on a foreign wiki into ForeignTitle
  * objects, with no knowledge of the namespace setup on the foreign site.
@@ -42,8 +44,6 @@ class NaiveForeignTitleFactory implements ForeignTitleFactory {
        public function createForeignTitle( $title, $ns = null ) {
                $pieces = explode( ':', $title, 2 );
 
-               global $wgContLang;
-
                /**
                 * Can we assume that the part of the page title before the colon is a
                 * namespace name?
@@ -56,9 +56,10 @@ class NaiveForeignTitleFactory implements ForeignTitleFactory {
                 * ID, we fall back to using the local wiki's namespace names to resolve
                 * this -- better than nothing, and mimics the old crappy behavior
                 */
-               $isNamespacePartValid = is_null( $ns ) ?
-                       ( $wgContLang->getNsIndex( $pieces[0] ) !== false ) :
-                       $ns != 0;
+               $isNamespacePartValid = is_null( $ns )
+                       ? MediaWikiServices::getInstance()->getContentLanguage()->getNsIndex( $pieces[0] ) !==
+                               false
+                       : $ns != 0;
 
                if ( count( $pieces ) === 2 && $isNamespacePartValid ) {
                        list( $namespaceName, $pageName ) = $pieces;
index 5cb6112..4da9395 100644 (file)
@@ -18,6 +18,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * A class to convert page titles on a foreign wiki (ForeignTitle objects) into
  * page titles on the local wiki (Title objects), using a default namespace
@@ -39,8 +41,6 @@ class NaiveImportTitleFactory implements ImportTitleFactory {
         * @return Title|null
         */
        public function createTitleFromForeignTitle( ForeignTitle $foreignTitle ) {
-               global $wgContLang;
-
                if ( $foreignTitle->isNamespaceIdKnown() ) {
                        $foreignNs = $foreignTitle->getNamespaceId();
 
@@ -53,7 +53,8 @@ class NaiveImportTitleFactory implements ImportTitleFactory {
 
                // Do we have a local namespace by the same name as the foreign
                // namespace?
-               $targetNs = $wgContLang->getNsIndex( $foreignTitle->getNamespaceName() );
+               $targetNs = MediaWikiServices::getInstance()->getContentLanguage()->getNsIndex(
+                       $foreignTitle->getNamespaceName() );
                if ( $targetNs !== false ) {
                        return Title::makeTitleSafe( $targetNs, $foreignTitle->getText() );
                }
index 5e57a18..7bebe80 100644 (file)
@@ -986,13 +986,13 @@ class User implements IDBAccessObject, UserIdentity {
         * @return bool
         */
        public static function isValidUserName( $name ) {
-               global $wgContLang, $wgMaxNameChars;
+               global $wgMaxNameChars;
 
                if ( $name == ''
                        || self::isIP( $name )
                        || strpos( $name, '/' ) !== false
                        || strlen( $name ) > $wgMaxNameChars
-                       || $name != $wgContLang->ucfirst( $name )
+                       || $name != MediaWikiServices::getInstance()->getContentLanguage()->ucfirst( $name )
                ) {
                        return false;
                }
@@ -1228,8 +1228,7 @@ class User implements IDBAccessObject, UserIdentity {
         */
        public static function getCanonicalName( $name, $validate = 'valid' ) {
                // Force usernames to capital
-               global $wgContLang;
-               $name = $wgContLang->ucfirst( $name );
+               $name = MediaWikiServices::getInstance()->getContentLanguage()->ucfirst( $name );
 
                # Reject names containing '#'; these will be cleaned up
                # with title normalisation, but then it's too late to
@@ -1761,24 +1760,29 @@ class User implements IDBAccessObject, UserIdentity {
         * @return array Array of String options
         */
        public static function getDefaultOptions() {
-               global $wgNamespacesToBeSearchedDefault, $wgDefaultUserOptions, $wgContLang, $wgDefaultSkin;
+               global $wgNamespacesToBeSearchedDefault, $wgDefaultUserOptions, $wgDefaultSkin;
 
                static $defOpt = null;
                static $defOptLang = null;
 
-               if ( $defOpt !== null && $defOptLang === $wgContLang->getCode() ) {
-                       // $wgContLang does not change (and should not change) mid-request,
-                       // but the unit tests change it anyway, and expect this method to
-                       // return values relevant to the current $wgContLang.
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+               if ( $defOpt !== null && $defOptLang === $contLang->getCode() ) {
+                       // The content language does not change (and should not change) mid-request, but the
+                       // unit tests change it anyway, and expect this method to return values relevant to the
+                       // current content language.
                        return $defOpt;
                }
 
                $defOpt = $wgDefaultUserOptions;
                // Default language setting
-               $defOptLang = $wgContLang->getCode();
+               $defOptLang = $contLang->getCode();
                $defOpt['language'] = $defOptLang;
                foreach ( LanguageConverter::$languagesWithVariants as $langCode ) {
-                       $defOpt[$langCode == $wgContLang->getCode() ? 'variant' : "variant-$langCode"] = $langCode;
+                       if ( $langCode === $contLang->getCode() ) {
+                               $defOpt['variant'] = $langCode;
+                       } else {
+                               $defOpt["variant-$langCode"] = $langCode;
+                       }
                }
 
                // NOTE: don't use SearchEngineConfig::getSearchableNamespaces here,
@@ -5453,8 +5457,6 @@ class User implements IDBAccessObject, UserIdentity {
         * @param array|null $data Rows for the current user out of the user_properties table
         */
        protected function loadOptions( $data = null ) {
-               global $wgContLang;
-
                $this->load();
 
                if ( $this->mOptionsLoaded ) {
@@ -5468,7 +5470,7 @@ class User implements IDBAccessObject, UserIdentity {
                        // There's no need to do it for logged-in users: they can set preferences,
                        // and handling of page content is done by $pageLang->getPreferredVariant() and such,
                        // so don't override user's choice (especially when the user chooses site default).
-                       $variant = $wgContLang->getDefaultVariant();
+                       $variant = MediaWikiServices::getInstance()->getContentLanguage()->getDefaultVariant();
                        $this->mOptions['variant'] = $variant;
                        $this->mOptions['language'] = $variant;
                        $this->mOptionsLoaded = true;
index 8521e68..1a885b0 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace MediaWiki\Widget\Search;
 
+use MediaWiki\MediaWikiServices;
 use Message;
 use SearchResultSet;
 use SpecialSearch;
@@ -42,8 +43,6 @@ class BasicSearchResultSetWidget {
                SearchResultSet $titleResultSet = null,
                SearchResultSet $textResultSet = null
        ) {
-               global $wgContLang;
-
                $hasTitle = $titleResultSet ? $titleResultSet->numRows() > 0 : false;
                $hasText = $textResultSet ? $textResultSet->numRows() > 0 : false;
                $hasSecondary = $textResultSet
@@ -95,7 +94,7 @@ class BasicSearchResultSetWidget {
 
                // Convert the whole thing to desired language variant
                // TODO: Move this up to Special:Search?
-               return $wgContLang->convert( $out );
+               return MediaWikiServices::getInstance()->getContentLanguage()->convert( $out );
        }
 
        /**
@@ -118,9 +117,8 @@ class BasicSearchResultSetWidget {
         * @return string HTML
         */
        protected function renderResultSet( SearchResultSet $resultSet, $offset ) {
-               global $wgContLang;
-
-               $terms = $wgContLang->convertForSearchResult( $resultSet->termMatches() );
+               $terms = MediaWikiServices::getInstance()->getContentLanguage()->
+                       convertForSearchResult( $resultSet->termMatches() );
 
                $hits = [];
                foreach ( $resultSet as $result ) {
index 95875cd..735806b 100644 (file)
@@ -4,6 +4,7 @@ namespace MediaWiki\Widget\Search;
 
 use Hooks;
 use Html;
+use MediaWiki\MediaWikiServices;
 use MediaWiki\Widget\SearchInputWidget;
 use MWNamespace;
 use SearchEngineConfig;
@@ -171,11 +172,10 @@ class SearchFormWidget {
         * @return bool
         */
        protected function startsWithImage( $term ) {
-               global $wgContLang;
-
                $parts = explode( ':', $term );
                return count( $parts ) > 1
-                       ? $wgContLang->getNsIndex( $parts[0] ) === NS_FILE
+                       ? MediaWikiServices::getInstance()->getContentLanguage()->getNsIndex( $parts[0] ) ===
+                               NS_FILE
                        : false;
        }
 
@@ -236,8 +236,6 @@ class SearchFormWidget {
         * @return string HTML
         */
        protected function powerSearchBox( $term, array $opts ) {
-               global $wgContLang;
-
                $rows = [];
                $activeNamespaces = $this->specialSearch->getNamespaces();
                foreach ( $this->searchConfig->searchableNamespaces() as $namespace => $name ) {
@@ -246,7 +244,8 @@ class SearchFormWidget {
                                $rows[$subject] = "";
                        }
 
-                       $name = $wgContLang->getConverter()->convertNamespace( $namespace );
+                       $name = MediaWikiServices::getInstance()->getContentLanguage()->getConverter()->
+                               convertNamespace( $namespace );
                        if ( $name === '' ) {
                                $name = $this->specialSearch->msg( 'blanknamespace' )->text();
                        }
index 453a610..dfbacfc 100644 (file)
@@ -550,7 +550,7 @@ class Language {
         * Get a namespace value by key
         *
         * <code>
-        * $mw_ns = $wgContLang->getNsText( NS_MEDIAWIKI );
+        * $mw_ns = $lang->getNsText( NS_MEDIAWIKI );
         * echo $mw_ns; // prints 'MediaWiki'
         * </code>
         *
@@ -568,7 +568,7 @@ class Language {
         * producing output.
         *
         * <code>
-        * $mw_ns = $wgContLang->getFormattedNsText( NS_MEDIAWIKI_TALK );
+        * $mw_ns = $lang->getFormattedNsText( NS_MEDIAWIKI_TALK );
         * echo $mw_ns; // prints 'MediaWiki talk'
         * </code>
         *
index dcc2cf3..6ab6e8f 100644 (file)
@@ -250,7 +250,7 @@ class LanguageConverter {
         * @return mixed Variant if one found, null otherwise
         */
        protected function getUserVariant() {
-               global $wgUser, $wgContLang;
+               global $wgUser;
 
                // memoizing this function wreaks havoc on parserTest.php
                /*
@@ -266,7 +266,10 @@ class LanguageConverter {
                        return false;
                }
                if ( $wgUser->isLoggedIn() ) {
-                       if ( $this->mMainLanguageCode == $wgContLang->getCode() ) {
+                       if (
+                               $this->mMainLanguageCode ==
+                               MediaWikiServices::getInstance()->getContentLanguage()->getCode()
+                       ) {
                                $ret = $wgUser->getOption( 'variant' );
                        } else {
                                $ret = $wgUser->getOption( 'variant-' . $this->mMainLanguageCode );
index bd619b1..a5b0188 100644 (file)
@@ -299,6 +299,7 @@ class Names {
                'ml' => 'മലയാളം', # Malayalam
                'mn' => 'монгол', # Halh Mongolian (Cyrillic) (ISO 639-3: khk)
                'mni' => 'মেইতেই লোন্', # Manipuri/Meitei
+               'mnw' => 'ဘာသာ မန်', # Mon, T201583
                'mo' => 'молдовеняскэ', # Moldovan, deprecated
                'mr' => 'मराठी', # Marathi
                'mrj' => 'кырык мары', # Hill Mari
index a6273c5..65562a1 100644 (file)
        "customcssprotected": "أنت لا تمتلك السماح لتعديل صفحة الCSS هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.",
        "customjsonprotected": "ليست لديك صلاحية تحرير صفحة جسون هذه لأنها تحتوي على إعدادات شخصية لمستخدم آخر.",
        "customjsprotected": "أنت لا تمتلك السماح لتعديل صفحة الجافاسكريبت هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.",
+       "sitecssprotected": "ليست لديك صلاحية تعديل صفحة CSS هذه لأنها قد تؤثر على جميع الزوار",
+       "sitejsonprotected": "ليست لديك صلاحية تعديل صفحة جسون هذه لأنها قد تؤثر على جميع الزوار",
+       "sitejsprotected": "ليست لديك صلاحية تعديل صفحة جافا سكريبت هذه لأنها قد تؤثر على جميع الزوار",
        "mycustomcssprotected": "ليس لديك صلاحية تعديل هذه الصفحة للطرز المتراصة.",
        "mycustomjsonprotected": "ليست لديك صلاحية تحرير صفحة جسون هذه",
        "mycustomjsprotected": "ليس لديك صلاحية تعديل صفحة جافاسكربت هذه.",
        "ns-specialprotected": "الصفحات الخاصة لا يمكن تعديلها.",
        "titleprotected": "{{GENDER:$1|حمى|حمت}} [[User:$1|$1]] هذا العنوان من الإنشاء.\nالسبب المعطى هو <em>$2</em>.",
        "filereadonlyerror": "تعذر تعديل الملف \"$1\" لأن مستودع الملف \"$2\" في وضع القراءة فقط. \n\nإداري النظام الذي قام بغلقه قدم التفسير التالي: \"$3\".",
+       "invalidtitle": "عنوان غير صالح",
        "invalidtitle-knownnamespace": "عنوان غير صالح في النطاق «$2» مع نص «$3»",
        "invalidtitle-unknownnamespace": "عنوان غير صالح ذو نطاق غير معروف رقم $1 ونص «$2»",
        "exception-nologin": "غير مسجل الدخول",
        "grant-createaccount": "إنشاء حسابات",
        "grant-createeditmovepage": "إنشاء وتعديل ونقل الصفحات",
        "grant-delete": "حذف الصفحات والمراجعات ومدخلات السجلات",
-       "grant-editinterface": "تعديل نطاق ميدياويكي وCSS/جافا سكريت المستخدم",
+       "grant-editinterface": "تعديل نطاق ميدياويكي وجسون على مستوى الموقع/المستخدم",
        "grant-editmycssjs": "تعديل CSS/جافا سكريت/جسون الخاصة بحسابك",
        "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": "معلومات المسار مفقودة;\nيجب إعداد خادمك لتمرير المتغير REQUEST_URI و/أو PATH_INFO variables،\nإذا كان كذلك، فحاول تمكين $wgUsePathInfo،\nانظر https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "المسار المطلوب غير موجود في مجلد الرفع المضبوط.",
        "img-auth-badtitle": "تعذر تشكيل عنوان صالح من \"$1\".",
        "img-auth-nologinnWL": "لست والجا و\"$1\" ليست في القائمة البيضاء.",
        "http-timed-out": "انتهت مهلة طلب HTTP.",
        "http-curl-error": "فشل جلب المسار: $1",
        "http-bad-status": "ثمة مشكلة أثناء طلب HTTP: $1 $2",
+       "http-internal-error": "خطأ HTTP داخلي.",
        "upload-curl-error6": "لم يتمكن من الوصول للمسار",
        "upload-curl-error6-text": "لم يمكن الوصول إلى المسار الذي حددته.\nمن فضلك راجع صحة المسار مرة أخرى وأن الموقع يعمل.",
        "upload-curl-error28": "انتهاء مهلة الرفع",
        "cachedspecial-refresh-now": "استعرض آخر نسخة",
        "categories": "تصنيفات",
        "categories-submit": "أظهر",
-       "categoriespagetext": "{{PLURAL:$1|التصنيف التالي يحتوي|التصنيفات التالية تحتوي}} على صفحات أو وسائط.\n[[Special:UnusedCategories|التصنيفات غير المستخدمة]] غير معروضة هنا.\nانظر أيضاً [[Special:WantedCategories|التصنيفات المطلوبة]].",
+       "categoriespagetext": "{{PLURAL:$1|التصنيف التالي|التصنيفات التالية}} موجودة في الويكي، وقد تكون مستخدمة أو غير مستخدمة،\nانظر أيضا [[Special:WantedCategories|التصنيفات المطلوبة]].",
        "categoriesfrom": "اعرض التصنيفات ابتداء من:",
        "deletedcontributions": "مساهمات المستخدم المحذوفة",
        "deletedcontributions-title": "مساهمات المستخدم المحذوفة",
        "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": "العنوان المحدد غير صحيح.",
        "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 bb3739d..e42703e 100644 (file)
        "ns-specialprotected": "Немагчыма рэдагаваць спэцыяльныя старонкі.",
        "titleprotected": "Стварэньне старонкі з такой назвай было забароненае {{GENDER:$1|ўдзельнікам|ўдзельніцай}} [[User:$1|$1]].\nПрычына забароны: <em>$2</em>.",
        "filereadonlyerror": "Немагчыма зьмяніць файл «$1», бо файлавае сховішча «$2» знаходзіцца ў рэжыме толькі для чытаньня.\n\nСыстэмны адміністратар, які абмежаваў доступ, пазначыў прычыну: «$3».",
+       "invalidtitle": "Няслушная назва",
        "invalidtitle-knownnamespace": "Няслушны загаловак з прасторай назваў «$2» і тэкстам «$3»",
        "invalidtitle-unknownnamespace": "Няслушны загаловак зь невядомым нумарам прасторы назваў $1 і тэкстам «$2»",
        "exception-nologin": "Вы не ўвайшлі ў сыстэму",
        "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 505af10..3e02cea 100644 (file)
        "right-block": "Спиране на достъпа до редактиране",
        "right-blockemail": "Блокиране на потребители да изпращат писма по е-поща",
        "right-hideuser": "Блокиране и скриване на потребителско име",
-       "right-ipblock-exempt": "Пренебрегване на блокирания по IP blocks, автоматични блокирания и блокирани IP интервали",
+       "right-ipblock-exempt": "Пренебрегване на блокирания по IP, автоматични блокирания и блокирани IP интервали",
        "right-unblockself": "Собствено отблокиране",
        "right-protect": "Променяне на нивото на защита и редактиране на каскадно-защитените страници",
        "right-editprotected": "Редактиране на страници защитени като „{{int:protect-level-sysop}}“",
        "speciallogtitlelabel": "Цел (заглавие или {{ns:user}}:потребителско име за потребител):",
        "log": "Дневници",
        "logeventslist-submit": "Показване",
+       "logeventslist-more-filters": "Показване на още дневници:",
+       "logeventslist-patrol-log": "Дневник на патрула",
+       "logeventslist-tag-log": "Дневник на етикетите",
        "all-logs-page": "Всички публични дневници",
        "alllogstext": "Смесено показване на записи от всички налични дневници в {{SITENAME}}.\nМожете да ограничите прегледа, като изберете вид на дневника, потребителско име или определена страница.",
        "logempty": "Дневникът не съдържа записи, отговарящи на избрания критерий.",
index cad9287..2e7eb73 100644 (file)
        "logentry-patrol-patrol": "$1 ব্যবহারকারী $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে {{GENDER:$2|চিহ্নিত}} করেছেন",
        "logentry-patrol-patrol-auto": "$1 ব্যবহারকারী স্বয়ংক্রিয়ভাবে $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে {{GENDER:$2|চিহ্নিত}} করেছেন",
        "logentry-newusers-newusers": "$1 ব্যবহারকারী অ্যাকাউন্টটি {{GENDER:$2|তৈরি করা}} হয়েছে",
-       "logentry-newusers-create": "বà§\8dযবহারà¦\95ারà§\80 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f $1 {{GENDER:$2|তà§\88রà§\80 করা}} হয়েছে",
+       "logentry-newusers-create": "বà§\8dযবহারà¦\95ারà§\80 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f $1 {{GENDER:$2|তà§\88রি করা}} হয়েছে",
        "logentry-newusers-create2": "$1 ব্যবহারকারী $3 নামের অ্যাকাউন্টটি {{GENDER:$2|তৈরী}} করেছেন",
        "logentry-newusers-byemail": "$1, $3 ব্যবহারকরী অ্যাকাউন্টটি {{GENDER:$2|তৈরী করেছেন}} এবং পাসওয়ার্ড ইমেইলের মাধ্যমে পাঠানো হয়েছে",
        "logentry-newusers-autocreate": "$1 অ্যাকাউন্টটি স্বয়ংক্রিয়ভাবে {{GENDER:$2|তৈরি}} হয়েছে",
index 7089f17..1c99d15 100644 (file)
        "ns-specialprotected": "Stránky ve jmenném prostoru {{ns:special}} nelze editovat.",
        "titleprotected": "Stránku s tímto názvem nelze založit, protože název {{GENDER:$1|zamkl|zamkla|zamkl uživatel}} [[User:$1|$1]].\nUdaným důvodem bylo <em>$2</em>.",
        "filereadonlyerror": "Nelze změnit soubor „$1“, protože úložiště souborů „$2“ je pouze pro čtení.\n\nSprávce serveru, který úložiště zamkl, poskytl toto zdůvodnění: „$3“.",
+       "invalidtitle": "Neplatný název",
        "invalidtitle-knownnamespace": "Neplatný název se jmenným prostorem „$2“ a textem „$3“",
        "invalidtitle-unknownnamespace": "Neplatný název s neznámým číslem jmenného prostoru $1 a textem „$2“",
        "exception-nologin": "Nejste přihlášen(a)",
index 124c078..fcae89b 100644 (file)
        "namespaceprotected": "Du har ikke rettigheder til at redigere sider i $1-navnerummet.",
        "customcssprotected": "Du har ikke tilladelse til at redigere denne CSS-side, da den indeholder en anden brugers personlige indstillinger.",
        "customjsprotected": "Du har ikke tilladelse til at redigere denne JavaScript-side, da den indeholder en anden brugers personlige indstillinger.",
+       "sitecssprotected": "Du har ikke tilladelse til at redigere denne CSS-side fordi det kan påvirke alle besøgende",
+       "sitejsonprotected": "Du har ikke tilladelse til at redigere denne JSON-side fordi det kan påvirke alle besøgende",
+       "sitejsprotected": "Du har ikke tilladelse til at redigere denne JavaScript-side fordi det kan påvirke alle besøgende",
        "mycustomcssprotected": "Du har ikke rettigheder til at redigere denne CSS-side.",
        "mycustomjsonprotected": "Du har ikke rettigheder til at redigere denne JSON-side.",
        "mycustomjsprotected": "Du har ikke rettigheder til at redigere denne JavaScript-side.",
        "ns-specialprotected": "Sider i navnerummet {{ns:special}} kan ikke redigeres.",
        "titleprotected": "Dette sidenavn er blevet beskyttet mod oprettelse af [[User:$1|$1]]. Begrundelsen for beskyttelsen er <em>$2</em>.",
        "filereadonlyerror": "Ude af stand til at redigere filen \"$1\", fordi fildatabasen \"$2\" er skrivebeskyttet.\n\nSystemadministratoren, som skrivebeskyttede den, gav denne begrundelse: \"$3\".",
+       "invalidtitle": "Ugyldig titel",
        "invalidtitle-knownnamespace": "Ugyldig titel med navnerummet \"$2\" og teksten \"$3\"",
        "invalidtitle-unknownnamespace": "Ugyldig titel med ukendt navnerum nummer $1 og tekst \"$2\"",
        "exception-nologin": "Ikke logget på",
        "wrongpasswordempty": "Du glemte at indtaste adgangskode. Prøv igen.",
        "passwordtooshort": "Adgangskoden skal mindst være på $1 {{PLURAL:$1|tegn|tegn}}.",
        "passwordtoolong": "Adgangskoden må ikke være længere end {{PLURAL:$1|et tegn|$1 tegn}}.",
-       "passwordtoopopular": "Almindeligt brugte adgangskoder, kan ikke bruges. Vælg venligst en mere unik adgangskode.",
+       "passwordtoopopular": "Almindeligt brugte adgangskoder, kan ikke bruges. Vælg venligst en adgangskode der er sværere at gætte.",
        "password-name-match": "Adgangskoden må ikke være det samme som brugernavnet.",
        "password-login-forbidden": "Brugen af dette brugernavn og adgangskode er blevet forbudt.",
        "mailmypassword": "Nulstil adgangskode",
        "passwordremindertitle": "Ny midlertidig adgangskode til {{SITENAME}}",
-       "passwordremindertext": "Nogen (sandsynligvis dig, fra IP-adressen $1)\nhar bedt om at vi sender dig en ny adgangskode til at logge på {{SITENAME}} ($4).\nEn midlertidig adgangskode for bruger \"$2\" er blevet lavet, den er \"$3\".\nHvis dette var din mening, skal du logge på og vælge en ny adgangskode nu.\nDin midlertidige adgangskode vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.\n\nHvis en anden har bestilt den nye adgangskode, eller hvis du er kommet i tanke om din gamle adgangskode og ikke længere vil ændre den,\nkan du bare ignorere denne e-mail og fortsætte med at bruge din gamle adgangskode.",
+       "passwordremindertext": "Nogen (sandsynligvis dig, fra IP-adressen $1)\nhar bedt om at vi sender dig en ny adgangskode til at logge på {{SITENAME}} ($4).\nEn midlertidig adgangskode for bruger \"$2\" er blevet lavet, den er \"$3\".\nHvis dette var din mening, skal du logge på og vælge en ny adgangskode nu.\nDin midlertidige adgangskode vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.\n\nHvis en anden har bestilt den nye adgangskode, eller hvis du er kommet i tanke om din gamle adgangskode og ikke længere vil ændre den,\nkan du bare ignorere denne besked og fortsætte med at bruge din gamle adgangskode.",
        "noemail": "Der er ikke oplyst en e-mailadresse for bruger \"$1\".",
        "noemailcreate": "Du skal angive en gyldig e-mailadresse",
        "passwordsent": "En ny adgangskode er sendt til e-mailadressen, som er registreret for \"$1\".\nDu bør logge på og ændre din adgangskode straks efter du har modtaget e-mailen.",
        "botpasswords-existing": "Eksisterende bot adgangskoder",
        "botpasswords-createnew": "Opret en ny bot adgangskode",
        "botpasswords-editexisting": "Redigere en eksisterende bot adgangskode",
+       "botpasswords-label-needsreset": "(adgangskoden skal nulstilles)",
        "botpasswords-label-appid": "Botnavn:",
        "botpasswords-label-create": "Opret",
        "botpasswords-label-update": "Opdatér",
        "prefs-files": "Filer",
        "prefs-custom-css": "Personlig CSS",
        "prefs-custom-js": "Personlig JavaScript",
-       "prefs-common-config": "Fælles CSS/JS for alle udseender:",
+       "prefs-common-config": "Fælles CSS/JSON/JavaScript for alle udseender:",
        "prefs-reset-intro": "Du kan bruge denne side til at tilbagestille alle dine indstillinger til standardindstillingerne.\nDet kan ikke gøres om.",
        "prefs-emailconfirm-label": "Bekræftelse af e-mail:",
        "youremail": "Din e-mailadresse:",
        "prefs-dateformat": "Formatering af datoer",
        "prefs-timeoffset": "Tidsforskel",
        "prefs-advancedediting": "Generelle indstillinger",
+       "prefs-developertools": "Udviklerværktøjer",
        "prefs-editor": "Redigeringsprogrammet",
        "prefs-preview": "Forhåndsvisning",
        "prefs-advancedrc": "Avancerede indstillinger",
        "right-editinterface": "Ændre brugergrænsefladens tekster",
        "right-editusercss": "Ændre andre brugeres CSS filer",
        "right-edituserjs": "Ændre andre brugeres JS filer",
+       "right-editsitecss": "Rediger CSS for hele siden",
+       "right-editsitejson": "Rediger JSON for hele siden",
+       "right-editsitejs": "Rediger JavaScript for hele siden",
        "right-editmyusercss": "Redigere dine egne CSS-filer",
        "right-editmyuserjs": "Redigere dine egne JavaScript-filer",
        "right-viewmywatchlist": "Se din egen overvågningsliste",
        "grant-createaccount": "Oprette af konti",
        "grant-createeditmovepage": "Oprette, redigere og flytte sider",
        "grant-delete": "Slette sider, revisioner og logposter",
-       "grant-editinterface": "Redigere MediaWiki-navnerummet og bruger-CSS/JavaScript",
+       "grant-editinterface": "Redigere MediaWiki-navnerummet og bruger/side JSON",
        "grant-editmycssjs": "Redigere din bruger-CSS/JavaScript",
        "grant-editmyoptions": "Redigere dine brugerindstillinger",
        "grant-editmywatchlist": "Redigere din overvågningsliste",
        "rcfilters-filter-previousrevision-label": "Ikke den seneste revision",
        "rcfilters-filter-previousrevision-description": "Alle ændringer som ikke er »seneste revision«.",
        "rcfilters-filter-excluded": "Ekskluderet",
+       "rcfilters-tag-prefix-namespace-inverted": "<strong>:ikke</strong> $1",
+       "rcfilters-exclude-button-off": "Ekskluder valgte",
+       "rcfilters-exclude-button-on": "Ekskluderer valgte",
        "rcfilters-view-tags": "Mærkede redigeringer",
        "rcfilters-view-namespaces-tooltip": "Filtrer resultater efter navnerum",
+       "rcfilters-liveupdates-button": "Live-opdateringer",
+       "rcfilters-liveupdates-button-title-on": "Sluk for live opdateringer",
        "rcfilters-liveupdates-button-title-off": "Vis nye ændringer når de sker",
        "rcfilters-watchlist-markseen-button": "Marker alle ændringer som set",
        "rcfilters-watchlist-edit-watchlist-button": "Rediger din liste med overvågede sider",
        "rcfilters-watchlist-showupdated": "Ændringer til sider du ikke har besøgt siden ændringerne blev gjort vises med <strong>fed</strong>, med faste markører.",
        "rcfilters-preference-label": "Skjul den forbedrede verson af Seneste ændringer",
+       "rcfilters-filter-showlinkedto-label": "Vis ændringer på sider der linker til",
        "rcfilters-target-page-placeholder": "Indtast et sidenavn (eller en kategori)",
        "rcnotefrom": "Nedenfor er op til '''$1''' {{PLURAL:$5|ændring|ændringer}} siden '''$2''' vist.",
        "rclistfromreset": "Nulstil datovalg",
        "apisandbox-results-error": "Der opstod en fejl under indlæsning af API-forespørgelsessvaret: $1.",
        "apisandbox-request-format-url-label": "Adresseforepørgselsstreng",
        "apisandbox-request-url-label": "Forespurgt URL:",
+       "apisandbox-request-json-label": "Anmod om JSON:",
        "apisandbox-request-time": "Forespørgselstid: {{PLURAL:$1|$1 ms}}",
        "apisandbox-alert-page": "Felter på denne side er ugyldige.",
        "apisandbox-alert-field": "Værdien af dette felt er ugyldigt.",
        "speciallogtitlelabel": "Mål (titel eller {{ns:user}}:brugernavn for bruger):",
        "log": "Loglister",
        "logeventslist-submit": "Vis",
+       "logeventslist-more-filters": "Vis flere logs:",
        "all-logs-page": "Alle offentlige logger",
        "alllogstext": "Samlet visning af alle loggene på {{SITENAME}}.\nDu kan afgrænse visningen ved at vælge en logtype, brugernavn eller påvirket side. Der skelnes mellem små og store bogstaver for både bruger- og sidenavne.",
        "logempty": "Intet passende fundet.",
        "enotif_body_intro_moved": "{{SITENAME}} siden $1 er blevet flyttet den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle revision.",
        "enotif_body_intro_restored": "{{SITENAME}} siden $1 er blevet gendannet den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle version.",
        "enotif_body_intro_changed": "{{SITENAME}}-siden $1 er blevet ændret den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle version.",
-       "enotif_lastvisited": "Gå til $1 for at se alle ændringer siden dit sidste besøg.",
+       "enotif_lastvisited": "Gå til $1 for at se alle ændringer siden dit sidste besøg",
        "enotif_lastdiff": "For at se denne ændring, se $1",
        "enotif_anon_editor": "anonym bruger $1",
        "enotif_body": "Kære $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nBidragyderens opsummering: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt bidragyderen:\ne-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDu vil ikke modtage flere beskeder om yderligere aktivitet medmindre du besøger denne side. På din overvågningsliste kan du også nulstille alle markeringer for de sider, du overvåger.\n\n         Med venlig hilsen {{SITENAME}}s informationssystem\n\n--\nFor at ændre dine indstillinger for e-mail-meddelelser, besøg\n{{canonicalurl:{{#special:Preferences}}}}\n\nFor at ændre indstillingerne for din overvågningsliste, besøg\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFor at slette siden fra din overvågningsliste, besøg\n$UNWATCHURL\n\nTilbagemelding og yderligere hjælp:\n$HELPPAGE",
        "undeleteviewlink": "vis",
        "undeleteinvert": "Omvend valget af versioner",
        "undeletecomment": "Begrundelse:",
-       "cannotundelete": "Gendannelse mislykkedes:\n$1",
+       "cannotundelete": "Gendannelse mislykkedes for nogle eller alle:\n$1",
        "undeletedpage": "'''$1''' blev gendannet.\n\nI [[Special:Log/delete|slette-loggen]] findes en oversigt over de nyligt slettede og gendannede sider.",
        "undelete-header": "Se [[Special:Log/delete|slette-loggen]] for nyligt slettede og gendannede sider.",
        "undelete-search-title": "Søg i slettede sider",
        "pageinfo-category-subcats": "Antal underkategorier",
        "pageinfo-category-files": "Antal filer",
        "pageinfo-user-id": "Bruger-id",
+       "pageinfo-file-hash": "Hash værdi",
        "markaspatrolleddiff": "Markér som patruljeret",
        "markaspatrolledtext": "Markér denne side som patruljeret",
        "markaspatrolledtext-file": "Markér denne filversion som patruljeret",
        "version-specialpages": "Specialsider",
        "version-parserhooks": "Parserfunktioner",
        "version-variables": "Variabler",
+       "version-editors": "Skribenter",
        "version-antispam": "Spamforebyggelse",
        "version-other": "Andet",
        "version-mediahandlers": "Specialhåndtering af mediefiler",
        "version-ext-colheader-credits": "Forfattere",
        "version-license-title": "Licens for $1",
        "version-license-not-found": "Ingen detaljerede licensoplysninger blev fundet for denne udvidelse.",
+       "version-credits-title": "Anerkendelser for $1",
        "version-credits-not-found": "Ingen detaljeret information om bidragyderen blev fundet for denne udvidelse.",
        "version-poweredby-credits": "Denne wiki er drevet af '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
        "version-poweredby-others": "andre",
        "tag-mw-removed-redirect": "Fjernede omdirigering",
        "tag-mw-changed-redirect-target": "Omdigeringsmål ændret",
        "tag-mw-blank": "Sidetømning",
+       "tag-mw-blank-description": "Redigeringer som tømmer en side",
        "tag-mw-replace": "Erstattet",
+       "tag-mw-replace-description": "Redigeringer som fjerner mere end 90% af indholdet på en side",
        "tag-mw-rollback": "Tilbagerulning",
        "tag-mw-undo": "Omgjort",
        "tags-title": "Tags",
        "compare-revision-not-exists": "Den version, du har angivet, findes ikke.",
        "diff-form": "Forskelle",
        "diff-form-submit": "Vis forskelle",
+       "permanentlink": "Permanent link",
+       "permanentlink-revid": "Versions-ID",
+       "permanentlink-submit": "Gå til version",
        "dberr-problems": "Undskyld! Siden har tekniske problemer.",
        "dberr-again": "Prøv at vente et par minutter og opdater så siden igen.",
        "dberr-info": "(Kan ikke tilgå databasen: $1)",
        "htmlform-date-placeholder": "ÅÅÅÅ-MM-DD",
        "htmlform-time-placeholder": "TT:MM:SS",
        "htmlform-datetime-placeholder": "ÅÅÅÅ-MM-DD TT:MM:SS",
+       "htmlform-title-badnamespace": "[[:$1]] er ikke i \"{{ns:$2}}\" navnerummet.",
        "htmlform-title-not-exists": "$1 findes ikke.",
+       "htmlform-user-not-exists": "<strong>$1</strong> findes ikke.",
        "logentry-delete-delete": "$1 {{GENDER:$2|slettede}} siden $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|slettede}} omdirigering $3 ved overskrivning",
        "logentry-delete-restore": "$1 {{GENDER:$2|gendannede}} siden $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|gendannede}} siden $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 version|$1 versioner}}",
+       "restore-count-files": "{{PLURAL:$1|1 fil|$1 filer}}",
        "logentry-delete-event": "$1 {{GENDER:$2|ændrede}} synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ændrede}} synligheden af {{PLURAL:$5|en version|$5 versioner}} af siden $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|ændrede}} synligheden af loghændelser for siden $3",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|beskyttede}} $3 $4 [kaskaderende]",
        "logentry-protect-modify": "$1 {{GENDER:$2|ændrede}} beskyttelsesniveau for $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ændrede}} beskyttelsesniveau for $3 $4 [kaskaderende]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|ændrede}} gruppemedlemskabet for $3 fra $4 til $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|ændrede}} gruppemedlemskabet for {{GENDER:$6|$3}} fra $4 til $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ændrede}} gruppemedlemskabet for $3",
        "logentry-rights-autopromote": "$1 blev automatisk {{GENDER:$2|forfremmet}} fra $4 til $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|lagde}} $3 op",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|lagde}} en ny udgave af $3 op",
        "logentry-upload-revert": "$1 {{GENDER:$2|lagde}} $3 op",
+       "logentry-managetags-create": "$1 {{GENDER:$2|oprettede}} tagget \"$4\"",
        "rightsnone": "(-)",
        "rightslogentry-temporary-group": "$1 (midlertidig, indtil $2)",
        "feedback-adding": "Tilføjer kommentar til side...",
        "expandtemplates": "Udfold skabeloner",
        "expand_templates_intro": "Denne specialside tager en tekst og udfolder alle benyttede skabeloner rekursivt.\nDen udfolder også understøttede parserfunktioner så som\n<code><nowiki>{{</nowiki>#language:…}}</code> og variabler så som \n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>\nFaktisk udfolder den stort set alt i dobbelte tuborgklammer.",
        "expand_templates_title": "Sammenhængstitel, for {{FULLPAGENAME}} osv.:",
-       "expand_templates_input": "Inputtekst:",
+       "expand_templates_input": "Input wikitekst:",
        "expand_templates_output": "Resultat",
        "expand_templates_xml_output": "XML-kode",
        "expand_templates_html_output": "Rå HTML-output",
        "pagelang-nonexistent-page": "Siden $1 findes ikke.",
        "pagelang-unchanged-language": "Siden $1 er allerede sat til sproget $2.",
        "right-pagelang": "Ændre sidesproget",
+       "action-pagelang": "ændre sidesproget",
        "mediastatistics": "Mediestatistik",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
        "mediastatistics-table-mimetype": "MIME-type",
        "log-action-filter-protect-move_prot": "Flyttede beskyttelse",
        "log-action-filter-upload-upload": "Ny overførsel",
        "authmanager-create-from-login": "For at oprette din konto, så udfyld venligst felterne.",
+       "authmanager-authplugin-setpass-failed-title": "Ændring af adgangskode mislykkedes",
        "authmanager-authplugin-setpass-bad-domain": "Ugyldig domæne.",
        "authmanager-userdoesnotexist": "Brugerkontoen \"$1\" er ikke registreret.",
        "authmanager-email-label": "E-post",
        "authmanager-realname-help": "Brugerens egentlige navn",
        "authmanager-provider-temporarypassword": "Midlertidig adgangskode",
        "authprovider-resetpass-skip-label": "Spring over",
+       "authprovider-resetpass-skip-help": "Spring over nulstilling af adgangskoden.",
+       "authform-notoken": "Mangler nøgle",
+       "authform-wrongtoken": "Forkert nøgle",
        "specialpage-securitylevel-not-allowed-title": "Ikke tilladt",
        "cannotauth-not-allowed-title": "Adgang nægtet",
        "cannotauth-not-allowed": "Du har ikke tilladelse til at bruge denne side",
        "credentialsform-account": "Kontonavn:",
        "edit-error-short": "Fejl: $1",
        "edit-error-long": "Fejl:\n\n$1",
+       "revid": "version $1",
+       "pageid": "side id: $1",
        "gotointerwiki": "Forlader {{SITENAME}}",
+       "gotointerwiki-invalid": "Den angivne titel er ikke gyldig.",
+       "pagedata-title": "Sidedata",
        "pagedata-bad-title": "Ugyldig titel: $1",
        "passwordpolicies": "Password politikker",
        "passwordpolicies-group": "Gruppe",
index 8d4d08d..f1d6f94 100644 (file)
        "ns-specialprotected": "Spezialseiten können nicht bearbeitet werden.",
        "titleprotected": "Eine Seite mit diesem Namen kann nicht angelegt werden.\nDie Sperre wurde durch [[User:$1|$1]] mit der Begründung <em>$2</em> eingerichtet.",
        "filereadonlyerror": "Die Datei „$1“ kann nicht verändert werden, da auf das Dateirepositorium „$2“ nur Lesezugriff möglich ist.\n\nDer Systemadministrator, der den Schreibzugriff sperrte, gab folgenden Grund an: „$3“.",
+       "invalidtitle": "Ungültiger Titel",
        "invalidtitle-knownnamespace": "Ungültiger Titel mit Namensraum „$2“ und Text „$3“",
        "invalidtitle-unknownnamespace": "Ungültiger Titel mit unbekannter Namensraumnummer $1 und Text „$2“",
        "exception-nologin": "Nicht angemeldet",
index 297f901..8105ed6 100644 (file)
        "ns-specialprotected": "Les pages spéciales ne peuvent pas être modifiés.",
        "titleprotected": "Ce titre a été protégé contre toute création par [[User:$1|$1]].\nLe motif fourni est <em>$2</em>.",
        "filereadonlyerror": "Impossible de modifier le fichier « $1 » parce que le répertoire de fichiers « $2 » est en lecture seule.\n\nL’administrateur système qui l’a verrouillé a fourni ce motif : « $3 ».",
+       "invalidtitle": "Titre non valide",
        "invalidtitle-knownnamespace": "Titre non valide avec l’espace de noms « $2 » et l’intitulé « $3 »",
        "invalidtitle-unknownnamespace": "Titre non valide avec le numéro d’espace de noms $1 inconnu et l’intitulé « $2 »",
        "exception-nologin": "Non connecté",
index dffd28b..082e540 100644 (file)
@@ -50,7 +50,7 @@
        "tog-watchlisthideminor": "Letj feranrangen bi a sidjen, diar ik uun't uug behual wal, fersteeg",
        "tog-watchlisthideliu": "Feranrangen faan uunmeldet brükern bi sidjen, diar ik uun't uug behual wal, fersteeg",
        "tog-watchlistreloadautomatically": "List mä sidjen, diar dü uun't uug behual wel, nei loose, wan en filter anert wurden as (brükt JavaScript)",
-       "tog-watchlistunwatchlinks": "Direkt ferwisangen tu Uunlukin/Ei uunlukin bi iindracher uun det list faan sidjen, diar dü uun't uug behual wel (brükt JavaScript)",
+       "tog-watchlistunwatchlinks": "Direkt ferwisangen tu {{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}} bi iindracher uun det list faan sidjen, diar dü uun't uug behual wel (brükt JavaScript)",
        "tog-watchlisthideanons": "Feranrangen faan anonüüm brükern (IPs) bi sidjen, diar ik uun't uug behual wal, fersteeg",
        "tog-watchlisthidepatrolled": "Kontroliaret feranrangen bi a sidjen, diar ik uun't uug behual wal, fersteeg",
        "tog-watchlisthidecategorization": "Kategorisiarang faan sidjen fersteeg",
        "nosuchusershort": "Diar as nään brüker mä di nööm \"$1\".\nHeest dü ham uk rocht skrewen?",
        "nouserspecified": "Dü skel en brükernööm uundu.",
        "login-userblocked": "Didiar brüker as speret wurden. Hi mut ham ei uunmelde.",
-       "wrongpassword": "Det paaswurd as ferkiard.\nWees so gud an ferschük det noch ans.",
+       "wrongpassword": "Di brükernööm of det paaswurd as ferkiard.\nWees so gud an ferschük det noch ans.",
        "wrongpasswordempty": "Dü heest nian paaswurd iinden.\nFerschük det man noch ans.",
        "passwordtooshort": "Paaswurden skel tumanst {{PLURAL:$1|1 tiaken|$1 tiakens}} lung wees.",
        "passwordtoolong": "Paaswurden kön ei linger üs {{PLURAL:$1|1 tiaken|$1 tiakens}} wees.",
        "password-login-forbidden": "Didiar brükernööm mä detdiar paaswurd as ei tuläät.",
        "mailmypassword": "Paaswurd turagsaat",
        "passwordremindertitle": "Nei tidjwiis paaswurd för {{SITENAME}}",
-       "passwordremindertext": "En brüker (woorskiinelk dü, faan IP adres $1) hää am en nei paaswurd för {{SITENAME}} ($4) fraaget.\nEn nei paaswurd för di brüker \"$2\" as maaget wurden an het nü \"$3\".\n\nWan dü det würelk so haa wel, do melde di nü uun an feranere det paaswurd. Det nei paaswurd täält för {{PLURAL:$5|ään dai|$5 daar}}.\n\nWan dü ei salew am en nei paaswurd fraaget heest, do säärst dü di am niks widjer komre. Do könst dü din ual paaswurd widjer brük.",
+       "passwordremindertext": "En brüker (faan IP adres $1) hää am en nei paaswurd för {{SITENAME}} ($4) fraaget.\nEn nei paaswurd för di brüker \"$2\" as maaget wurden an het nü \"$3\".\n\nWan dü det würelk so haa wel, do melde di nü uun an feranere det paaswurd. Det nei paaswurd täält för {{PLURAL:$5|ään dai|$5 daar}}.\n\nWan dü ei salew am en nei paaswurd fraaget heest, do säärst dü di am niks widjer komre. Do könst dü din ual paaswurd widjer brük.",
        "noemail": "Diar as nian e-mail adres bekäänd för di brüker \"$1\".",
        "noemailcreate": "Dü skel en rocht e-mail adres uundu.",
        "passwordsent": "En nei tidjwiis paaswurd as tu det e-mail-adres faan di brüker \"$1\" schüürd wurden.\nMelde di diarmä uun, wan dü det füngen heest. Det ual paaswurd blaft iarst ans bestunen.",
        "resetpass-temp-password": "Tidjwiis paaswurd:",
        "resetpass-abort-generic": "Det paaswurd-anerang as ferhanert wurden.",
        "resetpass-expired": "Din paaswurd as uflepen. Wees so gud an lei en nei paaswurd fääst.",
-       "resetpass-expired-soft": "Din paaswurd as uflepen an skal turagsaat wurd. Wees so gud an lei en nei paaswurd fääst of trak üüb \"{{int:authprovider-resetpass-skip-label}}\", am det leeder turag tu saaten.",
-       "resetpass-validity-soft": "Din paaswurd gongt ei: $1\n\nWees so gud an lei en nei paaswurd fääst, of trak üüb \"{{int:authprovider-resetpass-skip-label}}\" am det leeder turag tu saaten.",
+       "resetpass-expired-soft": "Din paaswurd as uflepen an skal feranert wurd. Wees so gud an lei en nei paaswurd fääst of trak üüb \"{{int:authprovider-resetpass-skip-label}}\", am det leeder tu feranrin.",
+       "resetpass-validity-soft": "Din paaswurd gongt ei: $1\n\nWees so gud an lei en nei paaswurd fääst, of trak üüb \"{{int:authprovider-resetpass-skip-label}}\" am det leeder tu feranrin.",
        "passwordreset": "Paaswurd turagsaat",
        "passwordreset-text-one": "Fal detheer formulaar ütj, am din paaswurd turag tu saaten.",
        "passwordreset-text-many": "{{PLURAL:$1|Fal ian faan jodiat fialen ütj, am en tidjwiis paaswurd tuschüürd tu fun.}}",
        "anonpreviewwarning": "\"Dü beest ei uunmeldet. Bi't seekrin woort din IP-adres uun a ferluup faan werjuunen aptiakent.\"",
        "missingsummary": "'''Paase üüb:''' Dü heest det ei tuupfaadet.\nWan dü det sidj seekerst, woort det saner en kurtfaadet beskriiwang auernimen.",
        "selfredirect": "<strong>Paase üüb:</strong> Dü feerst detheer sidj tu detsalew sidj widjer.\nDü heest was det ferkiard mual uunden, of dü bewerkest det ferkiard sidj.\nWan dü noch ans üüb „$1“ trakst, woort det widjerfeerang likes iinracht.",
-       "missingcommenttext": "Faade det oner tuup.",
+       "missingcommenttext": "Skriiw en komentaar.",
        "missingcommentheader": "<strong>Paase üüb:</strong> Dü heest nian teemo uunden. Wan dü noch ans üüb „$1“ trakst, woort din feranrang saner auerskraft seekert.",
        "summary-preview": "Föörskau faan det tuupfaadang:",
        "subject-preview": "Föörskau faan det auerskraft:",
        "previewerrortext": "Diar as wat skiaf gingen, üs en föörskau faan din feranrangen wiset wurd skul.",
        "blockedtitle": "Brüker as speret",
-       "blockedtext": "'''Dan brükernööm of din IP-adres as speret wurden.'''\n\nDet as maaget wurden faan $1.\nDi grünj as ''$2''.\n\n* Began: $8\n* Aanj: $6\n* Bedraapt: $7\n\nDü könst $1 kontaktiare of uk en [[{{MediaWiki:Grouppage-sysop}}|administraator]] am det tu diskutiarin.\n\nDü könst ei det e-mail-funktjuun 'E-mail tu didiar brüker' brük, so loong dü nian e-mail-adres uun din [[Special:Preferences|brükerkonto-iinstelangen]] uunden heest of wan det e-mail-funktjuun för di speret wurden as.\n\nUugenblakelk as din IP-addres $3, an det sper-ID as #$5.\nFör arke uunfraag wurd aal jo informatjuunen boowen brükt.",
-       "autoblockedtext": "'''Din IP-adres as speret wurden, auer det faan en öödern spereten brüker brükt wurden as.'''\n\nDi grünj as:\n: ''$2''.\n\n* Began: $8\n* Aanj: $6\n* Bedraapt: $7\n\nDü könst $1 kontaktiare of uk en [[{{MediaWiki:Grouppage-sysop}}|administraator]] am det tu diskutiarin.\n\nDü könst ei det e-mail-funktjuun 'E-mail tu didiar brüker' brük, so loong dü nian e-mail-adres uun din [[Special:Preferences|brükerkonto-iinstelangen]] uunden heest of wan det e-mail-funktjuun för di speret wurden as.\n\nUugenblakelk as din IP-addres $3, an det sper-ID as #$5.\nFör arke uunfraag wurd aal jo informatjuunen boowen brükt.",
+       "blockedtext": "<strong>Dan brükernööm of din IP-adres as speret wurden.</strong>\n\nDet as maaget wurden faan $1.\nDi grünj as <em>$2</em>.\n\n* Began: $8\n* Aanj: $6\n* Bedraapt: $7\n\nDü könst $1 kontaktiare of uk en [[{{MediaWiki:Grouppage-sysop}}|administraator]] am det tu diskutiarin.\n\nDü könst ei det e-mail-funktjuun '{{int:emailuser}}' brük, so loong dü nian e-mail-adres uun din [[Special:Preferences|brükerkonto-iinstelangen]] uunden heest of wan det e-mail-funktjuun för di speret wurden as.\n\nUugenblakelk as din IP-addres $3, an det sper-ID as #$5.\nFör arke uunfraag wurd aal jo informatjuunen boowen brükt.",
+       "autoblockedtext": "'''Din IP-adres as speret wurden, auer det faan en öödern spereten brüker brükt wurden as.'''\n\nDi grünj as:\n: <em>$2</em>.\n\n* Began: $8\n* Aanj: $6\n* Bedraapt: $7\n\nDü könst $1 kontaktiare of uk en [[{{MediaWiki:Grouppage-sysop}}|administraator]] am det tu diskutiarin.\n\nDü könst ei det e-mail-funktjuun '{{int:emailuser}}' brük, so loong dü nian e-mail-adres uun din [[Special:Preferences|brükerkonto-iinstelangen]] uunden heest of wan det e-mail-funktjuun för di speret wurden as.\n\nUugenblakelk as din IP-addres $3, an det sper-ID as #$5.\nFör arke uunfraag wurd aal jo informatjuunen boowen brükt.",
        "blockednoreason": "nään grünj uunden",
        "whitelistedittext": "Dü skel di $1, am sidjen tu bewerkin.",
        "confirmedittext": "Dü skel iarst din e-mail-adres gudkään, iar dü began könst tu werkin. Maage det üüb det sidj mä din persöönelk [[Special:Preferences|iinstelangen]].",
        "userjspreview": "'''Seenk diaram, dat det bluas en föörskau faan din JavaScript as.'''\n'''Det as noch ei seekert wurden!'''",
        "sitecsspreview": "<strong>Paase üüb! Det as bluas en föörskau faan't CSS. Det as noch ei seekert wurden!</strong>",
        "sitejspreview": "<strong>Paase üüb! Det as bluas en föörskau faan di JavaScript code. Det as noch ei seekert wurden!</strong>",
-       "userinvalidconfigtitle": "''Paase üüb:''' Skak \"$1\" jaft at ei.\nSeenk diaram, dat faan en brüker iinracht .css- an .js-sidjen mä en letjen buksteew began skel. Bispal:\n''{{ns:user}}:Münsterkjarl/vector.css'' uunsteed faan ''{{ns:user}}:Münsterkjarl/Vector.css''.",
+       "userinvalidconfigtitle": "<strong>Paase üüb:</strong> Skak \"$1\" jaft at ei.\nSeenk diaram, dat faan en brüker iinracht .css-, .json an .js-sidjen mä en letjen buksteew began skel. Bispal:\n''{{ns:user}}:Münsterkjarl/vector.css'' uunsteed faan ''{{ns:user}}:Münsterkjarl/Vector.css''.",
        "updated": "(Feranert)",
        "note": "'''Paase üüb:'''",
        "previewnote": "'''Heer könst dü sä, hü det sidj wurd skal.'''\nDet sidj as oober noch ei seekert!",
        "longpageerror": "'''Error: Dan tekst as {{PLURAL:$1|ian kilobyte|$1 kilobytes}} lung, hi mut oober ei linger wees üs {{PLURAL:$2|ian kilobyte|$2 kilobytes}}.'''Hi koon ei ufspiikerd wurd.",
        "readonlywarning": "<strong>Paase üüb: Dü könst uun uugenblak ei üüb det dootenbeenk tugrip. Din dooten kön ei seekert wurd.</strong> Wees so gud an seekre dan tekst iarst ans üüb dan reegner, an ferschük leederhen, ham tu auerdreegen.\n\nGrünj för det sper: $1",
        "protectedpagewarning": "'''Paase üüb: Detdiar sidj as speret wurden. Bluas administratooren kön det bewerke.'''\nUun't logbuk stäänt muar diartu:",
-       "semiprotectedpagewarning": "'''Paase üüb: Detdiar sidj as dialwiis tu't bewerkin speret wurden. Bluas gudkäänd brükern kön det bewerke.'''\nUun't logbuk stäänt muar diartu:",
+       "semiprotectedpagewarning": "<strong>Paase üüb:</strong> Detdiar sidj as dialwiis tu't bewerkin speret wurden. Bluas gudkäänd brükern kön det bewerke.\nUun't logbuk stäänt muar diartu:",
        "cascadeprotectedwarning": "<strong>Paase üüb:</strong> Detdiar sidj koon bluas faan brükern mä [[Special:ListGroupRights|aparte rochten]] bewerket wurd. Hat as uun {{PLURAL:$1|detdiar ööder sidj|jodiar ööder sidjen}} iinbünjen, diar troch en kaskaadensper seekert {{PLURAL:$1|as|san}}:",
        "titleprotectedwarning": "'''Paase üüb: \"Detdiar sidj mä didiar nööm koon ei faan arken bewerket wurd. Bluas enkelt brükern mä [[Special:ListGroupRights|was brükerrochten]] kön detdiar sidj nei maage of bewerke.'''\nUun't logbuk stäänt muar diartu:",
        "templatesused": "{{PLURAL:$1|Detdiar föörlaag woort|Jodiar föörlaagen wurd}} üüb detdiar sidj brükt:",
        "recentchangesdays": "Soföl daar skel a „leetst feranrangen“ uunwise:",
        "recentchangesdays-max": "Ei muar üs {{PLURAL:$1|ään dai|$1 daar}}",
        "recentchangescount": "Soföl feranrangen skel uunwiset wurd:",
-       "prefs-help-recentchangescount": "Det san a leetst feranrangen, werjuunen an logbuken.",
-       "prefs-help-watchlist-token2": "Detdiar as di hiamelk kai för't webfeed mä sidjen, diar dü uun't uug behual wel.\nMä didiar kai koon arken jodiar sidjen beluke, diaram skulst dü ham ei widjerdu.\n[[Special:ResetTokens|Trak diar]], wan dü ham turagsaat wel.",
+       "prefs-help-recentchangescount": "Maximaal uuntaal: 1000",
+       "prefs-help-watchlist-token2": "Detdiar as di hiamelk kai för't webfeed mä sidjen, diar dü uun't uug behual wel.\nMä didiar kai koon arken jodiar sidjen beluke, diaram skulst dü ham ei widjerdu.\nWan nuadag, [[Special:ResetTokens|trak diar]], wan dü ham turagsaat wel.",
        "savedprefs": "Din iinstelangen san seekert wurden.",
        "savedrights": "A brükersköölen faan {{GENDER:$1|$1}} san seekert wurden.",
        "timezonelegend": "Tidjsoon:",
        "prefs-files": "Datein",
        "prefs-custom-css": "Salew maaget CSS",
        "prefs-custom-js": "Salew maaget JavaScript",
-       "prefs-common-config": "CSS / JavaScript för arke skak:",
+       "prefs-common-config": "CSS/Jason/JavaScript för arke skak:",
        "prefs-reset-intro": "Üüb detdiar sidj könst dü weder a normool iinstelangen iinracht.\nDo san jo ual iinstelangen wech.",
        "prefs-emailconfirm-label": "E-Mail gudkäänd:",
        "youremail": "E-mail:",
        "group-autoconfirmed": "Registriaret brükern",
        "group-bot": "Bots",
        "group-sysop": "Administratooren",
+       "group-interface-admin": "Skakadministratooren",
        "group-bureaucrat": "Bürokraaten",
        "group-suppress": "Fersteeger",
        "group-all": "(Aal a)",
        "grouppage-autoconfirmed": "{{ns:project}}:Registriaret brükern",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Administratooren",
+       "grouppage-interface-admin": "{{ns:project}}:Skakadministratooren",
        "grouppage-bureaucrat": "{{ns:project}}:Bürokraaten",
        "grouppage-suppress": "{{ns:project}}:Fersteeg",
        "right-read": "Sidjen lees",
        "recentchangeslinked-feed": "Feranrangen bi ferlinket sidjen",
        "recentchangeslinked-toolbox": "Feranrangen bi ferlinket sidjen",
        "recentchangeslinked-title": "Feranrangen bi sidjen, huar faan \"$1\" üüb ferwiset woort",
-       "recentchangeslinked-summary": "Skriiw en sidjennööm hen, am feranrangen üüb sidjen tu sen, diar üüb det sidj henwise of faan det sidj wechwise.\nAm iindracher uun en kategorii tu sen, skriiw 'Kategorie:Nööm faan't kategorii' hen.\nFeranrangen bi sidjen, diar dü [[Special:Watchlist|uun't uug behual]] wel, san <strong>fäät</strong> skrewen.",
+       "recentchangeslinked-summary": "Skriiw en sidjennööm hen, am feranrangen üüb sidjen tu sen, diar üüb det sidj henwise of faan det sidj wechwise.\nAm iindracher uun en kategorii tu sen, skriiw '{{ns:category}}:Nööm faan't kategorii' hen.\nFeranrangen bi sidjen, diar dü [[Special:Watchlist|uun't uug behual]] wel, san <strong>fäät</strong> skrewen.",
        "recentchangeslinked-page": "Sidjennööm:",
        "recentchangeslinked-to": "Wise feranrangen üüb sidjen, diar heerhen ferwise.",
        "recentchanges-page-added-to-category": "[[:$1]] tu kategorii saat",
        "lockmanager-fail-closelock": "Det sperdatei för „$1“ küd ei slööden wurd.",
        "lockmanager-fail-deletelock": "Det sperdatei för „$1“ küd ei stregen wurd.",
        "lockmanager-fail-acquirelock": "Det sper för „$1“ küd ei ufrepen  wurd.",
-       "lockmanager-fail-openlock": "Det sperdatei för „$1“ küd ei eeben maaget wurd.",
+       "lockmanager-fail-openlock": "Det sperdatei för „$1“ küd ei eeben maaget wurd. Stel seeker, dat din fertiaknis för't huuchloosin rocht iinracht as, an dat dan webserver diar üüb tugrip mut. Luke diar: https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory wan dü muar wed wel.",
        "lockmanager-fail-releaselock": "Det sper för „$1“ küd ei apliaset wurd.",
        "lockmanager-fail-db-bucket": "Mä $1 küd ei nooch ferbinjangen tu sperdootenbeenken iinracht wurd.",
        "lockmanager-fail-db-release": "A speren uun't dootenbeenk $1 küd ei apliaset wurd.",
        "uploadstash-refresh": "List mä datein aktualisiare.",
        "invalid-chunk-offset": "Di began as diar ei tuläät.",
        "img-auth-accessdenied": "Tugrip ei mögelk",
-       "img-auth-nopathinfo": "Diar as nään PATH_INFO.\nDi server koon detdiar informatjuun ei widjerdu.\nFerlicht as det uun CGI iinbünjen an komt diaram uk ei mä „img_auth“ turocht.\nÜüb det sidj https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization (ingelsk) stäänt diar muar auer.",
+       "img-auth-nopathinfo": "Diar as nian informatjuun auer di wai.\nDan server skal so iinracht wees, dat a wariaabeln REQUEST_URI an/of PATH_INFO auerden wurd.\nWan det tudraapt, aktiwiare $wgUsePathInfo.\nÜüb det sidj https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization (ingelsk) stäänt diar muar auer.",
        "img-auth-notindir": "Detdiar fertiaknis as ei föörsen tu huuchschüüren.",
        "img-auth-badtitle": "Mä „$1“ küd nään tiitel maaget wurd.",
        "img-auth-nologinnWL": "Dü beest ei uunmeldet, an „$1“ stäänt ei uun't whitelist.",
        "doubleredirects": "Dobelt widjerfeerangen",
        "doubleredirectstext": "Detheer list feert widjerfeerangen ap, diar üüb widjerfeerangen widjer feer.\nUun arke rä stun ferwisangen tu't iarst an ööder widjerfeerang an uk tu det sidj, huar det ööder widjerfeerang üüb ferwiset. <del>Trochstregen</del> iindracher san al bewerket wurden.",
        "double-redirect-fixed-move": "[[$1]] as fersköwen wurden. Hat feert nü widjer tu [[$2]].",
-       "double-redirect-fixed-maintenance": "Dobelt widjerfeerang faan [[$1]] tu [[$2]] as apredet wurden.",
+       "double-redirect-fixed-maintenance": "Dobelt widjerfeerang faan [[$1]] tu [[$2]] as apredet wurden",
        "double-redirect-fixer": "Bot för widjerfeerangen",
        "brokenredirects": "Uunstaken widjerfeerangen",
        "brokenredirectstext": "Jodiar widjerfeerangen ferwise üüb en sidj, diar't goorei jaft:",
        "cachedspecial-viewing-cached-ts": "Dü lukest en werjuun uun a cache uun. Det as ferlicht ei üüb a leetst stant.",
        "cachedspecial-refresh-now": "Neist werjuun uunluke.",
        "categories": "Kategoriin",
-       "categoriespagetext": "{{PLURAL:$1|Detdiar kategorii häält|Jodiar kategoriin hual}} sidjen of datein.\n[[Special:UnusedCategories|Leesag kategoriin]] wurd heer ei uunwiset.\nLuke uk bi det list faan [[Special:WantedCategories|nuadag kategoriin]].",
+       "categoriespagetext": "{{PLURAL:$1|Detdiar kategorii häält|Jodiar kategoriin hual}} sidjen of datein an koon brükt wurd of uk ei.\nLuke uk bi det list faan [[Special:WantedCategories|nuadag kategoriin]].",
        "categoriesfrom": "Wise kategoriin mä began üüb:",
        "deletedcontributions": "Stregen bidracher",
        "deletedcontributions-title": "Stregen bidracher",
        "revertpage-nouser": "Feranrangen faan en ferbürgenen brüker turagsaat an det leetst werjuun faan {{GENDER:$1|[[User:$1|$1]]}} weder iinsteld.",
        "rollback-success": "Feranrangen faan {{GENDER:$3|$1}} san turagsaat an det leetst werjuun faan {{GENDER:$4|$2}} as weder iinsteld wurden.",
        "sessionfailure-title": "session feeler",
-       "sessionfailure": "Diar as wat skiaf gingen bi't auerdreegen faan din brükerdooten.\nAm dat diar ei noch muar skiaf gongt, as det aktjuun ufbreegen wurden.\nGung turag, an began faan föören.",
+       "sessionfailure": "Diar as wat skiaf gingen bi't auerdreegen faan din brükerdooten.\nAm dat diar ei noch muar skiaf gongt, as det aktjuun ufbreegen wurden.\nWees so gud, an schüür det formulaar noch ans uf.",
        "changecontentmodel": "Det muude faan det sidj feranre",
        "changecontentmodel-legend": "Det muude feranre",
        "changecontentmodel-title-label": "Sidjennööm",
        "fix-double-redirects": "Efter't fersküüwen aal a widjerfeerangen hen tu det ual sidj ferbeedre",
        "move-leave-redirect": "Widjerfeerang iinracht",
        "protectedpagemovewarning": "'''Paase üüb: Detdiar sidj as speret wurden. Bluas administratooren kön det fersküüw.'''\nUun't logbuk stäänt muar diartu:",
-       "semiprotectedpagemovewarning": "'''Paase üüb:''' Detdiar sidj as dialwiis tu't bewerkin speret wurden. Bluas gudkäänd brükern kön det fersküüw.\nUun't logbuk stäänt muar diartu:",
+       "semiprotectedpagemovewarning": "<strong>Paase üüb:</strong> Detdiar sidj as dialwiis tu't bewerkin speret wurden. Bluas gudkäänd brükern kön det fersküüw.\nUun't logbuk stäänt muar diartu:",
        "move-over-sharedrepo": "[[:$1]] stäänt uun en gemiansoom brükt archiif. Det fersküüwen üüb didiar nööm auerskraft det gemiansoom brükt datei.",
        "file-exists-sharedrepo": "Didiar dateinööm woort al uun en gemiansoom archiif brükt. Wees so gud, an nem en öödern nööm.",
        "export": "Sidjen eksportiare",
        "version-poweredby-others": "öödern",
        "version-poweredby-translators": "Auersaatern faan translatewiki.net",
        "version-credits-summary": "Wi besoonke üs bi jodiar persuunen för hör bidracher tu [[Special:Version|MediaWiki]].",
-       "version-license-info": "MediaWiki is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n\nMediaWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\nYou should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU General Public License] along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].",
+       "version-license-info": "MediaWiki is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n\nMediaWiki is distributed in the hope that it will be useful, but <em>WITHOUT ANY WARRANTY</em>; without even the implied warranty of <strong>MERCHANTABILITY</strong> or <strong>FITNESS FOR A PARTICULAR PURPOSE</strong>. See the GNU General Public License for more details.\n\nYou should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU General Public License] along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].",
        "version-software": "Instaliird software",
        "version-software-product": "Produkt",
        "version-software-version": "Werjuun",
        "limitreport-expansiondepth": "Maksimaal ütjwidjangsjipde",
        "limitreport-expensivefunctioncount": "Taal faan apwendag parser-funktjuunen",
        "expandtemplates": "Föörlaagen ütjwidje",
-       "expand_templates_intro": "Üüb detdiar spezial-sidj wurd a föörlaagen faan di tekst rekursiif ütjwidjet.\nUk parser-funktjuunen liküs <code><nowiki>{{</nowiki>#language:…}}</code> an wariaabeln liküs <code><nowiki>{{</nowiki>CURRENTDAY}}</code> wurd ferwerket - det ment ales, wat tesken dobelt sleufen stäänt.",
+       "expand_templates_intro": "Üüb detdiar spezial-sidj wurd a föörlaagen faan di wikitekst rekursiif ütjwidjet.\nUk parser-funktjuunen liküs <code><nowiki>{{</nowiki>#language:…}}</code> an wariaabeln liküs <code><nowiki>{{</nowiki>CURRENTDAY}}</code> wurd ferwerket - det ment ales, wat tesken dobelt sleufen stäänt.",
        "expand_templates_title": "Kontekst-tiitel, för {{FULLPAGENAME}} asw.:",
-       "expand_templates_input": "Skriiwfial:",
+       "expand_templates_input": "Skriiw wikitext:",
        "expand_templates_output": "Resultaat",
        "expand_templates_xml_output": "XML-resultaat",
        "expand_templates_html_output": "Rä HTML-ütjgoow",
index da2066d..6b2f5c8 100644 (file)
@@ -47,7 +47,7 @@
        "tog-showhiddencats": "Afiché katégori-ya ki kaché",
        "tog-norollbackdiff": "Pa afiché diff aprè révoké",
        "tog-useeditwarning": "Avèrti mo lò mo ka kité roun paj an kour di modifikasyon san sovgardé",
-       "tog-prefershttps": "Toujou itilizé roun konèksyon sékirizé lò mo konèkté",
+       "tog-prefershttps": "Toujou itilizé roun konnègsyon sékirizé lò mo konnègté",
        "underline-always": "Toujou",
        "underline-never": "Janmè",
        "underline-default": "Valò pa défo di tenm oben di navigatò",
        "index-category": "Paj endèksé",
        "noindex-category": "Paj ki pa endèksé",
        "broken-file-category": "Paj ké dé lyen di fiché brizé",
-       "about": "À propo",
+       "categoryviewer-pagedlinks": "($1) ($2)",
+       "category-header-numerals": "$1–$2",
+       "about": "Apropo",
        "article": "Paj di kontni",
        "newwindow": "(Ka ouvri so kò andan roun nouvèl finèt)",
        "cancel": "Annilé",
        "pool-errorunknown": "Éròr enkonèt",
        "pool-servererror": "Sèrvis di rézèrvasyon pa disponib ($1).",
        "poolcounter-usage-error": "Éròr di itilizasyon : $1",
-       "aboutsite": "À propo di {{SITENAME}}",
-       "aboutpage": "Project:À propo di",
+       "aboutsite": "Apropo di {{SITENAME}}",
+       "aboutpage": "Project:Apropo di",
        "copyright": "Kontni-a sa disponib anba lisans $1 sof mansyon kontrèr.",
        "copyrightpage": "{{ns:project}}:Copyrights",
        "currentevents": "Atchwalité",
        "mainpage": "Paj Prensipal",
        "mainpage-description": "Paj prensipal",
        "policy-url": "Project:Larèl",
-       "portal": "Pòrtay konminotèr",
-       "portal-url": "Project:Pòrtay konminotèr",
+       "portal": "Kouminoté",
+       "portal-url": "Project:Pòrtay kouminotèr",
        "privacy": "Politik di konfidansyalité",
        "privacypage": "Project:Politik di konfidansyalité",
        "badaccess": "Éròr di pèrmisyon",
        "versionrequired": "Vèrsyon $1 di MediaWiki nésésèr",
        "versionrequiredtext": "Vèrsyon $1 di MediaWiki sa nésésèr pou itilizé sa paj.\nKonsilté [[Special:Version|paj di vèrsyon-yan]].",
        "ok": "Validé",
+       "pagetitle": "$1 — {{SITENAME}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
+       "backlinksubtitle": "← $1",
        "retrievedfrom": "Rékipéré di « $1 »",
        "youhavenewmessages": "{{PLURAL:$3|Zòt gen}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Zòt gen}} $1 {{PLURAL:$3|di rounòt itilizatò|di $3 ròt itilizatò}} ($2).",
        "site-atom-feed": "Flux Atom di $1",
        "page-rss-feed": "Flux RSS di « $1 »",
        "page-atom-feed": "Flux Atom di « $1 »",
+       "feed-atom": "Atom",
+       "feed-rss": "RSS",
        "red-link-title": "$1 (paj pa ka ègzisté)",
        "sort-descending": "Tri dékrwasan",
        "sort-ascending": "Tri krwasan",
        "nstab-user": "Paj di {{GENDER:{{ROOTPAGENAME}}|itilizatò|itilizatris}}",
        "nstab-media": "Médja",
        "nstab-special": "Paj èspésyal",
-       "nstab-project": "À propo",
+       "nstab-project": "Paj di projè",
        "nstab-image": "Fiché",
        "nstab-mediawiki": "Mésaj",
        "nstab-template": "Modèl",
        "ns-specialprotected": "Paj èspésyal-ya pa pouvé fika modifyé.",
        "titleprotected": "Sa tit té protéjé kont tout kréyasyon pa [[User:$1|$1]].\nMotif fourni sa <em>$2</em>.",
        "filereadonlyerror": "Enposib di modifyé fiché-a « $1 » pas répèrtwar-a di fiché « $2 » sa an lèktir sèl.\n\nAdministratò sistèm ki li vérouyé té fourni sa motif : « $3 ».",
+       "invalidtitle": "Tit pa valid",
        "invalidtitle-knownnamespace": "Tit pa valid ké lèspas di non « $2 » é entitilé-a « $3 »",
        "invalidtitle-unknownnamespace": "Tit pa valid ké niméro-a di lèspas di non $1 enkonèt é entitilé-a « $2 »",
-       "exception-nologin": "Pa konèkté",
-       "exception-nologin-text": "Souplé, konèkté zòt kò pou aksédé à sa paj oben sa aksyon.",
+       "exception-nologin": "Pa konnègté",
+       "exception-nologin-text": "Souplé, konnègté zòt kò pou agsédé à sa paj oben sa agsyon.",
        "exception-nologin-text-manual": "Souplé zòt $1 pou aksédé à sa paj oben sa aksyon.",
        "virus-badscanner": "Movèz konfigirasyon : analizò di viris enkonèt : <em>$1</em>",
        "virus-scanfailed": "échèk di analiz-a (kod $1)",
        "virus-unknownscanner": "antiviris enkonèt :",
-       "logouttext": "<strong>Zòt atchwèlman dékonèkté.</strong>\n\nNoté ki sèrtenn paj pouvé fika òkò afiché kou si zòt toujou konèkté, jouk zòt désidé di éfasé kach-a di zòt navigatò.",
-       "cannotlogoutnow-title": "Enposib di konèkté so kò atchwèlman",
-       "cannotlogoutnow-text": "Dékonèksyon-an pa posib an itilizan $1.",
+       "logouttext": "<strong>Zòt atchwèlman dékonnègté.</strong>\n\nNoté ki sèrten paj pouvé fika òkò afiché kou si zòt toujou konnègté, jouk zòt désidé di éfasé kach-a di zòt navigatò.",
+       "cannotlogoutnow-title": "Enposib di dékonnègté so kò atchwèlman",
+       "cannotlogoutnow-text": "Dékonnègsyon-an pa posib an itilizan $1.",
        "welcomeuser": "Bèlvini, $1 !",
        "welcomecreation-msg": "Zòt kont té kréyé.\nZòt pouvé modifyé [[Special:Preferences|zòt préférans]] pou {{SITENAME}} si zòt swété.",
        "yourname": "Non di itilizatò :",
        "createacct-yourpasswordagain": "Konfirmé mo di pas",
        "createacct-yourpasswordagain-ph": "Antré òkò menm mo di pas",
        "userlogin-remembermypassword": "Gardé mo sésyon aktiv",
-       "userlogin-signwithsecure": "Itilizé roun konèksyon sékirizé",
-       "cannotlogin-title": "Enposib di konèkté so kò",
-       "cannotlogin-text": "Konèksyon-an pa posib",
-       "cannotloginnow-title": "Enposib di konèkté so kò atchwèlman",
-       "cannotloginnow-text": "Konèksyon-an pa posib an itilizan $1.",
+       "userlogin-signwithsecure": "Itilizé roun konnègsyon sékirizé",
+       "cannotlogin-title": "Enposib di konnègté so kò",
+       "cannotlogin-text": "Konnègsyon-an pa posib",
+       "cannotloginnow-title": "Enposib di konnègté so kò atchwèlman",
+       "cannotloginnow-text": "Konnègsyon-an pa posib an itilizan $1.",
        "cannotcreateaccount-title": "Kréyasyon di kont enposib",
        "cannotcreateaccount-text": "Kréyasyon-an dirèk di kont itilizatò pa aktivé asou sa wiki.",
        "yourdomainname": "Zòt domenn :",
        "password-change-forbidden": "Zòt pa pouvé modifyé mo di pas asou sa wiki.",
        "externaldberror": "Swé roun lérò prodjwi so kò asou baz-a di data d'otantifikasyon, swé zòt pa otorizé à mété à jou zòt kont ègstèrn.",
-       "login": "Konèksyon",
+       "login": "Konnègsyon",
        "login-security": "Vérifyé zòt idantité",
-       "nav-login-createaccount": "Kréyé roun kont oben konèkté so kò",
-       "logout": "Dékonèkté so kò",
-       "userlogout": "Dékonèksyon",
-       "notloggedin": "Pa konèkté",
+       "nav-login-createaccount": "Kréyé roun kont oben konnègté so kò",
+       "logout": "Dékonnègté so kò",
+       "userlogout": "Dékonnègsyon",
+       "notloggedin": "Pa konnègté",
        "userlogin-noaccount": "Zòt pa gen roun kont ?",
        "userlogin-joinproject": "Roujwenn {{SITENAME}}",
        "createaccount": "Kréyé roun kont",
        "userlogin-resetpassword-link": "Zòt bliyé zòt mo di pas ?",
        "userlogin-helplink2": "Lèd pou konnègté so kò",
-       "userlogin-loggedin": "Zòt ja konèkté an tan ki $1.\nItilizé fòrmilèr-a ki anba pou konèkté zòt kò ké rounòt kont itilizatò.",
+       "userlogin-loggedin": "Zòt déja konnègté an tan ki $1.\nItilizé fòrmilèr-a ki anba pou konnègté zòt kò ké rounòt kont itilizatò.",
        "userlogin-reauth": "Zòt divèt roukonèkté zòt kò pou vérifyé ki zòt sa {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Kréyé rounòt kont",
        "createacct-emailrequired": "Adrès di kouryé",
        "badretype": "Mo di pas ki zòt sézi pa ka korèsponn.",
        "usernameinprogress": "Oun kréyasyon di kont pou sa non d'itilizatò ja an kour.\nSouplé, pasyanté.",
        "userexists": "Non d'itilizatò sézi ja itilizé.\nSouplé, chwézi roun non diféran.",
-       "loginerror": "Érò di konèksyon",
+       "loginerror": "Lérò di konnègsyon",
        "createacct-error": "Érò lò kréyasyon-an di kont",
        "createaccounterror": "Enposib di kréyé kont-a : $1",
-       "nocookiesnew": "Kont itilizatò té kréyé, mè zòt pa konèkté.\n{{SITENAME}} ka itilizé dé témwen (''cookies'') pou konsèrvé konèksyon-an mè zòt dézaktivé yé.\nSouplé, aktivé yé é roukonèkté zòt kò ké menm non é menm mo di pas.",
-       "nocookieslogin": "{{SITENAME}} itilizé dé témwen (''cookies'') pou konsèrvé konèksyon-an mè zòt dézaktivé yé.\nSouplé, aktivé yé é roukonèkté zòt kò.",
+       "nocookiesnew": "Kont itilizatò fin kréyé, mé zòt pa konnègté.\n{{SITENAME}} ka itilizé dé témwen (''cookies'') pou konsèrvé konnègsyon-an mé zòt dézagtivé yé.\nSouplé, agtivé yé é rikonnègté zòt kò ké menm non é menm modipas.",
+       "nocookieslogin": "{{SITENAME}} itilizé dé témwen (''cookies'') pou konsèrvé konnègsyon-an mé zòt dézagtivé yé.\nSouplé, agtivé yé é rikonnègté zòt kò.",
        "nocookiesfornew": "Kont itilizatò pa té kréyé, pas nou pa té pouvé idantifyé so lorijin.\nVérifyé ki zòt aktivé témwen-yan (''cookies''), roucharjé paj-a é éséyé òkò.",
-       "createacct-loginerror": "Kont-a té byen kréyé mè zòt pa pouvé konèkté zòt kò otomatikman.\nSouplé, [[Special:UserLogin|konèkté zòt kò manwèlman]].",
+       "nocookiesforlogin": "{{int:nocookieslogin}}",
+       "createacct-loginerror": "Kont-a byen fin kréyé mé zòt pa pouvé konnègté zòt kò otonmatikman.\nSouplé, [[Special:UserLogin|konnègté zòt kò manniyèlman]].",
        "noname": "Zòt pa sézi roun non d'itilizatò valid.",
-       "loginsuccesstitle": "Konèkté",
-       "loginsuccess": "<strong>Zòt atchwèl konèkté à {{SITENAME}} antan ki « $1 ».</strong>",
+       "loginsuccesstitle": "Konnègté",
+       "loginsuccess": "<strong>Zòt sa atchwèlman konnègté à {{SITENAME}} antan ki « $1 ».</strong>",
        "nosuchuser": "Itilizatò « $1 » pa ka ègzisté.\nNon d'itilizatò-ya sa sansib à lakas.\nVérifyé lòrtograf, oben [[Special:CreateAccount|kréyé roun kont nòv]].",
        "nosuchusershort": "I pa gen kontribitò ké non-an « $1 ».\nSouplé, vérifyé lòrtograf.",
        "nouserspecified": "Zòt divèt sézi roun non d'itilizatò.",
-       "login-userblocked": "{{GENDER:$1|Sa itilizatò|Sa itilizatris}} bloké. Konèksyon-an pa otorizé.",
+       "login-userblocked": "{{GENDER:$1|Sa itilizatò}} bloké. Konnègsyon-an pa otorizé.",
        "wrongpassword": "Non d'itilizatò oben mo di pas enkorèk.\nSouplé, éséyé òkò.",
        "wrongpasswordempty": "Zòt pa antré pyès mo di pas.\nSouplé, éséyé òkò.",
        "passwordtooshort": "Zòt mo di pas divèt kontni omwen $1 karaktèr{{PLURAL:$1|}}.",
        "accountcreatedtext": "Kont itilizatò pou [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskisyon]]) té kréyé.",
        "createaccount-title": "Kréyasyon di roun kont pou {{SITENAME}}",
        "createaccount-text": "Tchèk moun kréyé roun kont pou zòt adrès di kouryé asou {{SITENAME}} ($4) entitilé « $2 », ké mo di pas « $3 ».\nZòt divèt ouvri roun sésyon é atchwèlman modifyé zòt mo di pas.\n\nIgnoré sa mésaj si sa kont té kréyé pa érò.",
-       "login-throttled": "Zòt tanté dèrnyèrman roun nonm tròp élvé di konèksyon.\nSouplé, antann $1 anvan di éséyé òkò.",
-       "login-abort-generic": "Zòt échwé zòt tantativ di konèksyon",
+       "login-throttled": "Zòt tanté dannyéman roun nonm tròp élvé di konnègsyon.\nSouplé, antann $1 anvan di éséyé òkò.",
+       "login-abort-generic": "Zòt échwé zòt tantativ di konnègsyon",
        "login-migrated-generic": "Zòt kont té migré, é zòt non d'itilizatò pa ka ègzisté òkò asou sa wiki.",
        "loginlanguagelabel": "Lanng : $1",
-       "suspicious-userlogout": "Zòt doumann di konèksyon té réfizé pas i sanblé ki li té voyé pa roun navigatò défèktyé oben dipi kach-a di roun sèrvis mandatèr.",
+       "suspicious-userlogout": "Zòt doumann di konnègsyon té roufizé pas i sanblé ki li té voyé pa roun navigatò défègtché oben dipi kach-a di roun sèrvis mandatèr.",
        "createacct-another-realname-tip": "Véritab non sa òpsyonèl.\nSi zòt désidé di fourni li, i ké fika itilizé pou krédité lotò di so travay.",
-       "pt-login": "Konèkté so kò",
-       "pt-login-button": "Konèkté so kò",
-       "pt-login-continue-button": "Kontinwé konèksyon-an",
+       "pt-login": "Konnègté so kò",
+       "pt-login-button": "Konnègté so kò",
+       "pt-login-continue-button": "Kontinwé konnègsyon-an",
        "pt-createaccount": "Kréyé roun kont",
-       "pt-userlogout": "Dékonèkté so kò",
+       "pt-userlogout": "Dékonnègté so kò",
        "php-mail-error-unknown": "Érò enkonèt annan fonksyon-an <code>mail()</code> di PHP.",
        "user-mail-no-addy": "Enposib di voyé roun kouryé san adrès di kouryé.",
        "user-mail-no-body": "Ésè di voyé di roun kouryé ké roun kò vid oben anòrmalman kour.",
        "changepassword": "Chanjé di mo di pas",
        "resetpass_announce": "Pou tèrminé zòt enskripsyon, zòt divèt fourni roun mo di pas nòv.",
+       "resetpass_text": "<!-- Ajouté tègs-a isi -->",
        "resetpass_header": "Chanjé mo di pas di kont",
        "oldpassword": "Ansyen mo di pas :",
        "newpassword": "Mo di pas nòv :",
        "retypenew": "Konfirmé mo di pas nòv :",
-       "resetpass_submit": "Chanjé mo di pas é konèkté so kò.",
+       "resetpass_submit": "Chanjé modipas-a é konnègté so kò.",
        "changepassword-success": "Zòt mo di pas té modifyé !",
-       "changepassword-throttled": "Zòt fè tròp di tantativ di konèksyon résaman. \nSouplé, antann $1 anvan di rééséyé.",
+       "changepassword-throttled": "Zòt fè tròp di tantativ di konnègsyon résaman. \nSouplé, antann $1 anvan di réyéséyé.",
        "botpasswords": "Mo di pas di robo",
-       "botpasswords-summary": "<em>Mo di pas di robo</em> ka pèrmèt di aksédé à roun kont itilizatò via API-a san itilizé idantifyan-yan di konèksyon prensipal. Drwè itilizatò disponib lò to konèkté ké roun mo di pas robo pouvé fika rédjwi.\n\nSi zòt wè pou kisa zòt ké lé fè sa, a ki zòt pa benzwen di fè sa. Pésonn divèt janmè doumandé zòt di jénéré roun é di bay li.",
+       "botpasswords-summary": "<em>Modipas-ya di robo</em> ka pèrmèt di agsédé à roun kont itilizatò vya API-a san itilizé idantifyan-yan di konnègsyon prensipal. Drwè itilizatò disponib lò to konnègté ké roun modipas robo pouvé fika rédjwi.\n\nSi zòt pa ka wè poukisa zòt ké lé fè sa, a ki zòt pa benzwen di fè sa. Pésonn divèt janmen doumandé zòt di an jénéré roun é di bay li.",
        "botpasswords-disabled": "Mo di pas di robo sa dézaktivé.",
-       "botpasswords-no-central-id": "Pou itilizé mo di pas di robo, zòt divèt fika konèkté à roun kont santralizé.",
+       "botpasswords-no-central-id": "Pou itilizé modipas-ya di robo, zòt divèt fika konnègté à roun kont ki santralizé.",
        "botpasswords-existing": "Mo di pas di robo ègzistan",
        "botpasswords-createnew": "Kréyé roun mo di pas nòv di robo",
        "botpasswords-editexisting": "Modifyé roun mo di pas di robo ègzistan",
+       "botpasswords-label-needsreset": "(Modipas-a divèt fika réyinisyalizé)",
        "botpasswords-label-appid": "Non di robo :",
        "botpasswords-label-create": "Kréyé",
        "botpasswords-label-update": "Mété à jou",
        "botpasswords-updated-body": "Mo di pas pou robo-a « $1 » di {{GENDER:$2|itilizatò|itilizatris}}-a « $2 » té mizajou.",
        "botpasswords-deleted-title": "Mo di pas di robo souprimé",
        "botpasswords-deleted-body": "Mo di pas pou robo-a « $1 » di {{GENDER:$2|itilizatò|itilizatris}}-a « $2 » té souprimé.",
-       "botpasswords-newpassword": "Mo di pas nòv pou konèkté so kò à<strong>$1</strong> sa <strong>$2</strong>. <em>Souplé, anréjistré li pou fè référans di li iltèryèrman.</em><br> (Pou ansyen robo ki ka nésésité ki non fourni pou konèksyon-an ka fika menm-an ki non di itilizasyon évantchwèl, zòt pouvé osi itilizé <strong>$3</strong> kou non di itilizatò é <strong>$4</strong> kou mo di pas).",
+       "botpasswords-newpassword": "Nouvèl modipas-a pou konnègté so kò à<strong>$1</strong> sa <strong>$2</strong>. <em>Souplé, anréjistré li pou fè référans asou li iltèryèrman.</em><br> (Pou ansyen robo ki ka nésésité ki non fourni pou konnègsyon-an ka fika menm-an ki non di itilizasyon évantchwèl, zòt pouvé osi itilizé <strong>$3</strong> kou non di itilizatò é <strong>$4</strong> kou modipas).",
        "botpasswords-no-provider": "BotPasswordsSessionProvider pa disponib.",
-       "botpasswords-restriction-failed": "Rèstriksyon-yan di mo di pas di robo ka anpéché sa konèksyon.",
+       "botpasswords-restriction-failed": "Rèstrigsyon-yan di modipas di robo ka anpéché sa konnègsyon.",
        "botpasswords-invalid-name": "Non-an d'itilizatò spésifyé pa ka kontni di séparatò di mo di pas di robo (« $1 »).",
        "botpasswords-not-exist": "{{GENDER:$1|Itilizatò|Itilizatris}}-a « $1 » pa gen di mo di pas di robo nonmen « $2 ».",
        "resetpass_forbidden": "Mo di pas pa pouvé fika chanjé.",
        "resetpass_forbidden-reason": "Mo di pas pa pouvé fika modifyé : $1",
-       "resetpass-no-info": "Zòt divèt fika konèkté pou aksédé dirèkman à sa paj.",
+       "resetpass-no-info": "Zòt divèt fika konnègté pou agsédé dirèkman à sa paj.",
        "resetpass-submit-loggedin": "Chanjé di mo di pas",
        "resetpass-submit-cancel": "Annilé",
        "resetpass-wrong-oldpass": "Mo di pas atchwèl oben tanporèr envalid.\nZòt pitèt ja chanjé zòt mo di pas oben doumandé roun mo di pas nòv tanporèr.",
-       "resetpass-recycled": "Souplé, réyinisyalizé zòt mo di pas an tchèk kichoz di ròt ki atchwèl-a.",
-       "resetpass-temp-emailed": "Zòt konèkté ké roun kod tanporèr fourni pa kouryé.\nPou tèrminé konèksyon-an, zòt divèt fourni roun mo di pas nòv isi :",
+       "resetpass-recycled": "Souplé, réyinisyalizé zòt modipas an tchèk kichoz di ròt ki atchwèl-a.",
+       "resetpass-temp-emailed": "Zòt konnègté ké roun kod tanporèr ki fourni pa kouryé.\nPou tèrminé konnègsyon-an, zòt divèt fourni roun nouvèl modipas isi :",
        "resetpass-temp-password": "Mo di pas tanporèr :",
-       "resetpass-expired-soft": "Zòt mo di pas èkspiré, é divèt fika réyinisyalizé. Souplé, chwézi roun nouvèl atchwèlman oben kliké asou « {{int:authprovider-resetpass-skip-label}} » pou fè li plita.",
-       "resetpass-validity-soft": "Zòt mo di pas pa valid : $1\n\nSouplé, chwézi roun mo di pas nòv atchwèlman, oben kliké asou « {{int:authprovider-resetpass-skip-label}} » pou réyinisyalizé li plita.",
+       "resetpass-expired-soft": "Zòt modipas èspiré, é divèt fika réyinisyalizé. Souplé, chwézi roun nouvèl atchwèlman oben kliké asou « {{int:authprovider-resetpass-skip-label}} » pou fè li plita.",
+       "resetpass-validity-soft": "Zòt modipas pa valid : $1\n\nSouplé, chwézi roun modipas nòv atchwèlman, oben kliké asou « {{int:authprovider-resetpass-skip-label}} » pou réyinisyalizé li plita.",
        "passwordreset": "Réyinisyalizasyon di mo di pas",
        "passwordreset-text-one": "Ranplisé sa fòrmilèr pou zòt mo di pas.",
        "passwordreset-emaildisabled": "Fonksyonalité-ya di kouryé té dézaktivé asou sa wiki.",
        "passwordreset-invalidemail": "Adrès di mésajri envalid",
        "passwordreset-nodata": "Pyès non d'itilizatò oben adrès di mésajri té fourni",
        "changeemail": "Chanjé oben souprimé adrès di kouryé",
-       "changeemail-no-info": "Zòt divèt fika konèkté pou aksédé dirèkman à sa paj.",
+       "changeemail-no-info": "Zòt divèt fika konnègté pou agsédé dirèkman à sa paj.",
        "changeemail-oldemail": "Adrès di kouryé atchwèl :",
        "changeemail-newemail": "Nouvèl adrès di kouryé :",
        "changeemail-none": "(pyès)",
        "changeemail-password": "Zòt mo di pas asou {{SITENAME}} :",
        "changeemail-submit": "Chanjé adrès di kouryé",
-       "changeemail-throttled": "Zòt fè tròp di tantativ di konèksyon. \nSouplé, antann $1 anvan di rééséyé.",
+       "changeemail-throttled": "Zòt fè tròp tantativ di konnègsyon. \nSouplé, antann $1 anvan di réyéséyé.",
        "changeemail-nochange": "Souplé, sézi roun nouvèl adrès di kouryé diférant di présédant-a.",
        "resettokens": "Réyinisyalizé jéton-yan.",
        "resettokens-no-tokens": "I pa gen pyès jéton pou réyinisyalizé.",
        "preview": "Prévizwalizasyon",
        "showpreview": "Prévizwalizé",
        "showdiff": "Wè modifikasyon-yan",
-       "anoneditwarning": "<strong>Panga :</strong> zòt pa konèkté. Zòt adrès IP ké fika vizib pa tout moun si zòt ka fè dé modifikasyon. Si zòt <strong>[$1 ka konèkté zòt kò]</strong> oben <strong>[$2 kréyé roun kont]</strong>, zòt modifikasyon ké fika atribiyé à zòt pròp non di itilizatò é zòt ké gen ròt avantaj.",
+       "anoneditwarning": "<strong>Panga :</strong> zòt pa konnègté. Zòt adrès IP ké vizib pa tout moun si zòt ka fè dé modifikasyon. Si zòt <strong>[$1 ka konnègté zòt kò]</strong> oben <strong>[$2 kréyé roun kont]</strong>, zòt modifikasyon ké fika atribiyé à zòt pròp non di itilizatò é zòt ké gen ròt avantaj.",
        "blockedtext": "<strong>Zòt kont itilizatò oben zòt adrès IP bloké.</strong>\n\nBlokaj té éfèktchwé pa $1.\nRézon-an ki évoké ka swiv : <em>$2</em>.\n\n* Koumansman di blokaj : $8\n* Èspirasyon di blokaj : $6\n* Kont bloké : $7.\n\nZòt pouvé kontakté $1 oben rounòt [[{{MediaWiki:Grouppage-sysop}}|administratò]] pou an diskité.\nZòt pa pouvé itilizé fonksyon-an « {{int:emailuser}} » rounso si oun adrès di kouryé valid sa èspésifyé andan zòt [[Special:Preferences|préférans]] é rounso si sa fonksyonalité pa bloké.\nZòt adrès IP atchwèl sa $3 é zòt idantifyan di blokaj sa $5.\nSouplé, enkli tout détay-ya lasou'l annan chakin dé rékèt ki zòt ké fè.",
-       "loginreqlink": "konèkté so kò",
+       "loginreqlink": "konnègté so kò",
        "newarticletext": "Zòt té ka swiv roun lyen bò'd roun paj ki pa ka ègzisté òkò. \nAfen di kréyé sa paj, antré zòt tèks annan bwèt ki aprè (zòt pouvé konsilté [$1 paj di lèd-a] pou plis d'enfòrmasyon).\nSi zòt vini{{GENDER:|}} isi pa éròr, kliké asou bouton <strong>Routour</strong> di zòt navigatò.",
        "anontalkpagetext": "----\n<em>Zòt asou paj di diskisyon di roun itilizatò anonim ki pa òkò kréyé di kont oben ki pa ka an itilizé</em>.\nPou sa rézon, nou divèt itilizé so adrès IP pou idantifyé li.\nOun adrès IP pouvé fika partajé pa plizyò itilizatò.\nSi zòt roun itiliza{{GENDER:|ò|ris}} anonim é si zòt ka kontasté ki dé koumantèr ki pa ka konsèrné zòt sa adrèsé pou zòt, zòt pouvé [[Special:CreateAccount|kréyé roun kont]] oben [[Special:UserLogin|konèkté zòt kò]] atò di évité tout konfizyon fitir ké ròt kontribitò anonim.",
        "noarticletext": "I pa gen atchwèlman pyès tèks asou sa paj.\nZòt pouvé [[Special:Search/{{PAGENAME}}|lansé oun sasé asou sa tit]] annan ròt paj-ya,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sasé annan opérasyon ki lyannen]\noben [{{fullurl:{{FULLPAGENAME}}|action=edit}} kréyé sa paj]</span>.",
        "tooltip-pt-preferences": "{{GENDER:|Zòt}} préférans",
        "tooltip-pt-watchlist": "Oun lis dé paj don zòt ka swiv modifikasyon",
        "tooltip-pt-mycontris": "Oun lis di {{GENDER:|zòt}} kontribisyon",
-       "tooltip-pt-login": "Nou ka ankourajé zòt à konèkté zòt kò ; soupannan, i pa obligatwar",
-       "tooltip-pt-logout": "Dékonèkté so kò",
-       "tooltip-pt-createaccount": "Nou ka ankourajé zòt à kréyé roun kont itilizatò é konèkté zòt kò ; soupannan, i pa obligatwar",
+       "tooltip-pt-login": "Nou ka ankourajé zòt à konnègté zòt kò ; soupannan, zòt pa blijé di fè li",
+       "tooltip-pt-logout": "Dékonnègté so kò",
+       "tooltip-pt-createaccount": "Nou ka ankourajé zòt à kréyé roun kont itilizatò é konnègté zòt kò ; soupannan, zòt pa blijé di fè li",
        "tooltip-ca-talk": "Diskisyon o sijè di sa paj di kontni",
        "tooltip-ca-edit": "Modifyé wikikod-a",
        "tooltip-ca-addsection": "Koumansé roun nouvèl sèksyon",
        "tooltip-p-logo": "Vizité paj prensipal-a",
        "tooltip-n-mainpage": "Vizité paj prensipal-a di sit",
        "tooltip-n-mainpage-description": "Paj prensipal jénéral",
-       "tooltip-n-portal": "À propo di projè, sa ki zòt pouvé fè, koté trouvé enfòrmasyon-yan",
+       "tooltip-n-portal": "Apropo di projè, sa ki zòt pouvé fè, koté trouvé enfòrmasyon-yan",
        "tooltip-n-currentevents": "Trouvé plis d'enfòrmasyon asou atchwalité an kour",
        "tooltip-n-recentchanges": "Lis di modifikasyon résant asou wiki-a",
        "tooltip-n-randompage": "Afiché roun paj an azò",
index d19b0c3..1ebf800 100644 (file)
        "ns-specialprotected": "Non se poden editar as páxinas no espazo de nomes \"{{ns:special}}\".",
        "titleprotected": "Este título foi protexido da creación por [[User:$1|$1]].\nO motivo achegado é <em>$2</em>.",
        "filereadonlyerror": "Non se puido modificar o ficheiro \"$1\" porque o repositorio \"$2\" está en modo de só lectura.\n\nO administrador do sistema que bloqueou o repositorio achegou este motivo: \"$3\".",
+       "invalidtitle": "Título non válido",
        "invalidtitle-knownnamespace": "Título inválido co espazo de nomes \"$2\" e o texto \"$3\"",
        "invalidtitle-unknownnamespace": "Título inválido cun número de espazo de nomes, $1, descoñecido e o texto \"$2\"",
        "exception-nologin": "Non accedeu ao sistema",
        "recentchangescount": "Número de edicións a amosar por defecto nos cambios recentes, nos historiais de páxina e nos rexistrosː",
        "prefs-help-recentchangescount": "Número máximo: 1000",
        "prefs-help-watchlist-token2": "Esta é a clave secreta da fonte de novas web para a súa lista de vixilancia.\nCalquera persoa que a saiba poderá ler a súa lista de vixilancia; non comparta esta clave.\nSe o precisa, [[Special:ResetTokens|pode restablecela]].",
-       "prefs-help-tokenmanagement": "Podes ver e restaurar a chave secreta da túa conta que permite acceder á fonte web da túa lista de vixiancia. Calquera que coñeza a chave poderá leer a túa lista de vixiancia, así que non a compartas.",
+       "prefs-help-tokenmanagement": "Pode ver e restaurar a chave secreta da súa conta, que permite acceder á fonte web da súa lista de vixiancia. Calquera que coñeza a chave poderá ler a súa lista de vixilancia, así que non a comparta.",
        "savedprefs": "Gardáronse as súas preferencias.",
        "savedrights": "Gardáronse os grupos de {{GENDER:$1|usuario|usuaria}} de $1.",
        "timezonelegend": "Fuso horario:",
index 07c5c5b..cf1ce58 100644 (file)
@@ -5,10 +5,11 @@
                        "아라",
                        "DonCamillo",
                        "Koavf",
-                       "Ammarpad"
+                       "Ammarpad",
+                       "Mojaam"
                ]
        },
-       "tog-underline": "Link underlining:",
+       "tog-underline": "Zana layin link",
        "tog-hideminor": "A ɓoye ƙananan gyare-gyare na baya-bayan nan",
        "tog-hidepatrolled": "A ɓoye gyare-gyaren kan ido a cikin gyare-gyare bayan-bayan nan",
        "tog-newpageshidepatrolled": "A ɓoye shafuna kan ido a cikin sabbin shafuna",
index 4087c8a..effe952 100644 (file)
        "ns-specialprotected": "לא ניתן לערוך דפים מיוחדים.",
        "titleprotected": "[[User:$1|$1]] {{GENDER:$1|הפעיל|הפעילה}} על הדף הזה הגנה מפני יצירה.\nהסיבה שניתנה להגנה היא: <em>$2</em>.",
        "filereadonlyerror": "לא ניתן לשנות את הקובץ \"$1\" כיוון שמאגר הקבצים \"$2\" במצב קריאה בלבד.\n\nמנהל המערכת שנעל את המאגר סיפק את ההסבר הבא: \"$3\".",
+       "invalidtitle": "כותרת בלתי תקינה",
        "invalidtitle-knownnamespace": "כותרת בלתי־תקינה עם מרחב השם \"$2\" ועם שם הדף \"$3\"",
        "invalidtitle-unknownnamespace": "כותרת בלתי־תקינה עם מרחב שם בלתי־ידוע מספר $1 ועם שם הדף \"$2\"",
        "exception-nologin": "לא בחשבון",
index 915cd12..77b2b8a 100644 (file)
        "ns-specialprotected": "A speciális lapok nem szerkeszthetők.",
        "titleprotected": "Ilyen címmel nem lehet szócikket készíteni, [[User:$1|$1]] letiltotta.\nAz indoklás: <em>$2</em>.",
        "filereadonlyerror": "A(z) „$1” fájl nem módosítható, mert a(z) „$2” fájltároló csak olvasható módban üzemel.\n\nA lezárást végrehajtó rendszeradminisztrátor az alábbi indoklást adta meg: „$3”.",
+       "invalidtitle": "Érvénytelen cím",
        "invalidtitle-knownnamespace": "Érvénytelen cím „$2” névtérrel és „$3” szöveggel",
        "invalidtitle-unknownnamespace": "Érvénytelen cím az ismeretlen $1 névtérszámmal és „$2” szöveggel",
        "exception-nologin": "Nem vagy bejelentkezve.",
        "group-autoconfirmed": "automatikusan megerősített szerkesztők",
        "group-bot": "botok",
        "group-sysop": "adminisztrátorok",
+       "group-interface-admin": "felületadminisztrátorok",
        "group-bureaucrat": "bürokraták",
        "group-suppress": "adatvédelmi biztosok",
        "group-all": "(mind)",
        "group-autoconfirmed-member": "{{GENDER:$1|automatikusan megerősített felhasználó}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|adminisztrátor}}",
+       "group-interface-admin-member": "{{GENDER:$1|felületadminisztrátor}}",
        "group-bureaucrat-member": "{{GENDER:$1|bürokrata}}",
        "group-suppress-member": "{{GENDER:$1|adatvédelmi biztos}}",
        "grouppage-user": "{{ns:project}}:Felhasználók",
        "grouppage-autoconfirmed": "{{ns:project}}:Munkatársak#Automatikusan megerősített szerkesztők",
        "grouppage-bot": "{{ns:project}}:Botok",
        "grouppage-sysop": "{{ns:project}}:Adminisztrátorok",
+       "grouppage-interface-admin": "{{ns:project}}:Felületadminisztrátorok",
        "grouppage-bureaucrat": "{{ns:project}}:Bürokraták",
        "grouppage-suppress": "{{ns:project}}:Adatvédelmi biztosok",
        "right-read": "lapok olvasása",
index 48828ae..35a9280 100644 (file)
        "customcssprotected": "Tu non ha le permission de modificar iste pagina de CSS perque illo contine le configuration personal de un altere usator.",
        "customjsonprotected": "Tu non ha le permission de modificar iste pagina JSON perque illo contine le configuration personal de un altere usator.",
        "customjsprotected": "Tu non ha le permission de modificar iste pagina de JavaScript perque illo contine le configuration personal de un altere usator.",
+       "sitecssprotected": "Tu non ha le permission de modificar iste pagina CSS perque isto pote affectar tote le visitantes",
+       "sitejsonprotected": "Tu non ha le permission de modificar iste pagina JSON perque isto pote affectar tote le visitantes",
+       "sitejsprotected": "Tu non ha le permission de modificar iste pagina JavaScript perque isto pote affectar tote le visitantes",
        "mycustomcssprotected": "Tu non ha le permission de modificar iste pagina de CSS.",
        "mycustomjsonprotected": "Tu non ha le permission de modificar iste pagina JSON.",
        "mycustomjsprotected": "Tu non ha le permission de modificar iste pagina de JavaScript.",
        "ns-specialprotected": "Le paginas special non es modificabile.",
        "titleprotected": "Iste titulo ha essite protegite contra creation per [[User:$1|$1]].\nLe motivo specificate es <em>$2</em>.",
        "filereadonlyerror": "Impossibile modificar le file \"$1\" perque le repositorio de files \"$2\" es in modo de lectura sol.\n\nLe administrator de systema qui lo blocava offereva iste explication: \"$3\".",
+       "invalidtitle": "Titulo invalide",
        "invalidtitle-knownnamespace": "Titulo invalide con spatio de nomines \"$2\" e texto \"$3\"",
        "invalidtitle-unknownnamespace": "Titulo invalide con spatio de nomines incognite $1 e texto \"$2\"",
        "exception-nologin": "Non identificate",
        "diff-paragraph-moved-toold": "Le paragrapho ha essite displaciate. Clicca pro saltar al ancian position.",
        "difference-missing-revision": "{{PLURAL:$2|Un version|$2 versiones}} de iste differentia ($1) non ha essite trovate.\n\nIsto es generalmente causate per sequer un ligamine de diff obsolete a un pagina que ha essite delite.\nDetalios se trova in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de deletiones].",
        "searchresults": "Resultatos del recerca",
+       "search-filter-title-prefix": "Cercar solmente in paginas de que le titulo comencia per \"$1\"",
+       "search-filter-title-prefix-reset": "Cercar in tote le paginas",
        "searchresults-title": "Resultatos del recerca de \"$1\"",
        "titlematches": "Correspondentias in le titulos de paginas",
        "textmatches": "Resultatos in le texto de paginas",
        "group-autoconfirmed": "Usatores autoconfirmate",
        "group-bot": "Bots",
        "group-sysop": "Administratores",
+       "group-interface-admin": "Administratores del interfacie",
        "group-bureaucrat": "Bureaucrates",
        "group-suppress": "Suppressores",
        "group-all": "(totes)",
        "group-autoconfirmed-member": "{{GENDER:$1|usator|usatrice|usator}} autoconfirmate",
        "group-bot-member": "{{GENDER:$1|robot}}",
        "group-sysop-member": "{{GENDER:$1|administrator|administratrice|administrator}}",
+       "group-interface-admin-member": "{{GENDER:$1|administrator|administratrice}} del interfacie",
        "group-bureaucrat-member": "{{GENDER:$1|bureaucrate}}",
        "group-suppress-member": "{{GENDER:$1|suppressor}}",
        "grouppage-user": "{{ns:project}}:Usatores",
        "grouppage-autoconfirmed": "{{ns:project}}:Usatores autoconfirmate",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Administratores",
+       "grouppage-interface-admin": "{{ns:project}}:Administratores del interfacie",
        "grouppage-bureaucrat": "{{ns:project}}:Bureaucrates",
        "grouppage-suppress": "{{ns:project}}:Suppressores",
        "right-read": "Leger paginas",
        "right-editusercss": "Modificar le files CSS de altere usatores",
        "right-edituserjson": "Modificar le files JSON de altere usatores",
        "right-edituserjs": "Modificar le files JS de altere usatores",
+       "right-editsitecss": "Modificar le CSS global del sito",
+       "right-editsitejson": "Modificar le JSON global del sito",
+       "right-editsitejs": "Modificar le JavaScript global del sito",
        "right-editmyusercss": "Modificar le proprie files CSS de usator",
        "right-editmyuserjson": "Modificar le files JSON del proprie usator",
        "right-editmyuserjs": "Modificar le files JavaScript del proprie usator",
        "grant-createaccount": "Crear contos",
        "grant-createeditmovepage": "Crear, modificar e renominar paginas",
        "grant-delete": "Deler paginas, versiones e entratas de registro",
-       "grant-editinterface": "Modificar le spatio de nomines MediaWiki e le CSS/JSON/JavaScript de usatores",
+       "grant-editinterface": "Modificar le spatio de nomines MediaWiki e le JSON del sito e del usatores",
        "grant-editmycssjs": "Modificar le CSS/JSON/JavaScript del proprie usator",
        "grant-editmyoptions": "Modificar tu preferentias de usator",
        "grant-editmywatchlist": "Modificar tu observatorio",
+       "grant-editsiteconfig": "Modificar le CSS/JS del sito e del usatores",
        "grant-editpage": "Modificar paginas existente",
        "grant-editprotected": "Modificar paginas protegite",
        "grant-highvolume": "Modification in massa",
        "uploadstash-zero-length": "Le file ha un grandor de zero.",
        "invalid-chunk-offset": "Position de segmento invalide",
        "img-auth-accessdenied": "Accesso refusate",
-       "img-auth-nopathinfo": "PATH_INFO manca.\nLe servitor non ha essite configurate pro passar iste information.\nIllo pote esser basate super CGI e non pote supportar img_auth.\nVide https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Le information sur le percurso manca.\nLe servitor debe esser configurate pro passar le variabiles REQUEST_URI e/o PATH_INFO.\nSi illo lo es, essaya activar $wgUsePathInfo.\nVide https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Le cammino requestate non es in le directorio de incargamentos configurate.",
        "img-auth-badtitle": "Impossibile construer un titulo valide ex \"$1\".",
        "img-auth-nologinnWL": "Tu non ha aperite un session e \"$1\" non es in le lista blanc.",
        "http-timed-out": "Le requesta HTTP ha expirate.",
        "http-curl-error": "Error al obtener datos del URL: $1",
        "http-bad-status": "Un problema occurreva durante le requesta HTTP: $1 $2",
+       "http-internal-error": "Error interne de HTTP.",
        "upload-curl-error6": "Non poteva acceder al URL",
        "upload-curl-error6-text": "Le adresse URL fornite es inaccessibile.\nPer favor reverifica que le adresse URL sia correcte e que le sito sia in operation.",
        "upload-curl-error28": "Le incargamento se prolongava troppo",
        "speciallogtitlelabel": "Objectivo (titulo o {{ns:user}}:nomine de usator):",
        "log": "Registros",
        "logeventslist-submit": "Monstrar",
-       "logeventslist-more-filters": "Altere filtros:",
+       "logeventslist-more-filters": "Monstrar altere registros:",
        "logeventslist-patrol-log": "Registro de patrulia",
        "logeventslist-tag-log": "Registro de etiquettas",
        "all-logs-page": "Tote le registros public",
        "cachedspecial-refresh-now": "Vider le plus recente.",
        "categories": "Categorias",
        "categories-submit": "Monstrar",
-       "categoriespagetext": "Le sequente {{PLURAL:$1|categoria|categorias}} contine paginas o multimedia.\nLe [[Special:UnusedCategories|categorias non usate]] non se monstra hic.\nVide etiam le [[Special:WantedCategories|categorias desirate]].",
+       "categoriespagetext": "Le sequente {{PLURAL:$1|categoria|categorias}} existe sur iste wiki, e pote esser o non esser usate.\nVide etiam le [[Special:WantedCategories|categorias desirate]].",
        "categoriesfrom": "Monstrar categorias a partir de:",
        "deletedcontributions": "Contributiones delite de usatores",
        "deletedcontributions-title": "Contributiones delite de usatores",
        "edit-error-long": "Errores:\n\n$1",
        "revid": "version $1",
        "pageid": "ID de pagina $1",
+       "interfaceadmin-info": "$1\n\nLe permissiones pro modificar le files CSS/JS/JSON global del sito ha recentemente essite separate ab le derecto <code>editinterface</code>. Si tu non comprende proque tu incontra iste error, vide [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "Etiquettas &lt;html&gt; non pote esser usate foras de paginas normal.",
        "gotointerwiki": "Quitar {{SITENAME}}",
        "gotointerwiki-invalid": "Le titulo specificate non es valide.",
        "passwordpolicies-policy-passwordcannotmatchusername": "Le contrasigno non pote esser identic al nomine de usator",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Le contrasigno non pote corresponder a contrasignos in le lista nigre",
        "passwordpolicies-policy-maximalpasswordlength": "Le contrasigno debe continer minus de $1 {{PLURAL:$1|character|characteres}}",
-       "passwordpolicies-policy-passwordcannotbepopular": "Le contrasigno non pote esser {{PLURAL:$1|le contrasigno le plus popular|in le lista de $1 contrasignos popular}}"
+       "passwordpolicies-policy-passwordcannotbepopular": "Le contrasigno non pote esser {{PLURAL:$1|le contrasigno le plus popular|in le lista de $1 contrasignos popular}}",
+       "easydeflate-invaliddeflate": "Le contento fornite non es correctemente comprimite"
 }
index 51c35c0..700b15b 100644 (file)
        "magiclink-tracking-isbn": "ISBNマジックリンクを使用しているページ",
        "magiclink-tracking-isbn-desc": "このページはISBNマジックリンクを使用しています。移行方法について[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org]を参照してください。",
        "specialloguserlabel": "実行者:",
-       "speciallogtitlelabel": "対象 (ページ名ã\81¾ã\81\9fã\81¯ {{ns:user}}:å\88©ç\94¨è\80\85å\90\8d):",
+       "speciallogtitlelabel": "対象 (ページ名 ã\81¾ã\81\9fã\81¯ã\80\8c{{ns:user}}:å\88©ç\94¨è\80\85å\90\8dã\80\8d):",
        "log": "記録",
        "logeventslist-submit": "表示",
        "logeventslist-more-filters": "付加記録を表示:",
        "special-characters-title-endash": "en ダッシュ",
        "special-characters-title-emdash": "em ダッシュ",
        "special-characters-title-minus": "マイナス記号",
-       "mw-widgets-dateinput-no-date": "日付未選択",
+       "mw-widgets-dateinput-no-date": "日付が選択されていません",
        "mw-widgets-dateinput-placeholder-day": "YYYY-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "YYYY-MM",
        "mw-widgets-mediasearch-input-placeholder": "メディアを検索",
        "mw-widgets-titleinput-description-redirect": "$1 へのリダイレクト",
        "mw-widgets-categoryselector-add-category-placeholder": "カテゴリを追加...",
        "mw-widgets-usersmultiselect-placeholder": "さらに追加",
-       "date-range-from": "開始日:",
-       "date-range-to": "終了日:",
+       "date-range-from": "この日から:",
+       "date-range-to": "この日まで:",
        "sessionmanager-tie": "複数の要求の認証方法を組み合わせることはできません: $1。",
        "sessionprovider-generic": "$1 セッション",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "Cookie ベースのセッション",
        "log-action-filter-contentmodel-new": "標準でないコンテンツ・モデルによるページの作成",
        "log-action-filter-delete-delete": "ページの削除",
        "log-action-filter-delete-delete_redir": "転送の上書き",
-       "log-action-filter-delete-restore": "ã\83\9aã\83¼ã\82¸ã\81®å¾©å¸°",
+       "log-action-filter-delete-restore": "ã\83\9aã\83¼ã\82¸ã\81®å¾©å\85\83",
        "log-action-filter-delete-event": "記録の削除",
        "log-action-filter-delete-revision": "版指定削除",
        "log-action-filter-import-interwiki": "ウィキ間の取り込み",
        "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}}ã\82\92é\9b¢ã\82\8cる",
+       "gotointerwiki": "{{SITENAME}}ã\81\8bã\82\89ä»\96ã\82µã\82¤ã\83\88ã\81¸ç§»å\8b\95ã\81\99る",
        "gotointerwiki-invalid": "指定したページは無効です。",
-       "gotointerwiki-external": "{{SITENAME}}を離れ、別のウェブサイトである[[$2]]を訪れようとしています。\n\n'''[$1 $1に行く]'''",
+       "gotointerwiki-external": "あなたは{{SITENAME}}から別のウェブサイトである[[$2]]へ移動しようとしています。\n\n'''[$1 $1 へ移動する]'''",
        "undelete-cantedit": "このページを編集する許可がないため復元できません。",
        "undelete-cantcreate": "同名のページが存在せず、このページを作成する許可がないため復元できません。",
        "pagedata-title": "ページ・データ",
index b5f743c..753a0a1 100644 (file)
        "ns-specialprotected": "특수 문서는 편집할 수 없습니다.",
        "titleprotected": "[[User:$1|$1]]님이 문서 만들기를 보호했습니다.\n이유는 다음과 같습니다. <em>$2</em>",
        "filereadonlyerror": "\"$2\" 파일 저장소가 읽기 전용이기 때문에 \"$1\" 파일을 바꿀 수 없습니다.\n\n파일 저장소를 잠근 시스템 관리자가 다음과 같은 설명을 남겼습니다: \"$3\".",
+       "invalidtitle": "잘못된 제목",
        "invalidtitle-knownnamespace": "제목 오류: \"$2\" 이름공간과 \"$3\" 텍스트",
        "invalidtitle-unknownnamespace": "제목 오류: 알 수 없는 $1 이름공간 번호와 \"$2\" 텍스트",
        "exception-nologin": "로그인하지 않음",
        "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 b965f81..dd8283b 100644 (file)
        "ns-specialprotected": "Spezialsäite kënnen net verännert ginn.",
        "titleprotected": "Dësen Titel gouf vum [[User:$1|$1]] esou gespaart datt en net kann ugeluecht ginn. De Grond deen ugi gouf ass <em>$2</em>",
        "filereadonlyerror": "De Fichier \"$1\" konnt net geännert ginn well de Repertoire vun de Fichieren \"$2\" nëmme gelies däerf ginn.\n\nDe System-Administrateur deen d'Schreiwe gespaart huet, huet dës Erklärung uginn: \"$3\"",
+       "invalidtitle": "Net valabelen Titel",
        "invalidtitle-knownnamespace": "Net valabelen Titel mam Nummraum \"$2\" a mam Text \"$3\"",
        "invalidtitle-unknownnamespace": "Net valabelen Titel mat der onbekannter Nummraum-Zuel $1 a mam Text \"$2\"",
        "exception-nologin": "Net ageloggt",
index d4c3e75..a693c65 100644 (file)
        "deleteprotected": "अहाँ इ पन्ना नै मेटा सकए छी कियाकि ई सुरक्षण कएल गेल अछि",
        "deleting-backlinks-warning": "<strong>चेतावनी:</strong> जे पृष्ठ अहाँ मेटाबै लेल जा रहल छी ओ  [[Special:WhatLinksHere/{{FULLPAGENAME}}|अन्य पृष्ठसभ]] सँ जुडल अछि अथवा ट्रान्सक्ल्युड करैत अछि।",
        "rollback": "प्रत्यावर्तित सम्पादन",
-       "rollbacklink": "पà¥\8dरतà¥\8dयावरà¥\8dतन",
+       "rollbacklink": "पà¥\82रà¥\8dववतà¥\8d",
        "rollbacklinkcount": "$1 {{PLURAL:$1|सम्पादन}} पूर्ववत करी",
        "rollbacklinkcount-morethan": "$1 सँ अधिक {{PLURAL:$1|सम्पादन}} पूर्ववत करू",
        "rollbackfailed": "प्रत्यावर्तन असफल",
        "movesubpagetext": "नीचां $1 {{PLURAL:$1| पन्ना देखाओल गएल अछि, जे अहि पन्नाकऽ उप पन्ना अछि|पन्ना देखावोल गएल अछि, जे अहि पन्नाकऽ उप पन्ना अछि}}।",
        "movenosubpage": "अहि पन्ना कऽ कोनो उप पन्ना नहि अछि।",
        "movereason": "कारण:",
-       "revertmove": "फà¥\87रसà¤\81 à¤µà¤\8fह",
+       "revertmove": "पà¥\82रà¥\8dववतà¥\8d",
        "delete_and_move_text": "लक्ष्य पृष्ठ \"[[:$1]]\" पहिने सँ अस्तित्वमे अछि।\nअहाँ एकरा स्थानान्तरण करै लेल एकरा मेटाबैलेल चाहै छी?",
        "delete_and_move_confirm": "हँ, पन्ना मेटाउ",
        "delete_and_move_reason": "\"[[$1]]\" सँ घसकेबा लेल जगह बनेबा लेल मेटाएल गेल",
index 0376083..64fbb7c 100644 (file)
        "ns-specialprotected": "Службени страници не може да се уредуваат.",
        "titleprotected": "Овој наслов од страна на [[User:$1|$1]] е заштитен и не може да се создаде.\nПричината за тоа е: <em>$2</em>.",
        "filereadonlyerror": "Не можам да ја изменам податотеката „$1“ бидејќи складиштето „$2“ е во незаписен режим.\n\t\nАдминистраторот што ја заклучи го понуди следново образложение: „''$3''“.",
+       "invalidtitle": "Погрешен наслов",
        "invalidtitle-knownnamespace": "Неважечки наслов со именски простор „$2“ и текст „$3“",
        "invalidtitle-unknownnamespace": "Неважечки наслов со именски простор бр. $1 и текст „$2“",
        "exception-nologin": "Не сте најавени",
index 98ccd14..91c2719 100644 (file)
@@ -5,6 +5,10 @@
                        "Htawmonzel"
                ]
        },
+       "tog-underline": "လေန် မတာပၞောန်သၟဝ်",
+       "tog-hideminor": "ပၞုက် အရာမပလေဝ်ဒါန်လဝ် ကိစ္စဟွံဇၞော် နူကဵု ပြဟ်ဟ်ဏအ်",
+       "tog-hidepatrolled": "ပၞုက် အရာမပလေဝ်ဒါန်လဝ် ကိစ္စဇၞော်ဇၞော် နူကဵု ပြဟ်ဟ်ဏအ်",
+       "tog-hidecategorization": "ပၞုက် အရာမဖျေဟ်ကဏ္ဍ ကုမုက်လိက်",
        "sunday": "တ္ၚဲအဒိုက်",
        "monday": "တ္ၚဲစန်",
        "tuesday": "တ္ၚဲအၚာ",
        "toolbox": "ကြိယာ",
        "otherlanguages": "နကဵု အရေဝ်ဘာသာ တၞဟ်",
        "redirectedfrom": "(ကလေင်ထ္ၜး နူ $1)",
+       "redirectpagesub": "မုက်လိက် ကလေင်ပညုင်",
        "redirectto": "ကလေင်စၞောန်ပညုင်လဝ် နူကဵု-",
        "lastmodifiedat": "မုက်လိက်ဏအ် လက္ကရဴအိုတ် ပလေဝ်ဒါန်လဝ် ပ္ဍဲ $1 ပ္ဍဲ $2",
        "jumpto": "ဒံင် လုပ်",
        "privacypage": "Project:ပဝ်လသဳ အခေါင်ပူဂဵု",
        "retrievedfrom": "ကလေင်သီကေတ်လဝ် နူ \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|မၞး ကလိဂွံ}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|မၞး ကလိဂွံ}} $1 နူ {{PLURAL:$3| မဒှ် ညးလွပ်တၞဟ်မွဲ|$3 ညးလွပ်ဂမၠိုင်}} ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|ပရိုင်မေတ်သုက် တၟိ|999=ပရိုင်မေတ်သုက်တၟိဂမၠိုင်}}",
        "newmessagesdifflinkplural": "လက္ကရဴအိုတ် {{PLURAL:$1|အပြံင်အလှာဲ|999=အပြံင်အလှာဲဂမၠိုင်}}",
        "editsection": "ပလေဝ်ဒါန်",
        "editold": "ပလေဝ်ဒါန်",
+       "viewsourceold": "ထ္ၜး တမ်ရိုဟ်",
        "editlink": "ပလေဝ်ဒါန်",
        "viewsourcelink": "ထ္ၜး တမ်ရိုဟ်",
        "editsectionhint": "ဒၞာဲ မပလေဝ်ဒါန် - $1",
        "showpreview": "ထ္ၜး ကိုပ်ဗဗဵု",
        "showdiff": "ထ္ၜး အရာမပြံင်လှာဲ",
        "anoneditwarning": "<strong>သတိ</strong> မၞး ဟွံဂွံ လုပ်လံက်အေန်လဝ်ရ၊၊ IP address မၞး မံက်ဒၟံင်ရောင် ယဝ်ရ မၞးကၠောန်သ္ပ ပရေင်ပလေဝ်ပလေတ်မွဲမွဲမ္ဂး၊၊ ယဝ်ရ <strong>[$1 လုပ်လံက်အေန်]</strong> ဟွံသေင်မ္ဂး <strong>[$2 ခၞံကၠောန် အကံက်မွဲ]</strong>မ္ဂး၊ ပရေင်ပလေဝ်ဒါန်မၞး တြးပတိတ် နကဵု ယၟုသုင်စောဲ မၞးရောင်၊၊",
+       "blockedtext": "<strong>ယၟုညးလွပ် ဟွံသေင်မ္ဂး ဌာန်ဒၟံင်အာင်ဒဳမၞး ဒးဒုင်ကၟာတ်စဵုဒၞာလဝ်</strong>\n\nပွမကၟာတ်စဵုဒၞာဂှ် ကၠောန်လဝ် နကဵု $1.\nဟိုတ်မဂွံကၟာတ်စဵုဒၞာဂှ် <em>$2</em>.\n\n* အခိင်မစကၟာတ်စဵုဒၞာ- $8\n* အခိင်မကၟာတ်စဵုဒၞာအိုတ်- $6\n* မရန်တၟအ် blockee- $7\n\nမၞး ဆက်ကဵု $1 ဟွံသေင်မ္ဂး ညးတၞဟ်သအာင် [[{{MediaWiki:Grouppage-sysop}}|administrator]] ယဝ်ရ မိက်ဂွံ ပတိုန်ဂလာန် စပ်ကဵု မဒးဒုင်ကၟာတ်စဵုဒၞာဂှ်ဂွံရ၊၊\nမၞး စကာ အဳမေလ် \"{{int:emailuser}}\" ဟွံဂွံရ၊၊ ဆဂး ယဝ်ရ ဌာန်ဒၟံင်အဳမေလ်ဂှ် ဒှ်အရာတၟေင် ပ္ဍဲ [[Special:Preferences|account preferences]] မၞး ကေုာံ မၞးဟွံဒးဒုင် ကၟာတ်စဵုဒၞာလဝ် နကဵုအဳမေဝ်ဂှ်မ္ဂး ဂွံမာန်ရ၊၊\nIP address မၞး လၟုဟ်ဂှ် ဒှ် $3, တုဲ ID မဒးဒုင်ကၟာတ်စဵုဒၞာဂှ် ဒှ် #$5 ရ၊၊ \nယဝ်ရ မၞးမိက်ဂွံ သၟာန်မ္ဂး တင်ဂၞင် ဗွဲလတူတအ် သီုဖအိုတ်ဂှ် ဗၟံက်ထ္ၜးကဵုညိ၊၊",
        "loginreqlink": "လုပ်လံက်အေန်",
        "newarticletext": "မၞး စိုပ်အာ ဇရေင် မုက်လိက်လေန် မဟွံဂွံကၠောန်လဝ်ဏီရ၊၊\nသွက်ဂွံ ခၞံကၠောန် မုက်လိက်ဏအ်ဂှ် ပ္ဍဲခံက်အင် ဗွဲသၟဝ်ဏအ်ဂှ် စတက်စုတ် မလိက်ညိ\n(မိက်ဂွံ ဆက်တီ ပရူဏအ်မ္ဂး ဆက်ကျောဝ် ပ္ဍဲ[$1မုက်လိက်အရီုအဗင်]ညိ)။ ဟိုတ်နူဗၠေတ်တုဲ မၞး စိုပ်ကၠုင် ပ္ဍဲဒၞာဲဏအ်မ္ဂး ဍဵု <strong>back</strong> တုဲ ကလေင်အာ ဒၞာဲတြေံညိ၊၊",
+       "anontalkpagetext": "----\n<em>မုက်လိက်ဏအ်ဂှ် ဒှ်ဒၞာဲ သွက်မၞိဟ် မဟွံဗမံက်ယၟု၊ မၞိဟ်ဟွံဂွံကၠောန်လဝ် အကံက်တအ်ဏီ ဂွံပတိုန်လညာတ် ပါ်ပဲါရ၊၊</em>\nဟိုတ်ဂှ်ရ ပိုယ်ဒးစကာ မဂၞန် IP address သွက်ဂွံ တီညးတအ်ရ၊၊ IP address ဗီုဏအ်မွဲမွဲဂှ် ပါ်ပရအ်ဂွံ ညးလွပ် ဗွဲမဂၠိုင်ရ၊၊ ယဝ်ရ မၞးဂှ် ဒှ်ညးလွပ် မဟွံဗမံက်ယၟုမွဲ စှ်ေစိုတ် တင်ဂလာန်တအ်ဏအ်ဂှ် ဒှ်ဟွံထေက်မ္ဂး ပဂုန်တုဲ [[Special:CreateAccount|ခၞံကၠောန် အကံက်မွဲ]] ဟွံသေင်မ္ဂး [[Special:UserLogin|လုပ်လံက်အေန်]] သွက်ဂွံ ဝေင်ပဲါ ညးလွပ် မဟွံဗမံက်ယၟုတအ်တၞဟ်တအ်ရ၊၊",
        "noarticletext": "ပ္ဍဲမုက်လိက်ဏအ် လိက်ဟွံမွဲဏီရ၊၊\nမၞး ဂၠာဲကေတ်  [[Special:Search/{{PAGENAME}}|search for this page title]] ပ္ဍဲမုက်လိက်တၞဟ်မ္ဂး ကလိဂွံမာန်ရောင်၊၊\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nဟွံသေင်မ္ဂး  [{{fullurl:{{FULLPAGENAME}}|action=edit}} ခၞံကၠောန် လိက်မုက်ဏအ်ညိ၊၊]</span>.",
        "noarticletext-nopermission": "ပ္ဍဲမုက်လိက်ဏအ် လိက်ဟွံမဲဏီရ၊၊ မၞး ဂၠာဲကေတ် [[Special:Search/{{PAGENAME}}|search for this page title]] ပ္ဍဲမုက်လိက်တၞဟ်၊ဟွံသေင်မ္ဂး ကလိဂွံမာန်ရ၊၊ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>, ဆဂး မၞးအခေါင် ခၞံကၠောန် မုက်လိက်ဏအ် ဟွံမဲ၊၊",
        "userpage-userdoesnotexist-view": "အကံက် ညးလွပ် \"$1\" ဂှ် ဟွံဂွံပၠောပ်လဝ် စရင်၊၊",
        "creating": "မခၞံကၠောန်ဒၟံင် $1",
        "editingsection": "ပလေဝ်ဒါန်ဒၟံင် (ဒကုတ်) $1",
        "templatesused": "{{PLURAL:$1|Template|Templates}} မသုင်စောဲ ပ္ဍဲ မုက်လိက်ဏအ်:",
+       "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} မစကာလဝ် ပ္ဍဲကိုပ်ဗဗဵုဏအ်-",
        "template-protected": "(စဵုဒၞာလဝ်)",
        "template-semiprotected": "(မစဵုဒၞာလဝ်-ကဝက်)",
        "hiddencategories": "မုက်လိက်ဏအ်ဂှ် ဒှ်ဂကောံ ကု{{PLURAL:$1|1 hidden category|$1 hidden categories}}:",
        "recreate-moveddeleted-warn": "<strong>သတိ - မုက်လိက် မဒးဒုင်ပလီုလဝ်တုဲ ခြာဟွံလအ်ဂှ် မၞး ကလေင်ခၞံကၠောန်ဒၟံင်ရ၊၊</strong>\nမုက်လိက်ဂှ် မၞးကလေင်ပလေဝ်ဒါန်ကၠောန် ထေက် ဟွံထေက်ဂှ် မၞးထေက် ကဵုဒးဗစာရဏာရ၊၊\n\nသွက်မၞး ဂွံဆဵုကေတ်မာန်ဂှ် တင်စၟတ်သမ္တီ ဒဒှ်မပလီု ကေုာံ မပြံင်ပဆုဲတအ်ဂှ် ထ္ၜးကဵုလဝ် ပ္ဍဲဒၞာဲဏအ်ရ၊၊",
        "moveddeleted-notice": "မုက်လိက်ဏအ် ဒးဒုင် ပလီုထောအ်လဝ်ရ၊၊\nတင်စၟတ်သမ္တီ အရာမပလီု၊ မစဵုဒၞာ၊ မပြံင်လဝ် မုက်လိက်တအ်ဂှ် ဗၟံက်ထ္ၜးလဝ် ဗွဲသၟဝ်ဏအ် သွက်ဂွံနိဿဲ၊၊",
        "content-model-wikitext": "ဖျုန်လိက်ဝဳကဳ",
+       "undo-failure": "ပရေင်ပလေဝ်ဒါန်ဂှ် ပတုဲဟွံဂွံ ဟိုတ်တုန် ဒၟာနူ မၞုံ ကုအခက်အခုဲ ပရေင်ပလေဝ်ဒါန် ဗွဲအပ္ဍဲ၊၊",
        "viewpagelogs": "ဗဵု တင်စၟတ်သမ္တီ မုက်လိက်ဏအ်",
        "currentrev-asof": "မူမဒါန်လဝ် လက္ကရဴအိုတ် နကဵု $1",
        "revisionasof": "မူလိက်မပလေဝ်လဝ် နဒဒှ် $1",
        "searchresults-title": "သွဟ် မဂၠာဲ သွက် \"$1\"",
        "prevn": "ကၠာ {{PLURAL:$1|$1}}",
        "nextn": "ဂတ {{PLURAL:$1|$1}}",
+       "prevn-title": "မတုဲကၠုင် $1 {{PLURAL:$1|သွဟ်|သွဟ်ဂမၠိုင်}}",
        "nextn-title": "ဆက်တုဲ $1 {{PLURAL:$1|သွဟ်|သွဟ်ဂမၠိုင်}}",
        "shown-title": "ထ္ၜး $1 {{PLURAL:$1|သွဟ်|သွဟ်ဂမၠိုဟ်}} နကဵု မုက်လိက်",
        "viewprevnext": "ဗဗဵု ($1 {{int:pipe-separator}} $2) ($3)",
        "search-showingresults": "{{PLURAL:$4|သွဟ် <strong>$1</strong> ကု <strong>$3</strong>|သွဟ်ဂမၠိုင်<strong>$1 – $2</strong> ကု <strong>$3</strong>}}",
        "search-nonefound": "အရာမဂၠာဲသ္ၚေဝ်တအ်ဂှ် ဟွံဂွံဆဵုကေတ်",
        "mypreferences": "မဒးဂၞပ်စိုတ်",
+       "group-bot": "ဗောတ်ဂမၠိုင်",
+       "group-sysop": "မၞိဟ်မကောပ်ကာဲဂမၠိုင်",
+       "grouppage-bot": "{{ns:project}}:ဗောတ်ဂမၠိုင်",
+       "grouppage-sysop": "{{ns:project}}:မၞိဟ်မကောပ်ကာဲဂမၠိုင်",
        "right-writeapi": "အခေါင်အရာ ညးမချူ API",
        "newuserlogpage": "စၟတ်သမ္တီ ညးလွပ် မခၞံကၠောန်လဝ်",
        "rightslog": "တင်စၟတ်သမ္တီ အခေါင်အရာ ညးလွပ်",
        "action-edit": "ပလေဝ်ဒါန် မုက်လိက် ဏအ်",
+       "action-createaccount": "ခၞံကၠောန် အကံက် ညးလွပ်ဏအ်",
        "enhancedrc-history": "လၟေင်မပြံင်လှာဲလဝ်",
        "recentchanges": "မပပြံင်လှာဲ လၟုဟ်",
        "recentchanges-legend": "အရာမရုဲစှ် မပြံင်လှာဲ ပြဟ်ဟ်ဏအ်",
        "rcshowhideanons": "$1 ညးလွပ် ဟွံဗမံက်ယၟု",
        "rcshowhideanons-show": "ထ္ၜး",
        "rcshowhideanons-hide": "ဗဒန်",
+       "rcshowhidepatr": "$1 သွက်ဂွံ ပလေဝ်ဒါန်မင်မဲ",
        "rcshowhidemine": "$1 ပလေဝ်ဒါန်လဝ် နကဵုအဲ",
        "rcshowhidemine-show": "ထ္ၜး",
        "rcshowhidemine-hide": "ဗဒန်",
        "newpageletter": "N",
        "boteditletter": "b",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ကြဴနူ ပြံင်ထောအ်တုဲ",
+       "rc-old-title": "တမ်မူလဂှ် ခၞံကၠောန်လဝ် နကဵုယၟု \"$1\"",
        "recentchangeslinked": "အရာမဆက်စပ် ကု အပြံင်အလှာဲ",
        "recentchangeslinked-feed": "တြးပတိတ် အပြံင်အလှာဲ",
        "recentchangeslinked-toolbox": "တြးပတိတ် အပြံင်အလှာဲ",
        "license": "မစၟတ်သမ္တီလာင်ဇြေန်-",
        "license-header": "မသ္ဂုတ်သွာတ်လာင်ဇြေန်",
        "imgfile": "ဝှာင်",
+       "listfiles": "စရင်ဝှာင်",
        "file-anchor-link": "ဝှာင်",
        "filehist": "ဝှာင် လၟေင်အပြံင်အလှာဲ",
        "filehist-help": "ဍဵု လတူ စၟတ်တ္ၚဲ/အခိင် မွဲမွဲ သွက်ဂွံ ထ္ၜးကဵု ဝှာင် မကတဵုဒှ်လဝ် ပ္ဍဲအခိင်ဂှ်၊၊",
+       "filehist-revert": "ကလေင်ပြံင်",
        "filehist-current": "လၟုဟ်",
        "filehist-datetime": "စၟတ်တ္ၚဲ/အခိင်",
-       "filehist-thumb": "á\80\9eá\81\9eá\80±á\80\99á\80ºá\81\9dá\80±á\80¬á\80¡á\80ºá\80\90á\80²",
+       "filehist-thumb": "á\80\97á\80®á\80¯á\80\95á\80¼á\80\84á\80ºá\80\94á\80\99á\80°á\80\94á\80¬",
        "filehist-thumbtext": "ဍဵုသၞေမ်ၝောအ်တဲ သွက်မူလိက် နကဵု $1",
+       "filehist-nothumb": "ဗီုပြင်နမူနာ ဟွံမဲ",
        "filehist-user": "ညးလွပ်",
        "filehist-dimensions": "ပမာဏ",
        "filehist-comment": "တင်ပသောင်ကလး",
        "imagelinks": "ဝှာင် ဗီုဂွံစကာ",
        "linkstoimage": "အရာမဆက်ဗက်ကၠုင် {{PLURAL:$1|page links|$1 pages link}} ကုဝှာင်ဏအ် ဂမၠိုင်ဂှ် -",
+       "linkstoimage-more": "ဂၠိုင် နူ $1 {{PLURAL:$1|မုက်လိက် မဆက်စပ်|မုက်လိက် အဆက်စပ်ဂမၠိုင်}} ကုဝှာင်ဏအ်၊၊\nစရင်သၟဝ်ဏအ် ထ္ၜး{{PLURAL:$1|မုက်လိက် အဆက်စပ် ပထမ|ကၠာအိုတ် $1 မုက်လိက် အဆက်စပ်ဂမၠိုင်}} ကု ဝှာင်ဏအ်ဟေင်၊၊\nA [[Special:WhatLinksHere/$2|စရင် သီုဖအိုတ်လေဝ်]] ကလိဂွံမာန်ရ၊၊",
        "nolinkstoimage": "မုက်လိက် မဆက်စပ် ကု ဝှာင်ဏအ် ဟွံဂွံဆဵုကေတ်ရ၊၊",
+       "linkstoimage-redirect": "$1 (ဝှာင် ကလေင်ပညုင်) $2",
        "sharedupload-desc-here": "ဝှာင်ဏအ် ဒှ်ဝှာင် နူကဵု $1 တုဲ မဒှ်ဝှာင် မသုင်စောဲလဝ် နကဵုပရဝ်ဂျေတ် တၞဟ်လေဝ် ဒှ်မာန်ရ၊၊\nအရာမလဴထ္ၜး ပ္ဍဲဝှာင်တအ်ဂှ် [$2 မုက်လိက် မလဴထ္ၜး ဝှာင်] ထ္ၜးကဵုလဝ် အတိုင်ဗွဲသၟဝ်ဝွံရ၊၊",
        "filepage-nofile": "ဝှာင် နကဵု ယၟုဏအ် ဟွံမွဲ၊၊",
        "upload-disallowed-here": "မၞး ထပ်ချူစုတ် ပ္ဍဲ ဝှာင်ဏအ် ဟွံဂွံ၊၊",
        "randompage": "မုက်လိက် ဇဟောမ်",
+       "statistics": "စရင်အင်",
        "double-redirect-fixer": "ညးမပလေဝ် အရာမကလေင်စၞောန်ပညုင်",
        "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
        "nmembers": "$1 {{PLURAL:$1|ကောန်ဂကောံ|ကောန်ဂကောံဂမၠိုင်}}",
        "prefixindex": "မုက်လိက် သီုဖအိုတ် နကဵု prefix",
+       "listusers": "စရင် ညးလွပ်",
        "newpages": "မုက်လိက် တၟိ",
        "move": "ပြံင်ပဆုဲ",
        "pager-newer-n": "{{PLURAL:$1|တၟိနူ 1|တၟိနူ $1}}",
        "speciallogtitlelabel": "တင်မရန်တၟအ် (က္ဍိုပ်လိက် ဟွံသေင်မ္ဂး {{ns:user}}:ယၟုညးလွပ် သွက် ညးလွပ်):",
        "log": "လံက်",
        "all-logs-page": "တင်စၟတ်သမ္တီ မပတိတ်တြး သီုဖအိုတ်",
+       "alllogstext": "{{SITENAME}}ဏအ်ဂှ် ဒှ်တင်သမ္တီ မပံင်ပ္ကောံလဝ် ၜိုတ်မကလိဂွံမာန်ရ၊၊\nနကဵု မရုဲစှ် ဂကူစၟတ်သမ္တီ၊ ယၟုညးလွပ် ဟွံသေင်မ္ဂး မုက်လိက် မစိုပ်တရဴတအ်တုဲ မၞးဖ္ဍန်ဖျေဟ် အရာမထ္ၜးတအ်မာန်ရ၊၊",
+       "logempty": "အရာမကိတ်ညဳ ပ္ဍဲ တင်စၟတ်သမ္တီ ဟွံမဲ၊၊",
        "allpages": "မုက်လိက် သီုဖအိုတ်",
        "allarticles": "မုက်လိက် သီုဖအိုတ်",
        "allpagessubmit": "အာ",
+       "allpages-hide-redirects": "ပၞုက် အရာမကလေင်ပညုင်ဂမၠိုင်ညိ",
        "categories": "ကဏ္ဍဂမၠိုင်",
        "listgrouprights-members": "(စရင် ကောန်ဂကောံ)",
+       "emailuser": "ပလံင် အဳမေလ် ကုညးလွပ်ဏအ်",
        "usermessage-editor": "သၞောတ် ပရိုင်မေတ်သေန်ဂျာ",
-       "watchlist": "á\80\85á\80\9bá\80\84á\80ºá\80\99á\80\99á\80\84á\80ºá\80\97á\80µá\80¯",
+       "watchlist": "á\80\85á\80\9bá\80\84á\80ºá\80\99á\80\99á\80\84á\80ºá\80\99á\80²",
        "mywatchlist": "စရင်မမင်မဲ",
+       "watchlistfor2": "သွက် $1 $2",
        "watch": "မင်မဲ",
        "unwatch": "ဟွံမင်မဲ",
+       "watchlist-details": "{{PLURAL:$1|$1 မုက်လိက်ဂှ် နွံ|$1 မုက်လိက်တအ်ဂှ် နွံ}} ပ္ဍဲ စရင်မမင်မဲ မၞး (သီုကဵု မုက်လိက် ဓရီုကျာဂမၠိုင်).",
+       "wlheader-showupdated": "မုက်လိက် မပြံင်လှာဲလဝ် ကြဴနူ မၞးမလုပ်ဝေင်လဝ်တုဲတအ်ဂှ် ထ္ၜးလဝ် နကဵု <strong>အက္ခရ်တီုတီု</strong>.",
+       "wlnote": "ဗွဲသၟဝ်ဝွံ {{PLURAL:$1|ဒှ် အရာ မပြံင်လှာဲလဝ် လက္ကရဴအိုတ်ရ၊၊| ဒှ် အရာ မပြံင်လှာဲလဝ် လက္ကရဴအိုတ်ဂမၠိုင်ရ၊၊ <strong>$1</strong> အပြံင်အလှာဲ}} ပ္ဍဲအခိင် မအောန် နူ {{PLURAL:$2|နာဍဳ|<strong>$2</strong> နာဍဳ}}, ကု $3, $4.",
+       "wlshowlast": "လက္ကရဴအိုတ် $1 နာဍဳ $2 တ္ၚဲ ဂှ် ထ္ၜးညိ",
+       "watchlist-options": "အရာမရုဲစှ် သွက် စရင်မမင်မဲ",
+       "enotif_reset": "ကဵုစၟတ် ကုမုက်လိက် မဗဵုစိုပ်လဝ်တုဲ သီုဖအိုတ်",
        "dellogpage": "တင်စၟတ်သမ္တီ အရာမဇိုတ်ပလီုလဝ်",
        "rollbacklink": "ကလေင်",
        "rollbacklinkcount": "ကလေင်အာ $1 {{PLURAL:$1|ပလေဝ်ဒါန်|ပလေဝ်ဒါန်ဂမၠိုင်}}",
        "protectlogpage": "တင်စၟတ်သမ္တီ အရာမစဵုဒၞာဂမၠိုင်",
        "protectedarticle": "မစဵုဒၞာလဝ် \"[[$1]]\"",
+       "modifiedarticleprotection": "ပြံင်လှာဲ ကဆံင်မစဵုဒၞာ သွက် မုက်လိက် \"[[$1]]\"",
        "protect-default": "ကဵုအခေါင် ညးလွပ် သီုဖအိုတ်",
        "restriction-edit": "ပလေဝ်ဒါန်",
        "restriction-move": "ပြံင်ပဆုဲ",
        "tooltip-namespace_association": "Check this box to also include the talk or subject namespace associated with the selected namespace",
        "blanknamespace": "(တမ်)",
        "contributions": "{{GENDER:$1|User}} ပတိတ်တြး",
-       "contributions-title": "á\80¡á\80\9bá\80¬á\80\99á\80\80á\81 á\80±á\80¬á\80\94á\80ºá\80\97á\80\92á\80¾á\80º á\80\8aá\80¸á\80\99á\80\9eá\80¯á\80\84á\80ºá\80\85á\80±á\80¬á\80² သွက် $1",
+       "contributions-title": "á\80¡á\80\9bá\80¬á\80\99á\80\80á\81 á\80±á\80¬á\80\94á\80ºá\80\97á\80\92á\80¾á\80º á\80\8aá\80¸á\80\9cá\80½á\80\95á\80º သွက် $1",
        "mycontris": "အရာမကၠောန်လဝ်ဂမၠိုင်",
        "anoncontribs": "အရာမကၠောန်လဝ်ဂမၠိုင်",
        "contribsub2": "သွက် {{GENDER:$3|$1}} ($2)",
+       "nocontribs": "အရာမပလေဝ်ဒါန် မကိတ်ညဳ ကုတင်ဂၞင်တအ်ဂှ် ဟွံဂွံဆဵုကေတ်၊၊",
        "uctop": "(လၟုဟ်)",
        "month": "နူ ဂိတု (ကေုာံ ပြဟ်နူ)",
        "year": "နူ သၞာံ (ကေုာံ ပြဟ်နူ):",
        "whatlinkshere-hideredirs": "$1 ကလေင်ထ္ၜး",
        "whatlinkshere-hidetrans": "$1 အရာမထပ်ဗပေင်ပၠောပ်လဝ်",
        "whatlinkshere-hidelinks": "$1 လေန်",
+       "whatlinkshere-hideimages": "$1 ဝှာင်အဆက်အစပ်",
        "whatlinkshere-filters": "ဖဍိုဟ်",
        "ipboptions": "၂ နာဍဳ:2 hours,၁ တ္ၚဲ:1 day,၃တ္ၚဲ:3 days,၁ သတ္တဟ:1 week,၂သတ္တဟ:2 weeks,၁ ဂိတု:1 month,၃ ဂိတု:3 months,၆ ဂိတု:6 months,၁ သၞာံ:1 year,ဟွံချိုတ်ပၠိုတ်:infinite",
+       "infiniteblock": "မဟွံမဲကုအပိုင်အခြာ",
        "blocklink": "ကၟာတ်ဗလံက်",
        "contribslink": "တြးပတိတ်",
        "blocklogpage": "စၟတ်သမ္တီ အရာမကၟာတ်ဗလံက်လဝ်",
        "blocklogentry": "ကၟာတ်ဗလံက်လဝ် [[$1]] နကဵု အပိုင်အခြာအခိင်  $2 ဟိုတ်နူ $3",
+       "reblock-logentry": "ဒဒှ်မကၟာတ်လဒဵု ညးလွပ်  [[$1]] ဂှ် ပြံင်လှာဲလဝ် နကဵု တ္ၚဲလက္ကရဴအိုတ် $2 $3",
+       "block-log-flags-nocreate": "ပွမခၞံကၠောန် အကံက်ဂှ် ဟွံသၟဟ်ရထ",
        "proxyblocker": "ညးမကၟာတ်စဵု proxy",
        "movelogpage": "ပြံင်ပဆုဲ တင်စၟတ်သမ္တီ",
        "export": "ပတိတ်တြး မုက်လိက်တအ်",
        "tooltip-ca-addsection": "စ ဒကုတ် တၟိမွဲ",
        "tooltip-ca-viewsource": "မုက်လိက်ဏအ် စဵုဒၞာလဝ်၊၊\nမၞး ဗဵု တမ်ရိုဟ်ဍေဟ် ဂွံ",
        "tooltip-ca-history": "အရာမပလေဝ်ဒါန်ကၠုင် မုက်လိက်ဏအ်",
+       "tooltip-ca-protect": "စဵုဒၞာ မုက်လိက်ဏအ်",
+       "tooltip-ca-delete": "ပလီု မုက်လိက်ဏအ်",
        "tooltip-ca-move": "ပြံင်ပဆုဲ မုက်လိက်ဏအ်",
-       "tooltip-ca-watch": "á\80\85á\80¯á\80\90á\80º á\80\99á\80¯á\80\80á\80ºá\80\9cá\80­á\80\80á\80ºá\80\8fá\80¡á\80º á\80\95á\80¹á\80\8dá\80²á\80\85á\80\9bá\80\84á\80ºá\80\97á\80\97á\80µá\80¯မၞး",
-       "tooltip-ca-unwatch": "á\80\95á\80\90á\80­á\80\90á\80ºá\80\91á\80±á\80¬á\80¡á\80º á\80\99á\80¯á\80\80á\80ºá\80\9cá\80­á\80\80á\80ºá\80\8fá\80¡á\80º á\80\95á\80¹á\80\8dá\80²á\80\85á\80\9bá\80\84á\80ºá\80\99á\81\9eá\80¸á\80\99á\80\99á\80\84á\80ºá\80\99á\80²",
+       "tooltip-ca-watch": "á\80\85á\80¯á\80\90á\80º á\80\99á\80¯á\80\80á\80ºá\80\9cá\80­á\80\80á\80ºá\80\8fá\80¡á\80º á\80\95á\80¹á\80\8dá\80²á\80\85á\80\9bá\80\84á\80ºá\80\99á\80\99á\80\84á\80ºá\80\99á\80²မၞး",
+       "tooltip-ca-unwatch": "á\80\95á\80\90á\80­á\80\90á\80ºá\80\91á\80±á\80¬á\80¡á\80º á\80\99á\80¯á\80\80á\80ºá\80\9cá\80­á\80\80á\80ºá\80\8fá\80¡á\80º á\80\95á\80¹á\80\8dá\80²á\80\85á\80\9bá\80\84á\80ºá\80\99á\80\99á\80\84á\80ºá\80\99á\80²á\80\99á\81\9eá\80¸",
        "tooltip-search": "ဂၠာဲ {{SITENAME}}",
        "tooltip-search-go": "အတိုင်ယၟုဏအ် ယဝ်ရ နွံမ္ဂး အာ ဇရေင် မုက်လိက်ဂှ်",
        "tooltip-search-fulltext": "ဂၠာဲ ပ္ဍဲမုက်လိက် နကဵု လိက်ဏအ်",
        "tooltip-t-recentchangeslinked": "မပြံင်လှာဲ လၟုဟ် ပ္ဍဲမုက်လိက်ဏအ်ဂှ် ဆက်စပ်ဒၟံင် ကုမုက်လိက်ဏအ်",
        "tooltip-feed-atom": "ဒၞာဲဗလးပတိတ် မုက်လိက်ဏအ်",
        "tooltip-t-contributions": "စရင် မကၠောန်လဝ် နကဵု {{GENDER:$1|ညးလွပ်ဏအ်}}",
+       "tooltip-t-emailuser": "ပလံင် အဳမေလ် ကု {{GENDER:$1|မဒှ် ညးလွပ်ဏအ်}}",
        "tooltip-t-upload": "ပတိုန်ပၠောပ် ဝှာင်",
        "tooltip-t-specialpages": "စရင် မုက်လိက် တၟေင် သီုဖအိုတ်",
        "tooltip-t-print": "မူမုက်လိက် မပြေန်ပ္တိတ်ဂွံ",
        "tooltip-preview": "ကိုပ်ဗဗဵု အရာမၞး မပြံင်လှာဲလဝ်၊၊ ပဂုန်တုဲ ကၠာဟွံဂွံဂိုင်သိပ်ဂှ် ကၠောန်ကၠာညိ၊၊",
        "tooltip-diff": "ထ္ၜး ဒၞာဲ မလိက် မၞးမပြံင်လှာဲလဝ်ဂှ်ညိ",
        "tooltip-compareselectedversions": "ရံင် ဗီုတၞဟ်ခြာ အကြာ မူမပလေဝ်ဒါန်လဝ် ပ္ဍဲမုက်လိက်ဏအ် ဒၞာဲမရုဲစှ်လဝ် ၜါဂှ်",
-       "tooltip-watch": "á\80\85á\80¯á\80\90á\80º á\80\99á\80¯á\80\80á\80ºá\80\9cá\80­á\80\80á\80ºá\80\8fá\80¡á\80º á\80\95á\80¹á\80\8dá\80²á\80\85á\80\9bá\80\84á\80ºá\80\99á\81\9eá\80¸á\80\99á\80\99á\80\84á\80ºá\80\9eá\80¹á\81\9aá\80±á\80\9dá\80ºá\80\99á\80²",
+       "tooltip-watch": "á\80\85á\80¯á\80\90á\80º á\80\99á\80¯á\80\80á\80ºá\80\9cá\80­á\80\80á\80ºá\80\8fá\80¡á\80º á\80\95á\80¹á\80\8dá\80²á\80\85á\80\9bá\80\84á\80ºá\80\99á\80\99á\80\84á\80ºá\80\99á\80² á\80\99á\81\9eá\80¸",
        "tooltip-rollback": "\"Rollback\" reverts the last contributor's edit(s) to this page in one click",
        "tooltip-undo": "\"ဟွံကၠောန်\" ဂှ် ဒှ်အရာ မဟွံကၠောန်တုဲ ကလေင်အာ ဗီုအတိုင်တြေံ ကၠာဟွံဂွံစ ပလေဝ်လဝ်ဂှ်ရ၊၊ မုဟိုတ် ကလေင်အာ အတိုင်ဗီုတြေံပၠန်ဂှ် ချူစၟတ်သမ္တီ သကေံ မာန်ရ၊၊",
        "tooltip-summary": "စုတ် သကေမ် summary ဇမၠေအ်",
        "pageinfo-header-restrictions": "ပရေင်စဵုဒၞာ မုက်လိက်",
        "pageinfo-header-properties": "ဒြပ်ရတ် မုက်လိက်",
        "pageinfo-display-title": "က္ဍိုပ်ပရိုင် မထ္ၜးပျး",
+       "pageinfo-default-sort": "ရုဲစှ် ဂကူအဓိကတင်ဂၞင်",
        "pageinfo-length": "ဇမၠိင် မုက်လိက် (နကဵု ဘာက်)",
        "pageinfo-article-id": "မုက်လိက် ID",
        "pageinfo-language": "မုက်လိက် အရေဝ်ဘာသာ ဖျုန်လိက်",
        "pageinfo-content-model": "မုက်လိက် မဝ်ဒေလ် မာတိက",
        "pageinfo-robot-policy": "ကၠောန်မာတိကာ index နကဵု စက်ရဝ်ဗတ်",
        "pageinfo-robot-index": "မသၠးကဵုလဝ်အခေါင်",
+       "pageinfo-robot-noindex": "ဟွံကဵုလဝ်အခေါင်",
        "pageinfo-watchers": "လၟိဟ် ပၟင်ပၟဲ မုက်လိက်",
        "pageinfo-few-watchers": "အောန်နူ $1 {{PLURAL:$1|ပၟင်ပၟဲ|ပၟင်ပၟဲဂမၠိုင်}}",
        "pageinfo-redirects-name": "လၟိဟ် မကလေင်ပညုင် ကုမုက်လိက်ဏအ်",
+       "pageinfo-subpages-name": "လၟိဟ် မုက်လိက်လစှ်ေ ဒဒက်တဴ ကုမုက်လိက်ဏအ်",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|အရာမကလေင်ပညုင်|အရာမကလေင်ပညုင်ဂမၠိုင်}}; $3 {{PLURAL:$3|ဟွံမဲ-အရာမကလေင်ပညုင်|ဟွံမဲ-အရာမကလေင်ပညုင်ဂမၠိုင်}})",
        "pageinfo-firstuser": "ညးမခၞံဗဒှ် မုက်လိက်",
        "pageinfo-firsttime": "စၟတ်တ္ၚဲ မခၞံဗဒှ်လဝ် မုက်လိက်",
        "pageinfo-lastuser": "မပလေဝ်ဒါန်လဝ် လက္ကရဴအိုတ်",
        "pageinfo-authors": "လၟိဟ် အစာချူလိက် သီုဖအိုတ်",
        "pageinfo-recent-edits": "လၟိဟ် အရာမပလေဝ်ဒါန်လဝ် ပြဟ်ဟ်ဏအ် (အပ္ဍဲ $1)",
        "pageinfo-recent-authors": "လၟိဟ် အစာချူလိက် ပြဟ်ဟ်ဏအ်",
+       "pageinfo-magic-words": "မှဝ် {{PLURAL:$1|မလိက်|မလိက်ဂမၠိုင်}} ($1)",
+       "pageinfo-hidden-categories": "ပၞုက် {{PLURAL:$1|ကဏ္ဍ|ကဏ္ဍဂမၠိုင်}} ($1)",
        "pageinfo-templates": "မကၠောန် Transcluded လဝ် {{PLURAL:$1|template|templates}} ($1)",
        "pageinfo-toolboxlink": "မုက်လိက် ပရိုင်တင်ဂၞင်",
        "pageinfo-contentpage": "ရိုဟ်လၟိဟ် နဒဒှ် မုက်လိက် မာတိကာ",
        "patrol-log-page": "တင်စၟတ်သမ္တီ အရာမစဳစောတ်ကောပ်ကာဲ",
        "previousdiff": "← အရာမပလေဝ်ဒါန်လဝ် တြေံ",
        "nextdiff": "မပလေဝ်ဒါန်လဝ် တၟိနူဂှ် →",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|မုက်လိက်|မုက်လိက်ဂမၠိုင်}}",
        "file-info-size": "$1 × $2 pixels, file size: $3, MIME type: $4",
+       "file-info-size-pages": "$1 × $2 pixels, ဇမၞော် ဝှာင်: $3, MIME ဂကူ: $4, $5 {{PLURAL:$5|မုက်လိက်|မုက်လိက်ဂမၠိုင်}}",
        "file-nohires": "resolution ခိုဟ် နူဏအ် ဟွံဂွံဆဵုရ၊၊",
        "svg-long-desc": "SVG ဝှာင်, မိက်ကဵုကသပ် $1 × $2 pixels, ဇမၞော် ဝှာင်: $3",
        "show-big-image": "ဝှာင် တမ်မူလ",
        "exif-orientation-1": "ဓမ္မတာ",
        "namespacesall": "သီုဖအိုတ်",
        "monthsall": "သီုဖအိုတ်",
+       "imgmultipagenext": "မုက်လိက်ဂတ →",
+       "imgmultigo": "အာ!",
+       "imgmultigoto": "အာ ဇရေင် မုက်လိက် $1",
+       "watchlisttools-clear": "ဖအး စရင်မမင်မွဲဂှ်",
+       "watchlisttools-view": "ဗဵု အရာမပြံင်လှာဲထေက်တအ်",
+       "watchlisttools-edit": "ဗဵု ကေုာံ ပလေဝ် စရင်မမင်မဲ",
+       "watchlisttools-raw": "ပလေဝ် စရင်မမင်မဲ အပြောမ်",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ဓရီု]])",
        "redirect": "ကလေင်စၞောန်ပညုင်လဝ် နကဵု ဝှာင်၊ ညးလွပ်၊ မုက်လိက်၊ မူမပလေဝ်ဒန်လဝ် ဟွံသေင်မ္ဂး အာင်ဒဳ",
        "redirect-summary": "မုက်လိက်တၟေင်ဏအ် ကလေင်စၞောန် ကဵု ဝှာင်(မကဵုလဝ်ယၟု), မုက်လိက်မွဲ (given a revision ID or page ID), မုက်လိက် ညးမသုင်စောဲမွဲ (given a numeric user ID), ဟွံသေင်မ္ဂး တင်စၟတ်သမ္တီမွဲ (given the log ID). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].",
        "specialpages": "မုက်လိက် တၟေင်",
        "tag-filter": "[[Special:Tags|Tag]] ဝှာင်ဂမၠိုင်:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
+       "tags-active-yes": "ယွံ",
+       "tags-active-no": "ဟအှ်ေ",
        "tags-hitcount": "$1 {{PLURAL:$1|ပြံင်လှာဲ|ပြံင်လှာဲဂမၠိုင်}}",
        "logentry-delete-delete": "$3 မုက်လိက်ဂှ် $1 {{GENDER:$2|ပလီုထောအ်လဝ်ရ}}",
+       "logentry-delete-restore": "$1 {{GENDER:$2|ကလေင်ပ္တန်}} မုက်လိက် $3 ($4)",
        "logentry-delete-revision": "ပ္ဍဲမုက်လိက် $3: $4 ဂှ် $1 {{GENDER:$2|ပြံင်လှာဲလဝ်}} ဗီုပြင် မုက်လိက် {{PLURAL:$5|မူလိက်မဒါန်လဝ် မွဲ|$5 မူလိက်မဒါန်လဝ်ဂမၠိုင်}}",
        "revdelete-content-hid": "ဒဒှ် မပၞုက် ပရူပရာ",
        "logentry-move-move": "$1 {{GENDER:$2|ပြံင်ပဆုဲလဝ်}} မုက်လိက် $3 ဇရေင် $4",
        "logentry-newusers-create": "အကံက် ညးလွပ် $1 ဂှ် {{GENDER:$2|ခၞံကၠောန်လဝ်}}",
        "logentry-newusers-autocreate": "အကံက် ညးလွပ် $1 ဂှ် {{GENDER:$2|ခၞံကၠောန်လဝ်}} အလဵုအလဵုရ၊၊",
        "logentry-upload-upload": "$1  {{GENDER:$2|ပတိုန်ပၠောပ်လဝ်}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|ပလံင်ပၠောပ်လဝ်}} မူလိက် $3ဏအ် တၟိမွဲ",
        "searchsuggest-search": "ဂၠာဲ {{SITENAME}}",
        "duration-days": "$1 {{PLURAL:$1|တ္ၚဲ|တ္ၚဲဂမၠိုင်}}",
        "randomrootpage": "တမ် မုက်လိက် ဇဟောမ်"
index 57e3609..7b5d04b 100644 (file)
        "group-autoconfirmed": "स्वयंशाबीत सदस्य",
        "group-bot": "सांगकामे",
        "group-sysop": "प्रचालक",
+       "group-interface-admin": "तांत्रिक प्रचालक",
        "group-bureaucrat": "स्विकृती अधिकारी",
        "group-suppress": "झापडबंद",
        "group-all": "(सर्व)",
        "grant-createaccount": "खाते तयार करा",
        "grant-createeditmovepage": "पाने बनवा,संपादा व स्थानांतरण करा",
        "grant-delete": "पाने, आवृत्त्या व नोंदी वगळा",
-       "grant-editinterface": "मिडियाविà¤\95ि à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dव à¤µ à¤¸à¤¦à¤¸à¥\8dयाà¤\82à¤\9aà¥\80 CSS/JS संपादा",
+       "grant-editinterface": "मिडियाविà¤\95ि à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dव à¤µ à¤¸à¤\82à¤\95à¥\87तसà¥\8dथळावरà¤\9aà¥\80/सदसà¥\8dयाà¤\82à¤\9aà¥\80JS संपादा",
        "grant-editmycssjs": "आपली सदस्य CSS/JavaScript संपादित करा",
        "grant-editmyoptions": "आपला सदस्य पसंतीक्रम संपादा",
        "grant-editmywatchlist": "आपली निरीक्षणयादी संपादित करा",
        "protectedtitles-submit": "शीर्षके दर्शवा",
        "listusers": "सदस्यांची यादी",
        "listusers-editsonly": "फक्त संपादनांसहित सदस्य दाखवा",
+       "listusers-temporarygroupsonly": "फक्त तात्पुरत्या सदस्यगटात असणारे सदस्यच दाखवा",
        "listusers-creationsort": "निर्मितीच्या तारखेप्रमाणे लावा",
        "listusers-desc": "उतरत्या क्रमाने निवडा",
        "usereditcount": "$1 {{PLURAL:$1|संपादन|संपादने}}",
index 59671f1..15ffecc 100644 (file)
        "period-pm": "ညနေ",
        "pagecategories": "{{PLURAL:$1|ကဏ္ဍ|ကဏ္ဍများ}}",
        "category_header": "ကဏ္ဍ \"$1\" မှ စာမျက်နှာများ",
-       "subcategories": "ကဏ္ဍခွဲ",
+       "subcategories": "ကဏ္ဍခွဲများ",
        "category-media-header": "ကဏ္ဍ \"$1\" မှ မီဒီယာ",
        "category-empty": "<em>ဤကဏ္ဍသည် လက်ရှိတွင် စာမျက်နှာများ သို့မဟုတ် မီဒီယာများ မရှိပါ။</em>",
        "hidden-categories": "{{PLURAL:$1|ဝှက်ထားသော ကဏ္ဍ|ဝှက်ထားသော ကဏ္ဍများ}}",
        "noindex-category": "အက္ခရာမစဉ်ထားသော စာမျက်နှာများ",
        "broken-file-category": "ကျိုးပျက်နေသော ဖိုင်လင့်များပါသည့် စာမျက်နှာများ",
        "about": "အကြောင်း",
-       "article": "စာမျက်နှာ",
+       "article": "á\80\99á\80¬á\80\90á\80­á\80\80á\80¬á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬",
        "newwindow": "(ဝင်းဒိုးအသစ်တစ်ခုတွင် ဖွင့်ရန်)",
        "cancel": "မ​လုပ်​တော့​",
        "moredotdotdot": "နောက်ထပ်...",
        "history_short": "ရာဇဝင်",
        "history_small": "ရာဇဝင်",
        "updatedmarker": "နောက်ဆုံးကြည့်ပြီးသည့်နောက်ပိုင်း တည်းဖြတ်ထားသည်။",
-       "printableversion": "á\80\95á\80\9bá\80\84á\80·á\80ºá\80\91á\80¯á\80\90á\80ºá\80\9bá\80\94á\80º",
+       "printableversion": "á\80\95á\80\9bá\80\84á\80·á\80ºá\80\91á\80¯á\80\90á\80ºá\80\94á\80­á\80¯á\80\84á\80ºá\80\9eá\80±á\80¬ á\80\97á\80¬á\80¸á\80\9bá\80¾á\80\84á\80ºá\80¸",
        "permalink": "ပုံ​သေ​လိပ်​စာ​",
        "print": "ပရင့်",
        "view": "ကြည့်ရန်",
        "viewsourcetext": "ဤစာမျက်နှာ၏ ရင်းမြစ်ကို ကြည့်ရှု၍ ကူးယူနိုင်သည်။",
        "viewyourtext": "ဤစာမျက်နှာရှိ <strong>သင့်တည်းဖြတ်မှုများ</strong>၏ ရင်းမြစ်ကို ကြည့်ရှုပြီး ကူးယူနိုင်သည်။",
        "editinginterface": "<strong>သတိပေးချက်။</strong> သင်သည် ဆော့ဖ်ဝဲလ်၏ အသွင်အပြင်စာသားများကို အထောက်အကူပြုရာတွင် သုံးသော စာမျက်နှာအား တည်းဖြတ်နေသည်။\nဤစာမျက်နှာတွင် ပြောင်းလဲမှုများသည် ဤဝီကီရှိ အခြားအသုံးပြုသူများ၏ အသုံးပြုသူ အသွင်အပြင်များအပေါ် အကျိုးသက်ရောက်ပါလိမ့်မည်။",
+       "translateinterface": "ဝီကီများအားလုံးအတွက် ဘာသာပြန်များကို ပေါင်းထည့်၊ ပြင်ဆင်ရန်အတွက် မီဒီယာဝီကီ၏ ဒေသတွင်းပြုမှု ပရောဂျက် [https://translatewiki.net/ translatewiki.net] ကို အသုံးပြုပါ။",
        "namespaceprotected": "'''$1''' စာညွှန်းဖြင့် စာမျက်နှာကို တည်းဖြတ်ရန် ခွင့်ပြုချက် မရှိပါ။",
        "mycustomcssprotected": "ဤ CSS စာမျက်နှာကို သင်တည်းဖြတ်ပြင်ဆင်ခွင့် မရှိပါ။",
        "mycustomjsprotected": "ဤ JavaScript စာမျက်နှာကို သင်တည်းဖြတ်ပြင်ဆင်ခွင့် မရှိပါ။",
        "myprivateinfoprotected": "သင်သည် သင်၏ ပုဂ္ဂိုလ်ရေးရာ အချက်အလက်များကို ပြင်ဆင်ခွင့် မရှိပါ။",
        "mypreferencesprotected": "သင်သည် သင်၏ ရွေးချယ်စရာများကို ပြင်ဆင်ခွင့်မရှိပါ။",
        "ns-specialprotected": "အထူးစာမျက်နှာများကို တည်းဖြတ်မရနိုင်ပါ။",
+       "titleprotected": "ဤခေါင်းစဉ်ကို ဖန်တီးခြင်းမှ [[User:$1|$1]]က ကာကွယ်ထားသည်။ ပေးထားသော အကြောင်းပြချက်မှာ <em>$2</em> ဖြစ်သည်။",
+       "invalidtitle": "မဆီလျော်သော ခေါင်းစဉ်",
        "exception-nologin": "အကောင့် မဝင်ထားပါ",
        "exception-nologin-text": "ဤစာမျက်နှာကို ကြည့်ရှုနိုင်ရန် သို့မဟုတ် အခြားလုပ်ဆောင်ချက်များ ခွင့်ပြုချက်ရရှိရန် ကျေးဇူးပြု၍ အကောင့်ဝင်ပါ။",
        "exception-nologin-text-manual": "ဤစာမျက်နှာကို ဝင်ရောက်နိုင်ရန် သို့မဟုတ် အခြားလုပ်ဆောင်ချက်များ ရရှိနိုင်ရန် ကျေးဇူးပြု၍ $1 ပါ။",
        "cannotlogoutnow-text": "$1 ကိုအသုံးပြုနေစဉ်အတွင်း အကောင့်ထွက်ရန် မဖြစ်နိုင်ပါ။",
        "welcomeuser": "ကြိုဆိုပါတယ် $1!",
        "welcomecreation-msg": "သင့်အကောင့်အား ဖန်တီးပြီးပါပြီ။\nသင် ဆန္ဒရှိပါက {{SITENAME}} [[Special:Preferences|ပုဂ္ဂိုလ်ရေးအချက်အလက်များ]]ကို ပြောင်းလဲနိုင်ပါသည်။",
-       "yourname": "အသုံးပြုသူအမည် -",
+       "yourname": "အသုံးပြုသူအမည်:",
        "userlogin-yourname": "အသုံးပြုသူအမည်",
        "userlogin-yourname-ph": "သင်၏ အသုံးပြုသူအမည် ရိုက်ထည့်ပါ",
        "createacct-another-username-ph": "အသုံးပြုသူအမည် ရိုက်ထည့်ပါ",
        "createacct-realname": "နာမည်ရင်း (ဖြည့်လိုက)",
        "createacct-reason": "အကြောင်းပြချက်",
        "createacct-reason-ph": "သင်ဘာကြောင့် အခြားအကောင့် ဖန်တီးချင်တာလဲ",
+       "createacct-reason-help": "အကောင့်ဖန်တီးခြင်း မှတ်တမ်းရှိ ပြသထားသော မက်ဆေ့",
        "createacct-submit": "သင့်အကောင့်ကို ဖန်တီးရန်",
        "createacct-another-submit": "အကောင့် ဖန်တီးရန်",
        "createacct-continue-submit": "အကောင့်ဖန်တီးမှု ဆက်သွားမည်",
        "noname": "တရားဝင် အသုံးပြုသူအမည်ကို မသတ်မှတ်ရသေးပါ။",
        "loginsuccesstitle": "လော့ဂ်အင်ဝင်ပြီးပြီ",
        "loginsuccess": "'''သင်သည် {{SITENAME}} သို့ \"$1\" အဖြစ် Login ဝင်ပြီးဖြစ်သည်။'''",
+       "nosuchuser": "\"$1\" နာမည်ဖြင့် အသုံးပြုသူ မရှိပါ။ အသုံးပြုသူအမည်သည် စာလုံးအကြီးအသေးကို အမှားမခံပါ။ သင်၏စာလုံးပေါင်းကို စစ်ဆေးပါ သို့မဟုတ် [[Special:CreateAccount|အကောင့်သစ်တစ်ခု ဖန်တီးပါ]]။",
        "nosuchusershort": "\"$1\" အမည်ဖြင့် အသုံးပြုသူမရှိပါ။\nစာလုံးပေါင်း ပြန်စစ်ပေးပါရန်။",
        "nouserspecified": "အသုံးပြုသူအမည်ကို ဖော်ပြရမည်ဖြစ်သည်။",
        "login-userblocked": "ဤအသုံးပြုသူကို ပိတ်ပင်ထားသည်။ Login ဝင်ခြင်း ခွင့်မပြုပါ။",
        "mailerror": "မေးပို့ခြင်း အမှား - $1",
        "emailauthenticated": "သင့်အီးမေးလိပ်စာကို $2 နေ့ $3 အချိန်တွင် အတည်ပြုပြီး ဖြစ်သည်။",
        "emailconfirmlink": "အီးမေးကိုအတည်ပြုပါ",
+       "cannotchangeemail": "ဤဝီကီတွင် အကောင့်အီးမေးလ်လိပ်စာကို မပြောင်းလဲနိုင်ပါ။",
        "emaildisabled": "ဤဆိုဒ်သည် အီးမေးလ်များ ပို၍မရနိုင်ပါ။",
        "accountcreated": "အကောင့်ဖန်တီးပြီးပါပြီ",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|ဆွေးနွေး]]) အတွက် အကောင့်ကို ဖန်တီးပြီး ဖြစ်သည်။",
        "pt-login-continue-button": "ဆက်လက် ဝင်ရောက်ပါ",
        "pt-createaccount": "အကောင့် ဖန်တီးရန်",
        "pt-userlogout": "အကောင့်ထွက်ရန်",
+       "user-mail-no-addy": "အီးမေးလ်လိပ်စာမရှိဘဲ အီးမေးလ်ပို့ကြည့်ခဲ့သည်။",
        "changepassword": "စကားဝှက် ပြောင်းရန်",
        "resetpass_announce": "လော့ဂ်အင်ဝင်ရောက်ခြင်း ပြီးမြောက်ရန် စကားဝှက်အသစ် ပေးရမည် ဖြစ်သည်။",
        "resetpass_header": "အကောင့်စကားဝှက်ပြောင်းရန်",
        "resetpass-submit-cancel": "မလုပ်တော့ပါ",
        "resetpass-recycled": "သင်၏ လက်ရှိစကားဝှက်ထက် အခြားစကားဝှက်တစ်ခုခုကို ပြောင်းလဲပေးပါ။",
        "resetpass-temp-emailed": "ယာယီစကားဝှက်ကုဒ်ဖြင့် ဝင်ထားပါသည်၊ အပြီးသတ်ရန် စကားဝှက်အသစ်တစ်ခု ဤနေရာတွင် ဆောင်ရွက်ရပါမည်။",
-       "resetpass-temp-password": "ယာယီစကားဝှက် -",
+       "resetpass-temp-password": "ယာယီစကားဝှက်:",
        "resetpass-expired": "သင်၏ စကားဝှက် သက်တမ်းကုန်သွားပါသည်။ လော့အင်ဝင်ရန် စကားဝှက်အသစ် သတ်မှတ်ပါ။",
        "passwordreset": "စကားဝှက်အသစ် ပြုလုပ်ရန်",
-       "passwordreset-username": "အသုံးပြုသူအမည် :",
-       "passwordreset-email": "အီးမေး လိပ်စာ :",
+       "passwordreset-emaildisabled": "အီးမေးလ် ကြန်အင်လက္ခဏာများကို ဤဝီကီတွင် ပိတ်ထားခဲ့သည်။",
+       "passwordreset-username": "အသုံးပြုသူအမည်:",
+       "passwordreset-domain": "ဒိုမိန်း:",
+       "passwordreset-email": "အီးမေးလ် လိပ်စာ:",
        "passwordreset-emailtitle": "{{SITENAME}} ရှိ အကောင့် အသေးစိတ်",
        "passwordreset-emailelement": "အသုံးပြုသူအမည်:\n$1\n\nယာယီ စကားဝှက်:\n$2",
        "passwordreset-invalidemail": "တရားမဝင်သော အီးမေးလ်လိပ်စာ",
        "changeemail-submit": "အီးမေးလ်ပြောင်းလဲရန်",
        "changeemail-throttled": "သင်သည် login ဝင်ရန် အကြိမ်မြောက်မြားစွာ ပြုလုပ်ခဲ့ပြီးဖြစ်သည်။\nကျေးဇူးပြု၍ ထပ်မဝင်ခင် $1 စောင့်ပေးပါ။",
        "changeemail-nochange": "မတူညီသော အီးမေးလ်လိပ်စာအသစ်ကို ကျေးဇူးပြု၍ ရိုက်ထည့်ပါ။",
+       "resettokens-token-label": "$1 (လက်ရှိတန်ဖိုး: $2)",
        "bold_sample": "စာလုံးမည်း",
        "bold_tip": "စာလုံးမည်း",
        "italic_sample": "စာလုံး အစောင်း",
        "savechanges": "ပြောင်းလဲမှုများကို သိမ်းရန်",
        "publishpage": "စာမျက်နှာကို လွှင့်တင်ရန်",
        "publishchanges": "ပြောင်းလဲမှုများကို လွှင့်တင်ရန်",
+       "savearticle-start": "စာမျက်နှာကို သိမ်းရန်...",
+       "savechanges-start": "ပြောင်းလဲမှုများကို သိမ်းရန်...",
+       "publishpage-start": "စာမျက်နှာကို လွှင့်တင်ရန်...",
+       "publishchanges-start": "ပြောင်းလဲမှုများကို လွှင့်တင်ရန်...",
        "preview": "နမူနာ",
        "showpreview": "န​မူ​နာ​ပြ​ရန်",
        "showdiff": "ပြင်​ဆင်​ထား​သည်​များ​ကို​ ပြရန်",
+       "blankarticle": "<strong>သတိပေးချက်:</strong> သင် ဖန်တီးနေသော စာမျက်နှာသည် ဗလာဖြစ်နေသည်။ အကယ်၍ \"$1\" ကိုထပ်မံနှိပ်ပါက စာမျက်နှာသည် မည်သည့်အကြောင်းအရာမျှမပါဘဲ ဖန်တီးသွားပါလိမ့်မည်။",
        "anoneditwarning": "<strong>သတိပေးချက် - </strong> သင်သည် လော့ဂ်အင် ဝင်မထားပါ။ သင်တည်းဖြတ်မှု ပြုလုပ်ပါက သင့်အိုင်ပီလိပ်စာကို မည်သူမဆို တွေ့မြင်နိုင်မည်။ အကယ်၍ သင် <strong>[$1 လော့ဂ်အင်ဝင်]</strong> သို့မဟုတ် <strong>[$2 အကောင့်တစ်ခု ဖန်တီး]</strong>ပါက၊ သင့်တည်းဖြတ်မှုများသည် သင့်အမည်နှင့် တွဲဖက်မှတ်သားမည် ဖြစ်သည်။",
        "anonpreviewwarning": "သင်သည် logged in ဝင်မထားပါ။ သိမ်းဆည်းမည် ဆိုပါက သင်၏IP အား ဤစာမျက်နှာ မှတ်တမ်းတွင် မှတ်သားထားမည်ဖြစ်ပါသည်။",
+       "missingsummary": "<strong>ပြန်လည်အသိပေးချက်:</strong> သင်သည် တည်းဖြတ်မှုအကျဉ်းချုပ်ကို ရေးသွင်းမထားပါ။ အကယ်၍ \"$1\" ကိုထပ်မံနှိပ်လိုက်ပါက တည်းဖြတ်မှုအကျဉ်းချုပ်မပါဘဲ သိမ်းဆည်းသွားမည်ဖြစ်သည်။",
+       "selfredirect": "<strong>သတိပေးချက်:</strong> သင်သည် ဤစာမျက်နှာကိုပင် ပြန်ညွှန်းနေပါသည်။ ပြန်ညွှန်းအတွက် မှားယွင်းသည့်ဦးတည်ချက်ကို သတ်မှတ်မိသည်မျိုး ဖြစ်နိုင်သည်၊ သို့မဟုတ် မှားယွင်းသော စာမျက်နှာကို တည်းဖြတ်မိသည်မျိုးလည်း ဖြစ်နိုင်သည်။ အကယ်၍ \"$1\" ကိုထပ်မံနှိပ်လိုက်ပါက ပြန်ညွှန်းသည် ဖန်တီးလိုက်မည်သာဖြစ်သည်။",
        "missingcommenttext": "ကျေးဇူးပြု၍ မှတ်ချက်တစ်ခုရေးပါ။",
+       "missingcommentheader": "<strong>ပြန်လည်အသိပေးချက်:</strong> ဤမှတ်ချက်အတွက် အကြောင်းအရာတစ်ခု မထည့်သွင်းထားပါ။ အကယ်၍ \"$1\" ကို ထပ်မံနှိပ်လိုက်ပါက အကြောင်းအရာမပါဘဲ ဖန်တီးသွားမည်ဖြစ်သည်။",
        "summary-preview": "တည်းဖြတ်အကျဉ်းချုပ် နမူနာ:",
        "subject-preview": "အကြောင်းအရာ နမူနာ:",
+       "previewerrortext": "သင်၏ ပြောင်းလဲချက်များကို အစမ်းကြည့်ရန် ဆောင်ရွက်နေစဉ် အမှားတစ်ခု ဖြစ်ပွားခဲ့သည်။",
        "blockedtitle": "အသုံးပြုသူကို ပိတ်ပင်ထားသည်",
        "blockedtext": "<strong>သင်၏ အသုံးပြုသူအမည် သို့မဟုတ် အိုင်ပီလိပ်စာသည် ပိတ်ပင်ခြင်း ခံထားရသည်။</strong>\n\nဤပိတ်ပင်မှုအား $1 က ဆောင်ရွက်ခဲ့သည်။\nအကြောင်းရင်းမှာ <em>$2</em> ဖြစ်သည်။\n\n* ပိတ်ပင်ခြင်း စတင်ချိန်: $8\n* ပိတ်ပင်ခြင်း သက်တမ်းကုန်ချိန်: $6\n* ရည်ရွယ်ရာ blockee: $7\n\nသင်သည် ပိတ်ပင်မှုအတွက် ဆွေးနွေးရန် $1 သို့မဟုတ် အခြား [[{{MediaWiki:Grouppage-sysop}}|စီမံခန့်ခွဲသူ]] အား ဆက်သွယ်နိုင်သည်။\nသင့်အနေဖြင့် [[Special:Preferences|အကောင့်၏ ရွေးချယ်စရာများ]]ထဲတွင် ရေရာသော အီးမေးလိပ်စာအား မထည့်သွင်းထားပါက \"{{int:emailuser}}\" လုပ်ဆောင်ချက်ကို အသုံးပြုနိုင်မည် မဟုတ်ပါ။ အလားတူ ယင်းလုပ်ဆောင်ချက်ကို ပိတ်ပင်မခံရမှ လုပ်ဆောင်နိုင်မည်ဖြစ်သည်။\nသင်၏ လက်ရှိ အိုင်ပီလိပ်စာမှာ $3 ဖြစ်ပြီး၊ ပိတ်ပင်မှုအိုင်ဒီမှာ #$5 ဖြစ်သည်။\nသင်ပြုလုပ်မည့် စုံစမ်းမေးမြန်းမှုများတွင် အထက်ပါ အချက်များ အားလုံး ပါဝင်နေပါစေ။",
        "blockednoreason": "အကြောင်းပြချက် မပေးထားပါ",
        "whitelistedittext": "စာမျက်နှာများကို တည်းဖြတ်ရန် $1ရမည်။",
        "nosuchsectiontitle": "အပိုင်းကို ရှာမရနိုင်ပါ",
        "loginreqtitle": "login ဝင်ထားရန် လိုသည်",
-       "loginreqlink": "log in ဝင်",
+       "loginreqlink": "အကောင့်ဝင်ရန်",
        "loginreqpagetext": "အခြားစာမျက်နှာများကို ကြည့်ရန် $1ရမည်။",
        "accmailtitle": "စကားဝှက်ကို ပို့ပြီးပြီ",
        "newarticle": "(အသစ်)",
        "anontalkpagetext": "----\n<em>ဤသည်မှာ အကောင့်မဖန်တီးသော သို့မဟုတ် အကောင့်မရှိသော အမည်မသိ အသုံးပြုသူတစ်ဦးအတွက် ဆွေးနွေးချက် စာမျက်နှာ ဖြစ်သည်။</em>\nသို့အတွက် ကျွန်ုပ်တို့အနေဖြင့် အိုင်ပီလိပ်စာဂဏန်းကိုသာ သူ/သူမ အားခွဲခြားနိုင်ရန် အသုံးပြုရပါသည်။\nထိုသို့သော အိုင်ပီလိပ်စာများကို အသုံးပြုသူများစွာမှ မျှဝေသုံးစွဲနေနိုင်ပါသည်။\nသင်သည် အမည်မသိ အသုံးပြုသူတစ်ဦးဖြစ်ပြီး မသက်ဆိုင်သော သုံးသပ်ဆွေးနွေးချက်များက သင့်အား အနှောက်အယှက်ဖြစ်စေပါက၊ ကျေးဇူးပြု၍ [[Special:CreateAccount|အကောင့်တစ်ခု ဖန်တီးပါ]] သို့မဟုတ် [[Special:UserLogin|လော့ဂ်အင်ဝင်ရောက်ပြီး]] အခြား အမည်မသိအသုံးပြုသူများနှင့် ရောထွေးနေနိုင်ခြင်းကို ရှောင်ကြဉ်နိုင်ပါသည်။",
        "noarticletext": "ဤစာမျက်နှာတွင် ယခုလက်ရှိတွင် မည်သည့်စာသားမှ မရှိပါ။\nသင်သည် အခြားစာမျက်နှာများတွင် [[Special:Search/{{PAGENAME}}|ဤစာမျက်နှာ၏ ခေါင်းစဉ်ကို ရှာနိုင်သည်]]၊ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ဆက်စပ်ရာ မှတ်တမ်းများကို ရှာနိုင်သည်]၊ သို့မဟုတ် [{{fullurl:{{FULLPAGENAME}}|action=edit}} ဤစာမျက်နှာကို ဖန်တီးနိုင်သည်]</span>။",
        "noarticletext-nopermission": "ဤစာမျက်နှာတွင် ယခုလက်ရှိတွင် မည်သည့်စာသားမှ မရှိပါ။\nသင်သည် အခြားစာမျက်နှာများတွင် [[Special:Search/{{PAGENAME}}|ဤစာမျက်နှာ၏ ခေါင်းစဉ်ကို ရှာနိုင်သည်]]၊ သို့မဟုတ် <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ဆက်စပ်ရာ Logs များကို ရှာနိုင်သည်]</span>။ သို့သော် ဤစာမျက်နှာကို ဖန်တီးရန် သင့်တွင် အခွင့်အရေး မရှိပါ။",
+       "userpage-userdoesnotexist": "အသုံးပြုသူအကောင့် \"$1\" ကို မှတ်ပုံတင် မလုပ်ရသေးပါ။ ဤစာမျက်နှာကို ဖန်တီး/တည်းဖြတ်လိုပါက ကျေးဇူးပြု၍ စစ်ဆေးပေးပါ။",
        "userpage-userdoesnotexist-view": "အသုံးပြုသူအကောင့် \"$1\" သည် မှတ်ပုံမတင်ထားပါ။",
        "blocked-notice-logextract": "ဤအသုံးပြုသူအား လတ်တလောတွင် ပိတ်ပင်ထားသည်။\nနောက်ဆုံးပိတ်ပင်မှု မှတ်တမ်းအား ကိုးကားနိုင်ရန် အောက်တွင် ဖော်ပြထားသည်။",
        "clearyourcache": "<strong>မှတ်ချက်။</strong> သိမ်းဆည်းလိုက်ပြီးသည့်နောက် ပြောင်းလဲမှုများ မြင်ရနိုင်ရန် သင့်အနေဖြင့် ဘရောက်ဇာ၏ cache အား ဖြတ်ကျော်နိုင်ရန် လိုအပ်ပါသည်။\n* <strong>Firefox / Safari:</strong> <em>Reload</em> ကို နှိပ်နေစဉ်အတွင်း <em>Shift</em> ကို ဖိထားပါ၊ သို့မဟုတ် <em>Ctrl-F5</em> သို့ <em>Ctrl-R</em> (Mac တွင် <em>⌘-R</em>) ကို နှိပ်ပါ။\n* <strong>Google Chrome:</strong> <em>Ctrl-Shift-R</em> (Mac တွင် <em>⌘-Shift-R</em>) ကို နှိပ်ပါ။\n* <strong>Internet Explorer:</strong> <em>Refresh</em> ကို နှိပ်နေစဉ်အတွင်း <em>Ctrl</em> ကို ဖိထားပါ၊ သို့မဟုတ် <em>Ctrl-F5</em> ကို နှိပ်ပါ။\n* <strong>Opera:</strong> <em>Menu → Settings</em> (Mac တွင် <em>Opera → Preferences</em>) သို့ သွားပြီး <em>Privacy & security → Clear browsing data → Cached images and files</em> ကို ပြုလုပ်ပါ။",
        "updated": "(မွမ်းမံပြီး)",
-       "note": "'''မှတ်ချက် -'''",
+       "note": "<strong>မှတ်စု:</strong>",
        "previewnote": "<strong>ဤသည်မှာ နမူနာ ကြည့်နေခြင်းသာဖြစ်ကြောင်း မမေ့ပါနှင့်။</strong>\nသင်ပြောင်းလဲထားသည်များကို မသိမ်းရသေးပါ။",
        "continue-editing": "တည်းဖြတ်ဧရိယာသို့ သွားရန်",
        "editing": "$1 ကို တည်းဖြတ်နေသည်",
        "yourdiff": "ကွဲပြားချက်များ",
        "copyrightwarning": "{{SITENAME}} တွင် ရေးသားမှုအားလုံးကို $2 အောက်တွင် ဖြန့်ဝေရန် ဆုံးဖြတ်ပြီး ဖြစ်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။။ (အသေးစိတ်ကို $1 တွင်ကြည့်ပါ။)\nအကယ်၍ သင့်ရေးသားချက်များကို အညှာအတာမရှိ တည်းဖြတ်ခံရခြင်း၊ စိတ်တိုင်းကျ ဖြန့်ဝေခံရခြင်းတို့ကို အလိုမရှိပါက ဤနေရာတွင် မတင်ပါနှင့်။<br />\nသင်သည် ဤဆောင်းပါးကို သင်ကိုယ်တိုင်ရေးသားခြင်း၊ သို့မဟုတ် အများပြည်သူဆိုင်ရာဒိုမိန်းများ၊ ယင်းကဲ့သို့ လွတ်လပ်သည့် ရင်းမြစ်မှ ကူးယူထားခြင်း ဖြစ်ကြောင်းလည်း ဝန်ခံ ကတိပြုပါသည်။\n<strong>မူပိုင်ခွင့်ရှိသော စာ၊ပုံများကို ခွင့်ပြုချက်မရှိဘဲ မတင်ပါနှင့်။</strong>",
        "copyrightwarning2": "{{SITENAME}} တွင် ရေးသားမှုအားလုံးသည် အခြားပုံပိုးသူများ၏ တည်းဖြတ်၊ ပြောင်းလဲ၊ ဖယ်ရှားခံရနိုင်သည်ကို သတိပြုပါ။\nအကယ်၍ သင့်ရေးသားချက်များကို အညှာအတာမရှိ တည်းဖြတ်ခံရခြင်း၊ စိတ်တိုင်းကျ ဖြန့်ဝေခံရခြင်းတို့ကို အလိုမရှိပါက ဤနေရာတွင် မတင်ပါနှင့်။<br />\nသင်သည် ဤဆောင်းပါးကို သင်ကိုယ်တိုင်ရေးသားခြင်း၊ သို့မဟုတ် အများပြည်သူဆိုင်ရာဒိုမိန်းများ၊ ယင်းကဲ့သို့ လွတ်လပ်သည့် ရင်းမြစ်မှ ကူးယူထားခြင်း ဖြစ်ကြောင်းလည်း ဝန်ခံ ကတိပြုပါသည် (အသေးစိတ်ကို $1 တွင်ကြည့်ပါ)။\n<strong>မူပိုင်ခွင့်ရှိသော စာ၊ပုံများကို ခွင့်ပြုချက်မရှိဘဲ မတင်ပါနှင့်။</strong>",
+       "editpage-cannot-use-custom-model": "ဤစာမျက်နှာ၏ မာတိကာမော်ဒယ်ကို မပြောင်းလဲနိုင်ခဲ့ပါ။",
        "protectedpagewarning": "<strong>သတိပေးချက်။ ဤစာမျက်နှာအား စီမံခန့်ခွဲသူအဆင့်ရှိသူများသာ ပြင်ဆင်နိုင်ရန် ကာကွယ်ထားသည်။</strong>\nနောက်ဆုံးမှတ်တမ်းအား ကိုးကားနိုင်ရန် အောက်တွင် ဖော်ပြထားသည်။",
        "semiprotectedpagewarning": "<strong>မှတ်ချက်။</strong> ဤစာမျက်နှာအား အလိုအလျောက် အတည်ပြုထားသော အသုံးပြုသူအဆင့်ရှိသူများသာ တည်းဖြတ်နိုင်ရန် ကာကွယ်ထားသည်။\nနောက်ဆုံးမှတ်တမ်းအား ကိုးကားနိုင်ရန် အောက်တွင် ဖော်ပြထားသည်။",
        "titleprotectedwarning": "<strong>သတိပေးချက်။ ဤစာမျက်နှာကို ကာကွယ်ထားပြီး ဖန်တီးနိုင်ရန်အတွက် [[Special:ListGroupRights|အထူး အခွင့်အရေးများ]]ရှိထားရန် လိုအပ်သည်။</strong>\nနောက်ဆုံးမှတ်တမ်းအား ကိုးကားနိုင်ရန် အောက်တွင် ဖော်ပြထားသည်။",
        "template-protected": "(ကာကွယ်ထားသည်)",
        "template-semiprotected": "(တစ်စိတ်တစ်ပိုင်း ကာကွယ်ထားသည်)",
        "hiddencategories": "ဤစာမျက်နှာသည် {{PLURAL:$1|ဝှက်ထားသော ကဏ္ဍတစ်ခု|ဝှက်ထားသော ကဏ္ဍ $1 ခု}} ၏ အဖွဲ့ဝင် ဖြစ်သည်။",
+       "nocreatetext": "{{SITENAME}} သည် စာမျက်နှာသစ်များ ဖန်တီးနိုင်စွမ်းကို ကန့်သတ်ထားသည်။ သင်သည် နောက်ပြန်သွားပြီး ရှိနှင့်ပြီးသား စာမျက်နှာများကို တည်းဖြတ်နိုင်သည်၊ သို့မဟုတ် [[Special:UserLogin|အကောင့်တစ်ခုထဲဝင်ရောက် သို့ ဖန်တီးနိုင်သည်]]",
        "nocreate-loggedin": "သင်သည် စာမျက်နှာအသစ် ဖန်တီးခွင့်မရှိပါ။",
        "sectioneditnotsupported-title": "ခေါင်းစဉ်ခွဲအလိုက် တည်းဖြတ်ခြင်းကို မထောက်ပံ့ထားပါ",
        "sectioneditnotsupported-text": "အပိုင်းလိုက်တည်းဖြတ်ခြင်းကို ဤစာမျက်နှာတွင် မရနိုင်ပါ။",
        "permissionserrorstext-withaction": "အောက်ပါ အကြောင်းပြချက် {{PLURAL:$1|ခု|ခု}} ကြောင့် $2 အတွက် ခွင့်ပြုချက်မရှိပါ -",
        "recreate-moveddeleted-warn": "'''သတိပေးချက်။ သင်သည် ယခင်က ဖျက်ထားသော စာမျက်နှာတစ်ခုကို ပြန်လည်ဖန်တီးနေသည်။'''\n\nသင့်အနေနှင့် ဤစာမျက်နှာကို ဆက်လက်တည်းဖြတ်ရန် သင့်တော်မည် မသင့်တော်မည်ကို စဉ်းစားသင့်သည်။\nဖျက်ထားခြင်း နှင့် ရွှေ့ထားခြင်းတို့၏ မှတ်တမ်းကို သင့်အတွက် အလွယ်တကူ ကိုးကားနိုင်ရန် ဖော်ပြထားသည်။",
        "moveddeleted-notice": "ဤစာမျက်နှာကို ဖျက်ထားသည်။\nဖျက်ထားခြင်း၊ ကာကွယ်ထားခြင်းနှင့် ရွှေ့ပြောင်းထားခြင်းတို့နှင့် ပတ်သက်သော မှတ်တမ်းကို ကိုးကားနိုင်ရန် အောက်တွင် ဖော်ပြထားသည်။",
+       "moveddeleted-notice-recent": "စိတ်မကောင်းပါ၊ ဤစာမျက်နှာ မကြာသေးခင်က (လွန်ခဲ့သော ၂၄ နာရီအတွင်း) ဖျက်ပစ်ခဲ့သည်။ စာမျက်နှာအတွက် ဖျက်ပစ်ခြင်း၊ ကာကွယ်ခြင်းနှင့် ရွေ့ပြောင်းခြင်း မှတ်တမ်းများကို ကိုးကားချက်အဖြစ် အောက်တွင် ဖော်ပြထားသည်။",
        "log-fulllog": "မှတ်တမ်းအပြည့်အစုံကြည့်ရန်",
        "edit-gone-missing": "စာမျက်နှာကို အပ်ဒိတ်မလုပ်နိုင်ပါ။\nအဖျက်ခံလိုက်ရပုံပေါ်သည်။",
        "edit-conflict": "အငြင်းပွားမှုကို တည်းဖြတ်ရန်။",
        "postedit-confirmation-created": "စာမျက်နှာကို ဖန်တီးပြီးပြီ။",
        "postedit-confirmation-restored": "စာမျက်နှာကို ပြန်လည်ထိန်းသိမ်းပြီးပြီ။",
        "postedit-confirmation-saved": "သင့်တည်းဖြတ်မှုကို သိမ်းဆည်းပြီးပြီ။",
+       "postedit-confirmation-published": "သင်၏တည်းဖြတ်မှုကို လွှင့်တင်ခဲ့သည်။",
        "edit-already-exists": "စာမျက်နှာအသစ်တစ်ခု မဖန်တီးနိုင်ပါ။\nယင်းစာမျက်နှာ တည်ရှိပြီး ဖြစ်သည်။",
+       "defaultmessagetext": "ပုံမှန် အသိပေးချက် စာသား",
        "invalid-content-data": "မဆီလျော်သော မာတိကာဒေတာ",
        "content-not-allowed-here": "\"$1\" မာတိကာကို [[$2]] စာမျက်နှာပေါ်တွင် ခွင့်မပြုပါ။",
        "editpage-invalidcontentmodel-title": "မာတိကာမော်ဒယ်သည် မထောက်ပံ့ထားပါ",
        "parser-template-loop-warning": "တမ်းပလိတ်များ လှည့်ပတ်ဆက်စပ် နေသည်ကို တွေ့ရသည်။ [[$1]]",
        "undo-failure": "ကြားဖြတ် တည်းဖြတ်မှုများကြောင့် တည်းဖြတ်မှုကို နောက်ပြန် မပြင်နိုင်တော့ပါ။",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|ဆွေးနွေး]]) ၏ တည်းဖြတ်မူ $1 ကို ပြန်လည်ပယ်ဖျက်လိုက်သည်",
+       "cantcreateaccount-text": "ဤအိုင်ပီလိပ်စာ (<strong>$1</strong>) မှ အကောင့်ဖန်တီးခြင်းကို [[User:$3|$3]] က ပိတ်ပင်ထားသည်။ \n\n$3 က ပေးထားသော အကြောင်းပြချက်မှာ <em>$2</em>",
+       "cantcreateaccount-range-text": "သင်၏အိုင်ပီလိပ်စာ (<strong>$4</strong>) ပါဝင်သော ဤအိုင်ပီလိပ်စာ (<strong>$1</strong>) မှ အကောင့်ဖန်တီးခြင်းကို [[User:$3|$3]] က ပိတ်ပင်ထားသည်။ \n\n$3 က ပေးထားသော အကြောင်းပြချက်မှာ <em>$2</em>",
        "viewpagelogs": "ဤစာမျက်နှာအတွက် မှတ်တမ်းများကို ကြည့်ရန်",
        "nohistory": "ဤစာမျက်နှာတွင် တည်းဖြတ်မှု ရာဇဝင်မရှိပါ",
        "currentrev": "နောက်ဆုံးမူ",
        "currentrev-asof": "$1 က နောက်ဆုံး တည်းဖြတ်မူ",
        "revisionasof": "$1 ရက်နေ့က မူ",
        "revision-info": "$1 နေ့က {{GENDER:$6|$2}}$7 တည်းဖြတ်သည့်မူ",
-       "previousrevision": "မူဟောင်း",
+       "previousrevision": "← မူဟောင်း",
        "nextrevision": "ပိုသစ်သော တည်းဖြတ်မူ →",
        "currentrevisionlink": "နောက်ဆုံး မူ",
        "cur": "လက်ရှိ",
        "history-show-deleted": "ဖျက်ထားသော မူများသာ",
        "histfirst": "အဟောင်းဆုံး",
        "histlast": "အသစ်ဆုံး",
+       "historysize": "({{PLURAL:$1|1 ဘိုက်|$1 ဘိုက်}})",
        "historyempty": "(ဘာမှမရှိ)",
        "history-feed-title": "မူရာဇဝင်မှတ်တမ်း",
        "history-feed-description": "ဝီကီပေါ်ရှိ ဤစာမျက်နှာ၏ တည်းဖြတ်မှုရာဇဝင်",
        "history-feed-item-nocomment": "$2 က $1",
+       "history-feed-empty": "တောင်းဆိုလိုက်သော စာမျက်နှာ မတည်ရှိပါ။ ယင်းအား ဝီကီမှ ဖျက်ပစ်၊ အမည်ပြောင်းခဲ့သည်မျိုး ဖြစ်နိုင်ပါသည်။ သင့်လျော်သော စာမျက်နှာသစ်များအတွက် [[Special:Search|ဝီကီတွင် ရှာဖွေရန်]] စမ်းကြည့်ပါ။",
        "rev-deleted-comment": "(တည်းဖြတ်မှုအတိုချုပ် ဖယ်ရှားပြီး)",
        "rev-deleted-user": "(အသုံးပြုသူအမည် ဖယ်ရှားပြီး)",
        "rev-deleted-event": "(အသေးစိတ် မှတ်တမ်း ဖယ်ရှားပြီးပြီ)",
        "mergehistory-go": "ပေါင်းစည်းနိုင်သော တည်းဖြတ်မှုများကို ပြရန်",
        "mergehistory-submit": "မူများကို ပေါင်းရန်",
        "mergehistory-empty": "ပေါင်းစည်းနိုင်သော မူများ မရှိပါ။",
+       "mergehistory-fail-invalid-source": "ရင်းမြစ်စာမျက်နှာသည် မဆီလျော်ပါ။",
+       "mergehistory-fail-invalid-dest": "ဦးတည်စာမျက်နှာသည် ဆီလျော်ပါ။",
+       "mergehistory-fail-permission": "ရာဇဝင် ပေါင်းစပ်ရန် ခွင့်ပြုချက်များ မလုံလောက်ပါ။",
+       "mergehistory-fail-self-merge": "ရင်းမြစ်နှင့် ဦးတည်စာမျက်နှာများသည် အတူတူပင်ဖြစ်သည်။",
        "mergehistory-no-source": "ရင်းမြစ်စာမျက်နှာ $1 မတည်ရှိပါ။",
        "mergehistory-no-destination": "သတ်မှတ်ထားသောစာမျက်နှာ $1 မတည်ရှိပါ။",
        "mergehistory-invalid-source": "ရင်းမြစ်စာမျက်နှာသည် တရားဝင်သော ခေါင်းစဉ် ဖြစ်ရမည်။",
        "powersearch-togglenone": "အမည်ညွှန်းမရှိ",
        "powersearch-remember": "နောင်ရှာဖွေမှုများအတွက် ရွေးချယ်မှုကို အမှတ်ရရန်",
        "search-external": "အပြင်တွင် ရှာရန်",
+       "searchdisabled": "{{SITENAME}} ရှာဖွေခြင်းကို ပိတ်ထားပါသည်။ ဤအတောအတွင်း ဂူဂဲလ်မှတဆင့် ရှာဖွေနိုင်သည်။ မှတ်သားရန်မှာ {{SITENAME}} ရှိအကြောင်းအရာ အညွှန်းများသည် ခေတ်နောက်ကျနိုင်သည်။",
+       "search-error": "ရှာဖွေနေစဉ် အမှားတစ်ခု ဖြစ်ပွားခဲ့သည်: $1",
+       "search-warning": "ရှာဖွေနေစဉ် သတိပေးချက်တစ်ခု ဖြစ်ပွားခဲ့သည်: $1",
        "preferences": "​ရွေး​ချယ်​စ​ရာ​များ​",
        "mypreferences": "​ရွေး​ချယ်​စ​ရာ​များ​",
        "prefs-edits": "တည်းဖြတ်မှုအရေအတွက် -",
+       "prefsnologintext2": "သင်၏ အပြင်အဆင်များကို ပြောင်းလဲရန် အကောင့်ထဲဝင်ရောက်ပါ။",
        "prefs-skin": "အသွင်အပြင်",
        "skin-preview": "နမူနာ",
        "datedefault": "မရွေးချယ်",
        "prefs-searchoptions": "ရှာဖွေရန်",
        "prefs-namespaces": "အမည်ညွှန်း",
        "default": "ပုံမှန်အားဖြင့်",
-       "prefs-files": "ဖိုင်",
+       "prefs-files": "ဖိုင်များ",
        "prefs-custom-css": "စိတ်ကြိုက် CSS",
        "prefs-custom-js": "စိတ်ကြိုက် Javascript",
        "prefs-emailconfirm-label": "အီးမေးအတည်ပြုရန်",
-       "youremail": "အီး​မေး -",
+       "youremail": "အီးမေးလ်:",
        "username": "{{GENDER:$1|အသုံးပြုသူအမည်}} -",
        "prefs-memberingroups": "{{PLURAL:$1|အုပ်စု|အုပ်စုများ}}၏ {{GENDER:$2|အဖွဲ့ဝင်}} -",
+       "group-membership-link-with-expiry": "$1 ($2 မတိုင်ခင်)",
        "prefs-registration": "မှတ်ပုံတင်သည့် အချိန် -",
        "yourrealname": "နာမည်ရင်း -",
        "yourlanguage": "ဘာသာစကား:",
        "yournick": "လက်မှတ်အသစ် -",
+       "prefs-help-signature": "ဆွေးနွေးချက်စာမျက်နှာများတွင် မှတ်ချက်ပေးရာ၌ \"<nowiki>~~~~</nowiki>\" ဖြင့် လက်မှတ်ထိုးသင့်ပါသည်၊ ယင်းသည် သင်၏လက်မှတ်နှင့် အချိန်မှတ်တမ်းကို ပြောင်းပေးမည်ဖြစ်သည်။",
        "badsig": "တရားမဝင်သည့် လက်မှတ်အကြမ်း။\nHTML tags ကို စစ်ဆေးပါ။",
        "badsiglength": "သင့်လက်မှတ်သည် ရှည်လွန်းနေပါသည်။\nယင်းသည် စာလုံး {{PLURAL:$1|လုံး|လုံး}}ထက် မရှည်ရပါ။",
        "yourgender": "သင်ဘယ်လို ဖော်ပြစေချင်ပါသလဲ?",
        "gender-unknown": "သင့်အားရည်ညွှန်းရာတွင် ဆော့ဖ်ဝဲလ်သည် ဖြစ်နိုင်ပါက ဘက်မလိုက်သည့် လိင်အသုံးအနှုန်းများကို အသုံးပြုလိမ့်မည်",
        "gender-male": "သူသည် ဝီကီစာမျက်နှာများကို တည်းဖြတ်သည်",
        "gender-female": "သူမသည် ဝီကီစာမျက်နှာများကို တည်းဖြတ်သည်",
-       "email": "အီးမေး",
+       "prefs-help-gender": "ဤအပြင်အဆင်ကို သတ်မှတ်လိုက သတ်မှတ်နိုင်သည်။ ဆော့ဝဲလ်က အခြားသူများကို သင့်အားဖော်ပြရာတွင် သင့်လျော်သော သဒ္ဒါစဉ်အတိုင်း အသုံးပြုပါသည်။ ဤသတင်းအချက်အလက်သည် အများကြည့်နိုင်သောအရာ ဖြစ်ပါလိမ့်မည်။",
+       "email": "အီးမေးလ်",
+       "prefs-help-realname": "နာမည်ရင်းကို ထည့်သွင်းလိုကထည့်နိုင်သည်။ ထည့်သွင်းထားပါက သင်၏လုပ်ဆောင်မှုအတွက် ထည့်သွင်းတွက်ချက်မှုအား သင့်ကိုပေးရာတွင် အသုံးပြုနိုင်သည်။",
        "prefs-help-email": "အီးမေးလ်လိပ်စာ ပေးမည် မပေးမည်မှာ သင့်သဘောသာ ဖြစ်ပါသည်။ သို့သော်လည်း သင် စကားဝှက်ကို မေ့သွားပါက စကားဝှက်ကို reset လုပ်ရန် အီးမေးလ်လိပ်စာ လိုအပ်ပါလိမ့်မည်။",
        "prefs-help-email-others": "သင့်အသုံးပြုသူစာမျက်နှာ သို့မဟုတ် ဆွေးနွေးရန်စာမျက်နှာရှိ လင့်မှတဆင့် သင့်ထံ အခြားသူများ အီးမေးမှဆက်သွယ်ရန်လည်း ရွေးချယ်နိုင်သည်။\nအခြားသူများ သင့်ထံဆက်သွယ်သည့်အခါ သင့်အီးမေးကို သူတို့အား ဖော်ပြမည်မဟုတ်ပါ။",
        "prefs-help-email-required": "အီးမေးလိပ်စာ လိုအပ်ပါသည်။",
        "prefs-dateformat": "နေ့စွဲပုံစံ",
        "prefs-timeoffset": "အချိန် တန်ဖိုး",
        "prefs-advancedediting": "အထွေထွေ ရွေးချယ်စရာများ",
+       "prefs-developertools": "ဆော့ဝဲလ်တီထွင်ဖန်တီးသူ ကိရိယာများ",
        "prefs-editor": "တည်းဖြတ်သူ",
        "prefs-preview": "နမူနာ",
        "prefs-advancedrc": "အဆင့်မြင့် ရွေးချယ်မှု",
        "prefs-displaywatchlist": "ပြသရန် ရွေးချယ်မှု",
        "prefs-tokenwatchlist": "တိုကင်",
        "prefs-diffs": "ကွဲပြားချက်",
+       "prefs-help-prefershttps": "ဤအပြင်အဆင်များသည် နောက်တခါအကောင့်ထဲဝင်ပါက သက်ရောက်မှုရှိလာပါလိမ့်မည်။",
+       "prefswarning-warning": "သင်၏အပြင်အဆင်များအတွက် မသိမ်းဆည်းရသေးသော ပြောင်းလဲမှုများကို လုပ်ဆောင်ခဲ့သည်။ အကယ်၍ \"$1\" ကိုမနှိပ်ဘဲ ဤစာမျက်နှာကို ချန်ထားလိုက်ပါက သင်၏အပြင်အဆင်များသည် မွမ်းမံသွားလိမ့်မည်မဟုတ်ပါ။",
        "userrights": "အသုံးပြုသူ အခွင့်အရေးများ",
        "userrights-lookup-user": "အသုံးပြုသူတစ်ဦးကို ရွေးချယ်ရန်",
        "userrights-user-editname": "အသုံးပြုသူအမည်တစ်ခုကို ထည့်ပါ -",
        "userrights-viewusergroup": "{{GENDER:$1|အသုံးပြုသူ}} အုပ်စုများကို ကြည့်ရန်",
        "saveusergroups": "{{GENDER:$1|အသုံးပြုသူ}}အုပ်စုများကို သိမ်းရန်",
        "userrights-groupsmember": "အဖွဲ့ဝင်",
+       "userrights-groupsmember-auto": "အကြွင်းမဲ့ အဖွဲ့ဝင်:",
        "userrights-groups-help": "ဤအသုံးပြုသူ၏ အုပ်စုများကို အောက်ပါအတိုင်း သင်ပြောင်းလဲနိုင်သည်\n* အမှန်ခြစ်အကွက်သည် ထိုအသုံးပြုသူသည် ယင်းအုပ်စုတွင် ပါဝင်ကြောင်း ဆိုလိုသည်။\n* အမှန်ခြစ်မပါသော အကွက်သည် ထိုအသုံးပြုသူသည် ယင်းအုပ်စုတွင် မပါဝင်ကြောင်း ဆိုလိုသည်။\n* ခရေပွင့် * အမှတ်အသားသည် အုပ်စုတစ်ခုအတွင်းသို့ ထည့်သွင်းပြီးပါက ပြန်လည် ဖယ်ရှားမရနိုင်ကြောင်း (အပြန်အလှန်) ကို ဆိုလိုသည်။\n* သင်္ကေတ # အမှတ်အသားသည် ဤအုပ်စုအဖွဲ့ဝင် သက်တမ်းကို ပြန်လည်ထည့်သွင်းနိုင်ပြီး ရှေ့တိုးပေးရန် မဖြစ်နိုင်ကြောင်း ဖော်ပြသည်။",
        "userrights-reason": "အ​ကြောင်း​ပြ​ချက်:",
+       "userrights-no-interwiki": "အခြားဝီကီများ၌ အသုံးပြုသူ အခွင့်ရေးများကို တည်းဖြတ်ရန် သင့်တွင် ခွင့်ပြုချက်မရှိပါ။",
        "userrights-changeable-col": "သင်ပြောင်းလဲပေးနိုင်သောအုပ်စုများ",
        "userrights-unchangeable-col": "သင်ပြောင်းလဲမပေးနိုင်သောအုပ်စုများ",
+       "userrights-expiry-current": "သက်တမ်းကုန်ချိန် $1",
        "userrights-expiry-none": "သက်တမ်းကုန်ဆုံးခြင်း မရှိ",
+       "userrights-expiry": "သက်တမ်းကုန်လွန်မည်:",
        "userrights-expiry-othertime": "အခြားအချိန်:",
+       "userrights-expiry-options": "1 ရက်:1 day,၁ ပတ်:1 week,၁ လ:1 month,၃ လ:3 months,၆ လ:6 months,၁ နှစ်:1 year",
+       "userrights-invalid-expiry": "အုပ်စု \"$1\" အတွက် သက်တမ်းကုန်ချိန်မှာ မဆီလျော်ပါ။",
+       "userrights-expiry-in-past": "အုပ်စု \"$1\" အတွက် သက်တမ်းကုန်ချိန်မှာ အတိတ်ကဖြစ်သည်။",
        "group": "အုပ်စု -",
        "group-user": "အသုံးပြုသူများ",
        "group-autoconfirmed": "အလိုအလျောက် အတည်ပြုထားသော အသုံးပြုသူများ",
        "group-bot": "ဘော့များ",
        "group-sysop": "စီမံခန့်ခွဲသူများ",
-       "group-bureaucrat": "ဗျူရိုကရက်",
+       "group-bureaucrat": "ဗျူရိုကရက်များ",
        "group-all": "(အားလုံး)",
        "group-user-member": "{{GENDER:$1|အသုံးပြုသူ}}",
        "group-autoconfirmed-member": "{{GENDER:$1|အလိုအလျောက် အတည်ပြုထားသော အသုံးပြုသူ}}",
        "right-createpage": "စာမျက်နှာများကို ဖန်တီးရန် (ဆွေးနွေးချက်စာမျက်နှာများမဟုတ်)",
        "right-createtalk": "ဆွေးနွေးချက်စာမျက်နှာများ စတင်ရေးသားရန်",
        "right-createaccount": "အသုံးပြုသူအကောင့်အသစ်ကို ဖန်တီးရန်",
+       "right-autocreateaccount": "ပြင်ပအသုံးပြုသူ အကောင့်တစ်ခုဖြင့် အလိုအလျောက် အကောင့်ထဲ ဝင်ရန်",
        "right-minoredit": "တည်းဖြတ်မှုများကို အရေးမကြီးဟု မှတ်သားရန်",
        "right-move": "စာမျက်နှာများကို ရွှေ့ပြောင်းပါ",
        "right-move-subpages": "စာမျက်နှာများကို ယင်းတို့၏စာမျက်နှာအခွဲတို့နှင့်တကွ ရွှေ့ရန်",
        "right-editcontentmodel": "စာမျက်နှာ၏ မာတိကာမော်ဒယ်ကို ပြင်ဆင်ရန်",
        "right-editusercss": "အခြားအသုံးပြုသူများ၏ CSS ဖိုင်ကို တည်းဖြတ်ရန်",
        "right-edituserjs": "အခြားအသုံးပြုသူများ၏ JavaScript ဖိုင်ကို တည်းဖြတ်ရန်",
+       "right-viewmywatchlist": "သင်၏ကိုယ်ပိုင် စောင့်ကြည့်စာရင်းကို ကြည့်ရန်",
+       "right-viewmyprivateinfo": "သင်၏ကိုယ်ပိုင် ပုဂ္ဂလိကဒေတာကို ကြည့်ရန် (ဥပမာ - အီးမေးလ်လိပ်စာ၊ နာမည်ရင်း)",
+       "right-editmyprivateinfo": "သင်၏ကိုယ်ပိုင် ပုဂ္ဂလိကဒေတာကို ပြင်ရန် (ဥပမာ - အီးမေးလ်လိပ်စာ၊ နာမည်ရင်း)",
+       "right-editmyoptions": "သင်၏ကိုယ်ပိုင် အပြင်အဆင်များကို ပြင်ရန်",
        "right-import": "အခြားဝီကီများမှ စာမျက်နှာများကို ထည့်သွင်းရန်",
        "right-importupload": "Upload တင်လိုက်သော ဖိုင်တစ်ခုမှ စာမျက်နှာများကို ထည့်သွင်းရန်",
        "right-patrol": "အခြားသောတည်းဖြတ်မှုများကို စောင့်ကြည့်နေသည်ဟု မှတ်သားရန်",
        "grant-group-email": "အီးမေးလ် ပို့ရန်",
        "grant-blockusers": "အသုံးပြုသူများအား ပိတ်ပင်ခြင်းနှင့် ပိတ်ပင်မှု ဖယ်ရှားခြင်း",
        "grant-createaccount": "အကောင့်များ ဖန်တီးရန်",
+       "grant-createeditmovepage": "စာမျက်နှာများကို ဖန်တီး၊ တည်းဖြတ်၊ ရွေ့ပြောင်းရန်",
+       "grant-editmyoptions": "သင်၏အသုံးပြုသူ အပြင်အဆင်များကို ပြင်ရန်",
        "grant-editmywatchlist": "သင့် စောင့်ကြည့်စာရင်းကို တည်းဖြတ်ရန်",
        "grant-editpage": "ရှိပြီးသား စာမျက်နှာများကို တည်းဖြတ်ရန်",
        "grant-editprotected": "ကာကွယ်ထားသော စာမျက်နှာများကို တည်းဖြတ်ရန်",
        "grant-sendemail": "အခြားအသုံးပြုသူများကို အီးမေးပို့ရန်",
        "grant-uploadfile": "ဖိုင်အသစ်များ တင်ရန်",
        "grant-basic": "အခြေခံ ရပိုင်ခွင့်များ",
+       "grant-viewdeleted": "ဖျက်ထားသော ဖိုင်နှင့်စာမျက်နှာများကို ကြည့်ရန်",
+       "grant-viewmywatchlist": "သင့် စောင့်ကြည့်စာရင်းကို ကြည့်ရန်",
        "newuserlogpage": "အသုံးပြုသူအသစ်ရောက်လာခြင်း မှတ်တမ်း",
        "newuserlogpagetext": "ဤသည်မှာ အသုံးပြုသူအသစ် ဖန်တီးမှု မှတ်တမ်း ဖြစ်သည်။",
        "rightslog": "အသုံးပြုသူ၏ အခွင့်အရေးများ မှတ်တမ်း",
        "action-userrights": "အသုံးပြုသူ၏အခွင့်အရေးများအားလုံးကို တည်းဖြတ်ရန်",
        "action-userrights-interwiki": "အခြားဝီကီများမှ အသုံးပြုသူများ၏ အသုံးပြုသူအခွင့်အရေးများကို တည်းဖြတ်ရန်",
        "action-sendemail": "အီးမေးများ ပို့ရန်",
+       "action-editmyoptions": "သင်၏ ရွေးချယ်စရာများကို ပြင်ရန်",
        "action-editmywatchlist": "သင့် စောင့်ကြည့်စာရင်းကို တည်းဖြတ်ရန်",
        "action-viewmywatchlist": "သင့် စောင့်ကြည့်စာရင်းကို ကြည့်ရန်",
+       "action-editcontentmodel": "စာမျက်နှာ၏ မာတိကာမော်ဒယ်ကို ပြင်ဆင်ရန်",
        "action-purge": "ဤစာမျက်နှာကို ရှင်းသန့်ရန်",
        "nchanges": "ပြောင်းလဲချက် $1 {{PLURAL:$1|ခု|ခု}}",
+       "enhancedrc-since-last-visit": "{{PLURAL:$1|သင် နောက်ဆုံးရောက်လာခဲ့ကတည်းက}} $1",
        "enhancedrc-history": "ရာဇဝင်",
        "recentchanges": "လတ်တလော အပြောင်းအလဲများ",
        "recentchanges-legend": "လတ်တလော အပြောင်းအလဲများအတွက် ရွေးချယ်စရာများ",
        "rcfilters-legend-heading": "<strong>အတိုကောက်များ စာရင်း:</strong>",
        "rcfilters-other-review-tools": "အခြား ဆန်းစစ်ကိရိယာများ",
        "rcfilters-group-results-by-page": "စာမျက်နှာအလိုက် ရလဒ်များ အုပ်စုဖွဲ့ရန်",
-       "rcfilters-activefilters": "သက်ဝင်နေသာ filter များ",
+       "rcfilters-activefilters": "သက်ဝင်နေသာ စိစစ်မှုများ",
        "rcfilters-activefilters-hide": "ဝှက်",
        "rcfilters-activefilters-show": "ပြ",
-       "rcfilters-advancedfilters": "အဆင့်မြင့် filter များ",
+       "rcfilters-advancedfilters": "အဆင့်မြင့် စိစစ်မှုများ",
        "rcfilters-limit-title": "ပြသမည့် ရလဒ်များ",
        "rcfilters-date-popup-title": "ရှာဖွေရန် အချိန်ကာလ",
        "rcfilters-days-title": "မကြာသေးမီက ရက်များ",
        "rcfilters-hours-title": "မကြာသေးမီက နာရီများ",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|ရက်|ရက်}}",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|နာရီ|နာရီ}}",
-       "rcfilters-quickfilters": "သိမ်းထားသော filter များ",
+       "rcfilters-quickfilters": "သိမ်းထားသော စိစစ်မှုများ",
        "rcfilters-quickfilters-placeholder-title": "မည်သည့် filter မှ မသိမ်းရသေးပါ",
-       "rcfilters-savedqueries-defaultlabel": "သိမ်းထားသော filter များ",
+       "rcfilters-savedqueries-defaultlabel": "သိမ်းထားသော စိစစ်မှုများ",
        "rcfilters-savedqueries-rename": "အမည်ပြန်ပြောင်းရန်",
        "rcfilters-savedqueries-setdefault": "မူလပုံသေအဖြစ် သတ်မှတ်ရန်",
        "rcfilters-savedqueries-unsetdefault": "မူလပုံသေအဖြစ်မှ ဖယ်ရှားရန်",
        "rcfilters-savedqueries-new-name-label": "အမည်",
        "rcfilters-savedqueries-new-name-placeholder": "စိစစ်မှု၏ ရည်ရွယ်ချက်ကို ဖော်ပြရန်",
        "rcfilters-savedqueries-apply-label": "စိစစ်မှု ဖန်တီးရန်",
-       "rcfilters-savedqueries-apply-and-setdefault-label": "မူလပုံသေ filter ဖန်တီးရန်",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "မူလပုံသေ စိစစ်မှုကို ဖန်တီးရန်",
        "rcfilters-savedqueries-cancel-label": "မလုပ်တော့ပါ",
-       "rcfilters-savedqueries-add-new-title": "လက်ရှိ filter အပြင်အဆင်များ သိမ်းရန်",
-       "rcfilters-restore-default-filters": "မူလပုံသေ filter များအတိုင်း ပြန်ထားရန်",
-       "rcfilters-clear-all-filters": "filter များအားလုံး ရှင်းလင်းရန်",
+       "rcfilters-savedqueries-add-new-title": "လက်ရှိ စိစစ်မှုအပြင်အဆင်များကို သိမ်းရန်",
+       "rcfilters-restore-default-filters": "မူလပုံသေ စိစစ်မှုများအတိုင်း ပြန်ထားရန်",
+       "rcfilters-clear-all-filters": "စိစစ်မှုများအားလုံး ရှင်းလင်းရန်",
        "rcfilters-show-new-changes": "နောက်ဆုံး ပြောင်းလဲမှုများကို ကြည့်ရန်",
-       "rcfilters-invalid-filter": "မရေရာသော filter",
+       "rcfilters-search-placeholder": "စိစစ်မှုစနစ် အပြောင်းအလဲများ (စိစစ်စနစ်အမည်အတွက် menu သို့မဟုတ် ရှာဖွေခလုတ်ကို အသုံးပြုပါ)",
+       "rcfilters-invalid-filter": "မရေရာသော စိစစ်မှု",
        "rcfilters-filterlist-title": "စိစစ်မှုများ",
        "rcfilters-highlightmenu-title": "အရောင်တစ်ခု ရွေးချယ်ပါ",
-       "rcfilters-filterlist-noresults": "စီစစ်မှုများ မတွေ့ရှိပါ",
+       "rcfilters-filterlist-noresults": "စိစစ်မှုများ မတွေ့ရှိပါ",
+       "rcfilters-filtergroup-authorship": "ပံ့ပိုးမှု စာပေလက်ရာ",
        "rcfilters-filter-editsbyself-label": "သင်၏ ပြောင်းလဲမှုများ",
        "rcfilters-filter-editsbyself-description": "သင်၏ ဆောင်ရွက်ချက်များ။",
        "rcfilters-filter-editsbyother-label": "အခြားသူများ၏ ပြောင်းလဲမှုများ",
        "rcfilters-filter-humans-description": "လူတည်းဖြတ်သူများ၏ တည်းဖြတ်မှုများ။",
        "rcfilters-filtergroup-reviewstatus": "အခြေအနေ သုံးသပ်ရန်",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "မစောင့်ကြည့်မစစ်ဆေးရသေး",
+       "rcfilters-filter-reviewstatus-manual-label": "လူကိုယ်တိုင် စောင့်ကြပ်စစ်ဆေးပြီး",
+       "rcfilters-filter-reviewstatus-auto-label": "အလိုအလျောက် စောင့်ကြပ်စစ်ဆေးပြီး",
+       "rcfilters-filtergroup-significance": "အရေးပါထင်ရှားမှု",
        "rcfilters-filter-minor-label": "အရေးမကြီးသည့် တည်းဖြတ်မှုများ",
        "rcfilters-filter-minor-description": "အရေးမကြီးဟု မှတ်သားလိုက်သော တည်းဖြတ်မှုများ။",
        "rcfilters-filter-major-label": "အရေးမကြီး မဟုတ်သော တည်းဖြတ်မှုများ",
        "rcfilters-view-tags": "စာတွဲမှတ်ထားသော တည်းဖြတ်မှုများ",
        "rcfilters-view-namespaces-tooltip": "အမည်ညွှန်းအလိုက် ရလဒ်များ စစ်ထုတ်ရန်",
        "rcfilters-view-tags-tooltip": "တည်းဖြတ်စာတွဲများ အသုံးပြု၍ ရလဒ်များ စစ်ထုတ်ရန်",
-       "rcfilters-view-return-to-default-tooltip": "ပင်မ filter မီနူးသို့ ပြန်သွားရန်",
+       "rcfilters-view-return-to-default-tooltip": "ပင်မ စိစစ်မှုမီနူးသို့ ပြန်သွားရန်",
        "rcfilters-view-tags-help-icon-tooltip": "စာတွဲမှတ်ထားသော တည်းဖြတ်မှုများအကြောင်း ပိုမိုလေ့လာရန်",
        "rcfilters-liveupdates-button": "အချိန်နှင့်တစ်ပြေးညီ မွမ်းမံမှုများ",
        "rcfilters-liveupdates-button-title-on": "အချိန်နှင့်တစ်ပြေးညီ မွမ်းမံမှုများကို ပိတ်ရန်",
        "upload-permitted": "ခွင့်ပြုထားသော ဖိုင် {{PLURAL:$2|အမျိုးအစား|အမျိုးအစားများ}}: $1။",
        "upload-preferred": "အလေးပေးထားသော ဖိုင် {{PLURAL:$2|အမျိုးအစား|အမျိုးအစားများ}}: $1။",
        "upload-prohibited": "တားမြစ်ထားသော ဖိုင် {{PLURAL:$2|အမျိုးအစား|အမျိုးအစားများ}}: $1။",
-       "uploadlogpage": "Upload တင်သည့် မှတ်တမ်း",
+       "uploadlogpage": "ဖိုင်တင်သည့် မှတ်တမ်း",
        "uploadlogpagetext": "အောက်ပါတို့သည် မကြာမီက upload လုပ်ထားသော ဖိုင်စာရင်း ဖြစ်သည်။\nပိုမို၍ ခြုံငုံသုံးသပ်ကြည့်ရှုနိုင်ရန် [[Special:NewFiles|ဖိုင်အသစ်များ ပြခန်း]]ကို ကြည့်ပါ။",
        "filename": "ဖိုင်အမည်",
        "filedesc": "အကျဉ်းချုပ်",
        "randomincategory-nopages": "ကဏ္ဍ [[:Category:$1|$1]] ထဲတွင် စာမျက်နှာများ မရှိပါ။",
        "randomincategory-category": "ကဏ္ဍ:",
        "randomincategory-legend": "ကဏ္ဍထဲရှိ ကျပန်းစာမျက်နှာ",
-       "randomincategory-submit": "သွား",
+       "randomincategory-submit": "သွားပါ",
        "randomredirect": "ကျပန်းပြန်ညွှန်း",
        "randomredirect-nopages": "အမည်ညွှန်း \"$1\" တွင် ပြန်ညွှန်းမရှိပါ။",
        "statistics": "စာရင်းအင်း",
        "statistics-users": "မှတ်ပုံတင်ထားသော အသုံးပြုသူများ",
        "statistics-users-active": "လက်ရှိလုပ်ကိုင်နေသော အသုံးပြုသူများ",
        "statistics-users-active-desc": "နောက်ဆုံး {{PLURAL:$1|ရက်|$1 ရက်}}အတွင်း ဆောင်ရွက်ချက်ရှိသည့် အသုံးပြုသူများ",
-       "pageswithprop-submit": "သွား",
+       "pageswithprop": "စာမျက်နှာဂုဏ်အင်တစ်ခုနှင့် စာမျက်နှာများ",
+       "pageswithprop-legend": "စာမျက်နှာဂုဏ်အင်တစ်ခုနှင့် စာမျက်နှာများ",
+       "pageswithprop-text": "ဤစာမျက်နှာသည် တစ်ခုချင်းအလိုက် စာမျက်နှာဂုဏ်အင်ကို အသုံးပြုသည့် စာမျက်နှာများကို စာရင်းပြုစုထားသည်။",
+       "pageswithprop-prop": "ဂုဏ်အင်အမည်:",
+       "pageswithprop-reverse": "ပြောင်းပြန်အစဉ်လိုက် စီရန်",
+       "pageswithprop-sortbyvalue": "ဂုဏ်အင်တန်ဖိုးအလိုက် စီရန်",
+       "pageswithprop-submit": "သွားပါ",
        "doubleredirects": "နှစ်ဆင့်ပြန် ပြန်ညွှန်းများ",
        "double-redirect-fixed-move": "[[$1]] ကို ရွှေ့ပြောင်းပြီးဖြစ်သည်။ ၎င်းအား အလိုအလျောက် ပြင်ဆင်ပြီး [[$2]] သို့ ပြန်ညွှန်းထားသည်။",
        "double-redirect-fixer": "ပြန်ညွှန်းပြင်ဆင်သူ",
        "deadendpagestext": "အောက်ပါ စာမျက်နှာများသည် {{SITENAME}} တွင် အခြား စာမျက်နှာများသို့ လင့်ခ်ချိတ်ဆက်ထားခြင်း မရှိပါ။",
        "protectedpages": "ကာကွယ်ထားသော စာမျက်နှာများ",
        "protectedpages-filters": "စိစစ်မှုများ:",
+       "protectedpages-indef": "အနန္တ ကာကွယ်မှုများသာ",
+       "protectedpages-summary": "ဤစာမျက်နှာသည် လတ်တလော ကာကွယ်ထားသော စာမျက်နှာများကို စာရင်းပြုထားသည်။ ဖန်တီးခြင်းမှ ကာကွယ်ထားသည့် ခေါင်းစဉ်များစာရင်းအတွက် [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]ကို ကြည့်ပါ။",
+       "protectedpages-cascade": "အဆင့်ဆင့် ကာကွယ်မှုများသာ",
        "protectedpages-noredirect": "ပြန်ညွှန်းများအား ဝှက်ရန်",
+       "protectedpagesempty": "ဤပါရာမီတာများဖြင့် ကာကွယ်ထားသော လတ်တလော စာမျက်နှာများ မရှိပါ။",
+       "protectedpages-timestamp": "အချိန်တံဆိပ်",
        "protectedpages-page": "စာမျက်နှာ",
+       "protectedpages-expiry": "သက်တမ်းကုန်လွန်မည်",
+       "protectedpages-performer": "အသုံးပြုသူအား ကာကွယ်ခြင်း",
+       "protectedpages-params": "ကာကွယ်မှု ပါရာမီတာများ",
+       "protectedpages-reason": "အကြောင်းပြချက်",
+       "protectedpages-submit": "စာမျက်နှာများကို ပြရန်",
+       "protectedpages-unknown-timestamp": "မသိရှိပါ",
+       "protectedpages-unknown-performer": "အမည်မသိရသော အသုံးပြုသူ",
        "protectedtitles": "ကာကွယ်ထားသော ခေါင်းစဉ်များ",
+       "protectedtitles-summary": "ဤစာမျက်နှာသည် ဖန်တီးခြင်းမှ လတ်တလော ကာကွယ်ထားသော ခေါင်းစဉ်များကို စာရင်းပြုထားသည်။\nရှိနှင့်ပြီးသား စာမျက်နှာများအား ကာကွယ်ထားသည့်စာရင်းအတွက် [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]ကို ကြည့်ပါ။",
+       "protectedtitlesempty": "ဤပါရာမီတာများဖြင့် ကာကွယ်ထားသော လတ်တလော ခေါင်းစဉ်များ မရှိပါ။",
+       "protectedtitles-submit": "ခေါင်းစဉ်များကို ပြရန်",
        "listusers": "အသုံးပြုသူစာရင်း",
        "listusers-editsonly": "တည်းဖြတ်ထားဖူးသော အသုံးပြုသူများကိုသာ ဖော်ပြရန်",
        "listusers-temporarygroupsonly": "ယာယီအသုံးပြုသူအုပ်စုများထဲရှိ အသုံးပြုသူများကိုသာ ပြရန်",
        "apisandbox-results": "ရလဒ်များ",
        "apisandbox-continue": "ဆက်လက်",
        "apisandbox-continue-clear": "ရှင်းလင်း",
+       "apisandbox-multivalue-all-values": "$1 (တန်ဖိုးများအားလုံး)",
        "booksources": "မှီငြမ်း စာအုပ်များ",
        "booksources-search-legend": "စာအုပ်ရင်းမြစ်များကို ရှာရန်",
        "booksources-search": "ရှာဖွေရန်",
        "speciallogtitlelabel": "ရည်ရွယ်ရာ (ခေါင်းစဉ် သို့ {{ns:user}}:အသုံးပြုသူအတွက် အသုံးပြုအမည်):",
        "log": "မှတ်​တမ်း​များ​",
        "logeventslist-submit": "ပြသရန်",
+       "logeventslist-more-filters": "အခြားသော မှတ်တမ်းများကို ပြရန်:",
        "logeventslist-patrol-log": "စောင့်ကြပ်စစ်ဆေးမှု မှတ်တမ်း",
        "logeventslist-tag-log": "စာတွဲ မှတ်တမ်း",
        "all-logs-page": "အများနှင့်ဆိုင်သောမှတ်တမ်းအားလုံး",
        "listgrouprights": "အသုံးပြုသူအုပ်စု အခွင့်အရေးများ",
        "listgrouprights-group": "အုပ်စု",
        "listgrouprights-rights": "အခွင့်အရေးများ",
+       "listgrouprights-helppage": "Help:အုပ်စု ရပိုင်ခွင့်များ",
        "listgrouprights-members": "(အဖွဲ့ဝင်စာရင်း)",
+       "listgrouprights-addgroup": "{{PLURAL:$2|အုပ်စု|အုပ်စုများ}} ပေါင်းထည့်ရန်: $1",
+       "listgrouprights-removegroup": "{{PLURAL:$2|အုပ်စု|အုပ်စုများ}} ဖယ်ရှားရန်: $1",
        "listgrouprights-addgroup-all": "အုပ်စုအားလုံးကို ပေါင်းထည့်ရန်",
        "listgrouprights-removegroup-all": "အုပ်စုအားလုံးကို ဖယ်ရှားရန်",
+       "listgrouprights-addgroup-self": "ကိုယ်ပိုင်အကောင့်သို့ {{PLURAL:$2|အုပ်စု|အုပ်စုများ}} ပေါင်းထည့်ရန်: $1",
+       "listgrouprights-removegroup-self": "ကိုယ်ပိုင်အကောင့်သို့ {{PLURAL:$2|အုပ်စု|အုပ်စုများ}} ဖယ်ရှားရန်: $1",
        "listgrouprights-addgroup-self-all": "အုပ်စုအားလုံးကို မိမိ၏အကောင့်သို့ ပေါင်းထည့်ရန်",
        "listgrouprights-removegroup-self-all": "မိမိ၏အကောင့်မှ အုပ်စုအားလုံးကို ဖယ်ရှားရန်",
        "listgrouprights-namespaceprotection-namespace": "အမည်ညွှန်း",
+       "listgrants-rights": "အခွင့်အရေးများ",
        "trackingcategories": "နောက်ယောင်ခံ ကဏ္ဍများ",
        "trackingcategories-msg": "နောက်ယောင်ခံ ကဏ္ဍ",
+       "trackingcategories-nodesc": "ဖော်ပြချက် မရရှိနိုင်ပါ။",
        "mailnologin": "ပို့ရန်လိပ်စာ မရှိပါ",
        "emailuser": "ဤအသုံးပြုသူအား အီးမေးပို့ပါ",
        "emailuser-title-target": "{{GENDER:$1|အသုံးပြုသူ}}ကို အီးမေးပို့ရန်",
+       "emailuser-title-notarget": "အသုံးပြုသူအား အီးမေးလ်ပို့ရန်",
        "defemailsubject": "{{SITENAME}} အသုံးပြုသူ \"$1\" ထံမှ အီးမေး",
        "usermaildisabled": "အသုံးပြုသူအီးမေးကို ပိတ်ထားသည်",
        "noemailtitle": "အီးမေးလိပ်စာ မရှိပါ",
        "watchlistfor2": "$1 အတွက် $2",
        "nowatchlist": "သင့်စောင့်ကြည့်စာရင်းမှာ ဘာမှ မရှိပါ။",
        "watchnologin": "logged in ဝင်မထားပါ",
+       "addwatch": "စောင့်ကြည့်စာရင်းသို့ ပေါင်းထည့်ရန်",
        "addedwatchtext": "\"[[:$1]]\" နှင့် ၎င်း၏ ဆွေးနွေးချက် စာမျက်နှာကို သင်၏ [[Special:Watchlist|စောင့်ကြည့်စာရင်း]]ထဲသို့ ပေါင်းထည့်ပြီးဖြစ်သည်။",
+       "addedwatchtext-talk": "\"[[:$1]]\" နှင့် ယင်း၏ဆက်နွယ် စာမျက်နှာကို သင်၏ [[Special:Watchlist|စောင့်ကြည့်စာရင်း]]ထဲသို့ ပေါင်းထည့်ပြီးဖြစ်သည်။",
+       "addedwatchtext-short": "စာမျက်နှာ \"$1\" အား သင်၏စောင့်ကြည့်စာရင်းသို့ ပေါင်းထည့်လိုက်ပါပြီ။",
+       "removewatch": "စောင့်ကြည့်စာရင်းမှ ဖယ်ရှားရန်",
        "removedwatchtext": "\"[[:$1]]\" နှင့် ၎င်း၏ ဆွေးနွေးချက်စာမျက်နှာကို သင်၏ [[Special:Watchlist|စောင့်ကြည့်စာရင်း]] မှ ဖယ်ထုတ်ပြီး ဖြစ်သည်။",
+       "removedwatchtext-talk": "\"[[:$1]]\" နှင့် ယင်း၏ဆက်နွယ် စာမျက်နှာကို သင်၏ [[Special:Watchlist|စောင့်ကြည့်စာရင်း]]ထဲမှ ဖယ်ရှားပြီးဖြစ်သည်။",
+       "removedwatchtext-short": "စာမျက်နှာ \"$1\" အား သင်၏စောင့်ကြည့်စာရင်းမှ ဖယ်ရှားလိုက်ပါပြီ။",
        "watch": "စောင့်ကြည့်ရန်",
        "watchthispage": "ဤစာမျက်နှာကို စောင့်ကြည့်ရန်",
        "unwatch": "စောင့်မကြည့်ပါနှင့်",
        "unwatchthispage": "စောင့်ကြည့်ခြင်းကို ရပ်တန့်ရန်",
        "notanarticle": "မာတိကာစာမျက်နှာတစ်ခု မဟုတ်",
        "watchlist-details": "သင့်စောင့်ကြည့်စာရင်းတွင် (ဆွေးနွေးချက် စာမျက်နှာများ အပါအဝင်){{PLURAL:$1|စာမျက်နှာ $1 ခု|စာမျက်နှာ $1 ခု}} ရှိသည်။",
+       "wlheader-enotif": "အီးမေးလ် အသိပေးချက်ကို ဖွင့်ထားသည်။",
        "wlheader-showupdated": "သင် နောက်ဆုံးကြည့်ရှုခဲ့ပြီးနောက် ပြောင်းလဲမှုရှိခဲ့သော စာမျက်နှာများကို <strong>စာလုံးမဲ</strong> ဖြင့် ပြသထားသည်",
        "wlnote": "အောက်ပါတို့သည် $3၊ $4 အထိ နောက်ဆုံး {{PLURAL:$2|နာရီ|<strong>$2</strong> နာရီ}}အတွင်း {{PLURAL:$1|နောက်ဆုံးပြောင်းလဲချက် တစ်ခု|နောက်ဆုံးပြောင်းလဲချက်များ <strong>$1</strong> ခု}} ဖြစ်သည်။",
        "wlshowlast": "နောက်ဆုံး $1 နာရီ $2 ရက်  ကိုပြရန်",
        "watcherrortext": "\"$1\" အတွက် သင်၏စောင့်ကြည့်စာရင်း အပြင်အဆင်များကို ပြောင်းလဲစဉ် အမှားတစ်ခု ဖြစ်ပွားခဲ့သည်။",
        "enotif_reset": "စာမျက်နှာများအားလုံး ကြည့်ရှုပြီးကြောင်း မှတ်သားရန်",
        "enotif_impersonal_salutation": "{{SITENAME}} အသုံးပြုသူ",
+       "enotif_subject_deleted": "{{SITENAME}} စာမျက်နှာ $1 အား $2 မှ {{GENDER:$2|ဖျက်ပစ်ခဲ့သည်}}",
+       "enotif_subject_created": "{{SITENAME}} စာမျက်နှာ $1 အား $2 မှ {{GENDER:$2|ဖန်တီးခဲ့သည်}}",
+       "enotif_subject_moved": "{{SITENAME}} စာမျက်နှာ $1 အား $2 မှ {{GENDER:$2|ရွေ့ပြောင်းခဲ့သည်}}",
+       "enotif_subject_restored": "{{SITENAME}} စာမျက်နှာ $1 အား $2 မှ {{GENDER:$2|ပြန်လည်ထိန်းသိမ်းခဲ့သည်}}",
+       "enotif_subject_changed": "{{SITENAME}} စာမျက်နှာ $1 အား $2 မှ {{GENDER:$2|ပြောင်းလဲခဲ့သည်}}",
+       "enotif_body_intro_deleted": "{{SITENAME}} စာမျက်နှာ $1 အား $2 မှ $PAGEEDITDATE တွင် {{GENDER:$2|ဖျက်ပစ်ခဲ့သည်}}၊ $3 ကိုကြည့်ပါ။",
+       "enotif_body_intro_created": "{{SITENAME}} စာမျက်နှာ $1 အား $2 မှ $PAGEEDITDATE တွင် {{GENDER:$2|ဖန်တီးခဲ့သည်}}၊ လက်ရှိ ပြန်လည်ပြင်ဆင်ခြင်းအတွက် $3 ကိုကြည့်ပါ။",
+       "enotif_body_intro_moved": "{{SITENAME}} စာမျက်နှာ $1 အား $2 မှ $PAGEEDITDATE တွင် {{GENDER:$2|ရွေ့ပြောင်းခဲ့သည်}}၊ လက်ရှိ ပြန်လည်ပြင်ဆင်ခြင်းအတွက် $3 ကိုကြည့်ပါ။",
+       "enotif_body_intro_restored": "{{SITENAME}} စာမျက်နှာ $1 အား $2 မှ $PAGEEDITDATE တွင် {{GENDER:$2|ပြန်လည်ထိန်းသိမ်းခဲ့သည်}}၊ လက်ရှိ ပြန်လည်ပြင်ဆင်ခြင်းအတွက် $3 ကိုကြည့်ပါ။",
+       "enotif_body_intro_changed": "{{SITENAME}} စာမျက်နှာ $1 အား $2 မှ $PAGEEDITDATE တွင် {{GENDER:$2|ပြောင်းလဲခဲ့သည်}}၊ လက်ရှိ ပြန်လည်ပြင်ဆင်ခြင်းအတွက် $3 ကိုကြည့်ပါ။",
+       "enotif_lastvisited": "သင် နောက်ဆုံးရောက်လာခဲ့ကတည်းက ပြောင်းလဲမှုများအားလုံးအတွက် $1 ကိုကြည့်ပါ",
        "enotif_lastdiff": "ဤပြောင်းလဲမှုအား ကြည့်ရန် $1 ကို ကြည့်ပါ",
        "enotif_anon_editor": "အမည်မသိ အသုံးပြုသူ $1",
        "enotif_minoredit": "ဤအရာသည် အရေးမကြီးသောပြင်​ဆင်​မှု ​ဖြစ်​သည်​",
        "delete-edit-reasonlist": "ဖျက်ပစ်ရသော အကြောင်းရင်းများကို တည်းဖြတ်ရန်",
        "deleteprotected": "ဤစာမျက်နှာသည် ကာကွယ်ထားသောကြောင့် ဖျက်ပစ်၍မရနိုင်ပါ။",
        "deleting-backlinks-warning": "<strong>သတိပေးချက်။</strong> သင်ဖျက်ပစ်တော့မည့် စာမျက်နှာအား [[Special:WhatLinksHere/{{FULLPAGENAME}}|အခြားစာမျက်နှာများမှ]] ချိတ်ဆက်ထားခြင်း သို့မဟုတ် ထည့်သွင်းထားခြင်း ရှိနေသည်။",
+       "rollback": "နောက်ပြန်ပြင် တည်းဖြတ်မှုများ",
        "rollbacklink": "နောက်ပြန် ပြန်သွားရန်",
        "rollbacklinkcount": "{{PLURAL:$1|တည်းဖြတ်မှု|တည်းဖြတ်မှုများ}} $1 ကို နောက်ပြန်ပြင်ရန်",
+       "rollbacklinkcount-morethan": "$1 ထက်ပိုသော {{PLURAL:$1|တည်းဖြတ်မှု|တည်းဖြတ်မှုများ}}ကို နောက်ပြန်ပြင်ရန်",
+       "rollbackfailed": "နောက်ပြန်ပြင်ခြင်း မအောင်မြင်ခဲ့ပါ။",
+       "editcomment": "တည်းဖြတ်မှု အကျဉ်းချုပ်မှာ: <em>$1</em>။",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|ဆွေးနွေး]]) ၏ ပြင်ဆင်မှုများကို [[User:$1|$1]] ၏ နောက်ဆုံးတည်းဖြတ်မူသို့ နောက်ပြန် ပြန်ပြင်ခဲ့သည်",
        "changecontentmodel": "စာမျက်နှာ၏ မာတိကာမော်ဒယ်ကို ပြောင်းလဲရန်",
        "changecontentmodel-legend": "မာတိကာမော်ဒယ်ကို ပြောင်းလဲရန်",
        "changecontentmodel-reason-label": "အ​ကြောင်း​ပြ​ချက်:",
        "changecontentmodel-submit": "ပြောင်းလဲရန်",
        "changecontentmodel-success-title": "မာတိကာမော်ဒယ် ပြောင်းလဲခဲ့သည်",
-       "changecontentmodel-success-text": "[[:$1]]]၏ မာတိကာအမျိုးအစား ပြောင်းလဲသွားသည်။",
+       "changecontentmodel-success-text": "[[:$1]]၏ မာတိကာအမျိုးအစား ပြောင်းလဲသွားသည်။",
        "changecontentmodel-cannot-convert": "[[:$1]]ပေါ်ရှိ မာတိကာသည် $2 အမျိူးအစားတစ်ခုသို့ မကူးပြောင်းနိုင်ပါ။",
        "changecontentmodel-nodirectediting": "$1 မာတိကာမော်ဒယ်သည် တိုက်ရိုက်တည်းဖြတ်မှုကို မထောက်ပံ့ပါ",
        "changecontentmodel-emptymodels-title": "မည်သည့် မာတိကာမော်ဒယ်မှ မရရှိနိုင်ပါ",
        "changecontentmodel-emptymodels-text": "[[:$1]]ပေါ်ရှိ မာတိကာသည် မည်သည့်အမျိူးအစားတစ်ခုသို့ မကူးပြောင်းနိုင်ပါ။",
        "log-name-contentmodel": "မာတိကာမော်ဒယ် ပြောင်းလဲမှုမှတ်တမ်း",
+       "logentry-contentmodel-change-revertlink": "ပြန်ပြောင်းရန်",
+       "logentry-contentmodel-change-revert": "ပြန်ပြောင်းရန်",
        "protectlogpage": "ကာကွယ်မှုများ၏ မှတ်တမ်း",
        "protectlogtext": "အောက်ပါတို့သည် စာမျက်နှာ ကာကွယ်မှုများအတွက် အပြောင်းအလဲ စာရင်း ဖြစ်သည်။\nလက်ရှိ စာမျက်နှာ ကာကွယ်မှုများ စာရင်းအတွက် [[Special:ProtectedPages|ကာကွယ်ထားသော စာမျက်နှာများ စာရင်း]]ကို ကြည့်ပါ။",
        "protectedarticle": "\"[[$1]]\" ကို ကာကွယ်ထားသည်",
        "modifiedarticleprotection": "\"[[$1]]\" ၏ ကာကွယ်မှု အဆင့်ကို ပြောင်းရန်",
+       "unprotectedarticle": "\"[[$1]]\" မှ ကာကွယ်မှုအား ဖယ်ရှားခဲ့သည်",
+       "movedarticleprotection": "\"[[$2]]\" မှ \"[[$1]]\" သို့ ကာကွယ်မှု အပြင်အဆင်များအား ရွေ့ပြောင်းခဲ့သည်။",
+       "protectedarticle-comment": "\"[[$1]]\" ကို {{GENDER:$2|က ကာကွယ်ခဲ့သည်}}",
        "modifiedarticleprotection-comment": "\"[[$1]]\" အတွက် ကာကွယ်မှုအဆင့်ကို {{GENDER:$2|ပြောင်းလဲခဲ့သည်}}",
+       "unprotectedarticle-comment": "\"[[$1]]\" မှ ကာကွယ်မှုကို {{GENDER:$2|ဖယ်ရှားခဲ့သည်}}",
        "protect-title": "\"$1\" ၏ ကာကွယ်မှုအဆင့်ကို ပြောင်းလဲရန်",
+       "protect-title-notallowed": "\"$1\" ၏ ကာကွယ်မှုအဆင့်ကို ကြည့်ရန်",
        "prot_1movedto2": "[[$1]]  မှ​ [[$2]] သို့​",
+       "protect-norestrictiontypes-title": "မကာကွယ်နိုင်သော စာမျက်နှာ",
        "protect-legend": "ကာကွယ်မှု အတည်ပြုရန်",
        "protectcomment": "အ​ကြောင်း​ပြ​ချက်:",
        "protectexpiry": "သက်တမ်းကုန်လွန်မည်:",
        "protect-level-sysop": "စီမံခန့်ခွဲသူများသာ",
        "protect-summary-cascade": "အစီအစဉ်ကျအောင် စီနေသည်",
        "protect-expiring": "$1 (UTC) တွင် သက်တမ်းကုန်မည်",
+       "protect-expiring-local": "သက်တမ်းကုန်ချိန် $1",
        "protect-expiry-indefinite": "အနန္တ",
        "protect-cascade": "ဤစာမျက်နှာအတွင်း ပါဝင်သော စာမျက်နှာများကို ထိန်းသိမ်းကာကွယ်ပါ (အများခွင့်ပြုချက်ဖြင့်သာ ပြင်ဆင်သင့်သည်)",
        "protect-cantedit": "ကာကွယ်ထားသောစာမျက်နှာဖြစ်သည့်အတွက် ပြင်ဆင်၍ မရနိုင်ပါ။ အဘယ့်ကြောင့်ဆိုသော် သင့်မှာ တည်းဖြတ်ပိုင်ခွင့် မရှိ၍ ဖြစ်ပါသည်။",
        "protect-othertime": "အခြားအချိန်:",
        "protect-othertime-op": "အခြားအချိန်",
+       "protect-existing-expiry": "ရှိနေပြီးသား သက်တမ်းကုန်ချိန်: $3၊ $2",
+       "protect-existing-expiry-infinity": "ရှိနေပြီးသား သက်တမ်းကုန်ချိန်: အနန္တ",
        "protect-otherreason": "အခြားသော/နောက်ထပ် အကြောင်းပြချက် -",
        "protect-otherreason-op": "အခြား အကြောင်းပြချက်",
+       "protect-dropdown": "*ယေဘုယျ ကာကွယ်ရခြင်း အကြောင်းပြချက်များ\n** လက်သရမ်းမှု များပြားခြင်း\n** လိုက်ဖွခြင်း များပြား\n** တည်းဖြတ်မှုစစ်ပွဲအတွက် တန်ပြန်ဆင်ခြင်း\n** လူကြည့်များသော စာမျက်နှာ",
        "protect-edit-reasonlist": "ကာကွယ်ထားရသော အကြောင်းရင်းများကို တည်းဖြတ်ရန်",
        "protect-expiry-options": "၁ နာရီ:1 hour,၁ နေ့:1 day,၁ ပတ်:1 week,၂ ပတ်:2 weeks,၁ လ:1 month,၃ လ:3 months,၆ လ:6 months,၁ နှစ်:1 year,အနန္တ:infinite",
        "restriction-type": "ခွင့်ပြုချက် -",
        "pagesize": "(ဘိုက်)",
        "restriction-edit": "ပြင်ဆင်ရန်",
        "restriction-move": "ရွှေ့ရန်",
-       "restriction-create": "á\80\91á\80½á\80\84á\80º",
-       "restriction-upload": "Upload တင်ရန်",
+       "restriction-create": "á\80\96á\80\94á\80ºá\80\90á\80®á\80¸",
+       "restriction-upload": "ဖိုင်တင်ရန်",
        "restriction-level-sysop": "အပြည့်အဝကာကွယ်ထားသည်။",
        "restriction-level-autoconfirmed": "တစ်စိတ်တစ်ပိုင်း ကာကွယ်ထားသည်",
        "restriction-level-all": "မည်သည့်အဆင့်မဆို",
        "undeleteviewlink": "ကြည့်ရန်",
        "undeleteinvert": "ရွေးချယ်ထားခြင်းကို ပြောင်းပြန်လှန်ရန်",
        "undeletecomment": "အ​ကြောင်း​ပြ​ချက် -",
-       "undelete-header": "မကြာသေးခင်က ဖျက်ထားသည့်စာမျက်နှာများအတွက် [Special:Log/delete|ဖျက်ထားသည်များ မှတ်တမ်း]]ကို ကြည့်ပါ။",
+       "undelete-header": "မကြာသေးခင်က ဖျက်ထားသည့်စာမျက်နှာများအတွက် [[Special:Log/delete|ဖျက်ထားသည်များ မှတ်တမ်း]]ကို ကြည့်ပါ။",
        "undelete-search-title": "ဖျက်ပစ်လိုက်သော စာမျက်နှာများကို ရှာရန်",
        "undelete-search-box": "ဖျက်ပစ်သည့် စာမျက်နှာများမှ ရှာရန်",
        "undelete-search-submit": "ရှာဖွေရန်",
        "mycontris": "ဆောင်ရွက်ချက်များ",
        "anoncontribs": "ဆောင်ရွက်ချက်များ",
        "contribsub2": "{{GENDER:$3|$1}}အတွက် ($2)",
+       "contributions-userdoesnotexist": "အသုံးပြုသူအကောင့် \"$1\" သည် မှတ်ပုံမတင်ထားပါ။",
        "nocontribs": "ဤသတ်မှတ်ချက်များနှင့် ကိုက်ညီသည့် ပြောင်းလဲမှုများ မရှိပါ။",
        "uctop": "(လက်ရှိ)",
        "month": "အဆိုပါ လမှစ၍ ( အဆိုပါလထက်လည်း စောသော) :",
        "year": "အဆိုပါ နှစ်မှစ၍ ( အဆိုပါနှစ်ထက်လည်း စောသော) :",
+       "date": "အဆိုပါရက်စွဲမှစ၍ (ယင်းထက်လည်း စောသော):",
        "sp-contributions-newbies": "အကောင့်အသစ်များ၏ ပံ့ပိုးမှုများကိုသာ ပြရန်",
        "sp-contributions-newbies-sub": "အကောင့်အသစ်များအတွက်",
+       "sp-contributions-newbies-title": "အကောင့်သစ်များအတွက် အသုံးပြုသူပံ့ပိုးမှုများ",
        "sp-contributions-blocklog": "ပိတ်ပင်တားဆီးမှု မှတ်တမ်း",
        "sp-contributions-deleted": "ဖျက်ခံထားရသည့် {{GENDER:$1|အသုံးပြုသူ}} ဆောင်ရွက်ချက်များ",
        "sp-contributions-uploads": "အပ်လုပ်တင်ထားသည်များ",
        "sp-contributions-talk": "ဆွေးနွေး",
        "sp-contributions-userrights": "{{GENDER:$1|အသုံးပြုသူ}}၏ အခွင့်အရေးများကို စီမံခန့်ခွဲခြင်း",
        "sp-contributions-blocked-notice": "ဤအသုံးပြုသူအား လတ်တလောတွင် ပိတ်ပင်ထားသည်။\nနောက်ဆုံးပိတ်ပင်မှု မှတ်တမ်းအား ကိုးကားနိုင်ရန် အောက်တွင် ဖော်ပြထားသည်။",
+       "sp-contributions-blocked-notice-anon": "ဤအိုင်ပီလိပ်စာအား လတ်တလောတွင် ပိတ်ပင်ထားသည်။\nနောက်ဆုံးပိတ်ပင်မှု မှတ်တမ်းအား ကိုးကားနိုင်ရန် အောက်တွင် ဖော်ပြထားသည်။",
        "sp-contributions-search": "ပံ့ပိုးမှုများကို ရှာရန်",
        "sp-contributions-username": "အိုင်ပီလိပ်စာ သို့ အသုံးပြုသူအမည် :",
        "sp-contributions-toponly": "နောက်ဆုံးတည်းဖြတ်မူများသာပြရန်",
        "sp-contributions-newonly": "စာမျက်နှာ ဖန်တီးမှုများသာ ပြသရန်",
        "sp-contributions-hideminor": "အရေးမကြီးသော တည်းဖြတ်မှုများကို ဝှက်ရန်",
        "sp-contributions-submit": "ရှာဖွေရန်",
+       "sp-contributions-outofrange": "မည်သည့်ရလဒ်များ မပြနိုင်ပါ။ တောင်းဆိုထားသော အိုင်ပီအတိုင်းအတာသည် /$1 ၏ CIDR ကန့်သတ်ချက်ထက် ပိုကြီးသည်။",
        "whatlinkshere": "ဘယ်ကလင့်ခ်ထားလဲ",
        "whatlinkshere-title": "\"$1\" သို့ ချိတ်ဆက်ထားသော စာမျက်နှာများ",
        "whatlinkshere-page": "စာမျက်နှာ -",
        "whatlinkshere-hidelinks": "လင့်ခ်များ $1 ခု",
        "whatlinkshere-hideimages": "ဖိုင်အချိတ်အဆက်များ $1 ခု",
        "whatlinkshere-filters": "စိစစ်မှုများ",
+       "whatlinkshere-submit": "သွားပါ",
+       "autoblockid": "အလိုအလျောက်ပိတ်ပင် #$1",
+       "block": "အသုံးပြုသူကို ပိတ်ပင်ရန်",
        "unblock": "အသုံးပြုသူကို ပိတ်ပင်ထားရာမှ ပြန်ဖွင့်ပေးရန်",
        "blockip": "{{GENDER:$1|အသုံးပြုသူ}} ပိတ်ပင်ရန်",
+       "blockiptext": "သတ်မှတ်ထားသော အိုင်ပီလိပ်စာ သို့မဟုတ် အသုံးပြုသူအမည်ကို ရေးသားပိုင်ခွင့်မှ ပိတ်ပင်တားဆီးရန် အောက်ပါပုံစံကို အသုံးပြုပါ။ ဤသည် [[{{MediaWiki:Policy-url}}|မူဝါဒ]] အရ ဖျက်လိုဖျက်ဆီးလုပ်ဆောင်မှုကို ကာကွယ်ရန်အတွက်သာ ဆောင်ရွက်သင့်သည်။ ပိတ်ပင်ရသည့် အကြောင်းပြချက်များကိုလည်း အောက်တွင်\nဖြည့်သွင်းပါ။ အိုင်ပီလိပ်စာ အတိုင်းအတာအလိုက် [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] syntax ကို အသုံးပြု၍ ပိတ်ပင်နိုင်ပါသည်။ အများဆုံး ခွင့်ပြုပမာဏမှာ IPv4 အတွက် /$1 ဖြစ်ပြီး IPv6 အတွက် /$2 ဖြစ်သည်။",
        "ipaddressorusername": "အိုင်ပီလိပ်စာ သို့ အသုံးပြုသူအမည် -",
        "ipbexpiry": "သက်တမ်းကုန်လွန်ရက် -",
        "ipbreason": "အ​ကြောင်း​ပြ​ချက်:",
+       "ipbreason-dropdown": "*ယေဘုယျ ပိတ်ပင်တားဆီးရခြင်း အကြောင်းပြချက်များ\n** မှားယွင်းအချက်အလက်များကို ထည့်သွင်းမှု\n** စာမျက်နှာများမှ အကြောင်းအရာကို ဖယ်ရှားမှု\n** ပြင်ပဆိုဒ်များသို့လင့်ခ်ချိတ်၍ ဖွမှု\n** စာမျက်နှာများတွင် ပေါက်တတ်ကရများ ထည့်သွင်းမှု\n** ခြိမ်းခြောက်ခြင်း အပြုအမူ/အနှောက်အယှက်ပေးခြင်း\n** အကောင့်များစွာကို အလွဲသုံးစားလုပ်မှု\n** လက်ခံနိုင်ဖွယ်မရှိသော အသုံးပြုသူအမည်",
        "ipb-hardblock": "ဤအိုင်ပီလိပ်စာမှ လော့ဂ်အင်ဝင်ထားသော အသုံးပြုသူများကို တည်းဖြတ်ခြင်းမှ တားမြစ်ရန်",
        "ipbcreateaccount": "အကောင့်အသစ်ပြုလုပ်ခြင်းကို တားဆီးရန်",
        "ipbemailban": "အီးမေးပို့ခြင်းမှ အသုံးပြုသူကို တားဆီးရန်",
        "ipbwatchuser": "ဤအသုံးပြုသူ၏ စာမျက်နှာနှင့် ဆွေးနွေးချက်တို့ကို စောင့်ကြည့်ရန်",
        "ipb-disableusertalk": "ပိတ်ပင်ထားစဉ်အတွင်း ဤအသုံးပြုသူအား သူတို့၏ ကိုယ်ပိုင်ဆွေးနွေးချက် စာမျက်နှာကို ပြင်ဆင်ခြင်းမှ ပိတ်ပင်ရန်",
        "ipb-change-block": "အသုံးပြုသူအား ဤအပြင်အဆင်များဖြင့် ထပ်မံပိတ်ပင်ရန်",
+       "ipb-confirm": "ပိတ်ပင်မှုကို အတည်ပြု",
        "badipaddress": "တရားမဝင်သော IP address",
        "blockipsuccesssub": "ပိတ်ပင်ခြင်း အောင်မြင်သည်",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] ကို ပိတ်ပင်ထားပါသည်။<br />\nပိတ်ပင်မှုများကို ပြန်လည်ဆန်းစစ်ရန် [[Special:BlockList|ပိတ်ပင်မှု စာရင်း]]ကို ကြည့်ပါ။",
+       "ipb-blockingself": "သင့်ကိုယ်သင် ပိတ်ပင်တားဆီးတော့မည် ဖြစ်သည်။ ဤသည်ကို လုပ်ဆောင်လိုသည်မှာ သေချာပါသလား။",
+       "ipb-confirmaction": "ဤသည်ကို လုပ်ဆောင်လိုသည်မှာ သေချာပါက အောက်ခြေရှိ \"{{int:ipb-confirm}}\" ကွင်းအား ကျေးဇူးပြု၌ စစ်ဆေးပါ။",
        "ipb-edit-dropdown": "ပိတ်ပင်ရသောအကြောင်းရင်းများ",
        "ipb-unblock-addr": "$1 ကို ပိတ်ထားရာမှ ပြန်ဖွင့်ရန်",
        "ipb-unblock": "အသုံးပြုသူအမည် သို့ IP address ကို ပိတ်ထားရာမှ ပြန်ဖွင့်ပေးရန်",
        "ipb-blocklist": "ရှိနှင့်ပြီးသား ပိတ်ပင်မှုများကို ကြည့်ရန်",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}} အတွက် ဆောင်ရွက်ချက်များ",
+       "ipb-blocklist-duration-left": "$1 ကျန်ရှိ",
        "unblockip": "အသုံးပြုသူကို ပိတ်ပင်ထားရာမှ ပြန်ဖွင့်ပေးရန်",
        "ipusubmit": "ဤပိတ်ပင်မှုကို ဖယ်ရှားရန်",
        "unblocked": "[[User:$1|$1]] ကို ပိတ်ပင်ထားရာမှ ပြန်ဖွင့်ပေးလိုက်သည်",
+       "unblocked-range": "$1 အား ပိတ်ပင်မှုမှ ပြန်ဖြေပေးလိုက်သည်။",
        "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": "အကောင့်ပိတ်ပင်မှုများ ဝှက်",
+       "blocklist-tempblocks": "ယာယီပိတ်ပင်မှုများ ဝှက်",
+       "blocklist-addressblocks": "အိုင်ပီတစ်ခုတည်းပိတ်ပင်မှု ဝှက်",
+       "blocklist-rangeblocks": "အကွာအဝေးလိုက် ပိတ်ပင်မှုများ ဝှက်",
+       "blocklist-timestamp": "အချိန်တံဆိပ်",
+       "blocklist-target": "ပစ်မှတ်",
+       "blocklist-expiry": "သက်တမ်းကုန်လွန်မည်",
+       "blocklist-by": "ပတ်ပင်ထားသည့် အက်ဒမိန်",
+       "blocklist-params": "ပိတ်ပင်မှု ပါရာမီတာများ",
+       "blocklist-reason": "အကြောင်းပြချက်",
        "ipblocklist-submit": "ရှာဖွေရန်",
+       "ipblocklist-localblock": "ဒေသတွင်း ပိတ်ပင်",
        "ipblocklist-otherblocks": "အခြား ပိတ်ပင်ထားမှု{{PLURAL:$1|ခု|ခု}}",
        "infiniteblock": "အကန့်အသတ်မရှိ",
        "expiringblock": "$1 ရက် $2 အချိန်တွင် သက်တမ်းကုန်မည်",
+       "anononlyblock": "အမည်မသိများသာ",
        "noautoblockblock": "အလိုအလျောက်ပိတ်ပင်ခြင်းကို ပိတ်ထားရန်",
        "createaccountblock": "အကောင့်ဖန်တီးခြင်းကို ပိတ်ထားသည်",
        "emailblock": "အီးမေးကို ပိတ်ပင်ထားသည်",
        "blocklist-nousertalk": "မိမိ၏ဆွေးနွေးချက်စာမျက်နှာကို တည်းဖြတ်မရနိုင်ပါ",
        "ipblocklist-empty": "ပိတ်ပင်ထားမှုစာရင်းသည် ဗလာဖြစ်နေသည်။",
+       "ipblocklist-no-results": "တောင်းဆိုလိုက်သော အိုင်ပီလိပ်စာ သို့မဟုတ် အသုံးပြုသူအမည်ကို မပိတ်ပင်ထားပါ။",
        "blocklink": "ပိတ်ပင်",
        "unblocklink": "မပိတ်ပင်တော့ရန်",
        "change-blocklink": "စာကြောင်းအမည် ပြောင်းရန်",
        "contribslink": "ပံ့ပိုး",
+       "emaillink": "အီးမေးလ် ပို့",
+       "autoblocker": "အလိုအလျောက်ပိတ်ပင်ခဲ့သည်။ အကြောင်းမှာ သင်၏အိုင်ပီလိပ်စာအား  \"[[User:$1|$1]]\" မှ မကြာသေးခင်က အသုံးပြုခဲ့သည်။ $1 ၏ ပိတ်ပင်မှုအတွက် ပေးထားသော အကြောင်းပြချက်မှာ \"$2\" ဖြစ်သည်။",
        "blocklogpage": "ပိတ်ပင်တားဆီးမှု မှတ်တမ်း",
        "blocklog-showlog": "ဤအသုံးပြုသူအား ယခင်က ပိတ်ပင်ထားပြီး ဖြစ်သည်။\nပိတ်ပင်မှု မှတ်တမ်းအား ကိုးကားနိုင်ရန် အောက်တွင် ဖော်ပြထားသည်။",
        "blocklogentry": "သက်တမ်း $2 ဖြင့် [[$1]] ကို ပိတ်ပင်လိုက်သည် $3",
        "block-log-flags-noautoblock": "အလိုအလျောက်ပိတ်ပင်ခြင်းကို ပိတ်ထားသည်",
        "block-log-flags-noemail": "အီးမေးကို ပိတ်ပင်ထားသည်",
        "block-log-flags-nousertalk": "မိမိ၏ဆွေးနွေးချက်စာမျက်နှာကို တည်းဖြတ်မရနိုင်ပါ",
+       "block-log-flags-angry-autoblock": "အရည်အသွေးမြှင့် အလိုအလျောက်ပိတ်ပင်မှု လုပ်ဆောင်ခွင့်ပြုထားသည်",
        "block-log-flags-hiddenname": "အသုံးပြုသူအမည် ဝှက်ထားသည်",
+       "range_block_disabled": "အတိုင်းအတာ ပိတ်ပင်မှုဖန်တီးရန် အက်ဒမင်၏စွမ်းရည်မှာ ပိတ်ထားပါသည်။",
        "ipb_expiry_invalid": "သက်တမ်းကုန်လွန်မည့် အချိန်သည် တရားမဝင်ပါ။",
+       "ipb_expiry_old": "သက်တမ်းကုန်လွန်ချိန်မှာ အတိတ်တွင်ဖြစ်သည်။",
+       "ipb_expiry_temp": "ဝှက်ထားသော အသုံးပြုသူအမည်အတွက် ပိတ်ပင်မှုသည် အမြဲတမ်းဖြစ်ရမည်။",
        "ipb_already_blocked": "\"$1\" ကို ပိတ်ပင်ထားပြီး ဖြစ်သည်။",
        "ipb-needreblock": "$1 ကို ပိတ်ပင်ထားပြီး ဖြစ်သည်။ အပြင်အဆင်များကို ပြောင်းလဲလိုပါသလား?",
+       "ipb-otherblocks-header": "အခြား ပိတ်ပင်ထားမှု{{PLURAL:$1|ခု|ခု}}",
+       "unblock-hideuser": "ဤအသုံးပြုသူအား ပိတ်ပင်မှုမှ ပြန်ဖြေမပေးနိုင်ပါ၊ အကြောင်းမှာ သူတို့၏ အသုံးပြုသူအမည်ကို ဝှက်ထားသည်။",
+       "ip_range_invalid": "ဆီလျော်မှုမရှိသော အိုင်ပီအတိုင်းအတာ",
+       "ip_range_toolarge": "/$1 ထက် ပိုကြီးသော အတိုင်းအတာ ပိတ်ပင်မှုများကို ခွင့်မပြုပါ။",
+       "ip_range_exceeded": "အိုင်ပီအတိုင်းအတာသည် ယင်း၏အများဆုံးပမာဏထက် ကျော်လွန်နေသည်။ ခွင့်ပြုထားသော အတိုင်းအတာမှာ /$1 ဖြစ်သည်။",
+       "ip_range_toolow": "အိုင်ပီအတိုင်းအတာများသည် ခွင့်ပြုထားခြင်း မရှိပါ။",
        "proxyblocker": "ပရောက်ဆီ ပိတ်ပင်သူ",
+       "softblockrangesreason": "ဤအိုင်ပီလိပ်စာ ($1) မှ အမည်မသိ ပံ့ပိုးမှုများကို ခွင့်မပြုပါ။ ကျေးဇူးပြု၍ အကောင့်ထဲဝင်ပါ။",
+       "ipbblocked": "အခြားအသုံးပြုသူများကို သင် မပိတ်ပင်နိုင်ပါ။ အကြောင်းမှာ သင်ကိုယ်တိုင် မိမိကိုယ်ကို ပိတ်ပင်ခဲ့သောကြောင့်ဖြစ်သည်။",
+       "ipbnounblockself": "သင်ကိုယ်တိုင် မိမိကိုယ်ကို ပိတ်ပင်မှုမှ ပြန်မဖြေနိုင်ပါ။",
        "move-page": "$1 ကို ရွှေ့ရန်",
        "move-page-legend": "စာမျက်နှာကို ရွှေ့ပြောင်းရန်",
        "movepagetext": "အောက်ပါပုံစံကို အသုံးပြုခြင်းသည် စာမျက်နှာကို အမည်ပြောင်းလဲပေးမည် ဖြစ်ပြီး အမည်သစ်သို့ ယင်း၏ မှတ်တမ်းနှင့်တကွ ရွှေ့ပေးမည် ဖြစ်သည်။\nအမည်ဟောင်းသည် အမည်သစ်သို့ ပြန်ညွှန်းစာမျက်နှာ ဖြစ်လာမည်။\nသင်သည် မူလခေါင်းစဉ်သို့ ပြန်ညွှန်းများကို အလိုအလျောက် အပ်ဒိတ် update လုပ်နိုင်သည်။\nအကယ်၍ မပြုလုပ်လိုပါက [[Special:DoubleRedirects|နှစ်ဆင့်ပြန်ညွှန်းများ]] သို့မဟုတ် [[Special:BrokenRedirects|ပြန်ညွှန်း အပျက်များ]] ကို မှတ်သားရန် မမေ့ပါနှင့်။\nလင့်များ ညွှန်းလိုသည့် နေရာသို့ ညွှန်ပြနေရန် သင့်တွင် တာဝန် ရှိသည်။\n\nအကယ်၍ ခေါင်းစဉ်အသစ်တွင် စာမျက်နှာတစ်ခု ရှိနှင့်ပြီး ဖြစ်ပါက (သို့) ယင်းစာမျက်နှာသည် အလွတ်မဖြစ်ပါက (သို့) ပြန်ညွှန်းတစ်ခု မရှိပါက (သို့) ယခင်က ပြုပြင်ထားသော မှတ်တမ်း မရှိပါက စာမျက်နှာသည် <strong>ရွေ့မည်မဟုတ်</strong> သည်ကို သတိပြုပါ။ \nဆိုလိုသည်မှာ သင်သည် အမှားတစ်ခု ပြုလုပ်မိပါက စာမျက်နှာကို ယခင်အမည်ကို ပြန်လည် ပြောင်းလဲပေးနိုင်သည်။ ရှိပြီသားစာမျက်နှာတစ်ခုကို စာမျက်နှာ အသစ်နှင့် ပြန်အုပ် overwrite ခြင်း မပြုနိုင်။\n\n<strong>မှတ်ချက်။</strong>\nဤသည်မှာ လူဖတ်များသော စာမျက်နှာတစ်ခုဖြစ်ပါက မမျှော်လင့်ထားသော၊ ကြီးမားသော အပြောင်းအလဲတစ်ခု ဖြစ်ပေါ်လာနိုင်သည်။\nထို့ကြောင့် ဆက်လက် မဆောင်ရွက်မီ သင်သည် နောက်ဆက်တွဲ အကျိုးဆက်များကို နားလည်ကြောင်း ကျေးဇူးပြု၍ သေချာပါစေ။",
        "movepagetext-noredirectfixer": "အောက်ပါပုံစံကို အသုံးပြုခြင်းသည် စာမျက်နှာကို အမည်ပြောင်းလဲပေးမည် ဖြစ်ပြီး အမည်သစ်သို့ ယင်း၏ မှတ်တမ်းနှင့်တကွ ရွှေ့ပေးမည် ဖြစ်သည်။\n[[Special:DoubleRedirects|နှစ်ဆင့်ပြန်ညွှန်းများ]] သို့မဟုတ် [[Special:BrokenRedirects|ပြန်ညွှန်း အပျက်များ]] ကို စစ်ဆေးရန် မမေ့ပါနှင့်။\nလင့်ခ်များ ညွှန်းလိုသည့် နေရာသို့ ညွှန်ပြနေရန် သင့်တွင် တာဝန် ရှိသည်။\n\nအကယ်၍ ခေါင်းစဉ်အသစ်တွင် စာမျက်နှာတစ်ခု ရှိနေနှင့်ပြီး ပြန်ညွှန်းတစ်ခု မရှိပါက သို့မဟုတ် ယခင်က ပြုပြင်ထားသော မှတ်တမ်း ရှိနေပါက စာမျက်နှာသည် <strong>ရွေ့မည်မဟုတ်</strong> သည်ကို သတိပြုပါ။ \nဆိုလိုသည်မှာ သင်သည် အမှားတစ်ခု ပြုလုပ်မိပါက စာမျက်နှာကို ယခင်အမည်ကို ပြန်လည် ပြောင်းလဲပေးနိုင်သည်။ ရှိပြီသားစာမျက်နှာတစ်ခုကို စာမျက်နှာ အသစ်နှင့် ပြန်အုပ် overwrite ခြင်း မပြုနိုင်။\n\n<strong>မှတ်ချက်။</strong>\nဤသည်မှာ လူဖတ်များသော စာမျက်နှာတစ်ခုဖြစ်ပါက မမျှော်လင့်ထားသော၊ ကြီးမားသော အပြောင်းအလဲတစ်ခု ဖြစ်ပေါ်လာနိုင်သည်။\nထို့ကြောင့် ဆက်လက် မဆောင်ရွက်မီ သင်သည် နောက်ဆက်တွဲ အကျိုးဆက်များကို နားလည်ကြောင်း ကျေးဇူးပြု၍ သေချာပါစေ။",
        "movepagetalktext": "ဤအကွက်ကို အမှန်ခြစ်လိုက်ခြင်းဖြင့် ဗလာမဟုတ်သော ဆွေးနွေးချက်စာမျက်နှာသည် ရှိနှင့်ပြီး မဟုတ်လျှင် ဆက်နွယ်နေသော ဆွေးနွေးချက် စာမျက်နှာကို ခေါင်းစဉ်အသစ်သို့  အလိုအလျောက် ရွှေ့ပစ်မည် ဖြစ်သည်။\n\nဤကိစ္စရပ်တွင် သင် ဆန္ဒရှိလျှင် စာမျက်နှာကို မိမိကိုယ်တိုင် သွားရောက်ရွှေ့ပြောင်း ပေါင်းစပ်နိုင်သည်။",
+       "movenologintext": "စာမျက်နှာတစ်ခုကို ရွေ့ပြောင်းရန် သင့်အနေဖြင့် မှတ်ပုံတင်ထားသော အသုံးပြုသူနှင့် [[Special:UserLogin|အကောင့်ထဲဝင်]]ထားရပါမည်။",
+       "movenotallowed": "သင့်တွင် စာမျက်နှာများကို ရွေ့ပြောင်းရန် ခွင့်ပြုချက်မရှိပါ။",
+       "movenotallowedfile": "သင့်တွင် ဖိုင်များကို ရွေ့ပြောင်းရန် ခွင့်ပြုချက်မရှိပါ။",
+       "cant-move-user-page": "သင့်တွင် အသုံးပြုသူ စာမျက်နှာများကို ရွေ့ပြောင်းရန် ခွင့်ပြုချက်မရှိပါ။",
+       "cant-move-category-page": "သင့်တွင် ကဏ္ဍစာမျက်နှာများကို ရွေ့ပြောင်းရန် ခွင့်ပြုချက်မရှိပါ။",
+       "cant-move-to-category-page": "သင့်တွင် စာမျက်နှာမှ ကဏ္ဍစာမျက်နှာသို့ ရွေ့ပြောင်းရန် ခွင့်ပြုချက်မရှိပါ။",
+       "cant-move-subpages": "သင့်တွင် စာမျက်နှာခွဲများကို ရွေ့ပြောင်းရန် ခွင့်ပြုချက်မရှိပါ။",
        "newtitle": "ခေါင်းစဉ်အသစ်:",
        "move-watch": "မူရင်းစာမျက်နှာနှင့် ဦးတည်ထားသော စာမျက်နှာတို့ကို စောင့်ကြည့်ရန်",
        "movepagebtn": "စာမျက်နှာကို ရွှေ့ပြောင်းရန်",
        "movepage-moved-redirect": "ပြန်ညွှန်းတစ်ခုကို ဖန်တီးပြီးဖြစ်သည်။",
        "movepage-moved-noredirect": "ပြန်ညွှန်းဖန်တီးခြင်းအား ချေဖျက်ပြီး ဖြစ်သည်။",
        "articleexists": "ထိုအမည်ဖြင့် စာမျက်နှာတစ်ခု ရှိနှင့်ပြီးဖြစ်သည် (သို့) သင်ရွေးလိုက်သော အမည်သည် တရားမဝင်ပါ။\nကျေးဇူးပြု၍ အခြားအမည်တစ်ခုကို ရွေးပေးပါ။",
+       "cantmove-titleprotected": "ဤနေရာသို့ စာမျက်နှာတစ်ခုကို ဖန်တီးရန် ခွင့်ပြုချက်မရှိပါ၊ အကြောင်းမှာ ခေါင်းစဉ်သစ်ကို ဖန်တီးခြင်းမှ ကာကွယ်ခဲ့သောကြောင့်ဖြစ်သည်။",
        "movetalk": "ယှက်နွယ်နေသော ဆွေးနွေးချက်စာမျက်နှာများကို ရွှေ့ရန်",
+       "move-subpages": "စာမျက်နှာခွဲများကို ရွေ့ပြောင်းရန် ($1 ထက်ပို၍)",
+       "move-talk-subpages": "ဆွေးနွေးစာမျက်နှာ၏ စာမျက်နှာခွဲများကို ရွေ့ပြောင်းရန် ($1 ထက်ပို၍)",
        "movepage-page-moved": "စာမျက်နှာ $1 ကို $2 သို့ ရွှေ့ပြီးပြီ ဖြစ်သည်။",
        "movepage-page-unmoved": "စာမျက်နှာ $1 ကို $2 သို့ ရွှေ့မရနိုင်ပါ။",
        "movelogpage": "ရွှေ့ပြောင်းခြင်း မှတ်တမ်း",
        "movelogpagetext": "အောက်ပါတို့သည် စာမျက်နှာ ရွေ့ပြောင်းမှုများ အားလုံး စာရင်း ဖြစ်သည်။",
        "movesubpage": "{{PLURAL:$1|စာမျက်နှာခွဲ|စာမျက်နှာခွဲများ}}",
+       "movenosubpage": "ဤစာမျက်နှာတွင် စာမျက်နှာခွဲများ မရှိပါ။",
        "movereason": "အ​ကြောင်း​ပြ​ချက် -",
        "revertmove": "ပြောင်းရန်",
        "delete_and_move_confirm": "ဟုတ်ပါသည်။ စာမျက်နှာကို ဖျက်ပါ။",
        "allmessages-filter-all": "အားလုံး",
        "allmessages-filter-modified": "ပြုပြင်ထားသော",
        "allmessages-language": "ဘာသာစကား:",
-       "allmessages-filter-submit": "သွား",
+       "allmessages-filter-submit": "သွားပါ",
+       "allmessages-filter-translate": "ဘာသာပြန်ပါ",
        "thumbnail-more": "ပုံကြီးချဲ့ရန်",
        "filemissing": "ဖိုင်ပျောက်နေသည်",
        "thumbnail_error": "ပုံစံငယ်ဖန်တီးရာတွင် အမှားပြနေသည် - $1",
+       "thumbnail_error_remote": "$1 မှ အမှားမက်ဆေ့: $2",
        "import": "စာမျက်နှာများထည့်သွင်းရန်",
        "import-interwiki-submit": "တင်သွင်းရန်",
        "import-upload-filename": "ဖိုင်အမည် -",
        "importlogpage": "ထည့်သွင်းသည့် မှတ်တမ်း",
        "tooltip-pt-userpage": "{{GENDER:|သင်၏ အသုံးပြုသူ}} စာမျက်နှာ",
        "tooltip-pt-mytalk": "{{GENDER:|သင်၏}} ဆွေးနွေးချက်စာမျက်နှာ",
+       "tooltip-pt-anontalk": "ဤအိုင်ပီလိပ်စာမှ တည်းဖြတ်မှုများအကြောင်း ဆွေးနွေးချက်",
        "tooltip-pt-preferences": "{{GENDER:|သင်၏}} ရွေးချယ်စရာများ",
        "tooltip-pt-watchlist": "အပြောင်းအလဲများအတွက် စောင့်ကြည့်နေသော စာမျက်နှာများ၏ စာရင်း",
        "tooltip-pt-mycontris": "{{GENDER:|သင်၏}} ဆောင်ရွက်ချက်များ စာရင်း",
+       "tooltip-pt-anoncontribs": "ဤအိုင်ပီလိပ်စာမှ ပြုလုပ်ထားသော တည်းဖြတ်မှုများ၏ စာရင်း",
        "tooltip-pt-login": "သင့်အား အကောင့်ဝင်ရန် တိုက်တွန်းပါသည်။ သို့သော် မဖြစ်မနေ လုပ်ဆောင်ရန် မဟုတ်ပါ။",
+       "tooltip-pt-login-private": "ဤဝီကီကို အသုံးပြုရန် အကောင့်ထဲဝင်ဖို့ လိုအပ်သည်",
        "tooltip-pt-logout": "ထွက်​ပါ​",
        "tooltip-pt-createaccount": "အကောင့်တစ်ခုကို ဖန်တီးပြီး ဝင်ရောက်ရန် သင့်အား တိုက်တွန်းပါသည်။ သို့သော် မဖြစ်မနေ မဟုတ်ပါ။",
        "tooltip-ca-talk": "မာတိကာ စာမျက်နှာအတွက် ဆွေးနွေးချက်များ",
        "tooltip-feed-atom": "ဤစာမျက်နှာအတွက် Atom feed",
        "tooltip-t-contributions": "{{GENDER:$1|ဤအသုံးပြုသူ}}၏ ဆောင်ရွက်ချက်များ စာရင်း",
        "tooltip-t-emailuser": "{{GENDER:$1|ဤအသုံးပြုသူထံ}} အီးမေးပေးပို့ရန်",
-       "tooltip-t-upload": "ဖိုင်တင်ရန်",
+       "tooltip-t-info": "ဤစာမျက်နှာအကြောင်း အချက်အလက်ပို၍",
+       "tooltip-t-upload": "ဖိုင်များတင်ရန်",
        "tooltip-t-specialpages": "အထူး စာမျက်နှာများအားလုံး စာရင်း",
        "tooltip-t-print": "ဤစာမျက်နှာ၏ ပရင့်ထုတ်နိုင်သောမူ",
        "tooltip-t-permalink": "ယခုမူအတွက် ပုံသေလိပ်စာ",
        "tooltip-ca-nstab-category": "ကဏ္ဍများကို ကြည့်ရန်",
        "tooltip-minoredit": "အရေးမကြီးသော တည်းဖြတ်မှုအဖြစ် မှတ်သားရန်",
        "tooltip-save": "ပြောင်းလဲထားသည်များကို သိမ်းရန်",
+       "tooltip-publish": "သင်၏ပြောင်းလဲမှုများကို လွှင့်တင်ရန်",
        "tooltip-preview": "သင်ပြင်ထားသည်များကို နမူနာကြည့်ရန်ဖြစ်သည်။ ကျေးဇူးပြု၍ မသိမ်းခင် သုံးပေးပါ။",
        "tooltip-diff": "ဘယ်စာသား ​ပြောင်းလိုက်သည်ကို ြပရန်",
        "tooltip-compareselectedversions": "ရွေးချယ်ထားသော မူနှစ်ခု၏ ကွဲပြားချက်များကို ကြည့်ရန်",
        "tooltip-watch": "ဤစာမျက်နှာကို စောင့်ကြည့်စာရင်းသို့ ပေါင်းထည့်ရန်",
+       "tooltip-watchlistedit-normal-submit": "ခေါင်းစဉ်များကို ဖယ်ရှားရန်",
+       "tooltip-watchlistedit-raw-submit": "စောင့်ကြည့်စာရင်းကို မွမ်းမံရန်",
        "tooltip-recreate": "စာမျက်နှာကို ဖျက်ပစ်လိုက်လျှင်သော်မှ ပြန်လည်ဖန်တီးပါ",
        "tooltip-upload": "Upload တင်ခြင်း စတင်ရန်",
        "tooltip-rollback": "\"နောက်ပြန် ပြန်သွားခြင်း\" သည် ဤစာမျက်နှာ၏ နောက်ဆုံး တည်းဖြတ်မူသို့ ကလစ် တစ်ချက်ဖြင့် ပြန်ပြောင်းပေးသည်။",
        "tooltip-undo": "\"နောက်ပြန် ပြန်သွားခြင်း\" သည် ဤ တည်းဖြတ်ခြင်းကို နောက်ပြန်ပြန်ဆုတ်ပြီး နမူနာပုံနှင့်တကွ တည်းဖြတ်ရန် ပြန်ဖွင့်မည် ဖြစ်သည်။ အဘယ်ကြောင့် နောက်ပြန်သွားသည်ကို အကျဉ်းချုပ် အကြောင်းပြချက် ရေးနိုင်သည်။",
        "tooltip-preferences-save": "ရေးချယ်စရာများကို သိမ်းရန်",
        "tooltip-summary": "အတိုချုပ်ထည့်ရန်",
+       "anonymous": "{{SITENAME}} ၏ အမည်မသိ {{PLURAL:$1|အသုံးပြုသူ|အသုံးပြုသူများ}}",
+       "siteuser": "{{SITENAME}} အသုံးပြုသူ $1",
+       "anonuser": "{{SITENAME}} အမည်မသိ အသုံးပြုသူ $1",
+       "lastmodifiedatby": "ဤစာမျက်နှာကို $1၊ $2 အချိန်တွင် $3 က နောက်ဆုံး ပြင်ဆင်ခဲ့သည်။",
        "others": "အခြား",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|အသုံးပြုသူ}}|အသုံးပြုသူများ}} $1",
+       "anonusers": "{{SITENAME}} အမည်မသိ {{PLURAL:$2|အသုံးပြုသူ|အသုံးပြုသူများ}} $1",
+       "spamprotectiontitle": "စပန်း ကာကွယ်ခြင်း စိစစ်မှု",
        "simpleantispam-label": "Anti-spam စစ်ဆေးခြင်း။\nဤအရာအား <strong>မဖြည့်ပါနှင့်</strong>!",
        "pageinfo-title": "\"$1\" အတွက် အချက်အလက်များ",
        "pageinfo-header-basic": "အခြေခံသတင်းအချက်အလက်",
        "pageinfo-length": "စာမျက်နှာ အလျား (ဘိုက်ဖြင့်)",
        "pageinfo-article-id": "စာမျက်နှာ အိုင်ဒီ",
        "pageinfo-language": "စာမျက်နှာ စာကိုယ် ဘာသာစကား",
+       "pageinfo-language-change": "ပြောင်းလဲရန်",
        "pageinfo-content-model": "စာမျက်နှာ မာတိကာမော်ဒယ်",
+       "pageinfo-content-model-change": "ပြောင်းလဲရန်",
        "pageinfo-robot-policy": "စက်ရုပ်များမှ index ပြုလုပ်ခြင်း",
        "pageinfo-robot-index": "ခွင့်ပြုပြီး",
        "pageinfo-robot-noindex": "ခွင့်မပြုထားပါ",
        "pageinfo-toolboxlink": "စာမျက်နှာ အချက်အလက်များ",
        "pageinfo-contentpage": "မာတိကစာမျက်နှာအဖြစ် ရေတွက်ပြီး",
        "pageinfo-contentpage-yes": "မှန်",
+       "pageinfo-category-info": "ကဏ္ဍ သတင်းအချက်အလက်",
+       "pageinfo-category-total": "အဖွဲ့ဝင်များ စုစုပေါင်းအရေအတွက်",
+       "pageinfo-category-pages": "စာမျက်နှာများ အရေအတွက်",
+       "pageinfo-category-subcats": "ကဏ္ဍခွဲများ အရေအတွက်",
+       "pageinfo-category-files": "ဖိုင်များ အရေအတွက်",
+       "pageinfo-user-id": "အသုံးပြုသူ အိုင်ဒီ",
        "markaspatrolleddiff": "စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားရန်",
        "markaspatrolledtext": "ဤစာမျက်နှာအား စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားရန်",
+       "markaspatrolledtext-file": "ဤဖိုင်ဗားရှင်းအား စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားရန်",
        "markedaspatrolled": "စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားပြီး",
        "markedaspatrolledtext": "[[:$1]] ၏ ရွေးချယ်ထားသော တည်းဖြတ်မူကို စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားပြီးပါပြီ။",
+       "markedaspatrollederror": "စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မမှတ်သားနိုင်ပါ",
+       "markedaspatrollederror-noautopatrol": "သင်၏ကိုယ်ပိုင် ပြောင်းလဲမှုများကို စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားရန် ခွင့်မပြုပါ။",
        "markedaspatrollednotify": "$1 သို့ ဤပြောင်းလဲမှုအား စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားပြီးပါပြီ။",
+       "markedaspatrollederrornotify": "စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားခြင်း မအောင်မြင်ပါ",
        "patrol-log-page": "စောင့်ကြပ်စစ်ဆေးမှု မှတ်တမ်း",
+       "patrol-log-header": "ဤသည် စောင့်ကြပ်စစ်ဆေးထားသော ပြန်လည်ပြင်ဆင်မှုများ၏ မှတ်တမ်းဖြစ်သည်။",
+       "confirm-markpatrolled-button": "အိုကေ",
+       "confirm-markpatrolled-top": "$2 ၏ $3 အား စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားမည်လော။",
        "filedeleteerror-short": "ဖိုင်ဖျက်ရာတွင် အမှားအယွင်း - $1",
        "previousdiff": "← တည်းဖြတ်မူ အဟောင်း",
        "nextdiff": "ပိုသစ်သော တည်းဖြတ်မှု",
        "newimages": "ပုံအသစ်များပြခန်း",
        "newimages-legend": "စိစစ်မှု",
        "newimages-label": "ဖိုင်အမည် (သို့ ယင်း၏အစိတ်အပိုင်း) -",
+       "newimages-user": "အိုင်ပီလိပ်စာ သို့ အသုံးပြုသူအမည်",
+       "newimages-newbies": "အကောင့်အသစ်များ၏ ပံ့ပိုးမှုများကိုသာ ပြရန်",
+       "newimages-mediatype": "မီဒီယာ အမျိုးအစား:",
        "noimages": "ကြည့်စရာဘာမှ မရှိပါ။",
        "ilsubmit": "ရှာဖွေရန်",
        "bydate": "ရက်စွဲဖြင့်",
        "sp-newimages-showfrom": "$1 နေ့ $2 အချိန်ကစသော ဖိုင်အသစ်များကို ပြရန်",
+       "seconds": "{{PLURAL:$1|$1 စက္ကန့်|$1 စက္ကန့်}}",
+       "minutes": "{{PLURAL:$1|$1 မိနစ်|$1 မိနစ်}}",
+       "hours": "{{PLURAL:$1|$1 နာရီ|$1 နာရီ}}",
+       "days": "{{PLURAL:$1|$1 ရက်|$1 ရက်}}",
+       "weeks": "{{PLURAL:$1|$1 ပတ်|$1 ပတ်}}",
+       "months": "{{PLURAL:$1|$1 လ|$1 လ}}",
+       "years": "{{PLURAL:$1|$1 နှစ်|$1 နှစ်}}",
        "ago": "$1 အကြာက",
        "just-now": "ယခုလေးတင်",
+       "hours-ago": "$1 {{PLURAL:$1|နာရီ|နာရီ}}အကြာက",
+       "minutes-ago": "$1 {{PLURAL:$1|မိနစ်|မိနစ်}} အကြာက",
+       "seconds-ago": "$1 {{PLURAL:$1|စက္ကန့်|စက္ကန့်}} အကြာက",
+       "monday-at": "တနင်္လာနေ့က $1",
+       "tuesday-at": "အင်္ဂါနေ့က $1",
+       "wednesday-at": "ဗုဒ္ဓဟူးနေ့က $1",
+       "thursday-at": "ကြာသပတေးနေ့က $1",
+       "friday-at": "သောကြာနေ့က $1",
+       "saturday-at": "စနေနေ့က $1",
+       "sunday-at": "တနင်္ဂနွေနေ့က $1",
+       "yesterday-at": "မနေ့က $1",
        "bad_image_list": "ဖောမတ်ပုံစံမှာ အောက်ပါအတိုင်းဖြစ်သည်။\n\nစာရင်းတွင်ထည့်သွင်းထားသော အရာများကိုသာ ထည့်သွင်းစဉ်းစားမည်။ (ခရေပွင့် * ဖြင့်စသော စာကြောင်းများ)\nစာကြောင်း၏ ပထမဆုံး လင့်သည် ဖိုင်ညံ့ ဖြစ်ရမည်။\nယင်းစာကြောင်းတွင်ပင် နောက်ထပ်လာသောလင့်များကို ချွင်းချက်အဖြစ် စဉ်းစားမည်။ ဆိုလိုသည်မှာ ၎င်းလင့်များတွင်လည်း အဆိုပါ ဖိုင်ညံ့ ပါကောင်း ပါဝင်နေမည်။",
-       "metadata": "Metadata",
+       "metadata": "မီတာဒေတာ",
        "metadata-help": "ဤဖိုင်တွင် သတင်းအချက်အလက် အပိုများ ပါဝင်သည်။ ဒီဂျစ်တယ် ကင်မရာ သို့ စကင်နာများက ထည့်ပေါင်းပေးလိုက်ခြင်း ဖြစ်ကောင်းဖြစ်မည်။\nအကယ်၍ ဖိုင်ကို မူရင်းအခြေအနေမှ ပြုပြင်လိုက်ပါက အသေးစိတ်အချို့သည် ပြုပြင်ထားသောဖိုင်တွင် အပြည့်အစုံ ပြန်ပါလာမည်မဟုတ်။",
        "metadata-expand": "ချဲ့ထားသော အသေးစိတ်များကို ပြရန်",
        "metadata-collapse": "ချဲ့ထားသော အသေးစိတ်များကို ပြရန်",
        "exif-gpslatitude": "လတ္တီကျု",
        "exif-gpslongitude": "လောင်ဂျီကျု",
        "exif-gpsaltitude": "အမြင့်",
+       "exif-gpsimgdirection": "ရုပ်ပုံ၏ လမ်းကြောင်း",
        "exif-gpsdatestamp": "ဂျီပီအက်စ်ရက်စွဲ",
+       "exif-objectname": "ခေါင်းစဉ်တို",
+       "exif-contact": "ဆက်သွယ်ရန် လိပ်စာ",
        "exif-languagecode": "ဘာသာစကား",
+       "exif-iimcategory": "ကဏ္ဍ",
+       "exif-cameraownername": "ကင်မရာပိုင်ရှင်",
+       "exif-copyrighted": "မူပိုင်ခွင့် အခြေအနေ",
+       "exif-copyrightowner": "မူပိုင်ခွင့်ပိုင်ရှင်",
+       "exif-disclaimer": "သတိပြုစရာ",
+       "exif-contentwarning": "အကြောင်းအရာ သတိပေးချက်",
        "exif-orientation-1": "ပုံမှန်",
        "exif-componentsconfiguration-0": "မတည်ရှိပါ",
        "exif-subjectdistance-value": "$1 မီတာ",
        "exif-contrast-2": "အပြင်း",
        "exif-saturation-0": "သာမန်",
        "exif-sharpness-0": "ပုံမှန်",
+       "exif-subjectdistancerange-0": "မသိရှိပါ",
        "exif-subjectdistancerange-1": "မက်ကရို",
+       "exif-subjectdistancerange-2": "အနီးကြည့်",
+       "exif-subjectdistancerange-3": "အဝေးကြည့်",
+       "exif-gpslatitude-n": "မြောက်လတ္တီကျု",
+       "exif-gpslatitude-s": "တောင်လတ္တီကျု",
+       "exif-gpslongitude-e": "အရှေ့လောင်ဂျီကျု",
        "exif-gpslongitude-w": "အနောက်လောင်ဂျီကျု",
+       "exif-gpsaltitude-above-sealevel": "ပင်လယ်ရေမျက်နှာပြင်အမြင့် $1 {{PLURAL:$1|မီတာ|မီတာ}}",
+       "exif-gpsaltitude-below-sealevel": "ပင်လယ်ရေမျက်နှာပြင်အောက် $1 {{PLURAL:$1|မီတာ|မီတာ}}",
+       "exif-gpsmeasuremode-2": "နှစ်ဖက်မြင် အတိုင်းအတာ",
+       "exif-gpsmeasuremode-3": "သုံးဖက်မြင် အတိုင်းအတာ",
+       "exif-gpsspeed-k": "တစ်နာရီလျင် ကီလိုမီတာနှုန်း",
        "exif-gpsspeed-m": "တစ်နာရီလျှင် ရှိသည့် မိုင်နှုန်း",
+       "exif-gpsspeed-n": "တစ်နာရီလျင် ရေမိုင်နှုန်း",
+       "exif-gpsdestdistance-k": "ကီလိုမီတာ",
+       "exif-gpsdestdistance-m": "မိုင်",
+       "exif-gpsdestdistance-n": "ရေမိုင်",
+       "exif-gpsdop-excellent": "အထူးကောင်း ($1)",
+       "exif-gpsdop-good": "ကောင်း ($1)",
+       "exif-gpsdop-moderate": "အလယ်အလတ် ($1)",
+       "exif-gpsdop-fair": "အတော်အသင့် ($1)",
+       "exif-gpsdop-poor": "ညံ့ဖျင်း ($1)",
+       "exif-objectcycle-a": "မနက်ပိုင်းသာ",
+       "exif-objectcycle-p": "ညနေပိုင်းသာ",
+       "exif-gpsdirection-m": "သံလိုက်လမ်းကြောင်း",
        "exif-dc-contributor": "ဆောင်ရွက်ပေးထားသူများ",
+       "exif-dc-source": "ရင်းမြစ် မီဒီယာ",
+       "exif-dc-type": "မီဒီယာ အမျိုးအစား",
+       "exif-iimcategory-ace": "အနုပညာ၊ ယဥ်ကျေးမှုနှင့် ဖြေဖျော်ရေး",
+       "exif-iimcategory-clj": "ရာဇဝတ်မှုနှင့် ဥပဒေ",
+       "exif-iimcategory-dis": "ဘေးအန္တရာယ်များနှင့် မတော်တဆမှုများ",
+       "exif-iimcategory-fin": "စီးပွားရေးနှင့် စီးပွားရေးလုပ်ငန်း",
        "exif-iimcategory-edu": "ပညာရေး",
        "exif-iimcategory-evn": "ပတ်ဝန်းကျင်",
        "exif-iimcategory-hth": "ကျန်းမာရေး",
+       "exif-iimcategory-lab": "အလုပ်အကိုင်",
        "exif-iimcategory-pol": "နိုင်ငံရေး",
+       "exif-iimcategory-rel": "ဘာသာရေးနှင့် ယုံကြည်မှု",
        "exif-iimcategory-sci": "သိပ္ပံနှင့် နည်းပညာ",
        "exif-iimcategory-spo": "အားကစား",
+       "exif-iimcategory-wea": "ရာသီဥတု",
+       "exif-urgency-normal": "ပုံမှန် ($1)",
+       "exif-urgency-low": "နိမ့် ($1)",
+       "exif-urgency-high": "မြင့် ($1)",
        "namespacesall": "အားလုံး",
        "monthsall": "အားလုံး",
        "confirmemail": "အီးမေးကိုအတည်ပြုပါ",
        "confirmemail_send": "အတည်ပြုချက်ကုတ်ကို အီးမေးပို့ပေးရန်",
+       "confirmemail_sent": "အတည်ပြုချက် အီးမေးလ် ပို့ပြီး",
+       "confirmemail_needlogin": "သင်၏ အီးမေးလ်လိပ်စာကို အတည်ပြုရန် $1 ပါ။",
+       "confirmemail_loggedin": "သင်၏ အီးမေးလ်လိပ်စာ အတည်ပြုပြီးပါပြီ။",
+       "confirmemail_subject": "{{SITENAME}} အီးမေးလ်လိပ်စာ အတည်ပြုချက်",
+       "invalidateemail": "အီးမေးလ် အတည်ပြုခြင်းကို ပယ်ဖျက်ရန်",
+       "notificationemail_subject_changed": "{{SITENAME}} မှတ်ပုံတင်ထားသော အီးမေးလ်လိပ်စာကို ပြောင်းလဲလိုက်သည်",
+       "notificationemail_subject_removed": "{{SITENAME}} မှတ်ပုံတင်ထားသော အီးမေးလ်လိပ်စာကို ဖယ်ရှားလိုက်သည်",
+       "deletedwhileediting": "<strong>သတိပေးချက်:</strong> ဤစာမျက်နှာကို သင် စတင်တည်းဖြတ်ပြီးနောက် ဖျက်ပစ်ခဲ့သည်။",
        "recreate": "ပြန်လည်ဖန်တီးရန်",
        "confirm_purge_button": "အိုကေ",
        "confirm-purge-top": "ဤစာမျက်နှာ၏ cache အား ရှင်းလင်းမည်လော?",
+       "confirm-watch-button": "အိုကေ",
+       "confirm-watch-top": "ဤစာမျက်နှာကို သင်၏စောင့်ကြည့်စာရင်းသို့ ပေါင်းထည့်မည်လော",
+       "confirm-unwatch-button": "အိုကေ",
+       "confirm-unwatch-top": "ဤစာမျက်နှာကို သင်၏စောင့်ကြည့်စာရင်းမှ ဖယ်ရှားမည်လော",
+       "confirm-rollback-button": "အိုကေ",
        "imgmultipageprev": "← ပြီးခဲ့သော စာမျက်နှာ",
        "imgmultipagenext": "နောက်စာမျက်နှာ →",
        "imgmultigo": "သွားပါ!",
        "imgmultigoto": "စာမျက်နှာ $1 ကို သွားရန်",
        "img-lang-default": "(ပင်မ ဘာသာစကား)",
+       "img-lang-go": "သွားပါ",
+       "ascending_abbrev": "ငယ်စဉ်ကြီးလိုက်",
+       "descending_abbrev": "ကြီးစဉ်ငယ်လိုက်",
        "table_pager_next": "နောက်စာမျက်နှာ",
        "table_pager_prev": "ပြီးခဲ့သော စာမျက်နှာ",
        "table_pager_first": "ပထမဆုံး စာမျက်နှာ",
        "table_pager_last": "နောက်ဆုံးစာမျက်နှာ",
+       "table_pager_limit": "စာမျက်နှာအလိုက် အကြောင်းအရာ $1 ကိုပြရန်",
+       "table_pager_limit_label": "စာမျက်နှာအလိုက် အကြောင်းအရာများ:",
        "table_pager_limit_submit": "သွားပါ",
        "table_pager_empty": "မည်သည့်ရလဒ်မှ မရှိပါ",
        "autosumm-blank": "စာမျက်နှာကို ဗလာလုပ်လိုက်သည်",
+       "autosumm-replace": "အကြောင်းအရာ \"$1\" ဖြင့် အစားထိုးခဲ့သည်",
        "autoredircomment": "စာမျက်နှာကို [[$1]] သို့ ပြန်ညွှန်းလိုက်သည်",
+       "autosumm-removed-redirect": "[[$1]] သို့ ပြန်ညွှန်းကို ဖယ်ရှားခဲ့သည်",
        "autosumm-changed-redirect-target": "ပြန်ညွှန်းကို [[$1]] မှ [[$2]] သို့ ပြောင်းလဲခဲ့သည်",
        "autosumm-new": "\"$1\" အစချီသော စာလုံးတို့နှင့် စာမျက်နှာကို ဖန်တီးလိုက်သည်",
+       "autosumm-newblank": "ဗလာစာမျက်နှာကို ဖန်တီးခဲ့သည်",
        "size-bytes": "$1 {{PLURAL:$1|ဘိုက်|ဘိုက်}}",
        "watchlistedit-normal-title": "စောင့်ကြည့်စာရင်းကို တည်းဖြတ်ရန်",
        "watchlistedit-normal-legend": "စောင့်ကြည့်စာရင်းမှ ခေါင်းစဉ်များကို ဖျက်ရန်",
        "watchlistedit-normal-submit": "ခေါင်းစဉ်များကို ဖယ်ရှားရန်",
        "watchlistedit-normal-done": "{{PLURAL:$1|ခေါင်းစဉ်တစ်ခု|ခေါင်းစဉ် $1 ခုတို့}}ကို သင်၏ စောင့်ကြည့်စာရင်းမှ ဖယ်ရှားပြီးပြီ:",
        "watchlistedit-raw-titles": "ခေါင်းစဉ်များ -",
+       "watchlistedit-raw-submit": "စောင့်ကြည့်စာရင်းကို မွမ်းမံရန်",
+       "watchlistedit-raw-done": "သင်၏ စောင့်ကြည့်စာရင်းကို မွမ်းမံပြီးဖြစ်သည်။",
+       "watchlistedit-raw-added": "ခေါင်းစဉ် {{PLURAL:$1|၁ ခု|$1 ခု}} ပေါင်းထည့်ခဲ့သည်:",
+       "watchlistedit-raw-removed": "ခေါင်းစဉ် {{PLURAL:$1|၁ ခု|$1 ခု}} ဖယ်ရှားခဲ့သည်:",
+       "watchlistedit-clear-title": "စောင့်ကြည့်စာရင်းကို ရှင်းလင်းရန်",
+       "watchlistedit-clear-legend": "စောင့်ကြည့်စာရင်းကို ရှင်းလင်းရန်",
+       "watchlistedit-clear-explain": "သင်၏ စောင့်ကြည့်စာရင်းမှ ဆောင်းပါးများအားလုံး ဖယ်ရှားသွားပါလိမ့်မည်",
+       "watchlistedit-clear-titles": "ခေါင်းစဉ်များ -",
+       "watchlistedit-clear-submit": "စောင့်ကြည့်စာရင်းအား ရှင်းလင်းရန် (ဤသည် အမြဲတမ်း)",
+       "watchlistedit-clear-done": "သင်၏ စောင့်ကြည့်စာရင်းကို ရှင်းလင်းပြီးဖြစ်သည်။",
+       "watchlistedit-clear-jobqueue": "သင်၏ စောင့်ကြည့်စာရင်းကို ရှင်းလင်းနေသည်။ အချိန်အချို့ ကြာနိုင်ပါသည်။",
+       "watchlistedit-clear-removed": "ခေါင်းစဉ် {{PLURAL:$1|၁ ခု|$1 ခု}} ဖယ်ရှားခဲ့သည်:",
+       "watchlistedit-too-many": "ဤနေရာတွင် ပြသရန် စာမျက်နှာများ အများအပြားရှိသည်။",
        "watchlisttools-clear": "စောင့်ကြည့်စာရင်းကို ရှင်းလင်းရန်",
        "watchlisttools-view": "ကိုက်ညီသော အပြောင်းအလဲများကို ကြည့်ရန်",
        "watchlisttools-edit": "စောင့်ကြည့်စာရင်းများကို ကြည့်ပြီး တည်းဖြတ်ပါ။",
        "watchlisttools-raw": "စောင့်ကြည့်စာရင်း အကြမ်းကို တည်းဖြတ်ရန်",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ဆွေးနွေး]])",
+       "timezone-local": "ဒေသတွင်း",
        "duplicate-defaultsort": "'''သတိပေးချက် -''' ပုံမှန် sort key \"$2\" oသည် ယခင်ပုံမှန်ဖြစ်သော sort key \"$1\" ကို override ထပ်ရေးမည်ဖြစ်သည်.",
        "version": "ဗားရှင်း",
        "version-specialpages": "အထူး စာမျက်နှာများ",
        "version-other": "အခြား",
+       "version-no-ext-name": "[အမည်မရှိ]",
        "version-license": "မီဒီယာဝီကီ လိုင်စင်",
+       "version-ext-license": "လိုင်စင်",
+       "version-skin-colheader-name": "အသွင်အပြင်",
+       "version-ext-colheader-version": "ဗားရှင်း",
+       "version-ext-colheader-license": "လိုင်စင်",
+       "version-ext-colheader-description": "ဖော်ပြချက်",
+       "version-ext-colheader-credits": "စာရေးသူများ",
+       "version-license-title": "$1 အတွက် လိုင်စင်",
+       "version-poweredby-others": "အခြားသော",
+       "version-poweredby-translators": "translatewiki.net ဘာသာပြန်သူများ",
        "version-software": "သွင်းထားသော ဆော့ဝဲ",
        "version-software-product": "ထုတ်ကုန်",
        "version-software-version": "ဗားရှင်း",
+       "version-libraries-version": "ဗားရှင်း",
+       "version-libraries-license": "လိုင်စင်",
+       "version-libraries-description": "ဖော်ပြချက်",
        "redirect": "ဖိုင်၊ အသုံးပြုသူ၊ စာမျက်နှာ၊ တည်းဖြတ်မူ၊ သို့မဟုတ် မှတ်တမ်းအိုင်ဒီ မှ ပြန်ညွှန်းသည်",
        "redirect-summary": "ဤအထူးစာမျက်နှာသည် ဖိုင်တစ်ခု (ပေးထားသော ဖိုင်အမည်)၊ စာမျက်နှာတစ်ခု (ပေးထားသော တည်းဖြတ်မူအိုင်ဒီ သို့ စာမျက်နှာအိုင်ဒီ)၊ အသုံးပြုသူစာမျက်နှာတစ်ခု (ပေးထားသော အသုံးပြုသူဂဏန်းအိုင်ဒီ)၊ သို့မဟုတ် မှတ်တမ်းတစ်ခု (ပေးထားသော မှတ်တမ်းအိုင်ဒီ) ဆီသို့ ပြန်ညွှန်းသည်။ အသုံးပြုပုံ - [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], သို့မဟုတ် [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "သွားပါ",
        "specialpages-note-restricted": "* ပုံမှန် အထူးစာမျက်နှာများ။\n* <span class=\"mw-specialpagerestricted\">ကန့်သတ်ထားသော အထူးစာမျက်နှာများ။</span>",
        "specialpages-group-maintenance": "ထိန်းသိမ်းမှု အစီရင်ခံချက်များ",
        "specialpages-group-other": "အခြားအထူးစာမျက်နှာများ",
-       "specialpages-group-login": "Log in ဝင်ရန်/ အကောင့် ဖန်တီးရန်",
+       "specialpages-group-login": "အကောင့်ဝင်ရန် / ဖန်တီးရန်",
        "specialpages-group-changes": "လတ်တလော အပြောင်းအလဲနှင့် မှတ်တမ်းများ",
        "specialpages-group-media": "မီဒီယာ အစီရင်ခံချက်များနှင့် Upload တင်ထားသည်များ",
        "specialpages-group-users": "အသုံးပြုသူများနှင့် အခွင့်အရေးများ",
        "specialpages-group-wiki": "ဒေတာနှင့် ကိရိယာများ",
        "specialpages-group-redirects": "အထူးစာမျက်နှာများကို ပြန်ညွှန်းနေသည်",
        "specialpages-group-spam": "စပမ်းကိရိယာများ",
+       "specialpages-group-developer": "ဆော့ဝဲလ်တီထွင်သူ ကိရိယာများ",
        "blankpage": "ဗလာစာမျက်နှာ",
        "intentionallyblankpage": "ဤစာမျက်နှာသည် တမင်ရည်ရွယ်ချက်ရှိရှိ ဗလာထားခဲ့ခြင်း ဖြစ်သည်။",
        "external_image_whitelist": " #ဤစာကြောင်းကို ဤအတိုင်းထားပါ<pre>\n#regular expression fragments ကို(// နှစ်ခုကြားရှိ အစိတ်အပိုင်းသာ) အောက်တွင်ထားပါ\n#ယင်းတို့ကို external (hotlinked) ပုံတို့၏URL များနှင့် တွဲညှိပေးမည်ဖြစ်သည်\n#ကိုက်ညီသည်များကို ပုံအဖြစ်ပြမည်ဖြစ်ပြီး မကိုက်ညီပါက ပုံထံပြန်ညွှန်းသည့် လင့်အဖြစ်သာပြမည်ဖြစ်သည်\n## နှင့်စသော စာကြောင်းများကို ကွန်းမန့်အဖြစ် ယူဆမည်ဖြစ်သည်\n#ဤသည်တွင် အက္ခရာအကြီးအသေး မှန်ကန်ရမည်ဖြစ်သည်\n\n#regex fragments အားလုံးကို စာကြောင်း၏အပေါ်တွင်ထားပါ။ ဤစာကြောင်းကို ဤအတိုင်းထားပါ</pre>",
        "tag-filter": "[[Special:Tags|Tag]] သီးသန့်စစ်ထုတ်ရန် -",
        "tag-filter-submit": "စိစစ်မှု",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|စာတွဲ|စာတွဲများ}}]]: $2)",
+       "tag-mw-contentmodelchange": "မာတိကာမော်ဒယ် ပြောင်းလဲမှု",
        "tag-mw-new-redirect": "ပြန်ညွှန်းအသစ်",
        "tag-mw-removed-redirect": "ပြန်ညွှန်းကို ဖယ်ရှားခဲ့သည်",
        "tag-mw-changed-redirect-target": "ပြန်ညွှန်းကို ပြောင်းလဲခဲ့သည်",
        "tag-mw-replace": "အစားထိုးခဲ့သည်",
        "tag-mw-rollback": "နောက်ပြန် ပြန်ပြင်ခြင်း",
        "tag-mw-undo": "နောက်ပြန် ပြန်ပြင်ခြင်း",
-       "tags-title": "အမည်တွဲ",
+       "tags-title": "အမည်တွဲများ",
        "tags-tag": "အမည်တွဲ အမည်",
        "tags-active-yes": "မှန်",
        "tags-active-no": "မလုပ်ပါ",
+       "tags-source-extension": "ဆော့ဝဲလ်မှ သတ်မှတ်ထားသော",
+       "tags-source-none": "အသုံးမပြုတော့ပါ",
        "tags-edit": "ပြင်ဆင်ရန်",
+       "tags-delete": "ဖျက်",
+       "tags-activate": "စတင်သက်ဝင်စေရန်",
+       "tags-deactivate": "သက်ဝင်ခြင်းမလုပ်တော့ရန်",
        "tags-hitcount": "ပြောင်းလဲချက် $1 {{PLURAL:$1|ခု|ခု}}",
+       "tags-manage-no-permission": "သင့်တွင် အမည်တွဲများ အပြောင်းအလဲကို စီမံရန် ခွင့်ပြုချက်မရှိပါ။",
+       "tags-manage-blocked": "{{GENDER:$1|သင်}}သည် ပိတ်ပင်ခံရစဉ် အမည်တွဲများ အပြောင်းအလဲကို စီမံခွင့်မရှိပါ။",
+       "tags-create-heading": "အမည်တွဲအသစ် ဖန်တီးရန်",
+       "tags-create-tag-name": "အမည်တွဲ အမည်:",
+       "tags-create-reason": "အ​ကြောင်း​ပြ​ချက်:",
+       "tags-create-submit": "ဖန်တီးရန်",
+       "tags-create-already-exists": "အမည်တွဲ \"$1\" ရှိနှင့်ပြီးဖြစ်သည်။",
+       "tags-create-warnings-below": "အမည်တွဲ ဆက်လက်ဖန်တီးရန် ဆန္ဒရှိပါသလား။",
+       "tags-delete-title": "အမည်တွဲကို ဖျက်ရန်",
+       "tags-delete-reason": "အ​ကြောင်း​ပြ​ချက်:",
+       "tags-delete-not-found": "အမည်တွဲ \"$1\" မတည်ရှိပါ။",
+       "tags-delete-no-permission": "သင့်တွင် အမည်တွဲများ အပြောင်းအလဲကို ဖျက်ပစ်ရန် ခွင့်ပြုချက်မရှိပါ။",
+       "tags-activate-title": "အမည်တွဲကို သက်ဝင်စေရန်",
+       "tags-activate-reason": "အ​ကြောင်း​ပြ​ချက်:",
+       "tags-activate-not-found": "အမည်တွဲ \"$1\" မတည်ရှိပါ။",
+       "tags-activate-submit": "စတင်သက်ဝင်စေရန်",
+       "tags-deactivate-title": "အမည်တွဲကို သက်ဝင်ခြင်းမလုပ်တော့ပါ",
+       "tags-deactivate-reason": "အ​ကြောင်း​ပြ​ချက်:",
+       "tags-deactivate-submit": "သက်ဝင်ခြင်းမလုပ်တော့ရန်",
+       "tags-edit-title": "အမည်တွဲများကို တည်းဖြတ်ရန်",
+       "tags-edit-manage-link": "အမည်တွဲများကို စီမံခန့်ခွဲရန်",
+       "tags-edit-existing-tags": "ရှိနှင့်ပြီးသော အမည်တွဲများ:",
+       "tags-edit-existing-tags-none": "<em>ဘာမှမရှိ</em>",
+       "tags-edit-new-tags": "အမည်တွဲ အသစ်များ:",
+       "tags-edit-add": "ဤအမည်တွဲများကို ပေါင်းထည့်ရန်:",
+       "tags-edit-remove": "ဤအမည်တွဲများကို ဖယ်ရှားရန်:",
+       "tags-edit-remove-all-tags": "(အမည်တွဲများအားလုံးကို ဖယ်ရှား)",
+       "tags-edit-chosen-placeholder": "အမည်တွဲများအချို့ကို ရွေးချယ်ရန်",
+       "tags-edit-chosen-no-results": "ကိုက်ညီသော အမည်တွဲများ မတွေ့ရှိပ",
+       "tags-edit-reason": "အ​ကြောင်း​ပြ​ချက်:",
        "comparepages": "စာမျက်နှာများကို နှိုင်းယှဉ်ရန်",
        "compare-page1": "စာမျက်နှာတစ်",
        "compare-page2": "စာမျက်နှာနှစ်",
        "compare-submit": "နှိုင်းယှဉ်ရန်",
        "diff-form": "ကွဲပြားချက်များ",
        "diff-form-submit": "ကွဲပြားချက်များကို ပြသရန်",
+       "permanentlink": "ပုံ​သေ​လိပ်​စာ​",
        "dberr-problems": "ဝမ်းနည်းပါသည်။ ဤဆိုက်သည် နည်းပညာပိုင်းဆိုင်ရာ အခက်အခဲများ ကြုံတွေ့နေရပါသည်။",
        "htmlform-required": "ဤတန်ဖိုး လိုအပ်သည်",
        "htmlform-submit": "ထည့်သွင်းရန်",
        "htmlform-reset": "ပြောင်းလဲထားသည်များ မလုပ်တော့ရန်",
        "htmlform-selectorother-other": "အခြား",
+       "htmlform-chosen-placeholder": "လုပ်ဆောင်ချက်တစ်ခု ရွေးချယ်ရန်",
+       "htmlform-cloner-create": "ပို၍ ထပ်ပေါင်းရန်",
+       "htmlform-cloner-delete": "ဖယ်ရှားရန်",
+       "htmlform-cloner-required": "အနည်းဆုံး တန်ဖိုးတစ်ခု လိုအပ်သည်။",
+       "htmlform-title-not-creatable": "\"$1\" ဖန်တီးနိုင်စွမ်းရှိသော စာမျက်နှာခေါင်းစဉ် မဟုတ်ပါ",
+       "htmlform-title-not-exists": "$1 မတည်ရှိပါ။",
+       "htmlform-user-not-exists": "<strong>$1</strong> မတည်ရှိပါ။",
+       "htmlform-user-not-valid": "<strong>$1</strong> သည် ဆီလျော်သော အသုံးပြုသူအမည် မဟုတ်ပါ။",
        "logentry-delete-delete": "$3 စာမျက်နှာကို $1 က {{GENDER:$2|ဖျက်ပစ်ခဲ့သည်}}",
        "logentry-delete-delete_redir": "ပြန်ညွှန်း $3 ကို ထပ်ပိုးရေးသားခြင်းဖြင့် $1 က {{GENDER:$2|ဖျက်ပစ်ခဲ့သည်}}",
        "logentry-delete-restore": "စာမျက်နှာ $3 ($4) ကို $1 က {{GENDER:$2|ပြန်လည်ထိန်းသိမ်းခဲ့သည်}}",
+       "logentry-delete-restore-nocount": "$1 က စာမျက်နှာ $3 ကို {{GENDER:$2|ပြန်လည်ထိန်းသိမ်းခဲ့သည်}}",
+       "restore-count-files": "{{PLURAL: $1|၁ ဖိုင်|$1 ဖိုင်များ}}",
        "logentry-delete-revision": "$3 စာမျက်နှာပေါ်ရှိ {{PLURAL:$5|တည်းဖြတ်မူတစ်ခု|တည်းဖြတ်မူ $5 ခု}}၏ အမြင်ပုံစံကို $1 က {{GENDER:$2|ပြောင်းလဲခဲ့သည်}}: $4",
        "revdelete-content-hid": "အကြောင်းအရာ ဝှက်ခြင်း",
        "revdelete-restricted": "အက်ဒမင်များသို့ ကန့်သတ်ချက်များ သက်ရောက်ရန်",
        "revdelete-unrestricted": "အက်ဒမင်များအတွက် ကန့်သတ်ချက်များကို ဖယ်ရှားရန်",
+       "logentry-block-block": "$1 က {{GENDER:$4|$3}} ကို သက်တမ်းကုန်လွန်ချိန် $5 $6 ဖြင့် {{GENDER:$2|ပိတ်ပင်ခဲ့သည်}}",
+       "logentry-block-unblock": "$1 က {{GENDER:$4|$3}} ကို {{GENDER:$2|ပိတ်ပင်မှုမှ ပြန်ဖြေခဲ့သည်}}",
+       "logentry-block-reblock": "$1 က {{GENDER:$4|$3}} အတွက် ပိတ်ပင်မှုအပြင်အဆင်များကို သက်တမ်းကုန်လွန်ချိန် $5 $6 ဖြင့် {{GENDER:$2|ပြောင်းလဲခဲ့သည်}}",
        "logentry-suppress-block": "{{GENDER:$4|$3}} အား $5 ကြာအောင် $1 က {{GENDER:$2|ပိတ်ပင်ခဲ့သည်}} $6",
+       "logentry-suppress-reblock": "$1 က {{GENDER:$4|$3}} အတွက် ပိတ်ပင်မှုအပြင်အဆင်များကို သက်တမ်းကုန်လွန်ချိန် $5 $6 ဖြင့် {{GENDER:$2|ပြောင်းလဲခဲ့သည်}}",
        "logentry-move-move": "$3 စာမျက်နှာကို $4 သို့ $1က {{GENDER:$2|ရွှေ့ခဲ့သည်}}",
        "logentry-move-move-noredirect": "$3 မှ $4 သို့ စာမျက်နှာကို ပြန်ညွှန်းချန်မထားဘဲ $1 {{GENDER:$2|က ရွှေ့ခဲ့သည်}}",
        "logentry-move-move_redir": "$3 စာမျက်နှာကို $4 သို့ ပြန်ညွှန်းပေါ်ထပ်၍ $1 က {{GENDER:$2|ရွှေ့ခဲ့သည်}}",
        "logentry-move-move_redir-noredirect": "$3 မှ $4 သို့ ပြန်ညွှန်းပေါ်ထပ်အုပ်ကာ ပြန်ညွှန်းချန်မထားဘဲ $1 က {{GENDER:$2|ရွှေ့ခဲ့သည်}}",
        "logentry-patrol-patrol-auto": "စာမျက်နှာ $3 ၏ တည်းဖြတ်မူ $4 အား $1 က စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း အလိုအလျောက် {{GENDER:$2|မှတ်သားခဲ့သည်}}",
+       "logentry-newusers-newusers": "အသုံးပြုသူအကောင့် $1 ကို {{GENDER:$2|ဖန်တီးခဲ့သည်}}",
        "logentry-newusers-create": "အသုံးပြုသူအကောင့် $1 ကို {{GENDER:$2|ဖန်တီးခဲ့သည်}}",
        "logentry-newusers-create2": "အသုံးပြုသူအကောင့် $3 ကို $1 က{{GENDER:$2|ဖန်တီးခဲ့သည်}}",
+       "logentry-newusers-byemail": "အသုံးပြုသူအကောင့် $3 ကို $1 က {{GENDER:$2|ဖန်တီးခဲ့ပြီး}} စကားဝှက်ကို အီးမေးလ်မှ ပို့ခဲ့သည်",
        "logentry-newusers-autocreate": "အသုံးပြုသူအကောင့် $1 ကို အလိုအလျောက် {{GENDER:$2|ဖန်တီးခဲ့သည်}}",
+       "logentry-protect-move_prot": "$1 က ကာကွယ်မှုအပြင်အဆင်များကို $4 မှ $3 သို့ {{GENDER:$2|ရွေ့ပြောင်းခဲ့သည်}}",
+       "logentry-protect-unprotect": "$1 က ကာကွယ်မှုကို $3 မှ {{GENDER:$2|ဖယ်ရှားခဲ့သည်}}",
        "logentry-protect-protect": "$1 က  $3 ကို {{GENDER:$2|ကာကွယ်ခဲ့သည်}} $4",
        "logentry-protect-modify": "$3 အတွက် ကာကွယ်မှုအဆင့်ကို $1 {{GENDER:$2|က ပြောင်းလဲခဲ့သည်}} $4",
        "logentry-rights-rights": "{{GENDER:$6|$3}} အတွက် အုပ်စုအဖွဲ့ဝင် $4 မှ $5 သို့ $1 က {{GENDER:$2|ပြောင်းလဲခဲ့သည်}}",
+       "logentry-rights-rights-legacy": "$1 က $3 အတွက် အုပ်စုအဖွဲ့ဝင်ဖြစ်မှုကို {{GENDER:$2|ပြောင်းလဲခဲ့သည်}}",
+       "logentry-rights-autopromote": "$1 သည် $4 မှ $5 သို့ အလိုအလျောက် {{GENDER:$2|ရာထူးတိုးသွားသည်}}",
        "logentry-upload-upload": "$1 သည် $3 ကို {{GENDER:$2|upload တင်ခဲ့သည်}}",
        "logentry-upload-overwrite": "$3 ၏ ဗားရှင်းအသစ်ကို $1 {{GENDER:$2|upload တင်ခဲ့သည်}}",
+       "log-name-managetags": "အမည်တွဲ စီမံခန့်ခွဲမှု မှတ်တမ်း",
        "log-name-tag": "စာတွဲ မှတ်တမ်း",
        "rightsnone": "(ဘာမှမရှိ)",
+       "feedback-back": "နောက်သို့",
+       "feedback-cancel": "မလုပ်တော့ပါ",
+       "feedback-close": "ပြီးပြီ",
+       "feedback-dialog-title": "အကြံပေး ပေါင်းထည့်ရန်",
+       "feedback-message": "မက်ဆေ့:",
+       "feedback-subject": "အကြောင်းအရာ:",
+       "feedback-submit": "ထည့်သွင်းရန်",
+       "feedback-thanks-title": "ကျေးဇူးတင်ပါသည်",
        "searchsuggest-search": "{{SITENAME}} တွင် ရှာဖွေရန်",
        "api-error-unknown-warning": "မသိသေးသော သတိပေးချက်: \"$1\"။",
+       "api-error-unknownerror": "အမည်မသိ အမှား - \"$1\"",
+       "duration-seconds": "$1 {{PLURAL:$1|စက္ကန့်|စက္ကန့်}}",
+       "duration-minutes": "$1 {{PLURAL:$1|မိနစ်|မိနစ်}}",
+       "duration-hours": "$1 {{PLURAL:$1|နာရီ|နာရီ}}",
        "duration-days": "$1 {{PLURAL:$1|ရက်|ရက်}}",
+       "duration-weeks": "$1 {{PLURAL:$1|ပတ်|ပတ်}}",
+       "duration-years": "$1 {{PLURAL:$1|ခုနှစ်|ခုနှစ်}}",
+       "duration-decades": "$1 {{PLURAL:$1|ဆယ်စုနှစ်|ဆယ်စုနှစ်များ}}",
+       "duration-centuries": "$1 {{PLURAL:$1|ရာစုနှစ်|ရာစုနှစ်များ}}",
+       "duration-millennia": "$1 {{PLURAL:$1|ထောင်စုနှစ်|ထောင်စုနှစ်များ}}",
+       "limitreport-cputime": "စီပီယူ အချိန်အသုံးပြုမှု",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|စက္ကန့်|စက္ကန့်}}",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|စက္ကန့်|စက္ကန့်}}",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|ဘိုက်|ဘိုက်}}",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|ဘိုက်|ဘိုက်}}",
+       "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|ဘိုက်|ဘိုက်}}",
+       "expand_templates_output": "ရလဒ်",
+       "expand_templates_ok": "အိုကေ",
+       "expand_templates_remove_comments": "မှတ်ချက်များ ဖယ်ရှားရန်",
+       "expand_templates_preview": "ကြိုတင်အစမ်းကြည့်ရှုရန်",
        "pagelanguage": "စာမျက်နှာ ဘာသာစကား ပြောင်းလဲရန်",
        "pagelang-name": "စာမျက်နှာ",
        "pagelang-language": "ဘာသာစကား",
        "pagelang-use-default": "ပင်မ ဘာသာစကားကို အသုံးပြုရန်",
+       "pagelang-select-lang": "ဘာသာစကား ရွေးရန်",
+       "pagelang-reason": "အကြောင်းပြချက်",
+       "pagelang-submit": "ထည့်သွင်းရန်",
+       "pagelang-nonexistent-page": "စာမျက်နှာ $1 မတည်ရှိပါ။",
+       "pagelang-unchanged-language": "စာမျက်နှာ $1 သည် ဘာသာစကား $2 သို့ သတ်မှတ်ပြီးသားဖြစ်သည်။",
        "right-pagelang": "စာမျက်နှာ ဘာသာစကား ပြောင်းလဲရန်",
+       "action-pagelang": "စာမျက်နှာ ဘာသာစကား ပြောင်းလဲရန်",
        "log-name-pagelang": "ဘာသာစကား ပြောင်းလဲမှု မှတ်တမ်း",
        "log-description-pagelang": "ဤအရာသည် စာမျက်နှာ၏ဘာသာစကားများ ပြောင်းလဲမှုမှတ်တမ်း ဖြစ်သည်။",
+       "logentry-pagelang-pagelang": "$1 က $3 ၏ ဘာသာစကားကို $4 မှ $5 သို့  {{GENDER:$2|ပြောင်းလဲခဲ့သည်}}",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (လုပ်ခွင့်ပြုပြီး)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>လုပ်ခွင့်မပြုထားပါ</strong>)",
        "mediastatistics": "မီဒီယာ စာရင်းအင်း",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 ဘိုက်|$1 ဘိုက်}} ($2; $3%)",
+       "mediastatistics-bytespertype": "ဤအပိုင်းအတွက် စုစုပေါင်းဖိုင်အရွယ်အစား: {{PLURAL:$1|$1 ဘိုက်|$1 ဘိုက်}} ($2; $3%)။",
+       "mediastatistics-allbytes": "ဖိုင်အားလုံးအတွက် စုစုပေါင်းဖိုင်အရွယ်အစား: {{PLURAL:$1|$1 ဘိုက်|$1 ဘိုက်}} ($2)။",
+       "mediastatistics-table-count": "ဖိုင်များ အရေအတွက်",
+       "mediastatistics-header-total": "ဖိုင်အားလုံး",
+       "special-characters-group-latin": "လက်တင်",
        "special-characters-group-symbols": "သင်္ကေတများ",
+       "special-characters-group-greek": "ဂရိ",
+       "special-characters-group-arabic": "အာရဗီ",
+       "special-characters-group-hebrew": "ဟီးဘရူး",
+       "special-characters-group-bangla": "ဘင်္ဂလား",
+       "special-characters-group-thai": "ထိုင်း",
+       "special-characters-group-lao": "လာအို",
+       "special-characters-group-khmer": "ခမာ",
+       "mw-widgets-dateinput-no-date": "ရက်စွဲ ရွေးမထားပါ",
+       "mw-widgets-mediasearch-input-placeholder": "မီဒီယာအတွက် ရှာဖွေရန်",
+       "mw-widgets-mediasearch-noresults": "မည်သည့်ရလဒ်မျှ မရပါ",
+       "mw-widgets-titleinput-description-new-page": "စာမျက်နှာ မရှိသေးပါ",
+       "mw-widgets-titleinput-description-redirect": "$1 သို့ ပြန်ညွှန်း",
+       "mw-widgets-categoryselector-add-category-placeholder": "ကဏ္ဍတစ်ခု ထည့်ပေါင်း...",
+       "mw-widgets-usersmultiselect-placeholder": "ပို၍ ထည့်ပေါင်း...",
+       "date-range-from": "နေ့စွဲမှ:",
+       "date-range-to": "နေ့စွဲသို့:",
        "randomrootpage": "ကျပန်း အခြေ စာမျက်နှာ",
+       "log-action-filter-block": "ပိတ်ပင်မှု အမျိုးအစား:",
+       "log-action-filter-contentmodel": "မာတိကာမော်ဒယ် အမျိုးအစား:",
+       "log-action-filter-delete": "ဖျက်ပစ်ခြင်း အမျိုးအစား:",
+       "log-action-filter-move": "ရွေ့ပြောင်းခြင်း အမျိုးအစား:",
        "log-action-filter-newusers": "အကောင့်ဖန်တီးမှု အမျိုးအစား:",
+       "log-action-filter-patrol": "စောင့်ကြပ်စစ်ဆေးခြင်း အမျိုးအစား:",
+       "log-action-filter-protect": "ကာကွယ်ခြင်း အမျိုးအစား:",
+       "log-action-filter-rights": "အခွင့်အရေးပြောင်းလဲမှု အမျိုးအစား:",
        "log-action-filter-all": "အားလုံး",
+       "log-action-filter-block-block": "ပိတ်ပင်",
+       "log-action-filter-contentmodel-change": "မာတိကာမော်ဒယ်၏ ပြောင်းလဲမှု",
+       "log-action-filter-delete-delete": "စာမျက်နှာ ဖျက်ပစ်ခြင်း",
+       "log-action-filter-delete-event": "မှတ်တမ်း ဖျက်ပစ်ခြင်း",
+       "log-action-filter-managetags-create": "အမည်တွဲ ဖန်တီးခြင်း",
+       "log-action-filter-managetags-delete": "အမည်တွဲ ဖျက်ပစ်ခြင်း",
+       "log-action-filter-managetags-activate": "အမည်တွဲ သက်ဝင်စေခြင်း",
+       "log-action-filter-managetags-deactivate": "အမည်တွဲ မသက်ဝင်စေတော့ခြင်း",
        "log-action-filter-newusers-create": "အမည်မသိ အသုံးပြုသူများမှ ဖန်တီးမှု",
        "log-action-filter-newusers-create2": "မှတ်ပုံတင်ထားသော အသုံးပြုသူမှ ဖန်တီးမှု",
        "log-action-filter-newusers-autocreate": "အလိုအလျောက် ဖန်တီးမှု",
        "log-action-filter-newusers-byemail": "အီးမေးလ်မှတဆင့် စကားဝှက်ပို့၍ ဖန်တီးမှု",
+       "log-action-filter-patrol-patrol": "လူဖြင့် စောင့်ကြပ်စစ်ဆေး",
+       "log-action-filter-patrol-autopatrol": "အလိုအလျောက် စောင့်ကြပ်စစ်ဆေး",
+       "log-action-filter-protect-protect": "ကာကွယ်မှု",
+       "log-action-filter-rights-rights": "လူဖြင့် ပြောင်းလဲမှု",
+       "log-action-filter-rights-autopromote": "အလိုအလျောက် ပြောင်းလဲမှု",
+       "authmanager-create-disabled": "အကောင့်ဖန်တီးခြင်းကို ပိတ်ထားသည်။",
+       "authmanager-authplugin-setpass-failed-title": "စကားဝှက်ပြောင်းလဲမှု မအောင်မြင်ပါ",
+       "authmanager-autocreate-noperm": "အလိုအလျာက် အကောင့်ဖန်တီးခြင်းကို ခွင့်မပြုပါ။",
+       "authmanager-autocreate-exception": "ရှေ့ကအမှားများကြောင့် အလိုအလျာက် အကောင့်ဖန်တီးခြင်းကို ယာယီပိတ်ထားသည်။",
+       "authmanager-userdoesnotexist": "အသုံးပြုသူအကောင့် \"$1\" သည် မှတ်ပုံမတင်ထားပါ။",
+       "authmanager-retype-help": "အတည်ပြုရန် စကားဝှက်ထပ်မံရိုက်ပါ။",
+       "authmanager-email-label": "အီးမေးလ်",
+       "authmanager-email-help": "အီးမေးလ် လိပ်စာ",
+       "authmanager-realname-label": "အမည်ရင်း",
+       "authmanager-realname-help": "အသုံးပြုသူ၏ အမည်ရင်း",
+       "authmanager-provider-temporarypassword": "ယာယီစကားဝှက်",
        "gotointerwiki": "{{SITENAME}} မှ ထွက်ခွာနေသည်",
+       "pagedata-title": "စာမျက်နှာ ဒေတာ",
+       "pagedata-bad-title": "မဆီလျော်သော ခေါင်းစဉ်: $1",
        "passwordpolicies": "စကားဝှက် မူဝါဒများ",
-       "passwordpolicies-summary": "ဤသည်မှာ ဤဝီကီရှိ အသုံးပြုသူအုပ်စုများအတွက် အကျုံးဝင်သော စကားဝှက် မူဝါဒများ ဖြစ်သည်။"
+       "passwordpolicies-summary": "ဤသည်မှာ ဤဝီကီရှိ အသုံးပြုသူအုပ်စုများအတွက် အကျုံးဝင်သော စကားဝှက် မူဝါဒများ ဖြစ်သည်။",
+       "passwordpolicies-group": "အုပ်စု",
+       "passwordpolicies-policies": "မူဝါဒများ",
+       "passwordpolicies-policy-passwordcannotmatchusername": "စကားဝှက်သည် အသုံးပြုသူအမည်နှင့် မတူညီရပါ"
 }
index c56ba7a..459a65e 100644 (file)
        "ns-specialprotected": "Spesialsider kan ikke redigeres.",
        "titleprotected": "Denne tittelen har blitt låst for oppretting av [[User:$1|$1]].\nDen angitte grunnen er <em>$2</em>.",
        "filereadonlyerror": "Kan ikke endre filen «$1» fordi filsamlingen «$2» er skrivebeskyttet.\n\nSystemadministrator ga følgende begrunnelse: «$3».",
+       "invalidtitle": "Ugyldig tittel",
        "invalidtitle-knownnamespace": "Ugyldig tittel med navnerommet «$2» og teksten «$3»",
        "invalidtitle-unknownnamespace": "Ugyldig tittel med ukjent navneromsnummer $1 og teksten «$2»",
        "exception-nologin": "Ikke innlogget",
index 8b99565..f0515c1 100644 (file)
        "ns-specialprotected": "Pagina's in de naamruimte \"{{ns:special}}\" kunnen niet bewerkt worden.",
        "titleprotected": "Het aanmaken van deze pagina is beveiligd door [[User:$1|$1]].\nDe gegeven reden is <em>$2</em>.",
        "filereadonlyerror": "Het was niet mogelijk het bestand \"$1\" aan te passen omdat de bestandsrepository \"$2\" op dit moment alleen-lezen is.\n\nDe opgegeven reden is \"''$3''\".",
+       "invalidtitle": "Ongeldige titel",
        "invalidtitle-knownnamespace": "Ongeldige titel met naamruimte \"$2\" en tekst \"$3\"",
        "invalidtitle-unknownnamespace": "Ongeldige titel met onbekend naamruimtenummer $1 en tekst \"$2\"",
        "exception-nologin": "Niet aangemeld",
        "diff-paragraph-moved-toold": "Deze paragraaf is verplaatst. Klik om naar de oude locatie te springen.",
        "difference-missing-revision": "{{PLURAL:$2|Eén versie|$2 versies}} van deze verschillen ($1) {{PLURAL:$2|is|zijn}} niet aangetroffen.\n\nDit wordt meestal veroorzaakt door het volgen van een verouderde koppeling verschillen voor een pagina die is verwijderd.\nMeer gegevens zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
        "searchresults": "Zoekresultaten",
-       "search-filter-title-prefix": "Alleen zoeken naar pagina's waarvan de titel begint met \"$1\"",
-       "search-filter-title-prefix-reset": "Alle zoeken naar alle pagina's",
+       "search-filter-title-prefix": "Alleen pagina's doorzoeken waarvan de titel begint met \"$1\"",
+       "search-filter-title-prefix-reset": "Alle pagina's doorzoeken",
        "searchresults-title": "Zoekresultaten voor \"$1\"",
        "titlematches": "Overeenkomst met onderwerp",
        "textmatches": "Overeenkomst met inhoud",
        "group-autoconfirmed": "autobevestigde gebruikers",
        "group-bot": "bots",
        "group-sysop": "beheerders",
-       "group-interface-admin": "Interfacemoderator",
+       "group-interface-admin": "interfacemoderatoren",
        "group-bureaucrat": "bureaucraten",
        "group-suppress": "toezichthouders",
        "group-all": "(iedereen)",
index 6b0db88..939631e 100644 (file)
        "uctop": "(gjeldande)",
        "month": "Månad:",
        "year": "År:",
+       "date": "Frå dato (og tidlegare):",
        "sp-contributions-newbies": "Vis berre bidrag frå nye brukarar",
        "sp-contributions-newbies-sub": "Frå nye brukarkontoar",
        "sp-contributions-newbies-title": "Brukarbidrag av nye brukarar",
        "revdelete-restricted": "la til avgrensingar for administratorar",
        "revdelete-unrestricted": "fjerna avgrensingar for administratorar",
        "logentry-block-block": "$1 {{GENDER:$2|blokkerte}} {{GENDER:$4|$3}} for $5 $6",
+       "logentry-block-unblock": "$1 {{GENDER:$2|oppheva}} blokkeringa av {{GENDER:$4|$3}}",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|endra}} blokkeringsinnstillingar for {{GENDER:$4|$3}} med opphøyrstid $5 $6",
        "logentry-merge-merge": "$1 {{GENDER:$2|fletta}} $3 inn i $4 (versjonar til og med $5)",
        "logentry-move-move": "$1 {{GENDER:$2|flytte}} sida $3 til $4",
index 08002eb..bb2a544 100644 (file)
        "ns-specialprotected": "Stron specjalnych nie można edytować.",
        "titleprotected": "Utworzenie strony o tej nazwie zostało zablokowane przez [[User:$1|$1]].\nUzasadnienie blokady: <em>$2</em>.",
        "filereadonlyerror": "Nie można zmodyfikować pliku „$1”, ponieważ repozytorium plików „$2” jest w trybie tylko do odczytu.\n\nBlokujący go administrator systemu podał następujący powód: „$3”.",
+       "invalidtitle": "Nieprawidłowy tytuł",
        "invalidtitle-knownnamespace": "Nieprawidłowa nazwa \"$3\" w przestrzeni nazw \"$2\"",
        "invalidtitle-unknownnamespace": "Nieprawidłowy tytuł \"$2\" z nieznanym numerem przestrzeni nazw $1",
        "exception-nologin": "Nie jesteś zalogowany/a",
index 1b36349..aab0cfe 100644 (file)
        "ns-specialprotected": "Não é possível editar páginas especiais",
        "titleprotected": "Este título foi protegido, para que não seja criado.\nQuem o protegeu foi [[User:$1|$1]], com a justificativa: <em>$2</em>.",
        "filereadonlyerror": "Não é possível modificar o arquivo \"$1\" porque o repositório do arquivo \"$2\" está em modo somente leitura.\n\nO administrador de sistema que bloqueou ofereceu a seguinte explicação: \"$3\".",
+       "invalidtitle": "Título inválido",
        "invalidtitle-knownnamespace": "Título inválido para o espaço nominal \"$2\" e texto \"$3\"",
        "invalidtitle-unknownnamespace": "Título inválido para o espaço nominal de número desconhecido ($1) e texto \"$2\"",
        "exception-nologin": "Não está autenticado",
index 6bc4061..2e7fb21 100644 (file)
        "ns-specialprotected": "Não é possível editar páginas especiais.",
        "titleprotected": "Este título foi protegido contra criação por [[User:$1|$1]].\nA justificação dada foi <em>$2</em>.",
        "filereadonlyerror": "Não é possível modificar o ficheiro \"$1\" porque o repositório de ficheiros \"$2\" está em modo de leitura.\n\nO administrador do sistema que efetuou o bloqueio deu a seguinte explicação: \"$3\".",
+       "invalidtitle": "Título inválido",
        "invalidtitle-knownnamespace": "Título inválido com o domínio \"$2\" e texto \"$3\"",
        "invalidtitle-unknownnamespace": "Título inválido com número de domínio $1 desconhecido e texto \"$2\"",
        "exception-nologin": "Não está autenticado",
index 464f3ee..374662c 100644 (file)
        "ns-specialprotected": "Страницы пространства имён «{{ns:special}}» не могут правиться.",
        "titleprotected": "Создание страницы с таким заголовком было запрещено участником [[User:$1|$1]].\nУказана следующая причина: <em>$2</em>.",
        "filereadonlyerror": "Не удаётся изменить файл «$1», так как хранилище «$2» находится в режиме «только для чтения».\n\nСистемный администратор, заблокировавший базу, оставил следующее объяснение: «$3».",
+       "invalidtitle": "Недопустимое название",
        "invalidtitle-knownnamespace": "Недопустимый заголовок с пространством имен «$2» и текстом «$3»",
        "invalidtitle-unknownnamespace": "Недопустимый заголовок с неизвестным номером пространства $1 и текстом «$2»",
        "exception-nologin": "Вы не представились системе",
index 89a5e2c..e13d0ac 100644 (file)
@@ -19,7 +19,8 @@
                        "R Ashwani Banjan Murmu",
                        "Fagunkoyel Hansdah",
                        "Subasmurmu",
-                       "Amire80"
+                       "Amire80",
+                       "Dulal Kisku"
                ]
        },
        "tog-underline": "ᱡᱚᱱᱚᱲ ᱞᱟᱛᱟᱨᱨᱮ ᱫᱟᱜᱽ ᱩᱫᱩᱜᱽᱢᱮ:",
@@ -55,6 +56,7 @@
        "tog-watchlisthidebots": "ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱠᱷᱚᱱ ᱵᱚᱴ ᱥᱟᱯᱲᱟᱣᱠᱩ ᱩᱠᱩᱭᱢᱮ",
        "tog-watchlisthideminor": "ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱠᱷᱚᱱ ᱦᱩᱰᱤᱧ ᱥᱟᱯᱲᱟᱣᱠᱩ ᱩᱠᱩᱭᱢᱮ",
        "tog-watchlisthideliu": "ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱠᱷᱚᱱ ᱵᱚᱞᱚ ᱟᱠᱟᱱ ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱥᱟᱯᱲᱟᱣᱠᱩ ᱩᱠᱩᱭᱢᱮ",
+       "tog-watchlistreloadautomatically": "ᱡᱚᱠᱷᱚᱱ ᱯᱷᱤᱞᱴᱚᱨ ᱵᱚᱫᱚᱞᱚᱜᱼᱟ ᱧᱮᱞᱼᱛᱟᱹᱞᱠᱟ. ᱟᱡ ᱛᱮᱜᱮ ᱞᱟᱫᱮ ᱨᱩᱣᱟᱹᱲ ᱢᱮ (ᱡᱟᱵᱷᱟᱪᱤᱠᱤ ᱞᱟᱹᱠᱛᱤᱼᱟ)",
        "tog-watchlisthideanons": "ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱠᱷᱚᱱ ᱵᱟᱭ ᱵᱚᱞᱚ ᱟᱠᱟᱱ ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱥᱟᱯᱲᱟᱣᱠᱩ ᱩᱠᱩᱭᱢᱮ",
        "tog-watchlisthidepatrolled": "ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱠᱷᱚᱱ ᱵᱤᱰᱟᱹᱣᱮᱱ ᱥᱟᱯᱲᱟᱣᱠᱩ ᱩᱠᱩᱭᱢᱮ",
        "tog-watchlisthidecategorization": "ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱛᱷᱚᱠ ᱠᱚ ᱫᱟᱱᱟᱝ",
@@ -62,6 +64,8 @@
        "tog-diffonly": "ᱯᱷᱟᱨᱟᱠ ᱨᱮᱭᱟᱜ ᱞᱟᱛᱟᱨ ᱥᱟᱦᱴᱟᱨᱮ ᱵᱟᱵᱚᱛᱠᱩ ᱵᱟᱝ ᱩᱫᱩᱜᱚᱜ ᱢᱟ",
        "tog-showhiddencats": "ᱩᱠᱩ ᱛᱷᱚᱠᱠᱩ ᱩᱫᱩᱜᱽᱢᱮ",
        "tog-norollbackdiff": "rollback ᱛᱟᱭᱚᱢ ᱛᱮ ᱯᱷᱟᱨᱟᱠ ᱟᱞᱚᱢ ᱩᱫᱩᱜᱟ",
+       "tog-useeditwarning": "ᱡᱚᱠᱷᱚᱱ ᱤᱧ ᱥᱟᱯᱲᱟᱣ ᱥᱟᱦᱴᱟ ᱵᱟᱝ ᱨᱟᱠᱷᱟ ᱠᱟᱛᱮᱫᱤᱧ ᱵᱚᱫᱚᱞᱼᱟ ᱥᱚᱱᱛᱚᱨᱤᱧ ᱢᱮ",
+       "tog-prefershttps": "ᱞᱮᱛᱟᱲ ᱵᱚᱞᱚᱱ ᱡᱚᱠᱷᱚᱱ ᱢᱚᱦᱚᱡᱩᱫ ᱠᱷᱚᱸᱡᱟ ᱵᱮᱵᱷᱟᱨ ᱢᱮ",
        "underline-always": "ᱥᱟᱨᱟ ᱜᱷᱟᱹᱲᱤᱡ",
        "underline-never": "ᱛᱤᱥ ᱦᱚᱸ ᱵᱟᱝ",
        "underline-default": "ᱦᱟᱨᱛᱟ ᱥᱮ ᱵᱨᱟᱣᱡᱟᱨ ᱪᱮᱛᱞᱮᱠᱟ ᱛᱟᱸᱦᱮᱸᱠᱟᱱᱟ ᱚᱝᱠᱟᱜᱮ",
        "anontalk": "ᱨᱚᱲ",
        "navigation": "ᱟᱹᱪᱩᱨᱵᱟᱲᱟ",
        "and": "&#32;ᱟᱨ",
-       "faq": "FAQ",
+       "faq": "ᱵᱹᱞᱹᱠᱹ",
        "actions": "ᱠᱟᱹᱢᱤᱠᱩ",
        "namespaces": "ᱧᱤᱛᱩᱢ ᱡᱟᱜᱟ",
        "variants": "ᱮᱴᱟᱜᱠᱳ",
        "badaccess-group0": "ᱟᱢ ᱫᱚ ᱚᱠᱟ ᱠᱟᱹᱢᱤ ᱞᱟᱹᱜᱤᱛ ᱮᱢ ᱟᱨᱚᱡᱽ ᱟᱠᱟᱛ, ᱚᱱᱟ ᱠᱟᱹᱢᱤ ᱯᱩᱨᱟᱹᱣ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱫᱚ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾",
        "badaccess-groups": "ᱟᱢ ᱫᱚ ᱚᱠᱟ ᱠᱟᱹᱢᱤᱢ ᱢᱮᱱᱡᱚᱝᱠᱟᱱ ᱚᱱᱟ ᱫᱚ ᱠᱷᱟᱹᱞᱤ {{PLURAL:$2 ᱨᱟᱹᱥᱤᱭᱟᱹᱠᱚᱨᱮ ᱱᱚᱣᱟ ᱨᱟᱹᱥᱤᱭᱟᱹ ᱨᱮᱭᱟᱜ ᱢᱤᱫᱴᱮᱱ ᱨᱮ}} ᱢᱤᱫᱴᱮᱱ ᱵᱮᱵᱷᱟᱨᱤᱡ ᱥᱟᱯᱲᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ: $1᱾",
        "versionrequired": "ᱢᱤᱰᱤᱭᱟ ᱩᱭᱠᱤ ᱨᱮᱭᱟᱜ $1 ᱱᱟᱣᱟ ᱵᱷᱟᱨᱥᱚᱱ ᱡᱟᱹᱨᱩᱲᱟ",
-       "versionrequiredtext": "Version $1 of ᱢᱤᱰᱤᱭᱟ ᱣᱤᱠᱤ ᱫᱚ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱵᱮᱵᱷᱟᱨ ᱞᱟᱜᱟᱣᱭᱟ᱾\nᱧᱮᱞᱢᱮ [[Special:Version|version page]]᱾",
+       "versionrequiredtext": "ᱵᱷᱟᱨᱥᱚᱱ $1 ᱨᱮᱱᱟᱜ ᱢᱤᱰᱤᱭᱟ ᱣᱤᱠᱤ ᱫᱚ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱵᱮᱵᱷᱟᱨ ᱞᱟᱜᱟᱣᱭᱟ᱾\nᱧᱮᱞᱢᱮ [[Special:Version|ᱵᱷᱟᱨᱥᱚᱱ ᱥᱟᱦᱴᱟ]]᱾",
        "ok": "ᱴᱷᱤᱠ ᱜᱮᱭᱟ",
        "retrievedfrom": "\"$1\" ᱠᱷᱚᱱ ᱧᱟᱢ ᱟᱹᱜᱩᱭ",
        "youhavenewmessages": "{{PLURAL:$3|ᱟᱢᱟᱜ ᱢᱮᱱᱟᱜ-ᱟ}} $1 ($2)᱾",
        "editold": "ᱥᱟᱯᱲᱟᱣ",
        "viewsourceold": "ᱯᱷᱮᱰᱟᱛ ᱧᱮᱞ",
        "editlink": "ᱥᱟᱯᱲᱟᱣ",
-       "viewsourcelink": "ᱯᱷᱮᱰá±\9fá±\9b á±¦á±\9aᱨ á±§á±®á±\9eᱢᱮ",
+       "viewsourcelink": "ᱯᱷᱮᱰᱟᱛ ᱧᱮᱞᱢᱮ",
        "editsectionhint": "ᱥᱟᱯᱲᱟᱣ ᱡᱟᱭᱜᱟ: $1",
        "toc": "ᱩᱱᱩᱫᱩᱜ",
        "showtoc": "ᱥᱚᱫᱚᱨ",
        "confirmable-yes": "ᱦᱮᱸ",
        "confirmable-no": "ᱵᱟᱝ",
        "thisisdeleted": "ᱧᱮᱞ ᱥᱮ ᱨᱩᱭᱟᱹᱲ ᱫᱚᱲᱦᱟ $1?",
-       "viewdeleted": "$1 á±§á±®á±\9eᱢᱮ",
+       "viewdeleted": "$1 á±§á±®á±\9eá±\9fá±¢?",
        "restorelink": "{{PLURAL:$1 ᱢᱤᱫᱴᱮᱱ ᱚᱪᱚᱜ ᱜᱤᱰᱤ ᱥᱟᱯᱲᱟᱣ $1 ᱜᱟᱱ ᱩᱫᱩᱜᱽ ᱜᱤᱰᱤ ᱥᱟᱯᱲᱟᱣ}}",
        "feedlinks": "ᱟᱡᱚ:",
        "feed-invalid": "ᱜᱟᱨᱦᱟᱠ feed ᱨᱮᱭᱟᱜ ᱨᱚᱠᱚᱢ ᱫᱚ ᱚᱝᱞᱮᱠᱟᱛᱮ ᱵᱟᱝᱠᱟᱱᱟ᱾",
        "feed-unavailable": "ᱥᱤᱱᱰᱤᱠᱮᱥᱚᱱ ᱟᱡᱚ ᱠᱩᱫᱚ ᱵᱟᱝ ᱧᱟᱢᱚᱜ ᱠᱟᱱᱟ",
-       "site-rss-feed": "$1 RSS feed",
+       "site-rss-feed": "$1 ᱨᱥᱥ ᱯᱷᱤᱰ",
        "site-atom-feed": " $1 ᱡᱚᱢ ᱚᱪᱚ",
-       "page-rss-feed": "\"$1\" RSS feed",
+       "page-rss-feed": "\"$1\" ᱨᱥᱥ ᱯᱷᱤᱰ",
        "page-atom-feed": " $1 ᱡᱚᱢ ᱚᱪᱚ",
        "red-link-title": "$1 (ᱱᱤᱭᱟᱹ ᱥᱟᱦᱴᱟ ᱫᱚ ᱵᱟᱹᱱᱩᱜ-ᱟ)",
        "sort-descending": "ᱩᱞᱴᱟᱹᱣᱛᱮ ᱥᱟᱡᱟᱣ",
        "sort-ascending": "ᱥᱟᱢᱴᱟᱣ ᱛᱮ",
        "nstab-main": "ᱥᱟᱦᱴᱟ",
        "nstab-user": "ᱵᱮᱵᱦᱟᱹᱨᱤᱭᱟᱹᱜ ᱥᱟᱦᱴᱟ",
-       "nstab-media": "Media ᱥᱟᱦᱴᱟ",
+       "nstab-media": "ᱢᱤᱰᱤᱭᱟ ᱥᱟᱦᱴᱟ",
        "nstab-special": "ᱚᱥᱚᱠᱟᱭᱛᱮᱭᱟᱜ ᱥᱟᱦᱴᱟ",
        "nstab-project": "ᱯᱨᱚᱡᱮᱠᱴ ᱥᱟᱦᱴᱟ",
        "nstab-image": "ᱨᱮᱫ",
        "viewyourtext": "ᱟᱢ ᱫᱚ <strong>'''ᱟᱢᱟᱜ ᱥᱟᱯᱲᱟᱣ</strong>''' ᱥᱟᱦᱴᱟ ᱧᱮᱞ ᱟᱨ ᱮᱢ ᱠᱚᱯᱤ ᱦᱟᱛᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ:",
        "protectedinterface": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱨᱮᱭᱟᱜ ᱵᱟᱵᱚᱛᱠᱚ ᱫᱚ ᱣᱤᱠᱤ ᱥᱚᱯᱷᱴᱚᱭᱟᱨ ᱨᱮᱭᱟᱜ ᱢᱤᱫᱴᱮᱱ ᱤᱱᱴᱟᱨᱯᱷᱮᱥ ᱠᱷᱚᱵᱚᱨᱮ ᱮᱢᱟ, ᱚᱱᱟᱛᱮ ᱱᱚᱣᱟ ᱫᱟ ᱨᱩᱠᱷᱤᱭᱟᱹ ᱫᱚᱦᱚ ᱦᱩᱭᱠᱟᱱᱟ᱾",
        "cascadeprotected": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱥᱟᱯᱲᱟᱣ ᱠᱷᱚᱱ ᱨᱩᱠᱷᱤᱭᱟᱹᱨᱮ ᱢᱮᱱᱟᱜ-ᱟ, ᱠᱟᱨᱚᱱ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱞᱟᱛᱟᱨ ᱨᱮᱭᱟᱜ {{PLURAL:$1 ᱜᱟᱱ ᱥᱟᱦᱴᱟ ᱨᱮᱭᱟᱜ ᱜᱟᱱ ᱥᱟᱦᱴᱟ ᱨᱮᱭᱟᱜ}} ᱵᱷᱤᱛᱨᱤᱨᱮ, ᱚᱠᱟ ᱥᱟᱦᱴᱟ ᱫᱚ (cascading) ᱛᱮ ᱨᱩᱠᱷᱤᱭᱟᱹ ᱢᱮᱱᱟᱜ-ᱟ:\n$2",
-       "namespaceprotected": "ᱥᱟᱦᱴᱟ ᱡᱚᱱᱚᱲ ᱞᱟᱹᱜᱤᱛ ᱟᱢᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱫᱚ ᱵᱟᱹᱱᱩᱜ ᱛᱟᱢᱟ '''$1''' ᱧᱩᱛᱩᱢ ᱡᱟᱭᱜᱟ᱾",
+       "namespaceprotected": "ᱥᱟᱦᱴᱟ ᱡᱚᱱᱚᱲ ᱞᱟᱹᱜᱤᱛ ᱟᱢᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱫᱚ ᱵᱟᱹᱱᱩᱜ ᱛᱟᱢᱟ <strong>$1</strong> ᱧᱩᱛᱩᱢ ᱡᱟᱭᱜᱟ᱾",
        "customcssprotected": "ᱱᱤᱭᱟᱹ CSS ᱥᱟᱠᱟᱢ ᱥᱟᱯᱲᱟᱣ ᱵᱟᱝ ᱜᱟᱱᱚᱜ ᱛᱟᱢᱟ, ᱪᱮᱫᱟᱜ ᱥᱮ ᱱᱤᱭᱟᱹ ᱫᱚ ᱮᱴᱟᱜ ᱦᱚᱲ ᱟᱭᱟᱜ ᱥᱮᱴᱤᱜ ᱨᱮᱭ ᱫᱚᱦᱚ ᱟᱠᱟᱫᱟ᱾",
        "mycustomcssprotected": "ᱱᱤᱭᱟᱹ CSS ᱥᱟᱠᱟᱢ ᱥᱟᱯᱲᱟᱣ ᱵᱟᱝ ᱜᱟᱱᱚᱜ ᱛᱟᱢᱟ᱾",
        "mycustomjsprotected": "ᱱᱤᱭᱟᱹ JavaScript ᱥᱟᱠᱟᱢ ᱥᱟᱯᱲᱟᱣ ᱵᱟᱝ ᱜᱟᱱᱚᱜ ᱛᱟᱢᱟ᱾",
        "ns-specialprotected": "ᱟᱥᱚᱠᱟᱭ ᱛᱮᱭᱟᱜ ᱥᱟᱦᱴᱟᱠᱚ ᱥᱟᱯᱲᱟᱣ ᱨᱮᱭᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱫᱚ ᱟᱢᱟᱜ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾",
        "exception-nologin": "ᱵᱟᱢ ᱵᱚᱞᱚ ᱟᱠᱟᱱᱟ",
        "exception-nologin-text": "ᱫᱟᱭᱟᱠᱟᱛᱮ ᱵᱚᱞᱚᱱ ᱢᱮ ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱨᱮ ᱡᱟᱦᱟᱸᱱ ᱠᱟᱹᱢᱤ ᱞᱟᱹᱜᱤᱫ",
-       "virus-badscanner": "Vul konfigareson: baṅ orom vairas skenar: \"$1\"",
-       "virus-scanfailed": "Esken baṅ hoelena (Code $1)",
-       "virus-unknownscanner": "Baṅ urum anṭvayras:",
+       "virus-badscanner": "ᱵᱟᱹᱲᱤᱡ ᱠᱚᱱᱯᱷᱤᱜᱟᱨᱮᱥᱚᱱ: ᱵᱟᱝ ᱩᱨᱩᱢ ᱵᱷᱟᱭᱨᱟᱥ ᱮᱥᱠᱮᱱᱟᱨ: \"$1\"",
+       "virus-scanfailed": "ᱮᱥᱠᱮᱱ ᱵᱟᱝ ᱦᱩᱭᱞᱮᱱᱟ (Code $1)",
+       "virus-unknownscanner": "ᱵᱟᱝ ᱩᱨᱩᱢ ᱮᱱᱴᱤᱵᱷᱟᱭᱨᱟᱥ:",
        "cannotlogoutnow-title": "ᱱᱤᱛ ᱚᱰᱚᱠ ᱵᱟᱭ ᱜᱟᱱᱚᱜ ᱠᱟᱱᱟ",
        "cannotlogoutnow-text": "ᱚᱰᱚᱠᱚᱜ ᱫᱚ ᱵᱟᱭ ᱜᱟᱱᱚᱜᱼᱟ ᱡᱚᱠᱷᱚᱱ $1 ᱵᱮᱵᱷᱟᱨᱚᱜ ᱠᱟᱱᱟ",
        "welcomeuser": "ᱥᱟᱹᱜᱩᱱ ᱫᱟᱨᱟᱢ, $1!",
        "cannotloginnow-text": "ᱵᱚᱞᱚᱱ ᱫᱚ ᱵᱟᱭ ᱜᱟᱱᱚᱜᱼᱟ ᱡᱚᱠᱷᱚᱱ $1 ᱵᱮᱵᱷᱟᱨᱚᱜ ᱠᱟᱱᱟ",
        "cannotcreateaccount-title": "ᱮᱠᱟᱶᱩᱴ ᱵᱟᱝ ᱛᱮᱭᱟᱨᱞᱮᱱᱟ",
        "yourdomainname": "ᱟᱢᱟᱜ ᱧᱩᱛᱩᱢ:",
-       "externaldberror": "Hoe daṛeyaḱa jahan bahre reaḱ jacaeaḱ ḍaṭabes vul hoeakana se amaḱ bahre reaḱ ekaunṭ do nahaḱ halot aguire ạidạri bạnuḱa.",
+       "externaldberror": "ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱡᱟᱸᱦᱟᱸᱱ ᱵᱟᱨᱦᱮ ᱨᱮᱭᱟᱜ ᱡᱟᱪᱟᱭᱤᱡ ᱰᱟᱴᱟᱵᱮᱥ ᱵᱷᱩᱞ ᱦᱩᱭᱠᱟᱱᱟ ᱥᱮ ᱟᱢᱟᱜ ᱵᱟᱨᱦᱮ ᱨᱮᱭᱟᱜ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱷᱟ ᱫᱚ ᱱᱟᱦᱟᱜ ᱦᱟᱞᱚᱛ ᱨᱩᱣᱟᱹᱲ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾",
        "login": "ᱵᱚᱞᱚᱜ ᱢᱮ",
        "login-security": "ᱟᱢᱟᱜ ᱩᱯᱲᱩᱢ ᱵᱤᱰᱟᱹᱣ ᱢᱮ",
        "nav-login-createaccount": "ᱵᱚᱞᱚᱜ ᱫᱩᱣᱟᱹᱨ / ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱢᱮ",
        "createaccount": "ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱢᱮ",
        "userlogin-resetpassword-link": "ᱟᱢᱟᱜ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱦᱤᱲᱤᱧ ᱠᱮᱫᱟᱢ?",
        "userlogin-helplink2": "ᱵᱚᱞᱚᱜ ᱠᱷᱟᱹᱛᱤᱨ ᱜᱚᱸᱲᱚᱸ",
-       "userlogin-loggedin": "ᱟᱢ ᱫᱚ {{GENDER:$1|$1} ᱞᱮᱠᱟᱛᱮ ᱵᱚᱞᱚᱜᱮ ᱢᱮᱱᱟᱢᱟ᱾ ᱮᱴᱟᱜ ᱦᱚᱲ ᱞᱮᱠᱟᱛᱮ ᱵᱚᱞᱚ ᱞᱟᱹᱜᱤᱫ ᱞᱟᱛᱟᱨ ᱨᱮᱱᱟᱜ ᱯᱷᱚᱨᱢ ᱵᱮᱣᱦᱟᱨ ᱢᱮ᱾",
+       "userlogin-loggedin": "ᱟᱢ ᱫᱚ {{GENDER:$1|$1}} ᱞᱮᱠᱟᱛᱮ ᱵᱚᱞᱚᱜᱮ ᱢᱮᱱᱟᱢᱟ᱾ ᱮᱴᱟᱜ ᱦᱚᱲ ᱞᱮᱠᱟᱛᱮ ᱵᱚᱞᱚ ᱞᱟᱹᱜᱤᱫ ᱞᱟᱛᱟᱨ ᱨᱮᱱᱟᱜ ᱯᱷᱚᱨᱢ ᱵᱮᱣᱦᱟᱨ ᱢᱮ᱾",
        "userlogin-reauth": "ᱟᱢ {{GENDER:$1|$1}} ᱠᱟᱱᱟᱢ ᱚᱱᱟ ᱵᱤᱰᱟᱹᱣ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱫᱚᱥᱟᱨ ᱛᱮ ᱵᱚᱞᱚᱜ ᱢᱮ᱾",
        "userlogin-createanother": "ᱮᱴᱟᱜ ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱢᱮ",
        "createacct-emailrequired": "ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ",
        "createacct-benefit-body1": "{{PLURAL:$1|ᱥᱟᱯᱲᱟᱣ|ᱥᱟᱯᱲᱟᱣᱠᱚ}}",
        "createacct-benefit-body2": "{{PLURAL:$1|ᱥᱟᱦᱴᱟ|ᱥᱟᱦᱴᱟᱠᱳ}}",
        "createacct-benefit-body3": "ᱱᱮᱛᱟᱨ {{PLURAL:$1|ᱮᱱᱮᱢᱤᱭᱟᱹ|ᱮᱱᱮᱢᱤᱭᱟᱹᱠᱚ}}",
-       "badretype": "Am do okaṭaḱ oku nambarkom em keda ona do baṅ milạolena.",
-       "userexists": "Laṛcaṛicaḱ ńutum em hoyena ona do beohar hoyakana.\nDayakatet́ eṭagaḱ ńutum bachaome.",
+       "badretype": "ᱟᱢ ᱫᱚ ᱚᱠᱟᱴᱟᱜ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨᱠᱚᱢ ᱮᱢ ᱠᱟᱫᱟ ᱚᱱᱟ ᱫᱚ ᱵᱟᱝ ᱢᱤᱞᱟᱹᱜ ᱠᱟᱱᱟ᱾",
+       "userexists": "ᱞᱟᱲᱪᱟᱹᱨᱤᱡ ᱧᱩᱛᱩᱢ ᱮᱢ ᱦᱩᱭᱱᱟ ᱚᱱᱟ ᱫᱚ ᱵᱮᱵᱷᱟᱨ ᱦᱩᱭ ᱟᱠᱟᱱᱟ᱾\nᱫᱟᱭᱟᱠᱟᱛᱮᱛ ᱮᱴᱟᱜ-ᱟ ᱧᱩᱛᱩᱢ ᱵᱟᱪᱷᱟᱣᱢᱮ᱾",
        "loginerror": "ᱵᱷᱤᱛᱨᱤ ᱵᱚᱞᱚᱜ ᱦᱩᱲᱟᱹᱜ",
        "createacct-error": "ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨ ᱦᱩᱲᱟᱹᱜ",
        "createaccounterror": "ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱵᱟᱝ ᱛᱮᱭᱟᱨᱠᱟᱱᱟ: $1",
        "nocookiesfornew": "Beoharićaḱ ekaunṭ do baṅ tear akana, Cedaḱ je noa ńamoḱ jaega babote ale do bale uruma.\nAle do baḍae ocolem amaḱ kuki doe kạmikana, sakam do arhõ rakaṕ lạgit́te kurumuṭuemẽ.",
        "noname": "Am do asol beoharićaḱ ńutum ṭhikte bam emakada.",
        "loginsuccesstitle": "ᱵᱷᱤᱛᱨᱤ ᱵᱚᱠᱟᱜ ᱫᱚ ᱢᱚᱡᱽᱛᱮᱜᱮ ᱯᱩᱨᱟᱹᱣᱱᱟ",
-       "loginsuccess": "'''Am do nitge \"$1\" ńutumte {{SITENAME}} rem bolo akana.'''",
+       "loginsuccess": "'''ᱟᱢ ᱫᱚ ᱱᱤᱛᱜᱮ \"$1\" ᱧᱩᱛᱩᱢᱛᱮ {{SITENAME}} ᱨᱮᱢ ᱵᱚᱞᱚ ᱟᱠᱟᱱᱟ᱾'''",
        "nosuchuser": "\"$1\" ᱧᱩᱛᱩᱢᱟᱱ ᱡᱟᱸᱦᱟᱱ ᱵᱮᱵᱷᱟᱨᱤᱡ ᱵᱟᱹᱱᱩᱭᱟ᱾ ᱵᱮᱵᱷᱟᱨᱤᱡ ᱧᱩᱛᱩᱢ ᱫᱚ ᱵᱩᱠᱨᱩᱜᱮᱭᱟ᱾ ᱟᱢᱟᱜ ᱵᱟᱱᱟᱱᱠᱩ  ᱧᱮᱞᱢᱮ, ᱥᱮ [[Special:CreateAccount|ᱱᱟᱣᱟ ᱢᱤᱫᱴᱮᱱ ᱮᱠᱟᱶᱩᱴ ᱛᱮᱭᱟᱨᱢᱮ]]᱾",
-       "nosuchusershort": "\"$1\" ńutuman jahãe beoharko do banuḱkoa. Ńutum reaḱ banan biḍaomẽ.",
-       "nouserspecified": "Am do pusṭaote laṛcaṛićaḱ ńutum em hoyoḱtama.",
-       "login-userblocked": "Nui laṛcaṛic doe esetgea. bhitri boloḱ ạidạri bań emoḱ kana.",
-       "wrongpassword": "ᱵᱮᱷá±\9fᱨᱤᱭá±\9fá±\9c á±§á±©á±\9bᱩᱢ á±¥á±® á±©á± á±© á±±á±\9fᱢᱵá±\9fᱨ á±µá±\9fá±\9d á±¢á±¤á±\9eá±\9fá±¹á±\9c á± á±\9fá±±ᱟ᱾\nᱫᱚᱲᱦᱟᱛᱮ ᱠᱩᱨᱩᱢᱩᱴᱩᱭᱢᱮ᱾",
-       "wrongpasswordempty": "Em hoyen oku nambar do cetge banuḱa.\nDaya katet́ arhõ kurumuṭuyme.",
-       "passwordtooshort": "Uku nambar do {{PLURAL:$1 1 horop reaḱ $1 horop reaḱ}} mudre hoyoḱ jạruṛa.",
-       "password-name-match": "Amaḱ oku nambar do amaḱ ńutum khon eṭaḱ hoyoḱ jạruṛtama.",
-       "password-login-forbidden": "Noa laṛcaṛicaḱ ńutum ar oku nambar do ạnlekate baṅkana.",
+       "nosuchusershort": "\"$1\" ᱧᱩᱛᱩᱢᱟᱱ ᱡᱟᱸᱦᱟᱸᱭ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹᱠᱳ ᱫᱚ ᱵᱟᱹᱱᱩᱜ ᱠᱳᱣᱟ᱾\nᱧᱩᱛᱩᱢ ᱨᱮᱭᱟᱜ ᱵᱟᱱᱟᱱ ᱵᱤᱰᱟᱹᱣᱢᱮ᱾",
+       "nouserspecified": "ᱟᱢ ᱫᱚ ᱯᱩᱥᱴᱟᱹᱣᱛᱮ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱜ ᱧᱩᱛᱩᱢ ᱮᱢ ᱦᱩᱭᱩᱛᱟᱢᱟ᱾",
+       "login-userblocked": "ᱱᱩᱭ ᱵᱮᱵᱷᱟᱨᱤᱭᱟ ᱫᱚᱭ ᱮᱥᱮᱫᱜᱮᱭᱟ᱾ ᱵᱷᱤᱛᱨᱤ ᱵᱚᱞᱚᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾",
+       "wrongpassword": "á±\9fᱫᱮᱨá±\9fá± á±\9fᱫ á±µá±®á±·á±\9fᱨᱤᱭá±\9fá±¹ á±§á±©á±\9bᱩᱢ á±¥á±® á±«á±\9fá±±á±\9fá±\9d á±¥á±\9fá±µá±\9fᱫᱽ á±¦á±©á±²á±\9fá±¹á±\9c á±\9cᱮᱭᱟ᱾\nᱫᱚᱲᱦᱟᱛᱮ ᱠᱩᱨᱩᱢᱩᱴᱩᱭᱢᱮ᱾",
+       "wrongpasswordempty": "ᱮᱢ ᱦᱩᱭᱮᱱ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ ᱨᱮ ᱫᱚ ᱪᱮᱫ ᱜᱮ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾\nᱫᱟᱭᱟᱠᱟᱛᱮ ᱟᱨᱦᱚᱸ ᱠᱩᱨᱩᱢᱩᱴᱩᱭᱢᱮ᱾",
+       "passwordtooshort": "ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ ᱫᱚ {{PLURAL:$1 1 ᱦᱚᱨᱚᱯ ᱨᱮᱭᱟᱜ $1 ᱦᱚᱨᱚᱯ ᱨᱮᱭᱟᱜ}} ᱢᱩᱫᱨᱮ ᱦᱩᱭᱩᱜ ᱡᱟᱹᱨᱩᱲᱟ᱾",
+       "password-name-match": "ᱟᱢᱟᱜ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ ᱫᱚ ᱟᱢᱟᱜ ᱧᱩᱛᱩᱢ ᱠᱷᱚᱱ ᱮᱴᱟᱜ ᱦᱩᱭᱩᱜ ᱡᱟᱹᱨᱩᱲᱟ᱾",
+       "password-login-forbidden": "ᱱᱚᱣᱟ ᱵᱮᱵᱷᱟᱨᱤᱭᱟ ᱧᱩᱛᱩᱢ ᱟᱨ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ ᱫᱚ ᱮᱠᱟᱞᱛᱮ ᱵᱟᱝ ᱜᱟᱱᱚᱜ-ᱟ᱾",
        "mailmypassword": "ᱱᱟᱣᱟᱛᱮ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱮᱢ",
        "passwordremindertitle": "ᱱᱟᱣᱟ ᱱᱤᱛ ᱞᱟᱹᱜᱤᱛ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ {{SITENAME}} ᱞᱟᱹᱜᱤᱛ ᱛᱮ",
-       "noemail": "\"$1\" beoharić lạgit́te do jahan e-mail ṭhikana rukhiyạ doho bạnuḱa.",
-       "noemailcreate": "Am do mitṭen jewet e-mail ṭhikạna em jaruṛ menaḱtama.",
-       "passwordsent": "\"$1\" á¹­hikạnate resá¹­ariyen e-mail lạgitÌ\81te mitá¹­en oku nambar em hoyena.\nDaya kate Å\84am porte arhõ bhitri boloḱme.",
+       "noemail": "\"$1\" ᱵᱮᱵᱷᱟᱨᱤᱡ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱫᱚ ᱡᱟᱸᱦᱟᱸᱱ e-mail ᱴᱷᱤᱠᱟᱱᱟ ᱨᱩᱠᱷᱤᱭᱟᱹ ᱫᱚᱦᱚ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾",
+       "noemailcreate": "ᱟᱢ ᱫᱚ ᱢᱤᱫᱴᱮᱱ ᱡᱤᱣᱟᱹᱛ e-mail ᱴᱷᱤᱠᱟᱱᱟ ᱮᱢ ᱡᱟᱹᱨᱩᱲ ᱢᱮᱱᱟᱜ ᱛᱟᱢᱟ᱾",
+       "passwordsent": "\"$1\" á±´á±·á±¤á± á±\9fá±±á±\9fá±\9bá±® á±¨á±®á±¥á±´á±¨á±¤á±­á±®á±± e-mail á±\9eá±\9fá±¹á±\9cᱤá±\9bá±\9bá±® á±¢á±¤á±«á±´á±®á±± á±©á± á±© á±±á±\9aᱢᱵá±\9aᱨ á±®á±¢ á±¦á±©á±­á±®á±±á±\9fá±¾\nᱫá±\9fá±­á±\9fá± á±\9fá±\9bá±® á±§á±\9fá±¢ á±¯á±\9aᱨᱮá±\9bá±® á±\9fᱨᱦá±\9aᱸ á±µá±·á±¤á±´á±¨á±¤ á±µá±\9aá±\9eá±\9aá±\9c á±¢á±®á±¾",
        "blocked-mailpassword": "ᱟᱢᱟᱜ IP ᱴᱷᱤᱠᱟᱹᱱᱟ ᱠᱷᱚᱱ ᱥᱟᱯᱲᱟᱣ ᱰᱚᱱᱫᱽ ᱜᱮᱭᱟ᱾ ᱚᱱᱟᱛᱮ ᱱᱚᱣᱟ ᱴᱷᱤᱠᱟᱹᱱᱟ ᱵᱟᱝ ᱵᱮᱵᱷᱟᱨ ᱠᱟᱛᱮ ᱩᱠᱩ ᱱᱟᱢᱵᱟᱨ ᱨᱩᱣᱟᱹᱲ ᱵᱟᱝ ᱦᱩᱭᱩᱜ-ᱟ᱾",
-       "mailerror": "E-mail kulte eṭkẽṭõrẽ: $1",
+       "mailerror": "E-mail ᱠᱩᱞᱛᱮ ᱮᱴᱠᱮᱴᱚᱸᱲᱮ: $1",
        "emailauthenticated": "ᱟᱢᱟᱜ ᱤ-ᱢᱮᱞ ᱴᱷᱤᱠᱟᱹᱱᱟ ᱫᱚ $2 ᱛᱟᱹᱨᱤᱠᱷ ᱨᱮᱭᱟᱜ $3 ᱨᱮ ᱡᱟᱹᱦᱤᱨᱮᱱᱟ᱾",
        "emailnotauthenticated": "ᱟᱢᱟᱜ e-mail ᱨᱮᱭᱟᱜ ᱴᱷᱤᱠᱟᱹᱱᱟ ᱫᱚ <strong> ᱱᱤᱛ ᱦᱚᱸ ᱵᱟᱝ ᱡᱟᱹᱪᱟᱹᱭ ᱟᱠᱟᱱᱟ </strong> ᱞᱟᱛᱟᱨ ᱨᱮᱭᱟᱜ features ᱞᱟᱹᱜᱤᱛᱛᱮ ᱡᱟᱸᱦᱟᱸᱱ e-mail ᱫᱚ ᱵᱟᱝᱠᱩᱞᱟᱠᱳ᱾",
-       "noemailprefs": "Noa features ko kạmie ocoy lạgit́te mit́ṭen e-mail ṭhikạna dohoe hoyoḱa.",
-       "emailconfirmlink": "Amaḱ e-mail ṭhikana do sạriyme.",
-       "invalidemailaddress": "Noa e-mail ṭhikạna do baṅ hataoa, karon noa formeṭ do pusṭạote baṅ em akana. Dayakate pusṭao formeṭte ṭhikạna emmẽ, se khet do khạliemẽ.",
-       "cannotchangeemail": "Ekaunṭ e-mail ṭhikạnakodo noa wiki re baṅ bodoloḱ kana.",
-       "emaildisabled": "Noa sayeṭre do e-mail em subita bạnuḱa.",
+       "noemailprefs": "ᱱᱚᱣᱟ ᱯᱷᱤᱪᱟᱨᱥ ᱠᱳ ᱠᱟᱹᱢᱤ ᱚᱪᱚᱭᱛᱮ ᱢᱤᱫᱴᱮᱱ e-mail ᱴᱷᱤᱠᱟᱱᱟ ᱫᱚᱦᱚᱭ ᱦᱩᱭᱩᱜ-ᱟ᱾",
+       "emailconfirmlink": "ᱟᱢᱟᱜ ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ ᱥᱟᱹᱨᱤᱢᱮ",
+       "invalidemailaddress": "ᱱᱚᱣᱟ e-mail ᱴᱷᱤᱠᱟᱱᱟ ᱫᱚ ᱵᱟᱝ ᱦᱟᱛᱟᱣᱚᱜ-ᱟ, ᱠᱟᱨᱚᱱ ᱱᱚᱣᱟ ᱯᱷᱚᱨᱢᱮᱴ ᱫᱚ ᱯᱩᱥᱴᱟᱹᱣᱛᱮ ᱵᱟᱝ ᱮᱢ ᱟᱠᱟᱱᱟ᱾ \nᱫᱟᱭᱟᱠᱟᱛᱮ ᱯᱩᱥᱴᱟᱹᱣ ᱯᱷᱚᱨᱢᱮᱴᱛᱮ ᱴᱷᱤᱠᱟᱱᱟ ᱮᱢ ᱢᱮ, ᱥᱮ ᱠᱷᱟᱹᱞᱤ ᱫᱚᱦᱚᱭᱢᱮ᱾",
+       "cannotchangeemail": "ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱷᱟ e-mail ᱴᱷᱤᱠᱟᱱᱟ ᱫᱚ ᱱᱚᱣᱟ ᱣᱤᱠᱤ ᱨᱮ ᱵᱟᱝ ᱵᱚᱫᱚᱞᱚᱜ ᱠᱟᱱᱟ᱾",
+       "emaildisabled": "ᱱᱚᱣᱟ ᱥᱟᱭᱤᱴᱨᱮ ᱫᱚ e-mail ᱮᱢ ᱥᱩᱵᱤᱫᱟ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾",
        "accountcreated": "ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱱᱟ",
-       "accountcreatedtext": "$1 ᱞᱟᱹᱜᱤᱛᱛᱮ ᱮᱠᱟᱣᱱᱴ ᱫᱚ ᱵᱮᱱᱟᱣᱮᱱᱟ᱾",
+       "accountcreatedtext": "ᱱᱤᱭᱟᱹ ᱵᱮᱵᱷᱟᱨᱤᱭᱟ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱫᱚ [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) ᱵᱮᱱᱟᱣᱱᱟ᱾",
        "createaccount-title": "{{SITENAME}} ᱞᱟᱹᱜᱤᱛᱛᱮ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨ",
-       "createaccount-text": "Okoe co am lạgit́te mitṭen ekaunṭko amaḱ e-mail ṭhikạna lạgit {{SITENAME}} re ($4) ńutum \"$2\", oku nambar \"$3\".\nAm do mesagem baṅ daṛeyaḱa, judi noa ekaunṭ do vulge benaolen khan.",
-       "login-throttled": "ᱟᱢ ᱫᱚ ᱢᱤᱫᱜᱷᱟᱹᱲᱤ ᱞᱟᱦᱟᱨᱮ ᱟᱭᱢᱟ ᱫᱷᱟᱣ ᱵᱚᱞᱚᱜᱮᱢ ᱠᱩᱨᱩᱢᱩᱴᱩ ᱠᱮᱫᱟ᱾ \nᱟᱨᱦᱚᱸ ᱠᱩᱨᱩᱢᱩᱴᱩᱭ ᱞᱟᱦᱟᱨᱮ ᱫᱟᱭᱟᱠᱟᱛᱮ ᱛᱷᱟᱲᱟᱜᱟᱱ ᱛᱟᱸᱜᱤᱭᱢᱮ᱾",
+       "createaccount-text": "ᱚᱠᱚᱭ ᱪᱚ ᱟᱢ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱢᱤᱫᱴᱮᱱ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱟᱢᱟᱜ e-mail ᱴᱷᱤᱠᱟᱱᱟ ᱞᱟᱹᱜᱤᱛ {{SITENAME}} ᱨᱮ ($4) ᱧᱩᱛᱩᱢ \"$2\", ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ\"$3\"᱾\nᱟᱢ ᱫᱚ ᱱᱮᱛᱚᱜ ᱵᱚᱞᱚᱜ ᱢᱮ ᱟᱨ ᱟᱢᱟᱜ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ ᱵᱟᱫᱟᱞ ᱢᱮ᱾\n\nᱟᱢ ᱫᱚ ᱱᱤᱭᱟ ᱠᱷᱚᱵᱚᱨᱮᱢ ᱵᱟᱫᱽ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱡᱩᱫᱤ ᱱᱤᱭᱟᱹ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱷᱟ ᱵᱷᱩᱞᱛᱮ ᱵᱮᱱᱟᱣᱞᱮᱱ ᱠᱷᱟᱱ᱾",
+       "login-throttled": "ᱟᱢ ᱫᱚ ᱢᱤᱫᱜᱷᱟᱹᱲᱤ ᱞᱟᱦᱟᱨᱮ ᱟᱭᱢᱟ ᱫᱷᱟᱣ ᱵᱚᱞᱚᱜᱮᱢ ᱠᱩᱨᱩᱢᱩᱴᱩ ᱠᱮᱫᱟ᱾ \nᱟᱨᱦᱚᱸ ᱠᱩᱨᱩᱢᱩᱴᱩᱭ ᱞᱟᱦᱟᱨᱮ ᱫᱟᱭᱟᱠᱟᱛᱮ $1 ᱛᱟᱸᱜᱤᱭᱢᱮ᱾",
        "login-abort-generic": "ᱟᱢᱟᱜ ᱵᱷᱤᱛᱨᱤ ᱵᱚᱠᱟᱜ ᱫᱚ ᱵᱟᱝ ᱦᱩᱭᱞᱮᱱᱟ - ᱵᱟᱫᱽᱱᱟ",
        "loginlanguagelabel": "ᱯᱟᱹᱨᱥᱤ: $1",
        "pt-login": "ᱵᱚᱞᱚᱜ ᱫᱩᱭᱟᱹᱨ",
        "pt-login-continue-button": "ᱞᱮᱛᱟᱲ ᱵᱚᱞᱚ ᱠᱚᱜᱼᱢᱮ",
        "pt-createaccount": "ᱴᱷᱟᱭ ᱵᱮᱱᱟᱣᱢᱮ",
        "pt-userlogout": "ᱚᱰᱚᱠᱚᱜ ᱢᱮ",
-       "user-mail-no-addy": "Jahan e-mail ṭhikana bạgi kate e-mail kul kurumuṭu hoena.",
+       "user-mail-no-addy": "ᱡᱟᱸᱦᱟᱸᱱ e-mail ᱴᱷᱤᱠᱟᱱᱟ ᱵᱟᱹᱜᱤ ᱠᱟᱛᱮ e-mail ᱠᱩᱞ ᱠᱩᱨᱩᱢᱩᱴᱩ ᱦᱩᱭᱮᱱᱟ᱾",
        "changepassword": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱵᱚᱫᱚᱞ",
        "resetpass_header": "ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱨᱮᱱᱟᱜ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱵᱚᱫᱚᱞ",
        "oldpassword": "ᱢᱟᱨᱮᱭᱟᱜ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ:",
        "botpasswords-deleted-title": "ᱵᱚᱴ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱢᱩᱪᱷᱟᱹᱣᱱᱟ",
        "resetpass_forbidden": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱵᱟᱝ ᱵᱚᱫᱚᱞᱜ-ᱟ",
        "resetpass_forbidden-reason": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱵᱟᱝ ᱵᱚᱫᱚᱞᱚᱜ-ᱟ: $1",
-       "resetpass-no-info": "Noa sakam sojhete laṛcaṛ lạgit́te am do bhitri boloḱ hoyoḱtama.",
+       "resetpass-no-info": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱥᱚᱡᱽᱦᱮᱛᱮ ᱞᱟᱲᱪᱟᱲ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱟᱢ ᱫᱚ ᱵᱷᱤᱛᱨᱤ ᱵᱚᱞᱚᱜ ᱦᱩᱭᱩᱜᱛᱟᱢᱟ᱾",
        "resetpass-submit-loggedin": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱵᱚᱫᱚᱞ",
        "resetpass-submit-cancel": "ᱵᱟᱫᱽ",
        "resetpass-temp-password": "ᱱᱮᱛᱚᱜ ᱞᱟᱹᱜᱤᱛ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ:",
        "passwordreset": "ᱱᱟᱣᱟᱛᱮ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱮᱢ",
-       "passwordreset-disabled": "Noa wikire amaḱ uku nambar nãwãte em lạgit subita do bando gea.",
+       "passwordreset-disabled": "ᱱᱚᱣᱟ ᱣᱤᱠᱤ ᱨᱮ ᱟᱢᱟᱜ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ ᱱᱟᱣᱟᱛᱮ ᱮᱢ ᱞᱟᱹᱜᱤᱛ ᱥᱩᱵᱤᱫᱟ ᱫᱚ ᱵᱚᱱᱫ ᱜᱮᱭᱟ᱾",
        "passwordreset-username": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱧᱩᱛᱩᱢ:",
        "passwordreset-domain": "ᱧᱩᱛᱩᱢ:",
        "passwordreset-email": "ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ:",
-       "passwordreset-emailtitle": "{{SITENAME}} sayeṭre beoharićaḱ purạo thutiko",
+       "passwordreset-emailtitle": "{{SITENAME}} ᱨᱮ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱜ ᱯᱩᱨᱟᱹᱣ ᱛᱷᱩᱛᱷᱤᱠᱳ",
        "passwordreset-emailelement": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱧᱩᱛᱩᱢ: \n$1\n\nᱢᱤᱫ ᱜᱷᱟᱹᱲᱤ ᱞᱟᱹᱜᱤᱛ ᱫᱟᱱᱟᱝ ᱱᱟᱵᱟᱫᱽ: \n$2",
        "passwordreset-emailsentemail": "ᱱᱚᱣᱟ ᱤᱢᱮᱞ ᱴᱷᱤᱠᱟᱹᱱᱟ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱥᱟᱶᱛᱮ ᱢᱮᱥᱟ ᱢᱮᱱᱟᱜ ᱠᱷᱟᱡ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ ᱫᱤᱥᱟᱹ ᱨᱩᱣᱟᱹᱲ  ᱤᱢᱮᱞ ᱫᱚ ᱠᱩᱞᱮᱱᱟ᱾",
        "changeemail": "ᱤᱢᱮᱞ ᱴᱷᱤᱠᱱᱟ ᱵᱚᱫᱚᱞ ᱢᱮ ᱥᱮ ᱚᱪᱚᱜᱽ ᱢᱮ",
        "changeemail-header": "e-mail ᱴᱷᱤᱠᱟᱹᱱᱟ ᱵᱚᱫᱚᱞ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱱᱤᱭᱟᱹ ᱯᱷᱚᱨᱢ ᱯᱩᱨᱳᱱᱢᱮ᱾ ᱡᱟᱸᱦᱟᱸᱱ email ᱡᱩ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱨᱮ ᱢᱮᱥᱟ ᱢᱮᱱᱟᱜ-ᱟ ᱚᱱᱟᱠᱩ ᱚᱪᱚᱜ ᱞᱟᱹᱜᱤᱛ email ᱴᱷᱤᱠᱟᱹᱱᱟ ᱚᱞ ᱡᱟᱜᱟ ᱫᱚ ᱯᱷᱟᱠᱟ ᱫᱚᱦᱚᱭᱢᱮ᱾",
-       "changeemail-no-info": "Noa sakam sojhete laṛcaṛ lạgit́te am do bhitri boloḱ hoyoḱtama.",
+       "changeemail-no-info": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱥᱚᱡᱽᱦᱮᱛᱮ ᱞᱟᱲᱪᱟᱲ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱟᱢ ᱫᱚ ᱵᱷᱤᱛᱨᱤ ᱵᱚᱞᱚᱜ ᱦᱩᱭᱩᱜᱛᱟᱢᱟ᱾",
        "changeemail-oldemail": "ᱱᱮᱛᱚᱜ-ᱟᱜ ᱤᱢᱮᱞ ᱴᱷᱤᱠᱟᱹᱱᱟ",
        "changeemail-newemail": "ᱱᱟᱣᱟ ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ:",
        "changeemail-none": "(ᱪᱮᱫ ᱦᱚᱸ ᱵᱟᱹᱱᱩᱜ-ᱟ)",
        "link_sample": "ᱡᱚᱱᱚᱲ ᱴᱟᱭᱴᱮᱞ",
        "link_tip": "ᱵᱷᱤᱛᱨᱤ ᱡᱚᱱᱚᱲ",
        "extlink_sample": "http://www.example.com ᱡᱚᱱᱚᱲ ᱴᱟᱭᱴᱮᱞ",
-       "extlink_tip": "á±µá±\9fᱨᱦᱮ á±¨á±®á±±á±\9fá±\9c á±¡á±\9aá±±á±\9aá±² (ᱫᱤᱥá±\9fᱹᱭᱢᱮ http:// prefix)",
+       "extlink_tip": "ᱵᱟᱨᱦᱮ ᱡᱚᱱᱚᱲ (ᱫᱤᱥᱟᱹᱭᱢᱮ http:// prefix)",
        "headline_sample": "ᱵᱚᱦᱚᱜ ᱨᱮᱱᱟᱜ ᱚᱞ",
        "headline_tip": "ᱞᱮᱵᱷᱮᱞ ᱒ ᱦᱮᱰᱞᱟᱭᱤᱱ",
        "nowiki_sample": "ᱵᱮᱜᱚᱨ ᱯᱷᱚᱨᱢᱮᱴ ᱚᱞᱠᱩ ᱵᱷᱚᱨᱟᱣᱢᱮ",
        "showpreview": "ᱧᱮᱞᱡᱚᱝ ᱩᱫᱩᱜᱽᱢᱮ",
        "showdiff": "ᱵᱚᱫᱚᱞᱠᱩ ᱩᱫᱩᱜᱽ ᱢᱮ",
        "anoneditwarning": "<strong>ᱦᱩᱥᱤᱭᱟᱹᱨ:</strong> ᱟᱢ ᱵᱟᱢ ᱵᱚᱞᱚᱣᱟᱠᱟᱱᱟ ᱾ ᱡᱩᱫᱤ ᱟᱢ ᱡᱟᱦᱟᱸᱱᱟᱜ ᱥᱟᱯᱲᱟᱣᱟᱢ ᱟᱢᱟᱜ IP ᱵᱩᱴᱟᱹ ᱥᱚᱫᱚᱨ ᱛᱟᱦᱮᱸᱱᱟ ᱾ ᱡᱩᱫᱤ ᱟᱢ [$1 ᱵᱚᱞᱚᱱᱟᱢ]</strong> ᱟᱨᱵᱟᱝ <strong>[$2 ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱟᱢ]</strong>, ᱟᱢᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱫᱚ ᱩᱫᱩᱜᱚᱜ-ᱟ ᱟᱢᱟᱜ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ, ᱥᱟᱶᱛᱮ ᱮᱴᱟᱜ ᱥᱩᱵᱤᱫᱷᱟ ᱠᱚ ᱾",
-       "anonpreviewwarning": "\"Am do bhitri bam bolo akana. Noa sakamre amaḱ kạmiko jạre IP ṭhiikạ̣nare rukhiyạ ḱa.\"",
+       "anonpreviewwarning": "\"ᱟᱢ ᱫᱚ ᱵᱷᱤᱛᱨᱤ ᱵᱟᱢ ᱵᱚᱞᱚ ᱟᱠᱟᱱᱟ᱾ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱨᱮ ᱟᱢᱟᱜ ᱠᱟᱹᱢᱤᱠᱳ ᱡᱟᱨᱮ IP ᱴᱷᱤᱠᱟᱱᱟ ᱨᱮ ᱨᱩᱠᱷᱤᱭᱟᱹ ᱠᱟᱜ᱾\"",
        "missingcommenttext": "ᱫᱟᱭᱟ ᱠᱟᱛᱮ ᱟᱢᱟᱜ ᱠᱟᱛᱷᱟ ᱵᱚᱞᱚᱭ ᱢᱮ᱾",
        "summary-preview": "ᱜᱩᱴ ᱠᱟᱛᱷᱟ ᱩᱱᱩᱫᱩᱜ:",
        "subject-preview": "ᱜᱩᱴᱠᱟᱛᱷᱟ ᱩᱱᱩᱫᱩᱜ:",
        "nosuchsectiontitle": "ᱛᱷᱚᱠ ᱵᱟᱝ ᱧᱟᱢᱞᱮᱱᱟ",
        "loginreqtitle": "ᱵᱚᱞᱚᱜ ᱡᱟᱹᱨᱩᱲᱟ",
        "loginreqlink": "ᱵᱚᱞᱚᱜ ᱢᱮ",
-       "loginreqpagetext": "Eṭagaḱ sakamko ńel lạgit́te do am $1 hoyoḱ jạruṛtama.",
+       "loginreqpagetext": "ᱮᱴᱟᱜ ᱥᱟᱦᱴᱟᱠᱳ ᱧᱮᱞ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱫᱚ ᱟᱢ $1 ᱦᱩᱭᱩᱜ ᱡᱟᱹᱨᱩᱲᱛᱟᱢᱟ᱾",
        "accmailtitle": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱠᱩᱞ ᱦᱩᱭᱱᱟ",
        "accmailtext": "[[User talk:$1 $1]] ᱞᱟᱹᱜᱤᱛᱛᱮ ᱟᱪᱛᱮ ᱵᱮᱱᱟᱣᱮᱱ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ ᱫᱚ $2 ᱠᱩᱞ  ᱦᱩᱭᱮᱱᱟ᱾\nᱵᱷᱤᱛᱨᱤ ᱵᱚᱞᱚ ᱠᱟᱛᱮ ᱱᱚᱣᱟ ᱱᱟᱣᱟ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱞᱟᱹᱜᱤᱛ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ \"[[Special:ChangePassword Change password]]\" ᱥᱟᱦᱴᱟ ᱠᱷᱚᱱᱮᱢ ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾",
        "newarticle": "(ᱱᱟᱣᱟᱱᱟᱜ)",
        "anontalkpagetext": "----\n\n<em>ᱱᱚᱶᱟ ᱫᱚ ᱜᱟᱞᱚᱪ ᱥᱟᱦᱴᱟ ᱠᱟᱱᱟ ᱩᱠᱩᱧᱩᱛᱩᱢ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱚᱣᱟᱜ ᱡᱟᱦᱟᱸᱭ ᱫᱚ ᱠᱷᱟᱛᱟ ᱵᱟᱭ ᱛᱮᱭᱟᱨ ᱟᱠᱟᱫᱟ ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ, ᱟᱨᱵᱟᱝ ᱡᱟᱦᱟᱸᱭ ᱵᱮᱵᱷᱟᱨ ᱟᱠᱟᱫᱟ ᱱᱚᱶᱟ ᱾</em>\nᱚᱱᱟᱛᱮ ᱟᱞᱮ ᱮᱞᱮᱞ IP ᱞᱮ ᱵᱮᱵᱷᱟᱨᱮᱜ-ᱟ ᱩᱱᱤ ᱪᱤᱱᱦᱟᱹᱣ ᱞᱟᱹᱜᱤᱫ ᱾\nᱚᱱᱠᱟᱱ IP ᱵᱩᱴᱟᱹ ᱫᱚ ᱦᱟᱹᱴᱤᱧ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱛᱤᱢᱤᱱ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱫᱟᱨᱟᱭᱛᱮ ᱾\nᱡᱩᱫᱤ ᱟᱢ ᱩᱠᱩᱧᱩᱛᱩᱢ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱟᱱᱟᱢ ᱟᱨ ᱵᱷᱟᱹᱵᱤᱭᱮᱜ-ᱟᱢ ᱵᱟᱝ ᱡᱚᱲᱟᱣᱟᱱ ᱠᱟᱛᱷᱟ ᱟᱢᱮ ᱩᱫᱩᱜᱢᱮ ᱠᱟᱱᱟ, ᱮᱱᱠᱷᱟᱱ  [[Special:CreateAccount|ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱢᱮ]] ᱟᱨᱵᱟᱝ [[Special:UserLogin|ᱞᱚᱜᱤᱱ]] ᱢᱮ ᱫᱟᱨᱟᱭ ᱵᱷᱮᱣᱱᱟ ᱠᱚ ᱥᱟᱦᱟᱭ ᱞᱟᱹᱜᱤᱫ ᱮᱴᱟᱜ ᱩᱠᱩᱧᱩᱛᱩᱢ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱚ ᱥᱟᱶ ᱾",
        "noarticletext": "ᱱᱮᱛᱚᱜ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱪᱮᱫᱜᱮ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾\nᱮᱴᱟᱜ ᱥᱟᱦᱴᱟᱨᱮᱢ [[Special:Search/{{PAGENAME}}|ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱧᱩᱛᱩᱢ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ᱡᱚᱲᱟᱣᱟᱱ ᱞᱚᱜᱽ ᱠᱚ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱥᱟᱯᱲᱟᱣ ᱢᱮ]</span>.",
        "noarticletext-nopermission": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱱᱤᱛᱚᱜ ᱪᱮᱫᱜᱮ ᱚᱞ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾\n\nᱟᱢ [[Special:Search/{{PAGENAME}}|ᱱᱚᱭᱟ ᱥᱟᱦᱴᱟᱨᱮᱱᱟᱜ ᱧᱤᱛᱩᱢᱮᱢ ᱥᱮᱸᱫᱽᱨᱟ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ]] ᱮᱴᱟᱜ ᱥᱟᱦᱴᱟ ᱠᱚᱨᱮᱦᱚᱸ,\nᱟᱨᱵᱟᱝ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>.",
-       "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" ńutuman jahãe beoharićaḱ ekaunṭ do baṅ resṭri hoeakana. Daya kate biḍạo katet́ ńelmẽ noa sakam do benoa/sompadonem menet́ kana se baṅ.",
+       "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" ᱧᱩᱛᱩᱢᱟᱱ ᱡᱟᱸᱦᱟᱸᱭ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱜ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱷᱟ ᱫᱚ ᱵᱟᱝ ᱨᱮᱥᱴᱨᱤ ᱦᱩᱭ ᱟᱠᱟᱱᱟ᱾\nᱫᱟᱭᱟᱠᱟᱛᱮ ᱵᱤᱰᱟᱹᱣ ᱠᱟᱛᱮᱛ ᱧᱮᱞᱢᱮ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱵᱮᱱᱟᱣ/ᱥᱟᱯᱲᱟᱣ ᱢᱮᱱᱮᱫ ᱠᱟᱱᱟ ᱥᱮ ᱵᱟᱝ᱾",
        "userpage-userdoesnotexist-view": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ \"$1\" ᱮᱠᱟᱣᱱᱴ ᱫᱚ ᱵᱟᱝ ᱨᱮᱥᱴᱨᱤ ᱟᱠᱟᱱᱟ᱾",
        "blocked-notice-logextract": "ᱱᱩᱭ ᱵᱮᱵᱦᱟᱨᱤᱡ ᱫᱚ ᱱᱮᱛᱚᱜ ᱮ ᱥᱮᱥᱫᱜᱮᱭᱟ᱾\nᱨᱮᱯᱷᱟᱨᱮᱱᱥ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱱᱟᱣᱟᱱᱟᱜ ᱵᱚᱞᱚᱜ ᱠᱩᱨᱩᱢᱩᱴᱩ ᱞᱟᱛᱟᱨᱨᱮ ᱮᱢ ᱦᱩᱭᱱᱟ:",
        "clearyourcache": "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.\n* <strong>Firefox / Safari:</strong> Hold <em>Shift</em> while clicking <em>Reload</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> on a Mac)\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Go to <em>Menu → Settings</em> (<em>Opera → Preferences</em> on a Mac) and then to <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "defaultmessagetext": "ᱯᱩᱭᱞᱩ ᱚᱞᱠᱟᱱ ᱠᱷᱚᱵᱚᱨ",
        "content-model-wikitext": "ᱣᱤᱠᱤ-ᱚᱞ",
        "content-model-text": "ᱥᱚᱢᱟᱱ ᱚᱞ",
-       "post-expand-template-inclusion-warning": "\"Sontoroḱme\" Noa format do lạṭu geya.\nThoṛa format do noare banuḱana.",
-       "post-expand-template-inclusion-category": "Sakamko oka borḍre noa tahẽna ona doe paromkeda",
-       "post-expand-template-argument-warning": "'''Sontoroḱmẽ:''' Noa sakamre komse kom mitṭen forma joṛao menaḱa ạḍi lạṭute pasnao akana.\nOnate noa ạrgumenṭkodo bạgi giḍi hoena.",
+       "post-expand-template-inclusion-warning": "<strong>ᱥᱚᱱᱛᱚᱨᱚᱜᱢᱮ</strong> ᱱᱚᱣᱟ ᱯᱷᱚᱨᱢᱮᱴ ᱫᱚ ᱞᱟᱹᱴᱩ ᱜᱮᱭᱟ᱾ \nᱛᱷᱚᱲᱟ ᱯᱷᱚᱨᱢᱮᱴ ᱫᱚ ᱱᱟᱣᱨᱮ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾",
+       "post-expand-template-inclusion-category": "ᱥᱟᱦᱴᱟ ᱫᱚ ᱚᱠᱟ ᱪᱷᱟᱸᱪ ᱨᱮ ᱛᱟᱸᱦᱮᱱ ᱚᱱᱟ ᱫᱚ ᱯᱟᱨᱚᱢᱠᱮᱫᱟᱭ",
+       "post-expand-template-argument-warning": "'''ᱥᱚᱱᱛᱚᱨᱚᱜᱢᱮ:''' ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱠᱚᱢᱥᱮ ᱠᱚᱢ ᱢᱤᱫᱴᱮᱱ ᱯᱷᱚᱨᱢᱟ ᱡᱚᱲᱟᱣ ᱢᱮᱱᱟᱜ-ᱟ ᱟᱹᱰᱤ ᱞᱟᱹᱴᱩᱛᱮ ᱯᱟᱥᱱᱟᱣ ᱟᱠᱟᱱᱟ᱾\nᱚᱱᱟᱛᱮ ᱱᱚᱣᱟ ᱜᱟᱞᱢᱟᱨᱟᱣ ᱠᱚᱫᱚ ᱜᱮᱫ ᱜᱤᱰᱤ ᱦᱩᱭᱱᱟ᱾",
        "post-expand-template-argument-category": "Pages containing omitted template arguments",
        "undo-failure": "ᱥᱟᱯᱲᱟᱣᱠᱚ ᱵᱟᱭ ᱟᱹᱪᱩᱨ ᱨᱩᱣᱟᱹᱲᱚᱜ-ᱟ ᱛᱟᱞᱟ-ᱢᱟᱞᱟ ᱥᱟᱯᱲᱟᱣ ᱵᱤᱨᱚᱫᱽ ᱤᱫᱤᱠᱟᱛᱮ |",
        "viewpagelogs": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱨᱮᱭᱟᱜ ᱞᱚᱜᱽᱠᱚ ᱧᱮᱞᱢᱮ",
        "search-file-match": "(ᱢᱤᱫᱩᱜᱟᱜ ᱨᱮᱫ ᱩᱱᱩᱫᱩᱜ)",
        "search-suggest": "ᱪᱮᱫ ᱮᱢ ᱢᱮᱱ ᱚᱪᱚᱭᱮᱫᱟ: $1",
        "search-interwiki-caption": "ᱥᱟᱶᱛᱮᱱ ᱯᱨᱚᱡᱮᱠᱴ ᱠᱷᱚᱱ ᱚᱨᱡᱚ",
-       "search-interwiki-default": "Results from $1:",
+       "search-interwiki-default": "$1 ᱠᱷᱚᱱ ᱚᱨᱡᱚ:",
        "search-interwiki-more": "(ᱵᱟᱹᱲᱛᱤ)",
        "search-interwiki-more-results": "ᱵᱟᱹᱲᱛᱤ ᱚᱨᱡᱚᱠᱚ",
        "search-relatedarticle": "ᱥᱟᱹᱜᱟᱹᱭᱟᱱ",
        "yournick": "ᱱᱟᱶᱟ ᱥᱩᱦᱤ:",
        "gender-male": "ᱵᱟᱵᱟ ᱦᱚᱲ ᱣᱤᱠᱤ ᱥᱟᱦᱴᱟ ᱠᱩᱭ ᱥᱟᱯᱲᱟᱣ ᱠᱮᱫᱟ",
        "gender-female": "ᱜᱚᱜᱚ ᱦᱚᱲ ᱣᱤᱠᱤ ᱥᱟᱦᱴᱟ ᱠᱩᱭ ᱥᱟᱯᱲᱟᱣ ᱠᱮᱫᱟ",
-       "email": "Email",
-       "prefs-help-email": "E-mail á¹­hikana do bạá¹\9btitege, menkhan uku namber nãwãte benao jạruá¹\9ba, am do amaḱ uku nomborem hiá¹\9b\84 keda.",
-       "prefs-help-email-others": "Am são e-mail hotete jogajog dohoy lạgitte mitṭen joṛao se amaḱ katha roṛaḱ sakam bachao jońme.\nAmaḱ e-mail ṭhikạna do bań cabaḱa tinre onko do ko beohara",
+       "email": "ᱤᱢᱮᱞ",
+       "prefs-help-email": "E-mail á±´á±·á±¤á± á±\9fá±±á±\9f á±«á±\9a á±µá±\9fᱹᱨá±\9bᱤ á±\9bá±®á±\9cá±®, á±¢á±®á±±á± á±·á±\9fá±± á±©á± á±© á±±á±\9aᱢᱵá±\9aᱨ á±±á±\9fá±£á±\9fá±\9bá±® á±µá±®á±±á±\9fá±£ á±¡á±\9fᱹᱨᱩᱲá±\9f, á±\9fá±¢ á±«á±\9a á±\9fá±¢á±\9fá±\9c á±©á± á±© á±±á±\9aᱢᱵá±\9aᱨ á±®á±¢ á±¦á±¤á±²á±¤á±§ á± á±®á±«á±\9fá±¾",
+       "prefs-help-email-others": "ᱟᱢ ᱥᱟᱶ ᱤ-ᱢᱮᱞ ᱦᱚᱛᱮᱛᱮ ᱥᱟᱹᱜᱟᱹᱭ ᱫᱚᱦᱚᱭ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱢᱤᱫᱴᱮᱱ ᱡᱚᱲᱟᱣ ᱥᱮ ᱟᱢᱟᱜ ᱠᱟᱛᱷᱟ ᱨᱚᱲᱟᱜ ᱥᱟᱦᱴᱟ ᱵᱟᱪᱷᱟᱣ ᱡᱚᱝᱢᱮ᱾\nᱟᱢᱟᱜ ᱤ-ᱢᱮᱞ ᱴᱷᱤᱠᱟᱱᱟ ᱫᱚ ᱵᱟᱝ ᱪᱟᱵᱟᱠᱚᱜ ᱛᱤᱱᱨᱮ ᱩᱝᱠᱩ ᱫᱚ ᱠᱳ ᱵᱮᱵᱷᱟᱨᱚᱜ-ᱟ᱾",
        "prefs-signature": "ᱥᱩᱦᱤ",
        "prefs-editor": "ᱥᱟᱯᱲᱮᱛ",
        "prefs-preview": "ᱧᱮᱞ ᱵᱤᱰᱟᱹᱣ",
        "grouppage-sysop": "{{ns:project}}:ᱯᱟᱨᱜᱟᱱᱟᱠᱚ",
        "right-read": "ᱥᱟᱦᱴᱟᱠᱩ ᱯᱟᱲᱦᱟᱣᱢᱮ",
        "right-edit": "ᱥᱟᱦᱴᱟᱠᱩ ᱥᱟᱯᱲᱟᱣ ᱢᱮ",
-       "right-createpage": "Sakamko benoamẽ (Okako do galmarao sakamko baṅkan)",
+       "right-createpage": "ᱥᱟᱦᱴᱟ ᱵᱮᱱᱟᱣᱢᱮ (ᱚᱠᱟᱠᱳ ᱫᱚ ᱜᱟᱞᱢᱟᱨᱟᱣ ᱥᱟᱦᱴᱟᱠᱳ ᱱᱟᱝᱠᱷᱟᱱ)",
        "right-createtalk": "ᱜᱟᱞᱢᱟᱨᱟᱣ ᱥᱟᱦᱴᱟᱠᱩ ᱵᱮᱱᱟᱣᱢᱮ",
        "right-createaccount": "ᱱᱟᱶᱟ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨ",
        "right-move": "ᱥᱟᱦᱴᱟᱠᱚ ᱥᱟᱦᱟᱭᱢᱮ",
        "hist": "ᱱᱟᱜᱟᱢ",
        "hide": "ᱫᱟᱱᱟᱝ",
        "show": "ᱧᱮᱞ",
-       "minoreditletter": "m",
-       "newpageletter": "N",
-       "boteditletter": "b",
+       "minoreditletter": "",
+       "newpageletter": "",
+       "boteditletter": "",
        "rc-change-size-new": "$1 {{PLURAL:$1|ᱵᱟᱭᱤᱴ|ᱵᱟᱭᱤᱴᱥ}} ᱵᱚᱫᱚᱞ ᱛᱟᱭᱚᱢ",
        "rc-enhanced-expand": "ᱡᱚᱛᱚ ᱩᱰᱩᱜᱽ ᱢᱮ",
        "rc-enhanced-hide": "ᱡᱚᱛᱚᱭᱟᱜ ᱩᱠᱩᱭᱢᱮ",
        "filehist-current": "ᱱᱤᱛᱚᱜ",
        "filehist-datetime": "ᱢᱟᱹᱦᱤᱛ/ᱚᱠᱛᱚ",
        "filehist-thumb": "ᱴᱤᱯ",
-       "filehist-thumbtext": "Thumbnail for version as of $1",
+       "filehist-thumbtext": "$1 ᱞᱮᱠᱟᱛᱮ ᱛᱷᱚᱢᱵᱽᱱᱮᱞ ᱵᱷᱚᱨᱥᱚᱱ",
        "filehist-nothumb": "ᱵᱟᱹᱱᱩᱜ-ᱟ ᱴᱤᱯ-ᱨᱟᱢᱟ",
        "filehist-user": "ᱵᱮᱵᱷᱟᱨᱤᱡ",
        "filehist-dimensions": "ᱡᱚᱠᱷᱟ",
        "pager-newer-n": "{{PLURAL:$1|1 ᱱᱟᱣᱟᱱᱟᱜ | ᱱᱟᱣᱟᱱᱟᱜ $1}}",
        "pager-older-n": "{{PLURAL:$1|ᱢᱟᱨᱮᱭᱟᱜ 1|ᱢᱟᱨᱮᱭᱟᱜ $1}}",
        "booksources": "ᱯᱚᱛᱚᱵ ᱯᱷᱮᱰᱟᱛ ᱠᱚ",
-       "booksources-search-legend": "ᱯá±\9aá±\9bá±\9aá±µ á±¨á±®á±­á±\9fá±\9c á±¯á±·á±®á±°á±\9fá±\9b á±¦á±\9aᱨ á±\9eá±\9fá±¹á±\9cᱤá±\9b á±¥á±®á±¸á±«á±½á±¨á±\9f",
+       "booksources-search-legend": "ᱯᱚᱛᱚᱵ ᱨᱮᱭᱟᱜ ᱯᱷᱮᱰᱟᱛ ᱥᱮᱸᱫᱽᱨᱟ",
        "booksources-search": "ᱥᱮᱸᱫᱽᱨᱟ",
        "specialloguserlabel": "ᱠᱟᱹᱢᱤᱭᱟᱹ:",
        "speciallogtitlelabel": "ᱡᱚᱥ (ᱧᱩᱛᱩᱢ ᱟᱨᱵᱟᱝ {{ns:user}}:ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱞᱟᱹᱜᱩᱫ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ):",
        "listgrouprights-members": "(ᱥᱚᱦᱮᱫᱠᱩᱣᱟᱜ ᱛᱟᱹᱞᱠᱟᱹ)",
        "listgrouprights-addgroup-all": "ᱡᱚᱛᱚ ᱜᱟᱶᱛᱟᱠᱩ ᱥᱮᱞᱮᱫ ᱠᱩ ᱢᱮ",
        "listgrouprights-removegroup-all": "ᱡᱚᱛᱚ ᱜᱟᱶᱛᱟᱠᱩ ᱚᱪᱚᱜ ᱠᱩ ᱢᱮ",
-       "emailuser": "ᱱᱩᱭ á±µá±®á±µá±¦á±\9fᱨᱤᱡ e-mail ᱮᱢᱟᱭᱢᱮ",
-       "noemailtitle": "E-mail ᱴᱷᱤᱠᱟᱹᱱᱟ ᱫᱚ ᱵᱟᱹᱱᱩᱜ-ᱟ",
+       "emailuser": "ᱱᱩᱭ á±µá±®á±µá±¦á±\9fᱨᱤᱭá±\9fá±¹ á±¤á±¢á±®á±\9e ᱮᱢᱟᱭᱢᱮ",
+       "noemailtitle": "ᱤᱢᱮᱞ ᱴᱷᱤᱠᱟᱹᱱᱟ ᱫᱚ ᱵᱟᱹᱱᱩᱜ-ᱟ",
        "emailusername": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱧᱩᱛᱩᱢᱺ",
        "emailusernamesubmit": "ᱮᱢ",
        "emailfrom": "ᱠᱩᱞᱤᱪ:",
        "ipblocklist": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱮᱥᱮᱫᱜᱮᱭᱟᱭ",
        "ipblocklist-submit": "ᱥᱮᱸᱫᱽᱨᱟ",
        "infiniteblock": "ᱚᱦᱤᱥᱟᱹᱵᱽ",
-       "emailblock": "E-mail ᱵᱚᱸᱫᱷ ᱜᱮᱭᱟ",
+       "emailblock": "ᱤᱢᱮᱞ ᱵᱚᱸᱫᱷ ᱜᱮᱭᱟ",
        "blocklink": "ᱮᱥᱮᱫᱽ",
        "unblocklink": "ᱵᱟᱝ ᱮᱥᱮᱫ",
        "change-blocklink": "block ᱵᱚᱫᱚᱞ",
        "contribslink": "ᱮᱱᱮᱢ",
-       "emaillink": "E-mail ᱠᱩᱞᱢᱮ",
+       "emaillink": "ᱤᱢᱮᱞ ᱠᱩᱞᱢᱮ",
        "blocklogpage": "ᱠᱩᱞᱩᱯ ᱮᱥᱮᱫ",
        "blocklogentry": "ᱮᱥᱮᱫ [[$1]] ᱥᱟᱶᱛᱮ ᱪᱟᱵᱟᱜ ᱚᱠᱛᱚ ᱚᱠᱟ ᱫᱚ $2 $3",
        "reblock-logentry": "ᱵᱚᱫᱚᱞᱮᱱᱟ ᱵᱚᱸᱫ ᱥᱟᱡᱟᱣᱠᱚ [[$1]] ᱞᱟᱹᱜᱤᱫ ᱪᱟᱵᱟᱜ ᱚᱠᱛᱚ $2 $3 ᱥᱟᱶ",
        "block-log-flags-nocreate": "ᱮᱠᱟᱣᱱᱴ ᱵᱮᱱᱟᱣ ᱵᱚᱱᱫᱷ ᱜᱮᱭᱟ",
-       "block-log-flags-noemail": "E-mail ᱵᱚᱸᱫᱷ ᱜᱮᱭᱟ",
+       "block-log-flags-noemail": "ᱤᱢᱮᱞ ᱵᱚᱸᱫᱷ ᱜᱮᱭᱟ",
        "block-log-flags-hiddenname": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱧᱩᱛᱩᱢ ᱩᱠᱩ ᱜᱮᱭᱟ",
        "proxyblocker": "ᱯᱨᱚᱠᱥᱤ ᱮᱥᱮᱫᱤᱡ",
        "movepagebtn": "ᱥᱟᱦᱴᱟ ᱩᱪᱟᱹᱲᱢᱮ",
        "export-addcat": "ᱥᱮᱞᱮᱫ",
        "export-addns": "ᱥᱮᱞᱮᱫ",
        "allmessagesname": "ᱧᱩᱛᱩᱢ",
-       "allmessagesdefault": "Bań bhul mesag ol",
+       "allmessagesdefault": "ᱯᱩᱭᱞᱩ ᱚᱞᱠᱟᱱ ᱠᱷᱚᱵᱚᱨ",
        "allmessages-filter-all": "ᱡᱚᱛᱚ",
        "allmessages-language": "ᱯᱟᱹᱨᱥᱤ:",
        "allmessages-filter-submit": "ᱪᱟᱞᱟᱜ ᱢᱮ",
        "allmessages-filter-translate": "ᱛᱚᱨᱡᱚᱢᱟ",
        "thumbnail-more": "ᱞᱟᱹᱴᱩᱭ ᱢᱮ",
-       "thumbnail_error": "Benawakan unuduḱ kạṭuṕ do baṅ ṭhika: $1",
+       "thumbnail_error": "ᱵᱮᱱᱟᱣ ᱟᱠᱟᱱᱟ ᱩᱱᱩᱫᱩᱜ ᱠᱟᱹᱴᱩᱯ ᱫᱚ ᱵᱟᱝ ᱴᱷᱤᱠᱟ: $1",
        "import-upload-filename": "ᱨᱮᱫᱧᱩᱛᱩᱢᱺ",
        "importlogpage": "ᱞᱚᱜᱽ ᱟᱹᱜᱩ",
        "tooltip-pt-userpage": "{{GENDER:|ᱟᱢᱟᱜ ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱹ}} ᱥᱟᱦᱴᱟ",
        "tooltip-ca-talk": "ᱥᱟᱛᱚᱢ ᱥᱟᱦᱴᱟ ᱞᱟᱹᱜᱤᱛ ᱜᱟᱞᱢᱟᱨᱟᱣ",
        "tooltip-ca-edit": "ᱱᱚᱭᱟ ᱥᱟᱦᱴᱟ ᱥᱟᱯᱲᱟᱣᱢᱮ",
        "tooltip-ca-addsection": "ᱱᱟᱣᱟ ᱦᱟᱹᱴᱤᱧ ᱮᱦᱚᱵᱽ ᱢᱮ",
-       "tooltip-ca-viewsource": "á±±á±\9aá±£á±\9f á±¥á±\9fᱦᱴá±\9f á±«á±\9a á± á±©á±\9eᱩᱯ á±\9cᱮᱭá±\9fá±¾\nᱱᱤᱭá±\9fá±¹ á±¨á±®á±±á±\9fá±\9c á±¯á±·á±®á±°á±\9fá±\9b á±¦á±\9aᱨ ᱫᱟᱲᱮᱭᱟᱜ ᱟᱢ",
+       "tooltip-ca-viewsource": "á±±á±\9aá±£á±\9f á±¥á±\9fᱦᱴá±\9f á±«á±\9a á±¨á±\9fá± á±·á±\9f á±\9cᱮᱭá±\9fá±¾\nᱱᱤᱭá±\9fá±¹ á±¨á±®á±±á±\9fá±\9c á±¯á±·á±®á±°á±\9fá±\9b á±§á±®á±\9e ᱫᱟᱲᱮᱭᱟᱜ ᱟᱢ",
        "tooltip-ca-history": "ᱱᱚᱭᱟ ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱮᱱᱟᱝ ᱱᱟᱝ ᱧᱮᱞ ᱨᱩᱟᱹᱲ",
        "tooltip-ca-protect": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱨᱩᱠᱷᱤᱭᱟᱹᱭ ᱢᱮ",
        "tooltip-ca-delete": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱜᱮᱫᱽ ᱢᱮ",
        "tooltip-n-mainpage": "ᱢᱩᱬᱩᱛ ᱥᱟᱦᱴᱟ ᱪᱟᱞᱟᱜᱢᱮ",
        "tooltip-n-mainpage-description": "ᱢᱩᱬᱩᱛ ᱥᱟᱦᱴᱟ ᱪᱟᱞᱟᱜᱢᱮ",
        "tooltip-n-portal": "ᱱᱤᱭᱟᱹ ᱯᱨᱚᱡᱮᱠᱴ ᱠᱷᱟᱹᱛᱤᱨ, ᱪᱮᱛᱮᱢ ᱪᱮᱠᱟ ᱫᱟᱨᱮᱭᱟᱜ-ᱟ,ᱚᱠᱟᱨᱮ ᱥᱮᱸᱫᱽᱨᱟ ᱧᱟᱢᱚᱜ-ᱟ",
-       "tooltip-n-currentevents": "ᱱᱤᱛᱚᱜ events ᱨᱮ ᱡᱚᱥ ᱦᱩᱫᱤᱥ ᱧᱟᱢ ᱢᱮ",
+       "tooltip-n-currentevents": "ᱱᱤᱛᱚᱜ ᱤᱵᱷᱮᱸᱴ ᱨᱮ ᱡᱚᱥ ᱦᱩᱫᱤᱥ ᱧᱟᱢ ᱢᱮ",
        "tooltip-n-recentchanges": "ᱩᱤᱠᱤ ᱨᱮ ᱱᱟᱣᱭᱟ ᱵᱚᱫᱚᱞᱠᱳ ᱨᱮᱭᱟᱜ ᱛᱟᱹᱞᱠᱟᱹ",
        "tooltip-n-randompage": "ᱟᱨᱦᱚᱸ ᱥᱟᱦᱴᱟᱠᱳ ᱩᱫᱩᱜᱽ ᱢᱮ",
        "tooltip-n-help": "ᱥᱮᱸᱫᱽᱨᱟ ᱧᱟᱢ ᱨᱮᱭᱟᱜ ᱡᱟᱜᱟ",
        "friday-at": "ᱡᱟᱹᱨᱩᱢ ᱢᱟᱦᱟᱸ $1 ᱨᱮ",
        "saturday-at": "ᱧᱩᱦᱩᱢ ᱢᱟᱦᱟᱸ $1 ᱨᱮ",
        "yesterday-at": "ᱦᱚᱞᱟ $1 ᱨᱮ",
-       "bad_image_list": "Format do latar re leka",
+       "bad_image_list": "ᱯᱷᱚᱨᱢᱮᱴ ᱫᱚ ᱞᱟᱛᱟᱨ ᱨᱮ ᱞᱮᱠᱟ:\n\nᱠᱷᱟᱹᱞᱤ ᱛᱟᱹᱞᱠᱟᱹ ᱟᱭᱴᱮᱢᱠᱳ (ᱞᱟᱭᱤᱱ ᱮᱛᱦᱚᱵᱚ ᱟᱜ *) ᱦᱟᱛᱟᱣᱚᱜ-ᱟ᱾\nᱯᱩᱭᱞᱩ ᱡᱚᱱᱚᱲ ᱞᱟᱭᱤᱱ ᱫᱚ ᱢᱤᱫᱴᱮᱱ ᱵᱟᱹᱲᱤᱡ ᱨᱮᱫ ᱨᱮ᱾\nᱮᱴᱟᱜ subsequent ᱡᱚᱱᱚᱲᱠᱩ ᱚᱱᱟ ᱞᱟᱭᱤᱱ ᱨᱮᱜᱮ ᱦᱟᱛᱟᱣᱚᱜ-ᱟ ᱵᱮᱛᱤᱠᱨᱚᱢ ᱠᱷᱟᱹᱛᱤᱨ, i.e. ᱥᱟᱦᱴᱟᱠᱳ ᱡᱟᱸᱦᱟᱸᱨᱮ ᱨᱮᱫ ᱨᱮᱱᱟᱜ ᱞᱟᱭᱤᱱ ᱠᱩ᱾",
        "metadata": "ᱢᱮᱴᱟ ᱥᱟᱹᱠᱷᱭᱟᱹᱛ",
        "metadata-help": "ᱱᱚᱣᱟ ᱨᱮᱫ ᱨᱮᱫᱚ ᱵᱟᱹᱲᱛᱤ ᱠᱟᱛᱷᱟᱠᱚ ᱢᱮᱱᱟᱜ-ᱟ, ᱯᱟᱥᱮᱡ ᱱᱚᱣᱟ ᱫᱚ ᱰᱤᱡᱤᱴᱟᱞ ᱠᱮᱢᱨᱟ ᱥᱮ ᱮᱥᱠᱮᱱᱟᱨ ᱵᱮᱵᱦᱟᱨ ᱠᱟᱛᱮ ᱰᱤᱡᱤᱴᱟᱞ ᱟᱠᱟᱫᱟᱠᱚ᱾ ᱡᱩᱫᱤ ᱱᱚᱣᱟ ᱨᱮᱫ ᱨᱮᱭᱟᱜ ᱵᱩᱱᱤᱭᱟᱹᱫ ᱠᱷᱚᱱ ᱱᱟᱣᱟ ᱥᱩᱫᱷᱨᱟᱣ ᱞᱮᱱᱠᱷᱟᱱ, ᱯᱟᱥᱮᱡ ᱥᱟᱱᱟᱢᱠᱚ ᱛᱷᱚᱲᱟ ᱵᱟᱝᱠᱩ ᱥᱚᱫᱚᱨᱚᱜ-ᱟ ᱱᱚᱣᱟ ᱨᱮᱫ ᱨᱮᱫᱚ᱾",
        "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "watchlisttools-edit": "ᱧᱮᱞᱢᱮ ᱟᱨ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱥᱟᱯᱲᱟᱣᱢᱮ",
        "watchlisttools-raw": "ᱵᱟᱝ ᱯᱩᱨᱟᱣ ᱟᱠᱟᱱ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱥᱟᱯᱲᱟᱣᱢᱮ",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ᱜᱟᱞᱢᱟᱨᱟᱣ]])",
-       "duplicate-defaultsort": "'''Sontoroḱmẽ:''' ḍifolṭ sajao reaḱ cạbi: $2 lahare ḍifolṭ sajao reaḱ sakam: ''$1'' e bae luturaḱ kana.",
+       "duplicate-defaultsort": "<strong>ᱥᱚᱱᱛᱚᱨᱚᱜᱢᱮ:</strong> ᱡᱟᱭᱞᱮᱠᱟ ᱥᱟᱡᱟᱣ ᱨᱮᱭᱟᱜ ᱪᱟᱹᱵᱤ: $2 ᱞᱟᱦᱟᱨᱮ ᱡᱟᱭᱞᱮᱠᱟ ᱥᱟᱡᱟᱣ ᱨᱮᱭᱟᱜ ᱥᱟᱦᱴᱟ: ''$1'' ᱮ ᱵᱟᱭ ᱞᱩᱛᱩᱨᱟᱜ ᱠᱟᱱᱟ᱾",
        "redirect": "ᱨᱮᱫ, ᱵᱮᱵᱷᱟᱨᱩᱭᱟᱹ, ᱥᱟᱦᱴᱟ, ᱧᱮᱞ-ᱟᱹᱨᱩ, ᱵᱟᱝᱠᱷᱟᱱ ᱞᱚᱜᱽ ID ᱫᱟᱨᱟᱭᱛᱮ ᱢᱚᱦᱰᱟ",
        "redirect-summary": "ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱢᱚᱦᱰᱟ ᱟ ᱢᱤᱫ ᱨᱮᱫ (ᱮᱢᱟᱠᱟᱱ ᱨᱮᱫᱧᱩᱛᱩᱢ) ᱴᱷᱮᱱ, ᱢᱤᱫ ᱥᱟᱦᱴᱟ (ᱮᱢᱮᱱ ᱟᱹᱨᱩᱣᱟᱜ ID ᱟᱨᱵᱟᱝ ᱥᱟᱦᱴᱟ ID),  ᱢᱤᱫ ᱵᱮᱵᱷᱟᱨᱩᱭᱟᱹ ᱥᱟᱦᱴᱟ (ᱮᱢᱮᱱ ᱮᱞᱩᱠ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ID ), ᱟᱨᱵᱟᱝ ᱢᱤᱫ ᱞᱚᱜᱽ ᱵᱚᱞᱚ (ᱮᱢᱮᱱ ᱞᱚᱜᱽ ID) ᱾ ᱵᱮᱵᱷᱟᱨᱟᱠᱟᱱ: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], ᱟᱨᱵᱟᱝ [[{{#Special:Redirect}}/logid/186]]",
        "redirect-submit": "ᱥᱮᱱᱚᱜ",
        "fileduplicatesearch-submit": "ᱥᱮᱸᱫᱽᱨᱟ",
        "specialpages": "ᱵᱤᱥᱮᱥ ᱥᱟᱦᱴᱟᱠᱚ",
        "external_image_whitelist": "#ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱪᱮᱛ ᱞᱮᱠᱟ ᱢᱮᱱᱟᱜ-ᱟ ᱚᱝᱠᱟᱜᱮ ᱫᱚᱦᱚᱭᱢᱮ\n#ᱡᱚᱛᱚ ᱚᱠᱛᱚ ᱨᱮ ᱡᱟᱹᱦᱤᱨᱮᱱ ᱠᱩᱴᱨᱟᱹ ᱞᱟᱛᱟᱨ ᱨᱮ (ᱠᱷᱟᱹᱞᱤ ᱦᱟᱹᱴᱤᱧ //ᱛᱟᱞᱟᱨᱮ) ᱵᱟᱹᱭᱥᱟᱹᱣᱢᱮ\n#ᱱᱚᱣᱟ ᱠᱚ ᱫᱚ ᱵᱟᱨᱦᱮ ᱨᱮᱭᱟᱜ (hotlinked) ᱪᱤᱛᱟᱹᱨ ᱨᱮᱭᱟᱜ URL ᱥᱟᱶᱛᱮ ᱢᱤᱞᱟᱹᱣ ᱦᱩᱭᱩᱜ-ᱟ\n#ᱚᱠᱟᱠᱩ ᱢᱤᱞᱟᱹᱜ-ᱟ, ᱚᱱᱟᱠᱩ ᱫᱚ ᱪᱤᱛᱟᱹᱨ ᱞᱮᱠᱟᱛᱮ ᱩᱫᱩᱜᱚᱜ-ᱟ, ᱵᱟᱝᱠᱷᱟᱱ ᱫᱚ ᱠᱷᱟᱹᱞᱤ ᱪᱤᱛᱟᱨ ᱡᱚᱱᱚᱲ ᱩᱫᱩᱜᱚᱜ-ᱟ\n#ᱱᱚᱣᱟ ᱞᱟᱭᱤᱱ ᱨᱮᱭᱟᱜ ᱮᱛᱦᱚᱵᱨᱮ # ᱢᱮᱱᱟᱜ-ᱟ ᱚᱱᱟ ᱞᱟᱭᱤᱱᱠᱚ ᱢᱮᱱᱠᱚ ᱦᱤᱥᱟᱹᱵᱛᱮ ᱵᱮᱵᱦᱟᱨ ᱦᱩᱭᱩᱜ-ᱟ\n#ᱱᱚᱣᱟ ᱫᱚ ᱨᱤᱢᱡᱷᱟᱹᱣᱜᱮ\n#ᱱᱚᱣᱟ ᱫᱟᱜᱽ ᱪᱮᱛᱟᱱᱨᱮ regex ᱠᱩᱴᱨᱟᱹ ᱵᱟᱹᱭᱥᱟᱹᱣᱢᱮ᱾ ᱱᱚᱣᱟ ᱞᱟᱭᱤᱱ ᱪᱮᱫᱞᱮᱠᱟ ᱢᱮᱱᱟᱜ-ᱟ ᱚᱝᱠᱟᱜᱮ ᱫᱚᱦᱚᱭᱢᱮ</pre>",
-       "tag-filter": "[[Special:Tags|Tag]] ᱪᱷᱟᱹᱠᱱᱤ:",
+       "tag-filter": "[[Special:Tags|ᱜᱚᱛᱟᱣ]] ᱪᱷᱟᱹᱱᱤ:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ᱥᱟᱛᱚᱢ|ᱥᱟᱛᱚᱢᱠᱩ}}]]: $2)",
        "tags-active-yes": "ᱦᱮᱸ",
        "tags-active-no": "ᱵᱟᱝ",
index 9eebd0d..6cc11ef 100644 (file)
        "anontalk": "Pogovorna stran",
        "navigation": "Navigacija",
        "and": "&#32;in",
-       "faq": "Najpogostejša vprašanja",
+       "faq": "Pogosta vprašanja",
        "actions": "Dejanja",
        "namespaces": "Imenski prostori",
        "variants": "Različice",
        "ns-specialprotected": "Posebnih strani ni mogoče urejati.",
        "titleprotected": "Uporabnik [[User:$1|$1]] je preprečil ustvarjanje strani s tem naslovom.\nPodan razlog je <em>$2</em>.",
        "filereadonlyerror": "Ne morem spremeniti datoteke »$1«, ker je skladišče datotek »$2« v načinu, ki dovoljuje samo branje.\n\nSistemski skrbnik, ki ga je zaklenil, je podal naslednje pojasnilo: »$3«.",
+       "invalidtitle": "Neveljaven naslov",
        "invalidtitle-knownnamespace": "Neveljaven naslov z imenskim prostorom »$2« in besedilom »$3«",
        "invalidtitle-unknownnamespace": "Neveljaven naslov z neznano številko imenskega prostora $1 in besedilom »$2«",
        "exception-nologin": "Niste prijavljeni",
        "rcfilters-restore-default-filters": "Obnovi privzete filtre",
        "rcfilters-clear-all-filters": "Počisti vse filtre",
        "rcfilters-show-new-changes": "Ogled najnovejših sprememb",
-       "rcfilters-search-placeholder": "Filtrirajte spremembe (uporabite meni ali poiščite ime filtra)",
+       "rcfilters-search-placeholder": "Filtriraj zadnje spremembe (uporabi meni ali vnesi ime filtra)",
        "rcfilters-invalid-filter": "Neveljaven filter",
        "rcfilters-empty-filter": "Ni dejavnih filtrov. Prikazani so vsi prispevki.",
        "rcfilters-filterlist-title": "Filtri",
        "rcfilters-filterlist-whatsthis": "Kako to deluje?",
-       "rcfilters-filterlist-feedbacklink": "Povejte nam, kaj menite o teh orodjih za filtriranje",
+       "rcfilters-filterlist-feedbacklink": "Povej nam, kaj meniš o tem orodju za filtriranje",
        "rcfilters-highlightbutton-title": "Označi rezultate",
-       "rcfilters-highlightmenu-title": "Izberite barvo",
-       "rcfilters-highlightmenu-help": "Izberite barvo za označitev te lastnosti",
+       "rcfilters-highlightmenu-title": "Izberi barvo",
+       "rcfilters-highlightmenu-help": "Izberi barvo za označitev te lastnosti",
        "rcfilters-filterlist-noresults": "Nismo našli nobenega filtra",
        "rcfilters-noresults-conflict": "Našli nismo nobenih rezultatov, ker si merila za iskanje nasprotujejo",
        "rcfilters-state-message-subset": "Ta filter nima učinka, saj njegove rezultate {{PLURAL:$2|vključuje naslednji, širši filter|vključujeta naslednja, širša filtra|vključujejo naslednji, širši filtri}} (označite jih, da razlikujete med njimi): $1",
        "rcfilters-state-message-fullcoverage": "Izbira vseh filtrov v tej skupini je enako kot izbira nobenega, zato ta filter nima učinka. Skupina vključuje: $1",
        "rcfilters-filtergroup-authorship": "Avtorstvo prispevka",
-       "rcfilters-filter-editsbyself-label": "Vaše spremembe",
-       "rcfilters-filter-editsbyself-description": "Vaša lastna urejanja.",
+       "rcfilters-filter-editsbyself-label": "Tvoje spremembe",
+       "rcfilters-filter-editsbyself-description": "Tvoja lastna urejanja.",
        "rcfilters-filter-editsbyother-label": "Spremembe drugih",
-       "rcfilters-filter-editsbyother-description": "Vse spremembe razen vaših.",
+       "rcfilters-filter-editsbyother-description": "Vse spremembe razen tvojih.",
        "rcfilters-filtergroup-userExpLevel": "Prijava in izkušnje uporabnika",
        "rcfilters-filter-user-experience-level-registered-label": "Registrirani",
        "rcfilters-filter-user-experience-level-registered-description": "Prijavljeni uporabniki.",
index f6700ee..05a2086 100644 (file)
        "viewdeleted": "Погледај $1?",
        "restorelink": "{{PLURAL:$1|једну обрисану измену|$1 обрисане измене|$1 обрисаних измена}}",
        "feedlinks": "Довод:",
-       "feed-invalid": "Ð\9dевалидан Ñ\82ип Ð¿Ñ\80иÑ\98аве Ð½Ð° Ð´Ð¾Ð²Ð¾д.",
+       "feed-invalid": "Ð\9dеважеÑ\9bи Ñ\82ип Ð¿Ñ\80иÑ\98аве Ð½Ð° Ñ\84ид.",
        "feed-unavailable": "Удруживање довода није доступно",
        "site-rss-feed": "$1 RSS довод",
        "site-atom-feed": "$1 Атом довод",
        "namespaceprotected": "Немате дозволу да уређујете странице у именском простору: <strong>$1</strong>.",
        "customcssprotected": "Немате дозволу да мењате ову CSS страницу јер садржи лична подешавања другог корисника.",
        "customjsprotected": "Немате дозволу да мењате ову страницу JavaScript јер садржи лична подешавања другог корисника.",
-       "mycustomcssprotected": "Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð·Ð° Ð¼ÐµÑ\9aаÑ\9aе Ð¾Ð²Ðµ CSS Ñ\81Ñ\82Ñ\80аниÑ\86е.",
-       "mycustomjsonprotected": "Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð·Ð° Ð¼ÐµÑ\9aаÑ\9aе Ð¾Ð²Ðµ JSON Ñ\81Ñ\82Ñ\80аниÑ\86е.",
-       "mycustomjsprotected": "Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð·Ð° Ð¼ÐµÑ\9aаÑ\9aе Ð¾Ð²Ðµ JavaScript Ñ\81Ñ\82Ñ\80аниÑ\86е.",
-       "myprivateinfoprotected": "Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð·Ð° Ð¼ÐµÑ\9aаÑ\9aе Ð²Ð°Ñ\88иÑ\85 Ð»Ð¸Ñ\87ниÑ\85 Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\98а.",
-       "mypreferencesprotected": "Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð·Ð° Ð¼ÐµÑ\9aаÑ\9aе Ð²Ð°Ñ\88иÑ\85 подешавања.",
+       "mycustomcssprotected": "Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð´Ð° Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98еÑ\82е Ð¾Ð²Ñ\83 CSS Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83.",
+       "mycustomjsonprotected": "Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð´Ð° Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98еÑ\82е Ð¾Ð²Ñ\83 JSON Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83.",
+       "mycustomjsprotected": "Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð´Ð° Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98еÑ\82е Ð¾Ð²Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ñ\81 Ñ\98аваÑ\81кÑ\80ипÑ\82ом.",
+       "myprivateinfoprotected": "Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð´Ð° Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98еÑ\82е Ñ\81воÑ\98е Ð¿Ñ\80иваÑ\82не Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\98е.",
+       "mypreferencesprotected": "Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð´Ð° Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98еÑ\82е Ñ\81воÑ\98а подешавања.",
        "ns-specialprotected": "Посебне странице се не могу уређивати.",
        "titleprotected": "Овај назив је [[User:$1|$1]] заштитио од прављења. Разлог: <em>$2</em>.",
        "filereadonlyerror": "Не могу да изменим датотеку „$1“ јер је ризница „$2“ у режиму за читање.\n\nСистемски администратор је навео следеће објашњење: „$3“.",
+       "invalidtitle": "Неважећи наслов",
        "invalidtitle-knownnamespace": "Неисправан наслов с именским простором „$2“ и текстом „$3“",
        "invalidtitle-unknownnamespace": "Неисправан наслов с именским простором бр. $1 и текстом „$2“",
        "exception-nologin": "Нисте пријављени",
        "exception-nologin-text": "Пријавите се да бисте приступили овој страници или радњи.",
        "exception-nologin-text-manual": "Морате бити $1 да бисте приступили овој страници или радњи.",
        "virus-badscanner": "Неисправно подешавање: непознати скенер за вирусе: <em>$1</em>",
-       "virus-scanfailed": "неуспешно скенирање (код $1)",
+       "virus-scanfailed": "скенирање није успело (код $1)",
        "virus-unknownscanner": "непознати антивирус:",
        "logouttext": "<strong>Сада сте одјављени.</strong>\n\nЗапамтите да неке странице могу да наставе да се приказују као да сте још увек пријављени, док не очистите привремену меморију свог прегледача.",
        "cannotlogoutnow-title": "Одјава тренутно није могућа",
        "cannotcreateaccount-text": "Директно прављење налога није омогућено на овом викију.",
        "yourdomainname": "Домен:",
        "password-change-forbidden": "Не можете да промените лозинку на овом викију.",
-       "externaldberror": "Ð\94оÑ\88ло Ñ\98е Ð´Ð¾ Ð³Ñ\80еÑ\88ке Ð¿Ñ\80и Ð¿Ñ\80епознаваÑ\9aÑ\83 Ð±Ð°Ð·Ðµ Ð¿Ð¾Ð´Ð°Ñ\82ака Ð¸Ð»Ð¸ Ð½ÐµÐ¼Ð°Ñ\82е Ð¾Ð²Ð»Ð°Ñ\88Ñ\9bеÑ\9aа да ажурирате свој спољни налог.",
+       "externaldberror": "Ð\94оÑ\88ло Ñ\98е Ð´Ð¾ Ð³Ñ\80еÑ\88ке Ð¿Ñ\80и Ð°Ñ\83Ñ\82енÑ\82иÑ\84икаÑ\86иÑ\98и Ð±Ð°Ð·Ðµ Ð¿Ð¾Ð´Ð°Ñ\82ака Ð¸Ð»Ð¸ Ð²Ð°Ð¼ Ð½Ð¸Ñ\98е Ð´Ð¾Ð·Ð²Ð¾Ñ\99ено да ажурирате свој спољни налог.",
        "login": "Пријави ме",
        "login-security": "Верификација вашег индентитета",
        "nav-login-createaccount": "Пријава/регистрација",
        "noemail": "Не постоји имејл адреса за {{GENDER:$1|корисника|корисницу}} $1.",
        "noemailcreate": "Морате да наведете валидну имејл адресу.",
        "passwordsent": "Нова лозинка је послата на имејл адресу {{GENDER:$1|корисника|кориснице|корисника}} $1.\nПријавите се пошто је примите.",
-       "blocked-mailpassword": "Ð\92аÑ\88а IP Ð°Ð´Ñ\80еÑ\81а Ð¸Ð¼Ð° Ð·Ð°Ð±Ñ\80анÑ\83 Ñ\83Ñ\80еÑ\92иваÑ\9aа. Ð Ð°Ð´Ð¸ Ñ\81пÑ\80еÑ\87аваÑ\9aа Ð·Ð»Ð¾Ñ\83поÑ\82Ñ\80ебе, Ð½Ð¸Ñ\98е Ð´Ð¾Ð·Ð²Ð¾Ñ\99ено Ð²Ñ\80аÑ\9bаÑ\9aе лозинке са ње.",
+       "blocked-mailpassword": "УÑ\80еÑ\92иваÑ\9aе Ñ\81а Ð²Ð°Ñ\88е IP Ð°Ð´Ñ\80еÑ\81е Ñ\98е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ано. Ð Ð°Ð´Ð¸ Ñ\81пÑ\80еÑ\87аваÑ\9aа Ð·Ð»Ð¾Ñ\83поÑ\82Ñ\80ебе, Ð·Ð°Ð±Ñ\80аÑ\9aена Ñ\98е Ð¸ Ñ\84Ñ\83нкÑ\86иÑ\98а Ð²Ñ\80аÑ\9bаÑ\9aа лозинке са ње.",
        "eauthentsent": "На наведену имејл адресу је послат потврдни код.\nПре него што пошаљемо даљње поруке, пратите упутства с имејла да бисте потврдили да сте Ви отворили налог.",
        "throttled-mailpassword": "Порука за промену лозинке је послата у {{PLURAL:$1|1=последњих сат времена|последња $1 сата|последњих $1 сати}}.\nДа бисмо спречили злоупотребу, подсетник шаљемо само једном у року од {{PLURAL:$1|1=сат времена|$1 сата|$1 сати}}.",
        "mailerror": "Грешка при слању поруке: $1",
        "botpasswords-label-grants": "Применљиве дозволе:",
        "botpasswords-label-grants-column": "Одобрено",
        "botpasswords-bad-appid": "Име бота „$1” није валидно.",
-       "botpasswords-insert-failed": "Неуспешно додавање бота \"$1\". Да ли је већ додат?",
+       "botpasswords-insert-failed": "Неуспело додавање бота под именом „$1”. Можда је већ додат?",
        "botpasswords-update-failed": "Неуспело ажурирање бота под називом „$1”. Да ли је обрисан?",
        "botpasswords-created-title": "Направљена лозинка бота",
        "botpasswords-created-body": "Лозинка за бота „$1” корисника „$2” је направљена.",
        "passwordreset-domain": "Домен:",
        "passwordreset-email": "Имејл адреса:",
        "passwordreset-emailtitle": "Детаљи налога на викију {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Неко (вероватно Ви, са IP адресе $1) је затражио нову лозинку на викију {{SITENAME}} ($4).\nСледећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом имејл адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку и наставите користити стару лозинку.",
+       "passwordreset-emailtext-ip": "Неко (вероватно Ви, с IP адресе $1) затражио је обнављање Ваше \nлозинке за пројекат {{SITENAME}} ($4). Следећи кориснички {{PLURAL:$3|налог је повезан|налози су повезани}} \nс овом имејл адресом:\n\n$2\n\n{{PLURAL:$3|Ова привремена лозинка|Ове привремене лозинке}} ће истећи за {{PLURAL:$5|један дан|$5 дана}}.\nТребате да се пријавите и одаберите нову лозинку одмах. Ако је неко други направио овај \nзахтев или сте се сетили своје првобитне лозинке, а не \nжелите да је промените, можете да занемарите ову поруку и наставите да користите своју стару \nлозинку.",
        "passwordreset-emailtext-user": "{{GENDER:$1|Корисник је затражио|Корисница је затражила}} подсетник о подацима за пријаву на викију {{SITENAME}} ($4).\nСледећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом имејл адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку.",
        "passwordreset-emailelement": "Корисничко име: \n$1\n\nПривремена лозинка: \n$2",
        "passwordreset-emailsentemail": "Ако је ово имејл адреса повезана са Вашим налогом, подсетник о лозинци ће бити послат на имејл.",
        "subject-preview": "Преглед теме:",
        "previewerrortext": "Догодила се грешка приликом приказивања ваших измена.",
        "blockedtitle": "Корисник је блокиран",
-       "blockedtext": "<strong>Ð\92аÑ\88е ÐºÐ¾Ñ\80иÑ\81ниÑ\87ко Ð¸Ð¼Ðµ Ð¸Ð»Ð¸ IP Ð°Ð´Ñ\80еÑ\81а Ñ\98е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана.</strong>\n\nÐ\91локиÑ\80аÑ\9aе Ñ\98е {{GENDER:$4|извÑ\80Ñ\88ио|извÑ\80Ñ\88ила}} $1.\nРазлог Ñ\98е <em>$2</em>.\n\n* Ð\9fоÑ\87еÑ\82ак Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа: $8\n* Ð\98Ñ\81Ñ\82ек Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа: $6\n* Ð\91локиÑ\80ани: $7\n\nÐ\9cожеÑ\82е Ð´Ð° Ñ\81е Ð¾Ð±Ñ\80аÑ\82иÑ\82е {{GENDER:$4|коÑ\80иÑ\81никÑ\83|коÑ\80иÑ\81ниÑ\86и}} $1 Ð¸Ð»Ð¸ [[{{MediaWiki:Grouppage-sysop}}|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\83]] Ñ\80ади Ð´Ð¸Ñ\81кÑ\83Ñ\81иÑ\98е Ð¾ Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aÑ\83.\nÐ\9dе Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82 â\80\9e{{int:emailuser}}â\80\9d Ð¾Ñ\81им Ð°ÐºÐ¾ Ñ\81Ñ\82е Ñ\83нели Ð²Ð°Ð»Ð¸Ð´Ð½Ñ\83 Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ñ\83 Ñ\81воÑ\98им [[Special:Preferences|подеÑ\88аваÑ\9aима]] Ð½Ð°Ð»Ð¾Ð³Ð° Ð¸ Ð½Ð¸Ñ\81Ñ\82е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ани Ð¾Ð´ ÐºÐ¾Ñ\80иÑ\88Ñ\9bеÑ\9aа Ð¸Ñ\81Ñ\82е.\nÐ\92аÑ\88а Ñ\82Ñ\80енÑ\83Ñ\82на IP Ð°Ð´Ñ\80еÑ\81а Ñ\98е $3, Ð° ID Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа #$5.\nÐ\9dаведиÑ\82е Ñ\81ве Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\98е Ð¾Ð´Ð¾Ð·Ð³Ð¾ Ð¿Ñ\80и Ñ\81Ñ\82ваÑ\80ању било каквих упита.",
-       "autoblockedtext": "Ð\92аÑ\88а IP Ð°Ð´Ñ\80еÑ\81а Ñ\98е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана Ñ\98еÑ\80 Ñ\98Ñ\83 Ñ\98е Ñ\83поÑ\82Ñ\80ебÑ\99авао Ð´Ñ\80Ñ\83ги ÐºÐ¾Ñ\80иÑ\81ник, ÐºÐ¾Ð³Ð° Ñ\98е {{GENDER:$4|блокиÑ\80ао|блокиÑ\80ала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Ð\94аÑ\82Ñ\83м Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа: $8\n* Ð\91локиÑ\80аÑ\9aе Ð¸Ñ\81Ñ\82иÑ\87е: $6\n* Ð\98ме ÐºÐ¾Ñ\80иÑ\81ника: $7\n\nÐ\9eбÑ\80аÑ\82иÑ\82е Ñ\81е {{GENDER:$4|коÑ\80иÑ\81никÑ\83|коÑ\80иÑ\81ниÑ\86и}} $1 Ð¸Ð»Ð¸ [[{{MediaWiki:Grouppage-sysop}}|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\83]] Ð´Ð° Ñ\80азÑ\98аÑ\81ниÑ\82е Ñ\81Ñ\82ваÑ\80.\n\nÐ\9dе Ð¼Ð¾Ð¶ÐµÑ\82е ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82и Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82 â\80\9e{{int:emailuser}}â\80\9c Ð°ÐºÐ¾ Ð½Ð¸Ñ\81Ñ\82е Ñ\83нели Ð²Ð°Ð»Ð¸Ð´Ð½Ñ\83 Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ñ\83 [[Special:Preferences|подеÑ\88аваÑ\9aима]].\n\nÐ\92аÑ\88а Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана IP Ð°Ð´Ñ\80еÑ\81а Ñ\98е $3, Ð° ID $5.\nÐ\9dаведиÑ\82е Ñ\81ве Ð¿Ð¾Ð´Ð°Ñ\82ке Ð¸Ð·Ð½Ð°Ð´ Ð¿Ñ\80и Ñ\81Ñ\82ваÑ\80ању било каквих упита.",
+       "blockedtext": "<strong>Ð\92аÑ\88е ÐºÐ¾Ñ\80иÑ\81ниÑ\87ко Ð¸Ð¼Ðµ Ð¸Ð»Ð¸ IP Ð°Ð´Ñ\80еÑ\81а Ñ\98е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана.</strong>\n\nÐ\91локиÑ\80аÑ\9aе Ñ\98е {{GENDER:$4|извÑ\80Ñ\88ио|извÑ\80Ñ\88ила}} $1.\nРазлог Ñ\98е <em>$2</em>.\n\n* Ð\9fоÑ\87еÑ\82ак Ð±Ð»Ð¾ÐºÐ°Ð´Ðµ: $8\n* Ð\9aÑ\80аÑ\98 Ð±Ð»Ð¾ÐºÐ°Ð´Ðµ: $6\n* Ð\91локиÑ\80ани ÐºÐ¾Ñ\80иÑ\81ник: $7\n\nÐ\9cожеÑ\82е Ð´Ð° ÐºÐ¾Ð½Ñ\82акÑ\82иÑ\80аÑ\82е {{GENDER:$4|коÑ\80иÑ\81ника|коÑ\80иÑ\81ниÑ\86Ñ\83}} $1 Ð¸Ð»Ð¸ Ð´Ñ\80Ñ\83гог [[{{MediaWiki:Grouppage-sysop}}|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80а]] Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ñ\80азговаÑ\80али Ð¾ Ð±Ð»Ð¾ÐºÐ°Ð´Ð¸.\nÐ\9dе Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82 â\80\9e{{int:emailuser}}â\80\9d Ð¾Ñ\81им Ð°ÐºÐ¾ Ñ\81Ñ\82е Ð½Ð°Ð²ÐµÐ»Ð¸ Ð²Ð°Ñ\99анÑ\83 Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ñ\83 Ñ\81воÑ\98им [[Special:Preferences|подеÑ\88аваÑ\9aима Ð½Ð°Ð»Ð¾Ð³Ð°]] Ð¸ Ð½Ð¸Ñ\81Ñ\82е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ани Ð¾Ð´ ÐºÐ¾Ñ\80иÑ\88Ñ\9bеÑ\9aа Ð¸Ñ\81Ñ\82е.\nÐ\92аÑ\88а Ñ\82Ñ\80енÑ\83Ñ\82на IP Ð°Ð´Ñ\80еÑ\81а Ñ\98е $3, Ð° ID Ð±Ð»Ð¾ÐºÐ°Ð´Ðµ #$5.\nУкÑ\99Ñ\83Ñ\87иÑ\82е Ñ\81ве Ð³Ð¾Ñ\80Ñ\9aе Ð´ÐµÑ\82аÑ\99е Ð¿Ñ\80и Ð¿Ñ\80авÑ\99ењу било каквих упита.",
+       "autoblockedtext": "Ð\92аÑ\88а IP Ð°Ð´Ñ\80еÑ\81а Ñ\98е Ð°Ñ\83Ñ\82омаÑ\82Ñ\81ки Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана Ñ\98еÑ\80 Ñ\98Ñ\83 Ñ\98е ÐºÐ¾Ñ\80иÑ\81Ñ\82ио Ð´Ñ\80Ñ\83ги ÐºÐ¾Ñ\80иÑ\81ник, ÐºÐ¾Ð³Ð° Ñ\98е {{GENDER:$4|блокиÑ\80ао|блокиÑ\80ала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Ð\9fоÑ\87еÑ\82ак Ð±Ð»Ð¾ÐºÐ°Ð´Ðµ: $8\n* Ð\9aÑ\80аÑ\98 Ð±Ð»Ð¾ÐºÐ°Ð´Ðµ: $6\n* Ð\98ме ÐºÐ¾Ñ\80иÑ\81ника: $7\n\nÐ\9cожеÑ\82е Ð´Ð° ÐºÐ¾Ð½Ñ\82акÑ\82иÑ\80аÑ\82е {{GENDER:$4|коÑ\80иÑ\81ника|коÑ\80иÑ\81ниÑ\86Ñ\83}} $1 Ð¸Ð»Ð¸ Ð´Ñ\80Ñ\83гог [[{{MediaWiki:Grouppage-sysop}}|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80а]] Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ñ\80аÑ\81пÑ\80авÑ\99али Ð¾ Ð±Ð»Ð¾ÐºÐ°Ð´Ð¸.\n\nÐ\97апамÑ\82иÑ\82е Ð´Ð° Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82 â\80\9e{{int:emailuser}}â\80\9c Ð¾Ñ\81им Ð°ÐºÐ¾ Ñ\81Ñ\82е Ð½Ð°Ð²ÐµÐ»Ð¸ Ð²Ð°Ñ\99анÑ\83 Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ñ\83 Ñ\81воÑ\98им [[Special:Preferences|подеÑ\88аваÑ\9aима]].\n\nÐ\92аÑ\88а Ñ\82Ñ\80енÑ\83Ñ\82на IP Ð°Ð´Ñ\80еÑ\81а Ñ\98е $3, Ð° ID Ð±Ð»Ð¾ÐºÐ°Ð´Ðµ $5.\nУкÑ\99Ñ\83Ñ\87иÑ\82е Ñ\81ве Ð³Ð¾Ñ\80Ñ\9aе Ð´ÐµÑ\82аÑ\99е Ð¿Ñ\80и Ð¿Ñ\80авÑ\99ењу било каквих упита.",
        "blockednoreason": "разлог није наведен",
        "whitelistedittext": "За уређивање странице је потребно да будете $1.",
        "confirmedittext": "Морате да потврдите своју имејл адресу пре уређивања страница.\nПоставите и потврдите имејл адресу преко [[Special:Preferences|подешавања]].",
        "undo-nochange": "Изгледа да је измена већ поништена.",
        "undo-summary": "Поништена измена $1 {{GENDER:$2|корисника|кориснице}} [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]])",
        "undo-summary-username-hidden": "Поништи измену $1 скривеног корисника",
-       "cantcreateaccount-text": "Отварање налога с ове ИП адресе (<strong>$1</strong>) је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је <em>$2</em>",
+       "cantcreateaccount-text": "Отварање налога с ове IP адресе (<strong>$1</strong>) је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је <em>$2</em>",
        "cantcreateaccount-range-text": "Отварање налога са IP адреса у распону <strong>$1</strong>, који укључује и вашу IP адресу (<strong>$4</strong>) је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је <em>$2</em>",
        "viewpagelogs": "Погледај евиденције ове странице",
        "nohistory": "Не постоји историја измена ове странице.",
        "rev-deleted-comment": "(опис измене уклоњен)",
        "rev-deleted-user": "(корисничко име уклоњено)",
        "rev-deleted-event": "(детаљи уноса уклоњени)",
-       "rev-deleted-user-contribs": "[корисничко име или ИП адреса је уклоњена – измена је сакривена са списка доприноса]",
+       "rev-deleted-user-contribs": "[корисничко име или IP адреса је уклоњена – измена је сакривена са списка доприноса]",
        "rev-deleted-text-permission": "Измена ове странице је '''обрисана'''.\nДетаље можете видети у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} историји брисања].",
        "rev-suppressed-text-permission": "Измена ове странице је <strong>сакривена</strong>. Више детаља можете наћи у [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} историји сакривања].",
        "rev-deleted-text-unhide": "Измена ове странице је <strong>обрисана</strong>.\nВише информација можете да пронађете у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} евиденцији брисања].\nИпак можете да [$1 погледате ову измену] ако желите да наставите.",
        "revdelete-hide-image": "Сакриј садржај датотеке",
        "revdelete-hide-name": "Циљ и параметре",
        "revdelete-hide-comment": "Опис измене",
-       "revdelete-hide-user": "Корисничко име/ИП адреса",
+       "revdelete-hide-user": "Корисничко име/IP адреса",
        "revdelete-hide-restricted": "Сакриј податке од администратора и других корисника",
        "revdelete-radio-same": "(не мењај)",
        "revdelete-radio-set": "Сакривено",
        "mergehistory-no-source": "Изворна страница $1 не постоји.",
        "mergehistory-no-destination": "Одредишна страница $1 не постоји.",
        "mergehistory-invalid-source": "Изворна страница мора имати валидан наслов.",
-       "mergehistory-invalid-destination": "Ð\9eдÑ\80едиÑ\88на Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¼Ð¾Ñ\80а Ð¸Ð¼Ð°Ñ\82и Ð¸Ñ\81пÑ\80аван наслов.",
+       "mergehistory-invalid-destination": "Ð\9eдÑ\80едиÑ\88на Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¼Ð¾Ñ\80а Ð´Ð° Ð¸Ð¼Ð° Ð²Ð°Ð¶ÐµÑ\9bи наслов.",
        "mergehistory-autocomment": "Страница [[:$1]] је спојена у [[:$2]]",
        "mergehistory-comment": "Страница [[:$1]] је спојена у [[:$2]]: $3",
        "mergehistory-same-destination": "Изворна и одредишна страница не могу бити исте",
        "prefs-files": "Датотеке",
        "prefs-custom-css": "прилагођени CSS",
        "prefs-custom-json": "Прилагођени JSON",
-       "prefs-custom-js": "прилагођени Јаваскрипт",
-       "prefs-common-config": "Дељени CSS/JSON/Јаваскрипт за све теме:",
+       "prefs-custom-js": "прилагођени јаваскрипт",
+       "prefs-common-config": "Дељени CSS/JSON/јаваскрипт за све теме:",
        "prefs-reset-intro": "Можете користити ову страницу да поново поставите своја подешавања на подразумеване вредности сајта.\nОво се не може опозвати.",
        "prefs-emailconfirm-label": "Потврда имејла:",
        "youremail": "Имејл:",
        "prefswarning-warning": "Променили сте ваша подешавања али нисте их још сачували.\nАко не притиснете „$1“ ваша подешавања ће бити изгубљена.",
        "prefs-tabs-navigation-hint": "Савет: можете користити типке са левом и десном стрелицом за кретање кроз картице.",
        "userrights": "Корисничка права",
-       "userrights-lookup-user": "Ð\98забеÑ\80и корисника",
+       "userrights-lookup-user": "Ð\98збоÑ\80 корисника",
        "userrights-user-editname": "Корисничко име:",
        "editusergroup": "Учитај корисничке групе",
        "editinguser": "Мењате корисничка права {{GENDER:$1|корисника|кориснице}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Промена {{GENDER:$1|корисничких}} група",
        "userrights-viewusergroup": "Преглед {{GENDER:$1|корисничких}} група",
        "saveusergroups": "Сачувај {{GENDER:$1|корисничке}} групе",
-       "userrights-groupsmember": "Члан:",
-       "userrights-groupsmember-auto": "Подразумевано члан и:",
+       "userrights-groupsmember": "Члан група:",
+       "userrights-groupsmember-auto": "{{GENDER:$2|Имплицитан члан|Имплицитна чланица}} група:",
        "userrights-groups-help": "Можете променити групе којима овај корисник припада:\n* Означен квадратић означава да се корисник налази у тој групи.\n* Неозначен квадратић означава да се корисник не налази у тој групи.\n* Звездица (*) означава да не можете уклонити ту групу ако је додате и обратно.\n* Тараба (#) означава да једино можете одложити време истека чланства у тој групи; не можете га убрзати.",
        "userrights-reason": "Разлог:",
-       "userrights-no-interwiki": "Ð\9dемаÑ\82е Ð¾Ð²Ð»Ð°Ñ\88Ñ\9bеÑ\9aа Ð´Ð° Ð¼ÐµÑ\9aате корисничка права на другим викијима.",
+       "userrights-no-interwiki": "Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð´Ð° Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98ете корисничка права на другим викијима.",
        "userrights-nodatabase": "База података $1 не постоји или није локална.",
        "userrights-changeable-col": "Групе које можете да промените",
        "userrights-unchangeable-col": "Групе које не можете да промените",
        "right-block": "блокирање даљих измена других корисника",
        "right-blockemail": "блокирање корисника да шаљу имејл",
        "right-hideuser": "блокирање корисничког имена и његово сакривање од јавности",
-       "right-ipblock-exempt": "заобилажење блокирања ИП адресе, аутоматска блокирања и блокирања опсега",
+       "right-ipblock-exempt": "заобилажење IP блокада, самоблокада и блокада опсега",
        "right-unblockself": "одблокирање самог себе",
        "right-protect": "мењање степена заштите и уређивање страница под преносивом заштитом",
        "right-editprotected": "уређивање страница под заштитом „{{int:protect-level-sysop}}“",
        "rcfilters-liveupdates-button-title-off": "Прикажите нове измене уживо",
        "rcfilters-watchlist-markseen-button": "Означи све измене као погледане",
        "rcfilters-watchlist-edit-watchlist-button": "Промени списак надгледаних страница",
-       "rcfilters-watchlist-showupdated": "Ð\98змене Ñ\81Ñ\82Ñ\80аниÑ\86а ÐºÐ¾Ñ\98е Ð½Ð¸Ñ\81Ñ\82е Ð¿Ð¾Ñ\81еÑ\82или Ð¾Ð´ ÐºÐ°Ð´Ð° Ñ\98е Ð¸Ð·Ð¼ÐµÐ½Ð° Ð¸Ð·Ð²Ñ\80Ñ\88ена Ñ\81Ñ\83 <strong>подебÑ\99ане</strong>, Ñ\81а испуњеним ознакама.",
+       "rcfilters-watchlist-showupdated": "Ð\9fÑ\80омене Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86ама ÐºÐ¾Ñ\98е Ð½Ð¸Ñ\81Ñ\82е Ð¿Ð¾Ñ\81еÑ\82или Ð¾Ð´ ÐºÐ°Ð´Ð° Ñ\98е Ð¸Ð·Ð¼ÐµÐ½Ð° Ð¸Ð·Ð²Ñ\80Ñ\88ена Ñ\81Ñ\83 <strong>подебÑ\99ане</strong>, Ñ\81 испуњеним ознакама.",
        "rcfilters-preference-label": "Сакриј побољшану верзију скорашњих измена",
        "rcfilters-preference-help": "Поништава редизајн интерфејса из 2017. и све алатке додате тада и после.",
        "rcfilters-watchlist-preference-label": "Сакриј побољшану верзију списка надгледања",
        "backend-fail-notexists": "Датотека $1 не постоји.",
        "backend-fail-hashes": "Не могу да добијем дисперзије датотеке за упоређивање.",
        "backend-fail-notsame": "Већ постоји неистоветна датотека – $1.",
-       "backend-fail-invalidpath": "$1 Ð½Ð¸Ñ\98е Ð¸Ñ\81пÑ\80авна путања за складиштење.",
+       "backend-fail-invalidpath": "$1 Ð½Ð¸Ñ\98е Ð²Ð°Ð¶ÐµÑ\9bа путања за складиштење.",
        "backend-fail-delete": "Не могу да обришем датотеку „$1”.",
        "backend-fail-describe": "Не могу да променим метаподатке за датотеку „$1“.",
        "backend-fail-alreadyexists": "Датотека $1 већ постоји.",
        "http-curl-error": "Грешка при отварању адресе: $1",
        "http-bad-status": "Дошло је до проблема током захтева HTTP: $1 $2",
        "upload-curl-error6": "Не могу да приступим адреси",
-       "upload-curl-error6-text": "Не могу да приступим наведеној адреси.\nПроверите да ли је адреса исправна и доступна.",
+       "upload-curl-error6-text": "Не могу да приступим наведеном URL-у.\nПроверите да ли је URL исправан и доступан.",
        "upload-curl-error28": "Отпремање је истекло",
        "upload-curl-error28-text": "Сервер не одговара на упит.\nПроверите да ли сајт ради, мало осачекајте и покушајте поново.\nПробајте касније када буде мање оптерећење.",
        "license": "Лиценца:",
        "emailtarget": "Унос корисничког имена примаоца",
        "emailusername": "Корисничко име:",
        "emailusernamesubmit": "Пошаљи",
-       "email-legend": "Ð\9fоÑ\88аÑ\99и Ð¸Ð¼ÐµÑ\98л Ð´Ñ\80Ñ\83гом ÐºÐ¾Ñ\80иÑ\81никÑ\83",
+       "email-legend": "СлаÑ\9aе Ð¸Ð¼ÐµÑ\98ла Ð´Ñ\80Ñ\83гом ÐºÐ¾Ñ\80иÑ\81никÑ\83 Ð¿Ñ\80оÑ\98екÑ\82а {{SITENAME}}",
        "emailfrom": "Од:",
        "emailto": "За:",
        "emailsubject": "Наслов:",
        "watchlist": "Списак надгледања",
        "mywatchlist": "Списак надгледања",
        "watchlistfor2": "За $1 $2",
-       "nowatchlist": "Ð\92аÑ\88 Ñ\81пиÑ\81ак Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ñ\9aа Ñ\98е Ð¿Ñ\80азан.",
+       "nowatchlist": "Ð\9dемаÑ\82е Ð½Ð¸Ñ\88Ñ\82а Ð½Ð° Ñ\81вом Ñ\81пиÑ\81кÑ\83 Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ñ\9aа.",
        "watchlistanontext": "Морате бити пријављени да бисте гледали и уређивали ставке на вашем списку надгледања.",
        "watchnologin": "Нисте пријављени",
        "addwatch": "Додај на списак надгледања",
        "unwatchthispage": "Прекини надгледање",
        "notanarticle": "Није страница са садржајем",
        "notvisiblerev": "Измена је обрисана",
-       "watchlist-details": "Ð\9dа Ð\92аÑ\88ем Ñ\81пиÑ\81кÑ\83 Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ñ\9aа {{PLURAL:$1|Ñ\98е $1 Ñ\81Ñ\82Ñ\80аниÑ\86а|Ñ\81Ñ\83 $1 Ñ\81Ñ\82Ñ\80аниÑ\86е|Ñ\98е $1 Ñ\81Ñ\82Ñ\80аниÑ\86а}} (плус странице за разговор).",
+       "watchlist-details": "Ð\98маÑ\82е {{PLURAL:$1|$1 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83|$1 Ñ\81Ñ\82Ñ\80аниÑ\86е|$1 Ñ\81Ñ\82Ñ\80аниÑ\86а}} Ð½Ð° Ñ\81вом Ñ\81пиÑ\81кÑ\83 Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ñ\9aа (плус странице за разговор).",
        "wlheader-enotif": "Обавештење имејлом је омогућено.",
        "wlheader-showupdated": "Странице које су измењене откад сте их последњи пут посетили су <strong>подебљане</strong>.",
        "wlnote": "Испод {{PLURAL:$1|је последња измена|су последње <strong>$1</strong> измене|је последњих <strong>$1</strong> измена}} у {{PLURAL:$2|претходном сату|претходна <strong>$2</strong> сата|претходних <strong>$2</strong> сати}}, закључно са $3, $4.",
        "deletecomment": "Разлог:",
        "deleteotherreason": "Други/додатни разлог:",
        "deletereasonotherlist": "Други разлог",
-       "deletereason-dropdown": "*Најчешћи разлози за брисање\n** Спам\n** Захтев аутора\n** Кршење ауторских права\n** Вандализам",
+       "deletereason-dropdown": "* Уобичајени разлози за брисање\n** Непожељан садржај\n** Вандализам\n** Кршење ауторских права\n** Захтев аутора\n** Покварено преусмерење",
        "delete-edit-reasonlist": "Уреди разлоге брисања",
        "delete-toobig": "Ова страница има велику историју, преко $1 {{PLURAL:$1|измене|измене|измена}}.\nБрисање таквих страница је ограничено да би се спречило случајно оптерећење сервера.",
        "delete-warning-toobig": "Ова страница има велику историју, преко $1 {{PLURAL:$1|измене|изменe|измена}}.\nЊено брисање може пореметити базу података, стога поступајте с опрезом.",
        "rollbacklink": "врати",
        "rollbacklinkcount": "врати $1 {{PLURAL:$1|измену|измене|измена}}",
        "rollbacklinkcount-morethan": "врати више од $1 {{PLURAL:$1|измене|измене|измена}}",
-       "rollbackfailed": "Ð\9dеÑ\83Ñ\81пеÑ\88но Ð²Ñ\80аÑ\9bаÑ\9aе",
+       "rollbackfailed": "Ð\92Ñ\80аÑ\9bаÑ\9aе Ð½Ð¸Ñ\98е Ñ\83Ñ\81пело",
        "rollback-missingparam": "Недостаје потребан параметар на захтеву.",
        "rollback-missingrevision": "Не могу да учитам податке о измени.",
        "cantrollback": "Не могу да вратим измену.\nПоследњи аутор је уједно и једини.",
        "protect-legend": "Подешавања заштите",
        "protectcomment": "Разлог:",
        "protectexpiry": "Истиче:",
-       "protect_expiry_invalid": "Време истека је неисправно.",
+       "protect_expiry_invalid": "Време истека није важеће.",
        "protect_expiry_old": "Време истека је старије од тренутног времена.",
        "protect-unchain-permissions": "Откључај даљња подешавања заштите",
        "protect-text": "Овде можете да погледате и промените ниво заштите странице <strong>$1</strong>.",
        "protect-locked-blocked": "Не можете мењати степене заштите док сте блокирани.\nОво су тренутна подешавања странице '''$1''':",
        "protect-locked-dblock": "Степени заштите се не могу мењати јер је активна база података закључана.\nОво су подешавања странице '''$1''':",
-       "protect-locked-access": "Ð\9dемаÑ\82е Ð¾Ð²Ð»Ð°Ñ\88Ñ\9bеÑ\9aа Ð·Ð° Ð¼ÐµÑ\9aаÑ\9aе Ñ\81Ñ\82епена заштите странице.\nОво су тренутна подешавања странице '''$1''':",
+       "protect-locked-access": "Ð\92аÑ\88 Ð½Ð°Ð»Ð¾Ð³ Ð½ÐµÐ¼Ð° Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð·Ð° Ð¼ÐµÑ\9aаÑ\9aе Ð½Ð¸Ð²Ð¾а заштите странице.\nОво су тренутна подешавања странице '''$1''':",
        "protect-cascadeon": "Ова страница је тренутно заштићена јер је укључена у {{PLURAL:$1|следећу страницу која има|следеће странице које имају}} укључену преносиву заштиту.\nПромене нивоа заштите ове странице неће да утичу на преносиву заштиту.",
        "protect-default": "Допуштено свим корисницима",
        "protect-fallback": "Дозвољено само корисницима са дозволом „$1“",
        "protect-expiring-local": "истиче $1",
        "protect-expiry-indefinite": "неодређено",
        "protect-cascade": "Заштити странице које су укључене у ову (преносива заштита)",
-       "protect-cantedit": "Ð\9dе Ð¼Ð¾Ð¶ÐµÑ\82е Ð¼ÐµÑ\9aаÑ\82и Ñ\81Ñ\82епене Ð·Ð°Ñ\88Ñ\82иÑ\82е Ð¾Ð²Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\98еÑ\80 Ð½ÐµÐ¼Ð°Ñ\82е Ð¾Ð²Ð»Ð°Ñ\88Ñ\9bеÑ\9aа Ð·Ð° Ñ\83Ñ\80еÑ\92иваÑ\9aе.",
+       "protect-cantedit": "Ð\9dе Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð¼ÐµÑ\9aаÑ\82е Ð½Ð¸Ð²Ð¾ Ð·Ð°Ñ\88Ñ\82иÑ\82е Ð¾Ð²Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\98еÑ\80 Ð½ÐµÐ¼Ð°Ñ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð´Ð° Ñ\98е Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98еÑ\82е.",
        "protect-othertime": "Друго време:",
        "protect-othertime-op": "друго време",
        "protect-existing-expiry": "Постојеће време истека: $2 у $3",
        "ipbexpiry": "Истиче:",
        "ipbreason": "Разлог:",
        "ipbreason-dropdown": "*Најчешћи разлози за блокирање\n** Уношење лажних информација\n** Уклањање садржаја са страница\n** Постављање веза до спољашњих сајтова\n** Уношење бесмислица у странице\n** Непристојно понашање\n** Употреба више налога\n** Неприхватљиво корисничко име",
-       "ipb-hardblock": "Ð\9eнемогÑ\83Ñ\9bи Ð¿Ñ\80иÑ\98авÑ\99еним ÐºÐ¾Ñ\80иÑ\81ниÑ\86има Ð´Ð° Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98Ñ\83 Ñ\81 Ð¾Ð²Ðµ Ð\98Ð\9f адресе",
+       "ipb-hardblock": "СпÑ\80еÑ\87и Ð¿Ñ\80иÑ\98авÑ\99ене ÐºÐ¾Ñ\80иÑ\81нике Ð´Ð° Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98Ñ\83 Ñ\81 Ð¾Ð²Ðµ IP адресе",
        "ipbcreateaccount": "Онемогући отварање налога",
        "ipbemailban": "Спречи корисника да шаље имејлове",
-       "ipbenableautoblock": "Аутоматски блокирај последњу ИП адресу овог корисника и све даљње адресе с којих покуша да уређује",
+       "ipbenableautoblock": "Аутоматски блокирај последњу IP адресу овог корисника и све даљње адресе с којих покуша да уређује",
        "ipbsubmit": "Блокирај овог корисника",
        "ipbother": "Друго време:",
        "ipboptions": "2 сата:2 hours,1 дан:1 day,3 дана:3 days,1 недеља:1 week,2 недеље:2 weeks,1 месец:1 month,3 месеца:3 months,6 месеци:6 months,1 година:1 year,трајно:infinite",
        "ipb-disableusertalk": "Онемогући кориснику да уређује своју страницу за разговор",
        "ipb-change-block": "Поновно блокирај корисника с овим подешавањима",
        "ipb-confirm": "Потврди блокирање",
-       "badipaddress": "Ð\9dеиÑ\81пÑ\80авна IP адреса",
+       "badipaddress": "Ð\9dеважеÑ\9bа IP адреса",
        "blockipsuccesssub": "Блокирање је успело",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] је {{GENDER:$1|блокиран|блокирана|блокиран}}.<br />\nБлокирања можете да погледате [[Special:BlockList|овде]].",
        "ipb-blockingself": "Овом радњом ћете блокирати себе! Јесте ли сигурни да то желите?",
        "ipb-blocklist-contribs": "Доприноси за {{GENDER:$1|$1}}",
        "ipb-blocklist-duration-left": "преостало: $1",
        "unblockip": "Деблокирај корисника",
-       "unblockiptext": "Ð\9aоÑ\80иÑ\81Ñ\82иÑ\82е Ð¾Ð±Ñ\80азаÑ\86 Ð¸Ñ\81под Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ð²Ñ\80аÑ\82или Ð¿Ñ\80аво Ð¿Ð¸Ñ\81аÑ\9aа Ð±Ð»Ð¾ÐºÐ¸Ñ\80аноÑ\98 Ð\98Ð\9f адреси или корисничком имену.",
+       "unblockiptext": "Ð\9aоÑ\80иÑ\81Ñ\82иÑ\82е Ð´Ð¾Ñ\9aи Ð¾Ð±Ñ\80азаÑ\86 Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ð²Ñ\80аÑ\82или Ð¿Ñ\80аво Ð¿Ð¸Ñ\81аÑ\9aа Ñ\80аниÑ\98е Ð±Ð»Ð¾ÐºÐ¸Ñ\80аноÑ\98 IP адреси или корисничком имену.",
        "ipusubmit": "Уклони ову блокаду",
        "unblocked": "[[User:$1|$1]] је деблокиран",
        "unblocked-range": "$1 је деблокиран",
        "ipblocklist-legend": "Проналажење блокираног корисника",
        "blocklist-userblocks": "Сакриј блокирања налога",
        "blocklist-tempblocks": "Сакриј привремена блокирања",
-       "blocklist-addressblocks": "СакÑ\80иÑ\98 Ð¿Ð¾Ñ\98единаÑ\87на Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81е",
+       "blocklist-addressblocks": "СакÑ\80иÑ\98 Ð¿Ð¾Ñ\98единаÑ\87не Ð±Ð»Ð¾ÐºÐ°Ð´Ðµ IP-а",
        "blocklist-rangeblocks": "Сакриј блокирања опсега",
        "blocklist-timestamp": "Временска ознака",
        "blocklist-target": "Корисник",
        "change-blocklink": "промени блокаду",
        "contribslink": "доприноси",
        "emaillink": "пошаљи имејл",
-       "autoblocker": "Аутоматски сте блокирани јер делите ИП адресу с корисником/цом [[User:$1|$1]].\nРазлог блокирања: „$2“",
+       "autoblocker": "Аутоматски сте блокирани јер делите IP адресу с корисником/цом [[User:$1|$1]].\nРазлог блокирања корисника/це $1 је „$2“",
        "blocklogpage": "Евиденција блокирања",
        "blocklog-showlog": "{{GENDER:$1|Овај корисник је раније блокиран|Ова корисница је раније блокирана}}.\nИсторија блокирања се налази испод:",
        "blocklog-showsuppresslog": "{{GENDER:$1|Овај корисник је раније блокиран и сакривен|Ова корисница је раније блокирана и сакривена}}.\nИсторија сакривања се налази испод:",
        "block-log-flags-nousertalk": "забрањено уређивање сопствене странице за разговор",
        "block-log-flags-angry-autoblock": "проширено аутоматско блокирање је омогућено",
        "block-log-flags-hiddenname": "корисничко име је сакривено",
-       "range_block_disabled": "Ð\90дминиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\81ка Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82 Ð·Ð° Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aе Ñ\80аÑ\81пона Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81а је онемогућена.",
-       "ipb_expiry_invalid": "Време истека је неисправно.",
+       "range_block_disabled": "Ð\90дминиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\81ка Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82 Ð·Ð° Ð¿Ñ\80авÑ\99еÑ\9aе Ð¾Ð¿Ñ\81ега Ð±Ð»Ð¾ÐºÐ°Ð´Ðµ је онемогућена.",
+       "ipb_expiry_invalid": "Време истека није важеће.",
        "ipb_expiry_old": "Време истека је у прошлости.",
        "ipb_expiry_temp": "Сакривене блокаде корисника морају бити трајне.",
        "ipb_hide_invalid": "Не могу да потиснем овај налог; има више од {{PLURAL:$1|једне измене|$1 измена}}.",
        "ipb-otherblocks-header": "{{PLURAL:$1|Друге блокаде}}",
        "unblock-hideuser": "Не можете деблокирати овог корисника јер је његово корисничко име сакривено.",
        "ipb_cant_unblock": "Грешка: блокада $1 не постоји. Можда је корисник деблокиран.",
-       "ipb_blocked_as_range": "Ð\93Ñ\80еÑ\88ка: IP Ð°Ð´Ñ\80еÑ\81а $1 Ð½Ð¸Ñ\98е Ð´Ð¸Ñ\80екÑ\82но Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана Ð¸ Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð´ÐµÐ±Ð»Ð¾ÐºÐ¸Ñ\80а.\nÐ\9eна Ñ\98е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана ÐºÐ°Ð¾ Ð´ÐµÐ¾ Ð±Ð»Ð¾ÐºÐ°Ð´Ðµ $2, ÐºÐ¾Ñ\98а Ð¼Ð¾Ð¶Ðµ Ð±Ð¸Ñ\82и Ð´ÐµÐ±Ð»Ð¾ÐºÐ¸Ñ\80ана.",
-       "ip_range_invalid": "Ð\9dеиÑ\81пÑ\80аван Ñ\80аÑ\81пон IP Ð°Ð´Ñ\80еÑ\81а.",
-       "ip_range_toolarge": "Ð\9eпÑ\81ежна Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа Ð²ÐµÑ\9bа Ð¾Ð´ /$1 Ð½Ð¸Ñ\81Ñ\83 Ð´Ð¾Ð·Ð²Ð¾Ñ\99ена.",
-       "ip_range_toolow": "IP-опсези нису дозвољени.",
+       "ipb_blocked_as_range": "Ð\93Ñ\80еÑ\88ка: IP Ð°Ð´Ñ\80еÑ\81а $1 Ð½Ð¸Ñ\98е Ð´Ð¸Ñ\80екÑ\82но Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана Ð¸ Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð´ÐµÐ±Ð»Ð¾ÐºÐ¸Ñ\80а.\nÐ\9eна Ñ\98е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана ÐºÐ°Ð¾ Ð´ÐµÐ¾ Ð±Ð»Ð¾ÐºÐ°Ð´Ðµ $2, ÐºÐ¾Ñ\98а Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð´ÐµÐ±Ð»Ð¾ÐºÐ¸Ñ\80а.",
+       "ip_range_invalid": "Ð\9dеважеÑ\9bи Ð¾Ð¿Ñ\81ег IP Ð°Ð´Ñ\80еÑ\81е.",
+       "ip_range_toolarge": "Ð\9eпÑ\81ези Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа Ð²ÐµÑ\9bи Ð¾Ð´ /$1 Ð½Ð¸Ñ\81Ñ\83 Ð´Ð¾Ð·Ð²Ð¾Ñ\99ени.",
+       "ip_range_toolow": "IP опсези нису дозвољени.",
        "proxyblocker": "Блокер посредника",
-       "proxyblockreason": "Ваша ИП адреса је блокирана јер представља отворени посредник.\nОбратите се вашем добављачу интернет услуга или техничку подршку и обавестите их о овом озбиљном безбедносном проблему.",
+       "proxyblockreason": "Ваша IP адреса је блокирана јер представља отворени посредник.\nОбратите се вашем добављачу интернет услуга или техничку подршку и обавестите их о овом озбиљном безбедносном проблему.",
        "sorbs": "DNSBL",
-       "sorbsreason": "Ваша ИП адреса је наведена као отворени посредник у DNSBL-у који користи {{SITENAME}}.",
-       "sorbs_create_account_reason": "Ваша ИП адреса је наведена као отворени посредник у DNSBL-у који користи {{SITENAME}}.\nНе можете да отворите налог.",
+       "sorbsreason": "Ваша IP адреса је наведена као отворени посредник у DNSBL-у који користи {{SITENAME}}.",
+       "sorbs_create_account_reason": "Ваша IP адреса је наведена као отворени посредник у DNSBL-у који користи {{SITENAME}}.\nНе можете да отворите налог.",
        "cant-see-hidden-user": "Корисник којег покушавате да блокирате је већ блокиран и сакривен.\nС обзиром на то да немате права за сакривање корисника, не можете да погледате нити уредите корисничку блокаду.",
        "ipbblocked": "Не можете забранити или вратити приступ другим корисницима јер сте и сами блокирани",
        "ipbnounblockself": "Није вам дозвољено да деблокирате себе",
        "movenologintext": "Морате да будете регистровани и [[Special:UserLogin|пријављени]] да бисте премештали странице.",
        "movenotallowed": "Немате дозволу да премештате странице.",
        "movenotallowedfile": "Немате дозволу да премештате датотеке.",
-       "cant-move-user-page": "Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð·Ð° Ð¿Ñ\80емеÑ\88Ñ\82аÑ\9aе Ð¾Ñ\81новниÑ\85 ÐºÐ¾Ñ\80иÑ\81ниÑ\87киÑ\85 Ñ\81Ñ\82Ñ\80аниÑ\86а (осим подстраница).",
-       "cant-move-to-user-page": "Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð·Ð° Ð¿Ñ\80емеÑ\88Ñ\82аÑ\9aе Ñ\81Ñ\82Ñ\80аниÑ\86е Ð½Ð° Ð²Ð°Ñ\88Ñ\83 корисничку страницу (осим на корисничку подстраницу).",
+       "cant-move-user-page": "Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð´Ð° Ð¿Ñ\80емеÑ\88Ñ\82аÑ\82е ÐºÐ¾Ñ\80иÑ\81ниÑ\87ке Ñ\81Ñ\82Ñ\80аниÑ\86е (осим подстраница).",
+       "cant-move-to-user-page": "Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð´Ð° Ð¿Ñ\80емеÑ\81Ñ\82иÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ð½Ð° корисничку страницу (осим на корисничку подстраницу).",
        "cant-move-category-page": "Немате дозволу да премештате странице категорија.",
        "cant-move-to-category-page": "Немате дозволу да преместите страницу на страницу категорије.",
        "cant-move-subpages": "Немате дозволу да премештате подстранице.",
        "importlogpagetext": "Административни увози страница с историјама измена с других викија.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|измена увезена|измене увезене|измена увезено}}",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|измена увезена|измене увезене|измена увезено}} из $2",
-       "javascripttest": "Ð\88аваÑ\81кÑ\80ипÑ\82 Ñ\82еÑ\81Ñ\82",
+       "javascripttest": "ТеÑ\81Ñ\82иÑ\80аÑ\9aе Ñ\98аваÑ\81кÑ\82ипÑ\82а",
        "javascripttest-pagetext-unknownaction": "Непозната радња „$1“.",
        "javascripttest-qunit-intro": "Погледајте [$1 документацију за тестирање] на mediawiki.org.",
        "tooltip-pt-userpage": "{{GENDER:|Ваша}} корисничка страница",
-       "tooltip-pt-anonuserpage": "Корисничка страница за ИП адресу с које уређујете",
+       "tooltip-pt-anonuserpage": "Корисничка страница за IP адресу с које уређујете",
        "tooltip-pt-mytalk": "{{GENDER:|Ваша}} страница за разговор",
        "tooltip-pt-anontalk": "Разговор о изменама са ове IP адресе",
        "tooltip-pt-preferences": "{{GENDER:|Ваша}} подешавања",
        "spam_reverting": "Враћам на последњу измену која не садржи везе до $1",
        "spam_blanking": "Све измене садрже везе до $1. Чистим",
        "spam_deleting": "Све измене садрже везе до $1. Бришем",
-       "simpleantispam-label": "Ð\90нÑ\82и-Ñ\81пам Ð¿Ñ\80овеÑ\80а. \n<strong>Не</strong> попуњавајте ово!",
+       "simpleantispam-label": "Ð\9fÑ\80овеÑ\80а Ð¿Ñ\80оÑ\82ив Ð½ÐµÐ¶ÐµÑ\99еног Ñ\81адÑ\80жаÑ\98а. \n<strong>Не</strong> попуњавајте ово!",
        "pageinfo-title": "Информације за „$1“",
        "pageinfo-not-current": "Нажалост, немогуће је прибавити ове податке за старије измене.",
        "pageinfo-header-basic": "Основне информације",
        "monthsall": "све",
        "confirmemail": "Потврда имејл адресе",
        "confirmemail_noemail": "Нисте унели валидну имејл адресу у [[Special:Preferences|подешавањима]].",
-       "confirmemail_text": "{{SITENAME}} Ð·Ð°Ñ\85Ñ\82ева Ð´Ð° Ð¿Ð¾Ñ\82вÑ\80диÑ\82е Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð¿Ñ\80е Ð½ÐµÐ³Ð¾ Ñ\88Ñ\82о Ð¿Ð¾Ñ\87неÑ\82е Ð´Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ð¸Ð¼ÐµÑ\98ла.\nÐ\9aликниÑ\82е Ð½Ð° Ð´Ñ\83гме Ð¸Ñ\81под Ð·Ð° Ñ\81лаÑ\9aе Ð¿Ð¾Ñ\80Ñ\83ке Ð½Ð° Ð²Ð°Ñ\88Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83.\nУ Ð¿Ð¾Ñ\80Ñ\83Ñ\86и Ñ\9bе Ñ\81е Ð½Ð°Ð»Ð°Ð·Ð¸Ñ\82и Ð²ÐµÐ·Ð° Ñ\81 Ð¿Ð¾Ñ\82вÑ\80дним ÐºÐ¾Ð´Ð¾Ð¼;\nÑ\83неÑ\81иÑ\82е Ñ\98е Ñ\83 Ð¿Ñ\80егледаÑ\87 Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ð¿Ð¾Ñ\82вÑ\80дили Ð´Ð° Ñ\98е Ð²Ð°Ñ\88а Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81а Ð¸Ñ\81пÑ\80авна.",
+       "confirmemail_text": "{{SITENAME}} Ð·Ð°Ñ\85Ñ\82ева Ð´Ð° Ð¿Ð¾Ñ\82вÑ\80диÑ\82е Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð¿Ñ\80е Ð½ÐµÐ³Ð¾ Ñ\88Ñ\82о Ð¿Ð¾Ñ\87неÑ\82е Ð´Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ð¸Ð¼ÐµÑ\98ла.\nÐ\9aликниÑ\82е Ð½Ð° Ð´Ñ\83гме Ð¸Ñ\81под Ð·Ð° Ñ\81лаÑ\9aе Ð¿Ð¾Ñ\80Ñ\83ке Ð½Ð° Ð²Ð°Ñ\88Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83.\nУ Ð¿Ð¾Ñ\80Ñ\83Ñ\86и Ñ\9bе Ñ\81е Ð½Ð°Ð»Ð°Ð·Ð¸Ñ\82и Ð²ÐµÐ·Ð° Ñ\81 Ð¿Ð¾Ñ\82вÑ\80дним ÐºÐ¾Ð´Ð¾Ð¼;\nÑ\83неÑ\81иÑ\82е Ñ\98е Ñ\83 Ð¿Ñ\80егледаÑ\87 Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ð¿Ð¾Ñ\82вÑ\80дили Ð´Ð° Ñ\98е Ð²Ð°Ñ\88а Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81а Ð²Ð°Ð¶ÐµÑ\9bа.",
        "confirmemail_pending": "Потврдни код вам је већ послат. Ако сте управо отворили налог, онда вероватно треба да сачекате неколико минута да пристигне, пре него што поново затражите нови код.",
        "confirmemail_send": "Пошаљи потврдни код",
        "confirmemail_sent": "Потврдна порука је послата.",
        "confirmemail_success": "Ваша имејл адреса је потврђена.\nСада можете да се [[Special:UserLogin|пријавите]] и уживате у викију.",
        "confirmemail_loggedin": "Ваша имејл адреса је сада потврђена.",
        "confirmemail_subject": "{{SITENAME}} – потврда имејл адресе",
-       "confirmemail_body": "Ð\9dеко, Ð²ÐµÑ\80оваÑ\82но Ð²Ð¸, Ñ\81а Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81е $1,\nоÑ\82воÑ\80ио Ñ\98е Ð½Ð°Ð»Ð¾Ð³ â\80\9e$2â\80\9c Ñ\81а Ð¾Ð²Ð¾Ð¼ Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81ом Ð½Ð° Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83 {{SITENAME}}.\n\nÐ\94а Ð¿Ð¾Ñ\82вÑ\80диÑ\82е Ð´Ð° Ð¾Ð²Ð°Ñ\98 Ð½Ð°Ð»Ð¾Ð³ Ñ\81Ñ\82ваÑ\80но Ð¿Ñ\80ипада Ð²Ð°Ð¼Ð° Ð¸ Ð´Ð° Ð°ÐºÑ\82ивиÑ\80аÑ\82е\nмогÑ\83Ñ\9bноÑ\81Ñ\82и Ð¸Ð¼ÐµÑ\98ла Ð½Ð° Ð²Ð¸ÐºÐ¸Ñ\98у {{SITENAME}}, отворите ову везу у прегледачу:\n\n$3\n\nУколико налог *не* припада вама, пратите везу\nда откажете потврду имејл адресе:\n\n$5\n\nОвај потврдни код истиче у $4.",
-       "confirmemail_body_changed": "Ð\9dеко, Ð²ÐµÑ\80оваÑ\82но Ð²Ð¸, Ñ\81а Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81е $1,\nпÑ\80оменио Ñ\98е Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð½Ð°Ð»Ð¾Ð³Ð° â\80\9e$2â\80\9c Ñ\83 Ð¾Ð²Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð½Ð° Ð²Ð¸ÐºÐ¸Ñ\98у {{SITENAME}}.\n\nДа бисте потврдили да овај налог стварно припада вама и поново активирали могућности имејла, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај потврдни код истиче $6 у $7",
-       "confirmemail_body_set": "Ð\9dеко, Ð²ÐµÑ\80оваÑ\82но Ð²Ð¸, Ñ\81а Ð\98Ð\9f адресе $1,\nпроменио је имејл адресу налога „$2“ у ову адресу на {{SITENAME}}.\n\nДа бисмо потврдили да овај налог стварно припада вама и поново активирали\nмогућности имејла на {{SITENAME}}, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај потврдни код истиче $4.",
+       "confirmemail_body": "Ð\9dеко, Ð²ÐµÑ\80оваÑ\82но Ð\92и, Ñ\81 IP Ð°Ð´Ñ\80еÑ\81е $1,\nоÑ\82воÑ\80ио Ñ\98е Ð½Ð°Ð»Ð¾Ð³ â\80\9e$2â\80\9c Ñ\81 Ð¾Ð²Ð¾Ð¼ Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81ом Ð½Ð° Ð¿Ñ\80оÑ\98екÑ\82Ñ\83 {{SITENAME}}.\n\nÐ\94а Ð¿Ð¾Ñ\82вÑ\80диÑ\82е Ð´Ð° Ð¾Ð²Ð°Ñ\98 Ð½Ð°Ð»Ð¾Ð³ Ñ\81Ñ\82ваÑ\80но Ð¿Ñ\80ипада Ð²Ð°Ð¼Ð° Ð¸ Ð´Ð° Ð°ÐºÑ\82ивиÑ\80аÑ\82е\nмогÑ\83Ñ\9bноÑ\81Ñ\82и Ð¸Ð¼ÐµÑ\98ла Ð½Ð° Ð¿Ñ\80оÑ\98екÑ\82у {{SITENAME}}, отворите ову везу у прегледачу:\n\n$3\n\nУколико налог *не* припада вама, пратите везу\nда откажете потврду имејл адресе:\n\n$5\n\nОвај потврдни код истиче у $4.",
+       "confirmemail_body_changed": "Ð\9dеко, Ð²ÐµÑ\80оваÑ\82но Ð\92и, Ñ\81 IP Ð°Ð´Ñ\80еÑ\81е $1,\nпÑ\80оменио Ñ\98е Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð½Ð°Ð»Ð¾Ð³Ð° â\80\9e$2â\80\9c Ñ\83 Ð¾Ð²Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð½Ð° Ð¿Ñ\80оÑ\98екÑ\82у {{SITENAME}}.\n\nДа бисте потврдили да овај налог стварно припада вама и поново активирали могућности имејла, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај потврдни код истиче $6 у $7",
+       "confirmemail_body_set": "Ð\9dеко, Ð²ÐµÑ\80оваÑ\82но Ð\92и, Ñ\81 IP адресе $1,\nпроменио је имејл адресу налога „$2“ у ову адресу на {{SITENAME}}.\n\nДа бисмо потврдили да овај налог стварно припада вама и поново активирали\nмогућности имејла на {{SITENAME}}, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај потврдни код истиче $4.",
        "confirmemail_invalidated": "Потврда имејл адресе је отказана",
        "invalidateemail": "Отказивање потврде имејла",
        "notificationemail_body_changed": "Неко, вероватно Ви је променио имејл адресу налога из $2“ у „$3“ са IP адресе $1 на сајту {{SITENAME}}.\n\nАко ово нисте били Ви, одмах обавестите администраторе сајта.",
-       "notificationemail_body_removed": "Неко, вероватно Ви са ИП адресе $1 је уклонио имејл адресу за налог „$2“ на {{SITENAME}}.\n\n\nАко ово нисте били Ви, одмах обавестите администраторе сајта.",
+       "notificationemail_body_removed": "Неко, вероватно Ви, с IP адресе $1, \nуклонио је имејл адресу за налог „$2“ на {{SITENAME}}.\n\nАко ово нисте били Ви, контактирајте администраторе сајта одмах.",
        "scarytranscludedisabled": "[Међувики укључивање шаблона је онемогућено]",
        "scarytranscludefailed": "[Добављање шаблона за $1 није успело]",
        "scarytranscludefailed-httpstatus": "[Не могу да преузмем шаблон $1: HTTP $2]",
        "tags-deactivate-reason": "Разлог:",
        "tags-deactivate-not-allowed": "Није могуће деактивирати ознаку „$1“.",
        "tags-deactivate-submit": "Декативирај",
-       "tags-update-no-permission": "Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð·Ð° Ð´Ð¾Ð´Ð°Ð²Ð°Ñ\9aе Ð¸Ð»Ð¸ Ñ\83клаÑ\9aаÑ\9aе Ð¾Ð·Ð½Ð°ÐºÐµ Ð¸Ð·мена из појединачних измена или уноса у евиденцији.",
+       "tags-update-no-permission": "Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð´Ð° Ð´Ð¾Ð´Ð°Ñ\82е Ð¸Ð»Ð¸ Ñ\83клониÑ\82е Ð¾Ð·Ð½Ð°ÐºÐµ Ð¿Ñ\80омена из појединачних измена или уноса у евиденцији.",
        "tags-update-blocked": "Не можете додавати нити уклањати ознаке измена док {{GENDER:$1|сте}} блокирани.",
        "tags-update-add-not-allowed-one": "Није дозвољено да се ознака „$1” додаје ручно.",
        "tags-edit-title": "Уреди ознаке",
        "htmlform-date-placeholder": "ГГГГ-ММ-ДД",
        "htmlform-time-placeholder": "ЧЧ:ММ:СС",
        "htmlform-datetime-placeholder": "ГГГГ-ММ-ДД ЧЧ:ММ:СС",
+       "htmlform-date-invalid": "Вредност коју сте навели није препознати датум. Покушајте да користите формат ГГГГ-ММ-ДД.",
+       "htmlform-time-invalid": "Вредност коју сте навели није препознато време. Покушајте да користите формат ЧЧ:ММ:СС.",
+       "htmlform-datetime-invalid": "Вредност коју сте навели није препознати датум и време. Покушајте да користите формат ГГГГ-ММ-ДД ЧЧ:ММ:СС.",
+       "htmlform-date-toolow": "Вредност коју сте навели је пре најранијег дозвољеног датума – $1.",
+       "htmlform-date-toohigh": "Вредност коју сте навели је после крајњег дозвољеног датума – $1.",
+       "htmlform-time-toolow": "Вредност коју сте навели је пре најранијег дозвољеног времена – $1.",
        "htmlform-title-badnamespace": "[[:$1]] није у именском простору „{{ns:$2}}“.",
        "htmlform-title-not-creatable": "Страница „$1“ се не може направити",
        "htmlform-title-not-exists": "$1 не постоји.",
        "json-warn-trailing-comma": "$1 {{PLURAL:$1|пратећа тачка је уклоњена|пратеће тачке су уклоњене|пратећих тачки је уклоњено}} из JSON-a",
        "json-error-unknown": "Догодио се проблем с JSON-ом. Грешка: $1",
        "json-error-depth": "Прекорачена је највећа дубина",
-       "json-error-state-mismatch": "Ð\9dевалидан или покварени JSON",
+       "json-error-state-mismatch": "Ð\9dеважеÑ\9bи или покварени JSON",
        "json-error-ctrl-char": "Грешка контролног симбола, могуће је да је неисправно енкодиран",
        "json-error-syntax": "Грешка у синтакси",
        "json-error-utf8": "Малформирани UTF-8 знаци, могуће је да су неисправно енкодирани",
        "log-action-filter-suppress-reblock": "Скривање корисника поновним блокирањем",
        "log-action-filter-upload-upload": "ново отпремање",
        "log-action-filter-upload-overwrite": "промена постојећег",
-       "authmanager-authn-not-in-progress": "Ð\9fоÑ\82вÑ\80да Ð¸Ð´ÐµÐ½Ñ\82иÑ\82еÑ\82а није у току или је дошло до губитка података о сесији. Почните испочетка.",
+       "authmanager-authn-not-in-progress": "Ð\90Ñ\83Ñ\82енÑ\82иÑ\84икаÑ\86иÑ\98а није у току или је дошло до губитка података о сесији. Почните испочетка.",
        "authmanager-authn-no-primary": "Не могу да проверим пружене акредитиве.",
        "authmanager-authn-no-local-user": "Пружени акредитиви нису повезани ни са једним корисником на овом викију.",
-       "authmanager-authn-no-local-user-link": "Ð\9fÑ\80Ñ\83жени Ñ\81Ñ\83 Ð¸Ñ\81пÑ\80авни акредитиви, али нису повезани ни с једним корисником на овом викију. Пријавите се на неки други начин или направите нови кориснички налог, што ће Вам дати могућност да повежете претходне акредитиве на нови налог.",
+       "authmanager-authn-no-local-user-link": "Ð\9fÑ\80Ñ\83жени Ñ\81Ñ\83 Ð²Ð°Ð¶ÐµÑ\9bи акредитиви, али нису повезани ни с једним корисником на овом викију. Пријавите се на неки други начин или направите нови кориснички налог, што ће Вам дати могућност да повежете претходне акредитиве на нови налог.",
        "authmanager-authn-autocreate-failed": "Не могу да аутоматски направим локални налог: $1",
        "authmanager-change-not-supported": "Не могу да променим пружене акредитиве јер их ништа не би користило.",
        "authmanager-create-disabled": "Онемогућено прављење налога.",
        "authmanager-email-help": "Имејл адреса",
        "authmanager-realname-label": "Право име",
        "authmanager-realname-help": "Право име корисника",
-       "authmanager-provider-password": "Ð\9fоÑ\82вÑ\80да Ð¸Ð´ÐµÐ½Ñ\82иÑ\82еÑ\82а лозинком",
-       "authmanager-provider-password-domain": "Ð\9fоÑ\82вÑ\80да Ð¸Ð´ÐµÐ½Ñ\82иÑ\82еÑ\82а лозинком и доменом",
+       "authmanager-provider-password": "Ð\90Ñ\83Ñ\82енÑ\82иÑ\84икаÑ\86иÑ\98а лозинком",
+       "authmanager-provider-password-domain": "Ð\90Ñ\83Ñ\82енÑ\82иÑ\84икаÑ\86иÑ\98а лозинком и доменом",
        "authmanager-provider-temporarypassword": "Привремена лозинка",
        "authprovider-confirmlink-option": "$1 ($2)",
        "authprovider-confirmlink-request-label": "Рачуни који се требају повезати",
        "authprovider-confirmlink-success-line": "$1: Успешно повезано.",
        "authprovider-confirmlink-failed": "Не могу да повежем налог у потпуности: $1",
-       "authprovider-confirmlink-ok-help": "Наставите након приказивања порука за неуспешно повезивање.",
+       "authprovider-confirmlink-ok-help": "Наставите након приказивања порука за неуспело повезивање.",
        "authprovider-resetpass-skip-label": "Прескочи",
        "authprovider-resetpass-skip-help": "Прескочите ресетовање лозинке.",
-       "authform-nosession-login": "Ð\9fоÑ\82вÑ\80да Ð¸Ð´ÐµÐ½Ñ\82иÑ\82еÑ\82а је успела, али Ваш прегледач не може да „запамти” да сте пријављени.\n\n$1",
+       "authform-nosession-login": "Ð\90Ñ\83Ñ\82енÑ\82иÑ\84икаÑ\86иÑ\98а је успела, али Ваш прегледач не може да „запамти” да сте пријављени.\n\n$1",
        "authform-nosession-signup": "Налог је направљен, али Ваш прегледач не може да „запамти” да сте пријављени.\n\n$1",
        "authform-newtoken": "Недостаје жетон. $1",
        "authform-notoken": "Недостаје жетон",
        "unlinkaccounts-success": "Налог је обједињен.",
        "userjsispublic": "Напомена: JavaScript подстранице не би требале садржавати поверљиве информације будући да су видљиве другим корисницима.",
        "usercssispublic": "Напомена: CSS подстранице не би требале садржавати поверљиве информације будући да су видљиве другим корисницима.",
-       "restrictionsfield-badip": "Ð\9dеиÑ\81пÑ\80авна Ð\98Ð\9f адреса или опсег: $1",
-       "restrictionsfield-label": "Дозвољени ИП-опсези:",
+       "restrictionsfield-badip": "Ð\9dеважеÑ\9bа IP адреса или опсег: $1",
+       "restrictionsfield-label": "Дозвољени IP опсези:",
        "edit-error-short": "Грешка: $1",
        "edit-error-long": "Грешке:\n\n$1",
        "revid": "измена $1",
        "undelete-cantcreate": "Не можете повратити ову страницу јер нема постојеће странице са овим именом и немате дозволу да направите ову страницу.",
        "pagedata-title": "Подаци странице",
        "pagedata-not-acceptable": "Није пронађен одговарајући облик. Подржане MIME-врсте: $1",
-       "pagedata-bad-title": "Ð\9dевалидан наслов: $1.",
+       "pagedata-bad-title": "Ð\9dеважеÑ\9bи наслов: $1.",
        "passwordpolicies": "Правила за лозинке",
        "passwordpolicies-group": "Група",
        "passwordpolicies-policies": "Правила",
index 2fdfea5..fe18b66 100644 (file)
        "ns-specialprotected": "Specialsidor kan inte redigeras.",
        "titleprotected": "Denna sidtitel har skyddats från att skapas av [[User:$1|$1]].\nDen angivna anledningen är <em>$2</em>.",
        "filereadonlyerror": "Det går inte att ändra filen \"$1\", eftersom fildatabasen \"$2\" är i skrivskyddat läge.\n\nDen systemadministratör som låste den angav följande anledning: \"$3\".",
+       "invalidtitle": "Ogiltig titel",
        "invalidtitle-knownnamespace": "Ogiltig titel med namnrymden \"$2\" och texten \"$3\"",
        "invalidtitle-unknownnamespace": "Ogiltig titel med okänt namnrymdsnummer $1 och texten \"$2\"",
        "exception-nologin": "Inte inloggad",
index 3f4351b..23ad3fb 100644 (file)
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>అచేతనం</strong>)",
        "mediastatistics": "మాధ్యమ గణాంకాలు",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 బైటు|$1 బైట్లు}} ($2; $3%)",
+       "mediastatistics-bytespertype": "ఈ విభాగంలో మొత్తం దస్త్రాల పరిమాణం: {{PLURAL:$1|$1 బైటు|$1 బైట్లు}} ($2; $3%).",
+       "mediastatistics-allbytes": "మొత్తం దస్త్రాలన్నింటి మొత్తం పరిమాణం: {{PLURAL:$1|$1 బైటు|$1 బైట్లు}} ($2).",
        "mediastatistics-table-mimetype": "MIME రకం",
        "mediastatistics-table-extensions": "సంభావ్యత గల పొడిగింతలు",
        "mediastatistics-table-count": "దస్త్రాల సంఖ్య",
        "special-characters-group-thai": "థాయి",
        "special-characters-group-lao": "లావో",
        "special-characters-group-khmer": "ఖ్మెర్",
+       "special-characters-group-canadianaboriginal": "కెనడియన్ ఎబొరిజినల్",
        "special-characters-title-endash": "ఎన్ డాష్",
        "special-characters-title-emdash": "ఎమ్ డాష్",
        "special-characters-title-minus": "మైనస్ గుర్తు",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "కూకీ-ఆధారిత సెషన్లు",
        "log-action-filter-block": "నిరోధపు రకం:",
        "log-action-filter-delete": "తొలగింపు రకం:",
+       "log-action-filter-import": "Type of import:",
+       "log-action-filter-managetags": "Type of tag management action:",
        "log-action-filter-move": "తరలింపు రకం:",
+       "log-action-filter-newusers": "Type of account creation:",
        "log-action-filter-all": "అన్నీ",
        "log-action-filter-managetags-create": "ట్యాగు సృష్టి",
        "log-action-filter-managetags-delete": "ట్యాగు తొలగింపు",
index c89b466..381ab36 100644 (file)
        "uploadwarning": "Yükleme uyarısı",
        "uploadwarning-text": "Lütfen aşağıdaki dosya açıklamasını değiştirin ve tekrar deneyin.",
        "savefile": "Dosyayı kaydet",
-       "uploaddisabled": "Geçici olarak şu anda herhangi bir dosya yüklenmez. Biraz sonra bir daha deneyiniz.",
+       "uploaddisabled": "Geçici olarak şu anda bu wiki'ye herhangi bir dosya yüklenemez. Lütfen daha sonra bir daha deneyiniz.",
        "copyuploaddisabled": "URL ile yükleme devre dışı.",
        "uploaddisabledtext": "Dosya yüklemeleri devredışı bırakılmıştır.",
        "php-uploaddisabledtext": "PHP dosyası yüklemeleri devre dışıdır. Lütfen file_uploads ayarını kontrol edin.",
index ea93a9f..66cd2dc 100644 (file)
        "password-login-forbidden": "Бу кулланучы исемен һәм серсүзне куллану тыелган",
        "mailmypassword": "Серсүзне бетерү",
        "passwordremindertitle": "{{SITENAME}} кулланучысына вакытлы серсүз тапшыру",
-       "passwordremindertext": "Кемдер (бәлки, сездер, IP адресы: $1)  {{grammar:genitive|{{SITENAME}}}} ($4) өчен яңа серсүз соратты. $2 кулланучысы өчен яңа вакытлыча серсүз: $3. Әгәр бу сез булган булсагыз, системага керегез һәм яңа серсүз сайлагыз. Сезнең вакытлыча серсүз гамәлдә $5 {{PLURAL:$5|көн}} булачак.\n\nӘгәр сез серсүзне алмаштыруны сорамаган булсагыз яки, оныткан очракта, исегезгә төшергән булсагыз, бу хәбәргә игътибар бирмичә, иске серсүзегезне куллануны дәвам итегез.",
+       "passwordremindertext": "Кемдер ($1 IP адресылы)  {{grammar:genitive|{{SITENAME}}}} ($4) өчен яңа серсүз соратты. $2 кулланучысы өчен яңа вакытлыча серсүз: $3. Әгәр бу сез булган булсагыз, системага керегез һәм яңа серсүз сайлагыз. Сезнең вакытлыча серсүз гамәлдә $5 {{PLURAL:$5|көн}} булачак.\n\nӘгәр сез серсүзне алмаштыруны сорамаган булсагыз яки, оныткан очракта, исегезгә төшергән булсагыз, бу хәбәргә игътибар бирмичә, иске серсүзегезне куллануны дәвам итегез.",
        "noemail": "$1 исемле кулланучы өчен электрон почта адресы язылмаган.",
        "noemailcreate": "Сез дөрес e-mail адресы күрсәтергә тиеш",
        "passwordsent": "Яңа серсүз $1 исемле кулланучының электрон почта адресына җибәрелде.\n\nЗинһар, серсүзне алгач, системага яңадан керегез.",
        "subject-preview": "Башисемне алдан карау:",
        "blockedtitle": "Кулланучы тыелды",
        "blockedtext": "<strong>Сезнең хисап язмагыз яки IP адресыгыз тыелган.</strong>\n\nТыючы идарәче: $1.\nКүрсәтелгән сәбәп: <em>$2</em>.\n\n* Тыю башланган вакыт: $8\n* Тыю ахыры: $6\n* Тыелулар саны: $7\n\nСез $1 яки башка [[{{MediaWiki:Grouppage-sysop}}|идарәчегә]] тыю буенча сорауларыгызны җибәрә аласыз.\nИсегездә тотыгыз: әгәр сез теркәлмәгән һәм электрон почта адресыгызны [[Special:Preferences|көйләнмәләрдә]] дәлилләмәгән булсагыз, сез бирелгән «{{int:emailuser}}» мөмкинчелекне куллана алмаячаксыз. Шулай ук тыю вакытында сезнең хат җибәрү мөмкинлегегезне чикләгән булырга да мөмкиннәр.\nСезнең IP адресыгыз — $3, тыю таныклыгы — $5.\nЗинһар, хатларда бу мәгълүматны күрсәтергә онытмагыз.",
-       "autoblockedtext": "Сезнең IP адресыгыз, аның тыелган кулланучы тарафыннан кулланылуы сәбәпле, автомат рәвештә тыелды.\nУл кулланучыны тыючы идарәче: $1. Күрсәтелгән сәбәп:\n\n:''$2''\n\n* Тыю башланган вакыт: $8\n* Тыю ахыры: $6\n* Тыелулар саны: $7\n\nСез $1 яки башка [[{{MediaWiki:Grouppage-sysop}}|идарәчегә]] тыю буенча сорауларыгызны җибәрә аласыз.\nИсегездә тотыгыз: әгәр сез теркәлмәгән һәм электрон почта адресыгызны дәлилләмәгән булсагыз ([[Special:Preferences|дәлилләү өчен шәхси көйләүләр монда]]), идарәчегә хат җибәрә алмыйсыз. Шулай ук тыю вакытында сезнең хат җибәрү мөмкинлегегезне чикләгән булырга да мөмкиннәр.\nСезнең IP адресы — $3, тыю идентификаторы — #$5.\nХатларда бу мәгълүматны күрсәтергә онытмагыз.",
+       "autoblockedtext": "Сезнең IP адресыгыз, аның тыелган кулланучы тарафыннан кулланылуы сәбәпле, автомат рәвештә тыелды.\nУл кулланучыны тыючы идарәче: $1. Күрсәтелгән сәбәп:\n\n:<em>$2</em>\n\n* Тыю башланган вакыт: $8\n* Тыю ахыры: $6\n* Тыелулар саны: $7\n\nСез $1 яки башка [[{{MediaWiki:Grouppage-sysop}}|идарәчегә]] тыю буенча сорауларыгызны җибәрә аласыз.\n\nИсегездә тотыгыз: әгәр сез [[Special:Preferences|көйләнмәләрдә]] электрон почта адресыгызны  күрсәтмәгән яки дәлилләмәгән булсагыз, шулай ук  сез блокта булсагыз хат җибәреп булмаячак һәм  сез \"{{int:emailuser}}\" мөмкинлеген куллана алмаячаксыз.\n\nСезнең IP адрес — $3, тыю идентификаторы — #$5.\nХатларда бу мәгълүматны күрсәтергә онытмагыз.",
        "blockednoreason": "сәбәп күрсәтелмәгән",
        "whitelistedittext": "Сез битләрне үзгәртү өчен $1 тиеш.",
        "confirmedittext": "Битләрне үзгәртү алдыннан сез электрон почта адресыгызны дәлилләргә тиеш.\nСез моны [[Special:Preferences|көйләүләр битендә]] башкара аласыз.",
        "userjspreview": "'''Бу бары тик JavaScript файлын алдан карау гына, ул әле сакланмаган!'''",
        "sitecsspreview": "'''онытмагыз, бу бары тик CSS-файлны алдан карау гына.'''\n'''Ул әле сакланмаган!'''",
        "sitejspreview": "'''Бу бары тик JavaScript файлын алдан карау гына.'''\n'''Ул әле сакланмаган!'''",
-       "userinvalidconfigtitle": "'''Игътибар:''' \"$1\" бизәү темасы табылмады. Кулланучының .css һәм .js битләре исемнәре бары тик кечкенә (юл) хәрефләрдән генә торырга тиеш икәнен онытмагыз. Мисалга: {{ns:user}}:Foo/vector.css, ә {{ns:user}}:Foo/Vector.css түгел!",
+       "userinvalidconfigtitle": "<strong>Игътибар:</strong> \"$1\" бизәү темасы табылмады. Кулланучының .css, .json һәм .js битләре исемнәре бары тик кечкенә (юл) хәрефләрдән генә торырга тиеш икәнен онытмагыз. Мисалга: {{ns:user}}:Foo/vector.css, ә {{ns:user}}:Foo/Vector.css түгел!",
        "updated": "(Яңартылды)",
        "note": "'''Искәрмә:'''",
        "previewnote": "<strong>Исегездә тотыгыз, бу алдан карау гына.</strong>\nТәзәтмәләрегез әлегә сакланмаган!",
        "longpageerror": "<strong>ХАТА: сакланучы текст зурлыгы - $1 {{PLURAL:$1|килобайт}}, бу $2 {{PLURAL:$2|килобайт}} чигеннән күбрәк. Бит саклана алмый.</strong>",
        "readonlywarning": "<strong>Кисәтү: мәгълүматлар базасында техник эшләр башкарыла, сезнең үзгәртүләр хәзер үк саклана алмый.</strong>\nБез сезгә әлеге текстны, югалмас өчен, берәр файлга сакларга тәкъдим итәбез.\n\nМәгълүматлар базасын япкан идарәче күрсәткән сәбәп: $1",
        "protectedpagewarning": "'''Кисәтү: сез бу битне үзгәртә алмыйсыз, бу хокукка идарәчеләр гына ия.'''\nТүбәндә көндәлекнең  соңгы язуы бирелгән:",
-       "semiprotectedpagewarning": "'''Кисәтү:''' бу бит якланган. Аны теркәлгән кулланучылар гына үзгәртә ала.\nАста бу битне күзәтү көндәлеге бирелгән:",
+       "semiprotectedpagewarning": "<strong>Кисәтү:</strong> бу бит якланган. Аны авторасланган кулланучылар гына үзгәртә ала.\nАста бу битнең күзәтү көндәлегендә булган соңгы язмасы бирелгән:",
        "cascadeprotectedwarning": "<strong>Кисәтү:</strong> Бу битне идарәчеләр гына үзгәртә ала., чөнки бит {{PLURAL:$1|каскадлы яклау исемлегенә кертелгән}}:",
        "titleprotectedwarning": "'''Кисәтү: Мондый исемле бит якланган, аны үзгәртү өчен [[Special:ListGroupRights|тиешле хокукка]] ия булу зарур.'''\nАста күзәтү көндәлегендәге соңгы язма бирелгән:",
        "templatesused": "Бу биттә кулланылган {{PLURAL:$1|1=калып|калыплар}} :",
        "userrights-changeable-col": "Сезнең тарафтан үзгәртелми торган төркемнәр",
        "userrights-unchangeable-col": "Сезнең тарафтан үзгәртелми торган төркемнәр",
        "userrights-irreversible-marker": "$1*",
+       "userrights-expiry-current": "$1 тәмамлана",
+       "userrights-expiry-none": "Чикләүсез",
        "userrights-expiry": "Бетә:",
+       "userrights-expiry-existing": "Хәзерге тәмамлану вакыты: $2 $3",
        "userrights-expiry-othertime": "Башка вакыт:",
        "userrights-expiry-options": "1 көн:1 day,1 атна:1 week,1 ай:1 month,3 ай:3 months,6 ай:6 months,1 ел:1 year",
+       "userrights-invalid-expiry": "«$1» төркеме өчен тәмамлану вакыты дөрес күрсәтеләгән.",
        "userrights-conflict": "Кулланучы хокукларын үзгәртү конфликты! Төзәтмәләрегезне тикшерегез, аннары кабатлагыз.",
        "group": "Төркем:",
        "group-user": "Кулланучылар",
        "group-autoconfirmed-member": "{{GENDER:$1|авторасланган кулланучы}}",
        "group-bot-member": "{{GENDER:$1|бот}}",
        "group-sysop-member": "{{GENDER:$1|идарәче}}",
+       "group-interface-admin-member": "{{GENDER:$1|интерфейс идарәчесе}}",
        "group-bureaucrat-member": "{{GENDER:$1|бюрократ}}",
        "group-suppress-member": "{{GENDER:$1|назир}}",
        "grouppage-user": "{{ns:project}}:Кулланучылар",
        "grouppage-autoconfirmed": "{{ns:project}}:Авторасланган кулланучылар",
        "grouppage-bot": "{{ns:project}}:Ботлар",
        "grouppage-sysop": "{{ns:project}}:Идарәчеләр",
+       "grouppage-interface-admin": "{{ns:project}}:Интерфейс идарәчесе",
        "grouppage-bureaucrat": "{{ns:project}}:Бюрократлар",
        "grouppage-suppress": "{{ns:project}}:Назирләр",
        "right-read": "Битләрне карау",
        "right-browsearchive": "Бетерелгән битләрне эзләү",
        "right-undelete": "Битләрне торгызу",
        "right-suppressionlog": "Шәхси журналларны карау",
+       "right-unblockself": "Үзеңне блоктан алу",
        "right-editinterface": "Кулланучы интерфейсын үзгәртү",
        "grant-group-email": "Хатлар җибәрү",
        "grant-uploadfile": "Яңа файллар йөкләү",
        "recentchanges-submit": "Күрсәт",
        "rcfilters-legend-heading": "<strong>Кыскартулар тезмәсе:&nbsp;</strong>",
        "rcfilters-activefilters": "Актив фильтрлар",
+       "rcfilters-activefilters-hide": "Яшер",
+       "rcfilters-activefilters-show": "Күрсәт",
        "rcfilters-limit-title": "Күрсәтү өчен үзгәртүләр",
        "rcfilters-days-title": "Соңгы көннәр",
        "rcfilters-hours-title": "Соңгы сәгатьләр",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|сәгать}}",
        "rcfilters-quickfilters": "Сакланган фильтрлар",
        "rcfilters-quickfilters-placeholder-title": "Әлегә сакланылган фильтрлар юк",
+       "rcfilters-savedqueries-rename": "Исемен үзгәртергә",
        "rcfilters-savedqueries-remove": "Бетерү",
        "rcfilters-savedqueries-new-name-label": "Исем",
+       "rcfilters-savedqueries-apply-label": "Фильтр кую",
        "rcfilters-savedqueries-cancel-label": "Баш тарту",
        "rcfilters-savedqueries-add-new-title": "Хәзерге фильтр көйләнмәләрен саклау",
        "rcfilters-clear-all-filters": "Барлык филтерләрне чистарту",
        "rcfilters-search-placeholder": "Фильтрланы соңгы үзгәртү (карау яисә кертүне башлау)",
+       "rcfilters-invalid-filter": "Яраксыз фильтр",
+       "rcfilters-filterlist-title": "Фильтрлар",
        "rcfilters-filterlist-feedbacklink": "Әлеге фильтрлау кораллары турында турында фикер калдырыгыз",
        "rcfilters-filtergroup-authorship": "Үзгәртүләрнең авторлыгы",
        "rcfilters-filter-editsbyself-label": "Сезнең үзгәртүләр",
        "rcfilters-filter-humans-label": "Кеше (бот түгел)",
        "rcfilters-filter-humans-description": "Кешеләр ясаган үзгәртүләр.",
        "rcfilters-filtergroup-reviewstatus": "Тикшерү статусы",
+       "rcfilters-filter-reviewstatus-auto-label": "Автотикшеренүчеләр",
+       "rcfilters-filtergroup-significance": "Мәгънәсе",
        "rcfilters-filter-minor-label": "Кече үзгәртүләр",
        "rcfilters-filter-minor-description": "«Кече үзгәртү» дип тамгаланган үзгәртүләр",
        "rcfilters-filter-major-label": "Гади үзгәртүләр",
        "rcfilters-filter-major-description": "«Кече» дип тамгаланмаган үзгәртүләр",
        "rcfilters-filtergroup-watchlist": "Күзәтү исемлегегездәге битләр",
+       "rcfilters-filter-watchlist-watched-label": "Күзәтү исемлегендә",
        "rcfilters-filtergroup-changetype": "Үзгәртү төре",
        "rcfilters-filter-pageedits-label": "Бит үзгәртүләре",
        "rcfilters-filter-newpages-label": "Бит төзүләре",
        "filewasdeleted": "Мондый исемле файл бетерелгән булган инде. Зинһар,яңадан йөкләү алдыннан $1 карагыз",
        "filename-bad-prefix": "Файлның исеме '''«$1»''' дип башлана. Зинһар, файлны тасвирлаучы исем бирегез.",
        "filename-prefix-blacklist": " #<!-- ничек бар шулай калдырыгыз --> <pre>\n# Синтаксис төбәндәгечә:\n#   *  «#» дип башланган барлык нәрсә дә комментарий дип аталачак\n#   * Һәрбер буш рәт — файлның исеменең префиксы, цифрлы камера бирүче исем\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # кайсыбер кәрәзле телефоннар\nIMG # барлык\nJD # Jenoptik\nMGP # Pentax\nPICT # төрле\n #</pre> <!-- ничек бар шулай калдырыгыз -->",
+       "upload-proto-error": "Протокол дөрес түгел",
+       "upload-file-error": "Эчке хата",
+       "upload-misc-error": "Билгесез йөкләү хатасы",
        "upload-dialog-title": "Файл йөкләү",
        "upload-dialog-button-cancel": "Баш тарту",
        "upload-dialog-button-back": "Артка",
index d75c43c..a5f7cd4 100644 (file)
        "expiringblock": "закінчиться $1 $2",
        "anononlyblock": "тільки анонімів",
        "noautoblockblock": "автоблокування вимкнене",
-       "createaccountblock": "Створення облікових записів заблоковане",
+       "createaccountblock": "створення облікових записів заблоковане",
        "emailblock": "листи заборонені",
        "blocklist-nousertalk": "не може редагувати свою сторінку обговорення",
        "ipblocklist-empty": "Список блокувань порожній.",
index 61a7c9f..b89a1f2 100644 (file)
        "ns-specialprotected": "特殊页面不可编辑。",
        "titleprotected": "此标题已被[[User:$1|$1]]保护以防止创建。理由是<em>$2</em>。",
        "filereadonlyerror": "因为媒体库“$2”处于只读模式而无法修改文件“$1”。\n\n锁定数据库的系统管理员做出如下解释:“$3”。",
+       "invalidtitle": "无效标题",
        "invalidtitle-knownnamespace": "使用名字空间“$2”和文本“$3”的无效标题",
        "invalidtitle-unknownnamespace": "使用未知名字空间编号$1和文本“$2”的无效标题",
        "exception-nologin": "未登录",
index f05b107..3d4a69c 100644 (file)
        "ns-specialprotected": "特殊頁面無法編輯。",
        "titleprotected": "此標題已經被 [[User:$1|$1]] 保護以防止建立,原因是 <em>$2</em>。",
        "filereadonlyerror": "無法修改檔案 \"$1\" 因為檔案庫 \"$2\" 目前處於唯讀模式。\n\n鎖定的系統管理員說明:\"$3\"。",
+       "invalidtitle": "無效標題",
        "invalidtitle-knownnamespace": "命名空間 \"$2\" 與名稱 \"$3\" 是無效的標題",
        "invalidtitle-unknownnamespace": "不明的命名空間編號 $1 與名稱 \"$2\" 是無效的標題",
        "exception-nologin": "未登入",
        "upload-form-label-infoform-categories": "分類",
        "upload-form-label-infoform-date": "日期",
        "upload-form-label-own-work-message-generic-local": "我確定我上傳的檔案已遵守下列 {{SITENAME}} 的服務條款與授權條款。",
-       "upload-form-label-not-own-work-message-generic-local": "若您無法同意遵守 {{SITENAME}} 的政策上傳檔案,請關閉此對話框並嘗試其他方法。",
+       "upload-form-label-not-own-work-message-generic-local": "若您無法同意遵守{{SITENAME}}的政策上傳檔案,請關閉此對話框並嘗試其他方法。",
        "upload-form-label-not-own-work-local-generic-local": "您也可嘗試[[Special:Upload|預設的上傳頁面]]。",
        "upload-form-label-own-work-message-generic-foreign": "我明白我將上傳此檔案到一個共享的儲存庫,我確認已遵守本站的服務條款與授權政策。",
        "upload-form-label-not-own-work-message-generic-foreign": "若您無法同意遵守共享儲存庫的政策上傳檔案,請關閉此對話框並嘗試其他方法。",
        "blocklog-showsuppresslog": "此使用者先前被封鎖並且隱藏過。\n以下為禁止顯示紀錄以供參考:",
        "blocklogentry": "已封鎖 [[$1]] 的期限至 $2 $3",
        "reblock-logentry": "變更 [[$1]] 的封鎖設定,到期時間為 $2 $3",
-       "blocklogtext": "此為使用者的封鎖及取消封鎖動作的記錄。\n未列出自動封鎖的 IP 位址。\n請參考 [[Special:BlockList|封鎖清單]] 中的目前正在作業的阻止與封鎖。",
+       "blocklogtext": "此為使用者的封鎖及取消封鎖動作的記錄。未列出自動封鎖的IP位址。請參考[[Special:BlockList|封鎖清單]]中的目前正在作業的阻止與封鎖。",
        "unblocklogentry": "已解除封鎖 $1",
        "block-log-flags-anononly": "僅限匿名使用者",
        "block-log-flags-nocreate": "停用帳號建立",
index 5db2062..759faf4 100644 (file)
@@ -77,6 +77,7 @@ $specialPageAliases = [
        'AllMyUploads'              => [ '모든내올린파일', '모든내파일' ],
        'Allpages'                  => [ '모든문서' ],
        'ApiHelp'                   => [ 'Api도움말' ],
+       'ApiSandbox'                => [ 'Api연습장' ],
        'Ancientpages'              => [ '오래된문서' ],
        'AutoblockList'             => [ '자동차단목록' ],
        'Badtitle'                  => [ '잘못된제목', '인식불가제목', '잘못된이름', '인식불가이름' ],
@@ -159,6 +160,7 @@ $specialPageAliases = [
        'Recentchanges'             => [ '최근바뀜' ],
        'Recentchangeslinked'       => [ '링크최근바뀜' ],
        'Redirect'                  => [ '넘겨주기' ],
+       'RemoveCredentials'         => [ '자격증명삭제', '자격증명제거' ],
        'ResetTokens'               => [ '토큰재설정' ],
        'Revisiondelete'            => [ '특정판삭제' ],
        'RunJobs'                   => [ '작업실행' ],
@@ -174,6 +176,7 @@ $specialPageAliases = [
        'Uncategorizedpages'        => [ '분류안된문서' ],
        'Uncategorizedtemplates'    => [ '분류안된틀' ],
        'Undelete'                  => [ '삭제취소', '삭제된문서' ],
+       'UnlinkAccounts'            => [ '계정연결해제' ],
        'Unlockdb'                  => [ 'DB잠금해제', 'DB잠금취소' ],
        'Unusedcategories'          => [ '안쓰는분류', '쓰이지않는분류' ],
        'Unusedimages'              => [ '안쓰는파일', '안쓰는그림', '쓰이지않는파일', '쓰이지않는그림' ],
diff --git a/languages/messages/MessagesMnw.php b/languages/messages/MessagesMnw.php
new file mode 100644 (file)
index 0000000..eea4896
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+/** Mon (ဘာသာ မန်)
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'my';
index f2939b3..5a432fb 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 require __DIR__ . '/../Maintenance.php';
 
 class BenchmarkTidy extends Maintenance {
@@ -35,8 +37,7 @@ class BenchmarkTidy extends Maintenance {
        }
 
        private function benchmark( $driver, $html ) {
-               global $wgContLang;
-
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                $times = [];
                $innerCount = 10;
                $outerCount = 10;
@@ -44,7 +45,7 @@ class BenchmarkTidy extends Maintenance {
                        $t = microtime( true );
                        for ( $i = 0; $i < $innerCount; $i++ ) {
                                $driver->tidy( $html );
-                               print $wgContLang->formatSize( memory_get_usage( true ) ) . "\n";
+                               print $contLang->formatSize( memory_get_usage( true ) ) . "\n";
                        }
                        $t = ( ( microtime( true ) - $t ) / $innerCount ) * 1000;
                        $times[] = $t;
@@ -67,10 +68,9 @@ class BenchmarkTidy extends Maintenance {
                print "Median: $median ms\n";
                print "Mean: $mean ms\n";
                print "Maximum: $max ms\n";
-               print "Memory usage: " .
-                       $wgContLang->formatSize( memory_get_usage( true ) ) . "\n";
+               print "Memory usage: " .  $contLang->formatSize( memory_get_usage( true ) ) . "\n";
                print "Peak memory usage: " .
-                       $wgContLang->formatSize( memory_get_peak_usage( true ) ) . "\n";
+                       $contLang->formatSize( memory_get_peak_usage( true ) ) . "\n";
        }
 }
 
index 2b47056..1b49f0e 100644 (file)
@@ -29,6 +29,8 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\MediaWikiServices;
+
 require_once __DIR__ . '/cleanupTable.inc';
 
 /**
@@ -71,12 +73,10 @@ class CleanupCaps extends TableCleanup {
        }
 
        protected function processRowToUppercase( $row ) {
-               global $wgContLang;
-
                $current = Title::makeTitle( $row->page_namespace, $row->page_title );
                $display = $current->getPrefixedText();
                $lower = $row->page_title;
-               $upper = $wgContLang->ucfirst( $row->page_title );
+               $upper = MediaWikiServices::getInstance()->getContentLanguage()->ucfirst( $row->page_title );
                if ( $upper == $lower ) {
                        $this->output( "\"$display\" already uppercase.\n" );
 
@@ -109,12 +109,10 @@ class CleanupCaps extends TableCleanup {
        }
 
        protected function processRowToLowercase( $row ) {
-               global $wgContLang;
-
                $current = Title::makeTitle( $row->page_namespace, $row->page_title );
                $display = $current->getPrefixedText();
                $upper = $row->page_title;
-               $lower = $wgContLang->lcfirst( $row->page_title );
+               $lower = MediaWikiServices::getInstance()->getContentLanguage()->lcfirst( $row->page_title );
                if ( $upper == $lower ) {
                        $this->output( "\"$display\" already lowercase.\n" );
 
index 90364e2..305a41d 100644 (file)
@@ -25,6 +25,8 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\MediaWikiServices;
+
 require_once __DIR__ . '/cleanupTable.inc';
 
 /**
@@ -46,8 +48,6 @@ class CleanupImages extends TableCleanup {
        }
 
        protected function processRow( $row ) {
-               global $wgContLang;
-
                $source = $row->img_name;
                if ( $source == '' ) {
                        // Ye olde empty rows. Just kill them.
@@ -64,11 +64,13 @@ class CleanupImages extends TableCleanup {
                // We also have some HTML entities there
                $cleaned = Sanitizer::decodeCharReferences( $cleaned );
 
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+
                // Some are old latin-1
-               $cleaned = $wgContLang->checkTitleEncoding( $cleaned );
+               $cleaned = $contLang->checkTitleEncoding( $cleaned );
 
                // Many of remainder look like non-normalized unicode
-               $cleaned = $wgContLang->normalize( $cleaned );
+               $cleaned = $contLang->normalize( $cleaned );
 
                $title = Title::makeTitleSafe( NS_FILE, $cleaned );
 
index 234e1b1..7f0e340 100644 (file)
@@ -45,9 +45,8 @@ class TitleCleanup extends TableCleanup {
         * @param object $row
         */
        protected function processRow( $row ) {
-               global $wgContLang;
                $display = Title::makeName( $row->page_namespace, $row->page_title );
-               $verified = $wgContLang->normalize( $display );
+               $verified = MediaWikiServices::getInstance()->getContentLanguage()->normalize( $display );
                $title = Title::newFromText( $verified );
 
                if ( !is_null( $title )
index 5e3aee7..8e4a353 100644 (file)
@@ -29,6 +29,8 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\MediaWikiServices;
+
 require_once __DIR__ . '/cleanupTable.inc';
 
 /**
@@ -58,10 +60,9 @@ class CleanupWatchlist extends TableCleanup {
        }
 
        protected function processRow( $row ) {
-               global $wgContLang;
                $current = Title::makeTitle( $row->wl_namespace, $row->wl_title );
                $display = $current->getPrefixedText();
-               $verified = $wgContLang->normalize( $display );
+               $verified = MediaWikiServices::getInstance()->getContentLanguage()->normalize( $display );
                $title = Title::newFromText( $verified );
 
                if ( $row->wl_user == 0 || is_null( $title ) || !$title->equals( $current ) ) {
index 8cd0297..af60eaa 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\MediaWikiServices;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -75,8 +77,6 @@ class ConvertLinks extends Maintenance {
                        return;
                }
 
-               global $wgContLang;
-
                # counters etc
                $numBadLinks = $curRowsRead = 0;
 
@@ -153,7 +153,8 @@ class ConvertLinks extends Maintenance {
                        foreach ( $res as $row ) {
                                $title = $row->cur_title;
                                if ( $row->cur_namespace ) {
-                                       $title = $wgContLang->getNsText( $row->cur_namespace ) . ":$title";
+                                       $title = MediaWikiServices::getInstance()->getContentLanguage()->
+                                               getNsText( $row->cur_namespace ) . ":$title";
                                }
                                $ids[$title] = $row->cur_id;
                                $curRowsRead++;
index cd9ef11..89885d2 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\MediaWikiServices;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -44,15 +46,14 @@ class DeleteEqualMessages extends Maintenance {
         * @param array &$messageInfo
         */
        protected function fetchMessageInfo( $langCode, array &$messageInfo ) {
-               global $wgContLang;
-
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                if ( $langCode ) {
                        $this->output( "\n... fetching message info for language: $langCode" );
-                       $nonContLang = true;
+                       $nonContentLanguage = true;
                } else {
                        $this->output( "\n... fetching message info for content language" );
-                       $langCode = $wgContLang->getCode();
-                       $nonContLang = false;
+                       $langCode = $contLang->getCode();
+                       $nonContentLanguage = false;
                }
 
                /* Based on SpecialAllmessages::reallyDoQuery #filter=modified */
@@ -60,12 +61,12 @@ class DeleteEqualMessages extends Maintenance {
                $l10nCache = Language::getLocalisationCache();
                $messageNames = $l10nCache->getSubitemList( 'en', 'messages' );
                // Normalise message names for NS_MEDIAWIKI page_title
-               $messageNames = array_map( [ $wgContLang, 'ucfirst' ], $messageNames );
+               $messageNames = array_map( [ $contLang, 'ucfirst' ], $messageNames );
 
                $statuses = AllMessagesTablePager::getCustomisedStatuses(
-                       $messageNames, $langCode, $nonContLang );
+                       $messageNames, $langCode, $nonContentLanguage );
                // getCustomisedStatuses is stripping the sub page from the page titles, add it back
-               $titleSuffix = $nonContLang ? "/$langCode" : '';
+               $titleSuffix = $nonContentLanguage ? "/$langCode" : '';
 
                foreach ( $messageNames as $key ) {
                        $customised = isset( $statuses['pages'][$key] );
index 95dd4da..e1df1f1 100644 (file)
@@ -705,7 +705,6 @@ TEXT
         * @throws MWException
         */
        private function getTextDb( $id ) {
-               global $wgContLang;
                if ( !isset( $this->db ) ) {
                        throw new MWException( __METHOD__ . "No database available" );
                }
@@ -718,7 +717,8 @@ TEXT
                        return false;
                }
                $stripped = str_replace( "\r", "", $text );
-               $normalized = $wgContLang->normalize( $stripped );
+               $normalized = MediaWikiServices::getInstance()->getContentLanguage()->
+                       normalize( $stripped );
 
                return $normalized;
        }
@@ -797,8 +797,6 @@ TEXT
        }
 
        private function getTextSpawnedOnce( $id ) {
-               global $wgContLang;
-
                $ok = fwrite( $this->spawnWrite, "$id\n" );
                // $this->progress( ">> $id" );
                if ( !$ok ) {
@@ -853,7 +851,8 @@ TEXT
 
                // Do normalization in the dump thread...
                $stripped = str_replace( "\r", "", $text );
-               $normalized = $wgContLang->normalize( $stripped );
+               $normalized = MediaWikiServices::getInstance()->getContentLanguage()->
+                       normalize( $stripped );
 
                return $normalized;
        }
index ff3e2fc..70fdebf 100644 (file)
@@ -26,6 +26,8 @@
  * @see http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd
  */
 
+use MediaWiki\MediaWikiServices;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -316,7 +318,7 @@ class GenerateSitemap extends Maintenance {
         * Main loop
         */
        public function main() {
-               global $wgContLang;
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
 
                fwrite( $this->findex, $this->openIndex() );
 
@@ -327,7 +329,7 @@ class GenerateSitemap extends Maintenance {
                        $length = $this->limit[0];
                        $i = $smcount = 0;
 
-                       $fns = $wgContLang->getFormattedNsText( $namespace );
+                       $fns = $contLang->getFormattedNsText( $namespace );
                        $this->output( "$namespace ($fns)\n" );
                        $skippedRedirects = 0; // Number of redirects skipped for that namespace
                        foreach ( $res as $row ) {
@@ -358,10 +360,10 @@ class GenerateSitemap extends Maintenance {
                                $length += strlen( $entry );
                                $this->write( $this->file, $entry );
                                // generate pages for language variants
-                               if ( $wgContLang->hasVariants() ) {
-                                       $variants = $wgContLang->getVariants();
+                               if ( $contLang->hasVariants() ) {
+                                       $variants = $contLang->getVariants();
                                        foreach ( $variants as $vCode ) {
-                                               if ( $vCode == $wgContLang->getCode() ) {
+                                               if ( $vCode == $contLang->getCode() ) {
                                                        continue; // we don't want default variant
                                                }
                                                $entry = $this->fileEntry(
index 965906f..9834473 100644 (file)
@@ -24,6 +24,8 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\MediaWikiServices;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -131,13 +133,13 @@ TEXT
        }
 
        private function getNsIndex( $namespace ) {
-               global $wgContLang;
-               $result = $wgContLang->getNsIndex( $namespace );
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+               $result = $contLang->getNsIndex( $namespace );
                if ( $result !== false ) {
                        return $result;
                }
                $ns = intval( $namespace );
-               if ( strval( $ns ) === $namespace && $wgContLang->getNsText( $ns ) !== false ) {
+               if ( strval( $ns ) === $namespace && $contLang->getNsText( $ns ) !== false ) {
                        return $ns;
                }
                $this->fatalError( "Unknown namespace text / index specified: $namespace" );
index 543ee06..949ce48 100644 (file)
@@ -20,7 +20,7 @@
  *
  * @file
  * @ingroup MaintenanceLanguage
- * @todo Make this more useful, right now just dumps $wgContLang
+ * @todo Make this more useful, right now just dumps content language
  */
 
 require_once __DIR__ . '/../Maintenance.php';
index 71241e7..075d6f2 100644 (file)
@@ -104,14 +104,15 @@ class NamespaceDupes extends Maintenance {
         * @return bool
         */
        private function checkAll( $options ) {
-               global $wgContLang, $wgNamespaceAliases, $wgCapitalLinks;
+               global $wgNamespaceAliases, $wgCapitalLinks;
 
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                $spaces = [];
 
                // List interwikis first, so they'll be overridden
                // by any conflicting local namespaces.
                foreach ( $this->getInterwikiList() as $prefix ) {
-                       $name = $wgContLang->ucfirst( $prefix );
+                       $name = $contLang->ucfirst( $prefix );
                        $spaces[$name] = 0;
                }
 
@@ -122,7 +123,7 @@ class NamespaceDupes extends Maintenance {
                                $spaces[$name] = $ns;
                        }
                }
-               foreach ( $wgContLang->getNamespaces() as $ns => $name ) {
+               foreach ( $contLang->getNamespaces() as $ns => $name ) {
                        if ( $name !== '' ) {
                                $spaces[$name] = $ns;
                        }
@@ -130,7 +131,7 @@ class NamespaceDupes extends Maintenance {
                foreach ( $wgNamespaceAliases as $name => $ns ) {
                        $spaces[$name] = $ns;
                }
-               foreach ( $wgContLang->getNamespaceAliases() as $name => $ns ) {
+               foreach ( $contLang->getNamespaceAliases() as $name => $ns ) {
                        $spaces[$name] = $ns;
                }
 
@@ -138,17 +139,17 @@ class NamespaceDupes extends Maintenance {
                // since we're doing case-sensitive searches in the db.
                foreach ( $spaces as $name => $ns ) {
                        $moreNames = [];
-                       $moreNames[] = $wgContLang->uc( $name );
-                       $moreNames[] = $wgContLang->ucfirst( $wgContLang->lc( $name ) );
-                       $moreNames[] = $wgContLang->ucwords( $name );
-                       $moreNames[] = $wgContLang->ucwords( $wgContLang->lc( $name ) );
-                       $moreNames[] = $wgContLang->ucwordbreaks( $name );
-                       $moreNames[] = $wgContLang->ucwordbreaks( $wgContLang->lc( $name ) );
+                       $moreNames[] = $contLang->uc( $name );
+                       $moreNames[] = $contLang->ucfirst( $contLang->lc( $name ) );
+                       $moreNames[] = $contLang->ucwords( $name );
+                       $moreNames[] = $contLang->ucwords( $contLang->lc( $name ) );
+                       $moreNames[] = $contLang->ucwordbreaks( $name );
+                       $moreNames[] = $contLang->ucwordbreaks( $contLang->lc( $name ) );
                        if ( !$wgCapitalLinks ) {
                                foreach ( $moreNames as $altName ) {
-                                       $moreNames[] = $wgContLang->lcfirst( $altName );
+                                       $moreNames[] = $contLang->lcfirst( $altName );
                                }
-                               $moreNames[] = $wgContLang->lcfirst( $name );
+                               $moreNames[] = $contLang->lcfirst( $name );
                        }
                        foreach ( array_unique( $moreNames ) as $altName ) {
                                if ( $altName !== $name ) {
index d7decc1..fad4e7d 100644 (file)
@@ -30,6 +30,7 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IMaintainableDatabase;
 
 /**
@@ -97,8 +98,6 @@ class Orphans extends Maintenance {
                );
                $orphans = $result->numRows();
                if ( $orphans > 0 ) {
-                       global $wgContLang;
-
                        $this->output( "$orphans orphan revisions...\n" );
                        $this->output( sprintf(
                                "%10s %10s %14s %20s %s\n",
@@ -107,10 +106,11 @@ class Orphans extends Maintenance {
 
                        foreach ( $result as $row ) {
                                $comment = $commentStore->getComment( 'rev_comment', $row )->text;
+                               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                                if ( $comment !== '' ) {
-                                       $comment = '(' . $wgContLang->truncateForVisual( $comment, 40 ) . ')';
+                                       $comment = '(' . $contLang->truncateForVisual( $comment, 40 ) . ')';
                                }
-                               $rev_user_text = $wgContLang->truncateForVisual( $row->rev_user_text, 20 );
+                               $rev_user_text = $contLang->truncateForVisual( $row->rev_user_text, 20 );
                                # pad $rev_user_text to 20 characters.  Note that this may
                                # yield poor results if $rev_user_text contains combining
                                # or half-width characters.  Alas.
index cf2fe54..d9a247c 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use MediaWiki\MediaWikiServices;
+
 /**
  * Parse some wikitext.
  *
@@ -103,9 +106,7 @@ class CLIParser extends Maintenance {
        }
 
        protected function initParser() {
-               global $wgParserConf;
-               $parserClass = $wgParserConf['class'];
-               $this->parser = new $parserClass();
+               $this->parser = MediaWikiServices::getInstance()->getParserFactory()->create();
        }
 
        /**
index 2503ed2..d5d27ad 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\MediaWikiServices;
+
 $optionsWithoutArgs = [ 'verbose' ];
 require_once __DIR__ . '/commandLine.inc';
 
@@ -123,8 +125,7 @@ class PPFuzzTester {
                // This resolves a few differences between the old preprocessor and the
                // XML-based one, which doesn't like illegals and converts line endings.
                // It's done by the MW UI, so it's a reasonably legitimate thing to do.
-               global $wgContLang;
-               $s = $wgContLang->normalize( $s );
+               $s = MediaWikiServices::getInstance()->getContentLanguage()->normalize( $s );
 
                return $s;
        }
index 713492a..c0de334 100644 (file)
@@ -32,6 +32,7 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IMaintainableDatabase;
 
 /**
@@ -193,11 +194,10 @@ class ImageBuilder extends Maintenance {
        }
 
        function addMissingImage( $filename, $fullpath ) {
-               global $wgContLang;
-
                $timestamp = $this->dbw->timestamp( $this->getRepo()->getFileTimestamp( $fullpath ) );
 
-               $altname = $wgContLang->checkTitleEncoding( $filename );
+               $altname = MediaWikiServices::getInstance()->getContentLanguage()->
+                       checkTitleEncoding( $filename );
                if ( $altname != $filename ) {
                        if ( $this->dryrun ) {
                                $filename = $altname;
index 64d394c..59620bd 100644 (file)
 
                                // Get the CSS class names, could be done elsewhere
                                sortCSS = [ config.cssAsc, config.cssDesc ];
-                               // Messages tell the the user what the *next* state will be
+                               // Messages tell the user what the *next* state will be
                                // so are in reverse order to the CSS classes.
                                sortMsg = [ mw.msg( 'sort-descending' ), mw.msg( 'sort-ascending' ) ];
 
index f19c3c2..2281136 100644 (file)
@@ -30,7 +30,7 @@
        ul.mw-collapsible:before,
        .mw-collapsible-toggle-li {
                /*
-               Rather than inherit any margins from the the general li selector - make sure this is explicit
+               Rather than inherit any margins from the general li selector - make sure this is explicit
                to avoid reflows
                */
                display: list-item;
index 8ec2735..7265399 100644 (file)
 
        /* tablet and up */
 
-       @media only screen and ( min-width: @deviceWidthTablet ) {
+       @media only screen and ( min-width: @width-breakpoint-tablet ) {
 
                #mw-interwiki-results {
                        width: 30%;
index a2ba85f..63d23d8 100644 (file)
 
                                // Tracks down dependencies
                                deps = registry[ module ].dependencies;
+                               unresolved.add( module );
                                for ( i = 0; i < deps.length; i++ ) {
                                        if ( resolved.indexOf( deps[ i ] ) === -1 ) {
                                                if ( unresolved.has( deps[ i ] ) ) {
                                                        );
                                                }
 
-                                               unresolved.add( module );
                                                sortDependencies( deps[ i ], resolved, unresolved );
                                        }
                                }
index fd308b2..4b0edb1 100644 (file)
@@ -1,16 +1,19 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Base class that store and restore the Language objects
  */
 abstract class MediaWikiLangTestCase extends MediaWikiTestCase {
        protected function setUp() {
-               global $wgLanguageCode, $wgContLang;
+               global $wgLanguageCode;
 
-               if ( $wgLanguageCode != $wgContLang->getCode() ) {
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+               if ( $wgLanguageCode != $contLang->getCode() ) {
                        throw new MWException( "Error in MediaWikiLangTestCase::setUp(): " .
-                               "\$wgLanguageCode ('$wgLanguageCode') is different from " .
-                               "\$wgContLang->getCode() (" . $wgContLang->getCode() . ")" );
+                               "\$wgLanguageCode ('$wgLanguageCode') is different from content language code (" .
+                               $contLang->getCode() . ")" );
                }
 
                parent::setUp();
diff --git a/tests/phpunit/data/media/comma_separated_viewbox.svg b/tests/phpunit/data/media/comma_separated_viewbox.svg
new file mode 100644 (file)
index 0000000..9e7329d
--- /dev/null
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="100%" width="100%" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox=" 0, 0 ,349.46883 , 405.12272 ">
+</svg>
index c41361c..f9b592e 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
 use Wikimedia\TestingAccessWrapper;
 
@@ -23,8 +24,7 @@ class CommentStoreTest extends MediaWikiLangTestCase {
         * @return CommentStore
         */
        protected function makeStore( $stage ) {
-               global $wgContLang;
-               $store = new CommentStore( $wgContLang, $stage );
+               $store = new CommentStore( MediaWikiServices::getInstance()->getContentLanguage(), $stage );
                return $store;
        }
 
index 216d92c..587f2c4 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group Editing
  *
@@ -14,6 +16,9 @@ class EditPageTest extends MediaWikiLangTestCase {
        protected function setUp() {
                parent::setUp();
 
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+               $this->setContentLang( $contLang );
+
                $this->setMwGlobals( [
                        'wgExtraNamespaces' => [
                                12312 => 'Dummy',
index a5d3570..af10b9c 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Test class for Export methods.
  *
@@ -20,7 +22,6 @@ class ExportTest extends MediaWikiLangTestCase {
         * @covers WikiExporter::pageByTitle
         */
        public function testPageByTitle() {
-               global $wgContLang;
                $pageTitle = 'UTPage';
 
                $exporter = new WikiExporter(
@@ -51,7 +52,8 @@ class ExportTest extends MediaWikiLangTestCase {
                        }
                }
 
-               $actualNamespaces = (array)$wgContLang->getNamespaces();
+               $actualNamespaces = (array)MediaWikiServices::getInstance()->getContentLanguage()->
+                       getNamespaces();
                $actualNamespaces = array_values( $actualNamespaces );
                $this->assertEquals( $actualNamespaces, $xmlNamespaces );
 
index 413c1a2..c838fc3 100644 (file)
@@ -1,23 +1,9 @@
 <?php
 
-use Mediawiki\Http\HttpRequestFactory;
-use MediaWiki\Interwiki\InterwikiLookup;
-use MediaWiki\Linker\LinkRenderer;
-use MediaWiki\Linker\LinkRendererFactory;
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Preferences\PreferencesFactory;
 use MediaWiki\Services\DestructibleService;
 use MediaWiki\Services\SalvageableService;
 use MediaWiki\Services\ServiceDisabledException;
-use MediaWiki\Shell\CommandFactory;
-use MediaWiki\Storage\BlobStore;
-use MediaWiki\Storage\BlobStoreFactory;
-use MediaWiki\Storage\NameTableStore;
-use MediaWiki\Storage\RevisionFactory;
-use MediaWiki\Storage\RevisionLookup;
-use MediaWiki\Storage\RevisionStore;
-use MediaWiki\Storage\RevisionStoreFactory;
-use MediaWiki\Storage\SqlBlobStore;
 
 /**
  * @covers MediaWiki\MediaWikiServices
@@ -307,70 +293,18 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
        }
 
        public function provideGetService() {
-               // NOTE: This should list all service getters defined in ServiceWiring.php.
-               return [
-                       'BootstrapConfig' => [ 'BootstrapConfig', Config::class ],
-                       'ConfigFactory' => [ 'ConfigFactory', ConfigFactory::class ],
-                       'MainConfig' => [ 'MainConfig', Config::class ],
-                       'SiteStore' => [ 'SiteStore', SiteStore::class ],
-                       'SiteLookup' => [ 'SiteLookup', SiteLookup::class ],
-                       'StatsdDataFactory' => [ 'StatsdDataFactory', IBufferingStatsdDataFactory::class ],
-                       'PerDbNameStatsdDataFactory' =>
-                               [ 'PerDbNameStatsdDataFactory', IBufferingStatsdDataFactory::class ],
-                       'InterwikiLookup' => [ 'InterwikiLookup', InterwikiLookup::class ],
-                       'EventRelayerGroup' => [ 'EventRelayerGroup', EventRelayerGroup::class ],
-                       'SearchEngineFactory' => [ 'SearchEngineFactory', SearchEngineFactory::class ],
-                       'SearchEngineConfig' => [ 'SearchEngineConfig', SearchEngineConfig::class ],
-                       'SkinFactory' => [ 'SkinFactory', SkinFactory::class ],
-                       'DBLoadBalancerFactory' => [ 'DBLoadBalancerFactory', Wikimedia\Rdbms\LBFactory::class ],
-                       'DBLoadBalancer' => [ 'DBLoadBalancer', Wikimedia\Rdbms\LoadBalancer::class ],
-                       'WatchedItemStore' => [ 'WatchedItemStore', WatchedItemStore::class ],
-                       'WatchedItemQueryService' => [ 'WatchedItemQueryService', WatchedItemQueryService::class ],
-                       'CryptRand' => [ 'CryptRand', CryptRand::class ],
-                       'CryptHKDF' => [ 'CryptHKDF', CryptHKDF::class ],
-                       'MediaHandlerFactory' => [ 'MediaHandlerFactory', MediaHandlerFactory::class ],
-                       'Parser' => [ 'Parser', Parser::class ],
-                       'ParserCache' => [ 'ParserCache', ParserCache::class ],
-                       'GenderCache' => [ 'GenderCache', GenderCache::class ],
-                       'LinkCache' => [ 'LinkCache', LinkCache::class ],
-                       'LinkRenderer' => [ 'LinkRenderer', LinkRenderer::class ],
-                       'LinkRendererFactory' => [ 'LinkRendererFactory', LinkRendererFactory::class ],
-                       '_MediaWikiTitleCodec' => [ '_MediaWikiTitleCodec', MediaWikiTitleCodec::class ],
-                       'MimeAnalyzer' => [ 'MimeAnalyzer', MimeAnalyzer::class ],
-                       'TitleFormatter' => [ 'TitleFormatter', TitleFormatter::class ],
-                       'TitleParser' => [ 'TitleParser', TitleParser::class ],
-                       'ProxyLookup' => [ 'ProxyLookup', ProxyLookup::class ],
-                       'MainObjectStash' => [ 'MainObjectStash', BagOStuff::class ],
-                       'MainWANObjectCache' => [ 'MainWANObjectCache', WANObjectCache::class ],
-                       'LocalServerObjectCache' => [ 'LocalServerObjectCache', BagOStuff::class ],
-                       'VirtualRESTServiceClient' => [ 'VirtualRESTServiceClient', VirtualRESTServiceClient::class ],
-                       'ShellCommandFactory' => [ 'ShellCommandFactory', CommandFactory::class ],
-                       'BlobStoreFactory' => [ 'BlobStoreFactory', BlobStoreFactory::class ],
-                       'BlobStore' => [ 'BlobStore', BlobStore::class ],
-                       '_SqlBlobStore' => [ '_SqlBlobStore', SqlBlobStore::class ],
-                       'RevisionStore' => [ 'RevisionStore', RevisionStore::class ],
-                       'RevisionStoreFactory' => [ 'RevisionStoreFactory', RevisionStoreFactory::class ],
-                       'RevisionLookup' => [ 'RevisionLookup', RevisionLookup::class ],
-                       'RevisionFactory' => [ 'RevisionFactory', RevisionFactory::class ],
-                       'ContentModelStore' => [ 'ContentModelStore', NameTableStore::class ],
-                       'SlotRoleStore' => [ 'SlotRoleStore', NameTableStore::class ],
-                       'HttpRequestFactory' => [ 'HttpRequestFactory', HttpRequestFactory::class ],
-                       'CommentStore' => [ 'CommentStore', CommentStore::class ],
-                       'ChangeTagDefStore' => [ 'ChangeTagDefStore', NameTableStore::class ],
-                       'ConfiguredReadOnlyMode' => [ 'ConfiguredReadOnlyMode', ConfiguredReadOnlyMode::class ],
-                       'ReadOnlyMode' => [ 'ReadOnlyMode', ReadOnlyMode::class ],
-                       'UploadRevisionImporter' => [ 'UploadRevisionImporter', UploadRevisionImporter::class ],
-                       'OldRevisionImporter' => [ 'OldRevisionImporter', OldRevisionImporter::class ],
-                       'WikiRevisionOldRevisionImporterNoUpdates' =>
-                               [ 'WikiRevisionOldRevisionImporterNoUpdates', ImportableOldRevisionImporter::class ],
-                       'ExternalStoreFactory' => [ 'ExternalStoreFactory', ExternalStoreFactory::class ],
-                       'PreferencesFactory' => [ 'PreferencesFactory', PreferencesFactory::class ],
-                       'ActorMigration' => [ 'ActorMigration', ActorMigration::class ],
-                       'ConfigRepository' => [ 'ConfigRepository', \MediaWiki\Config\ConfigRepository::class ],
-                       'MagicWordFactory' => [ 'MagicWordFactory', MagicWordFactory::class ],
-                       'ContentLanguage' => [ 'ContentLanguage', Language::class ],
-                       'PasswordFactory' => [ 'PasswordFactory', PasswordFactory::class ],
-               ];
+               global $IP;
+               $serviceList = require "$IP/includes/ServiceWiring.php";
+               $ret = [];
+               foreach ( $serviceList as $name => $callback ) {
+                       $fun = new ReflectionFunction( $callback );
+                       if ( !$fun->hasReturnType() ) {
+                               throw new MWException( 'All service callbacks must have a return type defined, ' .
+                                       "none found for $name" );
+                       }
+                       $ret[$name] = [ $name, $fun->getReturnType()->__toString() ];
+               }
+               return $ret;
        }
 
        /**
@@ -401,7 +335,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
        public function testDefaultServiceWiringServicesHaveTests() {
                global $IP;
                $testedServices = array_keys( $this->provideGetService() );
-               $allServices = array_keys( include $IP . '/includes/ServiceWiring.php' );
+               $allServices = array_keys( require "$IP/includes/ServiceWiring.php" );
                $this->assertEquals(
                        [],
                        array_diff( $allServices, $testedServices ),
@@ -409,4 +343,24 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                );
        }
 
+       public function testGettersAreSorted() {
+               $methods = ( new ReflectionClass( MediaWikiServices::class ) )
+                       ->getMethods( ReflectionMethod::IS_STATIC | ReflectionMethod::IS_PUBLIC );
+
+               $names = array_map( function ( $method ) {
+                       return $method->getName();
+               }, $methods );
+               $serviceNames = array_map( function ( $name ) {
+                       return "get$name";
+               }, array_keys( $this->provideGetService() ) );
+               $names = array_values( array_filter( $names, function ( $name ) use ( $serviceNames ) {
+                       return in_array( $name, $serviceNames );
+               } ) );
+
+               $sortedNames = $names;
+               sort( $sortedNames );
+
+               $this->assertSame( $sortedNames, $names,
+                       'Please keep service getters sorted alphabetically' );
+       }
 }
index 87a7dff..cb234b2 100644 (file)
  *
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
-class MediaWikiVersionFetcherTest extends PHPUnit\Framework\TestCase {
+class MediaWikiVersionFetcherTest extends MediaWikiTestCase {
 
        use MediaWikiCoversValidator;
 
        public function testReturnsResult() {
+               global $wgVersion;
                $versionFetcher = new MediaWikiVersionFetcher();
-               $this->assertInternalType( 'string', $versionFetcher->fetchVersion() );
+               $this->assertSame( $wgVersion, $versionFetcher->fetchVersion() );
        }
 
 }
index 3e3d04a..d75c0e5 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-use Wikimedia\ObjectFactory;
+use MediaWiki\MediaWikiServices;
 use Wikimedia\TestingAccessWrapper;
 
 /**
@@ -401,14 +401,12 @@ class MessageTest extends MediaWikiLangTestCase {
        }
 
        public function testRawHtmlInMsg() {
-               global $wgParserConf;
                $this->setMwGlobals( 'wgRawHtml', true );
                // We have to reset the core hook registration.
                // to register the html hook
                MessageCache::destroyInstance();
                $this->setMwGlobals( 'wgParser',
-                       ObjectFactory::constructClassInstance( $wgParserConf['class'], [ $wgParserConf ] )
-               );
+                       MediaWikiServices::getInstance()->getParserFactory()->create() );
 
                $msg = new RawMessage( '<html><script>alert("xss")</script></html>' );
                $txt = '<span class="error">&lt;html&gt; tags cannot be' .
diff --git a/tests/phpunit/includes/ServiceWiringTest.php b/tests/phpunit/includes/ServiceWiringTest.php
new file mode 100644 (file)
index 0000000..74e8e1b
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @coversNothing
+ */
+class ServiceWiringTest extends MediaWikiTestCase {
+       public function testServicesAreSorted() {
+               global $IP;
+               $services = array_keys( require "$IP/includes/ServiceWiring.php" );
+               $sortedServices = $services;
+               sort( $sortedServices );
+
+               $this->assertSame( $sortedServices, $services,
+                       'Please keep services sorted alphabetically' );
+       }
+}
index 3a1f078..c7f83de 100644 (file)
@@ -94,8 +94,6 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
         * @covers \MediaWiki\Storage\DerivedPageDataUpdater::getCanonicalParserOptions()
         */
        public function testGetCanonicalParserOptions() {
-               global $wgContLang;
-
                $user = $this->getTestUser()->getUser();
                $page = $this->getPage( __METHOD__ );
 
@@ -109,7 +107,8 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $updater->prepareContent( $user, $update, false );
 
                $options1 = $updater->getCanonicalParserOptions();
-               $this->assertSame( $wgContLang, $options1->getUserLangObj() );
+               $this->assertSame( MediaWikiServices::getInstance()->getContentLanguage(),
+                       $options1->getUserLangObj() );
 
                $speculativeId = call_user_func( $options1->getSpeculativeRevIdCallback(), $page->getTitle() );
                $this->assertSame( $parentRev->getId() + 1, $speculativeId );
index 93aef34..b59282d 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 class TimeAdjustTest extends MediaWikiLangTestCase {
        protected function setUp() {
                parent::setUp();
@@ -11,13 +13,12 @@ class TimeAdjustTest extends MediaWikiLangTestCase {
         * @covers Language::userAdjust
         */
        public function testUserAdjust( $date, $localTZoffset, $expected ) {
-               global $wgContLang;
-
                $this->setMwGlobals( 'wgLocalTZoffset', $localTZoffset );
 
                $this->assertEquals(
                        $expected,
-                       strval( $wgContLang->userAdjust( $date, '' ) ),
+                       strval( MediaWikiServices::getInstance()->getContentLanguage()->
+                               userAdjust( $date, '' ) ),
                        "User adjust {$date} by {$localTZoffset} minutes should give {$expected}"
                );
        }
index 6600aa2..f1f6f5f 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group Database
  *
@@ -99,8 +101,8 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
         * @covers Title::checkQuickPermissions
         */
        public function testQuickPermissions() {
-               global $wgContLang;
-               $prefix = $wgContLang->getFormattedNsText( NS_PROJECT );
+               $prefix = MediaWikiServices::getInstance()->getContentLanguage()->
+                       getFormattedNsText( NS_PROJECT );
 
                $this->setUser( 'anon' );
                $this->setTitle( NS_TALK );
@@ -643,9 +645,8 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
         * @covers Title::checkPageRestrictions
         */
        public function testPageRestrictions() {
-               global $wgContLang;
-
-               $prefix = $wgContLang->getFormattedNsText( NS_PROJECT );
+               $prefix = MediaWikiServices::getInstance()->getContentLanguage()->
+                       getFormattedNsText( NS_PROJECT );
 
                $this->setTitle( NS_MAIN );
                $this->title->mRestrictionsLoaded = true;
index f9ffeae..d585240 100644 (file)
@@ -449,7 +449,7 @@ class TitleTest extends MediaWikiTestCase {
                # Format:
                # - expected
                # - Title name
-               # - wgContLang (expected in most case)
+               # - content language (expected in most cases)
                # - wgLang (on some specific pages)
                # - wgDefaultLanguageVariant
                # - Optional message
index 7170e55..0c5d026 100644 (file)
@@ -38,7 +38,6 @@ class AuthManagerTest extends \MediaWikiTestCase {
                parent::setUp();
 
                $this->setMwGlobals( [ 'wgAuth' => null ] );
-               $this->stashMwGlobals( [ 'wgHooks' ] );
        }
 
        /**
@@ -48,11 +47,10 @@ class AuthManagerTest extends \MediaWikiTestCase {
         * @return object $mock->expects( $expect )->method( ... ).
         */
        protected function hook( $hook, $expect ) {
-               global $wgHooks;
                $mock = $this->getMockBuilder( __CLASS__ )
                        ->setMethods( [ "on$hook" ] )
                        ->getMock();
-               $wgHooks[$hook] = [ $mock ];
+               $this->setTemporaryHook( $hook, $mock );
                return $mock->expects( $expect )->method( "on$hook" );
        }
 
@@ -613,42 +611,35 @@ class AuthManagerTest extends \MediaWikiTestCase {
                );
        }
 
-       public function testSetDefaultUserOptions() {
+       /**
+        * @dataProvider provideSetDefaultUserOptions
+        */
+       public function testSetDefaultUserOptions(
+               $contLang, $useContextLang, $expectedLang, $expectedVariant
+       ) {
                $this->initializeManager();
 
+               $this->setContentLang( $contLang );
                $context = \RequestContext::getMain();
                $reset = new ScopedCallback( [ $context, 'setLanguage' ], [ $context->getLanguage() ] );
                $context->setLanguage( 'de' );
-               $this->setContentLang( 'zh' );
-
-               $user = \User::newFromName( self::usernameForCreation() );
-               $user->addToDatabase();
-               $oldToken = $user->getToken();
-               $this->managerPriv->setDefaultUserOptions( $user, false );
-               $user->saveSettings();
-               $this->assertNotEquals( $oldToken, $user->getToken() );
-               $this->assertSame( 'zh', $user->getOption( 'language' ) );
-               $this->assertSame( 'zh', $user->getOption( 'variant' ) );
 
                $user = \User::newFromName( self::usernameForCreation() );
                $user->addToDatabase();
                $oldToken = $user->getToken();
-               $this->managerPriv->setDefaultUserOptions( $user, true );
+               $this->managerPriv->setDefaultUserOptions( $user, $useContextLang );
                $user->saveSettings();
                $this->assertNotEquals( $oldToken, $user->getToken() );
-               $this->assertSame( 'de', $user->getOption( 'language' ) );
-               $this->assertSame( 'zh', $user->getOption( 'variant' ) );
-
-               $this->setContentLang( 'fr' );
+               $this->assertSame( $expectedLang, $user->getOption( 'language' ) );
+               $this->assertSame( $expectedVariant, $user->getOption( 'variant' ) );
+       }
 
-               $user = \User::newFromName( self::usernameForCreation() );
-               $user->addToDatabase();
-               $oldToken = $user->getToken();
-               $this->managerPriv->setDefaultUserOptions( $user, true );
-               $user->saveSettings();
-               $this->assertNotEquals( $oldToken, $user->getToken() );
-               $this->assertSame( 'de', $user->getOption( 'language' ) );
-               $this->assertSame( null, $user->getOption( 'variant' ) );
+       public function provideSetDefaultUserOptions() {
+               return [
+                       [ 'zh', false, 'zh', 'zh' ],
+                       [ 'zh', true, 'de', 'zh' ],
+                       [ 'fr', true, 'de', null ],
+               ];
        }
 
        public function testForcePrimaryAuthenticationProviders() {
@@ -2380,7 +2371,8 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $wgGroupPermissions['*']['createaccount'] = true;
                $wgGroupPermissions['*']['autocreateaccount'] = false;
 
-               \ObjectCache::$instances[__METHOD__] = new \HashBagOStuff();
+               $this->mergeMwGlobalArrayValue( 'wgObjectCaches',
+                       [ __METHOD__ => [ 'class' => 'HashBagOStuff' ] ] );
                $this->setMwGlobals( [ 'wgMainCacheType' => __METHOD__ ] );
 
                // Set up lots of mocks...
index b03eeba..1edb935 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group Database
  * @group Cache
@@ -10,6 +12,7 @@ class MessageCacheTest extends MediaWikiLangTestCase {
        protected function setUp() {
                parent::setUp();
                $this->configureLanguages();
+               MessageCache::destroyInstance();
                MessageCache::singleton()->enable();
        }
 
@@ -57,12 +60,10 @@ class MessageCacheTest extends MediaWikiLangTestCase {
         * @param string|null $content Content of the created page, or null for a generic string
         */
        protected function makePage( $title, $lang, $content = null ) {
-               global $wgContLang;
-
                if ( $content === null ) {
                        $content = $lang;
                }
-               if ( $lang !== $wgContLang->getCode() ) {
+               if ( $lang !== MediaWikiServices::getInstance()->getContentLanguage()->getCode() ) {
                        $title = "$title/$lang";
                }
 
@@ -100,11 +101,9 @@ class MessageCacheTest extends MediaWikiLangTestCase {
        }
 
        public function testReplaceMsg() {
-               global $wgContLang;
-
                $messageCache = MessageCache::singleton();
                $message = 'go';
-               $uckey = $wgContLang->ucfirst( $message );
+               $uckey = MediaWikiServices::getInstance()->getContentLanguage()->ucfirst( $message );
                $oldText = $messageCache->get( $message ); // "Ausführen"
 
                $dbw = wfGetDB( DB_MASTER );
index 406bc96..b01a7db 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group ContentHandler
  * @group Database
@@ -115,9 +117,8 @@ class TextContentTest extends MediaWikiLangTestCase {
         * @covers TextContent::preSaveTransform
         */
        public function testPreSaveTransform( $text, $expected ) {
-               global $wgContLang;
-
-               $options = ParserOptions::newFromUserAndLang( $this->context->getUser(), $wgContLang );
+               $options = ParserOptions::newFromUserAndLang( $this->context->getUser(),
+                       MediaWikiServices::getInstance()->getContentLanguage() );
 
                $content = $this->newContent( $text );
                $content = $content->preSaveTransform(
@@ -143,8 +144,8 @@ class TextContentTest extends MediaWikiLangTestCase {
         * @covers TextContent::preloadTransform
         */
        public function testPreloadTransform( $text, $expected ) {
-               global $wgContLang;
-               $options = ParserOptions::newFromUserAndLang( $this->context->getUser(), $wgContLang );
+               $options = ParserOptions::newFromUserAndLang( $this->context->getUser(),
+                       MediaWikiServices::getInstance()->getContentLanguage() );
 
                $content = $this->newContent( $text );
                $content = $content->preloadTransform( $this->context->getTitle(), $options );
index 4bb1ed2..b4b2948 100644 (file)
@@ -80,8 +80,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
         * @covers WikitextContentHandler::makeRedirectContent
         */
        public function testMakeRedirectContent( $title, $expected ) {
-               global $wgContLang;
-               $wgContLang->resetNamespaces();
+               MediaWikiServices::getInstance()->getContentLanguage()->resetNamespaces();
 
                MediaWikiServices::getInstance()->resetServiceForTesting( 'MagicWordFactory' );
 
index 687c7e0..91255eb 100644 (file)
@@ -442,4 +442,19 @@ just a test"
                        // @todo more...?
                ];
        }
+
+       /**
+        * @covers WikitextContent::preSaveTransform
+        * @covers WikitextContent::fillParserOutput
+        */
+       public function testHadSignature() {
+               $titleObj = Title::newFromText( __CLASS__ );
+
+               $content = new WikitextContent( '~~~~' );
+               $pstContent = $content->preSaveTransform(
+                       $titleObj, $this->getTestUser()->getUser(), new ParserOptions()
+               );
+
+               $this->assertTrue( $pstContent->getParserOutput( $titleObj )->getFlag( 'user-signature' ) );
+       }
 }
index 6105678..3e37f15 100644 (file)
@@ -4,6 +4,19 @@ class JavaScriptMinifierTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
+       protected function tearDown() {
+               parent::tearDown();
+               // Reset
+               $this->setMaxLineLength( 1000 );
+       }
+
+       private function setMaxLineLength( $val ) {
+               $classReflect = new ReflectionClass( JavaScriptMinifier::class );
+               $propertyReflect = $classReflect->getProperty( 'maxLineLength' );
+               $propertyReflect->setAccessible( true );
+               $propertyReflect->setValue( JavaScriptMinifier::class, $val );
+       }
+
        public static function provideCases() {
                return [
 
@@ -203,40 +216,108 @@ class JavaScriptMinifierTest extends PHPUnit\Framework\TestCase {
                );
        }
 
-       public static function provideExponentLineBreaking() {
+       public static function provideLineBreaker() {
                return [
                        [
-                               // This one gets interpreted all together by the prior code;
-                               // no break at the 'E' happens.
-                               '1.23456789E55',
+                               // Regression tests for T34548.
+                               // Must not break between 'E' and '+'.
+                               'var name = 1.23456789E55;',
+                               [
+                                       'var',
+                                       'name',
+                                       '=',
+                                       '1.23456789E55',
+                                       ';',
+                               ],
                        ],
                        [
-                               // This one breaks under the bad code; splits between 'E' and '+'
-                               '1.23456789E+5',
+                               'var name = 1.23456789E+5;',
+                               [
+                                       'var',
+                                       'name',
+                                       '=',
+                                       '1.23456789E+5',
+                                       ';',
+                               ],
                        ],
                        [
-                               // This one breaks under the bad code; splits between 'E' and '-'
-                               '1.23456789E-5',
+                               'var name = 1.23456789E-5;',
+                               [
+                                       'var',
+                                       'name',
+                                       '=',
+                                       '1.23456789E-5',
+                                       ';',
+                               ],
                        ],
+                       [
+                               // Regression test for T201606.
+                               // Must not break between 'return' and Expression.
+                               <<<JAVASCRIPT
+                       call( function () {
+                               try {
+                               } catch (e) {
+                                       obj = {
+                                               key: 1 ? 0 : {}
+                                       };
+                               }
+                               return name === 'input';
+                       } );
+JAVASCRIPT
+                               ,
+                               [
+                                       'call',
+                                       '(',
+                                       'function',
+                                       '(',
+                                       ')',
+                                       '{',
+                                       'try',
+                                       '{',
+                                       '}',
+                                       'catch',
+                                       '(',
+                                       'e',
+                                       ')',
+                                       '{',
+                                       'obj',
+                                       '=',
+                                       '{',
+                                       'key',
+                                       ':',
+                                       '1',
+                                       '?',
+                                       '0',
+                                       ':',
+                                       '{',
+                                       '}',
+                                       '}',
+                                       ';',
+                                       '}',
+                                       // The return Statement:
+                                       //     return [no LineTerminator here] Expression
+                                       'return name',
+                                       '===',
+                                       "'input'",
+                                       ';',
+                                       '}',
+                                       ')',
+                                       ';',
+                               ]
+                       ]
                ];
        }
 
        /**
-        * @dataProvider provideExponentLineBreaking
+        * @dataProvider provideLineBreaker
         * @covers JavaScriptMinifier::minify
         */
-       public function testExponentLineBreaking( $num ) {
-               // Long line breaking was being incorrectly done between the base and
-               // exponent part of a number, causing a syntax error. The line should
-               // instead break at the start of the number. (T34548)
-               $prefix = 'var longVarName' . str_repeat( '_', 973 ) . '=';
-               $suffix = ',shortVarName=0;';
-
-               $input = $prefix . $num . $suffix;
-               $expected = $prefix . "\n" . $num . $suffix;
-
-               $minified = JavaScriptMinifier::minify( $input );
-
-               $this->assertEquals( $expected, $minified, "Line breaks must not occur in middle of exponent" );
+       public function testLineBreaker( $code, array $expectedLines ) {
+               $this->setMaxLineLength( 1 );
+               $actual = JavaScriptMinifier::minify( $code );
+               $this->assertEquals(
+                       array_merge( [ '' ], $expectedLines ),
+                       explode( "\n", $actual )
+               );
        }
 }
index 6fbb474..7aef246 100644 (file)
@@ -26,6 +26,17 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
                $this->assertMetadata( $infile, $expected );
        }
 
+       /**
+        * @dataProvider provideSvgUnits
+        */
+       public function testScaleSVGUnit( $inUnit, $expected ) {
+               $this->assertEquals(
+                       $expected,
+                       SVGReader::scaleSVGUnit( $inUnit ),
+                       'SVG unit conversion and scaling failure'
+               );
+       }
+
        function assertMetadata( $infile, $expected ) {
                try {
                        $data = SVGMetadataExtractor::getMetadata( $infile );
@@ -123,6 +134,16 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
                                        'translations' => []
                                ],
                        ],
+                       [
+                               "$base/comma_separated_viewbox.svg",
+                               [
+                                       'width' => 512,
+                                       'height' => 594,
+                                       'originalWidth' => '100%',
+                                       'originalHeight' => '100%',
+                                       'translations' => []
+                               ],
+                       ],
                ];
        }
 
@@ -152,4 +173,34 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
                        ],
                ];
        }
+
+       public static function provideSvgUnits() {
+               return [
+                       [ '1' , 1 ],
+                       [ '1.1' , 1.1 ],
+                       [ '0.1' , 0.1 ],
+                       [ '.1' , 0.1 ],
+                       [ '1e2' , 100 ],
+                       [ '1E2' , 100 ],
+                       [ '+1' , 1 ],
+                       [ '-1' , -1 ],
+                       [ '-1.1' , -1.1 ],
+                       [ '1e+2' , 100 ],
+                       [ '1e-2' , 0.01 ],
+                       [ '10px' , 10 ],
+                       [ '10pt' , 10 * 1.25 ],
+                       [ '10pc' , 10 * 15 ],
+                       [ '10mm' , 10 * 3.543307 ],
+                       [ '10cm' , 10 * 35.43307 ],
+                       [ '10in' , 10 * 90 ],
+                       [ '10em' , 10 * 16 ],
+                       [ '10ex' , 10 * 12 ],
+                       [ '10%' , 51.2 ],
+                       [ '10 px' , 10 ],
+                       // Invalid values
+                       [ '1e1.1', 10 ],
+                       [ '10bp', 10 ],
+                       [ 'p10', null ],
+               ];
+       }
 }
diff --git a/tests/phpunit/includes/parser/ParserFactoryTest.php b/tests/phpunit/includes/parser/ParserFactoryTest.php
new file mode 100644 (file)
index 0000000..f37bdfc
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * @covers ParserFactory
+ */
+class ParserFactoryTest extends MediaWikiTestCase {
+       /**
+        * For backwards compatibility, all parameters to the parser constructor are optional and
+        * default to the appropriate global service, so it's easy to forget to update ParserFactory to
+        * actually pass the parameters it's supposed to.
+        */
+       public function testConstructorArgNum() {
+               $factoryConstructor = new ReflectionMethod( 'ParserFactory', '__construct' );
+               $instanceConstructor = new ReflectionMethod( 'Parser', '__construct' );
+               // Subtract one for the ParserFactory itself
+               $this->assertSame( $instanceConstructor->getNumberOfParameters() - 1,
+                       $factoryConstructor->getNumberOfParameters(),
+                       'Parser and ParserFactory constructors have an inconsistent number of parameters. ' .
+                       'Did you add a parameter to one and not the other?' );
+       }
+
+       public function testAllArgumentsWerePassed() {
+               $factoryConstructor = new ReflectionMethod( 'ParserFactory', '__construct' );
+               $mocks = [];
+               foreach ( $factoryConstructor->getParameters() as $param ) {
+                       $type = (string)$param->getType();
+                       if ( $type === 'array' ) {
+                               $val = [ 'porcupines will tell me your secrets' . count( $mocks ) ];
+                       } elseif ( class_exists( $type ) || interface_exists( $type ) ) {
+                               $val = $this->createMock( $type );
+                       } elseif ( $type === '' ) {
+                               // Optimistically assume a string is okay
+                               $val = 'I will de-quill them first' . count( $mocks );
+                       } else {
+                               $this->fail( "Unrecognized parameter type $type in ParserFactory constructor" );
+                       }
+                       $mocks[] = $val;
+               }
+
+               $factory = new ParserFactory( ...$mocks );
+               $parser = $factory->create();
+
+               foreach ( ( new ReflectionObject( $parser ) )->getProperties() as $prop ) {
+                       $prop->setAccessible( true );
+                       foreach ( $mocks as $idx => $mock ) {
+                               if ( $prop->getValue( $parser ) === $mock ) {
+                                       unset( $mocks[$idx] );
+                               }
+                       }
+               }
+
+               $this->assertCount( 0, $mocks, 'Not all arguments to the ParserFactory constructor were ' .
+                       'found in Parser member variables' );
+       }
+}
index 29f1c8c..8c17780 100644 (file)
@@ -45,9 +45,9 @@ class ParserOptionsTest extends MediaWikiTestCase {
        public function testNewCanonical() {
                $wgUser = $this->getMutableTestUser()->getUser();
                $wgLang = Language::factory( 'fr' );
-               $wgContLang = Language::factory( 'qqx' );
+               $contLang = Language::factory( 'qqx' );
 
-               $this->setContentLang( $wgContLang );
+               $this->setContentLang( $contLang );
                $this->setMwGlobals( [
                        'wgUser' => $wgUser,
                        'wgLang' => $wgLang,
@@ -80,13 +80,12 @@ class ParserOptionsTest extends MediaWikiTestCase {
                $this->assertSame( $user, $popt->getUser() );
                $this->assertSame( $lang, $popt->getUserLangObj() );
 
-               // Passing 'canonical' uses an anon and $wgContLang, and ignores
-               // any passed $userLang
+               // Passing 'canonical' uses an anon and $contLang, and ignores any passed $userLang
                $popt = ParserOptions::newCanonical( 'canonical' );
                $this->assertTrue( $popt->getUser()->isAnon() );
-               $this->assertSame( $wgContLang, $popt->getUserLangObj() );
+               $this->assertSame( $contLang, $popt->getUserLangObj() );
                $popt = ParserOptions::newCanonical( 'canonical', $lang2 );
-               $this->assertSame( $wgContLang, $popt->getUserLangObj() );
+               $this->assertSame( $contLang, $popt->getUserLangObj() );
 
                // Passing an IContextSource uses the user and lang from it, and ignores
                // any passed $userLang
index 7707395..560b921 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use MediaWiki\MediaWikiServices;
+
 /**
  * Basic tests for Parser::getPreloadText
  * @author Antoine Musso
@@ -42,10 +45,9 @@ class ParserPreloadTest extends MediaWikiTestCase {
        private $title;
 
        protected function setUp() {
-               global $wgContLang;
-
                parent::setUp();
-               $this->testParserOptions = ParserOptions::newFromUserAndLang( new User, $wgContLang );
+               $this->testParserOptions = ParserOptions::newFromUserAndLang( new User,
+                       MediaWikiServices::getInstance()->getContentLanguage() );
 
                $this->testParser = new Parser();
                $this->testParser->Options( $this->testParserOptions );
index c415b58..6b3e05d 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @covers Preprocessor
  *
@@ -42,9 +44,9 @@ class PreprocessorTest extends MediaWikiTestCase {
        ];
 
        protected function setUp() {
-               global $wgContLang;
                parent::setUp();
-               $this->mOptions = ParserOptions::newFromUserAndLang( new User, $wgContLang );
+               $this->mOptions = ParserOptions::newFromUserAndLang( new User,
+                       MediaWikiServices::getInstance()->getContentLanguage() );
 
                $this->mPreprocessors = [];
                foreach ( self::$classNames as $className ) {
index bc09adc..06da7a5 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group Database
  * @group Parser
@@ -45,8 +47,8 @@ class TagHooksTest extends MediaWikiTestCase {
        }
 
        private function getParserOptions() {
-               global $wgContLang;
-               $popt = ParserOptions::newFromUserAndLang( new User, $wgContLang );
+               $popt = ParserOptions::newFromUserAndLang( new User,
+                       MediaWikiServices::getInstance()->getContentLanguage() );
                return $popt;
        }
 
@@ -54,8 +56,7 @@ class TagHooksTest extends MediaWikiTestCase {
         * @dataProvider provideValidNames
         */
        public function testTagHooks( $tag ) {
-               global $wgParserConf;
-               $parser = new Parser( $wgParserConf );
+               $parser = MediaWikiServices::getInstance()->getParserFactory()->create();
 
                $parser->setHook( $tag, [ $this, 'tagCallback' ] );
                $parserOutput = $parser->parse(
@@ -73,8 +74,7 @@ class TagHooksTest extends MediaWikiTestCase {
         * @expectedException MWException
         */
        public function testBadTagHooks( $tag ) {
-               global $wgParserConf;
-               $parser = new Parser( $wgParserConf );
+               $parser = MediaWikiServices::getInstance()->getParserFactory()->create();
 
                $parser->setHook( $tag, [ $this, 'tagCallback' ] );
                $parser->parse(
@@ -89,8 +89,7 @@ class TagHooksTest extends MediaWikiTestCase {
         * @dataProvider provideValidNames
         */
        public function testFunctionTagHooks( $tag ) {
-               global $wgParserConf;
-               $parser = new Parser( $wgParserConf );
+               $parser = MediaWikiServices::getInstance()->getParserFactory()->create();
 
                $parser->setFunctionTagHook( $tag, [ $this, 'functionTagCallback' ], 0 );
                $parserOutput = $parser->parse(
@@ -108,8 +107,7 @@ class TagHooksTest extends MediaWikiTestCase {
         * @expectedException MWException
         */
        public function testBadFunctionTagHooks( $tag ) {
-               global $wgParserConf;
-               $parser = new Parser( $wgParserConf );
+               $parser = MediaWikiServices::getInstance()->getParserFactory()->create();
 
                $parser->setFunctionTagHook(
                        $tag,
index 296691d..43c678e 100644 (file)
@@ -3,7 +3,6 @@
 use MediaWiki\Auth\AuthManager;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Preferences\DefaultPreferencesFactory;
-use Wikimedia\ObjectFactory;
 use Wikimedia\TestingAccessWrapper;
 
 /**
@@ -38,13 +37,13 @@ class DefaultPreferencesFactoryTest extends MediaWikiTestCase {
 
        public function setUp() {
                parent::setUp();
-               global $wgParserConf;
                $this->context = new RequestContext();
                $this->context->setTitle( Title::newFromText( self::class ) );
-               $this->setMwGlobals( 'wgParser',
-                       ObjectFactory::constructClassInstance( $wgParserConf['class'], [ $wgParserConf ] )
-               );
-               $this->config = MediaWikiServices::getInstance()->getMainConfig();
+
+               $services = MediaWikiServices::getInstance();
+
+               $this->setMwGlobals( 'wgParser', $services->getParserFactory()->create() );
+               $this->config = $services->getMainConfig();
        }
 
        /**
index 784fed0..1da6fb3 100644 (file)
@@ -1,4 +1,6 @@
 <?php
+
+use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
 
 /**
@@ -142,8 +144,7 @@ class SpecialPageFactoryTest extends MediaWikiTestCase {
        public function testConflictResolution(
                $test, $aliasesList, $alias, $expectedName, $expectedAlias, $expectWarnings
        ) {
-               global $wgContLang;
-               $lang = clone $wgContLang;
+               $lang = clone MediaWikiServices::getInstance()->getContentLanguage();
                $lang->mExtendedSpecialPageAliases = $aliasesList;
                $this->setContentLang( $lang );
                $this->setMwGlobals( 'wgSpecialPages',
index 84fa71a..bcd3d84 100644 (file)
@@ -35,7 +35,7 @@ class SpecialMyLanguageTest extends MediaWikiTestCase {
         * @param string $userLang
         */
        public function testFindTitle( $expected, $subpage, $langCode, $userLang ) {
-               $this->setMwGlobals( 'wgLanguageCode', $langCode );
+               $this->setContentLang( $langCode );
                $special = new SpecialMyLanguage();
                $special->getContext()->setLanguage( $userLang );
                // Test with subpages both enabled and disabled
index c97bdaf..8ccacfc 100644 (file)
@@ -103,9 +103,9 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
         * @covers LanguageConverter::getUserVariant
         */
        public function testGetPreferredVariantUserOptionForForeignLanguage() {
-               global $wgContLang, $wgUser;
+               global $wgUser;
 
-               $wgContLang = Language::factory( 'en' );
+               $this->setContentLang( 'en' );
                $wgUser = new User;
                $wgUser->load(); // from 'defaults'
                $wgUser->mId = 1;
@@ -122,9 +122,9 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
         * @covers LanguageConverter::getURLVariant
         */
        public function testGetPreferredVariantHeaderUserVsUrl() {
-               global $wgContLang, $wgRequest, $wgUser;
+               global $wgRequest, $wgUser;
 
-               $wgContLang = Language::factory( 'tg-latn' );
+               $this->setContentLang( 'tg-latn' );
                $wgRequest->setVal( 'variant', 'tg' );
                $wgUser = User::newFromId( "admin" );
                $wgUser->setId( 1 );
@@ -150,9 +150,9 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
         * @covers LanguageConverter::getURLVariant
         */
        public function testGetPreferredVariantDefaultLanguageVsUrlVariant() {
-               global $wgDefaultLanguageVariant, $wgRequest, $wgContLang;
+               global $wgDefaultLanguageVariant, $wgRequest;
 
-               $wgContLang = Language::factory( 'tg-latn' );
+               $this->setContentLang( 'tg-latn' );
                $wgDefaultLanguageVariant = 'tg';
                $wgRequest->setVal( 'variant', null );
                $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
index c215b99..9357451 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace MediaWiki\Tests\Maintenance;
 
+use MediaWiki\MediaWikiServices;
 use DumpBackup;
 use ManualLogEntry;
 use Title;
@@ -145,8 +146,6 @@ class BackupDumperLoggerTest extends DumpTestCase {
        }
 
        function testPlain() {
-               global $wgContLang;
-
                // Preparing the dump
                $fname = $this->getNewTempFile();
 
@@ -165,8 +164,9 @@ class BackupDumperLoggerTest extends DumpTestCase {
                $this->assertLogItem( $this->logId1, "BackupDumperLogUserA",
                        $this->userId1, null, "type", "subtype", "PageA" );
 
-               $this->assertNotNull( $wgContLang, "Content language object validation" );
-               $namespace = $wgContLang->getNsText( NS_TALK );
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+               $this->assertNotNull( $contLang, "Content language object validation" );
+               $namespace = $contLang->getNsText( NS_TALK );
                $this->assertInternalType( 'string', $namespace );
                $this->assertGreaterThan( 0, strlen( $namespace ) );
                $this->assertLogItem( $this->logId2, "BackupDumperLogUserB",
@@ -181,8 +181,6 @@ class BackupDumperLoggerTest extends DumpTestCase {
        }
 
        function testXmlDumpsBackupUseCaseLogging() {
-               global $wgContLang;
-
                $this->checkHasGzip();
 
                // Preparing the dump
@@ -218,8 +216,9 @@ class BackupDumperLoggerTest extends DumpTestCase {
                $this->assertLogItem( $this->logId1, "BackupDumperLogUserA",
                        $this->userId1, null, "type", "subtype", "PageA" );
 
-               $this->assertNotNull( $wgContLang, "Content language object validation" );
-               $namespace = $wgContLang->getNsText( NS_TALK );
+               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+               $this->assertNotNull( $contLang, "Content language object validation" );
+               $namespace = $contLang->getNsText( NS_TALK );
                $this->assertInternalType( 'string', $namespace );
                $this->assertGreaterThan( 0, strlen( $namespace ) );
                $this->assertLogItem( $this->logId2, "BackupDumperLogUserB",
index 6b2738b..05b85be 100644 (file)
                var done = assert.async();
 
                mw.loader.register( [
-                       [ 'test.circle1', '0', [ 'test.circle2' ] ],
-                       [ 'test.circle2', '0', [ 'test.circle3' ] ],
-                       [ 'test.circle3', '0', [ 'test.circle1' ] ]
+                       [ 'test.set.circleA', '0', [ 'test.set.circleB' ] ],
+                       [ 'test.set.circleB', '0', [ 'test.set.circleC' ] ],
+                       [ 'test.set.circleC', '0', [ 'test.set.circleA' ] ]
                ] );
-               mw.loader.using( 'test.circle3' ).then(
+               mw.loader.using( 'test.set.circleC' ).then(
                        function done() {
                                assert.ok( false, 'Unexpected resolution, expected error.' );
                        },
                mw.redefineFallbacksForTest();
 
                mw.loader.register( [
-                       [ 'test.shim.circle1', '0', [ 'test.shim.circle2' ] ],
-                       [ 'test.shim.circle2', '0', [ 'test.shim.circle3' ] ],
-                       [ 'test.shim.circle3', '0', [ 'test.shim.circle1' ] ]
+                       [ 'test.shim.circleA', '0', [ 'test.shim.circleB' ] ],
+                       [ 'test.shim.circleB', '0', [ 'test.shim.circleC' ] ],
+                       [ 'test.shim.circleC', '0', [ 'test.shim.circleA' ] ]
                ] );
-               mw.loader.using( 'test.shim.circle3' ).then(
+               mw.loader.using( 'test.shim.circleC' ).then(
                        function done() {
                                assert.ok( false, 'Unexpected resolution, expected error.' );
                        },
        QUnit.test( '.load() - Error: Circular dependency', function ( assert ) {
                var capture = [];
                mw.loader.register( [
-                       [ 'test.circleA', '0', [ 'test.circleB' ] ],
-                       [ 'test.circleB', '0', [ 'test.circleC' ] ],
-                       [ 'test.circleC', '0', [ 'test.circleA' ] ]
+                       [ 'test.load.circleA', '0', [ 'test.load.circleB' ] ],
+                       [ 'test.load.circleB', '0', [ 'test.load.circleC' ] ],
+                       [ 'test.load.circleC', '0', [ 'test.load.circleA' ] ]
                ] );
                this.sandbox.stub( mw, 'track', function ( topic, data ) {
                        capture.push( {
                        } );
                } );
 
-               mw.loader.load( 'test.circleC' );
+               mw.loader.load( 'test.load.circleC' );
                assert.deepEqual(
                        [ {
                                topic: 'resourceloader.exception',
-                               error: 'Circular reference detected: test.circleB -> test.circleC',
+                               error: 'Circular reference detected: test.load.circleB -> test.load.circleC',
                                source: 'resolve'
                        } ],
                        capture,
                );
        } );
 
+       QUnit.test( '.load() - Error: Circular dependency (direct)', function ( assert ) {
+               var capture = [];
+               mw.loader.register( [
+                       [ 'test.load.circleDirect', '0', [ 'test.load.circleDirect' ] ]
+               ] );
+               this.sandbox.stub( mw, 'track', function ( topic, data ) {
+                       capture.push( {
+                               topic: topic,
+                               error: data.exception && data.exception.message,
+                               source: data.source
+                       } );
+               } );
+
+               mw.loader.load( 'test.load.circleDirect' );
+               assert.deepEqual(
+                       [ {
+                               topic: 'resourceloader.exception',
+                               error: 'Circular reference detected: test.load.circleDirect -> test.load.circleDirect',
+                               source: 'resolve'
+                       } ],
+                       capture,
+                       'Detect a direct self-dependency'
+               );
+       } );
+
        QUnit.test( '.using() - Error: Unregistered', function ( assert ) {
                var done = assert.async();