* The mediawiki.widgets.visibleByteLimit module alias, deprecated in 1.32, was
removed. Use mediawiki.widgets.visibleLengthLimit instead.
* The jquery.farbtastic module, unused since 1.18, was removed.
+* The 'jquery.expandableField' module, unused since 1.22, was removed.
* (T181318) The $wgStyleVersion setting and its appendage to various script and
style URLs in OutputPage, deprecated in 1.31, was removed.
* The hooks 'PreferencesFormPreSave' and 'PreferencesGetLegend' may provide
resetServiceForTesting( 'MagicWordFactory' ) on a MediaWikiServices.
* mw.util.init() has been removed. This function is not needed anymore and was
a no-op function since 1.30.
+* SpecialPageFactory::resetList() is a no-op. Call overrideMwServices()
+ instead.
=== Deprecations in 1.32 ===
* Use of a StartProfiler.php file is deprecated in favour of placing
methods instead.
* PasswordFactory::init is deprecated. To get a password factory with the
standard configuration, use MediaWikiServices::getPasswordFactory.
+* $wgContLang is deprecated, use MediaWikiServices::getContentLanguage()
+ instead.
+* $wgParser is deprecated, use MediaWikiServices::getParser() instead.
+* wfGetMainCache() is deprecated, use ObjectCache::getLocalClusterInstance()
+ instead.
+* wfGetCache() is deprecated, use ObjectCache::getInstance() instead.
+* All SpecialPageFactory static methods are deprecated. Instead, call the
+ methods on a SpecialPageFactory instance, which may be obtained from
+ MediaWikiServices.
=== Other changes in 1.32 ===
* (T198811) The following tables have had their UNIQUE indexes turned into
proper PRIMARY KEYs for increased maintainability: interwiki, page_props,
protected_titles and site_identifiers.
+* OOUI HTMLForm will now display help text inline after the input field,
+ rather than in a popup. Previous behavior can be restored by using
+ `'help-inline' => false`.
* …
== Compatibility ==
'MediaWiki\\Search\\ParserOutputSearchDataExtractor' => __DIR__ . '/includes/search/ParserOutputSearchDataExtractor.php',
'MediaWiki\\ShellDisabledError' => __DIR__ . '/includes/exception/ShellDisabledError.php',
'MediaWiki\\Site\\MediaWikiPageNameNormalizer' => __DIR__ . '/includes/site/MediaWikiPageNameNormalizer.php',
+ 'MediaWiki\\Special\\SpecialPageFactory' => __DIR__ . '/includes/specialpage/SpecialPageFactory.php',
'MediaWiki\\User\\UserIdentity' => __DIR__ . '/includes/user/UserIdentity.php',
'MediaWiki\\User\\UserIdentityValue' => __DIR__ . '/includes/user/UserIdentityValue.php',
'MediaWiki\\Widget\\ComplexNamespaceInputWidget' => __DIR__ . '/includes/widget/ComplexNamespaceInputWidget.php',
'PreferencesFormLegacy' => __DIR__ . '/includes/specials/forms/PreferencesFormLegacy.php',
'PreferencesFormOOUI' => __DIR__ . '/includes/specials/forms/PreferencesFormOOUI.php',
'PrefixSearch' => __DIR__ . '/includes/PrefixSearch.php',
+ 'PrefixingStatsdDataFactoryProxy' => __DIR__ . '/includes/libs/stats/PrefixingStatsdDataFactoryProxy.php',
'PreprocessDump' => __DIR__ . '/maintenance/preprocessDump.php',
'Preprocessor' => __DIR__ . '/includes/parser/Preprocessor.php',
'Preprocessor_DOM' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
'SpecialPage' => __DIR__ . '/includes/specialpage/SpecialPage.php',
'SpecialPageAction' => __DIR__ . '/includes/actions/SpecialPageAction.php',
'SpecialPageData' => __DIR__ . '/includes/specials/SpecialPageData.php',
- 'SpecialPageFactory' => __DIR__ . '/includes/specialpage/SpecialPageFactory.php',
+ 'SpecialPageFactory' => __DIR__ . '/includes/specialpage/SpecialPageFactory_deprecated.php',
'SpecialPageLanguage' => __DIR__ . '/includes/specials/SpecialPageLanguage.php',
'SpecialPagesWithProp' => __DIR__ . '/includes/specials/SpecialPagesWithProp.php',
'SpecialPasswordPolicies' => __DIR__ . '/includes/specials/SpecialPasswordPolicies.php',
'Wikimedia\\Rdbms\\SessionConsistentConnectionManager' => __DIR__ . '/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManager.php',
'Wikimedia\\Rdbms\\Subquery' => __DIR__ . '/includes/libs/rdbms/encasing/Subquery.php',
'Wikimedia\\Rdbms\\TransactionProfiler' => __DIR__ . '/includes/libs/rdbms/TransactionProfiler.php',
+ 'Wikimedia\\StaticArrayWriter' => __DIR__ . '/includes/libs/StaticArrayWriter.php',
'WikitextContent' => __DIR__ . '/includes/content/WikitextContent.php',
'WikitextContentHandler' => __DIR__ . '/includes/content/WikitextContentHandler.php',
'WikitextLogFormatter' => __DIR__ . '/includes/logging/WikitextLogFormatter.php',
that points to the search engines of the wiki.
profileinfo.php
- Allow users to see the profiling information that are stored in the
- database.
-
- To save the profiling information in the database (required to use this
- script), you have to modify StartProfiler.php to use the Profiler class and
- not the stub profiler which is enabled by default.
- You will also need to set $wgProfiler['output'] to 'db' in LocalSettings.php
- to force the profiler to save the informations in the database and apply the
- maintenance/archives/patch-profiling.sql patch to the database.
-
- To enable the profileinfo.php itself, you'll need to set $wgDBadminuser
- and $wgDBadminpassword in your LocalSettings.php, as well as $wgEnableProfileInfo
- See also https://www.mediawiki.org/wiki/Manual:Profiling .
+ Simple interface for displaying request profiles that were stored in the
+ database. For more information, see the documentation in that file, and at
+ https://www.mediawiki.org/wiki/Manual:Profiling.
thumb.php
Script used to resize images if it is configured to be done when the web
*/
$wgProfiler = [];
+/**
+ * Allow the profileinfo.php entrypoint to be used.
+ *
+ * @since 1.5.0
+ */
+$wgEnableProfileInfo = false;
+
/**
* Only record profiling info for pages that took longer than this
* @deprecated since 1.25: set $wgProfiler['threshold'] instead.
return false;
}
-/**
- * @since 1.32
- * @param string[] $data Array with string keys/values to export
- * @param string $header
- * @return string PHP code
- */
-function wfMakeStaticArrayFile( array $data, $header = 'Automatically generated' ) {
- $format = "\t%s => %s,\n";
- $code = "<?php\n"
- . "// " . implode( "\n// ", explode( "\n", $header ) ) . "\n"
- . "return [\n";
- foreach ( $data as $key => $value ) {
- $code .= sprintf(
- $format,
- var_export( $key, true ),
- var_export( $value, true )
- );
- }
- $code .= "];\n";
- return $code;
-}
-
/**
* Make a cache key for the local wiki.
*
/**
* Get a specific cache object.
*
+ * @deprecated since 1.32, use ObjectCache::getInstance() instead
* @param int|string $cacheType A CACHE_* constants, or other key in $wgObjectCaches
* @return BagOStuff
*/
/**
* Get the main cache object
*
+ * @deprecated since 1.32, use ObjectCache::getLocalClusterInstance() instead
* @return BagOStuff
*/
function wfGetMainCache() {
- global $wgMainCacheType;
- return ObjectCache::getInstance( $wgMainCacheType );
+ return ObjectCache::getLocalClusterInstance();
}
/**
*/
public static function normaliseSpecialPage( LinkTarget $target ) {
if ( $target->getNamespace() == NS_SPECIAL && !$target->isExternal() ) {
- list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $target->getDBkey() );
+ list( $name, $subpage ) = MediaWikiServices::getInstance()->getSpecialPageFactory()->
+ resolveAlias( $target->getDBkey() );
if ( !$name ) {
return $target;
}
// Redirect loops, titleless URL, $wgUsePathInfo URLs, and URLs with a variant
} elseif ( !$this->tryNormaliseRedirect( $title ) ) {
// Prevent information leak via Special:MyPage et al (T109724)
+ $spFactory = MediaWikiServices::getInstance()->getSpecialPageFactory();
if ( $title->isSpecialPage() ) {
- $specialPage = SpecialPageFactory::getPage( $title->getDBkey() );
+ $specialPage = $spFactory->getPage( $title->getDBkey() );
if ( $specialPage instanceof RedirectSpecialPage ) {
$specialPage->setContext( $this->context );
if ( $this->config->get( 'HideIdentifiableRedirects' )
&& $specialPage->personallyIdentifiableTarget()
) {
- list( , $subpage ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
+ list( , $subpage ) = $spFactory->resolveAlias( $title->getDBkey() );
$target = $specialPage->getRedirect( $subpage );
// target can also be true. We let that case fall through to normal processing.
if ( $target instanceof Title ) {
// Special pages ($title may have changed since if statement above)
if ( $title->isSpecialPage() ) {
// Actions that need to be made when we have a special pages
- SpecialPageFactory::executePath( $title, $this->context );
+ $spFactory->executePath( $title, $this->context );
} else {
// ...otherwise treat it as an article view. The article
// may still be a wikipage redirect to another article or URL.
}
if ( $title->isSpecialPage() ) {
- list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
+ list( $name, $subpage ) = MediaWikiServices::getInstance()->getSpecialPageFactory()->
+ resolveAlias( $title->getDBkey() );
if ( $name ) {
$title = SpecialPage::getTitleFor( $name, $subpage );
}
$invokedWithSuccess = true;
if ( $sock ) {
- $special = SpecialPageFactory::getPage( 'RunJobs' );
+ $special = MediaWikiServices::getInstance()->getSpecialPageFactory()->
+ getPage( 'RunJobs' );
$url = $special->getPageTitle()->getCanonicalURL( $query );
$req = (
"POST $url HTTP/1.1\r\n" .
use GlobalVarConfig;
use Hooks;
use IBufferingStatsdDataFactory;
+use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
use MediaWiki\Http\HttpRequestFactory;
use MediaWiki\Preferences\PreferencesFactory;
use MediaWiki\Shell\CommandFactory;
+use MediaWiki\Special\SpecialPageFactory;
use MediaWiki\Storage\BlobStore;
use MediaWiki\Storage\BlobStoreFactory;
use MediaWiki\Storage\NameTableStore;
/**
* @since 1.32
- * @return IBufferingStatsdDataFactory
+ * @return StatsdDataFactoryInterface
*/
public function getPerDbNameStatsdDataFactory() {
return $this->getService( 'PerDbNameStatsdDataFactory' );
return $this->getService( 'SlotRoleStore' );
}
+ /**
+ * @since 1.32
+ * @return SpecialPageFactory
+ */
+ public function getSpecialPageFactory() : SpecialPageFactory {
+ return $this->getService( 'SpecialPageFactory' );
+ }
+
/**
* @since 1.27
* @return IBufferingStatsdDataFactory
$curRevisionId = 0;
$articleId = 0;
$canonicalSpecialPageName = false; # T23115
+ $services = MediaWikiServices::getInstance();
$title = $this->getTitle();
$ns = $title->getNamespace();
if ( $ns == NS_SPECIAL ) {
list( $canonicalSpecialPageName, /*...*/ ) =
- SpecialPageFactory::resolveAlias( $title->getDBkey() );
+ $services->getSpecialPageFactory()->
+ resolveAlias( $title->getDBkey() );
} elseif ( $this->canUseWikiPage() ) {
$wikiPage = $this->getWikiPage();
$curRevisionId = $wikiPage->getLatest();
$vars['wgUserNewMsgRevisionId'] = $user->getNewMessageRevisionId();
}
- $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+ $contLang = $services->getContentLanguage();
if ( $contLang->hasVariants() ) {
$vars['wgUserVariant'] = $contLang->getPreferredVariant();
}
* @return DefaultPreferencesFactory
*/
protected static function getDefaultPreferencesFactory() {
+ $services = MediaWikiServices::getInstance();
$authManager = AuthManager::singleton();
- $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
- $config = MediaWikiServices::getInstance()->getMainConfig();
+ $linkRenderer = $services->getLinkRenderer();
+ $config = $services->getMainConfig();
$preferencesFactory = new DefaultPreferencesFactory(
- $config, MediaWikiServices::getInstance()->getContentLanguage(), $authManager,
+ $config, $services->getContentLanguage(), $authManager,
$linkRenderer
);
return $preferencesFactory;
$subpageSearch = $searchParts[1] ?? null;
// Handle subpage search separately.
+ $spFactory = MediaWikiServices::getInstance()->getSpecialPageFactory();
if ( $subpageSearch !== null ) {
// Try matching the full search string as a page name
$specialTitle = Title::makeTitleSafe( NS_SPECIAL, $searchKey );
if ( !$specialTitle ) {
return [];
}
- $special = SpecialPageFactory::getPage( $specialTitle->getText() );
+ $special = $spFactory->getPage( $specialTitle->getText() );
if ( $special ) {
$subpages = $special->prefixSearchSubpages( $subpageSearch, $limit, $offset );
return array_map( function ( $sub ) use ( $specialTitle ) {
// Unlike SpecialPage itself, we want the canonical forms of both
// canonical and alias title forms...
$keys = [];
- foreach ( SpecialPageFactory::getNames() as $page ) {
+ foreach ( $spFactory->getNames() as $page ) {
$keys[$contLang->caseFold( $page )] = [ 'page' => $page, 'rank' => 0 ];
}
foreach ( $contLang->getSpecialPageAliases() as $page => $aliases ) {
- if ( !in_array( $page, SpecialPageFactory::getNames() ) ) {# T22885
+ if ( !in_array( $page, $spFactory->getNames() ) ) {# T22885
continue;
}
* MediaWiki code base.
*/
+use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
use MediaWiki\Auth\AuthManager;
use MediaWiki\Config\ConfigRepository;
use MediaWiki\Interwiki\ClassicInterwikiLookup;
use MediaWiki\Preferences\PreferencesFactory;
use MediaWiki\Preferences\DefaultPreferencesFactory;
use MediaWiki\Shell\CommandFactory;
+use MediaWiki\Special\SpecialPageFactory;
use MediaWiki\Storage\BlobStore;
use MediaWiki\Storage\BlobStoreFactory;
use MediaWiki\Storage\NameTableStore;
$services->getMainConfig()->get( 'ParserConf' ),
$services->getMagicWordFactory(),
$services->getContentLanguage(),
- wfUrlProtocols()
+ wfUrlProtocols(),
+ $services->getSpecialPageFactory()
);
},
},
'PerDbNameStatsdDataFactory' =>
- function ( MediaWikiServices $services ) : IBufferingStatsdDataFactory {
+ function ( MediaWikiServices $services ) : StatsdDataFactoryInterface {
$config = $services->getMainConfig();
$wiki = $config->get( 'DBname' );
- return new BufferingStatsdDataFactory(
- rtrim( $services->getMainConfig()->get( 'StatsdMetricPrefix' ), '.' ) . '.' . $wiki
+ return new PrefixingStatsdDataFactoryProxy(
+ $services->getStatsdDataFactory(),
+ $wiki
);
},
);
},
+ 'SpecialPageFactory' => function ( MediaWikiServices $services ) : SpecialPageFactory {
+ return new SpecialPageFactory(
+ $services->getMainConfig(),
+ $services->getContentLanguage()
+ );
+ },
+
'StatsdDataFactory' => function ( MediaWikiServices $services ) : IBufferingStatsdDataFactory {
return new BufferingStatsdDataFactory(
rtrim( $services->getMainConfig()->get( 'StatsdMetricPrefix' ), '.' )
wfDebug( $debug );
}
-$wgMemc = wfGetMainCache();
+$wgMemc = ObjectCache::getLocalClusterInstance();
$messageMemc = wfGetMessageCacheStorage();
wfDebugLog( 'caches',
/**
* @var Parser $wgParser
+ * @deprecated since 1.32, use MediaWikiServices::getParser() instead
*/
$wgParser = new StubObject( 'wgParser', function () {
return MediaWikiServices::getInstance()->getParser();
*/
public function isSpecial( $name ) {
if ( $this->isSpecialPage() ) {
- list( $thisName, /* $subpage */ ) = SpecialPageFactory::resolveAlias( $this->mDbkeyform );
+ list( $thisName, /* $subpage */ ) =
+ MediaWikiServices::getInstance()->getSpecialPageFactory()->
+ resolveAlias( $this->mDbkeyform );
if ( $name == $thisName ) {
return true;
}
*/
public function fixSpecialName() {
if ( $this->isSpecialPage() ) {
- list( $canonicalName, $par ) = SpecialPageFactory::resolveAlias( $this->mDbkeyform );
+ $spFactory = MediaWikiServices::getInstance()->getSpecialPageFactory();
+ list( $canonicalName, $par ) = $spFactory->resolveAlias( $this->mDbkeyform );
if ( $canonicalName ) {
- $localName = SpecialPageFactory::getLocalNameFor( $canonicalName, $par );
+ $localName = $spFactory->getLocalNameFor( $canonicalName, $par );
if ( $localName != $this->mDbkeyform ) {
return self::makeTitle( NS_SPECIAL, $localName );
}
} elseif ( $this->isSpecialPage() ) {
# If it's a special page, ditch the subpage bit and check again
$name = $this->mDbkeyform;
- list( $name, /* $subpage */ ) = SpecialPageFactory::resolveAlias( $name );
+ list( $name, /* $subpage */ ) =
+ MediaWikiServices::getInstance()->getSpecialPageFactory()->
+ resolveAlias( $name );
if ( $name ) {
$pure = SpecialPage::getTitleFor( $name )->getPrefixedText();
if ( in_array( $pure, $wgWhitelistRead, true ) ) {
return (bool)wfFindFile( $this );
case NS_SPECIAL:
// valid special page
- return SpecialPageFactory::exists( $this->mDbkeyform );
+ return MediaWikiServices::getInstance()->getSpecialPageFactory()->
+ exists( $this->mDbkeyform );
case NS_MAIN:
// selflink, possibly with fragment
return $this->mDbkeyform == '';
* @ingroup Actions
*/
+use MediaWiki\MediaWikiServices;
+
/**
* An action that just passes the request to the relevant special page
*
}
// map actions to (whitelisted) special pages
- return SpecialPageFactory::getPage( self::$actionToSpecialPageMapping[$action] );
+ return MediaWikiServices::getInstance()->getSpecialPageFactory()->
+ getPage( self::$actionToSpecialPageMapping[$action] );
}
}
private function processTitlesArray( $titles ) {
$usernames = [];
$linkBatch = new LinkBatch();
+ $services = MediaWikiServices::getInstance();
+ $contLang = $services->getContentLanguage();
foreach ( $titles as $title ) {
if ( is_string( $title ) ) {
$this->mInterwikiTitles[$unconvertedTitle] = $titleObj->getInterwiki();
} else {
// Variants checking
- $contLang = MediaWikiServices::getInstance()->getContentLanguage();
if (
$this->mConvertTitles && $contLang->hasVariants() && !$titleObj->exists()
) {
$this->mAllSpecials[$ns][$dbkey] = $this->mFakePageId;
$target = null;
if ( $ns === NS_SPECIAL && $this->mResolveRedirects ) {
- $special = SpecialPageFactory::getPage( $dbkey );
+ $spFactory = $services->getSpecialPageFactory();
+ $special = $spFactory->getPage( $dbkey );
if ( $special instanceof RedirectSpecialArticle ) {
// Only RedirectSpecialArticle is intended to redirect to an article, other kinds of
// RedirectSpecialPage are probably applying weird URL parameters we don't want to handle.
$context->setTitle( $titleObj );
$context->setRequest( new FauxRequest );
$special->setContext( $context );
- list( /* $alias */, $subpage ) = SpecialPageFactory::resolveAlias( $dbkey );
+ list( /* $alias */, $subpage ) = $spFactory->resolveAlias( $dbkey );
$target = $special->getRedirect( $subpage );
}
}
}
}
// Get gender information
- $genderCache = MediaWikiServices::getInstance()->getGenderCache();
+ $genderCache = $services->getGenderCache();
$genderCache->doQuery( $usernames, __METHOD__ );
return $linkBatch;
// If we have more than one engine the list of available sorts is
// difficult to represent. For now don't expose it.
- $alternatives = MediaWiki\MediaWikiServices::getInstance()
+ $services = MediaWiki\MediaWikiServices::getInstance();
+ $alternatives = $services
->getSearchEngineConfig()
->getSearchTypes();
if ( count( $alternatives ) == 1 ) {
$this->allowedParams['sort'] = [
ApiBase::PARAM_DFLT => 'relevance',
- ApiBase::PARAM_TYPE => MediaWiki\MediaWikiServices::getInstance()
+ ApiBase::PARAM_TYPE => $services
->newSearchEngine()
->getValidSorts(),
];
protected function appendSpecialPageAliases( $property ) {
$data = [];
- $aliases = MediaWikiServices::getInstance()->getContentLanguage()->getSpecialPageAliases();
- foreach ( SpecialPageFactory::getNames() as $specialpage ) {
+ $services = MediaWikiServices::getInstance();
+ $aliases = $services->getContentLanguage()->getSpecialPageAliases();
+ foreach ( $services->getSpecialPageFactory()->getNames() as $specialpage ) {
if ( isset( $aliases[$specialpage] ) ) {
$arr = [ 'realname' => $specialpage, 'aliases' => $aliases[$specialpage] ];
ApiResult::setIndexedTagName( $arr['aliases'], 'alias' );
"apihelp-compare-param-totitle": "要比對的第二個標題。",
"apihelp-compare-param-toid": "要比對的第二個頁面 ID。",
"apihelp-compare-param-torev": "要比對的第二個修訂。",
+ "apihelp-compare-param-tocontentformat": "<var>totext</var> 的內容序列化格式。",
"apihelp-compare-param-prop": "要取得的資訊部份。",
+ "apihelp-compare-paramvalue-prop-diff": "HTML 差異。",
+ "apihelp-compare-paramvalue-prop-diffsize": "以位元組為單位的 HTML 差異大小。",
"apihelp-compare-example-1": "建立修訂 1 與 1 的差異檔",
"apihelp-createaccount-summary": "建立新使用者帳號。",
"apihelp-createaccount-param-name": "使用者名稱。",
"apihelp-edit-param-nocreate": "若頁面不存在,則產生錯誤。",
"apihelp-edit-param-watch": "加入目前頁面至您的監視清單。",
"apihelp-edit-param-unwatch": "從您的監視清單中移除目前頁面。",
+ "apihelp-edit-param-redirect": "自動化解決重新導向。",
"apihelp-edit-param-contentformat": "用於輸入文字的內容序列化格式。",
"apihelp-edit-param-contentmodel": "新內容的內容模組。",
"apihelp-edit-example-edit": "編輯頁面",
"apihelp-feedrecentchanges-param-hideanons": "隱藏匿名使用者做的變更。",
"apihelp-feedrecentchanges-param-hideliu": "隱藏已註冊使用者做的變更。",
"apihelp-feedrecentchanges-param-hidepatrolled": "隱藏已巡查的變更。",
+ "apihelp-feedrecentchanges-param-hidemyself": "隱藏由目前使用者做出的更改。",
+ "apihelp-feedrecentchanges-param-hidecategorization": "隱藏分類成員更改。",
+ "apihelp-feedrecentchanges-param-tagfilter": "按標籤篩選。",
"apihelp-feedrecentchanges-example-simple": "顯示近期變更。",
"apihelp-feedrecentchanges-example-30days": "顯示近期30天內的變動",
"apihelp-feedwatchlist-summary": "返回監視清單 feed。",
"apihelp-feedwatchlist-param-feedformat": "Feed 的格式。",
"apihelp-filerevert-param-comment": "上載意見。",
+ "apihelp-help-summary": "顯示指定模組的說明。",
"apihelp-help-example-main": "主模組使用說明",
"apihelp-help-example-recursive": "一個頁面中的所有說明。",
"apihelp-help-example-help": "說明模組自身的說明。",
"apihelp-options-example-reset": "重設所有偏好設定",
"apihelp-options-example-change": "更改<kbd>skin</kbd>和<kbd>hideminor</kbd>偏好設定。",
"apihelp-paraminfo-summary": "獲得有關 API 模組的資訊。",
+ "apihelp-paraminfo-param-helpformat": "說明字串的格式。",
"apihelp-parse-param-summary": "解析摘要。",
"apihelp-parse-param-pageid": "解析此頁面的內容。覆蓋 <var>$1page</var>。",
"apihelp-parse-param-prop": "要取得的資訊部份:",
+ "apihelp-parse-paramvalue-prop-headhtml": "取得頁面已解析的 <code><head></code>。",
"apihelp-parse-param-disablepp": "請改用<var>$1disablelimitreport</var>。",
"apihelp-parse-param-preview": "在預覽模式下解析。",
"apihelp-parse-example-page": "解析頁面。",
"apihelp-query+allcategories-param-to": "終止列舉的分類。",
"apihelp-query+allcategories-param-prefix": "搜尋以此值為開頭的所有分類標題。",
"apihelp-query+allcategories-param-dir": "排序的方向。",
+ "apihelp-query+allcategories-param-min": "僅回傳至少有這樣多成員的分類。",
+ "apihelp-query+allcategories-param-max": "僅回傳最多有這樣多成員的分類。",
"apihelp-query+allcategories-param-limit": "要回傳的分類數量。",
"apihelp-query+allcategories-param-prop": "要取得的屬性。",
"apihelp-query+allcategories-paramvalue-prop-size": "在分類裡添加頁面數。",
"apihelp-query+alldeletedrevisions-summary": "依使用者或所在命名空間來列出所有已刪除的修訂。",
+ "apihelp-query+alldeletedrevisions-paraminfo-useronly": "僅與 <var>$3user</var> 一同使用。",
+ "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "不能與 <var>$3user</var> 一同使用。",
"apihelp-query+alldeletedrevisions-param-start": "起始列舉的時間戳記。",
+ "apihelp-query+alldeletedrevisions-param-end": "終止列舉的時間戳記。",
"apihelp-query+alldeletedrevisions-param-from": "在此標題開始列出。",
"apihelp-query+alldeletedrevisions-param-to": "在此標題停止列出。",
+ "apihelp-query+alldeletedrevisions-param-prefix": "搜尋以此值為開頭的所有頁面標題。",
"apihelp-query+alldeletedrevisions-param-user": "此列出由該使用者作出的修訂。",
"apihelp-query+alldeletedrevisions-param-excludeuser": "不要列出由該使用者作出的修訂。",
"apihelp-query+alldeletedrevisions-param-namespace": "僅列出此命名空間的頁面。",
"apihelp-query+allfileusages-param-limit": "要回傳的項目總數。",
"apihelp-query+allfileusages-param-dir": "列出時所採用的方向。",
"apihelp-query+allfileusages-example-unique": "列出唯一的檔案標題。",
+ "apihelp-query+allfileusages-example-unique-generator": "取得所有檔案標題,標記為遺失。",
"apihelp-query+allfileusages-example-generator": "取得包含檔案的頁面。",
+ "apihelp-query+allimages-param-sort": "作為排序順序的屬性。",
"apihelp-query+allimages-param-dir": "列出時所採用的方向。",
"apihelp-query+allimages-param-minsize": "限制圖片至少要有這樣多的位元組。",
"apihelp-query+allimages-param-maxsize": "限制圖片最多只能這樣多的位元組。",
"apihelp-query+allmessages-param-lang": "以此語言來回傳訊息。",
"apihelp-query+allmessages-param-from": "以此訊息來回傳訊息開頭。",
"apihelp-query+allmessages-param-to": "以此訊息來回傳訊息結尾。",
+ "apihelp-query+allpages-param-from": "起始列舉的頁面標題。",
+ "apihelp-query+allpages-param-to": "終止列舉的頁面標題。",
+ "apihelp-query+allpages-param-prefix": "搜尋以此值為開頭的所有頁面標題。",
+ "apihelp-query+allpages-param-namespace": "要列舉的命名空間。",
"apihelp-query+allpages-param-filterredir": "要列出的頁面。",
+ "apihelp-query+allpages-param-minsize": "限制頁面至少要有這樣多的位元組。",
+ "apihelp-query+allpages-param-maxsize": "限制頁面最多只能這樣多的位元組。",
+ "apihelp-query+allpages-param-prtype": "僅限受保護的頁面。",
"apihelp-query+allpages-param-limit": "要回傳的頁面總數。",
+ "apihelp-query+allpages-param-dir": "列出時所採用的方向。",
"apihelp-query+allredirects-summary": "列出至命名空間的所有重新導向。",
+ "apihelp-query+allredirects-param-from": "要起始列舉的重新導向標題。",
+ "apihelp-query+allredirects-param-to": "要終止列舉的重新導向標題。",
+ "apihelp-query+allredirects-param-prefix": "搜尋以此值為開頭的所有目標頁面。",
+ "apihelp-query+allredirects-param-prop": "要包含的資訊部份:",
+ "apihelp-query+allredirects-paramvalue-prop-title": "添加重新導向的標題。",
"apihelp-query+allredirects-param-namespace": "要列舉的命名空間。",
"apihelp-query+allredirects-param-limit": "要回傳的項目總數。",
+ "apihelp-query+allredirects-param-dir": "列出時所採用的方向。",
"apihelp-query+allredirects-example-generator": "取得包含重新導向的頁面。",
"apihelp-query+allrevisions-summary": "列出所有修訂版本。",
"apihelp-query+allrevisions-param-start": "起始列舉的時間戳記。",
"apihelp-query+mystashedfiles-paramvalue-prop-size": "索取檔案大小與圖片尺寸。",
"apihelp-query+mystashedfiles-paramvalue-prop-type": "索取檔案的 MIME 類型以及媒體類型。",
"apihelp-query+mystashedfiles-param-limit": "要取得的檔案數量。",
+ "apihelp-query+alltransclusions-param-namespace": "要列舉的命名空間。",
"apihelp-query+alltransclusions-param-limit": "要回傳的項目總數。",
"apihelp-query+alltransclusions-param-dir": "列出時所採用的方向。",
+ "apihelp-query+allusers-summary": "列舉所有已註冊使用者。",
"apihelp-query+allusers-param-from": "起始列舉的使用者名稱。",
+ "apihelp-query+allusers-param-to": "終止列舉的使用者名稱。",
+ "apihelp-query+allusers-param-prefix": "搜尋以此值為開頭的所有使用者。",
"apihelp-query+allusers-param-dir": "排序的方向。",
+ "apihelp-query+allusers-param-group": "僅包含在指定群組的使用者。",
+ "apihelp-query+allusers-param-excludegroup": "排除指定群組中的使用者",
+ "apihelp-query+allusers-param-prop": "要包含的資訊部份:",
+ "apihelp-query+allusers-paramvalue-prop-rights": "列出使用者所擁有的權限。",
+ "apihelp-query+allusers-paramvalue-prop-editcount": "添加使用者的編輯次數。",
"apihelp-query+allusers-example-Y": "列出以<kbd>Y</kbd>開頭的使用者。",
"apihelp-query+authmanagerinfo-summary": "取得目前身分核對狀態的資訊。",
+ "apihelp-query+backlinks-summary": "找出連結至指定頁面的所有頁面。",
"apihelp-query+backlinks-param-namespace": "要列舉的命名空間。",
"apihelp-query+backlinks-param-dir": "列出時所採用的方向。",
"apihelp-query+blocks-summary": "列出所有被封鎖使用者與 IP 位址。",
"apihelp-query+blocks-paramvalue-prop-userid": "添加已封鎖使用者的使用者 ID。",
"apihelp-query+blocks-paramvalue-prop-by": "添加進行封鎖中的使用者之使用者名稱。",
"apihelp-query+blocks-paramvalue-prop-byid": "添加進行封鎖中的使用者之使用者 ID。",
+ "apihelp-query+blocks-example-simple": "列出封鎖。",
+ "apihelp-query+blocks-example-users": "列出使用者 <kbd>Alice</kbd> 與 <kbd>Bob</kbd> 的封鎖。",
"apihelp-query+categories-param-limit": "要回傳的分類數量。",
"apihelp-query+categoryinfo-summary": "回傳有關指定分類的資訊。",
"apihelp-query+categorymembers-summary": "在指定的分類中列出所有頁面。",
"apihelp-query+categorymembers-param-limit": "回傳的頁面數量上限。",
"apihelp-query+categorymembers-param-startsortkey": "請改用 $1starthexsortkey。",
"apihelp-query+categorymembers-param-endsortkey": "請改用 $1endhexsortkey。",
+ "apihelp-query+categorymembers-example-simple": "取得在 <kbd>Category:Physics</kbd> 裡前 10 項的頁面。",
"apihelp-query+contributors-param-limit": "要回傳的貢獻人員數量。",
"apihelp-query+deletedrevisions-summary": "取得已刪除修訂的資訊。",
"apihelp-query+deletedrevisions-param-user": "此列出由該使用者作出的修訂。",
"apihelp-query+duplicatefiles-param-limit": "要回傳的重複檔案數量。",
"apihelp-query+duplicatefiles-param-dir": "列出時所採用的方向。",
"apihelp-query+duplicatefiles-example-generated": "查看全部有重複到的檔案。",
+ "apihelp-query+embeddedin-param-namespace": "要列舉的命名空間。",
"apihelp-query+embeddedin-param-dir": "列出時所採用的方向。",
"apihelp-query+embeddedin-param-filterredir": "如何過濾重新導向。",
"apihelp-query+embeddedin-param-limit": "要回傳的頁面總數。",
"apihelp-query+extlinks-summary": "回傳所有指定頁面的外部 URL (非 interwiki)。",
"apihelp-query+extlinks-param-limit": "要回傳的連結數量。",
"apihelp-query+exturlusage-paramvalue-prop-ids": "添加頁面 ID。",
+ "apihelp-query+exturlusage-paramvalue-prop-url": "添加用於頁面的 URL。",
"apihelp-query+exturlusage-param-namespace": "要列舉的頁面命名空間。",
"apihelp-query+exturlusage-param-limit": "要回傳的頁面數量。",
"apihelp-query+filearchive-param-limit": "要回傳的圖片總數。",
"apihelp-query+imageusage-param-dir": "列出時所採用的方向。",
"apihelp-query+info-summary": "取得基本頁面訊息。",
"apihelp-query+info-param-prop": "要取得的額外屬性:",
+ "apihelp-query+info-paramvalue-prop-readable": "使用者是否可閱讀此頁面。",
"apihelp-query+iwbacklinks-param-prop": "要取得的屬性。",
"apihelp-query+iwlinks-summary": "回傳指定頁面的所有 interwiki 連結。",
"apihelp-query+iwlinks-paramvalue-prop-url": "添加完整的 URL。",
"apihelp-query+prefixsearch-param-offset": "要略過的結果數量。",
"apihelp-query+protectedtitles-param-limit": "要回傳的頁面總數。",
"apihelp-query+protectedtitles-param-prop": "要取得的屬性。",
+ "apihelp-query+protectedtitles-example-simple": "列出已保護的標題。",
"apihelp-query+querypage-param-limit": "回傳的結果數量。",
+ "apihelp-query+random-summary": "取得隨機頁面集合",
+ "apihelp-query+random-param-namespace": "僅回傳在這些命名空間的頁面。",
+ "apihelp-query+random-param-redirect": "請改用 <kbd>$1filterredir=redirects</kbd>。",
+ "apihelp-query+random-param-filterredir": "如何過濾重新導向。",
"apihelp-query+recentchanges-summary": "列舉出最近變更。",
"apihelp-query+recentchanges-param-start": "起始列舉的時間戳記。",
"apihelp-query+recentchanges-param-end": "結束列舉的時間戳記。",
"apihelp-query+recentchanges-param-user": "此列出由該使用者作出的更改。",
"apihelp-query+recentchanges-param-excludeuser": "不要列出由該使用者作出的更改。",
+ "apihelp-query+recentchanges-paramvalue-prop-flags": "添加編輯的標籤。",
+ "apihelp-query+recentchanges-paramvalue-prop-timestamp": "添加編輯的時間戳記。",
+ "apihelp-query+recentchanges-paramvalue-prop-title": "添加編輯的頁面標題。",
+ "apihelp-query+recentchanges-paramvalue-prop-tags": "列出項目的標籤。",
"apihelp-query+recentchanges-param-limit": "要回傳變更總數。",
+ "apihelp-query+recentchanges-param-type": "更改的顯示類型。",
"apihelp-query+recentchanges-example-simple": "最近變更清單",
"apihelp-query+redirects-summary": "回傳連結至指定頁面的所有重新導向。",
"apihelp-query+redirects-param-prop": "要取得的屬性。",
"apihelp-query+redirects-paramvalue-prop-title": "各重新導向的標題。",
"apihelp-query+redirects-param-limit": "要回傳的重新導向數量。",
"apihelp-query+revisions-summary": "取得修訂的資訊。",
+ "apihelp-query+revisions-example-content": "取得用於標題 <kbd>API</kbd> 與 <kbd>Main Page</kbd> 最新修訂內容的資料。",
+ "apihelp-query+revisions-example-last5": "取得 <kbd>Main Page</kbd> 的最近 5 筆修訂。",
+ "apihelp-query+revisions-example-first5": "取得 <kbd>Main Page</kbd> 的最早前 5 筆修訂。",
+ "apihelp-query+revisions-example-first5-after": "取得 <kbd>Main Page</kbd> 自 2006-05-01 後做的前 5 筆修訂。",
+ "apihelp-query+revisions-example-first5-not-localhost": "取得 <kbd>Main Page</kbd> 裡並非由匿名使用者 <kbd>127.0.0.1</kbd> 所做出的最早前 5 筆修訂。",
+ "apihelp-query+revisions-example-first5-user": "取得 <kbd>Main Page</kbd> 裡由使用者 <kbd>MediaWiki default</kbd> 所做出的最早前 5 筆修訂。",
"apihelp-query+revisions+base-paramvalue-prop-ids": "修訂 ID。",
"apihelp-query+revisions+base-paramvalue-prop-tags": "修訂標籤。",
+ "apihelp-query+search-summary": "執行全文搜尋。",
+ "apihelp-query+search-param-what": "要執行的搜尋類型。",
"apihelp-query+search-param-info": "要回傳的詮釋資料。",
"apihelp-query+search-param-prop": "要回傳的屬性:",
+ "apihelp-query+search-paramvalue-prop-size": "添加以位元組為單位的頁面大小。",
+ "apihelp-query+search-paramvalue-prop-wordcount": "添加頁面的字數。",
+ "apihelp-query+search-paramvalue-prop-timestamp": "添加頁面自上一次編輯的時間戳記。",
"apihelp-query+search-paramvalue-prop-score": "已忽略",
"apihelp-query+search-paramvalue-prop-hasrelated": "已忽略",
"apihelp-query+search-param-limit": "要回傳的頁面總數。",
+ "apihelp-query+siteinfo-paramvalue-prop-general": "全面系統資訊。",
+ "apihelp-query+siteinfo-param-numberingroup": "列出在使用者群組裡的使用者數目。",
"apihelp-query+siteinfo-example-simple": "索取站台資訊。",
"apihelp-query+siteinfo-example-interwiki": "索取本地端跨 wiki 前綴的清單。",
"apihelp-query+stashimageinfo-summary": "回傳多筆儲藏檔案的檔案資訊。",
"apihelp-query+transcludedin-paramvalue-prop-title": "各頁面的標題。",
"apihelp-query+transcludedin-paramvalue-prop-redirect": "若頁面為重新導向,則做出標記。",
"apihelp-query+transcludedin-param-limit": "回傳的數量。",
+ "apihelp-query+usercontribs-summary": "按使用者來取得所有編輯。",
"apihelp-query+usercontribs-param-limit": "回傳的貢獻數量上限。",
+ "apihelp-query+usercontribs-paramvalue-prop-ids": "添加頁面 ID 與修訂 ID。",
+ "apihelp-query+usercontribs-paramvalue-prop-title": "添加標題與頁面的命名空間 ID。",
+ "apihelp-query+usercontribs-paramvalue-prop-timestamp": "添加編輯的時間戳記。",
+ "apihelp-query+usercontribs-paramvalue-prop-comment": "添加編輯的註釋。",
+ "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "添加編輯的已解析註解。",
+ "apihelp-query+usercontribs-paramvalue-prop-size": "添加編輯的新大小。",
+ "apihelp-query+userinfo-paramvalue-prop-realname": "添加使用者的真實姓名。",
+ "apihelp-query+userinfo-paramvalue-prop-email": "添加使用者的電子郵件地址與電子郵件驗證日期。",
+ "apihelp-query+userinfo-paramvalue-prop-registrationdate": "添加使用者的註冊日期。",
+ "apihelp-query+userinfo-example-simple": "取得目前使用者的資訊。",
+ "apihelp-query+userinfo-example-data": "取得目前使用者的額外資訊。",
"apihelp-query+users-summary": "取得有關使用者清單的資訊。",
+ "apihelp-query+users-param-prop": "要包含的資訊部份:",
"apihelp-query+watchlist-param-start": "起始列舉的時間戳記。",
"apihelp-query+watchlist-param-end": "結束列舉的時間戳記。",
"apihelp-query+watchlist-param-limit": "每個請求要回傳的結果總數。",
"apihelp-query+watchlist-paramvalue-prop-title": "添加頁面標題。",
"apihelp-query+watchlist-paramvalue-prop-flags": "添加編輯的標籤。",
+ "apihelp-query+watchlist-paramvalue-prop-tags": "列出項目的標籤。",
+ "apihelp-query+watchlist-paramvalue-type-new": "頁面建立。",
"apihelp-query+watchlist-paramvalue-type-log": "日誌項目。",
"apihelp-query+watchlist-paramvalue-type-categorize": "分類成員更改。",
"apihelp-query+watchlistraw-param-limit": "每個請求要回傳的結果總數。",
"apihelp-query+watchlistraw-param-dir": "列出時所採用的方向。",
"apihelp-removeauthenticationdata-summary": "為目前使用者移除身分核對資料。",
"apihelp-revisiondelete-summary": "刪除和取消刪除修訂。",
+ "apihelp-rollback-summary": "撤修頁面的最後一次編輯。",
+ "apihelp-setpagelanguage-summary": "更改頁面的語言。",
+ "apihelp-setpagelanguage-param-reason": "變更的原因。",
"apihelp-stashedit-param-title": "正在編輯此頁面的標題。",
"apihelp-stashedit-param-text": "頁面內容。",
"apihelp-tokens-summary": "取得資料修改動作的密鑰。",
"apihelp-undelete-param-reason": "還原的原因。",
"apihelp-upload-param-filename": "目標檔案名稱。",
"apihelp-upload-param-comment": "上傳註釋。如果 <var>$1text</var> 未指定的話,也會作為新檔案用的初始頁面文字。",
+ "apihelp-upload-param-watch": "監視頁面。",
+ "apihelp-upload-param-ignorewarnings": "忽略所有警告。",
"apihelp-upload-param-file": "檔案內容。",
"apihelp-upload-example-url": "從 URL 上傳。",
"apihelp-userrights-summary": "變更一位使用者的群組成員。",
"apierror-copyuploadbadurl": "不允許從此 URL 來上傳。",
"apierror-filedoesnotexist": "檔案不存在。",
"apierror-filenopath": "無法取得本地端檔案路徑。",
+ "apierror-filetypecannotberotated": "無法旋轉的檔案類型。",
+ "apierror-imageusage-badtitle": "<kbd>$1</kbd>的標題必須是檔案。",
"apierror-import-unknownerror": "未知的匯入錯誤:$1",
"apierror-invalidsha1hash": "所提供的 SHA1 雜湊無效。",
+ "apierror-invaliduser": "無效的使用者名稱「$1」。",
+ "apierror-invaliduserid": "使用者 ID <var>$1</var> 無效。",
"apierror-missingparam": "<var>$1</var>參數必須被設定。",
"apierror-missingtitle": "您所指定的頁面不存在。",
"apierror-mustbeloggedin-changeauth": "必須登入,才能變更身分核對資取。",
"apierror-mustbeloggedin-generic": "您必須登入。",
+ "apierror-mustbeloggedin-linkaccounts": "您必須登入到連結帳號。",
"apierror-mustbeloggedin-removeauth": "必須登入,才能移除身分核對資取。",
"apierror-nodeleteablefile": "沒有這樣檔案的舊版本。",
"apierror-noedit-anon": "匿名使用者不可編輯頁面。",
"apierror-noedit": "您沒有權限來編輯頁面。",
"apierror-nouploadmodule": "未設定上傳模組。",
+ "apierror-pagecannotexist": "命名空間不允許實際頁面。",
"apierror-permissiondenied": "您沒有權限$1。",
+ "apierror-permissiondenied-generic": "權限不足。",
"apierror-permissiondenied-unblock": "您沒有權限來解封使用者。",
+ "apierror-readapidenied": "您需要有閱讀權限來使用此模組。",
"apierror-readonly": "Wiki 目前為唯讀模式。",
"apierror-reauthenticate": "於本工作階段還未核對身分,請重新核對。",
+ "apierror-searchdisabled": "<var>$1</var>搜尋已停用。",
+ "apierror-stashwrongowner": "錯誤擁有者:$1",
"apierror-timeout": "伺服器未有在預計的時間內回應。",
"apierror-unknownerror-editpage": "不明編輯頁面錯誤:$1。",
"apierror-unknownerror-nocode": "不明錯誤。",
"apierror-unknownerror": "不明錯誤:\"$1\"。",
"apierror-unknownformat": "無法識別的格式\"$1\"。",
"apierror-upload-missingresult": "狀態資料裡沒有結果。",
+ "apiwarn-deprecation-httpsexpected": "當應為 HTTPS 時,HTTP 要被使用。",
+ "apiwarn-invalidcategory": "「$1」不是一個分類。",
+ "apiwarn-invalidtitle": "「$1」不是一個有效標題。",
+ "apiwarn-notfile": "「$1」不是一個檔案。",
+ "apiwarn-validationfailed-badpref": "不是有效的偏好設定。",
+ "apiwarn-validationfailed-cannotset": "不能透過此模組設定。",
"api-feed-error-title": "錯誤($1)",
"api-credits-header": "製作群",
"api-credits": "API 開發人員:\n* Roan Kattouw (首席開發者 Sep 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (創立者,首席開發者 Sep 2006–Sep 2007)\n* Brad Jorsch (首席開發者 2013–present)\n\n請傳送您的評論、建議以及問題至 mediawiki-api@lists.wikimedia.org\n或者回報問題至 https://phabricator.wikimedia.org/。"
if ( $this->isEmpty() ) {
return false;
}
+ $services = MediaWikiServices::getInstance();
- if ( !MediaWikiServices::getInstance()->getContentLanguage()->needsGenderDistinction() ) {
+ if ( !$services->getContentLanguage()->needsGenderDistinction() ) {
return false;
}
- $genderCache = MediaWikiServices::getInstance()->getGenderCache();
+ $genderCache = $services->getGenderCache();
$genderCache->doLinkBatch( $this->data, $this->caller );
return true;
public static function singleton() {
if ( self::$instance === null ) {
global $wgUseDatabaseMessages, $wgMsgCacheExpiry, $wgUseLocalMessageCache;
+ $services = MediaWikiServices::getInstance();
self::$instance = new self(
- MediaWikiServices::getInstance()->getMainWANObjectCache(),
+ $services->getMainWANObjectCache(),
wfGetMessageCacheStorage(),
$wgUseLocalMessageCache
- ? MediaWikiServices::getInstance()->getLocalServerObjectCache()
+ ? $services->getLocalServerObjectCache()
: new EmptyBagOStuff(),
$wgUseDatabaseMessages,
$wgMsgCacheExpiry,
- MediaWikiServices::getInstance()->getContentLanguage()
+ $services->getContentLanguage()
);
}
* @file
*/
+use MediaWiki\MediaWikiServices;
+
class OldChangesList extends ChangesList {
/**
}
// Log entries (old format) or log targets, and special pages
} elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
- list( $name, $htmlubpage ) = SpecialPageFactory::resolveAlias( $rc->mAttribs['rc_title'] );
+ list( $name, $htmlubpage ) = MediaWikiServices::getInstance()->getSpecialPageFactory()->
+ resolveAlias( $rc->mAttribs['rc_title'] );
if ( $name == 'Log' ) {
$this->insertLog( $html, $rc->getTitle(), $htmlubpage );
}
global $wgCategoryCollation;
$diffs = array_diff_assoc( $this->mCategories, $existing );
$arr = [];
+ $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+ $collation = Collation::singleton();
foreach ( $diffs as $name => $prefix ) {
$nt = Title::makeTitleSafe( NS_CATEGORY, $name );
- MediaWikiServices::getInstance()->getContentLanguage()->
- findVariantLink( $name, $nt, true );
+ $contLang->findVariantLink( $name, $nt, true );
$type = MWNamespace::getCategoryLinkType( $this->mTitle->getNamespace() );
# things are forced to sort as '*' or something, they'll
# sort properly in the category rather than in page_id
# order or such.
- $sortkey = Collation::singleton()->getSortKey(
- $this->mTitle->getCategorySortkey( $prefix ) );
+ $sortkey = $collation->getSortKey( $this->mTitle->getCategorySortkey( $prefix ) );
$arr[] = [
'cl_from' => $this->mId,
* Perform actual update for the entry
*/
public function doUpdate() {
- $config = MediaWikiServices::getInstance()->getSearchEngineConfig();
+ $services = MediaWikiServices::getInstance();
+ $config = $services->getSearchEngineConfig();
if ( $config->getConfig()->get( 'DisableSearchUpdate' ) || !$this->id ) {
return;
}
- $seFactory = MediaWikiServices::getInstance()->getSearchEngineFactory();
+ $seFactory = $services->getSearchEngineFactory();
foreach ( $config->getSearchTypes() as $type ) {
$search = $seFactory->create( $type );
if ( !$search->supports( 'search-update' ) ) {
* @return string
*/
public function updateText( $text, SearchEngine $se = null ) {
+ $services = MediaWikiServices::getInstance();
+ $contLang = $services->getContentLanguage();
# Language-specific strip/conversion
- $text = MediaWikiServices::getInstance()->getContentLanguage()->normalizeForSearch( $text );
- $se = $se ?: MediaWikiServices::getInstance()->newSearchEngine();
+ $text = $contLang->normalizeForSearch( $text );
+ $se = $se ?: $services->newSearchEngine();
$lc = $se->legalSearchChars() . '&#;';
# Strip HTML markup
$text = preg_replace( "/<\\/?\\s*[A-Za-z][^>]*?>/",
- ' ', MediaWikiServices::getInstance()->getContentLanguage()->lc( " " . $text . " " ) );
+ ' ', $contLang->lc( " " . $text . " " ) );
$text = preg_replace( "/(^|\\n)==\\s*([^\\n]+)\\s*==(\\s)/sD",
"\\1\\2 \\2 \\2\\3", $text ); # Emphasize headings
* @return string A stripped-down title string ready for the search index
*/
private function getNormalizedTitle( SearchEngine $search ) {
+ $contLang = MediaWikiServices::getInstance()->getContentLanguage();
$ns = $this->title->getNamespace();
$title = $this->title->getText();
$lc = $search->legalSearchChars() . '&#;';
- $t = MediaWikiServices::getInstance()->getContentLanguage()->normalizeForSearch( $title );
+ $t = $contLang->normalizeForSearch( $title );
$t = preg_replace( "/[^{$lc}]+/", ' ', $t );
- $t = MediaWikiServices::getInstance()->getContentLanguage()->lc( $t );
+ $t = $contLang->lc( $t );
# Handle 's, s'
$t = preg_replace( "/([{$lc}]+)'s( |$)/", "\\1 \\1's ", $t );
$applyMatchingFiles = function ( ResultWrapper $res, &$searchSet, &$finalFiles )
use ( $fileMatchesSearch, $flags )
{
+ $contLang = MediaWikiServices::getInstance()->getContentLanguage();
$info = $this->getInfo();
foreach ( $res as $row ) {
$file = $this->newFileFromRow( $row );
$dbKeysLook = [ strtr( $file->getName(), ' ', '_' ) ];
if ( !empty( $info['initialCapital'] ) ) {
// Search keys for "hi.png" and "Hi.png" should use the "Hi.png file"
- $dbKeysLook[] = MediaWikiServices::getInstance()->getContentLanguage()->
- lcfirst( $file->getName() );
+ $dbKeysLook[] = $contLang->lcfirst( $file->getName() );
}
foreach ( $dbKeysLook as $dbKey ) {
if ( isset( $searchSet[$dbKey] )
}
function purgeDescriptionPage() {
+ $services = MediaWikiServices::getInstance();
$url = $this->repo->getDescriptionRenderUrl(
- $this->getName(), MediaWikiServices::getInstance()->getContentLanguage()->getCode() );
+ $this->getName(), $services->getContentLanguage()->getCode() );
$key = $this->repo->getLocalCacheKey( 'RemoteFileDescription', 'url', md5( $url ) );
- MediaWikiServices::getInstance()->getMainWANObjectCache()->delete( $key );
+ $services->getMainWANObjectCache()->delete( $key );
}
/**
* 'help-messages' -- array of message keys/objects. As above, each item can
* be an array of msg key and then parameters.
* Overwrites 'help'.
+ * 'help-inline' -- Whether help text (defined using options above) will be shown
+ * inline after the input field, rather than in a popup.
+ * Defaults to true. Only used by OOUI form fields.
* 'notice' -- message text for a message to use as a notice in the field.
* Currently used by OOUI form fields only.
* 'notice-messages' -- array of message keys/objects to use for notice.
'errors' => $errors,
'notices' => $notices,
'infusable' => $infusable,
+ 'helpInline' => $this->isHelpInline(),
];
$preloadModules = false;
* @return bool
*/
protected function shouldInfuseOOUI() {
- // Always infuse fields with help text, since the interface for it is nicer with JS
- return $this->getHelpText() !== null;
+ // Always infuse fields with popup help text, since the interface for it is nicer with JS
+ return $this->getHelpText() !== null && !$this->isHelpInline();
}
/**
return $helptext;
}
+ /**
+ * Determine if the help text should be displayed inline.
+ *
+ * Only applies to OOUI forms.
+ *
+ * @since 1.31
+ * @return bool
+ */
+ public function isHelpInline() {
+ return isset( $this->mParams['help-inline'] ) ? $this->mParams['help-inline'] : true;
+ }
+
/**
* Determine form errors to display and their classes
* @since 1.20
[ 'addIndex', 'protected_titles', 'PRIMARY', 'patch-protected_titles-pk.sql' ],
[ 'addIndex', 'page_props', 'PRIMARY', 'patch-page_props-pk.sql' ],
[ 'addIndex', 'site_identifiers', 'PRIMARY', 'patch-site_identifiers-pk.sql' ],
+ [ 'addIndex', 'recentchanges', 'rc_this_oldid', 'patch-recentchanges-rc_this_oldid-index.sql' ],
];
}
'patch-protected_titles-fix-pk.sql' ],
[ 'renameIndex', 'site_identifiers', 'site_ids_type', 'PRIMARY', false,
'patch-site_identifiers-fix-pk.sql' ],
+ [ 'addIndex', 'recentchanges', 'rc_this_oldid', 'patch-recentchanges-rc_this_oldid-index.sql' ],
];
}
[ 'addField', 'change_tag', 'ct_tag_id', 'patch-change_tag-tag_id.sql' ],
[ 'addIndex', 'archive', 'ar_revid_uniq', 'patch-archive-ar_rev_id-unique.sql' ],
[ 'populateContentTables' ],
+ [ 'addIndex', 'recentchanges', 'rc_this_oldid', 'patch-recentchanges-rc_this_oldid-index.sql' ],
// KEEP THIS AT THE BOTTOM!!
[ 'doRebuildDuplicateFunction' ],
[ 'addIndex', 'interwiki', 'interwiki_pkey', 'patch-interwiki-pk.sql' ],
[ 'addIndex', 'protected_titles', 'protected_titles_pkey', 'patch-protected_titles-pk.sql' ],
[ 'addIndex', 'site_identifiers', 'site_identifiers_pkey', 'patch-site_identifiers-pk.sql' ],
+ [ 'addPgIndex', 'recentchanges', 'rc_this_oldid', '(rc_this_oldid)' ],
];
}
'patch-protected_titles-fix-pk.sql' ],
[ 'renameIndex', 'site_identifiers', 'site_ids_type', 'PRIMARY', false,
'patch-site_identifiers-fix-pk.sql' ],
+ [ 'addIndex', 'recentchanges', 'rc_this_oldid', 'patch-recentchanges-rc_this_oldid-index.sql' ],
];
}
self::ACTION_GOTO => self::PAREN_EXPRESSION,
],
],
+ // Property assignment - This is an object literal declaration.
+ // For example: `{ key: value }`
self::PROPERTY_ASSIGNMENT => [
self::TYPE_COLON => [
self::ACTION_GOTO => self::PROPERTY_EXPRESSION,
self::ACTION_GOTO => self::STATEMENT,
],
],
+ // Property expression - The value of a key in an object literal.
self::PROPERTY_EXPRESSION => [
self::TYPE_BRACE_OPEN => [
self::ACTION_PUSH => self::PROPERTY_EXPRESSION_OP,
self::ACTION_GOTO => self::PROPERTY_EXPRESSION,
],
self::TYPE_HOOK => [
- self::ACTION_GOTO => self::PROPERTY_EXPRESSION,
+ self::ACTION_PUSH => self::PROPERTY_EXPRESSION,
+ self::ACTION_GOTO => self::EXPRESSION_TERNARY,
],
self::TYPE_COMMA => [
self::ACTION_GOTO => self::PROPERTY_ASSIGNMENT,
--- /dev/null
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+namespace Wikimedia;
+
+/**
+ * Format a static PHP array to be written to a file
+ *
+ * @since 1.32
+ */
+class StaticArrayWriter {
+
+ /**
+ * @param string[] $data Array with string keys/values to export
+ * @param string $header
+ *
+ * @return string PHP code
+ */
+ public function create( array $data, $header = 'Automatically generated' ) {
+ $format = "\t%s => %s,\n";
+ $code = "<?php\n"
+ . "// " . implode( "\n// ", explode( "\n", $header ) ) . "\n"
+ . "return [\n";
+ foreach ( $data as $key => $value ) {
+ $code .= sprintf(
+ $format,
+ var_export( $key, true ),
+ var_export( $value, true )
+ );
+ }
+ $code .= "];\n";
+ return $code;
+ }
+}
--- /dev/null
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
+use Liuggio\StatsdClient\Entity\StatsdDataInterface;
+
+/**
+ * Proxy to prefix metric keys sent to a StatsdDataFactoryInterface
+ *
+ * @since 1.32
+ */
+class PrefixingStatsdDataFactoryProxy implements StatsdDataFactoryInterface {
+
+ /**
+ * @var string
+ */
+ private $prefix;
+
+ /**
+ * @var StatsdDataFactoryInterface
+ */
+ private $factory;
+
+ /**
+ * @param StatsdDataFactoryInterface $factory
+ * @param string $prefix
+ */
+ public function __construct(
+ StatsdDataFactoryInterface $factory,
+ $prefix
+ ) {
+ $this->factory = $factory;
+ $this->prefix = rtrim( $prefix, '.' );
+ }
+
+ /**
+ * @param string $key
+ * @return string
+ */
+ private function addPrefixToKey( $key ) {
+ return $this->prefix . '.' . $key;
+ }
+
+ public function timing( $key, $time ) {
+ return $this->factory->timing( $this->addPrefixToKey( $key ), $time );
+ }
+
+ public function gauge( $key, $value ) {
+ return $this->factory->gauge( $this->addPrefixToKey( $key ), $value );
+ }
+
+ public function set( $key, $value ) {
+ return $this->factory->set( $this->addPrefixToKey( $key ), $value );
+ }
+
+ public function increment( $key ) {
+ return $this->factory->increment( $this->addPrefixToKey( $key ) );
+ }
+
+ public function decrement( $key ) {
+ return $this->factory->decrement( $this->addPrefixToKey( $key ) );
+ }
+
+ public function updateCount( $key, $delta ) {
+ return $this->factory->updateCount( $this->addPrefixToKey( $key ), $delta );
+ }
+
+ public function produceStatsdData(
+ $key,
+ $value = 1,
+ $metric = StatsdDataInterface::STATSD_METRIC_COUNT
+ ) {
+ return $this->factory->produceStatsdData(
+ $this->addPrefixToKey( $key ),
+ $value,
+ $metric
+ );
+ }
+}
return $title->getPrefixedText();
}
- $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+ $services = MediaWikiServices::getInstance();
+ $linkRenderer = $services->getLinkRenderer();
if ( $title->isSpecialPage() ) {
- list( $name, $par ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
+ list( $name, $par ) = $services->getSpecialPageFactory()->
+ resolveAlias( $title->getDBkey() );
# Use the language name for log titles, rather than Log/X
if ( $name == 'Log' ) {
public function formatParametersForApi() {
$ret = parent::formatParametersForApi();
if ( isset( $ret['details'] ) && is_array( $ret['details'] ) ) {
+ $contLang = MediaWikiServices::getInstance()->getContentLanguage();
foreach ( $ret['details'] as &$detail ) {
if ( isset( $detail['expiry'] ) ) {
- $detail['expiry'] = MediaWikiServices::getInstance()->getContentLanguage()->
+ $detail['expiry'] = $contLang->
formatExpiry( $detail['expiry'], TS_ISO_8601, 'infinite' );
}
}
public function protectDescriptionLog( array $limit, array $expiry ) {
$protectDescriptionLog = '';
+ $dirMark = MediaWikiServices::getInstance()->getContentLanguage()->getDirMark();
foreach ( array_filter( $limit ) as $action => $restrictions ) {
$expiryText = $this->formatExpiry( $expiry[$action] );
$protectDescriptionLog .=
- MediaWikiServices::getInstance()->getContentLanguage()->getDirMark() .
+ $dirMark .
"[$action=$restrictions] ($expiryText)";
}
}
public static function special( $parser, $text ) {
- list( $page, $subpage ) = SpecialPageFactory::resolveAlias( $text );
+ list( $page, $subpage ) = MediaWikiServices::getInstance()->getSpecialPageFactory()->
+ resolveAlias( $text );
if ( $page ) {
$title = SpecialPage::getTitleFor( $page, $subpage );
return $title->getPrefixedText();
*/
use MediaWiki\Linker\LinkRenderer;
use MediaWiki\MediaWikiServices;
+use MediaWiki\Special\SpecialPageFactory;
use Wikimedia\ScopedCallback;
/**
/** @var ParserFactory */
private $factory;
+ /** @var SpecialPageFactory */
+ private $specialPageFactory;
+
/**
* @param array $conf See $wgParserConf documentation
* @param MagicWordFactory|null $magicWordFactory
* @param Language|null $contLang Content language
* @param ParserFactory|null $factory
* @param string|null $urlProtocols As returned from wfUrlProtocols()
+ * @param SpecialPageFactory|null $spFactory
*/
public function __construct(
array $conf = [], MagicWordFactory $magicWordFactory = null, Language $contLang = null,
- ParserFactory $factory = null, $urlProtocols = null
+ ParserFactory $factory = null, $urlProtocols = null, SpecialPageFactory $spFactory = null
) {
$this->mConf = $conf;
$this->mUrlProtocols = $urlProtocols ?? wfUrlProtocols();
}
wfDebug( __CLASS__ . ": using preprocessor: {$this->mPreprocessorClass}\n" );
+ $services = MediaWikiServices::getInstance();
$this->magicWordFactory = $magicWordFactory ??
- MediaWikiServices::getInstance()->getMagicWordFactory();
+ $services->getMagicWordFactory();
- $this->contLang = $contLang ?? MediaWikiServices::getInstance()->getContentLanguage();
+ $this->contLang = $contLang ?? $services->getContentLanguage();
- $this->factory = $factory ?? MediaWikiServices::getInstance()->getParserFactory();
+ $this->factory = $factory ?? $services->getParserFactory();
+ $this->specialPageFactory = $spFactory ?? $services->getSpecialPageFactory();
}
/**
&& $this->mOptions->getAllowSpecialInclusion()
&& $this->ot['html']
) {
- $specialPage = SpecialPageFactory::getPage( $title->getDBkey() );
+ $specialPage = $this->specialPageFactory->getPage( $title->getDBkey() );
// Pass the template arguments as URL parameters.
// "uselang" will have no effect since the Language object
// is forced to the one defined in ParserOptions.
$context->setUser( User::newFromName( '127.0.0.1', false ) );
}
$context->setLanguage( $this->mOptions->getUserLangObj() );
- $ret = SpecialPageFactory::capturePath(
- $title, $context, $this->getLinkRenderer() );
+ $ret = $this->specialPageFactory->capturePath( $title, $context, $this->getLinkRenderer() );
if ( $ret ) {
$text = $context->getOutput()->getHTML();
$this->mOutput->addOutputPageMetadata( $context->getOutput() );
<?php
-
/**
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* @ingroup Parser
*/
+use MediaWiki\Special\SpecialPageFactory;
+
/**
* @since 1.32
*/
/** @var string */
private $urlProtocols;
+ /** @var SpecialPageFactory */
+ private $specialPageFactory;
+
/**
* @param array $conf See $wgParserConf documentation
* @param MagicWordFactory $magicWordFactory
* @param Language $contLang Content language
* @param string $urlProtocols As returned from wfUrlProtocols()
+ * @param SpecialPageFactory $spFactory
* @since 1.32
*/
public function __construct(
- array $conf, MagicWordFactory $magicWordFactory, Language $contLang, $urlProtocols
+ array $conf, MagicWordFactory $magicWordFactory, Language $contLang, $urlProtocols,
+ SpecialPageFactory $spFactory
) {
$this->conf = $conf;
$this->magicWordFactory = $magicWordFactory;
$this->contLang = $contLang;
$this->urlProtocols = $urlProtocols;
+ $this->specialPageFactory = $spFactory;
}
/**
*/
public function create() : Parser {
return new Parser( $this->conf, $this->magicWordFactory, $this->contLang, $this,
- $this->urlProtocols );
+ $this->urlProtocols, $this->specialPageFactory );
}
}
*/
class ResourceLoader implements LoggerAwareInterface {
/** @var int */
- protected static $filterCacheVersion = 7;
+ protected static $filterCacheVersion = 8;
/** @var bool */
protected static $debugMode = null;
* @return SearchNearMatcher
*/
protected static function defaultNearMatcher() {
- $config = MediaWikiServices::getInstance()->getMainConfig();
- return MediaWikiServices::getInstance()->newSearchEngine()->getNearMatcher( $config );
+ $services = MediaWikiServices::getInstance();
+ $config = $services->getMainConfig();
+ return $services->newSearchEngine()->getNearMatcher( $config );
}
/**
if ( $title->isSpecialPage() ) {
$type = 'ns-special';
// T25315: provide a class based on the canonical special page name without subpages
- list( $canonicalName ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
+ list( $canonicalName ) = MediaWikiServices::getInstance()->getSpecialPageFactory()->
+ resolveAlias( $title->getDBkey() );
if ( $canonicalName ) {
$type .= ' ' . Sanitizer::escapeClass( "mw-special-$canonicalName" );
} else {
$notice = $msg->plain();
}
- $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+ $services = MediaWikiServices::getInstance();
+ $cache = $services->getMainWANObjectCache();
$parsed = $cache->getWithSetCallback(
// Use the extra hash appender to let eg SSL variants separately cache
// Key is verified with md5 hash of unparsed wikitext
}
);
- $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+ $contLang = $services->getContentLanguage();
return Html::rawElement(
'div',
[
# so it doesn't contain the original alias-with-subpage.
$origTitle = Title::newFromText( $request->getText( 'title' ) );
if ( $origTitle instanceof Title && $origTitle->isSpecialPage() ) {
- list( $spName, $spPar ) = SpecialPageFactory::resolveAlias( $origTitle->getText() );
+ list( $spName, $spPar ) =
+ MediaWikiServices::getInstance()->getSpecialPageFactory()->
+ resolveAlias( $origTitle->getText() );
$active = $spName == 'Contributions'
&& ( ( $spPar && $spPar == $this->username )
|| $request->getText( 'target' ) == $this->username );
* @return TitleValue
*/
public static function getTitleValueFor( $name, $subpage = false, $fragment = '' ) {
- $name = SpecialPageFactory::getLocalNameFor( $name, $subpage );
+ $name = MediaWikiServices::getInstance()->getSpecialPageFactory()->
+ getLocalNameFor( $name, $subpage );
return new TitleValue( NS_SPECIAL, $name, $fragment );
}
* @return Title|null Title object or null if the page doesn't exist
*/
public static function getSafeTitleFor( $name, $subpage = false ) {
- $name = SpecialPageFactory::getLocalNameFor( $name, $subpage );
+ $name = MediaWikiServices::getInstance()->getSpecialPageFactory()->
+ getLocalNameFor( $name, $subpage );
if ( $name ) {
return Title::makeTitleSafe( NS_SPECIAL, $name );
} else {
*/
function getLocalName() {
if ( !isset( $this->mLocalName ) ) {
- $this->mLocalName = SpecialPageFactory::getLocalNameFor( $this->mName );
+ $this->mLocalName = MediaWikiServices::getInstance()->getSpecialPageFactory()->
+ getLocalNameFor( $this->mName );
}
return $this->mLocalName;
* @ingroup SpecialPage
* @defgroup SpecialPage SpecialPage
*/
+
+namespace MediaWiki\Special;
+
+use Config;
+use Hooks;
+use IContextSource;
+use Language;
use MediaWiki\Linker\LinkRenderer;
-use MediaWiki\MediaWikiServices;
+use Profiler;
+use RequestContext;
+use SpecialPage;
+use Title;
+use User;
use Wikimedia\ObjectFactory;
/**
* SpecialPageFactory::$list. To remove a core static special page at runtime, use
* a SpecialPage_initList hook.
*
+ * @note There are two classes called SpecialPageFactory. You should use this first one, in
+ * namespace MediaWiki\Special, which is a service. \SpecialPageFactory is a deprecated collection
+ * of static methods that forwards to the global service.
+ *
* @ingroup SpecialPage
* @since 1.17
*/
class SpecialPageFactory {
/**
* List of special page names to the subclass of SpecialPage which handles them.
+ * @todo Make this a const when we drop HHVM support (T192166). It can still be private in PHP
+ * 7.1.
*/
private static $coreList = [
// Maintenance Reports
- 'BrokenRedirects' => BrokenRedirectsPage::class,
- 'Deadendpages' => DeadendPagesPage::class,
- 'DoubleRedirects' => DoubleRedirectsPage::class,
- 'Longpages' => LongPagesPage::class,
- 'Ancientpages' => AncientPagesPage::class,
- 'Lonelypages' => LonelyPagesPage::class,
- 'Fewestrevisions' => FewestrevisionsPage::class,
- 'Withoutinterwiki' => WithoutInterwikiPage::class,
- 'Protectedpages' => SpecialProtectedpages::class,
- 'Protectedtitles' => SpecialProtectedtitles::class,
- 'Shortpages' => ShortPagesPage::class,
- 'Uncategorizedcategories' => UncategorizedCategoriesPage::class,
- 'Uncategorizedimages' => UncategorizedImagesPage::class,
- 'Uncategorizedpages' => UncategorizedPagesPage::class,
- 'Uncategorizedtemplates' => UncategorizedTemplatesPage::class,
- 'Unusedcategories' => UnusedCategoriesPage::class,
- 'Unusedimages' => UnusedimagesPage::class,
- 'Unusedtemplates' => UnusedtemplatesPage::class,
- 'Unwatchedpages' => UnwatchedpagesPage::class,
- 'Wantedcategories' => WantedCategoriesPage::class,
- 'Wantedfiles' => WantedFilesPage::class,
- 'Wantedpages' => WantedPagesPage::class,
- 'Wantedtemplates' => WantedTemplatesPage::class,
+ 'BrokenRedirects' => \BrokenRedirectsPage::class,
+ 'Deadendpages' => \DeadendPagesPage::class,
+ 'DoubleRedirects' => \DoubleRedirectsPage::class,
+ 'Longpages' => \LongPagesPage::class,
+ 'Ancientpages' => \AncientPagesPage::class,
+ 'Lonelypages' => \LonelyPagesPage::class,
+ 'Fewestrevisions' => \FewestrevisionsPage::class,
+ 'Withoutinterwiki' => \WithoutInterwikiPage::class,
+ 'Protectedpages' => \SpecialProtectedpages::class,
+ 'Protectedtitles' => \SpecialProtectedtitles::class,
+ 'Shortpages' => \ShortPagesPage::class,
+ 'Uncategorizedcategories' => \UncategorizedCategoriesPage::class,
+ 'Uncategorizedimages' => \UncategorizedImagesPage::class,
+ 'Uncategorizedpages' => \UncategorizedPagesPage::class,
+ 'Uncategorizedtemplates' => \UncategorizedTemplatesPage::class,
+ 'Unusedcategories' => \UnusedCategoriesPage::class,
+ 'Unusedimages' => \UnusedimagesPage::class,
+ 'Unusedtemplates' => \UnusedtemplatesPage::class,
+ 'Unwatchedpages' => \UnwatchedpagesPage::class,
+ 'Wantedcategories' => \WantedCategoriesPage::class,
+ 'Wantedfiles' => \WantedFilesPage::class,
+ 'Wantedpages' => \WantedPagesPage::class,
+ 'Wantedtemplates' => \WantedTemplatesPage::class,
// List of pages
- 'Allpages' => SpecialAllPages::class,
- 'Prefixindex' => SpecialPrefixindex::class,
- 'Categories' => SpecialCategories::class,
- 'Listredirects' => ListredirectsPage::class,
- 'PagesWithProp' => SpecialPagesWithProp::class,
- 'TrackingCategories' => SpecialTrackingCategories::class,
+ 'Allpages' => \SpecialAllPages::class,
+ 'Prefixindex' => \SpecialPrefixindex::class,
+ 'Categories' => \SpecialCategories::class,
+ 'Listredirects' => \ListredirectsPage::class,
+ 'PagesWithProp' => \SpecialPagesWithProp::class,
+ 'TrackingCategories' => \SpecialTrackingCategories::class,
// Authentication
- 'Userlogin' => SpecialUserLogin::class,
- 'Userlogout' => SpecialUserLogout::class,
- 'CreateAccount' => SpecialCreateAccount::class,
- 'LinkAccounts' => SpecialLinkAccounts::class,
- 'UnlinkAccounts' => SpecialUnlinkAccounts::class,
- 'ChangeCredentials' => SpecialChangeCredentials::class,
- 'RemoveCredentials' => SpecialRemoveCredentials::class,
+ 'Userlogin' => \SpecialUserLogin::class,
+ 'Userlogout' => \SpecialUserLogout::class,
+ 'CreateAccount' => \SpecialCreateAccount::class,
+ 'LinkAccounts' => \SpecialLinkAccounts::class,
+ 'UnlinkAccounts' => \SpecialUnlinkAccounts::class,
+ 'ChangeCredentials' => \SpecialChangeCredentials::class,
+ 'RemoveCredentials' => \SpecialRemoveCredentials::class,
// Users and rights
- 'Activeusers' => SpecialActiveUsers::class,
- 'Block' => SpecialBlock::class,
- 'Unblock' => SpecialUnblock::class,
- 'BlockList' => SpecialBlockList::class,
- 'AutoblockList' => SpecialAutoblockList::class,
- 'ChangePassword' => SpecialChangePassword::class,
- 'BotPasswords' => SpecialBotPasswords::class,
- 'PasswordReset' => SpecialPasswordReset::class,
- 'DeletedContributions' => DeletedContributionsPage::class,
- 'Preferences' => SpecialPreferences::class,
- 'ResetTokens' => SpecialResetTokens::class,
- 'Contributions' => SpecialContributions::class,
- 'Listgrouprights' => SpecialListGroupRights::class,
- 'Listgrants' => SpecialListGrants::class,
- 'Listusers' => SpecialListUsers::class,
- 'Listadmins' => SpecialListAdmins::class,
- 'Listbots' => SpecialListBots::class,
- 'Userrights' => UserrightsPage::class,
- 'EditWatchlist' => SpecialEditWatchlist::class,
- 'PasswordPolicies' => SpecialPasswordPolicies::class,
+ 'Activeusers' => \SpecialActiveUsers::class,
+ 'Block' => \SpecialBlock::class,
+ 'Unblock' => \SpecialUnblock::class,
+ 'BlockList' => \SpecialBlockList::class,
+ 'AutoblockList' => \SpecialAutoblockList::class,
+ 'ChangePassword' => \SpecialChangePassword::class,
+ 'BotPasswords' => \SpecialBotPasswords::class,
+ 'PasswordReset' => \SpecialPasswordReset::class,
+ 'DeletedContributions' => \DeletedContributionsPage::class,
+ 'Preferences' => \SpecialPreferences::class,
+ 'ResetTokens' => \SpecialResetTokens::class,
+ 'Contributions' => \SpecialContributions::class,
+ 'Listgrouprights' => \SpecialListGroupRights::class,
+ 'Listgrants' => \SpecialListGrants::class,
+ 'Listusers' => \SpecialListUsers::class,
+ 'Listadmins' => \SpecialListAdmins::class,
+ 'Listbots' => \SpecialListBots::class,
+ 'Userrights' => \UserrightsPage::class,
+ 'EditWatchlist' => \SpecialEditWatchlist::class,
+ 'PasswordPolicies' => \SpecialPasswordPolicies::class,
// Recent changes and logs
- 'Newimages' => SpecialNewFiles::class,
- 'Log' => SpecialLog::class,
- 'Watchlist' => SpecialWatchlist::class,
- 'Newpages' => SpecialNewpages::class,
- 'Recentchanges' => SpecialRecentChanges::class,
- 'Recentchangeslinked' => SpecialRecentChangesLinked::class,
- 'Tags' => SpecialTags::class,
+ 'Newimages' => \SpecialNewFiles::class,
+ 'Log' => \SpecialLog::class,
+ 'Watchlist' => \SpecialWatchlist::class,
+ 'Newpages' => \SpecialNewpages::class,
+ 'Recentchanges' => \SpecialRecentChanges::class,
+ 'Recentchangeslinked' => \SpecialRecentChangesLinked::class,
+ 'Tags' => \SpecialTags::class,
// Media reports and uploads
- 'Listfiles' => SpecialListFiles::class,
- 'Filepath' => SpecialFilepath::class,
- 'MediaStatistics' => MediaStatisticsPage::class,
- 'MIMEsearch' => MIMEsearchPage::class,
- 'FileDuplicateSearch' => FileDuplicateSearchPage::class,
- 'Upload' => SpecialUpload::class,
- 'UploadStash' => SpecialUploadStash::class,
- 'ListDuplicatedFiles' => ListDuplicatedFilesPage::class,
+ 'Listfiles' => \SpecialListFiles::class,
+ 'Filepath' => \SpecialFilepath::class,
+ 'MediaStatistics' => \MediaStatisticsPage::class,
+ 'MIMEsearch' => \MIMEsearchPage::class,
+ 'FileDuplicateSearch' => \FileDuplicateSearchPage::class,
+ 'Upload' => \SpecialUpload::class,
+ 'UploadStash' => \SpecialUploadStash::class,
+ 'ListDuplicatedFiles' => \ListDuplicatedFilesPage::class,
// Data and tools
- 'ApiSandbox' => SpecialApiSandbox::class,
- 'Statistics' => SpecialStatistics::class,
- 'Allmessages' => SpecialAllMessages::class,
- 'Version' => SpecialVersion::class,
- 'Lockdb' => SpecialLockdb::class,
- 'Unlockdb' => SpecialUnlockdb::class,
+ 'ApiSandbox' => \SpecialApiSandbox::class,
+ 'Statistics' => \SpecialStatistics::class,
+ 'Allmessages' => \SpecialAllMessages::class,
+ 'Version' => \SpecialVersion::class,
+ 'Lockdb' => \SpecialLockdb::class,
+ 'Unlockdb' => \SpecialUnlockdb::class,
// Redirecting special pages
- 'LinkSearch' => LinkSearchPage::class,
- 'Randompage' => RandomPage::class,
- 'RandomInCategory' => SpecialRandomInCategory::class,
- 'Randomredirect' => SpecialRandomredirect::class,
- 'Randomrootpage' => SpecialRandomrootpage::class,
- 'GoToInterwiki' => SpecialGoToInterwiki::class,
+ 'LinkSearch' => \LinkSearchPage::class,
+ 'Randompage' => \RandomPage::class,
+ 'RandomInCategory' => \SpecialRandomInCategory::class,
+ 'Randomredirect' => \SpecialRandomredirect::class,
+ 'Randomrootpage' => \SpecialRandomrootpage::class,
+ 'GoToInterwiki' => \SpecialGoToInterwiki::class,
// High use pages
- 'Mostlinkedcategories' => MostlinkedCategoriesPage::class,
- 'Mostimages' => MostimagesPage::class,
- 'Mostinterwikis' => MostinterwikisPage::class,
- 'Mostlinked' => MostlinkedPage::class,
- 'Mostlinkedtemplates' => MostlinkedTemplatesPage::class,
- 'Mostcategories' => MostcategoriesPage::class,
- 'Mostrevisions' => MostrevisionsPage::class,
+ 'Mostlinkedcategories' => \MostlinkedCategoriesPage::class,
+ 'Mostimages' => \MostimagesPage::class,
+ 'Mostinterwikis' => \MostinterwikisPage::class,
+ 'Mostlinked' => \MostlinkedPage::class,
+ 'Mostlinkedtemplates' => \MostlinkedTemplatesPage::class,
+ 'Mostcategories' => \MostcategoriesPage::class,
+ 'Mostrevisions' => \MostrevisionsPage::class,
// Page tools
- 'ComparePages' => SpecialComparePages::class,
- 'Export' => SpecialExport::class,
- 'Import' => SpecialImport::class,
- 'Undelete' => SpecialUndelete::class,
- 'Whatlinkshere' => SpecialWhatLinksHere::class,
- 'MergeHistory' => SpecialMergeHistory::class,
- 'ExpandTemplates' => SpecialExpandTemplates::class,
+ 'ComparePages' => \SpecialComparePages::class,
+ 'Export' => \SpecialExport::class,
+ 'Import' => \SpecialImport::class,
+ 'Undelete' => \SpecialUndelete::class,
+ 'Whatlinkshere' => \SpecialWhatLinksHere::class,
+ 'MergeHistory' => \SpecialMergeHistory::class,
+ 'ExpandTemplates' => \SpecialExpandTemplates::class,
// Other
- 'Booksources' => SpecialBookSources::class,
+ 'Booksources' => \SpecialBookSources::class,
// Unlisted / redirects
- 'ApiHelp' => SpecialApiHelp::class,
- 'Blankpage' => SpecialBlankpage::class,
- 'Diff' => SpecialDiff::class,
- 'EditTags' => SpecialEditTags::class,
- 'Emailuser' => SpecialEmailUser::class,
- 'Movepage' => MovePageForm::class,
- 'Mycontributions' => SpecialMycontributions::class,
- 'MyLanguage' => SpecialMyLanguage::class,
- 'Mypage' => SpecialMypage::class,
- 'Mytalk' => SpecialMytalk::class,
- 'Myuploads' => SpecialMyuploads::class,
- 'AllMyUploads' => SpecialAllMyUploads::class,
- 'PermanentLink' => SpecialPermanentLink::class,
- 'Redirect' => SpecialRedirect::class,
- 'Revisiondelete' => SpecialRevisionDelete::class,
- 'RunJobs' => SpecialRunJobs::class,
- 'Specialpages' => SpecialSpecialpages::class,
- 'PageData' => SpecialPageData::class,
+ 'ApiHelp' => \SpecialApiHelp::class,
+ 'Blankpage' => \SpecialBlankpage::class,
+ 'Diff' => \SpecialDiff::class,
+ 'EditTags' => \SpecialEditTags::class,
+ 'Emailuser' => \SpecialEmailUser::class,
+ 'Movepage' => \MovePageForm::class,
+ 'Mycontributions' => \SpecialMycontributions::class,
+ 'MyLanguage' => \SpecialMyLanguage::class,
+ 'Mypage' => \SpecialMypage::class,
+ 'Mytalk' => \SpecialMytalk::class,
+ 'Myuploads' => \SpecialMyuploads::class,
+ 'AllMyUploads' => \SpecialAllMyUploads::class,
+ 'PermanentLink' => \SpecialPermanentLink::class,
+ 'Redirect' => \SpecialRedirect::class,
+ 'Revisiondelete' => \SpecialRevisionDelete::class,
+ 'RunJobs' => \SpecialRunJobs::class,
+ 'Specialpages' => \SpecialSpecialpages::class,
+ 'PageData' => \SpecialPageData::class,
];
- private static $list;
- private static $aliases;
+ /** @var array Special page name => class name */
+ private $list;
+
+ /** @var array */
+ private $aliases;
+
+ /** @var Config */
+ private $config;
+
+ /** @var Language */
+ private $contLang;
/**
- * Reset the internal list of special pages. Useful when changing $wgSpecialPages after
- * the internal list has already been initialized, e.g. during testing.
+ * @param Config $config
+ * @param Language $contLang
*/
- public static function resetList() {
- self::$list = null;
- self::$aliases = null;
+ public function __construct( Config $config, Language $contLang ) {
+ $this->config = $config;
+ $this->contLang = $contLang;
}
/**
*
* @return string[]
*/
- public static function getNames() {
- return array_keys( self::getPageList() );
+ public function getNames() : array {
+ return array_keys( $this->getPageList() );
}
/**
*
* @return array
*/
- private static function getPageList() {
- global $wgSpecialPages;
- global $wgDisableInternalSearch, $wgEmailAuthentication;
- global $wgEnableEmail, $wgEnableJavaScriptTest;
- global $wgPageLanguageUseDB, $wgContentHandlerUseDB;
-
- if ( !is_array( self::$list ) ) {
- self::$list = self::$coreList;
+ private function getPageList() : array {
+ if ( !is_array( $this->list ) ) {
+ $this->list = self::$coreList;
- if ( !$wgDisableInternalSearch ) {
- self::$list['Search'] = SpecialSearch::class;
+ if ( !$this->config->get( 'DisableInternalSearch' ) ) {
+ $this->list['Search'] = \SpecialSearch::class;
}
- if ( $wgEmailAuthentication ) {
- self::$list['Confirmemail'] = EmailConfirmation::class;
- self::$list['Invalidateemail'] = EmailInvalidation::class;
+ if ( $this->config->get( 'EmailAuthentication' ) ) {
+ $this->list['Confirmemail'] = \EmailConfirmation::class;
+ $this->list['Invalidateemail'] = \EmailInvalidation::class;
}
- if ( $wgEnableEmail ) {
- self::$list['ChangeEmail'] = SpecialChangeEmail::class;
+ if ( $this->config->get( 'EnableEmail' ) ) {
+ $this->list['ChangeEmail'] = \SpecialChangeEmail::class;
}
- if ( $wgEnableJavaScriptTest ) {
- self::$list['JavaScriptTest'] = SpecialJavaScriptTest::class;
+ if ( $this->config->get( 'EnableJavaScriptTest' ) ) {
+ $this->list['JavaScriptTest'] = \SpecialJavaScriptTest::class;
}
- if ( $wgPageLanguageUseDB ) {
- self::$list['PageLanguage'] = SpecialPageLanguage::class;
+ if ( $this->config->get( 'PageLanguageUseDB' ) ) {
+ $this->list['PageLanguage'] = \SpecialPageLanguage::class;
}
- if ( $wgContentHandlerUseDB ) {
- self::$list['ChangeContentModel'] = SpecialChangeContentModel::class;
+ if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
+ $this->list['ChangeContentModel'] = \SpecialChangeContentModel::class;
}
// Add extension special pages
- self::$list = array_merge( self::$list, $wgSpecialPages );
+ $this->list = array_merge( $this->list, $this->config->get( 'SpecialPages' ) );
// This hook can be used to disable unwanted core special pages
// or conditionally register special pages.
- Hooks::run( 'SpecialPage_initList', [ &self::$list ] );
+ Hooks::run( 'SpecialPage_initList', [ &$this->list ] );
}
- return self::$list;
+ return $this->list;
}
/**
* All registered special pages are guaranteed to map to themselves.
* @return array
*/
- private static function getAliasList() {
- $contLang = MediaWikiServices::getInstance()->getContentLanguage();
- if ( is_null( self::$aliases ) ) {
- $aliases = $contLang->getSpecialPageAliases();
- $pageList = self::getPageList();
+ private function getAliasList() : array {
+ if ( is_null( $this->aliases ) ) {
+ $aliases = $this->contLang->getSpecialPageAliases();
+ $pageList = $this->getPageList();
- self::$aliases = [];
+ $this->aliases = [];
$keepAlias = [];
// Force every canonical name to be an alias for itself.
foreach ( $pageList as $name => $stuff ) {
- $caseFoldedAlias = $contLang->caseFold( $name );
- self::$aliases[$caseFoldedAlias] = $name;
+ $caseFoldedAlias = $this->contLang->caseFold( $name );
+ $this->aliases[$caseFoldedAlias] = $name;
$keepAlias[$caseFoldedAlias] = 'canonical';
}
foreach ( $aliases as $realName => $aliasList ) {
$aliasList = array_values( $aliasList );
foreach ( $aliasList as $i => $alias ) {
- $caseFoldedAlias = $contLang->caseFold( $alias );
+ $caseFoldedAlias = $this->contLang->caseFold( $alias );
- if ( isset( self::$aliases[$caseFoldedAlias] ) &&
- $realName === self::$aliases[$caseFoldedAlias]
+ if ( isset( $this->aliases[$caseFoldedAlias] ) &&
+ $realName === $this->aliases[$caseFoldedAlias]
) {
// Ignore same-realName conflicts
continue;
}
if ( !isset( $keepAlias[$caseFoldedAlias] ) ) {
- self::$aliases[$caseFoldedAlias] = $realName;
+ $this->aliases[$caseFoldedAlias] = $realName;
if ( !$i ) {
$keepAlias[$caseFoldedAlias] = 'first';
}
} elseif ( !$i ) {
wfWarn( "First alias '$alias' for $realName conflicts with " .
"{$keepAlias[$caseFoldedAlias]} alias for " .
- self::$aliases[$caseFoldedAlias]
+ $this->aliases[$caseFoldedAlias]
);
}
}
}
}
- return self::$aliases;
+ return $this->aliases;
}
/**
* @param string $alias
* @return array Array( String, String|null ), or array( null, null ) if the page is invalid
*/
- public static function resolveAlias( $alias ) {
+ public function resolveAlias( $alias ) {
$bits = explode( '/', $alias, 2 );
- $caseFoldedAlias = MediaWikiServices::getInstance()->getContentLanguage()->
- caseFold( $bits[0] );
+ $caseFoldedAlias = $this->contLang->caseFold( $bits[0] );
$caseFoldedAlias = str_replace( ' ', '_', $caseFoldedAlias );
- $aliases = self::getAliasList();
+ $aliases = $this->getAliasList();
if ( isset( $aliases[$caseFoldedAlias] ) ) {
$name = $aliases[$caseFoldedAlias];
} else {
* @param string $name Name of a special page
* @return bool True if a special page exists with this name
*/
- public static function exists( $name ) {
- list( $title, /*...*/ ) = self::resolveAlias( $name );
+ public function exists( $name ) {
+ list( $title, /*...*/ ) = $this->resolveAlias( $name );
- $specialPageList = self::getPageList();
+ $specialPageList = $this->getPageList();
return isset( $specialPageList[$title] );
}
* @param string $name Special page name, may be localised and/or an alias
* @return SpecialPage|null SpecialPage object or null if the page doesn't exist
*/
- public static function getPage( $name ) {
- list( $realName, /*...*/ ) = self::resolveAlias( $name );
+ public function getPage( $name ) {
+ list( $realName, /*...*/ ) = $this->resolveAlias( $name );
- $specialPageList = self::getPageList();
+ $specialPageList = $this->getPageList();
if ( isset( $specialPageList[$realName] ) ) {
$rec = $specialPageList[$realName];
if ( is_callable( $rec ) ) {
// Use callback to instantiate the special page
- $page = call_user_func( $rec );
+ $page = $rec();
} elseif ( is_string( $rec ) ) {
$className = $rec;
$page = new $className;
* Return categorised listable special pages which are available
* for the current user, and everyone.
*
- * @param User|null $user User object to check permissions, $wgUser will be used
- * if not provided
+ * @param User $user User object to check permissions
+ * provided
* @return array ( string => Specialpage )
*/
- public static function getUsablePages( User $user = null ) {
+ public function getUsablePages( User $user ) : array {
$pages = [];
- if ( $user === null ) {
- global $wgUser;
- $user = $wgUser;
- }
- foreach ( self::getPageList() as $name => $rec ) {
- $page = self::getPage( $name );
+ foreach ( $this->getPageList() as $name => $rec ) {
+ $page = $this->getPage( $name );
if ( $page ) { // not null
$page->setContext( RequestContext::getMain() );
if ( $page->isListed()
*
* @return array ( string => Specialpage )
*/
- public static function getRegularPages() {
+ public function getRegularPages() : array {
$pages = [];
- foreach ( self::getPageList() as $name => $rec ) {
- $page = self::getPage( $name );
+ foreach ( $this->getPageList() as $name => $rec ) {
+ $page = $this->getPage( $name );
if ( $page && $page->isListed() && !$page->isRestricted() ) {
$pages[$name] = $page;
}
* Return categorised listable special pages which are available
* for the current user, but not for everyone
*
- * @param User|null $user User object to use or null for $wgUser
+ * @param User $user User object to use
* @return array ( string => Specialpage )
*/
- public static function getRestrictedPages( User $user = null ) {
+ public function getRestrictedPages( User $user ) : array {
$pages = [];
- if ( $user === null ) {
- global $wgUser;
- $user = $wgUser;
- }
- foreach ( self::getPageList() as $name => $rec ) {
- $page = self::getPage( $name );
+ foreach ( $this->getPageList() as $name => $rec ) {
+ $page = $this->getPage( $name );
if ( $page
&& $page->isListed()
&& $page->isRestricted()
*
* @return bool|Title
*/
- public static function executePath( Title &$title, IContextSource &$context, $including = false,
+ public function executePath( Title &$title, IContextSource &$context, $including = false,
LinkRenderer $linkRenderer = null
) {
// @todo FIXME: Redirects broken due to this call
$par = $bits[1];
}
- $page = self::getPage( $name );
+ $page = $this->getPage( $name );
if ( !$page ) {
$context->getOutput()->setArticleRelated( false );
$context->getOutput()->setRobotPolicy( 'noindex,nofollow' );
* @param LinkRenderer|null $linkRenderer (since 1.28)
* @return string HTML fragment
*/
- public static function capturePath(
+ public function capturePath(
Title $title, IContextSource $context, LinkRenderer $linkRenderer = null
) {
global $wgTitle, $wgOut, $wgRequest, $wgUser, $wgLang;
$main->setLanguage( $context->getLanguage() );
// The useful part
- $ret = self::executePath( $title, $context, true, $linkRenderer );
+ $ret = $this->executePath( $title, $context, true, $linkRenderer );
// Restore old globals and context
$wgTitle = $glob['title'];
* @param string|bool $subpage
* @return string
*/
- public static function getLocalNameFor( $name, $subpage = false ) {
- $contLang = MediaWikiServices::getInstance()->getContentLanguage();
- $aliases = $contLang->getSpecialPageAliases();
- $aliasList = self::getAliasList();
+ public function getLocalNameFor( $name, $subpage = false ) {
+ $aliases = $this->contLang->getSpecialPageAliases();
+ $aliasList = $this->getAliasList();
// Find the first alias that maps back to $name
if ( isset( $aliases[$name] ) ) {
$found = false;
foreach ( $aliases[$name] as $alias ) {
- $caseFoldedAlias = $contLang->caseFold( $alias );
+ $caseFoldedAlias = $this->contLang->caseFold( $alias );
$caseFoldedAlias = str_replace( ' ', '_', $caseFoldedAlias );
if ( isset( $aliasList[$caseFoldedAlias] ) &&
$aliasList[$caseFoldedAlias] === $name
if ( strcasecmp( $name, $n ) === 0 ) {
wfWarn( "Found alias defined for $n when searching for " .
"special page aliases for $name. Case mismatch?" );
- return self::getLocalNameFor( $n, $subpage );
+ return $this->getLocalNameFor( $n, $subpage );
}
}
}
$name = "$name/$subpage";
}
- return $contLang->ucfirst( $name );
+ return $this->contLang->ucfirst( $name );
}
/**
* @param string $alias
* @return Title|null Title or null if there is no such alias
*/
- public static function getTitleForAlias( $alias ) {
- list( $name, $subpage ) = self::resolveAlias( $alias );
+ public function getTitleForAlias( $alias ) {
+ list( $name, $subpage ) = $this->resolveAlias( $alias );
if ( $name != null ) {
return SpecialPage::getTitleFor( $name, $subpage );
} else {
--- /dev/null
+<?php
+/**
+ * Factory for handling the special page list and generating SpecialPage objects.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ * @defgroup SpecialPage SpecialPage
+ */
+
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
+
+// phpcs:disable MediaWiki.Files.ClassMatchesFilename.NotMatch
+/**
+ * Wrapper for backward compatibility for old callers that used static methods.
+ *
+ * @deprecated since 1.32, use the SpecialPageFactory service instead
+ */
+class SpecialPageFactory {
+ public static function getNames() : array {
+ return MediaWikiServices::getInstance()->getSpecialPageFactory()->getNames();
+ }
+
+ public static function resolveAlias( $alias ) : array {
+ return MediaWikiServices::getInstance()->getSpecialPageFactory()->resolveAlias( $alias );
+ }
+
+ public static function exists( $name ) {
+ return MediaWikiServices::getInstance()->getSpecialPageFactory()->exists( $name );
+ }
+
+ public static function getPage( $name ) {
+ return MediaWikiServices::getInstance()->getSpecialPageFactory()->getPage( $name );
+ }
+
+ public static function getUsablePages( User $user = null ) : array {
+ global $wgUser;
+ $user = $user ?? $wgUser;
+ return MediaWikiServices::getInstance()->getSpecialPageFactory()->getUsablePages( $user );
+ }
+
+ public static function getRegularPages() : array {
+ return MediaWikiServices::getInstance()->getSpecialPageFactory()->getRegularPages();
+ }
+
+ public static function getRestrictedPages( User $user = null ) : array {
+ global $wgUser;
+ $user = $user ?? $wgUser;
+ return MediaWikiServices::getInstance()->getSpecialPageFactory()->getRestrictedPages( $user );
+ }
+
+ public static function executePath( Title &$title, IContextSource &$context, $including = false,
+ LinkRenderer $linkRenderer = null
+ ) {
+ return MediaWikiServices::getInstance()->getSpecialPageFactory()
+ ->executePath( $title, $context, $including, $linkRenderer );
+ }
+
+ public static function capturePath(
+ Title $title, IContextSource $context, LinkRenderer $linkRenderer = null
+ ) {
+ return MediaWikiServices::getInstance()->getSpecialPageFactory()
+ ->capturePath( $title, $context, $linkRenderer );
+ }
+
+ public static function getLocalNameFor( $name, $subpage = false ) {
+ return MediaWikiServices::getInstance()->getSpecialPageFactory()
+ ->getLocalNameFor( $name, $subpage );
+ }
+
+ public static function getTitleForAlias( $alias ) {
+ return MediaWikiServices::getInstance()->getSpecialPageFactory()
+ ->getTitleForAlias( $alias );
+ }
+
+ /**
+ * No-op since 1.32, call overrideMwServices() instead
+ */
+ public static function resetList() {
+ }
+}
if ( count( $fields ) > 1 && $count > 30 ) {
$this->toc = Linker::tocIndent();
$tocLength = 0;
+ $contLang = MediaWikiServices::getInstance()->getContentLanguage();
foreach ( $fields as $data ) {
# strip out the 'ns' prefix from the section name:
$nsText = ( $ns == NS_MAIN )
? $this->msg( 'blanknamespace' )->escaped()
- : htmlspecialchars( MediaWikiServices::getInstance()->getContentLanguage()->
- getFormattedNsText( $ns ) );
+ : htmlspecialchars( $contLang->getFormattedNsText( $ns ) );
$this->toc .= Linker::tocLine( "editwatchlist-{$data['section']}", $nsText,
$this->getLanguage()->formatNum( ++$tocLength ), 1 ) . Linker::tocLineEnd();
}
/**
* @param Title $title
- * @return array
+ * @return string[]
*/
private function getPagesFromCategory( $title ) {
$maxPages = $this->getConfig()->get( 'ExportPagelistLimit' );
$pages = [];
foreach ( $res as $row ) {
- $n = $row->page_title;
- if ( $row->page_namespace ) {
- $ns = MediaWikiServices::getInstance()->getContentLanguage()->getNsText(
- $row->page_namespace );
- $n = $ns . ':' . $n;
- }
-
- $pages[] = $n;
+ $pages[] = Title::makeName( $row->page_title, $row->page_namespace );
}
return $pages;
/**
* @param int $nsindex
- * @return array
+ * @return string[]
*/
private function getPagesFromNamespace( $nsindex ) {
$maxPages = $this->getConfig()->get( 'ExportPagelistLimit' );
$pages = [];
foreach ( $res as $row ) {
- $n = $row->page_title;
-
- if ( $row->page_namespace ) {
- $ns = MediaWikiServices::getInstance()->getContentLanguage()->getNsText(
- $row->page_namespace );
- $n = $ns . ':' . $n;
- }
-
- $pages[] = $n;
+ $pages[] = Title::makeName( $row->page_title, $row->page_namespace );
}
return $pages;
);
$linkRenderer = $this->getLinkRenderer();
ksort( $namespaceProtection );
+ $validNamespaces = MWNamespace::getValidNamespaces();
+ $contLang = MediaWikiServices::getInstance()->getContentLanguage();
foreach ( $namespaceProtection as $namespace => $rights ) {
- if ( !in_array( $namespace, MWNamespace::getValidNamespaces() ) ) {
+ if ( !in_array( $namespace, $validNamespaces ) ) {
continue;
}
if ( $namespace == NS_MAIN ) {
$namespaceText = $this->msg( 'blanknamespace' )->text();
} else {
- $namespaceText = MediaWikiServices::getInstance()->getContentLanguage()->
- convertNamespace( $namespace );
+ $namespaceText = $contLang->convertNamespace( $namespace );
}
$out->addHTML(
*/
public function getSearchEngine() {
if ( $this->searchEngine === null ) {
+ $services = MediaWikiServices::getInstance();
$this->searchEngine = $this->searchEngineType ?
- MediaWikiServices::getInstance()->getSearchEngineFactory()->create( $this->searchEngineType ) :
- MediaWikiServices::getInstance()->newSearchEngine();
+ $services->getSearchEngineFactory()->create( $this->searchEngineType ) :
+ $services->newSearchEngine();
}
return $this->searchEngine;
* @ingroup SpecialPage
*/
+use MediaWiki\MediaWikiServices;
+
/**
* A special page that lists special pages
*
}
private function getPageGroups() {
- $pages = SpecialPageFactory::getUsablePages( $this->getUser() );
+ $pages = MediaWikiServices::getInstance()->getSpecialPageFactory()->
+ getUsablePages( $this->getUser() );
if ( !count( $pages ) ) {
# Yeah, that was pointless. Thanks for coming.
$dbr = $this->getDB();
$user = $this->getUser();
$output = $this->getOutput();
+ $services = MediaWikiServices::getInstance();
# Show a message about replica DB lag, if applicable
- $lag = MediaWikiServices::getInstance()->getDBLoadBalancer()->safeGetLag( $dbr );
+ $lag = $services->getDBLoadBalancer()->safeGetLag( $dbr );
if ( $lag > 0 ) {
$output->showLagWarning( $lag );
}
if ( $this->getConfig()->get( 'RCShowWatchingUsers' )
&& $user->getOption( 'shownumberswatching' )
) {
- $watchedItemStore = MediaWikiServices::getInstance()->getWatchedItemStore();
+ $watchedItemStore = $services->getWatchedItemStore();
}
$s = $list->beginRecentChangesList();
* @return string
*/
public function formatTitle( $namespace, $text, $fragment = '', $interwiki = '' ) {
- if ( $namespace !== false ) {
+ if ( $namespace !== 0 && $namespace !== false ) {
// Try to get a namespace name, but fallback
- // to empty string if it doesn't exist
+ // to empty string if it doesn't exist. And
+ // assume that ns 0 is the empty string.
try {
$nsName = $this->getNamespaceName( $namespace, $text );
} catch ( InvalidArgumentException $e ) {
$nsName = '';
}
-
- if ( $namespace !== 0 ) {
- $text = $nsName . ':' . $text;
- }
+ $text = $nsName . ':' . $text;
}
if ( $fragment !== '' ) {
* @return string $title->getText()
*/
public function getText( LinkTarget $title ) {
- return $this->formatTitle( false, $title->getText(), '' );
+ return $title->getText();
}
/**
/**
* Returns the title text formatted for display, without namespace of fragment.
*
- * @note Only minimal normalization is applied. Consider using TitleValue::getText() directly.
+ * @note Consider using LinkTarget::getText() directly, it's identical.
*
* @param LinkTarget $title The title to format
*
* @return string
*/
public function getText() {
- return str_replace( '_', ' ', $this->getDBkey() );
+ return str_replace( '_', ' ', $this->dbkey );
}
/**
protected function powerSearchBox( $term, array $opts ) {
$rows = [];
$activeNamespaces = $this->specialSearch->getNamespaces();
+ $langConverter = MediaWikiServices::getInstance()->getContentLanguage()->getConverter();
foreach ( $this->searchConfig->searchableNamespaces() as $namespace => $name ) {
$subject = MWNamespace::getSubject( $namespace );
if ( !isset( $rows[$subject] ) ) {
$rows[$subject] = "";
}
- $name = MediaWikiServices::getInstance()->getContentLanguage()->getConverter()->
- convertNamespace( $namespace );
+ $name = $langConverter->convertNamespace( $namespace );
if ( $name === '' ) {
$name = $this->specialSearch->msg( 'blanknamespace' )->text();
}
"resources/src/jquery.tablesorter",
"resources/src/jquery.tipsy",
"resources/src/jquery/jquery.color.js",
- "resources/src/jquery/jquery.expandableField.js",
"resources/src/jquery/jquery.highlightText.js",
"resources/src/jquery/jquery.mw-jump.js",
"resources/src/mediawiki.legacy",
"upload-form-label-infoform-date": "Дата",
"upload-form-label-own-work-message-generic-local": "Я пацьвярджаю, што загружаю гэты файл згодна з правіламі і ліцэнзійнай палітыкай {{GRAMMAR:родны|{{SITENAME}}}}.",
"upload-form-label-not-own-work-message-generic-local": "Калі вы ня можаце загрузіць файл у адпаведнасьці з правіламі {{GRAMMAR:родны|{{SITENAME}}}}, калі ласка, закрыйце гэтае акно і паспрабуйце іншы мэтад.",
- "upload-form-label-not-own-work-local-generic-local": "Вы таксама можаце паспрабаваць [[Special:Upload|старонку загрузкі па змоўчаньні]].",
+ "upload-form-label-not-own-work-local-generic-local": "Вы таксама можаце паспрабаваць [[Special:Upload|стандартную старонку загрузкі]].",
"upload-form-label-own-work-message-generic-foreign": "Я разумею, што загружаю гэты файл у агульнае сховішча. Я пацьвярджаю, што раблю гэта ў адпаведнасьці з умовамі выкарыстаньня і ліцэнзійнай палітыкай.",
"upload-form-label-not-own-work-message-generic-foreign": "Калі вы ня можаце загрузіць гэты файл паводле правілаў агульнага сховішча, калі ласка, закрыйце гэты дыялёг і паспрабуйце іншы мэтад.",
"upload-form-label-not-own-work-local-generic-foreign": "Вы можаце паспрабаваць скарыстацца [[Special:Upload|старонкай загрузкі {{GRAMMAR:родны|{{SITENAME}}}}]], калі гэты файл можна туды загрузіць згодна з правіламі.",
"ns-specialprotected": "No es poden modificar les pàgines especials.",
"titleprotected": "La creació d'aquesta pàgina està protegida per [[User:$1|$1]].\nEls seus motius han estat: <em>$2</em>.",
"filereadonlyerror": "No s'ha pogut modificar el fitxer «$1» perquè el repositori de fitxers «$2» està en mode només de lectura.\nL'administrador de sistema que l'ha blocat ha donat aquesta explicació: «$3».",
+ "invalidtitle": "Títol no vàlid",
"invalidtitle-knownnamespace": "El títol amb l'espai de noms «$2» i text «$3» no és vàlid",
"invalidtitle-unknownnamespace": "Títol no vàlid amb espai de noms desconegut de número «$1» i text «$2»",
"exception-nologin": "No has iniciat sessió",
"grouppage-bureaucrat": "{{ns:project}}:Buròcrates",
"grouppage-suppress": "{{ns:project}}:Supressors de Flow",
"right-read": "Llegir pàgines",
- "right-edit": "Modificar pàgines",
+ "right-edit": "Modifica les pàgines",
"right-createpage": "Crear pàgines (que no són de discussió)",
"right-createtalk": "Crear pàgines de discussió",
"right-createaccount": "Crear nous comptes",
"rcfilters-savedqueries-defaultlabel": "Filtres desats",
"rcfilters-savedqueries-rename": "Reanomena",
"rcfilters-savedqueries-setdefault": "Defineix per defecte",
+ "rcfilters-savedqueries-unsetdefault": "Suprimeix per defecte",
"rcfilters-savedqueries-remove": "Suprimeix",
"rcfilters-savedqueries-new-name-label": "Nom",
"rcfilters-savedqueries-new-name-placeholder": "Descriviu el propòsit del filtre",
"speciallogtitlelabel": "Objectiu (títol o «{{ns:user}}:nom d’usuari» per a un usuari):",
"log": "Registres",
"logeventslist-submit": "Mostra",
- "logeventslist-more-filters": "Més filtres:",
+ "logeventslist-more-filters": "Mostra els registres addicionals:",
+ "logeventslist-patrol-log": "Registre de patrulla",
"logeventslist-tag-log": "Registre d'etiquetes",
"all-logs-page": "Tots els registres públics",
"alllogstext": "Presentació combinada de tots els registres disponibles de {{SITENAME}}.\nPodeu reduir l'extensió seleccionant el tipus de registre, el nom d'usuari realitzador (distingeix entre majúscules i minúscules), o la pàgina objectiu (també en distingeix).",
"group-autoconfirmed-member": "{{GENDER:$1|автотӀелаьцна декъашхо}}",
"group-bot-member": "{{GENDER:$1|бот}}",
"group-sysop-member": "{{GENDER:$1|куьйгалхо}}",
+ "group-interface-admin-member": "{{GENDER:$1|интерфейсан куьйгалхой}}",
"group-bureaucrat-member": "{{GENDER:$1|бюрократхо}}",
"group-suppress-member": "{{GENDER:$1|ревизор}}",
"grouppage-user": "{{ns:project}}:Декъашхой",
"grouppage-autoconfirmed": "{{ns:project}}:АвтотӀелаьцна декъашхой",
"grouppage-bot": "{{ns:project}}:Боташ",
"grouppage-sysop": "{{ns:project}}:Куьйгалхой",
+ "grouppage-interface-admin": "{{ns:project}}:Интерфейсан куьйгалхой",
"grouppage-bureaucrat": "{{ns:project}}:Бюрократаш",
"grouppage-suppress": "{{ns:project}}:Ревизораш",
"right-read": "агӀонашка хьажар",
"protectedtitles-submit": "Гайта кортош",
"listusers": "Декъашхойн могӀам",
"listusers-editsonly": "Цхаъ мукъане а хийцам бина декъашхой гайта",
+ "listusers-temporarygroupsonly": "Декъашхойн тобана, ханна юкъа тоьхна декъашхой гайта",
"listusers-creationsort": "Кхоьллина хене хьаьжжина нисъяр",
"listusers-desc": "Харжа кӀезиг хиларца",
"usereditcount": "$1 {{PLURAL:$1|нисдар|нисдарш}}",
"filehist-filesize": "Velikost souboru",
"filehist-comment": "Komentář",
"imagelinks": "Využití souboru",
- "linkstoimage": "Na soubor {{PLURAL:$1|odkazuje tato stránka|odkazují tyto $1 stránky|odkazuje těchto $1 stránek}}:",
- "linkstoimage-more": "Na tento soubor {{PLURAL:$1|odkazuje více stránek|odkazují více než $1 stránky|odkazuje více než $1 stránek}}.\nNásledující seznam zobrazuje pouze {{PLURAL:$1|tu první|první $1|prvních $1}}.\nMůžete si prohlédnout [[Special:WhatLinksHere/$2|úplný seznam]].",
- "nolinkstoimage": "Na tento soubor neodkazuje žádná stránka.",
+ "linkstoimage": "Tento soubor {{PLURAL:$1|používá následující stránka|používají následující $1 stránky|používá následujících $1 stránek}}:",
+ "linkstoimage-more": "Tento soubor {{PLURAL:$1|používá více stránek|používají více než $1 stránky|používá více než $1 stránek}}.\nNásledující seznam zobrazuje pouze {{PLURAL:$1|tu první|první $1|prvních $1}}.\nMůžete si prohlédnout [[Special:WhatLinksHere/$2|úplný seznam]].",
+ "nolinkstoimage": "Tento soubor nepoužívá žádná stránka.",
"morelinkstoimage": "Zobrazit [[Special:WhatLinksHere/$1|další odkazy]] na tento soubor.",
"linkstoimage-redirect": "$1 (přesměrování) $2",
"duplicatesoffile": "{{PLURAL:$1|Následující soubor je duplikát|Následující $1 soubory jsou duplikáty|Následujících $1 souborů jsou duplikáty}} tohoto souboru ([[Special:FileDuplicateSearch/$2|podrobnosti]]):",
"suppressionlog": "Пытару журналĕ",
"history-title": "\"$1\" улшăннисен историйĕ",
"lineno": "$1-мĕш йĕрке:",
+ "compareselectedversions": "Суйланă версисене танлаштар",
"editundo": "унчченхи",
"searchresults": "Шыранă результачĕсем",
"searchresults-title": "\"$1\" шыраса тупни",
"protect-level-sysop": "Администраторсене кăна юрать",
"pagesize": "(байт)",
"restriction-edit": "Тӳрлет",
+ "restriction-move": "Ятне улăштарни",
"undelete": "Кăларса пăрахнă страницăсене пăх",
"viewdeletedpage": "Кăларса пăрахнă страницăсене пăх",
"undeleterevisions": "$1 {{PLURAL:$1|верси|версисене}} пăса утнă",
"block-log-flags-anononly": "анонимлă хутшăнакансем кăна",
"block-log-flags-nocreate": "хутшăнакансене регистрациленме чарнă",
"block-log-flags-noemail": "çыру яма чарнă",
- "move-page-legend": "Страницăна куçарнă",
+ "move-page": "$1 ятне улăштарни",
+ "move-page-legend": "Страницăна куçарни",
"newtitle": "Çĕнĕ ят",
"move-watch": "Ку страницăна сăнамаллисем шутне хуш",
"movepagebtn": "Страницăн ятне улăштар",
"specialpages-group-media": "Медиа-материалсемпе тултарăшсем",
"specialpages-group-users": "Хутшăнакансем тата правасем",
"specialpages-group-highuse": "Нумай усă куракан страницăсем",
+ "tag-filter": "[[Special:Tags|Тегсен]] фильтрĕ:",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Тег|Тегсем}}]]: $2)",
"tags-title": "Тегсем",
"compare-submit": "Танлаштар",
"tag-mw-new-redirect-description": "Feranrangen, diar en nei widjerfeerang iinracht.",
"tag-mw-removed-redirect": "Widjerfeerang wechnimen",
"tag-mw-changed-redirect-target": "Widjerfeerang feranert",
+ "tag-mw-blank": "Leesag maaget",
"tag-mw-rollback": "Turagsaat",
"tag-mw-undo": "Turag saaten",
"tags-title": "Kääntiaken",
"exbeforeblank": "պարունակությունը մինչև մաքրումը. «$1»",
"delete-confirm": "$1 ― ջնջում",
"delete-legend": "Ջնջում",
- "historywarning": "Զգուշացում. էջը, որը դուք պատրաստվում եք ջնջել ունի փոփոխությունների պատմություն։",
+ "historywarning": "Զգուշացում. էջը, որը դուք պատրաստվում եք ջնջել, ունի փոփոխությունների պատմություն։",
"historyaction-submit": "Ցուցադրել",
"confirmdeletetext": "Դուք պատրաստվում եք ընդմիշտ ջնջել էջը կամ պատկերը տվյալների բազայից իր փոփոխությունների պատմությամբ հանդերձ։ Խնդրում ենք հաստատել, որ դուք իրոք մտադրված եք դա անել, հասկանում եք դրա հետևանքները և գործում եք [[{{MediaWiki:Policy-url}}|կանոնադրության]] սահմաններում։",
"actioncomplete": "Գործողությունն ավարտված է",
"diff-paragraph-moved-toold": "文章は移動しました。クリックすると元の場所が開きます。",
"difference-missing-revision": "指定された{{PLURAL:$2|$2版}}の差分 ($1) が見つかりませんでした。\n\n通常、削除されたページの版への古い差分表示や固定リンクをたどった際に、このようなことが起きます。 \n詳細は[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]を参照してください。",
"searchresults": "検索結果",
+ "search-filter-title-prefix-reset": "すべてのページを検索",
"searchresults-title": "「$1」の検索結果",
"titlematches": "ページ名と一致",
"textmatches": "ページ本文と一致",
"group-autoconfirmed": "自動承認された利用者",
"group-bot": "ボット",
"group-sysop": "管理者",
+ "group-interface-admin": "インターフェース管理者",
"group-bureaucrat": "ビューロクラット",
"group-suppress": "秘匿者",
"group-all": "(全員)",
"group-autoconfirmed-member": "{{GENDER:$1|自動承認された利用者}}",
"group-bot-member": "{{GENDER:$1|ボット}}",
"group-sysop-member": "{{GENDER:$1|管理者}}",
+ "group-interface-admin-member": "{{GENDER:$1|インターフェース管理者}}",
"group-bureaucrat-member": "{{GENDER:$1|ビューロクラット}}",
"group-suppress-member": "{{GENDER:$1|秘匿者}}",
"grouppage-user": "{{ns:project}}:登録利用者",
"rcfilters-preference-label": "最近の更新の改善版を隠す",
"rcfilters-preference-help": "2017年のインターフェース更新およびそれ以降に追加された新しいツールを無効化します。",
"rcfilters-watchlist-preference-label": "ウォッチリストの改善版を隠す",
- "rcfilters-filter-showlinkedfrom-label": "リンク先ページの変更を表示する",
- "rcfilters-filter-showlinkedfrom-option-label": "選択されているページから<strong>リンクされているページ</strong>",
- "rcfilters-filter-showlinkedto-label": "リンク先ページの変更を表示する",
- "rcfilters-filter-showlinkedto-option-label": "選択されているページに<strong>リンクしているページ</strong>",
+ "rcfilters-filter-showlinkedfrom-label": "指定されたページのリンク先の変更を表示",
+ "rcfilters-filter-showlinkedfrom-option-label": "指定されたページから<strong>リンクされているページ</strong>",
+ "rcfilters-filter-showlinkedto-label": "指定されたページのリンク元の変更を表示",
+ "rcfilters-filter-showlinkedto-option-label": "指定されたページに<strong>リンクしているページ</strong>",
"rcfilters-target-page-placeholder": "ページ名(またはカテゴリ名)を入力",
"rcnotefrom": "以下は<strong>$3 $4</strong>以降の{{PLURAL:$5|更新です}} (最大 <strong>$1</strong> 件)。",
"rclistfromreset": "日時指定をリセット",
"recentchangeslinked-feed": "関連ページの更新状況",
"recentchangeslinked-toolbox": "関連ページの更新状況",
"recentchangeslinked-title": "「$1」と関連する変更",
- "recentchangeslinked-summary": "ã\83\9aã\83¼ã\82¸å\90\8dã\82\92å\85¥å\8a\9bã\81\99ã\82\8bã\81¨ã\80\81ã\83ªã\83³ã\82¯é\96¢ä¿\82 (ã\81\9dã\81®ã\83\9aã\83¼ã\82¸ã\81®ã\83ªã\83³ã\82¯å\85\88ã\82\82ã\81\97ã\81\8fã\81¯ä»\96ã\81®ã\83\9aã\83¼ã\82¸ã\81\8bã\82\89ã\81®ã\83ªã\83³ã\82¯) ã\81®æ\9c\80è¿\91ã\81®å¤\89æ\9b´ã\82\92調ã\81¹ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\99ã\80\82 (ä¸\8bä½\8dã\82«ã\83\86ã\82´ã\83ªã\82\92å\8f\82ç\85§ã\81\99ã\82\8bã\81«ã\81¯ã\80\81ã\82«ã\83\86ã\82´ã\83ª:ã\82«ã\83\86ã\82´ã\83ªå\90\8d (Category:Name of category) ã\82\92å\85¥å\8a\9b)。[[Special:Watchlist|自分のウォッチリスト]]にあるページの変更は<strong>太字</strong>で表示されます。",
+ "recentchangeslinked-summary": "ã\83ªã\83³ã\82¯å\85\83ã\81¾ã\81\9fã\81¯ã\83ªã\83³ã\82¯å\85\88ã\81®å¤\89æ\9b´ã\82\92表示ã\81\97ã\81\9fã\81\84ã\83\9aã\83¼ã\82¸å\90\8dã\82\92å\85¥å\8a\9bã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82(\"Category:ã\82«ã\83\86ã\82´ã\83ªå\90\8d\"ã\81¨å\85¥å\8a\9bã\81\99ã\82\8bã\81¨ä¸\8bä½\8dã\82«ã\83\86ã\82´ã\83ªã\82\92å\8f\82ç\85§ã\81§ã\81\8dã\81¾ã\81\99)。[[Special:Watchlist|自分のウォッチリスト]]にあるページの変更は<strong>太字</strong>で表示されます。",
"recentchangeslinked-page": "ページ名:",
"recentchangeslinked-to": "このページへのリンク元での変更の表示に切り替え",
"recentchanges-page-added-to-category": "[[:$1]]をカテゴリに追加",
"http-timed-out": "HTTP要求がタイムアウトしました。",
"http-curl-error": "URLからの取得に失敗しました: $1",
"http-bad-status": "HTTP リクエストで問題が発生しました: $1 $2",
+ "http-internal-error": "HTTP 内部エラー。",
"upload-curl-error6": "URLに到達できませんでした",
"upload-curl-error6-text": "指定したURLに到達できませんでした。\nURLが正しいものであり、ウェブサイトが稼働していることを再度確認してください。",
"upload-curl-error28": "アップロードのタイムアウト",
"protectedtitles-submit": "タイトルを表示",
"listusers": "利用者一覧",
"listusers-editsonly": "投稿記録のある利用者のみを表示",
- "listusers-temporarygroupsonly": "一時的にこの利用者グループに属している利用者のみを表示",
+ "listusers-temporarygroupsonly": "この利用者グループに一時的に属している利用者のみを表示",
"listusers-creationsort": "作成日順に並べ替え",
"listusers-desc": "降順に並べ替える",
"usereditcount": "$1 {{PLURAL:$1|回編集}}",
"pageid": "ページID $1",
"interfaceadmin-info": "$1\n\nサイト全体のCSS/JS/JSONの編集における許可は、最近まで<code>editinterface</code>権限と分けられていました。なぜこのエラーが表示されるのかわからない場合は、[[mw:MediaWiki_1.32/interface-admin]]をご覧ください。",
"rawhtml-notallowed": "<html>タグは通常ページ以外では使用できません。",
- "gotointerwiki": "{{SITENAME}}ã\81\8bã\82\89ä»\96ã\82µã\82¤ã\83\88ã\81¸ç§»å\8b\95ã\81\99る",
+ "gotointerwiki": "{{SITENAME}}ã\82\92é\9b¢ã\82\8cる",
"gotointerwiki-invalid": "指定したページは無効です。",
- "gotointerwiki-external": "あなたは{{SITENAME}}から別のウェブサイトである[[$2]]へ移動しようとしています。\n\n'''[$1 $1 へ移動する]'''",
+ "gotointerwiki-external": "\"{{SITENAME}}\"を離れ別のウェブサイト\"[[$2]]\"へ移動しようとしています。\n\n'''[$1 $1 へ移動する]'''",
"undelete-cantedit": "このページを編集する許可がないため復元できません。",
"undelete-cantcreate": "同名のページが存在せず、このページを作成する許可がないため復元できません。",
"pagedata-title": "ページ・データ",
"grouppage-bot": "{{ns:project}}:Ботлар",
"grouppage-sysop": "{{ns:project}}:Башчылар",
"right-read": "Сагьифа охув",
- "right-edit": "Сагьифа тюзлев",
+ "right-edit": "Сагьифаланы тюзлемек",
"right-writeapi": "Языв учун API къоллав",
"right-delete": "Сагьифа тайдырыв",
"newuserlogpage": "Янгы къоллавчу тизме гюнделиги",
"filehist-filesize": "Саплам гёлеми",
"filehist-comment": "Ёрум",
"imagelinks": "Сапламны къоллаву",
- "linkstoimage": "Шундан сонггъу {{PLURAL:$1|сагьифа|$1 сагьифалар}} бу сапламгъа байлангъан:",
- "linkstoimage-more": "$1 {{PLURAL:$1|Ñ\81агÑ\8cиÑ\84адан}} аÑ\80Ñ\82Ñ\8bкÑ\8a иг Ñ\81апламгÑ\8aа байланÑ\8bвлÑ\83.\nÐ\91Ñ\83 Ñ\82изме Ñ\8fнгÑ\8bз бÑ\83 Ñ\81апламгÑ\8aа {{PLURAL:$1|first page link|биÑ\80инÑ\87и $1 байланÑ\8bвлÑ\83 Ñ\81агÑ\8cиÑ\84аны}} гёрсете.\n[[Special:WhatLinksHere/$2|Толу тизме де]] бар.",
- "nolinkstoimage": "Ð\91Ñ\83 Ñ\81апламгÑ\8aа байлавлÑ\83 Ñ\81агÑ\8cиÑ\84алаÑ\80 Ñ\91кÑ\8aдÑ\83Ñ\80",
+ "linkstoimage": "Шундан сонгра гелеген {{PLURAL:$1|сагьифа|$1 сагьифалар}} бу сапламны къоллай:",
+ "linkstoimage-more": "$1 {{PLURAL:$1|Ñ\81агÑ\8cиÑ\84адан}} аÑ\80Ñ\82Ñ\8bкÑ\8a бÑ\83 Ñ\81апламнÑ\8b кÑ\8aоллай.\nÐ\91Ñ\83 Ñ\82изме Ñ\8fнгÑ\8bз бÑ\83 Ñ\81апламнÑ\8b кÑ\8aоллайгÑ\8aан {{PLURAL:$1|биÑ\80инÑ\87и Ñ\81агÑ\8cиÑ\84анÑ\8b|биÑ\80инÑ\87и $1 Ñ\81агÑ\8cиÑ\84аланы}} гёрсете.\n[[Special:WhatLinksHere/$2|Толу тизме де]] бар.",
+ "nolinkstoimage": "Ð\91Ñ\83 Ñ\81апламнÑ\8b кÑ\8aоллайгÑ\8aан Ñ\81агÑ\8cиÑ\84алаÑ\80 Ñ\91кÑ\8aд",
"linkstoimage-redirect": "$1 (саплам ёллав) $2",
"sharedupload-desc-here": "Бу саплам $1 проектдендир, ва башгъасында да къолланма бола. Ону [$2 тасвир сагьифасындан] маълюматы тюпде бериле.",
"filepage-nofile": "Булай аты булан саплам ёкъдур.",
"botpasswords": "ꯕꯣꯇ ꯄꯥꯁꯋꯔꯇ",
"botpasswords-summary": "<em>Bot passwords</em> allow access to a user account via the API without using the account's main login credentials. The user rights available when logged in with a bot password may be restricted.\n\nIf you don't know why you might want to do this, you should probably not do it. No one should ever ask you to generate one of these and give it to them.",
"botpasswords-disabled": "ꯕꯣꯇ ꯄꯥꯁꯋꯔꯇ ꯌꯥꯉꯟꯗꯕꯥ",
+ "botpasswords-label-appid": "ꯕꯣꯠ ꯃꯃꯤꯡ:",
"botpasswords-label-create": "ꯁꯥꯕꯥ",
"botpasswords-label-update": "ꯅꯧꯊꯣꯛꯍꯟꯕꯥ",
"botpasswords-label-cancel": "ꯀꯛꯊꯠꯄꯥ",
"resetpass-submit-cancel": "ꯀꯛꯊꯠꯄꯥ",
"resetpass-wrong-oldpass": "ꯃꯇꯝ ꯈꯔꯥꯒꯤ ꯑꯣꯏꯅꯥ ꯀꯔꯤꯝꯇꯥ ꯌꯥꯎꯗꯦ ꯅꯠꯇꯔꯒꯥ ꯍꯧꯖꯤꯧꯀꯤ ꯄꯥꯁꯋ꯭ꯔꯇ꯫\nꯅꯪꯅꯥ ꯄꯥꯁꯋꯑꯔꯇ ꯍꯥꯟꯅꯗꯒꯤ ꯍꯣꯡꯂꯝꯂꯅꯤ ꯅꯠꯇꯔꯒꯥ ꯍꯪꯒꯠꯂꯨ ꯉꯥꯏꯍꯥꯛꯀꯤ ꯑꯣꯏꯕꯥ ꯄꯥꯁꯋ꯭ꯔꯇ",
"resetpass-temp-password": "ꯉꯩꯍꯥꯛꯀꯤ ꯑꯣꯏꯕꯥ ꯄꯥꯁꯋ꯭ꯔꯇ",
+ "resetpass-expired": "ꯅꯪꯒꯤ ꯄꯥꯁꯋ꯭ꯔꯇ ꯁꯤ ꯌꯥꯗꯔꯦ ꯫ ꯆꯥꯟꯕꯤꯗꯨꯅ ꯑꯅꯧꯕ ꯱ ꯁꯦꯝꯃꯣ ꯂꯣꯒ ꯏꯟ ꯇꯧꯅꯕ ꯫",
"passwordreset": "ꯄꯥꯁꯋ꯭ꯇ ꯁꯦꯝꯗꯣꯛꯄꯥ",
"passwordreset-username": "ꯁꯤꯖꯤꯟꯅꯔꯤꯕꯥ ꯃꯃꯤꯡ",
"passwordreset-domain": "ꯗꯣꯃꯦꯟ",
"passwordreset-emailtext-ip": "Someone (probably you, from IP address $1) requested a reset of your\npassword for {{SITENAME}} ($4). The following user {{PLURAL:$3|account is|accounts are}}\nassociated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
"passwordreset-emailtext-user": "User $1 on {{SITENAME}} requested a reset of your password for {{SITENAME}}\n($4). The following user {{PLURAL:$3|account is|accounts are}} associated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
"passwordreset-emailelement": "$1 ꯁꯤꯖꯤꯟꯅꯔꯤꯕꯥ\n$2 ꯉꯩꯍꯥꯛꯀꯤ ꯑꯣꯏꯕꯥ ꯄꯥꯁꯋꯔꯇ",
+ "changeemail-oldemail": "ꯍꯧꯖꯤꯛꯀꯤ ꯏꯃꯦꯜ ꯑꯦꯗ꯭ꯔꯦꯁ:",
+ "changeemail-newemail": "ꯑꯅꯧꯕ ꯏꯃꯦꯜ ꯑꯦꯗ꯭ꯔꯦꯁ:",
"changeemail-none": "ꯑꯃꯥꯇꯥ ꯅꯠꯇꯦ",
"changeemail-password": "ꯅꯪꯒꯤ {{SITENAME}} ꯄꯥꯁꯋ꯭ꯔꯇ:",
"changeemail-submit": "ꯏ-ꯃꯦꯜ ꯍꯣꯡꯕꯥ",
"noarticletext-nopermission": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages, or <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>, but you do not have permission to create this page.",
"missing-revision": "The revision #$1 of the page named \"{{FULLPAGENAME}}\" does not exist.\n\nThis is usually caused by following an outdated history link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
"userpage-userdoesnotexist-view": "$1 ꯁꯤꯖꯤꯅꯅꯔꯤꯕ ꯑꯦꯀꯥꯎꯅ ꯁꯤ ꯃꯤꯡ ꯆꯟꯗꯔꯤ",
+ "updated": "(ꯅꯧꯊꯣꯛꯍꯟꯂꯦ)",
+ "note": "<ꯑꯀꯟꯕ>ꯏꯁꯤꯟꯒꯗꯕ:</ꯑꯀꯟꯕ>",
"continue-editing": "ꯁꯦꯝꯒꯠꯄꯒꯤ ꯃꯐꯝꯗꯨꯗꯥ ꯆꯠꯂꯨ",
"editing": "$1 ꯁꯦꯝꯒꯠꯂꯤ",
"creating": "Creating $1",
"search-redirect": "(redirect from $1)",
"search-section": "(section $1)",
"search-suggest": "$1 ꯁꯤꯔꯥ ꯅꯪꯅꯥ ꯍꯥꯏꯅꯤꯡꯂꯤꯕꯥꯁꯤ",
+ "search-interwiki-more-results": "ꯑꯍꯦꯟꯕ ꯐꯣꯜ ꯁꯤꯡ",
+ "search-relatedarticle": "ꯃꯔꯤꯂꯩꯅꯔꯦ",
+ "searchrelated": "ꯃꯔꯤꯂꯩꯅꯔꯦ",
"searchall": "ꯄꯨꯂꯞ",
"search-showingresults": "{{PLURAL:$4|Result <strong>$1</strong> of <strong>$3</strong>|Results <strong>$1 – $2</strong> of <strong>$3</strong>}}",
"search-nonefound": "ꯃꯁꯤꯒꯤ ꯐꯣꯜꯁꯤꯒꯥ ꯆꯥꯟꯅꯕꯥ ꯂꯩꯇꯦ",
+ "powersearch-togglelabel": "ꯑꯁꯣꯏ ꯑꯔꯥꯟ ꯌꯥꯎꯕꯔ ꯌꯦꯡꯕ:",
+ "powersearch-toggleall": "ꯄꯨꯂꯞ",
+ "powersearch-togglenone": "ꯌꯥꯎꯗꯦ",
+ "powersearch-remember": "ꯍꯥꯌꯦꯡꯋꯥꯏ ꯊꯤꯅꯕꯥ ꯀꯥꯎꯒꯅꯨ ꯍꯧꯖꯤꯛ ꯈꯟꯕꯥ",
+ "search-external": "ꯃꯄꯥꯟꯒ ꯃꯔꯤꯂꯩꯅꯕ ꯊꯤꯕ",
+ "preferences": "ꯀꯔꯝꯕ ꯈꯟꯒꯅꯤ",
"mypreferences": "Preferences",
+ "prefs-edits": "ꯁꯦꯝꯒꯠꯄꯒꯤ ꯃꯁꯤꯡ:",
"prefs-skin": "ꯎꯨꯟꯁꯥ",
+ "prefs-user-pages": "ꯁꯤꯖꯤꯟꯅꯔꯤꯕ ꯂꯃꯥꯏꯁꯤꯡ",
+ "prefs-personal": "ꯁꯤꯖꯤꯟꯅꯔꯤꯕ ꯄꯔꯣꯐꯥꯏꯜ",
+ "prefs-rc": "ꯍꯧꯖꯤꯛꯀꯤ ꯑꯣꯏꯕꯥ ꯑꯍꯣꯡꯕꯁꯤꯡ",
+ "prefs-watchlist": "ꯌꯦꯡꯂꯤꯕ ꯄꯥꯥꯔꯦꯡ",
+ "prefs-editwatchlist": "ꯌꯦꯡꯂꯤꯕ ꯄꯥꯔꯦꯡꯗꯨ ꯁꯦꯝꯒꯠꯂꯨ",
+ "prefs-editwatchlist-label": "ꯅꯪꯅ ꯌꯦꯡꯉꯤꯕ ꯄꯔꯦꯡꯗꯨ ꯏꯁꯤꯟꯗꯨꯅ ꯁꯦꯝꯒꯠꯂꯨ:",
+ "saveprefs": "ꯇꯨꯡꯁꯤꯟꯂꯕ",
+ "prefs-editing": "ꯁꯦꯝꯒꯠꯂꯤ",
+ "searchresultshead": "ꯊꯤꯕꯥ",
+ "stub-threshold-sample-link": "ꯃꯑꯣꯡ",
+ "stub-threshold-disabled": "ꯌꯥꯍꯟꯗꯔꯗ",
"timezonelegend": "ꯃꯇꯝꯒꯤ ꯃꯐꯝ:",
"localtime": "ꯂꯩꯀꯥꯏꯒꯤ ꯃꯇꯝ:",
"timezoneregion-africa": "ꯑꯐꯔꯤꯀ",
"default": "ꯑꯃꯥ ꯍꯦꯛꯇꯥ",
"prefs-files": "ꯐꯥꯏꯜꯁꯤꯡ",
"youremail": "ꯏꯃꯦꯜ:",
+ "yournick": "ꯑꯅꯧꯕ ꯈꯨꯠꯌꯦꯛ:",
"group-bot": "ꯕꯣꯇꯁꯤꯡ",
"group-sysop": "ꯆꯨꯞꯂꯤ ꯄꯥꯏꯔꯤꯕꯁꯤꯡ",
"grouppage-bot": "{{ns:project}}:ꯕꯣꯠꯁꯤꯡ",
"rcfilters-days-show-hours": "$1 {{PLURAL:$1|နာရီ|နာရီ}}",
"rcfilters-highlighted-filters-list": "မီးမောင်းထိုးပြထားသည်: $1",
"rcfilters-quickfilters": "သိမ်းထားသော စိစစ်မှုများ",
- "rcfilters-quickfilters-placeholder-title": "မည်သည့် filter မှ မသိမ်းရသေးပါ",
+ "rcfilters-quickfilters-placeholder-title": "မည်သည့် စိစစ်မှုမှ မသိမ်းရသေးပါ",
"rcfilters-savedqueries-defaultlabel": "သိမ်းထားသော စိစစ်မှုများ",
"rcfilters-savedqueries-rename": "အမည်ပြန်ပြောင်းရန်",
"rcfilters-savedqueries-setdefault": "မူလပုံသေအဖြစ် သတ်မှတ်ရန်",
"activeusers-noresult": "အသုံးပြုသူ မတွေ့ပါ။",
"activeusers-submit": "လတ်တလောအသုံးပြုသူများကို ပြသရန်",
"listgrouprights": "အသုံးပြုသူအုပ်စု အခွင့်အရေးများ",
- "listgrouprights-summary": "á\80¡á\80±á\80¬á\80\80á\80ºá\80\95á\80«á\80\90á\80á\80¯á\80·á\80\9eá\80\8aá\80º á\80¤á\80\9dá\80®á\80\80á\80®á\80\90á\80½á\80\84á\80º á\80\9eá\80\90á\80ºá\80\99á\80¾á\80\90á\80ºá\80\91á\80¬á\80¸á\80\9eá\80\8aá\80·á\80º á\80¡á\80\9eá\80¯á\80¶á\80¸á\80\95á\80¼á\80¯á\80\9eá\80°á\80¡á\80¯á\80\95á\80ºá\80\85á\80¯á\80\85á\80¬á\80\9bá\80\84á\80ºá\80¸á\80\99á\80»á\80¬á\80¸á\80\94á\80¾á\80\84á\80·á\80º á\80\9aá\80\84á\80ºá\80¸á\80\90á\80á\80¯á\80·á\81\8f á\80\86á\80\80á\80ºá\80\94á\80½á\80\9aá\80ºá\80\9eá\80±á\80¬ á\80¡á\80\81á\80½á\80\84á\80·á\80ºá\80¡á\80\9bá\80±á\80¸á\80\99á\80»á\80¬á\80¸á\80\96á\80¼á\80\85á\80ºá\80\9eá\80\8aá\80ºá\81\8b á\80\9eá\80®á\80¸á\80\9eá\80\94á\80·á\80ºá\80¡á\80\81á\80½á\80\84á\80·á\80ºá\80¡á\80\9bá\80±á\80¸á\80\99á\80»á\80¬á\80¸á\80¡á\80\90á\80½á\80\80á\80º [[{{MediaWiki:Listgrouprights-helppage}}|á\80\91á\80\95á\80ºá\80\86á\80±á\80¬á\80\84á\80ºá\80¸ á\80\9eá\80\90á\80\84á\80ºá\80¸á\80¡á\80\81á\80»á\80\84်အလက်]] ရှိနိုင်ပါသည်။",
+ "listgrouprights-summary": "á\80¡á\80±á\80¬á\80\80á\80ºá\80\95á\80«á\80\90á\80á\80¯á\80·á\80\9eá\80\8aá\80º á\80¤á\80\9dá\80®á\80\80á\80®á\80\90á\80½á\80\84á\80º á\80\9eá\80\90á\80ºá\80\99á\80¾á\80\90á\80ºá\80\91á\80¬á\80¸á\80\9eá\80\8aá\80·á\80º á\80¡á\80\9eá\80¯á\80¶á\80¸á\80\95á\80¼á\80¯á\80\9eá\80°á\80¡á\80¯á\80\95á\80ºá\80\85á\80¯á\80\85á\80¬á\80\9bá\80\84á\80ºá\80¸á\80\99á\80»á\80¬á\80¸á\80\94á\80¾á\80\84á\80·á\80º á\80\9aá\80\84á\80ºá\80¸á\80\90á\80á\80¯á\80·á\81\8f á\80\86á\80\80á\80ºá\80\94á\80½á\80\9aá\80ºá\80\9eá\80±á\80¬ á\80¡á\80\81á\80½á\80\84á\80·á\80ºá\80¡á\80\9bá\80±á\80¸á\80\99á\80»á\80¬á\80¸á\80\96á\80¼á\80\85á\80ºá\80\9eá\80\8aá\80ºá\81\8b á\80\9eá\80®á\80¸á\80\9eá\80\94á\80·á\80ºá\80¡á\80\81á\80½á\80\84á\80·á\80ºá\80¡á\80\9bá\80±á\80¸á\80\99á\80»á\80¬á\80¸á\80¡á\80\90á\80½á\80\80á\80º [[{{MediaWiki:Listgrouprights-helppage}}|á\80\91á\80\95á\80ºá\80\86á\80±á\80¬á\80\84á\80ºá\80¸ á\80\9eá\80\90á\80\84á\80ºá\80¸á\80¡á\80\81á\80»á\80\80်အလက်]] ရှိနိုင်ပါသည်။",
"listgrouprights-key": "မှတ်ချက်:\n* <span class=\"listgrouprights-granted\">အပ်နှင်းပြီး အခွင့်အရေး</span>\n* <span class=\"listgrouprights-revoked\">ရုတ်သိမ်းပြီး အခွင့်အရေး</span>",
"listgrouprights-group": "အုပ်စု",
"listgrouprights-rights": "အခွင့်အရေးများ",
"date-range-from": "Frå dato:",
"date-range-to": "Til dato:",
"randomrootpage": "Tilfeldig rotside",
+ "log-action-filter-newusers": "Type kontooppretting:",
"log-action-filter-rights": "Type endring av rettar:",
+ "log-action-filter-all": "Alle",
"log-action-filter-delete-delete_redir": "Overskriving av omdirigering",
"log-action-filter-delete-restore": "Attoppretting av side",
"log-action-filter-delete-revision": "Versjonssletting",
"log-action-filter-move-move": "Flytting utan overskriving av omdirigeringar",
"log-action-filter-move-move_redir": "Flytting med overskriving av omdirigeringar",
+ "log-action-filter-newusers-create": "Oppretting av anonym brukar",
+ "log-action-filter-newusers-create2": "Oppretting av registrert brukar",
+ "log-action-filter-newusers-autocreate": "Automatisk oppretting",
+ "log-action-filter-newusers-byemail": "Oppretting med passord sendt på e-post",
"log-action-filter-suppress-revision": "Versjonsundertrykking",
"authmanager-userdoesnotexist": "Brukarkontoen «$1» er ikkje oppretta.",
"authmanager-provider-temporarypassword": "Mellombels passord",
"redirectedfrom": "($1 ରୁ ଲେଉଟି ଆସିଛି)",
"redirectpagesub": "ପୁନଃପ୍ରେରଣ ପୃଷ୍ଠା",
"redirectto": "କେଉଁଠାକୁ ଲେଉଟାଣି:",
- "lastmodifiedat": "à¬\8fହି ପà\83ଷà\8dଠାà¬\9fି $1 ତାରିà¬\96 $2 ବେଳେ ବଦଳାଯାଇଥିଲା ।",
+ "lastmodifiedat": "à¬\8fହି ପà\83ଷà\8dଠାà¬\9fି $1 ଦିନ $2 ବେଳେ ବଦଳାଯାଇଥିଲା ।",
"viewcount": "ଏହି ପୃଷ୍ଠାଟି {{PLURAL:$1|ଥରେ|$1 ଥର}} ଖୋଲାଯାଇଛି ।",
"protectedpage": "କିଳାଯାଇଥିବା ପୃଷ୍ଠା",
"jumpto": "ସିଧାସଳଖ ଯିବେ",
"tooltip-feed-rss": "ଏହି ପୃଷ୍ଠାଟି ପାଇଁ RSS ଫିଡ଼",
"tooltip-feed-atom": "ଏହି ପୃଷ୍ଠାଟି ପାଇଁ ଆଟମ ଫିଡ଼",
"tooltip-t-contributions": "{{GENDER:$1|ଏହି ଇଉଜରଙ୍କର}} ଦ୍ଵାରା ହୋଇଥିବା ବଦଳ ତାଲିକା",
- "tooltip-t-emailuser": "ଏହି ସଭ୍ୟଙ୍କୁ ଇ-ମେଲଟିଏ ପଠାଇବେ",
+ "tooltip-t-emailuser": "ଏହି {{GENDER:$1|ସଭ୍ୟ}}ଙ୍କୁ ଇ-ମେଲଟିଏ ପଠାଇବେ",
"tooltip-t-upload": "ଫାଇଲ ଅପଲୋଡ଼ କରିବେ",
"tooltip-t-specialpages": "ବିଶେଷ ପୃଷ୍ଠାମାନଙ୍କର ଏକ ତାଲିକା",
"tooltip-t-print": "ଏହି ପୃଷ୍ଠାର ଛପାହୋଇପାରିବା ସଙ୍କଳନ",
"special-characters-title-endash": "en ଡ୍ୟାସ",
"special-characters-title-emdash": "em dash",
"special-characters-title-minus": "ମେନୁଗୁଡିକର ଚିହ୍ନ",
- "mw-widgets-titleinput-description-redirect": "$1କୁ ପୁନଃପ୍ରେରଣ କରିବେ"
+ "mw-widgets-titleinput-description-redirect": "$1କୁ ପୁନଃପ୍ରେରଣ କରିବେ",
+ "randomrootpage": "ଜାହିତାହି ମୁଳ ପୃଷ୍ଠା"
}
"ns-specialprotected": "Paginile din spațiul de nume {{ns:special}} nu pot fi editate.",
"titleprotected": "Acest titlu a fos protejat la creare de [[User:$1|$1]].\nMotivul invocat este <em>$2</em>.",
"filereadonlyerror": "Imposibil de modificat fișierul „$1”, deoarece depozitul de fișiere „$2” este în modul „doar citire”.\n\nAdministratorul de sistem care a efectuat blocarea a furnizat explicația: „$3”.",
+ "invalidtitle": "Titlu incorect",
"invalidtitle-knownnamespace": "Titlu invalid cu spațiul de nume „$2” și textul „$3”",
"invalidtitle-unknownnamespace": "Titlu invalid cu numărul spațiului de nume $1 necunoscut și textul „$2”",
"exception-nologin": "Neautentificat{{GENDER:||ă}}",
"group-autoconfirmed": "Utilizatori autoconfirmați",
"group-bot": "Roboți",
"group-sysop": "Administratori",
+ "group-interface-admin": "Administratori de interfață",
"group-bureaucrat": "Birocrați",
"group-suppress": "Suprimători",
"group-all": "(toți)",
"group-autoconfirmed-member": "{{GENDER:$1|utilizator autoconfirmat|utilizatoare autoconfirmată|utilizator autoconfirmat}}",
"group-bot-member": "{{GENDER:$1|robot}}",
"group-sysop-member": "{{GENDER:$1|administrator}}",
+ "group-interface-admin-member": "{{GENDER:$1|administrator de interfață}}",
"group-bureaucrat-member": "{{GENDER:$1|birocrat}}",
"group-suppress-member": "{{GENDER:$1|suprimător|suprimătoare}}",
"grouppage-user": "{{ns:project}}:Utilizatori",
"grouppage-autoconfirmed": "{{ns:project}}:Utilizator autoconfirmați",
"grouppage-bot": "{{ns:project}}:Boți",
"grouppage-sysop": "{{ns:project}}:Administratori",
+ "grouppage-interface-admin": "{{ns:project}}:Administratori de interfață",
"grouppage-bureaucrat": "{{ns:project}}:Birocrați",
"grouppage-suppress": "{{ns:project}}:Suprimători",
"right-read": "Citește pagini",
"right-editusercss": "Modifică fișierele CSS ale altor utilizatori",
"right-edituserjson": "Modifică fișierele JSON ale altor utilizatori",
"right-edituserjs": "Modifică fișierele JS ale altor utilizatori",
+ "right-editsitecss": "Editează CSS global",
+ "right-editsitejson": "Editează JSON global",
+ "right-editsitejs": "Editează JavaScript global",
"right-editmyusercss": "Modificați-vă propriile fișiere CSS",
"right-editmyuserjson": "Modificați-vă propriile fișiere JSON",
"right-editmyuserjs": "Modificați-vă propriile fișiere JavaScript",
"grant-createaccount": "Creare conturi",
"grant-createeditmovepage": "Creează, editează și redenumește pagini",
"grant-delete": "Șterge pagini, revizii și loguri",
- "grant-editinterface": "Editați spațiul de nume MediaWiki și CSS/JSON/JavaScript de utilizator",
+ "grant-editinterface": "Editați spațiul de nume MediaWiki și fișiere JSON globale/de utilizator",
"grant-editmycssjs": "Editați CSS/JSON/JavaScript ale contului dv.",
"grant-editmyoptions": "Modificați-vă preferințele de utilizator",
"grant-editmywatchlist": "Modificați-vă lista de pagini urmărite",
+ "grant-editsiteconfig": "Editează CSS/JS global și de utilizator",
"grant-editpage": "Editați pagini existente",
"grant-editprotected": "Editați pagini protejate",
"grant-highvolume": "Volum mare de editare",
"rcfilters-filter-humans-label": "Om (nu robot)",
"rcfilters-filter-humans-description": "Modificări făcute de oameni.",
"rcfilters-filtergroup-reviewstatus": "Statutul reviziei",
+ "rcfilters-filter-reviewstatus-unpatrolled-description": "Editări nemarcate, manual sau automat, ca patrulate.",
"rcfilters-filter-reviewstatus-unpatrolled-label": "Nepatrulate",
"rcfilters-filter-reviewstatus-manual-description": "Modificări marcate manual ca patrulate.",
"rcfilters-filter-reviewstatus-manual-label": "Patrulate manual",
+ "rcfilters-filter-reviewstatus-auto-description": "Editări făcute de utilizatori avansați a cărui muncă este marcată automat ca patrulată.",
"rcfilters-filter-reviewstatus-auto-label": "Patrulate automat",
"rcfilters-filtergroup-significance": "Semnificație",
"rcfilters-filter-minor-label": "Modificări minore",
"rcfilters-watchlist-showupdated": "Paginile care au fost modificate după ultima dumneavoastră vizită sunt afișate <strong>îngroșat</strong>.",
"rcfilters-preference-label": "Ascunde versiunea îmbunătățită a Schimbărilor Recente",
"rcfilters-preference-help": "Ascunde interfața schimbată în 2017 și toate uneltele adăugate de atunci.",
+ "rcfilters-watchlist-preference-label": "Ascunde versiunea îmbunătățită a liste de pagini urmărite",
"rcfilters-filter-showlinkedfrom-label": "Arată schimbările pe paginile către care există legături în",
"rcfilters-filter-showlinkedfrom-option-label": "<strong>Pages la care trimite</strong> pagina selectată",
"rcfilters-filter-showlinkedto-label": "Arată schimbările din paginile ce trimit la",
"uploadstash-zero-length": "Fișierul are lungime zero.",
"invalid-chunk-offset": "Decalaj de segment nevalid",
"img-auth-accessdenied": "Acces interzis",
- "img-auth-nopathinfo": "PATH_INFO lipsește.\nServerul dumneavoastră nu a fost setat pentru a trece aceste informații.\nS-ar putea să fie bazat pe CGI și să nu suporte img_auth.\nVedeți https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+ "img-auth-nopathinfo": "Lipsește informația privitoare la căi.\n\nServerul dumneavoastră trebuie să fie setat pentru a transmite variabilele REQUEST_URI sau PATH_INFO.\n\nDacă face deja acest lucru, încercați să activați $wgUserPathInfo.\n\nVedeți https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
"img-auth-notindir": "Adresa cerută nu este în directorul pentru încărcări configurat.",
"img-auth-badtitle": "Nu s-a putut construi un titlu valid din \"$1\".",
"img-auth-nologinnWL": "Nu sunteți autentificat și \"$1\" nu este pe lista albă.",
"filehist-filesize": "Mărimea fișierului",
"filehist-comment": "Comentariu",
"imagelinks": "Utilizarea fișierului",
- "linkstoimage": "{{PLURAL:$1|Următoarea pagină trimite|Următoarele $1 pagini trimit spre|Următoarele $1 de pagini trimit}} către acest fișier:",
- "linkstoimage-more": "Mai mult de $1 {{PLURAL:$1|pagină este legată|pagini sunt legate}} de acest fișier.\nUrmătoarea listă arată {{PLURAL:$1|prima legătură|primele $1 legături}} către acest fișier.\nO [[Special:WhatLinksHere/$2|listă completă]] este disponibilă.",
+ "linkstoimage": "{{PLURAL:$1|Următoarea pagină folosește|Următoarele $1 pagini folosesc |Următoarele $1 de pagini folosesc}} acest fișier:",
+ "linkstoimage-more": "Mai mult de $1 {{PLURAL:$1|pagină folosește|pagini folosesc}} acest fișier.\nUrmătoarea listă arată {{PLURAL:$1|prima legătură|primele $1 legături}} către acest fișier.\nEste disponibilă o [[Special:WhatLinksHere/$2|listă completă]].",
"nolinkstoimage": "Nicio pagină nu utilizează această imagine.",
"morelinkstoimage": "Vedeți [[Special:WhatLinksHere/$1|mai multe legături]] către acest fișier.",
"linkstoimage-redirect": "$1 (redirecționare de fișier) $2",
"cachedspecial-refresh-now": "Ultima versiune.",
"categories": "Categorii",
"categories-submit": "Afișează",
- "categoriespagetext": "{{PLURAL:$1|Următoarea categorie conține|Următoarele categorii conțin}} pagini sau fișiere.\n[[Special:UnusedCategories|Categoriile neutilizate]] nu apar aici.\nVedeți și [[Special:WantedCategories|categoriile dorite]].",
+ "categoriespagetext": "{{PLURAL:$1|Următoarea categorie|Următoarele categorii}} există pe wiki și ar putea sau nu să fie nefolosite.\nVedeți și [[Special:WantedCategories|categoriile dorite]].",
"categoriesfrom": "Arată categoriile pornind de la:",
"deletedcontributions": "Contribuții șterse",
"deletedcontributions-title": "Contribuții șterse",
"fix-double-redirects": "Actualizează toate redirecționările care trimit la titlul original",
"move-leave-redirect": "Lasă în urmă o redirecționare",
"protectedpagemovewarning": "'''Atenție:''' această pagină a fost protejată astfel încât poate fi redenumită doar de către administratori.\nUltima intrare în jurnal este afișată mai jos pentru referință:",
- "semiprotectedpagemovewarning": "'''Observație: această pagină a fost protejată, putând fi redenumiră doar de către utilizatorii înregistrați.'''\nUltima intrare în jurnal este afișată mai jos pentru referință:",
+ "semiprotectedpagemovewarning": "<strong>Notă:</strong> această pagină a fost protejată, putând fi redenumită doar de către utilizatorii autoconfirmați.\nUltima intrare în jurnal este afișată mai jos pentru referință:",
"move-over-sharedrepo": "[[:$1]] există deja într-un depozit partajat. Redenumirea fișierului la acest titlu va suprascrie fișierul partajat și îl va face inaccesibil.",
"file-exists-sharedrepo": "Numele ales al fișierului este deja în utilizare într-un depozit împărțit.\nAlegeți un alt nume.",
"export": "Exportare pagini",
"diff-form": "Diferențe",
"diff-form-submit": "Arată diferențele",
"permanentlink": "Legătură permanentă",
+ "permanentlink-revid": "ID versiune",
"permanentlink-submit": "Mergi la versiunea",
"dberr-problems": "Ne cerem scuze! Acest site întâmpină dificultăți tehnice.",
"dberr-again": "Așteptați câteva minute și încercați din nou.",
"htmlform-datetime-invalid": "Valoarea introdusă nu este recunoscută ca dată și timp. Încercați să folosiți formatul YYYY-MM-DD HH:MM:SS.",
"htmlform-date-toolow": "Valoarea introdusă este anterioară primei date permise, $1.",
"htmlform-date-toohigh": "Valoarea introdusă este posterioară ultimei date permise, $1.",
+ "htmlform-time-toolow": "Valoarea specificată este înainte de prima oră permisă, $1.",
+ "htmlform-time-toohigh": "Valoarea specificată este după ultima oră permisă, $1.",
+ "htmlform-datetime-toolow": "Valoarea specificată este înainte de prima dată permisă, $1.",
+ "htmlform-datetime-toohigh": "Valoarea specificată este după ultima dată permisă, $1.",
"htmlform-title-badnamespace": "[[:$1]] nu se află în spațiul de nume „{{ns:$2}}”.",
"htmlform-title-not-creatable": "„$1” este un titlu de pagină inutilizabil",
"htmlform-title-not-exists": "$1 nu există.",
"log-action-filter-protect-move_prot": "Mutarea protecției",
"log-action-filter-rights-rights": "Modificare manuală",
"log-action-filter-rights-autopromote": "Schimbare automată",
+ "log-action-filter-suppress-event": "Ștergere jurnal",
+ "log-action-filter-suppress-revision": "Ștergere versiune",
+ "log-action-filter-suppress-delete": "Ștergere pagină",
"log-action-filter-upload-upload": "Încărcare nouă",
"log-action-filter-upload-overwrite": "Reîncărcare",
+ "authmanager-create-disabled": "Crearea de conturi este dezactivată.",
+ "authmanager-create-from-login": "Pentru a crea contul, vă rugăm să completați câmpurile.",
"authmanager-authplugin-setpass-failed-title": "Schimbarea parolei a eșuat",
"authmanager-authplugin-setpass-bad-domain": "Domeniu invalid.",
"authmanager-userdoesnotexist": "Contul de utilizator „$1” nu este înregistrat.",
"edit-error-short": "Eroare: $1",
"edit-error-long": "Erori:\n\n$1",
"revid": "versiunea $1",
+ "pageid": "ID pagină $1",
+ "interfaceadmin-info": "$1\n\nPermisiunile pentru editarea de CSS/JS/JSON global au fost recent separate de dreptul <code>editinterface</code>. Dacă nu înțelegeți de ce primiți această eroare, vedeți [[mw:MediaWiki_1.32/interface-admin]].",
"rawhtml-notallowed": "Tagurile <html> nu pot fi folosite în afara paginilor normale.",
"gotointerwiki": "Se părăsește {{SITENAME}}",
"gotointerwiki-invalid": "Titlul specificat nu este valid.",
+ "gotointerwiki-external": "Sunteți pe cale să părăsiți {{SITENAME}} pentru a vizita [[$2]], care este un alt site.\n\n'''[$1 Continuați către $1]'''",
+ "undelete-cantedit": "Nu puteți recupera această pagină pentru că nu puteți să o editați.",
+ "undelete-cantcreate": "Nu puteți recupera această pagină deoarece nu există o pagină cu acest nume și nu aveți dreptul să o creați.",
"pagedata-title": "Datele paginii",
"pagedata-not-acceptable": "Niciun format corespunzător găsit. Tipuri MIME acceptate: $1",
"pagedata-bad-title": "Titlu invalid: $1.",
"passwordpolicies-policy-passwordcannotmatchusername": "Parola nu poate fi identică cu numele de utilizator",
"passwordpolicies-policy-passwordcannotmatchblacklist": "Parolele nu pot fi cele de pe lista neagră",
"passwordpolicies-policy-maximalpasswordlength": "Parola trebuie să aibă cel puțin $1 {{PLURAL:$1|caracter|caractere|de caractere}}.",
- "passwordpolicies-policy-passwordcannotbepopular": "Parola nu poate fi {{PLURAL:$1|o parolă populară|în lista celor $1 parole populare|în lista celor $1 de parole populare}}."
+ "passwordpolicies-policy-passwordcannotbepopular": "Parola nu poate fi {{PLURAL:$1|o parolă populară|în lista celor $1 parole populare|în lista celor $1 de parole populare}}.",
+ "easydeflate-invaliddeflate": "Conținutul oferit nu este comprimat corect"
}
"grouppage-bureaucrat": "{{ns:project}}:Byrokrati",
"grouppage-suppress": "{{ns:project}}:Dozor",
"right-read": "Čítať stránky",
- "right-edit": "Upravovať stránky (ktoré nie sú diskusné stránky)",
+ "right-edit": "Upravovať stránky",
"right-createpage": "Vytvárať stránky (ktoré nie sú diskusné stránky)",
"right-createtalk": "Vytvárať diskusné stránky",
"right-createaccount": "Vytvárať nové používateľské kontá",
"cannotdelete-title": "Не могу да обришем страницу „$1“",
"delete-hook-aborted": "Брисање је прекинула кука.\nНије дато никакво образложење.",
"no-null-revision": "Не могу да направим нову ништавну ревизију странице „$1“",
- "badtitle": "Ð\9dеиÑ\81пÑ\80аван наслов",
+ "badtitle": "Ð\9bоÑ\88 наслов",
"badtitletext": "Захтевани наслов странице је неважећи, празан или је погрешно повезан међујезички или међувики наслов.\nМожда садржи један или више знакова који се не могу користити у насловима.",
"title-invalid-empty": "Тражено име странице је празно или садржи само назив именског простора.",
"title-invalid-utf8": "Тражени назив странице садржи неважећи UTF-8 знак.",
"cannotcreateaccount-text": "Директно прављење налога није омогућено на овом викију.",
"yourdomainname": "Домен:",
"password-change-forbidden": "Не можете да промените лозинку на овом викију.",
- "externaldberror": "Ð\94оÑ\88ло Ñ\98е до гÑ\80еÑ\88ке пÑ\80и аÑ\83Ñ\82енÑ\82иÑ\84икаÑ\86иÑ\98и базе података или вам није дозвољено да ажурирате свој спољни налог.",
+ "externaldberror": "Ð\94оÑ\88ло Ñ\98е до гÑ\80еÑ\88ке пÑ\80и поÑ\82вÑ\80ди иденÑ\82иÑ\82еÑ\82а базе података или вам није дозвољено да ажурирате свој спољни налог.",
"login": "Пријави ме",
- "login-security": "Ð\92еÑ\80иÑ\84икаÑ\86иÑ\98а вашег индентитета",
+ "login-security": "Ð\9fоÑ\82вÑ\80да вашег индентитета",
"nav-login-createaccount": "Пријава/регистрација",
"logout": "Одјава",
"userlogout": "Одјава",
"notloggedin": "Нисте пријављени",
"userlogin-noaccount": "Немате налог?",
"userlogin-joinproject": "Придружите се пројекту {{SITENAME}}",
- "createaccount": "Ð\9eÑ\82воÑ\80и налог",
+ "createaccount": "Ð\9eÑ\82ваÑ\80аÑ\9aе налога",
"userlogin-resetpassword-link": "Заборавили сте лозинку?",
"userlogin-helplink2": "Помоћ при пријављивању",
"userlogin-loggedin": "Већ сте пријављени као {{GENDER:$1|$1}}.\nКористите доњи образац да бисте се пријавили као други корисник.",
- "userlogin-reauth": "Морате се поново пријавити да би верификовали да сте {{GENDER:$1|$1}}.",
+ "userlogin-reauth": "Морате да се поново пријавите да бисте потврдили да сте {{GENDER:$1|$1}}.",
"userlogin-createanother": "Отвори још један налог",
"createacct-emailrequired": "Имејл адреса",
"createacct-emailoptional": "Имејл адреса (опционално)",
"login-migrated-generic": "Ваш налог је мигриран и ваше корисничко више не постоји на овом викију.",
"loginlanguagelabel": "Језик: $1",
"suspicious-userlogout": "Ваш захтев за одјаву је одбијен јер је послат од стране неисправног прегледача или посредника.",
- "createacct-another-realname-tip": "Право име је необавезно.\nАко одаберете да га наведете, биће коришћено за приписивање вашег рада.",
+ "createacct-another-realname-tip": "Право име је опционално.\nАко одаберете да га наведете, биће коришћено за приписивање вашег рада.",
"pt-login": "Пријави ме",
"pt-login-button": "Пријави ме",
"pt-login-continue-button": "Настави пријављивање",
"php-mail-error-unknown": "Непозната грешка у функцији PHP mail().",
"user-mail-no-addy": "Покушали сте да пошаљете имејл без имејл адресе.",
"user-mail-no-body": "Покушано слање имејла с празним или неразумно кратким садржајем.",
- "changepassword": "Ð\9fÑ\80омени лозинкÑ\83",
+ "changepassword": "Ð\9fÑ\80омена лозинке",
"resetpass_announce": "Да бисте завршили пријаву, подесите нову лозинку овде.",
"resetpass_text": "<!-- Овде унесите текст -->",
"resetpass_header": "Промена лозинке налога",
"resetpass-abort-generic": "Промену лозинке је прекинуо додатак.",
"resetpass-expired": "Ваша лозинка је истекла. Поставите нову лозинку да бисте се пријавили.",
"resetpass-expired-soft": "Ваша лозинка је истекла и морате је променити. Поставите нову лозинку или кликните „{{int:authprovider-resetpass-skip-label}}“ да је промените касније.",
- "resetpass-validity-soft": "Ð\92аÑ\88а лозинка ниÑ\98е валидна: $1\n\nИзаберите нову одмах или кликните на „{{int:authprovider-resetpass-skip-label}}“ да је промените касније.",
+ "resetpass-validity-soft": "Ð\92аÑ\88а лозинка ниÑ\98е важеÑ\9bа: $1\n\nИзаберите нову одмах или кликните на „{{int:authprovider-resetpass-skip-label}}“ да је промените касније.",
"passwordreset": "Ресетовање лозинке",
"passwordreset-text-one": "Попуните овај образац да бисте добили привремену лозинку на имејл.",
"passwordreset-text-many": "{{PLURAL:$1|Испуните једно од поља како бисте добили привремену лозинку на имејл.}}",
"passwordreset-domain": "Домен:",
"passwordreset-email": "Имејл адреса:",
"passwordreset-emailtitle": "Детаљи налога на викију {{SITENAME}}",
- "passwordreset-emailtext-ip": "Ð\9dеко (веÑ\80оваÑ\82но Ð\92и, Ñ\81 IP адÑ\80еÑ\81е $1) заÑ\82Ñ\80ажио Ñ\98е Ñ\80еÑ\81еÑ\82оваÑ\9aе Ð\92аше \nлозинке за пројекат {{SITENAME}} ($4). Следећи кориснички {{PLURAL:$3|налог је повезан|налози су повезани}} \nс овом имејл адресом:\n\n$2\n\n{{PLURAL:$3|Ова привремена лозинка|Ове привремене лозинке}} ће истећи за {{PLURAL:$5|један дан|$5 дана}}.\nТребате да се пријавите и одаберите нову лозинку одмах. Ако је неко други направио овај \nзахтев или сте се сетили своје првобитне лозинке, а не \nжелите да је промените, можете да занемарите ову поруку и наставите да користите своју стару \nлозинку.",
+ "passwordreset-emailtext-ip": "Ð\9dеко (веÑ\80оваÑ\82но Ð\92и, Ñ\81 IP адÑ\80еÑ\81е $1) заÑ\82Ñ\80ажио Ñ\98е Ñ\80еÑ\81еÑ\82оваÑ\9aе ваше \nлозинке за пројекат {{SITENAME}} ($4). Следећи кориснички {{PLURAL:$3|налог је повезан|налози су повезани}} \nс овом имејл адресом:\n\n$2\n\n{{PLURAL:$3|Ова привремена лозинка|Ове привремене лозинке}} ће истећи за {{PLURAL:$5|један дан|$5 дана}}.\nТребате да се пријавите и одаберите нову лозинку одмах. Ако је неко други направио овај \nзахтев или сте се сетили своје првобитне лозинке, а не \nжелите да је промените, можете да занемарите ову поруку и наставите да користите своју стару \nлозинку.",
"passwordreset-emailtext-user": "{{GENDER:$1|Корисник је затражио|Корисница је затражила}} подсетник о подацима за пријаву на викију {{SITENAME}} ($4).\nСледећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом имејл адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку.",
"passwordreset-emailelement": "Корисничко име: \n$1\n\nПривремена лозинка: \n$2",
- "passwordreset-emailsentemail": "Ð\90ко Ñ\98е ово имеÑ\98л адÑ\80еÑ\81а повезана Ñ\81а Ð\92ашим налогом, подсетник о лозинци ће бити послат на имејл.",
+ "passwordreset-emailsentemail": "Ð\90ко Ñ\98е ово имеÑ\98л адÑ\80еÑ\81а повезана Ñ\81а вашим налогом, подсетник о лозинци ће бити послат на имејл.",
"passwordreset-emailsentusername": "Ако сте навели имејл адресу приликом регистрације, биће послат имејл за ресетовање лозинке.",
"passwordreset-nocaller": "Позивалац се мора навести",
"passwordreset-nosuchcaller": "Позивалац не постоји: $1",
"passwordreset-invalidemail": "Неисправна имејл адреса",
"passwordreset-nodata": "Корисничко име и адреса е-поште нису наведени",
"changeemail": "Промена или уклањање имејл адресе",
- "changeemail-header": "Ð\9fопÑ\83ниÑ\82е оваÑ\98 обÑ\80азаÑ\86 да би Ñ\81Ñ\82е пÑ\80оменили Ð\92аÑ\88Ñ\83 имеÑ\98л адÑ\80еÑ\81Ñ\83. Ð\90ко жели да Ñ\83Ñ\81кÑ\80аÑ\82иÑ\82е пÑ\80иÑ\81Ñ\82Ñ\83п било коÑ\98оÑ\98 имеÑ\98л адÑ\80еÑ\81и Ð\92ашем налогу, оставите празно поље за нову имејл адресу приликом попуњавање обрасца.",
+ "changeemail-header": "Ð\9fопÑ\83ниÑ\82е оваÑ\98 обÑ\80азаÑ\86 да би Ñ\81Ñ\82е пÑ\80оменили ваÑ\88Ñ\83 имеÑ\98л адÑ\80еÑ\81Ñ\83. Ð\90ко жели да Ñ\83Ñ\81кÑ\80аÑ\82иÑ\82е пÑ\80иÑ\81Ñ\82Ñ\83п било коÑ\98оÑ\98 имеÑ\98л адÑ\80еÑ\81и вашем налогу, оставите празно поље за нову имејл адресу приликом попуњавање обрасца.",
"changeemail-no-info": "Морате бити пријављени да бисте приступили овој страници.",
"changeemail-oldemail": "Актуелна имејл адреса:",
"changeemail-newemail": "Нова имејл адреса:",
"changeemail-none": "(ништа)",
- "changeemail-password": "Ваша лозинка:",
+ "changeemail-password": "Ваша лозинка за пројекат {{SITENAME}}:",
"changeemail-submit": "Промени имејл",
"changeemail-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
"changeemail-nochange": "Унесите другу имејл адресу.",
- "resettokens": "Ресетовање жетона",
+ "resettokens": "Ресетовање токена",
"resettokens-text": "Можете поново поставити жетоне који ће вам омогућити приступ одређеним приватним подацима повезаним са вашим налогом овде.\n\nТребали бисте то да урадите ако их мимо воље поделите с неким или ако је ваш налог угрожен.",
"resettokens-no-tokens": "Нема жетона за ресетовање.",
"resettokens-tokens": "Жетони:",
"image_tip": "Уграђивање датотеке",
"media_sample": "Пример.ogg",
"media_tip": "Веза",
- "sig_tip": "Ваш потпис с временском ознаком",
+ "sig_tip": "Ваш потпис са временском ознаком",
"hr_tip": "Водоравна линија (користите ретко)",
"summary": "Резиме:",
"subject": "Тема:",
"showpreview": "Прикажи претпреглед",
"showdiff": "Прикажи промене",
"blankarticle": "<strong>Упозорење:</strong> Страница коју правите је празна.\nАко још једном притиснете „$1”, страница ће бити направљена без икаквог садржаја.",
- "anoneditwarning": "<strong>УпозоÑ\80еÑ\9aе:</strong> Ð\9dиÑ\81Ñ\82е пÑ\80иÑ\98авÑ\99ени. Ð\90ко обÑ\98авиÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83, Ð\92аÑ\88а IP адÑ\80еÑ\81а Ñ\9bе биÑ\82и Ñ\98авно видÑ\99ива Ñ\83 Ñ\9aеноÑ\98 иÑ\81Ñ\82оÑ\80иÑ\98и измена и дÑ\80Ñ\83где. Ð\90ко Ñ\81е <strong>[$1 пÑ\80иÑ\98авиÑ\82е]</strong> или <strong>[$2 оÑ\82воÑ\80иÑ\82е налог]</strong>, поÑ\80ед оÑ\81Ñ\82алиÑ\85 погодноÑ\81Ñ\82и коÑ\98е добиÑ\98аÑ\82е Ð\92аÑ\88е измене Ñ\9bе биÑ\82и пÑ\80ипиÑ\81иване Ð\92ашем корисничком имену.",
- "anonpreviewwarning": "<em>Ð\9dиÑ\81Ñ\82е пÑ\80иÑ\98авÑ\99ени. Ð\90ко обÑ\98авиÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83, Ð\92аша IP адреса ће бити јавно видљива у њеној историји измена и другде.</em>",
- "missingsummary": "<strong>Ð\9fодÑ\81еÑ\82ник:</strong> ниÑ\81Ñ\82е навели Ñ\80езиме измене.\nÐ\90ко поново кликнеÑ\82е на â\80\9e$1â\80\9d, Ð\92аша измена ће бити сачувана без резимеа.",
+ "anoneditwarning": "<strong>УпозоÑ\80еÑ\9aе:</strong> Ð\9dиÑ\81Ñ\82е пÑ\80иÑ\98авÑ\99ени. Ð\90ко обÑ\98авиÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83, ваÑ\88а IP адÑ\80еÑ\81а Ñ\9bе биÑ\82и Ñ\98авно видÑ\99ива Ñ\83 Ñ\9aеноÑ\98 иÑ\81Ñ\82оÑ\80иÑ\98и измена и дÑ\80Ñ\83где. Ð\90ко Ñ\81е <strong>[$1 пÑ\80иÑ\98авиÑ\82е]</strong> или <strong>[$2 оÑ\82воÑ\80иÑ\82е налог]</strong>, поÑ\80ед оÑ\81Ñ\82алиÑ\85 погодноÑ\81Ñ\82и коÑ\98е добиÑ\98аÑ\82е ваÑ\88е измене Ñ\9bе биÑ\82и пÑ\80ипиÑ\81иване вашем корисничком имену.",
+ "anonpreviewwarning": "<em>Ð\9dиÑ\81Ñ\82е пÑ\80иÑ\98авÑ\99ени. Ð\90ко обÑ\98авиÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83, ваша IP адреса ће бити јавно видљива у њеној историји измена и другде.</em>",
+ "missingsummary": "<strong>Ð\9fодÑ\81еÑ\82ник:</strong> ниÑ\81Ñ\82е навели Ñ\80езиме измене.\nÐ\90ко поново кликнеÑ\82е на â\80\9e$1â\80\9d, ваша измена ће бити сачувана без резимеа.",
"selfredirect": "<strong>Упозорење:</strong> Преусмеравате ову страницу на њу саму.\nМожда вам је одредишна страница за преусмерење погрешна или уређујете погрешну страницу.\nАко још једном притиснете „$1”, преусмерење ће свеједно бити направљено.",
"missingcommenttext": "Молимо унесите коментар.",
"missingcommentheader": "<strong>Напомена:</strong> Нисте унели наслов теме овог коментара.\nАко поново кликнете на „$1”, измена ће бити сачувана без наслова.",
"previewnote": "<strong>Не заборавите да је ово само претпреглед.</strong>\nВаше промене још нису сачуване!",
"continue-editing": "Иди на уређивачки оквир",
"previewconflict": "Овај преглед осликава како ће изгледати текст у текстуалном оквиру.",
- "session_fail_preview": "Ð\98звиÑ\9aавамо Ñ\81е! Ð\9dиÑ\81мо могли да обÑ\80адимо Ð\92аÑ\88Ñ\83 изменÑ\83 због гÑ\83биÑ\82ка подаÑ\82ака Ñ\81еÑ\81иÑ\98е.\n\nÐ\9cожда Ñ\81Ñ\82е одÑ\98авÑ\99ени. <strong>Ð\9fÑ\80овеÑ\80иÑ\82е да ли Ñ\81Ñ\82е пÑ\80иÑ\98авÑ\99ени и покÑ\83Ñ\88аÑ\98Ñ\82е поново</strong>.\nÐ\90ко и даÑ\99е не Ñ\80ади, покÑ\83Ñ\88аÑ\98Ñ\82е да Ñ\81е [[Special:UserLogout|одÑ\98авиÑ\82е]] и поново пÑ\80иÑ\98авиÑ\82е, Ñ\82е пÑ\80овеÑ\80иÑ\82е да ли Ñ\81Ñ\83 на Ð\92ашем претраживачу дозвољени колачићи са овог сајта.",
- "session_fail_preview_html": "Ð\9dиÑ\81мо могли да обÑ\80адимо ваÑ\88Ñ\83 изменÑ\83 због гÑ\83биÑ\82ка подаÑ\82ака Ñ\81еÑ\81иÑ\98е.\n\n<em>Ð\91Ñ\83дÑ\83Ñ\9bи да Ñ\98е на овом викиÑ\98Ñ\83 омогÑ\83Ñ\9bен Ñ\83ноÑ\81 HTML ознака, пÑ\80еглед Ñ\98е Ñ\81акÑ\80ивен као меÑ\80а пÑ\80едоÑ\81Ñ\82Ñ\80ожноÑ\81Ñ\82и пÑ\80оÑ\82ив напада пÑ\80еко Ñ\98аваÑ\81кÑ\80ипÑ\82а.</em>\n\n<strong>Ð\90ко Ñ\81Ñ\82е покÑ\83Ñ\88али да напÑ\80авиÑ\82е пÑ\80авÑ\83 изменÑ\83, покÑ\83Ñ\88аÑ\98Ñ\82е поново.<strong>\nÐ\90ко и даÑ\99е не Ñ\80ади, покÑ\83Ñ\88аÑ\98Ñ\82е да Ñ\81е [[Special:UserLogout|одÑ\98авиÑ\82е]] и поново пÑ\80иÑ\98авиÑ\82е и пÑ\80овеÑ\80иÑ\82е да ли Ð\92аш прегледач дозвољава колачиће са овог сајта.",
+ "session_fail_preview": "Ð\98звиÑ\9aавамо Ñ\81е! Ð\9dиÑ\81мо могли да обÑ\80адимо ваÑ\88Ñ\83 изменÑ\83 због гÑ\83биÑ\82ка подаÑ\82ака Ñ\81еÑ\81иÑ\98е.\n\nÐ\9cожда Ñ\81Ñ\82е одÑ\98авÑ\99ени. <strong>Ð\9fÑ\80овеÑ\80иÑ\82е да ли Ñ\81Ñ\82е пÑ\80иÑ\98авÑ\99ени и покÑ\83Ñ\88аÑ\98Ñ\82е поново</strong>.\nÐ\90ко и даÑ\99е не Ñ\80ади, покÑ\83Ñ\88аÑ\98Ñ\82е да Ñ\81е [[Special:UserLogout|одÑ\98авиÑ\82е]] и поново пÑ\80иÑ\98авиÑ\82е, Ñ\82е пÑ\80овеÑ\80иÑ\82е да ли Ñ\81Ñ\83 на вашем претраживачу дозвољени колачићи са овог сајта.",
+ "session_fail_preview_html": "Ð\9dиÑ\81мо могли да обÑ\80адимо ваÑ\88Ñ\83 изменÑ\83 због гÑ\83биÑ\82ка подаÑ\82ака Ñ\81еÑ\81иÑ\98е.\n\n<em>Ð\91Ñ\83дÑ\83Ñ\9bи да Ñ\98е на овом викиÑ\98Ñ\83 омогÑ\83Ñ\9bен Ñ\83ноÑ\81 HTML ознака, пÑ\80еглед Ñ\98е Ñ\81акÑ\80ивен као меÑ\80а пÑ\80едоÑ\81Ñ\82Ñ\80ожноÑ\81Ñ\82и пÑ\80оÑ\82ив напада пÑ\80еко Ñ\98аваÑ\81кÑ\80ипÑ\82а.</em>\n\n<strong>Ð\90ко Ñ\81Ñ\82е покÑ\83Ñ\88али да напÑ\80авиÑ\82е пÑ\80авÑ\83 изменÑ\83, покÑ\83Ñ\88аÑ\98Ñ\82е поново.<strong>\nÐ\90ко и даÑ\99е не Ñ\80ади, покÑ\83Ñ\88аÑ\98Ñ\82е да Ñ\81е [[Special:UserLogout|одÑ\98авиÑ\82е]] и поново пÑ\80иÑ\98авиÑ\82е и пÑ\80овеÑ\80иÑ\82е да ли ваш прегледач дозвољава колачиће са овог сајта.",
"token_suffix_mismatch": "<strong>Ваша измена је одбачена јер је ваш прегледач убацио знакове интерпункције у новчић уређивања.</strong>\nТо се понекад догађа када се користи неисправан посредник.",
"edit_form_incomplete": "<strong>Неки делови обрасца за уређивање нису стигли до сервера. Проверите да ли су ваше измене непромењене и покушајте поново.</strong>",
"editing": "Уређујете $1",
"undo-summary-username-hidden": "Поништи измену $1 скривеног корисника",
"cantcreateaccount-text": "Отварање налога с ове IP адресе (<strong>$1</strong>) је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је <em>$2</em>",
"cantcreateaccount-range-text": "Отварање налога са IP адреса у распону <strong>$1</strong>, који укључује и вашу IP адресу (<strong>$4</strong>) је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је <em>$2</em>",
- "viewpagelogs": "Ð\9fогледаÑ\98 евиденције ове странице",
+ "viewpagelogs": "Ð\95виденције ове странице",
"nohistory": "Не постоји историја измена ове странице.",
"currentrev": "Актуелна ревизија",
"currentrev-asof": "Најновија ревизија на датум $2 у $3",
"revdelete-offender": "Аутор ревизије:",
"suppressionlog": "Евиденција сакривања",
"suppressionlogtext": "Испод се налази списак брисања и блокирања који укључује садржај сакривен од администратора. Погледајте [[Special:BlockList|списак блокирања]] за списак актуелних операција забрана и блокирања.",
- "mergehistory": "СпоÑ\98и иÑ\81Ñ\82оÑ\80иÑ\98е Ñ\81Ñ\82Ñ\80аниÑ\86а",
+ "mergehistory": "СпаÑ\98аÑ\9aе иÑ\81Ñ\82оÑ\80иÑ\98а Ñ\81Ñ\82Ñ\80аниÑ\86е",
"mergehistory-header": "Ова страница вам омогућава да спојите ревизије неке изворне странице у нову страницу.\nЗапамтите да ће ова промена оставити непромењен садржај историје странице.",
"mergehistory-box": "Споји измене две странице:",
"mergehistory-from": "Изворна страница:",
"diff-paragraph-moved-toold": "Пасус је премештен. Кликните да пређете на његово старо место.",
"difference-missing-revision": "{{PLURAL:$2|Једна ревизија|$2 ревизије}} од ове разлике ($1) не {{PLURAL:$2|постоји|постоје}}.\n\nОво се обично дешава када пратите застарелу везу до странице која је обрисана.\nДетаље можете да пронађете у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} евиденцији брисања].",
"searchresults": "Резултати претраге",
+ "search-filter-title-prefix-reset": "Претражи све странице",
"searchresults-title": "Резултати претраге за „$1“",
"titlematches": "Наслов странице одговара",
"textmatches": "Текст странице одговара",
"userrights-invalid-expiry": "Време истицања групе „$1“ није валидно.",
"userrights-expiry-in-past": "Време истицања групе „$1“ је прошло.",
"userrights-cannot-shorten-expiry": "Не можете убрзати истек чланства у групи „$1”. Само корисници са дозволом да додају или уклоне ову групу могу да убрзају рок истека.",
- "userrights-conflict": "СÑ\83коб пÑ\80омена коÑ\80иÑ\81ниÑ\87киÑ\85 пÑ\80ава! Ð\9cолимо пÑ\80овеÑ\80иÑ\82е ваÑ\88е измене.",
+ "userrights-conflict": "СÑ\83коб пÑ\80омена коÑ\80иÑ\81ниÑ\87киÑ\85 пÑ\80ава! Ð\9fÑ\80егледаÑ\98Ñ\82е и пÑ\80овеÑ\80иÑ\82е ваÑ\88е пÑ\80омене.",
"group": "Група:",
"group-user": "Корисници",
"group-autoconfirmed": "Аутоматски потврђени корисници",
"grant-group-high-volume": "Извршавање великог броја радњи",
"grant-group-customization": "Прилагођавање и подешавања",
"grant-group-administration": "Извршавање административних радњи",
- "grant-group-private-information": "Ð\9fÑ\80иÑ\81Ñ\82Ñ\83паÑ\9aе Ð\92аÑ\88им лиÑ\87ним подацима",
+ "grant-group-private-information": "Ð\9fÑ\80иÑ\81Ñ\82Ñ\83паÑ\9aе ваÑ\88им пÑ\80иваÑ\82ним подацима",
"grant-group-other": "Разне активности",
"grant-blockusers": "Блокирање и деблокирање корисника",
"grant-createaccount": "Отварање налога",
"grant-delete": "Брисање страница, ревизија и уноса у евиденцијама",
"grant-editinterface": "Уређивање Медијавики именског простора и корисничких CSS/JSON/Јаваскрипт страница",
"grant-editmycssjs": "Уређивање вашег CSS/JSON/Јаваскрипта",
- "grant-editmyoptions": "УÑ\80еÑ\92иваÑ\9aе Ð\92аÑ\88их подешавања",
+ "grant-editmyoptions": "УÑ\80еÑ\92иваÑ\9aе ваÑ\88иÑ\85 коÑ\80иÑ\81ниÑ\87ких подешавања",
"grant-editmywatchlist": "Уређивање вашег списка надгледања",
"grant-editpage": "Уређивање постојећих страница",
"grant-editprotected": "Уређивање заштићених страница",
"rcfilters-state-message-fullcoverage": "Одабир свих филтера у групи је исто као и одабир ниједног, тако да овај филтер нема ефекта. Група укључује: $1",
"rcfilters-filtergroup-authorship": "Ауторство доприноса",
"rcfilters-filter-editsbyself-label": "Ваше промене",
- "rcfilters-filter-editsbyself-description": "Ваши доприноси.",
+ "rcfilters-filter-editsbyself-description": "Ваши сопствени доприноси.",
"rcfilters-filter-editsbyother-label": "Промене других",
- "rcfilters-filter-editsbyother-description": "Све измене оÑ\81им Ð\92аших.",
+ "rcfilters-filter-editsbyother-description": "Све измене оÑ\81им ваших.",
"rcfilters-filtergroup-userExpLevel": "Корисничка регистрација и искуство",
"rcfilters-filter-user-experience-level-registered-label": "Регистровани",
"rcfilters-filter-user-experience-level-registered-description": "Пријављени уредници.",
"rcfilters-filter-major-description": "Измене које нису означене као мање.",
"rcfilters-filtergroup-watchlist": "Странице на списку надгледања",
"rcfilters-filter-watchlist-watched-label": "На списку надгледања",
- "rcfilters-filter-watchlist-watched-description": "Ð\9fÑ\80омене Ñ\81Ñ\82Ñ\80аниÑ\86а на Ð\92ашем списку надгледања.",
+ "rcfilters-filter-watchlist-watched-description": "Ð\9fÑ\80омене Ñ\81Ñ\82Ñ\80аниÑ\86а на вашем списку надгледања.",
"rcfilters-filter-watchlist-watchednew-label": "Нове промене на списку надгледања",
"rcfilters-filter-watchlist-watchednew-description": "Промене страница на списку надгледања које нисте посетили од када су промене направљене.",
"rcfilters-filter-watchlist-notwatched-label": "Није на списку надгледања",
- "rcfilters-filter-watchlist-notwatched-description": "Све оÑ\81им пÑ\80омена Ñ\81Ñ\82Ñ\80аниÑ\86а на Ð\92ашем списку надгледања.",
+ "rcfilters-filter-watchlist-notwatched-description": "Све оÑ\81им пÑ\80омена Ñ\81Ñ\82Ñ\80аниÑ\86а на вашем списку надгледања.",
"rcfilters-filtergroup-watchlistactivity": "Стање на списку надгледања",
"rcfilters-filter-watchlistactivity-unseen-label": "Непогледане промене",
"rcfilters-filter-watchlistactivity-unseen-description": "Промене на страницама које нисте посетили од када су промене направљене.",
"rcfilters-filter-showlinkedto-option-label": "<strong>Странице ка којима воде везе са</strong> изабране странице",
"rcfilters-target-page-placeholder": "Унесите име странице (или категорије)",
"rcnotefrom": "Испод {{PLURAL:$5|је промена|су промене}} од <strong>$3, $4</strong> (до <strong>$1</strong> приказано).",
- "rclistfromreset": "РеÑ\81еÑ\82Ñ\83Ñ\98 одабир датума",
+ "rclistfromreset": "РеÑ\81еÑ\82Ñ\83Ñ\98 избор датума",
"rclistfrom": "Прикажи нове промене почев од $2, $3",
"rcshowhideminor": "$1 мање измене",
"rcshowhideminor-show": "Прикажи",
"rc-enhanced-expand": "Прикажи детаље",
"rc-enhanced-hide": "Сакриј детаље",
"rc-old-title": "првобитно направљено као „$1“",
- "recentchangeslinked": "СÑ\80одне измене",
+ "recentchangeslinked": "СÑ\80одне пÑ\80омене",
"recentchangeslinked-feed": "Сродне измене",
"recentchangeslinked-toolbox": "Сродне измене",
"recentchangeslinked-title": "Измене сродне са „$1“",
"badfilename": "Име датотеке је промењено у „$1“.",
"filetype-mime-mismatch": "Проширење датотеке „.$1“ не одговара препознатом типу MIME датотеке ($2).",
"filetype-badmime": "Датотеке MIME типа „$1“ није дозвољено слати.",
- "filetype-bad-ie-mime": "Ð\9eва даÑ\82оÑ\82ека Ñ\81е не може поÑ\81лаÑ\82и заÑ\82о Ñ\88Ñ\82о би Ñ\98е Ð\98нÑ\82еÑ\80неÑ\82 екÑ\81плоÑ\80еÑ\80 Ñ\83оÑ\87ио као â\80\9e$1â\80\9c, а Ñ\82о Ñ\98е забÑ\80аÑ\9aена и опаÑ\81на вÑ\80Ñ\81Ñ\82а датотеке.",
- "filetype-unwanted-type": "„.$1“ је непожељна врста датотеке.\n{{PLURAL:$3|Пожељна врста датотеке је|Пожељне врсте датотека су}} $2.",
- "filetype-banned-type": "'''„.$1“''' {{PLURAL:$4|је забрањена врста датотеке|су забрањене врсте датотека}}.\n{{PLURAL:$3|Дозвољена врста датотеке је|Дозвољене врсте датотека су}} $2.",
+ "filetype-bad-ie-mime": "Ð\9dе могÑ\83 да оÑ\82пÑ\80емим овÑ\83 даÑ\82оÑ\82екÑ\83 Ñ\98еÑ\80 би Ñ\98е Ð\98нÑ\82еÑ\80неÑ\82 екÑ\81плоÑ\80еÑ\80 пÑ\80епознао као â\80\9e$1â\80\9c, Ñ\88Ñ\82о Ñ\98е недозвоÑ\99ен и поÑ\82енÑ\86иÑ\98ално опаÑ\81ан Ñ\82ип датотеке.",
+ "filetype-unwanted-type": "<strong>„.$1“</strong> је непожељан тип датотеке.\n{{PLURAL:$3|Пожељан тип датотеке је|Пожељни типови датотека су}} $2.",
+ "filetype-banned-type": "<strong>„.$1“</strong> {{PLURAL:$4|није допуштен тип датотеке|нису допуштени типови датотека}}.\n{{PLURAL:$3|Дозвољен тип датотеке је|Дозвољени типови датотека су}} $2.",
"filetype-missing": "Ова датотека нема проширење (нпр. „.jpg“).",
"empty-file": "Послата датотека је празна.",
"file-too-large": "Послата датотека је превелика.",
"filename-tooshort": "Назив датотеке је прекратак.",
- "filetype-banned": "Ð\92Ñ\80Ñ\81Ñ\82а даÑ\82оÑ\82еке Ñ\98е забÑ\80аÑ\9aена.",
+ "filetype-banned": "Ð\9eваÑ\98 Ñ\82ип даÑ\82оÑ\82еке Ñ\98е забÑ\80аÑ\9aен.",
"verification-error": "Ова датотека није прошла проверу.",
"hookaborted": "Измену коју сте покушали да направите је прекинуо додатак.",
"illegal-filename": "Назив датотеке је забрањен.",
"zip-wrong-format": "Наведена датотека није формата ZIP.",
"zip-bad": "Датотека је оштећена или је нечитљива ZIP датотека.\nБезбедносна провера не може да се изврши како треба.",
"zip-unsupported": "Датотека је формата ZIP који користи могућности које не подржава Медијавики.\nБезбедносна провера не може да се изврши како треба.",
- "uploadstash": "ТаÑ\98но Ñ\81кладиÑ\88Ñ\82е",
+ "uploadstash": "Ð\9eÑ\82пÑ\80емаÑ\9aе низа даÑ\82оÑ\82ека",
"uploadstash-summary": "Ова страница пружа приступ датотекама које су отпремљене или се отпремају, али још нису објављене. Ове датотеке нису видљиве никоме, осим кориснику који их је отпремио.",
"uploadstash-clear": "Очисти сакривене датотеке",
"uploadstash-nofiles": "Немате сакривене датотеке.",
"uploadstash-file-not-found-no-local-path": "Нема локалне путање за умањену ставку.",
"uploadstash-file-not-found-no-object": "Не могу направити локални датотечни објекат за минијатуру.",
"uploadstash-file-not-found-no-remote-thumb": "Добављање минијатуре није успело: $1\nАдреса = $2",
- "uploadstash-file-not-found-missing-content-type": "Недостаје заглавље за врсту садржаја.",
+ "uploadstash-file-not-found-missing-content-type": "Недостаје заглавље за тип садржаја.",
"uploadstash-file-not-found-not-exists": "Не могу наћи путању или ово није обична датотека.",
"uploadstash-file-too-large": "Не могу послужити датотеку већу од $1 {{PLURAL:$1|бајта|бајтова}}",
"uploadstash-not-logged-in": "Нико није пријављен. Датотеке морају припадати корисницима.",
"http-timed-out": "Захтев HTTP је истекао.",
"http-curl-error": "Грешка при отварању адресе: $1",
"http-bad-status": "Дошло је до проблема током захтева HTTP: $1 $2",
+ "http-internal-error": "HTTP интерна грешка.",
"upload-curl-error6": "Не могу да приступим адреси",
"upload-curl-error6-text": "Не могу да приступим наведеном URL-у.\nПроверите да ли је URL исправан и доступан.",
"upload-curl-error28": "Отпремање је истекло",
"nolicense": "Није изабрано",
"licenses-edit": "Уреди избор лиценци",
"license-nopreview": "(преглед није доступан)",
- "upload_source_url": "(ваÑ\88а изабÑ\80ана даÑ\82оÑ\82ека од иÑ\81пÑ\80авниÑ\85 и јавно доступних адреса)",
+ "upload_source_url": "(ваÑ\88а изабÑ\80ана даÑ\82оÑ\82ека од важеÑ\9bиÑ\85, јавно доступних адреса)",
"upload_source_file": "(ваша одабрана датотека са вашег рачунара)",
"listfiles-delete": "обриши",
"listfiles-summary": "Ова посебна страница приказује све отпремљене датотеке.",
"download": "преузми",
"unwatchedpages": "Ненадгледане странице",
"listredirects": "Списак преусмерења",
- "listduplicatedfiles": "Списак дуплираних датотека",
+ "listduplicatedfiles": "Списак датотека са дупликатима",
"listduplicatedfiles-summary": "Ово је списак датотека које су дупликат неких других датотека. Само локалне датотеке су приказане.",
"listduplicatedfiles-entry": "[[:File:$1|$1]] има [[$3|{{PLURAL:$2|један дупликат|$2 дупликата}}]].",
"unusedtemplates": "Некоришћени шаблони",
"statistics-users": "Регистровани корисници",
"statistics-users-active": "Активни корисници",
"statistics-users-active-desc": "Корисници који су извршили бар једну радњу {{PLURAL:$1|1=претходни дан|у последња $1 дана|у последњих $1 дана}}",
- "pageswithprop": "СÑ\82Ñ\80ане Ñ\81 оÑ\81обином Ñ\81Ñ\82Ñ\80ане",
+ "pageswithprop": "СÑ\82Ñ\80аниÑ\86е Ñ\81а Ñ\81воÑ\98Ñ\81Ñ\82вом Ñ\81Ñ\82Ñ\80аниÑ\86е",
"pageswithprop-legend": "Стране с особином стране",
"pageswithprop-text": "Ова страна излистава стране које имају одређену особину",
"pageswithprop-prop": "Име особине:",
"withoutinterwiki-summary": "Следеће странице нису повезане с другим језицима.",
"withoutinterwiki-legend": "Префикс",
"withoutinterwiki-submit": "Прикажи",
- "fewestrevisions": "Странице с најмање ревизија",
+ "fewestrevisions": "Странице са најмање ревизија",
"nbytes": "$1 {{PLURAL:$1|бајт|бајта|бајтова}}",
"ncategories": "$1 {{PLURAL:$1|категорија|категорије|категорија}}",
"ninterwikis": "$1 {{PLURAL:$1|међувики|међувикија|међувикија}}",
"wantedfiletext-nocat": "Следеће датотеке се користе, али не постоје. Датотеке из других ризница могу бити наведене иако не постоје. Такве датотеке ће бити <del>поништене</del> са списка.",
"wantedfiletext-nocat-noforeign": "Следеће датотеке се користе, али не постоје.",
"wantedtemplates": "Тражени шаблони",
- "mostlinked": "Странице с највише веза",
- "mostlinkedcategories": "Категорије с највише веза",
- "mostlinkedtemplates": "Странице с највише веза",
- "mostcategories": "Странице с највише категорија",
- "mostimages": "Датотеке с највише веза",
+ "mostlinked": "Странице са највише веза",
+ "mostlinkedcategories": "Категорије са највише веза",
+ "mostlinkedtemplates": "Странице са највише веза",
+ "mostcategories": "Странице са највише категорија",
+ "mostimages": "Датотеке са највише веза",
"mostinterwikis": "Странице са највише међувикија",
- "mostrevisions": "Странице с највише ревизија",
- "prefixindex": "Све странице с префиксом",
+ "mostrevisions": "Странице са највише ревизија",
+ "prefixindex": "Све странице са префиксом",
"prefixindex-namespace": "Све странице с предметком (именски простор $1)",
"prefixindex-submit": "Прикажи",
"prefixindex-strip": "Сакриј префикс у списку",
"shortpages": "Кратке странице",
"longpages": "Дугачке странице",
- "deadendpages": "СÑ\82Ñ\80аниÑ\86е без Ñ\83нÑ\83Ñ\82Ñ\80аÑ\88Ñ\9aиÑ\85 веза",
+ "deadendpages": "Ð\8bоÑ\80Ñ\81окаÑ\86и",
"deadendpagestext": "Следеће странице немају везе до других страница на овом викију.",
"protectedpages": "Заштићене странице",
"protectedpages-filters": "Филтери:",
"apisandbox-param-limit": "Унесите <kbd>max</kbd> да би сте користили највеће ограничење.",
"apisandbox-multivalue-all-namespaces": "$1 (сви именски простори)",
"apisandbox-multivalue-all-values": "$1 (све вредности)",
- "booksources": "ШÑ\82ампани извори",
+ "booksources": "Ð\9aÑ\9aижевни извори",
"booksources-search-legend": "Претражи штампане изворе",
"booksources-isbn": "ISBN:",
"booksources-search": "Претражи",
"listgrants": "Дозволе",
"listgrants-grant": "Дозвола",
"listgrants-rights": "Права",
- "trackingcategories": "Ð\9cедиÑ\98авики каÑ\82егоÑ\80иÑ\98е",
+ "trackingcategories": "Ð\9aаÑ\82егоÑ\80иÑ\98е за пÑ\80аÑ\9bеÑ\9aе",
"trackingcategories-summary": "Ова посебна страница је списак категорија које су део Медијавикија, оне се аутоматски ажурирају и њихови називи се могу мењати уређивањем системских порука у именском простору {{ns:8}}.",
- "trackingcategories-msg": "Ð\9fÑ\80аÑ\9bеÑ\9aе каÑ\82егоÑ\80иÑ\98е",
+ "trackingcategories-msg": "Ð\9aаÑ\82егоÑ\80иÑ\98е за пÑ\80аÑ\9bеÑ\9aе",
"trackingcategories-name": "Име поруке",
"trackingcategories-desc": "Које странице се налазе у категорији",
"restricted-displaytitle-ignored": "Странице са занемареним насловима за приказ",
"trackingcategories-disabled": "Категорија је онемогућена",
"mailnologin": "Нема адресе за слање",
"mailnologintext": "Морате бити [[Special:UserLogin|пријављени]] и имати ваљану имејл адресу у [[Special:Preferences|подешавањима]] да бисте слали имејлове другим корисницима.",
- "emailuser": "Пошаљи имејл",
+ "emailuser": "Пошаљи имејл овом кориснику/ци",
"emailuser-title-target": "Слање имејла {{GENDER:$1|кориснику|корисници}}",
"emailuser-title-notarget": "Слање имејла кориснику",
"emailpagetext": "Можете да користите доњи образац да пошаљете имејл {{GENDER:$1|овом кориснику|овој корисници}}.\nИмејл који сте унели у вашим [[Special:Preferences|подешавањима]] ће се приказати у пољу „Од“, тако да ће прималац моћи да вам одговори директно.",
"addwatch": "Додај на списак надгледања",
"addedwatchtext": "Страница „[[:$1]]“ и њена страница за разговор је додата на ваш [[Special:Watchlist|списак надгледања]].",
"addedwatchtext-talk": "Страница „[[:$1]]” и њена придружена страница је додата на ваш [[Special:Watchlist|списак надгледања]]",
- "addedwatchtext-short": "СÑ\82Ñ\80аниÑ\86а â\80\9e$1â\80\9c Ñ\98е додаÑ\82а на Ð\92аш списак надгледања.",
+ "addedwatchtext-short": "СÑ\82Ñ\80аниÑ\86а â\80\9e$1â\80\9c Ñ\98е додаÑ\82а на ваш списак надгледања.",
"removewatch": "Уклони са списка надгледања",
- "removedwatchtext": "СÑ\82Ñ\80аниÑ\86а â\80\9e[[:$1]]â\80\9c и Ñ\9aена Ñ\81Ñ\82Ñ\80аниÑ\86а за Ñ\80азговоÑ\80 Ñ\98е Ñ\83клоÑ\9aена Ñ\81а Ð\92ашег [[Special:Watchlist|списка надгледања]].",
- "removedwatchtext-short": "Страница „$1“ је уклоњена с вашег списка надгледања.",
+ "removedwatchtext": "СÑ\82Ñ\80аниÑ\86а â\80\9e[[:$1]]â\80\9c и Ñ\9aена Ñ\81Ñ\82Ñ\80аниÑ\86а за Ñ\80азговоÑ\80 Ñ\98е Ñ\83клоÑ\9aена Ñ\81а вашег [[Special:Watchlist|списка надгледања]].",
+ "removedwatchtext-short": "Страница „$1“ је уклоњена са вашег списка надгледања.",
"watch": "Надгледај",
"watchthispage": "Надгледај ову страницу",
"unwatch": "Прекини надгледање",
"changecontentmodel-submit": "Промени",
"changecontentmodel-success-title": "Модел садржаја је промењен",
"changecontentmodel-success-text": "Модел садржаја странице [[:$1]] је промењен.",
- "changecontentmodel-cannot-convert": "Ð\9cодел Ñ\81адÑ\80жаÑ\98а Ñ\81Ñ\82Ñ\80аниÑ\86е [[:$1]] Ñ\81е не може пÑ\80еÑ\82воÑ\80иÑ\82и Ñ\83 вÑ\80Ñ\81Ñ\82Ñ\83 $2.",
+ "changecontentmodel-cannot-convert": "Ð\9cодел Ñ\81адÑ\80жаÑ\98а Ñ\81Ñ\82Ñ\80аниÑ\86е [[:$1]] Ñ\81е не може конвеÑ\80Ñ\82оваÑ\82и Ñ\83 Ñ\82ип $2.",
"changecontentmodel-nodirectediting": "Модел садржаја $1 не подржава изравно уређивање",
"changecontentmodel-emptymodels-title": "Нема доступних модела садржаја",
- "changecontentmodel-emptymodels-text": "Ð\9cодел Ñ\81адÑ\80жаÑ\98а Ñ\81Ñ\82Ñ\80аниÑ\86е [[:$1]] Ñ\81е не може пÑ\80еÑ\82воÑ\80иÑ\82и ни Ñ\83 Ñ\98еднÑ\83 дÑ\80Ñ\83гÑ\83 вÑ\80Ñ\81Ñ\82Ñ\83.",
+ "changecontentmodel-emptymodels-text": "Ð\9cодел Ñ\81адÑ\80жаÑ\98а Ñ\81Ñ\82Ñ\80аниÑ\86е [[:$1]] Ñ\81е не може конвеÑ\80Ñ\82оваÑ\82и ни Ñ\83 Ñ\98едан дÑ\80Ñ\83ги Ñ\82ип.",
"log-name-contentmodel": "Евиденција промене модела садржаја",
"log-description-contentmodel": "Ова страница приказује измене у моделима садржаја страница и странице које су направљене са моделом садржаја који се разликује од подразумеваног.",
"logentry-contentmodel-new": "$1 је {{GENDER:$2|направио|направила}} страницу $3 с нестандардним моделом садржаја „$5“",
"prot_1movedto2": "је преместио [[$1]] на [[$2]]",
"protect-badnamespace-title": "Незаштитљив именски простор",
"protect-badnamespace-text": "Странице у овом именском простору се не могу заштитити.",
- "protect-norestrictiontypes-text": "Ова страница се не може заштитити јер нема доступних врста ограничења.",
+ "protect-norestrictiontypes-text": "Ова страница се не може заштитити јер нема доступних типова ограничења.",
"protect-norestrictiontypes-title": "Незаштитљива страна",
"protect-legend": "Подешавања заштите",
"protectcomment": "Разлог:",
"ipb-blocklist": "Погледај постојећа блокирања",
"ipb-blocklist-contribs": "Доприноси за {{GENDER:$1|$1}}",
"ipb-blocklist-duration-left": "преостало: $1",
- "unblockip": "Ð\94еблокиÑ\80аÑ\98 корисника",
+ "unblockip": "Ð\94еблокиÑ\80аÑ\9aе корисника",
"unblockiptext": "Користите доњи образац да бисте вратили право писања раније блокираној IP адреси или корисничком имену.",
"ipusubmit": "Уклони ову блокаду",
"unblocked": "[[User:$1|$1]] је деблокиран",
"thumbnail_invalid_params": "Неисправни параметри за минијатуру",
"thumbnail_toobigimagearea": "Датотека са величинама већим од $1",
"thumbnail_dest_directory": "Не могу да направим одредишну фасциклу",
- "thumbnail_image-type": "Ð\92Ñ\80Ñ\81Ñ\82а Ñ\81лике ниÑ\98е подÑ\80жана",
+ "thumbnail_image-type": "Тип Ñ\81лике ниÑ\98е подÑ\80жан",
"thumbnail_gd-library": "Недовршена подешавања графичке библиотеке: недостаје функција $1",
"thumbnail_image-size-zero": "Изгледа да је величина датотеке нула.",
"thumbnail_image-missing": "Датотека недостаје: $1",
"import-nonewrevisions": "Ниједна ревизија није увезена (све су већ присутне или су прескочене због грешака).",
"xml-error-string": "$1 у реду $2, колона $3 (бајт $4): $5",
"import-upload": "Отпремање XML података",
- "import-token-mismatch": "Ð\93Ñ\83биÑ\82ак подаÑ\82ака о Ñ\81еÑ\81иÑ\98и.\n\nÐ\9cожда Ñ\81Ñ\82е одÑ\98авÑ\99ени. '''Ð\9cолимо Ð\92аÑ\81 пÑ\80овеÑ\80иÑ\82е да ли Ñ\81Ñ\82е Ñ\98оÑ\88 Ñ\83век пÑ\80иÑ\98авÑ\99ени и покÑ\83Ñ\88аÑ\98Ñ\82е поново'''.\n\nÐ\90ко и даÑ\99е не Ñ\80ади, покÑ\83Ñ\88аÑ\98Ñ\82е Ñ\81е [[Special:UserLogout|одÑ\98авиÑ\82и]] и поново пÑ\80иÑ\98авиÑ\82и и пÑ\80овеÑ\80иÑ\82е да ли Ð\92аÑ\88 веб-пÑ\80траживач дозвољава колачиће са овог сајта.",
+ "import-token-mismatch": "Ð\93Ñ\83биÑ\82ак подаÑ\82ака о Ñ\81еÑ\81иÑ\98и.\n\nÐ\9cожда Ñ\81Ñ\82е одÑ\98авÑ\99ени. '''Ð\9cолимо Ð\92аÑ\81 пÑ\80овеÑ\80иÑ\82е да ли Ñ\81Ñ\82е Ñ\98оÑ\88 Ñ\83век пÑ\80иÑ\98авÑ\99ени и покÑ\83Ñ\88аÑ\98Ñ\82е поново'''.\n\nÐ\90ко и даÑ\99е не Ñ\80ади, покÑ\83Ñ\88аÑ\98Ñ\82е Ñ\81е [[Special:UserLogout|одÑ\98авиÑ\82и]] и поново пÑ\80иÑ\98авиÑ\82и и пÑ\80овеÑ\80иÑ\82е да ли ваÑ\88 веб-пÑ\80етраживач дозвољава колачиће са овог сајта.",
"import-invalid-interwiki": "Не могу да увозим с наведеног викија.",
"import-error-edit": "Страница „$1“ није увезена јер вам није дозвољено да је уређујете.",
"import-error-create": "Страница „$1“ није увезена јер вам није дозвољено да је направите.",
"tooltip-pt-watchlist": "Списак страница које надгледате",
"tooltip-pt-mycontris": "Списак {{GENDER:|Ваших}} доприноса",
"tooltip-pt-anoncontribs": "Списак измена направљених са ове IP адресе",
- "tooltip-pt-login": "Ð\9fÑ\80едлажемо Ð\92ам да се пријавите, иако то није обавезно",
+ "tooltip-pt-login": "Ð\9fÑ\80едлажемо вам да се пријавите, иако то није обавезно",
"tooltip-pt-login-private": "Морате да се пријавите да бисте користили овај Вики",
"tooltip-pt-logout": "Одјавите се",
- "tooltip-pt-createaccount": "Ð\9fÑ\80едлажемо Ð\92ам да отворите налог и пријавите се, иако то није обавезно",
+ "tooltip-pt-createaccount": "Ð\9fÑ\80едлажемо вам да отворите налог и пријавите се, иако то није обавезно",
"tooltip-ca-talk": "Разговор о страници са садржајем",
"tooltip-ca-edit": "Уредите ову страницу",
"tooltip-ca-addsection": "Започните нови одељак",
"widthheightpage": "$1 × $2, $3 {{PLURAL:$3|страница|странице|страница}}",
"file-info": "величина датотеке: $1, MIME тип: $2",
"file-info-size": "$1 × $2 пиксела, величина датотеке: $3, MIME тип: $4",
- "file-info-size-pages": "$1 × $2 пиксела, величина: $3, MIME врста: $4, $5 {{PLURAL:$5|страница|странице|страница}}",
+ "file-info-size-pages": "$1 × $2 пиксела, величина: $3, MIME тип: $4, $5 {{PLURAL:$5|страница|странице|страница}}",
"file-nohires": "Већа резолуција није доступна.",
"svg-long-desc": "SVG датотека, номинално $1 × $2 пиксела, величина: $3",
"svg-long-desc-animated": "Анимирана SVG датотека, номинално: $1 × $2 пиксела, величина: $3",
"exif-dc-relation": "Сродни медији",
"exif-dc-rights": "Права",
"exif-dc-source": "Извор медија",
- "exif-dc-type": "Ð\92Ñ\80Ñ\81Ñ\82а медија",
+ "exif-dc-type": "Тип медија",
"exif-rating-rejected": "Одбијено",
"exif-isospeedratings-overflow": "Веће од 65535",
"exif-maxaperturevalue-value": "$1 APEX (f/$2)",
"watchlistedit-clear-explain": "Сви наслови ће бити уклоњени из списка надгледања",
"watchlistedit-clear-titles": "Наслови:",
"watchlistedit-clear-submit": "Очисти списак надгледања (Ово је неповратно!)",
- "watchlistedit-clear-done": "Ð\92аÑ\88 Ñ\81пиÑ\81ак надгледаÑ\9aа Ñ\98е иÑ\81пÑ\80ажÑ\9aен.",
+ "watchlistedit-clear-done": "Ð\92аÑ\88 Ñ\81пиÑ\81ак надгледаÑ\9aа Ñ\98е оÑ\87иÑ\88Ñ\9bен.",
"watchlistedit-clear-removed": "{{PLURAL:$1|1 наслов је уклоњен|$1 наслова су уклоњена|$1 наслова је уклоњено}}:",
"watchlistedit-too-many": "Има превише страница за приказ овде.",
"watchlisttools-clear": "очисти списак надгледања",
"redirect-file": "Назив датотеке",
"redirect-logid": "ID евиденције",
"redirect-not-exists": "Вредност није пронађена",
- "fileduplicatesearch": "Ð\9fÑ\80еÑ\82Ñ\80ажи дÑ\83пликаÑ\82е",
+ "fileduplicatesearch": "Ð\9fÑ\80еÑ\82Ñ\80ага дÑ\83пликаÑ\82а даÑ\82оÑ\82ека",
"fileduplicatesearch-summary": "Претрага дуплираних датотека према хеш вредности.",
"fileduplicatesearch-filename": "Назив датотеке:",
"fileduplicatesearch-submit": "Претражи",
"dberr-usegoogle": "У међувремену, покушајте да претражите помоћу Гугла.",
"dberr-outofdate": "Имајте на уму да њихови примерци нашег садржаја могу бити застарели.",
"dberr-cachederror": "Ово је привремено меморисан примерак стране који можда није ажуран.",
- "htmlform-invalid-input": "Пронађени су проблеми у вашем уносу",
+ "htmlform-invalid-input": "Постоје проблеми са вашим уносом.",
"htmlform-select-badoption": "Вредност коју сте навели није валидна опција.",
"htmlform-int-invalid": "Наведена вредност није цели број.",
"htmlform-float-invalid": "Наведена вредност није број.",
"limitreport-unstrip-depth": "Unstrip дубина рекурзије",
"limitreport-unstrip-size": "Unstrip величина након проширења",
"limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|бајт|бајта|бајтова}}",
- "expandtemplates": "Ð\97амена шаблона",
+ "expandtemplates": "Ð\9fÑ\80оÑ\88иÑ\80аваÑ\9aе шаблона",
"expand_templates_intro": "Ова посебна страница узима викитекст и мења све шаблоне у њему рекурзивно.\nТакође мења функције парсера као што је <code><nowiki>{{</nowiki>#language:…}}</code> и променљиве као што је <code><nowiki>{{</nowiki>CURRENTDAY}}</code>. \nЗаправо практично све што се налази између витичастих заграда.",
"expand_templates_title": "Назив контекста; за {{СТРАНИЦА}} итд.:",
"expand_templates_input": "Унос викитекста:",
"expand_templates_generate_xml": "Прикажи XML стабло",
"expand_templates_generate_rawhtml": "Прикажи сиров HTML",
"expand_templates_preview": "Претпреглед",
- "pagelanguage": "Ð\9fÑ\80омени Ñ\98език странице",
+ "pagelanguage": "Ð\9fÑ\80омена Ñ\98езика странице",
"pagelang-name": "Страница",
"pagelang-language": "Језик",
"pagelang-use-default": "Користи подразумевани језик",
"logentry-pagelang-pagelang": "$1 је {{GENDER:$2|променио|променила}} језик странице $3 из $4 у $5.",
"default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (омогућена)",
"default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>онемогућена</strong>)",
- "mediastatistics": "СÑ\82аÑ\82иÑ\81Ñ\82ика даÑ\82оÑ\82ека",
+ "mediastatistics": "СÑ\82аÑ\82иÑ\81Ñ\82ика медиÑ\98а",
"mediastatistics-summary": "Статистике о типовима послатих датотека. Овде су урачунате само најскорије верзије датотека. Старе или обрисане верзије нису урачунате.",
"mediastatistics-nbytes": "{{PLURAL:$1|$1 бајт|$1 бајта|$1 бајтова}} ($2; $3%)",
"mediastatistics-bytespertype": "Укупна величина датотеке овог одељка: {{PLURAL:$1|$1 бајт|$1 бајта|$1 бајтова}} ($2; $3%).",
"json-error-utf8": "Малформирани UTF-8 знаци, могуће је да су неисправно енкодирани",
"json-error-recursion": "Једна или више рекурзивних референци у вредности коју треба енкодирати.",
"json-error-inf-or-nan": "Једна или више NAN или INF вредности у вредности коју треба енкодирати",
- "json-error-unsupported-type": "Дата је вреднос врсте која се не може енкодирати",
+ "json-error-unsupported-type": "Дата је вредност типа која се не може енкодирати",
"headline-anchor-title": "Веза до овог одељка",
"special-characters-group-latin": "Латиница",
"special-characters-group-latinextended": "Проширена латиница",
"log-action-filter-patrol": "Тип патролирања:",
"log-action-filter-protect": "Тип заштите:",
"log-action-filter-rights": "Тип промене корисничких права:",
- "log-action-filter-suppress": "Ð\92Ñ\80Ñ\81Ñ\82а скривања:",
+ "log-action-filter-suppress": "Тип скривања:",
"log-action-filter-upload": "Тип отпремања:",
"log-action-filter-all": "Све",
"log-action-filter-block-block": "блокирање",
"log-action-filter-suppress-reblock": "Скривање корисника поновним блокирањем",
"log-action-filter-upload-upload": "ново отпремање",
"log-action-filter-upload-overwrite": "промена постојећег",
- "authmanager-authn-not-in-progress": "Ð\90Ñ\83Ñ\82енÑ\82иÑ\84икаÑ\86иÑ\98а није у току или је дошло до губитка података о сесији. Почните испочетка.",
+ "authmanager-authn-not-in-progress": "Ð\9fоÑ\82вÑ\80да иденÑ\82иÑ\82еÑ\82а није у току или је дошло до губитка података о сесији. Почните испочетка.",
"authmanager-authn-no-primary": "Не могу да проверим пружене акредитиве.",
"authmanager-authn-no-local-user": "Пружени акредитиви нису повезани ни са једним корисником на овом викију.",
- "authmanager-authn-no-local-user-link": "Ð\9fÑ\80Ñ\83жени Ñ\81Ñ\83 важеÑ\9bи акÑ\80едиÑ\82иви, али ниÑ\81Ñ\83 повезани ни Ñ\81 Ñ\98едним коÑ\80иÑ\81ником на овом викиÑ\98Ñ\83. Ð\9fÑ\80иÑ\98авиÑ\82е Ñ\81е на неки дÑ\80Ñ\83ги наÑ\87ин или напÑ\80авиÑ\82е нови коÑ\80иÑ\81ниÑ\87ки налог, Ñ\88Ñ\82о Ñ\9bе Ð\92ам дати могућност да повежете претходне акредитиве на нови налог.",
+ "authmanager-authn-no-local-user-link": "Ð\9fÑ\80Ñ\83жени Ñ\81Ñ\83 важеÑ\9bи акÑ\80едиÑ\82иви, али ниÑ\81Ñ\83 повезани ни Ñ\81 Ñ\98едним коÑ\80иÑ\81ником на овом викиÑ\98Ñ\83. Ð\9fÑ\80иÑ\98авиÑ\82е Ñ\81е на неки дÑ\80Ñ\83ги наÑ\87ин или напÑ\80авиÑ\82е нови коÑ\80иÑ\81ниÑ\87ки налог, Ñ\88Ñ\82о Ñ\9bе вам дати могућност да повежете претходне акредитиве на нови налог.",
"authmanager-authn-autocreate-failed": "Не могу да аутоматски направим локални налог: $1",
"authmanager-change-not-supported": "Не могу да променим пружене акредитиве јер их ништа не би користило.",
"authmanager-create-disabled": "Онемогућено прављење налога.",
"authmanager-link-no-primary": "Не могу да искористим пружене акредитиве за спајање налога.",
"authmanager-link-not-in-progress": "Спајање налога није у току или је дошло до губитка података о сесији. Почните испочетка.",
"authmanager-authplugin-setpass-failed-title": "Неуспешна промена лозинке",
- "authmanager-authplugin-setpass-failed-message": "Ð\94одаÑ\82ак за аÑ\83Ñ\82енÑ\82иÑ\84икаÑ\86иÑ\98Ñ\83 је одбио промену лозинке.",
- "authmanager-authplugin-create-fail": "Ð\94одаÑ\82ак за аÑ\83Ñ\82енÑ\82иÑ\84икаÑ\86иÑ\98Ñ\83 је одбио прављење налога.",
- "authmanager-authplugin-setpass-denied": "Ð\94одаÑ\82ак за аÑ\83Ñ\82енÑ\82иÑ\84икаÑ\86иÑ\98Ñ\83 не дозвољава мењање лозику.",
+ "authmanager-authplugin-setpass-failed-message": "Ð\94одаÑ\82ак за поÑ\82вÑ\80дÑ\83 иденÑ\82иÑ\82еÑ\82а је одбио промену лозинке.",
+ "authmanager-authplugin-create-fail": "Ð\94одаÑ\82ак за поÑ\82вÑ\80дÑ\83 иденÑ\82иÑ\82еÑ\82а је одбио прављење налога.",
+ "authmanager-authplugin-setpass-denied": "Ð\94одаÑ\82ак за поÑ\82вÑ\80дÑ\83 иденÑ\82иÑ\82еÑ\82а не дозвољава мењање лозику.",
"authmanager-authplugin-setpass-bad-domain": "Неисправан домен.",
"authmanager-autocreate-noperm": "Аутоматско прављење налога није дозвољено.",
"authmanager-userdoesnotexist": "Кориснички налог „$1“ није отворен.",
- "authmanager-username-help": "Ð\9aоÑ\80иÑ\81ниÑ\87ко име за аÑ\83Ñ\82енÑ\82иÑ\84икаÑ\86иÑ\98Ñ\83.",
- "authmanager-password-help": "Ð\9bозинка за аÑ\83Ñ\82енÑ\82иÑ\84икаÑ\86иÑ\98Ñ\83.",
- "authmanager-domain-help": "Ð\94омен за Ñ\81поÑ\99аÑ\88Ñ\9aÑ\83 аÑ\83Ñ\82енÑ\82иÑ\84икаÑ\86иÑ\98Ñ\83.",
+ "authmanager-username-help": "Ð\9aоÑ\80иÑ\81ниÑ\87ко име за поÑ\82вÑ\80дÑ\83 иденÑ\82иÑ\82еÑ\82а.",
+ "authmanager-password-help": "Ð\9bозинка за поÑ\82вÑ\80дÑ\83 иденÑ\82иÑ\82еÑ\82а.",
+ "authmanager-domain-help": "Ð\94омен за Ñ\81поÑ\99аÑ\88Ñ\9aÑ\83 поÑ\82вÑ\80дÑ\83 иденÑ\82иÑ\82еÑ\82а.",
"authmanager-retype-help": "Поновите лозинку да би сте потврдили.",
"authmanager-email-label": "Имејл",
"authmanager-email-help": "Имејл адреса",
"authmanager-realname-label": "Право име",
"authmanager-realname-help": "Право име корисника",
- "authmanager-provider-password": "Ð\90Ñ\83Ñ\82енÑ\82иÑ\84икаÑ\86иÑ\98а лозинком",
- "authmanager-provider-password-domain": "Ð\90Ñ\83Ñ\82енÑ\82иÑ\84икаÑ\86иÑ\98а лозинком и доменом",
+ "authmanager-provider-password": "Ð\9fоÑ\82вÑ\80да иденÑ\82иÑ\82еÑ\82а лозинком",
+ "authmanager-provider-password-domain": "Ð\9fоÑ\82вÑ\80да иденÑ\82иÑ\82еÑ\82а лозинком и доменом",
"authmanager-provider-temporarypassword": "Привремена лозинка",
"authprovider-confirmlink-option": "$1 ($2)",
"authprovider-confirmlink-request-label": "Рачуни који се требају повезати",
"authprovider-confirmlink-ok-help": "Наставите након приказивања порука за неуспело повезивање.",
"authprovider-resetpass-skip-label": "Прескочи",
"authprovider-resetpass-skip-help": "Прескочите ресетовање лозинке.",
- "authform-nosession-login": "Ð\90Ñ\83Ñ\82енÑ\82иÑ\84икаÑ\86иÑ\98а Ñ\98е Ñ\83Ñ\81пела, али Ð\92аш прегледач не може да „запамти” да сте пријављени.\n\n$1",
- "authform-nosession-signup": "Ð\9dалог Ñ\98е напÑ\80авÑ\99ен, али Ð\92аш прегледач не може да „запамти” да сте пријављени.\n\n$1",
+ "authform-nosession-login": "Ð\9fоÑ\82вÑ\80да иденÑ\82иÑ\82еÑ\82а Ñ\98е Ñ\83Ñ\81пела, али ваш прегледач не може да „запамти” да сте пријављени.\n\n$1",
+ "authform-nosession-signup": "Ð\9dалог Ñ\98е оÑ\82воÑ\80ен, али ваш прегледач не може да „запамти” да сте пријављени.\n\n$1",
"authform-newtoken": "Недостаје токен. $1",
"authform-notoken": "Недостаје токен",
"authform-wrongtoken": "Погрешан токен",
"specialpage-securitylevel-not-allowed-title": "Није дозвољено",
- "specialpage-securitylevel-not-allowed": "Ð\96ао нам Ñ\98е, ниÑ\98е Ð\92ам дозвоÑ\99ено да коÑ\80иÑ\81Ñ\82иÑ\82е овÑ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ñ\98еÑ\80 не могÑ\83 да поÑ\82вÑ\80дим Ð\92аш идентитет.",
+ "specialpage-securitylevel-not-allowed": "Ð\96ао нам Ñ\98е, ниÑ\98е вам дозвоÑ\99ено да коÑ\80иÑ\81Ñ\82иÑ\82е овÑ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ñ\98еÑ\80 не могÑ\83 да поÑ\82вÑ\80дим ваш идентитет.",
"authpage-cannot-login": "Не могу започети пријаву.",
- "authpage-cannot-login-continue": "Не могу да наставим пријављивање. Ваша сесија је највероватније истекла.",
+ "authpage-cannot-login-continue": "Не могу да наставим са пријавом. Ваша сесија је највероватније истекла.",
"authpage-cannot-create": "Не могу започети стварање налога.",
"authpage-cannot-link": "Не могу започети спајање налога.",
"cannotauth-not-allowed-title": "Приступ је одбијен",
- "cannotauth-not-allowed": "Ð\9dиÑ\98е Ð\92ам дозвољено да користите ову страницу",
+ "cannotauth-not-allowed": "Ð\9dиÑ\98е вам дозвољено да користите ову страницу",
"changecredentials": "Промена акредитива",
"changecredentials-submit": "Промени",
- "changecredentials-invalidsubpage": "â\80\9e$1â\80\9c ниÑ\98е валидна вÑ\80Ñ\81Ñ\82а акредитива.",
+ "changecredentials-invalidsubpage": "â\80\9e$1â\80\9c ниÑ\98е важеÑ\9bи Ñ\82ип акредитива.",
"changecredentials-success": "Ваши акредитиви су промењени.",
"removecredentials": "Уклањање акредитива",
"removecredentials-submit": "Уклањање акредитива",
- "removecredentials-invalidsubpage": "â\80\9e$1â\80\9c ниÑ\98е валидна вÑ\80Ñ\81Ñ\82а акредитива.",
+ "removecredentials-invalidsubpage": "â\80\9e$1â\80\9c ниÑ\98е важеÑ\9bи Ñ\82ип акредитива.",
"removecredentials-success": "Ваши акредитиви су уклоњени.",
"credentialsform-provider": "Тип акредитива:",
"credentialsform-account": "Назив налога:",
"cannotlink-no-provider-title": "Нема налога за повезивање",
"cannotlink-no-provider": "Нема налога за повезивање.",
- "linkaccounts": "Ð\9fовежи налоге",
+ "linkaccounts": "СпаÑ\98аÑ\9aе налога",
"linkaccounts-success-text": "Налог је повезан.",
"linkaccounts-submit": "Повежи налоге",
- "unlinkaccounts": "Ð\9eбÑ\98едини налоге",
+ "unlinkaccounts": "РаздваÑ\98аÑ\9aе налога",
"unlinkaccounts-success": "Налог је обједињен.",
"userjsispublic": "Напомена: JavaScript подстранице не би требале садржавати поверљиве информације будући да су видљиве другим корисницима.",
"usercssispublic": "Напомена: CSS подстранице не би требале садржавати поверљиве информације будући да су видљиве другим корисницима.",
"revid": "ревизија $1",
"pageid": "ID странице: $1",
"rawhtml-notallowed": "<html> тагови не могу да се користе ван нормалних страница.",
- "gotointerwiki": "Напуштам пројекат {{SITENAME}}",
+ "gotointerwiki": "Напуштање пројекта {{SITENAME}}",
"gotointerwiki-invalid": "Одабрани наслов је невалидан.",
"gotointerwiki-external": "Управо ћете да напустите пројекат {{SITENAME}} да бисте на засебном веб-сајту посетили [[$2]].\n\n'''[$1 Продужи на $1]'''",
"undelete-cantedit": "Не можете повратити ову страницу јер немате дозволу да је уређујете.",
"cannotdelete-title": "Ne mogu da obrišem stranicu „$1“",
"delete-hook-aborted": "Brisanje je prekinula kuka.\nNije dato nikakvo obrazloženje.",
"no-null-revision": "Ne mogu da napravim novu praznu verziju za stranicu „$1“",
- "badtitle": "Neispravan naslov",
+ "badtitle": "Loš naslov",
"badtitletext": "Naslov stranice je neispravan, prazan ili je međujezički ili međuviki naslov pogrešno povezan.\nMožda sadrži znakove koji se ne mogu koristiti u naslovima.",
"title-invalid-empty": "Traženo ime stranice je prazno ili sadrži samo naziv imenskog prostora.",
"title-invalid-utf8": "Traženi naziv stranice sadrži nevažeći UTF-8 znak.",
"notloggedin": "Niste prijavljeni",
"userlogin-noaccount": "Nemate nalog?",
"userlogin-joinproject": "Pridružite se projektu {{SITENAME}}",
- "createaccount": "Otvori nalog",
+ "createaccount": "Otvaranje naloga",
"userlogin-resetpassword-link": "Zaboravili ste lozinku?",
"userlogin-helplink2": "Pomoć pri prijavljivanju",
"userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nKoristite donji obrazac da biste se prijavili kao drugi korisnik.",
"php-mail-error-unknown": "Nepoznata greška u funkciji PHP mail().",
"user-mail-no-addy": "Pokušali ste da pošaljete imejl bez imejl adrese.",
"user-mail-no-body": "Pokušano slanje imejla s praznim ili nerazumno kratkim sadržajem.",
- "changepassword": "Promeni lozinku",
+ "changepassword": "Promena lozinke",
"resetpass_announce": "Da biste završili prijavu, podesite novu lozinku ovde.",
"resetpass_text": "<!-- Ovde unesite tekst -->",
"resetpass_header": "Promena lozinke naloga",
"statistics-users": "Registrovani korisnici",
"statistics-users-active": "Aktivni korisnici",
"statistics-users-active-desc": "Korisnici koji su izvršili bar jednu radnju {{PLURAL:$1|1=prethodni dan|u poslednja $1 dana|u poslednjih $1 dana}}",
- "pageswithprop": "Strane s osobinom strane",
+ "pageswithprop": "Stranice sa svojstvom stranice",
"pageswithprop-legend": "Strane s osobinom strane",
"pageswithprop-text": "Ova strana izlistava strane koje imaju određenu osobinu",
"pageswithprop-prop": "Ime osobine:",
"mostimages": "Datoteke s najviše veza",
"mostinterwikis": "Stranice sa najviše međuvikija",
"mostrevisions": "Stranice s najviše izmena",
- "prefixindex": "Sve stranice s prefiksom",
+ "prefixindex": "Sve stranice sa prefiksom",
"prefixindex-namespace": "Sve stranice s predmetkom (imenski prostor $1)",
"prefixindex-submit": "Prikaži",
"prefixindex-strip": "Sakrij prefiks u spisku",
"shortpages": "Kratke stranice",
"longpages": "Dugačke stranice",
- "deadendpages": "Stranice bez unutrašnjih veza",
+ "deadendpages": "Ćorsokaci",
"deadendpagestext": "Sledeće stranice nemaju veze do drugih stranica na ovom vikiju.",
"protectedpages": "Zaštićene stranice",
"protectedpages-filters": "Filteri:",
"apisandbox-param-limit": "Unesite <kbd>max</kbd> da bi ste koristili najveće ograničenje.",
"apisandbox-multivalue-all-namespaces": "$1 (svi imenski prostori)",
"apisandbox-multivalue-all-values": "$1 (sve vrednosti)",
- "booksources": "Štampani izvori",
+ "booksources": "Književni izvori",
"booksources-search-legend": "Pretraži štampane izvore",
"booksources-isbn": "ISBN:",
"booksources-search": "Pretraži",
"trackingcategories-disabled": "Kategorija je onemogućena",
"mailnologin": "Nema adrese za slanje",
"mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]] i imati ispravan imejl adresu u [[Special:Preferences|podešavanjima]] da biste slali imejlove drugim korisnicima.",
- "emailuser": "Pošalji imejl",
+ "emailuser": "Pošalji imejl ovom korisniku/ci",
"emailuser-title-target": "Slanje imejla {{GENDER:$1|korisniku|korisnici}}",
"emailuser-title-notarget": "Slanje imejla korisniku",
"emailpagetext": "Možete da koristite donji obrazac da pošaljete imejl {{GENDER:$1|ovom korisniku|ovoj korisnici}}.\nImejl koji ste uneli u vašim [[Special:Preferences|podešavanjima]] će se prikazati u polju „Od“, tako da će primalac moći da vam odgovori direktno.",
"importlogpagetext": "Administrativni uvozi stranica s istorijama izmena s drugih vikija.",
"import-logentry-upload-detail": "$1 {{PLURAL:$1|izmena uvezena|izmene uvezene|izmena uvezeno}}",
"import-logentry-interwiki-detail": "$1 {{PLURAL:$1|izmena uvezena|izmene uvezene|izmena uvezeno}} iz $2",
- "javascripttest": "Javaskript test",
+ "javascripttest": "Testiranje javaskripta",
"javascripttest-pagetext-unknownaction": "Nepoznata radnja „$1“.",
"javascripttest-qunit-intro": "Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.",
"tooltip-pt-userpage": "{{GENDER:|Vaša}} korisnička stranica",
"redirect-file": "Naziv datoteke",
"redirect-logid": "ID dnevnika",
"redirect-not-exists": "Vrednost nije pronađena",
- "fileduplicatesearch": "Pretraži duplikate",
+ "fileduplicatesearch": "Pretraga duplikata datoteka",
"fileduplicatesearch-summary": "Pretraga dupliranih datoteka prema heš vrednosti.",
"fileduplicatesearch-filename": "Naziv datoteke:",
"fileduplicatesearch-submit": "Pretraži",
"limitreport-unstrip-depth": "Unstrip dubina rekurzije",
"limitreport-unstrip-size": "Unstrip veličina nakon proširenja",
"limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
- "expandtemplates": "Zamena šablona",
+ "expandtemplates": "Proširavanje šablona",
"expand_templates_intro": "Ova posebna stranica uzima vikitekst i menja sve šablone u njemu rekurzivno.\nTakođe menja funkcije parsera kao što je <code><nowiki>{{</nowiki>#language:…}}</code> i promenljive kao što je <code><nowiki>{{</nowiki>CURRENTDAY}}</code>. \nZapravo praktično sve što se nalazi između vitičastih zagrada.",
"expand_templates_title": "Naziv konteksta; za {{STRANICA}} itd.:",
"expand_templates_input": "Unos vikiteksta:",
"expand_templates_generate_xml": "Prikaži XML stablo",
"expand_templates_generate_rawhtml": "Prikaži sirov HTML",
"expand_templates_preview": "Pretpregled",
- "pagelanguage": "Promeni jezik stranice",
+ "pagelanguage": "Promena jezika stranice",
"pagelang-name": "Stranica",
"pagelang-language": "Jezik",
"pagelang-use-default": "Koristi podrazumevani jezik",
"log-description-pagelang": "Ovo je dnevnik izmena u jezicima stranica.",
"logentry-pagelang-pagelang": "$1 je {{GENDER:$2|promenio|promenila}} jezik stranice $3 iz $4 u $5.",
"default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (omogućena)",
- "mediastatistics": "Statistika datoteka",
+ "mediastatistics": "Statistika medija",
"mediastatistics-summary": "Statistike o tipovima poslatih datoteka. Ovde su uračunate samo najnovije verzije datoteka. Stare ili obrisane verzije nisu uračunate.",
"mediastatistics-nbytes": "{{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2; $3%)",
"mediastatistics-bytespertype": "Ukupna veličina datoteke ovog odeljka: {{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2; $3%).",
"revid": "izmena $1",
"pageid": "ID stranice: $1",
"rawhtml-notallowed": "<html> tagovi ne mogu da se koriste van normalnih stranica.",
- "gotointerwiki": "Napuštam projekat {{SITENAME}}",
+ "gotointerwiki": "Napuštanje projekta {{SITENAME}}",
"gotointerwiki-invalid": "Odabrani naslov je nevalidan.",
"gotointerwiki-external": "Upravo ćete da napustite projekat {{SITENAME}} da biste na zasebnom veb-sajtu posetili [[$2]].\n\n'''[$1 Produži na $1]'''",
"undelete-cantedit": "Ne možete povratiti ovu stranicu jer nemate dozvolu da je uređujete.",
"group-autoconfirmed-member": "{{GENDER:$1|bekräftad användare}}",
"group-bot-member": "{{GENDER:$1|robot}}",
"group-sysop-member": "{{GENDER:$1|administratör}}",
- "group-interface-admin-member": "{{GENDER:$1|gränssnittsadministratörer}}",
+ "group-interface-admin-member": "{{GENDER:$1|gränssnittsadministratör}}",
"group-bureaucrat-member": "{{GENDER:$1|byråkrat}}",
"group-suppress-member": "{{GENDER:$1|censor}}",
"grouppage-user": "{{ns:project}}:Användare",
"ns-specialprotected": "சிறப்புப் பக்கங்களைத் தொகுக்க முடியாது.",
"titleprotected": "பயனர் [[User:$1|$1]] இத்தலைப்பு உருவாக்கப்படுவதை தவிர்க்கும் வகையில் தடுத்துள்ளார்.\nகொடுக்கப்பட்டக் காரணம் <em>$2</em>.",
"filereadonlyerror": "\"$1\" கோப்பைத் திருத்த முடியவில்லை ஏனெனில் கோப்புப் பெட்டகம் \"$2\" படிக்க-மட்டும் வகையில் உள்ளது. அதனை பூட்டிய நிர்வாகி பின்வரும் விளக்கத்தை அளித்துள்ளார்: \"$3\"",
+ "invalidtitle": "செல்லத்தகாத தலைப்பு",
"invalidtitle-knownnamespace": "பெயரிடைவெளி ' $2 '' மற்றும் உரை '' $3 '' கொன்ட தலைப்பு செல்லாது",
"invalidtitle-unknownnamespace": "அறியப்படாத பெயரிடைவெளி $1 மற்றும் உரை $2 கொண்ட தலைப்பு செல்லாது",
"exception-nologin": "புகுபதிகை செய்யப்படவில்லை.",
"cannotloginnow-title": "இப்பொழுது விடுபதிகை செய்ய இயலாது.",
"cannotloginnow-text": "$1-ஐ பயன்படுத்தும் பொழுது விடுபதிகை சாத்தியம் அல்ல.",
"cannotcreateaccount-title": "கணக்கைத் தொடங்க முடியாது",
+ "cannotcreateaccount-text": "இவ்விக்கியில் நேரடி கணக்குத்தொடக்கம் இயக்கப்படவில்லை",
"yourdomainname": "உங்கள் உரிமைப்பரப்பு:",
"password-change-forbidden": "நீங்கள் விக்கிகளில் கடவுச் சொற்களை மாற்ற முடியாது",
"externaldberror": "வெளி உறுதிப்படுத்தலில் ஏற்பட்ட தவறு காரணமாக உங்கள் வெளி கணக்கை இற்றைப்படுத்த முடியாது.",
"userlogin-resetpassword-link": "உங்கள் கடவுச் சொல்லை மறந்து விட்டீர்களா?",
"userlogin-helplink2": "உள்நுழைவதற்கு உதவி",
"userlogin-loggedin": "நீங்கள் {{GENDER:$1|$1}} ஆக புகுபதியவில்லை.\nகீழ் உள்ள படிவத்தை பயன்படுத்தி இன்னொரு பயனராக புகுபதிவு செய்க.",
+ "userlogin-reauth": "{{GENDER:$1|$1}} என்பதை உறுதிசெய்ய நீங்கள் உள்புக வேண்டும்.",
"userlogin-createanother": "மற்றொரு கணக்கு ஒன்றை உருவாக்கவும்",
"createacct-emailrequired": "மின்னஞ்சல் முகவரி",
"createacct-emailoptional": "மின்னஞ்சல் முகவரி (விருப்பத்தேர்வு)",
"createacct-email-ph": "உங்கள் மின்னஞ்சல் முகவரியை உள்ளிடுக",
"createacct-another-email-ph": "உங்கள் மின்னஞ்சல் முகவரியை உள்ளிடுக",
"createaccountmail": "தற்காலிகமாக எழுந்தமான ஒரு கடவுச்சொல்லை பயன்படுத்துக, அதை குறித்துள்ள மின்னஞ்சலுக்கு அனுப்புக",
+ "createaccountmail-help": "மற்றவருக்காக கடவுச்சொல்லை அறிந்துக்கொள்ளாமல் கணக்கைத் தொடங்க முடியும்.",
"createacct-realname": "உண்மைப் பெயர் (விருப்பத்தேர்வு)",
"createacct-reason": "காரணம்",
"createacct-reason-ph": "தாங்கள் ஏன் மற்றொரு கணக்கைத் துவங்குகிறீர்கள்?",
"postedit-confirmation-created": "இந்தப் பக்கம் உருவாக்கபட்டுள்ளது",
"postedit-confirmation-restored": "இந்தப் பக்கம் மீட்டமைக்கப்பட்டது.",
"postedit-confirmation-saved": "உங்களது தொகுப்பு சேமிக்கப்பட்டது.",
+ "postedit-confirmation-published": "தங்கள் தொகுப்பு பதிப்பிக்கப்பட்டுவிட்டது.",
"edit-already-exists": "புதிய பக்கமொன்றை உருவாக்க முடியாது.\nஇப்பக்கம் ஏற்கனவே உள்ளது.",
"defaultmessagetext": "இயல்பிருப்பு தகவல் உரை",
"content-failed-to-parse": "உள்ளடக்கம் $2 வகை $1 இற்காக பாகுபடுத்தல் தோல்வி: $3",
"prefs-watchlist-edits": "விரிவாக்கப்பட்ட கவனிப்புப் பட்டியலில் காட்டவேண்டிய தொகுப்புகளின் எண்ணிக்கை:",
"prefs-watchlist-edits-max": "(அதிக அளவான எண்: 1000)",
"prefs-watchlist-token": "கவனிப்பு பட்டியலின் அடையாளம்:",
+ "prefs-watchlist-managetokens": "வில்லைகளை நிர்வகிக்க",
"prefs-misc": "பலதரப்பட்டவை",
"prefs-resetpass": "கடவுச்சொல்லை மாற்றுக",
"prefs-changeemail": "மின்னஞ்சல் முகவரியை மாற்று / நீக்கு",
"recentchanges-legend-heading": "<strong>குறியீட்டு விளக்கம்:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|புதிய பக்கங்கள் பட்டியலையும்]] காணவும்)",
"recentchanges-submit": "காட்டு",
+ "rcfilters-activefilters-hide": "மறைக்க",
+ "rcfilters-activefilters-show": "காட்டு",
"rcfilters-days-title": "அண்மைய தினங்கள்",
"rcfilters-hours-title": "அண்மைய நேரங்கள்",
"rcfilters-days-show-days": "$1 {{PLURAL:$1|நாள்|நாட்கள்}}",
"rcfilters-savedqueries-apply-label": "வடிப்பானை உருவாக்குக",
"rcfilters-savedqueries-apply-and-setdefault-label": "தன்னியல்பு வடிப்பானை உருவாக்குக",
"rcfilters-savedqueries-cancel-label": "ரத்து செய்",
+ "rcfilters-invalid-filter": "செல்லத்தகாத வடிப்பான்",
"rcfilters-filterlist-title": "வடிப்பான்கள்",
"rcfilters-highlightmenu-title": "ஒரு நிறத்தை தேர்ந்தெடுக்கவும்",
"rcfilters-filterlist-noresults": "எந்த வடிப்பானும் காணப்படவில்லை",
"rcfilters-filter-editsbyself-description": "தங்களது தொகுப்புகள்.",
"rcfilters-filter-editsbyother-label": "மற்றவர் தொகுப்புகள்",
"rcfilters-filter-user-experience-level-registered-label": "பதிவுசெய்யப்பட்டது",
+ "rcfilters-filter-user-experience-level-registered-description": "உள்நுழைந்த தொகுப்பாளர்கள்.",
"rcfilters-filter-user-experience-level-unregistered-label": "பதிவு நீக்கம் செய்யப்பட்டது",
+ "rcfilters-filter-user-experience-level-unregistered-description": "உள்புகாத தொகுப்பாளர்கள்",
"rcfilters-filter-user-experience-level-newcomer-label": "புது வரவுகள்",
"rcfilters-filter-user-experience-level-learner-label": "கற்போர்",
"rcfilters-filter-user-experience-level-experienced-label": "அனுபவமுள்ள பயனர்கள்",
"rcfilters-filter-bots-description": "தானியக்க கருவிகளால ஆன தொகுப்புகள்",
"rcfilters-filter-humans-label": "மனிதன் (தானியங்கி அல்ல)",
"rcfilters-filter-humans-description": "மனித தொகுப்பாளர்களால் ஆன தொகுப்பு",
+ "rcfilters-filter-reviewstatus-unpatrolled-label": "சுற்றித்திரியாதவை",
+ "rcfilters-filter-reviewstatus-auto-label": "தானியக்கமாக ரோந்திடப்பட்டது",
"rcfilters-filtergroup-significance": "சிறப்பு",
"rcfilters-filter-minor-label": "சிறு தொகுப்பு",
+ "rcfilters-filter-major-label": "சிறுமையில்லா தொகுப்புகள்",
+ "rcfilters-filtergroup-watchlist": "பார்க்கப்படும் பக்கங்கள்",
"rcfilters-filtergroup-changetype": "மாற்ற வகை",
"rcfilters-filter-pageedits-label": "பக்க தொகுப்புகள்",
"rcfilters-filter-newpages-label": "பக்க உருவாக்கங்கள்",
+ "rcfilters-filtergroup-lastRevision": "அண்மைய திருத்தங்கள்",
"rcfilters-filter-lastrevision-label": "அண்மைய திருத்தம்",
+ "rcfilters-filter-excluded": "தவிர்க்கப்பட்டது",
"rcnotefrom": "கீழே காணப்படுவது <strong>$3, $4</strong> இலிருந்து செய்யப்பட்ட (<strong>$1</strong> வரைக் காட்டப்பட்டுள்ளது) {{PLURAL:$5|மாற்றமாகும்.|மாற்றங்களாகும்.}}",
"rclistfrom": "$2, $3 முதல் இன்று வரை செய்யப்பட்ட புதிய மாற்றங்களைக் காட்டவும்",
"rcshowhideminor": "சிறிய தொகுப்புகளை $1",
"upload-copy-upload-invalid-domain": "இந்தக் களத்தில் இருந்து படியெடுத்துப் பதிவேற்றம் செய்யும் வசதி கிடையாது.",
"upload-dialog-title": "கோப்பைப் பதிவேற்று",
"upload-dialog-button-cancel": "ரத்து செய்",
+ "upload-dialog-button-back": "பின் செல்",
"upload-dialog-button-done": "முடிந்தது",
"upload-dialog-button-save": "சேமி",
"upload-dialog-button-upload": "பதிவேற்று",
"uploadstash-badtoken": "அந்த செயலுக்கான நடவடிக்கை தோல்வியடைந்தது, ஒருவேளை ஏனென்றால் உங்கள் திருத்த அறிமுகசான்றுகள் காலாவதியாகிவிட்டது. மீண்டும் முயற்சி செய்.",
"uploadstash-errclear": "கோப்புகளை சரிசெய்தல் (Clearing) தோல்வியடைந்து விட்டது.",
"uploadstash-refresh": "கோப்புகள் உள்ள பட்டியலை புதுப்பி",
+ "uploadstash-thumbnail": "நகப்படத்தை காட்டுக",
+ "uploadstash-bad-path": "வழி இடம்பெறவில்லை",
+ "uploadstash-bad-path-invalid": "வழி செல்லத்தாகது",
+ "uploadstash-file-not-found-no-thumb": "நகப்படத்தை பெறமுடியவில்லை",
+ "uploadstash-zero-length": "கோப்பின் நீளம் சுழியம்",
"invalid-chunk-offset": "செல்லாத chunk offset",
"img-auth-accessdenied": "அனுமதி மறுக்கப்பட்டது",
"img-auth-nopathinfo": "PATH_INFO காணவில்லை.\nஉங்கள் வழங்கி இந்தத் தகவலை அனுப்ப அமைக்கப்படவில்லை\nஇது சிஜிஐ (CGI)- அடிப்படையிலானதாகவோ img_auth-ஐ ஆதரக்காததாகவோ இருக்கலாம் .\nபார்க்கவும் https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
"apisandbox-reset": "வெறுமையாக்கு",
"apisandbox-retry": "மறு முயற்சி செய்",
"apisandbox-examples": "உதாரணங்கள்",
+ "apisandbox-add-multi": "சேர்",
"apisandbox-results": "முடிவுகள்",
"apisandbox-sending-request": "API வேண்டுகோள் அனுப்பப்படுகிறது...",
"apisandbox-loading-results": "API முடிவுகள் பெறப்படுகின்றன...",
"listgrouprights-namespaceprotection-header": "பெயர்வெளி கட்டுப்பாடு",
"listgrouprights-namespaceprotection-namespace": "பெயர்வெளி",
"listgrouprights-namespaceprotection-restrictedto": "பயனரை திருத்த அனுமதிக்கும் உரிமை(கள்)",
+ "listgrants": "நல்கைகள்",
"listgrants-grant": "நல்கை",
"listgrants-rights": "அணுக்கங்கள்",
"trackingcategories": "பகுப்புகளை தடமறி",
"dellogpage": "நீக்கல் பதிவு",
"dellogpagetext": "கீழே காணப்படுவது மிக அண்மைய நீக்கல்களின் அட்டவணையாகும்.",
"deletionlog": "நீக்கல் பதிவு",
+ "log-name-create": "பக்க உருவாக்க குறிப்பு",
"reverted": "முன் திருத்தத்துக்கு முன்நிலையாக்கப்பட்டது",
"deletecomment": "காரணம்:",
"deleteotherreason": "வேறு மேலதிக காரணம்:",
"unblocked-id": "$1 தடை நீக்கப்பட்டது",
"unblocked-ip": "[[Special:Contributions/$1|$1]] முடக்கப்பட்டார்.",
"blocklist": "தடைசெய்யப்பட்ட பயனர்கள்",
+ "autoblocklist": "தன்னியக்கத் தடை",
+ "autoblocklist-submit": "தேடுக",
+ "autoblocklist-legend": "தானியக்க தடைகளை பட்டியலிடுக",
"ipblocklist": "தடைசெய்யப்பட்ட பயனர்கள்",
"ipblocklist-legend": "தடுக்கப்பட்ட பயனரொருவரைத் தேடு",
"blocklist-userblocks": "கணக்கு தடுப்புகளை மறை",
"readonlywarning": "<strong>Кисәтү: мәгълүматлар базасында техник эшләр башкарыла, сезнең үзгәртүләр хәзер үк саклана алмый.</strong>\nБез сезгә әлеге текстны, югалмас өчен, берәр файлга сакларга тәкъдим итәбез.\n\nМәгълүматлар базасын япкан идарәче күрсәткән сәбәп: $1",
"protectedpagewarning": "'''Кисәтү: сез бу битне үзгәртә алмыйсыз, бу хокукка идарәчеләр гына ия.'''\nТүбәндә көндәлекнең соңгы язуы бирелгән:",
"semiprotectedpagewarning": "<strong>Кисәтү:</strong> бу бит якланган. Аны авторасланган кулланучылар гына үзгәртә ала.\nАста бу битнең күзәтү көндәлегендә булган соңгы язмасы бирелгән:",
- "cascadeprotectedwarning": "<strong>Кисәтү:</strong> Бу битне идарәчеләр гына үзгәртә ала., чөнки бит {{PLURAL:$1|каскадлы яклау исемлегенә кертелгән}}:",
+ "cascadeprotectedwarning": "<strong>Кисәтү:</strong> Бу бит якланган һәм аны бары [[Special:ListGroupRights|махсус вәкаләтләре]] булган кулланучылар гына үзгәртә ала, чөнки бит {{PLURAL:$1|каскадлы яклау исемлегенә кертелгән}}:",
"titleprotectedwarning": "'''Кисәтү: Мондый исемле бит якланган, аны үзгәртү өчен [[Special:ListGroupRights|тиешле хокукка]] ия булу зарур.'''\nАста күзәтү көндәлегендәге соңгы язма бирелгән:",
"templatesused": "Бу биттә кулланылган {{PLURAL:$1|1=калып|калыплар}} :",
"templatesusedpreview": "Алдан карау мөмкинлегендә кулланылган {{PLURAL:$1|1=калып|калыплар}}:",
"diff-multi-otherusers": "({{PLURAL:$2|Башка бер кулланучының|$2 кулланучының}} {{PLURAL:$1|бер арадаш юрамасы|$1 арадаш юрамасы}} күрсәтелмәгән)",
"diff-multi-manyusers": "($2 күбрәк {{PLURAL:$2|кулланучының|кулланучының}} {{PLURAL:$1|Бер арадаш юрамасы|$1 арадаш юрамасы}} күрсәтелмәгән)",
"searchresults": "Эзләү нәтиҗәләре",
+ "search-filter-title-prefix-reset": "Барлык битләрне эзләү",
"searchresults-title": "«$1» өчен эзләү нәтиҗәләре",
"titlematches": "Бит исемнәрендә тиңдәшлек",
"textmatches": "Бит эчтәлегендә тиңдәшлек",
"search-category": "($1 категориясе)",
"search-file-match": "(файл эчтәлеге белән туры килә)",
"search-suggest": "Бәлки, сез моны эзлисез: $1",
+ "search-rewritten": "$1 нәтижәсе күрсәтелгән. $2 урынына эзләргә.",
"search-interwiki-caption": "Тугандаш проектлар нәтиҗәсе",
"search-interwiki-default": "$1 нәтиҗә:",
"search-interwiki-more": "(тагын)",
"prefs-editwatchlist-clear": "Күзәтү исемлеген чистарту",
"prefs-watchlist-days": "Күзәтү исемлегендә күрсәтелгән көннәр саны:",
"prefs-watchlist-days-max": "Иң күбе $1 {{PLURAL:$1|1=көн|көн}}",
- "prefs-watchlist-edits": "Киңәйтелгән күзәтү исемлегендә күрсәтелүче төзәтмәләрнең максималь саны:",
+ "prefs-watchlist-edits": "Күзәтү исемлегендә күрсәтелүче төзәтмәләрнең максималь саны:",
"prefs-watchlist-edits-max": "Иң күбе: 1000",
"prefs-watchlist-token": "Күзәтү исемлеге токены:",
"prefs-watchlist-managetokens": "Токеннар беләр идарә итү",
"stub-threshold-disabled": "Сүнгән",
"recentchangesdays": "Соңгы үзгәртүләрне күрсәтүче көннәр саны:",
"recentchangesdays-max": "(иң күбе $1 {{PLURAL:$1|көн}})",
- "recentchangescount": "Төп буларак кулланучы үзгәртүләр саны:",
+ "recentchangescount": "Төп буларак кулланучы соңгы үзгәртүләр исемелегендә, тарихта һәм көндәлектә булган үзгәртүләр саны:",
"prefs-help-recentchangescount": "Иң күбе: 1000",
"prefs-help-watchlist-token2": "Бу сезнең кузәтү исемлеге өчен ясалган веб-агымының серле ачкычы.\nАны белгән һәркем сезнең күзәтү исемлегегезне карый ала, шуңа да башкаларга аны күрсәтмәгез. [[Special:ResetTokens|Ачкычны ташларга теләсәгез, әлеге юрамага басыгыз]].",
"savedprefs": "Көйләнмәләрегез сакланды.",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (шулай ук [[Special:NewPages|яңа битләр исемлеген]] карагыз)",
"recentchanges-submit": "Күрсәт",
"rcfilters-legend-heading": "<strong>Кыскартулар тезмәсе: </strong>",
+ "rcfilters-group-results-by-page": "Нәтиҗәләрне биттә төркемләргә",
"rcfilters-activefilters": "Актив фильтрлар",
"rcfilters-activefilters-hide": "Яшер",
"rcfilters-activefilters-show": "Күрсәт",
"rcfilters-limit-title": "Күрсәтү өчен үзгәртүләр",
+ "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|үзгәртү}}, $2",
+ "rcfilters-date-popup-title": "Эзләү өчен вакыт аралыгы",
"rcfilters-days-title": "Соңгы көннәр",
"rcfilters-hours-title": "Соңгы сәгатьләр",
"rcfilters-days-show-days": "$1 {{PLURAL:$1|көн}}",
"rcfilters-filter-user-experience-level-unregistered-label": "Теркәлмәгәннәр",
"rcfilters-filter-user-experience-level-unregistered-description": "Системага кермәгән мөхәррирләр.",
"rcfilters-filter-user-experience-level-newcomer-label": "Яңа кулланучылар",
+ "rcfilters-filter-user-experience-level-learner-label": "Укучылар",
"rcfilters-filter-user-experience-level-experienced-label": "Тәҗрибәле кулланучылар",
"rcfilters-filter-user-experience-level-experienced-description": "Төзәтүләре 500 дән күбрәк һәм актив эш көннәре 30 дан артык теркәлгән мөхәррирләр",
"rcfilters-filtergroup-automated": "Автоматлаштырылган кертем",
"filehist-dimensions": "ⵉⵎⵏⴰⴷⵏ",
"filehist-comment": "ⴰⵖⴼⴰⵡⴰⵍ",
"imagelinks": "ⴰⵙⵎⵔⵙ ⵏ ⵓⴼⴰⵢⵍⵓ",
- "linkstoimage": "{{PLURAL:$1|âµ\89ⵣⴷⴰⵢâµ\8f âµ\8f âµ\9câµ\99âµ\8fâ´°|$1 ⴰⵣⴷⴰⵢ âµ\8f âµ\9câµ\99âµ\8fâ´°}} âµ\96âµ\94 âµ\93ⴼⴰⵢⵍⵓ ⴰⴷ:",
- "linkstoimage-more": "ⵓⴳⴳⴰⵔ ⵏ {{PLURAL:$1|ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⴰⵢⴷ ⵉⵙⵙⵎⵔⴰⵙⵏ| $1 ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⵢⴷ ⵉⵙⵙⵎⵔⴰⵙⵏ}} ⴰⴼⴰⵢⵍⵓ ⴰⴷ.\nⵜⵙⴽⴰⵏ ⵜⵍⴳⴰⵎⵜ ⴰⴷ ⵖⴰⵙ {{PLURAL:$1|ⵜⴰⵙⵏⴰ ⵜⴰⵎⵣⵡⴰⵔⵓⵜ ⵉⵙⵙⵎⵔⴰⵙⵏ $1 ⵜⴰⵙⵏⵉⵡⵉⵏ ⵜⵉⵎⵣⵡⴰⵔⴰ ⵉⵙⵙⵎⵔⴰⵙⵏ}} ⴰⴼⴰⵢⵍⵓ ⴰⴷ.\nⵜⵍⵍⴰ ⵢⴰⵜ [[Special:WhatLinksHere/$2|ⵜⴰⵍⴳⴰⵎⵜ ⵉⵎⴷⵏ]].",
- "nolinkstoimage": "âµ\93âµ\94 âµ\8dâµ\8dâµ\89âµ\8fâµ\9c âµ\9câ´°âµ\99âµ\8fâµ\89ⵡâµ\89âµ\8f âµ\8fâµ\8fâ´° âµ\89âµ\87âµ\87âµ\8fâ´»âµ\8f âµ\96âµ\94 âµ\93ⴼⴰⵢⵍⵓ ⴰ.",
+ "linkstoimage": "{{PLURAL:$1|âµ\9câ´°âµ\99âµ\8fâ´° â´°â´· âµ\9câµ\99âµ\8eâµ\94âµ\99|$1 âµ\9câ´°âµ\99âµ\8fâµ\89ⵡâµ\89âµ\8f â´°â´· âµ\99âµ\8eâµ\94âµ\99âµ\8fâµ\9c}} â´°ⴼⴰⵢⵍⵓ ⴰⴷ:",
+ "linkstoimage-more": "ⵓⴳⴳⴰⵔ ⵏ {{PLURAL:$1|ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⴰⵢⴷ ⵉⵙⵙⵎⵔⴰⵙⵏ| $1 ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⵢⴷ ⵉⵙⵙⵎⵔⴰⵙⵏ}} ⴰⴼⴰⵢⵍⵓ ⴰⴷ.\nⵜⵙⴽⴰⵏ ⵜⵍⴳⴰⵎⵜ ⴰⴷ ⵖⴰⵙ {{PLURAL:$1|ⵜⴰⵙⵏⴰ ⵜⴰⵎⵣⵡⴰⵔⵓⵜ ⵉⵙⵙⵎⵔⴰⵙⵏ| $1 ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵜⵉⵎⵣⵡⴰⵔⴰ ⵉⵙⵙⵎⵔⴰⵙⵏ}} ⴰⴼⴰⵢⵍⵓ ⴰⴷ.\nⵜⵍⵍⴰ ⵢⴰⵜ [[Special:WhatLinksHere/$2|ⵜⴰⵍⴳⴰⵎⵜ ⵉⵎⴷⵏ]].",
+ "nolinkstoimage": "âµ\93âµ\94 âµ\8dâµ\8dâµ\89âµ\8fâµ\9c âµ\9câ´°âµ\99âµ\8fâµ\89ⵡâµ\89âµ\8f âµ\8fâµ\8fâ´° âµ\89âµ\99âµ\8eâµ\94âµ\99âµ\8f â´°ⴼⴰⵢⵍⵓ ⴰ.",
"linkstoimage-redirect": "$1 (ⴰⵙⵡⴰⵍⴰ ⵏ ⵓⴼⴰⵢⵍⵓ) $2",
"sharedupload-desc-here": "ⴰⵙⴷⴰⵡ ⴰⴷ ⵙⴳ $1 ⵉⵥⴹⴰⵔ ⴰ ⵉⵜⵜⵡⴰⵙⵎⵔⵙ ⴳ ⵉⵙⵏⵜⴰⵢⵏ ⵢⴰⴹⵏ.\nⴰⵙⵏⵓⵎⵎⵍ ⵏⵙ ⴳ [$2 ⵜⴰⵙⵏⴰ ⵏⵙ ⵏ ⵓⵙⵏⵓⵎⵎⵍ] ⵜⵡⴰⵙⵎⴰⵍ ⵙⴰⴷⵓ.",
"filepage-nofile": "ⵓⵔ ⵓⴼⴰⵢⵍⵓ ⵙ ⵢⵉⵙⵎ ⴰ.",
"pool-errorunknown": "不明錯誤",
"pool-servererror": "無法使用程序計數服務 ($1)。",
"poolcounter-usage-error": "用法錯誤:$1",
- "aboutsite": "關於 {{SITENAME}}",
+ "aboutsite": "關於{{SITENAME}}",
"aboutpage": "Project:關於",
"copyright": "除非另有註明,否則所有內容皆以 $1 條款授權。",
"copyrightpage": "{{ns:project}}:版權",
"Liuxinyu970226",
"Quest for Truth",
"Wxyveronica",
- "和平至上"
+ "和平至上",
+ "A2093064"
]
},
"tog-watchlisthidebots": "隱藏監視清單中機械人的編輯",
"jumpto": "跳到:",
"jumptonavigation": "導覽",
"jumptosearch": "搜尋",
- "aboutsite": "關於 {{SITENAME}}",
+ "aboutsite": "關於{{SITENAME}}",
"aboutpage": "Project:關於我們",
"disclaimers": "免責聲明",
"disclaimerpage": "本專案:一般免責聲明",
--- /dev/null
+-- Add an index to recentchanges on rc_this_oldid
+--
+-- T139012
+--
+
+CREATE INDEX /*i*/rc_this_oldid ON /*_*/recentchanges(rc_this_oldid);
\ No newline at end of file
print "Out of order: $numOutOfOrder / " . count( $headerChars ) . "\n";
global $IP;
+ $writer = new StaticArrayWriter();
file_put_contents(
"$IP/includes/collation/data/first-letters-root.php",
- wfMakeStaticArrayFile( $headerChars, 'File created by generateCollationData.php' )
+ $writer->create( $headerChars, 'File created by generateCollationData.php' )
);
echo "first-letters-root: file written.\n";
}
}
global $IP;
- file_put_contents( "$IP/languages/data/normalize-ar.php", wfMakeStaticArrayFile(
+ $writer = new StaticArrayWriter();
+ file_put_contents( "$IP/languages/data/normalize-ar.php", $writer->create(
$pairs,
'File created by generateNormalizerDataAr.php'
) );
}
global $IP;
- file_put_contents( "$IP/languages/data/normalize-ml.php", wfMakeStaticArrayFile(
+ $writer = new StaticArrayWriter();
+ file_put_contents( "$IP/languages/data/normalize-ml.php", $writer->create(
$pairs,
'File created by generateNormalizerDataMl.php'
) );
CREATE INDEX /*i*/rc_ns_actor ON /*_*/recentchanges (rc_namespace, rc_actor);
CREATE INDEX /*i*/rc_actor ON /*_*/recentchanges (rc_actor, rc_timestamp);
CREATE INDEX /*i*/rc_name_type_patrolled_timestamp ON /*_*/recentchanges (rc_namespace, rc_type, rc_patrolled, rc_timestamp);
+CREATE INDEX /*i*/rc_this_oldid ON /*_*/recentchanges (rc_this_oldid);
CREATE TABLE /*_*/watchlist (
CREATE INDEX &mw_prefix.rc_ns_actor ON &mw_prefix.recentchanges (rc_namespace, rc_actor);
CREATE INDEX &mw_prefix.rc_actor ON &mw_prefix.recentchanges (rc_actor, rc_timestamp);
CREATE INDEX &mw_prefix.recentchanges_i08 ON &mw_prefix.recentchanges (rc_namespace, rc_type, rc_patrolled, rc_timestamp);
+CREATE INDEX &mw_prefix.recentchanges_i10 ON &mw_prefix.recentchanges (rc_this_oldid);
/*$mw$*/
CREATE TRIGGER &mw_prefix.recentchanges_seq_trg BEFORE INSERT ON &mw_prefix.recentchanges
FOR EACH ROW WHEN (new.rc_id IS NULL)
'rev_id', 'rev_page', 'rev_timestamp', 'rev_user_text', 'rev_comment'
) );
+ $contLang = MediaWikiServices::getInstance()->getContentLanguage();
foreach ( $result as $row ) {
$comment = $commentStore->getComment( 'rev_comment', $row )->text;
- $contLang = MediaWikiServices::getInstance()->getContentLanguage();
if ( $comment !== '' ) {
$comment = '(' . $contLang->truncateForVisual( $comment, 40 ) . ')';
}
CREATE INDEX new_name_timestamp ON recentchanges (rc_new, rc_namespace, rc_timestamp);
CREATE INDEX rc_ip ON recentchanges (rc_ip);
CREATE INDEX rc_name_type_patrolled_timestamp ON recentchanges (rc_namespace, rc_type, rc_patrolled, rc_timestamp);
+CREATE INDEX rc_this_oldid ON recentchanges (rc_this_oldid);
CREATE SEQUENCE watchlist_wl_id_seq;
-- ApiQueryRecentChanges (T140108)
CREATE INDEX /*i*/rc_name_type_patrolled_timestamp ON /*_*/recentchanges (rc_namespace, rc_type, rc_patrolled, rc_timestamp);
+-- Article.php and friends (T139012)
+CREATE INDEX /*i*/rc_this_oldid ON /*_*/recentchanges (rc_this_oldid);
CREATE TABLE /*_*/watchlist (
wl_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
continue;
}
- $specialObj = SpecialPageFactory::getPage( $special );
+ $specialObj = MediaWikiServices::getInstance()->getSpecialPageFactory()->
+ getPage( $special );
if ( !$specialObj ) {
$this->output( "No such special page: $special\n" );
exit;
<?php
/**
- * Show profiling data.
+ * Simple interface for displaying request profile data stored in
+ * the wikis' primary database.
+ *
+ * See also https://www.mediawiki.org/wiki/Manual:Profiling.
+ *
+ * To add profiling information to the database:
+ *
+ * - set $wgProfiler['class'] in LocalSetings.php to a Profiler class other than ProfilerStub.
+ * - set $wgProfiler['output'] to 'db' to force the profiler to save its the
+ * information in the database.
+ * - apply the maintenance/archives/patch-profiling.sql patch to the database.
+ * - set $wgEnableProfileInfo to true.
*
* Copyright 2005 Kate Turner.
*
ini_set( 'zlib.output_compression', 'off' );
-$wgEnableProfileInfo = false;
require __DIR__ . '/includes/WebStart.php';
header( 'Content-Type: text/html; charset=utf-8' );
if ( !$dbr->tableExists( 'profiling' ) ) {
echo '<p>No <code>profiling</code> table exists, so we can\'t show you anything.</p>'
. '<p>If you want to log profiling data, enable <code>$wgProfiler[\'output\'] = \'db\'</code>'
- . ' in your StartProfiler.php and run <code>maintenance/update.php</code> to'
+ . ' in LocalSettings.php and run <code>maintenance/update.php</code> to'
. ' create the profiling table.'
. '</body></html>';
exit( 1 );
'scripts' => 'resources/lib/jquery/jquery.cookie.js',
'targets' => [ 'desktop', 'mobile' ],
],
- 'jquery.expandableField' => [
- 'scripts' => 'resources/src/jquery/jquery.expandableField.js',
- ],
'jquery.form' => [
'scripts' => 'resources/lib/jquery/jquery.form.js',
],
+++ /dev/null
-/**
- * This plugin provides functionality to expand a text box on focus to double it's current width
- *
- * Usage:
- *
- * Set options:
- * $('#textbox').expandableField( { option1: value1, option2: value2 } );
- * $('#textbox').expandableField( option, value );
- * Get option:
- * value = $('#textbox').expandableField( option );
- * Initialize:
- * $('#textbox').expandableField();
- *
- * Options:
- */
-( function ( $ ) {
-
- $.expandableField = {
- /**
- * Expand the field, make the callback
- *
- * @param {jQuery.Event} e Event
- * @param {Object} context
- */
- expandField: function ( e, context ) {
- context.config.beforeExpand.call( context.data.$field, context );
- context.data.$field
- .animate( { width: context.data.expandedWidth }, 'fast', function () {
- context.config.afterExpand.call( this, context );
- } );
- },
- /**
- * Condense the field, make the callback
- *
- * @param {jQuery.Event} e Event
- * @param {Object} context
- */
- condenseField: function ( e, context ) {
- context.config.beforeCondense.call( context.data.$field, context );
- context.data.$field
- .animate( { width: context.data.condensedWidth }, 'fast', function () {
- context.config.afterCondense.call( this, context );
- } );
- },
- /**
- * Sets the value of a property, and updates the widget accordingly
- *
- * @param {Object} context
- * @param {string} property Name of property
- * @param {Mixed} value Value to set property with
- */
- configure: function ( context, property, value ) {
- // TODO: Validate creation using fallback values
- context.config[ property ] = value;
- }
-
- };
-
- $.fn.expandableField = function () {
-
- // Multi-context fields
- var returnValue,
- args = arguments;
-
- $( this ).each( function () {
- var key, context, timeout;
-
- /* Construction / Loading */
-
- context = $( this ).data( 'expandableField-context' );
-
- // TODO: Do we need to check both null and undefined?
- if ( context === undefined || context === null ) {
- context = {
- config: {
- // callback function for before collapse
- beforeCondense: function () {},
-
- // callback function for before expand
- beforeExpand: function () {},
-
- // callback function for after collapse
- afterCondense: function () {},
-
- // callback function for after expand
- afterExpand: function () {},
-
- // Whether the field should expand to the left or the right -- defaults to left
- expandToLeft: true
- }
- };
- }
-
- /* API */
- // Handle various calling styles
- if ( args.length > 0 ) {
- if ( typeof args[ 0 ] === 'object' ) {
- // Apply set of properties
- for ( key in args[ 0 ] ) {
- $.expandableField.configure( context, key, args[ 0 ][ key ] );
- }
- } else if ( typeof args[ 0 ] === 'string' ) {
- if ( args.length > 1 ) {
- // Set property values
- $.expandableField.configure( context, args[ 0 ], args[ 1 ] );
-
- // TODO: Do we need to check both null and undefined?
- } else if ( returnValue === null || returnValue === undefined ) {
- // Get property values, but don't give access to internal data - returns only the first
- returnValue = ( args[ 0 ] in context.config ? undefined : context.config[ args[ 0 ] ] );
- }
- }
- }
-
- /* Initialization */
-
- if ( context.data === undefined ) {
- context.data = {
- // The width of the field in it's condensed state
- condensedWidth: $( this ).width(),
-
- // The width of the field in it's expanded state
- expandedWidth: $( this ).width() * 2,
-
- // Reference to the field
- $field: $( this )
- };
-
- $( this )
- .addClass( 'expandableField' )
- .focus( function ( e ) {
- clearTimeout( timeout );
- $.expandableField.expandField( e, context );
- } )
- .blur( function ( e ) {
- timeout = setTimeout( function () {
- $.expandableField.condenseField( e, context );
- }, 250 );
- } );
- }
- // Store the context for next time
- $( this ).data( 'expandableField-context', context );
- } );
- return returnValue !== undefined ? returnValue : $( this );
- };
-
-}( jQuery ) );
* $( '#textbox' ).suggestions( { option1: value1, option2: value2 } );
* $( '#textbox' ).suggestions( option, value );
*
- * Get option:
- *
- * value = $( '#textbox' ).suggestions( option );
- *
* Initialize:
*
* $( '#textbox' ).suggestions();
// See file header for method documentation
$.fn.suggestions = function () {
-
// Multi-context fields
- var returnValue,
- args = arguments;
+ var args = arguments;
$( this ).each( function () {
var context, key;
if ( args.length > 1 ) {
// Set property values
$.suggestions.configure( context, args[ 0 ], args[ 1 ] );
- } else if ( returnValue === null || returnValue === undefined ) {
- // Get property values, but don't give access to internal data - returns only the first
- returnValue = ( args[ 0 ] in context.config ? undefined : context.config[ args[ 0 ] ] );
}
}
}
// Store the context for next time
$( this ).data( 'suggestions-context', context );
} );
- return returnValue !== undefined ? returnValue : $( this );
+ return this;
};
/**
// Update tooltip for the access key after inserting into DOM
// to get a localized access key label (T69946).
- $link.updateTooltipAccessKeys();
+ if ( accesskey ) {
+ $link.updateTooltipAccessKeys();
+ }
return $item[ 0 ];
},
* @return MediaWikiServices
* @throws MWException
*/
- protected function overrideMwServices( Config $configOverrides = null, array $services = [] ) {
+ protected static function overrideMwServices(
+ Config $configOverrides = null, array $services = []
+ ) {
if ( !$configOverrides ) {
$configOverrides = new HashConfig();
}
* @covers ContentSecurityPolicy::isNonceRequired
*/
public function testCSPIsEnabled( $main, $reportOnly, $expected ) {
- global $wgCSPReportOnlyHeader, $wgCSPHeader;
- global $wgCSPHeader;
- $oldReport = wfSetVar( $wgCSPReportOnlyHeader, $reportOnly );
- $oldMain = wfSetVar( $wgCSPHeader, $main );
+ $this->setMwGlobals( 'wgCSPReportOnlyHeader', $reportOnly );
+ $this->setMwGlobals( 'wgCSPHeader', $main );
$res = ContentSecurityPolicy::isNonceRequired( RequestContext::getMain()->getConfig() );
- wfSetVar( $wgCSPReportOnlyHeader, $oldReport );
- wfSetVar( $wgCSPHeader, $oldMain );
$this->assertEquals( $res, $expected );
}
$this->originalHandlers = TestingAccessWrapper::newFromClass( Hooks::class )->handlers;
TestingAccessWrapper::newFromClass( Hooks::class )->handlers = [];
- SpecialPageFactory::resetList();
+ $this->overrideMwServices();
}
public function tearDown() {
TestingAccessWrapper::newFromClass( Hooks::class )->handlers = $this->originalHandlers;
- SpecialPageFactory::resetList();
+ $this->overrideMwServices();
}
protected function searchProvision( array $results = null ) {
<?php
+use MediaWiki\MediaWikiServices;
+
/**
* @group API
* @group medium
public function testSpecialPageAliases() {
$this->assertCount(
- count( SpecialPageFactory::getNames() ),
+ count( MediaWikiServices::getInstance()->getSpecialPageFactory()->getNames() ),
$this->doQuery( 'specialpagealiases' )
);
}
+++ /dev/null
-<?php
-
-/**
- * Checks that all API query modules, core and extensions, have unique prefixes.
- *
- * @group API
- */
-class PrefixUniquenessTest extends MediaWikiTestCase {
-
- public function testPrefixes() {
- $main = new ApiMain( new FauxRequest() );
- $query = new ApiQuery( $main, 'foo', 'bar' );
- $moduleManager = $query->getModuleManager();
-
- $modules = $moduleManager->getNames();
- $prefixes = [];
-
- foreach ( $modules as $name ) {
- $module = $moduleManager->getModule( $name );
- $class = get_class( $module );
-
- $prefix = $module->getModulePrefix();
- if ( $prefix !== '' && isset( $prefixes[$prefix] ) ) {
- $this->fail( "Module prefix '{$prefix}' is shared between {$class} and {$prefixes[$prefix]}" );
- }
- $prefixes[$module->getModulePrefix()] = $class;
- }
- $this->assertTrue( true ); // dummy call to make this test non-incomplete
- }
-}
[
// Regression test for T201606.
// Must not break between 'return' and Expression.
- // FIXME: Cause?
+ // Was caused by bad state after a ternary in the expression value
+ // for a key in an object literal.
<<<JAVASCRIPT
call( {
key: 1 ? 0 : function () {
'(',
')',
'{',
- 'return', 'this', // FIXME
+ 'return this',
';',
'}',
'}',
--- /dev/null
+<?php
+/**
+ * Copyright (C) 2018 Kunal Mehta <legoktm@member.fsf.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+use Wikimedia\StaticArrayWriter;
+
+/**
+ * @covers \Wikimedia\StaticArrayWriter
+ */
+class StaticArrayWriterTest extends PHPUnit\Framework\TestCase {
+ public function testCreate() {
+ $data = [
+ 'foo' => 'bar',
+ 'baz' => 'rawr',
+ "they're" => '"quoted properly"',
+ ];
+ $writer = new StaticArrayWriter();
+ $actual = $writer->create( $data, "Header\nWith\nNewlines" );
+ $expected = <<<PHP
+<?php
+// Header
+// With
+// Newlines
+return [
+ 'foo' => 'bar',
+ 'baz' => 'rawr',
+ 'they\'re' => '"quoted properly"',
+];
+
+PHP;
+ $this->assertSame( $expected, $actual );
+ }
+}
--- /dev/null
+<?php
+
+use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
+
+/**
+ * @covers PrefixingStatsdDataFactoryProxy
+ */
+class PrefixingStatsdDataFactoryProxyTest extends PHPUnit\Framework\TestCase {
+
+ use PHPUnit4And6Compat;
+
+ public function provideMethodNames() {
+ return [
+ [ 'timing' ],
+ [ 'gauge' ],
+ [ 'set' ],
+ [ 'increment' ],
+ [ 'decrement' ],
+ [ 'updateCount' ],
+ [ 'produceStatsdData' ],
+ ];
+ }
+
+ /**
+ * @dataProvider provideMethodNames
+ */
+ public function testPrefixingAndPassthrough( $method ) {
+ /** @var StatsdDataFactoryInterface|PHPUnit_Framework_MockObject_MockObject $innerFactory */
+ $innerFactory = $this->getMock(
+ \Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface::class
+ );
+ $innerFactory->expects( $this->once() )
+ ->method( $method )
+ ->with( 'testprefix.' . 'metricname' );
+
+ $proxy = new PrefixingStatsdDataFactoryProxy( $innerFactory, 'testprefix' );
+ // 1,2,3,4 simply makes sure we provide enough parameters, without caring what they are
+ $proxy->$method( 'metricname', 1, 2, 3, 4 );
+ }
+
+ /**
+ * @dataProvider provideMethodNames
+ */
+ public function testPrefixIsTrimmed( $method ) {
+ /** @var StatsdDataFactoryInterface|PHPUnit_Framework_MockObject_MockObject $innerFactory */
+ $innerFactory = $this->getMock(
+ \Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface::class
+ );
+ $innerFactory->expects( $this->once() )
+ ->method( $method )
+ ->with( 'testprefix.' . 'metricname' );
+
+ $proxy = new PrefixingStatsdDataFactoryProxy( $innerFactory, 'testprefix...' );
+ // 1,2,3,4 simply makes sure we provide enough parameters, without caring what they are
+ $proxy->$method( 'metricname', 1, 2, 3, 4 );
+ }
+
+}
$this->originalHandlers = TestingAccessWrapper::newFromClass( Hooks::class )->handlers;
TestingAccessWrapper::newFromClass( Hooks::class )->handlers = [];
- SpecialPageFactory::resetList();
+ $this->overrideMwServices();
}
public function tearDown() {
TestingAccessWrapper::newFromClass( Hooks::class )->handlers = $this->originalHandlers;
- SpecialPageFactory::resetList();
+ $this->overrideMwServices();
}
protected function searchProvision( array $results = null ) {
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
- * @covers SpecialPageFactory
+ * @covers \MediaWiki\Special\SpecialPageFactory
* @group SpecialPage
*/
class SpecialPageFactoryTest extends MediaWikiTestCase {
-
- protected function tearDown() {
- parent::tearDown();
-
- SpecialPageFactory::resetList();
- }
-
- public function testResetList() {
- SpecialPageFactory::resetList();
- $this->assertContains( 'Specialpages', SpecialPageFactory::getNames() );
- }
-
public function testHookNotCalledTwice() {
$count = 0;
$this->mergeMwGlobalArrayValue( 'wgHooks', [
$count++;
}
] ] );
- SpecialPageFactory::resetList();
- SpecialPageFactory::getNames();
- SpecialPageFactory::getNames();
+ $this->overrideMwServices();
+ $spf = MediaWikiServices::getInstance()->getSpecialPageFactory();
+ $spf->getNames();
+ $spf->getNames();
$this->assertEquals( 1, $count );
}
*/
public function testGetPage( $spec, $shouldReuseInstance ) {
$this->mergeMwGlobalArrayValue( 'wgSpecialPages', [ 'testdummy' => $spec ] );
- SpecialPageFactory::resetList();
+ $this->overrideMwServices();
$page = SpecialPageFactory::getPage( 'testdummy' );
$this->assertInstanceOf( SpecialPage::class, $page );
*/
public function testGetNames() {
$this->mergeMwGlobalArrayValue( 'wgSpecialPages', [ 'testdummy' => SpecialAllPages::class ] );
- SpecialPageFactory::resetList();
+ $this->overrideMwServices();
$names = SpecialPageFactory::getNames();
$this->assertInternalType( 'array', $names );
*/
public function testResolveAlias() {
$this->setContentLang( 'de' );
- SpecialPageFactory::resetList();
+ $this->overrideMwServices();
list( $name, $param ) = SpecialPageFactory::resolveAlias( 'Spezialseiten/Foo' );
$this->assertEquals( 'Specialpages', $name );
*/
public function testGetLocalNameFor() {
$this->setContentLang( 'de' );
- SpecialPageFactory::resetList();
+ $this->overrideMwServices();
$name = SpecialPageFactory::getLocalNameFor( 'Specialpages', 'Foo' );
$this->assertEquals( 'Spezialseiten/Foo', $name );
*/
public function testGetTitleForAlias() {
$this->setContentLang( 'de' );
- SpecialPageFactory::resetList();
+ $this->overrideMwServices();
$title = SpecialPageFactory::getTitleForAlias( 'Specialpages/Foo' );
$this->assertEquals( 'Spezialseiten/Foo', $title->getText() );
) {
$lang = clone MediaWikiServices::getInstance()->getContentLanguage();
$lang->mExtendedSpecialPageAliases = $aliasesList;
- $this->setContentLang( $lang );
$this->setMwGlobals( 'wgSpecialPages',
array_combine( array_keys( $aliasesList ), array_keys( $aliasesList ) )
);
- SpecialPageFactory::resetList();
+ $this->overrideMwServices();
+ $this->setContentLang( $lang );
// Catch the warnings we expect to be raised
$warnings = [];
}
],
] );
- SpecialPageFactory::resetList();
+ $this->overrideMwServices();
SpecialPageFactory::getLocalNameFor( 'Specialpages' );
$this->assertTrue( $called, 'Recursive call succeeded' );
}
* @author Antoine Musso
*/
+use MediaWiki\MediaWikiServices;
+
/**
* @group Database
* @covers QueryPage<extended>
$class = $page[0];
$name = $page[1];
if ( !in_array( $class, $this->manualTest ) ) {
- $this->queryPages[$class] = SpecialPageFactory::getPage( $name );
+ $this->queryPages[$class] =
+ MediaWikiServices::getInstance()->getSpecialPageFactory()->getPage( $name );
}
}
}
$ctx = new RequestContext;
$sp = Title::newFromText( 'Special:Search/foo_bar' );
- SpecialPageFactory::executePath( $sp, $ctx );
+ MediaWikiServices::getInstance()->getSpecialPageFactory()->executePath( $sp, $ctx );
$url = $ctx->getOutput()->getRedirect();
// some older versions of hhvm have a bug that doesn't parse relative
// urls with a port, so help it out a little bit.
--- /dev/null
+<?php
+
+/**
+ * Checks that all API query modules, core and extensions, have unique prefixes.
+ *
+ * @group API
+ * @coversNothing
+ */
+class ApiPrefixUniquenessTest extends MediaWikiTestCase {
+
+ public function testPrefixes() {
+ $main = new ApiMain( new FauxRequest() );
+ $query = new ApiQuery( $main, 'foo' );
+ $moduleManager = $query->getModuleManager();
+
+ $modules = $moduleManager->getNames();
+ $prefixes = [];
+
+ foreach ( $modules as $name ) {
+ $module = $moduleManager->getModule( $name );
+ $class = get_class( $module );
+
+ $prefix = $module->getModulePrefix();
+ if ( $prefix === '' /* HACK: T196962 */ || $prefix === 'wbeu' ) {
+ continue;
+ }
+
+ if ( isset( $prefixes[$prefix] ) ) {
+ $this->fail(
+ "Module prefix '{$prefix}' is shared between {$class} and {$prefixes[$prefix]}"
+ );
+ }
+ $prefixes[$module->getModulePrefix()] = $class;
+
+ if ( $module instanceof ApiQueryGeneratorBase ) {
+ // namespace with 'g', a generator can share a prefix with a module
+ $prefix = 'g' . $prefix;
+ if ( isset( $prefixes[$prefix] ) ) {
+ $this->fail(
+ "Module prefix '{$prefix}' is shared between {$class} and {$prefixes[$prefix]}" .
+ " (as a generator)"
+ );
+ }
+ $prefixes[$module->getModulePrefix()] = $class;
+ }
+ }
+ $this->assertTrue( true ); // dummy call to make this test non-incomplete
+ }
+}
<?php
+use MediaWiki\MediaWikiServices;
+
/**
* Test that runs against all registered special pages to make sure that regular
* execution of the special page does not cause a fatal error.
public static function setUpBeforeClass() {
parent::setUpBeforeClass();
- SpecialPageFactory::resetList();
+ self::overrideMwServices();
}
public static function tearDownAfterClass() {
- SpecialPageFactory::resetList();
+ self::overrideMwServices();
parent::tearDownAfterClass();
}
public function provideSpecialPages() {
$specialPages = [];
- foreach ( SpecialPageFactory::getNames() as $name ) {
- $specialPages[$name] = [ SpecialPageFactory::getPage( $name ) ];
+ $spf = MediaWikiServices::getInstance()->getSpecialPageFactory();
+ foreach ( $spf->getNames() as $name ) {
+ $specialPages[$name] = [ $spf->getPage( $name ) ];
}
return $specialPages;
}