From: jenkins-bot Date: Mon, 29 Oct 2018 20:59:59 +0000 (+0000) Subject: Merge "Hard deprecate $wgTidyConfig['driver'] = 'disabled'" X-Git-Tag: 1.34.0-rc.0~3620 X-Git-Url: http://git.cyclocoop.org/%7B%24admin_url%7Dmes_infos.php?a=commitdiff_plain;h=824936c08f91ed2a75eda63184bb8aa8e600c684;hp=661c43f3ebea4256e32fb0523cbc9a7f198b635f;p=lhc%2Fweb%2Fwiklou.git Merge "Hard deprecate $wgTidyConfig['driver'] = 'disabled'" --- diff --git a/.gitignore b/.gitignore index 35c8fc67cc..44f739e731 100644 --- a/.gitignore +++ b/.gitignore @@ -21,7 +21,7 @@ project.index sublime-* sftp-config.json ## Visual Studio Code -*.vscode +*.vscode/ # MediaWiki install & usage /cache diff --git a/RELEASE-NOTES-1.33 b/RELEASE-NOTES-1.33 index e3bd20810d..42fa12ac45 100644 --- a/RELEASE-NOTES-1.33 +++ b/RELEASE-NOTES-1.33 @@ -66,6 +66,9 @@ because of Phabricator reports. * The "Parsoid v1" compatibility mappings in ParsoidVirtualRESTService and RestbaseVirtualRESTService, deprecated since 1.26, have been removed. Use the RESTBase v1 or Parsoid v3 API instead. +* ParserOptions defaults 'tidy' to true now, since the untidy modes of the + parser are being deprecated and ParserOptions::getCanonicalOverrides() + has always been true at any rate. * … === Deprecations in 1.33 === @@ -78,9 +81,16 @@ because of Phabricator reports. applied for Arabic and Malayalam in the future. Please enable these on your local wiki (if you have them explicitly set to false) and run maintenance/cleanupTitles.php to fix any existing page titles. +* OutputPage::parse() and OutputPage::parseInline() have been deprecated + due to untidy output and inconsistent handling of wrapper divs and + interface/content language defaults. Use OutputPage::parseAsContent(), + OutputPage::parseAsInterface(), or OutputPage::parseInlineAsInterface() + as appropriate. * The LegacyHookPreAuthenticationProvider class, deprecated since its creation in 1.27 as part of the AuthManager re-write, now emits deprecation warnings. This will help identify the issue if you added it to $wgAuthManagerConfig. +* wfSplitWikiId() is now deprecated. Cache key generation should have the wiki + domain ID as a key component and use makeGlobalKey(). * … === Other changes in 1.33 === diff --git a/autoload.php b/autoload.php index f951ce96f5..6df039c0cf 100644 --- a/autoload.php +++ b/autoload.php @@ -706,6 +706,7 @@ $wgAutoloadLocalClasses = [ 'JobQueueAggregatorRedis' => __DIR__ . '/includes/jobqueue/aggregator/JobQueueAggregatorRedis.php', 'JobQueueConnectionError' => __DIR__ . '/includes/jobqueue/JobQueue.php', 'JobQueueDB' => __DIR__ . '/includes/jobqueue/JobQueueDB.php', + 'JobQueueEnqueueUpdate' => __DIR__ . '/includes/deferred/JobQueueEnqueueUpdate.php', 'JobQueueError' => __DIR__ . '/includes/jobqueue/JobQueue.php', 'JobQueueFederated' => __DIR__ . '/includes/jobqueue/JobQueueFederated.php', 'JobQueueGroup' => __DIR__ . '/includes/jobqueue/JobQueueGroup.php', @@ -1543,6 +1544,7 @@ $wgAutoloadLocalClasses = [ 'UserBlockedError' => __DIR__ . '/includes/exception/UserBlockedError.php', 'UserCache' => __DIR__ . '/includes/cache/UserCache.php', 'UserDupes' => __DIR__ . '/maintenance/userDupes.inc', + 'UserEditCountUpdate' => __DIR__ . '/includes/deferred/UserEditCountUpdate.php', 'UserGroupExpiryJob' => __DIR__ . '/includes/jobqueue/jobs/UserGroupExpiryJob.php', 'UserGroupMembership' => __DIR__ . '/includes/user/UserGroupMembership.php', 'UserMailer' => __DIR__ . '/includes/mail/UserMailer.php', diff --git a/docs/hooks.txt b/docs/hooks.txt index ffefe97879..f9ae150aab 100644 --- a/docs/hooks.txt +++ b/docs/hooks.txt @@ -2876,7 +2876,9 @@ $context: ResourceLoaderContext|null ResourceLoaderStartUpModule::getConfigSettings(). Use this to export static configuration variables to JavaScript. Things that depend on the current page or request state must be added through MakeGlobalVariablesScript instead. +Skin is made available for skin specific config. &$vars: [ variable name => value ] +$skin: Skin 'ResourceLoaderJqueryMsgModuleMagicWords': Called in ResourceLoaderJqueryMsgModule to allow adding magic words for jQueryMsg. diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index 4531b5401b..6e95871885 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -2656,6 +2656,7 @@ function wfWikiID() { * @param string $wiki * * @return array + * @deprecated 1.32 */ function wfSplitWikiID( $wiki ) { $bits = explode( '-', $wiki, 2 ); diff --git a/includes/MediaWiki.php b/includes/MediaWiki.php index 00caca97ad..35a8c90811 100644 --- a/includes/MediaWiki.php +++ b/includes/MediaWiki.php @@ -900,9 +900,6 @@ class MediaWiki { __METHOD__ ); - // Important: this must be the last deferred update added (T100085, T154425) - DeferredUpdates::addCallableUpdate( [ JobQueueGroup::class, 'pushLazyJobs' ] ); - // Do any deferred jobs; preferring to run them now if a client will not wait on them DeferredUpdates::doUpdates( $blocksHttpClient ? 'enqueue' : 'run' ); diff --git a/includes/MovePage.php b/includes/MovePage.php index ecd12c6f8e..5213fc171d 100644 --- a/includes/MovePage.php +++ b/includes/MovePage.php @@ -543,6 +543,13 @@ class MovePage { $nullRevId = $nullRevision->insertOn( $dbw ); $logEntry->setAssociatedRevId( $nullRevId ); + /** + * T163966 + * Increment user_editcount during page moves + * Moved from SpecialMovepage.php per T195550 + */ + $user->incEditCount(); + if ( !$redirectContent ) { // Clean up the old title *before* reset article id - T47348 WikiPage::onArticleDelete( $this->oldTitle ); diff --git a/includes/OutputPage.php b/includes/OutputPage.php index ca3f6a31b2..aa2afe962d 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -1935,23 +1935,14 @@ class OutputPage extends ContextSource { private function addWikiTextTitleInternal( $text, Title $title, $linestart, $tidy, $interface, $wrapperClass = null ) { - global $wgParser; - if ( !$tidy ) { wfDeprecated( 'disabling tidy', '1.32' ); } - $popts = $this->parserOptions(); - $oldTidy = $popts->setTidy( $tidy ); - $popts->setInterfaceMessage( (bool)$interface ); - - $parserOutput = $wgParser->getFreshParser()->parse( - $text, $title, $popts, - $linestart, true, $this->mRevisionId + $parserOutput = $this->parseInternal( + $text, $title, $linestart, $tidy, $interface, /*language*/null ); - $popts->setTidy( $oldTidy ); - $this->addParserOutput( $parserOutput, [ 'enableSectionEditLinks' => false, 'wrapperDivClass' => $wrapperClass ?? '', @@ -2091,6 +2082,9 @@ class OutputPage extends ContextSource { /** * Parse wikitext and return the HTML. * + * @todo The output is wrapped in a
iff $interface is false; it's + * probably best to always strip the wrapper. + * * @param string $text * @param bool $linestart Is this the start of a line? * @param bool $interface Use interface language (instead of content language) while parsing @@ -2099,54 +2093,144 @@ class OutputPage extends ContextSource { * @param Language|null $language Target language object, will override $interface * @throws MWException * @return string HTML + * @deprecated since 1.33, due to untidy output and inconsistent wrapper; + * use parseAsContent() if $interface is default value or false, or else + * parseAsInterface() if $interface is true. */ public function parse( $text, $linestart = true, $interface = false, $language = null ) { + return $this->parseInternal( + $text, $this->getTitle(), $linestart, /*tidy*/false, $interface, $language + )->getText( [ + 'enableSectionEditLinks' => false, + ] ); + } + + /** + * Parse wikitext *in the page content language* and return the HTML. + * The result will be language-converted to the user's preferred variant. + * Output will be tidy. + * + * @param string $text Wikitext in the page content language + * @param bool $linestart Is this the start of a line? (Defaults to true) + * @throws MWException + * @return string HTML + * @since 1.33 + */ + public function parseAsContent( $text, $linestart = true ) { + return $this->parseInternal( + $text, $this->getTitle(), $linestart, /*tidy*/true, /*interface*/false, /*language*/null + )->getText( [ + 'enableSectionEditLinks' => false, + 'wrapperDivClass' => '' + ] ); + } + + /** + * Parse wikitext *in the user interface language* and return the HTML. + * The result will not be language-converted, as user interface messages + * are already localized into a specific variant. + * Output will be tidy. + * + * @param string $text Wikitext in the user interface language + * @param bool $linestart Is this the start of a line? (Defaults to true) + * @throws MWException + * @return string HTML + * @since 1.33 + */ + public function parseAsInterface( $text, $linestart = true ) { + return $this->parseInternal( + $text, $this->getTitle(), $linestart, /*tidy*/true, /*interface*/true, /*language*/null + )->getText( [ + 'enableSectionEditLinks' => false, + 'wrapperDivClass' => '' + ] ); + } + + /** + * Parse wikitext *in the user interface language*, strip + * paragraph wrapper, and return the HTML. + * The result will not be language-converted, as user interface messages + * are already localized into a specific variant. + * Output will be tidy. Outer paragraph wrapper will only be stripped + * if the result is a single paragraph. + * + * @param string $text Wikitext in the user interface language + * @param bool $linestart Is this the start of a line? (Defaults to true) + * @throws MWException + * @return string HTML + * @since 1.33 + */ + public function parseInlineAsInterface( $text, $linestart = true ) { + return Parser::stripOuterParagraph( + $this->parseAsInterface( $text, $linestart ) + ); + } + + /** + * Parse wikitext, strip paragraph wrapper, and return the HTML. + * + * @param string $text + * @param bool $linestart Is this the start of a line? + * @param bool $interface Use interface language (instead of content language) while parsing + * language sensitive magic words like GRAMMAR and PLURAL + * @return string HTML + * @deprecated since 1.33, due to untidy output and confusing default + * for $interface. Use parseInlineAsInterface() if $interface is + * the default value or false, or else use + * Parser::stripOuterParagraph($outputPage->parseAsContent(...)). + */ + public function parseInline( $text, $linestart = true, $interface = false ) { + $parsed = $this->parseInternal( + $text, $this->getTitle(), $linestart, /*tidy*/false, $interface, /*language*/null + )->getText( [ + 'enableSectionEditLinks' => false, + 'wrapperDivClass' => '', /* no wrapper div */ + ] ); + return Parser::stripOuterParagraph( $parsed ); + } + + /** + * Parse wikitext and return the HTML (internal implementation helper) + * + * @param string $text + * @param Title The title to use + * @param bool $linestart Is this the start of a line? + * @param bool $tidy Whether the output should be tidied + * @param bool $interface Use interface language (instead of content language) while parsing + * language sensitive magic words like GRAMMAR and PLURAL. This also disables + * LanguageConverter. + * @param Language|null $language Target language object, will override $interface + * @throws MWException + * @return ParserOutput + */ + private function parseInternal( $text, $title, $linestart, $tidy, $interface, $language ) { global $wgParser; - if ( is_null( $this->getTitle() ) ) { + if ( is_null( $title ) ) { throw new MWException( 'Empty $mTitle in ' . __METHOD__ ); } $popts = $this->parserOptions(); - if ( $interface ) { - $popts->setInterfaceMessage( true ); - } + $oldTidy = $popts->setTidy( $tidy ); + $oldInterface = $popts->setInterfaceMessage( (bool)$interface ); + if ( $language !== null ) { $oldLang = $popts->setTargetLanguage( $language ); } $parserOutput = $wgParser->getFreshParser()->parse( - $text, $this->getTitle(), $popts, + $text, $title, $popts, $linestart, true, $this->mRevisionId ); - if ( $interface ) { - $popts->setInterfaceMessage( false ); - } + $popts->setTidy( $oldTidy ); + $popts->setInterfaceMessage( $oldInterface ); + if ( $language !== null ) { $popts->setTargetLanguage( $oldLang ); } - return $parserOutput->getText( [ - 'enableSectionEditLinks' => false, - ] ); - } - - /** - * Parse wikitext, strip paragraphs, and return the HTML. - * - * @todo This doesn't work as expected at all. If $interface is false, there's always a - * wrapping
, so stripOuterParagraph() does nothing. - * - * @param string $text - * @param bool $linestart Is this the start of a line? - * @param bool $interface Use interface language (instead of content language) while parsing - * language sensitive magic words like GRAMMAR and PLURAL - * @return string HTML - */ - public function parseInline( $text, $linestart = true, $interface = false ) { - $parsed = $this->parse( $text, $linestart, $interface ); - return Parser::stripOuterParagraph( $parsed ); + return $parserOutput; } /** diff --git a/includes/ProtectionForm.php b/includes/ProtectionForm.php index 0d0654e8fa..bb8eba125f 100644 --- a/includes/ProtectionForm.php +++ b/includes/ProtectionForm.php @@ -317,7 +317,7 @@ class ProtectionForm { ); if ( !$status->isOK() ) { - $this->show( $out->parseInline( $status->getWikiText() ) ); + $this->show( $out->parseInlineAsInterface( $status->getWikiText() ) ); return false; } diff --git a/includes/api/ApiFormatBase.php b/includes/api/ApiFormatBase.php index 234fcfdd5e..9d6914579f 100644 --- a/includes/api/ApiFormatBase.php +++ b/includes/api/ApiFormatBase.php @@ -252,6 +252,7 @@ abstract class ApiFormatBase extends ApiBase { $out = new OutputPage( $context ); $context->setOutput( $out ); + $out->setRobotPolicy( 'noindex,nofollow' ); $out->addModuleStyles( 'mediawiki.apipretty' ); $out->setPageTitle( $context->msg( 'api-format-title' ) ); diff --git a/includes/api/ApiHelp.php b/includes/api/ApiHelp.php index 72509c233e..84fcbeff7b 100644 --- a/includes/api/ApiHelp.php +++ b/includes/api/ApiHelp.php @@ -44,6 +44,7 @@ class ApiHelp extends ApiBase { $context->setLanguage( $this->getMain()->getLanguage() ); $context->setTitle( SpecialPage::getTitleFor( 'ApiHelp' ) ); $out = new OutputPage( $context ); + $out->setRobotPolicy( 'noindex,nofollow' ); $out->setCopyrightUrl( 'https://www.mediawiki.org/wiki/Special:MyLanguage/Copyright' ); $context->setOutput( $out ); diff --git a/includes/api/i18n/lb.json b/includes/api/i18n/lb.json index f68bd699cc..b959a6dd31 100644 --- a/includes/api/i18n/lb.json +++ b/includes/api/i18n/lb.json @@ -210,6 +210,7 @@ "apierror-articleexists": "Den Artikel deen dir probéiert hutt unzeleeë gouf schonn ugeluecht.", "apierror-autoblocked": "Är IP-Adress gouf automatesch gespaart well se vun engem gespaarte Benotzer benotzt gouf.", "apierror-badip": "IP-Parameter ass net valabel.", + "apierror-blocked-partial": "Dir gouft gespaart fir dës säit z'änneren.", "apierror-cantblock": "Dir hutt net d'Recht fir Benotzer ze spären.", "apierror-cantimport": "Dir hutt net déi néideg Rechter fir Säiten z'importéieren.", "apierror-copyuploadbadurl": "D'Eroplueden ass vun dëser URL net erlaabt.", diff --git a/includes/cache/MessageCache.php b/includes/cache/MessageCache.php index 5dee0f696c..5ada42fb77 100644 --- a/includes/cache/MessageCache.php +++ b/includes/cache/MessageCache.php @@ -516,7 +516,7 @@ class MessageCache { foreach ( $res as $row ) { $name = $this->contLang->lcfirst( $row->page_title ); // Include entries/stubs for all keys in $mostused in adaptive mode - if ( $wgAdaptiveMessageCache || isset( $overridable[$name] ) ) { + if ( $wgAdaptiveMessageCache || $this->isMainCacheable( $name, $overridable ) ) { $cache[$row->page_title] = '!TOO BIG'; } // At least include revision ID so page changes are reflected in the hash @@ -538,7 +538,7 @@ class MessageCache { foreach ( $res as $row ) { $name = $this->contLang->lcfirst( $row->page_title ); // Include entries/stubs for all keys in $mostused in adaptive mode - if ( $wgAdaptiveMessageCache || isset( $overridable[$name] ) ) { + if ( $wgAdaptiveMessageCache || $this->isMainCacheable( $name, $overridable ) ) { $text = Revision::getRevisionText( $row ); if ( $text === false ) { // Failed to fetch data; possible ES errors? @@ -574,6 +574,17 @@ class MessageCache { return $cache; } + /** + * @param string $name Message name with lowercase first letter + * @param array $overridable Map of (key => unused) for software-defined messages + * @return bool + */ + private function isMainCacheable( $name, array $overridable ) { + // Include common conversion table pages. This also avoids problems with + // Installer::parse() bailing out due to disallowed DB queries (T207979). + return ( isset( $overridable[$name] ) || strpos( $name, 'conversiontable/' ) === 0 ); + } + /** * Updates cache as necessary when message page is changed * @@ -1042,7 +1053,8 @@ class MessageCache { ); } else { // Message page either does not exist or does not override a software message - if ( !isset( $this->overridable[$this->contLang->lcfirst( $title )] ) ) { + $name = $this->contLang->lcfirst( $title ); + if ( !$this->isMainCacheable( $name, $this->overridable ) ) { // Message page does not override any software-defined message. A custom // message might be defined to have content or settings specific to the wiki. // Load the message page, utilizing the individual message cache as needed. diff --git a/includes/deferred/JobQueueEnqueueUpdate.php b/includes/deferred/JobQueueEnqueueUpdate.php new file mode 100644 index 0000000000..1691da216e --- /dev/null +++ b/includes/deferred/JobQueueEnqueueUpdate.php @@ -0,0 +1,64 @@ + IJobSpecification[]) */ + private $jobsByDomain; + + /** + * @param string $domain DB domain ID + * @param IJobSpecification[] $jobs + */ + public function __construct( $domain, array $jobs ) { + $this->jobsByDomain[$domain] = $jobs; + } + + public function merge( MergeableUpdate $update ) { + /** @var JobQueueEnqueueUpdate $update */ + Assert::parameterType( __CLASS__, $update, '$update' ); + + foreach ( $update->jobsByDomain as $domain => $jobs ) { + $this->jobsByDomain[$domain] = $this->jobsByDomain[$domain] ?? []; + $this->jobsByDomain[$domain] = array_merge( $this->jobsByDomain[$domain], $jobs ); + } + } + + public function doUpdate() { + foreach ( $this->jobsByDomain as $domain => $jobs ) { + $group = JobQueueGroup::singleton( $domain ); + try { + $group->push( $jobs ); + } catch ( Exception $e ) { + // Get in as many jobs as possible and let other post-send updates happen + MWExceptionHandler::logException( $e ); + } + } + } +} diff --git a/includes/deferred/MergeableUpdate.php b/includes/deferred/MergeableUpdate.php index 8eeef13bbe..6ae2bcc9e1 100644 --- a/includes/deferred/MergeableUpdate.php +++ b/includes/deferred/MergeableUpdate.php @@ -1,8 +1,17 @@ ('increment': int, 'instances': User[])) */ + private $infoByUser; + + /** + * @param User $user + * @param int $increment + */ + public function __construct( User $user, $increment ) { + if ( !$user->getId() ) { + throw new RuntimeException( "Got user ID of zero" ); + } + $this->infoByUser = [ + $user->getId() => [ 'increment' => $increment, 'instances' => [ $user ] ] + ]; + } + + public function merge( MergeableUpdate $update ) { + /** @var UserEditCountUpdate $update */ + Assert::parameterType( __CLASS__, $update, '$update' ); + + foreach ( $update->infoByUser as $userId => $info ) { + if ( !isset( $this->infoByUser[$userId] ) ) { + $this->infoByUser[$userId] = [ 'increment' => 0, 'instances' => [] ]; + } + // Merge the increment amount + $this->infoByUser[$userId]['increment'] += $info['increment']; + // Merge the list of User instances to update in doUpdate() + foreach ( $info['instances'] as $user ) { + if ( !in_array( $user, $this->infoByUser[$userId]['instances'], true ) ) { + $this->infoByUser[$userId]['instances'][] = $user; + } + } + } + } + + /** + * Purges the list of URLs passed to the constructor. + */ + public function doUpdate() { + $lb = MediaWikiServices::getInstance()->getDBLoadBalancer(); + $dbw = $lb->getConnection( DB_MASTER ); + + ( new AutoCommitUpdate( $dbw, __METHOD__, function () use ( $lb, $dbw ) { + foreach ( $this->infoByUser as $userId => $info ) { + $dbw->update( + 'user', + [ 'user_editcount=user_editcount+' . (int)$info['increment'] ], + [ 'user_id' => $userId, 'user_editcount IS NOT NULL' ], + __METHOD__ + ); + /** @var User[] $affectedInstances */ + $affectedInstances = $info['instances']; + // Lazy initialization check... + if ( $dbw->affectedRows() == 0 ) { + // No rows will be "affected" if user_editcount is NULL. + // Check if the generic "replica" connection is not the master. + $dbr = $lb->getConnection( DB_REPLICA ); + if ( $dbr !== $dbw ) { + // This method runs after the new revisions were committed. + // Wait for the replica to catch up so they will all be counted. + $dbr->flushSnapshot( __METHOD__ ); + $lb->safeWaitForMasterPos( $dbr ); + } + $affectedInstances[0]->initEditCountInternal(); + } + $newCount = (int)$dbw->selectField( + 'user', + [ 'user_editcount' ], + [ 'user_id' => $userId ], + __METHOD__ + ); + + // Update the edit count in the instance caches. This is mostly useful + // for maintenance scripts, where deferred updates might run immediately + // and user instances might be reused for a long time. + foreach ( $affectedInstances as $affectedInstance ) { + $affectedInstance->setEditCountInternal( $newCount ); + } + // Clear the edit count in user cache too + $affectedInstances[0]->invalidateCache(); + } + } ) )->doUpdate(); + } +} diff --git a/includes/installer/i18n/ja.json b/includes/installer/i18n/ja.json index 3ad6073817..a649a811e5 100644 --- a/includes/installer/i18n/ja.json +++ b/includes/installer/i18n/ja.json @@ -23,7 +23,8 @@ "ネイ", "Suchichi02", "Omotecho", - "Yusuke1109" + "Yusuke1109", + "Aefgh39622" ] }, "config-desc": "MediaWiki のインストーラー", @@ -322,12 +323,12 @@ "config-install-mainpage-failed": "メインページを挿入できませんでした: $1", "config-install-done": "おめでとうございます!\nMediaWikiのインストールに成功しました。\n\nLocalSettings.phpファイルが生成されました。\nこのファイルはすべての設定を含んでいます。\n\nこれをダウンロードして、ウィキをインストールした基準ディレクトリ (index.phpと同じディレクトリ) に設置する必要があります。ダウンロードは自動的に開始されるはずです。\n\nダウンロードが開始されていない場合、またはダウンロードをキャンセルした場合は、下記のリンクをクリックしてダウンロードを再開できます:\n\n$3\n\n注意: この生成された設定ファイルをダウンロードせずにインストールを終了すると、このファイルは利用できなくなります。\n\n上記の作業が完了すると、[$2 ウィキに入る]ことができます。", "config-install-done-path": "おめでとうございます!\nMediaWikiのインストールに成功しました。\n\nLocalSettings.phpファイルが生成されました。\nこのファイルはすべての設定を含んでいます。\n\nこれをダウンロードして、$4 に設置する必要があります。ダウンロードは自動的に開始されるはずです。\n\nダウンロードが開始されていない場合、またはダウンロードをキャンセルした場合は、下記のリンクをクリックしてダウンロードを再開できます:\n\n$3\n\n注意: この生成された設定ファイルをダウンロードせずにインストールを終了すると、このファイルは利用できなくなります。\n\n上記の作業が完了すると、[$2 ウィキに入る]ことができます。", - "config-install-success": "MediaWikiが正常にインストールされました。\n今すぐ<$1$2>にアクセスしてあなたのwikiを表示できます。\nご質問がある場合は、よくある質問リストをご覧ください:\nまたは\nそのページにリンクされているサポートフォーラム", + "config-install-success": "MediaWikiが正常にインストールされました。\n今すぐ<$1$2>にアクセスしてあなたのwikiを表示できます。\nご質問がある場合は、よくある質問リストをご覧ください:\nまたは\nそのページにリンクされているサポートフォーラム", "config-download-localsettings": "LocalSettings.php をダウンロード", "config-help": "ヘルプ", "config-help-tooltip": "クリックで展開", "config-nofile": "ファイル「$1」が見つかりませんでした。削除された可能性があります。", - "config-extension-link": "あなたのウィキは[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 拡張機能]をサポートしていることをご存知ですか?\n\n[https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category カテゴリ別で拡張機能を見る]か[https://www.mediawiki.org/wiki/Extension_Matrix 拡張機能のマトリックス]で拡張機能すべてのリストをご覧になれます。", + "config-extension-link": "ご利用のウィキは[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 拡張機能]をサポートしていることをご存知でしたか?\n\n[https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category 「カテゴリ別で拡張機能を見る」]か[https://www.mediawiki.org/wiki/Extension_Matrix 「拡張機能のマトリックス」]のページで拡張機能すべてのリストをご覧になれます。", "config-skins-screenshots": "$1 (スクリーンショット: $2)", "config-extensions-requires": "$1($2が必要)", "config-screenshot": "スクリーンショット", diff --git a/includes/installer/i18n/pt.json b/includes/installer/i18n/pt.json index 96dfa702cf..c4c8c43823 100644 --- a/includes/installer/i18n/pt.json +++ b/includes/installer/i18n/pt.json @@ -60,7 +60,7 @@ "config-help-restart": "Deseja limpar todos os dados gravados que introduziu e reiniciar o processo de instalação?", "config-restart": "Sim, reiniciar", "config-welcome": "=== Verificações do ambiente ===\nSerão agora realizadas verificações básicas para determinar se este ambiente é apropriado para instalação do MediaWiki.\nLembre-se de fornecer esta informação se necessitar de pedir ajuda para concluir a instalação.", - "config-copyright": "=== Direitos de autor e Condições de uso ===\n\n$1\n\nEste programa é software livre; pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License, tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.\n\nEste programa é distribuído na esperança de que seja útil, mas '''sem qualquer garantia'''; inclusive, sem a garantia implícita da '''possibilidade de ser comercializado''' ou de '''adequação para qualquer finalidade específica'''.\nConsulte a licença GNU General Public License para mais detalhes.\n\nEm conjunto com este programa deve ter recebido uma cópia da licença GNU General Public License; se não a recebeu, peça-a por escrito a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [https://www.gnu.org/copyleft/gpl.html leia-a na internet].", + "config-copyright": "=== Direitos de autor e Condições de utilização ===\n\n$1\n\nEste programa é software livre; pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License, tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.\n\nEste programa é distribuído na esperança de que seja útil, mas '''sem qualquer garantia'''; inclusive, sem a garantia implícita da '''possibilidade de ser comercializado''' ou de '''adequação para qualquer finalidade específica'''.\nConsulte a licença GNU General Public License para mais detalhes.\n\nEm conjunto com este programa deve ter recebido uma cópia da licença GNU General Public License; se não a recebeu, peça-a por escrito a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [https://www.gnu.org/copyleft/gpl.html leia-a na Internet].", "config-sidebar": "* [https://www.mediawiki.org/wiki/MediaWiki/pt Página principal do MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/pt Ajuda]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/pt Manual técnico]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* Leia-me\n* Notas de lançamento\n* Cópia\n* Atualização", "config-env-good": "O ambiente foi verificado.\nPode instalar o MediaWiki.", "config-env-bad": "O ambiente foi verificado.\nNão pode instalar o MediaWiki.", diff --git a/includes/installer/i18n/sr-ec.json b/includes/installer/i18n/sr-ec.json index 58c40ce430..430602b047 100644 --- a/includes/installer/i18n/sr-ec.json +++ b/includes/installer/i18n/sr-ec.json @@ -182,7 +182,7 @@ "config-help": "помоћ", "config-help-tooltip": "кликните да бисте проширили", "config-nofile": "Није могуће пронаћи датотеку „$1”. Да није избрисана?", - "config-extension-link": "Јесте ли знали да ваш вики подржава [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions додатке]?\n\nМожете их прегледати [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category по категорији] или помоћу [https://www.mediawiki.org/wiki/Extension_Matrix Extension Matrix-а] да бисте видели потпуни списак.", + "config-extension-link": "Јесте ли знали да ваш вики подржава [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions додатке]?\n\nМожете их прегледати [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category по категорији].", "config-skins-screenshots": "„$1” (снимци екрана: $2)", "config-skins-screenshot": "$1 ($2)", "config-extensions-requires": "$1 (захтева $2)", diff --git a/includes/installer/i18n/vi.json b/includes/installer/i18n/vi.json index ca87d6084e..ed80af6482 100644 --- a/includes/installer/i18n/vi.json +++ b/includes/installer/i18n/vi.json @@ -7,22 +7,23 @@ "Dinhxuanduyet", "Nguyên Lê", "Macofe", - "Leducthn" + "Leducthn", + "Vinhtantran" ] }, "config-desc": "Trình cài đặt MediaWiki", "config-title": "Cài đặt MediaWiki $1", "config-information": "Thông tin", - "config-localsettings-upgrade": "Một tập tin LocalSettings.php đã được phát hiện.\nĐể nâng cấp bản cài đặt này, xin nhập giá trị của $wgUpgradeKey trong hộp thoại bên dưới đây.\nBạn sẽ tìm thấy nó trong LocalSettings.php.", - "config-localsettings-cli-upgrade": "Một tập tin LocalSettings.php đã được phát hiện.\nĐể nâng cấp bản cài đặt này, hãy chạy update.php thay thế.", - "config-localsettings-key": "Chìa khóa nâng cấp:", - "config-localsettings-badkey": "Bạn đã cung cấp một chìa khóa nâng cấp sai.", - "config-upgrade-key-missing": "Một bản cài đặt MediaWiki sẵn đã được phát hiện.\nĐể nâng cấp bản cài đặt này, hãy thêm dòng sau vào cuối LocalSettings.php:\n\n$1", + "config-localsettings-upgrade": "Phát hiện tập tin LocalSettings.php.\nĐể nâng cấp bản cài đặt này, xin nhập giá trị của $wgUpgradeKey trong hộp thoại bên dưới đây.\nBạn sẽ tìm thấy nó trong LocalSettings.php.", + "config-localsettings-cli-upgrade": "Phát hiện tập tin LocalSettings.php.\nĐể nâng cấp bản cài đặt này, hãy chạy update.php thay thế.", + "config-localsettings-key": "Khóa nâng cấp:", + "config-localsettings-badkey": "Bạn đã cung cấp một khóa nâng cấp sai.", + "config-upgrade-key-missing": "Phát hiện thấy đã có sẵn một bản cài đặt MediaWiki.\nĐể nâng cấp bản cài đặt này, hãy thêm dòng sau vào cuối LocalSettings.php:\n\n$1", "config-localsettings-incomplete": "Tập tin LocalSettings.php đã tồn tại hình như không hoàn chỉnh.\nBiến $1 chưa được đặt.\nXin hãy thay đổi LocalSettings.php để đặt biến này, rồi bấm “{{int:Config-continue}}”.", - "config-localsettings-connection-error": "Đã xuất hiện lỗi khi kết nối với cơ sở dữ liệu dùng cấu hình trong LocalSettings.php. Xin hãy sửa lại cấu hình và thử lại.\n\n$1", + "config-localsettings-connection-error": "Đã xuất hiện lỗi khi kết nối với cơ sở dữ liệu với cấu hình ghi trong LocalSettings.php. Xin hãy sửa lại cấu hình và thử lại.\n\n$1", "config-session-error": "Lỗi khi bắt đầu phiên làm việc: $1", "config-session-expired": "Dữ liệu phiên làm việc của bạn dường như đã hết hạn. Các phiên làm việc được cấu hình để kéo dài $1. Để tăng thời gian này, đặt session.gc_maxlifetime trong php.ini, rồi khởi động lại quá trình cài đặt.", - "config-no-session": "Đã mất dữ liệu phiên làm việc của bạn! Kiểm tra tập tin php.ini và đảm bảo rằng session.save_path đã được đặt thành một thư mục thích hợp.", + "config-no-session": "Đã mất dữ liệu phiên làm việc của bạn! Kiểm tra tập tin php.ini và đảm bảo rằng session.save_path đã được đặt vào một thư mục thích hợp.", "config-your-language": "Ngôn ngữ của bạn:", "config-your-language-help": "Chọn một ngôn ngữ để sử dụng trong quá trình cài đặt.", "config-wiki-language": "Ngôn ngữ của wiki:", @@ -37,8 +38,8 @@ "config-page-name": "Tên", "config-page-options": "Tùy chọn", "config-page-install": "Cài đặt", - "config-page-complete": "Xong rồi!", - "config-page-restart": "Bắt đầu cài đặt lại", + "config-page-complete": "Đã xong!", + "config-page-restart": "Tái khởi động cài đặt", "config-page-readme": "Đọc trước", "config-page-releasenotes": "Thông báo phát hành", "config-page-copying": "Sao chép", @@ -303,15 +304,17 @@ "config-install-mainpage-failed": "Không thể chèn trang đầu: $1", "config-install-done": "Xin chúc mừng!\nBạn đã cài đặt MediaWiki.\n\nBộ cài đặt đã tạo ra một tập tin LocalSettings.php.\nTập tin này chứa tất cả các cấu hình của bạn.\n\nBạn sẽ cần phải tải nó về và đặt nó trong thư mục cài đặt wiki của bạn (cùng thư mục với index.php). Việc tải về có lẽ sẽ được khởi động tự động.\n\nNếu bản tải về không được cung cấp, hoặc nếu bạn hủy bỏ nó, bạn có thể khởi động lại tải về bằng cách nhấn vào liên kết dưới đây:\n\n$3\n\nLưu ý: Nếu bạn không làm điều này ngay bây giờ, điều này sẽ tạo ra tập tin cấu hình sẽ không có giá trị cho bạn sau này nếu bạn thoát khỏi trình cài đặt mà không tải nó về.\n\nKhi đã việc tải về đã hoàn thành, bạn có thể [$2 truy cập trang wiki của bạn].", "config-install-done-path": "Xin chúc mừng!\nBạn đã cài đặt MediaWiki.\n\nBộ cài đặt đã tạo ra một tập tin LocalSettings.php.\nTập tin này chứa tất cả các cấu hình của bạn.\n\nBạn sẽ cần phải tải nó về và đặt nó tại $4. Việc tải về có lẽ sẽ được khởi động tự động.\n\nNếu bản tải về không được cung cấp, hoặc nếu bạn hủy bỏ nó, bạn có thể khởi động lại tải về bằng cách nhấn vào liên kết dưới đây:\n\n$3\n\nLưu ý: Nếu bạn không làm điều này ngay bây giờ, điều này sẽ tạo ra tập tin cấu hình sẽ không có giá trị cho bạn sau này nếu bạn thoát khỏi trình cài đặt mà không tải nó về.\n\nKhi đã việc tải về đã hoàn thành, bạn có thể [$2 truy cập trang wiki của bạn].", - "config-install-success": "MediaWiki đã được cài đặt thành công. Bây giờ bạn có thể mở <$1$2> để xem wiki của bạn.\nNếu bạn có thắc mắc, hãy đọc các câu thường hỏi:\n hoặc ghé vào một diễn đàn hỗ trợ được liệt kê tại trang đó.", + "config-install-success": "MediaWiki đã được cài đặt thành công. Bây giờ bạn có thể mở <$1$2> để xem wiki của bạn.\nNếu bạn có thắc mắc, hãy đọc các câu thường hỏi:\n hoặc ghé vào một diễn đàn hỗ trợ được liệt kê tại trang đó.", "config-download-localsettings": "Tải về LocalSettings.php", "config-help": "Trợ giúp", "config-help-tooltip": "nhấn chuột để mở rộng", "config-nofile": "Không tìm thấy tập tin “$1”. Nó có phải bị xóa không?", - "config-extension-link": "Bạn có biết rằng wiki của bạn có hỗ trợ [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions mở rộng]?\n\nBạn có thể truy cập [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category phần mở rộng theo thể loại] hoặc [https://www.mediawiki.org/wiki/Extension_Matrix Ma trận Mở rộng] để xem danh sách đầy đủ các phần mở rộng.", + "config-extension-link": "Bạn có biết rằng wiki của bạn có hỗ trợ [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions phần mở rộng]?\n\nBạn có thể truy cập [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category phần mở rộng theo thể loại].", "config-skins-screenshots": "$1 (ảnh chụp màn hình: $2)", "config-extensions-requires": "$1 (cần $2)", "config-screenshot": "ảnh chụp màn hình", + "config-extension-not-found": "Không tìm thấy tập tin đăng ký của bộ mở rộng \"$1$", + "config-extension-dependency": "Lỗi thiếu phần phụ thuộc xảy ra khi đang cài đặt bộ mở rộng \"$1\": $2", "mainpagetext": "'''MediaWiki đã được cài đặt.'''", "mainpagedocfooter": "Xin đọc [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Hướng dẫn sử dụng] để biết thêm thông tin về cách sử dụng phần mềm wiki.\n\n== Để bắt đầu ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Danh sách các thiết lập cấu hình]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Các câu hỏi thường gặp MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư về việc phát hành MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Tìm hiểu cách chống spam tại wiki của bạn]" } diff --git a/includes/jobqueue/JobQueueGroup.php b/includes/jobqueue/JobQueueGroup.php index c05feb4c00..040ed4bf4b 100644 --- a/includes/jobqueue/JobQueueGroup.php +++ b/includes/jobqueue/JobQueueGroup.php @@ -43,9 +43,6 @@ class JobQueueGroup { /** @var array Map of (bucket => (queue => JobQueue, types => list of types) */ protected $coalescedQueues; - /** @var Job[] */ - protected $bufferedJobs = []; - const TYPE_DEFAULT = 1; // integer; jobs popped by default const TYPE_ANY = 2; // integer; any job @@ -199,7 +196,7 @@ class JobQueueGroup { // Throw errors now instead of on push(), when other jobs may be buffered $this->assertValidJobs( $jobs ); - $this->bufferedJobs = array_merge( $this->bufferedJobs, $jobs ); + DeferredUpdates::addUpdate( new JobQueueEnqueueUpdate( $this->wiki, $jobs ) ); } /** @@ -207,17 +204,10 @@ class JobQueueGroup { * * @return void * @since 1.26 + * @deprecated Since 1.33 Not needed anymore */ public static function pushLazyJobs() { - foreach ( self::$instances as $group ) { - try { - $group->push( $group->bufferedJobs ); - $group->bufferedJobs = []; - } catch ( Exception $e ) { - // Get in as many jobs as possible and let other post-send updates happen - MWExceptionHandler::logException( $e ); - } - } + wfDeprecated( __METHOD__, '1.33' ); } /** @@ -460,12 +450,4 @@ class JobQueueGroup { } } } - - function __destruct() { - $n = count( $this->bufferedJobs ); - if ( $n > 0 ) { - $type = implode( ', ', array_unique( array_map( 'get_class', $this->bufferedJobs ) ) ); - trigger_error( __METHOD__ . ": $n buffered job(s) of type(s) $type never inserted." ); - } - } } diff --git a/includes/jobqueue/JobRunner.php b/includes/jobqueue/JobRunner.php index 39b5b3bee4..676659f384 100644 --- a/includes/jobqueue/JobRunner.php +++ b/includes/jobqueue/JobRunner.php @@ -290,8 +290,6 @@ class JobRunner implements LoggerAwareInterface { $status = $job->run(); $error = $job->getLastError(); $this->commitMasterChanges( $lbFactory, $job, $fnameTrxOwner ); - // Important: this must be the last deferred update added (T100085, T154425) - DeferredUpdates::addCallableUpdate( [ JobQueueGroup::class, 'pushLazyJobs' ] ); // Run any deferred update tasks; doUpdates() manages transactions itself DeferredUpdates::doUpdates(); } catch ( Exception $e ) { diff --git a/includes/libs/rdbms/database/Database.php b/includes/libs/rdbms/database/Database.php index 16e8d8b37c..83b9660fd3 100644 --- a/includes/libs/rdbms/database/Database.php +++ b/includes/libs/rdbms/database/Database.php @@ -2038,10 +2038,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $options = [ $options ]; } - $fh = null; - if ( isset( $options['fileHandle'] ) ) { - $fh = $options['fileHandle']; - } + $fh = $options['fileHandle'] ?? null; $options = $this->makeInsertOptions( $options ); if ( isset( $a[0] ) && is_array( $a[0] ) ) { diff --git a/includes/libs/rdbms/database/IDatabase.php b/includes/libs/rdbms/database/IDatabase.php index 4cbe58649b..3d3f855f7d 100644 --- a/includes/libs/rdbms/database/IDatabase.php +++ b/includes/libs/rdbms/database/IDatabase.php @@ -1472,6 +1472,10 @@ interface IDatabase { /** * Wait for the replica DB to catch up to a given master position * + * Note that this does not start any new transactions. If any existing transaction + * is flushed, and this is called, then queries will reflect the point the DB was synced + * up to (on success) without interference from REPEATABLE-READ snapshots. + * * @param DBMasterPos $pos * @param int $timeout The maximum number of seconds to wait for synchronisation * @return int|null Zero if the replica DB was past that position already, diff --git a/includes/libs/rdbms/loadbalancer/LoadBalancer.php b/includes/libs/rdbms/loadbalancer/LoadBalancer.php index 2a6175fbd4..b2b23917e1 100644 --- a/includes/libs/rdbms/loadbalancer/LoadBalancer.php +++ b/includes/libs/rdbms/loadbalancer/LoadBalancer.php @@ -985,6 +985,8 @@ class LoadBalancer implements ILoadBalancer { } /** @var Database $conn */ + $conn = null; + if ( isset( $this->conns[$connInUseKey][$i][$domain] ) ) { // Reuse an in-use connection for the same domain $conn = $this->conns[$connInUseKey][$i][$domain]; @@ -996,22 +998,36 @@ class LoadBalancer implements ILoadBalancer { $this->conns[$connInUseKey][$i][$domain] = $conn; $this->connLogger->debug( __METHOD__ . ": reusing free connection $i/$domain" ); } elseif ( !empty( $this->conns[$connFreeKey][$i] ) ) { - // Reuse a free connection from another domain - $conn = reset( $this->conns[$connFreeKey][$i] ); - $oldDomain = key( $this->conns[$connFreeKey][$i] ); - if ( $domainInstance->getDatabase() !== null ) { - $conn->selectDomain( $domainInstance ); - } else { - // Stay on the current database, but update the schema/prefix - $conn->dbSchema( $domainInstance->getSchema() ); - $conn->tablePrefix( $domainInstance->getTablePrefix() ); + // Reuse a free connection from another domain if possible + foreach ( $this->conns[$connFreeKey][$i] as $oldDomain => $conn ) { + if ( $domainInstance->getDatabase() !== null ) { + // Check if changing the database will require a new connection. + // In that case, leave the connection handle alone and keep looking. + // This prevents connections from being closed mid-transaction and can + // also avoid overhead if the same database will later be requested. + if ( + $conn->databasesAreIndependent() && + $conn->getDBname() !== $domainInstance->getDatabase() + ) { + continue; + } + // Select the new database, schema, and prefix + $conn->selectDomain( $domainInstance ); + } else { + // Stay on the current database, but update the schema/prefix + $conn->dbSchema( $domainInstance->getSchema() ); + $conn->tablePrefix( $domainInstance->getTablePrefix() ); + } + unset( $this->conns[$connFreeKey][$i][$oldDomain] ); + // Note that if $domain is an empty string, getDomainID() might not match it + $this->conns[$connInUseKey][$i][$conn->getDomainId()] = $conn; + $this->connLogger->debug( __METHOD__ . + ": reusing free connection from $oldDomain for $domain" ); + break; } - unset( $this->conns[$connFreeKey][$i][$oldDomain] ); - // Note that if $domain is an empty string, getDomainID() might not match it - $this->conns[$connInUseKey][$i][$conn->getDomainId()] = $conn; - $this->connLogger->debug( __METHOD__ . - ": reusing free connection from $oldDomain for $domain" ); - } else { + } + + if ( !$conn ) { if ( !isset( $this->servers[$i] ) || !is_array( $this->servers[$i] ) ) { throw new InvalidArgumentException( "No server with index '$i'." ); } diff --git a/includes/parser/ParserOptions.php b/includes/parser/ParserOptions.php index a8da3ce930..de67b84740 100644 --- a/includes/parser/ParserOptions.php +++ b/includes/parser/ParserOptions.php @@ -1098,7 +1098,7 @@ class ParserOptions { // *UPDATE* ParserOptions::matches() if any of this changes as needed self::$defaults = [ 'dateformat' => null, - 'tidy' => false, + 'tidy' => true, 'interfaceMessage' => false, 'targetLanguage' => null, 'removeComments' => true, @@ -1164,7 +1164,6 @@ class ParserOptions { global $wgEnableParserLimitReporting; return [ - 'tidy' => true, 'enableLimitReport' => $wgEnableParserLimitReporting, ]; } diff --git a/includes/preferences/DefaultPreferencesFactory.php b/includes/preferences/DefaultPreferencesFactory.php index ad45211b55..3ec6876d79 100644 --- a/includes/preferences/DefaultPreferencesFactory.php +++ b/includes/preferences/DefaultPreferencesFactory.php @@ -463,7 +463,9 @@ class DefaultPreferencesFactory implements PreferencesFactory { $user, ParserOptions::newFromContext( $context ) ); - $oldsigHTML = $context->getOutput()->parseInline( $oldsigWikiText, true, true ); + $oldsigHTML = Parser::stripOuterParagraph( + $context->getOutput()->parseAsContent( $oldsigWikiText ) + ); $defaultPreferences['oldsig'] = [ 'type' => 'info', 'raw' => true, diff --git a/includes/resourceloader/ResourceLoaderStartUpModule.php b/includes/resourceloader/ResourceLoaderStartUpModule.php index e4a753fc16..b5d31efac7 100644 --- a/includes/resourceloader/ResourceLoaderStartUpModule.php +++ b/includes/resourceloader/ResourceLoaderStartUpModule.php @@ -78,10 +78,11 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { $oldCommentSchema = $conf->get( 'CommentTableSchemaMigrationStage' ) === MIGRATION_OLD; // Build list of variables + $skin = $context->getSkin(); $vars = [ 'wgLoadScript' => wfScript( 'load' ), 'debug' => $context->getDebug(), - 'skin' => $context->getSkin(), + 'skin' => $skin, 'stylepath' => $conf->get( 'StylePath' ), 'wgUrlProtocols' => wfUrlProtocols(), 'wgArticlePath' => $conf->get( 'ArticlePath' ), @@ -126,7 +127,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { 'wgCommentCodePointLimit' => $oldCommentSchema ? null : CommentStore::COMMENT_CHARACTER_LIMIT, ]; - Hooks::run( 'ResourceLoaderGetConfigVars', [ &$vars ] ); + Hooks::run( 'ResourceLoaderGetConfigVars', [ &$vars, $skin ] ); return $vars; } diff --git a/includes/specials/SpecialMovepage.php b/includes/specials/SpecialMovepage.php index 2f6dc03b10..5cbad8a33b 100644 --- a/includes/specials/SpecialMovepage.php +++ b/includes/specials/SpecialMovepage.php @@ -789,12 +789,6 @@ class MovePageForm extends UnlistedSpecialPage { # Deal with watches (we don't watch subpages) WatchAction::doWatchOrUnwatch( $this->watch, $ot, $user ); WatchAction::doWatchOrUnwatch( $this->watch, $nt, $user ); - - /** - * T163966 - * Increment user_editcount during page moves - */ - $user->incEditCount(); } function showLogFragment( $title ) { diff --git a/includes/specials/SpecialVersion.php b/includes/specials/SpecialVersion.php index 4e9245f318..c99a422e1f 100644 --- a/includes/specials/SpecialVersion.php +++ b/includes/specials/SpecialVersion.php @@ -716,7 +716,7 @@ class SpecialVersion extends SpecialPage { $vcsDate = null; if ( isset( $extension['version'] ) ) { - $canonicalVersion = $out->parseInline( $extension['version'] ); + $canonicalVersion = $out->parseInlineAsInterface( $extension['version'] ); } if ( isset( $extension['path'] ) ) { @@ -792,7 +792,7 @@ class SpecialVersion extends SpecialPage { if ( isset( $extension['name'] ) ) { $licenseName = null; if ( isset( $extension['license-name'] ) ) { - $licenseName = new HtmlArmor( $out->parseInline( $extension['license-name'] ) ); + $licenseName = new HtmlArmor( $out->parseInlineAsInterface( $extension['license-name'] ) ); } elseif ( $this->getExtLicenseFileName( $extensionPath ) ) { $licenseName = $this->msg( 'version-ext-license' )->text(); } @@ -829,7 +829,7 @@ class SpecialVersion extends SpecialPage { } else { $description = ''; } - $description = $out->parseInline( $description ); + $description = $out->parseInlineAsInterface( $description ); // ... now get the authors for this extension $authors = $extension['author'] ?? []; @@ -981,11 +981,11 @@ class SpecialVersion extends SpecialPage { $list[] = $text; } elseif ( substr( $item, -5 ) == ' ...]' ) { $hasOthers = true; - $list[] = $this->getOutput()->parseInline( + $list[] = $this->getOutput()->parseInlineAsInterface( substr( $item, 0, -4 ) . $this->msg( 'version-poweredby-others' )->text() . "]" ); } else { - $list[] = $this->getOutput()->parseInline( $item ); + $list[] = $this->getOutput()->parseInlineAsInterface( $item ); } } diff --git a/includes/user/User.php b/includes/user/User.php index 9b08737d1f..43be06e717 100644 --- a/includes/user/User.php +++ b/includes/user/User.php @@ -3698,7 +3698,7 @@ class User implements IDBAccessObject, UserIdentity { if ( $count === null ) { // it has not been initialized. do so. - $count = $this->initEditCount(); + $count = $this->initEditCountInternal(); } $this->mEditCount = $count; } @@ -5323,73 +5323,36 @@ class User implements IDBAccessObject, UserIdentity { } /** - * Deferred version of incEditCountImmediate() - * - * This function, rather than incEditCountImmediate(), should be used for - * most cases as it avoids potential deadlocks caused by concurrent editing. + * Schedule a deferred update to update the user's edit count */ public function incEditCount() { - wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle( - function () { - $this->incEditCountImmediate(); - }, - __METHOD__ + if ( $this->isAnon() ) { + return; // sanity + } + + DeferredUpdates::addUpdate( + new UserEditCountUpdate( $this, 1 ), + DeferredUpdates::POSTSEND ); } /** - * Increment the user's edit-count field. - * Will have no effect for anonymous users. - * @since 1.26 + * This method should not be called outside User/UserEditCountUpdate + * + * @param int $count */ - public function incEditCountImmediate() { - if ( $this->isAnon() ) { - return; - } - - $dbw = wfGetDB( DB_MASTER ); - // No rows will be "affected" if user_editcount is NULL - $dbw->update( - 'user', - [ 'user_editcount=user_editcount+1' ], - [ 'user_id' => $this->getId(), 'user_editcount IS NOT NULL' ], - __METHOD__ - ); - // Lazy initialization check... - if ( $dbw->affectedRows() == 0 ) { - // Now here's a goddamn hack... - $dbr = wfGetDB( DB_REPLICA ); - if ( $dbr !== $dbw ) { - // If we actually have a replica DB server, the count is - // at least one behind because the current transaction - // has not been committed and replicated. - $this->mEditCount = $this->initEditCount( 1 ); - } else { - // But if DB_REPLICA is selecting the master, then the - // count we just read includes the revision that was - // just added in the working transaction. - $this->mEditCount = $this->initEditCount(); - } - } else { - if ( $this->mEditCount === null ) { - $this->getEditCount(); - $dbr = wfGetDB( DB_REPLICA ); - $this->mEditCount += ( $dbr !== $dbw ) ? 1 : 0; - } else { - $this->mEditCount++; - } - } - // Edit count in user cache too - $this->invalidateCache(); + public function setEditCountInternal( $count ) { + $this->mEditCount = $count; } /** * Initialize user_editcount from data out of the revision table * - * @param int $add Edits to add to the count from the revision table + * This method should not be called outside User/UserEditCountUpdate + * * @return int Number of edits */ - protected function initEditCount( $add = 0 ) { + public function initEditCountInternal() { // Pull from a replica DB to be less cruel to servers // Accuracy isn't the point anyway here $dbr = wfGetDB( DB_REPLICA ); @@ -5402,13 +5365,15 @@ class User implements IDBAccessObject, UserIdentity { [], $actorWhere['joins'] ); - $count = $count + $add; $dbw = wfGetDB( DB_MASTER ); $dbw->update( 'user', [ 'user_editcount' => $count ], - [ 'user_id' => $this->getId() ], + [ + 'user_id' => $this->getId(), + 'user_editcount IS NULL OR user_editcount < ' . (int)$count + ], __METHOD__ ); diff --git a/languages/ConverterRule.php b/languages/ConverterRule.php index 999d648c21..8be2d6aed0 100644 --- a/languages/ConverterRule.php +++ b/languages/ConverterRule.php @@ -399,11 +399,7 @@ class ConverterRule { case 'N': // process N flag: output current variant name $ruleVar = trim( $rules ); - if ( isset( $this->mConverter->mVariantNames[$ruleVar] ) ) { - $this->mRuleDisplay = $this->mConverter->mVariantNames[$ruleVar]; - } else { - $this->mRuleDisplay = ''; - } + $this->mRuleDisplay = $this->mConverter->mVariantNames[$ruleVar] ?? ''; break; case 'D': // process D flag: output rules description diff --git a/languages/Language.php b/languages/Language.php index dad9c6c982..86f4505cc4 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -3227,12 +3227,8 @@ class Language { $this->doMagicHook(); } - if ( isset( $this->mMagicExtensions[$mw->mId] ) ) { - $rawEntry = $this->mMagicExtensions[$mw->mId]; - } else { - $rawEntry = self::$dataCache->getSubitem( - $this->mCode, 'magicWords', $mw->mId ); - } + $rawEntry = $this->mMagicExtensions[$mw->mId] ?? + self::$dataCache->getSubitem( $this->mCode, 'magicWords', $mw->mId ); if ( !is_array( $rawEntry ) ) { wfWarn( "\"$rawEntry\" is not a valid magic word for \"$mw->mId\"" ); @@ -5063,10 +5059,6 @@ class Language { public function getPluralRuleType( $number ) { $index = $this->getPluralRuleIndexNumber( $number ); $pluralRuleTypes = $this->getPluralRuleTypes(); - if ( isset( $pluralRuleTypes[$index] ) ) { - return $pluralRuleTypes[$index]; - } else { - return 'other'; - } + return $pluralRuleTypes[$index] ?? 'other'; } } diff --git a/languages/LanguageCode.php b/languages/LanguageCode.php index 1e10496984..7d954d3803 100644 --- a/languages/LanguageCode.php +++ b/languages/LanguageCode.php @@ -163,10 +163,7 @@ class LanguageCode { * @since 1.30 */ public static function replaceDeprecatedCodes( $code ) { - if ( isset( self::$deprecatedLanguageCodeMapping[$code] ) ) { - return self::$deprecatedLanguageCodeMapping[$code]; - } - return $code; + return self::$deprecatedLanguageCodeMapping[$code] ?? $code; } /** diff --git a/languages/LanguageConverter.php b/languages/LanguageConverter.php index 21902af0a6..3c8d300316 100644 --- a/languages/LanguageConverter.php +++ b/languages/LanguageConverter.php @@ -140,10 +140,7 @@ class LanguageConverter { * main code if there is no fallback */ public function getVariantFallbacks( $variant ) { - if ( isset( $this->mVariantFallbacks[$variant] ) ) { - return $this->mVariantFallbacks[$variant]; - } - return $this->mMainLanguageCode; + return $this->mVariantFallbacks[$variant] ?? $this->mMainLanguageCode; } /** diff --git a/languages/i18n/ace.json b/languages/i18n/ace.json index 534ad666f5..01f42e1f32 100644 --- a/languages/i18n/ace.json +++ b/languages/i18n/ace.json @@ -19,7 +19,7 @@ "tog-hideminor": "Peusom neuandam bacut bak neuubah barô", "tog-hidepatrolled": "Peusom neuandam teurunda bak neuubah barô", "tog-newpageshidepatrolled": "Peusom laman teurunda nibak dapeuta ôn barô", - "tog-hidecategorization": "Peusom kawan mieng", + "tog-hidecategorization": "Peusom kawan laman", "tog-extendwatchlist": "Peuhah dapeuta keunalön keu peuleumah ban dum neuubah, kön nyang barô mantöng", "tog-usenewrc": "Peusaho neuandam bak neuleumah neuubah barô ngön dapeuta keunalön meunurôt ôn", "tog-numberheadings": "Bôh numbôi nan keudroë", @@ -153,7 +153,7 @@ "and": " ngön", "faq": "Teunanyöng Umom", "actions": "Buët", - "namespaces": "Ruweuëng nan", + "namespaces": "Ruweueng nan", "variants": "Ragam", "navigation-heading": "Keumudoe", "errorpagetitle": "Seunalah", @@ -185,7 +185,7 @@ "newpage": "Laman barô", "talkpagelinktext": "marit", "specialpage": "Laman kusuih", - "personaltools": "Peukakaih droë", + "personaltools": "Peukakaih droe", "talk": "Marit", "views": "Leumah", "toolbox": "Alat", @@ -203,7 +203,7 @@ "viewcount": "Laman nyoë ka geusaweuë {{PLURAL:$1|sigo|$sigo}}.
", "protectedpage": "Laman teupeulindông", "jumpto": "Grôp u:", - "jumptonavigation": "keumudoë", + "jumptonavigation": "keumudoe", "jumptosearch": "mita", "view-pool-error": "Meu'ah, server teungöh sibôk jinoe\nLe that ureueng nyang meuh'eut jak eu laman nyoe\nNeuprèh si'at yôh goh neubaci lom\n\n$1", "generic-pool-error": "Meu'ah, server teungöh peunoh jinoë.\nRamè that ureuëng ngui nyang eu laman nyoë.\nNeuprèh sijamong sigoh neuci lom.", @@ -225,22 +225,22 @@ "policy-url": "Project:Neuatô", "portal": "Meusapat", "portal-url": "Project:Meusapat", - "privacy": "Jaga rahsia", - "privacypage": "Project:Jaga rahsia", + "privacy": "Keubijakan rahsia", + "privacypage": "Project:Keubijakan rahsia", "badaccess": "Salah khut/hak tamöng", "badaccess-group0": "Droeneuh hana geupeuidin keu neupeulaku buët nyang neulakèë", "badaccess-groups": "Buët nyang neulakèë geupeubatah keu ureuëng ngui lam {{PLURAL:$2|kawan|salah saboh nibak kawan}}: $1.", "versionrequired": "Peureulèë MediaWiki vèrsi $1", "versionrequiredtext": "MediaWiki versi $1 geupeureulèë keu neungui laman nyoë. Neu'eu [[Special:Version|on versi]]", "ok": "Ka göt", - "retrievedfrom": "Geurumpok nibak \"$1\"", + "retrievedfrom": "Geurumpök nibak \"$1\"", "youhavenewmessages": "Droëneuh na $1 ($2).", "youhavenewmessagesfromusers": "Droeneuh na $1 nibak {{PLURAL:$3|ureueng nguy la'en|$3 ureueng nguy}} ($2).", "youhavenewmessagesmanyusers": "Droeneuh na $1 nibak ureueng nguy la'en ($2)", "newmessageslinkplural": "{{PLURAL:$1|saboh peusan barô|999=peusan barô}}", "newmessagesdifflinkplural": "{{PLURAL:$1|neuubah|999=neuubah}} seuneulheuëh", "youhavenewmessagesmulti": "Droëneuh na padum boh peusan barô bak $1", - "editsection": "Peusaneut", + "editsection": "peusaneut", "editold": "peusaneut", "viewsourceold": "Eu nè", "editlink": "peusaneut", @@ -499,7 +499,7 @@ "blockedtitle": "Ureueng ngui geutheun", "blockedtext": "Nan ureueng ngui atawa alamat IP Droeneuh ka geutheun.\n\nTeuneuheuen geupeugöt lé $1. \nAlasan nyang geubri nakeuh $2.\n\n* Phôn mula geutheun: $8\n* Maté tanggai teuneuheun: $6\n* Ureueng nyang geutheun: $7\n\nDroeneuh jeuet neutanyöng bak $1 atawa [[{{MediaWiki:Grouppage-sysop}}|ureueng urôih]] nyang la’én bhaih teuneuheun nyoe.\nDroeneuh h`an jeuet neungui alat \"{{int:emailuser}}\" keucuali meunyo alamat surat-e nyang sah na neupasoe bak [[Special:Preferences|Neuatô akun]] ngön Droeneuh hana geutheun keu neungui atra nyan.\nAlamat IP Droeneuh jinoe nakeuh $3, ngön ID teuneuheun nakeuh $5.\nNeutulông pasoe ban dum keutrangan di ateueh lam tiep teunanyöng nyang neupeugöt.", "autoblockedtext": "'''Nan ureuëng nguy atawa alamat IP Droëneuh ka geutheun.'''\n\nGeutheun lé $1. Dalèh jih nakeuh ''$2''.\n\n* Geutheun yôh: $8\n* Neutheun maté tanggay bak: $6\n* Nyang geutheun: $7\n\nDroëneuh jeuët neutanyong bak $1 atawa [[{{MediaWiki:Grouppage-sysop}}|nyang urôh nyang la’én]] keu peugah haba bhah nyoë.\n\nDroëneuh h’an jeuët neunguy alat 'Kirém surat-e ureuëng nguy nyoë' keucuali ka neupasoë alamat surat-e nyang sah di [[Special:Preferences|Geunalak]] Droëneuh ngön Droëneuh ka geutheun keu nguy nyan.\n\nAlamat IP Droëneuh nakeuh $3, ngön ID neutheun nakeuh $5. Tulông peuseureuta salah saboh atawa ban duwa beurita nyoë bak tiëp teunanyöng nyang neupeugöt.", - "blockednoreason": "hana dalèh nyang geubri", + "blockednoreason": "hana alasan nyang geubri", "whitelistedittext": "Droeneuh suwah $1 keu neuandam ôn.", "nosuchsectiontitle": "Bideueng hana geutumèe", "loginreqtitle": "Droeneuh payah neutamöng log.", @@ -652,8 +652,8 @@ "prefs-personal": "Profil ureueng ngui", "prefs-rc": "Neuubah barô", "prefs-watchlist": "Dapeuta keunalön", - "prefs-watchlist-days": "Jumeulah uroe nyang meupeudeuh bak dapeuta keunalön:", - "prefs-watchlist-days-max": "{{PLURAL:$1|uroë}}", + "prefs-watchlist-days": "Jumeulah uroe nyang geupeuleumah lam dapeuta keunalön:", + "prefs-watchlist-days-max": "Paléng le {{PLURAL:$1|uroë}}", "prefs-misc": "La'én-la'én", "prefs-resetpass": "Gantoe lageuem rahsia", "prefs-changeemail": "Gantoe atawa böh alamat surat-e", @@ -705,10 +705,11 @@ "userrights-editusergroup": "Ubah kawan ureueng ngui", "saveusergroups": "Ubah kawan ureueng ngui", "userrights-groupsmember": "Anggèeta nibak:", - "userrights-reason": "Dalèh:", + "userrights-reason": "Alasan:", "userrights-no-interwiki": "Droeneuh hana izin keu neuubah khut ureueng ngui bak wiki la'én.", "userrights-changeable-col": "Kawan nyang jeut neugantoe", "userrights-unchangeable-col": "Kawan nyang han jeut neugantoe", + "userrights-expiry-options": "siuroe:1 day,sigo jumeu'at:1 week,sibuleuen:1 month,3 buleuen:3 months,6 buleuen:6 months,sithôn:1 year", "group": "Kawan:", "group-user": "Ureueng-ureueng ngui", "group-autoconfirmed": "Ureueng ngui nyang meu-konfirmasi otomatis", @@ -735,7 +736,7 @@ "right-createtalk": "Peugöt ôn marit", "right-createaccount": "Peugöt nan ureueng ngui barô", "right-minoredit": "Peutanda seubagoe peusaneut ubeut", - "right-move": "Pinah laman", + "right-move": "Pupinah laman", "right-move-subpages": "Pinah laman ngön ban dum aneuk laman", "right-move-rootuserpages": "Pinah laman ureueng ngui", "right-movefile": "Pinah beureukaih", @@ -745,6 +746,7 @@ "right-delete": "Sampôh laman", "right-bigdelete": "Sampôh laman ngön ban dum riwayatjih", "right-browsearchive": "Mita laman nyang geusampôh", + "grant-createeditmovepage": "Peugöt, peusaneut, ngön pupinah laman", "newuserlogpage": "Ureuëng ngui barô", "rightslog": "Log neuubah hak peuhah", "action-read": "beuët laman nyoe", @@ -778,6 +780,7 @@ "rcfilters-date-popup-title": "Watèe nyang neumita", "rcfilters-days-title": "Uroe seuneulheueh", "rcfilters-hours-title": "Jeum seuneulheueh", + "rcfilters-days-show-days": "$1 {{PLURAL:$1|uroe}}", "rcfilters-quickfilters": "Seunaréng teukeubah", "rcfilters-savedqueries-defaultlabel": "Seunaréng teukeubah", "rcfilters-show-new-changes": "Peuleumah neuubah barô", @@ -788,7 +791,7 @@ "rcfilters-filter-pageedits-label": "Peusaneut laman", "rcfilters-filter-newpages-label": "Peugöt laman", "rcfilters-filter-logactions-label": "Buet teucètèt", - "rcfilters-liveupdates-button": "Neuubah langsông", + "rcfilters-liveupdates-button": "Ban meuubah", "rcnotefrom": "Di yup nyoe nakeuh {{PLURAL:$5|neuubah}} yôh $3, $4 (trôk 'an $1 geupeuleumah).", "rclistfrom": "Peuleumah neuubah barô yôh $3 $2 kön", "rcshowhideminor": "$1 peusaneut bacut", @@ -897,6 +900,9 @@ "filepage-nofile": "Hana beureukaih ngön nan nyoe", "uploadnewversion-linktext": "Peulöt seunalén nyang leubèh barô nibak beureukah nyoë.", "upload-disallowed-here": "Droëneuh h'an jeuët neutimpa beureukaih nyoë", + "filerevert-comment": "Alasan:", + "filedelete-comment": "Alasan:", + "filedelete-otherreason": "Alasan laén/teunamah:", "mimesearch": "Mita MIME", "listredirects": "Dapeuta peuninah", "unusedtemplates": "Templat nyang hana geungui", @@ -934,6 +940,7 @@ "deadendpages": "Laman buntu", "protectedpages": "Laman nyang geulindông", "protectedpages-noredirect": "Peusom peuninah", + "protectedpages-reason": "Alasan", "listusers": "Dapeuta ureuëng ngui", "usercreated": "{{GENDER:$3|Geupeugot}} bak $1 poh $2", "newpages": "Laman barô", @@ -1017,6 +1024,7 @@ "watchlist-options": "Peuniléh dapeuta kalön", "watching": "Kalön...", "unwatching": "Hana kalön...", + "enotif_reset": "Bôh tanda ban dum laman kalheuh meusaweue", "deletepage": "Sampôh laman", "historywarning": "'''Peuneugah:''' Laman nyang keumeung neusampôh na riwayat ngön kureuëng leubèh $1 {{PLURAL:$1|geunantoë}}:", "confirmdeletetext": "Droëneuh neuk neusampôh laman atawa beureukaih nyoë keu sabé. Meunan cit ban mandum riwayatjih nibak basis data. Neupeupaseuti meunyo Droëneuh cit keubiët meung neusampôh, neutupeuë ban mandum akébatjih, ngön peuë nyang neupeulaku nyoë nakeuh meunurôt [[{{MediaWiki:Policy-url}}|kebijakan{{SITENAME}}]].", @@ -1024,17 +1032,18 @@ "actionfailed": "Hana meuhasé", "deletedtext": "\"$1\" ka geusampôh. Eu $2 keu log paléng barô bak laman nyang ka geusampôh.", "dellogpage": "Log seunampôh", - "deletecomment": "Choë:", - "deleteotherreason": "Nyang la’én/choë la’én:", - "deletereasonotherlist": "Choë la’én", + "deletecomment": "Alasan:", + "deleteotherreason": "Nyang laén/alasan laén:", + "deletereasonotherlist": "Alasan laén", "rollbacklink": "pulang", "rollbacklinkcount": "peuriwang $1 {{PLURAL:$1|hase peusaneut}}", + "changecontentmodel-reason-label": "Alasan:", "changecontentmodel-submit": "Gantoe", "protectlogpage": "Log lindông", "protectedarticle": "peulindông \"[[$1]]\"", "modifiedarticleprotection": "Ubah tingkat lindông \"[[$1]]\"", "prot_1movedto2": "peupinah [[$1]] u [[$2]]", - "protectcomment": "Choë:", + "protectcomment": "Alasan:", "protectexpiry": "Maté tanggay:", "protect_expiry_invalid": "Watèë maté tanggay hana sah.", "protect_expiry_old": "Watèë maté tanggay nakeuh bak masa u likôt.", @@ -1051,6 +1060,7 @@ "protect-expiry-indefinite": "sabé", "protect-cascade": "Peulindông ban mandum ôn nyang rôh lam ôn nyoë (lindông meuturôt).", "protect-cantedit": "Droëneuh h‘an jeuët neu’ubah tingkat lindông ôn nyoë kareuna Droëneuh hana hak keu neupeulaku nyan.", + "protect-otherreason": "Alasan laén/teunamah:", "protect-expiry-options": "1 jeum:1 hour,1 uroë:1 day,1 minggu:1 week,2 minggu:2 weeks,1 buleuën:1 month,3 buleuën:3 months,6 buleuën:6 months,1 thôn:1 year,sabé:infinite", "restriction-type": "Lindông:", "restriction-level": "Tingkat:", @@ -1059,6 +1069,7 @@ "undeletebtn": "Peuriwang!", "undeletelink": "eu/peuriwang", "undeleteviewlink": "eu", + "undeletecomment": "Alasan:", "undelete-search-submit": "Mita", "namespace": "Ruweuëng nan:", "invert": "Peubalék peuniléh", @@ -1103,9 +1114,11 @@ "whatlinkshere-hideimages": "$1 peunawôt beureukaih", "whatlinkshere-filters": "Saréng", "blockip": "Theun ureuëng ngui", + "ipbreason": "Alasan:", "ipboptions": "2 jeum:2 hours,1 uroë:1 day,3 uroë:3 days,1 minggu:1 week,2 minggu:2 weeks,1 buleuën:1 month,3 buleuën:3 months,6 buleuën:6 months,1 thôn:1 year,sabé:infinite", "ipbhidename": "Peusom nan ureueng ngui nibak hasé peusaneut ngön dapeuta", "ipblocklist": "Ureuëng ngui teutheun", + "blocklist-reason": "Alasan", "ipblocklist-submit": "Mita", "infiniteblock": "hana bataih", "blocklink": "theun", @@ -1114,14 +1127,17 @@ "contribslink": "beuneuri", "blocklogpage": "Log peutheun", "blocklogentry": "theun [[$1]] ngön watèë maté tanggay $2 $3", + "reblock-logentry": "geuubah peuatô teuneutham keu [[$1]] ngön watèe abéh $2 $3", "unblocklogentry": "peugadöh theun \"$1\"", "block-log-flags-nocreate": "pumeugöt akun geupumaté", "proxyblocker": "Ngön theun proxy", + "move-page-legend": "Pupinah laman", "movepagetext": "Formulir di yup nyoë geunguy keu jak ubah nan saboh ôn ngön jak peupinah ban dum data riwayat u nan barô. Nan nyang trép euntreuk jeuët keu ôn peupinah u nan nyang barô. Hubông u nan trép hana meu’ubah. Neupeupaseuti keu neupréksa peuninah ôn nyang reulöh atawa meuganda lheuëh neupinah. Droëneuh nyang mat tanggông jaweuëb keu neupeupaseuti meunyo hubông laju teusambông u ôn nyang patôt.\n\nBeu neuingat that meunyo ôn '''h’an''' jan geupeupinah meunyo ka na ôn nyang geunguy nan barô, keucuali meunyo ôn nyan soh atawa nakeuh ôn peuninah ngön hana riwayat andam. Nyoë areutijih Droëneuh jeuët neu’ubah nan ôn keulayi lagèë söt meunyo Droëneuh neupeugöt seunalah, ngön Droëneuh h‘an jeuët neutimpa ôn nyang ka na.\n'''INGAT'''\nNyoë jeuët geupeuakébat neu’ubah nyang h’an neuduga ngön kreuëh ngön bacah keu ôn nyang meuceuhu. Neupeupaseuti Droëneuh meuphôm akébat nibak buët nyoë sigohlom neulanjut.", "movepagetalktext": "Ôn peugah haba nyang na hubôngan euntreuk teupinah keudroë '''keucuali meunyo:'''\n\n*Saboh ôn peugah haba nyang hana soh ka na di yup nan barô, atawa\n*Droëneuh hana neubôh tanda cunténg bak kutak di yup nyoë\n\nLam masalah nyoë, meunyo neuhawa, Droëneuh jeuët neupeupinah atawa neupeugabông ôn keudroë.", + "movenotallowed": "Droeneuh hana idin keu neupinah laman", "newtitle": "Nan barô:", "move-watch": "Kalön laman nyoë", - "movepagebtn": "Peupinah laman", + "movepagebtn": "Pupinah laman", "pagemovedsub": "Peupinah meuhasé", "movepage-moved": "'''\"$1\" ka geupeupinah u \"$2\".'''", "articleexists": "Ôn ngön nan nyan ka na atawa nan nyang neupiléh hana sah. Neupiléh nan la’én.", @@ -1129,6 +1145,8 @@ "movelogpage": "Log pinah", "movereason": "Choë:", "revertmove": "peuriwang", + "immobile-source-namespace": "H'an jeuet pupinah laman lam ruweueng nan \"$1\".", + "immobile-target-namespace": "H'an jeuet pupinah laman lam ruweueng nan \"$1\".", "export": "Èkspor laman", "allmessages": "Peusan sistem", "allmessagesname": "Nan", @@ -1212,6 +1230,7 @@ "pageinfo-watchers": "Jumeulah ureueng kalön laman", "pageinfo-redirects-name": "Jumeulah peuninah u laman nyoe", "pageinfo-subpages-name": "Jeumeulah aneuk laman nibak laman nyoe", + "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|peuninah}}; $3 {{PLURAL:$3|kön-peuninah}})", "pageinfo-firstuser": "Ureueng peugöt laman", "pageinfo-firsttime": "Uroe buleuen pumeugot laman", "pageinfo-lastuser": "Ureueng peusaneut seuneulheueh", @@ -1219,12 +1238,14 @@ "pageinfo-edits": "Jumeulah hasé peusaneut ban dum", "pageinfo-authors": "Jumeulah ban dum ureueng teumuléh nyang mubida", "pageinfo-recent-edits": "Jumeulah peusaneut ban-ban nyoe (lam $1 nyoe)", + "pageinfo-magic-words": "{{PLURAL:$1|Narit}} ajaéb ($1)", "pageinfo-hidden-categories": "{{PLURAL:$1|Kawan}} teusom ($1)", "pageinfo-toolboxlink": "Keutrangan laman", "pageinfo-contentpage-yes": "Nyo", "patrol-log-page": "Log patroli", "previousdiff": "← Bida awai", "nextdiff": "Geunantoë lheuëh nyan →", + "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|laman}}", "file-info-size": "$1 × $2 piksel, rayek beureukaih: $3, MIME jeunèh: $4", "file-info-size-pages": "$1 × $2 piksel, seunipat beureukaih: $3, jeunèh MIME: $4, $5 {{PLURAL:$5|laman}}", "file-nohires": "Hana resolusi nyang leubèh manyang.", @@ -1306,7 +1327,13 @@ "tags-active-yes": "Nyo", "tags-active-no": "H`an", "tags-hitcount": "$1 {{PLURAL:$1|neuubah}}", + "tags-create-reason": "Alasan:", + "tags-delete-reason": "Alasan:", + "tags-activate-reason": "Alasan:", + "tags-deactivate-reason": "Alasan:", + "tags-edit-reason": "Alasan:", "logentry-delete-delete": "$1 {{GENDER:$2|geusampôh}} laman $3", + "logentry-delete-restore": "$1 {{GENDER:$2|geupeuriwang}} laman $3 ($4)", "revdelete-content-hid": "asoe geusom", "logentry-move-move": "$1 {{GENDER:$2|geupinah}} laman $3 u $4", "logentry-move-move-noredirect": "$1 {{GENDER:$2|geupinah}} laman $3 u $4 hana geubôh peuninah", @@ -1323,5 +1350,6 @@ "duration-years": "{{PLURAL:$1|thôn}}", "duration-decades": "{{PLURAL:$1|dekade}}", "duration-centuries": "{{PLURAL:$1|abad}}", - "duration-millennia": "{{PLURAL:$1|milenium}}" + "duration-millennia": "{{PLURAL:$1|milenium}}", + "pagelang-reason": "Alasan" } diff --git a/languages/i18n/ar.json b/languages/i18n/ar.json index 9b4700cd4e..3a4810fab7 100644 --- a/languages/i18n/ar.json +++ b/languages/i18n/ar.json @@ -949,7 +949,7 @@ "mergehistory-go": "عرض التعديلات القابلة للدمج", "mergehistory-submit": "دمج المراجعات", "mergehistory-empty": "لا مراجعات يمكن دمجها.", - "mergehistory-done": "$3 {{PLURAL:$3|مراجعة}} من $1{{PLURAL:$3|كان|اين}} تم دمجها بنجاح في [[:$2]].", + "mergehistory-done": "$3 {{PLURAL:$3|مراجعة|مراجعات}} من $1 {{PLURAL:$3|تم}} دمجها في [[:$2]].", "mergehistory-fail": "غير قادر على عمل دمج التاريخ، من فضلك أعد التحقق من محددات الصفحة والزمن.", "mergehistory-fail-bad-timestamp": "الختم الزمني غير صالح.", "mergehistory-fail-invalid-source": "الصفحة المصدر غير صالحة.", diff --git a/languages/i18n/ba.json b/languages/i18n/ba.json index 48198c559a..42702c3dfc 100644 --- a/languages/i18n/ba.json +++ b/languages/i18n/ba.json @@ -29,7 +29,8 @@ "Ilmira", "Irus", "Khanmarat", - "Fitoschido" + "Fitoschido", + "Amire80" ] }, "tog-underline": "Һылтанмалар аҫтына һыҙыу:", @@ -150,7 +151,7 @@ "category_header": "«$1» категорияһындағы биттәр", "subcategories": "Эске категориялар", "category-media-header": "«$1» категорияһындағы файлдар", - "category-empty": "\"Был категория әлегә буш.\"", + "category-empty": "Был категория әлегә буш.", "hidden-categories": "{{PLURAL:$1|Йәшерен категория|Йәшерен категориялар}}", "hidden-category-category": "Йәшерен категориялар", "category-subcat-count": "{{PLURAL:$2|Был категорияла тик киләһе эске категория ғына бар.|Барлығы $2 категориянан, был категорияла киләһе {{PLURAL:$1|эске категория|$1 эске категория}} күрһәтелә.}}", diff --git a/languages/i18n/be-tarask.json b/languages/i18n/be-tarask.json index 2e7b409d77..79f8afe885 100644 --- a/languages/i18n/be-tarask.json +++ b/languages/i18n/be-tarask.json @@ -642,6 +642,7 @@ "previewerrortext": "Адбылася памылка пры спробе папярэдняга прагляду вашых зьменаў.", "blockedtitle": "Удзельнік заблякаваны", "blocked-email-user": "Вашаму рахунку было забаронена дасылаць лісты электроннай поштай. Вы ўсё яшчэ можаце рэдагаваць іншыя старонкі ў гэтай вікі. Вы можаце пабачыць падрабязнасьці блякаваньня на старонцы [[Special:MyContributions|ўнёску рахунку]].\n\nБлякавананьне зробленае $1.\n\nПададзеная прычына — $2.\n\n* Пачатак блякаваньня: $8\n* Сканчэньне блякаваньня: $6\n* Мэта блякаваньня: $7\n* Ідэнтыфікатар блякаваньня #$5", + "blockedtext-partial": "Вашаму рахунку ці IP-адрасу было забаронена зьмяняць гэтую старонку. Вы ўсё яшчэ можаце рэдагаваць іншыя старонкі ў гэтай вікі. Вы можаце паглядзець падрабязнасьці блякаваньня на старонцы [[Special:MyContributions|ўнёску рахунку]].\n\nБлякаваньне зробленае $1.\n\nПададзеная прычына — $2.\n\n* Пачатак блякаваньня: $8\n* Сканчэньне блякаваньня: $6\n* Мэта блякаваньня: $7\n* Ідэнтыфікатар блякаваньня #$5", "blockedtext": "Ваш рахунак удзельніка ці IP-адрас быў заблякаваны.\n\nБлякаваньне выканаў $1.\nПрычына гэтага: $2.\n\n* Пачатак блякаваньня: $8\n* Сканчэньне блякаваньня: $6\n* Быў заблякаваны: $7\n\nВы можаце скантактавацца з $1 ці адным зь іншых [[{{MediaWiki:Grouppage-sysop}}|адміністратараў]], каб абмеркаваць блякаваньне. Заўважце, што вы ня зможаце ўжыць магчымасьць «{{int:emailuser}}», пакуль не пазначыце сапраўдны адрас электроннай пошты ў вашых [[Special:Preferences|наладах]], і калі гэта вам не было забаронена.\nВаш IP-адрас — $3, ідэнтыфікатар блякаваньня — #$5.\nКалі ласка, улучайце ўсю вышэйпададзеную інфармацыю ва ўсе запыты, што вы будзеце рабіць.", "autoblockedtext": "Ваш IP-адрас быў аўтаматычна заблякаваны, таму што ён ужываўся іншым удзельнікам, які быў заблякаваны $1.\nПрычына гэтага:\n\n:$2\n\n* Блякаваньне пачалося: $8\n* Блякаваньне скончыцца: $6\n* Быў заблякаваны: $7\n\nВы можаце скантактавацца з $1 ці з адным зь іншых [[{{MediaWiki:Grouppage-sysop}}|адміністратараў]], каб абмеркаваць блякаваньне.\n\nЗаўважце, што вы ня зможаце ўжываць магчымасьць «{{int:emailuser}}», пакуль ня будзе пазначаны дзейны адрас электроннай пошты ў вашых [[Special:Preferences|наладах удзельніка]], і калі гэта вам не было забаронена.\n\nВаш цяперашні IP-адрас — $3, ідэнтыфікатар блякаваньня — #$5.\nКалі ласка, улучайце ўсю вышэйпададзеную інфармацыю ва ўсе запыты, што вы будзеце рабіць.", "systemblockedtext": "Вашае імя ўдзельніка ці IP-адрас былі аўтаматычна заблякаваныя MediaWiki.\nЗ наступнай прычыны:\n\n:$2\n\n* Пачатак блякаваньня: $8\n* Сканчэньне блякаваньня: $6\n* Мэта блякаваньня: $7\n\nВаш цяперашні IP-адрас — $3.\nКалі ласка, уключайце ўсе пададзеныя вышэй дэталі ва ўсе запыты, што вы робіце.", @@ -3701,6 +3702,7 @@ "logentry-block-block": "$1 {{GENDER:$2|заблякаваў|заблякавала}} {{GENDER:$4|$3}} на тэрмін $5 $6", "logentry-block-unblock": "$1 {{GENDER:$2|разблякаваў|разблякавала}} {{GENDER:$4|$3}}", "logentry-block-reblock": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} тэрмін блякаваньня {{GENDER:$4|$3}} на пэрыяд $5 $6", + "logentry-partialblock-block": "$1 {{GENDER:$2|заблякаваў|заблякавала}} {{GENDER:$4|$3}} ад рэдагаваньня {{PLURAL:$8||старонак}} $7 з часам сканчэньня $5 $6", "logentry-suppress-block": "$1 {{GENDER:$2|заблякаваў|заблякавала}} {{GENDER:$4|$3}} на тэрмін $5 $6", "logentry-suppress-reblock": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} тэрмін блякаваньня {{GENDER:$4|$3}} на пэрыяд $5 $6", "logentry-import-upload": "$1 {{GENDER:$2|імпартаваў|імпартавала}} $3 праз загрузку файлу", diff --git a/languages/i18n/ckb.json b/languages/i18n/ckb.json index 06e75e3214..fbea87bd18 100644 --- a/languages/i18n/ckb.json +++ b/languages/i18n/ckb.json @@ -1603,6 +1603,7 @@ "protectedtitlesempty": "ھیچ سەرناوێک بەم سنوورانەوە ئێستا نەپارێزراوە.", "listusers": "پێرستی بەکارھێنەران", "listusers-editsonly": "تەنیا ئەو بەکارھێنەرانە نیشان بدە کە دەستکارییان کردووە", + "listusers-temporarygroupsonly": "تەنیا ئەو بەکارھێنەرانە نیشان بدە کە بە شێوەیەکی کاتی مافیان ھەیە", "listusers-creationsort": "ڕیزکردن بە پێی ڕێکەوتی دروستکردن", "listusers-desc": "ڕیزکردنی بەرەوە ژێر", "usereditcount": "$1 {{PLURAL:$1|دەستکاری|دەستکاری}}", diff --git a/languages/i18n/es.json b/languages/i18n/es.json index 00fcd9c092..087dfbb493 100644 --- a/languages/i18n/es.json +++ b/languages/i18n/es.json @@ -3956,12 +3956,12 @@ "limitreport-ppgeneratednodes": "N.º de nodos generados por el preprocesador", "limitreport-postexpandincludesize": "Tamaño de inclusión posexpansión", "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}", - "limitreport-templateargumentsize": "Argumento del tamaño de la plantilla", + "limitreport-templateargumentsize": "Tamaño de los parámetros de plantilla", "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}", "limitreport-expansiondepth": "Profundidad máxima de expansión", - "limitreport-expensivefunctioncount": "Cuenta de la función expansiva del analizador", + "limitreport-expensivefunctioncount": "Contador de funciones costosas del analizador", "limitreport-unstrip-depth": "Profundidad de recursión de función «unstrip»", - "limitreport-unstrip-size": "Unstrip tamaño post-expandido", + "limitreport-unstrip-size": "Tamaño tras la expansión de «unstrip»", "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|byte|bytes}}", "expandtemplates": "Expandir plantillas", "expand_templates_intro": "Esta página especial toma un texto wiki y expande todas sus plantillas recursivamente.\nTambién expande las funciones sintácticas como {{#language:…}}, y variables como\n{{CURRENTDAY}}. De hecho, expande casi cualquier cosa que esté entre llaves dobles.", diff --git a/languages/i18n/hr.json b/languages/i18n/hr.json index 6a071b6cf9..9c57822554 100644 --- a/languages/i18n/hr.json +++ b/languages/i18n/hr.json @@ -3282,7 +3282,7 @@ "version-license-not-found": "Za ovaj dodatak nema detaljnih informacija o licenciji.", "version-credits-title": "Zasluge za $1", "version-credits-not-found": "Za ovo proširenje nisu pronađene informacije o zaslugama.", - "version-poweredby-credits": "Ovaj wiki pogoni '''[https://www.mediawiki.org/ MediaWiki]''', autorska prava © 2001-$1 $2.", + "version-poweredby-credits": "Ovaj wiki pokreće '''[https://www.mediawiki.org/ MediaWiki]''', autorska prava © 2001-$1 $2.", "version-poweredby-others": "ostali", "version-poweredby-translators": "prevoditelji s projekta translatewiki.net", "version-credits-summary": "Željeli bismo zahvaliti sljedećim suradnicima na njihovom doprinosu [[Special:Version|MediaWikiju]].", diff --git a/languages/i18n/io.json b/languages/i18n/io.json index fd4ea56fe3..cb8e621b7e 100644 --- a/languages/i18n/io.json +++ b/languages/i18n/io.json @@ -1098,6 +1098,7 @@ "rcfilters-filter-watchlist-watched-label": "En mea surveyo-listo", "rcfilters-filter-watchlist-watched-description": "Modifikuri en pagini de vua surveyo-listo.", "rcfilters-filter-watchlist-watchednew-label": "Nova modifikuri en la surveyo-listo", + "rcfilters-filter-watchlistactivity-unseen-description": "Modifikuri en la pagini quin vu ne vizitis pos ke la modifikuri facesis.", "rcfilters-filtergroup-changetype": "Tipo di modifikuro", "rcfilters-filter-pageedits-label": "Redakti di pagini", "rcfilters-filter-pageedits-description": "Redakturi en la kontenajo dil Wiki, diskuti, deskriptado di kategorii...", @@ -1119,6 +1120,8 @@ "rcfilters-view-namespaces-tooltip": "Filtrar rezulti segun nomo", "rcfilters-liveupdates-button": "Quika aktualigi", "rcfilters-watchlist-markseen-button": "Indikar \"vidita\" en omna modifikuri", + "rcfilters-watchlist-edit-watchlist-button": "Modifikez vua listo pri pagini vigilata", + "rcfilters-watchlist-showupdated": "La chanji en pagini quin vu ne vizitis pos eventir modifikuri indikesas per dika literi, kun solida marki.", "rcnotefrom": "Infre {{PLURAL:$5|esas la chanjo|esas la chanji}} de $3, $4 (montrata til $1).", "rclistfrom": "Montrar nova chanji startante de $3 $2", "rcshowhideminor": "$1 mikra redakturi", @@ -1345,6 +1348,7 @@ "protectedtitles": "Protektita tituli", "listusers": "Uzerolisto", "listusers-editsonly": "Montrez nur uzeri qui facis redakti", + "listusers-temporarygroupsonly": "Montrez nur l'uzeri en tempala uzero-grupi", "listusers-creationsort": "Ordinar segun la dato di kreado", "listusers-desc": "Ordinar segun decensanta ordeno", "usereditcount": "$1 {{PLURAL:$1|redakto|redakti}}", @@ -1407,6 +1411,7 @@ "linksearch-ok": "Serchez", "listusersfrom": "Montrez uzeri komencante de:", "listusers-submit": "Montrez", + "listusers-noresult": "Nula uzero trovita.", "listusers-blocked": "(blokusita)", "activeusers": "Listo pri aktiva uzeri", "activeusers-intro": "Yen listo pri uzeri qui laboris en la Wiki dum la lasta $1 {{PLURAL:$1|dio|dii}}.", diff --git a/languages/i18n/it.json b/languages/i18n/it.json index 7303a2eb37..5c1204b768 100644 --- a/languages/i18n/it.json +++ b/languages/i18n/it.json @@ -3859,7 +3859,7 @@ "duration-centuries": "$1 {{PLURAL:$1|secolo|secoli}}", "duration-millennia": "$1 {{PLURAL:$1|millennio|millenni}}", "rotate-comment": "Immagine ruotata di $1 {{PLURAL:$1|grado|gradi}} in senso orario", - "limitreport-title": "Dati profilo del parser:", + "limitreport-title": "Dati di profilazione del parser:", "limitreport-cputime": "Tempo di utilizzo CPU", "limitreport-cputime-value": "$1 {{PLURAL:$1|secondo|secondi}}", "limitreport-walltime": "Tempo di utilizzo reale", diff --git a/languages/i18n/ja.json b/languages/i18n/ja.json index 94e6faf883..7641b96ea4 100644 --- a/languages/i18n/ja.json +++ b/languages/i18n/ja.json @@ -2022,7 +2022,7 @@ "prefixindex": "先頭が同じ全ページ", "prefixindex-namespace": "先頭が同じ全ページ ($1名前空間)", "prefixindex-submit": "表示", - "prefixindex-strip": "一覧で接頭辞を省略", + "prefixindex-strip": "結果一覧から接頭辞を省略", "shortpages": "短いページ", "longpages": "長いページ", "deadendpages": "行き止まりページ", diff --git a/languages/i18n/kjp.json b/languages/i18n/kjp.json index 7b6d89043f..f0ebb5ccc7 100644 --- a/languages/i18n/kjp.json +++ b/languages/i18n/kjp.json @@ -554,6 +554,7 @@ "ipb-type-label": "အ်ုမိင်အ်ုကုဂ်", "ipb-pages-label": "လိက်မေံၜၠာ်လ်ုဖး", "infiniteblock": "အ်ုထုက်လ်ုအ်ှ", + "blocklist-editing": "ဆ်ုအင်းတါင်", "blocklink": "ဍုဂ်အ်ှပွါ်", "contribslink": "မာၜိုဝ်မာဆိုင်", "blocklogpage": "ဆ်ုဍာ်အှ်ၯင်း လိက်မါၮါင်း", diff --git a/languages/i18n/ko.json b/languages/i18n/ko.json index b58cb2323f..601b2845c1 100644 --- a/languages/i18n/ko.json +++ b/languages/i18n/ko.json @@ -895,7 +895,7 @@ "logdelete-text": "삭제된 로그 내용은 로그에 나타나지만, 내용 중 일부는 일반인이 접근할 수 없게 됩니다.", "revdelete-text-others": "다른 관리자는 여전히 숨겨진 내용에 접근할 수 있고 추가 제한이 설정되어 있지 않으면, 다시 되살릴 수 있습니다.", "revdelete-confirm": "이 작업의 수행 결과를 알고 있으며, 이 작업이 [[{{MediaWiki:Policy-url}}|정책]]에 의거하는지 확인해주세요.", - "revdelete-suppress-text": "숨기기는 다음 경우에만 사용되어야 합니다:\n* 잠재적인 비방 정보\n* 부적절한 개인 정보\n*: 집 주소, 전화번호, 주민등록번호 등", + "revdelete-suppress-text": "감추기는 다음 경우에만 사용되어야 합니다:\n* 잠재적인 비방 정보\n* 부적절한 개인 정보\n*: 집 주소, 전화번호, 주민등록번호 등", "revdelete-legend": "보이기 제한을 설정", "revdelete-hide-text": "판 문자열", "revdelete-hide-image": "파일을 숨기기", @@ -906,7 +906,7 @@ "revdelete-radio-same": "(바꾸지 않음)", "revdelete-radio-set": "숨겨짐", "revdelete-radio-unset": "보임", - "revdelete-suppress": "문서 내용을 관리자에게도 보이지 않게 숨기기", + "revdelete-suppress": "문서 내용을 관리자에게도 보이지 않게 감추기", "revdelete-unsuppress": "복구된 판에 대한 제한을 해제", "revdelete-log": "이유:", "revdelete-submit": "선택한 {{PLURAL:$1|판}}에 적용", @@ -2557,6 +2557,8 @@ "createaccountblock": "계정 만들기 금지됨", "emailblock": "이메일 차단됨", "blocklist-nousertalk": "자신의 토론 문서 편집 불가", + "blocklist-editing": "편집 중", + "blocklist-editing-sitewide": "편집 중 (사이트 전체)", "ipblocklist-empty": "차단 목록이 비어 있습니다.", "ipblocklist-no-results": "요청한 IP 주소나 사용자는 차단되지 않았습니다.", "blocklink": "차단", diff --git a/languages/i18n/lb.json b/languages/i18n/lb.json index 49d17886af..25e729c683 100644 --- a/languages/i18n/lb.json +++ b/languages/i18n/lb.json @@ -2300,6 +2300,9 @@ "ipb-disableusertalk": "Dëse Benotzer dorun hënnere fir seng eegen Diskussiounssäit z'ännere sou laang wéi e gespaart ass", "ipb-change-block": "De Benotzer mat dese Parameteren nees spären", "ipb-confirm": "Spär confirméieren", + "ipb-partial": "Partiell", + "ipb-type-label": "Typ", + "ipb-pages-label": "Säiten", "badipaddress": "D'IP-Adress huet dat falscht Format.", "blockipsuccesssub": "Gouf gespaart", "blockipsuccesstext": "[[Special:Contributions/$1|$1]] gouf gespaart.
\n\nKuckt d'[[Special:BlockList|Spär-Lëscht]] fir all Spären nozekucken.", @@ -2347,6 +2350,7 @@ "createaccountblock": "Opmaache vu Benotzerkonte gespaart", "emailblock": "E-Maile schécke gespaart", "blocklist-nousertalk": "däerf seng eegen Diskussiounssäit net ännereen", + "blocklist-editing": "änneren", "ipblocklist-empty": "D'Spärlëscht ass eidel.", "ipblocklist-no-results": "Déi gesichten IP-Adress respektiv de gesichte Benotzer ass net gespaart.", "blocklink": "spären", @@ -3624,6 +3628,7 @@ "mw-widgets-titleinput-description-redirect": "viruleeden op $1", "mw-widgets-categoryselector-add-category-placeholder": "Eng Kategorie dobäisetzen...", "mw-widgets-usersmultiselect-placeholder": "Méi dobäisetzen...", + "mw-widgets-titlesmultiselect-placeholder": "Méi derbäisetzen...", "date-range-from": "Vum (Datum):", "date-range-to": "Bis den (Datum):", "sessionprovider-generic": "$1-Sessiounen", diff --git a/languages/i18n/mni.json b/languages/i18n/mni.json index e2c8f41894..74006cf1ae 100644 --- a/languages/i18n/mni.json +++ b/languages/i18n/mni.json @@ -123,7 +123,7 @@ "subcategories": "ꯃꯆꯥꯈꯥꯏꯕꯥ ꯃꯆꯥ", "category-media-header": "$1 ꯗꯥ ꯂꯩꯕꯥ ꯃꯦꯗꯤꯌꯥꯒꯤ ꯃꯆꯥꯈꯥꯏꯕꯥ", "category-empty": "This category currently contains no pages or media.", - "hidden-categories": "{{PLURAL:$1|Hidden category|Hidden categories}}", + "hidden-categories": "{{PLURAL:$1|ꯑꯔꯣꯠꯄ ꯃꯆꯥꯈꯥꯏꯕ|ꯑꯔꯣꯠꯄ ꯃꯆꯥꯈꯥꯏꯕꯁꯤꯡ}}", "hidden-category-category": "ꯑꯔꯣꯠꯄꯥ ꯃꯊꯪ ꯃꯅꯥꯎ ꯅꯥꯏꯕꯥ", "category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}", "category-subcat-count-limited": "This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}.", @@ -133,7 +133,7 @@ "category-file-count-limited": "The following {{PLURAL:$1|file is|$1 files are}} in the current category.", "listingcontinuesabbrev": "ꯆꯠꯊꯕꯥ", "index-category": "Indexed ꯂꯥꯃꯥꯏꯁꯤꯡ", - "noindex-category": "Noindexed ꯂꯥꯃꯥꯏꯁꯤꯡ", + "noindex-category": "Noindexed ꯂꯃꯥꯏꯁꯤꯡ", "broken-file-category": " ꯀꯥꯏꯔꯕꯥ file links ꯒꯥ ꯂꯣꯏꯅꯕꯥ ꯂꯥꯃꯥꯏꯁꯤꯡ", "about": "ꯄꯣꯠꯇꯨꯗꯤ ꯃꯔꯝꯗꯥ", "article": "ꯂꯥꯃꯥꯏꯁꯤꯗꯥ ꯌꯥꯎꯕꯥ ꯄꯨꯝꯅꯃꯛ", @@ -199,7 +199,7 @@ "redirectedfrom": "($1 ꯗꯒꯤ ꯔꯤꯗꯥꯏꯔꯦꯛ)", "redirectpagesub": "ꯑꯃꯨꯛ ꯍꯟꯂꯛꯄꯥ ꯂꯃꯥꯏ", "redirectto": "Redirect to:", - "lastmodifiedat": "$2$1 ꯃꯁꯤꯒꯤ ꯂꯃꯥꯏꯁꯤ ꯑꯔꯣꯏꯕꯥ ꯁꯦꯝꯒꯠꯈꯤꯕꯥ", + "lastmodifiedat": "$1 ꯗꯥ ꯃꯁꯤꯒꯤ ꯂꯃꯥꯏꯁꯤ ꯑꯔꯣꯏꯕꯥ ꯁꯦꯝꯒꯠꯈꯤꯕꯥ, $2 ꯗꯥ", "viewcount": "This page has been accessed {{PLURAL:$1|once|$1 times}}?", "protectedpage": "ꯍꯥꯛꯊꯣꯛꯂꯕꯥ ꯂꯥꯃꯥꯏ", "jumpto": "ꯑꯗꯨꯗꯥ ꯆꯣꯡꯈꯠꯄꯥ", @@ -239,7 +239,7 @@ "youhavenewmessages": "{{PLURAL:$3|ꯅꯪꯉꯣꯟꯗ ꯂꯩ}} $1 ($2).", "youhavenewmessagesfromusers": "{{PLURAL:$4|You have}} $1 from {{PLURAL:$3|another user|$3 users}} ($2).", "youhavenewmessagesmanyusers": "ꯅꯪ $1 ꯂꯩꯔꯦ $2 ꯁꯤꯖꯤꯟꯅꯔꯤꯕꯥ ꯃꯌꯥꯝꯗꯒꯤ", - "newmessageslinkplural": "{{PLURAL:$1|a new message|999=new messages}}", + "newmessageslinkplural": "{{PLURAL:$1|ꯑꯅꯧꯕ ꯄꯥꯎꯖꯦꯜ ꯱|꯹꯹꯹=ꯑꯅꯧꯕ ꯄꯥꯎꯖꯦꯜꯁꯤꯡ}}", "newmessagesdifflinkplural": "ꯑꯔꯣꯏꯕꯥ {{PLURAL:$1|ꯑꯍꯣꯡꯕ|꯹꯹꯹=ꯑꯍꯣꯡꯕꯁꯤꯡ}}", "youhavenewmessagesmulti": "$1 ꯅꯪꯒꯤ ꯑꯅꯧꯕꯥ ꯃꯦꯁꯦꯁ", "editsection": "ꯁꯦꯝꯒꯠꯄ", @@ -463,7 +463,7 @@ "changeemail-submit": "ꯏ-ꯃꯦꯜ ꯍꯣꯡꯕꯥ", "bold_sample": "ꯆꯥꯎꯅꯥ ꯏꯕꯥ", "bold_tip": "ꯆꯥꯎꯅꯥ ꯏꯕꯥ", - "italic_sample": "ꯋꯥꯔꯦꯡ ꯐꯆꯅꯥ ꯏꯕꯥ", + "italic_sample": "ꯋꯥꯔꯦꯡ ꯐꯩꯅꯥ ꯏꯕꯥ", "italic_tip": "ꯋꯥꯔꯦꯡ ꯐꯩꯅꯥ ꯏꯕꯥ", "link_sample": "ꯃꯩꯃꯤꯡꯃꯤ ꯁꯝꯅꯐꯝ", "link_tip": "ꯃꯅꯨꯡꯒꯥ ꯁꯝꯅꯐꯝ", @@ -489,9 +489,9 @@ "savechanges-start": "ꯑꯍꯣꯡꯕꯁꯤꯡꯗꯨ ꯇꯨꯪꯁꯤꯟꯂꯨ", "publishpage-start": "ꯂꯥꯃꯥꯏ ꯐꯣꯡꯗꯣꯛ ꯎ", "publishchanges-start": "ꯑꯍꯣꯡꯕꯁꯤꯡꯗꯨ ꯐꯣꯡꯗꯣꯛ ꯎ", - "preview": "ꯃꯥꯃꯥꯡꯒꯤ", + "preview": "ꯃꯃꯥꯡꯒꯤ", "showpreview": "ꯍꯥꯟꯅꯒꯤꯗꯨ ꯎꯨꯠꯂꯨ", - "showdiff": "ꯑꯍꯣꯡꯕꯗꯨ ꯎꯨꯇꯂꯨ", + "showdiff": "ꯑꯍꯣꯡꯕꯗꯨ ꯎꯨꯠꯂꯨ", "blankarticle": "Warning: The page you are creating is blank.\nIf you click \"$1\" again, the page will be created without any content.", "anoneditwarning": "Warning: ꯅꯪ ꯃꯅꯨꯡ ꯆꯪꯗꯔꯤ꯬꯬ ꯫ Your IP address will be publicly visible if you make any edits. If you [$1 log in] or [$2 create an account], your edits will be attributed to your username, along with other benefits.", "loginreqlink": "Chang Sinba", @@ -508,13 +508,13 @@ "continue-editing": "ꯁꯦꯝꯒꯠꯄꯒꯤ ꯃꯐꯝꯗꯨꯗꯥ ꯆꯠꯂꯨ", "editing": "$1 ꯁꯦꯝꯒꯠꯂꯤ", "creating": "ꯁꯥꯔꯤ $1", - "editingsection": "Editing $1 (section)", + "editingsection": "ꯏꯔꯤꯕ $1 (ꯁꯥꯔꯨꯛ)", "yourtext": "ꯅꯪꯒꯤ ꯇꯦꯀꯁ", "yourdiff": "ꯈꯦꯠꯅꯕꯥ ꯁꯤꯡ", "copyrightwarning": "Please note that all contributions to {{SITENAME}} are considered to be released under the $2 (see $1 for details).\nIf you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
\nYou are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.\nDo not submit copyrighted work without permission!", - "templatesused": "{{PLURAL:$1|Template|Templates}} used on this page:", + "templatesused": "ꯃꯁꯤꯒꯤ ꯂꯃꯥꯏꯁꯤꯗ ꯁꯤꯖꯤꯟꯅꯕ {{PLURAL:$1|ꯇꯦꯝꯄꯂꯦꯠ|ꯇꯦꯝꯄꯂꯦꯠꯁꯤꯡ}}:", "templatesusedpreview": "{{PLURAL:$1|ꯇꯦꯝꯄꯂꯦꯠ|ꯇꯦꯝꯄꯂꯦꯠꯁꯤꯡ}} ꯄꯔꯤꯕꯤꯌꯨ ꯗ ꯁꯤꯖꯤꯟꯅꯕ:", - "template-protected": "ꯉꯥꯛꯊꯣꯛꯂꯕꯥ", + "template-protected": "(ꯉꯥꯛꯊꯣꯛꯂꯕꯥ)", "template-semiprotected": "ꯇꯪꯈꯥꯏ ꯉꯥꯛꯊꯣꯛꯂꯕꯥ", "hiddencategories": "This page is a member of {{PLURAL:$1|1 hidden category|$1 hidden categories}}:", "permissionserrors": "ꯑꯌꯥꯕꯥꯗꯨ ꯁꯣꯏꯔꯦ", @@ -535,7 +535,7 @@ "revisionasof": " $1 ꯒꯤ ꯑꯃꯨꯛ ꯍꯟꯅ ꯌꯦꯡꯕ", "revision-info": " $1 ꯒꯤ ꯑꯃꯨꯛꯌꯦꯡꯕ {{GENDER:$6|$2}}$7 ꯅꯥ", "previousrevision": "← ꯑꯔꯤꯕꯥ ꯑꯃꯨꯛ ꯍꯟꯅꯥ ꯌꯦꯡꯕꯥ", - "nextrevision": "ꯑꯅꯧꯕꯥ ꯑꯃꯨꯛꯍꯟꯅꯥ ꯌꯦꯡꯕꯥ", + "nextrevision": "ꯑꯅꯧꯕꯥ ꯑꯃꯨꯛꯍꯟꯅꯥ ꯌꯦꯡꯕꯥ →", "currentrevisionlink": "ꯈꯋꯥꯏꯗꯒꯤ ꯅꯧꯅꯥ ꯑꯃꯨꯛ ꯌꯦꯡꯕꯥ", "cur": "ꯍꯧ", "next": "ꯃꯊꯪ", @@ -577,7 +577,7 @@ "nextn": "ꯃꯥꯊꯪ{{PLURAL:$1|$1}}", "prevn-title": "ꯃꯃꯥꯡꯒꯤ $1 {{PLURAL:$1|result|results}}", "nextn-title": "ꯃꯊꯪ $1 {{PLURAL:$1|ꯐꯣꯜ|ꯐꯣꯜꯁꯤꯡ}}", - "shown-title": "Show $1 {{PLURAL:$1|result|results}} per page", + "shown-title": "ꯎꯠꯂꯨ $1 {{PLURAL:$1|result|results}} ꯂꯃꯥꯏ ꯑꯃꯝ ꯑꯃꯝꯒꯤ ꯑꯣꯏꯅꯥ", "viewprevnext": "ꯎꯨꯇꯂꯨ ($1 {{int:pipe-separator}} $2) ($3)", "searchmenu-exists": "ꯃꯁꯤꯗ ꯂꯃꯥꯏ ꯑꯃꯥ ꯂꯩꯔꯦ ꯃꯃꯤꯡꯅꯥ \"[[:$1]]\" ꯁꯤꯒꯤ ꯋꯤꯀꯤꯁꯤꯗ {{PLURAL:$2|0=|ꯌꯦꯡꯉꯨ ꯁꯤꯖꯨ ꯑꯇꯩ ꯊꯤꯕꯒꯤ ꯐꯣꯜꯁꯤꯡꯗꯨ ꯫}}", "searchmenu-new": "ꯂꯃꯥꯏ ꯁꯥꯔꯣ \"[[:$1]]\" on this wiki! {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}", @@ -728,7 +728,7 @@ "nmembers": "$1 {{PLURAL:$1|member|members}}", "prefixindex": "ꯋꯥꯇꯞ ꯀꯥ ꯂꯣꯏꯅꯕ ꯂꯥꯃꯥꯏꯁꯤꯡ ꯄꯨꯝꯅꯃꯛ", "listusers": "ꯁꯤꯖꯤꯟꯅꯔꯤꯕ ꯁꯤꯡꯒꯤ ꯄꯥꯔꯦꯡ", - "newpages": "ꯑꯅꯧꯕꯥ ꯂꯥꯃꯥꯏꯁꯤꯡ", + "newpages": "ꯑꯅꯧꯕꯥ ꯂꯃꯥꯏꯁꯤꯡ", "move": "ꯂꯦꯡꯍꯟꯕꯥ", "pager-newer-n": "{{PLURAL:$1|newer 1|newer $1}}", "pager-older-n": "{{PLURAL:$1|older 1|older $1}}", @@ -761,7 +761,7 @@ "protect-default": "ꯁꯤꯖꯤꯟꯅꯔꯤꯕꯁꯤꯡ ꯄꯨꯂꯞ ꯌꯥꯍꯟꯕ", "restriction-edit": "ꯁꯦꯝꯒꯠꯄꯥ", "restriction-move": "ꯂꯦꯡꯍꯟꯕꯥ", - "namespace": "ꯃꯥꯃꯤꯡꯒꯤ ꯃꯐꯝ", + "namespace": "ꯃꯥꯃꯤꯡꯒꯤ ꯃꯐꯝ:", "invert": "ꯈꯟꯂꯤꯕꯗꯨ ꯃꯀꯣꯛꯇꯒꯤ ꯂꯥꯛꯍꯟꯕ", "tooltip-invert": "Akhannaba maming gi manungda page tungi ahongba lotnaba oopu du yeng ngoo", "namespace_association": "Maming eefam ga marileinaba", @@ -823,20 +823,20 @@ "tooltip-pt-logout": "ꯊꯣꯛꯂꯛꯄꯥ", "tooltip-pt-createaccount": "ꯅꯪꯒꯤ ꯑꯣꯏꯕꯥ ꯱ ꯁꯦꯝꯕꯥ ꯑꯃꯥꯁꯨꯪ ꯃꯅꯨꯡ ꯆꯪꯁꯤꯟꯕꯥꯁꯤ ꯄꯨꯛꯅꯤꯡ ꯊꯧꯒꯠꯂꯤ, ꯇꯧꯕꯇꯕꯨ ꯃꯁꯤ ꯁꯪꯁꯣꯏ ꯁꯣꯏꯗꯅꯥ ꯆꯡꯕꯗꯤ ꯅꯠꯇꯦ", "tooltip-ca-talk": "ꯃꯅꯨꯡꯆꯟꯂꯤꯕꯥ ꯂꯥꯃꯥꯏꯁꯤꯒꯤ ꯃꯇꯥꯁꯗꯥ ꯈꯟꯅꯥ ꯅꯩꯅꯕꯥ", - "tooltip-ca-edit": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯁꯦꯝꯒꯠꯂꯨ", + "tooltip-ca-edit": "ꯃꯁꯤꯒꯤ ꯂꯃꯥꯏꯁꯤ ꯁꯦꯝꯒꯠꯂꯨ", "tooltip-ca-addsection": "ꯑꯅꯧꯕ ꯈꯥꯏꯗꯣꯛꯄꯗꯨ ꯍꯧꯔꯣ", "tooltip-ca-viewsource": "ꯃꯁꯤꯒꯤ ꯂꯃꯥꯏꯁꯤ ꯉꯥꯛꯊꯣꯛꯂꯦ \nꯅꯪꯅꯥ ꯂꯃꯥꯏꯁꯤꯒꯤ ꯍꯧꯔꯛꯐꯝ ꯎꯒꯅꯤ", - "tooltip-ca-history": "ꯍꯧꯈꯔꯕꯥ ꯂꯥꯃꯥꯏ ꯑꯃꯨꯛ ꯍꯟꯅꯥ ꯌꯦꯡꯕꯥ", + "tooltip-ca-history": "ꯍꯧꯈꯔꯕꯥ ꯂꯃꯥꯏ ꯑꯃꯨꯛ ꯍꯟꯅꯥ ꯌꯦꯡꯕꯥ", "tooltip-ca-protect": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯉꯥꯛ ꯎ", - "tooltip-ca-delete": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯀꯛꯊꯠꯂꯨ", - "tooltip-ca-move": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯂꯦꯡꯍꯟꯂꯨ", + "tooltip-ca-delete": "ꯃꯁꯤꯒꯤ ꯂꯃꯥꯏꯁꯤ ꯀꯛꯊꯠꯂꯨ", + "tooltip-ca-move": "ꯃꯁꯤꯒꯤ ꯂꯃꯥꯏꯁꯤ ꯂꯦꯡꯍꯟꯂꯨ", "tooltip-ca-watch": "ꯅꯪꯒꯤ ꯌꯦꯡꯅꯕꯥ ꯄꯥꯔꯦꯡꯗꯨꯗꯥ ꯍꯥꯞꯆꯏꯟꯂꯨ ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ", "tooltip-ca-unwatch": "ꯅꯪꯒꯤ ꯌꯦꯡꯅꯕ ꯄꯥꯔꯦꯡ ꯗꯒꯤ ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯂꯧꯊꯣꯛ ꯎ", "tooltip-search": "ꯊꯤꯔꯣ", "tooltip-search-go": "ꯂꯩꯔꯥꯒꯗꯤ ꯆꯠꯂꯨ ꯃꯗꯨꯒꯤ ꯆꯞꯆꯕ ꯂꯃꯥꯏ ꯗꯨꯗ", "tooltip-search-fulltext": "ꯏꯔꯤꯕꯥ ꯃꯇꯦꯛꯁꯤꯒꯤ ꯂꯃꯥꯏ ꯁꯤ ꯊꯤꯔꯣ", "tooltip-p-logo": "ꯃꯔꯨ ꯑꯣꯏꯕꯥ ꯂꯥꯃꯥꯏꯗꯨꯗꯥ ꯌꯧꯁꯤꯟꯂꯨ", - "tooltip-n-mainpage": "ꯃꯔꯨ ꯑꯣꯏꯕꯥ ꯂꯥꯃꯥꯏꯗꯨꯗꯥ ꯌꯧꯁꯤꯟꯂꯨ", + "tooltip-n-mainpage": "ꯃꯔꯨꯑꯣꯏꯕ ꯂꯃꯥꯏꯗꯨꯗꯥ ꯌꯧꯁꯤꯟꯂꯨ", "tooltip-n-mainpage-description": "ꯃꯔꯨ ꯑꯣꯏꯕꯥ ꯂꯥꯃꯥꯏꯗꯨꯗꯥ ꯌꯧꯁꯤꯟꯂꯨ", "tooltip-n-portal": "ꯊꯧꯑꯣꯡ ꯂꯥꯛꯄꯗꯨꯒꯤ ꯃꯔꯝꯗ꯬", "tooltip-n-currentevents": "ꯆꯠꯊꯔꯤꯕꯥ ꯊꯧꯔꯝꯁꯤꯒꯤ ꯃꯅꯨꯒꯤ ꯑꯣꯏꯕꯥ ꯋꯥꯔꯣꯟꯗꯨ ꯄꯨꯊꯣꯛ ꯎ", @@ -855,12 +855,12 @@ "tooltip-ca-nstab-user": "ꯁꯤꯖꯤꯟꯅꯔꯤꯕꯥ ꯂꯥꯃꯥꯏꯁꯤ ꯌꯦꯡꯕꯥ", "tooltip-ca-nstab-special": "ꯃꯁꯤ ꯑꯈꯟꯅꯕꯥ ꯂꯃꯥꯏꯅꯤ, ꯁꯦꯝꯒꯠꯄꯥ ꯌꯥꯔꯣꯏ", "tooltip-ca-nstab-project": "ꯂꯃꯥꯏꯁꯤꯒꯤ ꯇꯧꯒꯗꯥ ꯊꯧꯔꯥꯡꯗꯨ ꯎꯨꯇꯂꯨ", - "tooltip-ca-nstab-image": "ꯐꯥꯏꯜ ꯂꯥꯃꯥꯏꯗꯨꯨꯨꯨꯨ ꯎꯨꯠꯂꯨ", + "tooltip-ca-nstab-image": "ꯐꯥꯏꯜ ꯂꯃꯥꯏꯗꯨꯨꯨꯨꯨ ꯎꯨꯠꯂꯨ", "tooltip-ca-nstab-mediawiki": "ꯊꯧꯁꯤꯜꯒꯤ ꯑꯣꯏꯕ ꯄꯥꯎꯖꯦꯜꯗꯨ ꯎꯨꯠꯂꯨ", "tooltip-ca-nstab-template": "ꯇꯦꯝꯄꯂꯦꯠ ꯇꯨ ꯎꯨꯠꯂꯨ", "tooltip-ca-nstab-category": "ꯃꯆꯥꯈꯥꯏꯕ ꯂꯃꯥꯏꯗꯨ ꯎꯨꯠꯂꯨ", "tooltip-save": "ꯅꯪꯒꯤ ꯑꯍꯣꯡꯕꯗꯨ ꯇꯨꯡꯁꯤꯟꯂꯨ", - "tooltip-preview": "ꯅꯪꯒꯤ ꯑꯍꯣꯡꯕꯗꯨ ꯑꯃꯨꯛ ꯍꯟꯅꯥ ꯎꯠꯂꯨ. ꯆꯥꯟꯕꯤꯗꯨꯅꯥ ꯃꯁꯤ ꯍꯥꯟꯅꯥ ꯁꯤꯖꯤꯅꯧ ꯇꯪꯁꯤꯟꯗ꯭ꯔꯤꯉꯧꯗꯥ ꯫", + "tooltip-preview": "ꯅꯪꯒꯤ ꯑꯍꯣꯡꯕꯗꯨ ꯑꯃꯨꯛ ꯍꯟꯅꯥ ꯎꯠꯂꯨ. ꯆꯥꯟꯕꯤꯗꯨꯅꯥ ꯃꯁꯤ ꯍꯥꯟꯅꯥ ꯁꯤꯖꯤꯅꯧ ꯇꯪꯨꯁꯤꯟꯗ꯭ꯔꯤꯉꯧꯗꯥ ꯫", "tooltip-diff": "ꯅꯪꯅꯥ ꯏꯔꯤꯕꯥ ꯄꯥꯔꯦꯡꯗꯨꯗꯥ ꯑꯍꯣꯡꯕꯥ ꯎꯠꯂꯨ", "tooltip-compareselectedversions": "See the differences between the two selected revisions of this page", "tooltip-watch": "ꯍꯥꯞꯆꯤꯟꯂꯨ ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯅꯪꯅ ꯌꯦꯡꯂꯤꯕ ꯄꯔꯦꯡ ꯗ", @@ -873,11 +873,11 @@ "pageinfo-header-edits": "ꯄꯨꯋꯥꯔꯤ ꯁꯦꯝꯒꯠꯄ", "pageinfo-header-restrictions": "ꯉꯥꯛꯊꯣꯛꯂꯕꯥ ꯂꯃꯥꯏ", "pageinfo-header-properties": "ꯂꯃꯥꯏꯁꯤ ꯒꯤ ꯑꯣꯏꯒꯗꯕꯁꯤꯡ", - "pageinfo-display-title": "ꯂꯥꯃꯥꯤꯒꯤ ꯃꯃꯤꯡ ꯌꯦꯡꯍꯟꯕ", + "pageinfo-display-title": "ꯂꯃꯥꯏꯒꯤ ꯑꯄꯤꯕ ꯃꯃꯤꯡ ꯎꯠꯊꯣꯛꯄ", "pageinfo-default-sort": "ꯑꯇꯦꯟꯕ-꯱ꯍꯦꯛ-ꯇ ꯌꯥꯕ ‌‌‌‌‌", - "pageinfo-length": "ꯂꯥꯃꯥꯏꯒꯤ ꯑꯁꯥꯡꯕ(ꯕꯥꯏꯇ ꯇ)", - "pageinfo-article-id": "ꯂꯥꯃꯥꯏꯒꯤ ꯁꯛꯇꯥꯛ", - "pageinfo-language": "ꯂꯥꯃꯥꯏꯁꯤꯗ ꯏꯔꯤꯕ ꯂꯣꯟ", + "pageinfo-length": "ꯂꯃꯥꯏꯒꯤ ꯑꯁꯥꯡꯕ(ꯕꯥꯏꯇ ꯇ)", + "pageinfo-article-id": "ꯂꯃꯥꯏꯒꯤ ꯁꯛꯇꯥꯛ", + "pageinfo-language": "ꯂꯃꯥꯏꯁꯤꯗ ꯏꯔꯤꯕ ꯂꯣꯟ", "pageinfo-content-model": "ꯂꯥꯃꯥꯏꯁꯤꯗ ꯌꯥꯎꯔꯤꯕ ꯃꯑꯣꯡ ꯃꯇꯧ", "pageinfo-robot-policy": "ꯔꯣꯕꯣꯠꯁꯤꯡꯅꯥ ꯍꯥꯞꯆꯤꯟꯕ", "pageinfo-robot-index": "ꯌꯥꯍꯟꯕ", @@ -927,9 +927,9 @@ "exif-orientation-1": "ꯆꯥꯡ ꯅꯥꯏꯅꯥ", "namespacesall": "ꯄꯨꯂꯞ", "monthsall": "ꯄꯨꯂꯞ", - "imgmultipagenext": "ꯃꯊꯪ ꯂꯥꯃꯥꯏ", + "imgmultipagenext": "ꯃꯊꯪ ꯂꯃꯥꯏ →", "imgmultigo": "ꯆꯠꯂꯨ", - "imgmultigoto": "$1 ꯂꯥꯃꯥꯏ ꯗ ꯆꯠꯂꯨ", + "imgmultigoto": "$1 ꯂꯃꯥꯏ ꯗ ꯆꯠꯂꯨ", "watchlisttools-clear": "ꯌꯦꯡꯂꯤꯕ ꯄꯥꯔꯦꯡꯗꯨ ꯁꯦꯡꯗꯣꯛ ꯨꯎ", "watchlisttools-view": "ꯃꯁꯤꯒ ꯆꯥꯟꯅꯕ ꯑꯍꯣꯡꯕꯗꯨ ꯎꯨꯠꯂꯨ", "watchlisttools-edit": "ꯌꯦꯡꯂꯤꯕ ꯄꯥꯔꯦꯡꯗꯨ ꯁꯦꯝꯒꯌꯂꯨ ꯱ꯁꯨꯡ ꯎꯨꯠꯂꯨ", @@ -941,7 +941,7 @@ "redirect-value": "ꯃꯔꯨꯑꯣꯏꯅꯥ ꯂꯧꯅꯕ:", "redirect-user": "ꯁꯤꯖꯤꯟꯅꯔꯤꯕ ꯁꯛꯇꯥꯛ", "redirect-page": "ꯂꯃꯥꯏꯒꯤ ꯁꯛꯇꯛ", - "redirect-revision": "ꯂꯥꯃꯥꯏ ꯑꯃꯨꯧꯍꯟꯅ ꯌꯦꯡꯕ", + "redirect-revision": "ꯂꯃꯥꯏ ꯑꯃꯨꯛꯍꯟꯅ ꯌꯦꯡꯕ", "redirect-file": "ꯐꯥꯏꯜ ꯃꯃꯤꯡ", "specialpages": "ꯑꯈꯟꯅꯕ ꯂꯃꯥꯏꯁꯤꯡ", "tag-filter": "[[Special:Tags|ꯊꯦꯡꯕ]] ꯁꯦꯡꯇꯣꯛꯄ:", diff --git a/languages/i18n/nl.json b/languages/i18n/nl.json index eceecb5275..a0df9140de 100644 --- a/languages/i18n/nl.json +++ b/languages/i18n/nl.json @@ -2578,6 +2578,8 @@ "createaccountblock": "aanmaken accounts uitgeschakeld", "emailblock": "e-mail uitgeschakeld", "blocklist-nousertalk": "kan eigen overlegpagina niet bewerken", + "blocklist-editing": "bewerken", + "blocklist-editing-sitewide": "bewerken (gehele wiki)", "ipblocklist-empty": "De blokkeerlijst is leeg.", "ipblocklist-no-results": "Dit IP-adres of deze gebruikersnaam is niet geblokkeerd.", "blocklink": "blokkeren", diff --git a/languages/i18n/nn.json b/languages/i18n/nn.json index bc6800cf61..10ff1320ea 100644 --- a/languages/i18n/nn.json +++ b/languages/i18n/nn.json @@ -865,6 +865,7 @@ "search-redirect": "(omdirigering frå $1)", "search-section": "(bolken $1)", "search-category": "(kategorien $1)", + "search-file-match": "(passar med filinnhald)", "search-suggest": "Meinte du: «$1»", "search-rewritten": "Viser resultat for $1. Søk i staden etter $2.", "search-interwiki-caption": "Resultat frå systerprosjekt", diff --git a/languages/i18n/pt.json b/languages/i18n/pt.json index c74e042621..c81f4e70ae 100644 --- a/languages/i18n/pt.json +++ b/languages/i18n/pt.json @@ -819,8 +819,8 @@ "content-model-json": "JSON", "content-json-empty-object": "Objeto vazio", "content-json-empty-array": "Matriz vazia", - "deprecated-self-close-category": "Páginas com etiquetas HTML auto-fechadas inválidas", - "deprecated-self-close-category-desc": "Esta página contém etiquetas HTML auto-fechadas, que são inválidas, tais como <b/> ou <span/>. O comportamento destas etiquetas será alterado em breve, para ser consistente com a especificação HTML5, pelo que o seu uso no texto wiki foi descontinuado.", + "deprecated-self-close-category": "Páginas com etiquetas HTML autofechadas inválidas", + "deprecated-self-close-category-desc": "Esta página contém etiquetas HTML autofechadas, que são inválidas, tais como <b/> e <span/>. O comportamento destas etiquetas será alterado em breve, para ser consistente com a especificação HTML5, pelo que o seu uso no texto wiki foi descontinuado.", "duplicate-args-warning": "Aviso: [[:$1]] chama [[:$2]] com mais de um valor para o parâmetro \"$3\". Somente o último valor fornecido será utilizado.", "duplicate-args-category": "Páginas com argumentos de predefinições duplicados", "duplicate-args-category-desc": "A página contém chamadas de predefinições que passam à predefinição argumentos duplicados, tais como {{foo|bar=1|bar=2}} ou {{foo|bar|1=baz}}.", @@ -2072,7 +2072,7 @@ "apisandbox-dynamic-error-exists": "Um parâmetro com o nome \"$1\" já existe.", "apisandbox-templated-parameter-reason": "Este [[Special:ApiHelp/main#main/templatedparams|parâmetro modelado]] é oferecido com base {{PLURAL:$1|no valor|nos valores}} de $2.", "apisandbox-deprecated-parameters": "Parâmetros obsoletos", - "apisandbox-fetch-token": "Auto-preencher o token", + "apisandbox-fetch-token": "Preencher automaticamente a chave", "apisandbox-add-multi": "Adicionar", "apisandbox-submit-invalid-fields-title": "Alguns campos são inválidos", "apisandbox-submit-invalid-fields-message": "Por favor, corrija os campos marcados e tente novamente.", @@ -2194,13 +2194,13 @@ "trackingcategories-desc": "Critérios de inclusão", "restricted-displaytitle-ignored": "Páginas com títulos de apresentação ignorados", "restricted-displaytitle-ignored-desc": "Esta página tem um {{DISPLAYTITLE}} ignorado porque não é equivalente ao título verdadeiro da página.", - "noindex-category-desc": "A página não é indexada por robôs porque contém a palavra mágica __NOINDEX__ e está num domínio onde esta palavra mágica é permitida.", - "index-category-desc": "A página contém a palavra mágica __INDEX__ (e está num domínio em que essa marca é permitida) e, portanto, será indexada pelos robôs mesmo quando normalmente não o seria.", + "noindex-category-desc": "A página não é indexada por robôs porque contém a palavra mágica __NOINDEX__ e está num espaço nominal onde esta palavra mágica é permitida.", + "index-category-desc": "A página contém a palavra mágica __INDEX__ (e está num espaço nominal em que esta palavra é permitida) e, portanto, será indexada por robôs mesmo quando normalmente não o seria.", "post-expand-template-inclusion-category-desc": "O tamanho da página é superior a $wgMaxArticleSize, após a expansão de todas as predefinições, pelo que algumas predefinições não foram expandidas.", - "post-expand-template-argument-category-desc": "O tamanho da página é superior a $wgMaxArticleSize, após a expansão de um argumento de predefinição (algo em chavetas triplas, como {{{Foo}}}).", - "expensive-parserfunction-category-desc": "A página tem demasiadas funções do analisador custosas (como #ifexist) incluídas. Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", + "post-expand-template-argument-category-desc": "O tamanho da página é superior a $wgMaxArticleSize, após a expansão de um argumento de predefinição (algo entre chavetas triplas, como {{{Foo}}}).", + "expensive-parserfunction-category-desc": "A página inclui demasiadas funções exigentes do analisador sintático (como #ifexist). Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", "broken-file-category-desc": "A página contém uma hiperligação quebrada para um ficheiro (uma hiperligação para incorporar um ficheiro que não existe).", - "hidden-category-category-desc": "Esta é uma categoria com a marca __HIDDENCAT__, que faz com que ela não apareça na caixa de hiperligações de categoria nas páginas, por omissão.", + "hidden-category-category-desc": "Esta categoria contém __HIDDENCAT__, que faz com que ela não apareça na caixa de hiperligações de categoria das páginas, por omissão.", "trackingcategories-nodesc": "Sem descrição disponível.", "trackingcategories-disabled": "A categoria está desativada.", "mailnologin": "Não existe endereço de envio", diff --git a/languages/i18n/sd.json b/languages/i18n/sd.json index 38488f9cae..0ed5e69c98 100644 --- a/languages/i18n/sd.json +++ b/languages/i18n/sd.json @@ -883,11 +883,13 @@ "right-editinterface": "واپرائيندڙ باهمرُو کي سنواريو", "right-viewmywatchlist": "پنهنجي نظر ۾ فھرست ڏسو", "right-editmywatchlist": "پنهنجي نگھداشت واري فهرست کي سنواريو. ياد رکو ڪجهه ڪم هن اختيار کان سواءِ پڻ ممڪن آهن.", + "right-viewmyprivateinfo": "پنهنجي ذاتي معلومات ڏسو (جيئن: برق ٽپال پتو، اصل نالو وغيره)", "right-editmyprivateinfo": "پنهنجي ذاتي معلومات سنواريو (جيئن برق ٽپال، اصل نالو)", "right-editmyoptions": "پنهنجون ترجيحون سنواريو", "right-import": "ٻين وڪيز کان صفحا درآمديو", "right-importupload": "ڪو فائيل چاڙهي صفحا درآمديو", "right-patrol": "ٻين جي ترميمن کي گشت-ڪيل طور نشان لڳايو", + "right-autopatrol": "سندس تخليق ڪيل مضمون پاڻمرادو گشت ڪيل ڄاڻايا ويندا آهن.", "right-mergehistory": "صفحن جي سوانح سنواريو", "right-userrights": "واپرائيندڙ جا سڀ حق سنواريو", "right-userrights-interwiki": "ٻين وڪين تي واپرائيندڙن جا حق سنواريو", diff --git a/languages/i18n/skr-arab.json b/languages/i18n/skr-arab.json index 3dfc36dd08..f77ecb97a4 100644 --- a/languages/i18n/skr-arab.json +++ b/languages/i18n/skr-arab.json @@ -924,9 +924,13 @@ "whatlinkshere-filters": "چھاݨے", "whatlinkshere-submit": "ڄلو", "ipbreason": "سبب:", + "ipb-partial": "جزوی", + "ipb-type-label": "قسم", + "ipb-pages-label": "ورقے", "autoblocklist-submit": "ڳولو", "blocklist-reason": "سبب:", "infiniteblock": "بے انت", + "blocklist-editing": "زیر ترمیم", "blocklink": "پابندی لاؤ", "contribslink": "حصے داری", "blocklogpage": "پابندی دی لاگ", @@ -1094,5 +1098,6 @@ "logentry-upload-overwrite": "$1 نے $3 دا نواں نسخہ {{GENDER:$2|اپلوڈ کیتا}}", "searchsuggest-search": "ڳولو", "duration-days": "$1 {{PLURAL:$1|ݙینہ}}", + "mw-widgets-titlesmultiselect-placeholder": "ٻیا شامل کرو۔۔۔", "randomrootpage": "بے ترتيب بنیادی ورقہ" } diff --git a/languages/i18n/sr-ec.json b/languages/i18n/sr-ec.json index fd388d7483..a4e5b1c165 100644 --- a/languages/i18n/sr-ec.json +++ b/languages/i18n/sr-ec.json @@ -470,7 +470,7 @@ "createacct-benefit-body1": "{{PLURAL:$1|измена|измене|измена}}", "createacct-benefit-body2": "{{PLURAL:$1|страница|странице|страница}}", "createacct-benefit-body3": "недавно {{PLURAL:$1|активни корисник|активна корисника|активних корисника}}", - "badretype": "Унете лозинке се не поклапају.", + "badretype": "Лозинке које сте унели се не поклапају.", "usernameinprogress": "Налог за ово корисничко име се већ прави, сачекајте.", "userexists": "Унесено корисничко име је већ у употреби.\nОдаберите друго.", "loginerror": "Грешка при пријављивању", @@ -664,6 +664,8 @@ "subject-preview": "Преглед теме:", "previewerrortext": "Дошло је до грешке при покушају прегледа промена.", "blockedtitle": "Корисник је блокиран", + "blocked-email-user": "Вашем корисничком имену је блокирано слање имејлова. Још увек можете да уређујете друге странице на овом викију. Можете да видите потпуне детаље блокаде на [[Special:MyContributions|доприносима налога]].\n\nБлокаду је извршио/ла $1.\n\nНаведен је следећи разлог: $2.\n\n* Почетак блокаде: $8\n* Истек блокаде: $6\n* Намењена кориснику/ци или IP адреси: $7\n* ID блокаде #$5", + "blockedtext-partial": "Вашем корисничком имену или IP адреси је блокирано прављење промена на овој страници. Још увек можете да уређујете друге странице на овом викију. Можете да видите потпуне детаље блокаде на [[Special:MyContributions|доприносима налога]].\n\nБлокаду је извршио/ла $1.\n\nНаведен је следећи разлог: $2.\n\n* Почетак блокаде: $8\n* Истек блокаде: $6\n* Намењена кориснику/ци или IP адреси: $7\n* ID блокаде #$5", "blockedtext": "Ваше корисничко име или IP адреса је блокирана.\n\nБлокаду је {{GENDER:$4|извршио|извршила}} $1.\nРазлог је $2.\n\n* Почетак блокаде: $8\n* Истек блокаде: $6\n* Блокирани: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте дискутовали о блокади.\nНе можете да користите функцију „{{int:emailuser}}” осим ако сте навели валидну имејл-адресу у својим [[Special:Preferences|подешавањима налога]] и нисте блокирани од коришћења исте.\nВаша тренутна IP адреса је $3, а ID блокаде #$5.\nНаведите све горње детаље при прављењу било каквих упита.", "autoblockedtext": "Ваша IP адреса је аутоматски блокирана јер ју је користио други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:$2\n\n* Почетак блокаде: $8\n* Крај блокаде: $6\n* Име корисника: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте расправљали о блокади.\n\nЗапамтите да не можете да користите функцију „{{int:emailuser}}“ осим ако сте навели важећу имејл-адресу у својим [[Special:Preferences|подешавањима]].\n\nВаша тренутна IP адреса је $3, а ID блокаде $5.\nУкључите све горње детаље при прављењу било каквих упита.", "blockednoreason": "разлог није наведен", @@ -2449,6 +2451,10 @@ "ipb-disableusertalk": "Онемогући кориснику да уређује своју страницу за разговор", "ipb-change-block": "Поновно блокирај корисника с овим подешавањима", "ipb-confirm": "Потврди блокирање", + "ipb-sitewide": "На целом сајту", + "ipb-partial": "Делимично", + "ipb-type-label": "Врста", + "ipb-pages-label": "Странице", "badipaddress": "Неважећа IP адреса", "blockipsuccesssub": "Блокирање је успело", "blockipsuccesstext": "[[Special:Contributions/$1|$1]] је {{GENDER:$1|блокиран|блокирана}}.
\nПогледајте [[Special:BlockList|списак]] за преглед блокада.", @@ -2498,6 +2504,8 @@ "createaccountblock": "отварање налога је онемогућено", "emailblock": "имејл је онемогућен", "blocklist-nousertalk": "забрањено уређивање сопствене странице за разговор", + "blocklist-editing": "уређивање", + "blocklist-editing-sitewide": "уређивање (на целом сајту)", "ipblocklist-empty": "Списак блокирања је празан.", "ipblocklist-no-results": "Тражена IP адреса или корисничко име није блокирано.", "blocklink": "блокирај", @@ -2727,7 +2735,7 @@ "tooltip-pt-preferences": "{{GENDER:|Ваша}} подешавања", "tooltip-pt-watchlist": "Списак страница чије промене надгледате", "tooltip-pt-mycontris": "Списак {{GENDER:|ваших}} доприноса", - "tooltip-pt-anoncontribs": "Листа измена направљених са ове IP адресе", + "tooltip-pt-anoncontribs": "Списак измена направљених са ове IP адресе", "tooltip-pt-login": "Предлажемо вам да се пријавите, иако то није обавезно", "tooltip-pt-login-private": "Морате да се пријавите да бисте користили овај Вики", "tooltip-pt-logout": "Одјавите се", @@ -3790,7 +3798,7 @@ "dberr-usegoogle": "У међувремену, покушајте да претражите помоћу Гугла.", "dberr-outofdate": "Имајте на уму да њихови примерци нашег садржаја могу бити застарели.", "dberr-cachederror": "Ово је привремено меморисан примерак стране који можда није ажуран.", - "htmlform-invalid-input": "Постоје проблеми са вашим уносом.", + "htmlform-invalid-input": "Постоје проблеми са неким од ваших уноса.", "htmlform-select-badoption": "Вредност коју сте навели није валидна опција.", "htmlform-int-invalid": "Наведена вредност није цели број.", "htmlform-float-invalid": "Наведена вредност није број.", @@ -3849,6 +3857,9 @@ "logentry-block-block": "$1 је {{GENDER:$2|блокирао|блокирала}} {{GENDER:$4|$3}} у трајању од $5 $6", "logentry-block-unblock": "$1 је {{GENDER:$2|деблокирао|деблокирала}} {{GENDER:$4|$3}}", "logentry-block-reblock": "$1 је {{GENDER:$2|променио|променила}} подешавања за блокирање {{GENDER:$4|корисника|кориснице}} {{GENDER:$4|$3}} у трајању од $5 $6", + "logentry-partialblock-block": "$1 је {{GENDER:$2|блокирао|блокирала}} уређивање {{PLURAL:$8|странице|страница}} $7 {{GENDER:$4|кориснику|корисници|кориснику/ци}} $3 са временом истека од $5 $6", + "logentry-non-editing-block-block": "$1 је {{GENDER:$2|блокирао|блокирала}} неуређивачке радње {{GENDER:$4|кориснику|корисници|кориснику/ци}} $3 са временом истека од $5 $6", + "logentry-non-editing-block-reblock": "$1 је {{GENDER:$2|променио|променила}} подешавања блокаде неуређивачких радњи {{GENDER:$4|кориснику|корисници|кориснику/ци}} $3 са временом истека од $5 $6", "logentry-suppress-block": "$1 је {{GENDER:$2|блокирао|блокирала}} {{GENDER:$4|$3}} у трајању од $5 $6", "logentry-suppress-reblock": "$1 је {{GENDER:$2|променио|променила}} подешавања за блокирање {{GENDER:$4|корисника|кориснице}} {{GENDER:$4|$3}} у трајању од $5 $6", "logentry-import-upload": "$1 је {{GENDER:$2|увезао|увезла}} $3 отпремањем датотеке", @@ -4046,6 +4057,7 @@ "mw-widgets-titleinput-description-redirect": "преусмерава на $1", "mw-widgets-categoryselector-add-category-placeholder": "Додајте категорију…", "mw-widgets-usersmultiselect-placeholder": "Додајте још…", + "mw-widgets-titlesmultiselect-placeholder": "Додајте још…", "date-range-from": "Од датума:", "date-range-to": "До датума:", "sessionmanager-tie": "Не можете да комбинујете више типова потврде идентитета: $1.", @@ -4204,5 +4216,6 @@ "passwordpolicies-policy-passwordcannotmatchusername": "Лозинка не може да буде иста као корисничко име", "passwordpolicies-policy-passwordcannotmatchblacklist": "Лозинка се не може подударати са лозинкама на црној листи", "passwordpolicies-policy-maximalpasswordlength": "Лозинка мора да буде краћа од $1 {{PLURAL:$1|знака|знакова}}", - "passwordpolicies-policy-passwordcannotbepopular": "Лозинка не може да буде {{PLURAL:$1|популарна лозинка|на списку $1 популарних лозинки}}" + "passwordpolicies-policy-passwordcannotbepopular": "Лозинка не може да буде {{PLURAL:$1|популарна лозинка|на списку $1 популарних лозинки}}", + "unprotected-js": "Из безбедносних разлога, JavaScript не може да се учита са незаштићене странице. Само направите JavaScript у именском простору „Медијавики:” или као корисничку подстраницу" } diff --git a/languages/i18n/th.json b/languages/i18n/th.json index 1e430b021f..90b9c4d565 100644 --- a/languages/i18n/th.json +++ b/languages/i18n/th.json @@ -32,12 +32,12 @@ ] }, "tog-underline": "การขีดเส้นใต้ลิงก์:", - "tog-hideminor": "ซ่อนการแก้ไขเล็กน้อยในหน้าการเปลี่ยนแปลงล่าสุด", + "tog-hideminor": "ซ่อนการแก้ไขเล็กน้อยในหน้าเปลี่ยนแปลงล่าสุด", "tog-hidepatrolled": "ซ่อนการแก้ไขที่ตรวจสอบแล้วในหน้าปรับปรุงล่าสุด", "tog-newpageshidepatrolled": "ซ่อนหน้าที่ตรวจสอบแล้วในรายการหน้าใหม่", "tog-hidecategorization": "ซ่อนการจัดหมวดหมู่หน้า", "tog-extendwatchlist": "ขยายรายการเฝ้าดูให้แสดงการเปลี่ยนแปลงทั้งหมด ไม่เพียงการเปลี่ยนแปลงล่าสุด", - "tog-usenewrc": "จัดกลุ่มการเปลี่ยนแปลงแบ่งตามหน้าในรายการปรับปรุงล่าสุดและรายการเฝ้าดู", + "tog-usenewrc": "จัดกลุ่มการเปลี่ยนแปลงแบ่งตามหน้าในรายการเปลี่ยนแปลงล่าสุดและรายการเฝ้าดู", "tog-numberheadings": "กำหนดเลขพาดหัวอัตโนมัติ", "tog-editondblclick": "แก้ไขหน้าเมื่อคลิกสองครั้ง", "tog-editsectiononrightclick": "เปิดใช้งานการแก้ไขส่วนโดยคลิกขวาที่ชื่อเรื่องของส่วนนั้น", @@ -62,7 +62,7 @@ "tog-watchlisthideown": "ซ่อนการแก้ไขของฉันจากรายการเฝ้าดู", "tog-watchlisthidebots": "ซ่อนการแก้ไขของบอตจากรายการเฝ้าดู", "tog-watchlisthideminor": "ซ่อนการแก้ไขเล็กน้อยจากรายการเฝ้าดู", - "tog-watchlisthideliu": "ซ่อนการแก้ไขโดยผู้ใช้ล็อกอินจากรายการเฝ้าดู", + "tog-watchlisthideliu": "ซ่อนการแก้ไขโดยผู้ใช้ที่เข้าสู่ระบบจากรายการเฝ้าดู", "tog-watchlistreloadautomatically": "โหลดรายการเฝ้าดูใหม่อัตโนมัติเมื่อใดที่มีการเปลี่ยนตัวกรอง (ต้องการจาวาสคริปต์)", "tog-watchlistunwatchlinks": "เพิ่มเครื่องหมายเลิกเฝ้าดู/เฝ้าดูโดยตรง ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) ลงในหน้าที่เฝ้าดูที่มีการเปลี่ยนแปลง (ต้องการจาวาสคริปต์เพื่อเปิดปิดการใช้งาน)", "tog-watchlisthideanons": "ซ่อนการแก้ไขโดยผู้ใช้นิรนามจากรายการเฝ้าดู", @@ -217,7 +217,7 @@ "tool-link-userrights-readonly": "ดูกลุ่ม{{GENDER:$1|ผู้ใช้}}", "tool-link-emailuser": "ส่งอีเมลหา{{GENDER:$1|ผู้ใช้}}นี้", "imagepage": "ดูหน้าไฟล์", - "mediawikipage": "ดูหน้าสาร", + "mediawikipage": "ดูหน้าข้อความ", "templatepage": "ดูหน้าแม่แบบ", "viewhelppage": "ดูหน้าคำอธิบาย", "categorypage": "ดูหน้าหมวดหมู่", @@ -266,9 +266,9 @@ "youhavenewmessages": "คุณมี$1 ($2)", "youhavenewmessagesfromusers": "คุณมี $1จาก{{PLURAL:$3|ผู้ใช้คนอื่น|ผู้ใช้ $3 คน}} ($2)", "youhavenewmessagesmanyusers": "คุณมี $1จากผู้ใช้หลายคน ($2)", - "newmessageslinkplural": "$1 สารใหม่", + "newmessageslinkplural": "ข้อความใหม่ $1 ข้อความ", "newmessagesdifflinkplural": "$1 การเปลี่ยนแปลงล่าสุด", - "youhavenewmessagesmulti": "คุณมีสารใหม่ที่ $1", + "youhavenewmessagesmulti": "คุณมีข้อความใหม่ที่ $1", "editsection": "แก้ไข", "editold": "แก้ไข", "viewsourceold": "ดูโค้ด", @@ -302,7 +302,7 @@ "nstab-special": "หน้าพิเศษ", "nstab-project": "หน้าโครงการ", "nstab-image": "ไฟล์", - "nstab-mediawiki": "สาร", + "nstab-mediawiki": "ข้อความ", "nstab-template": "แม่แบบ", "nstab-help": "หน้าคำอธิบาย", "nstab-category": "หมวดหมู่", @@ -318,6 +318,7 @@ "databaseerror-query": "คำสั่ง: $1", "databaseerror-function": "ฟังก์ชัน: $1", "databaseerror-error": "ข้อผิดพลาด: $1", + "transaction-duration-limit-exceeded": "เพื่อเป็นการหลีกเลี่ยงการทำซ้ำไม่ให้มีความล่าช้าสูง การดำเนินการนี้ถูกยกเลิกเนื่องจากระยะเวลาในการเขียน ($1) สูงเกินกว่าระยะเวลาที่จำกัดไว้ $2 วินาที\nหากคุณกำลังเปลี่ยนแปลงหลายรายการในครั้งเดียว ให้ลองทำการดำเนินการที่เล็กกว่าแทน", "laggedslavemode": "คำเตือน: หน้านี้อาจไม่มีการปรับข้อมูลล่าสุด", "readonly": "ฐานข้อมูลถูกล็อก", "enterlockreason": "ใส่เหตุแห่งการล็อก ทั้งเวลาที่คาดว่าจะปลดล็อก", @@ -388,14 +389,14 @@ "invalidtitle-knownnamespace": "ชื่อเรื่องที่มีเนมสเปซ \"$2\" กับข้อความ \"$3\" ไม่ถูกต้อง", "invalidtitle-unknownnamespace": "ชื่อเรื่องที่ไม่ทราบเนมสเปซหมายเลข $1 กับข้อความ \"$2\" ไม่ถูกต้อง", "exception-nologin": "ยังไม่ได้เข้าสู่ระบบ", - "exception-nologin-text": "โปรดล็อกอินเพื่อสามารถเข้าถึงหน้าหรือปฏิบัติการนี้", + "exception-nologin-text": "โปรดเข้าสู่ระบบเพื่อให้สามารถเข้าถึงหน้าหรือปฏิบัติการนี้ได้", "exception-nologin-text-manual": "โปรด$1เพื่อสามารถเข้าถึงหน้าหรือปฏิบัติการนี้", "virus-badscanner": "โครงแบบผิดพลาด: ไม่รู้จักตัวสแกนไวรัส: $1", "virus-scanfailed": "การสแกนล้มเหลว (โค้ด $1)", "virus-unknownscanner": "โปรแกรมป้องกันไวรัสที่ไม่รู้จัก:", - "logouttext": "คุณล็อกเอาต์แล้ว\n\nหมายเหตุว่า บางหน้าอาจยังแสดงผลเสมือนว่าคุณยังล็อกอินอยู่ จนกว่าคุณล้างแคชเบราว์เซอร์ของคุณ", - "cannotlogoutnow-title": "ไม่สามารถล็อกเอาต์ได้ขณะนี้", - "cannotlogoutnow-text": "ไม่สามารถล็อกเอาต์ได้เมื่อกำลังใช้ $1", + "logouttext": "คุณออกจากระบบแล้ว\n\nสังเกตว่าบางหน้าอาจยังแสดงผลเสมือนว่าคุณยังเข้าสู่ระบบอยู่ จนกว่าคุณจะล้างแคชเบราว์เซอร์ของคุณ", + "cannotlogoutnow-title": "ไม่สามารถออกจากระบบได้ตอนนี้", + "cannotlogoutnow-text": "ไม่สามารถออกจากระบบได้เมื่อกำลังใช้ $1", "welcomeuser": "ยินดีต้อนรับ $1!", "welcomecreation-msg": "สร้างบัญชีของคุณแล้ว\nคุณสามารถเปลี่ยน[[Special:Preferences|การตั้งค่า]] {{SITENAME}} ของคุณได้หากต้องการ", "yourname": "ชื่อผู้ใช้:", @@ -413,8 +414,8 @@ "userlogin-signwithsecure": "ใช้การเชื่อมต่อที่ปลอดภัย", "cannotlogin-title": "ไม่สามารถเข้าสู่ระบบได้", "cannotlogin-text": "ไม่สามารถเข้าสู่ระบบได้", - "cannotloginnow-title": "ไม่สามารถล็อกเอาต์ได้ขณะนี้", - "cannotloginnow-text": "ไม่สามารถล็อกเอาต์ได้เมื่อกำลังใช้ $1", + "cannotloginnow-title": "ไม่สามารถเข้าสู่ระบบได้ตอนนี้", + "cannotloginnow-text": "ไม่สามารถเข้าสู่ระบบได้เมื่อกำลังใช้ $1", "cannotcreateaccount-title": "ไม่สามารถสร้างบัญชีได้", "cannotcreateaccount-text": "การสร้างบัญชีโดยตรงไม่ได้เปิดใช้งานบนวิกินี้", "yourdomainname": "โดเมนของคุณ:", @@ -422,7 +423,7 @@ "externaldberror": "มีข้อผิดพลาดของฐานข้อมูลการพิสูจน์ตัวจริง หรือคุณไม่ได้รับอนุญาตให้ปรับบัญชีภายนอกของคุณ", "login": "เข้าสู่ระบบ", "login-security": "ยืนยันตัวตนของคุณ", - "nav-login-createaccount": "ล็อกอิน / สร้างบัญชี", + "nav-login-createaccount": "เข้าสู่ระบบ / สร้างบัญชี", "logout": "ออกจากระบบ", "userlogout": "ออกจากระบบ", "notloggedin": "ยังไม่ได้เข้าสู่ระบบ", @@ -443,7 +444,7 @@ "createacct-realname": "ชื่อจริง (เลือกไม่ใส่ได้)", "createacct-reason": "เหตุผล", "createacct-reason-ph": "เหตุใดคุณจึงสร้างอีกบัญชี", - "createacct-reason-help": "สารที่แสดงในปูมการสร้างบัญชี", + "createacct-reason-help": "ข้อความที่แสดงในปูมการสร้างบัญชี", "createacct-submit": "สร้างบัญชีของคุณ", "createacct-another-submit": "สร้างบัญชี", "createacct-continue-submit": "สร้างบัญชีต่อ", @@ -455,20 +456,20 @@ "badretype": "รหัสผ่านที่คุณกรอกไม่ตรง", "usernameinprogress": "การสร้างบัญชีสำหรับชื่อผู้ใช้นี้อยู่ระหว่างดำเนินการแล้ว\nโปรดรอสักครู่", "userexists": "ชื่อผู้ใช้ที่กรอกมีผู้ใช้แล้ว \nกรุณาเลือกชื่ออื่น", - "loginerror": "ล็อกอินผิดพลาด", + "loginerror": "ข้อผิดพลาดในการเข้าสู่ระบบ", "createacct-error": "การสร้างบัญชีผิดพลาด", "createaccounterror": "ไม่สามารถสร้างบัญชี: $1", - "nocookiesnew": "สร้างบัญชีผู้ใช้แล้ว แต่ยังไม่ได้ล็อกอิน \n{{SITENAME}} ใช้คุกกี้เพื่อล็อกอินผู้ใช้\nคุณปิดใช้งานคุกกี้\nโปรดเปิดใช้งาน แล้วล็อกอินพร้อมชื่อผู้ใช้และรหัสผ่านใหม่ของคุณ", + "nocookiesnew": "สร้างบัญชีผู้ใช้แล้ว แต่ยังไม่ได้เข้าสู่ระบบ \n{{SITENAME}} ใช้คุกกี้เพื่อนำผู้ใช้เข้าสู่ระบบ\nคุณปิดใช้งานคุกกี้\nโปรดเปิดใช้งาน แล้วเข้าสู่ระบบพร้อมชื่อผู้ใช้และรหัสผ่านใหม่ของคุณ", "nocookieslogin": "{{SITENAME}} ใช้คุกกี้เพื่อล็อกอินผู้ใช้\nคุณปิดใช้งานคุกกี้\nกรุณาเปิดใช้งานและลองอีกครั้ง", "nocookiesfornew": "บัญชีผู้ใช้ไม่ถูกสร้าง เนื่องจากเราไม่สามารถยืนยันต้นทาง\nกรุณาทำให้แน่ใจว่าคุณได้เปิดใช้งานคุกกี้ โหลดหน้านี้ใหม่และลองอีกครั้ง", "createacct-loginerror": "บัญชีผู้ใช้ถูกสร้างสำเร็จแล้ว แต่คุณไม่สามารถเข้าสู่ระบบได้โดยอัตโนมัติ โปรด[[Special:UserLogin|เข้าสู่ระบบด้วยตนเอง]]", "noname": "คุณไม่ได้ใส่ชื่อผู้ใช้ที่ถูกต้อง", "loginsuccesstitle": "เข้าสู่ระบบแล้ว", - "loginsuccess": "ขณะนี้คุณล็อกอินสู่ {{SITENAME}} ในชื่อ \"$1\"", + "loginsuccess": "ตอนนี้คุณเข้าสู่ระบบ {{SITENAME}} ในชื่อ \"$1\" แล้ว", "nosuchuser": "ไม่มีผู้ใช้ชื่อ \"$1\"\nชื่อผู้ใช้นั้นไวต่ออักษรใหญ่เล็ก\nกรุณาตรวจการสะกดอีกครั้ง หรือ[[Special:CreateAccount|สร้างบัญชีใหม่]]", "nosuchusershort": "ไม่มีผู้ใช้ชื่อ \"$1\" \nกรุณาตรวจสอบการสะกด", "nouserspecified": "คุณต้องระบุชื่อผู้ใช้", - "login-userblocked": "ผู้ใช้นี้ถูกบล็อก ไม่อนุญาตให้ล็อกอิน", + "login-userblocked": "ผู้ใช้นี้ถูกบล็อก ไม่อนุญาตให้เข้าสู่ระบบ", "wrongpassword": "กรอกชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง \nโปรดลองอีกครั้ง", "wrongpasswordempty": "รหัสผ่านที่กรอกว่าง\nโปรดลองอีกครั้ง", "passwordtooshort": "รหัสผ่านต้องมีอย่างน้อย $1 อักขระ", @@ -478,10 +479,10 @@ "password-login-forbidden": "ห้ามใช้ชื่อผู้ใช้และรหัสผ่านนี้", "mailmypassword": "ตั้งรหัสผ่านใหม่", "passwordremindertitle": "รหัสผ่านชั่วคราวใหม่สำหรับ {{SITENAME}}", - "passwordremindertext": "ผู้ใดผู้หนึ่ง (จากเลขที่อยู่ไอพี $1) ขอให้ส่งรหัสผ่านใหม่ของ {{SITENAME}} ($4) รหัสผ่านชั่วคราวสำหรับผู้ใช้ \"$2\" ถูกสร้างขึ้น และกำหนดเป็น \"$3\" หากเป็นเจตนาของคุณ คุณจำต้องล็อกอินและเลือกรหัสผ่านใหม่ในขณะนี้ \nรหัสผ่านชั่วคราวของคุณจะหมดอายุใน $5 วัน\n\nหากเป็นบุคคลอื่นที่ขอรหัสผ่านใหม่ หรือหากคุณจำรหัสผ่านของคุณได้แล้ว และไม่ต้องการเปลี่ยนรหัสผ่านใหม่อีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป", + "passwordremindertext": "ผู้ใดผู้หนึ่ง (จากเลขที่อยู่ไอพี $1) ขอให้ส่งรหัสผ่านใหม่ของ {{SITENAME}} ($4) รหัสผ่านชั่วคราวสำหรับผู้ใช้ \"$2\" ถูกสร้างขึ้น และกำหนดเป็น \"$3\" หากเป็นเจตนาของคุณ คุณจะต้องเข้าสู่ระบบและเลือกรหัสผ่านใหม่ทันที\nรหัสผ่านชั่วคราวของคุณจะหมดอายุใน $5 วัน\n\nหากเป็นบุคคลอื่นที่ขอรหัสผ่านใหม่ หรือหากคุณจำรหัสผ่านของคุณได้แล้ว และไม่ต้องการเปลี่ยนรหัสผ่านใหม่อีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป", "noemail": "ไม่มีการบันทึกที่อยู่อีเมลสำหรับผู้ใช้ \"$1\"", "noemailcreate": "คุณจำต้องใส่ที่อยู่อีเมลให้ถูกต้อง", - "passwordsent": "รหัสผ่านใหม่ถูกส่งไปยังที่อยู่อีเมลที่ลงทะเบียนไว้ของ \"$1\"\nกรุณาล็อกอินอีกครั้งหลังได้รับอีเมล", + "passwordsent": "รหัสผ่านใหม่ถูกส่งไปยังที่อยู่อีเมลที่ลงทะเบียนไว้ของ \"$1\"\nกรุณาเข้าสู่ระบบอีกครั้งหลังได้รับอีเมล", "blocked-mailpassword": "เลขที่อยู่ไอพีของคุณถูกบล็อกมิให้แก้ไข ทำให้ไม่สามารถใช้ฟังก์ชันกู้รหัสผ่าน เพื่อป้องกันการใช้ในทางที่ผิด", "eauthentsent": "อีเมลยืนยันถูกส่งไปยังที่อยู่อีเมลที่ระบุไว้แล้ว \nก่อนที่อีเมลอื่นจะถูกส่งไปยังบัญชีนั้น คุณต้องปฏิบัติตามคำสั่งในอีเมลเพื่อยืนยันว่าบัญชีนั้นเป็นของคุณจริง ๆ", "throttled-mailpassword": "อีเมลตั้งรหัสผ่านใหม่ถูกส่งไปแล้วใน $1 ชั่วโมงที่ผ่านมา \nอีเมลตั้งรหัสผ่านใหม่จะส่งไปหนึ่งครั้งต่อ $1 ชั่วโมงเท่านั้น เพื่อป้องกันการกระทำผิด", @@ -497,12 +498,12 @@ "accountcreated": "สร้างบัญชีแล้ว", "accountcreatedtext": "สร้างบัญชีผู้ใช้สำหรับ [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|พูดคุย]]) แล้ว", "createaccount-title": "การสร้างบัญชีสำหรับ {{SITENAME}}", - "createaccount-text": "มีบางคนสร้างบัญชีโดยใช้ที่อยู่อีเมลของคุณบน {{SITENAME}} ($4) โดยใช้ชื่อ \"$2\" และรหัสผ่าน \"$3\" \nคุณควรล็อกอินและเปลี่ยนรหัสผ่านทันที\n\nคุณอาจเพิกเฉยข้อความนี้ หากการสร้างบัญชีนี้เป็นความผิดพลาด", + "createaccount-text": "มีบางคนสร้างบัญชีโดยใช้ที่อยู่อีเมลของคุณบน {{SITENAME}} ($4) โดยใช้ชื่อ \"$2\" และรหัสผ่าน \"$3\" \nคุณควรเข้าสู่ระบบและเปลี่ยนรหัสผ่านทันที\n\nคุณอาจเพิกเฉยข้อความนี้ หากการสร้างบัญชีนี้เป็นความผิดพลาด", "login-throttled": "ที่ผ่านมาคุณพยายามล็อกอินมากครั้งเกินไป\nกรุณารอ $1 ก่อนลองอีกครั้ง", - "login-abort-generic": "การล็อกอินของคุณไม่สำเร็จ - ล้มเลิกแล้ว", + "login-abort-generic": "การเข้าสู่ระบบของคุณไม่สำเร็จ - ล้มเลิกแล้ว", "login-migrated-generic": "บัญชีของคุณถูกย้ายแล้ว และไม่มีชื่อผู้ใช้ของคุณอยู่บนวิกินี้อีก", "loginlanguagelabel": "ภาษา: $1", - "suspicious-userlogout": "คำขอล็อกเอาต์ของคุณถูกปฏิเสธเพราะดูเหมือนส่งมาจากเบราว์เซอร์หรือพร็อกซีแคชที่เสีย", + "suspicious-userlogout": "คำขอออกจากระบบของคุณถูกปฏิเสธเพราะดูเหมือนส่งมาจากเบราว์เซอร์หรือพร็อกซีแคชที่เสีย", "createacct-another-realname-tip": "ไม่จำเป็นต้องใส่ชื่อจริง\nหากคุณเลือกใส่ชื่อจริง จะใช้เพื่อแสดงที่มาสำหรับงานของตน", "pt-login": "เข้าสู่ระบบ", "pt-login-button": "เข้าสู่ระบบ", @@ -513,19 +514,19 @@ "user-mail-no-addy": "พยายามส่งอีเมลโดยไม่มีที่อยู่อีเมล", "user-mail-no-body": "พยายามส่งอีเมลที่มีเนื้อหาว่างหรือสั้นอย่างไร้เหตุผล", "changepassword": "เปลี่ยนรหัสผ่าน", - "resetpass_announce": "คุณต้องตั้งรหัสผ่านใหม่จึงจะเสร็จสิ้นการล็อกอิน", + "resetpass_announce": "คุณต้องตั้งรหัสผ่านใหม่เพื่อให้การเข้าสู่ระบบเสร็จสมบูรณ์", "resetpass_text": "", "resetpass_header": "เปลี่ยนรหัสผ่านบัญชี", "oldpassword": "รหัสผ่านเดิม:", "newpassword": "รหัสผ่านใหม่:", "retypenew": "พิมพ์รหัสผ่านใหม่อีกครั้ง:", - "resetpass_submit": "ตั้งรหัสผ่านและล็อกอิน", + "resetpass_submit": "ตั้งรหัสผ่านและเข้าสู่ระบบ", "changepassword-success": "เปลี่ยนรหัสผ่านของคุณสำเร็จ!", - "changepassword-throttled": "ล่าสุดคุณพยายามล็อกอินมากครั้งเกินไป\nกรุณารอ $1 ก่อนลองอีกครั้ง", + "changepassword-throttled": "ล่าสุดคุณพยายามเข้าสู่ระบบหลายครั้งเกินไป\nกรุณารอเป็นเวลา $1แล้วจึงลองอีกครั้ง", "botpasswords": "รหัสผ่านบอต", - "botpasswords-summary": "รหัสผ่านบอตอนุญาตการเข้าถึงให้กับบัญชีผู้ใช้ผ่านทาง API โดยไม่ต้องใช้ใบรับรองการล็อกอินหลักของบัญชีนี้ สิทธิผู้ใช้เมื่อล็อกอินด้วยรหัสผ่านบอตอาจถูกจำกัด\n\nถ้าคุณไม่ทราบว่าทำไมคุณอาจต้องการดำเนินการนี้ คุณไม่ควรดำเนินการนี้ และไม่ควรให้ผู้ใดขอให้คุณสร้างรหัสผ่านไว้ให้พวกเขาเหล่านั้น", + "botpasswords-summary": "รหัสผ่านบอตอนุญาตการเข้าถึงให้กับบัญชีผู้ใช้ผ่านทาง API โดยไม่ต้องใช้ใบรับรองการเข้าสู่ระบบหลักของบัญชีนี้ สิทธิผู้ใช้เมื่อเข้าสู่ระบบด้วยรหัสผ่านบอตอาจถูกจำกัด\n\nถ้าคุณไม่ทราบว่าทำไมคุณอาจต้องการดำเนินการนี้ คุณไม่ควรดำเนินการนี้ และไม่ควรให้ผู้ใดขอให้คุณสร้างรหัสผ่านไว้ให้พวกเขาเหล่านั้น", "botpasswords-disabled": "รหัสผ่านสำหรับบอตถูกปิดใช้", - "botpasswords-no-central-id": "หากต้องการใช้รหัสผ่านบอต คุณต้องล็อกอินในชื่อบัญชีผู้ใช้ที่เป็นกลาง", + "botpasswords-no-central-id": "หากต้องการใช้รหัสผ่านบอต คุณต้องเข้าสู่ระบบในชื่อบัญชีผู้ใช้ที่เป็นกลาง", "botpasswords-existing": "รหัสผ่านบอตที่มีอยู่", "botpasswords-createnew": "สร้างรหัสผ่านบอตใหม่", "botpasswords-editexisting": "แก้ไขรหัสผ่านบอตที่มีอยู่เดิม", @@ -548,24 +549,24 @@ "botpasswords-updated-body": "ปรับรหัสผานบอตสำหรับชื่อบอต \"$1\" ของผู้ใช้ \"$2\" แล้ว", "botpasswords-deleted-title": "ลบรหัสผ่านบอตแล้ว", "botpasswords-deleted-body": "ลบรหัสผ่านบอตสำหรับชื่อบอต \"$1\" ของผู้ใช้ชื่อ \"$2\" แล้ว", - "botpasswords-newpassword": "รหัสผ่านใหม่ที่จะใช้กับ $1 คือ $2 โปรดเก็บบันทึกข้อมูลนี้ไว้ เพื่อให้สามารถนำไปใช้อ้างอิงในภายหลังได้
(ในกรณีที่เป็นบอตเก่าซึ่งต้องใช้ชื่อล็อกอินเหมือนกับชื่อผู้ใช้ โปรดใช้ $3 เป็นชื่อผู้ใช้และ $4 เป็นรหัสผ่าน)", + "botpasswords-newpassword": "รหัสผ่านใหม่ที่จะใช้กับ $1 คือ $2 โปรดเก็บบันทึกข้อมูลนี้ไว้ เพื่อให้สามารถนำไปใช้อ้างอิงในภายหลังได้
(ในกรณีที่เป็นบอตเก่าซึ่งต้องใช้ชื่อเข้าสู่ระบบเหมือนกับชื่อผู้ใช้ โปรดใช้ $3 เป็นชื่อผู้ใช้และ $4 เป็นรหัสผ่าน)", "botpasswords-no-provider": "BotPasswordsSessionProvider ไม่พร้อมใช้งาน", - "botpasswords-restriction-failed": "ข้อจำกัดของรหัสผ่านบอตห้ามไม่ให้ล็อกอินครั้งนี้", + "botpasswords-restriction-failed": "ข้อจำกัดของรหัสผ่านบอตห้ามไม่ให้เข้าสู่ระบบในครั้งนี้", "botpasswords-invalid-name": "ชื่อผู้ใช้ที่ระบุไม่มีเครื่องหมายคั่นในรหัสผ่านบอต (\"$1\")", "botpasswords-not-exist": "ผู้ใช้ \"$1\" ไม่มีรหัสผ่านบอต \"$2\".", "botpasswords-needs-reset": "รหัสผ่านบอตสำหรับชื่อบอต \"$2\" ของผู้ใช้ชื่อ \"$1\" ต้องรีเซ็ต", "botpasswords-locked": "คุณไม่สามารถเข้าสู่ระบบด้วยรหัสผ่านบอตได้เนื่องจากบัญชีของคุณถูกล็อกอยู่", "resetpass_forbidden": "ไม่สามารถเปลี่ยนรหัสผ่านได้", "resetpass_forbidden-reason": "ไม่สามารถเปลี่ยนรหัสผ่านได้: $1", - "resetpass-no-info": "คุณจำเป็นต้องล็อกอินเพื่อเข้าถึงหน้านี้โดยตรง", + "resetpass-no-info": "คุณจำเป็นต้องเข้าสู่ระบบเพื่อเข้าถึงหน้านี้โดยตรง", "resetpass-submit-loggedin": "เปลี่ยนรหัสผ่าน", "resetpass-submit-cancel": "ยกเลิก", "resetpass-wrong-oldpass": "รหัสผ่านชั่วคราวหรือปัจจุบันไม่ถูกต้อง\nคุณอาจเปลี่ยนรหัสผ่านของคุณสำเร็จแล้ว หรือขอรหัสผ่านชั่วคราวใหม่แล้ว", "resetpass-recycled": "โปรดเปลี่ยนรหัสผ่านใหม่ให้ต่างจากรหัสผ่านปัจจุบัน", - "resetpass-temp-emailed": "คุณล็อกอินด้วยรหัสผ่านชั่วคราวที่ส่งทางอีเมล\nคุณต้องตั้งรหัสผ่านใหม่ที่นี่จึงจะเสร็จสิ้นการล็อกอิน:", + "resetpass-temp-emailed": "คุณเข้าสู่ระบบด้วยรหัสผ่านชั่วคราวที่ส่งทางอีเมล\nคุณต้องตั้งรหัสผ่านใหม่ที่นี่เพื่อให้การเข้าสู่ระบบเสร็จสมบูรณ์:", "resetpass-temp-password": "รหัสผ่านชั่วคราว:", "resetpass-abort-generic": "การเปลี่ยนรหัสผ่านถูกส่วนขยายยกเลิก", - "resetpass-expired": "รหัสผ่านของคุณหมดอายุแล้ว โปรดตั้งรหัสผ่านใหม่เพื่อล็อกอิน", + "resetpass-expired": "รหัสผ่านของคุณหมดอายุแล้ว โปรดตั้งรหัสผ่านใหม่เพื่อเข้าสู่ระบบ", "resetpass-expired-soft": "รหัสผ่านของคุณหมดอายุแล้วและจำเป็นต้องเปลี่ยนใหม่ โปรดเลือกรหัสผ่านใหม่ขณะนี้ หรือคลิก \"{{int:authprovider-resetpass-skip-label}}\" เพื่อเปลี่ยนใหม่ทีหลัง", "resetpass-validity-soft": "รหัสผ่านของคุณไม่สมเหตุสมผล: $1\n\nโปรดเลือกรหัสผ่านใหม่ในขณะนี้ หรือคลิก \"{{int:authprovider-resetpass-skip-label}}\" เพื่อเปลี่ยนใหม่ทีหลัง", "passwordreset": "ตั้งรหัสผ่านใหม่", @@ -577,7 +578,7 @@ "passwordreset-domain": "โดเมน:", "passwordreset-email": "ที่อยู่อีเมล:", "passwordreset-emailtitle": "รายละเอียดบัญชีบน {{SITENAME}}", - "passwordreset-emailtext-ip": "บางคน (ซึ่งอาจเป็นคุณ จากเลขที่อยู่ไอพี $1) ขอตั้งรหัสผ่านของคุณใหม่บน{{SITENAME}} ($4) บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:\n\n$2\n\n{{PLURAL:$3|รหัสผ่านชั่วคราวนี้|รหัสผ่านชั่วคราวเหล่านี้}}จะหมดอายุใน $5 วัน\nตอนนี้คุณควรล็อกอินและเลือกรหัสผ่านใหม่ หากบุคคลอื่นขอตั้งรหัสผ่านใหม่นี้ หรือคุณจำรหัสผ่านเดิมของคุณได้แล้ว และคุณไม่ต้องการเปลี่ยนรหัสผ่านอีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป", + "passwordreset-emailtext-ip": "บางคน (ซึ่งอาจเป็นคุณ จากเลขที่อยู่ไอพี $1) ขอตั้งรหัสผ่านของคุณใหม่บน{{SITENAME}} ($4) บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:\n\n$2\n\n{{PLURAL:$3|รหัสผ่านชั่วคราวนี้|รหัสผ่านชั่วคราวเหล่านี้}}จะหมดอายุใน $5 วัน\nตอนนี้คุณควรเข้าสู่ระบบและเลือกรหัสผ่านใหม่ หากบุคคลอื่นขอตั้งรหัสผ่านใหม่นี้ หรือคุณจำรหัสผ่านเดิมของคุณได้แล้ว และคุณไม่ต้องการเปลี่ยนรหัสผ่านอีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป", "passwordreset-emailtext-user": "ผู้ใช้ $1 บน {{SITENAME}} ขอตั้งรหัสผ่านของคุณใหม่สำหรับ {{SITENAME}} ($4) {{PLURAL:$3||}}บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:\n\n$2\n\n{{PLURAL:$3|รหัสผ่านชั่วคราวนี้|รหัสผ่านชั่วคราวเหล่านี้}}จะหมดอายุใน $5 วัน\nตอนนี้คุณควรล็อกอินและเลือกรหัสผ่านใหม่ หากบุคคลอื่นขอตั้งรหัสผ่านใหม่นี้ หรือคุณจำรหัสผ่านเดิมของคุณได้แล้ว และคุณไม่ต้องการเปลี่ยนรหัสผ่านอีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป", "passwordreset-emailelement": "ชื่อผู้ใช้: \n$1\n\nรหัสผ่านชั่วคราว: \n$2", "passwordreset-emailsentemail": "หากที่อยู่อีเมลนี้สัมพันธ์กับบัญชีของคุณ เช่นนั้นจะส่งอีเมลตั้งรหัสผ่านใหม่", @@ -589,14 +590,14 @@ "passwordreset-nodata": "ไม่ได้ระบุชื่อผู้ใช้และรหัสผ่านไว้", "changeemail": "เปลี่ยนหรือลบที่อยู่อีเมล", "changeemail-header": "กรอกแบบนี้เพื่อเปลี่ยนที่อยู่อีเมลของคุณ หากคุณต้องการลบการเชื่อมโยงของที่อยู่อีเมลใด ๆ จากบัญชีของคุณ ให้เว้นที่อยู่อีเมลใหม่ว่างเมื่อส่งแบบ", - "changeemail-no-info": "คุณจำต้องล็อกอินเพื่อเข้าถึงหน้านี้โดยตรง", + "changeemail-no-info": "คุณจำเป็นต้องเข้าสู่ระบบเพื่อเข้าถึงหน้านี้โดยตรง", "changeemail-oldemail": "ที่อยู่อีเมลปัจจุบัน:", "changeemail-newemail": "ที่อยู่อีเมลใหม่:", "changeemail-newemail-help": "เว้นว่างเขตข้อมูลนี้หากคุณต้องการลบที่อยู่อีเมลของคุณ คุณจะไม่สามารถตั้งรหัสผ่านที่ลืมใหม่และจะไม่ได้รับอีเมลจากวิกินี้ถ้าลบที่อยู่อีเมล", "changeemail-none": "(ไม่มี)", "changeemail-password": "รหัสผ่าน {{SITENAME}} ของคุณ:", "changeemail-submit": "เปลี่ยนอีเมล", - "changeemail-throttled": "คุณได้พยายามล็อกอินหลายครั้งเกินไป\nกรุณารอ $1 ก่อนลองอีกครั้ง", + "changeemail-throttled": "คุณได้พยายามเข้าสู่ระบบหลายครั้งเกินไป\nกรุณารอเป็นเวลา $1แล้วจึงลองอีกครั้ง", "changeemail-nochange": "กรุณากรอกที่อยู่อีเมลอื่น", "resettokens": "ตั้งโทเค็นใหม่", "resettokens-text": "คุณสามารถตั้งโทเค็นใหม่ ซึ่งให้การเข้าถึงข้อมูลส่วนตัวบางอย่างที่เกี่ยวข้องกับบัญชีของคุณที่นี่\n\nคุณควรตั้งโทเค็นใหม่ หากคุณบอกผู้อื่นโดยมิได้ตั้งใจหรือบัญชีของคุณถูกเจาะ", @@ -640,7 +641,7 @@ "showpreview": "แสดงตัวอย่าง", "showdiff": "แสดงการเปลี่ยนแปลง", "blankarticle": "คำเตือน: หน้าที่คุณกำลังสร้างว่าง หากคุณคลิก \"$1\" อีกครั้ง จะสร้างหน้าโดยไม่มีเนื้อหาใด", - "anoneditwarning": "คำเตือน: คุณมิได้ล็อกอิน สาธารณะจะเห็นเลขที่อยู่ไอพีของคุณหากคุณแก้ไข หากคุณ[$1 ล็อกอิน]หรือ[$2 สร้างบัญชี] การแก้ไขของคุณจะถือว่าเป็นของชื่อผู้ใช้ของคุณ ร่วมกับประโยชน์อื่น", + "anoneditwarning": "คำเตือน: คุณไม่ได้เข้าสู่ระบบ สาธารณะจะเห็นที่อยู่ไอพีของคุณหากคุณทำการแก้ไขใดๆ หากคุณ[$1 เข้าสู่ระบบ]หรือ[$2 สร้างบัญชี] การแก้ไขของคุณจะถือว่าเป็นของชื่อผู้ใช้ของคุณ พร้อมทั้งอาจมีประโยชน์อื่นๆ ด้วย", "anonpreviewwarning": "คุณมิได้ล็อกอิน การบันทึกจะเก็บเลขที่อยู่ไอพีของคุณในประวัติการแก้ไขของหน้านี้", "missingsummary": "อย่าลืม: คุณยังไม่ได้ให้ความย่อการแก้ไข\nถ้าคุณคลิก \"$1\" อีก จะบันทึกการแก้ไขของคุณโดยเว้นไว้", "selfredirect": "คำเตือน: คุณกำลังสร้างการเปลี่ยนทางไปบทความเดียวกัน\nคุณอาจระบุเป้าหมายของการเปลี่ยนทางผิด หรือคุณอาจแก้ไขหน้าผิด \nหากคุณคลิก \"$1\" อีกครั้ง จะสร้างการเปลี่ยนทาง", @@ -650,22 +651,24 @@ "subject-preview": "ตัวอย่างเรื่อง:", "previewerrortext": "เกิดข้อผิดพลาดขณะกำลังพยายามดูตัวอย่างการเปลี่ยนแปลงของคุณ", "blockedtitle": "ผู้ใช้ถูกบล็อก", + "blocked-email-user": "ชื่อผู้ใช้ของคุณถูกบล็อกไม่ให้ส่งอีเมล แต่คุณยังสามารถแก้ไขหน้าอื่นที่อยู่บนวิกินี้ได้ คุณสามารถดูรายละเอียดการบล็อกแบบเต็มได้ที่[[Special:MyContributions|ส่วนร่วมบัญชี]]\n\nผู้ที่ทำการบล็อกคือ $1\n\nเหตุผลสำหรับการบล็อกคือ $2\n\n* เริ่มการบล็อก: $8\n* สิ้นสุดการบล็อก: $6\n* ผู้ถูกบล็อกที่เจตนา: $7\n* ไอดีการบล็อก #$5", + "blockedtext-partial": "ชื่อผู้ใช้หรือเลขที่อยู่ไอพีของคุณถูกบล็อกไม่ให้ทำการเปลี่ยนแปลงหน้านี้ แต่คุณยังสามารถแก้ไขหน้าอื่นที่อยู่บนวิกินี้ได้ คุณสามารถดูรายละเอียดการบล็อกแบบเต็มได้ที่[[Special:MyContributions|ส่วนร่วมบัญชี]]\n\nผู้ที่ทำการบล็อกคือ $1\n\nเหตุผลสำหรับการบล็อกคือ $2\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:$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คุณไม่สามารถใช้คุณลักษณะ \"{{int:emailuser}}\" จนกว่าจะระบุที่อยู่อีเมลที่ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกห้ามใช้\nเลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5 \nโปรดรวมรายละเอียดข้างต้นทั้งหมดในการสอบถามใด ๆ", "systemblockedtext": "ชื่อผู้ใช้หรือที่อยู่ไอพีของคุณถูกบล็อกอัตโนมัติโดยมีเดียวิกิ\nเหตุผลสำหรับการบล็อกคือ:\n\n:$2\n\n* เริ่มการบล็อก: $8\n* สิ้นสุดการบล็อก: $6\n* ผู้ดำเนินการบล็อก: $7\n\nไอพีแอดเดรสปัจจุบันของคุณคือ $3\nโปรดแจ้งรายละเอียดทั้งหมดข้างต้น ถ้าคุณมีข้อสงสัยใด ๆ", "blockednoreason": "ไม่ได้ให้เหตุผล", "whitelistedittext": "คุณต้อง$1เพื่อแก้ไขหน้า", "confirmedittext": "คุณต้องยืนยันที่อยู่อีเมลของคุณก่อนแก้ไขหน้า \nโปรดตั้งและตรวจสอบความสมเหตุสมผลของที่อยู่อีเมลของคุผ่าน[[Special:Preferences|การตั้งค่าผู้ใช้]]", "nosuchsectiontitle": "ไม่พบส่วน", "nosuchsectiontext": "คุณพยายามแก้ไขส่วนที่ไม่มีอยู่ \nส่วนดังกล่าวอาจถูกย้ายหรือลบขณะที่คุณดูหน้าอยู่", - "loginreqtitle": "ต้องล็อกอิน", + "loginreqtitle": "ต้องเข้าสู่ระบบ", "loginreqlink": "เข้าสู่ระบบ", "loginreqpagetext": "กรุณา$1เพื่อดูหน้าอื่น", "accmailtitle": "ส่งรหัสผ่านแล้ว", - "accmailtext": "ส่งรหัสผ่านแบบสุ่มของ [[User talk:$1|$1]] ไป $2 แล้ว สามารถเปลี่ยนรหัสผ่านในหน้า[[Special:ChangePassword|เปลี่ยนรหัสผ่าน]] หลังล็อกอิน", + "accmailtext": "ส่งรหัสผ่านแบบสุ่มของ [[User talk:$1|$1]] ไป $2 แล้ว สามารถเปลี่ยนรหัสผ่านในหน้า[[Special:ChangePassword|เปลี่ยนรหัสผ่าน]] ได้หลังจากเข้าสู่ระบบแล้ว", "newarticle": "(ใหม่)", "newarticletext": "คุณตามลิงก์ไปยังหน้าที่ยังไม่มีในขณะนี้\nในการสร้างหน้า เริ่มพิมพ์ในกล่องด้านล่าง (ดูข้อมูลเพิ่มเติมใน[$1 หน้าคำอธิบาย])\nถ้าคุณเข้ามาหน้านี้โดยผิดพลาด ให้กดปุ่มถอยหลัง (back) ของเบราว์เซอร์", - "anontalkpagetext": "----\nหน้านี้เป็นหน้าคุยกับผู้ใช้สำหรับผู้ใช้นิรนามซึ่งยังไม่ได้สร้างหรือใช้บัญชี\nดังนั้นเราจึงระบุตัวตนโดยใช้เลขที่อยู่ไอพีแทน\nเลขที่อยู่ไอพีนี้อาจมีผู้ใช้ร่วมกันหลายคน\nถ้าคุณเป็นผู้ใช้นิรนาม และรู้สึกว่าคุณได้รับความเห็นที่ไม่เกี่ยวข้องส่งหาคุณ กรุณา[[Special:CreateAccount|สร้างบัญชี]]หรือ[[Special:UserLogin|ล็อกอิน]] เพื่อป้องกันการสับสนกับผู้ใช้นิรนามรายอื่นในอนาคต", + "anontalkpagetext": "----\nหน้านี้เป็นหน้าคุยกับผู้ใช้สำหรับผู้ใช้นิรนามซึ่งยังไม่ได้สร้างหรือใช้บัญชี\nดังนั้นเราจึงระบุตัวตนโดยใช้เลขที่อยู่ไอพีแทน\nเลขที่อยู่ไอพีนี้อาจมีผู้ใช้ร่วมกันหลายคน\nถ้าคุณเป็นผู้ใช้นิรนาม และรู้สึกว่าคุณได้รับความเห็นที่ไม่เกี่ยวข้องส่งหาคุณ กรุณา[[Special:CreateAccount|สร้างบัญชี]]หรือ[[Special:UserLogin|เข้าสู่ระบบ]] เพื่อป้องกันการสับสนกับผู้ใช้นิรนามรายอื่นในอนาคต", "noarticletext": "ปัจจุบันไม่มีข้อความในหน้านี้\nคุณสามารถ[[Special:Search/{{PAGENAME}}|ค้นหาชื่อเรื่องหน้านี้]]ในหน้าอื่น [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ค้นหาปูมที่เกี่ยวข้อง] หรือ[{{fullurl:{{FULLPAGENAME}}|action=edit}} แก้ไขหน้านี้]", "noarticletext-nopermission": "ปัจจุบันไม่มีข้อความในหน้านี้\nคุณสามารถ[[Special:Search/{{PAGENAME}}|ค้นหาชื่อหน้านี้]]ในหน้าอื่น หรือ[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ค้นหาปูมที่เกี่ยวข้อง] แต่คุณไม่มีสิทธิสร้างหน้านี้", "missing-revision": "ไม่มีรุ่นแก้ไข #$1 ของหน้าชื่อ \"{{FULLPAGENAME}}\" \n\nปกติเกิดจากการตามการโยงประวัติเก่าไปยังหน้าที่ถูกลบแล้ว\nดูรายละเอียดได้ที่[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]", @@ -688,8 +691,8 @@ "previewnote": "พึงระลึกว่านี่เป็นเพียงการแสดงตัวอย่าง\nยังไม่ได้บันทึกการเปลี่ยนแปลงของคุณ!", "continue-editing": "ไปพื้นที่แก้ไข", "previewconflict": "ตัวอย่างนี้สะท้อนข้อความในพื้นที่แก้ไขข้อความส่วนบนซึ่งจะปรากฏหากคุณเลือกบันทึก", - "session_fail_preview": "ขออภัย! เราไม่สามารถดำเนินการแก้ไขของคุณได้ เนื่องจากข้อมูลช่วงเวลาสื่อสารสูญหาย\n\nคุณอาจล็อกเอาต์ไปแล้ว โปรดตรวจดูให้แน่ใจว่าคุณล็อกอินอยู่ แล้วลองอีกครั้ง \nหากยังเสียอยู่ ลอง[[Special:UserLogout|ล็อกเอาต์]]และล็อกอินกลับมา แล้วตรวจดูว่าเบราว์เซอร์ที่คุณใช้อนุญาตคุกกี้จากไซต์นี้", - "session_fail_preview_html": "ขออภัย! ไม่สามารถดำเนินการแก้ไขของคุณต่อได้ เนื่องจากข้อมูลช่วงเวลาสื่อสารสูญหาย\n\nเนื่องจาก {{SITENAME}} เปิดใช้งานเอชทีเอ็มแอลล้วน การแสดงตัวอย่างจะถูกซ่อนไว้เพื่อป้องกันการโจมตีด้วยจาวาสคริปต์\n\nหากนี่เป็นความพยายามแก้ไขโดยชอบ โปรดลองอีกครั้งหนึ่ง \nหากยังเสียอยู่ ลอง[[Special:UserLogout|ล็อกเอาต์]]และล็อกอินกลับมา และตรวจดูให้แน่ใจว่าเบราว์เซอร์ที่คุณใช้อนุญาตคุกกี้จากไซต์นี้", + "session_fail_preview": "ขออภัย! เราไม่สามารถดำเนินการแก้ไขของคุณได้ เนื่องจากข้อมูลเซสชันสูญหาย\n\nคุณอาจออกจากระบบไปแล้ว โปรดตรวจดูให้แน่ใจว่าคุณเข้าสู่ระบบอยู่ แล้วลองอีกครั้ง \nหากยังเสียอยู่ ลอง[[Special:UserLogout|ออกจากระบบ]]และกลับเข้าสู่ระบบใหม่ แล้วตรวจดูว่าเบราว์เซอร์ที่คุณใช้อนุญาตคุกกี้จากไซต์นี้", + "session_fail_preview_html": "ขออภัย! ไม่สามารถดำเนินการแก้ไขของคุณต่อได้ เนื่องจากข้อมูลเซสชันสูญหาย\n\nเนื่องจาก {{SITENAME}} เปิดใช้งานเอชทีเอ็มแอลล้วน การแสดงตัวอย่างจะถูกซ่อนไว้เพื่อป้องกันการโจมตีด้วยจาวาสคริปต์\n\nหากนี่เป็นความพยายามแก้ไขโดยชอบ โปรดลองอีกครั้งหนึ่ง \nหากยังเสียอยู่ ลอง[[Special:UserLogout|ล็อกเอาต์]]และล็อกอินกลับมา และตรวจดูให้แน่ใจว่าเบราว์เซอร์ที่คุณใช้อนุญาตคุกกี้จากไซต์นี้", "token_suffix_mismatch": "การแก้ไขของคุณถูกปฏิเสธ เนื่องจากเครื่องลูกข่ายของคุณทำให้อักขระเครื่องหมายวรรคตอนในโทเค็นการแก้ไขเสีย\nการแก้ไขนี้ถูกปฏิเสธเพื่อป้องกันการวิบัติของข้อความหน้า\nบางครั้งเกิดปัญหานี้ขึ้นเมื่อคุณใช้บริการเว็บพร็อกซีนิรนามที่มีจุดบกพร่อง", "edit_form_incomplete": "แบบแก้ไขบางส่วนไปไม่ถึงเซิร์ฟเวอร์ ตรวจสอบอีกครั้งว่าการแก้ไขของคุณยังอยู่และลองอีกครั้ง", "editing": "กำลังแก้ไข $1", @@ -719,7 +722,7 @@ "template-semiprotected": "(ถูกกึ่งป้องกัน)", "hiddencategories": "หน้านี้มี {{PLURAL:$1|1 หมวดหมู่ซ่อน|$1 หมวดหมู่ซ่อน}}:", "edittools": "", - "nocreatetext": "{{SITENAME}} จำกัดการสร้างหน้าใหม่\nคุณสามารถย้อนกลับไปแก้ไขหน้าที่มีอยู่เดิม หรือ[[Special:UserLogin|ล็อกอินหรือสร้างบัญชีผู้ใช้]]", + "nocreatetext": "{{SITENAME}} ได้จำกัดการสร้างหน้าใหม่\nคุณสามารถย้อนกลับไปแก้ไขหน้าที่มีอยู่เดิม หรือ[[Special:UserLogin|เข้าสู่ระบบหรือสร้างบัญชีผู้ใช้]]", "nocreate-loggedin": "คุณไม่มีสิทธิสร้างหน้าใหม่", "sectioneditnotsupported-title": "ไม่สนับสนุนการแก้ไขหัวข้อย่อย", "sectioneditnotsupported-text": "ไม่สนับสนุนการแก้ไขหัวข้อย่อยในหน้านี้", @@ -740,11 +743,11 @@ "postedit-confirmation-saved": "บันทึกการแก้ไขของคุณแล้ว", "postedit-confirmation-published": "เผยแพร่การแก้ไขของคุณแล้ว", "edit-already-exists": "ไม่สามารถสร้างหน้าใหม่ได้\nเพราะมีแล้ว", - "defaultmessagetext": "ข้อความสารปริยาย", + "defaultmessagetext": "เนื้อหาข้อความปริยาย", "content-failed-to-parse": "แจงส่วนเนื้อหา $2 ของตัวแบบ $1 ล้มเหลว: $3", "invalid-content-data": "ข้อมูลเนื้อหาไม่ถูกต้อง", "content-not-allowed-here": "ไม่อนุญาตเนื้อหา \"$1\" ในหน้า [[$2]]", - "editwarning-warning": "การออกจากหน้านี้อาจทำให้ความเปลี่ยนแปลงที่คุณดำเนินการสูญหาย\nถ้าคุณล็อกอินแล้ว คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน \"{{int:prefs-editing}}\" ในการตั้งค่าของคุณ", + "editwarning-warning": "การออกจากหน้านี้อาจทำให้การเปลี่ยนแปลงทั้งหมดที่คุณได้ทำสูญหาย\nถ้าคุณเข้าสู่ระบบแล้ว คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน \"{{int:prefs-editing}}\" ในการตั้งค่าของคุณ", "editpage-invalidcontentmodel-title": "ไม่รองรับรูปแบบเนื้อหานี้", "editpage-invalidcontentmodel-text": "ไม่รองรับโมเดลเนื้อหา \"$1\"", "editpage-notsupportedcontentformat-title": "รูปแบบเนื้อหาไม่ได้รับการรองรับ", @@ -756,8 +759,10 @@ "content-json-empty-object": "วัตถุเปล่า", "content-json-empty-array": "แถวเปล่า", "deprecated-self-close-category": "หน้าที่ใช้ป้าย HTML ที่ปิดเองที่ไม่ถูกต้อง", + "deprecated-self-close-category-desc": "หน้านี้มีป้ายระบุ HTML ที่ปิดเองที่ไม่ถูกต้อง เช่น <b/> หรือ <span/> ลักษณะการทำงานของป้ายระบุเหล่านี้จะเปลี่ยนในไม่ช้าเพื่อให้สอดคล้องกับคุณสมบัติของ HTML5 ดังนั้นป้ายระบุเหล่านี้ในข้อความวิกิจะถูกเลิกใช้", "duplicate-args-warning": "คำเตือน: [[:$1]] กำลังเรียกใช้ [[:$2]] ด้วยค่ามากกว่าหนึ่งค่าสำหรับตัวแปร \"$3\" เฉพาะค่าสุดท้ายที่ระบุเท่านั้นจะถูกนำมาใช้", "duplicate-args-category": "หน้าที่ใช้อาร์กิวเมนต์ซ้ำในการเรียกแม่แบบ", + "duplicate-args-category-desc": "หน้านี้มีการเรียกแม่แบบที่ใช้อาร์กิวเมนต์ซ้ำ เช่น {{foo|bar=1|bar=2}} หรือ {{foo|bar|1=baz}}", "expensive-parserfunction-warning": "คำเตือน: หน้านี้มีการเรียกใช้ฟังก์ชันแจงส่วนมากเกินไป\n\nหน้านี้ควรมีการเรียกใช้น้อยกว่า $2 ครั้ง แต่ปัจจุบันมีการเรียกใช้ $1 ครั้ง", "expensive-parserfunction-category": "หน้าที่มีการเรียกใช้ฟังก์ชันแจงส่วนมากเกินไป", "post-expand-template-inclusion-warning": "คำเตือน: แม่แบบที่นำมารวมมีขนาดใหญ่เกินไป\nจะไม่รวมบางแม่แบบเข้ามา", @@ -771,11 +776,16 @@ "parser-template-recursion-depth-warning": "เกินขีดจำกัดความลึกการเรียกแม่แบบซ้ำ ($1)", "language-converter-depth-warning": "เกินขีดจำกัดความลึกตัวแปลงผันภาษา ($1)", "node-count-exceeded-category": "หน้าที่จำนวนปมเกิน", + "node-count-exceeded-category-desc": "หน้านี้มีปมเกินจำนวนสูงสุด", "node-count-exceeded-warning": "หน้าเกินจำนวนปม", "expansion-depth-exceeded-category": "หน้าที่ความลึกการขยายเกิน", + "expansion-depth-exceeded-category-desc": "หน้านี้มีความลึกการขยายเกินขีดสูงสุด", "expansion-depth-exceeded-warning": "หน้าเกินความลึกการขยาย", "parser-unstrip-loop-warning": "พบวงวน unstrip", - "unstrip-depth-warning": "ขีดจำกัดการเรียกซ้ำ unstrip เกิน ($1)", + "unstrip-depth-warning": "ขีดจำกัดความลึก unstrip เกิน ($1)", + "unstrip-depth-category": "หน้าที่ขีดจำกัดความลึก unstrip เกิน", + "unstrip-size-warning": "ขีดจำกัดขนาด unstrip เกิน ($1)", + "unstrip-size-category": "หน้าที่ขีดจำกัดขนาด unstrip เกิน", "converter-manual-rule-error": "พบข้อผิดพลาดในกฎการแปลงผันภาษาด้วยมือ", "undo-success": "สามารถย้อนการแก้ไขนี้กลับได้ \nกรุณาตรวจสอบข้อแตกต่างด้านล่างเพื่อทวนสอบว่านี่เป็นสิ่งที่คุณต้องการทำ แล้วบันทึกการเปลี่ยนแปลงด้านล่างเพื่อเสร็จสิ้นการย้อนการแก้ไขกลับ", "undo-failure": "การแก้ไขนี้ไม่สามารถย้อนกลับได้ เนื่องจากขัดแย้งกับการแก้ไขระหว่างกลาง", @@ -872,7 +882,7 @@ "revdelete-no-change": "คำเตือน: รายการวันที่ $2 เวลา $1 ตั้งค่าทัศนวิสัยตามที่ขออยู่แล้ว", "revdelete-concurrent-change": "มีข้อผิดพลาดในการดัดแปรรายการลงวันที่ $2 เวลา $1: ดูเหมือนว่ามีผู้เปลี่ยนสถานะของรายการขณะคุณพยายามดัดแปร\nโปรดตรวจสอบปูม", "revdelete-only-restricted": "มีข้อผิดพลาดในการซ่อนรายการวันที่ $2 เวลา $1: คุณไม่สามารถยับยั้งมิให้ผู้ดูแลระบบดูรุ่นนี้ได้โดยไม่เลือกตัวเลือกทัศนวิสัยอื่นด้วย", - "revdelete-reason-dropdown": "*เหตุผลการลบทั่วไป\n** ละเมิดลิขสิทธิ์\n** ความเห็นไม่เหมาะสมหรือสารสนเทศส่วนบุคคล\n** ชื่อผู้ใช้ไม่เหมาะสม\n** สารสนเทศที่อาจหมิ่นประมาท", + "revdelete-reason-dropdown": "*เหตุผลการลบทั่วไป\n** ละเมิดลิขสิทธิ์\n** ความเห็นไม่เหมาะสมหรือข้อมูลส่วนบุคคล\n** ชื่อผู้ใช้ไม่เหมาะสม\n** ข้อมูลที่อาจหมิ่นประมาท", "revdelete-otherreason": "เหตุผลอื่น/เพิ่มเติม:", "revdelete-reasonotherlist": "เหตุผลอื่น", "revdelete-edit-reasonlist": "แก้ไขเหตุผลการลบ", @@ -982,7 +992,7 @@ "preferences": "ตั้งค่าผู้ใช้", "mypreferences": "ตั้งค่าผู้ใช้", "prefs-edits": "จำนวนการแก้ไข:", - "prefsnologintext2": "โปรดล็อกอินเพื่อเปลี่ยนการตั้งค่าของคุณ", + "prefsnologintext2": "โปรดเข้าสู่ระบบเพื่อเปลี่ยนแปลงการตั้งค่าของคุณ", "prefs-skin": "หน้าตา", "skin-preview": "ตัวอย่าง", "datedefault": "ไม่ตั้งค่า", @@ -1001,6 +1011,7 @@ "prefs-watchlist-edits": "จำนวนการเปลี่ยนแปลงมากสุดที่แสดงในรายการเฝ้าดู:", "prefs-watchlist-edits-max": "จำนวนสูงสุด: 1000", "prefs-watchlist-token": "โทเค็นรายการเฝ้าดู:", + "prefs-watchlist-managetokens": "จัดการโทเค็น", "prefs-misc": "เบ็ดเตล็ด", "prefs-resetpass": "เปลี่ยนรหัสผ่าน", "prefs-changeemail": "เปลี่ยนหรือลบที่อยู่อีเมล", @@ -1014,7 +1025,7 @@ "stub-threshold": "ความยาวของหน้าที่ใช้เป็นเส้นแบ่งในการระบุหน้าโครง เพื่อจะให้มีการจัดรูปแบบเฉพาะตัว สำหรับลิงก์ที่โยงมายังโครง ($1):", "stub-threshold-sample-link": "ตัวอย่าง", "stub-threshold-disabled": "ปิดใช้งาน", - "recentchangesdays": "จำนวนวันที่แสดงในปรับปรุงล่าสุด:", + "recentchangesdays": "จำนวนวันที่แสดงในเปลี่ยนแปลงล่าสุด:", "recentchangesdays-max": "มากสุด $1 วัน", "recentchangescount": "จำนวนการแก้ไขที่แสดงในเปลี่ยนแปลงล่าสุด ประวัติหน้า และในปูม โดยปริยาย:", "prefs-help-recentchangescount": "จำนวนสูงสุด: 1000", @@ -1045,8 +1056,9 @@ "default": "ค่าปริยาย", "prefs-files": "ไฟล์", "prefs-custom-css": "สไตล์ชีตปรับแต่งเอง", + "prefs-custom-json": "JSON กำหนดเอง", "prefs-custom-js": "จาวาสคริปต์ปรับแต่งเอง", - "prefs-common-config": "CSS / จาวาสคริปต์รวมสำหรับทุกหน้าตา:", + "prefs-common-config": "CSS/JSON/จาวาสคริปต์รวมสำหรับทุกหน้าตา:", "prefs-reset-intro": "คุณสามารถใช้หน้านี้ตั้งการตั้งค่าของคุณเป็นค่าปริยายของเว็บใหม่\nไม่สามารถทำกลับได้", "prefs-emailconfirm-label": "การยืนยันอีเมล:", "youremail": "อีเมล:", @@ -1066,13 +1078,13 @@ "gender-unknown": "เมื่อกล่าวถึงคุณ ซอฟต์แวร์จะใช้คำที่ไม่ระบุเพศทุกเมื่อที่เป็นไปได้", "gender-male": "ชาย", "gender-female": "หญิง", - "prefs-help-gender": "เลือกตั้งค่านี้หรือไม่ก็ได้\nซอฟต์แวร์ใช้ค่านี้เพื่อติดต่อคุณและกล่าวถึงคุณโดยใช้เพศทางไวยากรณ์ที่เหมาะสมเมื่อติดต่อผู้อื่น\nสารสนเทศนี้เปิดเผยต่อสาธารณะ", + "prefs-help-gender": "เลือกตั้งค่านี้หรือไม่ก็ได้\nซอฟต์แวร์ใช้ค่านี้เพื่อติดต่อคุณและกล่าวถึงคุณโดยใช้เพศทางไวยากรณ์ที่เหมาะสมเมื่อติดต่อผู้อื่น\nข้อมูลนี้เปิดเผยต่อสาธารณะ", "email": "อีเมล", "prefs-help-realname": "ไม่ต้องใช้ชื่อจริง \nหากใช้ จะใช้เพื่อบ่งชี้งานของคุณว่ามาจากคุณ", "prefs-help-email": "ไม่จำเป็นต้องใส่ที่อยู่อีเมล แต่จำเป็นสำหรับการตั้งรหัสผ่านใหม่หากคุณลืมรหัสผ่าน", "prefs-help-email-others": "คุณยังสามารถเลือกให้ผู้อื่นติดต่อคุณโดยอีเมลผ่านลิงก์บนหน้าผู้ใช้หรือหน้าพูดคุยกับผู้ใช้ของคุณ\nไม่เปิดเผยที่อยู่อีเมลของคุณเมื่อผู้ใช้อื่นติดต่อคุณ", "prefs-help-email-required": "ต้องการที่อยู่อีเมล", - "prefs-info": "สารสนเทศเบื้องต้น", + "prefs-info": "ข้อมูลเบื้องต้น", "prefs-i18n": "สากลวิวัตน์", "prefs-signature": "ลายเซ็น", "prefs-dateformat": "รูปแบบวันที่", @@ -1148,7 +1160,7 @@ "right-createpage": "สร้างหน้า (ที่ไม่ใช่หน้าอภิปราย)", "right-createtalk": "สร้างหน้าอภิปราย", "right-createaccount": "สร้างบัญชีผู้ใช้ใหม่", - "right-autocreateaccount": "ล็อกอินโดยใช้บัญชีผู้ใช้ภายนอกอัตโนมัติ", + "right-autocreateaccount": "เข้าสู่ระบบด้วยบัญชีผู้ใช้ภายนอกอัตโนมัติ", "right-minoredit": "ทำเครื่องหมายการแก้ไขเป็นการแก้ไขเล็กน้อย", "right-move": "ย้ายหน้า", "right-move-subpages": "ย้ายหน้าพร้อมหน้าย่อย", @@ -1164,7 +1176,7 @@ "right-purge": "ล้างแคชของเว็บไซต์โดยไม่ยืนยัน", "right-autoconfirmed": "ไม่ได้รับผลจากขีดจำกัดอัตรายึดเลขที่อยู่ไอพี", "right-bot": "กำหนดเป็นกระบวนการอัตโนมัติ", - "right-nominornewtalk": "หากไม่มีการแก้ไขเล็กน้อยในหน้าอภิปรายจะทำให้การแจ้งสารใหม่ปรากฏ", + "right-nominornewtalk": "หากไม่มีการแก้ไขเล็กน้อยในหน้าอภิปรายจะทำให้การแจ้งข้อความใหม่ปรากฏ", "right-apihighlimits": "ใช้ข้อจำกัดที่สูงขึ้นในคำสั่งเอพีไอ", "right-writeapi": "ใช้การเขียนเอพีไอ", "right-delete": "ลบหน้า", @@ -1244,7 +1256,7 @@ "grant-highvolume": "การแก้ไขในปริมาณสูง", "grant-oversight": "ซ่อนผู้ใช้ และ ยับยั้งรุ่นปรับปรุง", "grant-patrol": "ลาดตระเวนตรวจการเปลี่ยนแปลงหน้าต่าง ๆ", - "grant-privateinfo": "เข้าถึงข้อมูลส่วนบุคคล", + "grant-privateinfo": "เข้าถึงข้อมูลส่วนตัว", "grant-protect": "ล็อกและปลดล็อกหน้าต่าง ๆ", "grant-rollback": "ย้อนการเปลี่ยนแปลงในหน้ารวดเดียว", "grant-sendemail": "ส่งอีเมลหาผู้ใช้อื่น", @@ -1301,7 +1313,7 @@ "action-editmyoptions": "แก้ไขการตั้งค่าของคุณ", "action-editmywatchlist": "แก้ไขรายการเฝ้าดูของคุณ", "action-viewmywatchlist": "ดูรายการเฝ้าดูของคุณ", - "action-viewmyprivateinfo": "ดูสารสนเทศส่วนตัวของคุณ", + "action-viewmyprivateinfo": "ดูข้อมูลส่วนตัวของคุณ", "action-editmyprivateinfo": "แก้ไขสารสนเทศส่วนตัวของคุณ", "action-editcontentmodel": "แก้ไขตัวแบบเนื้อหาของหน้า", "action-managechangetags": "สร้างและ(เ)ปิดใช้งานป้ายระบุ", @@ -1652,7 +1664,7 @@ "img-auth-nopathinfo": "PATH_INFO สูญหาย\nเซิร์ฟเวอร์ของคุณอาจไม่ได้ถูกตั้งให้ส่งสารสนเทศนี้\nอาจเป็นแบบ CGI-based และไม่สามารถสนับสนุน img_auth\nดูที่ https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization", "img-auth-notindir": "ที่อยู่ที่ร้องขอไม่ได้อยู่ในสารบบอัพโหลดที่กำหนดไว้", "img-auth-badtitle": "ไม่สามารถสร้างชื่อเรื่องที่ถูกต้องจาก \"$1\"", - "img-auth-nologinnWL": "คุณไม่ได้ล็อกอินและ \"$1\" ไม่ได้อยู่ในรายชื่อผู้ใช้ที่ได้รับอนุญาต (whitelist)", + "img-auth-nologinnWL": "คุณไม่ได้เข้าสู่ระบบและ \"$1\" ไม่ได้อยู่ในรายชื่อผู้ใช้ที่ได้รับอนุญาต (whitelist)", "img-auth-nofile": "ไม่มีไฟล์ \"$1\"", "img-auth-isdir": "คุณกำลังพยายามเข้าถึงสารบบ \"$1\"\nอนุญาตเฉพาะการเข้าถึงไฟล์", "img-auth-streaming": "กำลังดึงข้อมูล \"$1\"", @@ -1716,7 +1728,7 @@ "linkstoimage-redirect": "$1 (ไฟล์เปลี่ยนทาง) $2", "duplicatesoffile": "$1 ไฟล์ต่อไปนี้ เป็นไฟล์เดียวกับไฟล์นี้ ([[Special:FileDuplicateSearch/$2|รายละเอียดเพิ่มเติม]]):", "sharedupload": "ไฟล์นี้มาจาก $1 และอาจมีใช้ในโครงการอื่น", - "sharedupload-desc-there": "ไฟล์นี้มาจาก $1 และอาจใช้บนโครงการอื่น\nกรุณาดู[หน้าคำอธิบายไฟล์ $2] สำหรับสารสนเทศเพิ่มเติม", + "sharedupload-desc-there": "ไฟล์นี้มาจาก $1 และอาจใช้บนโครงการอื่น\nกรุณาดู[หน้าคำอธิบายไฟล์ $2] สำหรับข้อมูลเพิ่มเติม", "sharedupload-desc-here": "ไฟล์นี้มาจาก $1 และอาจมีใช้ในโครงการอื่น\nคำอธิบายใน[$2 หน้าคำอธิบายไฟล์]แสดงไว้ด้านล่างนี้", "sharedupload-desc-edit": "ไฟล์นี้มาจาก $1 และอาจมีใช้ในโครงการอื่น\nคุณอาจต้องการแก้ไขคำอธิบายใน[$2 หน้าคำอธิบายไฟล์]นั้น", "sharedupload-desc-create": "ไฟล์นี้มาจาก $1 และอาจมีใช้ไฟล์นี้ในโครงการอื่น\nคุณอาจต้องการแก้ไขคำอธิบายใน[$2 หน้าคำอธิบายไฟล์]นั้น", @@ -1920,7 +1932,7 @@ "booksources": "แหล่งหนังสือ", "booksources-search-legend": "ค้นหาแหล่งหนังสือ", "booksources-search": "ค้นหา", - "booksources-text": "ด้านล่างเป็นรายการการเชื่อมโยงไปยังเว็บไซต์อื่นที่ขายหนังสือใหม่และหนังสือใช้แล้ว และอาจมีสารสนเทศเพิ่มเติมเกี่ยวกับหนังสือที่คุณกำลังมองหา:", + "booksources-text": "ด้านล่างเป็นรายการการเชื่อมโยงไปยังเว็บไซต์อื่นที่ขายหนังสือใหม่และหนังสือใช้แล้ว และอาจมีข้อมูลเพิ่มเติมเกี่ยวกับหนังสือที่คุณกำลังมองหา:", "booksources-invalid-isbn": "รหัส ISBN ที่ให้ไว้ไม่ถูกต้อง กรุณาตรวจสอบจากต้นฉบับอีกครั้ง", "specialloguserlabel": "ผู้ดำเนินการ:", "speciallogtitlelabel": "เป้าหมาย (ชื่อเรื่องหรือ {{ns:user}}:ชื่อผู้ใช้ สำหรับผู้ใช้):", @@ -1981,7 +1993,7 @@ "activeusers-noresult": "ไม่พบผู้ใช้", "activeusers-submit": "แสดงผู้ใช้ที่ยังเคลื่อนไหว", "listgrouprights": "สิทธิกลุ่มผู้ใช้", - "listgrouprights-summary": "ด้านล่างเป็นรายการกลุ่มผู้ใช้ที่นิยามบนวิกินี้ และสิทธิการเข้าถึงที่เกี่ยวข้อง\nอาจมี[[{{MediaWiki:Listgrouprights-helppage}}|สารสนเทศเพิ่มเติม]]เกี่ยวกับสิทธิหนึ่ง ๆ", + "listgrouprights-summary": "ด้านล่างเป็นรายการกลุ่มผู้ใช้ที่นิยามบนวิกินี้ และสิทธิการเข้าถึงที่เกี่ยวข้อง\nอาจมี[[{{MediaWiki:Listgrouprights-helppage}}|ข้อมูลเพิ่มเติม]]เกี่ยวกับสิทธิหนึ่ง ๆ", "listgrouprights-key": "คำอธิบาย:\n* สิทธิที่ได้รับแต่งตั้ง\n* สิทธิที่ถูกเพิกถอน", "listgrouprights-group": "กลุ่ม", "listgrouprights-rights": "สิทธิ", @@ -2002,25 +2014,26 @@ "listgrants-grant": "การให้สิทธิ", "listgrants-rights": "สิทธิ", "trackingcategories": "หมวดหมู่ค้นหาและติดตาม", - "trackingcategories-summary": "หน้านี้แสดงรายการหมวดหมู่ค้นหาและติดตามซึ่งซอฟต์แวร์มีเดียวิกิจัดการอัตโนมัติ สามารถเปลี่ยนชื่อเหล่านี้ได้โดยการเปลี่ยนสารระบบที่เกี่ยวข้องในเนมสเปซ {{ns:8}}", + "trackingcategories-summary": "หน้านี้แสดงรายการหมวดหมู่ค้นหาและติดตามซึ่งซอฟต์แวร์มีเดียวิกิจัดการอัตโนมัติ สามารถเปลี่ยนชื่อเหล่านี้ได้โดยการเปลี่ยนข้อความระบบที่เกี่ยวข้องในเนมสเปซ {{ns:8}}", "trackingcategories-msg": "หมวดหมู่ค้นหาและติดตาม", - "trackingcategories-name": "ชื่อสาร", + "trackingcategories-name": "ชื่อข้อความ", "trackingcategories-desc": "เกณฑ์การรวมหมวดหมู่", "restricted-displaytitle-ignored": "หน้าที่มีชื่อเรื่องแสดงที่ถูกละเลย", "restricted-displaytitle-ignored-desc": "หน้ามี {{DISPLAYTITLE}} ที่ถูกละเลย เพราะไม่สมนัยกับชื่อเรื่องแท้จริงของหน้า", "noindex-category-desc": "โรบอตไม่สามารถทำดัชนีหน้านี้เพราะมีเมจิกเวิร์ด __NOINDEX__ อยู่และอยู่ในเนมสเปซซึ่งอนุญาตตัวบ่งชี้นี้", "index-category-desc": "หน้านี้มี __INDEX__ อยู่ (และอยู่ในเนมสเปซซึ่งอนุญาตตัวบ่งชี้นี้) ฉะนั้น โรบอตจึงทำดัชนี้ได้ ซึ่งปกติไม่สามารถทำได้", "post-expand-template-inclusion-category-desc": "การแทนที่แม่แบบทั้งหมดทำให้ขนาดของหน้าใหญ่กว่า $wgMaxArticleSize จึงไม่มีการแทนที่แม่แบบบางตัว", + "post-expand-template-argument-category-desc": "หน้านี้มีขนาดใหญ่กว่า $wgMaxArticleSize หลังจากขยายอาร์กิวเมนต์ของแม่แบบ (สิ่งที่อยู่ภายในวงเล็บปีกกาสามวง เช่น {{{Foo}}})", "broken-file-category-desc": "หน้ามีลิงก์ไฟล์เสีย (ลิงก์เพื่อฝังตัวไฟล์เมื่อไม่มีไฟล์)", "hidden-category-category-desc": "หมวดหมู่นี้มี __HIDDENCAT__ ในเนื้อหาหน้า ซึ่งป้องกันมิให้แสดงในกล่องลิงก์หมวดหมู่ในหน้าโดยปริยาย", "trackingcategories-nodesc": "ไม่มีคำอธิบาย", "trackingcategories-disabled": "ปิดใช้งานหมวดหมู่", "mailnologin": "ไม่มีที่อยู่ส่ง", - "mailnologintext": "คุณต้อง[[Special:UserLogin|ล็อกอิน]]และมีที่อยู่อีเมลที่สมเหตุสมผลใน[[Special:Preferences|การตั้งค่า]]ของคุณเพื่อส่งอีเมลหาผู้ใช้อื่น", + "mailnologintext": "คุณต้อง[[Special:UserLogin|เข้าสู่ระบบ]]และมีที่อยู่อีเมลที่สมเหตุสมผลใน[[Special:Preferences|การตั้งค่า]]ของคุณเพื่อส่งอีเมลหาผู้ใช้อื่น", "emailuser": "ส่งอีเมลหาผู้ใช้นี้", "emailuser-title-target": "ส่งอีเมลหา{{GENDER:$1|ผู้ใช้}}", "emailuser-title-notarget": "อีเมลผู้ใช้", - "emailpagetext": "คุณสามารถใช้แบบด้านล่างส่งอีเมลหา{{GENDER:$1|ผู้ใช้}}นี้\nที่อยู่อีเมลที่คุณกรอกใน[[Special:Preferences|การตั้งค่าส่วนตัวของคุณ]]จะปรากฏเป็นที่อยู่ \"จาก\" ของอีเมล ซึ่งผู้รับสามารถตอบกลับคุณได้โดยตรง", + "emailpagetext": "คุณสามารถใช้แบบด้านล่างส่งข้อความอีเมลหา{{GENDER:$1|ผู้ใช้}}นี้\nที่อยู่อีเมลที่คุณกรอกใน[[Special:Preferences|การตั้งค่าส่วนตัวของคุณ]]จะปรากฏเป็นที่อยู่ \"จาก\" ของอีเมล ซึ่งผู้รับสามารถตอบกลับคุณได้โดยตรง", "defemailsubject": "อีเมล {{SITENAME}} จากผู้ใช้ \"$1\"", "usermaildisabled": "ปิดใช้งานการส่งอีเมลหาผู้ใช้", "usermaildisabledtext": "คุณไม่สามารถส่งอีเมลหาผู้ใช้อื่นบนวิกินี้", @@ -2035,12 +2048,12 @@ "emailfrom": "จาก:", "emailto": "ถึง:", "emailsubject": "เรื่อง:", - "emailmessage": "สาร:", + "emailmessage": "ข้อความ:", "emailsend": "ส่ง", - "emailccme": "ส่งอีเมลสำเนาสารของฉันหาฉัน", + "emailccme": "ส่งอีเมลสำเนาข้อความของฉันหาฉัน", "emailccsubject": "คัดลอกสารของคุณไป $1: $2", "emailsent": "ส่งอีเมลแล้ว", - "emailsenttext": "ส่งสารอีเมลของคุณแล้ว", + "emailsenttext": "ส่งข้อความอีเมลของคุณแล้ว", "emailuserfooter": "$1 ส่งอีเมลนี้ถึง $2 โดยฟังก์ชัน \"{{int:emailuser}}\" ที่ {{SITENAME}} อีเมลของคุณจะถูกส่งไปที่ผู้ส่งคนเดิมโดยตรง โดยจะเปิดเผยที่อยู่อีเมลให้พวกเขาเห็น", "usermessage-summary": "ฝากสารระบบ", "usermessage-editor": "ตัวส่งสารของระบบ", @@ -2048,7 +2061,7 @@ "mywatchlist": "รายการเฝ้าดู", "watchlistfor2": "สำหรับ $1 $2", "nowatchlist": "ไม่มีรายการในรายการเฝ้าดูของคุณ", - "watchlistanontext": "โปรดลงชื่อเข้าเพื่อดูหรือแก้ไขรายการในรายการเฝ้าดูของคุณ", + "watchlistanontext": "โปรดเข้าสู่ระบบเพื่อดูหรือแก้ไขรายการในรายการเฝ้าดูของคุณ", "watchnologin": "ยังไม่ได้เข้าสู่ระบบ", "addwatch": "เพิ่มเข้ารายการเฝ้าดู", "addedwatchtext": "เพิ่มหน้า \"[[:$1]]\" และหน้าอภิปรายเข้า[[Special:Watchlist|รายการเฝ้าดู]]ของคุณแล้ว", @@ -2098,7 +2111,7 @@ "enotif_lastvisited": "ดู $1 สำหรับการเปลี่ยนแปลงทั้งหมดตั้งแต่คุณชมครั้งสุดท้าย", "enotif_lastdiff": "เพื่อดูการเปลี่ยนแปลงนี้ ให้ดู $1", "enotif_anon_editor": "ผู้ใช้นิรนาม $1", - "enotif_body": "เรียน $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nคำอธิบายอย่างย่อของผู้เขียน: $PAGESUMMARY $PAGEMINOREDIT\n\nติดต่อผู้เขียน:\nเมล: $PAGEEDITOR_EMAIL\nวิกิ: $PAGEEDITOR_WIKI\n\nจะไม่มีประกาศอื่นหากมีกิจกรรมเพิ่มเติม เว้นเสียแต่คุณจะเข้าชมหน้านี้ขณะที่กำลังล็อกอินอยู่ คุณยังสามารถตั้งค่าตัวบ่งชี้ประกาศใหม่สำหรับหน้าที่คุณเฝ้าดูทุกหน้าในรายการเฝ้าดูของคุณ\n\nระบบประกาศ {{SITENAME}} ที่เป็นมิตรของคุณ\n\n--\nในการเปลี่ยนการตั้งค่าประกาศอีเมลของคุณ โปรดดู\n{{canonicalurl:{{#special:Preferences}}}}\n\nในการเปลี่ยนการตั้งค่ารายการเฝ้าดูของคุณ โปรดดู\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nในการลบหน้าจากรายการเฝ้าดูของคุณ โปรดดู\n$UNWATCHURL\n\nผลป้อนกลับและความช่วยเหลือเพิ่มเติม:\n$HELPPAGE", + "enotif_body": "เรียน $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nคำอธิบายอย่างย่อของผู้เขียน: $PAGESUMMARY $PAGEMINOREDIT\n\nติดต่อผู้เขียน:\nเมล: $PAGEEDITOR_EMAIL\nวิกิ: $PAGEEDITOR_WIKI\n\nจะไม่มีประกาศอื่นหากมีกิจกรรมเพิ่มเติม เว้นเสียแต่คุณจะเข้าชมหน้านี้ขณะที่กำลังเข้าสู่ระบบอยู่ คุณยังสามารถตั้งค่าตัวบ่งชี้ประกาศใหม่สำหรับหน้าที่คุณเฝ้าดูทุกหน้าในรายการเฝ้าดูของคุณ\n\nระบบประกาศ {{SITENAME}} ที่เป็นมิตรของคุณ\n\n--\nในการเปลี่ยนการตั้งค่าประกาศอีเมลของคุณ โปรดดู\n{{canonicalurl:{{#special:Preferences}}}}\n\nในการเปลี่ยนการตั้งค่ารายการเฝ้าดูของคุณ โปรดดู\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nในการลบหน้าจากรายการเฝ้าดูของคุณ โปรดดู\n$UNWATCHURL\n\nผลป้อนกลับและความช่วยเหลือเพิ่มเติม:\n$HELPPAGE", "enotif_minoredit": "นี่เป็นการแก้ไขเล็กน้อย", "created": "ถูกสร้าง", "changed": "ถูกเปลี่ยนแปลง", @@ -2146,8 +2159,8 @@ "revertpage-nouser": "ย้อนการแก้ไขโดยผู้ใช้ไม่ระบุชื่อไปยังรุ่นล่าสุดโดย {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "ย้อนการแก้ไขโดย $1; \nเปลี่ยนกลับไปรุ่นล่าสุดโดย $2", "rollback-success-notify": "ย้อนการแก้ไขโดย $1;\nเปลี่ยนกลับไปรุ่นล่าสุดโดย $2 [$3 แสดงการเปลี่ยนแปลง]", - "sessionfailure-title": "ช่วงเวลาสื่อสารล้มเหลว", - "sessionfailure": "ดูเหมือนมีปัญหากับช่วงเวลาสื่อสารล็อกอินของคุณ\nการกระทำนี้ถูกยกเลิกเป็นการป้องกันการลักลอบช่วงเวลาสื่อสารไว้ก่อน \nกรุณากรอกแบบอีกครั้ง", + "sessionfailure-title": "เซสชันล้มเหลว", + "sessionfailure": "ดูเหมือนมีปัญหากับเซสชันการเข้าสู่ระบบของคุณ\nการกระทำนี้ถูกยกเลิกเพื่อเป็นการป้องกันการลักลอบเซสชันไว้ก่อน \nกรุณากรอกแบบฟอร์มใหม่อีกครั้ง", "changecontentmodel-title-label": "ชื่อหน้า:", "changecontentmodel-reason-label": "เหตุผล:", "changecontentmodel-submit": "ความเปลี่ยนแปลง", @@ -2436,7 +2449,7 @@ "movepagetalktext": "หากคุณเลือกกล่องนี้ หน้าคุยของหน้านี้จะถูกย้ายไปชื่อเรื่องใหม่โดยอัตโนมัติเว้นแต่ปลายทางมีหน้าคุยไม่ว่างแล้ว\n\nในกรณีเหล่านี้ คุณจะต้องย้ายหรือผสานหน้าเองหากต้องการ", "moveuserpage-warning": "คำเตือน: คุณกำลังย้ายหน้าผู้ใช้ โปรดทราบว่าหน้าผู้ใช้เท่านั้นที่จะถูกเปลี่ยนชื่อ แต่ผู้ใช้จะไม่ถูกเปลี่ยนชื่อ", "movecategorypage-warning": "คำเตือน: คุณกำลังย้ายหน้าหมวดหมู่ โปรดทราบว่า จะย้ายเฉพาะหน้าและทุกหน้าในหมวดหมู่เก่าจะไม่ถูกจัดเข้าหมวดหมู่ใหม่", - "movenologintext": "ถ้าต้องการเปลี่ยนชื่อหน้านี้ ต้องเป็นผู้ใช้ลงทะเบียนและ[[Special:UserLogin|ล็อกอิน]]", + "movenologintext": "หากต้องการย้ายหน้านี้ ต้องเป็นผู้ใช้ลงทะเบียนและ[[Special:UserLogin|เข้าสู่ระบบ]]", "movenotallowed": "คุณไม่มีสิทธิเปลี่ยนชื่อหน้า", "movenotallowedfile": "คุณไม่มีสิทธิย้ายไฟล์", "cant-move-user-page": "คุณไม่มีสิทธิย้ายหน้าผู้ใช้ (แยกจากหน้าย่อย)", @@ -2502,11 +2515,11 @@ "export-download": "ส่งออกมาเป็นไฟล์", "export-templates": "รวมแม่แบบมาด้วย", "export-pagelinks": "จำนวนลำดับของหน้าที่ถูกเชื่อมโยงทั้งหมด:", - "allmessages": "สารของระบบ", + "allmessages": "ข้อความระบบ", "allmessagesname": "ชื่อ", - "allmessagesdefault": "ข้อความสารโดยปริยาย", + "allmessagesdefault": "เนื้อหาข้อความปริยาย", "allmessagescurrent": "ข้อความปัจจุบัน", - "allmessagestext": "นี่คือรายการข้อความของระบบที่อยู่ในเนมสเปซมีเดียวิกิ\nกรุณาอ่านหน้า[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation เทศวิวัตน์ของมีเดียวิกิ] และ [https://translatewiki.net translatewiki.net] ถ้าคุณอยากที่จะช่วยแปลข้อความของระบบมีเดียวิกิ", + "allmessagestext": "นี่คือรายการข้อความของระบบที่อยู่ในเนมสเปซมีเดียวิกิ\nกรุณาอ่านหน้า[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation เทศวิวัตน์ของมีเดียวิกิ] และ [https://translatewiki.net translatewiki.net] หากคุณอยากที่จะช่วยแปลข้อความของระบบมีเดียวิกิ", "allmessagesnotsupportedDB": "หน้านี้ไม่สามารถใช้งานได้เนื่องจาก '''$wgUseDatabaseMessages''' ถูกระงับการใช้งาน", "allmessages-filter-legend": "กรอง", "allmessages-filter": "กรองตามสถานะที่เลือก:", @@ -2520,7 +2533,7 @@ "thumbnail-more": "ขยาย", "filemissing": "ไฟล์สูญหาย", "thumbnail_error": "มีข้อผิดพลาดในการสร้างรูปย่อ: $1", - "thumbnail_error_remote": "สารข้อผิดพลาดจาก $1:\n$2", + "thumbnail_error_remote": "ข้อความข้อผิดพลาดจาก $1:\n$2", "djvu_page_error": "หน้าเดจาวู (DjVu) เกินขนาด", "djvu_no_xml": "ไม่สามารถส่งเอกซ์เอ็มแอล (XML) สำหรับไฟล์เดจาวู (DjVu)", "thumbnail-dest-create": "ไม่สามารถบันทึกรูปย่อลงในปลายทางได้", @@ -2559,7 +2572,7 @@ "import-nonewrevisions": "ทุกรุ่นมาจากการนำเข้าข้อมูลก่อนหน้านี้", "xml-error-string": "$1 ที่บรรทัด $2 คอลัมน์ $3 (ไบต์ที่ $4): $5", "import-upload": "อัปโหลดข้อมูล XML", - "import-token-mismatch": "ข้อมูลเซชชันสูญหาย\n\nคุณอาจล็อกเอาต์ '''กรุณายืนยันว่าคุณยังล็อกอินและลองอีกครั้ง'''\nหากยังไม่เป็นผล ให้ลอง[[Special:UserLogout|ล็อกเอาต์]]ก่อนแล้วล็อกอินกลับมา และตรวจสอบว่าเบราว์เซอร์ของคุณอนุญาตคุกกี้จากเว็บไซต์นี้", + "import-token-mismatch": "ข้อมูลเซสชันสูญหาย\n\nคุณอาจออกจากระบบไปแล้ว '''กรุณายืนยันว่าคุณยังเข้าสู่ระบบและลองอีกครั้ง'''\nหากยังไม่เป็นผล ให้ลอง[[Special:UserLogout|ออกจากระบบ]]ก่อนแล้วกลับเข้าสู่ระบบใหม่ และตรวจสอบว่าเบราว์เซอร์ของคุณอนุญาตคุกกี้จากเว็บไซต์นี้", "import-invalid-interwiki": "ไม่สามารถนำข้อมูลเข้าจากวิกิที่กำหนดได้", "import-error-create": "หน้า \"$1\" ยังไม่ได้ถูกนำเข้า เนื่องจากคุณไม่ได้รับอนุญาตให้สามารถสร้างได้", "import-options-wrong": "{{PLURAL:$2|ตัวเลือก|ตัวเลือก}}ผิด:$1", @@ -2580,10 +2593,10 @@ "tooltip-pt-watchlist": "รายการหน้าที่คุณกำลังเฝ้าดูการเปลี่ยนแปลง", "tooltip-pt-mycontris": "รายการการเข้ามีส่วนร่วมของ{{GENDER:|คุณ}}", "tooltip-pt-anoncontribs": "รายการการแก้ไขจากเลขที่อยู่ไอพีนี้", - "tooltip-pt-login": "สนับสนุนให้คุณล็อกอิน แต่ไม่บังคับ", + "tooltip-pt-login": "แนะนำให้คุณเข้าสู่ระบบ แต่ไม่บังคับ", "tooltip-pt-login-private": "คุณต้องล็อกอินจึงจะใช้วิกินี้ได้", "tooltip-pt-logout": "ออกจากระบบ", - "tooltip-pt-createaccount": "สนับสนุนให้คุณสร้างบัญชีและล็อกอิน แต่ไม่บังคับ", + "tooltip-pt-createaccount": "แนะนำให้คุณสร้างบัญชีและเข้าสู่ระบบ แต่ไม่บังคับ", "tooltip-ca-talk": "อภิปรายเกี่ยวกับหน้าเนื้อหา", "tooltip-ca-edit": "แก้ไขหน้านี้", "tooltip-ca-addsection": "เริ่มส่วนใหม่", @@ -2603,17 +2616,17 @@ "tooltip-n-mainpage": "เยี่ยมชมหน้าหลัก", "tooltip-n-mainpage-description": "เยี่ยมชมหน้าหลัก", "tooltip-n-portal": "เกี่ยวกับโครงการ สิ่งที่คุณทำได้ วิธีการค้นหา", - "tooltip-n-currentevents": "ค้นหาเหตุการณ์ปัจจุบัน", - "tooltip-n-recentchanges": "รายการปรับปรุงล่าสุดในวิกินี้", + "tooltip-n-currentevents": "ค้นหาข้อมูลเบื้องหลังในเหตุการณ์ปัจจุบัน", + "tooltip-n-recentchanges": "รายการเปลี่ยนแปลงล่าสุดในวิกินี้", "tooltip-n-randompage": "โหลดหน้าสุ่ม", "tooltip-n-help": "อธิบายการใช้งาน", "tooltip-t-whatlinkshere": "รายการหน้าวิกิทุกหน้าที่ลิงก์มาที่นี่", - "tooltip-t-recentchangeslinked": "รายการปรับปรุงล่าสุดในหน้าที่ลิงก์จากหน้านี้", + "tooltip-t-recentchangeslinked": "รายการเปลี่ยนแปลงล่าสุดในหน้าที่ลิงก์จากหน้านี้", "tooltip-feed-rss": "ฟีดชนิดอาร์เอสเอส (RSS) ของหน้านี้", "tooltip-feed-atom": "ฟีดอะตอม (Atom) ของหน้านี้", "tooltip-t-contributions": "รายการการมีส่วนร่วมของ{{GENDER:$1|ผู้ใช้นี้}}", "tooltip-t-emailuser": "ส่งอีเมลถึง{{GENDER:$1|ผู้ใช้นี้}}", - "tooltip-t-info": "สารสนเทศเพิ่มเติมเกี่ยวกับหน้านี้", + "tooltip-t-info": "ข้อมูลเพิ่มเติมเกี่ยวกับหน้านี้", "tooltip-t-upload": "อัปโหลดไฟล์", "tooltip-t-specialpages": "รายการหน้าพิเศษทั้งหมด", "tooltip-t-print": "รุ่นที่พร้อมพิมพ์ของหน้านี้", @@ -2624,7 +2637,7 @@ "tooltip-ca-nstab-special": "หน้านี้เป็นหน้าพิเศษ ไม่สามารถแก้ไขได้", "tooltip-ca-nstab-project": "ดูหน้าโครงการ", "tooltip-ca-nstab-image": "ดูหน้าภาพไฟล์", - "tooltip-ca-nstab-mediawiki": "ดูสารระบบ", + "tooltip-ca-nstab-mediawiki": "ดูข้อความระบบ", "tooltip-ca-nstab-template": "ดูแม่แบบ", "tooltip-ca-nstab-help": "ดูหน้าคำอธิบาย", "tooltip-ca-nstab-category": "ดูหน้าหมวดหมู่", @@ -2673,8 +2686,8 @@ "spam_blanking": "รุ่นการปรับปรุงทุกรุ่นประกอบไปด้วยลิงก์ไปยังเว็บ $1 (ทำหน้าว่าง)", "spam_deleting": "ทุกรุ่นที่มีลิงก์ไปยัง $1 กำลังลบ", "simpleantispam-label": "การตรวจสอบสแปม\nอย่ากรอกช่องนี้!", - "pageinfo-title": "สารสนเทศสำหรับ \"$1\"", - "pageinfo-not-current": "ขออภัย ไม่สามารถให้สารสนเทศนี้สำหรับรุ่นปรับปรุงเก่าได้", + "pageinfo-title": "ข้อมูลสำหรับ \"$1\"", + "pageinfo-not-current": "ขออภัย ไม่สามารถให้ข้อมูลนี้สำหรับรุ่นปรับปรุงเก่าได้", "pageinfo-header-basic": "สารสนเทศเบื้องต้น", "pageinfo-header-edits": "ประวัติการแก้ไข", "pageinfo-header-restrictions": "การล็อกหน้า", @@ -2708,7 +2721,7 @@ "pageinfo-magic-words": "{{PLURAL:$1|คำสั่งพิเศษ}} ($1)", "pageinfo-hidden-categories": "หมวดหมู่ที่ซ่อนอยู่ ($1)", "pageinfo-templates": "แม่แบบที่ใช้ ($1)", - "pageinfo-toolboxlink": "สารสนเทศหน้า", + "pageinfo-toolboxlink": "ข้อมูลหน้า", "pageinfo-redirectsto": "เปลี่ยนทางไป", "pageinfo-redirectsto-info": "สนเทศ", "pageinfo-contentpage": "นับเป็นหน้าเนื้อหา", @@ -2716,7 +2729,7 @@ "pageinfo-protect-cascading": "การล็อกที่ต่อเรียงจากหน้านี้", "pageinfo-protect-cascading-yes": "ใช่", "pageinfo-protect-cascading-from": "การล็อกต่อเรียงจาก", - "pageinfo-category-info": "สารสนเทศหมวดหมู่", + "pageinfo-category-info": "ข้อมูลหมวดหมู่", "pageinfo-category-total": "จำนวนสมาชิกรวม", "pageinfo-category-pages": "จำนวนหน้า", "pageinfo-category-subcats": "จำนวนหมวดหมู่ย่อย", @@ -2729,7 +2742,7 @@ "markaspatrolledtext-file": "ทำเครื่องหมายรุ่นไฟล์นี้ว่าตรวจสอบแล้ว", "markedaspatrolled": "ตรวจสอบแล้ว", "markedaspatrolledtext": "กำหนดรุ่นที่เลือกของ [[:$1]] ว่าตรวจสอบแล้ว", - "rcpatroldisabled": "การตรวจสอบหน้าปรับปรุงล่าสุดถูกปิดใช้งาน", + "rcpatroldisabled": "การตรวจสอบหน้าเปลี่ยนแปลงล่าสุดถูกปิดใช้งาน", "rcpatroldisabledtext": "ปัจจุบันฟังก์ชันการตรวจสอบหน้าปรับปรุงล่าสุดถูกปิดใช้งาน", "markedaspatrollederror": "ไม่สามารถทำเครื่องหมายว่าตรวจสอบแล้ว", "markedaspatrollederrortext": "คุณจำเป็นต้องระบุรุ่นการแก้ไขที่กำหนดว่าตรวจสอบแล้ว", @@ -2810,7 +2823,7 @@ "yesterday-at": "เมื่อวานเมื่อ $1 น.", "bad_image_list": "รูปแบบแสดงต่อไปนี้:\n\nเฉพาะรายการที่แสดง (ในแถวขึ้นต้นด้วย *) โดยลิงก์แรกของแต่ละแถวเป็นลิงก์ไปยังภาพที่เสีย\nโดยลิงก์ถัดไปเป็นข้อยกเว้น เช่น บทความที่ภาพถูกจัดในบรรทัดเดียวกับส่วนข้อความ", "metadata": "ข้อมูลอภิพันธุ์", - "metadata-help": "ไฟล์นี้มีสารสนเทศเพิ่มเติม อาจเพิ่มจากกล้องถ่ายรูปดิจิทัลหรือสแกนเนอร์ที่ใช้เพื่อสร้างหรือแปลงภาพเป็นดิจิทัล\nหากไฟล์นี้ถูกดัดแปรจากสถานะต้นฉบับ รายละเอียดบางอย่างอาจไม่สะท้อนไฟล์ที่ถูกดัดแปลอย่างสมบูรณ์", + "metadata-help": "ไฟล์นี้มีข้อมูลเพิ่มเติม อาจเพิ่มจากกล้องถ่ายรูปดิจิทัลหรือสแกนเนอร์ที่ใช้เพื่อสร้างหรือแปลงภาพเป็นดิจิทัล\nหากไฟล์นี้ถูกแก้ไขจากสถานะต้นฉบับ รายละเอียดบางอย่างอาจไม่สะท้อนไฟล์ที่ถูกแก้ไขอย่างสมบูรณ์", "metadata-expand": "แสดงรายละเอียดขยาย", "metadata-collapse": "ซ่อนรายละเอียดขยาย", "metadata-fields": "เขตข้อมูลข้อมูลอภิพันธุ์ของภาพดังที่แสดงรายการไว้ในข้อความนี้ จะถูกรวมบนหน้าภาพเมื่อตารางข้อมูลอภิพันธุ์ถูกยุบ \nเขตข้อมูลอื่น ๆ จะถูกซ่อนโดยปริยาย\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", @@ -3067,11 +3080,11 @@ "confirmemail_pending": "รหัสยืนยันได้ส่งไปยังอีเมลของคุณแล้ว \nถ้าคุณเพิ่งสร้างบัญชี คุณอาจต้องรอสักครู่ให้รหัสส่งไปถึงที่อยู่อีเมลคุณ แทนที่จะขอรหัสยืนยันใหม่ทันที", "confirmemail_send": "ส่งรหัสยืนยันทางอีเมล", "confirmemail_sent": "ส่งอีเมลสำหรับการยืนยันแล้ว", - "confirmemail_oncreate": "รหัสยืนยันถูกส่งไปยังที่อยู่อีเมลของคุณ\nรหัสนี้ไม่กำหนดให้ต้องล็อกอิน แต่คุณต้องระบุรหัสก่อนเปิดใช้งานคุณลักษณะที่อาศัยอีเมลทั้งหมดในวิกินี้", + "confirmemail_oncreate": "รหัสยืนยันถูกส่งไปยังที่อยู่อีเมลของคุณ\nรหัสนี้ไม่กำหนดให้ต้องเข้าสู่ระบบ แต่คุณต้องระบุรหัสก่อนเปิดใช้งานคุณลักษณะที่อาศัยอีเมลทั้งหมดในวิกินี้", "confirmemail_sendfailed": "{{SITENAME}}ไม่สามารถส่งอีเมลยืนยันได้\nโปรดตรวจสอบที่อยู่อีเมลว่าอักขระทั้งหมดถูกต้อง\n\nข้อความตีกลับ: $1", "confirmemail_invalid": "รหัสยืนยันไม่ถูกต้อง \nรหัสอาจหมดอายุแล้ว", "confirmemail_needlogin": "คุณต้อง $1 เพื่อยืนยันที่อยู่อีเมลของคุณ", - "confirmemail_success": "อีเมลคุณได้รับการยืนยันแล้ว\nคุณอาจ[[Special:UserLogin|ล็อกอิน]]ตอนนี้และสนุกกับการแก้ไขวิกิ", + "confirmemail_success": "อีเมลคุณได้รับการยืนยันแล้ว\nคุณสามารถ[[Special:UserLogin|เข้าสู่ระบบ]]ตอนนี้และสนุกกับการแก้ไขวิกิได้เลย", "confirmemail_loggedin": "อีเมลคุณได้รับการยืนยันแล้ว", "confirmemail_subject": "การยืนยันที่อยู่อีเมลของ{{SITENAME}}", "confirmemail_body": "ใครบางคน ซึ่งอาจจะเป็นคุณ จากหมายเลขไอพี $1 ได้ลงทะเบียนในชื่อ \"$2\" โดยใช้อีเมลนี้ที่ {{SITENAME}}\n\nเพื่อยืนยันว่าบัญชีผู้ใช้นี้เป็นของคุณอย่างแน่อน และใช้งานฟีเจอร์ส่งอีเมลหาผู้ใช้บน {{SITENAME}} กดลิงก์นี้ในเว็บเบราวเซอร์ของคุณ:\n\n$3\n\nถ้าคุณ*ไม่*ได้ลงทะเบียน กรุณากดลิงก์ด้านล่างเพื่อยกเลิกการยืนยันที่อยู่อีเมล\n\n$5\n\nรหัสยืนยันนี้จะหมดอายุเมื่อ $4", @@ -3199,9 +3212,9 @@ "version-ext-colheader-description": "คำอธิบาย", "version-ext-colheader-credits": "ผู้ประพันธ์", "version-license-title": "ใบอนุญาตสำหรับ $1", - "version-license-not-found": "ไม่พบสารสนเทศใบอนุญาตลงรายละเอียดสำหรับส่วนขยายนี้", + "version-license-not-found": "ไม่พบข้อมูลใบอนุญาตแบบละเอียดสำหรับส่วนขยายนี้", "version-credits-title": "ข้อความให้เกียรติเจ้าของงานสำหรับ $1", - "version-credits-not-found": "ไม่พบสารสนเทศข้อความให้เกียรติเจ้าของงานลงรายละเอียดสำหรับส่วนขยายนี้", + "version-credits-not-found": "ไม่พบข้อมูลข้อความให้เกียรติเจ้าของงานแบบละเอียดสำหรับส่วนขยายนี้", "version-poweredby-credits": "วิกินี้จัดทำโดย '''[https://www.mediawiki.org/ MediaWiki]''', สงวนลิขสิทธิ์ © 2001-$1 โดย $2", "version-poweredby-others": "ผู้อื่น", "version-poweredby-translators": "ผู้แปล translatewiki.net", @@ -3319,8 +3332,11 @@ "tags-delete-not-allowed": "ลบป้ายระบุที่ส่วนขยายนิยามไม่ได้ยกเว้นส่วนขยายนั้นเจาะจงอนุญาต", "tags-delete-not-found": "ไม่มีป้ายระบุ \"$1\"", "tags-delete-too-many-uses": "ป้ายะรุบ \"$1\" มีผลใช้ในกว่า $2 รุ่น ฉะนั้นจึงไม่สามารถลบ", + "tags-activate-reason": "เหตุผล:", "tags-activate-submit": "เปิดใช้งาน", "tags-deactivate-title": "ปิดใช้งานป้ายระบุ", + "tags-deactivate-reason": "เหตุผล:", + "tags-edit-reason": "เหตุผล:", "comparepages": "เปรียบเทียบหน้า", "compare-page1": "หน้า 1", "compare-page2": "หน้า 2", @@ -3428,7 +3444,7 @@ "feedback-bugornote": "หากคุณได้อธิบายปัญหาทางเทคนิคในรายละเอียดแล้ว โปรด[$1 รายงานจุดบกพร่อง]\nมิฉะนั้น คุณสามารถแบบอย่างง่ายด้านล่าง ความเห็นของคุณจะถูกเพิ่มเข้าสู่ \"[$3 $2]\" ร่วมกับชื่อผู้ใช้ของคุณ", "feedback-cancel": "ยกเลิก", "feedback-close": "เสร็จสิ้น", - "feedback-message": "สาร:", + "feedback-message": "ข้อความ:", "feedback-subject": "เรื่อง:", "feedback-submit": "ตกลง", "feedback-thanks": "ขอบคุณ! ผลป้อนกลับของคุณถูกโพสต์ไปยังหน้า \"[$2 $1]\" แล้ว", @@ -3456,6 +3472,7 @@ "limitreport-templateargumentsize": "ขนาดอาร์กิวเมนต์แม่แบบ", "limitreport-templateargumentsize-value": "$1/$2 ไบต์", "limitreport-expansiondepth": "ความลึกการขยายสูงสุด", + "limitreport-unstrip-depth": "ความลึกการเรียกซ้ำ Unstrip", "expandtemplates": "ขยายแม่แบบ", "expand_templates_output": "ผลลัพธ์", "expand_templates_ok": "ตกลง", @@ -3467,6 +3484,7 @@ "pagelang-language": "ภาษา", "pagelang-use-default": "ใช้ภาษาโดยปริยาย", "pagelang-select-lang": "เลือกภาษา", + "pagelang-reason": "เหตุผล", "pagelang-submit": "ส่ง", "right-pagelang": "เปลี่ยนภาษาหน้า", "action-pagelang": "เปลี่ยนภาษาหน้า", @@ -3484,6 +3502,7 @@ "mediastatistics-header-drawing": "ภาพวาดเส้น (ภาพเวกเตอร์)", "mediastatistics-header-audio": "เสียง", "mediastatistics-header-video": "วิดีทัศน์", + "json-error-depth": "ความลึกสแตกสูงสุดเกิน", "headline-anchor-title": "โยงมาส่วนนี้", "special-characters-group-latin": "ละติน", "special-characters-group-latinextended": "ละตินส่วนขยาย", @@ -3562,7 +3581,7 @@ "log-action-filter-suppress-reblock": "การระงับผู้ใช้โดยการบล็อกใหม่", "log-action-filter-upload-upload": "อัปโหลดใหม่", "log-action-filter-upload-overwrite": "อัปโหลดใหม่", - "authmanager-authn-not-in-progress": "ไม่อยู่ระหว่างการพิสูจน์ตัวจริงหรือข้อมูลช่วงเวลาสื่อสารสูญหาย กรุณาเริ่มใหม่ตั้งแต่ต้น", + "authmanager-authn-not-in-progress": "ไม่อยู่ระหว่างการพิสูจน์ตัวจริงหรือข้อมูลเซสชันสูญหาย กรุณาเริ่มใหม่ตั้งแต่ต้น", "authmanager-authn-no-primary": "เอกสารทางการที่ให้ไม่สามารถพิสูจน์ตัวจริงได้", "authmanager-authn-no-local-user": "เอกสารทางการที่ให้ไม่สัมพันธ์กับผู้ใช้ใดในวิกินี้", "authmanager-authn-no-local-user-link": "เอกสารทางการที่ให้ไม่สัมพันธ์กับผู้ใช้ใดในวิกินี้ ล็อกอินอีกทางหนึ่ง หรือสร้างผู้ใช้ใหม่ และคุณจะมีตัวเลือกให้ลิงก์เอกสารทางการก่อนหน้าของคุณไปบัญชีนั้น", @@ -3570,10 +3589,10 @@ "authmanager-change-not-supported": "ไม่สามารถเปลี่ยนเอกสารทางการที่ให้ได้ เพราะไม่มีความต้องการใช้", "authmanager-create-disabled": "ปิดใช้งานการสร้างบัญชี", "authmanager-create-from-login": "กรุณากรอกเขตข้อมูลเพื่อสร้างบัญชี", - "authmanager-create-not-in-progress": "ไม่อยู่ระหว่างการสร้างบัญชีหรือข้อมูลช่วงเวลาสื่อสารสูญหาย กรุณาเริ่มใหม่ตั้งแต่ต้น", + "authmanager-create-not-in-progress": "ไม่อยู่ระหว่างการสร้างบัญชีหรือข้อมูลเซสชันสูญหาย กรุณาเริ่มใหม่ตั้งแต่ต้น", "authmanager-create-no-primary": "เอกสารทางการที่ให้ไม่สามารถใช้สำหรับการสร้างบัญชีได้", "authmanager-link-no-primary": "เอกสารทางการที่ให้ไม่สามารถใช้สำหรับการเชื่อมโยงบัญชี", - "authmanager-link-not-in-progress": "ไม่อยู่ระหว่างการโยงบัญชีหรือข้อมูลช่วงเวลาสื่อสารสูญหาย กรุณาเริ่มใหม่ตั้งแต่ต้น", + "authmanager-link-not-in-progress": "ไม่อยู่ระหว่างการโยงบัญชีหรือข้อมูลเซสชันสูญหาย กรุณาเริ่มใหม่ตั้งแต่ต้น", "authmanager-authplugin-setpass-failed-title": "การเปลี่ยนรหัสผ่านล้มเหลว", "authmanager-authplugin-setpass-failed-message": "ปลั๊กอินการพิสูจน์ตัวจริงปฏิเสธการเปลี่ยนรหัสผ่าน", "authmanager-authplugin-create-fail": "ปลั๊กอินการพิสูจน์ตัวจริงปฏิเสธการสร้างบัญชี", @@ -3582,7 +3601,7 @@ "authmanager-autocreate-noperm": "ไม่อนุญาตการสร้างบัญชีอัตโนมัติ", "authmanager-autocreate-exception": "ปิดใช้งานการสร้างบัญชีอัตโนมัติชั่วคราวเนื่องจากข้อผิดพลาดก่อนหน้านี้", "authmanager-userdoesnotexist": "บัญชีผู้ใช้ \"$1\"ยังไม่ลงทะเบียน", - "authmanager-userlogin-remembermypassword-help": "ควรจดจำรหัสผ่านนานเกินความยาวของช่วงเวลาสื่อสารหรือไม่", + "authmanager-userlogin-remembermypassword-help": "ควรจดจำรหัสผ่านนานเกินความยาวของเซสชันหรือไม่", "authmanager-username-help": "ชื่อผู้ใช้สำหรับการพิสูจน์ตัวจริง", "authmanager-password-help": "รหัสผ่านสำหรับการพิสูจน์ตัวจริง", "authmanager-domain-help": "โดเมนสำหรับการพิสูจน์ตัวจริงภายนอก", diff --git a/languages/i18n/uk.json b/languages/i18n/uk.json index e9ada2669f..8629986d17 100644 --- a/languages/i18n/uk.json +++ b/languages/i18n/uk.json @@ -706,6 +706,8 @@ "subject-preview": "Попередній перегляд теми:", "previewerrortext": "Сталася помилка при спробі попереднього перегляду Ваших змін.", "blockedtitle": "Користувача заблоковано", + "blocked-email-user": "Для вашого імені користувача заблокована можливість надсилання електронної пошти. Але ви ще можете редагувати інші сторінки у цій вікі. Всі подробиці блокування ви можете побачити на сторінці [[Special:MyContributions|внеску облікового запису]].\n\nБлокування виконав адміністратор $1.\n\nВказана наступна причина: $2.\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Ціль блокування: $7\n* Ідентифікатор блокування: #$5", + "blockedtext-partial": "Для вашого імені користувача або IP-адреси заблокована можливість змінення цієї сторінки. Але ви ще можете редагувати інші сторінки у цій вікі. Всі подробиці блокування ви можете побачити на сторінці [[Special:MyContributions|внеску облікового запису]].\n\nБлокування виконав адміністратор $1.\n\nВказана наступна причина: $2.\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Ціль блокування: $7\n* Ідентифікатор блокування: #$5", "blockedtext": "Ваш обліковий запис або IP-адреса заблоковані.\n\nБлокування виконане адміністратором $1.\nПричина блокування: $2.\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Діапазон блокування: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете використати функцію \"{{int:emailuser}}\", якщо ви не зареєстровані або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте ці дані у своїх запитах.", "autoblockedtext": "Ваша IP-адреса автоматично заблокована у зв'язку з тим, що вона раніше використовувалася кимось із користувачів, якого заблокував $1.\nПричина блокування блокування:\n\n:$2\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Блокування виконав: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете скористатися функцією \"{{int:emailuser}}\", так як не маєте дійсної електронної пошти, зареєстрованої в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте ці дані у своїх запитах.", "systemblockedtext": "Ваше ім'я користувача або IP-адресу було автоматично заблоковано MediaWiki.\nВказана причина:\n\n:$2\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Ціль блокування: $7\n\nВаша поточна IP-адреса — $3.\nБудь ласка, додайте всі вказані подробиці до будь-яких запитів, які Ви будете робити.", @@ -2476,7 +2478,7 @@ "sp-contributions-logs": "журнали", "sp-contributions-talk": "обговорення", "sp-contributions-userrights": "управління правами {{GENDER:$1|користувача|користувачки}}", - "sp-contributions-blocked-notice": "Цей користувач наразі заблокований. Останній запис у журналі блокувань такий:", + "sp-contributions-blocked-notice": "Цей користувач наразі заблокований. Нижче наведено останній запис у журналі блокувань:", "sp-contributions-blocked-notice-anon": "Доступ з цієї IP-адреси зараз заблокований.\nДалі наведено останній запис з журналу блокувань:", "sp-contributions-search": "Пошук внеску", "sp-contributions-username": "IP-адреса або ім'я користувача:", @@ -2524,6 +2526,10 @@ "ipb-disableusertalk": "Заборонити користувачеві редагувати свою сторінку обговорення під час блокування", "ipb-change-block": "Переблокувати користувача з цими налаштуваннями", "ipb-confirm": "Підтвердити блокування", + "ipb-sitewide": "У всій вікі", + "ipb-partial": "Частково", + "ipb-type-label": "Тип", + "ipb-pages-label": "Сторінки", "badipaddress": "IP-адреса записана в невірному форматі, або користувача з таким іменем не існує.", "blockipsuccesssub": "Блокування проведено", "blockipsuccesstext": "[[Special:Contributions/$1|«$1»]] заблоковано.
\nДив. [[Special:BlockList|список заблокованих IP-адрес]] для перегляду блокувань.", @@ -2573,6 +2579,8 @@ "createaccountblock": "створення облікових записів заблоковане", "emailblock": "листи заборонені", "blocklist-nousertalk": "не може редагувати свою сторінку обговорення", + "blocklist-editing": "редагування", + "blocklist-editing-sitewide": "редагування (у всій вікі)", "ipblocklist-empty": "Список блокувань порожній.", "ipblocklist-no-results": "Запрохані IP-адреса або ім'я користувача не заблоковані.", "blocklink": "заблокувати", @@ -3899,6 +3907,10 @@ "logentry-block-block": "$1 {{GENDER:$2|заблокував|заблокувала}} {{GENDER:$4|$3}} на термін $5 $6", "logentry-block-unblock": "$1 {{GENDER:$2|розблокував|розблокувала}} {{GENDER:$4|$3}}", "logentry-block-reblock": "$1 {{GENDER:$2|переблокував|переблокувала}} {{GENDER:$4|$3}} на термін $5 $6", + "logentry-partialblock-block": "$1 {{GENDER:$2|заблокував|заблокувала}} {{GENDER:$4|$3}} від редагування {{PLURAL:$8||сторінок}} $7 на термін $5 $6", + "logentry-partialblock-reblock": "$1 {{GENDER:$2|змінив|змінила}} блокувальні налаштування для {{GENDER:$4|$3}}, заперечуючи зміни {{PLURAL:$8||сторінок}} $7 на термін $5 $6", + "logentry-non-editing-block-block": "$1 {{GENDER:$2|заблокував|заблокувала}} {{GENDER:$4|$3}} від нередагуючих дій на термін $5 $6", + "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|змінив|змінила}} блокувальні налаштування для {{GENDER:$4|$3}} від нередагуючих дій на термін $5 $6", "logentry-suppress-block": "$1 {{GENDER:$2|заблокував}} {{GENDER:$4|$3}} строком на $5 $6", "logentry-suppress-reblock": "$1 {{GENDER:$2|змінив}} блокування для {{GENDER:$4|$3}} на період $5 $6", "logentry-import-upload": "$1 імпортува{{GENDER:$2|в|ла}} $3 через завантаження файлів", @@ -4101,6 +4113,7 @@ "mw-widgets-titleinput-description-redirect": "перенаправлення на $1", "mw-widgets-categoryselector-add-category-placeholder": "Додати категорію...", "mw-widgets-usersmultiselect-placeholder": "Додати ще...", + "mw-widgets-titlesmultiselect-placeholder": "Додати ще...", "date-range-from": "Від дати:", "date-range-to": "До дати:", "sessionmanager-tie": "Не можна поєднувати кілька типів автентифікації запиту: $1.", diff --git a/languages/i18n/vi.json b/languages/i18n/vi.json index da63d759bd..f4bb715bfc 100644 --- a/languages/i18n/vi.json +++ b/languages/i18n/vi.json @@ -55,12 +55,12 @@ "tog-usenewrc": "Thu gọn các thay đổi theo trang trong thay đổi gần đây và danh sách theo dõi", "tog-numberheadings": "Tự động đánh số các đề mục", "tog-editondblclick": "Nhấn đúp để sửa đổi trang", - "tog-editsectiononrightclick": "Bấm chuột phải vào đề mục để sửa đổi phần trang", + "tog-editsectiononrightclick": "Bấm chuột phải vào tên đề mục để sửa đổi đề mục đó", "tog-watchcreations": "Tự động theo dõi các trang tôi tạo và các tập tin tôi tải lên", "tog-watchdefault": "Tự động theo dõi các trang và tập tin tôi sửa", "tog-watchmoves": "Tự động theo dõi các trang và tập tin tôi di chuyển", "tog-watchdeletion": "Tự động theo dõi các trang và tập tin tôi xóa", - "tog-watchuploads": "Thêm các tập tin tải lên của tôi vào danh sách theo dõi của tôi", + "tog-watchuploads": "Thêm các tập tin tôi tải lên vào danh sách theo dõi của tôi", "tog-watchrollback": "Tự động theo dõi các trang tôi lùi sửa", "tog-minordefault": "Mặc định đánh dấu tất cả sửa đổi của tôi là sửa đổi nhỏ", "tog-previewontop": "Hiển thị phần xem trước nằm trên hộp sửa đổi", @@ -78,17 +78,17 @@ "tog-watchlisthidebots": "Ẩn các sửa đổi của robot khỏi danh sách theo dõi", "tog-watchlisthideminor": "Ẩn các sửa đổi nhỏ khỏi danh sách theo dõi", "tog-watchlisthideliu": "Ẩn sửa đổi của thành viên đã đăng nhập khỏi danh sách theo dõi", - "tog-watchlistreloadautomatically": "Tự động tải lại danh sách theo dõi khi nào bộ lọc được thay đổi (cần JavaScript)", - "tog-watchlistunwatchlinks": "Thêm nút ngừng theo dõi/theo dõi ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) trực tiếp vào trang theo dõi có thay đổi (cần JavaScript để bật/tắt)", + "tog-watchlistreloadautomatically": "Tự động tải lại danh sách theo dõi mỗi khi thay đổi bộ lọc (cần JavaScript)", + "tog-watchlistunwatchlinks": "Thêm nút ngừng theo dõi/theo dõi ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) vào ngay trang tôi theo dõi khi có thay đổi (cần JavaScript để dùng chức năng này)", "tog-watchlisthideanons": "Ẩn sửa đổi của người dùng vô danh khỏi danh sách theo dõi", "tog-watchlisthidepatrolled": "Ẩn sửa đổi đã tuần tra trong danh sách theo dõi", "tog-watchlisthidecategorization": "Ẩn việc xếp thể loại", "tog-ccmeonemails": "Gửi bản sao cho tôi khi gửi thư điện tử cho người khác", - "tog-diffonly": "Ẩn nội dung trang dưới phần so sánh phiên bản", + "tog-diffonly": "Không hiện nội dung trang ở phía dưới phần so sánh phiên bản", "tog-showhiddencats": "Hiển thị thể loại ẩn", "tog-norollbackdiff": "Bỏ qua bản so sánh sau khi lùi sửa", "tog-useeditwarning": "Cảnh báo khi tôi thoát trang sửa đổi mà chưa lưu trang", - "tog-prefershttps": "Luôn kết nối an toàn khi đã đăng nhập", + "tog-prefershttps": "Luôn sử dụng kết nối an toàn khi đã đăng nhập", "underline-always": "Luôn luôn", "underline-never": "Không bao giờ", "underline-default": "Mặc định của giao diện hoặc trình duyệt", @@ -176,7 +176,7 @@ "listingcontinuesabbrev": "(tiếp theo)", "index-category": "Trang được ghi chỉ mục", "noindex-category": "Trang không hiển thị trong bộ máy tìm kiếm", - "broken-file-category": "Trang nhúng tập tin không tồn tại", + "broken-file-category": "Trang có sử dụng tập tin không tồn tại", "about": "Giới thiệu", "article": "Trang nội dung", "newwindow": "(mở cửa sổ mới)", @@ -185,7 +185,7 @@ "morenotlisted": "Danh sách này có thể không đầy đủ.", "mypage": "Trang cá nhân", "mytalk": "Tin nhắn", - "anontalk": "Thảo luận", + "anontalk": "Tin nhắn", "navigation": "Xem nhanh", "and": " và", "faq": "Câu hỏi thường gặp", @@ -198,7 +198,7 @@ "tagline": "Từ {{SITENAME}}", "help": "Trợ giúp", "search": "Tìm kiếm", - "search-ignored-headings": " #
\n# Công cụ tìm kiếm sẽ bỏ qua các đề mục này.\n# Các thay đổi trên danh sách này sẽ có hiệu lực một khi trang có đề mục được đưa vào chỉ mục.\n# Để bắt trang phải được đưa lại vào chỉ mục, thực hiện một sửa đổi vô hiệu quả.\n# Cú pháp:\n#   * Tất cả mọi thứ từ ký hiệu “#” để cuối dòng là chú thích.\n#   * Mỗi dòng có nội dung là đúng tên đề mục để bỏ qua, phân biệt chữ hoa/thường.\nTham khảo\nChú thích\nLiên kết ngoài\nXem thêm\nĐọc thêm\n #
", + "search-ignored-headings": " #
\n# Công cụ tìm kiếm sẽ bỏ qua các đề mục này.\n# Các thay đổi trong danh sách này sẽ có hiệu lực ngay khi trang chứa đề mục được đưa vào chỉ mục.\n# Để bắt buộc trang phải được đưa trở lại vào chỉ mục, hãy thực hiện một sửa đổi rỗng.\n# Cú pháp:\n#   * Tất cả mọi thứ từ ký hiệu “#” đến cuối dòng là chú thích.\n#   * Mỗi dòng có nội dung là bản sao của tên đề mục cần bỏ qua, phân biệt chữ hoa/thường.\nTham khảo\nChú thích\nLiên kết ngoài\nXem thêm\nĐọc thêm\n #
", "searchbutton": "Tìm kiếm", "go": "Xem", "searcharticle": "Xem", @@ -226,18 +226,18 @@ "specialpage": "Trang đặc biệt", "personaltools": "Công cụ cá nhân", "talk": "Thảo luận", - "views": "Các hiển thị", + "views": "Giao diện", "toolbox": "Công cụ", "tool-link-userrights": "Thay đổi nhóm {{GENDER:$1}}người dùng", "tool-link-userrights-readonly": "Xem {{GENDER:$1}}nhóm người dùng", "tool-link-emailuser": "Gửi thư cho {{GENDER:$1}}người dùng này", "imagepage": "Xem trang tập tin", - "mediawikipage": "Thông điệp giao diện", + "mediawikipage": "Xem thông điệp giao diện", "templatepage": "Xem trang bản mẫu", "viewhelppage": "Xem trang trợ giúp", "categorypage": "Xem trang thể loại", "viewtalkpage": "Xem trang thảo luận", - "otherlanguages": "Trong ngôn ngữ khác", + "otherlanguages": "Ngôn ngữ khác", "redirectedfrom": "(đổi hướng từ $1)", "redirectpagesub": "Trang đổi hướng", "redirectto": "Đổi hướng đến:", @@ -275,12 +275,12 @@ "badaccess-group0": "Bạn không được phép thực hiện thao tác này.", "badaccess-groups": "Chỉ những thành viên trong {{PLURAL:$2|nhóm|các nhóm}} $1 mới được thực hiện thao tác này.", "versionrequired": "Cần phiên bản $1 của MediaWiki", - "versionrequiredtext": "Cần phiên bản $1 của MediaWiki để sử dụng trang này. Xem [[Special:Version|trang phiên bản]].", + "versionrequiredtext": "Cần phiên bản $1 của MediaWiki để sử dụng trang này. \nXem [[Special:Version|phiên bản hiện hành]].", "ok": "OK", "pagetitle": "$1 – {{SITENAME}}", "retrievedfrom": "Lấy từ “$1”", "youhavenewmessages": "Bạn có $1 ($2).", - "youhavenewmessagesfromusers": "Bạn có $1 từ {{PLURAL:$3|người dùng khác|$3 người dùng}} ($2).", + "youhavenewmessagesfromusers": "Bạn có $1 từ {{PLURAL:$3|một người dùng|$3 người dùng}} ($2).", "youhavenewmessagesmanyusers": "Bạn có $1 từ nhiều người dùng ($2).", "newmessageslinkplural": "{{PLURAL:$1}}tin nhắn mới", "newmessagesdifflinkplural": "{{PLURAL:$1|thay đổi|999=các thay đổi}} gần đây", @@ -299,10 +299,10 @@ "confirmable-confirm": "{{GENDER:$1}}Bạn chắc chứ?", "confirmable-yes": "Có", "confirmable-no": "Không", - "thisisdeleted": "Xem hay phục hồi $1 ?", + "thisisdeleted": "Xem hay phục hồi $1?", "viewdeleted": "Xem $1?", "restorelink": "{{PLURAL:$1|một|$1}} sửa đổi đã xóa", - "feedlinks": "Nạp:", + "feedlinks": "Nguồn cấp dữ liệu:", "feed-invalid": "Định dạng nguồn cấp dữ liệu không hợp lệ.", "feed-unavailable": "Nguồn cấp dữ liệu không có sẵn tại đây", "site-rss-feed": "Nguồn cấp RSS của $1", @@ -326,7 +326,7 @@ "nosuchaction": "Không có tác vụ này", "nosuchactiontext": "Wiki không hiểu được tác vụ được yêu cầu trong địa chỉ URL.\nCó thể bạn đã gõ nhầm địa chỉ URL, hoặc nhấn vào một liên kết sai.\nNó cũng có thể là dấu hiệu của một lỗi trong phần mềm mà {{SITENAME}} sử dụng.", "nosuchspecialpage": "Không có trang đặc biệt nào có tên này", - "nospecialpagetext": "Bạn đã đi đến một liên kết trang đặc biệt không tồn tại.\n\nCó danh sách trang đặc biệt tại [[Special:SpecialPages|{{int:specialpages}}]].", + "nospecialpagetext": "Bạn đã đi đến một liên kết trang đặc biệt không tồn tại.\n\nDanh sách trang đặc biệt có thể xem tại [[Special:SpecialPages|{{int:specialpages}}]].", "error": "Lỗi", "databaseerror": "Lỗi cơ sở dữ liệu", "databaseerror-text": "Xuất hiện lỗi truy vấn cơ sở dữ liệu.\nĐiều này có thể xảy ra do một lỗi phần mềm.", @@ -334,7 +334,7 @@ "databaseerror-query": "Truy vấn: $1", "databaseerror-function": "Hàm: $1", "databaseerror-error": "Lỗi: $1", - "transaction-duration-limit-exceeded": "Để tránh việc tăng độ trễ sao chép quá mức, giao dịch này bị hủy bỏ vì thời gian ghi ($1) vượt quá giới hạn là $2 giây.\nNếu bạn muốn thay đổi nhiều mục cùng lúc, hãy thử thực hiện nhiều tác vụ nhỏ hơn thay thế.", + "transaction-duration-limit-exceeded": "Để tránh việc tăng độ trễ sao chép quá mức, giao dịch này bị hủy bỏ vì thời gian ghi ($1) vượt quá giới hạn là $2 giây.\nNếu bạn muốn thay đổi nhiều mục cùng lúc, hãy thay bằng nhiều tác vụ nhỏ hơn.", "laggedslavemode": "Cảnh báo: Trang có thể chưa được cập nhật.", "readonly": "Cơ sở dữ liệu bị khóa", "enterlockreason": "Nêu lý do khóa, cùng với thời hạn khóa", @@ -346,11 +346,11 @@ "nonwrite-api-promise-error": "Đầu đề HTTP “Promise-Non-Write-API-Action” được gửi nhưng yêu cầu là cho mô đun ghi của API.", "internalerror": "Lỗi nội bộ", "internalerror_info": "Lỗi nội bộ: $1", - "internalerror-fatal-exception": "Ngoại lệ chí tử loại “$1”", + "internalerror-fatal-exception": "Lỗi chí tử loại “$1”", "filecopyerror": "Không thể chép tập tin “$1” đến “$2”.", "filerenameerror": "Không thể đổi tên tập tin “$1” thành “$2”.", "filedeleteerror": "Không thể xóa tập tin “$1”.", - "directorycreateerror": "Không thể tạo được danh mục “$1”.", + "directorycreateerror": "Không thể tạo được thư mục “$1”.", "directoryreadonlyerror": "Thư mục “$1” là chỉ-đọc.", "directorynotreadableerror": "Không đọc được thư mục “$1”.", "filenotfound": "Không tìm thấy tập tin “$1”.", @@ -360,7 +360,7 @@ "cannotdelete": "Không thể xóa trang hay tập tin “$1”. Có thể nó đã bị ai đó xóa rồi.", "cannotdelete-title": "Không thể xóa trang “$1”", "delete-hook-aborted": "Một phần bổ trợ phần mềm đã bỏ qua việc xóa này.\nKhông có lý do nào được đưa ra.", - "no-null-revision": "Không thể tạo phiên bản không nội dung mới cho trang “$1”", + "no-null-revision": "Không thể tạo phiên bản trống mới cho trang “$1”", "badtitle": "Tựa trang sai", "badtitletext": "Tựa trang yêu cầu không đúng, rỗng, hoặc là một liên kết ngôn ngữ hoặc liên kết wiki sai. Nó có thể chứa một hoặc nhiều ký tự mà tựa trang không thể sử dụng.", "title-invalid-empty": "Tiêu đề trang được yêu cầu rỗng hoặc chỉ chứa tên của một không gian tên.", @@ -370,9 +370,9 @@ "title-invalid-characters": "Tiêu đề trang đã yêu cầu chứa ký tự không hợp lệ: “$1”.", "title-invalid-relative": "Tiêu đề có đường dẫn tương đối. Tiêu đề trang tương đối (./, ../) là không hợp lệ, bởi chúng thường sẽ không thể đến được khi được xử lý bởi trình duyệt của người dùng.", "title-invalid-magic-tilde": "Tiêu đề trang đã yêu cầu chứa dãy dấu ngã không hợp lệ (~~~).", - "title-invalid-too-long": "Tiêu đề trang đã yêu cầu quá dài. Tiêu đề phải ngắn hơn $1 byte theo mã hóa UTF-8.", - "title-invalid-leading-colon": "Tiêu đề trang đã yêu cầu chứa dấu hai chấm ở đầu là không hợp lệ.", - "perfcached": "Dữ liệu sau được lấy từ bộ nhớ đệm và có thể đã lỗi thời. Tối đa có sẵn {{PLURAL:$1|một kết quả|$1 kết quả}} trong bộ nhớ đệm.", + "title-invalid-too-long": "Tiêu đề trang được yêu cầu quá dài. Tiêu đề phải ngắn hơn $1 byte theo mã hóa UTF-8.", + "title-invalid-leading-colon": "Tiêu đề trang được yêu cầu chứa dấu hai chấm ở đầu là không hợp lệ.", + "perfcached": "Dữ liệu sau được lấy từ vùng nhớ đệm và có thể đã lỗi thời. Tối đa có sẵn {{PLURAL:$1|một kết quả|$1 kết quả}} trong vùng nhớ đệm.", "perfcachedts": "Dữ liệu dưới đây được đưa vào vùng nhớ đệm và được cập nhật lần cuối lúc $1. Tối đa có sẵn {{PLURAL:$4|một kết quả|$4 kết quả}} trong vùng nhớ đệm.", "querypage-no-updates": "Việc cập nhật trang này hiện đã bị tắt. Dữ liệu ở đây có thể bị lỗi thời.", "viewsource": "Xem mã nguồn", @@ -1951,7 +1951,7 @@ "prefixindex": "Tất cả các trang trùng với tiền tố", "prefixindex-namespace": "Tất cả các trang trùng với tiền tố (không gian tên $1)", "prefixindex-submit": "Xem", - "prefixindex-strip": "Ẩn tiền tố trong danh sách", + "prefixindex-strip": "Ẩn tiền tố trong kết quả", "shortpages": "Trang ngắn nhất", "longpages": "Trang dài nhất", "deadendpages": "Trang đường cùng", diff --git a/maintenance/Maintenance.php b/maintenance/Maintenance.php index 6219476282..c786ce827b 100644 --- a/maintenance/Maintenance.php +++ b/maintenance/Maintenance.php @@ -1699,13 +1699,9 @@ abstract class LoggedUpdateMaintenance extends Maintenance { return false; } - if ( $db->insert( 'updatelog', [ 'ul_key' => $key ], __METHOD__, 'IGNORE' ) ) { - return true; - } else { - $this->output( $this->updatelogFailedMessage() . "\n" ); + $db->insert( 'updatelog', [ 'ul_key' => $key ], __METHOD__, 'IGNORE' ); - return false; - } + return true; } /** @@ -1718,16 +1714,6 @@ abstract class LoggedUpdateMaintenance extends Maintenance { return "Update '{$key}' already logged as completed."; } - /** - * Message to show that the update log was unable to log the completion of this update - * @return string - */ - protected function updatelogFailedMessage() { - $key = $this->getUpdateKey(); - - return "Unable to log update '{$key}' as completed."; - } - /** * Do the actual work. All child classes will need to implement this. * Return true to log the update as done or false (usually on failure). diff --git a/maintenance/language/generateCollationData.php b/maintenance/language/generateCollationData.php index a10592055f..210e907264 100644 --- a/maintenance/language/generateCollationData.php +++ b/maintenance/language/generateCollationData.php @@ -247,11 +247,7 @@ class GenerateCollationData extends Maintenance { if ( $weight !== $prevWeight ) { $this->groups[$prevWeight] = $group; $prevWeight = $weight; - if ( isset( $this->groups[$weight] ) ) { - $group = $this->groups[$weight]; - } else { - $group = []; - } + $group = $this->groups[$weight] ?? []; } $group[] = $cp; } diff --git a/maintenance/populateCategory.php b/maintenance/populateCategory.php index f2a00078e8..f07bc5526f 100644 --- a/maintenance/populateCategory.php +++ b/maintenance/populateCategory.php @@ -133,20 +133,14 @@ TEXT usleep( $throttle * 1000 ); } - if ( $dbw->insert( + $dbw->insert( 'updatelog', [ 'ul_key' => 'populate category' ], __METHOD__, 'IGNORE' - ) ) { - $this->output( "Category population complete.\n" ); - - return true; - } else { - $this->output( "Could not insert category population row.\n" ); + ); - return false; - } + return true; } } diff --git a/maintenance/storage/checkStorage.php b/maintenance/storage/checkStorage.php index 0dfb8346a2..a95789d366 100644 --- a/maintenance/storage/checkStorage.php +++ b/maintenance/storage/checkStorage.php @@ -29,11 +29,7 @@ if ( !defined( 'MEDIAWIKI' ) ) { $cs = new CheckStorage; $fix = isset( $options['fix'] ); - if ( isset( $args[0] ) ) { - $xml = $args[0]; - } else { - $xml = false; - } + $xml = $args[0] ?? false; $cs->check( $fix, $xml ); } diff --git a/maintenance/storage/fixT22757.php b/maintenance/storage/fixT22757.php index 6bc2f988b8..61f1177899 100644 --- a/maintenance/storage/fixT22757.php +++ b/maintenance/storage/fixT22757.php @@ -255,11 +255,7 @@ class FixT22757 extends Maintenance { function findTextIdInPage( $pageId, $textId ) { $ids = $this->getRevTextMap( $pageId ); - if ( !isset( $ids[$textId] ) ) { - return null; - } else { - return $ids[$textId]; - } + return $ids[$textId] ?? null; } function getRevTextMap( $pageId ) { diff --git a/maintenance/storage/moveToExternal.php b/maintenance/storage/moveToExternal.php index 639ef5846f..0b95ba5e68 100644 --- a/maintenance/storage/moveToExternal.php +++ b/maintenance/storage/moveToExternal.php @@ -38,11 +38,7 @@ if ( !defined( 'MEDIAWIKI' ) ) { $cluster = $args[0]; $dbw = wfGetDB( DB_MASTER ); - if ( isset( $options['e'] ) ) { - $maxID = $options['e']; - } else { - $maxID = $dbw->selectField( 'text', 'MAX(old_id)', '', $fname ); - } + $maxID = $options['e'] ?? $dbw->selectField( 'text', 'MAX(old_id)', '', $fname ); $minID = $options['s'] ?? 1; moveToExternal( $cluster, $maxID, $minID ); diff --git a/maintenance/updateCollation.php b/maintenance/updateCollation.php index 0670454947..12b33b47bb 100644 --- a/maintenance/updateCollation.php +++ b/maintenance/updateCollation.php @@ -304,11 +304,7 @@ TEXT if ( $raw !== '' ) { $raw .= ', '; } - if ( !isset( $this->sizeHistogram[$i] ) ) { - $val = 0; - } else { - $val = $this->sizeHistogram[$i]; - } + $val = $this->sizeHistogram[$i] ?? 0; for ( $coarseIndex = 0; $coarseIndex < $numBins - 1; $coarseIndex++ ) { if ( $coarseBoundaries[$coarseIndex] > $i ) { $coarseHistogram[$coarseIndex] += $val; @@ -327,11 +323,7 @@ TEXT $scale = 60 / $maxBinVal; $prevBoundary = 0; for ( $coarseIndex = 0; $coarseIndex < $numBins; $coarseIndex++ ) { - if ( !isset( $coarseHistogram[$coarseIndex] ) ) { - $val = 0; - } else { - $val = $coarseHistogram[$coarseIndex]; - } + $val = $coarseHistogram[$coarseIndex] ?? 0; $boundary = $coarseBoundaries[$coarseIndex]; $this->output( sprintf( "%-10s %-10d |%s\n", $prevBoundary . '-' . ( $boundary - 1 ) . ': ', diff --git a/profileinfo.php b/profileinfo.php index c65f952ac2..d000972051 100644 --- a/profileinfo.php +++ b/profileinfo.php @@ -338,11 +338,7 @@ $res = $dbr->select( [ 'ORDER BY' => 'pf_name ASC' ] ); -if ( isset( $_REQUEST['filter'] ) ) { - $filter = $_REQUEST['filter']; -} else { - $filter = ''; -} +$filter = $_REQUEST['filter'] ?? ''; ?>
diff --git a/resources/src/mediawiki.base/mediawiki.base.js b/resources/src/mediawiki.base/mediawiki.base.js index 5820b83eb9..8a44dcc686 100644 --- a/resources/src/mediawiki.base/mediawiki.base.js +++ b/resources/src/mediawiki.base/mediawiki.base.js @@ -641,12 +641,18 @@ mw.log.deprecate( window, '$j', $, 'Use $ or jQuery instead.' ); // Process callbacks for Grade A that require modules. - // Plain ones were already processed by startup.js. queue = window.RLQ; - // Redefine publicly to capture any late arrivals + // Replace temporary RLQ implementation from startup.js with the + // final implementation that also processes callbacks that can + // require modules. It must also support late arrivals of + // plain callbacks. (T208093) window.RLQ = { push: function ( entry ) { - mw.loader.using( entry[ 0 ], entry[ 1 ] ); + if ( typeof entry === 'function' ) { + entry(); + } else { + mw.loader.using( entry[ 0 ], entry[ 1 ] ); + } } }; while ( queue[ 0 ] ) { diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuOptionWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuOptionWidget.less index 07e43c000a..ea508417ad 100644 --- a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuOptionWidget.less +++ b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuOptionWidget.less @@ -5,6 +5,7 @@ .mw-rcfilters-ui-filterMenuOptionWidget { .mw-rcfilters-ui-filterMenuSectionOptionWidget ~ & { padding-left: 12 / @font-size-system-ui / @font-size-vector; + padding-right: 12 / @font-size-system-ui / @font-size-vector; } &.oo-ui-flaggedElement-muted { diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ItemMenuOptionWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ItemMenuOptionWidget.less index bf855be970..61872bddba 100644 --- a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ItemMenuOptionWidget.less +++ b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ItemMenuOptionWidget.less @@ -6,17 +6,19 @@ padding: 0 0.5em; .box-sizing( border-box ); - &:not( :last-child ) { + &:not( :last-child ):not( .mw-rcfilters-ui-itemMenuOptionWidget-identifier-talk ) { border-bottom: 1px solid @colorGray14; } &-view-namespaces { border-top: 4px solid @colorGray12; + } - &:first-child, - &.mw-rcfilters-ui-itemMenuOptionWidget-identifier-subject + &.mw-rcfilters-ui-itemMenuOptionWidget-identifier-talk { - border-top: 0; - } + // Don't show border for first namespace + &-view-default + &-view-namespaces, + // Hide for every 'talk' option + &-view-namespaces&.mw-rcfilters-ui-itemMenuOptionWidget-identifier-subject + &-view-namespaces.mw-rcfilters-ui-itemMenuOptionWidget-identifier-talk { + border-top: 0; } &:hover { diff --git a/resources/src/mediawiki.skinning/images/external-link-icons.svg b/resources/src/mediawiki.skinning/images/external-link-icons.svg deleted file mode 100644 index 6a67993dc9..0000000000 --- a/resources/src/mediawiki.skinning/images/external-link-icons.svg +++ /dev/null @@ -1,697 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.less b/resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.less index 395f80bce2..1035786d31 100644 --- a/resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.less +++ b/resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.less @@ -20,7 +20,9 @@ line-height: 2.5; } -.mw-widget-calendarWidget-header .oo-ui-buttonWidget { +// Overwrite OOUI's `.oo-ui-buttonElement-frameless.oo-ui-iconElement:first-child` +.mw-widget-calendarWidget-header .oo-ui-buttonWidget.oo-ui-iconElement { + margin-left: 0; margin-right: 0; } diff --git a/resources/src/startup/startup.js b/resources/src/startup/startup.js index 5483ad23e8..bebf4dcf4a 100644 --- a/resources/src/startup/startup.js +++ b/resources/src/startup/startup.js @@ -118,9 +118,10 @@ if ( !isCompatible() ) { mw.config.set( $VARS.configuration ); // Process callbacks for Grade A - // Must be after registrations and mw.config.set, which mw.loader depends on. var queue = window.RLQ; - // Redefine push(), but keep type as array for storing callbacks that require modules. + // Replace RLQ placeholder from ResourceLoaderClientHtml with an implementation + // that executes simple callbacks, but continues to store callbacks that require + // modules. window.RLQ = []; /* global RLQ */ RLQ.push = function ( fn ) { @@ -132,7 +133,7 @@ if ( !isCompatible() ) { } }; while ( queue && queue[ 0 ] ) { - // Re-use our push() + // Re-use our new push() method RLQ.push( queue.shift() ); } diff --git a/tests/common/TestsAutoLoader.php b/tests/common/TestsAutoLoader.php index f8431239b7..de8ddbfe8c 100644 --- a/tests/common/TestsAutoLoader.php +++ b/tests/common/TestsAutoLoader.php @@ -230,11 +230,7 @@ spl_autoload_register( function ( $class ) { 'PHPUnit_Framework_Error' => 'PHPUnit\Framework\Error\Error', ]; - if ( isset( $map[$class] ) ) { - $newForm = $map[$class]; - } else { - $newForm = str_replace( '_', '\\', $class ); - } + $newForm = $map[$class] ?? str_replace( '_', '\\', $class ); if ( class_exists( $newForm ) || interface_exists( $newForm ) ) { // If the new class name exists, alias diff --git a/tests/parser/ParserTestParserHook.php b/tests/parser/ParserTestParserHook.php index 5995012b3b..acc5cb1581 100644 --- a/tests/parser/ParserTestParserHook.php +++ b/tests/parser/ParserTestParserHook.php @@ -49,11 +49,7 @@ class ParserTestParserHook { && $argv['action'] === 'flush' && $in === null ) { // Clear the buffer, we probably don't need to - if ( isset( $parser->static_tag_buf ) ) { - $tmp = $parser->static_tag_buf; - } else { - $tmp = ''; - } + $tmp = $parser->static_tag_buf ?? ''; $parser->static_tag_buf = null; return $tmp; } else { // wtf? diff --git a/tests/phpunit/includes/OutputPageTest.php b/tests/phpunit/includes/OutputPageTest.php index 90413c49ce..e572be215d 100644 --- a/tests/phpunit/includes/OutputPageTest.php +++ b/tests/phpunit/includes/OutputPageTest.php @@ -1826,28 +1826,44 @@ class OutputPageTest extends MediaWikiTestCase { public function provideParse() { return [ - 'List at start of line' => [ - [ '* List' ], + 'List at start of line (content)' => [ + [ '* List', true, false ], "
  • List
\n
", + "
  • List
\n", ], - 'List not at start' => [ - [ "* ''Not'' list", false ], + 'List at start of line (interface)' => [ + [ '* List', true, true ], + "
  • List
\n", + ], + 'List not at start (content)' => [ + [ "* ''Not'' list", false, false ], '
* Not list
', + '* Not list', ], - 'Interface' => [ + 'List not at start (interface)' => [ + [ "* ''Not'' list", false, true ], + '* Not list', + ], + 'Interface message' => [ [ "''Italic''", true, true ], "

Italic\n

", 'Italic', ], - 'formatnum' => [ - [ '{{formatnum:123456.789}}' ], + 'formatnum (content)' => [ + [ '{{formatnum:123456.789}}', true, false ], "

123,456.789\n

", + "123,456.789", ], - 'Language' => [ + 'formatnum (interface)' => [ + [ '{{formatnum:123456.789}}', true, true ], + "

123,456.789\n

", + "123,456.789", + ], + 'Language (content)' => [ [ '{{formatnum:123456.789}}', true, false, Language::factory( 'is' ) ], "

123.456,789\n

", ], - 'Language with interface' => [ + 'Language (interface)' => [ [ '{{formatnum:123456.789}}', true, true, Language::factory( 'is' ) ], "

123.456,789\n

", '123.456,789', @@ -1856,6 +1872,79 @@ class OutputPageTest extends MediaWikiTestCase { [ '== Header ==' ], '

' . "Header

\n
", + '

Header

' . + "\n", + ] + ]; + } + + /** + * @dataProvider provideParseAs + * @covers OutputPage::parseAsContent + * @param array $args To pass to parse() + * @param string $expectedHTML Expected return value for parseAsContent() + * @param string $expectedHTML Expected return value for parseInlineAsInterface(), if different + */ + public function testParseAsContent( + array $args, $expectedHTML, $expectedHTMLInline = null + ) { + $op = $this->newInstance(); + $this->assertSame( $expectedHTML, $op->parseAsContent( ...$args ) ); + } + + /** + * @dataProvider provideParseAs + * @covers OutputPage::parseAsInterface + * @param array $args To pass to parse() + * @param string $expectedHTML Expected return value for parseAsInterface() + * @param string $expectedHTML Expected return value for parseInlineAsInterface(), if different + */ + public function testParseAsInterface( + array $args, $expectedHTML, $expectedHTMLInline = null + ) { + $op = $this->newInstance(); + $this->assertSame( $expectedHTML, $op->parseAsInterface( ...$args ) ); + } + + /** + * @dataProvider provideParseAs + * @covers OutputPage::parseInlineAsInterface + */ + public function testParseInlineAsInterface( + array $args, $expectedHTML, $expectedHTMLInline = null + ) { + $op = $this->newInstance(); + $this->assertSame( + $expectedHTMLInline ?? $expectedHTML, + $op->parseInlineAsInterface( ...$args ) + ); + } + + public function provideParseAs() { + return [ + 'List at start of line' => [ + [ '* List', true ], + "
  • List
\n", + ], + 'List not at start' => [ + [ "* ''Not'' list", false ], + '

* Not list

', + '* Not list', + ], + 'Italics' => [ + [ "''Italic''", true ], + "

Italic\n

", + 'Italic', + ], + 'formatnum' => [ + [ '{{formatnum:123456.789}}', true ], + "

123,456.789\n

", + "123,456.789", + ], + 'No section edit links' => [ + [ '== Header ==' ], + '

Header

' . + "\n", ] ]; } @@ -1864,20 +1953,47 @@ class OutputPageTest extends MediaWikiTestCase { * @covers OutputPage::parse */ public function testParseNullTitle() { - $this->setExpectedException( MWException::class, 'Empty $mTitle in OutputPage::parse' ); + $this->setExpectedException( MWException::class, 'Empty $mTitle in OutputPage::parseInternal' ); $op = $this->newInstance( [], null, 'notitle' ); $op->parse( '' ); } /** - * @covers OutputPage::parse + * @covers OutputPage::parseInline */ public function testParseInlineNullTitle() { - $this->setExpectedException( MWException::class, 'Empty $mTitle in OutputPage::parse' ); + $this->setExpectedException( MWException::class, 'Empty $mTitle in OutputPage::parseInternal' ); $op = $this->newInstance( [], null, 'notitle' ); $op->parseInline( '' ); } + /** + * @covers OutputPage::parseAsContent + */ + public function testParseAsContentNullTitle() { + $this->setExpectedException( MWException::class, 'Empty $mTitle in OutputPage::parseInternal' ); + $op = $this->newInstance( [], null, 'notitle' ); + $op->parseAsContent( '' ); + } + + /** + * @covers OutputPage::parseAsInterface + */ + public function testParseAsInterfaceNullTitle() { + $this->setExpectedException( MWException::class, 'Empty $mTitle in OutputPage::parseInternal' ); + $op = $this->newInstance( [], null, 'notitle' ); + $op->parseAsInterface( '' ); + } + + /** + * @covers OutputPage::parseInlineAsInterface + */ + public function testParseInlineAsInterfaceNullTitle() { + $this->setExpectedException( MWException::class, 'Empty $mTitle in OutputPage::parseInternal' ); + $op = $this->newInstance( [], null, 'notitle' ); + $op->parseInlineAsInterface( '' ); + } + /** * @covers OutputPage::setCdnMaxage * @covers OutputPage::lowerCdnMaxage diff --git a/tests/phpunit/includes/api/ApiStashEditTest.php b/tests/phpunit/includes/api/ApiStashEditTest.php index 61512d5c35..5ef3b04e3c 100644 --- a/tests/phpunit/includes/api/ApiStashEditTest.php +++ b/tests/phpunit/includes/api/ApiStashEditTest.php @@ -364,6 +364,7 @@ class ApiStashEditTest extends ApiTestCase { // Now let's also increment our editcount $this->editPage( ucfirst( __FUNCTION__ ), '' ); + $user->clearInstanceCache(); $this->assertFalse( $this->doCheckCache( $user ), "Cache should be invalidated when it's old and the user has an intervening edit" ); } diff --git a/tests/phpunit/includes/user/UserTest.php b/tests/phpunit/includes/user/UserTest.php index 1e1f7392c5..55b3bfc261 100644 --- a/tests/phpunit/includes/user/UserTest.php +++ b/tests/phpunit/includes/user/UserTest.php @@ -263,6 +263,7 @@ class UserTest extends MediaWikiTestCase { // increase the edit count $user->incEditCount(); + $user->clearInstanceCache(); $this->assertEquals( 4, diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.base.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.base.test.js index 33423d8071..b8f0d122cc 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.base.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.base.test.js @@ -126,12 +126,21 @@ QUnit.test( 'RLQ.push', function ( assert ) { /* global RLQ */ var loaded = 0, + called = 0, done = assert.async(); mw.loader.testCallback = function () { loaded++; delete mw.loader.testCallback; }; - mw.loader.implement( 'test.rlq-push', [ QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/mwLoaderTestCallback.js' ) ] ); + mw.loader.implement( 'test.rlq-push', [ + QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/mwLoaderTestCallback.js' ) + ] ); + + // Regression test for T208093 + RLQ.push( function () { + called++; + } ); + assert.strictEqual( called, 1, 'Invoke plain callbacks' ); RLQ.push( [ 'test.rlq-push', function () { assert.strictEqual( loaded, 1, 'Load the required module' );