Merge "Decouple DatabaseBlock::newFromTarget from DatabaseBlock::newLoad"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 5 Jun 2019 20:51:04 +0000 (20:51 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 5 Jun 2019 20:51:04 +0000 (20:51 +0000)
209 files changed:
RELEASE-NOTES-1.34
autoload.php
composer.json
includes/DefaultSettings.php
includes/GitInfo.php
includes/Linker.php
includes/MediaWikiServices.php
includes/Permissions/PermissionManager.php
includes/ServiceWiring.php
includes/Storage/DerivedPageDataUpdater.php
includes/TemplateParser.php
includes/TitleArray.php
includes/actions/InfoAction.php
includes/api/ApiBase.php
includes/api/ApiFeedContributions.php
includes/api/ApiFormatBase.php
includes/api/ApiHelp.php
includes/api/ApiQuery.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLanguageinfo.php [new file with mode: 0644]
includes/api/ApiQueryRevisions.php
includes/api/ApiUndelete.php
includes/api/SearchApi.php
includes/api/i18n/ar.json
includes/api/i18n/en.json
includes/api/i18n/fr.json
includes/api/i18n/it.json
includes/api/i18n/qqq.json
includes/debug/logger/ConsoleSpi.php
includes/deferred/DeferredUpdates.php
includes/deferred/MWCallableUpdate.php
includes/export/WikiExporter.php
includes/export/XmlDumpWriter.php
includes/filerepo/FileRepo.php
includes/htmlform/HTMLForm.php
includes/installer/i18n/ar.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/cs.json
includes/installer/i18n/eo.json
includes/installer/i18n/es.json
includes/installer/i18n/fr.json
includes/installer/i18n/it.json
includes/installer/i18n/ko.json
includes/installer/i18n/lb.json
includes/installer/i18n/nl.json
includes/installer/i18n/pl.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/roa-tara.json
includes/interwiki/InterwikiLookup.php
includes/interwiki/InterwikiLookupAdapter.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/libs/eventrelayer/EventRelayerKafka.php
includes/libs/rdbms/database/IDatabase.php
includes/libs/rdbms/database/resultwrapper/FakeResultWrapper.php
includes/libs/rdbms/database/resultwrapper/IResultWrapper.php
includes/libs/rdbms/database/resultwrapper/ResultWrapper.php
includes/libs/rdbms/loadbalancer/ILoadBalancer.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/libs/services/CannotReplaceActiveServiceException.php
includes/libs/services/ContainerDisabledException.php
includes/libs/services/DestructibleService.php
includes/libs/services/NoSuchServiceException.php
includes/libs/services/SalvageableService.php
includes/libs/services/ServiceAlreadyDefinedException.php
includes/libs/services/ServiceContainer.php
includes/libs/services/ServiceDisabledException.php
includes/libs/stats/IBufferingStatsdDataFactory.php
includes/media/MediaHandler.php
includes/media/XCFHandler.php
includes/page/WikiPage.php
includes/preferences/Filter.php
includes/skins/SkinFactory.php
includes/skins/SkinFallbackTemplate.php
includes/specials/SpecialFileDuplicateSearch.php
includes/specials/SpecialPermanentLink.php
includes/specials/SpecialUserrights.php
includes/upload/UploadBase.php
includes/user/User.php
includes/user/UserArray.php
languages/i18n/aeb-arab.json
languages/i18n/ar.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/ban.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/ce.json
languages/i18n/diq.json
languages/i18n/el.json
languages/i18n/eo.json
languages/i18n/es-formal.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/exif/es.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/fy.json
languages/i18n/gl.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/hyw.json
languages/i18n/ia.json
languages/i18n/ilo.json
languages/i18n/io.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ko.json
languages/i18n/lrc.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/nqo.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/sh.json
languages/i18n/sq.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/tr.json
languages/i18n/uk.json
languages/i18n/yo.json
languages/i18n/yue.json
maintenance/Maintenance.php
maintenance/changePassword.php
maintenance/checkDependencies.php [new file with mode: 0644]
maintenance/doMaintenance.php
package.json
resources/src/jquery.tipsy/jquery.tipsy.css
resources/src/jquery/jquery.makeCollapsible.styles.less
resources/src/jquery/jquery.suggestions.js
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.legacy/oldshared.css
resources/src/mediawiki.skinning/content.css
resources/src/mediawiki.special.apisandbox/apisandbox.js
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/Permissions/PermissionManagerTest.php
tests/phpunit/includes/Revision/McrReadNewRevisionStoreDbTest.php
tests/phpunit/includes/Revision/McrReadNewSchemaOverride.php
tests/phpunit/includes/Revision/McrRevisionStoreDbTest.php
tests/phpunit/includes/Revision/McrSchemaDetection.php
tests/phpunit/includes/Revision/McrSchemaOverride.php
tests/phpunit/includes/Revision/McrWriteBothRevisionStoreDbTest.php
tests/phpunit/includes/Revision/McrWriteBothSchemaOverride.php
tests/phpunit/includes/Revision/NoContentModelRevisionStoreDbTest.php
tests/phpunit/includes/Revision/PreMcrRevisionStoreDbTest.php
tests/phpunit/includes/Revision/PreMcrSchemaOverride.php
tests/phpunit/includes/Revision/RevisionQueryInfoTest.php
tests/phpunit/includes/Revision/RevisionStoreCacheRecordTest.php
tests/phpunit/includes/RevisionDbTestBase.php
tests/phpunit/includes/RevisionMcrWriteBothDbTest.php
tests/phpunit/includes/TemplateCategoriesTest.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/WikiMapTest.php
tests/phpunit/includes/actions/ActionTest.php
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiDeleteTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiMoveTest.php
tests/phpunit/includes/api/ApiParseTest.php
tests/phpunit/includes/api/ApiQueryLanguageinfoTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiSetNotificationTimestampIntegrationTest.php
tests/phpunit/includes/api/ApiStashEditTest.php
tests/phpunit/includes/api/ApiUnblockTest.php
tests/phpunit/includes/api/ApiUserrightsTest.php
tests/phpunit/includes/api/query/ApiQueryTest.php
tests/phpunit/includes/auth/AuthManagerTest.php
tests/phpunit/includes/cache/GenderCacheTest.php
tests/phpunit/includes/changes/RecentChangeTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/db/LoadBalancerTest.php
tests/phpunit/includes/diff/SlotDiffRendererTest.php
tests/phpunit/includes/import/ImportLinkCacheIntegrationTest.php
tests/phpunit/includes/import/ImportTest.php
tests/phpunit/includes/interwiki/InterwikiTest.php
tests/phpunit/includes/jobqueue/jobs/ClearUserWatchlistJobTest.php
tests/phpunit/includes/jobqueue/jobs/RefreshLinksJobTest.php
tests/phpunit/includes/libs/services/ServiceContainerTest.php
tests/phpunit/includes/page/ArticleTablesTest.php
tests/phpunit/includes/page/ArticleViewTest.php
tests/phpunit/includes/page/PageArchiveMcrTest.php
tests/phpunit/includes/page/PageArchivePreMcrTest.php
tests/phpunit/includes/page/PageArchiveTestBase.php
tests/phpunit/includes/page/WikiPageDbTestBase.php
tests/phpunit/includes/page/WikiPageMcrWriteBothDbTest.php
tests/phpunit/includes/page/WikiPageNoContentModelDbTest.php
tests/phpunit/includes/page/WikiPagePreMcrDbTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/includes/parser/ParserOutputTest.php
tests/phpunit/includes/poolcounter/PoolWorkArticleViewTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderOOUIImageModuleTest.php
tests/phpunit/includes/sparql/SparqlClientTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
tests/phpunit/includes/user/ExternalUserNamesTest.php
tests/phpunit/includes/user/LocalIdLookupTest.php
tests/phpunit/includes/user/UserGroupMembershipTest.php
tests/phpunit/includes/user/UserTest.php
tests/phpunit/includes/watcheditem/WatchedItemStoreUnitTest.php
tests/phpunit/mocks/session/DummySessionProvider.php
tests/phpunit/suites/ParserIntegrationTest.php
tests/phpunit/tests/MediaWikiTestCaseSchema1Test.php
tests/phpunit/tests/MediaWikiTestCaseTest.php

index d372db8..8c230bf 100644 (file)
@@ -189,8 +189,10 @@ because of Phabricator reports.
   Use the mediawiki.String module instead.
 * mw.language.specialCharacters, deprecated in 1.33, has been removed.
   Use require( 'mediawiki.language.specialCharacters' ) instead.
-* EditPage::submit(), deprecated in 1.29, has been removed. Used $this->edit()
+* EditPage::submit(), deprecated in 1.29, has been removed. Use $this->edit()
   directly.
+* HTMLForm::getErrors(), deprecated in 1.28, has been removed. Use
+  getErrorsOrWarnings() instead.
 * …
 
 === Deprecations in 1.34 ===
index a289aaf..77a2872 100644 (file)
@@ -113,6 +113,7 @@ $wgAutoloadLocalClasses = [
        'ApiQueryInfo' => __DIR__ . '/includes/api/ApiQueryInfo.php',
        'ApiQueryLangBacklinks' => __DIR__ . '/includes/api/ApiQueryLangBacklinks.php',
        'ApiQueryLangLinks' => __DIR__ . '/includes/api/ApiQueryLangLinks.php',
+       'ApiQueryLanguageinfo' => __DIR__ . '/includes/api/ApiQueryLanguageinfo.php',
        'ApiQueryLinks' => __DIR__ . '/includes/api/ApiQueryLinks.php',
        'ApiQueryLogEvents' => __DIR__ . '/includes/api/ApiQueryLogEvents.php',
        'ApiQueryMyStashedFiles' => __DIR__ . '/includes/api/ApiQueryMyStashedFiles.php',
@@ -257,6 +258,7 @@ $wgAutoloadLocalClasses = [
        'ChannelFeed' => __DIR__ . '/includes/changes/ChannelFeed.php',
        'CheckBadRedirects' => __DIR__ . '/maintenance/checkBadRedirects.php',
        'CheckComposerLockUpToDate' => __DIR__ . '/maintenance/checkComposerLockUpToDate.php',
+       'CheckDependencies' => __DIR__ . '/maintenance/checkDependencies.php',
        'CheckExtensionsCLI' => __DIR__ . '/maintenance/language/checkLanguage.inc',
        'CheckImages' => __DIR__ . '/maintenance/checkImages.php',
        'CheckLanguageCLI' => __DIR__ . '/maintenance/language/checkLanguage.inc',
index c4ed4e3..da24779 100644 (file)
@@ -75,7 +75,8 @@
                "wikimedia/avro": "1.8.0",
                "wikimedia/testing-access-wrapper": "~1.0",
                "wmde/hamcrest-html-matchers": "^0.1.0",
-               "mediawiki/mediawiki-phan-config": "0.6.0"
+               "mediawiki/mediawiki-phan-config": "0.6.0",
+               "symfony/yaml": "3.4.28"
        },
        "replace": {
                "symfony/polyfill-ctype": "1.99",
index eed732b..f08f5b7 100644 (file)
@@ -508,7 +508,7 @@ $wgImgAuthUrlPathMap = [];
  *                       equivalent to the corresponding member of $wgDBservers
  *   - tablePrefix       Table prefix, the foreign wiki's $wgDBprefix
  *   - hasSharedCache    Set to true if the foreign wiki's $wgMainCacheType is identical to,
- *                       and accesible from, this wiki.
+ *                       and accessible from, this wiki.
  *
  * ForeignAPIRepo:
  *   - apibase              Use for the foreign API's URL
@@ -554,7 +554,7 @@ $wgUseInstantCommons = false;
 /**
  * Shortcut for adding an entry to $wgForeignFileRepos.
  *
- * Uses the folowing variables:
+ * Uses the following variables:
  *
  * - directory: $wgSharedUploadDirectory.
  * - url: $wgSharedUploadPath.
@@ -2782,7 +2782,7 @@ $wgCdnMaxageLagged = 30;
  * If a purge for a URL reaches cdn2 before cdn1 and a request reaches cdn2 for that URL,
  * it will populate the response from the stale cdn1 value. When cdn1 gets the purge, cdn2
  * will still be stale. If the rebound purge delay is safely higher than the time to relay
- * a purge to all nodes, then the rebound puge will clear cdn2 after cdn1 was cleared.
+ * a purge to all nodes, then the rebound purge will clear cdn2 after cdn1 was cleared.
  *
  * @since 1.27
  */
@@ -3369,7 +3369,7 @@ $wgAllowUserCss = false;
  * Allow style-related user-preferences?
  *
  * This controls whether the `editfont` and `underline` preferences
- * are availabe to users.
+ * are available to users.
  */
 $wgAllowUserCssPrefs = true;
 
@@ -8862,7 +8862,7 @@ $wgRawHtmlMessages = [
  * that uses it, MediaWiki can broadcast events to all subscribers. Certain features like WAN
  * cache purging and CDN cache purging will emit events to this system. Appropriate listers can
  * subscribe to the channel and take actions based on the events. For example, a local daemon
- * can run on each CDN cache node and perfom local purges based on the URL purge channel events.
+ * can run on each CDN cache node and perform local purges based on the URL purge channel events.
  *
  * Some extensions may want to use "channel categories" so that different channels can also share
  * the same custom relayer instance (e.g. when it's likely to be overriden). They can use
index e9e780d..102510e 100644 (file)
@@ -66,7 +66,7 @@ class GitInfo {
                $this->repoDir = $repoDir;
                $this->cacheFile = self::getCacheFilePath( $repoDir );
                wfDebugLog( 'gitinfo',
-                       "Computed cacheFile={$this->cacheFile} for {$repoDir}"
+                       "Candidate cacheFile={$this->cacheFile} for {$repoDir}"
                );
                if ( $usePrecomputed &&
                        $this->cacheFile !== null &&
index 3f50c97..ae50c66 100644 (file)
@@ -894,7 +894,7 @@ class Linker {
         * @since 1.16.3. $altUserName was added in 1.19.
         */
        public static function userLink( $userId, $userName, $altUserName = false ) {
-               if ( $userName === '' ) {
+               if ( $userName === '' || $userName === false || $userName === null ) {
                        wfDebug( __METHOD__ . ' received an empty username. Are there database errors ' .
                                'that need to be fixed?' );
                        return wfMessage( 'empty-username' )->parse();
@@ -1237,18 +1237,17 @@ class Linker {
                                                // that starts with "#". Before PHP 7 (and still on HHVM) substr() would
                                                // return false if the start offset is the end of the string.
                                                // On PHP 7+, it gracefully returns empty string instead.
-                                               if ( $section === false ) {
-                                                       $section = '';
-                                               }
-                                               if ( $local ) {
-                                                       $sectionTitle = new TitleValue( NS_MAIN, '', $section );
-                                               } else {
-                                                       $sectionTitle = $title->createFragmentTarget( $section );
-                                               }
-                                               if ( $sectionTitle ) {
+                                               if ( $section !== '' && $section !== false ) {
+                                                       if ( $local ) {
+                                                               $sectionTitle = new TitleValue( NS_MAIN, '', $section );
+                                                       } else {
+                                                               $sectionTitle = $title->createFragmentTarget( $section );
+                                                       }
                                                        $auto = Linker::makeCommentLink(
-                                                               $sectionTitle, $wgLang->getArrow() . $wgLang->getDirMark() . $sectionText,
-                                                               $wikiId, 'noclasses'
+                                                               $sectionTitle,
+                                                               $wgLang->getArrow() . $wgLang->getDirMark() . $sectionText,
+                                                               $wikiId,
+                                                               'noclasses'
                                                        );
                                                }
                                        }
index eca5b9d..689477b 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 namespace MediaWiki;
 
 use ActorMigration;
index 0f68a13..e443803 100644 (file)
@@ -21,12 +21,12 @@ namespace MediaWiki\Permissions;
 
 use Action;
 use Exception;
+use FatalError;
 use Hooks;
 use MediaWiki\Linker\LinkTarget;
-use MediaWiki\Session\SessionManager;
 use MediaWiki\Special\SpecialPageFactory;
-use MediaWiki\User\UserIdentity;
 use MessageSpecifier;
+use MWException;
 use NamespaceInfo;
 use RequestContext;
 use SpecialPage;
@@ -69,121 +69,12 @@ class PermissionManager {
        /** @var NamespaceInfo */
        private $nsInfo;
 
-       /** @var string[][] Access rights for groups and users in these groups */
-       private $groupPermissions;
-
-       /** @var string[][] Permission keys revoked from users in each group */
-       private $revokePermissions;
-
-       /** @var string[] A list of available rights, in addition to the ones defined by the core */
-       private $availableRights;
-
-       /** @var string[] Cached results of getAllRights() */
-       private $allRights = false;
-
-       /** @var string[][] Cached user rights */
-       private $usersRights = null;
-
-       /** @var string[] Cached rights for isEveryoneAllowed */
-       private $cachedRights = [];
-
-       /**
-        * Array of Strings Core rights.
-        * Each of these should have a corresponding message of the form
-        * "right-$right".
-        * @showinitializer
-        */
-       private $coreRights = [
-               'apihighlimits',
-               'applychangetags',
-               'autoconfirmed',
-               'autocreateaccount',
-               'autopatrol',
-               'bigdelete',
-               'block',
-               'blockemail',
-               'bot',
-               'browsearchive',
-               'changetags',
-               'createaccount',
-               'createpage',
-               'createtalk',
-               'delete',
-               'deletechangetags',
-               'deletedhistory',
-               'deletedtext',
-               'deletelogentry',
-               'deleterevision',
-               'edit',
-               'editcontentmodel',
-               'editinterface',
-               'editprotected',
-               'editmyoptions',
-               'editmyprivateinfo',
-               'editmyusercss',
-               'editmyuserjson',
-               'editmyuserjs',
-               'editmywatchlist',
-               'editsemiprotected',
-               'editsitecss',
-               'editsitejson',
-               'editsitejs',
-               'editusercss',
-               'edituserjson',
-               'edituserjs',
-               'hideuser',
-               'import',
-               'importupload',
-               'ipblock-exempt',
-               'managechangetags',
-               'markbotedits',
-               'mergehistory',
-               'minoredit',
-               'move',
-               'movefile',
-               'move-categorypages',
-               'move-rootuserpages',
-               'move-subpages',
-               'nominornewtalk',
-               'noratelimit',
-               'override-export-depth',
-               'pagelang',
-               'patrol',
-               'patrolmarks',
-               'protect',
-               'purge',
-               'read',
-               'reupload',
-               'reupload-own',
-               'reupload-shared',
-               'rollback',
-               'sendemail',
-               'siteadmin',
-               'suppressionlog',
-               'suppressredirect',
-               'suppressrevision',
-               'unblockself',
-               'undelete',
-               'unwatchedpages',
-               'upload',
-               'upload_by_url',
-               'userrights',
-               'userrights-interwiki',
-               'viewmyprivateinfo',
-               'viewmywatchlist',
-               'viewsuppressed',
-               'writeapi',
-       ];
-
        /**
         * @param SpecialPageFactory $specialPageFactory
         * @param string[] $whitelistRead
         * @param string[] $whitelistReadRegexp
         * @param bool $emailConfirmToEdit
         * @param bool $blockDisablesLogin
-        * @param string[][] $groupPermissions
-        * @param string[][] $revokePermissions
-        * @param string[] $availableRights
         * @param NamespaceInfo $nsInfo
         */
        public function __construct(
@@ -192,9 +83,6 @@ class PermissionManager {
                $whitelistReadRegexp,
                $emailConfirmToEdit,
                $blockDisablesLogin,
-               $groupPermissions,
-               $revokePermissions,
-               $availableRights,
                NamespaceInfo $nsInfo
        ) {
                $this->specialPageFactory = $specialPageFactory;
@@ -202,9 +90,6 @@ class PermissionManager {
                $this->whitelistReadRegexp = $whitelistReadRegexp;
                $this->emailConfirmToEdit = $emailConfirmToEdit;
                $this->blockDisablesLogin = $blockDisablesLogin;
-               $this->groupPermissions = $groupPermissions;
-               $this->revokePermissions = $revokePermissions;
-               $this->availableRights = $availableRights;
                $this->nsInfo = $nsInfo;
        }
 
@@ -226,6 +111,7 @@ class PermissionManager {
         *   - RIGOR_SECURE : does cheap and expensive checks, using the master as needed
         *
         * @return bool
+        * @throws Exception
         */
        public function userCan( $action, User $user, LinkTarget $page, $rigor = self::RIGOR_SECURE ) {
                return !count( $this->getPermissionErrorsInternal( $action, $user, $page, $rigor, true ) );
@@ -247,6 +133,7 @@ class PermissionManager {
         *   whose corresponding errors may be ignored.
         *
         * @return array Array of arrays of the arguments to wfMessage to explain permissions problems.
+        * @throws Exception
         */
        public function getPermissionErrors(
                $action,
@@ -280,6 +167,8 @@ class PermissionManager {
         * @param bool $fromReplica Whether to check the replica DB instead of the master
         *
         * @return bool
+        * @throws FatalError
+        * @throws MWException
         */
        public function isBlockedFrom( User $user, LinkTarget $page, $fromReplica = false ) {
                $blocked = $user->isHidden();
@@ -397,6 +286,8 @@ class PermissionManager {
         * @param LinkTarget $page
         *
         * @return array List of errors
+        * @throws FatalError
+        * @throws MWException
         */
        private function checkPermissionHooks(
                $action,
@@ -472,6 +363,8 @@ class PermissionManager {
         * @param LinkTarget $page
         *
         * @return array List of errors
+        * @throws FatalError
+        * @throws MWException
         */
        private function checkReadPermissions(
                $action,
@@ -604,6 +497,7 @@ class PermissionManager {
         * @param LinkTarget $page
         *
         * @return array List of errors
+        * @throws MWException
         */
        private function checkUserBlock(
                $action,
@@ -689,6 +583,8 @@ class PermissionManager {
         * @param LinkTarget $page
         *
         * @return array List of errors
+        * @throws FatalError
+        * @throws MWException
         */
        private function checkQuickPermissions(
                $action,
@@ -866,7 +762,6 @@ class PermissionManager {
                                        }
                                        if ( $right != '' && !$user->isAllowedAll( 'protect', $right ) ) {
                                                $wikiPages = '';
-                                               /** @var Title $wikiPage */
                                                foreach ( $cascadingSources as $wikiPage ) {
                                                        $wikiPages .= '* [[:' . $wikiPage->getPrefixedText() . "]]\n";
                                                }
@@ -894,6 +789,7 @@ class PermissionManager {
         * @param LinkTarget $page
         *
         * @return array List of errors
+        * @throws Exception
         */
        private function checkActionPermissions(
                $action,
@@ -1156,256 +1052,4 @@ class PermissionManager {
                return $errors;
        }
 
-       /**
-        * Testing a permission
-        *
-        * @since 1.34
-        *
-        * @param UserIdentity $user
-        * @param string $action
-        *
-        * @return bool
-        */
-       public function userHasRight( UserIdentity $user, $action = '' ) {
-               if ( $action === '' ) {
-                       return true; // In the spirit of DWIM
-               }
-               // Use strict parameter to avoid matching numeric 0 accidentally inserted
-               // by misconfiguration: 0 == 'foo'
-               return in_array( $action, $this->getUserPermissions( $user ), true );
-       }
-
-       /**
-        * Get the permissions this user has.
-        *
-        * @since 1.34
-        *
-        * @param UserIdentity $user
-        *
-        * @return string[] permission names
-        */
-       public function getUserPermissions( UserIdentity $user ) {
-               $user = User::newFromIdentity( $user );
-               if ( !isset( $this->usersRights[ $user->getId() ] ) ) {
-                       $this->usersRights[ $user->getId() ] = $this->getGroupPermissions(
-                               $user->getEffectiveGroups()
-                       );
-                       Hooks::run( 'UserGetRights', [ $user, &$this->usersRights[ $user->getId() ] ] );
-
-                       // Deny any rights denied by the user's session, unless this
-                       // endpoint has no sessions.
-                       if ( !defined( 'MW_NO_SESSION' ) ) {
-                               // FIXME: $user->getRequest().. need to be replaced with something else
-                               $allowedRights = $user->getRequest()->getSession()->getAllowedUserRights();
-                               if ( $allowedRights !== null ) {
-                                       $this->usersRights[ $user->getId() ] = array_intersect(
-                                               $this->usersRights[ $user->getId() ],
-                                               $allowedRights
-                                       );
-                               }
-                       }
-
-                       Hooks::run( 'UserGetRightsRemove', [ $user, &$this->usersRights[ $user->getId() ] ] );
-                       // Force reindexation of rights when a hook has unset one of them
-                       $this->usersRights[ $user->getId() ] = array_values(
-                               array_unique( $this->usersRights[ $user->getId() ] )
-                       );
-
-                       if (
-                               $user->isLoggedIn() &&
-                               $this->blockDisablesLogin &&
-                               $user->getBlock()
-                       ) {
-                               $anon = new User;
-                               $this->usersRights[ $user->getId() ] = array_intersect(
-                                       $this->usersRights[ $user->getId() ],
-                                       $this->getUserPermissions( $anon )
-                               );
-                       }
-               }
-               return $this->usersRights[ $user->getId() ];
-       }
-
-       /**
-        * Clears users permissions cache, if specific user is provided it tries to clear
-        * permissions cache only for provided user.
-        *
-        * @since 1.34
-        *
-        * @param User|null $user
-        */
-       public function invalidateUsersRightsCache( $user = null ) {
-               if ( $user !== null ) {
-                       if ( isset( $this->usersRights[ $user->getId() ] ) ) {
-                               unset( $this->usersRights[$user->getId()] );
-                       }
-               } else {
-                       $this->usersRights = null;
-               }
-       }
-
-       /**
-        * Check, if the given group has the given permission
-        *
-        * If you're wanting to check whether all users have a permission, use
-        * PermissionManager::isEveryoneAllowed() instead. That properly checks if it's revoked
-        * from anyone.
-        *
-        * @since 1.34
-        *
-        * @param string $group Group to check
-        * @param string $role Role to check
-        *
-        * @return bool
-        */
-       public function groupHasPermission( $group, $role ) {
-               return isset( $this->groupPermissions[$group][$role] ) &&
-                          $this->groupPermissions[$group][$role] &&
-                          !( isset( $this->revokePermissions[$group][$role] ) &&
-                                 $this->revokePermissions[$group][$role] );
-       }
-
-       /**
-        * Get the permissions associated with a given list of groups
-        *
-        * @since 1.34
-        *
-        * @param array $groups Array of Strings List of internal group names
-        * @return array Array of Strings List of permission key names for given groups combined
-        */
-       public function getGroupPermissions( $groups ) {
-               $rights = [];
-               // grant every granted permission first
-               foreach ( $groups as $group ) {
-                       if ( isset( $this->groupPermissions[$group] ) ) {
-                               $rights = array_merge( $rights,
-                                       // array_filter removes empty items
-                                       array_keys( array_filter( $this->groupPermissions[$group] ) ) );
-                       }
-               }
-               // now revoke the revoked permissions
-               foreach ( $groups as $group ) {
-                       if ( isset( $this->revokePermissions[$group] ) ) {
-                               $rights = array_diff( $rights,
-                                       array_keys( array_filter( $this->revokePermissions[$group] ) ) );
-                       }
-               }
-               return array_unique( $rights );
-       }
-
-       /**
-        * Get all the groups who have a given permission
-        *
-        * @since 1.34
-        *
-        * @param string $role Role to check
-        * @return array Array of Strings List of internal group names with the given permission
-        */
-       public function getGroupsWithPermission( $role ) {
-               $allowedGroups = [];
-               foreach ( array_keys( $this->groupPermissions ) as $group ) {
-                       if ( $this->groupHasPermission( $group, $role ) ) {
-                               $allowedGroups[] = $group;
-                       }
-               }
-               return $allowedGroups;
-       }
-
-       /**
-        * Check if all users may be assumed to have the given permission
-        *
-        * We generally assume so if the right is granted to '*' and isn't revoked
-        * on any group. It doesn't attempt to take grants or other extension
-        * limitations on rights into account in the general case, though, as that
-        * would require it to always return false and defeat the purpose.
-        * Specifically, session-based rights restrictions (such as OAuth or bot
-        * passwords) are applied based on the current session.
-        *
-        * @param string $right Right to check
-        *
-        * @return bool
-        * @since 1.34
-        */
-       public function isEveryoneAllowed( $right ) {
-               // Use the cached results, except in unit tests which rely on
-               // being able change the permission mid-request
-               if ( isset( $this->cachedRights[$right] ) ) {
-                       return $this->cachedRights[$right];
-               }
-
-               if ( !isset( $this->groupPermissions['*'][$right] )
-                        || !$this->groupPermissions['*'][$right] ) {
-                       $this->cachedRights[$right] = false;
-                       return false;
-               }
-
-               // If it's revoked anywhere, then everyone doesn't have it
-               foreach ( $this->revokePermissions as $rights ) {
-                       if ( isset( $rights[$right] ) && $rights[$right] ) {
-                               $this->cachedRights[$right] = false;
-                               return false;
-                       }
-               }
-
-               // Remove any rights that aren't allowed to the global-session user,
-               // unless there are no sessions for this endpoint.
-               if ( !defined( 'MW_NO_SESSION' ) ) {
-
-                       // XXX: think what could be done with the below
-                       $allowedRights = SessionManager::getGlobalSession()->getAllowedUserRights();
-                       if ( $allowedRights !== null && !in_array( $right, $allowedRights, true ) ) {
-                               $this->cachedRights[$right] = false;
-                               return false;
-                       }
-               }
-
-               // Allow extensions to say false
-               if ( !Hooks::run( 'UserIsEveryoneAllowed', [ $right ] ) ) {
-                       $this->cachedRights[$right] = false;
-                       return false;
-               }
-
-               $this->cachedRights[$right] = true;
-               return true;
-       }
-
-       /**
-        * Get a list of all available permissions.
-        *
-        * @since 1.34
-        *
-        * @return string[] Array of permission names
-        */
-       public function getAllPermissions() {
-               if ( $this->allRights === false ) {
-                       if ( count( $this->availableRights ) ) {
-                               $this->allRights = array_unique( array_merge(
-                                       $this->coreRights,
-                                       $this->availableRights
-                               ) );
-                       } else {
-                               $this->allRights = $this->coreRights;
-                       }
-                       Hooks::run( 'UserGetAllRights', [ &$this->allRights ] );
-               }
-               return $this->allRights;
-       }
-
-       /**
-        * Overrides user permissions cache
-        *
-        * @since 1.34
-        *
-        * @param User $user
-        * @param string[]|string $rights
-        *
-        * @throws Exception
-        */
-       public function overrideUserRightsForTesting( $user, $rights = [] ) {
-               if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
-                       throw new Exception( __METHOD__ . ' can not be called outside of tests' );
-               }
-               $this->usersRights[ $user->getId() ] = is_array( $rights ) ? $rights : [ $rights ];
-       }
-
 }
index 75c7435..c5764d2 100644 (file)
@@ -463,9 +463,6 @@ return [
                        $config->get( 'WhitelistReadRegexp' ),
                        $config->get( 'EmailConfirmToEdit' ),
                        $config->get( 'BlockDisablesLogin' ),
-                       $config->get( 'GroupPermissions' ),
-                       $config->get( 'RevokePermissions' ),
-                       $config->get( 'AvailableRights' ),
                        $services->getNamespaceInfo()
                );
        },
index ff5541d..53fe615 100644 (file)
@@ -48,6 +48,7 @@ use MediaWiki\Revision\SlotRoleRegistry;
 use MediaWiki\Revision\SlotRecord;
 use MediaWiki\User\UserIdentity;
 use MessageCache;
+use MWCallableUpdate;
 use ParserCache;
 use ParserOptions;
 use ParserOutput;
@@ -1423,12 +1424,18 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                }
 
                // Defer the getCannonicalParserOutput() call triggered by getSecondaryDataUpdates()
-               DeferredUpdates::addCallableUpdate( function () {
-                       $this->doSecondaryDataUpdates( [
-                               // T52785 do not update any other pages on a null edit
-                               'recursive' => $this->options['changed']
-                       ] );
-               } );
+               // by wrapping the code that schedules the secondary updates in a callback itself
+               $wrapperUpdate = new MWCallableUpdate(
+                       function () {
+                               $this->doSecondaryDataUpdates( [
+                                       // T52785 do not update any other pages on a null edit
+                                       'recursive' => $this->options['changed']
+                               ] );
+                       },
+                       __METHOD__
+               );
+               $wrapperUpdate->setTransactionRoundRequirement( $wrapperUpdate::TRX_ROUND_ABSENT );
+               DeferredUpdates::addUpdate( $wrapperUpdate );
 
                // TODO: MCR: check if *any* changed slot supports categories!
                if ( $this->rcWatchCategoryMembership
@@ -1569,24 +1576,15 @@ class DerivedPageDataUpdater implements IDBAccessObject {
         *     current page or otherwise depend on it (default: false)
         *   - defer: one of the DeferredUpdates constants, or false to run immediately after waiting
         *     for replication of the changes from the SecondaryDataUpdates hooks (default: false)
-        *   - transactionTicket: a transaction ticket from LBFactory::getEmptyTransactionTicket(),
-        *     only when defer is false (default: null)
         * @since 1.32
         */
        public function doSecondaryDataUpdates( array $options = [] ) {
                $this->assertHasRevision( __METHOD__ );
-               $options += [
-                       'recursive' => false,
-                       'defer' => false,
-                       'transactionTicket' => null,
-               ];
+               $options += [ 'recursive' => false, 'defer' => false ];
                $deferValues = [ false, DeferredUpdates::PRESEND, DeferredUpdates::POSTSEND ];
                if ( !in_array( $options['defer'], $deferValues, true ) ) {
                        throw new InvalidArgumentException( 'Invalid value for defer: ' . $options['defer'] );
                }
-               Assert::parameterType(
-                       'integer|null', $options['transactionTicket'], '$options[\'transactionTicket\']' );
-
                $updates = $this->getSecondaryDataUpdates( $options['recursive'] );
 
                $triggeringUser = $this->options['triggeringUser'] ?? $this->user;
@@ -1596,14 +1594,6 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                $causeAction = $this->options['causeAction'] ?? 'unknown';
                $causeAgent = $this->options['causeAgent'] ?? 'unknown';
                $legacyRevision = new Revision( $this->revision );
-               $ticket = $options['transactionTicket'];
-
-               if ( $options['defer'] === false && $ticket !== null ) {
-                       // For legacy hook handlers doing updates via LinksUpdateConstructed, make sure
-                       // any pending writes they made get flushed before the doUpdate() calls below.
-                       // This avoids snapshot-clearing errors in LinksUpdate::acquirePageLock().
-                       $this->loadbalancerFactory->commitAndWaitForReplication( __METHOD__, $ticket );
-               }
 
                foreach ( $updates as $update ) {
                        if ( $update instanceof DataUpdate ) {
@@ -1613,13 +1603,16 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                                $update->setRevision( $legacyRevision );
                                $update->setTriggeringUser( $triggeringUser );
                        }
+               }
 
-                       if ( $options['defer'] === false ) {
-                               if ( $update instanceof DataUpdate && $ticket !== null ) {
-                                       $update->setTransactionTicket( $ticket );
-                               }
-                               $update->doUpdate();
-                       } else {
+               if ( $options['defer'] === false ) {
+                       // T221577: flush any transaction; each update needs outer transaction scope
+                       $this->loadbalancerFactory->commitMasterChanges( __METHOD__ );
+                       foreach ( $updates as $update ) {
+                               DeferredUpdates::attemptUpdate( $update, $this->loadbalancerFactory );
+                       }
+               } else {
+                       foreach ( $updates as $update ) {
                                DeferredUpdates::addUpdate( $update, $options['defer'] );
                        }
                }
index fd856be..4e60926 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 use MediaWiki\MediaWikiServices;
 
 /**
index a1eabe5..f696985 100644 (file)
@@ -42,18 +42,6 @@ abstract class TitleArray implements Iterator {
                if ( !Hooks::run( 'TitleArrayFromResult', [ &$array, $res ] ) ) {
                        return null;
                }
-               if ( $array === null ) {
-                       $array = self::newFromResult_internal( $res );
-               }
-               return $array;
-       }
-
-       /**
-        * @param IResultWrapper $res
-        * @return TitleArrayFromResult
-        */
-       protected static function newFromResult_internal( $res ) {
-               $array = new TitleArrayFromResult( $res );
-               return $array;
+               return $array ?? new TitleArrayFromResult( $res );
        }
 }
index bfba59a..ab95b97 100644 (file)
@@ -103,6 +103,9 @@ class InfoAction extends FormlessAction {
                        }
                }
 
+               // "Help" button
+               $this->addHelpLink( 'Page information' );
+
                // Page header
                if ( !$this->msg( 'pageinfo-header' )->isDisabled() ) {
                        $content .= $this->msg( 'pageinfo-header' )->parse();
index dd1a6db..5687f0f 100644 (file)
@@ -22,7 +22,9 @@
 
 use MediaWiki\Block\AbstractBlock;
 use MediaWiki\Block\DatabaseBlock;
+use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Permissions\PermissionManager;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -698,6 +700,16 @@ abstract class ApiBase extends ContextSource {
                $this->getMain()->setContinuationManager( $manager );
        }
 
+       /**
+        * Obtain a PermissionManager instance that subclasses may use in their authorization checks.
+        *
+        * @since 1.34
+        * @return PermissionManager
+        */
+       protected function getPermissionManager(): PermissionManager {
+               return MediaWikiServices::getInstance()->getPermissionManager();
+       }
+
        /**@}*/
 
        /************************************************************************//**
@@ -2120,17 +2132,19 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Helper function for permission-denied errors
-        * @since 1.29
-        * @since 1.33 Changed the third parameter from $user to $options.
-        * @param Title $title
+        *
+        * @param LinkTarget $linkTarget
         * @param string|string[] $actions
         * @param array $options Additional options
         *   - user: (User) User to use rather than $this->getUser()
         *   - autoblock: (bool, default false) Whether to spread autoblocks
         *  For compatibility, passing a User object is treated as the value for the 'user' option.
         * @throws ApiUsageException if the user doesn't have all of the rights.
+        *
+        * @since 1.29
+        * @since 1.33 Changed the third parameter from $user to $options.
         */
-       public function checkTitleUserPermissions( Title $title, $actions, $options = [] ) {
+       public function checkTitleUserPermissions( LinkTarget $linkTarget, $actions, $options = [] ) {
                if ( !is_array( $options ) ) {
                        wfDeprecated( '$user as the third parameter to ' . __METHOD__, '1.33' );
                        $options = [ 'user' => $options ];
@@ -2139,7 +2153,10 @@ abstract class ApiBase extends ContextSource {
 
                $errors = [];
                foreach ( (array)$actions as $action ) {
-                       $errors = array_merge( $errors, $title->getUserPermissionsErrors( $action, $user ) );
+                       $errors = array_merge(
+                               $errors,
+                               $this->getPermissionManager()->getPermissionErrors( $action, $user, $linkTarget )
+                       );
                }
 
                if ( $errors ) {
index ed3b7b8..08be8e0 100644 (file)
@@ -138,7 +138,9 @@ class ApiFeedContributions extends ApiBase {
 
                // Hook completed and did not return a valid feed item
                $title = Title::makeTitle( (int)$row->page_namespace, $row->page_title );
-               if ( $title && $title->userCan( 'read', $this->getUser() ) ) {
+               $user = $this->getUser();
+
+               if ( $title && $this->getPermissionManager()->userCan( 'read', $user, $title ) ) {
                        $date = $row->rev_timestamp;
                        $comments = $title->getTalkPage()->getFullURL();
                        $revision = $this->revisionStore->newRevisionFromRow( $row );
index bff9fd0..17a9d73 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This is the abstract base class for API formatters.
  *
@@ -73,7 +75,7 @@ abstract class ApiFormatBase extends ApiBase {
                } elseif ( $this->getIsHtml() ) {
                        return 'api-result.html';
                } else {
-                       $exts = MediaWiki\MediaWikiServices::getInstance()->getMimeAnalyzer()
+                       $exts = MediaWikiServices::getInstance()->getMimeAnalyzer()
                                ->getExtensionsForType( $this->getMimeType() );
                        $ext = $exts ? strtok( $exts, ' ' ) : strtolower( $this->mFormat );
                        return "api-result.$ext";
@@ -245,7 +247,8 @@ abstract class ApiFormatBase extends ApiBase {
                        $result = $this->getBuffer();
 
                        $context = new DerivativeContext( $this->getMain() );
-                       $context->setSkin( SkinFactory::getDefaultInstance()->makeSkin( 'apioutput' ) );
+                       $skinFactory = MediaWikiServices::getInstance()->getSkinFactory();
+                       $context->setSkin( $skinFactory->makeSkin( 'apioutput' ) );
                        $context->setTitle( SpecialPage::getTitleFor( 'ApiHelp' ) );
                        $out = new OutputPage( $context );
                        $context->setOutput( $out );
index 78efe41..cc96f90 100644 (file)
@@ -40,7 +40,8 @@ class ApiHelp extends ApiBase {
 
                // Get the help
                $context = new DerivativeContext( $this->getMain()->getContext() );
-               $context->setSkin( SkinFactory::getDefaultInstance()->makeSkin( 'apioutput' ) );
+               $skinFactory = MediaWikiServices::getInstance()->getSkinFactory();
+               $context->setSkin( $skinFactory->makeSkin( 'apioutput' ) );
                $context->setLanguage( $this->getMain()->getLanguage() );
                $context->setTitle( SpecialPage::getTitleFor( 'ApiHelp' ) );
                $out = new OutputPage( $context );
index ae6b1a1..eeb0cf7 100644 (file)
@@ -115,6 +115,7 @@ class ApiQuery extends ApiBase {
                'userinfo' => ApiQueryUserInfo::class,
                'filerepoinfo' => ApiQueryFileRepoInfo::class,
                'tokens' => ApiQueryTokens::class,
+               'languageinfo' => ApiQueryLanguageinfo::class,
        ];
 
        /**
@@ -429,10 +430,9 @@ class ApiQuery extends ApiBase {
                $exportTitles = [];
                $titles = $pageSet->getGoodTitles();
                if ( count( $titles ) ) {
-                       $user = $this->getUser();
                        /** @var Title $title */
                        foreach ( $titles as $title ) {
-                               if ( $title->userCan( 'read', $user ) ) {
+                               if ( $this->getPermissionManager()->userCan( 'read', $this->getUser(), $title ) ) {
                                        $exportTitles[] = $title;
                                }
                        }
index 276aafb..90f1340 100644 (file)
@@ -409,6 +409,8 @@ class ApiQueryInfo extends ApiQueryBase {
                $pageInfo['pagelanguagehtmlcode'] = $pageLanguage->getHtmlCode();
                $pageInfo['pagelanguagedir'] = $pageLanguage->getDir();
 
+               $user = $this->getUser();
+
                if ( $titleExists ) {
                        $pageInfo['touched'] = wfTimestamp( TS_ISO_8601, $this->pageTouched[$pageid] );
                        $pageInfo['lastrevid'] = (int)$this->pageLatest[$pageid];
@@ -493,7 +495,9 @@ class ApiQueryInfo extends ApiQueryBase {
                        $pageInfo['canonicalurl'] = wfExpandUrl( $title->getFullURL(), PROTO_CANONICAL );
                }
                if ( $this->fld_readable ) {
-                       $pageInfo['readable'] = $title->userCan( 'read', $this->getUser() );
+                       $pageInfo['readable'] = $this->getPermissionManager()->userCan(
+                               'read', $user, $title
+                       );
                }
 
                if ( $this->fld_preload ) {
@@ -539,10 +543,14 @@ class ApiQueryInfo extends ApiQueryBase {
                                $this->countTestedActions++;
 
                                if ( $detailLevel === 'boolean' ) {
-                                       $pageInfo['actions'][$action] = $title->userCan( $action, $user );
+                                       $pageInfo['actions'][$action] = $this->getPermissionManager()->userCan(
+                                               $action, $user, $title
+                                       );
                                } else {
                                        $pageInfo['actions'][$action] = $errorFormatter->arrayFromStatus( $this->errorArrayToStatus(
-                                               $title->getUserPermissionsErrors( $action, $user, $rigor ),
+                                               $this->getPermissionManager()->getPermissionErrors(
+                                                       $action, $user, $title, $rigor
+                                               ),
                                                $user
                                        ) );
                                }
diff --git a/includes/api/ApiQueryLanguageinfo.php b/includes/api/ApiQueryLanguageinfo.php
new file mode 100644 (file)
index 0000000..72b59b0
--- /dev/null
@@ -0,0 +1,245 @@
+<?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
+ */
+
+/**
+ * API module to enumerate language information.
+ *
+ * @ingroup API
+ */
+class ApiQueryLanguageinfo extends ApiQueryBase {
+
+       /**
+        * The maximum time for {@link execute()};
+        * if execution takes longer than this, apply continuation.
+        *
+        * If the localization cache is used, this time is not expected to ever be
+        * exceeded; on the other hand, if it is not used, a typical request will
+        * not yield more than a handful of languages before the time is exceeded
+        * and continuation is applied, if one of the expensive props is requested.
+        *
+        * @var float
+        */
+       const MAX_EXECUTE_SECONDS = 2.0;
+
+       /** @var callable|null */
+       private $microtimeFunction;
+
+       /**
+        * @param ApiQuery $queryModule
+        * @param string $moduleName
+        * @param callable|null $microtimeFunction Function to use instead of microtime(), for testing.
+        * Should accept no arguments and return float seconds. (null means real microtime().)
+        */
+       public function __construct(
+               ApiQuery $queryModule,
+               $moduleName,
+               $microtimeFunction = null
+       ) {
+               parent::__construct( $queryModule, $moduleName, 'li' );
+               $this->microtimeFunction = $microtimeFunction;
+       }
+
+       /** @return float */
+       private function microtime() {
+               if ( $this->microtimeFunction ) {
+                       return ( $this->microtimeFunction )();
+               } else {
+                       return microtime( true );
+               }
+       }
+
+       public function execute() {
+               $endTime = $this->microtime() + self::MAX_EXECUTE_SECONDS;
+
+               $props = array_flip( $this->getParameter( 'prop' ) );
+               $includeCode = isset( $props['code'] );
+               $includeBcp47 = isset( $props['bcp47'] );
+               $includeDir = isset( $props['dir'] );
+               $includeAutonym = isset( $props['autonym'] );
+               $includeName = isset( $props['name'] );
+               $includeFallbacks = isset( $props['fallbacks'] );
+               $includeVariants = isset( $props['variants'] );
+
+               $targetLanguageCode = $this->getLanguage()->getCode();
+               $include = 'all';
+
+               $availableLanguageCodes = array_keys( Language::fetchLanguageNames(
+                       // MediaWiki and extensions may return different sets of language codes
+                       // when asked for language names in different languages;
+                       // asking for English language names is most likely to give us the full set,
+                       // even though we may not need those at all
+                       'en',
+                       $include
+               ) );
+               $selectedLanguageCodes = $this->getParameter( 'code' );
+               if ( $selectedLanguageCodes === [ '*' ] ) {
+                       $languageCodes = $availableLanguageCodes;
+               } else {
+                       $languageCodes = array_values( array_intersect(
+                               $availableLanguageCodes,
+                               $selectedLanguageCodes
+                       ) );
+                       $unrecognizedCodes = array_values( array_diff(
+                               $selectedLanguageCodes,
+                               $availableLanguageCodes
+                       ) );
+                       if ( $unrecognizedCodes !== [] ) {
+                               $this->addWarning( [
+                                       'apiwarn-unrecognizedvalues',
+                                       $this->encodeParamName( 'code' ),
+                                       Message::listParam( $unrecognizedCodes, 'comma' ),
+                                       count( $unrecognizedCodes ),
+                               ] );
+                       }
+               }
+               // order of $languageCodes is guaranteed by Language::fetchLanguageNames()
+               // and preserved by array_values() + array_intersect()
+
+               $continue = $this->getParameter( 'continue' );
+               if ( $continue === null ) {
+                       $continue = reset( $languageCodes );
+               }
+
+               $result = $this->getResult();
+               $rootPath = [
+                       $this->getQuery()->getModuleName(),
+                       $this->getModuleName(),
+               ];
+               $result->addArrayType( $rootPath, 'assoc' );
+
+               foreach ( $languageCodes as $languageCode ) {
+                       if ( $languageCode < $continue ) {
+                               continue;
+                       }
+
+                       $now = $this->microtime();
+                       if ( $now >= $endTime ) {
+                               $this->setContinueEnumParameter( 'continue', $languageCode );
+                               break;
+                       }
+
+                       $info = [];
+                       ApiResult::setArrayType( $info, 'assoc' );
+
+                       if ( $includeCode ) {
+                               $info['code'] = $languageCode;
+                       }
+
+                       if ( $includeBcp47 ) {
+                               $bcp47 = LanguageCode::bcp47( $languageCode );
+                               $info['bcp47'] = $bcp47;
+                       }
+
+                       if ( $includeDir ) {
+                               $dir = Language::factory( $languageCode )->getDir();
+                               $info['dir'] = $dir;
+                       }
+
+                       if ( $includeAutonym ) {
+                               $autonym = Language::fetchLanguageName(
+                                       $languageCode,
+                                       Language::AS_AUTONYMS,
+                                       $include
+                               );
+                               $info['autonym'] = $autonym;
+                       }
+
+                       if ( $includeName ) {
+                               $name = Language::fetchLanguageName(
+                                       $languageCode,
+                                       $targetLanguageCode,
+                                       $include
+                               );
+                               $info['name'] = $name;
+                       }
+
+                       if ( $includeFallbacks ) {
+                               $fallbacks = Language::getFallbacksFor(
+                                       $languageCode,
+                                       // allow users to distinguish between implicit and explicit 'en' fallbacks
+                                       Language::STRICT_FALLBACKS
+                               );
+                               ApiResult::setIndexedTagName( $fallbacks, 'fb' );
+                               $info['fallbacks'] = $fallbacks;
+                       }
+
+                       if ( $includeVariants ) {
+                               $variants = Language::factory( $languageCode )->getVariants();
+                               ApiResult::setIndexedTagName( $variants, 'var' );
+                               $info['variants'] = $variants;
+                       }
+
+                       $fit = $result->addValue( $rootPath, $languageCode, $info );
+                       if ( !$fit ) {
+                               $this->setContinueEnumParameter( 'continue', $languageCode );
+                               break;
+                       }
+               }
+       }
+
+       public function getCacheMode( $params ) {
+               return 'public';
+       }
+
+       public function getAllowedParams() {
+               return [
+                       'prop' => [
+                               self::PARAM_DFLT => 'code',
+                               self::PARAM_ISMULTI => true,
+                               self::PARAM_TYPE => [
+                                       'code',
+                                       'bcp47',
+                                       'dir',
+                                       'autonym',
+                                       'name',
+                                       'fallbacks',
+                                       'variants',
+                               ],
+                               self::PARAM_HELP_MSG_PER_VALUE => [],
+                       ],
+                       'code' => [
+                               self::PARAM_DFLT => '*',
+                               self::PARAM_ISMULTI => true,
+                       ],
+                       'continue' => [
+                               self::PARAM_HELP_MSG => 'api-help-param-continue',
+                       ],
+               ];
+       }
+
+       protected function getExamplesMessages() {
+               $pathUrl = 'action=' . $this->getQuery()->getModuleName() .
+                       '&meta=' . $this->getModuleName();
+               $pathMsg = $this->getModulePath();
+               $prefix = $this->getModulePrefix();
+
+               return [
+                       "$pathUrl"
+                               => "apihelp-$pathMsg-example-simple",
+                       "$pathUrl&{$prefix}prop=autonym|name&lang=de"
+                               => "apihelp-$pathMsg-example-autonym-name-de",
+                       "$pathUrl&{$prefix}prop=fallbacks|variants&{$prefix}code=oc"
+                               => "apihelp-$pathMsg-example-fallbacks-variants-oc",
+                       "$pathUrl&{$prefix}prop=bcp47|dir"
+                               => "apihelp-$pathMsg-example-bcp47-dir",
+               ];
+       }
+
+}
index ee6a264..fe3ae87 100644 (file)
@@ -201,11 +201,12 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
 
                if ( $resultPageSet === null && $this->fetchContent ) {
                        // For each page we will request, the user must have read rights for that page
-                       $user = $this->getUser();
                        $status = Status::newGood();
+                       $user = $this->getUser();
+
                        /** @var Title $title */
                        foreach ( $pageSet->getGoodTitles() as $title ) {
-                               if ( !$title->userCan( 'read', $user ) ) {
+                               if ( !$this->getPermissionManager()->userCan( 'read', $user, $title ) ) {
                                        $status->fatal( ApiMessage::create(
                                                [ 'apierror-cannotviewtitle', wfEscapeWikiText( $title->getPrefixedText() ) ],
                                                'accessdenied'
index 5f9b97c..ba9be81 100644 (file)
@@ -41,7 +41,7 @@ class ApiUndelete extends ApiBase {
                        $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] );
                }
 
-               if ( !$titleObj->userCan( 'undelete', $user, 'secure' ) ) {
+               if ( !$this->getPermissionManager()->userCan( 'undelete', $this->getUser(), $titleObj ) ) {
                        $this->dieWithError( 'permdenied-undelete' );
                }
 
index 70942f8..02abb1e 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 use MediaWiki\MediaWikiServices;
 
 /**
index 0701829..eadf3f7 100644 (file)
        "apihelp-query+langlinks-param-dir": "الاتجاه للإدراج فيه.",
        "apihelp-query+langlinks-param-inlanguagecode": "رمز اللغة لأسماء اللغة المترجمة.",
        "apihelp-query+langlinks-example-simple": "الحصول على وصلات بين اللغات تربط من الصفحة <kbd>Main Page</kbd>.",
+       "apihelp-query+languageinfo-summary": "عرض معلومات حول اللغات المتاحة.",
+       "apihelp-query+languageinfo-extended-description": "[[mw:API:Query#Continuing queries|الاستمرار]] يمكن تطبيقه إذا كان استرجاع المعلومات يستغرق وقتا طويلا لطلب واحد.",
+       "apihelp-query+languageinfo-param-prop": "أي المعلومات للحصول عليها لكل لغة.",
+       "apihelp-query+languageinfo-paramvalue-prop-code": "رمز اللغة. (هذا الرمز خاص بميدياويكي، على الرغم من وجود تداخل مع المعايير الأخرى.)",
+       "apihelp-query+languageinfo-paramvalue-prop-bcp47": "رمز لغة BCP-47.",
+       "apihelp-query+languageinfo-paramvalue-prop-dir": "اتجاه كتابة اللغة (إما <code>ltr</code> أو <code>rtl</code>).",
+       "apihelp-query+languageinfo-paramvalue-prop-autonym": "الاسم الداخلي للغة، أي: الاسم بتلك اللغة.",
+       "apihelp-query+languageinfo-paramvalue-prop-name": "اسم اللغة ياللغة المحددة بواسطة الوسيط <var>lilang</var>، مع تطبيق احتياطات اللغة إذا لزم الأمر.",
+       "apihelp-query+languageinfo-paramvalue-prop-fallbacks": "رموز لغة اللغات الاحتياطية التي تم تكوينها لهذه اللغة، لا يتم تضمين الإرجاع النهائي الضمني إلى \"en\" (ولكن قد ترجع بعض اللغات إلى \"en\" بشكل صريح).",
+       "apihelp-query+languageinfo-paramvalue-prop-variants": "رموز اللغات للمتغيرات التي تدعمها هذه اللغة.",
+       "apihelp-query+languageinfo-param-code": "رموز اللغات التي يجب إرجاعها، أو <code>*</code> لجميع اللغات.",
+       "apihelp-query+languageinfo-example-simple": "الحصول على رموز اللغات لجميع اللغات المدعومة.",
+       "apihelp-query+languageinfo-example-autonym-name-de": "احصل على المرادفات والأسماء الألمانية لجميع اللغات المدعومة.",
+       "apihelp-query+languageinfo-example-fallbacks-variants-oc": "الحصول على اللغات الاحتياطية ومتغيرات الأوكيتانية.",
+       "apihelp-query+languageinfo-example-bcp47-dir": "احصل على رمز لغة BCP-47 واتجاه جميع اللغات المدعومة.",
        "apihelp-query+links-summary": "يعرض جميع الروابط من الصفحات المحددة.",
        "apihelp-query+links-param-namespace": "إظهار الروابط في هذه النطاقات فقط.",
        "apihelp-query+links-param-limit": "كم عدد الوصلات للعودة.",
index 380627d..b0dd49a 100644 (file)
        "apihelp-query+langlinks-param-inlanguagecode": "Language code for localised language names.",
        "apihelp-query+langlinks-example-simple": "Get interlanguage links from the page <kbd>Main Page</kbd>.",
 
+       "apihelp-query+languageinfo-summary": "Return information about available languages.",
+       "apihelp-query+languageinfo-extended-description": "[[mw:API:Query#Continuing queries|Continuation]] may be applied if retrieving the information takes too long for one request.",
+       "apihelp-query+languageinfo-param-prop": "Which information to get for each language.",
+       "apihelp-query+languageinfo-paramvalue-prop-code": "The language code. (This code is MediaWiki-specific, though there are overlaps with other standards.)",
+       "apihelp-query+languageinfo-paramvalue-prop-bcp47": "The BCP-47 language code.",
+       "apihelp-query+languageinfo-paramvalue-prop-dir": "The writing direction of the language (either <code>ltr</code> or <code>rtl</code>).",
+       "apihelp-query+languageinfo-paramvalue-prop-autonym": "The autonym of the language, that is, the name in that language.",
+       "apihelp-query+languageinfo-paramvalue-prop-name": "The name of the language in the language specified by the <var>lilang</var> parameter, with language fallbacks applied if necessary.",
+       "apihelp-query+languageinfo-paramvalue-prop-fallbacks": "The language codes of the fallback languages configured for this language. The implicit final fallback to 'en' is not included (but some languages may fall back to 'en' explicitly).",
+       "apihelp-query+languageinfo-paramvalue-prop-variants": "The language codes of the variants supported by this language.",
+       "apihelp-query+languageinfo-param-code": "Language codes of the languages that should be returned, or <code>*</code> for all languages.",
+       "apihelp-query+languageinfo-example-simple": "Get the language codes of all supported languages.",
+       "apihelp-query+languageinfo-example-autonym-name-de": "Get the autonyms and German names of all supported languages.",
+       "apihelp-query+languageinfo-example-fallbacks-variants-oc": "Get the fallback languages and variants of Occitan.",
+       "apihelp-query+languageinfo-example-bcp47-dir": "Get the BCP-47 language code and direction of all supported languages.",
+
        "apihelp-query+links-summary": "Returns all links from the given pages.",
        "apihelp-query+links-param-namespace": "Show links in these namespaces only.",
        "apihelp-query+links-param-limit": "How many links to return.",
index 6a41057..acd1d78 100644 (file)
        "apihelp-query+langlinks-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+langlinks-param-inlanguagecode": "Code de langue pour les noms de langue localisés.",
        "apihelp-query+langlinks-example-simple": "Obtenir les liens interlangue de la page <kbd>Main Page</kbd>.",
+       "apihelp-query+languageinfo-summary": "Renvoyer des informations sur les langues disponibles.",
+       "apihelp-query+languageinfo-extended-description": "[[mw:API:Query#Continuing queries|Un prolongement]] peut être appliqué si la récupération de l’information prend trop de temps pour une requête.",
+       "apihelp-query+languageinfo-param-prop": "Quelle information obtenir pour chaque langue.",
+       "apihelp-query+languageinfo-paramvalue-prop-code": "Le code de langue (ce code est spécifique à MédiaWiki, bien qu’il y ait des recouvrements avec d’autres standards).",
+       "apihelp-query+languageinfo-paramvalue-prop-bcp47": "Le code de langue BCP-47.",
+       "apihelp-query+languageinfo-paramvalue-prop-dir": "La direction d’écriture de la langue (<code>ltr</code> ou <code>rtl</code>).",
+       "apihelp-query+languageinfo-paramvalue-prop-autonym": "L’autonyme d&une langue, c’est-à-dire son nom dans cette langue.",
+       "apihelp-query+languageinfo-paramvalue-prop-name": "Le nom de la langue dans la langue spécifiée par le paramètre <var>lilang</var>, avec application des langues de secours si besoin.",
+       "apihelp-query+languageinfo-paramvalue-prop-fallbacks": "Les codes de langue des langues de secours configurées pour cette langue. Le secours implicite final en 'en' n’est pas inclus (mais certaines langues peuvent avoir 'en' en secours explicitement).",
+       "apihelp-query+languageinfo-paramvalue-prop-variants": "Les codes de langue des variantes supportées par cette langue.",
+       "apihelp-query+languageinfo-param-code": "Codes de langue des langues qui doivent être renvoyées, ou <code>*</code> pour toutes les langues.",
+       "apihelp-query+languageinfo-example-simple": "Obtenir les codes de langue de toutes les langues supportées.",
+       "apihelp-query+languageinfo-example-autonym-name-de": "Obtenir les autonymes et les noms en allemand de toutes les langues supportées.",
+       "apihelp-query+languageinfo-example-fallbacks-variants-oc": "Obtenir les langues de secours et les variantes de l’occitan.",
+       "apihelp-query+languageinfo-example-bcp47-dir": "Obtenir le code de langue BCP-47 et la direction de toutes les langues supportées.",
        "apihelp-query+links-summary": "Renvoie tous les liens des pages fournies.",
        "apihelp-query+links-param-namespace": "Afficher les liens uniquement dans ces espaces de noms.",
        "apihelp-query+links-param-limit": "Combien de liens renvoyer.",
index d82dd84..6c83ca2 100644 (file)
        "apihelp-query+langlinks-paramvalue-prop-url": "Aggiunge l'URL completo.",
        "apihelp-query+langlinks-paramvalue-prop-autonym": "Aggiunge il nome nativo della lingua.",
        "apihelp-query+langlinks-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+languageinfo-paramvalue-prop-bcp47": "Il codice lingua BCP-47.",
        "apihelp-query+links-param-namespace": "Mostra collegamenti solo in questi namespace.",
        "apihelp-query+links-param-limit": "Quanti collegamenti restituire.",
        "apihelp-query+links-param-dir": "La direzione in cui elencare.",
index d1dcfe9..279c0c1 100644 (file)
        "apihelp-query+langlinks-param-dir": "{{doc-apihelp-param|query+langlinks|dir}}",
        "apihelp-query+langlinks-param-inlanguagecode": "{{doc-apihelp-param|query+langlinks|inlanguagecode}}",
        "apihelp-query+langlinks-example-simple": "{{doc-apihelp-example|query+langlinks}}",
+       "apihelp-query+languageinfo-summary": "{{doc-apihelp-summary|query+languageinfo}}",
+       "apihelp-query+languageinfo-extended-description": "{{doc-apihelp-extended-description|query+languageinfo}}",
+       "apihelp-query+languageinfo-param-prop": "{{doc-apihelp-param|query+languageinfo|prop|paramvalues=1}}",
+       "apihelp-query+languageinfo-paramvalue-prop-code": "{{doc-apihelp-paramvalue|query+languageinfo|prop|code}}",
+       "apihelp-query+languageinfo-paramvalue-prop-bcp47": "{{doc-apihelp-paramvalue|query+languageinfo|prop|bcp47}}",
+       "apihelp-query+languageinfo-paramvalue-prop-dir": "{{doc-apihelp-paramvalue|query+languageinfo|prop|dir}}",
+       "apihelp-query+languageinfo-paramvalue-prop-autonym": "{{doc-apihelp-paramvalue|query+languageinfo|prop|autonym}}",
+       "apihelp-query+languageinfo-paramvalue-prop-name": "{{doc-apihelp-paramvalue|query+languageinfo|prop|name}}",
+       "apihelp-query+languageinfo-paramvalue-prop-fallbacks": "{{doc-apihelp-paramvalue|query+languageinfo|prop|fallbacks}}",
+       "apihelp-query+languageinfo-paramvalue-prop-variants": "{{doc-apihelp-paramvalue|query+languageinfo|prop|variants}}",
+       "apihelp-query+languageinfo-param-code": "{{doc-apihelp-param|query+languageinfo|code}}",
+       "apihelp-query+languageinfo-example-simple": "{{doc-apihelp-example|query+languageinfo}}",
+       "apihelp-query+languageinfo-example-autonym-name-de": "{{doc-apihelp-example|query+languageinfo}}",
+       "apihelp-query+languageinfo-example-fallbacks-variants-oc": "{{doc-apihelp-example|query+languageinfo}}",
+       "apihelp-query+languageinfo-example-bcp47-dir": "{{doc-apihelp-example|query+languageinfo}}",
        "apihelp-query+links-summary": "{{doc-apihelp-summary|query+links}}",
        "apihelp-query+links-param-namespace": "{{doc-apihelp-param|query+links|namespace}}",
        "apihelp-query+links-param-limit": "{{doc-apihelp-param|query+links|limit}}",
index e29b98d..8dcabde 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 namespace MediaWiki\Logger;
 
 class ConsoleSpi implements Spi {
index 4b54378..f5d22c1 100644 (file)
@@ -184,8 +184,6 @@ class DeferredUpdates {
                $lbFactory = $services->getDBLoadBalancerFactory();
                $method = RequestContext::getMain()->getRequest()->getMethod();
 
-               $ticket = $lbFactory->getEmptyTransactionTicket( __METHOD__ );
-
                /** @var ErrorPageError $reportableError */
                $reportableError = null;
                /** @var DeferrableUpdate[] $updates Snapshot of queue */
@@ -199,7 +197,6 @@ class DeferredUpdates {
                        $updatesByType = [ 'data' => [], 'generic' => [] ];
                        foreach ( $updates as $du ) {
                                if ( $du instanceof DataUpdate ) {
-                                       $du->setTransactionTicket( $ticket );
                                        $updatesByType['data'][] = $du;
                                } else {
                                        $updatesByType['generic'][] = $du;
@@ -225,10 +222,6 @@ class DeferredUpdates {
                                                        $firstKey = key( self::$executeContext['subqueue'] );
                                                        unset( self::$executeContext['subqueue'][$firstKey] );
 
-                                                       if ( $subUpdate instanceof DataUpdate ) {
-                                                               $subUpdate->setTransactionTicket( $ticket );
-                                                       }
-
                                                        $guiError = self::handleUpdate( $subUpdate, $lbFactory, $mode, $stage );
                                                        $reportableError = $reportableError ?: $guiError;
                                                }
@@ -300,6 +293,10 @@ class DeferredUpdates {
         * @since 1.34
         */
        public static function attemptUpdate( DeferrableUpdate $update, ILBFactory $lbFactory ) {
+               if ( $update instanceof DataUpdate ) {
+                       $update->setTransactionTicket( $lbFactory->getEmptyTransactionTicket( __METHOD__ ) );
+               }
+
                if (
                        $update instanceof TransactionRoundAwareUpdate &&
                        $update->getTransactionRoundRequirement() == $update::TRX_ROUND_ABSENT
index efca406..707035c 100644 (file)
@@ -5,11 +5,15 @@ use Wikimedia\Rdbms\IDatabase;
 /**
  * Deferrable Update for closure/callback
  */
-class MWCallableUpdate implements DeferrableUpdate, DeferrableCallback {
-       /** @var callable|null */
+class MWCallableUpdate
+       implements DeferrableUpdate, DeferrableCallback, TransactionRoundAwareUpdate
+{
+       /** @var callable|null Callback, or null if it was cancelled */
        private $callback;
-       /** @var string */
+       /** @var string Calling method name */
        private $fname;
+       /** @var int One of the class TRX_ROUND_* constants */
+       private $trxRoundRequirement = self::TRX_ROUND_PRESENT;
 
        /**
         * @param callable $callback
@@ -48,4 +52,16 @@ class MWCallableUpdate implements DeferrableUpdate, DeferrableCallback {
        public function getOrigin() {
                return $this->fname;
        }
+
+       /**
+        * @since 1.34
+        * @param int $mode One of the class TRX_ROUND_* constants
+        */
+       public function setTransactionRoundRequirement( $mode ) {
+               $this->trxRoundRequirement = $mode;
+       }
+
+       public function getTransactionRoundRequirement() {
+               return $this->trxRoundRequirement;
+       }
 }
index ca63dfe..e8044af 100644 (file)
@@ -399,6 +399,7 @@ class WikiExporter {
                                $this->do_list_authors( $cond );
                        }
                        $join['revision'] = [ 'JOIN', 'page_id=rev_page AND page_latest=rev_id' ];
+                       $opts[ 'ORDER BY' ] = [ 'page_id ASC' ];
                } elseif ( $this->history & self::STABLE ) {
                        # "Stable" revision dumps...
                        # Default JOIN, to be overridden...
index 39153cf..d3fd374 100644 (file)
@@ -252,7 +252,8 @@ class XmlDumpWriter {
                if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_USER ) ) {
                        $out .= "      " . Xml::element( 'contributor', [ 'deleted' => 'deleted' ] ) . "\n";
                } else {
-                       $out .= $this->writeContributor( $row->rev_user, $row->rev_user_text );
+                       // empty values get written out as uid 0, see T224221
+                       $out .= $this->writeContributor( $row->rev_user ?: 0, $row->rev_user_text );
                }
 
                if ( isset( $row->rev_minor_edit ) && $row->rev_minor_edit ) {
index 3e11a48..51cef81 100644 (file)
@@ -1689,7 +1689,7 @@ class FileRepo {
        /**
         * Get a callback function to use for cleaning error message parameters
         *
-        * @return string[]
+        * @return callable
         */
        function getErrorCleanupFunction() {
                switch ( $this->pathDisclosureProtection ) {
index 5042028..d071478 100644 (file)
@@ -21,8 +21,6 @@
  * @file
  */
 
-use Wikimedia\ObjectFactory;
-
 /**
  * Object handling generic submission, CSRF protection, layout and
  * other logic for UI forms. in a reusable manner.
@@ -304,12 +302,11 @@ class HTMLForm extends ContextSource {
 
                switch ( $displayFormat ) {
                        case 'vform':
-                               return ObjectFactory::constructClassInstance( VFormHTMLForm::class, $arguments );
+                               return new VFormHTMLForm( ...$arguments );
                        case 'ooui':
-                               return ObjectFactory::constructClassInstance( OOUIHTMLForm::class, $arguments );
+                               return new OOUIHTMLForm( ...$arguments );
                        default:
-                               /** @var HTMLForm $form */
-                               $form = ObjectFactory::constructClassInstance( self::class, $arguments );
+                               $form = new self( ...$arguments );
                                $form->setDisplayFormat( $displayFormat );
                                return $form;
                }
@@ -1277,20 +1274,6 @@ class HTMLForm extends ContextSource {
                return $this->displaySection( $this->mFieldTree, $this->mTableId );
        }
 
-       /**
-        * Format and display an error message stack.
-        *
-        * @param string|array|Status $errors
-        *
-        * @deprecated since 1.28, use getErrorsOrWarnings() instead
-        *
-        * @return string
-        */
-       public function getErrors( $errors ) {
-               wfDeprecated( __METHOD__, '1.28' );
-               return $this->getErrorsOrWarnings( $errors, 'error' );
-       }
-
        /**
         * Returns a formatted list of errors or warnings from the given elements.
         *
index d04b0f2..d676a04 100644 (file)
@@ -61,7 +61,7 @@
        "config-unicode-pure-php-warning": "<strong>تحذير:</strong> لا يتوفر [https://pecl.php.net/intl امتداد intl PECL] للتعامل مع تطبيع يونيكود; حيث يتراجع لإبطاء تنفيذ Pure-Pure;\nإذا كنت تدير موقعا عالي الزيارات، فتجب عليك القراءة قليلا في [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations تطبيع يونيكود].",
        "config-unicode-update-warning": "<strong>تحذير:</strong> يستخدم الإصدار المثبت من برنامج تطبيع نظام يونيكود إصدارًا قديما من مكتبة [http://site.icu-project.org/ مشروع ICU];\nتجب عليك [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations الترقية] إذا كنت مهتما باستخدام يونيكود.",
        "config-no-db": "لا يمكن العثور على مشغل قاعدة بيانات مناسب! تحتاج إلى تثبيت مشغل قاعدة بيانات PHP، \n{{PLURAL:$2|نوع قاعدة البيانات التالي مدعوم|أنواع قاعدة البيانات التالية مدعومة}} البيانات التالية مدعومة: $1.\n\nإذا قمت بتجميع PHP بنفسك، فقم بتكوينها مع تمكين عميل قاعدة البيانات، على سبيل المثال، باستخدام <code>./configure --with-mysqli</code>.\nإذا قمت بتثبيت PHP من حزمة Debian أو Ubuntu، فستحتاج أيضا إلى تثبيت، على سبيل المثال، حزمة <code>php-mysql</code>.",
-       "config-outdated-sqlite": "<strong>تحذير:</strong> لديك SQLite $1, which وهو أقل من الحد الأدنى المطلوب للنسخة $2. SQLite سوف يكون غير متوفر.",
+       "config-outdated-sqlite": "<strong>تحذير:</strong> لديك SQLite $2، وهو أقل من الحد الأدنى المطلوب للنسخة $1، SQLite سوف يكون غير متوفر.",
        "config-no-fts3": "<strong>تحذير:</strong> يتم تجميع SQLite بدون [//sqlite.org/fts3.html FTS3 module]; ستكون ميزات البحث غير متوفرة في هذه الواجهة الخلفية.",
        "config-pcre-old": "<strong>فادح:</strong> مطلوب PCRE $1 أو أحدث،\nترتبط ثنائية PHP الخاصة بك بـPCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE مزيد من المعلومات].",
        "config-pcre-no-utf8": "<strong>فادح:</strong> يبدو أن وحدة PCRE في PHP يتم تجميعها بدون دعم PCRE_UTF8، \nيتطلب ميدياويكي دعم UTF-8 ليعمل بشكل صحيح.",
index 65743df..80e063e 100644 (file)
@@ -57,7 +57,7 @@
        "config-unicode-pure-php-warning": "'''Папярэджаньне''': [https://pecl.php.net/intl Пашырэньне intl з PECL] — ня слушнае для Unicode-нармалізацыі, цяпер выкарыстоўваецца марудная PHP-рэалізацыя.\nКалі ў Вас сайт з высокай наведвальнасьцю, раім пачытаць пра [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-нармалізацыю].",
        "config-unicode-update-warning": "'''Папярэджаньне''': усталяваная вэрсія бібліятэкі для Unicode-нармалізацыі выкарыстоўвае састарэлую вэрсію бібліятэкі з [http://site.icu-project.org/ праекту ICU].\nРаім [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations абнавіць], калі ваш сайт будзе працаваць з Unicode.",
        "config-no-db": "Немагчыма знайсьці адпаведны драйвэр базы зьвестак. Вам неабходна ўсталяваць драйвэр базы зьвестак для PHP.\n{{PLURAL:$2|Падтрымліваецца наступны тып базы|Падтрымліваюцца наступныя тыпы базаў}} зьвестак: $1.\n\nКалі вы скампілявалі PHP самастойна, зьмяніце канфігурацыю, каб уключыць кліента базы зьвестак, напрыклад, з дапамогай <code>./configure --with-mysqli</code>.\nКалі вы ўсталявалі PHP з пакунку Debian або Ubuntu, тады вам трэба дадаткова ўсталяваць, напрыклад, пакунак <code>php-mysql</code>.",
-       "config-outdated-sqlite": "'''Папярэджаньне''': усталяваны SQLite $1, у той час, калі мінімальная сумяшчальная вэрсія — $2. SQLite ня будзе даступны.",
+       "config-outdated-sqlite": "<strong>Папярэджаньне</strong>: усталяваны SQLite $2, у той час, калі мінімальная сумяшчальная вэрсія — $1. SQLite ня будзе даступны.",
        "config-no-fts3": "'''Папярэджаньне''': SQLite створаны без модуля [//sqlite.org/fts3.html FTS3], для гэтага ўнутранага інтэрфэйсу ня будзе даступная магчымасьць пошуку.",
        "config-pcre-old": "<strong>Крытычная памылка:</strong> патрэбны PCRE вэрсіі $1 або пазьнейшай.\nPHP-файл, які выконваецца, зьвязаны з PCRE вэрсіі $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Больш інфармацыі].",
        "config-pcre-no-utf8": "'''Фатальная памылка''': модуль PCRE для PHP скампіляваны без падтрымкі PCRE_UTF8.\nMediaWiki патрабуе падтрымкі UTF-8 для слушнай працы.",
index 944ecbe..8f62c4f 100644 (file)
@@ -62,7 +62,7 @@
        "config-unicode-pure-php-warning": "<strong>Upozornění:</strong> Není dostupné [https://pecl.php.net/intl PECL rozšíření intl] pro normalizaci Unicode, bude se využívat pomalá implementace v čistém PHP.\nPokud provozujete wiki s velkou návštěvností, měli byste si přečíst něco o [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizaci Unicode].",
        "config-unicode-update-warning": "<strong>Upozornění:</strong> Nainstalovaná verze vrstvy pro normalizaci Unicode používá starší verzi knihovny [http://site.icu-project.org/ projektu ICU].\nPokud vám aspoň trochu záleží na používání Unicode, měli byste [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations ji aktualizovat].",
        "config-no-db": "Nepodařilo se nalézt vhodný databázový ovladač! Musíte nainstalovat databázový ovladač pro PHP.\n{{PLURAL:$2|Je podporován následující typ databáze|Jsou podporovány následující typy databází}}: $1.\n\nPokud jste si PHP přeložili sami, překonfigurujte ho se zapnutým databázovým klientem, například pomocí <code>./configure --with-mysqli</code>.\nPokud jste PHP nainstalovali z balíčku Debian či Ubuntu, potřebujete nainstalovat také modul <code>php-mysql</code>.",
-       "config-outdated-sqlite": "<strong>Upozornění:</strong> Máte SQLite $1, které je starší než minimálně vyžadovaná verze $2. SQLite nebude dostupné.",
+       "config-outdated-sqlite": "<strong>Upozornění:</strong> Máte SQLite $2, které je starší než minimálně vyžadovaná verze $1. SQLite nebude dostupné.",
        "config-no-fts3": "<strong>Upozornění:</strong> SQLite bylo přeloženo bez [//sqlite.org/fts3.html modulu FTS3], funkce pro vyhledávání zde nebudou dostupné.",
        "config-pcre-old": "<strong>Kritická chyba:</strong> Je vyžadováno PCRE verze $1 nebo novější.\nVaše binárka PHP obsahuje PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Více informací.]",
        "config-pcre-no-utf8": "<strong>Kritická chyba:</strong> PHP modul PCRE byl zřejmě přeložen bez podpory PCRE_UTF8.\nMediaWiki vyžaduje ke správné funkci podporu UTF-8.",
index 364209c..6d52241 100644 (file)
@@ -8,12 +8,14 @@
                        "Ochilov",
                        "Tlustulimu",
                        "Robin van der Vliet",
-                       "YvesNevelsteen"
+                       "YvesNevelsteen",
+                       "Mirin"
                ]
        },
        "config-desc": "La instalilo de MediaWiki",
        "config-title": "Instalado de MediaWiki $1",
        "config-information": "Informoj",
+       "config-localsettings-key": "Ĝisdatiga ŝlosilo:",
        "config-localsettings-badkey": "La ĝisdatiga ŝlosilo kiun vi enigis, estas malĝusta.",
        "config-your-language": "Via lingvo:",
        "config-your-language-help": "Elektu la lingvon kiun vi volas uzi dum la instalada procezo.",
        "config-env-bad": "La medio estas kontrolita.\nNe eblas instali MediaWiki.",
        "config-env-php": "PHP $1 estas instalita.",
        "config-env-hhvm": "HHVM $1 estas instalita.",
+       "config-memory-raised": "La parametro <code>memory_limit</code> de PHP estis $1, ŝanĝita al $2.",
        "config-apc": "[https://www.php.net/apc APC] estas instalita",
        "config-apcu": "[https://www.php.net/apcu APCu] estas instalita",
        "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] estas instalita",
        "config-diff3-bad": "GNU diff3 ne estis trovita.",
+       "config-using-server": "Uzante servilonomon \"<nowiki>$1</nowiki>\".",
+       "config-using-uri": "Uzante servilan retadreson \"<nowiki>$1$2</nowiki>\".",
        "config-db-type": "Tipo de datumbazo:",
+       "config-db-host": "Datenbanka gastigilo:",
        "config-db-wiki-settings": "Identigu ĉi tiun vikion",
        "config-db-name": "Nomo de datumbazo:",
+       "config-db-name-oracle": "Datenbanka skemo:",
+       "config-db-username": "Datenbanka uzantnomo:",
+       "config-db-password": "Datenbanka pasvorto:",
+       "config-db-port": "Datenbanka pordo:",
+       "config-db-schema": "Skemo por MediaVikio (sen streketo):",
+       "config-sqlite-dir": "Datena dosierujo por SQLite:",
+       "config-oracle-def-ts": "Implicita tabelspaco:",
+       "config-oracle-temp-ts": "Portempa tabelspaco:",
        "config-type-mysql": "MariaDB, MySQL, aŭ kongrua",
        "config-type-mssql": "Microsoft SQL Server",
        "config-header-mysql": "MairaDB/MySQL-agordoj",
        "config-header-sqlite": "SQLite-agordoj",
        "config-header-oracle": "Oracle-agordoj",
        "config-header-mssql": "Microsoft SQL Server-agordoj",
+       "config-invalid-db-type": "Nevalida speco de datenbanko.",
+       "config-sqlite-readonly": "La dosiero <code>$1</code> ne estas surskribebla.",
+       "config-sqlite-cant-create-db": "Ne povis krei datenbankan dosieron <code>$1</code>.",
+       "config-regenerate": "Refari dosieron LocalSettings.php →",
+       "config-mysql-engine": "Konservada modulo:",
+       "config-mysql-innodb": "InnoDB (rekomendata)",
+       "config-mysql-myisam": "MyISAM",
+       "config-mssql-auth": "Speco de aŭtentokontrolo:",
+       "config-mssql-sqlauth": "Aŭtentokontrolo de Microsoft SQL-Servilo",
+       "config-mssql-windowsauth": "Aŭtentokontrolo de Windows",
        "config-site-name": "Nomo de vikio:",
+       "config-site-name-blank": "Enigu nomon de retejo.",
+       "config-project-namespace": "Projekta nomspaco:",
        "config-ns-generic": "Projekto",
+       "config-ns-site-name": "Same kiel la nomo de la vikio: $1",
+       "config-ns-other": "Alio (specifi)",
+       "config-ns-other-default": "MiaVikio",
+       "config-admin-box": "Konto de administranto",
        "config-admin-name": "Via uzantonomo:",
        "config-admin-password": "Pasvorto:",
        "config-admin-password-confirm": "Retajpu pasvorton:",
        "config-admin-name-blank": "Enigu salutnomon de administranto.",
+       "config-admin-password-blank": "Enigu pasvorton por la administra konto.",
+       "config-admin-password-mismatch": "La du pasvortojn enigitaj de vi ne estas egalaj.",
        "config-admin-email": "Retpoŝtadreso:",
+       "config-admin-error-bademail": "Vi enigis nevalidan retpoŝtan adreson.",
+       "config-optional-continue": "Demandu min pli da demandoj.",
+       "config-optional-skip": "Mi jam enuas; simple instalu la vikion.",
+       "config-profile": "Profilo de uzantorajtoj:",
+       "config-profile-wiki": "Malfermita vikio",
        "config-profile-private": "Privata vikio",
        "config-license": "Aŭtorrajto kaj permesilo:",
+       "config-license-cc-by-sa": "Krea Komunaĵo Atribuite-Samkondiĉe",
+       "config-license-cc-by": "Krea Komunaĵo Atribuite",
+       "config-license-cc-0": "Krea Komunaĵo Nul (Publika Havaĵo)",
+       "config-license-pd": "Publika Havaĵo",
+       "config-email-settings": "Agordo pri retpoŝto",
+       "config-upload-settings": "Alŝutado de bildoj kaj dosieroj",
+       "config-upload-enable": "Ebligi alŝutadon de dosieroj",
+       "config-upload-deleted": "Dosierujo por forigitaj dosieroj:",
+       "config-logo": "Retadreso de emblemo:",
+       "config-cc-again": "Reelekti...",
+       "config-extensions": "Kromprogramoj",
+       "config-skins": "Etosoj",
+       "config-skins-use-as-default": "Uzi ĉi tiun etoson kiel implicitan",
+       "config-install-step-done": "farite",
+       "config-install-step-failed": "malsukcesis",
+       "config-install-extensions": "Inkluzive de kromprogramoj",
+       "config-install-database": "Agordante datenbankon",
+       "config-install-schema": "Kreante skemon",
+       "config-install-user": "Kreante datenbankan uzanton",
+       "config-install-user-create-failed": "Kreado de uzanto \"$1\" malsukcesis: $2",
+       "config-install-tables": "Kreante tabelojn",
+       "config-install-interwiki-list": "Ne povis legi dosieron <code>interwiki.list</code>.",
+       "config-install-stats": "Pretigante statistikon",
+       "config-install-keys": "Farante sekretajn ŝlosilojn",
+       "config-download-localsettings": "Elŝuti la dosieron <code>LocalSettings.php</code>",
+       "config-help": "helpo",
+       "config-skins-screenshots": "$1 (ekrankopioj: $2)",
+       "config-extensions-requires": "$1 (postulas $2)",
+       "config-screenshot": "ekrankopio",
        "mainpagetext": "'''MediaWiki estis sukcese instalita.'''",
        "mainpagedocfooter": "Konsultu la [https://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Gvidilon por uzantoj de MediaWiki] por informoj pri uzado de vikia programaro.\n\n==Kiel komenci==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Listo de konfiguraĵoj] (angle)\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki Oftaj Demandoj] (angle)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Anonco-dissendolisto pri MediaWiki] (angle)\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Preklad MediaWiki do tvojho jazyka]"
 }
index 6b8ceb2..feef335 100644 (file)
@@ -38,7 +38,8 @@
                        "MarcoAurelio",
                        "Adjen",
                        "Dschultz",
-                       "Carlosmg.dg"
+                       "Carlosmg.dg",
+                       "Harvest"
                ]
        },
        "config-desc": "El instalador de MediaWiki",
@@ -88,7 +89,7 @@
        "config-unicode-pure-php-warning": "<strong>Advertencia:</strong> la [https://pecl.php.net/intl extensión intl] no está disponible para efectuar la normalización Unicode. Se utilizará la implementación más lenta en PHP puro.\nSi tu web tiene mucho tráfico, te recomendamos leer acerca de la [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalización Unicode].",
        "config-unicode-update-warning": "<strong>Atención:</strong> la versión instalada del contenedor de normalización de Unicode utiliza una versión anticuada de la biblioteca del [http://site.icu-project.org/ proyecto ICU].\nDeberías [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations modernizarla] si te interesa utilizar Unicode.",
        "config-no-db": "No se encontró un controlador adecuado para la base de datos. Necesitas instalar un controlador de base de datos para PHP.\n{{PLURAL:$2|Se admite el siguiente gestor de bases de datos|Se admiten los siguientes gestores de bases de datos}}: $1.\n\nSi compilaste PHP por tu cuenta, debes reconfigurarlo activando un cliente de base de datos, por ejemplo, mediante <code>./configure --with-mysqli</code>.\nSi instalaste PHP desde un paquete de Debian o Ubuntu, también debes instalar, por ejemplo, el paquete <code>php-mysql</code>.",
-       "config-outdated-sqlite": "<strong>Advertencia:</strong> tienes SQLite $1, que es inferior a la mínima versión requerida: $2. SQLite no estará disponible.",
+       "config-outdated-sqlite": "<strong>Advertencia:</strong> tienes SQLite $2, que es inferior a la mínima versión requerida: $1. SQLite no estará disponible.",
        "config-no-fts3": "<strong>Advertencia:</strong> SQLite está compilado sin el [//sqlite.org/fts3.html módulo FTS3]. Las funcionalidades de búsqueda no estarán disponibles en esta instalación.",
        "config-pcre-old": "'''Fatal:''' Se requiere PCRE $1 o posterior.\nSu PHP binario está enlazado con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Más información].",
        "config-pcre-no-utf8": "'''Error fatal ''': Parece que el módulo PCRE de PHP fue compilado sin el soporte PCRE_UTF8.\nMediaWiki requiere compatibilidad con UTF-8 para funcionar correctamente.",
index 07b61cc..623e624 100644 (file)
@@ -30,7 +30,8 @@
                        "Trial",
                        "Tinss",
                        "Thibaut120094",
-                       "Tartare"
+                       "Tartare",
+                       "VIGNERON"
                ]
        },
        "config-desc": "Le programme d’installation de MediaWiki",
@@ -80,7 +81,7 @@
        "config-unicode-pure-php-warning": "<strong>Attention :</strong> L’[https://pecl.php.net/intl extension PECL intl] n’est pas disponible pour la normalisation d’Unicode, retour à la version lente implémentée en PHP seulement.\nSi votre site web sera très fréquenté, vous devriez lire ceci : [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations ''Unicode normalization''] (en anglais).",
        "config-unicode-update-warning": "<strong>Attention :</strong> la version installée du normalisateur Unicode utilise une ancienne version de la bibliothèque logicielle du [http://site.icu-project.org/ ''Projet ICU''].\nVous devriez faire une [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations mise à jour] si vous êtes concerné par l’usage d’Unicode.",
        "config-no-db": "Impossible de trouver un pilote de base de données approprié ! Vous devez installer un pilote de base de données pour PHP. {{PLURAL:$2|Le type suivant|Les types suivants}} de bases de données {{PLURAL:$2|est reconnu|sont reconnus}} : $1.\n\nSi vous avez compilé PHP vous-même, reconfigurez-le avec un client de base de données activé, par exemple en utilisant <code>./configure --with-mysqli</code>.  \nSi vous avez installé PHP depuis un paquet Debian ou Ubuntu, alors vous devrez aussi installer, par exemple, le paquet <code>php-mysql</code>.",
-       "config-outdated-sqlite": "<strong>Attention :</strong> vous avez SQLite $1, qui est inférieur à la version minimale requise $2. SQLite sera indisponible.",
+       "config-outdated-sqlite": "<strong>Attention :</strong> vous avez SQLite $2, qui est inférieur à la version minimale requise $1. SQLite sera indisponible.",
        "config-no-fts3": "<strong>Attention :</strong> SQLite est compilé sans le [//sqlite.org/fts3.html module FTS3] ; les fonctions de recherche ne seront pas disponibles sur ce moteur.",
        "config-pcre-old": "<strong>Erreur fatale :</strong> PCRE $1 ou ultérieur est nécessaire.\nVotre binaire PHP est lié avec PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Plus d’information sur PCRE].",
        "config-pcre-no-utf8": "<strong>Erreur fatale :</strong> le module PCRE de PHP semble être compilé sans la prise en charge de PCRE_UTF8.\nMediaWiki a besoin de la gestion d’UTF-8 pour fonctionner correctement.",
        "config-logo": "URL du logo :",
        "config-logo-help": "L’habillage par défaut de MediaWiki comprend l’espace pour un logo de 135x160 pixels au-dessus de la barre de menu latérale.\nTéléversez une image de la taille appropriée, et entrez son URL ici.\n\nVous pouvez utiliser <code>$wgStylePath</code> ou <code>$wgScriptPath</code> si votre logo est relatif à ces chemins.\n\nSi vous ne voulez pas de logo, laissez cette case vide.",
        "config-instantcommons": "Activer ''InstantCommons''",
-       "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons/fr InstantCommons] est un service qui permet d’utiliser les images, les sons et les autres médias disponibles sur le site [https://meta.wikimedia.org/wiki/Wikimedia_Commons/fr Wikimédia Commons].\nPour ce faire, il faut que MediaWiki accède à Internet.\n\nPour plus d’informations sur ce service, y compris les instructions sur la façon de le configurer pour d’autres wikis que Wikimedia Commons, consultez le [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos manuel].",
+       "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons/fr InstantCommons] est un service qui permet d’utiliser les images, les sons et les autres médias disponibles sur le site [https://commons.wikimedia.org Wikimedia Commons].\nPour ce faire, il faut que MediaWiki accède à Internet.\n\nPour plus d’informations sur ce service, y compris les instructions sur la façon de le configurer pour d’autres wikis que Wikimedia Commons, consultez le [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos manuel].",
        "config-cc-error": "Le sélection d'une licence ''Creative Commons'' n'a donné aucun résultat.\nEntrez le nom de la licence manuellement.",
        "config-cc-again": "Choisissez à nouveau...",
        "config-cc-not-chosen": "Choisissez la licence ''Creative Commons'' que vous désirez et cliquez sur « proceed ».",
index cc34a31..c878979 100644 (file)
@@ -72,7 +72,7 @@
        "config-unicode-pure-php-warning": "'''Attenzione:''' [https://pecl.php.net/intl l'estensione PECL intl] non è disponibile per gestire la normalizzazione Unicode, quindi si torna alla lenta implementazione in PHP puro.\nSe esegui un sito ad alto traffico, dovresti leggere alcune considerazioni sulla [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizzazione Unicode].",
        "config-unicode-update-warning": "'''Attenzione:''' la versione installata del gestore per la normalizzazione Unicode usa una vecchia versione della libreria [http://site.icu-project.org/ del progetto ICU].\nDovresti [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations aggiornare] se vuoi usare l'Unicode.",
        "config-no-db": "Impossibile trovare un driver adatto per il database! È necessario installare un driver per PHP.\n{{PLURAL:$2|Il seguente formato di database è supportato|I seguenti formati di database sono supportati}}: $1.\n\nSe compili PHP autonomamente, riconfiguralo attivando un client database, per esempio utilizzando <code>./configure --with-mysqli</code>.\nQualora avessi installato PHP per mezzo di un pacchetto Debian o Ubuntu, allora devi installare anche il pacchetto <code>php-mysql</code>.",
-       "config-outdated-sqlite": "'''Attenzione''': è presente SQLite $1 mentre è richiesta la versione $2, SQLite non sarà disponibile.",
+       "config-outdated-sqlite": "<strong>Attenzione</strong>: è presente SQLite $2 mentre è richiesta la versione $1, SQLite non sarà disponibile.",
        "config-no-fts3": "'''Attenzione''': SQLite è compilato senza il [//sqlite.org/fts3.html modulo FTS3], le funzionalità di ricerca non saranno disponibili su questo backend.",
        "config-pcre-old": "<strong>Errore fatale:</strong> si richiede PCRE  $1 o successivo.\nIl tuo file binario PHP è collegato con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Maggiori informazioni su PCRE].",
        "config-pcre-no-utf8": "'''Errore''': Il modulo PCRE di PHP sembra essere stato compilato senza il supporto PCRE_UTF8, ma MediaWiki lo richiede per funzionare correttamente.",
index dca5ef8..f952045 100644 (file)
@@ -63,7 +63,7 @@
        "config-unicode-pure-php-warning": "<strong>경고:</strong> 유니코드 정규화를 처리할 [https://pecl.php.net/intl intl PECL 확장 기능]을 사용할 수 없기 때문에 느린 pure-PHP 구현을 대신 사용합니다.\n트래픽이 높은 사이트에서 실행하시려면 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 유니코드 정규화]를 읽어보셔야 합니다.",
        "config-unicode-update-warning": "<strong>경고:</strong> 유니코드 정규화 래퍼의 설치된 버전은 [http://site.icu-project.org/ ICU 프로젝트]의 라이브러리의 이전 버전을 사용합니다.\n만약 유니코드를 사용하는 것에 대해 우려가 된다면 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 업그레이드]해야합니다.",
        "config-no-db": "적절한 데이터베이스 드라이버를 찾을 수 없습니다! PHP용 데이터베이스 드라이버를 설치해야 합니다.\n다음 데이터베이스 {{PLURAL:$2|유형을}} 지원합니다: $1.\n\nPHP를 직접 컴파일했다면, 예를 들어 <code>./configure --with-mysqli</code>을 사용하여, 데이터베이스 클라이언트를 활성화하도록 다시 설정하세요.\n데비안이나 우분투 패키지에서 PHP를 설치했다면 <code>php-mysql</code> 패키지도 설치해야 합니다.",
-       "config-outdated-sqlite": "<strong>경고:</strong> 최소 요구 버전 $2 보다 낮은 SQLite $1이(가) 있습니다. SQLite를 사용할 수 없습니다.",
+       "config-outdated-sqlite": "<strong>경고:</strong> 최소 요구 버전 $1 보다 낮은 SQLite $2이(가) 있습니다. SQLite를 사용할 수 없습니다.",
        "config-no-fts3": "<strong>경고:</strong> SQLite를 [//sqlite.org/fts3.html FTS3 모듈] 없이 컴파일하며, 검색 기능은 백엔드에 사용할 수 없습니다.",
        "config-pcre-old": "<strong>치명:</strong> PCRE $1 또는 그 이상이 필요합니다.\nPHP 바이너리는 PCRE $2에 연결되어 있습니다. [https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 자세한 정보].",
        "config-pcre-no-utf8": "<strong>치명:</strong> PHP의 PCRE 모듈은 RCRE_UTF8 지원 없이 컴파일된 것 같습니다.\n미디어위키가 올바르게 작동하려면 UTF-8을 지원해야 합니다.",
index bbe1a1d..88d13fe 100644 (file)
@@ -47,7 +47,7 @@
        "config-env-php": "PHP $1 ass installéiert.",
        "config-env-hhvm": "HHVM $1 ass installéiert.",
        "config-no-db": "Et konnt kee passenden Datebank-Driver fonnt ginn! Dir musst een Datebank-Driver fir PHP installéieren.\n{{PLURAL:$2|Dësn Datebank-Typ gëtt|Dës Datebank-Type ginn}} ënnerstëtzt: $1.\n\nWann Dir PHP selwer compiléiert hutt, da rekonfiguréiert en mat dem ageschalten Datebank-Client, zum Beispill an deem Dir <code>./configure --with-mysqli</code> benotzt.\nWann Dir PHP vun engem Debian oder Ubuntu Package aus installéiert hutt, da musst Dir och den php5-mysql Modul installéieren.",
-       "config-outdated-sqlite": "'''Warnung:''' SQLite $1 ass installéiert. Allerdengs brauch MediaWiki SQLite $2 oder méi nei. SQLite ass dofir net disponibel.",
+       "config-outdated-sqlite": "<strong>Warnung:</strong> SQLite $2 ass installéiert. Allerdengs brauch MediaWiki SQLite $1 oder méi nei. SQLite ass dofir net disponibel.",
        "config-memory-bad": "'''Opgepasst:''' De Parameter <code>memory_limit</code> vu PHP ass $1.\nDat ass wahrscheinlech ze niddreg.\nD'Installatioun kéint net funktionéieren.",
        "config-apc": "[https://www.php.net/apc APC] ass installéiert",
        "config-apcu": "[https://www.php.net/apcu APCu] ass installéiert.",
index a12445c..1b34fc6 100644 (file)
@@ -73,7 +73,7 @@
        "config-unicode-pure-php-warning": "<strong>Waarschuwing:</strong> de [https://pecl.php.net/intl PECL-extensie intl] is niet beschikbaar om de Unicodenormalisatie af te handelen en daarom wordt de langzamere PHP-implementatie gebruikt.\nAls u MediaWiki voor een website met veel verkeer installeert, lees u dan in over [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicodenormalisatie].",
        "config-unicode-update-warning": "<strong>Waarschuwing:</strong> de geïnstalleerde versie van de Unicodenormalisatiewrapper maakt gebruik van een oudere versie van [http://site.icu-project.org/ de bibliotheek van het ICU-project].\nU moet [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations bijwerken] als Unicode voor u van belang is.",
        "config-no-db": "Het was niet mogelijk een geschikte databasedriver te vinden voor PHP! U moet een databasedriver installeren voor PHP.\n{{PLURAL:$2|Het volgende databasetype wordt|De volgende databasetypes worden}} ondersteund: $1.\n\nAls u PHP zelf hebt gecompileerd, wijzig dan uw instellingen zodat een databasedriver wordt geactiveerd, bijvoorbeeld via <code>./configure --with-mysqli</code>.\nAls u PHP hebt geïnstalleerd via een Debian- of Ubuntu-package, installeer dan ook bijvoorbeeld de module <code>php-mysql</code>.",
-       "config-outdated-sqlite": "''' Waarschuwing:''' u gebruikt SQLite $1. SQLite is niet beschikbaar omdat de minimaal vereiste versie $2 is.",
+       "config-outdated-sqlite": "''' Waarschuwing:''' u gebruikt SQLite $2. SQLite is niet beschikbaar omdat de minimaal vereiste versie $1 is.",
        "config-no-fts3": "<strong>Waarschuwing:</strong> SQLite is gecompileerd zonder de module [//sqlite.org/fts3.html FTS3]; zoekfuncties zijn niet beschikbaar.",
        "config-pcre-old": "'''Onherstelbare fout:''' PCRE $1 of een latere versie is vereist.\nUw uitvoerbare versie van PHP is gekoppeld met PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Meer informatie].",
        "config-pcre-no-utf8": "<strong>Onherstelbare fout:</strong> de module PRCE van PHP lijkt te zijn gecompileerd zonder ondersteuning voor PCRE_UTF8.\nMediaWiki heeft ondersteuning voor UTF-8 nodig om correct te kunnen werken.",
index 41da9dc..e8f9078 100644 (file)
@@ -74,7 +74,7 @@
        "config-unicode-pure-php-warning": "<strong>Uwaga:<strong> [https://pecl.php.net/intl Rozszerzenie intl PECL] do obsługi normalizacji Unicode nie jest dostępne. Użyta zostanie mało wydajna zwykła implementacja w PHP.\nJeśli prowadzisz stronę o dużym natężeniu ruchu, powinieneś zapoznać się z informacjami o [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizacji Unicode].",
        "config-unicode-update-warning": "<strong>Uwaga:</strong> zainstalowana wersja normalizacji Unicode korzysta z nieaktualnej biblioteki [http://site.icu-project.org/ projektu ICU].\nPowinieneś [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations wykonać aktualizację], jeśli chcesz korzystać w pełni z Unicode.",
        "config-no-db": "Nie można odnaleźć właściwego sterownika bazy danych! Musisz zainstalować sterownik bazy danych dla PHP.\nMożna użyć {{PLURAL:$2|następującego typu bazy|następujących typów baz}} danych: $1.\n\nJeśli skompilowałeś PHP samodzielnie, skonfiguruj go ponownie z włączonym klientem bazy danych, na przykład za pomocą polecenia <code>./configure --with-mysqli</code>.\nJeśli zainstalowałeś PHP jako pakiet Debiana lub Ubuntu, musisz również zainstalować np. moduł <code>php-mysql</code>.",
-       "config-outdated-sqlite": "'''Ostrzeżenie''': masz SQLite  $1, która jest niższa od minimalnej wymaganej wersji  $2 . SQLite będzie niedostępne.",
+       "config-outdated-sqlite": "<strong>Ostrzeżenie</strong>: masz SQLite  $2, która jest niższa od minimalnej wymaganej wersji  $1 . SQLite będzie niedostępne.",
        "config-no-fts3": "'''Uwaga''' – SQLite został skompilowany bez [//sqlite.org/fts3.html modułu FTS3] – funkcje wyszukiwania nie będą dostępne.",
        "config-pcre-old": "<strong>Błąd krytyczny:</strong> Wymagany jest PCRE w wersji $1 lub nowszej.\nTwój plik wykonywalny PHP jest powiązany z wersją PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Więcej informacji].",
        "config-pcre-no-utf8": "'''Błąd krytyczny''' – wydaje się, że moduł PCRE w PHP został skompilowany bez wsparcia dla UTF‐8.\nMediaWiki wymaga wsparcia dla UTF‐8 do prawidłowego działania.",
@@ -87,7 +87,7 @@
        "config-mod-security": "''' Ostrzeżenie ''': Serwer sieci web ma włączone [https://modsecurity.org/ mod_security]. Jeśli jest niepoprawnie skonfigurowane, może być przyczyną problemów MediaWiki lub innego oprogramowania, które pozwala użytkownikom na wysyłanie dowolnej zawartości.\nSprawdź w [https://modsecurity.org/documentation/ dokumentacji mod_security] lub skontaktuj się z obsługa hosta, jeśli wystąpią losowe błędy.",
        "config-diff3-bad": "Nie znaleziono funkcjonalności porównywania tekstu GNU diff3. Możesz zignorować ten komunikat, jednak konflikty edycji będą wówczas częstsze.",
        "config-git": "Znaleziono oprogramowanie kontroli wersji Git: <code>$1</code>.",
-       "config-git-bad": "Oprogramowanie systemu kontroli wersji Git nie zostało znalezione.",
+       "config-git-bad": "Oprogramowanie systemu kontroli wersji Git nie zostało znalezione. Możesz zignorować ten komunikat, jednak numery commitów nie będą wyświetlane na stronie Specjalna:Wersja.",
        "config-imagemagick": "Mamy zainstalowany ImageMagick <code>$1</code>, dzięki czemu będzie można pomniejszać załadowane grafiki.",
        "config-gd": "Mamy wbudowaną bibliotekę graficzną GD, dzięki czemu będzie można pomniejszać załadowane grafiki.",
        "config-no-scaling": "Nie odnaleziono biblioteki GD lub ImageMagick. Możliwość zmniejszania załadowywanych grafik zostanie wyłączona.",
index 2bae20f..a17ca69 100644 (file)
@@ -73,7 +73,7 @@
        "config-unicode-pure-php-warning": "<strong>Aviso</strong>: A [https://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode, abortando e passando para a lenta implementação de PHP puro.\nSe o seu site tem um alto volume de tráfego, informe-se sobre a [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalização Unicode].",
        "config-unicode-update-warning": "<strong>Aviso:</strong> A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [http://www.site.icu-project.org/projeto ICU].\nVocê deve [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizar] se você tem quaisquer preocupações com o uso do Unicode.",
        "config-no-db": "Não foi possível encontrar um driver apropriado para a banco de dados! Você precisa instalar um driver de banco de dados para PHP. {{PLURAL:$2|É aceito o seguinte tipo|São aceitos os seguintes tipos}} de banco de dados: $1.\n\nSe você compilou o PHP, reconfigure-o com um cliente de banco de dados ativado, por exemplo, usando <code>./configure --with-mysqli</code>.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então também precisa instalar, por exemplo, o pacote <code>php-mysql</code>.",
-       "config-outdated-sqlite": "<strong>Aviso:</strong> você tem o SQLite versão $1, que é menor do que a versão mínima necessária $2. O SQLite não estará disponível.",
+       "config-outdated-sqlite": "<strong>Aviso:</strong> você tem o SQLite versão $2, que é menor do que a versão mínima necessária $1. O SQLite não estará disponível.",
        "config-no-fts3": "<strong>Aviso</strong> O SQLite foi compilado sem o [//sqlite.org/fts3.html módulo FTS3], as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
        "config-pcre-old": "<strong>Erro fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO binário do seu PHP foi vinculado com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
        "config-pcre-no-utf8": "<strong>Erro fatal:</strong> O módulo PCRE do PHP parece ser compilado sem suporte a PCRE_UTF8.\nO MediaWiki requer suporte a UTF-8 para funcionar corretamente.",
index 293ff0c..6f6e003 100644 (file)
@@ -33,6 +33,7 @@
        "config-restart": "Sìne, falle repartì",
        "config-env-php": "PHP $1 ha state installate.",
        "config-env-hhvm": "HHVM $1 ha state installate.",
+       "config-outdated-sqlite": "<strong>Iapre l'uecchjie:</strong> tu è SQLite $2, ca jè 'na versione troppe vecchie respette a quedda minime $1. SQLite non g'è disponibbele.",
        "config-db-type": "Tipe de database:",
        "config-db-host-oracle": "Database TNS:",
        "config-db-name-oracle": "Scheme d'u database:",
index a0b6e07..89ecb0e 100644 (file)
@@ -279,8 +279,7 @@ class RefreshLinksJob extends Job {
                        'recursive' => !empty( $this->params['useRecursiveLinksUpdate'] ),
                        // Carry over cause so the update can do extra logging
                        'causeAction' => $this->params['causeAction'],
-                       'causeAgent' => $this->params['causeAgent'],
-                       'transactionTicket' => $ticket
+                       'causeAgent' => $this->params['causeAgent']
                ];
                if ( !empty( $this->params['triggeringUser'] ) ) {
                        $userInfo = $this->params['triggeringUser'];
index aeefacd..333bd81 100644 (file)
@@ -801,7 +801,7 @@ interface IDatabase {
         *
         * @param string|array $table Table name
         * @param string|array $vars Field names
-        * @param array $conds Conditions
+        * @param string|array $conds Conditions
         * @param string $fname Caller function name
         * @param string|array $options Query options
         * @param array|string $join_conds Join conditions
index aeb5d8d..3709de7 100644 (file)
@@ -9,10 +9,10 @@ use stdClass;
  * doesn't go anywhere near an actual database.
  */
 class FakeResultWrapper extends ResultWrapper {
-       /** @var stdClass[] $result */
+       /** @var stdClass[]|array[] $result */
 
        /**
-        * @param stdClass[] $rows
+        * @param stdClass[]|array[] $rows
         */
        function __construct( array $rows ) {
                parent::__construct( null, $rows );
@@ -22,43 +22,52 @@ class FakeResultWrapper extends ResultWrapper {
                return count( $this->result );
        }
 
-       function fetchRow() {
-               if ( $this->pos < count( $this->result ) ) {
-                       $this->currentRow = $this->result[$this->pos];
-               } else {
-                       $this->currentRow = false;
-               }
-               $this->pos++;
-               if ( is_object( $this->currentRow ) ) {
-                       return get_object_vars( $this->currentRow );
-               } else {
-                       return $this->currentRow;
-               }
+       function fetchObject() {
+               $current = $this->current();
+
+               $this->next();
+
+               return $current;
        }
 
-       function seek( $row ) {
-               $this->pos = $row;
+       function fetchRow() {
+               $row = $this->valid() ? $this->result[$this->pos] : false;
+
+               $this->next();
+
+               return is_object( $row ) ? (array)$row : $row;
        }
 
-       function free() {
+       function seek( $pos ) {
+               $this->pos = $pos;
        }
 
-       function fetchObject() {
-               $this->fetchRow();
-               if ( $this->currentRow ) {
-                       return (object)$this->currentRow;
-               } else {
-                       return false;
-               }
+       function free() {
+               $this->result = null;
        }
 
        function rewind() {
                $this->pos = 0;
-               $this->currentRow = null;
+       }
+
+       function current() {
+               $row = $this->valid() ? $this->result[$this->pos] : false;
+
+               return is_array( $row ) ? (object)$row : $row;
+       }
+
+       function key() {
+               return $this->pos;
        }
 
        function next() {
-               return $this->fetchObject();
+               $this->pos++;
+
+               return $this->current();
+       }
+
+       function valid() {
+               return array_key_exists( $this->pos, $this->result );
        }
 }
 
index debf8a2..616fed9 100644 (file)
@@ -52,9 +52,9 @@ interface IResultWrapper extends Iterator {
         * Change the position of the cursor in a result object.
         * See mysql_data_seek()
         *
-        * @param int $row
+        * @param int $pos
         */
-       public function seek( $row );
+       public function seek( $pos );
 
        /**
         * Free a result object
index a9befc2..b7938ad 100644 (file)
@@ -30,8 +30,8 @@ class ResultWrapper implements IResultWrapper {
 
        /** @var int */
        protected $pos = 0;
-       /** @var stdClass|null */
-       protected $currentRow = null;
+       /** @var stdClass|bool|null */
+       protected $currentRow;
 
        /**
         * Create a row iterator from a result resource and an optional Database object
@@ -63,29 +63,16 @@ class ResultWrapper implements IResultWrapper {
                return $this->getDB()->fetchRow( $this );
        }
 
-       public function seek( $row ) {
-               $this->getDB()->dataSeek( $this, $row );
+       public function seek( $pos ) {
+               $this->getDB()->dataSeek( $this, $pos );
+               $this->pos = $pos;
        }
 
        public function free() {
-               if ( $this->db ) {
-                       $this->db = null;
-               }
+               $this->db = null;
                $this->result = null;
        }
 
-       /**
-        * @return IDatabase
-        * @throws RuntimeException
-        */
-       private function getDB() {
-               if ( !$this->db ) {
-                       throw new RuntimeException( static::class . ' needs a DB handle for iteration.' );
-               }
-
-               return $this->db;
-       }
-
        function rewind() {
                if ( $this->numRows() ) {
                        $this->getDB()->dataSeek( $this, 0 );
@@ -95,8 +82,8 @@ class ResultWrapper implements IResultWrapper {
        }
 
        function current() {
-               if ( is_null( $this->currentRow ) ) {
-                       $this->next();
+               if ( $this->currentRow === null ) {
+                       $this->currentRow = $this->fetchObject();
                }
 
                return $this->currentRow;
@@ -116,6 +103,18 @@ class ResultWrapper implements IResultWrapper {
        function valid() {
                return $this->current() !== false;
        }
+
+       /**
+        * @return IDatabase
+        * @throws RuntimeException
+        */
+       private function getDB() {
+               if ( !$this->db ) {
+                       throw new RuntimeException( static::class . ' needs a DB handle for iteration.' );
+               }
+
+               return $this->db;
+       }
 }
 
 /**
index 52d8370..faa9654 100644 (file)
@@ -131,7 +131,7 @@ interface ILoadBalancer {
 
        /**
         * @param DatabaseDomain|string|bool $domain Database domain
-        * @return string Value of $domain if provided or the local domain otherwise
+        * @return string Value of $domain if it is foreign or the local domain otherwise
         * @since 1.32
         */
        public function resolveDomainID( $domain );
@@ -151,7 +151,7 @@ interface ILoadBalancer {
         * always return a consistent index during a given invocation.
         *
         * Side effect: opens connections to databases
-        * @param string|bool $group Query group, or false for the generic reader
+        * @param string|bool $group Query group, or false for the generic group
         * @param string|bool $domain Domain ID, or false for the current domain
         * @throws DBError
         * @return bool|int|string
@@ -159,12 +159,12 @@ interface ILoadBalancer {
        public function getReaderIndex( $group = false, $domain = false );
 
        /**
-        * Set the master wait position
+        * Set the master position to reach before the next generic group DB handle query
         *
-        * If a DB_REPLICA connection has been opened already, then wait immediately.
-        * Otherwise sets a variable telling it to wait if such a connection is opened.
+        * If a generic replica DB connection is already open then this immediately waits
+        * for that DB to catch up to the specified replication position. Otherwise, it will
+        * do so once such a connection is opened.
         *
-        * This only applies to connections to the generic replica DB for this request.
         * If a timeout happens when waiting, then getLaggedReplicaMode()/laggedReplicaUsed()
         * will return true.
         *
@@ -173,7 +173,7 @@ interface ILoadBalancer {
        public function waitFor( $pos );
 
        /**
-        * Set the master wait position and wait for a "generic" replica DB to catch up to it
+        * Set the master wait position and wait for a generic replica DB to catch up to it
         *
         * This can be used a faster proxy for waitForAll()
         *
index da5382a..51fda52 100644 (file)
@@ -64,7 +64,7 @@ class LoadBalancer implements ILoadBalancer {
        /** @var callable Deprecation logger */
        private $deprecationLogger;
 
-       /** @var DatabaseDomain Local Domain ID and default for selectDB() calls */
+       /** @var DatabaseDomain Local DB domain ID and default for selectDB() calls */
        private $localDomain;
 
        /** @var Database[][][] Map of (connection category => server index => IDatabase[]) */
@@ -73,7 +73,7 @@ class LoadBalancer implements ILoadBalancer {
        /** @var array[] Map of (server index => server config array) */
        private $servers;
        /** @var float[] Map of (server index => weight) */
-       private $loads;
+       private $genericLoads;
        /** @var array[] Map of (group => server index => weight) */
        private $groupLoads;
        /** @var bool Whether to disregard replica DB lag as a factor in replica DB selection */
@@ -82,7 +82,7 @@ class LoadBalancer implements ILoadBalancer {
        private $waitTimeout;
        /** @var array The LoadMonitor configuration */
        private $loadMonitorConfig;
-       /** @var string Alternate ID string for the domain instead of DatabaseDomain::getId() */
+       /** @var string Alternate local DB domain instead of DatabaseDomain::getId() */
        private $localDomainIdAlias;
        /** @var int */
        private $maxLag;
@@ -103,8 +103,8 @@ class LoadBalancer implements ILoadBalancer {
 
        /** @var Database DB connection object that caused a problem */
        private $errorConnection;
-       /** @var int The generic (not query grouped) replica DB index (of $mServers) */
-       private $readIndex;
+       /** @var int The generic (not query grouped) replica DB index */
+       private $genericReadIndex = -1;
        /** @var bool|DBMasterPos False if not set */
        private $waitForPos;
        /** @var bool Whether the generic reader fell back to a lagged replica DB */
@@ -163,7 +163,7 @@ class LoadBalancer implements ILoadBalancer {
 
        public function __construct( array $params ) {
                if ( !isset( $params['servers'] ) ) {
-                       throw new InvalidArgumentException( __CLASS__ . ': missing servers parameter' );
+                       throw new InvalidArgumentException( __CLASS__ . ': missing "servers" parameter' );
                }
                $this->servers = $params['servers'];
                foreach ( $this->servers as $i => $server ) {
@@ -181,7 +181,6 @@ class LoadBalancer implements ILoadBalancer {
 
                $this->waitTimeout = $params['waitTimeout'] ?? self::MAX_WAIT_DEFAULT;
 
-               $this->readIndex = -1;
                $this->conns = [
                        // Connection were transaction rounds may be applied
                        self::KEY_LOCAL => [],
@@ -192,7 +191,7 @@ class LoadBalancer implements ILoadBalancer {
                        self::KEY_FOREIGN_INUSE_NOROUND => [],
                        self::KEY_FOREIGN_FREE_NOROUND => []
                ];
-               $this->loads = [];
+               $this->genericLoads = [];
                $this->waitForPos = false;
                $this->allowLagged = false;
 
@@ -206,7 +205,7 @@ class LoadBalancer implements ILoadBalancer {
                $this->loadMonitorConfig += [ 'lagWarnThreshold' => $this->maxLag ];
 
                foreach ( $params['servers'] as $i => $server ) {
-                       $this->loads[$i] = $server['load'];
+                       $this->genericLoads[$i] = $server['load'];
                        if ( isset( $server['groupLoads'] ) ) {
                                foreach ( $server['groupLoads'] as $group => $ratio ) {
                                        if ( !isset( $this->groupLoads[$group] ) ) {
@@ -257,7 +256,12 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function resolveDomainID( $domain ) {
-               return ( $domain !== false ) ? (string)$domain : $this->getLocalDomainID();
+               if ( $domain === $this->localDomainIdAlias || $domain === false ) {
+                       // Local connection requested via some backwards-compatibility domain alias
+                       return $this->getLocalDomainID();
+               }
+
+               return (string)$domain;
        }
 
        /**
@@ -341,13 +345,59 @@ class LoadBalancer implements ILoadBalancer {
                return ArrayUtils::pickRandom( $loads );
        }
 
+       /**
+        * @param int $i
+        * @param array $groups
+        * @param string|bool $domain
+        * @return int
+        */
+       private function getConnectionIndex( $i, $groups, $domain ) {
+               // Check one "group" per default: the generic pool
+               $defaultGroups = $this->defaultGroup ? [ $this->defaultGroup ] : [ false ];
+
+               $groups = ( $groups === false || $groups === [] )
+                       ? $defaultGroups
+                       : (array)$groups;
+
+               if ( $i == self::DB_MASTER ) {
+                       $i = $this->getWriterIndex();
+               } elseif ( $i == self::DB_REPLICA ) {
+                       # Try to find an available server in any the query groups (in order)
+                       foreach ( $groups as $group ) {
+                               $groupIndex = $this->getReaderIndex( $group, $domain );
+                               if ( $groupIndex !== false ) {
+                                       $i = $groupIndex;
+                                       break;
+                               }
+                       }
+               }
+
+               # Operation-based index
+               if ( $i == self::DB_REPLICA ) {
+                       $this->lastError = 'Unknown error'; // reset error string
+                       # Try the general server pool if $groups are unavailable.
+                       $i = ( $groups === [ false ] )
+                               ? false // don't bother with this if that is what was tried above
+                               : $this->getReaderIndex( false, $domain );
+                       # Couldn't find a working server in getReaderIndex()?
+                       if ( $i === false ) {
+                               $this->lastError = 'No working replica DB server: ' . $this->lastError;
+                               // Throw an exception
+                               $this->reportConnectionError();
+                               return null; // not reached
+                       }
+               }
+
+               return $i;
+       }
+
        public function getReaderIndex( $group = false, $domain = false ) {
                if ( count( $this->servers ) == 1 ) {
                        // Skip the load balancing if there's only one server
                        return $this->getWriterIndex();
-               } elseif ( $group === false && $this->readIndex >= 0 ) {
-                       // Shortcut if the generic reader index was already cached
-                       return $this->readIndex;
+               } elseif ( $group === false && $this->genericReadIndex >= 0 ) {
+                       // A generic reader index was already selected and "waitForPos" was handled
+                       return $this->genericReadIndex;
                }
 
                if ( $group !== false ) {
@@ -362,7 +412,7 @@ class LoadBalancer implements ILoadBalancer {
                        }
                } else {
                        // Use the generic load group
-                       $loads = $this->loads;
+                       $loads = $this->genericLoads;
                }
 
                // Scale the configured load ratios according to each server's load and state
@@ -371,27 +421,22 @@ class LoadBalancer implements ILoadBalancer {
                // Pick a server to use, accounting for weights, load, lag, and "waitForPos"
                list( $i, $laggedReplicaMode ) = $this->pickReaderIndex( $loads, $domain );
                if ( $i === false ) {
-                       // Replica DB connection unsuccessful
+                       // DB connection unsuccessful
                        return false;
                }
 
-               if ( $this->waitForPos && $i != $this->getWriterIndex() ) {
-                       // Before any data queries are run, wait for the server to catch up to the
-                       // specified position. This is used to improve session consistency. Note that
-                       // when LoadBalancer::waitFor() sets "waitForPos", the waiting triggers here,
-                       // so update laggedReplicaMode as needed for consistency.
-                       if ( !$this->doWait( $i ) ) {
-                               $laggedReplicaMode = true;
-                       }
+               // If data seen by queries is expected to reflect the transactions committed as of
+               // or after a given replication position then wait for the DB to apply those changes
+               if ( $this->waitForPos && $i != $this->getWriterIndex() && !$this->doWait( $i ) ) {
+                       // Data will be outdated compared to what was expected
+                       $laggedReplicaMode = true;
                }
 
-               if ( $this->readIndex <= 0 && $this->loads[$i] > 0 && $group === false ) {
-                       // Cache the generic reader index for future ungrouped DB_REPLICA handles
-                       $this->readIndex = $i;
+               if ( $this->genericReadIndex < 0 && $this->genericLoads[$i] > 0 && $group === false ) {
+                       // Cache the generic (ungrouped) reader index for future DB_REPLICA handles
+                       $this->genericReadIndex = $i;
                        // Record if the generic reader index is in "lagged replica DB" mode
-                       if ( $laggedReplicaMode ) {
-                               $this->laggedReplicaMode = true;
-                       }
+                       $this->laggedReplicaMode = ( $laggedReplicaMode || $this->laggedReplicaMode );
                }
 
                $serverName = $this->getServerName( $i );
@@ -407,7 +452,7 @@ class LoadBalancer implements ILoadBalancer {
         */
        private function pickReaderIndex( array $loads, $domain = false ) {
                if ( $loads === [] ) {
-                       throw new InvalidArgumentException( "Empty server array given to LoadBalancer" );
+                       throw new InvalidArgumentException( "Server configuration array is empty" );
                }
 
                /** @var int|bool $i Index of selected server */
@@ -486,10 +531,10 @@ class LoadBalancer implements ILoadBalancer {
                try {
                        $this->waitForPos = $pos;
                        // If a generic reader connection was already established, then wait now
-                       $i = $this->readIndex;
-                       if ( ( $i > 0 ) && !$this->doWait( $i ) ) {
+                       if ( $this->genericReadIndex > 0 && !$this->doWait( $this->genericReadIndex ) ) {
                                $this->laggedReplicaMode = true;
                        }
+                       // Otherwise, wait until a connection is established in getReaderIndex()
                } finally {
                        // Restore the older position if it was higher since this is used for lag-protection
                        $this->setWaitForPositionIfHigher( $oldPos );
@@ -501,10 +546,10 @@ class LoadBalancer implements ILoadBalancer {
                try {
                        $this->waitForPos = $pos;
 
-                       $i = $this->readIndex;
+                       $i = $this->genericReadIndex;
                        if ( $i <= 0 ) {
                                // Pick a generic replica DB if there isn't one yet
-                               $readLoads = $this->loads;
+                               $readLoads = $this->genericLoads;
                                unset( $readLoads[$this->getWriterIndex()] ); // replica DBs only
                                $readLoads = array_filter( $readLoads ); // with non-zero load
                                $i = ArrayUtils::pickRandom( $readLoads );
@@ -533,7 +578,7 @@ class LoadBalancer implements ILoadBalancer {
 
                        $ok = true;
                        for ( $i = 1; $i < $serverCount; $i++ ) {
-                               if ( $this->loads[$i] > 0 ) {
+                               if ( $this->genericLoads[$i] > 0 ) {
                                        $start = microtime( true );
                                        $ok = $this->doWait( $i, true, $timeout ) && $ok;
                                        $timeout -= intval( microtime( true ) - $start );
@@ -687,13 +732,11 @@ class LoadBalancer implements ILoadBalancer {
 
        public function getConnection( $i, $groups = [], $domain = false, $flags = 0 ) {
                if ( $i === null || $i === false ) {
-                       throw new InvalidArgumentException( 'Attempt to call ' . __METHOD__ .
-                               ' with invalid server index' );
+                       throw new InvalidArgumentException( "Cannot connect without a server index" );
                }
 
-               if ( $this->localDomain->equals( $domain ) || $domain === $this->localDomainIdAlias ) {
-                       $domain = false; // local connection requested
-               }
+               $domain = $this->resolveDomainID( $domain );
+               $masterOnly = ( $i == self::DB_MASTER || $i == $this->getWriterIndex() );
 
                if ( ( $flags & self::CONN_TRX_AUTOCOMMIT ) === self::CONN_TRX_AUTOCOMMIT ) {
                        // Assuming all servers are of the same type (or similar), which is overwhelmingly
@@ -712,62 +755,28 @@ class LoadBalancer implements ILoadBalancer {
                        }
                }
 
-               // Check one "group" per default: the generic pool
-               $defaultGroups = $this->defaultGroup ? [ $this->defaultGroup ] : [ false ];
-
-               $groups = ( $groups === false || $groups === [] )
-                       ? $defaultGroups
-                       : (array)$groups;
-
-               $masterOnly = ( $i == self::DB_MASTER || $i == $this->getWriterIndex() );
-               $oldConnsOpened = $this->connsOpened; // connections open now
-
-               if ( $i == self::DB_MASTER ) {
-                       $i = $this->getWriterIndex();
-               } elseif ( $i == self::DB_REPLICA ) {
-                       # Try to find an available server in any the query groups (in order)
-                       foreach ( $groups as $group ) {
-                               $groupIndex = $this->getReaderIndex( $group, $domain );
-                               if ( $groupIndex !== false ) {
-                                       $i = $groupIndex;
-                                       break;
-                               }
-                       }
-               }
-
-               # Operation-based index
-               if ( $i == self::DB_REPLICA ) {
-                       $this->lastError = 'Unknown error'; // reset error string
-                       # Try the general server pool if $groups are unavailable.
-                       $i = ( $groups === [ false ] )
-                               ? false // don't bother with this if that is what was tried above
-                               : $this->getReaderIndex( false, $domain );
-                       # Couldn't find a working server in getReaderIndex()?
-                       if ( $i === false ) {
-                               $this->lastError = 'No working replica DB server: ' . $this->lastError;
-                               // Throw an exception
-                               $this->reportConnectionError();
-                               return null; // not reached
-                       }
-               }
-
-               # Now we have an explicit index into the servers array
-               $conn = $this->openConnection( $i, $domain, $flags );
+               // Number of connections made before getting the server index and handle
+               $priorConnectionsMade = $this->connsOpened;
+               // Decide which server to use (might trigger new connections)
+               $serverIndex = $this->getConnectionIndex( $i, $groups, $domain );
+               // Get an open connection to that server (might trigger a new connection)
+               $conn = $this->openConnection( $serverIndex, $domain, $flags );
                if ( !$conn ) {
-                       // Throw an exception
                        $this->reportConnectionError();
-                       return null; // not reached
+                       return null; // unreachable due to exception
                }
 
-               # Profile any new connections that happen
-               if ( $this->connsOpened > $oldConnsOpened ) {
+               // Profile any new connections caused by this method
+               if ( $this->connsOpened > $priorConnectionsMade ) {
                        $host = $conn->getServer();
                        $dbname = $conn->getDBname();
                        $this->trxProfiler->recordConnection( $host, $dbname, $masterOnly );
                }
 
-               if ( $masterOnly ) {
-                       # Make master-requested DB handles inherit any read-only mode setting
+               if ( $serverIndex == $this->getWriterIndex() ) {
+                       // If the load balancer is read-only, perhaps due to replication lag, then master
+                       // DB handles will reflect that. Note that Database::assertIsWritableMaster() takes
+                       // care of replica DB handles whereas getReadOnlyReason() would cause infinite loops.
                        $conn->setLBInfo( 'readOnlyReason', $this->getReadOnlyReason( $domain, $conn ) );
                }
 
@@ -813,11 +822,11 @@ class LoadBalancer implements ILoadBalancer {
 
                $domain = $conn->getDomainID();
                if ( !isset( $this->conns[$connInUseKey][$serverIndex][$domain] ) ) {
-                       throw new InvalidArgumentException( __METHOD__ .
-                               ": connection $serverIndex/$domain not found; it may have already been freed." );
+                       throw new InvalidArgumentException(
+                               "Connection $serverIndex/$domain not found; it may have already been freed" );
                } elseif ( $this->conns[$connInUseKey][$serverIndex][$domain] !== $conn ) {
-                       throw new InvalidArgumentException( __METHOD__ .
-                               ": connection $serverIndex/$domain mismatched; it may have already been freed." );
+                       throw new InvalidArgumentException(
+                               "Connection $serverIndex/$domain mismatched; it may have already been freed" );
                }
 
                $conn->setLBInfo( 'foreignPoolRefCount', --$refCount );
@@ -867,45 +876,35 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function openConnection( $i, $domain = false, $flags = 0 ) {
-               if ( $this->localDomain->equals( $domain ) || $domain === $this->localDomainIdAlias ) {
-                       $domain = false; // local connection requested
-               }
+               $domain = $this->resolveDomainID( $domain );
 
                if ( !$this->connectionAttempted && $this->chronologyCallback ) {
-                       $this->connLogger->debug( __METHOD__ . ': calling initLB() before first connection.' );
                        // Load any "waitFor" positions before connecting so that doWait() is triggered
+                       $this->connLogger->debug( __METHOD__ . ': calling initLB() before first connection.' );
                        $this->connectionAttempted = true;
                        ( $this->chronologyCallback )( $this );
                }
 
-               // Check if an auto-commit connection is being requested. If so, it will not reuse the
-               // main set of DB connections but rather its own pool since:
-               // a) those are usually set to implicitly use transaction rounds via DBO_TRX
-               // b) those must support the use of explicit transaction rounds via beginMasterChanges()
-               $autoCommit = ( ( $flags & self::CONN_TRX_AUTOCOMMIT ) == self::CONN_TRX_AUTOCOMMIT );
-
-               if ( $domain !== false ) {
-                       // Connection is to a foreign domain
-                       $conn = $this->openForeignConnection( $i, $domain, $flags );
-               } else {
-                       // Connection is to the local domain
-                       $conn = $this->openLocalConnection( $i, $flags );
-               }
+               $conn = $this->localDomain->equals( $domain )
+                       ? $this->openLocalConnection( $i, $flags )
+                       : $this->openForeignConnection( $i, $domain, $flags );
 
                if ( $conn instanceof IDatabase && !$conn->isOpen() ) {
                        // Connection was made but later unrecoverably lost for some reason.
                        // Do not return a handle that will just throw exceptions on use,
                        // but let the calling code (e.g. getReaderIndex) try another server.
-                       // See DatabaseMyslBase::ping() for how this can happen.
                        $this->errorConnection = $conn;
                        $conn = false;
                }
 
-               if ( $autoCommit && $conn instanceof IDatabase ) {
+               if (
+                       $conn instanceof IDatabase &&
+                       ( ( $flags & self::CONN_TRX_AUTOCOMMIT ) == self::CONN_TRX_AUTOCOMMIT )
+               ) {
                        if ( $conn->trxLevel() ) { // sanity
                                throw new DBUnexpectedError(
                                        $conn,
-                                       __METHOD__ . ': CONN_TRX_AUTOCOMMIT handle has a transaction.'
+                                       'Handle requested with CONN_TRX_AUTOCOMMIT yet it has a transaction'
                                );
                        }
 
@@ -928,6 +927,8 @@ class LoadBalancer implements ILoadBalancer {
         * @return Database
         */
        private function openLocalConnection( $i, $flags = 0 ) {
+               // Connection handles required to be in auto-commit mode use a separate connection
+               // pool since the main pool is effected by implicit and explicit transaction rounds
                $autoCommit = ( ( $flags & self::CONN_TRX_AUTOCOMMIT ) == self::CONN_TRX_AUTOCOMMIT );
 
                $connKey = $autoCommit ? self::KEY_LOCAL_NOROUND : self::KEY_LOCAL;
@@ -935,7 +936,7 @@ class LoadBalancer implements ILoadBalancer {
                        $conn = $this->conns[$connKey][$i][0];
                } else {
                        if ( !isset( $this->servers[$i] ) || !is_array( $this->servers[$i] ) ) {
-                               throw new InvalidArgumentException( "No server with index '$i'." );
+                               throw new InvalidArgumentException( "No server with index '$i'" );
                        }
                        // Open a new connection
                        $server = $this->servers[$i];
@@ -962,7 +963,7 @@ class LoadBalancer implements ILoadBalancer {
                ) {
                        throw new UnexpectedValueException(
                                "Got connection to '{$conn->getDomainID()}', " .
-                               "but expected local domain ('{$this->localDomain}')." );
+                               "but expected local domain ('{$this->localDomain}')" );
                }
 
                return $conn;
@@ -992,6 +993,8 @@ class LoadBalancer implements ILoadBalancer {
         */
        private function openForeignConnection( $i, $domain, $flags = 0 ) {
                $domainInstance = DatabaseDomain::newFromId( $domain );
+               // Connection handles required to be in auto-commit mode use a separate connection
+               // pool since the main pool is effected by implicit and explicit transaction rounds
                $autoCommit = ( ( $flags & self::CONN_TRX_AUTOCOMMIT ) == self::CONN_TRX_AUTOCOMMIT );
 
                if ( $autoCommit ) {
@@ -1047,7 +1050,7 @@ class LoadBalancer implements ILoadBalancer {
 
                if ( !$conn ) {
                        if ( !isset( $this->servers[$i] ) || !is_array( $this->servers[$i] ) ) {
-                               throw new InvalidArgumentException( "No server with index '$i'." );
+                               throw new InvalidArgumentException( "No server with index '$i'" );
                        }
                        // Open a new connection
                        $server = $this->servers[$i];
@@ -1071,7 +1074,7 @@ class LoadBalancer implements ILoadBalancer {
                        // Final sanity check to make sure the right domain is selected
                        if ( !$domainInstance->isCompatible( $conn->getDomainID() ) ) {
                                throw new UnexpectedValueException(
-                                       "Got connection to '{$conn->getDomainID()}', but expected '$domain'." );
+                                       "Got connection to '{$conn->getDomainID()}', but expected '$domain'" );
                        }
                        // Increment reference count
                        $refCount = $conn->getLBInfo( 'foreignPoolRefCount' );
@@ -1233,7 +1236,7 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function isNonZeroLoad( $i ) {
-               return array_key_exists( $i, $this->servers ) && $this->loads[$i] != 0;
+               return array_key_exists( $i, $this->servers ) && $this->genericLoads[$i] != 0;
        }
 
        public function getServerCount() {
@@ -1301,7 +1304,7 @@ class LoadBalancer implements ILoadBalancer {
        public function closeConnection( IDatabase $conn ) {
                if ( $conn instanceof DBConnRef ) {
                        // Avoid calling close() but still leaving the handle in the pool
-                       throw new RuntimeException( __METHOD__ . ': got DBConnRef instance.' );
+                       throw new RuntimeException( 'Cannot close DBConnRef instance; it must be shareable' );
                }
 
                $serverIndex = $conn->getLBInfo( 'serverIndex' );
@@ -1372,7 +1375,7 @@ class LoadBalancer implements ILoadBalancer {
                        if ( $limit > 0 && $time > $limit ) {
                                throw new DBTransactionSizeError(
                                        $conn,
-                                       "Transaction spent $time second(s) in writes, exceeding the limit of $limit.",
+                                       "Transaction spent $time second(s) in writes, exceeding the limit of $limit",
                                        [ $time, $limit ]
                                );
                        }
@@ -1381,7 +1384,7 @@ class LoadBalancer implements ILoadBalancer {
                        if ( $conn->writesOrCallbacksPending() && !$conn->ping() ) {
                                throw new DBTransactionError(
                                        $conn,
-                                       "A connection to the {$conn->getDBname()} database was lost before commit."
+                                       "A connection to the {$conn->getDBname()} database was lost before commit"
                                );
                        }
                } );
@@ -1392,7 +1395,7 @@ class LoadBalancer implements ILoadBalancer {
                if ( $this->trxRoundId !== false ) {
                        throw new DBTransactionError(
                                null,
-                               "$fname: Transaction round '{$this->trxRoundId}' already started."
+                               "$fname: Transaction round '{$this->trxRoundId}' already started"
                        );
                }
                $this->assertTransactionRoundStage( self::ROUND_CURSORY );
@@ -1683,12 +1686,17 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function getLaggedReplicaMode( $domain = false ) {
-               // No-op if there is only one DB (also avoids recursion)
-               if ( !$this->laggedReplicaMode && $this->getServerCount() > 1 ) {
+               if (
+                       // Avoid recursion if there is only one DB
+                       $this->getServerCount() > 1 &&
+                       // Avoid recursion if the (non-zero load) master DB was picked for generic reads
+                       $this->genericReadIndex !== $this->getWriterIndex() &&
+                       // Stay in lagged replica mode during the load balancer instance lifetime
+                       !$this->laggedReplicaMode
+               ) {
                        try {
-                               // See if laggedReplicaMode gets set
-                               $conn = $this->getConnection( self::DB_REPLICA, false, $domain );
-                               $this->reuseConnection( $conn );
+                               // Calling this method will set "laggedReplicaMode" as needed
+                               $this->getReaderIndex( false, $domain );
                        } catch ( DBConnectionError $e ) {
                                // Avoid expensive re-connect attempts and failures
                                $this->allReplicasDownMode = true;
@@ -1826,7 +1834,7 @@ class LoadBalancer implements ILoadBalancer {
 
                $lagTimes = $this->getLagTimes( $domain );
                foreach ( $lagTimes as $i => $lag ) {
-                       if ( $this->loads[$i] > 0 && $lag > $maxLag ) {
+                       if ( $this->genericLoads[$i] > 0 && $lag > $maxLag ) {
                                $maxLag = $lag;
                                $host = $this->servers[$i]['host'];
                                $maxIndex = $i;
@@ -1959,7 +1967,7 @@ class LoadBalancer implements ILoadBalancer {
                if ( $domainsInUse ) {
                        $domains = implode( ', ', $domainsInUse );
                        throw new DBUnexpectedError( null,
-                               "Foreign domain connections are still in use ($domains)." );
+                               "Foreign domain connections are still in use ($domains)" );
                }
 
                $this->setLocalDomain( new DatabaseDomain(
index 25d1d6a..dd0d081 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 namespace Wikimedia\Services;
 
 use InvalidArgumentException;
index 77b4c35..1dd70a4 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 use Liuggio\StatsdClient\Entity\StatsdData;
 use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
 
index 1a96c1d..7dd0491 100644 (file)
@@ -193,7 +193,7 @@ abstract class MediaHandler {
         *  performance problems.
         * @param File $image
         * @param string $metadata The metadata in serialized form
-        * @return bool
+        * @return bool|int
         */
        public function isMetadataValid( $image, $metadata ) {
                return self::METADATA_GOOD;
index e47cc37..e2cc1b2 100644 (file)
@@ -186,7 +186,7 @@ class XCFHandler extends BitmapHandler {
         *
         * @param File $file The file object for the file in question
         * @param string $metadata Serialized metadata
-        * @return bool One of the self::METADATA_(BAD|GOOD|COMPATIBLE) constants
+        * @return bool|int One of the self::METADATA_(BAD|GOOD|COMPATIBLE) constants
         */
        public function isMetadataValid( $file, $metadata ) {
                if ( !$metadata ) {
index 863a3f3..3814112 100644 (file)
@@ -2106,8 +2106,6 @@ class WikiPage implements Page, IDBAccessObject {
         *   - defer: one of the DeferredUpdates constants, or false to run immediately (default: false).
         *     Note that even when this is set to false, some updates might still get deferred (as
         *     some update might directly add child updates to DeferredUpdates).
-        *   - transactionTicket: a transaction ticket from LBFactory::getEmptyTransactionTicket(),
-        *     only when defer is false (default: null)
         * @since 1.32
         */
        public function doSecondaryDataUpdates( array $options = [] ) {
index 670dd5b..9fd12e8 100644 (file)
@@ -21,7 +21,7 @@
 namespace MediaWiki\Preferences;
 
 /**
- * Base interface for user preference flters that work as a middleware between
+ * Base interface for user preference filters that work as a middleware between
  * storage and interface.
  */
 interface Filter {
index cc993aa..eb71fe6 100644 (file)
@@ -48,6 +48,7 @@ class SkinFactory {
         * @return SkinFactory
         */
        public static function getDefaultInstance() {
+               wfDeprecated( __METHOD__, '1.27' );
                return MediaWikiServices::getInstance()->getSkinFactory();
        }
 
index bd02fa3..2f70c8d 100644 (file)
@@ -9,6 +9,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * BaseTemplate class for the fallback skin
  */
@@ -41,7 +43,8 @@ class SkinFallbackTemplate extends BaseTemplate {
        private function buildHelpfulInformationMessage() {
                $defaultSkin = $this->config->get( 'DefaultSkin' );
                $installedSkins = $this->findInstalledSkins();
-               $enabledSkins = SkinFactory::getDefaultInstance()->getSkinNames();
+               $skinFactory = MediaWikiServices::getInstance()->getSkinFactory();
+               $enabledSkins = $skinFactory->getSkinNames();
                $enabledSkins = array_change_key_case( $enabledSkins, CASE_LOWER );
 
                if ( $installedSkins ) {
index b1772b7..71b505a 100644 (file)
@@ -47,6 +47,7 @@ class SpecialPermanentLink extends RedirectSpecialPage {
        }
 
        protected function showNoRedirectPage() {
+               $this->addHelpLink( 'Help:PermanentLink' );
                $this->setHeaders();
                $this->outputHeader();
                $this->showForm();
index 8655b1c..87bc259 100644 (file)
@@ -156,10 +156,10 @@ class UserrightsPage extends SpecialPage {
                        $user->matchEditToken( $request->getVal( 'wpEditToken' ), $this->mTarget )
                ) {
                        /*
-                       * If the user is blocked and they only have "partial" access
-                       * (e.g. they don't have the userrights permission), then don't
-                       * allow them to change any user rights.
-                       */
+                        * If the user is blocked and they only have "partial" access
+                        * (e.g. they don't have the userrights permission), then don't
+                        * allow them to change any user rights.
+                        */
                        if ( !$user->isAllowed( 'userrights' ) ) {
                                // @TODO Should the user be blocked from changing user rights if they
                                //       are partially blocked?
index 2bbe7c3..d905aa4 100644 (file)
@@ -1195,7 +1195,7 @@ abstract class UploadBase {
         *
         * @param string[] $ext
         * @param string[] $list
-        * @return bool
+        * @return string[]
         */
        public static function checkFileExtensionList( $ext, $list ) {
                return array_intersect( array_map( 'strtolower', $ext ), $list );
@@ -1446,7 +1446,7 @@ abstract class UploadBase {
        /**
         * @param string $filename
         * @param bool $partial
-        * @return mixed False of the file is verified (does not contain scripts), array otherwise.
+        * @return bool|array
         */
        protected function detectScriptInSvg( $filename, $partial ) {
                $this->mSVGNSError = false;
@@ -1478,7 +1478,7 @@ abstract class UploadBase {
         * Callback to filter SVG Processing Instructions.
         * @param string $target Processing instruction name
         * @param string $data Processing instruction attribute and value
-        * @return bool (true if the filter identified something bad)
+        * @return bool|array
         */
        public static function checkSvgPICallback( $target, $data ) {
                // Don't allow external stylesheets (T59550)
@@ -1525,7 +1525,7 @@ abstract class UploadBase {
         * @param string $element
         * @param array $attribs
         * @param array|null $data
-        * @return bool
+        * @return bool|array
         */
        public function checkSvgScriptCallback( $element, $attribs, $data = null ) {
                list( $namespace, $strippedElement ) = $this->splitXmlNamespace( $element );
@@ -1836,7 +1836,7 @@ abstract class UploadBase {
         * $wgAntivirusRequired may be used to deny upload if the scan fails.
         *
         * @param string $file Pathname to the temporary upload file
-        * @return mixed False if not virus is found, null if the scan fails or is disabled,
+        * @return bool|null|string False if not virus is found, null if the scan fails or is disabled,
         *   or a string containing feedback from the virus scanner if a virus was found.
         *   If textual feedback is missing but a virus was found, this function returns true.
         */
@@ -1932,7 +1932,7 @@ abstract class UploadBase {
         *
         * @param User $user
         *
-        * @return mixed True on success, array on failure
+        * @return bool|array
         */
        private function checkOverwrite( $user ) {
                // First check whether the local file can be overwritten
index f3a3e12..e8ca7ce 100644 (file)
@@ -109,6 +109,94 @@ class User implements IDBAccessObject, UserIdentity {
                'mActorId',
        ];
 
+       /**
+        * Array of Strings Core rights.
+        * Each of these should have a corresponding message of the form
+        * "right-$right".
+        * @showinitializer
+        */
+       protected static $mCoreRights = [
+               'apihighlimits',
+               'applychangetags',
+               'autoconfirmed',
+               'autocreateaccount',
+               'autopatrol',
+               'bigdelete',
+               'block',
+               'blockemail',
+               'bot',
+               'browsearchive',
+               'changetags',
+               'createaccount',
+               'createpage',
+               'createtalk',
+               'delete',
+               'deletechangetags',
+               'deletedhistory',
+               'deletedtext',
+               'deletelogentry',
+               'deleterevision',
+               'edit',
+               'editcontentmodel',
+               'editinterface',
+               'editprotected',
+               'editmyoptions',
+               'editmyprivateinfo',
+               'editmyusercss',
+               'editmyuserjson',
+               'editmyuserjs',
+               'editmywatchlist',
+               'editsemiprotected',
+               'editsitecss',
+               'editsitejson',
+               'editsitejs',
+               'editusercss',
+               'edituserjson',
+               'edituserjs',
+               'hideuser',
+               'import',
+               'importupload',
+               'ipblock-exempt',
+               'managechangetags',
+               'markbotedits',
+               'mergehistory',
+               'minoredit',
+               'move',
+               'movefile',
+               'move-categorypages',
+               'move-rootuserpages',
+               'move-subpages',
+               'nominornewtalk',
+               'noratelimit',
+               'override-export-depth',
+               'pagelang',
+               'patrol',
+               'patrolmarks',
+               'protect',
+               'purge',
+               'read',
+               'reupload',
+               'reupload-own',
+               'reupload-shared',
+               'rollback',
+               'sendemail',
+               'siteadmin',
+               'suppressionlog',
+               'suppressredirect',
+               'suppressrevision',
+               'unblockself',
+               'undelete',
+               'unwatchedpages',
+               'upload',
+               'upload_by_url',
+               'userrights',
+               'userrights-interwiki',
+               'viewmyprivateinfo',
+               'viewmywatchlist',
+               'viewsuppressed',
+               'writeapi',
+       ];
+
        /**
         * String Cached results of getAllRights()
         */
@@ -183,6 +271,8 @@ class User implements IDBAccessObject, UserIdentity {
        public $mBlockedby;
        /** @var string */
        protected $mHash;
+       /** @var array */
+       public $mRights;
        /** @var string */
        protected $mBlockreason;
        /** @var array */
@@ -239,24 +329,6 @@ class User implements IDBAccessObject, UserIdentity {
                return (string)$this->getName();
        }
 
-       public function __get( $name ) {
-               // A shortcut for $mRights deprecation phase
-               if ( $name === 'mRights' ) {
-                       return $this->getRights();
-               }
-       }
-
-       public function __set( $name, $value ) {
-               // A shortcut for $mRights deprecation phase, only known legitimate use was for
-               // testing purposes, other uses seem bad in principle
-               if ( $name === 'mRights' ) {
-                       MediaWikiServices::getInstance()->getPermissionManager()->overrideUserRightsForTesting(
-                               $this,
-                               is_null( $value ) ? [] : $value
-                       );
-               }
-       }
-
        /**
         * Test if it's safe to load this User object.
         *
@@ -1634,12 +1706,11 @@ class User implements IDBAccessObject, UserIdentity {
         *   given source. May be "name", "id", "actor", "defaults", "session", or false for no reload.
         */
        public function clearInstanceCache( $reloadFrom = false ) {
-               global $wgFullyInitialised;
-
                $this->mNewtalk = -1;
                $this->mDatePreference = null;
                $this->mBlockedby = -1; # Unset
                $this->mHash = false;
+               $this->mRights = null;
                $this->mEffectiveGroups = null;
                $this->mImplicitGroups = null;
                $this->mGroupMemberships = null;
@@ -1647,13 +1718,6 @@ class User implements IDBAccessObject, UserIdentity {
                $this->mOptionsLoaded = false;
                $this->mEditCount = null;
 
-               // Replacement of former `$this->mRights = null` line
-               if ( $wgFullyInitialised && $this->mFrom ) {
-                       MediaWikiServices::getInstance()->getPermissionManager()->invalidateUsersRightsCache(
-                               $this
-                       );
-               }
-
                if ( $reloadFrom ) {
                        $this->mLoadedItems = [];
                        $this->mFrom = $reloadFrom;
@@ -2093,6 +2157,7 @@ class User implements IDBAccessObject, UserIdentity {
         * @param Title $title Title to check
         * @param bool $fromReplica Whether to check the replica DB instead of the master
         * @return bool
+        * @throws MWException
         *
         * @deprecated since 1.33,
         * use MediaWikiServices::getInstance()->getPermissionManager()->isBlockedFrom(..)
@@ -3338,13 +3403,44 @@ class User implements IDBAccessObject, UserIdentity {
        /**
         * Get the permissions this user has.
         * @return string[] permission names
-        *
-        * @deprecated since 1.34, use MediaWikiServices::getInstance()->getPermissionManager()
-        * ->getUserPermissions(..) instead
-        *
         */
        public function getRights() {
-               return MediaWikiServices::getInstance()->getPermissionManager()->getUserPermissions( $this );
+               if ( is_null( $this->mRights ) ) {
+                       $this->mRights = self::getGroupPermissions( $this->getEffectiveGroups() );
+                       Hooks::run( 'UserGetRights', [ $this, &$this->mRights ] );
+
+                       // Deny any rights denied by the user's session, unless this
+                       // endpoint has no sessions.
+                       if ( !defined( 'MW_NO_SESSION' ) ) {
+                               $allowedRights = $this->getRequest()->getSession()->getAllowedUserRights();
+                               if ( $allowedRights !== null ) {
+                                       $this->mRights = array_intersect( $this->mRights, $allowedRights );
+                               }
+                       }
+
+                       Hooks::run( 'UserGetRightsRemove', [ $this, &$this->mRights ] );
+                       // Force reindexation of rights when a hook has unset one of them
+                       $this->mRights = array_values( array_unique( $this->mRights ) );
+
+                       // If block disables login, we should also remove any
+                       // extra rights blocked users might have, in case the
+                       // blocked user has a pre-existing session (T129738).
+                       // This is checked here for cases where people only call
+                       // $user->isAllowed(). It is also checked in Title::checkUserBlock()
+                       // to give a better error message in the common case.
+                       $config = RequestContext::getMain()->getConfig();
+                       // @TODO Partial blocks should not prevent the user from logging in.
+                       //       see: https://phabricator.wikimedia.org/T208895
+                       if (
+                               $this->isLoggedIn() &&
+                               $config->get( 'BlockDisablesLogin' ) &&
+                               $this->getBlock()
+                       ) {
+                               $anon = new User;
+                               $this->mRights = array_intersect( $this->mRights, $anon->getRights() );
+                       }
+               }
+               return $this->mRights;
        }
 
        /**
@@ -3513,7 +3609,8 @@ class User implements IDBAccessObject, UserIdentity {
                // Refresh the groups caches, and clear the rights cache so it will be
                // refreshed on the next call to $this->getRights().
                $this->getEffectiveGroups( true );
-               MediaWikiServices::getInstance()->getPermissionManager()->invalidateUsersRightsCache( $this );
+               $this->mRights = null;
+
                $this->invalidateCache();
 
                return true;
@@ -3544,7 +3641,8 @@ class User implements IDBAccessObject, UserIdentity {
                // Refresh the groups caches, and clear the rights cache so it will be
                // refreshed on the next call to $this->getRights().
                $this->getEffectiveGroups( true );
-               MediaWikiServices::getInstance()->getPermissionManager()->invalidateUsersRightsCache( $this );
+               $this->mRights = null;
+
                $this->invalidateCache();
 
                return true;
@@ -3627,17 +3725,16 @@ class User implements IDBAccessObject, UserIdentity {
 
        /**
         * Internal mechanics of testing a permission
-        *
-        * @deprecated since 1.34, use MediaWikiServices::getInstance()
-        * ->getPermissionManager()->userHasRight(...) instead
-        *
         * @param string $action
-        *
         * @return bool
         */
        public function isAllowed( $action = '' ) {
-               return MediaWikiServices::getInstance()->getPermissionManager()
-                       ->userHasRight( $this, $action );
+               if ( $action === '' ) {
+                       return true; // In the spirit of DWIM
+               }
+               // Use strict parameter to avoid matching numeric 0 accidentally inserted
+               // by misconfiguration: 0 == 'foo'
+               return in_array( $action, $this->getRights(), true );
        }
 
        /**
@@ -4786,27 +4883,45 @@ class User implements IDBAccessObject, UserIdentity {
        /**
         * Get the permissions associated with a given list of groups
         *
-        * @deprecated since 1.34, use MediaWikiServices::getInstance()->getPermissionManager()
-        *             ->getGroupPermissions() instead
-        *
         * @param array $groups Array of Strings List of internal group names
         * @return array Array of Strings List of permission key names for given groups combined
         */
        public static function getGroupPermissions( $groups ) {
-               return MediaWikiServices::getInstance()->getPermissionManager()->getGroupPermissions( $groups );
+               global $wgGroupPermissions, $wgRevokePermissions;
+               $rights = [];
+               // grant every granted permission first
+               foreach ( $groups as $group ) {
+                       if ( isset( $wgGroupPermissions[$group] ) ) {
+                               $rights = array_merge( $rights,
+                                       // array_filter removes empty items
+                                       array_keys( array_filter( $wgGroupPermissions[$group] ) ) );
+                       }
+               }
+               // now revoke the revoked permissions
+               foreach ( $groups as $group ) {
+                       if ( isset( $wgRevokePermissions[$group] ) ) {
+                               $rights = array_diff( $rights,
+                                       array_keys( array_filter( $wgRevokePermissions[$group] ) ) );
+                       }
+               }
+               return array_unique( $rights );
        }
 
        /**
         * Get all the groups who have a given permission
         *
-        * @deprecated since 1.34, use MediaWikiServices::getInstance()->getPermissionManager()
-        *             ->getGroupsWithPermission() instead
-        *
         * @param string $role Role to check
         * @return array Array of Strings List of internal group names with the given permission
         */
        public static function getGroupsWithPermission( $role ) {
-               return MediaWikiServices::getInstance()->getPermissionManager()->getGroupsWithPermission( $role );
+               global $wgGroupPermissions;
+               $allowedGroups = [];
+               foreach ( array_keys( $wgGroupPermissions ) as $group ) {
+                       if ( self::groupHasPermission( $group, $role ) ) {
+                               $allowedGroups[] = $group;
+                       }
+               }
+               return $allowedGroups;
        }
 
        /**
@@ -4816,17 +4931,15 @@ class User implements IDBAccessObject, UserIdentity {
         * User::isEveryoneAllowed() instead. That properly checks if it's revoked
         * from anyone.
         *
-        * @deprecated since 1.34, use MediaWikiServices::getInstance()->getPermissionManager()
-        * ->groupHasPermission(..) instead
-        *
         * @since 1.21
         * @param string $group Group to check
         * @param string $role Role to check
         * @return bool
         */
        public static function groupHasPermission( $group, $role ) {
-               return MediaWikiServices::getInstance()->getPermissionManager()
-                       ->groupHasPermission( $group, $role );
+               global $wgGroupPermissions, $wgRevokePermissions;
+               return isset( $wgGroupPermissions[$group][$role] ) && $wgGroupPermissions[$group][$role]
+                       && !( isset( $wgRevokePermissions[$group][$role] ) && $wgRevokePermissions[$group][$role] );
        }
 
        /**
@@ -4839,16 +4952,51 @@ class User implements IDBAccessObject, UserIdentity {
         * Specifically, session-based rights restrictions (such as OAuth or bot
         * passwords) are applied based on the current session.
         *
-        * @deprecated since 1.34, use MediaWikiServices::getInstance()->getPermissionManager()
-        *             ->isEveryoneAllowed() instead
-        *
+        * @since 1.22
         * @param string $right Right to check
-        *
         * @return bool
-        * @since 1.22
         */
        public static function isEveryoneAllowed( $right ) {
-               return MediaWikiServices::getInstance()->getPermissionManager()->isEveryoneAllowed( $right );
+               global $wgGroupPermissions, $wgRevokePermissions;
+               static $cache = [];
+
+               // Use the cached results, except in unit tests which rely on
+               // being able change the permission mid-request
+               if ( isset( $cache[$right] ) && !defined( 'MW_PHPUNIT_TEST' ) ) {
+                       return $cache[$right];
+               }
+
+               if ( !isset( $wgGroupPermissions['*'][$right] ) || !$wgGroupPermissions['*'][$right] ) {
+                       $cache[$right] = false;
+                       return false;
+               }
+
+               // If it's revoked anywhere, then everyone doesn't have it
+               foreach ( $wgRevokePermissions as $rights ) {
+                       if ( isset( $rights[$right] ) && $rights[$right] ) {
+                               $cache[$right] = false;
+                               return false;
+                       }
+               }
+
+               // Remove any rights that aren't allowed to the global-session user,
+               // unless there are no sessions for this endpoint.
+               if ( !defined( 'MW_NO_SESSION' ) ) {
+                       $allowedRights = SessionManager::getGlobalSession()->getAllowedUserRights();
+                       if ( $allowedRights !== null && !in_array( $right, $allowedRights, true ) ) {
+                               $cache[$right] = false;
+                               return false;
+                       }
+               }
+
+               // Allow extensions to say false
+               if ( !Hooks::run( 'UserIsEveryoneAllowed', [ $right ] ) ) {
+                       $cache[$right] = false;
+                       return false;
+               }
+
+               $cache[$right] = true;
+               return true;
        }
 
        /**
@@ -4867,14 +5015,19 @@ class User implements IDBAccessObject, UserIdentity {
 
        /**
         * Get a list of all available permissions.
-        *
-        * @deprecated since 1.34, use MediaWikiServices::getInstance()->getPermissionManager()
-        *             ->getAllPermissions() instead
-        *
         * @return string[] Array of permission names
         */
        public static function getAllRights() {
-               return MediaWikiServices::getInstance()->getPermissionManager()->getAllPermissions();
+               if ( self::$mAllRights === false ) {
+                       global $wgAvailableRights;
+                       if ( count( $wgAvailableRights ) ) {
+                               self::$mAllRights = array_unique( array_merge( self::$mCoreRights, $wgAvailableRights ) );
+                       } else {
+                               self::$mAllRights = self::$mCoreRights;
+                       }
+                       Hooks::run( 'UserGetAllRights', [ &self::$mAllRights ] );
+               }
+               return self::$mAllRights;
        }
 
        /**
index 66d9c7a..c398e49 100644 (file)
@@ -32,10 +32,7 @@ abstract class UserArray implements Iterator {
                if ( !Hooks::run( 'UserArrayFromResult', [ &$userArray, $res ] ) ) {
                        return null;
                }
-               if ( $userArray === null ) {
-                       $userArray = self::newFromResult_internal( $res );
-               }
-               return $userArray;
+               return $userArray ?? new UserArrayFromResult( $res );
        }
 
        /**
@@ -84,12 +81,4 @@ abstract class UserArray implements Iterator {
                );
                return self::newFromResult( $res );
        }
-
-       /**
-        * @param IResultWrapper $res
-        * @return UserArrayFromResult
-        */
-       protected static function newFromResult_internal( $res ) {
-               return new UserArrayFromResult( $res );
-       }
 }
index 5411616..ad6680d 100644 (file)
@@ -89,7 +89,7 @@
        "category_header": "صفحات تصنيف \"$1\"",
        "subcategories": "التصنيفات الفرعية",
        "category-media-header": "الوسائط في التصنيف \"$1\"",
-       "category-empty": "''هذا التصنيف لا يحتوي حاليا على صفحات أو وسائط.''",
+       "category-empty": "<em>هذا التصنيف لا يحتوي حاليا على صفحات أو وسائط.</em>",
        "hidden-category-category": "تصنيفات مخفية",
        "category-subcat-count": "{{PLURAL:$2|لا تصانيف فرعية في هذا التصنيف|هذا التصنيف فيه التصنيف الفرعي التالي فقط.|هذا التصنيف فيه {{PLURAL:$1||هذا التصنيف الفرعي|هذين التصنيفين الفرعيين|هذه ال$1 تصانيف الفرعية|هذه ال$1 تصنيفا فرعيا|هذه ال$1 تصنيف فرعي}}، من إجمالي $2.}}",
        "category-subcat-count-limited": "هذا التصنيف فيه {{PLURAL:$1||التصنيف الفرعي التالي|التصنيفين الفرعيين التاليين|$1 تصانيف فرعية تالية|$1 تصنيفا فرعيا تاليا|$1 تصنيف فرعي تالي}}.",
        "badaccess-groups": "الفعل الذي طلبته مقصور على المستخدمين في {{PLURAL:$2||مجموعة|واحدة من مجموعتي|واحدة من مجموعات}}: $1.",
        "versionrequired": "تلزم نسخة $1 من ميدياويكي",
        "versionrequiredtext": "تلزم النسخة $1 من ميدياويكي لاستعمال هذه الصفحة. انظر [[Special:Version|صفحة النسخة]]",
-       "youhavenewmessages": "توجد لديك $1 ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|توجد لديك}} $1 ($2).",
        "youhavenewmessagesmulti": "لديك رسائل جديدة على $1",
        "editsection": "بدّل",
        "editold": "بدّل",
        "nosuchspecialpage": "لا توجد صفحة خاصة بهذا الاسم",
        "nospecialpagetext": "<strong>لقد طلبت صفحة خاصة غير صحيحة.</strong>\n\nقائمة بالصفحات الخاصة الصحيحة يمكن إيجادها في [[Special:SpecialPages|{{int:specialpages}}]].",
        "databaseerror": "خطأ في قاعدة البيانات",
-       "laggedslavemode": "'''تحذير:''' الصفحة قد لا تحتوي على أحدث التحديثات.",
+       "laggedslavemode": "<strong>تحذير:</strong> الصفحة قد لا تحتوي على أحدث التحديثات.",
        "readonly": "قاعدة البيانات مغلقة",
        "enterlockreason": "أدخل سببا للغلق، متضمنا تقديرا لوقت رفع الغلق",
        "readonlytext": "قاعدة البيانات مغلقة حاليا أمام المدخلات الجديدة والتعديلات الأخرى، السبب غالبا ما يكون الصيانة، وستعود قاعدة البيانات للوضع الطبيعي قريبا.\n\nالإداري الذي أغلق قاعدة البيانات أعطى التفسير التالي: $1",
        "actionthrottledtext": "كإجراء ضد السبام، أنت ممنوع من إجراء هذا الفعل عدد كبير من المرات في فترة زمنية قصيرة، ولقد تجاوزت هذا الحد.\nمن فضلك حاول مرة ثانية خلال عدة دقائق.",
        "protectedpagetext": "هذه الصفحة تمت حمايتها لمنع التعديل.",
        "viewsourcetext": "يمكنك رؤية ونسخ مصدر هذه الصفحة:",
-       "viewyourtext": "يمكنك رؤية ونسخ مصدر ''' تعديلاتك ''' في هذه الصفحة:",
+       "viewyourtext": "يمكنك رؤية ونسخ مصدر <strong>تعديلاتك</strong> في هذه الصفحة.",
        "protectedinterface": "هذه الصفحة توفر نص الواجهة للبرنامج، وهي مقفلة لمنع التخريب.",
-       "editinginterface": "'''تحذير:''' أنت تقوم بتحرير صفحة تستخدم في الواجهة النصية للبرنامج.\nسوف تؤثر التغييرات على هذه الصفحة على مظهر واجهة المستخدم للمستخدمين الآخرين.\nللترجمات، من فضلك استخدم مشروع ترجمة ميدياويكي [https://translatewiki.net/wiki/Main_Page?setlang=ar translatewiki.net].",
+       "editinginterface": "<strong>تحذير:</strong> أنت تقوم بتحرير صفحة تستخدم في الواجهة النصية للبرنامج.\nسوف تؤثر التغييرات على هذه الصفحة على مظهر واجهة المستخدم للمستخدمين الآخرين.",
        "cascadeprotected": "تمت حماية هذه الصفحة من التعديل لأنها مدمجة في {{PLURAL:$1||الصفحة التالية، والتي|الصفحتين التاليتين، واللتين|الصفحات التالية، والتي}} تم استعمال خاصية \"حماية الصفحات المدمجة\" {{PLURAL:$1||بها|بهما|بها}}:\n$2",
-       "namespaceprotected": "لا تمتلك الصلاحية لتعديل الصفحات في نطاق '''$1'''.",
+       "namespaceprotected": "لا تمتلك الصلاحية لتعديل الصفحات في نطاق <strong>$1</strong>.",
        "customcssprotected": "أنت لا تمتلك السماح لتعديل صفحة الCSS هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.",
        "customjsprotected": "أنت لا تمتلك السماح لتعديل صفحة الجافاسكريبت هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.",
        "ns-specialprotected": "الصفحات الخاصة لا يمكن تعديلها.",
-       "titleprotected": "{{GENDER:$1|حمى|حمت}} [[User:$1|$1]] هذا العنوان من الإنشاء.\nالسبب المعطى هو <em>$2</em>.",
+       "titleprotected": "حمى [[User:$1|$1]] هذا العنوان من الإنشاء.\nالسبب المعطى هو <em>$2</em>.",
        "filereadonlyerror": "تعذر تعديل الملف \"$1\" لأن مستودع الملف \"$2\" في وضع القراءة فقط. \n\nالمدير الذي قام بغلقه قدم التفسير التالي: \"$3\".",
        "invalidtitle-knownnamespace": "عنوان غير صالح في النطاق «$2» مع نص «$3»",
        "invalidtitle-unknownnamespace": "عنوان غير صالح ذو نطاق غير معروف رقم $1 ونص «$2»",
        "exception-nologin": "غير مسجل الدخول",
-       "virus-badscanner": "ضبط سيء: ماسح فيروسات غير معروف: ''$1''",
+       "virus-badscanner": "ضبط سيء: ماسح فيروسات غير معروف: <em>$1</em>",
        "virus-scanfailed": "فشل المسح (كود $1)",
        "virus-unknownscanner": "مضاد فيروسات غير معروف:",
-       "logouttext": "'''أنت الآن غير مسجل الدخول.'''\n\nتستطيع المتابعة باستعمال {{SITENAME}} كمجهول، أو <span class='plainlinks'>[$1 الدخول مرة أخرى]</span> بنفس الاسم أو باسم آخر.\nمن الممكن أن ترى بعض الصفحات كما لو أنك مسجل الدخول، وذلك حتى تقوم بإفراغ الصفحات المختزنة في المتصفح لديك.",
+       "logouttext": "<strong>أنت الآن غير مسجل الدخول.</strong>\n\nمن الممكن أن ترى بعض الصفحات كما لو أنك مسجل الدخول، وذلك حتى تقوم بإفراغ الصفحات المختزنة في المتصفح لديك.",
        "yourname": "اسم المستخدم:",
        "yourpassword": "كلمة السر:",
        "userlogin-yourpassword-ph": "دخّل كلمة السر",
        "nocookiesfornew": "لم يتم إنشاء حساب المستخدم، لأننا لم نستطع تأكيد مصدره. \nتأكد من أن ملفات تعريف الارتباط (الكوكيز) مفعلة عندك، ثم أعد تحميل الصفحة وحاول مرة أخرى.",
        "noname": "لم تحدد اسم مستخدم صحيح.",
        "loginsuccesstitle": "تم الدخول بشكل صحيح",
-       "loginsuccess": "'''لقد قمت بتسجيل الدخول ل{{SITENAME}} باسم \"$1\".'''",
+       "loginsuccess": "<strong>لقد قمت بتسجيل الدخول ل{{SITENAME}} باسم \"$1\".</strong>",
        "nosuchuser": "لا يوجد مستخدم بالاسم \"$1\".\nأسماء المستخدمين حساسة لحالة الحروف.\nتأكد من إملاء الاسم، أو [[Special:CreateAccount|قم بإنشاء حساب جديد]].",
        "nosuchusershort": "لا يوجد مستخدم باسم $1\".\nتأكد من إملاء الاسم.",
        "nouserspecified": "يجب عليك تحديد اسم مستخدم.",
        "eauthentsent": "تم إرسال رسالة تأكيد إلكترونية إلى العنوان المسمى.\nحتى ترسل أي رسالة أخرى لذلك الحساب عليك أن تتبع التعليمات الواردة في الرسالة لتأكيد أن هذا الحساب هو لك بالفعل.",
        "throttled-mailpassword": "تم بالفعل إرسال تذكير بكلمة السر، في ال{{PLURAL:$1||ساعة الماضية|ساعتين الماضيتين|$1 ساعات الماضية|$1 ساعة الماضية}}.\nلمنع التخريب، سيتم إرسال تذكير واحد كل {{PLURAL:$1||ساعة|ساعتين|$1 ساعات|$1 ساعة}}.",
        "mailerror": "خطأ أثناء إرسال البريد: $1",
-       "acct_creation_throttle_hit": "Ø£Ù\86شأ Ø²Ù\88ار Ù\87Ø°Ù\87 Ø§Ù\84Ù\88Ù\8aÙ\83Ù\8a Ø¨Ø§Ø³ØªØ®Ø¯Ø§Ù\85 Ø¹Ù\86Ù\88اÙ\86 Ø¢Ù\8aبÙ\8aÙ\83 {{PLURAL:$1||حسابا Ù\88احدا|حسابÙ\8aÙ\86|$1 Ø­Ø³Ø§Ø¨Ø§Øª|$1 Ø­Ø³Ø§Ø¨Ø§|$1 Ø­Ø³Ø§Ø¨}} Ù\81Ù\8a Ø§Ù\84Ù\8aÙ\88Ù\85 Ø§Ù\84Ù\85اضÙ\8a، وهو الحد الأقصى المسموح به في هذه الفترة الزمنية.\nوكنتيجة لذلك، لن يتمكن الزوار الذين يستخدمون عنوان الأيبي هذا من إنشاء أي حسابات أخرى حاليا.",
+       "acct_creation_throttle_hit": "Ø£Ù\86شأ Ø²Ù\88ار Ù\87Ø°Ù\87 Ø§Ù\84Ù\88Ù\8aÙ\83Ù\8a Ø¨Ø§Ø³ØªØ®Ø¯Ø§Ù\85 Ø¹Ù\86Ù\88اÙ\86 Ø¢Ù\8aبÙ\8aÙ\83 {{PLURAL:$1||حسابا Ù\88احدا|حسابÙ\8aÙ\86|$1 Ø­Ø³Ø§Ø¨Ø§Øª|$1 Ø­Ø³Ø§Ø¨Ø§|$1 Ø­Ø³Ø§Ø¨}} Ù\81Ù\8a Ø¢Ø®Ø± $2، وهو الحد الأقصى المسموح به في هذه الفترة الزمنية.\nوكنتيجة لذلك، لن يتمكن الزوار الذين يستخدمون عنوان الأيبي هذا من إنشاء أي حسابات أخرى حاليا.",
        "emailauthenticated": "تم تأكيد بريدك الإلكتروني في $2 الساعة $3.",
        "emailnotauthenticated": "لم يتم التحقق من بريدك الإلكتروني.\nلن يتم إرسال رسائل لأي من الميزات التالية.",
        "noemailprefs": "حدد عنوان بريد إلكتروني في تفضيلاتك لهذه الخصائص لتعمل.",
        "cannotchangeemail": "تغيير عنوان البريد الإلكتروني لهذا الحساب غير ممكن على هذا الويكي",
        "emaildisabled": "لا يمكن إرسال رسائل البريد الإلكتروني من هذا الموقع.",
        "accountcreated": "تم إنشاء الحساب",
-       "accountcreatedtext": "تم إنشاء الحساب الخاص ب$1.",
+       "accountcreatedtext": "تم إنشاء الحساب الخاص ب[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|نقاش]]).",
        "createaccount-title": "إنشاء حساب في {{SITENAME}}",
        "createaccount-text": "شخص ما أنشأ حسابا لعنوان بريدك الإلكتروني في {{SITENAME}} ($4) بالاسم \"$2\"، كلمة السر \"$3\".\nينبغي عليك تسجيل الدخول وتغيير كلمة السر الخاصة بك الآن.\n\nيمكنك تجاهل هذه الرسالة، لو تم إنشاء هذا الحساب بالخطأ.",
-       "login-throttled": "لقد قمت بمحاولات دخول كثيرة جدا مؤخرا.\nمن فضلك انتظر قبل المحاولة مرة أخرى.",
+       "login-throttled": "لقد قمت بمحاولات دخول كثيرة جدا مؤخرا.\nمن فضلك انتظر $1 قبل المحاولة مرة أخرى.",
        "login-abort-generic": "لم ينجح ولوجك - إجهاض",
        "loginlanguagelabel": "اللغة: $1",
        "suspicious-userlogout": "رفض طلب خروجك لأنه يبدو كأنه أرسل عن طريق متصفح معطوب أو وسيط تخزين.",
        "showpreview": "أظهر معاينة",
        "showdiff": "ورّي التبديلات",
        "anoneditwarning": "'''ردّ بالك:''' راك ما دخلتش للحساب متاعك.\nإذا بدّلت حاجة، ينجّموا العباد الكلّ يعرفوا الإي پاي متاعك. أما إذا <strong>[$1 دخلت لحسابك]</strong> ولّا <strong>[$2 عملت حساب جديد]</strong>، التبديلات متاعك الكل بش يتنسبوا لإسم المستعمل متاعك، و بخلاف هذا تنجّم تعمل برشا حوايج ما تنجّمش تعملهم وقت إلّي تبدّل حاجة بالإي پاي متاعك.",
-       "anonpreviewwarning": "''أنت غير مسجل الدخول. الحفظ سيسجل عنوان الأيبي الخاص بك في تاريخ هذه الصفحة.''",
-       "missingsummary": "'''تنبيه:''' لم تقم بكتابة ملخص للتعديل.\nإذا قمت بضغط حفظ الصفحة مرة أخرى، فيتم حفظ تعديلك بدون ملخص.",
+       "anonpreviewwarning": "<em>أنت غير مسجل الدخول. الحفظ سيسجل عنوان الأيبي الخاص بك في تاريخ هذه الصفحة.</em>",
+       "missingsummary": "<strong>تنبيه:</strong> لم تقم بكتابة ملخص للتعديل.\nإذا قمت بضغط \"$1\" مرة أخرى، فسيتم حفظ تعديلك بدون ملخص.",
        "missingcommenttext": "من فضلك أدخل تعليقا في الأسفل.",
-       "missingcommentheader": "'''تنبيه:''' لم تقم بوضع موضوع/عنوان لهذا التعليق.\nإذا قمت بالضغط على \"$1\" مجددا، سيتم حفظ تعليقك بدون عنوان.",
+       "missingcommentheader": "<strong>تنبيه:</strong> لم تقم بوضع موضوع/عنوان لهذا التعليق.\nإذا قمت بالضغط على \"$1\" مجددا، سيتم حفظ تعليقك بدون عنوان.",
        "summary-preview": "معاينة الملخص:",
        "subject-preview": "معاينة للموضوع/العنوان:",
        "blockedtitle": "المستخدم ممنوع",
-       "blockedtext": "'''اسم المستخدم أو عنوان الأيبي الخاص بك تم منعه.'''\n\nقام بالمنع $1.\nسبب المنع هو: ''$2''.\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nيمكنك الاتصال ب$1 أو مع أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] للنقاش حول المنع.\nلا يمكنك استخدام خاصية 'مراسلة هذا المستخدم' إلا إذا كنت قد وضعت عنوان بريدي صحيح في [[Special:Preferences|تفضيلات حسابك]] ولم يتم منعك من استخدامها.\nعنوان الأيبي الخاص بك حاليا هو $3، ورقم المنع هو #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
-       "autoblockedtext": "تم منع عنوان آيبيك تلقائيا لأن مستخدما آخرا ممنوعا بواسطة $1 استخدمه.\nالسبب الممنوح هو التالي:\n\n:''$2''\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nيمكنك أن تتصل ب $1 أو أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] الآخرين لمناقشة المنع.\n\nلاحظ أنه لا يمكنك استخدام خاصية \"إرسال رسالة لهذا المستخدم\" إلا لو كان لديك عنوان بريد إلكتروني صحيح مسجل في [[Special:Preferences|تفضيلاتك]] ولم يتم منعك من استخدامه.\n\nعنوان آيبيك الحالي $3، ورقم المنع #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
+       "blockedtext": "<strong>اسم المستخدم أو عنوان الأيبي الخاص بك تم منعه.</strong>\n\nقام بالمنع $1.\nسبب المنع هو: <em>$2</em>.\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nيمكنك الاتصال ب$1 أو مع أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] للنقاش حول المنع.\nلا يمكنك استخدام خاصية \"{{int:emailuser}}\" إلا إذا كنت قد وضعت عنوان بريدي صحيح في [[Special:Preferences|تفضيلات حسابك]] ولم يتم منعك من استخدامها.\nعنوان الأيبي الخاص بك حاليا هو $3، ورقم المنع هو #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
+       "autoblockedtext": "تم منع عنوان آيبيك تلقائيا لأن مستخدما آخرا ممنوعا بواسطة $1 استخدمه.\nالسبب الممنوح هو التالي:\n\n:<em>$2</em>\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nيمكنك أن تتصل ب $1 أو أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] الآخرين لمناقشة المنع.\n\nلاحظ أنه لا يمكنك استخدام خاصية \"{{int:emailuser}}\" إلا لو كان لديك عنوان بريد إلكتروني صحيح مسجل في [[Special:Preferences|تفضيلاتك]] ولم يتم منعك من استخدامه.\n\nعنوان آيبيك الحالي $3، ورقم المنع #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
        "blockednoreason": "لا سبب معطى",
        "whitelistedittext": "يجب عليك $1 لتتمكن من تعديل الصفحات.",
        "confirmedittext": "يجب عليك تأكيد بريدك الإلكتروني قبل تعديل الصفحات.\nمن فضلك اكتب وأكد بريدك الإلكتروني من خلال [[Special:Preferences|تفضيلاتك]].",
        "loginreqlink": "الولوج",
        "loginreqpagetext": "يجب عليك $1 لتشاهد صفحات أخرى.",
        "accmailtitle": "تم إرسال كلمة السر.",
-       "accmailtext": "كلمة سر مولدة عشوائيا ل [[User talk:$1|$1]] تم إرسالها إلى $2.\n\nكلمة السر لهذا الحساب الجديد يمكن تغييرها في صفحة ''[[Special:ChangePassword|تغيير كلمة السر]]'' عند تسجيل الدخول.",
+       "accmailtext": "كلمة سر مولدة عشوائيا ل[[User talk:$1|$1]] تم إرسالها إلى $2.\n\nكلمة السر لهذا الحساب الجديد يمكن تغييرها في صفحة <em>[[Special:ChangePassword|تغيير كلمة السر]]</em> عند تسجيل الدخول.",
        "newarticle": "(جديد)",
-       "newarticletext": "لقد تبعت وصلة لصفحة لم يتم إنشائها بعد.\nلإنشاء هذه الصفحة ابدأ الكتابة في الصندوق بالأسفل (انظر في [$1 صفحة المساعدة] للمزيد من المعلومات).\nإذا كانت زيارتك لهذه الصفحة بالخطأ، اضغط على زر ''رجوع'' في متصفح الإنترنت لديك.",
-       "anontalkpagetext": "----''هذه صفحة نقاش لمستخدم مجهول لم يقم بإنشاء حساب بعد أو لا يستعمل ذلك الحساب.\nلذا فيجب علينا استعمال رقم الأيبي للتعرف عليه/عليها.\nمثل هذا العنوان يمكن أن يشترك فيه عدة مستخدمين.\nلو كنت مستخدما مجهولا وتشعر بأن تعليقات لا تخصك تم توجيهها إليك، من فضلك [[Special:CreateAccount|أنشئ حسابا]] أو [[Special:UserLogin|سجل الدخول]] لتجنب الارتباك المستقبلي مع مستخدمين مجهولين آخرين.''",
+       "newarticletext": "لقد تبعت وصلة لصفحة لم يتم إنشائها بعد.\nلإنشاء هذه الصفحة ابدأ الكتابة في الصندوق بالأسفل (انظر في [$1 صفحة المساعدة] للمزيد من المعلومات).\nإذا كانت زيارتك لهذه الصفحة بالخطأ، اضغط على زر <strong>back</strong> في متصفح الإنترنت لديك.",
+       "anontalkpagetext": "----\n<em>هذه صفحة نقاش لمستخدم مجهول لم يقم بإنشاء حساب بعد أو لا يستعمل ذلك الحساب.</em>\nلذا فيجب علينا استعمال رقم الأيبي للتعرف عليه/عليها.\nمثل هذا العنوان يمكن أن يشترك فيه عدة مستخدمين.\nلو كنت مستخدما مجهولا وتشعر بأن تعليقات لا تخصك تم توجيهها إليك، من فضلك [[Special:CreateAccount|أنشئ حسابا]] أو [[Special:UserLogin|سجل الدخول]] لتجنب الارتباك المستقبلي مع مستخدمين مجهولين آخرين.",
        "noarticletext-nopermission": "لا يوجد حاليا أي نص في هذه الصفحة.يمكنك [[Special:Search/{{PAGENAME}}|البحث عن عنوان هذه الصفحة]] في الصفحات الأخرى,أو <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} بحث السجلات المتصلة]</span>.",
        "userpage-userdoesnotexist": "حساب المستخدم \"<nowiki>$1</nowiki>\" غير مسجل.\nمن فضلك تأكد أنك تريد إنشاء/تعديل هذه الصفحة.",
        "userpage-userdoesnotexist-view": "حساب المستخدم \"$1\" غير مسجل.",
        "blocked-notice-logextract": "هذا المستخدم ممنوع حاليا.\nآخر مدخلة في سجل المنع موفرة بالأسفل كمرجع:",
-       "clearyourcache": "'''ملاحظة:''' بعد الحفظ, أنت ربما تحتاج إلى إفراغ كاش متصفحك لرؤية التغييرات.\n* '''فيرفكس / سفاري:''' اضغط ''Shift'' أثناء ضغط ''Reload'', أو اضغط أيا من ''Ctrl-F5'' أو ''Ctrl-R'' (''⌘-R'' على ماك)\n* '''جوجل كروم:''' اضغط ''Ctrl-Shift-R'' (''⌘-Shift-R'' على ماك)\n* '''إنترنت إكسبلورر:''' اضغط ''Ctrl'' أثناء ضغط ''Refresh''، أو اضغط ''Ctrl-F5''\n* '''كنكرر:''' اضغط ''Reload'' أو اضغط ''F5''\n* '''أوبرا:''' أفرغ الكاش في ''Tools → Preferences''",
-       "usercssyoucanpreview": "'''ملاحظة:''' استعمل زر \"{{int:showpreview}}\" لتجربة CSS الجديد قبل حفظ الصفحة.",
-       "userjsyoucanpreview": "'''ملاحظة:''' استعمل زر \"{{int:showpreview}}\" لتجربة جافاسكربت الجديدة قبل حفظ الصفحة.",
-       "usercsspreview": "'''تذكر أنك تقوم بعرض الأنماط المتراصة (CSS) الخاصة بك فقط\nلم يتم حفظها بعد!'''",
-       "userjspreview": "'''تذكر أنك فقط تجرب/تعاين جافاسكربت.'''\n'''لم يتم الحفظ بعد!'''",
-       "sitecsspreview": "''' تذكر أنك فقط في وضع المعاينة لهذا CSS ''' \n''' ولم يتم حفظ الصفحة بعد! '''",
-       "sitejspreview": "''' تذكر أنك فقط في وضع المعاينة لكود JavaScript هذا''' \n''' ولم يتم حفظه بعد! '''",
-       "userinvalidconfigtitle": "'''تحذير:''' لا توجد واجهة  \"$1\".\nتذكر أن ملفات ال.css و ال.js تستخدم حروف صغيرة في العنوان ، كمثال {{ns:user}}:Foo/vector.css و ليس {{ns:user}}:Foo/Vector.css.",
+       "clearyourcache": "<strong>ملاحظة:</strong> بعد الحفظ، أنت قد تحتاج إلى إفراغ الكاش الخاص بمتصفحك لرؤية التغييرات.\n* <strong>فايرفوكس / سافاري:</strong> أمسك <em>Shift</em> أثناء ضغط <em>Reload</em>، أو اضغط على إما <em>Ctrl-F5</em> أو <em>Ctrl-R</em> (<em>⌘-R</em> على ماك)\n* <strong>جوجل كروم:</strong> اضغط <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> على ماك)\n* <strong>إنترنت إكسبلورر:</strong> أمسك <em>Ctrl</em> أثناء ضغط <em>Refresh</em>، أو اضغط <em>Ctrl-F5</em>\n* <strong>أوبرا:</strong> اذهب إلى <em>Menu → Settings</em> (<em>Opera → Preferences</em> على ماك) ثم إلى <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
+       "usercssyoucanpreview": "<strong>ملاحظة:</strong> استعمل زر \"{{int:showpreview}}\" لتجربة CSS الجديد قبل حفظ الصفحة.",
+       "userjsyoucanpreview": "<strong>ملاحظة:</strong> استعمل زر \"{{int:showpreview}}\" لتجربة الجافاسكريبت الجديدة قبل حفظ الصفحة.",
+       "usercsspreview": "<strong>تذكر أنك تقوم بعرض الأنماط المتراصة (CSS) الخاصة بك فقط.\nلم يتم حفظها بعد!</strong>",
+       "userjspreview": "<strong>تذكر أنك فقط تجرب/تعاين جافاسكربت.\nلم يتم الحفظ بعد!</strong>",
+       "sitecsspreview": "<strong>تذكر أنك فقط في وضع المعاينة لهذا CSS. \nلم يتم حفظ الصفحة بعد!</strong>",
+       "sitejspreview": "<strong>تذكر أنك فقط في وضع المعاينة لكود JavaScript هذا.\nلم يتم حفظه بعد!</strong>",
+       "userinvalidconfigtitle": "<strong>تحذير:</strong> T لا توجد واجهة \"$1\".\nصفحات Custom .css و.json و.js تستخدم حروفا صغيرة في العنوان، مثل {{ns:user}}:Foo/vector.css على عكس {{ns:user}}:Foo/Vector.css.",
        "updated": "(محدثة)",
-       "note": "'''ملاحظة:'''",
-       "previewnote": "'''تذكر أن هذه مجرد معاينة أولية.'''\nلم تحفظ تغييراتك إلى الآن!",
+       "note": "<strong>ملاحظة:</strong>",
+       "previewnote": "<strong>تذكر أن هذه مجرد معاينة أولية.</strong>\nلم تحفظ تغييراتك إلى الآن!",
        "continue-editing": "أكمل التحرير",
        "previewconflict": "هذا العرض يوضح النص الموجود في صندوق التحرير العلوي والذي سيظهر إذا اخترت الحفظ.",
-       "session_fail_preview": "'''عذرا! لم نتمكن من حفظ التعديلات التي قمت بها نتيجة لضياع بيانات هذه الجلسة.\nمن فضلك حاول مرة أخرى.\nفي حال استمرار المشكلة حاول أن تقوم [[Special:UserLogout|بالخروج]] ومن ثم الولوج مرة أخرى.'''",
-       "session_fail_preview_html": "'''عذرا! لم نستطع معالجة تعديلك بسبب فقدان بيانات الجلسة.'''\n\n''لأن {{SITENAME}} بها HTML الخام مفعلة، العرض المسبق مخفي كاحتياط ضد هجمات الجافا سكريبت.''\n\n'''إذا كانت هذه محاولة تعديل صادقة، من فضلك حاول مرة أخرى.\nإذا كانت مازالت لا تعمل، حاول [[Special:UserLogout|تسجيل الخروج]] ثم تسجيل الدخول مجددا.'''",
+       "session_fail_preview": "عذرا! لم نتمكن من حفظ التعديلات التي قمت بها نتيجة لضياع بيانات هذه الجلسة.\n\nربما تكون قد تم تسجيل خروجك. <strong>من فضلك تأكد من أنك مسجل الدخول وحاول مرة أخرى</strong>.\nفي حال استمرار المشكلة حاول أن تقوم [[Special:UserLogout|بالخروج]] ومن ثم الولوج مرة أخرى. و تأكد من أن متصفحك يسمح بالكوكيز من  هذا الموقع.",
+       "session_fail_preview_html": "عذرا! لم نستطع معالجة تعديلك بسبب فقدان بيانات الجلسة.\n\n<em>لأن {{SITENAME}} بها HTML الخام مفعلة، العرض المسبق مخفي كاحتياط ضد هجمات الجافا سكريبت.</em>\n\n<strong>إذا كانت هذه محاولة تعديل صادقة، من فضلك حاول مرة أخرى.</strong>\nإذا كانت مازالت لا تعمل، حاول [[Special:UserLogout|تسجيل الخروج]] ثم تسجيل الدخول مجددا. و تأكد من أن متصفحك يسمح بالكوكيز من هذا الموقع.",
        "token_suffix_mismatch": "<strong>تعديلك تم رفضه لأن عميلك أخطأ في علامات الترقيم في نص التعديل.</strong>\nتم رفض التعديل لمنع فساد نص المقالة.\nهذا يحدث أحيانا عندما تستخدم خدمة بروكسي مجهول معيبة مبنية على الويب.",
-       "edit_form_incomplete": "'''بعض أجزاء من نموذج التعديل لم تصل إلى الخادم؛ تأكد من أن تعديلاتك لم تمس وحاول مجددا.'''",
+       "edit_form_incomplete": "<strong>بعض أجزاء من نموذج التعديل لم تصل إلى الخادم؛ تأكد من أن تعديلاتك لم تمس وحاول مجددا.</strong>",
        "editing": "تبديل $1",
        "creating": "عملان «$1»",
        "editingsection": "تبديل $1 (طرف)",
        "editingcomment": "تعديل $1 (قسم جديد)",
        "editconflict": "تضارب في التحرير: $1",
-       "explainconflict": "لقد عدل شخص آخر هذه الصفحة بعد أن بدأت أنت بتحريرها.\nصندوق النصوص العلوي يحتوي على النص الموجود حاليا في الصفحة.\nوالتغييرات التي قمت أنت بها موجودة في الصندوق في أسفل الصفحة.\nيجب أن تقوم بدمج تغييراتك في النص الموجود حاليا.\n'''فقط''' ما هو موجود في الصندوق العلوي هو ما سيتم حفظه عند الضغط على زر \"حفظ الصفحة\".",
+       "explainconflict": "لقد عدل شخص آخر هذه الصفحة بعد أن بدأت أنت بتحريرها.\nصندوق النصوص العلوي يحتوي على النص الموجود حاليا في الصفحة.\nالتعديلات التي أجريتها أنت معروضة في الصندوق أسفله.\nويلزم دمجها في النص الموجود حاليا.\n<strong>لن يحفظ</strong> بعد الضغط على زر \"$1\" إلا ما هو موجود في الصندوق العلوي.",
        "yourtext": "نصك",
        "storedversion": "النسخة المخزنة",
-       "editingold": "''' تحذير: أنت تقوم الآن بتحرير نسخة قديمة من هذه الصفحة.\nإذا قمت بحفظها، ستفقد كافة التغييرات التي حدثت بعد هذه النسخة. '''",
+       "editingold": "<strong>تحذير: أنت تقوم الآن بتحرير نسخة قديمة من هذه الصفحة.</strong>\nإذا قمت بحفظها، ستفقد كافة التغييرات التي حدثت بعد هذه النسخة.",
        "yourdiff": "الفروق",
-       "copyrightwarning": "من فضلك لاحظ أن جميع المساهمات ل {{SITENAME}} خاضعة وصادرة تحت ترخيص $2 (انظر في $1 للمزيد من التفاصيل)\nإذا لم ترد أن تخضع كتابتك للتعديل والتوزيع الحر، لا تضعها هنا<br />.\nكما أنك تتعهد بأنك قمت بكتابة ما هو موجود بنفسك، أو قمت بنسخها من مصدر يخضع ضمن الملكية العامة، أو مصدر حر آخر.\n'''لا ترسل أي عمل ذي حقوق محفوظة بدون الإذن من صاحب الحق'''.",
-       "copyrightwarning2": "من فضلك لاحظ أن جميع المساهمات في {{SITENAME}} يمكن أن تعدل أو تتغير أو تزال من قبل المساهمين الآخرين.\nإذا لم تكن ترغب أن تعدل مشاركاتك بهذا الشكل، لا تضعها هنا.<br />\nأنت تقر أيضا أنك كتبت هذا بنفسك، أو نسخته من مصدر يخضع للملكية العامة، أو مصدر حر آخر (انظر $1 للتفاصيل).\n'''لا تضف أي عمل ذي حقوق محفوظة بدون تصريح!'''",
-       "longpageerror": "'''خطأ: النص الذي قمت بإدخاله {{PLURAL:$1|واحد كيلوبايت|$1 كيلوبيات}} أطول, وهو أطول من الحد الأقصى {{PLURAL:$2|واحد كيلوبايت|$2 كيلوبايت}}.'''\nو يتعذر حفظه.",
-       "readonlywarning": "'''تحذير: لقد أغلقت قاعدة البيانات للصيانة، لذلك لن تتمكن من حفظ التعديلات التي قمت بها حاليا.\nإذا رغبت بإمكانك أن تنسخ النص الذي تعمل عليه وتحفظه في ملف نصي إلى وقت لاحق.'''\n\nالإداري الذي أغلقها أعطى هذا التفسير: $1",
-       "protectedpagewarning": "'''تحذير: تمت حماية هذه الصفحة حتى يمكن للمستخدمين ذوي الصلاحيات الإدارية فقط تعديلها.'''\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
-       "semiprotectedpagewarning": "'''ملاحظة:''' تمت حماية هذه الصفحة بحيث يمكن للمستخدمين المسجلين فقط تعديلها.\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
-       "cascadeprotectedwarning": "'''تحذير:''' تمت حماية هذه الصفحة بحيث يستطيع المستخدمون ذوو الصلاحيات الإدارية فقط تعديلها، وذلك لأنها مدمجة في {{PLURAL:$1||الصفحة التالية والتي تمت حمايتها|الصفحتين التاليتين واللتين تمت حمايتها|الصفحات التالية والتي تمت حمايتها}} بخاصية \"حماية الصفحات المدمجة\":",
-       "titleprotectedwarning": "'''تحذير:  هذه الصفحة تمت حمايتها بحيث أن [[Special:ListGroupRights|صلاحيات معينة]] مطلوبة لإنشائها.'''\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
+       "copyrightwarning": "من فضلك لاحظ أن جميع المساهمات ل{{SITENAME}} خاضعة وصادرة تحت ترخيص $2 (انظر $1 للمزيد من التفاصيل).\nإذا لم ترد أن تخضع كتابتك للتعديل والتوزيع الحر، لا تضعها هنا<br />.\nكما أنك تتعهد بأنك قمت بكتابة ما هو موجود بنفسك، أو قمت بنسخها من مصدر يخضع ضمن الملكية العامة، أو مصدر حر آخر.\n<strong>لا ترسل أي عمل ذي حقوق محفوظة بدون الإذن من صاحب الحق!</strong>",
+       "copyrightwarning2": "من فضلك لاحظ أن جميع المساهمات في {{SITENAME}} يمكن أن تعدل أو تتغير أو تزال من قبل المساهمين الآخرين.\nإذا لم تكن ترغب أن تعدل مشاركاتك بهذا الشكل، لا تضعها هنا.<br />\nأنت تقر أيضا أنك كتبت هذا بنفسك، أو نسخته من مصدر يخضع للملكية العامة، أو مصدر حر آخر (انظر $1 للتفاصيل).\n<strong>لا تضف أي عمل ذي حقوق محفوظة بدون تصريح!</strong>",
+       "longpageerror": "<strong>خطأ: النص الذي قمت بإدخاله {{PLURAL:$1|واحد كيلوبايت|$1 كيلوبيات}} أطول, وهو أطول من الحد الأقصى {{PLURAL:$2|واحد كيلوبايت|$2 كيلوبايت}}.</strong>\nلا بمكن حفظه.",
+       "readonlywarning": "<strong>تحذير: لقد أغلقت قاعدة البيانات للصيانة، لذلك لن تتمكن من حفظ التعديلات التي قمت بها حاليا.\nإذا رغبت بإمكانك أن تنسخ النص الذي تعمل عليه وتحفظه في ملف نصي إلى وقت لاحق.</strong>\n\nإداري النظام الذي أغلقها أعطى هذا التفسير: $1",
+       "protectedpagewarning": "<strong>تحذير: تمت حماية هذه الصفحة حتى يمكن للمستخدمين ذوي الصلاحيات الإدارية فقط تعديلها.</strong>\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
+       "semiprotectedpagewarning": "<strong>ملاحظة:</strong> هذه الصفحة محمية بحيث يمكن للمستخدمين المؤكدين تلقائيًّا فقط تعديلها،\nأحدث مدخلة سجل معروضة بالأسفل كمرجع:",
+       "cascadeprotectedwarning": "<strong>تحذير:</strong> تمت حماية هذه الصفحة بحيث يستطيع المستخدمون [[Special:ListGroupRights|ذوو صلاحيات محددة]] فقط تعديلها، وذلك لأنها مدمجة في {{PLURAL:$1||الصفحة التالية والتي تمت حمايتها|الصفحتين التاليتين واللتين تمت حمايتها|الصفحات التالية والتي تمت حمايتها}} بخاصية \"حماية الصفحات المدمجة\":",
+       "titleprotectedwarning": "<strong>تحذير: هذه الصفحة تمت حمايتها بحيث أن [[Special:ListGroupRights|صلاحيات معينة]] مطلوبة لإنشائها.</strong>\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
        "templatesused": "{{PLURAL:$1||القالب المستعملة|القوالب المستعملة}} في هذي الپاج:",
        "templatesusedpreview": "{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذه المعاينة:",
        "templatesusedsection": "{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذا القسم:",
        "permissionserrors": "أخطاء السماحات",
        "permissionserrorstext": "لا تمتلك الصلاحية لفعل هذا، {{PLURAL:$1||للسبب التالي|للسببين التاليين|للأسباب التالية}}:",
        "permissionserrorstext-withaction": "ما عندكش الحق بش $2، على خاطر{{PLURAL:$1||ها السبب|ها الأسباب}}:",
-       "recreate-moveddeleted-warn": "'''تحذير: أنت تقوم بإعادة إنشاء صفحة سبق حذفها.'''\n\nيجب عليك التيقن من أن الاستمرار بتحرير هذه الصفحة ملائم.\nسجلا الحذف والنقل لهذه الصفحة معروضان هنا للتيسير:",
+       "recreate-moveddeleted-warn": "<strong>تحذير: أنت تعيد إنشاء صفحة سبق حذفها.</strong>\n\nيجب عليك التيقن من أن الاستمرار بتحرير هذه الصفحة ملائم.\nسجلا الحذف والنقل لهذه الصفحة معروضان هنا للتيسير:",
        "moveddeleted-notice": "ها الپاج تفسخت.\nسجلا الحذف والنقل للصفحة معروضان بالأسفل كمرجع.",
        "log-fulllog": "أظهر السجل الكامل",
        "edit-hook-aborted": "التعديل تم تركه بواسطة الخطاف.\nلم يعط تفسيرا.",
        "edit-no-change": "تعديلك تم تجاهله، لأنه لم يحدث أي تعديل للنص.",
        "edit-already-exists": "لم يمكن إنشاء صفحة جديدة.\nهي موجودة بالفعل.",
        "defaultmessagetext": "نص الرسالة الافتراضي",
-       "expensive-parserfunction-warning": "'''تحذير:''' هذه الصفحة تحتوي على استدعاءات دالة محلل كثيرة مكلفة.\n\nينبغي أن تكون أقل من {{PLURAL:$2||استدعاء واحد|استدعاءين|$2 استدعاءات|$2 استدعاء}}، يوجد الآن {{PLURAL:$1|استدعاء واحد|استدعاءان|$2 استدعاءات|$2 استدعاء}}.",
+       "expensive-parserfunction-warning": "<strong>تحذير:</strong> هذه الصفحة تحتوي على استدعاءات دالة محلل كثيرة مكلفة.\n\nينبغي أن تكون أقل من {{PLURAL:$2||استدعاء واحد|استدعاءين|$2 استدعاءات|$2 استدعاء}}، يوجد الآن {{PLURAL:$1|استدعاء واحد|استدعاءان|$2 استدعاءات|$2 استدعاء}}.",
        "expensive-parserfunction-category": "صفحات يوجد بها استدعاءات دوال محلل كثيرة ومكلفة",
-       "post-expand-template-inclusion-warning": "'''تحذير:''' حجم تضمين القالب كبير جدا.\nبعض القوالب لن تضمن.",
+       "post-expand-template-inclusion-warning": "<strong>تحذير:</strong> حجم تضمين القالب كبير جدا.\nبعض القوالب لن تضمن.",
        "post-expand-template-inclusion-category": "الصفحات حيث تم تجاوز حجم تضمين القالب",
-       "post-expand-template-argument-warning": "'''تحذير:''' هذه الصفحة تحتوي على عامل قالب واحد على الأقل له حجم تمدد كبير جدا.\nهذه العوامل تم حذفها.",
+       "post-expand-template-argument-warning": "<strong>تحذير:</strong> هذه الصفحة تحتوي على عامل قالب واحد على الأقل له حجم تمدد كبير جدا.\nهذه العوامل تم حذفها.",
        "post-expand-template-argument-category": "صفحات تحتوي مدخلات القالب المحذوفة",
        "parser-template-loop-warning": "تم كشف حلقة قالب: [[$1]]",
        "parser-template-recursion-depth-warning": "تم تجاوز حد عمق فرد القوالب ($1)",
        "undo-failure": "لم يمكن استرجاع التعديل بسبب تعديلات متعارضة تمت على الصفحة.",
        "undo-norev": "فشل في الرجوع عن التعديل حيث أنه غير موجود أو تم حذفه.",
        "undo-summary": "الرجوع عن التعديل $1 بواسطة [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]])",
-       "cantcreateaccount-text": "إنشاء الحسابات من عنوان الأيبي هذا ('''$1''') تم منعه بواسطة [[User:$3|$3]].\n\nالسبب المعطى بواسطة $3 هو ''$2''",
+       "cantcreateaccount-text": "إنشاء الحسابات من عنوان الأيبي هذا (<strong>$1</strong>) تم منعه بواسطة [[User:$3|$3]].\n\nالسبب المعطى بواسطة $3 هو <em>$2</em>",
        "viewpagelogs": "اعرض سجلات هذه الصفحة",
        "nohistory": "لا يوجد تاريخ للتعديلات لهذه الصفحة.",
        "currentrev": "المراجعة الحالية",
        "currentrev-asof": "المراجعة الحالية بتاريخ $1",
-       "revision-info": "مراجعة $1 بواسطة $2",
+       "revision-info": "مراجعة $1 بواسطة {{GENDER:$6|$2}}$7",
        "previousrevision": "→ مراجعة أقدم",
        "nextrevision": "مراجعة أجدد ←",
        "currentrevisionlink": "المراجعة الحالية",
        "last": "السابق",
        "page_first": "الأولى",
        "page_last": "الأخيرة",
-       "histlegend": "اختيار الفرق: علم على صناديق النسخ للمقارنة واضغط قارن بين النسخ المختارة أو الزر بالأسفل.<br />\nمفتاح: (الحالي) = الفرق مع النسخة الحالية\n(السابق) = الفرق مع النسخة السابقة، ط = تغيير طفيف",
+       "histlegend": "اختيار الفرق: علم على صناديق النسخ للمقارنة واضغط قارن بين النسخ المختارة أو الزر بالأسفل.<br />\nمفتاح: <strong>({{int:cur}})</strong> = الفرق مع النسخة الحالية، <strong>({{int:last}})</strong> = الفرق مع النسخة السابقة، <strong>{{int:minoreditletter}}</strong> = تغيير طفيف.",
        "history-fieldset-title": "تصفح التاريخ",
        "history-show-deleted": "المحذوفة فقط",
        "histfirst": "أول",
        "rev-deleted-user": "(اسم المستخدم تمت إزالته)",
        "rev-deleted-event": "(فعل السجل تمت إزالته)",
        "rev-deleted-user-contribs": "[اسم المستخدم أو عنوان الأيبي تمت إزالته - التعديل مخفي من المساهمات]",
-       "rev-deleted-text-permission": "'''حُذِفت''' مراجعة هذه الصفحة.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
+       "rev-deleted-text-permission": "<strong>حُذِفت</strong> مراجعة هذه الصفحة.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
        "rev-deleted-text-unhide": "<strong>حُذِفت</strong> مراجعة الصفحة هذه.\nيمكن العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].\nمازال بإمكانك [$1 رؤية هذه المراجعة] إذا أردت المتابعة.",
-       "rev-suppressed-text-unhide": "'''أُخفيت''' مراجعة الصفحة هذه.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].\nبإمكانك [$1 رؤية هذه المراجعة] إذا أردت المتابعة.",
-       "rev-deleted-text-view": "'''حُذِفت''' مراجعة هذه الصفحة.\nيمكنك رؤيتها؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
-       "rev-suppressed-text-view": "'''أُخفيت''' مراجعة الصفحة هذه.\nيمكنك رؤيتها؛ ويمكنك العثور على التفاصيل في  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].",
-       "rev-deleted-no-diff": "لا يمكنك رؤية هذا الفرق لأن إحدى المراجعات '''حُذِفت'''.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
-       "rev-suppressed-no-diff": "ليس بإمكانك مشاهدة هذا الفرق لأن إحدى المراجعات '''حذفت'''.",
-       "rev-deleted-unhide-diff": "'''حُذِفت''' إحدى مراجعتي هذا الفرق.\nيمكن العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].\nبإمكانك [$1 رؤية هذا الفرق] إذا أردت المتابعة.",
-       "rev-suppressed-unhide-diff": "'''أُخفيت''' إحدى مراجعتي هذا الفرق.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].\nبإمكانك [$1 رؤية هذا الفرق] إذا أردت المتابعة.",
-       "rev-deleted-diff-view": "'''حُذِفت''' إحدى مراجعتي هذا الفرق.\nيمكنك رؤية الفرق؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
-       "rev-suppressed-diff-view": "'''أُخفيت''' إحدى مراجعتي هذا الفرق.\nيمكنك رؤية هذا الفرق؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].",
+       "rev-suppressed-text-unhide": "<strong>أُخفيت</strong> مراجعة الصفحة هذه.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].\nبإمكانك [$1 رؤية هذه المراجعة] إذا أردت المتابعة.",
+       "rev-deleted-text-view": "<strong>حُذِفت</strong> مراجعة هذه الصفحة.\nيمكنك رؤيتها؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
+       "rev-suppressed-text-view": "<strong>أُخفيت</strong> مراجعة الصفحة هذه.\nيمكنك رؤيتها؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].",
+       "rev-deleted-no-diff": "لا يمكنك رؤية هذا الفرق لأن إحدى المراجعات <strong>حُذِفت</strong>.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
+       "rev-suppressed-no-diff": "ليس بإمكانك مشاهدة هذا الفرق لأن إحدى المراجعات <strong>حذفت</strong>.",
+       "rev-deleted-unhide-diff": "<strong>حُذِفت</strong> إحدى مراجعتي هذا الفرق.\nيمكن العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].\nبإمكانك [$1 رؤية هذا الفرق] إذا أردت المتابعة.",
+       "rev-suppressed-unhide-diff": "<strong>أُخفيت</strong> إحدى مراجعتي هذا الفرق.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].\nبإمكانك [$1 رؤية هذا الفرق] إذا أردت المتابعة.",
+       "rev-deleted-diff-view": "<strong>حُذِفت</strong> إحدى مراجعتي هذا الفرق.\nيمكنك رؤية الفرق؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
+       "rev-suppressed-diff-view": "<strong>أُخفيت</strong> إحدى مراجعتي هذا الفرق.\nيمكنك رؤية هذا الفرق؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].",
        "rev-delundel": "ظهّر/خبّي",
        "rev-showdeleted": "أظهر",
        "revisiondelete": "حذف/استرجاع المراجعات",
        "revdelete-show-file-confirm": "هل أنت متأكد أنك تريد رؤية مراجعة محذوفة للملف \"<nowiki>$1</nowiki>\" بتاريخ $2 الساعة $3؟",
        "revdelete-show-file-submit": "نعم",
        "logdelete-selected": "{{PLURAL:$1|حدث السجل المختار|أحداث السجل المختارة}}:",
-       "revdelete-confirm": "الإداريون الآخرون في {{SITENAME}} سيظل بإمكانهم رؤية المحتوى المخفي ويمكنهم استرجاعه مجددا من خلال هذه الواجهة نفسها، مالم يتم وضع قيود إضافية.\nمن فضلك أكد أنك تنوي فعل هذا، وأنك تفهم العواقب، وأنك تفعل هذا بالتوافق مع [[{{MediaWiki:Policy-url}}|السياسة]].",
-       "revdelete-suppress-text": "الإخفاء ينبغي أن يتم استخدامه '''فقط''' في الحالات التالية:\n* معلومات شخصية غير ملائمة\n*: ''عناوين المنازل وأرقام التليفونات، أرقام الضمان الاجتماعي، إلى آخره.''",
+       "revdelete-confirm": "من فضلك أكد أنك تنوي فعل هذا، وأنك تفهم العواقب، وأنك تفعل هذا بالتوافق مع [[{{MediaWiki:Policy-url}}|السياسة]].",
+       "revdelete-suppress-text": "ينبغي للإخفاء أن يستخدم <strong>فقط</strong> في الحالات التالية:\n* معلومات يحتمل أن تكون تشهيرية\n* معلومات شخصية غير ملائمة\n*: <em>عناوين المنازل وأرقام الهواتف وأرقام الهويات الوطنية إلى آخره.</em>",
        "revdelete-legend": "وضع ضوابط رؤية",
        "revdelete-hide-text": "أخف نص المراجعة",
        "revdelete-hide-image": "أخف محتوى الملف",
        "revdelete-show-no-access": "خطأ في إظهار العنصر ذا التاريخ $2 $1: هذا العنصر معلم ك\"مقيد\".\nليس لك صلاحية الوصول إليه.",
        "revdelete-modify-no-access": "خطأ في تعديل العنصر ذا التاريخ $2 $1: هذا العنصر معلم ك\"مقيد\".\nليس لك صلاحية الوصول إليه.",
        "revdelete-modify-missing": "خطأ في تعديل العنصر ذا الهوية $1: العنصر مفقود من قاعدة البيانات!",
-       "revdelete-no-change": "'''تحذير:''' العنصر ذو التاريخ $2 $1 لديه أصلا إعدادات الظهور المطلوبة.",
+       "revdelete-no-change": "<strong>تحذير:</strong> العنصر ذو التاريخ $2 $1 لديه أصلا إعدادات الظهور المطلوبة.",
        "revdelete-concurrent-change": "خطأ في تعديل العنصر ذي التاريخ $2 $1: تظهر حالته أن شخصا آخر عدله أثناء محاولتك تعديله.\nمن فضلك راجع السجلات.",
        "revdelete-only-restricted": "خطأ إخفاء العنصر المؤرخ $2, $1: لا تستطيع تنحية العناصر من عرض الإداريين بدون أن تحدد أيضا إحدى خيارات التنحية الأخرى.",
        "revdelete-reason-dropdown": "* أسباب حذف عامة\n** خرق لحقوق النشر\n** معلومات شخصية غير ملائمة\n**معلومات تشهيرية محتملة",
        "nextn": "{{PLURAL:$1|$1}} الجاية",
        "prevn-title": "$1 {{PLURAL:$1|نتيجة|نتيجة}} سابقة",
        "nextn-title": "$1 {{PLURAL:$1|نتيجة|نتيجة}} سابقة",
-       "searchmenu-new": "'''أنشئ الصفحة \"[[:$1]]\" في هذا الويكي!'''",
+       "searchmenu-new": "<strong>أنشئ الصفحة \"[[:$1]]\" في هذه الويكي.</strong> {{PLURAL:$2|0=|انظر أيضا الصفحة التي وجدت بالبحث.|انظر أيضا نتائج البحث التي وجدت.}}",
        "searchprofile-everything": "كلّ شي",
        "searchprofile-articles-tooltip": "لوّج في $1",
        "searchprofile-images-tooltip": "لوّج عالتصاور",
        "recentchanges-label-bot": "عمل هذا التبديل بوت",
        "recentchanges-label-unpatrolled": "لم يراجع هذا التعديل إلى الآن",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (شوف زادة [[Special:NewPages|ليستة الپاجات الجدد]])",
-       "rcnotefrom": "بالأسفل التغييرات منذ '''$2''' (إلى '''$1''' معروضة).",
+       "rcnotefrom": "بالأسفل {{PLURAL:$5|التغيير|التغييرات}} منذ <strong>$3، $4</strong> (إلى <strong>$1</strong> معروضة).",
        "rclistfrom": "ورّي التبديلات بدءا من $3 $2",
        "rcshowhideminor": "$1 التعديلات الطفيفة",
        "rcshowhideminor-hide": "خبّي",
        "rc-enhanced-hide": "أخفِ التفاصيل",
        "recentchangeslinked": "تغييرات ذات علاقة",
        "recentchangeslinked-title": "التغييرات المرتبطة ب \"$1\"",
-       "recentchangeslinked-summary": "هذي ليستة بالتبديلات إلّي صاروا ما صارلهمش برشا للپاجات إلّي موجود ليان يدّي ليهم في پاج بذاتها (ولّا في پاج متاع تصنيف معين).\nالپاجات في [[Special:Watchlist|ليستة الپاجات إلّي تّبعها]] '''مكتوبين بالغليظ'''",
+       "recentchangeslinked-summary": "هذي ليستة بالتبديلات إلّي صاروا ما صارلهمش برشا للپاجات إلّي موجود ليان يدّي ليهم في پاج بذاتها. (ولّا في پاج متاع تصنيف معين، اكتب {{ns:category}}:اسم التصنيف). الپاجات في [[Special:Watchlist|ليستة الپاجات إلّي تّبعها]] <strong>مكتوبين بالغليظ</strong>.",
        "recentchangeslinked-page": "اسم الپاج:",
        "recentchangeslinked-to": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضاً عن ذلك",
        "upload": "صبّ فشياي",
        "contributions-title": "مساهمات المستخدم $1",
        "mycontris": "مساهمات",
        "anoncontribs": "مساهمات",
-       "contribsub2": "ل$1 ($2)",
+       "contribsub2": "ل{{GENDER:$3|$1}} ($2)",
        "month": "من شهر (و أقدم):",
        "year": "من عام (و أقدم):",
        "sp-contributions-newbies": "اعرض مساهمات الحسابات الجديدة فقط",
        "sp-contributions-toponly": "أظهر أعلى المراجعات فقط",
        "whatlinkshere-title": "الصفحات التي تصل إلى \"$1\"",
        "whatlinkshere-page": "الپاج:",
-       "linkshere": "الصفحات التالية تصل إلى '''$2''':",
-       "nolinkshere": "لا توجد صفحات تصل إلى '''$2'''.",
+       "linkshere": "الصفحات التالية تصل إلى <strong>$2</strong>:",
+       "nolinkshere": "لا توجد صفحات تصل إلى <strong>$2</strong>.",
        "isredirect": "صفحة تحويل",
        "istemplate": "مضمن",
        "isimage": "وصلة ملف",
        "allmessagesname": "الاسم",
        "allmessagesdefault": "النص الافتراضي",
        "thumbnail_error": "خطأ في إنشاء صورة مصغرة: $1",
-       "tooltip-pt-userpage": "صفحة المستخدم الخاصة بك",
-       "tooltip-pt-mytalk": "صفحة نقاشك",
-       "tooltip-pt-preferences": "تفضيلاتي",
+       "tooltip-pt-userpage": "{{GENDER:|صفحة المستخدم}} الخاصة بك",
+       "tooltip-pt-mytalk": "صفحة {{GENDER:|نقاشك}}",
+       "tooltip-pt-preferences": "{{GENDER:|تفضيلاتك}}",
        "tooltip-pt-watchlist": "قائمة الصفحات التي تراقب التغييرات التي تحدث بها",
-       "tooltip-pt-mycontris": "قائمة مساهماتك",
+       "tooltip-pt-mycontris": "قائمة مساهمات{{GENDER:|ك}}",
        "tooltip-pt-login": "ماذابيك لوكان تدخل للويكي، أما موش لازمك تعمل هكّا",
        "tooltip-pt-logout": "خروج",
        "tooltip-pt-createaccount": "ماذابيك لوكان تعمل حساب و تدخل للويكي، أما موش لازمك تعمل هكّا",
        "tooltip-n-randompage": "خرّج پاج بالزهر",
        "tooltip-feed-atom": "تلقيم أتوم لهذه الصفحة",
        "tooltip-t-contributions": "ليستة مساهمات ها {{GENDER:$1|المستعمل|المستعملة}}",
-       "tooltip-t-emailuser": "أرسل رسالة لهذا المستخدم",
+       "tooltip-t-emailuser": "أرسل رسالة إلكترونية {{GENDER:$1|لهذا المستخدم|لهذه المستخدمة}}",
        "tooltip-t-upload": "صبّ فيشيايات",
        "tooltip-ca-nstab-user": "اعرض صفحة المستخدم",
        "tooltip-ca-nstab-special": "هذي پاج سپاسيال، و ما تنجّمش تبدّل فيها شي",
        "watchlisttools-edit": "اعرض قائمة المراقبة وعدلها",
        "watchlisttools-raw": "عدل قائمة المراقبة الخام",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|حديث]])",
-       "duplicate-defaultsort": "'''تحذير:''' مفتاح الترتيب الافتراضي \"$2\" يتجاوز مفتاح الترتيب الافتراضي السابق \"$1\".",
+       "duplicate-defaultsort": "<strong>تحذير:</strong> مفتاح الترتيب الافتراضي \"$2\" يتجاوز مفتاح الترتيب الافتراضي السابق \"$1\".",
        "external_image_whitelist": " #<pre>اترك هذا السطر تماما كما هو\n#ضع منثورات التعبيرات المنتظمة (فقط الجزء الذي يذهب بين //) بالأسفل\n#هذه ستتم مطابقتها مع مسارات الصور الخرجية (الموصولة بشكل مباشر)\n#هذه التي تطابق سيتم عرضها كصور، غير ذلك فقط وصلة إلى الصورة سيتم عرضها\n#السطور التي تبدأ ب# تتم معاملتها كتعليقات\n#هذا لا يتأثر بحالة الحروف\n\n#ضع كل منثورات التعبيرات المنتظمة فوق هذا السطر. اترك هذا السطر تماما كما هو</pre>",
        "tag-filter": "مرشح [[Special:Tags|الوسوم]]:",
        "tags-edit": "بدّل",
index 50ec4d8..c5e09b8 100644 (file)
        "sort-descending": "تنازليا",
        "sort-ascending": "تصاعديا",
        "nstab-main": "الصفحة",
-       "nstab-user": "صفحة {{GENDER:{{BASEPAGENAME}}|المستخدم|المستخدمة}}",
+       "nstab-user": "صفحة المستخدم",
        "nstab-media": "صفحة ميديا",
        "nstab-special": "صفحة خاصة",
        "nstab-project": "صفحة مشروع",
        "databaseerror-function": "دالة: $1",
        "databaseerror-error": "خطأ: $1",
        "transaction-duration-limit-exceeded": "لتفادي إنشاء تأخير نسخ عالي، هذا الفعل تم إنهاؤه لأن فترة الكتابة ($1) تجاوزت حد $2 ثانية.\nلو أنك تغير عناصر عديدة في نفس الوقت، حاول تجربة عمليا عديدة أصغر بدلا من ذلك.",
-       "laggedslavemode": "'''تحذير:''' الصفحة قد لا تحتوي على أحدث التحديثات.",
+       "laggedslavemode": "<strong>تحذير:</strong> الصفحة قد لا تحتوي على أحدث التحديثات.",
        "readonly": "قاعدة البيانات مقفلة",
        "enterlockreason": "أدخل سببا للقفل ذاكرا تقديرا لوقت إزالة الغلق",
        "readonlytext": "قاعدة البيانات مقفلة حاليا أمام المدخلات الجديدة و التعديلات الأخرى. السبب غالبا ما يكون الصيانة، و ستعود قاعدة البيانات للعمل الطبيعي قريبا.\n\nإداري النظام الذي أغلق قاعدة البيانات أعطى التفسير التالي: $1",
        "editinginterface": "<strong>تنبيه:</strong> أنت تعدل صفحة تستخدم لتوفير نص الواجهة للبرنامج.\nالتغييرات في هذه الصفحة ستؤثر على مظهر واجهة المستخدم للمستخدمين الآخرين في هذه الويكي.",
        "translateinterface": "من أجل إضافة أو تعديل ترجمات في كل مشاريع الويكي يرجى استخدام [https://translatewiki.net/ translatewiki.net]، مشروع ميدياويكي لترجمة الواجهة.",
        "cascadeprotected": "تمت حماية هذه الصفحة من التعديل لأنها مدمجة في {{PLURAL:$1||الصفحة التالية، والتي|الصفحتين التاليتين، واللتين|الصفحات التالية، والتي}} تم استعمال خاصية \"حماية الصفحات المدمجة\" {{PLURAL:$1||بها|بهما|بها}}:\n$2",
-       "namespaceprotected": "لا تمتلك الصلاحية لتعديل الصفحات في نطاق '''$1'''.",
+       "namespaceprotected": "لا تمتلك الصلاحية لتعديل الصفحات في نطاق <strong>$1</strong>.",
        "customcssprotected": "أنت لا تمتلك السماح لتعديل صفحة الCSS هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.",
        "customjsonprotected": "ليست لديك صلاحية تحرير صفحة جسون هذه لأنها تحتوي على إعدادات شخصية لمستخدم آخر.",
        "customjsprotected": "أنت لا تمتلك السماح لتعديل صفحة الجافاسكريبت هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.",
        "myprivateinfoprotected": "ليس لديك صلاحية تعديل معلوماتك الخاصة.",
        "mypreferencesprotected": "ليس لديك صلاحية تعديل تفضيلاتك.",
        "ns-specialprotected": "الصفحات الخاصة لا يمكن تعديلها.",
-       "titleprotected": "{{GENDER:$1|حمى|حمت}} [[User:$1|$1]] هذا العنوان من الإنشاء.\nالسبب المعطى هو <em>$2</em>.",
+       "titleprotected": "حمى [[User:$1|$1]] هذا العنوان من الإنشاء.\nالسبب المعطى هو <em>$2</em>.",
        "filereadonlyerror": "تعذر تعديل الملف \"$1\" لأن مستودع الملف \"$2\" في وضع القراءة فقط. \n\nإداري النظام الذي قام بغلقه قدم التفسير التالي: \"$3\".",
        "invalidtitle": "عنوان غير صالح",
        "invalidtitle-knownnamespace": "عنوان غير صالح في النطاق «$2» مع نص «$3»",
        "exception-nologin": "غير مسجل الدخول",
        "exception-nologin-text": "سجل الدخول للتمكن من عرض هذه الصفحة أو إجراء هذا الفعل.",
        "exception-nologin-text-manual": "الرجاء $1 لتتمكن من الوصول لهذه الصفحة أو أداء هذا الإجراء.",
-       "virus-badscanner": "ضبط سيئ: ماسح فيروسات غير معروف: ''$1''",
+       "virus-badscanner": "ضبط سيئ: ماسح فيروسات غير معروف: <em>$1</em>",
        "virus-scanfailed": "فشل المسح (كود $1)",
        "virus-unknownscanner": "مضاد فيروسات غير معروف:",
        "logouttext": "<strong>أنت الآن غير مسجل الدخول.</strong> قد ترى بعض الصفحات كما لو أنك ما زلت مسجل الدخول، وذلك حتى تفرغ التخزين المؤقت في متصفحك.",
        "createacct-loginerror": "الحساب تم إنشاؤه تلقائيا لكن لم يمكن تسجيل دخولك تلقائيا. من فضلك اذهب إلى [[Special:UserLogin|تسجيل الدخول اليدوي]].",
        "noname": "لم تحدد اسم مستخدم صحيح.",
        "loginsuccesstitle": "تم الدخول",
-       "loginsuccess": "'''لقد سجلت الدخول ل{{SITENAME}} باسم \"$1\".'''",
+       "loginsuccess": "<strong>لقد سجلت الدخول ل{{SITENAME}} باسم \"$1\".</strong>",
        "nosuchuser": "لا يوجد مستخدم بالاسم \"$1\".\nأسماء المستخدمين حساسة لحالة الحروف.\nتأكد من إملاء الاسم، أو [[Special:CreateAccount|قم بإنشاء حساب جديد]].",
        "nosuchusershort": "لا يوجد مستخدم باسم $1\".\nتأكد من إملاء الاسم.",
        "nouserspecified": "يجب عليك تحديد اسم مستخدم.",
        "changepassword-success": "تم تغيير كلمة السر !",
        "changepassword-throttled": "لديك محاولات تسجيل دخول كثيرة حديثة. من فضلك انتظر $1 قبل المحاولة ثانية.",
        "botpasswords": "كلمات مرور البوت",
-       "botpasswords-summary": "'''كلمات سر البوت''' تسمح بالوصول لحساب مستخدم من خلال API بدون استخدام اعتمادات تسجيل الدخول الرئيسية للحساب. صلاحيات المستخدم المتوفرة عند تسجيل الدخول باستخدام كلمة سر بوت ربما تكون مقيدة.\n\nإن لم تكن تعلم لماذا تريد فعل هذا، فينبغي عليك على الأرجح ألا تفعله. لا ينبغي أن يسألك أحد أبدًا أن تولد واحدة من هذه وتعطيها له.",
+       "botpasswords-summary": "<em>كلمات سر البوت</em> تسمح بالوصول لحساب مستخدم من خلال API بدون استخدام اعتمادات تسجيل الدخول الرئيسية للحساب. صلاحيات المستخدم المتوفرة عند تسجيل الدخول باستخدام كلمة سر بوت ربما تكون مقيدة.\n\nإن لم تكن تعلم لماذا تريد فعل هذا، فينبغي عليك على الأرجح ألا تفعله. لا ينبغي أن يسألك أحد أبدًا أن تولد واحدة من هذه وتعطيها له.",
        "botpasswords-disabled": "كلمات السر الخاصة بالبوت معطلة.",
        "botpasswords-no-central-id": "لاستخدام كلمة السر الخاصة بالبوت، يجب أن تقوم بتسجيل الدخول من خلال حساب موحد.",
        "botpasswords-existing": "كلمات مرور البوت الموجودة",
        "resetpass-temp-password": "كلمة سر مؤقتة:",
        "resetpass-abort-generic": "منعت مُلحقة إتمام صيرورة تغيير كلمة السّر.",
        "resetpass-expired": "انتهت مدة صلاحية كلمة السر الخاصة بك. الرجاء تعيين كلمة سر جديدة لتسجيل الدخول.",
-       "resetpass-expired-soft": "اÙ\86تÙ\87ت Ù\85دة ØµÙ\84احÙ\8aØ© Ù\83Ù\84Ù\85Ø© Ø§Ù\84سر Ø§Ù\84خاصة Ø¨Ù\83; Ø§Ù\84رجاء ØªØºÙ\8aÙ\8aر Ù\83Ù\84Ù\85Ø© Ø³Ø± Ø¬Ø¯Ù\8aدة Ø§Ù\84Ø¢Ù\86 Ø£Ù\88 Ø§Ù\84Ù\86Ù\82ر Ø¹Ù\84Ù\89 Ø²Ø± Ø¥Ù\84غاء لإعادة تعيين كلمة السر لاحقاً.",
+       "resetpass-expired-soft": "اÙ\86تÙ\87ت Ù\85دة ØµÙ\84احÙ\8aØ© Ù\83Ù\84Ù\85Ø© Ø§Ù\84سر Ø§Ù\84خاصة Ø¨Ù\83; Ø§Ù\84رجاء ØªØºÙ\8aÙ\8aر Ù\83Ù\84Ù\85Ø© Ø§Ù\84سر Ø§Ù\84Ø¢Ù\86 Ø£Ù\88 Ø§Ù\84Ù\86Ù\82ر Ø¹Ù\84Ù\89 Ø²Ø± \"{{int:authprovider-resetpass-skip-label}}\" لإعادة تعيين كلمة السر لاحقاً.",
        "resetpass-validity": "كلمة السر غير صالحة: $1\n\nيرجى تعيين كلمة سر جديدة لتسجيل الدخول.",
        "resetpass-validity-soft": "كلمة السر الخاصة بك غير صالحة :  $1 \n\nرجاءا اختر كلمة سر جديدة الآن، أو انقر فوق \"{{int:authprovider-resetpass-skip-label}}\" لتغييرها في وقت لاحق.",
        "passwordreset": "إعادة ضبط كلمة السر",
        "passwordreset-emailtitle": "تفاصيل حساب {{SITENAME}}",
        "passwordreset-emailtext-ip": "أحد ما (قد يكون أنت، من العنوان $1)  طلب إعادة ضبط كلمة سر حسابك على {{SITENAME}} ($4). {{PLURAL:$3||الحساب|الحسابان| الحسابات}} أدناه قد اقترنت ببريدك الإلكتروني :\n\n$2\n\n{{PLURAL:$3||كلمة السر المؤقتة|كلمات السر المؤقتة}} ستنتهي صلاحيتها في {{PLURAL:$5||يوم واحد|يومين|$5 أيام|$5 يوما|$5 يوم}}\nيمكنك تسجيل الدخول واختيار كلمة سر جديدة. إذا كان هذا الطلب تم بواسطة شخص أخر، أو إذا تذكرت كلمة السر الأصلية الخاصة بك، ولم تعد ترغب في تغييرها، يمكنك تجاهل هذه الرسالة ومتابعة استخدام كلمة السر القديمة.",
        "passwordreset-emailtext-user": "المستخدم $1 على {{SITENAME}} طلب إعادة ضبط كلمة سر حسابك على {{SITENAME}} ($4). {{PLURAL:$3||الحساب|الحسابان| الحسابات}} أدناه قد اقترنت ببريدك الإلكتروني :\n\n$2\n\n{{PLURAL:$3||كلمة السر المؤقتة|كلمات السر المؤقتة}} ستنتهي صلاحيتها في {{PLURAL:$5||يوم واحد|يومين|$5 أيام|$5 يوما|$5 يوم}}\nيمكنك تسجيل الدخول واختيار كلمة سر جديدة. إذا كان هذا الطلب تم بواسطة شخص أخر، أو إذا تذكرت كلمة السر الأصلية الخاصة بك، ولم تعد ترغب في تغييرها، يمكنك تجاهل هذه الرسالة ومتابعة استخدام كلمة السر القديمة.",
-       "passwordreset-emailelement": "اسم {{GENDER:$1\n|المستخدم|المستخدمة}}: \n$1\n\nكلمة السر المؤقتة: \n$2",
+       "passwordreset-emailelement": "اسم المستخدم: \n$1\n\nكلمة السر المؤقتة: \n$2",
        "passwordreset-emailsentemail": "إذا كان هذا العنوان البريد مرتبط بحسابك، من ثم سيتم إرسال بريد إلكتروني لإعادة تعيين كلمة السر.",
        "passwordreset-emailsentusername": "إذا كان هناك عنوان بريد إلكتروني مرتبط بهذا المستخدم، ثم سيتم إرسال بريد إلكتروني لإعادة تعيين كلمة السر.",
        "passwordreset-nocaller": "يجب أن يتم توفير مستدعي",
        "showdiff": "عرض التغييرات",
        "blankarticle": "<strong>تنبيه:</strong> الصفحة التي تريد إنشاءها فارغة. إذا نقرت \"$1\" ثانية فستنشأ الصفحة بدون محتوى.",
        "anoneditwarning": "<strong>تحذير:</strong> أنت غير مسجل الدخول. عنوان الأيبي الخاص بك سيكون معروضا بشكل علني لو قمت بأي تعديلات. لو أنك <strong>[$1 سجلت الدخول]</strong> أو <strong>[$2 أنشأت حسابا]</strong>، فتعديلاتك ستنسب لاسم المستخدم الخاص بك، بالإضافة إلى فوائد أخرى.",
-       "anonpreviewwarning": "''أنت غير مسجل الدخول. الحفظ سيسجل عنوان الأيبي الخاص بك في تاريخ هذه الصفحة.''",
-       "missingsummary": "'''تنبيه:''' لم تقم بكتابة ملخص للتعديل.\nإذا قمت بضغط حفظ الصفحة مرة أخرى، فيتم حفظ تعديلك بدون ملخص.",
+       "anonpreviewwarning": "<em>أنت غير مسجل الدخول. الحفظ سيسجل عنوان الأيبي الخاص بك في تاريخ هذه الصفحة.</em>",
+       "missingsummary": "<strong>تنبيه:</strong> لم تقم بكتابة ملخص للتعديل.\nإذا قمت بضغط \"$1\" مرة أخرى، فسيتم حفظ تعديلك بدون ملخص.",
        "selfredirect": "<strong>تحذير:</strong> أنت تقوم بتحويل الصفحة إلى نفسها.\nربما حددت الهدف الخطأ للتحويلة أو أنك تقوم بتحرير الصفحة الخطأ.\n\nإذا نقرت على «$1» مرة أخرى، سيتم إنشاء التحويلة رغم الخطأ.",
        "missingcommenttext": "من فضلك أدخل تعليقا.",
        "missingcommentheader": "<strong>تنبيه:</strong>  لم تقم بوضع موضوع/عنوان لهذا التعليق.\nإذا قمت بالضغط على \"$1\" مجددا، سيتم حفظ تعليقك بدون عنوان.",
        "blockedtitle": "المستخدم ممنوع",
        "blocked-email-user": "<strong>م منع اسم المستخدم الخاص بك من إرسال البريد الإلكتروني، لا يزال بإمكانك تحرير صفحات أخرى على هذا الويكي،</strong> يمكنك عرض تفاصيل المنع بالكامل في [[Special:MyContributions|مساهمات الحساب]].\n\nتم المنع بواسطة  $1.\n\nالسبب المعطى هو <em>$2</em>.\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n* معرف المنع #$5",
        "blockedtext-partial": "<strong>تم منع اسم المستخدم أو عنوان الآيبي الخاص بك من إجراء تغييرات على هذه الصفحة، لا يزال بإمكانك تعديل صفحات أخرى على هذا الويكي،</strong> يمكنك عرض تفاصيل المنع بالكامل في [[Special:MyContributions|مساهمات الحساب]].\n\nتم المنع بواسطة  $1.\n\nالسبب المعطى هو <em>$2</em>.\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n* معرف المنع #$5",
-       "blockedtext": "'''اسم المستخدم أو عنوان الأيبي الخاص بك تم منعه.'''\n\nقام بالمنع $1.\nسبب المنع هو: ''$2''.\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nيمكنك الاتصال ب$1 أو أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] للنقاش حول المنع.\nلا يمكنك استخدام خاصية \"{{int:emailuser}}\" إلا إذا كنت قد وضعت عنوان بريدي صحيح في [[Special:Preferences|تفضيلات حسابك]] ولم يتم منعك من استخدامها.\nعنوان الأيبي الخاص بك حاليا هو $3، ورقم المنع هو #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
-       "autoblockedtext": "مُنِع عنوان آيبيك تلقائيا لأن مستخدما آخرا منعه $1 استخدمه.\nالسبب المعطى هو التالي:\n\n:<em>$2</em>\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nيمكنك أن تتصل ب $1 أو أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] الآخرين لمناقشة المنع.\n\nلاحظ أنه لا يمكنك استخدام خاصية \"إرسال رسالة لهذا المستخدم\" إلا لو كان لديك عنوان بريد إلكتروني صحيح مسجل في [[Special:Preferences|تفضيلاتك]] ولم يتم منعك من استخدامه.\n\nعنوان آيبيك الحالي $3، ورقم المنع #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
+       "blockedtext": "<strong>اسم المستخدم أو عنوان الأيبي الخاص بك تم منعه.</strong>\n\nقام بالمنع $1.\nسبب المنع هو <em>$2</em>.\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nيمكنك الاتصال ب$1 أو أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] للنقاش حول المنع.\nلا يمكنك استخدام خاصية \"{{int:emailuser}}\" إلا إذا كنت قد وضعت عنوان بريدي صحيح في [[Special:Preferences|تفضيلات حسابك]] ولم يتم منعك من استخدامها.\nعنوان الأيبي الخاص بك حاليا هو $3، ورقم المنع هو #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
+       "autoblockedtext": "مُنِع عنوان آيبيك تلقائيا لأن مستخدما آخرا منعه $1 استخدمه.\nالسبب المعطى هو التالي:\n\n:<em>$2</em>\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nيمكنك أن تتصل ب $1 أو أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] الآخرين لمناقشة المنع.\n\nلاحظ أنه لا يمكنك استخدام خاصية \"{{int:emailuser}}\" إلا لو كان لديك عنوان بريد إلكتروني صحيح مسجل في [[Special:Preferences|تفضيلاتك]] ولم يتم منعك من استخدامه.\n\nعنوان آيبيك الحالي $3، ورقم المنع #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
        "systemblockedtext": "اسم المستخدم أو عنوان الأيبي الخاص بك تم منعه تلقائيا بواسطة ميدياويكي.\nالسبب المعطى هو:\n\n:<em>$2</em>\n\n* بداية المنع: $8\n* نهاية المنع: $6\n* المقصود بالمنع: $7\n\nعنوان الأيبي الحالي الخاص بك هو $3.\nمن فضلك ضمن كل التفاصيل بالأعلى في أي استعلام تقوم به.",
        "blockednoreason": "لا سبب معطى",
        "whitelistedittext": "يجب عليك $1 لتتمكن من تعديل الصفحات.",
        "loginreqlink": "تسجيل الدخول",
        "loginreqpagetext": "يجب عليك $1 لتشاهد صفحات أخرى.",
        "accmailtitle": "تم إرسال كلمة السر.",
-       "accmailtext": "أُرسِلت كلمة سر مولدة عشوائيا ل[[User talk:$1|$1]] إلى $2. يمكن تغييرها في صفحة ''[[Special:ChangePassword|تغيير كلمة السر]]'' بعد تسجيل الدخول.",
+       "accmailtext": "أُرسِلت كلمة سر مولدة عشوائيا ل[[User talk:$1|$1]] إلى $2. يمكن تغييرها في صفحة <em>[[Special:ChangePassword|تغيير كلمة السر]]</em> بعد تسجيل الدخول.",
        "newarticle": "(جديد)",
-       "newarticletext": "لقد تبعت وصلة لصفحة لم يتم إنشائها بعد.\nلإنشاء هذه الصفحة ابدأ الكتابة في الصندوق بالأسفل (انظر في [$1 صفحة المساعدة] للمزيد من المعلومات).\nإذا كانت زيارتك لهذه الصفحة بالخطأ، اضغط على زر ''رجوع'' في متصفح الإنترنت لديك.",
+       "newarticletext": "لقد تبعت وصلة لصفحة لم يتم إنشائها بعد.\nلإنشاء هذه الصفحة ابدأ الكتابة في الصندوق بالأسفل (انظر في [$1 صفحة المساعدة] للمزيد من المعلومات).\nإذا كانت زيارتك لهذه الصفحة بالخطأ، اضغط على زر <strong>رجوع</strong> في متصفح الإنترنت لديك.",
        "anontalkpagetext": "----\n<em>هذه صفحة نقاش لمستخدم مجهول لم يقم بإنشاء حساب بعد أو لا يستعمل ذلك الحساب;</em>\nلذا يجب علينا استعمال رقم الأيبي للتعرف عليهم،\nمثل هذا العنوان يمكن أن يشترك فيه عدة مستخدمين.\nلو كنت مستخدما مجهولا وتشعر بأن تعليقات لا تخصك تم توجيهها إليك، من فضلك [[Special:CreateAccount|أنشئ حسابا]] أو [[Special:UserLogin|سجل الدخول]] لتجنب الارتباك المستقبلي مع مستخدمين مجهولين آخرين.",
        "noarticletext": "هذه الصفحة خالية حاليا. يمكنك [[Special:Search/{{PAGENAME}}|البحث عن عنوانها]] في الصفحات الأخرى أو\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} البحث في السجلات] (لتعرف إن كانت قد حُذِفَت)،\nأو '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} إنشاؤها]'''</span>.",
        "noarticletext-nopermission": "لا يوجد حاليا أي نص في هذه الصفحة.\nيمكنك [[Special:Search/{{PAGENAME}}|البحث عن عنوان هذه الصفحة]] في الصفحات الأخرى، أو <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} البحث في السجلات المتعلقة بها]</span>، لكن ليست لك صلاحية إنشاء هذه الصفحة.",
        "userpage-userdoesnotexist-view": "حساب المستخدم \"$1\" غير مسجل.",
        "blocked-notice-logextract": "هذا المستخدم ممنوع حاليا.\nآخر مدخلة في سجل المنع موفرة بالأسفل كمرجع:",
        "clearyourcache": "<strong>ملاحظة:</strong> بعد الحفظ، أنت قد تحتاج إلى إفراغ الكاش الخاص بمتصفحك لرؤية التغييرات.\n* <strong>فايرفوكس / سافاري:</strong> أمسك <em>Shift</em> أثناء ضغط <em>Reload</em>، أو اضغط على إما <em>Ctrl-F5</em> أو <em>Ctrl-R</em> (<em>⌘-R</em> على ماك)\n* <strong>جوجل كروم:</strong> اضغط <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> على ماك)\n* <strong>إنترنت إكسبلورر:</strong> أمسك <em>Ctrl</em> أثناء ضغط <em>Refresh</em>، أو اضغط <em>Ctrl-F5</em>\n* <strong>أوبرا:</strong> اذهب إلى <em>Menu → Settings</em> (<em>Opera → Preferences</em> على ماك) ثم إلى <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
-       "usercssyoucanpreview": "'''ملاحظة:''' استعمل زر \"{{int:showpreview}}\" لتجربة CSS الجديد قبل حفظ الصفحة.",
+       "usercssyoucanpreview": "<strong>ملاحظة:</strong> استعمل زر \"{{int:showpreview}}\" لتجربة CSS الجديد قبل حفظ الصفحة.",
        "userjsonyoucanpreview": "<strong>نصيحة:</strong>  استخدم الزر \"{{int:showpreview}}\" لاختبار جسون الجديد قبل الحفظ.",
-       "userjsyoucanpreview": "'''ملاحظة:''' استعمل زر \"{{int:showpreview}}\" لتجربة جافاسكربت الجديدة قبل حفظ الصفحة.",
-       "usercsspreview": "'''تذكر أنك تقوم بعرض الأنماط المتراصة (CSS) الخاصة بك فقط\nلم يتم حفظها بعد!'''",
+       "userjsyoucanpreview": "<strong>ملاحظة:</strong> استعمل زر \"{{int:showpreview}}\" لتجربة الجافاسكريبت الجديدة قبل حفظ الصفحة.",
+       "usercsspreview": "<strong>تذكر أنك تقوم بعرض الأنماط المتراصة (CSS) الخاصة بك فقط.\nلم يتم حفظها بعد!</strong>",
        "userjsonpreview": "<strong>تذكر أنك تختبر/تستعرض تهيئة جسون للمستخدم فقط،\nلم يتم حفظها بعد!</strong>",
-       "userjspreview": "'''تذكر أنك فقط تجرب/تعاين جافاسكربت.'''\n'''لم يتم الحفظ بعد!'''",
-       "sitecsspreview": "''' تذكر أنك فقط في وضع المعاينة لهذا CSS ''' \n''' ولم يتم حفظ الصفحة بعد! '''",
+       "userjspreview": "<strong>تذكر أنك فقط تجرب/تعاين جافاسكربت.\nلم يتم الحفظ بعد!</strong>",
+       "sitecsspreview": "<strong>تذكر أنك فقط في وضع المعاينة لهذا CSS. \nلم يتم حفظ الصفحة بعد!</strong>",
        "sitejsonpreview": "<strong>تذكر أنك تقوم بمعاينة تهيئة جسون هذه فقط،\nلم يتم حفظها بعد!</strong>",
-       "sitejspreview": "''' تذكر أنك فقط في وضع المعاينة لكود JavaScript هذا''' \n''' ولم يتم حفظه بعد! '''",
+       "sitejspreview": "<strong>تذكر أنك فقط في وضع المعاينة لكود JavaScript هذا.\nلم يتم حفظه بعد!</strong>",
        "userinvalidconfigtitle": "<strong>تحذير:</strong> T لا توجد واجهة \"$1\".\nصفحات Custom .css و.json و.js تستخدم حروفا صغيرة في العنوان، مثل {{ns:user}}:Foo/vector.css على عكس {{ns:user}}:Foo/Vector.css.",
        "updated": "(محدثة)",
-       "note": "'''ملاحظة:'''",
-       "previewnote": "'''تذكر أن هذه مجرد معاينة أولية.'''\nلم تحفظ تغييراتك إلى الآن!",
+       "note": "<strong>ملاحظة:</strong>",
+       "previewnote": "<strong>تذكر أن هذه مجرد معاينة أولية.</strong>\nلم تحفظ تغييراتك إلى الآن!",
        "continue-editing": "اذهب لصندوق التحرير",
        "previewconflict": "هذا العرض يوضح النص الموجود في صندوق التحرير العلوي والذي سيظهر إذا اخترت الحفظ.",
-       "session_fail_preview": "'''عذرا! لم نتمكن من حفظ التعديلات التي قمت بها نتيجة لضياع بيانات هذه الجلسة.\nمن فضلك حاول مرة أخرى.\nفي حال استمرار المشكلة حاول أن تقوم [[Special:UserLogout|بالخروج]] ومن ثم الولوج مرة أخرى.''' و تاكد في  متصفحك من الكوكيز  الخاصة  بهذا الموقع.",
-       "session_fail_preview_html": "'''عذرا! لم نستطع معالجة تعديلك بسبب فقدان بيانات الجلسة.'''\n\n''لأن {{SITENAME}} بها HTML الخام مفعلة، العرض المسبق مخفي كاحتياط ضد هجمات الجافا سكريبت.''\n\n'''إذا كانت هذه محاولة تعديل صادقة، من فضلك حاول مرة أخرى.\nإذا كانت مازالت لا تعمل، حاول [[Special:UserLogout|تسجيل الخروج]] ثم تسجيل الدخول مجددا.'''و تاكد في  متصفحك من الكوكيز  الخاصة  بهذا الموقع.",
+       "session_fail_preview": "عذرا! لم نتمكن من حفظ التعديلات التي قمت بها نتيجة لضياع بيانات هذه الجلسة.\n\nربما تكون قد تم تسجيل خروجك. <strong>من فضلك تأكد من أنك مسجل الدخول وحاول مرة أخرى</strong>.\nفي حال استمرار المشكلة حاول أن تقوم [[Special:UserLogout|بالخروج]] ومن ثم الولوج مرة أخرى. و تأكد من أن متصفحك يسمح بالكوكيز من  هذا الموقع.",
+       "session_fail_preview_html": "عذرا! لم نستطع معالجة تعديلك بسبب فقدان بيانات الجلسة.\n\n<em>لأن {{SITENAME}} بها HTML الخام مفعلة، العرض المسبق مخفي كاحتياط ضد هجمات الجافا سكريبت.</em>\n\n<strong>إذا كانت هذه محاولة تعديل صادقة، من فضلك حاول مرة أخرى.</strong>\nإذا كانت مازالت لا تعمل، حاول [[Special:UserLogout|تسجيل الخروج]] ثم تسجيل الدخول مجددا. و تأكد من أن متصفحك يسمح بالكوكيز من هذا الموقع.",
        "token_suffix_mismatch": "<strong>تعديلك تم رفضه لأن عميلك أخطأ في علامات الترقيم في نص التعديل.</strong>\nتم رفض التعديل لمنع فساد نص المقالة.\nهذا يحدث أحيانا عندما تستخدم خدمة بروكسي مجهول معيبة مبنية على الويب.",
-       "edit_form_incomplete": "'''بعض أجزاء من نموذج التعديل لم تصل إلى الخادم؛ تأكد من أن تعديلاتك لم تمس وحاول مجددا.'''",
+       "edit_form_incomplete": "<strong>بعض أجزاء من نموذج التعديل لم تصل إلى الخادم؛ تأكد من أن تعديلاتك لم تمس وحاول مجددا.</strong>",
        "editing": "تعديل $1",
        "creating": "إنشاء «$1»",
        "editingsection": "تعديل $1 (قسم)",
        "explainconflict": "لقد عدل شخص آخر هذه الصفحة بعد أن بدأت أنت بتحريرها.\nصندوق النصوص العلوي يحتوي على النص الموجود حاليا في الصفحة.\nالتعديلات التي أجريتها أنت معروضة في الصندوق أسفله.\nويلزم دمجها في النص الموجود حاليا.\n<strong>لن يحفظ</strong> بعد الضغط على زر \"$1\" إلا ما هو موجود في الصندوق العلوي.",
        "yourtext": "نصك",
        "storedversion": "النسخة المخزنة",
-       "editingold": "''' تحذير: أنت تقوم الآن بتحرير نسخة قديمة من هذه الصفحة.\nإذا قمت بحفظها، ستفقد كافة التغييرات التي حدثت بعد هذه النسخة. '''",
+       "editingold": "<strong>تحذير: أنت تقوم الآن بتحرير نسخة قديمة من هذه الصفحة.</strong>\nإذا قمت بحفظها، ستفقد كافة التغييرات التي حدثت بعد هذه النسخة.",
        "unicode-support-fail": "يبو أن متصفحك لا يدعم اليونيكود. وهو ضروري لتعديل الصفحات، لذا فتعديلك لم يتم حفظه.",
        "yourdiff": "الفروق",
-       "copyrightwarning": "من فضلك لاحظ أن جميع المساهمات ل {{SITENAME}} خاضعة وصادرة تحت ترخيص $2 (انظر في $1 للمزيد من التفاصيل)\nإذا لم ترد أن تخضع كتابتك للتعديل والتوزيع الحر، لا تضعها هنا<br />.\nكما أنك تتعهد بأنك قمت بكتابة ما هو موجود بنفسك، أو قمت بنسخها من مصدر يخضع ضمن الملكية العامة، أو مصدر حر آخر.\n'''لا ترسل أي عمل ذي حقوق محفوظة بدون الإذن من صاحب الحق'''.",
-       "copyrightwarning2": "من فضلك لاحظ أن جميع المساهمات في {{SITENAME}} يمكن أن تعدل أو تتغير أو تزال من قبل المساهمين الآخرين.\nإذا لم تكن ترغب أن تعدل مشاركاتك بهذا الشكل، لا تضعها هنا.<br />\nأنت تقر أيضا أنك كتبت هذا بنفسك، أو نسخته من مصدر يخضع للملكية العامة، أو مصدر حر آخر (انظر $1 للتفاصيل).\n'''لا تضف أي عمل ذي حقوق محفوظة بدون تصريح!'''",
+       "copyrightwarning": "من فضلك لاحظ أن جميع المساهمات ل{{SITENAME}} خاضعة وصادرة تحت ترخيص $2 (انظر $1 للمزيد من التفاصيل).\nإذا لم ترد أن تخضع كتابتك للتعديل والتوزيع الحر، لا تضعها هنا<br />.\nكما أنك تتعهد بأنك قمت بكتابة ما هو موجود بنفسك، أو قمت بنسخها من مصدر يخضع ضمن الملكية العامة، أو مصدر حر آخر.\n<strong>لا ترسل أي عمل ذي حقوق محفوظة بدون الإذن من صاحب الحق!</strong>",
+       "copyrightwarning2": "من فضلك لاحظ أن جميع المساهمات في {{SITENAME}} يمكن أن تعدل أو تتغير أو تزال من قبل المساهمين الآخرين.\nإذا لم تكن ترغب أن تعدل مشاركاتك بهذا الشكل، لا تضعها هنا.<br />\nأنت تقر أيضا أنك كتبت هذا بنفسك، أو نسخته من مصدر يخضع للملكية العامة، أو مصدر حر آخر (انظر $1 للتفاصيل).\n<strong>لا تضف أي عمل ذي حقوق محفوظة بدون تصريح!</strong>",
        "editpage-cannot-use-custom-model": "نموذج المحتوى لهذه الصفحة لا يمكن تغييره.",
-       "longpageerror": "'''خطأ: النص الذي قمت بإدخاله {{PLURAL:$1|واحد كيلوبايت|$1 كيلوبيات}} أطول, وهو أطول من الحد الأقصى {{PLURAL:$2|واحد كيلوبايت|$2 كيلوبايت}}.'''\nو يتعذر حفظه.",
+       "longpageerror": "<strong>خطأ: النص الذي قمت بإدخاله {{PLURAL:$1|واحد كيلوبايت|$1 كيلوبيات}} أطول, وهو أطول من الحد الأقصى {{PLURAL:$2|واحد كيلوبايت|$2 كيلوبايت}}.</strong>\nلا بمكن حفظه.",
        "readonlywarning": "<strong>تحذير: لقد أغلقت قاعدة البيانات للصيانة، لذلك لن تتمكن من حفظ التعديلات التي قمت بها حاليا.\nإذا رغبت بإمكانك أن تنسخ النص الذي تعمل عليه وتحفظه في ملف نصي إلى وقت لاحق.</strong>\n\nإداري النظام الذي أغلقها أعطى هذا التفسير: $1",
-       "protectedpagewarning": "'''تحذير: تمت حماية هذه الصفحة حتى يمكن للمستخدمين ذوي الصلاحيات الإدارية فقط تعديلها.'''\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
-       "semiprotectedpagewarning": "</strong>ملاحظة:</strong> هذه الصفحة محمية بحيث يمكن للمستخدمين المؤكدين تلقائيًّا فقط تعديلها،\nأحدث إدخال سجل متوافر أدناه للرجوع إليه:",
+       "protectedpagewarning": "<strong>تحذير: تمت حماية هذه الصفحة حتى يمكن للمستخدمين ذوي الصلاحيات الإدارية فقط تعديلها.</strong>\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
+       "semiprotectedpagewarning": "<strong>ملاحظة:</strong> هذه الصفحة محمية بحيث يمكن للمستخدمين المؤكدين تلقائيًّا فقط تعديلها،\nأحدث مدخلة سجل معروضة بالأسفل كمرجع:",
        "cascadeprotectedwarning": "<strong>تحذير:</strong> تمت حماية هذه الصفحة بحيث يستطيع المستخدمون [[Special:ListGroupRights|ذوو صلاحيات محددة]] فقط تعديلها، وذلك لأنها مدمجة في {{PLURAL:$1||الصفحة التالية والتي تمت حمايتها|الصفحتين التاليتين واللتين تمت حمايتها|الصفحات التالية والتي تمت حمايتها}} بخاصية \"حماية الصفحات المدمجة\":",
-       "titleprotectedwarning": "'''تحذير:  هذه الصفحة تمت حمايتها بحيث أن [[Special:ListGroupRights|صلاحيات معينة]] مطلوبة لإنشائها.'''\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
+       "titleprotectedwarning": "<strong>تحذير: هذه الصفحة تمت حمايتها بحيث أن [[Special:ListGroupRights|صلاحيات معينة]] مطلوبة لإنشائها.</strong>\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
        "templatesused": "{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذه الصفحة:",
        "templatesusedpreview": "{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذه المعاينة:",
        "templatesusedsection": "{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذا القسم:",
        "permissionserrorstext": "لا تمتلك الصلاحية لفعل هذا، {{PLURAL:$1||للسبب التالي|للسببين التاليين|للأسباب التالية}}:",
        "permissionserrorstext-withaction": "ليست لك الصلاحية ل$2; لل{{PLURAL:$1||سبب التالي|سببين التاليين|أسباب التالية}}:",
        "contentmodelediterror": "أنت لا يمكنك تعديل هذه المراجعة لأن موديل محتواها هو  <code>$1</code>، والذي يختلف عن موديل المحتوى الحالي للصفحة  <code>$2</code>.",
-       "recreate-moveddeleted-warn": "'''تحذير: أنت تعيد إنشاء صفحة سبق حذفها.'''\n\nيجب عليك التيقن من أن الاستمرار بتحرير هذه الصفحة ملائم.\nسجلا الحذف والنقل لهذه الصفحة معروضان هنا للتيسير:",
+       "recreate-moveddeleted-warn": "<strong>تحذير: أنت تعيد إنشاء صفحة سبق حذفها.</strong>\n\nيجب عليك التيقن من أن الاستمرار بتحرير هذه الصفحة ملائم.\nسجلا الحذف والنقل لهذه الصفحة معروضان هنا للتيسير:",
        "moveddeleted-notice": "هذه الصفحة تم حذفها.\nسجلا حذف ونقل الصفحة معروضان بالأسفل كمرجع.",
        "moveddeleted-notice-recent": "عذرا، هذه الصفحة تم حذفها مؤخرا (في آخر 24 ساعة).\nسجلا حذف ونقل الصفحة معروضان بالأسفل كمرجع.",
        "log-fulllog": "أظهر السجل الكامل",
        "duplicate-args-warning": "<strong>تنبيه:</strong> المدخل \"$3\" ل[[:$1]] المستعمل في [[:$2]] مكرر. آخر قيمة مكرر منه هي المعتمدة.",
        "duplicate-args-category": "صفحات تستعمل قالبا ببيانات مكررة",
        "duplicate-args-category-desc": "تحوي هذه الصفحة استدعاءات قالب تستخدم متغيرات مزدوجة مثل <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> أو <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
-       "expensive-parserfunction-warning": "'''تحذير:''' هذه الصفحة تحتوي على استدعاءات دالة محلل كثيرة مكلفة.\n\nينبغي أن تكون أقل من {{PLURAL:$2||استدعاء واحد|استدعاءين|$2 استدعاءات|$2 استدعاء}}، يوجد الآن {{PLURAL:$1|استدعاء واحد|استدعاءان|$2 استدعاءات|$2 استدعاء}}.",
+       "expensive-parserfunction-warning": "<strong>تحذير:</strong> هذه الصفحة تحتوي على استدعاءات دالة محلل كثيرة مكلفة.\n\nينبغي أن تكون أقل من {{PLURAL:$2||استدعاء واحد|استدعاءين|$2 استدعاءات|$2 استدعاء}}، يوجد الآن {{PLURAL:$1|استدعاء واحد|استدعاءان|$2 استدعاءات|$2 استدعاء}}.",
        "expensive-parserfunction-category": "تجاوزات الدوال المكلفة",
-       "post-expand-template-inclusion-warning": "'''تحذير:''' حجم تضمين القالب كبير جدا.\nبعض القوالب لن تضمن.",
+       "post-expand-template-inclusion-warning": "<strong>تحذير:</strong> حجم تضمين القالب كبير جدا.\nبعض القوالب لن تضمن.",
        "post-expand-template-inclusion-category": "تجاوزات حجم التضمين بعد التوسيع",
-       "post-expand-template-argument-warning": "'''تحذير:''' هذه الصفحة تحتوي على عامل قالب واحد على الأقل له حجم تمدد كبير جدا.\nهذه العوامل تم حذفها.",
+       "post-expand-template-argument-warning": "<strong>تحذير:</strong> هذه الصفحة تحتوي على عامل قالب واحد على الأقل له حجم تمدد كبير جدا.\nهذه العوامل تم حذفها.",
        "post-expand-template-argument-category": "تجاوزات معطيات القوالب",
        "parser-template-loop-warning": "تم كشف حلقة قالب: [[$1]]",
        "template-loop-category": "الصفحات بحلقات قالب",
        "undo-nochange": "يبدو أن التعديل قد تم التراجع عنه بالفعل.",
        "undo-summary": "الرجوع عن التعديل $1 بواسطة [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]])",
        "undo-summary-username-hidden": "الرجوع عن المراجعة $1 التي أجراها مستخدمي مخفي",
-       "cantcreateaccount-text": "إنشاء الحسابات من عنوان الأيبي هذا ('''$1''') تم منعه بواسطة [[User:$3|$3]].\n\nالسبب المعطى بواسطة $3 هو ''$2''",
+       "cantcreateaccount-text": "إنشاء الحسابات من عنوان الأيبي هذا (<strong>$1</strong>) تم منعه بواسطة [[User:$3|$3]].\n\nالسبب المعطى بواسطة $3 هو <em>$2</em>",
        "cantcreateaccount-range-text": "إنشاء الحسابات من عناوين الآيبي في النطاق <strong>$1</strong>، التي تحتوي على الآيبي الخاص بك (<strong>$4</strong>)، قد منعها [[User:$3|$3]].\n\nالسبب المعطى بواسطة $3 هو <em>$2</em>",
        "viewpagelogs": "عرض سجلات هذه الصفحة",
        "nohistory": "لا يوجد تاريخ للتعديلات لهذه الصفحة.",
        "last": "السابق",
        "page_first": "الأولى",
        "page_last": "الأخيرة",
-       "histlegend": "اختيار الفرق: علم على صناديق النسخ للمقارنة واضغط قارن بين النسخ المختارة أو الزر بالأسفل.<br />\nمفتاح: (الحالي) = الفرق مع النسخة الحالية\n(السابق) = الفرق مع النسخة السابقة، ط = تغيير طفيف",
+       "histlegend": "اختيار الفرق: علم على صناديق النسخ للمقارنة واضغط قارن بين النسخ المختارة أو الزر بالأسفل.<br />\nمفتاح: <strong>({{int:cur}})</strong> = الفرق مع النسخة الحالية، <strong>({{int:last}})</strong> = الفرق مع النسخة السابقة، <strong>{{int:minoreditletter}}</strong> = تغيير طفيف.",
        "history-fieldset-title": "تصفية المراجعات",
        "history-show-deleted": "المحذوفة فقط",
        "histfirst": "الأقدم",
        "rev-deleted-user": "(اسم المستخدم تمت إزالته)",
        "rev-deleted-event": "(تفاصيل السجل تمت إزالتها)",
        "rev-deleted-user-contribs": "[اسم المستخدم أو عنوان الأيبي تمت إزالته - التعديل مخفي من المساهمات]",
-       "rev-deleted-text-permission": "'''حُذِفت''' مراجعة هذه الصفحة.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
+       "rev-deleted-text-permission": "<strong>حُذِفت</strong> مراجعة هذه الصفحة.\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 رؤية هذه المراجعة] إذا أردت المتابعة.",
-       "rev-suppressed-text-unhide": "'''أُخفيت''' مراجعة الصفحة هذه.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].\nبإمكانك [$1 رؤية هذه المراجعة] إذا أردت المتابعة.",
-       "rev-deleted-text-view": "'''حُذِفت''' مراجعة هذه الصفحة.\nيمكنك رؤيتها؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
-       "rev-suppressed-text-view": "'''أُخفيت''' مراجعة الصفحة هذه.\nيمكنك رؤيتها؛ ويمكنك العثور على التفاصيل في  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].",
-       "rev-deleted-no-diff": "لا يمكنك رؤية هذا الفرق لأن إحدى المراجعات '''حُذِفت'''.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
-       "rev-suppressed-no-diff": "ليس بإمكانك مشاهدة هذا الفرق لأن إحدى المراجعات '''حذفت'''.",
-       "rev-deleted-unhide-diff": "'''حُذِفت''' إحدى مراجعتي هذا الفرق.\nيمكن العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].\nبإمكانك [$1 رؤية هذا الفرق] إذا أردت المتابعة.",
-       "rev-suppressed-unhide-diff": "'''أُخفيت''' إحدى مراجعتي هذا الفرق.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].\nبإمكانك [$1 رؤية هذا الفرق] إذا أردت المتابعة.",
-       "rev-deleted-diff-view": "'''حُذِفت''' إحدى مراجعتي هذا الفرق.\nيمكنك رؤية الفرق؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
-       "rev-suppressed-diff-view": "'''أُخفيت''' إحدى مراجعتي هذا الفرق.\nيمكنك رؤية هذا الفرق؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].",
+       "rev-suppressed-text-unhide": "<strong>أُخفيت</strong> مراجعة الصفحة هذه.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].\nبإمكانك [$1 رؤية هذه المراجعة] إذا أردت المتابعة.",
+       "rev-deleted-text-view": "<strong>حُذِفت</strong> مراجعة هذه الصفحة.\nيمكنك رؤيتها؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
+       "rev-suppressed-text-view": "<strong>أُخفيت</strong> مراجعة الصفحة هذه.\nيمكنك رؤيتها؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].",
+       "rev-deleted-no-diff": "لا يمكنك رؤية هذا الفرق لأن إحدى المراجعات <strong>حُذِفت</strong>.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
+       "rev-suppressed-no-diff": "ليس بإمكانك مشاهدة هذا الفرق لأن إحدى المراجعات <strong>حذفت</strong>.",
+       "rev-deleted-unhide-diff": "<strong>حُذِفت</strong> إحدى مراجعتي هذا الفرق.\nيمكن العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].\nبإمكانك [$1 رؤية هذا الفرق] إذا أردت المتابعة.",
+       "rev-suppressed-unhide-diff": "<strong>أُخفيت</strong> إحدى مراجعتي هذا الفرق.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].\nبإمكانك [$1 رؤية هذا الفرق] إذا أردت المتابعة.",
+       "rev-deleted-diff-view": "<strong>حُذِفت</strong> إحدى مراجعتي هذا الفرق.\nيمكنك رؤية الفرق؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
+       "rev-suppressed-diff-view": "<strong>أُخفيت</strong> إحدى مراجعتي هذا الفرق.\nيمكنك رؤية هذا الفرق؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].",
        "rev-delundel": "أظهر/أخف",
        "rev-showdeleted": "أظهر",
        "revisiondelete": "حذف/استرجاع المراجعات",
        "revdelete-text-text": "المراجعات المحذوفة ستظل تظهر في تاريخ الصفحة، ولكن أجزاءا من محتواها سيكون محجوبا عن الجميع.",
        "revdelete-text-file": "ستبقى نسخ الملف المحذوفة تظهر في تاريخ الملف، ولكن جزءاً من مضمونها لن تكون متاحة للعموم.",
        "logdelete-text": "ستبقى أحداث السجل المحذوفة تظهر في السجلات، لكن جزءاً من مضمونها لن يتاح للعموم.",
-       "revdelete-text-others": "سيتمكن الإداريون الآخرون على {{SITENAME}} من الوصول إلى المحتوى المخفي وإلغاء حذفه مجددا من خلال ذات الواجهة ما لم تطبق قيود إضافية.",
-       "revdelete-confirm": "الإداريون الآخرون في {{SITENAME}} سيظل بإمكانهم رؤية المحتوى المخفي ويمكنهم استرجاعه مجددا من خلال هذه الواجهة نفسها، مالم يتم وضع قيود إضافية.\nمن فضلك أكد أنك تنوي فعل هذا، وأنك تفهم العواقب، وأنك تفعل هذا بالتوافق مع [[{{MediaWiki:Policy-url}}|السياسة]].",
-       "revdelete-suppress-text": "ينبغي للإخفاء أن يستخدم '''فقط''' في الحالات التالية:\n* معلومات يحتمل أن تكون تشهيرية\n* معلومات شخصية غير ملائمة\n*: ''عناوين المنازل وأرقام الهواتف وأرقام الهويات الوطنية إلى آخره.''",
+       "revdelete-text-others": "سيتمكن الإداريون الآخرون من الوصول إلى المحتوى المخفي وإلغاء حذفه مجددا، ما لم تطبق قيود إضافية.",
+       "revdelete-confirm": "من فضلك أكد أنك تنوي فعل هذا، وأنك تفهم العواقب، وأنك تفعل هذا بالتوافق مع [[{{MediaWiki:Policy-url}}|السياسة]].",
+       "revdelete-suppress-text": "ينبغي للإخفاء أن يستخدم <strong>فقط</strong> في الحالات التالية:\n* معلومات يحتمل أن تكون تشهيرية\n* معلومات شخصية غير ملائمة\n*: <em>عناوين المنازل وأرقام الهواتف وأرقام الهويات الوطنية إلى آخره.</em>",
        "revdelete-legend": "وضع ضوابط رؤية",
        "revdelete-hide-text": "نص المراجعة",
        "revdelete-hide-image": "أخف محتوى الملف",
        "revdelete-show-no-access": "خطأ في إظهار العنصر ذا التاريخ $2 $1: هذا العنصر معلم ك\"مقيد\".\nليس لك صلاحية الوصول إليه.",
        "revdelete-modify-no-access": "خطأ في تعديل العنصر ذا التاريخ $2 $1: هذا العنصر معلم ك\"مقيد\".\nليس لك صلاحية الوصول إليه.",
        "revdelete-modify-missing": "خطأ في تعديل العنصر ذا الهوية $1: العنصر مفقود من قاعدة البيانات!",
-       "revdelete-no-change": "'''تحذير:''' العنصر ذو التاريخ $2 $1 لديه أصلا إعدادات الظهور المطلوبة.",
+       "revdelete-no-change": "<strong>تحذير:</strong> العنصر ذو التاريخ $2 $1 لديه أصلا إعدادات الظهور المطلوبة.",
        "revdelete-concurrent-change": "خطأ في تعديل العنصر ذي التاريخ $2 $1: تظهر حالته أن شخصا آخر عدله أثناء محاولتك تعديله.\nمن فضلك راجع السجلات.",
        "revdelete-only-restricted": "خطأ إخفاء العنصر المؤرخ $2, $1: لا تستطيع تنحية العناصر من عرض الإداريين بدون أن تحدد أيضا إحدى خيارات التنحية الأخرى.",
        "revdelete-reason-dropdown": "* أسباب حذف عامة\n** خرق لحقوق النشر\n** تعليق أو معلومات شخصية غير ملائمة\n** اسم مستخدم غير ملائم\n** معلومات تشهيرية محتملة",
        "nextn-title": "$1 {{PLURAL:$1|نتيجة|نتيجة}} تالية",
        "shown-title": "عرض $1 {{PLURAL:$1|نتيجة|نتيجة}} لكل صفحة",
        "viewprevnext": "عرض ($1 {{int:pipe-separator}} $2) ($3).",
-       "searchmenu-exists": "'''توجد صفحة اسمها \"[[:$1]]\" على هذه الويكي.''' {{PLURAL:$2|0=|انظر ايضا نتائج البحث الأخرى.}}",
-       "searchmenu-new": "<strong>أنشئ الصفحة \"[[:$1]]\" في هذه الويكي. انظر أيضا </strong> {{PLURAL:$2|0=|الصفحة التي وجدت بالبحث.|نتائج البحث.}}",
+       "searchmenu-exists": "<strong>توجد صفحة اسمها \"[[:$1]]\" على هذه الويكي.</strong> {{PLURAL:$2|0=|انظر ايضا نتائج البحث الأخرى.}}",
+       "searchmenu-new": "<strong>أنشئ الصفحة \"[[:$1]]\" في هذه الويكي.</strong> {{PLURAL:$2|0=|انظر أيضا الصفحة التي وجدت بالبحث.|انظر أيضا نتائج البحث التي وجدت.}}",
        "searchprofile-articles": "صفحات المحتوى",
        "searchprofile-images": "الوسائط المتعددة",
        "searchprofile-everything": "الكل",
        "search-relatedarticle": "مرتبطة",
        "searchrelated": "مرتبطة",
        "searchall": "الكل",
-       "showingresults": "معروض بالأسفل {{PLURAL:$1|'''1''' نتيجة|'''$1''' نتيجة}} بدءا من رقم '''$2'''.",
+       "showingresults": "معروض بالأسفل {{PLURAL:$1|<strong>1</strong> نتيجة}} بدءا من رقم <strong>$2</strong>.",
        "showingresultsinrange": "بالأسفل {{PLURAL:$1|نتيجة واحدة|<strong>$1</strong> نتائج|<strong>$1</strong> نتيجة}} في النطاق من <strong>$2</strong> إلى <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|النتائج <strong>$1</strong> من <strong>$3</strong>|النتائج <strong>$1 - $2</strong> من أصل <strong>$3</strong>}}",
        "search-nonefound": "لا توجد نتائج تطابق الاستعلام.",
        "rcfilters-filter-showlinkedto-label": "عرض التغييرات في الصفحات الموصولة بصفحة",
        "rcfilters-filter-showlinkedto-option-label": "<strong>الصفحات الموصولة إلى</strong> الصفحة المختارة",
        "rcfilters-target-page-placeholder": "أدخل اسم صفحة (أو تصنيف)",
-       "rcnotefrom": "بالأسفل {{PLURAL:$5|التغيير|التغييرات}} منذ <strong>$2</strong> (إلى <strong>$1</strong> معروضة).",
+       "rcnotefrom": "بالأسفل {{PLURAL:$5|التغيير|التغييرات}} منذ <strong>$3، $4</strong> (إلى <strong>$1</strong> معروضة).",
        "rclistfromreset": "إعادة ضبط خيار التاريخ",
        "rclistfrom": "أظهر التغييرات بدءًا من $3 $2",
        "rcshowhideminor": "$1 التعديلات الطفيفة",
        "upload_directory_missing": "مجلد الرفع ($1) مفقود ولم يمكن إنشاؤه بواسطة خادم الويب.",
        "upload_directory_read_only": "مجلد الرفع ($1) لا يمكن الكتابة عليه بواسطة خادم الويب.",
        "uploaderror": "خطأ في الرفع",
-       "upload-recreate-warning": "'''تحذير: سبق حذف أو نقل ملف بهذا الاسم.'''\n\nسجلا الحذف والنقل لهذه الصفحة معروضان هنا للتيسير:",
-       "uploadtext": "استخدم الاستمارة بالأسفل لرفع الملفات.\nلرؤية أو البحث في الملفات المرفوعة سابقا، راجع [[Special:FileList|قائمة الملفات المرفوعة]]، عمليات الرفع (وإعادة الرفع) مسجلة في [[Special:Log/upload|سجل الرفع]] وعمليات الحذف في [[Special:Log/delete|سجل الحذف]].\n\nلإدراج صورة في صفحة، استخدم الوصلات في الصيغ التالية:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' لاستخدام النسخة الكاملة لملف\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|نص بديل]]</nowiki></code>''' لاستخدام صورة عرضها 200 بكسل في صندوق في الجانب الأيسر مع 'نص بديل' كوصف\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' للوصل للملف مباشرة بدون عرض الملف.",
+       "upload-recreate-warning": "<strong>تحذير: سبق حذف أو نقل ملف بهذا الاسم.</strong>\n\nسجلا الحذف والنقل لهذه الصفحة معروضان هنا للتيسير:",
+       "uploadtext": "استخدم الاستمارة بالأسفل لرفع الملفات.\nلرؤية أو البحث في الملفات المرفوعة سابقا، راجع [[Special:FileList|قائمة الملفات المرفوعة]]، عمليات الرفع (وإعادة الرفع) مسجلة في [[Special:Log/upload|سجل الرفع]] وعمليات الحذف في [[Special:Log/delete|سجل الحذف]].\n\nلإدراج صورة في صفحة، استخدم الوصلات في الصيغ التالية:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> لاستخدام النسخة الكاملة لملف\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|نص بديل]]</nowiki></code></strong> لاستخدام صورة عرضها 200 بكسل في صندوق في الجانب الأيسر مع \"نص بديل\" كوصف\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> للوصل للملف مباشرة بدون عرض الملف",
        "upload-permitted": "أنواع الملفات المسموحة {{PLURAL:$2|type|types}}: $1.",
        "upload-preferred": "أنواع الملفات المفضلة {{PLURAL:$2|type|types}}: $1.",
        "upload-prohibited": "أنواع الملفات الممنوعة {{PLURAL:$2|type|types}}: $1.",
        "filetype-mime-mismatch": "امتداد الملف \".$1\" لا يطابق نوع MIME للملف ($2).",
        "filetype-badmime": "من غير المسموح به رفع ملفات من النوع \"$1\".",
        "filetype-bad-ie-mime": "لم يمكن رفع هذا المف لأن إنترنت إكسبلورر سيكتشفه ك\"$1\", وهو نوع ملف ممنوع ومن المحتمل أن يكون خطرا.",
-       "filetype-unwanted-type": "'''\".$1\"''' هو نوع ملف غير مرغوب فيه.\n{{PLURAL:$3|نوع الملف المفضل هو|أنواع الملفات المفضلة هي}} $2.",
-       "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|ليس نوع ملف مسموح به|ليسوا أنواع ملفات مسموح بها}}.\n{{PLURAL:$3|نوع الملف المسموح به هو|أنواع الملفات المسموح بها هي}} $2.",
+       "filetype-unwanted-type": "<strong>\".$1\"</strong> هو نوع ملف غير مرغوب فيه.\n{{PLURAL:$3|نوع الملف المفضل هو|أنواع الملفات المفضلة هي}} $2.",
+       "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|ليس نوع ملف مسموح به|ليسوا أنواع ملفات مسموح بها}}.\n{{PLURAL:$3|نوع الملف المسموح به هو|أنواع الملفات المسموح بها هي}} $2.",
        "filetype-missing": "الملف بدون امتداد (مثل \".jpg\").",
        "empty-file": "الملف الذي أرسلته كان فارغا.",
        "file-too-large": "الملف الذي أرسلته كان كبيرا جدا.",
        "largefileserver": "حجم هذا الملف أكبر من المسموح به على هذا الخادوم.",
        "emptyfile": "يبدو أن الملف الذي رفعته فارغ.\nقد يكون سبب ذلك خطأ في كتابة الاسم.\nمن فضلك تأكد من أنك تريد فعلا رفع هذا الملف.",
        "windows-nonascii-filename": "هذا ويكي لا يعتمد أسماء الملفات مع الأحرف الخاصة.",
-       "fileexists": "Ù\87Ù\86اÙ\83 Ù\85Ù\84Ù\81 Ù\85Ù\88جÙ\88د Ù\8aØ­Ù\85Ù\84 Ù\86Ù\81س Ù\87ذا Ø§Ù\84اسÙ\85 Ø§Ù\84رجاء Ø§Ù\84تأÙ\83د Ù\85Ù\86 Ù\87ذا Ø§Ù\84Ù\85Ù\84Ù\81 Ø¨Ø§ØªØ¨Ø§Ø¹ Ø§Ù\84Ù\88صÙ\84Ø© Ø§Ù\84تاÙ\84Ù\8aØ© <strong>[[:$1]]</strong> Ù\82بÙ\84 Ø§Ù\84Ù\82Ù\8aاÙ\85 Ø¨تغييره.\n[[$1|thumb]]",
+       "fileexists": "Ù\87Ù\86اÙ\83 Ù\85Ù\84Ù\81 Ù\85Ù\88جÙ\88د Ù\8aØ­Ù\85Ù\84 Ù\86Ù\81س Ù\87ذا Ø§Ù\84اسÙ\85 Ø§Ù\84رجاء Ø§Ù\84تحÙ\82Ù\82 Ù\85Ù\86 <strong>[[:$1]]</strong> Ù\84Ù\88 {{GENDER:|Ù\83Ù\86ت}} ØºÙ\8aر Ù\85تأÙ\83د Ø£Ù\86Ù\83 ØªØ±Ù\8aد تغييره.\n[[$1|thumb]]",
        "filepageexists": "أنشئت صفحة وصف هذا الملف في <strong>[[:$1]]</strong>، لكن لا يوجد ملف بهذا الاسم حالياً.\nلن يظهر الملخص الذي تدخله على صفحة الوصف.\nلجعل ملخصك يظهر هناك، ستحتاج إلى تعديله يدوياً.\n[[$1|thumb]]",
        "fileexists-extension": "يوجد ملف باسم مشابه: [[$2|thumb]]\n* اسم الملف المراد رفعه: <strong>[[:$1]]</strong>\n* اسم الملف الموجود: <strong>[[:$2]]</strong>\nمن فضلك اختر اسماً مختلفاً.",
-       "fileexists-thumbnail-yes": "يبدو أن الملف مصغرا لحجم أعلى ''(تصغير)''. [[$1|thumb]]\nمن فضلك افحص الملف <strong>[[:$1]]</strong>.\nإن كان هو نفس الملف بالحجم الأصلي فلا داعي لرفع تصغير إضافي.",
-       "file-thumbnail-no": "يبدأ الملف ب <strong>$1</strong>.\nيبدو أن الملف مصغرا لحجم أعلى ''(تصغير)''.\nإذا كانت لديك الصورة في درجة دقة كاملة قم برفعها، أو قم بتغيير اسم الملف من فضلك.",
+       "fileexists-thumbnail-yes": "يبدو أن الملف مصغرا لحجم أعلى <em>(thumbnail)</em>.\n[[$1|thumb]]\nمن فضلك افحص الملف <strong>[[:$1]]</strong>.\nإن كان هو نفس الملف بالحجم الأصلي فلا داعي لرفع تصغير إضافي.",
+       "file-thumbnail-no": "يبدأ الملف ب <strong>$1</strong>.\nيبدو أن الملف مصغرا لحجم أعلى <em>(thumbnail)</em>.\nإذا كانت لديك الصورة في درجة دقة كاملة قم برفعها، أو قم بتغيير اسم الملف من فضلك.",
        "fileexists-forbidden": "هناك ملف موجود بهذا الاسم بالفعل، ولا يمكن إعادة الكتابة عليه.\nلو أنك مازلت تريد رفع ملفك، من فضلك عد واستخدم اسماً جديداً. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "يوجد ملف بنفس الاسم بالفعل في مستودع الملفات المشترك.\nلو كنت مازلت تريد رفع ملفك، من فضلك ارجع واستخدم اسماً جديداً.\n[[File:$1|thumb|center|$1]]",
        "fileexists-no-change": "الملف المرفوع هو نسخة مطابقة تمامًا للنسخة الحالية من <strong>[[:$1]]</strong>.",
        "watchthisupload": "راقب هذا الملف",
        "filewasdeleted": "تم رفع ثم حذف ملف بهذا الاسم من قبل.\nمن الأفضل مراجعة $1 قبل رفعه مرة أخرى.",
        "filename-thumb-name": "هذا يبدو وكأنه عنوان صورة مصغرة. من فضلك لا ترفع صورة مصغرة لنفس الويكي مرة ثانية. أو، من فضلك أصلح اسم الملف بحيث يكون معبرا أكثر، ولا يحتوي على بادئة الصورة المصغرة.",
-       "filename-bad-prefix": "اسم الملف الذي ترفعه يبدأ ب'''\"$1\"'''، وهو اسم غير وصفي غالباً ما تخصصه الكاميرات الرقمية تلقائياً.\nمن فضلك اختر اسماً يصف ملفك بوضوح أكثر.",
+       "filename-bad-prefix": "اسم الملف الذي ترفعه يبدأ ب<strong>\"$1\"</strong>، وهو اسم غير وصفي غالباً ما تخصصه الكاميرات الرقمية تلقائياً.\nمن فضلك اختر اسماً يصف ملفك بوضوح أكثر.",
        "filename-prefix-blacklist": " #<!-- اترك هذا السطر تماما كما هو --> <pre>\n# الصيغة كالتالي:\n#   * كل شيء من علامة \"#\" إلى آخر السطر هو تعليق\n#   * كل سطر غير فارغ هو بادئة لأسماء الملفات النمطية التي توضع تلقائيا بواسطة الكاميرات الرقمية\nCIMG # كاسيو\nDSC_ # نيكون\nDSCF # فوجي\nDSCN # نيكون\nDUW # بعض الهواتف المحمولة\nIMG # عام\nJD # جينوبتيك\nMGP # بينتاكس\nPICT # متنوع\n #</pre> <!-- اترك هذا السطر تماما كما هو -->",
        "upload-proto-error": "بروتوكول غير صحيح",
        "upload-proto-error-text": "الرفع عن بعد يتطلب مساراً يبدأ بـ <code>http://</code> أو <code>ftp://</code>.",
        "upload-disallowed-here": "لا يمكنك استبدال هذا الملف.",
        "filerevert": "استرجع $1",
        "filerevert-legend": "استرجع الملف",
-       "filerevert-intro": "أنت تسترجع '''[[Media:$1|$1]]''' [$4 لنسخة بتاريخ $2، $3].",
+       "filerevert-intro": "أنت تسترجع الملف <strong>[[Media:$1|$1]]</strong> للنسخة [$4 بتاريخ $3، $2].",
        "filerevert-comment": "السبب:",
        "filerevert-defaultcomment": "استرجع للنسخة بتاريخ $2، $1 ($3)",
        "filerevert-submit": "استرجع",
-       "filerevert-success": "'''[[Media:$1|$1]]''' تم استرجاعها [$4 للنسخة بتاريخ $3، $2].",
+       "filerevert-success": "<strong>[[Media:$1|$1]]</strong> تم استرجاعه [$4 للنسخة بتاريخ $3، $2].",
        "filerevert-badversion": "لا توجد نسخة محلية سابقة لهذا الملف بالتاريخ المعطى.",
        "filerevert-identical": "الإصدار الحالي من الملف بالفعل مطابق للإصدار المحدد.",
        "filedelete": "حذف $1",
        "filedelete-legend": "حذف الملف",
        "filedelete-intro": "أنت على وشك حذف الملف <strong>[[Media:$1|$1]]</strong> مع كل تاريخه.",
-       "filedelete-intro-old": "أنت تحذف نسخة '''[[Media:$1|$1]]''' بتاريخ [$4 $3، $2].",
+       "filedelete-intro-old": "أنت تحذف نسخة <strong>[[Media:$1|$1]]</strong> بتاريخ [$4 $3، $2].",
        "filedelete-comment": "السبب:",
        "filedelete-submit": "حذف",
-       "filedelete-success": "'''$1''' تم حذفه.",
-       "filedelete-success-old": "نسخة '''[[Media:$1|$1]]''' بتاريخ $3، $2 تم حذفها.",
-       "filedelete-nofile": "'''$1''' غير موجود.",
-       "filedelete-nofile-old": "لا توجد نسخة مؤرشفة من '''$1''' بالعناصر المحددة.",
+       "filedelete-success": "<strong>$1</strong> تم حذفه.",
+       "filedelete-success-old": "نسخة <strong>[[Media:$1|$1]]</strong> بتاريخ $3، $2 تم حذفها.",
+       "filedelete-nofile": "<strong>$1</strong> غير موجود.",
+       "filedelete-nofile-old": "لا توجد نسخة مؤرشفة من <strong>$1</strong> بالعناصر المحددة.",
        "filedelete-otherreason": "سبب إضافي/آخر:",
        "filedelete-reason-otherlist": "سبب آخر",
        "filedelete-reason-dropdown": "*أسباب الحذف الشائعة\n** خرق حقوق النشر\n** ملف مكرر",
        "notvisiblerev": "المراجعة تم حذفها",
        "watchlist-details": "{{PLURAL:$1||صفحة واحدة|صفحتان|$1 صفحات|$1 صفحة}} في قائمة مراقبتك (بالإضافة لصفحات النقاش).",
        "wlheader-enotif": "الإخطار بالبريد الإلكتروني مُفعّل.",
-       "wlheader-showupdated": "الصفحات التي تم تحريرها بعد مطالعتك إياها آخر مرة عناوينها بالخط '''الغليظ'''",
-       "wlnote": "بالأسفل {{PLURAL:$1|لا توجد تغييرات|التغيير الأخير|آخر تغييرين|آخر '''$1''' تغييرات|آخر '''$1''' تغييرا|آخر '''$1''' تغيير}} في {{PLURAL:$2||'''الساعة''' الماضية|'''الساعتين''' الماضيتين|ال'''$2''' ساعات الماضية|ال'''$2''' ساعة الماضية}} وفقاً ل$3، $4.",
+       "wlheader-showupdated": "الصفحات التي تم تحريرها بعد مطالعتك إياها آخر مرة عناوينها بالخط <strong>الغليظ</strong>.",
+       "wlnote": "بالأسفل {{PLURAL:$1|لا توجد تغييرات|التغيير الأخير|آخر تغييرين|آخر <strong>$1</strong> تغييرات|آخر <strong>$1</strong> تغييرا|آخر <strong>$1</strong> تغيير}} في {{PLURAL:$2||<strong>الساعة</strong> الماضية|<strong>الساعتين</strong> الماضيتين|ال<strong>$2</strong> ساعات الماضية|ال<strong>$2</strong> ساعة الماضية}} وفقاً ل$3، $4.",
        "wlshowlast": "عرض آخر $1 ساعات $2 يوما",
        "watchlist-hide": "إخفاء",
        "watchlist-submit": "أظهر",
        "watcherrortext": "حدث خطأ أثناء تغيير إعدادات الرصد الخاصة بك \"$1\".",
        "enotif_reset": "علم على كل الصفحات كمرئية",
        "enotif_impersonal_salutation": "مستخدم {{SITENAME}}",
-       "enotif_subject_deleted": "اÙ\84صÙ\81حة {{SITENAME}} $1 Ø­Ø°Ù\81Ù\87ا {{اÙ\84جÙ\86س: $2 | $2 }}",
-       "enotif_subject_created": "اÙ\84صÙ\81حة {{SITENAME}}  $1  Ø£Ù\86شأÙ\87ا {{اÙ\84جÙ\86س: $2 | $2 }}",
+       "enotif_subject_deleted": "صÙ\81حة {{SITENAME}} ØªÙ\85 $1 {{GENDER:$2|حذÙ\81Ù\87ا}} Ø¨Ù\88اسطة $2",
+       "enotif_subject_created": "صÙ\81حة {{SITENAME}} ØªÙ\85 $1 {{GENDER:$2|Ø¥Ù\86شاؤÙ\87ا}} Ø¨Ù\88اسطة $2",
        "enotif_subject_moved": "صفحة {{SITENAME}} $1 {{GENDER:$2|نقلها|نقلتها}} $2",
        "enotif_subject_restored": "صفحة {{SITENAME}} $1 {{GENDER:$2|استرجعها|استرجعتها}} $2",
        "enotif_subject_changed": "صفحة {{SITENAME}} $1 {{GENDER:$2|عدلها|عدلتها}} $2",
        "exbeforeblank": "المحتوى قبل الإفراغ كان: \"$1\"",
        "delete-confirm": "حذف \"$1\"",
        "delete-legend": "حذف",
-       "historywarning": "'''تنبيه:''' الصفحة التي تريد حذفها بها {{PLURAL:$1|نسخة|نسخة واحدة|نسختان|$1 نسخ|$1 نسخة}}. انظر",
+       "historywarning": "<strong>تنبيه:</strong> الصفحة التي تريد حذفها بها {{PLURAL:$1|نسخة|نسخة واحدة|نسختان|$1 نسخ|$1 نسخة}}:",
        "historyaction-submit": "عرض المراجعات",
        "confirmdeletetext": "أنت على وشك أن تقوم بحذف صفحة بالإضافة إلى كل تاريخها.\nمن فضلك التأكد من عزمك على الحذف، وبأنك مدرك للعواقب، وبأنك تقوم بهذا بالتوافق مع [[{{MediaWiki:Policy-url}}|السياسة]].",
        "actioncomplete": "انتهاء العملية",
        "protect_expiry_invalid": "وقت الانتهاء غير صحيح.",
        "protect_expiry_old": "وقت انتهاء المنع يقع في الماضي.",
        "protect-unchain-permissions": "ألغ قفل خيارات الحماية الأخرى",
-       "protect-text": "يمكنك هنا أن تعرض وتغير مستوى الحماية للصفحة '''$1'''.",
-       "protect-locked-blocked": "لا يمكنك تغيير مستويات الحماية وأنت ممنوع.\nالإعدادات الحالية للصفحة '''$1''' هي:",
-       "protect-locked-dblock": "لا يمكن تغيير مستويات الحماية بسبب غلق قاعدة البيانات حاليا.\nالإعدادات الحالية للصفحة '''$1''' هي:",
-       "protect-locked-access": "لا يملك حسابك هذا صلاحية تغيير مستوى حماية الصفحة.\nالإعدادات الحالية للصفحة '''$1''' هي:",
+       "protect-text": "يمكنك هنا أن تعرض وتغير مستوى الحماية للصفحة <strong>$1</strong>.",
+       "protect-locked-blocked": "لا يمكنك تغيير مستويات الحماية وأنت ممنوع.\nالإعدادات الحالية للصفحة <strong>$1</strong> هي:",
+       "protect-locked-dblock": "لا يمكن تغيير مستويات الحماية بسبب غلق قاعدة البيانات حاليا.\nالإعدادات الحالية للصفحة <strong>$1</strong> هي:",
+       "protect-locked-access": "لا يملك حسابك هذا صلاحية تغيير مستوى حماية الصفحة.\nالإعدادات الحالية للصفحة <strong>$1</strong> هي:",
        "protect-cascadeon": "هذه الصفحة محمية حاليا لكونها مضمنة في {{PLURAL:$1||الصفحة التالية|الصفحتين التاليتين|الصفحات التالية}}، والتي بها خيار حماية الصفحات المدمجة فعال.\nلن يؤثر تغيير مستوى حماية هذه الصفحة على حماية الصفحات المدمجة.",
        "protect-default": "اسمح لكل المستخدمين",
        "protect-fallback": "السماح فقط للمستخدمين ذوي الصلاحية \"$1\"",
        "restriction-level-all": "أي مستوى",
        "undelete": "عرض الصفحات المحذوفة",
        "undeletepage": "عرض واسترجاع الصفحات المحذوفة",
-       "undeletepagetitle": "'''التالي يتكون من المراجعات المحذوفة من [[:$1]]'''.",
+       "undeletepagetitle": "<strong>التالي يتكون من المراجعات المحذوفة من [[:$1|$1]]</strong>.",
        "viewdeletedpage": "عرض الصفحات المحذوفة",
        "undeletepagetext": "حُذفت {{PLURAL:$1||الصفحة التالية|الصفحتان التاليتان|$1 الصفحات التالية|ال$1 صفحة التالية}} ولكنها مازالت في الأرشيف ويمكن استرجاعها.\nقد يمسح الأرشيف دوريا.",
        "undelete-fieldset-title": "استرجاع المراجعات",
-       "undeleteextrahelp": "لاسترجاع تاريخ الصفحة كاملا، اترك جميع الصناديق فارغة واضغط '''''{{int:undeletebtn}}'''''..\nللاسترجاع بشكل انتقائي، ضع علامة في الصناديق أمام المراجعات التي تريد استرجاعها، واضغط '''''{{int:undeletebtn}}'''''.",
+       "undeleteextrahelp": "لاسترجاع تاريخ الصفحة كاملا، اترك جميع الصناديق فارغة واضغط <strong><em>{{int:undeletebtn}}</em></strong>.\nللاسترجاع بشكل انتقائي، ضع علامة في الصناديق أمام المراجعات التي تريد استرجاعها، واضغط <strong><em>{{int:undeletebtn}}</em></strong>.",
        "undeleterevisions": "{{PLURAL:$1|لم تحذف أي مراجعة|حذفت مراجعة واحدة|حذفت مراجعتان|حذفت $1 مراجعات|حذفت $1 مراجعة}}",
        "undeletehistory": "لو استرجعت الصفحة، كل المراجعات سيتم استرجاعها إلى التاريخ.\nلو كان قد تم إنشاء صفحة جديدة بالاسم نفسه بعد الحذف، المراجعات المسترجعة ستظهر في التاريخ السابق.",
        "undeleterevdel": "الاسترجاع لن يتم إذا كان سينتج عنه أن تكون المراجعة أعلى الصفحة أو الملف محذوفة جزئيا.\nفي مثل هذه الحالات، يجب عليك إظهار أحدث المراجعات المحذوفة.",
        "undeleteinvert": "اعكس الاختيار",
        "undeletecomment": "السبب:",
        "cannotundelete": "بعض أو كل عملية الاسترجاع فشلت:\n$1",
-       "undeletedpage": "'''تم استرجاع $1'''\n\nراجع [[Special:Log/delete|سجل الحذف]] لمعاينة عمليات الحذف والاسترجاعات الحديثة.",
+       "undeletedpage": "<strong>تم استرجاع $1</strong>\n\nراجع [[Special:Log/delete|سجل الحذف]] لمعاينة عمليات الحذف والاسترجاعات الحديثة.",
        "undelete-header": "انظر الصفحات المحذوفة حديثا في [[Special:Log/delete|سجل الحذف]].",
        "undelete-search-title": "البحث في الصفحات المحذوفة",
        "undelete-search-box": "ابحث في الصفحات المحذوفة",
        "tooltip-namespace_association": "أشِّر هذا الخيار لتضمين نطاق النقاش أو الموضوع المقترن بالنطاق المختار",
        "blanknamespace": "(رئيسي)",
        "contributions": "مساهمات {{GENDER:$1|المستخدم|المستخدمة}}",
-       "contributions-title": "مساهمات {{GENDER:$1|المستخدم|المستخدمة}} $1",
+       "contributions-title": "مساهمات المستخدم $1",
        "mycontris": "مساهمات",
        "anoncontribs": "مساهمات",
        "contribsub2": "ل{{GENDER:$3|$1}} ($2)",
        "ipb-namespaces-label": "نطاقات",
        "badipaddress": "عنوان أيبي غير صحيح",
        "blockipsuccesssub": "تم المنع بنجاح",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] تم {{GENDER:$1|منعه|منعها}}.<br />\nطالع [[Special:BlockList|قائمة منع الآيبي]] لمراجعة حالات المنع.",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] تم منعه.<br />\nانظر [[Special:BlockList|قائمة منع الأيبي]] لمراجعة حالات المنع.",
        "ipb-blockingself": "أنت على وشك منع نفسك! أمتأكد من رغبتك في القيام بذلك؟",
        "ipb-confirmhideuser": "أنت على وشك منع مستخدم مع تفعيل خيار \"أخف المستخدم\". سوف يخفي هذا الخيار اسم المستخدم من جميل القوائم ومدخلات السجلات. أمتأكد من رغبتك في القيام بذلك؟",
        "ipb-confirmaction": "إن كنت متأكدًا أنك تريد القيام بذلك حقًا، فالرجاء التحقق من حقل \"{{int:ipb-confirm}}\" في الأسفل.",
        "ipb-unblock-addr": "رفع منع $1",
        "ipb-unblock": "رفع المنع عن مستخدم أو عنوان أيبي",
        "ipb-blocklist": "عرض حالات المنع الحالية",
-       "ipb-blocklist-contribs": "مساهمات $1",
+       "ipb-blocklist-contribs": "مساهمات {{GENDER:$1|$1}}",
        "ipb-blocklist-duration-left": "يتبقى $1",
        "block-actions": "أفعال لمنعها:",
        "block-expiry": "مدة المنع:",
        "lockfilenotwritable": "ملف غلق قاعدة البيانات لا يمكن الكتابة عليه.\nلغلق قاعدة البيانات أو إزالة الغلق يجب أن يكون هذا الملف قابلا للكتابة من قبل خادم الويب.",
        "databaselocked": "قاعدة البيانات مقفلة بالفعل.",
        "databasenotlocked": "قاعدة البيانات ليست مغلقة.",
-       "lockedbyandtime": "(من $1 على $2 في $3 )",
+       "lockedbyandtime": "(من {{GENDER:$1|$1}} على $2 في $3)",
        "move-page": "نقل $1",
        "move-page-legend": "نقل الصفحة",
        "movepagetext": "باستخدام  الاستمارة بالأسفل بإمكانك أن تغير اسم الصفحة، وأن تنقل تاريخها إلى الاسم الجديد.\nالعنوان القديم سيصبح تحويلة للعنوان الجديد.\nيمكنك أن تترك التحويلات التي تشير إلى العنوان الأصلي كما هي لتقوم البوتات بتحديثها تلقائياً.\nإذا اخترت أن تقوم بالتحديث يدوياً، فتأكد من عدم وجود تحويلات [[Special:DoubleRedirects|مزدوجة]] أو [[Special:BrokenRedirects|مكسورة]] وقم بتصحيحها.\nأنت المسؤول عن التأكد من أن الوصلات تصل إلى الصفحات التي يفترض أن تصل إليها.\n\nلاحظ أنه <strong>لن يتم</strong> نقل الصفحة إذا وجدت صفحة في العنوان الجديد، إلا إذا كانت صفحة تحويل، ولا تاريخ لها.\nهذا يعني أنك تستطيع استرجاع الصفحة إلى مكانها لو قمت بخطأ، ولا يمكنك نسخ هذه الصفحة فوق صفحة موجودة.\n\n<strong>ملاحظة:</strong>\n\nهذا قد يكون تغييراً كارثياً وغير متوقع لصفحة مشهورة؛\nمن فضلك تأكد أنك تفهم عواقب هذا الفعل قبل أن تستمر.",
        "movepagetext-noredirectfixer": "باستخدام  الاستمارة بالأسفل بإمكانك أن تغير اسم الصفحة، وأن تنقل تاريخها إلى الاسم الجديد.\nالعنوان القديم سيصبح تحويلة للعنوان الجديد.\nيمكنك تحديث التحويلات التي تشير إلى العنوان الأصلي تلقائياً.\nلو اخترت ألا تفعل، تأكد من عدم وجود تحويلات [[Special:DoubleRedirects|مزدوجة]] أو [[Special:BrokenRedirects|مكسورة]].\nأنت المسؤول عن التأكد من أن الوصلات تصل إلى الصفحات التي يفترض أن تصل إليها.\n\nلاحظ أنه <strong>لن يتم</strong>  نقل الصفحة إذا كان هناك صفحة بنفس العنوان الجديد، إلا إذا كانت فارغة، أو تحويلة لا تاريخ لها.\nهذا يعني أنك تستطيع استرجاع الصفحة إلى مكانها لو قمت بخطأ، وأنك لا يمكنك الكتابة على صفحة موجودة.\n\n<strong>ملاحظة</strong> \n\nهذا قد يكون تغييراً كارثياً وغير متوقع لصفحة مشهورة؛\nمن فضلك تأكد أنك تفهم عواقب هذا الفعل قبل أن تستمر.",
        "movepagetalktext": "لو علمت على هذا الصندوق، فصفحة النقاش المرفقة يتم نقلها أوتوماتيكيا للعنوان الجديد، إلا لو كانت صفحة نقاش غير فارغة هناك بالفعل.\n\nفي هذه الحالة، فسيتعين عليك نقل أو دمج الصفحة يدويا لو رغبت في ذلك.",
-       "moveuserpage-warning": "'''تحذير: أنت على وشك نقل صفحة مستخدم. من فضلك لاحظ أن الصفحة وحدها سوف تنقل وأن المستخدم لن يعاد تسميته.'''",
+       "moveuserpage-warning": "<strong>تحذير:</strong> أنت على وشك نقل صفحة مستخدم. من فضلك لاحظ أن الصفحة وحدها سوف تنقل وأن المستخدم <em>لن</em> تعاد تسميته.",
        "movecategorypage-warning": "<strong>تحذير:</strong> أنت على وشك نقل صفحة التصنيف إلى عنوان جديد؛ <em>لن</em> تنقل الصفحات المندرجة تحت التصنيف إلى العنوان الجديد.",
        "movenologintext": "يجب أن تكون مستخدماً مسجلاً وأن  [[Special:UserLogin|تسجل دخولك]] لكي تنقل صفحة.",
        "movenotallowed": "أنت لا تمتلك الصلاحية لنقل الصفحات.",
        "movepagebtn": "انقل الصفحة",
        "pagemovedsub": "تم النقل بنجاح",
        "cannotmove": "تعذر نقل الصفحة; {{PLURAL:$1|للسبب التالي|للأسباب التالية}}:",
-       "movepage-moved": "'''نُقِلت \"$1\" إلى \"$2\"'''",
+       "movepage-moved": "<strong>نُقِلت \"$1\" إلى \"$2\"</strong>",
        "movepage-moved-redirect": "أنشئت تحويلة.",
        "movepage-moved-noredirect": "إنشاء التحويلة تم التغاضي عنه.",
        "movepage-delete-first": "تحتوي الصفحة الهدف على عدد كبير جدا من المراجعات لحذفها كجزء من نقل الصفحة; يُرجَى أولا حذف الصفحة يدويا، ثم إعادة المحاولة.",
        "imageinvalidfilename": "اسم الملف الهدف غير صحيح",
        "fix-double-redirects": "حدث أي تحويلات تشير إلى العنوان الأصلي",
        "move-leave-redirect": "اترك تحويلة خلفك",
-       "protectedpagemovewarning": "'''تحذير:''' هذه الصفحة قد تم حمايتها، فقط المستخدمون الذين يمتلكون امتيازات الإدارة يمكنهم نقلها.\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
-       "semiprotectedpagemovewarning": "'''ملاحظة:''' هذه الصفحة تمت حمايتها ليتمكن المستخدمون المؤكون تلقائيا وحدهم من نقلها،\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
+       "protectedpagemovewarning": "<strong>تحذير:</strong> هذه الصفحة قد تم حمايتها، فقط المستخدمون الذين يمتلكون امتيازات الإدارة يمكنهم نقلها.\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
+       "semiprotectedpagemovewarning": "<strong>ملاحظة:</strong> هذه الصفحة تمت حمايتها ليتمكن المستخدمون المؤكون تلقائيا وحدهم من نقلها،\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
        "move-over-sharedrepo": "[[:$1]] موجود في مستودع مشترك. نقل الملف إلى هذا العنوان سوف يلغي الملف المشترك.",
        "file-exists-sharedrepo": "اسم الملف الذي اخترته مستخدم من قبل في مستودع مشترك.\nمن فضلك اختر اسماً آخر.",
        "export": "تصدير صفحات",
        "exporttext": "يمكنك تصدير النص وتاريخ تعديلات صفحة أو مجموعة صفحات في صيغة XML.\nهذا يمكن استيراده إلى ويكي آخر يستعمل ميدياويكي بواسطة [[Special:Import|صفحة الاستيراد]].\n\nلتصدير الصفحات، أدخل عناوينها في الصندوق أسفله، عنواناً واحداً في كل سطر، مع اختيار ما إذا كنت ترغب بتصدير النسخة الحالية مع جميع النسخ القديمة، أي مع كامل معلومات تاريخ الصفحة، أو فقط النسخة الحالية مع معلومات عن التعديل الأخير.\n\nفي الحالة الأخيرة يمكنك أيضاً استخدام وصلة، على سبيل المثال [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] للصفحة «[[{{MediaWiki:Mainpage}}]]».",
        "exportall": "صدّر كل الصفحات",
        "exportcuronly": "ضمن المراجعة الحالية فقط، وليس التاريخ الكامل",
-       "exportnohistory": "----\nملاحظة:''' تصدير التاريخ الكامل للصفحات من خلال هذه الاستمارة تم تعطيله لأسباب تتعلق بالأداء'''",
+       "exportnohistory": "----\n<strong>ملاحظة:</strong> تصدير التاريخ الكامل للصفحات من خلال هذه الاستمارة تم تعطيله لأسباب تتعلق بالأداء.",
        "exportlistauthors": "أضف قائمة كاملة بالمساهمين لكل صفحة",
        "export-submit": "تصدير",
        "export-addcattext": "أضف صفحات من تصنيف:",
        "allmessagesdefault": "النص الافتراضي",
        "allmessagescurrent": "النص الحالي",
        "allmessagestext": "هذه قائمة برسائل النظام المتوفرة في نطاق ميدياويكي.\nمن فضلك زر [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation ترجمة ميدياويكي] و [https://translatewiki.net ترانسليت ويكي دوت نت] لو كنت ترغب في المساهمة في ترجمة ميدياويكي الأساسية.",
-       "allmessages-not-supported-database": "هذه الصفحة لا يمكن استخدامها لأن '''$wgUseDatabaseMessages''' تم تعطيله.",
+       "allmessages-not-supported-database": "هذه الصفحة لا يمكن استخدامها لأن <strong>$wgUseDatabaseMessages</strong> تم تعطيله.",
        "allmessages-filter-legend": "المرشح",
        "allmessages-filter": "رشح حسب حالة التخصيص:",
        "allmessages-filter-unmodified": "غير معدل",
        "tooltip-pt-anonuserpage": "صفحة المستخدم للأيبي الذي تقوم بالتحرير من خلاله",
        "tooltip-pt-mytalk": "صفحة {{GENDER:|نقاشك}}",
        "tooltip-pt-anontalk": "نقاش حول التعديلات من عنوان الأيبي هذا",
-       "tooltip-pt-preferences": "تفضيلاتك",
+       "tooltip-pt-preferences": "{{GENDER:|تفضيلاتك}}",
        "tooltip-pt-watchlist": "قائمة الصفحات التي تراقب التغييرات التي تحدث بها",
        "tooltip-pt-mycontris": "قائمة مساهمات{{GENDER:|ك}}",
        "tooltip-pt-anoncontribs": "قائمة بتعديلات قام بها عنوان الآي بي",
        "anonymous": "{{PLURAL:$1|مستخدم مجهول|مستخدمون مجهولون}} ل{{SITENAME}}",
        "siteuser": "مستخدم {{SITENAME}} $1",
        "anonuser": "مستخدم {{SITENAME}}  المجهول $1",
-       "lastmodifiedatby": "{{GENDER:$4|أجرى|أجرت}} $3 آخر تعديل لهذه الصفحة في $2، $1.",
+       "lastmodifiedatby": "أجرى $3 آخر تعديل لهذه الصفحة في $2، $1.",
        "othercontribs": "بناء على عمل $1.",
        "others": "أخرون",
-       "siteusers": "{{PLURAL:$2||مستخدم|مستخدمي}} {{SITENAME}} $1",
+       "siteusers": "{{PLURAL:$2|{{GENDER:$1|مستخدم}}|مستخدمو}} {{SITENAME}} $1",
        "anonusers": "{{PLURAL:$2||مستخدم|مستخدما|مستخدمو}} {{SITENAME}} {{PLURAL:$2||المجهول|المجهولان|المجهولون}} $1",
        "creditspage": "إشادات الصفحة",
        "nocredits": "لا توجد معلومات إشادة متوفرة لهذه الصفحة.",
        "filedelete-archive-read-only": "مجلد الأرشيف \"$1\" لا يمكن الكتابة عليه بواسطة خادم الويب.",
        "previousdiff": "→ التعديل السابق",
        "nextdiff": "التعديل اللاحق ←",
-       "mediawarning": "'''تحذير''': قد يحتوي نوع هذا الملف على كود خبيث، يمكن عند تشغيله السيطرة على نظامك.",
+       "mediawarning": "<strong>تحذير:</strong> قد يحتوي نوع هذا الملف على كود خبيث.\nيمكن عند تشغيله السيطرة على نظامك.",
        "imagemaxsize": "حد حجم الصورة في صفحات وصف الملفات",
        "thumbsize": "حجم العرض المصغر:",
        "widthheightpage": "$1×$2، {{PLURAL:$3|لا صفحات|صفحة واحدة|صفحتان|$3 صفحات|$3 صفحة}}",
        "file-info-png-looped": "ملفوف",
        "file-info-png-repeat": "عرضت {{PLURAL:$1||مرة واحدة|مرتين|$1 مرات|$1 مرة}}",
        "file-info-png-frames": "{{PLURAL:$1||إطار واحد|إطاران|$1 إطارات|$1 إطارًا|$1 إطار}}",
-       "file-no-thumb-animation": "'' 'ملاحظة: نظراً للقيود التقنية، فإن الصورة المصغرة لهذا الملف ستكون غير متحركة. '''",
-       "file-no-thumb-animation-gif": "'' 'ملاحظة: نظراً للقيود التقنية، فإن الصورة المصغرة لهذا الملف GIF عالي الدقة ستكون غير متحركة. '''",
+       "file-no-thumb-animation": "<strong>ملاحظة: نظراً للقيود التقنية، فإن الصورة المصغرة لهذا الملف ستكون غير متحركة.</strong>",
+       "file-no-thumb-animation-gif": "<strong>ملاحظة: نظراً للقيود التقنية، فإن الصورة المصغرة لهذا الملف GIF عالي الدقة ستكون غير متحركة.</strong>",
        "newimages": "معرض الملفات الجديدة",
-       "imagelisttext": "فيما يلي قائمة تحوي '''$1''' {{PLURAL:$1|ملف|ملفات}} مرتبة $2.",
+       "imagelisttext": "فيما يلي قائمة تحوي <strong>$1</strong> {{PLURAL:$1|ملف|ملفات}} مرتبة $2.",
        "newimages-summary": "هذه الصفحة الخاصة تعرض آخر الملفات المرفوعة.",
        "newimages-legend": "المرشح",
        "newimages-label": "اسم الملف (أو جزء منه):",
        "scarytranscludefailed": "[البحث عن القالب فشل ل$1]",
        "scarytranscludefailed-httpstatus": "[فشل جلب القالب لـ $1: HTTP $2]",
        "scarytranscludetoolong": "[المسار طويل للغاية]",
-       "deletedwhileediting": "'''تحذير''': هذه الصفحة تم حذفها بعد أن بدأت أنت بتعديلها!",
+       "deletedwhileediting": "<strong>تحذير:</strong> هذه الصفحة تم حذفها بعد أن بدأت أنت بتعديلها!",
        "confirmrecreate": "{{GENDER:$1|حذف المستخدم|حذفت المستخدمة}} [[User:$1|$1]] ([[User talk:$1|نقاش]]) هذه الصفحة بعد أن بدأت أنت بتحريرها للسبب التالي:\n: <em>$2</em>\nالرجاء التأكد من أنك تريد إعادة إنشاء هذه الصفحة.",
        "confirmrecreate-noreason": "{{GENDER:$1|حذف المستخدم|حذفت المستخدمة}} [[User:$1|$1]] ([[User talk:$1|نقاش]]) هذه الصفحة بعد أن بدأت أنت بتحريرها. الرجاء التأكد من أنك تريد إعادة إنشاء هذه الصفحة.",
        "recreate": "إعادة إنشاء",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|نقاش]])",
        "timezone-utc": "ت ع م",
        "timezone-local": "محلي",
-       "duplicate-defaultsort": "'''تحذير:''' مفتاح الترتيب الافتراضي \"$2\" يتجاوز مفتاح الترتيب الافتراضي السابق \"$1\".",
+       "duplicate-defaultsort": "<strong>تحذير:</strong> مفتاح الترتيب الافتراضي \"$2\" يتجاوز مفتاح الترتيب الافتراضي السابق \"$1\".",
        "duplicate-displaytitle": "<strong>تحذير:</strong> أعرض عنوان \"$2\" تجاهل العنوان المعروض سابقا \"$1\".",
        "restricted-displaytitle": "<strong>تحذير:</strong> عنوان العرض \"$1\" تم تجاهله بما أنه لا يساوي عنوان الصفحة الفعلي.",
        "invalid-indicator-name": "<strong>خطأ:</strong> لا يجوز أن تبقى خاصية <code>name</code> لمؤشرات وضع الصفحة فارغةً.",
        "version-license-not-found": "لم يتم العثور على أي معلومات ترخيص لهذا الامتداد.",
        "version-credits-title": "العاملون على $1",
        "version-credits-not-found": "لم يتم العثور على أي معلومات للعاملين على هذا الامتداد.",
-       "version-poweredby-credits": "تدار هذه الويكي بواسطة '''[https://www.mediawiki.org/ ميدياويكي]'''، حقوق النشر © 2001-$1 $2.",
+       "version-poweredby-credits": "تدار هذه الويكي بواسطة <strong>[https://www.mediawiki.org/ ميدياويكي]</strong>، حقوق النشر © 2001-$1 $2.",
        "version-poweredby-others": "آخرون",
        "version-poweredby-translators": "مترجمو ترانسليت ويكي دوت نت",
        "version-credits-summary": "نود أن نعرف بالأشخاص التالية أسماؤهم لمساهمتهم في [[Special:Version|ميدياويكي]].",
        "tags-edit-revision-legend": "أضف أو أزل الوسوم من {{PLURAL:$1|هذه المراجعة|كل $1 المراجعات}}",
        "tags-edit-logentry-legend": "أضف أو أزل الوسوم من {{PLURAL:$1|مدخلة السجل هذه|كل مدخلات السجل ال$1}}",
        "tags-edit-existing-tags": "الوسوم الموجودة:",
-       "tags-edit-existing-tags-none": "</em>لا وسوم</em>",
+       "tags-edit-existing-tags-none": "<em>لا وسوم</em>",
        "tags-edit-new-tags": "وسوم جديدة:",
        "tags-edit-add": "أضف هذه الوسوم:",
        "tags-edit-remove": "أزل هذه الوسوم:",
index fda5293..c28c1b6 100644 (file)
        "category_header": "الصفحات فى التصنيف \"$1\"",
        "subcategories": "التصنيفات الفرعيه",
        "category-media-header": "ملفات الميديا فى التصنيف \"$1\"",
-       "category-empty": "''التصنيف ده مافيهوش حاليا مقالات او ملفات ميديا.''",
+       "category-empty": "<em>التصنيف ده مافيهوش حاليا مقالات او ملفات ميديا.</em>",
        "hidden-categories": "{{PLURAL:$1|تصنيف مستخبي|تصنيفات مستخبية}}",
        "hidden-category-category": "تصنيفات مستخبية",
        "category-subcat-count": "{{PLURAL:$2| التصنيف دا فيه  التصنيف الفرعى الجاى بس.|التصنيف دا فيه {{PLURAL:$1|تصنيف فرعى|$1 تصنيف فرعى}}، من إجمالى $2.}}",
        "nosuchaction": "مافيش فعل زى كده",
        "nosuchactiontext": "العمليه المتحدده فى الـ URL مش موجود.\nممكن تكون كتبت الـ URL غلط, او دوست على لينك مش مظبوط.\nدا ممكن كمان يكون معناه انه فيه باج (bug) فى الـ {{SITENAME}}.",
        "nosuchspecialpage": "مافيش صفحة خاصة بالاسم ده",
-       "nospecialpagetext": "<strong>انت طلبت صفحه مخصوصه مش موجوده.</strong>\n\nليستة الصفحات المخصوصه الموجوده ممكن تلاقيها فى [[Special:SpecialPages]].",
+       "nospecialpagetext": "<strong>انت طلبت صفحه مخصوصه مش موجوده.</strong>\n\nليستة الصفحات المخصوصه الموجوده ممكن تلاقيها فى [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "غلطه",
        "databaseerror": "غلط فى قاعدة البيانات (database)",
        "databaseerror-query": " إستفسار : $1",
        "databaseerror-function": "وظيفه : $1",
        "databaseerror-error": "غلط: $1",
-       "laggedslavemode": "'''تحذير:''' الصفحه يمكن ما يكونش فيها تحديثات جديده.",
+       "laggedslavemode": "<strong>تحذير:</strong> الصفحه يمكن ما يكونش فيها تحديثات جديده.",
        "readonly": "قاعدة البيانات (الـ database) مقفوله",
        "enterlockreason": "اكتب سبب القفل, و قول امتى تقريبا ح يتلغى القفل",
        "readonlytext": "قاعدة البيانات (الـ database) دلوقتى مقفوله على المدخلات الجديده و التعديلات التانيه, يمكن بسبب الصيانه الروتينيه, و بعد كده ح ترجع للحاله الطبيعيه.\n\nالادارى اللى قفل قاعدة البيانات هو اللى كتب التفسير دا:\n$1",
        "protectedinterface": "الصفحة دى هى اللى بتوفر نص الواجهة بتاعة البرنامج،وهى مقفولة لمنع التخريب.\nعلشان إضافة أو تغيير الترجمات لجميع مشاريع الويكي،  لو سمحت روح على [https://translatewiki.net/ translatewiki.net]، مشروع ترجمة ميدياويكى",
        "editinginterface": "<strong>تحذير</strong> : أنت بتعدل صفحة بتستخدم فى الواجهة النصية  بتاعة البرنامج. \nالتغييرات فى الصفحة دى ها تأثر على مظهر واجهة اليوزر لليوزرز التانيين. \nعلشان إضافة أو تغيير الترجمات لجميع مشاريع الويكي،  لو سمحت روح على [https://translatewiki.net/ translatewiki.net]، مشروع ترجمة ميدياويكى",
        "cascadeprotected": "الصفحة دى محمية من التعديل، بسبب انها مدمجة فى {{PLURAL:$1|الصفحة|الصفحتين|الصفحات}} دي، اللى مستعمل فيها خاصية \"حماية الصفحات المدمجة\" :\n$2",
-       "namespaceprotected": "ما عندكش صلاحية تعديل الصفحات  اللى فى نطاق '''$1'''.",
+       "namespaceprotected": "ما عندكش صلاحية تعديل الصفحات  اللى فى نطاق <strong>$1</strong>.",
        "ns-specialprotected": "الصفحات المخصوصة مش ممكن تعديلها.",
        "titleprotected": "العنوان دا محمى من الإنشاء بـ[[User:$1|$1]]. السبب هو <em>$2</em>.",
-       "virus-badscanner": "غلطه : ماسح فيروسات مش معروف: ''$1''",
+       "virus-badscanner": "غلطه : ماسح فيروسات مش معروف: <em>$1</em>",
        "virus-scanfailed": "المسح فشل(كود $1)",
        "virus-unknownscanner": "انتى فيروس مش معروف:",
-       "logouttext": "'''أنت دلوقتى مش مسجل دخولك.'''\n\nممكن تشوف بعض الصفحات  كأنك متسجل ، و دا علشان استعمال الصفحات المتخبية ف البراوزر بتاعك.",
+       "logouttext": "<strong>أنت دلوقتى مش مسجل دخولك.</strong>\n\nممكن تشوف بعض الصفحات  كأنك متسجل ، و دا علشان استعمال الصفحات المتخبية ف البراوزر بتاعك.",
        "welcomeuser": "أهلاً بيك يا $1!",
        "welcomecreation-msg": "اتفتحلك حساب.\nلو تحب ممكن تغير [[Special:Preferences|تفضيلاتك ف {{SITENAME}}]].",
        "yourname": "اليوزرنيم:",
        "nocookieslogin": "{{SITENAME}} بيستخدم الكوكيز  علشان تسجيل الدخول.\nالكوكيز عندك متعطلة.\nلو سمحت تخليها تشتغل و بعدين حاول مرة تانية.",
        "noname": "انت ما حددتش اسم يوزر صحيح.",
        "loginsuccesstitle": "تم الدخول بشكل صحيح",
-       "loginsuccess": "'''دخولك   {{SITENAME}} إتسجل بإسم \"$1\".'''",
+       "loginsuccess": "<strong>دخولك {{SITENAME}} إتسجل بإسم \"$1\".</strong>",
        "nosuchuser": "مافيش يوزر اسمه \"$1\".\nاسامى اليوزر بتبقى حساسه لحالة الحرف.\nاتأكد من التهجيه, او [[Special:CreateAccount|افتح حساب جديد]].",
        "nosuchusershort": "مافيش يوزر باسم $1\".\nاتاكد من تهجية الاسم.",
        "nouserspecified": "لازم تحدد اسم يوزر.",
        "showpreview": "عرض البروفه",
        "showdiff": "بيين التعديلات",
        "anoneditwarning": "<strong>تحذير:'</strong> انت ما عملتش لوجين. عنوان الاى  بى  بتاعك هايتسجل ف تاريخ الصفحه. لو  <strong>[$1 عملت لوجين ]</strong> او <strong>[$2 فتحت حساب ]</strong>,   اليوزرنيم بتاعك هايتسجل ف تاريخ الصفحه.",
-       "missingsummary": "'''خد بالك:''' انت ما كتبتش ملخص للتعديل.\nلو دوست على \"$1\" مرة تانية التعديل بتاعك ح يتحفظ من غير ملخص.",
+       "missingsummary": "<strong>خد بالك:</strong> انت ما كتبتش ملخص للتعديل.\nلو دوست على \"$1\" مرة تانية التعديل بتاعك ح يتحفظ من غير ملخص.",
        "missingcommenttext": "لو سمحت اكتب تعليق تحت.",
        "missingcommentheader": "<strong>خد بالك:</strong> انت ما كتبتش عنوان\\موضوع للتعليق دا\nلو دوست على $1 مرة تانيه، تعليقك ح يتحفظ من غير عنوان.",
        "summary-preview": "بروفه للملخص:",
        "subject-preview": "بروفة للعنوان/للموضوع",
        "blockedtitle": "اليوزر ممنوع",
-       "blockedtext": "'''تم منع اسم اليوزر أو عنوان الاى بى بتاعك .'''\n\nسبب المنع هو: ''$2''. وقام بالمنع $1.\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nممكن التواصل مع $1 لمناقشة المنع، أو مع واحد من [[{{MediaWiki:Grouppage-sysop}}|الاداريين]] عن المنع>\nافتكر انه مش ممكن تبعت ايميل  لليوزرز الا اذا كنت سجلت عنوان ايميل صحيح فى صفحة [[Special:Preferences|التفضيلات]] بتاعتك.\nعنوان الااى بى بتاعك حاليا هو $3 وكود المنع هو #$5.من فضلك ضيف اى واحد منهم أو كلاهما فى اى رسالة للتساؤل عن المنع.",
-       "autoblockedtext": "عنوان الأيبى بتاعك اتمنع اتوماتيكى  علشان فى يوزر تانى استخدمه واللى هو كمان ممنوع بــ $1.\nالسبب هو:\n\n:''$2''\n\n* بداية المنع: $8\n* انهاية المنع: $6\n* الممنوع المقصود: $7\n\nممكن تتصل  ب $1 أو واحد من\n[[{{MediaWiki:Grouppage-sysop}}|الإداريين]] االتانيين لمناقشة المنع.\n\nلاحظ أنه مش ممكن استخدام خاصية \"ابعت رسالة لليوزر دا\" إلا اذا كان عندك ايميل صحيح متسجل فى [[Special:Preferences|تفضيلاتك]].\n\nعنوان الأيبى الحالى الخاص بك هو $3، رقم المنع هو $5. لو سمحت تذكر الرقم دا فى اى استفسار.",
+       "blockedtext": "<strong>تم منع اسم اليوزر أو عنوان الاى بى بتاعك .</strong>\n\nاللى عمل المنع $1.\nسبب المنع هو: <em>$2</em>.\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nممكن التواصل مع $1 لمناقشة المنع، أو مع واحد من [[{{MediaWiki:Grouppage-sysop}}|الاداريين]] عن المنع.\nافتكر انه مش ممكن تستخدم الخاصيه \"{{int:emailuser}}\" الا اذا كنت سجلت عنوان ايميل صحيح فى صفحة [[Special:Preferences|التفضيلات]] بتاعتك\nو ما تكونش اتمنعت من استعمالها.\nعنوان الاى بى بتاعك حاليا هو $3 وكود المنع هو #$5.\nمن فضلك ضيف كل التفاصيل اللى فوق فى اى رساله للتساؤل عن المنع.",
+       "autoblockedtext": "عنوان الأيبى بتاعك اتمنع اتوماتيكى  علشان فى يوزر تانى استخدمه واللى هو كمان ممنوع بــ $1.\nالسبب هو:\n\n:<em>$2</em>\n\n* بداية المنع: $8\n* انهاية المنع: $6\n* الممنوع المقصود: $7\n\nممكن تتصل  ب $1 أو واحد من [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] االتانيين لمناقشة المنع.\n\nلاحظ أنه مش ممكن استخدام خاصية \"{{int:emailuser}}\" إلا اذا كان عندك ايميل صحيح متسجل فى [[Special:Preferences|تفضيلاتك]].\n\nعنوان الأيبى الحالى الخاص بك هو $3، رقم المنع هو #$5.\nلو سمحت تذكر الرقم دا فى اى استفسار.",
        "blockednoreason": "ما فيش سبب",
        "whitelistedittext": "لازم $1 علشان تقدر تعدل الصفحات.",
        "confirmedittext": "قبل ما تبتدى تعدل لازم نتأكد من الايميل بتاعك. لو سمحت تكتب وتأكد الايميل بتاعك  في[[Special:Preferences|تفضيلاتك]]",
        "loginreqlink": "ادخل",
        "loginreqpagetext": "لازم تكون $1 علشان تشوف صفحات تانية.",
        "accmailtitle": " كلمة السر اتبعتت .",
-       "accmailtext": "الباسورد العشوائيه اللى اتعملت لـ[[User talk:$1|$1]]  اتبعتت لـ $2.\n\nالباسورد بتاعة الحساب الجديد دا ممكن تتغير فى صفحة ''[[Special:ChangePassword|تغيير الباسورد]]''   بعد  تسجيل الدخول.",
+       "accmailtext": "الباسورد العشوائيه اللى اتعملت لـ[[User talk:$1|$1]]  اتبعتت لـ $2.\n\nالباسورد بتاعة الحساب الجديد دا ممكن تتغير فى صفحة <em>[[Special:ChangePassword|تغيير الباسورد]]</em> بعد  تسجيل الدخول.",
        "newarticle": "(جديد)",
-       "newarticletext": "انت وصلت لصفحه مابتدتش لسه.\nعلشان  تبتدى الصفحة ابتدى الكتابه فى الصندوق اللى تحت.\n(بص على [$1 صفحة المساعده] علشان معلومات اكتر)\nلو كانت زيارتك للصفحه دى بالغلط، دوس على زرار ''رجوع'' فى متصفح الإنترنت عندك.",
-       "anontalkpagetext": "----'' صفحة النقاش دى بتاعة يوزر مجهول لسة ما فتحش لنفسه حساب أو عنده واحد بس ما بيستعملوش.\nعلشان كدا لازم تستعمل رقم الأيبى علشان تتعرف عليه/عليها.\nالعنوان دا ممكن اكتر من واحد يكونو بيستعملوه.\nلو انت يوزر مجهول و حاسس  ان فى تعليقات بتتوجهلك مع انك مالكش دعوة بيها، من فضلك [[Special:CreateAccount|افتحلك حساب]] أو [[Special:UserLogin|سجل الدخول]] علشان تتجنب اللخبطة اللى ممكن تحصل فى المستقبل مع يوزرز مجهولين تانيين.''",
+       "newarticletext": "انت وصلت لصفحه مابتدتش لسه.\nعلشان  تبتدى الصفحة ابتدى الكتابه فى الصندوق اللى تحت. (بص على [$1 صفحة المساعده] علشان معلومات اكتر)\nلو كانت زيارتك للصفحه دى بالغلط، دوس على زرار <strong>رجوع</strong> فى متصفح الإنترنت عندك.",
+       "anontalkpagetext": "----\n<em>صفحة النقاش دى بتاعة يوزر مجهول لسة ما فتحش لنفسه حساب أو عنده واحد بس ما بيستعملوش.</em>\nعلشان كدا لازم تستعمل رقم الأيبى علشان تتعرف عليه/عليها.\nالعنوان دا ممكن اكتر من واحد يكونو بيستعملوه.\nلو انت يوزر مجهول و حاسس  ان فى تعليقات بتتوجهلك مع انك مالكش دعوة بيها، من فضلك [[Special:CreateAccount|افتحلك حساب]] أو [[Special:UserLogin|سجل الدخول]] علشان تتجنب اللخبطة اللى ممكن تحصل فى المستقبل مع يوزرز مجهولين تانيين.",
        "noarticletext": "مافيش دلوقتى اى نص فى الصفحه دى.\nممكن [[Special:Search/{{PAGENAME}}|تدور على عنوان الصفحه دى]] فى صفح تانيه,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} تدور فى السجلات اللى ليها علاقه],\nاو [{{fullurl:{{FULLPAGENAME}}|action=edit}} تعدل الصفحه دى]</span>.",
        "noarticletext-nopermission": "مافيش دلوقتى اى نص فى الصفحه دى.\nممكن [[Special:Search/{{PAGENAME}}|تدور على عنوان الصفحه دى]] فى صفح تانيه,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} تدور فى السجلات اللى ليها علاقه],\nاو [{{fullurl:{{FULLPAGENAME}}|action=edit}} تعدل الصفحه دى]</span>.",
        "userpage-userdoesnotexist": "حساب اليوزر \"<nowiki>$1</nowiki>\" مش متسجل. لو سمحت تشوف لو عايز تبتدي/تعدل الصفحة دي.",
        "userpage-userdoesnotexist-view": "حساب اليوزر \"$1\" مش متسجل",
        "blocked-notice-logextract": "اليوزر ده معمول له بلوك دلوقتى.\nاخر بلوك فى السجل موجود تحت للمراجعه:",
-       "clearyourcache": "'''ملاحظة - بعد التسييف,  يمكن لازم تفرغ كاش متصفحك علشان تشوف التغييرات.''' '''موزيللا / فايرفوكس / سافارى:''' دوس على ''Shift'' فى نفس الوقت دوس على ''Reload,'' أو دوس على اما ''Ctrl-F5'' أو ''Ctrl-R'' (''Command-R'' على ماكنتوش); '''كونكرر: '''دوس على ''Reload'' أو دوس على ''F5;'' '''أوبرا:''' فرغ الكاش فى ''Tools → Preferences;'' '''إنترنت إكسبلورر:''' دوس على ''Ctrl'' فى نفس الوقت دوس على ''Refresh,'' أو دوس على ''Ctrl-F5.''",
-       "usercssyoucanpreview": "'''ملاحظة:''' استعمل زرار \"{{int:showpreview}}\" علشان تجرب النمط (CSS) أو الجافا سكريبت الجديد قبل تسييڤ الصفحه.",
-       "userjsyoucanpreview": "'''ملاحظة:''' استعمل زرار \"{{int:showpreview}}\" علشان تجرب النمط (CSS) أو الجافا سكريبت الجديد قبل تسييڤ الصفحه.",
-       "usercsspreview": "'''افتكر انك  بتعرض  (CSS) بتاع اليوزر بس.\nهى لسه ماتسييڤتش!'''",
-       "userjspreview": "'''أفتكر أنك بس بتجرب/بتعرض الجافا سكريبت بتاع اليوزر بتاعك، و انها لسة ماتحفظتش!'''",
-       "userinvalidconfigtitle": "'''تحذير:'''مافيش واجهة  \"$1\".\nافتكر أن ملفات ال.css و ال.js بتستخدم حروف صغيرة فى العنوان ، مثلا {{ns:user}}:Foo/vector.css و مش {{ns:user}}:Foo/Vector.css.",
+       "clearyourcache": "<strong>ملاحظة:</strong> بعد التسييف, يمكن لازم تفرغ كاش متصفحك علشان تشوف التغييرات.\n* <strong>فايرفوكس / سافارى:</strong> دوس على <em>Shift</em> و انت بتضغط على <em>Reload</em>، او اضغط على اما <em>Ctrl-F5</em> او <em>Ctrl-R</em> (<em>⌘-R</em> على ماك)\n* <strong>جوجل كروم:</strong> اضغط <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> على ماك)\n* <strong>انترنت اكسبلورر:</strong> امسك <em>Ctrl</em> و انت بتضغط على <em>Refresh</em>، او اضغط <em>Ctrl-F5</em>\n* <strong>اوبرا:</strong> روح على <em>Menu → Settings</em> (<em>Opera → Preferences</em> على ماك) و بعدين على <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
+       "usercssyoucanpreview": "<strong>ملاحظة:</strong> استعمل زرار \"{{int:showpreview}}\" علشان تجرب النمط (CSS) أو الجافا سكريبت الجديد قبل تسييڤ الصفحه.",
+       "userjsyoucanpreview": "<strong>ملاحظة:</strong> استعمل زرار \"{{int:showpreview}}\" علشان تجرب النمط (CSS) أو الجافا سكريبت الجديد قبل تسييڤ الصفحه.",
+       "usercsspreview": "<strong>افتكر انك  بتعرض  (CSS) بتاع اليوزر بس.\nهى لسه ماتسييڤتش!</strong>",
+       "userjspreview": "<strong>أفتكر أنك بس بتجرب/بتعرض الجافا سكريبت بتاع اليوزر بتاعك،\nو انها لسة ماتحفظتش!</strong>",
+       "userinvalidconfigtitle": "<strong>تحذير:</strong> مافيش واجهة \"$1\".\nافتكر أن ملفات ال.css و ال.json و ال.js بتستخدم حروف صغيرة فى العنوان ، مثلا {{ns:user}}:Foo/vector.css و مش {{ns:user}}:Foo/Vector.css.",
        "updated": "(متحدثة)",
-       "note": "'''ملحوظه:'''",
-       "previewnote": "'''دى بروفه للصفحه بس.'''\nولسه ما تسييفتش! ،",
+       "note": "<strong>ملحوظه:</strong>",
+       "previewnote": "<strong>دى بروفه للصفحه بس.</strong>\nولسه ما تسييفتش!",
        "previewconflict": "البروفة دى بتبينلك فوق إزاى ح يكون شكل النص لو انت دوست على حفظ",
-       "session_fail_preview": "'''ما قدرناش  نحفظ التعديلات اللى قمت بيها نتيجة لضياع بيانات  الجلسه.\nالرجاء المحاولة مرة تانيه.\nفى حال استمرار المشكلة حاول  [[Special:UserLogout|تخرج]] وتدخل مرة تانيه .'''",
-       "session_fail_preview_html": "'''ماقدرناش نعالج تعديلك بسبب ضياع بيانات الجلسة.'''\n\n''لأن {{SITENAME}} بها HTML هل الخام شغاله، البروفه مخفيه كاحتياط ضد هجمات الجافا سكريبت.''\n\n'''إذا كانت دى محاولة تعديل صادقه، من فضلك حاول مرة تانيه. إذا كانت لسه مش شغاله، حاول [[Special:UserLogout|تسجيل الخروج]] و تسجيل الدخول من جديد.'''",
-       "token_suffix_mismatch": "'''تعديلك اترفض لأن عميلك غلط فى علامات الترقيم\nفى نص التعديل. التعديل اترفض علشان ما يبوظش نص المقالة.\nدا ساعات بيحصل لما تستعمل خدمة بروكسى مجهولة بايظة أساسها الويب.'''",
+       "session_fail_preview": "ما قدرناش  نحفظ التعديلات اللى قمت بيها نتيجة لضياع بيانات  الجلسه.\n\nممكن تكون اتعملك لوج اوت. <strong>لو سمحت اتاكد انك لاجج و حاول مرة تانيه</strong>.\nفى حال استمرار المشكلة حاول  [[Special:UserLogout|تخرج]] وتدخل مرة تانيه، و اتاكد من ان البراوزر بتاعك بيسمح بالكوكيز من السايت ده.",
+       "session_fail_preview_html": "ماقدرناش نعالج تعديلك بسبب ضياع بيانات الجلسة.\n\n<em>لأن {{SITENAME}} بها HTML هل الخام شغاله، البروفه مخفيه كاحتياط ضد هجمات الجافا سكريبت.</em>\n\n<strong>إذا كانت دى محاولة تعديل صادقه، من فضلك حاول مرة تانيه.</strong>\nإذا كانت لسه مش شغاله، حاول [[Special:UserLogout|تسجيل الخروج]] و تسجيل الدخول من جديد، و اتاكد من ان البوازر بتاعك بيسمح بالكوكيز من السايت ده.",
+       "token_suffix_mismatch": "<strong>تعديلك اترفض لأن عميلك غلط فى علامات الترقيم فى نص التعديل.</strong>\nالتعديل اترفض علشان ما يبوظش نص المقالة.\nدا ساعات بيحصل لما تستعمل خدمة بروكسى مجهولة بايظة أساسها الويب.",
        "editing": "تعديل $1",
        "creating": "إنشاء «$1»",
        "editingsection": "تعديل $1 (جزء)",
        "editingcomment": "تعديل $1 (قسم جديد)",
        "editconflict": "تضارب فى التحرير: $1",
-       "explainconflict": "فى واحد تانى عدل الصفحة دى  بعد ما انت ابتديت بتحريرها.\nصندوق النصوص الفوقانى فيه النص الموجود دلوقتى فى الصفحة.\nوالتغييرات انت عملتها موجودة فى الصندوق التحتانى فى الصفحة.\nلازم تدمج تغييراتك فى النص الموجود دلوقتي.\n'''بس''' اللى موجود فى الصندوق الفوقانى هو اللى ح يتحفظ لما تدوس على زرار \"$1\".",
+       "explainconflict": "فى واحد تانى عدل الصفحة دى  بعد ما انت ابتديت بتحريرها.\nصندوق النصوص الفوقانى فيه النص الموجود دلوقتى فى الصفحة.\nوالتغييرات انت عملتها موجودة فى الصندوق التحتانى فى الصفحة.\nلازم تدمج تغييراتك فى النص الموجود دلوقتي.\n<strong>بس</strong> اللى موجود فى الصندوق الفوقانى هو اللى ح يتحفظ لما تدوس على زرار \"$1\".",
        "yourtext": "النص بتاعك",
        "storedversion": "النسخه المتسييڤه",
-       "editingold": "'''تحذير: انت دلوقتى بتعدل نسخه قديمه من الصفحه دى.‏'''\nلو سييڤتها, كل التغييرات اللى اتعملت بعد كده هاتضيع.‏",
+       "editingold": "<strong>تحذير: انت دلوقتى بتعدل نسخه قديمه من الصفحه دى.</strong>\nلو سييڤتها, كل التغييرات اللى اتعملت بعد كده هاتضيع.‏",
        "yourdiff": "الفروق",
-       "copyrightwarning": "لو سمحت لاحظ ان كل المساهمات فى {{SITENAME}} بتتنشر حسب شروط ترخيص $2 (بص على $1 علشان تعرف تفاصيل اكتر).\nلو مش عايز كتابتك تتعدل او تتوزع من غير مقابل و من غير اذنك, يبقى ما تحطهاش هنا.<br />\nانت كمان بتوعدنا انك كتبت دا بنفسك, او نسخته من مصدر فى الملكيه العامه او مصدر حر شبهه.\n'''ما تحطش اى عمل ليه حقوق محفوظه من غير اذن صاحب الحق!'''",
-       "copyrightwarning2": "لو سمحت تعمل حسابك ان كل مشاركاتك فى {{SITENAME}} ممكن المشاركين التانيين يعدلوها،يغيروها، او يمسحوها خالص. لو مانتش حابب ان كتاباتك تتعدل و تتغير بالشكل دا، فياريت ما تنشرهاش هنا.<br />.\nو كمان انت بتدينا كلمة شرف  انك صاحب الكتابات دي، او انك نقلتها من مكان مش خاضع لحقوق النشر .(شوف التفاصيل فى $1 ).\n'''لو سمحت ما تحطش هنا اى نص خاضع لحقوق النشر من غير تصريح!'''.",
-       "longpageerror": "'''غلط: النص اللى دخلته حجمه $1 كيلوبايت، ودا أكبر من الحد الأقصى و اللى هو {{PLURAL:$2|واحد كيلوبايت|$2 كيلوبايت}}.\nمش ممكن يتحفظ.'''",
-       "readonlywarning": "'''تحذير: قاعدة البيانات اتقفلت للصيانة، و علشان كدا انت مش ح تقدر تحفظ التعديلات اللى عملتها دلواتى.\nلو حبيت ممكن  تنسخ النص وتحفظه فى ملف نصى علشان تستعمله بعدين.'''\n\nالإدارى اللى قفلها كتب السبب دا $1",
-       "protectedpagewarning": "'''تحذير:الصفحة دى اتقفلت بطريقه تخلى اليوزرات السيسوبات هما بس اللى يقدرو يعدلوها.'''\nاخر سجل محطوط تحت علشان المراجعه:",
-       "semiprotectedpagewarning": "'''ملاحظه:''' الصفحه دى اتقفلت بطريقه تخلّى اليوزرات المتسجلين بس هما اللى يقدرو يعدّلوها.\nاخر سجل محطوط تحت علشان المراجعه:",
+       "copyrightwarning": "لو سمحت لاحظ ان كل المساهمات فى {{SITENAME}} بتتنشر حسب شروط ترخيص $2 (بص على $1 علشان تعرف تفاصيل اكتر).\nلو مش عايز كتابتك تتعدل او تتوزع من غير مقابل و من غير اذنك, يبقى ما تحطهاش هنا.<br />\nانت كمان بتوعدنا انك كتبت دا بنفسك, او نسخته من مصدر فى الملكيه العامه او مصدر حر شبهه.\n<strong>ما تحطش اى عمل ليه حقوق محفوظه من غير اذن صاحب الحق!</strong>",
+       "copyrightwarning2": "لو سمحت تعمل حسابك ان كل مشاركاتك فى {{SITENAME}} ممكن المشاركين التانيين يعدلوها، يغيروها، او يمسحوها خالص.\nلو مانتش حابب ان كتاباتك تتعدل و تتغير بالشكل دا، فياريت ما تنشرهاش هنا.<br />.\nو كمان انت بتدينا كلمة شرف  انك صاحب الكتابات دي، او انك نقلتها من مكان مش خاضع لحقوق النشر (شوف التفاصيل فى $1 ).\n<strong>لو سمحت ما تحطش هنا اى نص خاضع لحقوق النشر من غير تصريح!</strong>",
+       "longpageerror": "<strong>غلط: النص اللى دخلته حجمه $1 كيلوبايت، ودا أكبر من الحد الأقصى و اللى هو {{PLURAL:$2|واحد كيلوبايت|$2 كيلوبايت}}.</strong>\nمش ممكن يتحفظ.",
+       "readonlywarning": "<strong>تحذير: قاعدة البيانات اتقفلت للصيانة، و علشان كدا انت مش ح تقدر تحفظ التعديلات اللى عملتها دلواتى.</strong>\nلو حبيت ممكن  تنسخ النص وتحفظه فى ملف نصى علشان تستعمله بعدين.\n\nالإدارى اللى قفلها كتب السبب دا: $1",
+       "protectedpagewarning": "<strong>تحذير: الصفحة دى اتقفلت بطريقه تخلى اليوزرات السيسوبات هما بس اللى يقدرو يعدلوها.</strong>\nاخر سجل محطوط تحت علشان المراجعه:",
+       "semiprotectedpagewarning": "<strong>ملاحظه:</strong> الصفحه دى اتقفلت بطريقه تخلّى اليوزرات المتسجلين بس هما اللى يقدرو يعدّلوها.\nاخر سجل محطوط تحت علشان المراجعه:",
        "cascadeprotectedwarning": "<strong>تحذير: الصفحة دى اتقفلت بطريقة تخلى اليوزرز [[Special:ListGroupRights|السيوبات]] بس هم اللى يقدرو يعدلوها، ودا علشان هى مدموجة فى {{PLURAL:$1|الصفحة|الصفحات}} التالية واللى اتعملها حمتية بخاصية \"حماية الصفحات المدموجة\":</strong>",
-       "titleprotectedwarning": "'''تحذير: الصفحه دى اتحمت بطريقه تخلّى [[Special:ListGroupRights|حقوق متحدده]] لازم تحتاجها علشان تعمل الصفحه.'''\nاخر سجل محطوط تحت علشان المراجعه:",
+       "titleprotectedwarning": "<strong>تحذير: الصفحه دى اتحمت بطريقه تخلّى [[Special:ListGroupRights|حقوق متحدده]] لازم تحتاجها علشان تعمل الصفحه.</strong>\nاخر سجل محطوط تحت علشان المراجعه:",
        "templatesused": "{{PLURAL:$1|القالب المستعمل |القوالب المستعمله }} ف الصفحه دى:",
        "templatesusedpreview": "{{PLURAL:$1|القالب المستعمل |القوالب المستعمله}} فى البروفه دى",
        "templatesusedsection": "{{PLURAL:$1|القالب|القوالب}} اللى بتستخدم فى القسم دا:",
        "permissionserrors": "غلطه ف السماح",
        "permissionserrorstext": "ما عندك ش صلاحية تعمل كدا،{{PLURAL:$1|علشان|علشان}}:",
        "permissionserrorstext-withaction": "أنت ما عندكش الصلاحيات علشان $2، لل{{PLURAL:$1|سبب|أسباب}} ده:",
-       "recreate-moveddeleted-warn": "'''تحذير: انت بتعيد انشاء صفحه اتمسحت قبل كده.'''\nلازم تتأكد من ان الاستمرار فى تحرير الصفحه دى ملائم.\nسجلات المسح  و النقل بتوع الصفحه دى معروضه هنا:",
+       "recreate-moveddeleted-warn": "<strong>تحذير: انت بتعيد انشاء صفحه اتمسحت قبل كده.</strong>\n\nلازم تتأكد من ان الاستمرار فى تحرير الصفحه دى ملائم.\nسجلات المسح  و النقل بتوع الصفحه دى معروضه هنا:",
        "moveddeleted-notice": "الصفحة دى اتمسحت. سجل المسح و سجل النقل بتوع الصفحة معروضين تحت علشان ترجعلهم.",
        "log-fulllog": "استعراض السجل بالكامل",
        "edit-hook-aborted": "الخطاف ساب التعديل من غير مايدى تفسير.",
        "defaultmessagetext": "النص الاوتوماتيكى",
        "content-failed-to-parse": "فشل ف تحليل $2 محتوى لـ $1 موديل: $3",
        "invalid-content-data": "بيانات المحتوى غلط",
-       "editwarning-warning": "لو سيبت الصفحه دى ممكن يخلّيك تضيّع اى تغييرات عملتها.\nلو انت مسجّل دخولك, ممكن تعطّل التحذير ده من الجزء بتاع \"تعديل\" فى تفضيلاتك.",
+       "editwarning-warning": "لو سيبت الصفحه دى ممكن يخلّيك تضيّع اى تغييرات عملتها.\nلو انت مسجّل دخولك, ممكن تعطّل التحذير ده من الجزء بتاع \"{{int:prefs-editing}}\" فى تفضيلاتك.",
        "content-model-wikitext": "ويكى تكست",
        "content-model-text": "كلام عادى",
        "content-model-javascript": "جاڤاسكربت",
-       "expensive-parserfunction-warning": "تحذير: الصفحه دى فيهااستدعاءات دالة محلل كثيرة مكلفة.\n\nلازم تكون أقل من $2 {{PLURAL:$2|استدعاء|استدعاء}}، يوجد {{PLURAL:$1|الآن $1 استدعاء|الآن $1 استدعاء}}..",
+       "expensive-parserfunction-warning": "<strong>تحذير:</strong> الصفحه دى فيهااستدعاءات دالة محلل كثيرة مكلفة.\n\nلازم تكون أقل من $2 {{PLURAL:$2|استدعاء|استدعاء}}، يوجد {{PLURAL:$1|الآن $1 استدعاء|الآن $1 استدعاء}}.",
        "expensive-parserfunction-category": "صفحات فيها استدعاءات دوال محلل كثيرة ومكلفة",
-       "post-expand-template-inclusion-warning": "تحذير: حجم تضمين القالب كبير قوي.\nبعض القوالب مش ح تتضمن.",
+       "post-expand-template-inclusion-warning": "<strong>تحذير:</strong> حجم تضمين القالب كبير قوي.\nبعض القوالب مش ح تتضمن.",
        "post-expand-template-inclusion-category": "الصفحات اللى تم تجاوز حجم تضمين القالب فيها",
-       "post-expand-template-argument-warning": "تحذير: الصفحة  دى فيها عامل قالب واحد على الأقل ليه حجم تمدد كبير قوي.\nالعوامل دى اتمسحت.",
+       "post-expand-template-argument-warning": "<strong>تحذير:</strong> الصفحة دى فيها عامل قالب واحد على الأقل ليه حجم تمدد كبير قوي.\nالعوامل دى اتمسحت.",
        "post-expand-template-argument-category": "صفحات فيها مناقشات القالب المحذوفة",
        "parser-template-loop-warning": "لووب القالب المحدد: [[$1]]",
        "parser-template-recursion-depth-warning": "حد عمق الريكيرشيون بتاع القالب اتعدى  ($1)",
        "undo-failure": "الرجوع فى التعديل ما نفعش علشان فى تعديلات متعاكسة حصلت فى الصفحة.",
        "undo-norev": "الرجوع فى التعديل ما نفعش علشان هو يا إما مش موجود أو انه إتمسح.",
        "undo-summary": "الرجوع فى التعديل $1 بتاع [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]])",
-       "cantcreateaccount-text": "فتح الحسابات من عنوان الأيبى دا ('''$1''') منعه [[User:$3|$3]].\n\nالسبب إللى إداه $3 هو ''$2''",
+       "cantcreateaccount-text": "فتح الحسابات من عنوان الأيبى دا (<strong>$1</strong>) منعه [[User:$3|$3]].\n\nالسبب إللى إداه $3 هو <em>$2</em>",
        "viewpagelogs": "عرض السجلات للصفحه دى",
        "nohistory": "الصفحة دى ما لهاش تاريخ تعديل.",
        "currentrev": "النسخه دلوقتى",
        "last": "قبل كده",
        "page_first": "الأولانية",
        "page_last": "الأخرانية",
-       "histlegend": "اختيار الفرق: علم على صناديق النسخ للمقارنه و اضغط قارن بين النسخ المختاره او الزرار اللى تحت.<br />\nمفتاح: (دلوقتى) = الفرق مع النسخة دلوقتى\n(اللى قبل كده) = الفرق مع النسخة اللى قبل كده، ص = تعديل صغير",
+       "histlegend": "اختيار الفرق: علم على صناديق النسخ للمقارنه و اضغط قارن بين النسخ المختاره او الزرار اللى تحت.<br />\nمفتاح: <strong>({{int:cur}})</strong> = الفرق مع النسخة دلوقتى، <strong>({{int:last}})</strong> = الفرق مع النسخة اللى قبل كده، <strong>{{int:minoreditletter}}</strong> = تعديل صغير.",
        "history-fieldset-title": "تصفح التاريخ",
        "history-show-deleted": "محذوف بس",
        "histfirst": "اول",
        "rev-deleted-user": "(اسم اليوزر اتشال)",
        "rev-deleted-event": "(السجل إتشال)",
        "rev-deleted-user-contribs": "[اسم اليوزر أو الآى بى اتشال - التعديل مخفى من المساهمات]",
-       "rev-deleted-text-permission": "مراجعة الصفحه دى إتمسحت من الأرشيفات العامه.\nممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل المسح].",
-       "rev-deleted-text-unhide": "مراجعة الصفحه دى '''اتمسحت'''. ممكن تلاقى تفاصيل فى [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل المسح].\nلو كنت انت ادارى ممكن[$1 تشوف المراجعه دى] لو كنت عايز تكمل..",
-       "rev-suppressed-text-unhide": "نسخه الصفحه دى '''اتخبت'''.\nممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل التخبيه].\nكسيسوب إنت ممكن [$1 تشوف النسخه دى] لو إنت عايز تتابع.",
-       "rev-deleted-text-view": "التعديل ده اتمسح من الأرشيف العام. ممكن تشوف التعديل ده علشان إنت إدارى فى {{SITENAME}} .\nممكن يكون فيه تفاصيل بخصوص ده فى [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل المسح].",
-       "rev-suppressed-text-view": "نسخه الصفحه دى '''اتخبت'''.\nكسيسوب ممكن تشوفها؛ ممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل التخبيه].",
-       "rev-deleted-no-diff": "انت ماينفعش تشوف الفرق دا علشان واحده من المراجعات '''اتمسحت'''. ممكن يكون فيه تفاصيل فى[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل المسح].",
-       "rev-suppressed-no-diff": "'''انت ما تقدرش تستعرض التغيير دا لان واحده من التعديلات''' اتمسحت.",
-       "rev-deleted-unhide-diff": "واحده من مراجعات الفرق ده  '''اتمسحت'''. ممكن تلاقى تفاصيل فى [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الكبت].\nانتا لو ادارى ممكن [$1 تشوف الفرق دا] لو كانت عايز تستمر",
-       "rev-suppressed-unhide-diff": "واحده من نسخ الفرق ده '''اتخبت'''.\nممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل التخبيه].\nكسيسوب ممكن [$1 تشوف الفرق ده] لو إنت عايز تكمل.",
-       "rev-deleted-diff-view": "واحده من نسخ الفرق ده '''اتمسحت'''.\nكسيسوب ممكن تشوف الفرق ده؛ ممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل المسح].",
-       "rev-suppressed-diff-view": "واحده من نسخ الفرق ده '''اتخبت'''.\nكسيسوب ممكن تشوف الفرق ده؛ ممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل التخبيه].",
+       "rev-deleted-text-permission": "مراجعة الصفحه دى <strong>إتمسحت</strong> من الأرشيفات العامه.\nممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل المسح].",
+       "rev-deleted-text-unhide": "مراجعة الصفحه دى <strong>اتمسحت</strong>.\nممكن تلاقى تفاصيل فى [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل المسح].\nلو كنت انت ادارى ممكن [$1 تشوف المراجعه دى] لو كنت عايز تكمل..",
+       "rev-suppressed-text-unhide": "نسخه الصفحه دى <strong>اتخبت</strong>.\nممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل التخبيه].\nكسيسوب إنت ممكن [$1 تشوف النسخه دى] لو إنت عايز تتابع.",
+       "rev-deleted-text-view": "التعديل ده <strong>اتمسح</strong>.\nممكن تشوفه، التفاصيل بخصوص ده فى [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل المسح].",
+       "rev-suppressed-text-view": "نسخه الصفحه دى <strong>اتخبت</strong>.\nكسيسوب ممكن تشوفها؛ ممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل التخبيه].",
+       "rev-deleted-no-diff": "انت ماينفعش تشوف الفرق دا علشان واحده من المراجعات <strong>اتمسحت</strong>.\nممكن يكون فيه تفاصيل فى[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل المسح].",
+       "rev-suppressed-no-diff": "انت ما تقدرش تستعرض التغيير دا لان واحده من التعديلات <strong>اتمسحت</strong>.",
+       "rev-deleted-unhide-diff": "واحده من مراجعات الفرق ده <strong>اتمسحت</strong>.\nممكن تلاقى تفاصيل فى [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الكبت].\nانتا لو ادارى ممكن [$1 تشوف الفرق دا] لو كانت عايز تستمر.",
+       "rev-suppressed-unhide-diff": "واحده من نسخ الفرق ده <strong>اتخبت</strong>.\nممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل التخبيه].\nكسيسوب ممكن [$1 تشوف الفرق ده] لو إنت عايز تكمل.",
+       "rev-deleted-diff-view": "واحده من نسخ الفرق ده <strong>اتمسحت</strong>.\nكسيسوب ممكن تشوف الفرق ده؛ ممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل المسح].",
+       "rev-suppressed-diff-view": "واحده من نسخ الفرق ده <strong>اتخبت</strong>.\nكسيسوب ممكن تشوف الفرق ده؛ ممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل التخبيه].",
        "rev-delundel": "عرض/تخبيه",
        "rev-showdeleted": "اعرض",
        "revisiondelete": "امسح/الغى المسح بتاع المراجعات",
        "revdelete-show-file-submit": "ايوه",
        "logdelete-selected": "{{PLURAL:$1|حدث السجل المختار|أحداث السجل المختارة}}:",
        "revdelete-confirm": "لو سمحت اتأكدد انك ناوى تعمل كدا, و انك فاهم اللى ح يترتب على كدا, و انك بتعمل كدا بالتوافق مع مع [[{{MediaWiki:Policy-url}}|السياسه]].",
-       "revdelete-suppress-text": "الكبت لازم ييتعمل '''بس''' فى الحالات دى:\n* معلومات شخصيه مش مناسبه\n*: ''عنوان البيت او رقم التليفون, رقم الضمان الاجتماعى, الخ.''",
+       "revdelete-suppress-text": "الكبت لازم ييتعمل <strong>بس</strong> فى الحالات دى:\n* معلومات تشهيريه\n* معلومات شخصيه مش مناسبه\n*: <em>عنوان البيت او رقم التليفون, رقم الضمان الاجتماعى, الخ.</em>",
        "revdelete-legend": "وضع حدود رؤية",
        "revdelete-hide-text": "إخفاء نص النسخة",
        "revdelete-hide-image": "خبى المحتويات بتاعة الملف",
        "revdelete-show-no-access": "حصل غلط فى عرض البند اللى بتاريخ $2, الساعه $1: البند دا متعلم عليه انه\"محظور\".\nانتا ما عندكش صلاحية الوصول ليه.",
        "revdelete-modify-no-access": "حصل غلط فى تعديل البند اللى بتاريخ$2, الساعه $1: البند دا متعلم عليه انه\"محظور\".\nانتا ماعندكش صلاحية الوصول ليه..",
        "revdelete-modify-missing": "حصل غلط فى تعديل ال ID بتاعة البند $1: ضايع من قاعدة المعلومات!",
-       "revdelete-no-change": "'''تحذير:''' البند اللى بتاريخ$2, الساعه $1 اعدادات الرؤيه اللى انتا طلبتها موجوده بالفعل.",
+       "revdelete-no-change": "<strong>تحذير:</strong> البند اللى بتاريخ $2, الساعه $1 اعدادات الرؤيه اللى انتا طلبتها موجوده بالفعل.",
        "revdelete-concurrent-change": "حصل غلط فى تعديل البند اللى بتاريخ $2,الساعه $1: حالته الظاهر فى حد تانى غيرها و انتا بتحاول تعدل فيها..\nلو سمحت بص على السجلات.",
        "revdelete-only-restricted": "خطأ تخبيه العنصر اللى تاريخه $2, $1: ماينفعش تمنع بنود من ان الاداريين يشوفوها من غير ما تختار كمان واحد من اختيارات الكبت التانيه.",
        "revdelete-reason-dropdown": "*اسباب المسح المعتاده\n** خرق لحقوق النشر\n** معلومات شخصيه مش مناسبه\n** معلومات للتشهير",
        "nextn-title": "{{PLURAL:$1|النتيجه|النتايج}}  $1 اللى بعد كدا.",
        "shown-title": "اعرض $1 {{PLURAL:$1|نتيجه|نتايج}} فى كل صفحه",
        "viewprevnext": "شوف ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchmenu-exists": "'''فيه صفحه اسمها \"[[:$1]]\" على الويكى ده.''' {{PLURAL:$2|0=|بص كمان على نتايج البحث التانيه.}}",
+       "searchmenu-exists": "<strong>فيه صفحه اسمها \"[[:$1]]\" على الويكى ده.</strong> {{PLURAL:$2|0=|بص كمان على نتايج البحث التانيه.}}",
        "searchmenu-new": "<strong>ابتدى الصفحه \"[[:$1]]\" ع الويكى دا!</strong>  {{PLURAL:$2|0=|بص كمان على الصفحه اللى لقيناها من تدويرك.|بص كمان على نتايج التدوير.}}",
        "searchprofile-articles": "صفحات محتوى",
        "searchprofile-images": "مالتيميديا",
        "search-relatedarticle": "مرتبطه",
        "searchrelated": "مرتبطه",
        "searchall": "الكل",
-       "showingresults": "القائمة دى بتعرض {{PLURAL:$1|'''1''' نتيجة|'''$1''' نتيجة}} من أول  رقم '''$2'''.",
+       "showingresults": "الصفحه دى بتعرض {{PLURAL:$1|<strong>1</strong> نتيجه}} من اول رقم <strong>$2</strong>.",
        "search-showingresults": "{{PLURAL:$4|النتايج <strong>$1</strong> من <strong>$3</strong>|النتايج <strong>$1 - $2</strong> من أصل <strong>$3</strong>}}",
        "search-nonefound": "لا توجد نتائج تطابق الاستعلام.",
        "powersearch-legend": "تدوير متقدم",
        "userrights-lookup-user": "إدارة مجموعات اليوزر",
        "userrights-user-editname": "دخل اسم يوزر:",
        "editusergroup": "تعديل مجموعات اليوزر",
-       "editinguser": "تغيير حقوق اليوزر بتاعه اليوزر '''[[User:$1|$1]]''' $2",
+       "editinguser": "تغيير حقوق اليوزر بتاعه {{GENDER:$1|اليوزر}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "تعديل مجموعات {{GENDER:$1|اليوزر}}",
        "saveusergroups": "حفظ مجموعات {{GENDER:$1|اليوزر}}",
        "userrights-groupsmember": "عضو في:",
        "group-all": "(الكل)",
        "group-user-member": "{{GENDER:$1|يوزر}}",
        "group-autoconfirmed-member": "{{GENDER:$1|يوزر متأكد أوتوماتيكي}}",
-       "group-bot-member": "بوت",
+       "group-bot-member": "{{GENDER:$1|بوت}}",
        "group-sysop-member": "{{GENDER:$1|سيسوب}}",
        "group-bureaucrat-member": "{{GENDER:$1|بيروقراط}}",
        "group-suppress-member": "{{GENDER:$1|أوفرسايت}}",
        "right-ipblock-exempt": "إتفادى عمليات منع الأيبي، المنع الأوتوماتيكى ومنع النطاق.",
        "right-unblockself": "رفع المنع عن نفسهم",
        "right-protect": "تغيير مستويات الحماية وتعديل الصفحات المحمية",
-       "right-editprotected": "تعديل الصفحات المحمية (من غير الحماية المتضمنة)",
+       "right-editprotected": "تعديل الصفحات المحمية \"{{int:protect-level-sysop}}\"",
        "right-editinterface": "تعديل الواجهة بتاعة اليوزر",
        "right-editusercss": "تعديل ملفات CSS لليوزرز التانيين",
        "right-edituserjs": "تعديل ملفات JS لليوزرز التانيين",
        "recentchangeslinked-feed": "تعديلات  ليها علاقه",
        "recentchangeslinked-toolbox": "تعديلات  ليها علاقه",
        "recentchangeslinked-title": "التعديلات المرتبطه  ب \"$1\"",
-       "recentchangeslinked-summary": "دÙ\89 Ù\84Ù\8aستة ØªØºÙ\8aÙ\8aرات Ø§ØªØ¹Ù\85Ù\84ت Ù\82رÙ\8aب Ù\81Ù\89 ØµÙ\81Ø­ Ù\85عÙ\85Ù\88Ù\84 Ù\84Ù\8aÙ\87ا Ù\84Ù\8aÙ\86Ù\83 Ù\85Ù\86 ØµÙ\81Ø­ Ù\85خصÙ\88صÙ\87 (اÙ\88 Ù\84اعضاء Ù\81Ù\89 ØªØµÙ\86Ù\8aÙ\81 Ù\85عÙ\8aÙ\86).\nاÙ\84صÙ\81Ø­ Ø§Ù\84Ù\84Ù\89 Ù\81Ù\89 [[Special:Watchlist|Ù\84ستة Ø§Ù\84صÙ\81Ø­ Ø§Ù\84Ù\84Ù\89 Ø¨ØªØ±Ø§Ù\82بÙ\87ا]] Ù\85عرÙ\88ضÙ\87 '''باÙ\84Ù\80bold'''",
+       "recentchangeslinked-summary": "دÙ\89 Ù\84Ù\8aستة ØªØºÙ\8aÙ\8aرات Ø§ØªØ¹Ù\85Ù\84ت Ù\82رÙ\8aب Ù\81Ù\89 ØµÙ\81Ø­ Ù\85عÙ\85Ù\88Ù\84 Ù\84Ù\8aÙ\87ا Ù\84Ù\8aÙ\86Ù\83 Ù\85Ù\86 ØµÙ\81Ø­ Ù\85خصÙ\88صÙ\87 (عÙ\84شاÙ\86 ØªØ´Ù\88Ù\81 Ø§Ù\84اعضاء Ù\81Ù\89 ØªØµÙ\86Ù\8aÙ\81 Ù\85عÙ\8aÙ\86Ø\8c Ø­Ø· {{ns:category}}:اÙ\84اسÙ\85 Ø¨ØªØ§Ø¹ Ø§Ù\84تصÙ\86Ù\8aÙ\81).\nاÙ\84صÙ\81Ø­ Ø§Ù\84Ù\84Ù\89 Ù\81Ù\89 [[Special:Watchlist|Ù\84ستة Ø§Ù\84صÙ\81Ø­ Ø§Ù\84Ù\84Ù\89 Ø¨ØªØ±Ø§Ù\82بÙ\87ا]] Ù\85عرÙ\88ضÙ\87 <strong>باÙ\84Ù\80bold</strong>.",
        "recentchangeslinked-page": "اسم الصفحه :",
        "recentchangeslinked-to": "إظهارالتغييرات للصفحات الموصولة للصفحة اللى انت اديتها",
        "upload": "ارفع فايل (upload file)",
        "upload_directory_missing": "مجلد التحميل($1) ضايع السيرفير وماقدرش يعمل واحد تاني.",
        "upload_directory_read_only": "مجلد التحميل ($1) مش ممكن الكتابة عليه بواسطة سيرڨر الويب.",
        "uploaderror": "غلطه فى التحميل",
-       "uploadtext": "استخدم الاستمارة علشان تحميل الملفات.\nلعرض أو البحث ف الملفات المتحملة سابقا، راجع عمليات المسح [[Special:Log/delete|deletion log]] [[Special:FileList|لستة الملفات المتحملة]]، عمليات التحميل  موجودة فى [[Special:Log/upload|سجل التحميل]].\n\nعلشان تحط صورة فى صفحة، استخدم الوصلات فى الصيغ التالية:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' علشان استخدام النسخة الكاملة لملف\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|نص بديل]]</nowiki></code>''' لاستخدام صورة عرضها 200 بكسل فى صندوق فى الجانب الأيسر مع 'نص بديل' كوصف\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' للوصل للملف مباشرة بدون عرض الملف.",
+       "uploadtext": "استخدم الاستمارة علشان تحميل الملفات.\nلعرض أو البحث ف الملفات المتحملة سابقا، راجع عمليات [[Special:Log/delete|المسح]]، عمليات التحميل  موجودة فى [[Special:Log/upload|سجل التحميل]].\n\nعلشان تحط صورة فى صفحة، استخدم الوصلات فى الصيغ التالية:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> علشان استخدام النسخة الكاملة لملف\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|نص بديل]]</nowiki></code></strong> لاستخدام صورة عرضها 200 بكسل فى صندوق فى الجانب الأيسر مع \"نص بديل\" كوصف\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> للوصل للملف مباشرة بدون عرض الملف",
        "upload-permitted": "{{PLURAL:$2|نوع|انواع}} الملفات اللى مسموح بيها: $1.",
        "upload-preferred": "{{PLURAL:$2|نوع|انواع}} الملفات المفضله: $1.",
        "upload-prohibited": "{{PLURAL:$2|نوع|انواع}} الملفات الممنوعه: $1.",
        "badfilename": " اسم الملف إتغيير ل \"$1\".",
        "filetype-badmime": "مش مسموح تحميل ملفات من نوع \"$1\".",
        "filetype-bad-ie-mime": " المف دا ماتحملش لأن الإنترنت إكسبلورر ح يكتشفه ك\"$1\", وهوه نوع ملف ممنوع ومن المحتمل انه يكون خطر.",
-       "filetype-unwanted-type": "'''\".$1\"''' هو مش نوع ملف مرغوب فيه.\n{{PLURAL:$3|نوع الملف المفضل هو|أنواع الملفات المفضلة هي}} $2.",
-       "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|مش نوع ملف مسموح بيه|مش انواع ملفات مسموح بيها}}.\n{{PLURAL:$3|نوع الملف المسموح بيه هو|أنواع الملفات المسموح بيها هي}} $2.",
+       "filetype-unwanted-type": "<strong>\".$1\"</strong> هو مش نوع ملف مرغوب فيه.\n{{PLURAL:$3|نوع الملف المفضل هو|أنواع الملفات المفضلة هي}} $2.",
+       "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|مش نوع ملف مسموح بيه|مش انواع ملفات مسموح بيها}}.\n{{PLURAL:$3|نوع الملف المسموح بيه هو|أنواع الملفات المسموح بيها هي}} $2.",
        "filetype-missing": "الملف مالوش امتدا(مثلا \".jpg\").",
        "file-too-large": "الملف كان كبير جدا.",
        "filetype-banned": "نوع الملف ده ممنوع.",
        "large-file": "ينصح ان الملفات ماتكونش أكبر من $1؛ الملف ده حجمه $2.",
        "largefileserver": "حجم الملف ده أكبر من المسموح بيه على السيرڨر ده .",
        "emptyfile": "الظاهر ان الملف اللى انت حملته طلع فاضي.\nيمكن يكون السبب هوه كتابة الاسم غلط.\nلو سمحت تتاكد من إنك فعلا عايز تحمل الملف دا..",
-       "fileexists": "Ù\81Ù\8aÙ\87  Ù\85Ù\84Ù\81 Ù\85Ù\88جÙ\88د Ø¨Ø§Ù\84اسÙ\85 Ø¯Ù\87  Ø§Ù\84رجاء Ø§Ù\84تأÙ\83د Ù\85Ù\86 Ø§Ù\84Ù\85Ù\84Ù\81 Ø¯Ù\87 Ø¨Ø§ØªØ¨Ø§Ø¹ Ø§Ù\84Ù\88صÙ\84Ø© Ø§Ù\84تاÙ\84Ù\8aØ© <strong>[[:$1]]</strong> Ù\82بÙ\84 Ù\85ا تغيره.\n[[$1|thumb]]",
+       "fileexists": "Ù\81Ù\8aÙ\87  Ù\81اÙ\8aÙ\84 Ù\85Ù\88جÙ\88د Ø¨Ø§Ù\84اسÙ\85 Ø¯Ù\87Ø\8c Ù\84Ù\88 Ø³Ù\85حت Ø§ØªØ£Ù\83د Ù\85Ù\86 <strong>[[:$1]]</strong> Ù\84Ù\88 {{GENDER:|Ù\83Ù\86ت}} Ù\85Ø´ Ù\85تاÙ\83د Ø§Ù\86Ù\83 Ø¹Ø§Ù\8aز تغيره.\n[[$1|thumb]]",
        "filepageexists": "صفحة الوصف بتاعة المف دا خلاص اتعملها انشاء فى <strong>[[:$1]]</strong>، بس مافيش ملف بالاسم دا دلوقتى.\nالملخص اللى ح تكتبه  مش ح يظهر على صفحة الوصف.\nعلشان تخلى الملف يظهر هناك، ح تحتاج تعدله يدوي.\n[[$1|thumb]]",
        "fileexists-extension": "فى ملف موجود باسم قريب: [[$2|thumb]]\n* اسم الملف اللى انت عايز تحمله: <strong>[[:$1]]</strong>\n* اسم الملف الموجود: <strong>[[:$2]]</strong>\nلو سمحت تختار اسم تاني.",
-       "fileexists-thumbnail-yes": "الظاهر ان الملف دا عبارة عن صورة متصغرة ''(تصغير)''. [[$1|thumb]]\nلو سمحت تشيك على الملف <strong>[[:$1]]</strong>.\nلو كان الملف هو نفس الصورة بالحجم الاصلي، ف مافيش داعى تحمله مرة تانية",
-       "file-thumbnail-no": "يبدأ الملف ب <strong>$1</strong>.\nيبدو أن الملف مصتغر لحجم أعلى ''(تصغير)''.\nإذا كان عندك الصورة فى درجة دقة كامله حملها، أو غير اسم الملف من فضلك.",
+       "fileexists-thumbnail-yes": "الظاهر ان الملف دا عبارة عن صورة متصغرة <em>(thumbnail)</em>.\n[[$1|thumb]]\nلو سمحت تشيك على الملف <strong>[[:$1]]</strong>.\nلو كان الملف هو نفس الصورة بالحجم الاصلي، ف مافيش داعى تحمله مرة تانيه.",
+       "file-thumbnail-no": "يبدأ الملف ب <strong>$1</strong>.\nيبدو أن الملف مصتغر لحجم أعلى <em>(thumbnail)</em>.\nإذا كان عندك الصورة فى درجة دقة كامله حملها، أو غير اسم الملف من فضلك.",
        "fileexists-forbidden": "فى ملف بنفس الاسم موجود, و ماينفعش يتكتب عليه.\nلو انتا لسه عايز تحمل الملف بتاعك, لو سمحت ترجع لورا و تستعمل اسم جديد. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "فى ملف بنفس الاسم دا فى مخزن الملفات المشترك.\nلو كنت لسه عايز ترفعه، لو سمحت ارجع وحمل الملف دا باسم جديد.\n[[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "الملف دا تكرار  {{PLURAL:$1|للملف|للملفات}} دي:",
        "upload-options": "أوبشنات الرفع",
        "watchthisupload": "حط الملف دا تحت المراقبه",
        "filewasdeleted": "فيه فايل بنفس الاسم دا اتأپلود قبل كدا و بعدين اتمسح.\nلازم تشيّك على $1 قبل ما تأپلود الفايل كمان مره.",
-       "filename-bad-prefix": "اسم الملف اللى بتحمله بيبتدى بـ'''\"$1\"'''، واللى هو اسم مش وصفى بيتحط غالبا من الكاميرات الديجيتال اوتوماتيكي.\nلو سمحت تختار اسم يكون بيوصف الملف بتاعك احسن من كدا.",
+       "filename-bad-prefix": "اسم الملف اللى بتحمله بيبتدى بـ<strong>\"$1\"</strong>، واللى هو اسم مش وصفى بيتحط غالبا من الكاميرات الديجيتال اوتوماتيكي.\nلو سمحت تختار اسم يكون بيوصف الملف بتاعك احسن من كدا.",
        "filename-prefix-blacklist": " #<!-- سيب السطر ده زى ما هوه --> <pre>\n# الصيغة كدا:\n#   * كل حاجة من أول علامة \"#\" لحد أخر السطر هى تعليق\n#   * كل سطر مش فاضى هو بريفيكس لأسماء الملفات النمطية اللى بتحطها اوتوماتيكى  الكاميرات الديجيتال\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # بعض التليفونات المحمولة\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- سيب السطر ده زى ما هوه -->",
        "upload-proto-error": "بروتوكول مش صحيح",
        "upload-proto-error-text": "االتحميل عن بعد لازمله يوأرإل بيبتدى بـ <code>http://</code> أو <code>ftp://</code>.",
        "shared-repo-name-wikimediacommons": "ويكيميديا كومنز",
        "filerevert": "استرجع $1",
        "filerevert-legend": "استرجع الملف",
-       "filerevert-intro": "أنت بترجع '''[[Media:$1|$1]]''' [$4 للنسخةاللى بتاريخ $2، $3].",
+       "filerevert-intro": "أنت بترجع <strong>[[Media:$1|$1]]</strong> [$4 للنسخةاللى بتاريخ $2، $3].",
        "filerevert-comment": "السبب:",
        "filerevert-defaultcomment": "رجع النسخة اللى بتاريخ $2، $1 ($3)",
        "filerevert-submit": "استرجع",
-       "filerevert-success": "'''[[Media:$1|$1]]''' اترجعت [$4 للنسخةاللى بتاريخ $2، $3].",
+       "filerevert-success": "<strong>[[Media:$1|$1]]</strong> اترجعت [$4 للنسخةاللى بتاريخ $2، $3].",
        "filerevert-badversion": "مافيش نسخة محلية قديمة  للملف دا بالتاريخ المتقدم",
        "filedelete": "امسح $1",
        "filedelete-legend": "امسح الملف",
-       "filedelete-intro": "انتا على وشك تمسح الملف'''[[Media:$1|$1]]'''معا كل التاريخ بتاعه.",
-       "filedelete-intro-old": "<span class=\"plainlinks\">أنت بتمسح نسخة '''[[Media:$1|$1]]'''اللى  بتاريخ [$4 $3، $2].</span>",
+       "filedelete-intro": "انتا على وشك تمسح الملف <strong>[[Media:$1|$1]]</strong> معا كل التاريخ بتاعه.",
+       "filedelete-intro-old": "انت بتمسح نسخة <strong>[[Media:$1|$1]]</strong> اللى  بتاريخ [$4 $3، $2].",
        "filedelete-comment": "السبب:",
        "filedelete-submit": "مسح",
-       "filedelete-success": "'''$1''' خلاص اتمسح.",
-       "filedelete-success-old": "نسخة الـ'''[[Media:$1|$1]]''' اللى بتاريخ $3، $2 اتمسحت.",
-       "filedelete-nofile": "'''$1''' مش موجود.",
-       "filedelete-nofile-old": "مافيش نسخة فى الارشيف من '''$1''' بالعناصر المتحددة.",
+       "filedelete-success": "<strong>$1</strong> خلاص اتمسح.",
+       "filedelete-success-old": "نسخة الـ<strong>[[Media:$1|$1]]</strong> اللى بتاريخ $3، $2 اتمسحت.",
+       "filedelete-nofile": "<strong>$1</strong> مش موجود.",
+       "filedelete-nofile-old": "مافيش نسخة فى الارشيف من <strong>$1</strong> بالعناصر المتحددة.",
        "filedelete-otherreason": "سبب زيادة/تاني:",
        "filedelete-reason-otherlist": "سبب تانى",
        "filedelete-reason-dropdown": "*أسباب المسح الشايعة\n** مخالفة حقوق النشر\n** ملف متكرر",
        "booksources-text": "فى تحت لستة بوصلات لمواقع تانية بتبيع الكتب الجديدة والمستعملة، كمان ممكن تلاقى معلومات إضافية عن الكتب اللى يتدور عليها :",
        "booksources-invalid-isbn": "رقم الـ ISBN اللى كتبته شكله مش صحيح؛ اتإكد من الغلطات بتاعة النسخ من المصدر الاصلى.",
        "specialloguserlabel": "اليوزر:",
-       "speciallogtitlelabel": "العنوان:",
+       "speciallogtitlelabel": "الهدف (العنوان او {{ns:user}}:اسم اليوزر لليوزر):",
        "log": "سجلات",
        "all-logs-page": "كل السجلات العامه",
        "alllogstext": "عرض شامل لكل السجلات الموجودة فى {{SITENAME}}.\nممكن تخلى اللستة متحددة اكتر لو تختار نوع العملية، أو اسم اليوزر (حساس لحالة الحروف)، أو الصفحة المتأثرة (برضه حساس لحالة الحروف).",
        "emailccsubject": "نسخة من رسالتك ل $1: $2",
        "emailsent": "الإيميل اتبعت",
        "emailsenttext": "الايميل بتاعك اتبعت خلاص.",
-       "emailuserfooter": "الايميل دا بعته $1 لـ $2 عن طريق خاصية \"مراسلة اليوزر\" فى {{SITENAME}}.",
+       "emailuserfooter": "الايميل ده {{GENDER:$1|بعته}} $1 لـ {{GENDER:$2|$2}} عن طريق خاصيه \"{{int:emailuser}}\" فى {{SITENAME}}. لو {{GENDER:$2|انك}} رديت على الايميل ده،  \nفالايميل {{GENDER:$2|بتاعك}} حيتبعت على طول {{GENDER:$1|للى بعتلك الايميل}}، و ده حيكشف الايميل {{GENDER:$2|بتاعك}} {{GENDER:$1|للطرف التانى}}.",
        "watchlist": "لستة الصفحات اللى باراقبها",
        "mywatchlist": "لستة  الصفح اللى باراقبها",
        "watchlistfor2": "لليوزر $1 ($2)",
        "exbeforeblank": "المحتوى قبل التفضيه كان: '$1'",
        "delete-confirm": "مسح\"$1\"",
        "delete-legend": "مسح",
-       "historywarning": "'''تحذير:''' الصفحه اللى ها  تمسحها ليها تاريخ فيه تقريبا $1 {{PLURAL:$1|مراجعة}}:",
+       "historywarning": "<strong>تحذير:</strong> الصفحه اللى ها  تمسحها ليها تاريخ فيه تقريبا $1 {{PLURAL:$1|مراجعة}}:",
        "confirmdeletetext": "انت على وشك انك تمسح صفحه أو صوره و كل تاريخها.\nمن فضلك  اتأكد انك عايز المسح وبأنك فاهم نتايج  العمليه  دى. عمليات المسح لازم تتم بناء على [[{{MediaWiki:Policy-url}}|القواعد المتفق عليها]].",
        "actioncomplete": "العمليه خلصت",
        "actionfailed": "الفعل فشل",
        "rollbackfailed": "الترجيع ما نفعش",
        "cantrollback": "ماقدرناش نرجع فى التعديل؛ آخر مساهم هوه الوحيد اللى ساهم فى الصفحة دي.",
        "alreadyrolled": "ماقدرناش نرجع التعديل الاخير لـ [[:$1]] بتاع [[User:$2|$2]] ([[User talk:$2|نقاش]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nفى واحد تانى عدل الصفحه او عمل استرجاع قبل كده.\n\nاخر تعديل للصفحه دى عمله [[User:$3|$3]] ([[User talk:$3|نقاش]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
-       "editcomment": "ملخص التعديل كان: \"''$1''\".",
+       "editcomment": "ملخص التعديل كان: <em>$1</em>.",
        "revertpage": "استرجع التعديلات بتاعة [[Special:Contributions/$2|$2]] ([[User talk:$2|مناقشة]]) لآخر نسخة بتاعة [[User:$1|$1]]",
-       "revertpage-nouser": "استرجع التعديلات بتاعه (اسم اليوزر اتمسح) لغايه آخر نسخه بتاعه [[User:$1|$1]]",
+       "revertpage-nouser": "استرجع التعديلات بتاعه (اسم اليوزر اتمسح) لغايه آخر نسخه بتاعه {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "استرجع تعديلات {{GENDER:$3|$1}}؛\nاسترجع لآخر نسخة بواسطة {{GENDER:$4|$2}}.",
        "sessionfailure": "الظاهر انه فى مشكلة فى جلسة دخولك دى ؛\nوعلشان كدا العملية دى اتلغت كإجراء احترازى ضد الاختراق.\nلو سمحت دوس على زرار\"رجوع\" علشان تحمل الصفحة اللى جيت منها مرة تانية، و بعدين حاول تاني.",
        "protectlogpage": "سجل الحمايه",
        "protect_expiry_invalid": "وقت الانتهاء مش صحيح.",
        "protect_expiry_old": "وقت انتهاء المنع قديم.",
        "protect-unchain-permissions": "شيل حماية أوبشنات الحمايه التانيه",
-       "protect-text": "ممكن هنا تعرض و تغير مستوى الحمايه للصفحه '''$1'''.",
-       "protect-locked-blocked": "انت مش ممكن تغير مستويات الحماية وأنت ممنوع.\nالإعدادات بتاعة الصفحة '''$1''' دلوقتى هي:",
-       "protect-locked-dblock": "ما ينفعش تغير مستويات الحماية بسبب قفل قاعدة البيانات دلوقتي.\nالإعدادات بتاعة الصفحة '''$1''' دلوقتى هي:",
-       "protect-locked-access": "حسابك ما لوش  صلاحية تغيير مستوى حماية الصفحه.\nالاعدادات الحالية للصفحه '''$1''' هى:",
+       "protect-text": "ممكن هنا تعرض و تغير مستوى الحمايه للصفحه <strong>$1</strong>.",
+       "protect-locked-blocked": "انت مش ممكن تغير مستويات الحماية وأنت ممنوع.\nالإعدادات بتاعة الصفحة <strong>$1</strong> دلوقتى هي:",
+       "protect-locked-dblock": "ما ينفعش تغير مستويات الحماية بسبب قفل قاعدة البيانات دلوقتي.\nالإعدادات بتاعة الصفحة <strong>$1</strong> دلوقتى هي:",
+       "protect-locked-access": "حسابك ما لوش  صلاحية تغيير مستوى حماية الصفحه.\nالاعدادات الحالية للصفحه <strong>$1</strong> هى:",
        "protect-cascadeon": "الصفحه دى محميه لكونها متضمنه فى {{PLURAL:$1|الصفحه|الصفحات}} دى، واللى  فيها اختيار حماية الصفحات المتضمنه شغال.\nممكن تغير مستوى حماية الصفحه دى بدون التأثير على حماية الصفحات المتضمنه التانيه.",
        "protect-default": "السماح لكل اليوزرات",
        "protect-fallback": "محتاج  اذن \"$1\"",
        "restriction-level-all": "أى مستوى",
        "undelete": "عرض الصفحات الممسوحة",
        "undeletepage": "عرض واسترجاع الصفحات المسوحة",
-       "undeletepagetitle": "'''دا بيتكون من النسخ الممسوحة لـ[[:$1]]'''.",
+       "undeletepagetitle": "<strong>دا بيتكون من النسخ الممسوحة لـ[[:$1|$1]]</strong>.",
        "viewdeletedpage": "عرض الصفحات الممسوحة",
        "undeletepagetext": "{{PLURAL:$1|الصفحة دى اتمسحت بس ليه|$1الصفحات دى اتمسحت بس ليه}} موجودة فى الارشيف و ممكن تترجع.\n\n\nالأرشيف ممكن يتنضف كل شوية.",
        "undelete-fieldset-title": "رجع النسخ",
-       "undeleteextrahelp": "علشان ترجع تاريخ الصفحة كله، سيب كل الصناديق فاضية و دوس '''''ترجيع'''''.\nعلشان ترجع جزء من الصفحة، حط علامة فى الصناديق أدام التعديلات اللى عايز  ترجعهاو دوس '''''ترجيع'''''.\nلو دوست على  '''''إبتدى تاني'''''  التعليق ح يتمسح و كل العلامات  اللى فى الصناديق ح تتحذف.",
+       "undeleteextrahelp": "علشان ترجع تاريخ الصفحة كله، سيب كل الصناديق فاضية و دوس <strong><em>{{int:undeletebtn}}</em></strong>.\nعلشان ترجع جزء من الصفحة، حط علامة فى الصناديق أدام التعديلات اللى عايز  ترجعهاو دوس <strong><em>{{int:undeletebtn}}</em></strong>.",
        "undeleterevisions": "$1 {{PLURAL:$1|نسخة}} اتحطت فى  الارشيف",
        "undeletehistory": "لو رجعت الصفحة، كل المراجعات ح تترجع للتاريخ دا\nلو فى صفحة جديدة اتعملت بنفس الاسم بعد المسح، المراجعات المترجعة ح تبان فى التاريخ اللى فات.",
        "undeleterevdel": "الترجيع مش ح يحصل لو كان ح يسبب ان المراجعة تيجى فى راس الصفحة أو ان الملف يتمسح حتة منه .\nفى الحالات اللى زى كدا، لازم تبين أخر المراجعات الممسوحة.",
        "undeleteinvert": "اعكس الاختيار",
        "undeletecomment": "السبب:",
        "cannotundelete": "الترجيع مانفعش:\n$1",
-       "undeletedpage": "'''اترجع $1'''\n\nبص على [[Special:Log/delete|سجل المسح]] علشان تشوف عمليات المسح و الترجيع الاخيرة.",
+       "undeletedpage": "<strong>اترجع $1</strong>\n\nبص على [[Special:Log/delete|سجل المسح]] علشان تشوف عمليات المسح و الترجيع الاخيرة.",
        "undelete-header": "شوف الصفحات الممسوحة قريب فى [[Special:Log/delete|سجل المسح]].",
        "undelete-search-box": "دور فى الصفحات الممسوحة",
        "undelete-search-prefix": "عرض الصفحات اللى بتبتدى بـ:",
        "whatlinkshere": "ايه بيوصل هنا",
        "whatlinkshere-title": "الصفحات اللى بتوصل لـ \"$1\"",
        "whatlinkshere-page": "الصفحة:",
-       "linkshere": "الصفحات دى فيها وصله ل '''$2''':",
-       "nolinkshere": "مافيش صفحات بتوصل ل '''$2'''.",
-       "nolinkshere-ns": "مافيش صفحات بتوصل لـ '''$2''' فى النطاق اللى انت اختارته.",
+       "linkshere": "الصفحات دى فيها وصله ل<strong>$2</strong>:",
+       "nolinkshere": "مافيش صفحات بتوصل ل<strong>$2</strong>.",
+       "nolinkshere-ns": "مافيش صفحات بتوصل لـ<strong>$2</strong> فى النطاق اللى انت اختارته.",
        "isredirect": "صفحة تحويل",
        "istemplate": "متضمن",
        "isimage": "وصلة ملف",
        "ipb-unblock-addr": "رفع منع $1",
        "ipb-unblock": "رفع المنع عن يوزر أو عنوان أيبي",
        "ipb-blocklist": "عرض حالات المنع الموجودة دلوقتي",
-       "ipb-blocklist-contribs": "مساهمات $1",
+       "ipb-blocklist-contribs": "مساهمات {{GENDER:$1|$1}}",
        "block-expiry": "مدة المنع:",
        "unblockip": "رفع منع يوزر",
        "unblockiptext": "استخدم الاستمارة اللى تحت علشان ترجع حق الكتابة بتاعة عنوان أيبى أو يوزر اتسحب منه الحق دا قبل كدا.",
        "databasenotlocked": "قاعدة البيانات بتاعتك مش  مقفولة.",
        "move-page": "انقل $1",
        "move-page-legend": "انقل الصفحة",
-       "movepagetext": "لو استعملت النموذج ده ممكن تغير اسم الصفحه، و تنقل تاريخها للاسم الجديد.\nهاتبتدى تحويله من العنوان القديم للصفحه بالعنوان الجديد.\nلكن،  الوصلات فى الصفحات اللى بتتوصل بالصفحه دى مش ها تتغيير؛  اتأكد من ان مافيش  [[Special:BrokenRedirects|وصلات مقطوعه]] ، أو [[Special:DoubleRedirects|وصلات متتاليه]] ، للتأكد من أن المقالات تتصل مع بعضها بشكل مناسب.\n\nلاحظ ان الصفحه مش هاتتنقل لو كان فيه صفحه بالاسم الجديد، إلا إذا كانت صفحة فاضيه، أو صفحة تحويل، ومالهاش تاريخ. و ده معناه أنك مش ها تقدر تحط صفحه مكان صفحه، كمان ممكن ارجاع الصفحه لمكانها فى حال تم النقل بشكل غلط.\n\n'''تحذير!'''\nنقل الصفحه ممكن يكون له اثار كبيرة، وتغييرات مش متوقعه بالنسبة للصفحات المشهوره. من فضلك  اتأكد من فهم عواقب نقل الصفحات قبل ما تقوم بنقل الصفحه.",
+       "movepagetext": "لو استعملت النموذج ده ممكن تغير اسم الصفحه، و تنقل تاريخها للاسم الجديد.\nهاتبتدى تحويله من العنوان القديم للصفحه بالعنوان الجديد.\nلكن،  الوصلات فى الصفحات اللى بتتوصل بالصفحه دى مش ها تتغيير.\nاتأكد من ان مافيش [[Special:DoubleRedirects|وصلات متتاليه]] او [[Special:BrokenRedirects|وصلات مقطوعه]]، للتأكد من أن المقالات تتصل مع بعضها بشكل مناسب.\n\nلاحظ ان الصفحه <strong>مش</strong> هاتتنقل لو كان فيه صفحه بالاسم الجديد، إلا إذا كانت صفحة فاضيه، أو صفحة تحويل، ومالهاش تاريخ.\nو ده معناه أنك مش ها تقدر تحط صفحه مكان صفحه، كمان ممكن ارجاع الصفحه لمكانها فى حال تم النقل بشكل غلط.\n\n<strong>تحذير!</strong>\nنقل الصفحه ممكن يكون له اثار كبيرة، وتغييرات مش متوقعه بالنسبة للصفحات المشهوره.\nمن فضلك  اتأكد من فهم عواقب نقل الصفحات قبل ما تقوم بنقل الصفحه.",
        "movepagetalktext": "صفحة المناقشه بتاعة المقاله هاتتنقل برضه، لو كانت موجوده. لكن صفحة المناقشه '''مش''' هاتتنقل فى الحالات دى:\n* نقل الصفحة عبر نطاقات  مختلفه.\n*فيه  صفحة مناقشه موجوده تحت العنوان الجديد للمقاله.\n* لو انت شلت اختيار نقل صفحة المناقشه .\n\nوفى الحالات  دى، لو عايز  تنقل صفحة المناقشه  لازم تنقل أو تدمج محتوياتها  يدويا.",
-       "moveuserpage-warning": "'''خد بالك:''' انت ح تعمل نقل لصفحه بتاعة يوزر. لو سمحت تعمل حسابك ان الصفحه هى بس اللى ح تتنقل و اسم اليوزر''مش'' ح يتغير.",
+       "moveuserpage-warning": "<strong>خد بالك:</strong> انت ح تعمل نقل لصفحه بتاعة يوزر. لو سمحت تعمل حسابك ان الصفحه هى بس اللى ح تتنقل و اسم اليوزر <em>مش</em> ح يتغير.",
        "movenologintext": "لازم تكون يوزر متسجل و تعمل [[Special:UserLogin|دخول]] علشان تنقل الصفحة.",
        "movenotallowed": "ماعندكش الصلاحية لنقل الصفحات.",
        "movenotallowedfile": "معندكش اذن تنقل الملف ده.",
        "move-watch": "راقب الصفحه دى",
        "movepagebtn": "نقل الصفحه",
        "pagemovedsub": "تم  النقل بنجاح",
-       "movepage-moved": "'''\"$1\" خلاص اتنقلت لـ \"$2\"'''",
+       "movepage-moved": "<strong>\"$1\" خلاص اتنقلت لـ\"$2\"</strong>",
        "movepage-moved-redirect": "فى تحويله اتعملت.",
        "movepage-moved-noredirect": "التحويله ما اتعملتش.",
        "articleexists": "يا اما فيه صفحه  بالاسم ده، او ان الاسم اللى  تم اختياره مش صالح.\nلو سمحت اختار اسم تانى.",
        "imageinvalidfilename": "اسم الملف الهدف مش صحيح",
        "fix-double-redirects": "اعمل تحديث لاى تحويلات بتشاور على العنوان الاصلي",
        "move-leave-redirect": "سيب تحويله فى الصفحه",
-       "protectedpagemovewarning": "'''تحذير:''' الصفحه دى اتقفلت بطريقه تخلّى اليوزرات اللى عندهم صلاحيات اداريه هما بس اللى يقدرو ينقلوها.\nاخر سجل محطوط تحت علشان المراجعه:",
-       "semiprotectedpagemovewarning": "'''ملاحظه:''' الصفحه دى اتقفلت بطريقه تخلّى اليوزرات المتسجلين بس هما اللى يقدرو ينقلوها.\nاخر سجل محطوط تحت علشان المراجعه:",
+       "protectedpagemovewarning": "<strong>تحذير:</strong> الصفحه دى اتقفلت بطريقه تخلّى اليوزرات اللى عندهم صلاحيات اداريه هما بس اللى يقدرو ينقلوها.\nاخر سجل محطوط تحت علشان المراجعه:",
+       "semiprotectedpagemovewarning": "<strong>ملاحظه:</strong> الصفحه دى اتقفلت بطريقه تخلّى اليوزرات المتسجلين بس هما اللى يقدرو ينقلوها.\nاخر سجل محطوط تحت علشان المراجعه:",
        "move-over-sharedrepo": "==الملف موجود==\n[[:$1]] موجود فى مخزن مشترك.لو نقلت ملف للاسم دا ح يلغى الملف المشترك.",
        "file-exists-sharedrepo": "اسم الملف اللى اخترته موجود من قبل كده فى مخزن مشترك.\nلو سمحت تختار اسم تانى.",
        "export": "تصدير صفحات",
        "exporttext": "انت ممكن تصدر النص وتاريخ تعديلات صفحة معينة أو مجموعة صفحات فى صيغة إكس إم إل. لو قصدكو بكدا ممكن استيرادها فى ويكى تانى بيستعمل ميدياويكى عن طريق الصفحة [[Special:Import|صفحة الاستيراد]].\n\nعلشان تصدر الصفحات، اكتب العناوين فى الصندوق اللى تحت، عنوان واحد فى كل السطر، و اختار اذا كنت عايز  النسخة الحالية بالإضافة  للنسخ القديمة كاملة أو مع معلومات تاريخ الصفحة عنها ولا بس النسخة الحالية مع معلومات عن التعديل الأخير.\n\nفى الحالة التانية ممكن تستخدم لينك مباشرة، مثلا [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] للصفحة [[{{MediaWiki:Mainpage}}]].",
        "exportcuronly": "ضمن المراجعة دى بس، ومش التاريخ الكامل",
-       "exportnohistory": "----\nملاحظة:''' التصدير الكامل لتاريخ الصفحة  بالطريقة دى مش شغال بسبب الاداء'''",
+       "exportnohistory": "----\n<strong>ملاحظة:</strong> التصدير الكامل لتاريخ الصفحة  بالطريقة دى مش شغال بسبب الاداء.",
        "export-submit": "تصدير",
        "export-addcattext": "ضيف صفحات من تصنيف:",
        "export-addcat": "زيادة",
        "allmessagesdefault": "النص الاوتوماتيكي",
        "allmessagescurrent": "النص دلوقتى",
        "allmessagestext": "دى لستة برسايل النظام المتوفرة فى نطاق ميدياويكي.\nلو سمحت تزور[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation ترجمة ميدياويكي] و [https://translatewiki.net بيتاويكي] لو كنت عايز تساهم فى ترجمة ميدياويكى الاصلية.",
-       "allmessages-not-supported-database": "الصفحة دى مش يمكن حد يستعملها علشان'''$wgUseDatabaseMessages''' متعطل.",
+       "allmessages-not-supported-database": "الصفحة دى مش يمكن حد يستعملها علشان <strong>$wgUseDatabaseMessages</strong> متعطل.",
        "allmessages-filter-legend": "فيلتر",
        "allmessages-filter": "فلتره بحالة التهيئه:",
        "allmessages-filter-unmodified": "مش متعدل",
        "lastmodifiedatby": "آخر تعديل  للصفحة دى كان فى $2، $1 عن طريق $3.",
        "othercontribs": "بناء على عمل $1.",
        "others": "تانيين",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|يوزر|يوزرز}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|يوزر}}|يوزرز}} $1",
        "anonusers": "{{SITENAME}} مجهول {{PLURAL:$2|يوزر|يوزرات}} $1",
        "creditspage": "حقوق الصفحة",
        "nocredits": "مافيش معلومات حقوق متوفرة للصفحة دي.",
        "filedelete-archive-read-only": "مش ممكن تكتب على مجلد الأرشيف \"$1\" بالويب سيرفر",
        "previousdiff": "→ التعديل اللى قبل كده",
        "nextdiff": "التعديل اللى بعد كده ←",
-       "mediawarning": "'''تحذير''': الملف دا ممكن يكون فيه كود مضر.\nلو شغلته,الكومبيوتر بتاعك ممكن يخرب.",
+       "mediawarning": "<strong>تحذير:</strong> الملف دا ممكن يكون فيه كود مضر.\nلو شغلته, الكومبيوتر بتاعك ممكن يخرب.",
        "imagemaxsize": "حد حجم الصوره:<br />''(لصفحات الوصف بتاع الملفات)''",
        "thumbsize": "حجم العرض المتصغر:",
        "widthheightpage": "$1×$2، $3 {{PLURAL:$3|صفحة|صفحة}}",
        "file-info-gif-looped": "ملفوف",
        "file-info-gif-frames": "$1 {{PLURAL:$1|برواز|براويز}}",
        "newimages": "جاليرى الصور الجديده",
-       "imagelisttext": "دى لستة بـ$1 {{PLURAL:$1|ملف|ملفات}} مترتبة $2.",
+       "imagelisttext": "دى لستة بـ<strong>$1</strong> {{PLURAL:$1|ملف|ملفات}} مترتبة $2.",
        "newimages-summary": "الصفحةالمخصوصة دى بتعرض آخر الملفات المتحملة",
        "newimages-legend": "اسم الملف",
        "newimages-label": "اسم الملف (او حتة منه):",
        "scarytranscludedisabled": "[التضمين  فى الإنترويكى متعطل]",
        "scarytranscludefailed": "[التدوير على القالب فشل ل$1]",
        "scarytranscludetoolong": "[عنوان طويل جدا]",
-       "deletedwhileediting": "'''تحذير''':  الصفحة دى اتمسحت بعد ما بدأت أنت  فى تحريرها!",
-       "confirmrecreate": "اليوزر [[User:$1|$1]] ([[User talk:$1|مناقشة]]) مسح المقالة دى بعد ما انت بدأت فى تحريرها علشان:\n:''$2''\nلو سمحت تتأكد من أنك عايز تبتدى المقالة دى تاني.",
+       "deletedwhileediting": "<strong>تحذير:</strong> الصفحة دى اتمسحت بعد ما بدأت أنت  فى تحريرها!",
+       "confirmrecreate": "اليوزر [[User:$1|$1]] ([[User talk:$1|مناقشه]]) {{GENDER:$1|مسح}} المقالة دى بعد ما انت بدأت فى تحريرها علشان:\n: <em>$2</em>\nلو سمحت تتأكد من أنك عايز تبتدى المقالة دى تانى.",
        "recreate": "ابتدى تاني",
        "unit-pixel": "بيكس",
        "confirm_purge_button": "طيب",
        "hebrew-calendar-m11-gen": "آب",
        "hebrew-calendar-m12-gen": "أيلول",
        "timezone-utc": "يو تى سى",
-       "duplicate-defaultsort": "تحزير: زرار الترتيب الاوتوماتيكي\"$2\" بيوقف زرار الترتيب الاوتوماتيكي\"$1\" القديم.",
+       "duplicate-defaultsort": "<strong>تحزير:</strong> زرار الترتيب الاوتوماتيكي \"$2\" بيوقف زرار الترتيب الاوتوماتيكي \"$1\" القديم.",
        "version": "نسخة",
        "version-extensions": "الامتدادات المتثبتة",
        "version-specialpages": "صفحات مخصوصة",
        "fileduplicatesearch-result-1": "الملف \"$1\" ما لهو ش تكرار متطابق.",
        "fileduplicatesearch-result-n": "الملف \"$1\" فيه {{PLURAL:$2|1 تكرار متطابق|$2 تكرار متطابق}}.",
        "specialpages": "صفح مخصوصه",
-       "specialpages-note-restricted": "* صفحات خاصة عادية.\n* <strong class=\"mw-specialpagerestricted\">صفحات خاصة للناس اللى مسموح لهم.</strong>",
+       "specialpages-note-restricted": "* صفحات خاصة عادية.\n* <span class=\"mw-specialpagerestricted\">صفحات خاصة للناس اللى مسموح لهم.</span>",
        "specialpages-group-maintenance": "تقارير الصيانة",
        "specialpages-group-other": "صفحات خاصه تا نيه",
        "specialpages-group-login": "ادخل / سجل",
index 8888d82..db8b3ef 100644 (file)
        "returnto": "$1লৈ ঘূৰি যাওক ।",
        "tagline": "{{SITENAME}}ৰ পৰা",
        "help": "সহায়",
+       "help-mediawiki": "মিডিয়াৱিকিৰ বিষয়ে সহায়",
        "search": "সন্ধান কৰক",
        "searchbutton": "সন্ধান কৰক",
        "go": "যাওক",
        "ns-specialprotected": "বিশেষ পৃষ্ঠা সম্পাদিত কৰিব নোৱাৰি।",
        "titleprotected": "[[User:$1|$1]] সদস্যজনে এই শিৰোনাণমাৰ লিখনী লিখা ৰোধ কৰিছে ।\nইয়াৰ কাৰণ হৈছে <em>$2</em> ।",
        "filereadonlyerror": "\"$1\" ফাইলটোক পৰিৱৰ্তন কৰিব পৰা নগ'ল কাৰণ ফাইল ভঁৰাল \"$2\" কেৱল পঢ়িব পৰা অৱস্থাত আছে।\nযিজন ছীষ্টেম প্ৰশাসকে এইটো বন্ধ কৰিছে তেওঁ দৰ্শোৱা কাৰণ হৈছে: ''$3''।",
+       "invalidtitle": "অবৈধ শীৰ্ষক",
        "invalidtitle-knownnamespace": "নামস্থান \"$2\" আৰু পাঠ্য \"$3\" থকা অবৈধ শিৰোনাম",
        "invalidtitle-unknownnamespace": "অজ্ঞাত নামস্থান সংখ্যা $1 আৰু পাঠ্য \"$2\" থকা অবৈধ শিৰোনাম",
        "exception-nologin": "প্ৰৱেশ কৰা নাই",
        "virus-scanfailed": "স্কেন অসফল (কোড $1)",
        "virus-unknownscanner": "অজ্ঞাত এন্টিভাইৰাচ:",
        "logouttext": "'''আপুনি প্ৰস্থান কৰিলে।'''\n\nমন কৰিব যে যেতিয়ালৈকে আপোনাৰ ব্ৰাউজাৰৰ অস্থায়ী-স্মৃতি (cache) খালী নকৰে, তেতিয়ালৈকে কিছুমান পৃষ্ঠাত আপুনি প্ৰৱেশ কৰা বুলি দেখুৱাই থাকিব পাৰে।",
+       "logout-failed": "এতিয়া প্ৰস্থান কৰিব নোৱাৰি: $1",
        "cannotlogoutnow-title": "এতিয়া প্ৰস্থান কৰিব নোৱাৰি",
        "cannotlogoutnow-text": "$1 ব্যৱহাৰ কৰাৰ সময়ত প্ৰস্থান কৰিব নোৱাৰি।",
        "welcomeuser": "আদৰিছোঁ, $1!",
        "resetpass_submit": "গুপ্তশব্দ বহুৱাওক আৰু প্ৰৱেশ কৰক",
        "changepassword-success": "আপোনাৰ গুপ্তশব্দ সফলতাৰে সলনি কৰা হৈছে!",
        "changepassword-throttled": "আপুনি স‍ম্প্ৰতি অজস্ৰবাৰ লগ্‌-ইনৰ প্ৰয়াস কৰিছে।\nঅনুগ্ৰহ কৰি $1 সময়ৰ পিছত আকৌ চেষ্টা কৰক।",
+       "botpasswords": "বট গুপ্তশব্দ",
        "botpasswords-disabled": "Bot গুপ্তশব্দ নিষ্ক্ৰিয়",
+       "botpasswords-label-appid": "বটৰ নাম:",
        "botpasswords-label-create": "সৃষ্টি কৰক",
        "botpasswords-label-update": "আপডেট কৰক",
        "botpasswords-label-cancel": "বাতিল কৰক",
        "passwordreset-emailtext-user": "{{SITENAME}}ত $1 ব্যৱহাৰকাৰীয়ে {{SITENAME}} ($4)ৰ বাবে আপোনাৰ গুপ্তশব্দ ন-কৈ বহুৱাবলৈ অনুৰোধ জনাইছিল। ই-পত্ৰ ঠিকনাটোৰ লগত এই সদস্যৰ {{PLURAL:$3|একাউণ্ট|একাউণ্টসমূহ}} জড়িত হৈ আছে।\n \n$2\n \n{{PLURAL:$3|এই অস্থায়ী গুপ্তশব্দ|এই অস্থায়ী গুপ্তশব্দবোৰ}} {{PLURAL:$5|এদিনত|$5 দিনত }} নাইকীয়া হ’ব । আপুনি লগ-ইন কৰি এটা নতুন গুপ্তশব্দ দিয়া উচিত। যদি আন কোনোবাই এই অনুৰোধ কৰিছিল, বা আপুনি নিজৰ পূৰ্বৰ গুপ্তশব্দ মনত পেলাইছে আৰু ইয়াক সলাব খোজা নাই, তেন্তে আপুনি এই বাৰ্তাক অগ্ৰাহ্য কৰি নিজৰ পূৰ্বৰ গুপ্তশব্দ ব্যৱহাৰ কৰি থাকিব পাৰে।",
        "passwordreset-emailelement": "সদস্যনাম: \n$1\n\nঅস্থায়ী গুপ্তশব্দ: \n$2",
        "passwordreset-emailsentemail": "এইটো আপোনাৰ একাউণ্টৰ পঞ্জীকৃত ই-মেইল ঠিকনা হয়নে, হয় যদি এটা গুপ্তশব্দ উদ্ধাৰ ই-মেইল পঠিওৱা হ'ব।",
+       "passwordreset-invalidemail": "অগ্ৰহণযোগ্য ইমেইল ঠিকনা",
        "changeemail": "ই-মেইল ঠিকনা সলনি নাইবা বিলোপ কৰক",
        "changeemail-header": "একাউণ্টৰ ই-মেইল ঠিকনা সলনি কৰক",
        "changeemail-no-info": "এই পৃষ্ঠাটোত প্ৰৱেশাধিকাৰ পাবলৈ আপুনি লগ্‌ ইন কৰিব লাগিব।",
        "editwarning-warning": "এই পৃষ্ঠাটো এৰিলে আপুনি কৰা পৰিৱতনসমূহ হেৰাই যাব পাৰে।\nযদি আপুনি লগ্‌ ইন কৰি আছে, আপুনি এই সতৰ্কবাণীক আপোনাৰ পছন্দসমূহৰ \"{{int:prefs-editing}}\" অংশত নিষ্ক্ৰিয় কৰিব পাৰিব।",
        "editpage-notsupportedcontentformat-title": "সমলৰ ফৰ্মেট সমৰ্থিত নহয়।",
        "editpage-notsupportedcontentformat-text": "সমল মডেল $2ৱে সমল ফৰ্মেট $1 সমৰ্থন নকৰে।",
+       "slot-name-main": "মুখ্য",
        "content-model-wikitext": "ৱিকিপাঠ্য",
        "content-model-text": "সাধাৰণ পাঠ্য",
        "content-model-javascript": "জাভাস্ক্ৰিপ্ট",
        "nocredits": "এই পৃষ্ঠাৰ বাবে কোনো কৃতিত্ব তথ্য উপলব্ধ নাই।",
        "spamprotectiontitle": "স্পাম প্ৰতিৰক্ষা ছেকনী",
        "spamprotectiontext": "আপুনি সাঁচিব বিচৰা পাঠখিনিক স্পাম ছেকনীৰ দ্বাৰা বাধা প্ৰদান কৰা হৈছে ।\nসম্ভৱতঃ কোনো ব্লেকলিষ্টেড হোৱা বাহ্যিক সংযোগৰ কাৰণে এনে ঘটিছে ।",
-       "spamprotectionmatch": "নিমà§\8dনলিà¦\96িত à¦²à¦¿à¦\96নà§\80ৰ বাবে আমাৰ স্পাম পৰিস্ৰাৱক আৰম্ভ হৈছে: $1",
+       "spamprotectionmatch": "নিমà§\8dনলিà¦\96িত à¦ªà¦¾à¦ à§\8dযৰ বাবে আমাৰ স্পাম পৰিস্ৰাৱক আৰম্ভ হৈছে: $1",
        "spambot_username": "মিডিয়াৱিকি স্পাম পৰিষ্কাৰ কাৰ্য",
        "spam_reverting": "$1লৈ সংযোগ নথকা সৰ্বশেষ পুনৰীক্ষনলে উভতাই নিয়া হৈছে",
        "spam_blanking": "সকলো পুনৰীক্ষনৰ $1লৈ সংযোগ আছিল, ৰিক্ত কৰা হৈছে",
index e8af15e..789362e 100644 (file)
        "virus-scanfailed": "fallu d'escanéu (códigu $1)",
        "virus-unknownscanner": "antivirus desconocíu:",
        "logouttext": "'''Zarró la sesión.'''\n\nTenga en cuenta que dalgunes páxines puen siguir apaeciendo como si inda tuviera la sesión aniciada, mentanto nun llimpie la caché del navegador.",
+       "logging-out-notify": "Espera, ta zarrándose la sesión.",
+       "logout-failed": "Nun pué zarrase la sesión agora: $1",
        "cannotlogoutnow-title": "Nun puede zarrase sesión agora",
        "cannotlogoutnow-text": "Nun puede zarrase sesión cuando s'usa $1.",
        "welcomeuser": "¡Bienllegáu, $1!",
        "edit-gone-missing": "Nun pudo actualizase la páxina.\nPaez que se desanició.",
        "edit-conflict": "Conflictu d'edición.",
        "edit-no-change": "S'inoró la to edición, porque nun se fizo nengún cambéu nel testu.",
+       "edit-slots-cannot-add": "{{PLURAL:$1|El siguiente slot nun tien|Los siguientes slots nun tienen}} encontu equí: $2.",
+       "edit-slots-cannot-remove": "{{PLURAL:$1|Ríquese'l siguiente slot y nun puede|Ríquense los siguientes slots y nun pueden}} desaniciase: $2.",
+       "edit-slots-missing": "{{PLURAL:$1|Falta'l siguiente slot|Falten los siguientes slots}}: $2.",
        "postedit-confirmation-created": "Creóse la páxina.",
        "postedit-confirmation-restored": "Restauróse la páxina.",
        "postedit-confirmation-saved": "Guardóse la edición.",
        "move": "Treslladar",
        "movethispage": "Treslladar esta páxina",
        "unusedimagestext": "Los ficheros darréu esisten pero nun tan inxertaos en páxina dala.\nDate cuenta de qu'otros sitios web puen enllazar a un ficheru con una URL direuta, polo que seique tean tovía llistaos equí, magar que tean n'usu activu.",
+       "unusedimagestext-categorizedimgisused": "Esisten los siguientes ficheros, pero nun tán integraos en nenguna páxina. Les imaxes categorizaes considérense utilizaes, anque nun tean integraes en nenguna páxina.\nTen en cuenta qu'otros sitios web puen enllazar con un ficheru con una URL direuta, de mou que puen tar nesta llista anque tean n'usu activu.",
        "unusedcategoriestext": "Les siguientes páxines de categoría esisten, anque nengún artículu o categoría fai usu d'elles.",
        "notargettitle": "Nun hai destín",
        "notargettext": "Nun especificasti qué páxina o usuariu ye'l destín pa executar esta aición.",
        "ipb_expiry_old": "La fecha de caducidá ta pasada.",
        "ipb_expiry_temp": "Los bloqueos a nomes d'usuariu tapecíos tienen de ser permanentes.",
        "ipb_hide_invalid": "Nun se pue desaniciar esta cuenta; tien más {{PLURAL:$1|d'una edición|de $1 ediciones}}.",
+       "ipb_hide_partial": "Los bloqueos col nome d'usuariu tapecíu nun pueden ser parciales.",
        "ipb_already_blocked": "\"$1\" yá ta bloquiáu",
        "ipb-needreblock": "$1 yá ta bloquiáu. ¿Quies camudar los parámetros?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Otru bloquéu|Otros bloqueos}}",
        "movepage-moved": "<strong>«$1» treslladóse a «$2»</strong>",
        "movepage-moved-redirect": "Creóse una redireición.",
        "movepage-moved-noredirect": "Desaniciose la creación d'una redireición.",
+       "movepage-delete-first": "La páxina de destín tien demasiaes revisiones a desaniciar como parte d'un treslláu de páxina. Primero desanicia la páxina de forma manual y de siguío téntalo nuevamente.",
        "articleexists": "Yá hai una páxina con esi nome, o'l nome qu'escoyisti nun ye válidu. Por favor, escueyi otru nome.",
        "cantmove-titleprotected": "Nun puedes treslladar una páxina a esti llugar porque ta protexida la creación del títulu nuevu.",
        "movetalk": "Mover la páxina d'alderique asociada",
        "print.css": "/* Los CSS allugaos equí afeutarán a la salida pola imprentadora */",
        "noscript.css": "/* Los CSS allugaos equí afeutarán a los usuarios col JavaScript desactiváu */",
        "group-autoconfirmed.css": "/* Los CSS allugaos equí afeutarán a los usuarios autoconfirmaos namái */",
+       "group-user.css": "/* Los CSS allugaos equí afeutarán a los usuarios rexistraos namái */",
        "group-bot.css": "/* Los CSS allugaos equí afeutarán a los bots namái */",
        "group-sysop.css": "/* Los CSS allugaos equí afeutarán a los sysops namái */",
        "group-bureaucrat.css": "/* Los CSS allugaos equí afeutarán a los burócrates namái */",
        "common.json": "/* Cualquier JavaScript que tea equí cargaráse pa tolos usuarios en cada carga de páxina. */",
        "common.js": "/* Cualesquier JavaScript que tea equí se cargará pa tolos usuarios en cada carga de páxina. */",
        "group-autoconfirmed.js": "/* Cualesquier JavaScript que tea equí se cargará pa los usuarios autoconfirmaos namái */",
+       "group-user.js": "/* Cualesquier JavaScript que tea equí cargaráse pa los usuarios rexistraos namái */",
        "group-bot.js": "/* Cualesquier JavaScript que tea equí se cargará pa los bots namái */",
        "group-sysop.js": "/* Cualesquier JavaScript que tea equí se cargará pa los sysops namái */",
        "group-bureaucrat.js": "/* Cualesquier JavaScript que tea equí se cargará pa los burócrates namái */",
        "mcrundofailed": "Falló desfacer",
        "mcrundo-missingparam": "Faltan parámetros riquíos na solicitú.",
        "mcrundo-changed": "La páxina cambió desque visti les diferencies. Revisa'l cambiu nuevu.",
+       "mcrundo-parse-failed": "Nun pudo analizase la nueva revisión: $1",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← páxina anterior",
        "imgmultipagenext": "páxina siguiente →",
        "specialpages-group-developer": "Ferramientes pa desendolcadores",
        "blankpage": "Páxina en blanco",
        "intentionallyblankpage": "Esta páxina ta en blanco arrémente",
+       "disabledspecialpage-disabled": "Un alministrador del sistema desanició esta páxina.",
        "external_image_whitelist": "#Dexa esta llinia exautamente como ta<pre>\n#Pon los fragmentos d'espresiones regulares (namái la parte que va ente les //) debaxo\n#Esto va ser comprobao coles URLs d'imáxenes esternes (hotlinked)\n#Les que concuayen se van amosar como imáxenes; si nun concuayen, namái se va amosar un enllaz a la imaxe\n#Les llinies qu'emprimen con # se traten como comentarios\n#Esto nun ye sensible a la capitalización\n\n#Pon tolos fragmentos regex enantes d'esta llinia. Dexa esta llinia exautamente como ta</pre>",
        "tags": "Etiquetes de cambiu válides",
        "tag-filter": "Filtru d'[[Special:Tags|etiquetes]]:",
        "logentry-partialblock-block-ns": "{{PLURAL:$1|l'espaciu de nomes|los espacios de nomes}} $2",
        "logentry-partialblock-block": "$1 {{GENDER:$2|bloquió}} a {{GENDER:$4|$3}} la edición de $7 con un tiempu de caducidá de $5 $6",
        "logentry-partialblock-reblock": "$1 {{GENDER:$2|cambió}} la configuracion del bloquéu a {{GENDER:$4|$3}} pa torgar editar $7 con un tiempu de caducidá de $5 $6",
+       "logentry-non-editing-block-block": "$1 {{GENDER:$2|bloquió}} a {{GENDER:$4|$3}} d'aiciones específiques nun rellacionaes cola edición, con un tiempu de caducidá de $5 $6",
+       "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|cambió}} la configuración del bloquéu a {{GENDER:$4|$3}} d'aiciones específiques nun rellacionaes cola edición, con un tiempu de caducidá de $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|bloquió}} a {{GENDER:$4|$3}} con un tiempu de caducidá de $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|cambió}} la configuracion del bloquéu a {{GENDER:$4|$3}} con un tiempu de caducidá de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importó}} $3 xubiendo un ficheru",
        "mw-widgets-abandonedit-discard": "Descartar ediciones",
        "mw-widgets-abandonedit-keep": "Siguir editando",
        "mw-widgets-abandonedit-title": "¿Tas seguru?",
+       "mw-widgets-copytextlayout-copy": "Copiar",
+       "mw-widgets-copytextlayout-copy-fail": "Falló la copia al cartafueyu.",
+       "mw-widgets-copytextlayout-copy-success": "Copiao al cartafueyu.",
        "mw-widgets-dateinput-no-date": "Nenguna data seleicionada",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "passwordpolicies-policyflag-forcechange": "tien de camudase al aniciar sesión",
        "passwordpolicies-policyflag-suggestchangeonlogin": "suxerir cambiu al aniciar sesión",
        "easydeflate-invaliddeflate": "El conteníu dau nun ta comprimíu correutamente",
+       "unprotected-js": "Por razones de seguridá, JavaScript nun puede cargase dende páxines ensin protexer. Crea javascript sólo nel espaciu de nomes MediaWiki: o como subpáxina d'usuariu",
+       "userlogout-continue": "Si desees zarrar la sesión [$1 sigui na páxina de finar sesión].",
        "userlogout-sessionerror": "Falló salir por un error de sesión. [$1 Tenta nuevamente]."
 }
index 031f284..91d0395 100644 (file)
        "period-am": "AM",
        "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategori}}",
-       "category_header": "lembar ring golongan \"$1\"",
-       "subcategories": "sub golongan",
+       "category_header": "Kaca ring ketegori \"$1\"",
+       "subcategories": "Subkategori",
        "category-media-header": "lembar ring golongan \"$1\"",
        "category-empty": "\"mangkin, nenten madaging lembar utawi pekakas ring golongan puniki\"",
        "hidden-categories": "{{plural:$1|punduhan sane kaengkebang| punduhan sane kaengkebang}}",
        "category-subcat-count": "{{PLURAL:$2| golongan puniki madue {{PLURAL:$1|$1 subkategori}} puniki, saking genepan $2.}}",
        "category-article-count": "{{PLURAL:$2|golongan puniki madue{{PLURAL:$1|$1 lembar}}, saking total $2.}}",
        "category-file-count": "{{PLURAL:$2|golongan puniki madue{{PLURAL:$1|$1 lembar}}, saking total $2.}}",
-       "listingcontinuesabbrev": "samb.",
+       "listingcontinuesabbrev": "lant.",
        "noindex-category": "Lembar sane nenten maindeks",
        "broken-file-category": "Suratan sane ngelah pranala usak",
        "about": "Indik",
        "moredotdotdot": "Lianan...",
        "mypage": "Kaca",
        "mytalk": "Pabligbagan",
-       "anontalk": "Wicara",
+       "anontalk": "Pabligbagan",
        "navigation": "Navigasi",
        "and": "&#32;miwah",
        "faq": "FAQ (pitaken sane jagi katakonang)",
        "namespaces": "Genah peséngan",
        "variants": "Varian",
        "navigation-heading": "Menu navigasi",
-       "errorpagetitle": "kaluputan",
+       "errorpagetitle": "Kaiwangan",
        "returnto": "mabalik ring $1",
        "tagline": "Saking {{SITENAME}}",
        "help": "Wantuan",
        "search": "Rereh",
        "searchbutton": "Rereh",
        "searcharticle": "Rereh",
-       "history": "sejarah pupulan",
-       "history_short": "kawentenan sane lawas",
+       "history": "Babad kaca",
+       "history_short": "Babad",
        "history_small": "babad",
-       "printableversion": "Vérsi citak",
+       "printableversion": "Vérsi cétak",
        "permalink": "Pranala ajeg",
        "print": "Citak",
        "view": "Cingak",
        "view-foreign": "Cingak ring $1",
        "edit": "Uah",
        "create": "Karyanin",
-       "delete": "Apus",
-       "protect": "Nyaga",
-       "protect_change": "gentos",
-       "newpage": "Lembar Anyar",
+       "delete": "Usap",
+       "viewdeleted_short": "Cingak {{PLURAL:$1|siki uahan sané kausapin|$1 uahan sané kausapin}}",
+       "protect": "Saib",
+       "protect_change": "uah",
+       "unprotect": "Uah saiban",
+       "newpage": "Kaca anyar",
        "talkpagelinktext": "pabligbagan",
-       "specialpage": "Lembar sane kautamayang",
+       "specialpage": "Kaca kusus",
        "personaltools": "Pekakas praragan",
        "talk": "Pabligbagan",
        "views": "Pakantenan",
        "toolbox": "Pekakas",
        "imagepage": "Cingak kaca berkas",
-       "templatepage": "Cingak kaca citakan",
-       "viewhelppage": "cingak lembar pamitutlung",
+       "templatepage": "Cingak kaca cétakan",
+       "viewhelppage": "Cingak kaca wantuan",
        "categorypage": "Cingak kaca kategori",
-       "otherlanguages": "Basa tiosan",
-       "redirectedfrom": "(kaalihang saking $1)",
+       "viewtalkpage": "Cingak pabligbagan",
+       "otherlanguages": "Ring basa lianan",
+       "redirectedfrom": "(Kagingsirang saking $1)",
+       "redirectpagesub": "Kaca gingsiran",
+       "redirectto": "Magingsir ring:",
        "lastmodifiedat": "Kaca puniki kaping untat kaubah rikala  $2, $1",
+       "protectedpage": "Kaca sané kasaibin",
        "jumpto": "Lanturang ka:",
        "jumptonavigation": "navigasi",
        "jumptosearch": "rereh",
        "currentevents-url": "Project:kawentenane mangkin",
        "disclaimers": "Tulak",
        "disclaimerpage": "Project:Tulak lumrah",
-       "edithelp": "Wantuan indik nguwah",
-       "helppage-top-gethelp": "Tulung",
+       "edithelp": "Wantuan indik nguah",
+       "helppage-top-gethelp": "Wantuan",
        "mainpage": "Kaca Utama",
        "mainpage-description": "Kaca utama",
        "portal": "Kori sekaa",
        "privacypage": "Project:Awig-awig indik data praragan",
        "ok": "OK",
        "retrievedfrom": "Kapolihang saking \"$1\"",
-       "youhavenewmessages": "{{PLURAL:$3|ida dane maduwe}} $1 ($2)",
+       "youhavenewmessages": "{{PLURAL:$3|Jero madué}} $1 ($2)",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|You have}} $1 ring {{PLURAL:$3|another user|$3 users}} ($2).",
-       "youhavenewmessagesmanyusers": "Ida dane ngelah $1 saking liyane ($2).",
+       "youhavenewmessagesmanyusers": "Jero madué $1 saking akéh sang anganggé ($2).",
        "editsection": "uah",
        "editold": "uah",
        "viewsourceold": "cingak wit",
        "showtoc": "edengang",
        "hidetoc": "engkebang",
        "collapsible-expand": "buka",
-       "confirmable-confirm": "{{GENDER:$1|Ida}} dane yakin?",
+       "confirmable-confirm": "{{GENDER:$1|Jero}} yakin?",
        "confirmable-yes": "Inggih",
        "confirmable-no": "Nénten",
+       "viewdeleted": "Cingak $1?",
+       "restorelink": "{{PLURAL:$1|siki uahan sané kausapin|$1 uahan sané kausapin}}",
        "site-atom-feed": "$1 \"atom feed\"",
        "page-atom-feed": "$1 \"atom feed\"",
        "red-link-title": "$1 (kaca nénten wénten)",
        "nstab-main": "Kaca",
-       "nstab-user": "sane nganggo",
-       "nstab-special": "lembar sane kautamayang",
-       "nstab-project": "lembar proyek",
-       "nstab-image": "pupulan",
-       "nstab-template": "templat",
-       "nstab-help": "lembar pamitutlung",
-       "nstab-category": "golongan",
+       "nstab-user": "Kaca sang anganggé",
+       "nstab-special": "Kaca kusus",
+       "nstab-project": "Kaca proyék",
+       "nstab-image": "Berkas",
+       "nstab-template": "Cétakan",
+       "nstab-help": "Kaca wantuan",
+       "nstab-category": "Kategori",
        "mainpage-nstab": "Kaca utama",
-       "nosuchspecialpage": "Ten wenten lembar spesial",
-       "error": "kaluputan",
+       "nosuchspecialpage": "Nénten wénten kaca kusus sakadi punika",
+       "error": "Kaiwangan",
        "databaseerror": "Database kaluputan",
        "missing-article": "data utama nenten prasida nemu tulisan saking lembar sane sepatutne wenten, inggih punika  $1, $2\n\nindike puniki biasane keranayang olih pranala kaon nuju pabenahan sane dumun lembar sane sampun kaicalang\n\nyening nenten puniki sane ngranayang, ida dane minab sampun manggihin kaiwangang ring sajeroning piranti lunak.\nDurus sadokang indik puniki rin silih sinunggil anak \n\n[[Special:ListUsers/sysop|Pengurus]], antuk ngetik alamat URL sane katuju",
        "missingarticle-rev": "(pabenahan#:$1)",
        "badtitletext": "Judul halaman sane katagih nenten patut, kosong, atau judul antarbahasa atau antarwiki yang salah sambung.\n\nmurda lembar sane kaarsa nenten sida kaedengang, kosong, utawi murda murda antarbasa utawi antarwiki sane iwang",
        "viewsource": "Cingak wit",
        "viewsource-title": "Cingak wit saking $1",
-       "viewsourcetext": "Ida dane dados nyingakin miwah nurun wit kaca puniki.",
-       "yourname": "pesengan penganggen",
-       "userlogin-yourname": "Penganggen",
-       "userlogin-yourname-ph": "Isi Kruna sandi ida dane",
-       "yourpassword": "kruna sandi",
+       "viewsourcetext": "Jero dados nyingakin miwah nurun wit kaca puniki.",
+       "yourname": "Peséngan sang anganggé:",
+       "userlogin-yourname": "Peséngan sang anganggé",
+       "userlogin-yourname-ph": "Dagingin peséngan sang anganggé jero",
+       "yourpassword": "Kruna sandi:",
        "userlogin-yourpassword": "Kruna sandi",
+       "userlogin-yourpassword-ph": "Dagingin kruna sandi jero",
+       "createacct-yourpassword-ph": "Dagingin kruna sandi",
        "yourpasswordagain": "jumunin kruna sandi",
-       "login": "Ngranjing log",
-       "nav-login-createaccount": "malebu log / ngawe pepalihan",
-       "logout": "Medal Log",
-       "userlogout": "medal saking Log",
-       "notloggedin": "Konden masuk log",
-       "userlogin-noaccount": "Durung madue akun?",
-       "userlogin-joinproject": "Indik {{SITENAME}}",
+       "createacct-yourpasswordagain-ph": "Dagingin malih kruna sandi",
+       "cannotlogin-title": "Nénten prasida manjing log",
+       "cannotloginnow-title": "Mangkin nénten prasida manjing log",
+       "login": "Manjing log",
+       "nav-login-createaccount": "Manjing log / karyanin akun",
+       "logout": "Medal log",
+       "userlogout": "Medal log",
+       "notloggedin": "Durung manjing log",
+       "userlogin-noaccount": "Durung madué akun?",
+       "userlogin-joinproject": "Nyarengin {{SITENAME}}",
        "createaccount": "Karyanin akun",
-       "userlogin-helplink2": "Wantuan indik ngranjing log",
-       "createacct-submit": "Karyanin akun ida dané",
+       "userlogin-helplink2": "Wantuan indik manjing log",
+       "createacct-email-ph": "Dagingin alamat email jero",
+       "createacct-submit": "Karyanin akun jero",
+       "createacct-benefit-heading": "{{SITENAME}} kakaryanin olih anak sakadi jero.",
        "createacct-benefit-body1": "{{PLURAL:$1|uahan}}",
        "createacct-benefit-body2": "{{PLURAL:$1|kaca}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|sang anuut}} anyar",
        "mailmypassword": "nyumu ngaryanin kruna sandi",
        "loginlanguagelabel": "Basa: $1",
-       "pt-login": "Ngranjing log",
-       "pt-login-button": "Ngranjing log",
+       "pt-login": "Manjing log",
+       "pt-login-button": "Manjing log",
        "pt-createaccount": "Karyanin akun",
        "pt-userlogout": "Medal log",
        "botpasswords-label-create": "Ngae",
        "botpasswords-label-cancel": "Buungan",
-       "botpasswords-label-delete": "Apus",
+       "botpasswords-label-delete": "Usap",
        "botpasswords-label-resetpassword": "Nyumu kruna sandi",
        "passwordreset": "Nyumu kruna sandi",
        "bold_sample": "teks puniki mesurat tebel",
        "media_tip": "pranala pupulan-pupulan",
        "sig_tip": "tanda tangan ida dane sareng tanda waktu",
        "hr_tip": "garis horizontal",
-       "summary": "pamicutet",
+       "summary": "Ringkesan:",
        "minoredit": "Puniki uahan alit",
        "watchthis": "tinjo lembar puniki",
-       "savearticle": "simpen lembar",
+       "savearticle": "Raksa kaca",
        "publishpage": "Terbitang kaca",
+       "savearticle-start": "Raksa kaca...",
        "publishpage-start": "Terbitang kaca…",
        "preview": "tayangan sadurungnyane",
        "showpreview": "cingak sane lintang",
        "showdiff": "Cingak uahan",
        "anoneditwarning": "<strong>Pingetan:</strong> Ida dané nénten kacatet ngranjing. Alamat IP ida dané jagi kacatet ring sejarah (indik sané dumunan) ring lembar puniki. Yening ida dane <strong>[$1 log in]</strong> utawi <strong>[$2 create an account]</strong>, your edits will be attributed to your username, along with other benefits.",
-       "loginreqlink": "ngranjing log",
+       "loginreqlink": "manjing log",
        "newarticle": "(Anyar)",
        "newarticletext": "ida dane ngiring pranala nuju lembar sane durung wenten. yening jagi ngaryanang lembar punika, ketik daging lembar ring kotak sane wenten ring beten puniki. (cingak [$1 lembar wantuan] anggen wacana salanturnyane). yening ida dane nenten nyelapang neked ring lembar puniki, klik tombol \"back\" ring \"penjelajah web\" ida dane.",
        "noarticletext": "mangkin nenten wenten teks ring lembar puniki. ida dane prasida [[Special:Search/{{PAGENAME}}|ngrereh murda nganggen lembar puniki]] ring lembar-lembar sane lianan, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ngrereh log sane mapaiketan], utawi [{{fullurl:{{FULLPAGENAME}}|action=edit}} nguwah lembar puniki]</span>.",
        "noarticletext-nopermission": "mangkin nenten wenten teks ring lembar puniki. ida dane prasida [[Special:Search/{{PAGENAME}}|ngarereh murda anggen lembar puniki]] ring lembar-lembar sane lianan, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ngarereh log sane mapaiketan], utawi [{{fullurl:{{FULLPAGENAME}}|action=edit}} ngubah lembar puniki]</span>.",
+       "userpage-userdoesnotexist-view": "Akun sang anganggé \"$1\" nénten madaptar.",
        "previewnote": "\"elingang yening puniki wantah sane lintang.\" Panguwahan ida dane durung kasimpen!",
-       "editing": "Nguwahin $1",
+       "editing": "Nguahin $1",
        "creating": "Makarya $1",
-       "editingsection": "nguwah $1 (bagian)",
-       "templatesused": "{{PLURAL:$1|Templat}} sane kaanggen ring lembar niki:",
-       "template-protected": "nyayubang",
-       "template-semiprotected": "(semi-penyaga)",
+       "editingsection": "Nguahin $1 (pahan)",
+       "editingcomment": "Nguahin $1 (pahan anyar)",
+       "templatesused": "{{PLURAL:$1|Citakan}} sané kaanggén ring kaca puniki:",
+       "template-protected": "(kasaibin)",
+       "template-semiprotected": "(semi-kasaibin)",
        "hiddencategories": "lembar niki inggih punika krama saking {{PLURAL:$1|1 golongan sane mengkeb|$1 golongan sane mengkeb}}",
        "permissionserrorstext-withaction": "ida dané nénten madué kuasa ngranjing anggén $2, riantukan {{PLURAL:$1|alasan}} ring sor puniki:",
        "recreate-moveddeleted-warn": "\"pingetan\" ida dane ngawe malih lembar sane naenin maapus.'''\n\nmangda kayunin malih napike pantes lanturang suntingan ida dane. puniki log pengapusan lan pangisidan saking lembar puniki:",
-       "moveddeleted-notice": "Lembar puniki sampun kaapus.\nAnggen pewarah, proteksi, lan pengisidan log saking lembar puniki cingakin pustaka beten.",
+       "moveddeleted-notice": "Kaca puniki sampun kausapin.\nAnggen pewarah, proteksi, lan pengisidan log saking lembar puniki cingakin pustaka beten.",
        "postedit-confirmation-created": "Kacanyané sampun kakaryanin.",
-       "content-model-wikitext": "tulisan wiki",
+       "postedit-confirmation-saved": "Uahan jero sampun maraksa.",
+       "content-model-wikitext": "sesuratan wiki",
        "post-expand-template-inclusion-warning": "pinget: ukuran templat sane keanggen kalangkung ageng. wenten templat sane kacampahang",
        "post-expand-template-inclusion-category": "lembar sane maukuran templat sane nglangkungin wates",
        "post-expand-template-argument-warning": "\"peminget\" lembar puniki madaging kiranglangkungnyane siki argumen templat anggen ukuran ekspansi sane kaliwat ageng. argumen-argumen punika sampun kacampahang.",
        "post-expand-template-argument-category": "lembar sane medaging argumen templat sane kacampahang",
        "viewpagelogs": "Cingak log saking kaca puniki",
        "currentrev-asof": "pabecikan sane anyar ring pinanggal$1",
-       "revisionasof": "ngabecikang per $1",
+       "revisionasof": "Uahan ri tatkala $1",
        "revision-info": "Panguwahan per $1 olih {{GENDER:$6|$2}}$7",
-       "previousrevision": "← pabenahan sane dumun",
+       "previousrevision": "← Uahan sadurungnyané",
        "nextrevision": "Uahan salanturnyané →",
        "currentrevisionlink": "Uahan sané mangkin",
-       "cur": "mangkin",
-       "last": "sadurung",
+       "cur": "mgkn",
+       "last": "sdrg",
        "histlegend": "pilih kalih tombol radio lantur pecik tombol \"bandingang\" anggen ngebandingang indik lianan. klik siki tanggal anggen nyingak indik lianan lembar ring pinanggal punika.<br />(skr)= binanne saking indik lianan sane mangkin, (untat) = binanne saking indik lianan sane dumunan, '''k''' = panguwahan alit, '''b''' = panguwahan bot, → = panguwahan kepahan, ← = reringkesan otomatis",
        "history-fieldset-title": "Nyaringin révisi",
        "history-show-deleted": "wantah sane kaapus",
        "histfirst": "pinih suwe",
        "histlast": "pinih anyar",
+       "history-feed-title": "Babad uahan",
+       "history-feed-description": "Babad uahan kaca puniki ring wiki",
        "history-feed-item-nocomment": "$1 ring $2",
        "rev-delundel": "gentos pangatonan",
+       "revdelete-hide-comment": "Uah ringkesan",
        "revdel-restore": "gentos pangatonan",
        "pagehist": "Babad kaca",
+       "deletedhist": "Babad sané kausapin",
        "mergehistory-from": "Kaca wit:",
        "revertmerge": "tansida nyarengin",
-       "history-title": "sajer panguwahan saking $1",
+       "history-title": "Babad uahan saking \"$1\"",
        "lineno": "Carik $1:",
        "compareselectedversions": "bandingang penguwahan sane kapilih",
        "editundo": "nguliang",
        "searchresults": "asil pangrereh",
        "searchresults-title": "asil pangrereh anggen \"$1\"",
-       "prevn": "{{PLURAL:$1|$1}} sadurungne",
-       "nextn": "{{PLURAL:$1|$1}} selanturnyane",
+       "prevn": "{{PLURAL:$1|$1}} sadurungnyané",
+       "nextn": "{{PLURAL:$1|$1}} salanturnyané",
        "prev-page": "kaca sadurungnyané",
        "prevn-title": "$1 {{PLURAL:$1|asil}} sadurunge",
        "nextn-title": "$1 {{PLURAL:$1|asil}} selanturnyane",
        "viewprevnext": "Cingak ($1 {{int:pipe-separator}}$2)($3)",
        "searchmenu-exists": "wenten lembar sane mamurda \"[[:$1]]\" ring wiki puniki. {{PLURAL:$2|0=| cingakin taler asil rerehan lianan sane kapolihang}}",
        "searchmenu-new": "<strong> ngawi lembar \"[[:$1]] ring wiki puniki </ strong>! {{{{PLURAL:$2|}}| 0 = | cingak teler lembar sane kapolihang ring pangreregan | cingak taler asil pangrerehan sane kapolihang}}",
-       "searchprofile-articles": "lembar puniki",
+       "searchprofile-articles": "Kaca daging",
        "searchprofile-images": "multimedia",
        "searchprofile-everything": "Samian",
        "searchprofile-advanced": "lanturane",
        "searchprofile-articles-tooltip": "ngarereh ring $1",
-       "searchprofile-images-tooltip": "pangrereh ring pupulan",
+       "searchprofile-images-tooltip": "Rereh berkas",
        "searchprofile-everything-tooltip": "pangrereh ring samian isi (taler lembar wecana)",
        "searchprofile-advanced-tooltip": "pangrereh ring genah pesengan sane kasinahang",
        "search-result-size": "$1 ({{PLURAL:$2|1 kruna|$2 kruna}})",
        "search-result-category-size": "{{PLURAL:$1|1 krama|$1 krama}}({{PLURAL:$2|1  subgolongan|$2 subgolongan}}, {{PLURAL:$3|1 pupulan|$3 pupulan}})",
-       "search-redirect": "(panglikuan $1)",
+       "search-redirect": "(gingsiran saking $1)",
        "search-section": "(pahan $1)",
        "search-suggest": "minab sane kearsaang $1",
        "searchrelated": "paiketan",
        "searchall": "samian",
        "search-nonefound": "nenten wenten asil sane caklek ring arsa",
        "mypreferences": "Preferensi",
-       "prefs-user-pages": "Kaca panganggén",
+       "prefs-user-pages": "Kaca sang anganggé",
+       "saveprefs": "Raksa",
+       "prefs-editing": "Nguahin",
        "youremail": "E-mail",
        "yourrealname": "pesengan sujati",
+       "gender-male": "Dané nguahin kaca wiki",
        "prefs-help-email": "alamat email sane mawatek mamilih, nanging ngamerluang anggen nyumunin sandi yening ida dane lali",
        "prefs-help-email-others": "ida dane prasida milih anggen ngalugrain anak lianan ngubungin ida dane majalaran lembar penganggen utawi pangraos nenten ja perlu ngagah indik padewekan ida dane",
+       "prefs-editor": "Sang anguah",
        "group-bot": "Bot",
        "grouppage-bot": "{{ns:project}}:Bot",
        "right-edit": "Uah kaca",
        "right-writeapi": "nganggén API sasuratan",
-       "newuserlogpage": "log penganggo anyar",
+       "right-delete": "Usap kaca",
+       "right-editprotected": "Uah kaca sané kasaibin \"{{int:protect-level-sysop}}\"",
+       "grant-createeditmovepage": "Karyanin, uah, miwah gingsirang kaca",
+       "grant-editprotected": "Uah kaca sané kasaibin",
+       "newuserlogpage": "Log makarya sang anganggé",
        "action-read": "wacén kaca puniki",
        "action-edit": "uah kaca puniki",
        "action-createpage": "karyanin kaca puniki",
-       "action-createaccount": "karyanin akun panganggén puniki",
+       "action-createaccount": "karyanin akun sang anganggé puniki",
+       "action-delete": "usap kaca puniki",
+       "action-deletedhistory": "cingak babad kaca sané kausapin",
+       "action-browsearchive": "rereh kaca sané kausapin",
+       "action-editprotected": "uah kaca sané kasaibin \"{{int:protect-level-sysop}}\"",
+       "action-editsemiprotected": "uah kaca sané kasaibin \"{{int:protect-level-autoconfirmed}}\"",
        "nchanges": "$1{{PLURAL:$1|panguwahan|uwah-uwahan}}",
        "enhancedrc-history": "babad",
        "recentchanges": "Uahan anyar",
        "recentchanges-label-minor": "Punika uahan alit",
        "recentchanges-label-bot": "penguwahan puniki kalaksanayang antuk bot",
        "recentchanges-label-unpatrolled": "Uahan puniki durung kapatroli",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (taler cingak [[Special:NewPages|bacakan kaca anyar]])",
+       "rcfilters-savedqueries-remove": "Usap",
        "rcfilters-filter-minor-label": "Uahan alit",
        "rcfilters-filter-major-label": "Uahan tan alit",
        "rcfilters-filter-pageedits-label": "Uahan kaca",
        "rcshowhidebots": "$1 bot",
        "rcshowhidebots-show": "Edengang",
        "rcshowhidebots-hide": "Engkebang",
-       "rcshowhideliu": "$1 penganggo - penganggo terdaftar",
+       "rcshowhideliu": "$1 sang anganggé madaptar",
        "rcshowhideliu-show": "Edengang",
        "rcshowhideliu-hide": "engkebang",
-       "rcshowhideanons": "$1 penganggo tan meadan",
+       "rcshowhideanons": "$1 sang anganggé tan kauningin",
        "rcshowhideanons-show": "Edengang",
        "rcshowhideanons-hide": "Engkebang",
        "rcshowhidepatr": "$1 suntingan sane kapatroli",
        "rcshowhidemine-hide": "Engkebang",
        "rclinks": "Edengang untat $1 gentosan anyar $2 dina kaping untat",
        "diff": "bina",
-       "hist": "kawentenan sane lian",
+       "hist": "bbd",
        "hide": "engkebang",
        "show": "edengang",
        "minoreditletter": "a",
        "newpageletter": "A",
        "boteditletter": "b",
-       "rc-change-size-new": "$1 {{PLURAL:$1|bita|bita}} sasampun kauwah",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bita}} sasampun kauah",
        "rc-enhanced-expand": "edengang rerincian",
        "rc-enhanced-hide": "engkebang rerincian",
        "rc-old-title": "witnyané kakaryanin pinaka \"$1\"",
        "recentchangeslinked-toolbox": "pangentos sane wenten paiketane",
        "recentchangeslinked-title": "panguwahan sane mapaiketan ring $1",
        "recentchangeslinked-summary": "lembar kautamayang puniki ngicenin kepahan penguwahan kaping untat ring lembar-lembar sana mapaiket. Lembar sane [[Special:Watchlist|ida dane iwasin]] mapinget antuk sesuratan tebel",
-       "recentchangeslinked-page": "adan lembar",
+       "recentchangeslinked-page": "Peséngan kaca:",
        "recentchangeslinked-to": "edengang panguwahan sakin lembar-lembar sane mapaiket antuk lembar-lembar sane kaedengang",
        "upload": "ngunggahang berkas",
        "uploadlogpage": "Log pangunggahan",
-       "filedesc": "pacutetan",
+       "filedesc": "Ringkesan",
+       "savefile": "Raksa berkas",
+       "upload-dialog-button-save": "Raksa",
        "license": "kepahan lugra",
        "license-header": "kepahan lugra",
+       "listfiles-delete": "usap",
        "imgfile": "pupulan",
+       "listfiles": "Bacakan berkas",
        "file-anchor-link": "pupulan",
-       "filehist": "sejarah pupulan",
+       "filehist": "Babad berkas",
        "filehist-help": "klik ring pinanggal/galah anggen nyingakin pupulan niki rikala punika",
+       "filehist-deleteall": "usap samian",
        "filehist-revert": "buwungang",
-       "filehist-current": "sane mangkin",
-       "filehist-datetime": "pinanggal/galah",
+       "filehist-current": "sané mangkin",
+       "filehist-datetime": "Tanggal/Galah",
        "filehist-thumb": "Miniatur",
        "filehist-thumbtext": "miniatur anggen versi ring $1",
-       "filehist-user": "sane nganggo",
+       "filehist-user": "Sang anganggé",
        "filehist-dimensions": "ukuran",
        "filehist-comment": "tureksa",
        "imagelinks": "penganggen berkas",
        "linkstoimage": "nyarengin {{PLURAL:$1|pranala|$1pranala}} ring pupulan puniki",
-       "nolinkstoimage": "Nenten wenten lembar sane medue pranala ring pupulan puniki",
+       "nolinkstoimage": "Nénten wénten kaca sané nganggén berkas puniki.",
        "sharedupload-desc-here": "pupulan puniki mawit saking $1 lan minab kaanggen olih proyek-proyek sane lianan. Deskripsi saking [$2 lebar deskripsinyane] kaarahin ring ungkur puniki",
-       "upload-disallowed-here": "Ida dane tusing ngidang numpuk suratan pukini.",
-       "randompage": "Kaca napi kémanten",
+       "shared-repo-name-wikimediacommons": "Wikimedia Commons",
+       "upload-disallowed-here": "Jero nénten dados numpuk berkas puniki.",
+       "filedelete": "Usap $1",
+       "filedelete-submit": "Usap",
+       "filedelete-maintenance-title": "Nénten prasida ngusapin berkas",
+       "randompage": "Kaca punapi kémanten",
        "statistics": "Statistik",
        "statistics-articles": "Kaca daging",
        "brokenredirects-edit": "uah",
-       "nbytes": "$1{{PLURAL:$1|bit}}",
+       "brokenredirects-delete": "usap",
+       "nbytes": "$1{{PLURAL:$1|bita}}",
        "nmembers": "$1 {{PLURAL:$1|krama}}",
        "prefixindex": "Makasami kaca sané mapangater",
+       "protectedpages": "Kaca sané kasaibin",
        "protectedpages-page": "Kaca",
-       "listusers": "Bacakan panganggén",
+       "protectedpages-performer": "Sang anganggé sané nyaibin",
+       "protectedtitles": "Murda sané kasaibin",
+       "listusers": "Bacakan sang anganggé",
        "usereditcount": "$1 {{PLURAL:$1|uahan}}",
        "usercreated": "{{GENDER:$3|kakaryanin}} ring $1 galah $2",
        "newpages": "Kaca anyar",
-       "move": "kisidang",
+       "move": "Gingsirang",
        "pager-newer-n": "{{PLURAL:$1|1 lewih anyar|$1 lewih anyar}}",
        "pager-older-n": "{{PLURAL:$1|1 lewih suwe|$1 lewih anyar}}",
-       "booksources": "pawiwitan buku",
+       "booksources": "Wit buku",
        "booksources-search-legend": "Rereh wit buku",
        "booksources-search": "Rereh",
        "log": "Log",
+       "all-logs-page": "Makasami log publik",
        "allpages": "Makasami kaca",
        "allarticles": "Makasami kaca",
        "allpagessubmit": "lanturang",
        "categories": "Golongan",
+       "deletedcontributions": "Pituut sang anganggé sané kausapin",
        "linksearch-line": "$1 masambung saking $2",
        "listgrouprights-members": "kepahan krama",
        "emailuser": "email sane nganggo niki",
        "wlshowlast": "Cingak $1 jam $2 rahina sané lintang",
        "wlshowhideminor": "uahan alit",
        "watchlist-options": "milih kepahan peninjo",
+       "enotif_subject_deleted": "Kaca {{SITENAME}} $1 sampun {{GENDER:$2|kausap}} $2",
+       "enotif_body_intro_deleted": "Kaca{{SITENAME}} $1 sampun {{GENDER:$2|kausapin}} ring $PAGEEDITDATE olih $2, cingak $3.",
+       "deletepage": "Usap kaca",
+       "delete-confirm": "Usap \"$1\"",
        "actioncomplete": "pelaksanan sampun wusan",
        "actionfailed": "pelaksana luput",
        "dellogpage": "log pangapus",
        "rollbacklink": "mabalik",
        "changecontentmodel-title-label": "Murda kaca",
-       "protectlogpage": "log penyaga",
-       "protectedarticle": "nyaga \"[[$1]]\"",
-       "protect-default": "Lugra makasami panganggén",
+       "protectlogpage": "Log saiban",
+       "protectedarticle": "nyaib \"[[$1]]\"",
+       "protect-default": "Lugra makasami sang anganggé",
        "restriction-edit": "Uah",
+       "restriction-move": "Gingsirang",
+       "undelete": "Cingak kaca sané kausapin",
+       "undeleterevisions": "$1 {{PLURAL:$1|uahan}} kausapin",
        "undeletelink": "cingak/uliang",
        "undeleteviewlink": "cingak",
+       "undelete-search-title": "Rereh kaca sané kausapin",
        "namespace": "Genah pesengan",
        "invert": "uliang pilihan",
        "tooltip-invert": "Centang kotak puniki mangdané ngengkebang lembar sané kauwah ring genah wastan sané kapilih (miwah genah wastan sané mapaiketan yéning kacentang)",
        "blanknamespace": "(Utama)",
-       "contributions": "kawigunan {{GENDER:$1|penganggo}}",
-       "contributions-title": "Kontribusi pangangge anggen $1",
-       "mycontris": "kawigunan",
-       "anoncontribs": "Kawigunan",
+       "contributions": "Pituut {{GENDER:$1|sang anganggé}}",
+       "contributions-title": "Pituut sang anganggé $1",
+       "mycontris": "Pituut",
+       "anoncontribs": "Pituut",
        "contribsub2": "antuk {{GENDER:$3|$1}} ($2)",
        "uctop": "sane mangkin",
-       "month": "mawit saking sasih (lan sadurungnyane)",
-       "year": "mawit saking warsa (lan sadurungnyane)",
-       "sp-contributions-newbies": "wantah saking penganggo anyar",
+       "month": "Saking sasih (miwah sadurungnyané)",
+       "year": "Saking warsa (miwah sadurungnyané):",
+       "sp-contributions-newbies": "Cingak pituut wantah saking akun anyar",
        "sp-contributions-blocklog": "log pemblokiran",
+       "sp-contributions-deleted": "pituut {{GENDER:$1|sang anganggé}} sané kausapin",
        "sp-contributions-uploads": "unggahang",
        "sp-contributions-logs": "log",
        "sp-contributions-talk": "pabligbagan",
-       "sp-contributions-search": "rereh anggen kawigunanne",
-       "sp-contributions-username": "Alamat IP utawi pesengan panganggo:",
+       "sp-contributions-search": "Rereh pituut",
+       "sp-contributions-username": "Alamat IP wiadin peséngan sang anganggé:",
        "sp-contributions-toponly": "tampilang wantah panguwahan sane anyar",
        "sp-contributions-newonly": "Tampilang wantah panguwahan sane anyar",
-       "sp-contributions-submit": "rereh",
+       "sp-contributions-submit": "Rereh",
        "whatlinkshere": "Pranala iriki",
        "whatlinkshere-title": "lembar-lembar sane maduwe pranala kaping \"$1\"",
        "whatlinkshere-page": "Kaca:",
        "linkshere": "lembar puniki maduwe pranala ke '''$2'''",
        "nolinkshere": "lembar puniki maduwe pranala ke '''$2'''",
-       "isredirect": "lembar pangalihan",
+       "isredirect": "Kaca gingsiran",
        "istemplate": "sareng kasurat",
        "isimage": "pranala pupulan-pupulan",
        "whatlinkshere-prev": "{{PLURAL:$1|sadurungnyane|$1 sadurungnyane}}",
        "blocklink": "ngempetin",
        "unblocklink": "ngicalang kaempetan",
        "change-blocklink": "gentosin empetin",
-       "contribslink": "kontribusi",
+       "contribslink": "pituut",
        "blocklogpage": "log pemblokiran",
        "blocklogentry": "mlokir [[$1]] anggen pangwates galah $2$3",
        "block-log-flags-nocreate": "ngawe akun kaicalang",
-       "movelogpage": "log pangisidang",
+       "movelogpage": "Log gingsiran",
        "revertmove": "buwungang",
        "export": "ekspor lembar",
+       "export-download": "Raksa pinaka berkas",
        "allmessagesname": "pesengan",
        "allmessagesdefault": "teks lingga",
        "thumbnail-more": "ngedenang",
        "thumbnail_error": "luput ngaryanin bentuk cenik $1",
        "import-interwiki-sourcepage": "Kaca wit:",
-       "tooltip-pt-userpage": "Lembar sane {{GENDER:|kaanggen ida dane}}",
-       "tooltip-pt-mytalk": "Laman bebaosan {{GENDER:|Ida dané}}",
-       "tooltip-pt-preferences": "Preferensi {{GENDER:|Ida dane}}",
+       "importlogpage": "Log impor",
+       "tooltip-pt-userpage": "Kaca {{GENDER:|sang anganggé jero}}",
+       "tooltip-pt-mytalk": "Kaca pabligbagan {{GENDER:|jero}}",
+       "tooltip-pt-preferences": "Preferensi {{GENDER:|jero}}",
        "tooltip-pt-watchlist": "kepahan-kepahan lembar sane katinjo titiang",
-       "tooltip-pt-mycontris": "Kepahan-kepahan kawigunan {{GENDER:|Ida dane}}",
-       "tooltip-pt-login": "Ida dané kaaptiang mangda ngranjing log, yadiastun nénten wajib",
+       "tooltip-pt-mycontris": "Bacakan pituut {{GENDER:|jero}}",
+       "tooltip-pt-login": "Jero kaaptiang mangda manjing log; yadiastun nénten wajib",
        "tooltip-pt-logout": "medal saking Log",
-       "tooltip-pt-createaccount": "Ida dané kaaptiang mangda makarya akun miwah ngranjing log; yadiastun nénten wajib",
-       "tooltip-ca-talk": "Pabligbagan indik kaca madaging",
+       "tooltip-pt-createaccount": "Jero kaaptiang mangda makarya akun miwah manjing log; yadiastun nénten wajib",
+       "tooltip-ca-talk": "Pabligbagan indik kaca daging",
        "tooltip-ca-edit": "Uah kaca puniki",
        "tooltip-ca-addsection": "nyumunin kepahan anyar",
-       "tooltip-ca-viewsource": "Kaca puniki kasayubang.\nIda dane wantah prasida nyingakin witnyane",
+       "tooltip-ca-viewsource": "Kaca puniki kasaibin.\nJero wantah prasida nyingakin witnyané",
        "tooltip-ca-history": "Uahan sadurungnyané saking kaca puniki",
-       "tooltip-ca-protect": "jaga lembar puniki",
-       "tooltip-ca-delete": "benahang lembar puniki",
-       "tooltip-ca-move": "magingsir saking lembar niki",
+       "tooltip-ca-protect": "Saib kaca puniki",
+       "tooltip-ca-unprotect": "Uah saiban kaca puniki",
+       "tooltip-ca-delete": "Usap kaca puniki",
+       "tooltip-ca-move": "Gingsirang kaca puniki",
        "tooltip-ca-watch": "imbuhin lembar niki ring daftar paninjoan ida dane",
        "tooltip-ca-unwatch": "apus lembar niki ring daftar paninjoan ida dane",
        "tooltip-search": "Rereh ring {{SITENAME}}",
-       "tooltip-search-go": "Rereh kaca antuk wasta sané pateh sakadi puniki yéning wénten",
-       "tooltip-search-fulltext": "Rereh kaca sané madaging suratan puniki",
-       "tooltip-p-logo": "Cingakin kaca utama",
+       "tooltip-search-go": "Rereh kaca sané mapeséngan pateh sakadi puniki yéning wénten",
+       "tooltip-search-fulltext": "Rereh kaca sané madaging sesuratan puniki",
+       "tooltip-p-logo": "Cingak kaca utama",
        "tooltip-n-mainpage": "nuju lembar sane utama",
-       "tooltip-n-mainpage-description": "Cingakin kaca utama",
+       "tooltip-n-mainpage-description": "Cingak kaca utama",
        "tooltip-n-portal": "Indik proyék, sané prasida kalaksanayang, genah ngrereh wantuan",
        "tooltip-n-currentevents": "molihang warta indik kawentenan kawentenan sane pinih anyar",
        "tooltip-n-recentchanges": "Bacakan uahan anyar ring wiki",
        "tooltip-t-whatlinkshere": "Bacakan makasami kaca ring wiki sané nuju iriki",
        "tooltip-t-recentchangeslinked": "Pagentosan anyar lembar sane maduwe pranala nuju lembar puniki",
        "tooltip-feed-atom": "\"atom feed\" anggen lembar puniki",
-       "tooltip-t-contributions": "Daptar kepahan kawigunan {{GENDER:$1|penganggo niki}}",
+       "tooltip-t-contributions": "Bacakan pituut olih {{GENDER:$1|sang anganggé puniki}}",
        "tooltip-t-emailuser": "Ngirim surel majeng ring {{GENDER:$1|penganggo puniki}}",
        "tooltip-t-upload": "ngunggahang file",
        "tooltip-t-specialpages": "Bacakan makasami kaca kusus",
-       "tooltip-t-print": "Vérsi citak kaca puniki",
+       "tooltip-t-print": "Vérsi cétak kaca puniki",
        "tooltip-t-permalink": "Pranala ajeg kaanggen ngubah lembar puniki",
        "tooltip-ca-nstab-main": "Cingak kaca daging",
-       "tooltip-ca-nstab-user": "Cingak kaca panganggo",
+       "tooltip-ca-nstab-user": "Cingak kaca sang anganggé",
        "tooltip-ca-nstab-special": "puniki lembar sane pinih utama sane nenten prasida kauwah",
        "tooltip-ca-nstab-project": "Cingak kaca proyek",
        "tooltip-ca-nstab-image": "Cingak kaca berkas",
        "tooltip-ca-nstab-template": "Cingak citakan",
-       "tooltip-ca-nstab-help": "cingak lembar pamitutlung",
+       "tooltip-ca-nstab-help": "Cingak kaca wantuan",
        "tooltip-ca-nstab-category": "Cingak kaca kategori",
        "tooltip-minoredit": "pingetin puniki dados panguwahan kidik",
-       "tooltip-save": "Nyimpen pagentosan ida dane",
+       "tooltip-save": "Raksa uahan jero",
        "tooltip-preview": "Pagentosan sane dumun duwen ida dane, mangda anggen niki sadurung jagi nyimpen!",
-       "tooltip-diff": "Cingak pagentosan sane sampun ida dane laksanayang",
+       "tooltip-diff": "Cingak uahan sané karyanin jero ring suratannyané",
        "tooltip-compareselectedversions": "cingak binane makekalih kepahan lembar sane kasudi",
        "tooltip-watch": "imbuhin lembar niki ring daftar paninjoan ida dane",
        "tooltip-rollback": "\"nguliang\" muwungan jagi ngabecikang ring lembar puniki nuju haturan sane untat ngangge apisan klik",
        "tooltip-undo": "\"nguliang\" ngabuwungin jagi ngabecikang niki lan ngagah kotak mecikang ngangge mode pratayang. dasar ipun prasida kaimbuhin ring kotak pamicutet",
-       "tooltip-summary": "ngalebuang silih sinunggil ringkesan",
+       "tooltip-summary": "Dagingin ringkesan",
        "simpleantispam-label": "Pamariksa anti-spam.\nPuniki <strong>wenten</strong> kaisi!",
-       "pageinfo-header-edits": "Uah babad",
+       "pageinfo-title": "Pidarta indik \"$1\"",
+       "pageinfo-header-edits": "Babad uahan",
+       "pageinfo-header-restrictions": "Saiban kaca",
        "pageinfo-display-title": "Edengang judul",
-       "pageinfo-article-id": "ID Halaman",
+       "pageinfo-article-id": "ID kaca",
        "pageinfo-robot-index": "Kalugra",
        "pageinfo-robot-noindex": "Tan kalugra",
-       "pageinfo-toolboxlink": "Inpormasi kaca",
+       "pageinfo-firstuser": "Sang makarya kaca",
+       "pageinfo-toolboxlink": "Pidarta kaca",
        "pageinfo-contentpage-yes": "Inggih",
        "previousdiff": "← Uahan sadurungnyané",
        "nextdiff": "Uahan sané pinih anyar →",
        "watchlisttools-view": "Cingak uahan sane relevan",
        "watchlisttools-edit": "Cingak miwah uah bacakan pantauan",
        "watchlisttools-raw": "Uah kepahan paninjo mentah",
-       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|bebaosan]])",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|pabligbagan]])",
        "duplicate-defaultsort": "pingetan: sereg pangurutan lingga \"$2\" nyampahang sereg pangurutan lingga sadurunge \"$1\"",
        "version-specialpages": "Kaca kusus",
+       "redirect-lookup": "Rereh:",
+       "redirect-value": "Aji:",
+       "redirect-user": "ID sang anganggé",
+       "redirect-page": "ID kaca",
+       "redirect-revision": "Uahan kaca",
        "specialpages": "Kaca kusus",
        "external_image_whitelist": "#banggiang baris niki sapunapi kawentenanne<pre>\n#anggen fragmen akspresi reguler (wantah kepahan ring kekelaih//) ring sor puniki\n#fragmen-fragmen puniki jagi kaadungang sareng URL saking gambar-gambar eksternal (sane kasambungang langsung)\n#fragmen sane adung jagi katampilang dados gambar, sisanne wantah dados pranala kewanten\n#baris sane kakawitin antuk # jagi kadadosang baris komentar\n#niki nenten ngabinayang aksara ageng lan alit\n#genahang samian fragmen ekspresi reguler ring sor baris puniki. banggiang baris niki sapunapi kawentennane</pre>",
        "tag-filter": "filter [[Special:Tags|tag]]:",
        "tags-active-yes": "Inggih",
        "tags-active-no": "Nénten",
        "tags-edit": "uah",
+       "tags-delete": "usap",
        "compare-page2": "Kaca 2",
-       "logentry-newusers-create": "$1 {{GENDER:$2|makarya}} akun sané nuénang",
-       "logentry-newusers-autocreate": "Akun panganggén $1 {{GENDER:$2|kakaryanin}} otomatis",
+       "logentry-delete-delete": "$1 {{GENDER:$2|ngusapin}} kaca $3",
+       "logentry-move-move": "$1 {{GENDER:$2|ngingsirang}} kaca $3 ring $4",
+       "logentry-newusers-create": "Akun sang anganggé $1 {{GENDER:$2|kakaryanin}}",
+       "logentry-newusers-autocreate": "Akun sang anganggé $1 {{GENDER:$2|kakaryanin}} otomatis",
+       "logentry-protect-protect": "$1 {{GENDER:$2|nyaibin}} $3 $4",
        "searchsuggest-search": "Rereh ring {{SITENAME}}",
        "duration-days": "$1 {{PLURAL:$1|rahina}}",
        "pagelanguage": "Uah basa ring kaca",
-       "pagelang-nonexistent-page": "Kaca $1 nénten wénten."
+       "pagelang-nonexistent-page": "Kaca $1 nénten wénten.",
+       "log-action-filter-protect-protect": "Saiban",
+       "log-action-filter-protect-move_prot": "Ngingsirang saiban"
 }
index 8ee51ef..c0597d7 100644 (file)
        "emailmessage": "Паведамленьне:",
        "emailsend": "Даслаць",
        "emailccme": "Даслаць мне копію ліста.",
-       "emailccsubject": "Ð\9aопÑ\96Ñ\8f Ð\92аÑ\88ага Ð»Ñ\96Ñ\81Ñ\82а да $1: $2",
+       "emailccsubject": "Ð\9aопÑ\96Ñ\8f Ð²Ð°Ñ\88ага Ð¿Ð°Ð²ÐµÐ´Ð°Ð¼Ð»ÐµÐ½Ñ\8cнÑ\8f да $1: $2",
        "emailsent": "Ліст адасланы",
        "emailsenttext": "Ваш ліст быў адасланы.",
        "emailuserfooter": "Гэты ліст быў дасланы {{GENDER:$1|ўдзельнікам|ўдзельніцай}} $1 да {{GENDER:$2|ўдзельніка|ўдзельніцы}} $2 з дапамогай функцыі «{{int:emailuser}}» {{GRAMMAR:родны|{{SITENAME}}}}. Калі вы адкажаце на гэты ліст, {{GENDER:$2|ваш}} ліст у адказ будзе дасланы непасрэдна {{GENDER:$1|адпраўніку|адпраўніцы}}, і {{GENDER:$1|яму|ёй}} будзе бачны {{GENDER:$2|ваш}} адрас электроннай пошты.",
-       "usermessage-summary": "Ð\9fаведамленÑ\8cне Ð¿Ñ\80а Ð²Ñ\8bÑ\85ад Ð· Ñ\81Ñ\8bÑ\81Ñ\82Ñ\8dмÑ\8b.",
+       "usermessage-summary": "Ð\9fакÑ\96даем Ñ\81Ñ\8bÑ\81Ñ\82Ñ\8dмнае Ð¿Ð°Ð²ÐµÐ´Ð°Ð¼Ð»ÐµÐ½Ñ\8cне.",
        "usermessage-editor": "Дастаўка сыстэмных паведамленьняў",
        "watchlist": "Сьпіс назіраньня",
        "mywatchlist": "Сьпіс назіраньня",
index baf3c3a..919c6a6 100644 (file)
        "import-interwiki-submit": "Внасяне",
        "import-mapping-default": "Внасяне в стандартни местоположения",
        "import-mapping-namespace": "Импортиране в именно пространство:",
-       "import-mapping-subpage": "Ð\98мпоÑ\80Ñ\82иÑ\80ане като подстраници на следната страница:",
+       "import-mapping-subpage": "Ð\92наÑ\81Ñ\8fне като подстраници на следната страница:",
        "import-upload-filename": "Име на файл:",
        "import-upload-username-prefix": "Междууики представка:",
        "import-comment": "Коментар:",
index 939e795..dd37d6d 100644 (file)
        "prefs-dateformat": "Терахьан формат",
        "prefs-timeoffset": "Хенан  гӀирс",
        "prefs-advancedediting": "Юкъара параметреш",
-       "prefs-editor": "Тадар",
+       "prefs-editor": "РедакÑ\82ор",
        "prefs-preview": "Хьалххе хьажар",
        "prefs-advancedrc": "Кхин гӀирс нисбар",
        "prefs-advancedrendering": "Кхин гӀирс нисбар",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|1=Билгало|Билгалонаш}}]]: $2",
        "tag-mw-contentmodelchange": "модулан чулацаман хийцам",
        "tag-mw-new-redirect": "Керла дӀасахьажорг",
+       "tag-mw-new-redirect-description": "ДӀасахьажорг кхуллуш я агӀо дӀасахьажорг тӀе хуьйцуш долу нисдар",
        "tag-mw-removed-redirect": "дӀаяьккхина дӀасхьажорг",
+       "tag-mw-removed-redirect-description": "Йолуш йолу дӀасхьажорг йоцучу дӀасхьажорг тӀе хуьйцуш долу нисдарш",
        "tag-mw-changed-redirect-target": "хийцаран бахьна ду дӀасахьажорг",
        "tag-mw-blank": "цӀанъяр",
+       "tag-mw-blank-description": "АгӀо цӀанъеш долу нисдарш",
        "tag-mw-replace": "хийцар",
+       "tag-mw-replace-description": "90 % сов чулацам дӀабоккхуш долу нисдарш",
        "tag-mw-rollback": "Юхаяккха",
+       "tag-mw-rollback-description": "Юхудаккха хьажорг тӀетаӀийна хьалхара нисдар юхудоккхуш долу нисдар",
        "tag-mw-undo": "юхаяккхар",
+       "tag-mw-undo-description": "«Юхудаккха» хьажорган гӀоьнца дина нисдарш юхудохуш долу нисдарш",
        "tags-title": "Билгалонаш",
        "tags-intro": "ХӀокху агӀона чохь гойтуш бу билгалонийн могӀам царца программин латторо билгал доху нисдарш, кхин билгалонийн маьӀна а.",
        "tags-tag": "Билгалона цӀе",
index 16a8f60..6ae5f80 100644 (file)
        "rcfilters-savedqueries-add-new-title": "Eyarê parzûnê newcudi qeyd kerê",
        "rcfilters-restore-default-filters": "Parzûnê ke estê peyser biya",
        "rcfilters-clear-all-filters": "Parzûnan pêro pak kerê",
-       "rcfilters-show-new-changes": "$1 ra nat vurnayışanê neweyan bımocne",
+       "rcfilters-show-new-changes": "$1 ra nata vurnayışanê neweyan bımocne",
        "rcfilters-search-placeholder": "Vurnayışanê peyênan parzûn kerê (menuyi bıgurenê ya zi nameyê parzûni cıgeyrê)",
        "rcfilters-invalid-filter": "Parzûno nêravêrde",
        "rcfilters-empty-filter": "Parzûnê aktifi çıniyê. İştırakê cı pêro mocniyenê.",
        "upload-curl-error6-text": "URL yo ke nişane biyo nêresiyeno\nkerem kerê bıewnê URLyê şıma raşta ya zi bıewnê keyepel akerdeyo.",
        "upload-curl-error28": "Wextê bar kerdişî qediya",
        "upload-curl-error28-text": "cewab dayişê no keyepel zaf hereyo.\nbıewnê keyepel akerdeyo ya zi bıne vınderê u newe ra tesel bıkerê.\nkeyepel nıka zaf meşğulo yew dema herayi de newe ra tesel bıkerê.",
-       "license": "Lisansdayış:",
-       "license-header": "Lisansdayış",
+       "license": "Lisans:",
+       "license-header": "Lisans",
        "nolicense": "Theba nêweçineya",
        "licenses-edit": "Weçenega lisansi bıvurnê",
        "license-nopreview": "(verqeydî çin o)",
        "listfiles-latestversion-yes": "Eya",
        "listfiles-latestversion-no": "Nê",
        "file-anchor-link": "Dosya",
-       "filehist": "Tarixê dosya",
+       "filehist": "Verêniya dosya",
        "filehist-help": "Seba diyayışê viyarteyê dosya tarixê ke qısımê tarix/zemani derê inan bıtıkne.",
        "filehist-deleteall": "pêro bestere",
        "filehist-deleteone": "bestere",
        "filehist-filesize": "Ebadê dosya",
        "filehist-comment": "Mışewre",
        "imagelinks": "Gurenayışê dosya",
-       "linkstoimage": "{{PLURAL:$1|Ena pele na dosya gurenena|$1 enê peli na dosya gurenenê}}:",
+       "linkstoimage": "{{PLURAL:$1|Pela cêrên|$1 pelê cêrêni}} na dosya gurenenê:",
        "linkstoimage-more": "$1 ra zêde {{PLURAL:$1|pele na dosya gurenena|peli na dosya gurenenê}}.\nEna lista cêrêne {{PLURAL:$1|dosyaya sıfteyına ke tenya na dosya gurenena|dosyeyanê $1 sıfteyınanê ke tenya na dosya gurenenê}}, inan mocnena.\nYew [[Special:WhatLinksHere/$2|lista pêro]] mevcuda.",
        "nolinkstoimage": "Qet yew pele ena dosya nêgurenena.",
        "morelinkstoimage": "[[Special:WhatLinksHere/$1|Linkanê zafyerî]] ena pele ra link biyo bivîne.",
        "linkstoimage-redirect": "$1 (Dosya raçarnayış) $2",
        "duplicatesoffile": "a {{PLURAL:$1|dosya|$1 dosya}}, kopyayê na dosyayi ([[Special:FileDuplicateSearch/$2|teferruati]]):",
        "sharedupload": "Ena dosya $1 ra u belki projeyê binan dı hewitiyeno.",
-       "sharedupload-desc-there": "depoyê $1 u projeyê bini na dosyayi xebıtneni. qey teferruati bıewnê [$2 teferruati dosyayi].",
-       "sharedupload-desc-here": "depoyê $1 u projeyê bini na dosyayi xebıtneni. qey teferruati bıewnê [$2 teferruati dosyayi].",
+       "sharedupload-desc-there": "Na dosya depoyê $1 de esta u terefê proceyanê binan ra gureniyena. \nCêr dê [şınasiya dosyay pela $2] mocniyeno.",
+       "sharedupload-desc-here": "Na dosya depoyê $1 de esta u terefê proceyanê binan ra gureniyena. \nCêr dê [şınasiya dosyay pela $2] mocniyeno.",
        "sharedupload-desc-edit": "Na dosya $1 proceyan dê binandı ke şeno bıgurweyno.\nŞıma qayılê ke malumatê cı bıvurnê se şıre [pela da $2 ].",
        "sharedupload-desc-create": "Na dosya $1 proceyan dê binandı ke şeno bıgurweyno.\nŞıma qayılê ke malumatê cı bıvurnê se şıre [pela da $2 ].",
        "filepage-nofile": "Ena name de dosya çin o.",
        "file-info-size": "$1 × $2 pikselan, ebatê dosya: $3, MIME tipê cı: $4",
        "file-info-size-pages": "$1 × $2 pikse, dergeya dosyay: $3, MIME tipiya cı: $4, $5 {{PLURAL:$5|pela|pela}}",
        "file-nohires": "Deha berz agozney cı çıniyo",
-       "svg-long-desc": "Dosyay SVG, zek vanê $1 × $2 piksela, ebatê dosya: $3",
+       "svg-long-desc": "Dosyay SVGi, nominal $1 × $2 pikseli, ebadê dosya: $3",
        "svg-long-desc-animated": "SVG dosya, nominalin $1 × $2 piksela, ebatê dosya: $3",
        "svg-long-error": "Nêmeqbul dosyaya SVG'i: $1",
        "show-big-image": "Dosyaya oricinale",
        "show-big-image-preview": "Vervênayışê ebatê : $1.",
-       "show-big-image-other": "Zewmi{{PLURAL:$2|Vılêşnayış|Vılêşnayışê}}: $1.",
+       "show-big-image-preview-differ": "Ebadê verqaytê $3 na dosyay $2: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Agoznayışo bin|Agoznayışê bini}}: $1.",
        "show-big-image-size": "$1 × $2 piksel",
        "file-info-gif-looped": "viyariye biyo",
        "file-info-gif-frames": "$1 {{PLURAL:$1|çerçeve|çerçeveyi}}",
        "autosumm-blank": "Pele kerde veng",
        "autosumm-replace": "Maqale pê '$1' vuriya",
        "autoredircomment": "heteneya [[$1]]",
-       "autosumm-removed-redirect": "[[$1]] ra serşıkıtış dariya we",
+       "autosumm-removed-redirect": "[[$1]] ra serşıkıtış wedariya",
        "autosumm-changed-redirect-target": "Hedefê serşıkıtışi heruna [[$1]] ra vurniya era [[$2]]",
        "autosumm-new": "Pela vıraziyê, '$1' bıvinê",
        "autosumm-newblank": "Pera veng vıraziyê",
        "lag-warn-high": "Eka serverê databaseyî zaf hebitiyeno, ayra vurnayîşî ke {{PLURAL:$1|seniye|seniyeyî}} ra newiyerî belki inan nimucneno.",
        "watchlistedit-normal-title": "Lista seyrkerdışi bıvurne",
        "watchlistedit-normal-legend": "Lista seyrkerdışi ra sernameyan wedare",
-       "watchlistedit-normal-explain": "Listeyê seyr kerdîşî ti de serogî cor de mucnayiyo.\nEka ti wazeno seroğ biwedarne, kuti ke kistê de, ay işaret bike u \"{{int:Watchlistedit-normal-submit}}\" klik bike.\nTi hem zi eşkeno [[Special:EditWatchlist/raw|edit the raw list]].",
+       "watchlistedit-normal-explain": "Sernamey lista seyrkerdoğanê şıma cêr dê rêze biyê. Jew Sernamey tede ra vetış rê kutuya ke cı het deya işaret kerê u makeka \"{{int:Watchlistedit-normal-submit}}\" bıtıknê .\n[[Special:EditWatchlist/raw|lista satırer]] ra şenê bıvurnê .",
        "watchlistedit-normal-submit": "Sernuşteyan wedare",
        "watchlistedit-normal-done": "{{PLURAL:$1|1 sername|$1 sernamey}} lista seyrkerdışê şıma ra darde we:",
        "watchlistedit-raw-title": "Lista seyrkerdışia xame bıvurne",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Etiket|Etiketi}}]]: $2",
        "tag-mw-contentmodelchange": "vurnayışê modelê zerreki",
        "tag-mw-new-redirect": "Serşıkıtışo newe",
-       "tag-mw-removed-redirect": "Serşıkıtış dariya we",
+       "tag-mw-removed-redirect": "Serşıkıtış wedariya",
        "tag-mw-changed-redirect-target": "Hedefê serşıkıtışi vurniya",
        "tag-mw-blank": "Pel veng kerdış",
        "tag-mw-blank-description": "Vengiya na pele bıvurne",
        "tags-actions-header": "Kerdışi",
        "tags-active-yes": "Eya",
        "tags-active-no": "Nê",
-       "tags-source-extension": "Terefê nuştebari ra şınasniyeno",
+       "tags-source-extension": "Telimatê komputeri ra şınasneno",
        "tags-source-manual": "Terefê karberan û botan ra be dest ra gureniyeno",
        "tags-edit": "bıvurne",
        "tags-delete": "bestere",
index 1e0b8e9..59e5370 100644 (file)
@@ -58,7 +58,8 @@
                        "KATRINE1992",
                        "Fitoschido",
                        "KATRINE1993",
-                       "Vlad5250"
+                       "Vlad5250",
+                       "Sarri.greek"
                ]
        },
        "tog-underline": "Υπογράμμιση συνδέσμων:",
        "edittools": "<!-- Το κείμενο εδώ θα φαίνεται κάτω από τις φόρμες επεξεργασίας και επιφόρτωσης. -->",
        "nocreatetext": "Το {{SITENAME}} έχει περιορίσει την ικανότητα δημιουργίας νέων σελίδων.\nΜπορείτε να πάτε πίσω και να επεξεργαστείτε μια υπάρχουσα σελίδα, ή να [[Special:UserLogin|συνδεθείτε ή να δημιουργήσετε ένα λογαριασμό]].",
        "nocreate-loggedin": "Δεν έχετε άδεια να δημιουργήσετε νέες σελίδες.",
-       "sectioneditnotsupported-title": "Î\94εν Ï\85Ï\80οÏ\83Ï\84ηÏ\81ίζεÏ\84ε η επεξεργασία τομέα",
-       "sectioneditnotsupported-text": "Î\94εν Ï\85Ï\80οÏ\83Ï\84ηÏ\81ίζεÏ\84ε η επεξεργασία τομέα σε αυτήν τη σελίδα.",
+       "sectioneditnotsupported-title": "Î\94εν Ï\85Ï\80οÏ\83Ï\84ηÏ\81ίζεÏ\84αι η επεξεργασία τομέα",
+       "sectioneditnotsupported-text": "Î\94εν Ï\85Ï\80οÏ\83Ï\84ηÏ\81ίζεÏ\84αι η επεξεργασία τομέα σε αυτήν τη σελίδα.",
        "permissionserrors": "Σφάλμα  άδειας",
        "permissionserrorstext": "Δεν έχετε άδεια να το κάνετε αυτό, για {{PLURAL:$1|τον εξής λόγο|τους εξής λόγους}}:",
        "permissionserrorstext-withaction": "Δεν έχετε την άδεια να $2, για {{PLURAL:$1|τον ακόλουθο λόγο|τους ακόλουθους λόγους}}:",
        "action-createpage": "να δημιουργήσετε αυτή τη σελίδα",
        "action-createtalk": "να δημιουργήσετε αυτή τη σελίδα συζήτησης",
        "action-createaccount": "να δημιουργήσετε αυτό το λογαριασμό χρήστη",
-       "action-autocreateaccount": "Î\94ημιοÏ\85Ï\81γείστε αυτόματα αυτόν τον εξωτερικό λογαριασμό χρήστη",
+       "action-autocreateaccount": "Î\94ημιοÏ\85Ï\81γήστε αυτόματα αυτόν τον εξωτερικό λογαριασμό χρήστη",
        "action-history": "προβολή ιστορικού αυτή της σελίδας",
        "action-minoredit": "να σημειώσετε αυτή την επεξεργασία σαν «μικρής κλίμακας»",
        "action-move": "να μετακινήσετε αυτή τη σελίδα",
        "action-upload_by_url": "να επιφορτώσετε αυτό το αρχείο από μια διεύθυνση URL",
        "action-writeapi": "να χρησιμοποιήσετε το API για εγγραφή",
        "action-delete": "να διαγράψετε αυτή τη σελίδα",
-       "action-deleterevision": "διαγράψετε αναθεωρήσεις",
+       "action-deleterevision": "διαγράψτε αναθεωρήσεις",
        "action-deletelogentry": "διαγράψτε καταχωρήσεις καταγραφών",
        "action-deletedhistory": "προβάλετε διαγεγραμμένο ιστορικό σελίδας",
        "action-deletedtext": "να προβάλετε κείμενο διαγεγραμμένων αναθεωρήσεων",
        "action-managechangetags": "δημιουργήσετε και διαγράψετε ετικέτες από τη βάση δεδομένων",
        "action-applychangetags": "εφαρμογή ετικετών παράλληλα με τις αλλαγές σας",
        "action-changetags": "πρόσθεση και αφαίρεση αυθαίρετων ετικετών σε μεμονωμένες εκδόσεις και καταχωρήσεις καταγραφών",
-       "action-deletechangetags": "διαγράψετε ετικέτες από τη βάση δεδομένων",
+       "action-deletechangetags": "διαγράψτε ετικέτες από τη βάση δεδομένων",
        "action-purge": "εκκαθάριση αυτής της σελίδας",
        "action-apihighlimits": "χρήση μεγαλύτερων ορίων για ερωτήματα API",
        "action-editinterface": "επεξεργασία της διεπαφής χρήστη",
index 5a2d605..c665d2c 100644 (file)
@@ -62,8 +62,8 @@
        },
        "tog-underline": "Substrekado de ligiloj:",
        "tog-hideminor": "Kaŝi etajn redaktojn de la lastaj ŝanĝoj",
-       "tog-hidepatrolled": "Kaŝi patrolitajn redaktojn en lastaj ŝanĝoj",
-       "tog-newpageshidepatrolled": "Kaŝi patrolitajn paĝojn de listo de novaj paĝoj",
+       "tog-hidepatrolled": "Kaŝi pripatrolitajn redaktojn en lastaj ŝanĝoj",
+       "tog-newpageshidepatrolled": "Kaŝi pripatrolitajn paĝojn de listo de novaj paĝoj",
        "tog-hidecategorization": "Kaŝi enkategoriigon de paĝoj",
        "tog-extendwatchlist": "Etendi la atentaron por montri ĉiujn ŝanĝojn, ne nur la plej lastajn",
        "tog-usenewrc": "Grupigi ŝanĝojn laŭ paĝo en \"Lastaj ŝanĝoj\" kaj \"Atentaro\" (bezonas Ĝavaskripton)",
@@ -95,7 +95,7 @@
        "tog-watchlistreloadautomatically": "Reŝargi la atentaron aŭtomate ĉiam, kiam filtrilo estas ŝanĝita (bezonas Ĝavoskripton)",
        "tog-watchlistunwatchlinks": "Aldoni rektajn markilojn por malatenti/atenti ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) al atentaro (bezonas Javascripton por komuti la funkciecon)",
        "tog-watchlisthideanons": "Kaŝi redaktojn de anonimuloj de la atentaro",
-       "tog-watchlisthidepatrolled": "Kaŝi patrolitajn redaktojn de la atentaro",
+       "tog-watchlisthidepatrolled": "Kaŝi pripatrolitajn redaktojn de la atentaro",
        "tog-watchlisthidecategorization": "Kaŝi enkategoriigon de paĝoj",
        "tog-ccmeonemails": "Sendi al mi kopiojn de retpoŝtaĵoj, kiujn mi sendis al aliaj uzantoj.",
        "tog-diffonly": "Ne montri paĝan enhavon sub la ŝanĝmontrilo",
        "expansion-depth-exceeded-category-desc": "La paĝo superis la maksimuman profundecon de ekspando.",
        "expansion-depth-exceeded-warning": "Paĝo preterpasis la ekpansiprofundon.",
        "parser-unstrip-loop-warning": "Cirkloreferencon detektis",
-       "unstrip-depth-warning": "Rikurlimiton de analizopoj ($1) superis",
+       "unstrip-depth-warning": "La funkcio 'unstrip' trorikuris ($1)",
+       "unstrip-depth-category": "Paĝoj en kiu la funkcio 'unstrip' trorikuris",
+       "unstrip-size-warning": "Troa grando por funkcio 'unstrip' ($1)",
        "unstrip-size-category": "Paĝoj kiuj superas la limon de la unstrip-funkcio",
        "converter-manual-rule-error": "Eraron detektis en mana lingvokonverta regulo",
        "undo-success": "La redakto estas malfarebla.\nBonvolu kontroli la jenan komparaĵon por certiĝi ĉu tio estas tio, kion vi volas, kaj konservi la ŝanĝojn malsupre por fine malfari la redakton.",
        "history-feed-empty": "La petita paĝo ne ekzistas.\nĜi verŝajne estis forigita de la vikio, aŭ alinomita.\nProvu [[Special:Search|serĉi en la vikio]] por rilataj novaj paĝoj.",
        "history-edit-tags": "Redakti etikedojn de elektitaj revizioj",
        "rev-deleted-comment": "(komento forigita)",
-       "rev-deleted-user": "(uzantonomo forigita)",
+       "rev-deleted-user": "(uzantnomo forigita)",
        "rev-deleted-event": "(protokolaj detaloj forigitaj)",
        "rev-deleted-user-contribs": "[salutnomo aŭ IP-adreso estis forigita - redakto estas kaŝita en kontribuoj]",
        "rev-deleted-text-permission": "Ĉi tiu revizio de la paĝo estis '''forigita'''.\nEble estas detaloj en la [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} protokolo pri forigado].",
        "recentchangescount": "Nombro de redaktoj por defaŭlte montri en lastaj ŝanĝoj, paĝaj hitorioj kaj protokoloj:",
        "prefs-help-recentchangescount": "Maksimuma nombro: 1000",
        "prefs-help-watchlist-token2": "Tio estas la sekreta ŝlosilo al la retfluo de via atentaro.\nĈiu, kiu konas ĝin, povas legi vian atentaron. Do, ne kunhavigu ĝin.\nSe vi devas, [[Special:ResetTokens|vi povas rekomencigi ĝin]].",
+       "prefs-help-tokenmanagement": "Vi povas vidi kaj restarigi la sekretan ŝlosilon por via konto, per kiu oni povas akiri la abonfluon de via atentaro. Ĉiu ajn scianto de la ŝlosilo povas legi vian atentaron; do ne diskonigu ĝin.",
        "savedprefs": "Viaj preferoj estas konservitaj.",
        "savedrights": "La uzanto-grupoj de {{GENDER:$1|$1}} estis konservitaj.",
        "timezonelegend": "Horzono:",
        "localtime": "Loka tempo:",
        "timezoneuseserverdefault": "Uzi implicitaĵon de servilo ($1)",
-       "timezoneuseoffset": "Alia (Enigu diferencon)",
+       "timezoneuseoffset": "Alia (specifu la horo-diferencon ĉi-sube)",
        "timezone-useoffset-placeholder": "Ekzemplaj valoroj: \"-07:00\" aŭ \"01:00\"",
        "servertime": "Servila tempo:",
        "guesstimezone": "Plenigita el la foliumilo",
        "userrights-expiry-current": "Eksvalidiĝas je $1",
        "userrights-expiry-none": "Ne eksvalidiĝas",
        "userrights-expiry": "Eksvalidiĝos:",
+       "userrights-expiry-existing": "Ekzistanta protektdaŭro: $3, $2",
        "userrights-expiry-othertime": "Alia tempo:",
        "userrights-expiry-options": "1 tago:1 tago,1 semajno:1 semajno,1 monato:1 monato,3 monatoj:3 monatoj,6 monatoj:6 monatoj,1 jaro:1 jaro",
        "userrights-invalid-expiry": "La eksvalidiĝa tempo por la grupo „$1“ estas nevalida.",
        "userrights-expiry-in-past": "La eksvalidiĝas tempo por la grupo „$1“ jam pasis.",
+       "userrights-cannot-shorten-expiry": "Vi ne povas plifruigi la eksvalidiĝon de aneco en grupo \"$1\". Nur anoj kun la permeso aldoni kaj forigi ĉi tiun grupon povas plifruigi la tempon de eksvalidiĝo.",
        "userrights-conflict": "Konflikto ĉe la ŝanĝo de uzantorajtoj! Bonvolu kontroli kaj konfirmi viajn ŝanĝojn.",
        "group": "Grupo:",
        "group-user": "Uzantoj",
        "right-noratelimit": "Ne influita de po-limoj",
        "right-import": "Importi paĝojn de aliaj vikioj",
        "right-importupload": "Importi paĝojn de dosiera alŝuto",
-       "right-patrol": "Marki redaktojn kiel patrolitajn",
-       "right-autopatrol": "Fari redaktojn aŭtomate markitajn kiel patrolitajn",
+       "right-patrol": "Marki redaktojn kiel pripatrolitajn",
+       "right-autopatrol": "Fari redaktojn aŭtomate markitajn kiel patrolkontrolitajn",
        "right-patrolmarks": "Vidi patrolmarkojn de lastaj ŝanĝoj",
        "right-unwatchedpages": "Vidi la liston de nepriatentitaj paĝoj",
        "right-mergehistory": "Kunfandigi la historiojn de paĝoj",
        "grant-editprotected": "Redakti protektitajn paĝojn",
        "grant-highvolume": "Ampleksega redaktado",
        "grant-oversight": "Kaŝi uzantojn kaj forigi reviziaĵojn",
-       "grant-patrol": "Patroli ŝanĝojn al pâgoj",
+       "grant-patrol": "Pripatroli ŝanĝojn al pâgoj",
        "grant-privateinfo": "Aliro al privataj informoj",
        "grant-protect": "Protekti kaj malprotekti paĝojn",
        "grant-rollback": "Malfari ŝanĝojn de paĝoj",
        "action-rollback": "tuj malfari la redaktojn de la lasta uzanto kiu redaktis specifan paĝon",
        "action-import": "enporti paĝojn de alia vikio",
        "action-importupload": "importi paĝojn de dosiera alŝuto",
-       "action-patrol": "marki redakton de alia persono kiel patrolitan",
+       "action-patrol": "marki redakton de alia persono kiel pripatrolitan",
        "action-autopatrol": "fari vian redakton markitan kiel patrolitan",
        "action-unwatchedpages": "vidi la liston de neatentitaj paĝoj",
        "action-mergehistory": "kunigi la historion de ĉi tiu paĝo",
        "action-changetags": "aldoni kaj forigi arbitrajn etikedojn ĉe unuopaj revizioj kaj protokoleroj",
        "action-deletechangetags": "Forigi etikedojn de la datenbazo.",
        "action-purge": "refreŝigi servilan kaŝmemoron de ĉi tiu paĝo",
+       "action-apihighlimits": "uzi pli grandan limon por API-informpetoj",
+       "action-autoconfirmed": "ne esti influata de po-limoj laŭ IP-adresoj",
        "action-bigdelete": "forigi paĝojn kun grandaj historioj",
        "action-blockemail": "Malpermesi al uzanto sendi retpoŝton.",
+       "action-bot": "traktiĝi kiel aŭtomata procezo",
+       "action-editprotected": "redakti paĝojn protektatajn kiel \"{{int:protect-level-sysop}}\"",
+       "action-editsemiprotected": "redakti paĝojn protektatajn kiel \"{{int:protect-level-autoconfirmed}}\"",
        "action-editinterface": "redakti la fasadon",
        "action-editusercss": "redakti CSS-dosierojn de aliaj uzantoj",
        "action-edituserjson": "redakti JSON-dosierojn de aliaj uzantoj",
        "action-editmyusercss": "redakti proprajn CSS-dosierojn",
        "action-editmyuserjson": "redakti proprajn JSON-dosierojn",
        "action-editmyuserjs": "redakti proprajn JavaScript-dosierojn",
+       "action-viewsuppressed": "vidi versiojn kaŝitajn for de ajna uzanto",
        "action-hideuser": "forbari uzantnomon, kaŝante ĝin de la publiko",
+       "action-ipblock-exempt": "preterpasi forbarojn de IP-adresoj, aŭtomatajn forbarojn, kaj forbarojn de IP-adresaj intervaloj",
        "action-unblockself": "malforbari oni mem",
+       "action-noratelimit": "ne esti influata de po-limoj",
+       "action-reupload-own": "anstataŭigi ekzistantan dosieron alŝutitan de vi",
+       "action-nominornewtalk": "fari etajn redaktojn en diskuto-paĝoj sen kaŭzi atentigon pri novaj mesaĝoj",
+       "action-markbotedits": "marki malfaritajn redaktojn kiel robotajn",
+       "action-patrolmarks": "vidi patrolmarkojn de lastaj ŝanĝoj",
+       "action-override-export-depth": "elporti paĝojn inkluzivante ligitajn paĝojn ĝis profundo de 5",
+       "action-suppressredirect": "ne krei alidirektilojn el fontaj paĝoj dum movado de paĝoj",
        "nchanges": "$1 {{PLURAL:$1|ŝanĝo|ŝanĝoj}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ekde lasta vizito}}",
        "enhancedrc-history": "historio",
        "recentchanges-summary": "Per ĉi tiu paĝo vi povas sekvi la plej lastajn ŝanĝojn en la {{SITENAME}}.",
        "recentchanges-noresult": "En la donita tempo ne estis ŝanĝoj, kiuj konformas al la kriterioj.",
        "recentchanges-timeout": "Ĉi tiu serĉo transiris sian tempolimon. Vi eble provu malsamajn serĉajn parametrojn.",
+       "recentchanges-network": "Pro teknika eraro, neniu rezulto ŝargiĝis. Bonvolu refreŝigi la paĝon.",
+       "recentchanges-notargetpage": "Enigu nomon de paĝon ĉi-supre por vidi ŝanĝojn rilatajn al tiu paĝo.",
        "recentchanges-feed-description": "Sekvi la plej lastatempajn ŝanĝojn al la vikio en ĉi tiu fonto.",
        "recentchanges-label-newpage": "Ĉi tiu redakto kreis novan paĝon",
        "recentchanges-label-minor": "Ĉi tiu estas eta redakto",
        "recentchanges-label-bot": "Ĉi tiu redakto estis farita per roboto.",
-       "recentchanges-label-unpatrolled": "Ĉi tiu redakto ankoraŭ ne estis patrolita.",
+       "recentchanges-label-unpatrolled": "Ĉi tiu redakto ankoraŭ ne estis pripatrolita.",
        "recentchanges-label-plusminus": "La paĝa grandeco ŝanĝiĝis je ĉi tiu nombro de bitokoj",
        "recentchanges-legend-heading": "<strong>Klarigo:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vidu ankaŭ [[Special:NewPages|liston de novaj paĝoj]])",
        "rcfilters-highlighted-filters-list": "Emfazita: $1",
        "rcfilters-quickfilters": "Konservitaj filtriloj",
        "rcfilters-quickfilters-placeholder-title": "Ankoraŭ neniuj filtriloj estas konservitaj",
+       "rcfilters-quickfilters-placeholder-description": "Por konservi kaj poste reuzi viajn filtrajn agordojn, alklaku la legosignan ikonon en la ĉi-suba areo de Aktivaj filtriloj.",
        "rcfilters-savedqueries-defaultlabel": "Konservitaj filtriloj",
        "rcfilters-savedqueries-rename": "Alinomi",
        "rcfilters-savedqueries-setdefault": "Farigi implicito",
        "rcfilters-savedqueries-apply-and-setdefault-label": "Krei implicitan filtrilon",
        "rcfilters-savedqueries-cancel-label": "Nuligi",
        "rcfilters-savedqueries-add-new-title": "Konservi la nunajn filtrilajn agordojn",
+       "rcfilters-savedqueries-already-saved": "Tiuj filtriloj estas jam konservataj. Ŝanĝi viajn agordojn por krei novan Konservatan Filtrilon.",
        "rcfilters-restore-default-filters": "Restarigi defaŭltajn filtrilojn",
        "rcfilters-clear-all-filters": "Nuligi ĉiujn filtrilojn",
        "rcfilters-show-new-changes": "Vidi la novajn ŝanĝojn ekde $1",
        "rcfilters-highlightmenu-title": "Elekti koloron",
        "rcfilters-highlightmenu-help": "Elekti koloron por emfazi ĉi tiun econ",
        "rcfilters-filterlist-noresults": "Neniuj filtriloj troviĝis",
+       "rcfilters-noresults-conflict": "Neniuj rezultoj estis trovita ĉar la serĉaj kriterioj estas konfliktaj.",
+       "rcfilters-state-message-subset": "Ĉi tiu filtrilo havas neniun efikon, ĉar ĝiaj rezultoj estas inkluzivitaj en la rezultoj de la {{PLURAL:$2|jena, pli ĝenerala filtrilo|jenaj, pli ĝeneralaj filtriloj}} (provu reliefigadon por distingi): $1",
+       "rcfilters-state-message-fullcoverage": "Elektado de ĉiuj filtriloj en ĉi tiu grupo ekvivalentas elektadon de nenio; tial ĉi tiu filtrilo havas neniun efikon. Grupo enhavas la filtrilojn: $1",
        "rcfilters-filtergroup-authorship": "Redakta aŭtoreco",
        "rcfilters-filter-editsbyself-label": "Viaj redaktoj",
        "rcfilters-filter-editsbyself-description": "Viaj kontribuoj.",
        "rcfilters-filter-humans-label": "Homa (ne robota)",
        "rcfilters-filter-humans-description": "Redaktoj farita de homaj redaktantoj.",
        "rcfilters-filtergroup-reviewstatus": "Reviziiteco",
-       "rcfilters-filter-reviewstatus-unpatrolled-label": "Ne patrolita",
-       "rcfilters-filter-reviewstatus-manual-description": "Redaktoj mane markita kiel patrolita.",
-       "rcfilters-filter-reviewstatus-manual-label": "Mane patrolita",
-       "rcfilters-filter-reviewstatus-auto-description": "Redaktoj de altnivelaj uzantoj kies laboro estas aŭtomate markita kiel patrolita.",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Redaktoj ne aŭtomate nek malaŭtomate markitaj kiel patrolitajn",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Ne pripatrolita",
+       "rcfilters-filter-reviewstatus-manual-description": "Redaktoj mane markita kiel pripatrolitan.",
+       "rcfilters-filter-reviewstatus-manual-label": "Mane pripatrolita",
+       "rcfilters-filter-reviewstatus-auto-description": "Redaktoj de altnivelaj uzantoj kies laboro estas aŭtomate markita kiel pripatrolita.",
        "rcfilters-filter-reviewstatus-auto-label": "Aŭtomate patrolita",
        "rcfilters-filtergroup-significance": "Signifo",
        "rcfilters-filter-minor-label": "Etaj redaktoj",
        "rcfilters-filter-watchlistactivity-unseen-description": "Ŝanĝoj al paĝoj kiujn vi ne vizitis ekde kiam la ŝanĝoj okazis.",
        "rcfilters-filter-watchlistactivity-seen-label": "Viditaj ŝanĝoj",
        "rcfilters-filter-watchlistactivity-seen-description": "Ŝanĝoj al paĝoj kiujn vi vizitis ekde kiam la ŝanĝoj okazis.",
-       "rcfilters-filtergroup-changetype": "Tipo de ŝanĝo",
+       "rcfilters-filtergroup-changetype": "Speco de ŝanĝo",
        "rcfilters-filter-pageedits-label": "Redaktoj de paĝoj",
        "rcfilters-filter-pageedits-description": "Redaktoj al vikia enhavo, diskutoj, kategoriaj priskriboj…",
        "rcfilters-filter-newpages-label": "Kreaĵoj de paĝo",
        "rcfilters-filter-categorization-description": "Registroj de paĝoj aldonitaj aŭ forigitaj de kategorioj",
        "rcfilters-filter-logactions-label": "Registritaj agoj",
        "rcfilters-filter-logactions-description": "Administraciaj agoj, kontaj kreoj, paĝaj forigoj, alŝutoj…",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "La filtrilo \"Etaj redaktoj\" konfliktas kun unu aŭ pli da filtriloj pri \"Speco de ŝanĝo\", ĉar iuj specoj de ŝanĝo ne povas esti \"etaj\". La konfliktantaj filtriloj estas markitaj en la ĉi-supra areo de Aktivaj filtriloj.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Iuj specoj de ŝanĝo ne povas esti \"etaj\"; tial ĉi tiu filtrilo konfliktas kun la jenaj filtriloj de Speco de Ŝanĝo: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Ĉi tiu filtrilo pri Speco de Ŝanĝo konfliktas kun la filtrilo pri \"Etaj Redaktoj\". Iuj specoj de ŝanĝo ne povas esti \"etaj\".",
        "rcfilters-filtergroup-lastrevision": "Lastaj revizioj",
        "rcfilters-filter-lastrevision-label": "Lasta revizio",
        "rcfilters-filter-lastrevision-description": "Nur la plej lasta ŝanĝo al paĝo.",
        "rcfilters-watchlist-edit-watchlist-button": "Redakti vian atentaron",
        "rcfilters-watchlist-showupdated": "Ŝanĝoj en paĝoj, kiujn vi ne vizitis post la ŝanĝo, aperas <strong>grase</strong>, kun plenigitaj buletoj.",
        "rcfilters-preference-label": "Uzi fasadon sen JavaScript",
+       "rcfilters-preference-help": "Ŝargi Ĵusajn Ŝanĝojn sen funkcioj de filtra serĉado aŭ reliefigado",
        "rcfilters-watchlist-preference-label": "Uzi fasadon ne uzantan JavaScript",
+       "rcfilters-watchlist-preference-help": "Ŝargi Atentaron sen funkcioj de filtra serĉado aŭ reliefigado",
+       "rcfilters-filter-showlinkedfrom-label": "Montri ŝanĝojn de tiuj paĝoj, ligilojn al kiuj enhavas",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Tiuj paĝoj, ligilojn al kiuj</strong> enhavas la elektita paĝo",
        "rcfilters-filter-showlinkedto-label": "Montri ŝanĝojn de paĝoj enhavantaj ligilojn al",
        "rcfilters-filter-showlinkedto-option-label": "<strong>Paĝoj enhavantaj ligilojn al</strong> la elektita paĝo",
        "rcfilters-target-page-placeholder": "Enigu nomon de paĝo (aŭ kategorio)",
        "rcnotefrom": "Malsupre estas la {{PLURAL:$5|ŝanĝo|ŝanĝoj}} ekde <strong>$3, $4</strong> (montrante ĝis <strong>$1</strong>).",
+       "rclistfromreset": "Restarigi elekton de datoj",
        "rclistfrom": "Montri novajn ŝanĝojn ekde \"$3 $2\"",
        "rcshowhideminor": "$1 etajn redaktojn",
        "rcshowhideminor-show": "Montri",
        "rcshowhideanons": "$1 anonimajn redaktojn",
        "rcshowhideanons-show": "Montri",
        "rcshowhideanons-hide": "Kaŝi",
-       "rcshowhidepatr": "$1 patrolitajn redaktojn",
+       "rcshowhidepatr": "$1 pripatrolitajn redaktojn",
        "rcshowhidepatr-show": "Montri",
        "rcshowhidepatr-hide": "Kaŝi",
        "rcshowhidemine": "$1 miajn redaktojn",
        "uploadbtn": "Alŝuti dosieron",
        "reuploaddesc": "Reveni al la alŝuta formularo.",
        "upload-tryagain": "Enigi ŝanĝitan dosieran priskribon",
+       "upload-tryagain-nostash": "Sendi realŝutotan dosieron kaj modifitan priskribon",
        "uploadnologin": "Ne ensalutinta",
        "uploadnologintext": "Bonvolu $1 por alŝuti dosierojn.",
        "upload_directory_missing": "La alŝuta dosierujo ($1) estas nek trovebla nek kreebla de la retservilo.",
        "file-deleted-duplicate-notitle": "Dosiero identa al ĉi tiu dosiero estis forigita antaŭ nelonge kaj la titolo estis subpremita.\nVi demandu iun, kiu havas la eblecon, rigardi la subpremitajn dosierajn datojn, por kontroli la situacion antaŭ rea alŝutado.",
        "uploadwarning": "Alŝuta averto",
        "uploadwarning-text": "Bonvolu ŝanĝi la dosieran priskribon kaj reprovi.",
+       "uploadwarning-text-nostash": "Bonvolu realŝuti la dosieron, modifi la jenan priskribon, kaj reprovi.",
        "savefile": "Konservi dosieron",
        "uploaddisabled": "Alŝutado estas malŝaltita",
        "copyuploaddisabled": "Alŝuto de URL malfunkciigita.",
        "lockmanager-fail-closelock": "Ne povis fermi ŝlosadan dosieron por \"$1\".",
        "lockmanager-fail-deletelock": "Ne povis forigi ŝlosadan dosieron por \"$1\".",
        "lockmanager-fail-acquirelock": "Ne povis akiri ŝlosadon por \"$1\".",
-       "lockmanager-fail-openlock": "Ne povis malfermi ŝlosadan dosieron por \"$1\".",
+       "lockmanager-fail-openlock": "Ne povis malfermi ŝlosadan dosieron por \"$1\". Konfirmu ke via alŝuta dosierujo estas konfigurita ĝuste kaj via retservilo havas permeson por skribi al tiu dosierujo. Vidu https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory por plia informo.",
        "lockmanager-fail-releaselock": "Ne povis liberigi ŝlosadon por \"$1\".",
        "lockmanager-fail-db-bucket": "Ne povis kontakti sufiĉajn ŝlos-datumbazojn en ujo $1.",
        "lockmanager-fail-db-release": "Ne povis liberigi ŝlosadojn de datumbazao $1.",
        "uploadstash-bad-path-invalid": "Vojo ne estas valida.",
        "uploadstash-bad-path-unknown-type": "Nekonata tipo \"$1\".",
        "uploadstash-bad-path-unrecognized-thumb-name": "Nerekonita miniatura nomo.",
+       "uploadstash-bad-path-no-handler": "Neniu traktilo troviĝis por MIME-tipo $1 de dosiero $2.",
        "uploadstash-bad-path-bad-format": "Ŝlosilo \"$1\" ne estas valide aranĝita",
+       "uploadstash-file-not-found": "Ŝlosilo \"$1\" ne troviĝis en konservejo.",
        "uploadstash-file-not-found-no-thumb": "Ne povis akiri miniaturon.",
+       "uploadstash-file-not-found-no-local-path": "Neniu loka dosierindiko por malpligrandigitaĵo.",
+       "uploadstash-file-not-found-no-object": "Ne povis krei lokan dosieran objekton por miniaturo.",
+       "uploadstash-file-not-found-no-remote-thumb": "Akirado de miniaturo malsukcesis: $1\nRetadreso = $2",
+       "uploadstash-file-not-found-missing-content-type": "Ĉapo Content-Type mankas.",
+       "uploadstash-file-not-found-not-exists": "Dosierindiko aŭ ne troviĝis, aŭ ne indikas ordinaran dosieron",
+       "uploadstash-file-too-large": "Ne povas trakti dosieron pli grandan ol $1 bajtoj.",
+       "uploadstash-not-logged-in": "Neniu ensalutinta uzanto; dosiero devas aparteni al uzanto.",
+       "uploadstash-wrong-owner": "Ĉi tiu dosiero ($1) ne apartenas al la aktuala uzanto.",
+       "uploadstash-no-such-key": "Ŝlosilo $1 ne ekzistas kaj tial ne povas foriĝi.",
        "uploadstash-no-extension": "Dosiersufikso estas nula.",
        "uploadstash-zero-length": "Longo de dosiero estas nul.",
        "invalid-chunk-offset": "Malvalida deŝovo de dosierpeco",
        "protectedtitles-submit": "Montri titolojn",
        "listusers": "Uzantaro",
        "listusers-editsonly": "Montri uzantojn kun redaktoj nur",
+       "listusers-temporarygroupsonly": "Montri nur uzantojn en portempaj uzantogrupoj",
        "listusers-creationsort": "Ordigi laŭ dato de kreado",
        "listusers-desc": "Ordigi en malsupreniranta sinsekvo",
        "usereditcount": "$1 {{PLURAL:$1|redakto|redaktoj}}",
        "move": "Alinomi",
        "movethispage": "Alinomi ĉi tiun paĝon",
        "unusedimagestext": "La jenaj dosieroj ekzistas sed ne estas enmetas en iu ajn paĝo.\nBonvolu noti ke aliaj retejoj povas ligi dosieron kun rekta URL-o, kaj tial estas listebla ĉi tie malgraŭ estante aktive uzata.",
+       "unusedimagestext-categorizedimgisused": "La jenaj dosieroj ekzistas sed ne estas enkonstruitaj en ajnan paĝon. Ni konsideras enkategoriitajn bildojn uzataj, malgraŭ neuzadon en ajna paĝo.\nBonvolu noti ke aliaj retejoj eble ligas dosieron per rekta retadreso; tiuj bildoj estus en la jena listo, malgraŭ sia aktiva uzateco.",
        "unusedcategoriestext": "La paĝoj de la sekvanta kategorio jam ekzistas, sed neniu alia artikolo aŭ kategorio rilatas al ĝi.",
        "notargettitle": "Sen celpaĝo",
        "notargettext": "Vi ne precizigis, kiun paĝon aŭ uzanton priumi.",
        "apisandbox-dynamic-parameters-add-label": "Aldoni parametron:",
        "apisandbox-dynamic-parameters-add-placeholder": "Nomo de parametro",
        "apisandbox-dynamic-error-exists": "Parametro nomata \"$1\" jam ekzistas.",
+       "apisandbox-templated-parameter-reason": "Ĉi tiu [[Special:ApiHelp/main#main/templatedparams|ŝablona parametro]] estas disponata laŭ la {{PLURAL:$1|valoro|valoroj}} de $2.",
        "apisandbox-deprecated-parameters": "Evitindajn parametrojn",
        "apisandbox-fetch-token": "Aŭtoplenigu ĵetonon",
        "apisandbox-add-multi": "Aldoni",
        "apisandbox-sending-request": "Sendanta aplikprograminterfacan peton…",
        "apisandbox-loading-results": "Ricevas APIajn rezultojn…",
        "apisandbox-results-error": "Eraro okazis dum ŝutis la APIan petan respondon: $1.",
+       "apisandbox-results-login-suppressed": "Ĉi tiu peto estis traktita kiel tiu de elsalutinta uzanto, ĉar alie tio povus preterpasi Sam-Originan sekurecon. Notu ke la aŭtomata ĵetono-traktado de la sablujo de la API ne ĝuste funkcias kun tiaj petoj; bonvolu kompletigi malaŭtomate.",
        "apisandbox-request-selectformat-label": "Montri petan datenon kiel:",
+       "apisandbox-request-format-url-label": "URL informpeta signovico",
        "apisandbox-request-url-label": "Mendi URL-on.",
        "apisandbox-request-json-label": "Peti JSON-objekton:",
        "apisandbox-request-time": "Tempo de peto:{{PLURAL:$1|$1 ms}}",
        "wlshowhidebots": "robotojn",
        "wlshowhideliu": "registritajn uzantojn",
        "wlshowhideanons": "anonimajn uzantojn",
-       "wlshowhidepatr": "patrolitaj redaktoj",
+       "wlshowhidepatr": "pripatrolitaj redaktoj",
        "wlshowhidemine": "miajn redaktojn",
        "wlshowhidecategorization": "kategoriigon de paĝoj",
        "watchlist-options": "Opcioj por atentaro",
        "dellogpagetext": "Jen listo de la plej lastaj forigoj.",
        "deletionlog": "protokolo pri forigoj",
        "log-name-create": "Protokolo de paĝo-kreado",
+       "log-description-create": "Jen listo de lastatempa paĝo-kreado.",
        "logentry-create-create": "$1 {{GENDER:$2|kreis}} paĝon $3",
        "reverted": "Malfaris al antaŭa revisio",
        "deletecomment": "Kialo:",
        "delete-warning-toobig": "Ĉi tiu paĝo havas grandan redakto-historion, pli ol $1 {{PLURAL:$1|version|versiojn}}. Forigo de ĝi povas disrompigi operacion de {{SITENAME}}; forigu singarde.",
        "deleteprotected": "Vi ne povas forigi ĉi tiun paĝon ĉar ĝi estis protektita.",
        "deleting-backlinks-warning": "<strong>Atentigo:</strong>\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|Aliaj paĝoj]] ligas al aŭ transkludas tiun ĉi forigotan paĝon.",
+       "deleting-subpages-warning": "<strong>Averto:</strong> La forigota paĝo havas [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|unu subpaĝon|$1 subpaĝojn|51=pli ol 50 subpaĝoj}}]].",
        "rollback": "Restarigi antaŭan redakton",
        "rollback-confirmation-confirm": "Bonvolu konfirmi:",
        "rollback-confirmation-yes": "Amasmalfari",
        "contribsub2": "De {{GENDER:$3|$1}} ($2)",
        "contributions-subtitle": "Por {{GENDER:$3|$1}}",
        "contributions-userdoesnotexist": "Uzanto-konto \"$1\" ne estas registrita.",
+       "negative-namespace-not-supported": "Nomspaco kun negativa valoro ne esats subtenata.",
        "nocontribs": "Trovis neniajn redaktojn laŭ tiu kriterio.",
        "uctop": "nuna",
        "month": "Ekde monato (kaj pli frue):",
        "year": "Ekde jaro (kaj pli frue):",
+       "date": "Je dato (aŭ pli frue):",
        "sp-contributions-newbies": "Montri nur kontribuojn de novaj kontoj",
        "sp-contributions-newbies-sub": "Kontribuoj de novaj uzantoj. Forigitaj paĝoj ne estas montritaj.",
        "sp-contributions-newbies-title": "Kontribuoj de novaj uzantoj",
        "sp-contributions-newonly": "Montri nur redaktojn, kiuj kreis paĝon",
        "sp-contributions-hideminor": "Malvidigu redaktetojn",
        "sp-contributions-submit": "Serĉi",
+       "sp-contributions-outofrange": "Ne eblas montri iujn ajn rezultojn. La petita IP-intervalo estas pli granda ol la CIDR-limo de /$1.",
        "whatlinkshere": "Ligiloj ĉi tien",
        "whatlinkshere-title": "Paĝoj ligantaj al \"$1\"",
        "whatlinkshere-page": "Paĝo:",
        "ipb-confirm": "Konfirmi forbaron",
        "ipb-sitewide": "Tutreteja",
        "ipb-partial": "Parta",
+       "ipb-sitewide-help": "Ĉiu paĝo en la vikio kaj ĉia kontribuado.",
        "ipb-partial-help": "Specifaj paĝoj aŭ nomspacoj.",
        "ipb-pages-label": "Paĝoj",
        "ipb-namespaces-label": "Nomspacoj",
        "blocklist": "Forbaritaj uzantoj",
        "autoblocklist": "Aŭtomataj forbaroj",
        "autoblocklist-submit": "Serĉi",
+       "autoblocklist-legend": "Listi aŭtomatajn forbarojn",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Loka aŭtomata forbaro|Lokaj aŭtomataj forbaroj}}",
+       "autoblocklist-total-autoblocks": "Suma nombro de aŭtomataj forbaroj: $1",
+       "autoblocklist-empty": "La listo de aŭtomataj forbaroj estas malplena.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Alia aŭtomata forbaro|Aliaj aŭtomataj forbaroj}}",
        "ipblocklist": "Forbaritaj uzantoj",
        "ipblocklist-legend": "Trovi forbaritan uzanton.",
        "blocklist-userblocks": "Kaŝi konto-forbarojn",
        "blocklist-editing-page": "paĝoj",
        "blocklist-editing-ns": "nomspacoj",
        "ipblocklist-empty": "La forbarlibro estas malplena.",
-       "ipblocklist-no-results": "Ĉi tiu IP-adreso aŭ salutnomo ne estas forbarita.",
+       "ipblocklist-no-results": "Neniu forbaro troviĝas por la petita IP-adreso aŭ salutnomo.",
        "blocklink": "forbari",
        "unblocklink": "restarigi",
        "change-blocklink": "ŝanĝi forbaron",
        "ipb_expiry_old": "Limdato antaŭas la nuntempon.",
        "ipb_expiry_temp": "Kaŝitaj salutnomaj blokoj estu daŭraj.",
        "ipb_hide_invalid": "Ne povas subpremi ĉi tiun konton; ĝi havas {{PLURAL:$1|unu redakton|$1 redaktojn}}.",
+       "ipb_hide_partial": "Forbaro de kaŝita uzantnomo devas esti tut-reteja.",
        "ipb_already_blocked": "\"$1\" estas jam forbarita",
        "ipb-needreblock": "$1 estas jam forbarita. Ĉu vi volas ŝanĝi la opciojn?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Alia forbaro|Aliaj forbaroj}}",
        "ipb_blocked_as_range": "Eraro: La IP-adreso $1 ne estas forbarita rekte kaj ne povas esti malforbarita. Tamen ĝi estas forbarita kiel parto de la intervalo $2, kiu ne povas esti malforbarita.",
        "ip_range_invalid": "Malvalida IP-adresa intervalo.",
        "ip_range_toolarge": "IP-adresaj intervaloj pli grandaj ol /$1 estas malpermesataj.",
+       "ip_range_exceeded": "La IP-adresa intervalo estas tro granda. Permesata maksimumo: /$1.",
+       "ip_range_toolow": "IP-adresa intervalo estas efektive ne permesata.",
        "proxyblocker": "Forbarilo por prokuriloj.",
        "proxyblockreason": "Via IP-adreso estis forbarita ĉar ĝi estas malferma prokurilo. Bonvolu kontakti vian provizanto de retservo aŭ komputika helpisto kaj informu ilin de ĉi serioza problemo pri sekureco.",
        "sorbsreason": "Via IP-adreso estas listigita kiel malferma prokurilo en la DNSBL uzata de {{SITENAME}}.",
        "move-watch": "Atenti ĉi tiun paĝon",
        "movepagebtn": "Alinomi paĝon",
        "pagemovedsub": "Sukcesis alinomigo",
+       "cannotmove": "La paĝo ne povas moviĝi, pro la {{PLURAL:$1|jena kialo|jenaj kialoj}}:",
        "movepage-moved": "<strong>\"$1\" estis alinomita al \"$2\"</strong>",
        "movepage-moved-redirect": "Alidirektilo estis kreita.",
        "movepage-moved-noredirect": "La kreado de alidirektilo estis nuligita.",
+       "movepage-delete-first": "La cela paĝo havas troon da versioj por forigado per paĝo-movado. Bonvolu unue forigi la paĝon malaŭtomate, kaj poste reprovu.",
        "articleexists": "Paĝo kun tiu nomo jam ekzistas, aŭ la nomo kiun vi elektis ne validas.\nBonvolu elekti alian nomon.",
        "cantmove-titleprotected": "Vi ne povas movi paĝo al ĉi loko, ĉar la nova titolo estis protektita kontraŭ kreado",
        "movetalk": "Alinomi ankaŭ la diskutopaĝon.",
        "import-mapping-subpage": "Importi kiel subpaĝojn de la jena paĝo:",
        "import-upload-filename": "Dosiernomo:",
        "import-upload-username-prefix": "Intervikia prefikso:",
+       "import-assign-known-users": "Asigni redakton al loka uzanto, kiam la respondanta uzanto ekzistas loke",
        "import-comment": "Komento:",
        "importtext": "Bonvolu elporti la dosieron el la fonta vikio per la [[Special:Export|elportilo]]. Konservu ĝin sur via persona komputilo kaj poste alŝutu ĝin ĉi tien.",
        "importstart": "Importante paĝojn...",
        "pageinfo-user-id": "Identigilo de uzanto",
        "pageinfo-file-hash": "Haketa valoro",
        "pageinfo-view-protect-log": "Vidi la protekdadan protkolon por ĉi tiu paĝo.",
-       "markaspatrolleddiff": "Marki kiel patrolitan",
-       "markaspatrolledtext": "Marki ĉi tiun paĝon patrolita",
-       "markaspatrolledtext-file": "Marki ĉi tiu versio de dosiero kiel patrolita",
-       "markedaspatrolled": "Markita kiel patrolita",
-       "markedaspatrolledtext": "La elektita versio [[:$1]] estas markita kiel patrolita.",
+       "markaspatrolleddiff": "Marki kiel pripatrolitan",
+       "markaspatrolledtext": "Marki ĉi tiun paĝon kiel pripatrolitan",
+       "markaspatrolledtext-file": "Marki ĉi tiu versio de dosiero kiel pripatrolitan",
+       "markedaspatrolled": "Markita kiel pripatrolitan",
+       "markedaspatrolledtext": "La elektita versio [[:$1]] estas markita kiel pripatrolita.",
        "rcpatroldisabled": "Patrolado de lastaj ŝanĝoj malaktivigita",
        "rcpatroldisabledtext": "La funkcio patrolado de la lastaj ŝanĝoj estas nun malaktivigita.",
-       "markedaspatrollederror": "Ne povas marki kiel patrolitan",
-       "markedaspatrollederrortext": "Vi devas specifi version por marki kiel patrolitan.",
-       "markedaspatrollederror-noautopatrol": "Vi ne rajtas marki viajn proprajn ŝanĝojn kiel patrolitajn.",
-       "markedaspatrollednotify": "Ĉi tiun ŝanĝon al $1 markis kiel patrolatan.",
-       "markedaspatrollederrornotify": "Malsukcesis marki la dosieron kiel patrolatan.",
+       "markedaspatrollederror": "Ne povas marki kiel pripatrolitan",
+       "markedaspatrollederrortext": "Vi devas specifi version por marki kiel pripatrolitan.",
+       "markedaspatrollederror-noautopatrol": "Vi ne rajtas marki viajn proprajn ŝanĝojn kiel pripatrolitajn.",
+       "markedaspatrollednotify": "Ĉi tiun ŝanĝon al $1 markis kiel pripatrolitan.",
+       "markedaspatrollederrornotify": "Malsukcesis marki la dosieron kiel pripatrolitan.",
        "patrol-log-page": "Protokolo pri patrolado",
-       "patrol-log-header": "Jen protokolo de patrolitaj versioj.",
+       "patrol-log-header": "Jen protokolo de pripatrolitaj versioj.",
        "confirm-markpatrolled-button": "Ek!",
-       "confirm-markpatrolled-top": "Marki version $3 el $2 kiel patrolita?",
+       "confirm-markpatrolled-top": "Marki version $3 el $2 kiel pripatrolitan?",
        "deletedrevision": "Forigita malnova versio $1",
        "filedeleteerror-short": "Eraro dum forigo de dosiero: $1",
        "filedeleteerror-long": "Eraroj renkontritaj kiam forigante la dosieron:\n\n$1",
        "newimages-user": "IP-adreso aŭ uzantnomo",
        "newimages-newbies": "Montri nur kotribuojn de novaj kontoj",
        "newimages-showbots": "Montri alŝutojn per robotoj",
-       "newimages-hidepatrolled": "Malvidigi la patrolitajn alŝutitojn",
+       "newimages-hidepatrolled": "Malvidigi la pripatrolitajn alŝutitojn",
        "newimages-mediatype": "Dosiertipo de aŭdvidaĵo:",
        "noimages": "Nenio videbla.",
        "gallery-slideshow-toggle": "Baskuligi miniaturojn",
        "confirm-mcrundo-title": "Malfari ŝanĝon",
        "mcrundofailed": "Malfaro malsukcesis",
        "mcrundo-missingparam": "Postulataj parametroj mankas al peto.",
+       "mcrundo-changed": "La paĝo ŝanĝiĝis post kiam vi vidis la diferencon. Bonvolu revizii la novan ŝanĝon.",
        "mcrundo-parse-failed": "Malsukcesis sintaksa analizo de la nova versio: $1",
        "quotation-marks": "„$1“",
        "imgmultipageprev": "← antaŭa paĝo",
        "specialpages-group-developer": "Disvolvistaj iloj",
        "blankpage": "Malplena paĝo",
        "intentionallyblankpage": "Ĉi tiu paĝo intencie estas malplena kaj estas uzata por testado, ktp.",
+       "disabledspecialpage-disabled": "Jen paĝo malfunkciigita de sistema administranto.",
        "external_image_whitelist": " #Lasu ĉi tiun linion senŝanĝe<pre>\n#Enmetu parto de regula esprimo (nur la parton enmetinda en //) suben\n#Ĝi estos kongruita kun la URL-o de eksteraj (ligeblaj) bildoj\n#Kongruantaĵoj estos montritaj kiel bildoj; se ne eble montri, nur ligilo estos montrita\n#Linioj komencantaj kun # estas traktata kiel komentoj.\n#Ĉi tiu estas usklecodistinga.\n\n#Enmetu ĉiujn koderojn de regulaj esprimoj super ĉi tiu linio. Lasu la linion senŝanĝe.</pre>",
        "tags": "Validaj ŝanĝaj etikedoj",
        "tag-filter": "[[Special:Tags|Etikeda]] filtrilo:",
        "tag-mw-contentmodelchange": "ŝanĝo de enhavomodelo",
        "tag-mw-contentmodelchange-description": "Redaktoj kiuj [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel ŝanĝas la enhavmodelon] de paĝo",
        "tag-mw-new-redirect": "Nova alidrektilo",
+       "tag-mw-new-redirect-description": "Redaktoj kiuj kreas novajn alidirektigilojn aŭ ŝanĝas paĝojn al alidirektigiloj",
        "tag-mw-removed-redirect": "Forigis alidirektilon",
+       "tag-mw-removed-redirect-description": "Redaktoj kiuj ŝanĝas ekzistintan alidirektigilon al ne-alidirektigilon",
        "tag-mw-changed-redirect-target": "Ŝanĝis celon de alidirektilon",
+       "tag-mw-changed-redirect-target-description": "Redaktoj kiuj ŝanĝas la celon de alidirektigilo",
        "tag-mw-blank": "Vakigo",
+       "tag-mw-blank-description": "Redaktoj kiuj vakigis paĝon",
        "tag-mw-replace": "Anstataŭiginta",
+       "tag-mw-replace-description": "Redaktoj kiuj forigis pli ol 90% de la enhavo de paĝo",
        "tag-mw-rollback": "Amasmalfari",
+       "tag-mw-rollback-description": "Redaktoj kiuj malfaris antaŭajn ligilojn per la amasmalfara ligilo",
        "tag-mw-undo": "Malfari",
+       "tag-mw-undo-description": "Redaktoj kiuj malfaris antaŭajn ligilojn per la malfara ligilo",
        "tags-title": "Etikedoj",
        "tags-intro": "Ĉi tiu paĝo montras la etikedojn kun kiuj la programaro markus redakton, kaj iliaj signifoj.",
        "tags-tag": "Etikeda nomo",
        "logentry-block-reblock": "$1 {{GENDER:$2|ŝanĝis}} agordojn de forbaro por la {{GENDER:$4|uzanto $3}} por daŭro de $5 $6",
        "logentry-partialblock-block-page": "la {{PLURAL:$1|paĝo|paĝoj}} $2",
        "logentry-partialblock-block-ns": "la {{PLURAL:$1|nomspaco|nomspacoj}} $2",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|forbaris}} {{GENDER:$4|$3}} for de redaktado de $7 dum $5 $6",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|ŝanĝis}} agordojn de forbaro por la {{GENDER:$4|uzanto $3}}, tiel malebligante redaktojn de $7, por daŭro de $5 $6",
+       "logentry-non-editing-block-block": "$1 {{GENDER:$2|forbaris}} {{GENDER:$4|$3}} for de specifitaj neredaktaj agoj, por daŭro de $5 $6",
+       "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|ŝanĝis}} agordojn de forbaro por la {{GENDER:$4|uzanto $3}}, for de specifitaj neredaktaj agoj, por daŭro de $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|forbaris}} la {{GENDER:$4|uzanton $3}} por daŭro de $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|ŝanĝis}} agordojn de forbaro por la {{GENDER:$4|uzanto $3}} por daŭro de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importis}} $3 per dosiera alŝuto",
        "logentry-move-move-noredirect": "$1 movis paĝon $3 al $4 ne lasante alidirektilon",
        "logentry-move-move_redir": "$1 movis paĝon $3 al $4 anstataŭigante alidirektilon",
        "logentry-move-move_redir-noredirect": "$1 movis paĝon $3 al $4 anstataŭigante alidirektilon ne lasante alidirektilon",
-       "logentry-patrol-patrol": "$1 {{GENDER:$2|markis}} revizion $4 de paĝo $3 patrolita",
-       "logentry-patrol-patrol-auto": "$1 aŭtomate {{GENDER:$2|markis}} revizion $4 de paĝo $3 patrolita",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|markis}} version $4 de paĝo $3 pripatrolita",
+       "logentry-patrol-patrol-auto": "$1 aŭtomate {{GENDER:$2|markis}} revizion $4 de paĝo $3 kiel pripatrolitan",
        "logentry-newusers-newusers": "Konto de uzanto $1 estis {{GENDER:$2|kreita}}",
        "logentry-newusers-create": "Konto de uzanto $1 estis kreita",
        "logentry-newusers-create2": "Konto de uzanto $3 estis kreita de $1",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bitoko|bitokoj}}",
        "limitreport-expansiondepth": "Plej alta profundeco de etendo",
        "limitreport-expensivefunctioncount": "Nombro de kostaj sintaks-analizilaj funkcioj",
+       "limitreport-unstrip-depth": "Rikura profundo de funkcio 'unstrip'",
+       "limitreport-unstrip-size": "Grando post pligrandigo per funkcio 'unstrip'",
        "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|bajto|bajtoj}}",
        "expandtemplates": "Ŝablonetendilo",
        "expand_templates_intro": "Ĉi tiu speciala paĝo prenas vikitekston kaj rikure etendas ĉiujn ŝablonojn en ĝi.\nĜi etendas ankaŭ sintaksajn funkciojn kiel\n<code><nowiki>{{</nowiki>#language:…}}</code> kaj variablojn kiel\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nFakte, ĝi etendas preskaŭ ĉion en duoblaj krampoj.",
        "log-action-filter-newusers-create2": "Kreo de registrita uzanton",
        "log-action-filter-newusers-autocreate": "Aŭtomata kreo",
        "log-action-filter-newusers-byemail": "Kreo kun pasvorto sendita per retpoŝto",
-       "log-action-filter-patrol-patrol": "Malaŭtomata patrolo",
-       "log-action-filter-patrol-autopatrol": "Aŭtomata patrolo",
+       "log-action-filter-patrol-patrol": "Malaŭtomata patrolado",
+       "log-action-filter-patrol-autopatrol": "Aŭtomata patrolado",
        "log-action-filter-protect-protect": "Protekto",
        "log-action-filter-protect-modify": "Modifo de la protekto",
        "log-action-filter-protect-unprotect": "Malprotektado",
        "edit-error-long": "Eraroj:\n\n$1",
        "revid": "revizio $1",
        "pageid": "Identigilo de paĝo $1",
+       "interfaceadmin-info": "$1\n\nPermesoj pri redaktado de tut-retejaj CSS/JavaScript/JSON-dosieroj estis lastatempe disigitaj for de la rajto <code>editinterface</code>. Se vi ne komprenas kial vi ricevis ĉi tiun eraron, vidu la paĝon [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "etikedo &lt;html&gt; ne povas esti uzata ekster ordinaraj paĝoj.",
        "gotointerwiki": "Elirante retejon {{SITENAME}}",
        "gotointerwiki-invalid": "La specifita titolo ne estas valida.",
        "gotointerwiki-external": "Vi estas elironta la retejon {{SITENAME}} por viziti la retpaĝon [[$2]], en alia retejo.\n\n'''[$1 Ek al $1]'''",
+       "undelete-cantedit": "Vi ne povas malforigi ĉi tiun paĝon, ĉar redakti ĉi tiun paĝon ne estas permesate al vi",
+       "undelete-cantcreate": "Vi ne povas malforigi ĉi tiun paĝon, ĉar ekzistas neniu paĝo de tiu nomo, kaj krei ĉi tiun paĝon ne estas permesate al vi.",
        "pagedata-title": "Paĝaj datumoj",
+       "pagedata-text": "Ĉi tiu paĝo provizas datenan interfacon al paĝoj. Bonvolu provizi la paĝan titolon en la retadreso, per la subpaĝa sintakso.\n* Enhavo-intertraktado funkcias laŭ la HTTP-ĉapo Accept de via TTT-kliento. Tiel, la paĝa dateno proviziĝos laŭ la dosieraranĝo preferata de via TTT-kliento.",
+       "pagedata-not-acceptable": "Neniu kongrua dosierformo troviĝas. Subtenataj MIME-tipoj: $1",
        "pagedata-bad-title": "Nevalida titolo: \"$1\".",
        "unregistered-user-config": "Por sekurecaj kialoj, uzanto-subpaĝoj de JavaScript, CSS, aŭ JSON ne povas esti ŝargata de neregistritaj uzantoj.",
        "passwordpolicies": "Reguloj pri pasvortoj",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Pasvorto ne povas esti unu el la cent mil plej popularaj pasvortoj",
        "passwordpolicies-policyflag-forcechange": "devas ŝanĝi dum ensaluto",
        "passwordpolicies-policyflag-suggestchangeonlogin": "sugesti ŝanĝadon dum ensaluto",
+       "easydeflate-invaliddeflate": "Provizita enhavo ne estas ĝuste densigita",
        "unprotected-js": "Pro sekurecaj kialoj, JavaScript ne povas esti ŝargata el neprotektataj paĝoj. Bonvolu nur krei JavaScript en la nomspaco MediaWiki: aŭ kiel subpaĝo de Uzanto.",
        "userlogout-continue": "Se vi vola elsaluti, bonvolu  [$1 iri al la elsaluta paĝo].",
        "userlogout-sessionerror": "Elsalutado malsukcesis pro sesia eraro. Bonvolu [$1 reprovi]."
index c8178f0..75ecf03 100644 (file)
@@ -7,7 +7,8 @@
                        "Macofe",
                        "MarcoAurelio",
                        "XanaG",
-                       "La Mantis"
+                       "La Mantis",
+                       "Agusbou2015"
                ]
        },
        "tog-underline": "Subrayado de enlaces:",
        "tooltip-ca-talk": "Discusión acerca de la página de contenido",
        "tooltip-ca-edit": "Editar esta página",
        "tooltip-ca-history": "Versiones anteriores de esta página y sus autores",
-       "tooltip-ca-watch": "Añadir esta página a tu lista de seguimiento",
+       "tooltip-ca-watch": "Añadir esta página a su lista de seguimiento",
        "tooltip-ca-unwatch": "Quitar esta página de su lista de seguimiento",
        "tooltip-search": "Buscar en {{SITENAME}}",
        "tooltip-search-fulltext": "Busca este texto en las páginas",
        "tooltip-n-randompage": "Cargar una página al azar",
        "tooltip-n-help": "El lugar para aprender",
        "tooltip-t-whatlinkshere": "Lista de todas las páginas del wiki que enlazan aquí",
-       "tooltip-t-recentchangeslinked": "Cambios recientes en las páginas que enlazan con ésta",
+       "tooltip-t-recentchangeslinked": "Cambios recientes en las páginas que enlazan con esta",
        "tooltip-t-upload": "Subir imágenes o archivos multimedia",
        "tooltip-t-specialpages": "Lista de todas las páginas especiales",
        "tooltip-t-print": "Versión imprimible de esta página",
index b3cacfc..902e7dc 100644 (file)
                        "Agusbou2015"
                ]
        },
-       "tog-underline": "Enlaces a subrayar:",
+       "tog-underline": "Enlaces que se van a subrayar:",
        "tog-hideminor": "Ocultar las ediciones menores en cambios recientes",
        "tog-hidepatrolled": "Ocultar las ediciones verificadas de cambios recientes",
        "tog-newpageshidepatrolled": "Ocultar, de la lista de páginas nuevas, las páginas verificadas",
        "passwordreset-domain": "Dominio:",
        "passwordreset-email": "Dirección de correo electrónico:",
        "passwordreset-emailtitle": "Detalles de la cuenta en {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Alguien (probablemente tú, desde la dirección IP $1) ha solicitado el restablecimiento de tu contraseña en {{SITENAME}} ($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}}\na esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} caducarán en {{PLURAL:$5|un día|$5 días}}.\nAhora puedes iniciar sesión y establecer una nueva contraseña. Si fue otra persona la que realizó esta solicitud, o si ya recuerdas tu contraseña original y, por tanto, no deseas cambiarla, puedes ignorar este mensaje y continuar usando tu contraseña anterior.",
-       "passwordreset-emailtext-user": "El usuario $1 de {{SITENAME}} solicitó el restablecimiento de tu contraseña en {{SITENAME}}\n($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}} a esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} caducarán en {{PLURAL:$5|un día|$5 días}}.\nAhora puedes iniciar sesión y establecer una nueva contraseña. Si fue otra persona la que realizó esta solicitud, o si ya recuerdas tu contraseña original y, por tanto, no deseas cambiarla, puedes ignorar este mensaje y continuar usando tu contraseña anterior.",
+       "passwordreset-emailtext-ip": "Alguien (probablemente tú, desde la dirección IP $1) ha solicitado el restablecimiento de tu contraseña en {{SITENAME}} ($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}}\na esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal caducará|Estas contraseñas temporales caducarán}} dentro de {{PLURAL:$5|un día|$5 días}}.\nAhora puedes iniciar sesión y establecer una nueva contraseña. Si fue otra persona la que realizó esta solicitud, o si ya recuerdas tu contraseña original y, por tanto, no deseas cambiarla, puedes ignorar este mensaje y continuar usando tu contraseña anterior.",
+       "passwordreset-emailtext-user": "El usuario $1 de {{SITENAME}} solicitó el restablecimiento de tu contraseña en {{SITENAME}}\n($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}} a esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal caducará|Estas contraseñas temporales caducarán}} dentro de {{PLURAL:$5|un día|$5 días}}.\nAhora puedes iniciar sesión y establecer una nueva contraseña. Si fue otra persona la que realizó esta solicitud, o si ya recuerdas tu contraseña original y, por tanto, no deseas cambiarla, puedes ignorar este mensaje y continuar usando tu contraseña anterior.",
        "passwordreset-emailelement": "Nombre de {{GENDER:$1|usuario|usuaria}}: \n$1\n\nContraseña temporal: \n$2",
        "passwordreset-emailsentemail": "Si esta dirección de correo electrónico está asociada a tu cuenta, entonces se enviará un correo electrónico para restablecer la contraseña.",
        "passwordreset-emailsentusername": "Si existe una dirección de correo electrónico asociada a este nombre de usuario, entonces se enviará un correo para restablecer la contraseña.",
        "mw-widgets-abandonedit-keep": "Continuar editando",
        "mw-widgets-abandonedit-title": "¿Seguro?",
        "mw-widgets-copytextlayout-copy": "Copiar",
+       "mw-widgets-copytextlayout-copy-fail": "No se pudo copiar en el portapapeles.",
+       "mw-widgets-copytextlayout-copy-success": "Copiado en el portapapeles",
        "mw-widgets-dateinput-no-date": "Ninguna fecha seleccionada",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "passwordpolicies-policyflag-forcechange": "debe cambiar al acceder a la cuenta",
        "passwordpolicies-policyflag-suggestchangeonlogin": "sugerir cambio al acceder a la cuenta",
        "easydeflate-invaliddeflate": "El contenido proporcionado no esta comprimido correctamente",
-       "unprotected-js": "Por razones de seguridad, JavaScript no se puede cargar desde páginas desprotegidas. Crea javascript solo en MediaWiki: espacio de nombres o como subpágina de usuario"
+       "unprotected-js": "Por razones de seguridad, JavaScript no se puede cargar desde páginas desprotegidas. Crea javascript solo en MediaWiki: espacio de nombres o como subpágina de usuario",
+       "userlogout-continue": "Si deseas cerrar sesión, [$1 continúa a la página de cierre de sesión].",
+       "userlogout-sessionerror": "No se pudo cerrar la sesión debido a un error de sesión. [$1 Inténtalo de nuevo]."
 }
index 5827dba..ed6879a 100644 (file)
        "virus-scanfailed": "skaneerimine ebaõnnestus (veakood $1)",
        "virus-unknownscanner": "tundmatu viirusetõrje:",
        "logouttext": "<strong>Oled nüüd välja logitud.</strong>\n\nPane tähele, et seni, kuni sa pole brauseri puhvrit tühjendanud, võidakse mõni lehekülg endiselt kuvada nii nagu oleksid ikka sisse logitud.",
+       "logging-out-notify": "Oled välja logimas, palun oota.",
+       "logout-failed": "Praegu ei saa välja logida: $1",
        "cannotlogoutnow-title": "Praegu ei saa välja logida",
        "cannotlogoutnow-text": "Väljalogimine pole võimalik, kui kasutad $1.",
        "welcomeuser": "Tere tulemast, $1!",
        "filehist-dimensions": "Mõõtmed",
        "filehist-filesize": "Faili suurus",
        "filehist-comment": "Kommentaar",
-       "imagelinks": "Failikasutus",
+       "imagelinks": "Faili kasutus",
        "linkstoimage": "Seda faili {{PLURAL:$1|kasutab järgmine lehekülg|kasutavad järgmised $1 lehekülge}}:",
        "linkstoimage-more": "Seda faili kasutab enam kui {{PLURAL:$1|üks lehekülg|$1 lehekülge}}.\nJärgmises loendis on näidatud ainult {{PLURAL:$1|esimene lehekülg|esimesed $1 lehekülge}}, mis faili {{PLURAL:$1|kasutab|kasutavad}}.\n[[Special:WhatLinksHere/$2|Kogu loetelu]] on saadaval.",
        "nolinkstoimage": "Seda faili ei kasuta ükski lehekülg.",
        "blocklink": "blokeeri",
        "unblocklink": "lõpeta blokeerimine",
        "change-blocklink": "muuda blokeeringut",
+       "empty-username": "(kasutajanimi puudub)",
        "contribslink": "kaastöö",
        "emaillink": "saada e-kiri",
        "autoblocker": "Automaatselt blokeeritud, kuna [[User:$1|$1]] on hiljuti sinu IP-aadressi kasutanud.\nPõhjus: $2",
        "tag-mw-changed-redirect-target-description": "Muudatused, millega muudetakse ümbersuunamise sihtkoht",
        "tag-mw-blank": "Tühjendamine",
        "tag-mw-blank-description": "Muudatused, millega lehekülg tühjendatakse",
-       "tag-mw-replace": "Asendatud",
+       "tag-mw-replace": "Asendamine",
        "tag-mw-replace-description": "Muudatused, millega asendatakse lehekülje sisust enam kui 90%",
        "tag-mw-rollback": "Tühistamine",
        "tag-mw-rollback-description": "Muudatused, millega eelmised muudatused pööratakse tagasi, kasutades tühistuslinki",
        "tags-manage-no-permission": "Sul pole õigust muudatusmärgiseid hallata.",
        "tags-manage-blocked": "Muudatusmärgiseid ei saa hallata, kui {{GENDER:$1|oled}} blokeeritud.",
        "tags-create-heading": "Uue märgise koostamine",
-       "tags-create-explanation": "Vaikimisi on vastkoostatud märgised kasutajate ja robotite jaoks kasutatavad.",
+       "tags-create-explanation": "Uute märgiste kasutus on vaikimisi kasutajatele ja robotitele lubatud.",
        "tags-create-tag-name": "Märgise nimi:",
        "tags-create-reason": "Põhjus:",
        "tags-create-submit": "Koosta",
        "mw-widgets-abandonedit-discard": "Loobu muudatustest",
        "mw-widgets-abandonedit-keep": "Jätka redigeerimist",
        "mw-widgets-abandonedit-title": "Kas oled kindel?",
+       "mw-widgets-copytextlayout-copy": "Kopeeri",
+       "mw-widgets-copytextlayout-copy-fail": "Ei õnnestunud lõikelauale kopeerida.",
+       "mw-widgets-copytextlayout-copy-success": "Kopeeritud lõikelauale.",
        "mw-widgets-dateinput-no-date": "Kuupäev valimata",
        "mw-widgets-dateinput-placeholder-day": "AAAA-KK-PP",
        "mw-widgets-dateinput-placeholder-month": "AAAA-KK",
index e814327..54682ca 100644 (file)
@@ -13,7 +13,8 @@
                        "Macofe",
                        "MarcoAurelio",
                        "Sanbec",
-                       "Vivaelcelta"
+                       "Vivaelcelta",
+                       "Agusbou2015"
                ]
        },
        "exif-imagewidth": "Anchura",
        "exif-copyrighted-false": "No se ha definido el estado del copyright",
        "exif-photometricinterpretation-0": "Blanco y negro (blanco es 0)",
        "exif-photometricinterpretation-1": "Blanco y negro (el negro es 0)",
+       "exif-photometricinterpretation-3": "Paleta",
        "exif-photometricinterpretation-4": "Máscara de transparencia",
        "exif-photometricinterpretation-5": "Separados (Probablemente CMYK)",
+       "exif-photometricinterpretation-8": "CIE L*a*b*",
+       "exif-photometricinterpretation-9": "CIE L*a*b* (codificación ICC)",
+       "exif-photometricinterpretation-10": "CIE L*a*b* (codificación ITU)",
        "exif-photometricinterpretation-32803": "Matriz de filtro de color",
        "exif-unknowndate": "Fecha desconocida",
        "exif-orientation-1": "Normal",
index c936ce5..09417f4 100644 (file)
@@ -62,7 +62,8 @@
                        "OneMember",
                        "Valtlait",
                        "Laurianttila",
-                       "Vlad5250"
+                       "Vlad5250",
+                       "Antsa"
                ]
        },
        "tog-underline": "Linkkien alleviivaus:",
        "content-json-empty-object": "Tyhjä objekti",
        "content-json-empty-array": "Tyhjä array",
        "deprecated-self-close-category": "Sivut, joissa on virheellisiä itsensäsulkevia HTML-tageja",
-       "deprecated-self-close-category-desc": "Sivulla on virheellisiä itsensäsulkevia HTML-tageja, kuten <code>&lt;b/></code> tai <code>&lt;span/></code>. Niiden käyttäytyminen muuttuu pian HTLM5:n määritysten mukaiseksi, joten niiden käyttö wikitekstissä on vanhentunut.",
+       "deprecated-self-close-category-desc": "Sivulla on virheellisiä itsensäsulkevia HTML-tageja, kuten <code>&lt;b/></code> tai <code>&lt;span/></code>. Niiden käyttäytyminen muuttuu pian HTML5:n määritysten mukaiseksi, joten niiden käyttö wikitekstissä on vanhentunut.",
        "duplicate-args-warning": "<strong>Varoitus:</strong> [[:$1]] kutsuu mallinetta [[:$2]] niin, että parametrille ”$3” on annettu enemmän kuin yksi arvo. Ainoastaan viimeksi annettu arvo otetaan huomioon.",
        "duplicate-args-category": "Sivut, jotka käyttävät kaksinkertaisia argumentteja mallinekutsuissa",
        "duplicate-args-category-desc": "Tämä sivu sisältää sellaisia mallinekutsuja, jotka käyttävät kaksi kertaa samaa argumenttia kuten <nowiki>{{foo|bar=1|bar=2}}</nowiki></code> taikka <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "mw-widgets-abandonedit-discard": "Hylkää muutokset",
        "mw-widgets-abandonedit-keep": "Jatka muokkaamista",
        "mw-widgets-abandonedit-title": "Oletko varma?",
+       "mw-widgets-copytextlayout-copy": "Kopioi",
+       "mw-widgets-copytextlayout-copy-success": "Kopioitu leikepöydälle",
        "mw-widgets-dateinput-no-date": "Ei ole valittu mitään päivää",
        "mw-widgets-dateinput-placeholder-day": "VVVV-KK-PP",
        "mw-widgets-dateinput-placeholder-month": "VVVV-KK",
index 60d818b..ae29db9 100644 (file)
        "nouserspecified": "Vous devez saisir un nom d’utilisateur.",
        "login-userblocked": "{{GENDER:$1|Cet utilisateur|Cette utilisatrice}} est bloqué{{GENDER:$1||e}}. La connexion n’est pas autorisée.",
        "wrongpassword": "Le nom d’utilisateur ou le mot de passe est incorrect.\nVeuillez essayer à nouveau.",
-       "wrongpasswordempty": "Vous n’avez entré aucun mot de passe.\nVeuillez essayer à nouveau.",
+       "wrongpasswordempty": "Vous n’avez saisi aucun mot de passe.\nVeuillez essayer à nouveau.",
        "passwordtooshort": "Votre mot de passe doit contenir au moins $1 caractère{{PLURAL:$1||s}}.",
        "passwordtoolong": "Les mots de passe ne peuvent pas dépasser $1 caractère{{PLURAL:$1||s}}.",
        "passwordtoopopular": "Les mots de passe trop courants ne peuvent pas être utilisés. Veuillez choisir un mot de passe plus difficile à deviner.",
        "edit-hook-aborted": "Échec de la modification par une extension.\nAucune explication n’a été retournée.",
        "edit-gone-missing": "N’a pas pu mettre à jour la page.\nIl semble qu’elle ait été supprimée.",
        "edit-conflict": "Conflit de modification.",
-       "edit-no-change": "Votre modification a été ignorée car aucun changement n’a été fait au texte.",
+       "edit-no-change": "Votre modification a été ignorée car aucun changement n’a été apporté au texte.",
        "edit-slots-cannot-add": "{{PLURAL:$1|L’emplacement suivant n’est pas supporté|Les emplacements suivants ne sont pas supportés}} ici : $2.",
        "edit-slots-cannot-remove": "{{PLURAL:$1|L’emplacement suivant est obligatoire et ne peut pas être supprimé|Les emplacements suivants sont obligatoires et ne peuvent pas être supprimés}} : $2.",
        "edit-slots-missing": "{{PLURAL:$1|L’emplacement suivant est absent|Les emplacements suivants sont absents}} : $2.",
        "sharedupload-desc-here": "Ce fichier provient de $1. Il peut être utilisé par d'autres projets.\nSa description sur sa [$2 page de description] est affichée ci-dessous.",
        "sharedupload-desc-edit": "Ce fichier provient de : $1. Il peut être utilisé par d'autres projets.\nVous voulez peut-être modifier la description sur sa [$2 page de description].",
        "sharedupload-desc-create": "Ce fichier provient de : $1. Il peut être utilisé par d'autres projets.\nVous voulez peut-être modifier la description sur sa [$2 page de description].",
-       "filepage-nofile": "Aucun fichier de ce nom existe.",
-       "filepage-nofile-link": "Aucun fichier de ce nom n'existe, mais vous pouvez [$1 en importer un].",
+       "filepage-nofile": "Aucun fichier de ce nom n’existe.",
+       "filepage-nofile-link": "Aucun fichier de ce nom nexiste, mais vous pouvez [$1 en importer un].",
        "uploadnewversion-linktext": "Importer une nouvelle version de ce fichier",
        "shared-repo-from": "de : $1",
        "shared-repo": "un dépôt partagé",
-       "shared-repo-name-wikimediacommons": "Wikimédia Commons",
+       "shared-repo-name-wikimediacommons": "Wikimedia Commons",
        "filepage.css": "/* Les styles CSS placés ici sont inclus dans la page de description du fichier, également incluse sur les clients wikis étrangers */",
        "upload-disallowed-here": "Vous ne pouvez pas remplacer ce fichier.",
        "filerevert": "Rétablir $1",
        "imported-log-entries": "$1 {{PLURAL:$1|entrée|entrées}} du journal {{PLURAL:$1|importée|importées}}.",
        "importfailed": "Échec de l'importation : <nowiki>$1</nowiki>",
        "importunknownsource": "Type inconnu de la source à importer",
-       "importnoprefix": "Aucun prefixe interwiki n’a été fourni",
+       "importnoprefix": "Aucun préfixe interwiki n’a été fourni",
        "importcantopen": "Impossible d'ouvrir le fichier à importer",
        "importbadinterwiki": "Mauvais lien inter-wiki",
        "importsuccess": "L'importation a réussi !",
-       "importnosources": "Aucun wiki source n'a été défini et l'import direct d'historiques est désactivé.",
+       "importnosources": "Aucun wiki source n’a été défini et le téléversement direct des historiques est désactivé.",
        "importnofile": "Aucun fichier d'importation n'a été envoyé.",
        "importuploaderrorsize": "L'import du fichier a échoué.\nSa taille est supérieure au maximum autorisé pour l'import de fichier.",
        "importuploaderrorpartial": "L'import du fichier échoué.\nSon contenu n'a été transféré que partiellement.",
        "fileduplicatesearch-info": "$1 × $2 pixels<br />Taille du fichier : $3<br />Type MIME : $4",
        "fileduplicatesearch-result-1": "Le fichier « $1 » n'a aucun doublon.",
        "fileduplicatesearch-result-n": "Le fichier « $1 » a {{PLURAL:$2|1 doublon|$2 doublons}}.",
-       "fileduplicatesearch-noresults": "Aucun fichier nommé « $1 » n'a été trouvé.",
+       "fileduplicatesearch-noresults": "Aucun fichier nommé « $1 » na été trouvé.",
        "specialpages": "Pages spéciales",
        "specialpages-note-top": "Légende",
        "specialpages-note-restricted": "* Pages spéciales normales.\n* <span class=\"mw-specialpagerestricted\">Pages spéciales restreintes.</span>",
index f5bf7b8..3705352 100644 (file)
@@ -43,9 +43,9 @@
        "tog-minordefault": "Alle feroarings standert as fan lytse betsjutting markearje",
        "tog-previewontop": "Foarfertoaning werjaan boppe it bewurkingsfjild",
        "tog-previewonfirst": "Foarfertoaning werjaan by it begjin fan 'e bewurking",
-       "tog-enotifwatchlistpages": "E-mail my as in side op myn folchlist feroare is.",
+       "tog-enotifwatchlistpages": "My e-maile at in side of bestân op myn folchlist feroare is",
        "tog-enotifusertalkpages": "E-mail my as myn oerlisside feroare wurdt",
-       "tog-enotifminoredits": "E-mail my ek by feroarings fan lytse betsjutting oan siden en bestannen",
+       "tog-enotifminoredits": "My ek e-maile by feroarings fan lytse betsjutting oan siden en bestannen",
        "tog-enotifrevealaddr": "Myn e-mailadres sjen litte yn e-mailberjochten",
        "tog-shownumberswatching": "It tal meidoggers sjen litte dat dizze side folget",
        "tog-oldsig": "Jo besteande sinjatuer:",
@@ -60,7 +60,7 @@
        "tog-watchlisthideanons": "Bewurkings fan anonime meidoggers ferbergje yn 'e folchlist",
        "tog-watchlisthidepatrolled": "Markearre feroarings op myn folchlist ferskûlje",
        "tog-watchlisthidecategorization": "Kategorisearjen fan siden ferbergje yn 'e folchlist",
-       "tog-ccmeonemails": "Stjoer my in kopy fan e-mails dy't ik nei oare meidoggers stjoer",
+       "tog-ccmeonemails": "My in kopy stjoere fan e-mails dy't ik nei oare meidoggers stjoer",
        "tog-diffonly": "Under ferskillen de sideynhâld net sjen litte",
        "tog-showhiddencats": "Ferburgen kategoryen werjaan",
        "tog-norollbackdiff": "Gjin ferskillen sjen litte nei it útfieren fan weromdraaien",
        "newwindow": "(nij finster)",
        "cancel": "Annulearje",
        "moredotdotdot": "Mear...",
+       "morenotlisted": "Dizze list kin ûnfolslein wêze.",
        "mypage": "Myn side",
        "mytalk": "Oerlis",
        "anontalk": "Oerlis",
        "editold": "bewurkje",
        "viewsourceold": "boarnetekst besjen",
        "editlink": "bewurkje",
-       "viewsourcelink": "besjoch de boarne",
+       "viewsourcelink": "boarne besjen",
        "editsectionhint": "Dielside bewurkje: $1",
        "toc": "Ynhâld",
        "showtoc": "sjen litte",
        "feed-atom": "Atom",
        "feed-rss": "RSS",
        "red-link-title": "$1 (de side bestiet net)",
+       "sort-descending": "Ofrinnend sortearje",
+       "sort-ascending": "Oprinnend sortearje",
        "nstab-main": "Side",
        "nstab-user": "Meidoggerside",
        "nstab-media": "Mediaside",
        "virus-scanfailed": "scan is mislearre (koade $1)",
        "virus-unknownscanner": "ûnbekend antivirus:",
        "logouttext": "<strong>Jo binne no ôfmeld.</strong>\n\nTink derom dat guon siden trochgeand werjûn wurde kinne krekt as wiene jo noch oanmeld, oant jo de oerslach fan jo webblêder leegje.",
+       "logging-out-notify": "Jo wurde ôfmeld, efkes wachtsje.",
        "welcomeuser": "Wolkom, $1!",
        "yourname": "Meidochnamme:",
        "userlogin-yourname": "Meidochnamme",
        "resetpass_announce": "Jo binne oanmeld mei in tydlike koade dy't jo per e-mail tastjoerd is. Fier in nij wachtwurd yn om it oanmelden ôf te meitsjen.",
        "resetpass_header": "Akkountwachtwurd feroarje",
        "oldpassword": "Ald wachtwurd",
-       "newpassword": "Nij wachtwurd",
-       "retypenew": "Nij wachtwurd (nochris)",
+       "newpassword": "Nij wachtwurd:",
+       "retypenew": "Nij wachtwurd (nochris):",
        "resetpass_submit": "Wachtwurd ynstelle en oanmelde",
        "changepassword-success": "Jo wachtwurd is feroare.",
        "resetpass_forbidden": "Wachtwurden kinne net feroare wurde",
        "templatesusedpreview": "{{PLURAL:$1|Sjabloan|Sjabloanen}} dy't yn dizze bewurking brûkt wurde:",
        "templatesusedsection": "{{PLURAL:$1|Sjabloan|Sjabloanen}} dy't brûkt wurde yn dizze subkop:",
        "template-protected": "(befeilige)",
-       "template-semiprotected": "(semi-befeilige)",
+       "template-semiprotected": "(semy-befeilige)",
        "hiddencategories": "Dizze side falt yn de folgjende ferburgen\n{{PLURAL:$1|kategory|kategoryen}}:",
        "edittools": "<!-- Tekst hjir stiet ûnder bewurkingsfjilden en oanbringfjilden.  -->",
        "edittools-upload": "-",
        "timezoneregion-europe": "Jeropa",
        "timezoneregion-indian": "Yndyske Oseaan",
        "timezoneregion-pacific": "Stille Oseaan",
-       "allowemail": "Oare meidoggers tastean my te e-mailen",
+       "allowemail": "Oare meidoggers tastean om my te e-mailen",
        "email-allow-new-users-label": "E-mails fan krekt nije meidoggers tastean",
+       "email-blacklist-label": "Dizze meidoggers net tastean om my te e-mailen:",
        "prefs-searchoptions": "Sykjen",
        "prefs-namespaces": "Nammeromten",
        "default": "standert",
        "yourrealname": "Wiere namme:",
        "yourlanguage": "Taal:",
        "yournick": "Nije sinjatuer:",
+       "prefs-help-signature": "Reäksjes op oerlissiden hearre ûndertekene te wurden mei \"<nowiki>~~~~</nowiki>\", wat omset wurdt nei jo sinjatuer mei in datumstimpel.",
        "badsig": "Unjildige sinjatuer yn koadefoarm.\nKontrolearje de HTML-tags.",
        "badsiglength": "Bynamme is te lang; dy moat koarter as $1 {{PLURAL:$1|teken|tekens}} wêze.",
        "yourgender": "Op hokker wize wolle jo graach beskreaun wurde?",
        "email": "E-mail",
        "prefs-help-realname": "Wiere namme is gjin ferplichting; as jo dy opjouwe kin dy namme brûkt wurde om jo erkenning te jaan foar jo wurk.",
        "prefs-help-email": "In e-mailadres hoecht net, mar is al nedich foar it op 'e nij oanmeitsjen fan jo wachtwurd, at jo dat ferjitte.",
+       "prefs-help-email-others": "Jo kinne ek kieze oft oaren jo mei de e-mail berikke kinne, troch in keppeling op jo meidogger- as oerlisside.\nJo e-mailadres wurdt net toand at oare meidoggers kontakt mei jo opnimme.",
        "prefs-help-email-required": "Hjir is in e-mailadres foar nedich.",
        "prefs-info": "Basisynformaasje",
        "prefs-i18n": "Taaloanpassings",
        "protect-locked-dblock": "It befeiligingsnivo kin net feroare wurde om't de database sletten is.\nHjir binne de hjoeddeiske ynstellingen foar de side '''$1''':",
        "protect-locked-access": "'''Jo akkount hat gjin rjochten om it befeiligingsnivo te feroarjen.'''\nDit binne de rinnende ynstellingen foar de side '''$1''':",
        "protect-cascadeon": "Dizze side is op 't stuit befeilige, om't er yn 'e folgjende {{PLURAL:$1|side|siden}} opnommen is, dy't befeilige {{PLURAL:$1|is|binne}} mei de kaskade-opsje. It befeiligingsnivo feroarje hat alhiel gjin effekt.",
-       "protect-default": "Tastean foar alle meidoggers",
+       "protect-default": "Tastien foar alle meidoggers",
        "protect-fallback": "Hjir is it rjocht \"$1\" foar nedich",
        "protect-level-autoconfirmed": "Slút anonymen út",
        "protect-level-sysop": "Allinnich behearders",
        "minimum-size": "Min. grutte",
        "maximum-size": "Max. grutte:",
        "pagesize": "(bytes)",
-       "restriction-edit": "Bewurkje",
-       "restriction-move": "Omneame",
+       "restriction-edit": "Bewurkjen",
+       "restriction-move": "Omneamen",
        "restriction-create": "Oanmeitsje",
-       "restriction-upload": "Oanbiede",
+       "restriction-upload": "Oanbieden",
        "restriction-level-sysop": "folslein skoattele",
        "restriction-level-autoconfirmed": "skoattele foar anonymen",
        "restriction-level-all": "alle nivo's",
        "whatlinkshere-next": "{{PLURAL:$1|neikommende|$1 neikommend}}",
        "whatlinkshere-links": "← keppelings",
        "whatlinkshere-hideredirs": "$1 trochferwizings",
-       "whatlinkshere-hidetrans": "$1 trânsklúzjes",
+       "whatlinkshere-hidetrans": "$1 transklúzjes",
        "whatlinkshere-hidelinks": "$1 keppelings",
        "whatlinkshere-filters": "Filters",
        "blockip": "Slút {{GENDER:$1|meidogger}} út",
        "creditspage": "Auteursside",
        "spamprotectiontext": "De side dy't jo fêstlizze woene is blokkearre troch in spam filter. Dit wurdt wierskynlik feroarsake troch in ferwizing nei in ekstern webstee.",
        "spamprotectionmatch": "De neikommende tekst hat it spam filter aktivearre: $1",
+       "pageinfo-title": "Gegevens oangeande \"$1\"",
+       "pageinfo-not-current": "Spitigernôch kin dizze ynformaasje net jûn wurde foar âlde wizigings.",
        "pageinfo-header-basic": "Basisynformaasje",
-       "pageinfo-header-edits": "Skiednis bewurkje",
+       "pageinfo-header-edits": "Bewurkingsskiednis",
        "pageinfo-header-restrictions": "Sidebefeiliging",
        "pageinfo-header-properties": "Side-eigenskippen",
-       "pageinfo-display-title": "Werjeftetitel",
-       "pageinfo-length": "Sidelingte (yn bytes)",
+       "pageinfo-display-title": "Skermtitel",
+       "pageinfo-default-sort": "Standert sortearkaai",
+       "pageinfo-length": "Sidegrutte (yn bytes)",
+       "pageinfo-namespace": "Nammeromte",
        "pageinfo-article-id": "Sidenûmer",
-       "pageinfo-language": "Taal fan de side",
-       "pageinfo-content-model": "Sideynhâldmodel",
+       "pageinfo-language": "Taal sideynhâld",
+       "pageinfo-language-change": "wizigje",
+       "pageinfo-content-model": "Ynhâldsmodel side",
+       "pageinfo-content-model-change": "wizigje",
+       "pageinfo-robot-policy": "Yndeksearjen troch robots",
        "pageinfo-robot-index": "Tastien",
        "pageinfo-robot-noindex": "Net tastien",
+       "pageinfo-watchers": "Tal sidefolgers",
+       "pageinfo-visiting-watchers": "Tal sidefolgers dy't resinte wizigings besochten",
+       "pageinfo-few-watchers": "Minder as $1 {{PLURAL:$1|folger|folgers}}",
+       "pageinfo-few-visiting-watchers": "Unwis oft in folger resinte wizigings besiket",
+       "pageinfo-redirects-name": "Tal trochferwizings nei dizze side",
        "pageinfo-redirects-value": "$1",
+       "pageinfo-subpages-name": "Tal subsiden fan dizze side",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|trochferwizing|trochferwizings}}; $3 {{PLURAL:$3|gjin trochferwizing}})",
+       "pageinfo-firstuser": "Oanmakker side",
+       "pageinfo-firsttime": "Datum oanmeitsjen side",
        "pageinfo-lastuser": "Lêste bewurker",
-       "pageinfo-lasttime": "Lêste bewurking",
-       "pageinfo-edits": "Oantal bewurkings",
-       "pageinfo-authors": "Auteurs totaal",
+       "pageinfo-lasttime": "Datum lêste bewurking",
+       "pageinfo-edits": "Totaaltal bewurkings",
+       "pageinfo-authors": "Totaaltal ûnderskate skriuwers",
+       "pageinfo-recent-edits": "Tal resinte bewurkings (ôfrûne $1)",
+       "pageinfo-recent-authors": "Tal resinte ûnderskate bewurkers",
        "pageinfo-magic-words": "{{PLURAL:$1|Magysk wurd|Magyske wurden}} ($1)",
+       "pageinfo-hidden-categories": "Ferburgen {{PLURAL:$1|kategory|kategoryen}} ($1)",
+       "pageinfo-templates": "Opnommen {{PLURAL:$1|berjocht|berjochten}} ($1)",
+       "pageinfo-transclusions": "{{PLURAL:$1|Side|Siden}} opnommen yn ($1)",
        "pageinfo-toolboxlink": "Sidegegevens",
+       "pageinfo-redirectsto": "Ferwiist troch nei",
        "pageinfo-redirectsto-info": "ynfo",
+       "pageinfo-contentpage": "Telt as ynhâldlike side",
        "pageinfo-contentpage-yes": "Ja",
+       "pageinfo-protect-cascading": "Befeiligings wurkje fan hjirút troch",
        "pageinfo-protect-cascading-yes": "Ja",
+       "pageinfo-protect-cascading-from": "Befeiligings wurkje troch út",
        "pageinfo-category-info": "Kategory-ynformaasje",
-       "pageinfo-category-total": "Totaal oantal lidden",
-       "pageinfo-category-pages": "Oantal siden",
-       "pageinfo-category-subcats": "Oantal subkategoryen",
-       "pageinfo-category-files": "Oantal bestannen",
+       "pageinfo-category-total": "Totaaltal leden",
+       "pageinfo-category-pages": "Tal siden",
+       "pageinfo-category-subcats": "Tal subkategoryen",
+       "pageinfo-category-files": "Tal bestannen",
+       "pageinfo-user-id": "Meidoggernûmer",
+       "pageinfo-file-hash": "Hash-wearde",
+       "pageinfo-view-protect-log": "It skoattelloch foar dizze side besjen.",
        "markaspatrolleddiff": "Markearje as kontroleare",
        "markaspatrolledtext": "Markearje dizze side as kontrolearre",
        "markedaspatrolled": "Markearre as kontrolearre",
        "days": "{{PLURAL:$1|$1 dei|$1 dagen}}",
        "weeks": "{{PLURAL:$1|$1 wike|$1 wiken}}",
        "months": "{{PLURAL:$1|$1 moanne|$1 moannen}}",
-       "years": "{{PLURAL:$1|$1 jier|$1 jierren}}",
+       "years": "{{PLURAL:$1|$1 jier}}",
        "ago": "$1 lyn",
        "just-now": "sakrekt",
        "hours-ago": "$1 {{PLURAL:$1|oere|oeren}} lyn",
        "duration-hours": "$1 {{PLURAL:$1|oere|oeren}}",
        "duration-days": "$1 {{PLURAL:$1|dei|dagen}}",
        "duration-weeks": "$1 {{PLURAL:$1|wike|wiken}}",
-       "duration-years": "$1 {{PLURAL:$1|jier|jierren}}",
+       "duration-years": "$1 {{PLURAL:$1|jier}}",
        "duration-decades": "$1 {{PLURAL:$1|desennium|desennia}}",
        "duration-centuries": "$1 {{PLURAL:$1|iuw|iuwen}}",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|sekonde|sekonden}}",
        "mw-widgets-usersmultiselect-placeholder": "Mear tafoegje...",
        "mw-widgets-titlesmultiselect-placeholder": "Mear tafoegje...",
        "date-range-from": "Fan datum:",
-       "date-range-to": "Oant datum:"
+       "date-range-to": "Oant datum:",
+       "authmanager-provider-password": "Autentifikaasje mei wachtwurd",
+       "changecredentials": "Oanmeldgegevens feroarje",
+       "changecredentials-submit": "Oanmeldgegevens feroarje",
+       "credentialsform-provider": "Soarte oanmeldgegevens:",
+       "credentialsform-account": "Akkountnamme:"
 }
index 3218534..97dd12e 100644 (file)
        "virus-scanfailed": "fallou o escaneado (código $1)",
        "virus-unknownscanner": "antivirus descoñecido:",
        "logouttext": "'''Agora está fóra do sistema.'''\n\nTeña en conta que algunhas páxinas poden continuar aparecendo como se aínda estivese dentro do sistema, ata que limpe a caché do seu navegador.",
+       "logging-out-notify": "Está a pecharse a sesión, por favor, espere.",
+       "logout-failed": "Non é posible pechar a sesión agoraː $1",
        "cannotlogoutnow-title": "Non se pode saír da sesión agora mesmo",
        "cannotlogoutnow-text": "Non é posible saír da sesión cando se usa $1.",
        "welcomeuser": "Reciba a nosa benvida, $1!",
        "action-unblockself": "desbloquearse a si mesmo",
        "action-noratelimit": "non estar afectado polos límites de frecuencia",
        "action-reupload-own": "sobrescribir ficheiros existentes cargados por un mesmo",
+       "action-markbotedits": "marcar as reversións como edicións de bot",
+       "action-patrolmarks": "ver as marcas de vixilancia de cambios recentes",
+       "action-override-export-depth": "exportar páxinas, incluídas aquelas ligadas ata unha profundidade de 5",
+       "action-suppressredirect": "non crear redireccións das páxinas ó movelas",
        "nchanges": "$1 {{PLURAL:$1|modificación|modificacións}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde a última visita}}",
        "enhancedrc-history": "historial",
        "blocklist-editing-page": "páxinas",
        "blocklist-editing-ns": "espazos de nomes",
        "ipblocklist-empty": "A lista de bloqueos está baleira.",
-       "ipblocklist-no-results": "Nin o enderezo IP nin o nome de usuario solicitados están bloqueados.",
+       "ipblocklist-no-results": "Non se atopou ningún bloqueo para o enderezo IP ou nome de usuario indicado.",
        "blocklink": "bloquear",
        "unblocklink": "desbloquear",
        "change-blocklink": "cambiar o bloqueo",
+       "empty-username": "(nome de usuario non dispoñible)",
        "contribslink": "contribucións",
        "emaillink": "enviar un correo",
        "autoblocker": "Foi bloqueado automaticamente porque \"[[User:$1|$1]]\" usou recentemente o seu mesmo enderezo IP.\nO motivo do bloqueo de $1 é: \"$2\"",
        "mw-widgets-abandonedit-discard": "Desbotar edicións",
        "mw-widgets-abandonedit-keep": "Continuar editando",
        "mw-widgets-abandonedit-title": "Está seguro?",
+       "mw-widgets-copytextlayout-copy": "Copiar",
+       "mw-widgets-copytextlayout-copy-fail": "Non se puido copiar no portapapeis.",
+       "mw-widgets-copytextlayout-copy-success": "Copiado no portapapeis.",
        "mw-widgets-dateinput-no-date": "Non se seleccionou ningunha data",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "passwordpolicies-policyflag-forcechange": "debe modificarse ó iniciar sesión",
        "passwordpolicies-policyflag-suggestchangeonlogin": "suxerir cambio ó iniciar sesión",
        "easydeflate-invaliddeflate": "O contido fornecido non está debidamente comprimido",
-       "unprotected-js": "Por motivos de seguridade non se pode cargar JavaScript desde páxinas non protexidas. Por favor, cree só JavaScript no espazo de nomes MediaWiki ou como subpáxina de usuario"
+       "unprotected-js": "Por motivos de seguridade non se pode cargar JavaScript desde páxinas non protexidas. Por favor, cree só JavaScript no espazo de nomes MediaWiki ou como subpáxina de usuario",
+       "userlogout-continue": "Se quere pechar a sesión, por favor, [$1 continúe á páxina de peche de sesión].",
+       "userlogout-sessionerror": "No se puido pechar a sesión debido a un erro de sesión. Por favor, [$1 ténteo de novo]."
 }
index 3f05b24..50aa535 100644 (file)
        "copyrightpage": "{{ns:project}}:זכויות יוצרים",
        "currentevents": "אקטואליה",
        "currentevents-url": "Project:אקטואליה",
-       "disclaimers": "×\94×\91×\94ר×\94 ×\9eשפ×\98×\99ת",
+       "disclaimers": "×\94×\91×\94ר×\95ת ×\9eשפ×\98×\99×\95ת",
        "disclaimerpage": "Project:הבהרה משפטית",
        "edithelp": "עזרה בעריכה",
        "helppage-top-gethelp": "עזרה",
        "uploaded-script-svg": "נמצא אלמנט שאפשר לכתוב בו תסריט \"$1\" בקובץ ה־SVG שהועלה.",
        "uploaded-hostile-svg": "נמצא CSS בלתי־מאובטח באלמנט style בקובץ ה־SVG שהועלה.",
        "uploaded-event-handler-on-svg": "אסור להגדיר מאפייני טיפול באירועים <code dir=\"ltr\">$1=\"$2\"</code> בקובצי SVG.",
-       "uploaded-href-attribute-svg": "ר×\9b×\99×\91×\99 <a> ×\99×\9b×\95×\9c×\99×\9d ×\9cקשר (href) ×¨×§ ×\9c×\99×¢×\93×\99 data:â\80\8e (ק×\95×\91×¥ ×\9e×\95×\98×\9e×¢), http://â\80\8e ×\90×\95 https://â\80\8e, ×\90×\95 ×\9eק×\98×¢ (×¢×\9d #, ×\91×\90×\95ת×\95 ×\9eס×\9e×\9a). ×\91ר×\9b×\99×\91×\99×\9d ×\90×\97ר×\99×\9d, ×\9b×\92×\95×\9f <image>, ×\9e×\95תר×\99×\9d ×¨×§ ×\99×¢×\93×\99 data:â\80\8e ×\95×\9eק×\98×¢. ×\91×\90פשר×\95ת×\9a ×\9cנס×\95ת ×\9c×\94×\98×\9eיע תמונות בעת ייצוא קובץ ה־SVG שלך. נמצא <code dir=\"ltr\">&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-href-attribute-svg": "ר×\9b×\99×\91×\99 <a> ×\99×\9b×\95×\9c×\99×\9d ×\9cקשר (href) ×¨×§ ×\9c×\99×¢×\93×\99 data:â\80\8e (ק×\95×\91×¥ ×\9e×\95×\98×\91×¢), http://â\80\8e ×\90×\95 https://â\80\8e, ×\90×\95 ×\9eק×\98×¢ (×¢×\9d #, ×\91×\90×\95ת×\95 ×\9eס×\9e×\9a). ×\91ר×\9b×\99×\91×\99×\9d ×\90×\97ר×\99×\9d, ×\9b×\92×\95×\9f <image>, ×\9e×\95תר×\99×\9d ×¨×§ ×\99×¢×\93×\99 data:â\80\8e ×\95×\9eק×\98×¢. ×\91×\90פשר×\95ת×\9a ×\9cנס×\95ת ×\9c×\94×\98×\91יע תמונות בעת ייצוא קובץ ה־SVG שלך. נמצא <code dir=\"ltr\">&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-href-unsafe-target-svg": "נמצא href לנתונים לא מאובטחים: יעד URI <code dir=\"ltr\">&lt;$1 $2=\"$3\"&gt;</code> בקובץ ה־SVG שהועלה.",
        "uploaded-animate-svg": "נמצא תג \"animate\" שיכול לשנות href באמצעות מאפיין \"from\"  בצורת <code dir=\"ltr\">&lt;$1 $2=\"$3\"&gt;</code> בקובץ ה־SVG שהועלה.",
        "uploaded-setting-event-handler-svg": "הגדרת מאפייני טיפול באירועים חסומה, נמצא <code dir=\"ltr\">&lt;$1 $2=\"$3\"&gt;</code> בקובץ ה־SVG שהועלה.",
        "tooltip-t-emailuser": "שליחת דואר אלקטרוני {{GENDER:$1|למשתמש זה|למשתמשת זו}}",
        "tooltip-t-info": "מידע נוסף על דף זה",
        "tooltip-t-upload": "העלאת קבצים",
-       "tooltip-t-specialpages": "רשימה של כל הדפים המיוחדים באתר",
+       "tooltip-t-specialpages": "רשימה של כל הדפים המיוחדים",
        "tooltip-t-print": "גרסה להדפסה של דף זה",
        "tooltip-t-permalink": "קישור קבוע לגרסה זו של הדף",
        "tooltip-ca-nstab-main": "צפייה בדף התוכן",
        "feedback-thanks": "תודה! המשוב שלך פורסם בדף \"[$2 $1]\".",
        "feedback-thanks-title": "תודה!",
        "feedback-useragent": "User agent:",
-       "searchsuggest-search": "חיפוש ב{{grammar:תחילית|{{SITENAME}}}}",
+       "searchsuggest-search": "חיפוש ב{{GRAMMAR:תחילית|{{SITENAME}}}}",
        "searchsuggest-containing": "כולל...",
        "api-error-badtoken": "שגיאה פנימית: אסימון שבור.",
        "api-error-emptypage": "יצירת דפים חדשים ריקים אינה אפשרית.",
index 1fc458a..359cb7c 100644 (file)
        "protectedinterface": "Ova stranica je zaštićena od izmjena jer sadrži tekst MediaWiki softvera.\nAko želite prevesti neprevedenu poruku ili popraviti prijevod neke druge poruke za sve MediaWiki wikije, posjetite [https://translatewiki.net/  translatewiki.net], projekt za lokalizaciju MediaWiki softvera.",
        "editinginterface": "<strong>Upozorenje:</strong> Uređujete stranicu koja se rabi za prikaz teksta u sučelju softvera. Promjene učinjene na ovoj stranici odrazit će se na izgled korisničkog sučelja kod drugih suradnika na ovoj wiki.",
        "translateinterface": "Za dodavanje ili promjenu prijevoda za sve wikije koristite [https://translatewiki.net/ translatewiki.net], projekt za lokalizaciju MediaWikija.",
-       "cascadeprotected": "Ova je stranica zaključana za uređivanja jer je uključena u {{PLURAL:$1|sljedeću stranicu|sljedeće stranice}}, koje su zaštićene \"prenosivom zaštitom\":\n$2",
+       "cascadeprotected": "Ova je stranica zaključana za uređivanja jer je uključena u {{PLURAL:$1|sljedeću stranicu koja je zaštićena|sljedeće stranice koje su zaštićene}} »prenosivom zaštitom«:\n$2",
        "namespaceprotected": "Ne možete uređivati stranice u imenskom prostoru '''$1'''.",
        "customcssprotected": "Ne možete uređivati ovu CSS stranicu zato što ona sadrži osobne postavke drugog suradnika.",
        "customjsonprotected": "Ne možete uređivati ovu JSON stranicu zato što ona sadrži osobne postavke drugog suradnika.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|promijenio|promijenila}} je jezik stranice $3 iz $4 u $5.",
        "mediastatistics": "Statistika datoteka",
        "mediastatistics-summary": "Slijede statistike postavljenih datoteka koje pokazuju zadnju inačicu datoteke. Starije ili izbrisane inačice nisu prikazane.",
+       "mediastatistics-nfiles": "$1 ($2 %)",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2; $3 %)",
        "mediastatistics-bytespertype": "Ukupna veličina datoteka za ovaj odlomak: {{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2; $3%).",
        "mediastatistics-allbytes": "Ukupna veličina svih datoteka: {{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2).",
index 545260c..bfc9303 100644 (file)
        "mycontris": "Közreműködések",
        "anoncontribs": "Közreműködések",
        "contribsub2": "$1 ($2)",
+       "contributions-subtitle": "{{GENDER:$3|$1}}",
        "contributions-userdoesnotexist": "Nincs regisztrálva „$1” szerkesztői azonosító.",
        "negative-namespace-not-supported": "Negatív értékű névterek nem támogatottak.",
        "nocontribs": "Nem található a feltételeknek megfelelő változtatás.",
index 0fabf7c..af01537 100644 (file)
        "movepage-moved-noredirect": "Վերահղման ստեղծում թույլ չի տրվել",
        "articleexists": "Այդ անվանմամբ էջ արդեն գոյություն ունի կամ ձեր ընտրած անվանումը անթույլատրելի է։\nԽնդրում ենք ընտրել այլ անվանում։",
        "movetalk": "Վերանվանել կից քննարկման էջը",
-       "move-subpages": "Վերանվանել նաև ենթաէջերը (առավելագունը $1)",
-       "move-talk-subpages": "Վերանվանել նաև քննարկման ենթաէջերը (առավելագունը $1)",
+       "move-subpages": "Õ\8eÕ¥Ö\80Õ¡Õ¶Õ¾Õ¡Õ¶Õ¥Õ¬ Õ¶Õ¡Ö\87 Õ¥Õ¶Õ©Õ¡Õ§Õ»Õ¥Ö\80Õ¨ (Õ¡Õ¼Õ¡Õ¾Õ¥Õ¬Õ¡Õ£Õ¸Ö\82ÕµÕ¶Õ¨ $1)",
+       "move-talk-subpages": "Õ\8eÕ¥Ö\80Õ¡Õ¶Õ¾Õ¡Õ¶Õ¥Õ¬ Õ¶Õ¡Ö\87 Ö\84Õ¶Õ¶Õ¡Ö\80Õ¯Õ´Õ¡Õ¶ Õ¥Õ¶Õ©Õ¡Õ§Õ»Õ¥Ö\80Õ¨ (Õ¡Õ¼Õ¡Õ¾Õ¥Õ¬Õ¡Õ£Õ¸Ö\82ÕµÕ¶Õ¨ $1)",
        "movepage-page-moved": "$1 էջը վերանվանվել է $2",
        "movepage-page-unmoved": "$1 էջը հնարավոր չէր վերանվանել $2",
        "movelogpage": "Տեղափոխման տեղեկամատյան",
        "confirm-unwatch-button": "Լավ",
        "confirm-unwatch-top": "Հեռացնե՞լ Ձեր հսկացանկից։",
        "confirm-rollback-button": "Լավ",
+       "quotation-marks": "«$1»",
        "imgmultipageprev": "← նախորդ էջ",
        "imgmultipagenext": "հաջորդ էջ →",
        "imgmultigo": "Անցնե՛լ",
index eb63102..85d9246 100644 (file)
@@ -92,7 +92,7 @@
        "category-empty": "<em>Այս ստորոգութիւնը ներկայիս դատարկ է։<em>",
        "hidden-categories": "{{PLURAL:$1|Թաքցուած կատեգորիա|Թաքցուած կատեգորիաներ}}",
        "hidden-category-category": "Թաքցուած կատեգորիաներ",
-       "category-subcat-count": "{{PLURAL:$2|Ô±ÕµÕ½ Õ½Õ¿Õ¸Ö\80Õ¸Õ£Õ¸Ö\82Õ©Õ«Ö\82Õ¶Õ¨ Õ¸Ö\82Õ¶Õ« Õ´Õ«Õ¡ÕµÕ¶ Õ°Õ¥Õ¿Õ¥Ö\82Õ¥Õ¡Õ¬ Õ¥Õ¶Õ©Õ¡Õ½Õ¿Õ¸Ö\80Õ¸Õ£Õ¸Ö\82Õ©Õ«Ö\82Õ¶Õ¨Ö\89|Ô±ÕµÕ½ Õ½Õ¿Õ¸Ö\80Õ¸Õ£Õ¸Ö\82Õ©Õ«Ö\82Õ¶Õ¨ Õ¸Ö\82Õ¶Õ« Õ°Õ¥Õ¿Õ¥Ö\82Õ¥Õ¡Õ¬ {{PLURAL:$1|Õ¥Õ¶Õ©Õ¡Õ½Õ¿Õ¸Ö\80Õ¸Õ£Õ¸Ö\82Õ©Õ«Ö\82Õ¶|Õ¥Õ¶Õ©Õ¡Õ½Õ¿Õ¸Ö\80Õ¸Õ£Õ¸Ö\82Õ©Õ«Ö\82Õ¶ներ}}ը՝ ընդհանուր $2էն։}}",
+       "category-subcat-count": "{{PLURAL:$2|Ô±ÕµÕ½ Õ¯Õ¡Õ¿Õ¥Õ£Õ¸Ö\80Õ«Õ¡Õ¶ Õ¸Ö\82Õ¶Õ« Õ´Õ«Õ¡ÕµÕ¶ Õ°Õ¥Õ¿Õ¥Ö\82Õ¥Õ¡Õ¬ Õ¥Õ¶Õ©Õ¡Õ¯Õ¡Õ¿Õ¥Õ£Õ¸Ö\80Õ«Õ¡Õ¶Ö\89|Ô±ÕµÕ½ Õ¯Õ¡Õ¿Õ¥Õ£Õ¸Ö\80Õ«Õ¡Õ¶ Õ¸Ö\82Õ¶Õ« Õ°Õ¥Õ¿Õ¥Ö\82Õ¥Õ¡Õ¬ {{PLURAL:$1|Õ¥Õ¶Õ©Õ¡Õ¯Õ¡Õ¿Õ¥Õ£Õ¸Ö\80Õ«Õ¡|Õ¥Õ¶Õ©Õ¡Õ¯Õ¡Õ¿Õ¥Õ£Õ¸Ö\80Õ«Õ¡ներ}}ը՝ ընդհանուր $2էն։}}",
        "category-subcat-count-limited": "Այս ստորոգութիւնը ունի հետեւեալ {{PLURAL:$1|ենթաստորոգութիւն|$1 ենթաստորոգութիւններ}}։",
        "category-article-count": "{{PLURAL:$2|Այս ստորոգութիւնը կը պարունակէ միայն հետեւեալ էջը։|Ստորեւ այս ստորոգութեան ընդհանուր $2էն {{PLURAL:$1|էջը|$1 էջերը}}։}}",
        "category-article-count-limited": "Այս ստորոգութիւնի մէջ կը գտնուին հետեւեալ {{PLURAL:$1|էջը|$1 էջերը}}։",
        "whatlinkshere-hidelinks": "$1 յղումները",
        "whatlinkshere-hideimages": "$1 նիշքի յղումները",
        "whatlinkshere-filters": "Զտիչներ",
+       "unblock": "Մասնակիցի արգելակումը վերցնել",
        "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",
        "infiniteblock": "Միշտ",
        "blocklink": "‎Արգելակել",
index cce94a9..900e4b1 100644 (file)
        "mw-widgets-abandonedit-discard": "Abandonar modificationes",
        "mw-widgets-abandonedit-keep": "Continuar a modificar",
        "mw-widgets-abandonedit-title": "Es tu secur?",
+       "mw-widgets-copytextlayout-copy": "Copiar",
+       "mw-widgets-copytextlayout-copy-fail": "Fallimento de copiar al area de transferentia.",
+       "mw-widgets-copytextlayout-copy-success": "Copiate al area de transferentia.",
        "mw-widgets-dateinput-no-date": "Nulle data seligite",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
index 81cd38d..de1fca4 100644 (file)
        "page_first": "umuna",
        "page_last": "naudi",
        "histlegend": "Panagpili ti diperensia: Markaan dagiti kahon ti radio kadagiti rebision tapno maipada ken pinduten ti enter wenno ti buton dita baba.<br />\nLeyenda: <strong>({{int:cur}})</strong> = naggidiatan ti kinaudi a rebision, <strong>({{int:last}})</strong> = naggidiatan ti sarsarunuen a rebision, <strong>{{int:minoreditletter}}</strong> = bassit nga urnos.",
-       "history-fieldset-title": "Agbiruk para kadagiti rebision",
+       "history-fieldset-title": "Sagaten dagiti rebision",
        "history-show-deleted": "Naikkat laeng ti rebision",
        "histfirst": "kadaanan",
        "histlast": "kabaruan",
        "filehist-filesize": "Kadakkel ti papeles",
        "filehist-comment": "Komentario",
        "imagelinks": "Panagusar iti papeles",
-       "linkstoimage": "Ti sumaganad {{PLURAL:$1|a silsilpo ti panid|kadagiti $1 a silpo ti pampanid}} iti daytoy a papeles:",
+       "linkstoimage": "Ti sumaganad a {{PLURAL:$1|panid ket agus-usar|$1 a pampanid ket agus-usar}} iti daytoy a papeles:",
        "linkstoimage-more": "Ad-adu ngem $1 {{PLURAL:$1|a silsilpo ti panid|a silpo ti pampanid}} iti daytoy a papeles.\nTi sumaganad a listaan ket mangipakita {{PLURAL:$1|ti umona a silpo ti panid|kadagiti umuna a $1 a silsilpo ti panid}} iti daytoy laeng a papeles.\nMagun-od ti [[Special:WhatLinksHere/$2|kompleto a listaan]].",
-       "nolinkstoimage": "Awan ti pampanid a nakasilpo iti daytoy a papeles.",
+       "nolinkstoimage": "Awan ti pampanid nga agus-usar iti daytoy a papeles.",
        "morelinkstoimage": "Kitaen ti [[Special:WhatLinksHere/$1|adu pay a silsilpo]] iti daytoy a papeles.",
        "linkstoimage-redirect": "$1 (baw-ing ti papeles) $2",
        "duplicatesoffile": "Ti sumaganad a {{PLURAL:$1|a papeles ket duplikado|a $1 a pappapeles ket duplikado}} iti daytoy a papeles ([[Special:FileDuplicateSearch/$2|adu pay a salaysay]]):",
index 06418e2..d695f7e 100644 (file)
        "ipb-unblock-addr": "Desblokusar $1",
        "ipb-blocklist": "Vidar existanta blokusi",
        "ipb-blocklist-contribs": "Kontributadi dil uzero {{GENDER:$1|$1}}",
+       "block-actions": "Agadi blokusota:",
        "block-expiry": "Expiro:",
        "unblockip": "Desblokusar uzero",
        "unblockiptext": "Uzez la sequanta formularo por restaurar la skribo-aceso ad IP-adreso qua blokusesis antee.",
        "minutes-ago": "$1 {{PLURAL:$1|minuto|minuti}} ante nun",
        "metadata": "Metadonaji",
        "metadata-help": "Ca arkivo kontenas plusa informo, probable furnisita per la kamero elektronikala o per la \"scanner\" uzata por krear o kopiar l'imajo.\nSe l'arkivo modifikesos de lua originala stando, kelka detali povos ne reprezentar exakte l'arkivo modifikata.",
+       "metadata-expand": "Montrez plusa detali",
+       "metadata-collapse": "Celez plusa detali",
        "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",
        "namespacesall": "omna",
        "monthsall": "omna",
index 9b5a53f..072e486 100644 (file)
        "mcrundo-missingparam": "リクエストに必要なパラメーターが見当たりません。",
        "mcrundo-changed": "このページはあなたが前回差分を表示した後に変更されています。新しい変更の査読をお願いします。",
        "mcrundo-parse-failed": "新しい版が読み込めませんでした: $1",
-       "semicolon-separator": ";&#32;",
+       "semicolon-separator": "",
        "comma-separator": "、",
        "colon-separator": ":&#32;",
        "pipe-separator": "&#32;|&#32;",
index cb0e674..92f091d 100644 (file)
@@ -46,7 +46,7 @@
        "tog-enotifminoredits": "Uga kirimi aku layang-èl yèn ana besutan cilik ing kaca lan barkas",
        "tog-enotifrevealaddr": "Tuduhaké alamat layang-èlku ing layang wara-wara",
        "tog-shownumberswatching": "Tuduhaké cacah wong kang ngawasi",
-       "tog-oldsig": "Tapak asmané panjenengan kang cumepak:",
+       "tog-oldsig": "Tandha tanganmu kang wis cumawis:",
        "tog-fancysig": "Cakaké tapak asma minangka tèks wiki (tanpa pranala otomatis)",
        "tog-uselivepreview": "Tuduhaké pratuduh tanpa ngamot ulang kacané",
        "tog-forceeditsummary": "Kandhani aku manawa kothak ringkesané besutan isih kosong",
        "help": "Pitulung",
        "help-mediawiki": "Pitulung bab MediaWiki",
        "search": "Golèk",
-       "search-ignored-headings": " #<!-- lirwakaké waé larik iki kaya asliné --> <pre>\n# Sesirah kang bakal dilirwakaké déning golèkan.\n# Owahan tumrap iki bakal katon nalika sesirahé wis diindhèks.\n# Panjenengan bisa meksa ngindhèks ulang kaca kanthi ngayahi besutan kosong.\n# Sintaksisé kaya mangkéné:\n#   * Samubarang saka karakter \"#\" tumeka pungkasané larik iku minangka tanggepan.\n#   * Saben larik kang ora kosong iku sesirah kang kudu dilirwakaké lan samubarangé.\nRujukan\nPranala njaba\nUga delengen\n #</pre> <!-- lirwakaké baé larik iki kaya asliné -->",
+       "search-ignored-headings": " #<!-- lirwakaké baé larik iki kaya asliné --> <pre>\n# Sesirah kang bakal kalirwakaké ing panggolèk.\n# Owahan tumrap iki bakal katon nalika sesirahé wis kaindhèk.\n# Kowé bisa meksa mbalèni ngindhèk kaca kanthi ngayahi besutan kosong.\n# Sintaksisé mangkéné:\n#   * Sabarang saka karakter \"#\" nganti pungkasaning larik iku minangka tanggepan.\n#   * Saben larik kang ora kosong iku sesirah kang kudu kalirwa, lan sapananggungalané.\nRujukan\nPranala njaba\nUga delengen\n #</pre> <!-- lirwakaké baé larik iki kaya asliné -->",
        "searchbutton": "Golèk",
        "go": "Menyang",
        "searcharticle": "Menyang",
        "jumptonavigation": "navigasi",
        "jumptosearch": "golèk",
        "view-pool-error": "Nyuwun ngapura, peladèn lagi sibuk wektu iki.\nKakèhan panganggo kang nyoba mbukak kaca iki.\nEntèni sedhéla sadurungé nyoba ngaksès kaca iki manèh .\n\n$1",
-       "generic-pool-error": "Ngapunten, paladèné lagi kabotan momotan.\nPanganggo akèh kang péngin ndeleng sumber iki.\nEntènana sadhéla sadurungé panjenengan marani sumber iki manèh.",
+       "generic-pool-error": "Pangapura, paladèné lagi kabotan momotan.\nPanganggo akèh kang péngin ndeleng sumber iki.\nEntènana sadhéla sadurungé kowé bali marani sumber iki manèh.",
        "pool-timeout": "Kaladuk suwé anggoné ngentèni gembok",
        "pool-queuefull": "Kempalan antrian kebak",
        "pool-errorunknown": "Masalah ora kaweruhan",
        "privacy": "Niti privasi",
        "privacypage": "Project:Niti privasi",
        "badaccess": "Aksès ora olèh",
-       "badaccess-group0": "Panjenengan ora pareng nglakokaké tindhakan kang panjenengan gayuh.",
-       "badaccess-groups": "Laku kang panjenengan karsakaké mung kanggo panganggo ing {{PLURAL:$2|golongan|golongan}}: $1.",
+       "badaccess-group0": "Kowé ora kawogan ngayahi laku kang kojaluk.",
+       "badaccess-groups": "Laku kang koarepi mung winates tumrap panganggo ing {{PLURAL:$2|golongan}}: $1.",
        "versionrequired": "Dibutuhaké MediaWiki vèrsi $1",
        "versionrequiredtext": "MediaWiki vèrsi $1 dibutuhaké kanggo nggunakaké kaca iki. Mangga mirsani [[Special:Version|kaca iki]]",
        "ok": "Oké",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "backlinksubtitle": "← $1",
        "retrievedfrom": "Dijupuk saka \"$1\"",
-       "youhavenewmessages": "{{PLURAL:$3|Panjenengan duwé}} $1 ($2).",
-       "youhavenewmessagesfromusers": "{{PLURAL:$4|Panjenengan duwé}} $1 saka {{PLURAL:$3|panganggo liya|$3 panganggo}} ($2).",
-       "youhavenewmessagesmanyusers": "Panjenengan duwé $1 saka manéka panganggo ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Kowé duwé}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Kowé duwé}} $1 saka {{PLURAL:$3|panganggo liya|$3 panganggo}} ($2).",
+       "youhavenewmessagesmanyusers": "Kowé duwé $1 saka manéka panganggo ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|layang anyar|999=layang anyar}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|owahan|999=owahan}} pungkasan",
-       "youhavenewmessagesmulti": "Panjenengan éntuk layang anyar ing $1",
+       "youhavenewmessagesmulti": "Kowé éntuk layang anyar ing $1",
        "editsection": "besut",
        "editold": "besut",
        "viewsourceold": "deleng sumber",
        "hidetoc": "dhelikaké",
        "collapsible-collapse": "tutup",
        "collapsible-expand": "bukak",
-       "confirmable-confirm": "{{GENDER:$1|Panjenengan}} yakin?",
+       "confirmable-confirm": "{{GENDER:$1|Kowé}} yakin?",
        "confirmable-yes": "Iya",
        "confirmable-no": "Ora",
        "thisisdeleted": "Deleng utawa pulihaké $1?",
        "nstab-category": "Kategori",
        "mainpage-nstab": "Tepas",
        "nosuchaction": "Ora ana laku mangkono",
-       "nosuchactiontext": "Laku kang dikarepaké URL ora trep.\nPanjenengan bokmanawa salah nulis URL-é, utawa salah mènèhi pranala.\nIki bokmanawa uga nuduhaké yèn ana ama ing piranti alus kang dianggo {{SITENAME}}.",
+       "nosuchactiontext": "Laku kang dijaluk URL ora trep.\nKowé bokmanawa salah nulis URL-é, utawa salah mènèhi pranala.\nIki bokmanawa uga nuduhaké yèn ana ama ing piranti alus kang dianggo {{SITENAME}}.",
        "nosuchspecialpage": "Ora ana kaca mirunggan mangkono",
-       "nospecialpagetext": "<strong>Panjenengan nyuwun kaca mirunggan kang ora trep.</strong>\n\nPratélan kaca mirunggan kang trep bisa tinemu ing [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nospecialpagetext": "<strong>Kowé njaluk kaca mirunggan kang ora trep.</strong>\n\nPratélan kaca mirunggan kang trep bisa tinemu ing [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Masalah",
        "databaseerror": "Masalah sasana dhata",
        "databaseerror-text": "Ana masalah ing kuwèri basis dhatah.\nBokmanawa iki nuduhaké yèn ana ama ing piranti alusé.",
        "readonly": "Umpak data kagembok",
        "enterlockreason": "Isi alesan ngreksa, kalebu rencana kapan pareksané bakal dibukak",
        "readonlytext": "Juru administrasi sistem kang ngunci iku medhar mangkéné: $1",
-       "missing-article": "Basis dhatahé ora bisa nemu tulisan ing siji kaca kang kuduné ana, ya iku \"$1\" $2.\n\nMasalah iki sok ana amarga panjenengan ngeklik pranala sajarah kang lawas ing kaca kang wis kabusek.\n\nManawa ora amarga iku, panjenengan bokmanawa nemu ama ing piranti alusé.\nSumangga lapuraké ama mau menyang [[Special:ListUsers/sysop|pangurus]], kanthi nulisaké URL-é.",
+       "missing-article": "Basis dhatahé ora bisa nemu tulisan ing siji kaca kang kuduné ana, ya iku \"$1\" $2.\n\nMasalah iki sok ana amarga kowé klik pranala sajarah kang lawas ing kaca kang wis kabusek.\n\nManawa ora amarga iku, kowé bokmanawa nemu ama ing piranti alusé.\nMangga lapuraké ama mau menyang [[Special:ListUsers/sysop|pangurus]], kanthi nulisaké URL-é.",
        "missingarticle-rev": "(owahan#: $1)",
        "missingarticle-diff": "(Béda: $1, $2)",
        "readonly_lag": "Database wis dikunci mawa otomatis sawetara database sékundhèr lagi nglakoni sinkronisasi mawa database utama",
        "unexpected": "Biji (''nilai'') ing njabaning jangkauan: \"$1\"=\"$2\".",
        "formerror": "Masalah: Ora bisa ngirim formulir",
        "badarticleerror": "Laku iki ora bisa kalakokaké ing kaca iki.",
-       "cannotdelete": "Kaca utawa barkas \"$1\" ora bisa panjenengan busak.\nBokmanawa kaca utawa barkasé wis dibusek wong liya.",
+       "cannotdelete": "Kaca utawa barkas \"$1\" ora bisa kobusek.\nBokmanawa kaca utawa barkasé wis dibusek wong liya.",
        "cannotdelete-title": "Ora bisa mbusek kaca \"$1\"",
        "delete-hook-aborted": "Pambusakan dibatalaké déning ''hook''.\nOra ana alesané.",
        "no-null-revision": "Ora isa nggawe revisi 'null' anyar kanggo kaca \"$1\"",
        "badtitle": "Sesirah ala",
-       "badtitletext": "Sesirah kaca kang panjenengan suwun ora trep, kosong, utawa salah nggayut menyang sesirah antarabasa utawa antarawiki.\nTulisané bokmanawa ngemu karakter kang ora kena kaanggo ing sesirah.",
+       "badtitletext": "Sesirah kaca kang kojaluk ora trep, kosong, utawa salah nggayut menyang sesirah antarabasa utawa antarawiki.\nTulisané bokmanawa ngemu karakter kang ora kena kaanggo ing sesirah.",
        "title-invalid-empty": "Sesirah kaca kang kopéngini kosong utawa mung ngemu jenenging mandhala aran.",
-       "title-invalid-utf8": "Sesirah kaca kang panjenengan karsakaké ngemu reroncèn UTF-8 kang ora trep.",
-       "title-invalid-interwiki": "Sesirah kaca kang panjenengan karsakaké ngemu pranala interwiki kang ora bisa katrapaké ing sesirah.",
+       "title-invalid-utf8": "Sesirah kaca kang koarepi ngemu reroncèn UTF-8 kang ora trep.",
+       "title-invalid-interwiki": "Sesirah kaca kang koarepi ngemu pranala interwiki kang ora bisa katrapaké ing sesirah.",
        "title-invalid-talk-namespace": "Sesirah kaca kang dikarepaké ngener ing kaca parembugan kang ora ana.",
-       "title-invalid-characters": "Sesirah kaca kang panjenengan karsakaké ngemu karakter kang ora trep: \"$1\".",
+       "title-invalid-characters": "Sesirah kaca kang koarepi ngemu karakter kang ora trep: \"$1\".",
        "title-invalid-relative": "Sesirah ngemu alamat rélatif. Sesirah kaca relatif (./, ../) iku ora sah amarga ora bisa ditekani lumantar pangluru.",
-       "title-invalid-magic-tilde": "Sesirah kaca kang panjenengan karsakaké ngemu reroncèn tildhe (<nowiki>~~~</nowiki>) kang ora trep.",
-       "title-invalid-too-long": "Sesirah kaca kang panjenengan karsakaké kedawan. Sesirahé ora kena munjuli {{PLURAL:$1|bèt|bèt}} ing pangodhe UTF-8.",
-       "title-invalid-leading-colon": "Sesirah kaca kang panjenengan karsakaké ngemu titik loro kang ora trep ing arepé.",
+       "title-invalid-magic-tilde": "Sesirah kaca kang koarepi ngemu reroncèn tildhe (<nowiki>~~~</nowiki>) kang ora trep.",
+       "title-invalid-too-long": "Sesirah kaca kang koarepi kedawan. Sesirahé ora kena munjuli {{PLURAL:$1|bèt|bèt}} ing pangodhe UTF-8.",
+       "title-invalid-leading-colon": "Sesirah kaca kang koarepi ngemu titik loro kang ora trep ing arepé.",
        "perfcached": "Dhata ing ngisor iki kasimpen ing telih lan mungkin durung dianyari. Paling akèh ana {{PLURAL:$1|sakasil|$1 kasil}} ing telih iku.",
        "perfcachedts": "Dhata ing ngisor iki kasimpen ing telih, lan pungkasan dianyari $1. Paling akèh ana {{PLURAL:$4|sakasil|$4 kasil}} ing telih iku.",
        "querypage-no-updates": "Update saka kaca iki lagi dipatèni. Data kang ana ing kéné saiki ora bisa bakal dibalèni unggah manèh.",
        "viewsource": "Deleng sumber",
        "viewsource-title": "Deleng sumberé $1",
        "actionthrottled": "Tindakan diwatesi",
-       "actionthrottledtext": "Minangka upaya nglawan laku salah-guna, panjenengan ora bisa nglakokaké iki ping bola-bali ing dalem waktu sadhéla, lan panjenengan wis munjuli watesané.\nSumangga jajal manèh mengko.",
+       "actionthrottledtext": "Minangka upaya nglawan laku salah-guna, kowé ora bisa nglakokaké iki ping bola-bali ing dalem waktu sadhéla, lan kowé wis munjuli watesané.\nMangga jajal manèh mengko.",
        "protectedpagetext": "Kaca iki wis direksa supaya ora dibesut lan diapa-apakaké.",
-       "viewsourcetext": "Panjenengan bisa ndeleng lan nurun sumberé kaca iki.",
-       "viewyourtext": "Panjenengan bisa ndeleng lan nurun sumberé <strong>besutané panjenengan</strong> menyang kaca iki.",
+       "viewsourcetext": "Kowé bisa ndeleng lan nurun sumbering kaca iki.",
+       "viewyourtext": "Kowé bisa ndeleng lan nurun sumbering <strong>besutanmu</strong> menyang kaca iki.",
        "protectedinterface": "Kaca iki isiné tèks antarmuka kang dienggo software lan wis dikunci kanggo menghindari kasalahan.",
-       "editinginterface": "<strong>Pepéling:</strong> Panjenengan lagi mbesut kaca kang ngemu tulisan kanggo mukantarané piranti alus.\nNgowahi kaca iki bakal mrabawani cakrik mukantarané panganggo liya ing wiki iki.",
+       "editinginterface": "<strong>Pepéling:</strong> Kowé lagi mbesut kaca kang ngemu tulisan kanggo mukantaraning piranti alus.\nNgowahi kaca iki bakal mrabawani cakrik mukantaraning panganggo liya ing wiki iki.",
        "translateinterface": "Saperlu nambah utawa ngowah pertalan tumrap kabèh wiki, mangga anggoa [https://translatewiki.net/ translatewiki.net] minangka proyèk panglokaling MediaWiki.",
        "cascadeprotected": "Kaca iki wis direksa saka besutan amarga katransklusi ing {{PLURAL:$1|kaca|kaca-kaca}} kang kareksa mawa pilihan \"runut\" murub:\n$2",
        "namespaceprotected": "Kowé ora kawogan mbesut kaca ing mandhala aran <strong>$1</strong>.",
-       "customcssprotected": "Panjenengan ora diidinaké mbesut kaca CSS iki amarga isiné setèlan pribadhi panganggo liyané.",
-       "customjsprotected": "Panjenengan ora diidinaké mbesut kaca JavaScript iki amarga isiné setèlan pribadhi panganggo liyané.",
+       "customcssprotected": "Kowé ora kawogan mbesut kaca CSS iki amarga ngemu setèlan pribadi panganggo liya.",
+       "customjsprotected": "Kowé ora kawogan mbesut kaca JavaScript iki amarga ngemu setèlan pribadi panganggo liya.",
        "mycustomcssprotected": "Sampèyan ora duwé idin kanggo ngowah kaca CSS iki.",
        "mycustomjsprotected": "Sampèyan ora duwé idin kanggo ngowah kaca JavaScript iki.",
        "myprivateinfoprotected": "Sampèyan ora duwé idin kanggo ngowah informasi privat sampèyan.",
        "invalidtitle-knownnamespace": "Sesirah ora trep mawa mandhala aran \"$2\" lan tulisan \"$3\"",
        "invalidtitle-unknownnamespace": "Sesirah ora trep mawa angka $1 lan tulisan \"$2\" mandhala aran kang ora kaweruhan",
        "exception-nologin": "Durung mlebu log",
-       "exception-nologin-text": "Sumangga panjenengan mlebu log supaya bisa ngaksès kaca utawa laku iki.",
+       "exception-nologin-text": "Mangga mlebua log supaya bisa ngaksès kaca utawa laku iki.",
        "exception-nologin-text-manual": "Tulung $1 kanggo ngakses kaca utawa kelakon iki.",
        "virus-badscanner": "Kasalahan konfigurasi: pamindai virus ora dikenal: ''$1''",
        "virus-scanfailed": "''Pemindaian'' utawa ''scan'' gagal (kode $1)",
        "virus-unknownscanner": "antivirus buhbuhan:",
-       "logouttext": "<strong>Panjenengan wis metu log.</strong>\n\nTulung gatèkaké yèn sawenèh kaca bokmanawa bakal isih katon kaya déné yèn panjenengan isih mlebu log, kajaba panjenengan mbusek telih pangluruné panjenengan.",
+       "logouttext": "<strong>Kowé wis metu log.</strong>\n\nTulung gatèkaké yèn sawenèh kaca bokmanawa bakal isih katon kaya déné yèn kowé isih mlebu log, kajaba kowé mbusek telihing panglurumu.",
        "cannotlogoutnow-title": "Ora bisa metu saiki",
        "cannotlogoutnow-text": "Mokal metu log nalika nganggo $1.",
        "welcomeuser": "Sugeng Rawuh, $1!",
-       "welcomecreation-msg": "Akun panjenengan wis kacipta. Aja lali nata konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] panjenengan.",
+       "welcomecreation-msg": "Akunmu wis kagawé.\nKowé bisa ngowahi [[Special:Preferences|pilalan]] {{SITENAME}}mu yèn arep.",
        "yourname": "Jeneng panganggo:",
        "userlogin-yourname": "Jeneng panganggo",
-       "userlogin-yourname-ph": "Isi jeneng-panganggo panjenengan",
+       "userlogin-yourname-ph": "Isi mawa jeneng panganggomu",
        "createacct-another-username-ph": "Isi jeneng panganggo",
        "yourpassword": "Tembung wadi:",
        "userlogin-yourpassword": "Tembung wadi",
-       "userlogin-yourpassword-ph": "Isinen tembung wadiné panjenengan",
+       "userlogin-yourpassword-ph": "Isi mawa tembung wadimu",
        "createacct-yourpassword-ph": "Isi tembung wadi",
        "yourpasswordagain": "Tik manèh tembung wadiné:",
        "createacct-yourpasswordagain": "Konfirmasi tembung wadi",
        "cannotloginnow-text": "Mokal mlebu log yèn nganggo $1.",
        "cannotcreateaccount-title": "Ora bisa gawé akun",
        "cannotcreateaccount-text": "Gawé akun langsung ora bisa ing wiki iki.",
-       "yourdomainname": "Dhomain panjenengan",
-       "password-change-forbidden": "Panjenengan ora bisa ngowahi tembung wadi ing wiki iki.",
-       "externaldberror": "Ana kasalahan otèntikasi basis dhata èksternal utawa panjenengan ora pareng nglakoni pemutakhiran marang akun èksternal panjenengan.",
+       "yourdomainname": "Dhomainmu:",
+       "password-change-forbidden": "Kowé ora bisa ngowahi tembung wadi ing wiki iki.",
+       "externaldberror": "Ana masalah basis dhata otèntikasi utawa kowé ora kawogan nganyari akun èsternalmu.",
        "login": "Mlebu log",
-       "login-security": "Vèrifikasi idhèntitas panjenengan",
+       "login-security": "Vèrifikasi idhèntitasmu",
        "nav-login-createaccount": "Mlebu log / gawé akun",
        "logout": "Metu log",
        "userlogout": "Metu log",
        "userlogin-noaccount": "Durung duwé akun?",
        "userlogin-joinproject": "Mèlua {{SITENAME}}",
        "createaccount": "Gawé akun",
-       "userlogin-resetpassword-link": "Lali tembung wadiné panjenengan?",
+       "userlogin-resetpassword-link": "Lali tembung wadimu?",
        "userlogin-helplink2": "Tulungi mlebu log",
-       "userlogin-loggedin": "Panjenengan wis mlebu log minangka {{GENDER:$1|$1}}.\nAnggonen formulir ngisor iki saperlu mlebu log minangka panganggo liya.",
-       "userlogin-reauth": "Panjenengan kudu mlebu log manèh saperlu vèrifikasi yèn panjenengan bener {{GENDER:$1|$1}}.",
+       "userlogin-loggedin": "Kowé wis mlebu log minangka {{GENDER:$1|$1}}.\nAnggonen formulir ngisor iki saperlu mlebu log minangka panganggo liya.",
+       "userlogin-reauth": "Kowé kudu mlebu log manèh saperlu vèrifikasi yèn kowé bener si {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Gawé akun liya",
        "createacct-emailrequired": "Alamat layang-èl",
        "createacct-emailoptional": "Alamat layang-èl (manasuka)",
-       "createacct-email-ph": "Isi layang-èl panjenengan",
+       "createacct-email-ph": "Isi mawa layang-èlmu",
        "createacct-another-email-ph": "Isi alamat layang-èl",
        "createaccountmail": "Nganggo tembung wadi sauntara kang dikirimaké menyang alamat layang-èl",
        "createaccountmail-help": "Bisa kanggo nggawèkaké wong liya akun tanpa ngurusi tembung wadiné.",
        "createacct-realname": "Jeneng asli (manasuka)",
        "createacct-reason": "Alesan",
-       "createacct-reason-ph": "Alesané panjenengan nggawé akun liya",
+       "createacct-reason-ph": "Alesanmu nggawé akun liya",
        "createacct-reason-help": "Layang kang kapacak ing log gawéan akun",
-       "createacct-submit": "Gawé akun panjenengan",
+       "createacct-submit": "Gawé akunmu",
        "createacct-another-submit": "Gawé akun",
        "createacct-continue-submit": "Banjuraké gawé akun",
        "createacct-another-continue-submit": "Banjuraké gawé akun",
-       "createacct-benefit-heading": "{{SITENAME}} digawé déning wong-wong kaya panjenengan.",
+       "createacct-benefit-heading": "{{SITENAME}} digawé wong-wong kaya kowé.",
        "createacct-benefit-body1": "{{PLURAL:$1|besutan}}",
        "createacct-benefit-body2": "{{PLURAL:$1|kaca}}",
        "createacct-benefit-body3": "{{PLURAL:$1|kang nyumbang}} mentas waé",
-       "badretype": "Tembung wadi kang panjenengan isèkaké ora gathuk.",
+       "badretype": "Tembung wadi kang koisèkaké ora mathuk.",
        "usernameinprogress": "Panggawéning akun tumrap jeneng panganggo iki tembé lumaku.\nEntèni sadhéla.",
        "userexists": "Jeneng panganggo kang dilebokaké lagi dianggo.\nMangga pilih jeneng liya.",
        "loginerror": "Masalah mlebu log",
        "createacct-error": "Masalah panggawé akun",
        "createaccounterror": "Ora bisa gawé akun: $1",
-       "nocookiesnew": "Akun panganggoné wis digawé, nanging panjenengan durung mlebu log.\n{{SITENAME}} nganggo kuki kanggo nglebokaké panganggo ing log.\nÉwadéné, kukiné panjenengan dipatèni.\nMangga urubaké iku, banjur mlebua log kanthi nganggo jeneng panganggo lan tembung wadiné panjenengan kang anyar.",
-       "nocookieslogin": "{{SITENAME}} nggunakaké ''cookies'' kanggo log panganggoné. ''Cookies'' ing panjlajah wèb panjenengan dipatèni. Mangga ngaktifaké manèh lan coba manèh.",
-       "nocookiesfornew": "Akun panganggoné wurung digawé amarga awak dhéwé ora bisa mesthèkaké sumberé.\nPesthèkaké panjenengan wis ngurubaké kuki, banjur ambalana ngamot kaca iki lan njajalana manèh.",
+       "nocookiesnew": "Akun panganggoné wis kagawé, nanging kowé durung mlebu log.\n{{SITENAME}} nganggo kuki saperlu nglebokaké panganggo ing log.\nNanging, kukimu kopatèni.\nMangga urubana, banjur mlebua log kanthi nganggo jeneng panganggo lan tembung wadimu kang anyar.",
+       "nocookieslogin": "{{SITENAME}} nganggo kuki saperlu nglebokaké panganggo ing log.\nNanging, kukimu kopatèni.\nMangga urubana lan jajal manèh.",
+       "nocookiesfornew": "Akun panganggoné wurung kagawé amarga awak dhéwé ora bisa mesthèkaké sumberé.\nPesthèkaké kowé wis ngurubaké kuki, banjur balènana ngamot kaca iki lan jajalana manèh.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
-       "createacct-loginerror": "Akuné wis kasil digawe nanging panjenengan ora bisa otomatis mlebu log. Mangga [[Special:UserLogin|mlebua log kanthi manual]].",
-       "noname": "Panjenengan durung awèh jeneng panganggo kang trep.",
+       "createacct-loginerror": "Akuné wis kasil kagawe nanging kowé ora bisa otomatis mlebu log. Mangga [[Special:UserLogin|mlebua log kanthi manuwal]].",
+       "noname": "Kowé durung mènèhi jeneng panganggo kang trep.",
        "loginsuccesstitle": "Kasil mlebu log",
-       "loginsuccess": "<strong>Panjenengan saiki wis mlebu log ing {{SITENAME}} minangka \"$1\".</strong>",
-       "nosuchuser": "Ora ana panganggo kanthi jeneng \"$1\".\nJeneng panganggo iku sènsitif tumrap gedhé-ciliké huruf.\nJajan priksanen éjaané panjenengan, utawa [[Special:CreateAccount|gawénen akun anyar]].",
+       "loginsuccess": "<strong>Kowé saiki wis mlebu log ing {{SITENAME}} minangka \"$1\".</strong>",
+       "nosuchuser": "Ora ana panganggo mawa jeneng \"$1\".\nJeneng panganggo iku sènsitif tumrap gedhé-ciliké huruf.\nJajan priksanen pangéjamu, utawa [[Special:CreateAccount|gawénen akun anyar]].",
        "nosuchusershort": "Ora ana panganggo mawa asma \"$1\". Coba dipriksa manèh pasang aksarané (éjaané).",
-       "nouserspecified": "Panjenengan kudu milih jeneng panganggo.",
+       "nouserspecified": "Kowé kudu ngisi jeneng panganggo.",
        "login-userblocked": "Panganggo iki pinalangan. Ora kena mbelu.",
-       "wrongpassword": "Jenang panganggo utawa tembung wadi kang panjenengan isèkaké salah.\nSumangga jajal manèh.",
+       "wrongpassword": "Jenang panganggo utawa tembung wadi kang koisèkaké salah.\nMangga jajal manèh.",
        "wrongpasswordempty": "Tembung wadi kosong.\nJajalen manèh.",
        "passwordtooshort": "Tembung sesinglon paling sethithik cacahé {{PLURAL:$1|1 aksara|$1 aksara}}.",
        "passwordtoolong": "Tembung wadi ora kena munjuli {{PLURAL:$1|1 pralambang|$1 pralambang}}.",
-       "passwordtoopopular": "Tembung wadi kang wis kaprah ora kena panjenengan agem. Sumangga pilih tembung wadi liya kang mbédani.",
-       "password-name-match": "Tembung wadiné panjenengan kudu béda saka jeneng panganggoné panjenengan.",
+       "passwordtoopopular": "Tembung wadi kang wis lumrah ora kena koanggo. Mangga pilih tembung wadi kang angèl kabedhèk.",
+       "password-name-match": "Tembung wadimu kudu béda saka jeneng panganggomu.",
        "password-login-forbidden": "Panganggoning jeneng panganggo lan tembung wadi iki dilarang.",
        "mailmypassword": "Balèni gawé tembung wadi",
        "passwordremindertitle": "Tembung wadi sauntara kanggo {{SITENAME}}",
-       "passwordremindertext": "Ana wong (mbokmanawa panjenengan dhéwé, saka alamat IP $1) nyuwun supaya dikirimi tembung wadi anyar kanggo {{SITENAME}} ($4). Tembung wadi sawetara kanggo panganggo \"$2\" wis digawé lan saiki \"$3\". Yèn panjenengan pancèn nggayuh iki, mangga énggal mlebu log lan ngganti tembung wadi saiki.\nTembung wadi sawetara mau bakal kadaluwarsa ing {{PLURAL:$5|sadina|$5 dina}}.\nYèn wong liya kang nglakoni panyuwunan iki, utawa panjenengan éling tembung wadi panjenengan, lan ora kepéngin ngowahi, panjenengan ora usah nggubris pesen iki lan bisa tetep nganggo tembung wadi lawas.",
+       "passwordremindertext": "Ana wong (mbokmanawa kowé dhéwé, saka alamat IP $1) njaluk supaya kiniriman tembung wadi anyar tumrap {{SITENAME}} ($4). Tembung wadi sawatara tumrap panganggo \"$2\" wis kagawé lan saiki kasetèl dadi \"$3\". Yèn kowé pancèn ngarep-arep iki, kowé kudu mlebu log lan ngganti tembung wadi saiki.\nTembung wadi sawatara mau bakal kadaluwarsa ing dalem {{PLURAL:$5|sadina|$5 dina}}.\n\nYèn wong liya kang nggawé panjaluk iki, utawa yèn kowé éling tembung wadimu, lan kowé ora péngin ngowahi, kowé ora perlu nggapé layang iki lan bisa panggah nganggo tembung wadi kang lawas.",
        "noemail": "Ora ana alamat layang-èl kang kacathet tumrap ing panganggo \"$1\".",
-       "noemailcreate": "Panjenengan kudu maringi alamat e-mail kang trep",
-       "passwordsent": "Tembung sandi anyar wis dikirim menyang alamat layang èlèktronik tumrap \"$1\". \nMangga mlebu log manèh sawisé panjenengan nampa iku.",
-       "blocked-mailpassword": "Alamat IP-né panjenengan kablokir saka mbesut. Kanggo ngéndhani laku salah-guna, ora kena nganggo pamulih tembung wadi saka alamat IP iki.",
-       "eauthentsent": "Layang-èl konfirmasi wis dikirim menyang alamat layang-èl kang diisèkaké. Sadurungé ana layang-èl liyané kang dikirim menyang akun iku, panjenengan kudu nuruti arahan ana ing layang-èl iku saperlu ngonfirmasi yèn akun iku pancèn duwèké panjenengan.",
+       "noemailcreate": "Kowé kudu mènèhi alamat layang-èl kang trep",
+       "passwordsent": "Tembung wadi anyar wis kinirim menyang alamat layang-èl kang kadhaftar tumrap \"$1\". \nMangga mlebu log manèh sawisé kowé nampa iku.",
+       "blocked-mailpassword": "Alamat IP-mu kablokir saka mbesut. Kanggo ngéndhani laku salah-guna, ora kena nganggo pamulih tembung wadi saka alamat IP iki.",
+       "eauthentsent": "Layang-èl konfirmasi wis kinirim menyang alamat layang-èl kang koisèkaké. Sadurungé ana layang-èl liyané kang kinirim menyang akun iku, kowé kudu nututi panuntun ing layang-èl iku saperlu ngonfirmasi yèn akun iku pancèn duwèmu.",
        "throttled-mailpassword": "Layang kanggo mbalèkaké tembung wadi wis dikirim sasuwené ing {{PLURAL:$1|jam|$1 jam}}.\nKanggo nyegah ananing tumindhak culika, namung sak layang kanggo mbalèkaké tembung wadi kang bakal dikirim sasuwéné ing {{PLURAL:$1|jam|$1 jam}}.",
        "mailerror": "Masalah pangirim layang: $1",
        "acct_creation_throttle_hit": "Para neneka menyang wiki iki kang nganggo alamat IP-né panjenengan wis gawé {{PLURAL:$1|akun cacah 1|akun cacah $1}} sajeroné $2 pungkasan, kang cacahé nyandhak cacah maksimum kang diidinaké.\nTemahané, para neneka kang nganggo alamat IP iki ora bisa gawé akun manèh sauntara iki.",
        "prefs-help-signature": "Tanggepan ing kaca parembugan kudu ditapakasmani mawa \"<nowiki>~~~~</nowiki>\", kang bakal salin dadi tapak asma lan tandha wektuné panjenengan.",
        "badsig": "Tapak astanipun klèntu; cèk rambu HTML.",
        "badsiglength": "Tapak asta panjenengan kedawan.\nAja luwih saka {{PLURAL:$1|karakter|karakter}}.",
-       "yourgender": "Kepiyé panjenengan nggambaraké salirané panjenengan?",
+       "yourgender": "Kapriyé kowé ngandharaké awakmu dhéwé?",
        "gender-unknown": "Nalika nyebut panjenengan, piranti alusé bakal nganggo tembung kang nétral jèndher sabisané",
        "gender-male": "Lanang",
        "gender-female": "Wadon",
        "rcfilters-noresults-conflict": "Ora ana kasil amarga wewatoné kanggo nggolèk ana masalah",
        "rcfilters-filtergroup-authorship": "Pangripta besutan",
        "rcfilters-filter-editsbyself-label": "Owah-owahané panjenengan",
-       "rcfilters-filter-editsbyself-description": "Pisumbangé panjenengan dhéwé.",
+       "rcfilters-filter-editsbyself-description": "Pasumbangmu dhéwé.",
        "rcfilters-filter-editsbyother-label": "Owah-owahané liyan",
        "rcfilters-filter-editsbyother-description": "Kabèh owahan kajaba duwèké panjenengan.",
        "rcfilters-filtergroup-user-experience-level": "Pandhaftaran lan pangalaman pangguna",
        "categories-submit": "Tuduhaké",
        "categoriespagetext": "{{PLURAL:$1|kategori ing ngisor iki ngandhut|kategori ing ngisor iki ngandhut}} kaca utawa media.\n[[Special:UnusedCategories|Kategori kang ora dianggo]] ora ditampilaké ing kéné.\nDeleng uga [[Special:WantedCategories|kategori kang diperlokaké]].",
        "categoriesfrom": "Tuduhaké kategori kang kawiwitan:",
-       "deletedcontributions": "Pisumbanging panganggo kang dibusak",
-       "deletedcontributions-title": "Pisumbanging panganggo kang dibusak",
+       "deletedcontributions": "Pasumbanging panganggo kang kabusek",
+       "deletedcontributions-title": "Pasumbanging panganggo kang kabusek",
        "sp-deletedcontributions-contribs": "pasumbang",
        "linksearch": "Golèkan pranala njaba",
        "linksearch-pat": "Polah ing gegolèkan:",
        "namespace_association": "Mandhala aran magepokan",
        "tooltip-namespace_association": "Cénthang kothak iki kanggo nglebokaké uga mandhala aran parembugan utawa subyèk kang gegayutan karo mandhala aran kapilih",
        "blanknamespace": "(Pokok)",
-       "contributions": "Pisumbanging {{GENDER:$1|panganggo}}",
-       "contributions-title": "Pisumbanging panganggo $1",
+       "contributions": "Pasumbanging {{GENDER:$1|panganggo}}",
+       "contributions-title": "Pasumbanging panganggo $1",
        "mycontris": "Pasumbang",
        "anoncontribs": "Pasumbang",
        "contribsub2": "Kanggo {{GENDER:$3|$1}} ($2)",
        "uctop": "saiki",
        "month": "Saka wulan (lan sadurungé):",
        "year": "Saka taun (lan sadurungé):",
-       "sp-contributions-newbies": "Tuduhaké mung pisumbangé akun-akun anyar waé",
+       "sp-contributions-newbies": "Tuduhaké pasumbangé akun-akun anyar baé",
        "sp-contributions-newbies-sub": "Kanggo panganggo anyar",
-       "sp-contributions-newbies-title": "Pisumbanging panganggo anyar",
+       "sp-contributions-newbies-title": "Pasumbanging panganggo anyar",
        "sp-contributions-blocklog": "log blokir",
-       "sp-contributions-deleted": "pisumbangé {{GENDER:$1|panganggo}} kang dibusak",
+       "sp-contributions-deleted": "pasumbangé {{GENDER:$1|panganggo}} kang kabusek",
        "sp-contributions-uploads": "unggahan",
        "sp-contributions-logs": "log",
        "sp-contributions-talk": "rembug",
        "badipaddress": "Alamat IP klèntu",
        "blockipsuccesssub": "Suksès mblokir",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] wis diblokir.<br />\nDeleng [[Special:BlockList|pratélan blokir]] saperlu mriksa blokiran.",
-       "ipb-blockingself": "Panjenengan arep mblokir panjenengan dhéwé! Panjenengan yakin arep nglakoni iku?",
+       "ipb-blockingself": "Kowé arep mblokir awakmu dhéwé! Kowé yakin arep nglakoni iku?",
        "ipb-confirmhideuser": "Panjenengan arep mblokir panganggo mawa piranti \"dhelikaké panganggo\" isih murub. Iki bakal nyegah jeneng panganggo ana ing kabèh pratélan lan èntri log. Panjenengan yakin arep nglakoni iku?",
        "ipb-edit-dropdown": "Besut alesané mblokir",
        "ipb-unblock-addr": "Copot blokiran tumrap $1",
        "xffblockreason": "Sebuah alamat IP di kepala X-Forwarded-For, entah milik Anda atau server proxy yang Anda pakai, telah diblokir. Alasan pemblokirannya adalah: $1",
        "cant-see-hidden-user": "Panganggo kang panjenengan coba blokir wis kablokir lan didhelikaké.\nAmarga panjenengan ora nduwé hak ndhelikaké panganggo, panjenengan ora bisa ndeleng utawa mbesut blokiran panganggo.",
        "ipbblocked": "Panjenengan ora bisa mblokir utawa mbukak blokiran panganggo liya amarga panjenengan dhéwé diblokir",
-       "ipbnounblockself": "Panjenengan ora dililakaké mbukak blokirané panjenengan",
+       "ipbnounblockself": "Kowé ora kawogan mbukak blokiranmu dhéwé.",
        "lockdb": "Gembok basis dhatah",
        "unlockdb": "Bukak gembok basis dhatah",
        "lockdbtext": "Ngunci basis data bakal menggak kabèh panganggo kanggo mbesut kaca, ngowahi prèferènsi panganggo, mbesut pawawangan, lan prekara-prekara liyané kang merlokaké owah-owahan basis data. Pastèkna yèn iki pancèn panjenengan gayuh, lan yèn panjenengan ora lali mbuka kunci basis data sawisé pangopènan rampung.",
        "tooltip-pt-anontalk": "Parembug ing besutan-besutan saka alamat IP iki",
        "tooltip-pt-preferences": "Pilalané {{GENDER:|panjenengan}}",
        "tooltip-pt-watchlist": "Pratélan kaca kang panjenengan awasi owah-owahané",
-       "tooltip-pt-mycontris": "Pratélaning pisumbangé {{GENDER:|panjenengan}}",
+       "tooltip-pt-mycontris": "Pratélaning {{GENDER:|pasumbangmu}}",
        "tooltip-pt-anoncontribs": "Pratélan besutané alamat IP iki",
        "tooltip-pt-login": "Panjenengan prayogané mlebu log, sanajan ora kudu",
        "tooltip-pt-login-private": "Panjenengan kudu mlebu log supaya bisa nganggo wiki iki",
        "tooltip-t-recentchangeslinked": "Owah-owahan anyar saka kaca-kaca kang nggayut kaca iki",
        "tooltip-feed-rss": "''RSS feed'' kanggo kaca iki",
        "tooltip-feed-atom": "Pakan atom tumrap kaca iki",
-       "tooltip-t-contributions": "Pratélaning pisumbanging {{GENDER:$1|panganggo iki}}",
+       "tooltip-t-contributions": "Pratélaning pasumbanging {{GENDER:$1|panganggo iki}}",
        "tooltip-t-emailuser": "Kirimi layang-èl menyang {{GENDER:$1|panganggo iki}}",
        "tooltip-t-info": "Katerangan liyané ngenani kaca iki",
        "tooltip-t-upload": "Unggah barkas",
        "tags-deactivate-not-allowed": "Mokal matèni tenger \"$1\".",
        "tags-deactivate-submit": "Patèni",
        "tags-apply-no-permission": "Panjenengan ora kawogan ngecakaké tenger owahan bebarengan karo owahané panjenengan.",
-       "tags-apply-blocked": "Panjenengan ora bisa ngecakaké tenger owahan bebarengan karo owahané panjenengan manawa {{GENDER:$1|panjenengan}} diblokir.",
+       "tags-apply-blocked": "Kowé ora bisa ngacakaké tengering owahan saha owahanmu yèn {{GENDER:$1|kowé}} kablokir.",
        "tags-apply-not-allowed-one": "Tenger \"$1\" ora kena dicakaké kanthi manual.",
        "tags-edit-existing-tags": "Tenger kang ana:",
        "tags-edit-existing-tags-none": "<em>Ora ana</em>",
        "mw-widgets-abandonedit": "Panjenengan temen arep metu saka pambesutan tanpa nyimpen dhisik?",
        "mw-widgets-abandonedit-discard": "Buwang besutan",
        "mw-widgets-abandonedit-keep": "Banjuraké mbesut",
-       "mw-widgets-abandonedit-title": "Panjenengan yakin?",
+       "mw-widgets-abandonedit-title": "Kowé yakin?",
        "mw-widgets-dateinput-no-date": "Ora ana tanggal kang dipilih",
        "mw-widgets-mediasearch-input-placeholder": "Golèk médhia",
        "mw-widgets-mediasearch-noresults": "Ora ana wohing panggolèk.",
index a3e81b2..5efc974 100644 (file)
        "right-userrights": "사용자의 모든 권한 조정",
        "right-userrights-interwiki": "다른 위키의 사용자 권한을 조정",
        "right-siteadmin": "데이터베이스를 잠그거나 잠금 해제",
-       "right-override-export-depth": "5단계로 링크된 문서를 포함하여 문서를 내보내기",
+       "right-override-export-depth": "최대 5단계로 링크된 문서를 포함하여 문서를 내보내기",
        "right-sendemail": "다른 사용자에게 이메일 보내기",
        "right-managechangetags": "데이터베이스에서 [[Special:Tags|태그]]를 만들거나 지우기",
        "right-applychangetags": "자신이 편집할 때 [[Special:Tags|태그]]를 적용하기",
        "action-changetags": "문서의 특정 판과 특정 기록 항목에 임의의 태그를 추가하거나 제거하기",
        "action-deletechangetags": "데이터베이스에서 태그를 지우기",
        "action-purge": "이 문서 새로 고침",
+       "action-apihighlimits": "API 쿼리에서 더 높은 제한 사용",
+       "action-autoconfirmed": "IP 기반의 속도 제한에 영향을 받지 않음",
+       "action-bigdelete": "문서 역사가 긴 문서를 삭제",
+       "action-blockemail": "사용자가 이메일을 보내지 못하도록 차단",
+       "action-bot": "봇의 편집으로 취급",
+       "action-editprotected": "\"{{int:protect-level-sysop}}\"로 보호된 문서 편집",
+       "action-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\"로 보호된 문서 편집",
        "action-editinterface": "사용자 인터페이스 문서 편집",
        "action-editusercss": "다른 사용자의 CSS 파일 편집",
        "action-edituserjson": "다른 사용자의 JSON 파일 편집",
        "action-editmyuserjson": "자신의 사용자 JSON 파일 편집하기",
        "action-editmyuserjs": "자신의 사용자 자바스크립트 파일 편집하기",
        "action-viewsuppressed": "어떤 사용자도 보지 못하도록 감춰진 판 보기",
+       "action-hideuser": "사용자 이름을 차단하고 감춤",
+       "action-ipblock-exempt": "IP 차단, 자동 차단, 광역 차단을 무시",
        "action-unblockself": "자신을 차단 해제하기",
+       "action-noratelimit": "속도 제한에 영향을 받지 않음",
+       "action-reupload-own": "자신이 이미 올린 파일 덮어쓰기",
+       "action-nominornewtalk": "토론 문서에서 사소한 편집으로 새 메시지 알림을 보내지 않기",
+       "action-markbotedits": "되돌리기를 봇의 편집으로 취급 가능",
+       "action-patrolmarks": "최근 바뀜에서 점검 표시를 보기",
+       "action-override-export-depth": "최대 5단계로 링크된 문서를 포함하여 문서를 내보내기",
+       "action-suppressredirect": "문서를 이동할 때 원래 문서 이름으로 된 넘겨주기를 만들지 않기",
        "nchanges": "$1개 {{PLURAL:$1|바뀜}}",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|마지막 방문 이후}} $1개",
        "enhancedrc-history": "역사",
        "ipb_expiry_old": "기한을 과거로 입력했습니다.",
        "ipb_expiry_temp": "사용자 이름을 숨기는 차단은 반드시 무기한이어야 합니다.",
        "ipb_hide_invalid": "해당 계정은 막을 수 없습니다. {{PLURAL:$1|1회|$1회}} 이상 편집했습니다.",
+       "ipb_hide_partial": "사용자 이름이 숨겨진 계정의 차단은 사이트 전역 차단이어야 합니다.",
        "ipb_already_blocked": "\"$1\"님은 이미 차단되었습니다.",
        "ipb-needreblock": "$1님은 이미 차단되었습니다. 차단 설정을 바꾸시겠습니까?",
        "ipb-otherblocks-header": "다른 {{PLURAL:$1|차단}} 기록",
        "special-characters-title-emdash": "em 대시",
        "special-characters-title-minus": "빼기 기호",
        "mw-widgets-abandonedit": "정말 저장하지 않고 편집을 그만 두겠습니까?",
-       "mw-widgets-abandonedit-discard": "편집 버리기",
+       "mw-widgets-abandonedit-discard": "편집 그만두기",
        "mw-widgets-abandonedit-keep": "편집 계속",
        "mw-widgets-abandonedit-title": "확실합니까?",
        "mw-widgets-copytextlayout-copy": "복사",
index ea0453d..57f0c4b 100644 (file)
        "accmailtitle": "رازینٱ گوئارسن کلٛ بی",
        "accmailtext": "یئ گئل رازینە گوڤاردئن شامسأکی سی[[User talk:$1|$1]] سی $2 کئل بییە.بوٙە ڤئنە د گات ڤئ کار گئرئتئن بألگە ڤامین ئوٙمائن <em>[[Special:آلئشت دأئن رازینە گوڤاردئن|آلئشت دأئن رازینە گوڤاردئن]]</em> آلئشت کاری با.",
        "newarticle": "تازٱ",
-       "newarticletext": "شما هائؽت ڤا دما هوم پاٛڤٱنؽ اْ ڤوجۊد نارٱ.\nسی رٱڤٱندؽاری بٱلگٱ.شرۊ بٱکؽت مؽن جٱڤٱ هوری بٱنیسؽت (سی دونسن بؽشتر ساٛلٛ [$1 ] بٱکؽت).\nٱر شما اْشتبا هائؽت ایچاْ، ری دۏگمٱ ڤادما رٱتن دوئرتٱ بٱپۊرنؽت.",
+       "newarticletext": "شما هائؽت ڤا دما هوم پاٛڤٱنؽ کاْ ڤوجۊد نارٱ.\nسی رٱڤٱندؽاری بٱلگٱ.شرۊ بٱکؽت مؽن جٱڤٱ هاری بٱنیسؽت (سی دونسن بؽشتر ساٛلٛ [$1 ] بٱکؽت).\nٱر شما اْشتبا هائؽت ایچاْ، ری دۏگمٱ ڤادما رٱتن دوئرتٱ بٱپۊرنؽت.",
        "anontalkpagetext": "----",
        "noarticletext": "د ایسنؽا اؽ بٱلگٱ نیسسٱ ڤجۊد ناشتٱ.\nشما مؽ تونؽت د[[Special:Search/{{PAGENAME}}|ڤرگٱردؽد]] د اؽ بٱلگٱ ڤ بٱلگٱ هنی یا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} د نۊ پاٛجۊری بۊئٱ]</span>، <span class=\"plainlinks\">[{{fullurl:{{FULLPAGENAME}}|action=edit}} یا اؽ بٱلگٱ ناْ ڤیرایش بٱکؽت]</span>.",
        "noarticletext-nopermission": "د ایسنؽا اؽ بٱلگٱ نیسساٛیؽ ڤجۊد ناشتٱ.\nشما مؽ تونؽت د[[Special:Search/{{PAGENAME}}|بٱگردؽد]] د اؽ بٱلگٱیا د بٱلگٱ هنی یا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} د نۊ پاٛجۊری بۊئٱ]</span>، <span class=\"plainlinks\">[{{fullurl:{{FULLPAGENAME}}|action=edit}}</span>.ڤلی شما سلا یٱناْ کاْ اؽ بٱلگٱ ناْ دۏرس بٱکؽت نارؽت.",
-       "missing-revision": "ڤانیٱری #$1 د بٱلگاٛیؽ کاْ نومش ڤنٱ \"{{FULLPAGENAME}}\" ڤوجۊد نارٱ.\n\nگاسؽ سی یاٛ ڤیرگار ڤاْ هٱنگوم ناٛییٱ اْ د یاٛ بٱلگٱ پاکسا بیٱ هوم پاٛڤٱن بیٱ رٱڤٱندؽاری بیٱ.\nگاسؽ جۏزییات د[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] دؽاری بٱکٱن.",
-       "userpage-userdoesnotexist": "هساو کاریاری \"$1\" سٱبت نوم ناٛییٱ.ٱ\nٱر مؽ هایؽت اؽ بٱلگٱ ناْ بٱسازؽت یا ڤیرایش کاری بٱکؽت یاٛ ڤارسی ٱنجوم باٛیؽتو.",
+       "missing-revision": "ڤانیٱری #$1 د بٱلگاٛیؽ کاْ نومش ڤنٱ \"{{FULLPAGENAME}}\" ڤوجۊد نارٱ.\n\nگاسؽ سی یاٛ ڤیرگار ڤاْ هٱنگوم ناٛییٱ کاْ د یاٛ بٱلگٱ پاکسا بیٱ هوم پاٛڤٱن بیٱ رٱڤٱندؽاری بیٱ.\nگاسؽ جۏزییات د[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] دؽاری بٱکٱن.",
+       "userpage-userdoesnotexist": "هساو کاریاری \"$1\" سٱبت نوم ناٛییٱ.\nٱر مؽ هایؽت اؽ بٱلگٱ ناْ بٱسازؽت یا ڤیرایش کاری بٱکؽت یاٛ ڤارسی ٱنجوم باٛیؽتو.",
        "userpage-userdoesnotexist-view": "هساو کاریاری \"$1\" سٱبت ناٛییٱ.",
        "blocked-notice-logextract": "اؽ کاریار د ایساْ نهاگیری بیٱ.\nآخری پهرستنومٱ نهاگیری د ھار سی سرچشمٱ آمادٱ کاری بیٱ:",
        "clearyourcache": "<strong>ڤ ڤیر داشتۊئؽت:</strong> نوئا آمایٱ کاری،گاسؽ شما مٱجبۊر د ڤ کار ڤٱنن ڤیرگٱ قایم بیٱ دوئارتٱ نییٱر خوتوݩ سی دیئن اؽ آلشتکاری بۊیؽت.\n* <strong>فایرفاکس/ سٱفٱری:</strong> بٱپۊرنؽت ری<em>شیفت</em> اۊساْ کاْ ؽ پۊرنؽت <em> ڤٱ د نۊ سڤار مۊئٱ </em>یا ھنی ری <em>Ctrl-F5</em> بٱپۊرنؽت یا<em>Ctrl-R</em> (<em>⌘-R</em> د سامونٱ مٱک)\n* <strong>گۊگل کروم:</ strong>بٱپۊرنؽت ری <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> یا د سامونٱ)\n* <strong>اینترنت اْکسپلورر:</strong> <em>Ctrl</em> ناْ ڤادارؽت اۊساْ کاْ مؽپۊنؽت <em>ری کلٛیلٛ رفرش</em>،یا ڤاداشتیتٱ<em>Ctrl-F5</em>\n* <strong>اوپرا:</strong> ڤیرگٱ قایم بیٱ د <em>أڤزارؽا→ آولٱڤؽٱتؽاناْ پاکسا بٱکؽت</em>",
-       "usercssyoucanpreview": "<strong>چی ڤأرتیە گئر:</strong>  دوگمە\"{{int:showpreview}}\" سی ئزماشت کاری سی ئس ئس تازە دئما ئمایە کاری ڤئ کار بئیریت.",
-       "userjsyoucanpreview": "<strong>چی ڤأرتیە گئر:</strong>  دوگمە\"{{int:showpreview}}\" سی ئزماشت کاری جاڤا ئسکئریپت تازە دئما ئمایە کاری ڤئ کار بئیریت.",
-       "usercsspreview": "<strong>د ڤیر داشتوٙئیت کئ شوما فأقأط می توٙنیت سی ئس ئس کاریاری توٙنە پیش سئیل بأکیت. ڤئ ئیسئنی ئمایە نأبییە!</strong>",
-       "userjspreview": "<strong>د ڤیر داشتوٙئیت کئ شوما فأقأط می توٙنیت جاڤا ئسکئریپت کاریاری توٙنە پیش سئیل بأکیت. ڤئ ئیسئنی ئمایە نأبییە!</strong>",
-       "sitecsspreview": "<strong>د ڤیر داشتوٙئیت کئ شوما فأقأط می توٙنیت ئی سی ئس ئس کاریاری توٙنە پیش سئیل بأکیت. ڤئ ئیسئنی ئمایە نأبییە!</strong>",
-       "sitejspreview": "<strong>د ڤیر داشتوٙئیت کئ شوما فأقأط می توٙنیت ئی جاڤا ئسکئریپت کاریاری توٙنە پیش سئیل بأکیت. ڤئ ئیسئنی ئمایە نأبییە!</strong>",
+       "usercssyoucanpreview": "<strong>چی ڤٱرتیٱگیر:</strong>  دۏگمٱ\"{{int:showpreview}}\" سی اْزماشت کاری سی اْس اْس تازٱ دما آمادٱ کاری ڤ کار باٛیرؽت.",
+       "userjsyoucanpreview": "<strong>چی ڤٱرتیٱگیر:</strong>  دۏگمٱ\"{{int:showpreview}}\" سی اْزماشت کاری جاڤا اْسکریپت تازٱ دما آمادٱ کاری ڤ کار باٛیرؽت.",
+       "usercsspreview": "<strong>ڤ ڤیر داشتۊیؽت کاْ شما فقٱت مؽ تونؽت سی اْس اْس کاریاری توناْ پیش ساٛلٛ بٱکؽت. ڤٱ ایساْ آمادٱ ناٛییٱ!</strong>",
+       "userjspreview": "<strong>ڤ ڤیر داشتۊیؽت کاْ شما فقٱت می تونؽت جاڤا اْسکریپت کاریاری توناْ پیش ساٛلٛ بٱکؽت. ڤٱ ایساْ آمادٱ ناٛییٱ!</strong>",
+       "sitecsspreview": "<strongڤ ڤیر داشتۊیؽت کاْ شما فقٱت مؽ تونؽت اؽ سی اْس اْس کاریاری توناْ پیش ساٛلٛ بٱکؽت. ڤٱ ایساْ آمادٱ ناٛییٱ!</strong>",
+       "sitejspreview": "<strong>ڤ ڤیر داشتۊیؽت کاْ شما فقٱت مؽ تونؽت کاْ جاڤا اْسکریپت کاریاری توناْ پیش ساٛلٛ بٱکؽت. ڤٱ ایساْ آمادٱ ناٛییٱ!</strong>",
        "userinvalidconfigtitle": "<strong>زئنار:</strong> پوٙسە \"$1\" نیئش.\nسی ئس ئس جاڤأنە و بألگە یا جاڤا ئسکئریپت سأربألگ ڤا حأرفیا کوچئک نە ڤئ کار گئرئتە، ھأمچئنی {{ns:کاریار}}:فو/ڤئکتور.سی ئس ئس چی د ری ڤئ ری {{ns:کاریار}}:فو/ڤئکتور. سی ئس ئسە.",
-       "updated": "(ڤئ هئنگوم سازی بییە)",
-       "note": "'''نیسأنئن:'''",
+       "updated": "(ڤٱ هٱنگوم سازی بیٱ)",
+       "note": "'''نیسٱنن:'''",
        "previewnote": "فقٱت اؽ پیش ساٛلٛ ڤ ڤیرتو با.\nآلشت کاریاتو ھنی آمایٱ ناٛیٱ",
        "continue-editing": "رۉ د راساگٱ ڤیرایش کاری",
-       "previewconflict": "ڤئرگأشت پیش سئیل د نیسئسە د راساگە ڤارو ڤیرایئشت کاری چی شئکل دیار بییئن بوٙەأر شوما  ڤئ نە سی ئمایە کئردئن ئنتئخاڤ بأکیت.",
+       "previewconflict": " ڤرگٱشت پیش ساٛلٛ د نیسسٱ د راساگٱ ڤارۉ ڤیرایش کاری چی شکل دؽار بیئن بۊهٱر شوما ڤٱ ناْ سی آمادٱ کردن اْنتخاب بٱکؽت.",
        "session_fail_preview": "<strong>د بأخت گأن سی یە کئ رئسینە یا نئشأسجا نە د دأس دأئیمە نئمی توٙنیم کار پأردازئشت ڤیرایئشت کاری شومانە أنجوم بئمینوٙ.</strong>\nلوطف بأکیت یئ گئل ھأنی تئلاش بأکیت.\nأر ھأنی ڤئ دوروس کار نأکئرد،[[Special:UserLogout|ئوٙمائن ڤئ دأر]] نە ئزمایئشت بأکیت و د نۊ بیائیت ڤامین.",
        "session_fail_preview_html": "<strong>د بأخت گأن سی یە کئ رئسینە یا نئشأسجا نە د دأس دأئیمە نئمی توٙنیم کار پأردازئشت ڤیرایئشت کاری شومانە أنجوم بئمینوٙ.</strong>\n\n\n<em>سی یە کئ {{SITENAME}} یئ گئل رأگ ئچ تی ئم ئل کونئشتکار بییە دارە، پیش سئیل سی یە کئ د دأس چول کاریا جاڤا ئسکئریپت لیز داشتوٙە نئھوٙ بییە..</em>\n\nلوطف بأکیت یئ گئل ھأنی تئلاش بأکیت.\nأر ھأنی ڤئ دوروس کار نأکئرد،[[Special:UserLogout|ئوٙمائن ڤئ دأر]] نە ئزمایئشت بأکیت و د نۊ بیائیت ڤامین.",
-       "token_suffix_mismatch": "<strong>Ú¤Û\8cراÛ\8cئشتÛ\8cا Ø´Ù\88Ù\85ا Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ø¯Ù\88ڤارتÛ\95 Ù\86Û\8cأر Ø´Ù\88Ù\85ا Ù\86Û\8cسئسÛ\95 Û\8cا Ù\86Ù\88Ù\82Ø·Û\95 Ù\86Û\8cائÙ\86 Ù\86Û\95 Ø¯ Ø±Ø§Ø²Û\8cÙ\86Û\95 Ø£Ù\85Û\8cÙ\86Û\8cأتÛ\8c Ú¤Û\8cراÛ\8cئشت Ø¯ Û\8cØ£Ú© ØªÛ\8cÚ\86ئسÛ\95 Ø±Ø£Ø¯ Ù\85Û\8cÚ©Û\95.</strong>\nÚ¤Û\8cراÛ\8cئشت Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ø¯ Ø®Ø¦Ø±Ø§Ú¤ Ø¨Û\8cÛ\8cئÙ\86 Ù\86Û\8cسئسÛ\95 Ø¨Ø£Ù\84Ú¯Û\95 Ù\86ئھاگئرÛ\8c Ø¨Ø§ Ø±Ø£Ø¯ Ø¨Û\8cÛ\8cÛ\95.\nئÛ\8c Ø±Ù\88Ø® Ú¤Ø£Ù\86 Ø¯ Ú¯Ø§ØªÛ\8cاÛ\8cÛ\8c Ù¾Û\8cØ´ Ù\85Û\8cا Ú©Ø¦ Ø´Ù\88Ù\85ا Û\8cئ Ú¯Ø¦Ù\84  Ø±Ø¦Ø³Û\8cÙ\86Û\95 Ø¬Ø§ Ù¾Ù\88رÙ\88کسÛ\8c Ù\86Û\95 Ú¤Ø¦ Ú©Ø§Ø± Ø¨Ø¦Û\8cرÛ\8cت.",
-       "edit_form_incomplete": "<strong>پارÛ\95 Û\8cÛ\8c Ø¯ Ú¤Û\8cراÛ\8cئشتÛ\8cا Ú¤Ø¦ Ø±Ø¦Ø³Û\8cÙ\86Û\95 Ø¬Ø§ Ù\86ئÙ\85Û\8c Ø±Ø¦Ø³Ø¦Ù\86Ø\8c Ø¯ Ù\86Û\8a Ú¤Ø§Ø±Ø¦Ø³Û\8c Ø¨Ø£Ú©Û\8cت Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ø¯ Ø®Ù\88Ù\99 Ø¨Û\8cÛ\8cئÙ\86 Ú¤Û\8cراÛ\8cئشتÛ\8cا Ø®Ù\88تÙ\88Ù\99 Ú¤Ø§Ø±Ø¦Ø³Û\8cارÛ\8c Ø¨Ø£Ú©Û\8cت Ù\88 Ø¯ Ù\86Û\8a ØªØ¦Ù\84اش Ø¨Ø£Ú©Û\8cت.</strong>",
+       "token_suffix_mismatch": "<strong>Ú¤Û\8cراÛ\8cشتؽا Ø´Ù\85ا Ø³Û\8c Û\8cÙ± Ú©Ø§Ù\92 Ø¯Ù\88ئرتٱ Ø´Ù\85ا Ù\86Û\8cسسٱ Û\8cا Ù\86Û\8fÙ\82تٱ Ù\86ؽاÛ\8cÙ\86 Ù\86اÙ\92 Ø¯ Ø±Ø§Ø²Û\8cÙ\86Ù± Ù±Ù\85Ù\86Û\8cٱتÛ\8c Ú¤Û\8cراÛ\8cØ´ Ø¯ Û\8cÙ±Ú© ØªÛ\8cÚ\86سٱ Ø±Ù±Ø¯ Ù\85ؽکٱ.</strong>\nÚ¤Û\8cراÛ\8cØ´ Ø³Û\8c Û\8cÙ± Ú©Ø§Ù\92 Ø¯ Ø®Ø±Ø§Ù\88 Ø¨Û\8cئÙ\86 Ù\86Û\8cسسٱ Ø¨Ù±Ù\84Ú¯Ù± Ù\86Ù\87اگÛ\8cرÛ\8c Ø¨Ø§ Ø±Ù±Ø¯ Ø¨Û\8cÙ±.\nاؽ Ø±Ù\88Ø® Ú¤Ù±Ù\86 Ø¯ Ú¯Ø§ØªØ½Ø§Û\8cؽ Ù¾Û\8cØ´ Ù\85ؽا Ú©Ø§Ù\92 Ø´Ù\85ا Û\8cاÙ\9b Ø±Ø³Û\8cÙ\86Ù± Ø¬Ø§ Ù¾Ù\88رÙ\88کسÛ\8c Ù\86اÙ\92 Ú¤ Ú©Ø§Ø± Ø¨Ø§Ù\9bÛ\8cرؽت.",
+       "edit_form_incomplete": "<strong>Ù\82رÛ\8c Ø¯ Ú¤Û\8cراÛ\8cشؽا Ú¤ Ø±Ø³Û\8cÙ\86ٱجا Ù\86Ù\85ؽ Ø±Ù±Ø³Ù±Ù\86Ø\8c Ø¯ Ù\86Û\8a Ú¤Ø§Ø±Ø³Û\8c Ø¨Ù±Ú©Ø½Øª Ø³Û\8c Û\8cÙ\88 Ú©Ø§Ù\92 Ø¯ Ø®Û\8a Ø¨Û\8cئÙ\86 Ú¤Û\8cراÛ\8cشؽا Ø®Ù\88تÙ\88 Ú¤Ø§Ø±Ù±Ø³Û\8cارÛ\8c Ø¨Ù±Ú©Ø½Øª Û\89 Ø¯ Ù\86Û\8a ØªÙ±Ù\81رٱ Ø¨Ù±Ú©Ø½ت.</strong>",
        "editing": "د هال ۉ بال ڤیرایش $1",
        "creating": "دۏرس کردن $1",
-       "editingsection": "د هال ۉ بال ڤیرایش $1 (بٱرجا$1)",
-       "editingcomment": "د حال و بال ڤیرایئشت $1 (بأرجا تازە)",
-       "editconflict": "ری ڤئ ری کاری د ڤیرایئشت: $1",
-       "explainconflict": "د گاتی کئ شوما شوروٙ د ڤیرایئشت کاری د بألگە کئردیتە، یئ کأس ھأنی ئی بألگە نئ آلئشت دئە.\nراساگە ڤارو نیسئسە بألگە، نیسئسە نە چی یە کئ ڤوجوٙد داشتوٙە د ڤأر گئرئتە.\nآلئشتکاریا شوم د نیسئسە ھاری دیاری میکە.\nشوما بایأد آلئشت کاریاتوٙنە د نیسئسە یی کئ ھیش سأریأک بأکیت.\nفأقأط نیسئسە یی کئ ھا د ڤارو د گاتی کئ شوما\"$1\" نە گوزارئشت میکیت ئمایە بوٙە.",
-       "yourtext": "Ù\86Û\8cسئسÛ\95 Ø´Ù\88ما",
-       "storedversion": "ڤانئیأری ئمایە بییە",
-       "editingold": "<strong>د ڤیرئتوٙ با:شوما داریت یئ گئل ڤانئیأری ڤئ ھئنگوم نأبییە نە سی ئی بألگە ڤیرایئشت کاری میکید.</strong>\nأر شوما ڤئنە ئمایە بأکیت، ھأر آلئشت کاری کئ د أڤأل سی ئی ڤانئیأری أنجوم بییە نادیار موٙە.",
-       "yourdiff": "فأرخیا",
-       "copyrightwarning": "Ù\84Ù\88Ø·Ù\81 Ø¨Ø£Ú©Û\8cت Ø¯ Ú¤Û\8cر Ø¯Ø§Ø´ØªÙ\88Ù\99ئÛ\8cت Ú©Ø¦ Ø¦Û\8cÚ\86ئ Ù\81أرض Û\8cØ£Ù\86Û\95 Ú©Ø¦ Ú¾Ø£Ù\85Û\95 Ú¾Ù\88Ù\85Û\8cارÛ\8cا Ø´Ù\88Ù\85ا Ú¤Ø§{{SITENAME}} Ø¯ Ø­Ø§Ù\84 Ù\88 Ø¨Ø§Ù\84 Â«$2» Ø¯Ø£Ø±ØªÛ\8cÚ\86 Ø¨Ù\88Ù\99Û\95(سÛ\8c Ú\86Û\8cا ØªØ¦Ø± Ø±Ù\88ئÛ\8cت Ø¯ $1).\nأر Ù\86ئÙ\85Û\8cھاÛ\8cت Ú©Ø¦ Ù\86Û\8cسئسÛ\95 Û\8cا ØªÙ\88Ù\99 Ú©Ø¦ Ù\81ئرÛ\95 Ú¤Û\8cراÛ\8cئشت Ú©Ø§Ø±Û\8c Ø¨Û\8cÛ\8cÙ\86Û\95 Ù\88 Ø¯Ø¦Ù\84حا Ø¯Ø£Ø±ØªÛ\8cÚ\86 Ø¨Ø§Ù\86Ø\8c Ø¯ Ø¦Û\8cÚ\86ئ Ú©Ø¦Ù\84ئشÙ\88Ù\99 Ù\86Ø£Ú©Û\8cت.<br />\nھأÙ\85Ú\86ئÙ\86Û\8c Ø´Ù\88Ù\85ا Ø¯Ø§Ø±Û\8cت Ú¤Ø¦ Ø¦Û\8cÙ\85ا Ù\82Ù\88Ù\84 Ù\85ئÛ\8cت Ú©Ø¦ Ø®Ù\88تÙ\88Ù\99 Ú¤Ø¦Ù\86Ù\88Ù\99Ù\86Û\95 Ù\86Û\8cسأÙ\86Û\8cتÛ\95Ø\8c Û\8cا Ú¤Ø¦Ù\86Û\95 Ø¯ Ú¤Ø¦Ù\86Ù\88Ù\99Ù\86Û\95 Ø¯ Û\8cئ Ú¯Ø¦Ù\84 Ø³Ø£Ø±Ú\86ئشÙ\85Û\95 Ø¢Ø²Ø§Ø¯ Ú¤Ø§ Ø¨Ø£Ø±Ú©Ø¦Ø±Ø¯ Ú¾Ø£Ù\85Ø£Ú¯Ù\88Ù\99Ù\86Û\8c Û\8cا Ú\86Û\8cاÛ\8cÛ\8c Ú\86Û\8c Ú¤Ø¦ Ú¯Ø¦Ø±ØªÛ\8cتÛ\95.\n'''آرئÙ\86Ú¯Û\8cاÛ\8cÛ\8c Ú©Ø¦ ØµØ¦Ù\84ا Ø¯Ø£Ø±ØªÛ\8cÚ\86ئسئÙ\86 (copyright) Ú¾Ø§ Ø¯Ø¦Ø´Ù\88Ù\99 Ø¨Û\8c ØµØ¦Ù\84ا Ú©Ø¦Ù\84 Ù\86Ø£Ú©Û\8cت!'''",
+       "editingsection": "د Ù\87اÙ\84 Û\89 Ø¨Ø§Ù\84 Ú¤Û\8cراÛ\8cØ´ $1 (بٱئرجا$1)",
+       "editingcomment": "د هال ۉ بال ڤیرایش $1 (بٱئرجا تازٱ)",
+       "editconflict": "ری ڤ ری کاری د ڤیرایش: $1",
+       "explainconflict": "د گاتؽ کاْ شما شرۊ ڤ ڤیرایش کاری د بٱلگٱ کردؽتٱ، یاٛ کٱس ھنی اؽ بٱلگٱ ناْ آلشت کردٱ.\nراساگٱ ڤارۉ نیسسٱ بٱلگٱ، نیسسٱ ناْ چی یٱ کاْ ڤوجۊد داشتۊئٱ د ڤٱر گرتٱ.\nآلشتکاریا شما د نیسسٱ ھاری دؽاری مؽکٱ.\nشما بایٱد آلشت کاریاتو ناْ د نیسساٛیؽ کاْ ھؽ سٱریٱک بٱکؽت.\nفقٱت نیسساٛیؽ کاْ ھا ڤارۉ د گاتؽ کاْ شما\"$1\" ناْ گوزارش مؽ کؽت آمادٱ مۊئٱ.",
+       "yourtext": "Ù\86Û\8cسسٱ Ø´ما",
+       "storedversion": "ڤانیٱری آمادٱ بیٱ",
+       "editingold": "<strong>ڤ ڤیرتو با:شما ها یاٛ ڤانیٱری ڤ ھٱنگوم ناٛییٱ ناْ سی اؽ بٱلگٱ ڤیرایش کاری مؽکؽت.</strong>\nٱر شما ڤٱ. ناْ آمادٱ بٱکؽت، ھٱر آلشت کاری کاْ د ٱڤٱل سی اؽ ڤانیٱری ٱنجوم بیٱ نادؽار مۊئٱ.",
+       "yourdiff": "فٱرخؽا",
+       "copyrightwarning": "Ù\84Ù\88تÙ\81 Ø¨Ù±Ú©Ø½Øª Ø¯ Ú¤Û\8cر Ø¯Ø§Ø´ØªÛ\8aئؽت Ú©Ø§Ù\92 Ø§Û\8cÚ\86اÙ\92 Û\8cÙ\86Ù± Ú©Ø§Ù\92 Ú¾Ù±Ù\85Ù± Ú¾Ù\88Ù\85Û\8cارÛ\8cا Ø´Ù\85ا Ú¤Ø§{{SITENAME}} Ø¯ Ù\87اÙ\84 Û\89 Ø¨Ø§Ù\84 Â«$2» Ø¯Ø±ØªÛ\8cÚ\86 Ù\85Û\8aئٱ(سÛ\8c Ú\86Û\8cا ØªØ± Ø±Û\89ئؽت Ú¤$1).\nٱر Ù\86Ù\85ؽ Ù\87اÛ\8cت Ú©Ø§Ù\92 Ù\86Û\8cسسٱÛ\8cا ØªÙ\88 Ú©Ø§Ù\92 Ù\81رٱ Ú¤Û\8cراÛ\8cØ´ Ú©Ø§Ø±Û\8c Ø¨Û\8cÙ\86Ù± Û\89 Ø¯Ù\84Ù\87اÛ\8cÛ\8c Ø¯Ø±ØªÛ\8cÚ\86 Ø¨Ø§Ù\86Ø\8c Ø¯ Ø§Û\8cÚ\86اÙ\92 Ú©Ù\84Ù\9bØ´Ù\88 Ù\86ٱکؽت.<br />\nÚ¾Ù±Ù\85Ú\86Ù\86Û\8c Ø´Ù\85ا Ø¯Ø§Ø±Û\8cت Ú¤ Ø§Ø½Ù\85ا Ù\82Û\89Ù\84 Ù\85اÙ\9bÛ\8cؽت Ú©Ø§Ù\92 Ø®Ù\88تÙ\88 Ú¤Ù\86Ù\88Ù\86اÙ\92 Ù\86Û\8cسٱÙ\86ؽتٱØ\8c Û\8cا Ú¤Ù± Ù\86اÙ\92 Ø¯ Û\8cاÙ\9b Ø³Ø±Ú\86Ø´Ù\85Ù± Ø¢Ø²Ø§Ø¯ Ú¤Ø§ Ø¨Ù±Ø¦Ø±Ú©Ø±Ø¯ Ú¾Ù±Ù\85Ú¯Ù\88Ù\86Û\8c Û\8cا Ú\86Û\8cاÛ\8cؽ Ú\86Û\8c Ú¤Ù± Ú¯Ø±ØªØ½ØªÙ±.\n'''آرÙ\86ڳؽاÛ\8cÛ\8c Ú©Ø§Ù\92 Ø³Ù\84ا Ø¯Ø±ØªÛ\8cÚ\86سÙ\86 (copyright) Ú¾Ø§ Ø¯Ø´Ù\88 Ø¨Ø½ Ø³Ù\84ا Ú©Ù\84Ù\9b Ù\86ٱکؽت!'''",
        "copyrightwarning2": "لوطف بأکیت د ڤیر داشتوٙئیت کئ ئیچئ فأرض یأنە کئ ھأمە ھومیاریا شوما ڤا{{SITENAME}} د حال و بال «$2» دأرتیچ بوٙە(سی چیا تئر روئیت د $1).\nأر نئمیھایت کئ نیسئسە یا توٙ کئ فئرە ڤیرایئشت کاری بیینە و دئلحا دأرتیچ بان، د ئیچئ کئلئشوٙ نأکیت.<br />\nھأمچئنی شوما داریت ڤئ ئیما قول مئیت کئ خوتوٙ ڤئنوٙنە نیسأنیتە، یا ڤئنە د ڤئنوٙنە د یئ گئل سأرچئشمە آزاد ڤا بأرکئرد ھأمأگوٙنی یا چیایی چی ڤئ گئرتیتە.\n'''آرئنگیایی کئ صئلا دأرتیچئسئن (copyright) ھا دئشوٙ بی صئلا کئل نأکیت!'''",
-       "editpage-cannot-use-custom-model": "شیڤە مینوٙنە یا ئی بألگە نأتوٙنە آلئشتکاری بوٙە.",
-       "longpageerror": "<strong>خأطا:نیسئسە شوما {{PLURAL:$1|یە کئلوٙبایت|$1 کئلوبایت}} دئرازا نە دأە، کئ ڤئنوٙ د بیشتأروٙنە أنازە {{PLURAL:$2|یە کئلوبایت|$2 کئلوبایت}} گأپتأرئن.</strong>\nنأبوٙە ڤئ ئمایە با.",
+       "editpage-cannot-use-custom-model": "شؽڤٱ مؽنونٱیا اؽ بٱلگٱ نمؽ تونٱ آلشتکاری بۊئٱ.",
+       "longpageerror": "<strong>خٱتا:نیسسٱ شما {{PLURAL:$1|یاٛ کیلٛۊبایت|$1 کیلٛۊبایت}} درازا  دارٱ، کاْ ڤنو د بیشترونٱ ٱندازٱ {{PLURAL:$2|یاٛ کیلٛۊبایت|$2 کیلٛۊبایت}} گٱپترئٱن.</strong>\nنمۊئٱ ڤٱ آمادٱ با.",
        "readonlywarning": "<strong>د ڤیر داشتوٙئیت:رئسینە گا سی ڤاداشت کاری نئھاگئری بییە، سی یە نە کئ شوما ئیسە نئمی توٙنیت ڤیرایئشت کاریاتوٙنە ئمایە بأکیت.</strong>\nگاسی شوما بئھایت کئ نیسئسە خوتوٙنە د جانیا نیسئسە یی ڤوردار بئدیس بأکیت و ڤئنە سی نئھاتئر ئمایە بأکیت.\n\nدیڤوٙنداری کئ د ڤئ نئھاگئری کئردە چئنی گوتە:$1",
-       "protectedpagewarning": "<strong>د ڤیر داشتوٙئیت:ئی بألگە سی یە پأر و پیم بییە کئ فأقأط کاریاریایی کئ دأسرئسی دیڤوٙنداری دارئن بأتوٙنئن دئش ڤیرایئشت کاری بأکأن..</strong>\nآخئری سیاە سی سأرچئشمە یا د ھار ئمایە کاری بییە:",
+       "protectedpagewarning": "<strong>ڤ ڤیر داشتۊئؽت:اؽ بٱلگٱ سی یٱ پر ۉ پیم بیٱ کاْ فقٱت کاریارؽایؽ کاْ دٱسرسی دیڤونداری دارٱن بٱتونٱن دش ڤیرایش کاری بٱکٱن..</strong>\nآخری سیا سی سرچشمٱیا د ھار آمادٱ کاری بیٱ:",
        "semiprotectedpagewarning": "<strong>د ڤیر داشتوٙئیت:</strong> ئی بألگە سی یە کئ فأقأط کاریاریا ثأڤتئنام کئردە تونئسوٙئن دئش ڤیراشتکار بأکأن پأر و پیم بییە.\nآخئری پئھرئستنوٙمە دأئە بییە سی سأرچئشمە ھاری نئھا ئمایە بییە:",
        "cascadeprotectedwarning": "<strong>زئنار:</strong> ئی بألگە ڤئ دأس کاریاریایی کئ صئلا سأردیڤوٙنکاری دارن می توٙنە ڤیرایئشت کاری بوٙە سی یە کئ ئی بألگە ڤئ رأڤئشت تاف نئمایی پأر و پیم کاری بییە {{PLURAL:$1|بألگە|بألگە یا}}:",
        "titleprotectedwarning": "<strong>زئنار:ئی بألگە پأر و پیم بییە سی یە کئ [[Special:نومگە حوقوٙق کاریاری جأرغە|حوقوٙق ڤیجە]] بایأد ڤئنە رأڤأندیاری بأکأن.</strong>\nآخئری پئھرئستنوٙمە دأ بییە سی سأرچئشمە دأئن نئھا ئمایە بییە:",
        "templatesusedsection": "{{PLURAL:$1|چۊئٱ|چۊئٱ یا}} ڤ کار گرتٱ بیٱ د اؽ بٱلگٱ:",
        "template-protected": "(پر ۉ پیم بیٱ)",
        "template-semiprotected": "(نسم ۉ نیمٱ پر ۉ پیم بیٱ)",
-       "hiddencategories": "اؽ بٱلگٱ یٱکؽ د ٱندومؽا ٱ {{PLURAL:$1|1 hidden category|$1 hidden categories}} :",
+       "hiddencategories": "اؽ بٱلگٱ یٱکؽ د ٱندومؽا ئٱ {{PLURAL:$1|1 hidden category|$1 hidden categories}} :",
        "edittools-upload": "-",
        "nocreatetext": "{{SITENAME}} سی رأڤأندیاری بألگە یا تازە نئھاگئری بییە.\nشوما می توٙنیت روئیت ڤادئما و بألگە ئی کئ بییشە ڤیرایئشت کاری بأکیت،[[Special:ڤامین ئوٙمائن کاریار|بیائیت ڤامین یا یە کئ یئ گئل حئساڤ دوروس بأکیت]].",
-       "nocreate-loggedin": "Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Ø±Ø§Ø³ Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 ØªØ§Ø²Û\95 Ù\86Û\95 Ù\86ارÛ\8cت.",
-       "sectioneditnotsupported-title": "Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Ú¤Û\8cراÛ\8cئشت Ú©Ø§Ø±Û\8c Ø¨Ø£Ø±Ø¬Ø§Û\8cا Ù\86Û\95 Ù\86ارÛ\8cت.",
-       "sectioneditnotsupported-text": "Ú¤Û\8cراÛ\8cئشت Ø¨Ø£Ø±Ø¬Ø§Û\8cÛ\8c Ø¯ Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\8cئش.",
+       "nocreate-loggedin": "Ø´Ù\85ا Ø³Ù\84ا Ø¯Û\8fرس Ú©Ø±Ø¯Ù\86 Ø¨Ù±Ù\84Ú¯Ù± ØªØ§Ø²Ù± Ù\86اÙ\92 Ù\86ارؽت.",
+       "sectioneditnotsupported-title": "Ø´Ù\85ا Ø³Ù\84ا Ú¤Û\8cراÛ\8cØ´ Ú©Ø§Ø±Û\8c Ø¨Ù±Ø¦Ø±Ø¬Ø§Û\8cا Ù\86اÙ\92 Ù\86ارؽت.",
+       "sectioneditnotsupported-text": "Ú¤Û\8cراÛ\8cØ´ Ø¨Ù±Ø¦Ø±Ø¬Ø§Û\8cÛ\8c Ø¯ Ø§Ø½ Ø¨Ù±Ù\84Ú¯Ù± Ù\86ؽسش.",
        "permissionserrors": "خٱتا سلا داٛئن",
-       "permissionserrorstext": "Ø´Ù\88Ù\85ا Ø­Ø£Ù\82 Ù\86ارÛ\8cت Ú¤Ø¦Ù\86Û\95 Ø£Ù\86جÙ\88Ù\85 Ø¨Ø¦Û\8cتØ\8c Ø³Û\8c{{PLURAL:$1|دأÙ\84Û\8cÙ\84|دأÙ\84Û\8cÙ\84Û\8cا}} Ù\86ئھایی:",
-       "permissionserrorstext-withaction": "شما سی $2 سلا \nنھاگیری نارؽت {{PLURAL:$1|دلٛیلٛ|دلٛیلٛؽا}}:",
+       "permissionserrorstext": "Ø´Ù\85ا Ù\87Ù±Ù\82 Ù\86ارؽت Ú¤Ù± Ù\86اÙ\92 Ù±Ù\86جÙ\88Ù\85 Ø¨Ø§Ù\9bÛ\8cؽتØ\8c Ø³Û\8c{{PLURAL:$1|دÙ\84Ù\9bÛ\8cÙ\84Ù\9b|دÙ\84Ù\9bÛ\8cÙ\84Ù\9bؽا}} Ù\86Ù\87ایی:",
+       "permissionserrorstext-withaction": "شما سی $2 سلا \nنهاگیری نارؽت {{PLURAL:$1|دلٛیلٛ|دلٛیلٛؽا}}:",
        "recreate-moveddeleted-warn": "'''ڤ ڤیرتو با:شما بٱلگاٛیی کاْ ھا ڤادما ۉ پاکسا بیٱ د نۊ دۏرس کردؽتٱ.'''\nبایٱد د ڤیرتو با کاْ آیا ھنی نوئاگیری ڤیرایش اؽ بٱلگٱ خۊئٱ.\nپاکسا کاری ۉ جا ڤ جا کاری اؽ بٱلگٱ سی هال ۉ بار پٱلٛٱمار شما آمادٱ بیٱ:",
        "moveddeleted-notice": "اؽ بٱلگٱ پاکسا بیٱ.\nپاکسا کاری ۉ جا ڤ جا کاری اؽ بٱلگٱ سی هال ۉ بار پٱلٛٱمار شما آمادٱ بیٱ.",
        "log-fulllog": "دیئن هأمە پئهئرستنوٙمە یا",
index 5fd2caf..d70d242 100644 (file)
        "pageinfo-header-restrictions": "Заштита на страницата",
        "pageinfo-header-properties": "Својства на страницата",
        "pageinfo-display-title": "Наслов за приказ",
-       "pageinfo-default-sort": "Ð\9eÑ\81новен Ð¿Ð¾Ð´Ñ\80едбен ÐºÐ»Ñ\83Ñ\87",
+       "pageinfo-default-sort": "Ð\9eÑ\81новен ÐºÐ»Ñ\83Ñ\87 Ð·Ð° Ð¿Ð¾Ð´Ñ\80едÑ\83ваÑ\9aе",
        "pageinfo-length": "Големина на страницата (во бајти)",
        "pageinfo-namespace": "Именски простор",
        "pageinfo-article-id": "Назнака на страницата",
index 262aeb1..9f032af 100644 (file)
        "virus-scanfailed": "വൈറസ് സ്കാനിങ് പരാജയപ്പെട്ടു (code $1)",
        "virus-unknownscanner": "തിരിച്ചറിയാനാകാത്ത ആന്റിവൈറസ്:",
        "logouttext": "'''താങ്കൾ ഇപ്പോൾ {{SITENAME}} സംരംഭത്തിൽനിന്നും ലോഗൗട്ട് ചെയ്തിരിക്കുന്നു'''\n\nതാങ്കൾ വെബ് ബ്രൗസറിന്റെ ക്യാഷെ ശൂന്യമാക്കിയിട്ടില്ലെങ്കിൽ ചില താളുകളിൽ താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കുന്നതായി കാണിക്കാൻ സാധ്യതയുണ്ട്.",
+       "logging-out-notify": "താങ്കൾ ലോഗ് ഔട്ട് ചെയ്യുകയാണ്, ദയവായി കാത്തിരിക്കുക.",
+       "logout-failed": "ഇപ്പോൾ ലോഗൗട്ട് ചെയ്യാനാവില്ല: $1",
        "cannotlogoutnow-title": "ഇപ്പോൾ ലോഗൗട്ട് ചെയ്യാനാവില്ല",
        "cannotlogoutnow-text": "$1 ഉപയോഗിച്ചുകൊണ്ടിരിക്കെ പുറത്ത് കടക്കാൻ കഴിയില്ല.",
        "welcomeuser": "സ്വാഗതം, $1!",
        "mw-widgets-abandonedit-discard": "തിരുത്തുകൾ നിരാകരിക്കുക",
        "mw-widgets-abandonedit-keep": "തിരുത്ത് തുടരുക",
        "mw-widgets-abandonedit-title": "താങ്കൾക്ക് ഉറപ്പാണോ?",
+       "mw-widgets-copytextlayout-copy": "പകർത്തുക",
+       "mw-widgets-copytextlayout-copy-fail": "ക്ലിപ്‌ബോർഡിലെക്ക് പകർത്തൽ പരാജയപ്പെട്ടു.",
+       "mw-widgets-copytextlayout-copy-success": "ക്ലിപ്ബോർഡിലേക്ക് പകർത്തി.",
        "mw-widgets-dateinput-no-date": "തീയതി ഒന്നും തിരഞ്ഞെടുത്തിട്ടില്ല",
        "mw-widgets-mediasearch-input-placeholder": "മീഡിയയ്ക്കായി തിരയുക",
        "mw-widgets-mediasearch-noresults": "ഫലങ്ങളൊന്നും കണ്ടെത്താനായില്ല.",
        "log-action-filter-import-interwiki": "ട്രാൻസ്‌‌വിക്കി ഇറക്കുമതി",
        "log-action-filter-import-upload": "എക്സ്.എം.എൽ. അപ്‌ലോഡ് വഴിയുള്ള ഇറക്കുമതി",
        "log-action-filter-managetags-create": "ടാഗ് സൃഷ്ടി",
+       "log-action-filter-managetags-delete": "റ്റാഗ് മായ്ക്കൽ",
+       "log-action-filter-managetags-activate": "റ്റാഗ് സക്രിയമാക്കുക",
+       "log-action-filter-managetags-deactivate": "റ്റാഗ് നിഷ്ക്രിയമാക്കുക",
        "log-action-filter-move-move": "തിരിച്ചുവിടലുകൾക്ക് മുകളിൽ ചേർക്കാതെയുള്ള മാറ്റം",
        "log-action-filter-move-move_redir": "തിരിച്ചുവിടലുകൾക്ക് മുകളിൽ ചേർത്തുള്ള മാറ്റം",
        "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-protect-modify": "സംരക്ഷണത്തിൽ മാറ്റം വരുത്തൽ",
        "log-action-filter-protect-unprotect": "സംരക്ഷണമൊഴിവാക്കൽ",
index 452da95..fbaa98b 100644 (file)
        "tog-newpageshidepatrolled": "ߞߐߜߍ߫ ߓߍ߬ߙߍ߲߬ߓߍ߬ߙߍ߲߬ߣߍ߲ ߠߎ߬ ߢߡߊߘߏ߲߰ ߞߐߜߍ߫ ߞߎߘߊ ߟߎ߬ ߘߐ߫.",
        "tog-hidecategorization": "ߞߐߜߍ ߟߎ߬ ߦߌߟߡߊߦߊߟߌ ߢߡߊߘߏ߲߰",
        "tog-extendwatchlist": "ߜߋ߬ߟߎ߲߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐߥߙߊ߬߸ ߞߊ߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߓߍ߯ ߦߋ߫߸ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߞߎߘߊ ߟߎ߬ ߘߐߙߐ߲߫ ߕߍ߫ ߘߋ߬.",
+       "tog-usenewrc": "ߞߙߎ ߡߊߝߊ߬ߟߋ߲߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߞߐ߯ߟߕߊ ߟߎ߬ ߣߌ߫ ߜߋ߬ߟߎ߲߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐ߫.",
        "tog-numberheadings": "ߕߍ߰ߟߌ ߡߐ߬ߟߐ߲ ߠߎ߬ ߝߙߍߕߍ߫ ߞߍ߲ߖߘߍߡߊߓߟߏߡߊ߬",
        "tog-editondblclick": "ߞߏߜߍ ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫ ߛߐ߲߬ߞߌ߲߬ߠߌ߲߬ߞߏ ߝߌ߬ߟߊ߬ ߟߊ߫",
+       "tog-watchcreations": "ߒ ߠߊ߫ ߞߐߜߍ߫ ߛߌ߲ߘߌ߫ ߣߍ߲ ߠߎ߬ ߣߌ߫ ߞߐߕߐ߯ ߟߊߦߟߍ߬ߣߍ߲ ߠߎ߬ ߓߌ߬ߟߊ߬ ߒ ߠߊ߫ ߜߋ߬ߟߎ߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐ߫.",
+       "tog-watchdefault": "ߒ ߠߊ߫ ߞߐߜߍ߫ ߣߌ߫ ߞߐߕߐ߯ ߡߊߦߟߍ߬ߡߊ߲߬ߣߍ߲ ߠߎ߬ ߓߌ߬ߟߊ߬ ߒ ߠߊ߫ ߜߋ߬ߟߎ߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐ߫.",
+       "tog-watchmoves": "ߒ ߠߊ߫ ߞߐߜߍ ߣߌ߫ ߞߐߕߐ߯ ߟߊߕߐߣߍ߲ ߠߎ߬ ߓߌ߬ߟߊ߬ ߒ ߠߊ߫ ߜߋ߬ߟߎ߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐ߫.",
+       "tog-watchdeletion": "ߒ ߠߊ߫ ߞߐߜߍ ߣߌ߫ ߞߐߕߐ߯ ߖߏ߬ߛߌ߬ߣߍ߲ ߠߎ߬ ߓߌ߬ߟߊ߬ ߒ ߠߊ߫ ߜߋ߬ߟߎ߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐ߫.",
+       "tog-watchuploads": "ߒ ߠߊ߫ ߞߐߕߐ߯ ߟߊߦߟߍ߬ߣߍ߲ ߠߎ߬ ߓߌ߬ߟߊ߬ ߒ ߠߊ߫ ߜߋ߬ߟߎ߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐ߫.",
+       "tog-minordefault": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߘߋ߬ߣߍ߲ ߠߎ߬ ߣߐ߬ߣߐ߬ ߓߐߛߎ߲ ߘߌ߫",
+       "tog-previewontop": "ߢߍߦߋߟߌ ߦߌ߬ߘߊ߬ ߡߊ߰ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߞߏ߲ߘߏ ߢߍ߫.",
+       "tog-previewonfirst": "ߢߍߦߋߟߌ ߦߌ߬ߘߊ߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߝߟߐ ߘߐ߫.",
+       "tog-enotifwatchlistpages": "ߢߎߡߍߙߋ߲ ߗߋ߫ ߒ ߡߊ߬߸ ߣߌ߫ ߒ ߠߊ߫ ߜߋ߬ߟߎ߬ߠߌ߲߬ ߛߙߍߘߍ ߞߐߜߍ ߥߟߊ߫ ߞߐߕߐ߮ ߘߏ߫ ߡߊߦߟߍ߬ߡߊ߲߬ ߘߊ߫",
+       "tog-enotifusertalkpages": "ߗߋߛߓߍ ߗߋ߫ ߒ ߡߊ߬߸ ߣߌ߫ ߒ ߠߊ߫ ߓߊ߬ߘߏ߬ߢߐ߲߰ߦߊ߬ ߞߐߜߍ ߡߊߝߊ߬ߟߋ߲߬ ߘߊ߫.",
+       "tog-enotifminoredits": "ߢߎߡߍߙߋ߲ ߗߋ߫ ߒ ߡߊ߬ ߞߐߜߍ ߟߎ߬ ߣߌ߫ ߞߐߕߐ߮ ߟߎ߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߘߋ߬ߣߍ߲ ߠߎ߬ ߟߊ߫ ߞߏ߫ ߟߊ߫",
+       "tog-enotifrevealaddr": "ߒ ߠߊ߫ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߛߊ߲߬ߓߊ߬ߕߐ߮ ߝߊߙߊ߲ߛߊ߫ ߖߊ߲߬ߛߙߋ߬ߡߟߊ߬ ߗߋߛߓߍ ߟߎ߬ ߘߐ߫.",
+       "tog-shownumberswatching": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߐ߬ߜߍ߬ߟߌ߬ߟߊ ߟߎ߬ ߦߙߌߞߊ ߦߌ߬ߘߊ߬",
        "tog-oldsig": "ߌ ߟߊ߫ ߕߋ߲߭ߕߋ߲߭ ߞߟߊ߬ߣߐ߮",
+       "tog-fancysig": "ߞߟߊ߬ߣߐ ߟߊߘߊ߲߫ ߥߞߌߛߓߍߟߌ ߝߊ߬ߘߌ ߘߐ߫ (ߞߏ߬ߣߵߊ߬ ߞߊߣߊ߬ ߞߍ߫ ߞߍߒߖߘߍߦߋ߫ ߛߘߌߜߋ߲ ߘߌ߫)",
+       "tog-uselivepreview": "ߢߍߦߋߟߌ ߦߌ߬ߘߊ߬ ߞߏ߬ߣߌ߲߬ ߞߐߜߍ ߞߊߣߊ߬ ߞߊߣߊ߬ ߟߊߢߎ߲߫.",
+       "tog-forceeditsummary": "ߜߍ߬ߘߍ߲߬ ߘߐ߫ ߗߋ ߟߊߣߊ߬ ߒ ߡߊ߬ ߣߌ߫ ߟߊ߬ߘߛߏ߬ߟߌ߬ ߘߐߞߏߟߏ߲ ߘߏ߫ ߟߊߘߏ߲߭ ߞߍ߫ ߘߴߌ ߘߐ߫.",
        "tog-watchlisthideown": "ߒ ߠߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߬ ߢߡߊߘߏ߲߰ ߜߋ߬ߟߎ߲߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐ߫.",
        "tog-watchlisthidebots": "ߓߏߕ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߬ ߢߡߊߘߏ߲߰ ߜߋ߬ߟߎ߲߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐ߫.",
        "tog-watchlisthideminor": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߘߋ߬ߣߍ߲ ߠߎ߬ ߢߡߊߘߏ߲߰ ߜߋ߬ߟߎ߲߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐ߫.",
+       "tog-watchlisthideliu": "ߡߐ߱ ߜߊ߲߬ߞߎ߲߬ߣߍ߲߬ ߞߎߘߊ ߟߎ߬ ߢߡߊߘߏ߲߰ ߜߋ߬ߟߎ߲߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐ߫.",
+       "tog-watchlistreloadautomatically": "ߜߋ߬ߟߎ߲߬ߠߌ߲߬ ߛߙߍߘߍ ߞߍߒߖߘߍߦߋ߫ ߟߊߢߎ߲߫ ߣߌ߫ ߛߍ߲ߛߍ߲ߠߊ߲ ߡߊߝߊ߬ߟߋ߲߬ ߘߊ߫ (JavaScript ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ ߣߍ߲߫)",
+       "tog-watchlisthideanons": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߬ ߢߡߊߘߏ߲߰ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ߫ ߕߐ߯ߒߕߊ߲ ߠߎ߬ ߡߊ߬ ߜߋ߬ߟߎ߲߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐ߫.",
+       "tog-watchlisthidepatrolled": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߓߍ߬ߙߍ߲߬ߓߍ߬ߙߍ߲߬ߣߍ߲ ߠߎ߬ ߢߡߊߘߏ߲߰ ߜߋ߬ߟߎ߲߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐ߫.",
+       "tog-watchlisthidecategorization": "ߞߐߜߍ ߟߎ߬ ߦߌߟߡߊߦߊߟߌ ߢߡߊߘߏ߲߰.",
+       "tog-ccmeonemails": "ߒ ߠߊ߫ ߢߎߡߍߙߋ߲߫ ߗߋߣߍ߲ ߠߎ߬ ߓߊߞߎߘߊ ߟߊߣߊ߬ ߒ ߡߊ߬.",
+       "tog-diffonly": "diffs ߦߋ߫ ߞߐߜߍ ߡߍ߲ ߠߎ߬ ߘߐ߫߸ ߏ߬ ߟߎ߬ ߞߊߣߊ߬ ߦߌ߬ߘߊ߬",
        "tog-showhiddencats": "ߦߌߟߡߊ߫ ߢߡߊߘߏ߲߰ߣߍ߲ ߦߌ߬ߘߊ߬",
+       "tog-norollbackdiff": "ߡߛߊ߬ߦߌ߲߬ߠߌ߲ ߠߎ߬ ߞߊߣߊ߬ ߦߌ߬ߘߊ߬߸ ߣߌ߫ ߒ ߓߊ߲߫ ߞߐߛߊߦߌ߲ߠߌ߲ ߛߐ߲߬ߞߌ߲߫ ߠߊ߫",
+       "tog-useeditwarning": "ߒ ߠߊߛߏ߬ߓߌ߬߸ ߣߌ߫ ߒ ߓߐ߫ ߘߊ߫ ߞߐߜߍ߫ ߡߊߦߟߍ߬ߡߊ߲߬ߕߊ ߟߊߞߎ߲߬ߘߎ߬ߓߊߟߌ ߘߐ߫.",
+       "tog-prefershttps": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲߬ ߟߊߞߊ߲ߘߊߣߍ߲ ߠߊߓߊ߯ߙߊ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߕߎ߬ߡߊ ߟߊ߫.",
+       "tog-showrollbackconfirmation": "ߟߊ߬ߛߙߋ߬ߦߊ߬ߟߌ ߦߌ߬ߘߊ߬ ߞߊߟߌߦߊ߫ ߘߐ߫߸ ߣߌ߫ ߒ ߞߊ߬ ߞߐߛߊߦߌ߲ߠߌ߲ ߛߘߌ߬ߜߋ߲ ߛߐ߲߬ߞߌ߲߬.",
        "underline-always": "ߕߎ߬ߡߊ߬ ߓߍ߯",
        "underline-never": "ߡߎ߰ߡߍ߫",
+       "underline-default": "ߝߊ߬ߘߌ ߥߟߊ߫ ߛߏ߲߯ߓߊߟߊ߲ ߠߊ߫ ߝߍ߭",
        "editfont-style": "ߕߌ߲߬ߞߎߘߎ߲ ߛߓߍߛߎ߲ ߛߎ߯ߦߊ ߢߊߓߐ߫:",
        "editfont-monospace": "ߞߣߍߙߋ߲ ߛߓߍߛߎ߲",
        "sunday": "ߞߊ߯ߙߌߟߏ߲",
        "hidden-categories": "{{PLURAL:$1|ߦߌߟߡߊ߫ ߢߡߘߏ߲߰ߣߍ߲|ߦߌߟߡߊ߫ ߢߡߊߘߏ߲߰ߣߍ߲ ߠߎ߬}}",
        "hidden-category-category": "ߦߌߟߡߊ߫ ߢߡߊߘߏ߲߰ߣߍ߲ ߠߎ߬",
        "category-subcat-count": "{{PLURAL:$2|ߦߟߊߡߊߙߋ߲ ߣߌ߲߬ ߠߎ߫ ߜߊ߲߰ߛߊ߲ ߠߋ߫ ߦߋ߫ ߦߌߟߡߊ ߣߌ߲߬ ߘߐ߫.|ߦߌߟߡߊ ߣߊ߬ߕߐ ߟߎ߬ ߘߐ߫߸ {{PLURAL:$1|ߦߌߟߡߊߙߋ߲|$1 ߦߌߟߡߊߙߋ߲ ߠߎ߬}} ߟߋ߬ ߦߴߊ߬ ߘߐ߫߸ ߞߙߎߞߙߍ ߟߎ߬ ߞߐߞߊ߲߬ $2}}",
+       "category-subcat-count-limited": "{{PLURAL:$1|ߦߌߟߡߊߙߋ߲|$1 ߦߌߟߡߊߙߋ߲ ߠߎ߬}} ߟߋ߬ ߦߋ߫ ߦߌߟߡߊ ߣߌ߲߬ ߘߐ߫.",
        "category-article-count": "{{PLURAL:$2|ߞߐߜߍ ߣߌ߲߬ ߘߐߙߐ߲߫ ߠߋ߬ ߦߋ߫ ߦߌߟߡߊ ߣߌ߲߬ ߘߐ߫.|ߖߡߊ߬ߦߊ߫ ߕߐ߮ ߣߊ߬ߕߊ {{PLURAL:$1|ߞߐߜߍ ߦߋ߫|$1 ߞߐߜߍ ߦߋ߫}} ߟߋ߬ ߦߋ߫ ߦߌߟߡߊ߫ ߘߌ߫߸ ߞߙߎߞߙߍ $2 ߞߐߞߊ߲߬}}",
+       "category-article-count-limited": "ߢߍߕߊ ߣߌ߲߬ {{PLURAL:$1|ߞߐߜߍ ߦߋ߫|$1 ߞߐߜߍ ߟߎ߬ ߦߋ߫}} ߛߋ߲߬ߠߊ߫ ߦߌߟߡߊ ߟߎ߬ ߘߐ߫",
        "category-file-count": "{{PLURAL:$2||ߞߐߕߐ߮ ߣߌ߲߬ ߜߊ߲߰ߛߊ߲ ߠߋ߫ ߦߋ߫ ߦߌߟߡߊ ߣߌ߲߬ ߘߐ߫.ߡߍ߲ ߠߎ߬ ߦߋ߫ ߣߌ߲߬ |{{PLURAL:$1||ߞߐߕߐ߮ ߦߋ߫|$1 ߞߐߕߐ߮ ߟߎ߬ ߦߋ߫}} ߦߌߟߡߊ ߣߌ߲߬ ߘߐ߫߸ ߞߙߎߞߙߍ ߣߌ߲߬ ߕߴߊ߬ ߘߐ߫2$.}}",
+       "category-file-count-limited": "ߢߍߕߊ ߣߌ߲߬ {{PLURAL:$1|ߞߐߕߐ߮ ߦߋ߫|$1 ߞߐߕߐ߮ ߟߎ߬ ߦߋ߫}} ߛߋ߲߬ߠߊ߫ ߦߌߟߡߊ ߣߌ߲߬ ߘߐ߫.",
        "listingcontinuesabbrev": "ߖߊ߬ߕߋ߬ߘߊ",
        "index-category": "ߞߐߜߍ߫ ߓߊߕߐ߲ߛߐ߲ ߠߎ߬",
        "noindex-category": "ߞߐߜߍ߫ ߘߐߕߐ߲ߛߐ߲ߦߊߓߊߟߌ ߟߎ߬",
        "searchbutton": "ߢߌߣߌ߲ߠߌ߲",
        "go": "ߊ߬ ߢߌߣߌ߲߫",
        "searcharticle": "ߥߊ߫/ߕߊ߯",
-       "history": "ß\98ß\90ß\9cß\8d ߘߐ߬ߝߐ",
-       "history_short": "ß\95ß\8e߬ߡß\8a߬ß\98ß\8a",
+       "history": "ß\9eß\90ß\9cß\8d ß\9fß\8aß« ߘߐ߬ߝߐ",
+       "history_short": "ß\98ß\90߬ß\9dß\90",
        "history_small": "ߕߊ߬ߡߌ߲߬ߣߍ߲",
        "updatedmarker": "ߊ߬ ߟߏ߲ߘߐߦߊ ߞߊ߬ߦߌ߯ ߒ ߠߊ߫ ߞߐߟߊ߫ ߓߐߒߡߊߟߌ ߟߎ߬ ߡߊ߬",
        "printableversion": "ߓߐߞߏߣߊ߲߫ ߜߌ߬ߙߌ߲߬ߘߌ߬ߕߊ",
        "protect": "ߊ߬ ߟߊߞߊ߲ߘߊ߫",
        "protect_change": "ߊ߬ ߡߊߦߟߍ߬ߡߊ߲߫",
        "unprotect": "ߟߊ߬ߞߊ߲߬ߘߊ߬ߟߌ ߡߊߝߊ߬ߟߋ߲߬ߠߌ",
-       "newpage": "ß\98ߐߜߍ߫ ߞߎߘߊ",
+       "newpage": "ß\9eߐߜߍ߫ ߞߎߘߊ",
        "talkpagelinktext": "ߢߊߝߐߞߣߍ",
        "specialpage": "ߞߐߜߍ߫ ߞߙߍߞߙߍߣߍ߲",
        "personaltools": "ߘߎ߲߬ߘߎ߬ߡߊ߬ ߖߐ߯ߙߊ߲ ߠߎ߬",
        "view-pool-error": "ߤߊߞߍ߬ߕߏ߬߸ ߡߊ߬ߛߐ߬ߟߊ ߓߘߊ߫ ߟߊߢߎ߲߫ ߥߊ߯ߕߌ ߣߌ߲߬ ߠߊ߫.\nߡߐ߰ ߦߙߌߞߊ߫ ߟߎ߫ ߦߴߊ߬ߟߎ߬ ߞߊߘߊ߲ ߞߊ߲߬ ߞߐߜߍ ߣߌ߲߬ ߦߋ߫.\nߞߐߟߊ߫ ߡߊߞߐ߬ߣߐ߲߬ ߖߊ߰ߣߌ߲߫߸ ߞߣߊ߫ ߕߴߊ߬ ߡߊߝߍߣߍ߲߫ ߠߊ߫ ߕߎ߲߯.\n\n$1",
        "generic-pool-error": "ߤߊߞߍ߬ߕߏ߫߸ ߡߊ߬ߛߐ߬ߟߊ ߓߘߊ߫ ߟߊߢߎ߲߫ ߞߏߖߎ߯ߦߊ߫ ߥߊ߯ߕߌ ߣߌ߲߬ ߠߊ߫ ߕߊ߲߬.\nߡߐ߰ ߛߌߦߊߡߊ߲߫ ߠߎ߫ ߦߴߊ߬ߟߎ߬ ߞߊߘߊ߲ ߞߊ߲߬ ߞߊ߬ ߛߎ߲ ߣߌ߲߬ ߦߋ߫. \nߞߐߟߊ߫ ߡߊߞߐ߬ߣߐ߲߬ ߖߊ߰ߣߌ߲߬߸ ߦߊ߲߬ߣߴߌ ߞߍ߫ ߕߴߊ߬ ߡߊߝߍߣߍ߲߫ ߠߴߌ ߞߐ߫ ߕߎ߲߯.",
        "pool-timeout": "ߘߊߕߎ߲߯ߠߌ߲ ߡߊ߬ߞߐ߬ߣߐ߲߬ߠߌ߲߬ ߕߎߡߊ ߓߘߊ߫ ߕߊ߬ߡߌ߲߬",
+       "pool-queuefull": "ߡߊ߬ߞߐ߬ߣߐ߲߬ߠߌ߲ ߞߏ߬ߘߟߊ ߓߘߊ߫ ߝߊ߫",
        "pool-errorunknown": "ߝߌ߬ߟߌ߬ ߛߎ߲߫ ߟߐ߲ߓߊߟߌ",
+       "pool-servererror": "ߞߏ߬ߘߟߊ ߘߊ߲ߠߌ߲ ߗߋߘߊ ߕߍ߫ ߦߋ߲߬ ߕߊ߲߬ ($1).",
        "poolcounter-usage-error": "ߟߊߓߊ߯ߙߊߟߌ߫ ߝߟߌ $1",
        "aboutsite": "ߞߊ߬ ߓߍ߲߬ {{SITENAME}} ߞߏ ߡߊ߬",
        "aboutpage": "Project:ߟߊ߫ ߞߏ ߡߊ߬",
        "privacy": "ߘߎ߲߬ߘߎ߬ߡߊ߬ ߓߘߍߓߘߍߟߌ",
        "privacypage": "Project:ߘߎ߲߬ߘߎ߬ߡߊ߬ ߓߘߍ߬ߓߘߍ߬ߟߌ",
        "badaccess": "ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߝߎ߬ߕߎ߲߬ߕߌ",
+       "badaccess-groups": "ߌ ߣߊ߬ ߞߍߢߊ ߡߍ߲ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ ߟߊ߫ ߣߌ߲߬߸ ߏ߬ ߟߊߓߊ߯ߙߊ ߡߊߓߍ߲߬ߣߍ߲߫ ߠߋ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߡߍ߲ ߠߎ߬ ߦߋ߫ {{PLURAL:$2|ߞߙߎ ߘߐ߫|ߞߙߎ ߘߏ߫ ߘߐ߫}}: $1.",
+       "versionrequired": "ߡߊߘߌߦߊ߫-ߥߞߌ߫ ߓߊߦߟߍߡߊ߲ߠߌ߲ $1 ߞߊ߬ߣߌ߲߬ ߣߍ߲߫",
+       "versionrequiredtext": "ߡߊߘߌߦߊ߫-ߥߞߌ߫ ߘߟߊߡߌߘߊߟߌ $1 ߞߊ߬ߣߌ߲߬ ߣߍ߲߫ ߞߊ߬ ߞߐߜߍ ߣߌ߲߬ ߠߊߓߊ߯ߙߊ߫.\n[[Special:Version|version page]] ߦߋ߫.",
        "ok": "ߏ߬ߞߍ߫",
        "retrievedfrom": "ߊ߬ ߟߊߛߐ߬ߘߐ߲߫ ߦߊ߲߬ \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|ߌ ߓߘߊ߫ ߗߋߛߓߍ߫ ߞߎߘߊ ߛߐ߬ߘߐ߲߬$1  $2 }}",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|ߟߋ߬ ߦߴߌ ߓߟߏ߫}} $1 ߞߊ߬ ߓߐ߫ {{PLURAL:$3|ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ߬ ߜߘߍ߫|$3ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߟߎ߬}} ($2)",
+       "youhavenewmessagesmanyusers": "$1 ߦߴߌ ߓߟߏ߫ ߞߊ߬ ߝߘߊ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ߬  ($2) ߛߌߦߊߡߊ߲߫ ߠߊ߫",
        "newmessageslinkplural": "{{PLURAL:$1|ߗߋߛߓߍ߫ ߞߎߘߊ߫|999=ߗߋߛߓߍ߫ ߞߎߘߊ߫ ߟߎ߫}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|ߡߝߊ߬ߟߋ߲߬ߠߌ߲|999=ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߠߎ߬}} ߞߐ߯ߟߕߊ.",
        "youhavenewmessagesmulti": "ߌ ߓߘߊ߫ ߗߋߛߓߍ߫ ߞߎߘߊ ߛߐ߬ߘߐ߲߬ $1 ߞߣߐ߫",
        "toc": "ߞߣߐߘߐ",
        "showtoc": "ߦߌ߬ߘߊ߬ߟߌ",
        "hidetoc": "ߢߡߊߘߏ߲߯ߠߌ",
+       "collapsible-collapse": "ߞߏߟߊߔߑߛߌ߫",
        "collapsible-expand": "ߘߐ߬ߥߙߊ߬ߟߌ",
        "confirmable-confirm": "ߌ ߛߍ߬ߓߍ߫ ߓߊ߬ {{GENDER:$1|}}؟",
        "confirmable-yes": "ߐ߲߬ߤߐ߲߫",
        "confirmable-no": "ߍ߲߬ߍ߲߫",
        "thisisdeleted": "ߦߊ߯ߟߊ߫ ߦߴߊ߬ ߝߍ߬ ߞߵߊ߬ ߦߌ߬ߘߊ߬ ߥߟߊ߫ ߞߵߊ߬ ߟߊߛߊߦߌ߲߬ ߞߎߘߊߞߍ߫ ߓߊ߬ $1؟",
        "viewdeleted": "ߦߌ߬ߘߊ߬ߟߌ ߓߊ߬ $1؟",
+       "restorelink": "{{PLURAL:$1|ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߖߏ߬ߛߌ߬ߣߍ߲߬ ߞߋߟߋ߲߫|$1 ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߖߏ߬ߛߌ߬ߣߍ߲ ߠߎ߬}}",
+       "feedlinks": "ߓߊߟߏ:",
+       "feed-invalid": "ߕߐ߯ߛߓߍߟߌ ߓߊߟߏ ߛߎ߯ߦߊ ߓߍ߲߬ ߣߍ߲߬ ߕߍ߫.",
+       "feed-unavailable": "ߕߐ߰ߕߐ߰ߟߌ߬ߦߊ ߓߊߟߏ ߕߍ߫ ߦߋ߲߬",
+       "site-rss-feed": "RSS ߓߊߟߏ $1",
        "site-atom-feed": "$1 ߝߕߌ ߓߊߟߏ",
+       "page-rss-feed": "RSS ߓߊߟߏ \"$1\"",
        "page-atom-feed": "$1 ߝߕߌ ߓߊߟߏ",
        "red-link-title": "ߞߐߜߍ߫ ߕߴߦߋ߲߬ $1",
        "sort-descending": "ߛߙߊߛߌ߰ߟߌ ߖߌ߰ߟߌ߬ ߓߟߏߡߊ߬",
        "nstab-main": "ߞߐߜߍ",
        "nstab-user": "ߞߐߜߍ߫ ߟߊߓߊ߯ߙߕߊ",
        "nstab-media": "ߟߊߛߋߢߊ߫ ߞߐߜߍ",
-       "nstab-special": "ß\98ߐߜߍ߫ ߞߙߍߞߙߍߣߍ߲",
+       "nstab-special": "ß\9eߐߜߍ߫ ߞߙߍߞߙߍߣߍ߲",
        "nstab-project": "ߖߊ߬ߕߋ߬ߘߐ߬ߛߌ߰ ߞߐߜߍ",
        "nstab-image": "ߞߐߕߐ߮",
        "nstab-mediawiki": "ߗߋߛߓߍ",
        "nosuchspecialpage": "ߘߐߜߍ߫ ߓߟߏߡߊߞߊ߬ߣߍ߲߬ ߛߎ߮ ߏ߬ ߝߋ߲߫ ߕߍ߫ ߦߊ߲߬",
        "nospecialpagetext": "<strong>ߊߟߎ߫ ߓߘߊ߫ ߞߐߜߍ߫ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߘߏ߫ ߢߌߣߌ߲߫ ߡߍ߲ ߕߺߴߦߋ߲߬.</strong>\nߞߐߜߍ߫ ߓߟߏߡߊߞߊ߬ߣߍ߲߫ ߓߘߍ߬ߡߊ ߟߎ߬ ߛߙߍߘߍ ߦߋ߫ ߢߌ߲߬ ߠߋ߫ ߞߊ߲߬ [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "ߝߎ߬ߕߎ߲߬ߕߌ",
+       "databaseerror": "ߓߟߏߡߟߊ ߟߎ߬ ߝߊ߲ ߝߎ߬ߕߎ߲߬ߕߌ",
        "databaseerror-query": "ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ $1",
        "databaseerror-function": "ߗߋߘߊ $1",
        "databaseerror-error": "ߝߎ߬ߕߎ߲߬ߕߌ: $1",
+       "readonly": "ߓߟߏߡߟߊ ߝߊ߲ ߛߐ߰ߣߍ߲߫",
+       "missingarticle-rev": "(ߡߛߊ߬ߦߌ߲߬ߠߌ߲#:$1)",
+       "missingarticle-diff": "(Diff: $1, $2)",
+       "readonly_lag": "ߓߟߏߡߟߊ ߝߊ߲ ߓߘߊ߫ ߛߐ߰ ߞߍߒߖߘߍߦߋ߫ ߓߟߏߡߊ߬߸ ߞߊ߬ߦߌ߯ ߖߐ߲߬ ߓߟߏߡߟߊ ߝߊ߲ ߡߊߛߐߓߊ߮ ߡߌ߬ߣߊ߬ ߘߊ߫ ߞߙߊ߬ߡߐ߮ ߓߟߏ߫.",
        "internalerror": "ߞߣߐߟߊߘߐ߫ ߝߎߕߎ߲ߕߌ",
        "internalerror_info": "ߞߣߐߟߊߘߐ߫ ߝߎ߬ߕߎ߲߬ߕߌ: $1",
+       "internalerror-fatal-exception": "ߛߎ߯ߦߊ߫ ߢߌ߬ߣߊ߬ߓߐ߬ߟߌ ߡߊ߬ߕߊ߲߬ߞߊ߬ߓߊߟߌ \"$1\"",
        "filecopyerror": "ߊ߬ ߕߍ߫ ߣߊ߬ ߛߐ߲߬ ߠߊ߫ ߞߐߕߐ߮ $1 ߓߊߦߟߍ߬ߡߊ߲߬ ߠ ߦߊ߲߬ߊ߫ $2",
        "filerenameerror": "ߞߐߕߐ߮ \"$1\" ߕߍ߫ ߛߐ߲߬ ߓߊߦߟߍ߬ߡߊ߲߬ ߠߊ߫ ߦߊ߲߬  \"$2\".",
        "filedeleteerror": "ߞߐߕߐ߮ ߕߴߛߋ߫ ߖߏ߰ߛߌ߬ ߟߊ߫  \"$1\"",
+       "directorycreateerror": "ߊ߬ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߦߌ߬ߘߊ߬ߥߟߊ ߟߊߘߊ߲߫ ߠߊ߫ \"$1\"",
+       "directoryreadonlyerror": "ߦߌ߬ߘߊ߬ߥߟߊ \"$1\" ߦߋ߫ ߞߊ߬ߙߊ߲߬ ߞߊ߲ ߘߐߙߐ߲߫ ߠߋ߬ ߡߊ߬.",
+       "directorynotreadableerror": "ߛߐ߲߬ߞߐ߬ߞߝߊ  \"$1\" ߕߍ߫ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߬ߕߊ߫ ߘߌ߫.",
        "filenotfound": "ߌ ߕߍ߫ ߣߊ߬ ߞߐߕߐ߮  \"$1\" ߛߐ߬ߘߐ߲߬ ߠߊ߫.",
+       "unexpected": "ߡߐ߬ߟߐ߲߬ ߡߊߞߐ߬ߣߐ߲߬ߓߊߟߌ \"$1\"=\"$2\"",
+       "formerror": "ߝߎ߬ߕߎ߲߬ߕߌ: ߊ߬ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߖߙߎߡߎ߲ ߞߙߊߓߊ߫ ߟߊ߫.",
+       "badarticleerror": "ߞߍߢߊ ߣߌ߲߬ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߢߌ߬ߡߦߊ߬ ߟߊ߫ ߞߐߜߍ ߣߌ߲߬ ߞߊ߲߬.",
+       "cannotdelete": "ߞߐߜߍ ߥߟߊ߫ ߞߐߕߐ߮  \"$1\" ߕߍߣߊ߬ ߛߋ߫ ߟߊ߫ ߖߏ߬ߛߌ߬ ߟߊ߫.\nߡߐ߱ ߘߏ߫ ߣߐ߬ ߘߌ߫ ߞߴߊ߬ ߖߏ߬ߛߌ߬ ߟߊ߫ ߞߘߐ߬ߡߊ߲߬.",
        "cannotdelete-title": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߞߐߜߍ ߖߏ߬ߛߌ߬ ߟߊ߫  \"$1\"",
+       "delete-scheduled": "ߞߐߜߍ  \"$1\" ߖߏ߬ߛߌ߬ߟߌ ߓߘߊ߫ ߟߐ߯ߟߊ߫. \nߌ ߡߎ߬ߢߎ߲߫ ߖߊ߰ߣߌ߲߫.",
+       "delete-hook-aborted": "ߖߏ߬ߛߌ߬ߟߌ ߓߘߊ߫ ߘߐߛߊ߬ ߛߏ߲߭ߓߊ߬ߟߌ ߓߟߏ߫. \nߊ߬ ߘߏ߲߬ ߡߊ߫ ߘߊ߲߬ߕߍ߰ߟߍ߬ ߛߌ߫ ߞߍ߫.",
+       "no-null-revision": "ߊ߬ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߣߐ߬ߡߊ߬ߛߊ߬ߦߌ߲߬ ߘߐ߬ߞߏ߬ߟߏ߲߬ ߛߌ߫ ߞߍ߫ ߟߊ߫ ߞߐߜߍ \"$1\" ߣߌ߲߬ ߘߐ߫.",
        "badtitle": "ߞߎ߲߬ߕߐ߰ ߖߎ߮",
        "badtitletext": "ߞߐߜߍ߫ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ߣߍ߲ ߞߎ߲߬ߕߐ߮ ߓߍ߲߬ߣߍ߲߬ ߕߍ߫߸ ߊ߬ ߘߐߞߏߟߏ߲ ߦߋ߫߸ ߥߟߊ߫ ߞߊ߲ ߠߎ߬ ߣߌ߫ ߢߐ߲߯ߕߍ߫ ߛߘߌ߬ߜߋ߲ ߓߍ߲߬ߓߊߟߌ ߤߊߡߊ߲߫ ߥߞߌ ߟߎ߬ ߕߍ߫ ߛߘߌ߬ߜߋ߲.\nߛߓߍߘߋ߲߫ ߞߋߟߋ߲߫ ߥߟߊ߫ ߛߌߦߊߡߊ߲ ߠߎ߬ ߟߋ߬ ߦߋ߫ ߞߍ߫ ߟߴߊ߬ ߘߐ߫߸ ߡߍ߲ ߠߎ߬ ߕߴߛߋ߫ ߞߍ߫ ߟߊ߫ ߞߎ߲߬ߕߐ߯ ߘߌ߫.",
+       "title-invalid-empty": "ߞߐߜߍ߫ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ߣߍ߲ ߞߎ߲߬ߕߐ߮ ߘߐߞߏߟߏ߲ ߠߋ߬ ߥߟߊ߫ ߕߐ߯ ߛߓߍ߫ ߞߣߍ ߘߏ߫ ߕߐ߮ ߟߋ߬ ߦߴߊ߬ ߘߐ߫.",
+       "title-invalid-utf8": "UTF-8 ߖߟߐ߬ߞߐ ߓߍ߲߬ߓߊߟߌ ߟߋ߬ ߦߋ߫ ߞߐߜߍ߫ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ߣߍ߲ ߞߎ߲߬ߕߐ߮ ߘߐ߫.",
+       "title-invalid-interwiki": "ߥߞߌ ߣߌ߫ ߢߐ߲ߕߍ ߛߘߌ߬ߜߋ߲ ߘߏ߫ ߟߋ߬ ߦߋ߫ ߞߐߜߍ߫ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ߣߍ߲ ߘߐ߫߸ ߡߍ߲ ߕߍ߫ ߛߐ߲߬ ߠߊߓߊ߯ߙߊ߫ ߟߊ߫ ߞߎ߲߬ߕߐ߮ ߘߐ߫.",
+       "title-invalid-talk-namespace": "ߞߐߜߍ ߞߎ߲߬ߕߐ߰ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ߣߍ߲ ߟߐ߬ߣߍ߲߬ ߦߋ߫ ߓߊ߬ߘߏ߬ߢߐ߲߰ߦߊ߬ ߞߐߜߍ ߘߏ߫ ߟߋ߬ ߡߊ߬߸ ߡߍ߲ ߕߍ߫ ߦߋ߲߬ ߏ߬ ߞߐ߫.",
+       "title-invalid-characters": "ߛߓߍߘߋ߲ ߓߍ߲߬ߓߊߟߌ ߟߋ߬ ߦߴߌ ߟߊ߫ ߞߐߜߍ߫ ߞߎ߲߬ߕߐ߰ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ߣߍ߲ ߘߐ߫:  \"$1\"",
        "viewsource": "ߊ߬ ߛߎ߲ ߘߐߜߍ߫",
        "viewsource-title": "ߣߌ߲߬ $1 ߛߎ߲ ߘߐߜߍ߫",
        "viewsourcetext": "ߌ ߘߌ߫ ߛߋ߫ ߞߐߜߍ ߣߌ߲߬ ߛߎ߲ ߦߋ߫ ߟߊ߫߸ ߞߵߊ߬ ߓߊߓߌ߬ߟߊ߬",
+       "mycustomcssprotected": "ߌ ߟߊߘߌ߬ߢߍ߬ ߣߍ߲߬ ߕߍ߫ ߞߊ߬ CCS ߞߐߜߍ ߡߊߦߟߍ߬ߡߊ߲߫.",
+       "mycustomjsonprotected": "ߌ ߟߊߘߌ߬ߢߍ߬ ߣߍ߲߬ ߕߍ߫ ߞߊ߬ JSON ߞߐߜߍ ߡߊߦߟߍ߬ߡߊ߲߫.",
+       "mycustomjsprotected": "ߌ ߟߊߘߌ߬ߢߍ߬ ߣߍ߲߬ ߕߍ߫ ߞߊ߬ JavaScript ߞߐߜߍ ߡߊߦߟߍ߬ߡߊ߲߫.",
+       "myprivateinfoprotected": "ߌ ߟߊߘߌ߬ߢߍ߬ ߣߍ߲߬ ߕߍ߫ ߞߴߌ ߘߎ߲߬ߘߎ߬ߡߊ߬ ߞߟߊߟߐ߲ߠߌ߲ ߡߊߦߟߍ߬ߡߊ߲߫.",
+       "mypreferencesprotected": "ߌ ߟߊߘߌ߬ߢߍ߬ߣߍ߲߬ ߕߍ߫ ߞߴߌ ߟߊ߫ ߟߊ߬ߝߌ߬ߛߦߊ߬ߟߌ ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫.",
        "ns-specialprotected": "ߘߐߜߍ߫ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߕߍ߫ ߛߐ߲߬ ߡߊߦߟߍ߬ߡߊ߲߬ ߠߊ߫.",
        "titleprotected": "ߞߎ߲߬ߕߐ߮ ߣߌ߲߬ ߓߘߊ߫ ߟߊߞߊ߲ߘߊ߫ ߛߌ߲ߘߟߌ ߡߊ߬  [[User:$1|$1]] ߓߟߏ߫.\nߞߎ߲߭ ߡߍ߲ ߦߴߏ߬ ߟߊ߫߸ ߏ߬ ߦߋ߫ <em>$2</em>.",
        "filereadonlyerror": "ߞߐߕߐ߮ \"$1\" ߕߍ߫ ߛߐ߲߬ ߡߊߦߟߍ߬ߡߊ߲߬ ߠߊ߫߸ ߞߵߊ߬ ߡߊߛߐ߬ߘߐ߲߬ ߞߐߕߐ߮ ߟߊߡߙߊ߬ ߦߙߐ  \"$2\" ߦߋ߫ ߞߊ߬ߙߊ߲ ߘߐߙߐ߲߫ ߝߊ߬ߘߌ ߟߋ߬ ߘߐ߫.\n\nߞߊ߲ߞߋ ߟߊߓߊ߯ߙߟߊ ߡߍ߲ ߣߵߊ߬ ߛߐ߰ ߟߊ߫߸ ߏ߬ ߓߘߊ߫ ߘߊ߲߬ߕߍ߰ߟߌ ߘߏ߫ ߞߍ߫: \"$3\".",
        "invalidtitle": "ߞߎ߲߬ߕߐ߮ ߓߍ߲߬ߓߊߟߌ",
        "exception-nologin": "ߌ ߜߊ߲߬ߞߎ߲߬ߣߍ߲߬ ߕߍ߫",
        "virus-unknownscanner": "ߢߐߛߌߙߋ߲ߞߟߊ߬ ߡߊߟߐ߲ߓߊߟߌ",
+       "logging-out-notify": "ߌ ߜߊ߲߬ߞߎ߲߬ߣߍ߲ ߓߐ ߦߴߌ ߘߐ߫߸ ߡߊ߬ߞߐ߬ߣߐ߲߬ߠߌ߲ ߞߍ߫ ߖߊ߰ߣߌ߲߬.",
        "logout-failed": "ߌ ߕߍߣߊ߬ ߛߋ߫ ߟߴߌ ߜߊ߲߬ߞߎ߬ߣߍ߲ ߓߐ߫ ߟߊ߫ ߕߊ߲߫ $1",
        "cannotlogoutnow-title": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߴߌ ߜߊ߲߬ߞߎ߬ߣߍ߲ ߓߐ߫ ߟߊ߫ ߕߊ߲߫",
        "cannotlogoutnow-text": "ߜߊ߲߬ߞߎ߲߬ߓߐ߬ߟߌ ߕߍ߫ ߛߐ߲߬ ߞߍ߫ ߟߊ߫ ߞߵߌ߬ ߕߴߊ߬ ߟߊߓߊ߯ߙߊ ߞߊ߲߬ $1",
        "welcomeuser": "ߌ ߣߌ߫ ߛߣߍ߫ $1߹",
+       "welcomecreation-msg": "ߌ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߓߘߊ߫ ߛߌ߲ߘߌ߫.\nߣߴߌ ߦߴߊ߬ ߝߍ߬߸ ߌ ߘߌ߫ ߛߴߌ ߟߊ߫  {{SITENAME}} [[Special:Preferences|preferences]] ߡߊߝߊ߬ߟߋ߲߬ ߠߊ߫.",
        "yourname": "ߟߊߓߊ߯ߙߊߟߊߕߐ߮:",
        "userlogin-yourname": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ߬ ߕߐ߮",
        "userlogin-yourname-ph": "ߌ ߟߊ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ߬ ߕߐ߮ ߟߊߘߏ߲߬",
        "cannotloginnow-title": "ߌ ߕߍ߫ ߛߴߌ ߜߊ߲߬ߞߎ߲߬ ߠߊ߫ ߕߊ߲߫",
        "cannotloginnow-text": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߕߍ߫ ߣߊ߬ ߓߍ߲߬ ߠߊ߫ ߞߵߌ ߕߴߊ߬ ߟߊߓߊ߯ߙߊ ߞߊ߲߬ $1",
        "cannotcreateaccount-title": "ߖߊ߬ߕߋ߬ߘߊ ߕߍ߫ ߣߊ߬ ߛߐ߲߬ ߠߊ߫ ߛߌ߲ߘߌ߫ ߟߊ߫",
+       "cannotcreateaccount-text": "ߖߊ߬ߕߋ߬ߘߊ ߟߊ߬ߞߊ ߟߊߟߐ߬ ߣߍ߲߫ ߠߋ߬ ߦߋ߫ ߥߞߌ ߣߌ߲߬ ߠߊ߫ ߕߊ߲߬.",
        "yourdomainname": "ߌ ߟߊ߫ ߡߊ߬ߘߎ߮:",
        "password-change-forbidden": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬ ߠߊ߫ ߥߞߌ ߣߌ߲߬ ߞߊ߲߬.",
+       "externaldberror": "ߕߎ߬ߡߊ߬ߘߐ߫ ߓߟߏߡߟߊ ߝߊ߲߭ ߔߌߦߐߔߌߦߐߦߊߟߌ ߝߎ߬ߕߎ߲߬ߕߌ ߟߋ߬ ߘߌ߫ ߞߍ߫ ߥߟߴߊ߬ ߟߊߘߌ߬ߢߍ߬ ߣߍ߲߬ ߕߴߌ ߦߋ߫ ߞߊ߬ ߞߐߞߊ߲ߠߊ ߖߊ߬ߕߋ߬ߘߊ ߟߏ߲ߘߐߦߊ߫.",
        "login": "ߌ ߜߊ߲߬ߞߎ߲߬",
        "login-security": "ߌ ߡߊߟߐ߲ߕߐ߮ ߝߛߍ߬ߝߛߍ߬",
        "nav-login-createaccount": "ߌ ߜߊ߲߬ߞߎ߲߬/ߖߊ߬ߕߋ߬ߘߊ ߘߏ߫ ߟߊߞߊ߬",
        "createacct-another-email-ph": "ߢߎߡߍ",
        "createaccountmail": "ߓߍ߲߬ߛߋ߲߬ߡߊ߬ ߕߊߡߌ߲ߞߊ߲ ߕߎ߬ߡߊ߬ߞߎ߲߬ߡߊ ߟߊߓߊ߯ߙߊ߫ ߞߊ߬ ߓߊ߲߫ ߞߵߊ߬ ߗߋ߫ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ߫ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߡߊ߬.",
        "createaccountmail-help": "ߊ߬ ߕߍ߫ ߛߐ߲߬ ߠߊߓߊ߯ߙߊ߫ ߟߊ߫߸ ߞߊ߬ ߡߐ߰ ߜߘߍ߫ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߛߌ߲ߘߌ߫߸ ߣߴߌ ߡߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߞߊ߬ߙߊ߲߬.",
+       "createacct-realname": "ߕߐ߮ ߓߘߍ (ߛߎߥߊ߲ߘߟߌ)",
+       "createacct-reason": "ߊ߬ ߛߊߓߎ߫",
        "createacct-reason-ph": "ߡߎ߲߬ߠߊ߫ ߌ ߦߋ߫ ߖߊ߬ߕߋ߬ߘߊ߰ ߜߘߍ߫ ߛߌ߲ߘߌ߫ ߟߊ߫",
+       "createacct-reason-help": "ߗߋߛߓߍ ߦߌ߬ߘߊ߬ ߖߊ߬ߕߋ߬ߘߊ ߛߌ߲ߘߟߌ ߘߊ߲ߖߐ ߘߐ߫",
        "createacct-submit": "ߖߊ߬ߕߋ߬ߘߊ ߘߏ߫ ߘߊߦߟߍ߬",
        "createacct-another-submit": "ߖߊ߬ߕߋߘߊ ߛߌ߲ߘߌ߫",
        "createacct-continue-submit": "ߖߊ߬ߕߋ߬ߘߊ ߛߌ߲ߘߟߌ ߘߊߓߊ߲߫",
        "badretype": "ߌ ߣߊ߬ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߍ߲ ߠߊߘߏ߲߬ ߠߊ߫߸ ߏ߬ ߡߊ߫ ߕߊ߬ߡߌ߲߬.",
        "usernameinprogress": "ߖߊ߬ߕߋ߬ߘߊ ߘߏ߫ ߛߌ߲ߘߌ ߦߴߌ ߘߐ߫ ߟߊ߬ߓߊ߰ߙߊ߬ ߕߐ߮ ߣߌ߲߬ ߠߊ߫߸ ߊ߬ ߘߏ߲߬ ߓߘߊ߫ ߖߊ߲߬ߝߊ߬. ߡߊ߬ߞߐ߬ߣߐ߲߬ߠߌ߲ ߞߍ߫ ߖߊ߰ߣߌ߲߬.",
        "userexists": "ߟߊ߬ߓߊ߰ߙߊ߬ ߕߐ߮ ߟߊߘߏ߲߬ߣߍ߲ ߣߌ߲߬ ߓߘߊ߫ ߓߊ߲߫ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫.\nߕߐ߯ ߜߘߍ߫ ߛߎߥߊ߲ߘߌ߫ ߖߊ߰ߣߌ߲߬.",
+       "createacct-normalization": "ߌ ߟߊ߫ ߟߊ߬ߓߊ߰ߙߊ߬ ߕߐ߮ ߘߌ߫ ߣߊ߬ ߟߊߘߏ߲߬ ߴߴ$2ߴߴ ߘߐ߫ ߞߊ߬ ߓߍ߲߬ ߛߋߒߞߏߟߦߊ ߛߋ߲߬ߠߊ߬ߛߘߌ ߡߊ߬.",
        "loginerror": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߝߎ߬ߕߎ߲߬ߕߌ",
        "createacct-error": "ߖߊ߬ߕߋ߬ߘߊ߰ ߟߊ߬ߞߊ ߝߎ߬ߕߎ߲߬ߕߌ",
        "createaccounterror": "ߖߊ߬ߕߋ߬ߘߊ߬ ߕߍ߫ ߣߊ߬ ߛߐ߲߬ ߠߊ߫ ߛߌ߲ߘߌ߫ ߟߊ߫: $1",
+       "nocookiesnew": "ߖߊ߬ߕߋ߬ߘߊ߬ ߟߊߓߊ߯ߙߕߊ ߓߘߊ߫ ߛߌ߲ߘߌ߫߸ ߞߏ߬ߣߌ߲߬ ߌ ߜߊ߲߬ߞߎ߲߬ߣߍ߲߬ ߕߍ߫.\n{{SITENAME}} ߦߋ߫ ߞߎߞߌߦߋ ߟߊ߫ ߞߊ߬ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߜߊ߲߬ߞߎ߲߬.\nߌ ߓߘߊ߫ ߞߎߞߌߦߋ ߓߴߊ߬ ߟߊ߫.\nߊ߬ߟߎ߫ ߓߌ߬ߟߵߊ߬ ߟߊ߫ ߖߊ߰ߣߌ߲߫߸ ߏ߬ ߓߊ߰ ߞߍ߫ ߌ ߦߴߌ ߜߊ߲߬ߞߎ߲߫ ߌ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߣߌ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߞߎߘߊ߫ ߘߌ߫.",
+       "nocookieslogin": "\n{{SITENAME}} ߦߋ߫ ߞߎߞߌߦߋ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫ ߞߊ߬ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߟߎ߬ ߜߊ߲߬ߞߎ߲߬.\nߌ ߓߘߊ߫ ߞߎߞߌߦߋ ߓߴߊ߬ ߟߊ߫.\nߊ߬ ߓߌ߬ߟߵߊ߬ ߟߊ߫ ߖߊ߰ߣߌ߲߫ ߞߵߊ߬ ߡߊߝߍߣߍ߲߫ ߕߎ߲߯.",
+       "noname": "ߟߊ߬ߓߊ߰ߙߊ߬ ߕߐ߯ ߖߐ߲ߖߐ߲߫ ߟߊߘߊ߲߫ ߣߍ߲߫ ߕߴߌ ߓߟߏ߫.",
+       "loginsuccesstitle": "ߌ ߜߊ߲߬ߞߎ߲߬",
+       "loginsuccess": "<strong>ߌ ߓߘߴߌ ߜߊ߲߬ߞߎ߲߬ {{SITENAME}} ߟߊ߫ ߕߊ߲߬ $1</strong>",
+       "nosuchuser": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߛߌ߫ ߕߍ߫ ߕߐ߮ ߟߊ߫  \"$1\".\nߟߊ߬ߓߊ߰ߙߊ߬ ߕߐ߮ ߓߐߣߍ߲߫ ߦߋ߫ ߘߏ߫ ߟߊ߫. \nߌ ߟߊ߫ ߌ ߟߊ߫ ߛߓߍߟߌ ߝߛߍ߬ߝߛߍ߬߸ ߥߟߊ߫ [[Special:CreateAccount|create a new account]].",
        "nouserspecified": "ߌ ߞߊߞߊ߲߫ ߞߊ߬ ߕߐ߯ ߟߊߓߊ߯ߙߕߊ߫ ߞߋߟߋ߲߫ ߡߊߕߍ߰",
        "login-userblocked": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ ߓߊ߬ߟߊ߲߬ߣߍ߲߫ ߠߋ߫. ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߠߊߘߌ߬ߢߍ߬ߣߍ߲߬ ߕߍ߫.",
        "wrongpassword": "ߟߊ߬ߓߊ߰ߙߊ߬ ߕߐ߮ ߓߍ߲߬ ߣߍ߲߬ ߕߍ߫ ߥߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߠߊߘߏ߲߬ߣߍ߲.\nߖߊ߰ߣߌ߲߬ ߌ ߦߴߊ߬ ߡߊߝߍߣߍ߲߫ ߕߎ߲߯.",
        "passwordinlargeblacklist": "ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߠߊߘߏ߲߬ߣߍ߲ ߦߋ߫ ߝߘߏ߬ߓߊ߬ ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߡߊߟߐ߲ߣߍ߲ߓߊ ߟߎ߬ ߛߙߍߘߍ ߟߋ߬ ߘߐ߫.\nߖߊ߰ߣߌ߲߬ ߌ ߦߋ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߦߙߋߞߋ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫.",
        "mailmypassword": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߦߟߍ߬ߡߊ߲߬",
        "passwordremindertitle": "{{SITENAME}} ߕߊ߬ߡߌ߲߬ߞߊ߲ ߕߎ߬ߡߊ߬ߞߎ߲߬ߡߊ ߞߎߘߊ",
+       "noemail": "ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߛߌ߫ ߕߍ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ \"$1\" ߟߊ߫",
+       "noemailcreate": "ߌ ߞߊߞߊ߲߫ ߞߊ߬ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ߫ ߞߟߊ߬ߟߊ߬ߡߊ ߘߏ߫ ߡߊߛߐ߫.",
+       "passwordsent": "ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߡߍ߲ ߦߋ߫ \"$1\" ߟߊ߫߸ ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߞߎߘߊ߫ ߓߘߊ߫ ߗߋ߫ ߏ߬ ߡߊ߬. ߖߊ߰ߣߌ߲߬ ߣߴߌ ߞߵߊ߬ ߡߊߛߐ߬ߘߐ߲߬ ߌ ߦߴߌ ߜߊ߲߬ߞߎ߲߬ ߕߎ߲߯.",
+       "blocked-mailpassword": "ߌ ߟߊ߫ IP ߓߘߊ߫ ߓߊ߬ߟߊ߲߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߞߏ ߘߐ߫. ߖߐ߲߬ߛߊ߫ ߞߊ߬ ߘߊ߲߬ߠߊ߬ߕߊߡߌ߲ ߢߍߓߍ߲߬߸ \nߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߡߊ߬ߛߐߘߐ߲ ߠߊߘߤߊ߬ߣߍ߲߬ ߕߍ߫ IP ߛߊ߲߬ߓߊ߬ߕߐ߮ ߣߌ߲߬ ߠߊ߫.",
+       "mailerror": "ߢߎߡߍߙߋ߲ ߗߋߟߌ ߝߎ߬ߕߎ߲߬ߕߌ:$1",
+       "acct_creation_throttle_hit": "ߥߞߌ ߣߌ߲߬ ߓߐߒߡߟߊ ߟߎ߬ ߦߴߌ ߟߊ߫ IP ߛߊ߲߬ߓߊ߬ߕߐ߮ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫߸ ߊ߬ߟߎ߬ ߓߘߊ߫ ߖߊ߬ߕߋ߬ߘߊ߬ {{PLURAL:$1|ߖߊ߬ߕߋ߬ߘߊ߬ ߁|$1ߖߊ߬ߕߋ߬ߘߊ ߟߎ߬}} ߛߌ߲ߘߌ߫߸ ߞߐ߯ߟߕߊ $2,ߟߋ߬ ߦߴߊ߬ ߞߐߘߊ߲߫ ߠߊߘߤߊ߬ߣߍ߲ ߘߌ߫ ߥߊ߯ߕߌ ߣߌ߲߬ ߠߊ. ߞߐߖߋߓߌ ߘߐ߫߸ ߓߐߒߡߟߊ ߟߎ߬ ߦߋ߫ IP ߛߊ߲߬ߓߊ߬ߕߐ߮ ߣߌ߲߬ ߠߋ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫ ߕߊ߲߬߸ ߏ߬ ߘߏ߲߬ ߕߴߛߋ߫ ߖߊ߬ߕߋ߬ߘߊ߬ ߜߘߍ߫ ߛߌ߲ߘߌ߫ ߟߊ߫ ߥߊ߯ߕߌ ߣߌ߲߬ ߠߴߏ߬ ߞߐ߫.",
        "emailauthenticated": "ߌ ߟߊ߫ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߟߊߛߙߋߦߊ߫ ߘߊ߫ $3 $2 ߟߊ߫",
+       "emailnotauthenticated": "ߌ ߟߊ߫ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߡߊ߫ ߟߊߛߙߋߦߊ߫ ߡߎߣߎ߲߬.\nߢߎߡߍߙߋ߲߫ ߕߍ߫ ߛߋ߫ ߗߋ߫ ߟߴߌ ߡߊ߬ ߘߊߞߎ߲ ߢߌ߲߬ ߠߎ߫ ߞߊ߲߬.",
+       "emailconfirmlink": "ߌ ߟߊ߫ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߟߊߛߙߋߦߊ߫.",
+       "invalidemailaddress": "ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߣߌ߲߬ ߕߍߣߊ߬ ߛߋ߫ ߟߊ߫ ߟߊߡߌ߬ߣߊ߬ ߟߊ߫߸ ߓߴߊ߬ ߦߋ߫ ߣߍ߲߫ ߦߋ߫ ߖߙߎߡߎ߲߫ ߓߍ߲߬ߓߊߟߌ ߟߋ߬ ߘߌ߫.\nߖߊ߰ߣߌ߲߬ ߌ ߦߋ߫ ߛߊ߲߬ߓߊ߬ߕߐ߮ ߖߙߎߡߎ߲߫ ߓߍ߲߬ߣߍ߲ ߘߏ߫ ߟߊߘߏ߲߬߸ ߥߟߊ߫ ߘߐ߬ߞߏߟߏ߲ ߡߍ߲ ߗߌߙߏ߲߫ ߣߍ߲߫.",
+       "cannotchangeemail": "ߖߊ߬ߕߋ߬ߘߊ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߕߴߛߋ߫ ߡߊߝߊ߬ߟߋ߲߬ ߠߊ߫ ߥߞߌ ߣߌ߲߬ ߘߐ߫.",
+       "emaildisabled": "ߞߍߦߙߐ ߣߌ߲߬ ߕߍߣߊ߬ ߛߋ߫ ߟߊ߫ ߢߎߡߍߙߋ߲߫ ߗߋ߫ ߟߊ߫.",
+       "accountcreated": "ߖߊ߬ߕߋ߬ߘߊ ߓߘߊ߫ ߛߌ߲ߘߌ߫",
+       "createaccount-title": "ߖߊ߬ߕߋ߬ߘߊ ߓߘߊ߫ ߟߊߞߊ߬  {{SITENAME}} ߢߍ߫.",
+       "createaccount-text": "ߡߐ߱ ߘߏ߫ ߓߘߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߘߏ߫ ߛߌ߲ߘߴߌ ߟߊ߫ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߣߌ߲߬ ߡߊ߬ ($4) ߡߍ߲ ߕߐ߯ߟߊ߫ ߣߍ߲߫ ߞߏ߫ \"$2\"߸ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߣߌ߲߬ ߠߊ߫  \"$3\". ߌ ߦߴߌ ߜߊ߲߬ߞߎ߲߬ ߞߵߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬ ߌߞߘߐ߫߹\n\nߌ ߦߋ߫ ߗߋߛߓߍߊ ߡߊߓߌ߬ߟߊ߬߸ ߣߌ߫ ߖߊ߬ߕߋ߬ߘߊ ߟߊߞߊ߬ߣߍ߲߬ ߞߍ߫ ߘߊ߫ ߝߎ߬ߕߎ߲߬ߕߌ߬ ߓߟߏߡߊ߬",
        "login-abort-generic": "ߌ ߟߊ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߓߘߊ߫ ߗߌߙߏ߲߫ - ߕߌߢߍ߫",
        "login-migrated-generic": "ߌ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߓߘߊ߫ ߝߎ߲ߘߌ߫߸ ߊ߬ ߣߴߌ ߟߊ߫ ߟߊ߬ߓߊ߰ߙߊ߬ ߕߐ߮ ߕߍ߫ ߣߊ߬ ߥߊ߯ߕߌߖߊ߲߫ ߞߍ߫ ߟߊ߫ ߥߞߌ ߣߌ߲߬ ߠߊ߫ ߦߊ߲߬ ߏ߬ ߞߐ߫.",
        "loginlanguagelabel": "ߞߊ߲ $1",
        "pt-login": "ߌ ߜߊ߲߬ߞߎ߲߬",
        "pt-login-button": "ߌ ߜߊ߲߬ߞߎ߲߬",
+       "pt-login-continue-button": "ߌ ߟߊ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߘߊߓߊ߲߫",
        "pt-createaccount": "ߖߊ߬ߕߋ߬ߘߊ ߘߏ߫ ߛߌ߲ߘߌ߫",
        "pt-userlogout": "ߌ ߜߊ߲߬ߞߎ߲߬ߣߍ߲ ߓߐ߫",
+       "php-mail-error-unknown": "PHP's ߢߎߡߍߙߋ߲() ߗߋߘߊ ߝߎ߬ߕߎ߲߬ߕߌ߬ ߡߊߟߐ߲ߓߊߟߌ.",
+       "user-mail-no-addy": "ߌ ߓߘߴߌ ߞߊߘߊ߲߫ ߢߎߡߍߙߋ߲߫ ߗߋ߫ ߞߏ ߘߐ߫ ߞߵߊ߬ ߕߘߍ߬ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ߫ ߕߴߌ ߓߟߏ߫.",
        "changepassword": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬",
        "resetpass_announce": "ߣߴߌ ߦߴߊ߬ ߝߍ߬ ߞߵߌ ߟߊ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߠߊߓߊ߲߫߸ ߌ ߦߋ߫ ߖߊ߬ߕߋ߬ߘߊ߰ ߞߎߘߊ߫ ߟߊߘߊ߲߫.",
        "resetpass_header": "ߖߊ߬ߕߋ߬ߘߊ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬",
        "newpassword": "ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߞߎߘߊ",
        "retypenew": "ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߞߎߘߊ ߡߊߛߊ߬ߦߌ߬",
        "resetpass_submit": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߠߊߘߏ߲߬ ߞߵߌ ߜߊ߲߬ߞߎ߲߬",
+       "changepassword-success": "ߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߘߊ߫ ߓߊ߲߫ ߠߊߞߊ߬ ߟߊ߫߹",
+       "botpasswords": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲",
+       "botpasswords-disabled": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߘߊ߫ ߓߴߊ߬ ߡߊ߬.",
+       "botpasswords-no-central-id": "ߖߐ߲߬ߛߊ߫ ߌ ߘߌ߫ ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߠߊߓߊ߯ߙߊ߫߸ ߌ ߞߊ߫ ߞߊ߲߫ ߞߊ߬ ߜߊ߲߬ߞߎ߲߬ߠߌ߲߬ ߕߊ߲ߓߊ߲ߓߐߣߍ߲ ߞߍ߫.",
+       "botpasswords-existing": "ߕߋ߲߭ߕߋ߲߭ ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲",
+       "botpasswords-createnew": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߞߎߘߊ߫ ߛߌ߲ߘߌ߫",
+       "botpasswords-label-needsreset": "(ߕߊ߬ߡߌ߲߬ߞߊ߲ ߤߊ߬ߕߊ߬ߦߋ߬ߣߍ߲߫ ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߠߊ߫)",
        "botpasswords-label-appid": "ߓߏߕ ߕߐ߮:",
        "botpasswords-label-create": "ߊ߬ ߛߌ߲ߘߌ߫",
+       "botpasswords-label-update": "ߟߏ߲ߘߐߦߊߟߌ",
        "botpasswords-label-cancel": "ߊ߬ ߘߐߛߊ߬",
        "botpasswords-label-delete": "ߊ߬ ߖߏ߬ߛߌ߬",
        "botpasswords-label-resetpassword": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߦߟߍ߬ߡߊ߲߬",
+       "botpasswords-bad-appid": "ߓߏߕ ߕߐ߮  \"$1\" ߓߍ߲߬ ߣߍ߲߬ ߕߍ߫.",
        "resetpass_forbidden": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߕߴߛߋ߫ ߡߊߝߊ߬ߘߋ߲߬ ߠߊ߫.",
        "resetpass_forbidden-reason": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߕߴߛߋ߫ ߡߊߝߊ߬ߟߋ߲߬ ߠߊ߫: $1",
        "resetpass-no-info": "ߌ ߦߴߌ ߜߊ߲߬ߞߎ߲߬ ߡߎߣߎ߲߬ ߞߣߊ߬ ߕߏ߫ ߞߐߜߍ ߣߌ߲߬ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫.",
        "resetpass-submit-cancel": "ߊ߬ ߘߐߛߊ߬",
        "resetpass-temp-password": "ߕߊߡߌ߲ߞߊ߲ ߕߎ߬ߡߊ߬ߞߎ߲߬ߡߊ",
        "passwordreset": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߦߟߍ߬ߡߊ߲߬",
+       "passwordreset-disabled": "ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߡߊߦߟߍ߬ߡߊ߲߬ߣߍ߲ ߓߘߊ߫ ߛߋ߲߬ߓߐ߫ ߥߞߌ ߣߌ߲߬ ߘߐ߫.",
+       "passwordreset-username": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߕߐ߮:",
+       "passwordreset-domain": "ߡߊ߬ߘߎ߮:",
+       "passwordreset-email": "ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߛߊ߲߬ߓߊ߬ߕߐ߮:",
+       "passwordreset-emailtitle": "ߖߊ߬ߕߋ߬ߘߊ ߝߊߙߊ߲ߝߊ߮ߛߌ  {{SITENAME}} ߘߐ߫",
+       "passwordreset-emailelement": "ߕߐ߯ ߟߊߓߊ߯ߙߕߊ:\n$1\n\nߥߊ߯ߕߌ߫ ߟߊߕߊߡߌ߲߫ ߕߊߡߌ߲ߞߊ߲:\n $2",
+       "passwordreset-emailsentemail": "ߣߌ߫ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߣߌ߲߭ ߛߘߌ߬ߣߍ߲߬ ߞߍ߫ ߘߴߌ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߟߊ߫߸ ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ ߛߘߌߜߋ߲ ߘߌ߫ ߣߊ߬ ߟߊߥߴߊ߬ ߡߊ߬.",
+       "passwordreset-emailsentusername": "ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߘߏ߫ ߛߘߌ߬ߣߍ߲߬ ߦߋ߫ ߕߐ߯ ߟߊߓߊ߯ߙߕߊ ߣߌ߲߬ ߠߊ߫߸ ߏ߬ ߘߐ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ ߛߘߌߜߋ߲ ߘߌ߫ ߣߊ߬ ߟߊߥߴߊ߬ ߡߊ߬.",
+       "passwordreset-nocaller": "ߞߟߌߟߌߟߊ ߦߋ߫ ߡߊߛߐ߫ ߟߋ߬",
+       "passwordreset-nosuchcaller": "ߞߟߌߟߌߟߊ ߕߴߦߋ߲߬ $1",
+       "passwordreset-invalidemail": "ߢߎߡߍߙߋ߲߫ ߛߊ߲߬ߓߊ߬ߕߐ߮ ߓߍ߲߬ߓߊߟߌ",
+       "changeemail": "ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߡߊߝߊ߬ߟߋ߲߬ ߥߟߊ߫ ߞߵߊ߬ ߛߋ߲߬ߓߐ߫",
+       "changeemail-no-info": "ߌ ߦߴߌ ߜߊ߲߬ߞߎ߲߫ ߡߎߣߎ߲߬߸ ߞߊ߬ ߛߋ߫ ߞߐߜߍ ߣߌ߲߬ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߞߋߟߋ߲ߘߌ߫.",
        "changeemail-oldemail": "ߕߋ߲߭ߕߋ߲߭ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ",
        "changeemail-newemail": "ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ߫ ߞߎߘߊ",
+       "changeemail-none": "(ߝߏߦߌ߬)",
        "changeemail-password": "ߌ ߟߊ߫ {{SITENAME}} ߕߊ߬ߡߌ߲߬ߞߊ߲",
+       "changeemail-submit": "ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߡߊߝߊ߬ߟߋ߲߬",
+       "changeemail-nochange": "ߖߊ߰ߣߌ߲߬ ߌ ߦߋ߫ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ߫ ߜߘߍ߫ ߟߊߘߏ߲߬.",
+       "resettokens": "ߖߐߟߐ߲ߞߐ ߡߊߝߊ߬ߟߋ߲߬",
+       "resettokens-text": "ߌ ߦߋ߫ ߖߐߟߐ߲ߞߐ ߡߊߝߊ߬ߟߋ߲߬ ߡߍ߲ ߦߋ߫ ߘߎ߲߬ߘߎ߬ߡߊ߬ ߓߟߏߡߟߊ ߘߏ߫ ߟߎ߫ ߡߊߛߐ߬ߘߐ߲ ߠߊߘߤߊ߬ ߟߴߌ ߦߋ߫߸ ߡߍ߲ ߠߎ߬ ߛߘߌ߬ߣߍ߲߬ ߦߴߌ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߟߊ߫ ߦߊ߲߬.\n\nߌ ߞߊ߫ ߞߊ߲߫ ߞߵߏ߬ ߞߍ߫ ߣߴߌ ߣߐ߬ ߞߍ߫ ߘߴߊ߬ߟߎ߬ ߟߊߖߍ߲ߛߍ߲߫ ߠߊ߫ ߡߐ߱ ߘߏ߫ ߡߊ߬ ߓߌ߬ߟߊ߬ߒߘߐ߬ ߓߟߏߡߊ߬߸ ߥߟߊ߫ ߣߴߌ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߢߊߓߐߣߍ߲߫ ߞߍ߫ ߘߊ߫.",
        "bold_sample": "ߛߓߍߘߋ߲߫ ߞߎ߲ߓߊ",
        "bold_tip": "ߛߓߍߘߋ߲߫ ߞߎ߲ߓߊ",
        "italic_sample": "ߛߓߍߟߌ߫ ߡߊߖߍ߲߬ߞߍ߬ߣߍ߲",
        "link_sample": "ߛߘߌ߬ߜߋ߲ ߞߎ߲߬ߕߐ߮",
        "link_tip": "ߞߣߐߘߐ߫ ߛߘߌߜߋ߲",
        "extlink_sample": "ߛߘߌ߬ߜߋ߲ ߞߎ߲߬ߕߐ߮ http://www.example.com",
-       "extlink_tip": "ß\9eߣß\90ß\9fß\8aß\98ß\90ß« ß\9bß\98ß\8cß\9cß\8bß²",
+       "extlink_tip": "ß\9eß\90ß\9eß\8a߲ߠß\8a ß\9bß\98ß\8c߬ß\9cß\8bß² (ߣß\8c߲߬ ß ß\8aß\93ß\8a߬ß\95ß\8f߬ http:// prefix)",
        "headline_sample": "ߞߎ߲߬ߕߐ߮ ߛߓߍߟߌ",
        "headline_tip": "ߞߊߓߋ ߂߲ ߞߎ߲߬ߕߐ߮",
        "nowiki_sample": "ߛߓߍߟߌ߫ ߖߙߎߡߎ߲ߕߊ߲ ߠߊߘߏ߲߬ ߦߊ߲߬",
        "hr_tip": "ߛߌ߬ߕߊ߬ߙߌ߬ ߢߊߡߌߟߏߡߊ (ߊ߬ ߕߐ߬ߝߍ߬ߦߊ߬ ߟߊߓߊ߯ߙߊ߫)",
        "summary": "ߟߊ߬ߘߛߏ߬ߟߌ:",
        "minoredit": "ߣߌ߲߬ ߦߋ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߘߋ߬ߣߍ߲ ߘߏ߫ ߟߋ߬ ߘߌ߫",
-       "watchthis": "ß\98ߐߜߍ ߣߌ߲߬ ߘߐߜߍ߫",
-       "savearticle": "ß\8a߬ ߟߊߞߎ߲߬ߘߎ߬",
+       "watchthis": "ß\9eߐߜߍ ߣߌ߲߬ ߘߐߜߍ߫",
+       "savearticle": "ß\9eß\90ß\9cß\8d ߟߊߞߎ߲߬ߘߎ߬",
        "savechanges": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߊߞߎ߲߬ߘߎ߬",
        "publishpage": "ߞߐߜߍ ߟߊߥߊ߲߬ߞߊ߲߬",
        "publishchanges": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߊߥߊ߲߬ߞߊ߬",
        "anoneditwarning": "<strong>Warning:</strong> ߌ ߜߊ߲߬ߞߎ߲߬ߣߍ߲߬ ߕߍ߫.ߌ ߓߊ߯ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߛߎ߯-ߎ߯-ߛߎ߫ ߞߍ߫߸ ߌ ߟߊ߫ IP ߛߊ߲߬ߓߊ߬ߕߐ߮ ߘߌ߫ ߞߍ߫ ߦߋߕߊ ߘߌ߫.ߣߴߌ ߞߊ߬ ߜߊ߲߬ߞߎ߲߬ߠߌ߲߬ ߖߐ߲ߖߐ߲ ߞߍ߫ ߕߎ߬ߡߊ ߡߍ߲ <strong>[$1 log in]</strong> or <strong>[$2 create an account]</strong> ߌ ߟߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߣߍ߲ ߠߎ߬ ߘߌ߫ ߓߌ߬ߟߊ߬ ߌ ߜߊ߲߬ߞߎ߲߬ ߕߐ߮ ߟߊ߫߸ ߊ߬ ߣߌ߫ ߣߝߊ߬ ߜߘߍ߫ ߟߎ߫.",
        "anonpreviewwarning": "<em>ߌ ߜߊ߲߬ߞߎ߲߬ߣߍ߲߬ ߕߍ߫. ߟߊ߬ߞߎ߲߬ߘߎ߬ߟߌ ߘߴߌ ߟߊ߫ IP ߛߊ߲߬ߓߊ߬ߕߐ߮ ߟߊߡߙߊ߬ ߞߐߜߍ ߣߌ߲߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߘߐ߬ߝߐ ߘߐ߫</em>",
        "blockedtext": "<strong>ߌ ߟߊ߫ ߟߊ߬ߓߊ߰ߙߊ߬ ߕߐ߮ ߥߟߊ߫ IP ߛߊ߲߬ߓߊ߬ߕߐ߮ ߓߘߊ߫ ߓߊ߬ߟߊ߲߬߸</strong>\n\nߌ ߓߊ߬ߟߊ߲߬ߣߍ߲߬ ߦߋ߫ $1 ߟߋ߬ ߓߟߏ߫.\nߞߎ߲߭ ߡߍ߲ ߦߴߊ߬ ߟ߫ߊ߫ <em>$2</em>.\n\n•ߓߊ߬ߟߊ߲߬ߠߌ߲ ߘߊߡߌ߬ߣߊ: $8\n•ߓߊ߬ߟߊ߲߬ߠߌ߲ ߛߕߊ ߝߊ: $6\n•ߓߊ߬ߟߊ߲߬ߠߌ߲ ߘߊ߬ߟߎ: $7 \n\nߌ ߘߌ߫ ߛߋ߫ ߗߋߛߓߍ ߗߋ߫ ߟߊ߫ $1 ߡߊ߬ ߥߟߊ߫ ߡߐ߰ ߜߘߍ߫ \n[[{{MediaWiki:Grouppage-sysop}}|administrator]] ߞߊ߬ ߘߊߘߐߖߊߥߏ ߞߍ߫ ߓߊ߬ߟߊ߲߬ߠߌ߲ ߞߊ߲߬.\nߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫  \"{{int:emailuser}}\" ߟߊߓߊ߯ߙߊ߫ ߟߊ߫߸ ߟߊ߬ߓߊ߰ߙߊ߬ߢߊ߬ ߖߐ߲ߖߐ߲ ߡߍ߲ ߦߋ߫ ߦߋ߲߬߸ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ߫ ߖߐ߲ߖߐ߲߫ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߘߏ߫ ߦߴߌ ߟߊ߫ [[Special:Preferences|account preferences]] ߘߐ߫߸ ߊ߬ ߣߴߌ ߡߊ߫ ߓߊ߬ߟߊ߲߬ ߊ߬ ߟߊߓߊ߯ߙߊ ߞߏߛߐ߲߬ ߘߋ߫. ߌ ߟߊ߫ IP ߛߊ߲߬ߓߊ߬ߕߐ߮ ߦߋ߫ $3 ߟߋ߬ ߘߌ߫ ߕߊ߲߬߸ ߊ߬ ߣߴߌ ߟߊ߫ ߛߊ߲߬ߓߊ߬ߕߐ߮ ߓߊ߬ߟߊ߲߬ߣߍ߲ ߦߋ߫ #$5 ߟߋ߬ ߘߌ߫.\nߖߊ߰ߣߌ߲߬ ߌ ߦߋ߫ ߛߊ߲ߝߍ߫ ߝߊߙߊ߲ߝߊ߯ߛߌ ߣߌ߲߬ ߓߍ߯ ߟߊߘߏ߲߬ ߌ ߟߊ߫ ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ ߘߐ߫.",
+       "whitelistedittext": "ߖߊ߰ߣߌ߲߫ $1 ߞߊ߬ ߞߐߜߍ ߡߊߦߟߍ߬ߡߊ߲߫.",
+       "confirmedittext": "ߌ ߦߴߌ ߟߊ߫ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߟߊߛߙߋߦߊ߫߸ ߦߊ߲߬ߣߴߌ ߦߋ߫ ߞߐߜߍ ߡߊ߬ߦߟߍ߬ߡߊ߲߬.\nߖߊ߰ߣߌ߲߬ ߌ ߦߴߌ ߟߊ߫ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߟߊߛߙߋߦߊ߫ ߌ ߟߊ߫   [[Special:Preferences|user preferences]] ߘߐ߫.",
+       "loginreqtitle": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߞߊ߬ߣߌ߲߬ ߣߍ߲߫",
        "loginreqlink": "ߌ ߜߊ߲߬ߞߎ߲߬",
+       "loginreqpagetext": "ߖߊ߰ߣߌ߲߫ $1 ߛߊ߫ ߞߐߜߍ ߕߐ߭ ߟߎ߬ ߘߌ߫ ߦߋ߫.",
+       "accmailtitle": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߘߊ߫ ߗߋ߫.",
        "newarticle": "(ߞߎߘߊ)",
        "newarticletext": "ߌ ߓߘߊ߫ ߛߘߌ߬ߜߋ߲ ߘߏ߫ ߟߊߓߊ߬ߕߏ߬ ߞߐߜߍ ߘߏ߫ ߘߐ߫߸ ߡߍ߲ ߕߴߦߋ߲߬ ߡߎߣߎ߲߬.\nߣߵߌ ߦߴߊ߬ ߝߍ߫ ߞߊ߬ ߞߐߜߍ ߘߏ߫ ߟߊߘߊ߲߫߸ ߛߓߍߟߌ ߘߊߡߌ߬ߣߊ߬ ߘߎ߰ߟߊ߬ߘߐ߫ ߞߏ߲ߘߏ ߘߐ߫ (ߞߊ߬ [$1 ߘߍ߬ߡߍ߲߬ߠߌ߲ ߞߐߜߍ] ߦߋ߫߸ ߖߐ߲߬ߛߊ߬ ߌ ߘߌ߫ ߞߌ߬ߓߊ߬ߙߏ߬ ߖߐ߲ߖߐ߲ ߛߐ߬ߘߐ߲߬). ߣߵߌ ߘߏ߲߬ ߞߍ߫ ߘߊ߫ ߦߊ߲߬ ߝߎ߬ߕߎ߲߬ߕߌ߬ ߓߟߏߡߊ߬߸ ߌ ߟߊ߫ ߛߏ߲߯ߓߊߟߊ߲ <strong>back</strong> ߛߐ߲߬ߞߌ߲߫.",
        "anontalkpagetext": "----\n<em>ߓߊ߬ߘߏ߬ ߞߐߜߍ ߣߌ߲߬ ߦߋ߫ ߟߊߓߊ߯ߙߟߊ߫ ߟߐ߲ߓߊߟߌ ߟߋ߬ ߓߟߏ߫ ߡߍ߲ ߡߊ߫ ߖߊ߬ߕߋ߬ߘߊ߬ ߛߌ߲ߘߌ߫ ߡߎߣߎ߲߬ ߥߟߴߊ߬ ߕߍ߫ ߖߊ߬ߕߋ߬ߘߊ ߏ߬ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫;</em>\nߏ߬ ߞߏߛߐ߲߬ ߊ߲ ߞߊ߫ ߞߊ߲߫ ߞߵߊ߬ ߟߊ߫ ߓߡ (ߓߟߐߟߐ ߡߛߍ߬ߞߍ߬ߡߛߍߞߍ) ߛߊ߲߬ߓߊ߬ߕߐ߮ ߟߊߓߊ߯ߙߴߊ߬ ߡߊߟߐ߲߫ ߞߊߡߊ߬߸ ߟߊߓߊ߯ߙߟߊ߫ ߛߌߦߊߡߊ߲߫ ߓߴߛߋ߫ ߞߊ߬ ߘߍ߬ ߓߡ ߛߊ߲߬ߓߊ߬ߕߐ߮ ߣߌ߲߬ ߢߐ߲߰ ߠߊ߫.\nߣߴߌ ߞߍ߫ ߘߊ߫ ߟߊߓߊ߯ߙߟߊ߫ ߡߊߝߟߌ߬ߣߍ߲߫ ߘߌ߫ ߞߵߊ߬ ߛߏ߬ߓߌ߬ ߞߏ߫ ߌ ߟߊ߫ ߞߊ߲߬ߞߎߡߊ ߟߎ߬ ߕߴߌ ߕߊ߫ ߘߌ߫ ߊ߬ ߘߌ߫ ߟߐ߬ ߌ ߡߊ߬ ߌߞߘߐ߫߸ ߌ ߖߏ߫ ߞߊ߬ [[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],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} create this page]</span>.",
        "noarticletext-nopermission": "ߛߓߍߟߌ߫ ߛߌ߫ ߕߍ߫ ߞߐߜߍ ߣߌ߲߭ ߞߊ߲߬ ߕߋ߲߫.\nߌ ߘߌ߫ ߛߋ߫ [[Special:Search/{{PAGENAME}}|search for this page title]] ߢߌߣߌ߲߫ ߠߊ߫ ߞߐߜߍ ߕߐ߭ ߟߎ߬ ߘߐ߫߸ ߥߟߊ߫ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span> ߞߏ߬ߣߌ߲߬ ߘߌ߬ߢߍ߬ ߞߍߣߍ߲߫ ߕߴߌ ߡߊ߬ ߞߐߜߍ߫ ߣߌ߲߬ ߠߊߞߊ߭ ߘߐ߫.",
+       "userpage-userdoesnotexist": "ߖߊ߬ߕߋ߬ߘߊ߬ ߟߊߓߊ߯ߙߕߊ \"$1\" ߛߌ߲ߘߌߣߍ߲߫ ߕߍ߫. \nߝߛߍ߬ߝߛߍ߬ߟߌ ߞߍ߫߸ ߣߴߌ ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߞߐߜߍ ߣߌ߲߬ ߛߌ߲ߘߌ߫/ߡߊߦߟߍ߬ߡߊ߲߫.",
        "userpage-userdoesnotexist-view": "ߟߊ߬ߓߊ߰ߙߊ߬ ߖߊߕߋߘߊ \"$1\" ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲߫ ߕߍ߫.",
        "clearyourcache": "<strong>ߖߊ߲߬ߕߏ߬ߒߘߐ:</strong> ߞߎ߲߬ߘߎ߬ߟߌ ߞߐ߫، ߌ ߓߍߣߊ߬ ߢߌߣߌ߲߫ ߌ ߟߊ߫ ߓߟߐߟߐߞߐߜߍ ߞߙߏ ߘߐߞߊ߭ ߡߊ߬ ߞߊ߬ ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߠߎ߬ ߦߋ߫. * <strong>ߝߦߊߝߐߞߛ / ߛߝߊߙߌ:</strong> ߊ߬ ߡߌ߬ߣߊ߬ <em>Shift</em> ߘߌ߯ߟߌ߫ ߕߎߡߊ <em>Reload</em>، ߥߟߊ߫ ߞߵߊ߬ ߛߐ߲߬ߞߌ߲߫ ߥߟߊ߫ <em>Ctrl-F5</em> ߤߊߡߊ߲߫ <em>Ctrl-R</em> (<em>⌘-R</em> ߡߊߞߌ ߞߊ߲߬) * <strong>ߜ߭ߎߜ߭ߐߟ ߞߊ߲߬:</strong> ߊ߬ ߛߐ߲߬ߞߌ߲߫ <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> ߡߊߞߌ ߞߊ߲߬) * <strong>ߍ߲ߕߍߙߑߣߍߕ ߍߞߛߌߔߟߏߙߊ ߞߊ߲߬:</strong> ߊ߬ ߡߌ߬ߣߊ߬ <em>Ctrl</em> ߊ߬ ߛߐ߲߬ߞߌ߲߬ ߕߎߡߊ <em>Refresh</em>، ߥߟߊ߫ ߞߵߊ߬ ߛߐ߲߬ߞߌ߲߫ <em>Ctrl-F5</em> * <strong>ߏߔߋߙߊ:</strong> ߕߊ߯ ߞߊߕߙߍ߬ <em>Menu → ߟߊ߬ߓߍ߲߬ߢߐ߲߰ߡߦߊ߬ߘߊ</em> (<em>Opera → ߞߐߡߊߛߙߋ</em> ߡߊߞߌ ߟߊ߫) ߞߊ߬ ߕߊ߯ ߏ߬ ߞߐ߫ <em>ߘߎ߲߬ߘߎ߬ߡߊ߬ & ߞߎ߲߬ߠߊ߬ߝߎߟߋ߲ → ߓߟߐߟߞߐߜߍߦߊ ߟߐ߲ߕߊ ߟߎ߫ ߖߏ߬ߛߌ߫ → ߖߌ߬ߦߊ߬ߓߍ ߟߎ߬ ߣߌ߫ ߞߐߕߐ߯ ߢߡߊߘߏ߲߰ߣߍ߲ ߠߎ߬</em>.",
        "previewnote": "<strong>ߌ ߖߊ߲߬ߓߌ߬ߟߊ߬ ߞߏ߫ ߣߌ߲߬ ߦߋ߫ ߢߍߝߟߍߟߌ ߘߐߙߐ߲߫ ߠߋ߬ ߘߌ߫.</strong>\nߌ ߟߊ߫ ߡߝߊ߬ߟߋ߲߬ߠߌ ߟߎ߫ ߡߊ߫ ߟߊߞߎ߲߬ߘߎ߬ ߝߟߐ߫ ߘߋ߬߹",
        "permissionserrorstext-withaction": "ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ߬ ߛߌ߫ ߕߴߌ ߦߋ߫ ߞߊ߬ $2߸ {{PLURAL:$1|ߞߏߛߐ߲߬|ߟߎ߬ ߞߏߛߐ߲߬}}",
        "recreate-moveddeleted-warn": "<strong>ߌ ߖߊ߲߬ߕߏ߫: ߌ ߦߋ߫ ߞߐߜߍ ߘߏ߫ ߟߋ߬ ߟߊߘߊ߲߫ ߞߏ ߘߐ߫ ߣߌ߲߬߸ ߡߍ߲ ߖߏ߬ߛߌ߬ߣߍ߲߬ ߡߎߣߎ߲߬.</strong> \nߌ ߓߛߌ߬ߞߌ߬ ߕߐ߫ ߟߋ߬ ߛߍ߲߸ ߣߴߌ ߘߌ߫ ߛߋ߫ ߞߐߜߍ ߣߌ߲߬ ߡߊߦߟߍ߬ߡߊ߲ ߘߊߓߊ߲߫ ߠߊ߫. \nߞߐߜߍ ߣߌ߲߬ ߦߟߌߣߐ ߖߏ߬ߛߌ߬ߣߍ߲ ߣߴߊ߬ ߛߋ߲߬ߓߐ߬ߣߍ߲ ߠߎ߬ ߡߊߘߊ߲ߣߍ߲߫ ߦߊ߲߬ ߠߋ ߟߊ߬ߣߐ߰ߦߊ߬ߟߌ ߘߌ߫:",
        "moveddeleted-notice": "ߞߐߜߍ ߣߌ߲߬ ߓߘߊ߫ ߖߏ߬ߛߌ߬.\nߖߏ߬ߛߌ߬ߟߌ߸ ߟߊ߬ߞߊ߲߬ߘߊ߬ߟߌ߸ ߊ߬ ߣߌ߫ ߞߐߜߍ ߛߓߍߟߌ ߟߎ߬ ߛߋ߲߬ߓߐ߸ ߏ߬ ߟߎ߫ ߓߍ߯ ߡߊߛߐߣߍ߲߫ ߦߋ߫ ߘߎ߰ߟߊ ߘߐ߫.",
+       "postedit-confirmation-created": "ߞߐߜߍ ߓߘߊ߫ ߓߊ߲߫ ߛߌ߲ߘߌ߫ ߟߊ߫.",
+       "postedit-confirmation-restored": "ߞߐߜߍ ߓߘߊ߫ ߓߊ߲߫ ߘߐߓߍ߲߬ ߠߊ߫.",
+       "postedit-confirmation-saved": "ߌ ߟߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߓߘߊ߫ ߟߊߞߎ߲߬ߘߎ߬.",
+       "postedit-confirmation-published": "ߌ ߟߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߓߘߊ߫ ߟߊߥߊ߲߬ߞߊ߫.",
        "content-model-wikitext": "ߥߞߌ߫ ߞߟߏߜߍ",
        "undo-failure": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߘߐߛߊ߬ ߟߊ߫߸ ߝߘߏ߬ߒ߬ߡߊ߬ߟߌ߬ ߡߊߦߟߍߡߊ߲ߠߌ߲ ߞߏߛߐ߲߬.",
        "viewpagelogs": "ߞߐߜߍ ߣߌ߲߬ ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߠߎ߬ ߦߋ߫",
        "searchresults": "ߢߌߣߌ߲ߠߌ߲ ߞߐߝߟߌ ߟߎ߬",
        "searchresults-title": "ߣߌ߲߬ \"$1\" ߢߌߣߌ߲ߠߌ߲ ߞߐߝߟߌ",
        "prevn": "ߕߊ߬ߡߌ߲߬ߣߍ߲ ߠߎ߬ {{PLURAL:$1|$1}}",
-       "nextn": "$1{{PLURAL:$1|ߟߊߕߎ߲߰ߠߊ}}",
+       "nextn": "ߟߊߕߎ߲߰ߠߊ {{PLURAL:$1|$1}}",
        "prevn-title": "ߢߝߍߕߊ $1 {{PLURAL:$1|result|results}}",
        "nextn-title": "ߢߍߕߊ $1 {{PLURAL:$1|ߞߐߖߋߓߌ}}",
        "shown-title": "ߞߐߜߍ߫ ߞߋ߬ߟߋ߲߬ߞߋ߬ߟߋ߲߬ߠߊ $1{{PLURAL:$1|ߞߐߝߟߌ |ߞߐߝߟߌ ߟߎ߬ }} ߦߌߘߊߞߊ߬",
        "rcshowhideliu-hide": "ߊ߬ ߢߡߊߘߏ߲߰",
        "rcshowhideanons": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߊ߫ ߕߐ߯ߒߕߊ߲ $1",
        "rcshowhideanons-show": "ߦߌ߬ߘߊ߬ߟߌ",
-       "rcshowhideanons-hide": "ߊ߬ ߘߏ߲߰",
+       "rcshowhideanons-hide": "ß\8a߬ ß¢ß¡ß\8aß\98ß\8f߲߰",
        "rcshowhidepatr": "$1 ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ߣߍ߲߫ ߞߣߐ߬ߜߍ߲߬ߣߍ߲ ߠߎ߬",
        "rcshowhidemine": "ߒ ߠߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߣߍ߲ ߠߎ߬ $1",
        "rcshowhidemine-show": "ߊ߬ ߦߌ߬ߘߊ߬",
        "imgfile": "ߞߐߕߐ߮",
        "listfiles": "ߞߐߕߐ߮ ߛߙߍߘߍ",
        "file-anchor-link": "ߞߐߕߐ߮",
-       "filehist": "ß\9eß\90ß\95ß\90ß® ß\95ß\8e߬ߡß\8a߬ß\98ß\8a",
+       "filehist": "ß\9eß\90ß\95ß\90ß® ß\9fß\8aß« ß\98ß\90߬ß\9dß\90",
        "filehist-help": "ߕߎ߬ߡߊ߬ߘߊ/ߕߎ߬ߡߊ ߛߐ߲߬ߞߌ߲߬ ߓߊ߫߸ ߞߊ߬ ߕߎ߬ߡߊ߬ߘߊ ߞߐߕߐ߮ ߟߎ߬ ߦߋ߫.",
        "filehist-revert": "ߊ߬ ߟߊߢߊ߬",
        "filehist-current": "ߞߍߛߊ߲ߞߏ",
        "tooltip-t-permalink": "ߞߐߜߍ ߣߌ߲߬ ߡߛߊ߬ߦߌ߲߬ߠߌ߲߬ ߛߘߌ߬ߜߋ߲߬ ߞߎߘߊߦߌ",
        "tooltip-ca-nstab-main": "ߞߐߜߍ ߞߣߐߘߐ ߘߐߜߍ߫",
        "tooltip-ca-nstab-user": "ߞߐߜߍ߫ ߟߊߓߊ߯ߙߕߊ ߘߐߜߍ߫",
-       "tooltip-ca-nstab-special": "ߣß\8c߲߬ ß¦ß\8bß« ß\98ߐߜߍ߫ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߠߋ߬ ߘߌ߫߸ ߊ߬ ߕߍ߫ ߛߋ߫ ߢߟߊߞߎߘߦߊ߫ ߟߊ߫",
+       "tooltip-ca-nstab-special": "ߣß\8c߲߬ ß¦ß\8bß« ß\9eߐߜߍ߫ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߠߋ߬ ߘߌ߫߸ ߊ߬ ߕߍ߫ ߛߋ߫ ߢߟߊߞߎߘߦߊ߫ ߟߊ߫",
        "tooltip-ca-nstab-project": "ߖߊ߬ߕߋ߬ߘߐ߬ߛߌ߰ ߞߐߜߍ ߘߐߜߍ߫",
        "tooltip-ca-nstab-image": "ߞߐߕߐ߮ ߞߐߜߍ ߟߎ߫ ߘߐߜߍ߫",
        "tooltip-ca-nstab-mediawiki": "ߞߊ߲ߞߋ ߗߋߛߓߍ ߘߐߜߍ߫",
index 2154ada..6cac6f1 100644 (file)
        "mw-widgets-abandonedit-keep": "Continuar a editar",
        "mw-widgets-abandonedit-title": "Tem a certeza?",
        "mw-widgets-copytextlayout-copy": "Copiar",
+       "mw-widgets-copytextlayout-copy-fail": "Não foi possível copiar para a área de transferência.",
+       "mw-widgets-copytextlayout-copy-success": "Copiado para a área de transferência.",
        "mw-widgets-dateinput-no-date": "Não foi selecionada nenhuma data",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
index 44ef8b0..364fff4 100644 (file)
        "mcrundo-missingparam": "Error displayed when parameters for action=mcrundo are missing",
        "mcrundo-changed": "Message displayed when the page has been edited between the loading and submission of an editless undo.",
        "mcrundo-parse-failed": "Error message indicating that the page's content can not be parsed because it is syntactically invalid. This may occurr for content types using serialization or a strict markup syntax.\n\nParameters:\n* $1 – specific error message",
-       "semicolon-separator": "{{optional}}",
+       "semicolon-separator": "{{Optional}}\n\nWarning: languages have different usages of punctuation, and sometimes they are swapped (e.g. openining and closing quotation marks, or full stop and colon in Armenian), or change their form (the full stop in Chinese and Japanese, the \"colon\" in Armenian used in fact as a regular full stop, the \"comma\" reversed in Arabic, or changed in Armenian, and Chinese, the \"semicolon\" in Greek used in fact as a regular question mark...)\n\nTheir spacing (before or after) may also vary across languages (for example French requires a non-breaking space, preferably narrow if the browser supports NNBSP, on the inner side of some punctuations like quotation/question/exclamation marks, colon, and semicolons; and Chinese and Japanese don't follow their fullwidth punctuations by a regular space).",
        "comma-separator": "{{optional}}\n\nWarning: languages have different usages of punctuation, and sometimes they are swapped (e.g. openining and closing quotation marks, or full stop and colon in Armenian), or change their form (the full stop in Chinese and Japanese, the prefered \"colon\" in Armenian used in fact as the regular full stop, the comma in Arabic, Armenian, and Chinese...)\n\nTheir spacing (before or after) may also vary across languages (for example French requires a non-breaking space, preferably narrow if the browser supports NNBSP, on the inner side of some punctuations like quotation/question/exclamation marks, colon, and semicolons).",
        "colon-separator": "{{optional}}\nChange it only if your language uses another character for ':' or it needs an extra space before the colon.",
        "autocomment-prefix": "{{notranslate}}",
        "parentheses-start": "{{optional}}",
        "parentheses-end": "{{optional}}",
        "brackets": "{{Optional}}\n{{Format|plain}}",
-       "quotation-marks": "Quotation marks, for quoting, sometimes titles etc., depending on the language.\n\nSee: [[w:Non-English usage of quotation marks|Non-English usage of quotation marks on Wikipedia]].\n\nParameters:\n* $1 - text to be wrapped in quotation marks",
+       "quotation-marks": "Quotation marks, for quoting, sometimes titles etc., depending on the language.\n\nSee: [[w:Quotation mark#Summary table|Non-English usage of quotation marks on Wikipedia]].\n\nParameters:\n* $1 - text to be wrapped in quotation marks",
        "imgmultipageprev": "{{Identical|Previous page}}",
        "imgmultipagenext": "{{Identical|Next page}}",
        "imgmultigo": "Used as label for submit button.\n\nSee also:\n* {{msg-mw|Imgmultigoto}}\n{{Identical|Go}}",
index 879cc2e..1c2e2ee 100644 (file)
        "search-relatedarticle": "Povezano",
        "searchrelated": "povezano",
        "searchall": "sve",
-       "showingresults": "Dole {{PLURAL:$1|je prikazana <strong>1</strong> stavka|su prikazane <strong>$1</strong> stavke|je prikazano <strong>$1</strong> stavka}} počev od <strong>$2</strong>.",
-       "showingresultsinrange": "Ispod {{PLURAL:$1|je prikazana <strong>1</strong> stavka|su prikazane <strong>$1</strong> stavke|je prikazano <strong>$1</strong> stavka}}, u rasponu od <strong>$2</strong> do <strong>$3</strong>.",
+       "showingresults": "Dole {{PLURAL:$1|je prikazana <strong>1</strong> stavka|su prikazane <strong>$1</strong> stavke|je prikazano <strong>$1</strong> stavki}} počev od br. <strong>$2</strong>.",
+       "showingresultsinrange": "Ispod {{PLURAL:$1|je prikazana <strong>1</strong> stavka|su prikazane <strong>$1</strong> stavke|je prikazano <strong>$1</strong> stavki}} u rasponu od <strong>$2</strong> do <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Stavka <strong>$1</strong> od <strong>$3</strong>|Stavke <strong>$1 - $2</strong> od <strong>$3</strong>}}",
        "search-nonefound": "Nisu pronađene ishodne stavke koji odgovaraju upitu.",
        "search-nonefound-thiswiki": "Nisu pronađene stavke koji odgovaraju upitu na ovom sajtu.",
index 004bb17..add1976 100644 (file)
@@ -39,7 +39,8 @@
                        "Luanibraj",
                        "Matěj Suchánek",
                        "Bjakupi",
-                       "Vlad5250"
+                       "Vlad5250",
+                       "Klein Muçi"
                ]
        },
        "tog-underline": "Nënvizimi i lidhjes:",
        "nrevisions": "$1 {{PLURAL:$1|version|versione}}",
        "nimagelinks": "Përdorur në $1 {{PLURAL:$1|faqe|faqe}}",
        "ntransclusions": "përdorur në $1 {{PLURAL:$1|faqe|faqe}}",
-       "specialpage-empty": "Kjo faqe është boshe.",
+       "specialpage-empty": "Kjo faqe është bosh.",
        "lonelypages": "Artikuj të palidhur",
        "lonelypagestext": "Faqet në vijim nuk janë të lidhura ose nuk janë të përfshira në faqet tjera në {{SITENAME}}.",
        "uncategorizedpages": "Artikuj të pakategorizuar",
index c2a2729..54dd8bc 100644 (file)
        "delete-warning-toobig": "Jujutan ieu kaca panjang pisan, leuwih ti{{PLURAL:$1|révisi|révisi}}. Dihapusna ieu kaca bisa ngaruksak jalanna pangkalan data {{SITENAME}}; sing ati-ati.",
        "deleteprotected": "Anjeun teu bisa mupus ieu kaca lantaran geus ditangtayungan.",
        "rollback": "Balikkeun éditan",
+       "rollback-confirmation-no": "Bolay",
        "rollbacklink": "balikkeun",
        "rollbacklinkcount": "balikkeun $1 {{PLURAL:$1|éditan}}",
        "rollbacklinkcount-morethan": "balikkeun leuwih ti $1 {{PLURAL:$1|saéditan|éditan}}",
        "revertpage": "Malikkeun éditan $2, diganti deui ka vérsi ahir ku $1",
        "rollback-success": "Mulangkeun éditan $1; balik deui ka vérsi panungtung ku $2.",
        "sessionfailure-title": "Kagagalan sési",
-       "sessionfailure": "Sigana aya masalah jeung termin log anjeun; peta ieu geus dibolaykeun salaku pépéling pikeun ngalawan ayana pangbajak. Mangga pencét \"back\" jeung muat ulang ti kaca asal anjeun, lajeng cobaan deui.",
+       "sessionfailure": "Sigana aya masalah jeung termin log anjeun; peta ieu geus dibolaykeun minangka panyingkahan pikeun ngalawan ayana pangbajak. Mangga pencét \"back\" jeung muat ulang ti kaca asal anjeun, tuluy pecakan deui.",
        "changecontentmodel": "Robah modél kontén hiji kaca",
        "changecontentmodel-legend": "Robah modél kontén",
        "changecontentmodel-title-label": "Judul kaca",
index 52f2e9f..0331027 100644 (file)
        "mw-widgets-abandonedit-discard": "Släng redigeringar",
        "mw-widgets-abandonedit-keep": "Fortsätt redigera",
        "mw-widgets-abandonedit-title": "Är du säker?",
+       "mw-widgets-copytextlayout-copy": "Kopiera",
+       "mw-widgets-copytextlayout-copy-fail": "Misslyckades att kopiera till urklipp.",
+       "mw-widgets-copytextlayout-copy-success": "Kopierades till urklipp.",
        "mw-widgets-dateinput-no-date": "Inget valt datum",
        "mw-widgets-dateinput-placeholder-day": "ÅÅÅÅ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
index 4333659..ffce23c 100644 (file)
        "virus-scanfailed": "tarama başarısız (kod $1)",
        "virus-unknownscanner": "bilinmeyen antivürüs:",
        "logouttext": "'''Artık oturumunuzu kapattınız.'''\n\nTarayıcınızın önbelleğini temizleyinceye kadar bazı sayfalarda, oturumunuz açıkmış gibi gözükmeye devam edebilir.",
+       "logging-out-notify": "Oturumunuz kapatılıyor; lütfen bekleyin.",
+       "logout-failed": "Oturum şu an kapatılamıyor: $1",
        "cannotlogoutnow-title": "Şu an oturum kapatılamıyor",
        "cannotlogoutnow-text": "$1 kullanılırken oturumu kapatmak mümkün değil.",
        "welcomeuser": "Hoş geldin $1!",
        "badretype": "Girdiğiniz parolalar eşleşmiyor.",
        "usernameinprogress": "Bu kullanıcı adı için bir hesap oluşturma zaten sürüyor. Lütfen bekleyin.",
        "userexists": "Girdiğiniz kullanıcı adı zaten kullanımda.\nLütfen farklı bir kullanıcı adı seçiniz.",
+       "createacct-normalization": "Kullanıcı adınızı teknik sınırlamalar nedeniyle \"$2\" olarak değiştirilecektir.",
        "loginerror": "Oturum açma hatası.",
        "createacct-error": "Hesap oluşturma hatası",
        "createaccounterror": "Hesap oluşturulamıyor: $1",
        "resetpass-abort-generic": "Parola değişikliği bir uzantı tarafından iptal edildi.",
        "resetpass-expired": "Parolanızın süresi bitti. Lütfen, giriş için yeni bir parola oluşturun.",
        "resetpass-expired-soft": "Parolanızın süresi bitti ve değiştirilmesi gerekiyor. Lütfen, yeni bir parola seçin veya daha sonra değiştirmek için \"{{int:authprovider-resetpass-skip-label}}\" düğmesine tıklayın.",
+       "resetpass-validity": "Parolanız geçerli değil: $1",
        "resetpass-validity-soft": "Parolanız geçerli değil: $1\n\nLütfen yeni bir şifre belirleyin ya da daha sonra değiştirmek için \"{{int:authprovider-resetpass-skip-label}}\" bağlantısını tıklayın.",
        "passwordreset": "Parola sıfırlama",
        "passwordreset-text-one": "Parolanızı sıfırlamak için bu formu doldurun.",
        "defaultmessagetext": "Varsayılan mesaj metni",
        "content-failed-to-parse": "$1 modeli için $2 içerik türü çözümlenemedi: $3",
        "invalid-content-data": "Geçersiz içerik verisi",
-       "content-not-allowed-here": "\"$1\" içeriğine, [[:$2]] sayfasında izin verilmemekte.",
+       "content-not-allowed-here": "\"$1\" içeriğine, [[:$2]] sayfasının \"$3\" bölümünde izin verilmemekte.",
        "editwarning-warning": "Bu sayfadan ayrılmak yaptığınız herhangi bir değişikliği kaybetmenize sebep olabilir.\nEğer giriş yaptıysanız, bu uyarıyı, tercihlerinizin \"{{int:prefs-editing}}\" bölümünde devre dışı bırakabilirsiniz.",
        "editpage-invalidcontentmodel-title": "İçerik modeli desteklenmiyor",
        "editpage-invalidcontentmodel-text": "\"$1\" içerik modeli desteklenmemektedir.",
        "action-changetags": "tekil sürümlere veya günlük kayıtlarına etiket ekleme veya çıkarma",
        "action-deletechangetags": "etiketleri veritabanından sil",
        "action-purge": "bu sayfayı temizle",
+       "action-editinterface": "Kullanıcı arayüzünü değiştir",
+       "action-editusercss": "Diğer kullanıcıların CSS sayfalarını değiştir",
+       "action-edituserjson": "Diğer kullanıcıların JSON sayfalarını değiştir",
+       "action-edituserjs": "Diğer kullanıcıların JavaScript sayfalarını değiştir",
+       "action-hideuser": "Herkesten gizleyerek bir kullanıcı adını engelle",
        "nchanges": "$1 {{PLURAL:$1|değişiklik|değişiklik}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|son ziyaretten bu yana}}",
        "enhancedrc-history": "geçmiş",
        "uploadstash-file-not-found-no-local-path": "Ölçeklenmiş öge için yerel yol yok.",
        "uploadstash-file-not-found-no-object": "Küçük resim için yerel dosya nesnesi oluşturulamadı.",
        "uploadstash-file-not-found-no-remote-thumb": "Küçük resim alma başarısız oldu: $1\nURL = $2",
+       "uploadstash-wrong-owner": "Bu dosya ($1) mevcut kullanıcıya ait değil.",
        "uploadstash-no-extension": "Geçersiz uzantı.",
        "uploadstash-zero-length": "Dosya boyutu sıfır.",
        "invalid-chunk-offset": "Geçersiz öbek ofset",
index 8c05555..f25095e 100644 (file)
        "rcfilters-restore-default-filters": "Відновити стандартні фільтри",
        "rcfilters-clear-all-filters": "Очистити фільтри",
        "rcfilters-show-new-changes": "Переглянути нові зміни з $1",
-       "rcfilters-search-placeholder": "ФÑ\96лÑ\8cÑ\82Ñ\80Ñ\83йÑ\82е Ñ\80едагÑ\83ваннÑ\8f (використовуйте меню, або скористайтесь пошуком фільтра за назвою)",
+       "rcfilters-search-placeholder": "ФÑ\96лÑ\8cÑ\82Ñ\80Ñ\83ваÑ\82и Ð·Ð¼Ñ\96ни (використовуйте меню, або скористайтесь пошуком фільтра за назвою)",
        "rcfilters-invalid-filter": "Недійсний фільтр",
        "rcfilters-empty-filter": "Без фільтрів. Показано всі зміни.",
        "rcfilters-filterlist-title": "Фільтри",
index d80af9b..7ddd206 100644 (file)
        "showhideselectedversions": "Ìfihàn/ìbòmọ́lẹ̀ àwọn àtúnyẹ̀wò ṣíṣàyàn",
        "editundo": "dápadà",
        "diff-empty": "(Kò ní yàtọ̀)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Àtúnyẹ̀wò inú àrin kan|Àwọn àtúnyẹ̀wò inú àrin $1}} látọwọ́ oníṣe kan náà kò jẹ́ híhàn)",
        "diff-multi-manyusers": "({{PLURAL:$1|Àtúnyẹ̀wò inú àrin kan|Àwọn àtúnyẹ̀wò inú àrin $1}} látọwọ́ {{PLURAL:$2|oníṣe|àwọn oníṣe}} tó pọ̀ju $2 lọ kò jẹ́ fífihàn)",
        "difference-missing-revision": "{{PLURAL:$2|Àtúnyẹ̀wò kan|Àwọn àtúnyẹ̀wò $2}} ìyàtọ̀ yìí ($1) kò {{PLURAL:$2|sí|sí}}.\n\nÈyí ṣẹlẹ̀ nítorí pé ẹ tẹ̀lé àjápọ̀ ìyàtọ̀ tí kò ṣiṣẹ́ mọ́ wá sí ojúewé tó ti jẹ́ píparẹ́.\nẸ̀kúnrẹ́rẹ́ wà nínú [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} àkọọ́lẹ̀ ìparẹ́].",
        "searchresults": "Àwọn èsì àwárí",
        "filehist-filesize": "Ìtóbi fáìlì",
        "filehist-comment": "Àríwí",
        "imagelinks": "Ìlò fáìlì",
-       "linkstoimage": "{{PLURAL:$1|Ojúewé kan yìí|Àwọn ojúewé $1 wọ̀nyí}} jápọ̀ mọ́ fáìlì yí:",
+       "linkstoimage": "{{PLURAL:$1|Ojúewé kan yìí|Àwọn ojúewé $1 wọ̀nyí}} únlo fáìlì yí:",
        "linkstoimage-more": "{{PLURAL:$1|Ojúewé|Àwọn ojúewé}} tó pọ̀ju $1 lọ jápọ̀ mọ́ fáìlì yìí.\nÀkòjọ ìṣàlẹ̀ yìí ṣàfihàn {{PLURAL:$1|ojúewé àkọ́kọ́|ojúewé $1 àkọ́kọ́}} tó jápọ̀ mọ́ fáìlì yìí nìkan.\n[[Special:WhatLinksHere/$2|Àkójọ kíkúnrẹ́rẹ́]] wà nígbèéwọ́.",
-       "nolinkstoimage": "Kò sí ojúewé tó jápọ̀ mọ́ fáìlì yìí.",
+       "nolinkstoimage": "Kò sí ojúewé tó únlo fáìlì yìí.",
        "morelinkstoimage": "Ìwòrán [[Special:WhatLinksHere/$1|àwọn ìjápọ̀ míhìn]] sí fáìlì yìí.",
        "linkstoimage-redirect": "$1 (àtúnjúwe fáìlì) $2",
        "duplicatesoffile": "{{PLURAL:$1|Fáìlì ìsàlẹ̀|Àwọn fáìli ìsàlẹ̀ $1}} yìí jẹ́ àwòkọ fáìlì yìí ([[Special:FileDuplicateSearch/$2|ẹ̀kúnrẹ́rẹ́]]):",
index 8e0f4b3..0b3b932 100644 (file)
        "confirm-rollback-button": "好",
        "confirm-rollback-bottom": "呢個動作會立即反轉晒揀咗嘅修改。",
        "confirm-mcrundo-title": "還原一個改動",
+       "semicolon-separator": ";",
        "comma-separator": "、",
        "word-separator": "",
        "parentheses": "($1)",
index c88a1a0..44ce9a5 100644 (file)
@@ -358,7 +358,7 @@ abstract class Maintenance {
                        wfDeprecated( __METHOD__ . ' without an $argId', '1.33' );
                }
 
-               return $this->hasArg( $argId ) ? $this->mArgs[$argId] : $default;
+               return $this->mArgs[$argId] ?? $default;
        }
 
        /**
index 316004b..e7df448 100644 (file)
@@ -52,19 +52,15 @@ class ChangePassword extends Maintenance {
                        $this->fatalError( "No such user: " . $this->getOption( 'user' ) );
                }
                $password = $this->getOption( 'password' );
-               try {
-                       $status = $user->changeAuthenticationData( [
-                               'username' => $user->getName(),
-                               'password' => $password,
-                               'retype' => $password,
-                       ] );
-                       if ( !$status->isGood() ) {
-                               throw new PasswordError( $status->getWikiText( null, null, 'en' ) );
-                       }
-                       $user->saveSettings();
+               $status = $user->changeAuthenticationData( [
+                       'username' => $user->getName(),
+                       'password' => $password,
+                       'retype' => $password,
+               ] );
+               if ( $status->isGood() ) {
                        $this->output( "Password set for " . $user->getName() . "\n" );
-               } catch ( PasswordError $pwe ) {
-                       $this->fatalError( $pwe->getText() );
+               } else {
+                       $this->fatalError( $status->getWikiText( null, null, 'en' ) );
                }
        }
 }
diff --git a/maintenance/checkDependencies.php b/maintenance/checkDependencies.php
new file mode 100644 (file)
index 0000000..3e8b754
--- /dev/null
@@ -0,0 +1,202 @@
+<?php
+/**
+ * (C) 2019 Kunal Mehta <legoktm@member.fsf.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Checks dependencies for extensions, mostly without loading them
+ *
+ * @since 1.34
+ */
+class CheckDependencies extends Maintenance {
+
+       private $checkDev;
+
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription( 'Check dependencies for extensions' );
+               $this->addOption( 'extensions', 'Comma separated list of extensions to check', false, true );
+               $this->addOption( 'skins', 'Comma separated list of skins to check', false, true );
+               $this->addOption( 'json', 'Output in JSON' );
+               $this->addOption( 'dev', 'Check development dependencies too' );
+       }
+
+       public function execute() {
+               $this->checkDev = $this->hasOption( 'dev' );
+               $extensions = $this->hasOption( 'extensions' )
+                       ? explode( ',', $this->getOption( 'extensions' ) )
+                       : [];
+               $skins = $this->hasOption( 'skins' )
+                       ? explode( ',', $this->getOption( 'skins' ) )
+                       : [];
+
+               $dependencies = [];
+               // Note that we can only use the main registry if we are
+               // not checking development dependencies.
+               $registry = ExtensionRegistry::getInstance();
+               foreach ( $extensions as $extension ) {
+                       if ( !$this->checkDev && $registry->isLoaded( $extension ) ) {
+                               // If it's already loaded, we know all the dependencies resolved.
+                               $this->addToDependencies( $dependencies, [ $extension ], [] );
+                               continue;
+                       }
+                       $this->loadThing( $dependencies, $extension, [ $extension ], [] );
+               }
+
+               foreach ( $skins as $skin ) {
+                       if ( !$this->checkDev && $registry->isLoaded( $skin ) ) {
+                               // If it's already loaded, we know all the dependencies resolved.
+                               $this->addToDependencies( $dependencies, [], [ $skin ] );
+                               continue;
+                       }
+                       $this->loadThing( $dependencies, $skin, [], [ $skin ] );
+               }
+
+               if ( $this->hasOption( 'json' ) ) {
+                       $this->output( json_encode( $dependencies ) . "\n" );
+               } else {
+                       $this->output( $this->formatForHumans( $dependencies ) . "\n" );
+               }
+       }
+
+       private function loadThing( &$dependencies, $name, $extensions, $skins ) {
+               global $wgExtensionDirectory, $wgStyleDirectory;
+               $queue = [];
+               $missing = false;
+               foreach ( $extensions as $extension ) {
+                       $path = "$wgExtensionDirectory/$extension/extension.json";
+                       if ( file_exists( $path ) ) {
+                               // 1 is ignored
+                               $queue[$path] = 1;
+                               $this->addToDependencies( $dependencies, [ $extension ], [], $name );
+                       } else {
+                               $missing = true;
+                               $this->addToDependencies( $dependencies, [ $extension ], [], $name, 'missing' );
+                       }
+               }
+
+               foreach ( $skins as $skin ) {
+                       $path = "$wgStyleDirectory/$skin/skin.json";
+                       if ( file_exists( $path ) ) {
+                               $queue[$path] = 1;
+                               $this->addToDependencies( $dependencies, [], [ $skin ], $name );
+                       } else {
+                               $missing = true;
+                               $this->addToDependencies( $dependencies, [], [ $skin ], $name, 'missing' );
+                       }
+               }
+
+               if ( $missing ) {
+                       // Stuff is missing, give up
+                       return;
+               }
+
+               $registry = new ExtensionRegistry();
+               $registry->setCheckDevRequires( $this->checkDev );
+               try {
+                       $registry->readFromQueue( $queue );
+               } catch ( ExtensionDependencyError $e ) {
+                       $reason = false;
+                       if ( $e->incompatibleCore ) {
+                               $reason = 'incompatible-core';
+                       } elseif ( $e->incompatibleSkins ) {
+                               $reason = 'incompatible-skins';
+                       } elseif ( $e->incompatibleExtensions ) {
+                               $reason = 'incompatible-extensions';
+                       } elseif ( $e->missingExtensions || $e->missingSkins ) {
+                               // There's an extension missing in the dependency tree,
+                               // so add those to the dependency list and try again
+                               return $this->loadThing(
+                                       $dependencies,
+                                       $name,
+                                       array_merge( $extensions, $e->missingExtensions ),
+                                       array_merge( $skins, $e->missingSkins )
+                               );
+                       } else {
+                               // missing-phpExtension
+                               // missing-ability
+                               // XXX: ???
+                               throw $e;
+                       }
+
+                       $this->addToDependencies( $dependencies, $extensions, $skins, $name, $reason, $e->getMessage() );
+               }
+
+               $this->addToDependencies( $dependencies, $extensions, $skins, $name );
+       }
+
+       private function addToDependencies( &$dependencies, $extensions, $skins,
+               $why = null, $status = null, $message = null
+       ) {
+               $mainRegistry = ExtensionRegistry::getInstance();
+               $iter = [ 'extensions' => $extensions, 'skins' => $skins ];
+               foreach ( $iter as $type => $things ) {
+                       foreach ( $things as $thing ) {
+                               $preStatus = $dependencies[$type][$thing]['status'] ?? false;
+                               if ( $preStatus !== 'loaded' ) {
+                                       // OK to overwrite
+                                       if ( $status ) {
+                                               $tStatus = $status;
+                                       } else {
+                                               $tStatus = $mainRegistry->isLoaded( $thing ) ? 'loaded' : 'present';
+                                       }
+                                       $dependencies[$type][$thing]['status'] = $tStatus;
+                               }
+                               if ( $why !== null ) {
+                                       $dependencies[$type][$thing]['why'][] = $why;
+                                       // XXX: this is a bit messy
+                                       $dependencies[$type][$thing]['why'] = array_unique(
+                                               $dependencies[$type][$thing]['why'] );
+                               }
+
+                               if ( $message !== null ) {
+                                       $dependencies[$type][$thing]['message'] = trim( $message );
+                               }
+
+                       }
+               }
+       }
+
+       private function formatForHumans( $dependencies ) {
+               $text = '';
+               foreach ( $dependencies as $type => $things ) {
+                       $text .= ucfirst( $type ) . "\n" . str_repeat( '=', strlen( $type ) ) . "\n";
+                       foreach ( $things as $thing => $info ) {
+                               $why = $info['why'] ?? [];
+                               if ( $why ) {
+                                       $whyText = '(because: ' . implode( ',', $why ) . ') ';
+                               } else {
+                                       $whyText = '';
+                               }
+                               $msg = isset( $info['message'] ) ? ", {$info['message']}" : '';
+
+                               $text .= "$thing: {$info['status']}{$msg} $whyText\n";
+                       }
+                       $text .= "\n";
+               }
+
+               return trim( $text );
+       }
+}
+
+$maintClass = CheckDependencies::class;
+require_once RUN_MAINTENANCE_IF_MAIN;
index 94ae95d..0ee1e6a 100644 (file)
@@ -95,7 +95,17 @@ $maintenance->setAgentAndTriggers();
 $maintenance->validateParamsAndArgs();
 
 // Do the work
-$success = $maintenance->execute();
+try {
+       $success = $maintenance->execute();
+} catch ( Exception $ex ) {
+       $success = false;
+       while ( $ex ) {
+               $cls = get_class( $ex );
+               print "$cls from line {$ex->getLine()} of {$ex->getFile()}: {$ex->getMessage()}\n";
+               print $ex->getTraceAsString() . "\n";
+               $ex = $ex->getPrevious();
+       }
+}
 
 // Potentially debug globals
 $maintenance->globals();
index 3fdd057..8fec026 100644 (file)
@@ -31,7 +31,7 @@
     "stylelint-config-wikimedia": "0.5.0",
     "wdio-junit-reporter": "0.2.0",
     "wdio-mediawiki": "file:tests/selenium/wdio-mediawiki",
-    "wdio-mocha-framework": "0.5.13",
+    "wdio-mocha-framework": "0.6.4",
     "wdio-sauce-service": "0.3.1",
     "wdio-spec-reporter": "0.0.5",
     "webdriverio": "4.12.0"
index c239a8f..8786dd3 100644 (file)
        max-width: 15em;
        border-radius: 4px;
        /*
-       -moz-box-shadow: 0px 2px 8px #cccccc;
-       -webkit-box-shadow: 0px 2px 8px #cccccc;
-       box-shadow: 0px 2px 8px #cccccc;
-       -ms-filter: "progid:DXImageTransform.Microsoft.DropShadow(OffX=0, OffY=2, Strength=6, Direction=90, Color='#cccccc')";
-       filter: progid:DXImageTransform.Microsoft.DropShadow(OffX=0, OffY=2, Strength=6, Direction=90, Color='#cccccc');
-       */
+        * -moz-box-shadow: 0px 2px 8px #cccccc;
+        * -webkit-box-shadow: 0px 2px 8px #cccccc;
+        * box-shadow: 0px 2px 8px #cccccc;
+        * -ms-filter: "progid:DXImageTransform.Microsoft.DropShadow(OffX=0, OffY=2, Strength=6, Direction=90, Color='#cccccc')";
+        * filter: progid:DXImageTransform.Microsoft.DropShadow(OffX=0, OffY=2, Strength=6, Direction=90, Color='#cccccc');
+        */
 }
 
 .tipsy-arrow {
index 0f922c9..fd6f38c 100644 (file)
@@ -29,9 +29,9 @@
        ul.mw-collapsible:before,
        .mw-collapsible-toggle-li {
                /*
-               Rather than inherit any margins from the general li selector - make sure this is explicit
-               to avoid reflows
-               */
+                * Rather than inherit any margins from the general li selector - make sure this is explicit
+                * to avoid reflows
+                */
                display: list-item;
                list-style: none;
                margin-bottom: 0.1em;
@@ -92,7 +92,7 @@
        float: right;
 }
 
-/* For collapsible elements in the content area, override the alginment based on the content language.  */
+/* For collapsible elements in the content area, override the alginment based on the content language. */
 /* @noflip */
 .mw-content-ltr,
 .mw-content-rtl .mw-content-ltr {
index 9e6ecc8..f58d733 100644 (file)
 
                /**
                 * @param {Object} context
-               */
+                */
                special: function ( context ) {
                        // Allow custom rendering - but otherwise don't do any rendering
                        if ( typeof context.config.special.render === 'function' ) {
                                                }
                                                $.suggestions.hide( context );
                                                $.suggestions.cancel( context );
-                                       } )
-                                       // Simulate a keypress on load. This loads the search suggestions when there are already
-                                       // typed characters before the JavaScript is loaded.
-                                       .trigger( 'keypress' );
+                                       } );
+                               // Load suggestions if the value is changed because there are already
+                               // typed characters before the JavaScript is loaded.
+                               if ( this.value !== this.defaultValue ) {
+                                       $.suggestions.update( context, false );
+                               }
                        }
 
                        // Store the context for next time
index e58e677..cc206b7 100644 (file)
@@ -267,7 +267,7 @@ div.thumbinner {
        color: #666;
        text-align: center;
        /* new block formatting context,
-        * to clear background from floating content  */
+        * to clear background from floating content */
        overflow: hidden;
        min-width: 100px;
 }
index 4d67cae..a4a4dee 100644 (file)
@@ -93,7 +93,7 @@ div.thumbinner {
        font-size: 94%;
        text-align: center;
        /* new block formatting context,
-        * to clear background from floating content  */
+        * to clear background from floating content */
        overflow: hidden;
 }
 
index 054bc27..13012b0 100644 (file)
@@ -79,10 +79,10 @@ table.toc td {
 .toctext {
        display: table-cell;
        /*
-       Text decorations are not propagated to the contents of inline blocks and inline tables,
-       according to <https://www.w3.org/TR/css-text-decor-3/#line-decoration>, and 'display: table-cell'
-       generates an inline table when used without any parent table-rows and tables.
-       */
+        * Text decorations are not propagated to the contents of inline blocks and inline tables,
+        * according to <https://www.w3.org/TR/css-text-decor-3/#line-decoration>, and 'display: table-cell'
+        * generates an inline table when used without any parent table-rows and tables.
+        */
        text-decoration: inherit;
 }
 
@@ -138,7 +138,7 @@ div.thumbinner {
        font-size: 94%;
        text-align: center;
        /* new block formatting context,
-        * to clear background from floating content  */
+        * to clear background from floating content */
        overflow: hidden;
 }
 
index 631a5c6..395fb8b 100644 (file)
        };
 
        /**
-       * Interface to ApiSandbox UI
-       *
-       * @class mw.special.ApiSandbox
-       */
+        * Interface to ApiSandbox UI
+        *
+        * @class mw.special.ApiSandbox
+        */
        ApiSandbox = {
                /**
                 * Initialize the UI
index c84ac44..486b16d 100644 (file)
@@ -1130,21 +1130,6 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                $this->setMwGlobals( 'wgGroupPermissions', $newPermissions );
        }
 
-       /**
-        * Overrides specific user permissions until services are reloaded
-        *
-        * @param User $user
-        * @param string[]|string $permissions
-        *
-        * @throws Exception
-        */
-       public function overrideUserPermissions( $user, $permissions = [] ) {
-               MediaWikiServices::getInstance()->getPermissionManager()->overrideUserRightsForTesting(
-                       $user,
-                       $permissions
-               );
-       }
-
        /**
         * Sets the logger for a specified channel, for the duration of the test.
         * @since 1.27
index d3523c3..fe32507 100644 (file)
@@ -4,7 +4,6 @@
  * @group Database
  */
 class LinkerTest extends MediaWikiLangTestCase {
-
        /**
         * @dataProvider provideCasesForUserLink
         * @covers Linker::userLink
@@ -15,11 +14,11 @@ class LinkerTest extends MediaWikiLangTestCase {
                ] );
 
                // We'd also test the warning, but injecting a mock logger into a static method is tricky.
-               if ( $userName === '' ) {
+               if ( !$userName ) {
                        Wikimedia\suppressWarnings();
                }
                $actual = Linker::userLink( $userId, $userName, $altUserName );
-               if ( $userName === '' ) {
+               if ( !$userName ) {
                        Wikimedia\restoreWarnings();
                }
 
@@ -38,6 +37,9 @@ class LinkerTest extends MediaWikiLangTestCase {
                        'Empty username, userid 0' => [ '(no username available)', 0, '' ],
                        'Empty username, userid > 0' => [ '(no username available)', 73, '' ],
 
+                       'false instead of username' => [ '(no username available)', 73, false ],
+                       'null instead of username' => [ '(no username available)', 0, null ],
+
                        # ## ANONYMOUS USER ########################################
                        [
                                '<a href="/wiki/Special:Contributions/JohnDoe" '
@@ -279,7 +281,7 @@ class LinkerTest extends MediaWikiLangTestCase {
                                "/* [[linkie?]] */",
                        ],
                        [
-                               '<span dir="auto"><span class="autocomment"><a href="/wiki/Special:BlankPage" title="Special:BlankPage">→‎</a>: </span> // Edit via via</span>',
+                               '<span dir="auto"><span class="autocomment">: </span> // Edit via via</span>',
                                // Regression test for T222857
                                "/*  */ // Edit via via",
                        ],
@@ -321,6 +323,36 @@ class LinkerTest extends MediaWikiLangTestCase {
                                "/* autocomment */",
                                null
                        ],
+                       [
+                               '',
+                               "/* */",
+                               false, true
+                       ],
+                       [
+                               '',
+                               "/* */",
+                               null
+                       ],
+                       [
+                               '<span dir="auto"><span class="autocomment">[[</span></span>',
+                               "/* [[ */",
+                               false, true
+                       ],
+                       [
+                               '<span dir="auto"><span class="autocomment">[[</span></span>',
+                               "/* [[ */",
+                               null
+                       ],
+                       [
+                               "foo <span dir=\"auto\"><span class=\"autocomment\"><a href=\"#.23\">→‎&#91;[#_\t_]]</a></span></span>",
+                               "foo /* [[#_\t_]] */",
+                               false, true
+                       ],
+                       [
+                               "foo <span dir=\"auto\"><span class=\"autocomment\"><a href=\"#_.09\">#_\t_</a></span></span>",
+                               "foo /* [[#_\t_]] */",
+                               null
+                       ],
                        [
                                '<span dir="auto"><span class="autocomment"><a href="/wiki/Special:BlankPage#autocomment" title="Special:BlankPage">→‎autocomment</a></span></span>',
                                "/* autocomment */",
@@ -414,14 +446,15 @@ class LinkerTest extends MediaWikiLangTestCase {
         * @covers Linker::generateRollback
         * @dataProvider provideCasesForRollbackGeneration
         */
-       public function testGenerateRollback( $rollbackEnabled, $expectedModules ) {
+       public function testGenerateRollback( $rollbackEnabled, $expectedModules, $title ) {
                $this->markTestSkippedIfDbType( 'postgres' );
 
                $context = RequestContext::getMain();
                $user = $context->getUser();
                $user->setOption( 'showrollbackconfirmation', $rollbackEnabled );
 
-               $pageData = $this->insertPage( 'Rollback_Test_Page' );
+               $this->assertEquals( 0, Title::newFromText( $title )->getArticleID() );
+               $pageData = $this->insertPage( $title );
                $page = WikiPage::factory( $pageData['title'] );
 
                $updater = $page->newPageUpdater( $user );
@@ -433,8 +466,24 @@ class LinkerTest extends MediaWikiLangTestCase {
 
                $rollbackOutput = Linker::generateRollback( $page->getRevision(), $context );
                $modules = $context->getOutput()->getModules();
+               $currentRev = $page->getRevision();
+               $oldestRev = $page->getOldestRevision();
 
                $this->assertEquals( $expectedModules, $modules );
+               $this->assertEquals( $user->getName(), $currentRev->getUserText() );
+               $this->assertEquals(
+                       static::getTestSysop()->getUser(),
+                       $oldestRev->getUserText()
+               );
+
+               $ids = [];
+               $r = $oldestRev;
+               while ( $r ) {
+                       $ids[] = $r->getId();
+                       $r = $r->getNext();
+               }
+               $this->assertEquals( [ $oldestRev->getId(), $currentRev->getId() ], $ids );
+
                $this->assertContains( 'rollback 1 edit', $rollbackOutput );
        }
 
@@ -442,12 +491,13 @@ class LinkerTest extends MediaWikiLangTestCase {
                return [
                        [
                                true,
-                               [ 'mediawiki.page.rollback.confirmation' ]
-
+                               [ 'mediawiki.page.rollback.confirmation' ],
+                               'Rollback_Test_Page'
                        ],
                        [
                                false,
-                               []
+                               [],
+                               'Rollback_Test_Page2'
                        ]
                ];
        }
index ebd9f1d..1272b01 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\TestingAccessWrapper;
 
 /**
@@ -2662,7 +2663,8 @@ class OutputPageTest extends MediaWikiTestCase {
                $method = $class->getMethod( 'makeResourceLoaderLink' );
                $method->setAccessible( true );
                $ctx = new RequestContext();
-               $ctx->setSkin( SkinFactory::getDefaultInstance()->makeSkin( 'fallback' ) );
+               $skinFactory = MediaWikiServices::getInstance()->getSkinFactory();
+               $ctx->setSkin( $skinFactory->makeSkin( 'fallback' ) );
                $ctx->setLanguage( 'en' );
                $out = new OutputPage( $ctx );
                $nonce = $class->getProperty( 'CSPNonce' );
@@ -2775,7 +2777,8 @@ class OutputPageTest extends MediaWikiTestCase {
 
                // Set up stubs
                $ctx = new RequestContext();
-               $ctx->setSkin( SkinFactory::getDefaultInstance()->makeSkin( 'fallback' ) );
+               $skinFactory = MediaWikiServices::getInstance()->getSkinFactory();
+               $ctx->setSkin( $skinFactory->makeSkin( 'fallback' ) );
                $ctx->setLanguage( 'en' );
                $op = $this->getMockBuilder( OutputPage::class )
                        ->setConstructorArgs( [ $ctx ] )
index 138f8d0..2ce50b7 100644 (file)
@@ -3,12 +3,8 @@
 namespace MediaWiki\Tests\Permissions;
 
 use Action;
-use FauxRequest;
-use MediaWiki\Session\SessionId;
-use MediaWiki\Session\TestUtils;
 use MediaWikiLangTestCase;
 use RequestContext;
-use stdClass;
 use Title;
 use User;
 use MediaWiki\Block\DatabaseBlock;
@@ -17,7 +13,6 @@ use MediaWiki\Block\Restriction\PageRestriction;
 use MediaWiki\Block\SystemBlock;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Permissions\PermissionManager;
-use Wikimedia\TestingAccessWrapper;
 
 /**
  * @group Database
@@ -61,32 +56,7 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                        'wgNamespaceProtection' => [
                                NS_MEDIAWIKI => 'editinterface',
                        ],
-                       'wgRevokePermissions' => [
-                               'formertesters' => [
-                                       'runtest' => true
-                               ]
-                       ],
-                       'wgAvailableRights' => [
-                               'test',
-                               'runtest',
-                               'writetest',
-                               'nukeworld',
-                               'modifytest',
-                               'editmyoptions'
-                       ]
                ] );
-
-               $this->setGroupPermissions( 'unittesters', 'test', true );
-               $this->setGroupPermissions( 'unittesters', 'runtest', true );
-               $this->setGroupPermissions( 'unittesters', 'writetest', false );
-               $this->setGroupPermissions( 'unittesters', 'nukeworld', false );
-
-               $this->setGroupPermissions( 'testwriters', 'test', true );
-               $this->setGroupPermissions( 'testwriters', 'writetest', true );
-               $this->setGroupPermissions( 'testwriters', 'modifytest', true );
-
-               $this->setGroupPermissions( '*', 'editmyoptions', true );
-
                // Without this testUserBlock will use a non-English context on non-English MediaWiki
                // installations (because of how Title::checkUserBlock is implemented) and fail.
                RequestContext::resetMain();
@@ -119,12 +89,19 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                        $this->user = $this->userUser;
                }
 
+               $this->permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+
                $this->overrideMwServices();
        }
 
-       public function tearDown() {
-               parent::tearDown();
-               $this->restoreMwServices();
+       protected function setUserPerm( $perm ) {
+               // Setting member variables is evil!!!
+
+               if ( is_array( $perm ) ) {
+                       $this->user->mRights = $perm;
+               } else {
+                       $this->user->mRights = [ $perm ];
+               }
        }
 
        protected function setTitle( $ns, $title = "Main_Page" ) {
@@ -139,7 +116,6 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                } else {
                        $this->user = $this->altUser;
                }
-               $this->overrideMwServices();
        }
 
        /**
@@ -157,165 +133,163 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
 
                $this->setUser( 'anon' );
                $this->setTitle( NS_TALK );
-               $this->overrideUserPermissions( $this->user, "createtalk" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "createtalk" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'create', $this->user, $this->title );
                $this->assertEquals( [], $res );
 
                $this->setTitle( NS_TALK );
-               $this->overrideUserPermissions( $this->user, "createpage" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "createpage" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'create', $this->user, $this->title );
                $this->assertEquals( [ [ "nocreatetext" ] ], $res );
 
                $this->setTitle( NS_TALK );
-               $this->overrideUserPermissions( $this->user, "" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'create', $this->user, $this->title );
                $this->assertEquals( [ [ 'nocreatetext' ] ], $res );
 
                $this->setTitle( NS_MAIN );
-               $this->overrideUserPermissions( $this->user, "createpage" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "createpage" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'create', $this->user, $this->title );
                $this->assertEquals( [], $res );
 
                $this->setTitle( NS_MAIN );
-               $this->overrideUserPermissions( $this->user, "createtalk" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "createtalk" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'create', $this->user, $this->title );
                $this->assertEquals( [ [ 'nocreatetext' ] ], $res );
 
                $this->setUser( $this->userName );
                $this->setTitle( NS_TALK );
-               $this->overrideUserPermissions( $this->user, "createtalk" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "createtalk" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'create', $this->user, $this->title );
                $this->assertEquals( [], $res );
 
                $this->setTitle( NS_TALK );
-               $this->overrideUserPermissions( $this->user, "createpage" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "createpage" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'create', $this->user, $this->title );
                $this->assertEquals( [ [ 'nocreate-loggedin' ] ], $res );
 
                $this->setTitle( NS_TALK );
-               $this->overrideUserPermissions( $this->user, "" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'create', $this->user, $this->title );
                $this->assertEquals( [ [ 'nocreate-loggedin' ] ], $res );
 
                $this->setTitle( NS_MAIN );
-               $this->overrideUserPermissions( $this->user, "createpage" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "createpage" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'create', $this->user, $this->title );
                $this->assertEquals( [], $res );
 
                $this->setTitle( NS_MAIN );
-               $this->overrideUserPermissions( $this->user, "createtalk" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "createtalk" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'create', $this->user, $this->title );
                $this->assertEquals( [ [ 'nocreate-loggedin' ] ], $res );
 
                $this->setTitle( NS_MAIN );
-               $this->overrideUserPermissions( $this->user, "" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'create', $this->user, $this->title );
                $this->assertEquals( [ [ 'nocreate-loggedin' ] ], $res );
 
                $this->setUser( 'anon' );
                $this->setTitle( NS_USER, $this->userName . '' );
-               $this->overrideUserPermissions( $this->user, "" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'move', $this->user, $this->title );
                $this->assertEquals( [ [ 'cant-move-user-page' ], [ 'movenologintext' ] ], $res );
 
                $this->setTitle( NS_USER, $this->userName . '/subpage' );
-               $this->overrideUserPermissions( $this->user, "" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'move', $this->user, $this->title );
                $this->assertEquals( [ [ 'movenologintext' ] ], $res );
 
                $this->setTitle( NS_USER, $this->userName . '' );
-               $this->overrideUserPermissions( $this->user, "move-rootuserpages" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "move-rootuserpages" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'move', $this->user, $this->title );
                $this->assertEquals( [ [ 'movenologintext' ] ], $res );
 
                $this->setTitle( NS_USER, $this->userName . '/subpage' );
-               $this->overrideUserPermissions( $this->user, "move-rootuserpages" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "move-rootuserpages" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'move', $this->user, $this->title );
                $this->assertEquals( [ [ 'movenologintext' ] ], $res );
 
                $this->setTitle( NS_USER, $this->userName . '' );
-               $this->overrideUserPermissions( $this->user, "" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'move', $this->user, $this->title );
                $this->assertEquals( [ [ 'cant-move-user-page' ], [ 'movenologintext' ] ], $res );
 
                $this->setTitle( NS_USER, $this->userName . '/subpage' );
-               $this->overrideUserPermissions( $this->user, "" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'move', $this->user, $this->title );
                $this->assertEquals( [ [ 'movenologintext' ] ], $res );
 
                $this->setTitle( NS_USER, $this->userName . '' );
-               $this->overrideUserPermissions( $this->user, "move-rootuserpages" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "move-rootuserpages" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'move', $this->user, $this->title );
                $this->assertEquals( [ [ 'movenologintext' ] ], $res );
 
                $this->setTitle( NS_USER, $this->userName . '/subpage' );
-               $this->overrideUserPermissions( $this->user, "move-rootuserpages" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "move-rootuserpages" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'move', $this->user, $this->title );
                $this->assertEquals( [ [ 'movenologintext' ] ], $res );
 
                $this->setUser( $this->userName );
                $this->setTitle( NS_FILE, "img.png" );
-               $this->overrideUserPermissions( $this->user, "" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'move', $this->user, $this->title );
                $this->assertEquals( [ [ 'movenotallowedfile' ], [ 'movenotallowed' ] ], $res );
 
                $this->setTitle( NS_FILE, "img.png" );
-               $this->overrideUserPermissions( $this->user, "movefile" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "movefile" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'move', $this->user, $this->title );
                $this->assertEquals( [ [ 'movenotallowed' ] ], $res );
 
                $this->setUser( 'anon' );
                $this->setTitle( NS_FILE, "img.png" );
-               $this->overrideUserPermissions( $this->user, "" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'move', $this->user, $this->title );
                $this->assertEquals( [ [ 'movenotallowedfile' ], [ 'movenologintext' ] ], $res );
 
                $this->setTitle( NS_FILE, "img.png" );
-               $this->overrideUserPermissions( $this->user, "movefile" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "movefile" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'move', $this->user, $this->title );
                $this->assertEquals( [ [ 'movenologintext' ] ], $res );
 
                $this->setUser( $this->userName );
-               // $this->setUserPerm( "move" );
-               $this->runGroupPermissions( 'move', 'move', [ [ 'movenotallowedfile' ] ] );
+               $this->setUserPerm( "move" );
+               $this->runGroupPermissions( 'move', [ [ 'movenotallowedfile' ] ] );
 
-               // $this->setUserPerm( "" );
+               $this->setUserPerm( "" );
                $this->runGroupPermissions(
-                       '',
                        'move',
                        [ [ 'movenotallowedfile' ], [ 'movenotallowed' ] ]
                );
 
                $this->setUser( 'anon' );
-               //$this->setUserPerm( "move" );
-               $this->runGroupPermissions( 'move', 'move', [ [ 'movenotallowedfile' ] ] );
+               $this->setUserPerm( "move" );
+               $this->runGroupPermissions( 'move', [ [ 'movenotallowedfile' ] ] );
 
-               // $this->setUserPerm( "" );
+               $this->setUserPerm( "" );
                $this->runGroupPermissions(
-                       '',
                        'move',
                        [ [ 'movenotallowedfile' ], [ 'movenotallowed' ] ],
                        [ [ 'movenotallowedfile' ], [ 'movenologintext' ] ]
@@ -327,58 +301,58 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
 
                        $this->setTitle( NS_MAIN );
                        $this->setUser( 'anon' );
-                       // $this->setUserPerm( "move" );
-                       $this->runGroupPermissions( 'move', 'move', [] );
+                       $this->setUserPerm( "move" );
+                       $this->runGroupPermissions( 'move', [] );
 
-                       // $this->setUserPerm( "" );
-                       $this->runGroupPermissions( '', 'move', [ [ 'movenotallowed' ] ],
+                       $this->setUserPerm( "" );
+                       $this->runGroupPermissions( 'move', [ [ 'movenotallowed' ] ],
                                [ [ 'movenologintext' ] ] );
 
                        $this->setUser( $this->userName );
-                       // $this->setUserPerm( "" );
-                       $this->runGroupPermissions( '', 'move', [ [ 'movenotallowed' ] ] );
+                       $this->setUserPerm( "" );
+                       $this->runGroupPermissions( 'move', [ [ 'movenotallowed' ] ] );
 
-                       //$this->setUserPerm( "move" );
-                       $this->runGroupPermissions( 'move', 'move', [] );
+                       $this->setUserPerm( "move" );
+                       $this->runGroupPermissions( 'move', [] );
 
                        $this->setUser( 'anon' );
-                       $this->overrideUserPermissions( $this->user, 'move' );
-                       $res = MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->setUserPerm( 'move' );
+                       $res = $this->permissionManager
                                ->getPermissionErrors( 'move-target', $this->user, $this->title );
                        $this->assertEquals( [], $res );
 
-                       $this->overrideUserPermissions( $this->user, '' );
-                       $res = MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->setUserPerm( '' );
+                       $res = $this->permissionManager
                                ->getPermissionErrors( 'move-target', $this->user, $this->title );
                        $this->assertEquals( [ [ 'movenotallowed' ] ], $res );
                }
 
                $this->setTitle( NS_USER );
                $this->setUser( $this->userName );
-               $this->overrideUserPermissions( $this->user, [ "move", "move-rootuserpages" ] );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( [ "move", "move-rootuserpages" ] );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'move-target', $this->user, $this->title );
                $this->assertEquals( [], $res );
 
-               $this->overrideUserPermissions( $this->user, "move" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "move" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'move-target', $this->user, $this->title );
                $this->assertEquals( [ [ 'cant-move-to-user-page' ] ], $res );
 
                $this->setUser( 'anon' );
-               $this->overrideUserPermissions( $this->user, [ "move", "move-rootuserpages" ] );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( [ "move", "move-rootuserpages" ] );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'move-target', $this->user, $this->title );
                $this->assertEquals( [], $res );
 
                $this->setTitle( NS_USER, "User/subpage" );
-               $this->overrideUserPermissions( $this->user, [ "move", "move-rootuserpages" ] );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( [ "move", "move-rootuserpages" ] );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'move-target', $this->user, $this->title );
                $this->assertEquals( [], $res );
 
-               $this->overrideUserPermissions( $this->user, "move" );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( "move" );
+               $res = $this->permissionManager
                        ->getPermissionErrors( 'move-target', $this->user, $this->title );
                $this->assertEquals( [], $res );
 
@@ -404,58 +378,54 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                ];
 
                foreach ( [ "edit", "protect", "" ] as $action ) {
-                       $this->overrideUserPermissions( $this->user );
+                       $this->setUserPerm( null );
                        $this->assertEquals( $check[$action][0],
-                               MediaWikiServices::getInstance()->getPermissionManager()
+                               $this->permissionManager
                                        ->getPermissionErrors( $action, $this->user, $this->title, true ) );
                        $this->assertEquals( $check[$action][0],
-                               MediaWikiServices::getInstance()->getPermissionManager()
+                               $this->permissionManager
                                        ->getPermissionErrors( $action, $this->user, $this->title, 'full' ) );
                        $this->assertEquals( $check[$action][0],
-                               MediaWikiServices::getInstance()->getPermissionManager()
+                               $this->permissionManager
                                        ->getPermissionErrors( $action, $this->user, $this->title, 'secure' ) );
 
                        global $wgGroupPermissions;
                        $old = $wgGroupPermissions;
                        $wgGroupPermissions = [];
-                       $this->overrideMwServices();
 
                        $this->assertEquals( $check[$action][1],
-                               MediaWikiServices::getInstance()->getPermissionManager()
+                               $this->permissionManager
                                        ->getPermissionErrors( $action, $this->user, $this->title, true ) );
                        $this->assertEquals( $check[$action][1],
-                               MediaWikiServices::getInstance()->getPermissionManager()
+                               $this->permissionManager
                                        ->getPermissionErrors( $action, $this->user, $this->title, 'full' ) );
                        $this->assertEquals( $check[$action][1],
-                               MediaWikiServices::getInstance()->getPermissionManager()
+                               $this->permissionManager
                                        ->getPermissionErrors( $action, $this->user, $this->title, 'secure' ) );
                        $wgGroupPermissions = $old;
-                       $this->overrideMwServices();
 
-                       $this->overrideUserPermissions( $this->user, $action );
+                       $this->setUserPerm( $action );
                        $this->assertEquals( $check[$action][2],
-                               MediaWikiServices::getInstance()->getPermissionManager()
+                               $this->permissionManager
                                        ->getPermissionErrors( $action, $this->user, $this->title, true ) );
                        $this->assertEquals( $check[$action][2],
-                               MediaWikiServices::getInstance()->getPermissionManager()
+                               $this->permissionManager
                                        ->getPermissionErrors( $action, $this->user, $this->title, 'full' ) );
                        $this->assertEquals( $check[$action][2],
-                               MediaWikiServices::getInstance()->getPermissionManager()
+                               $this->permissionManager
                                        ->getPermissionErrors( $action, $this->user, $this->title, 'secure' ) );
 
-                       $this->overrideUserPermissions( $this->user, $action );
+                       $this->setUserPerm( $action );
                        $this->assertEquals( $check[$action][3],
-                               MediaWikiServices::getInstance()->getPermissionManager()
-                                       ->userCan( $action, $this->user, $this->title, true ) );
+                               $this->permissionManager->userCan( $action, $this->user, $this->title, true ) );
                        $this->assertEquals( $check[$action][3],
-                               MediaWikiServices::getInstance()->getPermissionManager()
-                                       ->userCan( $action, $this->user, $this->title,
+                               $this->permissionManager->userCan( $action, $this->user, $this->title,
                                        PermissionManager::RIGOR_QUICK ) );
                        # count( User::getGroupsWithPermissions( $action ) ) < 1
                }
        }
 
-       protected function runGroupPermissions( $perm, $action, $result, $result2 = null ) {
+       protected function runGroupPermissions( $action, $result, $result2 = null ) {
                global $wgGroupPermissions;
 
                if ( $result2 === null ) {
@@ -464,33 +434,25 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
 
                $wgGroupPermissions['autoconfirmed']['move'] = false;
                $wgGroupPermissions['user']['move'] = false;
-               $this->overrideMwServices();
-               $this->overrideUserPermissions( $this->user, $perm );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $res = $this->permissionManager
                        ->getPermissionErrors( $action, $this->user, $this->title );
                $this->assertEquals( $result, $res );
 
                $wgGroupPermissions['autoconfirmed']['move'] = true;
                $wgGroupPermissions['user']['move'] = false;
-               $this->overrideMwServices();
-               $this->overrideUserPermissions( $this->user, $perm );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $res = $this->permissionManager
                        ->getPermissionErrors( $action, $this->user, $this->title );
                $this->assertEquals( $result2, $res );
 
                $wgGroupPermissions['autoconfirmed']['move'] = true;
                $wgGroupPermissions['user']['move'] = true;
-               $this->overrideMwServices();
-               $this->overrideUserPermissions( $this->user, $perm );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $res = $this->permissionManager
                        ->getPermissionErrors( $action, $this->user, $this->title );
                $this->assertEquals( $result2, $res );
 
                $wgGroupPermissions['autoconfirmed']['move'] = false;
                $wgGroupPermissions['user']['move'] = true;
-               $this->overrideMwServices();
-               $this->overrideUserPermissions( $this->user, $perm );
-               $res = MediaWikiServices::getInstance()->getPermissionManager()
+               $res = $this->permissionManager
                        ->getPermissionErrors( $action, $this->user, $this->title );
                $this->assertEquals( $result2, $res );
        }
@@ -507,59 +469,57 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                $this->setTitle( NS_SPECIAL );
 
                $this->assertEquals( [ [ 'badaccess-group0' ], [ 'ns-specialprotected' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'bogus', $this->user, $this->title ) );
 
                $this->setTitle( NS_MAIN );
-               $this->overrideUserPermissions( $this->user, 'bogus' );
+               $this->setUserPerm( 'bogus' );
                $this->assertEquals( [],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'bogus', $this->user, $this->title ) );
 
                $this->setTitle( NS_MAIN );
-               $this->overrideUserPermissions( $this->user, '' );
+               $this->setUserPerm( '' );
                $this->assertEquals( [ [ 'badaccess-group0' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'bogus', $this->user, $this->title ) );
 
                $wgNamespaceProtection[NS_USER] = [ 'bogus' ];
 
                $this->setTitle( NS_USER );
-               $this->overrideUserPermissions( $this->user, '' );
+               $this->setUserPerm( '' );
                $this->assertEquals( [ [ 'badaccess-group0' ],
                        [ 'namespaceprotected', 'User', 'bogus' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'bogus', $this->user, $this->title ) );
 
                $this->setTitle( NS_MEDIAWIKI );
-               $this->overrideUserPermissions( $this->user, 'bogus' );
+               $this->setUserPerm( 'bogus' );
                $this->assertEquals( [ [ 'protectedinterface', 'bogus' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'bogus', $this->user, $this->title ) );
 
                $this->setTitle( NS_MEDIAWIKI );
-               $this->overrideUserPermissions( $this->user, 'bogus' );
+               $this->setUserPerm( 'bogus' );
                $this->assertEquals( [ [ 'protectedinterface', 'bogus' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'bogus', $this->user, $this->title ) );
 
                $wgNamespaceProtection = null;
 
-               $this->overrideUserPermissions( $this->user, 'bogus' );
+               $this->setUserPerm( 'bogus' );
                $this->assertEquals( [],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'bogus', $this->user, $this->title ) );
                $this->assertEquals( true,
-                       MediaWikiServices::getInstance()->getPermissionManager()
-                               ->userCan( 'bogus', $this->user, $this->title ) );
+                       $this->permissionManager->userCan( 'bogus', $this->user, $this->title ) );
 
-               $this->overrideUserPermissions( $this->user, '' );
+               $this->setUserPerm( '' );
                $this->assertEquals( [ [ 'badaccess-group0' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'bogus', $this->user, $this->title ) );
                $this->assertEquals( false,
-                       MediaWikiServices::getInstance()->getPermissionManager()
-                               ->userCan( 'bogus', $this->user, $this->title ) );
+                       $this->permissionManager->userCan( 'bogus', $this->user, $this->title ) );
        }
 
        /**
@@ -756,48 +716,48 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                $resultUserJs,
                $resultPatrol
        ) {
-               $this->overrideUserPermissions( $this->user );
-               $result = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( '' );
+               $result = $this->permissionManager
                        ->getPermissionErrors( 'bogus', $this->user, $this->title );
                $this->assertEquals( $resultNone, $result );
 
-               $this->overrideUserPermissions( $this->user, 'editmyusercss' );
-               $result = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( 'editmyusercss' );
+               $result = $this->permissionManager
                        ->getPermissionErrors( 'bogus', $this->user, $this->title );
                $this->assertEquals( $resultMyCss, $result );
 
-               $this->overrideUserPermissions( $this->user, 'editmyuserjson' );
-               $result = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( 'editmyuserjson' );
+               $result = $this->permissionManager
                        ->getPermissionErrors( 'bogus', $this->user, $this->title );
                $this->assertEquals( $resultMyJson, $result );
 
-               $this->overrideUserPermissions( $this->user, 'editmyuserjs' );
-               $result = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( 'editmyuserjs' );
+               $result = $this->permissionManager
                        ->getPermissionErrors( 'bogus', $this->user, $this->title );
                $this->assertEquals( $resultMyJs, $result );
 
-               $this->overrideUserPermissions( $this->user, 'editusercss' );
-               $result = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( 'editusercss' );
+               $result = $this->permissionManager
                        ->getPermissionErrors( 'bogus', $this->user, $this->title );
                $this->assertEquals( $resultUserCss, $result );
 
-               $this->overrideUserPermissions( $this->user, 'edituserjson' );
-               $result = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( 'edituserjson' );
+               $result = $this->permissionManager
                        ->getPermissionErrors( 'bogus', $this->user, $this->title );
                $this->assertEquals( $resultUserJson, $result );
 
-               $this->overrideUserPermissions( $this->user, 'edituserjs' );
-               $result = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( 'edituserjs' );
+               $result = $this->permissionManager
                        ->getPermissionErrors( 'bogus', $this->user, $this->title );
                $this->assertEquals( $resultUserJs, $result );
 
-               $this->overrideUserPermissions( $this->user );
-               $result = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( '' );
+               $result = $this->permissionManager
                        ->getPermissionErrors( 'patrol', $this->user, $this->title );
                $this->assertEquals( reset( $resultPatrol[0] ), reset( $result[0] ) );
 
-               $this->overrideUserPermissions( $this->user, [ 'edituserjs', 'edituserjson', 'editusercss' ] );
-               $result = MediaWikiServices::getInstance()->getPermissionManager()
+               $this->setUserPerm( [ 'edituserjs', 'edituserjson', 'editusercss' ] );
+               $result = $this->permissionManager
                        ->getPermissionErrors( 'bogus', $this->user, $this->title );
                $this->assertEquals( [ [ 'badaccess-group0' ] ], $result );
        }
@@ -817,16 +777,16 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
 
                $this->setTitle( NS_MAIN );
                $this->title->mRestrictionsLoaded = true;
-               $this->overrideUserPermissions( $this->user, "edit" );
+               $this->setUserPerm( "edit" );
                $this->title->mRestrictions = [ "bogus" => [ 'bogus', "sysop", "protect", "" ] ];
 
                $this->assertEquals( [],
-                       MediaWikiServices::getInstance()->getPermissionManager()
-                               ->getPermissionErrors( 'edit', $this->user, $this->title ) );
+                       $this->permissionManager->getPermissionErrors( 'edit',
+                               $this->user, $this->title ) );
 
                $this->assertEquals( true,
-                       MediaWikiServices::getInstance()->getPermissionManager()
-                               ->userCan( 'edit', $this->user, $this->title, PermissionManager::RIGOR_QUICK ) );
+                       $this->permissionManager->userCan( 'edit', $this->user, $this->title,
+                               PermissionManager::RIGOR_QUICK ) );
 
                $this->title->mRestrictions = [ "edit" => [ 'bogus', "sysop", "protect", "" ],
                        "bogus" => [ 'bogus', "sysop", "protect", "" ] ];
@@ -835,81 +795,81 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                        [ 'protectedpagetext', 'bogus', 'bogus' ],
                        [ 'protectedpagetext', 'editprotected', 'bogus' ],
                        [ 'protectedpagetext', 'protect', 'bogus' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()->getPermissionErrors(
-                               'bogus', $this->user, $this->title ) );
+                       $this->permissionManager->getPermissionErrors( 'bogus',
+                               $this->user, $this->title ) );
                $this->assertEquals( [ [ 'protectedpagetext', 'bogus', 'edit' ],
                        [ 'protectedpagetext', 'editprotected', 'edit' ],
                        [ 'protectedpagetext', 'protect', 'edit' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()->getPermissionErrors(
-                               'edit', $this->user, $this->title ) );
-               $this->overrideUserPermissions( $this->user );
+                       $this->permissionManager->getPermissionErrors( 'edit',
+                               $this->user, $this->title ) );
+               $this->setUserPerm( "" );
                $this->assertEquals( [ [ 'badaccess-group0' ],
                        [ 'protectedpagetext', 'bogus', 'bogus' ],
                        [ 'protectedpagetext', 'editprotected', 'bogus' ],
                        [ 'protectedpagetext', 'protect', 'bogus' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()->getPermissionErrors(
-                               'bogus', $this->user, $this->title ) );
+                       $this->permissionManager->getPermissionErrors( 'bogus',
+                               $this->user, $this->title ) );
                $this->assertEquals( [ [ 'badaccess-groups', "*, [[$prefix:Users|Users]]", 2 ],
                        [ 'protectedpagetext', 'bogus', 'edit' ],
                        [ 'protectedpagetext', 'editprotected', 'edit' ],
                        [ 'protectedpagetext', 'protect', 'edit' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()->getPermissionErrors(
-                               'edit', $this->user, $this->title ) );
-               $this->overrideUserPermissions( $this->user, [ "edit", "editprotected" ] );
+                       $this->permissionManager->getPermissionErrors( 'edit',
+                               $this->user, $this->title ) );
+               $this->setUserPerm( [ "edit", "editprotected" ] );
                $this->assertEquals( [ [ 'badaccess-group0' ],
                        [ 'protectedpagetext', 'bogus', 'bogus' ],
                        [ 'protectedpagetext', 'protect', 'bogus' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()->getPermissionErrors(
-                               'bogus', $this->user, $this->title ) );
+                       $this->permissionManager->getPermissionErrors( 'bogus',
+                               $this->user, $this->title ) );
                $this->assertEquals( [
                        [ 'protectedpagetext', 'bogus', 'edit' ],
                        [ 'protectedpagetext', 'protect', 'edit' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()->getPermissionErrors(
-                               'edit', $this->user, $this->title ) );
+                       $this->permissionManager->getPermissionErrors( 'edit',
+                               $this->user, $this->title ) );
 
                $this->title->mCascadeRestriction = true;
-               $this->overrideUserPermissions( $this->user, "edit" );
+               $this->setUserPerm( "edit" );
 
                $this->assertEquals( false,
-                       MediaWikiServices::getInstance()->getPermissionManager()
-                               ->userCan( 'bogus', $this->user, $this->title, PermissionManager::RIGOR_QUICK ) );
+                       $this->permissionManager->userCan( 'bogus', $this->user, $this->title,
+                               PermissionManager::RIGOR_QUICK ) );
 
                $this->assertEquals( false,
-                       MediaWikiServices::getInstance()->getPermissionManager()->userCan(
-                               'edit', $this->user, $this->title, PermissionManager::RIGOR_QUICK ) );
+                       $this->permissionManager->userCan( 'edit', $this->user, $this->title,
+                               PermissionManager::RIGOR_QUICK ) );
 
                $this->assertEquals( [ [ 'badaccess-group0' ],
                        [ 'protectedpagetext', 'bogus', 'bogus' ],
                        [ 'protectedpagetext', 'editprotected', 'bogus' ],
                        [ 'protectedpagetext', 'protect', 'bogus' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()->getPermissionErrors(
-                               'bogus', $this->user, $this->title ) );
+                       $this->permissionManager->getPermissionErrors( 'bogus',
+                               $this->user, $this->title ) );
                $this->assertEquals( [ [ 'protectedpagetext', 'bogus', 'edit' ],
                        [ 'protectedpagetext', 'editprotected', 'edit' ],
                        [ 'protectedpagetext', 'protect', 'edit' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()->getPermissionErrors(
-                               'edit', $this->user, $this->title ) );
+                       $this->permissionManager->getPermissionErrors( 'edit',
+                               $this->user, $this->title ) );
 
-               $this->overrideUserPermissions( $this->user, [ "edit", "editprotected" ] );
+               $this->setUserPerm( [ "edit", "editprotected" ] );
                $this->assertEquals( false,
-                       MediaWikiServices::getInstance()->getPermissionManager()->userCan(
-                               'bogus', $this->user, $this->title, PermissionManager::RIGOR_QUICK ) );
+                       $this->permissionManager->userCan( 'bogus', $this->user, $this->title,
+                               PermissionManager::RIGOR_QUICK ) );
 
                $this->assertEquals( false,
-                       MediaWikiServices::getInstance()->getPermissionManager()->userCan(
-                               'edit', $this->user, $this->title, PermissionManager::RIGOR_QUICK ) );
+                       $this->permissionManager->userCan( 'edit', $this->user, $this->title,
+                               PermissionManager::RIGOR_QUICK ) );
 
                $this->assertEquals( [ [ 'badaccess-group0' ],
                        [ 'protectedpagetext', 'bogus', 'bogus' ],
                        [ 'protectedpagetext', 'protect', 'bogus' ],
                        [ 'protectedpagetext', 'protect', 'bogus' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()->getPermissionErrors(
-                               'bogus', $this->user, $this->title ) );
+                       $this->permissionManager->getPermissionErrors( 'bogus',
+                               $this->user, $this->title ) );
                $this->assertEquals( [ [ 'protectedpagetext', 'bogus', 'edit' ],
                        [ 'protectedpagetext', 'protect', 'edit' ],
                        [ 'protectedpagetext', 'protect', 'edit' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()->getPermissionErrors(
-                               'edit', $this->user, $this->title ) );
+                       $this->permissionManager->getPermissionErrors( 'edit',
+                               $this->user, $this->title ) );
        }
 
        /**
@@ -917,7 +877,7 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
         */
        public function testCascadingSourcesRestrictions() {
                $this->setTitle( NS_MAIN, "test page" );
-               $this->overrideUserPermissions( $this->user, [ "edit", "bogus" ] );
+               $this->setUserPerm( [ "edit", "bogus" ] );
 
                $this->title->mCascadeSources = [
                        Title::makeTitle( NS_MAIN, "Bogus" ),
@@ -928,21 +888,17 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                ];
 
                $this->assertEquals( false,
-                       MediaWikiServices::getInstance()->getPermissionManager()->userCan(
-                               'bogus', $this->user, $this->title ) );
+                       $this->permissionManager->userCan( 'bogus', $this->user, $this->title ) );
                $this->assertEquals( [
                        [ "cascadeprotected", 2, "* [[:Bogus]]\n* [[:UnBogus]]\n", 'bogus' ],
                        [ "cascadeprotected", 2, "* [[:Bogus]]\n* [[:UnBogus]]\n", 'bogus' ],
                        [ "cascadeprotected", 2, "* [[:Bogus]]\n* [[:UnBogus]]\n", 'bogus' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()->getPermissionErrors(
-                               'bogus', $this->user, $this->title ) );
+                       $this->permissionManager->getPermissionErrors( 'bogus', $this->user, $this->title ) );
 
                $this->assertEquals( true,
-                       MediaWikiServices::getInstance()->getPermissionManager()->userCan(
-                               'edit', $this->user, $this->title ) );
+                       $this->permissionManager->userCan( 'edit', $this->user, $this->title ) );
                $this->assertEquals( [],
-                       MediaWikiServices::getInstance()->getPermissionManager()->getPermissionErrors(
-                               'edit', $this->user, $this->title ) );
+                       $this->permissionManager->getPermissionErrors( 'edit', $this->user, $this->title ) );
        }
 
        /**
@@ -951,7 +907,7 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
         * @covers \MediaWiki\Permissions\PermissionManager::checkActionPermissions
         */
        public function testActionPermissions() {
-               $this->overrideUserPermissions( $this->user, [ "createpage" ] );
+               $this->setUserPerm( [ "createpage" ] );
                $this->setTitle( NS_MAIN, "test page" );
                $this->title->mTitleProtection['permission'] = '';
                $this->title->mTitleProtection['user'] = $this->user->getId();
@@ -960,85 +916,75 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                $this->title->mCascadeRestriction = false;
 
                $this->assertEquals( [ [ 'titleprotected', 'Useruser', 'test' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'create', $this->user, $this->title ) );
                $this->assertEquals( false,
-                       MediaWikiServices::getInstance()->getPermissionManager()->userCan(
-                               'create', $this->user, $this->title ) );
+                       $this->permissionManager->userCan( 'create', $this->user, $this->title ) );
 
                $this->title->mTitleProtection['permission'] = 'editprotected';
-               $this->overrideUserPermissions( $this->user, [ 'createpage', 'protect' ] );
+               $this->setUserPerm( [ 'createpage', 'protect' ] );
                $this->assertEquals( [ [ 'titleprotected', 'Useruser', 'test' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'create', $this->user, $this->title ) );
                $this->assertEquals( false,
-                       MediaWikiServices::getInstance()->getPermissionManager()->userCan(
-                               'create', $this->user, $this->title ) );
+                       $this->permissionManager->userCan( 'create', $this->user, $this->title ) );
 
-               $this->overrideUserPermissions( $this->user, [ 'createpage', 'editprotected' ] );
+               $this->setUserPerm( [ 'createpage', 'editprotected' ] );
                $this->assertEquals( [],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'create', $this->user, $this->title ) );
                $this->assertEquals( true,
-                       MediaWikiServices::getInstance()->getPermissionManager()->userCan(
-                               'create', $this->user, $this->title ) );
+                       $this->permissionManager->userCan( 'create', $this->user, $this->title ) );
 
-               $this->overrideUserPermissions( $this->user, [ 'createpage' ] );
+               $this->setUserPerm( [ 'createpage' ] );
                $this->assertEquals( [ [ 'titleprotected', 'Useruser', 'test' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'create', $this->user, $this->title ) );
                $this->assertEquals( false,
-                       MediaWikiServices::getInstance()->getPermissionManager()->userCan(
-                               'create', $this->user, $this->title ) );
+                       $this->permissionManager->userCan( 'create', $this->user, $this->title ) );
 
                $this->setTitle( NS_MEDIA, "test page" );
-               $this->overrideUserPermissions( $this->user, [ "move" ] );
+               $this->setUserPerm( [ "move" ] );
                $this->assertEquals( false,
-                       MediaWikiServices::getInstance()->getPermissionManager()->userCan(
-                               'move', $this->user, $this->title ) );
+                       $this->permissionManager->userCan( 'move', $this->user, $this->title ) );
                $this->assertEquals( [ [ 'immobile-source-namespace', 'Media' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'move', $this->user, $this->title ) );
 
                $this->setTitle( NS_HELP, "test page" );
                $this->assertEquals( [],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'move', $this->user, $this->title ) );
                $this->assertEquals( true,
-                       MediaWikiServices::getInstance()->getPermissionManager()->userCan(
-                               'move', $this->user, $this->title ) );
+                       $this->permissionManager->userCan( 'move', $this->user, $this->title ) );
 
                $this->title->mInterwiki = "no";
                $this->assertEquals( [ [ 'immobile-source-page' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'move', $this->user, $this->title ) );
                $this->assertEquals( false,
-                       MediaWikiServices::getInstance()->getPermissionManager()->userCan(
-                               'move', $this->user, $this->title ) );
+                       $this->permissionManager->userCan( 'move', $this->user, $this->title ) );
 
                $this->setTitle( NS_MEDIA, "test page" );
                $this->assertEquals( false,
-                       MediaWikiServices::getInstance()->getPermissionManager()->userCan(
-                               'move-target', $this->user, $this->title ) );
+                       $this->permissionManager->userCan( 'move-target', $this->user, $this->title ) );
                $this->assertEquals( [ [ 'immobile-target-namespace', 'Media' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'move-target', $this->user, $this->title ) );
 
                $this->setTitle( NS_HELP, "test page" );
                $this->assertEquals( [],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'move-target', $this->user, $this->title ) );
                $this->assertEquals( true,
-                       MediaWikiServices::getInstance()->getPermissionManager()->userCan(
-                               'move-target', $this->user, $this->title ) );
+                       $this->permissionManager->userCan( 'move-target', $this->user, $this->title ) );
 
                $this->title->mInterwiki = "no";
                $this->assertEquals( [ [ 'immobile-target-page' ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'move-target', $this->user, $this->title ) );
                $this->assertEquals( false,
-                       MediaWikiServices::getInstance()->getPermissionManager()->userCan(
-                               'move-target', $this->user, $this->title ) );
+                       $this->permissionManager->userCan( 'move-target', $this->user, $this->title ) );
        }
 
        /**
@@ -1051,7 +997,10 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                        'wgBlockDisablesLogin' => false,
                ] );
 
-               $this->overrideUserPermissions( $this->user, [
+               $this->overrideMwServices();
+               $this->permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+
+               $this->setUserPerm( [
                        'createpage',
                        'edit',
                        'move',
@@ -1064,32 +1013,24 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
 
                # $wgEmailConfirmToEdit only applies to 'edit' action
                $this->assertEquals( [],
-                       MediaWikiServices::getInstance()->getPermissionManager()->getPermissionErrors(
-                               'move-target', $this->user, $this->title ) );
+                       $this->permissionManager->getPermissionErrors( 'move-target',
+                               $this->user, $this->title ) );
                $this->assertContains( [ 'confirmedittext' ],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'edit', $this->user, $this->title ) );
 
                $this->setMwGlobals( 'wgEmailConfirmToEdit', false );
                $this->overrideMwServices();
-               $this->overrideUserPermissions( $this->user, [
-                       'createpage',
-                       'edit',
-                       'move',
-                       'rollback',
-                       'patrol',
-                       'upload',
-                       'purge'
-               ] );
+               $this->permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
 
                $this->assertNotContains( [ 'confirmedittext' ],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'edit', $this->user, $this->title ) );
 
                # $wgEmailConfirmToEdit && !$user->isEmailConfirmed() && $action != 'createaccount'
                $this->assertEquals( [],
-                       MediaWikiServices::getInstance()->getPermissionManager()->getPermissionErrors(
-                               'move-target', $this->user, $this->title ) );
+                       $this->permissionManager->getPermissionErrors( 'move-target',
+                               $this->user, $this->title ) );
 
                global $wgLang;
                $prev = time();
@@ -1108,13 +1049,13 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                        '[[User:Useruser|Useruser]]', 'no reason given', '127.0.0.1',
                        'Useruser', null, 'infinite', '127.0.8.1',
                        $wgLang->timeanddate( wfTimestamp( TS_MW, $prev ), true ) ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()->getPermissionErrors(
-                               'move-target', $this->user, $this->title ) );
+                       $this->permissionManager->getPermissionErrors( 'move-target',
+                               $this->user, $this->title ) );
 
-               $this->assertEquals( false, MediaWikiServices::getInstance()->getPermissionManager()
+               $this->assertEquals( false, $this->permissionManager
                        ->userCan( 'move-target', $this->user, $this->title ) );
                // quickUserCan should ignore user blocks
-               $this->assertEquals( true, MediaWikiServices::getInstance()->getPermissionManager()
+               $this->assertEquals( true, $this->permissionManager
                        ->userCan( 'move-target', $this->user, $this->title,
                                PermissionManager::RIGOR_QUICK ) );
 
@@ -1133,7 +1074,7 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                        '[[User:Useruser|Useruser]]', 'no reason given', '127.0.0.1',
                        'Useruser', null, '23:00, 31 December 1969', '127.0.8.1',
                        $wgLang->timeanddate( wfTimestamp( TS_MW, $now ), true ) ] ],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'move-target', $this->user, $this->title ) );
                # $action != 'read' && $action != 'createaccount' && $user->isBlockedFrom( $this )
                #   $user->blockedFor() == ''
@@ -1155,22 +1096,22 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                        $wgLang->timeanddate( wfTimestamp( TS_MW, $now ), true ) ] ];
 
                $this->assertEquals( $errors,
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'edit', $this->user, $this->title ) );
                $this->assertEquals( $errors,
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'move-target', $this->user, $this->title ) );
                $this->assertEquals( $errors,
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'rollback', $this->user, $this->title ) );
                $this->assertEquals( $errors,
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'patrol', $this->user, $this->title ) );
                $this->assertEquals( $errors,
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'upload', $this->user, $this->title ) );
                $this->assertEquals( [],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'purge', $this->user, $this->title ) );
 
                // partial block message test
@@ -1185,22 +1126,22 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                ] );
 
                $this->assertEquals( [],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'edit', $this->user, $this->title ) );
                $this->assertEquals( [],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'move-target', $this->user, $this->title ) );
                $this->assertEquals( [],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'rollback', $this->user, $this->title ) );
                $this->assertEquals( [],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'patrol', $this->user, $this->title ) );
                $this->assertEquals( [],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'upload', $this->user, $this->title ) );
                $this->assertEquals( [],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'purge', $this->user, $this->title ) );
 
                $this->user->mBlock->setRestrictions( [
@@ -1213,22 +1154,22 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                        $wgLang->timeanddate( wfTimestamp( TS_MW, $now ), true ) ] ];
 
                $this->assertEquals( $errors,
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'edit', $this->user, $this->title ) );
                $this->assertEquals( $errors,
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'move-target', $this->user, $this->title ) );
                $this->assertEquals( $errors,
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'rollback', $this->user, $this->title ) );
                $this->assertEquals( $errors,
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'patrol', $this->user, $this->title ) );
                $this->assertEquals( [],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'upload', $this->user, $this->title ) );
                $this->assertEquals( [],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'purge', $this->user, $this->title ) );
 
                // Test no block.
@@ -1236,7 +1177,7 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                $this->user->mBlock = null;
 
                $this->assertEquals( [],
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'edit', $this->user, $this->title ) );
        }
 
@@ -1287,7 +1228,7 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                        $wgLang->timeanddate( wfTimestamp( TS_MW, $now ), true ) ] ];
 
                $this->assertEquals( $errors,
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       $this->permissionManager
                                ->getPermissionErrors( 'tester', $this->user, $this->title ) );
        }
 
@@ -1302,7 +1243,7 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                //$this->assertSame( '', $user->blockedBy(), 'sanity check' );
                //$this->assertSame( '', $user->blockedFor(), 'sanity check' );
                //$this->assertFalse( (bool)$user->isHidden(), 'sanity check' );
-               $this->assertFalse( MediaWikiServices::getInstance()->getPermissionManager()
+               $this->assertFalse( $this->permissionManager
                        ->isBlockedFrom( $user, $ut ), 'sanity check' );
 
                // Block the user
@@ -1323,8 +1264,7 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                //$this->assertSame( $blocker->getName(), $user->blockedBy() );
                //$this->assertSame( 'Because', $user->blockedFor() );
                //$this->assertTrue( (bool)$user->isHidden() );
-               $this->assertTrue( MediaWikiServices::getInstance()->getPermissionManager()
-                       ->isBlockedFrom( $user, $ut ) );
+               $this->assertTrue( $this->permissionManager->isBlockedFrom( $user, $ut ) );
 
                // Unblock
                $block->delete();
@@ -1335,8 +1275,7 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                //$this->assertSame( '', $user->blockedBy() );
                //$this->assertSame( '', $user->blockedFor() );
                //$this->assertFalse( (bool)$user->isHidden() );
-               $this->assertFalse( MediaWikiServices::getInstance()->getPermissionManager()
-                       ->isBlockedFrom( $user, $ut ) );
+               $this->assertFalse( $this->permissionManager->isBlockedFrom( $user, $ut ) );
        }
 
        /**
@@ -1386,8 +1325,7 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                $block->insert();
 
                try {
-                       $this->assertSame( $expect, MediaWikiServices::getInstance()->getPermissionManager()
-                               ->isBlockedFrom( $user, $title ) );
+                       $this->assertSame( $expect, $this->permissionManager->isBlockedFrom( $user, $title ) );
                } finally {
                        $block->delete();
                }
@@ -1470,187 +1408,4 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                ];
        }
 
-       /**
-        * @covers \MediaWiki\Permissions\PermissionManager::getUserPermissions
-        */
-       public function testGetUserPermissions() {
-               $user = $this->getTestUser( [ 'unittesters' ] )->getUser();
-               $rights = MediaWikiServices::getInstance()->getPermissionManager()
-                       ->getUserPermissions( $user );
-               $this->assertContains( 'runtest', $rights );
-               $this->assertNotContains( 'writetest', $rights );
-               $this->assertNotContains( 'modifytest', $rights );
-               $this->assertNotContains( 'nukeworld', $rights );
-       }
-
-       /**
-        * @covers \MediaWiki\Permissions\PermissionManager::getUserPermissions
-        */
-       public function testGetUserPermissionsHooks() {
-               $user = $this->getTestUser( [ 'unittesters', 'testwriters' ] )->getUser();
-               $userWrapper = TestingAccessWrapper::newFromObject( $user );
-
-               $rights = MediaWikiServices::getInstance()->getPermissionManager()
-                       ->getUserPermissions( $user );
-               $this->assertContains( 'test', $rights, 'sanity check' );
-               $this->assertContains( 'runtest', $rights, 'sanity check' );
-               $this->assertContains( 'writetest', $rights, 'sanity check' );
-               $this->assertNotContains( 'nukeworld', $rights, 'sanity check' );
-
-               // Add a hook manipluating the rights
-               $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'UserGetRights' => [ function ( $user, &$rights ) {
-                       $rights[] = 'nukeworld';
-                       $rights = array_diff( $rights, [ 'writetest' ] );
-               } ] ] );
-
-               $this->overrideMwServices();
-               $rights = MediaWikiServices::getInstance()->getPermissionManager()
-                       ->getUserPermissions( $user );
-               $this->assertContains( 'test', $rights );
-               $this->assertContains( 'runtest', $rights );
-               $this->assertNotContains( 'writetest', $rights );
-               $this->assertContains( 'nukeworld', $rights );
-
-               // Add a Session that limits rights
-               $mock = $this->getMockBuilder( stdClass::class )
-                       ->setMethods( [ 'getAllowedUserRights', 'deregisterSession', 'getSessionId' ] )
-                       ->getMock();
-               $mock->method( 'getAllowedUserRights' )->willReturn( [ 'test', 'writetest' ] );
-               $mock->method( 'getSessionId' )->willReturn(
-                       new SessionId( str_repeat( 'X', 32 ) )
-               );
-               $session = TestUtils::getDummySession( $mock );
-               $mockRequest = $this->getMockBuilder( FauxRequest::class )
-                       ->setMethods( [ 'getSession' ] )
-                       ->getMock();
-               $mockRequest->method( 'getSession' )->willReturn( $session );
-               $userWrapper->mRequest = $mockRequest;
-
-               $this->overrideMwServices();
-               $rights = MediaWikiServices::getInstance()->getPermissionManager()
-                       ->getUserPermissions( $user );
-               $this->assertContains( 'test', $rights );
-               $this->assertNotContains( 'runtest', $rights );
-               $this->assertNotContains( 'writetest', $rights );
-               $this->assertNotContains( 'nukeworld', $rights );
-       }
-
-       /**
-        * @covers \MediaWiki\Permissions\PermissionManager::getGroupPermissions
-        */
-       public function testGroupPermissions() {
-               $rights = MediaWikiServices::getInstance()->getPermissionManager()
-                       ->getGroupPermissions( [ 'unittesters' ] );
-               $this->assertContains( 'runtest', $rights );
-               $this->assertNotContains( 'writetest', $rights );
-               $this->assertNotContains( 'modifytest', $rights );
-               $this->assertNotContains( 'nukeworld', $rights );
-
-               $rights = MediaWikiServices::getInstance()->getPermissionManager()
-                       ->getGroupPermissions( [ 'unittesters', 'testwriters' ] );
-               $this->assertContains( 'runtest', $rights );
-               $this->assertContains( 'writetest', $rights );
-               $this->assertContains( 'modifytest', $rights );
-               $this->assertNotContains( 'nukeworld', $rights );
-       }
-
-       /**
-        * @covers \MediaWiki\Permissions\PermissionManager::getGroupPermissions
-        */
-       public function testRevokePermissions() {
-               $rights = MediaWikiServices::getInstance()->getPermissionManager()
-                       ->getGroupPermissions( [ 'unittesters', 'formertesters' ] );
-               $this->assertNotContains( 'runtest', $rights );
-               $this->assertNotContains( 'writetest', $rights );
-               $this->assertNotContains( 'modifytest', $rights );
-               $this->assertNotContains( 'nukeworld', $rights );
-       }
-
-       /**
-        * @dataProvider provideGetGroupsWithPermission
-        * @covers \MediaWiki\Permissions\PermissionManager::getGroupsWithPermission
-        */
-       public function testGetGroupsWithPermission( $expected, $right ) {
-               $result = MediaWikiServices::getInstance()->getPermissionManager()
-                       ->getGroupsWithPermission( $right );
-               sort( $result );
-               sort( $expected );
-
-               $this->assertEquals( $expected, $result, "Groups with permission $right" );
-       }
-
-       public static function provideGetGroupsWithPermission() {
-               return [
-                       [
-                               [ 'unittesters', 'testwriters' ],
-                               'test'
-                       ],
-                       [
-                               [ 'unittesters' ],
-                               'runtest'
-                       ],
-                       [
-                               [ 'testwriters' ],
-                               'writetest'
-                       ],
-                       [
-                               [ 'testwriters' ],
-                               'modifytest'
-                       ],
-               ];
-       }
-
-       /**
-        * @covers \MediaWiki\Permissions\PermissionManager::userHasRight
-        */
-       public function testUserHasRight() {
-               $result = MediaWikiServices::getInstance()->getPermissionManager()->userHasRight(
-                       $this->getTestUser( 'unittesters' )->getUser(),
-                       'test'
-               );
-               $this->assertTrue( $result );
-
-               $result = MediaWikiServices::getInstance()->getPermissionManager()->userHasRight(
-                       $this->getTestUser( 'formertesters' )->getUser(),
-                       'runtest'
-               );
-               $this->assertFalse( $result );
-
-               $result = MediaWikiServices::getInstance()->getPermissionManager()->userHasRight(
-                       $this->getTestUser( 'formertesters' )->getUser(),
-                       ''
-               );
-               $this->assertTrue( $result );
-       }
-
-       /**
-        * @covers \MediaWiki\Permissions\PermissionManager::groupHasPermission
-        */
-       public function testGroupHasPermission() {
-               $result = MediaWikiServices::getInstance()->getPermissionManager()->groupHasPermission(
-                       'unittesters',
-                       'test'
-               );
-               $this->assertTrue( $result );
-
-               $result = MediaWikiServices::getInstance()->getPermissionManager()->groupHasPermission(
-                       'formertesters',
-                       'runtest'
-               );
-               $this->assertFalse( $result );
-       }
-
-       /**
-        * @covers \MediaWiki\Permissions\PermissionManager::isEveryoneAllowed
-        */
-       public function testIsEveryoneAllowed() {
-               $result = MediaWikiServices::getInstance()->getPermissionManager()
-                                                                  ->isEveryoneAllowed( 'editmyoptions' );
-               $this->assertTrue( $result );
-
-               $result = MediaWikiServices::getInstance()->getPermissionManager()
-                                                                  ->isEveryoneAllowed( 'test' );
-               $this->assertFalse( $result );
-       }
-
 }
index d05217f..bbd034a 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Revision\MutableRevisionRecord;
 use MediaWiki\Revision\RevisionStore;
@@ -1551,8 +1552,6 @@ abstract class RevisionDbTestBase extends MediaWikiTestCase {
                                ],
                        ]
                );
-               // TODO: this one is necessary to pass globals changes to PermissionManger
-               $this->overrideMwServices();
                $user = $this->getTestUser( $userGroups )->getUser();
 
                $this->assertSame(
@@ -1606,8 +1605,6 @@ abstract class RevisionDbTestBase extends MediaWikiTestCase {
                                ],
                        ]
                );
-               // TODO: this one is necessary to pass globals changes to PermissionManger
-               $this->overrideMwServices();
                $user = $this->getTestUser( $userGroups )->getUser();
                $revision = new Revision( [ 'deleted' => $bitField ], 0, $this->testPage->getTitle() );
 
index 04addab..ebd8dbd 100644 (file)
@@ -15,7 +15,7 @@ class TemplateCategoriesTest extends MediaWikiLangTestCase {
         */
        public function testTemplateCategories() {
                $user = new User();
-               $this->overrideUserPermissions( $user, [ 'createpage', 'edit', 'purge', 'delete' ] );
+               $user->mRights = [ 'createpage', 'edit', 'purge', 'delete' ];
 
                $title = Title::newFromText( "Categorized from template" );
                $page = WikiPage::factory( $title );
index fcf4b20..e09546e 100644 (file)
@@ -75,6 +75,16 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->overrideMwServices();
        }
 
+       protected function setUserPerm( $perm ) {
+               // Setting member variables is evil!!!
+
+               if ( is_array( $perm ) ) {
+                       $this->user->mRights = $perm;
+               } else {
+                       $this->user->mRights = [ $perm ];
+               }
+       }
+
        protected function setTitle( $ns, $title = "Main_Page" ) {
                $this->title = Title::makeTitle( $ns, $title );
        }
@@ -104,139 +114,139 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 
                $this->setUser( 'anon' );
                $this->setTitle( NS_TALK );
-               $this->overrideUserPermissions( $this->user, "createtalk" );
+               $this->setUserPerm( "createtalk" );
                $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
                $this->assertEquals( [], $res );
 
                $this->setTitle( NS_TALK );
-               $this->overrideUserPermissions( $this->user, "createpage" );
+               $this->setUserPerm( "createpage" );
                $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
                $this->assertEquals( [ [ "nocreatetext" ] ], $res );
 
                $this->setTitle( NS_TALK );
-               $this->overrideUserPermissions( $this->user, "" );
+               $this->setUserPerm( "" );
                $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
                $this->assertEquals( [ [ 'nocreatetext' ] ], $res );
 
                $this->setTitle( NS_MAIN );
-               $this->overrideUserPermissions( $this->user, "createpage" );
+               $this->setUserPerm( "createpage" );
                $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
                $this->assertEquals( [], $res );
 
                $this->setTitle( NS_MAIN );
-               $this->overrideUserPermissions( $this->user, "createtalk" );
+               $this->setUserPerm( "createtalk" );
                $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
                $this->assertEquals( [ [ 'nocreatetext' ] ], $res );
 
                $this->setUser( $this->userName );
                $this->setTitle( NS_TALK );
-               $this->overrideUserPermissions( $this->user, "createtalk" );
+               $this->setUserPerm( "createtalk" );
                $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
                $this->assertEquals( [], $res );
 
                $this->setTitle( NS_TALK );
-               $this->overrideUserPermissions( $this->user, "createpage" );
+               $this->setUserPerm( "createpage" );
                $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
                $this->assertEquals( [ [ 'nocreate-loggedin' ] ], $res );
 
                $this->setTitle( NS_TALK );
-               $this->overrideUserPermissions( $this->user );
+               $this->setUserPerm( "" );
                $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
                $this->assertEquals( [ [ 'nocreate-loggedin' ] ], $res );
 
                $this->setTitle( NS_MAIN );
-               $this->overrideUserPermissions( $this->user, "createpage" );
+               $this->setUserPerm( "createpage" );
                $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
                $this->assertEquals( [], $res );
 
                $this->setTitle( NS_MAIN );
-               $this->overrideUserPermissions( $this->user, "createtalk" );
+               $this->setUserPerm( "createtalk" );
                $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
                $this->assertEquals( [ [ 'nocreate-loggedin' ] ], $res );
 
                $this->setTitle( NS_MAIN );
-               $this->overrideUserPermissions( $this->user );
+               $this->setUserPerm( "" );
                $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
                $this->assertEquals( [ [ 'nocreate-loggedin' ] ], $res );
 
                $this->setUser( 'anon' );
                $this->setTitle( NS_USER, $this->userName . '' );
-               $this->overrideUserPermissions( $this->user );
+               $this->setUserPerm( "" );
                $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
                $this->assertEquals( [ [ 'cant-move-user-page' ], [ 'movenologintext' ] ], $res );
 
                $this->setTitle( NS_USER, $this->userName . '/subpage' );
-               $this->overrideUserPermissions( $this->user );
+               $this->setUserPerm( "" );
                $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
                $this->assertEquals( [ [ 'movenologintext' ] ], $res );
 
                $this->setTitle( NS_USER, $this->userName . '' );
-               $this->overrideUserPermissions( $this->user, "move-rootuserpages" );
+               $this->setUserPerm( "move-rootuserpages" );
                $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
                $this->assertEquals( [ [ 'movenologintext' ] ], $res );
 
                $this->setTitle( NS_USER, $this->userName . '/subpage' );
-               $this->overrideUserPermissions( $this->user, "move-rootuserpages" );
+               $this->setUserPerm( "move-rootuserpages" );
                $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
                $this->assertEquals( [ [ 'movenologintext' ] ], $res );
 
                $this->setTitle( NS_USER, $this->userName . '' );
-               $this->overrideUserPermissions( $this->user, "" );
+               $this->setUserPerm( "" );
                $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
                $this->assertEquals( [ [ 'cant-move-user-page' ], [ 'movenologintext' ] ], $res );
 
                $this->setTitle( NS_USER, $this->userName . '/subpage' );
-               $this->overrideUserPermissions( $this->user, "" );
+               $this->setUserPerm( "" );
                $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
                $this->assertEquals( [ [ 'movenologintext' ] ], $res );
 
                $this->setTitle( NS_USER, $this->userName . '' );
-               $this->overrideUserPermissions( $this->user, "move-rootuserpages" );
+               $this->setUserPerm( "move-rootuserpages" );
                $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
                $this->assertEquals( [ [ 'movenologintext' ] ], $res );
 
                $this->setTitle( NS_USER, $this->userName . '/subpage' );
-               $this->overrideUserPermissions( $this->user, "move-rootuserpages" );
+               $this->setUserPerm( "move-rootuserpages" );
                $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
                $this->assertEquals( [ [ 'movenologintext' ] ], $res );
 
                $this->setUser( $this->userName );
                $this->setTitle( NS_FILE, "img.png" );
-               $this->overrideUserPermissions( $this->user );
+               $this->setUserPerm( "" );
                $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
                $this->assertEquals( [ [ 'movenotallowedfile' ], [ 'movenotallowed' ] ], $res );
 
                $this->setTitle( NS_FILE, "img.png" );
-               $this->overrideUserPermissions( $this->user, "movefile" );
+               $this->setUserPerm( "movefile" );
                $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
                $this->assertEquals( [ [ 'movenotallowed' ] ], $res );
 
                $this->setUser( 'anon' );
                $this->setTitle( NS_FILE, "img.png" );
-               $this->overrideUserPermissions( $this->user );
+               $this->setUserPerm( "" );
                $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
                $this->assertEquals( [ [ 'movenotallowedfile' ], [ 'movenologintext' ] ], $res );
 
                $this->setTitle( NS_FILE, "img.png" );
-               $this->overrideUserPermissions( $this->user, "movefile" );
+               $this->setUserPerm( "movefile" );
                $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
                $this->assertEquals( [ [ 'movenologintext' ] ], $res );
 
                $this->setUser( $this->userName );
-               $this->overrideUserPermissions( $this->user, "move" );
+               $this->setUserPerm( "move" );
                $this->runGroupPermissions( 'move', [ [ 'movenotallowedfile' ] ] );
 
-               $this->overrideUserPermissions( $this->user );
+               $this->setUserPerm( "" );
                $this->runGroupPermissions(
                        'move',
                        [ [ 'movenotallowedfile' ], [ 'movenotallowed' ] ]
                );
 
                $this->setUser( 'anon' );
-               $this->overrideUserPermissions( $this->user, "move" );
+               $this->setUserPerm( "move" );
                $this->runGroupPermissions( 'move', [ [ 'movenotallowedfile' ] ] );
 
-               $this->overrideUserPermissions( $this->user );
+               $this->setUserPerm( "" );
                $this->runGroupPermissions(
                        'move',
                        [ [ 'movenotallowedfile' ], [ 'movenotallowed' ] ],
@@ -249,51 +259,51 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 
                        $this->setTitle( NS_MAIN );
                        $this->setUser( 'anon' );
-                       $this->overrideUserPermissions( $this->user, "move" );
+                       $this->setUserPerm( "move" );
                        $this->runGroupPermissions( 'move', [] );
 
-                       $this->overrideUserPermissions( $this->user, "" );
+                       $this->setUserPerm( "" );
                        $this->runGroupPermissions( 'move', [ [ 'movenotallowed' ] ],
                                [ [ 'movenologintext' ] ] );
 
                        $this->setUser( $this->userName );
-                       $this->overrideUserPermissions( $this->user, "" );
+                       $this->setUserPerm( "" );
                        $this->runGroupPermissions( 'move', [ [ 'movenotallowed' ] ] );
 
-                       $this->overrideUserPermissions( $this->user, "move" );
+                       $this->setUserPerm( "move" );
                        $this->runGroupPermissions( 'move', [] );
 
                        $this->setUser( 'anon' );
-                       $this->overrideUserPermissions( $this->user, 'move' );
+                       $this->setUserPerm( 'move' );
                        $res = $this->title->getUserPermissionsErrors( 'move-target', $this->user );
                        $this->assertEquals( [], $res );
 
-                       $this->overrideUserPermissions( $this->user );
+                       $this->setUserPerm( '' );
                        $res = $this->title->getUserPermissionsErrors( 'move-target', $this->user );
                        $this->assertEquals( [ [ 'movenotallowed' ] ], $res );
                }
 
                $this->setTitle( NS_USER );
                $this->setUser( $this->userName );
-               $this->overrideUserPermissions( $this->user, [ "move", "move-rootuserpages" ] );
+               $this->setUserPerm( [ "move", "move-rootuserpages" ] );
                $res = $this->title->getUserPermissionsErrors( 'move-target', $this->user );
                $this->assertEquals( [], $res );
 
-               $this->overrideUserPermissions( $this->user, "move" );
+               $this->setUserPerm( "move" );
                $res = $this->title->getUserPermissionsErrors( 'move-target', $this->user );
                $this->assertEquals( [ [ 'cant-move-to-user-page' ] ], $res );
 
                $this->setUser( 'anon' );
-               $this->overrideUserPermissions( $this->user, [ "move", "move-rootuserpages" ] );
+               $this->setUserPerm( [ "move", "move-rootuserpages" ] );
                $res = $this->title->getUserPermissionsErrors( 'move-target', $this->user );
                $this->assertEquals( [], $res );
 
                $this->setTitle( NS_USER, "User/subpage" );
-               $this->overrideUserPermissions( $this->user, [ "move", "move-rootuserpages" ] );
+               $this->setUserPerm( [ "move", "move-rootuserpages" ] );
                $res = $this->title->getUserPermissionsErrors( 'move-target', $this->user );
                $this->assertEquals( [], $res );
 
-               $this->overrideUserPermissions( $this->user, "move" );
+               $this->setUserPerm( "move" );
                $res = $this->title->getUserPermissionsErrors( 'move-target', $this->user );
                $this->assertEquals( [], $res );
 
@@ -319,7 +329,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                ];
 
                foreach ( [ "edit", "protect", "" ] as $action ) {
-                       $this->overrideUserPermissions( $this->user );
+                       $this->setUserPerm( null );
                        $this->assertEquals( $check[$action][0],
                                $this->title->getUserPermissionsErrors( $action, $this->user, true ) );
                        $this->assertEquals( $check[$action][0],
@@ -331,19 +341,15 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $old = $wgGroupPermissions;
                        $wgGroupPermissions = [];
 
-                       $this->overrideMwServices();
-
                        $this->assertEquals( $check[$action][1],
                                $this->title->getUserPermissionsErrors( $action, $this->user, true ) );
                        $this->assertEquals( $check[$action][1],
                                $this->title->getUserPermissionsErrors( $action, $this->user, 'full' ) );
                        $this->assertEquals( $check[$action][1],
                                $this->title->getUserPermissionsErrors( $action, $this->user, 'secure' ) );
-
                        $wgGroupPermissions = $old;
-                       $this->overrideMwServices();
 
-                       $this->overrideUserPermissions( $this->user, $action );
+                       $this->setUserPerm( $action );
                        $this->assertEquals( $check[$action][2],
                                $this->title->getUserPermissionsErrors( $action, $this->user, true ) );
                        $this->assertEquals( $check[$action][2],
@@ -351,7 +357,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $this->assertEquals( $check[$action][2],
                                $this->title->getUserPermissionsErrors( $action, $this->user, 'secure' ) );
 
-                       $this->overrideUserPermissions( $this->user, $action );
+                       $this->setUserPerm( $action );
                        $this->assertEquals( $check[$action][3],
                                $this->title->userCan( $action, $this->user, true ) );
                        $this->assertEquals( $check[$action][3],
@@ -367,39 +373,23 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $result2 = $result;
                }
 
-               // XXX: there could be a better way to handle this, but since we need to
-               // override PermissionManager service each time globals are changed
-               // and in the same time we need to keep user permissions overrides from the outside
-               // the best we can do inside this method is to save & restore faked user perms
-
-               $userPermsOverrides = MediaWikiServices::getInstance()->getPermissionManager()
-                       ->getUserPermissions( $this->user );
-
                $wgGroupPermissions['autoconfirmed']['move'] = false;
                $wgGroupPermissions['user']['move'] = false;
-               $this->overrideMwServices();
-               $this->overrideUserPermissions( $this->user, $userPermsOverrides );
                $res = $this->title->getUserPermissionsErrors( $action, $this->user );
                $this->assertEquals( $result, $res );
 
                $wgGroupPermissions['autoconfirmed']['move'] = true;
                $wgGroupPermissions['user']['move'] = false;
-               $this->overrideMwServices();
-               $this->overrideUserPermissions( $this->user, $userPermsOverrides );
                $res = $this->title->getUserPermissionsErrors( $action, $this->user );
                $this->assertEquals( $result2, $res );
 
                $wgGroupPermissions['autoconfirmed']['move'] = true;
                $wgGroupPermissions['user']['move'] = true;
-               $this->overrideMwServices();
-               $this->overrideUserPermissions( $this->user, $userPermsOverrides );
                $res = $this->title->getUserPermissionsErrors( $action, $this->user );
                $this->assertEquals( $result2, $res );
 
                $wgGroupPermissions['autoconfirmed']['move'] = false;
                $wgGroupPermissions['user']['move'] = true;
-               $this->overrideMwServices();
-               $this->overrideUserPermissions( $this->user, $userPermsOverrides );
                $res = $this->title->getUserPermissionsErrors( $action, $this->user );
                $this->assertEquals( $result2, $res );
        }
@@ -419,42 +409,42 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
 
                $this->setTitle( NS_MAIN );
-               $this->overrideUserPermissions( $this->user, 'bogus' );
+               $this->setUserPerm( 'bogus' );
                $this->assertEquals( [],
                        $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
 
                $this->setTitle( NS_MAIN );
-               $this->overrideUserPermissions( $this->user );
+               $this->setUserPerm( '' );
                $this->assertEquals( [ [ 'badaccess-group0' ] ],
                        $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
 
                $wgNamespaceProtection[NS_USER] = [ 'bogus' ];
 
                $this->setTitle( NS_USER );
-               $this->overrideUserPermissions( $this->user );
+               $this->setUserPerm( '' );
                $this->assertEquals( [ [ 'badaccess-group0' ],
                                [ 'namespaceprotected', 'User', 'bogus' ] ],
                        $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
 
                $this->setTitle( NS_MEDIAWIKI );
-               $this->overrideUserPermissions( $this->user, 'bogus' );
+               $this->setUserPerm( 'bogus' );
                $this->assertEquals( [ [ 'protectedinterface', 'bogus' ] ],
                        $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
 
                $this->setTitle( NS_MEDIAWIKI );
-               $this->overrideUserPermissions( $this->user, 'bogus' );
+               $this->setUserPerm( 'bogus' );
                $this->assertEquals( [ [ 'protectedinterface', 'bogus' ] ],
                        $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
 
                $wgNamespaceProtection = null;
 
-               $this->overrideUserPermissions( $this->user, 'bogus' );
+               $this->setUserPerm( 'bogus' );
                $this->assertEquals( [],
                        $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
                $this->assertEquals( true,
                        $this->title->userCan( 'bogus', $this->user ) );
 
-               $this->overrideUserPermissions( $this->user );
+               $this->setUserPerm( '' );
                $this->assertEquals( [ [ 'badaccess-group0' ] ],
                        $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
                $this->assertEquals( false,
@@ -655,39 +645,39 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $resultUserJs,
                $resultPatrol
        ) {
-               $this->overrideUserPermissions( $this->user );
+               $this->setUserPerm( '' );
                $result = $this->title->getUserPermissionsErrors( 'bogus', $this->user );
                $this->assertEquals( $resultNone, $result );
 
-               $this->overrideUserPermissions( $this->user, 'editmyusercss' );
+               $this->setUserPerm( 'editmyusercss' );
                $result = $this->title->getUserPermissionsErrors( 'bogus', $this->user );
                $this->assertEquals( $resultMyCss, $result );
 
-               $this->overrideUserPermissions( $this->user, 'editmyuserjson' );
+               $this->setUserPerm( 'editmyuserjson' );
                $result = $this->title->getUserPermissionsErrors( 'bogus', $this->user );
                $this->assertEquals( $resultMyJson, $result );
 
-               $this->overrideUserPermissions( $this->user, 'editmyuserjs' );
+               $this->setUserPerm( 'editmyuserjs' );
                $result = $this->title->getUserPermissionsErrors( 'bogus', $this->user );
                $this->assertEquals( $resultMyJs, $result );
 
-               $this->overrideUserPermissions( $this->user, 'editusercss' );
+               $this->setUserPerm( 'editusercss' );
                $result = $this->title->getUserPermissionsErrors( 'bogus', $this->user );
                $this->assertEquals( $resultUserCss, $result );
 
-               $this->overrideUserPermissions( $this->user, 'edituserjson' );
+               $this->setUserPerm( 'edituserjson' );
                $result = $this->title->getUserPermissionsErrors( 'bogus', $this->user );
                $this->assertEquals( $resultUserJson, $result );
 
-               $this->overrideUserPermissions( $this->user, 'edituserjs' );
+               $this->setUserPerm( 'edituserjs' );
                $result = $this->title->getUserPermissionsErrors( 'bogus', $this->user );
                $this->assertEquals( $resultUserJs, $result );
 
-               $this->overrideUserPermissions( $this->user );
+               $this->setUserPerm( '' );
                $result = $this->title->getUserPermissionsErrors( 'patrol', $this->user );
                $this->assertEquals( reset( $resultPatrol[0] ), reset( $result[0] ) );
 
-               $this->overrideUserPermissions( $this->user, [ 'edituserjs', 'edituserjson', 'editusercss' ] );
+               $this->setUserPerm( [ 'edituserjs', 'edituserjson', 'editusercss' ] );
                $result = $this->title->getUserPermissionsErrors( 'bogus', $this->user );
                $this->assertEquals( [ [ 'badaccess-group0' ] ], $result );
        }
@@ -707,7 +697,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 
                $this->setTitle( NS_MAIN );
                $this->title->mRestrictionsLoaded = true;
-               $this->overrideUserPermissions( $this->user, "edit" );
+               $this->setUserPerm( "edit" );
                $this->title->mRestrictions = [ "bogus" => [ 'bogus', "sysop", "protect", "" ] ];
 
                $this->assertEquals( [],
@@ -730,7 +720,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                                [ 'protectedpagetext', 'protect', 'edit' ] ],
                        $this->title->getUserPermissionsErrors( 'edit',
                                $this->user ) );
-               $this->overrideUserPermissions( $this->user );
+               $this->setUserPerm( "" );
                $this->assertEquals( [ [ 'badaccess-group0' ],
                                [ 'protectedpagetext', 'bogus', 'bogus' ],
                                [ 'protectedpagetext', 'editprotected', 'bogus' ],
@@ -743,7 +733,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                                [ 'protectedpagetext', 'protect', 'edit' ] ],
                        $this->title->getUserPermissionsErrors( 'edit',
                                $this->user ) );
-               $this->overrideUserPermissions( $this->user, [ "edit", "editprotected" ] );
+               $this->setUserPerm( [ "edit", "editprotected" ] );
                $this->assertEquals( [ [ 'badaccess-group0' ],
                                [ 'protectedpagetext', 'bogus', 'bogus' ],
                                [ 'protectedpagetext', 'protect', 'bogus' ] ],
@@ -756,7 +746,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                                $this->user ) );
 
                $this->title->mCascadeRestriction = true;
-               $this->overrideUserPermissions( $this->user, "edit" );
+               $this->setUserPerm( "edit" );
                $this->assertEquals( false,
                        $this->title->quickUserCan( 'bogus', $this->user ) );
                $this->assertEquals( false,
@@ -773,7 +763,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $this->title->getUserPermissionsErrors( 'edit',
                                $this->user ) );
 
-               $this->overrideUserPermissions( $this->user, [ "edit", "editprotected" ] );
+               $this->setUserPerm( [ "edit", "editprotected" ] );
                $this->assertEquals( false,
                        $this->title->quickUserCan( 'bogus', $this->user ) );
                $this->assertEquals( false,
@@ -796,7 +786,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
         */
        public function testCascadingSourcesRestrictions() {
                $this->setTitle( NS_MAIN, "test page" );
-               $this->overrideUserPermissions( $this->user, [ "edit", "bogus" ] );
+               $this->setUserPerm( [ "edit", "bogus" ] );
 
                $this->title->mCascadeSources = [
                        Title::makeTitle( NS_MAIN, "Bogus" ),
@@ -826,7 +816,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
         * @covers \MediaWiki\Permissions\PermissionManager::checkActionPermissions
         */
        public function testActionPermissions() {
-               $this->overrideUserPermissions( $this->user, [ "createpage" ] );
+               $this->setUserPerm( [ "createpage" ] );
                $this->setTitle( NS_MAIN, "test page" );
                $this->title->mTitleProtection['permission'] = '';
                $this->title->mTitleProtection['user'] = $this->user->getId();
@@ -840,26 +830,26 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $this->title->userCan( 'create', $this->user ) );
 
                $this->title->mTitleProtection['permission'] = 'editprotected';
-               $this->overrideUserPermissions( $this->user, [ 'createpage', 'protect' ] );
+               $this->setUserPerm( [ 'createpage', 'protect' ] );
                $this->assertEquals( [ [ 'titleprotected', 'Useruser', 'test' ] ],
                        $this->title->getUserPermissionsErrors( 'create', $this->user ) );
                $this->assertEquals( false,
                        $this->title->userCan( 'create', $this->user ) );
 
-               $this->overrideUserPermissions( $this->user, [ 'createpage', 'editprotected' ] );
+               $this->setUserPerm( [ 'createpage', 'editprotected' ] );
                $this->assertEquals( [],
                        $this->title->getUserPermissionsErrors( 'create', $this->user ) );
                $this->assertEquals( true,
                        $this->title->userCan( 'create', $this->user ) );
 
-               $this->overrideUserPermissions( $this->user, [ 'createpage' ] );
+               $this->setUserPerm( [ 'createpage' ] );
                $this->assertEquals( [ [ 'titleprotected', 'Useruser', 'test' ] ],
                        $this->title->getUserPermissionsErrors( 'create', $this->user ) );
                $this->assertEquals( false,
                        $this->title->userCan( 'create', $this->user ) );
 
                $this->setTitle( NS_MEDIA, "test page" );
-               $this->overrideUserPermissions( $this->user, [ "move" ] );
+               $this->setUserPerm( [ "move" ] );
                $this->assertEquals( false,
                        $this->title->userCan( 'move', $this->user ) );
                $this->assertEquals( [ [ 'immobile-source-namespace', 'Media' ] ],
@@ -907,10 +897,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                ] );
                $this->overrideMwServices();
 
-               $this->overrideUserPermissions(
-                       $this->user,
-                       [ 'createpage', 'edit', 'move', 'rollback', 'patrol', 'upload', 'purge' ]
-               );
+               $this->setUserPerm( [ 'createpage', 'edit', 'move', 'rollback', 'patrol', 'upload', 'purge' ] );
                $this->setTitle( NS_HELP, "test page" );
 
                # $wgEmailConfirmToEdit only applies to 'edit' action
@@ -921,10 +908,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 
                $this->setMwGlobals( 'wgEmailConfirmToEdit', false );
                $this->overrideMwServices();
-               $this->overrideUserPermissions(
-                       $this->user,
-                       [ 'createpage', 'edit', 'move', 'rollback', 'patrol', 'upload', 'purge' ]
-               );
 
                $this->assertNotContains( [ 'confirmedittext' ],
                        $this->title->getUserPermissionsErrors( 'edit', $this->user ) );
index a9f08ed..d6c3401 100644 (file)
@@ -355,7 +355,7 @@ class TitleTest extends MediaWikiTestCase {
 
                // New anonymous user with no rights
                $user = new User;
-               $this->overrideUserPermissions( $user, [] );
+               $user->mRights = [];
                $errors = $title->userCan( $action, $user );
 
                if ( is_bool( $expected ) ) {
index 4d977cb..5ad7736 100644 (file)
@@ -190,14 +190,14 @@ class ActionTest extends MediaWikiTestCase {
 
        public function testCanExecute() {
                $user = $this->getTestUser()->getUser();
-               $this->overrideUserPermissions( $user, 'access' );
+               $user->mRights = [ 'access' ];
                $action = Action::factory( 'access', $this->getPage(), $this->getContext() );
                $this->assertNull( $action->canExecute( $user ) );
        }
 
        public function testCanExecuteNoRight() {
                $user = $this->getTestUser()->getUser();
-               $this->overrideUserPermissions( $user, [] );
+               $user->mRights = [];
                $action = Action::factory( 'access', $this->getPage(), $this->getContext() );
 
                try {
@@ -209,7 +209,7 @@ class ActionTest extends MediaWikiTestCase {
 
        public function testCanExecuteRequiresUnblock() {
                $user = $this->getTestUser()->getUser();
-               $this->overrideUserPermissions( $user, [] );
+               $user->mRights = [];
 
                $page = $this->getExistingTestPage();
                $action = Action::factory( 'unblock', $page, $this->getContext() );
index bae611b..060834f 100644 (file)
@@ -147,8 +147,6 @@ class ApiBlockTest extends ApiTestCase {
                $this->setMwGlobals( 'wgRevokePermissions',
                        [ 'user' => [ 'applychangetags' => true ] ] );
 
-               $this->overrideMwServices();
-
                $this->doBlock( [ 'tags' => 'custom tag' ] );
        }
 
@@ -159,7 +157,6 @@ class ApiBlockTest extends ApiTestCase {
                $this->mergeMwGlobalArrayValue( 'wgGroupPermissions',
                        [ 'sysop' => $newPermissions ] );
 
-               $this->overrideMwServices();
                $res = $this->doBlock( [ 'hidename' => '' ] );
 
                $dbw = wfGetDB( DB_MASTER );
@@ -209,8 +206,6 @@ class ApiBlockTest extends ApiTestCase {
                $this->setMwGlobals( 'wgRevokePermissions',
                        [ 'sysop' => [ 'blockemail' => true ] ] );
 
-               $this->overrideMwServices();
-
                $this->doBlock( [ 'noemail' => '' ] );
        }
 
index 3868723..c68954c 100644 (file)
@@ -143,7 +143,6 @@ class ApiDeleteTest extends ApiTestCase {
                ChangeTags::defineTag( 'custom tag' );
                $this->setMwGlobals( 'wgRevokePermissions',
                        [ 'user' => [ 'applychangetags' => true ] ] );
-               $this->overrideMwServices();
 
                $this->editPage( $name, 'Some text' );
 
index a35613c..d2762e0 100644 (file)
@@ -39,7 +39,6 @@ class ApiEditPageTest extends ApiTestCase {
                        $this->tablesUsed,
                        [ 'change_tag', 'change_tag_def', 'logging' ]
                );
-               $this->overrideMwServices();
        }
 
        public function testEdit() {
@@ -411,10 +410,10 @@ class ApiEditPageTest extends ApiTestCase {
                $count++;
 
                /*
-               * T43990: if the target page has a newer revision than the redirect, then editing the
-               * redirect while specifying 'redirect' and *not* specifying 'basetimestamp' erroneously
-               * caused an edit conflict to be detected.
-               */
+                * T43990: if the target page has a newer revision than the redirect, then editing the
+                * redirect while specifying 'redirect' and *not* specifying 'basetimestamp' erroneously
+                * caused an edit conflict to be detected.
+                */
 
                // assume NS_HELP defaults to wikitext
                $name = "Help:ApiEditPageTest_testEditConflict_redirect_T43990_$count";
@@ -1368,9 +1367,6 @@ class ApiEditPageTest extends ApiTestCase {
                ChangeTags::defineTag( 'custom tag' );
                $this->setMwGlobals( 'wgRevokePermissions',
                        [ 'user' => [ 'applychangetags' => true ] ] );
-               // Supply services with updated globals
-               $this->overrideMwServices();
-
                try {
                        $this->doApiRequestWithToken( [
                                'action' => 'edit',
@@ -1549,8 +1545,6 @@ class ApiEditPageTest extends ApiTestCase {
 
                $this->setMwGlobals( 'wgRevokePermissions',
                        [ 'user' => [ 'upload' => true ] ] );
-               // Supply services with updated globals
-               $this->overrideMwServices();
 
                $this->doApiRequestWithToken( [
                        'action' => 'edit',
@@ -1566,8 +1560,6 @@ class ApiEditPageTest extends ApiTestCase {
                        'The content you supplied exceeds the article size limit of 1 kilobyte.' );
 
                $this->setMwGlobals( 'wgMaxArticleSize', 1 );
-               // Supply services with updated globals
-               $this->overrideMwServices();
 
                $text = str_repeat( '!', 1025 );
 
@@ -1585,8 +1577,6 @@ class ApiEditPageTest extends ApiTestCase {
                        'The action you have requested is limited to users in the group: ' );
 
                $this->setMwGlobals( 'wgRevokePermissions', [ '*' => [ 'edit' => true ] ] );
-               // Supply services with updated globals
-               $this->overrideMwServices();
 
                $this->doApiRequestWithToken( [
                        'action' => 'edit',
@@ -1603,8 +1593,6 @@ class ApiEditPageTest extends ApiTestCase {
 
                $this->setMwGlobals( 'wgRevokePermissions',
                        [ 'user' => [ 'editcontentmodel' => true ] ] );
-               // Supply services with updated globals
-               $this->overrideMwServices();
 
                $this->doApiRequestWithToken( [
                        'action' => 'edit',
index 6ffadb9..a5518a1 100644 (file)
@@ -141,7 +141,6 @@ class ApiMainTest extends ApiTestCase {
        public function testSetCacheModeUnrecognized() {
                $api = new ApiMain();
                $api->setCacheMode( 'unrecognized' );
-               $this->overrideMwServices();
                $this->assertSame(
                        'private',
                        TestingAccessWrapper::newFromObject( $api )->mCacheMode,
@@ -151,7 +150,7 @@ class ApiMainTest extends ApiTestCase {
 
        public function testSetCacheModePrivateWiki() {
                $this->setGroupPermissions( '*', 'read', false );
-               $this->overrideMwServices();
+
                $wrappedApi = TestingAccessWrapper::newFromObject( new ApiMain() );
                $wrappedApi->setCacheMode( 'public' );
                $this->assertSame( 'private', $wrappedApi->mCacheMode );
@@ -402,7 +401,7 @@ class ApiMainTest extends ApiTestCase {
                } else {
                        $user = new User();
                }
-               $this->overrideUserPermissions( $user, $rights );
+               $user->mRights = $rights;
                try {
                        $this->doApiRequest( [
                                'action' => 'query',
@@ -413,7 +412,6 @@ class ApiMainTest extends ApiTestCase {
                        $this->assertTrue( self::apiExceptionHasCode( $e, $error ),
                                "Error '{$e->getMessage()}' matched expected '$error'" );
                }
-               $this->overrideMwServices();
        }
 
        /**
@@ -706,7 +704,6 @@ class ApiMainTest extends ApiTestCase {
                        'You need read permission to use this module.' );
 
                $this->setGroupPermissions( '*', 'read', false );
-               $this->overrideMwServices();
 
                $main = new ApiMain( new FauxRequest( [ 'action' => 'query', 'meta' => 'siteinfo' ] ) );
                $main->execute();
@@ -730,7 +727,6 @@ class ApiMainTest extends ApiTestCase {
                $this->setExpectedException( ApiUsageException::class,
                        "You're not allowed to edit this wiki through the API." );
                $this->setGroupPermissions( '*', 'writeapi', false );
-               $this->overrideMwServices();
 
                $main = new ApiMain( new FauxRequest( [
                        'action' => 'edit',
index 04a4d8f..d880923 100644 (file)
@@ -212,7 +212,6 @@ class ApiMoveTest extends ApiTestCase {
                ChangeTags::defineTag( 'custom tag' );
 
                $this->setGroupPermissions( 'user', 'applychangetags', false );
-               $this->overrideMwServices();
 
                $id = $this->createPage( $name );
 
@@ -295,7 +294,6 @@ class ApiMoveTest extends ApiTestCase {
                $name = ucfirst( __FUNCTION__ );
 
                $this->mergeMwGlobalArrayValue( 'wgNamespacesWithSubpages', [ NS_MAIN => true ] );
-               $this->overrideMwServices();
 
                $pages = [ $name, "$name/1", "$name/2", "Talk:$name", "Talk:$name/1", "Talk:$name/3" ];
                $ids = [];
@@ -381,7 +379,6 @@ class ApiMoveTest extends ApiTestCase {
                $name = ucfirst( __FUNCTION__ );
 
                $this->setGroupPermissions( 'sysop', 'suppressredirect', false );
-               $this->overrideMwServices();
 
                $id = $this->createPage( $name );
 
index 9c5268c..0011d7a 100644 (file)
@@ -206,7 +206,6 @@ class ApiParseTest extends ApiTestCase {
 
        public function testSuppressed() {
                $this->setGroupPermissions( 'sysop', 'viewsuppressed', true );
-               $this->overrideMwServices();
 
                $res = $this->doApiRequest( [
                        'action' => 'parse',
diff --git a/tests/phpunit/includes/api/ApiQueryLanguageinfoTest.php b/tests/phpunit/includes/api/ApiQueryLanguageinfoTest.php
new file mode 100644 (file)
index 0000000..f20a061
--- /dev/null
@@ -0,0 +1,175 @@
+<?php
+
+/**
+ * @group API
+ * @group medium
+ *
+ * @covers ApiQueryLanguageinfo
+ */
+class ApiQueryLanguageinfoTest extends ApiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+               // register custom language names so this test is independent of CLDR
+               $this->setTemporaryHook(
+                       'LanguageGetTranslatedLanguageNames',
+                       function ( array &$names, $code ) {
+                               switch ( $code ) {
+                                       case 'en':
+                                               $names['sh'] = 'Serbo-Croatian';
+                                               $names['qtp'] = 'a custom language code MediaWiki knows nothing about';
+                                               break;
+                                       case 'pt':
+                                               $names['de'] = 'alemão';
+                                               break;
+                               }
+                       }
+               );
+       }
+
+       private function doQuery( array $params, $microtimeFunction = null ): array {
+               $params += [
+                       'action' => 'query',
+                       'meta' => 'languageinfo',
+                       'uselang' => 'en',
+               ];
+
+               if ( $microtimeFunction !== null ) {
+                       // hook into the module manager to override the factory function
+                       // so we can call the constructor with the custom $microtimeFunction
+                       $this->setTemporaryHook(
+                               'ApiQuery::moduleManager',
+                               function ( ApiModuleManager $moduleManager ) use ( $microtimeFunction ) {
+                                       $moduleManager->addModule(
+                                               'languageinfo',
+                                               'meta',
+                                               ApiQueryLanguageinfo::class,
+                                               function ( $parent, $name ) use ( $microtimeFunction ) {
+                                                       return new ApiQueryLanguageinfo(
+                                                               $parent,
+                                                               $name,
+                                                               $microtimeFunction
+                                                       );
+                                               }
+                                       );
+                               }
+                       );
+               }
+
+               $res = $this->doApiRequest( $params );
+
+               $this->assertArrayNotHasKey( 'warnings', $res[0] );
+
+               return [ $res[0]['query']['languageinfo'], $res[0]['continue'] ?? null ];
+       }
+
+       public function testAllPropsForSingleLanguage() {
+               list( $response, $continue ) = $this->doQuery( [
+                       'liprop' => 'code|bcp47|dir|autonym|name|fallbacks|variants',
+                       'licode' => 'sh',
+               ] );
+
+               $this->assertArrayEquals( [
+                       'sh' => [
+                               'code' => 'sh',
+                               'bcp47' => 'sh',
+                               'autonym' => 'srpskohrvatski / српскохрватски',
+                               'name' => 'Serbo-Croatian',
+                               'fallbacks' => [ 'bs', 'sr-el', 'hr' ],
+                               'dir' => 'ltr',
+                               'variants' => [ 'sh' ],
+                       ],
+               ], $response );
+       }
+
+       public function testAllPropsForSingleCustomLanguage() {
+               list( $response, $continue ) = $this->doQuery( [
+                       'liprop' => 'code|bcp47|dir|autonym|name|fallbacks|variants',
+                       'licode' => 'qtp', // reserved for local use by ISO 639; registered in setUp()
+               ] );
+
+               $this->assertArrayEquals( [
+                       'qtp' => [
+                               'code' => 'qtp',
+                               'bcp47' => 'qtp',
+                               'autonym' => '',
+                               'name' => 'a custom language code MediaWiki knows nothing about',
+                               'fallbacks' => [],
+                               'dir' => 'ltr',
+                               'variants' => [ 'qtp' ],
+                       ],
+               ], $response );
+       }
+
+       public function testNameInOtherLanguageForSingleLanguage() {
+               list( $response, $continue ) = $this->doQuery( [
+                       'liprop' => 'name',
+                       'licode' => 'de',
+                       'uselang' => 'pt',
+               ] );
+
+               $this->assertArrayEquals( [ 'de' => [ 'name' => 'alemão' ] ], $response );
+       }
+
+       public function testContinuationNecessary() {
+               $time = 0;
+               $microtimeFunction = function () use ( &$time ) {
+                       return $time += 0.75;
+               };
+
+               list( $response, $continue ) = $this->doQuery( [], $microtimeFunction );
+
+               $this->assertCount( 2, $response );
+               $this->assertArrayHasKey( 'licontinue', $continue );
+       }
+
+       public function testContinuationNotNecessary() {
+               $time = 0;
+               $microtimeFunction = function () use ( &$time ) {
+                       return $time += 1.5;
+               };
+
+               list( $response, $continue ) = $this->doQuery( [
+                       'licode' => 'de',
+               ], $microtimeFunction );
+
+               $this->assertNull( $continue );
+       }
+
+       public function testContinuationInAlphabeticalOrderNotParameterOrder() {
+               $time = 0;
+               $microtimeFunction = function () use ( &$time ) {
+                       return $time += 0.75;
+               };
+               $params = [ 'licode' => 'en|ru|zh|de|yue' ];
+
+               list( $response, $continue ) = $this->doQuery( $params, $microtimeFunction );
+
+               $this->assertCount( 2, $response );
+               $this->assertArrayHasKey( 'licontinue', $continue );
+               $this->assertSame( [ 'de', 'en' ], array_keys( $response ) );
+
+               $time = 0;
+               $params = $continue + $params;
+               list( $response, $continue ) = $this->doQuery( $params, $microtimeFunction );
+
+               $this->assertCount( 2, $response );
+               $this->assertArrayHasKey( 'licontinue', $continue );
+               $this->assertSame( [ 'ru', 'yue' ], array_keys( $response ) );
+
+               $time = 0;
+               $params = $continue + $params;
+               list( $response, $continue ) = $this->doQuery( $params, $microtimeFunction );
+
+               $this->assertCount( 1, $response );
+               $this->assertNull( $continue );
+               $this->assertSame( [ 'zh' ], array_keys( $response ) );
+       }
+
+       public function testResponseHasModulePathEvenIfEmpty() {
+               list( $response, $continue ) = $this->doQuery( [ 'licode' => '' ] );
+               $this->assertEmpty( $response );
+               // the real test is that $res[0]['query']['languageinfo'] in doQuery() didn’t fail
+       }
+
+}
index 2d627bf..c6ed8a7 100644 (file)
@@ -307,7 +307,6 @@ class ApiStashEditTest extends ApiTestCase {
 
                // Nor does the original one if they become a bot
                $user->addGroup( 'bot' );
-               MediaWikiServices::getInstance()->getPermissionManager()->invalidateUsersRightsCache();
                $this->assertFalse(
                        $this->doCheckCache( $user ),
                        "We assume bots don't have cache entries"
@@ -316,7 +315,6 @@ class ApiStashEditTest extends ApiTestCase {
                // But other groups are okay
                $user->removeGroup( 'bot' );
                $user->addGroup( 'sysop' );
-               MediaWikiServices::getInstance()->getPermissionManager()->invalidateUsersRightsCache();
                $this->assertInstanceOf( stdClass::class, $this->doCheckCache( $user ) );
        }
 
index 18299da..a1754fa 100644 (file)
@@ -89,7 +89,6 @@ class ApiUnblockTest extends ApiTestCase {
                $this->setExpectedApiException( 'apierror-permissiondenied-unblock' );
 
                $this->setGroupPermissions( 'sysop', 'block', false );
-               $this->overrideMwServices();
 
                $this->doUnblock();
        }
@@ -142,7 +141,6 @@ class ApiUnblockTest extends ApiTestCase {
                ChangeTags::defineTag( 'custom tag' );
 
                $this->setGroupPermissions( 'user', 'applychangetags', false );
-               $this->overrideMwServices();
 
                $this->doUnblock( [ 'tags' => 'custom tag' ] );
        }
index ce2d8c8..a1bafed 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 
 use MediaWiki\Block\DatabaseBlock;
-use MediaWiki\MediaWikiServices;
 
 /**
  * @group API
@@ -37,8 +36,6 @@ class ApiUserrightsTest extends ApiTestCase {
                if ( $remove ) {
                        $this->mergeMwGlobalArrayValue( 'wgRemoveGroups', [ 'bureaucrat' => $remove ] );
                }
-
-               $this->overrideMwServices();
        }
 
        /**
@@ -78,7 +75,6 @@ class ApiUserrightsTest extends ApiTestCase {
                $res = $this->doApiRequestWithToken( $params );
 
                $user->clearInstanceCache();
-               MediaWikiServices::getInstance()->getPermissionManager()->invalidateUsersRightsCache();
                $this->assertSame( $expectedGroups, $user->getGroups() );
 
                $this->assertArrayNotHasKey( 'warnings', $res[0] );
@@ -221,7 +217,6 @@ class ApiUserrightsTest extends ApiTestCase {
                ChangeTags::defineTag( 'custom tag' );
 
                $this->setGroupPermissions( 'user', 'applychangetags', false );
-               $this->overrideMwServices();
 
                $this->doFailedRightsChange(
                        'You do not have permission to apply change tags along with your changes.',
index de8d815..20bd855 100644 (file)
@@ -148,4 +148,28 @@ class ApiQueryTest extends ApiTestCase {
                        );
                }
        }
+
+       public function testShouldNotExportPagesThatUserCanNotRead() {
+               $title = Title::makeTitle( NS_MAIN, 'Test article' );
+               $this->insertPage( $title );
+
+               $this->setTemporaryHook( 'getUserPermissionsErrors',
+                       function ( Title $page, &$user, $action, &$result ) use ( $title ) {
+                               if ( $page->equals( $title ) && $action === 'read' ) {
+                                       $result = false;
+                                       return false;
+                               }
+                       } );
+
+               $data = $this->doApiRequest( [
+                       'action' => 'query',
+                       'titles' => $title->getPrefixedText(),
+                       'export' => 1,
+               ] );
+
+               $this->assertArrayHasKey( 'query', $data[0] );
+               $this->assertArrayHasKey( 'export', $data[0]['query'] );
+               // This response field contains an XML document even if no pages were exported
+               $this->assertNotContains( $title->getPrefixedText(), $data[0]['query']['export'] );
+       }
 }
index ea45b19..e6a1d38 100644 (file)
@@ -1420,7 +1420,6 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $readOnlyMode->setReason( false );
 
                $this->setGroupPermissions( '*', 'createaccount', false );
-               $this->overrideMwServices();
                $status = $this->manager->checkAccountCreatePermissions( new \User );
                $this->assertFalse( $status->isOK() );
                $this->assertTrue( $status->hasMessage( 'badaccess-groups' ) );
@@ -1447,7 +1446,6 @@ class AuthManagerTest extends \MediaWikiTestCase {
                ];
                $block = new DatabaseBlock( $blockOptions );
                $block->insert();
-               $this->overrideMwServices();
                $status = $this->manager->checkAccountCreatePermissions( $user );
                $this->assertFalse( $status->isOK() );
                $this->assertTrue( $status->hasMessage( 'cantcreateaccount-text' ) );
@@ -2367,8 +2365,6 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $this->mergeMwGlobalArrayValue( 'wgObjectCaches',
                        [ __METHOD__ => [ 'class' => 'HashBagOStuff' ] ] );
                $this->setMwGlobals( [ 'wgMainCacheType' => __METHOD__ ] );
-               // Supply services with updated globals
-               $this->overrideMwServices();
 
                // Set up lots of mocks...
                $mocks = [];
@@ -2553,7 +2549,6 @@ class AuthManagerTest extends \MediaWikiTestCase {
                // IP unable to create accounts
                $this->setGroupPermissions( '*', 'createaccount', false );
                $this->setGroupPermissions( '*', 'autocreateaccount', false );
-               $this->overrideMwServices();
                $session->clear();
                $user = \User::newFromName( $username );
                $this->hook( 'LocalUserCreated', $this->never() );
@@ -2590,7 +2585,6 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $session->clear();
                $user = \User::newFromName( $username );
                $this->hook( 'LocalUserCreated', $this->never() );
-               $this->overrideMwServices();
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( 'ok' ), $ret );
index 4291bcc..7fc070c 100644 (file)
@@ -336,8 +336,7 @@ class LoadBalancerTest extends MediaWikiTestCase {
                                $this->fail( "No exception thrown." );
                        } catch ( DBUnexpectedError $e ) {
                                $this->assertEquals(
-                                       'Wikimedia\Rdbms\LoadBalancer::openConnection: ' .
-                                       'CONN_TRX_AUTOCOMMIT handle has a transaction.',
+                                       'Handle requested with CONN_TRX_AUTOCOMMIT yet it has a transaction',
                                        $e->getMessage()
                                );
                        }
index 58b433f..a03280d 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 use Wikimedia\Assert\ParameterTypeException;
 use Wikimedia\TestingAccessWrapper;
 
index 5c5ce5c..34b2525 100644 (file)
@@ -4,7 +4,6 @@
  * @group Database
  */
 class ArticleTablesTest extends MediaWikiLangTestCase {
-
        /**
         * Make sure that T16404 doesn't strike again. We don't want
         * templatelinks based on the user language when {{int:}} is used, only the
@@ -17,7 +16,7 @@ class ArticleTablesTest extends MediaWikiLangTestCase {
                $title = Title::newFromText( 'T16404' );
                $page = WikiPage::factory( $title );
                $user = new User();
-               $this->overrideUserPermissions( $user, [ 'createpage', 'edit', 'purge' ] );
+               $user->mRights = [ 'createpage', 'edit', 'purge' ];
                $this->setContentLang( 'es' );
                $this->setUserLang( 'fr' );
 
index 524fbdc..b0178fd 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Revision\MutableRevisionRecord;
 use MediaWiki\Revision\RevisionRecord;
index 3ff677e..d5d4ec0 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Tests\Revision\McrSchemaOverride;
 
index fcb10e7..4c95579 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Revision\SlotRecord;
 use MediaWiki\Storage\SqlBlobStore;
index ee6c227..3a3feee 100644 (file)
@@ -1374,7 +1374,6 @@ more stuff
 
                // Now, try the rollback
                $admin->addGroup( 'sysop' ); // Make the test user a sysop
-               MediaWikiServices::getInstance()->getPermissionManager()->invalidateUsersRightsCache();
                $token = $admin->getEditToken( 'rollback' );
                $errors = $page->doRollback(
                        $secondUser->getName(),
index cf0b650..651c871 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Revision\MutableRevisionRecord;
 use MediaWiki\Revision\RevisionStore;
index 016a9a0..c0544f4 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Revision\MutableRevisionRecord;
 use MediaWiki\Revision\RevisionRecord;
index 0a4cf1e..fbef12e 100644 (file)
@@ -9,14 +9,16 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
        protected function setUp() {
                parent::setUp();
 
+               $skinFactory = new SkinFactory();
                // The return value of the closure shouldn't matter since this test should
                // never call it
-               SkinFactory::getDefaultInstance()->register(
+               $skinFactory->register(
                        'fakeskin',
                        'FakeSkin',
                        function () {
                        }
                );
+               $this->setService( 'SkinFactory', $skinFactory );
        }
 
        private static function getModules() {
index 30e9f30..5df52bc 100644 (file)
@@ -16,26 +16,18 @@ class ResourceLoaderOOUIImageModuleTest extends ResourceLoaderTestCase {
                ] );
 
                // Pretend that 'fakemonobook' is a real skin using the Apex theme
-               SkinFactory::getDefaultInstance()->register(
+               $skinFactory = new SkinFactory();
+               $skinFactory->register(
                        'fakemonobook',
                        'FakeMonoBook',
                        function () {
                        }
                );
-               $r = new ReflectionMethod( ExtensionRegistry::class, 'exportExtractedData' );
-               $r->setAccessible( true );
-               $r->invoke( ExtensionRegistry::getInstance(), [
-                       'globals' => [],
-                       'defines' => [],
-                       'callbacks' => [],
-                       'credits' => [],
-                       'autoloaderPaths' => [],
-                       'attributes' => [
-                               'SkinOOUIThemes' => [
-                                       'fakemonobook' => 'Apex',
-                               ],
-                       ],
-               ] );
+               $this->setService( 'SkinFactory', $skinFactory );
+
+               $reset = ExtensionRegistry::getInstance()->setAttributeForTest(
+                       'SkinOOUIThemes', [ 'fakemonobook' => 'Apex' ]
+               );
 
                $styles = $module->getStyles( $this->getResourceLoaderContext( [ 'skin' => 'fakemonobook' ] ) );
                $this->assertRegExp(
index b8bf087..fdd200b 100644 (file)
@@ -336,6 +336,14 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                                'X' . str_repeat( 'x', 251 ) ],
                        // Test decoding and normalization
                        [ '&quot;n&#x303;&#34;', NS_MAIN, 'en', new TitleValue( NS_MAIN, '"ñ"' ) ],
+                       [ 'X#n&#x303;', NS_MAIN, 'en', new TitleValue( NS_MAIN, 'X', 'ñ' ) ],
+                       // target section parsing
+                       'empty fragment' => [ 'X#', NS_MAIN, 'en', new TitleValue( NS_MAIN, 'X' ) ],
+                       'double hash' => [ 'X##', NS_MAIN, 'en', new TitleValue( NS_MAIN, 'X', '#' ) ],
+                       'fragment with hash' => [ 'X#z#z', NS_MAIN, 'en', new TitleValue( NS_MAIN, 'X', 'z#z' ) ],
+                       'fragment with space' => [ 'X#z z', NS_MAIN, 'en', new TitleValue( NS_MAIN, 'X', 'z z' ) ],
+                       'fragment with percent' => [ 'X#z%z', NS_MAIN, 'en', new TitleValue( NS_MAIN, 'X', 'z%z' ) ],
+                       'fragment with amp' => [ 'X#z&z', NS_MAIN, 'en', new TitleValue( NS_MAIN, 'X', 'z&z' ) ],
                ];
        }
 
index 429bda4..53f47a0 100644 (file)
@@ -27,6 +27,8 @@ class ExternalUserNamesTest extends MediaWikiTestCase {
         * @dataProvider provideGetUserLinkTitle
         */
        public function testGetUserLinkTitle( $username, $expected ) {
+               $this->setContentLang( 'en' );
+
                $interwikiLookupMock = $this->getMockBuilder( InterwikiLookup::class )
                        ->getMock();
 
index 9f45c02..e38d77b 100644 (file)
@@ -13,7 +13,6 @@ class LocalIdLookupTest extends MediaWikiTestCase {
                parent::setUp();
 
                $this->setGroupPermissions( 'local-id-lookup-test', 'hideuser', true );
-               $this->overrideMwServices();
        }
 
        public function addDBData() {
index 1dc282c..4862747 100644 (file)
@@ -46,8 +46,6 @@ class UserGroupMembershipTest extends MediaWikiTestCase {
                $this->userTester->addGroup( 'unittesters' );
                $this->expiryTime = wfTimestamp( TS_MW, time() + 100500 );
                $this->userTester->addGroup( 'testwriters', $this->expiryTime );
-
-               $this->overrideMwServices();
        }
 
        /**
index 2379bc2..aa6ae48 100644 (file)
@@ -124,7 +124,7 @@ class UserTest extends MediaWikiTestCase {
                        $rights = array_diff( $rights, [ 'writetest' ] );
                } ] ] );
 
-               $this->overrideMwServices();
+               $userWrapper->mRights = null;
                $rights = $user->getRights();
                $this->assertContains( 'test', $rights );
                $this->assertContains( 'runtest', $rights );
@@ -146,7 +146,7 @@ class UserTest extends MediaWikiTestCase {
                $mockRequest->method( 'getSession' )->willReturn( $session );
                $userWrapper->mRequest = $mockRequest;
 
-               $this->overrideMwServices();
+               $userWrapper->mRights = null;
                $rights = $user->getRights();
                $this->assertContains( 'test', $rights );
                $this->assertNotContains( 'runtest', $rights );
@@ -924,11 +924,9 @@ class UserTest extends MediaWikiTestCase {
 
                $this->setMwGlobals( 'wgRateLimitsExcludedIPs', [] );
                $noRateLimitUser = $this->getMockBuilder( User::class )->disableOriginalConstructor()
-                       ->setMethods( [ 'getIP', 'getId', 'getGroups' ] )->getMock();
+                       ->setMethods( [ 'getIP', 'getRights' ] )->getMock();
                $noRateLimitUser->expects( $this->any() )->method( 'getIP' )->willReturn( '1.2.3.4' );
-               $noRateLimitUser->expects( $this->any() )->method( 'getId' )->willReturn( 0 );
-               $noRateLimitUser->expects( $this->any() )->method( 'getGroups' )->willReturn( [] );
-               $this->overrideUserPermissions( $noRateLimitUser, 'noratelimit' );
+               $noRateLimitUser->expects( $this->any() )->method( 'getRights' )->willReturn( [ 'noratelimit' ] );
                $this->assertFalse( $noRateLimitUser->isPingLimitable() );
        }
 
index 7ec2d37..72db766 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\Revision\RevisionLookup;
 use MediaWiki\Revision\RevisionRecord;
index dcbb101..69f9c38 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 use MediaWiki\Session\SessionProvider;
 use MediaWiki\Session\SessionInfo;
 use MediaWiki\Session\SessionBackend;
index cfc01ea..9641802 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
 use Psr\Log\LoggerInterface;