From: jenkins-bot Date: Wed, 13 Aug 2014 16:41:49 +0000 (+0000) Subject: Merge "EditPage::newSectionSummary should return a value in all code paths" X-Git-Tag: 1.31.0-rc.0~14459 X-Git-Url: http://git.cyclocoop.org//%22javascript:ModifierStyle%28%27%22.%24id.%22%27%29/%22?a=commitdiff_plain;h=e173358375ba68a5bbbc1cbe97ad3f6ea25ca813;hp=b62f3428dea55d15f5f867b3b488a00515505fdf;p=lhc%2Fweb%2Fwiklou.git Merge "EditPage::newSectionSummary should return a value in all code paths" --- diff --git a/.travis.yml b/.travis.yml index dedb4e14a7..6e07653321 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,7 @@ language: php php: - hhvm-nightly + - 5.3 services: - mysql @@ -42,6 +43,7 @@ notifications: irc: channels: - "chat.freenode.net#mediawiki-core" + - "chat.freenode.net#mediawiki-feed" on_success: change on_failure: change skip_join: true diff --git a/RELEASE-NOTES-1.24 b/RELEASE-NOTES-1.24 index ec4bc0fa0c..8952863cc1 100644 --- a/RELEASE-NOTES-1.24 +++ b/RELEASE-NOTES-1.24 @@ -45,6 +45,10 @@ production. * The UserCryptPassword and UserComparePassword hooks are no longer called. Any extensions using them must be updated to use the Password Hashing API. * $wgCompiledFiles has been removed. +* $wgSortSpecialPages was removed, the listing on Special:SpecialPages is + now always sorted. +* Users must be able to edit a page to be able to delete it. +* $wgHTCPMulticastAddress, $wgHTCPMulticastRouting and $wgHTCPPort were removed. === New features in 1.24 === * Added a new hook, "WhatLinksHereProps", to allow extensions to annotate @@ -129,9 +133,12 @@ production. * (bug 66440) The MediaWiki web installer will now allow you to choose the skins to enable (from the ones included in download tarball) and decide which one should be the default. -* (bug 68085) Links of the form [[localInterwikiPrefix:languageCode:pageTitle]], +* (bug 68085, 68802) Links like [[localInterwikiPrefix:languageCode:pageTitle]], where localInterwikiPrefix is a member of the $wgLocalInterwikis array, will - no longer be displayed in the sidebar when $wgInterwikiMagic is true. + no longer be displayed in the sidebar when $wgInterwikiMagic is true. In a + similar way, links like [[localInterwikiPrefix:File:Image.png]] and + [[localInterwikiPrefix:Category:Hello]] will now render as regular links, and + will not include the file or add the page to the category. * New special page, MyLanguages, to redirect users to subpages with localised versions of a page. (Integrated from Extension:Translate) * MediaWiki now supports multiple password types, including bcrypt and PBKDF2. @@ -141,8 +148,13 @@ production. the $wgResourceModuleSkinStyles global. See the Vector skin for examples. * (bug 4488) There is now a preference to watch pages where the user has rollbacked an edit by default. +* (bug 15484) Users will now be redirected to the login page when they need to + log in, rather than being shown a page asking them to log in and having to click + another link to actually get to the login page. +* A JSONContent and JSONContentHandler were added for extensions to extend. === Bug fixes in 1.24 === +* (bug 50572) MediaWiki:Blockip should support gender * (bug 49116) Footer copyright notice is now always displayed in user language rather than content language (same as copyright notice for editing interface). * (bug 62258) A bug was fixed in File::getUnscaledThumb when a height @@ -196,6 +208,18 @@ production. * (bug 60734) Actions that use ApiPageSet (e.g. purge, watch, setnotificationtimestamp) will now include continuation information when using a generator. +* $wgAPIModules (and the related $wgAPIFormatModules, $wgAPIMetaModules, + $wgAPIPropModules, and $wgAPIListModules settings) now allow API modules + to be specified using a "module spec" array instead of a plain class name. + A "module spec" is an associative array containing at least the 'class' key + for the module's class, and optionally a 'factory' key for the factory function + to use for the module. This is intended for extensions that want control over + the instantiation of their API modules, to allow for proper dependency + injection. +* Removed 'props' and 'errors' from action=paraminfo, as they have extremely + limited use and are generally inaccurate, unmaintained, and impossible to + properly maintain. Also removed the corresponding methods from ApiBase and + the 'APIGetPossibleErrors' and 'APIGetResultProperties' hooks. === Languages updated in 1.24 === @@ -291,6 +315,11 @@ changes to languages because of Bugzilla reports. setPreloadedText() from EditPage.php. (deprecated since 1.21) * Removed global functions wfArrayLookup(), wfArrayMerge(), wfDebugDieBacktrace() and wfTime(). (deprecated since 1.22) +* Microsoft Internet Explorer 6 is now a "grade C" browser, meaning that + JavaScript is no longer executed in this browser. The IEFixes script, which + existed purely to provide support for MSIE versions below 7 and which was + conditionally loaded for those browsers, was also removed. +* Action::checkCanExecute() no longer has a return value. ==== Renamed classes ==== * CLDRPluralRuleConverter_Expression to CLDRPluralRuleConverterExpression diff --git a/docs/hooks.txt b/docs/hooks.txt index 25f5ad88f6..31590ae9f4 100644 --- a/docs/hooks.txt +++ b/docs/hooks.txt @@ -393,16 +393,6 @@ descriptions. &$module: ApiBase Module object &$desc: Array of parameter descriptions -'APIGetResultProperties': Use this hook to modify the properties in a module's -result. -&$module: ApiBase Module object -&$properties: Array of properties - -'APIGetPossibleErrors': Use this hook to modify the module's list of possible -errors. -$module: ApiBase Module object -&$possibleErrors: Array of possible errors - 'APIQueryAfterExecute': After calling the execute() method of an action=query submodule. Use this to extend core API modules. &$module: Module object @@ -2148,7 +2138,7 @@ $oldSessionID: old session id $newSessionID: new session id 'ResourceLoaderGetConfigVars': Called at the end of -ResourceLoaderStartUpModule::getConfig(). Use this to export static +ResourceLoaderStartUpModule::getConfigSettings(). Use this to export static configuration variables to JavaScript. Things that depend on the current page or request state must be added through MakeGlobalVariablesScript instead. &$vars: array( variable name => value ) @@ -2364,11 +2354,6 @@ $dummy: Called when SkinTemplateToolboxEnd is used from a BaseTemplate skin, dummy parameter with "$dummy=false" in their code and return without echoing any HTML to avoid creating duplicate toolbox items. -'SkinVectorStyleModules': Called when defining the list of module styles to be -loaded by the Vector skin. -$skin: SkinVector object -&$styles: Array of module names whose style will be loaded for the skin - 'SoftwareInfo': Called by Special:Version for returning information about the software. $software: The array of software in format 'name' => 'version'. See @@ -2734,11 +2719,11 @@ string &$error: output: message key for message to show if upload canceled by returning false. May also be an array, where the first element is the message key and the remaining elements are used as parameters to the message. -'UploadVerifyFile': extra file verification, based on mime type, etc. Preferred +'UploadVerifyFile': extra file verification, based on MIME type, etc. Preferred in most cases over UploadVerification. object $upload: an instance of UploadBase, with all info about the upload -string $mime: The uploaded file's mime type, as detected by MediaWiki. Handlers - will typically only apply for specific mime types. +string $mime: The uploaded file's MIME type, as detected by MediaWiki. Handlers + will typically only apply for specific MIME types. object &$error: output: true if the file is valid. Otherwise, an indexed array representing the problem with the file, where the first element is the message key and the remaining elements are used as parameters to the message. diff --git a/docs/kss/Makefile b/docs/kss/Makefile index 7d2ee3be97..ff735d5180 100644 --- a/docs/kss/Makefile +++ b/docs/kss/Makefile @@ -1,8 +1,6 @@ MEDIAWIKI_LOAD_URL ?= http://localhost/w/load.php -kss: nodecheck -# FIXME: Use more up-to-date Ruby version - +kss: kssnodecheck # Generates CSS of mediawiki.ui and mediawiki.ui.button using ResourceLoader, then applies it to the # KSS style guide $(eval KSS_RL_TMP := $(shell mktemp /tmp/tmp.XXXXXXXXXX)) @@ -15,5 +13,5 @@ kssopen: kss @command -v xdg-open >/dev/null 2>&1 || { open ${PWD}/static/index.html; exit 0; } @xdg-open ${PWD}/static/index.html -nodecheck: - @scripts/nodecheck.sh +kssnodecheck: + @scripts/kss-node-check.sh diff --git a/docs/kss/scripts/kss-node-check.sh b/docs/kss/scripts/kss-node-check.sh new file mode 100755 index 0000000000..84ee1c4e5a --- /dev/null +++ b/docs/kss/scripts/kss-node-check.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +if command -v npm > /dev/null ; then + npm install +else + # If npm isn't installed, but kss-node is, exit normally. + # This allows setting it up on one machine, and running it on + # another (e.g. Tools Labs execution nodes) that doesn't have npm + # installed. However, "npm install" still needs to be run + # occasionally to keep kss updated. + + KSS_NODE="${BASH_SOURCE%/*}/../node_modules/.bin/kss-node" + if ! [ -x "$KSS_NODE" ] ; then + echo "Neither kss-node nor npm are installed." + echo "To install npm, see http://nodejs.org/" + echo "When npm is installed, the Makefile can automatically" + echo "install kss-node." + exit 1 + fi +fi diff --git a/docs/kss/scripts/nodecheck.sh b/docs/kss/scripts/nodecheck.sh deleted file mode 100755 index 3ee0f8346b..0000000000 --- a/docs/kss/scripts/nodecheck.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -if command -v npm > /dev/null ; then - npm install -else - echo "You need to install Node.JS!" - echo "See http://nodejs.org/" - exit 1 -fi diff --git a/docs/kss/styleguide-template/public/kss.less b/docs/kss/styleguide-template/public/kss.less index 9e850a3c34..f5ddff1253 100644 --- a/docs/kss/styleguide-template/public/kss.less +++ b/docs/kss/styleguide-template/public/kss.less @@ -1,3 +1,20 @@ + +.container { + width: 100%; +} + +nav { + display: none; +} + +article { + .example { + blockquote { + margin-top: 20px; + } + } +} + body { margin: 0; padding: 0; @@ -13,7 +30,6 @@ body { } .container { - width: 960px; margin: 0 auto; display: -webkit-flex; display: flex; @@ -76,7 +92,6 @@ nav { article { -webkit-flex: 1; flex: 1; - margin-left: 30px; h1, h2, h3, h4, h5, h6, p { margin-left: 20px; @@ -101,7 +116,6 @@ article { background: #f8f8f8; padding: 20px; color: #999; - width: 338px; word-wrap: break-word; // word-wrap in pre not affecting Firefox, so add white-space. white-space: pre-wrap; @@ -116,25 +130,44 @@ article { display: block; margin: 0; margin-left: 20px; - min-width: 360px; } } } -@media (max-width: 960px) { - .container { - width: 100%; +@media (min-width: 768px) { + nav { + display: block; + width: 100px; } + @columnWidth: (768px - 100px ) / 2; + .example { + pre, + blockquote { + width: @columnWidth; + } + } +} + +@media (min-width: 980px) { nav { - display: none; + width: auto; } article { - .example { - blockquote { - margin-top: 20px; - } + margin-left: 30px; + } + + .container { + width: 980px; + } + + .example { + pre { + width: 338px; + } + blockquote { + width: auto; } } } diff --git a/docs/uidesign/confirmable.html b/docs/uidesign/confirmable.html new file mode 100644 index 0000000000..d03582143b --- /dev/null +++ b/docs/uidesign/confirmable.html @@ -0,0 +1,147 @@ + + + + + + + + + + + +

Introduction

+ +

The jquery.confirmable module provides a simple inline confirmation script for potentially destructive or uncancellable actions.

+ +

Possible uses include confirmable "rollback" links in histories, confirmable "unwatch" links on watchlists, or confirmable "thanks" links (provided by the Echo extension).

+ +

Shown below is a demo of how each of those could work on history and watchlist entries, in an LTR and RTL language. The enhanced links are highlighted in blue.

+ +

Examples

+ +

LTR (English)

+ +

Watchlist:

+ + + +

History:

+ + + + + +

RTL (Hebrew)

+ + +

Watchlist:

+ + + +

History:

+ + + + + + + + diff --git a/images/README b/images/README index ca30bbcbae..e6d6c118d5 100644 --- a/images/README +++ b/images/README @@ -1,5 +1,2 @@ If uploads are enabled in the wiki, files will be put in subdirectories under here. - -Note to upgraders: as of MediaWiki 1.5, the images used in the user -interface have been moved to skins/common/images. diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php index 9fa0c13784..0399bd3994 100644 --- a/includes/AutoLoader.php +++ b/includes/AutoLoader.php @@ -36,7 +36,6 @@ $wgAutoloadLocalClasses = array( 'AuthPlugin' => 'includes/AuthPlugin.php', 'AuthPluginUser' => 'includes/AuthPlugin.php', 'Autopromote' => 'includes/Autopromote.php', - 'BaseTemplate' => 'includes/SkinTemplate.php', 'Block' => 'includes/Block.php', 'Category' => 'includes/Category.php', 'Categoryfinder' => 'includes/Categoryfinder.php', @@ -120,7 +119,6 @@ $wgAutoloadLocalClasses = array( 'MagicWordArray' => 'includes/MagicWord.php', 'MailAddress' => 'includes/UserMailer.php', 'MediaWiki' => 'includes/MediaWiki.php', - 'MediaWikiI18N' => 'includes/SkinTemplate.php', 'MediaWikiVersionFetcher' => 'includes/MediaWikiVersionFetcher.php', 'Message' => 'includes/Message.php', 'MessageBlobStore' => 'includes/MessageBlobStore.php', @@ -137,13 +135,12 @@ $wgAutoloadLocalClasses = array( 'PoolCounter_Stub' => 'includes/poolcounter/PoolCounter.php', 'PoolCounterRedis' => 'includes/poolcounter/PoolCounterRedis.php', 'PoolCounterWork' => 'includes/poolcounter/PoolCounterWork.php', - 'PoolCounterWorkViaCallback' => 'includes/poolcounter/PoolCounterWork.php', + 'PoolCounterWorkViaCallback' => 'includes/poolcounter/PoolCounterWorkViaCallback.php', 'PoolWorkArticleView' => 'includes/poolcounter/PoolWorkArticleView.php', 'Preferences' => 'includes/Preferences.php', 'PreferencesForm' => 'includes/Preferences.php', 'PrefixSearch' => 'includes/PrefixSearch.php', 'ProtectionForm' => 'includes/ProtectionForm.php', - 'QuickTemplate' => 'includes/SkinTemplate.php', 'RawMessage' => 'includes/Message.php', 'ReverseChronologicalPager' => 'includes/Pager.php', 'RevisionItem' => 'includes/RevisionList.php', @@ -156,8 +153,6 @@ $wgAutoloadLocalClasses = array( 'SiteConfiguration' => 'includes/SiteConfiguration.php', 'SiteStats' => 'includes/SiteStats.php', 'SiteStatsInit' => 'includes/SiteStats.php', - 'Skin' => 'includes/Skin.php', - 'SkinTemplate' => 'includes/SkinTemplate.php', 'SquidPurgeClient' => 'includes/SquidPurgeClient.php', 'SquidPurgeClientPool' => 'includes/SquidPurgeClient.php', 'StatCounter' => 'includes/StatCounter.php', @@ -213,9 +208,9 @@ $wgAutoloadLocalClasses = array( 'RevertAction' => 'includes/actions/RevertAction.php', 'RevisiondeleteAction' => 'includes/actions/RevisiondeleteAction.php', 'RollbackAction' => 'includes/actions/RollbackAction.php', - 'SubmitAction' => 'includes/actions/EditAction.php', - 'UnprotectAction' => 'includes/actions/ProtectAction.php', - 'UnwatchAction' => 'includes/actions/WatchAction.php', + 'SubmitAction' => 'includes/actions/SubmitAction.php', + 'UnprotectAction' => 'includes/actions/UnprotectAction.php', + 'UnwatchAction' => 'includes/actions/UnwatchAction.php', 'ViewAction' => 'includes/actions/ViewAction.php', 'WatchAction' => 'includes/actions/WatchAction.php', @@ -385,6 +380,8 @@ $wgAutoloadLocalClasses = array( 'CssContent' => 'includes/content/CssContent.php', 'JavaScriptContentHandler' => 'includes/content/JavaScriptContentHandler.php', 'JavaScriptContent' => 'includes/content/JavaScriptContent.php', + 'JSONContentHandler' => 'includes/content/JSONContentHandler.php', + 'JSONContent' => 'includes/content/JSONContent.php', 'MessageContent' => 'includes/content/MessageContent.php', 'MWContentSerializationException' => 'includes/content/ContentHandler.php', 'TextContentHandler' => 'includes/content/TextContentHandler.php', @@ -888,25 +885,23 @@ $wgAutoloadLocalClasses = array( 'ResourceLoaderWikiModule' => 'includes/resourceloader/ResourceLoaderWikiModule.php', # includes/revisiondelete - 'RevDelArchivedFileItem' => 'includes/revisiondelete/RevisionDelete.php', - 'RevDelArchivedFileList' => 'includes/revisiondelete/RevisionDelete.php', - 'RevDelArchivedRevisionItem' => 'includes/revisiondelete/RevisionDelete.php', - 'RevDelArchiveItem' => 'includes/revisiondelete/RevisionDelete.php', - 'RevDelArchiveList' => 'includes/revisiondelete/RevisionDelete.php', - 'RevDelFileItem' => 'includes/revisiondelete/RevisionDelete.php', - 'RevDelFileList' => 'includes/revisiondelete/RevisionDelete.php', + 'RevDelArchivedFileItem' => 'includes/revisiondelete/RevDelArchivedFileItem.php', + 'RevDelArchivedFileList' => 'includes/revisiondelete/RevDelArchivedFileList.php', + 'RevDelArchivedRevisionItem' => 'includes/revisiondelete/RevDelArchivedRevisionItem.php', + 'RevDelArchiveItem' => 'includes/revisiondelete/RevDelArchiveItem.php', + 'RevDelArchiveList' => 'includes/revisiondelete/RevDelArchiveList.php', + 'RevDelFileItem' => 'includes/revisiondelete/RevDelFileItem.php', + 'RevDelFileList' => 'includes/revisiondelete/RevDelFileList.php', 'RevDelItem' => 'includes/revisiondelete/RevisionDeleteAbstracts.php', 'RevDelList' => 'includes/revisiondelete/RevisionDeleteAbstracts.php', - 'RevDelLogItem' => 'includes/revisiondelete/RevisionDelete.php', - 'RevDelLogList' => 'includes/revisiondelete/RevisionDelete.php', - 'RevDelRevisionItem' => 'includes/revisiondelete/RevisionDelete.php', - 'RevDelRevisionList' => 'includes/revisiondelete/RevisionDelete.php', + 'RevDelLogItem' => 'includes/revisiondelete/RevDelLogItem.php', + 'RevDelLogList' => 'includes/revisiondelete/RevDelLogList.php', + 'RevDelRevisionItem' => 'includes/revisiondelete/RevDelRevisionItem.php', + 'RevDelRevisionList' => 'includes/revisiondelete/RevDelRevisionList.php', 'RevisionDeleter' => 'includes/revisiondelete/RevisionDeleter.php', 'RevisionDeleteUser' => 'includes/revisiondelete/RevisionDeleteUser.php', # includes/search - 'PostgresSearchResult' => 'includes/search/SearchPostgres.php', - 'PostgresSearchResultSet' => 'includes/search/SearchPostgres.php', 'SearchDatabase' => 'includes/search/SearchDatabase.php', 'SearchEngine' => 'includes/search/SearchEngine.php', 'SearchEngineDummy' => 'includes/search/SearchEngine.php', @@ -931,6 +926,17 @@ $wgAutoloadLocalClasses = array( 'Sites' => 'includes/site/SiteSQLStore.php', 'SiteStore' => 'includes/site/SiteStore.php', + # includes/skins + 'BaseTemplate' => 'includes/skins/SkinTemplate.php', + 'MediaWikiI18N' => 'includes/skins/SkinTemplate.php', + 'QuickTemplate' => 'includes/skins/SkinTemplate.php', + 'Skin' => 'includes/skins/Skin.php', + 'SkinException' => 'includes/skins/SkinException.php', + 'SkinFactory' => 'includes/skins/SkinFactory.php', + 'SkinFallback' => 'includes/skins/SkinFallback.php', + 'SkinFallbackTemplate' => 'includes/skins/SkinFallbackTemplate.php', + 'SkinTemplate' => 'includes/skins/SkinTemplate.php', + # includes/specialpage 'ChangesListSpecialPage' => 'includes/specialpage/ChangesListSpecialPage.php', 'FormSpecialPage' => 'includes/specialpage/FormSpecialPage.php', diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index dea6e716d5..cb8325c323 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -758,7 +758,7 @@ $wgFileBlacklist = array( 'exe', 'scr', 'dll', 'msi', 'vbs', 'bat', 'com', 'pif', 'cmd', 'vxd', 'cpl' ); /** - * Files with these mime types will never be allowed as uploads + * Files with these MIME types will never be allowed as uploads * if $wgVerifyMimeType is enabled. */ $wgMimeTypeBlacklist = array( @@ -810,7 +810,7 @@ $wgDisableUploadScriptChecks = false; $wgUploadSizeWarning = false; /** - * list of trusted media-types and mime types. + * list of trusted media-types and MIME types. * Use the MEDIATYPE_xxx constants to represent media types. * This list is used by File::isSafeFile * @@ -858,9 +858,11 @@ $wgContentHandlers = array( CONTENT_MODEL_WIKITEXT => 'WikitextContentHandler', // dumb version, no syntax highlighting CONTENT_MODEL_JAVASCRIPT => 'JavaScriptContentHandler', + // simple implementation, for use by extensions, etc. + CONTENT_MODEL_JSON => 'JSONContentHandler', // dumb version, no syntax highlighting CONTENT_MODEL_CSS => 'CssContentHandler', - // plain text, for use by extensions etc + // plain text, for use by extensions, etc. CONTENT_MODEL_TEXT => 'TextContentHandler', ); @@ -1133,45 +1135,45 @@ $wgAntivirusSetup = array( $wgAntivirusRequired = true; /** - * Determines if the mime type of uploaded files should be checked + * Determines if the MIME type of uploaded files should be checked */ $wgVerifyMimeType = true; /** - * Sets the mime type definition file to use by MimeMagic.php. + * Sets the MIME type definition file to use by MimeMagic.php. * Set to null, to use built-in defaults only. * example: $wgMimeTypeFile = '/etc/mime.types'; */ $wgMimeTypeFile = 'includes/mime.types'; /** - * Sets the mime type info file to use by MimeMagic.php. + * Sets the MIME type info file to use by MimeMagic.php. * Set to null, to use built-in defaults only. */ $wgMimeInfoFile = 'includes/mime.info'; /** - * Sets an external mime detector program. The command must print only - * the mime type to standard output. + * Sets an external MIME detector program. The command must print only + * the MIME type to standard output. * The name of the file to process will be appended to the command given here. * If not set or NULL, mime_content_type will be used if available. * * @par Example: * @code - * #$wgMimeDetectorCommand = "file -bi"; # use external mime detector (Linux) + * #$wgMimeDetectorCommand = "file -bi"; # use external MIME detector (Linux) * @endcode */ $wgMimeDetectorCommand = null; /** - * Switch for trivial mime detection. Used by thumb.php to disable all fancy + * Switch for trivial MIME detection. Used by thumb.php to disable all fancy * things, because only a few types of images are needed and file extensions * can be trusted. */ $wgTrivialMimeDetection = false; /** - * Additional XML types we can allow via mime-detection. + * Additional XML types we can allow via MIME-detection. * array = ( 'rootElement' => 'associatedMimeType' ) */ $wgXMLMimeTypes = array( @@ -2445,42 +2447,6 @@ $wgSquidPurgeUseHostHeader = true; */ $wgHTCPRouting = array(); -/** - * @deprecated since 1.22, please use $wgHTCPRouting instead. - * - * Whenever this is set and $wgHTCPRouting evaluates to false, $wgHTCPRouting - * will be set to this value. - * This is merely for back compatibility. - * - * @since 1.20 - */ -$wgHTCPMulticastRouting = null; - -/** - * HTCP multicast address. Set this to a multicast IP address to enable HTCP. - * - * Note that MediaWiki uses the old non-RFC compliant HTCP format, which was - * present in the earliest Squid implementations of the protocol. - * - * This setting is DEPRECATED in favor of $wgHTCPRouting , and kept for - * backwards compatibility only. If $wgHTCPRouting is set, this setting is - * ignored. If $wgHTCPRouting is not set and this setting is, it is used to - * populate $wgHTCPRouting. - * - * @deprecated since 1.20 in favor of $wgHTCPMulticastRouting and since 1.22 in - * favor of $wgHTCPRouting. - */ -$wgHTCPMulticastAddress = false; - -/** - * HTCP multicast port. - * @deprecated since 1.20 in favor of $wgHTCPMulticastRouting and since 1.22 in - * favor of $wgHTCPRouting. - * - * @see $wgHTCPMulticastAddress - */ -$wgHTCPPort = 4827; - /** * HTCP multicast TTL. * @see $wgHTCPRouting @@ -2926,7 +2892,7 @@ $wgWellFormedXml = true; * Normally we wouldn't have to define this in the root "" * element, but IE needs it there in some circumstances. * - * This is ignored if $wgMimeType is set to a non-XML mimetype. + * This is ignored if $wgMimeType is set to a non-XML MIME type. */ $wgXhtmlNamespaces = array(); @@ -2968,7 +2934,7 @@ $wgDefaultSkin = 'vector'; * * @since 1.24 */ -$wgFallbackSkin = 'vector'; +$wgFallbackSkin = 'fallback'; /** * Specify the names of skins that should not be presented in the list of @@ -3117,20 +3083,6 @@ $wgFooterIcons = array( */ $wgUseCombinedLoginLink = false; -/** - * Search form look for Vector skin only. - * - true = use an icon search button - * - false = use Go & Search buttons - */ -$wgVectorUseSimpleSearch = true; - -/** - * Watch and unwatch as an icon rather than a link for Vector skin only. - * - true = use an icon watch/unwatch button - * - false = use watch/unwatch text link - */ -$wgVectorUseIconWatch = true; - /** * Display user edit counts in various prominent places. */ @@ -6610,9 +6562,6 @@ $wgLogActions = array( 'protect/modify' => 'modifiedarticleprotection', 'protect/unprotect' => 'unprotectedarticle', 'protect/move_prot' => 'movedarticleprotection', - 'upload/upload' => 'uploadedimage', - 'upload/overwrite' => 'overwroteimage', - 'upload/revert' => 'uploadedimage', 'import/upload' => 'import-logentry-upload', 'import/interwiki' => 'import-logentry-interwiki', 'merge/merge' => 'pagemerge-logentry', @@ -6639,6 +6588,9 @@ $wgLogActionsHandlers = array( 'patrol/patrol' => 'PatrolLogFormatter', 'rights/rights' => 'RightsLogFormatter', 'rights/autopromote' => 'RightsLogFormatter', + 'upload/upload' => 'LogFormatter', + 'upload/overwrite' => 'LogFormatter', + 'upload/revert' => 'LogFormatter', ); /** @@ -6672,11 +6624,6 @@ $wgDisableQueryPageUpdate = false; */ $wgSpecialPageGroups = array(); -/** - * Whether or not to sort special pages in Special:Specialpages - */ -$wgSortSpecialPages = true; - /** * On Special:Unusedimages, consider images "used", if they are put * into a category. Default (false) is not to count those as used. @@ -6841,16 +6788,45 @@ $wgDebugAPI = false; /** * API module extensions. - * Associative array mapping module name to class name. - * Extension modules may override the core modules. * + * Associative array mapping module name to modules specs; + * Each module spec is an associative array containing at least + * the 'class' key for the module's class, and optionally a + * 'factory' key for the factory function to use for the module. + * + * That factory function will be called with two parameters, + * the parent module (an instance of ApiBase, usually ApiMain) + * and the name the module was registered under. The return + * value must be an instance of the class given in the 'class' + * field. + * + * For backward compatibility, the module spec may also be a + * simple string containing the module's class name. In that + * case, the class' constructor will be called with the parent + * module and module name as parameters, as described above. + * + * Examples for registering API modules: + * + * @code + * $wgAPIModules['foo'] = 'ApiFoo'; + * $wgAPIModules['bar'] = array( + * 'class' => 'ApiBar', + * 'factory' => function( $main, $name ) { ... } + * ); + * $wgAPIModules['xyzzy'] = array( + * 'class' => 'ApiXyzzy', + * 'factory' => array( 'XyzzyFactory', 'newApiModule' ) + * ); + * @endcode + * + * Extension modules may override the core modules. * See ApiMain::$Modules for a list of the core modules. */ $wgAPIModules = array(); /** * API format module extensions. - * Associative array mapping format module name to class name. + * Associative array mapping format module name to module specs (see $wgAPIModules). * Extension modules may override the core modules. * * See ApiMain::$Formats for a list of the core format modules. @@ -6859,7 +6835,7 @@ $wgAPIFormatModules = array(); /** * API Query meta module extensions. - * Associative array mapping meta module name to class name. + * Associative array mapping meta module name to module specs (see $wgAPIModules). * Extension modules may override the core modules. * * See ApiQuery::$QueryMetaModules for a list of the core meta modules. @@ -6868,7 +6844,7 @@ $wgAPIMetaModules = array(); /** * API Query prop module extensions. - * Associative array mapping properties module name to class name. + * Associative array mapping prop module name to module specs (see $wgAPIModules). * Extension modules may override the core modules. * * See ApiQuery::$QueryPropModules for a list of the core prop modules. @@ -6877,7 +6853,7 @@ $wgAPIPropModules = array(); /** * API Query list module extensions. - * Associative array mapping list module name to class name. + * Associative array mapping list module name to module specs (see $wgAPIModules). * Extension modules may override the core modules. * * See ApiQuery::$QueryListModules for a list of the core list modules. diff --git a/includes/Defines.php b/includes/Defines.php index e0579cbf06..017e9ea4da 100644 --- a/includes/Defines.php +++ b/includes/Defines.php @@ -281,6 +281,7 @@ define( 'CONTENT_MODEL_WIKITEXT', 'wikitext' ); define( 'CONTENT_MODEL_JAVASCRIPT', 'javascript' ); define( 'CONTENT_MODEL_CSS', 'css' ); define( 'CONTENT_MODEL_TEXT', 'text' ); +define( 'CONTENT_MODEL_JSON', 'json' ); /**@}*/ /**@{ diff --git a/includes/EditPage.php b/includes/EditPage.php index ff63fe8c38..f97e3f86c3 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -3526,7 +3526,6 @@ HTML /** * Shows a bulletin board style toolbar for common editing functions. * It can be disabled in the user preferences. - * The necessary JavaScript code can be found in skins/common/edit.js. * * @return string */ diff --git a/includes/Html.php b/includes/Html.php index ce439cb3ee..419250795d 100644 --- a/includes/Html.php +++ b/includes/Html.php @@ -36,7 +36,7 @@ * * There are two important configuration options this class uses: * - * $wgMimeType: If this is set to an xml mimetype then output should be + * $wgMimeType: If this is set to an xml MIME type then output should be * valid XHTML5. * $wgWellFormedXml: If this is set to true, then all output should be * well-formed XML (quotes on attributes, self-closing tags, etc.). @@ -225,33 +225,15 @@ class Html { } /** - * Returns "", except if $wgWellFormedXml is off, in which case - * it returns the empty string when that's guaranteed to be safe. + * Returns "" * * @since 1.17 * @param string $element Name of the element, e.g., 'a' - * @return string A closing tag, if required + * @return string A closing tag */ public static function closeElement( $element ) { - global $wgWellFormedXml; - $element = strtolower( $element ); - // Reference: - // http://www.whatwg.org/html/syntax.html#optional-tags - if ( !$wgWellFormedXml && in_array( $element, array( - 'html', - 'head', - 'body', - 'li', - 'dt', - 'dd', - 'tr', - 'td', - 'th', - ) ) ) { - return ''; - } return ""; } @@ -872,7 +854,7 @@ class Html { $isXHTML = self::isXmlMimeType( $wgMimeType ); if ( $isXHTML ) { // XHTML5 - // XML mimetyped markup should have an xml header. + // XML MIME-typed markup should have an xml header. // However a DOCTYPE is not needed. $ret .= "\n"; @@ -904,16 +886,16 @@ class Html { } /** - * Determines if the given mime type is xml. + * Determines if the given MIME type is xml. * - * @param string $mimetype MimeType + * @param string $mimetype MIME type * @return bool */ public static function isXmlMimeType( $mimetype ) { # http://www.whatwg.org/html/infrastructure.html#xml-mime-type # * text/xml # * application/xml - # * Any mimetype with a subtype ending in +xml (this implicitly includes application/xhtml+xml) + # * Any MIME type with a subtype ending in +xml (this implicitly includes application/xhtml+xml) return (bool)preg_match( '!^(text|application)/xml$|^.+/.+\+xml$!', $mimetype ); } diff --git a/includes/MediaWiki.php b/includes/MediaWiki.php index 1b014f6f64..281080cd00 100644 --- a/includes/MediaWiki.php +++ b/includes/MediaWiki.php @@ -32,6 +32,11 @@ class MediaWiki { */ private $context; + /** + * @var Config + */ + private $config; + /** * @param null|WebRequest $x * @return WebRequest @@ -65,6 +70,7 @@ class MediaWiki { } $this->context = $context; + $this->config = $context->getConfig(); } /** @@ -174,7 +180,7 @@ class MediaWiki { * @return void */ private function performRequest() { - global $wgServer, $wgUsePathInfo, $wgTitle; + global $wgTitle; wfProfileIn( __METHOD__ ); @@ -237,7 +243,7 @@ class MediaWiki { $url = $title->getFullURL( $query ); } // Check for a redirect loop - if ( !preg_match( '/^' . preg_quote( $wgServer, '/' ) . '/', $url ) + if ( !preg_match( '/^' . preg_quote( $this->config->get( 'Server' ), '/' ) . '/', $url ) && $title->isLocal() ) { // 301 so google et al report the target as the actual url. @@ -268,7 +274,7 @@ class MediaWiki { "requested; this sometimes happens when moving a wiki " . "to a new server or changing the server configuration.\n\n"; - if ( $wgUsePathInfo ) { + if ( $this->config->get( 'UsePathInfo' ) ) { $message .= "The wiki is trying to interpret the page " . "title from the URL path portion (PATH_INFO), which " . "sometimes fails depending on the web server. Try " . @@ -323,8 +329,6 @@ class MediaWiki { * @return mixed An Article, or a string to redirect to another URL */ private function initializeArticle() { - global $wgDisableHardRedirects; - wfProfileIn( __METHOD__ ); $title = $this->context->getTitle(); @@ -372,7 +376,7 @@ class MediaWiki { // Is the target already set by an extension? $target = $target ? $target : $article->followRedirect(); if ( is_string( $target ) ) { - if ( !$wgDisableHardRedirects ) { + if ( !$this->config->get( 'DisableHardRedirects' ) ) { // we'll need to redirect wfProfileOut( __METHOD__ ); return $target; @@ -406,8 +410,6 @@ class MediaWiki { * @param Title $requestTitle The original title, before any redirects were applied */ private function performAction( Page $page, Title $requestTitle ) { - global $wgUseSquid, $wgSquidMaxage; - wfProfileIn( __METHOD__ ); $request = $this->context->getRequest(); @@ -428,10 +430,10 @@ class MediaWiki { if ( $action instanceof Action ) { # Let Squid cache things if we can purge them. - if ( $wgUseSquid && + if ( $this->config->get( 'UseSquid' ) && in_array( $request->getFullRequestURL(), $requestTitle->getSquidURLs() ) ) { - $output->setSquidMaxage( $wgSquidMaxage ); + $output->setSquidMaxage( $this->config->get( 'SquidMaxage' ) ); } $action->show(); @@ -479,8 +481,6 @@ class MediaWiki { * @return bool */ private function checkMaxLag() { - global $wgShowHostnames; - wfProfileIn( __METHOD__ ); $maxLag = $this->context->getRequest()->getVal( 'maxlag' ); if ( !is_null( $maxLag ) ) { @@ -491,7 +491,7 @@ class MediaWiki { $resp->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) ); $resp->header( 'X-Database-Lag: ' . intval( $lag ) ); $resp->header( 'Content-Type: text/plain' ); - if ( $wgShowHostnames ) { + if ( $this->config->get( 'ShowHostnames' ) ) { echo "Waiting for $host: $lag seconds lagged\n"; } else { echo "Waiting for a database server: $lag seconds lagged\n"; @@ -507,14 +507,14 @@ class MediaWiki { } private function main() { - global $wgUseFileCache, $wgTitle, $wgUseAjax; + global $wgTitle; wfProfileIn( __METHOD__ ); $request = $this->context->getRequest(); // Send Ajax requests to the Ajax dispatcher. - if ( $wgUseAjax && $request->getVal( 'action', 'view' ) == 'ajax' ) { + if ( $this->config->get( 'UseAjax' ) && $request->getVal( 'action', 'view' ) == 'ajax' ) { // Set a dummy title, because $wgTitle == null might break things $title = Title::makeTitle( NS_MAIN, 'AJAX' ); @@ -581,7 +581,7 @@ class MediaWiki { } } - if ( $wgUseFileCache && $title->getNamespace() >= 0 ) { + if ( $this->config->get( 'UseFileCache' ) && $title->getNamespace() >= 0 ) { wfProfileIn( 'main-try-filecache' ); if ( HTMLFileCache::useFileCache( $this->context ) ) { // Try low-level file cache hit @@ -645,9 +645,8 @@ class MediaWiki { * the socket once it's done. */ protected function triggerJobs() { - global $wgJobRunRate, $wgServer, $wgRunJobsAsync; - - if ( $wgJobRunRate <= 0 || wfReadOnly() ) { + $jobRunRate = $this->config->get( 'JobRunRate' ); + if ( $jobRunRate <= 0 || wfReadOnly() ) { return; } elseif ( $this->getTitle()->isSpecial( 'RunJobs' ) ) { return; // recursion guard @@ -655,17 +654,17 @@ class MediaWiki { $section = new ProfileSection( __METHOD__ ); - if ( $wgJobRunRate < 1 ) { + if ( $jobRunRate < 1 ) { $max = mt_getrandmax(); - if ( mt_rand( 0, $max ) > $max * $wgJobRunRate ) { - return; // the higher $wgJobRunRate, the less likely we return here + if ( mt_rand( 0, $max ) > $max * $jobRunRate ) { + return; // the higher the job run rate, the less likely we return here } $n = 1; } else { - $n = intval( $wgJobRunRate ); + $n = intval( $jobRunRate ); } - if ( !$wgRunJobsAsync ) { + if ( !$this->config->get( 'RunJobsAsync' ) ) { // Fall back to running the job here while the user waits $runner = new JobRunner(); $runner->run( array( 'maxJobs' => $n ) ); @@ -686,7 +685,7 @@ class MediaWiki { $query['signature'] = SpecialRunJobs::getQuerySignature( $query ); $errno = $errstr = null; - $info = wfParseUrl( $wgServer ); + $info = wfParseUrl( $this->config->get( 'Server' ) ); wfSuppressWarnings(); $sock = fsockopen( $info['host'], diff --git a/includes/Message.php b/includes/Message.php index 931a3f9dcc..4df0d809d6 100644 --- a/includes/Message.php +++ b/includes/Message.php @@ -175,10 +175,16 @@ class Message { protected $language = null; /** - * @var string|string[] The message key or array of keys. + * @var string The message key. If $keysToTry has more than one element, + * this may change to one of the keys to try when fetching the message text. */ protected $key; + /** + * @var string[] List of keys to try when fetching the message. + */ + protected $keysToTry; + /** * @var array List of parameters which will be substituted into the message. */ @@ -224,30 +230,61 @@ class Message { * non-empty message for. * @param array $params Message parameters. * @param Language $language Optional language of the message, defaults to $wgLang. + * + * @throws InvalidArgumentException */ public function __construct( $key, $params = array(), Language $language = null ) { global $wgLang; - $this->key = $key; + if ( !is_string( $key ) && !is_array( $key ) ) { + throw new InvalidArgumentException( '$key must be a string or an array' ); + } + + $this->keysToTry = (array)$key; + + if ( empty( $this->keysToTry ) ) { + throw new InvalidArgumentException( '$key must not be an empty list' ); + } + + $this->key = reset( $this->keysToTry ); + $this->parameters = array_values( $params ); $this->language = $language ? $language : $wgLang; } /** - * Returns the message key or the first from an array of message keys. + * @since 1.24 + * + * @return bool True if this is a multi-key message, that is, if the key provided to the + * constructor was a fallback list of keys to try. + */ + public function isMultiKey() { + return count( $this->keysToTry ) > 1; + } + + /** + * @since 1.24 + * + * @return string[] The list of keys to try when fetching the message text, + * in order of preference. + */ + public function getKeysToTry() { + return $this->keysToTry; + } + + /** + * Returns the message key. + * + * If a list of multiple possible keys was supplied to the constructor, this method may + * return any of these keys. After the message ahs been fetched, this method will return + * the key that was actually used to fetch the message. * * @since 1.21 * * @return string */ public function getKey() { - if ( is_array( $this->key ) ) { - // May happen if some kind of fallback is applied. - // For now, just use the first key. We really need a better solution. - return $this->key[0]; - } else { - return $this->key; - } + return $this->key; } /** @@ -637,7 +674,7 @@ class Message { $string = $this->fetchMessage(); if ( $string === false ) { - $key = htmlspecialchars( is_array( $this->key ) ? $this->key[0] : $this->key ); + $key = htmlspecialchars( $this->key ); if ( $this->format === 'plain' ) { return '<' . $key . '>'; } @@ -997,20 +1034,18 @@ class Message { protected function fetchMessage() { if ( $this->message === null ) { $cache = MessageCache::singleton(); - if ( is_array( $this->key ) ) { - if ( !count( $this->key ) ) { - throw new MWException( "Given empty message key array." ); - } - foreach ( $this->key as $key ) { - $message = $cache->get( $key, $this->useDatabase, $this->language ); - if ( $message !== false && $message !== '' ) { - break; - } + + foreach ( $this->keysToTry as $key ) { + $message = $cache->get( $key, $this->useDatabase, $this->language ); + if ( $message !== false && $message !== '' ) { + break; } - $this->message = $message; - } else { - $this->message = $cache->get( $this->key, $this->useDatabase, $this->language ); } + + // NOTE: The constructor makes sure keysToTry isn't empty, + // so we know that $key and $message are initialized. + $this->key = $key; + $this->message = $message; } return $this->message; } @@ -1038,13 +1073,20 @@ class RawMessage extends Message { * * @see Message::__construct * - * @param string|string[] $key Message to use. + * @param string $text Message to use. * @param array $params Parameters for the message. + * + * @throws InvalidArgumentException */ - public function __construct( $key, $params = array() ) { - parent::__construct( $key, $params ); + public function __construct( $text, $params = array() ) { + if ( !is_string( $text ) ) { + throw new InvalidArgumentException( '$text must be a string' ); + } + + parent::__construct( $text, $params ); + // The key is the message. - $this->message = $key; + $this->message = $text; } /** @@ -1057,6 +1099,7 @@ class RawMessage extends Message { if ( $this->message === null ) { $this->message = $this->key; } + return $this->message; } diff --git a/includes/MimeMagic.php b/includes/MimeMagic.php index b4d3ab1c1e..8f0a2af230 100644 --- a/includes/MimeMagic.php +++ b/includes/MimeMagic.php @@ -1,6 +1,6 @@ ext - * map. Each line contains a mime type followed by a space separated list of - * extensions. If multiple extensions for a single mime type exist or if - * multiple mime types exist for a single extension then in most cases - * MediaWiki assumes that the first extension following the mime type is the - * canonical extension, and the first time a mime type appears for a certain - * extension is considered the canonical mime type. + * This list concatenated with mime.types is used to create a MIME <-> ext + * map. Each line contains a MIME type followed by a space separated list of + * extensions. If multiple extensions for a single MIME type exist or if + * multiple MIME types exist for a single extension then in most cases + * MediaWiki assumes that the first extension following the MIME type is the + * canonical extension, and the first time a MIME type appears for a certain + * extension is considered the canonical MIME type. * * (Note that appending $wgMimeTypeFile to the end of MM_WELL_KNOWN_MIME_TYPES * sucks because you can't redefine canonical types. This could be fixed by @@ -86,9 +86,9 @@ END_STRING ); /** - * Defines a set of well known mime info entries + * Defines a set of well known MIME info entries * This is used as a fallback to mime.info files. - * An extensive list of well known mime types is provided by + * An extensive list of well known MIME types is provided by * the file mime.info in the includes directory. */ define( 'MM_WELL_KNOWN_MIME_INFO', <<mMimeToExt[$mime]; } - // Resolve the mime type to the canonical type + // Resolve the MIME type to the canonical type if ( isset( $this->mMimeTypeAliases[$mime] ) ) { $mime = $this->mMimeTypeAliases[$mime]; if ( isset( $this->mMimeToExt[$mime] ) ) { @@ -405,7 +405,7 @@ class MimeMagic { } /** - * Returns a list of mime types for a given file extension as a space + * Returns a list of MIME types for a given file extension as a space * separated string or null if the extension was unrecognized. * * @param string $ext @@ -419,7 +419,7 @@ class MimeMagic { } /** - * Returns a single mime type for a given file extension or null if unknown. + * Returns a single MIME type for a given file extension or null if unknown. * This is always the first type from the list returned by getTypesForExtension($ext). * * @param string $ext @@ -439,9 +439,9 @@ class MimeMagic { } /** - * Tests if the extension matches the given mime type. Returns true if a - * match was found, null if the mime type is unknown, and false if the - * mime type is known but no matches where found. + * Tests if the extension matches the given MIME type. Returns true if a + * match was found, null if the MIME type is unknown, and false if the + * MIME type is known but no matches where found. * * @param string $extension * @param string $mime @@ -451,7 +451,7 @@ class MimeMagic { $ext = $this->getExtensionsForType( $mime ); if ( !$ext ) { - return null; // Unknown mime type + return null; // Unknown MIME type } $ext = explode( ' ', $ext ); @@ -461,7 +461,7 @@ class MimeMagic { } /** - * Returns true if the mime type is known to represent an image format + * Returns true if the MIME type is known to represent an image format * supported by the PHP GD library. * * @param string $mime @@ -490,7 +490,7 @@ class MimeMagic { * invalid uploads; if we can't identify the type we won't * be able to say if it's invalid. * - * @todo Be more accurate when using fancy mime detector plugins; + * @todo Be more accurate when using fancy MIME detector plugins; * right now this is the bare minimum getimagesize() list. * @param string $extension * @return bool @@ -515,15 +515,15 @@ class MimeMagic { } /** - * Improves a mime type using the file extension. Some file formats are very generic, - * so their mime type is not very meaningful. A more useful mime type can be derived + * Improves a MIME type using the file extension. Some file formats are very generic, + * so their MIME type is not very meaningful. A more useful MIME type can be derived * by looking at the file extension. Typically, this method would be called on the * result of guessMimeType(). * - * @param string $mime The mime type, typically guessed from a file's content. + * @param string $mime The MIME type, typically guessed from a file's content. * @param string $ext The file extension, as taken from the file name * - * @return string The mime type + * @return string The MIME type */ public function improveTypeFromExtension( $mime, $ext ) { if ( $mime === 'unknown/unknown' ) { @@ -538,7 +538,7 @@ class MimeMagic { } elseif ( $mime === 'application/x-opc+zip' ) { if ( $this->isMatchingExtension( $ext, $mime ) ) { // A known file extension for an OPC file, - // find the proper mime type for that file extension + // find the proper MIME type for that file extension $mime = $this->guessTypesForExtension( $ext ); } else { wfDebug( __METHOD__ . ": refusing to guess better type for $mime file, " . @@ -565,18 +565,18 @@ class MimeMagic { } /** - * Mime type detection. This uses detectMimeType to detect the mime type + * MIME type detection. This uses detectMimeType to detect the MIME type * of the file, but applies additional checks to determine some well known - * file formats that may be missed or misinterpreted by the default mime + * file formats that may be missed or misinterpreted by the default MIME * detection (namely XML based formats like XHTML or SVG, as well as ZIP * based formats like OPC/ODF files). * * @param string $file The file to check * @param string|bool $ext The file extension, or true (default) to extract it from the filename. * Set it to false to ignore the extension. DEPRECATED! Set to false, use - * improveTypeFromExtension($mime, $ext) later to improve mime type. + * improveTypeFromExtension($mime, $ext) later to improve MIME type. * - * @return string The mime type of $file + * @return string The MIME type of $file */ public function guessMimeType( $file, $ext = true ) { if ( $ext ) { // TODO: make $ext default to false. Or better, remove it. @@ -600,7 +600,7 @@ class MimeMagic { } /** - * Guess the mime type from the file contents. + * Guess the MIME type from the file contents. * * @param string $file * @param mixed $ext @@ -804,7 +804,7 @@ class MimeMagic { * @param string|null $tail The tail of the file * @param string|bool $ext The file extension, or true to extract it from the filename. * Set it to false (default) to ignore the extension. DEPRECATED! Set to false, - * use improveTypeFromExtension($mime, $ext) later to improve mime type. + * use improveTypeFromExtension($mime, $ext) later to improve MIME type. * * @return string */ @@ -847,7 +847,7 @@ class MimeMagic { # TODO: remove the block below, as soon as improveTypeFromExtension is used everywhere if ( $ext !== true && $ext !== false ) { /** This is the mode used by getPropsFromPath - * These mime's are stored in the database, where we don't really want + * These MIME's are stored in the database, where we don't really want * x-opc+zip, because we use it only for internal purposes */ if ( $this->isMatchingExtension( $ext, $mime ) ) { @@ -896,22 +896,22 @@ class MimeMagic { } /** - * Internal mime type detection. Detection is done using an external + * Internal MIME type detection. Detection is done using an external * program, if $wgMimeDetectorCommand is set. Otherwise, the fileinfo * extension and mime_content_type are tried (in this order), if they - * are available. If the detections fails and $ext is not false, the mime + * are available. If the detections fails and $ext is not false, the MIME * type is guessed from the file extension, using guessTypesForExtension. * - * If the mime type is still unknown, getimagesize is used to detect the - * mime type if the file is an image. If no mime type can be determined, + * If the MIME type is still unknown, getimagesize is used to detect the + * MIME type if the file is an image. If no MIME type can be determined, * this function returns 'unknown/unknown'. * * @param string $file The file to check * @param string|bool $ext The file extension, or true (default) to extract it from the filename. * Set it to false to ignore the extension. DEPRECATED! Set to false, use - * improveTypeFromExtension($mime, $ext) later to improve mime type. + * improveTypeFromExtension($mime, $ext) later to improve MIME type. * - * @return string The mime type of $file + * @return string The MIME type of $file */ private function detectMimeType( $file, $ext = true ) { global $wgMimeDetectorCommand; @@ -938,7 +938,7 @@ class MimeMagic { # If you may need to load the fileinfo extension at runtime, set # $wgLoadFileinfoExtension in LocalSettings.php - $mime_magic_resource = finfo_open( FILEINFO_MIME ); /* return mime type ala mimetype extension */ + $mime_magic_resource = finfo_open( FILEINFO_MIME ); /* return MIME type ala mimetype extension */ if ( $mime_magic_resource ) { $m = finfo_file( $mime_magic_resource, $file ); @@ -1003,18 +1003,18 @@ class MimeMagic { } /** - * Determine the media type code for a file, using its mime type, name and + * Determine the media type code for a file, using its MIME type, name and * possibly its contents. * - * This function relies on the findMediaType(), mapping extensions and mime + * This function relies on the findMediaType(), mapping extensions and MIME * types to media types. * * @todo analyse file if need be * @todo look at multiple extension, separately and together. * * @param string $path Full path to the image file, in case we have to look at the contents - * (if null, only the mime type is used to determine the media type code). - * @param string $mime Mime type. If null it will be guessed using guessMimeType. + * (if null, only the MIME type is used to determine the media type code). + * @param string $mime MIME type. If null it will be guessed using guessMimeType. * * @return string A value to be used with the MEDIATYPE_xxx constants. */ @@ -1023,7 +1023,7 @@ class MimeMagic { return MEDIATYPE_UNKNOWN; } - // If mime type is unknown, guess it + // If MIME type is unknown, guess it if ( !$mime ) { $mime = $this->guessMimeType( $path, false ); } @@ -1056,7 +1056,7 @@ class MimeMagic { } } - // Check for entry for full mime type + // Check for entry for full MIME type if ( $mime ) { $type = $this->findMediaType( $mime ); if ( $type !== MEDIATYPE_UNKNOWN ) { @@ -1076,7 +1076,7 @@ class MimeMagic { } } - // Check major mime type + // Check major MIME type if ( $mime ) { $i = strpos( $mime, '/' ); if ( $i !== false ) { @@ -1096,9 +1096,9 @@ class MimeMagic { } /** - * Returns a media code matching the given mime type or file extension. + * Returns a media code matching the given MIME type or file extension. * File extensions are represented by a string starting with a dot (.) to - * distinguish them from mime types. + * distinguish them from MIME types. * * This function relies on the mapping defined by $this->mMediaTypes * @access private @@ -1107,7 +1107,7 @@ class MimeMagic { */ function findMediaType( $extMime ) { if ( strpos( $extMime, '.' ) === 0 ) { - // If it's an extension, look up the mime types + // If it's an extension, look up the MIME types $m = $this->getTypesForExtension( substr( $extMime, 1 ) ); if ( !$m ) { return MEDIATYPE_UNKNOWN; @@ -1115,7 +1115,7 @@ class MimeMagic { $m = explode( ' ', $m ); } else { - // Normalize mime type + // Normalize MIME type if ( isset( $this->mMimeTypeAliases[$extMime] ) ) { $extMime = $this->mMimeTypeAliases[$extMime]; } diff --git a/includes/OutputPage.php b/includes/OutputPage.php index 87a0809257..cb250361da 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -1002,9 +1002,9 @@ class OutputPage extends ContextSource { * Add a subtitle containing a backlink to a page * * @param Title $title Title to link to + * @param array $query Array of additional parameters to include in the link */ - public function addBacklinkSubtitle( Title $title ) { - $query = array(); + public function addBacklinkSubtitle( Title $title, $query = array() ) { if ( $title->isRedirect() ) { $query['redirect'] = 'no'; } @@ -2797,9 +2797,7 @@ $templates ); } else { $links['html'] .= Html::inlineScript( - ResourceLoader::makeLoaderConditionalScript( - $resourceLoader->makeModuleResponse( $context, $grpModules ) - ) + $resourceLoader->makeModuleResponse( $context, $grpModules ) ); } $links['html'] .= "\n"; diff --git a/includes/Preferences.php b/includes/Preferences.php index 084d6ab2e5..eb29e41508 100644 --- a/includes/Preferences.php +++ b/includes/Preferences.php @@ -579,12 +579,16 @@ class Preferences { ## Skin ##################################### global $wgAllowUserCss, $wgAllowUserJs; - $defaultPreferences['skin'] = array( - 'type' => 'radio', - 'options' => self::generateSkinOptions( $user, $context ), - 'label' => ' ', - 'section' => 'rendering/skin', - ); + // Skin selector, if there is at least one valid skin + $skinOptions = self::generateSkinOptions( $user, $context ); + if ( $skinOptions ) { + $defaultPreferences['skin'] = array( + 'type' => 'radio', + 'options' => $skinOptions, + 'label' => ' ', + 'section' => 'rendering/skin', + ); + } # Create links to user CSS/JS pages for all skins # This code is basically copied from generateSkinOptions(). It'd @@ -1064,12 +1068,14 @@ class Preferences { } asort( $validSkinNames ); + $foundDefault = false; foreach ( $validSkinNames as $skinkey => $sn ) { $linkTools = array(); # Mark the default skin if ( $skinkey == $wgDefaultSkin ) { $linkTools[] = $context->msg( 'default' )->escaped(); + $foundDefault = true; } # Create preview link @@ -1094,6 +1100,12 @@ class Preferences { $ret[$display] = $skinkey; } + if ( !$foundDefault ) { + // If the default skin is not available, things are going to break horribly because the + // default value for skin selector will not be a valid value. Let's just not show it then. + return array(); + } + return $ret; } diff --git a/includes/Setup.php b/includes/Setup.php index 03c529e5e0..a4b98778b4 100644 --- a/includes/Setup.php +++ b/includes/Setup.php @@ -78,14 +78,6 @@ if ( $wgExtensionAssetsPath === false ) { $wgExtensionAssetsPath = "$wgScriptPath/extensions"; } -// Enable default skins. Temporary, to be removed before 1.24 release. -// This is hacky and bad, the require_once calls should eventually be generated by the installer -// and placed in LocalSettings.php. -// While this is in Setup.php, it needs to be done as soon as possible, as some of the setup code -// depends on all extensions and skins being already required (bug 67318). -require_once "$wgStyleDirectory/MonoBook/MonoBook.php"; -require_once "$wgStyleDirectory/Vector/Vector.php"; - if ( $wgLogo === false ) { $wgLogo = "$wgStylePath/common/images/wiki.png"; } @@ -271,6 +263,10 @@ if ( $wgSkipSkin ) { $wgSkipSkins[] = $wgSkipSkin; } +// Register a hidden "fallback" skin +$wgValidSkinNames['fallback'] = 'Fallback'; // SkinFallback +$wgSkipSkins[] = 'fallback'; + if ( $wgLocalInterwiki ) { array_unshift( $wgLocalInterwikis, $wgLocalInterwiki ); } @@ -469,23 +465,6 @@ if ( $wgTmpDirectory === false ) { wfProfileOut( $fname . '-tempDir' ); } -// $wgHTCPMulticastRouting got renamed to $wgHTCPRouting in MediaWiki 1.22 -// ensure back compatibility. -if ( !$wgHTCPRouting && $wgHTCPMulticastRouting ) { - $wgHTCPRouting = $wgHTCPMulticastRouting; -} - -// Initialize $wgHTCPRouting from backwards-compatible settings that -// comes from pre 1.20 version. -if ( !$wgHTCPRouting && $wgHTCPMulticastAddress ) { - $wgHTCPRouting = array( - '' => array( - 'host' => $wgHTCPMulticastAddress, - 'port' => $wgHTCPPort, - ) - ); -} - // Back compatibility for $wgRateLimitLog deprecated with 1.23 if ( $wgRateLimitLog && !array_key_exists( 'ratelimit', $wgDebugLogGroups ) ) { $wgDebugLogGroups['ratelimit'] = $wgRateLimitLog; diff --git a/includes/Skin.php b/includes/Skin.php deleted file mode 100644 index a59d5678a3..0000000000 --- a/includes/Skin.php +++ /dev/null @@ -1,1686 +0,0 @@ -read() ) ) { - // Skip non-PHP files, hidden files, and '.dep' includes - $matches = array(); - - if ( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) { - $aSkin = $matches[1]; - - // Explicitly disallow loading core skins via the autodiscovery mechanism. - // - // They should be loaded already (in a non-autodicovery way), but old files might still - // exist on the server because our MW version upgrade process is widely documented as - // requiring just copying over all files, without removing old ones. - // - // This is one of the reasons we should have never used autodiscovery in the first - // place. This hack can be safely removed when autodiscovery is gone. - if ( in_array( $aSkin, array( 'CologneBlue', 'Modern', 'MonoBook', 'Vector' ) ) ) { - wfLogWarning( - "An old copy of the $aSkin skin was found in your skins/ directory. " . - "You should remove it to avoid problems in the future." . - "See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for details." - ); - continue; - } - - wfLogWarning( - "A skin using autodiscovery mechanism, $aSkin, was found in your skins/ directory. " . - "The mechanism will be removed in MediaWiki 1.25 and the skin will no longer be recognized. " . - "See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for information how to fix this." - ); - $wgValidSkinNames[strtolower( $aSkin )] = $aSkin; - } - } - $skinDir->close(); - } - $skinsInitialised = true; - wfProfileOut( __METHOD__ . '-init' ); - } - return $wgValidSkinNames; - } - - /** - * Fetch the skinname messages for available skins. - * @return string[] - */ - static function getSkinNameMessages() { - $messages = array(); - foreach ( self::getSkinNames() as $skinKey => $skinName ) { - $messages[] = "skinname-$skinKey"; - } - return $messages; - } - - /** - * Fetch the list of user-selectable skins in regards to $wgSkipSkins. - * Useful for Special:Preferences and other places where you - * only want to show skins users _can_ use. - * @return string[] - * @since 1.23 - */ - public static function getAllowedSkins() { - global $wgSkipSkins; - - $allowedSkins = self::getSkinNames(); - - foreach ( $wgSkipSkins as $skip ) { - unset( $allowedSkins[$skip] ); - } - - return $allowedSkins; - } - - /** - * @deprecated since 1.23, use getAllowedSkins - * @return string[] - */ - public static function getUsableSkins() { - wfDeprecated( __METHOD__, '1.23' ); - return self::getAllowedSkins(); - } - - /** - * Normalize a skin preference value to a form that can be loaded. - * - * If a skin can't be found, it will fall back to the configured default ($wgDefaultSkin), or the - * hardcoded default ($wgFallbackSkin) if the default skin is unavailable too. - * - * @param string $key 'monobook', 'vector', etc. - * @return string - */ - static function normalizeKey( $key ) { - global $wgDefaultSkin, $wgFallbackSkin; - - $skinNames = Skin::getSkinNames(); - - // Make keys lowercase for case-insensitive matching. - $skinNames = array_change_key_case( $skinNames, CASE_LOWER ); - $key = strtolower( $key ); - $defaultSkin = strtolower( $wgDefaultSkin ); - $fallbackSkin = strtolower( $wgFallbackSkin ); - - if ( $key == '' || $key == 'default' ) { - // Don't return the default immediately; - // in a misconfiguration we need to fall back. - $key = $defaultSkin; - } - - if ( isset( $skinNames[$key] ) ) { - return $key; - } - - // Older versions of the software used a numeric setting - // in the user preferences. - $fallback = array( - 0 => $defaultSkin, - 2 => 'cologneblue' - ); - - if ( isset( $fallback[$key] ) ) { - $key = $fallback[$key]; - } - - if ( isset( $skinNames[$key] ) ) { - return $key; - } elseif ( isset( $skinNames[$defaultSkin] ) ) { - return $defaultSkin; - } else { - return $fallbackSkin; - } - } - - /** - * Factory method for loading a skin of a given type - * @param string $key 'monobook', 'vector', etc. - * @return Skin - */ - static function &newFromKey( $key ) { - global $wgStyleDirectory, $wgFallbackSkin; - - $key = Skin::normalizeKey( $key ); - - $skinNames = Skin::getSkinNames(); - $skinName = $skinNames[$key]; - $className = "Skin{$skinName}"; - - # Grab the skin class and initialise it. - if ( !class_exists( $className ) ) { - - require_once "{$wgStyleDirectory}/{$skinName}.php"; - - # Check if we got if not fallback to default skin - if ( !class_exists( $className ) ) { - # DO NOT die if the class isn't found. This breaks maintenance - # scripts and can cause a user account to be unrecoverable - # except by SQL manipulation if a previously valid skin name - # is no longer valid. - wfDebug( "Skin class does not exist: $className\n" ); - - $fallback = $skinNames[Skin::normalizeKey( $wgFallbackSkin )]; - $className = "Skin{$fallback}"; - } - } - $skin = new $className( $key ); - return $skin; - } - - /** - * @return string Skin name - */ - public function getSkinName() { - return $this->skinname; - } - - /** - * @param OutputPage $out - */ - function initPage( OutputPage $out ) { - wfProfileIn( __METHOD__ ); - - $this->preloadExistence(); - - wfProfileOut( __METHOD__ ); - } - - /** - * Defines the ResourceLoader modules that should be added to the skin - * It is recommended that skins wishing to override call parent::getDefaultModules() - * and substitute out any modules they wish to change by using a key to look them up - * @return array Array of modules with helper keys for easy overriding - */ - public function getDefaultModules() { - global $wgIncludeLegacyJavaScript, $wgPreloadJavaScriptMwUtil, $wgUseAjax, - $wgAjaxWatch, $wgEnableAPI, $wgEnableWriteAPI; - - $out = $this->getOutput(); - $user = $out->getUser(); - $modules = array( - // modules that enhance the page content in some way - 'content' => array( - 'mediawiki.page.ready', - ), - // modules that exist for legacy reasons - 'legacy' => array(), - // modules relating to search functionality - 'search' => array(), - // modules relating to functionality relating to watching an article - 'watch' => array(), - // modules which relate to the current users preferences - 'user' => array(), - ); - if ( $wgIncludeLegacyJavaScript ) { - $modules['legacy'][] = 'mediawiki.legacy.wikibits'; - } - - if ( $wgPreloadJavaScriptMwUtil ) { - $modules['legacy'][] = 'mediawiki.util'; - } - - // Add various resources if required - if ( $wgUseAjax ) { - $modules['legacy'][] = 'mediawiki.legacy.ajax'; - - if ( $wgEnableAPI ) { - if ( $wgEnableWriteAPI && $wgAjaxWatch && $user->isLoggedIn() - && $user->isAllowed( 'writeapi' ) - ) { - $modules['watch'][] = 'mediawiki.page.watch.ajax'; - } - - $modules['search'][] = 'mediawiki.searchSuggest'; - } - } - - if ( $user->getBoolOption( 'editsectiononrightclick' ) ) { - $modules['user'][] = 'mediawiki.action.view.rightClickEdit'; - } - - // Crazy edit-on-double-click stuff - if ( $out->isArticle() && $user->getOption( 'editondblclick' ) ) { - $modules['user'][] = 'mediawiki.action.view.dblClickEdit'; - } - return $modules; - } - - /** - * Preload the existence of three commonly-requested pages in a single query - */ - function preloadExistence() { - $user = $this->getUser(); - - // User/talk link - $titles = array( $user->getUserPage(), $user->getTalkPage() ); - - // Other tab link - if ( $this->getTitle()->isSpecialPage() ) { - // nothing - } elseif ( $this->getTitle()->isTalkPage() ) { - $titles[] = $this->getTitle()->getSubjectPage(); - } else { - $titles[] = $this->getTitle()->getTalkPage(); - } - - $lb = new LinkBatch( $titles ); - $lb->setCaller( __METHOD__ ); - $lb->execute(); - } - - /** - * Get the current revision ID - * - * @return int - */ - public function getRevisionId() { - return $this->getOutput()->getRevisionId(); - } - - /** - * Whether the revision displayed is the latest revision of the page - * - * @return bool - */ - public function isRevisionCurrent() { - $revID = $this->getRevisionId(); - return $revID == 0 || $revID == $this->getTitle()->getLatestRevID(); - } - - /** - * Set the "relevant" title - * @see self::getRelevantTitle() - * @param Title $t - */ - public function setRelevantTitle( $t ) { - $this->mRelevantTitle = $t; - } - - /** - * Return the "relevant" title. - * A "relevant" title is not necessarily the actual title of the page. - * Special pages like Special:MovePage use set the page they are acting on - * as their "relevant" title, this allows the skin system to display things - * such as content tabs which belong to to that page instead of displaying - * a basic special page tab which has almost no meaning. - * - * @return Title - */ - public function getRelevantTitle() { - if ( isset( $this->mRelevantTitle ) ) { - return $this->mRelevantTitle; - } - return $this->getTitle(); - } - - /** - * Set the "relevant" user - * @see self::getRelevantUser() - * @param User $u - */ - public function setRelevantUser( $u ) { - $this->mRelevantUser = $u; - } - - /** - * Return the "relevant" user. - * A "relevant" user is similar to a relevant title. Special pages like - * Special:Contributions mark the user which they are relevant to so that - * things like the toolbox can display the information they usually are only - * able to display on a user's userpage and talkpage. - * @return User - */ - public function getRelevantUser() { - if ( isset( $this->mRelevantUser ) ) { - return $this->mRelevantUser; - } - $title = $this->getRelevantTitle(); - if ( $title->hasSubjectNamespace( NS_USER ) ) { - $rootUser = $title->getRootText(); - if ( User::isIP( $rootUser ) ) { - $this->mRelevantUser = User::newFromName( $rootUser, false ); - } else { - $user = User::newFromName( $rootUser, false ); - if ( $user && $user->isLoggedIn() ) { - $this->mRelevantUser = $user; - } - } - return $this->mRelevantUser; - } - return null; - } - - /** - * Outputs the HTML generated by other functions. - * @param OutputPage $out - */ - abstract function outputPage( OutputPage $out = null ); - - /** - * @param array $data - * @return string - */ - static function makeVariablesScript( $data ) { - if ( $data ) { - return Html::inlineScript( - ResourceLoader::makeLoaderConditionalScript( ResourceLoader::makeConfigSetScript( $data ) ) - ); - } else { - return ''; - } - } - - /** - * Get the query to generate a dynamic stylesheet - * - * @return array - */ - public static function getDynamicStylesheetQuery() { - global $wgSquidMaxage; - - return array( - 'action' => 'raw', - 'maxage' => $wgSquidMaxage, - 'usemsgcache' => 'yes', - 'ctype' => 'text/css', - 'smaxage' => $wgSquidMaxage, - ); - } - - /** - * Add skin specific stylesheets - * Calling this method with an $out of anything but the same OutputPage - * inside ->getOutput() is deprecated. The $out arg is kept - * for compatibility purposes with skins. - * @param OutputPage $out - * @todo delete - */ - abstract function setupSkinUserCss( OutputPage $out ); - - /** - * TODO: document - * @param Title $title - * @return string - */ - function getPageClasses( $title ) { - $numeric = 'ns-' . $title->getNamespace(); - - if ( $title->isSpecialPage() ) { - $type = 'ns-special'; - // bug 23315: provide a class based on the canonical special page name without subpages - list( $canonicalName ) = SpecialPageFactory::resolveAlias( $title->getDBkey() ); - if ( $canonicalName ) { - $type .= ' ' . Sanitizer::escapeClass( "mw-special-$canonicalName" ); - } else { - $type .= ' mw-invalidspecialpage'; - } - } elseif ( $title->isTalkPage() ) { - $type = 'ns-talk'; - } else { - $type = 'ns-subject'; - } - - $name = Sanitizer::escapeClass( 'page-' . $title->getPrefixedText() ); - - return "$numeric $type $name"; - } - - /* - * Return values for element - * @return array of associative name-to-value elements for element - */ - public function getHtmlElementAttributes() { - $lang = $this->getLanguage(); - return array( - 'lang' => $lang->getHtmlCode(), - 'dir' => $lang->getDir(), - 'class' => 'client-nojs', - ); - } - - /** - * This will be called by OutputPage::headElement when it is creating the - * "" tag, skins can override it if they have a need to add in any - * body attributes or classes of their own. - * @param OutputPage $out - * @param array $bodyAttrs - */ - function addToBodyAttributes( $out, &$bodyAttrs ) { - // does nothing by default - } - - /** - * URL to the logo - * @return string - */ - function getLogo() { - global $wgLogo; - return $wgLogo; - } - - /** - * @return string - */ - function getCategoryLinks() { - global $wgUseCategoryBrowser; - - $out = $this->getOutput(); - $allCats = $out->getCategoryLinks(); - - if ( !count( $allCats ) ) { - return ''; - } - - $embed = "
  • "; - $pop = "
  • "; - - $s = ''; - $colon = $this->msg( 'colon-separator' )->escaped(); - - if ( !empty( $allCats['normal'] ) ) { - $t = $embed . implode( "{$pop}{$embed}", $allCats['normal'] ) . $pop; - - $msg = $this->msg( 'pagecategories' )->numParams( count( $allCats['normal'] ) )->escaped(); - $linkPage = wfMessage( 'pagecategorieslink' )->inContentLanguage()->text(); - $s .= ''; - } - - # Hidden categories - if ( isset( $allCats['hidden'] ) ) { - if ( $this->getUser()->getBoolOption( 'showhiddencats' ) ) { - $class = ' mw-hidden-cats-user-shown'; - } elseif ( $this->getTitle()->getNamespace() == NS_CATEGORY ) { - $class = ' mw-hidden-cats-ns-shown'; - } else { - $class = ' mw-hidden-cats-hidden'; - } - - $s .= "
    " . - $this->msg( 'hidden-categories' )->numParams( count( $allCats['hidden'] ) )->escaped() . - $colon . '
      ' . $embed . implode( "{$pop}{$embed}", $allCats['hidden'] ) . $pop . '
    ' . - '
    '; - } - - # optional 'dmoz-like' category browser. Will be shown under the list - # of categories an article belong to - if ( $wgUseCategoryBrowser ) { - $s .= '

    '; - - # get a big array of the parents tree - $parenttree = $this->getTitle()->getParentCategoryTree(); - # Skin object passed by reference cause it can not be - # accessed under the method subfunction drawCategoryBrowser - $tempout = explode( "\n", $this->drawCategoryBrowser( $parenttree ) ); - # Clean out bogus first entry and sort them - unset( $tempout[0] ); - asort( $tempout ); - # Output one per line - $s .= implode( "
    \n", $tempout ); - } - - return $s; - } - - /** - * Render the array as a series of links. - * @param array $tree Categories tree returned by Title::getParentCategoryTree - * @return string Separated by >, terminate with "\n" - */ - function drawCategoryBrowser( $tree ) { - $return = ''; - - foreach ( $tree as $element => $parent ) { - if ( empty( $parent ) ) { - # element start a new list - $return .= "\n"; - } else { - # grab the others elements - $return .= $this->drawCategoryBrowser( $parent ) . ' > '; - } - - # add our current element to the list - $eltitle = Title::newFromText( $element ); - $return .= Linker::link( $eltitle, htmlspecialchars( $eltitle->getText() ) ); - } - - return $return; - } - - /** - * @return string - */ - function getCategories() { - $out = $this->getOutput(); - - $catlinks = $this->getCategoryLinks(); - - $classes = 'catlinks'; - - // Check what we're showing - $allCats = $out->getCategoryLinks(); - $showHidden = $this->getUser()->getBoolOption( 'showhiddencats' ) || - $this->getTitle()->getNamespace() == NS_CATEGORY; - - if ( empty( $allCats['normal'] ) && !( !empty( $allCats['hidden'] ) && $showHidden ) ) { - $classes .= ' catlinks-allhidden'; - } - - return ""; - } - - /** - * This runs a hook to allow extensions placing their stuff after content - * and article metadata (e.g. categories). - * Note: This function has nothing to do with afterContent(). - * - * This hook is placed here in order to allow using the same hook for all - * skins, both the SkinTemplate based ones and the older ones, which directly - * use this class to get their data. - * - * The output of this function gets processed in SkinTemplate::outputPage() for - * the SkinTemplate based skins, all other skins should directly echo it. - * - * @return string Empty by default, if not changed by any hook function. - */ - protected function afterContentHook() { - $data = ''; - - if ( wfRunHooks( 'SkinAfterContent', array( &$data, $this ) ) ) { - // adding just some spaces shouldn't toggle the output - // of the whole
    , so we use trim() here - if ( trim( $data ) != '' ) { - // Doing this here instead of in the skins to - // ensure that the div has the same ID in all - // skins - $data = "
    \n" . - "\t$data\n" . - "
    \n"; - } - } else { - wfDebug( "Hook SkinAfterContent changed output processing.\n" ); - } - - return $data; - } - - /** - * Generate debug data HTML for displaying at the bottom of the main content - * area. - * @return string HTML containing debug data, if enabled (otherwise empty). - */ - protected function generateDebugHTML() { - return MWDebug::getHTMLDebugLog(); - } - - /** - * This gets called shortly before the "" tag. - * - * @return string HTML-wrapped JS code to be put before "" - */ - function bottomScripts() { - // TODO and the suckage continues. This function is really just a wrapper around - // OutputPage::getBottomScripts() which takes a Skin param. This should be cleaned - // up at some point - $bottomScriptText = $this->getOutput()->getBottomScripts(); - wfRunHooks( 'SkinAfterBottomScripts', array( $this, &$bottomScriptText ) ); - - return $bottomScriptText; - } - - /** - * Text with the permalink to the source page, - * usually shown on the footer of a printed page - * - * @return string HTML text with an URL - */ - function printSource() { - $oldid = $this->getRevisionId(); - if ( $oldid ) { - $canonicalUrl = $this->getTitle()->getCanonicalURL( 'oldid=' . $oldid ); - $url = htmlspecialchars( wfExpandIRI( $canonicalUrl ) ); - } else { - // oldid not available for non existing pages - $url = htmlspecialchars( wfExpandIRI( $this->getTitle()->getCanonicalURL() ) ); - } - - return $this->msg( 'retrievedfrom', '' . $url . '' )->text(); - } - - /** - * @return string - */ - function getUndeleteLink() { - $action = $this->getRequest()->getVal( 'action', 'view' ); - - if ( $this->getUser()->isAllowed( 'deletedhistory' ) && - ( $this->getTitle()->getArticleID() == 0 || $action == 'history' ) ) { - $n = $this->getTitle()->isDeleted(); - - if ( $n ) { - if ( $this->getUser()->isAllowed( 'undelete' ) ) { - $msg = 'thisisdeleted'; - } else { - $msg = 'viewdeleted'; - } - - return $this->msg( $msg )->rawParams( - Linker::linkKnown( - SpecialPage::getTitleFor( 'Undelete', $this->getTitle()->getPrefixedDBkey() ), - $this->msg( 'restorelink' )->numParams( $n )->escaped() ) - )->text(); - } - } - - return ''; - } - - /** - * @return string - */ - function subPageSubtitle() { - $out = $this->getOutput(); - $subpages = ''; - - if ( !wfRunHooks( 'SkinSubPageSubtitle', array( &$subpages, $this, $out ) ) ) { - return $subpages; - } - - if ( $out->isArticle() && MWNamespace::hasSubpages( $out->getTitle()->getNamespace() ) ) { - $ptext = $this->getTitle()->getPrefixedText(); - if ( preg_match( '/\//', $ptext ) ) { - $links = explode( '/', $ptext ); - array_pop( $links ); - $c = 0; - $growinglink = ''; - $display = ''; - $lang = $this->getLanguage(); - - foreach ( $links as $link ) { - $growinglink .= $link; - $display .= $link; - $linkObj = Title::newFromText( $growinglink ); - - if ( is_object( $linkObj ) && $linkObj->isKnown() ) { - $getlink = Linker::linkKnown( - $linkObj, - htmlspecialchars( $display ) - ); - - $c++; - - if ( $c > 1 ) { - $subpages .= $lang->getDirMarkEntity() . $this->msg( 'pipe-separator' )->escaped(); - } else { - $subpages .= '< '; - } - - $subpages .= $getlink; - $display = ''; - } else { - $display .= '/'; - } - $growinglink .= '/'; - } - } - } - - return $subpages; - } - - /** - * Returns true if the IP should be shown in the header - * @return bool - */ - function showIPinHeader() { - global $wgShowIPinHeader; - return $wgShowIPinHeader && session_id() != ''; - } - - /** - * @return string - */ - function getSearchLink() { - $searchPage = SpecialPage::getTitleFor( 'Search' ); - return $searchPage->getLocalURL(); - } - - /** - * @return string - */ - function escapeSearchLink() { - return htmlspecialchars( $this->getSearchLink() ); - } - - /** - * @param string $type - * @return string - */ - function getCopyright( $type = 'detect' ) { - global $wgRightsPage, $wgRightsUrl, $wgRightsText; - - if ( $type == 'detect' ) { - if ( !$this->isRevisionCurrent() - && !$this->msg( 'history_copyright' )->inContentLanguage()->isDisabled() - ) { - $type = 'history'; - } else { - $type = 'normal'; - } - } - - if ( $type == 'history' ) { - $msg = 'history_copyright'; - } else { - $msg = 'copyright'; - } - - if ( $wgRightsPage ) { - $title = Title::newFromText( $wgRightsPage ); - $link = Linker::linkKnown( $title, $wgRightsText ); - } elseif ( $wgRightsUrl ) { - $link = Linker::makeExternalLink( $wgRightsUrl, $wgRightsText ); - } elseif ( $wgRightsText ) { - $link = $wgRightsText; - } else { - # Give up now - return ''; - } - - // Allow for site and per-namespace customization of copyright notice. - // @todo Remove deprecated $forContent param from hook handlers and then remove here. - $forContent = true; - - wfRunHooks( - 'SkinCopyrightFooter', - array( $this->getTitle(), $type, &$msg, &$link, &$forContent ) - ); - - return $this->msg( $msg )->rawParams( $link )->text(); - } - - /** - * @return null|string - */ - function getCopyrightIcon() { - global $wgRightsUrl, $wgRightsText, $wgRightsIcon, $wgCopyrightIcon; - - $out = ''; - - if ( $wgCopyrightIcon ) { - $out = $wgCopyrightIcon; - } elseif ( $wgRightsIcon ) { - $icon = htmlspecialchars( $wgRightsIcon ); - - if ( $wgRightsUrl ) { - $url = htmlspecialchars( $wgRightsUrl ); - $out .= ''; - } - - $text = htmlspecialchars( $wgRightsText ); - $out .= "\"$text\""; - - if ( $wgRightsUrl ) { - $out .= ''; - } - } - - return $out; - } - - /** - * Gets the powered by MediaWiki icon. - * @return string - */ - function getPoweredBy() { - global $wgStylePath; - - $url = htmlspecialchars( "$wgStylePath/common/images/poweredby_mediawiki_88x31.png" ); - $text = 'Powered by MediaWiki'; - wfRunHooks( 'SkinGetPoweredBy', array( &$text, $this ) ); - return $text; - } - - /** - * Get the timestamp of the latest revision, formatted in user language - * - * @return string - */ - protected function lastModified() { - $timestamp = $this->getOutput()->getRevisionTimestamp(); - - # No cached timestamp, load it from the database - if ( $timestamp === null ) { - $timestamp = Revision::getTimestampFromId( $this->getTitle(), $this->getRevisionId() ); - } - - if ( $timestamp ) { - $d = $this->getLanguage()->userDate( $timestamp, $this->getUser() ); - $t = $this->getLanguage()->userTime( $timestamp, $this->getUser() ); - $s = ' ' . $this->msg( 'lastmodifiedat', $d, $t )->text(); - } else { - $s = ''; - } - - if ( wfGetLB()->getLaggedSlaveMode() ) { - $s .= ' ' . $this->msg( 'laggedslavemode' )->text() . ''; - } - - return $s; - } - - /** - * @param string $align - * @return string - */ - function logoText( $align = '' ) { - if ( $align != '' ) { - $a = " style='float: {$align};'"; - } else { - $a = ''; - } - - $mp = $this->msg( 'mainpage' )->escaped(); - $mptitle = Title::newMainPage(); - $url = ( is_object( $mptitle ) ? htmlspecialchars( $mptitle->getLocalURL() ) : '' ); - - $logourl = $this->getLogo(); - $s = ""; - - return $s; - } - - /** - * Renders a $wgFooterIcons icon according to the method's arguments - * @param array $icon The icon to build the html for, see $wgFooterIcons - * for the format of this array. - * @param bool|string $withImage Whether to use the icon's image or output - * a text-only footericon. - * @return string HTML - */ - function makeFooterIcon( $icon, $withImage = 'withImage' ) { - if ( is_string( $icon ) ) { - $html = $icon; - } else { // Assuming array - $url = isset( $icon["url"] ) ? $icon["url"] : null; - unset( $icon["url"] ); - if ( isset( $icon["src"] ) && $withImage === 'withImage' ) { - // do this the lazy way, just pass icon data as an attribute array - $html = Html::element( 'img', $icon ); - } else { - $html = htmlspecialchars( $icon["alt"] ); - } - if ( $url ) { - $html = Html::rawElement( 'a', array( "href" => $url ), $html ); - } - } - return $html; - } - - /** - * Gets the link to the wiki's main page. - * @return string - */ - function mainPageLink() { - $s = Linker::linkKnown( - Title::newMainPage(), - $this->msg( 'mainpage' )->escaped() - ); - - return $s; - } - - /** - * Returns an HTML link for use in the footer - * @param string $desc The i18n message key for the link text - * @param string $page The i18n message key for the page to link to - * @return string HTML anchor - */ - public function footerLink( $desc, $page ) { - // if the link description has been set to "-" in the default language, - if ( $this->msg( $desc )->inContentLanguage()->isDisabled() ) { - // then it is disabled, for all languages. - return ''; - } else { - // Otherwise, we display the link for the user, described in their - // language (which may or may not be the same as the default language), - // but we make the link target be the one site-wide page. - $title = Title::newFromText( $this->msg( $page )->inContentLanguage()->text() ); - - return Linker::linkKnown( - $title, - $this->msg( $desc )->escaped() - ); - } - } - - /** - * Gets the link to the wiki's privacy policy page. - * @return string HTML - */ - function privacyLink() { - return $this->footerLink( 'privacy', 'privacypage' ); - } - - /** - * Gets the link to the wiki's about page. - * @return string HTML - */ - function aboutLink() { - return $this->footerLink( 'aboutsite', 'aboutpage' ); - } - - /** - * Gets the link to the wiki's general disclaimers page. - * @return string HTML - */ - function disclaimerLink() { - return $this->footerLink( 'disclaimers', 'disclaimerpage' ); - } - - /** - * Return URL options for the 'edit page' link. - * This may include an 'oldid' specifier, if the current page view is such. - * - * @return array - * @private - */ - function editUrlOptions() { - $options = array( 'action' => 'edit' ); - - if ( !$this->isRevisionCurrent() ) { - $options['oldid'] = intval( $this->getRevisionId() ); - } - - return $options; - } - - /** - * @param User|int $id - * @return bool - */ - function showEmailUser( $id ) { - if ( $id instanceof User ) { - $targetUser = $id; - } else { - $targetUser = User::newFromId( $id ); - } - - # The sending user must have a confirmed email address and the target - # user must have a confirmed email address and allow emails from users. - return $this->getUser()->canSendEmail() && - $targetUser->canReceiveEmail(); - } - - /** - * Return a fully resolved style path url to images or styles stored in the common folder. - * This method returns a url resolved using the configured skin style path - * and includes the style version inside of the url. - * @param string $name The name or path of a skin resource file - * @return string The fully resolved style path url including styleversion - */ - function getCommonStylePath( $name ) { - global $wgStylePath, $wgStyleVersion; - return "$wgStylePath/common/$name?$wgStyleVersion"; - } - - /** - * Return a fully resolved style path url to images or styles stored in the current skins's folder. - * This method returns a url resolved using the configured skin style path - * and includes the style version inside of the url. - * - * Requires $stylename to be set, otherwise throws MWException. - * - * @param string $name The name or path of a skin resource file - * @return string The fully resolved style path url including styleversion - */ - function getSkinStylePath( $name ) { - global $wgStylePath, $wgStyleVersion; - - if ( $this->stylename === null ) { - $class = get_class( $this ); - throw new MWException( "$class::\$stylename must be set to use getSkinStylePath()" ); - } - - return "$wgStylePath/{$this->stylename}/$name?$wgStyleVersion"; - } - - /* these are used extensively in SkinTemplate, but also some other places */ - - /** - * @param string $urlaction - * @return string - */ - static function makeMainPageUrl( $urlaction = '' ) { - $title = Title::newMainPage(); - self::checkTitle( $title, '' ); - - return $title->getLocalURL( $urlaction ); - } - - /** - * Make a URL for a Special Page using the given query and protocol. - * - * If $proto is set to null, make a local URL. Otherwise, make a full - * URL with the protocol specified. - * - * @param string $name Name of the Special page - * @param string $urlaction Query to append - * @param string|null $proto Protocol to use or null for a local URL - * @return string - */ - static function makeSpecialUrl( $name, $urlaction = '', $proto = null ) { - $title = SpecialPage::getSafeTitleFor( $name ); - if ( is_null( $proto ) ) { - return $title->getLocalURL( $urlaction ); - } else { - return $title->getFullURL( $urlaction, false, $proto ); - } - } - - /** - * @param string $name - * @param string $subpage - * @param string $urlaction - * @return string - */ - static function makeSpecialUrlSubpage( $name, $subpage, $urlaction = '' ) { - $title = SpecialPage::getSafeTitleFor( $name, $subpage ); - return $title->getLocalURL( $urlaction ); - } - - /** - * @param string $name - * @param string $urlaction - * @return string - */ - static function makeI18nUrl( $name, $urlaction = '' ) { - $title = Title::newFromText( wfMessage( $name )->inContentLanguage()->text() ); - self::checkTitle( $title, $name ); - return $title->getLocalURL( $urlaction ); - } - - /** - * @param string $name - * @param string $urlaction - * @return string - */ - static function makeUrl( $name, $urlaction = '' ) { - $title = Title::newFromText( $name ); - self::checkTitle( $title, $name ); - - return $title->getLocalURL( $urlaction ); - } - - /** - * If url string starts with http, consider as external URL, else - * internal - * @param string $name - * @return string URL - */ - static function makeInternalOrExternalUrl( $name ) { - if ( preg_match( '/^(?i:' . wfUrlProtocols() . ')/', $name ) ) { - return $name; - } else { - return self::makeUrl( $name ); - } - } - - /** - * this can be passed the NS number as defined in Language.php - * @param string $name - * @param string $urlaction - * @param int $namespace - * @return string - */ - static function makeNSUrl( $name, $urlaction = '', $namespace = NS_MAIN ) { - $title = Title::makeTitleSafe( $namespace, $name ); - self::checkTitle( $title, $name ); - - return $title->getLocalURL( $urlaction ); - } - - /** - * these return an array with the 'href' and boolean 'exists' - * @param string $name - * @param string $urlaction - * @return array - */ - static function makeUrlDetails( $name, $urlaction = '' ) { - $title = Title::newFromText( $name ); - self::checkTitle( $title, $name ); - - return array( - 'href' => $title->getLocalURL( $urlaction ), - 'exists' => $title->getArticleID() != 0, - ); - } - - /** - * Make URL details where the article exists (or at least it's convenient to think so) - * @param string $name Article name - * @param string $urlaction - * @return array - */ - static function makeKnownUrlDetails( $name, $urlaction = '' ) { - $title = Title::newFromText( $name ); - self::checkTitle( $title, $name ); - - return array( - 'href' => $title->getLocalURL( $urlaction ), - 'exists' => true - ); - } - - /** - * make sure we have some title to operate on - * - * @param Title $title - * @param string $name - */ - static function checkTitle( &$title, $name ) { - if ( !is_object( $title ) ) { - $title = Title::newFromText( $name ); - if ( !is_object( $title ) ) { - $title = Title::newFromText( '--error: link target missing--' ); - } - } - } - - /** - * Build an array that represents the sidebar(s), the navigation bar among them. - * - * BaseTemplate::getSidebar can be used to simplify the format and id generation in new skins. - * - * The format of the returned array is array( heading => content, ... ), where: - * - heading is the heading of a navigation portlet. It is either: - * - magic string to be handled by the skins ('SEARCH' / 'LANGUAGES' / 'TOOLBOX' / ...) - * - a message name (e.g. 'navigation'), the message should be HTML-escaped by the skin - * - plain text, which should be HTML-escaped by the skin - * - content is the contents of the portlet. It is either: - * - HTML text (
    • ...
    • ...
    ) - * - array of link data in a format accepted by BaseTemplate::makeListItem() - * - (for a magic string as a key, any value) - * - * Note that extensions can control the sidebar contents using the SkinBuildSidebar hook - * and can technically insert anything in here; skin creators are expected to handle - * values described above. - * - * @return array - */ - function buildSidebar() { - global $wgMemc, $wgEnableSidebarCache, $wgSidebarCacheExpiry; - wfProfileIn( __METHOD__ ); - - $key = wfMemcKey( 'sidebar', $this->getLanguage()->getCode() ); - - if ( $wgEnableSidebarCache ) { - $cachedsidebar = $wgMemc->get( $key ); - if ( $cachedsidebar ) { - wfRunHooks( 'SidebarBeforeOutput', array( $this, &$cachedsidebar ) ); - - wfProfileOut( __METHOD__ ); - return $cachedsidebar; - } - } - - $bar = array(); - $this->addToSidebar( $bar, 'sidebar' ); - - wfRunHooks( 'SkinBuildSidebar', array( $this, &$bar ) ); - if ( $wgEnableSidebarCache ) { - $wgMemc->set( $key, $bar, $wgSidebarCacheExpiry ); - } - - wfRunHooks( 'SidebarBeforeOutput', array( $this, &$bar ) ); - - wfProfileOut( __METHOD__ ); - return $bar; - } - - /** - * Add content from a sidebar system message - * Currently only used for MediaWiki:Sidebar (but may be used by Extensions) - * - * This is just a wrapper around addToSidebarPlain() for backwards compatibility - * - * @param array $bar - * @param string $message - */ - function addToSidebar( &$bar, $message ) { - $this->addToSidebarPlain( $bar, wfMessage( $message )->inContentLanguage()->plain() ); - } - - /** - * Add content from plain text - * @since 1.17 - * @param array $bar - * @param string $text - * @return array - */ - function addToSidebarPlain( &$bar, $text ) { - $lines = explode( "\n", $text ); - - $heading = ''; - - foreach ( $lines as $line ) { - if ( strpos( $line, '*' ) !== 0 ) { - continue; - } - $line = rtrim( $line, "\r" ); // for Windows compat - - if ( strpos( $line, '**' ) !== 0 ) { - $heading = trim( $line, '* ' ); - if ( !array_key_exists( $heading, $bar ) ) { - $bar[$heading] = array(); - } - } else { - $line = trim( $line, '* ' ); - - if ( strpos( $line, '|' ) !== false ) { // sanity check - $line = MessageCache::singleton()->transform( $line, false, null, $this->getTitle() ); - $line = array_map( 'trim', explode( '|', $line, 2 ) ); - if ( count( $line ) !== 2 ) { - // Second sanity check, could be hit by people doing - // funky stuff with parserfuncs... (bug 33321) - continue; - } - - $extraAttribs = array(); - - $msgLink = $this->msg( $line[0] )->inContentLanguage(); - if ( $msgLink->exists() ) { - $link = $msgLink->text(); - if ( $link == '-' ) { - continue; - } - } else { - $link = $line[0]; - } - $msgText = $this->msg( $line[1] ); - if ( $msgText->exists() ) { - $text = $msgText->text(); - } else { - $text = $line[1]; - } - - if ( preg_match( '/^(?i:' . wfUrlProtocols() . ')/', $link ) ) { - $href = $link; - - // Parser::getExternalLinkAttribs won't work here because of the Namespace things - global $wgNoFollowLinks, $wgNoFollowDomainExceptions; - if ( $wgNoFollowLinks && !wfMatchesDomainList( $href, $wgNoFollowDomainExceptions ) ) { - $extraAttribs['rel'] = 'nofollow'; - } - - global $wgExternalLinkTarget; - if ( $wgExternalLinkTarget ) { - $extraAttribs['target'] = $wgExternalLinkTarget; - } - } else { - $title = Title::newFromText( $link ); - - if ( $title ) { - $title = $title->fixSpecialName(); - $href = $title->getLinkURL(); - } else { - $href = 'INVALID-TITLE'; - } - } - - $bar[$heading][] = array_merge( array( - 'text' => $text, - 'href' => $href, - 'id' => 'n-' . Sanitizer::escapeId( strtr( $line[1], ' ', '-' ), 'noninitial' ), - 'active' => false - ), $extraAttribs ); - } else { - continue; - } - } - } - - return $bar; - } - - /** - * This function previously controlled whether the 'mediawiki.legacy.wikiprintable' module - * should be loaded by OutputPage. That module no longer exists and the return value of this - * method is ignored. - * - * If your skin doesn't provide its own print styles, the 'mediawiki.legacy.commonPrint' module - * can be used instead (SkinTemplate-based skins do it automatically). - * - * @deprecated since 1.22 - * @return bool - */ - public function commonPrintStylesheet() { - wfDeprecated( __METHOD__, '1.22' ); - return false; - } - - /** - * Gets new talk page messages for the current user and returns an - * appropriate alert message (or an empty string if there are no messages) - * @return string - */ - function getNewtalks() { - - $newMessagesAlert = ''; - $user = $this->getUser(); - $newtalks = $user->getNewMessageLinks(); - $out = $this->getOutput(); - - // Allow extensions to disable or modify the new messages alert - if ( !wfRunHooks( 'GetNewMessagesAlert', array( &$newMessagesAlert, $newtalks, $user, $out ) ) ) { - return ''; - } - if ( $newMessagesAlert ) { - return $newMessagesAlert; - } - - if ( count( $newtalks ) == 1 && $newtalks[0]['wiki'] === wfWikiID() ) { - $uTalkTitle = $user->getTalkPage(); - $lastSeenRev = isset( $newtalks[0]['rev'] ) ? $newtalks[0]['rev'] : null; - $nofAuthors = 0; - if ( $lastSeenRev !== null ) { - $plural = true; // Default if we have a last seen revision: if unknown, use plural - $latestRev = Revision::newFromTitle( $uTalkTitle, false, Revision::READ_NORMAL ); - if ( $latestRev !== null ) { - // Singular if only 1 unseen revision, plural if several unseen revisions. - $plural = $latestRev->getParentId() !== $lastSeenRev->getId(); - $nofAuthors = $uTalkTitle->countAuthorsBetween( - $lastSeenRev, $latestRev, 10, 'include_new' ); - } - } else { - // Singular if no revision -> diff link will show latest change only in any case - $plural = false; - } - $plural = $plural ? 999 : 1; - // 999 signifies "more than one revision". We don't know how many, and even if we did, - // the number of revisions or authors is not necessarily the same as the number of - // "messages". - $newMessagesLink = Linker::linkKnown( - $uTalkTitle, - $this->msg( 'newmessageslinkplural' )->params( $plural )->escaped(), - array(), - array( 'redirect' => 'no' ) - ); - - $newMessagesDiffLink = Linker::linkKnown( - $uTalkTitle, - $this->msg( 'newmessagesdifflinkplural' )->params( $plural )->escaped(), - array(), - $lastSeenRev !== null - ? array( 'oldid' => $lastSeenRev->getId(), 'diff' => 'cur' ) - : array( 'diff' => 'cur' ) - ); - - if ( $nofAuthors >= 1 && $nofAuthors <= 10 ) { - $newMessagesAlert = $this->msg( - 'youhavenewmessagesfromusers', - $newMessagesLink, - $newMessagesDiffLink - )->numParams( $nofAuthors, $plural ); - } else { - // $nofAuthors === 11 signifies "11 or more" ("more than 10") - $newMessagesAlert = $this->msg( - $nofAuthors > 10 ? 'youhavenewmessagesmanyusers' : 'youhavenewmessages', - $newMessagesLink, - $newMessagesDiffLink - )->numParams( $plural ); - } - $newMessagesAlert = $newMessagesAlert->text(); - # Disable Squid cache - $out->setSquidMaxage( 0 ); - } elseif ( count( $newtalks ) ) { - $sep = $this->msg( 'newtalkseparator' )->escaped(); - $msgs = array(); - - foreach ( $newtalks as $newtalk ) { - $msgs[] = Xml::element( - 'a', - array( 'href' => $newtalk['link'] ), $newtalk['wiki'] - ); - } - $parts = implode( $sep, $msgs ); - $newMessagesAlert = $this->msg( 'youhavenewmessagesmulti' )->rawParams( $parts )->escaped(); - $out->setSquidMaxage( 0 ); - } - - return $newMessagesAlert; - } - - /** - * Get a cached notice - * - * @param string $name Message name, or 'default' for $wgSiteNotice - * @return string HTML fragment - */ - private function getCachedNotice( $name ) { - global $wgRenderHashAppend, $parserMemc, $wgContLang; - - wfProfileIn( __METHOD__ ); - - $needParse = false; - - if ( $name === 'default' ) { - // special case - global $wgSiteNotice; - $notice = $wgSiteNotice; - if ( empty( $notice ) ) { - wfProfileOut( __METHOD__ ); - return false; - } - } else { - $msg = $this->msg( $name )->inContentLanguage(); - if ( $msg->isDisabled() ) { - wfProfileOut( __METHOD__ ); - return false; - } - $notice = $msg->plain(); - } - - // Use the extra hash appender to let eg SSL variants separately cache. - $key = wfMemcKey( $name . $wgRenderHashAppend ); - $cachedNotice = $parserMemc->get( $key ); - if ( is_array( $cachedNotice ) ) { - if ( md5( $notice ) == $cachedNotice['hash'] ) { - $notice = $cachedNotice['html']; - } else { - $needParse = true; - } - } else { - $needParse = true; - } - - if ( $needParse ) { - $parsed = $this->getOutput()->parse( $notice ); - $parserMemc->set( $key, array( 'html' => $parsed, 'hash' => md5( $notice ) ), 600 ); - $notice = $parsed; - } - - $notice = Html::rawElement( 'div', array( 'id' => 'localNotice', - 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ), $notice ); - wfProfileOut( __METHOD__ ); - return $notice; - } - - /** - * Get a notice based on page's namespace - * - * @return string HTML fragment - */ - function getNamespaceNotice() { - wfProfileIn( __METHOD__ ); - - $key = 'namespacenotice-' . $this->getTitle()->getNsText(); - $namespaceNotice = $this->getCachedNotice( $key ); - if ( $namespaceNotice && substr( $namespaceNotice, 0, 7 ) != '

    <' ) { - $namespaceNotice = '

    ' . $namespaceNotice . '
    '; - } else { - $namespaceNotice = ''; - } - - wfProfileOut( __METHOD__ ); - return $namespaceNotice; - } - - /** - * Get the site notice - * - * @return string HTML fragment - */ - function getSiteNotice() { - wfProfileIn( __METHOD__ ); - $siteNotice = ''; - - if ( wfRunHooks( 'SiteNoticeBefore', array( &$siteNotice, $this ) ) ) { - if ( is_object( $this->getUser() ) && $this->getUser()->isLoggedIn() ) { - $siteNotice = $this->getCachedNotice( 'sitenotice' ); - } else { - $anonNotice = $this->getCachedNotice( 'anonnotice' ); - if ( !$anonNotice ) { - $siteNotice = $this->getCachedNotice( 'sitenotice' ); - } else { - $siteNotice = $anonNotice; - } - } - if ( !$siteNotice ) { - $siteNotice = $this->getCachedNotice( 'default' ); - } - } - - wfRunHooks( 'SiteNoticeAfter', array( &$siteNotice, $this ) ); - wfProfileOut( __METHOD__ ); - return $siteNotice; - } - - /** - * Create a section edit link. This supersedes editSectionLink() and - * editSectionLinkForOther(). - * - * @param Title $nt The title being linked to (may not be the same as - * the current page, if the section is included from a template) - * @param string $section The designation of the section being pointed to, - * to be included in the link, like "§ion=$section" - * @param string $tooltip The tooltip to use for the link: will be escaped - * and wrapped in the 'editsectionhint' message - * @param string $lang Language code - * @return string HTML to use for edit link - */ - public function doEditSectionLink( Title $nt, $section, $tooltip = null, $lang = false ) { - // HTML generated here should probably have userlangattributes - // added to it for LTR text on RTL pages - - $lang = wfGetLangObj( $lang ); - - $attribs = array(); - if ( !is_null( $tooltip ) ) { - # Bug 25462: undo double-escaping. - $tooltip = Sanitizer::decodeCharReferences( $tooltip ); - $attribs['title'] = wfMessage( 'editsectionhint' )->rawParams( $tooltip ) - ->inLanguage( $lang )->text(); - } - $link = Linker::link( $nt, wfMessage( 'editsection' )->inLanguage( $lang )->text(), - $attribs, - array( 'action' => 'edit', 'section' => $section ), - array( 'noclasses', 'known' ) - ); - - # Add the brackets and the span and run the hook. - $result = '' - . '[' - . $link - . ']' - . ''; - - wfRunHooks( 'DoEditSectionLink', array( $this, $nt, $section, $tooltip, &$result, $lang ) ); - return $result; - } - - /** - * Use PHP's magic __call handler to intercept legacy calls to the linker - * for backwards compatibility. - * - * @param string $fname Name of called method - * @param array $args Arguments to the method - * @throws MWException - * @return mixed - */ - function __call( $fname, $args ) { - $realFunction = array( 'Linker', $fname ); - if ( is_callable( $realFunction ) ) { - wfDeprecated( get_class( $this ) . '::' . $fname, '1.21' ); - return call_user_func_array( $realFunction, $args ); - } else { - $className = get_class( $this ); - throw new MWException( "Call to undefined method $className::$fname" ); - } - } - -} diff --git a/includes/SkinTemplate.php b/includes/SkinTemplate.php deleted file mode 100644 index 52e72e87de..0000000000 --- a/includes/SkinTemplate.php +++ /dev/null @@ -1,2113 +0,0 @@ -context[$varName] = $value; - } - - function translate( $value ) { - wfProfileIn( __METHOD__ ); - - // Hack for i18n:attributes in PHPTAL 1.0.0 dev version as of 2004-10-23 - $value = preg_replace( '/^string:/', '', $value ); - - $value = wfMessage( $value )->text(); - // interpolate variables - $m = array(); - while ( preg_match( '/\$([0-9]*?)/sm', $value, $m ) ) { - list( $src, $var ) = $m; - wfSuppressWarnings(); - $varValue = $this->context[$var]; - wfRestoreWarnings(); - $value = str_replace( $src, $varValue, $value ); - } - wfProfileOut( __METHOD__ ); - return $value; - } -} - -/** - * Template-filler skin base class - * Formerly generic PHPTal (http://phptal.sourceforge.net/) skin - * Based on Brion's smarty skin - * @copyright Copyright © Gabriel Wicke -- http://www.aulinx.de/ - * - * @todo Needs some serious refactoring into functions that correspond - * to the computations individual esi snippets need. Most importantly no body - * parsing for most of those of course. - * - * @ingroup Skins - */ -class SkinTemplate extends Skin { - /** - * @var string Name of our skin, it probably needs to be all lower case. - * Child classes should override the default. - */ - public $skinname = 'monobook'; - - /** - * @var string For QuickTemplate, the name of the subclass which will - * actually fill the template. Child classes should override the default. - */ - public $template = 'QuickTemplate'; - - /** - * Add specific styles for this skin - * - * @param OutputPage $out - */ - function setupSkinUserCss( OutputPage $out ) { - $out->addModuleStyles( array( - 'mediawiki.legacy.shared', - 'mediawiki.legacy.commonPrint', - 'mediawiki.ui.button' - ) ); - } - - /** - * Create the template engine object; we feed it a bunch of data - * and eventually it spits out some HTML. Should have interface - * roughly equivalent to PHPTAL 0.7. - * - * @param string $classname - * @param bool|string $repository Subdirectory where we keep template files - * @param bool|string $cache_dir - * @return QuickTemplate - * @private - */ - function setupTemplate( $classname, $repository = false, $cache_dir = false ) { - return new $classname(); - } - - /** - * Generates array of language links for the current page - * - * @return array - */ - public function getLanguages() { - global $wgHideInterlanguageLinks; - if ( $wgHideInterlanguageLinks ) { - return array(); - } - - $userLang = $this->getLanguage(); - $languageLinks = array(); - - foreach ( $this->getOutput()->getLanguageLinks() as $languageLinkText ) { - $languageLinkParts = explode( ':', $languageLinkText, 2 ); - $class = 'interlanguage-link interwiki-' . $languageLinkParts[0]; - unset( $languageLinkParts ); - - $languageLinkTitle = Title::newFromText( $languageLinkText ); - if ( $languageLinkTitle ) { - $ilInterwikiCode = $languageLinkTitle->getInterwiki(); - $ilLangName = Language::fetchLanguageName( $ilInterwikiCode ); - - if ( strval( $ilLangName ) === '' ) { - $ilDisplayTextMsg = wfMessage( "interlanguage-link-$ilInterwikiCode" ); - if ( !$ilDisplayTextMsg->isDisabled() ) { - // Use custom MW message for the display text - $ilLangName = $ilDisplayTextMsg->text(); - } else { - // Last resort: fallback to the language link target - $ilLangName = $languageLinkText; - } - } else { - // Use the language autonym as display text - $ilLangName = $this->formatLanguageName( $ilLangName ); - } - - // CLDR extension or similar is required to localize the language name; - // otherwise we'll end up with the autonym again. - $ilLangLocalName = Language::fetchLanguageName( - $ilInterwikiCode, - $userLang->getCode() - ); - - $languageLinkTitleText = $languageLinkTitle->getText(); - if ( $ilLangLocalName === '' ) { - $ilFriendlySiteName = wfMessage( "interlanguage-link-sitename-$ilInterwikiCode" ); - if ( !$ilFriendlySiteName->isDisabled() ) { - if ( $languageLinkTitleText === '' ) { - $ilTitle = wfMessage( - 'interlanguage-link-title-nonlangonly', - $ilFriendlySiteName->text() - )->text(); - } else { - $ilTitle = wfMessage( - 'interlanguage-link-title-nonlang', - $languageLinkTitleText, - $ilFriendlySiteName->text() - )->text(); - } - } else { - // we have nothing friendly to put in the title, so fall back to - // displaying the interlanguage link itself in the title text - // (similar to what is done in page content) - $ilTitle = $languageLinkTitle->getInterwiki() . - ":$languageLinkTitleText"; - } - } elseif ( $languageLinkTitleText === '' ) { - $ilTitle = wfMessage( - 'interlanguage-link-title-langonly', - $ilLangLocalName - )->text(); - } else { - $ilTitle = wfMessage( - 'interlanguage-link-title', - $languageLinkTitleText, - $ilLangLocalName - )->text(); - } - - $ilInterwikiCodeBCP47 = wfBCP47( $ilInterwikiCode ); - $languageLink = array( - 'href' => $languageLinkTitle->getFullURL(), - 'text' => $ilLangName, - 'title' => $ilTitle, - 'class' => $class, - 'lang' => $ilInterwikiCodeBCP47, - 'hreflang' => $ilInterwikiCodeBCP47, - ); - wfRunHooks( - 'SkinTemplateGetLanguageLink', - array( &$languageLink, $languageLinkTitle, $this->getTitle() ) - ); - $languageLinks[] = $languageLink; - } - } - - return $languageLinks; - } - - protected function setupTemplateForOutput() { - wfProfileIn( __METHOD__ ); - - $request = $this->getRequest(); - $user = $this->getUser(); - $title = $this->getTitle(); - - wfProfileIn( __METHOD__ . '-init' ); - $tpl = $this->setupTemplate( $this->template, 'skins' ); - wfProfileOut( __METHOD__ . '-init' ); - - wfProfileIn( __METHOD__ . '-stuff' ); - $this->thispage = $title->getPrefixedDBkey(); - $this->titletxt = $title->getPrefixedText(); - $this->userpage = $user->getUserPage()->getPrefixedText(); - $query = array(); - if ( !$request->wasPosted() ) { - $query = $request->getValues(); - unset( $query['title'] ); - unset( $query['returnto'] ); - unset( $query['returntoquery'] ); - } - $this->thisquery = wfArrayToCgi( $query ); - $this->loggedin = $user->isLoggedIn(); - $this->username = $user->getName(); - - if ( $this->loggedin || $this->showIPinHeader() ) { - $this->userpageUrlDetails = self::makeUrlDetails( $this->userpage ); - } else { - # This won't be used in the standard skins, but we define it to preserve the interface - # To save time, we check for existence - $this->userpageUrlDetails = self::makeKnownUrlDetails( $this->userpage ); - } - - wfProfileOut( __METHOD__ . '-stuff' ); - - wfProfileOut( __METHOD__ ); - - return $tpl; - } - - /** - * initialize various variables and generate the template - * - * @param OutputPage $out - */ - function outputPage( OutputPage $out = null ) { - wfProfileIn( __METHOD__ ); - Profiler::instance()->setTemplated( true ); - - $oldContext = null; - if ( $out !== null ) { - // @todo Add wfDeprecated in 1.20 - $oldContext = $this->getContext(); - $this->setContext( $out->getContext() ); - } - - $out = $this->getOutput(); - - wfProfileIn( __METHOD__ . '-init' ); - $this->initPage( $out ); - wfProfileOut( __METHOD__ . '-init' ); - $tpl = $this->prepareQuickTemplate( $out ); - // execute template - wfProfileIn( __METHOD__ . '-execute' ); - $res = $tpl->execute(); - wfProfileOut( __METHOD__ . '-execute' ); - - // result may be an error - $this->printOrError( $res ); - - if ( $oldContext ) { - $this->setContext( $oldContext ); - } - - wfProfileOut( __METHOD__ ); - } - - /** - * initialize various variables and generate the template - * - * @since 1.23 - * @return QuickTemplate The template to be executed by outputPage - */ - protected function prepareQuickTemplate() { - global $wgContLang, $wgScript, $wgStylePath, $wgMimeType, $wgJsMimeType, - $wgDisableCounters, $wgSitename, $wgLogo, $wgMaxCredits, - $wgShowCreditsIfMax, $wgPageShowWatchingUsers, $wgArticlePath, - $wgScriptPath, $wgServer; - - wfProfileIn( __METHOD__ ); - - $title = $this->getTitle(); - $request = $this->getRequest(); - $out = $this->getOutput(); - $tpl = $this->setupTemplateForOutput(); - - wfProfileIn( __METHOD__ . '-stuff2' ); - $tpl->set( 'title', $out->getPageTitle() ); - $tpl->set( 'pagetitle', $out->getHTMLTitle() ); - $tpl->set( 'displaytitle', $out->mPageLinkTitle ); - - $tpl->setRef( 'thispage', $this->thispage ); - $tpl->setRef( 'titleprefixeddbkey', $this->thispage ); - $tpl->set( 'titletext', $title->getText() ); - $tpl->set( 'articleid', $title->getArticleID() ); - - $tpl->set( 'isarticle', $out->isArticle() ); - - $subpagestr = $this->subPageSubtitle(); - if ( $subpagestr !== '' ) { - $subpagestr = '' . $subpagestr . ''; - } - $tpl->set( 'subtitle', $subpagestr . $out->getSubtitle() ); - - $undelete = $this->getUndeleteLink(); - if ( $undelete === '' ) { - $tpl->set( 'undelete', '' ); - } else { - $tpl->set( 'undelete', '' . $undelete . '' ); - } - - $tpl->set( 'catlinks', $this->getCategories() ); - if ( $out->isSyndicated() ) { - $feeds = array(); - foreach ( $out->getSyndicationLinks() as $format => $link ) { - $feeds[$format] = array( - // Messages: feed-atom, feed-rss - 'text' => $this->msg( "feed-$format" )->text(), - 'href' => $link - ); - } - $tpl->setRef( 'feeds', $feeds ); - } else { - $tpl->set( 'feeds', false ); - } - - $tpl->setRef( 'mimetype', $wgMimeType ); - $tpl->setRef( 'jsmimetype', $wgJsMimeType ); - $tpl->set( 'charset', 'UTF-8' ); - $tpl->setRef( 'wgScript', $wgScript ); - $tpl->setRef( 'skinname', $this->skinname ); - $tpl->set( 'skinclass', get_class( $this ) ); - $tpl->setRef( 'skin', $this ); - $tpl->setRef( 'stylename', $this->stylename ); - $tpl->set( 'printable', $out->isPrintable() ); - $tpl->set( 'handheld', $request->getBool( 'handheld' ) ); - $tpl->setRef( 'loggedin', $this->loggedin ); - $tpl->set( 'notspecialpage', !$title->isSpecialPage() ); - $tpl->set( 'searchaction', $this->escapeSearchLink() ); - $tpl->set( 'searchtitle', SpecialPage::getTitleFor( 'Search' )->getPrefixedDBkey() ); - $tpl->set( 'search', trim( $request->getVal( 'search' ) ) ); - $tpl->setRef( 'stylepath', $wgStylePath ); - $tpl->setRef( 'articlepath', $wgArticlePath ); - $tpl->setRef( 'scriptpath', $wgScriptPath ); - $tpl->setRef( 'serverurl', $wgServer ); - $tpl->setRef( 'logopath', $wgLogo ); - $tpl->setRef( 'sitename', $wgSitename ); - - $userLang = $this->getLanguage(); - $userLangCode = $userLang->getHtmlCode(); - $userLangDir = $userLang->getDir(); - - $tpl->set( 'lang', $userLangCode ); - $tpl->set( 'dir', $userLangDir ); - $tpl->set( 'rtl', $userLang->isRTL() ); - - $tpl->set( 'capitalizeallnouns', $userLang->capitalizeAllNouns() ? ' capitalize-all-nouns' : '' ); - $tpl->set( 'showjumplinks', true ); // showjumplinks preference has been removed - $tpl->set( 'username', $this->loggedin ? $this->username : null ); - $tpl->setRef( 'userpage', $this->userpage ); - $tpl->setRef( 'userpageurl', $this->userpageUrlDetails['href'] ); - $tpl->set( 'userlang', $userLangCode ); - - // Users can have their language set differently than the - // content of the wiki. For these users, tell the web browser - // that interface elements are in a different language. - $tpl->set( 'userlangattributes', '' ); - $tpl->set( 'specialpageattributes', '' ); # obsolete - // Used by VectorBeta to insert HTML before content but after the - // heading for the page title. Defaults to empty string. - $tpl->set( 'prebodyhtml', '' ); - - if ( $userLangCode !== $wgContLang->getHtmlCode() || $userLangDir !== $wgContLang->getDir() ) { - $escUserlang = htmlspecialchars( $userLangCode ); - $escUserdir = htmlspecialchars( $userLangDir ); - // Attributes must be in double quotes because htmlspecialchars() doesn't - // escape single quotes - $attrs = " lang=\"$escUserlang\" dir=\"$escUserdir\""; - $tpl->set( 'userlangattributes', $attrs ); - } - - wfProfileOut( __METHOD__ . '-stuff2' ); - - wfProfileIn( __METHOD__ . '-stuff3' ); - $tpl->set( 'newtalk', $this->getNewtalks() ); - $tpl->set( 'logo', $this->logoText() ); - - $tpl->set( 'copyright', false ); - $tpl->set( 'viewcount', false ); - $tpl->set( 'lastmod', false ); - $tpl->set( 'credits', false ); - $tpl->set( 'numberofwatchingusers', false ); - if ( $out->isArticle() && $title->exists() ) { - if ( $this->isRevisionCurrent() ) { - if ( !$wgDisableCounters ) { - $viewcount = $this->getWikiPage()->getCount(); - if ( $viewcount ) { - $tpl->set( 'viewcount', $this->msg( 'viewcount' )->numParams( $viewcount )->parse() ); - } - } - - if ( $wgPageShowWatchingUsers ) { - $dbr = wfGetDB( DB_SLAVE ); - $num = $dbr->selectField( 'watchlist', 'COUNT(*)', - array( 'wl_title' => $title->getDBkey(), 'wl_namespace' => $title->getNamespace() ), - __METHOD__ - ); - if ( $num > 0 ) { - $tpl->set( 'numberofwatchingusers', - $this->msg( 'number_of_watching_users_pageview' )->numParams( $num )->parse() - ); - } - } - - if ( $wgMaxCredits != 0 ) { - $tpl->set( 'credits', Action::factory( 'credits', $this->getWikiPage(), - $this->getContext() )->getCredits( $wgMaxCredits, $wgShowCreditsIfMax ) ); - } else { - $tpl->set( 'lastmod', $this->lastModified() ); - } - } - $tpl->set( 'copyright', $this->getCopyright() ); - } - wfProfileOut( __METHOD__ . '-stuff3' ); - - wfProfileIn( __METHOD__ . '-stuff4' ); - $tpl->set( 'copyrightico', $this->getCopyrightIcon() ); - $tpl->set( 'poweredbyico', $this->getPoweredBy() ); - $tpl->set( 'disclaimer', $this->disclaimerLink() ); - $tpl->set( 'privacy', $this->privacyLink() ); - $tpl->set( 'about', $this->aboutLink() ); - - $tpl->set( 'footerlinks', array( - 'info' => array( - 'lastmod', - 'viewcount', - 'numberofwatchingusers', - 'credits', - 'copyright', - ), - 'places' => array( - 'privacy', - 'about', - 'disclaimer', - ), - ) ); - - global $wgFooterIcons; - $tpl->set( 'footericons', $wgFooterIcons ); - foreach ( $tpl->data['footericons'] as $footerIconsKey => &$footerIconsBlock ) { - if ( count( $footerIconsBlock ) > 0 ) { - foreach ( $footerIconsBlock as &$footerIcon ) { - if ( isset( $footerIcon['src'] ) ) { - if ( !isset( $footerIcon['width'] ) ) { - $footerIcon['width'] = 88; - } - if ( !isset( $footerIcon['height'] ) ) { - $footerIcon['height'] = 31; - } - } - } - } else { - unset( $tpl->data['footericons'][$footerIconsKey] ); - } - } - - $tpl->set( 'sitenotice', $this->getSiteNotice() ); - $tpl->set( 'bottomscripts', $this->bottomScripts() ); - $tpl->set( 'printfooter', $this->printSource() ); - - # An ID that includes the actual body text; without categories, contentSub, ... - $realBodyAttribs = array( 'id' => 'mw-content-text' ); - - # Add a mw-content-ltr/rtl class to be able to style based on text direction - # when the content is different from the UI language, i.e.: - # not for special pages or file pages AND only when viewing AND if the page exists - # (or is in MW namespace, because that has default content) - if ( !in_array( $title->getNamespace(), array( NS_SPECIAL, NS_FILE ) ) && - Action::getActionName( $this ) === 'view' && - ( $title->exists() || $title->getNamespace() == NS_MEDIAWIKI ) ) { - $pageLang = $title->getPageViewLanguage(); - $realBodyAttribs['lang'] = $pageLang->getHtmlCode(); - $realBodyAttribs['dir'] = $pageLang->getDir(); - $realBodyAttribs['class'] = 'mw-content-' . $pageLang->getDir(); - } - - $out->mBodytext = Html::rawElement( 'div', $realBodyAttribs, $out->mBodytext ); - $tpl->setRef( 'bodytext', $out->mBodytext ); - - $language_urls = $this->getLanguages(); - if ( count( $language_urls ) ) { - $tpl->setRef( 'language_urls', $language_urls ); - } else { - $tpl->set( 'language_urls', false ); - } - wfProfileOut( __METHOD__ . '-stuff4' ); - - wfProfileIn( __METHOD__ . '-stuff5' ); - # Personal toolbar - $tpl->set( 'personal_urls', $this->buildPersonalUrls() ); - $content_navigation = $this->buildContentNavigationUrls(); - $content_actions = $this->buildContentActionUrls( $content_navigation ); - $tpl->setRef( 'content_navigation', $content_navigation ); - $tpl->setRef( 'content_actions', $content_actions ); - - $tpl->set( 'sidebar', $this->buildSidebar() ); - $tpl->set( 'nav_urls', $this->buildNavUrls() ); - - // Set the head scripts near the end, in case the above actions resulted in added scripts - $tpl->set( 'headelement', $out->headElement( $this ) ); - - $tpl->set( 'debug', '' ); - $tpl->set( 'debughtml', $this->generateDebugHTML() ); - $tpl->set( 'reporttime', wfReportTime() ); - - // original version by hansm - if ( !wfRunHooks( 'SkinTemplateOutputPageBeforeExec', array( &$this, &$tpl ) ) ) { - wfDebug( __METHOD__ . ": Hook SkinTemplateOutputPageBeforeExec broke outputPage execution!\n" ); - } - - // Set the bodytext to another key so that skins can just output it on it's own - // and output printfooter and debughtml separately - $tpl->set( 'bodycontent', $tpl->data['bodytext'] ); - - // Append printfooter and debughtml onto bodytext so that skins that - // were already using bodytext before they were split out don't suddenly - // start not outputting information. - $tpl->data['bodytext'] .= Html::rawElement( - 'div', - array( 'class' => 'printfooter' ), - "\n{$tpl->data['printfooter']}" - ) . "\n"; - $tpl->data['bodytext'] .= $tpl->data['debughtml']; - - // allow extensions adding stuff after the page content. - // See Skin::afterContentHook() for further documentation. - $tpl->set( 'dataAfterContent', $this->afterContentHook() ); - wfProfileOut( __METHOD__ . '-stuff5' ); - - wfProfileOut( __METHOD__ ); - return $tpl; - } - - /** - * Get the HTML for the p-personal list - * @return string - */ - public function getPersonalToolsList() { - $tpl = $this->setupTemplateForOutput(); - $tpl->set( 'personal_urls', $this->buildPersonalUrls() ); - $html = ''; - foreach ( $tpl->getPersonalTools() as $key => $item ) { - $html .= $tpl->makeListItem( $key, $item ); - } - return $html; - } - - /** - * Format language name for use in sidebar interlanguage links list. - * By default it is capitalized. - * - * @param string $name Language name, e.g. "English" or "español" - * @return string - * @private - */ - function formatLanguageName( $name ) { - return $this->getLanguage()->ucfirst( $name ); - } - - /** - * Output the string, or print error message if it's - * an error object of the appropriate type. - * For the base class, assume strings all around. - * - * @param string $str - * @private - */ - function printOrError( $str ) { - echo $str; - } - - /** - * Output a boolean indicating if buildPersonalUrls should output separate - * login and create account links or output a combined link - * By default we simply return a global config setting that affects most skins - * This is setup as a method so that like with $wgLogo and getLogo() a skin - * can override this setting and always output one or the other if it has - * a reason it can't output one of the two modes. - * @return bool - */ - function useCombinedLoginLink() { - global $wgUseCombinedLoginLink; - return $wgUseCombinedLoginLink; - } - - /** - * build array of urls for personal toolbar - * @return array - */ - protected function buildPersonalUrls() { - $title = $this->getTitle(); - $request = $this->getRequest(); - $pageurl = $title->getLocalURL(); - wfProfileIn( __METHOD__ ); - - /* set up the default links for the personal toolbar */ - $personal_urls = array(); - - # Due to bug 32276, if a user does not have read permissions, - # $this->getTitle() will just give Special:Badtitle, which is - # not especially useful as a returnto parameter. Use the title - # from the request instead, if there was one. - if ( $this->getUser()->isAllowed( 'read' ) ) { - $page = $this->getTitle(); - } else { - $page = Title::newFromText( $request->getVal( 'title', '' ) ); - } - $page = $request->getVal( 'returnto', $page ); - $a = array(); - if ( strval( $page ) !== '' ) { - $a['returnto'] = $page; - $query = $request->getVal( 'returntoquery', $this->thisquery ); - if ( $query != '' ) { - $a['returntoquery'] = $query; - } - } - - $returnto = wfArrayToCgi( $a ); - if ( $this->loggedin ) { - $personal_urls['userpage'] = array( - 'text' => $this->username, - 'href' => &$this->userpageUrlDetails['href'], - 'class' => $this->userpageUrlDetails['exists'] ? false : 'new', - 'active' => ( $this->userpageUrlDetails['href'] == $pageurl ), - 'dir' => 'auto' - ); - $usertalkUrlDetails = $this->makeTalkUrlDetails( $this->userpage ); - $personal_urls['mytalk'] = array( - 'text' => $this->msg( 'mytalk' )->text(), - 'href' => &$usertalkUrlDetails['href'], - 'class' => $usertalkUrlDetails['exists'] ? false : 'new', - 'active' => ( $usertalkUrlDetails['href'] == $pageurl ) - ); - $href = self::makeSpecialUrl( 'Preferences' ); - $personal_urls['preferences'] = array( - 'text' => $this->msg( 'mypreferences' )->text(), - 'href' => $href, - 'active' => ( $href == $pageurl ) - ); - - if ( $this->getUser()->isAllowed( 'viewmywatchlist' ) ) { - $href = self::makeSpecialUrl( 'Watchlist' ); - $personal_urls['watchlist'] = array( - 'text' => $this->msg( 'mywatchlist' )->text(), - 'href' => $href, - 'active' => ( $href == $pageurl ) - ); - } - - # We need to do an explicit check for Special:Contributions, as we - # have to match both the title, and the target, which could come - # from request values (Special:Contributions?target=Jimbo_Wales) - # or be specified in "sub page" form - # (Special:Contributions/Jimbo_Wales). The plot - # thickens, because the Title object is altered for special pages, - # 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() ); - $active = $spName == 'Contributions' - && ( ( $spPar && $spPar == $this->username ) - || $request->getText( 'target' ) == $this->username ); - } else { - $active = false; - } - - $href = self::makeSpecialUrlSubpage( 'Contributions', $this->username ); - $personal_urls['mycontris'] = array( - 'text' => $this->msg( 'mycontris' )->text(), - 'href' => $href, - 'active' => $active - ); - $personal_urls['logout'] = array( - 'text' => $this->msg( 'pt-userlogout' )->text(), - 'href' => self::makeSpecialUrl( 'Userlogout', - // userlogout link must always contain an & character, otherwise we might not be able - // to detect a buggy precaching proxy (bug 17790) - $title->isSpecial( 'Preferences' ) ? 'noreturnto' : $returnto - ), - 'active' => false - ); - } else { - $useCombinedLoginLink = $this->useCombinedLoginLink(); - $loginlink = $this->getUser()->isAllowed( 'createaccount' ) && $useCombinedLoginLink - ? 'nav-login-createaccount' - : 'pt-login'; - $is_signup = $request->getText( 'type' ) == 'signup'; - - $login_url = array( - 'text' => $this->msg( $loginlink )->text(), - 'href' => self::makeSpecialUrl( 'Userlogin', $returnto ), - 'active' => $title->isSpecial( 'Userlogin' ) - && ( $loginlink == 'nav-login-createaccount' || !$is_signup ), - ); - $createaccount_url = array( - 'text' => $this->msg( 'pt-createaccount' )->text(), - 'href' => self::makeSpecialUrl( 'Userlogin', "$returnto&type=signup" ), - 'active' => $title->isSpecial( 'Userlogin' ) && $is_signup, - ); - - if ( $this->showIPinHeader() ) { - $href = &$this->userpageUrlDetails['href']; - $personal_urls['anonuserpage'] = array( - 'text' => $this->username, - 'href' => $href, - 'class' => $this->userpageUrlDetails['exists'] ? false : 'new', - 'active' => ( $pageurl == $href ) - ); - $usertalkUrlDetails = $this->makeTalkUrlDetails( $this->userpage ); - $href = &$usertalkUrlDetails['href']; - $personal_urls['anontalk'] = array( - 'text' => $this->msg( 'anontalk' )->text(), - 'href' => $href, - 'class' => $usertalkUrlDetails['exists'] ? false : 'new', - 'active' => ( $pageurl == $href ) - ); - } - - if ( $this->getUser()->isAllowed( 'createaccount' ) && !$useCombinedLoginLink ) { - $personal_urls['createaccount'] = $createaccount_url; - } - - $personal_urls['login'] = $login_url; - } - - wfRunHooks( 'PersonalUrls', array( &$personal_urls, &$title, $this ) ); - wfProfileOut( __METHOD__ ); - return $personal_urls; - } - - /** - * Builds an array with tab definition - * - * @param Title $title Page Where the tab links to - * @param string|array $message Message key or an array of message keys (will fall back) - * @param bool $selected Display the tab as selected - * @param string $query Query string attached to tab URL - * @param bool $checkEdit Check if $title exists and mark with .new if one doesn't - * - * @return array - */ - function tabAction( $title, $message, $selected, $query = '', $checkEdit = false ) { - $classes = array(); - if ( $selected ) { - $classes[] = 'selected'; - } - if ( $checkEdit && !$title->isKnown() ) { - $classes[] = 'new'; - if ( $query !== '' ) { - $query = 'action=edit&redlink=1&' . $query; - } else { - $query = 'action=edit&redlink=1'; - } - } - - // wfMessageFallback will nicely accept $message as an array of fallbacks - // or just a single key - $msg = wfMessageFallback( $message )->setContext( $this->getContext() ); - if ( is_array( $message ) ) { - // for hook compatibility just keep the last message name - $message = end( $message ); - } - if ( $msg->exists() ) { - $text = $msg->text(); - } else { - global $wgContLang; - $text = $wgContLang->getFormattedNsText( - MWNamespace::getSubject( $title->getNamespace() ) ); - } - - $result = array(); - if ( !wfRunHooks( 'SkinTemplateTabAction', array( &$this, - $title, $message, $selected, $checkEdit, - &$classes, &$query, &$text, &$result ) ) ) { - return $result; - } - - return array( - 'class' => implode( ' ', $classes ), - 'text' => $text, - 'href' => $title->getLocalURL( $query ), - 'primary' => true ); - } - - function makeTalkUrlDetails( $name, $urlaction = '' ) { - $title = Title::newFromText( $name ); - if ( !is_object( $title ) ) { - throw new MWException( __METHOD__ . " given invalid pagename $name" ); - } - $title = $title->getTalkPage(); - self::checkTitle( $title, $name ); - return array( - 'href' => $title->getLocalURL( $urlaction ), - 'exists' => $title->getArticleID() != 0, - ); - } - - function makeArticleUrlDetails( $name, $urlaction = '' ) { - $title = Title::newFromText( $name ); - $title = $title->getSubjectPage(); - self::checkTitle( $title, $name ); - return array( - 'href' => $title->getLocalURL( $urlaction ), - 'exists' => $title->getArticleID() != 0, - ); - } - - /** - * a structured array of links usually used for the tabs in a skin - * - * There are 4 standard sections - * namespaces: Used for namespace tabs like special, page, and talk namespaces - * views: Used for primary page views like read, edit, history - * actions: Used for most extra page actions like deletion, protection, etc... - * variants: Used to list the language variants for the page - * - * Each section's value is a key/value array of links for that section. - * The links themselves have these common keys: - * - class: The css classes to apply to the tab - * - text: The text to display on the tab - * - href: The href for the tab to point to - * - rel: An optional rel= for the tab's link - * - redundant: If true the tab will be dropped in skins using content_actions - * this is useful for tabs like "Read" which only have meaning in skins that - * take special meaning from the grouped structure of content_navigation - * - * Views also have an extra key which can be used: - * - primary: If this is not true skins like vector may try to hide the tab - * when the user has limited space in their browser window - * - * content_navigation using code also expects these ids to be present on the - * links, however these are usually automatically generated by SkinTemplate - * itself and are not necessary when using a hook. The only things these may - * matter to are people modifying content_navigation after it's initial creation: - * - id: A "preferred" id, most skins are best off outputting this preferred - * id for best compatibility. - * - tooltiponly: This is set to true for some tabs in cases where the system - * believes that the accesskey should not be added to the tab. - * - * @return array - */ - protected function buildContentNavigationUrls() { - global $wgDisableLangConversion; - - wfProfileIn( __METHOD__ ); - - // Display tabs for the relevant title rather than always the title itself - $title = $this->getRelevantTitle(); - $onPage = $title->equals( $this->getTitle() ); - - $out = $this->getOutput(); - $request = $this->getRequest(); - $user = $this->getUser(); - - $content_navigation = array( - 'namespaces' => array(), - 'views' => array(), - 'actions' => array(), - 'variants' => array() - ); - - // parameters - $action = $request->getVal( 'action', 'view' ); - - $userCanRead = $title->quickUserCan( 'read', $user ); - - $preventActiveTabs = false; - wfRunHooks( 'SkinTemplatePreventOtherActiveTabs', array( &$this, &$preventActiveTabs ) ); - - // Checks if page is some kind of content - if ( $title->canExist() ) { - // Gets page objects for the related namespaces - $subjectPage = $title->getSubjectPage(); - $talkPage = $title->getTalkPage(); - - // Determines if this is a talk page - $isTalk = $title->isTalkPage(); - - // Generates XML IDs from namespace names - $subjectId = $title->getNamespaceKey( '' ); - - if ( $subjectId == 'main' ) { - $talkId = 'talk'; - } else { - $talkId = "{$subjectId}_talk"; - } - - $skname = $this->skinname; - - // Adds namespace links - $subjectMsg = array( "nstab-$subjectId" ); - if ( $subjectPage->isMainPage() ) { - array_unshift( $subjectMsg, 'mainpage-nstab' ); - } - $content_navigation['namespaces'][$subjectId] = $this->tabAction( - $subjectPage, $subjectMsg, !$isTalk && !$preventActiveTabs, '', $userCanRead - ); - $content_navigation['namespaces'][$subjectId]['context'] = 'subject'; - $content_navigation['namespaces'][$talkId] = $this->tabAction( - $talkPage, array( "nstab-$talkId", 'talk' ), $isTalk && !$preventActiveTabs, '', $userCanRead - ); - $content_navigation['namespaces'][$talkId]['context'] = 'talk'; - - if ( $userCanRead ) { - $isForeignFile = $title->inNamespace( NS_FILE ) && $this->canUseWikiPage() && - $this->getWikiPage() instanceof WikiFilePage && !$this->getWikiPage()->isLocal(); - - // Adds view view link - if ( $title->exists() || $isForeignFile ) { - $content_navigation['views']['view'] = $this->tabAction( - $isTalk ? $talkPage : $subjectPage, - array( "$skname-view-view", 'view' ), - ( $onPage && ( $action == 'view' || $action == 'purge' ) ), '', true - ); - // signal to hide this from simple content_actions - $content_navigation['views']['view']['redundant'] = true; - } - - // If it is a non-local file, show a link to the file in its own repository - if ( $isForeignFile ) { - $file = $this->getWikiPage()->getFile(); - $content_navigation['views']['view-foreign'] = array( - 'class' => '', - 'text' => wfMessageFallback( "$skname-view-foreign", 'view-foreign' )-> - setContext( $this->getContext() )-> - params( $file->getRepo()->getDisplayName() )->text(), - 'href' => $file->getDescriptionUrl(), - 'primary' => false, - ); - } - - wfProfileIn( __METHOD__ . '-edit' ); - - // Checks if user can edit the current page if it exists or create it otherwise - if ( $title->quickUserCan( 'edit', $user ) - && ( $title->exists() || $title->quickUserCan( 'create', $user ) ) - ) { - // Builds CSS class for talk page links - $isTalkClass = $isTalk ? ' istalk' : ''; - // Whether the user is editing the page - $isEditing = $onPage && ( $action == 'edit' || $action == 'submit' ); - // Whether to show the "Add a new section" tab - // Checks if this is a current rev of talk page and is not forced to be hidden - $showNewSection = !$out->forceHideNewSectionLink() - && ( ( $isTalk && $this->isRevisionCurrent() ) || $out->showNewSectionLink() ); - $section = $request->getVal( 'section' ); - - if ( $title->exists() - || ( $title->getNamespace() == NS_MEDIAWIKI - && $title->getDefaultMessageText() !== false - ) - ) { - $msgKey = $isForeignFile ? 'edit-local' : 'edit'; - } else { - $msgKey = $isForeignFile ? 'create-local' : 'create'; - } - $content_navigation['views']['edit'] = array( - 'class' => ( $isEditing && ( $section !== 'new' || !$showNewSection ) - ? 'selected' - : '' - ) . $isTalkClass, - 'text' => wfMessageFallback( "$skname-view-$msgKey", $msgKey ) - ->setContext( $this->getContext() )->text(), - 'href' => $title->getLocalURL( $this->editUrlOptions() ), - 'primary' => !$isForeignFile, // don't collapse this in vector - ); - - // section link - if ( $showNewSection ) { - // Adds new section link - //$content_navigation['actions']['addsection'] - $content_navigation['views']['addsection'] = array( - 'class' => ( $isEditing && $section == 'new' ) ? 'selected' : false, - 'text' => wfMessageFallback( "$skname-action-addsection", 'addsection' ) - ->setContext( $this->getContext() )->text(), - 'href' => $title->getLocalURL( 'action=edit§ion=new' ) - ); - } - // Checks if the page has some kind of viewable content - } elseif ( $title->hasSourceText() ) { - // Adds view source view link - $content_navigation['views']['viewsource'] = array( - 'class' => ( $onPage && $action == 'edit' ) ? 'selected' : false, - 'text' => wfMessageFallback( "$skname-action-viewsource", 'viewsource' ) - ->setContext( $this->getContext() )->text(), - 'href' => $title->getLocalURL( $this->editUrlOptions() ), - 'primary' => true, // don't collapse this in vector - ); - } - wfProfileOut( __METHOD__ . '-edit' ); - - wfProfileIn( __METHOD__ . '-live' ); - // Checks if the page exists - if ( $title->exists() ) { - // Adds history view link - $content_navigation['views']['history'] = array( - 'class' => ( $onPage && $action == 'history' ) ? 'selected' : false, - 'text' => wfMessageFallback( "$skname-view-history", 'history_short' ) - ->setContext( $this->getContext() )->text(), - 'href' => $title->getLocalURL( 'action=history' ), - 'rel' => 'archives', - ); - - if ( $title->quickUserCan( 'delete', $user ) ) { - $content_navigation['actions']['delete'] = array( - 'class' => ( $onPage && $action == 'delete' ) ? 'selected' : false, - 'text' => wfMessageFallback( "$skname-action-delete", 'delete' ) - ->setContext( $this->getContext() )->text(), - 'href' => $title->getLocalURL( 'action=delete' ) - ); - } - - if ( $title->quickUserCan( 'move', $user ) ) { - $moveTitle = SpecialPage::getTitleFor( 'Movepage', $title->getPrefixedDBkey() ); - $content_navigation['actions']['move'] = array( - 'class' => $this->getTitle()->isSpecial( 'Movepage' ) ? 'selected' : false, - 'text' => wfMessageFallback( "$skname-action-move", 'move' ) - ->setContext( $this->getContext() )->text(), - 'href' => $moveTitle->getLocalURL() - ); - } - } else { - // article doesn't exist or is deleted - if ( $user->isAllowed( 'deletedhistory' ) ) { - $n = $title->isDeleted(); - if ( $n ) { - $undelTitle = SpecialPage::getTitleFor( 'Undelete' ); - // If the user can't undelete but can view deleted - // history show them a "View .. deleted" tab instead. - $msgKey = $user->isAllowed( 'undelete' ) ? 'undelete' : 'viewdeleted'; - $content_navigation['actions']['undelete'] = array( - 'class' => $this->getTitle()->isSpecial( 'Undelete' ) ? 'selected' : false, - 'text' => wfMessageFallback( "$skname-action-$msgKey", "{$msgKey}_short" ) - ->setContext( $this->getContext() )->numParams( $n )->text(), - 'href' => $undelTitle->getLocalURL( array( 'target' => $title->getPrefixedDBkey() ) ) - ); - } - } - } - - if ( $title->quickUserCan( 'protect', $user ) && $title->getRestrictionTypes() && - MWNamespace::getRestrictionLevels( $title->getNamespace(), $user ) !== array( '' ) - ) { - $mode = $title->isProtected() ? 'unprotect' : 'protect'; - $content_navigation['actions'][$mode] = array( - 'class' => ( $onPage && $action == $mode ) ? 'selected' : false, - 'text' => wfMessageFallback( "$skname-action-$mode", $mode ) - ->setContext( $this->getContext() )->text(), - 'href' => $title->getLocalURL( "action=$mode" ) - ); - } - - wfProfileOut( __METHOD__ . '-live' ); - - // Checks if the user is logged in - if ( $this->loggedin && $user->isAllowedAll( 'viewmywatchlist', 'editmywatchlist' ) ) { - /** - * The following actions use messages which, if made particular to - * the any specific skins, would break the Ajax code which makes this - * action happen entirely inline. OutputPage::getJSVars - * defines a set of messages in a javascript object - and these - * messages are assumed to be global for all skins. Without making - * a change to that procedure these messages will have to remain as - * the global versions. - */ - $mode = $user->isWatched( $title ) ? 'unwatch' : 'watch'; - $token = WatchAction::getWatchToken( $title, $user, $mode ); - $content_navigation['actions'][$mode] = array( - 'class' => $onPage && ( $action == 'watch' || $action == 'unwatch' ) ? 'selected' : false, - // uses 'watch' or 'unwatch' message - 'text' => $this->msg( $mode )->text(), - 'href' => $title->getLocalURL( array( 'action' => $mode, 'token' => $token ) ) - ); - } - } - - wfRunHooks( 'SkinTemplateNavigation', array( &$this, &$content_navigation ) ); - - if ( $userCanRead && !$wgDisableLangConversion ) { - $pageLang = $title->getPageLanguage(); - // Gets list of language variants - $variants = $pageLang->getVariants(); - // Checks that language conversion is enabled and variants exist - // And if it is not in the special namespace - if ( count( $variants ) > 1 ) { - // Gets preferred variant (note that user preference is - // only possible for wiki content language variant) - $preferred = $pageLang->getPreferredVariant(); - if ( Action::getActionName( $this ) === 'view' ) { - $params = $request->getQueryValues(); - unset( $params['title'] ); - } else { - $params = array(); - } - // Loops over each variant - foreach ( $variants as $code ) { - // Gets variant name from language code - $varname = $pageLang->getVariantname( $code ); - // Appends variant link - $content_navigation['variants'][] = array( - 'class' => ( $code == $preferred ) ? 'selected' : false, - 'text' => $varname, - 'href' => $title->getLocalURL( array( 'variant' => $code ) + $params ), - 'lang' => wfBCP47( $code ), - 'hreflang' => wfBCP47( $code ), - ); - } - } - } - } else { - // If it's not content, it's got to be a special page - $content_navigation['namespaces']['special'] = array( - 'class' => 'selected', - 'text' => $this->msg( 'nstab-special' )->text(), - 'href' => $request->getRequestURL(), // @see: bug 2457, bug 2510 - 'context' => 'subject' - ); - - wfRunHooks( 'SkinTemplateNavigation::SpecialPage', - array( &$this, &$content_navigation ) ); - } - - // Equiv to SkinTemplateContentActions - wfRunHooks( 'SkinTemplateNavigation::Universal', array( &$this, &$content_navigation ) ); - - // Setup xml ids and tooltip info - foreach ( $content_navigation as $section => &$links ) { - foreach ( $links as $key => &$link ) { - $xmlID = $key; - if ( isset( $link['context'] ) && $link['context'] == 'subject' ) { - $xmlID = 'ca-nstab-' . $xmlID; - } elseif ( isset( $link['context'] ) && $link['context'] == 'talk' ) { - $xmlID = 'ca-talk'; - } elseif ( $section == 'variants' ) { - $xmlID = 'ca-varlang-' . $xmlID; - } else { - $xmlID = 'ca-' . $xmlID; - } - $link['id'] = $xmlID; - } - } - - # We don't want to give the watch tab an accesskey if the - # page is being edited, because that conflicts with the - # accesskey on the watch checkbox. We also don't want to - # give the edit tab an accesskey, because that's fairly - # superfluous and conflicts with an accesskey (Ctrl-E) often - # used for editing in Safari. - if ( in_array( $action, array( 'edit', 'submit' ) ) ) { - if ( isset( $content_navigation['views']['edit'] ) ) { - $content_navigation['views']['edit']['tooltiponly'] = true; - } - if ( isset( $content_navigation['actions']['watch'] ) ) { - $content_navigation['actions']['watch']['tooltiponly'] = true; - } - if ( isset( $content_navigation['actions']['unwatch'] ) ) { - $content_navigation['actions']['unwatch']['tooltiponly'] = true; - } - } - - wfProfileOut( __METHOD__ ); - - return $content_navigation; - } - - /** - * an array of edit links by default used for the tabs - * @param array $content_navigation - * @return array - */ - private function buildContentActionUrls( $content_navigation ) { - - wfProfileIn( __METHOD__ ); - - // content_actions has been replaced with content_navigation for backwards - // compatibility and also for skins that just want simple tabs content_actions - // is now built by flattening the content_navigation arrays into one - - $content_actions = array(); - - foreach ( $content_navigation as $links ) { - foreach ( $links as $key => $value ) { - if ( isset( $value['redundant'] ) && $value['redundant'] ) { - // Redundant tabs are dropped from content_actions - continue; - } - - // content_actions used to have ids built using the "ca-$key" pattern - // so the xmlID based id is much closer to the actual $key that we want - // for that reason we'll just strip out the ca- if present and use - // the latter potion of the "id" as the $key - if ( isset( $value['id'] ) && substr( $value['id'], 0, 3 ) == 'ca-' ) { - $key = substr( $value['id'], 3 ); - } - - if ( isset( $content_actions[$key] ) ) { - wfDebug( __METHOD__ . ": Found a duplicate key for $key while flattening " . - "content_navigation into content_actions.\n" ); - continue; - } - - $content_actions[$key] = $value; - } - } - - wfProfileOut( __METHOD__ ); - - return $content_actions; - } - - /** - * build array of common navigation links - * @return array - */ - protected function buildNavUrls() { - global $wgUploadNavigationUrl; - - wfProfileIn( __METHOD__ ); - - $out = $this->getOutput(); - $request = $this->getRequest(); - - $nav_urls = array(); - $nav_urls['mainpage'] = array( 'href' => self::makeMainPageUrl() ); - if ( $wgUploadNavigationUrl ) { - $nav_urls['upload'] = array( 'href' => $wgUploadNavigationUrl ); - } elseif ( UploadBase::isEnabled() && UploadBase::isAllowed( $this->getUser() ) === true ) { - $nav_urls['upload'] = array( 'href' => self::makeSpecialUrl( 'Upload' ) ); - } else { - $nav_urls['upload'] = false; - } - $nav_urls['specialpages'] = array( 'href' => self::makeSpecialUrl( 'Specialpages' ) ); - - $nav_urls['print'] = false; - $nav_urls['permalink'] = false; - $nav_urls['info'] = false; - $nav_urls['whatlinkshere'] = false; - $nav_urls['recentchangeslinked'] = false; - $nav_urls['contributions'] = false; - $nav_urls['log'] = false; - $nav_urls['blockip'] = false; - $nav_urls['emailuser'] = false; - $nav_urls['userrights'] = false; - - // A print stylesheet is attached to all pages, but nobody ever - // figures that out. :) Add a link... - if ( !$out->isPrintable() && ( $out->isArticle() || $this->getTitle()->isSpecialPage() ) ) { - $nav_urls['print'] = array( - 'text' => $this->msg( 'printableversion' )->text(), - 'href' => $this->getTitle()->getLocalURL( - $request->appendQueryValue( 'printable', 'yes', true ) ) - ); - } - - if ( $out->isArticle() ) { - // Also add a "permalink" while we're at it - $revid = $this->getRevisionId(); - if ( $revid ) { - $nav_urls['permalink'] = array( - 'text' => $this->msg( 'permalink' )->text(), - 'href' => $this->getTitle()->getLocalURL( "oldid=$revid" ) - ); - } - - // Use the copy of revision ID in case this undocumented, shady hook tries to mess with internals - wfRunHooks( 'SkinTemplateBuildNavUrlsNav_urlsAfterPermalink', - array( &$this, &$nav_urls, &$revid, &$revid ) ); - } - - if ( $out->isArticleRelated() ) { - $nav_urls['whatlinkshere'] = array( - 'href' => SpecialPage::getTitleFor( 'Whatlinkshere', $this->thispage )->getLocalURL() - ); - - $nav_urls['info'] = array( - 'text' => $this->msg( 'pageinfo-toolboxlink' )->text(), - 'href' => $this->getTitle()->getLocalURL( "action=info" ) - ); - - if ( $this->getTitle()->getArticleID() ) { - $nav_urls['recentchangeslinked'] = array( - 'href' => SpecialPage::getTitleFor( 'Recentchangeslinked', $this->thispage )->getLocalURL() - ); - } - } - - $user = $this->getRelevantUser(); - if ( $user ) { - $rootUser = $user->getName(); - - $nav_urls['contributions'] = array( - 'text' => $this->msg( 'contributions', $rootUser )->text(), - 'href' => self::makeSpecialUrlSubpage( 'Contributions', $rootUser ) - ); - - $nav_urls['log'] = array( - 'href' => self::makeSpecialUrlSubpage( 'Log', $rootUser ) - ); - - if ( $this->getUser()->isAllowed( 'block' ) ) { - $nav_urls['blockip'] = array( - 'href' => self::makeSpecialUrlSubpage( 'Block', $rootUser ) - ); - } - - if ( $this->showEmailUser( $user ) ) { - $nav_urls['emailuser'] = array( - 'href' => self::makeSpecialUrlSubpage( 'Emailuser', $rootUser ) - ); - } - - if ( !$user->isAnon() ) { - $sur = new UserrightsPage; - $sur->setContext( $this->getContext() ); - if ( $sur->userCanExecute( $this->getUser() ) ) { - $nav_urls['userrights'] = array( - 'href' => self::makeSpecialUrlSubpage( 'Userrights', $rootUser ) - ); - } - } - } - - wfProfileOut( __METHOD__ ); - return $nav_urls; - } - - /** - * Generate strings used for xml 'id' names - * @return string - */ - protected function getNameSpaceKey() { - return $this->getTitle()->getNamespaceKey(); - } -} - -/** - * Generic wrapper for template functions, with interface - * compatible with what we use of PHPTAL 0.7. - * @ingroup Skins - */ -abstract class QuickTemplate { - /** - * Constructor - */ - function __construct() { - $this->data = array(); - $this->translator = new MediaWikiI18N(); - } - - /** - * Sets the value $value to $name - * @param string $name - * @param mixed $value - */ - public function set( $name, $value ) { - $this->data[$name] = $value; - } - - /** - * Gets the template data requested - * @since 1.22 - * @param string $name Key for the data - * @param mixed $default Optional default (or null) - * @return mixed The value of the data requested or the deafult - */ - public function get( $name, $default = null ) { - if ( isset( $this->data[$name] ) ) { - return $this->data[$name]; - } else { - return $default; - } - } - - /** - * @param string $name - * @param mixed $value - */ - public function setRef( $name, &$value ) { - $this->data[$name] =& $value; - } - - /** - * @param MediaWikiI18N $t - */ - public function setTranslator( &$t ) { - $this->translator = &$t; - } - - /** - * Main function, used by classes that subclass QuickTemplate - * to show the actual HTML output - */ - abstract public function execute(); - - /** - * @private - * @param string $str - * @return string - */ - function text( $str ) { - echo htmlspecialchars( $this->data[$str] ); - } - - /** - * @private - * @param string $str - * @return string - */ - function html( $str ) { - echo $this->data[$str]; - } - - /** - * @private - * @param string $str - * @return string - */ - function msg( $str ) { - echo htmlspecialchars( $this->translator->translate( $str ) ); - } - - /** - * @private - * @param string $str - * @return string - */ - function msgHtml( $str ) { - echo $this->translator->translate( $str ); - } - - /** - * An ugly, ugly hack. - * @private - * @param string $str - * @return string - */ - function msgWiki( $str ) { - global $wgOut; - - $text = $this->translator->translate( $str ); - echo $wgOut->parse( $text ); - } - - /** - * @private - * @param string $str - * @return bool - */ - function haveData( $str ) { - return isset( $this->data[$str] ); - } - - /** - * @private - * - * @param string $str - * @return bool - */ - function haveMsg( $str ) { - $msg = $this->translator->translate( $str ); - return ( $msg != '-' ) && ( $msg != '' ); # ???? - } - - /** - * Get the Skin object related to this object - * - * @return Skin - */ - public function getSkin() { - return $this->data['skin']; - } - - /** - * Fetch the output of a QuickTemplate and return it - * - * @since 1.23 - * @return string - */ - public function getHTML() { - ob_start(); - $this->execute(); - $html = ob_get_contents(); - ob_end_clean(); - return $html; - } -} - -/** - * New base template for a skin's template extended from QuickTemplate - * this class features helper methods that provide common ways of interacting - * with the data stored in the QuickTemplate - */ -abstract class BaseTemplate extends QuickTemplate { - - /** - * Get a Message object with its context set - * - * @param string $name Message name - * @return Message - */ - public function getMsg( $name ) { - return $this->getSkin()->msg( $name ); - } - - function msg( $str ) { - echo $this->getMsg( $str )->escaped(); - } - - function msgHtml( $str ) { - echo $this->getMsg( $str )->text(); - } - - function msgWiki( $str ) { - echo $this->getMsg( $str )->parseAsBlock(); - } - - /** - * Create an array of common toolbox items from the data in the quicktemplate - * stored by SkinTemplate. - * The resulting array is built according to a format intended to be passed - * through makeListItem to generate the html. - * @return array - */ - function getToolbox() { - wfProfileIn( __METHOD__ ); - - $toolbox = array(); - if ( isset( $this->data['nav_urls']['whatlinkshere'] ) - && $this->data['nav_urls']['whatlinkshere'] - ) { - $toolbox['whatlinkshere'] = $this->data['nav_urls']['whatlinkshere']; - $toolbox['whatlinkshere']['id'] = 't-whatlinkshere'; - } - if ( isset( $this->data['nav_urls']['recentchangeslinked'] ) - && $this->data['nav_urls']['recentchangeslinked'] - ) { - $toolbox['recentchangeslinked'] = $this->data['nav_urls']['recentchangeslinked']; - $toolbox['recentchangeslinked']['msg'] = 'recentchangeslinked-toolbox'; - $toolbox['recentchangeslinked']['id'] = 't-recentchangeslinked'; - } - if ( isset( $this->data['feeds'] ) && $this->data['feeds'] ) { - $toolbox['feeds']['id'] = 'feedlinks'; - $toolbox['feeds']['links'] = array(); - foreach ( $this->data['feeds'] as $key => $feed ) { - $toolbox['feeds']['links'][$key] = $feed; - $toolbox['feeds']['links'][$key]['id'] = "feed-$key"; - $toolbox['feeds']['links'][$key]['rel'] = 'alternate'; - $toolbox['feeds']['links'][$key]['type'] = "application/{$key}+xml"; - $toolbox['feeds']['links'][$key]['class'] = 'feedlink'; - } - } - foreach ( array( 'contributions', 'log', 'blockip', 'emailuser', - 'userrights', 'upload', 'specialpages' ) as $special - ) { - if ( isset( $this->data['nav_urls'][$special] ) && $this->data['nav_urls'][$special] ) { - $toolbox[$special] = $this->data['nav_urls'][$special]; - $toolbox[$special]['id'] = "t-$special"; - } - } - if ( isset( $this->data['nav_urls']['print'] ) && $this->data['nav_urls']['print'] ) { - $toolbox['print'] = $this->data['nav_urls']['print']; - $toolbox['print']['id'] = 't-print'; - $toolbox['print']['rel'] = 'alternate'; - $toolbox['print']['msg'] = 'printableversion'; - } - if ( isset( $this->data['nav_urls']['permalink'] ) && $this->data['nav_urls']['permalink'] ) { - $toolbox['permalink'] = $this->data['nav_urls']['permalink']; - if ( $toolbox['permalink']['href'] === '' ) { - unset( $toolbox['permalink']['href'] ); - $toolbox['ispermalink']['tooltiponly'] = true; - $toolbox['ispermalink']['id'] = 't-ispermalink'; - $toolbox['ispermalink']['msg'] = 'permalink'; - } else { - $toolbox['permalink']['id'] = 't-permalink'; - } - } - if ( isset( $this->data['nav_urls']['info'] ) && $this->data['nav_urls']['info'] ) { - $toolbox['info'] = $this->data['nav_urls']['info']; - $toolbox['info']['id'] = 't-info'; - } - - wfRunHooks( 'BaseTemplateToolbox', array( &$this, &$toolbox ) ); - wfProfileOut( __METHOD__ ); - return $toolbox; - } - - /** - * Create an array of personal tools items from the data in the quicktemplate - * stored by SkinTemplate. - * The resulting array is built according to a format intended to be passed - * through makeListItem to generate the html. - * This is in reality the same list as already stored in personal_urls - * however it is reformatted so that you can just pass the individual items - * to makeListItem instead of hardcoding the element creation boilerplate. - * @return array - */ - function getPersonalTools() { - $personal_tools = array(); - foreach ( $this->get( 'personal_urls' ) as $key => $plink ) { - # The class on a personal_urls item is meant to go on the instead - # of the
  • so we have to use a single item "links" array instead - # of using most of the personal_url's keys directly. - $ptool = array( - 'links' => array( - array( 'single-id' => "pt-$key" ), - ), - 'id' => "pt-$key", - ); - if ( isset( $plink['active'] ) ) { - $ptool['active'] = $plink['active']; - } - foreach ( array( 'href', 'class', 'text', 'dir' ) as $k ) { - if ( isset( $plink[$k] ) ) { - $ptool['links'][0][$k] = $plink[$k]; - } - } - $personal_tools[$key] = $ptool; - } - return $personal_tools; - } - - function getSidebar( $options = array() ) { - // Force the rendering of the following portals - $sidebar = $this->data['sidebar']; - if ( !isset( $sidebar['SEARCH'] ) ) { - $sidebar['SEARCH'] = true; - } - if ( !isset( $sidebar['TOOLBOX'] ) ) { - $sidebar['TOOLBOX'] = true; - } - if ( !isset( $sidebar['LANGUAGES'] ) ) { - $sidebar['LANGUAGES'] = true; - } - - if ( !isset( $options['search'] ) || $options['search'] !== true ) { - unset( $sidebar['SEARCH'] ); - } - if ( isset( $options['toolbox'] ) && $options['toolbox'] === false ) { - unset( $sidebar['TOOLBOX'] ); - } - if ( isset( $options['languages'] ) && $options['languages'] === false ) { - unset( $sidebar['LANGUAGES'] ); - } - - $boxes = array(); - foreach ( $sidebar as $boxName => $content ) { - if ( $content === false ) { - continue; - } - switch ( $boxName ) { - case 'SEARCH': - // Search is a special case, skins should custom implement this - $boxes[$boxName] = array( - 'id' => 'p-search', - 'header' => $this->getMsg( 'search' )->text(), - 'generated' => false, - 'content' => true, - ); - break; - case 'TOOLBOX': - $msgObj = $this->getMsg( 'toolbox' ); - $boxes[$boxName] = array( - 'id' => 'p-tb', - 'header' => $msgObj->exists() ? $msgObj->text() : 'toolbox', - 'generated' => false, - 'content' => $this->getToolbox(), - ); - break; - case 'LANGUAGES': - if ( $this->data['language_urls'] ) { - $msgObj = $this->getMsg( 'otherlanguages' ); - $boxes[$boxName] = array( - 'id' => 'p-lang', - 'header' => $msgObj->exists() ? $msgObj->text() : 'otherlanguages', - 'generated' => false, - 'content' => $this->data['language_urls'], - ); - } - break; - default: - $msgObj = $this->getMsg( $boxName ); - $boxes[$boxName] = array( - 'id' => "p-$boxName", - 'header' => $msgObj->exists() ? $msgObj->text() : $boxName, - 'generated' => true, - 'content' => $content, - ); - break; - } - } - - // HACK: Compatibility with extensions still using SkinTemplateToolboxEnd - $hookContents = null; - if ( isset( $boxes['TOOLBOX'] ) ) { - ob_start(); - // We pass an extra 'true' at the end so extensions using BaseTemplateToolbox - // can abort and avoid outputting double toolbox links - wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this, true ) ); - $hookContents = ob_get_contents(); - ob_end_clean(); - if ( !trim( $hookContents ) ) { - $hookContents = null; - } - } - // END hack - - if ( isset( $options['htmlOnly'] ) && $options['htmlOnly'] === true ) { - foreach ( $boxes as $boxName => $box ) { - if ( is_array( $box['content'] ) ) { - $content = '
      '; - foreach ( $box['content'] as $key => $val ) { - $content .= "\n " . $this->makeListItem( $key, $val ); - } - // HACK, shove the toolbox end onto the toolbox if we're rendering itself - if ( $hookContents ) { - $content .= "\n $hookContents"; - } - // END hack - $content .= "\n
    \n"; - $boxes[$boxName]['content'] = $content; - } - } - } else { - if ( $hookContents ) { - $boxes['TOOLBOXEND'] = array( - 'id' => 'p-toolboxend', - 'header' => $boxes['TOOLBOX']['header'], - 'generated' => false, - 'content' => "
      {$hookContents}
    ", - ); - // HACK: Make sure that TOOLBOXEND is sorted next to TOOLBOX - $boxes2 = array(); - foreach ( $boxes as $key => $box ) { - if ( $key === 'TOOLBOXEND' ) { - continue; - } - $boxes2[$key] = $box; - if ( $key === 'TOOLBOX' ) { - $boxes2['TOOLBOXEND'] = $boxes['TOOLBOXEND']; - } - } - $boxes = $boxes2; - // END hack - } - } - - return $boxes; - } - - /** - * @param string $name - */ - protected function renderAfterPortlet( $name ) { - $content = ''; - wfRunHooks( 'BaseTemplateAfterPortlet', array( $this, $name, &$content ) ); - - if ( $content !== '' ) { - echo "
    $content
    "; - } - - } - - /** - * Makes a link, usually used by makeListItem to generate a link for an item - * in a list used in navigation lists, portlets, portals, sidebars, etc... - * - * @param string $key Usually a key from the list you are generating this - * link from. - * @param array $item Contains some of a specific set of keys. - * - * The text of the link will be generated either from the contents of the - * "text" key in the $item array, if a "msg" key is present a message by - * that name will be used, and if neither of those are set the $key will be - * used as a message name. - * - * If a "href" key is not present makeLink will just output htmlescaped text. - * The "href", "id", "class", "rel", and "type" keys are used as attributes - * for the link if present. - * - * If an "id" or "single-id" (if you don't want the actual id to be output - * on the link) is present it will be used to generate a tooltip and - * accesskey for the link. - * - * The keys "context" and "primary" are ignored; these keys are used - * internally by skins and are not supposed to be included in the HTML - * output. - * - * If you don't want an accesskey, set $item['tooltiponly'] = true; - * - * @param array $options Can be used to affect the output of a link. - * Possible options are: - * - 'text-wrapper' key to specify a list of elements to wrap the text of - * a link in. This should be an array of arrays containing a 'tag' and - * optionally an 'attributes' key. If you only have one element you don't - * need to wrap it in another array. eg: To use
    ... - * in all links use array( 'text-wrapper' => array( 'tag' => 'span' ) ) - * for your options. - * - 'link-class' key can be used to specify additional classes to apply - * to all links. - * - 'link-fallback' can be used to specify a tag to use instead of "" - * if there is no link. eg: If you specify 'link-fallback' => 'span' than - * any non-link will output a "" instead of just text. - * - * @return string - */ - function makeLink( $key, $item, $options = array() ) { - if ( isset( $item['text'] ) ) { - $text = $item['text']; - } else { - $text = $this->translator->translate( isset( $item['msg'] ) ? $item['msg'] : $key ); - } - - $html = htmlspecialchars( $text ); - - if ( isset( $options['text-wrapper'] ) ) { - $wrapper = $options['text-wrapper']; - if ( isset( $wrapper['tag'] ) ) { - $wrapper = array( $wrapper ); - } - while ( count( $wrapper ) > 0 ) { - $element = array_pop( $wrapper ); - $html = Html::rawElement( $element['tag'], isset( $element['attributes'] ) - ? $element['attributes'] - : null, $html ); - } - } - - if ( isset( $item['href'] ) || isset( $options['link-fallback'] ) ) { - $attrs = $item; - foreach ( array( 'single-id', 'text', 'msg', 'tooltiponly', 'context', 'primary' ) as $k ) { - unset( $attrs[$k] ); - } - - if ( isset( $item['id'] ) && !isset( $item['single-id'] ) ) { - $item['single-id'] = $item['id']; - } - if ( isset( $item['single-id'] ) ) { - if ( isset( $item['tooltiponly'] ) && $item['tooltiponly'] ) { - $title = Linker::titleAttrib( $item['single-id'] ); - if ( $title !== false ) { - $attrs['title'] = $title; - } - } else { - $tip = Linker::tooltipAndAccesskeyAttribs( $item['single-id'] ); - if ( isset( $tip['title'] ) && $tip['title'] !== false ) { - $attrs['title'] = $tip['title']; - } - if ( isset( $tip['accesskey'] ) && $tip['accesskey'] !== false ) { - $attrs['accesskey'] = $tip['accesskey']; - } - } - } - if ( isset( $options['link-class'] ) ) { - if ( isset( $attrs['class'] ) ) { - $attrs['class'] .= " {$options['link-class']}"; - } else { - $attrs['class'] = $options['link-class']; - } - } - $html = Html::rawElement( isset( $attrs['href'] ) - ? 'a' - : $options['link-fallback'], $attrs, $html ); - } - - return $html; - } - - /** - * Generates a list item for a navigation, portlet, portal, sidebar... list - * - * @param string $key Usually a key from the list you are generating this link from. - * @param array $item Array of list item data containing some of a specific set of keys. - * The "id", "class" and "itemtitle" keys will be used as attributes for the list item, - * if "active" contains a value of true a "active" class will also be appended to class. - * - * @param array $options - * - * If you want something other than a "
  • " you can pass a tag name such as - * "tag" => "span" in the $options array to change the tag used. - * link/content data for the list item may come in one of two forms - * A "links" key may be used, in which case it should contain an array with - * a list of links to include inside the list item, see makeLink for the - * format of individual links array items. - * - * Otherwise the relevant keys from the list item $item array will be passed - * to makeLink instead. Note however that "id" and "class" are used by the - * list item directly so they will not be passed to makeLink - * (however the link will still support a tooltip and accesskey from it) - * If you need an id or class on a single link you should include a "links" - * array with just one link item inside of it. If you want to add a title - * to the list item itself, you can set "itemtitle" to the value. - * $options is also passed on to makeLink calls - * - * @return string - */ - function makeListItem( $key, $item, $options = array() ) { - if ( isset( $item['links'] ) ) { - $links = array(); - foreach ( $item['links'] as $linkKey => $link ) { - $links[] = $this->makeLink( $linkKey, $link, $options ); - } - $html = implode( ' ', $links ); - } else { - $link = $item; - // These keys are used by makeListItem and shouldn't be passed on to the link - foreach ( array( 'id', 'class', 'active', 'tag', 'itemtitle' ) as $k ) { - unset( $link[$k] ); - } - if ( isset( $item['id'] ) && !isset( $item['single-id'] ) ) { - // The id goes on the
  • not on the for single links - // but makeSidebarLink still needs to know what id to use when - // generating tooltips and accesskeys. - $link['single-id'] = $item['id']; - } - $html = $this->makeLink( $key, $link, $options ); - } - - $attrs = array(); - foreach ( array( 'id', 'class' ) as $attr ) { - if ( isset( $item[$attr] ) ) { - $attrs[$attr] = $item[$attr]; - } - } - if ( isset( $item['active'] ) && $item['active'] ) { - if ( !isset( $attrs['class'] ) ) { - $attrs['class'] = ''; - } - $attrs['class'] .= ' active'; - $attrs['class'] = trim( $attrs['class'] ); - } - if ( isset( $item['itemtitle'] ) ) { - $attrs['title'] = $item['itemtitle']; - } - return Html::rawElement( isset( $options['tag'] ) ? $options['tag'] : 'li', $attrs, $html ); - } - - function makeSearchInput( $attrs = array() ) { - $realAttrs = array( - 'type' => 'search', - 'name' => 'search', - 'placeholder' => wfMessage( 'searchsuggest-search' )->text(), - 'value' => $this->get( 'search', '' ), - ); - $realAttrs = array_merge( $realAttrs, Linker::tooltipAndAccesskeyAttribs( 'search' ), $attrs ); - return Html::element( 'input', $realAttrs ); - } - - function makeSearchButton( $mode, $attrs = array() ) { - switch ( $mode ) { - case 'go': - case 'fulltext': - $realAttrs = array( - 'type' => 'submit', - 'name' => $mode, - 'value' => $this->translator->translate( - $mode == 'go' ? 'searcharticle' : 'searchbutton' ), - ); - $realAttrs = array_merge( - $realAttrs, - Linker::tooltipAndAccesskeyAttribs( "search-$mode" ), - $attrs - ); - return Html::element( 'input', $realAttrs ); - case 'image': - $buttonAttrs = array( - 'type' => 'submit', - 'name' => 'button', - ); - $buttonAttrs = array_merge( - $buttonAttrs, - Linker::tooltipAndAccesskeyAttribs( 'search-fulltext' ), - $attrs - ); - unset( $buttonAttrs['src'] ); - unset( $buttonAttrs['alt'] ); - unset( $buttonAttrs['width'] ); - unset( $buttonAttrs['height'] ); - $imgAttrs = array( - 'src' => $attrs['src'], - 'alt' => isset( $attrs['alt'] ) - ? $attrs['alt'] - : $this->translator->translate( 'searchbutton' ), - 'width' => isset( $attrs['width'] ) ? $attrs['width'] : null, - 'height' => isset( $attrs['height'] ) ? $attrs['height'] : null, - ); - return Html::rawElement( 'button', $buttonAttrs, Html::element( 'img', $imgAttrs ) ); - default: - throw new MWException( 'Unknown mode passed to BaseTemplate::makeSearchButton' ); - } - } - - /** - * Returns an array of footerlinks trimmed down to only those footer links that - * are valid. - * If you pass "flat" as an option then the returned array will be a flat array - * of footer icons instead of a key/value array of footerlinks arrays broken - * up into categories. - * @param string $option - * @return array|mixed - */ - function getFooterLinks( $option = null ) { - $footerlinks = $this->get( 'footerlinks' ); - - // Reduce footer links down to only those which are being used - $validFooterLinks = array(); - foreach ( $footerlinks as $category => $links ) { - $validFooterLinks[$category] = array(); - foreach ( $links as $link ) { - if ( isset( $this->data[$link] ) && $this->data[$link] ) { - $validFooterLinks[$category][] = $link; - } - } - if ( count( $validFooterLinks[$category] ) <= 0 ) { - unset( $validFooterLinks[$category] ); - } - } - - if ( $option == 'flat' ) { - // fold footerlinks into a single array using a bit of trickery - $validFooterLinks = call_user_func_array( - 'array_merge', - array_values( $validFooterLinks ) - ); - } - - return $validFooterLinks; - } - - /** - * Returns an array of footer icons filtered down by options relevant to how - * the skin wishes to display them. - * If you pass "icononly" as the option all footer icons which do not have an - * image icon set will be filtered out. - * If you pass "nocopyright" then MediaWiki's copyright icon will not be included - * in the list of footer icons. This is mostly useful for skins which only - * display the text from footericons instead of the images and don't want a - * duplicate copyright statement because footerlinks already rendered one. - * @param string $option - * @return string - */ - function getFooterIcons( $option = null ) { - // Generate additional footer icons - $footericons = $this->get( 'footericons' ); - - if ( $option == 'icononly' ) { - // Unset any icons which don't have an image - foreach ( $footericons as &$footerIconsBlock ) { - foreach ( $footerIconsBlock as $footerIconKey => $footerIcon ) { - if ( !is_string( $footerIcon ) && !isset( $footerIcon['src'] ) ) { - unset( $footerIconsBlock[$footerIconKey] ); - } - } - } - // Redo removal of any empty blocks - foreach ( $footericons as $footerIconsKey => &$footerIconsBlock ) { - if ( count( $footerIconsBlock ) <= 0 ) { - unset( $footericons[$footerIconsKey] ); - } - } - } elseif ( $option == 'nocopyright' ) { - unset( $footericons['copyright']['copyright'] ); - if ( count( $footericons['copyright'] ) <= 0 ) { - unset( $footericons['copyright'] ); - } - } - - return $footericons; - } - - /** - * Output the basic end-page trail including bottomscripts, reporttime, and - * debug stuff. This should be called right before outputting the closing - * body and html tags. - */ - function printTrail() { ?> -getSkin()->getContext() ); ?> -html( 'bottomscripts' ); /* JS call to runBodyOnloadHook */ ?> -html( 'reporttime' ) ?> -global = $global; $this->class = $class; $this->params = $params; @@ -71,7 +71,7 @@ class StubObject { * @param object $obj Object to check. * @return bool True if $obj is not an instance of StubObject class. */ - static function isRealObject( $obj ) { + public static function isRealObject( $obj ) { return is_object( $obj ) && !$obj instanceof StubObject; } @@ -83,7 +83,7 @@ class StubObject { * @param object $obj Object to check. * @return void */ - static function unstub( &$obj ) { + public static function unstub( &$obj ) { if ( $obj instanceof StubObject ) { $obj = $obj->_unstub( 'unstub', 3 ); } @@ -100,7 +100,7 @@ class StubObject { * @param array $args Arguments * @return mixed */ - function _call( $name, $args ) { + public function _call( $name, $args ) { $this->_unstub( $name, 5 ); return call_user_func_array( array( $GLOBALS[$this->global], $name ), $args ); } @@ -109,7 +109,7 @@ class StubObject { * Create a new object to replace this stub object. * @return object */ - function _newObject() { + public function _newObject() { return MWFunction::newObj( $this->class, $this->params ); } @@ -121,7 +121,7 @@ class StubObject { * @param array $args Arguments * @return mixed */ - function __call( $name, $args ) { + public function __call( $name, $args ) { return $this->_call( $name, $args ); } @@ -137,7 +137,7 @@ class StubObject { * @return object The unstubbed version of itself * @throws MWException */ - function _unstub( $name = '_unstub', $level = 2 ) { + public function _unstub( $name = '_unstub', $level = 2 ) { static $recursionLevel = 0; if ( !$GLOBALS[$this->global] instanceof StubObject ) { @@ -170,18 +170,18 @@ class StubObject { */ class StubUserLang extends StubObject { - function __construct() { + public function __construct() { parent::__construct( 'wgLang' ); } - function __call( $name, $args ) { + public function __call( $name, $args ) { return $this->_call( $name, $args ); } /** * @return Language */ - function _newObject() { + public function _newObject() { return RequestContext::getMain()->getLanguage(); } } diff --git a/includes/Title.php b/includes/Title.php index 24811788f2..a1b2352f5e 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -74,6 +74,9 @@ class Title { /** @var string Interwiki prefix */ public $mInterwiki = ''; + /** @var bool Was this Title created from a string with a local interwiki prefix? */ + private $mLocalInterwiki = false; + /** @var string Title fragment (i.e. the bit after the #) */ public $mFragment = ''; @@ -823,6 +826,15 @@ class Title { return $this->mInterwiki; } + /** + * Was this a local interwiki link? + * + * @return bool + */ + public function wasLocalInterwiki() { + return $this->mLocalInterwiki; + } + /** * Determine whether the object refers to a page within * this project and is transcludable. @@ -2246,6 +2258,12 @@ class Title { $errors[] = array( 'immobile-target-page' ); } } elseif ( $action == 'delete' ) { + if ( count( $this->getUserPermissionsErrorsInternal( 'edit', + $user, $doExpensiveQueries, true ) ) + ) { + // If they can't edit, they shouldn't delete. + $errors[] = array( 'delete-cantedit' ); + } if ( $doExpensiveQueries && $wgDeleteRevisionsLimit && !$this->userCan( 'bigdelete', $user ) && $this->isBigDeletion() ) { @@ -3291,6 +3309,7 @@ class Title { # Fill fields $this->setFragment( '#' . $parts['fragment'] ); $this->mInterwiki = $parts['interwiki']; + $this->mLocalInterwiki = $parts['local_interwiki']; $this->mNamespace = $parts['namespace']; $this->mUserCaseDBKey = $parts['user_case_dbkey']; diff --git a/includes/User.php b/includes/User.php index 7edd93ec78..fe4118782b 100644 --- a/includes/User.php +++ b/includes/User.php @@ -2294,6 +2294,8 @@ class User implements IDBAccessObject { public function setPassword( $str ) { global $wgAuth; + $this->loadPasswords(); + if ( $str !== null ) { if ( !$wgAuth->allowPasswordChange() ) { throw new PasswordError( wfMessage( 'password-change-forbidden' )->text() ); @@ -2380,7 +2382,7 @@ class User implements IDBAccessObject { * @param bool $throttle If true, reset the throttle timestamp to the present */ public function setNewpassword( $str, $throttle = true ) { - $this->load(); + $this->loadPasswords(); if ( $str === null ) { $this->mNewpassword = ''; diff --git a/includes/UserRightsProxy.php b/includes/UserRightsProxy.php index e3655ceddb..53c69d817a 100644 --- a/includes/UserRightsProxy.php +++ b/includes/UserRightsProxy.php @@ -113,12 +113,23 @@ class UserRightsProxy { * @return null|UserRightsProxy */ private static function newFromLookup( $database, $field, $value, $ignoreInvalidDB = false ) { + global $wgSharedDB, $wgSharedTables; + // If the user table is shared, perform the user query on it, but don't pass it to the UserRightsProxy, + // as user rights are normally not shared. + if ( $wgSharedDB && in_array( 'user', $wgSharedTables ) ) { + $userdb = self::getDB( $wgSharedDB, $ignoreInvalidDB ); + } else { + $userdb = self::getDB( $database, $ignoreInvalidDB ); + } + $db = self::getDB( $database, $ignoreInvalidDB ); - if ( $db ) { - $row = $db->selectRow( 'user', + + if ( $db && $userdb ) { + $row = $userdb->selectRow( 'user', array( 'user_id', 'user_name' ), array( $field => $value ), __METHOD__ ); + if ( $row !== false ) { return new UserRightsProxy( $db, $database, $row->user_name, diff --git a/includes/actions/Action.php b/includes/actions/Action.php index 839d0edb94..7dd46161ac 100644 --- a/includes/actions/Action.php +++ b/includes/actions/Action.php @@ -282,7 +282,6 @@ abstract class Action { * * @param User $user The user to check, or null to use the context user * @throws UserBlockedError|ReadOnlyError|PermissionsError - * @return bool True on success */ protected function checkCanExecute( User $user ) { $right = $this->getRestriction(); @@ -304,7 +303,6 @@ abstract class Action { if ( $this->requiresWrite() && wfReadOnly() ) { throw new ReadOnlyError(); } - return true; } /** diff --git a/includes/actions/EditAction.php b/includes/actions/EditAction.php index 31f58b8072..5a1e2c1fd9 100644 --- a/includes/actions/EditAction.php +++ b/includes/actions/EditAction.php @@ -1,6 +1,6 @@ page->unprotect(); - } -} diff --git a/includes/actions/SubmitAction.php b/includes/actions/SubmitAction.php new file mode 100644 index 0000000000..fae49f61e3 --- /dev/null +++ b/includes/actions/SubmitAction.php @@ -0,0 +1,42 @@ +page->unprotect(); + } +} diff --git a/includes/actions/UnwatchAction.php b/includes/actions/UnwatchAction.php new file mode 100644 index 0000000000..e2e5a1d843 --- /dev/null +++ b/includes/actions/UnwatchAction.php @@ -0,0 +1,57 @@ +msg( 'removewatch' )->escaped(); + } + + public function onSubmit( $data ) { + wfProfileIn( __METHOD__ ); + self::doUnwatch( $this->getTitle(), $this->getUser() ); + wfProfileOut( __METHOD__ ); + + return true; + } + + protected function alterForm( HTMLForm $form ) { + $form->setSubmitTextMsg( 'confirm-unwatch-button' ); + } + + protected function preText() { + return $this->msg( 'confirm-unwatch-top' )->parse(); + } + + public function onSuccess() { + $this->getOutput()->addWikiMsg( 'removedwatchtext', $this->getTitle()->getPrefixedText() ); + } +} diff --git a/includes/actions/WatchAction.php b/includes/actions/WatchAction.php index 2c7502e574..8d94bb3757 100644 --- a/includes/actions/WatchAction.php +++ b/includes/actions/WatchAction.php @@ -1,6 +1,6 @@ isAnon() ) { - $loginreqlink = Linker::linkKnown( - SpecialPage::getTitleFor( 'Userlogin' ), - $this->msg( 'loginreqlink' )->escaped(), - array(), - array( 'returnto' => $this->getPageTitle(), 'returntoquery' => 'action=' . $this->getName() ) - ); - $reasonMsg = $this->msg( 'watchlistanontext' )->rawParams( $loginreqlink ); - throw new UserNotLoggedIn( $reasonMsg, 'watchnologin' ); + throw new UserNotLoggedIn( 'watchlistanontext', 'watchnologin' ); } - return parent::checkCanExecute( $user ); + parent::checkCanExecute( $user ); } /** @@ -217,39 +210,3 @@ class WatchAction extends FormAction { $this->getOutput()->addWikiMsg( 'addedwatchtext', $this->getTitle()->getPrefixedText() ); } } - -/** - * Page removal from a user's watchlist - * - * @ingroup Actions - */ -class UnwatchAction extends WatchAction { - - public function getName() { - return 'unwatch'; - } - - protected function getDescription() { - return $this->msg( 'removewatch' )->escaped(); - } - - public function onSubmit( $data ) { - wfProfileIn( __METHOD__ ); - self::doUnwatch( $this->getTitle(), $this->getUser() ); - wfProfileOut( __METHOD__ ); - - return true; - } - - protected function alterForm( HTMLForm $form ) { - $form->setSubmitTextMsg( 'confirm-unwatch-button' ); - } - - protected function preText() { - return $this->msg( 'confirm-unwatch-top' )->parse(); - } - - public function onSuccess() { - $this->getOutput()->addWikiMsg( 'removedwatchtext', $this->getTitle()->getPrefixedText() ); - } -} diff --git a/includes/api/ApiBase.php b/includes/api/ApiBase.php index 7ebd0c38d1..a280ddf036 100644 --- a/includes/api/ApiBase.php +++ b/includes/api/ApiBase.php @@ -593,51 +593,36 @@ abstract class ApiBase extends ContextSource { } /** - * Returns possible properties in the result, grouped by the value of the prop parameter - * that shows them. + * Formerly used to fetch a list of possible properites in the result, + * somehow organized with respect to the prop parameter that causes them to + * be returned. The specific semantics of the return value was never + * specified. Since this was never possible to be accurately updated, it + * has been removed. * - * Properties that are shown always are in a group with empty string as a key. - * Properties that can be shown by several values of prop are included multiple times. - * If some properties are part of a list and some are on the root object (see ApiQueryQueryPage), - * those on the root object are under the key PROP_ROOT. - * The array can also contain a boolean under the key PROP_LIST, - * indicating whether the result is a list. - * - * Don't call this function directly: use getFinalResultProperties() to - * allow hooks to modify descriptions as needed. - * - * @return array|bool False on no properties + * @deprecated since 1.24 + * @return array|bool */ protected function getResultProperties() { + wfDeprecated( __METHOD__, '1.24' ); return false; } /** - * Get final possible result properties, after hooks have had a chance to tweak it as - * needed. - * - * @return array + * @see self::getResultProperties() + * @deprecated since 1.24 + * @return array|bool */ public function getFinalResultProperties() { - $properties = $this->getResultProperties(); - wfRunHooks( 'APIGetResultProperties', array( $this, &$properties ) ); - - return $properties; + wfDeprecated( __METHOD__, '1.24' ); + return array(); } /** - * Add token properties to the array used by getResultProperties, - * based on a token functions mapping. - * @param array $props - * @param array $tokenFunctions + * @see self::getResultProperties() + * @deprecated since 1.24 */ protected static function addTokenProperties( &$props, $tokenFunctions ) { - foreach ( array_keys( $tokenFunctions ) as $token ) { - $props[''][$token . 'token'] = array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ); - } + wfDeprecated( __METHOD__, '1.24' ); } /** @@ -706,8 +691,6 @@ abstract class ApiBase extends ContextSource { /** * Die if none or more than one of a certain set of parameters is set and not false. * - * Call getRequireOnlyOneParameterErrorMessages() to get a list of possible errors. - * * @param array $params User provided set of parameters, as from $this->extractRequestParams() * @param string $required,... Names of parameters of which exactly one must be set */ @@ -732,32 +715,18 @@ abstract class ApiBase extends ContextSource { } /** - * Generates the possible errors requireOnlyOneParameter() can die with - * - * @param array $params + * @see self::getPossibleErrors() + * @deprecated since 1.24 * @return array */ public function getRequireOnlyOneParameterErrorMessages( $params ) { - $p = $this->getModulePrefix(); - $params = implode( ", {$p}", $params ); - - return array( - array( - 'code' => "{$p}missingparam", - 'info' => "One of the parameters {$p}{$params} is required" - ), - array( - 'code' => "{$p}invalidparammix", - 'info' => "The parameters {$p}{$params} can not be used together" - ) - ); + wfDeprecated( __METHOD__, '1.24' ); + return array(); } /** * Die if more than one of a certain set of parameters is set and not false. * - * Call getRequireMaxOneParameterErrorMessages() to get a list of possible errors. - * * @param array $params User provided set of parameters, as from $this->extractRequestParams() * @param string $required,... Names of parameters of which at most one must be set */ @@ -778,28 +747,18 @@ abstract class ApiBase extends ContextSource { } /** - * Generates the possible error requireMaxOneParameter() can die with - * - * @param array $params + * @see self::getPossibleErrors() + * @deprecated since 1.24 * @return array */ public function getRequireMaxOneParameterErrorMessages( $params ) { - $p = $this->getModulePrefix(); - $params = implode( ", {$p}", $params ); - - return array( - array( - 'code' => "{$p}invalidparammix", - 'info' => "The parameters {$p}{$params} can not be used together" - ) - ); + wfDeprecated( __METHOD__, '1.24' ); + return array(); } /** * Die if none of a certain set of parameters is set and not false. * - * Call getRequireAtLeastOneParameterErrorMessages() to get a list of possible errors. - * * @since 1.23 * @param array $params User provided set of parameters, as from $this->extractRequestParams() * @param string $required,... Names of parameters of which at least one must be set @@ -821,30 +780,19 @@ abstract class ApiBase extends ContextSource { } /** - * Generates the possible errors requireAtLeastOneParameter() can die with - * - * @since 1.23 - * @param array $params Array of parameter key names + * @see self::getPossibleErrors() + * @deprecated since 1.24 * @return array */ public function getRequireAtLeastOneParameterErrorMessages( $params ) { - $p = $this->getModulePrefix(); - $params = implode( ", {$p}", $params ); - - return array( - array( - 'code' => "{$p}missingparam", - 'info' => "At least one of the parameters {$p}{$params} is required", - ), - ); + wfDeprecated( __METHOD__, '1.24' ); + return array(); } /** * Get a WikiPage object from a title or pageid param, if possible. * Can die, if no param is set or if the title or page id is not valid. * - * Call getTitleOrPageIdErrorMessage() to get a list of possible errors. - * * @param array $params * @param bool|string $load Whether load the object's state from the database: * - false: don't load (if the pageid is given, it will still be loaded) @@ -882,19 +830,13 @@ abstract class ApiBase extends ContextSource { } /** - * Generates the possible error getTitleOrPageId() can die with - * + * @see self::getPossibleErrors() + * @deprecated since 1.24 * @return array */ public function getTitleOrPageIdErrorMessage() { - return array_merge( - $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ), - array( - array( 'invalidtitle', 'title' ), - array( 'nosuchpageid', 'pageid' ), - array( 'code' => 'pagecannotexist', 'info' => "Namespace doesn't allow actual pages" ), - ) - ); + wfDeprecated( __METHOD__, '1.24' ); + return array(); } /** @@ -1469,6 +1411,10 @@ abstract class ApiBase extends ContextSource { 'code' => 'cantedit', 'info' => "You can't protect this page because you can't edit it" ), + 'delete-cantedit' => array( + 'code' => 'cantedit', + 'info' => "You can't delete this page because you can't edit it" + ), 'badaccess-group0' => array( 'code' => 'permissiondenied', 'info' => "Permission denied" @@ -2105,93 +2051,38 @@ abstract class ApiBase extends ContextSource { } /** - * Returns a list of all possible errors returned by the module - * - * Don't call this function directly: use getFinalPossibleErrors() to allow - * hooks to modify parameters as needed. + * This formerly attempted to return a list of all possible errors returned + * by the module. However, this was impossible to maintain in many cases + * since errors could come from other areas of MediaWiki and in some cases + * from arbitrary extension hooks. Since a partial list claiming to be + * comprehensive is unlikely to be useful, it was removed. * - * @return array Array in the format of array( key, param1, param2, ... ) - * or array( 'code' => ..., 'info' => ... ) + * @deprecated since 1.24 + * @return array */ public function getPossibleErrors() { - $ret = array(); - - $params = $this->getFinalParams(); - if ( $params ) { - foreach ( $params as $paramName => $paramSettings ) { - if ( isset( $paramSettings[ApiBase::PARAM_REQUIRED] ) - && $paramSettings[ApiBase::PARAM_REQUIRED] - ) { - $ret[] = array( 'missingparam', $paramName ); - } - } - if ( array_key_exists( 'continue', $params ) ) { - $ret[] = array( - 'code' => 'badcontinue', - 'info' => 'Invalid continue param. You should pass the ' . - 'original value returned by the previous query' - ); - } - } - - if ( $this->mustBePosted() ) { - $ret[] = array( 'mustbeposted', $this->getModuleName() ); - } - - if ( $this->isReadMode() ) { - $ret[] = array( 'readrequired' ); - } - - if ( $this->isWriteMode() ) { - $ret[] = array( 'writerequired' ); - $ret[] = array( 'writedisabled' ); - } - - if ( $this->needsToken() ) { - if ( !isset( $params['token'][ApiBase::PARAM_REQUIRED] ) - || !$params['token'][ApiBase::PARAM_REQUIRED] - ) { - // Add token as possible missing parameter, if not already done - $ret[] = array( 'missingparam', 'token' ); - } - $ret[] = array( 'sessionfailure' ); - } - - return $ret; + wfDeprecated( __METHOD__, '1.24' ); + return array(); } /** - * Get final list of possible errors, after hooks have had a chance to - * tweak it as needed. - * - * @return array - * @since 1.22 + * @see self::getPossibleErrors() + * @deprecated since 1.24 + * @retun array */ public function getFinalPossibleErrors() { - $possibleErrors = $this->getPossibleErrors(); - wfRunHooks( 'APIGetPossibleErrors', array( $this, &$possibleErrors ) ); - - return $possibleErrors; + wfDeprecated( __METHOD__, '1.24' ); + return array(); } /** - * Parses a list of errors into a standardised format - * @param array $errors List of errors. Items can be in the for - * array( key, param1, param2, ... ) or array( 'code' => ..., 'info' => ... ) - * @return array Parsed list of errors with items in the form array( 'code' => ..., 'info' => ... ) + * @see self::getPossibleErrors() + * @deprecated since 1.24 + * @return array */ public function parseErrors( $errors ) { - $ret = array(); - - foreach ( $errors as $row ) { - if ( isset( $row['code'] ) && isset( $row['info'] ) ) { - $ret[] = $row; - } else { - $ret[] = $this->parseMsg( $row ); - } - } - - return $ret; + wfDeprecated( __METHOD__, '1.24' ); + return array(); } /** diff --git a/includes/api/ApiBlock.php b/includes/api/ApiBlock.php index 364300e14e..4fa50a43d6 100644 --- a/includes/api/ApiBlock.php +++ b/includes/api/ApiBlock.php @@ -187,54 +187,10 @@ class ApiBlock extends ApiBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'user' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'userID' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'expiry' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'id' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'reason' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'anononly' => 'boolean', - 'nocreate' => 'boolean', - 'autoblock' => 'boolean', - 'noemail' => 'boolean', - 'hidename' => 'boolean', - 'allowusertalk' => 'boolean', - 'watchuser' => 'boolean' - ) - ); - } - public function getDescription() { return 'Block a user.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'cantblock' ), - array( 'canthide' ), - array( 'cantblock-email' ), - array( 'ipbblocked' ), - array( 'ipbnounblockself' ), - ) ); - } - public function needsToken() { return true; } diff --git a/includes/api/ApiComparePages.php b/includes/api/ApiComparePages.php index 6b12a7de83..4855926856 100644 --- a/includes/api/ApiComparePages.php +++ b/includes/api/ApiComparePages.php @@ -137,24 +137,6 @@ class ApiComparePages extends ApiBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'fromtitle' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'fromrevid' => 'integer', - 'totitle' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'torevid' => 'integer', - '*' => 'string' - ) - ); - } - public function getDescription() { return array( 'Get the difference between 2 pages.', @@ -162,19 +144,6 @@ class ApiComparePages extends ApiBase { ); } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'code' => 'inputneeded', 'info' => 'A title or a revision is needed' ), - array( 'invalidtitle', 'title' ), - array( 'nosuchpageid', 'pageid' ), - array( - 'code' => 'baddiff', - 'info' => 'The diff cannot be retrieved. Maybe one or both ' . - 'revisions do not exist or you do not have permission to view them.' - ), - ) ); - } - public function getExamples() { return array( 'api.php?action=compare&fromrev=1&torev=2' => 'Create a diff between revision 1 and 2', diff --git a/includes/api/ApiCreateAccount.php b/includes/api/ApiCreateAccount.php index 35bba174c3..2ce532b920 100644 --- a/includes/api/ApiCreateAccount.php +++ b/includes/api/ApiCreateAccount.php @@ -221,84 +221,6 @@ class ApiCreateAccount extends ApiBase { ); } - public function getResultProperties() { - return array( - 'createaccount' => array( - 'result' => array( - ApiBase::PROP_TYPE => array( - 'Success', - 'Warning', - 'NeedToken' - ) - ), - 'username' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'userid' => array( - ApiBase::PROP_TYPE => 'int', - ApiBase::PROP_NULLABLE => true - ), - 'token' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - ) - ); - } - - public function getPossibleErrors() { - // Note the following errors aren't possible and don't need to be listed: - // sessionfailure, nocookiesfornew, badretype - $localErrors = array( - 'wrongpassword', // Actually caused by wrong domain field. Riddle me that... - 'sorbs_create_account_reason', - 'noname', - 'userexists', - 'password-name-match', // from User::getPasswordValidity - 'password-login-forbidden', // from User::getPasswordValidity - 'noemailtitle', - 'invalidemailaddress', - 'externaldberror', - 'acct_creation_throttle_hit', - ); - - $errors = parent::getPossibleErrors(); - // All local errors are from LoginForm, which means they're actually message keys. - foreach ( $localErrors as $error ) { - $errors[] = array( - 'code' => $error, - 'info' => wfMessage( $error )->inLanguage( 'en' )->useDatabase( false )->parse() - ); - } - - $errors[] = array( - 'code' => 'permdenied-createaccount', - 'info' => 'You do not have the right to create a new account' - ); - $errors[] = array( - 'code' => 'blocked', - 'info' => 'You cannot create a new account because you are blocked' - ); - $errors[] = array( - 'code' => 'aborted', - 'info' => 'Account creation aborted by hook (info may vary)' - ); - $errors[] = array( - 'code' => 'langinvalid', - 'info' => 'Invalid language parameter' - ); - - // 'passwordtooshort' has parameters. :( - $errors[] = array( - 'code' => 'passwordtooshort', - 'info' => wfMessage( 'passwordtooshort', $this->getConfig()->get( 'MinimalPasswordLength' ) ) - ->inLanguage( 'en' )->useDatabase( false )->parse() - ); - - return $errors; - } - public function getExamples() { return array( 'api.php?action=createaccount&name=testuser&password=test123', diff --git a/includes/api/ApiDelete.php b/includes/api/ApiDelete.php index 35555bc7e5..f26d58bd4a 100644 --- a/includes/api/ApiDelete.php +++ b/includes/api/ApiDelete.php @@ -229,34 +229,10 @@ class ApiDelete extends ApiBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'title' => 'string', - 'reason' => 'string', - 'logid' => 'integer' - ) - ); - } - public function getDescription() { return 'Delete a page.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), - $this->getTitleOrPageIdErrorMessage(), - array( - array( 'notanarticle' ), - array( 'hookaborted', 'error' ), - array( 'delete-toobig', 'limit' ), - array( 'cannotdelete', 'title' ), - array( 'invalidoldimage' ), - array( 'nodeleteablefile' ), - ) - ); - } - public function needsToken() { return true; } diff --git a/includes/api/ApiEditPage.php b/includes/api/ApiEditPage.php index 8a0c28081e..fff061f928 100644 --- a/includes/api/ApiEditPage.php +++ b/includes/api/ApiEditPage.php @@ -498,65 +498,6 @@ class ApiEditPage extends ApiBase { return 'Create and edit pages.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), - $this->getTitleOrPageIdErrorMessage(), - array( - array( 'missingtext' ), - array( 'createonly-exists' ), - array( 'nocreate-missing' ), - array( 'nosuchrevid', 'undo' ), - array( 'nosuchrevid', 'undoafter' ), - array( 'revwrongpage', 'id', 'text' ), - array( 'undo-failure' ), - array( 'hashcheckfailed' ), - array( 'hookaborted' ), - array( 'code' => 'parseerror', 'info' => 'Failed to parse the given text.' ), - array( 'noimageredirect-anon' ), - array( 'noimageredirect-logged' ), - array( 'spamdetected', 'spam' ), - array( 'summaryrequired' ), - array( 'blockedtext' ), - array( 'contenttoobig', $this->getConfig()->get( 'MaxArticleSize' ) ), - array( 'noedit-anon' ), - array( 'noedit' ), - array( 'actionthrottledtext' ), - array( 'wasdeleted' ), - array( 'nocreate-loggedin' ), - array( 'blankpage' ), - array( 'editconflict' ), - array( 'emptynewsection' ), - array( 'unknownerror', 'retval' ), - array( 'code' => 'nosuchsection', 'info' => 'There is no such section.' ), - array( - 'code' => 'invalidsection', - 'info' => 'The section parameter must be a valid section id or \'new\'' - ), - array( - 'code' => 'sectionsnotsupported', - 'info' => 'Sections are not supported for this type of page.' - ), - array( - 'code' => 'editnotsupported', - 'info' => 'Editing of this type of page is not supported using the text based edit API.' - ), - array( - 'code' => 'appendnotsupported', - 'info' => 'This type of page can not be edited by appending or prepending text.' ), - array( - 'code' => 'redirect-appendonly', - 'info' => 'You have attempted to edit using the "redirect"-following mode, which must be used in conjuction with section=new, prependtext, or appendtext.', - ), - array( - 'code' => 'badformat', - 'info' => 'The requested serialization format can not be applied to the page\'s content model' - ), - array( 'customcssprotected' ), - array( 'customjsprotected' ), - ) - ); - } - public function getAllowedParams() { return array( 'title' => array( @@ -672,41 +613,6 @@ class ApiEditPage extends ApiBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'new' => 'boolean', - 'result' => array( - ApiBase::PROP_TYPE => array( - 'Success', - 'Failure' - ), - ), - 'pageid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'title' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'nochange' => 'boolean', - 'oldrevid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'newrevid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'newtimestamp' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ) - ); - } - public function needsToken() { return true; } diff --git a/includes/api/ApiEmailUser.php b/includes/api/ApiEmailUser.php index 29f7e056e9..1a4d67d9ff 100644 --- a/includes/api/ApiEmailUser.php +++ b/includes/api/ApiEmailUser.php @@ -112,33 +112,10 @@ class ApiEmailUser extends ApiBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'result' => array( - ApiBase::PROP_TYPE => array( - 'Success', - 'Failure' - ), - ), - 'message' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ) - ); - } - public function getDescription() { return 'Email a user.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'usermaildisabled' ), - ) ); - } - public function needsToken() { return true; } diff --git a/includes/api/ApiExpandTemplates.php b/includes/api/ApiExpandTemplates.php index b3a9d83121..c2cec6d8f7 100644 --- a/includes/api/ApiExpandTemplates.php +++ b/includes/api/ApiExpandTemplates.php @@ -176,45 +176,10 @@ class ApiExpandTemplates extends ApiBase { ); } - public function getResultProperties() { - return array( - 'wikitext' => array( - 'wikitext' => 'string', - ), - 'categories' => array( - 'categories' => array( - ApiBase::PROP_TYPE => 'array', - ApiBase::PROP_NULLABLE => true, - ), - ), - 'volatile' => array( - 'volatile' => array( - ApiBase::PROP_TYPE => 'boolean', - ApiBase::PROP_NULLABLE => true, - ), - ), - 'ttl' => array( - 'ttl' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true, - ), - ), - 'parsetree' => array( - 'parsetree' => 'string', - ), - ); - } - public function getDescription() { return 'Expands all templates in wikitext.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'invalidtitle', 'title' ), - ) ); - } - public function getExamples() { return array( 'api.php?action=expandtemplates&text={{Project:Sandbox}}' diff --git a/includes/api/ApiFeedContributions.php b/includes/api/ApiFeedContributions.php index 3392a5c2ed..374203ebb2 100644 --- a/includes/api/ApiFeedContributions.php +++ b/includes/api/ApiFeedContributions.php @@ -210,14 +210,6 @@ class ApiFeedContributions extends ApiBase { return 'Returns a user contributions feed.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'code' => 'feed-unavailable', 'info' => 'Syndication feeds are not available' ), - array( 'code' => 'feed-invalid', 'info' => 'Invalid subscription feed type' ), - array( 'code' => 'sizediffdisabled', 'info' => 'Size difference is disabled in Miser Mode' ), - ) ); - } - public function getExamples() { return array( 'api.php?action=feedcontributions&user=Reedy', diff --git a/includes/api/ApiFeedRecentChanges.php b/includes/api/ApiFeedRecentChanges.php index bb68d5aed7..7239a2967f 100644 --- a/includes/api/ApiFeedRecentChanges.php +++ b/includes/api/ApiFeedRecentChanges.php @@ -198,13 +198,6 @@ class ApiFeedRecentChanges extends ApiBase { return 'Returns a recent changes feed'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'code' => 'feed-unavailable', 'info' => 'Syndication feeds are not available' ), - array( 'code' => 'feed-invalid', 'info' => 'Invalid subscription feed type' ), - ) ); - } - public function getExamples() { return array( 'api.php?action=feedrecentchanges', diff --git a/includes/api/ApiFeedWatchlist.php b/includes/api/ApiFeedWatchlist.php index 983b6a81f2..6aef8fc294 100644 --- a/includes/api/ApiFeedWatchlist.php +++ b/includes/api/ApiFeedWatchlist.php @@ -259,13 +259,6 @@ class ApiFeedWatchlist extends ApiBase { return 'Returns a watchlist feed.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'code' => 'feed-unavailable', 'info' => 'Syndication feeds are not available' ), - array( 'code' => 'feed-invalid', 'info' => 'Invalid subscription feed type' ), - ) ); - } - public function getExamples() { return array( 'api.php?action=feedwatchlist', diff --git a/includes/api/ApiFileRevert.php b/includes/api/ApiFileRevert.php index fab8b5a9c4..58e4ff9336 100644 --- a/includes/api/ApiFileRevert.php +++ b/includes/api/ApiFileRevert.php @@ -148,41 +148,12 @@ class ApiFileRevert extends ApiBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'result' => array( - ApiBase::PROP_TYPE => array( - 'Success', - 'Failure' - ) - ), - 'errors' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ) - ); - } - public function getDescription() { return array( 'Revert a file to an old version.' ); } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), - array( - array( 'mustbeloggedin', 'upload' ), - array( 'badaccess-groups' ), - array( 'invalidtitle', 'title' ), - array( 'notanarticle' ), - array( 'filerevert-badversion' ), - ) - ); - } - public function needsToken() { return true; } diff --git a/includes/api/ApiFormatBase.php b/includes/api/ApiFormatBase.php index 5d20005fac..3a0ed46642 100644 --- a/includes/api/ApiFormatBase.php +++ b/includes/api/ApiFormatBase.php @@ -52,7 +52,7 @@ abstract class ApiFormatBase extends ApiBase { } /** - * Overriding class returns the mime type that should be sent to the client. + * Overriding class returns the MIME type that should be sent to the client. * This method is not called if getIsHtml() returns true. * @return string */ diff --git a/includes/api/ApiImageRotate.php b/includes/api/ApiImageRotate.php index fa7524fe75..26def4410c 100644 --- a/includes/api/ApiImageRotate.php +++ b/includes/api/ApiImageRotate.php @@ -219,15 +219,6 @@ class ApiImageRotate extends ApiBase { return ''; } - public function getPossibleErrors() { - $pageSet = $this->getPageSet(); - - return array_merge( - parent::getPossibleErrors(), - $pageSet->getFinalPossibleErrors() - ); - } - public function getExamples() { return array( 'api.php?action=imagerotate&titles=Example.jpg&rotation=90&token=123ABC', diff --git a/includes/api/ApiImport.php b/includes/api/ApiImport.php index 3144fc15ad..25ce89b9e5 100644 --- a/includes/api/ApiImport.php +++ b/includes/api/ApiImport.php @@ -134,17 +134,6 @@ class ApiImport extends ApiBase { ); } - public function getResultProperties() { - return array( - ApiBase::PROP_LIST => true, - '' => array( - 'ns' => 'namespace', - 'title' => 'string', - 'revisions' => 'integer' - ) - ); - } - public function getDescription() { return array( 'Import a page from another wiki, or an XML file.', @@ -153,18 +142,6 @@ class ApiImport extends ApiBase { ); } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'cantimport' ), - array( 'missingparam', 'interwikipage' ), - array( 'cantimport-upload' ), - array( 'import-unknownerror', 'source' ), - array( 'import-unknownerror', 'result' ), - array( 'import-rootpage-nosubpage', 'namespace' ), - array( 'import-rootpage-invalid' ), - ) ); - } - public function needsToken() { return true; } diff --git a/includes/api/ApiLogin.php b/includes/api/ApiLogin.php index f818c5facb..976f4c121c 100644 --- a/includes/api/ApiLogin.php +++ b/includes/api/ApiLogin.php @@ -193,66 +193,6 @@ class ApiLogin extends ApiBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'result' => array( - ApiBase::PROP_TYPE => array( - 'Success', - 'NeedToken', - 'WrongToken', - 'NoName', - 'Illegal', - 'WrongPluginPass', - 'NotExists', - 'WrongPass', - 'EmptyPass', - 'CreateBlocked', - 'Throttled', - 'Blocked', - 'Aborted' - ) - ), - 'lguserid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'lgusername' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'lgtoken' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'cookieprefix' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'sessionid' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'token' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'details' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'wait' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'reason' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ) - ); - } - public function getDescription() { return array( 'Log in and get the authentication tokens.', @@ -263,37 +203,6 @@ class ApiLogin extends ApiBase { ); } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( - 'code' => 'NeedToken', 'info' => 'You need to resubmit your ' . - 'login with the specified token. See ' . - 'https://bugzilla.wikimedia.org/show_bug.cgi?id=23076' - ), - array( 'code' => 'WrongToken', 'info' => 'You specified an invalid token' ), - array( 'code' => 'NoName', 'info' => 'You didn\'t set the lgname parameter' ), - array( 'code' => 'Illegal', 'info' => 'You provided an illegal username' ), - array( 'code' => 'NotExists', 'info' => 'The username you provided doesn\'t exist' ), - array( - 'code' => 'EmptyPass', - 'info' => 'You didn\'t set the lgpassword parameter or you left it empty' - ), - array( 'code' => 'WrongPass', 'info' => 'The password you provided is incorrect' ), - array( - 'code' => 'WrongPluginPass', - 'info' => 'Same as "WrongPass", returned when an authentication ' . - 'plugin rather than MediaWiki itself rejected the password' - ), - array( - 'code' => 'CreateBlocked', - 'info' => 'The wiki tried to automatically create a new account ' . - 'for you, but your IP address has been blocked from account creation' - ), - array( 'code' => 'Throttled', 'info' => 'You\'ve logged in too many times in a short time' ), - array( 'code' => 'Blocked', 'info' => 'User is blocked' ), - ) ); - } - public function getExamples() { return array( 'api.php?action=login&lgname=user&lgpassword=password' diff --git a/includes/api/ApiLogout.php b/includes/api/ApiLogout.php index c8b388205a..324f4b2fdf 100644 --- a/includes/api/ApiLogout.php +++ b/includes/api/ApiLogout.php @@ -50,10 +50,6 @@ class ApiLogout extends ApiBase { return array(); } - public function getResultProperties() { - return array(); - } - public function getParamDescription() { return array(); } diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php index 4a75f3c5e0..115c7b0623 100644 --- a/includes/api/ApiMain.php +++ b/includes/api/ApiMain.php @@ -1198,24 +1198,6 @@ class ApiMain extends ApiBase { ); } - /** - * @return array - */ - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'readonlytext' ), - array( 'code' => 'unknown_format', 'info' => 'Unrecognized format: format' ), - array( 'code' => 'unknown_action', 'info' => 'The API requires a valid action parameter' ), - array( 'code' => 'maxlag', 'info' => 'Waiting for host: x seconds lagged' ), - array( 'code' => 'maxlag', 'info' => 'Waiting for a database server: x seconds lagged' ), - array( 'code' => 'assertuserfailed', 'info' => 'Assertion that the user is logged in failed' ), - array( - 'code' => 'assertbotfailed', - 'info' => 'Assertion that the user has the bot right failed' - ), - ) ); - } - /** * Returns an array of strings with credits for the API * @return array diff --git a/includes/api/ApiModuleManager.php b/includes/api/ApiModuleManager.php index 822652977e..fdf3f02ed4 100644 --- a/includes/api/ApiModuleManager.php +++ b/includes/api/ApiModuleManager.php @@ -59,13 +59,55 @@ class ApiModuleManager extends ContextSource { } /** - * Add a list of modules to the manager - * @param array $modules A map of ModuleName => ModuleClass + * Add a list of modules to the manager. Each module is described + * by a module spec. + * + * Each module spec is an associative array containing at least + * the 'class' key for the module's class, and optionally a + * 'factory' key for the factory function to use for the module. + * + * That factory function will be called with two parameters, + * the parent module (an instance of ApiBase, usually ApiMain) + * and the name the module was registered under. The return + * value must be an instance of the class given in the 'class' + * field. + * + * For backward compatibility, the module spec may also be a + * simple string containing the module's class name. In that + * case, the class' constructor will be called with the parent + * module and module name as parameters, as described above. + * + * Examples for defining module specs: + * + * @code + * $modules['foo'] = 'ApiFoo'; + * $modules['bar'] = array( + * 'class' => 'ApiBar', + * 'factory' => function( $main, $name ) { ... } + * ); + * $modules['xyzzy'] = array( + * 'class' => 'ApiXyzzy', + * 'factory' => array( 'XyzzyFactory', 'newApiModule' ) + * ); + * @endcode + * + * @param array $modules A map of ModuleName => ModuleSpec; The ModuleSpec + * is either a string containing the module's class name, or an associative + * array (see above for details). * @param string $group Which group modules belong to (action,format,...) */ public function addModules( array $modules, $group ) { - foreach ( $modules as $name => $class ) { - $this->addModule( $name, $group, $class ); + + foreach ( $modules as $name => $moduleSpec ) { + if ( is_array( $moduleSpec ) ) { + $class = $moduleSpec['class']; + $factory = ( isset( $moduleSpec['factory'] ) ? $moduleSpec['factory'] : null ); + } else { + $class = $moduleSpec; + $factory = null; + } + + $this->addModule( $name, $group, $class, $factory ); } } @@ -74,37 +116,61 @@ class ApiModuleManager extends ContextSource { * classes who wish to add their own modules to their lexicon or override the * behavior of inherent ones. * - * @param string $group Name of the module group * @param string $name The identifier for this module. + * @param string $group Name of the module group * @param string $class The class where this module is implemented. + * @param callable|null $factory Callback for instantiating the module. + * + * @throws InvalidArgumentException */ - public function addModule( $name, $group, $class ) { + public function addModule( $name, $group, $class, $factory = null ) { + if ( !is_string( $name ) ) { + throw new InvalidArgumentException( '$name must be a string' ); + } + + if ( !is_string( $group ) ) { + throw new InvalidArgumentException( '$group must be a string' ); + } + + if ( !is_string( $class ) ) { + throw new InvalidArgumentException( '$class must be a string' ); + } + + if ( $factory !== null && !is_callable( $factory ) ) { + throw new InvalidArgumentException( '$factory must be a callable (or null)' ); + } + $this->mGroups[$group] = null; - $this->mModules[$name] = array( $group, $class ); + $this->mModules[$name] = array( $group, $class, $factory ); } /** * Get module instance by name, or instantiate it if it does not exist + * * @param string $moduleName Module name * @param string $group Optionally validate that the module is in a specific group * @param bool $ignoreCache If true, force-creates a new instance and does not cache it - * @return mixed The new module instance, or null if failed + * + * @return ApiBase|null The new module instance, or null if failed */ public function getModule( $moduleName, $group = null, $ignoreCache = false ) { if ( !isset( $this->mModules[$moduleName] ) ) { return null; } - $grpCls = $this->mModules[$moduleName]; - if ( $group !== null && $grpCls[0] !== $group ) { + + list( $moduleGroup, $moduleClass, $moduleFactory ) = $this->mModules[$moduleName]; + + if ( $group !== null && $moduleGroup !== $group ) { return null; } + if ( !$ignoreCache && isset( $this->mInstances[$moduleName] ) ) { // already exists return $this->mInstances[$moduleName]; } else { // new instance - $class = $grpCls[1]; - $instance = new $class ( $this->mParent, $moduleName ); + $instance = $this->instantiateModule( $moduleName, $moduleClass, $moduleFactory ); + if ( !$ignoreCache ) { // cache this instance in case it is needed later $this->mInstances[$moduleName] = $instance; @@ -114,6 +180,32 @@ class ApiModuleManager extends ContextSource { } } + /** + * Instantiate the module using the given class or factory function. + * + * @param string $name The identifier for this module. + * @param string $class The class where this module is implemented. + * @param callable|null $factory Callback for instantiating the module. + * + * @throws MWException + * @return ApiBase + */ + private function instantiateModule( $name, $class, $factory = null ) { + if ( $factory !== null ) { + // create instance from factory + $instance = call_user_func( $factory, $this->mParent, $name ); + + if ( ! $instance instanceof $class ) { + throw new MWException( "The factory function for module $name did not return an instance of $class!" ); + } + } else { + // create instance from class name + $instance = new $class( $this->mParent, $name ); + } + + return $instance; + } + /** * Get an array of modules in a specific group or all if no group is set. * @param string $group Optional group filter diff --git a/includes/api/ApiMove.php b/includes/api/ApiMove.php index 2cfc25180e..cc585732b7 100644 --- a/includes/api/ApiMove.php +++ b/includes/api/ApiMove.php @@ -242,52 +242,10 @@ class ApiMove extends ApiBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'from' => 'string', - 'to' => 'string', - 'reason' => 'string', - 'redirectcreated' => 'boolean', - 'moveoverredirect' => 'boolean', - 'talkfrom' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'talkto' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'talkmoveoverredirect' => 'boolean', - 'talkmove-error-code' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'talkmove-error-info' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ) - ); - } - public function getDescription() { return 'Move a page.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), - $this->getRequireOnlyOneParameterErrorMessages( array( 'from', 'fromid' ) ), - array( - array( 'invalidtitle', 'from' ), - array( 'nosuchpageid', 'fromid' ), - array( 'notanarticle' ), - array( 'invalidtitle', 'to' ), - array( 'sharedfile-exists' ), - ) - ); - } - public function needsToken() { return true; } diff --git a/includes/api/ApiOptions.php b/includes/api/ApiOptions.php index 86d051a683..8ac9b9afb0 100644 --- a/includes/api/ApiOptions.php +++ b/includes/api/ApiOptions.php @@ -157,18 +157,6 @@ class ApiOptions extends ApiBase { ); } - public function getResultProperties() { - return array( - '' => array( - '*' => array( - ApiBase::PROP_TYPE => array( - 'success' - ) - ) - ) - ); - } - public function getParamDescription() { return array( 'token' => 'An options token previously obtained through the action=tokens', @@ -194,13 +182,6 @@ class ApiOptions extends ApiBase { ); } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'code' => 'notloggedin', 'info' => 'Anonymous users cannot change preferences' ), - array( 'code' => 'nochanges', 'info' => 'No changes were requested' ), - ) ); - } - public function needsToken() { return true; } diff --git a/includes/api/ApiPageSet.php b/includes/api/ApiPageSet.php index 20444d0f4a..dfb87fdfc7 100644 --- a/includes/api/ApiPageSet.php +++ b/includes/api/ApiPageSet.php @@ -1168,21 +1168,4 @@ class ApiPageSet extends ApiBase { ), ); } - - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( - 'code' => 'multisource', - 'info' => "Cannot use 'pageids' at the same time as 'dataSource'" - ), - array( - 'code' => 'multisource', - 'info' => "Cannot use 'revids' at the same time as 'dataSource'" - ), - array( - 'code' => 'badgenerator', - 'info' => 'Module $generatorName cannot be used as a generator' - ), - ) ); - } } diff --git a/includes/api/ApiParamInfo.php b/includes/api/ApiParamInfo.php index 622e3a60c6..935d5ae275 100644 --- a/includes/api/ApiParamInfo.php +++ b/includes/api/ApiParamInfo.php @@ -244,66 +244,6 @@ class ApiParamInfo extends ApiBase { } $result->setIndexedTagName( $retval['parameters'], 'param' ); - $props = $obj->getFinalResultProperties(); - $listResult = null; - if ( $props !== false ) { - $retval['props'] = array(); - - foreach ( $props as $prop => $properties ) { - $propResult = array(); - if ( $prop == ApiBase::PROP_LIST ) { - $listResult = $properties; - continue; - } - if ( $prop != ApiBase::PROP_ROOT ) { - $propResult['name'] = $prop; - } - $propResult['properties'] = array(); - - foreach ( $properties as $name => $p ) { - $propertyResult = array(); - - $propertyResult['name'] = $name; - - if ( !is_array( $p ) ) { - $p = array( ApiBase::PROP_TYPE => $p ); - } - - $propertyResult['type'] = $p[ApiBase::PROP_TYPE]; - - if ( is_array( $propertyResult['type'] ) ) { - $propertyResult['type'] = array_values( $propertyResult['type'] ); - $result->setIndexedTagName( $propertyResult['type'], 't' ); - } - - $nullable = null; - if ( isset( $p[ApiBase::PROP_NULLABLE] ) ) { - $nullable = $p[ApiBase::PROP_NULLABLE]; - } - - if ( $nullable === true ) { - $propertyResult['nullable'] = ''; - } - - $propResult['properties'][] = $propertyResult; - } - - $result->setIndexedTagName( $propResult['properties'], 'property' ); - $retval['props'][] = $propResult; - } - - // default is true for query modules, false for other modules, overridden by ApiBase::PROP_LIST - if ( $listResult === true || ( $listResult !== false && $obj instanceof ApiQueryBase ) ) { - $retval['listresult'] = ''; - } - - $result->setIndexedTagName( $retval['props'], 'prop' ); - } - - // Errors - $retval['errors'] = $this->parseErrors( $obj->getFinalPossibleErrors() ); - $result->setIndexedTagName( $retval['errors'], 'error' ); - return $retval; } diff --git a/includes/api/ApiParse.php b/includes/api/ApiParse.php index 2e993e3648..d09470bd28 100644 --- a/includes/api/ApiParse.php +++ b/includes/api/ApiParse.php @@ -804,29 +804,6 @@ class ApiParse extends ApiBase { ); } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( - 'code' => 'params', - 'info' => 'The page parameter cannot be used together with the text and title parameters' - ), - array( 'code' => 'missingrev', 'info' => 'There is no revision ID oldid' ), - array( - 'code' => 'permissiondenied', - 'info' => 'You don\'t have permission to view deleted revisions' - ), - array( 'code' => 'missingtitle', 'info' => 'The page you specified doesn\'t exist' ), - array( 'code' => 'nosuchsection', 'info' => 'There is no section sectionnumber in page' ), - array( 'nosuchpageid' ), - array( 'invalidtitle', 'title' ), - array( 'code' => 'parseerror', 'info' => 'Failed to parse the given text.' ), - array( - 'code' => 'notwikitext', - 'info' => 'The requested operation is only supported on wikitext content.' - ), - ) ); - } - public function getExamples() { return array( 'api.php?action=parse&page=Project:Sandbox' => 'Parse a page', diff --git a/includes/api/ApiPatrol.php b/includes/api/ApiPatrol.php index 00297ec27c..9690952968 100644 --- a/includes/api/ApiPatrol.php +++ b/includes/api/ApiPatrol.php @@ -98,35 +98,10 @@ class ApiPatrol extends ApiBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'rcid' => 'integer', - 'ns' => 'namespace', - 'title' => 'string' - ) - ); - } - public function getDescription() { return 'Patrol a page or revision.'; } - public function getPossibleErrors() { - return array_merge( - parent::getPossibleErrors(), - parent::getRequireOnlyOneParameterErrorMessages( array( 'rcid', 'revid' ) ), - array( - array( 'nosuchrcid', 'rcid' ), - array( 'nosuchrevid', 'revid' ), - array( - 'code' => 'notpatrollable', - 'info' => "The revision can't be patrolled as it's too old" - ) - ) - ); - } - public function needsToken() { return true; } diff --git a/includes/api/ApiProtect.php b/includes/api/ApiProtect.php index b9f97e3536..828fc22ab2 100644 --- a/includes/api/ApiProtect.php +++ b/includes/api/ApiProtect.php @@ -200,35 +200,10 @@ class ApiProtect extends ApiBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'title' => 'string', - 'reason' => 'string', - 'cascade' => 'boolean' - ) - ); - } - public function getDescription() { return 'Change the protection level of a page.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), - $this->getTitleOrPageIdErrorMessage(), - array( - array( 'toofewexpiries', 'noofexpiries', 'noofprotections' ), - array( 'create-titleexists' ), - array( 'missingtitle-createonly' ), - array( 'protect-invalidaction', 'action' ), - array( 'protect-invalidlevel', 'level' ), - array( 'invalidexpiry', 'expiry' ), - array( 'pastexpiry', 'expiry' ), - ) - ); - } - public function needsToken() { return true; } diff --git a/includes/api/ApiPurge.php b/includes/api/ApiPurge.php index 33998431c4..7667b23529 100644 --- a/includes/api/ApiPurge.php +++ b/includes/api/ApiPurge.php @@ -152,52 +152,12 @@ class ApiPurge extends ApiBase { ); } - public function getResultProperties() { - return array( - ApiBase::PROP_LIST => true, - '' => array( - 'ns' => array( - ApiBase::PROP_TYPE => 'namespace', - ApiBase::PROP_NULLABLE => true - ), - 'title' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'pageid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'revid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'invalid' => 'boolean', - 'special' => 'boolean', - 'missing' => 'boolean', - 'purged' => 'boolean', - 'linkupdate' => 'boolean', - 'iw' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - ) - ); - } - public function getDescription() { return array( 'Purge the cache for the given titles.', 'Requires a POST request if the user is not logged in.' ); } - public function getPossibleErrors() { - return array_merge( - parent::getPossibleErrors(), - $this->getPageSet()->getFinalPossibleErrors() - ); - } - public function getExamples() { return array( 'api.php?action=purge&titles=Main_Page|API' => 'Purge the "Main Page" and the "API" page', diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php index 606012c485..435920197c 100644 --- a/includes/api/ApiQuery.php +++ b/includes/api/ApiQuery.php @@ -620,13 +620,6 @@ class ApiQuery extends ApiBase { ); } - public function getPossibleErrors() { - return array_merge( - parent::getPossibleErrors(), - $this->getPageSet()->getFinalPossibleErrors() - ); - } - public function getExamples() { return array( 'api.php?action=query&prop=revisions&meta=siteinfo&' . diff --git a/includes/api/ApiQueryAllCategories.php b/includes/api/ApiQueryAllCategories.php index 1b65097d4c..79fab7275b 100644 --- a/includes/api/ApiQueryAllCategories.php +++ b/includes/api/ApiQueryAllCategories.php @@ -207,23 +207,6 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase { ); } - public function getResultProperties() { - return array( - '' => array( - '*' => 'string' - ), - 'size' => array( - 'size' => 'integer', - 'pages' => 'integer', - 'files' => 'integer', - 'subcats' => 'integer' - ), - 'hidden' => array( - 'hidden' => 'boolean' - ) - ); - } - public function getDescription() { return 'Enumerate all categories.'; } diff --git a/includes/api/ApiQueryAllImages.php b/includes/api/ApiQueryAllImages.php index 68d968f0b0..9dc5f69a80 100644 --- a/includes/api/ApiQueryAllImages.php +++ b/includes/api/ApiQueryAllImages.php @@ -393,76 +393,10 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { private $propertyFilter = array( 'archivename', 'thumbmime', 'uploadwarning' ); - public function getResultProperties() { - return array_merge( - array( - '' => array( - 'name' => 'string', - 'ns' => 'namespace', - 'title' => 'string' - ) - ), - ApiQueryImageInfo::getResultPropertiesFiltered( $this->propertyFilter ) - ); - } - public function getDescription() { return 'Enumerate all images sequentially.'; } - public function getPossibleErrors() { - $p = $this->getModulePrefix(); - - return array_merge( parent::getPossibleErrors(), array( - array( - 'code' => 'params', - 'info' => 'Use "gaifilterredir=nonredirects" option instead ' . - 'of "redirects" when using allimages as a generator' - ), - array( - 'code' => 'badparams', - 'info' => "Parameter'{$p}start' can only be used with {$p}sort=timestamp" - ), - array( - 'code' => 'badparams', - 'info' => "Parameter'{$p}end' can only be used with {$p}sort=timestamp" - ), - array( - 'code' => 'badparams', - 'info' => "Parameter'{$p}user' can only be used with {$p}sort=timestamp" - ), - array( - 'code' => 'badparams', - 'info' => "Parameter'{$p}filterbots' can only be used with {$p}sort=timestamp" - ), - array( - 'code' => 'badparams', - 'info' => "Parameter'{$p}from' can only be used with {$p}sort=name" - ), - array( - 'code' => 'badparams', - 'info' => "Parameter'{$p}to' can only be used with {$p}sort=name" - ), - array( - 'code' => 'badparams', - 'info' => "Parameter'{$p}prefix' can only be used with {$p}sort=name" - ), - array( - 'code' => 'badparams', - 'info' => "Parameters '{$p}user' and '{$p}filterbots' cannot be used together" - ), - array( - 'code' => 'unsupportedrepo', - 'info' => 'Local file repository does not support querying all images' ), - array( 'code' => 'mimesearchdisabled', 'info' => 'MIME search disabled in Miser Mode' ), - array( 'code' => 'invalidsha1hash', 'info' => 'The SHA1 hash provided is not valid' ), - array( - 'code' => 'invalidsha1base36hash', - 'info' => 'The SHA1Base36 hash provided is not valid' - ), - ) ); - } - public function getExamples() { return array( 'api.php?action=query&list=allimages&aifrom=B' => array( diff --git a/includes/api/ApiQueryAllLinks.php b/includes/api/ApiQueryAllLinks.php index 61bc90e5f9..903dee42d4 100644 --- a/includes/api/ApiQueryAllLinks.php +++ b/includes/api/ApiQueryAllLinks.php @@ -334,34 +334,10 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { return $paramDescription; } - public function getResultProperties() { - return array( - 'ids' => array( - 'fromid' => 'integer' - ), - 'title' => array( - 'ns' => 'namespace', - 'title' => 'string' - ) - ); - } - public function getDescription() { return $this->description; } - public function getPossibleErrors() { - $m = $this->getModuleName(); - $what = $this->descriptionWhat; - - return array_merge( parent::getPossibleErrors(), array( - array( - 'code' => 'params', - 'info' => "{$m} cannot return corresponding page ids in unique {$what}s mode" - ), - ) ); - } - public function getExamples() { $p = $this->getModulePrefix(); $name = $this->getModuleName(); diff --git a/includes/api/ApiQueryAllMessages.php b/includes/api/ApiQueryAllMessages.php index c6171e97c2..a75a16fcbc 100644 --- a/includes/api/ApiQueryAllMessages.php +++ b/includes/api/ApiQueryAllMessages.php @@ -256,33 +256,6 @@ class ApiQueryAllMessages extends ApiQueryBase { ); } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'code' => 'invalidlang', 'info' => 'Invalid language code for parameter lang' ), - ) ); - } - - public function getResultProperties() { - return array( - '' => array( - 'name' => 'string', - 'customised' => 'boolean', - 'missing' => 'boolean', - '*' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'default' => array( - 'defaultmissing' => 'boolean', - 'default' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ) - ); - } - public function getDescription() { return 'Return messages from this site.'; } diff --git a/includes/api/ApiQueryAllPages.php b/includes/api/ApiQueryAllPages.php index a3ba5ab63e..b7bd65a53c 100644 --- a/includes/api/ApiQueryAllPages.php +++ b/includes/api/ApiQueryAllPages.php @@ -328,31 +328,10 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'pageid' => 'integer', - 'ns' => 'namespace', - 'title' => 'string' - ) - ); - } - public function getDescription() { return 'Enumerate all pages sequentially in a given namespace.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( - 'code' => 'params', - 'info' => 'Use "gapfilterredir=nonredirects" option instead of ' . - '"redirects" when using allpages as a generator' - ), - array( 'code' => 'params', 'info' => 'prlevel may not be used without prtype' ), - ) ); - } - public function getExamples() { return array( 'api.php?action=query&list=allpages&apfrom=B' => array( diff --git a/includes/api/ApiQueryAllUsers.php b/includes/api/ApiQueryAllUsers.php index d0980e6b14..dfef286084 100644 --- a/includes/api/ApiQueryAllUsers.php +++ b/includes/api/ApiQueryAllUsers.php @@ -46,10 +46,11 @@ class ApiQueryAllUsers extends ApiQueryBase { public function execute() { $params = $this->extractRequestParams(); + $activeUserDays = $this->getConfig()->get( 'ActiveUserDays' ); if ( $params['activeusers'] ) { // Update active user cache - SpecialActiveUsers::mergeActiveUsers( 600 ); + SpecialActiveUsers::mergeActiveUsers( 600, $activeUserDays ); } $db = $this->getDB(); @@ -161,7 +162,7 @@ class ApiQueryAllUsers extends ApiQueryBase { } if ( $params['activeusers'] ) { - $activeUserSeconds = $this->getConfig()->get( 'ActiveUserDays' ) * 86400; + $activeUserSeconds = $activeUserDays * 86400; // Filter query to only include users in the active users cache $this->addTables( 'querycachetwo' ); @@ -420,61 +421,10 @@ class ApiQueryAllUsers extends ApiQueryBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'userid' => 'integer', - 'name' => 'string', - 'recentactions' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ) - ), - 'blockinfo' => array( - 'blockid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'blockedby' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'blockedbyid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'blockedreason' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'blockedexpiry' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'hidden' => 'boolean' - ), - 'editcount' => array( - 'editcount' => 'integer' - ), - 'registration' => array( - 'registration' => 'string' - ) - ); - } - public function getDescription() { return 'Enumerate all registered users.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( - 'code' => 'group-excludegroup', - 'info' => 'group and excludegroup cannot be used together' - ), - ) ); - } - public function getExamples() { return array( 'api.php?action=query&list=allusers&aufrom=Y', diff --git a/includes/api/ApiQueryBacklinks.php b/includes/api/ApiQueryBacklinks.php index 8dc2a6580a..c141246d5d 100644 --- a/includes/api/ApiQueryBacklinks.php +++ b/includes/api/ApiQueryBacklinks.php @@ -520,17 +520,6 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase { ) ); } - public function getResultProperties() { - return array( - '' => array( - 'pageid' => 'integer', - 'ns' => 'namespace', - 'title' => 'string', - 'redirect' => 'boolean' - ) - ); - } - public function getDescription() { switch ( $this->getModuleName() ) { case 'backlinks': @@ -544,18 +533,6 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase { } } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), - $this->getTitleOrPageIdErrorMessage(), - array( - array( - 'code' => 'bad_image_title', - 'info' => "The title for {$this->getModuleName()} query must be an image" - ), - ) - ); - } - public function getExamples() { static $examples = array( 'backlinks' => array( diff --git a/includes/api/ApiQueryBase.php b/includes/api/ApiQueryBase.php index ebfd8b28e2..6680316390 100644 --- a/includes/api/ApiQueryBase.php +++ b/includes/api/ApiQueryBase.php @@ -591,19 +591,6 @@ abstract class ApiQueryBase extends ApiBase { return preg_match( '/^[a-z0-9]{31}$/', $hash ); } - /** - * @return array - */ - public function getPossibleErrors() { - $errors = parent::getPossibleErrors(); - $errors = array_merge( $errors, array( - array( 'invalidtitle', 'title' ), - array( 'invalidtitle', 'key' ), - ) ); - - return $errors; - } - /** * Check whether the current user has permission to view revision-deleted * fields. diff --git a/includes/api/ApiQueryBlocks.php b/includes/api/ApiQueryBlocks.php index d62e87d000..33b25fd927 100644 --- a/includes/api/ApiQueryBlocks.php +++ b/includes/api/ApiQueryBlocks.php @@ -368,86 +368,10 @@ class ApiQueryBlocks extends ApiQueryBase { ); } - public function getResultProperties() { - return array( - 'id' => array( - 'id' => 'integer' - ), - 'user' => array( - 'user' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'userid' => array( - 'userid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ) - ), - 'by' => array( - 'by' => 'string' - ), - 'byid' => array( - 'byid' => 'integer' - ), - 'timestamp' => array( - 'timestamp' => 'timestamp' - ), - 'expiry' => array( - 'expiry' => 'timestamp' - ), - 'reason' => array( - 'reason' => 'string' - ), - 'range' => array( - 'rangestart' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'rangeend' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'flags' => array( - 'automatic' => 'boolean', - 'anononly' => 'boolean', - 'nocreate' => 'boolean', - 'autoblock' => 'boolean', - 'noemail' => 'boolean', - 'hidden' => 'boolean', - 'allowusertalk' => 'boolean' - ) - ); - } - public function getDescription() { return 'List all blocked users and IP addresses.'; } - public function getPossibleErrors() { - $blockCIDRLimit = $this->getConfig()->get( 'BlockCIDRLimit' ); - - return array_merge( parent::getPossibleErrors(), - $this->getRequireMaxOneParameterErrorMessages( array( 'users', 'ip' ) ), - array( - array( - 'code' => 'cidrtoobroad', - 'info' => "IPv4 CIDR ranges broader than /{$blockCIDRLimit['IPv4']} are not accepted" - ), - array( - 'code' => 'cidrtoobroad', - 'info' => "IPv6 CIDR ranges broader than /{$blockCIDRLimit['IPv6']} are not accepted" - ), - array( 'code' => 'param_ip', 'info' => 'IP parameter is not valid' ), - array( 'code' => 'param_user', 'info' => 'User parameter may not be empty' ), - array( 'code' => 'param_user', 'info' => 'User name user is not valid' ), - array( 'show' ), - ) - ); - } - public function getExamples() { return array( 'api.php?action=query&list=blocks', diff --git a/includes/api/ApiQueryCategories.php b/includes/api/ApiQueryCategories.php index cfc76e66fc..1926dd0946 100644 --- a/includes/api/ApiQueryCategories.php +++ b/includes/api/ApiQueryCategories.php @@ -234,35 +234,10 @@ class ApiQueryCategories extends ApiQueryGeneratorBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'ns' => 'namespace', - 'title' => 'string' - ), - 'sortkey' => array( - 'sortkey' => 'string', - 'sortkeyprefix' => 'string' - ), - 'timestamp' => array( - 'timestamp' => 'timestamp' - ), - 'hidden' => array( - 'hidden' => 'boolean' - ) - ); - } - public function getDescription() { return 'List all categories the page(s) belong to.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'show' ), - ) ); - } - public function getExamples() { return array( 'api.php?action=query&prop=categories&titles=Albert%20Einstein' diff --git a/includes/api/ApiQueryCategoryInfo.php b/includes/api/ApiQueryCategoryInfo.php index 8097b7bd69..6e9f33c1b3 100644 --- a/includes/api/ApiQueryCategoryInfo.php +++ b/includes/api/ApiQueryCategoryInfo.php @@ -114,34 +114,6 @@ class ApiQueryCategoryInfo extends ApiQueryBase { ); } - public function getResultProperties() { - return array( - ApiBase::PROP_LIST => false, - '' => array( - 'size' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => false - ), - 'pages' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => false - ), - 'files' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => false - ), - 'subcats' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => false - ), - 'hidden' => array( - ApiBase::PROP_TYPE => 'boolean', - ApiBase::PROP_NULLABLE => false - ) - ) - ); - } - public function getDescription() { return 'Returns information about the given categories.'; } diff --git a/includes/api/ApiQueryCategoryMembers.php b/includes/api/ApiQueryCategoryMembers.php index dc11071b0a..17badb14d6 100644 --- a/includes/api/ApiQueryCategoryMembers.php +++ b/includes/api/ApiQueryCategoryMembers.php @@ -384,49 +384,10 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase { return $desc; } - public function getResultProperties() { - return array( - 'ids' => array( - 'pageid' => 'integer' - ), - 'title' => array( - 'ns' => 'namespace', - 'title' => 'string' - ), - 'sortkey' => array( - 'sortkey' => 'string' - ), - 'sortkeyprefix' => array( - 'sortkeyprefix' => 'string' - ), - 'type' => array( - 'type' => array( - ApiBase::PROP_TYPE => array( - 'page', - 'subcat', - 'file' - ) - ) - ), - 'timestamp' => array( - 'timestamp' => 'timestamp' - ) - ); - } - public function getDescription() { return 'List all pages in a given category.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), - $this->getTitleOrPageIdErrorMessage(), - array( - array( 'code' => 'invalidcategory', 'info' => 'The category name you entered is not valid' ), - ) - ); - } - public function getExamples() { return array( 'api.php?action=query&list=categorymembers&cmtitle=Category:Physics' diff --git a/includes/api/ApiQueryContributors.php b/includes/api/ApiQueryContributors.php index b90283f978..55ea47025e 100644 --- a/includes/api/ApiQueryContributors.php +++ b/includes/api/ApiQueryContributors.php @@ -265,14 +265,6 @@ class ApiQueryContributors extends ApiQueryBase { ); } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), - $this->getRequireMaxOneParameterErrorMessages( - array( 'group', 'excludegroup', 'rights', 'excluderights' ) - ) - ); - } - public function getDescription() { return 'Get the list of logged-in contributors and ' . 'the count of anonymous contributors to a page.'; diff --git a/includes/api/ApiQueryDeletedrevs.php b/includes/api/ApiQueryDeletedrevs.php index 4f77078440..6b1185b882 100644 --- a/includes/api/ApiQueryDeletedrevs.php +++ b/includes/api/ApiQueryDeletedrevs.php @@ -505,18 +505,6 @@ class ApiQueryDeletedrevs extends ApiQueryBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'ns' => 'namespace', - 'title' => 'string' - ), - 'token' => array( - 'token' => 'string' - ) - ); - } - public function getDescription() { $p = $this->getModulePrefix(); @@ -532,29 +520,6 @@ class ApiQueryDeletedrevs extends ApiQueryBase { ); } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( - 'code' => 'permissiondenied', - 'info' => 'You don\'t have permission to view deleted revision information' - ), - array( 'code' => 'badparams', 'info' => 'user and excludeuser cannot be used together' - ), - array( - 'code' => 'permissiondenied', - 'info' => 'You don\'t have permission to view deleted revision content' - ), - array( 'code' => 'badparams', 'info' => "The 'from' parameter cannot be used in modes 1 or 2" ), - array( 'code' => 'badparams', 'info' => "The 'to' parameter cannot be used in modes 1 or 2" ), - array( - 'code' => 'badparams', - 'info' => "The 'prefix' parameter cannot be used in modes 1 or 2" - ), - array( 'code' => 'badparams', 'info' => "The 'start' parameter cannot be used in mode 3" ), - array( 'code' => 'badparams', 'info' => "The 'end' parameter cannot be used in mode 3" ), - ) ); - } - public function getExamples() { return array( 'api.php?action=query&list=deletedrevs&titles=Main%20Page|Talk:Main%20Page&' . diff --git a/includes/api/ApiQueryDuplicateFiles.php b/includes/api/ApiQueryDuplicateFiles.php index 46454029fb..6d836cd5f7 100644 --- a/includes/api/ApiQueryDuplicateFiles.php +++ b/includes/api/ApiQueryDuplicateFiles.php @@ -188,17 +188,6 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'name' => 'string', - 'user' => 'string', - 'timestamp' => 'timestamp', - 'shared' => 'boolean', - ) - ); - } - public function getDescription() { return 'List all files that are duplicates of the given file(s) based on hash values.'; } diff --git a/includes/api/ApiQueryExtLinksUsage.php b/includes/api/ApiQueryExtLinksUsage.php index 33e8739e68..faabb920eb 100644 --- a/includes/api/ApiQueryExtLinksUsage.php +++ b/includes/api/ApiQueryExtLinksUsage.php @@ -239,31 +239,10 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase { return $desc; } - public function getResultProperties() { - return array( - 'ids' => array( - 'pageid' => 'integer' - ), - 'title' => array( - 'ns' => 'namespace', - 'title' => 'string' - ), - 'url' => array( - 'url' => 'string' - ) - ); - } - public function getDescription() { return 'Enumerate pages that contain a given URL.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'code' => 'bad_query', 'info' => 'Invalid query' ), - ) ); - } - public function getExamples() { return array( 'api.php?action=query&list=exturlusage&euquery=www.mediawiki.org' diff --git a/includes/api/ApiQueryExternalLinks.php b/includes/api/ApiQueryExternalLinks.php index e3a7be3da7..95666354a2 100644 --- a/includes/api/ApiQueryExternalLinks.php +++ b/includes/api/ApiQueryExternalLinks.php @@ -141,24 +141,10 @@ class ApiQueryExternalLinks extends ApiQueryBase { ); } - public function getResultProperties() { - return array( - '' => array( - '*' => 'string' - ) - ); - } - public function getDescription() { return 'Returns all external URLs (not interwikis) from the given page(s).'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'code' => 'bad_query', 'info' => 'Invalid query' ), - ) ); - } - public function getExamples() { return array( 'api.php?action=query&prop=extlinks&titles=Main%20Page' diff --git a/includes/api/ApiQueryFilearchive.php b/includes/api/ApiQueryFilearchive.php index a94b4fac6d..f047d8d414 100644 --- a/includes/api/ApiQueryFilearchive.php +++ b/includes/api/ApiQueryFilearchive.php @@ -315,89 +315,10 @@ class ApiQueryFilearchive extends ApiQueryBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'name' => 'string', - 'ns' => 'namespace', - 'title' => 'string', - 'filehidden' => 'boolean', - 'commenthidden' => 'boolean', - 'userhidden' => 'boolean', - 'suppressed' => 'boolean' - ), - 'sha1' => array( - 'sha1' => 'string' - ), - 'timestamp' => array( - 'timestamp' => 'timestamp' - ), - 'user' => array( - 'userid' => 'integer', - 'user' => 'string' - ), - 'size' => array( - 'size' => 'integer', - 'pagecount' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'height' => 'integer', - 'width' => 'integer' - ), - 'dimensions' => array( - 'size' => 'integer', - 'pagecount' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'height' => 'integer', - 'width' => 'integer' - ), - 'description' => array( - 'description' => 'string' - ), - 'parseddescription' => array( - 'description' => 'string', - 'parseddescription' => 'string' - ), - 'metadata' => array( - 'metadata' => 'string' - ), - 'bitdepth' => array( - 'bitdepth' => 'integer' - ), - 'mime' => array( - 'mime' => 'string' - ), - 'mediatype' => array( - 'mediatype' => 'string' - ), - 'archivename' => array( - 'archivename' => 'string' - ), - ); - } - public function getDescription() { return 'Enumerate all deleted files sequentially.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( - 'code' => 'permissiondenied', - 'info' => 'You don\'t have permission to view deleted file information' - ), - array( 'code' => 'hashsearchdisabled', 'info' => 'Search by hash disabled in Miser Mode' ), - array( 'code' => 'invalidsha1hash', 'info' => 'The SHA-1 hash provided is not valid' ), - array( - 'code' => 'invalidsha1base36hash', - 'info' => 'The SHA1Base36 hash provided is not valid' - ), - ) ); - } - public function getExamples() { return array( 'api.php?action=query&list=filearchive' => array( diff --git a/includes/api/ApiQueryIWBacklinks.php b/includes/api/ApiQueryIWBacklinks.php index 35b2b4092b..b5aa45bfff 100644 --- a/includes/api/ApiQueryIWBacklinks.php +++ b/includes/api/ApiQueryIWBacklinks.php @@ -210,23 +210,6 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'pageid' => 'integer', - 'ns' => 'namespace', - 'title' => 'string', - 'redirect' => 'boolean' - ), - 'iwprefix' => array( - 'iwprefix' => 'string' - ), - 'iwtitle' => array( - 'iwtitle' => 'string' - ) - ); - } - public function getDescription() { return array( 'Find all pages that link to the given interwiki link.', 'Can be used to find all links with a prefix, or', @@ -235,12 +218,6 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase { ); } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'missingparam', 'prefix' ), - ) ); - } - public function getExamples() { return array( 'api.php?action=query&list=iwbacklinks&iwbltitle=Test&iwblprefix=wikibooks', diff --git a/includes/api/ApiQueryIWLinks.php b/includes/api/ApiQueryIWLinks.php index f38a7b17ed..bb388cd1a3 100644 --- a/includes/api/ApiQueryIWLinks.php +++ b/includes/api/ApiQueryIWLinks.php @@ -171,29 +171,10 @@ class ApiQueryIWLinks extends ApiQueryBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'prefix' => 'string', - 'url' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - '*' => 'string' - ) - ); - } - public function getDescription() { return 'Returns all interwiki links from the given page(s).'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'missingparam', 'prefix' ), - ) ); - } - public function getExamples() { return array( 'api.php?action=query&prop=iwlinks&titles=Main%20Page' diff --git a/includes/api/ApiQueryImageInfo.php b/includes/api/ApiQueryImageInfo.php index a214610d4b..5cc1454046 100644 --- a/includes/api/ApiQueryImageInfo.php +++ b/includes/api/ApiQueryImageInfo.php @@ -739,151 +739,10 @@ class ApiQueryImageInfo extends ApiQueryBase { ); } - public static function getResultPropertiesFiltered( $filter = array() ) { - $props = array( - 'timestamp' => array( - 'timestamp' => 'timestamp' - ), - 'user' => array( - 'userhidden' => 'boolean', - 'user' => 'string', - 'anon' => 'boolean' - ), - 'userid' => array( - 'userhidden' => 'boolean', - 'userid' => 'integer', - 'anon' => 'boolean' - ), - 'size' => array( - 'size' => 'integer', - 'width' => 'integer', - 'height' => 'integer', - 'pagecount' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ) - ), - 'dimensions' => array( - 'size' => 'integer', - 'width' => 'integer', - 'height' => 'integer', - 'pagecount' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ) - ), - 'comment' => array( - 'commenthidden' => 'boolean', - 'comment' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'parsedcomment' => array( - 'commenthidden' => 'boolean', - 'parsedcomment' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'canonicaltitle' => array( - 'canonicaltitle' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'url' => array( - 'filehidden' => 'boolean', - 'thumburl' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'thumbwidth' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'thumbheight' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'thumberror' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'url' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'descriptionurl' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'sha1' => array( - 'filehidden' => 'boolean', - 'sha1' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'mime' => array( - 'filehidden' => 'boolean', - 'mime' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'thumbmime' => array( - 'filehidden' => 'boolean', - 'thumbmime' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'mediatype' => array( - 'filehidden' => 'boolean', - 'mediatype' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'archivename' => array( - 'filehidden' => 'boolean', - 'archivename' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'bitdepth' => array( - 'filehidden' => 'boolean', - 'bitdepth' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ) - ), - ); - - return array_diff_key( $props, array_flip( $filter ) ); - } - - public function getResultProperties() { - return self::getResultPropertiesFiltered(); - } - public function getDescription() { return 'Returns image information and upload history.'; } - public function getPossibleErrors() { - $p = $this->getModulePrefix(); - - return array_merge( parent::getPossibleErrors(), array( - array( 'code' => "{$p}urlwidth", 'info' => "{$p}urlheight cannot be used without {$p}urlwidth" ), - array( 'code' => 'urlparam', 'info' => "Invalid value for {$p}urlparam" ), - array( 'code' => 'urlparam_no_width', 'info' => "{$p}urlparam requires {$p}urlwidth" ), - ) ); - } - public function getExamples() { return array( 'api.php?action=query&titles=File:Albert%20Einstein%20Head.jpg&prop=imageinfo', diff --git a/includes/api/ApiQueryImages.php b/includes/api/ApiQueryImages.php index 87b07782c0..9bc3abedd6 100644 --- a/includes/api/ApiQueryImages.php +++ b/includes/api/ApiQueryImages.php @@ -170,15 +170,6 @@ class ApiQueryImages extends ApiQueryGeneratorBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'ns' => 'namespace', - 'title' => 'string' - ) - ); - } - public function getDescription() { return 'Returns all images contained on the given page(s).'; } diff --git a/includes/api/ApiQueryInfo.php b/includes/api/ApiQueryInfo.php index 8b6886d4f8..be1de9385b 100644 --- a/includes/api/ApiQueryInfo.php +++ b/includes/api/ApiQueryInfo.php @@ -812,72 +812,6 @@ class ApiQueryInfo extends ApiQueryBase { ); } - public function getResultProperties() { - $props = array( - ApiBase::PROP_LIST => false, - '' => array( - 'touched' => 'timestamp', - 'lastrevid' => 'integer', - 'counter' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'length' => 'integer', - 'redirect' => 'boolean', - 'new' => 'boolean', - 'starttimestamp' => array( - ApiBase::PROP_TYPE => 'timestamp', - ApiBase::PROP_NULLABLE => true - ), - 'contentmodel' => 'string', - ), - 'watched' => array( - 'watched' => 'boolean' - ), - 'watchers' => array( - 'watchers' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ) - ), - 'notificationtimestamp' => array( - 'notificationtimestamp' => array( - ApiBase::PROP_TYPE => 'timestamp', - ApiBase::PROP_NULLABLE => true - ) - ), - 'talkid' => array( - 'talkid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ) - ), - 'subjectid' => array( - 'subjectid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ) - ), - 'url' => array( - 'fullurl' => 'string', - 'editurl' => 'string' - ), - 'readable' => array( - 'readable' => 'boolean' - ), - 'preload' => array( - 'preload' => 'string' - ), - 'displaytitle' => array( - 'displaytitle' => 'string' - ) - ); - - self::addTokenProperties( $props, $this->getTokenFunctions() ); - - return $props; - } - public function getDescription() { return 'Get basic page information such as namespace, title, last touched date, ...'; } diff --git a/includes/api/ApiQueryLangBacklinks.php b/includes/api/ApiQueryLangBacklinks.php index 13711e6c83..34842c6333 100644 --- a/includes/api/ApiQueryLangBacklinks.php +++ b/includes/api/ApiQueryLangBacklinks.php @@ -209,23 +209,6 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'pageid' => 'integer', - 'ns' => 'namespace', - 'title' => 'string', - 'redirect' => 'boolean' - ), - 'lllang' => array( - 'lllang' => 'string' - ), - 'lltitle' => array( - 'lltitle' => 'string' - ) - ); - } - public function getDescription() { return array( 'Find all pages that link to the given language link.', 'Can be used to find all links with a language code, or', @@ -235,12 +218,6 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase { ); } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'missingparam', 'lang' ), - ) ); - } - public function getExamples() { return array( 'api.php?action=query&list=langbacklinks&lbltitle=Test&lbllang=fr', diff --git a/includes/api/ApiQueryLangLinks.php b/includes/api/ApiQueryLangLinks.php index 53cfba1ec8..d04e5b4f64 100644 --- a/includes/api/ApiQueryLangLinks.php +++ b/includes/api/ApiQueryLangLinks.php @@ -191,42 +191,10 @@ class ApiQueryLangLinks extends ApiQueryBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'lang' => 'string', - 'url' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'langname' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'autonym' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - '*' => 'string' - ) - ); - } - public function getDescription() { return 'Returns all interlanguage links from the given page(s).'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), - $this->getRequireMaxOneParameterErrorMessages( - array( 'url', 'prop' ) - ), - array( - array( 'missingparam', 'lang' ), - ) - ); - } - public function getExamples() { return array( 'api.php?action=query&prop=langlinks&titles=Main%20Page&redirects=' diff --git a/includes/api/ApiQueryLinks.php b/includes/api/ApiQueryLinks.php index 7c17938193..71329c4d41 100644 --- a/includes/api/ApiQueryLinks.php +++ b/includes/api/ApiQueryLinks.php @@ -223,15 +223,6 @@ class ApiQueryLinks extends ApiQueryGeneratorBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'ns' => 'namespace', - 'title' => 'string' - ) - ); - } - public function getDescription() { return "Returns all {$this->description}s from the given page(s)."; } diff --git a/includes/api/ApiQueryLogEvents.php b/includes/api/ApiQueryLogEvents.php index 7cd8aacd19..d3607e111c 100644 --- a/includes/api/ApiQueryLogEvents.php +++ b/includes/api/ApiQueryLogEvents.php @@ -566,80 +566,10 @@ class ApiQueryLogEvents extends ApiQueryBase { ); } - public function getResultProperties() { - return array( - 'ids' => array( - 'logid' => 'integer', - 'pageid' => 'integer' - ), - 'title' => array( - 'ns' => 'namespace', - 'title' => 'string' - ), - 'type' => array( - 'type' => array( - ApiBase::PROP_TYPE => $this->getConfig()->get( 'LogTypes' ) - ), - 'action' => 'string' - ), - 'details' => array( - 'actionhidden' => 'boolean' - ), - 'user' => array( - 'userhidden' => 'boolean', - 'user' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'anon' => 'boolean' - ), - 'userid' => array( - 'userhidden' => 'boolean', - 'userid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'anon' => 'boolean' - ), - 'timestamp' => array( - 'timestamp' => 'timestamp' - ), - 'comment' => array( - 'commenthidden' => 'boolean', - 'comment' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'parsedcomment' => array( - 'commenthidden' => 'boolean', - 'parsedcomment' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ) - ); - } - public function getDescription() { return 'Get events from logs.'; } - public function getPossibleErrors() { - return array_merge( - parent::getPossibleErrors(), - $this->getRequireMaxOneParameterErrorMessages( - array( 'title', 'prefix', 'namespace' ) ), - array( - array( 'code' => 'param_user', 'info' => 'User name $user not found' ), - array( 'code' => 'param_title', 'info' => 'Bad title value \'title\'' ), - array( 'code' => 'param_prefix', 'info' => 'Bad title value \'prefix\'' ), - array( 'code' => 'prefixsearchdisabled', - 'info' => 'Prefix search disabled in Miser Mode' ), - ) - ); - } - public function getExamples() { return array( 'api.php?action=query&list=logevents' diff --git a/includes/api/ApiQueryProtectedTitles.php b/includes/api/ApiQueryProtectedTitles.php index 2cc18c5985..4c88be7a9d 100644 --- a/includes/api/ApiQueryProtectedTitles.php +++ b/includes/api/ApiQueryProtectedTitles.php @@ -243,42 +243,6 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'ns' => 'namespace', - 'title' => 'string' - ), - 'timestamp' => array( - 'timestamp' => 'timestamp' - ), - 'user' => array( - 'user' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'userid' => 'integer' - ), - 'userid' => array( - 'userid' => 'integer' - ), - 'comment' => array( - 'comment' => 'string' - ), - 'parsedcomment' => array( - 'parsedcomment' => 'string' - ), - 'expiry' => array( - 'expiry' => 'timestamp' - ), - 'level' => array( - 'level' => array( - ApiBase::PROP_TYPE => array_diff( $this->getConfig()->get( 'RestrictionLevels' ), array( '' ) ) - ) - ) - ); - } - public function getDescription() { return 'List all titles protected from creation.'; } diff --git a/includes/api/ApiQueryQueryPage.php b/includes/api/ApiQueryQueryPage.php index 1a7f826a79..5ddd94508c 100644 --- a/includes/api/ApiQueryQueryPage.php +++ b/includes/api/ApiQueryQueryPage.php @@ -163,48 +163,10 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase { ); } - public function getResultProperties() { - return array( - ApiBase::PROP_ROOT => array( - 'name' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => false - ), - 'disabled' => array( - ApiBase::PROP_TYPE => 'boolean', - ApiBase::PROP_NULLABLE => false - ), - 'cached' => array( - ApiBase::PROP_TYPE => 'boolean', - ApiBase::PROP_NULLABLE => false - ), - 'cachedtimestamp' => array( - ApiBase::PROP_TYPE => 'timestamp', - ApiBase::PROP_NULLABLE => true - ) - ), - '' => array( - 'value' => 'string', - 'timestamp' => array( - ApiBase::PROP_TYPE => 'timestamp', - ApiBase::PROP_NULLABLE => true - ), - 'ns' => 'namespace', - 'title' => 'string' - ) - ); - } - public function getDescription() { return 'Get a list provided by a QueryPage-based special page.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'specialpage-cantexecute' ) - ) ); - } - public function getExamples() { return array( 'api.php?action=query&list=querypage&qppage=Ancientpages' diff --git a/includes/api/ApiQueryRandom.php b/includes/api/ApiQueryRandom.php index 07f8a0e405..530557e6c4 100644 --- a/includes/api/ApiQueryRandom.php +++ b/includes/api/ApiQueryRandom.php @@ -173,16 +173,6 @@ class ApiQueryRandom extends ApiQueryGeneratorBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'id' => 'integer', - 'ns' => 'namespace', - 'title' => 'string' - ) - ); - } - public function getDescription() { return array( 'Get a set of random pages.', diff --git a/includes/api/ApiQueryRecentChanges.php b/includes/api/ApiQueryRecentChanges.php index cb4e3e8389..8ce6b55cba 100644 --- a/includes/api/ApiQueryRecentChanges.php +++ b/includes/api/ApiQueryRecentChanges.php @@ -737,122 +737,10 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase { ); } - public function getResultProperties() { - $props = array( - '' => array( - 'type' => array( - ApiBase::PROP_TYPE => array( - 'edit', - 'new', - 'move', - 'log', - 'move over redirect' - ) - ) - ), - 'title' => array( - 'ns' => 'namespace', - 'title' => 'string', - 'new_ns' => array( - ApiBase::PROP_TYPE => 'namespace', - ApiBase::PROP_NULLABLE => true - ), - 'new_title' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'ids' => array( - 'rcid' => 'integer', - 'pageid' => 'integer', - 'revid' => 'integer', - 'old_revid' => 'integer' - ), - 'user' => array( - 'user' => 'string', - 'anon' => 'boolean' - ), - 'userid' => array( - 'userid' => 'integer', - 'anon' => 'boolean' - ), - 'flags' => array( - 'bot' => 'boolean', - 'new' => 'boolean', - 'minor' => 'boolean' - ), - 'sizes' => array( - 'oldlen' => 'integer', - 'newlen' => 'integer' - ), - 'timestamp' => array( - 'timestamp' => 'timestamp' - ), - 'comment' => array( - 'comment' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'parsedcomment' => array( - 'parsedcomment' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'redirect' => array( - 'redirect' => 'boolean' - ), - 'patrolled' => array( - 'patrolled' => 'boolean', - 'unpatrolled' => 'boolean' - ), - 'loginfo' => array( - 'logid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'logtype' => array( - ApiBase::PROP_TYPE => $this->getConfig()->get( 'LogTypes' ), - ApiBase::PROP_NULLABLE => true - ), - 'logaction' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'sha1' => array( - 'sha1' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'sha1hidden' => array( - ApiBase::PROP_TYPE => 'boolean', - ApiBase::PROP_NULLABLE => true - ), - ), - ); - - self::addTokenProperties( $props, $this->getTokenFunctions() ); - - return $props; - } - public function getDescription() { return 'Enumerate recent changes.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'show' ), - array( - 'code' => 'permissiondenied', - 'info' => 'You need the patrol right to request the patrolled flag' - ), - array( 'code' => 'user-excludeuser', 'info' => 'user and excludeuser cannot be used together' ), - ) ); - } - public function getExamples() { return array( 'api.php?action=query&list=recentchanges' diff --git a/includes/api/ApiQueryRevisions.php b/includes/api/ApiQueryRevisions.php index 582f61e33b..627de55623 100644 --- a/includes/api/ApiQueryRevisions.php +++ b/includes/api/ApiQueryRevisions.php @@ -807,70 +807,6 @@ class ApiQueryRevisions extends ApiQueryBase { ); } - public function getResultProperties() { - $props = array( - '' => array(), - 'ids' => array( - 'revid' => 'integer', - 'parentid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ) - ), - 'flags' => array( - 'minor' => 'boolean' - ), - 'user' => array( - 'userhidden' => 'boolean', - 'user' => 'string', - 'anon' => 'boolean' - ), - 'userid' => array( - 'userhidden' => 'boolean', - 'userid' => 'integer', - 'anon' => 'boolean' - ), - 'timestamp' => array( - 'timestamp' => 'timestamp' - ), - 'size' => array( - 'size' => 'integer' - ), - 'sha1' => array( - 'sha1' => 'string' - ), - 'comment' => array( - 'commenthidden' => 'boolean', - 'comment' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'parsedcomment' => array( - 'commenthidden' => 'boolean', - 'parsedcomment' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'content' => array( - '*' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'texthidden' => 'boolean', - 'textmissing' => 'boolean', - ), - 'contentmodel' => array( - 'contentmodel' => 'string' - ), - ); - - self::addTokenProperties( $props, $this->getTokenFunctions() ); - - return $props; - } - public function getDescription() { return array( 'Get revision information.', @@ -882,33 +818,6 @@ class ApiQueryRevisions extends ApiQueryBase { ); } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'nosuchrevid', 'diffto' ), - array( - 'code' => 'revids', - 'info' => 'The revids= parameter may not be used with the list options ' - . '(limit, startid, endid, dirNewer, start, end).' - ), - array( - 'code' => 'multpages', - 'info' => 'titles, pageids or a generator was used to supply multiple pages, ' - . ' but the limit, startid, endid, dirNewer, user, excludeuser, ' - . 'start and end parameters may only be used on a single page.' - ), - array( - 'code' => 'diffto', - 'info' => 'rvdiffto must be set to a non-negative number, "prev", "next" or "cur"' - ), - array( 'code' => 'badparams', 'info' => 'start and startid cannot be used together' ), - array( 'code' => 'badparams', 'info' => 'end and endid cannot be used together' ), - array( 'code' => 'badparams', 'info' => 'user and excludeuser cannot be used together' ), - array( 'code' => 'nosuchsection', 'info' => 'There is no section section in rID' ), - array( 'code' => 'badformat', 'info' => 'The requested serialization format can not be applied ' - . ' to the page\'s content model' ), - ) ); - } - public function getExamples() { return array( 'Get data with content for the last revision of titles "API" and "Main Page"', diff --git a/includes/api/ApiQuerySearch.php b/includes/api/ApiQuerySearch.php index 1c411134d8..6bf261281f 100644 --- a/includes/api/ApiQuerySearch.php +++ b/includes/api/ApiQuerySearch.php @@ -157,9 +157,6 @@ class ApiQuerySearch extends ApiQueryGeneratorBase { if ( isset( $prop['timestamp'] ) ) { $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $result->getTimestamp() ); } - if ( !is_null( $result->getScore() ) && isset( $prop['score'] ) ) { - $vals['score'] = $result->getScore(); - } if ( isset( $prop['titlesnippet'] ) ) { $vals['titlesnippet'] = $result->getTitleSnippet( $terms ); } @@ -357,75 +354,10 @@ class ApiQuerySearch extends ApiQueryGeneratorBase { return $descriptions; } - public function getResultProperties() { - return array( - '' => array( - 'ns' => 'namespace', - 'title' => 'string' - ), - 'snippet' => array( - 'snippet' => 'string' - ), - 'size' => array( - 'size' => 'integer' - ), - 'wordcount' => array( - 'wordcount' => 'integer' - ), - 'timestamp' => array( - 'timestamp' => 'timestamp' - ), - 'score' => array( - 'score' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'titlesnippet' => array( - 'titlesnippet' => 'string' - ), - 'redirecttitle' => array( - 'redirecttitle' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'redirectsnippet' => array( - 'redirectsnippet' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'sectiontitle' => array( - 'sectiontitle' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'sectionsnippet' => array( - 'sectionsnippet' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'hasrelated' => array( - 'hasrelated' => 'boolean' - ) - ); - } - public function getDescription() { return 'Perform a full text search.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'code' => 'search-text-disabled', 'info' => 'text search is disabled' ), - array( 'code' => 'search-title-disabled', 'info' => 'title search is disabled' ), - array( 'code' => 'search-error', 'info' => 'search error has occurred' ), - ) ); - } - public function getExamples() { return array( 'api.php?action=query&list=search&srsearch=meaning', diff --git a/includes/api/ApiQuerySiteinfo.php b/includes/api/ApiQuerySiteinfo.php index 30201fc29e..818080c181 100644 --- a/includes/api/ApiQuerySiteinfo.php +++ b/includes/api/ApiQuerySiteinfo.php @@ -862,13 +862,6 @@ class ApiQuerySiteinfo extends ApiQueryBase { return 'Return general information about the site.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( array( - 'code' => 'includeAllDenied', - 'info' => 'Cannot view all servers info unless $wgShowHostnames is true' - ), ) ); - } - public function getExamples() { return array( 'api.php?action=query&meta=siteinfo&siprop=general|namespaces|namespacealiases|statistics', diff --git a/includes/api/ApiQueryStashImageInfo.php b/includes/api/ApiQueryStashImageInfo.php index d9409ec46e..d7904d4ad9 100644 --- a/includes/api/ApiQueryStashImageInfo.php +++ b/includes/api/ApiQueryStashImageInfo.php @@ -124,10 +124,6 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo { ); } - public function getResultProperties() { - return ApiQueryImageInfo::getResultPropertiesFiltered( $this->propertyFilter ); - } - public function getDescription() { return 'Returns image information for stashed images.'; } diff --git a/includes/api/ApiQueryTags.php b/includes/api/ApiQueryTags.php index 77c105aeda..3184564845 100644 --- a/includes/api/ApiQueryTags.php +++ b/includes/api/ApiQueryTags.php @@ -170,23 +170,6 @@ class ApiQueryTags extends ApiQueryBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'name' => 'string' - ), - 'displayname' => array( - 'displayname' => 'string' - ), - 'description' => array( - 'description' => 'string' - ), - 'hitcount' => array( - 'hitcount' => 'integer' - ) - ); - } - public function getDescription() { return 'List change tags.'; } diff --git a/includes/api/ApiQueryUserContributions.php b/includes/api/ApiQueryUserContributions.php index 29d03001c7..b8b4e3156e 100644 --- a/includes/api/ApiQueryUserContributions.php +++ b/includes/api/ApiQueryUserContributions.php @@ -555,81 +555,10 @@ class ApiQueryContributions extends ApiQueryBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'userid' => 'integer', - 'user' => 'string', - 'userhidden' => 'boolean' - ), - 'ids' => array( - 'pageid' => 'integer', - 'revid' => 'integer', - 'parentid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ) - ), - 'title' => array( - 'ns' => 'namespace', - 'title' => 'string' - ), - 'timestamp' => array( - 'timestamp' => 'timestamp' - ), - 'flags' => array( - 'new' => 'boolean', - 'minor' => 'boolean', - 'top' => 'boolean' - ), - 'comment' => array( - 'commenthidden' => 'boolean', - 'comment' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'parsedcomment' => array( - 'commenthidden' => 'boolean', - 'parsedcomment' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'patrolled' => array( - 'patrolled' => 'boolean' - ), - 'size' => array( - 'size' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ) - ), - 'sizediff' => array( - 'sizediff' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ) - ) - ); - } - public function getDescription() { return 'Get all edits by a user.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'code' => 'param_user', 'info' => 'User parameter may not be empty.' ), - array( 'code' => 'param_user', 'info' => 'User name user is not valid' ), - array( 'show' ), - array( - 'code' => 'permissiondenied', - 'info' => 'You need the patrol right to request the patrolled flag' - ), - ) ); - } - public function getExamples() { return array( 'api.php?action=query&list=usercontribs&ucuser=YurikBot', diff --git a/includes/api/ApiQueryUserInfo.php b/includes/api/ApiQueryUserInfo.php index 140f35a832..6d70241049 100644 --- a/includes/api/ApiQueryUserInfo.php +++ b/includes/api/ApiQueryUserInfo.php @@ -267,63 +267,6 @@ class ApiQueryUserInfo extends ApiQueryBase { ); } - public function getResultProperties() { - return array( - ApiBase::PROP_LIST => false, - '' => array( - 'id' => 'integer', - 'name' => 'string', - 'anon' => 'boolean' - ), - 'blockinfo' => array( - 'blockid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'blockedby' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'blockedbyid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'blockedreason' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'hasmsg' => array( - 'messages' => 'boolean' - ), - 'preferencestoken' => array( - 'preferencestoken' => 'string' - ), - 'editcount' => array( - 'editcount' => 'integer' - ), - 'realname' => array( - 'realname' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'email' => array( - 'email' => 'string', - 'emailauthenticated' => array( - ApiBase::PROP_TYPE => 'timestamp', - ApiBase::PROP_NULLABLE => true - ) - ), - 'registrationdate' => array( - 'registrationdate' => array( - ApiBase::PROP_TYPE => 'timestamp', - ApiBase::PROP_NULLABLE => true - ) - ) - ); - } - public function getDescription() { return 'Get information about the current user.'; } diff --git a/includes/api/ApiQueryUsers.php b/includes/api/ApiQueryUsers.php index d0d0f08223..84326a2950 100644 --- a/includes/api/ApiQueryUsers.php +++ b/includes/api/ApiQueryUsers.php @@ -342,73 +342,6 @@ class ApiQueryUsers extends ApiQueryBase { ); } - public function getResultProperties() { - $props = array( - '' => array( - 'userid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'name' => 'string', - 'invalid' => 'boolean', - 'hidden' => 'boolean', - 'interwiki' => 'boolean', - 'missing' => 'boolean' - ), - 'editcount' => array( - 'editcount' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ) - ), - 'registration' => array( - 'registration' => array( - ApiBase::PROP_TYPE => 'timestamp', - ApiBase::PROP_NULLABLE => true - ) - ), - 'blockinfo' => array( - 'blockid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'blockedby' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'blockedbyid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'blockedreason' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'blockedexpiry' => array( - ApiBase::PROP_TYPE => 'timestamp', - ApiBase::PROP_NULLABLE => true - ) - ), - 'emailable' => array( - 'emailable' => 'boolean' - ), - 'gender' => array( - 'gender' => array( - ApiBase::PROP_TYPE => array( - 'male', - 'female', - 'unknown' - ), - ApiBase::PROP_NULLABLE => true - ) - ) - ); - - self::addTokenProperties( $props, $this->getTokenFunctions() ); - - return $props; - } - public function getDescription() { return 'Get information about a list of users.'; } diff --git a/includes/api/ApiQueryWatchlist.php b/includes/api/ApiQueryWatchlist.php index b1b84d87b1..efbe05ee65 100644 --- a/includes/api/ApiQueryWatchlist.php +++ b/includes/api/ApiQueryWatchlist.php @@ -561,109 +561,10 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'type' => array( - ApiBase::PROP_TYPE => array( - 'edit', - 'new', - 'move', - 'log', - 'move over redirect' - ) - ) - ), - 'ids' => array( - 'pageid' => 'integer', - 'revid' => 'integer', - 'old_revid' => 'integer' - ), - 'title' => array( - 'ns' => 'namespace', - 'title' => 'string' - ), - 'user' => array( - 'user' => 'string', - 'anon' => 'boolean' - ), - 'userid' => array( - 'userid' => 'integer', - 'anon' => 'boolean' - ), - 'flags' => array( - 'new' => 'boolean', - 'minor' => 'boolean', - 'bot' => 'boolean' - ), - 'patrol' => array( - 'patrolled' => 'boolean' - ), - 'timestamp' => array( - 'timestamp' => 'timestamp' - ), - 'sizes' => array( - 'oldlen' => 'integer', - 'newlen' => 'integer' - ), - 'notificationtimestamp' => array( - 'notificationtimestamp' => array( - ApiBase::PROP_TYPE => 'timestamp', - ApiBase::PROP_NULLABLE => true - ) - ), - 'comment' => array( - 'comment' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'parsedcomment' => array( - 'parsedcomment' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'loginfo' => array( - 'logid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'logtype' => array( - ApiBase::PROP_TYPE => $this->getConfig()->get( 'LogTypes' ), - ApiBase::PROP_NULLABLE => true - ), - 'logaction' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ) - ); - } - public function getDescription() { return "Get all recent changes to pages in the logged in user's watchlist."; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'code' => 'bad_wlowner', 'info' => 'Specified user does not exist' ), - array( - 'code' => 'bad_wltoken', - 'info' => 'Incorrect watchlist token provided -- ' . - 'please set a correct token in Special:Preferences' - ), - array( 'code' => 'notloggedin', 'info' => 'You must be logged-in to have a watchlist' ), - array( 'code' => 'patrol', 'info' => 'patrol property is not available' ), - array( 'show' ), - array( - 'code' => 'permissiondenied', - 'info' => 'You need the patrol right to request the patrolled flag' - ), - array( 'code' => 'user-excludeuser', 'info' => 'user and excludeuser cannot be used together' ), - ) ); - } - public function getExamples() { return array( 'api.php?action=query&list=watchlist', diff --git a/includes/api/ApiQueryWatchlistRaw.php b/includes/api/ApiQueryWatchlistRaw.php index 6aae6dc33f..6b2223ac87 100644 --- a/includes/api/ApiQueryWatchlistRaw.php +++ b/includes/api/ApiQueryWatchlistRaw.php @@ -189,38 +189,10 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'ns' => 'namespace', - 'title' => 'string' - ), - 'changed' => array( - 'changed' => array( - ApiBase::PROP_TYPE => 'timestamp', - ApiBase::PROP_NULLABLE => true - ) - ) - ); - } - public function getDescription() { return "Get all pages on the logged in user's watchlist."; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'code' => 'notloggedin', 'info' => 'You must be logged-in to have a watchlist' ), - array( 'show' ), - array( 'code' => 'bad_wlowner', 'info' => 'Specified user does not exist' ), - array( - 'code' => 'bad_wltoken', - 'info' => 'Incorrect watchlist token provided -- ' . - 'please set a correct token in Special:Preferences' - ), - ) ); - } - public function getExamples() { return array( 'api.php?action=query&list=watchlistraw', diff --git a/includes/api/ApiRevisionDelete.php b/includes/api/ApiRevisionDelete.php index 2c76f371ee..07a1a452b1 100644 --- a/includes/api/ApiRevisionDelete.php +++ b/includes/api/ApiRevisionDelete.php @@ -220,16 +220,6 @@ class ApiRevisionDelete extends ApiBase { return 'Delete/undelete revisions.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), - array( - array( 'code' => 'needtarget', - 'info' => 'A target title is required for this RevDel type' ), - array( 'code' => 'badparams', 'info' => 'Bad value for some parameter' ), - ) - ); - } - public function needsToken() { return true; } diff --git a/includes/api/ApiRollback.php b/includes/api/ApiRollback.php index 1bba715448..af6f9ffeef 100644 --- a/includes/api/ApiRollback.php +++ b/includes/api/ApiRollback.php @@ -134,19 +134,6 @@ class ApiRollback extends ApiBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'title' => 'string', - 'pageid' => 'integer', - 'summary' => 'string', - 'revid' => 'integer', - 'old_revid' => 'integer', - 'last_revid' => 'integer' - ) - ); - } - public function getDescription() { return array( 'Undo the last edit to the page. If the last user who edited the page made', @@ -154,19 +141,6 @@ class ApiRollback extends ApiBase { ); } - public function getPossibleErrors() { - return array_merge( - parent::getPossibleErrors(), - $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ), - array( - array( 'invalidtitle', 'title' ), - array( 'notanarticle' ), - array( 'nosuchpageid', 'pageid' ), - array( 'invaliduser', 'user' ), - ) - ); - } - public function needsToken() { return true; } diff --git a/includes/api/ApiSetNotificationTimestamp.php b/includes/api/ApiSetNotificationTimestamp.php index 04be450bb6..0433bc9c83 100644 --- a/includes/api/ApiSetNotificationTimestamp.php +++ b/includes/api/ApiSetNotificationTimestamp.php @@ -244,43 +244,6 @@ class ApiSetNotificationTimestamp extends ApiBase { ); } - public function getResultProperties() { - return array( - ApiBase::PROP_LIST => true, - ApiBase::PROP_ROOT => array( - 'notificationtimestamp' => array( - ApiBase::PROP_TYPE => 'timestamp', - ApiBase::PROP_NULLABLE => true - ) - ), - '' => array( - 'ns' => array( - ApiBase::PROP_TYPE => 'namespace', - ApiBase::PROP_NULLABLE => true - ), - 'title' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'pageid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'revid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'invalid' => 'boolean', - 'missing' => 'boolean', - 'notwatched' => 'boolean', - 'notificationtimestamp' => array( - ApiBase::PROP_TYPE => 'timestamp', - ApiBase::PROP_NULLABLE => true - ) - ) - ); - } - public function getDescription() { return array( 'Update the notification timestamp for watched pages.', 'This affects the highlighting of changed pages in the watchlist and history,', @@ -289,25 +252,6 @@ class ApiSetNotificationTimestamp extends ApiBase { ); } - public function getPossibleErrors() { - $ps = $this->getPageSet(); - - return array_merge( - parent::getPossibleErrors(), - $ps->getFinalPossibleErrors(), - $this->getRequireMaxOneParameterErrorMessages( - array( 'timestamp', 'torevid', 'newerthanrevid' ) ), - $this->getRequireOnlyOneParameterErrorMessages( - array_merge( array( 'entirewatchlist' ), array_keys( $ps->getFinalParams() ) ) ), - array( - array( 'code' => 'notloggedin', 'info' - => 'Anonymous users cannot use watchlist change notifications' ), - array( 'code' => 'multpages', 'info' => 'torevid may only be used with a single page' ), - array( 'code' => 'multpages', 'info' => 'newerthanrevid may only be used with a single page' ), - ) - ); - } - public function getExamples() { return array( 'api.php?action=setnotificationtimestamp&entirewatchlist=&token=123ABC' diff --git a/includes/api/ApiTokens.php b/includes/api/ApiTokens.php index 5e197db7ce..8e2ecfbe94 100644 --- a/includes/api/ApiTokens.php +++ b/includes/api/ApiTokens.php @@ -81,16 +81,6 @@ class ApiTokens extends ApiBase { ); } - public function getResultProperties() { - $props = array( - '' => array(), - ); - - self::addTokenProperties( $props, $this->getTokenTypes() ); - - return $props; - } - public function getParamDescription() { return array( 'type' => 'Type of token(s) to request' diff --git a/includes/api/ApiUnblock.php b/includes/api/ApiUnblock.php index f34d4dfa6c..acb7ed2653 100644 --- a/includes/api/ApiUnblock.php +++ b/includes/api/ApiUnblock.php @@ -107,43 +107,10 @@ class ApiUnblock extends ApiBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'id' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'user' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'userid' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'reason' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ) - ); - } - public function getDescription() { return 'Unblock a user.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'unblock-notarget' ), - array( 'unblock-idanduser' ), - array( 'cantunblock' ), - array( 'ipbblocked' ), - array( 'ipbnounblockself' ), - ) ); - } - public function needsToken() { return true; } diff --git a/includes/api/ApiUndelete.php b/includes/api/ApiUndelete.php index 7d6a7e42d3..df245cdeb3 100644 --- a/includes/api/ApiUndelete.php +++ b/includes/api/ApiUndelete.php @@ -56,7 +56,7 @@ class ApiUndelete extends ApiBase { $params['timestamps'][$i] = wfTimestamp( TS_MW, $ts ); } - $pa = new PageArchive( $titleObj ); + $pa = new PageArchive( $titleObj, $this->getConfig() ); $retval = $pa->undelete( ( isset( $params['timestamps'] ) ? $params['timestamps'] : array() ), $params['reason'], @@ -142,17 +142,6 @@ class ApiUndelete extends ApiBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'title' => 'string', - 'revisions' => 'integer', - 'filerevisions' => 'integer', - 'reason' => 'string' - ) - ); - } - public function getDescription() { return array( 'Restore certain revisions of a deleted page. A list of deleted revisions ', @@ -161,15 +150,6 @@ class ApiUndelete extends ApiBase { ); } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'permdenied-undelete' ), - array( 'blockedtext' ), - array( 'invalidtitle', 'title' ), - array( 'cannotundelete' ), - ) ); - } - public function needsToken() { return true; } diff --git a/includes/api/ApiUpload.php b/includes/api/ApiUpload.php index 5e6c962d12..2b840fe525 100644 --- a/includes/api/ApiUpload.php +++ b/includes/api/ApiUpload.php @@ -760,41 +760,6 @@ class ApiUpload extends ApiBase { return $params; } - public function getResultProperties() { - return array( - '' => array( - 'result' => array( - ApiBase::PROP_TYPE => array( - 'Success', - 'Warning', - 'Continue', - 'Queued' - ), - ), - 'filekey' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'sessionkey' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'offset' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'statuskey' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'filename' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ) - ); - } - public function getDescription() { return array( 'Upload a file, or get the status of pending uploads. Several methods are available:', @@ -806,32 +771,6 @@ class ApiUpload extends ApiBase { ); } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), - $this->getRequireOnlyOneParameterErrorMessages( array( 'filekey', 'file', 'url', 'statuskey' ) ), - array( - array( 'uploaddisabled' ), - array( 'invalid-file-key' ), - array( 'uploaddisabled' ), - array( 'mustbeloggedin', 'upload' ), - array( 'badaccess-groups' ), - array( 'code' => 'fetchfileerror', 'info' => '' ), - array( 'code' => 'nomodule', 'info' => 'No upload module set' ), - array( 'code' => 'empty-file', 'info' => 'The file you submitted was empty' ), - array( 'code' => 'filetype-missing', 'info' => 'The file is missing an extension' ), - array( 'code' => 'filename-tooshort', 'info' => 'The filename is too short' ), - array( 'code' => 'overwrite', 'info' => 'Overwriting an existing file is not allowed' ), - array( 'code' => 'stashfailed', 'info' => 'Stashing temporary file failed' ), - array( 'code' => 'publishfailed', 'info' => 'Publishing of stashed file failed' ), - array( 'code' => 'internal-error', 'info' => 'An internal error occurred' ), - array( 'code' => 'asynccopyuploaddisabled', 'info' => 'Asynchronous copy uploads disabled' ), - array( 'code' => 'stasherror', 'info' => 'An upload stash error occurred' ), - array( 'fileexists-forbidden' ), - array( 'fileexists-shared-forbidden' ), - ) - ); - } - public function needsToken() { return true; } diff --git a/includes/api/ApiWatch.php b/includes/api/ApiWatch.php index c5aa90ef26..43ff4eccf6 100644 --- a/includes/api/ApiWatch.php +++ b/includes/api/ApiWatch.php @@ -205,29 +205,10 @@ class ApiWatch extends ApiBase { ); } - public function getResultProperties() { - return array( - '' => array( - 'title' => 'string', - 'unwatched' => 'boolean', - 'watched' => 'boolean', - 'message' => 'string' - ) - ); - } - public function getDescription() { return 'Add or remove pages from/to the current user\'s watchlist.'; } - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'code' => 'notloggedin', 'info' => 'You must be logged-in to have a watchlist' ), - array( 'invalidtitle', 'title' ), - array( 'hookaborted' ), - ) ); - } - public function getExamples() { return array( 'api.php?action=watch&titles=Main_Page' => 'Watch the page "Main Page"', diff --git a/includes/cache/LocalisationCache.php b/includes/cache/LocalisationCache.php index cf87129732..c0c5977d1e 100644 --- a/includes/cache/LocalisationCache.php +++ b/includes/cache/LocalisationCache.php @@ -20,8 +20,6 @@ * @file */ -define( 'MW_LC_VERSION', 2 ); - /** * Class for caching the contents of localisation files, Messages*.php * and *.i18n.php. @@ -35,6 +33,8 @@ define( 'MW_LC_VERSION', 2 ); * as grammatical transformation, is done by the caller. */ class LocalisationCache { + const VERSION = 2; + /** Configuration associative array */ private $conf; @@ -773,7 +773,7 @@ class LocalisationCache { * * Returns true if any data from the extension array was used, false * otherwise. - * @param string $codeSequence + * @param array $codeSequence * @param string $key * @param mixed $value * @param mixed $fallbackValue @@ -913,7 +913,7 @@ class LocalisationCache { # Add cache dependencies for any referenced globals $deps['wgExtensionMessagesFiles'] = new GlobalDependency( 'wgExtensionMessagesFiles' ); $deps['wgMessagesDirs'] = new GlobalDependency( 'wgMessagesDirs' ); - $deps['version'] = new ConstantDependency( 'MW_LC_VERSION' ); + $deps['version'] = new ConstantDependency( 'LocalisationCache::VERSION' ); # Add dependencies to the cache entry $allData['deps'] = $deps; diff --git a/includes/changes/ChangesList.php b/includes/changes/ChangesList.php index cd43f82934..9b9c1029cf 100644 --- a/includes/changes/ChangesList.php +++ b/includes/changes/ChangesList.php @@ -438,8 +438,6 @@ class ChangesList extends ContextSource { } else { return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle() ); } - - return ''; } /** diff --git a/includes/content/JSONContent.php b/includes/content/JSONContent.php new file mode 100644 index 0000000000..377d67501f --- /dev/null +++ b/includes/content/JSONContent.php @@ -0,0 +1,120 @@ + + * @author Kunal Mehta + */ + +/** + * Represents the content of a JSON content. + * @since 1.24 + */ +class JSONContent extends TextContent { + + public function __construct( $text, $modelId = CONTENT_MODEL_JSON ) { + parent::__construct( $text, $modelId ); + } + + /** + * Decodes the JSON into a PHP associative array. + * @return array + */ + public function getJsonData() { + return FormatJson::decode( $this->getNativeData(), true ); + } + + /** + * @return bool Whether content is valid JSON. + */ + public function isValid() { + return $this->getJsonData() !== null; + } + + /** + * Pretty-print JSON + * + * @return bool|null|string + */ + public function beautifyJSON() { + $decoded = FormatJson::decode( $this->getNativeData(), true ); + if ( !is_array( $decoded ) ) { + return null; + } + return FormatJson::encode( $decoded, true ); + + } + + /** + * Beautifies JSON prior to save. + * @param Title $title Title + * @param User $user User + * @param ParserOptions $popts + * @return JSONContent + */ + public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) { + return new static( $this->beautifyJSON() ); + } + + /** + * Set the HTML and add the appropriate styles + * + * + * @param Title $title + * @param int $revId + * @param ParserOptions $options + * @param bool $generateHtml + * @param ParserOutput $output + */ + protected function fillParserOutput( Title $title, $revId, + ParserOptions $options, $generateHtml, ParserOutput &$output + ) { + if ( $generateHtml ) { + $output->setText( $this->objectTable( $this->getJsonData() ) ); + $output->addModuleStyles( 'mediawiki.content.json' ); + } else { + $output->setText( '' ); + } + } + /** + * Constructs an HTML representation of a JSON object. + * @param Array $mapping + * @return string HTML. + */ + protected function objectTable( $mapping ) { + $rows = array(); + + foreach ( $mapping as $key => $val ) { + $rows[] = $this->objectRow( $key, $val ); + } + return Xml::tags( 'table', array( 'class' => 'mw-json' ), + Xml::tags( 'tbody', array(), join( "\n", $rows ) ) + ); + } + + /** + * Constructs HTML representation of a single key-value pair. + * @param string $key + * @param mixed $val + * @return string HTML. + */ + protected function objectRow( $key, $val ) { + $th = Xml::elementClean( 'th', array(), $key ); + if ( is_array( $val ) ) { + $td = Xml::tags( 'td', array(), self::objectTable( $val ) ); + } else { + if ( is_string( $val ) ) { + $val = '"' . $val . '"'; + } else { + $val = FormatJson::encode( $val ); + } + + $td = Xml::elementClean( 'td', array( 'class' => 'value' ), $val ); + } + + return Xml::tags( 'tr', array(), $th . $td ); + } + +} diff --git a/includes/content/JSONContentHandler.php b/includes/content/JSONContentHandler.php new file mode 100644 index 0000000000..9d001da1c8 --- /dev/null +++ b/includes/content/JSONContentHandler.php @@ -0,0 +1,58 @@ + + * @author Kunal Mehta + */ + +/** + * @since 1.24 + */ +class JSONContentHandler extends TextContentHandler { + + /** + * The class name of objects that should be created + * + * @var string + */ + protected $contentClass = 'JSONContent'; + + public function __construct( $modelId = CONTENT_MODEL_JSON ) { + parent::__construct( $modelId, array( CONTENT_FORMAT_JSON ) ); + } + + /** + * Unserializes a JSONContent object. + * + * @param string $text Serialized form of the content + * @param null|string $format The format used for serialization + * + * @return JSONContent + */ + public function unserializeContent( $text, $format = null ) { + $this->checkFormat( $format ); + return new $this->contentClass( $text ); + } + + /** + * Creates an empty JSONContent object. + * + * @return JSONContent + */ + public function makeEmptyContent() { + return new $this->contentClass( '' ); + } + + /** JSON is English **/ + public function getPageLanguage( Title $title, Content $content = null ) { + return wfGetLangObj( 'en' ); + } + + /** JSON is English **/ + public function getPageViewLanguage( Title $title, Content $content = null ) { + return wfGetLangObj( 'en' ); + } +} diff --git a/includes/context/RequestContext.php b/includes/context/RequestContext.php index 2c051baa7a..8ab1122e83 100644 --- a/includes/context/RequestContext.php +++ b/includes/context/RequestContext.php @@ -297,13 +297,12 @@ class RequestContext implements IContextSource { $e = new Exception; wfDebugLog( 'recursion-guard', "Recursion detected:\n" . $e->getTraceAsString() ); - global $wgLanguageCode; - $code = ( $wgLanguageCode ) ? $wgLanguageCode : 'en'; + $code = $this->getConfig()->get( 'LanguageCode' ) ? : 'en'; $this->lang = Language::factory( $code ); } elseif ( $this->lang === null ) { $this->recursion = true; - global $wgLanguageCode, $wgContLang; + global $wgContLang; try { $request = $this->getRequest(); @@ -314,7 +313,7 @@ class RequestContext implements IContextSource { wfRunHooks( 'UserGetLanguageObject', array( $user, &$code, $this ) ); - if ( $code === $wgLanguageCode ) { + if ( $code === $this->getConfig()->get( 'LanguageCode' ) ) { $this->lang = $wgContLang; } else { $obj = Language::factory( $code ); @@ -353,29 +352,39 @@ class RequestContext implements IContextSource { $skin = null; wfRunHooks( 'RequestContextCreateSkin', array( $this, &$skin ) ); + $fallback = $this->getConfig()->get( 'FallbackSkin' ); + $factory = SkinFactory::getDefaultInstance(); // If the hook worked try to set a skin from it if ( $skin instanceof Skin ) { $this->skin = $skin; } elseif ( is_string( $skin ) ) { - $this->skin = Skin::newFromKey( $skin ); + try { + $this->skin = $factory->makeSkin( $skin ); + } catch ( SkinException $e ) { + $this->skin = $factory->makeSkin( $fallback ); + } + } // If this is still null (the hook didn't run or didn't work) // then go through the normal processing to load a skin if ( $this->skin === null ) { - global $wgHiddenPrefs; - if ( !in_array( 'skin', $wgHiddenPrefs ) ) { + if ( !in_array( 'skin', $this->getConfig()->get( 'HiddenPrefs' ) ) ) { # get the user skin $userSkin = $this->getUser()->getOption( 'skin' ); $userSkin = $this->getRequest()->getVal( 'useskin', $userSkin ); } else { # if we're not allowing users to override, then use the default - global $wgDefaultSkin; - $userSkin = $wgDefaultSkin; + $userSkin = $this->getConfig()->get( 'DefaultSkin' ); + } + + try { + $this->skin = $factory->makeSkin( $userSkin ); + } catch ( SkinException $e ) { + $this->skin = $factory->makeSkin( $fallback ); } - $this->skin = Skin::newFromKey( $userSkin ); } // After all that set a context on whatever skin got created diff --git a/includes/exception/UserNotLoggedIn.php b/includes/exception/UserNotLoggedIn.php index 9d89009100..03ba0b2039 100644 --- a/includes/exception/UserNotLoggedIn.php +++ b/includes/exception/UserNotLoggedIn.php @@ -19,12 +19,14 @@ */ /** - * Shows a generic "user is not logged in" error page. + * Redirect a user to the login page * * This is essentially an ErrorPageError exception which by default uses the * 'exception-nologin' as a title and 'exception-nologin-text' for the message. - * @see bug 37627 - * @since 1.20 + * + * @note In order for this exception to redirect, the error message passed to the + * constructor has to be explicitly added to LoginForm::validErrorMessages. Otherwise, + * the user will just be shown the message rather than redirected. * * @par Example: * @code @@ -43,11 +45,16 @@ * } * @endcode * + * @see bug 37627 + * @since 1.20 * @ingroup Exception */ class UserNotLoggedIn extends ErrorPageError { /** + * @note The value of the $reasonMsg parameter must be put into LoginForm::validErrorMessages + * if you want the user to be automatically redirected to the login form. + * * @param string $reasonMsg A message key containing the reason for the error. * Optional, default: 'exception-nologin-text' * @param string $titleMsg A message key to set the page title. @@ -62,4 +69,34 @@ class UserNotLoggedIn extends ErrorPageError { ) { parent::__construct( $titleMsg, $reasonMsg, $params ); } + + /** + * Redirect to Special:Userlogin if the specified message is compatible. Otherwise, + * show an error page as usual. + */ + public function report() { + // If an unsupported message is used, don't try redirecting to Special:Userlogin, + // since the message may not be compatible. + if ( !in_array( $this->msg, LoginForm::$validErrorMessages ) ) { + parent::report(); + } + + // Message is valid. Redirec to Special:Userlogin + + $context = RequestContext::getMain(); + + $output = $context->getOutput(); + $query = $context->getRequest()->getValues(); + // Title will be overridden by returnto + unset( $query['title'] ); + // Redirect to Special:Userlogin + $output->redirect( SpecialPage::getTitleFor( 'Userlogin' )->getFullURL( array( + // Return to this page when the user logs in + 'returnto' => $context->getTitle()->getFullText(), + 'returntoquery' => wfArrayToCgi( $query ), + 'warning' => $this->msg, + ) ) ); + + $output->output(); + } } diff --git a/includes/filebackend/FSFile.php b/includes/filebackend/FSFile.php index 47bacb5304..1659c62a34 100644 --- a/includes/filebackend/FSFile.php +++ b/includes/filebackend/FSFile.php @@ -118,9 +118,9 @@ class FSFile { $ext = self::extensionFromPath( $this->path ); } - # mime type according to file contents + # MIME type according to file contents $info['file-mime'] = $this->getMimeType(); - # logical mime type + # logical MIME type $info['mime'] = $magic->improveTypeFromExtension( $info['file-mime'], $ext ); list( $info['major_mime'], $info['minor_mime'] ) = File::splitMime( $info['mime'] ); diff --git a/includes/filebackend/README b/includes/filebackend/README index 569f337655..c06f6fc734 100644 --- a/includes/filebackend/README +++ b/includes/filebackend/README @@ -51,7 +51,7 @@ On files: * read a file into a string or several files into a map of path names to strings * download a file or set of files to a temporary file (on a mounted file system) * get the SHA1 hash of a file -* get various properties of a file (stat information, content time, mime information, ...) +* get various properties of a file (stat information, content time, MIME information, ...) On directories: * get a list of files directly under a directory diff --git a/includes/filerepo/file/ArchivedFile.php b/includes/filerepo/file/ArchivedFile.php index 735bf8a555..a71acdeba0 100644 --- a/includes/filerepo/file/ArchivedFile.php +++ b/includes/filerepo/file/ArchivedFile.php @@ -383,7 +383,7 @@ class ArchivedFile { } /** - * Returns the mime type of the file. + * Returns the MIME type of the file. * @return string */ public function getMimeType() { diff --git a/includes/filerepo/file/File.php b/includes/filerepo/file/File.php index c6da1f18b4..a61002aeac 100644 --- a/includes/filerepo/file/File.php +++ b/includes/filerepo/file/File.php @@ -679,7 +679,7 @@ abstract class File { } /** - * Returns the mime type of the file. + * Returns the MIME type of the file. * Overridden by LocalFile, UnregisteredLocalFile * STUB * diff --git a/includes/filerepo/file/LocalFile.php b/includes/filerepo/file/LocalFile.php index 1eff1dfec4..3ba47ff8e9 100644 --- a/includes/filerepo/file/LocalFile.php +++ b/includes/filerepo/file/LocalFile.php @@ -91,10 +91,10 @@ class LocalFile extends File { /** @var int Result of the query for the file's history (nextHistoryLine) */ private $historyRes; - /** @var string Major mime type */ + /** @var string Major MIME type */ private $major_mime; - /** @var string Minor mime type */ + /** @var string Minor MIME type */ private $minor_mime; /** @var string Upload timestamp */ @@ -784,7 +784,7 @@ class LocalFile extends File { } /** - * Returns the mime type of the file. + * Returns the MIME type of the file. * @return string */ function getMimeType() { diff --git a/includes/installer/Installer.php b/includes/installer/Installer.php index 7d7741620a..57fdab348c 100644 --- a/includes/installer/Installer.php +++ b/includes/installer/Installer.php @@ -535,6 +535,7 @@ abstract class Installer { // registration out of the global scope and into a real format. // @see https://bugzilla.wikimedia.org/67440 global $wgAutoloadClasses; + $wgAutoloadClasses = array(); wfSuppressWarnings(); $_lsExists = file_exists( "$IP/LocalSettings.php" ); diff --git a/includes/installer/i18n/be-tarask.json b/includes/installer/i18n/be-tarask.json index 79e16f1689..d7dbd2cdfa 100644 --- a/includes/installer/i18n/be-tarask.json +++ b/includes/installer/i18n/be-tarask.json @@ -280,6 +280,7 @@ "config-extensions-help": "Пашырэньні пададзеныя вышэй, былі знойдзеныя ў Вашай дырэкторыі ./extensions.\n\nЯны могуць патрабаваць дадатковых наладаў, але іх можна ўключыць зараз", "config-skins": "Тэмы афармленьня", "config-skins-help": "Пералічаныя вышэй тэмы афармленьня знойдзеныя ў вашай тэчцы ./skins. Вы мусіце ўключыць як мінімум адну, а таксама абраць тэму па змоўчаньні.", + "config-skins-use-as-default": "Выкарыстоўваць па змоўчаньні гэтую тэму афармленьня", "config-install-alreadydone": "'''Папярэджаньне:''' здаецца, што Вы ўжо ўсталёўвалі MediaWiki і спрабуеце зрабіць гэтай зноў.\nКалі ласка, перайдзіце на наступную старонку.", "config-install-begin": "Пасьля націску кнопкі «{{int:config-continue}}» пачнецца ўсталяваньне MediaWiki.\nКалі Вы жадаеце што-небудзь зьмяніць, націсьніце кнопку «{{int:config-back}}».", "config-install-step-done": "зроблена", diff --git a/includes/installer/i18n/bto.json b/includes/installer/i18n/bto.json index 39ed367655..468bcebd85 100644 --- a/includes/installer/i18n/bto.json +++ b/includes/installer/i18n/bto.json @@ -4,6 +4,7 @@ "Filipinayzd" ] }, + "config-title": "Pabutang ka MediaWiki $1", "config-information": "Impormasyon", "config-your-language": "A kanimong sarita:", "config-wiki-language": "Sarita ka Wiki:", @@ -24,12 +25,15 @@ "config-db-host-oracle": "Database ka TNS:", "config-db-wiki-settings": "Mibdiron adin wiki", "config-db-name": "Ngaran ka database:", + "config-charset-mysql5-binary": "MySQL 4.1/5.0 binary", "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8", + "config-charset-mysql4": "MySQL 4.0 backwards-compatible UTF-8", "config-db-port": "Port ka database:", "config-db-schema": "Skema para sa MediaWiki:", "config-sqlite-dir": "Direktoryo ka data sa SQLite:", "config-oracle-def-ts": "Dating tablescape:", "config-oracle-temp-ts": "Temporaryong tablescape:", + "config-type-mysql": "MySQL (o compatible)", "config-type-mssql": "Microsoft SQL Server", "config-header-mysql": "MySQL settings", "config-header-postgres": "PostgreSQL settings", @@ -38,15 +42,24 @@ "config-header-mssql": "Microsoft SQL Server settings", "config-mysql-innodb": "InnoDB", "config-mysql-myisam": "MyISAM", + "config-mysql-binary": "Binary", "config-mysql-utf8": "UTF-8", + "config-site-name": "Ngaran ka wiki", + "config-site-name-blank": "Ibutang a ngaran ka site.", + "config-project-namespace": "Bibutangan ka proyekto:", + "config-ns-generic": "Proyekto", "config-ns-other-default": "MyWiki", "config-admin-password": "Password:", "config-admin-password-confirm": "Password ulit:", "config-admin-email": "Email address:", "config-profile-wiki": "Bukas na wiki", "config-profile-private": "Pribadong wiki", + "config-license-pd": "Pampublikong Domain", + "config-email-sender": "Pabalik na email adres:", "config-logo": "URL ko logo:", "config-cc-again": "Pumili dayday...", "config-install-step-done": "tapus na", + "config-install-user-alreadyexists": "Agko na ka user na \"$1\"", + "config-install-user-create-failed": "Sala a ginigibong user na \"$1\": $2", "config-help": "tabang" } diff --git a/includes/installer/i18n/ca.json b/includes/installer/i18n/ca.json index 5d65f2d56d..3f1fcfc094 100644 --- a/includes/installer/i18n/ca.json +++ b/includes/installer/i18n/ca.json @@ -48,6 +48,7 @@ "config-env-php": "El PHP $1 està instal·lat.", "config-memory-raised": "El memory_limit del PHP és $1 i s'ha aixecat a $2.", "config-memory-bad": "Avís: El memory_limit del PHP és $1.\nAixò és probablement massa baix.\nLa instal·lació pot fallar!", + "config-apc": "L’[http://www.php.net/apc APC] està instal·lat", "config-diff3-bad": "No s'ha trobat el GNU diff3.", "config-git": "S'ha trobat el programari de control de versions Git: $1.", "config-git-bad": "No s'ha trobat el programari de control de versions Git.", @@ -107,9 +108,12 @@ "config-mysql-engine": "Motor d'emmagatzemament:", "config-mysql-innodb": "InnoDB", "config-mysql-myisam": "MyISAM", + "config-mysql-charset": "Joc de caràcters de la base de dades:", "config-mysql-binary": "Binari", "config-mysql-utf8": "UTF-8", "config-mssql-auth": "Tipus d'autenticació:", + "config-mssql-sqlauth": "Autenticació de l’SQL Server", + "config-mssql-windowsauth": "Autenticació del Windows", "config-site-name": "Nom del wiki:", "config-site-name-blank": "Introduïu un nom per al lloc.", "config-project-namespace": "Espai de noms del projecte:", @@ -161,6 +165,7 @@ "config-cache-none": "Sense encauament (no se suprimeix cap funcionalitat, però la velocitat pot veure's afectada en els llocs wiki més grans)", "config-memcached-servers": "Servidors de Memcache:", "config-extensions": "Extensions", + "config-skins": "Aparences", "config-install-step-done": "fet", "config-install-step-failed": "ha fallat", "config-install-extensions": "S'estan incloent les extensions", diff --git a/includes/installer/i18n/da.json b/includes/installer/i18n/da.json index 59eec45be9..b9de2cfb58 100644 --- a/includes/installer/i18n/da.json +++ b/includes/installer/i18n/da.json @@ -3,7 +3,8 @@ "authors": [ "Peter Alberti", "Christian List", - "Tjernobyl" + "Tjernobyl", + "Thomsen" ] }, "config-page-language": "Sprog", @@ -14,6 +15,19 @@ "config-page-name": "Navn", "config-page-options": "Indstillinger", "config-page-install": "Installer", + "config-page-complete": "Færdig!", + "config-page-restart": "Genstarte installation", + "config-page-readme": "Læs mig", + "config-page-copying": "Kopiering", + "config-page-upgradedoc": "Opgraderer", + "config-page-existingwiki": "Eksisterende wiki", + "config-help-restart": "Vil du rydde alle gemte data, du har indtastet og genstarte installationen?", + "config-restart": "Ja, genstart den", + "config-env-php": "PHP $1 er installeret.", + "config-db-type": "Databasetype:", + "config-db-host": "Databasevært:", + "config-db-name": "Databasenavn:", + "config-mysql-old": "MySQL $1 eller nyere kræves. Du har $2.", "config-header-mysql": "MySQL-indstillinger", "config-header-postgres": "PostgreSQL-indstillinger", "config-header-sqlite": "SQLite-indstillinger", diff --git a/includes/installer/i18n/ja.json b/includes/installer/i18n/ja.json index 80b8a091ec..39ebf877cf 100644 --- a/includes/installer/i18n/ja.json +++ b/includes/installer/i18n/ja.json @@ -12,7 +12,8 @@ "Yanajin66", "青子守歌", "아라", - "Shield-9" + "Shield-9", + "Takot" ] }, "config-desc": "MediaWiki のインストーラー", @@ -64,6 +65,8 @@ "config-no-db": "適切なデータベース ドライバーが見つかりませんでした! PHP にデータベース ドライバーをインストールする必要があります。\n以下の種類のデータベースに対応しています: $1\n\nPHP を自分でコンパイルした場合は、例えば ./configure --with-mysqli を実行して、データベース クライアントを使用できるように再設定してください。\nDebian または Ubuntu のパッケージから PHP をインストールした場合は、モジュール (例: php5-mysql) もインストールする必要があります。", "config-outdated-sqlite": "警告: あなたは SQLite $1 を使用していますが、最低限必要なバージョン $2 より古いバージョンです。SQLite は利用できません。", "config-no-fts3": "警告: SQLite は [//sqlite.org/fts3.html FTS3] モジュールなしでコンパイルされており、このバックエンドでは検索機能は利用できなくなります。", + "config-register-globals-error": "エラー: PHPの [http://php.net/register_globals register_globals] オプションが有効になっています。\nインストールを進めるには無効にしなければなりません。\nやり方については[https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] をご覧ください。", + "config-magic-quotes-gpc": "致命的なエラー: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] が有効になっています!\nこのオプションは予期せずしてデータ入力を破壊します。\nこのオプションを無効にするまで MediaWiki はインストールしたり使用したりはできません。", "config-magic-quotes-runtime": "致命的エラー: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] が動作しています!\nこのオプションは、予期せずデータ入力を破壊します。\nこのオプションを無効化しない限り、MediaWiki のインストールや使用はできません。", "config-magic-quotes-sybase": "致命的エラー: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] が動作しています!\nこのオプションは、予期せずデータ入力を破壊します。\nこのオプションを無効化しない限り、MediaWiki のインストールや使用はできません。", "config-mbstring": "致命的エラー: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] が動作しています!\nこのオプションは、エラーを引き起こし、予期せずデータを破壊するおそれがあります。\nこのオプションを無効化しない限り、MediaWiki のインストールや使用はできません。", @@ -74,6 +77,7 @@ "config-memory-raised": "PHPのmemory_limitは$1で、$2に引き上げられました。", "config-memory-bad": "警告: PHPのmemory_limitに$1に設定されています。\nこの値はおそらく小さすぎます。\nインストールが失敗するおそれがあります!", "config-ctype": "致命的エラー: PHP は [http://www.php.net/manual/en/ctype.installation.php Ctype 拡張モジュール]のサポート付きでコンパイルされている必要があります。", + "config-iconv": "致命的なエラー: PHPは[http://www.php.net/manual/en/iconv.installation.php iconv 拡張機能]のサポートを有効にしてコンパイルされている必要があります。", "config-json": "致命的エラー: PHP は JSON サポートなしでコンパイルされています。\nPHP に JSON 拡張モジュールまたは [http://pecl.php.net/package/jsonc PECL jsonc] 拡張モジュールをインストールしてから、MediaWiki をインストールしてください。\n* Red Hat Enterprise Linux (CentOS) 5 および 6には PHP の拡張機能が含まれているため、/etc/php.ini または /etc/php.d/json.ini から有効にしてください。\n* 2013å¹´5月以降にリリースされた一部の Linux ディストリビューションでは、PHP 拡張モジュールの代わりに、php5-json または php-pecl-jsonc として PECL が同梱されています。", "config-xcache": "[http://xcache.lighttpd.net/ XCache] がインストール済み", "config-apc": "[http://www.php.net/apc APC] がインストール済み", @@ -91,6 +95,7 @@ "config-using-server": "サーバー名「$1」を使用しています。", "config-using-uri": "サーバー URL「$1$2」を使用しています。", "config-uploads-not-safe": "警告: アップロードの既定ディレクトリ $1 に、任意のスクリプト実行に関する脆弱性があります。\nMediaWiki はアップロードされたファイルのセキュリティ上の脅威を確認しますが、アップロードを有効化する前に、[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security このセキュリティ上の脆弱性を解決する]ことを強く推奨します。", + "config-no-cli-uploads-check": "警告: アップロード用のデフォルトディレクトリ ($1) が、CLIでのインストール中に任意のスクリプト実行の脆弱性チェックを受けていません。", "config-brokenlibxml": "このシステムで使われているPHPとlibxml2のバージョンのこの組み合わせにはバグがあります。具体的には、MediaWikiやその他のウェブアプリケーションでhiddenデータが破損する可能性があります。\nlibxml2を2.7.3以降のバージョンにアップグレードしてください([//bugs.php.net/bug.php?id=45996 PHPでのバグ情報])。\nインストールを終了します。", "config-suhosin-max-value-length": "Suhosin がインストールされており、GET パラメーターの length を $1 バイトに制限しています。\nMediaWiki の ResourceLoader コンポーネントはこの制限を回避しますが、パフォーマンスは低下します。\n可能な限り、php.ini で suhosin.get.max_value_length を 1024 以上に設定し、同じ値を LocalSettings.php 内で $wgResourceLoaderMaxQueryLength に設定してください。", "config-db-type": "データベースの種類:", @@ -102,6 +107,7 @@ "config-db-name": "データベース名:", "config-db-name-help": "このウィキを識別する名前を入力してください。\n空白を含めることはできません。\n\n共有ウェブホストを利用している場合、ホスティングプロバイダーが特定の使用可能なデータベース名を提供するか、あるいは管理パネルからデータベースを作成できるようにしているでしょう。", "config-db-name-oracle": "データベースのスキーマ:", + "config-db-account-oracle-warn": "バックエンドのデータベースとして Oracle をインストールする場合、3つのシナリオが考えられます。\n\nデータベース用のアカウントをインストールのプロセス途中で作成したい場合、インストールに使うデータベース用のアカウントしては SYSDBAロール付きのアカウントを指定し、ウェブアクセス用アカウントには必要なログイン情報を指定してください。あるいは、ウェブアクセス用のアカウントを手動で作成して、そのアカウント(スキーマオブジェクトの作成のパーミッションを要求する場合)だけを使うか、二つの異なるアカウントを用意して一つは特権を付与できるもの、もう一つをウェブアクセス用の制限アカウントとしてください。\n\n要求された特権でアカウントを作成するスクリプトは、このインストール環境では、\"maintenance/oracle/\" にあります。制限アカウントを使用することは、デフォルトアカウントでのすべてのメンテナンス特権を無効にすることにご注意ください。", "config-db-install-account": "インストールで使用する利用者アカウント", "config-db-username": "データベースのユーザー名:", "config-db-password": "データベースのパスワード:", @@ -133,6 +139,7 @@ "config-type-postgres": "PostgreSQL", "config-type-sqlite": "SQLite", "config-type-oracle": "Oracle", + "config-type-mssql": "マイクロソフト SQL Server", "config-support-info": "MediaWiki は以下のデータベース システムに対応しています:\n\n$1\n\n使用しようとしているデータベース システムが下記の一覧にない場合は、上記リンク先の手順に従ってインストールしてください。", "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL]はMediaWikiの主要な対象であり、最もよくサポートされています。MediaWikiはMySQLと互換性のある[{{int:version-db-mariadb-url}} MariaDB]、[{{int:version-db-percona-url}} Percona Server]でも動きます。 ([http://www.php.net/manual/ja/mysqli.installation.php PHPをMySQLサポート付きでコンパイルする方法])", "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] は、MySQLの代替として人気があるオープンソースのデータベースシステムです。細部の未解消バグがある場合があるため、プロダクション環境での使用は推奨されません。 ([http://www.php.net/manual/en/pgsql.installation.php PHPをPostgreSQLサポート付きでコンパイルする方法])", @@ -153,6 +160,7 @@ "config-invalid-db-prefix": "「$1」は無効なデータベース接頭辞です。\n半角の英数字 (a-z、A-Z、0-9)、アンダースコア (_)、ハイフン (-) のみを使用してください。", "config-connection-error": "$1。\n\n以下のホスト名、ユーザー名、パスワードを確認してから再度試してください。", "config-invalid-schema": "「$1」は MediaWiki のスキーマとして無効です。\n半角の英数字 (a-z、A-Z、0-9)、アンダースコア (_) のみを使用してください。", + "config-db-sys-create-oracle": "インストーラーは、新規アカウント作成にはSYSDBAアカウントの利用のみをサポートしています。", "config-db-sys-user-exists-oracle": "利用者アカウント「$1」は既に存在します。SYSDBA は新しいアカウントの作成のみに使用できます!", "config-postgres-old": "PostgreSQL $1 以降が必要です。ご使用中の PostgreSQL は $2 です。", "config-mssql-old": "Microsoft SQL Server $1 以降が必要です。ご使用中の Microsoft SQL Server は $2 です。", @@ -179,6 +187,8 @@ "config-mysql-engine": "ストレージ エンジン:", "config-mysql-innodb": "InnoDB", "config-mysql-myisam": "MyISAM", + "config-mysql-myisam-dep": "警告: MySQLのストレージエンジンとして MyISAM を選択していますが、これをMediaWikiで利用するのは推奨されていません。その理由は: \n* テーブルロックによる並列性をほとんどサポートしていない\n* 他のエンジンに比べて壊れやすい\n* MediaWiki のコードベースは必ずしも MyISAM を本来あるべきほどには扱っていない\n\nあなたがインストールした MySQL が InnoDB をサポートしている場合、代わりにそちらをお使いになることを強くお勧めします。\nあなたがインストールした MySQL が InnoDB をサポートしていない場合、アップグレードした方がいいでしょう。", + "config-mysql-only-myisam-dep": "警告: MyISAM がこのマシンの MySQL の唯一のストレージエンジンですが、これをMediaWikiで利用するのは推奨されていません。その理由は: \n* テーブルロックによる並列性をほとんどサポートしていない\n* 他のエンジンに比べて壊れやすい\n* MediaWiki のコードベースは必ずしも MyISAM を本来あるべきほどには扱っていない\n\nあなたがインストールした MySQL が InnoDB をサポートしていない場合、アップグレードした方がいいでしょう。", "config-mysql-engine-help": "InnoDBは、並行処理のサポートに優れているので、ほとんどの場合において最良の選択肢です。\n\nMyISAMは、利用者が1人の場合、あるいは読み込み専用でインストールする場合に、より処理が早くなるでしょう。\nただし、MyISAMのデータベースは、InnoDBより高頻度で破損する傾向があります。", "config-mysql-charset": "データベースの文字セット:", "config-mysql-binary": "バイナリ", @@ -199,6 +209,7 @@ "config-ns-other-default": "マイウィキ", "config-project-namespace-help": "ウィキペディアの例に従い、多くのウィキは、コンテンツのページとは分離したポリシーページを「'''プロジェクトの名前空間'''」に持っています。\nこの名前空間内のページのページ名はすべて特定の接頭辞で始まります。それをここで指定できます。\n通常、この接頭辞はウィキ名に基づきますが、「#」や「:」のような区切り文字を含めることはできません。", "config-ns-invalid": "指定した名前空間「$1」は無効です。\n別のプロジェクト名前空間を指定してください。", + "config-ns-conflict": "指定された名前空間「\"$1\" 」は、MediaWikiのデフォルト名前空間と衝突しています。\n他のプロジェクト名前空間を指定してください。", "config-admin-box": "管理アカウント", "config-admin-name": "利用者名:", "config-admin-password": "パスワード:", @@ -215,6 +226,7 @@ "config-admin-error-bademail": "無効なメールアドレスを入力しました。", "config-subscribe": "[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce リリース告知のメーリングリスト]を購読する。", "config-subscribe-help": "これは、リリースの告知 (重要なセキュリティに関する案内を含む) に使用される、流量が少ないメーリングリストです。\nこのメーリングリストを購読して、新しいバージョンが出た場合にMediaWikiを更新してください。", + "config-subscribe-noemail": "メールアドレスなしでリリースアナウンスのメーリングリストを購読しようとしています。\nメーリングリストを購読する場合にはメールアドレスを入力してください。", "config-almost-done": "これでほぼ終わりました!\n残りの設定を飛ばして、ウィキを今すぐインストールできます。", "config-optional-continue": "私にもっと質問してください。", "config-optional-skip": "もう飽きてしまったので、とにかくウィキをインストールしてください。", @@ -267,12 +279,16 @@ "config-cache-memcached": "memcached を使用 (追加の設定が必要)", "config-memcached-servers": "memcached サーバー:", "config-memcached-help": "Memcachedを使用するIPアドレスの一覧。\nカンマ区切りで、利用する特定のポートの指定が必要です。例:\n127.0.0.1:11211\n192.168.1.25:1234", + "config-memcache-needservers": "キャッシュタイプに Memcached を選択しましたが、サーバーを指定していません。", + "config-memcache-badip": "Memcached用に無効な IPアドレス ($1) を入力しています。", "config-memcache-noport": "Memcached サーバー $1 で使用するポート番号を指定していません。\nポート番号が分からない場合、既定値は 11211 です。", "config-memcache-badport": "Memcached のポート番号は $1 から $2 の範囲にしてください。", "config-extensions": "拡張機能", "config-extensions-help": "./extensions ディレクトリ内で、上に列挙した拡張機能を検出しました。\n\nこれらの拡張機能には追加の設定が必要な場合がありますが、今すぐ有効化できます。", "config-skins": "外装", + "config-skins-help": "以上に挙げたスキンは./skinsで検出されたものです。\n少なくともひとつを有効にして、デフォルトを選択してください。", "config-skins-use-as-default": "この外装をデフォルトとして使う", + "config-skins-missing": "外装が見つかりませんでした。適切なものをいくつかインストールするまで、MediaWikiはフォールバック外装を使用します。", "config-skins-must-enable-some": "少なくとも1つの有効化する外装を選択する必要があります。", "config-skins-must-enable-default": "デフォルトとして選択された外装は有効である必要があります。", "config-install-alreadydone": "警告: 既にMediaWikiがインストール済みで、再びインストールし直そうとしています。\n次のページへ進んでください。", @@ -285,7 +301,10 @@ "config-install-pg-schema-not-exist": "PostgreSQL スキーマがありません。", "config-install-pg-schema-failed": "テーブルの作成に失敗しました。\n利用者「$1」がスキーマ「$2」に書き込めるようにしてください。", "config-install-pg-commit": "変更を送信", + "config-install-pg-plpgsql": "PL/pgSQLの言語をチェックしています", "config-pg-no-plpgsql": "データベース $1 内に PL/pgSQL 言語をインストールする必要があります。", + "config-pg-no-create-privs": "インストール用に指定したアカウントには、アカウントを作成するのに十分な特権がありません。", + "config-pg-not-in-role": "ウェブユーザー用に指定したアカウントはすでに存在しています。\nインストール用に指定したアカウントはスーパーユーザーでなく、またウェブユーザーのロールを持ったものでもありません。そのためウェブユーザーが所有するオブジェクトを作成することができません。\n\nMediaWikiは現状では、ウェブユーザーが所有するテーブルを要求します。別のウェブアカウント名を指定するか、「戻る」をクリックして適切な権限を持つインストール用ユーザーを指定してください。", "config-install-user": "データベースユーザーの作成", "config-install-user-alreadyexists": "ユーザー「$1」は既に存在します", "config-install-user-create-failed": "ユーザー「$1」の作成に失敗しました: $2", @@ -300,15 +319,19 @@ "config-install-interwiki-exists": "警告: ウィキ間テーブルは既に登録されているようです。\n既定のテーブルを無視します。", "config-install-stats": "統計情報の初期化", "config-install-keys": "秘密鍵の生成", + "config-insecure-keys": "警告: インストール中に生成されたセキュアキー ($1) は完璧に安全ではありません。手動で変更することを検討してください。", "config-install-sysop": "管理者のアカウントの作成", + "config-install-subscribe-fail": "mediawiki-announce を購読できませんでした: $1", "config-install-subscribe-notpossible": "cURL がインストールされていないため、allow_url_fopen を利用できません。", "config-install-mainpage": "メインページを既定の内容で作成", + "config-install-extension-tables": "有効にした拡張機能のためのテーブルを作成しています", "config-install-mainpage-failed": "メインページを挿入できませんでした: $1", "config-install-done": "おめでとうございます!\nMediaWikiのインストールに成功しました。\n\nLocalSettings.phpファイルが生成されました。\nこのファイルはすべての設定を含んでいます。\n\nこれをダウンロードして、ウィキをインストールした基準ディレクトリ (index.phpと同じディレクトリ) に設置する必要があります。ダウンロードは自動的に開始されるはずです。\n\nダウンロードが開始されていない場合、またはダウンロードをキャンセルした場合は、下記のリンクをクリックしてダウンロードを再開できます:\n\n$3\n\n注意: この生成された設定ファイルをダウンロードせずにインストールを終了すると、このファイルは利用できなくなります。\n\n上記の作業が完了すると、[$2 ウィキに入る]ことができます。", "config-download-localsettings": "LocalSettings.php をダウンロード", "config-help": "ヘルプ", "config-help-tooltip": "クリックで展開", "config-nofile": "ファイル「$1」が見つかりませんでした。削除された可能性があります。", + "config-extension-link": "あなたのウィキは[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 拡張機能]をサポートしていることをご存知ですか?\n\n[//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category カテゴリ別で拡張機能を見る]か[//www.mediawiki.org/wiki/Extension_Matrix 拡張機能のマトリックス]で拡張機能すべてのリストをご覧になれます。", "mainpagetext": "MediaWiki のインストールに成功しました。", "mainpagedocfooter": "ウィキソフトウェアの使い方に関する情報は[//meta.wikimedia.org/wiki/Help:Contents 利用者案内]を参照してください。\n\n== はじめましょう ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/ja 設定の一覧]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ja MediaWiki よくある質問と回答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation/ja MediaWiki のあなたの言語へのローカライズ]" } diff --git a/includes/installer/i18n/pl.json b/includes/installer/i18n/pl.json index a856301610..b0bde7528b 100644 --- a/includes/installer/i18n/pl.json +++ b/includes/installer/i18n/pl.json @@ -70,6 +70,7 @@ "config-outdated-sqlite": "'''Ostrzeżenie''': masz SQLite $1, która jest niższa od minimalnej wymaganej wersji $2 . SQLite będzie niedostępne.", "config-no-fts3": "'''Uwaga''' – SQLite został skompilowany bez [//sqlite.org/fts3.html modułu FTS3] – funkcje wyszukiwania nie będą dostępne.", "config-register-globals-error": "Błąd: dyrektywa PHP [http://php.net/register_globals register_globals] jest włączona.\nAby kontynuować instalację musi zostać wyłączona.\nPrzeczytaj [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals], aby dowiedzieć się, jak to zrobić.", + "config-magic-quotes-gpc": "Błąd krytyczny – dyrektywa [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] jest włączona!\nTa opcja powoduje nieprzewidywalne uszkodzenia wprowadzanych danych.\nNie możesz instalować lub korzystać z MediaWiki, dopóki ta opcja nie zostanie wyłączona.", "config-magic-quotes-runtime": "'''Błąd krytyczny – włączono [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]!'''\nTa opcja powoduje nieprzewidywalne uszkodzenia wprowadzanych danych.\nZainstalować lub korzystać z MediaWiki można pod warunkiem, że ta opcja jest wyłączona.", "config-magic-quotes-sybase": "'''Błąd krytyczny – włączono [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]!'''\nTa opcja powoduje nieprzewidywalne uszkodzenia wprowadzanych danych.\nZainstalować lub korzystać z MediaWiki można pod warunkiem, że ta opcja jest wyłączona.", "config-mbstring": "'''Błąd krytyczny – włączono [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''\nTa opcja powoduje błędy i może wywołać nieprzewidywalne uszkodzenia wprowadzanych danych.\nZainstalować lub korzystać z MediaWiki można pod warunkiem, że ta opcja jest wyłączona.", diff --git a/includes/installer/i18n/pt.json b/includes/installer/i18n/pt.json index 114839e10b..a827fac31d 100644 --- a/includes/installer/i18n/pt.json +++ b/includes/installer/i18n/pt.json @@ -205,7 +205,7 @@ "config-ns-site-name": "O mesmo que o nome da wiki: $1", "config-ns-other": "Outro (especifique)", "config-ns-other-default": "AMinhaWiki", - "config-project-namespace-help": "Seguindo o exemplo da Wikipedia, muitas wikis mantêm as páginas das suas normas e políticas, separadas das páginas de conteúdo, num \"'''espaço nominal do projeto'''\".\nTodos os nomes das páginas neste espaço nominal começam com um determinado prefixo, que pode especificar aqui.\nTradicionalmente, este prefixo deriva do nome da wiki, mas não pode conter caracteres de pontuação, como \"#\" ou \":\".", + "config-project-namespace-help": "Seguindo o exemplo da Wikipédia, muitas wikis mantêm as páginas das suas normas e políticas, separadas das páginas de conteúdo, num \"'''domínio do projeto'''\".\nTodos os nomes das páginas neste domínio começam com um determinado prefixo, que pode especificar aqui.\nTradicionalmente, este prefixo deriva do nome da wiki, mas não pode conter caracteres de pontuação, como \"#\" ou \":\".", "config-ns-invalid": "O espaço nominal especificado \"$1\" é inválido.\nIntroduza um espaço nominal de projeto diferente.", "config-ns-conflict": "O espaço nominal que especificou, \"$1\", cria um conflito com um dos espaços nominais padrão do MediaWiki.\nEspecifique um espaço nominal do projeto diferente.", "config-admin-box": "Conta de administrador", diff --git a/includes/installer/i18n/qqq.json b/includes/installer/i18n/qqq.json index 0735574d64..8d9aac2f0a 100644 --- a/includes/installer/i18n/qqq.json +++ b/includes/installer/i18n/qqq.json @@ -325,7 +325,7 @@ "config-install-keys": "*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}", "config-insecure-keys": "Parameters:\n* $1 - A list of names of the secret keys that were generated.\n* $2 - the number of items in the list $1, to be used with PLURAL.", "config-install-sysop": "Message indicates that the administrator user account is being created\n\nSee also:\n*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}", - "config-install-subscribe-fail": "{{doc-important|\"mediawiki-announce\" is the name of a mailing list and should not be translated.}}", + "config-install-subscribe-fail": "{{doc-important|\"[[m:mail:mediawiki-announce|mediawiki-announce]]\" is the name of a mailing list and should not be translated.}}\nA message displayed if the MediaWiki installer encounters an error making a request to lists.wikimedia.org which hosts the mailing list.\n* $1 - the HTTP error encountered, reproduced as is (English string)", "config-install-subscribe-notpossible": "Error shown when automatically subscribing to the MediaWiki announcements mailing list fails.", "config-install-mainpage": "*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}", "config-install-extension-tables": "Notice shown to the user during the install about progress.", diff --git a/includes/installer/i18n/sv.json b/includes/installer/i18n/sv.json index fc078c936d..b46902c4fa 100644 --- a/includes/installer/i18n/sv.json +++ b/includes/installer/i18n/sv.json @@ -59,6 +59,7 @@ "config-outdated-sqlite": "'''Varning:''' du har SQLite $1, vilket är lägre än minimikravet version $2. SQLite kommer inte att vara tillgänglig.", "config-no-fts3": "'''Varning:''' SQLite kompileras utan [//sqlite.org/fts3.html FTS3-modulen], sökfunktioner kommer att vara otillgängliga pÃ¥ denna backend.", "config-register-globals-error": "Fel: PHP-alternativet [http://php.net/register_globals register_globals] är aktiverad.\nDen mÃ¥ste vara inaktiverad för att fortsätta med installationen.\nSe [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] för hjälp om hur man gör sÃ¥.", + "config-magic-quotes-gpc": "Kritiskt: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_gpc är aktiv!\nDetta alternativ korrumperar inmatad data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.", "config-magic-quotes-runtime": "'''Kritiskt: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] är aktiv!'''\nDetta alternativ korrumperar inmatad data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.", "config-magic-quotes-sybase": "'''Kritiskt: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] är aktiv!'''\nDetta alternativ korrumperar inmatad data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.", "config-mbstring": "'''Kritiskt: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] är aktiv!'''\nDetta alternativ orsakar fel och kan korrumpera data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.", @@ -69,6 +70,7 @@ "config-memory-raised": "PHPs memory_limit är $1, ökad till $2.", "config-memory-bad": "''' Varning:''' PHP:s memory_limit är $1.\nDetta är förmodligen för lÃ¥gt.\nInstallationen kan misslyckas!", "config-ctype": "'''Kritiskt:''' PHP mÃ¥ste kompileras med stöd för [http://www.php.net/manual/en/ctype.installation.php Ctype-tillägget].", + "config-iconv": "Kritiskt: PHP mÃ¥ste kompileras med stöd för [http://www.php.net/manual/en/iconv.installation.php iconv-tillägget].", "config-json": "'''Varning:''' PHP kompilerades utan JSON-stöd.\nDu mÃ¥ste antingen installera PHP JSON-tillägget eller [http://pecl.php.net/package/jsonc PECL jsonc]-tillägget före installationen av MediaWiki.\n* PHP-tillägget är inkluderat i Red Hat Enterprise Linux (CentOS) 5 och 6, men mÃ¥ste aktiveras i /etc/php.ini eller /etc/php.d/json.ini.\n* Vissa Linux-distributioner släppta efter maj 2013 har utelämnat PHP-tillägget och har istället inkluderat PECL-tillägget som php5-json eller php-pecl-jsonc.", "config-xcache": "[http://xcache.lighttpd.net/ XCache] är installerat", "config-apc": "[http://www.php.net/apc APC] är installerat", @@ -233,7 +235,7 @@ "config-license-gfdl": "GNU Free Documentation License 1.3 eller senare", "config-license-pd": "Public Domain", "config-license-cc-choose": "Välj en anpassad Creative Commons-licens", - "config-license-help": "MÃ¥nga publika wikis släpper alla bidrag under en [http://freedomdefined.org/Definition fri licens].\nDetta bidrar till en känsla av gemensamt ägandeskap och uppmuntrar till lÃ¥ngsiktiga bidrag.\nDet är i allmänhet inte nödvändigt för en privat eller företagswiki.\n\nOm du vill kunna använda text frÃ¥n Wikipedia, och du vill att Wikipedia ska kunna acceptera text kopierad ifrÃ¥n din wiki bör du välja Creative Commons Erkännande-DelaLika.\n\nWikipedia använde tidigare GNU Free Documentation License.\nGFDL är en giltig licens, men svÃ¥r att förstÃ¥.\nDet är även svÃ¥rt att Ã¥teranvända innehÃ¥ll som licensierats under GFDL.", + "config-license-help": "MÃ¥nga publika wikis släpper alla bidrag under en [http://freedomdefined.org/Definition fri licens].\nDetta bidrar till en känsla av gemensamt ägandeskap och uppmuntrar till lÃ¥ngsiktiga bidrag.\nDet är i allmänhet inte nödvändigt för en privat eller företagswiki.\n\nOm du vill kunna använda text frÃ¥n Wikipedia, och du vill att Wikipedia ska kunna acceptera text kopierad ifrÃ¥n din wiki bör du välja {{int:config-license-cc-by-sa}}.\n\nWikipedia använde tidigare GNU Free Documentation License.\nGFDL är en giltig licens, men svÃ¥r att förstÃ¥.\nDet är även svÃ¥rt att Ã¥teranvända innehÃ¥ll som licensierats under GFDL.", "config-email-settings": "E-postinställningar", "config-enable-email": "Aktivera utgÃ¥ende e-post", "config-enable-email-help": "Om du vill att e-post ska fungera behöver,[http://www.php.net/manual/en/mail.configuration.php PHPs e-postinställningar] vara konfigurerad pÃ¥ rätt sätt.\nOm du inte vill ha nÃ¥gra e-postfunktioner, kan du inaktivera dem här.", diff --git a/includes/installer/i18n/zh-hant.json b/includes/installer/i18n/zh-hant.json index 0309dba2e3..cb6cefb4c9 100644 --- a/includes/installer/i18n/zh-hant.json +++ b/includes/installer/i18n/zh-hant.json @@ -12,7 +12,8 @@ "Xiaomingyan", "Cwlin0416", "S8321414", - "LNDDYL" + "LNDDYL", + "NigelSoft" ] }, "config-desc": "MediaWiki 安裝程式", @@ -107,7 +108,7 @@ "config-db-name-help": "請輸入一個可以辨識您的 Wiki 的名稱,\n請勿包含空格。\n\n如果您使用的是共用的網頁主機,您的主機提供商會給您一個指定的資料庫名稱,或者讓您透過管理介面建立資料庫。", "config-db-name-oracle": "資料庫 Schema:", "config-db-account-oracle-warn": "目前有三種支援 Oracle 做為後端資料庫的方案:\n\n如果您希望在安裝的過程中自動建立新的資料庫,請提供具有 SYSDBA 權限的帳號並且提供未來要給網頁存取使用的資料庫帳號及密碼。或者您可以手動建立給網頁存取使用的資料庫帳號 (請確保該帳號有建立 Schema Object 的權限),再不然您可以提供兩組不同的帳號,一組用來建立權限,而另一組用來做為網頁存取使用。\n\n本次安裝建立的帳號以及權限所需要的 Script,可以在 \"maintenance/oracle/\" 中找到。\n請注意,若您使用有限制的帳號將會預設關閉所有維護性功能。", - "config-db-install-account": "安裝程序使用的使用者帳號", + "config-db-install-account": "安裝程式使用的使用者帳號", "config-db-username": "資料庫使用者名稱:", "config-db-password": "資料庫密碼:", "config-db-password-empty": "請輸入新增資料庫使用者 $1 的密碼。\n雖然您可以不設定任何密碼,但這樣做並不安全。", diff --git a/includes/libs/CSSMin.php b/includes/libs/CSSMin.php index 4885ae6388..4e2ca836d8 100644 --- a/includes/libs/CSSMin.php +++ b/includes/libs/CSSMin.php @@ -44,7 +44,7 @@ class CSSMin { /* Protected Static Members */ - /** @var array List of common image files extensions and mime-types */ + /** @var array List of common image files extensions and MIME-types */ protected static $mimeTypes = array( 'gif' => 'image/gif', 'jpe' => 'image/jpeg', @@ -135,7 +135,7 @@ class CSSMin { */ public static function getMimeType( $file ) { $realpath = realpath( $file ); - // Try a couple of different ways to get the mime-type of a file, in order of + // Try a couple of different ways to get the MIME-type of a file, in order of // preference if ( $realpath @@ -143,14 +143,14 @@ class CSSMin { && function_exists( 'finfo_open' ) && defined( 'FILEINFO_MIME_TYPE' ) ) { - // As of PHP 5.3, this is how you get the mime-type of a file; it uses the Fileinfo + // As of PHP 5.3, this is how you get the MIME-type of a file; it uses the Fileinfo // PECL extension return finfo_file( finfo_open( FILEINFO_MIME_TYPE ), $realpath ); } elseif ( function_exists( 'mime_content_type' ) ) { - // Before this was deprecated in PHP 5.3, this was how you got the mime-type of a file + // Before this was deprecated in PHP 5.3, this was how you got the MIME-type of a file return mime_content_type( $file ); } else { - // Worst-case scenario has happened, use the file extension to infer the mime-type + // Worst-case scenario has happened, use the file extension to infer the MIME-type $ext = strtolower( pathinfo( $file, PATHINFO_EXTENSION ) ); if ( isset( self::$mimeTypes[$ext] ) ) { return self::$mimeTypes[$ext]; diff --git a/includes/libs/IEContentAnalyzer.php b/includes/libs/IEContentAnalyzer.php index a80f6d91a0..c31a35278a 100644 --- a/includes/libs/IEContentAnalyzer.php +++ b/includes/libs/IEContentAnalyzer.php @@ -333,7 +333,7 @@ class IEContentAnalyzer { * @param string $chunk the first 256 bytes of the file * @param string $proposed the MIME type proposed by the server * - * @return Array: map of IE version to detected mime type + * @return Array: map of IE version to detected MIME type */ public function getRealMimesFromData( $fileName, $chunk, $proposed ) { $types = $this->getMimesFromData( $fileName, $chunk, $proposed ); @@ -371,7 +371,7 @@ class IEContentAnalyzer { * @param string $chunk the first 256 bytes of the file * @param string $proposed the MIME type proposed by the server * - * @return Array: map of IE version to detected mime type + * @return Array: map of IE version to detected MIME type */ public function getMimesFromData( $fileName, $chunk, $proposed ) { $types = array(); diff --git a/includes/libs/lessc.inc.php b/includes/libs/lessc.inc.php index 37723d5b58..61ed771afa 100644 --- a/includes/libs/lessc.inc.php +++ b/includes/libs/lessc.inc.php @@ -1036,7 +1036,7 @@ class lessc { } } - if(!is_null($mime)) // fallback if the mime type is still unknown + if(!is_null($mime)) // fallback if the MIME type is still unknown $url = sprintf('data:%s;base64,%s', $mime, base64_encode(file_get_contents($fullpath))); } } diff --git a/includes/media/MediaHandler.php b/includes/media/MediaHandler.php index e8f83608b0..969bb7218d 100644 --- a/includes/media/MediaHandler.php +++ b/includes/media/MediaHandler.php @@ -313,15 +313,15 @@ abstract class MediaHandler { function getThumbType( $ext, $mime, $params = null ) { $magic = MimeMagic::singleton(); if ( !$ext || $magic->isMatchingExtension( $ext, $mime ) === false ) { - // The extension is not valid for this mime type and we do - // recognize the mime type + // The extension is not valid for this MIME type and we do + // recognize the MIME type $extensions = $magic->getExtensionsForType( $mime ); if ( $extensions ) { return array( strtok( $extensions, ' ' ), $mime ); } } - // The extension is correct (true) or the mime type is unknown to + // The extension is correct (true) or the MIME type is unknown to // MediaWiki (null) return array( $ext, $mime ); } diff --git a/includes/media/XMPInfo.php b/includes/media/XMPInfo.php index 3700556bfe..7e47ec14e3 100644 --- a/includes/media/XMPInfo.php +++ b/includes/media/XMPInfo.php @@ -726,7 +726,7 @@ class XMPInfo { 'mode' => XMPReader::MODE_SEQ, 'validate' => 'validateDate', ), - /* Do not extract dc:format, as we've got better ways to determine mimetype */ + /* Do not extract dc:format, as we've got better ways to determine MIME type */ 'identifier' => array( 'map_group' => 'deprecated', 'map_name' => 'Identifier', diff --git a/includes/mime.info b/includes/mime.info index 7a4de3b9ad..b86d7d7ab7 100644 --- a/includes/mime.info +++ b/includes/mime.info @@ -1,5 +1,5 @@ -# Mime type info file. -# the first mime type in each line is the "main" mime type, +# MIME type info file. +# the first MIME type in each line is the "main" MIME type, # the others are aliases for this type # the media type is given in upper case and square brackets, # like [BITMAP], and must indicate a media type as defined by diff --git a/includes/page/Article.php b/includes/page/Article.php index 436f148984..4a6e002d80 100644 --- a/includes/page/Article.php +++ b/includes/page/Article.php @@ -1751,9 +1751,9 @@ class Article implements Page { Xml::closeElement( 'form' ); if ( $user->isAllowed( 'editinterface' ) ) { - $title = Title::makeTitle( NS_MEDIAWIKI, 'Deletereason-dropdown' ); + $dropdownTitle = Title::makeTitle( NS_MEDIAWIKI, 'Deletereason-dropdown' ); $link = Linker::link( - $title, + $dropdownTitle, wfMessage( 'delete-edit-reasonlist' )->escaped(), array(), array( 'action' => 'edit' ) diff --git a/includes/parser/CacheTime.php b/includes/parser/CacheTime.php index 6fb3e0a820..94abc26609 100644 --- a/includes/parser/CacheTime.php +++ b/includes/parser/CacheTime.php @@ -32,7 +32,7 @@ class CacheTime { */ public $mUsedOptions; - var $mVersion = Parser::VERSION, # Compatibility check + public $mVersion = Parser::VERSION, # Compatibility check $mCacheTime = '', # Time when this object was generated, or -1 for uncacheable. Used in ParserCache. $mCacheExpiry = null, # Seconds after which the object should expire, use 0 for uncachable. Used in ParserCache. $mContainsOldMagic, # Boolean variable indicating if the input contained variables like {{CURRENTDAY}} @@ -41,14 +41,14 @@ class CacheTime { /** * @return string TS_MW timestamp */ - function getCacheTime() { + public function getCacheTime() { return wfTimestamp( TS_MW, $this->mCacheTime ); } /** * @return bool */ - function containsOldMagic() { + public function containsOldMagic() { return $this->mContainsOldMagic; } @@ -56,7 +56,7 @@ class CacheTime { * @param bool $com * @return bool */ - function setContainsOldMagic( $com ) { + public function setContainsOldMagic( $com ) { return wfSetVar( $this->mContainsOldMagic, $com ); } @@ -66,7 +66,7 @@ class CacheTime { * @param string $t * @return string */ - function setCacheTime( $t ) { + public function setCacheTime( $t ) { return wfSetVar( $this->mCacheTime, $t ); } @@ -74,7 +74,7 @@ class CacheTime { * @since 1.23 * @return int|null Revision id, if any was set */ - function getCacheRevisionId() { + public function getCacheRevisionId() { return $this->mCacheRevisionId; } @@ -82,7 +82,7 @@ class CacheTime { * @since 1.23 * @param int $id Revision id */ - function setCacheRevisionId( $id ) { + public function setCacheRevisionId( $id ) { $this->mCacheRevisionId = $id; } @@ -96,7 +96,7 @@ class CacheTime { * * @param int $seconds */ - function updateCacheExpiry( $seconds ) { + public function updateCacheExpiry( $seconds ) { $seconds = (int)$seconds; if ( $this->mCacheExpiry === null || $this->mCacheExpiry > $seconds ) { @@ -118,7 +118,7 @@ class CacheTime { * value of $wgParserCacheExpireTime. * @return int|mixed|null */ - function getCacheExpiry() { + public function getCacheExpiry() { global $wgParserCacheExpireTime; if ( $this->mCacheTime < 0 ) { @@ -147,7 +147,7 @@ class CacheTime { /** * @return bool */ - function isCacheable() { + public function isCacheable() { return $this->getCacheExpiry() > 0; } diff --git a/includes/parser/CoreParserFunctions.php b/includes/parser/CoreParserFunctions.php index 84e7fe2b54..cd1f32dc4c 100644 --- a/includes/parser/CoreParserFunctions.php +++ b/includes/parser/CoreParserFunctions.php @@ -30,7 +30,7 @@ class CoreParserFunctions { * @param Parser $parser * @return void */ - static function register( $parser ) { + public static function register( $parser ) { global $wgAllowDisplayTitle, $wgAllowSlowParserFunctions; # Syntax for arguments (see Parser::setFunctionHook): @@ -84,7 +84,7 @@ class CoreParserFunctions { * @param string $part1 * @return array */ - static function intFunction( $parser, $part1 = '' /*, ... */ ) { + public static function intFunction( $parser, $part1 = '' /*, ... */ ) { if ( strval( $part1 ) !== '' ) { $args = array_slice( func_get_args(), 2 ); $message = wfMessage( $part1, $args ) @@ -103,7 +103,7 @@ class CoreParserFunctions { * * @return string */ - static function formatDate( $parser, $date, $defaultPref = null ) { + public static function formatDate( $parser, $date, $defaultPref = null ) { $lang = $parser->getFunctionLang(); $df = DateFormatter::getInstance( $lang ); @@ -121,7 +121,7 @@ class CoreParserFunctions { return $date; } - static function ns( $parser, $part1 = '' ) { + public static function ns( $parser, $part1 = '' ) { global $wgContLang; if ( intval( $part1 ) || $part1 == "0" ) { $index = intval( $part1 ); @@ -135,7 +135,7 @@ class CoreParserFunctions { } } - static function nse( $parser, $part1 = '' ) { + public static function nse( $parser, $part1 = '' ) { $ret = self::ns( $parser, $part1 ); if ( is_string( $ret ) ) { $ret = wfUrlencode( str_replace( ' ', '_', $ret ) ); @@ -155,7 +155,7 @@ class CoreParserFunctions { * @param string $arg (optional): The type of encoding. * @return string */ - static function urlencode( $parser, $s = '', $arg = null ) { + public static function urlencode( $parser, $s = '', $arg = null ) { static $magicWords = null; if ( is_null( $magicWords ) ) { $magicWords = new MagicWordArray( array( 'url_path', 'url_query', 'url_wiki' ) ); @@ -181,12 +181,12 @@ class CoreParserFunctions { return $parser->markerSkipCallback( $s, $func ); } - static function lcfirst( $parser, $s = '' ) { + public static function lcfirst( $parser, $s = '' ) { global $wgContLang; return $wgContLang->lcfirst( $s ); } - static function ucfirst( $parser, $s = '' ) { + public static function ucfirst( $parser, $s = '' ) { global $wgContLang; return $wgContLang->ucfirst( $s ); } @@ -196,7 +196,7 @@ class CoreParserFunctions { * @param string $s * @return string */ - static function lc( $parser, $s = '' ) { + public static function lc( $parser, $s = '' ) { global $wgContLang; return $parser->markerSkipCallback( $s, array( $wgContLang, 'lc' ) ); } @@ -206,16 +206,16 @@ class CoreParserFunctions { * @param string $s * @return string */ - static function uc( $parser, $s = '' ) { + public static function uc( $parser, $s = '' ) { global $wgContLang; return $parser->markerSkipCallback( $s, array( $wgContLang, 'uc' ) ); } - static function localurl( $parser, $s = '', $arg = null ) { + public static function localurl( $parser, $s = '', $arg = null ) { return self::urlFunction( 'getLocalURL', $s, $arg ); } - static function localurle( $parser, $s = '', $arg = null ) { + public static function localurle( $parser, $s = '', $arg = null ) { $temp = self::urlFunction( 'getLocalURL', $s, $arg ); if ( !is_string( $temp ) ) { return $temp; @@ -224,11 +224,11 @@ class CoreParserFunctions { } } - static function fullurl( $parser, $s = '', $arg = null ) { + public static function fullurl( $parser, $s = '', $arg = null ) { return self::urlFunction( 'getFullURL', $s, $arg ); } - static function fullurle( $parser, $s = '', $arg = null ) { + public static function fullurle( $parser, $s = '', $arg = null ) { $temp = self::urlFunction( 'getFullURL', $s, $arg ); if ( !is_string( $temp ) ) { return $temp; @@ -237,11 +237,11 @@ class CoreParserFunctions { } } - static function canonicalurl( $parser, $s = '', $arg = null ) { + public static function canonicalurl( $parser, $s = '', $arg = null ) { return self::urlFunction( 'getCanonicalURL', $s, $arg ); } - static function canonicalurle( $parser, $s = '', $arg = null ) { + public static function canonicalurle( $parser, $s = '', $arg = null ) { $temp = self::urlFunction( 'getCanonicalURL', $s, $arg ); if ( !is_string( $temp ) ) { return $temp; @@ -250,7 +250,7 @@ class CoreParserFunctions { } } - static function urlFunction( $func, $s = '', $arg = null ) { + public static function urlFunction( $func, $s = '', $arg = null ) { $title = Title::newFromText( $s ); # Due to order of execution of a lot of bits, the values might be encoded # before arriving here; if that's true, then the title can't be created @@ -281,7 +281,7 @@ class CoreParserFunctions { * @param string $arg * @return string */ - static function formatnum( $parser, $num = '', $arg = null ) { + public static function formatnum( $parser, $num = '', $arg = null ) { if ( self::matchAgainstMagicword( 'rawsuffix', $arg ) ) { $func = array( $parser->getFunctionLang(), 'parseFormattedNumber' ); } elseif ( self::matchAgainstMagicword( 'nocommafysuffix', $arg ) ) { @@ -298,7 +298,7 @@ class CoreParserFunctions { * @param string $word * @return string */ - static function grammar( $parser, $case = '', $word = '' ) { + public static function grammar( $parser, $case = '', $word = '' ) { $word = $parser->killMarkers( $word ); return $parser->getFunctionLang()->convertGrammar( $word, $case ); } @@ -308,7 +308,7 @@ class CoreParserFunctions { * @param string $username * @return string */ - static function gender( $parser, $username ) { + public static function gender( $parser, $username ) { wfProfileIn( __METHOD__ ); $forms = array_slice( func_get_args(), 2 ); @@ -350,7 +350,7 @@ class CoreParserFunctions { * @param string $text * @return string */ - static function plural( $parser, $text = '' ) { + public static function plural( $parser, $text = '' ) { $forms = array_slice( func_get_args(), 2 ); $text = $parser->getFunctionLang()->parseFormattedNumber( $text ); settype( $text, ctype_digit( $text ) ? 'int' : 'float' ); @@ -363,9 +363,10 @@ class CoreParserFunctions { * * @param Parser $parser Parent parser * @param string $text Desired title text + * @param string $uarg * @return string */ - static function displaytitle( $parser, $text = '', $uarg = '' ) { + public static function displaytitle( $parser, $text = '', $uarg = '' ) { global $wgRestrictDisplayTitle; static $magicWords = null; @@ -459,7 +460,7 @@ class CoreParserFunctions { return $mwObject->matchStartToEnd( $value ); } - static function formatRaw( $num, $raw ) { + public static function formatRaw( $num, $raw ) { if ( self::matchAgainstMagicword( 'rawsuffix', $raw ) ) { return $num; } else { @@ -467,35 +468,35 @@ class CoreParserFunctions { return $wgContLang->formatNum( $num ); } } - static function numberofpages( $parser, $raw = null ) { + public static function numberofpages( $parser, $raw = null ) { return self::formatRaw( SiteStats::pages(), $raw ); } - static function numberofusers( $parser, $raw = null ) { + public static function numberofusers( $parser, $raw = null ) { return self::formatRaw( SiteStats::users(), $raw ); } - static function numberofactiveusers( $parser, $raw = null ) { + public static function numberofactiveusers( $parser, $raw = null ) { return self::formatRaw( SiteStats::activeUsers(), $raw ); } - static function numberofarticles( $parser, $raw = null ) { + public static function numberofarticles( $parser, $raw = null ) { return self::formatRaw( SiteStats::articles(), $raw ); } - static function numberoffiles( $parser, $raw = null ) { + public static function numberoffiles( $parser, $raw = null ) { return self::formatRaw( SiteStats::images(), $raw ); } - static function numberofadmins( $parser, $raw = null ) { + public static function numberofadmins( $parser, $raw = null ) { return self::formatRaw( SiteStats::numberingroup( 'sysop' ), $raw ); } - static function numberofedits( $parser, $raw = null ) { + public static function numberofedits( $parser, $raw = null ) { return self::formatRaw( SiteStats::edits(), $raw ); } - static function numberofviews( $parser, $raw = null ) { + public static function numberofviews( $parser, $raw = null ) { global $wgDisableCounters; return !$wgDisableCounters ? self::formatRaw( SiteStats::views(), $raw ) : ''; } - static function pagesinnamespace( $parser, $namespace = 0, $raw = null ) { + public static function pagesinnamespace( $parser, $namespace = 0, $raw = null ) { return self::formatRaw( SiteStats::pagesInNs( intval( $namespace ) ), $raw ); } - static function numberingroup( $parser, $name = '', $raw = null ) { + public static function numberingroup( $parser, $name = '', $raw = null ) { return self::formatRaw( SiteStats::numberingroup( strtolower( $name ) ), $raw ); } @@ -508,49 +509,49 @@ class CoreParserFunctions { * @param string $title * @return mixed|string */ - static function mwnamespace( $parser, $title = null ) { + public static function mwnamespace( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { return ''; } return str_replace( '_', ' ', $t->getNsText() ); } - static function namespacee( $parser, $title = null ) { + public static function namespacee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { return ''; } return wfUrlencode( $t->getNsText() ); } - static function namespacenumber( $parser, $title = null ) { + public static function namespacenumber( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { return ''; } return $t->getNamespace(); } - static function talkspace( $parser, $title = null ) { + public static function talkspace( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) || !$t->canTalk() ) { return ''; } return str_replace( '_', ' ', $t->getTalkNsText() ); } - static function talkspacee( $parser, $title = null ) { + public static function talkspacee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) || !$t->canTalk() ) { return ''; } return wfUrlencode( $t->getTalkNsText() ); } - static function subjectspace( $parser, $title = null ) { + public static function subjectspace( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { return ''; } return str_replace( '_', ' ', $t->getSubjectNsText() ); } - static function subjectspacee( $parser, $title = null ) { + public static function subjectspacee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { return ''; @@ -565,98 +566,98 @@ class CoreParserFunctions { * @param string $title * @return string */ - static function pagename( $parser, $title = null ) { + public static function pagename( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { return ''; } return wfEscapeWikiText( $t->getText() ); } - static function pagenamee( $parser, $title = null ) { + public static function pagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { return ''; } return wfEscapeWikiText( $t->getPartialURL() ); } - static function fullpagename( $parser, $title = null ) { + public static function fullpagename( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) || !$t->canTalk() ) { return ''; } return wfEscapeWikiText( $t->getPrefixedText() ); } - static function fullpagenamee( $parser, $title = null ) { + public static function fullpagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) || !$t->canTalk() ) { return ''; } return wfEscapeWikiText( $t->getPrefixedURL() ); } - static function subpagename( $parser, $title = null ) { + public static function subpagename( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { return ''; } return wfEscapeWikiText( $t->getSubpageText() ); } - static function subpagenamee( $parser, $title = null ) { + public static function subpagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { return ''; } return wfEscapeWikiText( $t->getSubpageUrlForm() ); } - static function rootpagename( $parser, $title = null ) { + public static function rootpagename( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { return ''; } return wfEscapeWikiText( $t->getRootText() ); } - static function rootpagenamee( $parser, $title = null ) { + public static function rootpagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { return ''; } return wfEscapeWikiText( wfUrlEncode( str_replace( ' ', '_', $t->getRootText() ) ) ); } - static function basepagename( $parser, $title = null ) { + public static function basepagename( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { return ''; } return wfEscapeWikiText( $t->getBaseText() ); } - static function basepagenamee( $parser, $title = null ) { + public static function basepagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { return ''; } return wfEscapeWikiText( wfUrlEncode( str_replace( ' ', '_', $t->getBaseText() ) ) ); } - static function talkpagename( $parser, $title = null ) { + public static function talkpagename( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) || !$t->canTalk() ) { return ''; } return wfEscapeWikiText( $t->getTalkPage()->getPrefixedText() ); } - static function talkpagenamee( $parser, $title = null ) { + public static function talkpagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) || !$t->canTalk() ) { return ''; } return wfEscapeWikiText( $t->getTalkPage()->getPrefixedURL() ); } - static function subjectpagename( $parser, $title = null ) { + public static function subjectpagename( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { return ''; } return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedText() ); } - static function subjectpagenamee( $parser, $title = null ) { + public static function subjectpagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { return ''; @@ -674,7 +675,7 @@ class CoreParserFunctions { * @param string $arg2 * @return string */ - static function pagesincategory( $parser, $name = '', $arg1 = null, $arg2 = null ) { + public static function pagesincategory( $parser, $name = '', $arg1 = null, $arg2 = null ) { global $wgContLang; static $magicWords = null; if ( is_null( $magicWords ) ) { @@ -741,7 +742,7 @@ class CoreParserFunctions { * @param string $raw Should number be human readable with commas or just number * @return string */ - static function pagesize( $parser, $page = '', $raw = null ) { + public static function pagesize( $parser, $page = '', $raw = null ) { $title = Title::newFromText( $page ); if ( !is_object( $title ) ) { @@ -766,7 +767,7 @@ class CoreParserFunctions { * * @return string */ - static function protectionlevel( $parser, $type = '', $title = '' ) { + public static function protectionlevel( $parser, $type = '', $title = '' ) { $titleObject = Title::newFromText( $title ); if ( !( $titleObject instanceof Title ) ) { $titleObject = $parser->mTitle; @@ -787,7 +788,7 @@ class CoreParserFunctions { * @param string $inLanguage Language code (in which to get name) * @return string */ - static function language( $parser, $code = '', $inLanguage = '' ) { + public static function language( $parser, $code = '', $inLanguage = '' ) { $code = strtolower( $code ); $inLanguage = strtolower( $inLanguage ); $lang = Language::fetchLanguageName( $code, $inLanguage ); @@ -803,7 +804,7 @@ class CoreParserFunctions { * @param int $direction * @return string */ - static function pad( $parser, $string, $length, $padding = '0', $direction = STR_PAD_RIGHT ) { + public static function pad( $parser, $string, $length, $padding = '0', $direction = STR_PAD_RIGHT ) { $padding = $parser->killMarkers( $padding ); $lengthOfPadding = mb_strlen( $padding ); if ( $lengthOfPadding == 0 ) { @@ -829,11 +830,11 @@ class CoreParserFunctions { } } - static function padleft( $parser, $string = '', $length = 0, $padding = '0' ) { + public static function padleft( $parser, $string = '', $length = 0, $padding = '0' ) { return self::pad( $parser, $string, $length, $padding, STR_PAD_LEFT ); } - static function padright( $parser, $string = '', $length = 0, $padding = '0' ) { + public static function padright( $parser, $string = '', $length = 0, $padding = '0' ) { return self::pad( $parser, $string, $length, $padding ); } @@ -842,12 +843,12 @@ class CoreParserFunctions { * @param string $text * @return string */ - static function anchorencode( $parser, $text ) { + public static function anchorencode( $parser, $text ) { $text = $parser->killMarkers( $text ); return (string)substr( $parser->guessSectionNameFromWikiText( $text ), 1 ); } - static function special( $parser, $text ) { + public static function special( $parser, $text ) { list( $page, $subpage ) = SpecialPageFactory::resolveAlias( $text ); if ( $page ) { $title = SpecialPage::getTitleFor( $page, $subpage ); @@ -859,7 +860,7 @@ class CoreParserFunctions { } } - static function speciale( $parser, $text ) { + public static function speciale( $parser, $text ) { return wfUrlencode( str_replace( ' ', '_', self::special( $parser, $text ) ) ); } diff --git a/includes/parser/CoreTagHooks.php b/includes/parser/CoreTagHooks.php index 01ad97c3bd..85920cc11f 100644 --- a/includes/parser/CoreTagHooks.php +++ b/includes/parser/CoreTagHooks.php @@ -30,7 +30,7 @@ class CoreTagHooks { * @param Parser $parser * @return void */ - static function register( $parser ) { + public static function register( $parser ) { global $wgRawHtml; $parser->setHook( 'pre', array( __CLASS__, 'pre' ) ); $parser->setHook( 'nowiki', array( __CLASS__, 'nowiki' ) ); @@ -50,7 +50,7 @@ class CoreTagHooks { * @param Parser $parser * @return string HTML */ - static function pre( $text, $attribs, $parser ) { + public static function pre( $text, $attribs, $parser ) { // Backwards-compatibility hack $content = StringUtils::delimiterReplace( '', '', '$1', $text, 'i' ); @@ -75,7 +75,7 @@ class CoreTagHooks { * @throws MWException * @return array */ - static function html( $content, $attributes, $parser ) { + public static function html( $content, $attributes, $parser ) { global $wgRawHtml; if ( $wgRawHtml ) { return array( $content, 'markerType' => 'nowiki' ); @@ -96,7 +96,7 @@ class CoreTagHooks { * @param Parser $parser * @return array */ - static function nowiki( $content, $attributes, $parser ) { + public static function nowiki( $content, $attributes, $parser ) { $content = strtr( $content, array( '-{' => '-{', '}-' => '}-' ) ); return array( Xml::escapeTagsOnly( $content ), 'markerType' => 'nowiki' ); } @@ -116,7 +116,7 @@ class CoreTagHooks { * @param Parser $parser * @return string HTML */ - static function gallery( $content, $attributes, $parser ) { + public static function gallery( $content, $attributes, $parser ) { return $parser->renderImageGallery( $content, $attributes ); } } diff --git a/includes/parser/DateFormatter.php b/includes/parser/DateFormatter.php index 0bf2ffcac8..82f0e9d48f 100644 --- a/includes/parser/DateFormatter.php +++ b/includes/parser/DateFormatter.php @@ -27,11 +27,11 @@ * @ingroup Parser */ class DateFormatter { - var $mSource, $mTarget; - var $monthNames = '', $rxDM, $rxMD, $rxDMY, $rxYDM, $rxMDY, $rxYMD; + public $mSource, $mTarget; + public $monthNames = '', $rxDM, $rxMD, $rxDMY, $rxYDM, $rxMDY, $rxYMD; - var $regexes, $pDays, $pMonths, $pYears; - var $rules, $xMonths, $preferences; + public $regexes, $pDays, $pMonths, $pYears; + public $rules, $xMonths, $preferences; protected $lang; @@ -51,7 +51,7 @@ class DateFormatter { /** * @param Language $lang In which language to format the date */ - function __construct( Language $lang ) { + public function __construct( Language $lang ) { $this->lang = $lang; $this->monthNames = $this->getMonthRegex(); @@ -146,7 +146,7 @@ class DateFormatter { * * @return string */ - function reformat( $preference, $text, $options = array( 'linked' ) ) { + public function reformat( $preference, $text, $options = array( 'linked' ) ) { $linked = in_array( 'linked', $options ); $match_whole = in_array( 'match-whole', $options ); @@ -196,7 +196,7 @@ class DateFormatter { * @param array $matches * @return string */ - function replace( $matches ) { + public function replace( $matches ) { # Extract information from $matches $linked = true; if ( isset( $this->mLinked ) ) { @@ -220,7 +220,7 @@ class DateFormatter { * @param bool $link * @return string */ - function formatDate( $bits, $link = true ) { + public function formatDate( $bits, $link = true ) { $format = $this->targets[$this->mTarget]; if ( !$link ) { @@ -318,7 +318,7 @@ class DateFormatter { * @todo document * @return string */ - function getMonthRegex() { + public function getMonthRegex() { $names = array(); for ( $i = 1; $i <= 12; $i++ ) { $names[] = $this->lang->getMonthName( $i ); @@ -332,7 +332,7 @@ class DateFormatter { * @param string $monthName Month name * @return string ISO month name */ - function makeIsoMonth( $monthName ) { + public function makeIsoMonth( $monthName ) { $n = $this->xMonths[$this->lang->lc( $monthName )]; return sprintf( '%02d', $n ); } @@ -342,7 +342,7 @@ class DateFormatter { * @param string $year Year name * @return string ISO year name */ - function makeIsoYear( $year ) { + public function makeIsoYear( $year ) { # Assumes the year is in a nice format, as enforced by the regex if ( substr( $year, -2 ) == 'BC' ) { $num = intval( substr( $year, 0, -3 ) ) - 1; @@ -360,7 +360,7 @@ class DateFormatter { * @param string $iso * @return int|string */ - function makeNormalYear( $iso ) { + public function makeNormalYear( $iso ) { if ( $iso[0] == '-' ) { $text = ( intval( substr( $iso, 1 ) ) + 1 ) . ' BC'; } else { diff --git a/includes/parser/LinkHolderArray.php b/includes/parser/LinkHolderArray.php index 30bb2cffb0..c3925b3e4d 100644 --- a/includes/parser/LinkHolderArray.php +++ b/includes/parser/LinkHolderArray.php @@ -25,26 +25,27 @@ * @ingroup Parser */ class LinkHolderArray { - var $internals = array(), $interwikis = array(); - var $size = 0; + public $internals = array(); + public $interwikis = array(); + public $size = 0; /** * @var Parser */ - var $parent; + public $parent; protected $tempIdOffset; /** * @param Parser $parent */ - function __construct( $parent ) { + public function __construct( $parent ) { $this->parent = $parent; } /** * Reduce memory usage to reduce the impact of circular references */ - function __destruct() { + public function __destruct() { foreach ( $this as $name => $value ) { unset( $this->$name ); } @@ -58,7 +59,7 @@ class LinkHolderArray { * Compact the titles, only serialize the text form. * @return array */ - function __sleep() { + public function __sleep() { foreach ( $this->internals as &$nsLinks ) { foreach ( $nsLinks as &$entry ) { unset( $entry['title'] ); @@ -78,7 +79,7 @@ class LinkHolderArray { /** * Recreate the Title objects */ - function __wakeup() { + public function __wakeup() { foreach ( $this->internals as &$nsLinks ) { foreach ( $nsLinks as &$entry ) { $entry['title'] = Title::newFromText( $entry['pdbk'] ); @@ -97,7 +98,7 @@ class LinkHolderArray { * Merge another LinkHolderArray into this one * @param LinkHolderArray $other */ - function merge( $other ) { + public function merge( $other ) { foreach ( $other->internals as $ns => $entries ) { $this->size += count( $entries ); if ( !isset( $this->internals[$ns] ) ) { @@ -121,7 +122,7 @@ class LinkHolderArray { * @param array $texts Array of strings * @return array */ - function mergeForeign( $other, $texts ) { + public function mergeForeign( $other, $texts ) { $this->tempIdOffset = $idOffset = $this->parent->nextLinkID(); $maxId = 0; @@ -165,7 +166,7 @@ class LinkHolderArray { * @param string $text * @return LinkHolderArray */ - function getSubArray( $text ) { + public function getSubArray( $text ) { $sub = new LinkHolderArray( $this->parent ); # Internal links @@ -199,7 +200,7 @@ class LinkHolderArray { * Returns true if the memory requirements of this object are getting large * @return bool */ - function isBig() { + public function isBig() { global $wgLinkHolderBatchSize; return $this->size > $wgLinkHolderBatchSize; } @@ -208,7 +209,7 @@ class LinkHolderArray { * Clear all stored link holders. * Make sure you don't have any text left using these link holders, before you call this */ - function clear() { + public function clear() { $this->internals = array(); $this->interwikis = array(); $this->size = 0; @@ -227,7 +228,7 @@ class LinkHolderArray { * @param string $prefix [optional] * @return string */ - function makeHolder( $nt, $text = '', $query = array(), $trail = '', $prefix = '' ) { + public function makeHolder( $nt, $text = '', $query = array(), $trail = '', $prefix = '' ) { wfProfileIn( __METHOD__ ); if ( !is_object( $nt ) ) { # Fail gracefully @@ -268,7 +269,7 @@ class LinkHolderArray { * @param string $text * @return array Array of link CSS classes, indexed by PDBK. */ - function replace( &$text ) { + public function replace( &$text ) { wfProfileIn( __METHOD__ ); /** @todo FIXME: replaceInternal doesn't return a value */ @@ -630,7 +631,7 @@ class LinkHolderArray { * @param string $text * @return string */ - function replaceText( $text ) { + public function replaceText( $text ) { wfProfileIn( __METHOD__ ); $text = preg_replace_callback( @@ -649,7 +650,7 @@ class LinkHolderArray { * @return string * @private */ - function replaceTextCallback( $matches ) { + public function replaceTextCallback( $matches ) { $type = $matches[1]; $key = $matches[2]; if ( $type == 'LINK' ) { diff --git a/includes/parser/MWTidy.php b/includes/parser/MWTidy.php index f7fe5a8d91..a108d2beea 100644 --- a/includes/parser/MWTidy.php +++ b/includes/parser/MWTidy.php @@ -83,7 +83,7 @@ class MWTidyWrapper { * * @return string */ - function replaceCallback( $m ) { + public function replaceCallback( $m ) { $marker = "{$this->mUniqPrefix}-item-{$this->mMarkerIndex}" . Parser::MARKER_SUFFIX; $this->mMarkerIndex++; $this->mTokens->setPair( $marker, $m[0] ); diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php index bc4fcce282..c5c472ada8 100644 --- a/includes/parser/Parser.php +++ b/includes/parser/Parser.php @@ -120,61 +120,61 @@ class Parser { const TOC_END = ''; # Persistent: - var $mTagHooks = array(); - var $mTransparentTagHooks = array(); - var $mFunctionHooks = array(); - var $mFunctionSynonyms = array( 0 => array(), 1 => array() ); - var $mFunctionTagHooks = array(); - var $mStripList = array(); - var $mDefaultStripList = array(); - var $mVarCache = array(); - var $mImageParams = array(); - var $mImageParamsMagicArray = array(); - var $mMarkerIndex = 0; - var $mFirstCall = true; + public $mTagHooks = array(); + public $mTransparentTagHooks = array(); + public $mFunctionHooks = array(); + public $mFunctionSynonyms = array( 0 => array(), 1 => array() ); + public $mFunctionTagHooks = array(); + public $mStripList = array(); + public $mDefaultStripList = array(); + public $mVarCache = array(); + public $mImageParams = array(); + public $mImageParamsMagicArray = array(); + public $mMarkerIndex = 0; + public $mFirstCall = true; # Initialised by initialiseVariables() /** * @var MagicWordArray */ - var $mVariables; + public $mVariables; /** * @var MagicWordArray */ - var $mSubstWords; - var $mConf, $mPreprocessor, $mExtLinkBracketedRegex, $mUrlProtocols; # Initialised in constructor + public $mSubstWords; + public $mConf, $mPreprocessor, $mExtLinkBracketedRegex, $mUrlProtocols; # Initialised in constructor # Cleared with clearState(): /** * @var ParserOutput */ - var $mOutput; - var $mAutonumber, $mDTopen; + public $mOutput; + public $mAutonumber, $mDTopen; /** * @var StripState */ - var $mStripState; + public $mStripState; - var $mIncludeCount, $mArgStack, $mLastSection, $mInPre; + public $mIncludeCount, $mArgStack, $mLastSection, $mInPre; /** * @var LinkHolderArray */ - var $mLinkHolders; + public $mLinkHolders; - var $mLinkID; - var $mIncludeSizes, $mPPNodeCount, $mGeneratedPPNodeCount, $mHighestExpansionDepth; - var $mDefaultSort; - var $mTplRedirCache, $mTplDomCache, $mHeadings, $mDoubleUnderscores; - var $mExpensiveFunctionCount; # number of expensive parser function calls - var $mShowToc, $mForceTocPosition; + public $mLinkID; + public $mIncludeSizes, $mPPNodeCount, $mGeneratedPPNodeCount, $mHighestExpansionDepth; + public $mDefaultSort; + public $mTplRedirCache, $mTplDomCache, $mHeadings, $mDoubleUnderscores; + public $mExpensiveFunctionCount; # number of expensive parser function calls + public $mShowToc, $mForceTocPosition; /** * @var User */ - var $mUser; # User object; only used when doing pre-save transform + public $mUser; # User object; only used when doing pre-save transform # Temporary # These are variables reset at least once per parse regardless of $clearState @@ -182,33 +182,33 @@ class Parser { /** * @var ParserOptions */ - var $mOptions; + public $mOptions; /** * @var Title */ - var $mTitle; # Title context, used for self-link rendering and similar things - var $mOutputType; # Output type, one of the OT_xxx constants - var $ot; # Shortcut alias, see setOutputType() - var $mRevisionObject; # The revision object of the specified revision ID - var $mRevisionId; # ID to display in {{REVISIONID}} tags - var $mRevisionTimestamp; # The timestamp of the specified revision ID - var $mRevisionUser; # User to display in {{REVISIONUSER}} tag - var $mRevisionSize; # Size to display in {{REVISIONSIZE}} variable - var $mRevIdForTs; # The revision ID which was used to fetch the timestamp - var $mInputSize = false; # For {{PAGESIZE}} on current page. + public $mTitle; # Title context, used for self-link rendering and similar things + public $mOutputType; # Output type, one of the OT_xxx constants + public $ot; # Shortcut alias, see setOutputType() + public $mRevisionObject; # The revision object of the specified revision ID + public $mRevisionId; # ID to display in {{REVISIONID}} tags + public $mRevisionTimestamp; # The timestamp of the specified revision ID + public $mRevisionUser; # User to display in {{REVISIONUSER}} tag + public $mRevisionSize; # Size to display in {{REVISIONSIZE}} variable + public $mRevIdForTs; # The revision ID which was used to fetch the timestamp + public $mInputSize = false; # For {{PAGESIZE}} on current page. /** * @var string */ - var $mUniqPrefix; + public $mUniqPrefix; /** * @var array Array with the language name of each language link (i.e. the * interwiki prefix) in the key, value arbitrary. Used to avoid sending * duplicate language links to the ParserOutput. */ - var $mLangLinkLanguages; + public $mLangLinkLanguages; /** * @var bool Recursive call protection. @@ -244,7 +244,7 @@ class Parser { /** * Reduce memory usage to reduce the impact of circular references */ - function __destruct() { + public function __destruct() { if ( isset( $this->mLinkHolders ) ) { unset( $this->mLinkHolders ); } @@ -256,7 +256,7 @@ class Parser { /** * Allow extensions to clean up when the parser is cloned */ - function __clone() { + public function __clone() { $this->mInParse = false; wfRunHooks( 'ParserCloned', array( $this ) ); } @@ -264,7 +264,7 @@ class Parser { /** * Do various kinds of initialisation on the first call of the parser */ - function firstCallInit() { + public function firstCallInit() { if ( !$this->mFirstCall ) { return; } @@ -285,7 +285,7 @@ class Parser { * * @private */ - function clearState() { + public function clearState() { wfProfileIn( __METHOD__ ); if ( $this->mFirstCall ) { $this->firstCallInit(); @@ -605,7 +605,7 @@ class Parser { * * @return string */ - function recursiveTagParse( $text, $frame = false ) { + public function recursiveTagParse( $text, $frame = false ) { wfProfileIn( __METHOD__ ); wfRunHooks( 'ParserBeforeStrip', array( &$this, &$text, &$this->mStripState ) ); wfRunHooks( 'ParserAfterStrip', array( &$this, &$text, &$this->mStripState ) ); @@ -625,7 +625,7 @@ class Parser { * @param bool|PPFrame $frame * @return mixed|string */ - function preprocess( $text, Title $title = null, ParserOptions $options, $revid = null, $frame = false ) { + public function preprocess( $text, Title $title = null, ParserOptions $options, $revid = null, $frame = false ) { wfProfileIn( __METHOD__ ); $magicScopeVariable = $this->lock(); $this->startParse( $title, $options, self::OT_PREPROCESS, true ); @@ -700,7 +700,7 @@ class Parser { * * @param User|null $user User object or null (to reset) */ - function setUser( $user ) { + public function setUser( $user ) { $this->mUser = $user; } @@ -727,7 +727,7 @@ class Parser { * * @param Title $t */ - function setTitle( $t ) { + public function setTitle( $t ) { if ( !$t ) { $t = Title::newFromText( 'NO TITLE' ); } @@ -746,7 +746,7 @@ class Parser { * * @return Title */ - function getTitle() { + public function getTitle() { return $this->mTitle; } @@ -756,7 +756,7 @@ class Parser { * @param Title $x Title object or null to just get the current one * @return Title */ - function Title( $x = null ) { + public function Title( $x = null ) { return wfSetVar( $this->mTitle, $x ); } @@ -765,7 +765,7 @@ class Parser { * * @param int $ot New value */ - function setOutputType( $ot ) { + public function setOutputType( $ot ) { $this->mOutputType = $ot; # Shortcut alias $this->ot = array( @@ -782,7 +782,7 @@ class Parser { * @param int|null $x New value or null to just get the current one * @return int */ - function OutputType( $x = null ) { + public function OutputType( $x = null ) { return wfSetVar( $this->mOutputType, $x ); } @@ -791,7 +791,7 @@ class Parser { * * @return ParserOutput */ - function getOutput() { + public function getOutput() { return $this->mOutput; } @@ -800,7 +800,7 @@ class Parser { * * @return ParserOptions */ - function getOptions() { + public function getOptions() { return $this->mOptions; } @@ -810,21 +810,21 @@ class Parser { * @param ParserOptions $x New value or null to just get the current one * @return ParserOptions Current ParserOptions object */ - function Options( $x = null ) { + public function Options( $x = null ) { return wfSetVar( $this->mOptions, $x ); } /** * @return int */ - function nextLinkID() { + public function nextLinkID() { return $this->mLinkID++; } /** * @param int $id */ - function setLinkID( $id ) { + public function setLinkID( $id ) { $this->mLinkID = $id; } @@ -832,7 +832,7 @@ class Parser { * Get a language object for use in parser functions such as {{FORMATNUM:}} * @return Language */ - function getFunctionLang() { + public function getFunctionLang() { return $this->getTargetLanguage(); } @@ -843,7 +843,7 @@ class Parser { * @since 1.19 * * @throws MWException - * @return Language|null + * @return Language */ public function getTargetLanguage() { $target = $this->mOptions->getTargetLanguage(); @@ -863,7 +863,7 @@ class Parser { * Get the language object for language conversion * @return Language|null */ - function getConverterLanguage() { + public function getConverterLanguage() { return $this->getTargetLanguage(); } @@ -873,7 +873,7 @@ class Parser { * * @return User */ - function getUser() { + public function getUser() { if ( !is_null( $this->mUser ) ) { return $this->mUser; } @@ -885,7 +885,7 @@ class Parser { * * @return Preprocessor */ - function getPreprocessor() { + public function getPreprocessor() { if ( !isset( $this->mPreprocessor ) ) { $class = $this->mPreprocessorClass; $this->mPreprocessor = new $class( $this ); @@ -980,7 +980,7 @@ class Parser { * * @return array */ - function getStripList() { + public function getStripList() { return $this->mStripList; } @@ -993,7 +993,7 @@ class Parser { * * @return string */ - function insertStripItem( $text ) { + public function insertStripItem( $text ) { $rnd = "{$this->mUniqPrefix}-item-{$this->mMarkerIndex}-" . self::MARKER_SUFFIX; $this->mMarkerIndex++; $this->mStripState->addGeneral( $rnd, $text ); @@ -1007,7 +1007,7 @@ class Parser { * @param string $text * @return string */ - function doTableStuff( $text ) { + public function doTableStuff( $text ) { wfProfileIn( __METHOD__ ); $lines = StringUtils::explode( "\n", $text ); @@ -1212,7 +1212,7 @@ class Parser { * * @return string */ - function internalParse( $text, $isMain = true, $frame = false ) { + public function internalParse( $text, $isMain = true, $frame = false ) { wfProfileIn( __METHOD__ ); $origText = $text; @@ -1285,7 +1285,7 @@ class Parser { * * @return string */ - function doMagicLinks( $text ) { + public function doMagicLinks( $text ) { wfProfileIn( __METHOD__ ); $prots = wfUrlProtocolsWithoutProtRel(); $urlChar = self::EXT_LINK_URL_CLASS; @@ -1310,7 +1310,7 @@ class Parser { * @param array $m * @return HTML|string */ - function magicLinkCallback( $m ) { + public function magicLinkCallback( $m ) { if ( isset( $m[1] ) && $m[1] !== '' ) { # Skip anchor return $m[0]; @@ -1363,7 +1363,7 @@ class Parser { * @return string HTML * @private */ - function makeFreeExternalLink( $url ) { + public function makeFreeExternalLink( $url ) { wfProfileIn( __METHOD__ ); $trail = ''; @@ -1418,7 +1418,7 @@ class Parser { * * @return string */ - function doHeadings( $text ) { + public function doHeadings( $text ) { wfProfileIn( __METHOD__ ); for ( $i = 6; $i >= 1; --$i ) { $h = str_repeat( '=', $i ); @@ -1436,7 +1436,7 @@ class Parser { * * @return string The altered text */ - function doAllQuotes( $text ) { + public function doAllQuotes( $text ) { wfProfileIn( __METHOD__ ); $outtext = ''; $lines = StringUtils::explode( "\n", $text ); @@ -1645,7 +1645,7 @@ class Parser { * @throws MWException * @return string */ - function replaceExternalLinks( $text ) { + public function replaceExternalLinks( $text ) { wfProfileIn( __METHOD__ ); $bits = preg_split( $this->mExtLinkBracketedRegex, $text, -1, PREG_SPLIT_DELIM_CAPTURE ); @@ -1748,7 +1748,7 @@ class Parser { * nofollow if appropriate * @return array Associative array of HTML attributes */ - function getExternalLinkAttribs( $url = false ) { + public function getExternalLinkAttribs( $url = false ) { $attribs = array(); $attribs['rel'] = self::getExternalLinkRel( $url, $this->mTitle ); @@ -1769,7 +1769,7 @@ class Parser { * the URL differently; as a workaround, just use the output for * statistical records, not for actual linking/output. */ - static function replaceUnusualEscapes( $url ) { + public static function replaceUnusualEscapes( $url ) { return preg_replace_callback( '/%[0-9A-Fa-f]{2}/', array( __CLASS__, 'replaceUnusualEscapesCallback' ), $url ); } @@ -1862,7 +1862,7 @@ class Parser { * * @private */ - function replaceInternalLinks( $s ) { + public function replaceInternalLinks( $s ) { $this->mLinkHolders->merge( $this->replaceInternalLinks2( $s ) ); return $s; } @@ -1875,7 +1875,7 @@ class Parser { * * @private */ - function replaceInternalLinks2( &$s ) { + public function replaceInternalLinks2( &$s ) { global $wgExtraInterlanguageLinkPrefixes; wfProfileIn( __METHOD__ ); @@ -2096,16 +2096,14 @@ class Parser { } # Link not escaped by : , create the various objects - if ( $noforce ) { + if ( $noforce && !$nt->wasLocalInterwiki() ) { # Interwikis wfProfileIn( __METHOD__ . "-interwiki" ); - # The final condition here is due to bug 68085 if ( $iw && $this->mOptions->getInterwikiMagic() && $nottalk && ( Language::fetchLanguageName( $iw, null, 'mw' ) || in_array( $iw, $wgExtraInterlanguageLinkPrefixes ) - ) && substr_compare( $this->getTargetLanguage()->lc( ltrim( $origLink ) ), - $iw, 0, strlen( $iw ) ) === 0 + ) ) { # Bug 24502: filter duplicates if ( !isset( $this->mLangLinkLanguages[$iw] ) ) { @@ -2229,7 +2227,7 @@ class Parser { * @param string $prefix * @return string HTML-wikitext mix oh yuck */ - function makeKnownLinkHolder( $nt, $text = '', $query = array(), $trail = '', $prefix = '' ) { + public function makeKnownLinkHolder( $nt, $text = '', $query = array(), $trail = '', $prefix = '' ) { list( $inside, $trail ) = Linker::splitTrail( $trail ); if ( is_string( $query ) ) { @@ -2254,7 +2252,7 @@ class Parser { * @param string $text More-or-less HTML * @return string Less-or-more HTML with NOPARSE bits */ - function armorLinks( $text ) { + public function armorLinks( $text ) { return preg_replace( '/\b((?i)' . $this->mUrlProtocols . ')/', "{$this->mUniqPrefix}NOPARSE$1", $text ); } @@ -2263,7 +2261,7 @@ class Parser { * Return true if subpage links should be expanded on this page. * @return bool */ - function areSubpagesAllowed() { + public function areSubpagesAllowed() { # Some namespaces don't allow subpages return MWNamespace::hasSubpages( $this->mTitle->getNamespace() ); } @@ -2276,7 +2274,7 @@ class Parser { * @return string The full name of the link * @private */ - function maybeDoSubpageLink( $target, &$text ) { + public function maybeDoSubpageLink( $target, &$text ) { return Linker::normalizeSubpageLink( $this->mTitle, $target, $text ); } @@ -2286,7 +2284,7 @@ class Parser { * * @return string */ - function closeParagraph() { + public function closeParagraph() { $result = ''; if ( $this->mLastSection != '' ) { $result = 'mLastSection . ">\n"; @@ -2306,7 +2304,7 @@ class Parser { * * @return int */ - function getCommon( $st1, $st2 ) { + public function getCommon( $st1, $st2 ) { $fl = strlen( $st1 ); $shorter = strlen( $st2 ); if ( $fl < $shorter ) { @@ -2330,7 +2328,7 @@ class Parser { * * @return string */ - function openList( $char ) { + public function openList( $char ) { $result = $this->closeParagraph(); if ( '*' === $char ) { @@ -2356,7 +2354,7 @@ class Parser { * * @return string */ - function nextItem( $char ) { + public function nextItem( $char ) { if ( '*' === $char || '#' === $char ) { return "
  • \n
  • "; } elseif ( ':' === $char || ';' === $char ) { @@ -2382,7 +2380,7 @@ class Parser { * * @return string */ - function closeList( $char ) { + public function closeList( $char ) { if ( '*' === $char ) { $text = "
  • "; } elseif ( '#' === $char ) { @@ -2409,7 +2407,7 @@ class Parser { * @private * @return string The lists rendered as HTML */ - function doBlockLevels( $text, $linestart ) { + public function doBlockLevels( $text, $linestart ) { wfProfileIn( __METHOD__ ); # Parsing through the text line by line. The main thing @@ -2627,7 +2625,7 @@ class Parser { * @throws MWException * @return string The position of the ':', or false if none found */ - function findColonNoLinks( $str, &$before, &$after ) { + public function findColonNoLinks( $str, &$before, &$after ) { wfProfileIn( __METHOD__ ); $pos = strpos( $str, ':' ); @@ -2795,7 +2793,7 @@ class Parser { * @throws MWException * @return string */ - function getVariableValue( $index, $frame = false ) { + public function getVariableValue( $index, $frame = false ) { global $wgContLang, $wgSitename, $wgServer, $wgServerName; global $wgArticlePath, $wgScriptPath, $wgStylePath; @@ -3151,7 +3149,7 @@ class Parser { * * @private */ - function initialiseVariables() { + public function initialiseVariables() { wfProfileIn( __METHOD__ ); $variableIDs = MagicWord::getVariableIDs(); $substIDs = MagicWord::getSubstIDs(); @@ -3183,7 +3181,7 @@ class Parser { * * @return PPNode */ - function preprocessToDom( $text, $flags = 0 ) { + public function preprocessToDom( $text, $flags = 0 ) { $dom = $this->getPreprocessor()->preprocessToObj( $text, $flags ); return $dom; } @@ -3258,7 +3256,7 @@ class Parser { * * @return array */ - static function createAssocArgs( $args ) { + public static function createAssocArgs( $args ) { $assocArgs = array(); $index = 1; foreach ( $args as $arg ) { @@ -3304,7 +3302,7 @@ class Parser { * @param string|int|null $max Maximum allowed, when an explicit limit has been * exceeded, provide the values (optional) */ - function limitationWarn( $limitationType, $current = '', $max = '' ) { + public function limitationWarn( $limitationType, $current = '', $max = '' ) { # does no harm if $current and $max are present but are unnecessary for the message $warning = wfMessage( "$limitationType-warning" )->numParams( $current, $max ) ->inLanguage( $this->mOptions->getUserLangObj() )->text(); @@ -3764,7 +3762,7 @@ class Parser { * * @return array */ - function getTemplateDom( $title ) { + public function getTemplateDom( $title ) { $cacheTitle = $title; $titleText = $title->getPrefixedDBkey(); @@ -3801,7 +3799,7 @@ class Parser { * @param Title $title * @return array ( string or false, Title ) */ - function fetchTemplateAndTitle( $title ) { + public function fetchTemplateAndTitle( $title ) { // Defaults to Parser::statelessFetchTemplate() $templateCb = $this->mOptions->getTemplateCallback(); $stuff = call_user_func( $templateCb, $title, $this ); @@ -3825,7 +3823,7 @@ class Parser { * @param Title $title * @return string|bool */ - function fetchTemplate( $title ) { + public function fetchTemplate( $title ) { $rv = $this->fetchTemplateAndTitle( $title ); return $rv[0]; } @@ -3839,7 +3837,7 @@ class Parser { * * @return array */ - static function statelessFetchTemplate( $title, $parser = false ) { + public static function statelessFetchTemplate( $title, $parser = false ) { $text = $skip = false; $finalTitle = $title; $deps = array(); @@ -3923,7 +3921,7 @@ class Parser { * @param array $options Array of options to RepoGroup::findFile * @return File|bool */ - function fetchFile( $title, $options = array() ) { + public function fetchFile( $title, $options = array() ) { $res = $this->fetchFileAndTitle( $title, $options ); return $res[0]; } @@ -3935,7 +3933,7 @@ class Parser { * @param array $options Array of options to RepoGroup::findFile * @return array ( File or false, Title of file ) */ - function fetchFileAndTitle( $title, $options = array() ) { + public function fetchFileAndTitle( $title, $options = array() ) { $file = $this->fetchFileNoRegister( $title, $options ); $time = $file ? $file->getTimestamp() : false; @@ -3979,7 +3977,7 @@ class Parser { * * @return string */ - function interwikiTransclude( $title, $action ) { + public function interwikiTransclude( $title, $action ) { global $wgEnableScaryTranscluding; if ( !$wgEnableScaryTranscluding ) { @@ -3998,7 +3996,7 @@ class Parser { * @param string $url * @return mixed|string */ - function fetchScaryTemplateMaybeFromCache( $url ) { + public function fetchScaryTemplateMaybeFromCache( $url ) { global $wgTranscludeCacheExpiry; $dbr = wfGetDB( DB_SLAVE ); $tsCond = $dbr->timestamp( time() - $wgTranscludeCacheExpiry ); @@ -4038,7 +4036,7 @@ class Parser { * * @return array */ - function argSubstitution( $piece, $frame ) { + public function argSubstitution( $piece, $frame ) { wfProfileIn( __METHOD__ ); $error = false; @@ -4093,7 +4091,7 @@ class Parser { * @throws MWException * @return string */ - function extensionSubstitution( $params, $frame ) { + public function extensionSubstitution( $params, $frame ) { $name = $frame->expand( $params['name'] ); $attrText = !isset( $params['attr'] ) ? null : $frame->expand( $params['attr'] ); $content = !isset( $params['inner'] ) ? null : $frame->expand( $params['inner'] ); @@ -4177,7 +4175,7 @@ class Parser { * @param int $size The size of the text * @return bool False if this inclusion would take it over the maximum, true otherwise */ - function incrementIncludeSize( $type, $size ) { + public function incrementIncludeSize( $type, $size ) { if ( $this->mIncludeSizes[$type] + $size > $this->mOptions->getMaxIncludeSize() ) { return false; } else { @@ -4191,7 +4189,7 @@ class Parser { * * @return bool False if the limit has been exceeded */ - function incrementExpensiveFunctionCount() { + public function incrementExpensiveFunctionCount() { $this->mExpensiveFunctionCount++; return $this->mExpensiveFunctionCount <= $this->mOptions->getExpensiveParserFunctionLimit(); } @@ -4204,7 +4202,7 @@ class Parser { * * @return string */ - function doDoubleUnderscore( $text ) { + public function doDoubleUnderscore( $text ) { wfProfileIn( __METHOD__ ); # The position of __TOC__ needs to be recorded @@ -4310,7 +4308,7 @@ class Parser { * @return mixed|string * @private */ - function formatHeadings( $text, $origText, $isMain = true ) { + public function formatHeadings( $text, $origText, $isMain = true ) { global $wgMaxTocLevel, $wgExperimentalHtmlIds; # Inhibit editsection links if requested in the page @@ -4830,7 +4828,7 @@ class Parser { * or null to use default value * @return string */ - function getUserSig( &$user, $nickname = false, $fancySig = null ) { + public function getUserSig( &$user, $nickname = false, $fancySig = null ) { global $wgMaxSigChars; $username = $user->getName(); @@ -4879,7 +4877,7 @@ class Parser { * @param string $text * @return string|bool An expanded string, or false if invalid. */ - function validateSig( $text ) { + public function validateSig( $text ) { return Xml::isWellFormedXmlFragment( $text ) ? $text : false; } @@ -5052,7 +5050,7 @@ class Parser { * @throws MWException * @return callable|null The old value of the mTagHooks array associated with the hook */ - function setTransparentTagHook( $tag, $callback ) { + public function setTransparentTagHook( $tag, $callback ) { $tag = strtolower( $tag ); if ( preg_match( '/[<>\r\n]/', $tag, $m ) ) { throw new MWException( "Invalid character {$m[0]} in setTransparentHook('$tag', ...) call" ); @@ -5066,7 +5064,7 @@ class Parser { /** * Remove all tag hooks */ - function clearTagHooks() { + public function clearTagHooks() { $this->mTagHooks = array(); $this->mFunctionTagHooks = array(); $this->mStripList = $this->mDefaultStripList; @@ -5153,7 +5151,7 @@ class Parser { * * @return array */ - function getFunctionHooks() { + public function getFunctionHooks() { return array_keys( $this->mFunctionHooks ); } @@ -5167,7 +5165,7 @@ class Parser { * @throws MWException * @return null */ - function setFunctionTagHook( $tag, $callback, $flags ) { + public function setFunctionTagHook( $tag, $callback, $flags ) { $tag = strtolower( $tag ); if ( preg_match( '/[<>\r\n]/', $tag, $m ) ) { throw new MWException( "Invalid character {$m[0]} in setFunctionTagHook('$tag', ...) call" ); @@ -5193,7 +5191,7 @@ class Parser { * * @return array Array of link CSS classes, indexed by PDBK. */ - function replaceLinkHolders( &$text, $options = 0 ) { + public function replaceLinkHolders( &$text, $options = 0 ) { return $this->mLinkHolders->replace( $text ); } @@ -5204,7 +5202,7 @@ class Parser { * @param string $text * @return string */ - function replaceLinkHoldersText( $text ) { + public function replaceLinkHoldersText( $text ) { return $this->mLinkHolders->replaceText( $text ); } @@ -5221,7 +5219,7 @@ class Parser { * @param array $params * @return string HTML */ - function renderImageGallery( $text, $params ) { + public function renderImageGallery( $text, $params ) { wfProfileIn( __METHOD__ ); $mode = false; @@ -5382,7 +5380,7 @@ class Parser { * @param string $handler * @return array */ - function getImageParams( $handler ) { + public function getImageParams( $handler ) { if ( $handler ) { $handlerClass = get_class( $handler ); } else { @@ -5430,7 +5428,7 @@ class Parser { * @param LinkHolderArray|bool $holders * @return string HTML */ - function makeImage( $title, $options, $holders = false ) { + public function makeImage( $title, $options, $holders = false ) { # Check if the options text is of the form "options|alt text" # Options are: # * thumbnail make a thumbnail with enlarge-icon and caption, alignment depends on lang @@ -5669,7 +5667,7 @@ class Parser { * Set a flag in the output object indicating that the content is dynamic and * shouldn't be cached. */ - function disableCache() { + public function disableCache() { wfDebug( "Parser output marked as uncacheable.\n" ); if ( !$this->mOutput ) { throw new MWException( __METHOD__ . @@ -5687,7 +5685,7 @@ class Parser { * @param bool|PPFrame $frame * @return string */ - function attributeStripCallback( &$text, $frame = false ) { + public function attributeStripCallback( &$text, $frame = false ) { $text = $this->replaceVariables( $text, $frame ); $text = $this->mStripState->unstripBoth( $text ); return $text; @@ -5698,7 +5696,7 @@ class Parser { * * @return array */ - function getTags() { + public function getTags() { return array_merge( array_keys( $this->mTransparentTagHooks ), array_keys( $this->mTagHooks ), @@ -5716,7 +5714,7 @@ class Parser { * * @return string */ - function replaceTransparentTags( $text ) { + public function replaceTransparentTags( $text ) { $matches = array(); $elements = array_keys( $this->mTransparentTagHooks ); $text = self::extractTagsAndParams( $elements, $text, $matches, $this->mUniqPrefix ); @@ -5917,7 +5915,7 @@ class Parser { * * @return int|null */ - function getRevisionId() { + public function getRevisionId() { return $this->mRevisionId; } @@ -5944,7 +5942,7 @@ class Parser { * the default server-local timestamp * @return string */ - function getRevisionTimestamp() { + public function getRevisionTimestamp() { if ( is_null( $this->mRevisionTimestamp ) ) { wfProfileIn( __METHOD__ ); @@ -5971,7 +5969,7 @@ class Parser { * * @return string User name */ - function getRevisionUser() { + public function getRevisionUser() { if ( is_null( $this->mRevisionUser ) ) { $revObject = $this->getRevisionObject(); @@ -5991,7 +5989,7 @@ class Parser { * * @return int|null Revision size */ - function getRevisionSize() { + public function getRevisionSize() { if ( is_null( $this->mRevisionSize ) ) { $revObject = $this->getRevisionObject(); @@ -6119,7 +6117,7 @@ class Parser { * * @return string */ - function testSrvus( $text, Title $title, ParserOptions $options, $outputType = self::OT_HTML ) { + public function testSrvus( $text, Title $title, ParserOptions $options, $outputType = self::OT_HTML ) { $magicScopeVariable = $this->lock(); $this->startParse( $title, $options, $outputType, true ); @@ -6135,7 +6133,7 @@ class Parser { * @param ParserOptions $options * @return string */ - function testPst( $text, Title $title, ParserOptions $options ) { + public function testPst( $text, Title $title, ParserOptions $options ) { return $this->preSaveTransform( $text, $title, $options->getUser(), $options ); } @@ -6145,7 +6143,7 @@ class Parser { * @param ParserOptions $options * @return string */ - function testPreprocess( $text, Title $title, ParserOptions $options ) { + public function testPreprocess( $text, Title $title, ParserOptions $options ) { return $this->testSrvus( $text, $title, $options, self::OT_PREPROCESS ); } @@ -6165,7 +6163,7 @@ class Parser { * * @return string */ - function markerSkipCallback( $s, $callback ) { + public function markerSkipCallback( $s, $callback ) { $i = 0; $out = ''; while ( $i < strlen( $s ) ) { @@ -6195,7 +6193,7 @@ class Parser { * @param string $text Input string * @return string */ - function killMarkers( $text ) { + public function killMarkers( $text ) { return $this->mStripState->killMarkers( $text ); } @@ -6215,7 +6213,7 @@ class Parser { * * @return array */ - function serializeHalfParsedText( $text ) { + public function serializeHalfParsedText( $text ) { wfProfileIn( __METHOD__ ); $data = array( 'text' => $text, @@ -6242,7 +6240,7 @@ class Parser { * @throws MWException * @return string */ - function unserializeHalfParsedText( $data ) { + public function unserializeHalfParsedText( $data ) { if ( !isset( $data['version'] ) || $data['version'] != self::HALF_PARSED_VERSION ) { throw new MWException( __METHOD__ . ': invalid version' ); } @@ -6267,7 +6265,7 @@ class Parser { * * @return bool */ - function isValidHalfParsedText( $data ) { + public function isValidHalfParsedText( $data ) { return isset( $data['version'] ) && $data['version'] == self::HALF_PARSED_VERSION; } diff --git a/includes/parser/ParserCache.php b/includes/parser/ParserCache.php index 6102ca481e..795230035c 100644 --- a/includes/parser/ParserCache.php +++ b/includes/parser/ParserCache.php @@ -95,7 +95,7 @@ class ParserCache { * @param ParserOptions $popts * @return string */ - function getETag( $article, $popts ) { + public function getETag( $article, $popts ) { return 'W/"' . $this->getParserOutputKey( $article, $popts->optionsHash( ParserOptions::legacyOptions(), $article->getTitle() ) ) . "--" . $article->getTouched() . '"'; diff --git a/includes/parser/ParserDiffTest.php b/includes/parser/ParserDiffTest.php index 2db0597e2b..174c1d61ac 100644 --- a/includes/parser/ParserDiffTest.php +++ b/includes/parser/ParserDiffTest.php @@ -26,19 +26,19 @@ */ class ParserDiffTest { - var $parsers, $conf; - var $shortOutput = false; + public $parsers; + public $conf; + public $shortOutput = false; + public $dtUniqPrefix; - var $dtUniqPrefix; - - function __construct( $conf ) { + public function __construct( $conf ) { if ( !isset( $conf['parsers'] ) ) { throw new MWException( __METHOD__ . ': no parsers specified' ); } $this->conf = $conf; } - function init() { + public function init() { if ( !is_null( $this->parsers ) ) { return; } @@ -64,7 +64,7 @@ class ParserDiffTest } } - function __call( $name, $args ) { + public function __call( $name, $args ) { $this->init(); $results = array(); $mismatch = false; @@ -109,7 +109,7 @@ class ParserDiffTest return $lastResult; } - function formatArray( $array ) { + public function formatArray( $array ) { if ( $this->shortOutput ) { foreach ( $array as $key => $value ) { if ( $value instanceof ParserOutput ) { @@ -120,7 +120,7 @@ class ParserDiffTest return var_export( $array, true ); } - function setFunctionHook( $id, $callback, $flags = 0 ) { + public function setFunctionHook( $id, $callback, $flags = 0 ) { $this->init(); foreach ( $this->parsers as $parser ) { $parser->setFunctionHook( $id, $callback, $flags ); @@ -131,7 +131,7 @@ class ParserDiffTest * @param Parser $parser * @return bool */ - function onClearState( &$parser ) { + public function onClearState( &$parser ) { // hack marker prefixes to get identical output if ( !isset( $this->dtUniqPrefix ) ) { $this->dtUniqPrefix = $parser->uniqPrefix(); diff --git a/includes/parser/ParserOptions.php b/includes/parser/ParserOptions.php index 411702fe22..64febcc528 100644 --- a/includes/parser/ParserOptions.php +++ b/includes/parser/ParserOptions.php @@ -34,108 +34,108 @@ class ParserOptions { /** * Interlanguage links are removed and returned in an array */ - var $mInterwikiMagic; + public $mInterwikiMagic; /** * Allow external images inline? */ - var $mAllowExternalImages; + public $mAllowExternalImages; /** * If not, any exception? */ - var $mAllowExternalImagesFrom; + public $mAllowExternalImagesFrom; /** * If not or it doesn't match, should we check an on-wiki whitelist? */ - var $mEnableImageWhitelist; + public $mEnableImageWhitelist; /** * Date format index */ - var $mDateFormat = null; + public $mDateFormat = null; /** * Create "edit section" links? */ - var $mEditSection = true; + public $mEditSection = true; /** * Allow inclusion of special pages? */ - var $mAllowSpecialInclusion; + public $mAllowSpecialInclusion; /** * Use tidy to cleanup output HTML? */ - var $mTidy = false; + public $mTidy = false; /** * Which lang to call for PLURAL and GRAMMAR */ - var $mInterfaceMessage = false; + public $mInterfaceMessage = false; /** * Overrides $mInterfaceMessage with arbitrary language */ - var $mTargetLanguage = null; + public $mTargetLanguage = null; /** * Maximum size of template expansions, in bytes */ - var $mMaxIncludeSize; + public $mMaxIncludeSize; /** * Maximum number of nodes touched by PPFrame::expand() */ - var $mMaxPPNodeCount; + public $mMaxPPNodeCount; /** * Maximum number of nodes generated by Preprocessor::preprocessToObj() */ - var $mMaxGeneratedPPNodeCount; + public $mMaxGeneratedPPNodeCount; /** * Maximum recursion depth in PPFrame::expand() */ - var $mMaxPPExpandDepth; + public $mMaxPPExpandDepth; /** * Maximum recursion depth for templates within templates */ - var $mMaxTemplateDepth; + public $mMaxTemplateDepth; /** * Maximum number of calls per parse to expensive parser functions */ - var $mExpensiveParserFunctionLimit; + public $mExpensiveParserFunctionLimit; /** * Remove HTML comments. ONLY APPLIES TO PREPROCESS OPERATIONS */ - var $mRemoveComments = true; + public $mRemoveComments = true; /** * Callback for template fetching. Used as first argument to call_user_func(). */ - var $mTemplateCallback = + public $mTemplateCallback = array( 'Parser', 'statelessFetchTemplate' ); /** * Enable limit report in an HTML comment on output */ - var $mEnableLimitReport = false; + public $mEnableLimitReport = false; /** * Timestamp used for {{CURRENTDAY}} etc. */ - var $mTimestamp; + public $mTimestamp; /** * Target attribute for external links */ - var $mExternalLinkTarget; + public $mExternalLinkTarget; /** * Clean up signature texts? @@ -143,32 +143,32 @@ class ParserOptions { * 1) Strip ~~~, ~~~~ and ~~~~~ out of signatures * 2) Substitute all transclusions */ - var $mCleanSignatures; + public $mCleanSignatures; /** * Transform wiki markup when saving the page? */ - var $mPreSaveTransform = true; + public $mPreSaveTransform = true; /** * Whether content conversion should be disabled */ - var $mDisableContentConversion; + public $mDisableContentConversion; /** * Whether title conversion should be disabled */ - var $mDisableTitleConversion; + public $mDisableTitleConversion; /** * Automatically number headings? */ - var $mNumberHeadings; + public $mNumberHeadings; /** * Thumb size preferred by the user. */ - var $mThumbSize; + public $mThumbSize; /** * Maximum article size of an article to be marked as "stub" @@ -178,169 +178,169 @@ class ParserOptions { /** * Language object of the User language. */ - var $mUserLang; + public $mUserLang; /** * @var User * Stored user object */ - var $mUser; + public $mUser; /** * Parsing the page for a "preview" operation? */ - var $mIsPreview = false; + public $mIsPreview = false; /** * Parsing the page for a "preview" operation on a single section? */ - var $mIsSectionPreview = false; + public $mIsSectionPreview = false; /** * Parsing the printable version of the page? */ - var $mIsPrintable = false; + public $mIsPrintable = false; /** * Extra key that should be present in the caching key. */ - var $mExtraKey = ''; + public $mExtraKey = ''; /** * Function to be called when an option is accessed. */ protected $onAccessCallback = null; - function getInterwikiMagic() { + public function getInterwikiMagic() { return $this->mInterwikiMagic; } - function getAllowExternalImages() { + public function getAllowExternalImages() { return $this->mAllowExternalImages; } - function getAllowExternalImagesFrom() { + public function getAllowExternalImagesFrom() { return $this->mAllowExternalImagesFrom; } - function getEnableImageWhitelist() { + public function getEnableImageWhitelist() { return $this->mEnableImageWhitelist; } - function getEditSection() { + public function getEditSection() { return $this->mEditSection; } - function getNumberHeadings() { + public function getNumberHeadings() { $this->optionUsed( 'numberheadings' ); return $this->mNumberHeadings; } - function getAllowSpecialInclusion() { + public function getAllowSpecialInclusion() { return $this->mAllowSpecialInclusion; } - function getTidy() { + public function getTidy() { return $this->mTidy; } - function getInterfaceMessage() { + public function getInterfaceMessage() { return $this->mInterfaceMessage; } - function getTargetLanguage() { + public function getTargetLanguage() { return $this->mTargetLanguage; } - function getMaxIncludeSize() { + public function getMaxIncludeSize() { return $this->mMaxIncludeSize; } - function getMaxPPNodeCount() { + public function getMaxPPNodeCount() { return $this->mMaxPPNodeCount; } - function getMaxGeneratedPPNodeCount() { + public function getMaxGeneratedPPNodeCount() { return $this->mMaxGeneratedPPNodeCount; } - function getMaxPPExpandDepth() { + public function getMaxPPExpandDepth() { return $this->mMaxPPExpandDepth; } - function getMaxTemplateDepth() { + public function getMaxTemplateDepth() { return $this->mMaxTemplateDepth; } /* @since 1.20 */ - function getExpensiveParserFunctionLimit() { + public function getExpensiveParserFunctionLimit() { return $this->mExpensiveParserFunctionLimit; } - function getRemoveComments() { + public function getRemoveComments() { return $this->mRemoveComments; } - function getTemplateCallback() { + public function getTemplateCallback() { return $this->mTemplateCallback; } - function getEnableLimitReport() { + public function getEnableLimitReport() { return $this->mEnableLimitReport; } - function getCleanSignatures() { + public function getCleanSignatures() { return $this->mCleanSignatures; } - function getExternalLinkTarget() { + public function getExternalLinkTarget() { return $this->mExternalLinkTarget; } - function getDisableContentConversion() { + public function getDisableContentConversion() { return $this->mDisableContentConversion; } - function getDisableTitleConversion() { + public function getDisableTitleConversion() { return $this->mDisableTitleConversion; } - function getThumbSize() { + public function getThumbSize() { $this->optionUsed( 'thumbsize' ); return $this->mThumbSize; } - function getStubThreshold() { + public function getStubThreshold() { $this->optionUsed( 'stubthreshold' ); return $this->mStubThreshold; } - function getIsPreview() { + public function getIsPreview() { return $this->mIsPreview; } - function getIsSectionPreview() { + public function getIsSectionPreview() { return $this->mIsSectionPreview; } - function getIsPrintable() { + public function getIsPrintable() { $this->optionUsed( 'printable' ); return $this->mIsPrintable; } - function getUser() { + public function getUser() { return $this->mUser; } - function getPreSaveTransform() { + public function getPreSaveTransform() { return $this->mPreSaveTransform; } - function getDateFormat() { + public function getDateFormat() { $this->optionUsed( 'dateformat' ); if ( !isset( $this->mDateFormat ) ) { $this->mDateFormat = $this->mUser->getDatePreference(); @@ -348,7 +348,7 @@ class ParserOptions { return $this->mDateFormat; } - function getTimestamp() { + public function getTimestamp() { if ( !isset( $this->mTimestamp ) ) { $this->mTimestamp = wfTimestampNow(); } @@ -371,7 +371,7 @@ class ParserOptions { * @return Language * @since 1.19 */ - function getUserLangObj() { + public function getUserLangObj() { $this->optionUsed( 'userlang' ); return $this->mUserLang; } @@ -382,108 +382,108 @@ class ParserOptions { * @return string Language code * @since 1.17 */ - function getUserLang() { + public function getUserLang() { return $this->getUserLangObj()->getCode(); } - function setInterwikiMagic( $x ) { + public function setInterwikiMagic( $x ) { return wfSetVar( $this->mInterwikiMagic, $x ); } - function setAllowExternalImages( $x ) { + public function setAllowExternalImages( $x ) { return wfSetVar( $this->mAllowExternalImages, $x ); } - function setAllowExternalImagesFrom( $x ) { + public function setAllowExternalImagesFrom( $x ) { return wfSetVar( $this->mAllowExternalImagesFrom, $x ); } - function setEnableImageWhitelist( $x ) { + public function setEnableImageWhitelist( $x ) { return wfSetVar( $this->mEnableImageWhitelist, $x ); } - function setDateFormat( $x ) { + public function setDateFormat( $x ) { return wfSetVar( $this->mDateFormat, $x ); } - function setEditSection( $x ) { + public function setEditSection( $x ) { return wfSetVar( $this->mEditSection, $x ); } - function setNumberHeadings( $x ) { + public function setNumberHeadings( $x ) { return wfSetVar( $this->mNumberHeadings, $x ); } - function setAllowSpecialInclusion( $x ) { + public function setAllowSpecialInclusion( $x ) { return wfSetVar( $this->mAllowSpecialInclusion, $x ); } - function setTidy( $x ) { + public function setTidy( $x ) { return wfSetVar( $this->mTidy, $x ); } - function setInterfaceMessage( $x ) { + public function setInterfaceMessage( $x ) { return wfSetVar( $this->mInterfaceMessage, $x ); } - function setTargetLanguage( $x ) { + public function setTargetLanguage( $x ) { return wfSetVar( $this->mTargetLanguage, $x, true ); } - function setMaxIncludeSize( $x ) { + public function setMaxIncludeSize( $x ) { return wfSetVar( $this->mMaxIncludeSize, $x ); } - function setMaxPPNodeCount( $x ) { + public function setMaxPPNodeCount( $x ) { return wfSetVar( $this->mMaxPPNodeCount, $x ); } - function setMaxGeneratedPPNodeCount( $x ) { + public function setMaxGeneratedPPNodeCount( $x ) { return wfSetVar( $this->mMaxGeneratedPPNodeCount, $x ); } - function setMaxTemplateDepth( $x ) { + public function setMaxTemplateDepth( $x ) { return wfSetVar( $this->mMaxTemplateDepth, $x ); } /* @since 1.20 */ - function setExpensiveParserFunctionLimit( $x ) { + public function setExpensiveParserFunctionLimit( $x ) { return wfSetVar( $this->mExpensiveParserFunctionLimit, $x ); } - function setRemoveComments( $x ) { + public function setRemoveComments( $x ) { return wfSetVar( $this->mRemoveComments, $x ); } - function setTemplateCallback( $x ) { + public function setTemplateCallback( $x ) { return wfSetVar( $this->mTemplateCallback, $x ); } - function enableLimitReport( $x = true ) { + public function enableLimitReport( $x = true ) { return wfSetVar( $this->mEnableLimitReport, $x ); } - function setTimestamp( $x ) { + public function setTimestamp( $x ) { return wfSetVar( $this->mTimestamp, $x ); } - function setCleanSignatures( $x ) { + public function setCleanSignatures( $x ) { return wfSetVar( $this->mCleanSignatures, $x ); } - function setExternalLinkTarget( $x ) { + public function setExternalLinkTarget( $x ) { return wfSetVar( $this->mExternalLinkTarget, $x ); } - function disableContentConversion( $x = true ) { + public function disableContentConversion( $x = true ) { return wfSetVar( $this->mDisableContentConversion, $x ); } - function disableTitleConversion( $x = true ) { + public function disableTitleConversion( $x = true ) { return wfSetVar( $this->mDisableTitleConversion, $x ); } - function setUserLang( $x ) { + public function setUserLang( $x ) { if ( is_string( $x ) ) { $x = Language::factory( $x ); } @@ -491,34 +491,34 @@ class ParserOptions { return wfSetVar( $this->mUserLang, $x ); } - function setThumbSize( $x ) { + public function setThumbSize( $x ) { return wfSetVar( $this->mThumbSize, $x ); } - function setStubThreshold( $x ) { + public function setStubThreshold( $x ) { return wfSetVar( $this->mStubThreshold, $x ); } - function setPreSaveTransform( $x ) { + public function setPreSaveTransform( $x ) { return wfSetVar( $this->mPreSaveTransform, $x ); } - function setIsPreview( $x ) { + public function setIsPreview( $x ) { return wfSetVar( $this->mIsPreview, $x ); } - function setIsSectionPreview( $x ) { + public function setIsSectionPreview( $x ) { return wfSetVar( $this->mIsSectionPreview, $x ); } - function setIsPrintable( $x ) { + public function setIsPrintable( $x ) { return wfSetVar( $this->mIsPrintable, $x ); } /** * Extra key that should be present in the parser cache key. */ - function addExtraKey( $key ) { + public function addExtraKey( $key ) { $this->mExtraKey .= '!' . $key; } @@ -527,7 +527,7 @@ class ParserOptions { * @param User $user * @param Language $lang */ - function __construct( $user = null, $lang = null ) { + public function __construct( $user = null, $lang = null ) { if ( $user === null ) { global $wgUser; if ( $wgUser === null ) { @@ -623,7 +623,7 @@ class ParserOptions { * This is a private API with the parser. * @param callable $callback */ - function registerWatcher( $callback ) { + public function registerWatcher( $callback ) { $this->onAccessCallback = $callback; } diff --git a/includes/parser/ParserOutput.php b/includes/parser/ParserOutput.php index 22b127dad8..95c0a16a29 100644 --- a/includes/parser/ParserOutput.php +++ b/includes/parser/ParserOutput.php @@ -22,7 +22,7 @@ * @ingroup Parser */ class ParserOutput extends CacheTime { - var $mText, # The output text + public $mText, # The output text $mLanguageLinks, # List of the full text of language links, in the order they appear $mCategories, # Map of category names to sort keys $mTitleText, # title text of the chosen language variant @@ -61,7 +61,7 @@ class ParserOutput extends CacheTime { const EDITSECTION_REGEX = '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)())#'; - function __construct( $text = '', $languageLinks = array(), $categoryLinks = array(), + public function __construct( $text = '', $languageLinks = array(), $categoryLinks = array(), $containsOldMagic = false, $titletext = '' ) { $this->mText = $text; @@ -71,7 +71,7 @@ class ParserOutput extends CacheTime { $this->mTitleText = $titletext; } - function getText() { + public function getText() { wfProfileIn( __METHOD__ ); $text = $this->mText; if ( $this->mEditSectionTokens ) { @@ -102,7 +102,7 @@ class ParserOutput extends CacheTime { * @throws MWException * @return mixed */ - function replaceEditSectionLinksCallback( $m ) { + public function replaceEditSectionLinksCallback( $m ) { global $wgOut, $wgLang; $args = array( htmlspecialchars_decode( $m[1] ), @@ -118,181 +118,181 @@ class ParserOutput extends CacheTime { return call_user_func_array( array( $skin, 'doEditSectionLink' ), $args ); } - function &getLanguageLinks() { + public function &getLanguageLinks() { return $this->mLanguageLinks; } - function getInterwikiLinks() { + public function getInterwikiLinks() { return $this->mInterwikiLinks; } - function getCategoryLinks() { + public function getCategoryLinks() { return array_keys( $this->mCategories ); } - function &getCategories() { + public function &getCategories() { return $this->mCategories; } - function getTitleText() { + public function getTitleText() { return $this->mTitleText; } - function getSections() { + public function getSections() { return $this->mSections; } - function getEditSectionTokens() { + public function getEditSectionTokens() { return $this->mEditSectionTokens; } - function &getLinks() { + public function &getLinks() { return $this->mLinks; } - function &getTemplates() { + public function &getTemplates() { return $this->mTemplates; } - function &getTemplateIds() { + public function &getTemplateIds() { return $this->mTemplateIds; } - function &getImages() { + public function &getImages() { return $this->mImages; } - function &getFileSearchOptions() { + public function &getFileSearchOptions() { return $this->mFileSearchOptions; } - function &getExternalLinks() { + public function &getExternalLinks() { return $this->mExternalLinks; } - function getNoGallery() { + public function getNoGallery() { return $this->mNoGallery; } - function getHeadItems() { + public function getHeadItems() { return $this->mHeadItems; } - function getModules() { + public function getModules() { return $this->mModules; } - function getModuleScripts() { + public function getModuleScripts() { return $this->mModuleScripts; } - function getModuleStyles() { + public function getModuleStyles() { return $this->mModuleStyles; } - function getModuleMessages() { + public function getModuleMessages() { return $this->mModuleMessages; } /** @since 1.23 */ - function getJsConfigVars() { + public function getJsConfigVars() { return $this->mJsConfigVars; } - function getOutputHooks() { + public function getOutputHooks() { return (array)$this->mOutputHooks; } - function getWarnings() { + public function getWarnings() { return array_keys( $this->mWarnings ); } - function getIndexPolicy() { + public function getIndexPolicy() { return $this->mIndexPolicy; } - function getTOCHTML() { + public function getTOCHTML() { return $this->mTOCHTML; } - function getTimestamp() { + public function getTimestamp() { return $this->mTimestamp; } - function getLimitReportData() { + public function getLimitReportData() { return $this->mLimitReportData; } - function getTOCEnabled() { + public function getTOCEnabled() { return $this->mTOCEnabled; } - function setText( $text ) { + public function setText( $text ) { return wfSetVar( $this->mText, $text ); } - function setLanguageLinks( $ll ) { + public function setLanguageLinks( $ll ) { return wfSetVar( $this->mLanguageLinks, $ll ); } - function setCategoryLinks( $cl ) { + public function setCategoryLinks( $cl ) { return wfSetVar( $this->mCategories, $cl ); } - function setTitleText( $t ) { + public function setTitleText( $t ) { return wfSetVar( $this->mTitleText, $t ); } - function setSections( $toc ) { + public function setSections( $toc ) { return wfSetVar( $this->mSections, $toc ); } - function setEditSectionTokens( $t ) { + public function setEditSectionTokens( $t ) { return wfSetVar( $this->mEditSectionTokens, $t ); } - function setIndexPolicy( $policy ) { + public function setIndexPolicy( $policy ) { return wfSetVar( $this->mIndexPolicy, $policy ); } - function setTOCHTML( $tochtml ) { + public function setTOCHTML( $tochtml ) { return wfSetVar( $this->mTOCHTML, $tochtml ); } - function setTimestamp( $timestamp ) { + public function setTimestamp( $timestamp ) { return wfSetVar( $this->mTimestamp, $timestamp ); } - function setTOCEnabled( $flag ) { + public function setTOCEnabled( $flag ) { return wfSetVar( $this->mTOCEnabled, $flag ); } - function addCategory( $c, $sort ) { + public function addCategory( $c, $sort ) { $this->mCategories[$c] = $sort; } - function addLanguageLink( $t ) { + public function addLanguageLink( $t ) { $this->mLanguageLinks[] = $t; } - function addWarning( $s ) { + public function addWarning( $s ) { $this->mWarnings[$s] = 1; } - function addOutputHook( $hook, $data = false ) { + public function addOutputHook( $hook, $data = false ) { $this->mOutputHooks[] = array( $hook, $data ); } - function setNewSection( $value ) { + public function setNewSection( $value ) { $this->mNewSection = (bool)$value; } - function hideNewSection( $value ) { + public function hideNewSection( $value ) { $this->mHideNewSection = (bool)$value; } - function getHideNewSection() { + public function getHideNewSection() { return (bool)$this->mHideNewSection; } - function getNewSection() { + public function getNewSection() { return (bool)$this->mNewSection; } @@ -303,7 +303,7 @@ class ParserOutput extends CacheTime { * @param string $url The url to check * @return bool */ - static function isLinkInternal( $internal, $url ) { + public static function isLinkInternal( $internal, $url ) { return (bool)preg_match( '/^' . # If server is proto relative, check also for http/https links ( substr( $internal, 0, 2 ) === '//' ? '(?:https?:)?' : '' ) . @@ -314,7 +314,7 @@ class ParserOutput extends CacheTime { ); } - function addExternalLink( $url ) { + public function addExternalLink( $url ) { # We don't register links pointing to our own server, unless... :-) global $wgServer, $wgRegisterInternalExternals; @@ -333,7 +333,7 @@ class ParserOutput extends CacheTime { * @param Title $title * @param int|null $id Optional known page_id so we can skip the lookup */ - function addLink( Title $title, $id = null ) { + public function addLink( Title $title, $id = null ) { if ( $title->isExternal() ) { // Don't record interwikis in pagelinks $this->addInterwikiLink( $title ); @@ -368,7 +368,7 @@ class ParserOutput extends CacheTime { * @param string $sha1 Base 36 SHA-1 of file (or false if non-existing) * @return void */ - function addImage( $name, $timestamp = null, $sha1 = null ) { + public function addImage( $name, $timestamp = null, $sha1 = null ) { $this->mImages[$name] = 1; if ( $timestamp !== null && $sha1 !== null ) { $this->mFileSearchOptions[$name] = array( 'time' => $timestamp, 'sha1' => $sha1 ); @@ -382,7 +382,7 @@ class ParserOutput extends CacheTime { * @param int $rev_id * @return void */ - function addTemplate( $title, $page_id, $rev_id ) { + public function addTemplate( $title, $page_id, $rev_id ) { $ns = $title->getNamespace(); $dbk = $title->getDBkey(); if ( !isset( $this->mTemplates[$ns] ) ) { @@ -399,7 +399,7 @@ class ParserOutput extends CacheTime { * @param Title $title Title object, must be an interwiki link * @throws MWException If given invalid input */ - function addInterwikiLink( $title ) { + public function addInterwikiLink( $title ) { if ( !$title->isExternal() ) { throw new MWException( 'Non-interwiki link passed, internal parser error.' ); } @@ -417,7 +417,7 @@ class ParserOutput extends CacheTime { * @param string $section * @param string|bool $tag */ - function addHeadItem( $section, $tag = false ) { + public function addHeadItem( $section, $tag = false ) { if ( $tag !== false ) { $this->mHeadItems[$tag] = $section; } else { @@ -748,7 +748,7 @@ class ParserOutput extends CacheTime { * Resets the parse start timestamps for future calls to getTimeSinceStart() * @since 1.22 */ - function resetParseStartTime() { + public function resetParseStartTime() { $this->mParseStartTime = self::getTimes(); } @@ -763,7 +763,7 @@ class ParserOutput extends CacheTime { * @param string $clock * @return float|null */ - function getTimeSinceStart( $clock ) { + public function getTimeSinceStart( $clock ) { if ( !isset( $this->mParseStartTime[$clock] ) ) { return null; } @@ -791,7 +791,7 @@ class ParserOutput extends CacheTime { * @param string $key Message key * @param mixed $value Appropriate for Message::params() */ - function setLimitReportData( $key, $value ) { + public function setLimitReportData( $key, $value ) { $this->mLimitReportData[$key] = $value; } @@ -809,7 +809,7 @@ class ParserOutput extends CacheTime { /** * Save space for for serialization by removing useless values */ - function __sleep() { + public function __sleep() { return array_diff( array_keys( get_object_vars( $this ) ), array( 'mSecondaryDataUpdates', 'mParseStartTime' ) diff --git a/includes/parser/Preprocessor.php b/includes/parser/Preprocessor.php index 335bd61ed5..77ffe9dc86 100644 --- a/includes/parser/Preprocessor.php +++ b/includes/parser/Preprocessor.php @@ -30,14 +30,14 @@ interface Preprocessor { * * @param Parser $parser */ - function __construct( $parser ); + public function __construct( $parser ); /** * Create a new top-level frame for expansion of a page * * @return PPFrame */ - function newFrame(); + public function newFrame(); /** * Create a new custom frame for programmatic use of parameter replacement @@ -47,7 +47,7 @@ interface Preprocessor { * * @return PPFrame */ - function newCustomFrame( $args ); + public function newCustomFrame( $args ); /** * Create a new custom node for programmatic use of parameter replacement @@ -55,7 +55,7 @@ interface Preprocessor { * * @param array $values */ - function newPartNodeArray( $values ); + public function newPartNodeArray( $values ); /** * Preprocess text to a PPNode @@ -65,7 +65,7 @@ interface Preprocessor { * * @return PPNode */ - function preprocessToObj( $text, $flags = 0 ); + public function preprocessToObj( $text, $flags = 0 ); } /** @@ -93,65 +93,65 @@ interface PPFrame { * * @return PPFrame */ - function newChild( $args = false, $title = false, $indexOffset = 0 ); + public function newChild( $args = false, $title = false, $indexOffset = 0 ); /** * Expand a document tree node, caching the result on its parent with the given key */ - function cachedExpand( $key, $root, $flags = 0 ); + public function cachedExpand( $key, $root, $flags = 0 ); /** * Expand a document tree node */ - function expand( $root, $flags = 0 ); + public function expand( $root, $flags = 0 ); /** * Implode with flags for expand() */ - function implodeWithFlags( $sep, $flags /*, ... */ ); + public function implodeWithFlags( $sep, $flags /*, ... */ ); /** * Implode with no flags specified */ - function implode( $sep /*, ... */ ); + public function implode( $sep /*, ... */ ); /** * Makes an object that, when expand()ed, will be the same as one obtained * with implode() */ - function virtualImplode( $sep /*, ... */ ); + public function virtualImplode( $sep /*, ... */ ); /** * Virtual implode with brackets */ - function virtualBracketedImplode( $start, $sep, $end /*, ... */ ); + public function virtualBracketedImplode( $start, $sep, $end /*, ... */ ); /** * Returns true if there are no arguments in this frame * * @return bool */ - function isEmpty(); + public function isEmpty(); /** * Returns all arguments of this frame */ - function getArguments(); + public function getArguments(); /** * Returns all numbered arguments of this frame */ - function getNumberedArguments(); + public function getNumberedArguments(); /** * Returns all named arguments of this frame */ - function getNamedArguments(); + public function getNamedArguments(); /** * Get an argument to this frame by name */ - function getArgument( $name ); + public function getArgument( $name ); /** * Returns true if the infinite loop check is OK, false if a loop is detected @@ -159,12 +159,12 @@ interface PPFrame { * @param Title $title * @return bool */ - function loopCheck( $title ); + public function loopCheck( $title ); /** * Return true if the frame is a template frame */ - function isTemplate(); + public function isTemplate(); /** * Set the "volatile" flag. @@ -177,7 +177,7 @@ interface PPFrame { * * @param bool $flag */ - function setVolatile( $flag = true ); + public function setVolatile( $flag = true ); /** * Get the "volatile" flag. @@ -188,7 +188,7 @@ interface PPFrame { * @see self::setVolatile() * @return bool */ - function isVolatile(); + public function isVolatile(); /** * Get the TTL of the frame's output. @@ -202,7 +202,7 @@ interface PPFrame { * * @return int|null */ - function getTTL(); + public function getTTL(); /** * Set the TTL of the output of this frame and all of its ancestors. @@ -213,14 +213,14 @@ interface PPFrame { * @see self::getTTL() * @param int $ttl */ - function setTTL( $ttl ); + public function setTTL( $ttl ); /** * Get a title of frame * * @return Title */ - function getTitle(); + public function getTitle(); } /** @@ -241,35 +241,35 @@ interface PPNode { * Get an array-type node containing the children of this node. * Returns false if this is not a tree node. */ - function getChildren(); + public function getChildren(); /** * Get the first child of a tree node. False if there isn't one. * * @return PPNode */ - function getFirstChild(); + public function getFirstChild(); /** * Get the next sibling of any node. False if there isn't one */ - function getNextSibling(); + public function getNextSibling(); /** * Get all children of this tree node which have a given name. * Returns an array-type node, or false if this is not a tree node. */ - function getChildrenOfType( $type ); + public function getChildrenOfType( $type ); /** * Returns the length of the array, or false if this is not an array-type node */ - function getLength(); + public function getLength(); /** * Returns an item of an array-type node */ - function item( $i ); + public function item( $i ); /** * Get the name of this node. The following names are defined here: @@ -283,7 +283,7 @@ interface PPNode { * * The subclass may define various other names for tree and leaf nodes. */ - function getName(); + public function getName(); /** * Split a "" node into an associative array containing: @@ -291,16 +291,16 @@ interface PPNode { * index String index * value PPNode value */ - function splitArg(); + public function splitArg(); /** * Split an "" node into an associative array containing name, attr, inner and close * All values in the resulting array are PPNodes. Inner and close are optional. */ - function splitExt(); + public function splitExt(); /** * Split an "" node */ - function splitHeading(); + public function splitHeading(); } diff --git a/includes/parser/Preprocessor_DOM.php b/includes/parser/Preprocessor_DOM.php index f5fc3ec669..6136555a46 100644 --- a/includes/parser/Preprocessor_DOM.php +++ b/includes/parser/Preprocessor_DOM.php @@ -23,19 +23,21 @@ /** * @ingroup Parser + * @codingStandardsIgnoreStart */ class Preprocessor_DOM implements Preprocessor { + // @codingStandardsIgnoreEnd /** * @var Parser */ - var $parser; + public $parser; - var $memoryLimit; + public $memoryLimit; const CACHE_VERSION = 1; - function __construct( $parser ) { + public function __construct( $parser ) { $this->parser = $parser; $mem = ini_get( 'memory_limit' ); $this->memoryLimit = false; @@ -51,7 +53,7 @@ class Preprocessor_DOM implements Preprocessor { /** * @return PPFrame_DOM */ - function newFrame() { + public function newFrame() { return new PPFrame_DOM( $this ); } @@ -59,7 +61,7 @@ class Preprocessor_DOM implements Preprocessor { * @param array $args * @return PPCustomFrame_DOM */ - function newCustomFrame( $args ) { + public function newCustomFrame( $args ) { return new PPCustomFrame_DOM( $this, $args ); } @@ -67,7 +69,7 @@ class Preprocessor_DOM implements Preprocessor { * @param array $values * @return PPNode_DOM */ - function newPartNodeArray( $values ) { + public function newPartNodeArray( $values ) { //NOTE: DOM manipulation is slower than building & parsing XML! (or so Tim sais) $xml = ""; @@ -110,7 +112,7 @@ class Preprocessor_DOM implements Preprocessor { * @throws MWException * @return bool */ - function memCheck() { + public function memCheck() { if ( $this->memoryLimit === false ) { return true; } @@ -146,7 +148,7 @@ class Preprocessor_DOM implements Preprocessor { * @throws MWException * @return PPNode_DOM */ - function preprocessToObj( $text, $flags = 0 ) { + public function preprocessToObj( $text, $flags = 0 ) { wfProfileIn( __METHOD__ ); global $wgMemc, $wgPreprocessorCacheThreshold; @@ -224,7 +226,7 @@ class Preprocessor_DOM implements Preprocessor { * @param int $flags * @return string */ - function preprocessToXml( $text, $flags = 0 ) { + public function preprocessToXml( $text, $flags = 0 ) { wfProfileIn( __METHOD__ ); $rules = array( '{' => array( @@ -773,18 +775,18 @@ class Preprocessor_DOM implements Preprocessor { * @ingroup Parser */ class PPDStack { - var $stack, $rootAccum; + public $stack, $rootAccum; /** * @var PPDStack */ - var $top; - var $out; - var $elementClass = 'PPDStackElement'; + public $top; + public $out; + public $elementClass = 'PPDStackElement'; - static $false = false; + public static $false = false; - function __construct() { + public function __construct() { $this->stack = array(); $this->top = false; $this->rootAccum = ''; @@ -794,15 +796,15 @@ class PPDStack { /** * @return int */ - function count() { + public function count() { return count( $this->stack ); } - function &getAccum() { + public function &getAccum() { return $this->accum; } - function getCurrentPart() { + public function getCurrentPart() { if ( $this->top === false ) { return false; } else { @@ -810,7 +812,7 @@ class PPDStack { } } - function push( $data ) { + public function push( $data ) { if ( $data instanceof $this->elementClass ) { $this->stack[] = $data; } else { @@ -821,7 +823,7 @@ class PPDStack { $this->accum =& $this->top->getAccum(); } - function pop() { + public function pop() { if ( !count( $this->stack ) ) { throw new MWException( __METHOD__ . ': no elements remaining' ); } @@ -837,7 +839,7 @@ class PPDStack { return $temp; } - function addPart( $s = '' ) { + public function addPart( $s = '' ) { $this->top->addPart( $s ); $this->accum =& $this->top->getAccum(); } @@ -845,7 +847,7 @@ class PPDStack { /** * @return array */ - function getFlags() { + public function getFlags() { if ( !count( $this->stack ) ) { return array( 'findEquals' => false, @@ -862,15 +864,15 @@ class PPDStack { * @ingroup Parser */ class PPDStackElement { - var $open, // Opening character (\n for heading) + public $open, // Opening character (\n for heading) $close, // Matching closing character $count, // Number of opening characters found (number of "=" for heading) $parts, // Array of PPDPart objects describing pipe-separated parts. $lineStart; // True if the open char appeared at the start of the input line. Not set for headings. - var $partClass = 'PPDPart'; + public $partClass = 'PPDPart'; - function __construct( $data = array() ) { + public function __construct( $data = array() ) { $class = $this->partClass; $this->parts = array( new $class ); @@ -879,23 +881,23 @@ class PPDStackElement { } } - function &getAccum() { + public function &getAccum() { return $this->parts[count( $this->parts ) - 1]->out; } - function addPart( $s = '' ) { + public function addPart( $s = '' ) { $class = $this->partClass; $this->parts[] = new $class( $s ); } - function getCurrentPart() { + public function getCurrentPart() { return $this->parts[count( $this->parts ) - 1]; } /** * @return array */ - function getFlags() { + public function getFlags() { $partCount = count( $this->parts ); $findPipe = $this->open != "\n" && $this->open != '['; return array( @@ -911,7 +913,7 @@ class PPDStackElement { * @param bool|int $openingCount * @return string */ - function breakSyntax( $openingCount = false ) { + public function breakSyntax( $openingCount = false ) { if ( $this->open == "\n" ) { $s = $this->parts[0]->out; } else { @@ -937,14 +939,14 @@ class PPDStackElement { * @ingroup Parser */ class PPDPart { - var $out; // Output accumulator string + public $out; // Output accumulator string // Optional member variables: // eqpos Position of equals sign in output accumulator // commentEnd Past-the-end input pointer for the last comment encountered // visualEnd Past-the-end input pointer for the end of the accumulator minus comments - function __construct( $out = '' ) { + public function __construct( $out = '' ) { $this->out = $out; } } @@ -952,36 +954,38 @@ class PPDPart { /** * An expansion frame, used as a context to expand the result of preprocessToObj() * @ingroup Parser + * @codingStandardsIgnoreStart */ class PPFrame_DOM implements PPFrame { + // @codingStandardsIgnoreEnd /** * @var Preprocessor */ - var $preprocessor; + public $preprocessor; /** * @var Parser */ - var $parser; + public $parser; /** * @var Title */ - var $title; - var $titleCache; + public $title; + public $titleCache; /** * Hashtable listing templates which are disallowed for expansion in this frame, * having been encountered previously in parent frames. */ - var $loopCheckHash; + public $loopCheckHash; /** * Recursion depth of this frame, top = 0 * Note that this is NOT the same as expansion depth in expand() */ - var $depth; + public $depth; private $volatile = false; private $ttl = null; @@ -995,7 +999,7 @@ class PPFrame_DOM implements PPFrame { * Construct a new preprocessor frame. * @param Preprocessor $preprocessor The parent preprocessor */ - function __construct( $preprocessor ) { + public function __construct( $preprocessor ) { $this->preprocessor = $preprocessor; $this->parser = $preprocessor->parser; $this->title = $this->parser->mTitle; @@ -1014,7 +1018,7 @@ class PPFrame_DOM implements PPFrame { * @param int $indexOffset * @return PPTemplateFrame_DOM */ - function newChild( $args = false, $title = false, $indexOffset = 0 ) { + public function newChild( $args = false, $title = false, $indexOffset = 0 ) { $namedArgs = array(); $numberedArgs = array(); if ( $title === false ) { @@ -1059,7 +1063,7 @@ class PPFrame_DOM implements PPFrame { * @param int $flags * @return string */ - function cachedExpand( $key, $root, $flags = 0 ) { + public function cachedExpand( $key, $root, $flags = 0 ) { // we don't have a parent, so we don't have a cache return $this->expand( $root, $flags ); } @@ -1070,7 +1074,7 @@ class PPFrame_DOM implements PPFrame { * @param int $flags * @return string */ - function expand( $root, $flags = 0 ) { + public function expand( $root, $flags = 0 ) { static $expansionDepth = 0; if ( is_string( $root ) ) { return $root; @@ -1313,7 +1317,7 @@ class PPFrame_DOM implements PPFrame { * @param int $flags * @return string */ - function implodeWithFlags( $sep, $flags /*, ... */ ) { + public function implodeWithFlags( $sep, $flags /*, ... */ ) { $args = array_slice( func_get_args(), 2 ); $first = true; @@ -1344,7 +1348,7 @@ class PPFrame_DOM implements PPFrame { * @param string $sep * @return string */ - function implode( $sep /*, ... */ ) { + public function implode( $sep /*, ... */ ) { $args = array_slice( func_get_args(), 1 ); $first = true; @@ -1375,7 +1379,7 @@ class PPFrame_DOM implements PPFrame { * @param string $sep * @return array */ - function virtualImplode( $sep /*, ... */ ) { + public function virtualImplode( $sep /*, ... */ ) { $args = array_slice( func_get_args(), 1 ); $out = array(); $first = true; @@ -1406,7 +1410,7 @@ class PPFrame_DOM implements PPFrame { * @param string $end * @return array */ - function virtualBracketedImplode( $start, $sep, $end /*, ... */ ) { + public function virtualBracketedImplode( $start, $sep, $end /*, ... */ ) { $args = array_slice( func_get_args(), 3 ); $out = array( $start ); $first = true; @@ -1431,11 +1435,11 @@ class PPFrame_DOM implements PPFrame { return $out; } - function __toString() { + public function __toString() { return 'frame{}'; } - function getPDBK( $level = false ) { + public function getPDBK( $level = false ) { if ( $level === false ) { return $this->title->getPrefixedDBkey(); } else { @@ -1446,21 +1450,21 @@ class PPFrame_DOM implements PPFrame { /** * @return array */ - function getArguments() { + public function getArguments() { return array(); } /** * @return array */ - function getNumberedArguments() { + public function getNumberedArguments() { return array(); } /** * @return array */ - function getNamedArguments() { + public function getNamedArguments() { return array(); } @@ -1469,11 +1473,11 @@ class PPFrame_DOM implements PPFrame { * * @return bool */ - function isEmpty() { + public function isEmpty() { return true; } - function getArgument( $name ) { + public function getArgument( $name ) { return false; } @@ -1483,7 +1487,7 @@ class PPFrame_DOM implements PPFrame { * @param Title $title * @return bool */ - function loopCheck( $title ) { + public function loopCheck( $title ) { return !isset( $this->loopCheckHash[$title->getPrefixedDBkey()] ); } @@ -1492,7 +1496,7 @@ class PPFrame_DOM implements PPFrame { * * @return bool */ - function isTemplate() { + public function isTemplate() { return false; } @@ -1501,7 +1505,7 @@ class PPFrame_DOM implements PPFrame { * * @return Title */ - function getTitle() { + public function getTitle() { return $this->title; } @@ -1510,7 +1514,7 @@ class PPFrame_DOM implements PPFrame { * * @param bool $flag */ - function setVolatile( $flag = true ) { + public function setVolatile( $flag = true ) { $this->volatile = $flag; } @@ -1519,7 +1523,7 @@ class PPFrame_DOM implements PPFrame { * * @return bool */ - function isVolatile() { + public function isVolatile() { return $this->volatile; } @@ -1528,7 +1532,7 @@ class PPFrame_DOM implements PPFrame { * * @param int $ttl */ - function setTTL( $ttl ) { + public function setTTL( $ttl ) { if ( $ttl !== null && ( $this->ttl === null || $ttl < $this->ttl ) ) { $this->ttl = $ttl; } @@ -1539,7 +1543,7 @@ class PPFrame_DOM implements PPFrame { * * @return int|null */ - function getTTL() { + public function getTTL() { return $this->ttl; } } @@ -1547,15 +1551,18 @@ class PPFrame_DOM implements PPFrame { /** * Expansion frame with template arguments * @ingroup Parser + * @codingStandardsIgnoreStart */ class PPTemplateFrame_DOM extends PPFrame_DOM { - var $numberedArgs, $namedArgs; + // @codingStandardsIgnoreEnd + + public $numberedArgs, $namedArgs; /** * @var PPFrame_DOM */ - var $parent; - var $numberedExpansionCache, $namedExpansionCache; + public $parent; + public $numberedExpansionCache, $namedExpansionCache; /** * @param Preprocessor $preprocessor @@ -1564,7 +1571,7 @@ class PPTemplateFrame_DOM extends PPFrame_DOM { * @param array $namedArgs * @param bool|Title $title */ - function __construct( $preprocessor, $parent = false, $numberedArgs = array(), + public function __construct( $preprocessor, $parent = false, $numberedArgs = array(), $namedArgs = array(), $title = false ) { parent::__construct( $preprocessor ); @@ -1584,7 +1591,7 @@ class PPTemplateFrame_DOM extends PPFrame_DOM { $this->numberedExpansionCache = $this->namedExpansionCache = array(); } - function __toString() { + public function __toString() { $s = 'tplframe{'; $first = true; $args = $this->numberedArgs + $this->namedArgs; @@ -1608,7 +1615,7 @@ class PPTemplateFrame_DOM extends PPFrame_DOM { * @param int $flags * @return string */ - function cachedExpand( $key, $root, $flags = 0 ) { + public function cachedExpand( $key, $root, $flags = 0 ) { if ( isset( $this->parent->childExpansionCache[$key] ) ) { return $this->parent->childExpansionCache[$key]; } @@ -1624,11 +1631,11 @@ class PPTemplateFrame_DOM extends PPFrame_DOM { * * @return bool */ - function isEmpty() { + public function isEmpty() { return !count( $this->numberedArgs ) && !count( $this->namedArgs ); } - function getArguments() { + public function getArguments() { $arguments = array(); foreach ( array_merge( array_keys( $this->numberedArgs ), @@ -1638,7 +1645,7 @@ class PPTemplateFrame_DOM extends PPFrame_DOM { return $arguments; } - function getNumberedArguments() { + public function getNumberedArguments() { $arguments = array(); foreach ( array_keys( $this->numberedArgs ) as $key ) { $arguments[$key] = $this->getArgument( $key ); @@ -1646,7 +1653,7 @@ class PPTemplateFrame_DOM extends PPFrame_DOM { return $arguments; } - function getNamedArguments() { + public function getNamedArguments() { $arguments = array(); foreach ( array_keys( $this->namedArgs ) as $key ) { $arguments[$key] = $this->getArgument( $key ); @@ -1654,7 +1661,7 @@ class PPTemplateFrame_DOM extends PPFrame_DOM { return $arguments; } - function getNumberedArgument( $index ) { + public function getNumberedArgument( $index ) { if ( !isset( $this->numberedArgs[$index] ) ) { return false; } @@ -1668,7 +1675,7 @@ class PPTemplateFrame_DOM extends PPFrame_DOM { return $this->numberedExpansionCache[$index]; } - function getNamedArgument( $name ) { + public function getNamedArgument( $name ) { if ( !isset( $this->namedArgs[$name] ) ) { return false; } @@ -1680,7 +1687,7 @@ class PPTemplateFrame_DOM extends PPFrame_DOM { return $this->namedExpansionCache[$name]; } - function getArgument( $name ) { + public function getArgument( $name ) { $text = $this->getNumberedArgument( $name ); if ( $text === false ) { $text = $this->getNamedArgument( $name ); @@ -1693,16 +1700,16 @@ class PPTemplateFrame_DOM extends PPFrame_DOM { * * @return bool */ - function isTemplate() { + public function isTemplate() { return true; } - function setVolatile( $flag = true ) { + public function setVolatile( $flag = true ) { parent::setVolatile( $flag ); $this->parent->setVolatile( $flag ); } - function setTTL( $ttl ) { + public function setTTL( $ttl ) { parent::setTTL( $ttl ); $this->parent->setTTL( $ttl ); } @@ -1711,16 +1718,19 @@ class PPTemplateFrame_DOM extends PPFrame_DOM { /** * Expansion frame with custom arguments * @ingroup Parser + * @codingStandardsIgnoreStart */ class PPCustomFrame_DOM extends PPFrame_DOM { - var $args; + // @codingStandardsIgnoreEnd + + public $args; - function __construct( $preprocessor, $args ) { + public function __construct( $preprocessor, $args ) { parent::__construct( $preprocessor ); $this->args = $args; } - function __toString() { + public function __toString() { $s = 'cstmframe{'; $first = true; foreach ( $this->args as $name => $value ) { @@ -1739,48 +1749,50 @@ class PPCustomFrame_DOM extends PPFrame_DOM { /** * @return bool */ - function isEmpty() { + public function isEmpty() { return !count( $this->args ); } - function getArgument( $index ) { + public function getArgument( $index ) { if ( !isset( $this->args[$index] ) ) { return false; } return $this->args[$index]; } - function getArguments() { + public function getArguments() { return $this->args; } } /** * @ingroup Parser + * @codingStandardsIgnoreStart */ class PPNode_DOM implements PPNode { + // @codingStandardsIgnoreEnd /** * @var DOMElement */ - var $node; - var $xpath; + public $node; + public $xpath; - function __construct( $node, $xpath = false ) { + public function __construct( $node, $xpath = false ) { $this->node = $node; } /** * @return DOMXPath */ - function getXPath() { + public function getXPath() { if ( $this->xpath === null ) { $this->xpath = new DOMXPath( $this->node->ownerDocument ); } return $this->xpath; } - function __toString() { + public function __toString() { if ( $this->node instanceof DOMNodeList ) { $s = ''; foreach ( $this->node as $node ) { @@ -1795,21 +1807,21 @@ class PPNode_DOM implements PPNode { /** * @return bool|PPNode_DOM */ - function getChildren() { + public function getChildren() { return $this->node->childNodes ? new self( $this->node->childNodes ) : false; } /** * @return bool|PPNode_DOM */ - function getFirstChild() { + public function getFirstChild() { return $this->node->firstChild ? new self( $this->node->firstChild ) : false; } /** * @return bool|PPNode_DOM */ - function getNextSibling() { + public function getNextSibling() { return $this->node->nextSibling ? new self( $this->node->nextSibling ) : false; } @@ -1818,14 +1830,14 @@ class PPNode_DOM implements PPNode { * * @return bool|PPNode_DOM */ - function getChildrenOfType( $type ) { + public function getChildrenOfType( $type ) { return new self( $this->getXPath()->query( $type, $this->node ) ); } /** * @return int */ - function getLength() { + public function getLength() { if ( $this->node instanceof DOMNodeList ) { return $this->node->length; } else { @@ -1837,7 +1849,7 @@ class PPNode_DOM implements PPNode { * @param int $i * @return bool|PPNode_DOM */ - function item( $i ) { + public function item( $i ) { $item = $this->node->item( $i ); return $item ? new self( $item ) : false; } @@ -1845,7 +1857,7 @@ class PPNode_DOM implements PPNode { /** * @return string */ - function getName() { + public function getName() { if ( $this->node instanceof DOMNodeList ) { return '#nodelist'; } else { @@ -1862,7 +1874,7 @@ class PPNode_DOM implements PPNode { * @throws MWException * @return array */ - function splitArg() { + public function splitArg() { $xpath = $this->getXPath(); $names = $xpath->query( 'name', $this->node ); $values = $xpath->query( 'value', $this->node ); @@ -1884,7 +1896,7 @@ class PPNode_DOM implements PPNode { * @throws MWException * @return array */ - function splitExt() { + public function splitExt() { $xpath = $this->getXPath(); $names = $xpath->query( 'name', $this->node ); $attrs = $xpath->query( 'attr', $this->node ); @@ -1910,7 +1922,7 @@ class PPNode_DOM implements PPNode { * @throws MWException * @return array */ - function splitHeading() { + public function splitHeading() { if ( $this->getName() !== 'h' ) { throw new MWException( 'Invalid h node passed to ' . __METHOD__ ); } diff --git a/includes/parser/Preprocessor_Hash.php b/includes/parser/Preprocessor_Hash.php index 26daca18ca..f75183291d 100644 --- a/includes/parser/Preprocessor_Hash.php +++ b/includes/parser/Preprocessor_Hash.php @@ -26,23 +26,26 @@ * * attribute nodes are children * * "" nodes that aren't at the top are replaced with * @ingroup Parser + * @codingStandardsIgnoreStart */ class Preprocessor_Hash implements Preprocessor { + // @codingStandardsIgnoreEnd + /** * @var Parser */ - var $parser; + public $parser; const CACHE_VERSION = 1; - function __construct( $parser ) { + public function __construct( $parser ) { $this->parser = $parser; } /** * @return PPFrame_Hash */ - function newFrame() { + public function newFrame() { return new PPFrame_Hash( $this ); } @@ -50,7 +53,7 @@ class Preprocessor_Hash implements Preprocessor { * @param array $args * @return PPCustomFrame_Hash */ - function newCustomFrame( $args ) { + public function newCustomFrame( $args ) { return new PPCustomFrame_Hash( $this, $args ); } @@ -58,7 +61,7 @@ class Preprocessor_Hash implements Preprocessor { * @param array $values * @return PPNode_Hash_Array */ - function newPartNodeArray( $values ) { + public function newPartNodeArray( $values ) { $list = array(); foreach ( $values as $k => $val ) { @@ -108,7 +111,7 @@ class Preprocessor_Hash implements Preprocessor { * @throws MWException * @return PPNode_Hash_Tree */ - function preprocessToObj( $text, $flags = 0 ) { + public function preprocessToObj( $text, $flags = 0 ) { wfProfileIn( __METHOD__ ); // Check cache. @@ -758,9 +761,12 @@ class Preprocessor_Hash implements Preprocessor { /** * Stack class to help Preprocessor::preprocessToObj() * @ingroup Parser + * @codingStandardsIgnoreStart */ class PPDStack_Hash extends PPDStack { - function __construct() { + // @codingStandardsIgnoreEnd + + public function __construct() { $this->elementClass = 'PPDStackElement_Hash'; parent::__construct(); $this->rootAccum = new PPDAccum_Hash; @@ -769,9 +775,12 @@ class PPDStack_Hash extends PPDStack { /** * @ingroup Parser + * @codingStandardsIgnoreStart */ class PPDStackElement_Hash extends PPDStackElement { - function __construct( $data = array() ) { + // @codingStandardsIgnoreENd + + public function __construct( $data = array() ) { $this->partClass = 'PPDPart_Hash'; parent::__construct( $data ); } @@ -782,7 +791,7 @@ class PPDStackElement_Hash extends PPDStackElement { * @param int|bool $openingCount * @return PPDAccum_Hash */ - function breakSyntax( $openingCount = false ) { + public function breakSyntax( $openingCount = false ) { if ( $this->open == "\n" ) { $accum = $this->parts[0]->out; } else { @@ -807,9 +816,12 @@ class PPDStackElement_Hash extends PPDStackElement { /** * @ingroup Parser + * @codingStandardsIgnoreStart */ class PPDPart_Hash extends PPDPart { - function __construct( $out = '' ) { + // @codingStandardsIgnoreEnd + + public function __construct( $out = '' ) { $accum = new PPDAccum_Hash; if ( $out !== '' ) { $accum->addLiteral( $out ); @@ -820,11 +832,14 @@ class PPDPart_Hash extends PPDPart { /** * @ingroup Parser + * @codingStandardsIgnoreStart */ class PPDAccum_Hash { - var $firstNode, $lastNode; + // @codingStandardsIgnoreEnd + + public $firstNode, $lastNode; - function __construct() { + public function __construct() { $this->firstNode = $this->lastNode = false; } @@ -832,7 +847,7 @@ class PPDAccum_Hash { * Append a string literal * @param string $s */ - function addLiteral( $s ) { + public function addLiteral( $s ) { if ( $this->lastNode === false ) { $this->firstNode = $this->lastNode = new PPNode_Hash_Text( $s ); } elseif ( $this->lastNode instanceof PPNode_Hash_Text ) { @@ -847,7 +862,7 @@ class PPDAccum_Hash { * Append a PPNode * @param PPNode $node */ - function addNode( PPNode $node ) { + public function addNode( PPNode $node ) { if ( $this->lastNode === false ) { $this->firstNode = $this->lastNode = $node; } else { @@ -861,7 +876,7 @@ class PPDAccum_Hash { * @param string $name * @param string $value */ - function addNodeWithText( $name, $value ) { + public function addNodeWithText( $name, $value ) { $node = PPNode_Hash_Tree::newWithText( $name, $value ); $this->addNode( $node ); } @@ -872,7 +887,7 @@ class PPDAccum_Hash { * subsequently be modified, especially nextSibling. * @param PPDAccum_Hash $accum */ - function addAccum( $accum ) { + public function addAccum( $accum ) { if ( $accum->lastNode === false ) { // nothing to add } elseif ( $this->lastNode === false ) { @@ -888,36 +903,38 @@ class PPDAccum_Hash { /** * An expansion frame, used as a context to expand the result of preprocessToObj() * @ingroup Parser + * @codingStandardsIgnoreStart */ class PPFrame_Hash implements PPFrame { + // @codingStandardsIgnoreEnd /** * @var Parser */ - var $parser; + public $parser; /** * @var Preprocessor */ - var $preprocessor; + public $preprocessor; /** * @var Title */ - var $title; - var $titleCache; + public $title; + public $titleCache; /** * Hashtable listing templates which are disallowed for expansion in this frame, * having been encountered previously in parent frames. */ - var $loopCheckHash; + public $loopCheckHash; /** * Recursion depth of this frame, top = 0 * Note that this is NOT the same as expansion depth in expand() */ - var $depth; + public $depth; private $volatile = false; private $ttl = null; @@ -931,7 +948,7 @@ class PPFrame_Hash implements PPFrame { * Construct a new preprocessor frame. * @param Preprocessor $preprocessor The parent preprocessor */ - function __construct( $preprocessor ) { + public function __construct( $preprocessor ) { $this->preprocessor = $preprocessor; $this->parser = $preprocessor->parser; $this->title = $this->parser->mTitle; @@ -951,7 +968,7 @@ class PPFrame_Hash implements PPFrame { * @throws MWException * @return PPTemplateFrame_Hash */ - function newChild( $args = false, $title = false, $indexOffset = 0 ) { + public function newChild( $args = false, $title = false, $indexOffset = 0 ) { $namedArgs = array(); $numberedArgs = array(); if ( $title === false ) { @@ -988,7 +1005,7 @@ class PPFrame_Hash implements PPFrame { * @param int $flags * @return string */ - function cachedExpand( $key, $root, $flags = 0 ) { + public function cachedExpand( $key, $root, $flags = 0 ) { // we don't have a parent, so we don't have a cache return $this->expand( $root, $flags ); } @@ -999,7 +1016,7 @@ class PPFrame_Hash implements PPFrame { * @param int $flags * @return string */ - function expand( $root, $flags = 0 ) { + public function expand( $root, $flags = 0 ) { static $expansionDepth = 0; if ( is_string( $root ) ) { return $root; @@ -1209,7 +1226,7 @@ class PPFrame_Hash implements PPFrame { * @param int $flags * @return string */ - function implodeWithFlags( $sep, $flags /*, ... */ ) { + public function implodeWithFlags( $sep, $flags /*, ... */ ) { $args = array_slice( func_get_args(), 2 ); $first = true; @@ -1239,7 +1256,7 @@ class PPFrame_Hash implements PPFrame { * @param string $sep * @return string */ - function implode( $sep /*, ... */ ) { + public function implode( $sep /*, ... */ ) { $args = array_slice( func_get_args(), 1 ); $first = true; @@ -1270,7 +1287,7 @@ class PPFrame_Hash implements PPFrame { * @param string $sep * @return PPNode_Hash_Array */ - function virtualImplode( $sep /*, ... */ ) { + public function virtualImplode( $sep /*, ... */ ) { $args = array_slice( func_get_args(), 1 ); $out = array(); $first = true; @@ -1302,7 +1319,7 @@ class PPFrame_Hash implements PPFrame { * @param string $end * @return PPNode_Hash_Array */ - function virtualBracketedImplode( $start, $sep, $end /*, ... */ ) { + public function virtualBracketedImplode( $start, $sep, $end /*, ... */ ) { $args = array_slice( func_get_args(), 3 ); $out = array( $start ); $first = true; @@ -1327,7 +1344,7 @@ class PPFrame_Hash implements PPFrame { return new PPNode_Hash_Array( $out ); } - function __toString() { + public function __toString() { return 'frame{}'; } @@ -1335,7 +1352,7 @@ class PPFrame_Hash implements PPFrame { * @param bool $level * @return array|bool|string */ - function getPDBK( $level = false ) { + public function getPDBK( $level = false ) { if ( $level === false ) { return $this->title->getPrefixedDBkey(); } else { @@ -1346,21 +1363,21 @@ class PPFrame_Hash implements PPFrame { /** * @return array */ - function getArguments() { + public function getArguments() { return array(); } /** * @return array */ - function getNumberedArguments() { + public function getNumberedArguments() { return array(); } /** * @return array */ - function getNamedArguments() { + public function getNamedArguments() { return array(); } @@ -1369,7 +1386,7 @@ class PPFrame_Hash implements PPFrame { * * @return bool */ - function isEmpty() { + public function isEmpty() { return true; } @@ -1377,7 +1394,7 @@ class PPFrame_Hash implements PPFrame { * @param string $name * @return bool */ - function getArgument( $name ) { + public function getArgument( $name ) { return false; } @@ -1388,7 +1405,7 @@ class PPFrame_Hash implements PPFrame { * * @return bool */ - function loopCheck( $title ) { + public function loopCheck( $title ) { return !isset( $this->loopCheckHash[$title->getPrefixedDBkey()] ); } @@ -1397,7 +1414,7 @@ class PPFrame_Hash implements PPFrame { * * @return bool */ - function isTemplate() { + public function isTemplate() { return false; } @@ -1406,7 +1423,7 @@ class PPFrame_Hash implements PPFrame { * * @return Title */ - function getTitle() { + public function getTitle() { return $this->title; } @@ -1415,7 +1432,7 @@ class PPFrame_Hash implements PPFrame { * * @param bool $flag */ - function setVolatile( $flag = true ) { + public function setVolatile( $flag = true ) { $this->volatile = $flag; } @@ -1424,7 +1441,7 @@ class PPFrame_Hash implements PPFrame { * * @return bool */ - function isVolatile() { + public function isVolatile() { return $this->volatile; } @@ -1433,7 +1450,7 @@ class PPFrame_Hash implements PPFrame { * * @param int $ttl */ - function setTTL( $ttl ) { + public function setTTL( $ttl ) { if ( $ttl !== null && ( $this->ttl === null || $ttl < $this->ttl ) ) { $this->ttl = $ttl; } @@ -1444,7 +1461,7 @@ class PPFrame_Hash implements PPFrame { * * @return int|null */ - function getTTL() { + public function getTTL() { return $this->ttl; } } @@ -1452,10 +1469,13 @@ class PPFrame_Hash implements PPFrame { /** * Expansion frame with template arguments * @ingroup Parser + * @codingStandardsIgnoreStart */ class PPTemplateFrame_Hash extends PPFrame_Hash { - var $numberedArgs, $namedArgs, $parent; - var $numberedExpansionCache, $namedExpansionCache; + // @codingStandardsIgnoreEnd + + public $numberedArgs, $namedArgs, $parent; + public $numberedExpansionCache, $namedExpansionCache; /** * @param Preprocessor $preprocessor @@ -1464,7 +1484,7 @@ class PPTemplateFrame_Hash extends PPFrame_Hash { * @param array $namedArgs * @param bool|Title $title */ - function __construct( $preprocessor, $parent = false, $numberedArgs = array(), + public function __construct( $preprocessor, $parent = false, $numberedArgs = array(), $namedArgs = array(), $title = false ) { parent::__construct( $preprocessor ); @@ -1484,7 +1504,7 @@ class PPTemplateFrame_Hash extends PPFrame_Hash { $this->numberedExpansionCache = $this->namedExpansionCache = array(); } - function __toString() { + public function __toString() { $s = 'tplframe{'; $first = true; $args = $this->numberedArgs + $this->namedArgs; @@ -1508,7 +1528,7 @@ class PPTemplateFrame_Hash extends PPFrame_Hash { * @param int $flags * @return string */ - function cachedExpand( $key, $root, $flags = 0 ) { + public function cachedExpand( $key, $root, $flags = 0 ) { if ( isset( $this->parent->childExpansionCache[$key] ) ) { return $this->parent->childExpansionCache[$key]; } @@ -1524,14 +1544,14 @@ class PPTemplateFrame_Hash extends PPFrame_Hash { * * @return bool */ - function isEmpty() { + public function isEmpty() { return !count( $this->numberedArgs ) && !count( $this->namedArgs ); } /** * @return array */ - function getArguments() { + public function getArguments() { $arguments = array(); foreach ( array_merge( array_keys( $this->numberedArgs ), @@ -1544,7 +1564,7 @@ class PPTemplateFrame_Hash extends PPFrame_Hash { /** * @return array */ - function getNumberedArguments() { + public function getNumberedArguments() { $arguments = array(); foreach ( array_keys( $this->numberedArgs ) as $key ) { $arguments[$key] = $this->getArgument( $key ); @@ -1555,7 +1575,7 @@ class PPTemplateFrame_Hash extends PPFrame_Hash { /** * @return array */ - function getNamedArguments() { + public function getNamedArguments() { $arguments = array(); foreach ( array_keys( $this->namedArgs ) as $key ) { $arguments[$key] = $this->getArgument( $key ); @@ -1567,7 +1587,7 @@ class PPTemplateFrame_Hash extends PPFrame_Hash { * @param int $index * @return array|bool */ - function getNumberedArgument( $index ) { + public function getNumberedArgument( $index ) { if ( !isset( $this->numberedArgs[$index] ) ) { return false; } @@ -1585,7 +1605,7 @@ class PPTemplateFrame_Hash extends PPFrame_Hash { * @param string $name * @return bool */ - function getNamedArgument( $name ) { + public function getNamedArgument( $name ) { if ( !isset( $this->namedArgs[$name] ) ) { return false; } @@ -1601,7 +1621,7 @@ class PPTemplateFrame_Hash extends PPFrame_Hash { * @param string $name * @return array|bool */ - function getArgument( $name ) { + public function getArgument( $name ) { $text = $this->getNumberedArgument( $name ); if ( $text === false ) { $text = $this->getNamedArgument( $name ); @@ -1614,16 +1634,16 @@ class PPTemplateFrame_Hash extends PPFrame_Hash { * * @return bool */ - function isTemplate() { + public function isTemplate() { return true; } - function setVolatile( $flag = true ) { + public function setVolatile( $flag = true ) { parent::setVolatile( $flag ); $this->parent->setVolatile( $flag ); } - function setTTL( $ttl ) { + public function setTTL( $ttl ) { parent::setTTL( $ttl ); $this->parent->setTTL( $ttl ); } @@ -1632,16 +1652,19 @@ class PPTemplateFrame_Hash extends PPFrame_Hash { /** * Expansion frame with custom arguments * @ingroup Parser + * @codingStandardsIgnoreStart */ class PPCustomFrame_Hash extends PPFrame_Hash { - var $args; + // @codingStandardsIgnoreEnd - function __construct( $preprocessor, $args ) { + public $args; + + public function __construct( $preprocessor, $args ) { parent::__construct( $preprocessor ); $this->args = $args; } - function __toString() { + public function __toString() { $s = 'cstmframe{'; $first = true; foreach ( $this->args as $name => $value ) { @@ -1660,7 +1683,7 @@ class PPCustomFrame_Hash extends PPFrame_Hash { /** * @return bool */ - function isEmpty() { + public function isEmpty() { return !count( $this->args ); } @@ -1668,30 +1691,33 @@ class PPCustomFrame_Hash extends PPFrame_Hash { * @param int $index * @return bool */ - function getArgument( $index ) { + public function getArgument( $index ) { if ( !isset( $this->args[$index] ) ) { return false; } return $this->args[$index]; } - function getArguments() { + public function getArguments() { return $this->args; } } /** * @ingroup Parser + * @codingStandardsIgnoreStart */ class PPNode_Hash_Tree implements PPNode { - var $name, $firstChild, $lastChild, $nextSibling; + // @codingStandardsIgnoreEnd + + public $name, $firstChild, $lastChild, $nextSibling; - function __construct( $name ) { + public function __construct( $name ) { $this->name = $name; $this->firstChild = $this->lastChild = $this->nextSibling = false; } - function __toString() { + public function __toString() { $inner = ''; $attribs = ''; for ( $node = $this->firstChild; $node; $node = $node->nextSibling ) { @@ -1713,13 +1739,13 @@ class PPNode_Hash_Tree implements PPNode { * @param string $text * @return PPNode_Hash_Tree */ - static function newWithText( $name, $text ) { + public static function newWithText( $name, $text ) { $obj = new self( $name ); $obj->addChild( new PPNode_Hash_Text( $text ) ); return $obj; } - function addChild( $node ) { + public function addChild( $node ) { if ( $this->lastChild === false ) { $this->firstChild = $this->lastChild = $node; } else { @@ -1731,7 +1757,7 @@ class PPNode_Hash_Tree implements PPNode { /** * @return PPNode_Hash_Array */ - function getChildren() { + public function getChildren() { $children = array(); for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) { $children[] = $child; @@ -1739,15 +1765,15 @@ class PPNode_Hash_Tree implements PPNode { return new PPNode_Hash_Array( $children ); } - function getFirstChild() { + public function getFirstChild() { return $this->firstChild; } - function getNextSibling() { + public function getNextSibling() { return $this->nextSibling; } - function getChildrenOfType( $name ) { + public function getChildrenOfType( $name ) { $children = array(); for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) { if ( isset( $child->name ) && $child->name === $name ) { @@ -1760,7 +1786,7 @@ class PPNode_Hash_Tree implements PPNode { /** * @return bool */ - function getLength() { + public function getLength() { return false; } @@ -1768,14 +1794,14 @@ class PPNode_Hash_Tree implements PPNode { * @param int $i * @return bool */ - function item( $i ) { + public function item( $i ) { return false; } /** * @return string */ - function getName() { + public function getName() { return $this->name; } @@ -1788,7 +1814,7 @@ class PPNode_Hash_Tree implements PPNode { * @throws MWException * @return array */ - function splitArg() { + public function splitArg() { $bits = array(); for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) { if ( !isset( $child->name ) ) { @@ -1822,7 +1848,7 @@ class PPNode_Hash_Tree implements PPNode { * @throws MWException * @return array */ - function splitExt() { + public function splitExt() { $bits = array(); for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) { if ( !isset( $child->name ) ) { @@ -1850,7 +1876,7 @@ class PPNode_Hash_Tree implements PPNode { * @throws MWException * @return array */ - function splitHeading() { + public function splitHeading() { if ( $this->name !== 'h' ) { throw new MWException( 'Invalid h node passed to ' . __METHOD__ ); } @@ -1877,7 +1903,7 @@ class PPNode_Hash_Tree implements PPNode { * @throws MWException * @return array */ - function splitTemplate() { + public function splitTemplate() { $parts = array(); $bits = array( 'lineStart' => '' ); for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) { @@ -1904,169 +1930,178 @@ class PPNode_Hash_Tree implements PPNode { /** * @ingroup Parser + * @codingStandardsIgnoreStart */ class PPNode_Hash_Text implements PPNode { - var $value, $nextSibling; + // @codingStandardsIgnoreEnd + + public $value, $nextSibling; - function __construct( $value ) { + public function __construct( $value ) { if ( is_object( $value ) ) { throw new MWException( __CLASS__ . ' given object instead of string' ); } $this->value = $value; } - function __toString() { + public function __toString() { return htmlspecialchars( $this->value ); } - function getNextSibling() { + public function getNextSibling() { return $this->nextSibling; } - function getChildren() { + public function getChildren() { return false; } - function getFirstChild() { + public function getFirstChild() { return false; } - function getChildrenOfType( $name ) { + public function getChildrenOfType( $name ) { return false; } - function getLength() { + public function getLength() { return false; } - function item( $i ) { + public function item( $i ) { return false; } - function getName() { + public function getName() { return '#text'; } - function splitArg() { + public function splitArg() { throw new MWException( __METHOD__ . ': not supported' ); } - function splitExt() { + public function splitExt() { throw new MWException( __METHOD__ . ': not supported' ); } - function splitHeading() { + public function splitHeading() { throw new MWException( __METHOD__ . ': not supported' ); } } /** * @ingroup Parser + * @codingStandardsIgnoreStart */ class PPNode_Hash_Array implements PPNode { - var $value, $nextSibling; + // @codingStandardsIgnoreEnd - function __construct( $value ) { + public $value, $nextSibling; + + public function __construct( $value ) { $this->value = $value; } - function __toString() { + public function __toString() { return var_export( $this, true ); } - function getLength() { + public function getLength() { return count( $this->value ); } - function item( $i ) { + public function item( $i ) { return $this->value[$i]; } - function getName() { + public function getName() { return '#nodelist'; } - function getNextSibling() { + public function getNextSibling() { return $this->nextSibling; } - function getChildren() { + public function getChildren() { return false; } - function getFirstChild() { + public function getFirstChild() { return false; } - function getChildrenOfType( $name ) { + public function getChildrenOfType( $name ) { return false; } - function splitArg() { + public function splitArg() { throw new MWException( __METHOD__ . ': not supported' ); } - function splitExt() { + public function splitExt() { throw new MWException( __METHOD__ . ': not supported' ); } - function splitHeading() { + public function splitHeading() { throw new MWException( __METHOD__ . ': not supported' ); } } /** * @ingroup Parser + * @codingStandardsIgnoreStart */ class PPNode_Hash_Attr implements PPNode { - var $name, $value, $nextSibling; + // @codingStandardsIgnoreEnd + + public $name, $value, $nextSibling; - function __construct( $name, $value ) { + public function __construct( $name, $value ) { $this->name = $name; $this->value = $value; } - function __toString() { + public function __toString() { return "<@{$this->name}>" . htmlspecialchars( $this->value ) . "name}>"; } - function getName() { + public function getName() { return $this->name; } - function getNextSibling() { + public function getNextSibling() { return $this->nextSibling; } - function getChildren() { + public function getChildren() { return false; } - function getFirstChild() { + public function getFirstChild() { return false; } - function getChildrenOfType( $name ) { + public function getChildrenOfType( $name ) { return false; } - function getLength() { + public function getLength() { return false; } - function item( $i ) { + public function item( $i ) { return false; } - function splitArg() { + public function splitArg() { throw new MWException( __METHOD__ . ': not supported' ); } - function splitExt() { + public function splitExt() { throw new MWException( __METHOD__ . ': not supported' ); } - function splitHeading() { + public function splitHeading() { throw new MWException( __METHOD__ . ': not supported' ); } } diff --git a/includes/parser/StripState.php b/includes/parser/StripState.php index d4f4559bd7..5d1743e61c 100644 --- a/includes/parser/StripState.php +++ b/includes/parser/StripState.php @@ -39,7 +39,7 @@ class StripState { /** * @param string $prefix */ - function __construct( $prefix ) { + public function __construct( $prefix ) { $this->prefix = $prefix; $this->data = array( 'nowiki' => array(), @@ -54,7 +54,7 @@ class StripState { * @param string $marker * @param string $value */ - function addNoWiki( $marker, $value ) { + public function addNoWiki( $marker, $value ) { $this->addItem( 'nowiki', $marker, $value ); } @@ -62,7 +62,7 @@ class StripState { * @param string $marker * @param string $value */ - function addGeneral( $marker, $value ) { + public function addGeneral( $marker, $value ) { $this->addItem( 'general', $marker, $value ); } @@ -84,7 +84,7 @@ class StripState { * @param string $text * @return mixed */ - function unstripGeneral( $text ) { + public function unstripGeneral( $text ) { return $this->unstripType( 'general', $text ); } @@ -92,7 +92,7 @@ class StripState { * @param string $text * @return mixed */ - function unstripNoWiki( $text ) { + public function unstripNoWiki( $text ) { return $this->unstripType( 'nowiki', $text ); } @@ -100,7 +100,7 @@ class StripState { * @param string $text * @return mixed */ - function unstripBoth( $text ) { + public function unstripBoth( $text ) { $text = $this->unstripType( 'general', $text ); $text = $this->unstripType( 'nowiki', $text ); return $text; @@ -163,7 +163,7 @@ class StripState { * * @return StripState */ - function getSubState( $text ) { + public function getSubState( $text ) { $subState = new StripState( $this->prefix ); $pos = 0; while ( true ) { @@ -199,7 +199,7 @@ class StripState { * @param array $texts * @return array */ - function merge( $otherState, $texts ) { + public function merge( $otherState, $texts ) { $mergePrefix = Parser::getRandomString(); foreach ( $otherState->data as $type => $items ) { @@ -229,7 +229,7 @@ class StripState { * @param string $text Input string * @return string */ - function killMarkers( $text ) { + public function killMarkers( $text ) { return preg_replace( $this->regex, '', $text ); } } diff --git a/includes/poolcounter/PoolCounterWork.php b/includes/poolcounter/PoolCounterWork.php index 1bc1a8b122..e49afed096 100644 --- a/includes/poolcounter/PoolCounterWork.php +++ b/includes/poolcounter/PoolCounterWork.php @@ -64,6 +64,9 @@ abstract class PoolCounterWork { /** * Do something with the error, like showing it to the user. + * + * @param $status + * * @return bool */ public function error( $status ) { @@ -155,73 +158,3 @@ abstract class PoolCounterWork { } } } - -/** - * Convenience class for dealing with PoolCounters using callbacks - * @since 1.22 - */ -class PoolCounterWorkViaCallback extends PoolCounterWork { - /** @var callable */ - protected $doWork; - /** @var callable|null */ - protected $doCachedWork; - /** @var callable|null */ - protected $fallback; - /** @var callable|null */ - protected $error; - - /** - * Build a PoolCounterWork class from a type, key, and callback map. - * - * The callback map must at least have a callback for the 'doWork' method. - * Additionally, callbacks can be provided for the 'doCachedWork', 'fallback', - * and 'error' methods. Methods without callbacks will be no-ops that return false. - * If a 'doCachedWork' callback is provided, then execute() may wait for any prior - * process in the pool to finish and reuse its cached result. - * - * @param string $type - * @param string $key - * @param array $callbacks Map of callbacks - * @throws MWException - */ - public function __construct( $type, $key, array $callbacks ) { - parent::__construct( $type, $key ); - foreach ( array( 'doWork', 'doCachedWork', 'fallback', 'error' ) as $name ) { - if ( isset( $callbacks[$name] ) ) { - if ( !is_callable( $callbacks[$name] ) ) { - throw new MWException( "Invalid callback provided for '$name' function." ); - } - $this->$name = $callbacks[$name]; - } - } - if ( !isset( $this->doWork ) ) { - throw new MWException( "No callback provided for 'doWork' function." ); - } - $this->cacheable = isset( $this->doCachedWork ); - } - - public function doWork() { - return call_user_func_array( $this->doWork, array() ); - } - - public function getCachedWork() { - if ( $this->doCachedWork ) { - return call_user_func_array( $this->doCachedWork, array() ); - } - return false; - } - - public function fallback() { - if ( $this->fallback ) { - return call_user_func_array( $this->fallback, array() ); - } - return false; - } - - public function error( $status ) { - if ( $this->error ) { - return call_user_func_array( $this->error, array( $status ) ); - } - return false; - } -} diff --git a/includes/poolcounter/PoolCounterWorkViaCallback.php b/includes/poolcounter/PoolCounterWorkViaCallback.php new file mode 100644 index 0000000000..af83d2e069 --- /dev/null +++ b/includes/poolcounter/PoolCounterWorkViaCallback.php @@ -0,0 +1,92 @@ +$name = $callbacks[$name]; + } + } + if ( !isset( $this->doWork ) ) { + throw new MWException( "No callback provided for 'doWork' function." ); + } + $this->cacheable = isset( $this->doCachedWork ); + } + + public function doWork() { + return call_user_func_array( $this->doWork, array() ); + } + + public function getCachedWork() { + if ( $this->doCachedWork ) { + return call_user_func_array( $this->doCachedWork, array() ); + } + return false; + } + + public function fallback() { + if ( $this->fallback ) { + return call_user_func_array( $this->fallback, array() ); + } + return false; + } + + public function error( $status ) { + if ( $this->error ) { + return call_user_func_array( $this->error, array( $status ) ); + } + return false; + } +} diff --git a/includes/resourceloader/ResourceLoader.php b/includes/resourceloader/ResourceLoader.php index 21e64359b4..e30047ab31 100644 --- a/includes/resourceloader/ResourceLoader.php +++ b/includes/resourceloader/ResourceLoader.php @@ -44,6 +44,9 @@ class ResourceLoader { /** @var array Associative array mapping module name to info associative array */ protected $moduleInfos = array(); + /** @var Config $config */ + private $config; + /** * @var array Associative array mapping framework ids to a list of names of test suite modules * like array( 'qunit' => array( 'mediawiki.tests.qunit.suites', 'ext.foo.tests', .. ), .. ) @@ -152,7 +155,6 @@ class ResourceLoader { * @return string Filtered data, or a comment containing an error message */ public function filter( $filter, $data, $cacheReport = true ) { - global $wgResourceLoaderMinifierStatementsOnOwnLine, $wgResourceLoaderMinifierMaxLineLength; wfProfileIn( __METHOD__ ); // For empty/whitespace-only data or for unknown filters, don't perform @@ -180,8 +182,8 @@ class ResourceLoader { switch ( $filter ) { case 'minify-js': $result = JavaScriptMinifier::minify( $data, - $wgResourceLoaderMinifierStatementsOnOwnLine, - $wgResourceLoaderMinifierMaxLineLength + $this->config->get( 'ResourceLoaderMinifierStatementsOnOwnLine' ), + $this->config->get( 'ResourceLoaderMinifierMaxLineLength' ) ); if ( $cacheReport ) { $result .= "\n/* cache key: $key */"; @@ -215,33 +217,47 @@ class ResourceLoader { /** * Register core modules and runs registration hooks. */ - public function __construct() { - global $IP, $wgResourceModules, $wgResourceLoaderSources, $wgLoadScript, $wgEnableJavaScriptTest; + public function __construct( Config $config = null ) { + global $IP; wfProfileIn( __METHOD__ ); + if ( $config === null ) { + wfDebug( __METHOD__ . ' was called without providing a Config instance' ); + $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' ); + } + + $this->config = $config; + // Add 'local' source first $this->addSource( 'local', - array( 'loadScript' => $wgLoadScript, 'apiScript' => wfScript( 'api' ) ) + array( 'loadScript' => wfScript( 'load' ), 'apiScript' => wfScript( 'api' ) ) ); // Add other sources - $this->addSource( $wgResourceLoaderSources ); + $this->addSource( $config->get( 'ResourceLoaderSources' ) ); // Register core modules $this->register( include "$IP/resources/Resources.php" ); // Register extension modules wfRunHooks( 'ResourceLoaderRegisterModules', array( &$this ) ); - $this->register( $wgResourceModules ); + $this->register( $config->get( 'ResourceModules' ) ); - if ( $wgEnableJavaScriptTest === true ) { + if ( $config->get( 'EnableJavaScriptTest' ) === true ) { $this->registerTestModules(); } wfProfileOut( __METHOD__ ); } + /** + * @return Config + */ + public function getConfig() { + return $this->config; + } + /** * Register a module with the ResourceLoader system. * @@ -298,8 +314,7 @@ class ResourceLoader { // Apply custom skin-defined styles to existing modules. if ( $this->isFileModule( $name ) ) { - global $wgResourceModuleSkinStyles; - foreach ( $wgResourceModuleSkinStyles as $skinName => $skinStyles ) { + foreach ( $this->config->get( 'ResourceModuleSkinStyles' ) as $skinName => $skinStyles ) { // If this module already defines skinStyles for this skin, ignore $wgResourceModuleSkinStyles. if ( isset( $this->moduleInfos[$name]['skinStyles'][$skinName] ) ) { continue; @@ -342,9 +357,9 @@ class ResourceLoader { /** */ public function registerTestModules() { - global $IP, $wgEnableJavaScriptTest; + global $IP; - if ( $wgEnableJavaScriptTest !== true ) { + if ( $this->config->get( 'EnableJavaScriptTest' ) !== true ) { throw new MWException( 'Attempt to register JavaScript test modules ' . 'but $wgEnableJavaScriptTest is false. ' . 'Edit your LocalSettings.php to enable it.' ); @@ -480,7 +495,9 @@ class ResourceLoader { } else { $class = $info['class']; } + /** @var ResourceLoaderModule $object */ $object = new $class( $info ); + $object->setConfig( $this->getConfig() ); } $object->setName( $name ); $this->modules[$name] = $object; @@ -537,10 +554,8 @@ class ResourceLoader { * @param ResourceLoaderContext $context Context in which a response should be formed */ public function respond( ResourceLoaderContext $context ) { - global $wgCacheEpoch, $wgUseFileCache; - // Use file cache if enabled and available... - if ( $wgUseFileCache ) { + if ( $this->config->get( 'UseFileCache' ) ) { $fileCache = ResourceFileCache::newFromContext( $context ); if ( $this->tryRespondFromFileCache( $fileCache, $context ) ) { return; // output handled @@ -596,7 +611,7 @@ class ResourceLoader { // To send Last-Modified and support If-Modified-Since, we need to detect // the last modified time - $mtime = wfTimestamp( TS_UNIX, $wgCacheEpoch ); + $mtime = wfTimestamp( TS_UNIX, $this->config->get( 'CacheEpoch' ) ); foreach ( $modules as $module ) { /** * @var $module ResourceLoaderModule @@ -664,18 +679,18 @@ class ResourceLoader { * @return void */ protected function sendResponseHeaders( ResourceLoaderContext $context, $mtime, $errors ) { - global $wgResourceLoaderMaxage; + $rlMaxage = $this->config->get( 'ResourceLoaderMaxage' ); // If a version wasn't specified we need a shorter expiry time for updates // to propagate to clients quickly // If there were errors, we also need a shorter expiry time so we can recover quickly if ( is_null( $context->getVersion() ) || $errors ) { - $maxage = $wgResourceLoaderMaxage['unversioned']['client']; - $smaxage = $wgResourceLoaderMaxage['unversioned']['server']; + $maxage = $rlMaxage['unversioned']['client']; + $smaxage = $rlMaxage['unversioned']['server']; // If a version was specified we can use a longer expiry time since changing // version numbers causes cache misses } else { - $maxage = $wgResourceLoaderMaxage['versioned']['client']; - $smaxage = $wgResourceLoaderMaxage['versioned']['server']; + $maxage = $rlMaxage['versioned']['client']; + $smaxage = $rlMaxage['versioned']['server']; } if ( $context->getOnly() === 'styles' ) { header( 'Content-Type: text/css; charset=utf-8' ); @@ -743,13 +758,13 @@ class ResourceLoader { protected function tryRespondFromFileCache( ResourceFileCache $fileCache, ResourceLoaderContext $context ) { - global $wgResourceLoaderMaxage; + $rlMaxage = $this->config->get( 'ResourceLoaderMaxage' ); // Buffer output to catch warnings. ob_start(); // Get the maximum age the cache can be $maxage = is_null( $context->getVersion() ) - ? $wgResourceLoaderMaxage['unversioned']['server'] - : $wgResourceLoaderMaxage['versioned']['server']; + ? $rlMaxage['unversioned']['server'] + : $rlMaxage['versioned']['server']; // Minimum timestamp the cache file must have $good = $fileCache->isCacheGood( wfTimestamp( TS_MW, time() - $maxage ) ); if ( !$good ) { @@ -990,6 +1005,13 @@ class ResourceLoader { if ( count( $states ) ) { $out .= self::makeLoaderStateScript( $states ); } + + // In only=script requests for modules that are not raw (e.g. not the startup module) + // ensure the execution is conditional to avoid situations where browsers with an + // unsupported environment do unconditionally execute a module's scripts. Otherwise users + // will get things like "ReferenceError: mw is undefined" or "jQuery is undefined" from + // legacy scripts loaded with only=scripts (such as the 'site' module). + $out = self::makeLoaderConditionalScript( $out ); } else { if ( count( $states ) ) { $exceptions .= self::makeComment( @@ -1443,12 +1465,12 @@ class ResourceLoader { /** * Returns LESS compiler set up for use with MediaWiki * + * @param Config $config + * @throws MWException * @since 1.22 * @return lessc */ - public static function getLessCompiler() { - global $wgResourceLoaderLESSFunctions, $wgResourceLoaderLESSImportPaths; - + public static function getLessCompiler( Config $config ) { // When called from the installer, it is possible that a required PHP extension // is missing (at least for now; see bug 47564). If this is the case, throw an // exception (caught by the installer) to prevent a fatal error later on. @@ -1458,9 +1480,9 @@ class ResourceLoader { $less = new lessc(); $less->setPreserveComments( true ); - $less->setVariables( self::getLESSVars() ); - $less->setImportDir( $wgResourceLoaderLESSImportPaths ); - foreach ( $wgResourceLoaderLESSFunctions as $name => $func ) { + $less->setVariables( self::getLESSVars( $config ) ); + $less->setImportDir( $config->get( 'ResourceLoaderLESSImportPaths' ) ); + foreach ( $config->get( 'ResourceLoaderLESSFunctions' ) as $name => $func ) { $less->registerFunction( $name, $func ); } return $less; @@ -1469,13 +1491,12 @@ class ResourceLoader { /** * Get global LESS variables. * - * $since 1.22 + * @param Config $config + * @since 1.22 * @return array Map of variable names to string CSS values. */ - public static function getLESSVars() { - global $wgResourceLoaderLESSVars; - - $lessVars = $wgResourceLoaderLESSVars; + public static function getLESSVars( Config $config ) { + $lessVars = $config->get( 'ResourceLoaderLESSVars' ); // Sort by key to ensure consistent hashing for cache lookups. ksort( $lessVars ); return $lessVars; diff --git a/includes/resourceloader/ResourceLoaderContext.php b/includes/resourceloader/ResourceLoaderContext.php index 8994c0e1ac..e79aadcfff 100644 --- a/includes/resourceloader/ResourceLoaderContext.php +++ b/includes/resourceloader/ResourceLoaderContext.php @@ -48,9 +48,7 @@ class ResourceLoaderContext { * @param ResourceLoader $resourceLoader * @param WebRequest $request */ - public function __construct( $resourceLoader, WebRequest $request ) { - global $wgDefaultSkin, $wgResourceLoaderDebug; - + public function __construct( ResourceLoader $resourceLoader, WebRequest $request ) { $this->resourceLoader = $resourceLoader; $this->request = $request; @@ -61,7 +59,9 @@ class ResourceLoaderContext { // Various parameters $this->skin = $request->getVal( 'skin' ); $this->user = $request->getVal( 'user' ); - $this->debug = $request->getFuzzyBool( 'debug', $wgResourceLoaderDebug ); + $this->debug = $request->getFuzzyBool( + 'debug', $resourceLoader->getConfig()->get( 'ResourceLoaderDebug' ) + ); $this->only = $request->getVal( 'only' ); $this->version = $request->getVal( 'version' ); $this->raw = $request->getFuzzyBool( 'raw' ); @@ -69,7 +69,7 @@ class ResourceLoaderContext { $skinnames = Skin::getSkinNames(); // If no skin is specified, or we don't recognize the skin, use the default skin if ( !$this->skin || !isset( $skinnames[$this->skin] ) ) { - $this->skin = $wgDefaultSkin; + $this->skin = $resourceLoader->getConfig()->get( 'DefaultSkin' ); } } @@ -113,7 +113,7 @@ class ResourceLoaderContext { * @return ResourceLoaderContext */ public static function newDummyContext() { - return new self( null, new FauxRequest( array() ) ); + return new self( new ResourceLoader, new FauxRequest( array() ) ); } /** diff --git a/includes/resourceloader/ResourceLoaderFileModule.php b/includes/resourceloader/ResourceLoaderFileModule.php index c3a36e4ecc..06f7146d78 100644 --- a/includes/resourceloader/ResourceLoaderFileModule.php +++ b/includes/resourceloader/ResourceLoaderFileModule.php @@ -305,9 +305,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { // but were preserved for backwards-compatibility just in case. Tread lightly. $localBasePath = $localBasePath === null ? $IP : $localBasePath; - if ( $remoteBasePath !== null ) { - $remoteBasePath = $remoteBasePath; - } else { + if ( $remoteBasePath === null ) { $remoteBasePath = $wgResourceBasePath === null ? $wgScriptPath : $wgResourceBasePath; } @@ -475,14 +473,13 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { return null; } - global $wgResourceLoaderValidateStaticJS; $localPath = $this->getLocalPath( $this->skipFunction ); if ( !file_exists( $localPath ) ) { throw new MWException( __METHOD__ . ": skip function file not found: \"$localPath\"" ); } $contents = file_get_contents( $localPath ); - if ( $wgResourceLoaderValidateStaticJS ) { - $contents = $this->validateScriptFile( $fileName, $contents ); + if ( $this->getConfig()->get( 'ResourceLoaderValidateStaticJS' ) ) { + $contents = $this->validateScriptFile( $localPath, $contents ); } return $contents; } @@ -792,7 +789,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { * @return string Concatenated and remapped JavaScript data from $scripts */ protected function readScriptFiles( array $scripts ) { - global $wgResourceLoaderValidateStaticJS; if ( empty( $scripts ) ) { return ''; } @@ -803,7 +799,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { throw new MWException( __METHOD__ . ": script file not found: \"$localPath\"" ); } $contents = file_get_contents( $localPath ); - if ( $wgResourceLoaderValidateStaticJS ) { + if ( $this->getConfig()->get( 'ResourceLoaderValidateStaticJS' ) ) { // Static files don't really need to be checked as often; unlike // on-wiki module they shouldn't change unexpectedly without // admin interference. @@ -911,8 +907,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { * @param string $fileName File name of root LESS file. * @return string Cache key */ - protected static function getLESSCacheKey( $fileName ) { - $vars = json_encode( ResourceLoader::getLESSVars() ); + protected function getLESSCacheKey( $fileName ) { + $vars = json_encode( ResourceLoader::getLESSVars( $this->getConfig() ) ); $hash = md5( $fileName . $vars ); return wfMemcKey( 'resourceloader', 'less', $hash ); } @@ -933,7 +929,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { * @return string CSS source */ protected function compileLESSFile( $fileName ) { - $key = self::getLESSCacheKey( $fileName ); + $key = $this->getLESSCacheKey( $fileName ); $cache = wfGetCache( CACHE_ANYTHING ); // The input to lessc. Either an associative array representing the @@ -944,7 +940,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { $source = $fileName; } - $compiler = ResourceLoader::getLessCompiler(); + $compiler = ResourceLoader::getLessCompiler( $this->getConfig() ); $result = null; $result = $compiler->cachedCompile( $source ); diff --git a/includes/resourceloader/ResourceLoaderModule.php b/includes/resourceloader/ResourceLoaderModule.php index 0ace76a871..ba37f42171 100644 --- a/includes/resourceloader/ResourceLoaderModule.php +++ b/includes/resourceloader/ResourceLoaderModule.php @@ -64,6 +64,11 @@ abstract class ResourceLoaderModule { // In-object cache for message blob mtime protected $msgBlobMtime = array(); + /** + * @var Config + */ + protected $config; + /* Methods */ /** @@ -129,6 +134,27 @@ abstract class ResourceLoaderModule { return ''; } + /** + * @return Config + * @since 1.24 + */ + public function getConfig() { + if ( $this->config === null ) { + // Ugh, fall back to default + $this->config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' ); + } + + return $this->config; + } + + /** + * @param Config $config + * @since 1.24 + */ + public function setConfig( Config $config ) { + $this->config = $config; + } + /** * Get the URL or URLs to load for this module's JS in debug mode. * The default behavior is to return a load.php?only=scripts URL for @@ -561,8 +587,7 @@ abstract class ResourceLoaderModule { * @return string JS with the original, or a replacement error */ protected function validateScriptFile( $fileName, $contents ) { - global $wgResourceLoaderValidateJS; - if ( $wgResourceLoaderValidateJS ) { + if ( $this->getConfig()->get( 'ResourceLoaderValidateJS' ) ) { // Try for cache hit // Use CACHE_ANYTHING since filtering is very slow compared to DB queries $key = wfMemcKey( 'resourceloader', 'jsparse', self::$parseCacheVersion, md5( $contents ) ); diff --git a/includes/resourceloader/ResourceLoaderSiteModule.php b/includes/resourceloader/ResourceLoaderSiteModule.php index d28f40f2b1..1d9721aa7a 100644 --- a/includes/resourceloader/ResourceLoaderSiteModule.php +++ b/includes/resourceloader/ResourceLoaderSiteModule.php @@ -37,14 +37,12 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule { * @return array List of pages */ protected function getPages( ResourceLoaderContext $context ) { - global $wgUseSiteJs, $wgUseSiteCss; - $pages = array(); - if ( $wgUseSiteJs ) { + if ( $this->getConfig()->get( 'UseSiteJs' ) ) { $pages['MediaWiki:Common.js'] = array( 'type' => 'script' ); $pages['MediaWiki:' . ucfirst( $context->getSkin() ) . '.js'] = array( 'type' => 'script' ); } - if ( $wgUseSiteCss ) { + if ( $this->getConfig()->get( 'UseSiteCss' ) ) { $pages['MediaWiki:Common.css'] = array( 'type' => 'style' ); $pages['MediaWiki:' . ucfirst( $context->getSkin() ) . '.css'] = array( 'type' => 'style' ); diff --git a/includes/resourceloader/ResourceLoaderStartUpModule.php b/includes/resourceloader/ResourceLoaderStartUpModule.php index 2c0f8df785..67c42bb254 100644 --- a/includes/resourceloader/ResourceLoaderStartUpModule.php +++ b/includes/resourceloader/ResourceLoaderStartUpModule.php @@ -36,22 +36,14 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { * @param ResourceLoaderContext $context * @return array */ - protected function getConfig( $context ) { + protected function getConfigSettings( $context ) { $hash = $context->getHash(); if ( isset( $this->configVars[$hash] ) ) { return $this->configVars[$hash]; } - global $wgLoadScript, $wgScript, $wgStylePath, $wgScriptExtension, - $wgArticlePath, $wgScriptPath, $wgServer, $wgServerName, - $wgContLang, $wgVariantArticlePath, $wgActionPaths, $wgVersion, - $wgEnableAPI, $wgEnableWriteAPI, $wgDBname, - $wgSitename, $wgFileExtensions, $wgExtensionAssetsPath, - $wgCookiePrefix, $wgCookieDomain, $wgCookiePath, - $wgCookieExpiration, $wgResourceLoaderMaxQueryLength, - $wgResourceLoaderStorageEnabled, $wgResourceLoaderStorageVersion, - $wgSearchType; + global $wgContLang; $mainPage = Title::newMainPage(); @@ -69,51 +61,52 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { } } + $conf = $this->getConfig(); // Build list of variables $vars = array( - 'wgLoadScript' => $wgLoadScript, + 'wgLoadScript' => wfScript( 'load' ), 'debug' => $context->getDebug(), 'skin' => $context->getSkin(), - 'stylepath' => $wgStylePath, + 'stylepath' => $conf->get( 'StylePath' ), 'wgUrlProtocols' => wfUrlProtocols(), - 'wgArticlePath' => $wgArticlePath, - 'wgScriptPath' => $wgScriptPath, - 'wgScriptExtension' => $wgScriptExtension, - 'wgScript' => $wgScript, - 'wgSearchType' => $wgSearchType, - 'wgVariantArticlePath' => $wgVariantArticlePath, + 'wgArticlePath' => $conf->get( 'ArticlePath' ), + 'wgScriptPath' => $conf->get( 'ScriptPath' ), + 'wgScriptExtension' => $conf->get( 'ScriptExtension' ), + 'wgScript' => wfScript(), + 'wgSearchType' => $conf->get( 'SearchType' ), + 'wgVariantArticlePath' => $conf->get( 'VariantArticlePath' ), // Force object to avoid "empty" associative array from // becoming [] instead of {} in JS (bug 34604) - 'wgActionPaths' => (object)$wgActionPaths, - 'wgServer' => $wgServer, - 'wgServerName' => $wgServerName, + 'wgActionPaths' => (object)$conf->get( 'ActionPaths' ), + 'wgServer' => $conf->get( 'Server' ), + 'wgServerName' => $conf->get( 'ServerName' ), 'wgUserLanguage' => $context->getLanguage(), 'wgContentLanguage' => $wgContLang->getCode(), - 'wgVersion' => $wgVersion, - 'wgEnableAPI' => $wgEnableAPI, - 'wgEnableWriteAPI' => $wgEnableWriteAPI, + 'wgVersion' => $conf->get( 'Version' ), + 'wgEnableAPI' => $conf->get( 'EnableAPI' ), + 'wgEnableWriteAPI' => $conf->get( 'EnableWriteAPI' ), 'wgMainPageTitle' => $mainPage->getPrefixedText(), 'wgFormattedNamespaces' => $wgContLang->getFormattedNamespaces(), 'wgNamespaceIds' => $namespaceIds, 'wgContentNamespaces' => MWNamespace::getContentNamespaces(), - 'wgSiteName' => $wgSitename, - 'wgFileExtensions' => array_values( array_unique( $wgFileExtensions ) ), - 'wgDBname' => $wgDBname, + 'wgSiteName' => $conf->get( 'Sitename' ), + 'wgFileExtensions' => array_values( array_unique( $conf->get( 'FileExtensions' ) ) ), + 'wgDBname' => $conf->get( 'DBname' ), // This sucks, it is only needed on Special:Upload, but I could // not find a way to add vars only for a certain module 'wgFileCanRotate' => BitmapHandler::canRotate(), 'wgAvailableSkins' => Skin::getSkinNames(), - 'wgExtensionAssetsPath' => $wgExtensionAssetsPath, + 'wgExtensionAssetsPath' => $conf->get( 'ExtensionAssetsPath' ), // MediaWiki sets cookies to have this prefix by default - 'wgCookiePrefix' => $wgCookiePrefix, - 'wgCookieDomain' => $wgCookieDomain, - 'wgCookiePath' => $wgCookiePath, - 'wgCookieExpiration' => $wgCookieExpiration, - 'wgResourceLoaderMaxQueryLength' => $wgResourceLoaderMaxQueryLength, + 'wgCookiePrefix' => $conf->get( 'CookiePrefix' ), + 'wgCookieDomain' => $conf->get( 'CookieDomain' ), + 'wgCookiePath' => $conf->get( 'CookiePath' ), + 'wgCookieExpiration' => $conf->get( 'CookieExpiration' ), + 'wgResourceLoaderMaxQueryLength' => $conf->get( 'ResourceLoaderMaxQueryLength' ), 'wgCaseSensitiveNamespaces' => $caseSensitiveNamespaces, 'wgLegalTitleChars' => Title::convertByteClassToUnicodeClass( Title::legalChars() ), - 'wgResourceLoaderStorageVersion' => $wgResourceLoaderStorageVersion, - 'wgResourceLoaderStorageEnabled' => $wgResourceLoaderStorageEnabled, + 'wgResourceLoaderStorageVersion' => $conf->get( 'ResourceLoaderStorageVersion' ), + 'wgResourceLoaderStorageEnabled' => $conf->get( 'ResourceLoaderStorageEnabled' ), ); wfRunHooks( 'ResourceLoaderGetConfigVars', array( &$vars ) ); @@ -197,8 +190,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { * @param ResourceLoaderContext $context * @return string JavaScript code for registering all modules with the client loader */ - public static function getModuleRegistrations( ResourceLoaderContext $context ) { - global $wgCacheEpoch; + public function getModuleRegistrations( ResourceLoaderContext $context ) { wfProfileIn( __METHOD__ ); $resourceLoader = $context->getResourceLoader(); @@ -218,7 +210,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { // getModifiedTime() is supposed to return a UNIX timestamp, but it doesn't always // seem to do that, and custom implementations might forget. Coerce it to TS_UNIX $moduleMtime = wfTimestamp( TS_UNIX, $module->getModifiedTime( $context ) ); - $mtime = max( $moduleMtime, wfTimestamp( TS_UNIX, $wgCacheEpoch ) ); + $mtime = max( $moduleMtime, wfTimestamp( TS_UNIX, $this->getConfig()->get( 'CacheEpoch' ) ) ); // FIXME: Convert to numbers, wfTimestamp always gives us stings, even for TS_UNIX @@ -333,6 +325,15 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { return true; } + /** + * Base modules required for the the base environment of ResourceLoader + * + * @return array + */ + public static function getStartupModules() { + return array( 'jquery', 'mediawiki' ); + } + /** * Get the load URL of the startup modules. * @@ -343,8 +344,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { * @return string */ public static function getStartupModulesUrl( ResourceLoaderContext $context ) { - // The core modules: - $moduleNames = array( 'jquery', 'mediawiki' ); + $moduleNames = self::getStartupModules(); // Get the latest version $loader = $context->getResourceLoader(); @@ -373,19 +373,19 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { * @return string */ public function getScript( ResourceLoaderContext $context ) { - global $IP, $wgLegacyJavaScriptGlobals; + global $IP; $out = file_get_contents( "$IP/resources/src/startup.js" ); if ( $context->getOnly() === 'scripts' ) { // Startup function - $configuration = $this->getConfig( $context ); - $registrations = self::getModuleRegistrations( $context ); + $configuration = $this->getConfigSettings( $context ); + $registrations = $this->getModuleRegistrations( $context ); // Fix indentation $registrations = str_replace( "\n", "\n\t", trim( $registrations ) ); $out .= "var startUp = function () {\n" . "\tmw.config = new " . - Xml::encodeJsCall( 'mw.Map', array( $wgLegacyJavaScriptGlobals ) ) . "\n" . + Xml::encodeJsCall( 'mw.Map', array( $this->getConfig()->get( 'LegacyJavaScriptGlobals' ) ) ) . "\n" . "\t$registrations\n" . "\t" . Xml::encodeJsCall( 'mw.config.set', array( $configuration ) ) . "};\n"; @@ -412,7 +412,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { * @return array|mixed */ public function getModifiedTime( ResourceLoaderContext $context ) { - global $IP, $wgCacheEpoch; + global $IP; $hash = $context->getHash(); if ( isset( $this->modifiedTime[$hash] ) ) { @@ -425,7 +425,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { $loader->preloadModuleInfo( $loader->getModuleNames(), $context ); $time = max( - wfTimestamp( TS_UNIX, $wgCacheEpoch ), + wfTimestamp( TS_UNIX, $this->getConfig()->get( 'CacheEpoch' ) ), filemtime( "$IP/resources/src/startup.js" ), $this->getHashMtime( $context ) ); @@ -455,11 +455,9 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { * @return string Hash */ public function getModifiedHash( ResourceLoaderContext $context ) { - global $wgLegacyJavaScriptGlobals; - $data = array( - 'vars' => $this->getConfig( $context ), - 'wgLegacyJavaScriptGlobals' => $wgLegacyJavaScriptGlobals, + 'vars' => $this->getConfigSettings( $context ), + 'wgLegacyJavaScriptGlobals' => $this->getConfig()->get( 'LegacyJavaScriptGlobals' ), ); return md5( serialize( $data ) ); diff --git a/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php b/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php index 082a65c7f0..40274c6330 100644 --- a/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php +++ b/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php @@ -54,9 +54,9 @@ class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule { * @return array */ public function getStyles( ResourceLoaderContext $context ) { - global $wgAllowUserCssPrefs, $wgUser; + global $wgUser; - if ( !$wgAllowUserCssPrefs ) { + if ( !$this->getConfig()->get( 'AllowUserCssPrefs' ) ) { return array(); } diff --git a/includes/resourceloader/ResourceLoaderUserGroupsModule.php b/includes/resourceloader/ResourceLoaderUserGroupsModule.php index 680c74c6c9..7cf194206e 100644 --- a/includes/resourceloader/ResourceLoaderUserGroupsModule.php +++ b/includes/resourceloader/ResourceLoaderUserGroupsModule.php @@ -37,13 +37,16 @@ class ResourceLoaderUserGroupsModule extends ResourceLoaderWikiModule { * @return array */ protected function getPages( ResourceLoaderContext $context ) { - global $wgUser, $wgUseSiteJs, $wgUseSiteCss; + global $wgUser; $userName = $context->getUser(); if ( $userName === null ) { return array(); } - if ( !$wgUseSiteJs && !$wgUseSiteCss ) { + + $useSiteJs = $this->getConfig()->get( 'UseSiteJs' ); + $useSiteCss = $this->getConfig()->get( 'UseSiteCss' ); + if ( !$useSiteJs && !$useSiteCss ) { return array(); } @@ -62,10 +65,10 @@ class ResourceLoaderUserGroupsModule extends ResourceLoaderWikiModule { if ( $group == '*' ) { continue; } - if ( $wgUseSiteJs ) { + if ( $useSiteJs ) { $pages["MediaWiki:Group-$group.js"] = array( 'type' => 'script' ); } - if ( $wgUseSiteCss ) { + if ( $useSiteCss ) { $pages["MediaWiki:Group-$group.css"] = array( 'type' => 'style' ); } } diff --git a/includes/resourceloader/ResourceLoaderUserModule.php b/includes/resourceloader/ResourceLoaderUserModule.php index 90b4838f92..1b6d1de07c 100644 --- a/includes/resourceloader/ResourceLoaderUserModule.php +++ b/includes/resourceloader/ResourceLoaderUserModule.php @@ -38,13 +38,16 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule { * @return array */ protected function getPages( ResourceLoaderContext $context ) { - global $wgAllowUserJs, $wgAllowUserCss; $username = $context->getUser(); if ( $username === null ) { return array(); } - if ( !$wgAllowUserJs && !$wgAllowUserCss ) { + + $allowUserJs = $this->getConfig()->get( 'AllowUserJs' ); + $allowUserCss = $this->getConfig()->get( 'AllowUserCss' ); + + if ( !$allowUserJs && !$allowUserCss ) { return array(); } @@ -58,11 +61,11 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule { $userpage = $userpageTitle->getPrefixedDBkey(); // Needed so $excludepages works $pages = array(); - if ( $wgAllowUserJs ) { + if ( $allowUserJs ) { $pages["$userpage/common.js"] = array( 'type' => 'script' ); $pages["$userpage/" . $context->getSkin() . '.js'] = array( 'type' => 'script' ); } - if ( $wgAllowUserCss ) { + if ( $allowUserCss ) { $pages["$userpage/common.css"] = array( 'type' => 'style' ); $pages["$userpage/" . $context->getSkin() . '.css'] = array( 'type' => 'style' ); } diff --git a/includes/resourceloader/ResourceLoaderWikiModule.php b/includes/resourceloader/ResourceLoaderWikiModule.php index bfb3c422a2..d9ed91df72 100644 --- a/includes/resourceloader/ResourceLoaderWikiModule.php +++ b/includes/resourceloader/ResourceLoaderWikiModule.php @@ -136,8 +136,6 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule { * @return array */ public function getStyles( ResourceLoaderContext $context ) { - global $wgScriptPath; - $styles = array(); foreach ( $this->getPages( $context ) as $titleText => $options ) { if ( $options['type'] !== 'style' ) { @@ -155,7 +153,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule { if ( $this->getFlip( $context ) ) { $style = CSSJanus::transform( $style, true, false ); } - $style = CSSMin::remap( $style, false, $wgScriptPath, true ); + $style = CSSMin::remap( $style, false, $this->getConfig()->get( 'ScriptPath' ), true ); if ( !isset( $styles[$media] ) ) { $styles[$media] = array(); } diff --git a/includes/revisiondelete/RevDelArchiveItem.php b/includes/revisiondelete/RevDelArchiveItem.php new file mode 100644 index 0000000000..0f1c7f0c9a --- /dev/null +++ b/includes/revisiondelete/RevDelArchiveItem.php @@ -0,0 +1,105 @@ +revision = Revision::newFromArchiveRow( $row, + array( 'page' => $this->list->title->getArticleID() ) ); + } + + public function getIdField() { + return 'ar_timestamp'; + } + + public function getTimestampField() { + return 'ar_timestamp'; + } + + public function getAuthorIdField() { + return 'ar_user'; + } + + public function getAuthorNameField() { + return 'ar_user_text'; + } + + public function getId() { + # Convert DB timestamp to MW timestamp + return $this->revision->getTimestamp(); + } + + public function setBits( $bits ) { + $dbw = wfGetDB( DB_MASTER ); + $dbw->update( 'archive', + array( 'ar_deleted' => $bits ), + array( + 'ar_namespace' => $this->list->title->getNamespace(), + 'ar_title' => $this->list->title->getDBkey(), + // use timestamp for index + 'ar_timestamp' => $this->row->ar_timestamp, + 'ar_rev_id' => $this->row->ar_rev_id, + 'ar_deleted' => $this->getBits() + ), + __METHOD__ ); + + return (bool)$dbw->affectedRows(); + } + + protected function getRevisionLink() { + $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate( + $this->revision->getTimestamp(), $this->list->getUser() ) ); + + if ( $this->isDeleted() && !$this->canViewContent() ) { + return $date; + } + + return Linker::link( + SpecialPage::getTitleFor( 'Undelete' ), + $date, + array(), + array( + 'target' => $this->list->title->getPrefixedText(), + 'timestamp' => $this->revision->getTimestamp() + ) + ); + } + + protected function getDiffLink() { + if ( $this->isDeleted() && !$this->canViewContent() ) { + return $this->list->msg( 'diff' )->escaped(); + } + + return Linker::link( + SpecialPage::getTitleFor( 'Undelete' ), + $this->list->msg( 'diff' )->escaped(), + array(), + array( + 'target' => $this->list->title->getPrefixedText(), + 'diff' => 'prev', + 'timestamp' => $this->revision->getTimestamp() + ) + ); + } +} diff --git a/includes/revisiondelete/RevDelArchiveList.php b/includes/revisiondelete/RevDelArchiveList.php new file mode 100644 index 0000000000..e7aed737e2 --- /dev/null +++ b/includes/revisiondelete/RevDelArchiveList.php @@ -0,0 +1,66 @@ +ids as $id ) { + $timestamps[] = $db->timestamp( $id ); + } + + return $db->select( 'archive', Revision::selectArchiveFields(), + array( + 'ar_namespace' => $this->title->getNamespace(), + 'ar_title' => $this->title->getDBkey(), + 'ar_timestamp' => $timestamps + ), + __METHOD__, + array( 'ORDER BY' => 'ar_timestamp DESC' ) + ); + } + + public function newItem( $row ) { + return new RevDelArchiveItem( $this, $row ); + } + + public function doPreCommitUpdates() { + return Status::newGood(); + } + + public function doPostCommitUpdates() { + return Status::newGood(); + } +} diff --git a/includes/revisiondelete/RevDelArchivedFileItem.php b/includes/revisiondelete/RevDelArchivedFileItem.php new file mode 100644 index 0000000000..7c41c180b7 --- /dev/null +++ b/includes/revisiondelete/RevDelArchivedFileItem.php @@ -0,0 +1,129 @@ +file = ArchivedFile::newFromRow( $row ); + } + + public function getIdField() { + return 'fa_id'; + } + + public function getTimestampField() { + return 'fa_timestamp'; + } + + public function getAuthorIdField() { + return 'fa_user'; + } + + public function getAuthorNameField() { + return 'fa_user_text'; + } + + public function getId() { + return $this->row->fa_id; + } + + public function setBits( $bits ) { + $dbw = wfGetDB( DB_MASTER ); + $dbw->update( 'filearchive', + array( 'fa_deleted' => $bits ), + array( + 'fa_id' => $this->row->fa_id, + 'fa_deleted' => $this->getBits(), + ), + __METHOD__ + ); + + return (bool)$dbw->affectedRows(); + } + + protected function getLink() { + $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate( + $this->file->getTimestamp(), $this->list->getUser() ) ); + + # Hidden files... + if ( !$this->canViewContent() ) { + $link = $date; + } else { + $undelete = SpecialPage::getTitleFor( 'Undelete' ); + $key = $this->file->getKey(); + $link = Linker::link( $undelete, $date, array(), + array( + 'target' => $this->list->title->getPrefixedText(), + 'file' => $key, + 'token' => $this->list->getUser()->getEditToken( $key ) + ) + ); + } + if ( $this->isDeleted() ) { + $link = '' . $link . ''; + } + + return $link; + } + + public function getApiData( ApiResult $result ) { + $file = $this->file; + $user = $this->list->getUser(); + $ret = array( + 'title' => $this->list->title->getPrefixedText(), + 'timestamp' => wfTimestamp( TS_ISO_8601, $file->getTimestamp() ), + 'width' => $file->getWidth(), + 'height' => $file->getHeight(), + 'size' => $file->getSize(), + ); + $ret += $file->isDeleted( Revision::DELETED_USER ) ? array( 'userhidden' => '' ) : array(); + $ret += $file->isDeleted( Revision::DELETED_COMMENT ) ? array( 'commenthidden' => '' ) : array(); + $ret += $this->isDeleted() ? array( 'contenthidden' => '' ) : array(); + if ( $this->canViewContent() ) { + $ret += array( + 'url' => SpecialPage::getTitleFor( 'Revisiondelete' )->getLinkURL( + array( + 'target' => $this->list->title->getPrefixedText(), + 'file' => $file->getKey(), + 'token' => $user->getEditToken( $file->getKey() ) + ), + false, PROTO_RELATIVE + ), + ); + } + if ( $file->userCan( Revision::DELETED_USER, $user ) ) { + $ret += array( + 'userid' => $file->getUser( 'id' ), + 'user' => $file->getUser( 'text' ), + ); + } + if ( $file->userCan( Revision::DELETED_COMMENT, $user ) ) { + $ret += array( + 'comment' => $file->getRawDescription(), + ); + } + + return $ret; + } +} diff --git a/includes/revisiondelete/RevDelArchivedFileList.php b/includes/revisiondelete/RevDelArchivedFileList.php new file mode 100644 index 0000000000..aec51b17c7 --- /dev/null +++ b/includes/revisiondelete/RevDelArchivedFileList.php @@ -0,0 +1,56 @@ +ids ); + + return $db->select( + 'filearchive', + ArchivedFile::selectFields(), + array( + 'fa_name' => $this->title->getDBkey(), + 'fa_id' => $ids + ), + __METHOD__, + array( 'ORDER BY' => 'fa_id DESC' ) + ); + } + + public function newItem( $row ) { + return new RevDelArchivedFileItem( $this, $row ); + } +} diff --git a/includes/revisiondelete/RevDelArchivedRevisionItem.php b/includes/revisiondelete/RevDelArchivedRevisionItem.php new file mode 100644 index 0000000000..9ec548fb2f --- /dev/null +++ b/includes/revisiondelete/RevDelArchivedRevisionItem.php @@ -0,0 +1,53 @@ +revision = Revision::newFromArchiveRow( $row, + array( 'page' => $this->list->title->getArticleID() ) ); + } + + public function getIdField() { + return 'ar_rev_id'; + } + + public function getId() { + return $this->revision->getId(); + } + + public function setBits( $bits ) { + $dbw = wfGetDB( DB_MASTER ); + $dbw->update( 'archive', + array( 'ar_deleted' => $bits ), + array( 'ar_rev_id' => $this->row->ar_rev_id, + 'ar_deleted' => $this->getBits() + ), + __METHOD__ ); + + return (bool)$dbw->affectedRows(); + } +} diff --git a/includes/revisiondelete/RevDelFileItem.php b/includes/revisiondelete/RevDelFileItem.php new file mode 100644 index 0000000000..a6517fe9c7 --- /dev/null +++ b/includes/revisiondelete/RevDelFileItem.php @@ -0,0 +1,237 @@ +file = RepoGroup::singleton()->getLocalRepo()->newFileFromRow( $row ); + } + + public function getIdField() { + return 'oi_archive_name'; + } + + public function getTimestampField() { + return 'oi_timestamp'; + } + + public function getAuthorIdField() { + return 'oi_user'; + } + + public function getAuthorNameField() { + return 'oi_user_text'; + } + + public function getId() { + $parts = explode( '!', $this->row->oi_archive_name ); + + return $parts[0]; + } + + public function canView() { + return $this->file->userCan( File::DELETED_RESTRICTED, $this->list->getUser() ); + } + + public function canViewContent() { + return $this->file->userCan( File::DELETED_FILE, $this->list->getUser() ); + } + + public function getBits() { + return $this->file->getVisibility(); + } + + public function setBits( $bits ) { + # Queue the file op + # @todo FIXME: Move to LocalFile.php + if ( $this->isDeleted() ) { + if ( $bits & File::DELETED_FILE ) { + # Still deleted + } else { + # Newly undeleted + $key = $this->file->getStorageKey(); + $srcRel = $this->file->repo->getDeletedHashPath( $key ) . $key; + $this->list->storeBatch[] = array( + $this->file->repo->getVirtualUrl( 'deleted' ) . '/' . $srcRel, + 'public', + $this->file->getRel() + ); + $this->list->cleanupBatch[] = $key; + } + } elseif ( $bits & File::DELETED_FILE ) { + # Newly deleted + $key = $this->file->getStorageKey(); + $dstRel = $this->file->repo->getDeletedHashPath( $key ) . $key; + $this->list->deleteBatch[] = array( $this->file->getRel(), $dstRel ); + } + + # Do the database operations + $dbw = wfGetDB( DB_MASTER ); + $dbw->update( 'oldimage', + array( 'oi_deleted' => $bits ), + array( + 'oi_name' => $this->row->oi_name, + 'oi_timestamp' => $this->row->oi_timestamp, + 'oi_deleted' => $this->getBits() + ), + __METHOD__ + ); + + return (bool)$dbw->affectedRows(); + } + + public function isDeleted() { + return $this->file->isDeleted( File::DELETED_FILE ); + } + + /** + * Get the link to the file. + * Overridden by RevDelArchivedFileItem. + * @return string + */ + protected function getLink() { + $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate( + $this->file->getTimestamp(), $this->list->getUser() ) ); + + if ( !$this->isDeleted() ) { + # Regular files... + return Html::rawElement( 'a', array( 'href' => $this->file->getUrl() ), $date ); + } + + # Hidden files... + if ( !$this->canViewContent() ) { + $link = $date; + } else { + $link = Linker::link( + SpecialPage::getTitleFor( 'Revisiondelete' ), + $date, + array(), + array( + 'target' => $this->list->title->getPrefixedText(), + 'file' => $this->file->getArchiveName(), + 'token' => $this->list->getUser()->getEditToken( + $this->file->getArchiveName() ) + ) + ); + } + + return '' . $link . ''; + } + + /** + * Generate a user tool link cluster if the current user is allowed to view it + * @return string HTML + */ + protected function getUserTools() { + if ( $this->file->userCan( Revision::DELETED_USER, $this->list->getUser() ) ) { + $uid = $this->file->getUser( 'id' ); + $name = $this->file->getUser( 'text' ); + $link = Linker::userLink( $uid, $name ) . Linker::userToolLinks( $uid, $name ); + } else { + $link = $this->list->msg( 'rev-deleted-user' )->escaped(); + } + if ( $this->file->isDeleted( Revision::DELETED_USER ) ) { + return '' . $link . ''; + } + + return $link; + } + + /** + * Wrap and format the file's comment block, if the current + * user is allowed to view it. + * + * @return string HTML + */ + protected function getComment() { + if ( $this->file->userCan( File::DELETED_COMMENT, $this->list->getUser() ) ) { + $block = Linker::commentBlock( $this->file->getDescription() ); + } else { + $block = ' ' . $this->list->msg( 'rev-deleted-comment' )->escaped(); + } + if ( $this->file->isDeleted( File::DELETED_COMMENT ) ) { + return "$block"; + } + + return $block; + } + + public function getHTML() { + $data = + $this->list->msg( 'widthheight' )->numParams( + $this->file->getWidth(), $this->file->getHeight() )->text() . + ' (' . $this->list->msg( 'nbytes' )->numParams( $this->file->getSize() )->text() . ')'; + + return '
  • ' . $this->getLink() . ' ' . $this->getUserTools() . ' ' . + $data . ' ' . $this->getComment() . '
  • '; + } + + public function getApiData( ApiResult $result ) { + $file = $this->file; + $user = $this->list->getUser(); + $ret = array( + 'title' => $this->list->title->getPrefixedText(), + 'archivename' => $file->getArchiveName(), + 'timestamp' => wfTimestamp( TS_ISO_8601, $file->getTimestamp() ), + 'width' => $file->getWidth(), + 'height' => $file->getHeight(), + 'size' => $file->getSize(), + ); + $ret += $file->isDeleted( Revision::DELETED_USER ) ? array( 'userhidden' => '' ) : array(); + $ret += $file->isDeleted( Revision::DELETED_COMMENT ) ? array( 'commenthidden' => '' ) : array(); + $ret += $this->isDeleted() ? array( 'contenthidden' => '' ) : array(); + if ( !$this->isDeleted() ) { + $ret += array( + 'url' => $file->getUrl(), + ); + } elseif ( $this->canViewContent() ) { + $ret += array( + 'url' => SpecialPage::getTitleFor( 'Revisiondelete' )->getLinkURL( + array( + 'target' => $this->list->title->getPrefixedText(), + 'file' => $file->getArchiveName(), + 'token' => $user->getEditToken( $file->getArchiveName() ) + ), + false, PROTO_RELATIVE + ), + ); + } + if ( $file->userCan( Revision::DELETED_USER, $user ) ) { + $ret += array( + 'userid' => $file->user, + 'user' => $file->user_text, + ); + } + if ( $file->userCan( Revision::DELETED_COMMENT, $user ) ) { + $ret += array( + 'comment' => $file->description, + ); + } + + return $ret; + } +} diff --git a/includes/revisiondelete/RevDelFileList.php b/includes/revisiondelete/RevDelFileList.php new file mode 100644 index 0000000000..57e15d81af --- /dev/null +++ b/includes/revisiondelete/RevDelFileList.php @@ -0,0 +1,128 @@ +ids as $timestamp ) { + $archiveNames[] = $timestamp . '!' . $this->title->getDBkey(); + } + + return $db->select( + 'oldimage', + OldLocalFile::selectFields(), + array( + 'oi_name' => $this->title->getDBkey(), + 'oi_archive_name' => $archiveNames + ), + __METHOD__, + array( 'ORDER BY' => 'oi_timestamp DESC' ) + ); + } + + public function newItem( $row ) { + return new RevDelFileItem( $this, $row ); + } + + public function clearFileOps() { + $this->deleteBatch = array(); + $this->storeBatch = array(); + $this->cleanupBatch = array(); + } + + public function doPreCommitUpdates() { + $status = Status::newGood(); + $repo = RepoGroup::singleton()->getLocalRepo(); + if ( $this->storeBatch ) { + $status->merge( $repo->storeBatch( $this->storeBatch, FileRepo::OVERWRITE_SAME ) ); + } + if ( !$status->isOK() ) { + return $status; + } + if ( $this->deleteBatch ) { + $status->merge( $repo->deleteBatch( $this->deleteBatch ) ); + } + if ( !$status->isOK() ) { + // Running cleanupDeletedBatch() after a failed storeBatch() with the DB already + // modified (but destined for rollback) causes data loss + return $status; + } + if ( $this->cleanupBatch ) { + $status->merge( $repo->cleanupDeletedBatch( $this->cleanupBatch ) ); + } + + return $status; + } + + public function doPostCommitUpdates() { + $file = wfLocalFile( $this->title ); + $file->purgeCache(); + $file->purgeDescription(); + $purgeUrls = array(); + foreach ( $this->ids as $timestamp ) { + $archiveName = $timestamp . '!' . $this->title->getDBkey(); + $file->purgeOldThumbnails( $archiveName ); + $purgeUrls[] = $file->getArchiveUrl( $archiveName ); + } + if ( $this->getConfig()->get( 'UseSquid' ) ) { + // purge full images from cache + SquidUpdate::purge( $purgeUrls ); + } + + return Status::newGood(); + } + + public function getSuppressBit() { + return File::DELETED_RESTRICTED; + } +} diff --git a/includes/revisiondelete/RevDelLogItem.php b/includes/revisiondelete/RevDelLogItem.php new file mode 100644 index 0000000000..5c8b8c9d8f --- /dev/null +++ b/includes/revisiondelete/RevDelLogItem.php @@ -0,0 +1,151 @@ +row, Revision::DELETED_RESTRICTED, $this->list->getUser() ); + } + + public function canViewContent() { + return true; // none + } + + public function getBits() { + return $this->row->log_deleted; + } + + public function setBits( $bits ) { + $dbw = wfGetDB( DB_MASTER ); + $dbw->update( 'recentchanges', + array( + 'rc_deleted' => $bits, + 'rc_patrolled' => 1 + ), + array( + 'rc_logid' => $this->row->log_id, + 'rc_timestamp' => $this->row->log_timestamp // index + ), + __METHOD__ + ); + $dbw->update( 'logging', + array( 'log_deleted' => $bits ), + array( + 'log_id' => $this->row->log_id, + 'log_deleted' => $this->getBits() + ), + __METHOD__ + ); + + return (bool)$dbw->affectedRows(); + } + + public function getHTML() { + $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate( + $this->row->log_timestamp, $this->list->getUser() ) ); + $title = Title::makeTitle( $this->row->log_namespace, $this->row->log_title ); + $formatter = LogFormatter::newFromRow( $this->row ); + $formatter->setContext( $this->list->getContext() ); + $formatter->setAudience( LogFormatter::FOR_THIS_USER ); + + // Log link for this page + $loglink = Linker::link( + SpecialPage::getTitleFor( 'Log' ), + $this->list->msg( 'log' )->escaped(), + array(), + array( 'page' => $title->getPrefixedText() ) + ); + $loglink = $this->list->msg( 'parentheses' )->rawParams( $loglink )->escaped(); + // User links and action text + $action = $formatter->getActionText(); + // Comment + $comment = $this->list->getLanguage()->getDirMark() + . Linker::commentBlock( $this->row->log_comment ); + + if ( LogEventsList::isDeleted( $this->row, LogPage::DELETED_COMMENT ) ) { + $comment = '' . $comment . ''; + } + + return "
  • $loglink $date $action $comment
  • "; + } + + public function getApiData( ApiResult $result ) { + $logEntry = DatabaseLogEntry::newFromRow( $this->row ); + $user = $this->list->getUser(); + $ret = array( + 'id' => $logEntry->getId(), + 'type' => $logEntry->getType(), + 'action' => $logEntry->getSubtype(), + ); + $ret += $logEntry->isDeleted( LogPage::DELETED_USER ) + ? array( 'userhidden' => '' ) + : array(); + $ret += $logEntry->isDeleted( LogPage::DELETED_COMMENT ) + ? array( 'commenthidden' => '' ) + : array(); + $ret += $logEntry->isDeleted( LogPage::DELETED_ACTION ) + ? array( 'actionhidden' => '' ) + : array(); + + if ( LogEventsList::userCan( $this->row, LogPage::DELETED_ACTION, $user ) ) { + ApiQueryLogEvents::addLogParams( + $result, + $ret, + $logEntry->getParameters(), + $logEntry->getType(), + $logEntry->getSubtype(), + $logEntry->getTimestamp(), + $logEntry->isLegacy() + ); + } + if ( LogEventsList::userCan( $this->row, LogPage::DELETED_USER, $user ) ) { + $ret += array( + 'userid' => $this->row->log_user, + 'user' => $this->row->log_user_text, + ); + } + if ( LogEventsList::userCan( $this->row, LogPage::DELETED_COMMENT, $user ) ) { + $ret += array( + 'comment' => $this->row->log_comment, + ); + } + + return $ret; + } +} diff --git a/includes/revisiondelete/RevDelLogList.php b/includes/revisiondelete/RevDelLogList.php new file mode 100644 index 0000000000..ad0404259d --- /dev/null +++ b/includes/revisiondelete/RevDelLogList.php @@ -0,0 +1,103 @@ +select( 'logging', + 'log_type', + array( 'log_id' => $ids ), + __METHOD__, + array( 'DISTINCT' ) + ); + if ( $result->numRows() == 1 ) { + // If there's only one type, the target can be set to include it. + return SpecialPage::getTitleFor( 'Log', $result->current()->log_type ); + } + + return SpecialPage::getTitleFor( 'Log' ); + } + + /** + * @param DatabaseBase $db + * @return mixed + */ + public function doQuery( $db ) { + $ids = array_map( 'intval', $this->ids ); + + return $db->select( 'logging', array( + 'log_id', + 'log_type', + 'log_action', + 'log_timestamp', + 'log_user', + 'log_user_text', + 'log_namespace', + 'log_title', + 'log_page', + 'log_comment', + 'log_params', + 'log_deleted' + ), + array( 'log_id' => $ids ), + __METHOD__, + array( 'ORDER BY' => 'log_id DESC' ) + ); + } + + public function newItem( $row ) { + return new RevDelLogItem( $this, $row ); + } + + public function getSuppressBit() { + return Revision::DELETED_RESTRICTED; + } + + public function getLogAction() { + return 'event'; + } + + public function getLogParams( $params ) { + return array( + implode( ',', $params['ids'] ), + "ofield={$params['oldBits']}", + "nfield={$params['newBits']}" + ); + } +} diff --git a/includes/revisiondelete/RevDelRevisionItem.php b/includes/revisiondelete/RevDelRevisionItem.php new file mode 100644 index 0000000000..300ce6adb7 --- /dev/null +++ b/includes/revisiondelete/RevDelRevisionItem.php @@ -0,0 +1,187 @@ +revision = new Revision( $row ); + } + + public function getIdField() { + return 'rev_id'; + } + + public function getTimestampField() { + return 'rev_timestamp'; + } + + public function getAuthorIdField() { + return 'rev_user'; + } + + public function getAuthorNameField() { + return 'rev_user_text'; + } + + public function canView() { + return $this->revision->userCan( Revision::DELETED_RESTRICTED, $this->list->getUser() ); + } + + public function canViewContent() { + return $this->revision->userCan( Revision::DELETED_TEXT, $this->list->getUser() ); + } + + public function getBits() { + return $this->revision->getVisibility(); + } + + public function setBits( $bits ) { + $dbw = wfGetDB( DB_MASTER ); + // Update revision table + $dbw->update( 'revision', + array( 'rev_deleted' => $bits ), + array( + 'rev_id' => $this->revision->getId(), + 'rev_page' => $this->revision->getPage(), + 'rev_deleted' => $this->getBits() + ), + __METHOD__ + ); + if ( !$dbw->affectedRows() ) { + // Concurrent fail! + return false; + } + // Update recentchanges table + $dbw->update( 'recentchanges', + array( + 'rc_deleted' => $bits, + 'rc_patrolled' => 1 + ), + array( + 'rc_this_oldid' => $this->revision->getId(), // condition + // non-unique timestamp index + 'rc_timestamp' => $dbw->timestamp( $this->revision->getTimestamp() ), + ), + __METHOD__ + ); + + return true; + } + + public function isDeleted() { + return $this->revision->isDeleted( Revision::DELETED_TEXT ); + } + + public function isHideCurrentOp( $newBits ) { + return ( $newBits & Revision::DELETED_TEXT ) + && $this->list->getCurrent() == $this->getId(); + } + + /** + * Get the HTML link to the revision text. + * Overridden by RevDelArchiveItem. + * @return string + */ + protected function getRevisionLink() { + $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate( + $this->revision->getTimestamp(), $this->list->getUser() ) ); + + if ( $this->isDeleted() && !$this->canViewContent() ) { + return $date; + } + + return Linker::linkKnown( + $this->list->title, + $date, + array(), + array( + 'oldid' => $this->revision->getId(), + 'unhide' => 1 + ) + ); + } + + /** + * Get the HTML link to the diff. + * Overridden by RevDelArchiveItem + * @return string + */ + protected function getDiffLink() { + if ( $this->isDeleted() && !$this->canViewContent() ) { + return $this->list->msg( 'diff' )->escaped(); + } else { + return Linker::linkKnown( + $this->list->title, + $this->list->msg( 'diff' )->escaped(), + array(), + array( + 'diff' => $this->revision->getId(), + 'oldid' => 'prev', + 'unhide' => 1 + ) + ); + } + } + + public function getHTML() { + $difflink = $this->list->msg( 'parentheses' ) + ->rawParams( $this->getDiffLink() )->escaped(); + $revlink = $this->getRevisionLink(); + $userlink = Linker::revUserLink( $this->revision ); + $comment = Linker::revComment( $this->revision ); + if ( $this->isDeleted() ) { + $revlink = "$revlink"; + } + + return "
  • $difflink $revlink $userlink $comment
  • "; + } + + public function getApiData( ApiResult $result ) { + $rev = $this->revision; + $user = $this->list->getUser(); + $ret = array( + 'id' => $rev->getId(), + 'timestamp' => wfTimestamp( TS_ISO_8601, $rev->getTimestamp() ), + ); + $ret += $rev->isDeleted( Revision::DELETED_USER ) ? array( 'userhidden' => '' ) : array(); + $ret += $rev->isDeleted( Revision::DELETED_COMMENT ) ? array( 'commenthidden' => '' ) : array(); + $ret += $rev->isDeleted( Revision::DELETED_TEXT ) ? array( 'texthidden' => '' ) : array(); + if ( $rev->userCan( Revision::DELETED_USER, $user ) ) { + $ret += array( + 'userid' => $rev->getUser( Revision::FOR_THIS_USER ), + 'user' => $rev->getUserText( Revision::FOR_THIS_USER ), + ); + } + if ( $rev->userCan( Revision::DELETED_COMMENT, $user ) ) { + $ret += array( + 'comment' => $rev->getComment( Revision::FOR_THIS_USER ), + ); + } + + return $ret; + } +} diff --git a/includes/revisiondelete/RevDelRevisionList.php b/includes/revisiondelete/RevDelRevisionList.php new file mode 100644 index 0000000000..25450725da --- /dev/null +++ b/includes/revisiondelete/RevDelRevisionList.php @@ -0,0 +1,143 @@ +getTitle() : $target; + } + + /** + * @param DatabaseBase $db + * @return mixed + */ + public function doQuery( $db ) { + $ids = array_map( 'intval', $this->ids ); + $live = $db->select( + array( 'revision', 'page', 'user' ), + array_merge( Revision::selectFields(), Revision::selectUserFields() ), + array( + 'rev_page' => $this->title->getArticleID(), + 'rev_id' => $ids, + ), + __METHOD__, + array( 'ORDER BY' => 'rev_id DESC' ), + array( + 'page' => Revision::pageJoinCond(), + 'user' => Revision::userJoinCond() ) + ); + + if ( $live->numRows() >= count( $ids ) ) { + // All requested revisions are live, keeps things simple! + return $live; + } + + // Check if any requested revisions are available fully deleted. + $archived = $db->select( array( 'archive' ), Revision::selectArchiveFields(), + array( + 'ar_rev_id' => $ids + ), + __METHOD__, + array( 'ORDER BY' => 'ar_rev_id DESC' ) + ); + + if ( $archived->numRows() == 0 ) { + return $live; + } elseif ( $live->numRows() == 0 ) { + return $archived; + } else { + // Combine the two! Whee + $rows = array(); + foreach ( $live as $row ) { + $rows[$row->rev_id] = $row; + } + foreach ( $archived as $row ) { + $rows[$row->ar_rev_id] = $row; + } + krsort( $rows ); + return new FakeResultWrapper( array_values( $rows ) ); + } + } + + public function newItem( $row ) { + if ( isset( $row->rev_id ) ) { + return new RevDelRevisionItem( $this, $row ); + } elseif ( isset( $row->ar_rev_id ) ) { + return new RevDelArchivedRevisionItem( $this, $row ); + } else { + // This shouldn't happen. :) + throw new MWException( 'Invalid row type in RevDelRevisionList' ); + } + } + + public function getCurrent() { + if ( is_null( $this->currentRevId ) ) { + $dbw = wfGetDB( DB_MASTER ); + $this->currentRevId = $dbw->selectField( + 'page', 'page_latest', $this->title->pageCond(), __METHOD__ ); + } + return $this->currentRevId; + } + + public function getSuppressBit() { + return Revision::DELETED_RESTRICTED; + } + + public function doPreCommitUpdates() { + $this->title->invalidateCache(); + return Status::newGood(); + } + + public function doPostCommitUpdates() { + $this->title->purgeSquid(); + // Extensions that require referencing previous revisions may need this + wfRunHooks( 'ArticleRevisionVisibilitySet', array( &$this->title ) ); + return Status::newGood(); + } +} diff --git a/includes/revisiondelete/RevisionDelete.php b/includes/revisiondelete/RevisionDelete.php deleted file mode 100644 index 8a08fd1c57..0000000000 --- a/includes/revisiondelete/RevisionDelete.php +++ /dev/null @@ -1,1137 +0,0 @@ -getTitle() : $target; - } - - /** - * @param DatabaseBase $db - * @return mixed - */ - public function doQuery( $db ) { - $ids = array_map( 'intval', $this->ids ); - $live = $db->select( - array( 'revision', 'page', 'user' ), - array_merge( Revision::selectFields(), Revision::selectUserFields() ), - array( - 'rev_page' => $this->title->getArticleID(), - 'rev_id' => $ids, - ), - __METHOD__, - array( 'ORDER BY' => 'rev_id DESC' ), - array( - 'page' => Revision::pageJoinCond(), - 'user' => Revision::userJoinCond() ) - ); - - if ( $live->numRows() >= count( $ids ) ) { - // All requested revisions are live, keeps things simple! - return $live; - } - - // Check if any requested revisions are available fully deleted. - $archived = $db->select( array( 'archive' ), Revision::selectArchiveFields(), - array( - 'ar_rev_id' => $ids - ), - __METHOD__, - array( 'ORDER BY' => 'ar_rev_id DESC' ) - ); - - if ( $archived->numRows() == 0 ) { - return $live; - } elseif ( $live->numRows() == 0 ) { - return $archived; - } else { - // Combine the two! Whee - $rows = array(); - foreach ( $live as $row ) { - $rows[$row->rev_id] = $row; - } - foreach ( $archived as $row ) { - $rows[$row->ar_rev_id] = $row; - } - krsort( $rows ); - return new FakeResultWrapper( array_values( $rows ) ); - } - } - - public function newItem( $row ) { - if ( isset( $row->rev_id ) ) { - return new RevDelRevisionItem( $this, $row ); - } elseif ( isset( $row->ar_rev_id ) ) { - return new RevDelArchivedRevisionItem( $this, $row ); - } else { - // This shouldn't happen. :) - throw new MWException( 'Invalid row type in RevDelRevisionList' ); - } - } - - public function getCurrent() { - if ( is_null( $this->currentRevId ) ) { - $dbw = wfGetDB( DB_MASTER ); - $this->currentRevId = $dbw->selectField( - 'page', 'page_latest', $this->title->pageCond(), __METHOD__ ); - } - return $this->currentRevId; - } - - public function getSuppressBit() { - return Revision::DELETED_RESTRICTED; - } - - public function doPreCommitUpdates() { - $this->title->invalidateCache(); - return Status::newGood(); - } - - public function doPostCommitUpdates() { - $this->title->purgeSquid(); - // Extensions that require referencing previous revisions may need this - wfRunHooks( 'ArticleRevisionVisibilitySet', array( &$this->title ) ); - return Status::newGood(); - } -} - -/** - * Item class for a live revision table row - */ -class RevDelRevisionItem extends RevDelItem { - /** @var Revision */ - var $revision; - - public function __construct( $list, $row ) { - parent::__construct( $list, $row ); - $this->revision = new Revision( $row ); - } - - public function getIdField() { - return 'rev_id'; - } - - public function getTimestampField() { - return 'rev_timestamp'; - } - - public function getAuthorIdField() { - return 'rev_user'; - } - - public function getAuthorNameField() { - return 'rev_user_text'; - } - - public function canView() { - return $this->revision->userCan( Revision::DELETED_RESTRICTED, $this->list->getUser() ); - } - - public function canViewContent() { - return $this->revision->userCan( Revision::DELETED_TEXT, $this->list->getUser() ); - } - - public function getBits() { - return $this->revision->getVisibility(); - } - - public function setBits( $bits ) { - $dbw = wfGetDB( DB_MASTER ); - // Update revision table - $dbw->update( 'revision', - array( 'rev_deleted' => $bits ), - array( - 'rev_id' => $this->revision->getId(), - 'rev_page' => $this->revision->getPage(), - 'rev_deleted' => $this->getBits() - ), - __METHOD__ - ); - if ( !$dbw->affectedRows() ) { - // Concurrent fail! - return false; - } - // Update recentchanges table - $dbw->update( 'recentchanges', - array( - 'rc_deleted' => $bits, - 'rc_patrolled' => 1 - ), - array( - 'rc_this_oldid' => $this->revision->getId(), // condition - // non-unique timestamp index - 'rc_timestamp' => $dbw->timestamp( $this->revision->getTimestamp() ), - ), - __METHOD__ - ); - return true; - } - - public function isDeleted() { - return $this->revision->isDeleted( Revision::DELETED_TEXT ); - } - - public function isHideCurrentOp( $newBits ) { - return ( $newBits & Revision::DELETED_TEXT ) - && $this->list->getCurrent() == $this->getId(); - } - - /** - * Get the HTML link to the revision text. - * Overridden by RevDelArchiveItem. - * @return string - */ - protected function getRevisionLink() { - $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate( - $this->revision->getTimestamp(), $this->list->getUser() ) ); - - if ( $this->isDeleted() && !$this->canViewContent() ) { - return $date; - } - return Linker::linkKnown( - $this->list->title, - $date, - array(), - array( - 'oldid' => $this->revision->getId(), - 'unhide' => 1 - ) - ); - } - - /** - * Get the HTML link to the diff. - * Overridden by RevDelArchiveItem - * @return string - */ - protected function getDiffLink() { - if ( $this->isDeleted() && !$this->canViewContent() ) { - return $this->list->msg( 'diff' )->escaped(); - } else { - return Linker::linkKnown( - $this->list->title, - $this->list->msg( 'diff' )->escaped(), - array(), - array( - 'diff' => $this->revision->getId(), - 'oldid' => 'prev', - 'unhide' => 1 - ) - ); - } - } - - public function getHTML() { - $difflink = $this->list->msg( 'parentheses' ) - ->rawParams( $this->getDiffLink() )->escaped(); - $revlink = $this->getRevisionLink(); - $userlink = Linker::revUserLink( $this->revision ); - $comment = Linker::revComment( $this->revision ); - if ( $this->isDeleted() ) { - $revlink = "$revlink"; - } - return "
  • $difflink $revlink $userlink $comment
  • "; - } - - public function getApiData( ApiResult $result ) { - $rev = $this->revision; - $user = $this->list->getUser(); - $ret = array( - 'id' => $rev->getId(), - 'timestamp' => wfTimestamp( TS_ISO_8601, $rev->getTimestamp() ), - ); - $ret += $rev->isDeleted( Revision::DELETED_USER ) ? array( 'userhidden' => '' ) : array(); - $ret += $rev->isDeleted( Revision::DELETED_COMMENT ) ? array( 'commenthidden' => '' ) : array(); - $ret += $rev->isDeleted( Revision::DELETED_TEXT ) ? array( 'texthidden' => '' ) : array(); - if ( $rev->userCan( Revision::DELETED_USER, $user ) ) { - $ret += array( - 'userid' => $rev->getUser( Revision::FOR_THIS_USER ), - 'user' => $rev->getUserText( Revision::FOR_THIS_USER ), - ); - } - if ( $rev->userCan( Revision::DELETED_COMMENT, $user ) ) { - $ret += array( - 'comment' => $rev->getComment( Revision::FOR_THIS_USER ), - ); - } - return $ret; - } -} - -/** - * List for archive table items, i.e. revisions deleted via action=delete - */ -class RevDelArchiveList extends RevDelRevisionList { - public function getType() { - return 'archive'; - } - - public static function getRelationType() { - return 'ar_timestamp'; - } - - /** - * @param DatabaseBase $db - * @return mixed - */ - public function doQuery( $db ) { - $timestamps = array(); - foreach ( $this->ids as $id ) { - $timestamps[] = $db->timestamp( $id ); - } - return $db->select( 'archive', Revision::selectArchiveFields(), - array( - 'ar_namespace' => $this->title->getNamespace(), - 'ar_title' => $this->title->getDBkey(), - 'ar_timestamp' => $timestamps - ), - __METHOD__, - array( 'ORDER BY' => 'ar_timestamp DESC' ) - ); - } - - public function newItem( $row ) { - return new RevDelArchiveItem( $this, $row ); - } - - public function doPreCommitUpdates() { - return Status::newGood(); - } - - public function doPostCommitUpdates() { - return Status::newGood(); - } -} - -/** - * Item class for a archive table row - */ -class RevDelArchiveItem extends RevDelRevisionItem { - public function __construct( $list, $row ) { - RevDelItem::__construct( $list, $row ); - $this->revision = Revision::newFromArchiveRow( $row, - array( 'page' => $this->list->title->getArticleID() ) ); - } - - public function getIdField() { - return 'ar_timestamp'; - } - - public function getTimestampField() { - return 'ar_timestamp'; - } - - public function getAuthorIdField() { - return 'ar_user'; - } - - public function getAuthorNameField() { - return 'ar_user_text'; - } - - public function getId() { - # Convert DB timestamp to MW timestamp - return $this->revision->getTimestamp(); - } - - public function setBits( $bits ) { - $dbw = wfGetDB( DB_MASTER ); - $dbw->update( 'archive', - array( 'ar_deleted' => $bits ), - array( - 'ar_namespace' => $this->list->title->getNamespace(), - 'ar_title' => $this->list->title->getDBkey(), - // use timestamp for index - 'ar_timestamp' => $this->row->ar_timestamp, - 'ar_rev_id' => $this->row->ar_rev_id, - 'ar_deleted' => $this->getBits() - ), - __METHOD__ ); - return (bool)$dbw->affectedRows(); - } - - protected function getRevisionLink() { - $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate( - $this->revision->getTimestamp(), $this->list->getUser() ) ); - - if ( $this->isDeleted() && !$this->canViewContent() ) { - return $date; - } - - return Linker::link( - SpecialPage::getTitleFor( 'Undelete' ), - $date, - array(), - array( - 'target' => $this->list->title->getPrefixedText(), - 'timestamp' => $this->revision->getTimestamp() - ) - ); - } - - protected function getDiffLink() { - if ( $this->isDeleted() && !$this->canViewContent() ) { - return $this->list->msg( 'diff' )->escaped(); - } - - return Linker::link( - SpecialPage::getTitleFor( 'Undelete' ), - $this->list->msg( 'diff' )->escaped(), - array(), - array( - 'target' => $this->list->title->getPrefixedText(), - 'diff' => 'prev', - 'timestamp' => $this->revision->getTimestamp() - ) - ); - } -} - -/** - * Item class for a archive table row by ar_rev_id -- actually - * used via RevDelRevisionList. - */ -class RevDelArchivedRevisionItem extends RevDelArchiveItem { - public function __construct( $list, $row ) { - RevDelItem::__construct( $list, $row ); - - $this->revision = Revision::newFromArchiveRow( $row, - array( 'page' => $this->list->title->getArticleID() ) ); - } - - public function getIdField() { - return 'ar_rev_id'; - } - - public function getId() { - return $this->revision->getId(); - } - - public function setBits( $bits ) { - $dbw = wfGetDB( DB_MASTER ); - $dbw->update( 'archive', - array( 'ar_deleted' => $bits ), - array( 'ar_rev_id' => $this->row->ar_rev_id, - 'ar_deleted' => $this->getBits() - ), - __METHOD__ ); - return (bool)$dbw->affectedRows(); - } -} - -/** - * List for oldimage table items - */ -class RevDelFileList extends RevDelList { - /** @var array */ - var $storeBatch; - - /** @var array */ - var $deleteBatch; - - /** @var array */ - var $cleanupBatch; - - public function getType() { - return 'oldimage'; - } - - public static function getRelationType() { - return 'oi_archive_name'; - } - - public static function getRestriction() { - return 'deleterevision'; - } - - public static function getRevdelConstant() { - return File::DELETED_FILE; - } - - /** - * @param DatabaseBase $db - * @return mixed - */ - public function doQuery( $db ) { - $archiveNames = array(); - foreach ( $this->ids as $timestamp ) { - $archiveNames[] = $timestamp . '!' . $this->title->getDBkey(); - } - return $db->select( - 'oldimage', - OldLocalFile::selectFields(), - array( - 'oi_name' => $this->title->getDBkey(), - 'oi_archive_name' => $archiveNames - ), - __METHOD__, - array( 'ORDER BY' => 'oi_timestamp DESC' ) - ); - } - - public function newItem( $row ) { - return new RevDelFileItem( $this, $row ); - } - - public function clearFileOps() { - $this->deleteBatch = array(); - $this->storeBatch = array(); - $this->cleanupBatch = array(); - } - - public function doPreCommitUpdates() { - $status = Status::newGood(); - $repo = RepoGroup::singleton()->getLocalRepo(); - if ( $this->storeBatch ) { - $status->merge( $repo->storeBatch( $this->storeBatch, FileRepo::OVERWRITE_SAME ) ); - } - if ( !$status->isOK() ) { - return $status; - } - if ( $this->deleteBatch ) { - $status->merge( $repo->deleteBatch( $this->deleteBatch ) ); - } - if ( !$status->isOK() ) { - // Running cleanupDeletedBatch() after a failed storeBatch() with the DB already - // modified (but destined for rollback) causes data loss - return $status; - } - if ( $this->cleanupBatch ) { - $status->merge( $repo->cleanupDeletedBatch( $this->cleanupBatch ) ); - } - return $status; - } - - public function doPostCommitUpdates() { - global $wgUseSquid; - $file = wfLocalFile( $this->title ); - $file->purgeCache(); - $file->purgeDescription(); - $purgeUrls = array(); - foreach ( $this->ids as $timestamp ) { - $archiveName = $timestamp . '!' . $this->title->getDBkey(); - $file->purgeOldThumbnails( $archiveName ); - $purgeUrls[] = $file->getArchiveUrl( $archiveName ); - } - if ( $wgUseSquid ) { - // purge full images from cache - SquidUpdate::purge( $purgeUrls ); - } - return Status::newGood(); - } - - public function getSuppressBit() { - return File::DELETED_RESTRICTED; - } -} - -/** - * Item class for an oldimage table row - */ -class RevDelFileItem extends RevDelItem { - /** @var File */ - var $file; - - public function __construct( $list, $row ) { - parent::__construct( $list, $row ); - $this->file = RepoGroup::singleton()->getLocalRepo()->newFileFromRow( $row ); - } - - public function getIdField() { - return 'oi_archive_name'; - } - - public function getTimestampField() { - return 'oi_timestamp'; - } - - public function getAuthorIdField() { - return 'oi_user'; - } - - public function getAuthorNameField() { - return 'oi_user_text'; - } - - public function getId() { - $parts = explode( '!', $this->row->oi_archive_name ); - return $parts[0]; - } - - public function canView() { - return $this->file->userCan( File::DELETED_RESTRICTED, $this->list->getUser() ); - } - - public function canViewContent() { - return $this->file->userCan( File::DELETED_FILE, $this->list->getUser() ); - } - - public function getBits() { - return $this->file->getVisibility(); - } - - public function setBits( $bits ) { - # Queue the file op - # @todo FIXME: Move to LocalFile.php - if ( $this->isDeleted() ) { - if ( $bits & File::DELETED_FILE ) { - # Still deleted - } else { - # Newly undeleted - $key = $this->file->getStorageKey(); - $srcRel = $this->file->repo->getDeletedHashPath( $key ) . $key; - $this->list->storeBatch[] = array( - $this->file->repo->getVirtualUrl( 'deleted' ) . '/' . $srcRel, - 'public', - $this->file->getRel() - ); - $this->list->cleanupBatch[] = $key; - } - } elseif ( $bits & File::DELETED_FILE ) { - # Newly deleted - $key = $this->file->getStorageKey(); - $dstRel = $this->file->repo->getDeletedHashPath( $key ) . $key; - $this->list->deleteBatch[] = array( $this->file->getRel(), $dstRel ); - } - - # Do the database operations - $dbw = wfGetDB( DB_MASTER ); - $dbw->update( 'oldimage', - array( 'oi_deleted' => $bits ), - array( - 'oi_name' => $this->row->oi_name, - 'oi_timestamp' => $this->row->oi_timestamp, - 'oi_deleted' => $this->getBits() - ), - __METHOD__ - ); - return (bool)$dbw->affectedRows(); - } - - public function isDeleted() { - return $this->file->isDeleted( File::DELETED_FILE ); - } - - /** - * Get the link to the file. - * Overridden by RevDelArchivedFileItem. - * @return string - */ - protected function getLink() { - $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate( - $this->file->getTimestamp(), $this->list->getUser() ) ); - - if ( !$this->isDeleted() ) { - # Regular files... - return Html::rawElement( 'a', array( 'href' => $this->file->getUrl() ), $date ); - } - - # Hidden files... - if ( !$this->canViewContent() ) { - $link = $date; - } else { - $link = Linker::link( - SpecialPage::getTitleFor( 'Revisiondelete' ), - $date, - array(), - array( - 'target' => $this->list->title->getPrefixedText(), - 'file' => $this->file->getArchiveName(), - 'token' => $this->list->getUser()->getEditToken( - $this->file->getArchiveName() ) - ) - ); - } - return '' . $link . ''; - } - - /** - * Generate a user tool link cluster if the current user is allowed to view it - * @return string HTML - */ - protected function getUserTools() { - if ( $this->file->userCan( Revision::DELETED_USER, $this->list->getUser() ) ) { - $uid = $this->file->getUser( 'id' ); - $name = $this->file->getUser( 'text' ); - $link = Linker::userLink( $uid, $name ) . Linker::userToolLinks( $uid, $name ); - } else { - $link = $this->list->msg( 'rev-deleted-user' )->escaped(); - } - if ( $this->file->isDeleted( Revision::DELETED_USER ) ) { - return '' . $link . ''; - } - return $link; - } - - /** - * Wrap and format the file's comment block, if the current - * user is allowed to view it. - * - * @return string HTML - */ - protected function getComment() { - if ( $this->file->userCan( File::DELETED_COMMENT, $this->list->getUser() ) ) { - $block = Linker::commentBlock( $this->file->getDescription() ); - } else { - $block = ' ' . $this->list->msg( 'rev-deleted-comment' )->escaped(); - } - if ( $this->file->isDeleted( File::DELETED_COMMENT ) ) { - return "$block"; - } - return $block; - } - - public function getHTML() { - $data = - $this->list->msg( 'widthheight' )->numParams( - $this->file->getWidth(), $this->file->getHeight() )->text() . - ' (' . $this->list->msg( 'nbytes' )->numParams( $this->file->getSize() )->text() . ')'; - - return '
  • ' . $this->getLink() . ' ' . $this->getUserTools() . ' ' . - $data . ' ' . $this->getComment() . '
  • '; - } - - public function getApiData( ApiResult $result ) { - $file = $this->file; - $user = $this->list->getUser(); - $ret = array( - 'title' => $this->list->title->getPrefixedText(), - 'archivename' => $file->getArchiveName(), - 'timestamp' => wfTimestamp( TS_ISO_8601, $file->getTimestamp() ), - 'width' => $file->getWidth(), - 'height' => $file->getHeight(), - 'size' => $file->getSize(), - ); - $ret += $file->isDeleted( Revision::DELETED_USER ) ? array( 'userhidden' => '' ) : array(); - $ret += $file->isDeleted( Revision::DELETED_COMMENT ) ? array( 'commenthidden' => '' ) : array(); - $ret += $this->isDeleted() ? array( 'contenthidden' => '' ) : array(); - if ( !$this->isDeleted() ) { - $ret += array( - 'url' => $file->getUrl(), - ); - } elseif ( $this->canViewContent() ) { - $ret += array( - 'url' => SpecialPage::getTitleFor( 'Revisiondelete' )->getLinkURL( - array( - 'target' => $this->list->title->getPrefixedText(), - 'file' => $file->getArchiveName(), - 'token' => $user->getEditToken( $file->getArchiveName() ) - ), - false, PROTO_RELATIVE - ), - ); - } - if ( $file->userCan( Revision::DELETED_USER, $user ) ) { - $ret += array( - 'userid' => $file->user, - 'user' => $file->user_text, - ); - } - if ( $file->userCan( Revision::DELETED_COMMENT, $user ) ) { - $ret += array( - 'comment' => $file->description, - ); - } - return $ret; - } -} - -/** - * List for filearchive table items - */ -class RevDelArchivedFileList extends RevDelFileList { - public function getType() { - return 'filearchive'; - } - - public static function getRelationType() { - return 'fa_id'; - } - - /** - * @param DatabaseBase $db - * @return mixed - */ - public function doQuery( $db ) { - $ids = array_map( 'intval', $this->ids ); - return $db->select( - 'filearchive', - ArchivedFile::selectFields(), - array( - 'fa_name' => $this->title->getDBkey(), - 'fa_id' => $ids - ), - __METHOD__, - array( 'ORDER BY' => 'fa_id DESC' ) - ); - } - - public function newItem( $row ) { - return new RevDelArchivedFileItem( $this, $row ); - } -} - -/** - * Item class for a filearchive table row - */ -class RevDelArchivedFileItem extends RevDelFileItem { - public function __construct( $list, $row ) { - RevDelItem::__construct( $list, $row ); - $this->file = ArchivedFile::newFromRow( $row ); - } - - public function getIdField() { - return 'fa_id'; - } - - public function getTimestampField() { - return 'fa_timestamp'; - } - - public function getAuthorIdField() { - return 'fa_user'; - } - - public function getAuthorNameField() { - return 'fa_user_text'; - } - - public function getId() { - return $this->row->fa_id; - } - - public function setBits( $bits ) { - $dbw = wfGetDB( DB_MASTER ); - $dbw->update( 'filearchive', - array( 'fa_deleted' => $bits ), - array( - 'fa_id' => $this->row->fa_id, - 'fa_deleted' => $this->getBits(), - ), - __METHOD__ - ); - return (bool)$dbw->affectedRows(); - } - - protected function getLink() { - $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate( - $this->file->getTimestamp(), $this->list->getUser() ) ); - - # Hidden files... - if ( !$this->canViewContent() ) { - $link = $date; - } else { - $undelete = SpecialPage::getTitleFor( 'Undelete' ); - $key = $this->file->getKey(); - $link = Linker::link( $undelete, $date, array(), - array( - 'target' => $this->list->title->getPrefixedText(), - 'file' => $key, - 'token' => $this->list->getUser()->getEditToken( $key ) - ) - ); - } - if ( $this->isDeleted() ) { - $link = '' . $link . ''; - } - return $link; - } - - public function getApiData( ApiResult $result ) { - $file = $this->file; - $user = $this->list->getUser(); - $ret = array( - 'title' => $this->list->title->getPrefixedText(), - 'timestamp' => wfTimestamp( TS_ISO_8601, $file->getTimestamp() ), - 'width' => $file->getWidth(), - 'height' => $file->getHeight(), - 'size' => $file->getSize(), - ); - $ret += $file->isDeleted( Revision::DELETED_USER ) ? array( 'userhidden' => '' ) : array(); - $ret += $file->isDeleted( Revision::DELETED_COMMENT ) ? array( 'commenthidden' => '' ) : array(); - $ret += $this->isDeleted() ? array( 'contenthidden' => '' ) : array(); - if ( $this->canViewContent() ) { - $ret += array( - 'url' => SpecialPage::getTitleFor( 'Revisiondelete' )->getLinkURL( - array( - 'target' => $this->list->title->getPrefixedText(), - 'file' => $file->getKey(), - 'token' => $user->getEditToken( $file->getKey() ) - ), - false, PROTO_RELATIVE - ), - ); - } - if ( $file->userCan( Revision::DELETED_USER, $user ) ) { - $ret += array( - 'userid' => $file->getUser( 'id' ), - 'user' => $file->getUser( 'text' ), - ); - } - if ( $file->userCan( Revision::DELETED_COMMENT, $user ) ) { - $ret += array( - 'comment' => $file->getRawDescription(), - ); - } - return $ret; - } -} - -/** - * List for logging table items - */ -class RevDelLogList extends RevDelList { - public function getType() { - return 'logging'; - } - - public static function getRelationType() { - return 'log_id'; - } - - public static function getRestriction() { - return 'deletelogentry'; - } - - public static function getRevdelConstant() { - return LogPage::DELETED_ACTION; - } - - public static function suggestTarget( $target, array $ids ) { - $result = wfGetDB( DB_SLAVE )->select( 'logging', - 'log_type', - array( 'log_id' => $ids ), - __METHOD__, - array( 'DISTINCT' ) - ); - if ( $result->numRows() == 1 ) { - // If there's only one type, the target can be set to include it. - return SpecialPage::getTitleFor( 'Log', $result->current()->log_type ); - } - return SpecialPage::getTitleFor( 'Log' ); - } - - /** - * @param DatabaseBase $db - * @return mixed - */ - public function doQuery( $db ) { - $ids = array_map( 'intval', $this->ids ); - return $db->select( 'logging', array( - 'log_id', - 'log_type', - 'log_action', - 'log_timestamp', - 'log_user', - 'log_user_text', - 'log_namespace', - 'log_title', - 'log_page', - 'log_comment', - 'log_params', - 'log_deleted' - ), - array( 'log_id' => $ids ), - __METHOD__, - array( 'ORDER BY' => 'log_id DESC' ) - ); - } - - public function newItem( $row ) { - return new RevDelLogItem( $this, $row ); - } - - public function getSuppressBit() { - return Revision::DELETED_RESTRICTED; - } - - public function getLogAction() { - return 'event'; - } - - public function getLogParams( $params ) { - return array( - implode( ',', $params['ids'] ), - "ofield={$params['oldBits']}", - "nfield={$params['newBits']}" - ); - } -} - -/** - * Item class for a logging table row - */ -class RevDelLogItem extends RevDelItem { - public function getIdField() { - return 'log_id'; - } - - public function getTimestampField() { - return 'log_timestamp'; - } - - public function getAuthorIdField() { - return 'log_user'; - } - - public function getAuthorNameField() { - return 'log_user_text'; - } - - public function canView() { - return LogEventsList::userCan( $this->row, Revision::DELETED_RESTRICTED, $this->list->getUser() ); - } - - public function canViewContent() { - return true; // none - } - - public function getBits() { - return $this->row->log_deleted; - } - - public function setBits( $bits ) { - $dbw = wfGetDB( DB_MASTER ); - $dbw->update( 'recentchanges', - array( - 'rc_deleted' => $bits, - 'rc_patrolled' => 1 - ), - array( - 'rc_logid' => $this->row->log_id, - 'rc_timestamp' => $this->row->log_timestamp // index - ), - __METHOD__ - ); - $dbw->update( 'logging', - array( 'log_deleted' => $bits ), - array( - 'log_id' => $this->row->log_id, - 'log_deleted' => $this->getBits() - ), - __METHOD__ - ); - return (bool)$dbw->affectedRows(); - } - - public function getHTML() { - $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate( - $this->row->log_timestamp, $this->list->getUser() ) ); - $title = Title::makeTitle( $this->row->log_namespace, $this->row->log_title ); - $formatter = LogFormatter::newFromRow( $this->row ); - $formatter->setContext( $this->list->getContext() ); - $formatter->setAudience( LogFormatter::FOR_THIS_USER ); - - // Log link for this page - $loglink = Linker::link( - SpecialPage::getTitleFor( 'Log' ), - $this->list->msg( 'log' )->escaped(), - array(), - array( 'page' => $title->getPrefixedText() ) - ); - $loglink = $this->list->msg( 'parentheses' )->rawParams( $loglink )->escaped(); - // User links and action text - $action = $formatter->getActionText(); - // Comment - $comment = $this->list->getLanguage()->getDirMark() - . Linker::commentBlock( $this->row->log_comment ); - - if ( LogEventsList::isDeleted( $this->row, LogPage::DELETED_COMMENT ) ) { - $comment = '' . $comment . ''; - } - - return "
  • $loglink $date $action $comment
  • "; - } - - public function getApiData( ApiResult $result ) { - $logEntry = DatabaseLogEntry::newFromRow( $this->row ); - $user = $this->list->getUser(); - $ret = array( - 'id' => $logEntry->getId(), - 'type' => $logEntry->getType(), - 'action' => $logEntry->getSubtype(), - ); - $ret += $logEntry->isDeleted( LogPage::DELETED_USER ) - ? array( 'userhidden' => '' ) - : array(); - $ret += $logEntry->isDeleted( LogPage::DELETED_COMMENT ) - ? array( 'commenthidden' => '' ) - : array(); - $ret += $logEntry->isDeleted( LogPage::DELETED_ACTION ) - ? array( 'actionhidden' => '' ) - : array(); - - if ( LogEventsList::userCan( $this->row, LogPage::DELETED_ACTION, $user ) ) { - ApiQueryLogEvents::addLogParams( - $result, - $ret, - $logEntry->getParameters(), - $logEntry->getType(), - $logEntry->getSubtype(), - $logEntry->getTimestamp(), - $logEntry->isLegacy() - ); - } - if ( LogEventsList::userCan( $this->row, LogPage::DELETED_USER, $user ) ) { - $ret += array( - 'userid' => $this->row->log_user, - 'user' => $this->row->log_user_text, - ); - } - if ( LogEventsList::userCan( $this->row, LogPage::DELETED_COMMENT, $user ) ) { - $ret += array( - 'comment' => $this->row->log_comment, - ); - } - return $ret; - } -} diff --git a/includes/search/SearchPostgres.php b/includes/search/SearchPostgres.php index 43fb0169d5..914bc1c493 100644 --- a/includes/search/SearchPostgres.php +++ b/includes/search/SearchPostgres.php @@ -35,14 +35,14 @@ class SearchPostgres extends SearchDatabase { * latest revision article text (pagecontent.old_text) * * @param string $term Raw search term - * @return PostgresSearchResultSet + * @return SqlSearchResultSet */ function searchTitle( $term ) { $q = $this->searchQuery( $term, 'titlevector', 'page_title' ); $olderror = error_reporting( E_ERROR ); $resultSet = $this->db->resultObject( $this->db->query( $q, 'SearchPostgres', true ) ); error_reporting( $olderror ); - return new PostgresSearchResultSet( $resultSet, $this->searchTerms ); + return new SqlSearchResultSet( $resultSet, $this->searchTerms ); } function searchText( $term ) { @@ -50,7 +50,7 @@ class SearchPostgres extends SearchDatabase { $olderror = error_reporting( E_ERROR ); $resultSet = $this->db->resultObject( $this->db->query( $q, 'SearchPostgres', true ) ); error_reporting( $olderror ); - return new PostgresSearchResultSet( $resultSet, $this->searchTerms ); + return new SqlSearchResultSet( $resultSet, $this->searchTerms ); } /** @@ -195,32 +195,4 @@ class SearchPostgres extends SearchDatabase { return true; } -} ## end of the SearchPostgres class - -/** - * @ingroup Search - */ -class PostgresSearchResult extends SearchResult { - function __construct( $row ) { - parent::__construct( $row ); - $this->score = $row->score; - } - - function getScore() { - return $this->score; - } -} - -/** - * @ingroup Search - */ -class PostgresSearchResultSet extends SqlSearchResultSet { - function next() { - $row = $this->resultSet->fetchObject(); - if ( $row === false ) { - return false; - } else { - return new PostgresSearchResult( $row ); - } - } } diff --git a/includes/search/SearchResult.php b/includes/search/SearchResult.php index 453211be96..d51bff7cdd 100644 --- a/includes/search/SearchResult.php +++ b/includes/search/SearchResult.php @@ -142,13 +142,6 @@ class SearchResult { return $this->mImage; } - /** - * @return float|null If not supported - */ - function getScore() { - return null; - } - /** * Lazy initialization of article text from DB */ diff --git a/includes/skins/Skin.php b/includes/skins/Skin.php new file mode 100644 index 0000000000..c4de2ad78a --- /dev/null +++ b/includes/skins/Skin.php @@ -0,0 +1,1615 @@ +getSkinNames(); + } + + /** + * Fetch the skinname messages for available skins. + * @return string[] + */ + static function getSkinNameMessages() { + $messages = array(); + foreach ( self::getSkinNames() as $skinKey => $skinName ) { + $messages[] = "skinname-$skinKey"; + } + return $messages; + } + + /** + * Fetch the list of user-selectable skins in regards to $wgSkipSkins. + * Useful for Special:Preferences and other places where you + * only want to show skins users _can_ use. + * @return string[] + * @since 1.23 + */ + public static function getAllowedSkins() { + global $wgSkipSkins; + + $allowedSkins = self::getSkinNames(); + + foreach ( $wgSkipSkins as $skip ) { + unset( $allowedSkins[$skip] ); + } + + return $allowedSkins; + } + + /** + * @deprecated since 1.23, use getAllowedSkins + * @return string[] + */ + public static function getUsableSkins() { + wfDeprecated( __METHOD__, '1.23' ); + return self::getAllowedSkins(); + } + + /** + * Normalize a skin preference value to a form that can be loaded. + * + * If a skin can't be found, it will fall back to the configured default ($wgDefaultSkin), or the + * hardcoded default ($wgFallbackSkin) if the default skin is unavailable too. + * + * @param string $key 'monobook', 'vector', etc. + * @return string + */ + static function normalizeKey( $key ) { + global $wgDefaultSkin, $wgFallbackSkin; + + $skinNames = Skin::getSkinNames(); + + // Make keys lowercase for case-insensitive matching. + $skinNames = array_change_key_case( $skinNames, CASE_LOWER ); + $key = strtolower( $key ); + $defaultSkin = strtolower( $wgDefaultSkin ); + $fallbackSkin = strtolower( $wgFallbackSkin ); + + if ( $key == '' || $key == 'default' ) { + // Don't return the default immediately; + // in a misconfiguration we need to fall back. + $key = $defaultSkin; + } + + if ( isset( $skinNames[$key] ) ) { + return $key; + } + + // Older versions of the software used a numeric setting + // in the user preferences. + $fallback = array( + 0 => $defaultSkin, + 2 => 'cologneblue' + ); + + if ( isset( $fallback[$key] ) ) { + $key = $fallback[$key]; + } + + if ( isset( $skinNames[$key] ) ) { + return $key; + } elseif ( isset( $skinNames[$defaultSkin] ) ) { + return $defaultSkin; + } else { + return $fallbackSkin; + } + } + + /** + * Factory method for loading a skin of a given type + * @param string $key 'monobook', 'vector', etc. + * @return Skin + * @deprecated Use SkinFactory instead + */ + static function &newFromKey( $key ) { + wfDeprecated( __METHOD__, '1.24' ); + + $key = Skin::normalizeKey( $key ); + $factory = SkinFactory::getDefaultInstance(); + + // normalizeKey() guarantees that a skin with this key will exist. + $skin = $factory->makeSkin( $key ); + return $skin; + } + + /** + * @return string Skin name + */ + public function getSkinName() { + return $this->skinname; + } + + /** + * @param OutputPage $out + */ + function initPage( OutputPage $out ) { + wfProfileIn( __METHOD__ ); + + $this->preloadExistence(); + + wfProfileOut( __METHOD__ ); + } + + /** + * Defines the ResourceLoader modules that should be added to the skin + * It is recommended that skins wishing to override call parent::getDefaultModules() + * and substitute out any modules they wish to change by using a key to look them up + * @return array Array of modules with helper keys for easy overriding + */ + public function getDefaultModules() { + global $wgIncludeLegacyJavaScript, $wgPreloadJavaScriptMwUtil, $wgUseAjax, + $wgAjaxWatch, $wgEnableAPI, $wgEnableWriteAPI; + + $out = $this->getOutput(); + $user = $out->getUser(); + $modules = array( + // modules that enhance the page content in some way + 'content' => array( + 'mediawiki.page.ready', + ), + // modules that exist for legacy reasons + 'legacy' => array(), + // modules relating to search functionality + 'search' => array(), + // modules relating to functionality relating to watching an article + 'watch' => array(), + // modules which relate to the current users preferences + 'user' => array(), + ); + if ( $wgIncludeLegacyJavaScript ) { + $modules['legacy'][] = 'mediawiki.legacy.wikibits'; + } + + if ( $wgPreloadJavaScriptMwUtil ) { + $modules['legacy'][] = 'mediawiki.util'; + } + + // Add various resources if required + if ( $wgUseAjax ) { + $modules['legacy'][] = 'mediawiki.legacy.ajax'; + + if ( $wgEnableAPI ) { + if ( $wgEnableWriteAPI && $wgAjaxWatch && $user->isLoggedIn() + && $user->isAllowed( 'writeapi' ) + ) { + $modules['watch'][] = 'mediawiki.page.watch.ajax'; + } + + $modules['search'][] = 'mediawiki.searchSuggest'; + } + } + + if ( $user->getBoolOption( 'editsectiononrightclick' ) ) { + $modules['user'][] = 'mediawiki.action.view.rightClickEdit'; + } + + // Crazy edit-on-double-click stuff + if ( $out->isArticle() && $user->getOption( 'editondblclick' ) ) { + $modules['user'][] = 'mediawiki.action.view.dblClickEdit'; + } + return $modules; + } + + /** + * Preload the existence of three commonly-requested pages in a single query + */ + function preloadExistence() { + $user = $this->getUser(); + + // User/talk link + $titles = array( $user->getUserPage(), $user->getTalkPage() ); + + // Other tab link + if ( $this->getTitle()->isSpecialPage() ) { + // nothing + } elseif ( $this->getTitle()->isTalkPage() ) { + $titles[] = $this->getTitle()->getSubjectPage(); + } else { + $titles[] = $this->getTitle()->getTalkPage(); + } + + $lb = new LinkBatch( $titles ); + $lb->setCaller( __METHOD__ ); + $lb->execute(); + } + + /** + * Get the current revision ID + * + * @return int + */ + public function getRevisionId() { + return $this->getOutput()->getRevisionId(); + } + + /** + * Whether the revision displayed is the latest revision of the page + * + * @return bool + */ + public function isRevisionCurrent() { + $revID = $this->getRevisionId(); + return $revID == 0 || $revID == $this->getTitle()->getLatestRevID(); + } + + /** + * Set the "relevant" title + * @see self::getRelevantTitle() + * @param Title $t + */ + public function setRelevantTitle( $t ) { + $this->mRelevantTitle = $t; + } + + /** + * Return the "relevant" title. + * A "relevant" title is not necessarily the actual title of the page. + * Special pages like Special:MovePage use set the page they are acting on + * as their "relevant" title, this allows the skin system to display things + * such as content tabs which belong to to that page instead of displaying + * a basic special page tab which has almost no meaning. + * + * @return Title + */ + public function getRelevantTitle() { + if ( isset( $this->mRelevantTitle ) ) { + return $this->mRelevantTitle; + } + return $this->getTitle(); + } + + /** + * Set the "relevant" user + * @see self::getRelevantUser() + * @param User $u + */ + public function setRelevantUser( $u ) { + $this->mRelevantUser = $u; + } + + /** + * Return the "relevant" user. + * A "relevant" user is similar to a relevant title. Special pages like + * Special:Contributions mark the user which they are relevant to so that + * things like the toolbox can display the information they usually are only + * able to display on a user's userpage and talkpage. + * @return User + */ + public function getRelevantUser() { + if ( isset( $this->mRelevantUser ) ) { + return $this->mRelevantUser; + } + $title = $this->getRelevantTitle(); + if ( $title->hasSubjectNamespace( NS_USER ) ) { + $rootUser = $title->getRootText(); + if ( User::isIP( $rootUser ) ) { + $this->mRelevantUser = User::newFromName( $rootUser, false ); + } else { + $user = User::newFromName( $rootUser, false ); + if ( $user && $user->isLoggedIn() ) { + $this->mRelevantUser = $user; + } + } + return $this->mRelevantUser; + } + return null; + } + + /** + * Outputs the HTML generated by other functions. + * @param OutputPage $out + */ + abstract function outputPage( OutputPage $out = null ); + + /** + * @param array $data + * @return string + */ + static function makeVariablesScript( $data ) { + if ( $data ) { + return Html::inlineScript( + ResourceLoader::makeLoaderConditionalScript( ResourceLoader::makeConfigSetScript( $data ) ) + ); + } else { + return ''; + } + } + + /** + * Get the query to generate a dynamic stylesheet + * + * @return array + */ + public static function getDynamicStylesheetQuery() { + global $wgSquidMaxage; + + return array( + 'action' => 'raw', + 'maxage' => $wgSquidMaxage, + 'usemsgcache' => 'yes', + 'ctype' => 'text/css', + 'smaxage' => $wgSquidMaxage, + ); + } + + /** + * Add skin specific stylesheets + * Calling this method with an $out of anything but the same OutputPage + * inside ->getOutput() is deprecated. The $out arg is kept + * for compatibility purposes with skins. + * @param OutputPage $out + * @todo delete + */ + abstract function setupSkinUserCss( OutputPage $out ); + + /** + * TODO: document + * @param Title $title + * @return string + */ + function getPageClasses( $title ) { + $numeric = 'ns-' . $title->getNamespace(); + + if ( $title->isSpecialPage() ) { + $type = 'ns-special'; + // bug 23315: provide a class based on the canonical special page name without subpages + list( $canonicalName ) = SpecialPageFactory::resolveAlias( $title->getDBkey() ); + if ( $canonicalName ) { + $type .= ' ' . Sanitizer::escapeClass( "mw-special-$canonicalName" ); + } else { + $type .= ' mw-invalidspecialpage'; + } + } elseif ( $title->isTalkPage() ) { + $type = 'ns-talk'; + } else { + $type = 'ns-subject'; + } + + $name = Sanitizer::escapeClass( 'page-' . $title->getPrefixedText() ); + + return "$numeric $type $name"; + } + + /* + * Return values for element + * @return array of associative name-to-value elements for element + */ + public function getHtmlElementAttributes() { + $lang = $this->getLanguage(); + return array( + 'lang' => $lang->getHtmlCode(), + 'dir' => $lang->getDir(), + 'class' => 'client-nojs', + ); + } + + /** + * This will be called by OutputPage::headElement when it is creating the + * "" tag, skins can override it if they have a need to add in any + * body attributes or classes of their own. + * @param OutputPage $out + * @param array $bodyAttrs + */ + function addToBodyAttributes( $out, &$bodyAttrs ) { + // does nothing by default + } + + /** + * URL to the logo + * @return string + */ + function getLogo() { + global $wgLogo; + return $wgLogo; + } + + /** + * @return string + */ + function getCategoryLinks() { + global $wgUseCategoryBrowser; + + $out = $this->getOutput(); + $allCats = $out->getCategoryLinks(); + + if ( !count( $allCats ) ) { + return ''; + } + + $embed = "
  • "; + $pop = "
  • "; + + $s = ''; + $colon = $this->msg( 'colon-separator' )->escaped(); + + if ( !empty( $allCats['normal'] ) ) { + $t = $embed . implode( "{$pop}{$embed}", $allCats['normal'] ) . $pop; + + $msg = $this->msg( 'pagecategories' )->numParams( count( $allCats['normal'] ) )->escaped(); + $linkPage = wfMessage( 'pagecategorieslink' )->inContentLanguage()->text(); + $s .= ''; + } + + # Hidden categories + if ( isset( $allCats['hidden'] ) ) { + if ( $this->getUser()->getBoolOption( 'showhiddencats' ) ) { + $class = ' mw-hidden-cats-user-shown'; + } elseif ( $this->getTitle()->getNamespace() == NS_CATEGORY ) { + $class = ' mw-hidden-cats-ns-shown'; + } else { + $class = ' mw-hidden-cats-hidden'; + } + + $s .= "
    " . + $this->msg( 'hidden-categories' )->numParams( count( $allCats['hidden'] ) )->escaped() . + $colon . '
      ' . $embed . implode( "{$pop}{$embed}", $allCats['hidden'] ) . $pop . '
    ' . + '
    '; + } + + # optional 'dmoz-like' category browser. Will be shown under the list + # of categories an article belong to + if ( $wgUseCategoryBrowser ) { + $s .= '

    '; + + # get a big array of the parents tree + $parenttree = $this->getTitle()->getParentCategoryTree(); + # Skin object passed by reference cause it can not be + # accessed under the method subfunction drawCategoryBrowser + $tempout = explode( "\n", $this->drawCategoryBrowser( $parenttree ) ); + # Clean out bogus first entry and sort them + unset( $tempout[0] ); + asort( $tempout ); + # Output one per line + $s .= implode( "
    \n", $tempout ); + } + + return $s; + } + + /** + * Render the array as a series of links. + * @param array $tree Categories tree returned by Title::getParentCategoryTree + * @return string Separated by >, terminate with "\n" + */ + function drawCategoryBrowser( $tree ) { + $return = ''; + + foreach ( $tree as $element => $parent ) { + if ( empty( $parent ) ) { + # element start a new list + $return .= "\n"; + } else { + # grab the others elements + $return .= $this->drawCategoryBrowser( $parent ) . ' > '; + } + + # add our current element to the list + $eltitle = Title::newFromText( $element ); + $return .= Linker::link( $eltitle, htmlspecialchars( $eltitle->getText() ) ); + } + + return $return; + } + + /** + * @return string + */ + function getCategories() { + $out = $this->getOutput(); + + $catlinks = $this->getCategoryLinks(); + + $classes = 'catlinks'; + + // Check what we're showing + $allCats = $out->getCategoryLinks(); + $showHidden = $this->getUser()->getBoolOption( 'showhiddencats' ) || + $this->getTitle()->getNamespace() == NS_CATEGORY; + + if ( empty( $allCats['normal'] ) && !( !empty( $allCats['hidden'] ) && $showHidden ) ) { + $classes .= ' catlinks-allhidden'; + } + + return ""; + } + + /** + * This runs a hook to allow extensions placing their stuff after content + * and article metadata (e.g. categories). + * Note: This function has nothing to do with afterContent(). + * + * This hook is placed here in order to allow using the same hook for all + * skins, both the SkinTemplate based ones and the older ones, which directly + * use this class to get their data. + * + * The output of this function gets processed in SkinTemplate::outputPage() for + * the SkinTemplate based skins, all other skins should directly echo it. + * + * @return string Empty by default, if not changed by any hook function. + */ + protected function afterContentHook() { + $data = ''; + + if ( wfRunHooks( 'SkinAfterContent', array( &$data, $this ) ) ) { + // adding just some spaces shouldn't toggle the output + // of the whole
    , so we use trim() here + if ( trim( $data ) != '' ) { + // Doing this here instead of in the skins to + // ensure that the div has the same ID in all + // skins + $data = "
    \n" . + "\t$data\n" . + "
    \n"; + } + } else { + wfDebug( "Hook SkinAfterContent changed output processing.\n" ); + } + + return $data; + } + + /** + * Generate debug data HTML for displaying at the bottom of the main content + * area. + * @return string HTML containing debug data, if enabled (otherwise empty). + */ + protected function generateDebugHTML() { + return MWDebug::getHTMLDebugLog(); + } + + /** + * This gets called shortly before the "" tag. + * + * @return string HTML-wrapped JS code to be put before "" + */ + function bottomScripts() { + // TODO and the suckage continues. This function is really just a wrapper around + // OutputPage::getBottomScripts() which takes a Skin param. This should be cleaned + // up at some point + $bottomScriptText = $this->getOutput()->getBottomScripts(); + wfRunHooks( 'SkinAfterBottomScripts', array( $this, &$bottomScriptText ) ); + + return $bottomScriptText; + } + + /** + * Text with the permalink to the source page, + * usually shown on the footer of a printed page + * + * @return string HTML text with an URL + */ + function printSource() { + $oldid = $this->getRevisionId(); + if ( $oldid ) { + $canonicalUrl = $this->getTitle()->getCanonicalURL( 'oldid=' . $oldid ); + $url = htmlspecialchars( wfExpandIRI( $canonicalUrl ) ); + } else { + // oldid not available for non existing pages + $url = htmlspecialchars( wfExpandIRI( $this->getTitle()->getCanonicalURL() ) ); + } + + return $this->msg( 'retrievedfrom', '
    ' . $url . '' )->text(); + } + + /** + * @return string + */ + function getUndeleteLink() { + $action = $this->getRequest()->getVal( 'action', 'view' ); + + if ( $this->getUser()->isAllowed( 'deletedhistory' ) && + ( $this->getTitle()->getArticleID() == 0 || $action == 'history' ) ) { + $n = $this->getTitle()->isDeleted(); + + if ( $n ) { + if ( $this->getUser()->isAllowed( 'undelete' ) ) { + $msg = 'thisisdeleted'; + } else { + $msg = 'viewdeleted'; + } + + return $this->msg( $msg )->rawParams( + Linker::linkKnown( + SpecialPage::getTitleFor( 'Undelete', $this->getTitle()->getPrefixedDBkey() ), + $this->msg( 'restorelink' )->numParams( $n )->escaped() ) + )->text(); + } + } + + return ''; + } + + /** + * @return string + */ + function subPageSubtitle() { + $out = $this->getOutput(); + $subpages = ''; + + if ( !wfRunHooks( 'SkinSubPageSubtitle', array( &$subpages, $this, $out ) ) ) { + return $subpages; + } + + if ( $out->isArticle() && MWNamespace::hasSubpages( $out->getTitle()->getNamespace() ) ) { + $ptext = $this->getTitle()->getPrefixedText(); + if ( preg_match( '/\//', $ptext ) ) { + $links = explode( '/', $ptext ); + array_pop( $links ); + $c = 0; + $growinglink = ''; + $display = ''; + $lang = $this->getLanguage(); + + foreach ( $links as $link ) { + $growinglink .= $link; + $display .= $link; + $linkObj = Title::newFromText( $growinglink ); + + if ( is_object( $linkObj ) && $linkObj->isKnown() ) { + $getlink = Linker::linkKnown( + $linkObj, + htmlspecialchars( $display ) + ); + + $c++; + + if ( $c > 1 ) { + $subpages .= $lang->getDirMarkEntity() . $this->msg( 'pipe-separator' )->escaped(); + } else { + $subpages .= '< '; + } + + $subpages .= $getlink; + $display = ''; + } else { + $display .= '/'; + } + $growinglink .= '/'; + } + } + } + + return $subpages; + } + + /** + * Returns true if the IP should be shown in the header + * @return bool + */ + function showIPinHeader() { + global $wgShowIPinHeader; + return $wgShowIPinHeader && session_id() != ''; + } + + /** + * @return string + */ + function getSearchLink() { + $searchPage = SpecialPage::getTitleFor( 'Search' ); + return $searchPage->getLocalURL(); + } + + /** + * @return string + */ + function escapeSearchLink() { + return htmlspecialchars( $this->getSearchLink() ); + } + + /** + * @param string $type + * @return string + */ + function getCopyright( $type = 'detect' ) { + global $wgRightsPage, $wgRightsUrl, $wgRightsText; + + if ( $type == 'detect' ) { + if ( !$this->isRevisionCurrent() + && !$this->msg( 'history_copyright' )->inContentLanguage()->isDisabled() + ) { + $type = 'history'; + } else { + $type = 'normal'; + } + } + + if ( $type == 'history' ) { + $msg = 'history_copyright'; + } else { + $msg = 'copyright'; + } + + if ( $wgRightsPage ) { + $title = Title::newFromText( $wgRightsPage ); + $link = Linker::linkKnown( $title, $wgRightsText ); + } elseif ( $wgRightsUrl ) { + $link = Linker::makeExternalLink( $wgRightsUrl, $wgRightsText ); + } elseif ( $wgRightsText ) { + $link = $wgRightsText; + } else { + # Give up now + return ''; + } + + // Allow for site and per-namespace customization of copyright notice. + // @todo Remove deprecated $forContent param from hook handlers and then remove here. + $forContent = true; + + wfRunHooks( + 'SkinCopyrightFooter', + array( $this->getTitle(), $type, &$msg, &$link, &$forContent ) + ); + + return $this->msg( $msg )->rawParams( $link )->text(); + } + + /** + * @return null|string + */ + function getCopyrightIcon() { + global $wgRightsUrl, $wgRightsText, $wgRightsIcon, $wgCopyrightIcon; + + $out = ''; + + if ( $wgCopyrightIcon ) { + $out = $wgCopyrightIcon; + } elseif ( $wgRightsIcon ) { + $icon = htmlspecialchars( $wgRightsIcon ); + + if ( $wgRightsUrl ) { + $url = htmlspecialchars( $wgRightsUrl ); + $out .= ''; + } + + $text = htmlspecialchars( $wgRightsText ); + $out .= "\"$text\""; + + if ( $wgRightsUrl ) { + $out .= ''; + } + } + + return $out; + } + + /** + * Gets the powered by MediaWiki icon. + * @return string + */ + function getPoweredBy() { + global $wgStylePath; + + $url = htmlspecialchars( "$wgStylePath/common/images/poweredby_mediawiki_88x31.png" ); + $text = 'Powered by MediaWiki'; + wfRunHooks( 'SkinGetPoweredBy', array( &$text, $this ) ); + return $text; + } + + /** + * Get the timestamp of the latest revision, formatted in user language + * + * @return string + */ + protected function lastModified() { + $timestamp = $this->getOutput()->getRevisionTimestamp(); + + # No cached timestamp, load it from the database + if ( $timestamp === null ) { + $timestamp = Revision::getTimestampFromId( $this->getTitle(), $this->getRevisionId() ); + } + + if ( $timestamp ) { + $d = $this->getLanguage()->userDate( $timestamp, $this->getUser() ); + $t = $this->getLanguage()->userTime( $timestamp, $this->getUser() ); + $s = ' ' . $this->msg( 'lastmodifiedat', $d, $t )->text(); + } else { + $s = ''; + } + + if ( wfGetLB()->getLaggedSlaveMode() ) { + $s .= ' ' . $this->msg( 'laggedslavemode' )->text() . ''; + } + + return $s; + } + + /** + * @param string $align + * @return string + */ + function logoText( $align = '' ) { + if ( $align != '' ) { + $a = " style='float: {$align};'"; + } else { + $a = ''; + } + + $mp = $this->msg( 'mainpage' )->escaped(); + $mptitle = Title::newMainPage(); + $url = ( is_object( $mptitle ) ? htmlspecialchars( $mptitle->getLocalURL() ) : '' ); + + $logourl = $this->getLogo(); + $s = ""; + + return $s; + } + + /** + * Renders a $wgFooterIcons icon according to the method's arguments + * @param array $icon The icon to build the html for, see $wgFooterIcons + * for the format of this array. + * @param bool|string $withImage Whether to use the icon's image or output + * a text-only footericon. + * @return string HTML + */ + function makeFooterIcon( $icon, $withImage = 'withImage' ) { + if ( is_string( $icon ) ) { + $html = $icon; + } else { // Assuming array + $url = isset( $icon["url"] ) ? $icon["url"] : null; + unset( $icon["url"] ); + if ( isset( $icon["src"] ) && $withImage === 'withImage' ) { + // do this the lazy way, just pass icon data as an attribute array + $html = Html::element( 'img', $icon ); + } else { + $html = htmlspecialchars( $icon["alt"] ); + } + if ( $url ) { + $html = Html::rawElement( 'a', array( "href" => $url ), $html ); + } + } + return $html; + } + + /** + * Gets the link to the wiki's main page. + * @return string + */ + function mainPageLink() { + $s = Linker::linkKnown( + Title::newMainPage(), + $this->msg( 'mainpage' )->escaped() + ); + + return $s; + } + + /** + * Returns an HTML link for use in the footer + * @param string $desc The i18n message key for the link text + * @param string $page The i18n message key for the page to link to + * @return string HTML anchor + */ + public function footerLink( $desc, $page ) { + // if the link description has been set to "-" in the default language, + if ( $this->msg( $desc )->inContentLanguage()->isDisabled() ) { + // then it is disabled, for all languages. + return ''; + } else { + // Otherwise, we display the link for the user, described in their + // language (which may or may not be the same as the default language), + // but we make the link target be the one site-wide page. + $title = Title::newFromText( $this->msg( $page )->inContentLanguage()->text() ); + + return Linker::linkKnown( + $title, + $this->msg( $desc )->escaped() + ); + } + } + + /** + * Gets the link to the wiki's privacy policy page. + * @return string HTML + */ + function privacyLink() { + return $this->footerLink( 'privacy', 'privacypage' ); + } + + /** + * Gets the link to the wiki's about page. + * @return string HTML + */ + function aboutLink() { + return $this->footerLink( 'aboutsite', 'aboutpage' ); + } + + /** + * Gets the link to the wiki's general disclaimers page. + * @return string HTML + */ + function disclaimerLink() { + return $this->footerLink( 'disclaimers', 'disclaimerpage' ); + } + + /** + * Return URL options for the 'edit page' link. + * This may include an 'oldid' specifier, if the current page view is such. + * + * @return array + * @private + */ + function editUrlOptions() { + $options = array( 'action' => 'edit' ); + + if ( !$this->isRevisionCurrent() ) { + $options['oldid'] = intval( $this->getRevisionId() ); + } + + return $options; + } + + /** + * @param User|int $id + * @return bool + */ + function showEmailUser( $id ) { + if ( $id instanceof User ) { + $targetUser = $id; + } else { + $targetUser = User::newFromId( $id ); + } + + # The sending user must have a confirmed email address and the target + # user must have a confirmed email address and allow emails from users. + return $this->getUser()->canSendEmail() && + $targetUser->canReceiveEmail(); + } + + /** + * Return a fully resolved style path url to images or styles stored in the common folder. + * This method returns a url resolved using the configured skin style path + * and includes the style version inside of the url. + * @param string $name The name or path of a skin resource file + * @return string The fully resolved style path url including styleversion + */ + function getCommonStylePath( $name ) { + global $wgStylePath, $wgStyleVersion; + return "$wgStylePath/common/$name?$wgStyleVersion"; + } + + /** + * Return a fully resolved style path url to images or styles stored in the current skins's folder. + * This method returns a url resolved using the configured skin style path + * and includes the style version inside of the url. + * + * Requires $stylename to be set, otherwise throws MWException. + * + * @param string $name The name or path of a skin resource file + * @return string The fully resolved style path url including styleversion + */ + function getSkinStylePath( $name ) { + global $wgStylePath, $wgStyleVersion; + + if ( $this->stylename === null ) { + $class = get_class( $this ); + throw new MWException( "$class::\$stylename must be set to use getSkinStylePath()" ); + } + + return "$wgStylePath/{$this->stylename}/$name?$wgStyleVersion"; + } + + /* these are used extensively in SkinTemplate, but also some other places */ + + /** + * @param string $urlaction + * @return string + */ + static function makeMainPageUrl( $urlaction = '' ) { + $title = Title::newMainPage(); + self::checkTitle( $title, '' ); + + return $title->getLocalURL( $urlaction ); + } + + /** + * Make a URL for a Special Page using the given query and protocol. + * + * If $proto is set to null, make a local URL. Otherwise, make a full + * URL with the protocol specified. + * + * @param string $name Name of the Special page + * @param string $urlaction Query to append + * @param string|null $proto Protocol to use or null for a local URL + * @return string + */ + static function makeSpecialUrl( $name, $urlaction = '', $proto = null ) { + $title = SpecialPage::getSafeTitleFor( $name ); + if ( is_null( $proto ) ) { + return $title->getLocalURL( $urlaction ); + } else { + return $title->getFullURL( $urlaction, false, $proto ); + } + } + + /** + * @param string $name + * @param string $subpage + * @param string $urlaction + * @return string + */ + static function makeSpecialUrlSubpage( $name, $subpage, $urlaction = '' ) { + $title = SpecialPage::getSafeTitleFor( $name, $subpage ); + return $title->getLocalURL( $urlaction ); + } + + /** + * @param string $name + * @param string $urlaction + * @return string + */ + static function makeI18nUrl( $name, $urlaction = '' ) { + $title = Title::newFromText( wfMessage( $name )->inContentLanguage()->text() ); + self::checkTitle( $title, $name ); + return $title->getLocalURL( $urlaction ); + } + + /** + * @param string $name + * @param string $urlaction + * @return string + */ + static function makeUrl( $name, $urlaction = '' ) { + $title = Title::newFromText( $name ); + self::checkTitle( $title, $name ); + + return $title->getLocalURL( $urlaction ); + } + + /** + * If url string starts with http, consider as external URL, else + * internal + * @param string $name + * @return string URL + */ + static function makeInternalOrExternalUrl( $name ) { + if ( preg_match( '/^(?i:' . wfUrlProtocols() . ')/', $name ) ) { + return $name; + } else { + return self::makeUrl( $name ); + } + } + + /** + * this can be passed the NS number as defined in Language.php + * @param string $name + * @param string $urlaction + * @param int $namespace + * @return string + */ + static function makeNSUrl( $name, $urlaction = '', $namespace = NS_MAIN ) { + $title = Title::makeTitleSafe( $namespace, $name ); + self::checkTitle( $title, $name ); + + return $title->getLocalURL( $urlaction ); + } + + /** + * these return an array with the 'href' and boolean 'exists' + * @param string $name + * @param string $urlaction + * @return array + */ + static function makeUrlDetails( $name, $urlaction = '' ) { + $title = Title::newFromText( $name ); + self::checkTitle( $title, $name ); + + return array( + 'href' => $title->getLocalURL( $urlaction ), + 'exists' => $title->getArticleID() != 0, + ); + } + + /** + * Make URL details where the article exists (or at least it's convenient to think so) + * @param string $name Article name + * @param string $urlaction + * @return array + */ + static function makeKnownUrlDetails( $name, $urlaction = '' ) { + $title = Title::newFromText( $name ); + self::checkTitle( $title, $name ); + + return array( + 'href' => $title->getLocalURL( $urlaction ), + 'exists' => true + ); + } + + /** + * make sure we have some title to operate on + * + * @param Title $title + * @param string $name + */ + static function checkTitle( &$title, $name ) { + if ( !is_object( $title ) ) { + $title = Title::newFromText( $name ); + if ( !is_object( $title ) ) { + $title = Title::newFromText( '--error: link target missing--' ); + } + } + } + + /** + * Build an array that represents the sidebar(s), the navigation bar among them. + * + * BaseTemplate::getSidebar can be used to simplify the format and id generation in new skins. + * + * The format of the returned array is array( heading => content, ... ), where: + * - heading is the heading of a navigation portlet. It is either: + * - magic string to be handled by the skins ('SEARCH' / 'LANGUAGES' / 'TOOLBOX' / ...) + * - a message name (e.g. 'navigation'), the message should be HTML-escaped by the skin + * - plain text, which should be HTML-escaped by the skin + * - content is the contents of the portlet. It is either: + * - HTML text (
    • ...
    • ...
    ) + * - array of link data in a format accepted by BaseTemplate::makeListItem() + * - (for a magic string as a key, any value) + * + * Note that extensions can control the sidebar contents using the SkinBuildSidebar hook + * and can technically insert anything in here; skin creators are expected to handle + * values described above. + * + * @return array + */ + function buildSidebar() { + global $wgMemc, $wgEnableSidebarCache, $wgSidebarCacheExpiry; + wfProfileIn( __METHOD__ ); + + $key = wfMemcKey( 'sidebar', $this->getLanguage()->getCode() ); + + if ( $wgEnableSidebarCache ) { + $cachedsidebar = $wgMemc->get( $key ); + if ( $cachedsidebar ) { + wfRunHooks( 'SidebarBeforeOutput', array( $this, &$cachedsidebar ) ); + + wfProfileOut( __METHOD__ ); + return $cachedsidebar; + } + } + + $bar = array(); + $this->addToSidebar( $bar, 'sidebar' ); + + wfRunHooks( 'SkinBuildSidebar', array( $this, &$bar ) ); + if ( $wgEnableSidebarCache ) { + $wgMemc->set( $key, $bar, $wgSidebarCacheExpiry ); + } + + wfRunHooks( 'SidebarBeforeOutput', array( $this, &$bar ) ); + + wfProfileOut( __METHOD__ ); + return $bar; + } + + /** + * Add content from a sidebar system message + * Currently only used for MediaWiki:Sidebar (but may be used by Extensions) + * + * This is just a wrapper around addToSidebarPlain() for backwards compatibility + * + * @param array $bar + * @param string $message + */ + function addToSidebar( &$bar, $message ) { + $this->addToSidebarPlain( $bar, wfMessage( $message )->inContentLanguage()->plain() ); + } + + /** + * Add content from plain text + * @since 1.17 + * @param array $bar + * @param string $text + * @return array + */ + function addToSidebarPlain( &$bar, $text ) { + $lines = explode( "\n", $text ); + + $heading = ''; + + foreach ( $lines as $line ) { + if ( strpos( $line, '*' ) !== 0 ) { + continue; + } + $line = rtrim( $line, "\r" ); // for Windows compat + + if ( strpos( $line, '**' ) !== 0 ) { + $heading = trim( $line, '* ' ); + if ( !array_key_exists( $heading, $bar ) ) { + $bar[$heading] = array(); + } + } else { + $line = trim( $line, '* ' ); + + if ( strpos( $line, '|' ) !== false ) { // sanity check + $line = MessageCache::singleton()->transform( $line, false, null, $this->getTitle() ); + $line = array_map( 'trim', explode( '|', $line, 2 ) ); + if ( count( $line ) !== 2 ) { + // Second sanity check, could be hit by people doing + // funky stuff with parserfuncs... (bug 33321) + continue; + } + + $extraAttribs = array(); + + $msgLink = $this->msg( $line[0] )->inContentLanguage(); + if ( $msgLink->exists() ) { + $link = $msgLink->text(); + if ( $link == '-' ) { + continue; + } + } else { + $link = $line[0]; + } + $msgText = $this->msg( $line[1] ); + if ( $msgText->exists() ) { + $text = $msgText->text(); + } else { + $text = $line[1]; + } + + if ( preg_match( '/^(?i:' . wfUrlProtocols() . ')/', $link ) ) { + $href = $link; + + // Parser::getExternalLinkAttribs won't work here because of the Namespace things + global $wgNoFollowLinks, $wgNoFollowDomainExceptions; + if ( $wgNoFollowLinks && !wfMatchesDomainList( $href, $wgNoFollowDomainExceptions ) ) { + $extraAttribs['rel'] = 'nofollow'; + } + + global $wgExternalLinkTarget; + if ( $wgExternalLinkTarget ) { + $extraAttribs['target'] = $wgExternalLinkTarget; + } + } else { + $title = Title::newFromText( $link ); + + if ( $title ) { + $title = $title->fixSpecialName(); + $href = $title->getLinkURL(); + } else { + $href = 'INVALID-TITLE'; + } + } + + $bar[$heading][] = array_merge( array( + 'text' => $text, + 'href' => $href, + 'id' => 'n-' . Sanitizer::escapeId( strtr( $line[1], ' ', '-' ), 'noninitial' ), + 'active' => false + ), $extraAttribs ); + } else { + continue; + } + } + } + + return $bar; + } + + /** + * This function previously controlled whether the 'mediawiki.legacy.wikiprintable' module + * should be loaded by OutputPage. That module no longer exists and the return value of this + * method is ignored. + * + * If your skin doesn't provide its own print styles, the 'mediawiki.legacy.commonPrint' module + * can be used instead (SkinTemplate-based skins do it automatically). + * + * @deprecated since 1.22 + * @return bool + */ + public function commonPrintStylesheet() { + wfDeprecated( __METHOD__, '1.22' ); + return false; + } + + /** + * Gets new talk page messages for the current user and returns an + * appropriate alert message (or an empty string if there are no messages) + * @return string + */ + function getNewtalks() { + + $newMessagesAlert = ''; + $user = $this->getUser(); + $newtalks = $user->getNewMessageLinks(); + $out = $this->getOutput(); + + // Allow extensions to disable or modify the new messages alert + if ( !wfRunHooks( 'GetNewMessagesAlert', array( &$newMessagesAlert, $newtalks, $user, $out ) ) ) { + return ''; + } + if ( $newMessagesAlert ) { + return $newMessagesAlert; + } + + if ( count( $newtalks ) == 1 && $newtalks[0]['wiki'] === wfWikiID() ) { + $uTalkTitle = $user->getTalkPage(); + $lastSeenRev = isset( $newtalks[0]['rev'] ) ? $newtalks[0]['rev'] : null; + $nofAuthors = 0; + if ( $lastSeenRev !== null ) { + $plural = true; // Default if we have a last seen revision: if unknown, use plural + $latestRev = Revision::newFromTitle( $uTalkTitle, false, Revision::READ_NORMAL ); + if ( $latestRev !== null ) { + // Singular if only 1 unseen revision, plural if several unseen revisions. + $plural = $latestRev->getParentId() !== $lastSeenRev->getId(); + $nofAuthors = $uTalkTitle->countAuthorsBetween( + $lastSeenRev, $latestRev, 10, 'include_new' ); + } + } else { + // Singular if no revision -> diff link will show latest change only in any case + $plural = false; + } + $plural = $plural ? 999 : 1; + // 999 signifies "more than one revision". We don't know how many, and even if we did, + // the number of revisions or authors is not necessarily the same as the number of + // "messages". + $newMessagesLink = Linker::linkKnown( + $uTalkTitle, + $this->msg( 'newmessageslinkplural' )->params( $plural )->escaped(), + array(), + array( 'redirect' => 'no' ) + ); + + $newMessagesDiffLink = Linker::linkKnown( + $uTalkTitle, + $this->msg( 'newmessagesdifflinkplural' )->params( $plural )->escaped(), + array(), + $lastSeenRev !== null + ? array( 'oldid' => $lastSeenRev->getId(), 'diff' => 'cur' ) + : array( 'diff' => 'cur' ) + ); + + if ( $nofAuthors >= 1 && $nofAuthors <= 10 ) { + $newMessagesAlert = $this->msg( + 'youhavenewmessagesfromusers', + $newMessagesLink, + $newMessagesDiffLink + )->numParams( $nofAuthors, $plural ); + } else { + // $nofAuthors === 11 signifies "11 or more" ("more than 10") + $newMessagesAlert = $this->msg( + $nofAuthors > 10 ? 'youhavenewmessagesmanyusers' : 'youhavenewmessages', + $newMessagesLink, + $newMessagesDiffLink + )->numParams( $plural ); + } + $newMessagesAlert = $newMessagesAlert->text(); + # Disable Squid cache + $out->setSquidMaxage( 0 ); + } elseif ( count( $newtalks ) ) { + $sep = $this->msg( 'newtalkseparator' )->escaped(); + $msgs = array(); + + foreach ( $newtalks as $newtalk ) { + $msgs[] = Xml::element( + 'a', + array( 'href' => $newtalk['link'] ), $newtalk['wiki'] + ); + } + $parts = implode( $sep, $msgs ); + $newMessagesAlert = $this->msg( 'youhavenewmessagesmulti' )->rawParams( $parts )->escaped(); + $out->setSquidMaxage( 0 ); + } + + return $newMessagesAlert; + } + + /** + * Get a cached notice + * + * @param string $name Message name, or 'default' for $wgSiteNotice + * @return string HTML fragment + */ + private function getCachedNotice( $name ) { + global $wgRenderHashAppend, $parserMemc, $wgContLang; + + wfProfileIn( __METHOD__ ); + + $needParse = false; + + if ( $name === 'default' ) { + // special case + global $wgSiteNotice; + $notice = $wgSiteNotice; + if ( empty( $notice ) ) { + wfProfileOut( __METHOD__ ); + return false; + } + } else { + $msg = $this->msg( $name )->inContentLanguage(); + if ( $msg->isDisabled() ) { + wfProfileOut( __METHOD__ ); + return false; + } + $notice = $msg->plain(); + } + + // Use the extra hash appender to let eg SSL variants separately cache. + $key = wfMemcKey( $name . $wgRenderHashAppend ); + $cachedNotice = $parserMemc->get( $key ); + if ( is_array( $cachedNotice ) ) { + if ( md5( $notice ) == $cachedNotice['hash'] ) { + $notice = $cachedNotice['html']; + } else { + $needParse = true; + } + } else { + $needParse = true; + } + + if ( $needParse ) { + $parsed = $this->getOutput()->parse( $notice ); + $parserMemc->set( $key, array( 'html' => $parsed, 'hash' => md5( $notice ) ), 600 ); + $notice = $parsed; + } + + $notice = Html::rawElement( 'div', array( 'id' => 'localNotice', + 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ), $notice ); + wfProfileOut( __METHOD__ ); + return $notice; + } + + /** + * Get a notice based on page's namespace + * + * @return string HTML fragment + */ + function getNamespaceNotice() { + wfProfileIn( __METHOD__ ); + + $key = 'namespacenotice-' . $this->getTitle()->getNsText(); + $namespaceNotice = $this->getCachedNotice( $key ); + if ( $namespaceNotice && substr( $namespaceNotice, 0, 7 ) != '

    <' ) { + $namespaceNotice = '

    ' . $namespaceNotice . '
    '; + } else { + $namespaceNotice = ''; + } + + wfProfileOut( __METHOD__ ); + return $namespaceNotice; + } + + /** + * Get the site notice + * + * @return string HTML fragment + */ + function getSiteNotice() { + wfProfileIn( __METHOD__ ); + $siteNotice = ''; + + if ( wfRunHooks( 'SiteNoticeBefore', array( &$siteNotice, $this ) ) ) { + if ( is_object( $this->getUser() ) && $this->getUser()->isLoggedIn() ) { + $siteNotice = $this->getCachedNotice( 'sitenotice' ); + } else { + $anonNotice = $this->getCachedNotice( 'anonnotice' ); + if ( !$anonNotice ) { + $siteNotice = $this->getCachedNotice( 'sitenotice' ); + } else { + $siteNotice = $anonNotice; + } + } + if ( !$siteNotice ) { + $siteNotice = $this->getCachedNotice( 'default' ); + } + } + + wfRunHooks( 'SiteNoticeAfter', array( &$siteNotice, $this ) ); + wfProfileOut( __METHOD__ ); + return $siteNotice; + } + + /** + * Create a section edit link. This supersedes editSectionLink() and + * editSectionLinkForOther(). + * + * @param Title $nt The title being linked to (may not be the same as + * the current page, if the section is included from a template) + * @param string $section The designation of the section being pointed to, + * to be included in the link, like "§ion=$section" + * @param string $tooltip The tooltip to use for the link: will be escaped + * and wrapped in the 'editsectionhint' message + * @param string $lang Language code + * @return string HTML to use for edit link + */ + public function doEditSectionLink( Title $nt, $section, $tooltip = null, $lang = false ) { + // HTML generated here should probably have userlangattributes + // added to it for LTR text on RTL pages + + $lang = wfGetLangObj( $lang ); + + $attribs = array(); + if ( !is_null( $tooltip ) ) { + # Bug 25462: undo double-escaping. + $tooltip = Sanitizer::decodeCharReferences( $tooltip ); + $attribs['title'] = wfMessage( 'editsectionhint' )->rawParams( $tooltip ) + ->inLanguage( $lang )->text(); + } + $link = Linker::link( $nt, wfMessage( 'editsection' )->inLanguage( $lang )->text(), + $attribs, + array( 'action' => 'edit', 'section' => $section ), + array( 'noclasses', 'known' ) + ); + + # Add the brackets and the span and run the hook. + $result = '' + . '[' + . $link + . ']' + . ''; + + wfRunHooks( 'DoEditSectionLink', array( $this, $nt, $section, $tooltip, &$result, $lang ) ); + return $result; + } + + /** + * Use PHP's magic __call handler to intercept legacy calls to the linker + * for backwards compatibility. + * + * @param string $fname Name of called method + * @param array $args Arguments to the method + * @throws MWException + * @return mixed + */ + function __call( $fname, $args ) { + $realFunction = array( 'Linker', $fname ); + if ( is_callable( $realFunction ) ) { + wfDeprecated( get_class( $this ) . '::' . $fname, '1.21' ); + return call_user_func_array( $realFunction, $args ); + } else { + $className = get_class( $this ); + throw new MWException( "Call to undefined method $className::$fname" ); + } + } + +} diff --git a/includes/skins/SkinException.php b/includes/skins/SkinException.php new file mode 100644 index 0000000000..31ff1437e8 --- /dev/null +++ b/includes/skins/SkinException.php @@ -0,0 +1,29 @@ + callback + * @var array + */ + private $factoryFunctions = array(); + /** + * Map of name => human readable name + * @var array + */ + private $displayNames = array(); + + /** + * @var SkinFactory + */ + private static $self; + + public static function getDefaultInstance() { + if ( !self::$self ) { + self::$self = new self; + } + + return self::$self; + } + + /** + * Register a new Skin factory function + * Will override if it's already registered + * @param string $name + * @param string $displayName + * @param callable $callback That takes the skin name as an argument + * @throws InvalidArgumentException If an invalid callback is provided + */ + public function register( $name, $displayName, $callback ) { + if ( !is_callable( $callback ) ) { + throw new InvalidArgumentException( 'Invalid callback provided' ); + } + $this->factoryFunctions[$name] = $callback; + $this->displayNames[$name] = $displayName; + } + + /** + * @return array + */ + private function getLegacySkinNames() { + global $wgValidSkinNames; + static $skinsInitialised = false; + + if ( !$skinsInitialised || !count( $wgValidSkinNames ) ) { + # Get a list of available skins + # Build using the regular expression '^(.*).php$' + # Array keys are all lower case, array value keep the case used by filename + # + wfProfileIn( __METHOD__ . '-init' ); + + global $wgStyleDirectory; + + $skinDir = dir( $wgStyleDirectory ); + + if ( $skinDir !== false && $skinDir !== null ) { + # while code from www.php.net + while ( false !== ( $file = $skinDir->read() ) ) { + // Skip non-PHP files, hidden files, and '.dep' includes + $matches = array(); + + if ( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) { + $aSkin = $matches[1]; + + // Explicitly disallow loading core skins via the autodiscovery mechanism. + // + // They should be loaded already (in a non-autodicovery way), but old files might still + // exist on the server because our MW version upgrade process is widely documented as + // requiring just copying over all files, without removing old ones. + // + // This is one of the reasons we should have never used autodiscovery in the first + // place. This hack can be safely removed when autodiscovery is gone. + if ( in_array( $aSkin, array( 'CologneBlue', 'Modern', 'MonoBook', 'Vector' ) ) ) { + wfLogWarning( + "An old copy of the $aSkin skin was found in your skins/ directory. " . + "You should remove it to avoid problems in the future." . + "See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for details." + ); + continue; + } + + wfLogWarning( + "A skin using autodiscovery mechanism, $aSkin, was found in your skins/ directory. " . + "The mechanism will be removed in MediaWiki 1.25 and the skin will no longer be recognized. " . + "See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for information how to fix this." + ); + $wgValidSkinNames[strtolower( $aSkin )] = $aSkin; + } + } + $skinDir->close(); + } + $skinsInitialised = true; + wfProfileOut( __METHOD__ . '-init' ); + } + return $wgValidSkinNames; + + } + + /** + * Returns an associative array of: + * skin name => human readable name + * + * @return array + */ + public function getSkinNames() { + return array_merge( + $this->getLegacySkinNames(), + $this->displayNames + ); + } + + /** + * Get a legacy skin which uses $wgValidSkinNames + * or autoloading + * + * @param string $name + * @return Skin|bool false if the skin couldn't be constructed + */ + private function getLegacySkin( $name ) { + $skinNames = $this->getLegacySkinNames(); + if ( !isset( $skinNames[$name] ) ) { + return false; + } + $skinName = $skinNames[$name]; + $className = "Skin{$skinName}"; + + # Grab the skin class and initialise it. + if ( !class_exists( $className ) ) { + global $wgStyleDirectory; + require_once "{$wgStyleDirectory}/{$skinName}.php"; + + # Check if we got it + if ( !class_exists( $className ) ) { + # DO NOT die if the class isn't found. This breaks maintenance + # scripts and can cause a user account to be unrecoverable + # except by SQL manipulation if a previously valid skin name + # is no longer valid. + return false; + } + } + $skin = new $className( $name ); + return $skin; + + } + + /** + * Create a given Skin using the registered callback for $name. + * @param string $name Name of the skin you want + * @throws SkinException If a factory function isn't registered for $name + * @throws UnexpectedValueException If the factory function returns a non-Skin object + * @return Skin + */ + public function makeSkin( $name ) { + if ( !isset( $this->factoryFunctions[$name] ) ) { + // Check the legacy method of skin loading + $legacy = $this->getLegacySkin( $name ); + if ( $legacy ) { + return $legacy; + } + throw new SkinException( "No registered builder available for $name." ); + } + $skin = call_user_func( $this->factoryFunctions[$name], $name ); + if ( $skin instanceof Skin ) { + return $skin; + } else { + throw new UnexpectedValueException( "The builder for $name returned a non-Skin object." ); + } + } +} diff --git a/includes/skins/SkinFallback.php b/includes/skins/SkinFallback.php new file mode 100644 index 0000000000..30ea97d995 --- /dev/null +++ b/includes/skins/SkinFallback.php @@ -0,0 +1,28 @@ +addModuleStyles( 'mediawiki.skinning.interface' ); + } +} diff --git a/includes/skins/SkinFallbackTemplate.php b/includes/skins/SkinFallbackTemplate.php new file mode 100644 index 0000000000..0703b0eee3 --- /dev/null +++ b/includes/skins/SkinFallbackTemplate.php @@ -0,0 +1,109 @@ +config->get( 'StyleDirectory' ); // @todo we should inject this directly? + // Get all subdirectories which might contains skins + $possibleSkins = scandir( $styleDirectory ); + $possibleSkins = array_filter( $possibleSkins, function ( $maybeDir ) use ( $styleDirectory ) { + return $maybeDir !== '.' && $maybeDir !== '..' && is_dir( "$styleDirectory/$maybeDir" ); + } ); + + // Only keep the ones that contain a .php file with the same name inside + $possibleSkins = array_filter( $possibleSkins, function ( $skinDir ) use ( $styleDirectory ) { + return is_file( "$styleDirectory/$skinDir/$skinDir.php" ); + } ); + + return $possibleSkins; + } + + /** + * Inform the user why they are seeing this skin. + * + * @return string + */ + private function buildHelpfulInformationMessage() { + $defaultSkin = $this->config->get( 'DefaultSkin' ); + $installedSkins = $this->findInstalledSkins(); + $enabledSkins = $this->config->get( 'ValidSkinNames' ); + $enabledSkins = array_change_key_case( $enabledSkins, CASE_LOWER ); + + if ( $installedSkins ) { + $skinsInstalledText = array(); + $skinsInstalledSnippet = array(); + + foreach ( $installedSkins as $skin ) { + $normalizedKey = strtolower( $skin ); + $isEnabled = array_key_exists( $normalizedKey, $enabledSkins ); + if ( $isEnabled ) { + $skinsInstalledText[] = $this->getMsg( 'default-skin-not-found-row-enabled' ) + ->params( $normalizedKey, $skin )->plain(); + } else { + $skinsInstalledText[] = $this->getMsg( 'default-skin-not-found-row-disabled' ) + ->params( $normalizedKey, $skin )->plain(); + $skinsInstalledSnippet[] = "require_once \"\$IP/skins/$skin/$skin.php\";"; + } + } + + return $this->getMsg( 'default-skin-not-found' )->params( + $defaultSkin, + implode( "\n", $skinsInstalledText ), + implode( "\n", $skinsInstalledSnippet ) + )->parseAsBlock(); + } else { + return $this->getMsg( 'default-skin-not-found-no-skins' )->params( + $defaultSkin + )->parseAsBlock(); + } + } + + /** + * Outputs the entire contents of the page. No navigation (other than search box), just the big + * warning message and page content. + */ + public function execute() { + $this->html( 'headelement' ) ?> + +
    + buildHelpfulInformationMessage() ?> +
    + +
    + +

    + makeSearchInput( array( "id" => "searchInput" ) ) ?> + makeSearchButton( 'go' ) ?> +
    + +
    +

    + html( 'title' ) ?> +

    + +
    + html( 'bodytext' ) ?> + html( 'catlinks' ) ?> +
    +
    + + printTrail() ?> + + + context[$varName] = $value; + } + + function translate( $value ) { + wfProfileIn( __METHOD__ ); + + // Hack for i18n:attributes in PHPTAL 1.0.0 dev version as of 2004-10-23 + $value = preg_replace( '/^string:/', '', $value ); + + $value = wfMessage( $value )->text(); + // interpolate variables + $m = array(); + while ( preg_match( '/\$([0-9]*?)/sm', $value, $m ) ) { + list( $src, $var ) = $m; + wfSuppressWarnings(); + $varValue = $this->context[$var]; + wfRestoreWarnings(); + $value = str_replace( $src, $varValue, $value ); + } + wfProfileOut( __METHOD__ ); + return $value; + } +} + +/** + * Template-filler skin base class + * Formerly generic PHPTal (http://phptal.sourceforge.net/) skin + * Based on Brion's smarty skin + * @copyright Copyright © Gabriel Wicke -- http://www.aulinx.de/ + * + * @todo Needs some serious refactoring into functions that correspond + * to the computations individual esi snippets need. Most importantly no body + * parsing for most of those of course. + * + * @ingroup Skins + */ +class SkinTemplate extends Skin { + /** + * @var string Name of our skin, it probably needs to be all lower case. + * Child classes should override the default. + */ + public $skinname = 'monobook'; + + /** + * @var string For QuickTemplate, the name of the subclass which will + * actually fill the template. Child classes should override the default. + */ + public $template = 'QuickTemplate'; + + /** + * Add specific styles for this skin + * + * @param OutputPage $out + */ + function setupSkinUserCss( OutputPage $out ) { + $out->addModuleStyles( array( + 'mediawiki.legacy.shared', + 'mediawiki.legacy.commonPrint', + 'mediawiki.ui.button' + ) ); + } + + /** + * Create the template engine object; we feed it a bunch of data + * and eventually it spits out some HTML. Should have interface + * roughly equivalent to PHPTAL 0.7. + * + * @param string $classname + * @param bool|string $repository Subdirectory where we keep template files + * @param bool|string $cache_dir + * @return QuickTemplate + * @private + */ + function setupTemplate( $classname, $repository = false, $cache_dir = false ) { + return new $classname( $this->getConfig() ); + } + + /** + * Generates array of language links for the current page + * + * @return array + */ + public function getLanguages() { + global $wgHideInterlanguageLinks; + if ( $wgHideInterlanguageLinks ) { + return array(); + } + + $userLang = $this->getLanguage(); + $languageLinks = array(); + + foreach ( $this->getOutput()->getLanguageLinks() as $languageLinkText ) { + $languageLinkParts = explode( ':', $languageLinkText, 2 ); + $class = 'interlanguage-link interwiki-' . $languageLinkParts[0]; + unset( $languageLinkParts ); + + $languageLinkTitle = Title::newFromText( $languageLinkText ); + if ( $languageLinkTitle ) { + $ilInterwikiCode = $languageLinkTitle->getInterwiki(); + $ilLangName = Language::fetchLanguageName( $ilInterwikiCode ); + + if ( strval( $ilLangName ) === '' ) { + $ilDisplayTextMsg = wfMessage( "interlanguage-link-$ilInterwikiCode" ); + if ( !$ilDisplayTextMsg->isDisabled() ) { + // Use custom MW message for the display text + $ilLangName = $ilDisplayTextMsg->text(); + } else { + // Last resort: fallback to the language link target + $ilLangName = $languageLinkText; + } + } else { + // Use the language autonym as display text + $ilLangName = $this->formatLanguageName( $ilLangName ); + } + + // CLDR extension or similar is required to localize the language name; + // otherwise we'll end up with the autonym again. + $ilLangLocalName = Language::fetchLanguageName( + $ilInterwikiCode, + $userLang->getCode() + ); + + $languageLinkTitleText = $languageLinkTitle->getText(); + if ( $ilLangLocalName === '' ) { + $ilFriendlySiteName = wfMessage( "interlanguage-link-sitename-$ilInterwikiCode" ); + if ( !$ilFriendlySiteName->isDisabled() ) { + if ( $languageLinkTitleText === '' ) { + $ilTitle = wfMessage( + 'interlanguage-link-title-nonlangonly', + $ilFriendlySiteName->text() + )->text(); + } else { + $ilTitle = wfMessage( + 'interlanguage-link-title-nonlang', + $languageLinkTitleText, + $ilFriendlySiteName->text() + )->text(); + } + } else { + // we have nothing friendly to put in the title, so fall back to + // displaying the interlanguage link itself in the title text + // (similar to what is done in page content) + $ilTitle = $languageLinkTitle->getInterwiki() . + ":$languageLinkTitleText"; + } + } elseif ( $languageLinkTitleText === '' ) { + $ilTitle = wfMessage( + 'interlanguage-link-title-langonly', + $ilLangLocalName + )->text(); + } else { + $ilTitle = wfMessage( + 'interlanguage-link-title', + $languageLinkTitleText, + $ilLangLocalName + )->text(); + } + + $ilInterwikiCodeBCP47 = wfBCP47( $ilInterwikiCode ); + $languageLink = array( + 'href' => $languageLinkTitle->getFullURL(), + 'text' => $ilLangName, + 'title' => $ilTitle, + 'class' => $class, + 'lang' => $ilInterwikiCodeBCP47, + 'hreflang' => $ilInterwikiCodeBCP47, + ); + wfRunHooks( + 'SkinTemplateGetLanguageLink', + array( &$languageLink, $languageLinkTitle, $this->getTitle() ) + ); + $languageLinks[] = $languageLink; + } + } + + return $languageLinks; + } + + protected function setupTemplateForOutput() { + wfProfileIn( __METHOD__ ); + + $request = $this->getRequest(); + $user = $this->getUser(); + $title = $this->getTitle(); + + wfProfileIn( __METHOD__ . '-init' ); + $tpl = $this->setupTemplate( $this->template, 'skins' ); + wfProfileOut( __METHOD__ . '-init' ); + + wfProfileIn( __METHOD__ . '-stuff' ); + $this->thispage = $title->getPrefixedDBkey(); + $this->titletxt = $title->getPrefixedText(); + $this->userpage = $user->getUserPage()->getPrefixedText(); + $query = array(); + if ( !$request->wasPosted() ) { + $query = $request->getValues(); + unset( $query['title'] ); + unset( $query['returnto'] ); + unset( $query['returntoquery'] ); + } + $this->thisquery = wfArrayToCgi( $query ); + $this->loggedin = $user->isLoggedIn(); + $this->username = $user->getName(); + + if ( $this->loggedin || $this->showIPinHeader() ) { + $this->userpageUrlDetails = self::makeUrlDetails( $this->userpage ); + } else { + # This won't be used in the standard skins, but we define it to preserve the interface + # To save time, we check for existence + $this->userpageUrlDetails = self::makeKnownUrlDetails( $this->userpage ); + } + + wfProfileOut( __METHOD__ . '-stuff' ); + + wfProfileOut( __METHOD__ ); + + return $tpl; + } + + /** + * initialize various variables and generate the template + * + * @param OutputPage $out + */ + function outputPage( OutputPage $out = null ) { + wfProfileIn( __METHOD__ ); + Profiler::instance()->setTemplated( true ); + + $oldContext = null; + if ( $out !== null ) { + // @todo Add wfDeprecated in 1.20 + $oldContext = $this->getContext(); + $this->setContext( $out->getContext() ); + } + + $out = $this->getOutput(); + + wfProfileIn( __METHOD__ . '-init' ); + $this->initPage( $out ); + wfProfileOut( __METHOD__ . '-init' ); + $tpl = $this->prepareQuickTemplate( $out ); + // execute template + wfProfileIn( __METHOD__ . '-execute' ); + $res = $tpl->execute(); + wfProfileOut( __METHOD__ . '-execute' ); + + // result may be an error + $this->printOrError( $res ); + + if ( $oldContext ) { + $this->setContext( $oldContext ); + } + + wfProfileOut( __METHOD__ ); + } + + /** + * initialize various variables and generate the template + * + * @since 1.23 + * @return QuickTemplate The template to be executed by outputPage + */ + protected function prepareQuickTemplate() { + global $wgContLang, $wgScript, $wgStylePath, $wgMimeType, $wgJsMimeType, + $wgDisableCounters, $wgSitename, $wgLogo, $wgMaxCredits, + $wgShowCreditsIfMax, $wgPageShowWatchingUsers, $wgArticlePath, + $wgScriptPath, $wgServer; + + wfProfileIn( __METHOD__ ); + + $title = $this->getTitle(); + $request = $this->getRequest(); + $out = $this->getOutput(); + $tpl = $this->setupTemplateForOutput(); + + wfProfileIn( __METHOD__ . '-stuff2' ); + $tpl->set( 'title', $out->getPageTitle() ); + $tpl->set( 'pagetitle', $out->getHTMLTitle() ); + $tpl->set( 'displaytitle', $out->mPageLinkTitle ); + + $tpl->setRef( 'thispage', $this->thispage ); + $tpl->setRef( 'titleprefixeddbkey', $this->thispage ); + $tpl->set( 'titletext', $title->getText() ); + $tpl->set( 'articleid', $title->getArticleID() ); + + $tpl->set( 'isarticle', $out->isArticle() ); + + $subpagestr = $this->subPageSubtitle(); + if ( $subpagestr !== '' ) { + $subpagestr = '' . $subpagestr . ''; + } + $tpl->set( 'subtitle', $subpagestr . $out->getSubtitle() ); + + $undelete = $this->getUndeleteLink(); + if ( $undelete === '' ) { + $tpl->set( 'undelete', '' ); + } else { + $tpl->set( 'undelete', '' . $undelete . '' ); + } + + $tpl->set( 'catlinks', $this->getCategories() ); + if ( $out->isSyndicated() ) { + $feeds = array(); + foreach ( $out->getSyndicationLinks() as $format => $link ) { + $feeds[$format] = array( + // Messages: feed-atom, feed-rss + 'text' => $this->msg( "feed-$format" )->text(), + 'href' => $link + ); + } + $tpl->setRef( 'feeds', $feeds ); + } else { + $tpl->set( 'feeds', false ); + } + + $tpl->setRef( 'mimetype', $wgMimeType ); + $tpl->setRef( 'jsmimetype', $wgJsMimeType ); + $tpl->set( 'charset', 'UTF-8' ); + $tpl->setRef( 'wgScript', $wgScript ); + $tpl->setRef( 'skinname', $this->skinname ); + $tpl->set( 'skinclass', get_class( $this ) ); + $tpl->setRef( 'skin', $this ); + $tpl->setRef( 'stylename', $this->stylename ); + $tpl->set( 'printable', $out->isPrintable() ); + $tpl->set( 'handheld', $request->getBool( 'handheld' ) ); + $tpl->setRef( 'loggedin', $this->loggedin ); + $tpl->set( 'notspecialpage', !$title->isSpecialPage() ); + $tpl->set( 'searchaction', $this->escapeSearchLink() ); + $tpl->set( 'searchtitle', SpecialPage::getTitleFor( 'Search' )->getPrefixedDBkey() ); + $tpl->set( 'search', trim( $request->getVal( 'search' ) ) ); + $tpl->setRef( 'stylepath', $wgStylePath ); + $tpl->setRef( 'articlepath', $wgArticlePath ); + $tpl->setRef( 'scriptpath', $wgScriptPath ); + $tpl->setRef( 'serverurl', $wgServer ); + $tpl->setRef( 'logopath', $wgLogo ); + $tpl->setRef( 'sitename', $wgSitename ); + + $userLang = $this->getLanguage(); + $userLangCode = $userLang->getHtmlCode(); + $userLangDir = $userLang->getDir(); + + $tpl->set( 'lang', $userLangCode ); + $tpl->set( 'dir', $userLangDir ); + $tpl->set( 'rtl', $userLang->isRTL() ); + + $tpl->set( 'capitalizeallnouns', $userLang->capitalizeAllNouns() ? ' capitalize-all-nouns' : '' ); + $tpl->set( 'showjumplinks', true ); // showjumplinks preference has been removed + $tpl->set( 'username', $this->loggedin ? $this->username : null ); + $tpl->setRef( 'userpage', $this->userpage ); + $tpl->setRef( 'userpageurl', $this->userpageUrlDetails['href'] ); + $tpl->set( 'userlang', $userLangCode ); + + // Users can have their language set differently than the + // content of the wiki. For these users, tell the web browser + // that interface elements are in a different language. + $tpl->set( 'userlangattributes', '' ); + $tpl->set( 'specialpageattributes', '' ); # obsolete + // Used by VectorBeta to insert HTML before content but after the + // heading for the page title. Defaults to empty string. + $tpl->set( 'prebodyhtml', '' ); + + if ( $userLangCode !== $wgContLang->getHtmlCode() || $userLangDir !== $wgContLang->getDir() ) { + $escUserlang = htmlspecialchars( $userLangCode ); + $escUserdir = htmlspecialchars( $userLangDir ); + // Attributes must be in double quotes because htmlspecialchars() doesn't + // escape single quotes + $attrs = " lang=\"$escUserlang\" dir=\"$escUserdir\""; + $tpl->set( 'userlangattributes', $attrs ); + } + + wfProfileOut( __METHOD__ . '-stuff2' ); + + wfProfileIn( __METHOD__ . '-stuff3' ); + $tpl->set( 'newtalk', $this->getNewtalks() ); + $tpl->set( 'logo', $this->logoText() ); + + $tpl->set( 'copyright', false ); + $tpl->set( 'viewcount', false ); + $tpl->set( 'lastmod', false ); + $tpl->set( 'credits', false ); + $tpl->set( 'numberofwatchingusers', false ); + if ( $out->isArticle() && $title->exists() ) { + if ( $this->isRevisionCurrent() ) { + if ( !$wgDisableCounters ) { + $viewcount = $this->getWikiPage()->getCount(); + if ( $viewcount ) { + $tpl->set( 'viewcount', $this->msg( 'viewcount' )->numParams( $viewcount )->parse() ); + } + } + + if ( $wgPageShowWatchingUsers ) { + $dbr = wfGetDB( DB_SLAVE ); + $num = $dbr->selectField( 'watchlist', 'COUNT(*)', + array( 'wl_title' => $title->getDBkey(), 'wl_namespace' => $title->getNamespace() ), + __METHOD__ + ); + if ( $num > 0 ) { + $tpl->set( 'numberofwatchingusers', + $this->msg( 'number_of_watching_users_pageview' )->numParams( $num )->parse() + ); + } + } + + if ( $wgMaxCredits != 0 ) { + $tpl->set( 'credits', Action::factory( 'credits', $this->getWikiPage(), + $this->getContext() )->getCredits( $wgMaxCredits, $wgShowCreditsIfMax ) ); + } else { + $tpl->set( 'lastmod', $this->lastModified() ); + } + } + $tpl->set( 'copyright', $this->getCopyright() ); + } + wfProfileOut( __METHOD__ . '-stuff3' ); + + wfProfileIn( __METHOD__ . '-stuff4' ); + $tpl->set( 'copyrightico', $this->getCopyrightIcon() ); + $tpl->set( 'poweredbyico', $this->getPoweredBy() ); + $tpl->set( 'disclaimer', $this->disclaimerLink() ); + $tpl->set( 'privacy', $this->privacyLink() ); + $tpl->set( 'about', $this->aboutLink() ); + + $tpl->set( 'footerlinks', array( + 'info' => array( + 'lastmod', + 'viewcount', + 'numberofwatchingusers', + 'credits', + 'copyright', + ), + 'places' => array( + 'privacy', + 'about', + 'disclaimer', + ), + ) ); + + global $wgFooterIcons; + $tpl->set( 'footericons', $wgFooterIcons ); + foreach ( $tpl->data['footericons'] as $footerIconsKey => &$footerIconsBlock ) { + if ( count( $footerIconsBlock ) > 0 ) { + foreach ( $footerIconsBlock as &$footerIcon ) { + if ( isset( $footerIcon['src'] ) ) { + if ( !isset( $footerIcon['width'] ) ) { + $footerIcon['width'] = 88; + } + if ( !isset( $footerIcon['height'] ) ) { + $footerIcon['height'] = 31; + } + } + } + } else { + unset( $tpl->data['footericons'][$footerIconsKey] ); + } + } + + $tpl->set( 'sitenotice', $this->getSiteNotice() ); + $tpl->set( 'bottomscripts', $this->bottomScripts() ); + $tpl->set( 'printfooter', $this->printSource() ); + + # An ID that includes the actual body text; without categories, contentSub, ... + $realBodyAttribs = array( 'id' => 'mw-content-text' ); + + # Add a mw-content-ltr/rtl class to be able to style based on text direction + # when the content is different from the UI language, i.e.: + # not for special pages or file pages AND only when viewing AND if the page exists + # (or is in MW namespace, because that has default content) + if ( !in_array( $title->getNamespace(), array( NS_SPECIAL, NS_FILE ) ) && + Action::getActionName( $this ) === 'view' && + ( $title->exists() || $title->getNamespace() == NS_MEDIAWIKI ) ) { + $pageLang = $title->getPageViewLanguage(); + $realBodyAttribs['lang'] = $pageLang->getHtmlCode(); + $realBodyAttribs['dir'] = $pageLang->getDir(); + $realBodyAttribs['class'] = 'mw-content-' . $pageLang->getDir(); + } + + $out->mBodytext = Html::rawElement( 'div', $realBodyAttribs, $out->mBodytext ); + $tpl->setRef( 'bodytext', $out->mBodytext ); + + $language_urls = $this->getLanguages(); + if ( count( $language_urls ) ) { + $tpl->setRef( 'language_urls', $language_urls ); + } else { + $tpl->set( 'language_urls', false ); + } + wfProfileOut( __METHOD__ . '-stuff4' ); + + wfProfileIn( __METHOD__ . '-stuff5' ); + # Personal toolbar + $tpl->set( 'personal_urls', $this->buildPersonalUrls() ); + $content_navigation = $this->buildContentNavigationUrls(); + $content_actions = $this->buildContentActionUrls( $content_navigation ); + $tpl->setRef( 'content_navigation', $content_navigation ); + $tpl->setRef( 'content_actions', $content_actions ); + + $tpl->set( 'sidebar', $this->buildSidebar() ); + $tpl->set( 'nav_urls', $this->buildNavUrls() ); + + // Set the head scripts near the end, in case the above actions resulted in added scripts + $tpl->set( 'headelement', $out->headElement( $this ) ); + + $tpl->set( 'debug', '' ); + $tpl->set( 'debughtml', $this->generateDebugHTML() ); + $tpl->set( 'reporttime', wfReportTime() ); + + // original version by hansm + if ( !wfRunHooks( 'SkinTemplateOutputPageBeforeExec', array( &$this, &$tpl ) ) ) { + wfDebug( __METHOD__ . ": Hook SkinTemplateOutputPageBeforeExec broke outputPage execution!\n" ); + } + + // Set the bodytext to another key so that skins can just output it on it's own + // and output printfooter and debughtml separately + $tpl->set( 'bodycontent', $tpl->data['bodytext'] ); + + // Append printfooter and debughtml onto bodytext so that skins that + // were already using bodytext before they were split out don't suddenly + // start not outputting information. + $tpl->data['bodytext'] .= Html::rawElement( + 'div', + array( 'class' => 'printfooter' ), + "\n{$tpl->data['printfooter']}" + ) . "\n"; + $tpl->data['bodytext'] .= $tpl->data['debughtml']; + + // allow extensions adding stuff after the page content. + // See Skin::afterContentHook() for further documentation. + $tpl->set( 'dataAfterContent', $this->afterContentHook() ); + wfProfileOut( __METHOD__ . '-stuff5' ); + + wfProfileOut( __METHOD__ ); + return $tpl; + } + + /** + * Get the HTML for the p-personal list + * @return string + */ + public function getPersonalToolsList() { + $tpl = $this->setupTemplateForOutput(); + $tpl->set( 'personal_urls', $this->buildPersonalUrls() ); + $html = ''; + foreach ( $tpl->getPersonalTools() as $key => $item ) { + $html .= $tpl->makeListItem( $key, $item ); + } + return $html; + } + + /** + * Format language name for use in sidebar interlanguage links list. + * By default it is capitalized. + * + * @param string $name Language name, e.g. "English" or "español" + * @return string + * @private + */ + function formatLanguageName( $name ) { + return $this->getLanguage()->ucfirst( $name ); + } + + /** + * Output the string, or print error message if it's + * an error object of the appropriate type. + * For the base class, assume strings all around. + * + * @param string $str + * @private + */ + function printOrError( $str ) { + echo $str; + } + + /** + * Output a boolean indicating if buildPersonalUrls should output separate + * login and create account links or output a combined link + * By default we simply return a global config setting that affects most skins + * This is setup as a method so that like with $wgLogo and getLogo() a skin + * can override this setting and always output one or the other if it has + * a reason it can't output one of the two modes. + * @return bool + */ + function useCombinedLoginLink() { + global $wgUseCombinedLoginLink; + return $wgUseCombinedLoginLink; + } + + /** + * build array of urls for personal toolbar + * @return array + */ + protected function buildPersonalUrls() { + $title = $this->getTitle(); + $request = $this->getRequest(); + $pageurl = $title->getLocalURL(); + wfProfileIn( __METHOD__ ); + + /* set up the default links for the personal toolbar */ + $personal_urls = array(); + + # Due to bug 32276, if a user does not have read permissions, + # $this->getTitle() will just give Special:Badtitle, which is + # not especially useful as a returnto parameter. Use the title + # from the request instead, if there was one. + if ( $this->getUser()->isAllowed( 'read' ) ) { + $page = $this->getTitle(); + } else { + $page = Title::newFromText( $request->getVal( 'title', '' ) ); + } + $page = $request->getVal( 'returnto', $page ); + $a = array(); + if ( strval( $page ) !== '' ) { + $a['returnto'] = $page; + $query = $request->getVal( 'returntoquery', $this->thisquery ); + if ( $query != '' ) { + $a['returntoquery'] = $query; + } + } + + $returnto = wfArrayToCgi( $a ); + if ( $this->loggedin ) { + $personal_urls['userpage'] = array( + 'text' => $this->username, + 'href' => &$this->userpageUrlDetails['href'], + 'class' => $this->userpageUrlDetails['exists'] ? false : 'new', + 'active' => ( $this->userpageUrlDetails['href'] == $pageurl ), + 'dir' => 'auto' + ); + $usertalkUrlDetails = $this->makeTalkUrlDetails( $this->userpage ); + $personal_urls['mytalk'] = array( + 'text' => $this->msg( 'mytalk' )->text(), + 'href' => &$usertalkUrlDetails['href'], + 'class' => $usertalkUrlDetails['exists'] ? false : 'new', + 'active' => ( $usertalkUrlDetails['href'] == $pageurl ) + ); + $href = self::makeSpecialUrl( 'Preferences' ); + $personal_urls['preferences'] = array( + 'text' => $this->msg( 'mypreferences' )->text(), + 'href' => $href, + 'active' => ( $href == $pageurl ) + ); + + if ( $this->getUser()->isAllowed( 'viewmywatchlist' ) ) { + $href = self::makeSpecialUrl( 'Watchlist' ); + $personal_urls['watchlist'] = array( + 'text' => $this->msg( 'mywatchlist' )->text(), + 'href' => $href, + 'active' => ( $href == $pageurl ) + ); + } + + # We need to do an explicit check for Special:Contributions, as we + # have to match both the title, and the target, which could come + # from request values (Special:Contributions?target=Jimbo_Wales) + # or be specified in "sub page" form + # (Special:Contributions/Jimbo_Wales). The plot + # thickens, because the Title object is altered for special pages, + # 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() ); + $active = $spName == 'Contributions' + && ( ( $spPar && $spPar == $this->username ) + || $request->getText( 'target' ) == $this->username ); + } else { + $active = false; + } + + $href = self::makeSpecialUrlSubpage( 'Contributions', $this->username ); + $personal_urls['mycontris'] = array( + 'text' => $this->msg( 'mycontris' )->text(), + 'href' => $href, + 'active' => $active + ); + $personal_urls['logout'] = array( + 'text' => $this->msg( 'pt-userlogout' )->text(), + 'href' => self::makeSpecialUrl( 'Userlogout', + // userlogout link must always contain an & character, otherwise we might not be able + // to detect a buggy precaching proxy (bug 17790) + $title->isSpecial( 'Preferences' ) ? 'noreturnto' : $returnto + ), + 'active' => false + ); + } else { + $useCombinedLoginLink = $this->useCombinedLoginLink(); + $loginlink = $this->getUser()->isAllowed( 'createaccount' ) && $useCombinedLoginLink + ? 'nav-login-createaccount' + : 'pt-login'; + $is_signup = $request->getText( 'type' ) == 'signup'; + + $login_url = array( + 'text' => $this->msg( $loginlink )->text(), + 'href' => self::makeSpecialUrl( 'Userlogin', $returnto ), + 'active' => $title->isSpecial( 'Userlogin' ) + && ( $loginlink == 'nav-login-createaccount' || !$is_signup ), + ); + $createaccount_url = array( + 'text' => $this->msg( 'pt-createaccount' )->text(), + 'href' => self::makeSpecialUrl( 'Userlogin', "$returnto&type=signup" ), + 'active' => $title->isSpecial( 'Userlogin' ) && $is_signup, + ); + + if ( $this->showIPinHeader() ) { + $href = &$this->userpageUrlDetails['href']; + $personal_urls['anonuserpage'] = array( + 'text' => $this->username, + 'href' => $href, + 'class' => $this->userpageUrlDetails['exists'] ? false : 'new', + 'active' => ( $pageurl == $href ) + ); + $usertalkUrlDetails = $this->makeTalkUrlDetails( $this->userpage ); + $href = &$usertalkUrlDetails['href']; + $personal_urls['anontalk'] = array( + 'text' => $this->msg( 'anontalk' )->text(), + 'href' => $href, + 'class' => $usertalkUrlDetails['exists'] ? false : 'new', + 'active' => ( $pageurl == $href ) + ); + } + + if ( $this->getUser()->isAllowed( 'createaccount' ) && !$useCombinedLoginLink ) { + $personal_urls['createaccount'] = $createaccount_url; + } + + $personal_urls['login'] = $login_url; + } + + wfRunHooks( 'PersonalUrls', array( &$personal_urls, &$title, $this ) ); + wfProfileOut( __METHOD__ ); + return $personal_urls; + } + + /** + * Builds an array with tab definition + * + * @param Title $title Page Where the tab links to + * @param string|array $message Message key or an array of message keys (will fall back) + * @param bool $selected Display the tab as selected + * @param string $query Query string attached to tab URL + * @param bool $checkEdit Check if $title exists and mark with .new if one doesn't + * + * @return array + */ + function tabAction( $title, $message, $selected, $query = '', $checkEdit = false ) { + $classes = array(); + if ( $selected ) { + $classes[] = 'selected'; + } + if ( $checkEdit && !$title->isKnown() ) { + $classes[] = 'new'; + if ( $query !== '' ) { + $query = 'action=edit&redlink=1&' . $query; + } else { + $query = 'action=edit&redlink=1'; + } + } + + // wfMessageFallback will nicely accept $message as an array of fallbacks + // or just a single key + $msg = wfMessageFallback( $message )->setContext( $this->getContext() ); + if ( is_array( $message ) ) { + // for hook compatibility just keep the last message name + $message = end( $message ); + } + if ( $msg->exists() ) { + $text = $msg->text(); + } else { + global $wgContLang; + $text = $wgContLang->getFormattedNsText( + MWNamespace::getSubject( $title->getNamespace() ) ); + } + + $result = array(); + if ( !wfRunHooks( 'SkinTemplateTabAction', array( &$this, + $title, $message, $selected, $checkEdit, + &$classes, &$query, &$text, &$result ) ) ) { + return $result; + } + + return array( + 'class' => implode( ' ', $classes ), + 'text' => $text, + 'href' => $title->getLocalURL( $query ), + 'primary' => true ); + } + + function makeTalkUrlDetails( $name, $urlaction = '' ) { + $title = Title::newFromText( $name ); + if ( !is_object( $title ) ) { + throw new MWException( __METHOD__ . " given invalid pagename $name" ); + } + $title = $title->getTalkPage(); + self::checkTitle( $title, $name ); + return array( + 'href' => $title->getLocalURL( $urlaction ), + 'exists' => $title->getArticleID() != 0, + ); + } + + function makeArticleUrlDetails( $name, $urlaction = '' ) { + $title = Title::newFromText( $name ); + $title = $title->getSubjectPage(); + self::checkTitle( $title, $name ); + return array( + 'href' => $title->getLocalURL( $urlaction ), + 'exists' => $title->getArticleID() != 0, + ); + } + + /** + * a structured array of links usually used for the tabs in a skin + * + * There are 4 standard sections + * namespaces: Used for namespace tabs like special, page, and talk namespaces + * views: Used for primary page views like read, edit, history + * actions: Used for most extra page actions like deletion, protection, etc... + * variants: Used to list the language variants for the page + * + * Each section's value is a key/value array of links for that section. + * The links themselves have these common keys: + * - class: The css classes to apply to the tab + * - text: The text to display on the tab + * - href: The href for the tab to point to + * - rel: An optional rel= for the tab's link + * - redundant: If true the tab will be dropped in skins using content_actions + * this is useful for tabs like "Read" which only have meaning in skins that + * take special meaning from the grouped structure of content_navigation + * + * Views also have an extra key which can be used: + * - primary: If this is not true skins like vector may try to hide the tab + * when the user has limited space in their browser window + * + * content_navigation using code also expects these ids to be present on the + * links, however these are usually automatically generated by SkinTemplate + * itself and are not necessary when using a hook. The only things these may + * matter to are people modifying content_navigation after it's initial creation: + * - id: A "preferred" id, most skins are best off outputting this preferred + * id for best compatibility. + * - tooltiponly: This is set to true for some tabs in cases where the system + * believes that the accesskey should not be added to the tab. + * + * @return array + */ + protected function buildContentNavigationUrls() { + global $wgDisableLangConversion; + + wfProfileIn( __METHOD__ ); + + // Display tabs for the relevant title rather than always the title itself + $title = $this->getRelevantTitle(); + $onPage = $title->equals( $this->getTitle() ); + + $out = $this->getOutput(); + $request = $this->getRequest(); + $user = $this->getUser(); + + $content_navigation = array( + 'namespaces' => array(), + 'views' => array(), + 'actions' => array(), + 'variants' => array() + ); + + // parameters + $action = $request->getVal( 'action', 'view' ); + + $userCanRead = $title->quickUserCan( 'read', $user ); + + $preventActiveTabs = false; + wfRunHooks( 'SkinTemplatePreventOtherActiveTabs', array( &$this, &$preventActiveTabs ) ); + + // Checks if page is some kind of content + if ( $title->canExist() ) { + // Gets page objects for the related namespaces + $subjectPage = $title->getSubjectPage(); + $talkPage = $title->getTalkPage(); + + // Determines if this is a talk page + $isTalk = $title->isTalkPage(); + + // Generates XML IDs from namespace names + $subjectId = $title->getNamespaceKey( '' ); + + if ( $subjectId == 'main' ) { + $talkId = 'talk'; + } else { + $talkId = "{$subjectId}_talk"; + } + + $skname = $this->skinname; + + // Adds namespace links + $subjectMsg = array( "nstab-$subjectId" ); + if ( $subjectPage->isMainPage() ) { + array_unshift( $subjectMsg, 'mainpage-nstab' ); + } + $content_navigation['namespaces'][$subjectId] = $this->tabAction( + $subjectPage, $subjectMsg, !$isTalk && !$preventActiveTabs, '', $userCanRead + ); + $content_navigation['namespaces'][$subjectId]['context'] = 'subject'; + $content_navigation['namespaces'][$talkId] = $this->tabAction( + $talkPage, array( "nstab-$talkId", 'talk' ), $isTalk && !$preventActiveTabs, '', $userCanRead + ); + $content_navigation['namespaces'][$talkId]['context'] = 'talk'; + + if ( $userCanRead ) { + $isForeignFile = $title->inNamespace( NS_FILE ) && $this->canUseWikiPage() && + $this->getWikiPage() instanceof WikiFilePage && !$this->getWikiPage()->isLocal(); + + // Adds view view link + if ( $title->exists() || $isForeignFile ) { + $content_navigation['views']['view'] = $this->tabAction( + $isTalk ? $talkPage : $subjectPage, + array( "$skname-view-view", 'view' ), + ( $onPage && ( $action == 'view' || $action == 'purge' ) ), '', true + ); + // signal to hide this from simple content_actions + $content_navigation['views']['view']['redundant'] = true; + } + + // If it is a non-local file, show a link to the file in its own repository + if ( $isForeignFile ) { + $file = $this->getWikiPage()->getFile(); + $content_navigation['views']['view-foreign'] = array( + 'class' => '', + 'text' => wfMessageFallback( "$skname-view-foreign", 'view-foreign' )-> + setContext( $this->getContext() )-> + params( $file->getRepo()->getDisplayName() )->text(), + 'href' => $file->getDescriptionUrl(), + 'primary' => false, + ); + } + + wfProfileIn( __METHOD__ . '-edit' ); + + // Checks if user can edit the current page if it exists or create it otherwise + if ( $title->quickUserCan( 'edit', $user ) + && ( $title->exists() || $title->quickUserCan( 'create', $user ) ) + ) { + // Builds CSS class for talk page links + $isTalkClass = $isTalk ? ' istalk' : ''; + // Whether the user is editing the page + $isEditing = $onPage && ( $action == 'edit' || $action == 'submit' ); + // Whether to show the "Add a new section" tab + // Checks if this is a current rev of talk page and is not forced to be hidden + $showNewSection = !$out->forceHideNewSectionLink() + && ( ( $isTalk && $this->isRevisionCurrent() ) || $out->showNewSectionLink() ); + $section = $request->getVal( 'section' ); + + if ( $title->exists() + || ( $title->getNamespace() == NS_MEDIAWIKI + && $title->getDefaultMessageText() !== false + ) + ) { + $msgKey = $isForeignFile ? 'edit-local' : 'edit'; + } else { + $msgKey = $isForeignFile ? 'create-local' : 'create'; + } + $content_navigation['views']['edit'] = array( + 'class' => ( $isEditing && ( $section !== 'new' || !$showNewSection ) + ? 'selected' + : '' + ) . $isTalkClass, + 'text' => wfMessageFallback( "$skname-view-$msgKey", $msgKey ) + ->setContext( $this->getContext() )->text(), + 'href' => $title->getLocalURL( $this->editUrlOptions() ), + 'primary' => !$isForeignFile, // don't collapse this in vector + ); + + // section link + if ( $showNewSection ) { + // Adds new section link + //$content_navigation['actions']['addsection'] + $content_navigation['views']['addsection'] = array( + 'class' => ( $isEditing && $section == 'new' ) ? 'selected' : false, + 'text' => wfMessageFallback( "$skname-action-addsection", 'addsection' ) + ->setContext( $this->getContext() )->text(), + 'href' => $title->getLocalURL( 'action=edit§ion=new' ) + ); + } + // Checks if the page has some kind of viewable content + } elseif ( $title->hasSourceText() ) { + // Adds view source view link + $content_navigation['views']['viewsource'] = array( + 'class' => ( $onPage && $action == 'edit' ) ? 'selected' : false, + 'text' => wfMessageFallback( "$skname-action-viewsource", 'viewsource' ) + ->setContext( $this->getContext() )->text(), + 'href' => $title->getLocalURL( $this->editUrlOptions() ), + 'primary' => true, // don't collapse this in vector + ); + } + wfProfileOut( __METHOD__ . '-edit' ); + + wfProfileIn( __METHOD__ . '-live' ); + // Checks if the page exists + if ( $title->exists() ) { + // Adds history view link + $content_navigation['views']['history'] = array( + 'class' => ( $onPage && $action == 'history' ) ? 'selected' : false, + 'text' => wfMessageFallback( "$skname-view-history", 'history_short' ) + ->setContext( $this->getContext() )->text(), + 'href' => $title->getLocalURL( 'action=history' ), + 'rel' => 'archives', + ); + + if ( $title->quickUserCan( 'delete', $user ) ) { + $content_navigation['actions']['delete'] = array( + 'class' => ( $onPage && $action == 'delete' ) ? 'selected' : false, + 'text' => wfMessageFallback( "$skname-action-delete", 'delete' ) + ->setContext( $this->getContext() )->text(), + 'href' => $title->getLocalURL( 'action=delete' ) + ); + } + + if ( $title->quickUserCan( 'move', $user ) ) { + $moveTitle = SpecialPage::getTitleFor( 'Movepage', $title->getPrefixedDBkey() ); + $content_navigation['actions']['move'] = array( + 'class' => $this->getTitle()->isSpecial( 'Movepage' ) ? 'selected' : false, + 'text' => wfMessageFallback( "$skname-action-move", 'move' ) + ->setContext( $this->getContext() )->text(), + 'href' => $moveTitle->getLocalURL() + ); + } + } else { + // article doesn't exist or is deleted + if ( $user->isAllowed( 'deletedhistory' ) ) { + $n = $title->isDeleted(); + if ( $n ) { + $undelTitle = SpecialPage::getTitleFor( 'Undelete' ); + // If the user can't undelete but can view deleted + // history show them a "View .. deleted" tab instead. + $msgKey = $user->isAllowed( 'undelete' ) ? 'undelete' : 'viewdeleted'; + $content_navigation['actions']['undelete'] = array( + 'class' => $this->getTitle()->isSpecial( 'Undelete' ) ? 'selected' : false, + 'text' => wfMessageFallback( "$skname-action-$msgKey", "{$msgKey}_short" ) + ->setContext( $this->getContext() )->numParams( $n )->text(), + 'href' => $undelTitle->getLocalURL( array( 'target' => $title->getPrefixedDBkey() ) ) + ); + } + } + } + + if ( $title->quickUserCan( 'protect', $user ) && $title->getRestrictionTypes() && + MWNamespace::getRestrictionLevels( $title->getNamespace(), $user ) !== array( '' ) + ) { + $mode = $title->isProtected() ? 'unprotect' : 'protect'; + $content_navigation['actions'][$mode] = array( + 'class' => ( $onPage && $action == $mode ) ? 'selected' : false, + 'text' => wfMessageFallback( "$skname-action-$mode", $mode ) + ->setContext( $this->getContext() )->text(), + 'href' => $title->getLocalURL( "action=$mode" ) + ); + } + + wfProfileOut( __METHOD__ . '-live' ); + + // Checks if the user is logged in + if ( $this->loggedin && $user->isAllowedAll( 'viewmywatchlist', 'editmywatchlist' ) ) { + /** + * The following actions use messages which, if made particular to + * the any specific skins, would break the Ajax code which makes this + * action happen entirely inline. OutputPage::getJSVars + * defines a set of messages in a javascript object - and these + * messages are assumed to be global for all skins. Without making + * a change to that procedure these messages will have to remain as + * the global versions. + */ + $mode = $user->isWatched( $title ) ? 'unwatch' : 'watch'; + $token = WatchAction::getWatchToken( $title, $user, $mode ); + $content_navigation['actions'][$mode] = array( + 'class' => $onPage && ( $action == 'watch' || $action == 'unwatch' ) ? 'selected' : false, + // uses 'watch' or 'unwatch' message + 'text' => $this->msg( $mode )->text(), + 'href' => $title->getLocalURL( array( 'action' => $mode, 'token' => $token ) ) + ); + } + } + + wfRunHooks( 'SkinTemplateNavigation', array( &$this, &$content_navigation ) ); + + if ( $userCanRead && !$wgDisableLangConversion ) { + $pageLang = $title->getPageLanguage(); + // Gets list of language variants + $variants = $pageLang->getVariants(); + // Checks that language conversion is enabled and variants exist + // And if it is not in the special namespace + if ( count( $variants ) > 1 ) { + // Gets preferred variant (note that user preference is + // only possible for wiki content language variant) + $preferred = $pageLang->getPreferredVariant(); + if ( Action::getActionName( $this ) === 'view' ) { + $params = $request->getQueryValues(); + unset( $params['title'] ); + } else { + $params = array(); + } + // Loops over each variant + foreach ( $variants as $code ) { + // Gets variant name from language code + $varname = $pageLang->getVariantname( $code ); + // Appends variant link + $content_navigation['variants'][] = array( + 'class' => ( $code == $preferred ) ? 'selected' : false, + 'text' => $varname, + 'href' => $title->getLocalURL( array( 'variant' => $code ) + $params ), + 'lang' => wfBCP47( $code ), + 'hreflang' => wfBCP47( $code ), + ); + } + } + } + } else { + // If it's not content, it's got to be a special page + $content_navigation['namespaces']['special'] = array( + 'class' => 'selected', + 'text' => $this->msg( 'nstab-special' )->text(), + 'href' => $request->getRequestURL(), // @see: bug 2457, bug 2510 + 'context' => 'subject' + ); + + wfRunHooks( 'SkinTemplateNavigation::SpecialPage', + array( &$this, &$content_navigation ) ); + } + + // Equiv to SkinTemplateContentActions + wfRunHooks( 'SkinTemplateNavigation::Universal', array( &$this, &$content_navigation ) ); + + // Setup xml ids and tooltip info + foreach ( $content_navigation as $section => &$links ) { + foreach ( $links as $key => &$link ) { + $xmlID = $key; + if ( isset( $link['context'] ) && $link['context'] == 'subject' ) { + $xmlID = 'ca-nstab-' . $xmlID; + } elseif ( isset( $link['context'] ) && $link['context'] == 'talk' ) { + $xmlID = 'ca-talk'; + } elseif ( $section == 'variants' ) { + $xmlID = 'ca-varlang-' . $xmlID; + } else { + $xmlID = 'ca-' . $xmlID; + } + $link['id'] = $xmlID; + } + } + + # We don't want to give the watch tab an accesskey if the + # page is being edited, because that conflicts with the + # accesskey on the watch checkbox. We also don't want to + # give the edit tab an accesskey, because that's fairly + # superfluous and conflicts with an accesskey (Ctrl-E) often + # used for editing in Safari. + if ( in_array( $action, array( 'edit', 'submit' ) ) ) { + if ( isset( $content_navigation['views']['edit'] ) ) { + $content_navigation['views']['edit']['tooltiponly'] = true; + } + if ( isset( $content_navigation['actions']['watch'] ) ) { + $content_navigation['actions']['watch']['tooltiponly'] = true; + } + if ( isset( $content_navigation['actions']['unwatch'] ) ) { + $content_navigation['actions']['unwatch']['tooltiponly'] = true; + } + } + + wfProfileOut( __METHOD__ ); + + return $content_navigation; + } + + /** + * an array of edit links by default used for the tabs + * @param array $content_navigation + * @return array + */ + private function buildContentActionUrls( $content_navigation ) { + + wfProfileIn( __METHOD__ ); + + // content_actions has been replaced with content_navigation for backwards + // compatibility and also for skins that just want simple tabs content_actions + // is now built by flattening the content_navigation arrays into one + + $content_actions = array(); + + foreach ( $content_navigation as $links ) { + foreach ( $links as $key => $value ) { + if ( isset( $value['redundant'] ) && $value['redundant'] ) { + // Redundant tabs are dropped from content_actions + continue; + } + + // content_actions used to have ids built using the "ca-$key" pattern + // so the xmlID based id is much closer to the actual $key that we want + // for that reason we'll just strip out the ca- if present and use + // the latter potion of the "id" as the $key + if ( isset( $value['id'] ) && substr( $value['id'], 0, 3 ) == 'ca-' ) { + $key = substr( $value['id'], 3 ); + } + + if ( isset( $content_actions[$key] ) ) { + wfDebug( __METHOD__ . ": Found a duplicate key for $key while flattening " . + "content_navigation into content_actions.\n" ); + continue; + } + + $content_actions[$key] = $value; + } + } + + wfProfileOut( __METHOD__ ); + + return $content_actions; + } + + /** + * build array of common navigation links + * @return array + */ + protected function buildNavUrls() { + global $wgUploadNavigationUrl; + + wfProfileIn( __METHOD__ ); + + $out = $this->getOutput(); + $request = $this->getRequest(); + + $nav_urls = array(); + $nav_urls['mainpage'] = array( 'href' => self::makeMainPageUrl() ); + if ( $wgUploadNavigationUrl ) { + $nav_urls['upload'] = array( 'href' => $wgUploadNavigationUrl ); + } elseif ( UploadBase::isEnabled() && UploadBase::isAllowed( $this->getUser() ) === true ) { + $nav_urls['upload'] = array( 'href' => self::makeSpecialUrl( 'Upload' ) ); + } else { + $nav_urls['upload'] = false; + } + $nav_urls['specialpages'] = array( 'href' => self::makeSpecialUrl( 'Specialpages' ) ); + + $nav_urls['print'] = false; + $nav_urls['permalink'] = false; + $nav_urls['info'] = false; + $nav_urls['whatlinkshere'] = false; + $nav_urls['recentchangeslinked'] = false; + $nav_urls['contributions'] = false; + $nav_urls['log'] = false; + $nav_urls['blockip'] = false; + $nav_urls['emailuser'] = false; + $nav_urls['userrights'] = false; + + // A print stylesheet is attached to all pages, but nobody ever + // figures that out. :) Add a link... + if ( !$out->isPrintable() && ( $out->isArticle() || $this->getTitle()->isSpecialPage() ) ) { + $nav_urls['print'] = array( + 'text' => $this->msg( 'printableversion' )->text(), + 'href' => $this->getTitle()->getLocalURL( + $request->appendQueryValue( 'printable', 'yes', true ) ) + ); + } + + if ( $out->isArticle() ) { + // Also add a "permalink" while we're at it + $revid = $this->getRevisionId(); + if ( $revid ) { + $nav_urls['permalink'] = array( + 'text' => $this->msg( 'permalink' )->text(), + 'href' => $this->getTitle()->getLocalURL( "oldid=$revid" ) + ); + } + + // Use the copy of revision ID in case this undocumented, shady hook tries to mess with internals + wfRunHooks( 'SkinTemplateBuildNavUrlsNav_urlsAfterPermalink', + array( &$this, &$nav_urls, &$revid, &$revid ) ); + } + + if ( $out->isArticleRelated() ) { + $nav_urls['whatlinkshere'] = array( + 'href' => SpecialPage::getTitleFor( 'Whatlinkshere', $this->thispage )->getLocalURL() + ); + + $nav_urls['info'] = array( + 'text' => $this->msg( 'pageinfo-toolboxlink' )->text(), + 'href' => $this->getTitle()->getLocalURL( "action=info" ) + ); + + if ( $this->getTitle()->getArticleID() ) { + $nav_urls['recentchangeslinked'] = array( + 'href' => SpecialPage::getTitleFor( 'Recentchangeslinked', $this->thispage )->getLocalURL() + ); + } + } + + $user = $this->getRelevantUser(); + if ( $user ) { + $rootUser = $user->getName(); + + $nav_urls['contributions'] = array( + 'text' => $this->msg( 'contributions', $rootUser )->text(), + 'href' => self::makeSpecialUrlSubpage( 'Contributions', $rootUser ) + ); + + $nav_urls['log'] = array( + 'href' => self::makeSpecialUrlSubpage( 'Log', $rootUser ) + ); + + if ( $this->getUser()->isAllowed( 'block' ) ) { + $nav_urls['blockip'] = array( + 'text' => $this->msg( 'blockip', $rootUser )->text(), + 'href' => self::makeSpecialUrlSubpage( 'Block', $rootUser ) + ); + } + + if ( $this->showEmailUser( $user ) ) { + $nav_urls['emailuser'] = array( + 'href' => self::makeSpecialUrlSubpage( 'Emailuser', $rootUser ) + ); + } + + if ( !$user->isAnon() ) { + $sur = new UserrightsPage; + $sur->setContext( $this->getContext() ); + if ( $sur->userCanExecute( $this->getUser() ) ) { + $nav_urls['userrights'] = array( + 'href' => self::makeSpecialUrlSubpage( 'Userrights', $rootUser ) + ); + } + } + } + + wfProfileOut( __METHOD__ ); + return $nav_urls; + } + + /** + * Generate strings used for xml 'id' names + * @return string + */ + protected function getNameSpaceKey() { + return $this->getTitle()->getNamespaceKey(); + } +} + +/** + * Generic wrapper for template functions, with interface + * compatible with what we use of PHPTAL 0.7. + * @ingroup Skins + */ +abstract class QuickTemplate { + + /** @var Config $config */ + protected $config; + /** + * @var Config $config + */ + function __construct( Config $config = null ) { + $this->data = array(); + $this->translator = new MediaWikiI18N(); + if ( $config === null ) { + wfDebug( __METHOD__ . ' was called with no Config instance passed to it' ); + $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' ); + } + $this->config = $config; + } + + /** + * Sets the value $value to $name + * @param string $name + * @param mixed $value + */ + public function set( $name, $value ) { + $this->data[$name] = $value; + } + + /** + * Gets the template data requested + * @since 1.22 + * @param string $name Key for the data + * @param mixed $default Optional default (or null) + * @return mixed The value of the data requested or the deafult + */ + public function get( $name, $default = null ) { + if ( isset( $this->data[$name] ) ) { + return $this->data[$name]; + } else { + return $default; + } + } + + /** + * @param string $name + * @param mixed $value + */ + public function setRef( $name, &$value ) { + $this->data[$name] =& $value; + } + + /** + * @param MediaWikiI18N $t + */ + public function setTranslator( &$t ) { + $this->translator = &$t; + } + + /** + * Main function, used by classes that subclass QuickTemplate + * to show the actual HTML output + */ + abstract public function execute(); + + /** + * @private + * @param string $str + * @return string + */ + function text( $str ) { + echo htmlspecialchars( $this->data[$str] ); + } + + /** + * @private + * @param string $str + * @return string + */ + function html( $str ) { + echo $this->data[$str]; + } + + /** + * @private + * @param string $str + * @return string + */ + function msg( $str ) { + echo htmlspecialchars( $this->translator->translate( $str ) ); + } + + /** + * @private + * @param string $str + * @return string + */ + function msgHtml( $str ) { + echo $this->translator->translate( $str ); + } + + /** + * An ugly, ugly hack. + * @private + * @param string $str + * @return string + */ + function msgWiki( $str ) { + global $wgOut; + + $text = $this->translator->translate( $str ); + echo $wgOut->parse( $text ); + } + + /** + * @private + * @param string $str + * @return bool + */ + function haveData( $str ) { + return isset( $this->data[$str] ); + } + + /** + * @private + * + * @param string $str + * @return bool + */ + function haveMsg( $str ) { + $msg = $this->translator->translate( $str ); + return ( $msg != '-' ) && ( $msg != '' ); # ???? + } + + /** + * Get the Skin object related to this object + * + * @return Skin + */ + public function getSkin() { + return $this->data['skin']; + } + + /** + * Fetch the output of a QuickTemplate and return it + * + * @since 1.23 + * @return string + */ + public function getHTML() { + ob_start(); + $this->execute(); + $html = ob_get_contents(); + ob_end_clean(); + return $html; + } +} + +/** + * New base template for a skin's template extended from QuickTemplate + * this class features helper methods that provide common ways of interacting + * with the data stored in the QuickTemplate + */ +abstract class BaseTemplate extends QuickTemplate { + + /** + * Get a Message object with its context set + * + * @param string $name Message name + * @return Message + */ + public function getMsg( $name ) { + return $this->getSkin()->msg( $name ); + } + + function msg( $str ) { + echo $this->getMsg( $str )->escaped(); + } + + function msgHtml( $str ) { + echo $this->getMsg( $str )->text(); + } + + function msgWiki( $str ) { + echo $this->getMsg( $str )->parseAsBlock(); + } + + /** + * Create an array of common toolbox items from the data in the quicktemplate + * stored by SkinTemplate. + * The resulting array is built according to a format intended to be passed + * through makeListItem to generate the html. + * @return array + */ + function getToolbox() { + wfProfileIn( __METHOD__ ); + + $toolbox = array(); + if ( isset( $this->data['nav_urls']['whatlinkshere'] ) + && $this->data['nav_urls']['whatlinkshere'] + ) { + $toolbox['whatlinkshere'] = $this->data['nav_urls']['whatlinkshere']; + $toolbox['whatlinkshere']['id'] = 't-whatlinkshere'; + } + if ( isset( $this->data['nav_urls']['recentchangeslinked'] ) + && $this->data['nav_urls']['recentchangeslinked'] + ) { + $toolbox['recentchangeslinked'] = $this->data['nav_urls']['recentchangeslinked']; + $toolbox['recentchangeslinked']['msg'] = 'recentchangeslinked-toolbox'; + $toolbox['recentchangeslinked']['id'] = 't-recentchangeslinked'; + } + if ( isset( $this->data['feeds'] ) && $this->data['feeds'] ) { + $toolbox['feeds']['id'] = 'feedlinks'; + $toolbox['feeds']['links'] = array(); + foreach ( $this->data['feeds'] as $key => $feed ) { + $toolbox['feeds']['links'][$key] = $feed; + $toolbox['feeds']['links'][$key]['id'] = "feed-$key"; + $toolbox['feeds']['links'][$key]['rel'] = 'alternate'; + $toolbox['feeds']['links'][$key]['type'] = "application/{$key}+xml"; + $toolbox['feeds']['links'][$key]['class'] = 'feedlink'; + } + } + foreach ( array( 'contributions', 'log', 'blockip', 'emailuser', + 'userrights', 'upload', 'specialpages' ) as $special + ) { + if ( isset( $this->data['nav_urls'][$special] ) && $this->data['nav_urls'][$special] ) { + $toolbox[$special] = $this->data['nav_urls'][$special]; + $toolbox[$special]['id'] = "t-$special"; + } + } + if ( isset( $this->data['nav_urls']['print'] ) && $this->data['nav_urls']['print'] ) { + $toolbox['print'] = $this->data['nav_urls']['print']; + $toolbox['print']['id'] = 't-print'; + $toolbox['print']['rel'] = 'alternate'; + $toolbox['print']['msg'] = 'printableversion'; + } + if ( isset( $this->data['nav_urls']['permalink'] ) && $this->data['nav_urls']['permalink'] ) { + $toolbox['permalink'] = $this->data['nav_urls']['permalink']; + if ( $toolbox['permalink']['href'] === '' ) { + unset( $toolbox['permalink']['href'] ); + $toolbox['ispermalink']['tooltiponly'] = true; + $toolbox['ispermalink']['id'] = 't-ispermalink'; + $toolbox['ispermalink']['msg'] = 'permalink'; + } else { + $toolbox['permalink']['id'] = 't-permalink'; + } + } + if ( isset( $this->data['nav_urls']['info'] ) && $this->data['nav_urls']['info'] ) { + $toolbox['info'] = $this->data['nav_urls']['info']; + $toolbox['info']['id'] = 't-info'; + } + + wfRunHooks( 'BaseTemplateToolbox', array( &$this, &$toolbox ) ); + wfProfileOut( __METHOD__ ); + return $toolbox; + } + + /** + * Create an array of personal tools items from the data in the quicktemplate + * stored by SkinTemplate. + * The resulting array is built according to a format intended to be passed + * through makeListItem to generate the html. + * This is in reality the same list as already stored in personal_urls + * however it is reformatted so that you can just pass the individual items + * to makeListItem instead of hardcoding the element creation boilerplate. + * @return array + */ + function getPersonalTools() { + $personal_tools = array(); + foreach ( $this->get( 'personal_urls' ) as $key => $plink ) { + # The class on a personal_urls item is meant to go on the instead + # of the
  • so we have to use a single item "links" array instead + # of using most of the personal_url's keys directly. + $ptool = array( + 'links' => array( + array( 'single-id' => "pt-$key" ), + ), + 'id' => "pt-$key", + ); + if ( isset( $plink['active'] ) ) { + $ptool['active'] = $plink['active']; + } + foreach ( array( 'href', 'class', 'text', 'dir' ) as $k ) { + if ( isset( $plink[$k] ) ) { + $ptool['links'][0][$k] = $plink[$k]; + } + } + $personal_tools[$key] = $ptool; + } + return $personal_tools; + } + + function getSidebar( $options = array() ) { + // Force the rendering of the following portals + $sidebar = $this->data['sidebar']; + if ( !isset( $sidebar['SEARCH'] ) ) { + $sidebar['SEARCH'] = true; + } + if ( !isset( $sidebar['TOOLBOX'] ) ) { + $sidebar['TOOLBOX'] = true; + } + if ( !isset( $sidebar['LANGUAGES'] ) ) { + $sidebar['LANGUAGES'] = true; + } + + if ( !isset( $options['search'] ) || $options['search'] !== true ) { + unset( $sidebar['SEARCH'] ); + } + if ( isset( $options['toolbox'] ) && $options['toolbox'] === false ) { + unset( $sidebar['TOOLBOX'] ); + } + if ( isset( $options['languages'] ) && $options['languages'] === false ) { + unset( $sidebar['LANGUAGES'] ); + } + + $boxes = array(); + foreach ( $sidebar as $boxName => $content ) { + if ( $content === false ) { + continue; + } + switch ( $boxName ) { + case 'SEARCH': + // Search is a special case, skins should custom implement this + $boxes[$boxName] = array( + 'id' => 'p-search', + 'header' => $this->getMsg( 'search' )->text(), + 'generated' => false, + 'content' => true, + ); + break; + case 'TOOLBOX': + $msgObj = $this->getMsg( 'toolbox' ); + $boxes[$boxName] = array( + 'id' => 'p-tb', + 'header' => $msgObj->exists() ? $msgObj->text() : 'toolbox', + 'generated' => false, + 'content' => $this->getToolbox(), + ); + break; + case 'LANGUAGES': + if ( $this->data['language_urls'] ) { + $msgObj = $this->getMsg( 'otherlanguages' ); + $boxes[$boxName] = array( + 'id' => 'p-lang', + 'header' => $msgObj->exists() ? $msgObj->text() : 'otherlanguages', + 'generated' => false, + 'content' => $this->data['language_urls'], + ); + } + break; + default: + $msgObj = $this->getMsg( $boxName ); + $boxes[$boxName] = array( + 'id' => "p-$boxName", + 'header' => $msgObj->exists() ? $msgObj->text() : $boxName, + 'generated' => true, + 'content' => $content, + ); + break; + } + } + + // HACK: Compatibility with extensions still using SkinTemplateToolboxEnd + $hookContents = null; + if ( isset( $boxes['TOOLBOX'] ) ) { + ob_start(); + // We pass an extra 'true' at the end so extensions using BaseTemplateToolbox + // can abort and avoid outputting double toolbox links + wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this, true ) ); + $hookContents = ob_get_contents(); + ob_end_clean(); + if ( !trim( $hookContents ) ) { + $hookContents = null; + } + } + // END hack + + if ( isset( $options['htmlOnly'] ) && $options['htmlOnly'] === true ) { + foreach ( $boxes as $boxName => $box ) { + if ( is_array( $box['content'] ) ) { + $content = '
      '; + foreach ( $box['content'] as $key => $val ) { + $content .= "\n " . $this->makeListItem( $key, $val ); + } + // HACK, shove the toolbox end onto the toolbox if we're rendering itself + if ( $hookContents ) { + $content .= "\n $hookContents"; + } + // END hack + $content .= "\n
    \n"; + $boxes[$boxName]['content'] = $content; + } + } + } else { + if ( $hookContents ) { + $boxes['TOOLBOXEND'] = array( + 'id' => 'p-toolboxend', + 'header' => $boxes['TOOLBOX']['header'], + 'generated' => false, + 'content' => "
      {$hookContents}
    ", + ); + // HACK: Make sure that TOOLBOXEND is sorted next to TOOLBOX + $boxes2 = array(); + foreach ( $boxes as $key => $box ) { + if ( $key === 'TOOLBOXEND' ) { + continue; + } + $boxes2[$key] = $box; + if ( $key === 'TOOLBOX' ) { + $boxes2['TOOLBOXEND'] = $boxes['TOOLBOXEND']; + } + } + $boxes = $boxes2; + // END hack + } + } + + return $boxes; + } + + /** + * @param string $name + */ + protected function renderAfterPortlet( $name ) { + $content = ''; + wfRunHooks( 'BaseTemplateAfterPortlet', array( $this, $name, &$content ) ); + + if ( $content !== '' ) { + echo "
    $content
    "; + } + + } + + /** + * Makes a link, usually used by makeListItem to generate a link for an item + * in a list used in navigation lists, portlets, portals, sidebars, etc... + * + * @param string $key Usually a key from the list you are generating this + * link from. + * @param array $item Contains some of a specific set of keys. + * + * The text of the link will be generated either from the contents of the + * "text" key in the $item array, if a "msg" key is present a message by + * that name will be used, and if neither of those are set the $key will be + * used as a message name. + * + * If a "href" key is not present makeLink will just output htmlescaped text. + * The "href", "id", "class", "rel", and "type" keys are used as attributes + * for the link if present. + * + * If an "id" or "single-id" (if you don't want the actual id to be output + * on the link) is present it will be used to generate a tooltip and + * accesskey for the link. + * + * The keys "context" and "primary" are ignored; these keys are used + * internally by skins and are not supposed to be included in the HTML + * output. + * + * If you don't want an accesskey, set $item['tooltiponly'] = true; + * + * @param array $options Can be used to affect the output of a link. + * Possible options are: + * - 'text-wrapper' key to specify a list of elements to wrap the text of + * a link in. This should be an array of arrays containing a 'tag' and + * optionally an 'attributes' key. If you only have one element you don't + * need to wrap it in another array. eg: To use
    ... + * in all links use array( 'text-wrapper' => array( 'tag' => 'span' ) ) + * for your options. + * - 'link-class' key can be used to specify additional classes to apply + * to all links. + * - 'link-fallback' can be used to specify a tag to use instead of "" + * if there is no link. eg: If you specify 'link-fallback' => 'span' than + * any non-link will output a "" instead of just text. + * + * @return string + */ + function makeLink( $key, $item, $options = array() ) { + if ( isset( $item['text'] ) ) { + $text = $item['text']; + } else { + $text = $this->translator->translate( isset( $item['msg'] ) ? $item['msg'] : $key ); + } + + $html = htmlspecialchars( $text ); + + if ( isset( $options['text-wrapper'] ) ) { + $wrapper = $options['text-wrapper']; + if ( isset( $wrapper['tag'] ) ) { + $wrapper = array( $wrapper ); + } + while ( count( $wrapper ) > 0 ) { + $element = array_pop( $wrapper ); + $html = Html::rawElement( $element['tag'], isset( $element['attributes'] ) + ? $element['attributes'] + : null, $html ); + } + } + + if ( isset( $item['href'] ) || isset( $options['link-fallback'] ) ) { + $attrs = $item; + foreach ( array( 'single-id', 'text', 'msg', 'tooltiponly', 'context', 'primary' ) as $k ) { + unset( $attrs[$k] ); + } + + if ( isset( $item['id'] ) && !isset( $item['single-id'] ) ) { + $item['single-id'] = $item['id']; + } + if ( isset( $item['single-id'] ) ) { + if ( isset( $item['tooltiponly'] ) && $item['tooltiponly'] ) { + $title = Linker::titleAttrib( $item['single-id'] ); + if ( $title !== false ) { + $attrs['title'] = $title; + } + } else { + $tip = Linker::tooltipAndAccesskeyAttribs( $item['single-id'] ); + if ( isset( $tip['title'] ) && $tip['title'] !== false ) { + $attrs['title'] = $tip['title']; + } + if ( isset( $tip['accesskey'] ) && $tip['accesskey'] !== false ) { + $attrs['accesskey'] = $tip['accesskey']; + } + } + } + if ( isset( $options['link-class'] ) ) { + if ( isset( $attrs['class'] ) ) { + $attrs['class'] .= " {$options['link-class']}"; + } else { + $attrs['class'] = $options['link-class']; + } + } + $html = Html::rawElement( isset( $attrs['href'] ) + ? 'a' + : $options['link-fallback'], $attrs, $html ); + } + + return $html; + } + + /** + * Generates a list item for a navigation, portlet, portal, sidebar... list + * + * @param string $key Usually a key from the list you are generating this link from. + * @param array $item Array of list item data containing some of a specific set of keys. + * The "id", "class" and "itemtitle" keys will be used as attributes for the list item, + * if "active" contains a value of true a "active" class will also be appended to class. + * + * @param array $options + * + * If you want something other than a "
  • " you can pass a tag name such as + * "tag" => "span" in the $options array to change the tag used. + * link/content data for the list item may come in one of two forms + * A "links" key may be used, in which case it should contain an array with + * a list of links to include inside the list item, see makeLink for the + * format of individual links array items. + * + * Otherwise the relevant keys from the list item $item array will be passed + * to makeLink instead. Note however that "id" and "class" are used by the + * list item directly so they will not be passed to makeLink + * (however the link will still support a tooltip and accesskey from it) + * If you need an id or class on a single link you should include a "links" + * array with just one link item inside of it. If you want to add a title + * to the list item itself, you can set "itemtitle" to the value. + * $options is also passed on to makeLink calls + * + * @return string + */ + function makeListItem( $key, $item, $options = array() ) { + if ( isset( $item['links'] ) ) { + $links = array(); + foreach ( $item['links'] as $linkKey => $link ) { + $links[] = $this->makeLink( $linkKey, $link, $options ); + } + $html = implode( ' ', $links ); + } else { + $link = $item; + // These keys are used by makeListItem and shouldn't be passed on to the link + foreach ( array( 'id', 'class', 'active', 'tag', 'itemtitle' ) as $k ) { + unset( $link[$k] ); + } + if ( isset( $item['id'] ) && !isset( $item['single-id'] ) ) { + // The id goes on the
  • not on the for single links + // but makeSidebarLink still needs to know what id to use when + // generating tooltips and accesskeys. + $link['single-id'] = $item['id']; + } + $html = $this->makeLink( $key, $link, $options ); + } + + $attrs = array(); + foreach ( array( 'id', 'class' ) as $attr ) { + if ( isset( $item[$attr] ) ) { + $attrs[$attr] = $item[$attr]; + } + } + if ( isset( $item['active'] ) && $item['active'] ) { + if ( !isset( $attrs['class'] ) ) { + $attrs['class'] = ''; + } + $attrs['class'] .= ' active'; + $attrs['class'] = trim( $attrs['class'] ); + } + if ( isset( $item['itemtitle'] ) ) { + $attrs['title'] = $item['itemtitle']; + } + return Html::rawElement( isset( $options['tag'] ) ? $options['tag'] : 'li', $attrs, $html ); + } + + function makeSearchInput( $attrs = array() ) { + $realAttrs = array( + 'type' => 'search', + 'name' => 'search', + 'placeholder' => wfMessage( 'searchsuggest-search' )->text(), + 'value' => $this->get( 'search', '' ), + ); + $realAttrs = array_merge( $realAttrs, Linker::tooltipAndAccesskeyAttribs( 'search' ), $attrs ); + return Html::element( 'input', $realAttrs ); + } + + function makeSearchButton( $mode, $attrs = array() ) { + switch ( $mode ) { + case 'go': + case 'fulltext': + $realAttrs = array( + 'type' => 'submit', + 'name' => $mode, + 'value' => $this->translator->translate( + $mode == 'go' ? 'searcharticle' : 'searchbutton' ), + ); + $realAttrs = array_merge( + $realAttrs, + Linker::tooltipAndAccesskeyAttribs( "search-$mode" ), + $attrs + ); + return Html::element( 'input', $realAttrs ); + case 'image': + $buttonAttrs = array( + 'type' => 'submit', + 'name' => 'button', + ); + $buttonAttrs = array_merge( + $buttonAttrs, + Linker::tooltipAndAccesskeyAttribs( 'search-fulltext' ), + $attrs + ); + unset( $buttonAttrs['src'] ); + unset( $buttonAttrs['alt'] ); + unset( $buttonAttrs['width'] ); + unset( $buttonAttrs['height'] ); + $imgAttrs = array( + 'src' => $attrs['src'], + 'alt' => isset( $attrs['alt'] ) + ? $attrs['alt'] + : $this->translator->translate( 'searchbutton' ), + 'width' => isset( $attrs['width'] ) ? $attrs['width'] : null, + 'height' => isset( $attrs['height'] ) ? $attrs['height'] : null, + ); + return Html::rawElement( 'button', $buttonAttrs, Html::element( 'img', $imgAttrs ) ); + default: + throw new MWException( 'Unknown mode passed to BaseTemplate::makeSearchButton' ); + } + } + + /** + * Returns an array of footerlinks trimmed down to only those footer links that + * are valid. + * If you pass "flat" as an option then the returned array will be a flat array + * of footer icons instead of a key/value array of footerlinks arrays broken + * up into categories. + * @param string $option + * @return array|mixed + */ + function getFooterLinks( $option = null ) { + $footerlinks = $this->get( 'footerlinks' ); + + // Reduce footer links down to only those which are being used + $validFooterLinks = array(); + foreach ( $footerlinks as $category => $links ) { + $validFooterLinks[$category] = array(); + foreach ( $links as $link ) { + if ( isset( $this->data[$link] ) && $this->data[$link] ) { + $validFooterLinks[$category][] = $link; + } + } + if ( count( $validFooterLinks[$category] ) <= 0 ) { + unset( $validFooterLinks[$category] ); + } + } + + if ( $option == 'flat' ) { + // fold footerlinks into a single array using a bit of trickery + $validFooterLinks = call_user_func_array( + 'array_merge', + array_values( $validFooterLinks ) + ); + } + + return $validFooterLinks; + } + + /** + * Returns an array of footer icons filtered down by options relevant to how + * the skin wishes to display them. + * If you pass "icononly" as the option all footer icons which do not have an + * image icon set will be filtered out. + * If you pass "nocopyright" then MediaWiki's copyright icon will not be included + * in the list of footer icons. This is mostly useful for skins which only + * display the text from footericons instead of the images and don't want a + * duplicate copyright statement because footerlinks already rendered one. + * @param string $option + * @return string + */ + function getFooterIcons( $option = null ) { + // Generate additional footer icons + $footericons = $this->get( 'footericons' ); + + if ( $option == 'icononly' ) { + // Unset any icons which don't have an image + foreach ( $footericons as &$footerIconsBlock ) { + foreach ( $footerIconsBlock as $footerIconKey => $footerIcon ) { + if ( !is_string( $footerIcon ) && !isset( $footerIcon['src'] ) ) { + unset( $footerIconsBlock[$footerIconKey] ); + } + } + } + // Redo removal of any empty blocks + foreach ( $footericons as $footerIconsKey => &$footerIconsBlock ) { + if ( count( $footerIconsBlock ) <= 0 ) { + unset( $footericons[$footerIconsKey] ); + } + } + } elseif ( $option == 'nocopyright' ) { + unset( $footericons['copyright']['copyright'] ); + if ( count( $footericons['copyright'] ) <= 0 ) { + unset( $footericons['copyright'] ); + } + } + + return $footericons; + } + + /** + * Output the basic end-page trail including bottomscripts, reporttime, and + * debug stuff. This should be called right before outputting the closing + * body and html tags. + */ + function printTrail() { ?> +getSkin()->getContext() ); ?> +html( 'bottomscripts' ); /* JS call to runBodyOnloadHook */ ?> +html( 'reporttime' ) ?> +getUser(); # The legend showing what the letters and stuff mean $legend = Html::openElement( 'dl' ) . "\n"; # Iterates through them and gets the messages for both letter and tooltip - $legendItems = $wgRecentChangesFlags; + $legendItems = $context->getConfig()->get( 'RecentChangesFlags' ); if ( !( $user->useRCPatrol() || $user->useNPPatrol() ) ) { unset( $legendItems['unpatrolled'] ); } diff --git a/includes/specialpage/ImageQueryPage.php b/includes/specialpage/ImageQueryPage.php index b0266cbaf7..3ff281f952 100644 --- a/includes/specialpage/ImageQueryPage.php +++ b/includes/specialpage/ImageQueryPage.php @@ -36,7 +36,7 @@ abstract class ImageQueryPage extends QueryPage { * @param OutputPage $out OutputPage to print to * @param Skin $skin User skin to use [unused] * @param DatabaseBase $dbr (read) connection to use - * @param int $res Result pointer + * @param ResultWrapper $res Result pointer * @param int $num Number of available result rows * @param int $offset Paging offset */ diff --git a/includes/specialpage/QueryPage.php b/includes/specialpage/QueryPage.php index b8fc05e5b6..ae0003dc18 100644 --- a/includes/specialpage/QueryPage.php +++ b/includes/specialpage/QueryPage.php @@ -203,8 +203,7 @@ abstract class QueryPage extends SpecialPage { * @return bool */ function isExpensive() { - global $wgDisableQueryPages; - return $wgDisableQueryPages; + return $this->getConfig()->get( 'DisableQueryPages' ); } /** @@ -225,9 +224,7 @@ abstract class QueryPage extends SpecialPage { * @return bool */ function isCached() { - global $wgMiserMode; - - return $this->isExpensive() && $wgMiserMode; + return $this->isExpensive() && $this->getConfig()->get( 'MiserMode' ); } /** @@ -472,8 +469,6 @@ abstract class QueryPage extends SpecialPage { * @param string $par */ function execute( $par ) { - global $wgQueryCacheLimit, $wgDisableQueryPageUpdate; - $user = $this->getUser(); if ( !$this->userCanExecute( $user ) ) { $this->displayRestrictionError(); @@ -508,7 +503,7 @@ abstract class QueryPage extends SpecialPage { # Fetch the timestamp of this update $ts = $this->getCachedTimestamp(); $lang = $this->getLanguage(); - $maxResults = $lang->formatNum( $wgQueryCacheLimit ); + $maxResults = $lang->formatNum( $this->getConfig()->get( 'QueryCacheLimit' ) ); if ( $ts ) { $updated = $lang->userTimeAndDate( $ts, $user ); @@ -523,8 +518,8 @@ abstract class QueryPage extends SpecialPage { # If updates on this page have been disabled, let the user know # that the data set won't be refreshed for now - if ( is_array( $wgDisableQueryPageUpdate ) - && in_array( $this->getName(), $wgDisableQueryPageUpdate ) + if ( is_array( $this->getConfig()->get( 'DisableQueryPageUpdate' ) ) + && in_array( $this->getName(), $this->getConfig()->get( 'DisableQueryPageUpdate' ) ) ) { $out->wrapWikiMsg( "
    \n$1\n
    ", @@ -671,18 +666,17 @@ abstract class QueryPage extends SpecialPage { * @return bool */ function doFeed( $class = '', $limit = 50 ) { - global $wgFeed, $wgFeedClasses, $wgFeedLimit; - - if ( !$wgFeed ) { + if ( !$this->getConfig()->get( 'Feed' ) ) { $this->getOutput()->addWikiMsg( 'feed-unavailable' ); return false; } - $limit = min( $limit, $wgFeedLimit ); + $limit = min( $limit, $this->getConfig()->get( 'FeedLimit' ) ); - if ( isset( $wgFeedClasses[$class] ) ) { + $feedClasses = $this->getConfig()->get( 'FeedClasses' ); + if ( isset( $feedClasses[$class] ) ) { /** @var RSSFeed|AtomFeed $feed */ - $feed = new $wgFeedClasses[$class]( + $feed = new $feedClasses[$class]( $this->feedTitle(), $this->feedDesc(), $this->feedUrl() ); @@ -743,9 +737,10 @@ abstract class QueryPage extends SpecialPage { } function feedTitle() { - global $wgLanguageCode, $wgSitename; $desc = $this->getDescription(); - return "$wgSitename - $desc [$wgLanguageCode]"; + $code = $this->getConfig()->get( 'LanguageCode' ); + $sitename = $this->getConfig()->get( 'Sitename' ); + return "$sitename - $desc [$code]"; } function feedDesc() { diff --git a/includes/specialpage/SpecialPage.php b/includes/specialpage/SpecialPage.php index 0070c74b04..4edd87adba 100644 --- a/includes/specialpage/SpecialPage.php +++ b/includes/specialpage/SpecialPage.php @@ -27,7 +27,6 @@ * Includes some static functions for handling the special page list deprecated * in favor of SpecialPageFactory. * - * @todo Turn this into a real ContextSource * @ingroup SpecialPage */ class SpecialPage { @@ -274,44 +273,20 @@ class SpecialPage { } /** - * If the user is not logged in, throws UserNotLoggedIn error. + * If the user is not logged in, throws UserNotLoggedIn error * - * Default error message includes a link to Special:Userlogin with properly set 'returnto' query - * parameter. + * The user will be redirected to Special:Userlogin with the given message as an error on + * the form. * * @since 1.23 - * @param string|Message $reasonMsg [optional] Passed on to UserNotLoggedIn constructor. Strings - * will be used as message keys. If a string is given, the message will also receive a - * formatted login link (generated using the 'loginreqlink' message) as first parameter. If a - * Message is given, it will be passed on verbatim. - * @param string|Message $titleMsg [optional] Passed on to UserNotLoggedIn constructor. Strings - * will be used as message keys. + * @param string $reasonMsg [optional] Message key to be displayed on login page + * @param string $titleMsg [optional] Passed on to UserNotLoggedIn constructor * @throws UserNotLoggedIn */ - public function requireLogin( $reasonMsg = null, $titleMsg = null ) { + public function requireLogin( + $reasonMsg = 'exception-nologin-text', $titleMsg = 'exception-nologin' + ) { if ( $this->getUser()->isAnon() ) { - // Use default messages if not given or explicit null passed - if ( !$reasonMsg ) { - $reasonMsg = 'exception-nologin-text-manual'; - } - if ( !$titleMsg ) { - $titleMsg = 'exception-nologin'; - } - - // Convert to Messages with current context - if ( is_string( $reasonMsg ) ) { - $loginreqlink = Linker::linkKnown( - SpecialPage::getTitleFor( 'Userlogin' ), - $this->msg( 'loginreqlink' )->escaped(), - array(), - array( 'returnto' => $this->getPageTitle()->getPrefixedText() ) - ); - $reasonMsg = $this->msg( $reasonMsg )->rawParams( $loginreqlink ); - } - if ( is_string( $titleMsg ) ) { - $titleMsg = $this->msg( $titleMsg ); - } - throw new UserNotLoggedIn( $reasonMsg, $titleMsg ); } } @@ -621,11 +596,9 @@ class SpecialPage { * @param array $params */ protected function addFeedLinks( $params ) { - global $wgFeedClasses; - $feedTemplate = wfScript( 'api' ); - foreach ( $wgFeedClasses as $format => $class ) { + foreach ( $this->getConfig()->get( 'FeedClasses' ) as $format => $class ) { $theseParams = $params + array( 'feedformat' => $format ); $url = wfAppendQuery( $feedTemplate, $theseParams ); $this->getOutput()->addFeedLink( $format, $url ); @@ -641,8 +614,8 @@ class SpecialPage { * @since 1.21 */ public function getFinalGroupName() { - global $wgSpecialPageGroups; $name = $this->getName(); + $specialPageGroups = $this->getConfig()->get( 'SpecialPageGroups' ); // Allow overbidding the group from the wiki side $msg = $this->msg( 'specialpages-specialpagegroup-' . strtolower( $name ) )->inContentLanguage(); @@ -655,8 +628,8 @@ class SpecialPage { // Group '-' is used as default to have the chance to determine, // if the special pages overrides this method, // if not overridden, $wgSpecialPageGroups is checked for b/c - if ( $group === '-' && isset( $wgSpecialPageGroups[$name] ) ) { - $group = $wgSpecialPageGroups[$name]; + if ( $group === '-' && isset( $specialPageGroups[$name] ) ) { + $group = $specialPageGroups[$name]; } } diff --git a/includes/specials/SpecialActiveusers.php b/includes/specials/SpecialActiveusers.php index 6db9e5fa8e..572eacc5bc 100644 --- a/includes/specials/SpecialActiveusers.php +++ b/includes/specials/SpecialActiveusers.php @@ -52,11 +52,9 @@ class ActiveUsersPager extends UsersPager { * @param string $par Parameter passed to the page */ function __construct( IContextSource $context = null, $group = null, $par = null ) { - global $wgActiveUserDays; - parent::__construct( $context ); - $this->RCMaxAge = $wgActiveUserDays; + $this->RCMaxAge = $this->getConfig()->get( 'ActiveUserDays' ); $un = $this->getRequest()->getText( 'username', $par ); $this->requestedUser = ''; if ( $un != '' ) { @@ -192,13 +190,11 @@ class ActiveUsersPager extends UsersPager { } function getPageHeader() { - global $wgScript; - $self = $this->getTitle(); $limit = $this->mLimit ? Html::hidden( 'limit', $this->mLimit ) : ''; # Form tag - $out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ); + $out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => wfScript() ) ); $out .= Xml::fieldset( $this->msg( 'activeusers' )->text() ) . "\n"; $out .= Html::hidden( 'title', $self->getPrefixedDBkey() ) . $limit . "\n"; @@ -247,17 +243,17 @@ class SpecialActiveUsers extends SpecialPage { * @param string $par Parameter passed to the page or null */ public function execute( $par ) { - global $wgActiveUserDays; + $days = $this->getConfig()->get( 'ActiveUserDays' ); $this->setHeaders(); $this->outputHeader(); $out = $this->getOutput(); $out->wrapWikiMsg( "
    \n$1\n
    ", - array( 'activeusers-intro', $this->getLanguage()->formatNum( $wgActiveUserDays ) ) ); + array( 'activeusers-intro', $this->getLanguage()->formatNum( $days ) ) ); // Occasionally merge in new updates - $seconds = min( self::mergeActiveUsers( 600 ), $wgActiveUserDays * 86400 ); + $seconds = min( self::mergeActiveUsers( 600, $days ), $days * 86400 ); // Mention the level of staleness $out->addWikiMsg( 'cachedspecial-viewing-cached-ttl', $this->getLanguage()->formatDuration( $seconds ) ); @@ -284,12 +280,11 @@ class SpecialActiveUsers extends SpecialPage { } /** - * @param intr $period Seconds (do updates no more often than this) + * @param int $period Seconds (do updates no more often than this) + * @param int $days How many days user must be idle before he is considered inactive * @return int How many seconds old the cache is */ - public static function mergeActiveUsers( $period ) { - global $wgActiveUserDays; - + public static function mergeActiveUsers( $period, $days ) { $dbr = wfGetDB( DB_SLAVE ); $cTime = $dbr->selectField( 'querycache_info', 'qci_timestamp', @@ -300,16 +295,16 @@ class SpecialActiveUsers extends SpecialPage { if ( !$cTime || ( time() - wfTimestamp( TS_UNIX, $cTime ) ) > $period ) { $dbw = wfGetDB( DB_MASTER ); if ( $dbw->estimateRowCount( 'recentchanges' ) <= 10000 ) { - $window = $wgActiveUserDays * 86400; // small wiki + $window = $days * 86400; // small wiki } else { $window = $period * 2; } - $cTime = self::doQueryCacheUpdate( $dbw, $window ) ?: $cTime; + $cTime = self::doQueryCacheUpdate( $dbw, $days, $window ) ?: $cTime; } } return ( time() - - ( $cTime ? wfTimestamp( TS_UNIX, $cTime ) : $wgActiveUserDays * 86400 ) ); + ( $cTime ? wfTimestamp( TS_UNIX, $cTime ) : $days * 86400 ) ); } /** @@ -319,19 +314,18 @@ class SpecialActiveUsers extends SpecialPage { public static function cacheUpdate( DatabaseBase $dbw ) { global $wgActiveUserDays; - self::doQueryCacheUpdate( $dbw, $wgActiveUserDays * 86400 ); + self::doQueryCacheUpdate( $dbw, $wgActiveUserDays, $wgActiveUserDays * 86400 ); } /** * Update the query cache as needed * * @param DatabaseBase $dbw + * @param int $days How many days user must be idle before he is considered inactive * @param int $window Maximum time range of new data to scan (in seconds) * @return int|bool UNIX timestamp the cache is now up-to-date as of (false on error) */ - protected static function doQueryCacheUpdate( DatabaseBase $dbw, $window ) { - global $wgActiveUserDays; - + protected static function doQueryCacheUpdate( DatabaseBase $dbw, $days, $window ) { $lockKey = wfWikiID() . '-activeusers'; if ( !$dbw->lock( $lockKey, __METHOD__, 1 ) ) { return false; // exclusive update (avoids duplicate entries) @@ -347,7 +341,7 @@ class SpecialActiveUsers extends SpecialPage { // Pick the date range to fetch from. This is normally from the last // update to till the present time, but has a limited window for sanity. // If the window is limited, multiple runs are need to fully populate it. - $sTimestamp = max( $cTimeUnix, $now - $wgActiveUserDays * 86400 ); + $sTimestamp = max( $cTimeUnix, $now - $days * 86400 ); $eTimestamp = min( $sTimestamp + $window, $now ); // Get all the users active since the last update @@ -376,7 +370,7 @@ class SpecialActiveUsers extends SpecialPage { $dbw->delete( 'querycachetwo', array( 'qcc_type' => 'activeusers', - 'qcc_value < ' . $dbw->addQuotes( $now - $wgActiveUserDays * 86400 ) // TS_UNIX + 'qcc_value < ' . $dbw->addQuotes( $now - $days * 86400 ) // TS_UNIX ), __METHOD__ ); diff --git a/includes/specials/SpecialAllPages.php b/includes/specials/SpecialAllPages.php index 04e2f11a49..c8fae68d4f 100644 --- a/includes/specials/SpecialAllPages.php +++ b/includes/specials/SpecialAllPages.php @@ -213,32 +213,20 @@ class SpecialAllPages extends IncludableSpecialPage { ); if ( $res->numRows() > 0 ) { - $out = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-chunk' ) ); + $out = Xml::openElement( 'ul', array( 'class' => 'mw-allpages-chunk' ) ); while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) { $t = Title::newFromRow( $s ); if ( $t ) { - $link = ( $s->page_is_redirect ? '
    ' : '' ) . + $out .= 'page_is_redirect ? ' class="allpagesredirect"' : '' ) . + '>' . Linker::link( $t ) . - ( $s->page_is_redirect ? '
    ' : '' ); + "
  • \n"; } else { - $link = '[[' . htmlspecialchars( $s->page_title ) . ']]'; + $out .= '
  • [[' . htmlspecialchars( $s->page_title ) . "]]
  • \n"; } - - if ( $n % 3 == 0 ) { - $out .= ''; - } - - $out .= "$link"; - $n++; - if ( $n % 3 == 0 ) { - $out .= "\n"; - } - } - - if ( ( $n % 3 ) != 0 ) { - $out .= "\n"; } - $out .= Xml::closeElement( 'table' ); + $out .= Xml::closeElement( 'ul' ); } else { $out = ''; } diff --git a/includes/specials/SpecialExport.php b/includes/specials/SpecialExport.php index e4e4bfb3d2..38c52a0178 100644 --- a/includes/specials/SpecialExport.php +++ b/includes/specials/SpecialExport.php @@ -37,10 +37,6 @@ class SpecialExport extends SpecialPage { } public function execute( $par ) { - global $wgSitename, $wgExportAllowListContributors, $wgExportFromNamespaces; - global $wgExportAllowHistory, $wgExportMaxHistory, $wgExportMaxLinkDepth; - global $wgExportAllowAll; - $this->setHeaders(); $this->outputHeader(); $config = $this->getConfig(); diff --git a/includes/specials/SpecialImport.php b/includes/specials/SpecialImport.php index 28e6479474..2d72d6241d 100644 --- a/includes/specials/SpecialImport.php +++ b/includes/specials/SpecialImport.php @@ -44,8 +44,7 @@ class SpecialImport extends SpecialPage { */ public function __construct() { parent::__construct( 'Import', 'import' ); - global $wgImportTargetNamespace; - $this->namespace = $wgImportTargetNamespace; + $this->namespace = $this->getConfig()->get( 'ImportTargetNamespace' ); } /** @@ -91,15 +90,13 @@ class SpecialImport extends SpecialPage { * Do the actual import */ private function doImport() { - global $wgImportSources, $wgExportMaxLinkDepth; - $isUpload = false; $request = $this->getRequest(); $this->namespace = $request->getIntOrNull( 'namespace' ); $sourceName = $request->getVal( "source" ); $this->logcomment = $request->getText( 'log-comment' ); - $this->pageLinkDepth = $wgExportMaxLinkDepth == 0 + $this->pageLinkDepth = $this->getConfig()->get( 'ExportMaxLinkDepth' ) == 0 ? 0 : $request->getIntOrNull( 'pagelink-depth' ); $this->rootpage = $request->getText( 'rootpage' ); @@ -119,7 +116,7 @@ class SpecialImport extends SpecialPage { throw new PermissionsError( 'import' ); } $this->interwiki = $request->getVal( 'interwiki' ); - if ( !in_array( $this->interwiki, $wgImportSources ) ) { + if ( !in_array( $this->interwiki, $this->getConfig()->get( 'ImportSources' ) ) ) { $source = Status::newFatal( "import-invalid-interwiki" ); } else { $this->history = $request->getCheck( 'interwikiHistory' ); @@ -203,11 +200,10 @@ class SpecialImport extends SpecialPage { } private function showForm() { - global $wgImportSources, $wgExportMaxLinkDepth; - $action = $this->getPageTitle()->getLocalURL( array( 'action' => 'submit' ) ); $user = $this->getUser(); $out = $this->getOutput(); + $importSources = $this->getConfig()->get( 'ImportSources' ); if ( $user->isAllowed( 'importupload' ) ) { $out->addHTML( @@ -266,15 +262,15 @@ class SpecialImport extends SpecialPage { Xml::closeElement( 'fieldset' ) ); } else { - if ( empty( $wgImportSources ) ) { + if ( empty( $importSources ) ) { $out->addWikiMsg( 'importnosources' ); } } - if ( $user->isAllowed( 'import' ) && !empty( $wgImportSources ) ) { + if ( $user->isAllowed( 'import' ) && !empty( $importSources ) ) { # Show input field for import depth only if $wgExportMaxLinkDepth > 0 $importDepth = ''; - if ( $wgExportMaxLinkDepth > 0 ) { + if ( $this->getConfig()->get( 'ExportMaxLinkDepth' ) > 0 ) { $importDepth = " " . $this->msg( 'export-pagelinks' )->parse() . @@ -311,7 +307,7 @@ class SpecialImport extends SpecialPage { ) ); - foreach ( $wgImportSources as $prefix ) { + foreach ( $importSources as $prefix ) { $selected = ( $this->interwiki === $prefix ) ? ' selected="selected"' : ''; $out->addHTML( Xml::option( $prefix, $prefix, $selected ) ); } diff --git a/includes/specials/SpecialProtectedtitles.php b/includes/specials/SpecialProtectedtitles.php index cb6ec3c9f7..a40da87dac 100644 --- a/includes/specials/SpecialProtectedtitles.php +++ b/includes/specials/SpecialProtectedtitles.php @@ -133,8 +133,7 @@ class SpecialProtectedtitles extends SpecialPage { * @private */ function showOptions( $namespace, $type = 'edit', $level ) { - global $wgScript; - $action = htmlspecialchars( $wgScript ); + $action = htmlspecialchars( wfScript() ); $title = $this->getPageTitle(); $special = htmlspecialchars( $title->getPrefixedDBkey() ); @@ -175,14 +174,12 @@ class SpecialProtectedtitles extends SpecialPage { * @private */ function getLevelMenu( $pr_level ) { - global $wgRestrictionLevels; - // Temporary array $m = array( $this->msg( 'restriction-level-all' )->text() => 0 ); $options = array(); // First pass to load the log names - foreach ( $wgRestrictionLevels as $type ) { + foreach ( $this->getConfig()->get( 'RestrictionLevels' ) as $type ) { if ( $type != '' && $type != '*' ) { // Messages: restriction-level-sysop, restriction-level-autoconfirmed $text = $this->msg( "restriction-level-$type" )->text(); diff --git a/includes/specials/SpecialRandomInCategory.php b/includes/specials/SpecialRandomInCategory.php index 8c01ef2b62..28a1bc58b1 100644 --- a/includes/specials/SpecialRandomInCategory.php +++ b/includes/specials/SpecialRandomInCategory.php @@ -68,8 +68,6 @@ class SpecialRandomInCategory extends SpecialPage { } public function execute( $par ) { - global $wgScript; - $cat = false; $categoryStr = $this->getRequest()->getText( 'category', $par ); @@ -100,7 +98,7 @@ class SpecialRandomInCategory extends SpecialPage { $submit = Html::input( '', $submitText, 'submit' ); $msg = $this->msg( 'randomincategory-selectcategory' ); - $form = Html::rawElement( 'form', array( 'action' => $wgScript ), + $form = Html::rawElement( 'form', array( 'action' => wfScript() ), Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ) . $msg->rawParams( $input, $submit )->parse() ); diff --git a/includes/specials/SpecialRecentchanges.php b/includes/specials/SpecialRecentchanges.php index ea785fa291..5938f017c7 100644 --- a/includes/specials/SpecialRecentchanges.php +++ b/includes/specials/SpecialRecentchanges.php @@ -192,8 +192,6 @@ class SpecialRecentChanges extends ChangesListSpecialPage { * @return bool|ResultWrapper Result or false (for Recentchangeslinked only) */ public function doMainQuery( $conds, $opts ) { - global $wgAllowCategorizedRecentChanges; - $dbr = $this->getDB(); $user = $this->getUser(); @@ -247,7 +245,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage { ); // Build the final data - if ( $wgAllowCategorizedRecentChanges ) { + if ( $this->getConfig()->get( 'AllowCategorizedRecentChanges' ) ) { $this->filterByCategories( $rows, $opts ); } @@ -273,14 +271,14 @@ class SpecialRecentChanges extends ChangesListSpecialPage { * @return array */ private function getFeedQuery() { - global $wgFeedLimit; $query = array_filter( $this->getOptions()->getAllValues(), function ( $value ) { // API handles empty parameters in a different way return $value !== ''; } ); $query['action'] = 'feedrecentchanges'; - if ( $query['limit'] > $wgFeedLimit ) { - $query['limit'] = $wgFeedLimit; + $feedLimit = $this->getConfig()->get( 'FeedLimit' ); + if ( $query['limit'] > $feedLimit ) { + $query['limit'] = $feedLimit; } return $query; @@ -293,11 +291,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage { * @param FormOptions $opts */ public function outputChangesList( $rows, $opts ) { - global $wgRCShowWatchingUsers, $wgShowUpdatedMarker; - $limit = $opts['limit']; - $showWatcherCount = $wgRCShowWatchingUsers + $showWatcherCount = $this->getConfig()->get( 'RCShowWatchingUsers' ) && $this->getUser()->getOption( 'shownumberswatching' ); $watcherCache = array(); @@ -315,7 +311,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $rc = RecentChange::newFromRow( $obj ); $rc->counter = $counter++; # Check if the page has been updated since the last visit - if ( $wgShowUpdatedMarker && !empty( $obj->wl_notificationtimestamp ) ) { + if ( $this->getConfig()->get( 'ShowUpdatedMarker' ) && !empty( $obj->wl_notificationtimestamp ) ) { $rc->notificationtimestamp = ( $obj->rc_timestamp >= $obj->wl_notificationtimestamp ); } else { $rc->notificationtimestamp = false; // Default @@ -367,8 +363,6 @@ class SpecialRecentChanges extends ChangesListSpecialPage { * @param int $numRows Number of rows in the result to show after this header */ public function doHeader( $opts, $numRows ) { - global $wgScript; - $this->setTopText( $opts ); $defaults = $opts->getAllValues(); @@ -420,7 +414,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $t = $this->getPageTitle(); $out .= Html::hidden( 'title', $t->getPrefixedText() ); - $form = Xml::tags( 'form', array( 'action' => $wgScript ), $out ); + $form = Xml::tags( 'form', array( 'action' => wfScript() ), $out ); $panel[] = $form; $panelString = implode( "\n", $panel ); @@ -470,8 +464,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $extraOpts = array(); $extraOpts['namespace'] = $this->namespaceFilterForm( $opts ); - global $wgAllowCategorizedRecentChanges; - if ( $wgAllowCategorizedRecentChanges ) { + if ( $this->getConfig()->get( 'AllowCategorizedRecentChanges' ) ) { $extraOpts['category'] = $this->categoryFilterForm( $opts ); } @@ -655,8 +648,6 @@ class SpecialRecentChanges extends ChangesListSpecialPage { * @return string */ function optionsPanel( $defaults, $nondefaults, $numRows ) { - global $wgRCLinkLimits, $wgRCLinkDays; - $options = $nondefaults + $defaults; $note = ''; @@ -680,12 +671,12 @@ class SpecialRecentChanges extends ChangesListSpecialPage { } # Sort data for display and make sure it's unique after we've added user data. - $linkLimits = $wgRCLinkLimits; + $linkLimits = $this->getConfig()->get( 'RCLinkLimits' ); $linkLimits[] = $options['limit']; sort( $linkLimits ); $linkLimits = array_unique( $linkLimits ); - $linkDays = $wgRCLinkDays; + $linkDays = $this->getConfig()->get( 'RCLinkDays' ); $linkDays[] = $options['days']; sort( $linkDays ); $linkDays = array_unique( $linkDays ); diff --git a/includes/specials/SpecialRecentchangeslinked.php b/includes/specials/SpecialRecentchangeslinked.php index 9700638a03..c000a8dc15 100644 --- a/includes/specials/SpecialRecentchangeslinked.php +++ b/includes/specials/SpecialRecentchangeslinked.php @@ -220,15 +220,6 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges { return $res; } - protected function runMainQueryHook( &$tables, &$select, &$conds, &$query_options, &$join_conds, $opts ) { - return parent::runMainQueryHook( $tables, $select, $conds, $query_options, $join_conds, $opts ) - && wfRunHooks( - 'SpecialRecentChangesQuery', - array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$select ), - '1.23' - ); - } - function setTopText( FormOptions $opts ) { $target = $this->getTargetTitle(); if ( $target ) { diff --git a/includes/specials/SpecialSearch.php b/includes/specials/SpecialSearch.php index 1caed0b14d..5f1623927c 100644 --- a/includes/specials/SpecialSearch.php +++ b/includes/specials/SpecialSearch.php @@ -186,12 +186,11 @@ class SpecialSearch extends SpecialPage { # No match, generate an edit URL $title = Title::newFromText( $term ); if ( !is_null( $title ) ) { - global $wgGoToEdit; wfRunHooks( 'SpecialSearchNogomatch', array( &$title ) ); wfDebugLog( 'nogomatch', $title->getFullText(), 'private' ); # If the feature is enabled, go straight to the edit page - if ( $wgGoToEdit ) { + if ( $this->getConfig()->get( 'GoToEdit' ) ) { $this->getOutput()->redirect( $title->getFullURL( array( 'action' => 'edit' ) ) ); return; @@ -204,7 +203,7 @@ class SpecialSearch extends SpecialPage { * @param string $term */ public function showResults( $term ) { - global $wgDisableTextSearch, $wgSearchForwardUrl, $wgContLang, $wgScript; + global $wgContLang; $profile = new ProfileSection( __METHOD__ ); $search = $this->getSearchEngine(); @@ -220,9 +219,10 @@ class SpecialSearch extends SpecialPage { $out = $this->getOutput(); - if ( $wgDisableTextSearch ) { - if ( $wgSearchForwardUrl ) { - $url = str_replace( '$1', urlencode( $term ), $wgSearchForwardUrl ); + if ( $this->getConfig()->get( 'DisableTextSearch' ) ) { + $searchFowardUrl = $this->getConfig()->get( 'SearchForwardUrl' ); + if ( $searchFowardUrl ) { + $url = str_replace( '$1', urlencode( $term ), $searchFowardUrl ); $out->redirect( $url ); } else { $out->addHTML( @@ -304,7 +304,7 @@ class SpecialSearch extends SpecialPage { array( 'id' => ( $this->profile === 'advanced' ? 'powersearch' : 'search' ), 'method' => 'get', - 'action' => $wgScript + 'action' => wfScript(), ) ) ); @@ -651,16 +651,6 @@ class SpecialSearch extends SpecialPage { $lang = $this->getLanguage(); - // format score - if ( is_null( $result->getScore() ) ) { - // Search engine doesn't report scoring info - $score = ''; - } else { - $percent = sprintf( '%2.1f', $result->getScore() * 100 ); - $score = $this->msg( 'search-result-score' )->numParams( $percent )->text() - . ' - '; - } - // format description $byteSize = $result->getByteSize(); $wordCount = $result->getWordCount(); @@ -722,7 +712,7 @@ class SpecialSearch extends SpecialPage { '' . "{$link} {$redirect} {$section} {$fileMatch}" . $extract . - "
    {$score}{$desc} - {$date}{$related}
    " . + "
    {$desc} - {$date}{$related}
    " . '' . '' . '' . @@ -733,6 +723,7 @@ class SpecialSearch extends SpecialPage { $html = null; + $score = ''; if ( wfRunHooks( 'ShowSearchHit', array( $this, $result, $terms, &$link, &$redirect, &$section, &$extract, @@ -741,7 +732,7 @@ class SpecialSearch extends SpecialPage { ) ) ) { $html = "
  • " . "{$link} {$redirect} {$section} {$fileMatch}
    {$extract}\n" . - "
    {$score}{$size} - {$date}{$related}
    " . + "
    {$size} - {$date}{$related}
    " . "
  • \n"; } diff --git a/includes/specials/SpecialSpecialpages.php b/includes/specials/SpecialSpecialpages.php index 3ba50bbd07..eff06f4603 100644 --- a/includes/specials/SpecialSpecialpages.php +++ b/includes/specials/SpecialSpecialpages.php @@ -49,8 +49,6 @@ class SpecialSpecialpages extends UnlistedSpecialPage { } private function getPageGroups() { - global $wgSortSpecialPages; - $pages = SpecialPageFactory::getUsablePages( $this->getUser() ); if ( !count( $pages ) ) { @@ -76,10 +74,8 @@ class SpecialSpecialpages extends UnlistedSpecialPage { } /** Sort */ - if ( $wgSortSpecialPages ) { - foreach ( $groups as $group => $sortedPages ) { - ksort( $groups[$group] ); - } + foreach ( $groups as $group => $sortedPages ) { + ksort( $groups[$group] ); } /** Always move "other" to end */ diff --git a/includes/specials/SpecialStatistics.php b/includes/specials/SpecialStatistics.php index 371e5eac38..67c96a77b6 100644 --- a/includes/specials/SpecialStatistics.php +++ b/includes/specials/SpecialStatistics.php @@ -36,7 +36,10 @@ class SpecialStatistics extends SpecialPage { } public function execute( $par ) { - global $wgMemc, $wgDisableCounters, $wgMiserMode; + global $wgMemc; + + $disableCounters = $this->getConfig()->get( 'DisableCounters' ); + $miserMode = $this->getConfig()->get( 'MiserMode' ); $this->setHeaders(); $this->getOutput()->addModuleStyles( 'mediawiki.special' ); @@ -52,12 +55,12 @@ class SpecialStatistics extends SpecialPage { # Staticic - views $viewsStats = ''; - if ( !$wgDisableCounters ) { + if ( !$disableCounters ) { $viewsStats = $this->getViewsStats(); } # Set active user count - if ( !$wgMiserMode ) { + if ( !$miserMode ) { $key = wfMemcKey( 'sitestats', 'activeusers-updated' ); // Re-calculate the count if the last tally is old... if ( !$wgMemc->get( $key ) ) { @@ -83,7 +86,7 @@ class SpecialStatistics extends SpecialPage { $text .= $viewsStats; # Statistic - popular pages - if ( !$wgDisableCounters && !$wgMiserMode ) { + if ( !$disableCounters && !$miserMode ) { $text .= $this->getMostViewedPages(); } @@ -170,8 +173,6 @@ class SpecialStatistics extends SpecialPage { } private function getUserStats() { - global $wgActiveUserDays; - return Xml::openElement( 'tr' ) . Xml::tags( 'th', array( 'colspan' => '2' ), $this->msg( 'statistics-header-users' )->parse() ) . Xml::closeElement( 'tr' ) . @@ -187,16 +188,15 @@ class SpecialStatistics extends SpecialPage { $this->getLanguage()->formatNum( $this->activeUsers ), array( 'class' => 'mw-statistics-users-active' ), 'statistics-users-active-desc', - $this->getLanguage()->formatNum( $wgActiveUserDays ) + $this->getLanguage()->formatNum( $this->getConfig()->get( 'ActiveUserDays' ) ) ); } private function getGroupStats() { - global $wgGroupPermissions, $wgImplicitGroups; $text = ''; - foreach ( $wgGroupPermissions as $group => $permissions ) { + foreach ( $this->getConfig()->get( 'GroupPermissions' ) as $group => $permissions ) { # Skip generic * and implicit groups - if ( in_array( $group, $wgImplicitGroups ) || $group == '*' ) { + if ( in_array( $group, $this->getConfig()->get( 'ImplicitGroups' ) ) || $group == '*' ) { continue; } $groupname = htmlspecialchars( $group ); diff --git a/includes/specials/SpecialTrackingCategories.php b/includes/specials/SpecialTrackingCategories.php index 73bdbd6ac6..5e5588c425 100644 --- a/includes/specials/SpecialTrackingCategories.php +++ b/includes/specials/SpecialTrackingCategories.php @@ -37,9 +37,6 @@ class SpecialTrackingCategories extends SpecialPage { } function execute( $par ) { - // Global array containing names of tracking categories - global $wgTrackingCategories; - $this->setHeaders(); $this->outputHeader(); $this->getOutput()->allowClickjacking(); @@ -59,7 +56,7 @@ class SpecialTrackingCategories extends SpecialPage { " ); - foreach ( $wgTrackingCategories as $catMsg ) { + foreach ( $this->getConfig()->get( 'TrackingCategories' ) as $catMsg ) { /* * Check if the tracking category varies by namespace * Otherwise only pages in the current namespace will be displayed diff --git a/includes/specials/SpecialUndelete.php b/includes/specials/SpecialUndelete.php index 25f520e357..8acf8a2bc9 100644 --- a/includes/specials/SpecialUndelete.php +++ b/includes/specials/SpecialUndelete.php @@ -36,11 +36,19 @@ class PageArchive { /** @var Status */ protected $revisionStatus; - function __construct( $title ) { + /** @var Config */ + protected $config; + + function __construct( $title, Config $config = null ) { if ( is_null( $title ) ) { throw new MWException( __METHOD__ . ' given a null title.' ); } $this->title = $title; + if ( $config === null ) { + wfDebug( __METHOD__ . ' did not have a Config object passed to it' ); + $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' ); + } + $this->config = $config; } /** @@ -115,8 +123,6 @@ class PageArchive { * @return ResultWrapper */ function listRevisions() { - global $wgContentHandlerUseDB; - $dbr = wfGetDB( DB_SLAVE ); $tables = array( 'archive' ); @@ -126,7 +132,7 @@ class PageArchive { 'ar_comment', 'ar_len', 'ar_deleted', 'ar_rev_id', 'ar_sha1', ); - if ( $wgContentHandlerUseDB ) { + if ( $this->config->get( 'ContentHandlerUseDB' ) ) { $fields[] = 'ar_content_format'; $fields[] = 'ar_content_model'; } @@ -190,8 +196,6 @@ class PageArchive { * @return Revision|null */ function getRevision( $timestamp ) { - global $wgContentHandlerUseDB; - $dbr = wfGetDB( DB_SLAVE ); $fields = array( @@ -209,7 +213,7 @@ class PageArchive { 'ar_sha1', ); - if ( $wgContentHandlerUseDB ) { + if ( $this->config->get( 'ContentHandlerUseDB' ) ) { $fields[] = 'ar_content_format'; $fields[] = 'ar_content_model'; } @@ -442,8 +446,6 @@ class PageArchive { * @return Status Status object containing the number of revisions restored on success */ private function undeleteRevisions( $timestamps, $unsuppress = false, $comment = '' ) { - global $wgContentHandlerUseDB; - if ( wfReadOnly() ) { throw new ReadOnlyError(); } @@ -516,7 +518,7 @@ class PageArchive { 'ar_sha1' ); - if ( $wgContentHandlerUseDB ) { + if ( $this->config->get( 'ContentHandlerUseDB' ) ) { $fields[] = 'ar_content_format'; $fields[] = 'ar_content_model'; } @@ -806,12 +808,10 @@ class SpecialUndelete extends SpecialPage { } function showSearchForm() { - global $wgScript; - $out = $this->getOutput(); $out->setPageTitle( $this->msg( 'undelete-search-title' ) ); $out->addHTML( - Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) . + Xml::openElement( 'form', array( 'method' => 'get', 'action' => wfScript() ) ) . Xml::fieldset( $this->msg( 'undelete-search-box' )->text() ) . Html::hidden( 'title', $this->getPageTitle()->getPrefixedDBkey() ) . Html::rawElement( @@ -891,7 +891,7 @@ class SpecialUndelete extends SpecialPage { return; } - $archive = new PageArchive( $this->mTargetObj ); + $archive = new PageArchive( $this->mTargetObj, $this->getConfig() ); if ( !wfRunHooks( 'UndeleteForm::showRevision', array( &$archive, $this->mTargetObj ) ) ) { return; } @@ -1198,7 +1198,7 @@ class SpecialUndelete extends SpecialPage { array( 'undeletepagetitle', wfEscapeWikiText( $this->mTargetObj->getPrefixedText() ) ) ); - $archive = new PageArchive( $this->mTargetObj ); + $archive = new PageArchive( $this->mTargetObj, $this->getConfig() ); wfRunHooks( 'UndeleteForm::showHistory', array( &$archive, $this->mTargetObj ) ); /* $text = $archive->getLastRevisionText(); @@ -1610,9 +1610,7 @@ class SpecialUndelete extends SpecialPage { } function undelete() { - global $wgUploadMaintenance; - - if ( $wgUploadMaintenance && $this->mTargetObj->getNamespace() == NS_FILE ) { + if ( $this->getConfig()->get( 'UploadMaintenance' ) && $this->mTargetObj->getNamespace() == NS_FILE ) { throw new ErrorPageError( 'undelete-error', 'filedelete-maintenance' ); } @@ -1621,7 +1619,7 @@ class SpecialUndelete extends SpecialPage { } $out = $this->getOutput(); - $archive = new PageArchive( $this->mTargetObj ); + $archive = new PageArchive( $this->mTargetObj, $this->getConfig() ); wfRunHooks( 'UndeleteForm::undelete', array( &$archive, $this->mTargetObj ) ); $ok = $archive->undelete( $this->mTargetTimestamp, diff --git a/includes/specials/SpecialUnlockdb.php b/includes/specials/SpecialUnlockdb.php index 35141d805e..a8b97d78bd 100644 --- a/includes/specials/SpecialUnlockdb.php +++ b/includes/specials/SpecialUnlockdb.php @@ -37,11 +37,9 @@ class SpecialUnlockdb extends FormSpecialPage { } public function checkExecutePermissions( User $user ) { - global $wgReadOnlyFile; - parent::checkExecutePermissions( $user ); # If the lock file isn't writable, we can do sweet bugger all - if ( !file_exists( $wgReadOnlyFile ) ) { + if ( !file_exists( $this->getConfig()->get( 'ReadOnlyFile' ) ) ) { throw new ErrorPageError( 'lockdb', 'databasenotlocked' ); } } @@ -62,20 +60,19 @@ class SpecialUnlockdb extends FormSpecialPage { } public function onSubmit( array $data ) { - global $wgReadOnlyFile; - if ( !$data['Confirm'] ) { return Status::newFatal( 'locknoconfirm' ); } + $readOnlyFile = $this->getConfig()->get( 'ReadOnlyFile' ); wfSuppressWarnings(); - $res = unlink( $wgReadOnlyFile ); + $res = unlink( $readOnlyFile ); wfRestoreWarnings(); if ( $res ) { return Status::newGood(); } else { - return Status::newFatal( 'filedeleteerror', $wgReadOnlyFile ); + return Status::newFatal( 'filedeleteerror', $readOnlyFile ); } } diff --git a/includes/specials/SpecialUnusedimages.php b/includes/specials/SpecialUnusedimages.php index 743c5878f1..36ec09ec81 100644 --- a/includes/specials/SpecialUnusedimages.php +++ b/includes/specials/SpecialUnusedimages.php @@ -44,7 +44,6 @@ class UnusedimagesPage extends ImageQueryPage { } function getQueryInfo() { - global $wgCountCategorizedImagesAsUsed; $retval = array( 'tables' => array( 'image', 'imagelinks' ), 'fields' => array( @@ -58,7 +57,7 @@ class UnusedimagesPage extends ImageQueryPage { 'join_conds' => array( 'imagelinks' => array( 'LEFT JOIN', 'il_to = img_name' ) ) ); - if ( $wgCountCategorizedImagesAsUsed ) { + if ( $this->getConfig()->get( 'CountCategorizedImagesAsUsed' ) ) { // Order is significant $retval['tables'] = array( 'image', 'page', 'categorylinks', 'imagelinks' ); diff --git a/includes/specials/SpecialUploadStash.php b/includes/specials/SpecialUploadStash.php index cb821cb3c4..ddb435d95b 100644 --- a/includes/specials/SpecialUploadStash.php +++ b/includes/specials/SpecialUploadStash.php @@ -159,15 +159,13 @@ class SpecialUploadStash extends UnlistedSpecialPage { * @return bool Success */ private function outputThumbFromStash( $file, $params ) { - // this global, if it exists, points to a "scaler", as you might find in + $flags = 0; + // this config option, if it exists, points to a "scaler", as you might find in // the Wikimedia Foundation cluster. See outputRemoteScaledThumb(). This // is part of our horrible NFS-based system, we create a file on a mount // point here, but fetch the scaled file from somewhere else that // happens to share it over NFS. - global $wgUploadStashScalerBaseUrl; - - $flags = 0; - if ( $wgUploadStashScalerBaseUrl ) { + if ( $this->getConfig()->get( 'UploadStashScalerBaseUrl' ) ) { $this->outputRemoteScaledThumb( $file, $params, $flags ); } else { $this->outputLocallyScaledThumb( $file, $params, $flags ); @@ -199,8 +197,8 @@ class SpecialUploadStash extends UnlistedSpecialPage { throw new UploadStashFileNotFoundException( "no local path for scaled item" ); } - // now we should construct a File, so we can get mime and other such info in a standard way - // n.b. mimetype may be different from original (ogx original -> jpeg thumb) + // now we should construct a File, so we can get MIME and other such info in a standard way + // n.b. MIME type may be different from original (ogx original -> jpeg thumb) $thumbFile = new UnregisteredLocalFile( false, $this->stash->repo, $thumbnailImage->getStoragePath(), false ); if ( !$thumbFile ) { @@ -230,11 +228,10 @@ class SpecialUploadStash extends UnlistedSpecialPage { * @return bool Success */ private function outputRemoteScaledThumb( $file, $params, $flags ) { - // This global probably looks something like + // This option probably looks something like // 'http://upload.wikimedia.org/wikipedia/test/thumb/temp'. Do not use // trailing slash. - global $wgUploadStashScalerBaseUrl; - $scalerBaseUrl = $wgUploadStashScalerBaseUrl; + $scalerBaseUrl = $this->getConfig()->get( 'UploadStashScalerBaseUrl' ); if ( preg_match( '/^\/\//', $scalerBaseUrl ) ) { // this is apparently a protocol-relative URL, which makes no sense in this context, @@ -295,7 +292,7 @@ class SpecialUploadStash extends UnlistedSpecialPage { * Output HTTP response of raw content * Side effect: writes HTTP response to STDOUT. * @param string $content Content - * @param string $contentType Mime type + * @param string $contentType MIME type * @throws SpecialUploadStashTooLargeException * @return bool */ @@ -313,7 +310,7 @@ class SpecialUploadStash extends UnlistedSpecialPage { /** * Output headers for streaming * @todo Unsure about encoding as binary; if we received from HTTP perhaps - * we should use that encoding, concatted with semicolon to mimeType as it + * we should use that encoding, concatenated with semicolon to `$contentType` as it * usually is. * Side effect: preps PHP to write headers to STDOUT. * @param string $contentType String suitable for content-type header diff --git a/includes/specials/SpecialUserlogin.php b/includes/specials/SpecialUserlogin.php index 46b499989a..bd7457ee17 100644 --- a/includes/specials/SpecialUserlogin.php +++ b/includes/specials/SpecialUserlogin.php @@ -42,6 +42,28 @@ class LoginForm extends SpecialPage { const NEED_TOKEN = 12; const WRONG_TOKEN = 13; + /** + * Valid error and warning messages + * + * Special:Userlogin can show an error or warning message on the form when + * coming from another page. This is done via the ?error= or ?warning= GET + * parameters. + * + * This array is the list of valid message keys. All other values will be + * ignored. + * + * @since 1.24 + * @var string[] + */ + public static $validErrorMessages = array( + 'exception-nologin-text', + 'watchlistanontext', + 'changeemail-no-info', + 'resetpass-no-info', + 'confirmemail_needlogin', + 'prefsnologintext2', + ); + public $mAbortLoginErrorMsg = null; protected $mUsername; @@ -65,6 +87,8 @@ class LoginForm extends SpecialPage { protected $mType; protected $mReason; protected $mRealName; + protected $mEntryError = ''; + protected $mEntryErrorType = 'error'; private $mTempPasswordUsed; private $mLoaded = false; @@ -128,6 +152,37 @@ class LoginForm extends SpecialPage { $this->mReturnTo = $request->getVal( 'returnto', '' ); $this->mReturnToQuery = $request->getVal( 'returntoquery', '' ); + // Show an error or warning passed on from a previous page + $entryError = $this->msg( $request->getVal( 'error', '' ) ); + $entryWarning = $this->msg( $request->getVal( 'warning', '' ) ); + // bc: provide login link as a parameter for messages where the translation + // was not updated + $loginreqlink = Linker::linkKnown( + $this->getPageTitle(), + $this->msg( 'loginreqlink' )->escaped(), + array(), + array( + 'returnto' => $this->mReturnTo, + 'returntoquery' => $this->mReturnToQuery, + 'uselang' => $this->mLanguage, + 'fromhttp' => $this->mFromHTTP ? '1' : '0', + ) + ); + + // Only show valid error or warning messages. + if ( $entryError->exists() + && in_array( $entryError->getKey(), self::$validErrorMessages ) + ) { + $this->mEntryErrorType = 'error'; + $this->mEntryError = $entryError->rawParams( $loginreqlink )->escaped(); + + } elseif ( $entryWarning->exists() + && in_array( $entryWarning->getKey(), self::$validErrorMessages ) + ) { + $this->mEntryErrorType = 'warning'; + $this->mEntryError = $entryWarning->rawParams( $loginreqlink )->escaped(); + } + if ( $wgEnableEmail ) { $this->mEmail = $request->getText( 'wpEmail' ); } else { @@ -182,6 +237,14 @@ class LoginForm extends SpecialPage { } $this->setHeaders(); + // In the case where the user is already logged in, do not show the login page. + // The use case scenario for this is when a user opens a large number of tabs, is + // redirected to the login page on all of them, and then logs in on one, expecting + // all the others to work properly. + if ( $this->mType !== 'signup' && !$this->mPosted && $this->getUser()->isLoggedIn() ) { + $this->successfulLogin(); + } + // If logging in and not on HTTPS, either redirect to it or offer a link. global $wgSecureLogin; if ( $this->mRequest->getProtocol() !== 'https' ) { @@ -191,6 +254,7 @@ class LoginForm extends SpecialPage { 'returntoquery' => $this->mReturnToQuery !== '' ? $this->mReturnToQuery : null, 'title' => null, + ( $this->mEntryErrorType === 'error' ? 'error' : 'warning' ) => $this->mEntryError, ) + $this->mRequest->getQueryValues(); $url = $title->getFullURL( $query, false, PROTO_HTTPS ); if ( $wgSecureLogin @@ -232,7 +296,7 @@ class LoginForm extends SpecialPage { return; } } - $this->mainLoginForm( '' ); + $this->mainLoginForm( $this->mEntryError, $this->mEntryErrorType ); } /** diff --git a/includes/specials/SpecialUserrights.php b/includes/specials/SpecialUserrights.php index 0ec85ba166..cefdad078d 100644 --- a/includes/specials/SpecialUserrights.php +++ b/includes/specials/SpecialUserrights.php @@ -328,9 +328,7 @@ class UserrightsPage extends SpecialPage { * @return Status */ public function fetchUser( $username ) { - global $wgUserrightsInterwikiDelimiter; - - $parts = explode( $wgUserrightsInterwikiDelimiter, $username ); + $parts = explode( $this->getConfig()->get( 'UserrightsInterwikiDelimiter' ), $username ); if ( count( $parts ) < 2 ) { $name = trim( $username ); $database = ''; @@ -417,13 +415,12 @@ class UserrightsPage extends SpecialPage { * Output a form to allow searching for a user */ function switchForm() { - global $wgScript; $this->getOutput()->addHTML( Html::openElement( 'form', array( 'method' => 'get', - 'action' => $wgScript, + 'action' => wfScript(), 'name' => 'uluser', 'id' => 'mw-userrights-form1' ) diff --git a/includes/specials/SpecialVersion.php b/includes/specials/SpecialVersion.php index 8ca9e231a8..318ceb148e 100644 --- a/includes/specials/SpecialVersion.php +++ b/includes/specials/SpecialVersion.php @@ -212,7 +212,7 @@ class SpecialVersion extends SpecialPage { $software = array(); $software['[https://www.mediawiki.org/ MediaWiki]'] = self::getVersionLinked(); $phpKey = wfIsHHVM() ? '[http://hhvm.com/ HHVM]' : - '[http://www.php.net/ PHP]'; + '[https://php.net/ PHP]'; $software[$phpKey] = PHP_VERSION . " (" . PHP_SAPI . ")"; $software[$dbr->getSoftwareLink()] = $dbr->getServerInfo(); @@ -428,7 +428,11 @@ class SpecialVersion extends SpecialPage { function getExtensionCredits() { global $wgExtensionCredits; - if ( !count( $wgExtensionCredits ) ) { + if ( + count( $wgExtensionCredits ) === 0 || + // Skins are displayed separately, see getSkinCredits() + ( count( $wgExtensionCredits ) === 1 && isset( $wgExtensionCredits['skin'] ) ) + ) { return ''; } @@ -476,6 +480,11 @@ class SpecialVersion extends SpecialPage { * @return string Wikitext */ function getSkinCredits() { + global $wgExtensionCredits; + if ( !isset( $wgExtensionCredits['skin'] ) || count( $wgExtensionCredits['skin'] ) === 0 ) { + return ''; + } + $out = Xml::element( 'h2', array( 'id' => 'mw-version-skin' ), diff --git a/includes/specials/SpecialWantedpages.php b/includes/specials/SpecialWantedpages.php index c54d9f4399..38f1808f7a 100644 --- a/includes/specials/SpecialWantedpages.php +++ b/includes/specials/SpecialWantedpages.php @@ -54,8 +54,7 @@ class WantedPagesPage extends WantedQueryPage { } function getQueryInfo() { - global $wgWantedPagesThreshold; - $count = $wgWantedPagesThreshold - 1; + $count = $this->getConfig()->get( 'WantedPagesThreshold' ) - 1; $query = array( 'tables' => array( 'pagelinks', diff --git a/includes/specials/SpecialWatchlist.php b/includes/specials/SpecialWatchlist.php index 5691e50608..8f2f86b92a 100644 --- a/includes/specials/SpecialWatchlist.php +++ b/includes/specials/SpecialWatchlist.php @@ -38,8 +38,6 @@ class SpecialWatchlist extends ChangesListSpecialPage { * @param string $subpage */ function execute( $subpage ) { - global $wgEnotifWatchlist, $wgShowUpdatedMarker; - // Anons don't get a watchlist $this->requireLogin( 'watchlistanontext' ); @@ -66,7 +64,8 @@ class SpecialWatchlist extends ChangesListSpecialPage { $user = $this->getUser(); $opts = $this->getOptions(); - if ( ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) + $config = $this->getConfig(); + if ( ( $config->get( 'EnotifWatchlist' ) || $config->get( 'ShowUpdatedMarker' ) ) && $request->getVal( 'reset' ) && $request->wasPosted() ) { @@ -198,8 +197,6 @@ class SpecialWatchlist extends ChangesListSpecialPage { * @return bool|ResultWrapper Result or false (for Recentchangeslinked only) */ public function doMainQuery( $conds, $opts ) { - global $wgShowUpdatedMarker; - $dbr = $this->getDB(); $user = $this->getUser(); @@ -238,7 +235,7 @@ class SpecialWatchlist extends ChangesListSpecialPage { ), ); - if ( $wgShowUpdatedMarker ) { + if ( $this->getConfig()->get( 'ShowUpdatedMarker' ) ) { $fields[] = 'wl_notificationtimestamp'; } if ( $limitWatchlist ) { @@ -332,8 +329,6 @@ class SpecialWatchlist extends ChangesListSpecialPage { * @param FormOptions $opts */ public function outputChangesList( $rows, $opts ) { - global $wgShowUpdatedMarker, $wgRCShowWatchingUsers; - $dbr = $this->getDB(); $user = $this->getUser(); $output = $this->getOutput(); @@ -366,13 +361,13 @@ class SpecialWatchlist extends ChangesListSpecialPage { $rc = RecentChange::newFromRow( $obj ); $rc->counter = $counter++; - if ( $wgShowUpdatedMarker ) { + if ( $this->getConfig()->get( 'ShowUpdatedMarker' ) ) { $updated = $obj->wl_notificationtimestamp; } else { $updated = false; } - if ( $wgRCShowWatchingUsers && $user->getOption( 'shownumberswatching' ) ) { + if ( $this->getConfig()->get( 'RCShowWatchingUsers' ) && $user->getOption( 'shownumberswatching' ) ) { $rc->numberofWatchingusers = $dbr->selectField( 'watchlist', 'COUNT(*)', array( @@ -494,14 +489,13 @@ class SpecialWatchlist extends ChangesListSpecialPage { } function setTopText( FormOptions $opts ) { - global $wgEnotifWatchlist, $wgShowUpdatedMarker; - $nondefaults = $opts->getChangedValues(); $form = ""; $user = $this->getUser(); $dbr = $this->getDB(); $numItems = $this->countItems( $dbr ); + $showUpdatedMarker = $this->getConfig()->get( 'ShowUpdatedMarker' ); // Show watchlist header $form .= "

    "; @@ -509,16 +503,16 @@ class SpecialWatchlist extends ChangesListSpecialPage { $form .= $this->msg( 'nowatchlist' )->parse() . "\n"; } else { $form .= $this->msg( 'watchlist-details' )->numParams( $numItems )->parse() . "\n"; - if ( $wgEnotifWatchlist && $user->getOption( 'enotifwatchlistpages' ) ) { + if ( $this->getConfig()->get( 'EnotifWatchlist' ) && $user->getOption( 'enotifwatchlistpages' ) ) { $form .= $this->msg( 'wlheader-enotif' )->parse() . "\n"; } - if ( $wgShowUpdatedMarker ) { + if ( $showUpdatedMarker ) { $form .= $this->msg( 'wlheader-showupdated' )->parse() . "\n"; } } $form .= "

    "; - if ( $numItems > 0 && $wgShowUpdatedMarker ) { + if ( $numItems > 0 && $showUpdatedMarker ) { $form .= Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getPageTitle()->getLocalURL(), 'id' => 'mw-watchlist-resetbutton' ) ) . "\n" . diff --git a/includes/specials/SpecialWhatlinkshere.php b/includes/specials/SpecialWhatlinkshere.php index 60ac02f2a3..7dc6da1f70 100644 --- a/includes/specials/SpecialWhatlinkshere.php +++ b/includes/specials/SpecialWhatlinkshere.php @@ -42,7 +42,6 @@ class SpecialWhatLinksHere extends IncludableSpecialPage { } function execute( $par ) { - global $wgQueryPageDefaultLimit; $out = $this->getOutput(); $this->setHeaders(); @@ -52,7 +51,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage { $opts->add( 'target', '' ); $opts->add( 'namespace', '', FormOptions::INTNULL ); - $opts->add( 'limit', $wgQueryPageDefaultLimit ); + $opts->add( 'limit', $this->getConfig()->get( 'QueryPageDefaultLimit' ) ); $opts->add( 'from', 0 ); $opts->add( 'back', 0 ); $opts->add( 'hideredirs', false ); @@ -101,8 +100,6 @@ class SpecialWhatLinksHere extends IncludableSpecialPage { * @param int $back Display from this article ID at backwards scrolling (default: 0) */ function showIndirectLinks( $level, $target, $limit, $from = 0, $back = 0 ) { - global $wgMaxRedirectLinksRetrieved, $wgUseLinkNamespaceDBFields; - $out = $this->getOutput(); $dbr = wfGetDB( DB_SLAVE ); @@ -126,9 +123,10 @@ class SpecialWhatLinksHere extends IncludableSpecialPage { 'il_to' => $target->getDBkey(), ); + $useLinkNamespaceDBFields = $this->getConfig()->get( 'UseLinkNamespaceDBFields' ); $namespace = $this->opts->getValue( 'namespace' ); if ( is_int( $namespace ) ) { - if ( $wgUseLinkNamespaceDBFields ) { + if ( $useLinkNamespaceDBFields ) { $conds['pagelinks']['pl_from_namespace'] = $namespace; $conds['templatelinks']['tl_from_namespace'] = $namespace; $conds['imagelinks']['il_from_namespace'] = $namespace; @@ -151,8 +149,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage { $conds['pagelinks'][] = 'rd_from is NOT NULL'; } - $queryFunc = function ( $dbr, $table, $fromCol ) use ( $conds, $target, $limit ) { - global $wgUseLinkNamespaceDBFields; + $queryFunc = function ( $dbr, $table, $fromCol ) use ( $conds, $target, $limit, $useLinkNamespaceDBFields ) { // Read an extra row as an at-end check $queryLimit = $limit + 1; $on = array( @@ -160,7 +157,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage { 'rd_title' => $target->getDBkey(), 'rd_interwiki = ' . $dbr->addQuotes( '' ) . ' OR rd_interwiki IS NULL' ); - if ( $wgUseLinkNamespaceDBFields ) { // migration check + if ( $useLinkNamespaceDBFields ) { // migration check $on['rd_namespace'] = $target->getNamespace(); } // Inner LIMIT is 2X in case of stale backlinks with wrong namespaces @@ -278,7 +275,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage { if ( $row->rd_from && $level < 2 ) { $out->addHTML( $this->listItem( $row, $nt, $target, true ) ); - $this->showIndirectLinks( $level + 1, $nt, $wgMaxRedirectLinksRetrieved ); + $this->showIndirectLinks( $level + 1, $nt, $this->getConfig()->get( 'MaxRedirectLinksRetrieved' ) ); $out->addHTML( Xml::closeElement( 'li' ) ); } else { $out->addHTML( $this->listItem( $row, $nt, $target ) ); @@ -415,8 +412,6 @@ class SpecialWhatLinksHere extends IncludableSpecialPage { } function whatlinkshereForm() { - global $wgScript; - // We get nicer value from the title object $this->opts->consumeValue( 'target' ); // Reset these for new requests @@ -426,7 +421,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage { $namespace = $this->opts->consumeValue( 'namespace' ); # Build up the form - $f = Xml::openElement( 'form', array( 'action' => $wgScript ) ); + $f = Xml::openElement( 'form', array( 'action' => wfScript() ) ); # Values that should not be forgotten $f .= Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ); diff --git a/includes/specials/SpecialWithoutinterwiki.php b/includes/specials/SpecialWithoutinterwiki.php index e05faefb97..bd01461395 100644 --- a/includes/specials/SpecialWithoutinterwiki.php +++ b/includes/specials/SpecialWithoutinterwiki.php @@ -41,8 +41,6 @@ class WithoutInterwikiPage extends PageQueryPage { } function getPageHeader() { - global $wgScript; - # Do not show useless input form if special page is cached if ( $this->isCached() ) { return ''; @@ -51,7 +49,7 @@ class WithoutInterwikiPage extends PageQueryPage { $prefix = $this->prefix; $t = $this->getPageTitle(); - return Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) . "\n" . + return Html::openElement( 'form', array( 'method' => 'get', 'action' => wfScript() ) ) . "\n" . Html::openElement( 'fieldset' ) . "\n" . Html::element( 'legend', null, $this->msg( 'withoutinterwiki-legend' )->text() ) . "\n" . Html::hidden( 'title', $t->getPrefixedText() ) . "\n" . diff --git a/includes/title/MediaWikiTitleCodec.php b/includes/title/MediaWikiTitleCodec.php index 12b7143f33..6ca0799c8e 100644 --- a/includes/title/MediaWikiTitleCodec.php +++ b/includes/title/MediaWikiTitleCodec.php @@ -206,6 +206,7 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser { # Initialisation $parts = array( 'interwiki' => '', + 'local_interwiki' => false, 'fragment' => '', 'namespace' => $defaultNamespace, 'dbkey' => $dbkey, @@ -282,6 +283,7 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser { $mainPage = Title::newMainPage(); return array( 'interwiki' => $mainPage->getInterwiki(), + 'local_interwiki' => true, 'fragment' => $mainPage->getFragment(), 'namespace' => $mainPage->getNamespace(), 'dbkey' => $mainPage->getDBkey(), @@ -289,6 +291,8 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser { ); } $parts['interwiki'] = ''; + # local interwikis should behave like initial-colon links + $parts['local_interwiki'] = true; # Do another namespace split... continue 2; diff --git a/includes/upload/UploadBase.php b/includes/upload/UploadBase.php index 6a6b358aae..4d74a2df70 100644 --- a/includes/upload/UploadBase.php +++ b/includes/upload/UploadBase.php @@ -377,11 +377,12 @@ abstract class UploadBase { } /** - * Verify the mime type. + * Verify the MIME type. * - * @note Only checks that it is not an evil mime. The "does it have - * correct extension given its mime type?" check is in verifyFile. - * @param string $mime Representing the mime + * @note Only checks that it is not an evil MIME. The "does it have + * correct extension given its MIME type?" check is in verifyFile. + * in `verifyFile()` that MIME type and file extension correlate. + * @param string $mime Representing the MIME * @return mixed True if the file is verified, an array otherwise */ protected function verifyMimeType( $mime ) { @@ -396,7 +397,7 @@ abstract class UploadBase { return array( 'filetype-badmime', $mime ); } - # Check IE type + # Check what Internet Explorer would detect $fp = fopen( $this->mTempPath, 'rb' ); $chunk = fread( $fp, 256 ); fclose( $fp ); @@ -487,7 +488,7 @@ abstract class UploadBase { $this->mFileProps = FSFile::getPropsFromPath( $this->mTempPath, $this->mFinalExtension ); - # check mime type, if desired + # check MIME type, if desired $mime = $this->mFileProps['file-mime']; $status = $this->verifyMimeType( $mime ); if ( $status !== true ) { @@ -995,9 +996,9 @@ abstract class UploadBase { } /** - * Checks if the mime type of the uploaded file matches the file extension. + * Checks if the MIME type of the uploaded file matches the file extension. * - * @param string $mime The mime type of the uploaded file + * @param string $mime The MIME type of the uploaded file * @param string $extension The filename extension that the file is to be served with * @return bool */ @@ -1050,7 +1051,7 @@ abstract class UploadBase { * positives in some situations. * * @param string $file Pathname to the temporary upload file - * @param string $mime The mime type of the file + * @param string $mime The MIME type of the file * @param string $extension The extension of the file * @return bool True if the file contains something looking like embedded scripts */ diff --git a/includes/upload/UploadStash.php b/includes/upload/UploadStash.php index 23a7a3a8fe..7d80b4489e 100644 --- a/includes/upload/UploadStash.php +++ b/includes/upload/UploadStash.php @@ -443,7 +443,7 @@ class UploadStash { } /** - * Find or guess extension -- ensuring that our extension matches our mime type. + * Find or guess extension -- ensuring that our extension matches our MIME type. * Since these files are constructed from php tempnames they may not start off * with an extension. * XXX this is somewhat redundant with the checks that ApiUpload.php does with incoming @@ -460,7 +460,7 @@ class UploadStash { if ( $n !== false ) { $extension = $n ? substr( $path, $n + 1 ) : ''; } else { - // If not, assume that it should be related to the mime type of the original file. + // If not, assume that it should be related to the MIME type of the original file. $magic = MimeMagic::singleton(); $mimeType = $magic->guessMimeType( $path ); $extensions = explode( ' ', MimeMagic::singleton()->getExtensionsForType( $mimeType ) ); diff --git a/languages/Language.php b/languages/Language.php index 8b41b4efc4..99dc184561 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -2351,7 +2351,7 @@ class Language { * Get the formatted date and time for the given timestamp and formatted for * the given user. * - * @param mixed $ts the time format which needs to be turned into a + * @param mixed $ts The time format which needs to be turned into a * date('YmdHis') format with wfTimestamp(TS_MW,$ts) * @param User $user User object used to get preferences for timezone and format * @param array $options Array, can contain the following keys: @@ -3786,8 +3786,8 @@ class Language { * * @since 1.23 * - * @param int $count non-localized number - * @param array $forms different plural forms + * @param int $count Non-localized number + * @param array $forms Different plural forms * * @return array|string */ @@ -4024,12 +4024,12 @@ class Language { * possible that non-existing link in one variant * actually exists in another variant. this function * tries to find it. See e.g. LanguageZh.php + * The input parameters may be modified upon return * - * @param string $link The name of the link - * @param Title $nt The title object of the link + * @param string &$link The name of the link + * @param Title &$nt The title object of the link * @param bool $ignoreOtherCond To disable other conditions when * we need to transclude a template or update a category's link - * @return null the input parameters may be modified upon return */ public function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) { $this->mConverter->findVariantLink( $link, $nt, $ignoreOtherCond ); diff --git a/languages/LanguageConverter.php b/languages/LanguageConverter.php index b3a4c1a8ad..abca495e4f 100644 --- a/languages/LanguageConverter.php +++ b/languages/LanguageConverter.php @@ -54,7 +54,7 @@ class LanguageConverter { public $mManualLevel; /** - * @var string memcached key name + * @var string Memcached key name */ public $mCacheKey; @@ -737,12 +737,12 @@ class LanguageConverter { * If a language supports multiple variants, it is possible that * non-existing link in one variant actually exists in another variant. * This function tries to find it. See e.g. LanguageZh.php + * The input parameters may be modified upon return * - * @param string $link The name of the link - * @param mixed $nt The title object of the link + * @param string &$link The name of the link + * @param Title &$nt The title object of the link * @param bool $ignoreOtherCond To disable other conditions when * we need to transclude a template or update a category's link - * @return void Null, the input parameters may be modified upon return */ public function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) { # If the article has already existed, there is no need to diff --git a/languages/Names.php b/languages/Names.php index e1b03b50a1..2051a5b7d0 100644 --- a/languages/Names.php +++ b/languages/Names.php @@ -52,7 +52,7 @@ 'ar' => 'العربية', # Arabic 'arc' => 'ܐܪܡܝܐ', # Aramaic 'arn' => 'mapudungun', # Mapuche, Mapudungu, Araucanian (Araucano) - 'arq' => 'جزائري', # Algerian Spoken Arabic + 'arq' => 'جازايرية', # Algerian Spoken Arabic 'ary' => 'Maġribi', # Moroccan Spoken Arabic 'arz' => 'مصرى', # Egyptian Spoken Arabic 'as' => 'অসমীয়া', # Assamese diff --git a/languages/classes/LanguageIu.php b/languages/classes/LanguageIu.php index 1d279d635f..db3a22cac2 100644 --- a/languages/classes/LanguageIu.php +++ b/languages/classes/LanguageIu.php @@ -142,8 +142,8 @@ class IuConverter extends LanguageConverter { * names as they were * - do not try to find variants for usernames * - * @param string $link - * @param Title $nt + * @param string &$link + * @param Title &$nt * @param bool $ignoreOtherCond */ function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) { diff --git a/languages/classes/LanguageKk.php b/languages/classes/LanguageKk.php index 3d05b81c92..1a09818077 100644 --- a/languages/classes/LanguageKk.php +++ b/languages/classes/LanguageKk.php @@ -250,8 +250,8 @@ class KkConverter extends LanguageConverter { * names as they were * - do not try to find variants for usernames * - * @param string $link - * @param Title $nt + * @param string &$link + * @param Title &$nt * @param bool $ignoreOtherCond */ function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) { diff --git a/languages/classes/LanguageKu.php b/languages/classes/LanguageKu.php index f74be05e46..1fdebc2764 100644 --- a/languages/classes/LanguageKu.php +++ b/languages/classes/LanguageKu.php @@ -160,8 +160,8 @@ class KuConverter extends LanguageConverter { * names as they were * - do not try to find variants for usernames * - * @param string $link - * @param Title $nt + * @param string &$link + * @param Title &$nt * @param bool $ignoreOtherCond */ function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) { diff --git a/languages/classes/LanguageShi.php b/languages/classes/LanguageShi.php index a22730c901..105a3af746 100644 --- a/languages/classes/LanguageShi.php +++ b/languages/classes/LanguageShi.php @@ -118,8 +118,8 @@ class ShiConverter extends LanguageConverter { * names as they were * - do not try to find variants for usernames * - * @param string $link - * @param Title $nt + * @param string &$link + * @param Title &$nt * @param bool $ignoreOtherCond */ function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) { diff --git a/languages/classes/LanguageSr.php b/languages/classes/LanguageSr.php index 80099ac140..bdf1ec4143 100644 --- a/languages/classes/LanguageSr.php +++ b/languages/classes/LanguageSr.php @@ -108,8 +108,8 @@ class SrConverter extends LanguageConverter { * names as they were * - do not try to find variants for usernames * - * @param string $link - * @param Title $nt + * @param string &$link + * @param Title &$nt * @param bool $ignoreOtherCond */ function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) { diff --git a/languages/classes/LanguageZh.php b/languages/classes/LanguageZh.php index dfdc6b1f87..67f8769bf2 100644 --- a/languages/classes/LanguageZh.php +++ b/languages/classes/LanguageZh.php @@ -166,7 +166,7 @@ class LanguageZh extends LanguageZh_hans { * auto convert to zh-hans and normalize special characters. * * @param string $string - * @param string $autoVariant default to 'zh-hans' + * @param string $autoVariant Defaults to 'zh-hans' * @return string */ function normalizeForSearch( $string, $autoVariant = 'zh-hans' ) { diff --git a/languages/i18n/ar.json b/languages/i18n/ar.json index 1589a8bba0..23fb0e9862 100644 --- a/languages/i18n/ar.json +++ b/languages/i18n/ar.json @@ -857,7 +857,6 @@ "searchprofile-advanced-tooltip": "ابحث في النطاقات المخصصة", "search-result-size": "$1 ({{PLURAL:$2|لا كلمات|كلمة واحدة|كلمتان|$2 كلمات|$2 كلمة}})", "search-result-category-size": "{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوًا|$1 عضو}} ({{PLURAL:$2|لا تصانيف فرعية|تصنيف فرعي واحد|تصنيفان فرعيان|$2 تصنيفات فرعية|$2 تصنيفًا فرعيًا|$2 تصنيف فرعي}} و{{PLURAL:$3|لا ملفات|ملف واحد|ملفان|$3 ملفات|$3 ملفًا|$3 ملف}})", - "search-result-score": "الارتباط: $1%", "search-redirect": "(تحويلة $1)", "search-section": "(قسم $1)", "search-file-match": "(يطابق محتوى الملف)", @@ -877,7 +876,7 @@ "powersearch-togglelabel": "اختر:", "powersearch-toggleall": "الكل", "powersearch-togglenone": "لا شيء", - "powersearch-remember": "تذكر الاختيار لبحث المستقبل", + "powersearch-remember": "تذكر الخيارات للبحث مستقبلا", "search-external": "بحث خارجي", "searchdisabled": "البحث في {{SITENAME}} معطل.\nيمكنك البحث من خلال جوجل في الوقت الحالي.\nلاحظ أن فهارسه لمحتوى {{SITENAME}} ربما تكون غير محدثة.", "search-error": "حدث خطأ ما أثناء البحث: $1", @@ -1259,8 +1258,6 @@ "uploadwarning": "تحذير الرفع", "uploadwarning-text": "من فضلك عدل وصف الملف أدناه وحاول مرة أخرى.", "savefile": "احفظ الملف", - "uploadedimage": "رفع \"[[$1]]\"", - "overwroteimage": "رفع نسخة جديدة من \"[[$1]]\"", "uploaddisabled": "تم تعطيل الرفع", "copyuploaddisabled": "الرفع من مسار معطل.", "uploaddisabledtext": "رفع الملفات معطل.", diff --git a/languages/i18n/arq.json b/languages/i18n/arq.json index 9b1224830a..c5e815bdf1 100644 --- a/languages/i18n/arq.json +++ b/languages/i18n/arq.json @@ -3,7 +3,8 @@ "authors": [ "Bachounda", "Oldstoneage", - "아라" + "아라", + "Amire80" ] }, "tog-underline": "تسطار الوصيلات:", @@ -466,7 +467,6 @@ "upload": "طلع فيشي", "uploadlogpage": "ريجيستر رفع الفيشيات", "filedesc": "ملخص", - "uploadedimage": "راه طلع \"[[$1]]\"", "license": "ترخيص:", "license-header": "ترخيص:", "file-anchor-link": "ملف", @@ -486,7 +486,7 @@ "sharedupload-desc-here": "هاذ الملف جاي من $1. يمكن يكون مستعمل من بروجيات وحد أخرين.\nالتوصيف نتاعو في [$2 باجت الصفات] محطوطه هنا لتحت.", "randompage": "باجة على الزهر", "statistics": "إحصاويّات", - "nbytes": "$1 اوكتي{{PLURAL:$1||s}}", + "nbytes": "{{PLURAL:$1|بايت 1|$1 بايت}}", "nmembers": "$1 اعضاء{{PLURAL:$1||s}}", "prefixindex": "كامل الباجات الباديه ب", "usercreated": "{{GENDER:$3|صنعه|صنعته}} في $1 الساعة $2", diff --git a/languages/i18n/ast.json b/languages/i18n/ast.json index f606979c59..b56b42509a 100644 --- a/languages/i18n/ast.json +++ b/languages/i18n/ast.json @@ -166,7 +166,7 @@ "tagline": "De {{SITENAME}}", "help": "Ayuda", "search": "Buscar", - "searchbutton": "Buscar", + "searchbutton": "Guetar", "go": "Dir", "searcharticle": "Dir", "history": "Historial de la páxina", @@ -265,6 +265,9 @@ "hidetoc": "anubrir", "collapsible-collapse": "Plegar", "collapsible-expand": "Espander", + "confirmable-confirm": "¿Tas {{GENDER:$1|seguru|segura}}?", + "confirmable-yes": "Sí", + "confirmable-no": "Non", "thisisdeleted": "¿Ver o restaurar $1?", "viewdeleted": "¿Ver $1?", "restorelink": "{{PLURAL:$1|una edición desaniciada|$1 ediciones desaniciaes}}", @@ -349,7 +352,7 @@ "invalidtitle-knownnamespace": "Títulu inválidu col espaciu de nomes «$2» ya'l testu «$3»", "invalidtitle-unknownnamespace": "Títulu inválidu col númberu $1 d'espaciu de nomes desconocíu ya'l testu «$2»", "exception-nologin": "Nun anició sesión", - "exception-nologin-text": "Por favor, [[Special:Userlogin|anicie sesión]] pa tener accesu a esta páxina o aición.", + "exception-nologin-text": "Por favor, anicia sesión pa tener accesu a esta páxina o aición.", "exception-nologin-text-manual": "Por favor, $1 pa tener accesu a esta páxina o aición.", "virus-badscanner": "Fallu de configuración: Escáner de virus desconocíu: ''$1''", "virus-scanfailed": "fallu d'escanéu (códigu $1)", @@ -662,10 +665,10 @@ "parser-template-recursion-depth-warning": "Se pasó la llende de fondura recursiva de les plantíes ($1)", "language-converter-depth-warning": "Se pasó la llende de fondura del convertidor de llingües ($1)", "node-count-exceeded-category": "Páxines onde se pasó la cuenta de noyos", - "node-count-exceeded-category-desc": "Una categoría pa les páxines onde se supera la cuenta de noyos.", - "node-count-exceeded-warning": "La páxina pasó la cuenta de nodios", + "node-count-exceeded-category-desc": "La páxina supera la cuenta máxima de noyos.", + "node-count-exceeded-warning": "La páxina superó la cuenta de noyos", "expansion-depth-exceeded-category": "Páxines onde se pasó la fondura d'espansión", - "expansion-depth-exceeded-category-desc": "Esta ye una categoría pa les páxines onde se pasó la fondura d'espansión.", + "expansion-depth-exceeded-category-desc": "La páxina superó la fondura máxima d'espansión.", "expansion-depth-exceeded-warning": "La páxina pasó la fondura d'espansión", "parser-unstrip-loop-warning": "Deteutóse un bucle \"unstrip\"", "parser-unstrip-recursion-limit": "Pasóse la llende de recursividá d'unstrip ($1)", @@ -833,7 +836,6 @@ "searchprofile-advanced-tooltip": "Buscar nos espacios de nomes personalizaos", "search-result-size": "$1 ({{PLURAL:$2|1 pallabra|$2 pallabres}})", "search-result-category-size": "{{PLURAL:$1|1 miembru|$1 miembros}} ({{PLURAL:$2|1 subcategoría|$2 subcategories}}, {{PLURAL:$3|1 ficheru|$3 ficheros}})", - "search-result-score": "Relevancia: $1%", "search-redirect": "(redireición de $1)", "search-section": "(seición $1)", "search-file-match": "(casa col conteníu del ficheru)", @@ -860,7 +862,7 @@ "preferences": "Preferencies", "mypreferences": "Preferencies", "prefs-edits": "Númberu d'ediciones:", - "prefsnologintext2": "Por favor, $1 pa configurar les preferencies d'usuariu", + "prefsnologintext2": "Por favor, anicia sesión pa cambiar les tos preferencies.", "prefs-skin": "Apariencia", "skin-preview": "Vista previa", "datedefault": "Ensin preferencia", @@ -1237,8 +1239,6 @@ "uploadwarning": "Avisu de xubíes de ficheros", "uploadwarning-text": "Por favor, camuda más abaxo la descripción del ficheru y vuelve a tentalo.", "savefile": "Guardar ficheru", - "uploadedimage": "xubió \"[[$1]]\"", - "overwroteimage": "xubió una versión nueva de \"[[$1]]\"", "uploaddisabled": "Deshabilitaes les xubíes", "copyuploaddisabled": "Xubir por URL ta desactivao.", "uploaddisabledtext": "Les xubíes de ficheros tán desactivaes.", @@ -1646,11 +1646,11 @@ "trackingcategories-desc": "Criterios d'inclusión de categoría", "noindex-category-desc": "La páxina contién una pallabra máxica __NOINDEX__ (y ta nun espaciu de nomes nel que se permite esta marca) y, poro, los robots nun la indexarán.", "index-category-desc": "La páxina contién una pallabra máxica __INDEX__ (y ta nun espaciu de nomes nel que se permite esta marca) y, poro, los robots la indexarán anque normalmente nun lo faigan.", - "post-expand-template-inclusion-category-desc": "Después de espander toles plantíes, el tamañu de la páxina ye mayor que $wgMaxArticleSize; de mou qu'algunes plantíes nun s'espandieron.", - "post-expand-template-argument-category-desc": "Después d'espander l'argumentu d'una plantía (daqué ente llaves triples, como {{{Daqué}}}), la páxina ye mayor que $wgMaxArticleSize.", - "expensive-parserfunction-category-desc": "Hai demasiaes funciones analítiques costoses (como #ifexist) incluíes nuna páxina. Vea [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", - "broken-file-category-desc": "Categoría amestada si la páxina contién un enllaz de ficheru frañáu (un enllaz pa incrustar un ficheru cuando'l ficheru nun esiste).", - "hidden-category-category-desc": "Esta ye una categoría que contién la pallabra máxica __HIDDENCAT__, que torga que s'amuese de mou predetermináu nel cuadru d'enllaces de categoría de les páxines.", + "post-expand-template-inclusion-category-desc": "El tamañu de la páxina ye mayor que $wgMaxArticleSize después de espander toles plantíes, de mou qu'algunes plantíes nun s'espandieron.", + "post-expand-template-argument-category-desc": "La páxina ye mayor que $wgMaxArticleSize después d'espander l'argumentu d'una plantía (daqué ente llaves triples, como {{{Daqué}}}).", + "expensive-parserfunction-category-desc": "La páxina usa demasiaes funciones analítiques costoses (como #ifexist). Llei [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", + "broken-file-category-desc": "La páxina contién un enllaz frañáu a un ficheru (un enllaz pa incrustar un ficheru cuando'l ficheru nun esiste).", + "hidden-category-category-desc": "La categoría contién __HIDDENCAT__ nel conteníu de páxina, que torga de mou predetermináu que s'amuese nel cuadru d'enllaces de categoría de les páxines.", "trackingcategories-nodesc": "Nun hai una descripción disponible.", "trackingcategories-disabled": "La categoría ta desactivada", "mailnologin": "Ensin direición d'unviu", @@ -1687,7 +1687,7 @@ "mywatchlist": "Llista de siguimientu", "watchlistfor2": "Pa $1 $2", "nowatchlist": "La to llista de siguimientu ta vacia.", - "watchlistanontext": "Tienes d'$1 pa ver o editar entraes de la to llista de siguimientu.", + "watchlistanontext": "Por favor, anicia sesión pa ver o editar entraes de la to llista de siguimientu.", "watchnologin": "Non identificáu", "addwatch": "Amestar a la llista de siguimientu", "addedwatchtext": "La páxina \"[[:$1]]\" s'amestó a la to [[Special:Watchlist|llista de llista de siguimientu]].\nLos cambeos futuros nesta páxina y na so páxina d'alderique asociada apaecerán allí.", @@ -1848,7 +1848,7 @@ "undelete-search-title": "Buscar páxines desaniciaes", "undelete-search-box": "Buscar páxines desaniciaes", "undelete-search-prefix": "Amosar páxines qu'empecipien por:", - "undelete-search-submit": "Buscar", + "undelete-search-submit": "Guetar", "undelete-no-results": "Nun s'atoparon páxines afechisques a la busca nel archivu d'esborraos.", "undelete-filename-mismatch": "Nun se pue restaurar la revisión del archivu con fecha $1: el nome d'archivu nun concuaya", "undelete-bad-store-key": "Nun se pue restaurar la revisión del archivu con fecha $1: yá nun esistía l'archivu nel momentu d'esborralu.", @@ -1911,7 +1911,7 @@ "autoblockid": "Autobloquiar #$1", "block": "Bloquiar usuariu", "unblock": "Desbloquiar usuariu", - "blockip": "Bloquiar usuariu", + "blockip": "Bloquiar {{GENDER:$1|al usuariu|a la usuaria}}", "blockip-legend": "Bloquiar usuariu", "blockiptext": "Usa'l siguiente formulariu pa bloquiar el permisu d'escritura a una IP o a un usuariu concretu.\nEsto debería facese sólo pa prevenir vandalismu como indiquen les [[{{MediaWiki:Policy-url}}|polítiques]]. Da un motivu específicu (como por exemplu citar páxines que fueron vandalizaes).", "ipaddressorusername": "Direición IP o nome d'usuariu:", @@ -1940,7 +1940,7 @@ "ipb-unblock-addr": "Desbloquiar $1", "ipb-unblock": "Desbloquiar un nome d'usuariu o direición IP", "ipb-blocklist": "Ver los bloqueos esistentes", - "ipb-blocklist-contribs": "Contribuciones de $1", + "ipb-blocklist-contribs": "Collaboraciones de {{GENDER:$1|$1}}", "unblockip": "Desbloquiar usuariu", "unblockiptext": "Usa'l formulariu d'abaxo pa restablecer l'accesu d'escritura a una direicion IP o a un nome d'usuariu previamente bloquiáu.", "ipusubmit": "Desaniciar esti bloquéu", @@ -2381,7 +2381,7 @@ "newimages-label": "Nome d'archivu (o una parte d'él):", "newimages-showbots": "Ver les xubíes de los bots", "noimages": "Nun hai nada que ver.", - "ilsubmit": "Buscar", + "ilsubmit": "Guetar", "bydate": "por fecha", "sp-newimages-showfrom": "Amosar los archivos nuevos emprimando dende'l $1 a les $2", "seconds": "{{PLURAL:$1|$1 segundu|$1 segundos}}", @@ -3001,6 +3001,9 @@ "logentry-rights-rights": "$1 {{GENDER:$2|camudó}} la pertenencia a grupos de $3 dende $4 a $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|camudó}} la pertenencia a grupos de $3", "logentry-rights-autopromote": "$1 {{GENDER:$2|promocionó}} automáticamente de $4 a $5", + "logentry-upload-upload": "$1 {{GENDER:$2|xubió}} $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|xubió}} una versión nueva de $3", + "logentry-upload-revert": "$1 {{GENDER:$2|xubió}} $3", "rightsnone": "(nengún)", "feedback-bugornote": "Si tas preparáu pa describir un problema técnicu en detalle, [$1 informa del fallu].\nD'otra miente, pues usar el formulariu cenciellu d'abaxo. El to comentariu apaecerá na páxina \"[$3 $2]\" xunto col to nome d'usuariu y el restolador qu'uses.", "feedback-subject": "Asuntu:", @@ -3103,5 +3106,9 @@ "action-pagelang": "cambiar la llingua de la páxina", "log-name-pagelang": "Rexistru de cambios de llingua", "log-description-pagelang": "Esti ye un rexistru de los cambios de llingua de les páxines.", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2|cambió}} la llingua de la páxina $3 del $4 al $5." + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|cambió}} la llingua de la páxina $3 del $4 al $5.", + "default-skin-not-found": "¡Coime! L'aspeutu predetermináu pa la to wiki ($wgDefaultSkin), $1 nun ta disponible.\n\nLa to instalación paez qu'incluye los siguientes aspeutos. Llei [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] pa más información sobro cómo activalos y escoyer el predetermináu.\n\n$2\n\n; Si acabes d'instalar MediaWiki:\n: Probablemente instalasti dende git, o'l códigu fonte direutamente usando algún otru métodu. Esto ye d'esperar. Intenta instalar dellos aspeutos dende'l [https://www.mediawiki.org/wiki/Category:All_skins direutoriu d'aspeutos de mediawiki.org's], asina:\n:* Descargando [https://www.mediawiki.org/wiki/Download l'instalador tarball], que vien con dellos aspeutos y estensiones. Pues copiar y apegar el direutoriu skins/ d'ehí.\n:* Clonando unu de los direutorios mediawiki/skins/* via git nel direutoriu skins/ de la to instalación de MediaWiki.\n: Facer esto nun tendría d'interferir col to repositoriu git si yes un desendolcador de MediaWiki.\n\n; Si acabes d'anovar MediaWiki:\n: MediaWiki 1.24 y más nuevu yá nun activa automáticamente los aspeutos instalaos (llei [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Pues apegar les llinies siguientes en LocalSettings.php p'activar tolos aspeutos instalaos actualmente:\n\n
    $3
    \n\n; Si acabes d'editar LocalSettings.php:\n: Vuelvi a comprobar los nomes de los aspeutos por si hai errores d'escritura.", + "default-skin-not-found-no-skins": "¡Coime! L'aspeutu predetermináu pa la to wiki ($wgDefaultSkin), $1 nun ta disponible.\n\nNun tienes aspeutos instalaos.\n\n; Si acabes d'instalar MediaWiki:\n: Probablemente instalasti dende git, o'l códigu fonte direutamente usando algún otru métodu. Esto ye d'esperar. MediaWiki 1.24 y más nuevu nun incluye nengún aspeutu nel repositoriu principal. Intenta instalar dellos aspeutos dende'l [https://www.mediawiki.org/wiki/Category:All_skins direutoriu d'aspeutos de mediawiki.org], asina:\n:* Descargando [https://www.mediawiki.org/wiki/Download l'instalador tarball], que vien con dellos aspeutos y estensiones. Pues copiar y apegar el direutoriu skins/ d'ehí.\n:* Clonando unu de los direutorios mediawiki/skins/* via git nel direutoriu skins/ de la to instalación de MediaWiki.\n: Facer esto nun tendría d'interferir col to repositoriu git si yes un desendolcador de MediaWiki. Llei [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] pa más información sobro cómo activar los aspeutos y escoyer el predetermináu.", + "default-skin-not-found-row-enabled": "* $1 / $2 (activáu)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''desactiváu''')" } diff --git a/languages/i18n/az.json b/languages/i18n/az.json index b3cf3a2246..0b75926c13 100644 --- a/languages/i18n/az.json +++ b/languages/i18n/az.json @@ -246,7 +246,7 @@ "mainpage": "Ana Səhifə", "mainpage-description": "Ana Səhifə", "policy-url": "Project:Qaydalar", - "portal": "Kənd meydanı", + "portal": "İctimai portal", "portal-url": "Project:Kənd meydanı", "privacy": "Məxfilik siyasəti", "privacypage": "Project:Gizlilik prinsipi", @@ -743,7 +743,6 @@ "searchprofile-advanced-tooltip": "Ad aralığında axtar", "search-result-size": "$1 ({{PLURAL:$2|1 söz|$2 söz}})", "search-result-category-size": "{{PLURAL:$1|$1 element|$1 elementlər}} ({{PLURAL:$2|$2 alt kateqoriya|$2 alt kateqoriyalar}}, {{PLURAL:$3|$3 fayl|$3 fayllar}})", - "search-result-score": "Uyğunluq: $1%", "search-redirect": "(yönləndirmə $1)", "search-section": "(bölmə $1)", "search-suggest": "Bəlkə, bunu nəzərdə tuturdunuz: $1", @@ -1074,8 +1073,6 @@ "fileexists-extension": "Bu adda başqa bir fayl mövcuddur: [[$2|thumb]]\n* Yüklənilən faylın adı: [[:$1]]\n* Mövcud faylın adı: [[:$2]]\nXahiş edirik, başqa ad seçin.", "uploadwarning": "Yükləmə xəbərdarlığı", "savefile": "Faylı qeyd et", - "uploadedimage": "\"[[$1]]\" yükləndi", - "overwroteimage": "\"[[$1]]\"-in yeni versiyası yükləndi", "uploaddisabled": "Yükləmə baş tutmadı", "copyuploaddisabled": "URL-dən yükləmə baş tutmadı.", "uploaddisabledtext": "Fayl yüklənməsi baş tutmadı.", diff --git a/languages/i18n/be-tarask.json b/languages/i18n/be-tarask.json index 6cee818d10..cd1774147f 100644 --- a/languages/i18n/be-tarask.json +++ b/languages/i18n/be-tarask.json @@ -270,6 +270,9 @@ "hidetoc": "схаваць", "collapsible-collapse": "Згарнуць", "collapsible-expand": "Разгарнуць", + "confirmable-confirm": "Вы ўпэўненыя?", + "confirmable-yes": "Так", + "confirmable-no": "Не", "thisisdeleted": "Праглядзець ці аднавіць $1?", "viewdeleted": "Паказаць $1?", "restorelink": "$1 {{PLURAL:$1|выдаленую зьмену|выдаленыя зьмены|выдаленых зьменаў}}", @@ -354,7 +357,7 @@ "invalidtitle-knownnamespace": "Няслушная назва ў прасторы «$2»: «$3»", "invalidtitle-unknownnamespace": "Няслушная назва ў невядомай прасторы $1: «$2»", "exception-nologin": "Вы не ўвайшлі ў сыстэму", - "exception-nologin-text": "Неабходна [[Special:Userlogin|ўвайсьці]], каб атрымаць доступ да гэтай старонкі або дзеяньня.", + "exception-nologin-text": "Неабходна ўвайсьці, каб атрымаць доступ да гэтай старонкі або дзеяньня.", "exception-nologin-text-manual": "Неабходна $1, каб мець доступ да гэтай старонкі або дзеяньня.", "virus-badscanner": "Няслушная канфігурацыя: невядомы антывірусны сканэр: ''$1''", "virus-scanfailed": "памылка сканаваньня (код $1)", @@ -836,7 +839,6 @@ "searchprofile-advanced-tooltip": "Шукаць у дадатковых прасторах назваў", "search-result-size": "$1 ($2 {{PLURAL:$2|слова|словы|словаў}})", "search-result-category-size": "$1 {{PLURAL:$1|элемэнт|элемэнты|элемэнтаў}} ($2 {{PLURAL:$2|падкатэгорыя|падкатэгорыі|падкатэгорыяў}}, $3 {{PLURAL:|файл|файлы|файлаў}})", - "search-result-score": "Адпаведнасьць: $1%", "search-redirect": "(перанакіраваньне $1)", "search-section": "(сэкцыя $1)", "search-file-match": "(супадае зь зьмесьцівам файла)", @@ -1239,8 +1241,6 @@ "uploadwarning": "Папярэджаньне", "uploadwarning-text": "Калі ласка, зьмяніце апісаньне файла ніжэй і паспрабуйце ізноў.", "savefile": "Захаваць файл", - "uploadedimage": "загружаная «[[$1]]»", - "overwroteimage": "загружаная новая вэрсія «[[$1]]»", "uploaddisabled": "Загрузка файлаў забароненая", "copyuploaddisabled": "Загрузка праз URL-адрас адключаная.", "uploaddisabledtext": "Загрузка файлаў забароненая.", @@ -2178,9 +2178,9 @@ "importlogpage": "Журнал імпартаваньняў", "importlogpagetext": "Імпартаваньне адміністратарамі старонак з гісторыяй зьменаў зь іншых вікі.", "import-logentry-upload": "імпартавана [[$1]] праз загрузку файла", - "import-logentry-upload-detail": "$1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}}", + "import-logentry-upload-detail": "$1 {{PLURAL:$1|вэрсія імпартаваная|вэрсіі імпартаваныя|вэрсіяў імпартаваныя}}", "import-logentry-interwiki": "імпартавана зь іншай вікі $1", - "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}} з $2", + "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|вэрсія імпартаваная|вэрсіі імпартаваныя|вэрсіяў імпартаваныя}} з $2", "javascripttest": "Тэставаньне JavaScript", "javascripttest-title": "Праводзіцца тэставаньне $1", "javascripttest-pagetext-noframework": "Гэтая старонка трымаецца для правядзеньня тэстаў JavaScript.", @@ -3009,6 +3009,9 @@ "logentry-rights-rights": "$1 {{GENDER:$1|зьмяніў|зьмяніла}} прыналежнасьць $3 да групы з $4 на $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$1|зьмяніў|зьмяніла}} прыналежнасьць $3 да групаў", "logentry-rights-autopromote": "$1 {{GENDER:$1|быў аўтаматычна пераведзены|была аўтаматычна пераведзеная}} з групы $4 ў $5", + "logentry-upload-upload": "$1 {{GENDER:$2|загрузіў|загрузіла}} $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|загрузіў|загрузіла}} новую вэрсію $3", + "logentry-upload-revert": "$1 {{GENDER:$2|загрузіў|загрузіла}} $3", "rightsnone": "(няма)", "feedback-bugornote": "Калі Вы гатовы падрабязна апісаць тэхнічную праблему, калі ласка [$1 паведаміце пра памылку]. \nУ адваротным выпадку, Вы можаце выкарыстоўваць простую форму пададзеную ніжэй. Ваш камэнтар будзе дададзены на старонку «[$3 $2]», разам з Вашым іменем удзельніка і выкарыстоўваемым браўзэрам.", "feedback-subject": "Тэма:", @@ -3111,5 +3114,8 @@ "action-pagelang": "зьмену мовы старонкі", "log-name-pagelang": "Журнал зьменаў мовы", "log-description-pagelang": "Гэта журнал зьменаў мовы старонак.", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} мову старонкі $3 з $4 на $5." + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} мову старонкі $3 з $4 на $5.", + "default-skin-not-found": "Упс! Тэма афармленьня па змоўчаньні для вашай вікі ($wgDefaultSkin), $1 недаступная.\n\nВашае ўсталяваньне, падобна, уключае наступныя тэмы афармленьня. Глядзіце [https://www.mediawiki.org/wiki/Manual:Skin_configuration Інструкцыя:Наладка тэмаў афармленьня] дзеля інфармацыі, як падключыць іх і абраць тэму па змоўчаньні.\n\n$2\n\n; Калі вы толькі што ўсталявалі MediaWiki:\n: Напэўна вы ўсталявалі з git або наўпрост з крынічнага коду з ужываньнем іншага мэтаду. Гэта чакана. Паспрабуйце ўсталяваць некалькі тэмаў афармленьня з [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's каталёгу тэмаў]:\n:* Спампуйце [https://www.mediawiki.org/wiki/Download tarball-усталёўнік], які ўтрымлівае некалькі тэмаў і пашырэньняў. Вы можаце скапіяваць каталёг skins/ зь яго.\n:* Зрабіце клон аднаго з сховішчаў mediawiki/skins/* праз git у каталёг skins/ вашай усталёўкі MediaWiki.\n: Калі вы распрацоўнік MediaWiki, гэта не павінна ўплываць на вашае git-сховішча.\n\n; Калі вы толькі што абнавілі MediaWiki:\n: MediaWiki вэрсіі 1.24 і навейшыя больш не падключаюць тэмы афармленьня аўтаматычна (глядзіце [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Інструкцыя:Аўтаматычнае выяўленьне тэмаў афармленьня]). Вы можаце дадаць наступныя радкі ў LocalSettings.php, каб падключыць усе ўсталяваныя тэмы афармленьня:\n\n
    $3
    \n\n; Калі вы толькі што зьмянілі LocalSettings.php:\n: Пераправерце назвы тэмаў афармленьня на наяўнасьць памылак.", + "default-skin-not-found-row-enabled": "* $1 / $2 (уключана)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''адключана''')" } diff --git a/languages/i18n/be.json b/languages/i18n/be.json index d69a81b08a..40e840a077 100644 --- a/languages/i18n/be.json +++ b/languages/i18n/be.json @@ -362,7 +362,7 @@ "invalidtitle-knownnamespace": "Недапушчальны загаловак з прасторай імёнаў \"$2\" і тэкстам \"$3\"", "invalidtitle-unknownnamespace": "Недапушчальны загаловак з невядомым лікам прасторы імён $1 і тэкстам \"$2\"", "exception-nologin": "Вы не ўвайшлі ў сістэму", - "exception-nologin-text": "Належыць [[Special:Userlogin|прадставіцца сістэме]], каб мець доступ да гэтай старонкі ці дзеяння.", + "exception-nologin-text": "Належыць прадставіцца сістэме, каб мець доступ да гэтай старонкі ці дзеяння.", "exception-nologin-text-manual": "Належыць $1, каб мець доступ да гэтай старонкі ці дзеяння.", "virus-badscanner": "Некарэктная канфігурацыя: невядомы антывірусны сканер: ''$1''", "virus-scanfailed": "не ўдалося праверыць (код $1)", @@ -673,10 +673,10 @@ "parser-template-recursion-depth-warning": "Вычарпаны ліміт глыбіні ўключэння шаблонаў ($1)", "language-converter-depth-warning": "Перавышана глыбіня моўнага канвертэра ($1)", "node-count-exceeded-category": "Старонкі, якія перасягнулі колькасць вузлоў", - "node-count-exceeded-category-desc": "Катэгорыя для старонак, у якіх перавышана колькасць вузлоў.", + "node-count-exceeded-category-desc": "На старонцы перавышана максімальная колькасць вузлоў.", "node-count-exceeded-warning": "Старонка перасягнула колькасць вузлоў", "expansion-depth-exceeded-category": "Старонкі, якія перасягнулі глыбіню разгортвання", - "expansion-depth-exceeded-category-desc": "Гэта катэгорыя для старонак, у якіх перасягнута глыбіня разгортвання.", + "expansion-depth-exceeded-category-desc": "На старонцы перасягнута максімальная глыбіня разгортвання.", "expansion-depth-exceeded-warning": "Старонка перасягнула глыбіню разгортвання", "parser-unstrip-loop-warning": "Выяўлены закальцаваны unstrip", "parser-unstrip-recursion-limit": "Перавышаны ліміт рэкурсіі unstrip ($1)", @@ -844,7 +844,6 @@ "searchprofile-advanced-tooltip": "Шукаць у дадатковых прасторах назваў", "search-result-size": "$1 ({{PLURAL:$2|1 слова|$2 словы|$2 словаў}})", "search-result-category-size": "{{PLURAL:$1|$1 элемент|$1 элемента|$1 элементаў}} ({{PLURAL:$2|$2 падкатэгорыя|$2 падкатэгорыі|$2 падкатэгорый}}, {{PLURAL:$3|$3 файл|$3 файла|$3 файлаў}})", - "search-result-score": "Адпаведнасць: $1%", "search-redirect": "(перасылка $1)", "search-section": "(падраздзел $1)", "search-file-match": "(адпавядае змесціву файла)", @@ -871,7 +870,7 @@ "preferences": "Настройкі", "mypreferences": "Настройкі", "prefs-edits": "Колькасць правак:", - "prefsnologintext2": "Трэба $1, каб мяняць свае настройкі.", + "prefsnologintext2": "Трэба прадставіцца сістэме, каб мяняць свае настройкі.", "prefs-skin": "Вокладка", "skin-preview": "Перадпаказ", "datedefault": "Не вызначана", @@ -1247,8 +1246,6 @@ "uploadwarning": "Папярэджанне пра ўкладанне", "uploadwarning-text": "Калі ласка, змяніце апісанне файла ніжэй і паўтарыце спробу.", "savefile": "Запісаць файл", - "uploadedimage": "укладзена \"[[$1]]\"", - "overwroteimage": "укладзена новая версія \"[[$1]]\"", "uploaddisabled": "Укладанні не дазваляюцца", "copyuploaddisabled": "Даданне па URL адключана.", "uploaddisabledtext": "Не дазваляюцца ўкладанні файлаў.", @@ -1656,9 +1653,9 @@ "index-category-desc": "На старонцы ёсць магічнае слова __INDEX__ (і старонка знаходзіцца ў прасторы назваў, дзе гэты сцяг дазволены), таму яна індэксуецца пошукавымі робатамі у выпадках, калі гэтага звычайна не адбываецца.", "post-expand-template-inclusion-category-desc": "Пасля разгортвання ўсіх шаблонаў памер старонкі перавышае $wgMaxArticleSize, таму некаторыя шаблоны пакінуты неразгорнутымі.", "post-expand-template-argument-category-desc": "Пасля разгортвання аргумента шаблона (штосьці ў патройных фігурных дужках, напрыклад, {{{Foo}}}), памер старонкі перавышае $wgMaxArticleSize.", - "expensive-parserfunction-category-desc": "Занадта шмат працаёмкіх зваротаў да функцый парсера (напрыклад, #ifexist) уключана ў старонку. Гл. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", - "broken-file-category-desc": "Катэгорыя дадаецца, калі старонка ўтрымлівае няспраўную спасылку на файл (спасылку на ўкладзены файл, якога няма).", - "hidden-category-category-desc": "Гэта катэгорыя змяшчае __HIDDENCAT__, што паводле прадвызначэння засцерагае яе ад паказу ў спісе катэгорый на старонках.", + "expensive-parserfunction-category-desc": "У старонку ўключана занадта шмат працаёмкіх зваротаў да функцый парсера (напрыклад, #ifexist). Гл. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", + "broken-file-category-desc": "Старонка ўтрымлівае няспраўную спасылку на файл (спасылку на ўкладзены файл, якога няма).", + "hidden-category-category-desc": "Гэта катэгорыя ўтрымлівае __HIDDENCAT__ на старонцы змесціва, што паводле прадвызначэння засцерагае яе ад паказу ў спісе катэгорый на старонках.", "trackingcategories-nodesc": "Апісанне адсутнічае.", "trackingcategories-disabled": "Катэгорыя адключана", "mailnologin": "Няма эл.адрасу", @@ -1695,7 +1692,7 @@ "mywatchlist": "Спіс назірання", "watchlistfor2": "Для $1 $2", "nowatchlist": "Ваш спіс назірання зараз пусты.", - "watchlistanontext": "Каб паглядзець ці змяніць спіс назірання, трэба $1.", + "watchlistanontext": "Каб паглядзець ці змяніць спіс назірання, трэба прадставіцца сістэме.", "watchnologin": "Без прадстаўлення", "addwatch": "Дадаць у спіс назірання", "addedwatchtext": "Старонка \"[[:$1]]\" была дададзена да [[Special:Watchlist|назіраных]] вамі.\nЗмяненні, якія адбудуцца з гэтай старонкай і з размовамі пра яе, будуць паказвацца ў спісе назірання.", @@ -2996,6 +2993,9 @@ "logentry-rights-rights": "$1 {{GENDER:$2|змяніў|змяніла}} прыналежнасць $3 да групы з $4 на $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|змяніў|змяніла}} прыналежнасць $3 да групы", "logentry-rights-autopromote": "$1 аўтаматычна {{GENDER:$2|пераведзены|пераведзена}} з $4 у $5", + "logentry-upload-upload": "$1 {{GENDER:$2|уклаў|уклала}} $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|уклаў|уклала}} новую версію $3", + "logentry-upload-revert": "$1 {{GENDER:$2|уклаў|уклала}} $3", "rightsnone": "(няма)", "feedback-bugornote": "Калі вы гатовыя падрабязна апісаць тэхнічную праблему, калі ласка, [$1 паведаміце пра памылку].\nУ адваротным выпадку вы можаце выкарыстоўваць гэтую простую форму. Ваш каментар будзе дададзены на старонку «[$3 $2]» разам з вашым імем удзельніка і выкарыстоўваемым браўзерам.", "feedback-subject": "Тэма:", @@ -3098,5 +3098,7 @@ "action-pagelang": "змяняць мову старонкі", "log-name-pagelang": "Журнал змянення мовы", "log-description-pagelang": "Гэта журнал змяненняў у мовах старонкі.", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2|змяніў|змяніла}} мову старонкі $3 з $4 на $5." + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|змяніў|змяніла}} мову старонкі $3 з $4 на $5.", + "default-skin-not-found-row-enabled": "* $1 / $2 (уключана)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''выключана''')" } diff --git a/languages/i18n/bg.json b/languages/i18n/bg.json index 2ab489061a..8de83ada63 100644 --- a/languages/i18n/bg.json +++ b/languages/i18n/bg.json @@ -802,7 +802,6 @@ "searchprofile-advanced-tooltip": "Търсене в избрани именни пространства", "search-result-size": "$1 ({{PLURAL:$2|една дума|$2 думи}})", "search-result-category-size": "{{PLURAL:$1|1 член|$1 члена}} ({{PLURAL:$2|1 подкатегория|$2 подкатегории}}, {{PLURAL:$3|1 файл|$3 файла}})", - "search-result-score": "Релевантност: $1%", "search-redirect": "(пренасочване $1)", "search-section": "(раздел $1)", "search-suggest": "Вероятно имахте предвид: $1", @@ -1176,8 +1175,6 @@ "uploadwarning": "Предупреждение при качване", "uploadwarning-text": "Необходимо е да промените описанието на файла по-долу и да опитате отново.", "savefile": "Съхраняване на файл", - "uploadedimage": "качи „[[$1]]“", - "overwroteimage": "качи нова версия на „[[$1]]“", "uploaddisabled": "Качванията са забранени.", "copyuploaddisabled": "Спряно е качването на файлове чрез URL.", "uploaddisabledtext": "Качването на файлове е забранено.", diff --git a/languages/i18n/bn.json b/languages/i18n/bn.json index c5ad1e693a..c993c30b4c 100644 --- a/languages/i18n/bn.json +++ b/languages/i18n/bn.json @@ -274,6 +274,9 @@ "hidetoc": "আড়ালে রাখো", "collapsible-collapse": "সংকোচন", "collapsible-expand": "প্রসারণ", + "confirmable-confirm": "{{GENDER:$1|আপনি}} কি নিশ্চিত?", + "confirmable-yes": "হ্যাঁ", + "confirmable-no": "না", "thisisdeleted": "$1 দেখানো বা পুনঃসৃষ্টি করা হোক?", "viewdeleted": "$1 দেখানো হোক?", "restorelink": "{{PLURAL:$1|একটি মুছে ফেলা সম্পাদনা|$1টি মুছে ফেলা সম্পাদনা}}", @@ -834,7 +837,6 @@ "searchprofile-advanced-tooltip": "স্বনির্ধারিত নামস্থানে অনুসন্ধান করো", "search-result-size": "$1 ({{PLURAL:$2|১টি শব্দ|$2টি শব্দ}})", "search-result-category-size": "{{PLURAL:$1 |১টি সদস্য |$1টি সদস্য}} ({{PLURAL:$2 |১টি উপবিষয়শ্রেণী|$2টি উপবিষয়শ্রেণী}}, {{PLURAL:$3 |১টি ফাইল |$3টি ফাইল}})", - "search-result-score": "মিলেছে: $1%", "search-redirect": "(পুনর্নিদেশনা $1)", "search-section": "(অনুচ্ছেদ $1)", "search-file-match": "(নথির বিষয়বস্তু মিলে যায়)", @@ -1235,8 +1237,6 @@ "uploadwarning": "আপলোড সতর্কবাণী", "uploadwarning-text": "অনুগ্রহ করে নিচে ফাইলের বর্ণনা পরিবর্তন করে আবার চেষ্টা করুন।", "savefile": "সংরক্ষণ", - "uploadedimage": "\"[[$1]]\" আপলোড করা হয়েছে।", - "overwroteimage": "\"[[$1]]\"-এর একটি নতুন সংস্করণ আপলোড করা হয়েছে", "uploaddisabled": "আপলোড নিষ্ক্রিয় আছে", "copyuploaddisabled": "ইউআরএল এর মাধ্যমে আপলোড নিস্ক্রিয় রয়েছে।", "uploaddisabledtext": "ফাইল আপলোড নিষ্ক্রিয়।", @@ -3105,5 +3105,7 @@ "action-pagelang": "পাতার ভাষা পরিবর্তন করুন", "log-name-pagelang": "ভাষা পরিবর্তন লগ", "log-description-pagelang": "এটি পাতার ভাষা পরিবর্তনের লগ।", - "logentry-pagelang-pagelang": "$1 পাতার ভাষা $3 এর জন্য $4 থেকে $5 এ {{GENDER:$2|পরিবর্তন}} করেছেন।" + "logentry-pagelang-pagelang": "$1 পাতার ভাষা $3 এর জন্য $4 থেকে $5 এ {{GENDER:$2|পরিবর্তন}} করেছেন।", + "default-skin-not-found-row-enabled": "* $1 / $2 (সক্রিয় করা)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''নিষ্ক্রিয় করা''')" } diff --git a/languages/i18n/br.json b/languages/i18n/br.json index 3978647b06..5b5c7a0525 100644 --- a/languages/i18n/br.json +++ b/languages/i18n/br.json @@ -267,6 +267,9 @@ "hidetoc": "kuzhat", "collapsible-collapse": "Pakañ", "collapsible-expand": "Dispakañ", + "confirmable-confirm": "Ha sur {{GENDER:$1|hoc'h}} ?", + "confirmable-yes": "Ya", + "confirmable-no": "Ket", "thisisdeleted": "Diskouez pe diziverkañ $1 ?", "viewdeleted": "Gwelet $1?", "restorelink": "{{PLURAL:$1|ur c'hemm diverket|$1 kemm diverket}}", @@ -816,7 +819,6 @@ "searchprofile-advanced-tooltip": "Klask en esaouennoù anv personelaet", "search-result-size": "$1 ({{PLURAL:$2|1 ger|$2 ger}})", "search-result-category-size": "{{PLURAL:$1|1|$1}} ezel ({{PLURAL:$2|1|$2}} is-rummad, {{PLURAL:$3|1|$3}} restr)", - "search-result-score": "Klotadusted : $1%", "search-redirect": "(adkas $1)", "search-section": "(rann $1)", "search-file-match": "(klotañ a ra gant endalc'had ar restr)", @@ -1108,7 +1110,7 @@ "recentchanges-legend-heading": "'''Alc'hwez :'''", "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (gwelet ivez [[Special:NewPages|roll ar pajennoù nevez]])", "rcnotefrom": "Setu aze roll ar c'hemmoù c'hoarvezet abaoe an $2 ($1 d'ar muiañ).", - "rclistfrom": "Diskouez ar c'hemmoù diwezhañ abaoe an $3 $2", + "rclistfrom": "Diskouez ar c'hemmoù diwezhañ abaoe an/ar $3 $2", "rcshowhideminor": "$1 ar c'hemmoù dister", "rcshowhideminor-show": "Diskouez", "rcshowhideminor-hide": "Kuzhat", @@ -1127,7 +1129,7 @@ "rcshowhidemine": "$1 ma c'hemmoù", "rcshowhidemine-show": "Diskouez", "rcshowhidemine-hide": "Kuzhat", - "rclinks": "Diskouez an $1 kemm diwezhañ c'hoarvezet e-pad an $2 devezh diwezhañ
    $3", + "rclinks": "Diskouez an/ar $1 kemm diwezhañ c'hoarvezet e-pad an/ar $2 devezh diwezhañ.
    $3", "diff": "diforc'h", "hist": "ist", "hide": "Kuzhat", @@ -1211,8 +1213,6 @@ "uploadwarning": "Kemenn diwall en ur ezporzhiañ", "uploadwarning-text": "Cheñchit deskrivadur ar restr a-is ha klaskit en-dro.", "savefile": "Enrollañ ar restr", - "uploadedimage": "\"[[$1]]\" enporzhiet", - "overwroteimage": "enporzhiet ur stumm nevez eus \"[[$1]]\"", "uploaddisabled": "Ho tigarez, diweredekaet eo bet kas ar restr-mañ.", "copyuploaddisabled": "Diweredekaet eo bet ar pellgargañ dre URL.", "uploaddisabledtext": "Diweredekaet eo an enporzhiañ restroù.", @@ -3032,5 +3032,7 @@ "pagelang-use-default": "Implijout ar yezh dre ziouer", "pagelang-select-lang": "Dibab ar yezh", "right-pagelang": "Cheñch yezh ar bajenn", - "action-pagelang": "cheñch yezh ar bajenn" + "action-pagelang": "cheñch yezh ar bajenn", + "default-skin-not-found-row-enabled": "* $1 / $2 (gweredekaet)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''diweredekaet''')" } diff --git a/languages/i18n/ca.json b/languages/i18n/ca.json index 57bae32022..1ca779e534 100644 --- a/languages/i18n/ca.json +++ b/languages/i18n/ca.json @@ -41,7 +41,8 @@ "Àlex", "לערי ריינהארט", "아라", - "Calak" + "Calak", + "F3RaN" ] }, "tog-underline": "Subratlla els enllaços:", @@ -296,6 +297,9 @@ "hidetoc": "amaga", "collapsible-collapse": "Tanca", "collapsible-expand": "Amplia", + "confirmable-confirm": "Esteu {{GENDER:$1|segur|segura}}?", + "confirmable-yes": "Sí", + "confirmable-no": "No", "thisisdeleted": "Voleu mostrar o restaurar $1?", "viewdeleted": "Voleu mostrar $1?", "restorelink": "{{PLURAL:$1|una versió esborrada|$1 versions esborrades}}", @@ -380,7 +384,7 @@ "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ó", - "exception-nologin-text": "[[Special:Userlogin|Inicieu sessió]] per poder accedir a aquesta pàgina o acció.", + "exception-nologin-text": "Cal que inicieu una sessió per accedir a aquesta pàgina o acció.", "exception-nologin-text-manual": "Si us plau, $1 per poder accedir a aquesta pàgina o acció.", "virus-badscanner": "Mala configuració: antivirus desconegut: ''$1''", "virus-scanfailed": "escaneig fallit (codi $1)", @@ -581,6 +585,7 @@ "preview": "Previsualització", "showpreview": "Mostra una previsualització", "showdiff": "Mostra els canvis", + "blankarticle": "Avís: La pàgina que esteu creant és en blanc.\nSi feu clic a «{{int:savearticle}}» un altre cop, la pàgina es crearà sense cap contingut.", "anoneditwarning": "'''Avís:''' No esteu identificats amb un compte d'usuari. Es mostrarà la vostra adreça IP en l'historial d'aquesta pàgina.", "anonpreviewwarning": "''No us heu identificat amb un compte d'usuari. La vostra adreça IP quedarà registrada a l'historial d'aquesta pàgina.''", "missingsummary": "'''Recordatori''': Heu deixat en blanc el resum de l'edició. Si torneu a clicar al botó de desar, l'edició es guardarà sense resum.", @@ -692,10 +697,10 @@ "parser-template-recursion-depth-warning": "S'ha excedit el límit de recursivitat de plantilles ($1)", "language-converter-depth-warning": "El límit de la profunditat del conversor d'idiomes ha excedit ($1)", "node-count-exceeded-category": "Pàgines on s'ha excedit el recompte de nodes", - "node-count-exceeded-category-desc": "Una categoria de les pàgines on s'ha excedit el recompte de nodes.", + "node-count-exceeded-category-desc": "La pàgina ha excedit el compte màxim de nodes.", "node-count-exceeded-warning": "La pàgina ha excedit el recompte de nodes", "expansion-depth-exceeded-category": "Pàgines on s'ha excedit la profunditat d'expansió", - "expansion-depth-exceeded-category-desc": "Aquesta és una categoria de les pàgines on s'ha s'excedit la profunditat d'expansió.", + "expansion-depth-exceeded-category-desc": "La pàgina ha excedit la profunditat màxima d'expansió.", "expansion-depth-exceeded-warning": "La pàgina ha excedit la profunditat d'expansió", "parser-unstrip-loop-warning": "S'ha detectat un bucle no desmuntable", "parser-unstrip-recursion-limit": "S'ha excedit el límit ($1) de recursivitat no desmuntable", @@ -739,6 +744,7 @@ "rev-deleted-event": "(s'ha suprimit el registre d'accions)", "rev-deleted-user-contribs": "[nom d'usuari o adreça IP esborrada - modificació ocultada de les contribucions]", "rev-deleted-text-permission": "S'ha '''suprimit''' aquesta versió de la pàgina.\nVegeu-ne més detalls al [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registre de supressions].", + "rev-suppressed-text-permission": "S'ha '''suprimit''' aquesta versió de la pàgina.\nVegeu-ne més detalls al [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registre de supressions].", "rev-deleted-text-unhide": "S'ha '''suprimit''' la revisió d'aquesta pàgina.\nHi poden haver més detalls al [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registre d'esborrats].\nEncara podeu [$1 veure aquesta revisió] si així ho desitgeu.", "rev-suppressed-text-unhide": "S'ha '''suprimit''' aquesta versió de la pàgina.\nHi poden haver més detalls al [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registre d'esborrats].\nEncara podeu [$1 veure aquesta revisió] si així ho desitgeu.", "rev-deleted-text-view": "S'ha '''suprimit''' aquesta versió de la pàgina.\nPodeu veure-la; vegeu-ne més detalls al [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registre d'esborrats].", @@ -763,7 +769,7 @@ "revdelete-text-text": "Les versions suprimides encara apareixeran en la pàgina d'historial, però part del seu contingut serà inaccessible al públic.", "revdelete-text-file": "Les versions suprimides encara apareixeran en l'historial del fitxer, però part del seu contingut serà inaccessible al públic.", "logdelete-text": "Els esdeveniments suprimits encara apareixeran en els registres, però part del seu contingut serà inaccessible al públic.", - "revdelete-text-others": "Altres administradors del projecte {{SITENAME}} podran accedir al contingut ocult i podran restaurar-lo amb aquesta mateixa interfície, llevat que s'estableixin restriccions addicionals.", + "revdelete-text-others": "Altres administradors podran accedir al contingut ocult i restaurar-lo, llevat que s'estableixin restriccions addicionals.", "revdelete-confirm": "Si us plau, confirmeu que és això el que desitgeu fer, que enteneu les conseqüències, i que esteu fent-ho d'acord amb [[{{MediaWiki:Policy-url}}|les polítiques acordades]].", "revdelete-suppress-text": "Les supressions '''només''' han de ser portades a terme en els següents casos:\n* Informació potencialment difamatòria\n* Informació personal inapropiada\n*: ''adreces personals, números de telèfon, números d'identificació nacional, etc.''", "revdelete-legend": "Defineix restriccions en la visibilitat", @@ -862,7 +868,6 @@ "searchprofile-advanced-tooltip": "Cerca als espais de noms predefinits", "search-result-size": "$1 ({{PLURAL:$2|1 paraula|$2 paraules}})", "search-result-category-size": "{{PLURAL:$1|1 membre|$1 membres}} ({{PLURAL:$2|1 subcategoria|$2 subcategories}}, {{PLURAL:$3|1 fitxer|$3 fitxers}})", - "search-result-score": "Rellevància: $1%", "search-redirect": "(redirigit des de $1)", "search-section": "(secció $1)", "search-file-match": "(coincideix amb el contingut del fitxer)", @@ -889,7 +894,7 @@ "preferences": "Preferències", "mypreferences": "Preferències", "prefs-edits": "Nombre d'edicions:", - "prefsnologintext2": "Useu $1 per configurar preferències d'usuari.", + "prefsnologintext2": "Inicieu una sessió per canviar les vostres preferències.", "prefs-skin": "Aparença", "skin-preview": "prova", "datedefault": "Cap preferència", @@ -1061,7 +1066,7 @@ "right-deletedtext": "Veure el text esborrat i els canvis entre revisions esborrades", "right-browsearchive": "Cercar pàgines esborrades", "right-undelete": "Restaurar pàgines esborrades", - "right-suppressrevision": "Revisar i restaurar les versions amagades als administradors", + "right-suppressrevision": "Mostra, amaga i revela revisions específiques de pàgines d'un usuari", "right-viewsuppressed": "Mostra les revisions amagades de qualsevol usuari", "right-suppressionlog": "Veure registres privats", "right-block": "Blocar altres usuaris per a impedir-los l'edició", @@ -1161,7 +1166,7 @@ "recentchanges-legend-heading": "'''Llegenda:'''", "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vegeu també la [[Special:NewPages|llista de pàgines noves]])", "recentchanges-legend-plusminus": "(''±123'')", - "rcnotefrom": "A sota hi ha els canvis des de $2 (es mostren fins $1).", + "rcnotefrom": "A sota hi ha {{PLURAL:$5|el canvi|els canvis}} a partir de $3, $4 (fins a $1).", "rclistfrom": "Mostra els canvis nous des de $3 $2", "rcshowhideminor": "$1 edicions menors", "rcshowhideminor-show": "Mostra", @@ -1266,8 +1271,6 @@ "uploadwarning": "Avís de càrrega", "uploadwarning-text": "Modifiqueu la descripció de la imatge i torneu a intentar-ho.", "savefile": "Desa el fitxer", - "uploadedimage": "ha carregat [[$1]]", - "overwroteimage": "ha carregat una nova versió de «[[$1]]»", "uploaddisabled": "S'ha inhabilitat la càrrega", "copyuploaddisabled": "Càrrega per URL deshabilitada.", "uploaddisabledtext": "S'ha inhabilitat la càrrega de fitxers.", @@ -1377,7 +1380,7 @@ "nolicense": "No se n'ha seleccionat cap", "licenses-edit": "Modifica les opcions de llicència", "license-nopreview": "(Previsualització no disponible)", - "upload_source_url": " (un URL vàlid i accessible públicament)", + "upload_source_url": " (el fitxer que heu seleccionat des d'un URL vàlid i accessible públicament)", "upload_source_file": " (un fitxer triat del vostre ordinador)", "listfiles-delete": "elimina", "listfiles-summary": "Aquesta pàgina especial mostra tots els fitxers carregats.\nSi filtreu per usuari només es mostraran els fitxers la versió més recent dels quals hagi estat carregada per aquell.", @@ -1673,10 +1676,10 @@ "trackingcategories-desc": "Criteris d'inclusió de categoria", "noindex-category-desc": "La pàgina conté una paraula màgica __NOINDEX__ (i és en un espai de noms on està permesa) i per tant no està indexada per robots.", "index-category-desc": "La pàgina conté un __INDEX__ (i és en un espai de noms on està permès) i per tant està indexat per robots quan normalment no ho seria.", - "post-expand-template-inclusion-category-desc": "Després d'expandir totes les plantilles, la mida de la pàgina és més gran que $wgMaxArticleSize, per tant algunes plantilles no s'han expandit.", + "post-expand-template-inclusion-category-desc": "La mida de la pàgina és més gran que $wgMaxArticleSize un cop expandides totes les plantilles, per tant algunes plantilles no s'han expandit.", "post-expand-template-argument-category-desc": "Després d'expandir un argument de plantilla (alguna cosa entre claus triples, com {{{Això}}}), la pàgina és més gran que $wgMaxArticleSize.", - "expensive-parserfunction-category-desc": "Massa funcions d'analitzador costoses (com #ifexist) incloses en una pàgina. Vegeu [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", - "broken-file-category-desc": "Categoria afegida si la pàgina conté un enllaç de fitxer trencat (un enllaç per inserir un fitxer quan aquest fitxer no existeix).", + "expensive-parserfunction-category-desc": "La pàgina utilitza massa funcions d'analitzador costoses (com #ifexist). Vegeu [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", + "broken-file-category-desc": "La pàgina conté un enllaç de fitxer trencat (un enllaç per inserir un fitxer quan aquest fitxer no existeix).", "hidden-category-category-desc": "Aquesta és una categoria que conté __HIDDENCAT__, que impedeix que aparegui en la caixa d'enllaços de categoria a les pàgines, per defecte.", "trackingcategories-nodesc": "Sense descripció disponible.", "trackingcategories-disabled": "La categoria està inhabilitada", @@ -1714,7 +1717,7 @@ "mywatchlist": "Llista de seguiment", "watchlistfor2": "Per $1 $2", "nowatchlist": "No teniu cap element en la vostra llista de seguiment.", - "watchlistanontext": "Premeu $1 per a visualitzar o modificar elements de la vostra llista de seguiment.", + "watchlistanontext": "Inicieu una sessió per a visualitzar o modificar elements de la vostra llista de seguiment.", "watchnologin": "No heu iniciat la sessió", "addwatch": "Afegeix a llista de seguiment", "addedwatchtext": "S'ha afegit la pàgina \"[[:$1]]\" a la vostra [[Special:Watchlist|llista de seguiment]].\nS'hi mostraran els canvis futurs que tinguin lloc en aquesta pàgina i la corresponent discussió.", @@ -2192,7 +2195,7 @@ "import-invalid-interwiki": "No es pot importar des del wiki especificat.", "import-error-edit": "La pàgina «$1» no s'ha importat perquè no teniu permís per modificar-la.", "import-error-create": "La pàgina «$1» no s'ha importat perquè no teniu permís per crear-la.", - "import-error-interwiki": "No s'importa la pàgina «$1» perquè el seu nom està reservat a l'enllaçament extern (interwiki).", + "import-error-interwiki": "No s'ha importat la pàgina «$1» perquè el seu nom està reservat per a enllaços externs (interwiki).", "import-error-special": "No s'importa la pàgina «$1» perquè el seu nom pertany a l'espai de noms especial que no permet pàgines.", "import-error-invalid": "No s'importa la pàgina «$1» perquè el seu nom no és vàlid.", "import-error-unserialize": "La revisió $2 de la pàgina \"$1\" no pot ser desserialitzada. La revisió indica que utilitza el model de contingut $3 serialitzat com a $4.", @@ -2203,9 +2206,9 @@ "importlogpage": "Registre d'importació", "importlogpagetext": "Importacions administratives de pàgines amb l'historial des d'altres wikis.", "import-logentry-upload": "ha importat [[$1]] per càrrega de fitxers", - "import-logentry-upload-detail": "$1 {{PLURAL:$1|revisió|revisions}}", + "import-logentry-upload-detail": "$1 {{PLURAL:$1|revisió|revisions}} importades", "import-logentry-interwiki": "s'ha importat $1 via interwiki", - "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revisió|revisions}} de $2", + "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revisió|revisions}} importades de $2", "javascripttest": "Proves de JavaScript", "javascripttest-title": "S'estan executant $1 proves", "javascripttest-pagetext-noframework": "Es reserva la pàgina per a l'execució de tests amb JavaScript.", @@ -3119,5 +3122,7 @@ "action-pagelang": "canvia l'idioma de la pàgina", "log-name-pagelang": "Canvia el registre de llengua", "log-description-pagelang": "Aquest és un registre dels canvis en les llengües de les pàgines.", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ha canviat}} la llengua de la pàgina per a $3 de $4 a $5." + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ha canviat}} la llengua de la pàgina per a $3 de $4 a $5.", + "default-skin-not-found-row-enabled": "* $1 / $2 (habilitat)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''inhabilitat''')" } diff --git a/languages/i18n/cdo.json b/languages/i18n/cdo.json index d525b7b253..e5f06a42af 100644 --- a/languages/i18n/cdo.json +++ b/languages/i18n/cdo.json @@ -8,7 +8,8 @@ "아라", "Mywood", "Impersonator 1", - "LNDDYL" + "LNDDYL", + "唐吉訶德的侍從" ] }, "tog-underline": "下劃綫鏈接", @@ -50,20 +51,20 @@ "editfont-monospace": "蜀様寬其字體", "editfont-sansserif": "無襯線其字體", "editfont-serif": "有襯線其字體", - "sunday": "禮拜", - "monday": "拜一", - "tuesday": "拜二", - "wednesday": "拜三", - "thursday": "拜四", - "friday": "拜五", - "saturday": "拜六", - "sun": "禮拜", - "mon": "拜一", - "tue": "拜二", - "wed": "拜三", - "thu": "拜四", - "fri": "拜五", - "sat": "拜六", + "sunday": "Lā̤ buái/禮拜", + "monday": "Buái ék/拜一", + "tuesday": "Buái nê/拜二", + "wednesday": "Buái săng / 拜三", + "thursday": "Buái sé/拜四", + "friday": "Buái ngô/拜五", + "saturday": "Buái lĕ̤k/拜六", + "sun": "Lā̤ buái/禮拜", + "mon": "Buái ék/拜一", + "tue": "Buái nê/拜二", + "wed": "Buái săng/拜三", + "thu": "Buái sé/拜四", + "fri": "Buái ngô/拜五", + "sat": "Buái lĕ̤k/拜六", "january": "一月", "february": "二月", "march": "三月", @@ -633,7 +634,6 @@ "fileexists": "名字蜀樣其文件已經存在去了。如果汝𣍐確定汝是伓是卜想刪掉伊,起動檢查蜀下[[:$1]]。\n[[$1|thumb]]", "uploadwarning": "上傳警告", "savefile": "保存文件", - "uploadedimage": "已經上傳其「[[$1]]」", "uploadvirus": "茲文件有病毒!\n細底:$1", "sourcefilename": "源文件名:", "destfilename": "目標文件名:", diff --git a/languages/i18n/ce.json b/languages/i18n/ce.json index e295f4cff2..9a443dc0e3 100644 --- a/languages/i18n/ce.json +++ b/languages/i18n/ce.json @@ -47,7 +47,7 @@ "tog-ccmeonemails": "Дlадахьийта суна исанна кехат, аса дохьуьйтуш долу кхечу декъашхошна.", "tog-diffonly": "Ма гайта агlон чулацам шина башхонца цхьатерра йолуш", "tog-showhiddencats": "Гайта къайлаха йолу категореш", - "tog-norollbackdiff": "Юха яккхиначул тӀаьхьа ма гайта версешан башхо", + "tog-norollbackdiff": "Юха яккхиначул тӀаьхьа ма гайта версийн башхо", "tog-useeditwarning": "Хаамбе бина хийцамаш дӀаязцабеш аса болх дӀатосучу хенахь", "tog-prefershttps": "Даима лела йе лардина системин чудалар", "underline-always": "Даимна", @@ -265,6 +265,9 @@ "hidetoc": "къайлаяккха", "collapsible-collapse": "къайлаяккха", "collapsible-expand": "схьаяста", + "confirmable-confirm": "Лаьий {{GENDER:$1|хьуна}}?", + "confirmable-yes": "ХӀаъ", + "confirmable-no": "ХӀахӀа", "thisisdeleted": "Хьажа я меттахӀоттайé $1?", "viewdeleted": "Хьожий $1?", "restorelink": "{{PLURAL:$1|1=$1 дӀадаьккхина нийсдар|$1 дӀадяхна нийсдарш}}", @@ -517,6 +520,7 @@ "changeemail-password": "Хьан пароль «{{SITENAME}}» проектан:", "changeemail-submit": "Хийца email", "changeemail-cancel": "Цаоьшу", + "changeemail-throttled": "Хьо дукха гӀиртира.\nДехар до, собар де $1 юха гӀортале.", "resettokens": "Токенаш кхоссар", "resettokens-text": "Хьан йиш ю токенаш кхосса, цара йиш хуьлуьйту цхьаболу долара хаамашна тӀекхача, уьш ю хьан дӀаяздар ца вовшахтесна. \n\nХьона иза оьшу, ахьа хьай токенаш цхьам гучу яьхна елахь я хьан аккаунт йохийна елахь.", "resettokens-no-tokens": "Кхосса токенаш яц.", @@ -555,10 +559,13 @@ "blankarticle": "ДӀахьедар: Ахьа кхуллуш йолу агӀо еса ю.\nЮху кнопка «{{int:savearticle}}» тӀетаӀаяхь, агӀо цхьа чулацам боцуш кхуллур ю.", "anoneditwarning": "'''Тергам бе''': Ахьа хьай цӀарца тадарш деш дац. Хьан IP-адрес дӀаяздина хира ду хӀокху агӀон истори чу.", "anonpreviewwarning": "''Системин чу цагӀахь хьан IP-адрес агӀона истори чу дӀаяз лур ду.''", + "missingsummary": "'''Дагадаийтар.''' Ахьа хийцамаш лаьцна доца яздина дац. Кнопка «{{int:savearticle}}» юху тӀетаӀича хийцамах лаьцна хӀума доцуш Ӏалашбира бу.", "missingcommenttext": "Дехар до дӀаязбе хайн хаам лахахь.", + "missingcommentheader": "'''Дагадаийтар.''' Ахьа хӀокху къамелан дӀахьедар/корта билгал бина бац. Кнопка «{{int:savearticle}}» юху тӀетаӀича хийцамах лаьцна хӀума доцуш Ӏалашбира бу.", "summary-preview": "Цуьнах лаьцна хирду:", "subject-preview": "Коьрта могӀа хира бу:", "blockedtitle": "Декъашхочун блоктоьхана", + "blockedtext": "'''Хьан декъашхочун дӀаяздар я IP-адрес блоктоьхна ду.'''\n\nБлоктоьхна куьйгалхочо $1.\nБилгалдина бахьна: «''$2''».\n\n* Блоктохар доладелла: $8\n* Блоктохар чекхдолу: $6\n* Блоктохаран Ӏалашо: $7\n\nХьа йиш ю $1 декъашхочуьнга дехардан я кхечу муьлха [[{{MediaWiki:Grouppage-sysop}}|куьйгалхочуьнга]].\nТергам бе, хьа таро яц «декъашхочунга кехат» олу функци лелаян, хьан [[Special:Preferences|гӀирс нисбар чохь]] нийса электронан почтан адрес яздина дацахь, я кехаташ кхехӀитарна а блоктоьхна елахь.\nХьан IP-адрес — $3, блоктохаран идентификатор — $5.\nДехар до, хьайн хаам чохь билгалде и.", "blockednoreason": "бахьана билгалдина дац", "whitelistedittext": "Ахьа да деза $1 агӀона хийцамаш бан.", "nosuchsectiontitle": "Дакъа каро йиш яц.", @@ -605,7 +612,7 @@ "protectedpagewarning": "'''Дlахьедар. Хlара агlо гlаролла дина ю хийцам цабайта, иза хийца йа нисйа а бакъо йолуш адаманкуьйгалла лелош болу декъашхой бе бац.'''\nЛахахьа гойту хаамаш тlаьхьара бина болу хийцамна тептар чура:", "semiprotectedpagewarning": "'''ДӀахьедо.''' ХӀара агӀо гӀаролла йина ю; дӀабазбиначу декъашхошка бе цӀе хийцалуш яц.\nЛахахьа тептаро балийна тӀаьхьаралера дӀаязбина хаам:", "cascadeprotectedwarning": "
    [[file:Padlock.svg|left|25px|ДовгӀа|link=]]\nХӀара агӀо тада бакъо йолуш [[Project:Куьйгалхой|куьйгалхой]] бу, хӀунда аьлча и агӀо латийна кхечу агӀонашца хӀоттделлачу гӀаролле:
    ", - "templatesused": "{{PLURAL:$1|1=Кеп, лелийна|Кепаш, лелош ю}} хӀокху агон башхонца:", + "templatesused": "{{PLURAL:$1|1=Кеп, лелош ю|Кепаш, лелош ю}} хӀокху агӀон башхонца:", "templatesusedpreview": "{{PLURAL:$1|1=Кеп, лелошдолу|Кепаш, лелойлу}} оцу хьалх хьожучу агӀонца:", "templatesusedsection": "ХӀокху декъан чохь {{PLURAL:$1|1=лелош йолу кеп|лелош йолу кепаш}}:", "template-protected": "(гlароллийца)", @@ -718,7 +725,7 @@ "revdelete-radio-set": "Къайлаяьккхина", "revdelete-radio-unset": "Гуш ерг", "revdelete-suppress": "Къайлабаха хаамаш куьйгалхойх а", - "revdelete-unsuppress": "МеттахӀоьттина версешан дихкар къайладаккха", + "revdelete-unsuppress": "МеттахӀоьттина версийн дихкар къайладаккха", "revdelete-log": "Бахьна:", "revdelete-submit": "Кхочушде {{PLURAL:$1|1=къастина версин|къастина версийн}}", "revdelete-success": "'''Версеш гуш хилар кхиамца хийцина.'''", @@ -757,7 +764,7 @@ "revertmerge": "Йекъа", "mergelogpagetext": "Лахахь гойту тӀеххьара вовшахтоьхна агӀонийн могӀам.", "history-title": "$1 — хийцаман истори", - "difference-title": "$1 — Версешан башхалла", + "difference-title": "$1 — Версийн башхалла", "difference-title-multipage": "АгӀонийн башхалла «$1» а «$2» а", "difference-multipage": "(АгӀонийн башхалла)", "lineno": "МогӀа $1:", @@ -791,7 +798,6 @@ "searchprofile-advanced-tooltip": "Лаха дехарца хlокху ана цlерашкахь", "search-result-size": "$1 ({{PLURAL:$2|$2 дош|$2 дешнаш}})", "search-result-category-size": "$1 {{PLURAL:$1|юкъаяр}} ($2 {{PLURAL:$2|1=бухара категори|бухара категореш}}, $3 {{PLURAL:$3|1=файл|файлаш}}).", - "search-result-score": "Релевант: $1%.", "search-redirect": "(дlасахьажийна $1)", "search-section": "(дакъа $1)", "search-file-match": "(файлан чулацаме тера хилар)", @@ -1162,8 +1168,6 @@ "uploadwarning": "Дlахьедар", "uploadwarning-text": "Дехар до, лахара файлах лаьцнарг хийца а дай юху а гӀорта файл чуяккха.", "savefile": "ДӀаязе йе файл", - "uploadedimage": "чуяьккхина «[[$1]]»", - "overwroteimage": "Чуяьккхина файлан керла верси «[[$1]]»", "uploaddisabled": "Чуяккхар магийна дац", "copyuploaddisabled": "URL тӀера чуяккхар дӀадайина ду.", "uploaddisabledtext": "Файлаш чуяхар дӀадайина ду.", @@ -2554,6 +2558,7 @@ "logentry-rights-rights": "$1 {{GENDER:$2|хийцина}} $3 бакъо $4 → $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|хийцина}} хӏокхуна $3 бакъо", "logentry-rights-autopromote": "$1 {{GENDER:$2|вара|яра}} автоматически {{GENDER:$2|сихьа ваьлла|сихьа яьлла}} $4 $5 чу", + "logentry-upload-revert": "$1 {{GENDER:$2|чуяьккхина}} $3", "rightsnone": "(яц)", "feedback-bugornote": "Хьайн техникин халонах лаьцна яздан хӀума делахь, дехар до, [$1 хаам бе тхоьга].\nДацахь хьан йиш ю хӀокху атта кепаца «[$3 $2]» агӀонг къамел тӀетоха хьан декъашхочун цӀарца, кхин лелош йолу браузер билгал еш.", "feedback-subject": "Къамел:", @@ -2628,5 +2633,7 @@ "action-pagelang": "агӀона мотт хийца", "log-name-pagelang": "Мотт хийцаран тептар", "log-description-pagelang": "ХӀара агӀонашкахь мотт хийцаран тептар ду.", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2|хийцина}} агӀона мотт $3 $4 → $5." + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|хийцина}} агӀона мотт $3 $4 → $5.", + "default-skin-not-found-row-enabled": "* $1 / $2 (латина)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''дӀаяйина''')" } diff --git a/languages/i18n/ckb.json b/languages/i18n/ckb.json index db282794fd..284f7c406f 100644 --- a/languages/i18n/ckb.json +++ b/languages/i18n/ckb.json @@ -766,7 +766,6 @@ "searchprofile-advanced-tooltip": "گەڕان لەناو بۆشایی‌ناوە دڵخوازەکان", "search-result-size": "$1 ({{PLURAL:$2|یەک وشە|$2 وشە}})", "search-result-category-size": "{{PLURAL:$1|Ù¡ ئەندام|$1 ئەندام}} ({{PLURAL:$2|Ù¡ ژێرپۆل|$2 ژێرپۆل}}, {{PLURAL:$3|Ù¡ پەڕگە|$3 پەڕگە}})", - "search-result-score": "پەیوەندی: $1%", "search-redirect": "(ڕەوانەکەر $1)", "search-section": "(بەشی $1)", "search-suggest": "ئایا مەبەستت ئەمە بوو: $1", @@ -1143,8 +1142,6 @@ "file-deleted-duplicate": "ئەم پەڕگەیە ڕێک وەک ئەم پەڕگە ([[:$1]]) دەچێت کە لەم دواییانەدا سڕاوەتەوە.\nپێش دەست‌پێ‌کردنی دیسان بارکردنەوەی، تکایە چاو لە مێژووی سڕینەوەی ئەو پەڕگە بکە.", "uploadwarning": "ئاگادارییەکانی بارکردن", "savefile": "پەڕگە پاشەکەوت بکە", - "uploadedimage": "«[[$1]]»ی بارکرد", - "overwroteimage": "وەشانێکی نوێی «[[$1]]» بار کرد", "uploaddisabled": "بارکردن قەدەخە کراوە", "uploaddisabledtext": "بارکردنی پەڕگەکان لە کار خستراوە.", "php-uploaddisabledtext": "بارکردنی پەڕگەکان لە PHPدا لە کار خستراوە.\nتکایە چاو لە هەڵبژاردەکانی بارکردنی_پەڕگەکان بکە.", @@ -1197,6 +1194,7 @@ "license-nopreview": "(پێشبینین ئامادەی کەڵک وەرگرتن نییە)", "upload_source_url": " (URLـی بەکار، بۆ دەست‌پێگەیشتنی گشتی)", "upload_source_file": " (پەڕگەیەک لەسەر کۆمپیوتەرەکەت)", + "listfiles-delete": "بیسڕەوە", "listfiles-summary": "ئەم پەڕە تایبەتە ھەموو پەڕگە بارکراوەکان نیشان دەدات.", "listfiles_search_for": "بگەڕێ بۆ ناوی میدیای:", "imgfile": "پەڕگە", @@ -1497,6 +1495,7 @@ "watchlist-details": "{{PLURAL:$1|$1 پەڕە|$1 پەڕە}} لە لیستی چاودێریەکەتدایە، بێجگە پەڕەکانی لێدوان.", "wlheader-enotif": "ئاگاداری بە ئیمەیل چالاکە.", "wlheader-showupdated": "‏ئەو پەڕانە کە لە پاش دواین سەردانت دەستکاری کراون بە '''ئەستوور''' نیشان دراون", + "wlnote": "خوارەوە {{PLURAL:$1|دوایین گۆڕانکارییە|دوایین '''$1''' گۆڕانکارییە}} لە دوایین {{PLURAL:$2|کاتژمێر|'''$2''' کاتژمێر}}دا ھەتا $4 لە $3.", "wlshowlast": "دوایین $1 کاتژمێر $2 ڕۆژی $3 نیشان بدە", "watchlist-options": "ھەڵبژاردەکانی لیستی چاودێری", "watching": "چاودێری...", diff --git a/languages/i18n/cs.json b/languages/i18n/cs.json index 9f45222e5f..8e52268ae1 100644 --- a/languages/i18n/cs.json +++ b/languages/i18n/cs.json @@ -849,7 +849,6 @@ "searchprofile-advanced-tooltip": "Nastavit jmenné prostory, ve kterých se má hledat", "search-result-size": "$1 ({{PLURAL:$2|1 slovo|$2 slova|$2 slov}})", "search-result-category-size": "{{PLURAL:$1|1 položka|$1 položky|$1 položek}} ({{PLURAL:$2|1 podkategorie|$2 podkategorie|$2 podkategorií}}, {{PLURAL:$3|1 soubor|$3 soubory|$3 souborů}})", - "search-result-score": "Relevantnost: $1 %", "search-redirect": "(přesměrování $1)", "search-section": "(část $1)", "search-file-match": "(odpovídá obsahu souboru)", @@ -1253,8 +1252,6 @@ "uploadwarning": "Upozornění k načítání", "uploadwarning-text": "Prosíme, upravte popis souboru níže a zkuste to znovu.", "savefile": "Uložit soubor", - "uploadedimage": "načítá „[[$1]]“", - "overwroteimage": "načtena nová verze \"[[$1]]\"", "uploaddisabled": "Načítání souborů vypnuto.", "copyuploaddisabled": "Načítání souborů prostřednictvím URL je vypnuto.", "uploaddisabledtext": "Načítání souborů je vypnuto.", @@ -1927,7 +1924,7 @@ "autoblockid": "Autoblok #$1", "block": "Zablokovat uživatele", "unblock": "Odblokovat uživatele", - "blockip": "Zablokovat uživatele", + "blockip": "Zablokovat {{GENDER:$1|uživatele|uživatelku}}", "blockip-legend": "Zablokovat uživatele", "blockiptext": "Tento formulář slouží k zablokování editací z konkrétní IP adresy nebo uživatelského jména.\nToto by mělo být používáno jen v souladu s [[{{MediaWiki:Policy-url}}|pravidly]].\nUdejte přesný důvod níže (například ocitujte, které stránky byly poÅ¡kozeny).", "ipaddressorusername": "IP adresa nebo uživatelské jméno:", @@ -1956,7 +1953,7 @@ "ipb-unblock-addr": "Odblokovat {{GENDER:$1|uživatele|uživatelku|uživatele nebo IP adresu}} $1", "ipb-unblock": "Odblokovat uživatele nebo IP adresu", "ipb-blocklist": "Zobrazit probíhající bloky", - "ipb-blocklist-contribs": "Příspěvky uživatele $1", + "ipb-blocklist-contribs": "Příspěvky {{GENDER:$1|uživatele|uživatelky}} $1", "unblockip": "Odblokovat uživatele", "unblockiptext": "Tímto formulářem je možno obnovit právo blokované IP adresy či uživatele opět přispívat do {{grammar:2sg|{{SITENAME}}}}.", "ipusubmit": "Odblokovat", diff --git a/languages/i18n/da.json b/languages/i18n/da.json index b505ce4d16..cc426f3be2 100644 --- a/languages/i18n/da.json +++ b/languages/i18n/da.json @@ -46,7 +46,8 @@ "Søren Løvborg", "Tjernobyl", "Urhixidur", - "아라" + "아라", + "Thomsen" ] }, "tog-underline": "Understreg henvisninger:", @@ -298,6 +299,9 @@ "hidetoc": "skjul", "collapsible-collapse": "Fold sammen", "collapsible-expand": "Fold ud", + "confirmable-confirm": "Er {{GENDER:$1|du}} sikker?", + "confirmable-yes": "Ja", + "confirmable-no": "Nej", "thisisdeleted": "Se eller gendan $1?", "viewdeleted": "Vis $1?", "restorelink": "{{PLURAL:$1|en slettet ændring|$1 slettede ændringer}}", @@ -583,6 +587,7 @@ "preview": "ForhÃ¥ndsvisning", "showpreview": "ForhÃ¥ndsvisning", "showdiff": "Vis ændringer", + "blankarticle": "Advarsel: Siden du opretter er tom.\nHvis du klikker pÃ¥ \"{{int:savearticle}}\" igen, vil siden blive oprettet uden indhold.", "anoneditwarning": "'''Advarsel:''' Du er ikke logget pÃ¥. I stedet for brugernavn vises din IP-adresse i versionshistorikken.", "anonpreviewwarning": "''Du er ikke logget pÃ¥. Hvis du gemmer, registreres din IP-adresse i versionshistorikken.''", "missingsummary": "'''Bemærk:''' Du har ikke angivet en redigeringsbeskrivelse. Hvis du igen trykker pÃ¥ \"{{int:savearticle}}\", gemmes ændringerne uden en beskrivelse.", @@ -669,6 +674,8 @@ "edit-gone-missing": "Kunne ikke opdatere siden.\nDen ser du til at være slettet.", "edit-conflict": "Redigeringskonflikt.", "edit-no-change": "Din ændring ignoreredes, fordi der ikke var ændring af teksten.", + "postedit-confirmation-created": "Siden er blevet oprettet.", + "postedit-confirmation-restored": "Siden er blevet genoprettet.", "postedit-confirmation-saved": "Din redigering er gemt.", "edit-already-exists": "En ny side kunne ikke oprettes, fordi den allerede findes.", "defaultmessagetext": "Standardtekst", @@ -692,7 +699,8 @@ "parser-template-recursion-depth-warning": "En skabelon er rekursivt inkluderet for mange gange ($1)", "language-converter-depth-warning": "Dybdegrænse for sprogkonvertering overskredet ($1)", "node-count-exceeded-category": "Sider hvor antal noder er overskredet", - "node-count-exceeded-warning": "Sider der har overskredet antallet af noder", + "node-count-exceeded-category-desc": "Siden overstiger det maksimale antal af noder.", + "node-count-exceeded-warning": "Siden har overskredet antallet af noder", "expansion-depth-exceeded-category": "Sider, der overskrider ekspansionsdybden", "expansion-depth-exceeded-warning": "Siden overskred ekspansionsdybden", "parser-unstrip-loop-warning": "Unstrip-loop opdaget", @@ -712,7 +720,7 @@ "currentrev": "Nuværende version", "currentrev-asof": "Nuværende version fra $1", "revisionasof": "Versionen fra $1", - "revision-info": "Version fra $1 af $2", + "revision-info": "Version fra $1 af $2 {{GENDER:$6|$2}}$7", "previousrevision": "←Ældre version", "nextrevision": "Nyere version→", "currentrevisionlink": "se nuværende version", @@ -853,7 +861,6 @@ "searchprofile-advanced-tooltip": "Søg i bestemte navnerum", "search-result-size": "$1 ({{PLURAL:$2|et ord|$2 ord}})", "search-result-category-size": "{{PLURAL:$1|1 medlem|$1 medlemmer}} ({{PLURAL:$2|1 underkategori|$2 underkategorier}}, {{PLURAL:$3|1 fil|$3 filer}})", - "search-result-score": "Relevans: $1%", "search-redirect": "(omdirigering $1)", "search-section": "(afsnit $1)", "search-suggest": "Mente du: $1", @@ -877,7 +884,7 @@ "preferences": "Indstillinger", "mypreferences": "Indstillinger", "prefs-edits": "Antal redigeringer:", - "prefsnologintext2": "Du skal $1 for at ændre brugerindstillinger.", + "prefsnologintext2": "Du skal logge pÃ¥ for at ændre dine brugerindstillinger.", "prefs-skin": "Udseende", "skin-preview": "ForhÃ¥ndsvisning", "datedefault": "Standard", @@ -1049,7 +1056,8 @@ "right-deletedtext": "Vise slettet tekst og ændringer i slettede revisioner", "right-browsearchive": "Søge i slettede sider", "right-undelete": "Gendanne en side", - "right-suppressrevision": "Skjule og synliggøre sletninger for administratorer", + "right-suppressrevision": "Se, skjule og vise specifikke versioner af sider fra enhver bruger", + "right-viewsuppressed": "Se versioner skjult fra enhver bruger", "right-suppressionlog": "Se skjulte loglister", "right-block": "Blokere brugere", "right-blockemail": "Blokere en brugers mulighed for at sende mail", @@ -1096,6 +1104,7 @@ "action-createpage": "oprette sider", "action-createtalk": "oprette diskussionssider", "action-createaccount": "Oprette denne brugerkonto", + "action-history": "se historik for denne side", "action-minoredit": "markere denne redigering som mindre", "action-move": "flytte denne side", "action-move-subpages": "flytte denne side og dens undersider", @@ -1147,7 +1156,7 @@ "recentchanges-legend-heading": "'''Forklaring:'''", "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se ogsÃ¥ [[Special:NewPages|listen over nye sider]])", "recentchanges-legend-plusminus": "(''±123'')", - "rcnotefrom": "Nedenfor er op til '''$1''' ændringer siden '''$2''' vist.", + "rcnotefrom": "Nedenfor er op til '''$1''' {{PLURAL:$5|ændring|ændringer}} siden '''$2''' vist.", "rclistfrom": "Vis nye ændringer startende fra $3 $2", "rcshowhideminor": "$1 mindre ændringer", "rcshowhideminor-show": "Vis", @@ -1240,9 +1249,9 @@ "largefileserver": "Filen er større end den pÃ¥ serveren indstillede maksimale størrelse.", "emptyfile": "Filen du lagde op lader til at være tom. Det kan skyldes en slÃ¥fejl i filnavnet. Kontroller om du virkelig ønsker at lægge denne fil op.", "windows-nonascii-filename": "Denne wiki understøtter ikke filnavne, der indeholder specialtegn.", - "fileexists": "En fil med det navn findes allerede, tjek venligst [[:$1]] om du er sikker pÃ¥ du vil ændre den.\n[[$1|thumb]]", + "fileexists": "En fil med det navn findes allerede, tjek venligst [[:$1]] hvis du ikke er sikker pÃ¥ om du vil ændre den.\n[[$1|thumb]]", "filepageexists": "Siden med beskrivelse af denne fil er allerede oprettet pÃ¥ [[:$1]], men der eksisterer ikke en fil med dette navn.\nDen beskrivelse du kan angive nedenfor vil derfor ikke blive brugt.\nFor at fÃ¥ din beskrivelse vist, skal du selv redigere beskrivelsessiden.\n[[$1|thumb]]", - "fileexists-extension": "En fil med lignende navn findes allerede: [[$2|thumb]]\n* Navnet pÃ¥ den valgte fil: [[:$1]]\n* Navnet pÃ¥ den eksisterende fil: [[:$2]]\nVælg venligst et andet navn.", + "fileexists-extension": "En fil med lignende navn findes allerede: [[$2|thumb]]\n* Navnet pÃ¥ den valgte fil: [[:$1]]\n* Navnet pÃ¥ den eksisterende fil: [[:$2]]\nVil du mÃ¥ske bruge et mere karakteristisk navn?", "fileexists-thumbnail-yes": "Det ser ud som om filen indeholder et billede i reduceret størrelse ''(thumbnail)''. [[$1|thumb]]\nKontroller filen [[:$1]].\nHvis det er billedet i original størrelse, er det ikke nødvendigt at uploade et separat forhÃ¥ndsvisningsbillede.", "file-thumbnail-no": "Filnavnet begynder med $1.\nDet tyder pÃ¥ et billede i reduceret format ''(thumbnail)''.\nHvis du har billedet i fuld størrelse, sÃ¥ brug det i stedet. Ellers bedes du venligst ændre filnavnet.", "fileexists-forbidden": "En fil med dette navn findes allerede, og den kan ikke overskrives.\nHvis du fortsat vil lægge filen op, bedes du gÃ¥ tilbage og bruge et nyt navn.\n[[File:$1|thumb|center|$1]]", @@ -1253,8 +1262,6 @@ "uploadwarning": "Advarsel", "uploadwarning-text": "Vær venlig at ændre filbeskrivelsen nedenfor og prøv igen.", "savefile": "Gem fil", - "uploadedimage": "lagde \"[[$1]]\" op", - "overwroteimage": "lagde en ny version af \"[[$1]]\" op", "uploaddisabled": "Desværre er funktionen til at lægge filer op afbrudt pÃ¥ denne server.", "copyuploaddisabled": "Upload via URL er slÃ¥et fra.", "uploaddisabledtext": "Oplægning af filer er deaktiveret.", @@ -1363,9 +1370,11 @@ "license": "Licens", "license-header": "Licensering", "nolicense": "intet forvalg", + "licenses-edit": "Rediger licensvalg", "license-nopreview": "(forhÃ¥ndsvisning ikke mulig)", - "upload_source_url": " (gyldig, offentligt tillgængelig URL)", - "upload_source_file": " (en fil pÃ¥ din computer)", + "upload_source_url": "(din valgte fil fra en gyldig, offentligt tilgængelige URL)", + "upload_source_file": "(din valgte fil fra din computer)", + "listfiles-delete": "slet", "listfiles-summary": "Denne specialside viser alle oplagte filer.", "listfiles_search_for": "Søge efter fil:", "imgfile": "Fil", @@ -1484,8 +1493,8 @@ "pageswithprop-prophidden-binary": "binær værdi for egenskaben skjult ($1)", "doubleredirects": "Dobbelte omdirigeringer", "doubleredirectstext": "Dette er en liste over sider som omdirigerer til andre omdirigeringssider.\nHver linje indeholder henvisninger til den første og den anden omdirigering, sÃ¥vel som til mÃ¥let for den anden omdirigering som sædvanligvis er den \"rigtige\" mÃ¥lside som den første omdirigering burde henvise til.\nOverstregede poster er rettede.", - "double-redirect-fixed-move": "[[$1]] blev flyttet og er nu en omdirigering til [[$2]]", - "double-redirect-fixed-maintenance": "Rettelse af dobbelt omdirigering fra [[$1]] til [[$2]].", + "double-redirect-fixed-move": "[[$1]] blev flyttet.\nDen blev automatisk opdateret og er nu en omdirigering til [[$2]].", + "double-redirect-fixed-maintenance": "Automatisk rettelse af dobbelt omdirigering fra [[$1]] til [[$2]] som en del af en vedligeholdelsesopgave.", "double-redirect-fixer": "Omdirigerings-retter", "brokenredirects": "Defekte omdirigeringer", "brokenredirectstext": "Følgende omdirigeringer peger pÃ¥ en side der ikke eksisterer:", @@ -1644,6 +1653,9 @@ "listgrouprights-removegroup-self": "Kan fjerne {{PLURAL:$2|gruppe|grupper}} fra egen konto: $1", "listgrouprights-addgroup-self-all": "Kan tilføje alle grupper til egen konto", "listgrouprights-removegroup-self-all": "Kan fjerne alle grupper fra egen konto", + "listgrouprights-namespaceprotection-header": "Navnerumsbegrænsninger", + "listgrouprights-namespaceprotection-namespace": "Navnerum", + "listgrouprights-namespaceprotection-restrictedto": "Rettighed(er) der giver brugeren mulighed for at redigere", "mailnologin": "Du er ikke logget pÃ¥", "mailnologintext": "Du skal være [[Special:UserLogin|logget pÃ¥]] og have en gyldig e-mailadresse sat i dine [[Special:Preferences|indstillinger]] for at sende e-mail til andre brugere.", "emailuser": "E-mail til denne bruger", @@ -1678,12 +1690,14 @@ "mywatchlist": "OvervÃ¥gningsliste", "watchlistfor2": "For $1 $2", "nowatchlist": "Du har ingenting i din overvÃ¥gningsliste.", - "watchlistanontext": "Du skal $1, for at se din overvÃ¥gningsliste eller ændre indholdet af den.", + "watchlistanontext": "Du skal logge pÃ¥, for at se din overvÃ¥gningsliste eller ændre indholdet af den.", "watchnologin": "Ikke logget pÃ¥", "addwatch": "Tilføj til overvÃ¥gningsliste", "addedwatchtext": "Siden \"[[:$1]]\" er blevet tilføjet til din [[Special:Watchlist|overvÃ¥gningsliste]].\nFremtidige ændringer af denne side og dens tilknyttede diskussionsside vil blive vist der.", + "addedwatchtext-short": "Siden \"$1\" er blevet tilføjet til din overvÃ¥gningsliste.", "removewatch": "Fjern fra overvÃ¥gningsliste", "removedwatchtext": "Siden \"[[:$1]]\" er blevet fjernet fra [[Special:Watchlist||din overvÃ¥gningsliste]].", + "removedwatchtext-short": "Siden \"$1\" er blevet fjernet fra din overvÃ¥gningsliste.", "watch": "OvervÃ¥g", "watchthispage": "OvervÃ¥g side", "unwatch": "Fjern overvÃ¥gning", @@ -1693,7 +1707,7 @@ "watchlist-details": "Du har $1 {{PLURAL:$1|side|sider}} pÃ¥ din overvÃ¥gningsliste (ekskl. diskussionssider).", "wlheader-enotif": "E-mail-underretning er slÃ¥et til.", "wlheader-showupdated": "Sider, der er ændret siden dit sidste besøg, er vist med '''fed skrift'''.", - "wlnote2": "Nedenfor ses ændringerne i {{PLURAL:$1|den sidste time|de sidste $1 timer}} op til den $2 kl. $3.", + "wlnote": "Nedenfor ses {{PLURAL:$1|den seneste ændring|de seneste '''$1''' ændringer}} i {{PLURAL:$2|den sidste time|de sidste '''$2''' timer}} op til den $3 kl. $4.", "wlshowlast": "Vis de seneste $1 timer $2 dage $3", "watchlist-options": "Indstillinger for overvÃ¥gningslisten", "watching": "Tilføjer overvÃ¥gning …", @@ -3040,5 +3054,11 @@ "expand_templates_remove_nowiki": "Undertryk -tags i resultatet", "expand_templates_generate_xml": "Vis analysetræ som XML", "expand_templates_generate_rawhtml": "Vis rÃ¥ HTML", - "expand_templates_preview": "ForhÃ¥ndsvisning" + "expand_templates_preview": "ForhÃ¥ndsvisning", + "pagelanguage": "Valg af sidesprog", + "pagelang-name": "Side", + "pagelang-language": "Sprog", + "pagelang-use-default": "Brug standardsprog", + "pagelang-select-lang": "Vælg sprog", + "right-pagelang": "Ændre sidesproget" } diff --git a/languages/i18n/de.json b/languages/i18n/de.json index 01f293fe30..90bff13bc5 100644 --- a/languages/i18n/de.json +++ b/languages/i18n/de.json @@ -74,7 +74,8 @@ "Zylbath", "לערי ריינהארט", "✓", - "XenonX3" + "XenonX3", + "Brackenheim" ] }, "tog-underline": "Links unterstreichen:", @@ -330,6 +331,9 @@ "hidetoc": "Verbergen", "collapsible-collapse": "Einklappen", "collapsible-expand": "Ausklappen", + "confirmable-confirm": "Bist {{GENDER:$1|du}} sicher?", + "confirmable-yes": "Ja", + "confirmable-no": "Nein", "thisisdeleted": "$1 ansehen oder wiederherstellen?", "viewdeleted": "$1 anzeigen?", "restorelink": "$1 {{PLURAL:$1|gelöschte Version|gelöschte Versionen}}", @@ -414,7 +418,7 @@ "invalidtitle-knownnamespace": "Ungültiger Titel mit Namensraum „$2“ und Text „$3“", "invalidtitle-unknownnamespace": "Ungültiger Titel mit unbekannter Namensraumnummer $1 und Text „$2“", "exception-nologin": "Nicht angemeldet", - "exception-nologin-text": "Du musst dich [[Special:Userlogin|anmelden]], um auf diese Seite oder Aktion zugreifen zu können.", + "exception-nologin-text": "Du musst dich anmelden, um auf diese Seite oder Aktion zugreifen zu können.", "exception-nologin-text-manual": "Du musst dich $1, um auf diese Seite oder Aktion zugreifen zu können.", "virus-badscanner": "Fehlerhafte Konfiguration: unbekannter Virenscanner: $1", "virus-scanfailed": "Scan fehlgeschlagen (code $1)", @@ -727,10 +731,10 @@ "parser-template-recursion-depth-warning": "Vorlagenrekursionstiefengrenze überschritten ($1)", "language-converter-depth-warning": "Sprachkonvertertiefenlimit überschritten ($1)", "node-count-exceeded-category": "Seiten, die die Knotenanzahl überschritten haben", - "node-count-exceeded-category-desc": "Eine Kategorie für Seiten, bei denen die Knotenzahl überschritten wurde.", + "node-count-exceeded-category-desc": "Die Seite überschreitet die maximale Knotenanzahl.", "node-count-exceeded-warning": "Die Seite hat die Knotenpunktanzahl überschritten.", "expansion-depth-exceeded-category": "Seiten, die die Expansionstiefe überschritten haben", - "expansion-depth-exceeded-category-desc": "Dies ist eine Kategorie für Seiten, bei denen die Expandierungstiefe überschritten wurde.", + "expansion-depth-exceeded-category-desc": "Die Seite überschreitet die maximale Expandierungstiefe.", "expansion-depth-exceeded-warning": "Die Seite hat die Expansionstiefe überschritten.", "parser-unstrip-loop-warning": "Zirkelbezug festgestellt", "parser-unstrip-recursion-limit": "Rekursionsgrenze beim Auflösen überschritten ($1)", @@ -898,7 +902,6 @@ "searchprofile-advanced-tooltip": "Suche in weiteren Namensräumen", "search-result-size": "$1 ({{PLURAL:$2|1 Wort|$2 Wörter}})", "search-result-category-size": "{{PLURAL:$1|1 Seite|$1 Seiten}} ({{PLURAL:$2|1 Unterkategorie|$2 Unterkategorien}}, {{PLURAL:$3|1 Datei|$3 Dateien}})", - "search-result-score": "Relevanz: $1 %", "search-redirect": "(Weiterleitung von „$1“)", "search-section": "(Abschnitt $1)", "search-file-match": "(treffende Dateiinhalte)", @@ -925,7 +928,7 @@ "preferences": "Einstellungen", "mypreferences": "Einstellungen", "prefs-edits": "Anzahl der Bearbeitungen:", - "prefsnologintext2": "$1, um deine Benutzereinstellungen festzulegen.", + "prefsnologintext2": "Bitte anmelden, um deine Benutzereinstellungen festzulegen.", "prefs-skin": "Benutzeroberfläche", "skin-preview": "Vorschau", "datedefault": "Standard", @@ -1306,8 +1309,6 @@ "uploadwarning": "Warnung", "uploadwarning-text": "Bitte ändere unten die Dateibeschreibung und versuche es erneut.", "savefile": "Datei speichern", - "uploadedimage": "lud „[[$1]]“ hoch", - "overwroteimage": "lud eine neue Version von „[[$1]]“ hoch", "uploaddisabled": "Hochladen deaktiviert", "copyuploaddisabled": "Das Hochladen von URLs ist deaktiviert", "uploaddisabledtext": "Das Hochladen von Dateien ist deaktiviert.", @@ -1715,11 +1716,11 @@ "trackingcategories-desc": "Kategorieeinbindungskriterien", "noindex-category-desc": "Die Seite wird nicht von Bots indexiert, da sie das magische Wort __NOINDEX__ enthält und sich in einem Namensraum befindet, wo dieses Flag erlaubt ist.", "index-category-desc": "Die Seite enthält ein __INDEX__ und befindet sich in einem Namensraum, in dem dieses Flag nicht erlaubt ist und wird daher von Bots ausnahmsweise indexiert.", - "post-expand-template-inclusion-category-desc": "Nach dem Expandieren aller Vorlagen ist die Seitengröße größer als $wgMaxArticleSize, sodass einige Vorlagen nicht expandiert werden.", - "post-expand-template-argument-category-desc": "Nach dem Expandieren eines Vorlagenargumentes (etwas in dreifach geschweiften Klammern, z. B. {{{Foo}}}) ist die Seite größer als $wgMaxArticleSize.", - "expensive-parserfunction-category-desc": "Zu viele aufwändige Parserfunktionen (wie #ifexist) sind in der Seite eingebunden. Siehe das [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Benutzerhandbuch].", - "broken-file-category-desc": "Kategorie, die hinzugefügt wird, falls die Seite einen defekten Dateilink enthält (einen Link zu einer eingebetteten Datei, die nicht vorhanden ist).", - "hidden-category-category-desc": "Dies ist eine Kategorie mit __HIDDENCAT__, die standardmäßig nicht auf Seiten im Kategorienbereich angezeigt wird.", + "post-expand-template-inclusion-category-desc": "Die Seitengröße ist nach dem Expandieren aller Vorlagen größer als $wgMaxArticleSize, so dass einige Vorlagen nicht expandiert wurden.", + "post-expand-template-argument-category-desc": "Die Seite ist nach dem Expandieren eines Vorlagenargumentes größer als $wgMaxArticleSize (etwas in dreifachen Klammern, wie {{{Foo}}}).", + "expensive-parserfunction-category-desc": "Die Seite verwendet zu viele aufwändige Parserfunktionen (wie #ifexist). Siehe das [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Benutzerhandbuch].", + "broken-file-category-desc": "Die Seite enthält einen defekten Dateilink (einen Link zu einer eingebetteten Datei, die nicht vorhanden ist).", + "hidden-category-category-desc": "Die Kategorie enthält __HIDDENCAT__ in ihrem Seiteninhalt, was verhindert, dass sie standardmäßig auf Seiten im Kategorielinkkasten angezeigt wird.", "trackingcategories-nodesc": "Keine Beschreibung verfügbar.", "trackingcategories-disabled": "Kategorie ist deaktiviert", "mailnologin": "Fehler beim E-Mail-Versand", @@ -1757,7 +1758,7 @@ "mywatchlist": "Beobachtungsliste", "watchlistfor2": "Von $1 $2", "nowatchlist": "Es befinden sich keine Einträge auf deiner Beobachtungsliste.", - "watchlistanontext": "Du musst dich $1, um deine Beobachtungsliste sehen oder Einträge auf ihr bearbeiten zu können.", + "watchlistanontext": "Du musst dich anmelden, um deine Beobachtungsliste sehen oder Einträge auf ihr bearbeiten zu können.", "watchnologin": "Du bist nicht angemeldet", "addwatch": "Zur Beobachtungsliste hinzufügen", "addedwatchtext": "Die Seite „[[:$1]]“ wurde zu deiner [[Special:Watchlist|Beobachtungsliste]] hinzugefügt.\nSpätere Änderungen an dieser Seite und der zugehörigen Diskussionsseite werden dort gelistet.", @@ -1821,6 +1822,7 @@ "delete-edit-reasonlist": "Löschgründe bearbeiten", "delete-toobig": "Diese Seite hat mit mehr als $1 {{PLURAL:$1|Version|Versionen}} eine sehr lange Versionsgeschichte. Das Löschen solcher Seiten wurde eingeschränkt, um eine versehentliche Überlastung der Server zu verhindern.", "delete-warning-toobig": "Diese Seite hat mit mehr als $1 {{PLURAL:$1|Version|Versionen}} eine sehr lange Versionsgeschichte. Das Löschen kann zu Störungen im Datenbankbetrieb führen.", + "delete-cantedit": "Du kannst diese Seite nicht löschen, da du nicht über das Recht verfügst, diese Seite zu bearbeiten.", "deleting-backlinks-warning": "'''Warnung:''' Es verweisen noch [[Special:WhatLinksHere/{{FULLPAGENAME}}|andere Seiten]] auf die zu löschende Seite oder diese Seite ist noch woanders eingebunden.", "rollback": "Zurücksetzen der Änderungen", "rollback_short": "Zurücksetzen", @@ -1981,7 +1983,7 @@ "autoblockid": "Automatische Sperrung #$1", "block": "Benutzer sperren", "unblock": "Benutzer freigeben", - "blockip": "IP-Adresse/Benutzer sperren", + "blockip": "IP-Adresse/{{GENDER:$1|Benutzer|Benutzerin}} sperren", "blockip-legend": "IP-Adresse/Benutzer sperren", "blockiptext": "Mit diesem Formular sperrst du eine IP-Adresse oder einen Benutzernamen, so dass von dort keine Änderungen mehr vorgenommen werden können.\nDies sollte nur erfolgen, um Vandalismus zu verhindern und in Übereinstimmung mit den [[{{MediaWiki:Policy-url}}|Richtlinien]].\nBitte gib den Grund für die Sperre an.", "ipaddressorusername": "IP-Adresse oder Benutzername:", @@ -2010,7 +2012,7 @@ "ipb-unblock-addr": "„$1“ freigeben", "ipb-unblock": "IP-Adresse/Benutzer freigeben", "ipb-blocklist": "Alle aktuellen Sperren anzeigen", - "ipb-blocklist-contribs": "Benutzerbeiträge von „$1“", + "ipb-blocklist-contribs": "Benutzerbeiträge von „{{GENDER:$1|$1}}“", "unblockip": "Benutzer freigeben", "unblockiptext": "Mit diesem Formular kannst du eine IP-Adresse oder einen Benutzer freigeben.", "ipusubmit": "Freigeben", @@ -3089,6 +3091,9 @@ "logentry-rights-rights": "$1 {{GENDER:$2|änderte}} die Gruppenzugehörigkeit für $3 von $4 zu $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|änderte}} die Gruppenzugehörigkeit für $3", "logentry-rights-autopromote": "$1 wurde automatisch von $4 zu $5 {{GENDER:$2|zugeordnet}}", + "logentry-upload-upload": "$1 {{GENDER:$2|lud}} $3 hoch", + "logentry-upload-overwrite": "$1 {{GENDER:$2|lud}} eine neue Version von $3 hoch", + "logentry-upload-revert": "$1 {{GENDER:$2|lud}} $3 hoch", "rightsnone": "(–)", "feedback-bugornote": "Sofern du detailliert ein technisches Problem beschreiben möchtest, melde bitte [$1 einen Fehler].\nAnderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kommentar wird, zusammen mit deinem Benutzernamen und der Version des von dir verwendeten Webbrowsers sowie Betriebssystems, auf der Seite „[$3 $2]“ hinzugefügt.", "feedback-subject": "Betreff:", @@ -3194,5 +3199,9 @@ "action-pagelang": "die Seitensprache zu ändern", "log-name-pagelang": "Sprachenänderungs-Logbuch", "log-description-pagelang": "Dies ist ein Logbuch mit Änderungen an Seitensprachen.", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2|änderte}} die Seitensprache für $3 von $4 nach $5." + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|änderte}} die Seitensprache für $3 von $4 nach $5.", + "default-skin-not-found": "Hoppla! Die Standard-Benutzeroberfläche für dein Wiki ($wgDefaultSkin), $1, ist nicht verfügbar.\n\nDeine Installation scheint die folgenden Benutzeroberflächen zu enthalten. Siehe das [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de Benutzerhandbuch] für Informationen zur Aktivierung dieser und Auswahl des Standards.\n\n$2\n\n; Falls du gerade MediaWiki installiert hast:\n: Du hast vermutlich von Git oder direkt vom Quellcode mithilfe einer anderen Methode installiert. Dies wird erwartet.\n:* Versuche, einige Benutzeroberflächen aus dem [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Benutzeroberflächenverzeichnis] zu installieren.\n:* Lade den [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] herunter, der einige Benutzeroberflächen und Erweiterungen enthält. Du kannst das Verzeichnis skins/ kopieren und einfügen.\n: Dies sollte nicht dein Git-Repositorium beeinträchtigen, falls du ein MediaWiki-Entwickler bist.\n\n; Falls du gerade MediaWiki aktualisiert hast:\n: MediaWiki 1.24 und neuere Versionen aktivieren installierte Benutzeroberflächen nicht mehr automatisch (siehe das [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Benutzerhandbuch]). Du kannst die folgenden Zeilen in die Datei LocalSettings.php einfügen, um alle derzeit installierten Benutzeroberflächen zu aktivieren:\n\n
    $3
    \n\n; Falls du gerade LocalSettings.php geändert hast:\n: Überprüfe die Namen der Benutzeroberflächen auf Tippfehler.", + "default-skin-not-found-no-skins": "Hoppla! Die Standard-Benutzeroberfläche für dein Wiki ($wgDefaultSkin), $1, ist nicht verfügbar.\n\nDu hast keine installierten Benutzeroberflächen.\n\n; Falls du gerade MediaWiki installiert hast:\n: Du hast vermutlich von Git oder direkt vom Quellcode mithilfe einer anderen Methode installiert. Dies wird erwartet.\n:* Versuche, einige Benutzeroberflächen aus dem [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Benutzeroberflächenverzeichnis] zu installieren.\n:* Lade den [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] herunter, das mehrere Benutzeroberflächen und Erweiterungen enthält. Du kannst das Verzeichnis skins/ kopieren und einfügen.\n: Dies sollte nicht dein Git-Repositorium beeinträchtigen, falls du ein MediaWiki-Entwickler bist. Siehe das [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de Benutzerhandbuch] für Informationen zur Aktivierung von Benutzeroberflächen und Auswahl des Standards.", + "default-skin-not-found-row-enabled": "* $1 / $2 (aktiviert)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''deaktiviert''')" } diff --git a/languages/i18n/diq.json b/languages/i18n/diq.json index 275088a6a7..7b0a6adb7e 100644 --- a/languages/i18n/diq.json +++ b/languages/i18n/diq.json @@ -831,7 +831,6 @@ "searchprofile-advanced-tooltip": "qe cayê nimeyî bigêre", "search-result-size": "$1 ({{PLURAL:$2|1 çekuyo|$2 çekuyê}})", "search-result-category-size": "{{PLURAL:$1|1 eza|$1 ezayan}} ({{PLURAL:$2|1 kategoriyê bini|$2 kategirayanê binan}}, {{PLURAL:$3|1 dosya|$3 dosyayan}})", - "search-result-score": "Eleqa: $1%", "search-redirect": "($1 ra ardış)", "search-section": "(qısmê $1)", "search-file-match": "(zerreyê dosya yewbini gêno)", @@ -1233,8 +1232,6 @@ "uploadwarning": "Îkazê bar kerdişî", "uploadwarning-text": "Bînê de deskripyonê dosyayî bivurne u reyna qeyd bike.", "savefile": "Dosya qeyd ke", - "uploadedimage": "\"[[$1]]\" bar bi", - "overwroteimage": "yew versiyonê \"$1\" newe bar bi", "uploaddisabled": "bar kerdişî iptal biyo", "copyuploaddisabled": "URL bar kerdiş kefiliyeyo.", "uploaddisabledtext": "Barkerdışê dosya dewre ra veta.", diff --git a/languages/i18n/dsb.json b/languages/i18n/dsb.json index c34e9b3c40..2cebf9a3a0 100644 --- a/languages/i18n/dsb.json +++ b/languages/i18n/dsb.json @@ -16,7 +16,8 @@ "Shirayuki", "Tlustulimu", "Tlustulimu Nepl1", - "아라" + "아라", + "TMg" ] }, "tog-underline": "Wótkaze pódšmarnuś:", @@ -85,7 +86,7 @@ "april": "apryl", "may_long": "maj", "june": "junij", - "july": " julij", + "july": "julij", "august": "awgust", "september": "september", "october": "oktober", @@ -203,7 +204,6 @@ "talkpagelinktext": "diskusija", "specialpage": "Specialny bok", "personaltools": "Wósobinske pomocne srědki", - "postcomment": "Nowy wótrězk", "articlepage": "Nastawk", "talk": "Diskusija", "views": "Naglědy", @@ -380,7 +380,6 @@ "externaldberror": "Abo jo wustupiła eksterna zmólka awtentifikacije datoweje banki, abo njesmějoš swójo eksterne wužywarske konto aktualizěrowaś.", "login": "Pśizjawiś se", "nav-login-createaccount": "Pśizjawiś se/Konto załožyś", - "loginprompt": "Za pśizjawjenje do boka {{SITENAME}} muse cookije dowólone byś.", "userlogin": "Pśizjawiś se/Konto załožyś", "userloginnocreate": "Pśizjawiś", "logout": "wótzjawiś se", @@ -833,7 +832,6 @@ "searchprofile-advanced-tooltip": "W swójskich mjenjowych rumach pytaś", "search-result-size": "$1 ({{PLURAL:$2|1 słowow|$2 słowje|$2 słowa|$2 słowow}})", "search-result-category-size": "{{PLURAL:$1|1 cłonk|$1 cłonka|$1 cłonki|$1 cłonkow}} ({{PLURAL:$2|1 pódkategorija|$2 pódkategoriji|$2 pódkategorije|$2 pódkategorijow}}, {{PLURAL:$3|1 dataja|$3 dataji|$3 dataje|$3 datajow}})", - "search-result-score": "Relewanca: $1 %", "search-redirect": "(pśesměrowanje $1)", "search-section": "(sekcija $1)", "search-file-match": "(wótpowědujo datajowemu wopśimjeśeju)", @@ -1233,8 +1231,6 @@ "uploadwarning": "Warnowanje", "uploadwarning-text": "Pšosym změń slědujuce datajowe wopisanje a wopytaj hyšći raz.", "savefile": "Dataju składowaś", - "uploadedimage": "jo \"[[$1]]\" nagrał.", - "overwroteimage": "Jo nowu wersiju \"[[$1]]\" nagrał.", "uploaddisabled": "Nagrawanje jo se znjemóžniło.", "copyuploaddisabled": "Nagraśe pśez URL znjemóžnjone.", "uploaddisabledtext": "Nagraśa datajow su znjemóžnjone.", @@ -1685,7 +1681,7 @@ "watchlist-details": "Wobglědujoš {{PLURAL:$1|$1 bok|$1 boka|$1 boki|$1 bokow}}, bźez diskusijnych bokow.", "wlheader-enotif": "E-mailowa zdźěleńska słužba jo zmóžnjona.", "wlheader-showupdated": "Boki, kótarež su wót twójogo slědnego woglěda se změnili, pokazuju se '''tucnje'''.", - "wlnote2": "Slěduju změny {{PLURAL:$1|zachadneje góźiny|zachadneju $1 góźinowu|zachadnych $1 góźinow}} Staw: $2, $3.", + "wlnote": "{{PLURAL:$1|Slědujo slědna změna|slědujotej '''$1''' slědnej změnje|slěduju slědne '''$1''' změny}} {{PLURAL:$2|slědneje góźiny|slědneju '''$2''' góźinowu|slědnych '''$2''' góźinow}}, staw: $3, $4.", "wlshowlast": "Pokaž změny slědnych $1 góźinow, $2 dnjow abo $3 (w slědnych 30 dnjach).", "watchlist-options": "Opcije wobglědowańki", "watching": "Wobglědowaś …", @@ -2810,11 +2806,11 @@ "duplicate-defaultsort": "Glědaj: Standardny sortěrowański kluc (DEFAULT SORT KEY) \"$2\" pśepišo pjerwjej wužyty kluc \"$1\".", "version": "Wersija", "version-extensions": "Instalowane rozšyrjenja", + "version-skins": "Suknje", "version-specialpages": "Specialne boki", "version-parserhooks": "Parserowe kokule", "version-variables": "Wariable", "version-antispam": "Šćit pśeśiwo spamoju", - "version-skins": "Suknje", "version-other": "Druge", "version-mediahandlers": "Pśeźěłaki medijow", "version-hooks": "Kokule", diff --git a/languages/i18n/egl.json b/languages/i18n/egl.json index 6641fbd719..7f1a29fbf4 100644 --- a/languages/i18n/egl.json +++ b/languages/i18n/egl.json @@ -22,6 +22,7 @@ "tog-watchdefault": "Zûnta al pàgini e i file mudifichê int i tgnû 'd ôc specêl.", "tog-watchmoves": "Zûnta al pàgini e i file spustê int i tgnû 'd ôc specêl.", "tog-watchdeletion": "Zûnta al pàgini e i file scanşlê int i tgnû 'd ôc specêl.", + "tog-watchrollback": "Zûta al pàgini in dóv' ó fât al ritōren a la pàgina 'd préma a i tgnû 'd ôc specêl", "tog-minordefault": "Sògna ògni mudéfica cme céca (sōl cme pre-stabilî)", "tog-previewontop": "Fà vèder còl ch' ò fât sōver la caşèla ed mudéfica e mìa sòta.", "tog-previewonfirst": "Fà vèder còl ch' ò fât almēno 'na vôlta préma 'd salvêr", @@ -259,6 +260,8 @@ "hidetoc": "Lōga", "collapsible-collapse": "Stréca", "collapsible-expand": "Şlêrga", + "confirmable-yes": "Sé", + "confirmable-no": "No", "thisisdeleted": "Guêrda e tōrna a mèter $1?", "viewdeleted": "Guêrda $1?", "restorelink": "{{PLURAL:$1|'na mudéfica scanşlêda|$1 mudéfichi scanşlêdi}}", @@ -343,7 +346,7 @@ "invalidtitle-knownnamespace": "Tétol mìa vâlid cme spâsi di nòm \"$2\" e tèst \"$3\"", "invalidtitle-unknownnamespace": "Tétol mìa vâlid cun spâsi di nòm mìa cgnusû \"$1\" e tèst \"$2\"", "exception-nologin": "An t'é mìa gnû dèinter", - "exception-nologin-text": "Per andêr dèinter a cla pàgina ché o fêr còl ch'ét pèins ét gh'ê da [[Special:Userlogin|fêr l'ingrès]].", + "exception-nologin-text": "Per andêr dèinter a cla pàgina ché o fêr còl ch'ét pèins ét gh'ê da fêr l'ingrès.", "exception-nologin-text-manual": "Per prèir andêr dèinter a cla pàgina ché o fêr còl ch'ét pèins ét gh'ê da \"$1\".", "virus-badscanner": "Erōr 'd impustasiòun: antivîrus mìa cgnusû:\"$1\"", "virus-scanfailed": "Al cuntròl antivìrus l'é andê mêl (côdis $1)", @@ -541,6 +544,7 @@ "preview": "Guêrda préma", "showpreview": "Guêrda préma 'd salvêr", "showdiff": "Guêrda i cambiamèint", + "blankarticle": "Atèinti:la pàgina che t'é drē fêr la gh'à gnînto dèinter. S' ét tōren a schisêr in sém a \"{{int:savearticle}}\", la pàgina la srà fât sèinsa gnînto dèinter.", "anoneditwarning": "'''Atensiòun:''' Ingrès mìa fât. Al tó indirés IP al srà sgnê int la stòria ed cla pàgina chè.", "anonpreviewwarning": "\"An n'é mìa stê fât l'ingrès. Mèinter es sêlva la pàgina, l'indirés IP al srà sgnê int la stòria 'd la pàgina.\"", "missingsummary": "'''Atensiòun:''' an n'é mìa stê precişê al mutîv de sté mudéfica. S'es tōrna a clichêr insém a \"{{int:savearticle}}\" la mudéfica la gnirà salvêda cun al mutîv vōd.", @@ -698,6 +702,7 @@ "rev-deleted-event": "(asiòun dal log armôsa)", "rev-deleted-user-contribs": "(nòm utèint o indirés IP armôs - mudéfica lughêda da la stòria)", "rev-deleted-text-permission": "Cla versiòun ché 'd la pàgina l'é stêda scanşlêda . \nConsultêr al [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal canşladûri] per nōv particulêr.", + "rev-suppressed-text-permission": "Cla versiòun ché 'd la pàgina l'é stêda scanşlêda . Consultêr al [{{fullurl:{{#Special:Log}}/ suppress |page={{ FULLPAGENAMEE }}}} log dal canşladûri] per nōv particulêr.", "rev-deleted-text-unhide": "Cla versiòun ché 'd la pàgina l'é stêda scanşlêda . Consultêr al [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal canşladûri] per nōv particulêr.\nS' l' é necesâri a j aministradōr a gh'é incòra permés [$1 ed guardêr cla versiòun ché].", "rev-suppressed-text-unhide": "Cla versiòun ché 'd la pàgina l'é stêda scanşlêda . Consultêr al [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal canşladûri] per nōv particulêr.\nS' l' é necesâri a j aministradōr a gh'é incòra permés [$1 ed guardêr cla versiòun ché].", "rev-deleted-text-view": "Cla versiòun ché 'd la pàgina l'é stêda scanşlêda . J aministradōr a pōlen incòra guardêrla; \nconsultêr al [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal canşladûri] per nōv particulêr.", @@ -821,7 +826,6 @@ "searchprofile-advanced-tooltip": "Sērca int i spâsi di nòm fât só mzûra.", "search-result-size": "$1 ({{PLURAL:$2|'na parôla|$2 parôli}})", "search-result-category-size": "{{PLURAL:$1|1 utèint|$1 utèint}} ({{PLURAL:$2|1 sotcategoréia|$2 sotcategoréi}},{{PLURAL:$3|1 file|$3 files}})", - "search-result-score": "Impurtânsa: $1%", "search-redirect": "(redirect $1)", "search-section": "(sesiòun $1)", "search-file-match": "(relasiòun dèinter al file)", @@ -843,16 +847,42 @@ "powersearch-togglenone": "Nisûn", "powersearch-remember": "Arcôrda la siēlta per êtri sèirchi ch'é vō fêr", "search-external": "Sèirca fâta fōra", + "searchdisabled": "La sèirca intêrna ed {{SITENAME}} l'a funsiòuna mìa; int al mèinter a s' pōl pruvêr a druvêr un mutōr ed sèirca d'ed fōra cme Google. (A gh' è da nutêr però che còl che gh'é dèinter in {{SITENAME}} che es câten in chi mutōr a prém èser mìa arnuvê.)", + "search-error": "É sucès un erōr mèinter a's fêva la sèirca:$1", "preferences": "Preferèinsa", "mypreferences": "Preferèinsi", "prefs-edits": "Mudéfichi fâti:", + "prefsnologintext2": "Es prèiga ed l'ingres per impustêr al tō preferèinsi 'd utèint.", "prefs-skin": "Aspèt grâfich (skin)", "skin-preview": "Guêrda préma", "datedefault": "Nisóna preferèinsa", + "prefs-labs": "Funsiòun adâti in sperimèint", + "prefs-user-pages": "Pàgini utèint", + "prefs-personal": "Prufîl utèint", + "prefs-rc": "Ûltmi mudéfichi", + "prefs-watchlist": "Tgnîr sòt ôc", + "prefs-watchlist-days": "Nómer ed dé da fêr vèder int i tgnû 'd ôc specêl:", + "prefs-watchlist-days-max": "Mâsim $1 {{PLURAL:$1|dé}}", + "prefs-watchlist-edits": "Nómer 'd mudéfichi da fêr vèder cun al funsiòun pió şvilupêdi:", + "prefs-watchlist-edits-max": "Nómer mâsim:1000", + "prefs-watchlist-token": "Token tgnî d'ôc specêl:", + "prefs-misc": "Divêrs", + "prefs-resetpass": "Câmbia la cêva 'd ingrès", + "prefs-changeemail": "Câmbia l'indirés ed la pôsta eletrônica", + "prefs-setemail": "Impôsta un indirés ed pôsta eletrônica", + "prefs-email": "Siēlta pôsta eletrônica", + "prefs-rendering": "Aspèt", "saveprefs": "Sêlva", + "restoreprefs": "Turnêr a mèter al j impustasiòun ed partèinsa (in tót al sesiòun)", "prefs-editing": "Caşèla 'd mudéfica", "rows": "Rîghi", + "columns": "Clòuni:", "searchresultshead": "Sērca", + "stub-threshold": "Valōr ménim per i
    colegamèint a i stub, in byte:", + "stub-threshold-disabled": "Bluchê", + "recentchangesdays": "Nómer di dé da fêr vèder int al j ûltmi mudéfichi:", + "recentchangesdays-max": "Mâsim $1 {{PLURAL:$1|dé}}", + "recentchangescount": "Nómer ed mudéfichi da fêr vèder per default:", "timezoneregion-africa": "Âfrica", "timezoneregion-america": "Amèrica", "timezoneregion-antarctica": "Antârtide", @@ -938,7 +968,6 @@ "upload": "Cârga un 'file'", "uploadlogpage": "Fil carghê", "filedesc": "Sûnt.", - "uploadedimage": "l'à carghê \"[[$1]]\"", "license": "Licèinsa:", "license-header": "Licèinsa", "nolicense": "Nisóna licèinsa sgnêda", @@ -1056,7 +1085,7 @@ "whatlinkshere-filters": "Fîlter", "block": "Blôca l'utèint", "unblock": "Şblôcä l'utèint", - "blockip": "Blôcä l'utèint", + "blockip": "Blôcä {{GENDER:$1|utèint}}", "blockip-legend": "Blôcä l'utèint", "ipboptions": "2 ōri:2 hours,1 dé:1 day,3 dé:3 days,1 stmâna:1 week,2 stâni:2 weeks,1 mèiş:1 month,3 mèiş:3 months,6 mèiş:6 months,1 ân:1 year,infinito:infinite", "ipb-unblock-addr": "Şblôcä $1", diff --git a/languages/i18n/el.json b/languages/i18n/el.json index 5aec3ec7d8..80e4d79a3f 100644 --- a/languages/i18n/el.json +++ b/languages/i18n/el.json @@ -38,7 +38,8 @@ "Kolega2357", "아라", "Calak", - "Auslaender" + "Auslaender", + "Milicevic01" ] }, "tog-underline": "Υπογράμμιση συνδέσμων:", @@ -689,7 +690,7 @@ "undo-failure": "Η επεξεργασία δεν μπορούσε να αναστραφεί λόγω αντικρουόμενων ενδιάμεσων επεξεργασιών.", "undo-norev": "Η ανάκληση αυτής της επεξεργασίας δεν ηταν δυνατό να πραγματοποιηθεί επειδή δεν υπάρχει ή επειδή έχει διαγραφεί.", "undo-nochange": "Η επεξεργασία φαίνεται να έχει ήδη αναιρεθεί.", - "undo-summary": "Αναίρεση αναθεώρησης $1 υπό τον/την [[Special:Contributions/$2|$2]] ([[User talk:$2|Συζήτηση]])", + "undo-summary": "Αναίρεση αναθεώρησης $1 υπό τον/την [[Special:Contribs/$2|$2]] ([[User talk:$2|Συζήτηση]])", "undo-summary-username-hidden": "Αναίρεση αναθεώρησης $1 από ένα κρυμμένο χρήστη", "cantcreateaccounttitle": "Ο λογαριασμός δεν μπορεί να δημιουργηθεί", "cantcreateaccount-text": "Η δημιουργία λογαριασμού από αυτή τη διεύθυνση IP ('''$1''') έχει αποτραπεί από τον [[User:$3|$3]].\n\nΟ λόγος που δόθηκε από τον $3 είναι ''$2''", @@ -840,7 +841,6 @@ "searchprofile-advanced-tooltip": "Αναζήτηση σε προσαρμοσμένους ονοματοχώρους", "search-result-size": "$1 ({{PLURAL:$2|1 λέξη|$2 λέξεις}})", "search-result-category-size": "{{PLURAL:$1|1 μέλος|$1 μέλη}} ({{PLURAL:$2|1 υποκατηγορία|$2 υποκατηγορίες}}, {{PLURAL:$3|1 αρχείο|$3 αρχεία}})", - "search-result-score": "Σχετικότητα: $1%", "search-redirect": "(ανακατεύθυνση $1)", "search-section": "(ενότητα $1)", "search-file-match": "(ταιριάζει με το περιεχόμενο του αρχείου)", @@ -1235,8 +1235,6 @@ "uploadwarning": "Προειδοποίηση φόρτωσης", "uploadwarning-text": "Παρακαλώ αλλάξτε την περιγραφή του αρχείου παρακάτω και προσπαθήστε ξανά.", "savefile": "Αποθήκευση αρχείου", - "uploadedimage": "ανέβασε το «[[$1]]»", - "overwroteimage": "ανέβασμα νέας έκδοσης του \"[[$1]]\"", "uploaddisabled": "Το ανέβασμα αρχείων είναι απενεργοποιημένο.", "copyuploaddisabled": "Το ανέβασμα μέσω URL έχει απενεργοποιηθεί.", "uploaddisabledtext": "Το ανέβασμα αρχείων είναι απενεργοποιημένο.", @@ -1664,6 +1662,7 @@ "watchlist-details": "{{PLURAL:$1|$1 σελίδα|$1 σελίδες}} στη λίστα παρακολούθησης σας, χωρίς να προσμετρούνται οι σελίδες συζήτησης.", "wlheader-enotif": "Η ειδοποίηση ηλεκτρονικού ταχυδρομείου ενεργοποιήθηκε.", "wlheader-showupdated": "Σελίδες που έχουν υποστεί αλλαγές από την τελευταία φορά που τις επισκεφθήκατε εμφανίζονται με '''έντονους χαρακτήρες'''.", + "wlnote": "Παρακάτω είναι {{PLURAL:$1|η πιο πρόσφατη αλλαγή|οι '''$1''' πιο πρόσφατες αλλαγές}} κατά τη διάρκεια {{PLURAL:$2|της τελευταίας ώρας|των '''$2''' τελευταίων ωρών}} ως προς την $3, $4.", "wlshowlast": "Εμφάνιση των τελευταίων $1 ωρών $2 ημερών $3", "watchlist-options": "Επιλογές λίστας παρακολούθησης", "watching": "Παρακολούθηση...", diff --git a/languages/i18n/en.json b/languages/i18n/en.json index d506ad2371..a43a7421a0 100644 --- a/languages/i18n/en.json +++ b/languages/i18n/en.json @@ -267,6 +267,9 @@ "hidetoc": "hide", "collapsible-collapse": "Collapse", "collapsible-expand": "Expand", + "confirmable-confirm": "Are {{GENDER:$1|you}} sure?", + "confirmable-yes": "Yes", + "confirmable-no": "No", "thisisdeleted": "View or restore $1?", "viewdeleted": "View $1?", "restorelink": "{{PLURAL:$1|one deleted edit|$1 deleted edits}}", @@ -357,7 +360,7 @@ "invalidtitle-knownnamespace": "Invalid title with namespace \"$2\" and text \"$3\"", "invalidtitle-unknownnamespace": "Invalid title with unknown namespace number $1 and text \"$2\"", "exception-nologin": "Not logged in", - "exception-nologin-text": "Please [[Special:Userlogin|log in]] to be able to access this page or action.", + "exception-nologin-text": "Please log in to be able to access this page or action.", "exception-nologin-text-manual": "Please $1 to be able to access this page or action.", "virus-badscanner": "Bad configuration: Unknown virus scanner: $1", "virus-scanfailed": "scan failed (code $1)", @@ -703,11 +706,11 @@ "parser-template-loop-warning": "Template loop detected: [[$1]]", "parser-template-recursion-depth-warning": "Template recursion depth limit exceeded ($1)", "language-converter-depth-warning": "Language converter depth limit exceeded ($1)", - "node-count-exceeded-category": "Pages where node-count is exceeded", - "node-count-exceeded-category-desc": "A category for pages where the node-count is exceeded.", - "node-count-exceeded-warning": "Page exceeded the node-count", + "node-count-exceeded-category": "Pages where node count is exceeded", + "node-count-exceeded-category-desc": "The page exceeds the maximum node count.", + "node-count-exceeded-warning": "Page exceeded the node count", "expansion-depth-exceeded-category": "Pages where expansion depth is exceeded", - "expansion-depth-exceeded-category-desc": "This is a category for pages where the expansion depth is exceeded.", + "expansion-depth-exceeded-category-desc": "The page exceeds the maximum expansion depth.", "expansion-depth-exceeded-warning": "Page exceeded the expansion depth", "parser-unstrip-loop-warning": "Unstrip loop detected", "parser-unstrip-recursion-limit": "Unstrip recursion limit exceeded ($1)", @@ -882,7 +885,6 @@ "searchprofile-advanced-tooltip": "Search in custom namespaces", "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 words}})", "search-result-category-size": "{{PLURAL:$1|1 member|$1 members}} ({{PLURAL:$2|1 subcategory|$2 subcategories}}, {{PLURAL:$3|1 file|$3 files}})", - "search-result-score": "Relevance: $1%", "search-redirect": "(redirect $1)", "search-section": "(section $1)", "search-file-match": "(matches file content)", @@ -913,7 +915,7 @@ "preferences-summary": "", "mypreferences": "Preferences", "prefs-edits": "Number of edits:", - "prefsnologintext2": "Please $1 to change your preferences.", + "prefsnologintext2": "Please login to change your preferences.", "prefs-skin": "Skin", "skin-preview": "Preview", "datedefault": "No preference", @@ -1766,11 +1768,11 @@ "trackingcategories-desc": "Category inclusion criteria", "noindex-category-desc": "The page is not indexed by robots because it has the magic word __NOINDEX__ on it and is in a namespace where that flag is allowed.", "index-category-desc": "The page has a __INDEX__ on it (and is in a namespace where that flag is allowed), and hence is indexed by robots where it normally wouldn't be.", - "post-expand-template-inclusion-category-desc": "After expanding all the templates, the page size is bigger than $wgMaxArticleSize, so some templates weren't expanded.", - "post-expand-template-argument-category-desc": "After expanding a template argument (something in triple braces, like {{{Foo}}}), the page is bigger than $wgMaxArticleSize.", - "expensive-parserfunction-category-desc": "Too many expensive parser functions (like #ifexist) included on a page. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", - "broken-file-category-desc": "Category added if the page contains a broken file link (a link to embed a file when the file does not exist).", - "hidden-category-category-desc": "This is a category with __HIDDENCAT__ on it, which prevents it from showing up in the category links box on pages, by default.", + "post-expand-template-inclusion-category-desc": "The page size is bigger than $wgMaxArticleSize after expanding all the templates, so some templates were not expanded.", + "post-expand-template-argument-category-desc": "The page is bigger than $wgMaxArticleSize after expanding a template argument (something in triple braces, like {{{Foo}}}).", + "expensive-parserfunction-category-desc": "The page uses too many expensive parser functions (like #ifexist). See [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", + "broken-file-category-desc": "The page contains a broken file link (a link to embed a file when the file does not exist).", + "hidden-category-category-desc": "The category contains __HIDDENCAT__ in its page content, which prevents it from showing up in the category links box on pages by default.", "trackingcategories-nodesc": "No description available.", "trackingcategories-disabled": "Category is disabled", "mailnologin": "No send address", @@ -1810,7 +1812,7 @@ "mywatchlist": "Watchlist", "watchlistfor2": "For $1 $2", "nowatchlist": "You have no items on your watchlist.", - "watchlistanontext": "Please $1 to view or edit items on your watchlist.", + "watchlistanontext": "Please login to view or edit items on your watchlist.", "watchnologin": "Not logged in", "addwatch": "Add to watchlist", "addedwatchtext": "The page \"[[:$1]]\" has been added to your [[Special:Watchlist|watchlist]].\nFuture changes to this page and its associated talk page will be listed there.", @@ -1874,6 +1876,7 @@ "delete-edit-reasonlist": "Edit deletion reasons", "delete-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeletion of such pages has been restricted to prevent accidental disruption of {{SITENAME}}.", "delete-warning-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeleting it may disrupt database operations of {{SITENAME}};\nproceed with caution.", + "delete-cantedit": "You cannot delete this page because you do not have permission to edit it.", "deleting-backlinks-warning": "'''Warning:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Other pages]] link to or transclude the page you are about to delete.", "rollback": "Roll back edits", "rollback_short": "Rollback", @@ -2044,7 +2047,7 @@ "block": "Block user", "unblock": "Unblock user", "unblock-summary": "", - "blockip": "Block user", + "blockip": "Block {{GENDER:$1|user}}", "blockip-legend": "Block user", "blockiptext": "Use the form below to block write access from a specific IP address or username.\nThis should be done only to prevent vandalism, and in accordance with [[{{MediaWiki:Policy-url}}|policy]].\nFill in a specific reason below (for example, citing particular pages that were vandalized).", "ipaddressorusername": "IP address or username:", @@ -2073,7 +2076,7 @@ "ipb-unblock-addr": "Unblock $1", "ipb-unblock": "Unblock a username or IP address", "ipb-blocklist": "View existing blocks", - "ipb-blocklist-contribs": "Contributions for $1", + "ipb-blocklist-contribs": "Contributions for {{GENDER:$1|$1}}", "unblockip": "Unblock user", "unblockiptext": "Use the form below to restore write access to a previously blocked IP address or username.", "ipusubmit": "Remove this block", @@ -3261,13 +3264,13 @@ "version-software": "Installed software", "version-software-product": "Product", "version-software-version": "Version", - "version-db-mysql-url": "http://www.mysql.com/", - "version-db-mariadb-url": "http://mariadb.org/", + "version-db-mysql-url": "https://www.mysql.com/", + "version-db-mariadb-url": "https://mariadb.org/", "version-db-percona-url": "http://www.percona.com/software/percona-server", "version-db-postgres-url": "http://www.postgresql.org/", "version-db-oracle-url": "http://www.oracle.com/database/", - "version-db-sqlite-url": "http://www.sqlite.org/", - "version-db-mssql-url": "http://www.microsoft.com/sql/", + "version-db-sqlite-url": "https://www.sqlite.org/", + "version-db-mssql-url": "https://www.microsoft.com/sql/", "version-entrypoints": "Entry point URLs", "version-entrypoints-header-entrypoint": "Entry point", "version-entrypoints-header-url": "URL", @@ -3400,6 +3403,9 @@ "logentry-rights-rights": "$1 {{GENDER:$2|changed}} group membership for $3 from $4 to $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|changed}} group membership for $3", "logentry-rights-autopromote": "$1 was automatically {{GENDER:$2|promoted}} from $4 to $5", + "logentry-upload-upload": "$1 {{GENDER:$2|uploaded}} $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|uploaded}} a new version of $3", + "logentry-upload-revert": "$1 {{GENDER:$2|uploaded}} $3", "rightsnone": "(none)", "revdelete-logentry": "changed revision visibility of \"[[$1]]\"", "logdelete-logentry": "changed event visibility of \"[[$1]]\"", @@ -3529,5 +3535,9 @@ "action-pagelang": "change the page language", "log-name-pagelang": "Change language log", "log-description-pagelang": "This is a log of changes in page languages.", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2|changed}} page language for $3 from $4 to $5." + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|changed}} page language for $3 from $4 to $5.", + "default-skin-not-found": "Whoops! The default skin for your wiki ($wgDefaultSkin), $1, is not available.\n\nYour installation seems to include the following skins. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable them and choose the default.\n\n$2\n\n; If you have just installed MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the skins/ directory from it.\n:* Cloning one of the mediawiki/skins/* repositories via git into the skins/ directory of your MediaWiki installation.\n: Doing this should not interfere with your git repository if you're a MediaWiki developer.\n\n; If you have just upgraded MediaWiki:\n: MediaWiki 1.24 and newer no longer automatically enables installed skins (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). You can paste the following lines into LocalSettings.php to enable all currently installed skins:\n\n
    $3
    \n\n; If you have just modified LocalSettings.php:\n: Double-check the skin names for typos.", + "default-skin-not-found-no-skins": "Whoops! The default skin for your wiki ($wgDefaultSkin), $1, is not available.\n\nYou have no installed skins.\n\n; If you have just installed or upgraded MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. MediaWiki 1.24 and newer doesn't include any skins in the main repository. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the skins/ directory from it.\n:* Cloning one of the mediawiki/skins/* repositories via git into the skins/ directory of your MediaWiki installation.\n: Doing this should not interfere with your git repository if you're a MediaWiki developer. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable skins and choose the default.\n", + "default-skin-not-found-row-enabled": "* $1 / $2 (enabled)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''disabled''')" } diff --git a/languages/i18n/es.json b/languages/i18n/es.json index 787e7509ee..0c50c2cced 100644 --- a/languages/i18n/es.json +++ b/languages/i18n/es.json @@ -113,7 +113,8 @@ "Macofe", "Koavf", "Themasterriot", - "AVIADOR" + "AVIADOR", + "F3RaN" ] }, "tog-underline": "Subrayar los enlaces:", @@ -316,7 +317,7 @@ "otherlanguages": "Otros idiomas", "redirectedfrom": "(Redirigido desde «$1»)", "redirectpagesub": "Página de redirección", - "lastmodifiedat": "Esta página fue modificada por última vez el $1, a las $2.", + "lastmodifiedat": "Esta página fue modificada por última vez el $1 a las $2.", "viewcount": "Esta página se ha visitado {{PLURAL:$1|una vez|$1 veces}}.", "protectedpage": "Página protegida", "jumpto": "Saltar a:", @@ -324,13 +325,13 @@ "jumptosearch": "buscar", "view-pool-error": "Lo sentimos, los servidores están sobrecargados en este momento.\nHay demasiados usuarios que están tratando de ver esta página.\nEspera un momento antes de tratar de acceder nuevamente a esta página.\n\n$1", "generic-pool-error": "Lo sentimos, los servidores están sobrecargados en este momento.\nHay demasiados usuarios que están tratando de ver este recurso.\nEspera un momento antes de tratar de acceder nuevamente a este recurso.", - "pool-timeout": "Tiempo limite agotado para el bloqueo", + "pool-timeout": "Se agotó el tiempo de espera del candado", "pool-queuefull": "La cola de trabajo está llena", "pool-errorunknown": "Error desconocido", - "pool-servererror": "El servicio de contador de la piscina no está disponible ($1).", + "pool-servererror": "El servicio de gestión de procesos agrupados no está disponible ($1).", "aboutsite": "Acerca de {{SITENAME}}", "aboutpage": "Project:Acerca de", - "copyright": "El contenido está disponible bajo $1 a menos que se indique lo contrario.", + "copyright": "El contenido está disponible bajo la licencia $1 a menos que se indique lo contrario.", "copyrightpage": "{{ns:project}}:Derechos de autor", "currentevents": "Actualidad", "currentevents-url": "Project:Actualidad", @@ -351,8 +352,8 @@ "versionrequiredtext": "Se necesita la versión $1 de MediaWiki para utilizar esta página. Para más información, consultar [[Special:Version|la página de versión]]", "ok": "Aceptar", "retrievedfrom": "Obtenido de «$1»", - "youhavenewmessages": "Tienes $1 ($2).", - "youhavenewmessagesfromusers": "Tienes $1 de {{PLURAL:$3|otro usuario|$3 usuarios}} ($2).", + "youhavenewmessages": "{{PLURAL:$3|Tienes}} $1 ($2).", + "youhavenewmessagesfromusers": "{{PLURAL:$4|Tienes}} $1 de {{PLURAL:$3|otro usuario|$3 usuarios}} ($2).", "youhavenewmessagesmanyusers": "Tienes $1 de muchos usuarios ($2).", "newmessageslinkplural": "{{PLURAL:$1|un mensaje nuevo|999=mensajes nuevos}}", "newmessagesdifflinkplural": "{{PLURAL:$1|último cambio|999=últimos cambios}}", @@ -363,11 +364,14 @@ "editlink": "modificar", "viewsourcelink": "ver código", "editsectionhint": "Editar sección: $1", - "toc": "Contenidos", + "toc": "Contenido", "showtoc": "mostrar", "hidetoc": "ocultar", "collapsible-collapse": "Contraer", "collapsible-expand": "Expandir", + "confirmable-confirm": "¿Estás {{GENDER:$1|seguro|segura}}?", + "confirmable-yes": "Sí", + "confirmable-no": "No", "thisisdeleted": "¿Ver o restaurar $1?", "viewdeleted": "¿Quieres ver $1?", "restorelink": "{{PLURAL:$1|una edición borrada|$1 ediciones borradas}}", @@ -452,7 +456,7 @@ "invalidtitle-knownnamespace": "El título con el espacio de nombres «$2» y el texto «$3» no es válido", "invalidtitle-unknownnamespace": "El título con el espacio de nombres desconocido (n.º $1) y el texto «$2» no es válido", "exception-nologin": "No has iniciado sesión", - "exception-nologin-text": "[[Special:Userlogin|Inicia sesión]] para acceder a esta página o acción.", + "exception-nologin-text": "Necesitas acceder para ver esta página o llevar a cabo esta acción.", "exception-nologin-text-manual": "Necesitas $1 para acceder a esta página o acción.", "virus-badscanner": "Configuración incorrecta: antivirus desconocido: $1", "virus-scanfailed": "falló el análisis (código $1)", @@ -765,10 +769,10 @@ "parser-template-recursion-depth-warning": "Se ha excedido el límite de recursión de plantillas ($1)", "language-converter-depth-warning": "El límite de profundidad del convertidor de idioma ha excedido ($1)", "node-count-exceeded-category": "Páginas donde se supera el número de nodos", - "node-count-exceeded-category-desc": "Una categoría para las páginas donde se supera el número de nodos.", + "node-count-exceeded-category-desc": "La página supera el número máximo de nodos.", "node-count-exceeded-warning": "Página que ha superado el número de nodos", "expansion-depth-exceeded-category": "Páginas donde se supera la profundidad de expansión", - "expansion-depth-exceeded-category-desc": "Esta es una categoría para las páginas donde se supera la profundidad de expansión.", + "expansion-depth-exceeded-category-desc": "Esta página supera el límite de extensión.", "expansion-depth-exceeded-warning": "Página que ha superado la profundidad de expansión", "parser-unstrip-loop-warning": "Se ha detectado un bucle \"unstrip\"", "parser-unstrip-recursion-limit": "Se ha superado el límite de recursión de \"unstrip\" ($1)", @@ -924,7 +928,7 @@ "nextn-title": "Próximos $1 {{PLURAL:$1|resultado|resultados}}", "shown-title": "Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página", "viewprevnext": "Ver ($1 {{int:pipe-separator}} $2) ($3).", - "searchmenu-exists": "'''Hay una página llamada «[[:$1]]» en este wiki.'''", + "searchmenu-exists": "Hay una página llamada «[[:$1]]» en este wiki. {{PLURAL:$2|0=|Véase también los otros resultados de búsqueda encontrados.}}", "searchmenu-new": "Crear la página «[[:$1]]» en este wiki. {{PLURAL:$2|0=|Véase también la página encontrada con la búsqueda.|Véanse también los resultados de la búsqueda.}}", "searchprofile-articles": "Páginas de contenido", "searchprofile-images": "Multimedia", @@ -936,7 +940,6 @@ "searchprofile-advanced-tooltip": "Buscar en espacios de nombres personalizados", "search-result-size": "$1 ({{PLURAL:$2|1 palabra|$2 palabras}})", "search-result-category-size": "{{PLURAL:$1|1 miembro|$1 miembros}} ({{PLURAL:$2|1 subcategoría|$2 subcategorías}}, {{PLURAL:$3|1 fichero|$3 ficheros}})", - "search-result-score": "Relevancia: $1%", "search-redirect": "(redirige desde $1)", "search-section": "(sección $1)", "search-file-match": "(coincide con el contenido del archivo)", @@ -963,7 +966,7 @@ "preferences": "Preferencias", "mypreferences": "Preferencias", "prefs-edits": "Cantidad de ediciones:", - "prefsnologintext2": "Necesitas $1 para definir las preferencias del usuario.", + "prefsnologintext2": "Es necesario acceder para cambiar las preferencias del usuario.", "prefs-skin": "Apariencia", "skin-preview": "Previsualizar", "datedefault": "Sin preferencia", @@ -991,9 +994,9 @@ "searchresultshead": "Búsquedas", "stub-threshold": "Límite para formato de enlace a esbozo (bytes):", "stub-threshold-disabled": "Desactivado", - "recentchangesdays": "Días a mostrar en cambios recientes:", + "recentchangesdays": "Días que mostrar en Cambios recientes:", "recentchangesdays-max": "(máximo {{PLURAL:$1|un día|$1 días}})", - "recentchangescount": "Número de ediciones a mostrar de manera predeterminada:", + "recentchangescount": "N.º de ediciones que mostrar de manera predeterminada:", "prefs-help-recentchangescount": "Esto incluye cambios recientes, historiales de página, y registros.", "prefs-help-watchlist-token2": "Esta es la clave secreta para el canal de contenido web de tu lista de seguimiento.\nCualquier persona que la conozca podría leer tu lista, así que no la compartas.\n[[Special:ResetTokens|Pulsa aquí si necesitas restablecerla]].", "savedprefs": "Se han guardado tus preferencias.", @@ -1339,11 +1342,9 @@ "uploadwarning": "Advertencia de subida de archivo", "uploadwarning-text": "Por favor, modifique la descripción del archivo abajo indicada e inténtelo de nuevo.", "savefile": "Guardar archivo", - "uploadedimage": "subió «[[$1]]»", - "overwroteimage": "subió una nueva versión de «[[$1]]»", - "uploaddisabled": "Subida de archivos deshabilitada", + "uploaddisabled": "Se desactivó la carga de archivos.", "copyuploaddisabled": "Carga por URL deshabilitada.", - "uploaddisabledtext": "No es posible subir archivos.", + "uploaddisabledtext": "Se desactivó la carga de archivos.", "php-uploaddisabledtext": "La subida de archivos está deshabilitada en PHP. Por favor compruebe file_uploads en php.ini.", "uploadscripted": "Este archivo contiene script o código HTML que puede ser interpretado erróneamente por un navegador web.", "uploadscriptednamespace": "Este archivo SVG contiene un espacio de nombre no permitido '$1'", @@ -1750,9 +1751,9 @@ "index-category-desc": "La página contiene la palabra mágica __INDEX__ (y está en un espacio de nombres donde la función está activada); y por ello los robots la indizarán.", "post-expand-template-inclusion-category-desc": "Después de expandir todas las plantillas, el tamaño de la página es más grande que $wgMaxArticleSize, así que algunas plantillas no se expandieron.", "post-expand-template-argument-category-desc": "Después de expandir un argumento de plantilla (algunos en tres llaves, como {{{Foo}}}), la página es más grande que $wgMaxArticleSize.", - "expensive-parserfunction-category-desc": "Páginas que contienen demasiadas funciones sintácticas muy costosas (como #ifexist). Consulta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", - "broken-file-category-desc": "Categoría añadida cuando una página contiene enlaces rotos a archivos (enlaces a archivos incrustados cuando el archivo no existe).", - "hidden-category-category-desc": "Esta es una categoría con __HIDDENCAT__ en ella, que evita que aparezca en el cuadro de enlace de la categoría en las páginas, de forma predeterminada.", + "expensive-parserfunction-category-desc": "La página usa demasiadas funciones sintácticas costosas (como #ifexist). Consulta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", + "broken-file-category-desc": "La página contiene un enlace roto a archivos (un enlace para incrustar un archivo cuando el archivo no existe).", + "hidden-category-category-desc": "La categoría contiene __HIDDENCAT__ en su página de contenido, lo que evita que aparezca en el cuadro de enlaces de categorías en las páginas, de forma predeterminada.", "trackingcategories-nodesc": "No hay descripción disponible.", "trackingcategories-disabled": "La categoría está desactivada", "mailnologin": "Ninguna dirección de envio", @@ -1789,7 +1790,7 @@ "mywatchlist": "Lista de seguimiento", "watchlistfor2": "Para $1 $2", "nowatchlist": "No tienes ninguna página en tu lista de seguimiento.", - "watchlistanontext": "Para ver o editar las entradas de tu lista de seguimiento es necesario $1.", + "watchlistanontext": "Es necesario acceder para ver o editar los elementos de tu lista de seguimiento.", "watchnologin": "No has iniciado sesión", "addwatch": "Añadir a la lista de seguimiento", "addedwatchtext": "La página «[[:$1]]» ha sido añadida a tu [[Special:Watchlist|lista de seguimiento]]. Los cambios futuros en esta página y en su página de discusión asociada se indicarán ahí.", @@ -2013,7 +2014,7 @@ "autoblockid": "Bloqueo automático #$1", "block": "Bloquear usuario", "unblock": "Desbloquear usuario", - "blockip": "Bloquear usuario", + "blockip": "Bloquear {{GENDER:$1|al usuario|a la usuaria}}", "blockip-legend": "Bloquear usuario", "blockiptext": "Usa el siguiente formulario para bloquear el acceso de escritura desde una dirección IP específica o nombre de usuario.\nEsto debería hacerse sólo para prevenir vandalismos, y de acuerdo a las [[{{MediaWiki:Policy-url}}|políticas]].\nExplica la razón específica del bloqueo (por ejemplo, citando las páginas en particular que han sido objeto de vandalismo).", "ipaddressorusername": "Dirección IP o nombre de usuario:", @@ -2042,7 +2043,7 @@ "ipb-unblock-addr": "Desbloquear $1", "ipb-unblock": "Desbloquear un usuario o una IP", "ipb-blocklist": "Ver bloqueos vigentes", - "ipb-blocklist-contribs": "Contribuciones de $1", + "ipb-blocklist-contribs": "Contribuciones de {{GENDER:$1|$1}}", "unblockip": "Desbloquear usuario", "unblockiptext": "Use el formulario a continuación para devolver los permisos de escritura a una dirección IP que ha sido bloqueada.", "ipusubmit": "Desactivar este bloqueo", @@ -2055,7 +2056,7 @@ "blocklist-userblocks": "Ocultar bloqueos de cuenta", "blocklist-tempblocks": "Ocultar bloqueos temporales", "blocklist-addressblocks": "Ocultar bloqueos de una sola dirección IP", - "blocklist-rangeblocks": "Ocultar bloqueos de rango", + "blocklist-rangeblocks": "Ocultar bloqueos por intervalo", "blocklist-timestamp": "Fecha y hora", "blocklist-target": "Destino", "blocklist-expiry": "Caduca", @@ -3096,8 +3097,8 @@ "revdelete-unrestricted": "restricciones para administradores eliminadas", "logentry-move-move": "$1 movió la página $3 a $4", "logentry-move-move-noredirect": "$1 movió la página $3 a $4 sin dejar una redirección", - "logentry-move-move_redir": "$1 movió la página $3 a $4 sobre una redirección", - "logentry-move-move_redir-noredirect": "$1 movió la página $3 a $4 sobre una redirección y sin dejar una redirección", + "logentry-move-move_redir": "$1 {{GENDER:$2|trasladó}} la página $3 a $4 sobre una redirección", + "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|trasladó}} la página $3 a $4 sobre una redirección y sin dejar una redirección", "logentry-patrol-patrol": "$1 {{GENDER:$2|marcó}} como patrullada la edición $4 de la página $3", "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|marcó}} automáticamente la edición $4 de la página $3 como patrullada", "logentry-newusers-newusers": "La cuenta de usuario $1 ha sido {{GENDER:$2|creada}}", @@ -3108,6 +3109,9 @@ "logentry-rights-rights": "$1 modificó los grupos a los que pertenece $3: de $4 a $5", "logentry-rights-rights-legacy": "$1 modificó los grupos a los que pertenece $3", "logentry-rights-autopromote": "$1 ha sido {{GENDER:$2|promocionado|promocionada}} automáticamente de $4 a $5", + "logentry-upload-upload": "$1 {{GENDER:$2|subió}} $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|subió}} una nueva versión de $3", + "logentry-upload-revert": "$1 {{GENDER:$2|subió}} $3", "rightsnone": "(ninguno)", "feedback-bugornote": "Si estás preparado para describir en detalle un problema técnico, [$1 informa de un bug] por favor.\n\nEn otro caso, puedes usar el siguiente formulario. Tu comentario será añadido a la página [$3 $2], junto con tu nombre de usuario y el navegador que usas.", "feedback-subject": "Asunto:", @@ -3210,5 +3214,7 @@ "action-pagelang": "cambiar el idioma de la página", "log-name-pagelang": "Registro de cambios en idiomas", "log-description-pagelang": "Este es un registro de los cambios en los idiomas de las páginas.", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2|cambió}} el idioma de la página «$3» del $4 al $5." + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|cambió}} el idioma de la página «$3» del $4 al $5.", + "default-skin-not-found-row-enabled": "* $1 / $2 (activado)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''desactivado''')" } diff --git a/languages/i18n/et.json b/languages/i18n/et.json index 7bff800bdd..a3879ff5c9 100644 --- a/languages/i18n/et.json +++ b/languages/i18n/et.json @@ -838,7 +838,6 @@ "searchprofile-advanced-tooltip": "Otsi kohandatud nimeruumidest", "search-result-size": "$1 ({{PLURAL:$2|1 sõna|$2 sõna}})", "search-result-category-size": "{{PLURAL:$1|1 lehekülg|$1 lehekülge}} ({{PLURAL:$2|1 alamkategooria|$2 alamkategooriat}}, {{PLURAL:$3|1 fail|$3 faili}})", - "search-result-score": "Vastavus: $1%", "search-redirect": "(ümbersuunamine $1)", "search-section": "(alaosa $1)", "search-file-match": "(vastab faili sisule)", @@ -1241,8 +1240,6 @@ "uploadwarning": "Üleslaadimise hoiatus", "uploadwarning-text": "Muuda allpool olevat faili kirjeldust ning proovi uuesti.", "savefile": "Salvesta fail", - "uploadedimage": "laadis üles faili \"[[$1]]\"", - "overwroteimage": "laadis üles faili \"[[$1]]\" uue versiooni", "uploaddisabled": "Üleslaadimine hetkel keelatud", "copyuploaddisabled": "Internetiaadressilt üleslaadimine on keelatud.", "uploaddisabledtext": "Faili üleslaadimine on keelatud.", diff --git a/languages/i18n/fa.json b/languages/i18n/fa.json index 51e07bd033..8b474a6eeb 100644 --- a/languages/i18n/fa.json +++ b/languages/i18n/fa.json @@ -53,6 +53,7 @@ "tog-watchdefault": "صفحه‌ها و پرونده‌هایی که ویرایش می‌کنم به فهرست پی‌گیری‌هایم افزوده شود", "tog-watchmoves": "صفحه‌ها و پرونده‌هایی که منتقل می‌کنم به فهرست پی‌گیری‌هایم افزوده شود", "tog-watchdeletion": "صفحه‌ها و پرونده‌هایی که حذف می‌کنم به فهرست پی‌گیری‌هایم افزوده شود", + "tog-watchrollback": "افزودن صفحاتی که واگردانی کردم برای فهرست پیگیری‌هایم", "tog-minordefault": "همهٔ ویرایش‌ها به طور پیش‌فرض به عنوان «جزئی» علامت بخورد", "tog-previewontop": "پیش‌نمایش قبل از جعبهٔ ویرایش نمایش یابد", "tog-previewonfirst": "پیش‌نمایش هنگام اولین ویرایش نمایش یابد", @@ -291,6 +292,8 @@ "hidetoc": "نهفتن", "collapsible-collapse": "نهفتن", "collapsible-expand": "گسترش", + "confirmable-yes": "بله", + "confirmable-no": "خیر", "thisisdeleted": "نمایش یا احیای $1؟", "viewdeleted": "نمایش $1؟", "restorelink": "{{PLURAL:$1|یک|$1}} ویرایش حذف‌شده", @@ -861,7 +864,6 @@ "searchprofile-advanced-tooltip": "جستجو در فضاهای نام دلخواه", "search-result-size": "$1 ({{PLURAL:$2|یک واژه|$2 واژه}})", "search-result-category-size": "{{PLURAL:$1|یک عضو|$1 عضو}} ({{PLURAL:$2|یک زیررده|$2 زیررده}}، {{PLURAL:$3|یک پرونده|$3 پرونده}})", - "search-result-score": "ارتباط: $1٪", "search-redirect": "(تغییرمسیر $1)", "search-section": "(بخش $1)", "search-file-match": "(تشابه محتوی پرونده)", @@ -1265,8 +1267,6 @@ "uploadwarning": "هشدار بارگذاری", "uploadwarning-text": "لطفاً توضیحات پرونده را در زیر تغییر دهید و دوباره تلاش کنید.", "savefile": "ذخیرهٔ پرونده", - "uploadedimage": "«[[$1]]» را بارگذاری کرد", - "overwroteimage": "نسخه جدیدی از «[[$1]]» را بارگذاری کرد", "uploaddisabled": "بارگذاری غیرفعال است.", "copyuploaddisabled": "بارگذاری از طریق نشانی اینترنتی غیرفعال است.", "uploaddisabledtext": "امکان بارگذاری پرونده غیرفعال است.", @@ -1376,8 +1376,8 @@ "nolicense": "هیچ کدام انتخاب نشده‌است", "licenses-edit": "گزینه‌های مجوز ویرایش", "license-nopreview": "(پیش‌نمایش وجود ندارد)", - "upload_source_url": "(یک نشانی اینترنتی معتبر و قابل دسترسی برای عموم)", - "upload_source_file": "(پرونده‌ای در رایانهٔ شما)", + "upload_source_url": "(شما یک پرونده انتخاب از یک URL معتبر و دسترس عموم انتخاب کردید)", + "upload_source_file": "(پرونده‌ای از رایانهٔ شما انتخاب شده‌است)", "listfiles-delete": "حذف", "listfiles-summary": "این صفحهٔ ویژه تمام پرونده‌های بارگذاری‌شده را نمایش می‌دهد.", "listfiles_search_for": "جستجو به دنبال نام پرونده چندرسانه‌ای:", @@ -1732,7 +1732,7 @@ "watchlist-details": "بدون احتساب صفحه‌های جداگانهٔ بحث، {{PLURAL:$1|$1 صفحه|$1 صفحه}} در فهرست پی‌گیری‌های شما قرار {{PLURAL:$1|دارد|دارند}}.", "wlheader-enotif": "آگاه‌سازی رایانامه‌ای فعال است.", "wlheader-showupdated": "صفحه‌هایی که پس از آخرین بازدید شما تغییر کرده‌اند '''پررنگ''' نمایش داده شده‌اند.", - "wlnote": "در زیر {{PLURAL:$1|تغییری|$1 تغییری}} که در {{PLURAL:$2|ساعت|$2 ساعت}} گذشته انجام شده موجود است، تاریخ آخرین بازیابی: $3، $4", + "wlnote": "در زیر {{PLURAL:$1|تغییری|$1 تغییری}} که در {{PLURAL:$2|ساعت|$2 ساعت}} گذشته انجام شده موجود است، تاریخ آخرین بازیابی: $3، $4", "wlshowlast": "نمایش آخرین $1 ساعت $2 روز $3", "watchlist-options": "گزینه‌های پی‌گیری", "watching": "پی‌گیری...", @@ -3085,6 +3085,9 @@ "logentry-rights-rights": "$1 عضویت $3 را از گروه $4 به $5 {{GENDER:$2|تغییر داد}}", "logentry-rights-rights-legacy": "$1 گروه عضویت $3 را {{GENDER:$2|تغییر داد}}", "logentry-rights-autopromote": "$1 به طور خودکار از $4 به $5 {{GENDER:$2|ارتقاء داد}}", + "logentry-upload-upload": "$1 {{GENDER:$2|بارگذاری کرد}} $3", + "logentry-upload-overwrite": "$1 یک نسخهٔ جدید {{GENDER:$2|بارگذاری‌کرد}} $3", + "logentry-upload-revert": "$1 {{GENDER:$2|بارگذاری کرد}} $3", "rightsnone": "(هیچ)", "feedback-bugornote": "اگر آماده‌اید تا مشکلی فنی را با جزئیاتش شرح دهید لطفاً [$1 یک ایراد گزارش دهید]. در غیر این صورت می‌توانید از فرم سادهٔ زیر استفاده کنید. نظر شما به همراه نام کاربری و مرورگرتان به صفحهٔ «[$3 $2]» افزوده خواهد شد.", "feedback-subject": "موضوع:", @@ -3187,5 +3190,7 @@ "action-pagelang": "تغییر زبان صفحه", "log-name-pagelang": "تغییر سیاههٔ زبان", "log-description-pagelang": "این سیاههٔ تغییرات صفحهٔ زبان‌ها است.", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2| تغییریافت}} زبان صفحه برای $3 از $4 به $5 ." + "logentry-pagelang-pagelang": "$1 {{GENDER:$2| تغییریافت}} زبان صفحه برای $3 از $4 به $5 .", + "default-skin-not-found-row-enabled": "* $1 / $2 (فعال)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''غیر فعال''')" } diff --git a/languages/i18n/fi.json b/languages/i18n/fi.json index 60f90cf618..b9e71e185b 100644 --- a/languages/i18n/fi.json +++ b/languages/i18n/fi.json @@ -86,7 +86,7 @@ "underline-never": "Ei koskaan", "underline-default": "Ulkoasun tai selaimen oletustapa", "editfont-style": "Muokkauskentän kirjasintyyppi", - "editfont-default": "Selaimen oletus", + "editfont-default": "Selaimen vakioasetus", "editfont-monospace": "Tasalevyinen kirjasin", "editfont-sansserif": "Sans-serif-kirjasin", "editfont-serif": "Serif-kirjasin", @@ -296,6 +296,9 @@ "hidetoc": "piilota", "collapsible-collapse": "Supista", "collapsible-expand": "Laajenna", + "confirmable-confirm": "Oletko varma?", + "confirmable-yes": "Kyllä", + "confirmable-no": "Ei", "thisisdeleted": "Näytä tai palauta $1?", "viewdeleted": "Näytä $1?", "restorelink": "{{PLURAL:$1|yksi poistettu muokkaus|$1 poistettua muokkausta}}", @@ -380,7 +383,7 @@ "invalidtitle-knownnamespace": "Virheellinen sivunimi, nimiavaruus \"$2\" ja teksti \"$3\"", "invalidtitle-unknownnamespace": "Virheellinen sivunimi, tuntematon nimiavaruus numero $1 ja teksti \"$2\"", "exception-nologin": "Et ole kirjautunut sisään", - "exception-nologin-text": "Ole hyvä ja [[Special:Userlogin|kirjaudu sisään]], niin pääset tälle sivulle tai tähän toimintoon.", + "exception-nologin-text": "Ole hyvä ja kirjaudu sisään, niin pääset tälle sivulle tai tähän toimintoon.", "exception-nologin-text-manual": "Sinun pitää $1 jotta pääset tälle sivulle tai toimintoon.", "virus-badscanner": "Virheellinen asetus: Tuntematon virustutka: ''$1''", "virus-scanfailed": "virustarkistus epäonnistui virhekoodilla $1", @@ -693,10 +696,10 @@ "parser-template-recursion-depth-warning": "Mallineen rekursioraja ylittyi ($1)", "language-converter-depth-warning": "Kielimuuntimen syvyysraja ylittyi ($1)", "node-count-exceeded-category": "Sivut, joissa solmumäärä on ylitetty", - "node-count-exceeded-category-desc": "Luokka sivuille, joissa solmujen lukumäärä (node-count) on ylitetty.", - "node-count-exceeded-warning": "Sivu ylitti solmumäärän", + "node-count-exceeded-category-desc": "Tämä sivu ylittää suurimman sallitun solmujen lukumäärän (node count).", + "node-count-exceeded-warning": "Sivu ylitti solmumäärän (node count)", "expansion-depth-exceeded-category": "Sivut, joissa laajentamissyvyys on ylitetty", - "expansion-depth-exceeded-category-desc": "Tämä on luokka sivuille, joissa laajentamissyvyys (expansion depth) on ylitetty.", + "expansion-depth-exceeded-category-desc": "Tämä sivu ylittää suurimman sallitun laajentamissyvyyden (expansion depth).", "expansion-depth-exceeded-warning": "Sivu ylitti laajentamissyvyyden.", "parser-unstrip-loop-warning": "Unstrip-silmukka havaittiin", "parser-unstrip-recursion-limit": "Unstrip-rekursion enimmäissyvyys ($1) ylitettiin", @@ -804,29 +807,29 @@ "suppressionlog": "Häivytysloki", "suppressionlogtext": "Alla on luettelo poistoista ja muokkausestoista, jotka sisältävät ylläpitäjiltä piilotettua materiaalia.\n[[Special:BlockList|Estolistassa]] on lueteltu voimassa olevat muokkauskiellot ja muokkausestot.", "mergehistory": "Yhdistä sivujen muutoshistoriat", - "mergehistory-header": "Tämä sivu mahdollistaa sivun muutoshistorian yhdistämisen uudemman sivun muutoshistoriaan.\nUuden ja vanhan sivun muutoksien pitää muodostaa jatkumo – ne eivät saa mennä ristikkäin.", - "mergehistory-box": "Yhdistä kahden sivun muutoshistoria", - "mergehistory-from": "Lähdesivu", - "mergehistory-into": "Kohdesivu", + "mergehistory-header": "Tällä sivulla voit yhdistää lähdesivun sivuhistorian versioita uudemman sivun historiaan.\nVarmista, että sivujen yhtenäinen muokkaushistoria säilyy eikä mene ristikkäin sekaisin!", + "mergehistory-box": "Yhdistä kahden sivun versioita:", + "mergehistory-from": "Lähdesivu:", + "mergehistory-into": "Kohdesivu:", "mergehistory-list": "Sivuhistoria, joka voidaan yhdistää", - "mergehistory-merge": "Seuraavat sivun [[:$1]] muutokset voidaan liittää sivun [[:$2]] muutoshistoriaan. Voit valita version, jota myöhempiä muutoksia ei liitetä. Selainlinkkien käyttäminen kadottaa tämän valinnan.", - "mergehistory-go": "Etsi muutokset", + "mergehistory-merge": "Seuraavat versiot sivusta [[:$1]] voidaan yhdistää sivuun [[:$2]]. \n\nValintamerkin sijoituksella voit yhdistää vain ne versiot, jotka on luotu valittuna ajankohtana tai sitä ennen (listassa alaspäin). \nOta huomioon, että jos käytät navigaatiolinkkejä, tekemäsi valinta poistuu.", + "mergehistory-go": "Etsi muokkaukset, jotka voidaan yhdistää", "mergehistory-submit": "Yhdistä versiot", - "mergehistory-empty": "Ei liitettäviä muutoksia.", - "mergehistory-success": "{{PLURAL:$3|Yksi versio|$3 versiota}} sivusta [[:$1]] liitettiin sivuun [[:$2]].", - "mergehistory-fail": "Muutoshistorian liittäminen epäonnistui. Tarkista määritellyt sivut ja versiot.", + "mergehistory-empty": "Mitään versioita ei voida yhdistää.", + "mergehistory-success": "$3 {{PLURAL:$3|versio|versiota}} sivusta [[:$1]] yhdistettiin onnistuneesti sivuun [[:$2]].", + "mergehistory-fail": "Sivuhistorioiden yhdistämistä ei voida suorittaa. Tarkista lähde- ja kohdesivujen nimet sekä versioiden aikamääritys.", "mergehistory-fail-toobig": "Sivuhistorian yhdistämistä ei voi tehdä, koska enemmän kuin sallittu määrä $1 {{PLURAL:$1|versio|versiota}} siirrettäisiin.", "mergehistory-no-source": "Lähdesivua $1 ei ole olemassa.", "mergehistory-no-destination": "Kohdesivua $1 ei ole olemassa.", - "mergehistory-invalid-source": "Lähdesivulla pitää olla kelvollinen nimi.", - "mergehistory-invalid-destination": "Kohdesivulla pitää olla kelvollinen nimi.", - "mergehistory-autocomment": "Yhdisti sivun [[:$1]] sivuun [[:$2]]", + "mergehistory-invalid-source": "Lähdesivun nimen pitää olla kelvollinen.", + "mergehistory-invalid-destination": "Kohdesivun nimen pitää olla kelvollinen.", + "mergehistory-autocomment": "Ak: Yhdisti sivun [[:$1]] sivuun [[:$2]]", "mergehistory-comment": "Yhdisti sivun [[:$1]] sivuun [[:$2]]: $3", "mergehistory-same-destination": "Lähde- ja kohdesivut eivät voi olla samat", "mergehistory-reason": "Syy:", "mergelog": "Yhdistämisloki", - "pagemerge-logentry": "liitti sivun [[$1]] sivuun [[$2]] (muokkaukseen $3 asti)", - "revertmerge": "Kumoa yhdistäminen", + "pagemerge-logentry": "yhdisti kohteen [[$1]] kohteeseen [[$2]] (muokkaukseen $3 saakka)", + "revertmerge": "Peru yhdistäminen", "mergelogpagetext": "Alla on loki viimeisimmistä muutoshistorioiden yhdistämisistä.", "history-title": "Sivun ”$1” muutoshistoria", "difference-title": "Ero sivun ”$1” versioiden välillä", @@ -864,7 +867,6 @@ "searchprofile-advanced-tooltip": "Etsi määritellyistä nimiavaruuksista", "search-result-size": "$1 ({{PLURAL:$2|1 sana|$2 sanaa}})", "search-result-category-size": "{{PLURAL:$1|1 jäsen|$1 jäsentä}} ({{PLURAL:$2|1 alaluokka|$2 alaluokkaa}}, {{PLURAL:$3|1 tiedosto|$3 tiedostoa}})", - "search-result-score": "Asiaankuuluvuus: $1%", "search-redirect": "(ohjaus $1)", "search-section": "(osio $1)", "search-file-match": "(vastaa tiedoston sisältöä)", @@ -891,7 +893,7 @@ "preferences": "Asetukset", "mypreferences": "Asetukset", "prefs-edits": "Muokkauksia", - "prefsnologintext2": "Sinun pitää $1 ennen kuin voit muuttaa käyttäjän asetuksia.", + "prefsnologintext2": "Sinun pitää kirjautua sisään ennen kuin voit muuttaa omia asetuksiasi.", "prefs-skin": "Ulkoasu", "skin-preview": "esikatselu", "datedefault": "Ei omaa määrittelyä", @@ -1018,14 +1020,14 @@ "group-bot": "botit", "group-sysop": "ylläpitäjät", "group-bureaucrat": "byrokraatit", - "group-suppress": "häivytysoikeuden käyttäjät", + "group-suppress": "häivyttäjät", "group-all": "(kaikki)", "group-user-member": "{{GENDER:$1|käyttäjä}}", "group-autoconfirmed-member": "{{GENDER:$1|automaattisesti hyväksytty käyttäjä}}", "group-bot-member": "{{GENDER:$1|botti}}", "group-sysop-member": "{{GENDER:$1|ylläpitäjä}}", "group-bureaucrat-member": "{{GENDER:$1|byrokraatti}}", - "group-suppress-member": "{{GENDER:$1|häivytysoikeuden käyttäjä}}", + "group-suppress-member": "{{GENDER:$1|häivyttäjä}}", "grouppage-user": "{{ns:project}}:Käyttäjät", "grouppage-autoconfirmed": "{{ns:project}}:Automaattisesti hyväksytyt käyttäjät", "grouppage-bot": "{{ns:project}}:Botit", @@ -1268,8 +1270,6 @@ "uploadwarning": "Tallennusvaroitus", "uploadwarning-text": "Muuta alla olevaa tiedostokuvausta ja yritä uudelleen.", "savefile": "Tallenna", - "uploadedimage": "tallensi tiedoston [[$1]]", - "overwroteimage": "tallensi uuden version [[$1]]", "uploaddisabled": "Tiedostojen tallennus ei ole käytössä.", "copyuploaddisabled": "Tallennus URL:n kautta on poistettu käytöstä.", "uploaddisabledtext": "Tiedostojen tallennus on poistettu käytöstä.", @@ -1384,7 +1384,7 @@ "upload_source_file": "(valitsemasi tiedosto omasta tietokoneestasi)", "listfiles-delete": "poista", "listfiles-summary": "Tämä toimintosivu näyttää kaikki tallennetut tiedostot.", - "listfiles_search_for": "Nimihaku", + "listfiles_search_for": "Etsi tiedoston nimellä:", "imgfile": "tiedosto", "listfiles": "Tiedostoluettelo", "listfiles_thumb": "Pienoiskuva", @@ -1440,8 +1440,8 @@ "filerevert-success": "'''[[Media:$1|$1]]''' on palautettu takaisin [$4 versioon, joka luotiin $2 kello $3].", "filerevert-badversion": "Tiedostosta ei ole luotu versiota kyseisellä ajan hetkellä.", "filedelete": "Poistetaan tiedosto $1", - "filedelete-legend": "Tiedoston poisto", - "filedelete-intro": "Olet poistamassa tiedoston '''[[Media:$1|$1]]''' ja kaiken sen historian.", + "filedelete-legend": "Poista tiedosto", + "filedelete-intro": "Olet poistamassa tiedoston '''[[Media:$1|$1]]''' ja lisäksi koko sen muokkaushistorian.", "filedelete-intro-old": "Olet poistamassa tiedoston '''[[Media:$1|$1]]''' [$4 päivämäärällä $2 kello $3 luotua versiota].", "filedelete-comment": "Syy:", "filedelete-submit": "Poista", @@ -1677,11 +1677,11 @@ "trackingcategories-desc": "Kriteerit luokkaan joutumiselle", "noindex-category-desc": "Tätä sivua eivät hakurobotit indeksoi, koska sivulla on taikasana __NOINDEX__ ja koska sivu on sellaisessa nimiavaruudessa, jossa taikasanan käyttö on sallittua.", "index-category-desc": "Tällä sivulla on koodi __INDEX__ ja sivu on sellaisessa nimiavaruudessa, jossa koodin käyttö on sallittua. Tämän vuoksi hakurobotit indeksoivat tämän sivun, vaikka ilman koodia sivua ei indeksoitaisi normaalisti.", - "post-expand-template-inclusion-category-desc": "Jos kaikki mallineet laajennetaan, sivun koko on suurempi kuin $wgMaxArticleSize. Tämän vuoksi kaikkia mallineita ei laajennettu.", - "post-expand-template-argument-category-desc": "Kun mallineen argumentti on laajennettu (argumentti on merkkijono kolmen kaarisulun sisällä kuten {{{Foo}}}), sivu on suurempi kuin $wgMaxArticleSize.", - "expensive-parserfunction-category-desc": "Liian monta resursseja vaativaa jäsenninfunktiota (esimerkiksi #ifexist) on sisällytetty sivulle. Katso [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", - "broken-file-category-desc": "Tämä luokka sisältää ne sivut, joissa on rikkinäinen tiedostolinkki. Tällä tarkoitetaan linkkiä sellaiseen tiedostoon, jota ei olemassa.", - "hidden-category-category-desc": "Tämä on luokka, joka sisältää koodin __HIDDENCAT__. Koodi estää luokan näkymisen sivujen alareunassa olevassa luokkien laatikossa oletusarvoisesti.", + "post-expand-template-inclusion-category-desc": "Sivun koko on suurempi kuin $wgMaxArticleSize, kun kaikki mallineet on laajennettu. Tämän vuoksi joitakin mallineita ei laajennettu.", + "post-expand-template-argument-category-desc": "Sivu on suurempi kuin $wgMaxArticleSize, kun mallineen argumentti on laajennettu (argumentti on merkkijono kolmen aaltosulun sisällä kuten {{{Foo}}}).", + "expensive-parserfunction-category-desc": "Tämä sivu käyttää liian monta resursseja vaativaa jäsenninfunktiota (kuten #ifexist). Katso [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", + "broken-file-category-desc": "Tämä sivu sisältää rikkinäisen tiedostolinkin. Tällä tarkoitetaan linkkiä sellaiseen tiedostoon, jota ei olemassa.", + "hidden-category-category-desc": "Tämä luokka sisältää koodin __HIDDENCAT__ sen tekstisisällössä. Koodi estää luokan näkymisen sivujen alareunassa olevassa luokkien laatikossa kuten yleensä.", "trackingcategories-nodesc": "Ei kuvausta olemassa.", "trackingcategories-disabled": "Luokka on poistettu käytöstä", "mailnologin": "Lähettäjän osoite puuttuu", @@ -1718,7 +1718,7 @@ "mywatchlist": "Tarkkailulista", "watchlistfor2": "Käyttäjälle $1 $2", "nowatchlist": "Tarkkailulistallasi ei ole sivuja.", - "watchlistanontext": "Sinun täytyy $1, jos haluat käyttää tarkkailulistaa.", + "watchlistanontext": "Sinun täytyy kirjautua sisään, jos haluat muokata kohteita omalla tarkkailulistallasi.", "watchnologin": "Et ole kirjautunut sisään", "addwatch": "Lisää tarkkailulistalle", "addedwatchtext": "Sivu '''[[:$1]]''' on lisätty [[Special:Watchlist|tarkkailulistallesi]].\nTulevaisuudessa sivuun ja sen keskustelusivuun tehtävät muutokset listataan täällä.", @@ -1782,6 +1782,7 @@ "delete-edit-reasonlist": "Muokkaa poistosyitä", "delete-toobig": "Tällä sivulla on pitkä muutoshistoria – yli $1 {{PLURAL:$1|versio|versiota}}. Näin suurien muutoshistorioiden poistamista on rajoitettu suorituskykysyistä.", "delete-warning-toobig": "Tällä sivulla on pitkä muutoshistoria – yli $1 {{PLURAL:$1|versio|versiota}}. Näin suurien muutoshistorioiden poistaminen voi haitata sivuston suorituskykyä.", + "delete-cantedit": "Et voi poistaa tätä sivua, koska sinulla ei ole oikeutta sen muokkaamiseen.", "deleting-backlinks-warning": "'''Varoitus:''' Sivulle, jota olet poistamassa, johtaa [[Special:WhatLinksHere/{{FULLPAGENAME}}|linkkejä muilta sivuilta]], tai sivu on sisällytetty muuhun sivuun.", "rollback": "palauta aiempaan versioon", "rollback_short": "Palautus", @@ -1800,11 +1801,11 @@ "protectlogpage": "Suojausloki", "protectlogtext": "Alla on loki muutoksista sivujen suojauksiin. Luettelo tällä hetkellä suojatuista sivuista löytyy [[Special:ProtectedPages|suojattujen sivujen luettelosta]].", "protectedarticle": "suojasi sivun [[$1]]", - "modifiedarticleprotection": "muutti sivun [[$1]] suojaustasoa", + "modifiedarticleprotection": "muutti sivun [[$1]] suojausasetuksia", "unprotectedarticle": "poisti suojauksen sivulta [[$1]]", "movedarticleprotection": "siirsi suojausasetukset sivulta [[$2]] sivulle [[$1]]", "protect-title": "Muuta suojausta sivulla ”$1”", - "protect-title-notallowed": "Sivun $1 suojaustaso", + "protect-title-notallowed": "Katsele kohteen $1 suojauksen tasoa", "prot_1movedto2": "siirsi sivun [[$1]] uudelle nimelle [[$2]]", "protect-badnamespace-title": "Nimiavaruus ei suojattavissa", "protect-badnamespace-text": "Tämän nimiavaruuden sivuja ei voi suojata.", @@ -1942,7 +1943,7 @@ "autoblockid": "Automaattinen esto #$1", "block": "Estä käyttäjä", "unblock": "Poista käyttäjän esto", - "blockip": "Estä käyttäjä", + "blockip": "Estä {{GENDER:$1|käyttäjä}}", "blockip-legend": "Estä käyttäjä", "blockiptext": "Tällä toiminnolla voit estää käyttäjätunnusta tai IP-osoitetta muokkaamasta.
    \nTällainen muokkausesto pitäisi asettaa vain vandalismin torjumiseksi ja [[{{MediaWiki:Policy-url}}|käytännön]] mukaisesti.\nKirjoita eston syy alla olevaan kenttään.", "ipaddressorusername": "IP-osoite tai käyttäjätunnus", @@ -1971,7 +1972,7 @@ "ipb-unblock-addr": "Poista käyttäjän $1 esto", "ipb-unblock": "Poista käyttäjän tai IP-osoitteen muokkausesto", "ipb-blocklist": "Näytä voimassa olevat estot", - "ipb-blocklist-contribs": "Käyttäjän $1 muokkaukset", + "ipb-blocklist-contribs": "Käyttäjän {{GENDER:$1|$1}} muokkaukset", "unblockip": "Muokkauseston poisto käyttäjältä", "unblockiptext": "Tällä lomakkeella voit poistaa käyttäjän tai IP-osoitteen muokkauseston.", "ipusubmit": "Poista tämä esto", @@ -2086,7 +2087,7 @@ "movetalk": "Siirrä myös keskustelusivu", "move-subpages": "Siirrä kaikki alasivut (enintään $1)", "move-talk-subpages": "Siirrä kaikki keskustelusivun alasivut (enintään $1)", - "movepage-page-exists": "Sivu $1 on jo olemassa ja sitä ei voi automaattisesti korvata.", + "movepage-page-exists": "Sivu $1 on jo olemassa ja sen päälle ei voida automaattisesti siirtää.", "movepage-page-moved": "Sivu $1 on siirretty nimelle $2.", "movepage-page-unmoved": "Sivua $1 ei voitu siirtää nimelle $2.", "movepage-max-pages": "Enimmäismäärä sivuja on siirretty, eikä enempää siirretä enää automaattisesti.\n$1 {{PLURAL:$1|sivu|sivua}} siirrettiin.", @@ -2134,8 +2135,8 @@ "export-pagelinks": "Sisällytä linkkien kohteina olevat sivut syvyydelle:", "allmessages": "Järjestelmäviestit", "allmessagesname": "Nimi", - "allmessagesdefault": "Oletusarvo", - "allmessagescurrent": "Nykyinen arvo", + "allmessagesdefault": "Viestin tekstin perusmuoto", + "allmessagescurrent": "Viestin teksti tällä hetkellä", "allmessagestext": "Tämä on luettelo järjestelmäviesteistä, jotka ovat saatavilla MediaWiki-nimiavaruudessa.\nJos haluat muokata MediaWikin yleistä kotoistusta, käy [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWikin kotoistussivuilla] ja sivustolla [//translatewiki.net translatewiki.net].", "allmessagesnotsupportedDB": "Tämä sivu ei ole käytössä, koska $wgUseDatabaseMessages-asetus on pois päältä.", "allmessages-filter-legend": "Suodata", @@ -3048,7 +3049,10 @@ "logentry-newusers-autocreate": "Käyttäjätunnus $1 {{GENDER:$2|luotiin}} automaattisesti", "logentry-rights-rights": "$1 {{GENDER:$2|muutti}} käyttäjän $3 oikeudet ryhmistä $4 ryhmiin $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|muutti}} käyttäjän $3 jäsenyyttä ryhmässä", - "logentry-rights-autopromote": "$1 {{GENDER:$2|muutettiin}} automaattisesti ryhmistä $4 ryhmiin $5", + "logentry-rights-autopromote": "Käyttäjän $1 oikeudet {{GENDER:$2|muuttuivat}} automaattisesti ryhmistä $4 ryhmiin $5", + "logentry-upload-upload": "$1 {{GENDER:$2|tallensi}} tiedoston $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|tallensi}} uuden version tiedostosta $3", + "logentry-upload-revert": "$1 {{GENDER:$2|tallensi}} tiedoston $3", "rightsnone": "(ei oikeuksia)", "feedback-bugornote": "Jos voit kuvailla teknisen ongelman tarkasti – [$1 ilmoita ohjelmointivirheestä].\nMuussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi lisätään sivulle [$3 $2], ja siinä on mukana käyttäjätunnuksesi.", "feedback-subject": "Otsikko", @@ -3087,7 +3091,7 @@ "api-error-illegal-filename": "Tiedoston nimi ei kelpaa.", "api-error-internal-error": "Sisäinen virhe: jotain meni vikaan tallennuksesi käsittelyssä.", "api-error-invalid-file-key": "Sisäinen virhe: tiedostoa ei löytynyt välikaisvarastosta.", - "api-error-missingparam": "Sisäinen virhe: pyynnöstä puutuu parametrejä.", + "api-error-missingparam": "Sisäinen virhe: pyynnöstä puutuu parametreja.", "api-error-missingresult": "Sisäinen virhe: ei voitu varmistaa, että tallennus onnistui.", "api-error-mustbeloggedin": "Sinun pitää olla kirjautunut sisään, jotta voisit tallentaa tiedostoja.", "api-error-mustbeposted": "Sisäinen virhe: HTTP POST-pyyntö edellytetty.", @@ -3151,5 +3155,7 @@ "action-pagelang": "muuttaa sivun kieliasetuksia", "log-name-pagelang": "Kielenvaihtoloki", "log-description-pagelang": "Tämä on loki, johon merkitään muutokset sivujen kieliasetuksissa.", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2|muutti}} sivun kieltä sivulla $3 kielestä $4 kieleksi $5." + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|muutti}} sivun kieltä sivulla $3 kielestä $4 kieleksi $5.", + "default-skin-not-found-row-enabled": "* $1 / $2 (käytössä)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''ei käytössä''')" } diff --git a/languages/i18n/fr.json b/languages/i18n/fr.json index edd5e2ca3f..8de08584f8 100644 --- a/languages/i18n/fr.json +++ b/languages/i18n/fr.json @@ -367,6 +367,9 @@ "hidetoc": "masquer", "collapsible-collapse": "masquer", "collapsible-expand": "afficher", + "confirmable-confirm": "Êtes-vous sûr{{GENDER:||e|(e)}} ?", + "confirmable-yes": "Oui", + "confirmable-no": "Non", "thisisdeleted": "Désirez-vous afficher ou restaurer $1 ?", "viewdeleted": "Voir $1 ?", "restorelink": "{{PLURAL:$1|la modification effacée|les $1 modifications effacées}}", @@ -451,12 +454,12 @@ "invalidtitle-knownnamespace": "Titre invalide avec l'espace de noms « $2 » et l'intitulé « $3 »", "invalidtitle-unknownnamespace": "Titre invalide avec le numéro d'espace de noms $1 et l'intitulé « $2 » inconnus", "exception-nologin": "Non connecté", - "exception-nologin-text": "Veuillez [[Special:Userlogin|vous connecter]] pour pouvoir accéder à cette page ou cette action.", + "exception-nologin-text": "Veuillez vous connecter pour pouvoir accéder à cette page ou cette action.", "exception-nologin-text-manual": "Veuillez $1 pour pouvoir accéder à cette page ou cette action.", "virus-badscanner": "Mauvaise configuration : scanneur de virus inconnu : ''$1''", "virus-scanfailed": "Échec de la recherche (code $1)", "virus-unknownscanner": "antivirus inconnu :", - "logouttext": "'''Vous êtes à présent déconnecté.'''\n\nNotez que certaines pages peuvent être encore affichées comme si vous étiez toujours connecté, jusqu’à ce que vous effaciez le cache de votre navigateur.", + "logouttext": "'''Vous êtes à présent déconnecté{{GENDER:||e|(e)}}.'''\n\nNotez que certaines pages peuvent être encore affichées comme si vous étiez toujours connecté, jusqu’à ce que vous effaciez le cache de votre navigateur.", "welcomeuser": "Bienvenue, $1 !", "welcomecreation-msg": "Votre compte a été créé.\nN'oubliez pas de modifier [[Special:Preferences|vos préférences pour {{SITENAME}}]].", "yourname": "Nom d'utilisateur :", @@ -582,7 +585,7 @@ "resetpass-submit-cancel": "Annuler", "resetpass-wrong-oldpass": "Mot de passe actuel ou temporaire invalide.\nVous avez peut-être déjà changé votre mot de passe ou demandé un nouveau mot de passe temporaire.", "resetpass-recycled": "Veuillez réinitialiser votre mot de passe à quelque chose d’autre que l’actuel.", - "resetpass-temp-emailed": "Vous êtes connecté avec un code temporaire fourni par courriel.\nPour terminer la connexion, vous devez fournir un nouveau mot de passe ici :", + "resetpass-temp-emailed": "Vous êtes connecté{{GENDER:||e|(e)}} avec un code temporaire fourni par courriel.\nPour terminer la connexion, vous devez fournir un nouveau mot de passe ici :", "resetpass-temp-password": "Mot de passe temporaire :", "resetpass-abort-generic": "La modification du mot de passe a été annulée par une extension.", "resetpass-expired": "Votre mot de passe a expiré. Veuillez en fournir un nouveau pour vous connecter.", @@ -600,12 +603,12 @@ "passwordreset-capture-help": "Si vous cochez cette case, le courriel (avec le mot de passe temporaire) vous sera affiché en même temps qu'il sera envoyé à l'utilisateur.", "passwordreset-email": "Adresse de courriel :", "passwordreset-emailtitle": "Détails du compte sur {{SITENAME}}", - "passwordreset-emailtext-ip": "Quelqu'un (probablement vous, depuis l'adresse IP $1) a demandé un réinitialisation de votre mot de passe pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :\n\n$2\n\n{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous vous êtes souvenu de votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.", - "passwordreset-emailtext-user": "L'utilisateur $1 sur {{SITENAME}} a demandé un réinitialisation de votre mot de passe pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :\n\n$2\n\n{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous vous êtes souvenu de votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.", + "passwordreset-emailtext-ip": "Quelqu'un (probablement vous, depuis l'adresse IP $1) a demandé un réinitialisation de votre mot de passe pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :\n\n$2\n\n{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous vous êtes souvenu{{GENDER:||e|(e)}} de votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.", + "passwordreset-emailtext-user": "L'utilisateur $1 sur {{SITENAME}} a demandé un réinitialisation de votre mot de passe pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :\n\n$2\n\n{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous vous êtes souvenu{{GENDER:||e|(e)}} de votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.", "passwordreset-emailelement": "Nom d'utilisateur : $1\nMot de passe temporaire : $2", "passwordreset-emailsent": "Un courriel de réinitialisation de mot de passe a été envoyé.", "passwordreset-emailsent-capture": "Un courriel de réinitialisation de mot de passe a été envoyé, qui est affiché ci-dessous.", - "passwordreset-emailerror-capture": "Un courriel de réinitialisation de mot de passe a été généré, qui est affiché ci-dessous, mais l'envoi à l'{{GENDER:$2|utilisateur}} a échoué : $1", + "passwordreset-emailerror-capture": "Un courriel de réinitialisation de mot de passe a été généré, qui est affiché ci-dessous, mais l'envoi à l'{{GENDER:$2|utilisateur|utilisatrice}} a échoué : $1", "changeemail": "Changer l’adresse de courriel", "changeemail-header": "Changer l’adresse de courriel du compte", "changeemail-text": "Remplissez ce formulaire pour changer votre adresse de courriel. Vous devrez entrer votre mot de passe pour confirmer ce changement.", @@ -748,7 +751,7 @@ "content-failed-to-parse": "Échec de l’analyse syntaxique du contenu de $2 pour le modèle $1: $3", "invalid-content-data": "Données du contenu non valides", "content-not-allowed-here": "Le contenu « $1 » n’est pas autorisé sur la page [[$2]]", - "editwarning-warning": "Quitter cette page vous fera perdre toutes les modifications que vous avez faites.\nSi vous êtes connecté, vous pouvez désactiver cet avertissement dans la section « {{int:prefs-editing}} » de vos préférences.", + "editwarning-warning": "Quitter cette page vous fera perdre toutes les modifications que vous avez faites.\nSi vous êtes connecté{{GENDER:||e|(e)}}, vous pouvez désactiver cet avertissement dans la section « {{int:prefs-editing}} » de vos préférences.", "editpage-notsupportedcontentformat-title": "Format de contenu non pris en charge", "editpage-notsupportedcontentformat-text": "Le format de contenu $1 n'est pas pris en charge par le modèle de contenu $2 .", "content-model-wikitext": "wikitexte", @@ -765,10 +768,10 @@ "parser-template-recursion-depth-warning": "Limite de profondeur des appels de modèles dépassée ($1)", "language-converter-depth-warning": "Limite de profondeur du convertisseur de langue dépassée ($1)", "node-count-exceeded-category": "Pages où nombre de nœuds est dépassé", - "node-count-exceeded-category-desc": "Une catégorie pour les pages où le nombre de nœuds est dépassé.", + "node-count-exceeded-category-desc": "Cette page dépasse le nombre maximal de nœuds.", "node-count-exceeded-warning": "Page dépassant le nombre de nœuds", "expansion-depth-exceeded-category": "Pages où la profondeur d'expansion est dépassée", - "expansion-depth-exceeded-category-desc": "Ceci est une catégorie pour les pages où la profondeur d’expansion est dépassée.", + "expansion-depth-exceeded-category-desc": "La page dépasse la profondeur d’expansion maximale.", "expansion-depth-exceeded-warning": "Page dépassant la profondeur d'expansion", "parser-unstrip-loop-warning": "Boucle non démontable détectée", "parser-unstrip-recursion-limit": "Limite de récursion non démontable dépassée ($1)", @@ -829,7 +832,7 @@ "revdelete-nooldid-title": "Version cible non valide", "revdelete-nooldid-text": "Vous n'avez pas précisé la version cible de cette fonction, elle n'existe pas, ou il s'agit de la version actuelle.", "revdelete-no-file": "Le fichier spécifié n'existe pas.", - "revdelete-show-file-confirm": "Êtes-vous sûr de vouloir voir la révision supprimée du fichier « $1 » datant du $2 à $3 ?", + "revdelete-show-file-confirm": "Êtes-vous sûr{{GENDER:||e|(e)}} de vouloir voir la révision supprimée du fichier « $1 » datant du $2 à $3 ?", "revdelete-show-file-submit": "Oui", "revdelete-selected-text": "{{PLURAL:$1|Révision sélectionnée|Révisions sélectionnées}} de [[:$2]] :", "revdelete-selected-file": "{{PLURAL:$1|Version de fichier sélectionnée|Versions de fichier sélectionnées}} de [[:$2]] :", @@ -937,7 +940,6 @@ "searchprofile-advanced-tooltip": "Choisir les espaces de noms pour la recherche", "search-result-size": "$1 ($2 mot{{PLURAL:$2||s}})", "search-result-category-size": "$1 membre{{PLURAL:$1||s}} ($2 sous-catégorie{{PLURAL:$2||s}}, $3 fichier{{PLURAL:$3||s}})", - "search-result-score": "Pertinence : $1%", "search-redirect": "(redirection depuis $1)", "search-section": "(section $1)", "search-file-match": "(correspond au contenu du fichier)", @@ -964,7 +966,7 @@ "preferences": "Préférences", "mypreferences": "Préférences", "prefs-edits": "Nombre de modifications :", - "prefsnologintext2": "Veuillez $1 pour définir les préférences utilisateur.", + "prefsnologintext2": "Veuillez vous connecter pour modifier vos préférences.", "prefs-skin": "Habillage", "skin-preview": "Prévisualiser", "datedefault": "Aucune préférence", @@ -1070,7 +1072,7 @@ "userrights-lookup-user": "Gestion des groupes d'utilisateurs", "userrights-user-editname": "Entrez un nom d'utilisateur :", "editusergroup": "Modification des groupes d'utilisateurs", - "editinguser": "Modification des droits de l'{{GENDER:$1|utilisateur|utilisatrice}} '''[[User:$1|$1]]''' $2", + "editinguser": "Modification des droits de l'{{GENDER:$1|utilisateur|utilisatrice}} [[User:$1|$1]]' $2", "userrights-editusergroup": "Modifier les groupes de l'utilisateur", "saveusergroups": "Enregistrer les groupes de l'utilisateur", "userrights-groupsmember": "Membre de :", @@ -1341,8 +1343,6 @@ "uploadwarning": "Attention !", "uploadwarning-text": "Modifiez la description du fichier et essayez de nouveau.", "savefile": "Sauvegarder le fichier", - "uploadedimage": "a importé « [[$1]] »", - "overwroteimage": "a importé une nouvelle version de « [[$1]] »", "uploaddisabled": "Désolé, l’import de fichiers est désactivé.", "copyuploaddisabled": "Import de fichier par URL désactivé.", "uploaddisabledtext": "L’import de fichiers est désactivé sur ce wiki.", @@ -1752,11 +1752,11 @@ "trackingcategories-desc": "Critère d’inclusion de la catégorie", "noindex-category-desc": "La page contient __NOINDEX__ et est dans un espace de noms où ce marquage est autorisé ; elle ne sera donc pas indexée par les robots.", "index-category-desc": "La page contient __INDEX__ et est dans un espace de noms où ce marquage est autorisé ; elle sera donc indexée par les robots alors qu’elle ne l’aurait pas été normalement.", - "post-expand-template-inclusion-category-desc": "Après avoir développé tous les modèles, la taille de la page dépasse $wgMaxArticleSize ; certains modèles n’ont donc pas été développés.", - "post-expand-template-argument-category-desc": "Après avoir développé l’argument d’un modèle (quelque chose entre accolades triples, comme {{{Foo}}}), la page dépasse $wgMaxArticleSize.", - "expensive-parserfunction-category-desc": "Trop de fonctions coûteuses de l’analyseur (comme #ifexist) sont incluses dans une page. Voyez [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", - "broken-file-category-desc": "La catégorie ajoutée sur la page contient un lien de fichier incorrect (un lien pour inclure un fichier alors que celui-ci n’existe pas).", - "hidden-category-category-desc": "Catégorie contenant __HIDDENCAT__, ce qui empêche son affichage dans la zone des liens de catégorie sur les pages, par défaut.", + "post-expand-template-inclusion-category-desc": "La taille de la page dépasse $wgMaxArticleSize après le développement de tous ses modèles ; certains n’ont donc pas été développés.", + "post-expand-template-argument-category-desc": "La page dépasse $wgMaxArticleSize après avoir développé l’argument d’un modèle (quelque chose entre accolades triples, comme {{{Foo}}}).", + "expensive-parserfunction-category-desc": "La page utilise trop de fonctions coûteuses de l’analyseur (comme #ifexist). Voyez [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", + "broken-file-category-desc": "La page contient un lien de fichier incorrect (un lien pour inclure un fichier alors que celui-ci n’existe pas).", + "hidden-category-category-desc": "La catégorie contient __HIDDENCAT__ dans son contenu, ce qui empêche son affichage dans la zone des liens de catégorie sur les pages, par défaut.", "trackingcategories-nodesc": "Aucune description disponible.", "trackingcategories-disabled": "La catégorie est désactivée", "mailnologin": "Pas d'adresse d'expéditeur", @@ -1793,7 +1793,7 @@ "mywatchlist": "Liste de suivi", "watchlistfor2": "Pour $1 $2", "nowatchlist": "Votre liste de suivi ne référence aucune page.", - "watchlistanontext": "Veuillez vous $1 pour visualiser ou modifier les éléments de votre liste de suivi.", + "watchlistanontext": "Veuillez vous connecter pour visualiser ou modifier les éléments de votre liste de suivi.", "watchnologin": "Non connecté", "addwatch": "Ajouter à la liste de suivi", "addedwatchtext": "La page « [[:$1]] » a été ajoutée à votre [[Special:Watchlist|liste de suivi]].\nLes prochaines modifications de cette page et de la page de discussion associée y seront répertoriées.", @@ -1857,6 +1857,7 @@ "delete-edit-reasonlist": "Modifier les motifs de suppression de page", "delete-toobig": "Cette page possède un historique important de modifications, dépassant $1 version{{PLURAL:$1||s}}.\nLa suppression de telles pages a été restreinte pour prévenir des perturbations accidentelles de {{SITENAME}}.", "delete-warning-toobig": "Cette page possède un historique important de modifications, dépassant $1 version{{PLURAL:$1||s}}.\nLa supprimer peut perturber le fonctionnement de la base de données de {{SITENAME}} ;\nveuiller ne procéder qu'avec prudence.", + "delete-cantedit": "Vous ne pouvez pas supprimer cette page car vous n’avez pas le droit de la modifier.", "deleting-backlinks-warning": "'''Attention :''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|D’autres pages]] ont un lien vers ou incorporent la page que vous allez supprimer.", "rollback": "Révoquer les modifications", "rollback_short": "Révoquer", @@ -2018,7 +2019,7 @@ "autoblockid": "Blocage automatique #$1", "block": "Bloquer l’utilisateur", "unblock": "Débloquer l’utilisateur", - "blockip": "Bloquer l’utilisateur", + "blockip": "Bloquer l’{{GENDER:$1|utilisateur|utilisatrice}}", "blockip-legend": "Bloquer l’utilisateur", "blockiptext": "Utilisez le formulaire ci-dessous pour bloquer les tentatives de modification faites à partir d’une adresse IP spécifique ou d’un nom d’utilisateur.\nUne telle mesure ne devrait être prise que pour prévenir le vandalisme et en accord avec les [[{{MediaWiki:Policy-url}}|règles internes]].\nDonnez ci-dessous un motif précis (par exemple en citant les pages qui ont été vandalisées).", "ipaddressorusername": "Adresse IP ou nom d'utilisateur :", @@ -2047,7 +2048,7 @@ "ipb-unblock-addr": "Débloquer $1", "ipb-unblock": "Débloquer un compte utilisateur ou une adresse IP", "ipb-blocklist": "Voir les blocages existants", - "ipb-blocklist-contribs": "Contributions pour $1", + "ipb-blocklist-contribs": "Contributions pour {{GENDER:$1|$1}}", "unblockip": "Débloquer un utilisateur ou une adresse IP", "unblockiptext": "Utilisez le formulaire ci-dessous pour redonner les droits d’écriture à une adresse IP ou un nom d’utilisateur.", "ipusubmit": "Supprimer ce blocage", @@ -3198,6 +3199,9 @@ "logentry-rights-rights": "$1 {{GENDER:$2|a modifié}} l'appartenance au groupe pour $3 de $4 à $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|a modifié}} l'appartenance au groupe pour $3", "logentry-rights-autopromote": "$1 {{GENDER:$2|a été promu}} automatiquement de $4 à $5", + "logentry-upload-upload": "$1 {{GENDER:$2|a téléchargé}} $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|a téléchargé}} une nouvelle version de $3", + "logentry-upload-revert": "$1 {{GENDER:$2|a téléchargé}} $3", "rightsnone": "(aucun)", "feedback-bugornote": "Si vous êtes prêt à décrire un problème technique en détail, veuillez [$1 signaler un bogue].\nSinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentaire sera ajouté à la page « [$3 $2] », avec votre nom d'utilisateur.", "feedback-subject": "Objet :", @@ -3300,5 +3304,9 @@ "action-pagelang": "changer la langue de la page", "log-name-pagelang": "Tracer les changements de langue", "log-description-pagelang": "Ceci est un journal des changements dans les langues des pages.", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2|a changé}} la langue de la page $3 de $4 à $5." + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|a changé}} la langue de la page $3 de $4 à $5.", + "default-skin-not-found": "Oups ! L’habillage par défaut pour votre wiki ($wgDefaultSkin), $1, n’est pas disponible.\n\nVotre installation semble inclure les habillages suivants. Voyez [https://www.mediawiki.org/wiki/Manual:Skin_configuration le manuel de configuration des habillages] pour savoir comment les activer et choisir celui par défaut.\n\n$2\n\n; Si vous venez juste d’installer MédiaWiki :\n: Vous l’avez probablement installé depuis git, ou directement depuis le code source avec une autre méthode. C’est normal. Essayez d’installer des habillages depuis [https://www.mediawiki.org/wiki/Category:All_skins le répertoire des habillages de mediawiki.org], en:\n:* Téléchargeant le [https://www.mediawiki.org/wiki/Download fichier tar de l’installeur], qui comprend plusieurs habillages et extensions. Vous pouvez copier et coller le répertoire skins/ depuis là.\n:* Clonant un des dépôts mediawiki/skins/* via git dans le répertoire skins/ de votre installation de MédiaWiki.\n: Faire ainsi ne devrait pas interférer avec votre dépôt git, si vous êtes un développeur de MédiaWiki.\n\n; Si vous venez juste de mettre à jour MédiaWiki :\n: MédiaWiki 1.24 et au-delà n’active plus automatiquement les habillages installés (voyez [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery le manuel sur la découverte automatique des habillages]). Vous pouvez coller les lignes suivantes dans LocalSettings.php pour activer tous les habillages actuellement installés :\n\n
    $3
    \n\n; Si vous venez de modifier LocalSettings.php :\n: Vérifiez deux fois le nom des habillages pour éviter les erreurs de frappe.", + "default-skin-not-found-no-skins": "Oups ! L’habillage par défaut pour votre wiki ($wgDefaultSkin), $1, n’est pas disponible.\n\nVous n’avez aucun habillage d’installé.\n\n; Si vous venez juste d’installer ou de mettre à jour MédiaWiki :\n: Vous l’avez sans doute fait depuis git, ou directement depuis le code source avec une autre méthode. C’est normal. MédiaWiki 1.24 et au-delà n’inclut aucun habillage dans le dépôt principal. Essayez d’installer des habillages depuis [https://www.mediawiki.org/wiki/Category:All_skins le répertoire des habillages de mediawiki.org], en :\n:* Téléchargeant [https://www.mediawiki.org/wiki/Download le fichier tar de l’installeur], qui comprend différents habillages et extensions. Vous pouvez copier et coller le répertoire skins/ depuis là.\n:*Clonant un des dépôts mediawiki/skins/* via git dans le répertoire skins/ de votre installation de MédiaWiki.\n: Faire ainsi ne devrait pas interférer avec votre dépôt git si vous êtes un développeur de MédiaWiki. Voyez [https://www.mediawiki.org/wiki/Manual:Skin_configuration le manuel de la configuration des habillages] pour des instructions sur la manière d’activer les habillages et choisir celui par défaut.", + "default-skin-not-found-row-enabled": "* $1 / $2 (activé)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''désactivé''')" } diff --git a/languages/i18n/gl.json b/languages/i18n/gl.json index 8b1a199f33..7c7f484576 100644 --- a/languages/i18n/gl.json +++ b/languages/i18n/gl.json @@ -1241,8 +1241,6 @@ "uploadwarning": "Advertencia ao cargar o ficheiro", "uploadwarning-text": "Por favor, modifique a descrición do ficheiro e inténteo de novo.", "savefile": "Gardar o ficheiro", - "uploadedimage": "cargou \"[[$1]]\"", - "overwroteimage": "enviou unha nova versión de \"[[$1]]\"", "uploaddisabled": "Sentímolo, a subida de ficheiros está desactivada.", "copyuploaddisabled": "A carga mediante URL está desactivada.", "uploaddisabledtext": "A carga de ficheiros está desactivada.", diff --git a/languages/i18n/gu.json b/languages/i18n/gu.json index 46f15397e9..26fa4cb8db 100644 --- a/languages/i18n/gu.json +++ b/languages/i18n/gu.json @@ -186,8 +186,11 @@ "permalink": "સ્થાયી કડી", "print": "છાપો", "view": "જુઓ", + "view-foreign": "$1 પર જુઓ", "edit": "ફેરફાર કરો", + "edit-local": "સ્થાનિક વર્ણનમાં ફેરફાર કરો", "create": "બનાવો", + "create-local": "સ્થાનિક વર્ણન ઉમેરો", "editthispage": "આ પાનામાં ફેરફાર કરો", "create-this-page": "આ પાનું બનાવો", "delete": "રદ કરો", @@ -205,7 +208,6 @@ "talkpagelinktext": "ચર્ચા", "specialpage": "ખાસ પાનું", "personaltools": "વ્યક્તિગત સાધનો", - "postcomment": "નવો વિભાગ", "articlepage": "લેખનું પાનું જુઓ", "talk": "ચર્ચા", "views": "દેખાવો", @@ -271,6 +273,9 @@ "hidetoc": "છુપાવો", "collapsible-collapse": "સંકેલો", "collapsible-expand": "વિસ્તારો", + "confirmable-confirm": "શું {{GENDER:$1|તમે}} ચોક્કસ છો?", + "confirmable-yes": "હા", + "confirmable-no": "ના", "thisisdeleted": "જુઓ અથવા મૂળરૂપે ફેરવો $1?", "viewdeleted": "$1 જોવું છે?", "restorelink": "{{PLURAL:$1|એક ભુસીનાખેલો ફેરફાર|$1 ભુસીનાખેલા ફેરફારો}}", @@ -380,7 +385,6 @@ "externaldberror": "પ્રમાણભૂતતાની ત્રુટી આવી અથવા તમારૂ બહારનુ ખાતું અપડેટ કરવાનો અધિકાર તમને નથી.", "login": "પ્રવેશ કરો", "nav-login-createaccount": "પ્રવેશ કરો / નવું ખાતું ખોલો", - "loginprompt": "{{SITENAME}}માં પ્રવેશ કરવા માટે તમારા બ્રાઉઝરમાં કુકીઝ એનેબલ કરેલી હોવી જોઇશે.", "userlogin": "પ્રવેશ કરો / નવું ખાતું ખોલો", "userloginnocreate": "પ્રવેશ કરો", "logout": "બહાર નીકળો", @@ -462,6 +466,7 @@ "suspicious-userlogout": "લોગ આઉટ કરવાની તમારી વિનંતિ પૂરી ન કરી શકાઇ. એમ લાગે છે કે તેને તૃટિ પામેલ બ્રાઉઝર કે પ્રોક્સી દ્વારા મોકલાઈ હતી.", "createacct-another-realname-tip": "સાચું નામ મરજીયાત છે.\nજો તમે તે આપવાનું પસંદ કરશો, તો તેનો ઉપયોગ તમે કરેલ યોગદાનનું શ્રેય આપવા માટે થશે.", "pt-login": "પ્રવેશ કરો", + "pt-login-button": "પ્રવેશો", "pt-createaccount": "ખાતું બનાવો", "pt-userlogout": "બહાર નીકળો", "php-mail-error-unknown": "PHPની મેલ() કામગીરીમાં અજ્ઞાત ત્રુટિ", @@ -627,12 +632,13 @@ "edit-gone-missing": "આ પાને અધ્યતન ન બનાવી શકાયું \nલાગે છે કોઇએ આ પાનું હટાવી દીધું છે", "edit-conflict": "સંપાદન સંઘર્ષ.", "edit-no-change": "તમારા ફેરફારો અવગણાયા, કેમકે અક્ષરકાયામાં કોઈ ફેરફારાના હતો", + "postedit-confirmation-created": "પાનું બનાવવામાં આવ્યું.", "postedit-confirmation-saved": "તમે કરેલો ફેરફાર સચવાઈ ગયો છે.", "edit-already-exists": "નવું પાનું બનાવી ન શકાયું\nતે પહેલેથી હાજર છે.", "defaultmessagetext": "મૂળભૂત સંદેશ લખાણ", "invalid-content-data": "અયોગ્ય વિગત માહિતી", "content-not-allowed-here": "\"$1\" વિગત [[$2]] પાનાં પર માન્ય નથી", - "editwarning-warning": "આ પાનું છોડી દેશો તો તમારા ફેરફારો સચવાશે નહીં.\nજો તમે પ્રવેશ કરેલો હોય તો તમે આ ચેતવણીને તમારી પસંદના \"ફેરફાર\" વિભાગના વિકલ્પો બદલીને બંધ કરી શકો છો.", + "editwarning-warning": "આ પાનું છોડી દેશો તો તમારા ફેરફારો તમે ગુમાવી શકો છો.\nજો તમે પ્રવેશ કરેલો હોય તો, તમે આ ચેતવણીને તમારી પસંદગીના \"{{int:prefs-editing}}\" વિભાગના વિકલ્પો બદલીને બંધ કરી શકો છો.", "content-model-wikitext": "વિકિલખાણ", "content-model-text": "સાદું લખાણ", "content-model-javascript": "જાવાસ્ક્રિપ્ટ", @@ -795,7 +801,6 @@ "searchprofile-advanced-tooltip": "સ્થાનીય નામસ્થળોમાં શોધો:", "search-result-size": "$1 ({{PLURAL:$2|૧ શબ્દ|$2 શબ્દો}})", "search-result-category-size": "{{PLURAL:$1|1 સભ્ય|$1 સભ્યો}} ({{PLURAL:$2|1 ઉપ શ્રેણી|$2 ઉપ શ્રેણીઓ}}, {{PLURAL:$3|1 ફાઇલ|$3 ફાઇલો}})", - "search-result-score": "પ્રસ્તુતિ: $1%", "search-redirect": "(અન્યત્ર પ્રસ્થાન $1)", "search-section": "(વિભાગ $1)", "search-suggest": "શું તમે $1 કહેવા માંગો છો?", @@ -819,7 +824,7 @@ "preferences": "પસંદ", "mypreferences": "પસંદગીઓ", "prefs-edits": "સંપાદનોની સંખ્યા", - "prefsnologintext2": "તમારી પસંદગીઓ બદલવા માટે મહેરબાની કરી $1 કરો.", + "prefsnologintext2": "તમારી પસંદગીઓ બદલવા માટે મહેરબાની કરી પ્રવેશ કરો.", "prefs-skin": "ફલક", "skin-preview": "ફેરફાર બતાવો", "datedefault": "મારી પસંદ", @@ -1183,8 +1188,6 @@ "uploadwarning": "ફાઇલ ચઢાવ ચેતવણી", "uploadwarning-text": "કૃપયા ફાઈલ સંબધી વર્ણન સુધારો અને ફરી પ્રયત્ન કરો", "savefile": "સાચવો", - "uploadedimage": "\"[[$1]]\" ચઢાવ્યું", - "overwroteimage": " \"[[$1]]\" ની નવી આવૃત્તિ ચઢાવો.", "uploaddisabled": "ફાઇલ ચઢાવ પ્રતિબંધિત", "copyuploaddisabled": "URL દ્વાર ફાઇલ ચઢાવ પ્રતિબંધિત", "uploaddisabledtext": "ફાઇલ ચઢાવવું નિષ્ક્રીય બનાવ્યું છે", @@ -1285,8 +1288,8 @@ "license-header": "પરવાના", "nolicense": "કોઇ વિકલ્પ પસંદ નથી કરાયો", "license-nopreview": "(ઝલક મોજુદ નથી)", - "upload_source_url": " (એક વૈધ , જાહેર URL)", - "upload_source_file": "(તમારા કોમ્પ્યુટર પરની એક ફાઇલ)", + "upload_source_url": "(યોગ્ય, જાહેર URL માંથી તમે પસંદ કરેલ ફાઇલ)", + "upload_source_file": "(તમારા કોમ્પ્યુટર પરની તમે પસંદ કરેલી એક ફાઇલ)", "listfiles-summary": "આ વિશિષ્ટ પાનું બધી અપલોડ કરાયેલી ફાઈલો દર્શાવે છે.", "listfiles_search_for": "મિડિયા નામ શોધો:", "imgfile": "ફાઇલ", @@ -1455,7 +1458,9 @@ "protectedpages-indef": "ફક્ત અનિશ્ચિત સુરક્ષા ધરાવતા પાના", "protectedpages-cascade": "માત્ર પગથિયામય સુરક્ષા વાળા પગ", "protectedpagesempty": "આ વિકલ્પો દ્વારા કોઈ પાના સુરક્ષિત કરાયા નથી.", + "protectedpages-timestamp": "સમયછાપ", "protectedpages-page": "પાનું", + "protectedpages-expiry": "સમાપ્તિ", "protectedpages-reason": "કારણ", "protectedpages-unknown-timestamp": "અજ્ઞાત", "protectedpages-unknown-performer": "અજ્ઞાત સભ્ય", @@ -1550,6 +1555,8 @@ "listgrouprights-removegroup-self": "તેમના પોતાના ખાતમાંથી {{PLURAL:$2|group|groups}} હટાવો : $1", "listgrouprights-addgroup-self-all": "દરેક જૂથને તેમના પોતાના ખાતા માં ઉમેરો", "listgrouprights-removegroup-self-all": "બધા જૂથને તેમના પોતાના ખાતામાંથી હટાવો", + "listgrouprights-namespaceprotection-namespace": "નામાવકાશ", + "trackingcategories-name": "સંદેશ નામ", "mailnologin": "મેળવનારનું સરનામું નથી", "mailnologintext": "અન્ય સભ્યને ઇ-મેલ મોકલવા માટે તમે [[Special:UserLogin|logged in]] પ્રવેશ કરેલ હોવો જોઈએ અને તમારા[[Special:Preferences|preferences]] વિકલ્પોમાં તમારા ઈ-મેલ સરનામાની પુષ્ટિ થયેલી હોવી જોઈએ", "emailuser": "સભ્યને ઇ-મેલ કરો", @@ -1599,6 +1606,7 @@ "watchlist-details": "ચર્ચાનાં પાનાં ન ગણતા {{PLURAL:$1|$1 પાનું|$1 પાનાં}} ધ્યાનસૂચીમાં છે.", "wlheader-enotif": "ઈમેલ સૂચના પદ્ધતિ સક્રીય કરાઈ.", "wlheader-showupdated": "તમારી છેલ્લી મુલાકાત પછી બદલાયેલાં પાના '''ઘાટા''' અક્ષરો વડે દર્શાવ્યાં છે.", + "wlnote": "નીચે $3, $4 વાગ્યા સુધીના છેલ્લા {{PLURAL:$2|એક કલાક|'''$2''' કલાક}}માં થયેલા {{PLURAL:$1|ફેરફાર|'''$1''' ફેરફારો }} દર્શાવ્યા છે.", "wlshowlast": "છેલ્લા $1 કલાક $2 દિવસ $3 બતાવો", "watchlist-options": "ધ્યાનસૂચિના વિકલ્પો", "watching": "નજર રાખી રહ્યાં છો...", @@ -1799,7 +1807,7 @@ "autoblockid": "ઓટોબ્લોક #$1", "block": "સભ્ય પર પ્રતિબંધ મુકો", "unblock": "સભ્ય પરનો પ્રતિબંધ હટાવો", - "blockip": "સભ્ય પર પ્રતિબંધ મુકો", + "blockip": "{{GENDER:$1|સભ્ય}} પર પ્રતિબંધ મુકો", "blockip-legend": "સભ્ય પર પ્રતિબંધ મુકો", "blockiptext": "કોઈ ચોક્કસ IP સરનામું કે સભ્યના લેખન યોગદાન પર પ્રતિબંધ મુકવા નીચેનું ફોર્મ વાપરો.\nતેનો ઉપયોગ માત્ર ભાંગફોડિયા પ્રવૃત્તિઓને રોકવા અને [[{{MediaWiki:Policy-url}}|નીતિ]] અનુસાર જ હોવો જોઈએ.\nકારણનું ખાનું અવશ્ય ભરશો (દા.ત. અમુક ભાંગફોડ કરાયેલા પાનાનો સંદર્ભ).", "ipaddressorusername": "IP સરનામું અથવા સભ્યનામ:", @@ -1827,7 +1835,7 @@ "ipb-unblock-addr": "$1 પરનો પ્રતિબંધ ઉઠાવો", "ipb-unblock": "સભ્યનામ કે IP સરનામું અપ્રતિબંધિત કરો.", "ipb-blocklist": "વિહરમાન પ્રતિબંધો જુઓ", - "ipb-blocklist-contribs": "સભ્ય $1નું યોગદાન", + "ipb-blocklist-contribs": "{{GENDER:$1|$1}} નું યોગદાન", "unblockip": "સભ્ય પરનો પ્રતિબંધ હટાવો", "unblockiptext": "પહેલા રોક લગાડેલ IP સરનામા કે સભ્ય ના પ્રવેશને પુનઃસ્થાપિત કરવા નીચેનું ફોર્મેટ વાપરો.", "ipusubmit": "આપ્રતિબંધન હટાવો", @@ -2043,17 +2051,17 @@ "import-upload": "XML માહિતી ચઢાવો", "import-token-mismatch": "સત્ર સમાપ્ત\nફરી પ્રયત્ન કરો", "import-invalid-interwiki": "દર્શાવેલ વિકિ પરથી આયાત નહીં કરી શકાય", - "import-error-edit": "પાનું \"$1\" આયાત ન કરી શકાયું કેમકે તેને સંપાદિત કરવાનો હક્ક તમને પ્રાપત નથી.", + "import-error-edit": "પાનું \"$1\" આયાત ન કરી શકાયું કેમકે તેને સંપાદિત કરવાનો હક્ક તમને નથી.", "import-error-create": "પાનું \"$1\" આયાત ન કરી શકાયું કેમકે તેને બનાવવાના હક્ક તમને પ્રાપત નથી.", "import-error-interwiki": "\"$1\" પાનું અહીં આયાત કરી ન શકાયું કેમકે તે નામ બાહ્ય કડીઓ (interwiki) માટે આરક્ષીત છે", "import-error-special": "પાનું \"$1\" આયાત કરી શકાયું નહીં કેમકે તે ખાસ નામસ્થળનો ભાગ જે અન્ય પાના ની રજા આપનો નથી.", - "import-error-invalid": "\"$1\" આ પાનુમ્ આયાત ન થયું કેમકે નામ અવૈધ છે.", + "import-error-invalid": "પાનું \"$1\" આયાત થયું નથી કારણ કે તેનું નામ આ વિકિ માટે અયોગ્ય છે.", "importlogpage": "આયાત માહિતિ પત્રક", "importlogpagetext": "અન્ય વિકિમાંથી ઈતિહાસ સહિત પાનાની પ્રબંધકીય આયાત", "import-logentry-upload": "ફાઇલ ચઢાવનાર દ્વારા [[$1]] આયાત કરાઇ", - "import-logentry-upload-detail": "$1 {{PLURAL:$1|પુનરાવર્તન|પુનરાવર્તનો}}", + "import-logentry-upload-detail": "$1 {{PLURAL:$1|પુનરાવર્તન|પુનરાવર્તનો}} આયાત કરેલ છે", "import-logentry-interwiki": "આંતરવિકિ $1", - "import-logentry-interwiki-detail": "$2 થી $1 {{PLURAL:$1|પુનરાવર્તન|પુનરાવર્તનો}}", + "import-logentry-interwiki-detail": "$2 માંથી આયાત કરેલ $1 {{PLURAL:$1|પુનરાવર્તન|પુનરાવર્તનો}}", "javascripttest": "જાવા સ્ક્રીપ્ટ પરીક્ષણ", "javascripttest-title": "$1 પરીક્ષણ જારી", "javascripttest-pagetext-noframework": "આ પાનું જાવા સ્ક્રીપ્ટ ચલાવવા આરક્ષિત છે.", @@ -2163,7 +2171,7 @@ "pageinfo-redirects-name": "આ પાનાં પર દિશાનિર્દેશનોની સંખ્યા", "pageinfo-subpages-name": "આ પાનાંનું ઉપપાનું", "pageinfo-firstuser": "પૃષ્ઠ સર્જક", - "pageinfo-firsttime": "પૃષ્ઠ સર્જનની તારીખ", + "pageinfo-firsttime": "પાનાં બનાવવાની તારીખ", "pageinfo-lastuser": "છેલ્લો ફેરફાર કરનાર", "pageinfo-lasttime": "છેલ્લા ફેરફારની તારીખ", "pageinfo-edits": "કુલ સંપાદનોની સંખ્યા", @@ -2239,7 +2247,7 @@ "months": "{{PLURAL:$1|$1 મહિનો|$1 મહિનાઓ}}", "years": "{{PLURAL:$1|$1 વર્ષ|$1 વર્ષો}}", "ago": "$1 પહેલાં", - "just-now": "હમણાં", + "just-now": "હમણાં જ", "hours-ago": "$1 {{PLURAL:$1|કલાક|કલાકો}} ago", "minutes-ago": "$1 {{PLURAL:$1|મિનિટ|મિનિટો}} ago", "seconds-ago": "$1 {{PLURAL:$1|સેકંડ|સેકંડો}} ago", @@ -2630,6 +2638,7 @@ "confirm-watch-top": "આ પાનું તમારી ધ્યાનસૂચિમાં ઉમેરો?", "confirm-unwatch-button": "બરાબર", "confirm-unwatch-top": "આ પાનું તમારી ધ્યાનસૂચીમાથી કાઢી નાખો", + "quotation-marks": "\"$1\"", "imgmultipageprev": "← પાછલું પાનું", "imgmultipagenext": "આગલું પાનું →", "imgmultigo": "જાઓ!", @@ -2665,6 +2674,7 @@ "watchlistedit-raw-done": "તમારી ધ્યાના સૂચિ અધ્યતન કરાઈ.", "watchlistedit-raw-added": "{{PLURAL:$1|1 શીર્ષક |$1 શીર્ષકો}} ઉમેરાયા :", "watchlistedit-raw-removed": "{{PLURAL:$1|1 શીર્ષક |$1 શીર્ષકો }} હટાવાયા :", + "watchlistedit-clear-titles": "શીર્ષકો:", "watchlisttools-view": "બંધબેસતાં ફેરફારો નિહાળો", "watchlisttools-edit": "ધ્યાનસૂચી જુઓ અને બદલો", "watchlisttools-raw": "કાચી ધ્યાનસૂચિમાં ફેરફાર કરો", @@ -2673,11 +2683,11 @@ "duplicate-defaultsort": "'''ચેતવણી:''' કી \"$2\" આગળનામૂળે પ્રસ્થાપિત ક્રમિકાવર્ગીકરણ કી \"$1\"નું સ્થાન લઈ લેશે..", "version": "આવૃત્તિ", "version-extensions": "પ્રસ્થાપિત વિસ્તારકો", + "version-skins": "સ્થાપિત ફલકો", "version-specialpages": "ખાસ પાનાં", "version-parserhooks": "પદચ્છેદ ખૂંટો", "version-variables": "ચલ", "version-antispam": "સ્પેમ સંરક્ષણ", - "version-skins": "ફલક", "version-other": "અન્ય", "version-mediahandlers": "દ્રશ્યશ્રાવ્ય માધ્યમના ધારક", "version-hooks": "ખૂંટા", @@ -2686,8 +2696,10 @@ "version-hook-name": "ખૂંટાનું નામ્", "version-hook-subscribedby": "દ્વ્રારા લાભાન્વીત", "version-version": "(આવૃત્તિ $1)", + "version-no-ext-name": "[નામ નથી]", "version-license": "મીડિઆવિકિ લાયસન્સ", "version-ext-license": "લાયસન્સ", + "version-skin-colheader-name": "ફલક", "version-ext-colheader-version": "આવૃત્તિ", "version-ext-colheader-license": "લાયસન્સ", "version-ext-colheader-description": "વર્ણન", @@ -2781,6 +2793,8 @@ "htmlform-no": "ના", "htmlform-yes": "હા", "htmlform-chosen-placeholder": "વિકલ્પ પસંદ કરો", + "htmlform-cloner-create": "વધુ ઉમેરો", + "htmlform-cloner-delete": "હટાવો", "sqlite-has-fts": "$1 પૂર્ણ શબ્દ શોધ સહીત", "sqlite-no-fts": "$1 પૂર્ણ શબ્દ શોધ વિકલ્પ વગર", "logentry-delete-delete": "$1 દ્વારા પાનું $3 {{GENDER:$2|દૂર કરવામાં આવ્યું}}", @@ -2888,5 +2902,10 @@ "expand_templates_xml_output": "XML આઉટપુટ", "expand_templates_ok": "મંજૂર", "expand_templates_remove_comments": "ટીપ્પણીઓ દૂર કરો", - "expand_templates_preview": "પૂર્વાવલોકન" + "expand_templates_preview": "પૂર્વાવલોકન", + "pagelang-name": "પાનું", + "pagelang-language": "ભાષા", + "pagelang-select-lang": "ભાષા પસંદ કરો", + "default-skin-not-found-row-enabled": "* $1 / $2 (સક્રિય)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''નિષ્ક્રિય''')" } diff --git a/languages/i18n/he.json b/languages/i18n/he.json index df559b058a..ca7a37dc7c 100644 --- a/languages/i18n/he.json +++ b/languages/i18n/he.json @@ -283,6 +283,9 @@ "hidetoc": "הסתרה", "collapsible-collapse": "הסתרה", "collapsible-expand": "הצגה", + "confirmable-confirm": "האם {{GENDER:$1|ברצונך}} להמשיך?", + "confirmable-yes": "כן", + "confirmable-no": "לא", "thisisdeleted": "לשחזר או להציג $1?", "viewdeleted": "להציג $1?", "restorelink": "{{PLURAL:$1|גרסה מחוקה אחת|$1 גרסאות מחוקות}}", @@ -367,7 +370,7 @@ "invalidtitle-knownnamespace": "כותרת בלתי־תקינה עם מרחב השם \"$2\" ושם דף \"$3\"", "invalidtitle-unknownnamespace": "כותרת בלתי־תקינה עם מרחב שם בלתי־ידוע מספר $1 ושם דף \"$2\"", "exception-nologin": "לא בחשבון", - "exception-nologin-text": "אנא [[Special:Userlogin|היכנסו לחשבון]] כדי לראות את הדף הזה או לבצע את הפעולה הזו.", + "exception-nologin-text": "אנא היכנסו לחשבון כדי לראות את הדף הזה או לבצע את הפעולה הזו.", "exception-nologin-text-manual": "אנא $1 כדי לראות את הדף הזה או לבצע את הפעולה הזו.", "virus-badscanner": "הגדרות שגויות: סורק הווירוסים אינו ידוע: ''$1''", "virus-scanfailed": "הסריקה נכשלה (קוד: $1)", @@ -525,7 +528,7 @@ "changeemail": "שינוי כתובת דוא\"ל", "changeemail-header": "שינוי כתובת הדואר האלקטרוני בחשבון", "changeemail-text": "מלאו טופס זה כדי לשנות את כתובת הדואר האלקטרוני שלכם. יהיה עליכם למלא סיסמה כדי לאשר את השינוי.", - "changeemail-no-info": "עליכם להיכנס לחשבון כדי לגשת לדף זה ישירות.", + "changeemail-no-info": "יש להיכנס לחשבון כדי לגשת לדף זה ישירות.", "changeemail-oldemail": "כתובת דוא\"ל נוכחית:", "changeemail-newemail": "כתובת דוא\"ל חדשה:", "changeemail-none": "(אין)", @@ -678,10 +681,10 @@ "parser-template-recursion-depth-warning": "עומק התבניות המוכללות זו בזו עבר את המגבלה ($1)", "language-converter-depth-warning": "עומק ממיר השפה עבר את המגבלה ($1)", "node-count-exceeded-category": "דפים שבהם מספר הצמתים גדול מדי", - "node-count-exceeded-category-desc": "קטגוריה לדפים שמספר הצמתים בהם גדול מדי.", + "node-count-exceeded-category-desc": "מספר הצמתים בדף גדול מהמספר המרבי.", "node-count-exceeded-warning": "מספר הצמתים בדף גדול מדי", "expansion-depth-exceeded-category": "דפים שבהם עומק ההרחבה גדול מדי", - "expansion-depth-exceeded-category-desc": "זוהי קטגוריה לדפים שבהם עומק ההרחבה גדול מדי.", + "expansion-depth-exceeded-category-desc": "עומק ההרחבה בדף גדול מהעומק המרבי.", "expansion-depth-exceeded-warning": "עומק ההרחבה בדף גדול מדי", "parser-unstrip-loop-warning": "נמצאה לולאה בפריסה", "parser-unstrip-recursion-limit": "עומק הרקורסיה של הפריסה עבר את המגבלה ($1)", @@ -849,7 +852,6 @@ "searchprofile-advanced-tooltip": "חיפוש במרחבי שם מותאמים אישית", "search-result-size": "$1 ({{PLURAL:$2|מילה אחת|$2 מילים}})", "search-result-category-size": "{{PLURAL:$1|חבר אחד|$1 חברים}} ({{PLURAL:$2|קטגוריית משנה אחת|$2 קטגוריות משנה}}, {{PLURAL:$3|קובץ אחד|$3 קבצים}})", - "search-result-score": "רלוונטיוּת: $1%", "search-redirect": "(הפניה $1)", "search-section": "(פסקה $1)", "search-file-match": "(התאמה בתוכן הקובץ)", @@ -876,7 +878,7 @@ "preferences": "העדפות", "mypreferences": "העדפות", "prefs-edits": "מספר עריכות:", - "prefsnologintext2": "עליכם $1 כדי לשנות העדפות משתמש.", + "prefsnologintext2": "אנא היכנסו לחשבון כדי לשנות העדפות משתמש.", "prefs-skin": "עיצוב", "skin-preview": "תצוגה מקדימה", "datedefault": "ברירת המחדל", @@ -1253,8 +1255,6 @@ "uploadwarning": "אזהרת העלאת קבצים", "uploadwarning-text": "אנא שנו את תיאור הקובץ שלמטה ונסו שוב.", "savefile": "שמירת קובץ", - "uploadedimage": "העלה את הקובץ [[$1]]", - "overwroteimage": "העלה גרסה חדשה של הקובץ [[$1]]", "uploaddisabled": "העלאת קבצים מבוטלת.", "copyuploaddisabled": "העלאת קבצים מכתובת URL מבוטלת.", "uploaddisabledtext": "אפשרות העלאת הקבצים מבוטלת.", @@ -1664,11 +1664,11 @@ "trackingcategories-desc": "הקריטריון להכללה בקטגוריה", "noindex-category-desc": "הדף אינו מאונדקס על‏‏־ידי רובוטים כיוון שהוא כולל את מילת הקסם __NOINDEX__ והוא במרחב שם שבו דגל כזה מותר לשימוש.", "index-category-desc": "הדף כולל את מילת הקסם __INDEX__ (והוא במרחב שם שבו דגל כזה מותר לשימוש), ולכן הוא מאונדקס על‏‏֫־ידי רובוטים אף שכברירת מחדל הוא לא היה מאונדקס על ידם.", - "post-expand-template-inclusion-category-desc": "לאחר הרחבת כל התבניות, גודל הדף גדול מ‏‏֫־$wgMaxArticleSize, ולכן מספר תבניות אינן מורחבות.", - "post-expand-template-argument-category-desc": "לאחר הרחבת ארגומנט של תבנית (משהו בסוגריים משולשים, כגון {{{Foo}}}), הדף גדול מ‏‏֫‏‏֫־$wgMaxArticleSize.", - "expensive-parserfunction-category-desc": "יותר מדי פונקציות מפענח יקרות לשימוש (כגון #קיים) מוכללות בדף. ראו [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", - "broken-file-category-desc": "הקטגוריה נוספת אם הדף כולל קישור שבור לקובץ (קישור להטמעת קובץ כאשר הקובץ אינו קיים).", - "hidden-category-category-desc": "קטגוריה זו כוללת את מילת הקסם __קטגוריה_מוסתרת__, שגורמת לה לא להופיע בתיבת קישורי הקטגוריות בדפים כברירת מחדל.", + "post-expand-template-inclusion-category-desc": "גודל הדף גדול מ‏‏־$wgMaxArticleSize לאחר הרחבת כל התבניות, ולכן כמה תבניות לא הורחבו.", + "post-expand-template-argument-category-desc": "הדף גדול מ־$wgMaxArticleSize לאחר הרחבת ארגומנט של תבנית (משהו בסוגריים משולשים, כגון {{{Foo}}})).", + "expensive-parserfunction-category-desc": "הדף משתמש ביותר מדי פונקציות מפענח יקרות לשימוש (כגון #קיים). ראו [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", + "broken-file-category-desc": "הדף כולל קישור שבור לקובץ (קישור להטמעת קובץ כאשר הקובץ אינו קיים).", + "hidden-category-category-desc": "הקטגוריה כוללת את הטקסט __קטגוריה_מוסתרת__ בתוכן הדף שלה, ולכן היא לא מופיעה בתיבת קישורי הקטגוריות בדפים כברירת מחדל.", "trackingcategories-nodesc": "התיאור אינו זמין.", "trackingcategories-disabled": "הקטגוריה מבוטלת", "mailnologin": "אין כתובת לשליחה", @@ -1705,7 +1705,7 @@ "mywatchlist": "רשימת מעקב", "watchlistfor2": "עבור $1 $2", "nowatchlist": "אין דפים ברשימת המעקב.", - "watchlistanontext": "עליכם $1 כדי לצפות או לערוך פריטים ברשימת המעקב.", + "watchlistanontext": "אנא היכנסו לחשבון כדי לצפות או לערוך פריטים ברשימת המעקב.", "watchnologin": "לא נכנסת לחשבון", "addwatch": "הוספה לרשימת המעקב", "addedwatchtext": "הדף \"[[:$1]]\" נוסף ל[[Special:Watchlist|רשימת המעקב]].\nשינויים שייערכו בעתיד בדף זה ובדף השיחה שלו, יוצגו ברשימת המעקב.", @@ -1769,6 +1769,7 @@ "delete-edit-reasonlist": "עריכת סיבות המחיקה", "delete-toobig": "דף זה כולל מעל {{PLURAL:$1|גרסה אחת|$1 גרסאות}} בהיסטוריית העריכות שלו. מחיקת דפים כאלה הוגבלה כדי למנוע פגיעה בביצועי האתר.", "delete-warning-toobig": "דף זה כולל מעל {{PLURAL:$1|גרסה אחת|$1 גרסאות}} בהיסטוריית העריכות שלו. מחיקה שלו עלולה להפריע לפעולות בבסיס הנתונים; אנא שקלו שנית את המחיקה.", + "delete-cantedit": "אין באפשרותך למחוק את הדף כי אין לך הרשאה לערוך אותו.", "deleting-backlinks-warning": "'''אזהרה:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|דפים אחרים]] מקשרים לדף שאתם עומדים למחוק או מכלילים אותו.", "rollback": "שחזור עריכות", "rollback_short": "שחזור", @@ -1929,7 +1930,7 @@ "autoblockid": "חסימה אוטומטית #$1", "block": "חסימת משתמש", "unblock": "שחרור משתמש", - "blockip": "חסימת משתמש", + "blockip": "חסימת {{GENDER:$1|משתמש|משתמשת}}", "blockip-legend": "חסימת משתמש", "blockiptext": "השתמשו בטופס שלהלן כדי לחסום את הרשאות הכתיבה מכתובת IP או משתמש מסוימים.\nחסימות כאלה צריכות להתבצע רק כדי למנוע השחתה, ובהתאם ל[[{{MediaWiki:Policy-url}}|נהלים]].\nאנא מלאו את הסיבה הפרטנית לחסימה להלן (לדוגמה, באמצעות ציון דפים מסוימים שהשחית המשתמש).", "ipaddressorusername": "כתובת IP או שם משתמש:", @@ -1958,7 +1959,7 @@ "ipb-unblock-addr": "הסרת חסימה של $1", "ipb-unblock": "הסרת חסימה של שם משתמש או כתובת IP", "ipb-blocklist": "הצגת החסימות הנוכחיות", - "ipb-blocklist-contribs": "התרומות של $1", + "ipb-blocklist-contribs": "התרומות של {{GENDER:$1|$1}}", "unblockip": "שחרור חסימה", "unblockiptext": "השתמשו בטופס שלהלן כדי להחזיר את הרשאות הכתיבה למשתמש או כתובת IP חסומים.", "ipusubmit": "שחרור חסימה", @@ -2069,7 +2070,7 @@ "movepage-moved-redirect": "נוצרה הפניה.", "movepage-moved-noredirect": "יצירת ההפניה בוטלה.", "articleexists": "קיים כבר דף באותו שם, או שהשם שבחרת אינו תקין.\nנא לבחור שם אחר.", - "cantmove-titleprotected": "אינכם יכולים להעביר את הדף לשם זה, כיוון שהשם החדש מוגן מפני יצירה", + "cantmove-titleprotected": "אינך מורשה להעביר את הדף לשם זה כיוון שהשם החדש מוגן מפני יצירה", "movetalk": "העברה גם של דף השיחה", "move-subpages": "העברת כל דפי המשנה (עד $1)", "move-talk-subpages": "העברת כל דפי המשנה של דף השיחה (עד $1)", @@ -3087,6 +3088,9 @@ "logentry-rights-rights": "$1 {{GENDER:$2|שינה|שינתה}} את ההרשאות של $3 מ$4 ל$5‏", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|שינה|שינתה}} את ההרשאות של $3", "logentry-rights-autopromote": "$1 קודם אוטומטית מ$4 ל$5", + "logentry-upload-upload": "$1 {{GENDER:$2|העלה|העלתה}} את $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|העלה|העלתה}} גרסה חדשה של $3", + "logentry-upload-revert": "$1 {{GENDER:$2|העלה|העלתה}} את $3", "rightsnone": "(כלום)", "feedback-bugornote": "אם אתם מוכנים לתאר בעיה טכנית בפרטים, אנא [$1 דווחו באג].\nאחרת, תוכלו להשתמש בטופס הפשוט שלהלן. הערתכם תתווסף לדף \"[$3 $2]\", יחד עם שם המשתמש שלכם.", "feedback-subject": "נושא:", @@ -3189,5 +3193,9 @@ "action-pagelang": "לשנות את שפת הדף", "log-name-pagelang": "יומן שינוי שפה", "log-description-pagelang": "זהו יומן של שינויים בשפות של הדפים.", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2|שינה|שינתה}} את שפת הדף $3 מ$4 ל$5." + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|שינה|שינתה}} את שפת הדף $3 מ$4 ל$5.", + "default-skin-not-found": "אופס! עיצוב ברירת המחדל עבור אתר הוויקי שלכם ($wgDefaultSkin),‏ $1, אינו זמין.\n\nנראה שההתקנה שלכם כוללת את העיצובים הבאים. ראו מידע בדף [https://www.mediawiki.org/wiki/Manual:Skin_configuration \"הגדרת עיצובים\" במדריך] על האפשרות להפעיל אותם ולבחור את עיצוב ברירת המחדל.\n\n$2\n\n; אם כרגע התקנתם את מדיה־ויקי:\n: נראה שזו התקנה מ־git, או ישירות מקוד המקור בשיטה אחרת כלשהי. במקרה הזה, בעיה זו צפויה. נסו להתקין כמה עיצובים מ[https://www.mediawiki.org/wiki/Category:All_skins ספריית העיצובים של mediawiki.org], על־ידי:\n:* הורדת [https://www.mediawiki.org/wiki/Download קובץ ה־tar להתקנה], שכולל מספר עיצובים והרחבות. באפשרותכם להעתיק ולהדביק מתוכו את תיקיית ה‏‏־skins/.\n:* שכפול אחת מה־git repostiroies ב־mediawiki/skins/* בעזרת git לתוך תיקיית ה־skins/ בהתקנת מדיה־ויקי שלכם.\n: אם תעשו זאת, זה לא אמור להפריע ל‏‏־git repository שלכם (אם אתם מפתחים של מדיה־ויקי).\n\n; אם כרגע שדרגתם את מדיה־ויקי:\n: מדיה־ויקי 1.24 וגרסאות חדשות יותר כבר לא מפעילות עיצובים מותקנים באופן אוטומטי (ראו [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery \"גילוי אוטומטי של עיצובים\" במדריך]). תוכלו להעתיק את השורות הבאות לתוך הקובץ LocalSettings.php כדי להפעיל את כל העיצובים המותקנים כעת:\n\n
    $3
    \n\n; אם כרגע שיניתם את LocalSettings.php:\n: בדקו שנית האם ביצעתם שגיאות הקלדה בשמות העיצובים.", + "default-skin-not-found-no-skins": "אופס! עיצוב ברירת המחדל עבור אתר הוויקי שלכם ($wgDefaultSkin),‏ $1, אינו זמין.\n\nאין לכם עיצובים מותקנים.\n\n$2\n\n; אם כרגע התקנתם או שדרגתם את מדיה־ויקי:\n: נראה שזו התקנה מ־git, או ישירות מקוד המקור בשיטה אחרת כלשהי. במקרה הזה, בעיה זו צפויה. מדיה־ויקי 1.24 וגרסאות חדשות יותר אינן כוללות עיצובים ב־git repository הראשי. נסו להתקין כמה עיצובים מ[https://www.mediawiki.org/wiki/Category:All_skins ספריית העיצובים של mediawiki.org], על־ידי:\n:* הורדת [https://www.mediawiki.org/wiki/Download קובץ ה‏‏־tar להתקנה], שכולל מספר עיצובים והרחבות. באפשרותכם להעתיק ולהדביק מתוכו את תיקיית ה‏‏־skins/.\n:* שכפול אחת מה־git repostiroies ב־mediawiki/skins/* בעזרת git לתוך תיקיית ה־skins/ בהתקנת מדיה־ויקי שלכם.\n: אם תעשו זאת, זה לא אמור להפריע ל‏‏־git repository שלכם (אם אתם מפתחים של מדיה־ויקי). ראו מידע בדף [https://www.mediawiki.org/wiki/Manual:Skin_configuration \"הגדרת עיצובים\" במדריך] על האפשרות להפעיל עיצובים ולבחור את עיצוב ברירת המחדל.", + "default-skin-not-found-row-enabled": "* $1 / $2 (מופעל)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''מבוטל''')" } diff --git a/languages/i18n/hi.json b/languages/i18n/hi.json index 8ff0b40c04..8a9154f4d3 100644 --- a/languages/i18n/hi.json +++ b/languages/i18n/hi.json @@ -54,7 +54,8 @@ "לערי ריינהארט", "आलोक", "रोहित रावत", - "아라" + "아라", + "संजीव कुमार" ] }, "tog-underline": "कड़ियाँ अधोरेखन:", @@ -871,7 +872,6 @@ "searchprofile-advanced-tooltip": "विशेष नामस्थानों में खोजें", "search-result-size": "$1 ({{PLURAL:$2|$2 शब्द}})", "search-result-category-size": "{{PLURAL:$1|$1 सदस्य}} ({{PLURAL:$2|$2 उपश्रेणी|$2 उपश्रेणियाँ}}, {{PLURAL:$3|$3 सञ्चिका|$3 सञ्चिकाएँ}})", - "search-result-score": "संबद्ध: $1%", "search-redirect": "($1 से पुनर्निर्देशित)", "search-section": "(अनुभाग $1)", "search-file-match": "(फ़ाइल सामग्री से मेल खाता है)", @@ -1271,8 +1271,6 @@ "uploadwarning": "अपलोड चेतावनी", "uploadwarning-text": "फ़ाइल विवरण को संशोधित कर फिर कोशिश करें।", "savefile": "फ़ाइल संजोयें", - "uploadedimage": "\"[[$1]]\" अपलोड करी", - "overwroteimage": "\"[[$1]]\" का नया अवतरण अपलोड किया", "uploaddisabled": "अपलोड प्रतिबंधित हैं।", "copyuploaddisabled": "यू॰आर॰एल द्वारा अपलोड अक्षम हैं।", "uploaddisabledtext": "फ़ाइल अपलोड अक्षम हैं।", @@ -1712,7 +1710,7 @@ "watchlist-details": "वार्ता पृष्ठों के अलावा {{PLURAL:$1|$1 पृष्ठ}} आपकी ध्यानसूची में हैं।", "wlheader-enotif": "ई-मेल नोटिफ़िकेशन सक्षम हैं।", "wlheader-showupdated": "पृष्ठ जो आपके द्वारा देखे जाने के बाद बदले गये हैं '''बोल्ड''' दिखेंगे।", - "wlnote2": "$2,$3 तक आखरी {{PLURAL:$1|घंटे|$1 घंटों}} में बदलाव निम्नलिखित हैं।", + "wlnote": "$3 को $4 बजे तक पिछले '''$2''' {{PLURAL:$2|घंटे|घंटों}} में {{PLURAL:$1|हुआ एक|हुए '''$1'''}} परिवर्तन निम्न {{PLURAL:$1|है|हैं}}।", "wlshowlast": "पिछले $1 घंटे $2 दिन $3 देखें", "watchlist-options": "ध्यानसूची विकल्प", "watching": "ध्यान दे रहे हैं...", @@ -1759,6 +1757,7 @@ "delete-edit-reasonlist": "हटाने के कारण संपादित करें", "delete-toobig": "इस पृष्ठ का संपादन इतिहास $1 से अधिक {{PLURAL:$1|अवतरण}} होने की वजह से बहुत बड़ा है।\n{{SITENAME}} के अनपेक्षित रूप से बंद होने से रोकने के लिये ऐसे पृष्ठों को हटाने की अनुमति नहीं है।", "delete-warning-toobig": "इस पृष्ठ का संपादन इतिहास $1 से अधिक {{PLURAL:$1|अवतरण}} होने की वजह से बहुत बड़ा है।\nइसे हटाने से {{SITENAME}} के डाटाबेस की गतिविधियों में व्यवधान आ सकता है;\nकृपया सोच समझ कर आगे बढ़ें।", + "delete-cantedit": "आप इस पृष्ठ को नहीं हटा सकते क्योंकि आपको इसकी अनुमति नहीं है।", "deleting-backlinks-warning": "'''चेतावनी:''' जो पृष्ठ आप हटाने जा रहे हैं उससे [[Special:WhatLinksHere/{{FULLPAGENAME}}|अन्य पृष्ठ]] जुड़ते हैं अथवा उसे ट्रांसक्लूड करते हैं।", "rollback": "संपादन वापिस लें", "rollback_short": "वापिस लें", diff --git a/languages/i18n/hif-latn.json b/languages/i18n/hif-latn.json index 21f50ce66a..0062c26103 100644 --- a/languages/i18n/hif-latn.json +++ b/languages/i18n/hif-latn.json @@ -10,7 +10,8 @@ "Malafaya", "Thakurji", "아라", - "Soul Train" + "Soul Train", + "Filipinayzd" ] }, "tog-underline": "Jorr ke niche line khicho:", @@ -194,7 +195,6 @@ "talkpagelinktext": "Baat", "specialpage": "Khaas Panna", "personaltools": "Aapan aujaar", - "postcomment": "Nawaa section", "articlepage": "Content waala panna ke dekho", "talk": "Salah", "views": "Bichar", @@ -370,7 +370,6 @@ "externaldberror": "Koi bahaari database authentication error hai, nai to aap ke bahaari account badle ke adhikar nai hai.", "login": "Log in karo", "nav-login-createaccount": "Log in karo/ nawaa account banao", - "loginprompt": "Login kare ke khatir {{SITENAME}} cookies ke laabu kare ke chaahi.", "userlogin": "Log in karo/ nawaa account banao", "userloginnocreate": "Log in karo", "logout": "Log out", @@ -793,7 +792,6 @@ "searchprofile-advanced-tooltip": "Custom namespaces me khojo", "search-result-size": "$1 ({{PLURAL:$2|1 sabd|$2 sabd}})", "search-result-category-size": " {{PLURAL:$1|1 sadasya|$1 sadasya}} ({{PLURAL:$2|1 chhota vibhag|$2 chhota vibhag}}, {{PLURAL:$3|1 file|$3 files}})", - "search-result-score": "Len den: $1%", "search-redirect": "(redirect $1)", "search-section": "(section $1)", "search-suggest": "Ka aap ke matlab rahaa: $1", @@ -839,7 +837,7 @@ "saveprefs": "Save karo", "restoreprefs": "Sab default settings ke pahile jaise karo (sab vibhag me)", "prefs-editing": "Badaltaa hai", - "rows": "Line:", + "rows": "Taytay:", "columns": "Column:", "searchresultshead": "Khojo", "stub-threshold": "Threshold ke khatir stub link formatting (bytes):", @@ -1170,8 +1168,6 @@ "uploadwarning": "Upload ke baare me chetauni", "uploadwarning-text": "Meharbani kar ke file ke baaare me aur jankari ke niche badal ke aur fir se kosis karo.", "savefile": "File ke save karo", - "uploadedimage": "\"[[$1]]\" ke upload kar dewa gae", - "overwroteimage": "\"[[$1]]\" ke nawaa version ke upload karaa gais hai", "uploaddisabled": "Uploads ke disable kar dewa gais hai", "copyuploaddisabled": "URL se upload kare pe rok lagae dewa gais hae.", "uploaddisabledtext": "File uploads ke disable kar dewa gais hai.", @@ -1585,6 +1581,7 @@ "watchlist-details": "{{PLURAL:$1|$1 panna|$1 panna}} pe dhyan dewa jae hai, baat waala panna ke chhorr ke.", "wlheader-enotif": "E-mail notification ke enable kar dewa gais hai.", "wlheader-showupdated": "Panna jiske aap ke pichhla visit ke ke baad badal dewa gais hia ke '''bold''' me dekhawa jaawe hai.", + "wlnote": "Niche ke {{PLURAL:$1|pahile waala badlao hai| pahile '''$1''' badlao hai}} pichhle {{PLURAL:$2|ghanta|'''$2''' ghanta}} me as of $3, $4..", "wlshowlast": "Pichhla $1 ghanta $2 din $3 ke dekhao", "watchlist-options": "Dhyan suchi ke options", "watching": "Dekhtaa...", diff --git a/languages/i18n/hu.json b/languages/i18n/hu.json index a872fefd44..374c0881ed 100644 --- a/languages/i18n/hu.json +++ b/languages/i18n/hu.json @@ -847,7 +847,6 @@ "searchprofile-advanced-tooltip": "Keresés adott névterekben", "search-result-size": "$1 ({{PLURAL:$2|egy|$2}} szó)", "search-result-category-size": "$1 oldal, $2 alkategória, $3 fájl", - "search-result-score": "Relevancia: $1%", "search-redirect": "(átirányítva innen: $1)", "search-section": "($1 szakasz)", "search-suggest": "Keresési javaslat: $1", @@ -1232,8 +1231,6 @@ "uploadwarning": "Feltöltési figyelmeztetés", "uploadwarning-text": "Kérlek módosítsd a fájl leírását alább, majd próbáld újra.", "savefile": "Fájl mentése", - "uploadedimage": "„[[$1]]” felküldve", - "overwroteimage": "feltöltötte a(z) „[[$1]]” fájl új változatát", "uploaddisabled": "Feltöltések kikapcsolva", "copyuploaddisabled": "A feltöltés URL alapján le van tiltva.", "uploaddisabledtext": "A fájlfeltöltés nem engedélyezett.", @@ -1603,7 +1600,7 @@ "listgrouprights-addgroup-self-all": "az összes csoportot hozzáadhatja a saját fiókjához", "listgrouprights-removegroup-self-all": "az összes csoporból eltávolíthatja a saját fiókját", "listgrouprights-namespaceprotection-namespace": "Névtér", - "trackingcategories-nodesc": "Nincs leírás.", + "trackingcategories-nodesc": "Nem található leírás.", "trackingcategories-disabled": "A kategória le van tiltva", "mailnologin": "Nincs feladó", "mailnologintext": "Ahhoz hogy másoknak e-mailt küldhess, [[Special:UserLogin|be kell jelentkezned]] és meg kell adnod egy érvényes e-mail címet a [[Special:Preferences|beállításaidban]].", diff --git a/languages/i18n/ia.json b/languages/i18n/ia.json index d9cabd3270..07f2fd1151 100644 --- a/languages/i18n/ia.json +++ b/languages/i18n/ia.json @@ -835,7 +835,6 @@ "searchprofile-advanced-tooltip": "Cercar in spatios de nomines personalisate", "search-result-size": "$1 ({{PLURAL:$2|1 parola|$2 parolas}})", "search-result-category-size": "{{PLURAL:$1|1 membro|$1 membros}} ({{PLURAL:$2|1 subcategoria|$2 subcategorias}}, {{PLURAL:$3|1 file|$3 files}})", - "search-result-score": "Relevantia: $1%", "search-redirect": "(redirection ab $1)", "search-section": "(section $1)", "search-file-match": "(corresponde al contento del file)", @@ -1239,8 +1238,6 @@ "uploadwarning": "Advertimento de incargamento", "uploadwarning-text": "Per favor modifica le description del file ci infra e reproba.", "savefile": "Salveguardar file", - "uploadedimage": "incargava \"[[$1]]\"", - "overwroteimage": "incargava un nove version de \"[[$1]]\"", "uploaddisabled": "Incargamento de files disactivate", "copyuploaddisabled": "Incargamento per URL disactivate.", "uploaddisabledtext": "Le incargamento de files es disactivate.", diff --git a/languages/i18n/ilo.json b/languages/i18n/ilo.json index 6bb3f1363a..360cf5cd28 100644 --- a/languages/i18n/ilo.json +++ b/languages/i18n/ilo.json @@ -573,7 +573,7 @@ "userpage-userdoesnotexist": "Ti pakabilangan ti agar-aramat ni \"$1\" ket saan a nakarehistro. \nPangngaasi a kitaem no kayatmo ti agpartuat/agurnos iti daytoy a panid.", "userpage-userdoesnotexist-view": "Ti pakabilangan ti agar-aramat ni \"$1\" ket saan a nakarehistro.", "blocked-notice-logextract": "Agdama a naserraan daytoy nga agar-aramat.\nTi naudi a listaan ti pannakaserra ket naited dita baba para iti reperensia:", - "clearyourcache": "Nota: Kalpasan ti panangidulin, koma ket masapul nga ipalabas ti cahe ti pagbasabasam tapno makita dagiti sinukatam.\n* Firefox / Safari: Tenglen ti Shift bayat a pinduten ti Reload, wenno talmegan ti Ctrl-F5 wenno Ctrl-R (⌘-R iti Mac)\n* Google Chrome: Talmegan ti Ctrl-Shift-R (⌘-Shift-R iti Mac)\n* Internet Explorer: Tenglen ti Ctrl bayat a pinduten ti Refresh, wenno talmegan ti Ctrl-F5\n* Opera: Dalusan ti cache iidiay Tools → Preferences", + "clearyourcache": "Nota: Kalpasan ti panangidulin, koma ket masapul nga ipalabas ti cahe ti pagbasabasam tapno makita dagiti sinukatam.\n* Firefox / Safari: Tenglen ti Shift bayat a pinduten ti Reload, wenno talmegan ti Ctrl-F5 wenno Ctrl-R (⌘-R iti Mac)\n* Google Chrome: Talmegan ti Ctrl-Shift-R (⌘-Shift-R iti Mac)\n* Internet Explorer: Tenglen ti Ctrl bayat a pinduten ti Refresh, wenno talmegan ti Ctrl-F5\n* Opera: Dalusan ti cache idiay Tools → Preferences", "usercssyoucanpreview": "Paammo: Usaren ti buton ti \"{{int:showpreview}}\" tapno masubokan ti baro a CSS sakbay nga agidulin.", "userjsyoucanpreview": "Pammo: Usaren ti buton ti \"{{int:showpreview}}\" tapno masubokan ti baro a JavaScript sakbay nga agidulin.", "usercsspreview": "Laglagipem nga ipadpadasmo laeng ti bukodmo a CSS ti agar-aramat.\nSaan pay a naidulin!", @@ -825,7 +825,6 @@ "searchprofile-advanced-tooltip": "Agbirukka kadagiti naiduma a nagan ti espasio", "search-result-size": "$1 ({{PLURAL:$2|iti 1 a balikas|kadagiti $2 a balikas}})", "search-result-category-size": "{{PLURAL:$1|1 a kameng| dagiti $1 a kameng}} ({{PLURAL:$2|1 a subkategoria|dagiti $2 a subkategoria}}, {{PLURAL:$3|1 a papeles|dagiti $3 a papeles}})", - "search-result-score": "Kaitutopan: $1%", "search-redirect": "(baw-ing ti $1)", "search-section": "(paset $1)", "search-file-match": "(maipada ti linaon a papeles)", @@ -1228,8 +1227,6 @@ "uploadwarning": "Ballaag ti panagikarga", "uploadwarning-text": "Pangngaasi a baliwam ti deskripsion ti papeles dita baba ken padasen manen.", "savefile": "Idulin ti papeles", - "uploadedimage": "naikarga ti \"[[$1]]\"", - "overwroteimage": "nagikarga ti baro a bersion ti \"[[$1]]\"", "uploaddisabled": "Nabaldado dagiti panagikarga.", "copyuploaddisabled": "Nabaldado ti panagikarga babaen ti URL.", "uploaddisabledtext": "Nabaldado dagiti panagikarga ti papeles.", diff --git a/languages/i18n/it.json b/languages/i18n/it.json index d9180fae6a..59fd0fc427 100644 --- a/languages/i18n/it.json +++ b/languages/i18n/it.json @@ -327,6 +327,8 @@ "hidetoc": "nascondi", "collapsible-collapse": "Comprimi", "collapsible-expand": "Espandi", + "confirmable-yes": "Sì", + "confirmable-no": "No", "thisisdeleted": "Vedi o ripristina $1?", "viewdeleted": "Vedi $1?", "restorelink": "{{PLURAL:$1|una modifica cancellata|$1 modifiche cancellate}}", @@ -895,7 +897,6 @@ "searchprofile-advanced-tooltip": "Cerca nei namespace personalizzati", "search-result-size": "$1 ({{PLURAL:$2|una parola|$2 parole}})", "search-result-category-size": "{{PLURAL:$1|1 utente|$1 utenti}} ({{PLURAL:$2|1 sottocategoria|$2 sottocategorie}}, {{PLURAL:$3|1 file|$3 files}})", - "search-result-score": "Rilevanza: $1%", "search-redirect": "(redirect $1)", "search-section": "(sezione $1)", "search-file-match": "(corrispondenza nel contenuto del file)", @@ -1299,8 +1300,6 @@ "uploadwarning": "Avviso di caricamento", "uploadwarning-text": "Per favore modifica qui sotto la descrizione del file e prova di nuovo.", "savefile": "Salva file", - "uploadedimage": "ha caricato \"[[$1]]\"", - "overwroteimage": "ha caricato una nuova versione di \"[[$1]]\"", "uploaddisabled": "Il caricamento dei file è disabilitato.", "copyuploaddisabled": "Il caricamento tramite URL è disabilitato.", "uploaddisabledtext": "Il caricamento dei file non è attivo.", @@ -3080,6 +3079,9 @@ "logentry-rights-rights": "$1 {{GENDER:$2|ha modificato}} l'appartenenza di $3 dal gruppo $4 al gruppo $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ha modificato}} l'appartenenza a gruppi di $3", "logentry-rights-autopromote": "$1 è {{GENDER:$2|stato promosso|stata promossa|stato/a promosso/a}} automaticamente da $4 a $5", + "logentry-upload-upload": "$1 {{GENDER:$2|ha caricato}} $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|ha caricato}} una nuova versione di $3.", + "logentry-upload-revert": "$1 {{GENDER:$2|ha caricato}} $3", "rightsnone": "(nessuno)", "feedback-bugornote": "Se si è in grado di descrivere il problema tecnico riscontrato in maniera precisa, [$1 segnalate il bug]. In alternativa, si può usare il modulo semplificato sottostante. Il commento inserito sarà aggiunto alla pagina \"[$3 $2]\", insieme al proprio nome utente e al browser in uso.", "feedback-subject": "Oggetto:", diff --git a/languages/i18n/ja.json b/languages/i18n/ja.json index 2abccf1865..b3ba7e90e2 100644 --- a/languages/i18n/ja.json +++ b/languages/i18n/ja.json @@ -77,6 +77,7 @@ "tog-watchdefault": "自分が編集したページやファイルをウォッチリストに追加", "tog-watchmoves": "自分が移動したページやファイルをウォッチリストに追加", "tog-watchdeletion": "自分が削除したページやファイルをウォッチリストに追加", + "tog-watchrollback": "ロールバックしたページをウォッチリストに追加", "tog-minordefault": "細部の編集に既定でチェックを入れる", "tog-previewontop": "プレビューを編集ボックスの前に配置", "tog-previewonfirst": "編集開始時にもプレビューを表示", @@ -89,12 +90,12 @@ "tog-fancysig": "署名をウィキ文として扱う (自動リンクなし)", "tog-uselivepreview": "ライブプレビューを使用 (開発中)", "tog-forceeditsummary": "要約欄が空欄の場合に確認を促す", - "tog-watchlisthideown": "ウォッチリストに自分の編集を表示しない", - "tog-watchlisthidebots": "ウォッチリストにボットによる編集を表示しない", - "tog-watchlisthideminor": "ウォッチリストに細部の編集を表示しない", - "tog-watchlisthideliu": "ウォッチリストにログイン利用者による編集を表示しない", - "tog-watchlisthideanons": "ウォッチリストに匿名利用者による編集を表示しない", - "tog-watchlisthidepatrolled": "ウォッチリストに巡回済みの編集を表示しない", + "tog-watchlisthideown": "自分の編集をウォッチリストに表示しない", + "tog-watchlisthidebots": "ボットによる編集をウォッチリストに表示しない", + "tog-watchlisthideminor": "細部の編集をウォッチリストに表示しない", + "tog-watchlisthideliu": "ログイン利用者による編集をウォッチリストに表示しない", + "tog-watchlisthideanons": "匿名利用者による編集をウォッチリストに表示しない", + "tog-watchlisthidepatrolled": "巡回済みの編集をウォッチリストに表示しない", "tog-ccmeonemails": "他の利用者に送信したメールの控えを自分にも送信", "tog-diffonly": "差分の下にページ内容を表示しない", "tog-showhiddencats": "隠しカテゴリを表示", @@ -195,10 +196,10 @@ "moredotdotdot": "続き...", "morenotlisted": "この一覧は完全ではありません。", "mypage": "ページ", - "mytalk": "トーク", - "anontalk": "このIPアドレスのトーク", + "mytalk": "議論", + "anontalk": "このIPアドレスについての議論", "navigation": "案内", - "and": " および ", + "and": " と", "qbfind": "検索", "qbbrowse": "閲覧", "qbedit": "編集", @@ -220,7 +221,7 @@ "searcharticle": "表示", "history": "ページの履歴", "history_short": "履歴", - "updatedmarker": "最終閲覧以降に変更されました", + "updatedmarker": "前回の閲覧以降に更新されました", "printableversion": "印刷用バージョン", "permalink": "この版への固定リンク", "print": "印刷", @@ -314,6 +315,9 @@ "hidetoc": "非表示", "collapsible-collapse": "折り畳む", "collapsible-expand": "展開する", + "confirmable-confirm": "本当にいいですか?", + "confirmable-yes": "はい", + "confirmable-no": "いいえ", "thisisdeleted": "$1を閲覧または復元しますか?", "viewdeleted": "$1を閲覧しますか?", "restorelink": "{{PLURAL:$1|削除された$1編集}}", @@ -602,6 +606,7 @@ "preview": "プレビュー", "showpreview": "プレビューを表示", "showdiff": "差分を表示", + "blankarticle": "警告:作成しようとしているページの内容がありません。{{Int:savearticle}}\"をもう一度クリックすると、中身の無いページが作成されます。", "anoneditwarning": "警告: ログインしていません。\n編集すると、IPアドレスがこのページの編集履歴に記録されます。", "anonpreviewwarning": "ログインしていません。投稿を保存すると、ご使用中のIPアドレスがこのページの履歴に記録されます。", "missingsummary": "注意: 編集内容の要約が空欄です。\n「{{int:savearticle}}」をもう一度クリックすると、編集内容は要約なしで保存されます。", @@ -760,6 +765,7 @@ "rev-deleted-event": "(記録は除去されています)", "rev-deleted-user-contribs": "[利用者名またはIPアドレスは除去されました - その編集は投稿記録で非表示にされています]", "rev-deleted-text-permission": "この版は削除されています。\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]に詳細情報があるかもしれません。", + "rev-suppressed-text-permission": "この版は秘匿されています。[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 秘匿記録]に詳細情報があるかもしれません。", "rev-deleted-text-unhide": "この版は削除されています。\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]に詳細情報があるかもしれません。\nこのまま[$1 この版を閲覧]できます。", "rev-suppressed-text-unhide": "この版は秘匿されています。\n[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 秘匿記録]に詳細情報があるかもしれません。\nこのまま[$1 この版を閲覧]できます。", "rev-deleted-text-view": "この版は削除されています。\n内容を閲覧できます。[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]に詳細情報があるかもしれません。", @@ -883,7 +889,6 @@ "searchprofile-advanced-tooltip": "特定の名前空間内を検索", "search-result-size": "$1 ({{PLURAL:$2|$2 単語}})", "search-result-category-size": "{{PLURAL:$1|$1 件}} ({{PLURAL:$2|$2 下位カテゴリ}}、{{PLURAL:$3|$3 ファイル}})", - "search-result-score": "関連度: $1%", "search-redirect": "($1からのリダイレクト)", "search-section": "($1の節)", "search-file-match": "(ファイルの内容との一致)", @@ -1293,8 +1298,6 @@ "uploadwarning": "アップロード警告", "uploadwarning-text": "下記のファイル解説を修正して再試行してください。", "savefile": "ファイルを保存", - "uploadedimage": "「[[$1]]」をアップロードしました", - "overwroteimage": "「[[$1]]」の新しい版をアップロードしました", "uploaddisabled": "アップロード機能は無効になっています。", "copyuploaddisabled": "URL からのアップロードは無効になっています。", "uploaddisabledtext": "ファイルのアップロードは、無効になっています。", @@ -1405,8 +1408,8 @@ "nolicense": "選択なし", "licenses-edit": "ライセンスオプションを編集", "license-nopreview": "(プレビューはありません)", - "upload_source_url": "(有効かつ一般に公開されている URL)", - "upload_source_file": "(あなたのコンピューター上のファイル)", + "upload_source_url": "(一般に公開されている、有効な URL からファイルを選択)", + "upload_source_file": "(あなたのコンピューター上からファイルを選択)", "listfiles-delete": "削除", "listfiles-summary": "この特別ページでは、アップロードされたファイルをすべて表示します。", "listfiles_search_for": "検索するメディア名:", @@ -1765,7 +1768,7 @@ "wlheader-enotif": "メール通知が有効になっています。", "wlheader-showupdated": "最終訪問以降に変更されたページは、太字で表示されます。", "wlnote": "$3 $4 までの{{PLURAL:$2|$2時間}}になされた{{PLURAL:$1|$1件の変更}}は以下の通りです。", - "wlshowlast": "次の期間で表示: $1時間、$2日間、$3", + "wlshowlast": "表示する期間: $1時間、$2日間、$3", "watchlist-options": "ウォッチリストのオプション", "watching": "ウォッチリストに追加中...", "unwatching": "ウォッチリストから除去中...", @@ -2229,7 +2232,7 @@ "import-error-create": "あなたにそのページを作成する許可がないため、ページ「$1」は取り込まれませんでした。", "import-error-interwiki": "ページ名が外部リンク (ウィキ間リンク) に予約されているため、ページ「$1」を取り込みませんでした。", "import-error-special": "ページ「$1」は、ページが許可されない特別名前空間に属しているため取り込みませんでした。", - "import-error-invalid": "名前が正しくないため、ページ「$1」を取り込みませんでした。", + "import-error-invalid": "ページ「$1」は、このウィキでは名前が無効であるため、取り込めませんでした。", "import-error-unserialize": "ページ「$1」の版 $2 はシリアライズ解除できませんでした。この版は $4 としてシリアライズされたコンテンツモデル $3 を使用していると報告されています。", "import-error-bad-location": "コンテンツモデル $3 はこのページではサポート外のため、モデル $3 を使用している版 $2 はこのウィキ上の「$1」に保存できません。", "import-options-wrong": "間違った{{PLURAL:$2|オプション}}です: $1", @@ -2238,9 +2241,9 @@ "importlogpage": "取り込み記録", "importlogpagetext": "管理された他のウィキから編集履歴を伴ったページ取り込みです。", "import-logentry-upload": "ファイルのアップロードにより[[$1]]を取り込みました", - "import-logentry-upload-detail": "$1{{PLURAL:$1|版}}", + "import-logentry-upload-detail": "$1{{PLURAL:$1|版}} をインポートしました", "import-logentry-interwiki": "$1をウィキ間移動しました", - "import-logentry-interwiki-detail": "$2の$1{{PLURAL:$1|版}}", + "import-logentry-interwiki-detail": "$2からインポート済みの$1{{PLURAL:$1|版}}", "javascripttest": "JavaScript をテスト中", "javascripttest-title": "$1 のテストの実行", "javascripttest-pagetext-noframework": "このページは JavaScript のテストを実行するために予約されています。", @@ -2918,6 +2921,7 @@ "autosumm-replace": "内容を「$1」で置換", "autoredircomment": "[[$1]]への転送ページ", "autosumm-new": "ページの作成:「$1」", + "autosumm-newblank": "空白のページを作成しました", "size-bytes": "$1バイト", "size-kilobytes": "$1キロバイト", "size-megabytes": "$1メガバイト", @@ -3171,6 +3175,9 @@ "logentry-rights-rights": "$1 が $3 の所属グループを $4 から $5 に{{GENDER:$2|変更しました}}", "logentry-rights-rights-legacy": "$1 が $3 の所属グループを{{GENDER:$2|変更しました}}", "logentry-rights-autopromote": "$1 が $4 から $5 に自動的に{{GENDER:$2|昇格しました}}", + "logentry-upload-upload": "$1 が $3 を {{GENDER:$2|アップロードしました}}", + "logentry-upload-overwrite": "$1 が $3 の新しいバージョンを {{GENDER:$2|アップロードしました}}", + "logentry-upload-revert": "$1 が $3 を {{GENDER:$2|アップロードしました}}", "rightsnone": "(なし)", "feedback-bugornote": "技術的な問題の詳細を説明する準備ができている場合は、[$1 バグ報告]をお願いします。\n準備ができていない場合は、下の簡易フォームを使用してください。あなたのコメントと利用者名が、ページ「[$3 $2]」に追加されます。", "feedback-subject": "件名:", @@ -3273,5 +3280,9 @@ "action-pagelang": "ページの言語の変更", "log-name-pagelang": "言語変更記録", "log-description-pagelang": "これはページ言語の変更の記録です。", - "logentry-pagelang-pagelang": "$1 がページ $3 の言語を $4 から $5 に{{GENDER:$2|変更しました}}" + "logentry-pagelang-pagelang": "$1 がページ $3 の言語を $4 から $5 に{{GENDER:$2|変更しました}}", + "default-skin-not-found": "おっと! あなたのウィキのデフォルト外装「$1」 ($wgDefaultSkin)は利用できません。\n\nあなたのインストールには以下の外装が含まれています。外装の有効化とデフォルトの選択については、[https://www.mediawiki.org/wiki/Manual:Skin_configuration マニュアル: 外装設定] をご覧ください。\n\n$2\n\n; MediaWikiをインストールしたばかりの場合:\n: gitからインストールしたか、その他の何らかの方法でソースコードから直接インストールした場合には、これは期待されたとおりの動作です。\n:* [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] から外装をインストールしてみてください。\n:* [https://www.mediawiki.org/wiki/Download tarball installer] をダウンロードしてみてください。これにはいくつかの外装と拡張機能が含まれています。 skins/ ディレクトリからコピー&ペーストできます。\n: あなたがMediaWiki開発者の場合、これを行うことであなたのgitレポジトリに干渉することはありません。\n\n; MediaWiki をアップグレードした場合:\n: MediaWiki 1.24 以降のバージョンでは、インストール済みの外装は自動的には有効になりません。 ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery マニュアル: 外装の自動探索] をご覧ください。)。LocalSettings.php に以下の行をペーストして、現在インストールされている外装を有効にできます。\n\n
    $3
    \n\n; LocalSettings.phpを編集したばかりの場合:\n: 外装名に打ち間違いがないか再度確認して下さい。", + "default-skin-not-found-no-skins": "おっと! あなたのWikiのデフォルト外装「$1」 ($wgDefaultSkin)は利用できません。\n\n外装をインストールしていません。\n\n; MediaWikiをインストールしたばかりの場合:\n: gitからインストールしたか、その他の何らかの方法でソースコードから直接インストールした場合には、これは期待されたとおりの動作です。\n:* [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] から外装をインストールしてみてください。\n:* [https://www.mediawiki.org/wiki/Download tarball installer] をダウンロードしてみてください。これには外装と拡張機能がいくつか含まれています。 skins/ ディレクトリからコピー&ペーストできます。\n: あなたがMediaWiki開発者の場合、これを行うことであなたのgitレポジトリに干渉することはありません。外装の有効化とデフォルトの選択についての情報は、[https://www.mediawiki.org/wiki/Manual:Skin_configuration マニュアル: 外装設定] をご覧ください。", + "default-skin-not-found-row-enabled": "* $1 / $2 (有効)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''無効''')" } diff --git a/languages/i18n/kk-cyrl.json b/languages/i18n/kk-cyrl.json index 13cea46eb7..6046b72480 100644 --- a/languages/i18n/kk-cyrl.json +++ b/languages/i18n/kk-cyrl.json @@ -7,7 +7,8 @@ "Bakytgul Salykhova", "Daniyar", "GaiJin", - "Kaztrans" + "Kaztrans", + "Balnur.s" ] }, "tog-underline": "Сілтеменің астын сызу:", @@ -261,6 +262,8 @@ "hidetoc": "жасыру", "collapsible-collapse": "Түру", "collapsible-expand": "Жазу", + "confirmable-yes": "Иә", + "confirmable-no": "Жоқ", "thisisdeleted": "$1 қарайсыз ба немесе қалпына келтіресіз бе?", "viewdeleted": "$1 қарайсыз ба?", "restorelink": "{{PLURAL:$1|жойылған өңдемені|$1 жойылған өңдемені}}", @@ -777,7 +780,6 @@ "searchprofile-advanced-tooltip": "Әдепкі есім кеңістігінен іздеу", "search-result-size": "$1 ({{PLURAL:$2|1 сөз|$2 сөз}})", "search-result-category-size": "{{PLURAL:$1|1 мүше|$1 мүше}} ({{PLURAL:$2|1 санатша|$2 санатша}}, {{PLURAL:$3|1 файл|$3 файл}})", - "search-result-score": "Арақатынастылығы: $1 %", "search-redirect": "(айдағыш $1)", "search-section": "(бөлім $1)", "search-suggest": "Мүмкін осы болар: $1", @@ -1162,8 +1164,6 @@ "file-exists-duplicate": "Бұл файл келесі {{PLURAL:$1|файлдың|файлдарының}} телнұсқасы:", "uploadwarning": "Жүктеу жөнінде құлақтандыру", "savefile": "Файлды сақтау", - "uploadedimage": "«[[$1]]» файлын жүктеді", - "overwroteimage": "«[[$1]]» деген файлдың жаңа нұсқасын жүктеді", "uploaddisabled": "Жүктеу өшірілген", "copyuploaddisabled": "URL арқылы жүктеу өшірілген.", "uploaddisabledtext": "Файл жүктеу өшірілген.", diff --git a/languages/i18n/ko.json b/languages/i18n/ko.json index bb416bea16..bc0d91aab4 100644 --- a/languages/i18n/ko.json +++ b/languages/i18n/ko.json @@ -857,7 +857,6 @@ "searchprofile-advanced-tooltip": "다음 설정한 이름공간에서 검색", "search-result-size": "$1 ({{PLURAL:$2|1 단어|$2 단어}})", "search-result-category-size": "{{PLURAL:$1|문서 1개|문서 $1개}}, {{PLURAL:$2|하위 분류 1개|하위 분류 $2개}}, {{PLURAL:$3|파일 1개|파일 $3개}}", - "search-result-score": "유사도: $1%", "search-redirect": "($1에서 넘어옴)", "search-section": "($1 문단)", "search-file-match": "(내용이 일치하는 파일 있음)", @@ -1261,8 +1260,6 @@ "uploadwarning": "올리기 경고", "uploadwarning-text": "아래의 파일 설명을 수정하고 다시 시도해 주세요.", "savefile": "파일 저장", - "uploadedimage": "사용자가 \"[[$1]]\" 파일을 올렸습니다.", - "overwroteimage": "사용자가 \"[[$1]]\" 파일의 새 판을 올렸습니다.", "uploaddisabled": "올리기 비활성화됨", "copyuploaddisabled": "URL로 파일 올리기가 비활성화되어 있습니다.", "uploaddisabledtext": "파일 올리기 기능이 비활성화되어 있습니다.", @@ -1870,7 +1867,7 @@ "undeletedrevisions-files": "{{PLURAL:$1|판 1개|판 $1개}}와 {{PLURAL:$2|파일 1개|파일 $2개}}를 되살렸습니다", "undeletedfiles": "{{PLURAL:$1|파일 1개|파일 $1개}}를 되살렸습니다", "cannotundelete": "되살리는 데 실패했습니다:\n$1", - "undeletedpage": "'''$1 문서를 되살렸습니다.'''\n\n[[Special:Log/delete|삭제 기록]]에서 최근의 삭제와 되살리기 기록을 볼 수 있습니다.", + "undeletedpage": "$1 문서를 되살렸습니다.\n\n[[Special:Log/delete|삭제 기록]]에서 최근의 삭제 및 되살리기 기록을 볼 수 있습니다.", "undelete-header": "최근에 삭제한 문서에 대한 기록은 [[Special:Log/delete|여기]]에서 볼 수 있습니다.", "undelete-search-title": "삭제된 문서 검색", "undelete-search-box": "삭제된 문서 검색", diff --git a/languages/i18n/ksh.json b/languages/i18n/ksh.json index 19e305d341..da11257b38 100644 --- a/languages/i18n/ksh.json +++ b/languages/i18n/ksh.json @@ -825,7 +825,6 @@ "searchprofile-advanced-tooltip": "Donn en ußjesohte Appachtemangs sööke", "search-result-size": "$1 ({{PLURAL:$2|Eij Woot|$2 Wööter|Keij Woot}})", "search-result-category-size": "{{PLURAL:$1|1 Saach|$1 Saache|0 Saache}} ({{PLURAL:$2|1 Ongerjropp|$2 Ongerjroppe|0 Ongerjroppe}}, {{PLURAL:$3|1 Datei|$3 Dateie|0 Dateie}})", - "search-result-score": "Jeweesch: $1%", "search-redirect": "(Ömleitung $1)", "search-section": "(Avschnett $1)", "search-file-match": "(en dä Dattei dren)", @@ -1230,8 +1229,6 @@ "uploadwarning": "Warnung beim Huhlade", "uploadwarning-text": "Donn onge dä Täx övver di Dattei ändere, un versöhg_et norr_ens.", "savefile": "Datei avspeichere", - "uploadedimage": "hät huhjelade: „[[$1]]“", - "overwroteimage": "hät en neue Version huhjelade vun: „[[$1]]“", "uploaddisabled": "Huhlade jesperrt", "copyuploaddisabled": "Et Huhlaade us URLs es afjeschalldt", "uploaddisabledtext": "Et Huhlade es jesperrt.", diff --git a/languages/i18n/ku-latn.json b/languages/i18n/ku-latn.json index 3cf2b88e49..65f2a50cd2 100644 --- a/languages/i18n/ku-latn.json +++ b/languages/i18n/ku-latn.json @@ -832,8 +832,6 @@ "fileexists-forbidden": "Medyayek bi vê navî heye; xêra xwe şonda here û vê medyayê bi navekî din barbike.\n[[File:$1|thumb|center|$1]]", "uploadwarning": "Hişyariya barkirinê", "savefile": "Dosyayê tomar bike", - "uploadedimage": "\"[[$1]]\" hate barkirin", - "overwroteimage": "versiyonekî nû ya \"[[$1]]\" hate barkirin", "uploaddisabled": "Barkirin hatîye qedexekirin", "uploaddisabledtext": "Barkirinê data'yan hatiye qedexekirin.", "uploadvirus": "Di vê data'yê da vîrûsek heye! Înformasyon: $1", diff --git a/languages/i18n/la.json b/languages/i18n/la.json index b590893b51..5da1b59761 100644 --- a/languages/i18n/la.json +++ b/languages/i18n/la.json @@ -173,6 +173,7 @@ "searcharticle": "Ire", "history": "Historia paginae", "history_short": "Historia", + "updatedmarker": "mutata postquam vidi", "printableversion": "Forma impressibilis", "permalink": "Nexus perpetuus", "print": "Imprimere", @@ -347,6 +348,7 @@ "gotaccount": "Habesne iam rationem? '''$1'''.", "gotaccountlink": "Conventum aperi", "userlogin-resetlink": "Num tesserae tuae oblitus es?", + "userlogin-resetpassword-link": "Num tesserae oblivisceris?", "createacct-emailrequired": "Inscriptio electronica", "createacct-emailoptional": "Inscriptio electronica (non necesse)", "createacct-email-ph": "Inscriptionem electronicam tuam inscribe", @@ -594,7 +596,6 @@ "searchprofile-everything-tooltip": "Omnia perscrutari (etiam paginae disputationis)", "searchprofile-advanced-tooltip": "In spatiis nominalibus accommotis quaerere", "search-result-size": "$1 ({{PLURAL:$2|1 verbum|$2 verba}})", - "search-result-score": "Gravitas: $1%", "search-redirect": "(redirectio $1)", "search-section": "(pars $1)", "search-suggest": "Nonne dicere voluisti: $1", @@ -858,7 +859,6 @@ "large-file": "Suasum est ut fasciculi $1 magnitudine non excedant; magnitudo huius fasciculi est $2.", "uploadwarning": "Monitus imponendi", "savefile": "Servare fasciculum", - "uploadedimage": "imposuit \"[[$1]]\"", "uploaddisabled": "Fasciculos imponere prohibitum est", "uploaddisabledtext": "Fasciculos imponere prohibitum est.", "uploadvirus": "Fasciculi huic est virus! Singula: $1", @@ -1421,7 +1421,7 @@ "tooltip-pt-userpage": "Pagina usoris tua", "tooltip-pt-mytalk": "Pagina disputationis tua", "tooltip-pt-preferences": "Praeferentiae tuae", - "tooltip-pt-watchlist": "Paginae quae custodis ut eorum mutationes facilius vides", + "tooltip-pt-watchlist": "Paginae quas custodis ut earum mutationes facilius videas", "tooltip-pt-mycontris": "Index conlationum tuarum", "tooltip-pt-login": "Te conventum aperire hortamur, non autem requisitum", "tooltip-pt-logout": "Conventum concludere", diff --git a/languages/i18n/lb.json b/languages/i18n/lb.json index c831a350bc..34bda5eda2 100644 --- a/languages/i18n/lb.json +++ b/languages/i18n/lb.json @@ -269,6 +269,9 @@ "hidetoc": "verstoppen", "collapsible-collapse": "Zesummeklappen", "collapsible-expand": "Opklappen", + "confirmable-confirm": "Sidd {{GENDER:$1|Dir}} sécher?", + "confirmable-yes": "Jo", + "confirmable-no": "Neen", "thisisdeleted": "$1 kucken oder zrécksetzen?", "viewdeleted": "Weis $1?", "restorelink": "$1 geläscht {{PLURAL:$1|Versioun|Versiounen}}", @@ -353,7 +356,7 @@ "invalidtitle-knownnamespace": "Net valabelen Titel mam Nummraum \"$2\" a mam Text \"$3\"", "invalidtitle-unknownnamespace": "Net valabelen Titel mat der onbekannter Nummraum-Zuel $1 a mam Text \"$2\"", "exception-nologin": "Net ageloggt", - "exception-nologin-text": "[[Special:Userlogin|Loggt Iech w.e.g. a]] fir op dës Säit oder dës Aktioun zougräifen ze kënnen.", + "exception-nologin-text": "Loggt Iech w.e.g. a fir op dës Säit oder dës Aktioun zougräifen ze kënnen.", "exception-nologin-text-manual": "Dir musst Iech $1 fir dës Säit kucken ze kënne respektiv fir dës Aktioun ze maachen.", "virus-badscanner": "Schlecht Konfiguratioun: onbekannte Virescanner: ''$1''", "virus-scanfailed": "De Scan huet net funktionéiert (Code $1)", @@ -664,7 +667,7 @@ "parser-template-loop-warning": "Endlos Schleef an der Schabloun: [[$1]] entdeckt", "parser-template-recursion-depth-warning": "D'Limit vun der Zuel vun de Verschachtelunge vu Schabloune gouf iwwerschratt ($1)", "language-converter-depth-warning": "D'Limite vun der déift vun der Sproochëmwandlung gouf iwwerschratt ($1)", - "node-count-exceeded-category-desc": "Eng Kategorie fir Säiten an deenen d'Zuel vun de Kniet (Node-count) ze grouss ass.", + "node-count-exceeded-category-desc": "D'Säit huet méi wéi déi maximal Zuel vu Kniet (Node-count).", "parser-unstrip-loop-warning": "Endlos Schleef entdeckt", "converter-manual-rule-error": "An der Regel iwwer déi manuell Ëmwandlung vun der Sprooch gouf e Feeler fonnt", "undo-success": "D'Ännerung gëtt réckgängeg gemaach. Iwwerpréift w.e.g. de Verglach ënnendrënner fir nozekuckeen ob et sou richteg ass, duerno späichert w.e.g d'Ännerungen of, fir dës Aktioun ofzeschléissen.", @@ -826,7 +829,6 @@ "searchprofile-advanced-tooltip": "Sich an den Nummraim déi an de perséinlichen Astellungen festgeluecht sinn", "search-result-size": "$1 ({{PLURAL:$2|1 Wuert|$2 Wierder}})", "search-result-category-size": "{{PLURAL:$1|1 Säit|$1 Säiten}} ({{PLURAL:$2|1 Ënnerkategorie|$2 Ënnerkategorien}}, {{PLURAL:$3|1 Fichier|$3 Fichieren}})", - "search-result-score": "Relevanz: $1 %", "search-redirect": "(Viruleedung $1)", "search-section": "(Abschnitt $1)", "search-file-match": "(Inhalt vum Fichier passt)", @@ -852,7 +854,7 @@ "preferences": "Astellungen", "mypreferences": "Astellungen", "prefs-edits": "Zuel vun den Ännerungen:", - "prefsnologintext2": "Dir musst Iech $1 fir Är Benotzerastellunge festzeleeën", + "prefsnologintext2": "Loggt Iech a fir Är Benotzerastellungen z'änneren.", "prefs-skin": "Skin", "skin-preview": "Kucken", "datedefault": "Egal (Standard)", @@ -1230,8 +1232,6 @@ "uploadwarning": "Opgepasst", "uploadwarning-text": "Ännert d'Beschreiwung hei ënnedrënner w.e.g. a versicht et nach eng Kéier.", "savefile": "Fichier späicheren", - "uploadedimage": "huet \"[[$1]]\" eropgelueden", - "overwroteimage": "huet eng nei Versioun vun \"[[$1]]\" eropgelueden", "uploaddisabled": "Pardon, d'Eropluede vu Fichieren ass ausgeschalt.", "copyuploaddisabled": "D'Eroplueden iwwer URL ass desaktivéiert.", "uploaddisabledtext": "D'Eropluede vu Fichieren ass ausgeschalt.", @@ -1628,8 +1628,9 @@ "trackingcategories-msg": "Tracking-Kategorie", "trackingcategories-name": "Numm vum Message", "noindex-category-desc": "D'Säit gëtt net vu Botten indexéiert, well dat magescht Wuert __NOINDEX__ dran ass a well se an engem Nummraum ass, an deem déi Markéierung erlaabt ass.", - "broken-file-category-desc": "Kategorie, déi derbäigesat gëtt, wann et op der Säit e futtise Link op e Fichier gëtt (e Link op en agebonnene Fichier wann et de Fichier net gëtt).", - "hidden-category-category-desc": "Dëst ass eng Kategorie an där __HIDDENCAT__ drasteet, dat verhënnert datt se standardméisseg an der këscht mat de Kategorielinken op der Säit gewise gëtt.", + "post-expand-template-inclusion-category-desc": "D'Säit ass méi grouss wéi $wgMaxArticleSize nom expandéiere vun alle Schablounen, dofir goufen e puer Schablounen net expandéiert.", + "broken-file-category-desc": "D'Säit huet e futtise Link op e Fichier (e Link op en agebonnene Fichier wann et de Fichier net gëtt).", + "hidden-category-category-desc": "D'Kategorie huet __HIDDENCAT__ an hirer Säit drastoen, dat verhënnert datt se standardméisseg an der Këscht mat de Kategorielinken op der Säit gewise gëtt.", "trackingcategories-nodesc": "Keng Beschreiwung disponibel.", "trackingcategories-disabled": "Kategorie ass desaktivéiert", "mailnologin": "Keng E-Mailadress", @@ -1666,7 +1667,7 @@ "mywatchlist": "Iwwerwaachungslëscht", "watchlistfor2": "Vum $1 $2", "nowatchlist": "Är Iwwerwaachungslëscht ass eidel.", - "watchlistanontext": "Dir musst $1 fir Säiten op ärer Iwwerwaachungslëscht ze gesinn oder z'änneren.", + "watchlistanontext": "Loggt Iech a fir Elementer op Ärer Iwwerwaachungslëscht ze gesinn oder z'änneren.", "watchnologin": "Net ageloggt", "addwatch": "Op d'Iwwerwaachungslëscht derbäisetzen", "addedwatchtext": "D'Säit \"[[:$1]]\" gouf op är [[Special:Watchlist|Iwwerwaachungslëscht]] gesat.\nAll weider Ännerungen op dëser Säit an der associéierter Diskussiounssäit ginn hei opgelëscht.", @@ -1730,6 +1731,7 @@ "delete-edit-reasonlist": "Läschgrënn änneren", "delete-toobig": "Dës Säit huet e laangen Historique, méi wéi $1 {{PLURAL:$1|Versioun|Versiounen}}.\nD'Läsche vu sou Säite gouf limitéiert fir ongewollte Stéierungen op {{SITENAME}} ze verhënneren.", "delete-warning-toobig": "Dës Säit huet eng laang Versiounsgeschicht, méi wéi $1 {{PLURAL:$1|Versioun|Versiounen}}.\nD'Läschen dovu kann zu Stéierungen am Fonctionnement vun {{SITENAME}} féieren;\ndës Aktioun soll mat Virsiicht gemaach ginn.", + "delete-cantedit": "Dir däerft dës Säit net läsche well Dir net d'Recht hutt fir se z'änneren.", "deleting-backlinks-warning": "'''Opgepasst:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Aner Säite]] linken op déi Säit déi Dir am Gaang sidd ze läschen oder déi Säit Déi Dir am Gaang sidd ze läschen ass an aner Säiten agebonn.", "rollback": "Ännerungen zrécksetzen", "rollback_short": "Zrécksetzen", @@ -1890,7 +1892,7 @@ "autoblockid": "Automatesch Spär #$1", "block": "Benotzer spären", "unblock": "D'Spär vum Benotzer ophiewen", - "blockip": "Benotzer spären", + "blockip": "{{GENDER:$1|Benotzer}} spären", "blockip-legend": "Benotzer spären", "blockiptext": "Benotzt dëse Formulaire fir eng spezifesch IP-Adress oder e Benotzernumm ze spären. Dëst soll nëmmen am Fall vu Vandalismus gemaach ginn, en accordance mat den [[{{MediaWiki:Policy-url}}|interne Richlinen]]. Gitt e spezifesche Grond un (zum Beispill Säite wou Vandalismus virgefall ass).", "ipaddressorusername": "IP-Adress oder Benotzernumm:", @@ -1919,7 +1921,7 @@ "ipb-unblock-addr": "Spär vum $1 ophiewen", "ipb-unblock": "Spär vun enger IP-Adress oder engem Benotzer ophiewen", "ipb-blocklist": "Kuckt aktuell Spären", - "ipb-blocklist-contribs": "Kontributioune fir $1", + "ipb-blocklist-contribs": "Kontributioune vum {{GENDER:$1|$1}}", "unblockip": "Spär vum Benotzer ophiewen", "unblockiptext": "Benotzt dëse Formulaire fir enger IP-Adress oder engem Benotzer seng Spär opzehiewen.", "ipusubmit": "Des Spär ophiewen", @@ -2004,7 +2006,7 @@ "unlockdbsuccesssub": "D'Spär vun der Datebank gouf opgehuewen", "lockdbsuccesstext": "D'{{SITENAME}}-Datebank gouf gespaart.
    \nDenkt drun [[Special:UnlockDB|d'Spär erëm ewechzehuele]] soubaal d'Maintenance-Aarbechte fäerdeg sinn.", "unlockdbsuccesstext": "D'Spär vun der Datebank ass opgehuewen.", - "lockfilenotwritable": "De Fichier mat de Späre vun der Datebank kann net geännert ginn.\nFir d'Datebank ze spären oder fir d'Spär opzehiewen muss dëse Fichier vum Webserver geännert kënne ginn.", + "lockfilenotwritable": "De Fichier mat de Späre vun der Datebank kann net geännert ginn.\nFir d'Datebank ze spären oder fir d'Spär opzehiewe muss dëse Fichier vum Webserver geännert kënne ginn.", "databasenotlocked": "D'Datebank ass net gespaart.", "lockedbyandtime": "(vum $1 de(n) $2 ëm $3 Auer)", "move-page": "Réckel $1", @@ -2110,7 +2112,7 @@ "thumbnail_image-missing": "De Fichier schengt ze feelen: $1", "import": "Säiten importéieren", "importinterwiki": "Transwiki-Import", - "import-interwiki-text": "Sicht eng Wiki an e Säitentitel eraus fir z'importéieren.\nD'Versiounsdatumen an d'Benotzernimm bleiwen derbäi erhalen.\nAll Transwiki-Import-Aktioune ginn am [[Special:Log/import|Import-Logbuch]] protokolléiert.", + "import-interwiki-text": "Sicht eng Wiki an e Säitentitel eraus fir z'importéieren.\nD'Versiounsdatumen an d'Benotzernimm bleiwen dobäi erhalen.\nAll Transwiki-Import-Aktioune ginn am [[Special:Log/import|Import-Logbuch]] protokolléiert.", "import-interwiki-source": "Quelle Wiki/Säit:", "import-interwiki-history": "Importéier all d'Versioune vun dëser Säit", "import-interwiki-templates": "Mat alle Schablounen", @@ -2718,7 +2720,7 @@ "confirmemail_pending": "Dir krut schonn e Confirmatiouns-Code per E-Mail geschéckt. Wenn Dir Äre Benotzerkont eréischt elo kuerz opgemaach hutt, da gedëllegt Iech nach e puer Minutten bis Är E-Mail ukomm ass, ier Dir een neie Code ufrot.", "confirmemail_send": "Confirmatiouns-E-Mail schécken", "confirmemail_sent": "Confirmatiouns-E-Mail gouf geschéckt.", - "confirmemail_oncreate": "E Confirmatiouns-Code gouf op Är E-Mail-Adress geschéckt.\nDëse Code gëtt fir d'Umeldung net gebraucht. Dir braucht en awer bei der Aktivéierung vun den E-Mail-Funktiounen bannert der Wiki.", + "confirmemail_oncreate": "E Confirmatiouns-Code gouf op Är E-Mail-Adress geschéckt.\nDëse Code gëtt fir d'Umeldung net gebraucht. Dir braucht en awer bei der Aktivéierung vun den E-Mail-Funktioune bannert der Wiki.", "confirmemail_sendfailed": "{{SITENAME}} konnt är Confirmatiouns-E-Mail net schécken.\nIwwerpréift w.e.g. är E-Mailadress op ongëlteg Zeechen.\n\nFeelermeldung vum Mailserver: $1", "confirmemail_invalid": "Ongëltege Confirmatiounscode. Eventuell ass d'Gëltegkeetsdauer vum Code ofgelaf.", "confirmemail_needlogin": "Dir musst Iech $1, fir Är E-Mail-Adress ze confirméieren.", @@ -2726,7 +2728,7 @@ "confirmemail_loggedin": "Är E-Mail-Adress gouf elo confirméiert.", "confirmemail_subject": "Confirmatioun vun der E-Mail-Adress fir {{SITENAME}}", "confirmemail_body": "E Benotzer, waarscheinlech dir selwer, hutt mat der IP Adress $1 de Benotzerkont \"$2\" um Site {{SITENAME}} opgemaach.\n\nFir ze bestätegen, datt dee Kont iech wierklech gehéiert a fir d'E-Mail-Funktiounen um Site {{SITENAME}} z'aktivéieren, maacht w.e.g. dëse Link an ärem Browser op:\n$3\n\nWann dir dëse Benotzerkont *net* opgemaach hutt, maacht w.e.g. dëse Link an ärem Browser op fir d'E-Mailconfirmation z'annulléieren:\n\n$5\n\nSollt et sech net ëm äre Benotzerkont handelen, da maacht de Link *net* op. De Confirmatiounscode ass gëlteg bis de(n) $4.", - "confirmemail_body_changed": "E Benotzer, wahrscheinlech Dir selwer, vun der IP-Adress $1,\nhuet d'E-Mail-Adress vum Benotzerkont \"$2\" op dës Adress op {{SITENAME}} geännert.\n\nFir ze confirméieren datt dëse Benotzerkont Iech wierklech gehéiert a fir d'E-Mailfonctiounen op {{SITENAME}} ze reaktivéieren, maacht dës Link an Ärem Browser op:\n\n$3\n\nWann de Benotzerkont Iech *net* gehéiert, da klickt op dëse Link fir d'Confirmatioun vun der E-Mail-Adress auszeschalten:\n\n$5\n\nDëse Confirmatiounscode leeft den $4 of.", + "confirmemail_body_changed": "E Benotzer, wahrscheinlech Dir selwer, vun der IP-Adress $1,\nhuet d'E-Mail-Adress vum Benotzerkont \"$2\" op dës Adress op {{SITENAME}} geännert.\n\nFir ze confirméieren datt dëse Benotzerkont Iech wierklech gehéiert a fir d'E-Mailfonctiounen op {{SITENAME}} ze reaktivéieren, maacht dëse Link an Ärem Browser op:\n\n$3\n\nWann de Benotzerkont Iech *net* gehéiert, da klickt op dëse Link fir d'Confirmatioun vun der E-Mail-Adress auszeschalten:\n\n$5\n\nDëse Confirmatiounscode leeft den $4 of.", "confirmemail_body_set": "Iergendeen, wahrscheinlech Dir selwer, vun der IP-Adress $1,\nhuet d'E-Mail-Adress vum Benotzerkont \"$2\" op dës Adress op {{SITENAME}} geännert.\n\nFir ze confirméieren datt dëse Benotzerkont Iech wierklech gehéiert a fir d'E-Mailfonctiounen op {{SITENAME}} ze reaktivéieren, maacht dës Link an Ärem Browser op:\n\n$3\n\nWann de Benotzerkont Iech *net* gehéiert, da klickt op dëse Link fir d'Confirmatioun vun der E-Mail-Adress auszeschalten:\n\n$5\n\nDëse Confirmatiounscode leeft den $4 of.", "confirmemail_invalidated": "Confirmatioun vun der E-Mail-Adress annulléiert", "invalidateemail": "Annulléier d'E-Mailconfirmation", @@ -2955,6 +2957,9 @@ "logentry-rights-rights": "$1 {{GENDER:$2|huet}} d'Gruppen zou deenen de Benotzer $3 gehéiert vu(n) $4 op $5 geännert", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|huet}} d'Gruppen zou deenen de Benotzer $3 gehéiert geännert", "logentry-rights-autopromote": "De Benotzer $1 {{GENDER:$2|krut}} d'Benotzerrechter automatesch vu(n) $4 op $5 geännert", + "logentry-upload-upload": "$1 huet $3 {{GENDER:$2|eropgelueden}}", + "logentry-upload-overwrite": "$1 huet eng nei Versioun vu(n) $3 {{GENDER:$2|eropgelueden}}", + "logentry-upload-revert": "$1 huet $3 {{GENDER:$2|eropgelueden}}", "rightsnone": "(keen)", "feedback-bugornote": "Wann Dir bereet sidd fir en technesche Problem am Detail ze beschreiwen da [$1 mellt w.e.g. e Feeler (Bug)].\nSoss kënnt Dir den einfache Formulär hei drënner benotzen. Är Bemierkung gëtt op d'Säit \"[$3 $2]\" derbäigesat, zesumme mat Ärem Benotzernumm an dem Numm vum Browser deen Dir benotzt.", "feedback-subject": "Sujet:", @@ -3048,5 +3053,7 @@ "right-pagelang": "Sprooch vun der Säit änneren", "action-pagelang": "d'Sprooch vun der Säit änneren", "log-name-pagelang": "Log vum Ännere vun der Sprooch", - "log-description-pagelang": "Dëst ass a Log mat den Ännerunge vun de Sprooche vun de Säiten." + "log-description-pagelang": "Dëst ass a Log mat den Ännerunge vun de Sprooche vun de Säiten.", + "default-skin-not-found-row-enabled": "* $1 / $2 (aktivéiert)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''desaktivéiert''')" } diff --git a/languages/i18n/lrc.json b/languages/i18n/lrc.json index f093335885..597ee3d5b8 100644 --- a/languages/i18n/lrc.json +++ b/languages/i18n/lrc.json @@ -20,6 +20,7 @@ "tog-watchdefault": "بلگیا و فایلایی که مه ویرایشت کمه اضاف کو د سیل برگم", "tog-watchmoves": "بلگیاو فایلیایی که مه جاوه جا کمه د سیل برگم اضاف کو", "tog-watchdeletion": "بلگیا و فایلایی که مه پاک کمه اضاف کو د سیل برگم", + "tog-watchrollback": "همه بلگه یا نه د جایی که مه د سیل برگم می کم اضاف کو.", "tog-minordefault": "همه ویرایشتیا کؤچک نه وا پیش فرض بیئن نشو دار کو.", "tog-previewontop": "پیش سیل نه دما جعوه ویرایشت نشو بیئه", "tog-previewonfirst": "پیش سیل نه د اولین ویرایشت نشو بیئه", @@ -211,8 +212,8 @@ "jumpto": "پئرستن د", "jumptonavigation": "ناوگشتن", "jumptosearch": "پی جوری", - "view-pool-error": "د بدبختی،", - "generic-pool-error": "د بدبختی", + "view-pool-error": "د بدبختی،ایسنی سروریا فره شلوغ.\nکاریاریا فره زیادی میهان ای بلگه نه بوینن.\nیه گری صب بکیتو دما یه که میهات دوواره ای بلگه نه بوینیت.", + "generic-pool-error": "د بدبختی،ایسنی سروریا فره شلوغ.\nکاریاریا فره زیادی میهان ای بلگه نه بوینن.\nیه گری صب بکیتو دما یه که میهات دوواره ای بلگه نه بوینیت.", "pool-timeout": "وخت سی تیه وه ره منن سی قلف بیئن تموم بی", "pool-queuefull": "ذخیره گی گرتن پر بیه", "pool-errorunknown": "خطا ناشناس", @@ -230,7 +231,7 @@ "mainpage-description": "سرآسونه", "policy-url": "پروجه:خط و مش", "portal": "درآسونه کومله یکی", - "portal-url": "پروجه:تلگه کومله یکی", + "portal-url": "پروجه:سرآسونه کومله یکی", "privacy": "رهبرد رازداری", "privacypage": "پروجه: خط مشی راز واداشتن", "badaccess": "خطا :اجازه بئیر", @@ -257,6 +258,9 @@ "hidetoc": "قام كردن", "collapsible-collapse": "جم كردن", "collapsible-expand": "وا كردن", + "confirmable-confirm": "{{GENDER:$1|شما}} مطئمنیت?", + "confirmable-yes": "هری", + "confirmable-no": "نه", "thisisdeleted": "دیئن یا ورگنين $1?", "viewdeleted": "دیئن$1?", "restorelink": "{{جمی:$1|یه گل ویرایشت پاک بیه|$1 ویرایشتیا پاک بیه}}", @@ -325,18 +329,30 @@ "protectedpagetext": "دای بلگه نبوئه ویرایشت یا کاریا هنی بکید", "viewsourcetext": "شما تونیت سرچشمه ای بلگه نه بوینیت و دش ورداریت:", "viewyourtext": "شما تونیت سرچشمه ویرایشتیا تونه ای د بلگه بوینیت و دشو ورداریت", + "protectedinterface": "ای بلگه سی نرم افزار د ای ویکی نیسسه آماده می که، و د .\nسی اضاف کردن یا آلشت دئن د همه ویکی یا لطفا [//translatewiki.net/ translatewiki.net] نه به کار بؤریت، ولات نشین کنی پروجه ویکی وارسگر.", + "editinginterface": "زئنار دئن: شما داریت بلگه ای نه که سی بیه ویرایشت می کید.", + "cascadeprotected": "ای بلگه د ویرایشت محافظت بیه سی یه که {{جمی:$1|وه بلگه یه |ونو بلگه یان}} که ها دش د :\n$2", + "namespaceprotected": "شما حقی سی ویرایشت بلگه یایی که هان د نومجا $1 ناریت.", + "customcssprotected": "شما سی ویرایشت ای بلگه سی اس اس اجازه ناریت سی یه که میزونکاری دونسمنیا شخصی یه کاریار هنی ها د وه.", + "customjsprotected": "شما سی ویرایشت ای بلگه جاوا اسکریپت اجازه ناریت سی یه که میزونکاری دونسمنیا شخصی یه کاریار هنی ها د وه.", "mycustomcssprotected": "شما حق ناریت ای بلگه سی اس اس نه ویرایشت بکید", "mycustomjsprotected": "شما حق ناریت ای بلگه جاوا اسکریپت نه ویرایشت بکید", "myprivateinfoprotected": "شما حق ناریت دونسمنیا خصوصی نه ویرایشت بکید", "mypreferencesprotected": "شما حق ناریت ویجگی یا هنی تونه ویرایشت بکید", "ns-specialprotected": "بلگیا ویجه نتونن ویرایشت بوئن", + "titleprotected": "ای دیارگر د دروس بیئن وه دس [[کاریار:$1|$1]].\n نهاگری بیه.\nدلیلش ونه\"$2\".", + "filereadonlyerror": "نبوئه جانیا \"$1\" آلشت بکیتو سی یه که اماییه گه \"$2\" فقط د حال و بال حننیه.\n\nدیوونداری که یه نه قلف کرده موئه د واشکافت \"$3\" بکیتو.", "invalidtitle-knownnamespace": "نوم نامعتور سی نوم جا \"$2\" و نیسه \"$3\"", "invalidtitle-unknownnamespace": "نوم نامعتور سی شماره نومجا ناشناس $1 و نیسه \"$2\"", "exception-nologin": "نبوئه وارد بوئيد", + "exception-nologin-text": "شما وارد [[ویجه:وامین اومائن کاریار|وامین اومائن]] بوئیت سی یه تونستویت که د ای بلگه یا کنشت دسرسی داشتویت.", "exception-nologin-text-manual": "خواهشمنیدم که $1 تونسه بوئه د ای بلگه دسرسی داشتوه یا کاری انجوم بیئه.", + "virus-badscanner": "سازواره گن:ویروس ناشناس:$1", "virus-scanfailed": "زل بیئن شکست حرد($1)", "virus-unknownscanner": "ويروس كش ناآشگار", + "logouttext": "شما هنی نریتته وه در.\n\nد ویرتو با که ویرگه نهو انجومیارتو نه پاکسا نکیت، سی یه پاره ای د بلگه یا ممکنه جوری نشو دئه بوئن چی یه که منیستی شما هنی هایین وامین.", "welcomeuser": "خوش اومايت،$1!", + "welcomecreation-msg": "حساوتو دروس بیه.\nد ویرتو نروئه که{{نوم دیارگه}} [[Special:Preferences|preferences]] خوتونه آلشت بکیت", "yourname": "نوم کاریاری:", "userlogin-yourname": "نوم كاروری", "userlogin-yourname-ph": "نوم کاریاری تو نه وارد بكيد", @@ -353,6 +369,7 @@ "userlogin-signwithsecure": "د وصل بيئن امن استفاده كو", "yourdomainname": "پوشگیر شما:", "password-change-forbidden": "شما نتونید پاسوردیانه د ای ویکی آلشت بکید", + "externaldberror": "اشتوایی د ارتواط وا رسینه گا پیش اومائه یا ینه که شما اجازه وه هنگوم سازی حساو خارجی تونه ناریت.", "login": "اومائن", "nav-login-createaccount": " اومائن د سيستم/راس كردن حساو", "userlogin": " اومائن د سيستم/راس كردن حساو", @@ -400,7 +417,7 @@ "noname": "شما یه گل نوم کاروری خو ناریت", "loginsuccesstitle": "اومائن د سيستم موفق بی", "loginsuccess": "شما ایسه وارد بیته {{SITENAME}} د دعنوان \"$1\".'", - "nosuchuser": "چنی کاروری و نوم \"$1\" نئیش.\nنوم کاروری وه حرفیا حساس هئ.\nروشت نیسنن تونه وارسی بکید،یا [[ویجه:وامین اومائن کارور/ثوت نام کردن|یه گل حساو تازه راس بکید]].", + "nosuchuser": "چنی کاریاری و نوم \"$1\" نئیش.\nنوم کاریاری وه حرفیا حساس هئ.\nروشت نیسنن تونه وارسی بکید،یا [[ویجه:وامین اومائن کاریار/ثوت نام کردن|یه گل حساو تازه راس بکید]].", "nosuchusershort": "چنو کاروری وا ای نوم $1 نی ئیش.\nنیسنن تونه دوواره نئری بکیتو", "nouserspecified": "شما باید یه نوم کارور اختصاص بئیتو", "login-userblocked": "کارور قلف بیه.وامین اومائن اجازه نی ئن", @@ -411,18 +428,31 @@ "password-login-forbidden": "وه کار گرتن ای پاسوردو نوم کاروری ممنو بیه.", "mailmypassword": "د نۈ وارد كردن رمز", "passwordremindertitle": "پاسورد موقت تازه سی {{SITENAME}}", + "passwordremindertext": "یه نفر(شات خوتو،د تیرنشون آی پی $1) یه گل رازینه گواردن هنی سی {{نوم دیارگه}}($4) حاسته.یه گل رازینه گواردن موقتی سی کاریاری\"$2\" دروس بیه و د \"$3\" جاگر بیه. ار قصدتو یه بیه،شما واس ایسه روئیت وامین و یه گل رازینه گواردن هنی انتخاو بکید.\nرازینه گورادن موقتی د {{جمی:$5|یه رو|$5 رو}} تموم بوئه.\n\nار یه نفر هنی یه حاست داشتوئه،یا ار رازینه گورادن تونه د ویرتو اوما، و ار نحاستیت ونه آلشت بکیت، شما شایت د ای پیغوم تیه پوش بکیت و بحایت د وه کار بسن رازینه گواردن دماترتو دماداری بکیت.", "noemail": "هیچ نشونی ایمیلی سی کارور $1 ضفط نبیه.", "noemailcreate": "شما باید یه نشونی نومه معتور فراهم بکید", + "passwordsent": "یه گل پاسورد هنی سی تیرنشون انجانامه ای که \"$1\" واش ثوت نام کرده بی کل بیه.\nخواهش میکیم هنی رویئت وامین و اوسه بئریتش.", + "blocked-mailpassword": "نها آی پی شما سی ویرایشت گرته بیه، و", + "eauthentsent": "یه گل انجومانامه پشت راس کردنی د یه گل تیرنشون ویجه کل بیه.\nدما یه که یه گل انجومانامه هنی د حساو کل بوئه، شما واس دما رئنمونی نه د انجومانامه بئریت، سی یه که حساو شما راستکی پشت راست بوئه.", + "throttled-mailpassword": "یه گل پسورد دواره زنه بیه ایسه کل بیه، د آخری {{جمی:$1|ساعت|$1 ساعتیا}}.\nسی نهاگری د اذیت دئن،فقط یه گل رازینه گواردن د انجومانامه دواره زنه بیه د هر {{جمی:$1|ساعت|$1 ساعتیا}} کل بیه.", "mailerror": "خطا داره کل موئه:$1", + "acct_creation_throttle_hit": "سیل کریا ای ویکی د تیرنشون آی پی شما استفاده کردنه د روز دمایی {{جمی:$1|1 حساو|$1 حساویا}} نه دروس کردنه، و وه د بیشترونه صلا دئن د ای دوره گاتی انجوم بیه.\nد نتیجه، سیل کریایی که د ای تیرنشون آی پی استفاده کردنه نمی تونن حساویا بیشتری د ای گات دروس بکن.", "emailauthenticated": "نشونی انجومانامه تونه د $2 سی 3$ مئکم بیه.", + "emailnotauthenticated": "تیرنشون انجومانامه شما تا ایسه پشت راسگری نبیه.\nهنی انجومانامه ای سی چیا ری به نها کل نبیه.", + "noemailprefs": "یه گل تیرنشون انجومانامه د الویتیاتو سی یه که ای ویجه گیا کار بکن انتخاو بکیت.", "emailconfirmlink": "نشونی ايملتو نه محكم بكيد", + "invalidemailaddress": "تیرنشون انجومانامه حاستنی نئ شکل وه چوئه خوئی ناره.\nلطفن یه گل تیرنشون چوئه دار وارد بکیت یا ای رشنه گه نه حالی بنیت.", "cannotchangeemail": "نشونی ایمیل حساو نتونه د ای ویکی آلشت بوئه.", "emaildisabled": "ای مالگه نتونه ایمیل بفرسنه", "accountcreated": "حساو راس بی", + "accountcreatedtext": "حساو کاریاری سی [[{{ns:کاریار}}:$1|$1]] ([[{{ns:کاریار چک چنه}}:$1|چک چنه]]) دروس بیه.", "createaccount-title": "حساو راس کرده سی {{SITENAME}}", + "createaccount-text": "یه نفر وا تیرنشون انجونامه تو یه گل حساو راس کرده{{نوم دیارگه}} ($4) نومشه نیائه\"$2\", با پاسورد \"$3\".\nشما همی ایسه باید روئیت وامین و پاسوردتونه آلشت بکیت.\n\nار شما ای پیغوم نه وش التفات نکیت، د راس بیین ای حساو خطا دروس موئه.", "login-throttled": "شما ایسنی فره سی وامین اومائن تلاش کردیته.\n$1 لطفن سی تلاش هنی صبر بکید", "login-abort-generic": "اومائن وامین تو شکست حرد-شکست حرده", "loginlanguagelabel": "زون:$1", + "suspicious-userlogout": "درحاست وه در رئتن شما انکار بیه سی یه کل وه نظر میا که د یه گل دووارته نیئر گن یا یه گل پروکسی که ها د ویرگه نهو کل بیه", + "createacct-another-realname-tip": "نوم راستکی دل به حائه.\nار شما وه نه نهااماییه بکیت، یه سی هوم نسبت دئن وه کاریار سی کاریاش استفاده بوئه.", "pt-login": "وا مین اومائن", "pt-login-button": "وا مین اومائن", "pt-createaccount": "يه گل حساو راست بكيد", @@ -438,12 +468,22 @@ "retypenew": "رمز تازه نه دوواره بنیسید:", "resetpass_submit": "پاسور بنیت و وامین بیایت", "changepassword-success": "پاسورد شما وا موفقیت آلشت بی", + "changepassword-throttled": "شما ایسنی فره سی وامین اومائن تلاش کردیته.\n$1 لطفن سی تلاش هنی صبر بکید", "resetpass_forbidden": "پاسوردیا نتونن آلشت بوئن", "resetpass-no-info": "شما با بیایت د سیستم تا د ای بلگه دسرسی داشتویت", "resetpass-submit-loggedin": "پاسورد نه آلشت بكيت", "resetpass-submit-cancel": "انجوم شیوسن", + "resetpass-wrong-oldpass": "رازینه گواردن تازه یا موقتی نامعتور.\nشات شما ایسنی یا رازینه گواردن خوتونه د خوئی آلشت دئیته یا یه گل رازینه گواردن موقت هنی درحاست دئیته.", + "resetpass-recycled": "لطفن رازینه گواردن خوتونه سی چیا تر د رازینه گواردن ایسنی د نو زنه بکیت", + "resetpass-temp-emailed": "شما وا یه گل رازینه موقتی که انجوما گر بیه اومایته وامین.\nسی تموم کردن اومائن وامین، یه گل رازینه گواردن هنی د ایچه جاگر بکیت.", "resetpass-temp-password": "رمز موقت:", + "resetpass-abort-generic": "آلشت دئن رازینه گواردن وا یه گل فره پوش خرو بیه.", + "resetpass-expired": "رازینه گواردن شما منقضی بیه. لطفن یه گل رازینه گواردن هنی سی وامین اومائن جاگری بکیت.", + "resetpass-expired-soft": "رازینه گواردن شما منقضی بیه و واس د نو زنه با. لطفن یه گل رازینه هنی انتخاو بکیت، یا سی د نو زنه کردن د نهاتر د ایچه \"{{int:resetpass-submit-cancel}}\" بپورنیت.", + "resetpass-validity-soft": "زازینه گواردتون تو معتور نئ:$1\n\nلطفن یه گل رازینه گواردن هنی انتخاو بکیت، یا ری ایچه \"{{int:resetpass-submit-cancel}}\" سی د نو زنه کردن وه د نهاتر بپورنیت.", "passwordreset": "د نۈ وارد كردن رمز", + "passwordreset-text-one": "ای نوم بلگه نه سی گرتن یه گل رازینه گواردن موقتی وا انجومانامه پر بکیت.", + "passwordreset-text-many": "{{جمی:$1|یه گل د رشنه گه یا نه سی یه که رازینه گواردن موقتی وا انجومانامه گرته بوئه پر بکیت}}", "passwordreset-legend": "د نۈ وارد كردن رمز", "passwordreset-disabled": "نو کرد پاسورد د ای ویکی غیرفعال بیه.", "passwordreset-emaildisabled": "چی یا هنی ایمیل د ای ویکی غیرفعال بیه.", @@ -456,8 +496,10 @@ "passwordreset-emailelement": "نوم کاروری: $1\nپاسورد موقتی: $2", "passwordreset-emailsent": "پاسورد هنی سی ایمیل کل بیه.", "passwordreset-emailsent-capture": "پاسورد تازه تو د ایمیلتو که د هار نشو دئه بیه کل بیه", + "passwordreset-emailerror-capture": "رازینه گواردن د انجومانامه د نو زنه کننه راس بیه، و وه د هار دیاری می که، اما کل بیین وه د{{جنس:$2|کاریار}} شکست حرده:$1", "changeemail": "ایمیل تو نه آلشت بکید", "changeemail-header": "ایمیل حساوتونه آلشت بکید", + "changeemail-text": "ای نوم بلگه نه سی آلشت دئن تیرنشون انجومانامه تو پر بکیت. شما سی پشت راس کردن ای آلشت واس رازینه گواردن خوتونه وارد بکیت.", "changeemail-no-info": "شما با بیایت د سیستم تا د ای بلگه دسرسی داشتویت", "changeemail-oldemail": "نشونی ایمیل تازه باو:", "changeemail-newemail": "نشونی ایمیل تازه", @@ -465,11 +507,14 @@ "changeemail-password": "شما {{SITENAME}} پاسورد:", "changeemail-submit": "آلشت کردن ایمیل", "changeemail-cancel": "انجوم شیوسن", + "changeemail-throttled": "شما ایسنی فره سی وامین اومائن تلاش کردیته.\n$1 لطفن سی تلاش هنی صبر بکید.", "resettokens": "تازه کردن نشونه یا", + "resettokens-text": "شما سی صلا دئن دسرسی وه رسینه یا خصوصی که ها د حساو ایچنی تو می تونیت دیارگریا نه د نو زنه بکیت.\n\nشما اوسنی واس ای کار بکیت که رسینه یا شما سی یه کسی تر بئر بیه یا د حساو شما چل بیه.", "resettokens-no-tokens": "هیژ نشونه ای سی تازه کردن نئ.", "resettokens-legend": "تازه کردن نشونه یا", "resettokens-tokens": "نشونه یا:", "resettokens-token-label": "$1 (ارزشت تازه: $2)", + "resettokens-watchlist-token": "دیارگر سی حردنی تورگه(اتم/آر اس اس) سی [[ویجه:سیل برگ|آلشت دئن بلگه یا د سیل برگتو]]", "resettokens-done": "نشونه یا تازه بیه.", "resettokens-resetbutton": "نشونه یا انتخاو بیه تازه بوئن", "bold_sample": "متن توپر بيه", @@ -496,28 +541,51 @@ "preview": "پيش سيل", "showpreview": "پيش نمائش نشون بيئه", "showdiff": "آلشتيانه نشون بيئه", + "blankarticle": "زنئار: بلگه ای که شما دروس کردیته حالیه.\nار شما د نو ری \"{{int:savearticle}}\" بپورنیت, بلگه وه شکل که هیچ مینونه ای دش نبا دروس بوئه.", "anoneditwarning": "زنهار شما وامین نیومایته.\nنشونی آی پی تو د ویرگار ویرایشت ای بلگه ضفط بوئه", + "anonpreviewwarning": "شما نیومائته وامین. تیرنشون آی پی شما د ویرگار ویرایشت ای بلگه اماییه بوئه.", + "missingsummary": "د ویر ونا: شما هنی یه گل چکسته ویرایشتی نها اماییه نکردیته.\nار شما د نو د ری\"{{int:savearticle}}\" بپورنیت, ویرایشت شما حالی اماییه بوئه.", "missingcommenttext": "لطفن د ایچه نظر بیئتو", + "missingcommentheader": "د ویر ونا: شما هنی یه گل موضوع/سرخط سی ای ویر و باور نها اماییه نکردیته.\nار شما د نو د ری\"{{int:savearticle}}\" بپورنیت, ویرایشت شما حالی اماییه بوئه.", "summary-preview": "چکسته پیش سیل:", "subject-preview": "پیش سیل موضو سرخط", "blockedtitle": "كارور قلف بيه", + "blockedtext": "نوم کاریاری شما یا تیرنشون آی پی شما قلف بیه.\n\n\n$1 ونه قلف کرده.\nدلیل ها د ایچه$2.\n\nشرو د قلف بیین:$8\nآخر قلف بیین:$6\nکاریار ورتیه قلف بیه:$7\n\nشما می تونیت وا $1 یا [[{{MediaWiki:Grouppage-sysop}}|دیووندار]] هنی پیوند بئریت و سی قلف کردن چک چنه بزنیت.\nالوت د ویر داشتویت که شما نمی تونیت د خصوصیت انجومانامه کل کردن سی ای کاربر استفاده بکیت مئر یه گل تیرنشون انجومانامه معتور د [[Special:Preferences|ترجیحیا کاریاری]] خوتو معلوم کرده بویت و باید امکان وه کار بستن وه نه داشتویتو\nتیرنشون آی پی ایسنی شما $3 ئه، و نوم دیارکن قلف کردن #$5 ئه.\nلطفا همه جزئیات نه د هر حاسته ای که داریت بوئیت.", + "autoblockedtext": "نوم کاریاری شما یا تیرنشون آی پی شما سی یه که یه گل کاریاری هنی وه کارش بسته خودانجومن قلف بیه $1 ونه قلف کرده.\nدلیل ها د ایچه\n\n:$2.\n\nشرو د قلف بیین:$8\nآخر قلف بیین:$6\nکاریار ورتیه قلف بیه:$7\n\nشما می تونیت وا $1 یا [[{{MediaWiki:Grouppage-sysop}}|دیووندار]] هنی پیوند بئریت و سی قلف کردن چک چنه بزنیت.\n\nالوت د ویر داشتویت که شما نمی تونیت د خصوصیت انجومانامه کل کردن سی ای کاربر استفاده بکیت مئر یه گل تیرنشون انجومانامه معتور د [[Special:Preferences|ترجیحیا کاریاری]] خوتو معلوم کرده بویت و باید امکان وه کار بستن وه نه داشتویت.\n\nتیرنشون آی پی ایسنی شما $3 ئه، و نوم دیارکن قلف کردن #$5 ئه.\nلطفا همه جزئیات نه د هر حاسته ای که داریت بوئیت.", "blockednoreason": "هیژ دلیلی دئه نبیه", "whitelistedittext": "شما باید $1 سی ویرایشت بلگیا", + "confirmedittext": "شما واس دما ویرایشت کردن بلگه یا تیرنشون انجومانامه تونه پشت راس بکیت.\nلطفا یه گل تیرنشون خو سی [[Special:اولویتیا|اولویتیا کاریار]] بنیت.", "nosuchsectiontitle": "نبوئه بشخ پیدا بوئه", + "nosuchsectiontext": "شما سی ویرایشت کردن جایی که وجود ناره تلاش کردیته.\nشات وه اوسه که شما بلگه نه می دیئته جا وه جا بیه یا پاکسا بیه.", "loginreqtitle": "وامین اومائن لازمه", "loginreqlink": "اومائن", "loginreqpagetext": "$1 لطف بکید بلگه یا هنی نه بوینیت", "accmailtitle": "پاسورد کل بی", + "accmailtext": "یه گل رازینه گواردن شامسکی سی[[چک چنه کاریار:$1|$1]] سی $2 کل بیه.بوئه وه نه د گات وه کار بستن بلگه اومائن وامین د [[Special:آلشت دئن رازینه گواردن|آلشت دئن رازینه گواردن]] آلشت دئه بوئه.", "newarticle": "تازه", "newarticletext": "شما وادما هوم پیوندی هئیت که وجود ناره.\nسی راس کردن بلگه.شرو د نیسنن مئن جعوه هاری بکید(سیل[$1 ] سی دونسمنی بیشتر بکید).\nار شما سی اشتوا کردن هایئن ایچه، دگمه وادما رئتن مرورگر تونه بپورنیت.", + "anontalkpagetext": "----", "noarticletext": "د تازه یا د ای بلگه متن نی.\nشما تونید د[[Special:Search/{{PAGENAME}}|search for this page title]] بگردید د ای بلگه یا د بلگیا هنی یا[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} د هنی پی جوری بوئه logs] \n [{{fullurl:{{FULLPAGENAME}}|action=edit}} یای ای بلگه نه ویرایشت بکیدpage].", "noarticletext-nopermission": "د تازه یا د ای بلگه متن نی.\nشما تونید د[[Special:Search/{{PAGENAME}}|search for this page title]] بگردید د ای بلگه یا د بلگیا هنی یا[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} د هنی پی جوری بوئه logs] اما شما حق ناریتو ای بلگه نه راس بکیت", + "missing-revision": "وانئیری #$1 د بلگه ای که نومش ونه \"{{FULLPAGENAME}}\" وجود ناره.\n\nشایت بانی جاونه وه وا یه گل ویرگار وه هنگوم نبیه که د یه گل بلگه پاکسا بیه هوم پیوند بیه بوئه.\nشایت جزئیات د [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] پیدا بوئن.", + "userpage-userdoesnotexist": "حساو کاریاری\"$1\" ثوت نام نبیه.\nار میهایت ای بلگه نه بسازیتو یا ویرایشت بکیت یه گل وارسی انجوم بئیت.", "userpage-userdoesnotexist-view": "حساو کارور\"$1\" ثوت نبیه.", "blocked-notice-logextract": "ای کارور ایسنی دسرسی ناره.\nآخری نشون قلف ورودی د هار ایچه سی سرچشمه آماده بیه:", + "clearyourcache": "توجه داشتویت: نها اماییه کاری, شات مژبور وه وه کار ونن ویرگه نهو دوارته نیئر خوتو سی دیئن ای آلشتیا بوئیت .\n* فایرفاکس/ سفری: بپورنیت ریشیفت اوسه که می پورنیتد نو سوار بوئهیا هنی ری Ctrl-F5 بپورنیت یاCtrl-R (⌘-R د سامونه مک)\n* گوگل کروم:بپورنیت ری Ctrl-Shift-R (⌘-Shift-R یا د سامونه)\n* اینترنت اکسپلورر: Ctrl واداریت اوسه که می پورنیت ری Refresh, یل بپورنیت ریCtrl-F5\n* اوپرا: ویرگه نهو نه د اوزاریا→ اولویتیا پاک بکیت", + "usercssyoucanpreview": "نکته: د دگمه \"{{int:showpreview}}\" سی آزماشت کردن سی اس اس تازه دما اماییه کاری استفاده بکیت .", + "userjsyoucanpreview": "نکته: د دگمه \"{{int:showpreview}}\" سی آزماشت کردن دما اماییه کاری جاوا اسکریپت تازه استفاده بکیت .", + "usercsspreview": "د ویر داشتوئیت که شما فقط می تونیت سی اس اس کاریاری تونه پیش سیل بکیت. وه د ایسنی هنی اماییه نبیه!", + "userjspreview": "د ویر داشتوئیت که شما فقط می تونیت جاوا اسکریپت کاریاری تونه پیش سیل بکیت. وه د ایسنی هنی اماییه نبیه!", + "sitecsspreview": "د ویر داشتوئیت که شما فقط می تونیت ای سی اس اس نه فقط پیش سیل بکیت. وه د ایسنی هنی اماییه نبیه!", + "sitejspreview": "د ویر داشتوئیت که شما فقط می تونیت ای ای جاوا اسکریپت نه فقط پیش سیل بکیت. وه د ایسنی هنی اماییه نبیه!", + "userinvalidcssjstitle": "زئنار: پوسه \"$1\" نیئش.\nسی اس اس جاونه و بلگه یا جاوا اسکریپت سرون وا حرف کؤچک نه وه کار بسته، همچنو{{ns:کاریار}}:فو/وکتور.سی اس اس چی د ضد{{ns:کاریار}}:فو/وکتور. سی اس اسه.", "updated": "(تازه بيه)", "note": "'''نيسنن:'''", "previewnote": "فقط ای پیش سیل د ویرتو با.\nآلشتیاتو هنی اماییه نبیه.", "continue-editing": "رو د راساگه ویرایشت", + "previewconflict": "ورگشت پیش سیل د نیسسه د راساگه وارو ویرایشت چی شکل دیار بیین بوئه ار شما وه نه سی اماییه کردن انتخاو بکیت.", + "session_fail_preview": "د بدبختی ما سی یه که رسینه یا جلسه مونه د دس دئیمه نمی تونیم کار پردازشت ویرایشت شمانه انجوم بیئمو.\nلطفن هنی تلاش بکیت.\nار هنی کار وه دروس کار نکرد،[[Special:UserLogout|اومائن وه در]] نه ازمایشت بکیت و د نو بیایت وامین.", + "session_fail_preview_html": "د بدبختی ما سی یه که رسینه یا جلسه مونه د دس دئیمه نمی تونیم کار پردازشت ویرایشت شمانه انجوم بیئمو.\nلطفن هنی تلاش بکیت.\n\nسی یه که {{نوم دیارگه}} یه گل ردیف اچ تی ام ال کنشتگر بیه داره، پیش سیل سی یه که د دس حمله یا جاوا اسکریپ د امون با قام کرده بیه..\n\nار وه گات قانونی تلاش سی ویرایشته،لطفا د نو تلاش بکیت.\nار هنی کار وه دروس کار نکرد،[[Special:UserLogout|اومائن وه در]] نه ازمایشت بکیت و د نو بیایت وامین.", "editing": "د حالت ويرايشت$1", "creating": "راس كردن $1", "editingsection": "د حال ویرایشت$1(بشخ)", @@ -526,14 +594,15 @@ "explainconflict": "داوسه که شما شرو د ویرایشت ای بلگه کردیته، یه نفر هنی ای بلگه نه آلشت دئه.\nراساگه روئی متن بلگه متن نه چی یه که وجود داشتوه د ور میئره.\nآلشتیا شما د متن هاری نشو دئه هئ.\nشما با آلشتیاتونه د متن که هئش یکی بکید.\nفقط متنی که ها د رو د وختی که شما\"{{رقم:ذخیره گوتار}}\" نه گزارشت می کید اماییه بوئه", "yourtext": "متن شما", "storedversion": "دوواره دیئن انبار بیه.", + "editingold": "زئنار:شما داریت یه گل وانئری نا به هنگوم بیه نه سی ای بلگه ویرایشت می کید\nار شما ونه اماییه بکیت،هر آلشتی که د اول سی ای وانئری انجوم بیه گم بوئه.", "yourdiff": "فرخيا", - "templatesused": "{{جمی:$1|قالو|قالویا}}د ای بلگه استفاده بیه:", - "templatesusedpreview": "{{جمی:$1|قالو|قالویا}}استفاده بیه د ای پیش سیل:", - "templatesusedsection": "{{جمی:$1|قالو|قالویا}} استفاده بیه د ای بخش:", + "templatesused": "{{جمی:$1|چوئه|چوئه یا}}د ای بلگه استفاده بیه:", + "templatesusedpreview": "{{جمی:$1|چوئه|چوئه یا}}استفاده بیه د ای پیش سیل:", + "templatesusedsection": "{{جمی:$1|چوئه|چوئه یا}} استفاده بیه د ای بخش:", "template-protected": "(حمايت بيه)", "template-semiprotected": "(نيم-حفاظت بيه)", "hiddencategories": "ای بلگه يه اندوم د{{PLURAL:$1|1 hidden category|$1 hidden categories}}: هئ", - "nocreatetext": "{{نوم مالگه}} سی راس کردن بلگه یا تازه محدود بیه.\nشما تونید روئیت وادما و بلگه ای که هئیش ویرایشت بکید ، یا [[ویجه:وامین اومائن کارور|بیایت وامین یا یه گل حساو بسازیت]].", + "nocreatetext": "{{نوم مالگه}} سی راس کردن بلگه یا تازه محدود بیه.\nشما تونید روئیت وادما و بلگه ای که هئیش ویرایشت بکید ، یا [[ویجه:وامین اومائن کاریار|بیایت وامین یا یه گل حساو بسازیت]].", "nocreate-loggedin": "شما حق ناریت که بلگه یا تازه نه راس بکید.", "sectioneditnotsupported-title": "ویرایشت بخش حمایت نبوئه", "sectioneditnotsupported-text": "ویرایشت بشقی د ای بلگه نئیش.", @@ -543,23 +612,40 @@ "recreate-moveddeleted-warn": "'''زنهار شما بلگه ای که وادما پاکسا بیه هنی راس کردیته'''\nشما باید دونسه بایت که آیا هنی سی نها گرتن ویرایشت ای بلگه خوئه.\nپاکسا بیئن و جمشت سی ای بلگه سی راحتی تو فراهم بیه:", "moveddeleted-notice": "ای بلگه پاک بیه.\nپاک بین و جمشت ای بلگه سی سرچشمه دئین فراهم بیه", "log-fulllog": "دیئن همه پهرستنومه یا", + "edit-hook-aborted": "ویرایشت وا قلاو جلوگری بیه.\nهیچ توضیئ سیش نئ.", + "edit-gone-missing": "نبوئه ای بلگه نه وه هنگوم بکیت.\nوه نظر میا که وه پاکسا بیه.", "edit-conflict": "مخالفت نه ویرایشت بکید", + "edit-no-change": "سی یه که آلشتیا د یه گل نیسسه دروس بیه د ویرایشت شما تیه پوشی بیه.", + "postedit-confirmation-created": "بلگه دروس بیه.", + "postedit-confirmation-restored": "بلگه د نو اماییه بیه.", "postedit-confirmation-saved": "ویرایشتتو اماییه بی", "edit-already-exists": "نبوئه یه گل بلگه تازه راس بکید.\nوه هئیش.", "defaultmessagetext": "متن پیغوم پیش فرض", "content-failed-to-parse": "د یک تیچیسن چیا مئن $2 د مدل $1:$3", "invalid-content-data": "دنسمنی مینونه نامعتور", "content-not-allowed-here": " مینونه\"$1\" سی بلگه [[$2]] اجازه نه دئه بیه", + "editwarning-warning": "ار ای بلگه نه ول بکیت هر آلشتی که دئیته پاک بوئه.\nار شما هاییت وا مین،شما می تونیت ای زئنار نه د \"{{int:prefs-editing}}\" که ها د بخش اولویتیا شما ناکشتگر بکیت.", "editpage-notsupportedcontentformat-title": "شلک مینونه دماگری نبیه", + "editpage-notsupportedcontentformat-text": "وضع و بار مینونه $1 د مدل مینونه $2 حامین نبوئه.", "content-model-wikitext": "ويكی متن", "content-model-text": "متن ساده", "content-model-javascript": "جاوا اسكريپت", "content-model-css": "سی اس اس", + "expensive-parserfunction-category": "بلگه یایی که واحونی پیوندگر خطا گرون فره ای ها دشو", "post-expand-template-inclusion-warning": "زنئار قالو شومل انازه ای یه که فره گپه.پاره ای د قالویا نه د بر نگره", "post-expand-template-inclusion-category": "بلگیا شومل قالوی ین که انازش د حد اومائه وه در", "post-expand-template-argument-warning": "زنهار ای بلگه شومل حداقل یه قالو سی چک چنه یه که انازه فره گپه.\nگپسنیا پاک بینه.", "post-expand-template-argument-category": "بلگه شومل قالو چک چنیا د بین رئته", "parser-template-loop-warning": "حلقه قالو کشف بیه:[[$1]]", + "parser-template-recursion-depth-warning": "محدودیت پی یا ورئشتن چوئه رد بی($1)", + "language-converter-depth-warning": "محدودیت پی یا زون والرن رد بی($1)", + "node-count-exceeded-category": "بلگه یا که د بیشرونه شماره گرو فره پئشکرد کردنه", + "node-count-exceeded-category-desc": "زیردسه سی بلگه یایی که د ونو اشمارنه فره پئشکرد کرده.", + "node-count-exceeded-warning": "بلگه د بیشترونه شماره گرو فره پئشکرد کرد", + "expansion-depth-exceeded-category": "بلگه یایی که د بیشترونه پی یا ووله کردن فره پئشکرد کردنه", + "expansion-depth-exceeded-category-desc": "زیر دسه سی بلگه یایی که د ونو پی یا ووله بیین فره پئشکرد کرده.", + "expansion-depth-exceeded-warning": "بلگه د پی یا ووله بیین پئشکرد کرد", + "parser-unstrip-loop-warning": "گردوله د فرمونه Unstrip پیدا بیه", "cantcreateaccounttitle": "نبوئه حساو راس بکید", "viewpagelogs": "سی ای بلگه بوینتو.", "nohistory": "هیچ ویرگار ویرایشتی د ای بلگه نئ.", @@ -653,6 +739,8 @@ "searchresults": "نتيجه يا پی جوری", "searchresults-title": "نتيجه يا پی جوری سی \"$1\"", "titlematches": "عنوان بلگه مطاوقت داره", + "textmatches": "هومسازی نیسسه بلگه.", + "notextmatches": "نیسسه بلگه هومسازی ناره", "prevn": "وادما {{PLURAL:$1|$1}}", "nextn": "نيايی {{PLURAL:$1|$1}}", "prevn-title": "پيشتر $1 {{PLURAL:$1|نتيجه|نتيجيا}}", @@ -669,7 +757,7 @@ "searchprofile-images-tooltip": "بگرد سی فايليا", "searchprofile-everything-tooltip": "همه محتوا نه پی جوری كو (شاملا بلگيا چك چنه)", "searchprofile-advanced-tooltip": "نوم جايا نوم ديار بگرد", - "search-result-size": "$1 ({{جمی:$2|بی واچه يل|واچه تكی|واچه يل|$2 واچه يل|$2 واچه}})", + "search-result-size": "$1 ({{جمی:$2|1 کلیمه|$2 کلیمه یا}})", "search-result-category-size": "{{جمی:$1|1 اندوم|$1 اندومیا}} ({{جمی:$2|1 زیردسه|$2 زیردسه یا}}, {{جمی:$3|1 جانیا|$3 جانیایا}}", "search-redirect": "(ورگشتن $1)", "search-section": "(بشق $1)", @@ -700,6 +788,7 @@ "prefs-rc": "آلشتیا تازه باو", "prefs-watchlist": "سیل برگ", "prefs-watchlist-days": "روزیا نه د سیل برگ نشو دئه بو:", + "prefs-watchlist-days-max": "$1 بیشترونه {{جمی:$1|روز|روزیا}}", "prefs-watchlist-edits-max": "شماره بیشترونه:1000", "prefs-misc": "شيوسن", "prefs-resetpass": "پاسورد نه آلشت بكيت", @@ -715,11 +804,13 @@ "stub-threshold-disabled": "د كار ونن", "recentchangesdays": "روزیا آلشتیا تازه باو نه نشو بیه:", "recentchangesdays-max": "$1 بیشترونه {{جمی:$1|روز|روزیا}}", + "recentchangescount": "انازه ویرایشتیایی که دیاری می که:", "prefs-help-recentchangescount": "یه شامل آلشتیا تازه،ویرگاریا بلگه و پهرستنومه یا هئ.", "savedprefs": "ویجه گیا هنی تو اماییه بیه.", "timezonelegend": "وخت راساگه", "localtime": "وخت ولاتی:", "timezoneuseserverdefault": "وخت راساگه", + "timezoneuseoffset": "هنی", "servertime": "وخت سرور:", "guesstimezone": "وا جاگرد پر بوئه", "timezoneregion-africa": "افرقا", @@ -761,6 +852,7 @@ "prefs-i18n": "جهون ولاتمنی", "prefs-signature": "امضا", "prefs-dateformat": "شلک وخت", + "prefs-timeoffset": "جا وه جایی زمونی", "prefs-advancedediting": "گزینه یا عمومی", "prefs-editor": "ويرايشتگر", "prefs-preview": "پیش سیل", @@ -770,9 +862,11 @@ "prefs-advancedwatchlist": "گزینه یا پیشکرده", "prefs-displayrc": "گزینه یا نه نشو بیه", "prefs-displaywatchlist": "گزینه یا نه نشو بیه", + "prefs-tokenwatchlist": "نشو", "prefs-diffs": "فرخیا", "email-address-validity-valid": "نشونی ایمیل دیار بیه خوئه", "email-address-validity-invalid": "یه گل نشونی ایمیل خو وارد بکید", + "userrights": "حقوق دیوونداری کاریار", "userrights-lookup-user": "دسه یا کاروری نه دیوون داری بکیت", "userrights-user-editname": "نوم كاروری ته وارد كو", "editusergroup": "ویرایشت گرویا کاروری", @@ -793,28 +887,36 @@ "group-bureaucrat": "بروکراتیا", "group-all": "(همه)", "group-user-member": "{{جنس:$1|کارور}}", + "group-autoconfirmed-member": "{{جنس:$1|کاریار خودانجومکار}}", "group-bot-member": "{{حنس:$1|بوت}}", "group-sysop-member": "{{جنس:$1|مدیر}}", "group-bureaucrat-member": "{{جنس:$1|بروکرات}}", "grouppage-user": "{{ns:project}}:کاروریا", + "grouppage-autoconfirmed": "{{ns:project}}:کاریار خودانجومکار", "grouppage-bot": "{{ns:project}}:بوت یا", + "grouppage-sysop": "{{ns:project}}:دیوونداریا", "grouppage-bureaucrat": "{{ns:project}}:دیوونداریا", "right-read": "حنن بلگیا", "right-edit": "ویرایشت بلگیا", + "right-createpage": "بلگه یا نه راس بکیت(ونو که دشو بلگه یا چک چنه نئ)", "right-createtalk": "بلگه یا چک چنه نه راس بکید", "right-createaccount": "یه گل حساو کاروری تازه راس بکیت", "right-move": "بلگه یا جا وه جا کو", "right-move-subpages": "بلگه یا و زیر بلگه یا شونه جا وه جا کو", "right-move-rootuserpages": "بلگه یا ریشه ای کارور نه جا وه جا کو", + "right-move-categorypages": "دسه بلگه یا نه جا وه جا بکیت", "right-movefile": "فایلیا نه جا وه جا کو", "right-suppressredirect": "اوسه که بلگه یا د بین رئتنه هیچ واگردونی سی بلگه یا سرچشمه دروس نبیه", "right-upload": "سوار کردن فايلا", "right-upload_by_url": "سوار کرد فایلیا د یو آر ال", "right-writeapi": "د نیسنن ای پی آی استفاده بکید", "right-delete": "بلگیا نه پاکسا کو", + "right-bigdelete": "بلگه یایی که ویرگار گپی دارن پاکسا بکیت", "right-browsearchive": "بلگه یا پاک بیه نه پی جوری کو", "right-undelete": "ای بلگه نه حذف نكيد", "right-suppressionlog": "دیئن پهرستنومه یا خصوصی", + "right-block": "کاریاریا هنی د ویرایشت منع بوئن", + "right-blockemail": "کاریار نه د کل کردن انجومانامه منع کو", "right-unblockself": "خوشه قلف نکید", "right-editinterface": "راوط کارور نه ویرایشت کو", "right-editusercssjs": "فایلیا جاوا اسکریپت و سی اس اس کاروریا هنی نه ویرایشت کو", @@ -825,6 +927,7 @@ "right-viewmywatchlist": "سیل برگ خوتونه بوینیت", "right-viewmyprivateinfo": "دونسمنیا شصقی خوتونه بوینیت(چی نشونی ایمیل،نوم راستکی)", "right-editmyprivateinfo": "دونسمنیا شصقی خوتونه ویرایشت بکید(چی نشونی ایمیل،نوم راستکی)", + "right-editmyoptions": "اولویتیا تونه ویرایشت بکیت", "right-importupload": "دئن بلگه یا د یه گل جانیا سوار بیه", "right-unwatchedpages": "دیئن نوم گه بلگه یا دیئه نبیه", "right-userrights": "حقوق همه کاروریانه ویرایشت بکید", @@ -840,6 +943,7 @@ "action-createpage": "راس کردن بلگیا", "action-createtalk": "بلگه یا چک چنه نه راس بکید", "action-createaccount": "حساو ای کارور نه راس بکید", + "action-history": "ویرگار ای بلگه نه بوینیت", "action-minoredit": "ای ویرایشت نه چی یه حیرده ویرایشت نشو بیئت", "action-move": "لی بلگه جا وه جا کو", "action-move-subpages": "ای بلگه و زیر بلگه یاشه جا وه جا بکید", @@ -877,6 +981,7 @@ "recentchanges-label-minor": "يه ويرايشت كؤچكيه", "recentchanges-label-bot": "ای ويرايشت نه يه بوت انجوم ديئه", "recentchanges-label-unpatrolled": "ای ويرايشت هنی تيه واداشت نبيه", + "recentchanges-label-plusminus": "انازه بلگه وه شمار ای بایتیا آلشت کرده.", "recentchanges-legend-heading": "'''میراث:'''", "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنو بوینیت [[ویجه:بلگیا تازه|نوم گه بلگیا تازه]])", "rcnotefrom": "د هار آلشتیا د $2 هیئن(د بال د $1 نشون دئه بیه)", @@ -928,6 +1033,9 @@ "uploadnologin": "وارد نبیه", "uploadnologintext": "لطفن $1 سی سوارکرد جانیایا.", "uploaderror": "خطا د سوار کردن", + "upload-permitted": "جورا جانیا مجاز:$1.", + "upload-preferred": "جورا جانیا مجاز:$1.", + "upload-prohibited": "جورا جانیا مجاز:$1.", "uploadlogpage": "سوارکرد", "filename": "نوم فایل", "filedesc": "چكسته", @@ -936,44 +1044,60 @@ "filestatus": "حال و بال کپی رایت", "filesource": "سرچشمه:", "ignorewarnings": "د هر زنهار تیه پوشی کو", + "filename-toolong": "نوم جانیا شایت گپتر د 240 بایت نبا.", "badfilename": "نوم جانیا د \"$1\" آلشت بیه.", "empty-file": "فایلی که دئی ته حالی بیه.", "file-too-large": "فایلی که دئی ته فره گپ بی.", "filename-tooshort": "نوم فایل فره کؤچکه.", + "filetype-banned": "چنی جانیا قدقه بیه.", "illegal-filename": "نوم فایل اجاره ندئه بیه.", "unknown-error": "یه گل خطا نادیار ری ون کرده.", + "tmp-create-error": "نبوئه جانیا موقتی نه راس بکیتو.", + "tmp-write-error": "خطا د نیسنن جانیا موقتی.", + "uploadwarning": "هشدار سوارکرد", "savefile": "جانیا نه اماییه کو", - "uploadedimage": "سوارکرد\"[[$1]]\"", - "overwroteimage": "یه گل نسقه تازه د \"[[$1]]\" سوار بیه", "uploaddisabled": "سوار کردن د کار نئ.", "copyuploaddisabled": "سوار کردن وا یو آر ال د کار نئ.", "uploaddisabledtext": "سوار کرد فایلیا د کار نئ.", "uploadinvalidxml": "ایکس ام الی که سوار بیه نبوئه نوتیج با.", + "uploadvirus": "د ای جانیا ویروس هئ!\nجزیات:$1", "upload-source": "سرچشمه فایل", "sourcefilename": "سرچشمه نوم جانیا:", "sourceurl": "سرچشمه يو آر ال:", "destfilename": "نوم فایل مقصد:", + "upload-maxfilesize": "بیشترونه انازه جانیا:$1", "watchthisupload": "ای جانیا نه بوینیت", "upload-success-subj": "سوار کرد خوش سرانجوم", "upload-success-msg": "سوارکرد شما سی [$2] خوو بی.وه د ایچه هئش:[[:{{ns:file}}:$1]]", "upload-failure-subj": "مشگل د سوارکردن", "upload-failure-msg": "یه گل مشلگل د سوارکردتو سی [$2] بی:$1", + "upload-warning-subj": "هشدار سوارکرد", "upload-proto-error": "پروتکل نادروس", "upload-file-error": "خطا مینونه", "upload-misc-error": "خطا سوار کرد ناشناخته", "upload-too-many-redirects": "ای یو آر ال د ورگیرنه واگردونیا فرئی هئ", + "upload-http-error": "یه گل خطا اچ تی تی پی پیش اومائه:$1", "upload-copy-upload-invalid-domain": "ورداشتن سوارکردیا د ای پوشگئر د دسرس نئ.", "backend-fail-notexists": "فایل $1 وجود ناره.", + "backend-fail-invalidpath": "\"$1\" ره خوئی سی امائیه کردن نئ.", "backend-fail-delete": "نبوئه جانیا $1 پاکسا بوئه", "backend-fail-describe": "نبوئه گپ دونسمنیا سی جانیا\"$1\" آلشت بوئه.", + "backend-fail-alreadyexists": "جانیا \"$1\" ایسه هیئش.", "backend-fail-store": "نبوئه جانیا \"$1\" د \"$2\" امبار بوئه.", + "backend-fail-copy": "نبوئه جانیا $1 د $2 ورداشته بوئه", "backend-fail-move": "نبوئه جانیا \"$1\" د \"$2\" جا وه جا بوئه", "backend-fail-opentemp": "نبوئه جانیا موقتی وا بوئه.", "backend-fail-writetemp": "نبوئه د جانیا موقتی چی بنیسیت.", + "backend-fail-closetemp": "نبوئه جانیا موقتی بسته با.", "backend-fail-read": "نبوئه جانیا\"$1\" حنه بوئه.", + "backend-fail-create": "نبوئه د جانیا\"$1\" نوشته با.", "lockmanager-fail-closelock": "نبوئه قلف جانیا سی \"$1\" بسه بوئه.", "lockmanager-fail-openlock": "نبوئه قلف جانیا سی \"$1\" وا بوئه.", + "uploadstash": "اماییه جا سوارکرد", + "uploadstash-clear": "پاک کردن جانیایا اماییه بیه", + "uploadstash-nofiles": "شما هیژ جانیا اماییه بیه ای ناریت.", "uploadstash-refresh": "نومه گه جانیایا نه د نو تازه کو", + "invalid-chunk-offset": "جا وه جایی نامعتور برشت", "img-auth-accessdenied": "دسرسی منع بی", "img-auth-nofile": "فایل $1 وجود ناره.", "http-invalid-url": "یو آر ال نامعتور:$1", @@ -984,7 +1108,7 @@ "license-header": "د شكل ليسانس دار بيئن", "nolicense": "هیچی انتخاو نبیه", "license-nopreview": "(پیش سیل د دسرس نئ)", - "upload_source_file": "(یه گل فایل د انجومیار تو)", + "upload_source_file": "(یه گل جانیا د انجومیار تو انتخاو بکیت)", "listfiles-delete": "پاکسا کردن", "listfiles-summary": "ای بلگه یا ویجه همه جانیایا سوار بیه نه نشو می ئین.", "listfiles_search_for": "پی جوری سی نوم رسانه:", @@ -1018,13 +1142,15 @@ "imagelinks": "استفاده د فايل", "linkstoimage": "دمال بيه {{PLURAL:$1|ديس ونيا بلگه|$1 ديس ون بلگيا}} دای فایل:", "nolinkstoimage": "ایچه هیژ بلگه ای سی هوم پیوند بیئن وا ای فایل نی", - "morelinkstoimage": " [[ویجه:چه هوم پیوندی ها ایچه/$1|هوم پیوندیا هنی]]سی ای فایل بونیت.", + "morelinkstoimage": " [[ویجه:چه هوم پیوندی ها ایچه/$1|هوم پیوندیا هنی]]سی ای جانیا نه بونیت.", "linkstoimage-redirect": "$1 (واگردونی جانیا) $2", "sharedupload": "ای جانیا که د $1 هئ شایت د پروجه یا هنی استفاده بیه.", "sharedupload-desc-here": "فایلی که د $1 شایت د مئن پروجیا هنی استفاده بیه.\nتوضی دباره[$2 file description page] د هار نشو دئئه بیه", "filepage-nofile": "چنو فایلی وا ای نوم نئ.", "uploadnewversion-linktext": "یه گل نسقه تازه د ای جانیا سوار بکید", "shared-repo-from": "د $1", + "filerevert": "د سرگرتن سی $1", + "filerevert-legend": "د سرگرتن جانیا", "filerevert-comment": "دليل:", "filerevert-submit": "ورگنین", "filedelete": "$1 پاکسا کو", @@ -1069,21 +1195,25 @@ "doubleredirects": "واگردونیا دوتایی", "double-redirect-fixed-move": "[[$1]]جا وه جا بیه .\nوه خودکارونه وه روز بیه و ایسه وه د[[$2]] واگردونی بیه.", "double-redirect-fixer": "تعمیر کننه واگردونی", + "brokenredirects": "واگردونیا بی سرانجوم", "brokenredirectstext": "واگردونیا نهاتر د بلگه یایی که وجود نارن هوم پیوند بینه.", "brokenredirects-edit": "ویرایشت", "brokenredirects-delete": "پاكسا كردن", "withoutinterwiki": "بلگه یایی که هوم پیوند زون نارن", "withoutinterwiki-legend": "پیشون", "withoutinterwiki-submit": "نشون دائن", - "nbytes": "$1{{جمی:$1|كلی|بايت|بايت}}", - "ncategories": "{{جمی:$1|دسه|دسه يا}}", + "fewestrevisions": "بلگه یایی که کمتری وانئری نه دارن", + "nbytes": "$1{{جمی:$1|بايت|بایتیا}}", + "ncategories": "$1{{جمی:$1|دسه|دسه يا}}", "ninterwikis": "$1 {{جمی:$1|مئن ویکی|مئن ویکیا}}", "nlinks": "$1 {{جمی:$1|هوم پیوند|هوم پیوندیا}}", "nmembers": "$1 {{PLURAL:$1|اندوم|اندوميا}}", "nmemberschanged": "$1 → $2 {{جمی:$2|اندوم|اندومیا}}", + "nrevisions": "$1 {{جمس:$1|وانئری|وانئریا}}", "nviews": "$1 {{جمی:$1|دیئن|دیئنیا}}", "nimagelinks": "$1 {{جمی:$1|بلگه|بلگيا}} استفاده بیه", "ntransclusions": "$1 {{جمی:$1|بلگه|بلگيا}} استفاده بیه", + "specialpage-empty": "نتیجه ای د ای گزارشت نئ.", "lonelypages": "بلگه یا تک منه", "uncategorizedpages": "بلگه یا دسه بنی نبیه", "uncategorizedcategories": "دسه یا دسه بنی نبیه", @@ -1098,15 +1228,18 @@ "wantedtemplates": "قالویا حاستنی", "mostlinked": "بلگه یا که بیشتر هوم پیوند بینه", "mostlinkedcategories": "دسه یایی که بیشتر هوم پیوند بیه", - "mostlinkedtemplates": "قالویایی که بیشتر هوم پیوند بینه", + "mostlinkedtemplates": "چوئه یایی که بیشتر هوم پیوند بینه", "mostcategories": "بلگه یا که بیشتر دسه بنی بینه", "mostimages": "فایلیایی که بیشتر هوم پیوند بینه", + "mostinterwikis": "بلگه یایی که بیشتری مینجا ویکی نه دارن", + "mostrevisions": "بلگه یایی که بیشتری وانئری نه دارن", "prefixindex": "همه بلگيا وا پيشون", "shortpages": "بلگه یا کؤچک", "longpages": "بلگه یا گپ", "deadendpages": "بلگه یا نابود بیئنی", "protectedpages": "بلگه یا حفاظت بيه", "protectedpages-noredirect": "واگردونیا قام بیه", + "protectedpages-timestamp": "سردیس گات", "protectedpages-page": "بلگه", "protectedpages-expiry": "تموم بیه آ", "protectedpages-performer": "کارور حفاظت بیه", @@ -1115,6 +1248,9 @@ "protectedpages-unknown-performer": "کارور ناشناس", "listusers": "نوم گه کارور", "listusers-editsonly": "فقط کاروریایی که ویرایشت می کن نشو بیه", + "listusers-creationsort": "سرجاخودگری د اساس گات دروس بیین", + "listusers-desc": "سرجاخودگری د اساس گپ د کؤچک", + "usereditcount": "$1{{جمی:$1|ویرایشت|ویرایشتیا}}", "usercreated": "{{جنسیت:$3|راس بیه}}د $1 at $2", "newpages": "بلگيا نو", "newpages-username": "نوم كاروری:", @@ -1126,36 +1262,59 @@ "booksources": "سرچشمه يل كتاو", "booksources-search-legend": "پی جوری سی سرچشمه یا کتاو", "booksources-go": "رو", + "specialloguserlabel": "انجومکار:", "log": "نیسنن رخ ونیا", "all-logs-page": "همه پهرستنومه یا عمومی", "allpages": "همه بلگيا", "nextpage": "بلگه نهایی($1)", "prevpage": "بلگه دمایی($1)", + "allpagesfrom": "بلگه یای که د شرو بینه نشو بیه:", + "allpagesto": "بلگه یایی که د تموم بینه نشو بیه.", "allarticles": "همه بلگيا", + "allinnamespace": "همه بلگه یا($1 نوم جا)", "allpagessubmit": "رو", + "allpagesprefix": "بلگه یایی که پس نوم دارن نشو بیه:", "allpagesbadtitle": "عنوان بلگه حاسته بیه معتور نی،یا یه گل مئن زونی یا مئن ویکی عنوان غلطه.\nیه شایت شومل یکی با یا بیشتر کاراکتریا نبوئه که سی ای موضوعیا استفاده بوئن", + "allpages-bad-ns": "{{نوم دیارگه}} د ای نوم جا نئ \"$1\".", "allpages-hide-redirects": "واگردونیا قام بیه", "cachedspecial-refresh-now": "دیئن آخری.", "categories": "دسه يا", + "special-categories-sort-count": "سرجاخودگری د اساس شمارشت", + "special-categories-sort-abc": "سرجاخودگری د اساس الفبا", "deletedcontributions": "هومیاریا پاکسا بیه کارور", "deletedcontributions-title": "هومیاریا پاک بیه کارور", "sp-deletedcontributions-contribs": "هومیاریا", + "linksearch": "هوم پیوند پی جوری خارجی", + "linksearch-pat": "سازه یار پی جوری:", "linksearch-ns": "نوم جا:", "linksearch-ok": "پی جوری", "linksearch-line": "$1 داره د $2 هوم پیوند بوئه", + "listusersfrom": "کاریاریایی که د شرو بینه نشو بیه:", "listusers-submit": "نشو دئن", "listusers-noresult": "هیچ کاروری پیدا نبی", "listusers-blocked": "(قلف بيه)", "activeusers": "نوم گه کاروریا کارکو", + "activeusers-from": "کاریاریایی که د شرو بینه نشو بیه:", "activeusers-hidebots": "بوتیا قام کو", "activeusers-hidesysops": "دیوون داریا نه قام کو", "activeusers-noresult": "هیچ کاروری پیدا نبی", + "listgrouprights": "حقوق گرو کاریاری", + "listgrouprights-key": "Legend:\n* دئه بیه د سمت راست\n* انجوم شیو بیه د سمت راست", "listgrouprights-group": "دسه", "listgrouprights-rights": "حقوقیا", + "listgrouprights-helppage": "هومیاری:حقوق گرو", "listgrouprights-members": "(نوم گه اندومیا)", + "listgrouprights-addgroup": "{{جمی:$2|گرویا|گرویا}} اضاف بکیتو: $1", + "listgrouprights-removegroup": "{{جمی:$2|گرویا|گرویا}} ورداریت: $1", "listgrouprights-addgroup-all": "همه گرویا نه اضاف کو", "listgrouprights-removegroup-all": "همه گرویا نه وردار", "listgrouprights-addgroup-self": " {{جمی:$2|گروه|گرویا}} نه د حساو: $1 اضاف کو", + "listgrouprights-removegroup-self": "{{جمی:$2|گرویا|گرویا}} نه د حساو ورداریت: $1", + "listgrouprights-addgroup-self-all": "همه گرویا نه د حساو خوشو اضاف بکیت", + "listgrouprights-removegroup-self-all": "همه گرویا نه د حساو خوشو ورداریت", + "listgrouprights-namespaceprotection-namespace": "نوم جا", + "trackingcategories-name": "نوم پیغوم", + "trackingcategories-disabled": "دسه ناکشتگر بیه", "mailnologin": "هیپچ نشونی یی کل نبیه", "emailuser": "ای كارور نه ايميل كو", "emailuser-title-target": "ایمیل سی ای {{جنس:$1|کارور}}", @@ -1164,6 +1323,7 @@ "defemailsubject": "{{نوم سیل جا}} ایمیل د کارور \"$1\"", "usermaildisabled": "ایمیل کارور د کار افتائه", "noemailtitle": "هیچ نشونی ایمیلی نئ", + "emailtarget": "یه گل نوم کاریاری سی پذریشتگر وارد بکیت", "emailusername": "نوم كاروری:", "emailusernamesubmit": "دئن", "emailfrom": "د:", @@ -1175,16 +1335,23 @@ "emailccsubject": " پیغومتو سی $1:$2 ورداشته بی", "emailsent": "ایمیل کل بیه", "emailsenttext": "پیغوم ایمیلی تو کل بیه.", + "usermessage-summary": "رئتن د سامونه پیغوم", "usermessage-editor": "پیغوم فرسن سیستم", "watchlist": "سیل برگ", "mywatchlist": "سیل برگ", "watchlistfor2": "سي $1 $2", + "nowatchlist": "شما هیچی د سیل برگ خوتو ناریت", "watchnologin": "وارد نبیه", + "addwatch": "اضاف کردن د سیل برگ", + "removewatch": "جا وه جا کردن د سیل برگ", + "removedwatchtext": "بلگه\"[[:$1]]\" د [[Special:سیل برگ|سیل برگ خوتو]] جا وه جا بیه.", + "removedwatchtext-short": "بلگه \"$1\" د سیل برگ جا وه جا بیه.", "watch": "سيل كردن", "watchthispage": "ديئن ای بلگه", "unwatch": "ديه نبيه", "unwatchthispage": "واداشتن دیئن", "notanarticle": "مینونه هیچ بلگه ای نئ", + "notvisiblerev": "آخری وانئری که د دس یه کاریار هنی انجوم بیه پاکسا بیه.", "watchlist-details": "{{جمی:$1|$1 بلگه|$1 بلگیا}} د سیل برگتو هیش بلگه قسه کردن نی .", "wlheader-enotif": "وارسیاری ایمیل فعال بیه.", "wlheader-showupdated": "بلگه یایی که د آخرین کرتی که شما دشو دیئن کردیته آلشت بینه د توپرنشون دئه بینه", @@ -1210,6 +1377,7 @@ "deleteotherreason": "دليليا هنی:", "deletereasonotherlist": "دلیل هنی", "deletereason-dropdown": "* دلیلیا پاکسا کردن رسم بیه\n** اسپم\n** خراوکاری\n** رعایت نبین کپی رایت\n** درحاست نیسنه\n** نهاورگشت شکست حرده", + "delete-edit-reasonlist": "دلیلیا پاکسا کردنه نه ویرایشت بکید", "rollbacklink": "ورگشتن", "sessionfailure-title": "شکست حردن نشینگه", "protectlogpage": "حفاظت کردن", @@ -1217,10 +1385,16 @@ "modifiedarticleprotection": "ریتراز حفاظت د \"[[$1]]\" آلشت بیه", "protect-title": "ریتراز حفاظت د \"$1\" آلشت بیه", "prot_1movedto2": "[[$1]] د [[$2]] جا وه جا بی", + "protectcomment": "دلیل:", "protect-default": "همه کاروریا اجازه دارن", "protect-othertime": "وخت هنی:", + "protect-othertime-op": "گات هنی", + "protect-otherreason-op": "دلیل هنی", "protect-expiry-options": "1 ساعت:1 ساعت,1 روز:1 روز,1 هفته:1 هفته,2 هفته:2 هفته,1 ما:1 ما,3 ما:3 ما,6 ما:6 ما,1 سال:1 سال,بی حساو:بی حساو", "restriction-type": "دسرسی:", + "minimum-size": "انازه کمترونه", + "maximum-size": "انازه بیشترونه", + "pagesize": "(بایتیا)", "restriction-edit": "ويرايشت", "restriction-move": "جاوه جا بوئيت", "restriction-create": "راس كردن", @@ -1271,10 +1445,13 @@ "whatlinkshere-filters": "فيلتريا", "block": "منع کارور", "blockip": "منع کارور", + "ipaddressorusername": "نوم نشون آی پی يا نوم كاروری:", "ipbreason": "دليل:", + "ipbemailban": "نهاگرتن کاریار د کل کردن انجومانامه", "ipbother": "وخت هنی:", "ipboptions": "2 ساعتیا:2 ساعت,1 رو:1 رو,3 روزا:3 رو,1 هفته:1 هفته,2 هفته یا:2 هفته,1 ما:1 ما,3 ما:3 میا,6 ما:6 مایا,1 سال:1سال,بی حساو:بی حساو", "ipbhidename": "نوم کاروری نه سی ویرایشت یا و نوم گه یا قام کو", + "ipb-disableusertalk": "نها ای کاریار نه اوسه که میها د بلگه چک چنه ش ویرایشت بکه و وه قلف بیه بئر", "unblockip": "کارور منع نبیه", "blocklist": "كاروريا منع بيه", "ipblocklist": "كاروريا منع بيه", @@ -1287,29 +1464,44 @@ "unblocklink": "بی قطی", "change-blocklink": "اجازه نديئن سی آلشت", "contribslink": "هومكاری", + "emaillink": "انجومانامه نه کل کو", "blocklogpage": "قلف", "blocklogentry": " [[$1]] وا یه گل وخت تموم بیئن $2 و $3 قلف بیه", "block-log-flags-nocreate": "حساو راس کردن عاجز بیه.", "block-log-flags-nousertalk": "نبوئه بلگه چک چنه خوتونه ویرایشت بکید", + "proxyblocker": "قلف کننه پروکسی", "lockdb": "قلف کردن رسینه گا", "unlockconfirm": "هره، مه واقعند میهام که رسینه گا وا بوئه.", + "lockbtn": "قلف کردن رسینه گا", "unlockbtn": "رسینه گا قلف نبیه", "lockdbsuccesssub": "رسینه گا د خوئی قلف بیه", "move-page": "$1 جا وه جا کو", + "move-page-legend": "بلگه نه جا وه جا کو", "movenotallowed": "شما وه جا وه جا کردن بلگه دسرسی ناریت", "movenotallowedfile": "شما وه جا وه جا کردن جانیایا دسرسی ناریت", "movepagebtn": "بلگه جا وه جا کو", + "pagemovedsub": "د خوئی جا وه جا بیه", "movepage-moved-redirect": "یه گل واگردونی دروس بیه.", "movelogpage": "جاوه جا کردن", "movelogpagetext": "د هار یه گل نوم گه د جا وه جایی یا بلگه هئ", + "movereason": "دلیل:", "revertmove": "لرستن", "delete_and_move": "پاکسا و جا وه جا بوئه", "export": "وه صحرا ديئن بلگيا", + "export-addcat": "اضاف کو", + "export-addns": "اضاف كو", "export-download": "ذخیره کردن جانیا", + "export-templates": "شامل چوئه یا", + "allmessages": "سامونه پیغومیا", "allmessagesname": "نوم", "allmessagesdefault": "سفارشت متنی پيش فرض", + "allmessages-filter-legend": "فیلتر", + "allmessages-filter-all": "همه", + "allmessages-filter-modified": "آلشت بیه", + "allmessages-prefix": "فیلتر بیه وا نهاون:", "allmessages-language": "زون:", "allmessages-filter-submit": "رو", + "allmessages-filter-translate": "والرن", "thumbnail-more": "گپ كردن", "filemissing": "گم بیئن جانیا", "thumbnail_error": "خطا د راس بیئن بن کلئکی:$1", @@ -1441,6 +1633,7 @@ "watchlisttools-edit": "سیل برگ بوینیتو و ویرایشت بکید", "watchlisttools-raw": "سیل برگ نه ردیفی ویرایشت کو", "duplicate-defaultsort": "زنهار کلیت پیش فرض جور بیه $2 تازه ای یا کلید پیش فرض جوربیه $1 رد بیه.", + "version-antispam": "نهاگرتن هرزنومه", "version-ext-license": "ليسانس", "version-ext-colheader-version": "نسقه", "version-ext-colheader-license": "ليسانس", diff --git a/languages/i18n/lv.json b/languages/i18n/lv.json index b003ebe6ec..0e6f431a67 100644 --- a/languages/i18n/lv.json +++ b/languages/i18n/lv.json @@ -736,7 +736,6 @@ "searchprofile-advanced-tooltip": "Izvēlēties nosaukumvietas, kurās meklēt", "search-result-size": "$1 ({{PLURAL:$2|1 vārds|$2 vārdi}})", "search-result-category-size": "$1 {{PLURAL:$1|apakšelements|apakšelementi}} ($2 {{PLURAL:$2|apakškategorija|apakškategorijas}}, $3 {{PLURAL:$3|fails|faili}})", - "search-result-score": "Atbilstība: $1%", "search-redirect": "(pāradresēts no $1)", "search-section": "(sadaļa $1)", "search-file-match": "(atbilst faila saturam)", @@ -1083,8 +1082,6 @@ "uploadwarning": "Augšupielādes brīdinājums", "uploadwarning-text": "Lūdzu, pārveido zemāk esošo faila aprakstu un mēģini vēlreiz.", "savefile": "Saglabāt failu", - "uploadedimage": "augšupielādēja \"[[$1]]\"", - "overwroteimage": "augšupielādēta jauna \"[[$1]]\" versija", "uploaddisabled": "Augšupielāde atslēgta", "copyuploaddisabled": "URL augšupielādes nav atļautas.", "uploaddisabledtext": "Failu augšupielāde ir atslēgta.", diff --git a/languages/i18n/lzh.json b/languages/i18n/lzh.json index 6d4b38f25a..91574c59f2 100644 --- a/languages/i18n/lzh.json +++ b/languages/i18n/lzh.json @@ -725,7 +725,6 @@ "searchprofile-advanced-tooltip": "自定名集中尋", "search-result-size": "$1 ($2字)", "search-result-category-size": "{{PLURAL:$1|一員|員有$1}}({{PLURAL:$2|一子類有|子類有$2}},{{PLURAL:$3|檔有一|檔有$3}})", - "search-result-score": "關:$1%", "search-redirect": "(轉 $1)", "search-section": "(節 $1)", "search-suggest": "爾否解之:$1", @@ -1077,8 +1076,6 @@ "uploadwarning": "慎焉!", "uploadwarning-text": "改下檔述再試之。", "savefile": "存之", - "uploadedimage": "進獻\"[[$1]]\"", - "overwroteimage": "新置「[[$1]]」矣", "uploaddisabled": "進獻已阻", "copyuploaddisabled": "由URL之貢被禁也。", "uploaddisabledtext": "檔之貢被禁也。", diff --git a/languages/i18n/mai.json b/languages/i18n/mai.json index d71bd774a9..e6169e6cd2 100644 --- a/languages/i18n/mai.json +++ b/languages/i18n/mai.json @@ -17,7 +17,8 @@ "Rillke", "Umeshberma", "Vinitutpal", - "아라" + "아라", + "बिप्लब आनन्द" ] }, "tog-underline": "लिंककेँ रेखांकित करू:", @@ -25,7 +26,7 @@ "tog-hidepatrolled": "सन्निकट परिवर्त्तनमे छोट परिवर्त्तन नुकाऊ", "tog-newpageshidepatrolled": "नियंत्रित सम्पादनकेँ नव पन्ना सूचीसँ नुकाऊ", "tog-extendwatchlist": "ध्यानसूचीमे सभ परिवर्तन देखाऊ,खाली हालक परिवर्तन नै", - "tog-usenewrc": "नीक सन्निकट परिवर्त्तन प्रयोग करू (जावास्क्रिप्ट चाही)", + "tog-usenewrc": "नीक सन्निकट परिवर्तन प्रयोग करू (जावास्क्रिप्ट चाही)", "tog-numberheadings": "शीर्षक स्वयं-क्रमांकित करू", "tog-showtoolbar": "संपादन ओजारपेटी देखाऊ (जावास्क्रीप्ट)", "tog-editondblclick": "दू बेर क्लीक कए पन्ना संपादित करू (जावास्क्रीप्ट)", @@ -34,6 +35,7 @@ "tog-watchdefault": "हमर संपादित पृष्ठ हमर साकांक्ष सूचीमे देखाऊ", "tog-watchmoves": "हमरा द्वारा हटाओल पृष्ठ हमर साकांक्ष सूचीमे राखू", "tog-watchdeletion": "हमरा द्वारा हटाओल पृष्ठ हमर साकांक्ष सूचीमे राखू", + "tog-watchrollback": "हमरा द्वारा जोडलगेल पृष्ठ हमार सांकक्ष सूचीमे राखू", "tog-minordefault": "हमर सभ सम्पादन पूर्वन्यस्त रूपेँ मामूली कहू", "tog-previewontop": "संपादन पेटीक ऊपर दृश्य देखाऊ", "tog-previewonfirst": "पहिल सम्पादनक बाद पूर्वावलोकन देखाउ", @@ -56,6 +58,8 @@ "tog-diffonly": "फाइल-अन्तर प्रणालीक नीचाँ पन्नाक सामिग्री नै देखाउ", "tog-showhiddencats": "नुकाएल संवर्ग देखाउ", "tog-norollbackdiff": "प्रत्यावर्तनक बाद फाइल-अन्तर प्रणालीकेँ बिसरू", + "tog-useeditwarning": "जब हम कोनो संपादन पृष्ठके बिना सुरक्षित केनै बदलाव संग छोइड दि त हमरा सूचित करु ।", + "tog-prefershttps": "सम्प्रवेशित करलाक बाद सदैव सुरक्षित कनेक्शनके प्रयोग करु", "underline-always": "सदिखन", "underline-never": "कखनो नै", "underline-default": "पूर्वन्यस्त गवेषक", @@ -114,6 +118,18 @@ "oct": "अक्टू.", "nov": "नव.", "dec": "दिस.", + "january-date": "जनवरी $1", + "february-date": "फरवरी $1", + "march-date": "मार्च $1", + "april-date": "अप्रैल $1", + "may-date": "मई $1", + "june-date": "जून $1", + "july-date": "जुलाई $1", + "august-date": "अगस्त $1", + "september-date": "सितम्बर $1", + "october-date": "अक्टूबर $1", + "november-date": "नवम्बर $1", + "december-date": "दिसम्बर $1", "pagecategories": "{{PLURAL:$1|खाढी|कएटा खाढी}}", "category_header": "संवर्ग \"$1\" मे पन्ना सभ", "subcategories": "उपसंवर्ग", @@ -136,6 +152,7 @@ "newwindow": "(नव खिड़कीसँ खुजैछ)", "cancel": "समाप्त", "moredotdotdot": "आर...", + "morenotlisted": "ई पुरा सूची नै अछी ।", "mypage": "हमर पन्ना", "mytalk": "वार्त्ता", "anontalk": "ऐ अनिकेत पता लेल विमर्श", @@ -151,6 +168,7 @@ "actions": "क्रिया सभ", "namespaces": "चेन्हासी समूह सभ", "variants": "प्रकार सभ", + "navigation-heading": "दिक्चालन सूची", "errorpagetitle": "गलती", "returnto": "$1 पर घुरु।", "tagline": "कतयसँ {{SITENAME}}", @@ -166,12 +184,16 @@ "permalink": "स्थायी लिंक", "print": "छापू", "view": "देखू", + "view-foreign": "$1 पर देखु", "edit": "संपादन", + "edit-local": "स्थानीय विवरण संपादन", "create": "बनाउ", + "create-local": "स्थानीय विवरण निर्माण", "editthispage": "एहि पृष्ठक संपादन", "create-this-page": "ई पन्ना बनाउ", "delete": "मेटाउ", "deletethispage": "ई पन्ना मेटाउ", + "undeletethispage": "ई पन्ना मेटाउ", "undelete_short": "आपस आनू {{PLURAL:$1|एक सम्पादनt|$1 सम्पादन सभ}}", "viewdeleted_short": "देखू {{PLURAL:$1|एकटा मेटाएल सम्पादन|$1 मेटाएल सम्पादन सभ}}", "protect": "बचाउ", @@ -184,7 +206,6 @@ "talkpagelinktext": "कहू", "specialpage": "विशेष पन्ना", "personaltools": "व्यक्तिगत उपकरण", - "postcomment": "नव खण्ड", "articlepage": "विषय-सूची पन्ना देखू", "talk": "वार्तालाप", "views": "दृष्टि", @@ -207,9 +228,11 @@ "jumptonavigation": "हेलू", "jumptosearch": "ताकू", "view-pool-error": "दुखी छी, वितरक सभ एखन व्यस्त अछि।\nबड्ड बेशी लोक ऐ पन्नाकेँ देखबामे लागल छथि।\nऐ पन्नाकेँ फेरसँ देखबा लेल कनी बिलमू। \n$1", + "generic-pool-error": "दुखी छी, वितरक सभ एखन व्यस्त अछि।\nबड्ड बेशी लोक ऐ पन्नाकेँ देखबामे लागल छथि।\nऐ पन्नाकेँ फेरसँ देखबा लेल कनी बिलमू। \n$1", "pool-timeout": "प्रतीक्षा निगृहीत कालावसान", "pool-queuefull": "प्रतीक्षा-पाँती पौती भरल", "pool-errorunknown": "अज्ञात भ्रम", + "pool-servererror": "पूल काउंटर सेवा उपलब्ध नै अछि ($1)।", "aboutsite": "विषयमे {{SITENAME}}", "aboutpage": "Project:विवरण", "copyright": "$1क अंतर्गत विषय सूची उपलब्ध अछि", @@ -236,6 +259,10 @@ "backlinksubtitle": "← $1", "retrievedfrom": "प्राप्ति स्थल \"$1\"", "youhavenewmessages": "अहाँ लग अछि $1 ($2).", + "youhavenewmessagesfromusers": "अहाके लेल {{PLURAL:$3|एक अन्य सदस्य|$3 अन्य सदस्यसभ}} के $1 छि । ($2)", + "youhavenewmessagesmanyusers": "अहाके $1 छि । ($2)", + "newmessageslinkplural": "{{PLURAL:$1|एगो नया पत्र|999=नया पत्र}}", + "newmessagesdifflinkplural": "$1 {{PLURAL:$1|परिवर्तन|परिवर्तन सभ}}", "youhavenewmessagesmulti": "$1 पर अहाँ लेल नव सन्देश अछि", "editsection": "संपादन करू", "editold": "सम्पादित करू", @@ -248,6 +275,9 @@ "hidetoc": "नुकाऊ", "collapsible-collapse": "भखड़ाउ", "collapsible-expand": "बढ़ाउ", + "confirmable-confirm": "कि {{GENDER:$1|अहाँ}} छी?", + "confirmable-yes": "हँ", + "confirmable-no": "नै", "thisisdeleted": "देखू वा जाउ $1?", "viewdeleted": "देखू $1?", "restorelink": "{{PLURAL:$1|एकटा मेटाएल सम्पादन|$1 मेटाएल सम्पादन सभ}}", @@ -279,6 +309,11 @@ "nospecialpagetext": " अहाँ एकटा अमान्य पन्नाक आग्रह केने छी। \nमान्य विशेष पन्नाक सूची एतए अछि [[Special:SpecialPages|{{int:specialpages}}]]।", "error": "भ्रम", "databaseerror": "दत्तनिधि भ्रम", + "databaseerror-text": "डाटाबेस अनुरोध त्रुटि भेल अछि।\nसंभवतः सफ्टवेयरमे गड़बड़ी अछि।", + "databaseerror-textcl": "डाटाबेस अनुरोध त्रुटि भेल अछि।", + "databaseerror-query": "अनुरोध: $1", + "databaseerror-function": "फंक्सन: $1", + "databaseerror-error": "त्रुटि: $1", "laggedslavemode": "'''चेतौनी:''' पन्नापर सम्भव जे अद्यतन परिवर्तन नै हुअए।", "readonly": "दत्तनिधि प्रतिबन्धित", "enterlockreason": "प्रतिबन्ध लेल कारण बताउ, संगमे एकटा अंदाज सेहो बताउ जे कखन ई प्रतिबन्ध हटाएल जाएत।", @@ -299,9 +334,10 @@ "badarticleerror": "ई क्रिया ऐ पन्नापर नै कएल जा सकैए।", "cannotdelete": "पन्ना व संचिका \"$1\" मेटाएल नै जा सकल।", "cannotdelete-title": "पन्ना \"$1\" नै मेटा सकल", + "delete-hook-aborted": "सम्पादन नोकसीसँ खतम भेल।\nई कोनो कारण नै देलक।", "badtitle": "खराप शीर्षक", "badtitletext": "आग्रह कएल पन्नाक शीर्षक गलत, खाली, वा गलत सम्बन्धित अन्तर-न्हाषा अन्तर विकी शीर्षक छी। ई एक वा बेशी कलाकार युक्त भऽ सकैए जे शीर्षकमे प्रयुक्त नै कएल जा सकैए।", - "perfcached": "ई दत्तांश उपस्मृतिक आधारपर अछि आ भऽ सकैए जे अद्यतन नै हुअए। A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.", + "perfcached": "ई दत्तांश उपस्मृतिक आधारपर अछि आ भऽ सकैए जे अद्यतन नै हुअए। अधिकतम {{PLURAL:$1|एकटा परिणाम|$1 परिणाम सभ}} क्याचेमे उपलब्ध अछि ।", "perfcachedts": "ई दत्तांश उपस्मृतिमे अछि, आ एकर अन्तिम परिवर्धन भेल अछि $1 केँ। A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.", "querypage-no-updates": "ऐ पन्नाक नवीनीकरण अखन बन्न अछि।\nएतुक्का दत्तांश अखन नवीकरण नै कएल जाएत।", "viewsource": "जड़ि देखू", @@ -317,37 +353,80 @@ "namespaceprotected": "अहाँकेँ '''$1''' नाम-पेटारमे सम्पादनक अनुमति नै अछि।", "customcssprotected": "अहांकें ऐ सी.एस.एस.पन्नाकें सम्पादित करबाक अधिकार नै अछि, कारण ऐमे दोसर प्रयोक्ताक व्यक्तिगत विकल्प छै।", "customjsprotected": "अहांकें ऐ जावास्क्रिप्ट पन्नाकें सम्पादित करबाक अधिकार नै अछि, कारण ऐमे दोसर प्रयोक्ताक व्यक्तिगत विकल्प छै।", + "mycustomcssprotected": "अहाके लेल ई CSS पन्नाके सम्पादित करवाक अधिकार नै अछि।", + "mycustomjsprotected": "अहके लेल इ जावास्क्रिप्ट पन्नाके सम्पादित करवाक अधिकार नै अछि।", + "myprivateinfoprotected": "अहाके अपन व्यक्तिगत जानकारी बदलैक अनुमति नै अछि।", + "mypreferencesprotected": "अहाके अपन प्राथमिकता बदलैक अनुमति नै अछि।", "ns-specialprotected": "विशेष पन्ना सभकेँ सम्पादित नै कएल जा सकैए।", "titleprotected": "ऐ शीर्षकक निर्माण प्रतिबन्धित अछि [[User:$1|$1]] द्वारा।\nकारण एतऽ देल अछि \"''$2''\"।", + "filereadonlyerror": "\"$1\" फाइलके बदलैलेल अक्षम कियाक भण्डार \"$2\" इ समय 'मात्र पाठन के लेल' (रीड ओनली) अछि।\n\nजे प्रबंधक इ प्रबंध लगोनै अछि हुनका निम्न विवरण प्रदान कएल गेल अछि: \"$3\"।", + "invalidtitle-knownnamespace": "\"$2\" नामस्थान आर \"$3\" नाम बला गलत शीर्षक", + "invalidtitle-unknownnamespace": "अज्ञात नामस्थान संख्या $1 आर नाम \"$2\" वाला गलत शीर्षक", + "exception-nologin": "सम्प्रवेशित नै", + "exception-nologin-text-manual": "इ पन्ना वा काजके सक्षम करवाक लेल कृपया $1 करु।", "virus-badscanner": "खराप विन्यास: अज्ञात विषविधि बिम्बक: ''$1''", "virus-scanfailed": "बिम्ब विफल (विध्यादेश $1)", "virus-unknownscanner": "अज्ञात विषविधि निरोधक", "logouttext": "'''अहाँ निष्क्रमण कऽ गेल छी।'''\n\nअहाँ {{अन्तर्जाल}} प्रयोग अनाम भऽ कऽ सकै छी, वा अहाँ [$1 log in again] वएह आकि कोनो आन प्रयोक्ताक रूपमे सेहू प्रयोक कऽ सकै छी।\nई मोन राखू जे किछु पन्ना एना देखा पड़ि सकैए जेना अहाँ अखनो सम्प्रवेशित होइ, जावत अहाँ अपन गवेषकक उपस्मृति मेटा नै दै छी।", + "welcomeuser": "अहाके स्वागत अछि, $1!", + "welcomecreation-msg": "अहाके खाता बनावोल गेल अछि ।\nअपन [[Special:Preferences|{{SITENAME}} प्राथमिकतासभ]] बदलैल नै बिसरब।", "yourname": "प्रयोक्ता:", + "userlogin-yourname": "प्रयोक्ता:", + "userlogin-yourname-ph": "अपन प्रयोक्तानाम लिखु", + "createacct-another-username-ph": "एकटा प्रयोक्तानाम लिखू:", "yourpassword": "कूटशब्द:", + "userlogin-yourpassword": "कूटशब्द:", + "userlogin-yourpassword-ph": "अपन कूटशब्द लिखु", + "createacct-yourpassword-ph": "कूटशब्द ई ठाम राखु", "yourpasswordagain": "कूटशब्द फेरसँ टाइप करू:", + "createacct-yourpasswordagain": "कूटशब्दके जाँच करु", + "createacct-yourpasswordagain-ph": "कूटशब्द पुनः लिखु", "remembermypassword": "हमर सम्प्रवेश ऐ गवेषकपर मोन राखू (बेशीसँ बेशी $1 {{PLURAL:$1|दिन|दिन}})", + "userlogin-remembermypassword": "हमरा सम्प्रवेशित राखु", + "userlogin-signwithsecure": "सुरक्षित कनेक्शनके प्रयोग करु", "yourdomainname": "अहाँक प्रभावक्षेत्र:", + "password-change-forbidden": "अहा इ विकिमे कूटशब्द नै बदल सकैत छि ।", "externaldberror": "खाहे सत्यापन दतांश भ्रम छल वा अहाँ अपन बाह्य खाताकेँ अद्यतन करबामे असमर्थ छी।", "login": "सम्प्रवेश", "nav-login-createaccount": "सदस्य लॉग इन", - "loginprompt": "{{अन्तर्जाल}} सम्प्रवेश लेल अहाँकेँ आवश्यक रूपेँ ज्ञापक सक्रिय करबाक चाही।", "userlogin": "लॉग इन / खेसरा बनाऊ", "userloginnocreate": "सम्प्रवेश", "logout": "निष्क्रमण", "userlogout": "फेर आयब", "notloggedin": "सम्प्रवेशित नै छी", + "userlogin-noaccount": "खाता नै अछि?", + "userlogin-joinproject": "{{SITENAME}} से जोडु", "nologin": "खाता नै अछि? $1।", "nologinlink": "नव खाता खोलू", "createaccount": "खाता खोली", "gotaccount": "पहिनहियेसँ खाता अछि? $1", "gotaccountlink": "सम्प्रवेश", "userlogin-resetlink": "अपन सम्प्रवेश विवरण बिसरि गेलहुँ?", + "userlogin-resetpassword-link": "अपन कूटशब्द बिसर गेलौ ?", + "userlogin-helplink2": "सम्प्रवेशित करवाकलेल मदत", + "userlogin-loggedin": "अहा {{GENDER:$1|$1}} के रूपमे पहिले स सम्प्रवेशित छि।\nकोनो दोसर सदस्यके रुपमे सम्प्रवेशित करवाक लेल देल गेल फारमके प्रयोग करु।", + "userlogin-createanother": "दोसर खाता बनाउ", + "createacct-emailrequired": "ई-पत्र संकेत", + "createacct-emailoptional": "ई-पत्र संकेत (वैकल्पिक)", + "createacct-email-ph": "अपन ई-पत्र संकेत सत्यापित करू", + "createacct-another-email-ph": "ई-पत्र संकेत सत्यापित करू", "createaccountmail": "ई-पत्र द्वारा", + "createacct-realname": "असली नाम (वैकल्पिक)", "createaccountreason": "कारण:", + "createacct-reason": "कारण:", + "createacct-reason-ph": "अहा इगो आर दोसर खाता कियाक बनउने जा रहल छि", + "createacct-captcha": "सुरक्षा जाँच", + "createacct-imgcaptcha-ph": "उपरोक्त पाठ लिखु", + "createacct-submit": "अपन खाता बनाउ", + "createacct-another-submit": "दोसर खाता बनाउ", + "createacct-benefit-heading": "{{SITENAME}} अहि जोका लोकनिसभ द्वारा बनावल गेल अछि।", + "createacct-benefit-body1": "$1 {{PLURAL:$1|सम्पादन|सम्पादन सभ}}", + "createacct-benefit-body2": "{{PLURAL:$1|पन्ना}}", + "createacct-benefit-body3": "{{PLURAL:$1|योगदानकर्ता}}", "badretype": "कूटशब्द जे अहाँ भरलहुँ से मेल नै खाइए।", "userexists": "सम्प्रवेशित प्रयोक्तानाम पहिनहियेसँ प्रयोगमे अछि।\nकृपा कऽ कोनो दोसर नाम चुनू।", "loginerror": "सम्प्रवेश भ्रम", + "createacct-error": "खाता निर्माण त्रुटि", "createaccounterror": "खाता नै बना सकल: $1", "nocookiesnew": "प्रयोक्ता खाता खुजि गेल, मुदा अहाँ सम्प्रवेशित नै छी।\n{{अन्तर्जाल}} सम्प्रवेशित प्रयोक्ताक लेल ज्ञापकक प्रयोग करैत अछि।\nअहाँ ज्ञापककेँ अशक्त केने छी।\nकृपा कऽ ओकरा सक्रिप करू, तखन अपन प्रयोक्तानाम आ कूटशब्दक संग सम्प्रवेश करू।", "nocookieslogin": "{{अन्तर्जाल}} प्रयोक्ताकेँ सम्प्रवेशित करबा लेल ज्ञापकक प्रयोग करैत अछि।\nअहाँ ज्ञापककेँ अशक्त केने छी।\nकृपा कऽ ओकरा सक्रिय करू आ फेरसँ प्रयास करू।", @@ -381,6 +460,7 @@ "emailconfirmlink": "अपन ई-पत्र संकेत सत्यापित करू", "invalidemailaddress": "अमान्य प्रारूपक कारण ऐ ई-पत्र संकेतकेँ स्वीकार नै कएल जा सकैए।\nएकटा मान्य ई-पत्र संकेत लिखू वा ओइ स्थानकेँ खाली करू।", "cannotchangeemail": "खाता ई-पत्र संकेत ऐ विकीपर बदलल नै जा सकैए।", + "emaildisabled": "ई साइट ई-पत्र नै पठाएत।", "accountcreated": "खाता खुजि गेल", "accountcreatedtext": "$1 लेल प्रयोक्ता खाता खुजि गेल।", "createaccount-title": "{{अन्तर्जाल}} लेल खाता निर्माण", @@ -389,17 +469,24 @@ "login-abort-generic": "अहाँक सम्प्रवेश सफल नै भेल- खतम", "loginlanguagelabel": "भाषा : $1", "suspicious-userlogout": "अहाँक निष्क्रमणक अनुरोध नै मानल गेल कारण ई लागल जे ई पुरान गवेषकक लागि वा दोसराइत उपस्मृति द्वारा पठाओल गेल छल।", + "createacct-another-realname-tip": "मूल नाम वैकल्पिक अछि।\nजँ अहाँ एकरा देबा लेल प्रयोग करै छी, ई अहाँकेँ काजक श्रेय देबा लेल एकर प्रयोग कएल जाएत।", + "pt-login": "सम्प्रवेश", + "pt-login-button": "सम्प्रवेश", + "pt-createaccount": "खाता खोली", + "pt-userlogout": "निष्क्रमण", "php-mail-error-unknown": "पी.एच.पी.क संदेश कार्य() मे अज्ञात दोष", "user-mail-no-addy": "बिन ई-पत्र संकेतक ई-पत्र पठेबाक प्रयास", + "user-mail-no-body": "एकटा खाली वा बहुत कनिका ई-पत्र भेजवाक प्रयास कल गेल ।", "changepassword": "कूटशब्द बदलू", - "resetpass_announce": "अहाँ अस्थायी ई-पत्र विध्यादेशसँ सम्प्रवेश केने छी।\nसम्प्रवेश सम्पूर्ण करबा लेल, अहाँ एकटा नव कूटशब्द एतए निर्धारित करू:", + "resetpass_announce": "अहाँक अस्थायी ई-पत्र विध्यादेशसँ सम्प्रवेश केने छी।\nसम्प्रवेश सम्पूर्ण करबा लेल, अहाँ एकटा नव कूटशब्द एतए निर्धारित करू:", "resetpass_text": "", "resetpass_header": "खाता कूटशब्द बदलू", "oldpassword": "पुरान कूटशब्द", "newpassword": "नव कूटशब्द", "retypenew": "नव कूटशब्द फेरसँ टंकित करू", "resetpass_submit": "कूटशब्द बनाउ आ सम्प्रवेश करू", - "changepassword-success": "अहाँक कूटशब्द सफलतासँ बदलि देल गेल!\nआब अहाँकेँ सम्प्रवेशित कऽ रहल छी...", + "changepassword-success": "अहाँक कूटशब्द सफलतासँ बदलि देल गेल!", + "changepassword-throttled": "अहाँ ढ़ेर रास सम्प्रवेश प्रयास केलहुँ।\nफेर प्रयास करबासँ पहिने कने काल थम्हू।", "resetpass_forbidden": "कूटशब्द सभ नै बदलल जा सकैए।", "resetpass-no-info": "अहाँकेँ ऐ पन्नाकेँ पढ़बाले सम्प्रवेशित हुअए पड़त।", "resetpass-submit-loggedin": "कूटशब्द बदलू", @@ -407,8 +494,11 @@ "resetpass-wrong-oldpass": "अमान्य अस्थायी वा अखुनका कूटशब्द।\nअहाँ पहिनहिये सफलतासँ कूटशब्द बदलि लेने छी वा एकटा नव अस्थायी कूटशब्द लेल आग्रह केने छी।", "resetpass-temp-password": "तात्कालिक कूटशब्द", "passwordreset": "कूटशब्द फेरसँ बनाउ", + "passwordreset-text-one": "अपन कूटशब्द रीसेट करवाक लेल इ फारम भरु ।", + "passwordreset-text-many": "{{PLURAL:$1|ई-पत्रके माध्यमसऽ एकटा अस्थायी कूटशब्द पावैलेल कोनो एकटा डिब्बा भरु ।}}", "passwordreset-legend": "कूटशब्द फेरसँ बनाउ", "passwordreset-disabled": "कूटशब्द फेरसँ बनाएब ऐ विकीपर अक्षम कएल अछि।", + "passwordreset-emaildisabled": "कूटशब्द फेरसँ बनाएब ऐ विकीपर अक्षम कएल अछि।", "passwordreset-username": "प्रयोक्तानाम", "passwordreset-domain": "क्षेत्र:", "passwordreset-capture": "परिणाम ई-पत्र देखू?", @@ -428,8 +518,17 @@ "changeemail-oldemail": "अखुनका ई-पत्र संकेत:", "changeemail-newemail": "नव ई-पत्र संकेत:", "changeemail-none": "(कोनो नै)", + "changeemail-password": "अहाके {{SITENAME}} कूटशब्द:", "changeemail-submit": "ई-पत्र संकेत बदलू", "changeemail-cancel": "खतम", + "changeemail-throttled": "अहाँ ढ़ेर रास सम्प्रवेश प्रयास केलहुँ।\nफेर प्रयास करबासँ पहिने कने काल थम्हू।", + "resettokens": "टोकन रीसेट करी", + "resettokens-no-tokens": "रीसेट करवाक लेल कोनो टोकन नै अछि।", + "resettokens-legend": "टोकन रीसेट करी", + "resettokens-tokens": "टोकन:", + "resettokens-token-label": "$1 (वर्तमान मूल्य: $2)", + "resettokens-done": "टोकन रीसेट भेल अछि।", + "resettokens-resetbutton": "छानल टोकन रीसेट करु", "bold_sample": "गँहीर लेखन", "bold_tip": "गँहीर लेखन", "italic_sample": "कटि लेखन", @@ -495,12 +594,14 @@ "updated": "(अद्यतन कएल)", "note": "'''टिप्पणी:'''", "previewnote": "'''मोन राखू ई मातर पूर्वावलोकन छी।'''\nअहाँक परिवर्तन अखन धरि सँचिआएल नै गेल अछि!", + "continue-editing": "संपादन क्षेत्र जाउ", "previewconflict": "ई पूर्वदृश्य देखबैए उपरका सम्पादन क्षेत्रक पाठ , ई आएत जखन अहाँ संरक्षित करब।", "session_fail_preview": "''' दुखी छी! अहाँक सत्रक दत्तांश खतम भऽ गेल तै कारणसँ अहाँक सम्पादनक निपटारा नै भऽ सकल।'''\nफेरसँ प्रयास करू।\nजँ ई फेरसँ काज नै करैए, प्रयोग करू [[Special:UserLogout|निष्क्रमण]] आ फेर सम्प्रवेश करू।", "session_fail_preview_html": "''' दुखी छी! हम अहाँक सम्पादनक निष्पादन नै कऽ सकलहुँ कारण सत्रक दत्तांश खतम भऽ गेल।'''\n''कारण {{अन्तर्जाल}} लग काँच एच.टी.एम.एल. दत्तांश सक्रिय छै, पूर्वदृश्य जावास्क्रिप्ट आक्रमणक डरसँ नुकाएल राखल गेल अछि।''\n'''जँ ई वैध सम्पादन प्रयास अछि, कृपा कऽ पुनः प्रयास करू।'''\nजँ ई अखनो काज नै कऽ रहल अछि, प्रयास करू [[Special:UserLogout|निष्क्रमण कऽ रहल छी]] आ फेरसँ सम्प्रवेश।", "token_suffix_mismatch": "'''अहाँक सम्पादन अस्वीकार कऽ देल गेल अछि कारण अहाँक ग्राहक प्रेष्यमान अंक विधानक विराम चेन्ह सभकेँ नष्ट कऽ देलन्हि।'''\nई सम्पादन पन्नाक पाठकेँ दूषित होएबासँ बचेबा लेल अमान्य कऽ देल गेल।\nई कखनो काल होइए जखन अहाँ जाल आधारित अनाम दोसरा लेल चल सेवा प्रयुक्त करै छी।", "edit_form_incomplete": "'''सम्पादन आवेदनक किछु भाग वितरक धरि नै पहुँचल; एक बेर फेर देखू जे अहाँक सम्पादन दुरुस्त अछि आ फेरसँ प्रयास करू।'''", "editing": "सम्पादन होइए $1", + "creating": "$1 बनाउ", "editingsection": "सम्पादन कऽ रहल छी $1 (खण्ड)", "editingcomment": "सम्पादन कऽ रहल छी $1 (नव खण्ड)", "editconflict": "सम्पादन अन्तर: $1", @@ -539,7 +640,17 @@ "edit-gone-missing": "पन्ना अद्यतन नै भऽ सकल।\nलगैए जे ई मेटा देल गेल अछि।", "edit-conflict": "सम्पादन अन्तर", "edit-no-change": "अहाँक सम्पादनपर ध्यान नै देल गेल, कारण ऐ सँ पाठमे कोनो परिवर्तन नै आएल।", + "postedit-confirmation-created": "पन्ना निर्माण करल गेल अछि ।", + "postedit-confirmation-restored": "पन्नाके पुराण स्थितिमे लौने गेल अछि ।", + "postedit-confirmation-saved": "अहाके संपादनके सुरक्षित भेल ।", "edit-already-exists": "नव पन्नाक निर्माण नै भऽ सकल।\nई पहिनहियेसँ वर्तमान अछि।", + "defaultmessagetext": "पूर्वनिर्धारित संदेश पाठ", + "invalid-content-data": "अवैध डाटा सामग्री", + "editpage-notsupportedcontentformat-title": "सामग्री स्वरूप समर्थित नै अछि", + "content-model-wikitext": "विकिटेक्स्ट", + "content-model-text": "सामान्य पाठ", + "content-model-javascript": "जावास्क्रिप्ट", + "content-model-css": "सी॰एस॰एस", "expensive-parserfunction-warning": "'''चेतौनी:''' ई पन्ना बड्ड बेसी महग विभाजक प्रकार्य आह्वान करैत अछि।\n एकरा $2 सँ कम {{PLURAL:$2|call|calls}}, ओतऽ {{PLURAL:$1|ई अछि $1 call|ई सभ अछि $1 calls}}", "expensive-parserfunction-category": "बड बेसी महग विभाजक आह्वानबला पन्ना सभ", "post-expand-template-inclusion-warning": "'''चेतौनी:''' नमूना लेबाक आकार बड्ड पैघ अछि।\nकिछु नमूना नै लेल जा सकत।", @@ -666,12 +777,18 @@ "revertmerge": "नै मिज्झर", "mergelogpagetext": "नीचाँ एक पन्ना इतिहासक दोसरमे अद्यतन मिश्रणक सूची अछि।", "history-title": "\"$1\" क संशोधन इतिहास", + "difference-title": "\"$1\" के अवतरणसभमे अंतर", + "difference-title-multipage": "\"$1\" आर \"$2\" पृष्ठसभ मे अंतर", "difference-multipage": "(पन्ना सभक बीचमे अन्तर)", "lineno": "पंक्त्ति $1:", "compareselectedversions": "चयन कएल संशोधन सभक तुलना करू", "showhideselectedversions": "देखाउ/ नुकाउ चयनित संशोधन सभ", "editundo": "असंपादन", + "diff-empty": "(कोनो अंतर नै)", + "diff-multi-sameuser": "(इ प्रयोक्ताद्वारा {{PLURAL:$1|कएल गेल बीचके एक अवतरण नै देखाओल गेल |कएल गेल बीचके $1 अवतरण नै देखाओल गेल}})", + "diff-multi-otherusers": "({{PLURAL:$1|एकटा मध्यस्थ संशोधन|$1 मध्यस्थ संशोधन सभ}} $2 सँ बेसी {{PLURAL:$2|प्रयोक्ता|प्रयोक्ता सभ}} नै देखाएल)", "diff-multi-manyusers": "({{PLURAL:$1|एकटा मध्यस्थ संशोधन|$1 मध्यस्थ संशोधन सभ}} $2 सँ बेसी {{PLURAL:$2|प्रयोक्ता|प्रयोक्ता सभ}} नै देखाएल)", + "difference-missing-revision": "इ अंतर {{PLURAL:$2|के एकटा अवतरण|के $2 अवतरण}} ($1) नै {{PLURAL:$2|पाओल गेल|पाओल गेल}}।\n\nइ सामन्य ढंगमे हटाओल गेल पृष्ठके अवतरसभ मे अंतर खोजला स होएत अछि । आर जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाओल लग] मे भेट सकैत अछि।", "searchresults": "तकबाक फलाफल", "searchresults-title": "तकबाक फलाफल \"$1\" लेल", "titlematches": "पन्ना शीर्ष मेल", @@ -695,9 +812,9 @@ "searchprofile-advanced-tooltip": "बनाएल नामस्थान सभमे ताकू", "search-result-size": "$1 ({{PLURAL:$2|1 शब्द|$2 शब्द सभ}})", "search-result-category-size": "{{PLURAL:$1|1 सदस्य|$1 सदस्य}} ({{PLURAL:$2|1 उपसंवर्ग|$2 उपसंवर्ग}}, {{PLURAL:$3|1 संचिका|$3 संचिका}})", - "search-result-score": "काज: $1%", "search-redirect": "(रस्ता बदलेन $1)", "search-section": "(शाखा $1)", + "search-file-match": "(फाइल सामग्रीसे मेल खेलक अछि)", "search-suggest": "अहाँ मोने अछि जे:$1", "search-interwiki-caption": "सम्बन्धित परियोजना सभ", "search-interwiki-default": "$1 सभटा परिणाम:", @@ -706,6 +823,7 @@ "searchrelated": "सम्बन्धी", "searchall": "सभटा", "showingresults": "नीचाँ एतऽ धरि {{PLURAL:$1|'''1''' परिणाम|'''$1''' परिणाम सभ}} #'''$2''' सँ प्रारम्भ भऽ कऽ।", + "showingresultsinrange": "नीचाँ एतऽ धरि {{PLURAL:$1|'''1''' परिणाम|'''$1''' परिणाम सभ}} #'''$2''' सँ प्रारम्भ भऽ कऽ।", "showingresultsheader": "{{PLURAL:$5|परिणाम '''$1''' एकर '''$3'''|परिणाम सभ '''$1 - $2''' एकर '''$3'''}} ऐ लेल '''$4'''", "search-nonefound": "अभ्यर्थनासँ मेल खाइत कोनो परिणाम नै भेटल।", "powersearch-legend": "विशेष खोज", @@ -713,20 +831,24 @@ "powersearch-togglelabel": "जाँचू:", "powersearch-toggleall": "सभटा", "powersearch-togglenone": "कोनो नै", + "powersearch-remember": "याद राखु भविष्यकऽ खोजीके लेल", "search-external": "बाह्य खोज", "searchdisabled": "{{अन्तर्जाल}} खोज बन्न अछि।\nअहाँक गूगलक माध्यमसँ ऐ बीच ताकि सकै छी।\nमोन राखू जे तकर विवरणी {{अन्तर्जाल}} सामिग्री समयातीत भऽ सकैए।", + "search-error": "खोजवाके समय निम्न त्रुटि उत्पन्न भेल: $1", "preferences": "विकल्प", "mypreferences": "खासमखास", "prefs-edits": "सम्पादनक संख्या", + "prefsnologintext2": "अपन वरीयतासभके बदलैक लेल $1 करू।", "prefs-skin": "रूप", "skin-preview": "पूर्वावलोकन", "datedefault": "कोनो मोनपसंद नै", "prefs-labs": "प्रायोगिक गुण सभ", + "prefs-user-pages": "उपयोगकर्ताक पृष्ठ", "prefs-personal": "प्रयोक्ता परिचय", "prefs-rc": "हालक परिवर्तन", "prefs-watchlist": "साकांक्ष-सूची", "prefs-watchlist-days": "साकांक्ष-सूचीमे एतेक दिन देखाएल:", - "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}", + "prefs-watchlist-days-max": "बेसीसँ बेसी $1 {{PLURAL:$1|दिन|दिन}}", "prefs-watchlist-edits": "बढ़ाएल साकांक्ष सूचीमे अधिकतम परिवर्तन देखाएब:", "prefs-watchlist-edits-max": "बेसीसँ बेसी:१०००", "prefs-watchlist-token": "साकांक्ष-सूची खेप:", @@ -748,6 +870,7 @@ "recentchangesdays-max": "बेसीसँ बेसी $1 {{PLURAL:$1|दिन|दिन}}", "recentchangescount": "पूर्वनिर्धारित रूपेँ एतेक सम्पादन देखाएल गेल:", "prefs-help-recentchangescount": "ऐ मे सम्मिलित अछि आइ-काल्हिक परिवर्तन, पन्नाक इतिहास आ वृत्तलेख", + "prefs-help-watchlist-token2": "इ अहाँके कंक्षाकसूचीके वेब फिडके गोपनीय चाभी छी ।\nइ जे कोइ लंग अछि उ अपन कंक्षाकसूची पैढ सकैत अछि, ऐ लेल इ क्यों गोटा स नै बाटब ।\n[[Special:ResetTokens|एकरा रीसेट करवाक लेल यै ठाम क्लिक करु]]।", "savedprefs": "अहाँक पसिन्न सुरक्षित कएल गेल", "timezonelegend": "समय क्षेत्र", "localtime": "स्थानीय समए:", @@ -805,13 +928,18 @@ "prefs-dateformat": "तिथिक बगेबानी", "prefs-timeoffset": "समए संशोधक", "prefs-advancedediting": "विशिष्ट विकल्प सभ", + "prefs-editor": "संपादक", + "prefs-preview": "पूर्वावलोकन", "prefs-advancedrc": "विशिष्ट विकल्प सभ", "prefs-advancedrendering": "विशिष्ट विकल्प सभ", "prefs-advancedsearchoptions": "विशिष्ट विकल्प सभ", "prefs-advancedwatchlist": "विशिष्ट विकल्प सभ", "prefs-displayrc": "दृश्य विकल्प सभ", "prefs-displaywatchlist": "दृश्य विकल्प सभ", + "prefs-tokenwatchlist": "टोकन", "prefs-diffs": "अन्तर निर्धारक सभ", + "prefs-help-prefershttps": "इ प्राथमिकता अहाँके फेर स सम्प्रवेश करलाक बाद प्रभाव पडत।", + "prefs-tabs-navigation-hint": "सुझाव: अहाँ टैब्स सूचीमे टैब्सके बीच आवागमन करवाक लेल बाम आर दाहिना बागलके कुंजिसभके उपयोग कइर सकैत छी।", "email-address-validity-valid": "ई-पत्र संकेत मान्य बुझाइत अछि", "email-address-validity-invalid": "एकटा मान्य ई-पत्र संकेत लिखू", "userrights": "प्रयोक्ता अधिकारक प्रबन्धन", @@ -832,6 +960,8 @@ "userrights-changeable-col": "वर्ग जे अहाँ बदलि सकै छी", "userrights-unchangeable-col": "वर्ग जे अहाँ नै बदलि सकै छी", "userrights-irreversible-marker": "$1*", + "userrights-conflict": "प्रयोक्ता अधिकार बदलावक समयमे अंतर्विरोध! कृपया अपन बदलाव जाँच करु आ पुनः सुनिश्चित करु।", + "userrights-removed-self": "अहाँ सफलतापूर्वक अपन अधिकार हटा देने छी। अतः अहाँ आब ई पृष्ठ नै देख सकैत छी।", "group": "वर्ग:", "group-user": "प्रयोक्ता सभ", "group-autoconfirmed": "स्वतःअनुमोदित प्रयोक्ता सभ", @@ -861,6 +991,7 @@ "right-move": "पन्ना सभ घसकाउ", "right-move-subpages": "पन्ना सभकेँ उपपन्ना सभक संग घसकाउ", "right-move-rootuserpages": "मूल प्रयोक्ता पन्ना सभ घसकाउ", + "right-move-categorypages": "श्रेणी पृष्ठ स्थानांतरित करू", "right-movefile": "संचिका सभकेँ घसकाउ", "right-suppressredirect": "पन्ना घसकेबा काल मूल पन्ना सभसँ लागि सभ नै बनाउ", "right-upload": "संचिका सभ उपारोपित करू", @@ -876,12 +1007,14 @@ "right-writeapi": "लेख्य ए.पी.आइ.क प्रयोग", "right-delete": "पन्ना सभकेँ मेटाउ", "right-bigdelete": "बेशी इतिहास बला पन्ना सभकेँ मेटाउ", + "right-deletelogentry": "विशिष्ट लग प्रविष्टिसभके नुकाउ आ देखाउ", "right-deleterevision": "निर्धारित संशोधित पन्ना मेटाउ आ फेरसँ आनू", "right-deletedhistory": "मेटाएल इतिहास प्रविष्टि देखू, बिना लागिक पाठक", "right-deletedtext": "मेटाएल पाठ आ दूटा मेटाएल संशोधनक बीचक परिवर्तन देखू", "right-browsearchive": "मेटाएल पन्ना सभकेँ ताकू", "right-undelete": "पन्ना फेरसँ आनू", "right-suppressrevision": "संचालकसँ नुकाएल संशोधनकेँ पुनरीक्षित करू आ फेरसँ आनू", + "right-viewsuppressed": "कोनो प्रयोक्ताके नुकाएल संसोधन देखु", "right-suppressionlog": "व्यक्तिगत वृत्तलेख देखू", "right-block": "दोसर प्रयोक्ताकेँ सम्पादनसँ रोकू", "right-blockemail": "प्रयोक्ताकेँ ई-पत्र पठेबासँ रोकू", @@ -891,10 +1024,18 @@ "right-unblockself": "स्वयंकेँ प्रतिबन्धसँ हटाउ", "right-protect": "सुरक्षा स्तर बदलू आ संरक्षित पन्ना सम्पादित करू", "right-editprotected": "संरक्षित पन्ना सम्पादित करू (बिना तराउपड़ी सुरक्षाक)", + "right-editsemiprotected": "संरक्षित पन्ना सम्पादित करू (बिना तराउपड़ी सुरक्षाक)", "right-editinterface": "प्रयोक्ता मध्यस्थक सम्पादन करू", "right-editusercssjs": "दोसर प्रयोक्ताक सी.एस.एस. आ जावास्क्रिप्ट संचिका सभक सम्पादन करू", "right-editusercss": "दोसर प्रयोक्ता सभक सी.एस.एस. संचिका सभक सम्पादन करू", "right-edituserjs": "दोसर प्रयोक्ताक जावास्क्रिप्ट संचिका सभक सम्पादन करू", + "right-editmyusercss": "अपन प्रयोक्ता स्तरके सी.एस.एस.फाइल स संपादित करु", + "right-editmyuserjs": "दोसर प्रयोक्ताक जावास्क्रिप्ट संचिका सभक सम्पादन करू", + "right-viewmywatchlist": "अपन काँच साकांक्षसूची देखु", + "right-editmywatchlist": "अपनी साकांक्षसूची सम्पादित करु । ध्यान दियो कि कोनो काज इ अधिकारके नै भेलाके बादो साकांक्षसूचीमे पृष्ठ जोडत।", + "right-viewmyprivateinfo": "अपन व्यक्तिगत डाटा देखु (जेना ई-मेल पता, असली नाम)", + "right-editmyprivateinfo": "अपन व्यक्तिगत डाटा सम्पादित करू (जेना ई-मेल पता, असली नाम)", + "right-editmyoptions": "अपन वरीयतासभ सम्पादित करु", "right-rollback": "कृपा कऽ अन्तिम प्रयोक्ताक सम्पादन सभकेँ प्रत्यावर्तित करू जे एक खास पन्नाकेँ सम्पादित केलन्हि", "right-markbotedits": "प्रत्यावर्तित सम्पादन सभकेँ स्वचालित सम्पादन देखाउ", "right-noratelimit": "दरक सीमासँ प्रभावित नै", @@ -920,10 +1061,12 @@ "action-createpage": "पन्ना सभ बनाउ", "action-createtalk": "वार्ता पन्ना सभ बनाउ", "action-createaccount": "ई प्रयोक्ता खाता बनाउ", + "action-history": "पन्नाक इतिहासकेँ मिज्झर करू", "action-minoredit": "ऐ सम्पादनकेँ मामूली कहू", "action-move": "ऐ पृष्ठकेँ घसकाउ", "action-move-subpages": "ऐ पन्ना आ एकर उपपन्नाकेँ घसकाउ", "action-move-rootuserpages": "मूल प्रयोक्ता पन्ना सभ घसकाउ", + "action-move-categorypages": "श्रेणी पृष्ठ स्थानांतरित करू", "action-movefile": "ऐ संचिकाकेँ घसकाउ", "action-upload": "ऐ संचिकाकेँ उपारोपित करू", "action-reupload": "ऐ संचिकाक पुनर्लेखन करू", @@ -950,23 +1093,45 @@ "action-userrights-interwiki": "दोसर विकीपर प्रयोक्ताक प्रयोक्ता अधिकारक सम्पादन करू", "action-siteadmin": "दत्तनिधिकेँ प्रतिबन्धित करू आ फेर प्रतिबन्ध हटाउ", "action-sendemail": "ई-पत्र पठाउ", + "action-editmywatchlist": "काँच साकांक्षसूची संपादित करू", + "action-viewmywatchlist": "अपन काँच साकांक्षसूची देखु", + "action-viewmyprivateinfo": "अपन व्यक्तिगत जानकारी देखु", + "action-editmyprivateinfo": "अपन व्यक्तिगत जानकारी संपादित करु", "nchanges": "$1 {{PLURAL:$1|परिवर्त्तन|परिवर्त्तन}}", + "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|अंतिम बेर देखला के बाद स}}", + "enhancedrc-history": "इतिहास", "recentchanges": "लगक परिवर्तन सभ", "recentchanges-legend": "नव परिवर्तन सभक विकल्प सभ", "recentchanges-summary": "ऐ पन्नापर विकीमे भेल सभसँ अद्यतन परिवर्तनपर नजरि राखू।", + "recentchanges-noresult": "इ अवधिके दौरान इ मापदंडके पूर्ण करेत समय कोनो परिवर्तन नै केएल गेल अछि।", "recentchanges-feed-description": "ऐ सूचना-तंत्रांशमे विकीमे भेल सभसँ लगक परिवर्तन ताकू", "recentchanges-label-newpage": "ई सम्पादन एकटा नव पन्नाक निर्माण केलक।", "recentchanges-label-minor": "ई एकटा लघु सम्पादन छी", "recentchanges-label-bot": "ई सम्पादन यांत्रिक छल।", "recentchanges-label-unpatrolled": "ऐ सम्पादनक पुनरीक्षण अखन धरि नै कएल गेल अछि।", + "recentchanges-label-plusminus": "पन्नाके आकार इ बाइट संख्यासे बदलल गेल", + "recentchanges-legend-heading": "'''कुंजी:'''", + "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नयाँ पन्नसभके सूची]] सहो देखु)", "rcnotefrom": "नीचाँमे '''$2''' सँ भेल परिवर्तन अछि ('''$1''' धरि देखाएल)।", "rclistfrom": "$3 $2 सँ शुरू भेल नव परिवर्तन देखू", "rcshowhideminor": "$1 अल्प संपादन", + "rcshowhideminor-show": "देखाउ", + "rcshowhideminor-hide": "नुकाऊ", "rcshowhidebots": "$1 स्वचालक सभ", + "rcshowhidebots-show": "देखाउ", + "rcshowhidebots-hide": "नुकाऊ", "rcshowhideliu": "$1 सम्प्रवेशित प्रयोक्ता सभ", + "rcshowhideliu-show": "देखाउ", + "rcshowhideliu-hide": "नुकाऊ", "rcshowhideanons": "$1 अज्ञात प्रयोक्ता सभ", + "rcshowhideanons-show": "देखाऊ", + "rcshowhideanons-hide": "नुकाऊ", "rcshowhidepatr": "$1 संचालित सम्पादन", + "rcshowhidepatr-show": "देखाउ", + "rcshowhidepatr-hide": "नुकाऊ", "rcshowhidemine": "$1 हमर सम्पादन सभ", + "rcshowhidemine-show": "देखाउ", + "rcshowhidemine-hide": "नुकाऊ", "rclinks": "देखाऊ अंतिम $1 परिवर्त्तन अंतिम $2 दिनमे
    $3", "diff": "अंतर", "hist": "इति.", @@ -980,9 +1145,11 @@ "rc_categories": "संवर्ग सीमित (\"|\" सँ हटाउ)", "rc_categories_any": "कोनो", "rc-change-size": "$1", + "rc-change-size-new": "बदललाके बाद $1 {{PLURAL:$1|बाइट}}", "newsectionsummary": "/* $1 */ नव संवर्ग", "rc-enhanced-expand": "वर्णन देखाउ (जावास्क्रिप्ट चाही)", "rc-enhanced-hide": "वर्णन नुकाउ", + "rc-old-title": "मूल रूप स \"$1\" नाम स बनाएल गेल रह", "recentchangeslinked": "संबंधित परिवर्त्तन", "recentchangeslinked-feed": "संबंधित परिवर्त्तन", "recentchangeslinked-toolbox": "संबंधित परिवर्त्तन", @@ -1048,16 +1215,17 @@ "fileexists-shared-forbidden": "ऐ नामसँ एकटा संचिका साझी संचिका बखारीमे पहिनहियेसँ अछि।\nजँ अहाँ अखनो अपन संचिका उपारोपित करए चाहै छी, कृपा कऽ पाछाँ जाउ आ एकटा नव नाम चुनू।\n[[File:$1|thumb|center|$1]]", "file-exists-duplicate": "ई फाइल एकर {{PLURAL:$1|file|files}} द्वितीयक अछि:", "file-deleted-duplicate": "ऐ संचिका ([[:$1]]) सँ मेल खाइत संचिका पहिनहिये मेटा देल गेल अछि।\nअहाँ ओइ संचिकाक मेटाएल जएबाक इतिहास फेरसँ उपारोपित करबासँ पहिने देखू।", + "file-deleted-duplicate-notitle": "ऐ स पहिले इ फाइलके अहिने एगो फाइलके हटाएल गेल अछि , आर शीर्षक नुकाएल गेल अछि।\nएकरा फेर स अपलोड करै स पहिले अहाँ कोनो एहन व्यक्ति स स्थितिके समीक्षा करै लेल कहु जेकरा लंग नुकाएल गेल फाइल देखवाक क्षमता अछि।", "uploadwarning": "उपारोपण चेतौनी", "uploadwarning-text": "कृपा कऽ नीचाँ देल संचिका वर्णनकेँ संशोधित करू आ फेरसँ प्रयास करू।", "savefile": "संचिका संरक्षण करू", - "uploadedimage": "अपलोड भेल \"[[$1]]\"", - "overwroteimage": "एकर \"[[$1]]\" नव संस्करण उपारोपित भेल।", "uploaddisabled": "उपारोपण सभ अशक्त कएल गेल।", "copyuploaddisabled": "सार्वत्रिक विभव संकेत उपारोपण अशक्त कएल गेल।", "uploaddisabledtext": "संचिका उपारोपण सभ अशक्त अछि।", "php-uploaddisabledtext": "पी.एच.पी.मे संचिका उपारोपण अशक्त अछि।\nकृपा कऽ संचिका उपारोपण विकल्प जाँचू।", "uploadscripted": "ई संचिका पर्यंकभाषा वा कूटलिपि युक्त अछि जे गवेषक द्वारा गलत रूपमे व्याख्यायित कएल जा सकैए।", + "uploadscriptednamespace": "इ एस॰वी॰जी फाइलमे अमान्य नामस्थान \"$1\" अछि।", + "uploadinvalidxml": "अपलोड केएल गेल फाइलमे स्थित XML पार्स नै केएल जा सकैत अछि।", "uploadvirus": "ई संचिका विषविधियुक्त अछि।\nवर्णन:$1", "uploadjava": "ई संचिका एकटा संकुचित संचिका अछि जइमे अछि एकटा जावा .class संचिका।\nजावा संचिका सभक उपारोपण प्रतिबन्धित अछि, कारण ओ सभ सुरक्षा प्रतिबन्ध सभ छी जकरासँ ई तड़पल जा सकैए।", "upload-source": "मूल संचिका", @@ -1084,6 +1252,25 @@ "upload-misc-error-text": "उपारोपण काल एकटा विचित्र भ्रम आएल।\nकृपा कऽ जाँचू कि सार्वत्रिक विभव संकेत मान्य आ प्रवेश-उपयुक्त अछि आ फेरसँ प्रयास करू।\nजँ समस्या रहिते अछि तँ [[Special:ListUsers/sysop|संचालक]] सँ सम्पर्क करू।", "upload-too-many-redirects": "ई सार्वत्रिक विभव संकेत बड्ड बेसी घुमौआ लागिक संग अछि।", "upload-http-error": "परिसंविद भ्रम आएल:$1", + "upload-copy-upload-invalid-domain": "कपि अपलोड इ डोमेन स उपलब्ध नै अछि।", + "backend-fail-stream": "\"$1\" केँ नै स्ट्रिम क सकल।", + "backend-fail-backup": "\"$1\" केँ नै ब्याकअप क सकल।", + "backend-fail-notexists": "फाइल $1 नै अछि।", + "backend-fail-hashes": "तुलना के लेल फाइलसहके हैश नै मिलल।", + "backend-fail-notsame": "एकटा गैर-समान फाइल $1 मे पहिले स अछि।", + "backend-fail-invalidpath": "$1 मान्य भंडारण पथ नै छी।", + "backend-fail-delete": "\"$1\" फाइल केँ नै मेटा सकल।", + "backend-fail-describe": "फाइल \"$1\" के मेटाडाटा बदल नै सकल।", + "backend-fail-alreadyexists": "फाइल $1 पहिने स अछि।", + "backend-fail-store": "फाइल $1, $2 मे संग्रहीत नै कऽ सकल।", + "backend-fail-copy": "फाइल $1 के $2 मे प्रतिलिपि नै कऽ सकल।", + "backend-fail-move": "फाइल $1 सऽ $2 मे स्थानांतरित नै भऽ सकल।", + "backend-fail-opentemp": "अस्थायी संचिका नै खोइज सकल।", + "backend-fail-writetemp": "अस्थायी संचिका पर नै लिखाल जा सकल।", + "backend-fail-closetemp": "अस्थायी संचिका नै बन्द भऽ सकल।", + "backend-fail-read": "फाइल $1 पैढ नै जा सकल ।", + "backend-fail-create": "फाइल $1 नै लिखल जा सकल।", + "backend-fail-maxsize": "फाइल $1 नै लिखल जा सकल कियाक कि ई {{PLURAL:$2|$2 बाईट}} सऽ बडका अछि।", "zip-file-open-error": "संकुचित संचिका जाँचमे संचिका खोललापर एकटा भ्रम आएल।", "zip-wrong-format": "खास संचिका संकुचित संचिका नै छी।", "zip-bad": "ई संचिका एकटा टूटल आ ओहिनो बिन पढ़बा योग्य संकुचित फाइल छी।", @@ -1123,6 +1310,7 @@ "license-nopreview": "(पूर्वावलोकन उपलब्ध नै अछि)", "upload_source_url": "(एकटा मान्य, सार्वजनिक प्रवेशबला सार्वत्रिक विभव संकेत)", "upload_source_file": "(अहाँक संगणकपर एकटा संचिका)", + "listfiles-delete": "मिटाउ", "listfiles-summary": "ई विशिष्ट पन्ना सभटा उपारोपित संचिका देखबैए।\nप्रयोक्ता द्वारा चुनलापर अन्तिम उपारोपित संचिका देखबैत अछि।", "listfiles_search_for": "ऐ दृश्य-श्रव्य नामले ताकू:", "imgfile": "संचिका", @@ -1134,6 +1322,9 @@ "listfiles_size": "आकार", "listfiles_description": "वर्णन", "listfiles_count": "संस्करण सभ", + "listfiles-latestversion": "बर्तमान भर्जन", + "listfiles-latestversion-yes": "हँ", + "listfiles-latestversion-no": "नै", "file-anchor-link": "संचिका", "filehist": "फाइल इतिहास", "filehist-help": "तखुनका तिथि/ समए पर क्लिक करू जखुनका फाइल देखबाक अछि", @@ -1272,7 +1463,16 @@ "protectedpages": "संरक्षित पन्ना सभ", "protectedpages-indef": "अनन्तकालिक सुरक्षा मात्र", "protectedpages-cascade": "तराउपड़ी सुरक्षा मात्र", + "protectedpages-noredirect": "पुनर्निर्देश नुकाऊँ", "protectedpagesempty": "कोनो पन्ना ऐ सभ परिमिति लेल सुरक्षित नै राखल गेल अछि।", + "protectedpages-timestamp": "समएकाल", + "protectedpages-page": "पृष्ठ", + "protectedpages-expiry": "खतम हएत:", + "protectedpages-performer": "सुरक्षित करै वाला सदस्य", + "protectedpages-params": "सुरक्षा प्राचल", + "protectedpages-reason": "कारण:", + "protectedpages-unknown-timestamp": "अज्ञात", + "protectedpages-unknown-performer": "अज्ञात सदस्य", "protectedtitles": "संरक्षित शीर्षक सभ", "protectedtitlesempty": "कोनो पन्ना ऐ सभ परिमिति लेल सुरक्षित नै राखल गेल अछि।", "listusers": "प्रयोक्ता सूची", @@ -1319,6 +1519,7 @@ "allpagesprefix": "उपसर्गक संग दृश्य पन्ना सभ:", "allpagesbadtitle": "देल पन्नाक शीर्षक गलत, गलत सम्बन्धित अन्तर-भाषा अन्तर विकी शीर्षक छी। ई एक वा बेशी कलाकार युक्त भऽ सकैए जे शीर्षकमे प्रयुक्त नै कएल जा सकैए।", "allpages-bad-ns": "{{जालस्थल}} मे \"$1\" नामगाम नै अछि।", + "cachedspecial-refresh-now": "लब्का देखु", "categories": "संवर्ग सभ", "categoriespagetext": "ई {{PLURAL:$1|संवर्गमे अछि|संवर्ग सभमे अछि}} पन्ना वा मीडिया।\n[[Special:UnusedCategories|Unused categories]] एतए देखाएल नै अछि।\nईहो देखू [[Special:WantedCategories|wanted categories]]।", "categoriesfrom": "पन्ना प्रदर्शन प्रारम्भ भेल:", @@ -1360,6 +1561,10 @@ "listgrouprights-removegroup-self": "निकालू {{PLURAL:$2|वर्ग|वर्ग}} अपन खातामे: $1", "listgrouprights-addgroup-self-all": "सभटा वर्गकेँ अपन खातामे जोड़ू", "listgrouprights-removegroup-self-all": "सभटा वर्गकेँ अपन खातासँ निकालू", + "listgrouprights-namespaceprotection-header": "नामस्थान वर्जित", + "listgrouprights-namespaceprotection-namespace": "नामस्थान :", + "listgrouprights-namespaceprotection-restrictedto": "सांच(सभ) के संपादन करए लेल", + "trackingcategories": "श्रेणीके ट्रयाक करु", "mailnologin": "कोनो पठेबाक पता नै", "mailnologintext": "अहाँ [[Special:UserLogin|सम्प्रवेशित]] हेबाक चाही आ अहाँक विकल्प [[Special:Preferences|preferences]] मे एकटा मान्य ई-पत्र संकेत दोसर प्रयोक्ताकेँ पठेबा लेल हेबाक चाही।", "emailuser": "ऐ प्रयोक्ताकेँ ई-पत्र पठाउ", @@ -1408,6 +1613,7 @@ "watchlist-details": "{{PLURAL:$1|$1 पन्ना|$1 पन्ना सभ}} अहाँक साकांक्षसूचीमे, चौबटिया पन्ना नै गानल गेल।", "wlheader-enotif": "ई-पत्र सूचना लागू अछि।", "wlheader-showupdated": "पन्ना सभ जे अहाँक एतए अन्तिम बेर अएलाक बाद बदलल अछि तकर सूची देल अछि '''गाढ़''' मे", + "wlnote": "नीचाँ {{PLURAL:$1|is the last change|are the last '''$1''' changes}} अन्तिम {{PLURAL:$2|hour|'''$2''' hours}} $3, $4 जेना।", "wlshowlast": "देखाउ अन्तिम $1 घण्टा $2 दिन $3", "watchlist-options": "साकांक्षसूचीक विकल्प सभ", "watching": "ताकिमे...", @@ -1418,7 +1624,7 @@ "enotif_lastvisited": "देखू $1 अपन अन्तिम बेर अएलाक बादक परिवर्तन लेल।", "enotif_lastdiff": "ऐ परिवर्तनकेँ देखबा लेल $1 देखू।", "enotif_anon_editor": "गुप्त प्रयोक्ता $1", - "enotif_body": "प्रिय $WATCHINGUSERNAME,\n\n\nई {{अन्तर्जाल}} पन्ना $पन्नाशीर्षक $CHANGEDORCREATED कएल गेल $PAGEEDITDATE तिथिकेँ $PAGEEDITOR द्वारा, देखू $PAGETITLE_URL वर्तमान संस्करण लेल।\n\n$NEWPAGE\n\nसम्पादकीय: $PAGESUMMARY $PAGEMINOREDIT\n\nसम्पादकसँ सम्पर्क करू:\nई-पत्र: $PAGEEDITOR_EMAIL\nविकी: $PAGEEDITOR_WIKI\n\nआन परिवर्तन भेलापर कोनो सूचना नै देल जाएत जँ अहाँ ई पन्ना नै देखब।\nअपन साकांक्ष सूचीक सूचना पेबाक प्रकार अहाँ बदलि सकै छी।\n\n अहाँक प्रिय {{ान्तर्जाल}} सूचना प्रणाली\n\n--\nअपन ई-पत्र सूचना प्रकार बदलबाक लेल देखू\n{{canonicalurl:{{#special:Preferences}}}}\nअपन साकांक्ष-सूची सूचना प्रकार बदलबाक लेल देखू\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nअपन साकांक्ष-सूचीसँ कोनो पन्ना मेटेबाक लेल देखू\n$UNWATCHURL\n\nअपन अनुभव बतेबा वा कोनो सहायता लेल:\n$HELPPAGE", + "enotif_body": "प्रिय $WATCHINGUSERNAME,\n\n\nई {{अन्तर्जाल}} पन्ना $पन्नाशीर्षक $CHANGEDORCREATED कएल गेल $PAGEEDITDATE तिथिकेँ $PAGEEDITOR द्वारा, देखू $PAGETITLE_URL वर्तमान संस्करण लेल।\n\n$NEWPAGE\n\nसम्पादकीय: $PAGESUMMARY $PAGEMINOREDIT\n\nसम्पादकसँ सम्पर्क करू:\nई-पत्र: $PAGEEDITOR_EMAIL\nविकी: $PAGEEDITOR_WIKI\n\nआन परिवर्तन भेलापर कोनो सूचना नै देल जाएत जँ अहाँ ई पन्ना नै देखब।\nअपन साकांक्ष सूचीक सूचना पेबाक प्रकार अहाँ बदलि सकै छी।\n\n अहाँक प्रिय {{अंतर्जाल}} सूचना प्रणाली\n\n--\nअपन ई-पत्र सूचना प्रकार बदलबाक लेल देखू\n{{canonicalurl:{{#special:Preferences}}}}\nअपन साकांक्ष-सूची सूचना प्रकार बदलबाक लेल देखू\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nअपन साकांक्ष-सूचीसँ कोनो पन्ना मेटेबाक लेल देखू\n$UNWATCHURL\n\nअपन अनुभव बतेबा वा कोनो सहायता लेल:\n$HELPPAGE", "created": "बनाएल गेल", "changed": "बदलल गेल", "deletepage": "पन्ना मेटाउ", @@ -1843,6 +2049,7 @@ "import-logentry-upload-detail": "$1 {{PLURAL:$1|सुधार|सुधार सभ}}", "import-logentry-interwiki": "$1 क विकीअन्तरण", "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|सुधार|सुधार सभ}} $2 सँ", + "javascripttest": "जावास्क्रिप्ट परिक्षण", "tooltip-pt-userpage": "अहाँक खेसरा पन्ना", "tooltip-pt-anonuserpage": "सम्पाद्न कएल जा रहल स्थानक अनिकेतक प्रयोक्ता पन्ना", "tooltip-pt-mytalk": "अहाँक वार्त्ता पृष्ठ", @@ -1925,6 +2132,7 @@ "spam_blanking": "सभटा संशोधन $1 लागिसँ युक्त अि, खतम कऽ रहल छी", "pageinfo-title": "\"$1\"पृष्ठक लेल नब गप", "pageinfo-header-edits": "संपादन", + "pageinfo-header-restrictions": "पन्ना संरक्षण", "pageinfo-views": "देखहि बला के संख्या", "pageinfo-watchers": "जानकारक संख्या", "pageinfo-edits": "सम्पादनक संख्या", @@ -2417,11 +2625,11 @@ "duplicate-defaultsort": "'''चेतौनी:''' पूर्वनिर्धारित विन्यास चाभी \"$2\" पहिलुका पूर्वनिर्धारित विन्यास चाभी \"$1\" केँ खतम करैए।", "version": "संस्करण", "version-extensions": "संस्करणक आगाँ", + "version-skins": "रूप", "version-specialpages": "खास पन्ना", "version-parserhooks": "पार्सर हूक", "version-variables": "विकारी", "version-antispam": "अनिष्ट संदेश प्रतिबन्ध", - "version-skins": "रूप", "version-other": "आन", "version-mediahandlers": "मीडिया संचालक", "version-hooks": "हूक", @@ -2430,13 +2638,26 @@ "version-hook-name": "खुट्टीक नाम", "version-hook-subscribedby": "ई सदस्यता लेलनि", "version-version": "(संस्करण $1)", + "version-no-ext-name": "[कोनो नाम नै]", "version-license": "अधिकार", + "version-ext-license": "अधिकार", + "version-ext-colheader-name": "एक्सटेंसन", + "version-skin-colheader-name": "रूप", + "version-ext-colheader-version": "संस्करण", + "version-ext-colheader-license": "अधिकार", + "version-ext-colheader-description": "विवरण", + "version-ext-colheader-credits": "लेखक", + "version-license-title": "$1 के लेल अधिकार", + "version-credits-title": "$1 के लेल श्रेय", "version-poweredby-credits": "ई विकी चालित अछि '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2", "version-poweredby-others": "आन", + "version-poweredby-translators": "translatewiki.net अनुवादक", + "version-credits-summary": "[[Special:Version|मिडियाविकि]]", "version-license-info": "मीडियाविकी एकटा मंगनीक तंत्रांश अछि; अहाँ एकरा बाँटि सकै छी आ/ वा संशोधित कऽ सकै छीगी.एन.यू. सामान्य जन लाइसेन्सक अन्तर्गत जेना फ्री सॉफ्टवेयर फाउन्डेशन एकरा प्रकाशित केने अछि; चाहे तँ लाइसेन्सक संस्करण २, वा (अहाँक विकल्पपर) कोनो बादक दोसर संस्करणक अन्तर्गत।\n\nमीडियाविकी ऐ आशामेँ बाँटल जा रहल अछि कि ई उपयोगी हएत, मुदा बिना कोनो गारन्टीक; बिना कोनो व्यापारिक अन्तर्निहित वारन्टीक वा कोनो विशेष काजक लेल उपयोगी हेबाले। देखू गी.एन.यू. सामान्य जन लाइसेन्स विशेष वर्णन लेल।\n\nअहाँ प्राप्त केने हएब [{{SERVER}}{{SCRIPTPATH}}/ अनुकरण गी.एन.यू. सामान्य जन लाइसेन्सक प्रति] ऐ तंत्रांशक संग; जँ नै, लिखू फ्री सॉफ्टवेयर फाउन्डेशन, आइ.एन.सी., ५१, फ्रैंकलिन स्ट्रीट, पाँचम तल, बोस्टन, एम.ए. ०२११०-१३०१, यू.एस.ए. वा [//www.gnu.org/licenses/old-licenses/gpl-2.0.html अन्तर्भूत पढ़बा लेल]।", "version-software": "प्रतिष्ठापित तंत्रांश", "version-software-product": "उत्पाद", "version-software-version": "संस्करण", + "version-entrypoints-header-url": "यू॰आर॰एल", "fileduplicatesearch": "द्वितीयक संचिका ताकू", "fileduplicatesearch-summary": "हैश मानक आधारपर द्वितीयक संचिका ताकू।", "fileduplicatesearch-legend": "द्वितीयक ताकू", @@ -2471,7 +2692,10 @@ "tags-tag": "चेन्हक नाम", "tags-display-header": "परिवर्तन सूची सभक रूपरंग", "tags-description-header": "अर्थक पूर्ण विवरण", + "tags-active-header": "सक्रिय?", "tags-hitcount-header": "चेन्हयुक्त परिवर्तन सभ", + "tags-active-yes": "हँ", + "tags-active-no": "नै", "tags-edit": "सम्पादन करू", "tags-hitcount": "$1 {{PLURAL:$1|परिवर्तन|परिवर्तन सभ}}", "comparepages": "पन्ना सभक तुलना करू", @@ -2486,6 +2710,7 @@ "dberr-problems": "दुखी छी! ई जालस्थल तकनीकी समस्या अनुभव कऽ अछि।", "dberr-again": "किछु काल बाट ताकू आ फेरसँ भारित करू।", "dberr-info": "(दत्तनिधि वितरककेँ सम्पर्क नै कऽ सकल: $1)", + "dberr-info-hidden": "(दत्तनिधि वितरककेँ सम्पर्क नै कऽ सकल: $1)", "dberr-usegoogle": "ऐ बीचमे अहाँ गूगलसँ खोज कऽ सकै छी।", "dberr-outofdate": "मोन राखू जे हमर सामिग्रीक ओकर सूची पुरान भऽ सकैए।", "dberr-cachederror": "ई आग्रह कएल पन्नाक उपस्मृति संरक्षित द्वितीयक अछि, आ भऽ सकैए जे अद्यतन नै हुअए।", @@ -2499,6 +2724,11 @@ "htmlform-submit": "दिअ", "htmlform-reset": "परिवर्तन खतम करू", "htmlform-selectorother-other": "आन", + "htmlform-no": "नै", + "htmlform-yes": "हँ", + "htmlform-chosen-placeholder": "एकटा विकल्प चुनु", + "htmlform-cloner-create": "आर जोडु", + "htmlform-cloner-delete": "हटाउ", "sqlite-has-fts": "$1 पूर्ण-पाठ खोज सहायता युक्त", "sqlite-no-fts": "$1 बिन पूर्ण-पाठ खोज सहायताक", "logentry-delete-delete": "$1 {{लिंग:$2|deleted}} page $3", @@ -2531,6 +2761,16 @@ "logentry-newusers-create2": "$1 {{लिंग:$2|बनाएल}} {{लिंग:$4|एकटा प्रयोक्ता खाता}} $3", "logentry-newusers-autocreate": "खाता $1 छल {{लिंग:$2|बनाएल}} स्वतः", "rightsnone": "(कोनो नै)", + "feedback-subject": "विषय:", + "feedback-message": "संदेश:", + "feedback-cancel": "रद्द करु", + "feedback-submit": "प्रतिक्रिया भेजु", + "feedback-adding": "पन्ना उपर प्रतिक्रिया जोडु ...", + "feedback-error2": "त्रुटि: संपादन विफल भेल", + "feedback-close": "भ गेल", + "feedback-bugcheck": "बहुत निक! जांच करु कि [ $1 known bugs] पहिले स त नै अछि ।", + "searchsuggest-search": "ताकू", + "searchsuggest-containing": "...सऽ युक्त", "api-error-badaccess-groups": "अहि विकी सें अहां कोनो प्रारूप लोड नहि क सकब.", "api-error-filename-tooshort": "ई संचिका नाम बड छोट अछि |", "api-error-filetype-banned": "ऐ तरहक संचिका नाम प्रतिबंधित अछि।", @@ -2542,5 +2782,7 @@ "api-error-ok-but-empty": "आन्तरिक भ्रम: वितरकसँ कोनो सम्पर्क नै", "api-error-unclassified": "एकटा अबूझ भ्रम आएल", "api-error-unknown-code": "अबूझ भ्रम:\"$1\"", - "api-error-uploaddisabled": "ऐ विकीपर उपारोपण अशक्त कएल गेल अछि।" + "api-error-uploaddisabled": "ऐ विकीपर उपारोपण अशक्त कएल गेल अछि।", + "pagelang-name": "पन्ना", + "pagelang-language": "भाषा" } diff --git a/languages/i18n/mdf.json b/languages/i18n/mdf.json index 57fe8cfc79..bdd44604bb 100644 --- a/languages/i18n/mdf.json +++ b/languages/i18n/mdf.json @@ -103,6 +103,18 @@ "oct": "Кем", "nov": "Эйн", "dec": "Куч", + "january-date": "Кельмеков $1", + "february-date": "Уфайков $1", + "march-date": "Марайков $1", + "april-date": "Шудиков $1", + "may-date": "Панжиков $1", + "june-date": "Лямбеков $1", + "july-date": "Псиков $1", + "august-date": "Сёроньков $1", + "september-date": "Тюжягов $1", + "october-date": "Кельмазаков $1", + "november-date": "Эйндамков $1", + "december-date": "Кучкаков $1", "pagecategories": "{{PLURAL:$1|Категорие|Категориет}}", "category_header": "\"$1\" категориеса лопатне", "subcategories": "Субкатегориет", @@ -125,8 +137,9 @@ "newwindow": "(панчсеви од вальмаса)", "cancel": "Мърдамс меки", "moredotdotdot": "Сяда лама...", - "mypage": "Монь лопазе", - "mytalk": "Монь корхтамазе", + "morenotlisted": "Лемгярькссь апак тик", + "mypage": "Лопазе", + "mytalk": "Корхтамазе", "anontalk": "Корхтамс тя IP-ть мархта", "navigation": "Навигацие", "and": " эди", @@ -140,6 +153,7 @@ "actions": "Тефне", "namespaces": "Лемботмот", "variants": "Вариатт", + "navigation-heading": "Навигациень меню", "errorpagetitle": "Эльбятькс", "returnto": "Мърдамс $1-с.", "tagline": "{{SITENAME}}ста", @@ -155,12 +169,16 @@ "permalink": "Ялань сюлмафкс", "print": "Нолдамс", "view": "Ваномс", + "view-foreign": "Ванк $1са", "edit": "Петнеме", + "edit-local": "Петнемс тя азондомать", "create": "Тиемс", + "create-local": "Поладомс азондомать", "editthispage": "Петнемс тя лопать", "create-this-page": "Тиемс тя лопать", "delete": "Нардамс", "deletethispage": "Нардамс тя лопать", + "undeletethispage": "Мърдафтомс лопать", "undelete_short": "Мърдафтомс {{PLURAL:$1|петнема|$1 петнемат}}", "viewdeleted_short": "Ваномс {{PLURAL:$1|фкя нардаф видептема|$1 нардаф видептемат}}", "protect": "Араламс", @@ -173,11 +191,10 @@ "talkpagelinktext": "Корхтама", "specialpage": "Башка тевонь лопа", "personaltools": "Эсь кядьёнкст", - "postcomment": "Од пакш", "articlepage": "Ваномс потмакслопать", "talk": "Корхнема", "views": "Ванфт", - "toolbox": "Кядьёнкс кярькс", + "toolbox": "Кядьёнкст", "userpage": "Ваномс тиить лопанц", "projectpage": "Ваномс проектть лопанц", "imagepage": "Ваномс файлонь лопать", @@ -196,12 +213,14 @@ "jumptonavigation": "навигацие", "jumptosearch": "вешендема", "view-pool-error": "Ужяль, тя пингть серверхнень вийсна аф сатовихть.\nВельф лама тиихть тяряфнихть ваномс тя лопать.\nЭняльттяма учт аф ламос тя лопанди одукс сама инголе.\n$1", + "generic-pool-error": "Ужяль, тя пингть серверхнень вийсна аф сатыхть.\nВельф лама тиида тяряфнихть ваномс тя лопать лангс.\nЭняльттяма учт аф ламос тя лопанди одукс самда инголе.", "pool-timeout": "Пигонь кирдемась учи пякстаманц", "pool-queuefull": "Тяряфнемада вельф лама", "pool-errorunknown": "Аф содаф эльбятькс", + "pool-servererror": "Пърдафкс лувома лезкссь аф сатови ($1).", "aboutsite": "{{SITENAME}} колга", "aboutpage": "Project:Колга", - "copyright": "Сёрматфсь ули кода мумс $1-са.", + "copyright": "Сёрматфсь ули кода мумс $1са, къда илякс апак аст.", "copyrightpage": "{{ns:project}}:Копияма видекст", "currentevents": "Мезе тяса моли", "currentevents-url": "Project:Мезе тяса моли", @@ -268,6 +287,7 @@ "nospecialpagetext": "Аш стама башка лопа.\n\nВанк [[Special:SpecialPages|{{int:specialpages}}]].", "error": "Эльбятькс", "databaseerror": "Датабаза эльбятькс", + "databaseerror-text": "Содамошинь паргонь вешемста лиссь эльбятькс.\nУлема, програмонь лездомбяльсь аржиясь.", "laggedslavemode": "Шарфтк мяльце: Тя лопась, улема, сирелгодсь.", "readonly": "Датабазась пякстаф", "enterlockreason": "Сёрматк тязк пякстама туфтал тонь арьсемацень мархта эли няфтть тяса мъзярда ули кода пякстамать валхтомс.", @@ -327,7 +347,6 @@ "externaldberror": "Лиссь эльбятькс ушеширень датабазонь вельде кемокстакшнембачк эли тондейть аф мярьгови полафнемс тонь ушеширень сёрматфтомацень.", "login": "Сувама", "nav-login-createaccount": "Сувама / сёрматфтома", - "loginprompt": "Тондейть эряви нолдамс тевс cookies {{SITENAME}}с суваманди.", "userlogin": "Сувама / сёрматфтома", "userloginnocreate": "Сувамс", "logout": "Лисема", @@ -632,7 +651,6 @@ "searchprofile-advanced-tooltip": "Вешендемс кърдань лемботмова", "search-result-size": "$1 ({{PLURAL:$2|1 вал|$2 валхт}})", "search-result-category-size": "{{PLURAL:$1|1 якай|$1 якайхть}} ({{PLURAL:$2|1 субкатегорие|$2 субкатегориет}}, {{PLURAL:$3|1 файла|$3 файлат}})", - "search-result-score": "Малавиксши: $1%", "search-redirect": "(шашфтт $1с)", "search-section": "(пялькс $1)", "search-suggest": "Афкукс тонь мяльсот: $1", @@ -921,8 +939,6 @@ "file-deleted-duplicate": "Файлсь сяка кода файл ([[:$1]]) нардафоль. Ванк файлонь нардама историянц сонь одукс тонгоманза инголе.", "uploadwarning": "Тонгодемань инголе кардама", "savefile": "Ванфтомс файл", - "uploadedimage": "тонгозь \"[[$1]]\"", - "overwroteimage": "тонгозь \"[[$1]]\" од верзиенц", "uploaddisabled": "Тонгодемать лоткозь", "uploaddisabledtext": "Файл тонгодемась лоткаф.", "uploadscripted": "Тя файлса ащи HTML эли програм, конат аф морафтовихть интернет полатксть вельде.", @@ -1191,6 +1207,7 @@ "watchlist-details": "{{PLURAL:$1|$1 лопа|$1 лопат}} мельгеваномацень ала корхнема лопат аф лувомок.", "wlheader-enotif": "Электрононь сёрма вельде пачфнема нолдаф тевс.", "wlheader-showupdated": "Лопат конань полафтозь тонь мекольце сувсемадот меле няфтевсть '''эчке тяшкса'''.", + "wlnote": "Ала {{PLURAL:$1|мекольце полафнема|'''$1''' мекольце полафнемат}} ётай {{PLURAL:$2| ойста (часста)|'''$2''' ойста (часста)}}.", "wlshowlast": "Няфтемс мекольце $1 ойхть (част) $2 шит $3", "watchlist-options": "Мельгеваномать латцемасна", "watching": "Ванома...", diff --git a/languages/i18n/mk.json b/languages/i18n/mk.json index 04bd3ecfe9..7423a38b4c 100644 --- a/languages/i18n/mk.json +++ b/languages/i18n/mk.json @@ -14,7 +14,8 @@ "Spacebirdy", "Urhixidur", "לערי ריינהארט", - "아라" + "아라", + "Milicevic01" ] }, "tog-underline": "Потцртување на врски:", @@ -271,6 +272,9 @@ "hidetoc": "скриј", "collapsible-collapse": "Собери", "collapsible-expand": "прикажи", + "confirmable-confirm": "Дали {{GENDER:$1|сте}} сигурни?", + "confirmable-yes": "Да", + "confirmable-no": "Не", "thisisdeleted": "Да прикажам или вратам $1?", "viewdeleted": "Да погледате $1?", "restorelink": "{{PLURAL:$1|едно избришано уредување|$1 избришани уредувања}}", @@ -357,7 +361,7 @@ "invalidtitle-knownnamespace": "Неважечки наслов со именски простор „$2“ и текст „$3“", "invalidtitle-unknownnamespace": "Неважечки наслов со именски простор бр. $1 и текст „$2“", "exception-nologin": "Не сте најавени", - "exception-nologin-text": "[[Special:Userlogin|Најавете се]] за да добиете пристап до страницата или дејството.", + "exception-nologin-text": "Најавете се за да добиете пристап до страницата или дејството.", "exception-nologin-text-manual": "Треба да сте $1 за да имате пристап до страницата или дејството.", "virus-badscanner": "Лоша поставка: непознат проверувач на вируси: ''$1''", "virus-scanfailed": "неуспешно скенирање (код $1)", @@ -672,10 +676,10 @@ "parser-template-recursion-depth-warning": "Пречекорена е границата на длабочината на рекурзијата во шаблонот ($1)", "language-converter-depth-warning": "Пречекорена е границата на длабочината на јазичниот претворач ($1)", "node-count-exceeded-category": "Страници каде е надминат бројот на јазли", - "node-count-exceeded-category-desc": "Категорија за страници каде е надминат бројот на јазли.", + "node-count-exceeded-category-desc": "Страницата го надминува максималниот број на јазли.", "node-count-exceeded-warning": "Страницата го надмина бројот на јазли", "expansion-depth-exceeded-category": "Страници каде е пречекорена длабочината на проширувањето", - "expansion-depth-exceeded-category-desc": "Ова е категорија наменета за страници со надмината длабочина на проширување.", + "expansion-depth-exceeded-category-desc": "Страницата ја надминува максималната длабочина на проширување.", "expansion-depth-exceeded-warning": "Страницата ја надмина длабочината на проширувањето", "parser-unstrip-loop-warning": "Утврдена е јамка", "parser-unstrip-recursion-limit": "Пречекорена е границата на рекурзија ($1)", @@ -684,7 +688,7 @@ "undo-failure": "Уредувањето не можеше да се откаже заради меѓувремени спротиставени уредувања.", "undo-norev": "Измената не можеше да биде вратена бидејќи не постои или била избришана.", "undo-nochange": "Се чини дека измената (уредувањето) е веќе вратена.", - "undo-summary": "Откажано уредувањето $1 на уредникот [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])", + "undo-summary": "Откажано уредувањето $1 на уредникот [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]])", "undo-summary-username-hidden": "Поништи ја преработката $1 на скриен корисник", "cantcreateaccounttitle": "Не може да се создаде корисничка сметка", "cantcreateaccount-text": "Создавањето на корисничка сметка од оваа IP-адреса ('''$1''') е блокирано од страна на [[User:$3|$3]].\n\nОбразложението дадено од страна на $3 е ''$2''", @@ -843,7 +847,6 @@ "searchprofile-advanced-tooltip": "Пребарување во именски простори по избор", "search-result-size": "$1 ({{PLURAL:$2|еден збор|$2 збора}})", "search-result-category-size": "{{PLURAL:$1|1 член|$1 члена}} ({{PLURAL:$2|1 поткатегорија|$2 поткатегории}}, {{PLURAL:$3|1 податотека|$3 податотеки}})", - "search-result-score": "Релевантност: $1%", "search-redirect": "(пренасочување $1)", "search-section": "(пасус $1)", "search-file-match": "(се совпаѓа со содржината на податотеката)", @@ -870,7 +873,7 @@ "preferences": "Нагодувања", "mypreferences": "нагодувања", "prefs-edits": "Број на уредувања:", - "prefsnologintext2": "Треба да сте $1 за да можете да ги поставувате корисничките нагодувања.", + "prefsnologintext2": "Најавете се за да ги измените корисничките нагодувања.", "prefs-skin": "Руво", "skin-preview": "Преглед", "datedefault": "Небитно", @@ -1249,8 +1252,6 @@ "uploadwarning": "Предупредување при подигање", "uploadwarning-text": "Изменете го описот на податотеката подолу и обидете се повторно.", "savefile": "Зачувај податотека", - "uploadedimage": "подигнато „[[$1]]“", - "overwroteimage": "подигнато нова верзија на „[[$1]]“", "uploaddisabled": "Забрана за подигања", "copyuploaddisabled": "Подигањето од URL е оневозможено.", "uploaddisabledtext": "Подигањето на податотеки е оневозможено.", @@ -1660,11 +1661,11 @@ "trackingcategories-desc": "Критериуми за вклучување", "noindex-category-desc": "Роботите не ја индексираат страницава бидејќи го содржи волшебниот збор __NOINDEX__ и се наоѓа во именски простор кајшто е дозволен.", "index-category-desc": "Страницата содржи __INDEX__ (и се наоѓа во именски простор кајшто ова е дозволено), па затоа се индексира од роботи, што инаку не би било.", - "post-expand-template-inclusion-category-desc": "По проширувањето на сите шаблони, страницата е поголема од $wgMaxArticleSize, па затоа некои шаблони не се проширени.", - "post-expand-template-argument-category-desc": "По проширување на шаблонски аргумент (нешто во тројни кадрави загради, како на пр. {{{Foo}}}), страницата е поголема од $wgMaxArticleSize.", - "expensive-parserfunction-category-desc": "Во страницата има премногу оптоварувачки расчленувачки функции (како #ifexist). Погл. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", - "broken-file-category-desc": "Категорјата се става ако страницата содржи неисправна податотечка врска (врска за вметнување на податотека што не постои).", - "hidden-category-category-desc": "Ова е категорија што содржи __HIDDENCAT__, што значи дека по основно не се прикажува во страниците.", + "post-expand-template-inclusion-category-desc": "Страницата е поголема од $wgMaxArticleSize по проширувањето на сите шаблони. Затоа, некои шаблони не се проширени.", + "post-expand-template-argument-category-desc": "Страницата е поголема од $wgMaxArticleSize по проширување на шаблонскиот аргумент (нешто во тројни кадрави загради, како {{{Foo}}}).", + "expensive-parserfunction-category-desc": "Страницата користи премногу оптоварувачки расчленувачки функции (како #ifexist). Погл. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", + "broken-file-category-desc": "Страницата содржи неисправна податотечна врска (врска за вметнување на податотека што не постои).", + "hidden-category-category-desc": "Категоријата содржи __HIDDENCAT__, што значи дека по основно не се прикажува во страниците.", "trackingcategories-nodesc": "Нема опис.", "trackingcategories-disabled": "Категоријата е оневозможена", "mailnologin": "Нема адреса за праќање", @@ -1701,7 +1702,7 @@ "mywatchlist": "Набљудувања", "watchlistfor2": "За $1 $2", "nowatchlist": "Немате ништо во списокот на набљудувања.", - "watchlistanontext": "Треба да сте $1 за да можете да го прегледувате и уредувате списокот на набљудувања.", + "watchlistanontext": "Најавете се за да можете да го прегледувате и уредувате списокот на набљудувања.", "watchnologin": "Не сте најавени", "addwatch": "Додај во списокот на набљудувања", "addedwatchtext": "Страницата „[[:$1]]“ е додадена во [[Special:Watchlist|списокот на набљудувања]].\nИдните промени на оваа страница и нејзината страница за разговор ќе се прикажуваат таму.", @@ -1765,6 +1766,7 @@ "delete-edit-reasonlist": "Уреди причини за бришење", "delete-toobig": "Оваа страница има долга историја на уредување, преку $1 {{PLURAL:$1|преработка|преработки}}.\nБришењето на ваквии страници е забрането со цел {{SITENAME}} да се заштити од оштетувања.", "delete-warning-toobig": "Оваа страница има долга историја на уредување, преку $1 {{PLURAL:$1|преработка|преработки}}.\nБришењето може да предизвика проблеми при работењето на базата на податоци на {{SITENAME}};\nпродолжете доколку сте сигруни дека треба тоа да го сторите.", + "delete-cantedit": "Не можете да ја избришете страницава зошто немате дозвола да ја уредувате.", "deleting-backlinks-warning": "'''Предупредување:''' До страницата што сакате да ја избришете водат [[Special:WhatLinksHere/{{FULLPAGENAME}}|други страници]] или пак се превметнуваат во неа.", "rollback": "Отповикај промени", "rollback_short": "Отповикај", @@ -1925,7 +1927,7 @@ "autoblockid": "Автоблок бр. $1", "block": "Блокирај корисник", "unblock": "Одблокирај корисник", - "blockip": "Блокирај корисник", + "blockip": "Блокирај {{GENDER:$1|корисник}}", "blockip-legend": "Блокирај корисник", "blockiptext": "Користете го долниот образец за да го забраните пристапот за пишување од одредена IP-адреса или корисничко име.\nОва единствено треба да се прави за да се спречи вандализам, во согласност со [[{{MediaWiki:Policy-url}}|правилата на Википедија]].\nИзберете конкретна причина подолу (на пр. наведувајќи ги страниците што биле вандализирани).", "ipaddressorusername": "IP-адреса или корисничко име:", @@ -1954,7 +1956,7 @@ "ipb-unblock-addr": "Одблокирај го $1", "ipb-unblock": "Одблокирај корисник или IP-адреса", "ipb-blocklist": "Преглед на активни блокирања", - "ipb-blocklist-contribs": "Придонеси на $1", + "ipb-blocklist-contribs": "Придонеси на {{GENDER:$1|$1}}", "unblockip": "Деблокирај корисник", "unblockiptext": "Користете го долниот образец да го вратите правото на пишување на претходно блокирана IP-адреса или корисничко име.", "ipusubmit": "Избриши го ова блокирање", @@ -3141,6 +3143,9 @@ "logentry-rights-rights": "$1 {{GENDER:$2|го измени}} групното членство на $3 од $4 во $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|го измени}} групното членство во $3", "logentry-rights-autopromote": "$1 автоматски {{GENDER:$2|унапреден|унапредена}} од $4 во $5", + "logentry-upload-upload": "$1 {{GENDER:$2|ја подигна}} $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|подигна}} нова верзија на $3", + "logentry-upload-revert": "$1 {{GENDER:$2|ја подигна}} $3", "rightsnone": "(нема)", "feedback-bugornote": "Ако сте спремни подробно да го опишете техничкиот проблем, тогаш [$1 пријавете грешка]. \nВо спротивно, послужете се со едноставниот образец подолу. Вашиот коментар ќе стои на страницата „[$3 $2]“, заедно со корисничкото име и прелистувачот што го користите.", "feedback-subject": "Наслов:", @@ -3243,5 +3248,9 @@ "action-pagelang": "менување јазик на страница", "log-name-pagelang": "Дневник на менување на јазикот", "log-description-pagelang": "Ова е дневник на менувања на јазикот на страницата.", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2|го смени}} јазикот на страницата $3 од $4 на $5." + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|го смени}} јазикот на страницата $3 од $4 на $5.", + "default-skin-not-found": "За жал, основното руво на вашето вики ($wgDefaultSkin) — $1 — не е достапно.\n\nВашата воспоставка ги опфаќа следниве рува. Погледајте [https://www.mediawiki.org/wiki/Manual:Skin_configuration Прирачник: Поставување на рува] за да дознаете како да ги вклучите и како да го изберете основното.\n\n$2\n\n; Ако штотуку го имате воспоставено МедијаВики:\n: Веројатно сте го воспоставиле од git, или пак непосредно од изворниот код на некој друг начин. Ова е очекувано. Пробајте да воспоставите некои рува од [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's именикот на рува] вака:\n* Со преземање на [https://www.mediawiki.org/wiki/Download tarball-воспоставувачот], кој самиот содржи неколку рува и додатоци. Можете да ја прекопирате папката skins/ од него.\n* Клонирајќи едно од складиштата mediawiki/skins/* преку git во папката skins/ на вашата воспоставка на МедијаВики.\n: Ова не би требало да прави пречки на вашето git-складиште ако сте програмер на МедијаВики.\n\n; Ако штотуку го имате надградено МедијаВики:\n: МедијаВики 1.24 и поновите верзии повеќе не ги вклучуваат воспоставените рува автоматски (погл. [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Прирачник: Самооткривање на рува]). Можете да ги прекопирате следниве редови во LocalSettings.php за да ги вклучите сите моментално воспоставени рува:\n\n
    $3
    \n\n; Ако штотуку го имате изменето LocalSettings.php:\n: Проверете дали правилно се напишани називите на рувата.", + "default-skin-not-found-no-skins": "За жал, основното руво на вашето вики ($wgDefaultSkin) — $1 — не е достапно.\n\nНемате воспоставено ниедно руво.\n\n; Ако штотуку го имате воспоставено или надградено МедијаВики:\n: Веројатно сте го воспоставиле од git, или пак непосредно од изворниот код на некој друг начин. Ова е очекувано. МедијаВики 1.24 и поновите верзии немаат рува во главното складиште. Пробајте да воспоставите некои рува од [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's именикот на рува] вака:\n:* Со преземање на [https://www.mediawiki.org/wiki/Download tarball-воспоставувачот], кој самиот содржи неколку рува и додатоци. Можете да ја прекопирате папката skins/ од него.\n: Ова не би требало да прави пречки на вашето git-складиште ако сте програмер на МедијаВики. Погледајте [https://www.mediawiki.org/wiki/Manual:Skin_configuration Прирачник: Поставување на рува] за да дознаете како да ги вклучите и како да го изберете основното.", + "default-skin-not-found-row-enabled": "* $1 / $2 (вклучено)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''исклучено''')" } diff --git a/languages/i18n/ml.json b/languages/i18n/ml.json index 12dd59be58..8eb34ad936 100644 --- a/languages/i18n/ml.json +++ b/languages/i18n/ml.json @@ -282,6 +282,9 @@ "hidetoc": "മറയ്ക്കുക", "collapsible-collapse": "ചുരുക്കുക", "collapsible-expand": "വികസിപ്പിക്കുക", + "confirmable-confirm": "{{GENDER:$1|താങ്കൾക്ക്}} ഉറപ്പാണോ?", + "confirmable-yes": "അതെ", + "confirmable-no": "അല്ല", "thisisdeleted": "$1 കാണുകയോ പുനഃസ്ഥാപിക്കുകയോ ചെയ്യേണ്ടതുണ്ടോ?", "viewdeleted": "$1 കാണണോ?", "restorelink": "{{PLURAL:$1|നീക്കംചെയ്ത ഒരു തിരുത്ത്|നീക്കംചെയ്ത $1 തിരുത്തുകൾ}}", @@ -850,7 +853,6 @@ "searchprofile-advanced-tooltip": "തിരഞ്ഞെടുത്ത നാമമേഖലകളിൽ തിരച്ചിൽ നടത്തുവാൻ", "search-result-size": "$1 ({{PLURAL:$2|ഒരു വാക്ക്|$2 വാക്കുകൾ}})", "search-result-category-size": "{{PLURAL:$1|ഒരു അംഗം|$1 അംഗങ്ങൾ}} ({{PLURAL:$2|ഒരു ഉപവർഗ്ഗം|$2 ഉപവർഗ്ഗങ്ങൾ}}, {{PLURAL:$3|ഒരു പ്രമാണം|$3 പ്രമാണങ്ങൾ}})", - "search-result-score": "സാംഗത്യം: $1%", "search-redirect": "(തിരിച്ചുവിടൽ താൾ $1)", "search-section": "(വിഭാഗം $1)", "search-file-match": "(പ്രമാണ ഉള്ളടക്കവുമായി ഒത്തുപോകുന്നുണ്ട്)", @@ -1254,8 +1256,6 @@ "uploadwarning": "അപ്‌ലോഡ് മുന്നറിയിപ്പ്", "uploadwarning-text": "ദയവായി താഴെയുള്ള പ്രമാണ വിവരണങ്ങൾ പുതുക്കി വീണ്ടും ശ്രമിക്കുക.", "savefile": "പ്രമാണം കാത്ത് സൂക്ഷിക്കുക", - "uploadedimage": "\"[[$1]]\" അപ്‌ലോഡ് ചെയ്തു.", - "overwroteimage": "\"[[$1]]\" എന്ന പ്രമാണത്തിന്റെ പുതിയ പതിപ്പ് അപ്‌ലോഡ് ചെയ്തിരിക്കുന്നു", "uploaddisabled": "അപ്‌ലോഡുകൾ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു.", "copyuploaddisabled": "യൂ.ആർ.എൽ. വഴിയുള്ള അപ്‌‌ലോഡ് നിർജ്ജീവമാക്കിയിരിക്കുന്നു.", "uploaddisabledtext": "പ്രമാണം അപ്‌ലോഡ് ചെയ്യുന്നതു സാദ്ധ്യമല്ലാതാക്കിയിരിക്കുന്നു.", @@ -3017,6 +3017,9 @@ "logentry-rights-rights": "$3 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം, $4 എന്നതിൽ നിന്നു $5 എന്നതിലേക്കു, $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}", "logentry-rights-rights-legacy": "$3 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}", "logentry-rights-autopromote": "$1 എന്ന ഉപയോക്താവ് $4 എന്നതിൽ നിന്നും $5 എന്നതിലേയ്ക്ക് സ്വയമേവ {{GENDER:$2|ഉയർത്തപ്പെട്ടിരിക്കുന്നു}}", + "logentry-upload-upload": "$1 $3 {{GENDER:$2|അപ്‌ലോഡ് ചെയ്തു}}", + "logentry-upload-overwrite": "$1 ഒരു പുതിയ പതിപ്പ് $3 {{GENDER:$2|അപ്‌ലോഡ് ചെയ്തു}}", + "logentry-upload-revert": "$1 $3 {{GENDER:$2|അപ്‌ലോഡ് ചെയ്തു}}", "rightsnone": "(ഒന്നുമില്ല)", "feedback-bugornote": "സാങ്കേതിക പ്രശ്നം എന്താണെന്ന് വിവരിച്ചെഴുതാൻ താങ്കൾ തയ്യാറാണെങ്കിൽ [$1 ബഗ് അറിയിക്കുക].\nഅല്ലെങ്കിൽ താങ്കൾക്ക് താഴെ എളുപ്പത്തിനായി നൽകിയിരിക്കുന്ന ഫോം ഉപയോഗിക്കാം. താങ്കളുടെ കുറിപ്പ് \"[$3 $2]\" താളിൽ, താങ്കളുടെ ഉപയോക്തൃനാമത്തിന്റെയും ഉപയോഗിക്കുന്ന ബ്രൗസറിന്റെ പേരിന്റെയും ഒപ്പം ചേർക്കുന്നതായിരിക്കും.", "feedback-subject": "വിഷയം:", @@ -3119,5 +3122,7 @@ "action-pagelang": "താളിന്റെ ഭാഷ മാറ്റുക", "log-name-pagelang": "ഭാഷ മാറ്റലിന്റെ രേഖ", "log-description-pagelang": "താളുകളുടെ ഭാഷകൾ മാറ്റിയതിന്റെ രേഖകൾ ഇവിടെക്കാണാം.", - "logentry-pagelang-pagelang": "$3 എന്ന താളിന്റെ ഭാഷയായിരുന്ന $4, $1 $5 ആയി {{GENDER:$2|മാറ്റി}}." + "logentry-pagelang-pagelang": "$3 എന്ന താളിന്റെ ഭാഷയായിരുന്ന $4, $1 $5 ആയി {{GENDER:$2|മാറ്റി}}.", + "default-skin-not-found-row-enabled": "* $1 / $2 (സജ്ജം)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''സജ്ജമല്ല''')" } diff --git a/languages/i18n/ms.json b/languages/i18n/ms.json index 79ea47a96b..b68f8d7494 100644 --- a/languages/i18n/ms.json +++ b/languages/i18n/ms.json @@ -35,6 +35,7 @@ "tog-watchdefault": "Tambahkan laman dan fail yang saya sunting ke dalam senarai pantau", "tog-watchmoves": "Tambahkan laman dan fail yang saya pindahkan ke dalam senarai pantau", "tog-watchdeletion": "Tambahkan laman dan fail yang saya hapuskan ke dalam senarai pantau", + "tog-watchrollback": "Tambah laman-laman di mana saya telah membuat unduran ke senarai pantau saya", "tog-minordefault": "Tandakan semua suntingan sebagai kecil secara asali", "tog-previewontop": "Tunjukkan pralihat di atas kotak sunting", "tog-previewonfirst": "Tunjukkan pralihat pada suntingan pertama", @@ -273,6 +274,9 @@ "hidetoc": "sorokkan", "collapsible-collapse": "Lipat", "collapsible-expand": "Kembangkan", + "confirmable-confirm": "Pastikah {{GENDER:$1|anda}}?", + "confirmable-yes": "Ya", + "confirmable-no": "Tidak", "thisisdeleted": "Lihat atau pulihkan $1?", "viewdeleted": "Lihat $1?", "restorelink": "{{PLURAL:$1|satu|$1}} suntingan dihapuskan", @@ -359,7 +363,7 @@ "invalidtitle-knownnamespace": "Tajuk tidak sah dengan ruang nama \"$2\" dan teks \"$3\"", "invalidtitle-unknownnamespace": "Tajuk tidak sah dengan nombor ruang nama tidak dikenali $1 dan teks \"$2\"", "exception-nologin": "Belum log masuk", - "exception-nologin-text": "Sila [[Special:Userlogin|log masuk]] untuk dapat mengakses halaman atau tindakan ini.", + "exception-nologin-text": "Sila log masuk untuk mendapat akses kepada laman atau tindakan ini.", "exception-nologin-text-manual": "Sila $1 untuk dapat mengakses halaman atau tindakan ini.", "virus-badscanner": "Konfigurasi rosak: pengimbas virus yang tidak diketahui: ''$1''", "virus-scanfailed": "pengimbasan gagal (kod $1)", @@ -674,7 +678,7 @@ "parser-template-recursion-depth-warning": "Had pengulangan templat dilebihi ($1)", "language-converter-depth-warning": "Had kedalaman penukar bahasa dilepasi ($1)", "node-count-exceeded-category": "Laman yang melebihi had kiraan nod", - "node-count-exceeded-warning": "Laman terlebih kiraan nod", + "node-count-exceeded-warning": "Laman telah melebihi bilangan nod", "expansion-depth-exceeded-category": "Laman yang melebihi had kedalaman peluasan", "expansion-depth-exceeded-warning": "Laman terlebih dalam peluasan", "parser-unstrip-loop-warning": "Gelung unstrip dikesan", @@ -843,7 +847,6 @@ "searchprofile-advanced-tooltip": "Cari dalam ruang nama yang tersuai", "search-result-size": "$1 ({{PLURAL:$2|$2 patah perkataan}})", "search-result-category-size": "$1 {{PLURAL:$1|ahli|ahli}} ($2 {{PLURAL:$2|subkategori|subkategori}}, $3 {{PLURAL:$3|fail|fail}})", - "search-result-score": "Kaitan: $1%", "search-redirect": "(pelencongan $1)", "search-section": "(bahagian $1)", "search-file-match": "(sepadan dengan kandungan fail)", @@ -870,7 +873,7 @@ "preferences": "Keutamaan", "mypreferences": "Keutamaan", "prefs-edits": "Jumlah suntingan:", - "prefsnologintext2": "Sila $1 untuk melihat hasil suntingan anda.", + "prefsnologintext2": "Sila log masuk untuk mengubah keutamaan anda.", "prefs-skin": "Rupa", "skin-preview": "Pralihat", "datedefault": "Tiada keutamaan", @@ -997,7 +1000,7 @@ "group-user": "Pengguna", "group-autoconfirmed": "Pengguna sah automatik", "group-bot": "Bot", - "group-sysop": "Pentadbir", + "group-sysop": "Penyelia", "group-bureaucrat": "Birokrat", "group-suppress": "Penyemak", "group-all": "(semua)", @@ -1010,7 +1013,7 @@ "grouppage-user": "{{ns:project}}:Pengguna", "grouppage-autoconfirmed": "{{ns:project}}:Pengguna yang disahkan secara automatik", "grouppage-bot": "{{ns:project}}:Bot", - "grouppage-sysop": "{{ns:project}}:Pentadbir", + "grouppage-sysop": "{{ns:project}}:Penyelia", "grouppage-bureaucrat": "{{ns:project}}:Birokrat", "grouppage-suppress": "{{ns:project}}:Penyemak", "right-read": "Membaca laman", @@ -1250,8 +1253,6 @@ "uploadwarning": "Amaran muat naik", "uploadwarning-text": "Sila ubah keterangan fail di bawah dan cuba lagi.", "savefile": "Simpan fail", - "uploadedimage": "memuat naik \"[[$1]]\"", - "overwroteimage": "memuat naik versi baru bagi \"[[$1]]\"", "uploaddisabled": "Ciri muat naik dimatikan", "copyuploaddisabled": "Ciri muat naik melalui URL telah dilumpuhkan.", "uploaddisabledtext": "Ciri muat naik fail dimatikan.", @@ -1362,8 +1363,8 @@ "nolicense": "Tidak dipilih", "licenses-edit": "Ubah tetapan lesen", "license-nopreview": "(Tiada pralihat)", - "upload_source_url": " (URL yang boleh diakses oleh orang awam)", - "upload_source_file": " (fail dalam komputer anda)", + "upload_source_url": "(fail pilihan anda dari URL sah yang boleh dimasuki oleh orang awam)", + "upload_source_file": "(fail pilihan anda dari komputer anda)", "listfiles-delete": "hapus", "listfiles-summary": "Laman khas ini memaparkan semua fail yang telah dimuat naik.", "listfiles_search_for": "Cari nama imej:", @@ -1440,7 +1441,7 @@ "filedelete-maintenance": "Ciri penghapusan dan pemulihan fail telah dilumpuhkan buat sementara sepanjang proses penyenggaraan.", "filedelete-maintenance-title": "Fail tidak boleh dihapuskan", "mimesearch": "Carian MIME", - "mimesearch-summary": "Anda boleh menggunakan laman ini untuk mencari fail mengikut jenis MIME. Format input ialah \"jenis/subjenis\", contohnya image/jpeg.", + "mimesearch-summary": "Laman ini membolehkan turasan fail-fail untuk jenis MIME mereka.\nMasukkan: jeniskandungan/subjenis atau jeniskandungan/*, contohnya image/jpeg.", "mimetype": "Jenis MIME:", "download": "muat turun", "unwatchedpages": "Laman tidak dipantau", @@ -1524,12 +1525,14 @@ "wantedpages": "Laman dikehendaki", "wantedpages-badtitle": "Tajuk tidak sah dalam set keputusan: $1", "wantedfiles": "Fail dikehendaki", - "wantedfiletext-cat": "Fail-fail yang berikut digunakan tetapi tidak wujud. Fail-fail dari repositori asing mungkin tersenarai walaupun wujud. Sebarang positif palsu sedemikian akan dipotong. Begitu juga, laman-laman yang terbenam fail-fail yang tidak wujud adalah tersenarai dalam [[:$1]].", - "wantedfiletext-nocat": "Fail-fail yang berikut digunakan tetapi tidak wujud. Fail-fail dari repositori asing mungkin tersenarai walaupun wujud. Sebarang positif palsu sedemikian akan dipotong.", + "wantedfiletext-cat": "Fail-fail berikut sedang digunakan tetapi tidak wujud. Fail-fail dari repositori asing mungkin tersenarai walaupun wujud. Sebarang positif palsu sedemikian akan dipotong. Tambahannya, laman-laman yang membenamkan fail-fail yang tidak wujud disenaraikan dalam [[:$1]].", + "wantedfiletext-cat-noforeign": "Fail-fail berikut sedang digunakan tetapi tidak wujud. Juga, laman-laman yang membenamkan fail-fail yang tidak wujud disenaraikan dalam [[:$1]].", + "wantedfiletext-nocat": "Fail-fail berikut sedang digunakan tetapi tidak wujud. Fail-fail dari repositori asing mungkin tersenarai walaupun wujud. Sebarang positif palsu sedemikian akan dipotong.", + "wantedfiletext-nocat-noforeign": "Fail-fail berikut sedang digunakan tetapi tidak wujud.", "wantedtemplates": "Templat dikehendaki", "mostlinked": "Laman dipaut terbanyak", "mostlinkedcategories": "Kategori dipaut terbanyak", - "mostlinkedtemplates": "Templat dipaut terbanyak", + "mostlinkedtemplates": "Laman dipaut terbanyak", "mostcategories": "Rencana dengan kategori terbanyak", "mostimages": "Imej dipaut terbanyak", "mostinterwikis": "Laman yang paling banyak pautan interwiki", @@ -1556,6 +1559,7 @@ "protectedpages-unknown-timestamp": "Tidak diketahui", "protectedpages-unknown-performer": "Pengguna tidak dikenali", "protectedtitles": "Tajuk dilindungi", + "protectedtitles-summary": "Laman ini menyenaraikan tajuk-tajuk yang telah dilindungi daripada penciptaan. Untuk senarai semua laman sedia ada yang telah dilindungi, lihat [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].", "protectedtitlesempty": "Tiada tajuk yang dilindungi yang sepadan dengan kriteria yang diberikan.", "listusers": "Senarai pengguna", "listusers-editsonly": "Hanya papar pengguna yang telah membuat suntingan", @@ -1633,7 +1637,7 @@ "activeusers-hidesysops": "Sorokkan pentadbir", "activeusers-noresult": "Tiada pengguna dijumpai.", "listgrouprights": "Hak kumpulan pengguna", - "listgrouprights-summary": "Yang berikut ialah senarai kumpulan pengguna yang ditubuhkan di wiki ini dengan hak-hak masing-masing.\nAnda boleh mengetahui [[{{MediaWiki:Listgrouprights-helppage}}|maklumat tambahan]] mengenai setiap hak.", + "listgrouprights-summary": "Berikut adalah senarai kumpulan pengguna yang ditubuhkan di wiki ini, dengan hak-hak mereka masing-masing.\nMungkin terdapat [[{{MediaWiki:Listgrouprights-helppage}}|maklumat tambahan]] mengenai setiap hak.", "listgrouprights-key": "Petunjuk:\n* Hak ditunaikan\n* Hak dibatalkan", "listgrouprights-group": "Kumpulan", "listgrouprights-rights": "Hak", @@ -1647,12 +1651,16 @@ "listgrouprights-removegroup-self": "Keluar daripada {{PLURAL:$2|kumpulan|kumpulan-kumpulan}}: $1", "listgrouprights-addgroup-self-all": "Menyertai semua kumpulan", "listgrouprights-removegroup-self-all": "Keluar daripada semua kumpulan", - "listgrouprights-namespaceprotection-header": "Sekatan ruang nama", + "listgrouprights-namespaceprotection-header": "Batasan ruang nama", "listgrouprights-namespaceprotection-namespace": "Ruang nama", - "trackingcategories": "Kategori penjejak", + "listgrouprights-namespaceprotection-restrictedto": "Hak(-hak) yang membenarkan pengguna untuk menyunting", + "trackingcategories": "Kategori-kategori penjejak", + "trackingcategories-summary": "Laman ini menyenaraikan kategori-kategori penjejak yang diisikan oleh perisian MediaWiki secara automatik. Nama-nama mereka boleh ditukarkan dengan mengubah pesanan-pesanan sistem berkenaan dalam ruang nama {{ns:8}}.", "trackingcategories-msg": "Kategori penjejak", "trackingcategories-name": "Nama pesanan", + "trackingcategories-desc": "Kriteria kemasukan kategori", "trackingcategories-nodesc": "Tiada keterangan tersedia.", + "trackingcategories-disabled": "Kategori telah dimatikan", "mailnologin": "Tiada alamat e-mel", "mailnologintext": "Anda perlu [[Special:UserLogin|log masuk]]\nterlebih dahulu dan mempunyai alamat e-mel yang sah dalam\n[[Special:Preferences|laman keutamaan]] untuk mengirim e-mel kepada pengguna lain.", "emailuser": "Kirim e-mel kepada pengguna ini", @@ -1687,12 +1695,14 @@ "mywatchlist": "Senarai pantau", "watchlistfor2": "Bagi $1 $2", "nowatchlist": "Tiada item dalam senarai pantau anda.", - "watchlistanontext": "Sila $1 terlebih dahulu untuk melihat atau menyunting senarai pantau anda.", + "watchlistanontext": "Sila log masuk untuk melihat atau menyunting senarai pantau anda.", "watchnologin": "Belum log masuk", "addwatch": "Tambahkan ke senarai pantau", "addedwatchtext": "Halaman \"[[:$1]]\" telah dimasukkan ke dalam [[Special:Watchlist|senarai pantau anda]].\nPerubahan-perubahan pada halaman ini dan halaman perbualannya pada masa akan datang akan tersenarai di dalam senarai itu.", + "addedwatchtext-short": "Laman \"$1\" telah ditambahkan kepada senarai pantau anda.", "removewatch": "Buang dari senarai pantau", "removedwatchtext": "Laman \"[[:$1]]\" telah dibuang daripada [[Special:Watchlist|senarai pantau anda]].", + "removedwatchtext-short": "Laman \"$1\" telah dikeluarkan dari senarai pantau anda.", "watch": "Pantau", "watchthispage": "Pantau laman ini", "unwatch": "Nyahpantau", @@ -1702,7 +1712,7 @@ "watchlist-details": "$1 laman dipantau ,tidak termasuk laman perbincangan.", "wlheader-enotif": "Pemberitahuan melalui e-mel dibolehkan.", "wlheader-showupdated": "Laman-laman yang telah diubah sejak kunjungan terakhir anda dipaparkan dalam '''teks tebal'''.", - "wlnote": "Berikut ialah {{PLURAL:$1|perubahan|'''$1''' perubahan}} yang terkini dalam {{PLURAL:$2|sejam|'''$2''' jam}} yang lalu, tepat pada $3, $4.", + "wlnote": "Berikut adalah {{PLURAL:$1|perubahan|$1 perubahan}} yang terkini dalam {{PLURAL:$2|sejam|$2 jam}} yang lalu, tepat pada $3, $4.", "wlshowlast": "Tunjukkan $1 jam / $2 hari yang lalu / $3.", "watchlist-options": "Pilihan senarai pantau", "watching": "Memantau...", @@ -1908,7 +1918,7 @@ "autoblockid": "Sekat #$1 secara automatik", "block": "Sekat pengguna", "unblock": "Nyahsekat pengguna", - "blockip": "Sekat pengguna", + "blockip": "Sekat {{GENDER:$1|pengguna}}", "blockip-legend": "Sekat pengguna", "blockiptext": "Gunakan borang di bawah untuk menyekat\npenyuntingan daripada alamat IP atau pengguna tertentu.\nTindakan ini perlu dilakukan untuk menentang vandalisme sahaja dan selaras\ndengan [[{{MediaWiki:Policy-url}}|dasar {{SITENAME}}]].\nSila masukkan sebab sekatan di bawah (umpamannya, sebutkan laman yang telah\ndirosakkan).", "ipaddressorusername": "Alamat IP atau nama pengguna:", @@ -1937,7 +1947,7 @@ "ipb-unblock-addr": "Nyahsekat $1", "ipb-unblock": "Nyahsekat nama pengguna atau alamat IP", "ipb-blocklist": "Lihat sekatan sedia ada", - "ipb-blocklist-contribs": "Sumbangan oleh $1", + "ipb-blocklist-contribs": "Sumbangan oleh {{GENDER:$1|$1}}", "unblockip": "Nyahsekat pengguna", "unblockiptext": "Gunakan borang di bawah untuk membuang sekatan bagialamat IP atau nama pengguna yang telah disekat.", "ipusubmit": "Tarik balik sekatan ini", @@ -2162,7 +2172,7 @@ "import-error-create": "Laman \"$1\" tidak diimport kerana anda tidak dibenarkan untuk menciptanya.", "import-error-interwiki": "Laman \"$1\" tidak diimport kerana namanya ditempah untuk pemautan luaran (antara wiki).", "import-error-special": "Laman \"$1\" tidak diimport kerana ia tergolong dalam ruang nama khas yang tidak membenarkan laman.", - "import-error-invalid": "Laman \"$1\" tidak diimport kerana namanya tidak sah.", + "import-error-invalid": "Laman \"$1\" tidak diimport kerana nama yang ia akan diimport kepada tidak sah pada wiki ini.", "import-error-unserialize": "Semakan $2 dari halaman \"$1\" tidak dapat dinyahsirikan. Semakan ini dilaporkan telah menggunakan model kandungan $3 yang disirikan sebagai $4.", "import-error-bad-location": "Semakan $2 yang menggunakan model kandungan $3 tidak boleh disimpan pada \"$1\" di wiki ini kerana model itu tidak disokong pada halaman tersebut.", "import-options-wrong": "{{PLURAL:$2|Pilihan|Pilihan-pilihan}} salah: $1", @@ -2171,9 +2181,9 @@ "importlogpage": "Log import", "importlogpagetext": "Senarai tindakan import laman dengan keseluruhan sejarah suntingannya daripada wiki lain.", "import-logentry-upload": "mengimport [[$1]] dengan memuat naik fail", - "import-logentry-upload-detail": "$1 semakan", + "import-logentry-upload-detail": "$1 semakan diimportkan", "import-logentry-interwiki": "$1 dipindahkan ke wiki lain", - "import-logentry-interwiki-detail": "$1 semakan daripada $2", + "import-logentry-interwiki-detail": "$1 semakan diimportkan daripada $2", "javascripttest": "Ujian JavaScript", "javascripttest-title": "Ujian $1 sedang dijalankan", "javascripttest-pagetext-noframework": "Laman ini ditempah untuk menjalankan ujian JavaScript.", @@ -2249,6 +2259,19 @@ "tooltip-preferences-save": "Simpan keutamaan", "tooltip-summary": "Berikan ringkasan", "common.css": "/* CSS yang terletak di sini akan digunakan pada semua kulit */", + "print.css": "/* CSS yang diletakkan di sini akan memberi kesan kepada hasil cetak */", + "noscript.css": "/* CSS yang diletakkan di sini akan memberi kesan kepada pengguna dengan JavaScript dimatikan */", + "group-autoconfirmed.css": "/* CSS yang diletakkan di sini akan memberi kesan kepada pengguna-pengguna sah automatik sahaja */", + "group-user.css": "/* CSS yang diletakkan di sini akan memberi kesan kepada pengguna-pengguna berdaftar sahaja */", + "group-bot.css": "/* CSS yang diletakkan di sini akan memberi kesan kepada bot sahaja */", + "group-sysop.css": "/* CSS yang diletakkan di sini akan memberi kesan kepada penyelia-penyelia sahaja */", + "group-bureaucrat.css": "/* CSS yang diletakkan di sini akan memberi kesan kepada birokrat-birokrat sahaja */", + "common.js": "/* Sebarang JavaScript di sini akan dimuatkan untuk semua pengguna pada setiap pemuatan laman. */", + "group-autoconfirmed.js": "/* Sebarang JavaScript di sini akan dimuatkan untuk pengguna-pengguna sah automatik sahaja */", + "group-user.js": "/* Sebarang JavaScript di sini akan dimuatkan untuk pengguna-pengguna berdaftar sahaja */", + "group-bot.js": "/* Sebarang JavaScript di sini akan dimuatkan untuk bot sahaja */", + "group-sysop.js": "/* Sebarang JavaScript di sini akan dimuatkan untuk penyelia-penyelia sahaja */", + "group-bureaucrat.js": "/* Sebarang JavaScript di sini akan dimuatkan untuk birokrat-birokrat sahaja */", "anonymous": "{{PLURAL:$1|Pengguna|Pengguna-pengguna}} {{SITENAME}} tanpa nama", "siteuser": "Pengguna {{SITENAME}}, $1", "anonuser": "Pengguna {{SITENAME}} tanpa nama $1", @@ -2363,6 +2386,7 @@ "newimages-summary": "Laman khas ini memaparkan senarai fail muat naik terakhir.", "newimages-legend": "Penapis", "newimages-label": "Nama fail (atau sebahagian daripadanya):", + "newimages-showbots": "Paparkan muat naik oleh bot", "noimages": "Tiada imej.", "ilsubmit": "Cari", "bydate": "mengikut tarikh", @@ -2770,6 +2794,7 @@ "confirm-watch-top": "Tambahkan laman ini ke dalam senarai pantau anda?", "confirm-unwatch-button": "OK", "confirm-unwatch-top": "Buang laman ini daripada senarai pantau anda?", + "quotation-marks": "\"$1\"", "imgmultipageprev": "← halaman sebelumnya", "imgmultipagenext": "halaman berikutnya →", "imgmultigo": "Pergi!", @@ -2791,6 +2816,7 @@ "autosumm-replace": "Mengganti laman dengan '$1'", "autoredircomment": "Melencong ke [[$1]]", "autosumm-new": "Mencipta laman baru dengan kandungan '$1'", + "autosumm-newblank": "Mencipta laman kosong", "lag-warn-normal": "Sebarang perubahan baru yang melebihi $1 saat mungkin tidak ditunjukkan dalam senarai ini.", "lag-warn-high": "Disebabkan oleh kelambatan pelayan pangkalan data, sebarang perubahan baru yang melebihi $1 saat mungkin tidak ditunjukkan dalam senarai ini.", "watchlistedit-normal-title": "Sunting senarai pantau", @@ -2806,6 +2832,15 @@ "watchlistedit-raw-done": "Senarai pantau anda telah dikemaskinikan.", "watchlistedit-raw-added": "$1 tajuk ditambah:", "watchlistedit-raw-removed": "$1 tajuk telah dibuang:", + "watchlistedit-clear-title": "Senarai pantau kosong", + "watchlistedit-clear-legend": "Kosongkan senarai pantau", + "watchlistedit-clear-explain": "Semua tajuk akan dikeluarkan dari senarai pantau anda", + "watchlistedit-clear-titles": "Tajuk-tajuk:", + "watchlistedit-clear-submit": "Kosongkan senarai pantau (Ini adalah kekal!)", + "watchlistedit-clear-done": "Senarai pantau anda telah dikosongkan.", + "watchlistedit-clear-removed": "{{PLURAL:$1|Satu|$1}} tajuk telah dikeluarkan.", + "watchlistedit-too-many": "Terdapat terlalu banyak laman untuk dipaparkan di sini.", + "watchlisttools-clear": "Kosongkan senarai pantau", "watchlisttools-view": "Lihat perubahan", "watchlisttools-edit": "Sunting senarai pantau", "watchlisttools-raw": "Sunting senarai pantau mentah", @@ -2826,7 +2861,7 @@ "duplicate-defaultsort": "'''Amaran''': Kunci susunan asali \"$2\" membatalkan kunci susunan asali \"$1\" yang sebelumnya.", "version": "Versi", "version-extensions": "Penyambung yang dipasang", - "version-skins": "Rupa", + "version-skins": "Rupa-rupa yang telah dipasangkan", "version-specialpages": "Laman khas", "version-parserhooks": "Penyangkuk penghurai", "version-variables": "Pemboleh ubah", @@ -2839,9 +2874,11 @@ "version-hook-name": "Nama penyangkuk", "version-hook-subscribedby": "Dilanggan oleh", "version-version": "(Versi $1)", + "version-no-ext-name": "[tiada nama]", "version-license": "Lesen MediaWiki", "version-ext-license": "Lesen", "version-ext-colheader-name": "Sambungan", + "version-skin-colheader-name": "Rupa", "version-ext-colheader-version": "Versi", "version-ext-colheader-license": "Lesen", "version-ext-colheader-description": "Keterangan", @@ -2945,6 +2982,9 @@ "htmlform-no": "Tidak", "htmlform-yes": "Ya", "htmlform-chosen-placeholder": "Pilih satu pilihan", + "htmlform-cloner-create": "Tambah lebih", + "htmlform-cloner-delete": "Buang", + "htmlform-cloner-required": "Sekurang-kurangnya satu nilai diperlukan.", "sqlite-has-fts": "$1 dengan sokongan carian teks penuh", "sqlite-no-fts": "$1 tanpa sokongan carian teks penuh", "logentry-delete-delete": "$1 telah {{GENDER:$2|menghapuskan}} laman $3", @@ -2980,6 +3020,9 @@ "logentry-rights-rights": "$1 telah {{GENDER:$2|menukar}} keahlian kumpulan untuk $3 dari $4 ke $5", "logentry-rights-rights-legacy": "$1 telah {{GENDER:$2|menukar}} keahlian kumpulan untuk $3", "logentry-rights-autopromote": "$1 telah {{GENDER:$2|dinaik pangkat}} secara automatik dari $4 ke $5", + "logentry-upload-upload": "$1 telah {{GENDER:$2|muat naik}} $3", + "logentry-upload-overwrite": "$1 telah {{GENDER:$2|muat naik}} versi baru $3", + "logentry-upload-revert": "$1 telah {{GENDER:$2|muat naik}} $3", "rightsnone": "(tiada)", "feedback-bugornote": "Jika anda bersedia untuk menerangkan masalah teknikal secara terperinci, sila [$1 laporkan pepijat]. \nAtaupun, anda boleh menggunakan borang yang mudah di bawah. Ulasan anda akan dicatatkan pada laman \"[$3 $2]\", beserta nama pengguna anda dan pelayar yang anda gunakan.", "feedback-subject": "Perkara:", @@ -3072,5 +3115,15 @@ "expand_templates_remove_nowiki": "Sekat tag dalam hasil", "expand_templates_generate_xml": "Papar pepohon hurai XML", "expand_templates_generate_rawhtml": "Paparkan HTML mentah", - "expand_templates_preview": "Pralihat" + "expand_templates_preview": "Pralihat", + "pagelanguage": "Pemilih bahasa laman", + "pagelang-name": "Laman", + "pagelang-language": "Bahasa", + "pagelang-use-default": "Gunakan bahasa asli", + "pagelang-select-lang": "Pilih bahasa", + "right-pagelang": "Mengubah bahasa laman", + "action-pagelang": "mengubah bahasa laman", + "log-name-pagelang": "Log perubahan bahasa", + "log-description-pagelang": "Ini adalah log untuk perubahan-perubahan bahasa laman.", + "logentry-pagelang-pagelang": "$1 telah {{GENDER:$2|mengubahkan}} bahasa untuk laman $3 dari $4 ke $5." } diff --git a/languages/i18n/nan.json b/languages/i18n/nan.json index d659ff73c3..7a2d8f4452 100644 --- a/languages/i18n/nan.json +++ b/languages/i18n/nan.json @@ -632,7 +632,6 @@ "badfilename": "Iáⁿ-siōng ê miâ í-keng kái chò \"$1\".", "uploadwarning": "Upload kéng-kò", "savefile": "Pó-chûn tóng-àn", - "uploadedimage": "thoân \"[[$1]]\" chiūⁿ-bāng", "uploaddisabled": "Pháiⁿ-sè, sàng chiūⁿ-bāng ê kong-lêng bô khui.", "sourcefilename": "Tóng-àn goân miâ:", "destfilename": "Tóng-àn sin miâ:", diff --git a/languages/i18n/nb.json b/languages/i18n/nb.json index aaedc8446d..2efb8175da 100644 --- a/languages/i18n/nb.json +++ b/languages/i18n/nb.json @@ -57,6 +57,7 @@ "tog-watchdefault": "Legg til sider og filer jeg endrer pÃ¥ i min overvÃ¥kingsliste", "tog-watchmoves": "Legg til sider og filer jeg flytter til min overvÃ¥kingsliste", "tog-watchdeletion": "Legg til sider og filer jeg sletter i min overvÃ¥kingsliste", + "tog-watchrollback": "Legg til sider jeg har utført tilbakestilling pÃ¥ i min overvÃ¥kningsliste", "tog-minordefault": "Merk i utgangspunktet alle redigeringer som mindre", "tog-previewontop": "Vis forhÃ¥ndsvisningen over redigeringsboksen", "tog-previewonfirst": "Vis forhÃ¥ndsvisning nÃ¥r du begynner Ã¥ redigere", @@ -294,6 +295,9 @@ "hidetoc": "skjul", "collapsible-collapse": "skjul", "collapsible-expand": "vis", + "confirmable-confirm": "Er {{GENDER:$1|du}} sikker?", + "confirmable-yes": "Ja", + "confirmable-no": "Nei", "thisisdeleted": "Se eller gjenopprett $1?", "viewdeleted": "Vis $1?", "restorelink": "{{PLURAL:$1|én slettet revisjon|$1 slettede revisjoner}}", @@ -862,7 +866,6 @@ "searchprofile-advanced-tooltip": "Søk i visse navnerom", "search-result-size": "$1 ({{PLURAL:$2|ett|$2}} ord)", "search-result-category-size": "{{PLURAL:$1|1 medlem|$1 medlemmer}} ({{PLURAL:$2|1 underkategori|$2 underkategorier}}, {{PLURAL:$3|1 fil|$3 filer}})", - "search-result-score": "Relevans: $1 %", "search-redirect": "(omdirigering $1)", "search-section": "(avsnitt $1)", "search-file-match": "(matcher filinnhold)", @@ -1267,8 +1270,6 @@ "uploadwarning": "Opplastingsadvarsel", "uploadwarning-text": "Vennligst endre filbeskrivelsen nedenfor og prøv igjen.", "savefile": "Lagre fil", - "uploadedimage": "lastet opp «[[$1]]»", - "overwroteimage": "last opp en ny versjon av «[[$1]]»", "uploaddisabled": "Opplastingsfunksjonen er slÃ¥tt av", "copyuploaddisabled": "Opplasting via nettadresse deaktivert.", "uploaddisabledtext": "Opplasting er slÃ¥tt av.", @@ -1379,8 +1380,8 @@ "nolicense": "Ingen spesifisert", "licenses-edit": "Rediger lisensvalg", "license-nopreview": "(ForhÃ¥ndsvisning ikke tilgjengelig)", - "upload_source_url": " (en gyldig, offentlig tilgjengelig adresse)", - "upload_source_file": " (en fil pÃ¥ din datamaskin)", + "upload_source_url": "(din fil fra en gyldig, offentlig tilgjengelig adresse)", + "upload_source_file": "(en fil pÃ¥ din datamaskin)", "listfiles-delete": "slett", "listfiles-summary": "Denne spesialsiden viser alle opplastede filer.", "listfiles_search_for": "Søk etter filnavn:", @@ -1733,7 +1734,7 @@ "watchlist-details": "{{PLURAL:$1|Én side|$1 sider}} pÃ¥ din overvÃ¥kningsliste, teller ikke diskusjonssider.", "wlheader-enotif": "E-postvarsling er slÃ¥tt pÃ¥.", "wlheader-showupdated": "Sider som har blitt forandret siden du sist besøkte dem vises i '''fet tekst'''", - "wlnote": "Nedenfor er {{PLURAL:$1|den siste endringen|de siste '''$1''' endringene}} {{PLURAL:$2|den siste timen|de siste '''$2''' timene}}, fra den $3, kl. $4", + "wlnote": "Nedenfor er {{PLURAL:$1|den siste endringen|de siste $1 endringene}} {{PLURAL:$2|den siste timen|de siste $2 timene}}, per $3 kl. $4", "wlshowlast": "Vis siste $1 timer $2 dager $3", "watchlist-options": "Alternativ for overvÃ¥kningslisten", "watching": "OvervÃ¥ker…", @@ -3045,6 +3046,9 @@ "logentry-rights-rights": "$1 {{GENDER:$2|endret}} gruppemedlemskap for $3 fra $4 til $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|endret}} gruppemedlemskap for $3", "logentry-rights-autopromote": "$1 ble automatisk {{GENDER:$2|forfremmet}} fra $4 til $5", + "logentry-upload-upload": "$1 {{GENDER:$2|lastet opp}} $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|lastet opp}} en ny versjon av $3", + "logentry-upload-revert": "$1 {{GENDER:$2|lastet opp}} $3", "rightsnone": "(ingen)", "feedback-bugornote": "Hvis du er klar til Ã¥ sende inn en detaljert feilrapport, vennligst [$1 rapporter en feil].\nOm det ikke er tilfellet, kan du bruke det enkle skjemaet som du finner under. Kommentaren din vil bli lagt til siden \"[$3 $2]\", sammen med brukernavnet ditt og informasjon om hvilken nettleser du bruker.", "feedback-subject": "Emne:", @@ -3147,5 +3151,8 @@ "action-pagelang": "endre sidesprÃ¥ket", "log-name-pagelang": "Endre sprÃ¥klogg", "log-description-pagelang": "Dette er en logg som viser endringer i sidesprÃ¥k", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2|endret}} sidesprÃ¥k for $3 fra $4 til $5." + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|endret}} sidesprÃ¥k for $3 fra $4 til $5.", + "default-skin-not-found": "Ops! Standarddrakten for wikien din ($wgDefaultSkin), $1, er ikke tilgjengelig.\n\nInstallasjonen din inkluderer følgende drakter. Se [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for informasjon om hvordan du an slÃ¥ det pÃ¥ og velge en standarddrakt.\n\n$2\n\n; Om du nettopp har installert MediaWiki:\n: Du har trolig installert fra git, eller direkte fra kildekoden med en annen metode. Dette er forventet.\n:* Prøv Ã¥ installere flere drakter fra [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.orgs draktbase]\n:* Last ned [https://www.mediawiki.org/wiki/Download tarball-installereren], som kommer med flere drakter og utvidelser. Du kan kopiere og lime inn skins/-mappen fra denne.\n: Å gjøre dette skal ikke forstyrre git-mappen din om du er en MediaWiki-utvikler.\n\n; Om du nettopp har oppgradert MediaWiki:\n: MediaWiki 1.24 og nyere slÃ¥r ikke lenger automatisk pÃ¥ installerte drakter (se [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). du kan lime inn følgende linjer i LocalSettings.php for Ã¥ slÃ¥ pÃ¥ alle installerte drakter:\n\n
    $3
    \n\n; Om du nettopp har endret LocalSettings.php:\n: Dobbeltsjekk draktnavnene for skrivefeil.", + "default-skin-not-found-row-enabled": "* $1 / $2 (slÃ¥tt pÃ¥)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''slÃ¥tt av''')" } diff --git a/languages/i18n/nds-nl.json b/languages/i18n/nds-nl.json index 91597b1174..63be86154f 100644 --- a/languages/i18n/nds-nl.json +++ b/languages/i18n/nds-nl.json @@ -265,6 +265,9 @@ "hidetoc": "Verbarg", "collapsible-collapse": "Inklappen", "collapsible-expand": "Uutklappen", + "confirmable-confirm": "{{GENDER:$1|Bi'j}} daor wisse van?", + "confirmable-yes": "Ja", + "confirmable-no": "Nee", "thisisdeleted": "Bekieken of herstellen van $1?", "viewdeleted": "Bekiek $1?", "restorelink": "{{PLURAL:$1|versie die vortedaon is|versies die vortedaon bin}}", @@ -349,7 +352,7 @@ "invalidtitle-knownnamespace": "Ongeldige titel mit naamruumte \"$2\" en tekste \"$3\"", "invalidtitle-unknownnamespace": "Ongeldige titel mit onbekend naamruumtenummer $1 en tekste \"$2\"", "exception-nologin": "Niet an-emeld", - "exception-nologin-text": "Um disse zied te bekieken of disse haandeling uut te kunnen voeren mu'j an-emeld ween bie disse wiki.", + "exception-nologin-text": "Um disse zied te bekieken of disse haandeling uut te kunnen voeren mu'j [[Special:Userlogin|an-emeld]] ween bie disse wiki.", "virus-badscanner": "Slichte konfigurasie: onbekend antivirusprogramma: ''$1''", "virus-scanfailed": "inlezen is mislokt (kode $1)", "virus-unknownscanner": "onbekend antivirusprogramma:", @@ -807,7 +810,6 @@ "searchprofile-advanced-tooltip": "Zeuken in de an-egeven naamruumtes", "search-result-size": "$1 ({{PLURAL:$2|1 woord|$2 woorden}})", "search-result-category-size": "{{PLURAL:$1|1 kategorielid|$1 kategorielejen}} ({{PLURAL:$2|1 onderkategorie|$2 onderkategorieën}}, {{PLURAL:$3|1 bestaand|$3 bestaanden}})", - "search-result-score": "Relevansie: $1%", "search-redirect": "(deurverwiezing $1)", "search-section": "(onderwarp $1)", "search-suggest": "Bedoelden je: $1", @@ -1200,8 +1202,6 @@ "uploadwarning": "Waorschuwing", "uploadwarning-text": "Pas de bestaandsbeschrieving hieronder an en probeer t opniej", "savefile": "Bestaand opslaon", - "uploadedimage": "Op-estuurd: [[$1]]", - "overwroteimage": "Nieje versie van \"[[$1]]\" op-estuurd", "uploaddisabled": "t Opsturen van bestaanden is uutezet.", "copyuploaddisabled": "t Opsturen van bestaanden via n webadres is uutezet.", "uploaddisabledtext": "t Opsturen van bestaanden is uutezet.", diff --git a/languages/i18n/ne.json b/languages/i18n/ne.json index 8ebe48cc86..80dca86c4d 100644 --- a/languages/i18n/ne.json +++ b/languages/i18n/ne.json @@ -779,7 +779,6 @@ "searchprofile-advanced-tooltip": "अनुकुल नेमस्पेसमा खोज्ने", "search-result-size": "$1 ({{PLURAL:$2|1 शव्द|$2 शव्दहरु}})", "search-result-category-size": "{{PLURAL:$1|एक सदस्य|$1 सदस्यहरु}} ({{PLURAL:$2|1 उपश्रेणी|$2 उपश्रेणीहरु}}, {{PLURAL:$3|एउटा फाइल|$3 फाइलहरु}})", - "search-result-score": "मिल्ने :$1%", "search-redirect": "(जाने $1)", "search-section": "(खण्ड $1)", "search-suggest": "के तपाईको खोजाई : $1 हो?", @@ -1154,8 +1153,6 @@ "uploadwarning": "उर्ध्वभरण चेतावनी", "uploadwarning-text": "कृपया तल फाइलको वर्णन परिवर्तन गर्नुहोस र पुन: प्रयास गर्नुहोस् ।", "savefile": "फाइल बचत गर्नुहोस्", - "uploadedimage": "उर्ध्वभरण(upload) गरियो \"[[$1]]\"", - "overwroteimage": " \"[[$1]]\"को एउटा नयाँ संस्करण उर्ध्वभरण गरियो", "uploaddisabled": "उर्ध्वभरण अक्षम पारिएकोछ", "copyuploaddisabled": " URL प्रयोग गरी उर्ध्वभरण निश्कृय पारिएको छ।", "uploaddisabledtext": "फाइल उर्ध्वभरण अक्षम पारिएकोछ", diff --git a/languages/i18n/nl.json b/languages/i18n/nl.json index e129c6d2e7..c36559ce2d 100644 --- a/languages/i18n/nl.json +++ b/languages/i18n/nl.json @@ -314,6 +314,9 @@ "hidetoc": "verbergen", "collapsible-collapse": "Inklappen", "collapsible-expand": "Uitvouwen", + "confirmable-confirm": "Weet {{GENDER:$1|u}} het zeker?", + "confirmable-yes": "Ja", + "confirmable-no": "Nee", "thisisdeleted": "$1 bekijken of terugplaatsen?", "viewdeleted": "$1 bekijken?", "restorelink": "$1 verwijderde {{PLURAL:$1|versie|versies}}", @@ -398,7 +401,7 @@ "invalidtitle-knownnamespace": "Ongeldige titel met naamruimte \"$2\" en tekst \"$3\"", "invalidtitle-unknownnamespace": "Ongeldige titel met onbekend naamruimtenummer $1 en tekst \"$2\"", "exception-nologin": "Niet aangemeld", - "exception-nologin-text": "[[Special:Userlogin|Meld u aan]] om deze pagina te bekijken of deze handeling uit te voeren.", + "exception-nologin-text": "Meld u aan om deze pagina te bekijken of deze handeling uit te voeren.", "exception-nologin-text-manual": "U moet $1 om deze pagina te kunnen bekijken of de handeling uit te voeren.", "virus-badscanner": "Onjuiste configuratie: onbekende virusscanner: ''$1''.", "virus-scanfailed": "scannen is mislukt (code $1)", @@ -470,7 +473,7 @@ "noname": "U hebt geen geldige gebruikersnaam opgegeven.", "loginsuccesstitle": "Aanmelden geslaagd", "loginsuccess": "'''U bent nu aangemeld bij {{SITENAME}} als \"$1\".'''", - "nosuchuser": "De gebruiker \"$1\" bestaat niet.\nGebruikersnamen zijn hoofdlettergevoelig.\nControleer de schrijfwijze of [[Special:UserLogin/signup|maak een nieuwe gebruiker aan]].", + "nosuchuser": "De gebruiker \"$1\" bestaat niet.\nGebruikersnamen zijn hoofdlettergevoelig.\nControleer de schrijfwijze of [[Special:UserLogin/signup|maak een nieuw account aan]].", "nosuchusershort": "De gebruiker \"$1\" bestaat niet.\nControleer de schrijfwijze.", "nouserspecified": "Geef een gebruikersnaam op.", "login-userblocked": "Deze gebruiker is geblokkeerd.\nAanmelden is niet mogelijk.", @@ -711,10 +714,10 @@ "parser-template-recursion-depth-warning": "De recursiediepte voor sjablonen is overschreden ($1)", "language-converter-depth-warning": "De dieptelimiet voor de taalconvertor is overschreden ($1)", "node-count-exceeded-category": "Pagina's waar het maximaal aantal nodes is overschreden", - "node-count-exceeded-category-desc": "Een categorie voor pagina's waar het aantal knooppunten is overschreden.", - "node-count-exceeded-warning": "Op de pagina is het maximale aantal nodes overschreden", + "node-count-exceeded-category-desc": "De pagina overschrijdt het maximale aantal knooppunten.", + "node-count-exceeded-warning": "De pagina overschrijdt het maximale aantal nodes", "expansion-depth-exceeded-category": "Pagina's waar de expansiediepte is overschreden", - "expansion-depth-exceeded-category-desc": "Dit is een categorie voor pagina's waar de expansiediepte is overschreden.", + "expansion-depth-exceeded-category-desc": "De pagina overschrijdt de maximale expansiediepte.", "expansion-depth-exceeded-warning": "De pagina bevat te veel sjablonen", "parser-unstrip-loop-warning": "Er is een \"unstrip\"-lus gedetecteerd", "parser-unstrip-recursion-limit": "De recursielimiet ($1) voor \"unstrip\" is overschreden", @@ -881,7 +884,6 @@ "searchprofile-advanced-tooltip": "Zoeken in opgegeven naamruimten", "search-result-size": "$1 ({{PLURAL:$2|1 woord|$2 woorden}})", "search-result-category-size": "{{PLURAL:$1|1 categorielid|$1 categorieleden}} ({{PLURAL:$2|1 ondercategorie|$2 ondercategorieën}}, {{PLURAL:$3|1 bestand|$3 bestanden}})", - "search-result-score": "Relevantie: $1%", "search-redirect": "(doorverwijzing $1)", "search-section": "(subkop $1)", "search-file-match": "(komt overeen met de inhoud van het bestand)", @@ -908,7 +910,7 @@ "preferences": "Voorkeuren", "mypreferences": "Voorkeuren", "prefs-edits": "Aantal bewerkingen:", - "prefsnologintext2": "U moet $1 om voorkeuren in te stellen.", + "prefsnologintext2": "U moet aanmelden om voorkeuren in te stellen.", "prefs-skin": "Vormgeving", "skin-preview": "Voorvertoning", "datedefault": "Geen voorkeur", @@ -1172,7 +1174,7 @@ "recentchanges-summary": "Op deze pagina kunt u de recentste wijzigingen in deze wiki bekijken.", "recentchanges-noresult": "Er zijn in deze periode geen wijzigingen gemaakt die aan de criteria voldoen.", "recentchanges-feed-description": "Met deze feed kunt u de recentste wijzigingen in deze wiki bekijken.", - "recentchanges-label-newpage": "Met deze bewerking is een nieuwe pagina aangemaakt.", + "recentchanges-label-newpage": "Met deze bewerking is een nieuwe pagina aangemaakt", "recentchanges-label-minor": "Dit is een kleine bewerking", "recentchanges-label-bot": "Deze bewerking is uitgevoerd door een bot", "recentchanges-label-unpatrolled": "Deze bewerking is nog niet gecontroleerd", @@ -1285,8 +1287,6 @@ "uploadwarning": "Uploadwaarschuwing", "uploadwarning-text": "Pas de onderstaande bestandsbeschrijving aan en probeer het daarna opnieuw.", "savefile": "Bestand opslaan", - "uploadedimage": "heeft \"[[$1]]\" geüpload", - "overwroteimage": "heeft een nieuwe versie van \"[[$1]]\" toegevoegd", "uploaddisabled": "Uploaden is uitgeschakeld", "copyuploaddisabled": "Het uploaden van bestanden via een URL is uitgeschakeld.", "uploaddisabledtext": "Het uploaden van bestanden is uitgeschakeld.", @@ -1397,8 +1397,8 @@ "nolicense": "Maak een keuze", "licenses-edit": "Licentieopties bewerken", "license-nopreview": "(Voorvertoning niet beschikbaar)", - "upload_source_url": " (een geldige, publiek toegankelijke URL)", - "upload_source_file": " (een bestand op uw computer)", + "upload_source_url": "(een bestanden van een geldige, publiek toegankelijke URL)", + "upload_source_file": "(een bestand op uw computer)", "listfiles-delete": "verwijderen", "listfiles-summary": "Op deze speciale pagina zijn alle toegevoegde bestanden te bekijken.", "listfiles_search_for": "Zoeken naar bestand:", @@ -1694,11 +1694,11 @@ "trackingcategories-desc": "Opnamecriteria", "noindex-category-desc": "De pagina bevat het magische woord __NOINDEX__ (en bevindt zich in een naamruimte waarin dat magische woord is toegestaan), en wordt niet geïndexeerd door robots.", "index-category-desc": "De pagina bevat het magische woord __INDEX__ (en bevindt zich in een naamruimte waarin dat magische woord is toegestaan), en wordt geïndexeerd door robots, terwijl dat normaliter niet zou gebeuren.", - "post-expand-template-inclusion-category-desc": "Na het uitbreiden van alle sjablonen, is de pagina groter dan $wgMaxArticleSize, dus zijn sommige sjablonen niet uitgebreid.", - "post-expand-template-argument-category-desc": "Na het uitbreiden van een sjabloonparameter (iets in de drievoudige accolades, zoals {{{Foo}}})), is de pagina groter dan $wgMaxArticleSize.", - "expensive-parserfunction-category-desc": "Op de pagina worden te veel kostbare parserfuncties (zoals #ifexist) gebruikt. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Meer informatie].", - "broken-file-category-desc": "Een categorie die wordt toegevoegd als een pagina een niet-bestaande koppeling bevat (een koppeling om een bestand toe te voegen als dat bestand niet bestaat).", - "hidden-category-category-desc": "Dit is een categoriepagina die het magische woord __HIDDENCAT__ bevat, waardoor de categorie standaard niet zichtbaar is in de lijst met categorieën op pagina's.", + "post-expand-template-inclusion-category-desc": "De pagina groter dan $wgMaxArticleSize na het uitbreiden van alle sjablonen, dus zijn sommige sjablonen niet uitgebreid.", + "post-expand-template-argument-category-desc": "De pagina is groter dan $wgMaxArticleSize na het uitbreiden van een sjabloonparameter (iets in de drievoudige accolades, zoals {{{Foo}}})).", + "expensive-parserfunction-category-desc": "De pagina gebruikt te veel kostbare parserfuncties (zoals #ifexist) gebruikt. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Meer informatie].", + "broken-file-category-desc": "De pagina bevat een niet-bestaande koppeling (een koppeling om een bestand toe te voegen als dat bestand niet bestaat).", + "hidden-category-category-desc": "De categorie heeft het magische woord __HIDDENCAT__ in de inhoud, waardoor de categorie standaard niet zichtbaar is in de lijst met categorieën op pagina's.", "trackingcategories-nodesc": "Geen beschrijving beschikbaar.", "trackingcategories-disabled": "Categorie uitgeschakeld", "mailnologin": "Geen verzendadres beschikbaar", @@ -1735,7 +1735,7 @@ "mywatchlist": "Volglijst", "watchlistfor2": "Voor $1 $2", "nowatchlist": "Uw volglijst is leeg.", - "watchlistanontext": "Om uw volglijst te bekijken of te bewerken moet u zich $1.", + "watchlistanontext": "Om uw volglijst te bekijken of te bewerken moet u zich aanmelden.", "watchnologin": "U bent niet aangemeld", "addwatch": "Toevoegen aan volglijst", "addedwatchtext": "De pagina \"[[:$1]]\" is toegevoegd aan uw [[Special:Watchlist|volglijst]].\nToekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden daar weergegeven.", @@ -1959,7 +1959,7 @@ "autoblockid": "Automatische blokkade #$1", "block": "Gebruiker blokkeren", "unblock": "Gebruiker deblokkeren", - "blockip": "Gebruiker blokkeren", + "blockip": "{{GENDER:$1|Gebruiker}} blokkeren", "blockip-legend": "Gebruiker blokkeren", "blockiptext": "Gebruik het onderstaande formulier om schrijftoegang voor een gebruiker of IP-adres in te trekken.\nDoe dit alleen als bescherming tegen vandalisme en in overeenstemming met het [[{{MediaWiki:Policy-url}}|beleid]].\nGeef hieronder een reden op (bijvoorbeeld welke pagina's gevandaliseerd zijn).", "ipaddressorusername": "IP-adres of gebruikersnaam:", @@ -1988,7 +1988,7 @@ "ipb-unblock-addr": "$1 deblokkeren", "ipb-unblock": "Een gebruiker of IP-adres deblokkeren", "ipb-blocklist": "Bestaande blokkades bekijken", - "ipb-blocklist-contribs": "Bijdragen van $1", + "ipb-blocklist-contribs": "Bijdragen van {{GENDER:$1|$1}}", "unblockip": "Gebruiker deblokkeren", "unblockiptext": "Gebruik het onderstaande formulier om opnieuw schrijftoegang te geven aan een geblokkeerde gebruiker of IP-adres.", "ipusubmit": "Blokkade opheffen", @@ -3064,6 +3064,9 @@ "logentry-rights-rights": "$1 {{GENDER:$2|heeft}} groepslidmaatschap voor $3 gewijzigd van $4 naar $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|heeft}} het groepslidmaatschap gewijzigd voor $3", "logentry-rights-autopromote": "$1 {{GENDER:$2|is}} automatisch gepromoveerd van $4 naar $5", + "logentry-upload-upload": "$1 heeft $3 {{GENDER:$2|geupload}}", + "logentry-upload-overwrite": "$1 heeft een nieuwe versie van $3 {{GENDER:$2|geupload}}", + "logentry-upload-revert": "$1 heeft $3 {{GENDER:$2|geupload}}", "rightsnone": "(geen)", "feedback-bugornote": "Als u zover bent om een technisch probleem in detail te beschrijven, [$1 rapporteer dan een bug].\nAnders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw reactie wordt dan toegevoegd aan de pagina \"[$3 $2]\", samen met uw gebruikersnaam en de browser die u gebruikt.", "feedback-subject": "Onderwerp:", @@ -3166,5 +3169,7 @@ "action-pagelang": "Taal van de pagina wijzigen", "log-name-pagelang": "Logboek van taalwijzigingen", "log-description-pagelang": "Dit is een logboek van wijzigingen van de taal van pagina's.", - "logentry-pagelang-pagelang": "$1 wijzigde de taal van de pagina '$3' van $4 naar $5." + "logentry-pagelang-pagelang": "$1 wijzigde de taal van de pagina '$3' van $4 naar $5.", + "default-skin-not-found-row-enabled": "* $1 / $2 (ingeschakeld)", + "default-skin-not-found-row-disabled": "* $1 / $2 (uitgeschakeld)" } diff --git a/languages/i18n/nn.json b/languages/i18n/nn.json index c483e9deb1..91a323d154 100644 --- a/languages/i18n/nn.json +++ b/languages/i18n/nn.json @@ -272,6 +272,9 @@ "hidetoc": "gøym", "collapsible-collapse": "SlÃ¥ saman.", "collapsible-expand": "Vid ut", + "confirmable-confirm": "Er {{GENDER:$1|du}} viss pÃ¥ dette?", + "confirmable-yes": "Ja", + "confirmable-no": "Nei", "thisisdeleted": "SjÃ¥ eller attopprett $1?", "viewdeleted": "SjÃ¥ historikk for $1?", "restorelink": "{{PLURAL:$1|Éin sletta versjon|$1 sletta versjonar}}", @@ -796,12 +799,11 @@ "searchprofile-advanced-tooltip": "Søk i visse namnerom", "search-result-size": "$1 ({{PLURAL:$2|eitt|$2}} ord)", "search-result-category-size": "{{PLURAL:$1|1 medlem|$1 medlemmer}} ({{PLURAL:$2|1 underkategori|$2 underkategoriar}}, {{PLURAL:$3|1 fil|$3 filer}})", - "search-result-score": "Relevans: $1 %", "search-redirect": "(omdirigering $1)", "search-section": "(bolken $1)", "search-suggest": "Meinte du: «$1»", "search-interwiki-caption": "Systerprosjekt", - "search-interwiki-default": "$1-resultat:", + "search-interwiki-default": "Resultat frÃ¥ $1:", "search-interwiki-more": "(meir)", "search-relatedarticle": "Relatert", "searchrelated": "relatert", @@ -1178,8 +1180,6 @@ "uploadwarning": "OpplastingsÃ¥tvaring", "uploadwarning-text": "Ver venleg og endra filskildringa nedanfor og prøv pÃ¥ nytt", "savefile": "Lagre fil", - "uploadedimage": "lasta opp «[[$1]]»", - "overwroteimage": "lasta opp ein ny versjon av «[[$1]]»", "uploaddisabled": "Beklagar, funksjonen for opplasting er deaktivert pÃ¥ denne nettenaren.", "copyuploaddisabled": "Opplasting gjennom URL er slege av.", "uploaddisabledtext": "Filopplasting er slÃ¥tt av.", @@ -1363,11 +1363,17 @@ "download": "last ned", "unwatchedpages": "Uovervaka sider", "listredirects": "Omdirigeringsliste", + "listduplicatedfiles": "Liste over filer med duplikat", + "listduplicatedfiles-summary": "Dette er ei liste over filer der den siste versjonen av fila er eit duplikat av den siste versjonen av ei anna fil. Berre lokale filer vert rekna med.", + "listduplicatedfiles-entry": "[[:File:$1|$1]] har [[$3|{{PLURAL:$2|eit duplikat|$2 duplikat}}]].", "unusedtemplates": "Ubrukte malar", "unusedtemplatestext": "Denne sida viser alle sidene i mal-namnerommet ({{ns:template}}:) som ikkje er brukte pÃ¥ andre sider. Hugs ogsÃ¥ Ã¥ sjÃ¥ etter andre lenkjer til malane før du slettar dei.", "unusedtemplateswlh": "andre lenkjer", "randompage": "Tilfeldig side", "randompage-nopages": "Det finst ingen sider i {{PLURAL:$2|dette namnerommet|desse namneromma}}: $1.", + "randomincategory": "Tilfeldig side frÃ¥ kategori", + "randomincategory-invalidcategory": "«$1» er ikkje eit gildt kategorinamn.", + "randomincategory-nopages": "Det er ingen sider i kategorien [[:Category:$1|$1]].", "randomincategory-selectcategory": "Hent tilfeldig side frÃ¥ kategori: $1 $2.", "randomincategory-selectcategory-submit": "Hent", "randomredirect": "Tilfeldig omdirigering", @@ -1550,6 +1556,7 @@ "trackingcategories-name": "Meldingsnamn", "trackingcategories-desc": "Inkluderingsgrunnlag", "noindex-category-desc": "Sida vert ikkje indeksert av robotar av di ho inneheld trylleordet __NOINDEX__ og er i eit namnerom der dette flagget er tillate.", + "trackingcategories-disabled": "Kategorien er avslegen", "mailnologin": "Inga avsendaradresse", "mailnologintext": "Du lyt vera [[Special:UserLogin|innlogga]] og ha ei gyldig e-postadresse sett i [[Special:Preferences|brukarinnstillingane]] for Ã¥ sende e-post Ã¥t andre brukarar.", "emailuser": "Send e-post Ã¥t denne brukaren", @@ -1588,15 +1595,17 @@ "watchnologin": "Ikkje innlogga", "addwatch": "↓Legg til i overvakingslista", "addedwatchtext": "Sida «[[:$1]]» er lagd til i [[Special:Watchlist|overvakingslista]] di. Framtidige endringar av henne og den tilhøyrande diskusjonssida hennar vil bli oppførte der.", + "addedwatchtext-short": "Sida «$1» vart lagd til i overvakingslista di.", "removewatch": "Fjerna frÃ¥ overvakingslista", "removedwatchtext": "Sida «[[:$1]]» er fjerna frÃ¥ [[Special:Watchlist|overvakingslista di]].", + "removedwatchtext-short": "Sida «$1» vart fjerna frÃ¥ overvakingslista di.", "watch": "Overvak", "watchthispage": "Overvak sida", "unwatch": "Fjern overvaking", "unwatchthispage": "Fjern overvaking", "notanarticle": "Ikkje innhaldsside", "notvisiblerev": "Sideversjonen er sletta", - "watchlist-details": "{{PLURAL:$1|Éi side|$1 sider}} er overvaka, utanom diskusjonssider.", + "watchlist-details": "{{PLURAL:$1|Éi side|$1 sider}} pÃ¥ overvakingslista di, utan separat teljing av diskusjonssider.", "wlheader-enotif": "Funksjonen for endringsmeldingar per e-post er pÃ¥.", "wlheader-showupdated": "Sider som har vorte endra sidan du sist sÃ¥g pÃ¥ dei er '''utheva'''", "wlnote": "Nedanfor er {{PLURAL:$1|den siste endringa|dei siste '''$1''' endringane}} {{PLURAL:$2|den siste timen|dei siste '''$2''' timane}}, for $3, kl. $4.", diff --git a/languages/i18n/pl.json b/languages/i18n/pl.json index 7c38cf6cb0..f446d7d19b 100644 --- a/languages/i18n/pl.json +++ b/languages/i18n/pl.json @@ -83,6 +83,7 @@ "tog-watchdefault": "Dodawaj do obserwowanych strony i pliki, które edytuję", "tog-watchmoves": "Dodawaj do obserwowanych strony i pliki, które przenoszę", "tog-watchdeletion": "Dodawaj do obserwowanych strony i pliki, które usuwam", + "tog-watchrollback": "Dodawaj do obserwowanych strony, w których {{GENDER:|wycofałem|wycofałam}} edycję", "tog-minordefault": "Wszystkie edycje domyślnie oznaczaj jako drobne", "tog-previewontop": "Pokazuj podgląd powyżej obszaru edycji", "tog-previewonfirst": "Pokazuj podgląd strony podczas pierwszej edycji", @@ -321,6 +322,9 @@ "hidetoc": "ukryj", "collapsible-collapse": "Zwiń", "collapsible-expand": "Rozwiń", + "confirmable-confirm": "Jesteś {{GENDER:$1|pewny|pewna}}?", + "confirmable-yes": "Tak", + "confirmable-no": "Nie", "thisisdeleted": "Pokazać lub odtworzyć $1?", "viewdeleted": "Zobacz $1", "restorelink": "{{PLURAL:$1|jedną usuniętą wersję|$1 usunięte wersje|$1 usuniętych wersji}}", @@ -406,7 +410,7 @@ "invalidtitle-knownnamespace": "Nieprawidłowa nazwa w obszarze nazw \"$2\" o treści \"$3\"", "invalidtitle-unknownnamespace": "Nieprawidłowa nazwa z nieznaną liczbą przestrzeni nazw $1 o treści \"$2\"", "exception-nologin": "Nie jesteś zalogowany/a", - "exception-nologin-text": "Proszę [[Special:Userlogin|zaloguj się]] aby mieć dostęp do tej strony lub akcji.", + "exception-nologin-text": "Zaloguj się, aby mieć dostęp do tej strony lub akcji.", "exception-nologin-text-manual": "Musisz $1 aby mieć dostęp do tej strony lub akcji.", "virus-badscanner": "Zła konfiguracja – nieznany skaner antywirusowy ''$1''", "virus-scanfailed": "skanowanie nieudane (błąd $1)", @@ -719,10 +723,10 @@ "parser-template-recursion-depth-warning": "Przekroczno limit głębokości rekurencji szablonu ($1)", "language-converter-depth-warning": "Przekroczono ograniczenie ($1) głębokości zagnieżdżenia konwersji językowej", "node-count-exceeded-category": "Strony, gdzie przekroczono liczbę węzłów", - "node-count-exceeded-category-desc": "Kategoria dla stron, na których przekroczono liczbę węzłów.", + "node-count-exceeded-category-desc": "Strona przekracza maksymalną liczbę węzłów.", "node-count-exceeded-warning": "Strona przekroczyła liczbę węzłów", "expansion-depth-exceeded-category": "Strony z przekroczoną głębokością rozbudowy", - "expansion-depth-exceeded-category-desc": "Kategoria dla stron, na których przekroczona jest głębokość rozbudowy.", + "expansion-depth-exceeded-category-desc": "Strona przekracza maksymalną głębokość rozbudowy.", "expansion-depth-exceeded-warning": "Strona przekroczyła głębokość rozbudowy", "parser-unstrip-loop-warning": "Wykryto nieskończoną pętlę", "parser-unstrip-recursion-limit": "Przekroczono maksymalną głębokość zagnieżdżania ($1)", @@ -881,16 +885,15 @@ "searchmenu-exists": "* Strona '''[[$1]]'''", "searchmenu-new": "Utwórz stronę „[[:$1]]” na tej wiki! {{PLURAL:$2|0=|Zobacz też stronę z wynikami wyszukiwania.|Zobacz też wyniki wyszukiwania.}}", "searchprofile-articles": "Strony", - "searchprofile-images": "Multimedia", - "searchprofile-everything": "Wszystko", - "searchprofile-advanced": "Zaawansowane", + "searchprofile-images": "w multimediach", + "searchprofile-everything": "na wszystkich stronach", + "searchprofile-advanced": "zaawansowane", "searchprofile-articles-tooltip": "Szukanie w przestrzeni nazw $1", "searchprofile-images-tooltip": "Szukanie plików", "searchprofile-everything-tooltip": "Szukanie w całej zawartości (także strony dyskusji)", "searchprofile-advanced-tooltip": "Szukanie w wybranych przestrzeniach nazw", "search-result-size": "$1 ({{PLURAL:$2|1 słowo|$2 słowa|$2 słów}})", "search-result-category-size": "{{PLURAL:$1|1 element|$1 elementy|$1 elementów}} ({{PLURAL:$2|1 kategoria|$2 kategorie|$2 kategorii}}, {{PLURAL:$3|1 plik|$3 pliki|$3 plików}})", - "search-result-score": "Trafność: $1%", "search-redirect": "(przekierowanie $1)", "search-section": "(sekcja $1)", "search-file-match": "(odpowiada zawartości pliku)", @@ -917,7 +920,7 @@ "preferences": "Preferencje", "mypreferences": "Preferencje", "prefs-edits": "Liczba edycji:", - "prefsnologintext2": "Musisz $1 aby ustawić preferencje.", + "prefsnologintext2": "Zaloguj się, aby zmienić swoje preferencje.", "prefs-skin": "Skórka", "skin-preview": "podgląd", "datedefault": "Domyślny", @@ -1294,8 +1297,6 @@ "uploadwarning": "Ostrzeżenie o przesyłaniu", "uploadwarning-text": "Zmień poniższy opis pliku i spróbuj ponownie.", "savefile": "Zapisz plik", - "uploadedimage": "przesłał [[$1]]", - "overwroteimage": "przesłano nową wersję pliku „[[$1]]“", "uploaddisabled": "Przesyłanie plików wyłączone", "copyuploaddisabled": "Przesyłanie poprzez podanie adres URL jest wyłączone.", "uploaddisabledtext": "Możliwość przesyłania plików została wyłączona.", @@ -1406,7 +1407,7 @@ "nolicense": "Nie wybrano", "licenses-edit": "Edytuj opcje licencji", "license-nopreview": "(Podgląd niedostępny)", - "upload_source_url": " (poprawny, publicznie dostępny adres URL)", + "upload_source_url": "(wybrany plik z prawidłowego, publicznie dostępnego adresu URL)", "upload_source_file": "(wybrany plik na twoim komputerze)", "listfiles-delete": "usuń", "listfiles-summary": "Na tej stronie specjalnej prezentowane są wszystkie przesłane pliki.", @@ -1703,10 +1704,10 @@ "trackingcategories-desc": "Kryteria włączenia kategorii", "noindex-category-desc": "Ta strona nie jest indeksowana przez roboty, ponieważ ma wpisane magiczne słowo __NOINDEX__ i znajduje się w przestrzeni nazw, w której ta flaga jest dozwolona.", "index-category-desc": "Na stronie znajduje się magiczne słowo __INDEX__ (i strona znajduje się w przestrzeni nazw, w której jest ono dozwolone), więc jest indeksowana przez wyszukiwarki nawet wtedy, gdy normalnie by się to nie działo.", - "post-expand-template-inclusion-category-desc": "Po rozwinięciu wszystkich szablonów, rozmiar strony jest większe niż $wgMaxArticleSize, więc niektóre szablony nie zostały rozwinięte.", + "post-expand-template-inclusion-category-desc": "Rozmiar tej strony jest większy niż $wgMaxArticleSize po rozszerzeniu wszystkich szablonów, więc część szablonów nie jest rozszerzonych.", "post-expand-template-argument-category-desc": "Po rozwinięciu argumentu szablonu (coś w potrójnych nawiasach, np. {{{Foo}}}) długość strony przekracza $wgMaxArticleSize.", "expensive-parserfunction-category-desc": "Na stronie używanych jest zbyt wiele wymagających funkcji parsera (takich jak #ifexist). Więcej informacji na stronie [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", - "broken-file-category-desc": "Kategoria dodawana do stron zawierających nieprawidłowe odwołania do plików (odwołania do nieistniejących plików).", + "broken-file-category-desc": "Strona zawiera nieprawidłowe odwołania do plików (odwołania do nieistniejących plików).", "hidden-category-category-desc": "To jest kategoria z __HIDDENCAT__, co zapobiega wyświetlaniu jej w sekcji z kategoriami na stronie.", "trackingcategories-nodesc": "Opis nie jest dostępny.", "trackingcategories-disabled": "Kategoria jest wyłączona", @@ -1744,7 +1745,7 @@ "mywatchlist": "Obserwowane", "watchlistfor2": "Dla $1 $2", "nowatchlist": "Lista obserwowanych przez Ciebie stron jest pusta.", - "watchlistanontext": "$1, aby obejrzeć lub edytować elementy listy obserwowanych.", + "watchlistanontext": "Zaloguj się, aby obejrzeć lub edytować elementy listy obserwowanych.", "watchnologin": "Nie jesteś zalogowany", "addwatch": "Dodaj do listy obserwowanych", "addedwatchtext": "Strona „[[:$1|$1]]” została dodana do Twojej [[Special:Watchlist|listy obserwowanych]].\nKażda zmiana treści tej strony lub związanej z nią strony dyskusji zostanie odnotowana na tej liście.", @@ -1808,6 +1809,7 @@ "delete-edit-reasonlist": "Edytuj listę przyczyn usunięcia", "delete-toobig": "Ta strona ma bardzo długą historię edycji – ponad $1 {{PLURAL:$1|zmianę|zmiany|zmian}}.
    \nUsuwanie jej zostało ograniczone ze względu na możliwość zakłócenia pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.", "delete-warning-toobig": "Ta strona ma bardzo długą historię edycji – ponad $1 {{PLURAL:$1|zmianę|zmiany|zmian}}.
    \nBądź ostrożny, ponieważ usunięcie jej może spowodować zakłócenia w pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.", + "delete-cantedit": "Nie możesz usunąć tej strony, ponieważ nie masz uprawnienia do jej edycji.", "deleting-backlinks-warning": "''' Uwaga:''' Do strony, którą masz zamiar usunąć, odwołują się [[Special:WhatLinksHere/{{FULLPAGENAME}}|inne strony]].", "rollback": "Cofnij edycję", "rollback_short": "Cofnij", @@ -1968,7 +1970,7 @@ "autoblockid": "automatyczna blokada nr $1", "block": "Zablokuj użytkownika", "unblock": "Odblokuj użytkownika", - "blockip": "Zablokuj użytkownika", + "blockip": "Zablokuj {{GENDER:$1|użytkownika|użytkowniczkę}}", "blockip-legend": "Zablokuj użytkownika", "blockiptext": "Użyj poniższego formularza do zablokowania możliwości edycji spod określonego adresu IP lub konkretnemu użytkownikowi.\nBlokować należy jedynie po to, by zapobiec wandalizmom, zgodnie z [[{{MediaWiki:Policy-url}}|przyjętymi zasadami]].\nPodaj powód (np. umieszczając nazwy stron, na których dopuszczono się wandalizmu).", "ipaddressorusername": "Adres IP lub nazwa użytkownika", @@ -1997,7 +1999,7 @@ "ipb-unblock-addr": "Odblokuj $1", "ipb-unblock": "Odblokuj użytkownika lub adres IP", "ipb-blocklist": "Zobacz istniejące blokady", - "ipb-blocklist-contribs": "Wkład $1", + "ipb-blocklist-contribs": "Wkład {{GENDER:$1|$1}}", "unblockip": "Odblokuj użytkownika", "unblockiptext": "Użyj poniższego formularza, by przywrócić możliwość edycji z wcześniej zablokowanego adresu IP lub użytkownikowi.", "ipusubmit": "Odblokuj", @@ -3095,6 +3097,9 @@ "logentry-rights-rights": "$1 {{GENDER:$2|zmienił|zmieniła}} przynależność $3 do grup ($4 → $5)", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|zmienił|zmieniła}} przynależność $3 do grup", "logentry-rights-autopromote": "$1 automatycznie {{GENDER:$2|zmienił|zmieniła}} przynależność ($4 → $5)", + "logentry-upload-upload": "$1 {{GENDER:$2|przesłał|przesłała}} $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|przesłał|przesłała}} nową wersję $3", + "logentry-upload-revert": "$1 {{GENDER:$2|przesłał|przesłała}} $3", "rightsnone": "brak", "feedback-bugornote": "Jeśli jesteś w stanie szczegółowo opisać problem techniczny, proszę [$1 zgłoś błąd].\nW przeciwnym wypadku można użyć prostego formularza poniżej. Komentarz zostanie dodany do strony \"[$3 $2]\", wraz z nazwą użytkownika.", "feedback-subject": "Temat", @@ -3197,5 +3202,7 @@ "action-pagelang": "zmiany języka strony", "log-name-pagelang": "Rejestr zmian języka", "log-description-pagelang": "Rejestr zmian języków przypisanych do poszczególnych stron", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2|zmienił|zmieniła}} język strony $3 z „$4” na „$5”." + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|zmienił|zmieniła}} język strony $3 z „$4” na „$5”.", + "default-skin-not-found-row-enabled": "* $1 / $2 (włączone)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''wyłączone''')" } diff --git a/languages/i18n/pms.json b/languages/i18n/pms.json index d6b02669a2..6e4bcf49d8 100644 --- a/languages/i18n/pms.json +++ b/languages/i18n/pms.json @@ -837,7 +837,6 @@ "searchprofile-advanced-tooltip": "Sërché ant jë spassi nominaj përsonalisà", "search-result-size": "$1 ({{PLURAL:$2|un|$2}} mòt)", "search-result-category-size": "{{PLURAL:$1|1 mèmber|$1 mèmber}} ({{PLURAL:$2|1 sot-categorìa|$2 sot-categorìe}}, {{PLURAL:$3|1 archivi|$3 archivi}})", - "search-result-score": "Arlevansa: $1%", "search-redirect": "(ridiression $1)", "search-section": "(session $1)", "search-file-match": "(a corëspond al contnù d'archivi)", @@ -1244,8 +1243,6 @@ "uploadwarning": "Avis che i soma dapress a carié", "uploadwarning-text": "Për piasì, ch'a modìfica la descrission ëd l'archivi sì-sota e ch'a preuva torna.", "savefile": "Salvé l'archivi", - "uploadedimage": "a l'ha carià \"[[$1]]\"", - "overwroteimage": "a l'ha carìa na version neuva ëd \"[[$1]]\"", "uploaddisabled": "Càrich blocà.", "copyuploaddisabled": "Ël càrich për mojen ëd n'adrëssa dl'aragnà a l'é disabilità.", "uploaddisabledtext": "La possibilità ëd carié dj'archivi a l'é staita disabilità.", diff --git a/languages/i18n/pt-br.json b/languages/i18n/pt-br.json index f8ee867b26..3d7a4a56fe 100644 --- a/languages/i18n/pt-br.json +++ b/languages/i18n/pt-br.json @@ -888,7 +888,6 @@ "searchprofile-advanced-tooltip": "Personalizar os espaços nominais onde pesquisar", "search-result-size": "$1 ({{PLURAL:$2|1 palavra|$2 palavras}})", "search-result-category-size": "{{PLURAL:$1|1 membro|$1 membros}} ({{PLURAL:$2|1 subcategoria|$2 subcategorias}}, {{PLURAL:$3|1 arquivo|$3 arquivos}})", - "search-result-score": "Relevância: $1%", "search-redirect": "(redirecionamento de $1)", "search-section": "(seção $1)", "search-file-match": "(coincide com o conteúdo do arquivo)", @@ -1289,8 +1288,6 @@ "uploadwarning": "Aviso de envio", "uploadwarning-text": "Modifique a descrição do arquivo abaixo e tente novamente.", "savefile": "Salvar arquivo", - "uploadedimage": "enviou \"[[$1]]\"", - "overwroteimage": "enviou uma nova versão de \"[[$1]]\"", "uploaddisabled": "Envio de arquivos desativado.", "copyuploaddisabled": "O upload por URL encontra-se desativado.", "uploaddisabledtext": "O envio de arquivos encontra-se desativado.", @@ -1792,6 +1789,7 @@ "delete-edit-reasonlist": "Editar motivos de eliminação", "delete-toobig": "Esta página possui um longo histórico de edições, com mais de $1 {{PLURAL:$1|edição|edições}}.\nA eliminação de tais páginas foi restrita, a fim de se evitarem problemas acidentais em {{SITENAME}}.", "delete-warning-toobig": "Esta página possui um longo histórico de edições, com mais de $1 {{PLURAL:$1|edição|edições}}.\nEliminá-la poderá causar problemas na base de dados de {{SITENAME}};\nprossiga com cuidado.", + "delete-cantedit": "Você não pode deletar essa paginá por que você não tem permissão de edita-la", "deleting-backlinks-warning": "'''Cuidado:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Outras páginas]] se ligam ou redirecionam para a página que você está prestes a deletar.", "rollback": "Reverter edições", "rollback_short": "Reverter", diff --git a/languages/i18n/pt.json b/languages/i18n/pt.json index 970b9faa2f..be23b11967 100644 --- a/languages/i18n/pt.json +++ b/languages/i18n/pt.json @@ -60,7 +60,9 @@ "Yves Marques Junqueira", "לערי ריינהארט", "555", - "아라" + "아라", + "Leon saudanha", + "Macofe" ] }, "tog-underline": "Sublinhar ligações:", @@ -77,7 +79,7 @@ "tog-watchdefault": "Adicionar as páginas e ficheiros que eu editar às minhas páginas vigiadas", "tog-watchmoves": "Adicionar as páginas e ficheiros que eu mover às minhas páginas vigiadas", "tog-watchdeletion": "Adicionar as páginas e ficheiros que eu eliminar às minhas páginas vigiadas", - "tog-watchrollback": "Adicionar páginas onde fiz uma reversão à minha lista de artigos vigiados", + "tog-watchrollback": "Adicionar páginas onde fiz uma reversão às minhas páginas vigiadas", "tog-minordefault": "Por omissão, marcar todas as edições como menores", "tog-previewontop": "Mostrar a antevisão antes da caixa de edição", "tog-previewonfirst": "Mostrar a antevisão na primeira edição", @@ -315,6 +317,9 @@ "hidetoc": "esconder", "collapsible-collapse": "Ocultar", "collapsible-expand": "Expandir", + "confirmable-confirm": "{{GENDER:$1|Tem}} a certeza?", + "confirmable-yes": "Sim", + "confirmable-no": "Não", "thisisdeleted": "Ver ou restaurar $1?", "viewdeleted": "Ver $1?", "restorelink": "{{PLURAL:$1|uma edição eliminada|$1 edições eliminadas}}", @@ -399,7 +404,7 @@ "invalidtitle-knownnamespace": "Título inválido com o domínio \"$2\" e texto \"$3\"", "invalidtitle-unknownnamespace": "Título inválido com número de domínio $1 desconhecido e texto \"$2\"", "exception-nologin": "Não está autenticado", - "exception-nologin-text": "Por favor, [[Special:Userlogin|inicie sessão]] para poder aceder a esta página ou acção.", + "exception-nologin-text": "Por favor, inicie sessão para poder aceder a esta página ou ação.", "exception-nologin-text-manual": "Por favor $1, para poder aceder a esta página ou acção.", "virus-badscanner": "Má configuração: antivírus desconhecido: ''$1''", "virus-scanfailed": "a verificação falhou (código $1)", @@ -712,10 +717,10 @@ "parser-template-recursion-depth-warning": "Foi excedido o limite da profundidade de recursividade nas predefinições ($1)", "language-converter-depth-warning": "O limite de profundidade do conversor de idiomas excedeu a ($1)", "node-count-exceeded-category": "Páginas em que o total de nós é excedido", - "node-count-exceeded-category-desc": "Uma categoria para páginas onde a contagem dos nós foi excedida.", + "node-count-exceeded-category-desc": "A página excede a contagem de nós permitida.", "node-count-exceeded-warning": "A página excedeu o total de nós", "expansion-depth-exceeded-category": "Páginas em que a profundidade de expansão é excedida", - "expansion-depth-exceeded-category-desc": "Uma categoria para páginas onde a profundidade de expansão foi excedida.", + "expansion-depth-exceeded-category-desc": "A página excede a profundidade de expansão permitida.", "expansion-depth-exceeded-warning": "A página excedeu a profundidade de expansão", "parser-unstrip-loop-warning": "Foi detectado um ciclo infinito unstrip", "parser-unstrip-recursion-limit": "Limite de recursão do unstrip excedido ($1)", @@ -834,7 +839,7 @@ "mergehistory-empty": "Não existem revisões fundíveis.", "mergehistory-success": "Foram fundidas $3 {{PLURAL:$3|edição|edições}} de [[:$1]] em [[:$2]].", "mergehistory-fail": "Não foi possível fundir os históricos; verifique a página e os parâmetros de tempo, por favor.", - "mergehistory-fail-toobig": "Não é possível mesclar o histórico, já que um número de revisão(ões) acima do limite ($1 {{PLURAL:$1|revisão|revisões}}) seriam movidos.", + "mergehistory-fail-toobig": "Não é possível fundir o histórico, já que um número de revisão(ões) acima do limite ($1 {{PLURAL:$1|revisão|revisões}}) seriam movidos.", "mergehistory-no-source": "A página de origem $1 não existe.", "mergehistory-no-destination": "A página de destino $1 não existe.", "mergehistory-invalid-source": "A página de origem precisa ser um título válido.", @@ -883,7 +888,6 @@ "searchprofile-advanced-tooltip": "Personalizar os domínios onde pesquisar", "search-result-size": "$1 ({{PLURAL:$2|1 palavra|$2 palavras}})", "search-result-category-size": "{{PLURAL:$1|1 membro|$1 membros}} ({{PLURAL:$2|1 subcategoria|$2 subcategorias}}, {{PLURAL:$3|1 ficheiro|$3 ficheiros}})", - "search-result-score": "Relevancia: $1%", "search-redirect": "(redirecionamento de $1)", "search-section": "(seção $1)", "search-file-match": "(coincide com o conteúdo do ficheiro)", @@ -910,7 +914,7 @@ "preferences": "Preferências", "mypreferences": "Preferências", "prefs-edits": "Número de edições:", - "prefsnologintext2": "Por favor, precisa de $1 para definir as suas preferências.", + "prefsnologintext2": "Por favor, inicie sessão para alterar as suas preferências.", "prefs-skin": "Tema", "skin-preview": "Antever tema", "datedefault": "Sem preferência", @@ -1287,8 +1291,6 @@ "uploadwarning": "Aviso de envio", "uploadwarning-text": "Modifique a descrição do ficheiro abaixo e tente novamente, por favor.", "savefile": "Gravar ficheiro", - "uploadedimage": "carregou \"[[$1]]\"", - "overwroteimage": "enviou uma nova versão de \"[[$1]]\"", "uploaddisabled": "Carregamentos desativados", "copyuploaddisabled": "Carregamento por URL desativado.", "uploaddisabledtext": "O carregamento de ficheiros está desativado.", @@ -1560,7 +1562,9 @@ "wantedpages-badtitle": "Título inválido no conjunto de resultados: $1", "wantedfiles": "Ficheiros desejados", "wantedfiletext-cat": "Os seguintes ficheiros são usados, mas não existem. Ficheiros de repositórios externos podem ser listados apesar de existirem. Tais falsos positivos aparecerão riscados. Adicionalmente, as páginas que incorporam ficheiros que não existem estão listadas em [[:$1]].", + "wantedfiletext-cat-noforeign": "Os seguintes ficheiros são usados, mas não existem. Além disso, as páginas que incorporam ficheiros que não existem são listadas em [[:$1]].", "wantedfiletext-nocat": "Os seguintes ficheiros são usados, mas não existem. Ficheiros de repositórios externos podem ser listados apesar de existirem. Tais falsos positivos aparecerão riscados.", + "wantedfiletext-nocat-noforeign": "Os seguintes ficheiros são usados, mas não existem.", "wantedtemplates": "Predefinições desejadas", "mostlinked": "Páginas com mais afluentes", "mostlinkedcategories": "Categorias com mais membros", @@ -1693,11 +1697,11 @@ "trackingcategories-desc": "Critérios de inclusão", "noindex-category-desc": "A página não é indexada por robôs porque contém a palavra mágica __NOINDEX__ e está num domínio onde o estatuto é permitido.", "index-category-desc": "A página contém a palavra mágica __INDEX__ (e está num domínio em que essa marca é permitida) e, portanto, será indexada pelos robôs mesmo quando normalmente não o seria.", - "post-expand-template-inclusion-category-desc": "A expansão de todas as predefinições faria com que o tamanho da página ultrapassasse $wgMaxArticleSize, pelo que algumas predefinições não foram expandidas.", - "post-expand-template-argument-category-desc": "A expansão de um argumento de prefefinição (algo em chavetas triplas, como {{{Foo}}} ) torna a página maior do que $wgMaxArticleSize.", - "expensive-parserfunction-category-desc": "Demasiadas funções do analisador custosas (como #ifexist) incluídas numa página. Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", - "broken-file-category-desc": "Categoria adicionada se a página contém um link quebrado para um ficheiro (um link para incorporar um ficheiro que não existe).", - "hidden-category-category-desc": "Esta é uma categoria com a marca __HIDDENCAT__, que faz com que ela não apareça na caixa de links de categoria nas páginas, por omissão.", + "post-expand-template-inclusion-category-desc": "O tamanho da página é superior a $wgMaxArticleSize, após a expansão de todas as predefinições, pelo que algumas predefinições não foram expandidas.", + "post-expand-template-argument-category-desc": "O tamanho da página é superior a $wgMaxArticleSize, após a expansão de um argumento de predefinição (algo em chavetas triplas, como {{{Foo}}}).", + "expensive-parserfunction-category-desc": "A página tem demasiadas funções do analisador custosas (como #ifexist) incluídas. Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", + "broken-file-category-desc": "A página contém uma ligação quebrada para um ficheiro (uma ligação para incorporar um ficheiro que não existe).", + "hidden-category-category-desc": "Esta é uma categoria com a marca __HIDDENCAT__, que faz com que ela não apareça na caixa de ligações de categoria nas páginas, por omissão.", "trackingcategories-nodesc": "Nenhuma descrição disponível.", "trackingcategories-disabled": "A categoria está desactivada.", "mailnologin": "Não existe endereço de envio", @@ -1734,7 +1738,7 @@ "mywatchlist": "Páginas vigiadas", "watchlistfor2": "Para $1 $2", "nowatchlist": "A sua lista de páginas vigiadas está vazia.", - "watchlistanontext": "Precisa de $1 para ver ou editar a sua lista de páginas vigiadas, por favor.", + "watchlistanontext": "Por favor, inicie sessão para ver ou editar itens da sua lista de páginas vigiadas.", "watchnologin": "Não está autenticado(a)", "addwatch": "Adicionar às páginas vigiadas", "addedwatchtext": "A página \"[[:$1]]\" foi adicionada à sua [[Special:Watchlist|lista de páginas vigiadas]].\nModificações futuras desta página e da respetiva página de discussão serão listadas lá.", @@ -1748,7 +1752,7 @@ "unwatchthispage": "Parar de vigiar esta página", "notanarticle": "Não é uma página de conteúdo", "notvisiblerev": "Edição eliminada", - "watchlist-details": "{{PLURAL:$1|Existe $1 página|Existem $1 páginas}} em sua lista de páginas vigiadas, excluindo-se as páginas de discussão.", + "watchlist-details": "{{PLURAL:$1|Existe $1 página|Existem $1 páginas}} na sua lista de páginas vigiadas, excluindo-se as páginas de discussão.", "wlheader-enotif": "A notificação por correio eletrónico está ativa.", "wlheader-showupdated": "As páginas modificadas desde a última vez que as visitou aparecem destacadas a '''negrito'''.", "wlnote": "A seguir {{PLURAL:$1|está a última alteração ocorrida|estão as últimas $1 alterações ocorridas}} {{PLURAL:$2|na última hora|nas últimas $2 horas}} até $3, $4.", @@ -1798,6 +1802,7 @@ "delete-edit-reasonlist": "Editar motivos de eliminação", "delete-toobig": "Esta página tem um histórico longo, com mais de $1 {{PLURAL:$1|edição|edições}}.\nA eliminação de páginas como esta foi restringida na {{SITENAME}}, para evitar problemas acidentais.", "delete-warning-toobig": "Esta página tem um histórico de edições longo, com mais de $1 {{PLURAL:$1|edição|edições}}.\nEliminá-la poderá causar problemas na base de dados da {{SITENAME}};\nprossiga com precaução.", + "delete-cantedit": "Não é possível eliminar esta página porque não possui os privilégios necessários para a editar.", "deleting-backlinks-warning": "'''Aviso:''' Existem [[Special:WhatLinksHere/{{FULLPAGENAME}}|páginas]] que contêm ligações para a página que está prestes a eliminar ou que a transcluem.", "rollback": "Reverter edições", "rollback_short": "Reverter", @@ -1939,7 +1944,7 @@ "sp-contributions-newonly": "Mostrar só edições que são criações de páginas", "sp-contributions-submit": "Pesquisar", "whatlinkshere": "Páginas afluentes", - "whatlinkshere-title": "Páginas que têm ligações para \"$1\"", + "whatlinkshere-title": "Páginas com ligações para \"$1\"", "whatlinkshere-page": "Página:", "linkshere": "As seguintes páginas têm ligação a '''[[:$1]]''':", "nolinkshere": "Não existem afluentes para '''[[:$1]]''' com as condições especificadas.", @@ -1958,7 +1963,7 @@ "autoblockid": "Bloqueio automático nº$1", "block": "Bloquear utilizador", "unblock": "Desbloquear utilizador", - "blockip": "Bloquear utilizador", + "blockip": "Bloquear {{GENDER:$1|utilizador|utilizadora}}", "blockip-legend": "Bloquear utilizador", "blockiptext": "Utilize o formulário abaixo para bloquear o acesso de escrita a um endereço IP específico ou a um nome de utilizador.\nIsto só deve ser feito para prevenir vandalismo e de acordo com a [[{{MediaWiki:Policy-url}}|política]]. Indique a seguir um motivo de bloqueio específico (por exemplo, indicando as páginas que foram alvo de vandalismo).", "ipaddressorusername": "Endereço de IP ou utilizador(a):", @@ -1987,7 +1992,7 @@ "ipb-unblock-addr": "Desbloquear $1", "ipb-unblock": "Desbloquear um utilizador ou endereço IP", "ipb-blocklist": "Ver bloqueios em vigência", - "ipb-blocklist-contribs": "Contribuições de $1", + "ipb-blocklist-contribs": "Contribuições de {{GENDER:$1|$1}}", "unblockip": "Desbloquear utilizador", "unblockiptext": "Utilize o formulário abaixo para restaurar o acesso de escrita de um endereço IP ou utilizador previamente bloqueado.", "ipusubmit": "Remover este bloqueio", @@ -2877,6 +2882,7 @@ "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussão]])", "unknown_extension_tag": "\"$1\" é uma marca de extensão desconhecida", "duplicate-defaultsort": "Aviso: A chave de ordenação padrão \"$2\" sobrepõe-se à anterior \"$1\".", + "duplicate-displaytitle": "Aviso: Exibir título \"$2\" substituindo o título anteriormente em exibição \"$1\".", "version": "Versão", "version-extensions": "Extensões instaladas", "version-skins": "Temas instalados", @@ -3036,6 +3042,9 @@ "logentry-rights-rights": "$1 modificou os privilégios do utilizador $3 de $4 para $5", "logentry-rights-rights-legacy": "$1 alterou os grupos de $3", "logentry-rights-autopromote": "$1 foi automaticamente {{GENDER:$2|promovido|promovida}} de $4 a $5", + "logentry-upload-upload": "$1 {{GENDER:$2|carregou}} $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|carregou}} uma nova versão de $3", + "logentry-upload-revert": "$1 {{GENDER:$2|carregou}} $3", "rightsnone": "(nenhum)", "feedback-bugornote": "Se está pronto para descrever um problema técnico em detalhe, por favor, [$1 comunique o defeito].\nCaso contrário, pode facilmente usar o formulário abaixo. O seu comentário será adicionado à página \"[$3 $2]\", junto com o seu nome de utilizador e o navegador que está a usar.", "feedback-subject": "Assunto:", @@ -3138,5 +3147,7 @@ "action-pagelang": "alterar o idioma da página", "log-name-pagelang": "Alterar registo de idioma", "log-description-pagelang": "Este é um registo de alterações aos idiomas das páginas.", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2|alterou}} o idioma da página $3 de $4 para $5." + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|alterou}} o idioma da página $3 de $4 para $5.", + "default-skin-not-found-row-enabled": "* $1 / $2 (ativado)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''desativado''')" } diff --git a/languages/i18n/qqq.json b/languages/i18n/qqq.json index 9a1d2e12e2..e135277e88 100644 --- a/languages/i18n/qqq.json +++ b/languages/i18n/qqq.json @@ -429,6 +429,9 @@ "hidetoc": "This is the link used to hide the table of contents\n\n{{Identical|Hide}}", "collapsible-collapse": "{{Doc-actionlink}}\nThis is the link used to collapse a collapsible element. (used as plaintext. No wikitext or html is parsed.)\n\nSee also:\n* {{msg-mw|Collapsible-expand}}\n{{Identical|Collapse}}", "collapsible-expand": "{{Doc-actionlink}}\nThis is the link used to expand a collapsible element (used as plaintext. No wikitext or html is parsed.)\n\nSee also:\n* {{msg-mw|Collapsible-collapse}}\n\nSee the following example:\n{{Identical|Expand}}", + "confirmable-confirm": "Question asking the user to confirm a potentially uncancellable action.\n\"Yes\" and \"No\" buttons are displayed beside it.\n\nSee also:\n* {{msg-mw|confirmable-yes}}\n* {{msg-mw|confirmable-no}}", + "confirmable-yes": "{{Doc-actionlink}}\nText of a button that will confirm triggering of a potentially uncancellable action.\n\nSee also:\n* {{msg-mw|confirmable-confirm}}\n* {{msg-mw|confirmable-no}}\n{{Identical|Yes}}", + "confirmable-no": "{{Doc-actionlink}}\nText of a button that will cancel triggering of a potentially uncancellable action.\n\nSee also:\n* {{msg-mw|confirmable-confirm}}\n* {{msg-mw|confirmable-yes}}\n{{Identical|No}}", "thisisdeleted": "Message shown on a deleted page when the user has the undelete right. Parameters:\n* $1 - a link to [[Special:Undelete]], with {{msg-mw|restorelink}} as the text\nSee also:\n* {{msg-mw|viewdeleted}}", "viewdeleted": "Message shown on a deleted page when the user does not have the undelete right (but has the deletedhistory right).\n\nParameters:\n* $1 - a link to [[Special:Undelete]], with {{msg-mw|restorelink}} as the text\nSee also:\n* {{msg-mw|thisisdeleted}}", "restorelink": "This text is always displayed in conjunction with the {{msg-mw|thisisdeleted}} message (View or restore $1?). The user will see\nView or restore {{PLURAL:$1|one deleted edit|$1 deleted edits}}? i.e ''View or restore one deleted edit?'' or\n''View or restore n deleted edits?''", @@ -1044,7 +1047,6 @@ "searchprofile-advanced-tooltip": "Used as tooltip for the option {{msg-mw|Searchprofile-advanced}} in [[Special:Search]].\n\nSee also:\n* {{msg-mw|Searchprofile-advanced|message}}\n* {{msg-mw|Searchprofile-advanced-tooltip|tooltip}}", "search-result-size": "Shown per line of a [[Special:Search|search result]]\n* $1 - the size of the page in bytes, but no need to add \"byte\" or similar as the unit is added by special function\n* $2 - the sum of all words in this page", "search-result-category-size": "Parameters:\n* $1 - number of members in this category. $1 is equal to $2+$3.\n* $2 - number of subcategories\n* $3 - number of files", - "search-result-score": "Shown per line of a [[Special:Search|search result]]. Parameters:\n* $1 - the relevance of this result in percent\n{{Identical|Relevance: $1%}}", "search-redirect": "\"Redirect\" is a noun here, not a verb.\n\nParameters:\n* $1 - a link to the redirect to the page (so, $1 is the page that the search result is redirected '''from''')", "search-section": "This text will be shown on the search result listing after the page title of a result if the search algorithm thinks that section is more relevant than the rest of the page. $1 is a section title.\n{{Identical|Section}}", "search-file-match": "This text will be shown on the search result listing after the page title of a result if the search engine got search results from the contents of files, rather than the pages.", @@ -1075,12 +1077,12 @@ "preferences-summary": "{{doc-specialpagesummary|preferences}}", "mypreferences": "Action link label that leads to [[Special:Preferences]]; appears in the top menu (e.g. \"Username Talk Preferences Watchlist Contributions Log out\").\n\nSee also:\n* {{msg-mw|Mypreferences}}\n* {{msg-mw|Accesskey-pt-preferences}}\n* {{msg-mw|Tooltip-pt-preferences}}\n{{Identical|Preferences}}", "prefs-edits": "In user preferences.", - "prefsnologintext2": "Parameters:\n* $1 - a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description", + "prefsnologintext2": "Showed on Special:Userlogin when user tries to access their preferences before logging in", "prefs-skin": "Used in user preferences.\n{{Identical|Skin}}", "skin-preview": "{{doc-actionlink}}\nThe link beside each skin name in [[Special:Preferences|your user preferences]], tab \"skin\".\n{{Identical|Preview}}", "datedefault": "Used as checkbox label in [[Special:Preferences#mw-prefsection-datetime|user preferences]], {{msg-mw|prefs-datetime}} tab.\n\nThis message indicates {{msg-mw|prefs-dateformat}} is default (= not specified).", "prefs-labs": "Header of a subsection at [[Special:Preferences]], tab ''{{int:prefs-editing}}'', listing features that are experimental", - "prefs-user-pages": "Header of a subsection at [[Special:Preferences]], tab ''{{int:prefs-misc}}'', listing features that are related to user pages", + "prefs-user-pages": "Header of a subsection at [[Special:Preferences]], tab ''{{int:prefs-misc}}'', listing features that are related to user pages\n{{Identical|User page}}", "prefs-personal": "Title of a tab in [[Special:Preferences]].\n{{Identical|User profile}}", "prefs-rc": "Used in user preferences.\n\n{{Identical|Recent changes}}", "prefs-watchlist": "Used in user preferences.\n{{Identical|Watchlist}}", @@ -1468,8 +1470,8 @@ "uploadwarning": "Used as section header in [[Special:Upload]].", "uploadwarning-text": "Used in [[Special:Upload]].", "savefile": "When uploading a file", - "uploadedimage": "This is the text of an entry in the [[Special:Log|upload log]] (and Recent Changes), after hour (and date, only in the Upload log) and user name. $1 is the name of the file uploaded.", - "overwroteimage": "This is the text of an entry in the [[Special:Log|upload log]] (and Recent Changes), after hour (and date, only in the Upload log) and user name. $1 is the name of the file uploaded.", + "uploadedimage": "{{ignored}}This is ''logentry'' message only used on IRC. $1 is the name of the file uploaded.", + "overwroteimage": "{{ignored}}This is ''logentry'' message only used on IRC. $1 is the name of the file uploaded.", "uploaddisabled": "Title of the [[Special:Upload]] page when upload is disabled.\n\nSee also:\n* {{msg-mw|Copyuploaddisabled}}", "copyuploaddisabled": "See also:\n* {{msg-mw|Uploaddisabled}}", "uploaddisabledtext": "Parameters:\n* $1 - (Optional) the name of the target file. See r22243 and [[bugzilla:8818|bug 8818]].", @@ -1972,7 +1974,7 @@ "mywatchlist": "Link at the upper right corner of the screen.\n\nSee also:\n* {{msg-mw|Mywatchlist}}\n* {{msg-mw|Accesskey-pt-watchlist}}\n* {{msg-mw|Tooltip-pt-watchlist}}\n{{Identical|Watchlist}}", "watchlistfor2": "Subtitle on [[Special:Watchlist]].\nParameters:\n* $1 - Username of current user\n* $2 - Tool links (View relevant changes | View and edit watchlist | Edit raw watchlist)\n{{Identical|For $1}}", "nowatchlist": "Displayed when there is no pages in the watchlist.", - "watchlistanontext": "Parameters:\n* $1 - a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description", + "watchlistanontext": "Shown on Special:Userlogin when user tries to access their watchlist before logging in", "watchnologin": "Used as error page title.\n\nThe error message for this title is:\n* {{msg-mw|Watchnologintext}}\n{{Identical|Not logged in}}", "addwatch": "Link to a dialog box, displayed at the end of the list of categories at the foot of each page.\n\nSee also:\n* {{msg-mw|Removewatch}}", "addedwatchtext": "Explanation shown when clicking on the {{msg-mw|Watch}} tab. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Addedwatch}}", @@ -2018,7 +2020,7 @@ "excontent": "Automated deletion reason when deleting a page for admins. Parameters:\n* $1 - content before deletion", "excontentauthor": "Automated deletion reason when deleting a page for admins providing that the page has one author only.\n\nParameters:\n* $1 - content before deletion\n* $2 - username", "exbeforeblank": "Automated deletion reason when deleting a page for admins providing that the page was blanked before deletion.\n\nParameters:\n* $1 - content before blanking", - "delete-confirm": "Used as page title. Parameters:\n* $1 - the page title", + "delete-confirm": "Used as page title. Parameters:\n* $1 - the page title\n{{Identical|Delete}}", "delete-legend": "{{Identical|Delete}}", "historywarning": "Warning when about to delete a page that has history.\n\nFollowed by a link which points to the history page.\n\nParameters:\n* $1 - the approximate number of revisions that the page has, the message should not claim to give an exact count", "confirmdeletetext": "Introduction shown when deleting a page.\n\nRefers to {{msg-mw|Policy-url}}.", @@ -2036,6 +2038,7 @@ "delete-edit-reasonlist": "Shown beneath the page deletion form on the right side. It is a link to {{msg-mw|Deletereason-dropdown|notext=1}}.\n\nSee also:\n* {{msg-mw|Ipb-edit-dropdown}}\n* {{msg-mw|Protect-edit-reasonlist}}.\n{{Identical|Edit delete reasons}}", "delete-toobig": "Parameters:\n* $1 - the upper limit of number of revisions\nSee also:\n* {{msg-mw|Delete-warning-toobig}}", "delete-warning-toobig": "Parameters:\n* $1 - the upper limit of number of revisions\nSee also:\n* {{msg-mw|Delete-toobig}}", + "delete-cantedit": "Used as error message when deleting the page.", "deleting-backlinks-warning": "A warning shown when a page that is being deleted has at least one link to it or is transcluded in at least one page.", "rollback": "{{Identical|Rollback}}", "rollback_short": "{{Identical|Rollback}}", @@ -3562,6 +3565,9 @@ "logentry-rights-rights": "* $1 - username\n* $2 - (see below)\n* $3 - username\n* $4 - list of user groups or {{msg-mw|Rightsnone}}\n* $5 - list of user groups or {{msg-mw|Rightsnone}}\n----\n{{Logentry|[[Special:Log/rights]]}}", "logentry-rights-rights-legacy": "* $1 - username\n* $2 - (see below)\n* $3 - username\n----\n{{Logentry|[[Special:Log/rights]]}}", "logentry-rights-autopromote": "* $1 - username\n* $2 - (see below)\n* $3 - (see below)\n* $4 - comma separated list of old user groups or {{msg-mw|Rightsnone}}\n* $5 - comma separated list of new user groups\n----\n{{Logentry|[[Special:Log/rights]]}}", + "logentry-upload-upload": "{{Logentry|[[Special:Log/upload]]}}", + "logentry-upload-overwrite": "{{Logentry|[[Special:Log/upload]]}}", + "logentry-upload-revert": "{{Logentry|[[Special:Log/upload]]}}", "rightsnone": "Default rights for registered users.\n\n{{Identical|None}}", "revdelete-logentry": "{{RevisionDelete}}\nThis is the message for the log entry in [[Special:Log/delete]] when changing visibility restrictions for page revisions.\n\nFollowed by the message {{msg-mw|revdelete-log-message}} in brackets.\n\nPreceded by the name of the user doing this task.\n\nParameters:\n* $1 - the page name\nSee also:\n* {{msg-mw|Logdelete-logentry}}", "logdelete-logentry": "{{RevisionDelete}}\nThis is the message for the log entry in [[Special:Log/delete]] when changing visibility restrictions for log events.\n\nFollowed by the message {{msg-mw|logdelete-log-message}} in brackets.\n\nPreceded by the name of the user who did this task.\n\nParameters:\n* $1 - the log name in brackets\nSee also:\n* {{msg-mw|Revdelete-logentry}}", @@ -3691,5 +3697,9 @@ "action-pagelang": "{{Doc-action|pagelang}}", "log-name-pagelang": "Display entry for log name for changes in page language in Special:Log.", "log-description-pagelang": "Display description for log name for changes in page language in Special:Log.", - "logentry-pagelang-pagelang": "{{Logentry}}\nAdditional parameters:\n* $4 - old language code, or \"[def]\" (hard-coded)\n* $5 - new language code, or \"[def]\" (hard-coded)" + "logentry-pagelang-pagelang": "{{Logentry}}\nAdditional parameters:\n* $4 - old language code, or \"[def]\" (hard-coded)\n* $5 - new language code, or \"[def]\" (hard-coded)", + "default-skin-not-found": "Message shown when the default skin for this MediaWiki installation can not be found.\n\nParameters:\n* $1: skin identifier for the default skin\n* $2: list of installed skins, composed using {{msg-mw|default-skin-not-found-row-enabled}} and {{msg-mw|default-skin-not-found-row-disabled}}\n* $3: code snippet to use to enable installed skins", + "default-skin-not-found-no-skins": "Message shown when the default skin for this MediaWiki installation can not be found and the installation has no skins at all.\n\nParameters:\n* $1: name of the default skin", + "default-skin-not-found-row-enabled": "One row of the list of installed skins shown as a part of {{msg-mw|default-skin-not-found}}, for an enabled skin.\n\nParameters:\n* $1: skin identifier\n$2: human-readable skin name", + "default-skin-not-found-row-disabled": "One row of the list of installed skins shown as a part of {{msg-mw|default-skin-not-found}}, for a disabled skin.\n\nParameters:\n* $1: skin identifier\n$2: human-readable skin name" } diff --git a/languages/i18n/ro.json b/languages/i18n/ro.json index 8c084e4d1f..231b15fea4 100644 --- a/languages/i18n/ro.json +++ b/languages/i18n/ro.json @@ -278,6 +278,9 @@ "hidetoc": "ascunde", "collapsible-collapse": "Restrânge", "collapsible-expand": "Extinde", + "confirmable-confirm": "Sunteți sigur{{GENDER:$1||ă}}?", + "confirmable-yes": "Da", + "confirmable-no": "Nu", "thisisdeleted": "Vizualizare sau recuperare $1?", "viewdeleted": "Vizualizați $1?", "restorelink": "{{PLURAL:$1|o modificare ștearsă|$1 modificări șterse|$1 de modificări șterse}}", @@ -362,7 +365,7 @@ "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:||ă}}", - "exception-nologin-text": "Vă rugăm să vă [[Special:Userlogin|autentificați]] pentru a accesa această pagină sau acțiune.", + "exception-nologin-text": "Vă rugăm să vă autentificați pentru a accesa această pagină sau acțiune.", "exception-nologin-text-manual": "Vă rugăm să vă $1 pentru a accesa această pagină sau acțiune.", "virus-badscanner": "Configurație greșită: scaner de virus necunoscut: ''$1''", "virus-scanfailed": "scanare eșuată (cod $1)", @@ -675,10 +678,10 @@ "parser-template-recursion-depth-warning": "Limită de adâncime a recursiei depășită ($1)", "language-converter-depth-warning": "Limita adâncimii convertorului de limbă a fost depășită ($1)", "node-count-exceeded-category": "Pagini unde numărul de noduri este depășit", - "node-count-exceeded-category-desc": "O categorie pentru paginile în care numărul de noduri este depășit.", + "node-count-exceeded-category-desc": "Pagina depășește numărul maxim de noduri.", "node-count-exceeded-warning": "Pagina a depășit numărul de noduri", "expansion-depth-exceeded-category": "Pagini unde profunzimea de expansiune este depășită", - "expansion-depth-exceeded-category-desc": "Aceasta este o categorie pentru paginile în care a fost depășită profunzimea de expansiune.", + "expansion-depth-exceeded-category-desc": "Pagina depășește profunzimea maximă de expansiune.", "expansion-depth-exceeded-warning": "Pagina depășește profunzimea de expansiune", "parser-unstrip-loop-warning": "Buclă nedetașabilă detectată", "parser-unstrip-recursion-limit": "Limita de recursivitate nedetașabilă depășită ($1)", @@ -846,7 +849,6 @@ "searchprofile-advanced-tooltip": "Caută în spații de nume personalizate", "search-result-size": "$1 ({{PLURAL:$2|1 cuvânt|$2 cuvinte}})", "search-result-category-size": "$1 {{PLURAL:$1|element|elemente}} ($2 {{PLURAL:$2|categorie|categorii}}, $3 {{PLURAL:$3|fișier|fișiere}})", - "search-result-score": "Relevanță: $1%", "search-redirect": "(redirecționare de la $1)", "search-section": "(secțiunea $1)", "search-file-match": "(se regăsește în conținutul fișierului)", @@ -873,7 +875,7 @@ "preferences": "Preferințe", "mypreferences": "Preferințe", "prefs-edits": "Număr de modificări:", - "prefsnologintext2": "Vă rugăm să vă $1 pentru a vă seta preferințele de utilizator.", + "prefsnologintext2": "Vă rugăm să vă autentificați pentru a vă modifica preferințele de utilizator.", "prefs-skin": "Aspect", "skin-preview": "Previzualizare", "datedefault": "Nici o preferință", @@ -1252,8 +1254,6 @@ "uploadwarning": "Avertizare la trimiterea fișierului", "uploadwarning-text": "Vă rugăm să modificați descrierea fișierului mai jos și să încercați din nou.", "savefile": "Salvează fișierul", - "uploadedimage": "a trimis [[$1]]", - "overwroteimage": "încărcat o versiune nouă a fișierului \"[[$1]]\"", "uploaddisabled": "Ne pare rău, trimiterea de imagini este dezactivată.", "copyuploaddisabled": "Trimiterea prin URL este dezactivată.", "uploaddisabledtext": "Încărcările de fișiere sunt dezactivate.", @@ -1659,11 +1659,11 @@ "trackingcategories-desc": "Criteriile de includere în categorie", "noindex-category-desc": "Pagina conține cuvântul magic __NOINDEX__ (aflându-se într-un spațiu de nume care permite acest marcaj) și, drept urmare, nu este indexată de roboți.", "index-category-desc": "Pagina conține cuvântul magic __INDEX__ (aflându-se într-un spațiu de nume care permite acest marcaj) și, ca urmare, este indexată de roboți, deși în mod normal acest lucru nu s-ar fi întâmplat.", - "post-expand-template-inclusion-category-desc": "După extinderea tuturor formatelor, dimensiunea paginii a depășit $wgMaxArticleSize, astfel că anumite formate nu au fost extinse.", - "post-expand-template-argument-category-desc": "După extinderea argumentului unui format (ceva plasat între acolade triple, precum {{{Foo}}}), pagina a depășit $wgMaxArticleSize.", - "expensive-parserfunction-category-desc": "Prea multe funcții costisitoare de analiză (precum #ifexist) incluse într-o pagină. Vedeți [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", - "broken-file-category-desc": "Categorie adăugată dacă pagina conține o legătură întreruptă către un fișier (o legătură folosită pentru încorporarea unui fișier atunci când fișierul nu există).", - "hidden-category-category-desc": "Această categorie conține __HIDDENCAT__, ceea ce împiedică în mod implicit afișarea ei în zona cu legături către categorii din cadrul paginilor.", + "post-expand-template-inclusion-category-desc": "Dimensiunea paginii a depășit $wgMaxArticleSize după extinderea tuturor formatelor, astfel că anumite formate nu au fost extinse.", + "post-expand-template-argument-category-desc": "Pagina a depășit $wgMaxArticleSize după extinderea argumentului unui format (ceva plasat între acolade triple, precum {{{Foo}}}).", + "expensive-parserfunction-category-desc": "Pagina folosește prea multe funcții costisitoare de analiză (precum #ifexist). Vedeți [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", + "broken-file-category-desc": "Pagina conține o legătură întreruptă către un fișier (o legătură folosită pentru încorporarea unui fișier atunci când fișierul nu există).", + "hidden-category-category-desc": "Categoria conține __HIDDENCAT__ în conținutul său, ceea ce împiedică în mod implicit afișarea ei în zona cu legături către categorii din cadrul paginilor.", "trackingcategories-nodesc": "Nicio descriere disponibilă.", "trackingcategories-disabled": "Categoria este dezactivată", "mailnologin": "Nu există adresă de trimitere", @@ -1700,7 +1700,7 @@ "mywatchlist": "Pagini urmărite", "watchlistfor2": "Pentru $1 $2", "nowatchlist": "Lista dumneavoastră de pagini urmărite nu conține nici o pagină.", - "watchlistanontext": "Vă rugăm să vă $1 pentru a vizualiza sau edita elementele din lista dumneavoastră de pagini urmărite.", + "watchlistanontext": "Vă rugăm să vă autentificați pentru a vizualiza sau modifica elementele din lista dumneavoastră de pagini urmărite.", "watchnologin": "Nu sunteți autentificat", "addwatch": "Adăugă la lista de pagini urmărite", "addedwatchtext": "Pagina „[[:$1]]” a fost adăugată în lista dumneavoastră de [[Special:Watchlist|pagini urmărite]].\nModificările viitoare efectuate asupra acestei pagini dar și asupra paginii de discuție asociată vor fi listate acolo.", @@ -1764,6 +1764,7 @@ "delete-edit-reasonlist": "Modifică motivele ștergerii", "delete-toobig": "Această pagină are un istoric al modificărilor important, cu mai mult de $1 {{PLURAL:$1|versiune|versiuni|de versiuni}}.\nȘtergerea unei astfel de pagini a fost restricționată pentru a preveni apariția unor erori în {{SITENAME}}.", "delete-warning-toobig": "Această pagină are un istoric al modificărilor mult prea mare, cu mai mult de $1 {{PLURAL:$1|versiune|versiuni|de versiuni}}.\nȘtergerea sa poate afecta baza de date a sitului {{SITENAME}};\nacționați cu precauție.", + "delete-cantedit": "Nu puteți șterge această pagină, deoarece nu aveți permisiunea de a o modifica.", "deleting-backlinks-warning": "'''Atenție:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Alte pagini]] se leagă sau transclud pagina pe care doriți să o ștergeți.", "rollback": "Editări de revenire", "rollback_short": "Revenire", @@ -1924,7 +1925,7 @@ "autoblockid": "Autoblocare #$1", "block": "Blocare utilizator", "unblock": "Deblocare utilizator", - "blockip": "Blocare utilizator", + "blockip": "Blocare {{GENDER:$1|utilizator|utilizatoare}}", "blockip-legend": "Blocare utilizator/adresă IP", "blockiptext": "Pentru a bloca un utilizator completați rubricile de mai jos.
    \n'''Respectați [[{{MediaWiki:Policy-url}}|politica de blocare]].'''
    \nPrecizați motivul blocării; de exemplu indicați paginile vandalizate de acest utilizator.", "ipaddressorusername": "Adresă IP sau nume de utilizator", @@ -1953,7 +1954,7 @@ "ipb-unblock-addr": "Deblochează utilizatorul $1", "ipb-unblock": "Deblocați un nume de utilizator sau o adresă IP", "ipb-blocklist": "Vezi blocările existente", - "ipb-blocklist-contribs": "Contribuțiile utilizatorului $1", + "ipb-blocklist-contribs": "Contribuțiile {{GENDER:$1|utilizatorului $1|utilizatoarei $1}}", "unblockip": "Deblochează adresă IP", "unblockiptext": "Folosiți formularul de mai jos pentru a restaura permisiunea de scriere pentru adrese IP sau nume de utilizator blocate anterior.", "ipusubmit": "Elimină blocarea", @@ -3004,6 +3005,9 @@ "logentry-rights-rights": "$1 {{GENDER:$2|a schimbat}} apartenența la grup pentru $3 de la $4 la $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|a schimbat}} apartenența la grup pentru $3", "logentry-rights-autopromote": "$1 {{GENDER:$2|a fost promovat|a fost promovată}} în mod automat de la $4 la $5", + "logentry-upload-upload": "$1 {{GENDER:$2|a încărcat}} $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|a încărcat}} o nouă versiune pentru $3", + "logentry-upload-revert": "$1 {{GENDER:$2|a încărcat}} $3", "rightsnone": "(niciunul)", "feedback-bugornote": "Dacă sunteți pregătit să descrieți o problemă tehnică în detaliu vă rugăm să [$1 raportați un bug].\nÎn caz contrar, puteți utiliza formularul de mai jos. Comentariul dumneavoastră va fi adăugat pe pagina „[$3 $2]”, împreună cu numele de utilizator și numele navigatorului pe care îl folosiți.", "feedback-subject": "Subiect:", @@ -3105,5 +3109,7 @@ "action-pagelang": "modificați limba paginii", "log-name-pagelang": "Jurnal modificare limbă", "log-description-pagelang": "Acesta este un jurnal cu modificări ale limbii paginilor.", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2|a modificat}} limba paginii pentru $3 din $4 în $5." + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|a modificat}} limba paginii pentru $3 din $4 în $5.", + "default-skin-not-found-row-enabled": "* $1 / $2 (activat)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''dezactivat''')" } diff --git a/languages/i18n/ru.json b/languages/i18n/ru.json index 4c817bb246..65507bf82f 100644 --- a/languages/i18n/ru.json +++ b/languages/i18n/ru.json @@ -324,6 +324,9 @@ "hidetoc": "убрать", "collapsible-collapse": "свернуть", "collapsible-expand": "развернуть", + "confirmable-confirm": "{{GENDER:$1|Вы}} уверены?", + "confirmable-yes": "Да", + "confirmable-no": "Нет", "thisisdeleted": "Просмотреть или восстановить $1?", "viewdeleted": "Просмотреть $1?", "restorelink": "{{PLURAL:$1|$1 удалённую правку|$1 удалённых правок|$1 удалённые правки|1=удалённую правку}}", @@ -408,7 +411,7 @@ "invalidtitle-knownnamespace": "Недопустимый заголовок с пространством имен «$2» и текстом «$3»", "invalidtitle-unknownnamespace": "Недопустимый заголовок с неизвестным номером пространства $1 и текстом «$2»", "exception-nologin": "Вы не представились системе", - "exception-nologin-text": "Необходимо [[Special:Userlogin|представиться]], чтобы иметь доступ к этой странице или действию.", + "exception-nologin-text": "Необходимо представиться, чтобы иметь доступ к этой странице или действию.", "exception-nologin-text-manual": "Необходимо $1, чтобы иметь доступ к этой странице или действию.", "virus-badscanner": "Ошибка настройки. Неизвестный сканер вирусов: ''$1''", "virus-scanfailed": "ошибка сканирования (код $1)", @@ -719,10 +722,10 @@ "parser-template-recursion-depth-warning": "Превышен предел глубины рекурсии шаблона ($1)", "language-converter-depth-warning": "Превышен предел глубины преобразователя языков ($1)", "node-count-exceeded-category": "Странице, на которых превышено число узлов", - "node-count-exceeded-category-desc": "Категория для страниц, на которых превышено число узлов.", - "node-count-exceeded-warning": "На странице превышено число узлов", + "node-count-exceeded-category-desc": "У страницы превышено максимально допустимое число узлов.", + "node-count-exceeded-warning": "Страница, на которой превышено максимально допустимое число узлов.", "expansion-depth-exceeded-category": "Страницы с превышением глубины раскрытия", - "expansion-depth-exceeded-category-desc": "Это категория для страниц с превышением глубины раскрытия.", + "expansion-depth-exceeded-category-desc": "У страницы превышена максимально допустимая глубина раскрытия.", "expansion-depth-exceeded-warning": "На странице превышен предел вложенности", "parser-unstrip-loop-warning": "Обнаружен незакрытый pre", "parser-unstrip-recursion-limit": "Превышен предел рекурсии ($1)", @@ -731,7 +734,7 @@ "undo-failure": "Правка не может быть отменена из-за несовместимости промежуточных изменений.", "undo-norev": "Правка не может быть отменена, так как её не существует или она была удалена.", "undo-nochange": "Правка, похоже, уже была отменена.", - "undo-summary": "Отмена правки $1, сделанной {{GENDER:$2|участником|участницей}} [[Special:Contributions/$2|$2]] ([[User talk:$2|обс.]])", + "undo-summary": "Отмена правки $1, сделанной {{GENDER:$2|участником|участницей}} [[Special:Contribs/$2|$2]] ([[User talk:$2|обс.]])", "undo-summary-username-hidden": "Отмена правки $1, сделанной участником, чьё имя скрыто", "cantcreateaccounttitle": "Невозможно создать учётную запись", "cantcreateaccount-text": "Создание учётных записей с этого IP-адреса ('''$1''') было заблокировано {{GENDER:$3|участником|участницей|}} [[User:$3|$3]].\n\n$3 {{GENDER:$3|указал|указала}} следующую причину: ''$2''.", @@ -890,7 +893,6 @@ "searchprofile-advanced-tooltip": "Искать в заданных пространствах имён", "search-result-size": "$1 ({{PLURAL:$2|$2 слово|$2 слов|$2 слова}})", "search-result-category-size": "$1 {{PLURAL:$1|вхождение|вхождений|вхождения}} ($2 {{PLURAL:$2|подкатегория|подкатегорий|подкатегории}}, $3 {{PLURAL:$3|файл|файлов|файла}})", - "search-result-score": "Релевантность: $1%.", "search-redirect": "(перенаправление с $1)", "search-section": "(раздел «$1»)", "search-file-match": "(совпадает с содержимым файла)", @@ -917,7 +919,7 @@ "preferences": "Настройки", "mypreferences": "Настройки", "prefs-edits": "Количество правок:", - "prefsnologintext2": "Необходимо $1, чтобы изменять настройки.", + "prefsnologintext2": "Пожалуйста, войдите, чтобы изменить настройки.", "prefs-skin": "Тема оформления", "skin-preview": "Предпросмотр", "datedefault": "По умолчанию", @@ -1295,8 +1297,6 @@ "uploadwarning": "Предупреждение", "uploadwarning-text": "Пожалуйста, измените представленное ниже описание файла и попробуйте ещё раз.", "savefile": "Записать файл", - "uploadedimage": "загрузил «[[$1]]»", - "overwroteimage": "загружена новая версия «[[$1]]»", "uploaddisabled": "Загрузка запрещена", "copyuploaddisabled": "Загрузка по URL отключена.", "uploaddisabledtext": "Загрузка файлов отключена.", @@ -1486,7 +1486,7 @@ "mimesearch": "Поиск по MIME", "mimesearch-summary": "Эта страница позволяет фильтровать файлы по их MIME-типу. Формат ввода: типсодержимого/подтип или типсодержимого/*, например image/jpeg.", "mimetype": "MIME-тип:", - "download": "загрузить", + "download": "скачать", "unwatchedpages": "Страницы, за которыми никто не следит", "listredirects": "Список перенаправлений", "listduplicatedfiles": "Список файлов с дубликатами", @@ -1707,11 +1707,11 @@ "trackingcategories-desc": "Критерий включения в категорию", "noindex-category-desc": "Страница не индексируются поисковыми роботами, потому что на ней имеется «волшебное слово» __NOINDEX__, и она находится в пространстве имён, где разрешён этот флаг).", "index-category-desc": "На странице имеется «волшебное слово» __INDEX__ (и страница находится в пространстве имён, где разрешён этот флаг), поэтому она индексируются поисковыми роботами в тех случаях, когда этого обычно не происходит.", - "post-expand-template-inclusion-category-desc": "После показа всех шаблонов размер страницы станет больше, чем $wgMaxArticleSize, поэтому некоторые шаблоны не были показаны полностью.", - "post-expand-template-argument-category-desc": "После раскрытия аргумента шаблона (что-нибудь в тройных фигурных скобках, например, {{{Foo}}}), страница станет больше, чем $wgMaxArticleSize.", + "post-expand-template-inclusion-category-desc": "Размер страницы станет больше $wgMaxArticleSize после показа всех шаблонов, поэтому некоторые из них не были показаны полностью.", + "post-expand-template-argument-category-desc": "Страница станет больше $wgMaxArticleSize после раскрытия аргумента шаблона (что-нибудь в тройных фигурных скобках, например, {{{Foo}}})).", "expensive-parserfunction-category-desc": "На странице используется слишком много ресурсоёмких функций (таких, как #ifexist). Подробнее — на странице [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", - "broken-file-category-desc": "Категория добавляется, если страница содержит некорректную файловую ссылку (ссылку на несуществующий файл).", - "hidden-category-category-desc": "Это категория с добавленной меткой __HIDDENCAT__ в ней, что по умолчанию предотвращает её отображение на страницах в разделе категорий.", + "broken-file-category-desc": "Страница содержит некорректную файловую ссылку (ссылку на несуществующий файл).", + "hidden-category-category-desc": "Эта категория содержит метку __HIDDENCAT__ содержимом странице, что по умолчанию предотвращает её отображение на страницах в разделе категорий.", "trackingcategories-nodesc": "Описание отсутствует.", "trackingcategories-disabled": "Категория отключена", "mailnologin": "Адрес для отправки отсутствует", @@ -1748,7 +1748,7 @@ "mywatchlist": "Список наблюдения", "watchlistfor2": "Для $1 $2", "nowatchlist": "Ваш список наблюдения пуст.", - "watchlistanontext": "Вы должны $1, чтобы просмотреть или отредактировать список наблюдения.", + "watchlistanontext": "Вы должны войти, чтобы просмотреть или отредактировать элементы в списке наблюдения.", "watchnologin": "Нужно представиться системе", "addwatch": "Добавить в список наблюдения", "addedwatchtext": "Страница «[[:$1]]» была добавлена в ваш [[Special:Watchlist|список наблюдения]].\nТам будут отмечаться последующие изменения этой страницы, а также связанной с ней страницы обсуждения.", @@ -1812,6 +1812,7 @@ "delete-edit-reasonlist": "Править список причин", "delete-toobig": "У этой страницы очень длинная история изменений, более $1 {{PLURAL:$1|версии|версий}}.\nУдаление таких страниц было запрещено во избежание нарушений в работе сайта «{{SITENAME}}».", "delete-warning-toobig": "У этой страницы очень длинная история изменений, более $1 {{PLURAL:$1|версии|версий}}.\nЕё удаление может привести к нарушению нормальной работы базы данных сайта «{{SITENAME}}»;\nдействуйте с осторожностью.", + "delete-cantedit": "Вы не можете удалить эту страницу, так как у вас нет разрешения на её редактирование.", "deleting-backlinks-warning": "'''Предупреждение.''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Другие страницы]] ссылаются на страницу, которую вы собираетесь удалить, или содержат её.", "rollback": "Откатить изменения", "rollback_short": "Откат", @@ -1972,7 +1973,7 @@ "autoblockid": "Автоблокировка #$1", "block": "Блокировка участника", "unblock": "Разблокировка участника", - "blockip": "Заблокировать", + "blockip": "Заблокировать {{GENDER:$1|участника}}", "blockip-legend": "Блокировка участника", "blockiptext": "Используйте форму ниже, чтобы заблокировать возможность записи с определённого IP-адреса.\nЭто может быть сделано только для предотвращения вандализма и только в соответствии с [[{{MediaWiki:Policy-url}}|правилами]].\nНиже укажите конкретную причину (к примеру, процитируйте некоторые страницы с признаками вандализма).", "ipaddressorusername": "IP-адрес или имя участника:", @@ -2001,7 +2002,7 @@ "ipb-unblock-addr": "Разблокировать $1", "ipb-unblock": "Разблокировать участника или IP-адрес", "ipb-blocklist": "Показать действующие блокировки", - "ipb-blocklist-contribs": "Вклад $1", + "ipb-blocklist-contribs": "Вклад {{GENDER:$1|$1}}", "unblockip": "Разблокировать участника", "unblockiptext": "Используйте форму ниже, чтобы восстановить возможность редактирования с ранее заблокированного IP-адреса или учётной записи.", "ipusubmit": "Снять эту блокировку", @@ -3136,6 +3137,9 @@ "logentry-rights-rights": "$1 {{GENDER:$2|изменил|изменила}} членство в группах для $3 с $4 на $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|изменил|изменила}} членство в группах для $3", "logentry-rights-autopromote": "$1 был{{GENDER:$2||а}} автоматически переведен{{GENDER:$2||а}} из $4 в $5", + "logentry-upload-upload": "$1 загрузил{{GENDER:$2||а}} $3", + "logentry-upload-overwrite": "$1 загрузил{{GENDER:$2||а}} новую версию $3", + "logentry-upload-revert": "$1 загрузил{{GENDER:$2||а}} $3", "rightsnone": "(нет)", "feedback-bugornote": "Если вы готовы подробно описать техническую проблему, пожалуйста, [$1 сообщите об ошибке].\nВ противном случае вы можете использовать данную простую форму. Ваш комментарий будет добавлен на страницу «[$3 $2]» вместе с вашим именем участника и используемым браузером.", "feedback-subject": "Тема:", @@ -3238,5 +3242,9 @@ "action-pagelang": "изменять язык страницы", "log-name-pagelang": "Журнал изменения языка", "log-description-pagelang": "Это журнал изменений в языках страницы.", - "logentry-pagelang-pagelang": "$1 изменил{{GENDER:$2||а}} язык страницы для $3 с $4 на $5." + "logentry-pagelang-pagelang": "$1 изменил{{GENDER:$2||а}} язык страницы для $3 с $4 на $5.", + "default-skin-not-found": "Упс! Тема оформления по умолчанию для вашей вики ($wgDefaultSkin), $1 недоступна.\n\nВаша установка, похоже, содержит следующие темы оформления. См. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] для получения информации о том, как включить темы оформления и выбрать тему по умолчанию.\n\n\n$ 2\n\n\n; Если вы только что установили MediaWiki:\n: Вы, видимо, сделали это с Git или непосредственно из исходного кода с использованием другого способа. Тогда такое возможно. Попробуйте установить некоторые темы из [https://www.mediawiki.org/wiki/Category:All_skins каталога тем оформления сайта mediawiki.org]:\n:* Скачав [https://www.mediawiki.org/wiki/Download архив установочных файлов], который содержит несколько тем оформления и расширений. Вы можете скопировать папку skins/ из него.\n:* Склонировав один из репозиториев mediawiki/skins/* через git в подпапку skins/ папки, куда установлена MediaWiki.\n: Это не должно навредить вашему репозиторию, если вы MediaWiki-разработчик. См. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] для получения информации о том, как включить темы оформления и выбрать тему по умолчанию.\n; Если вы только что обновили MediaWiki:\n: MediaWiki версии 1.24 и более новых больше не включает автоматически установленные темы (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]).\nВы можете вставить следующие строчки в LocalSettings.php, чтобы включить все установленные темы оформления: \n\n\n
    $3
    \n\n\n; Если вы только что изменили LocalSettings.php:\n: Перепроверьте названия тем на наличие опечаток.", + "default-skin-not-found-no-skins": "Упс! Тема оформления по умолчанию для вашей вики ($wgDefaultSkin), $1 недоступна.\n\n\nУ вас нет установленных тем оформления.\n\n\n; Если вы только что установили или обновили MediaWiki:\n: Вы, видимо, сделали это с Git или непосредственно из исходного кода с использованием другого способа. Тогда такое возможно. MediaWiki версии 1.24 или более поздней не содержат темы оформления в основном репозитории. Попробуйте установить некоторые темы из [https://www.mediawiki.org/wiki/Category:All_skins каталога тем оформления сайта mediawiki.org]:\n:* Скачав [https://www.mediawiki.org/wiki/Download архив установочных файлов], который содержит несколько тем оформления и расширений. Вы можете скопировать папку skins/ из него.\n:* Склонировав один из репозиториев mediawiki/skins/* через git в подпапку skins/ папки, куда установлена MediaWiki.\n: Это не должно навредить вашему репозиторию, если вы MediaWiki-разработчик. См. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] для получения информации о том, как включить темы оформления и выбрать тему по умолчанию.", + "default-skin-not-found-row-enabled": "* $1 / $2 (включено)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''отключено''')" } diff --git a/languages/i18n/sc.json b/languages/i18n/sc.json index 613b3b98d4..a1ce286125 100644 --- a/languages/i18n/sc.json +++ b/languages/i18n/sc.json @@ -495,7 +495,6 @@ "searchprofile-articles-tooltip": "Chirca in $1", "searchprofile-images-tooltip": "Chirca files", "search-result-size": "$1 ({{PLURAL:$2|1 faeddu|$2 faeddos}})", - "search-result-score": "Rilevàntzia: $1%", "search-redirect": "(redirect $1)", "search-section": "(setzione $1)", "search-suggest": "Fortzis fias chirchende: $1", @@ -669,7 +668,6 @@ "badfilename": "Su nùmene de su file est stadu cunvertidu in \"$1\".", "uploadwarning": "Avvisu de carrigamentu", "savefile": "Sarva file", - "uploadedimage": "carrigadu \"[[$1]]\"", "upload-source": "File de orìgine", "sourcefilename": "Nùmene de su file de orìgine:", "sourceurl": "Diretzione originària:", diff --git a/languages/i18n/sh.json b/languages/i18n/sh.json index b4225987cc..5f637fd47e 100644 --- a/languages/i18n/sh.json +++ b/languages/i18n/sh.json @@ -6,7 +6,8 @@ "Nemo bis", "OC Ripper", "לערי ריינהארט", - "아라" + "아라", + "Milicevic01" ] }, "tog-underline": "Podvuci linkove:", @@ -193,7 +194,6 @@ "talkpagelinktext": "Razgovor", "specialpage": "Posebna stranica", "personaltools": "Lični alati", - "postcomment": "Pošaljite komentar - Пошаљите коментар", "articlepage": "Pogledaj stranicu sa sadržajem (članak)", "talk": "Razgovor / Разговор", "views": "Pregledi", @@ -371,7 +371,6 @@ "externaldberror": "Došlo je do greške pri vanjskoj autorizaciji baze podataka ili vam nije dopušteno osvježavanje Vašeg vanjskog korisničkog računa.", "login": "Prijavi me - Пријави ме", "nav-login-createaccount": "Prijavi se / Registruj se", - "loginprompt": "Morate imati kolačiće ('''cookies''') omogućene da biste se prijavili na {{SITENAME}}.", "userlogin": "Prijavi se / Пријави се", "userloginnocreate": "Prijavi se", "logout": "Odjavi se / Одјави се", @@ -661,7 +660,7 @@ "undo-failure": "Izmjene se ne mogu vratiti zbog konflikta sa izmjenama u međuvremenu.", "undo-norev": "Izmjena se ne može vratiti jer ne postoji ranija ili je obrisana.", "undo-nochange": "Ovo je uređivanje izgleda već bilo poništeno.", - "undo-summary": "Poništena izmjena $1 [[Special:Contributions/$2|korisnika $2]] ([[User talk:$2|razgovor]])", + "undo-summary": "Poništena izmjena $1 [[Special:Contribs/$2|korisnika $2]] ([[User talk:$2|razgovor]])", "undo-summary-username-hidden": "Poništi izmjenu $1 od skrivenog korisnika", "cantcreateaccounttitle": "Nije moguće napraviti korisnički račun", "cantcreateaccount-text": "Pravljenje korisničkog računa sa ove IP adrese ('''$1''') je blokirano od strane [[User:$3|$3]].\n\nRazlog koji je naveo $3 je ''$2''", @@ -818,7 +817,6 @@ "searchprofile-advanced-tooltip": "Traži u ostalim imenskim prostorima", "search-result-size": "$1 ({{PLURAL:$2|1 riječ|$2 riječi}})", "search-result-category-size": "{{PLURAL:$1|1 član|$1 člana|$1 članova}} ({{PLURAL:$2|1 podkategorija|$2 podkategorije|$2 podkategorija}}, {{PLURAL:$3|1 datoteka|$3 datoteke|$3 datoteka}})", - "search-result-score": "Relevantnost: $1%", "search-redirect": "(preusmjeravanje $1)", "search-section": "(sekcija $1)", "search-file-match": "(odgovara sadržaju datoteke)", @@ -1215,8 +1213,6 @@ "uploadwarning": "Upozorenje pri slanju", "uploadwarning-text": "Molimo izmijeniti opis datoteke ispod i pokušajte kasnije.", "savefile": "Snimi datoteku", - "uploadedimage": "postavljeno \"[[$1]]\"", - "overwroteimage": "postavljena nova verzija datoteke \"[[$1]]\"", "uploaddisabled": "Slanje fajlova je isključeno", "copyuploaddisabled": "Postavljanje putem URL nije omogućeno.", "uploaddisabledtext": "Postavljanje datoteka je onemogućeno.", @@ -1655,6 +1651,7 @@ "watchlist-details": "{{PLURAL:$1|$1 stranica praćena|$1 stranice praćene|$1 stranica praćeno}} ne računajući stranice za razgovor.", "wlheader-enotif": "* Obavještavanje e-poštom je omogućeno.", "wlheader-showupdated": "* Stranice koje su izmijenjene od kad ste ih posljednji put posjetili su prikazane '''podebljanim slovima'''", + "wlnote": "Ispod {{PLURAL:$1|je posljednja izmjena|su posljednje '''$1''' izmjene|je posljednjih '''$1''' izmjena}} u {{PLURAL:$2|prethodnom satu|prethodna '''$2''' sata|prethodnih '''$2''' sati}}, zaključno sa $3, $4.", "wlshowlast": "Prikaži posljednjih $1 sati $2 dana $3", "watchlist-options": "Opcije liste praćenja", "watching": "Pratim... / Додавање на списак надгледања...", diff --git a/languages/i18n/sl.json b/languages/i18n/sl.json index b0a5806cb7..75a2c7d001 100644 --- a/languages/i18n/sl.json +++ b/languages/i18n/sl.json @@ -265,6 +265,9 @@ "hidetoc": "skrij", "collapsible-collapse": "Skrči", "collapsible-expand": "Razširi", + "confirmable-confirm": "{{GENDER:$1|Ste}} prepričani?", + "confirmable-yes": "Da", + "confirmable-no": "Ne", "thisisdeleted": "Prikažem ali vrnem $1?", "viewdeleted": "Prikažem $1?", "restorelink": "$1 {{PLURAL:$1|izbrisano redakcijo|izbrisani redakciji|izbrisane redakcije|izbrisanih redakcij}}", @@ -349,7 +352,7 @@ "invalidtitle-knownnamespace": "Neveljaven naslov z imenskim prostorom »$2« in besedilom »$3«", "invalidtitle-unknownnamespace": "Neveljaven naslov z neznano številko imenskega prostora $1 in besedilom »$2«", "exception-nologin": "Niste prijavljeni", - "exception-nologin-text": "Prosimo, [[Special:Userlogin|prijavite se]], da lahko dostopate do strani ali dejanja.", + "exception-nologin-text": "Prosimo, prijavite se, da lahko dostopate do strani ali dejanja.", "exception-nologin-text-manual": "Da lahko dostopate do strani ali dejanja, se morate $1.", "virus-badscanner": "Slaba konfiguracija: neznani virus skener: ''$1''", "virus-scanfailed": "pregled ni uspel (koda $1)", @@ -662,10 +665,10 @@ "parser-template-recursion-depth-warning": "Prekoračena globina rekurzije predlog ($1)", "language-converter-depth-warning": "Prekoračena globina pretvorbe jezikov ($1)", "node-count-exceeded-category": "Strani s prekoračenim številom vozlišč", - "node-count-exceeded-category-desc": "Kategorija s stranmi, na katerih je preseženo število vozlišč.", + "node-count-exceeded-category-desc": "Stran presega največje število vozlišč.", "node-count-exceeded-warning": "Stran je prekoračila število vozlišč", "expansion-depth-exceeded-category": "Strani s prekoračeno globino razširitve", - "expansion-depth-exceeded-category-desc": "Kategorija s stranmi, na katerih je prekoračena globina razširitve.", + "expansion-depth-exceeded-category-desc": "Stran presega največjo globino razširitve.", "expansion-depth-exceeded-warning": "Stran je prekoračila globino razširitve", "parser-unstrip-loop-warning": "Zaznal sem odvezano zanko", "parser-unstrip-recursion-limit": "Presežena je omejitev odvezane rekurzije ($1)", @@ -833,7 +836,6 @@ "searchprofile-advanced-tooltip": "Iskanje v imenskih prostorih po meri", "search-result-size": "$1 ({{PLURAL:$2|1 beseda|2 besedi|$2 besede|$2 besed|$2 besed}})", "search-result-category-size": "$1 {{PLURAL:$1|član|člana|člani|članov}} ($1 {{PLURAL:$2|podkategorija|podkategoriji|podkategorije|podkategorij}}, $1 {{PLURAL:$3|datoteka|datoteki|datoteke|datotek}})", - "search-result-score": "Ustreznost: $1%", "search-redirect": "(preusmeritev $1)", "search-section": "(razdelek $1)", "search-file-match": "(ujema se z vsebino datoteke)", @@ -860,7 +862,7 @@ "preferences": "Nastavitve", "mypreferences": "Nastavitve", "prefs-edits": "Število urejanj:", - "prefsnologintext2": "Za nastavljanje uporabniških nastavitev se morate $1.", + "prefsnologintext2": "Za spreminjanje svojih nastavitev se morate prijaviti.", "prefs-skin": "Koža", "skin-preview": "Predogled", "datedefault": "Kakor koli", @@ -1237,8 +1239,6 @@ "uploadwarning": "Opozorilo!", "uploadwarning-text": "Prosimo, spremenite opis datoteke spodaj in poskusite ponovno.", "savefile": "Shrani datoteko", - "uploadedimage": "je naložil(-a) datoteko »[[$1]]«", - "overwroteimage": "je naložil(-a) novo različico datoteke »[[$1]]«", "uploaddisabled": "Nalaganje je onemogočeno", "copyuploaddisabled": "Nalaganje preko URL je onemogočeno", "uploaddisabledtext": "Nalaganje datotek je onemogočeno.", @@ -1646,11 +1646,11 @@ "trackingcategories-desc": "Merila za vključitev v kategorijo", "noindex-category-desc": "Stran vsebuje čarobno besedo __NOINDEX__ (in je v imenskem prostoru, ki dovoljuje to oznako) in posledično je roboti ne indeksirajo.", "index-category-desc": "Stran vsebuje čarobno besedo __INDEX__ (in je v imenskem prostoru, ki dovoljuje to oznako) in posledično jo roboti indeksirajo, čeprav je drugače ne bi.", - "post-expand-template-inclusion-category-desc": "Po razširitvi vseh predlog je velikost strani več kot $wgMaxArticleSize, zato nekaterih predlog nismo razširili.", - "post-expand-template-argument-category-desc": "Po razširitvi argumentov predloge (nekaj v trojnih narekovajih, npr. {{{Foo}}}) je stran večja od $wgMaxArticleSize.", + "post-expand-template-inclusion-category-desc": "Velikost strani je po razširitvi vseh predlog več kot $wgMaxArticleSize, zato nekaterih predlog nismo razširili.", + "post-expand-template-argument-category-desc": "Stran je večja od $wgMaxArticleSize po razširitvi argumentov predloge (nekaj v trojnih narekovajih, npr. {{{Foo}}}).", "expensive-parserfunction-category-desc": "Stran vsebuje preveč dragih razčlenitvenih funkcij (npr. #ifexist). Glejte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", - "broken-file-category-desc": "Kategorijo smo dodali, če stan vsebuje pokvarjeno povezavo na datoteko (povezavo na vključeno datoteko, ki ne obstaja).", - "hidden-category-category-desc": "To je kategorija s __HIDDENCAT__, kar ji preprečuje, da se po privzetem prikazuje v okvirju s povezavami na kategorije strani.", + "broken-file-category-desc": "Stran vsebuje pokvarjeno povezavo na datoteko (povezavo na vključeno datoteko, ki ne obstaja).", + "hidden-category-category-desc": "Kategorija vsebuje __HIDDENCAT__ v vsebini strani, kar ji preprečuje, da se po privzetem prikazuje v okvirju s povezavami na kategorije strani.", "trackingcategories-nodesc": "Opis ni na voljo.", "trackingcategories-disabled": "Kategorija je onemogočena", "mailnologin": "Manjka naslov pošiljatelja", @@ -1687,7 +1687,7 @@ "mywatchlist": "Spisek nadzorov", "watchlistfor2": "Za $1 $2", "nowatchlist": "Vaš spisek nadzorov je prazen.", - "watchlistanontext": "Za pregled ali urejanje vsebine vašega spiska nadzorov se morate $1.", + "watchlistanontext": "Za pregled ali urejanje vsebine vašega spiska nadzorov se morate prijaviti.", "watchnologin": "Niste prijavljeni", "addwatch": "Dodaj na spisek nadzorov", "addedwatchtext": "Stran »[[:$1]]« smo dodali na vaš [[Special:Watchlist|spisek nadzorov]].\nTam bodo navedene prihodnje spremembe te strani in pripadajoče pogovorne strani.", @@ -1911,7 +1911,7 @@ "autoblockid": "Samodejna blokada št. $1", "block": "Blokiraj uporabnika", "unblock": "Odblokiraj uporabnika", - "blockip": "Blokiranje IP-naslova ali uporabniškega imena", + "blockip": "Blokiraj {{GENDER:$1|uporabnika|uporabnico}}", "blockip-legend": "Blokiraj uporabnika", "blockiptext": "Naslednji obrazec vam omogoča, da določenemu IP-naslovu ali uporabniškemu imenu preprečite urejanje.\nTo storimo le zaradi zaščite pred nepotrebnim uničevanjem in po [[{{MediaWiki:Policy-url}}|pravilih]].\nVnesite tudi razlog (''na primer'' seznam strani, ki jih je uporabnik po nepotrebnem kvaril).", "ipaddressorusername": "IP-naslov ali uporabniško ime", @@ -1940,7 +1940,7 @@ "ipb-unblock-addr": "Deblokiraj $1", "ipb-unblock": "Odblokirajte uporabniško ime ali IP-naslov", "ipb-blocklist": "Ogled obstoječih blokad", - "ipb-blocklist-contribs": "Prispevki za $1", + "ipb-blocklist-contribs": "Prispevki za {{GENDER:$1|$1}}", "unblockip": "Deblokirajte uporabnika", "unblockiptext": "Z naslednjim obrazcem obnovite možnost urejanja z blokiranega IP-naslova ali uporabniškega računa.", "ipusubmit": "Odstrani blokado", @@ -2997,6 +2997,9 @@ "logentry-rights-rights": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} uporabniške pravice uporabnika $3 z $4 na $5", "logentry-rights-rights-legacy": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} uporabniške pravice uporabnika $3", "logentry-rights-autopromote": "$1 je {{GENDER:$2|bil samodejno povišan|bila samodejno povišana|bil(-a) samodejno povišan(-a)}} z $4 na $5", + "logentry-upload-upload": "$1 je {{GENDER:$2|naložil|naložila|naložil(-a)}} $3", + "logentry-upload-overwrite": "$1 je {{GENDER:$2|naložil|naložila|naložil(-a)}} novo različico $3", + "logentry-upload-revert": "$1 je {{GENDER:$2|naložil|naložila|naložil(-a)}} $3", "rightsnone": "(nobeno)", "feedback-bugornote": "Če ste pripravljeni podrobno opisati tehnično težavo, vložite [$1 poročilo o hrošču].\nV nasprotnem primeru lahko uporabite preprost obrazec spodaj. Vašo pripombo bomo dodali na stran »[$3 $2]«, skupaj z vašim uporabniškim imenom in podatkom o brskalniku, ki ga uporabljate.", "feedback-subject": "Zadeva:", @@ -3099,5 +3102,7 @@ "action-pagelang": "spreminjanje jezika strani", "log-name-pagelang": "Dnevnik spreminjanja jezika", "log-description-pagelang": "Dnevnik sprememb jezika strani.", - "logentry-pagelang-pagelang": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} jezik strani $3 z jezika $4 na jezik $5." + "logentry-pagelang-pagelang": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} jezik strani $3 z jezika $4 na jezik $5.", + "default-skin-not-found-row-enabled": "* $1 / $2 (omogočeno)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''onemogočeno''')" } diff --git a/languages/i18n/sr-ec.json b/languages/i18n/sr-ec.json index 0ddcb6d313..549d25b69f 100644 --- a/languages/i18n/sr-ec.json +++ b/languages/i18n/sr-ec.json @@ -282,6 +282,9 @@ "hidetoc": "сакриј", "collapsible-collapse": "скупи", "collapsible-expand": "прошири", + "confirmable-confirm": "Да ли {{GENDER:$1|сте}} сигурни?", + "confirmable-yes": "Да", + "confirmable-no": "Не", "thisisdeleted": "Погледати или вратити $1?", "viewdeleted": "Погледати $1?", "restorelink": "{{PLURAL:$1|обрисану измену|$1 обрисане измене|$1 обрисаних измена}}", @@ -845,7 +848,6 @@ "searchprofile-advanced-tooltip": "Претражите прилагођене именске просторе", "search-result-size": "$1 ({{PLURAL:$2|1 реч|$2 речи|$2 речи}})", "search-result-category-size": "{{PLURAL:$1|1 члан|$1 члана|$1 чланова}}, ({{PLURAL:$2|1 поткатегорија|$2 поткатегорије|$2 поткатегорија}}, {{PLURAL:$3|1 датотека|$3 датотеке|$3 датотека}})", - "search-result-score": "Релевантност: $1%", "search-redirect": "(преусмерење $1)", "search-section": "(одељак $1)", "search-suggest": "Да ли сте мислили на: $1", @@ -1245,8 +1247,6 @@ "uploadwarning": "Упозорење при отпремању", "uploadwarning-text": "Измените опис датотеке и покушајте поново.", "savefile": "Сачувај датотеку", - "uploadedimage": "је послао „[[$1]]“", - "overwroteimage": "је послао нову верзију датотеке „[[$1]]“", "uploaddisabled": "Отпремање је онемогућено.", "copyuploaddisabled": "Слање путем URL адресе је онемогућено.", "uploaddisabledtext": "Отпремање датотека је онемогућено.", diff --git a/languages/i18n/sr-el.json b/languages/i18n/sr-el.json index b18a1c6d40..ce56980d4c 100644 --- a/languages/i18n/sr-el.json +++ b/languages/i18n/sr-el.json @@ -34,6 +34,7 @@ "tog-watchdefault": "Dodaj stranice i datoteke koje izmenim u spisak nadgledanja", "tog-watchmoves": "Dodaj stranice i datoteke koje premestim u spisak nadgledanja", "tog-watchdeletion": "Dodaj stranice i datoteke koje obrišem u spisak nadgledanja", + "tog-watchrollback": "Dodaj stranice na kojima sam vratio izmene u spisak nadgledanja", "tog-minordefault": "Označavaj sve izmene kao manje", "tog-previewontop": "Prikaži pregled pre okvira za uređivanje", "tog-previewonfirst": "Prikaži pregled na prvoj izmeni", @@ -273,6 +274,9 @@ "hidetoc": "sakrij", "collapsible-collapse": "skupi", "collapsible-expand": "proširi", + "confirmable-confirm": "Da li {{GENDER:$1|ste}} sigurni?", + "confirmable-yes": "Da", + "confirmable-no": "Ne", "thisisdeleted": "Pogledati ili vratiti $1?", "viewdeleted": "Pogledati $1?", "restorelink": "{{PLURAL:$1|obrisanu izmenu|$1 obrisane izmene|$1 obrisanih izmena}}", @@ -557,6 +561,7 @@ "preview": "Pregled", "showpreview": "Prikaži pretpregled", "showdiff": "Prikaži izmene", + "blankarticle": "Upozorenje: stranica koju pravite nema nikakav sadržaj.\nAko još jednom pritisnete „{{int:savearticle}}“ napravićete stranicu bez sadržaja.", "anoneditwarning": "'''Upozorenje:''' niste prijavljeni.\nVaša IP adresa će biti zabeležena u istoriji ove stranice.", "anonpreviewwarning": "''Niste prijavljeni. Vaša IP adresa će biti zabeležena u istoriji ove stranice.''", "missingsummary": "'''Napomena:''' niste uneli opis izmene.\nAko ponovo kliknete na „{{int:savearticle}}“, vaša izmena će biti sačuvana bez opisa.", @@ -830,7 +835,6 @@ "searchprofile-advanced-tooltip": "Pretražite prilagođene imenske prostore", "search-result-size": "$1 ({{PLURAL:$2|1 reč|$2 reči|$2 reči}})", "search-result-category-size": "{{PLURAL:$1|1 član|$1 člana|$1 članova}}, ({{PLURAL:$2|1 potkategorija|$2 potkategorije|$2 potkategorija}}, {{PLURAL:$3|1 datoteka|$3 datoteke|$3 datoteka}})", - "search-result-score": "Relevantnost: $1%", "search-redirect": "(preusmerenje $1)", "search-section": "(odeljak $1)", "search-suggest": "Da li ste mislili na: $1", @@ -1097,7 +1101,7 @@ "action-rollback": "brzo vraćanje izmena poslednjeg korisnika koji je menjao određenu stranicu", "action-import": "uvoženje stranica iz drugih vikija", "action-importupload": "uvoženje stranica iz otpremljene datoteke", - "action-patrol": "označavanje tuđih izmena pregledanim", + "action-patrol": "označavanje tuđih izmena patroliranim", "action-autopatrol": "označavanje sopstvenih izmena patroliranim", "action-unwatchedpages": "pregledanje spiska nenadgledanih stranica", "action-mergehistory": "spajanje istorije ove stranice", @@ -1230,8 +1234,6 @@ "uploadwarning": "Upozorenje pri otpremanju", "uploadwarning-text": "Izmenite opis datoteke i pokušajte ponovo.", "savefile": "Sačuvaj datoteku", - "uploadedimage": "je poslao „[[$1]]“", - "overwroteimage": "je poslao novu verziju datoteke „[[$1]]“", "uploaddisabled": "Otpremanje je onemogućeno.", "copyuploaddisabled": "Slanje putem URL adrese je onemogućeno.", "uploaddisabledtext": "Otpremanje datoteka je onemogućeno.", @@ -2851,6 +2853,7 @@ "autosumm-replace": "Zamena sadržaja stranice sa „$1“", "autoredircomment": "Preusmerenje na [[$1]]", "autosumm-new": "Nova stranica: $1", + "autosumm-newblank": "Napravljena prazna stranica", "size-bytes": "$1 B", "size-kilobytes": "$1 kB", "size-megabytes": "$1 MB", @@ -2939,7 +2942,7 @@ "duplicate-defaultsort": "'''Upozorenje:''' podrazumevani ključ svrstavanja „$2“ menja nekadašnji ključ „$1“.", "version": "Verzija", "version-extensions": "Instalirana proširenja", - "version-skins": "Teme", + "version-skins": "Instalirane teme", "version-specialpages": "Posebne stranice", "version-parserhooks": "Kuke raščlanjivača", "version-variables": "Promenljive", @@ -3172,5 +3175,6 @@ "expand_templates_remove_comments": "Ukloni komentare", "expand_templates_remove_nowiki": "Poništava efekat tagova u prikazu članaka", "expand_templates_generate_xml": "Prikaži XML stablo", - "expand_templates_preview": "Prikaz" + "expand_templates_preview": "Prikaz", + "right-pagelang": "menjanje jezika stranice" } diff --git a/languages/i18n/sv.json b/languages/i18n/sv.json index f4e8b824d5..3d976308d9 100644 --- a/languages/i18n/sv.json +++ b/languages/i18n/sv.json @@ -102,7 +102,7 @@ "tog-prefershttps": "Använd alltid en säker anslutning när jag är inloggad", "underline-always": "Alltid", "underline-never": "Aldrig", - "underline-default": "Webbläsarens standardinställning", + "underline-default": "Webbläsarens eller utseendets standardinställning", "editfont-style": "Typsnitt i redigeringsrutan:", "editfont-default": "Webbläsarens standard", "editfont-monospace": "Fast bredd", @@ -313,6 +313,9 @@ "hidetoc": "göm", "collapsible-collapse": "Dölj", "collapsible-expand": "Visa", + "confirmable-confirm": "Är {{GENDER:$1|du}} säker?", + "confirmable-yes": "Ja", + "confirmable-no": "Nej", "thisisdeleted": "Visa eller återställ $1?", "viewdeleted": "Visa $1?", "restorelink": "{{PLURAL:$1|en raderad version|$1 raderade versioner}}", @@ -397,7 +400,7 @@ "invalidtitle-knownnamespace": "Ogiltig titel med namnrymden \"$2\" och texten \"$3\"", "invalidtitle-unknownnamespace": "Ogiltig titel med okänt namnrymdsnummer $1 och texten \"$2\"", "exception-nologin": "Inte inloggad", - "exception-nologin-text": "Var god [[Special:Userlogin|logga in]] för att komma åt denna sida eller åtgärd.", + "exception-nologin-text": "Var god logga in för att komma åt denna sida eller åtgärd.", "exception-nologin-text-manual": "Var god $1 för att få tillgång till denna sida eller åtgärd.", "virus-badscanner": "Dålig konfigurering: okänd virusskanner: ''$1''", "virus-scanfailed": "skanning misslyckades (kod $1)", @@ -710,10 +713,10 @@ "parser-template-recursion-depth-warning": "Gräns för mallrekursionsdjup överskriden ($1)", "language-converter-depth-warning": "Gräns för språkkonverteringsdjup överskriden ($1)", "node-count-exceeded-category": "Sidor där antalet noder har överskridits", - "node-count-exceeded-category-desc": "En kategori för sidor där nod-räkningen överskrids.", - "node-count-exceeded-warning": "Sidan har överskridit antalet nodar", + "node-count-exceeded-category-desc": "Sidan överskrider det maximala antalet noder.", + "node-count-exceeded-warning": "Sidan har överskridit antalet noder", "expansion-depth-exceeded-category": "Sidor där expansionsdjupet överskrids", - "expansion-depth-exceeded-category-desc": "Detta är en kategori för sidor där expansionsdjupet överskrids.", + "expansion-depth-exceeded-category-desc": "Sidan har överstridit det maximala expansionsdjupet.", "expansion-depth-exceeded-warning": "Sidan överskrider expansionsdjupet", "parser-unstrip-loop-warning": "Tagavskalningsloop upptäcktes", "parser-unstrip-recursion-limit": "Tagavskalningsloop överskred rekursionsgränsen ($1)", @@ -882,7 +885,6 @@ "searchprofile-advanced-tooltip": "Sök i vissa namnrymder", "search-result-size": "$1 ({{PLURAL:$2|1 ord|$2 ord}})", "search-result-category-size": "{{PLURAL:$1|1 medlem|$1 medlemmar}} ({{PLURAL:$2|1 underkategori|$2 underkategorier}}, {{PLURAL:$3|1 fil|$3 filer}})", - "search-result-score": "Relevans: $1%", "search-redirect": "(omdirigering $1)", "search-section": "(avsnitt $1)", "search-file-match": "(överensstämmer filens innehåll)", @@ -909,7 +911,7 @@ "preferences": "Inställningar", "mypreferences": "Inställningar", "prefs-edits": "Antal redigeringar:", - "prefsnologintext2": "Var god $1 för att ändra användarinställningar.", + "prefsnologintext2": "Var god logga in för att ändra dina inställningar.", "prefs-skin": "Utseende", "skin-preview": "Förhandsvisning", "datedefault": "Ovidkommande", @@ -1286,8 +1288,6 @@ "uploadwarning": "Uppladdningsvarning", "uploadwarning-text": "Var god och ändra filbeskrivningen nedanför och försök igen.", "savefile": "Spara fil", - "uploadedimage": "laddade upp \"[[$1]]\"", - "overwroteimage": "laddade upp ny version av \"[[$1]]\"", "uploaddisabled": "Uppladdningsfunktionen är avstängd", "copyuploaddisabled": "Uppladdning med URL avstängt.", "uploaddisabledtext": "Uppladdning av filer är avstängd.", @@ -1695,11 +1695,11 @@ "trackingcategories-desc": "Inklusionskriterier för kategori", "noindex-category-desc": "Sidan innehåller det magiska ordet __NOINDEX__ (och är i en namnrymd där denna flagga tillåts), och indexeras därför inte av robotar.", "index-category-desc": "Denna sidan innehåller ett __INDEX__ (och är i en namnrymd där denna flagga tillåts), och indexeras därför av robotar även där detta normalt inte skulle ske.", - "post-expand-template-inclusion-category-desc": "Efter att alla mallar har expanderats är denna sidan större än $wgMaxArticleSize, därför har vissa mallar inte expanderats.", - "post-expand-template-argument-category-desc": "Efter att ett mallargument (något inom trippla parenteser, som {{{Foo}}}) expanderats är denna sidan större än $wgMaxArticleSize.", - "expensive-parserfunction-category-desc": "För många kostsamma parser-funktioner (som #ifexist) har inkluderats på en sida. Se [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit användarhandboken].", - "broken-file-category-desc": "Kategori som läggs till om sidan innehåller en bruten fillänk (en länk som bäddar in en fil som inte finns).", - "hidden-category-category-desc": "Detta är en kategori som innehåller __HIDDENCAT__ vilket, som standard, förhindrar den från att visas i kategorirutan.", + "post-expand-template-inclusion-category-desc": "Sidan är större än $wgMaxArticleSize efter att alla mallar har expanderats, därför har vissa mallar inte expanderats.", + "post-expand-template-argument-category-desc": "Sidan är större än $wgMaxArticleSize efter att ett mallargument (någonting inom tre parenteser, som {{{Foo}}}) expanderats.", + "expensive-parserfunction-category-desc": "Sidan använder för många kostsamma parser-funktioner (som #ifexist). Se [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit användarhandboken].", + "broken-file-category-desc": "Sidan innehåller en trasig fillänk (en länk som bäddar in en fil som inte finns).", + "hidden-category-category-desc": "Kategorin innehåller __HIDDENCAT__ i dess kategori, vilket som standard förhindrar den från att visas i kategorirutan.", "trackingcategories-nodesc": "Ingen beskrivning tillgänglig.", "trackingcategories-disabled": "Kategorin är inaktiverad", "mailnologin": "Ingen adress att skicka till", @@ -1736,7 +1736,7 @@ "mywatchlist": "Bevakningslista", "watchlistfor2": "För $1 $2", "nowatchlist": "Du har inga sidor i din bevakningslista.", - "watchlistanontext": "Du måste $1 för att se eller redigera din bevakningslista.", + "watchlistanontext": "Du måste logga in för att se eller redigera din bevakningslista.", "watchnologin": "Inte inloggad", "addwatch": "Lägg till i bevakningslistan", "addedwatchtext": "Sidan \"[[:$1]]\" har lagts till på din [[Special:Watchlist|bevakningslista]].\nFramtida ändringar av den här sidan och dess diskussionssida kommer att listas där.", @@ -1800,6 +1800,7 @@ "delete-edit-reasonlist": "Redigera anledningar för radering", "delete-toobig": "Denna sida har en lång redigeringshistorik med mer än $1 {{PLURAL:$1|sidversion|sidversioner}}. Borttagning av sådana sidor har begränsats för att förhindra oavsiktliga driftstörningar på {{SITENAME}}.", "delete-warning-toobig": "Denna sida har en lång redigeringshistorik med mer än $1 {{PLURAL:$1|sidversion|sidversioner}}. Att radera sidan kan skapa problem med hanteringen av databasen på {{SITENAME}}; var försiktig.", + "delete-cantedit": "Du kan inte ta radera denna sida eftersom du inte har behörighet att redigera den.", "deleting-backlinks-warning": "'''Varning:'''\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|Andra sidor]] länkar till eller inkluderar sidan som du är på väg att radera.", "rollback": "Rulla tillbaka ändringar", "rollback_short": "Tillbakarullning", @@ -1960,7 +1961,7 @@ "autoblockid": "Autoblockera #$1", "block": "Blockera användare", "unblock": "Upphäv blockering av användare", - "blockip": "Blockera användare", + "blockip": "Blockera {{GENDER:$1|användare}}", "blockip-legend": "Blockera användare", "blockiptext": "Använd formuläret nedan för att blockera möjligheten att redigera sidor från en specifik IP-adress eller ett användarnamn.\nDetta bör endast göras för att förhindra vandalisering, och i överensstämmelse med gällande [[{{MediaWiki:Policy-url}}|policy]].\nAnge orsak nedan (exempelvis genom att nämna sidor som blivit vandaliserade).", "ipaddressorusername": "IP-adress eller användarnamn:", @@ -1989,7 +1990,7 @@ "ipb-unblock-addr": "Ta bort blockering av $1", "ipb-unblock": "Ta bort blockering av en användare eller IP-adress", "ipb-blocklist": "Visa gällande blockeringar", - "ipb-blocklist-contribs": "Bidrag från $1", + "ipb-blocklist-contribs": "Bidrag från {{GENDER:$1|$1}}", "unblockip": "Ta bort blockering av användare/IP-adress", "unblockiptext": "Använd formuläret nedan för att ta bort blockeringen av en IP-adress.", "ipusubmit": "Upphäv denna blockering", @@ -3054,6 +3055,9 @@ "logentry-rights-rights": "$1 {{GENDER:$2|ändrade}} gruppmedlemskapet för $3 från $4 till $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ändrade}} gruppmedlemskapet för $3", "logentry-rights-autopromote": "$1 {{GENDER:$2|befordrades}} automatiskt från $4 till $5", + "logentry-upload-upload": "$1 {{GENDER:$2|laddade upp}} $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|laddade upp}} en ny version av $3", + "logentry-upload-revert": "$1 {{GENDER:$2|laddade upp}} $3", "rightsnone": "(inga)", "feedback-bugornote": "Om du är redo att beskriva ett tekniskt problem detaljerat, var god [$1 rapporterar en bugg].\nAnnars kan du använda det enkla formuläret nedan. Din kommentar kommer att läggas till på sidan \"[$3 $2]\", tillsammans med ditt användarnamn och vilken webbläsare du använder.", "feedback-subject": "Ämne:", @@ -3156,5 +3160,9 @@ "action-pagelang": "ändra sidspråket", "log-name-pagelang": "Språkändringslogg", "log-description-pagelang": "Detta är en logg över ändringar i sidspråken.", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ändrade}} sidspråket för $3 från $4 till $5." + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ändrade}} sidspråket för $3 från $4 till $5.", + "default-skin-not-found": "Ojsan! Standardutseendet för din wiki ($wgDefaultSkin), $1, är inte tillgängligt.\n\nDin installation verkar innehålla följande utseenden. Se [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manualen: Utseendeinställningar] för information om hur dessa aktiveras och hur standard väljs.\n\n$2\n\n; Om du precis installerat MediaWiki:\n: Du installerade troligen från git, eller direkt från källkoden via någon annan metod. Detta är att förvänta. Försök att installera några utseenden från [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org:s utseendekatalog], genom att:\n:* Ladda ner [https://www.mediawiki.org/wiki/Download tarball-installeraren], som kommer med flera utseenden och tillägg. Du kan klipp-och-klistra in skins/-katalogen från den.\n:* Klona ett av mediawiki/skins/*-centralförvaren in i skins/-katalogen i din MediaWiki-installation.\n: Att göra detta borde inte påverka ditt git-centralförvar om du är en MediaWiki-utvecklare.\n\n; Om du precis har uppgraderat MediaWiki:\n: MediaWiki 1.24 och nyare aktiverar ej längre automatiskt utseenden (se [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Automatisk identifiering av utseenden]). Du kan klistra in följande rader i LocalSettings.php för att aktivera alla för närvarande installerade utseenden:\n\n
    $3
    \n\n; Om du precis har ändrat i LocalSettings.php:\n: Dubbelkolla namnen för utseendena för att identifiera stavfel.", + "default-skin-not-found-no-skins": "Ojsan! Standardutseendet för din wiki ($wgDefaultSkin), $1, är inte tillgängligt.\n\nDu har inga installerade utseenden.\n\n; Om du precis installerat eller uppdaterat MediaWiki:\n: Du installerade troligen från git, eller direkt från källkoden via någon annan metod. Detta är att förvänta. MediaWiki 1.24 och nyare inkluderar inte några utseenden i det huvudsakliga centralförvaret. Försök att installera några utseenden från [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org:s utseendekatalog], genom att:\n:* Ladda ner [https://www.mediawiki.org/wiki/Download tarball-installeraren], som kommer med flera utseenden och tillägg. Du kan klipp-och-klistra in skins/-katalogen från den.\n* Klona ett av mediawiki/skins/*-centralförvaren in i skins/-katalogen i din MediaWiki-installation.\n: Att göra detta borde inte påverka ditt git-centralförvar om du är en MediaWiki-utvecklare. Se [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manualen: Utseendeinställningar] för information om hur utseenden aktiveras och hur standardutseendet väljs.", + "default-skin-not-found-row-enabled": "* $1 / $2 (aktiverad)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''inaktiverad''')" } diff --git a/languages/i18n/szl.json b/languages/i18n/szl.json index 61e3cf9206..8aa5a8bb81 100644 --- a/languages/i18n/szl.json +++ b/languages/i18n/szl.json @@ -1054,8 +1054,6 @@ "file-deleted-duplicate": "Identyczny plik jak tyn plik ([[:$1]]) zostoł wyćepany. Sprowdź historyja wyćepań tamtygo plika ńim wćepńesz go nazod.", "uploadwarning": "Uostřežyńe uo wćepywańu", "savefile": "Spamjyntej plik", - "uploadedimage": "wćepano \"[[$1]]\"", - "overwroteimage": "wćepano nowszo wersyjo \"[[$1]]\"", "uploaddisabled": "Wćepywanie sam plikůw je zawarte", "uploaddisabledtext": "Wćepywańe plikůw je zawarte.", "uploadscripted": "Tyn plik zawjyro kod HTML abo skrypt kery može zostać felerńe zinterpretowany bez přyglůndarka internetowo.", diff --git a/languages/i18n/ta.json b/languages/i18n/ta.json index 9698a3522b..9063d93670 100644 --- a/languages/i18n/ta.json +++ b/languages/i18n/ta.json @@ -1160,8 +1160,6 @@ "uploadwarning": "பதிவேற்றல் எச்சரிக்கை", "uploadwarning-text": "கீழுள்ள கோப்புச் சுருக்கத்தை மாற்றி விட்டு மீண்டும் சமர்ப்பியுங்கள்", "savefile": "கோப்பைச் சேமி", - "uploadedimage": "\"[[$1]]\" பதிவேற்றப்பட்டது", - "overwroteimage": "\"[[$1]]\" கோப்பின் புதிய பதிப்பை பதிவேற்று", "uploaddisabled": "பதிவேற்றம் செயலிழக்கச் செய்யப்பட்டுள்ளது", "copyuploaddisabled": "URL வழியாக தகவலேற்றல் முடக்கப்பட்டுள்ளது.", "uploaddisabledtext": "கோப்பு பதிவேற்றங்கள் செயலிழக்கச் செய்யப்பட்டுள்ளன.", diff --git a/languages/i18n/th.json b/languages/i18n/th.json index 031cbfaa79..c9f1b9567f 100644 --- a/languages/i18n/th.json +++ b/languages/i18n/th.json @@ -274,6 +274,9 @@ "hidetoc": "ซ่อน", "collapsible-collapse": "ยุบ", "collapsible-expand": "ขยาย", + "confirmable-confirm": "คุณแน่ใจหรือ", + "confirmable-yes": "ใช่", + "confirmable-no": "ไม่", "thisisdeleted": "ดูหรือกู้คืน $1 หรือไม่", "viewdeleted": "ดู $1 หรือไม่", "restorelink": "$1 การแก้ไขที่ถูกลบ", @@ -838,7 +841,6 @@ "searchprofile-advanced-tooltip": "ค้นหาในเนมสเปซที่เลือกเอง", "search-result-size": "$1 ($2 คำ)", "search-result-category-size": "$1 สมาชิก ($2 หมวดหมู่ย่อย, $3 ไฟล์)", - "search-result-score": "ความเกี่ยวข้อง : $1%", "search-redirect": "(เปลี่ยนทาง $1)", "search-section": "(ส่วน $1)", "search-file-match": "(จับคู่เนื้อหาไฟล์)", @@ -1037,6 +1039,7 @@ "right-browsearchive": "ค้นหาหน้าที่ถูกลบ", "right-undelete": "กู้คืนหน้า", "right-suppressrevision": "ดูรุ่นต่าง ๆ หรือ ซ่อน/เลิกซ่อนรุ่นที่กำหนดจากผู้ใช้ใด ๆ", + "right-viewsuppressed": "ดูรุนที่ถูกซ่อนจากผู้ใช้อื่น", "right-suppressionlog": "ดูปูมส่วนตัว", "right-block": "บล็อกมิให้ผู้ใช้อื่นแก้ไข", "right-blockemail": "บล็อกมิให้ผู้ใช้ส่งอีเมล", @@ -1239,8 +1242,6 @@ "uploadwarning": "คำเตือนการอัปโหลด", "uploadwarning-text": "กรุณาแก้ไขคำอธิบายไฟล์ด้านล่างนี้ แล้วลองใหม่อีกครั้ง", "savefile": "บันทึกไฟล์", - "uploadedimage": "อัปโหลด \"[[$1]]\"", - "overwroteimage": "อัปโหลดรุ่นใหม่ของ \"[[$1]]\"", "uploaddisabled": "ปิดใช้งานการอัปโหลด", "copyuploaddisabled": "ปิดใช้งานการอัปโหลดโดยยูอาร์แอล", "uploaddisabledtext": "ปิดใช้งานการอัปโหลดไฟล์", @@ -2646,6 +2647,7 @@ "autosumm-replace": "แทนที่ข้อความทั้งหมดด้วย '$1'", "autoredircomment": "เปลี่ยนทางไปที่ [[$1]]", "autosumm-new": "หน้าที่ถูกสร้างด้วย '$1'", + "autosumm-newblank": "สร้างหน้าว่าง", "size-bytes": "$1 ไบต์", "size-kilobytes": "$1 กิโลไบต์", "size-megabytes": "$1 เมกะไบต์", @@ -2836,6 +2838,9 @@ "logentry-rights-rights": "$1 {{GENDER:$2|เปลี่ยน}}กลุ่มสมาชิกของ $3 จาก $4 เป็น $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|เปลี่ยน}}กลุ่มสมาชิกของ $3", "logentry-rights-autopromote": "$1 ได้รับการ{{GENDER:$2|เลื่อนกลุ่ม}}จาก $4 เป็น $5 อัตโนมัติ", + "logentry-upload-upload": "$1 อัปโหลด $3", + "logentry-upload-overwrite": "$1 อัปโหลดรุ่นใหม่ของ $3", + "logentry-upload-revert": "$1 อัปโหลด $3", "rightsnone": "(ไม่มี)", "feedback-bugornote": "หากคุณได้อธิบายปัญหาทางเทคนิคในรายละเอียดแล้ว โปรด[$1 รายงานจุดบกพร่อง]\nมิฉะนั้น คุณสามารถแบบอย่างง่ายด้านล่าง ความเห็นของคุณจะถูกเพิ่มเข้าสู่ \"[$3 $2]\" ร่วมกับชื่อผู้ใช้ของคุณ", "feedback-subject": "เรื่อง:", @@ -2870,6 +2875,8 @@ "expand_templates_ok": "ตกลง", "expand_templates_remove_comments": "นำส่วนความเห็นออก", "expand_templates_preview": "ตัวอย่างผลแสดง", + "pagelanguage": "ตัวเลือกภาษาหน้า", + "pagelang-name": "หน้า", "pagelang-language": "ภาษา", "pagelang-use-default": "ใช้ภาษาโดยปริยาย", "pagelang-select-lang": "เลือกภาษา", @@ -2877,5 +2884,7 @@ "action-pagelang": "เปลี่ยนภาษาหน้า", "log-name-pagelang": "ปูมการเปลี่ยนภาษา", "log-description-pagelang": "นี่คือปูมการเปลี่ยนภาษาหน้า", - "logentry-pagelang-pagelang": "$1 เปลี่ยนภาษาของ $3 จาก $4 เป็น $5" + "logentry-pagelang-pagelang": "$1 เปลี่ยนภาษาของ $3 จาก $4 เป็น $5", + "default-skin-not-found-row-enabled": "* $1 / $2 (เปิดใช้งาน)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''ปิดใช้งาน''')" } diff --git a/languages/i18n/tr.json b/languages/i18n/tr.json index 9ba8e9fbf3..2f0bb2cacf 100644 --- a/languages/i18n/tr.json +++ b/languages/i18n/tr.json @@ -296,6 +296,7 @@ "versionrequiredtext": "Bu sayfayı kullanmak için MediaWiki'nin $1 sürümü gerekmektedir. [[Special:Version|Sürüm sayfasına]] bakınız.", "ok": "Tamam", "pagetitle-view-mainpage": "{{SITENAME}}", + "backlinksubtitle": "←$1", "retrievedfrom": "\"$1\" adresinden alındı.", "youhavenewmessages": "$1 {{PLURAL:$3|var}} ($2).", "youhavenewmessagesfromusers": "{{PLURAL:$3|Başka bir kullanıcıdan|$3 kullanıcıdan}} $1 var ($2).", @@ -314,6 +315,9 @@ "hidetoc": "gizle", "collapsible-collapse": "Daralt", "collapsible-expand": "Genişlet", + "confirmable-confirm": "Emin misiniz?", + "confirmable-yes": "Evet", + "confirmable-no": "Hayır", "thisisdeleted": "$1 görmek veya geri getirmek istermisiniz?", "viewdeleted": "$1 gör?", "restorelink": "{{PLURAL:$1|bir silinmiş değişikliği|$1 silinmiş değişikliği}}", @@ -601,6 +605,7 @@ "preview": "Önizleme", "showpreview": "Önizlemeyi göster", "showdiff": "Değişiklikleri göster", + "blankarticle": "Uyarı: Oluşturduğunuz sayfa boş.\nEğer \"{{int:savearticle}}\" düğmesine tekrar tıklarsanız, sayfa içerik olmadan oluşturulacaktır.", "anoneditwarning": "'''Uyarı:''' Oturum açmadınız.\nIP adresiniz sayfanın değişiklik geçmişine kaydedilecektir.", "anonpreviewwarning": "''Giriş yapmadınız. Kaydederseniz, sayfanın değişiklik geçmişine IP adresiniz yazılır.''", "missingsummary": "'''Uyarı:''' Herhangi bir özet yazmadın.\nKaydet tuşuna tekrar basarsan sayfa özetsiz kaydedilecek.", @@ -688,6 +693,7 @@ "edit-conflict": "Değişiklik çakışması.", "edit-no-change": "Değişikliğiniz yoksayıldı, çünkü metinde bir değişiklik yapılmadı.", "postedit-confirmation-created": "Sayfa oluşturuldu.", + "postedit-confirmation-restored": "Sayfa geri yüklendi.", "postedit-confirmation-saved": "Değişikliğiniz kaydedildi.", "edit-already-exists": "Yeni sayfa oluşturulamıyor.\nSayfa zaten mevcut.", "defaultmessagetext": "Varsayılan mesaj metni", @@ -711,8 +717,10 @@ "parser-template-recursion-depth-warning": "Şablon özyineleme yoğunluğu sınırı aşıldı ($1)", "language-converter-depth-warning": "Dil çevirici derinlik sınırı aşıldı ($1)", "node-count-exceeded-category": "Düğüm sayısı aşılan sayfalar", + "node-count-exceeded-category-desc": "Sayfa azami düğüm sayısını aşıyor.", "node-count-exceeded-warning": "Sayfa düğüm sayımı aşıldı", "expansion-depth-exceeded-category": "Genişleme derinliği aşılan sayfalar", + "expansion-depth-exceeded-category-desc": "Sayfa azami genişleme derinliğini aşıyor.", "expansion-depth-exceeded-warning": "Sayfa genişletme derinliği aşıldı", "parser-unstrip-loop-warning": "Yineleme döngüsü algılandı", "parser-unstrip-recursion-limit": "($1) yineleme sınırı aşıldı", @@ -774,6 +782,8 @@ "revdelete-no-file": "Belirtilen dosya mevcut değil.", "revdelete-show-file-confirm": "\"$1\" dosyasının $2 $3 tarihli silinmiş bir revizyonunu görmek istediğinize emin misiniz?", "revdelete-show-file-submit": "Evet", + "revdelete-selected-text": "[[:$2]] için {{PLURAL:$1|seçili revizyon|seçili revizyonlar}}:", + "revdelete-selected-file": "[[:$2]] için {{PLURAL:$1|seçili dosya revizyonu|seçili dosya revizyonları}}:", "logdelete-selected": "{{PLURAL:$1|Seçili kayıt olayı|Seçili kayıt olayları}}:", "revdelete-text-text": "Silinen sürümler sayfa geçmişinde yer almaya devam edecek ancak okuyucular tarafından içeriklerine erişilemeyecektir.", "revdelete-text-file": "Silinen dosya sürümleri dosya geçmişinde yer almaya devam edecek ancak okuyucular tarafından içerik bölümlerine erişilemeyecektir.", @@ -874,7 +884,6 @@ "searchprofile-advanced-tooltip": "Özel ad alanlarında ara", "search-result-size": "$1 ({{PLURAL:$2|1 kelime|$2 kelime}})", "search-result-category-size": "{{PLURAL:$1|1 üye|$1 üye}} ({{PLURAL:$2|1 altkategori|$2 altkategori}}, {{PLURAL:$3|1 dosya|$3 dosya}})", - "search-result-score": "Uygunluk: $1%", "search-redirect": "($1 sayfasından yönlendirme)", "search-section": "($1 bölümü)", "search-file-match": "(dosya içeriğiyle eşleşiyor)", @@ -1276,8 +1285,6 @@ "uploadwarning": "Yükleme uyarısı", "uploadwarning-text": "Lütfen aşağıdaki dosya açıklamasını değiştirin ve tekrar deneyin.", "savefile": "Dosyayı kaydet", - "uploadedimage": "Yüklenen: \"[[$1]]\"", - "overwroteimage": "\"[[$1]]\" resminin yeni sürümü yüklenmiştir", "uploaddisabled": "Geçici olarak şu anda herhangi bir dosya yüklenmez. Biraz sonra bir daha deneyiniz.", "copyuploaddisabled": "URL ile yükleme devre dışı.", "uploaddisabledtext": "Dosya yüklemeleri devredışı bırakılmıştır.", @@ -2834,6 +2841,7 @@ "autosumm-replace": "Sayfa içeriği '$1' ile değiştiriliyor", "autoredircomment": "[[$1]] sayfasına yönlendirildi", "autosumm-new": "Yeni sayfa: \"$1\"", + "autosumm-newblank": "Boş bir sayfa oluşturdu", "lag-warn-normal": "$1 {{PLURAL:$1|saniyeden|saniyeden}} yeni değişiklikler bu listede görünmeyebilir.", "lag-warn-high": "Veritabanı sunucusundaki aşırı gecikmeden dolayı, $1 {{PLURAL:$1|saniyeden|saniyeden}} yeni değişiklikler bu listede görünmeyebilir.", "watchlistedit-normal-title": "İzleme listesini düzenle", @@ -2849,12 +2857,14 @@ "watchlistedit-raw-done": "İzleme listeniz güncellendi.", "watchlistedit-raw-added": "{{PLURAL:$1|1 başlık|$1 başlık}} eklendi:", "watchlistedit-raw-removed": "{{PLURAL:$1|1 başlık|$1 başlık}} silindi:", + "watchlistedit-clear-title": "İzleme listesi temizlendi", "watchlistedit-clear-legend": "İzleme listesini temizle", "watchlistedit-clear-explain": "İzleme listenizdeki tüm başlıklar silinecek", "watchlistedit-clear-titles": "Başlıklar:", "watchlistedit-clear-submit": "İzleme listesini temizle (Geri alınamaz!)", "watchlistedit-clear-done": "İzleme listeniz temizlendi.", "watchlistedit-clear-removed": "{{PLURAL:$1|1 başlık|$1 başlık}} silindi:", + "watchlistedit-too-many": "Görüntülemek için çok fazla sayfa var.", "watchlisttools-clear": "İzleme listesini temizle", "watchlisttools-view": "İlgili değişiklikleri göster", "watchlisttools-edit": "İzleme listesini gör ve düzenle", @@ -2868,7 +2878,7 @@ "duplicate-defaultsort": "'''Uyarı:''' Varsayılan \"$2\" sınıflandırma anahtarı, önceki \"$1\" sınıflandırma anahtarını geçersiz kılıyor.", "version": "Sürüm", "version-extensions": "Yüklü ekler", - "version-skins": "Görünümler", + "version-skins": "Yüklü görünümler", "version-specialpages": "Özel sayfalar", "version-parserhooks": "Derleyici çengelleri", "version-variables": "Değişkenler", @@ -2881,9 +2891,11 @@ "version-hook-name": "Çengel adı", "version-hook-subscribedby": "Abone olan", "version-version": "($1 sürümü)", + "version-no-ext-name": "[isim yok]", "version-license": "MediaWiki Lisansı", "version-ext-license": "Lisans", "version-ext-colheader-name": "Uzantı", + "version-skin-colheader-name": "Görünüm", "version-ext-colheader-version": "Sürüm", "version-ext-colheader-license": "Lisans", "version-ext-colheader-description": "Açıklama", @@ -2985,6 +2997,7 @@ "htmlform-no": "Hayır", "htmlform-yes": "Evet", "htmlform-chosen-placeholder": "Bir seçenek seçin", + "htmlform-cloner-create": "Daha fazla ekle", "htmlform-cloner-delete": "Sil", "htmlform-cloner-required": "En az bir değer gereklidir.", "sqlite-has-fts": "$1 tam-metin arama desteği ile", @@ -3022,6 +3035,7 @@ "logentry-rights-rights": "$1, $3 için grup üyeliğini $4 iken $5 olarak {{GENDER:$2|değiştirdi}}", "logentry-rights-rights-legacy": "$1, $3 için grup üyeliğini {{GENDER:$2|değiştirdi}}", "logentry-rights-autopromote": "$1, $4 iken $5 olarak otomatik {{GENDER:$2|terfi edildi}}", + "logentry-upload-upload": "$1 {{GENDER:$2|yükledi}} $3", "rightsnone": "(hiçbiri)", "feedback-bugornote": "Eğer teknik bir problemi detaylarıyla açıklamaya hazırsanız lütfen [$1 bir hata raporlayın]. Diğer taraftan, aşağıdaki kolay formu kullanabilirsiniz. Yorumunuz, kullanıcı adınızla beraber \"[$3 $2]\" sayfasına eklenecektir.", "feedback-subject": "Konu:", @@ -3115,6 +3129,8 @@ "expand_templates_generate_xml": "XML derleyici ağacını göster", "expand_templates_generate_rawhtml": "Ham HTML göster", "expand_templates_preview": "Önizleme", + "pagelanguage": "Sayfa dili seçicisi", + "pagelang-name": "Sayfa", "pagelang-language": "Dil", "pagelang-use-default": "Varsayılan dili kullan", "pagelang-select-lang": "Dil seçin", diff --git a/languages/i18n/uk.json b/languages/i18n/uk.json index b160dacf3d..26a9de1e0a 100644 --- a/languages/i18n/uk.json +++ b/languages/i18n/uk.json @@ -48,7 +48,8 @@ "Тест", "아라", "Calak", - "Mykola Swarnyk" + "Mykola Swarnyk", + "Milicevic01" ] }, "tog-underline": "Підкреслювання посилань:", @@ -306,6 +307,9 @@ "hidetoc": "сховати", "collapsible-collapse": "згорнути", "collapsible-expand": "розгорнути", + "confirmable-confirm": "{{GENDER:$1|Ви}} впевнені?", + "confirmable-yes": "Так", + "confirmable-no": "Ні", "thisisdeleted": "Переглянути чи відновити $1?", "viewdeleted": "Переглянути $1?", "restorelink": "$1 {{PLURAL:$1|вилучене редагування|вилучені редагування|вилучених редагувань}}", @@ -464,49 +468,49 @@ "nocookiesforlogin": "{{int:nocookieslogin}}", "noname": "Ви зазначили неправильне ім'я користувача.", "loginsuccesstitle": "Успішний вхід до системи", - "loginsuccess": "'''Тепер ви працюєте {{grammar:locative|{{SITENAME}}}} під іменем $1.'''", - "nosuchuser": "Користувач з іменем «$1» не існує.\nІмена користувачів регістрозалежні.\nПеревірте правильність написання або скористайтеся формою нижче, щоб [[Special:UserLogin/signup|зареєструвати нового користувача]].", - "nosuchusershort": "Користувач з іменем $1 не існує.\nПеревірте правильність написання імені.", + "loginsuccess": "'''Тепер ви працюєте в {{grammar:locative|{{SITENAME}}}} під іменем $1.'''", + "nosuchuser": "Користувача з іменем «$1» не існує.\nВ іменах користувачів розрізняються великі і малі символи.\nПеревірте правильність написання або скористайтеся формою нижче, щоб [[Special:UserLogin/signup|зареєструвати нового користувача]].", + "nosuchusershort": "Користувача з іменем $1 не існує.\nПеревірте правильність написання імені.", "nouserspecified": "Ви повинні зазначити ім'я користувача.", "login-userblocked": "Цей користувач заблокований. Вхід в систему не дозволений.", "wrongpassword": "Ви ввели хибний пароль. Спробуйте ще раз.", "wrongpasswordempty": "Ви не ввели пароль. Будь ласка, спробуйте ще раз.", "passwordtooshort": "Ваш пароль закороткий, він має містити принаймні $1 {{PLURAL:$1|символ|символи|символів}}.", - "password-name-match": "Уведений пароль має відрізнятися від імені користувача.", + "password-name-match": "Ваш пароль має відрізнятися від імені користувача.", "password-login-forbidden": "Використання цього імені користувача і пароля заборонено.", "mailmypassword": "Перевстановити пароль", - "passwordremindertitle": "Пам'ятка пароля користувача {{grammar:genitive|{{SITENAME}}}}", - "passwordremindertext": "Хтось (можливо, ви, з IP-адреси $1) зробив запит\nна надсилання вам нового пароля користувача {{grammar:genitive|{{SITENAME}}}} ($4). Для користувача\n«$2» створено новий пароль: $3. Якщо це зробили ви,\nто вам слід увійти до системи, ввівши новий пароль.\nВаш тимчасовий пароль втратить силу через {{PLURAL:$5|$5 день|$5 дні|$5 днів}}.\n\nЯкщо ви не надсилали запиту на зміну пароля або якщо ви вже згадали свій пароль\nі не хочете його змінювати, ви можете ігнорувати це повідомлення і\nпродовжувати використовувати свій старий пароль.", - "noemail": "Для користувача \"$1\" не вказано адресу електронної пошти.", + "passwordremindertitle": "Новий тимчасовий пароль для {{grammar:genitive|{{SITENAME}}}}", + "passwordremindertext": "Хтось (можливо ви, з IP-адреси $1) зробив запит на новий пароль для {{grammar:genitive|{{SITENAME}}}} ($4). Для користувача «$2» створено новий пароль: $3. Якщо це зробили ви, то вам слід увійти до системи, ввівши новий пароль.\nВаш тимчасовий пароль втратить силу через {{PLURAL:$5|$5 день|$5 дні|$5 днів}}.\n\nЯкщо ви не надсилали запиту на зміну пароля або якщо ви вже згадали свій пароль і не хочете його змінювати, ви можете ігнорувати це повідомлення і продовжувати використовувати свій старий пароль.", + "noemail": "Для користувача \"$1\" не вказано адреси електронної пошти.", "noemailcreate": "Вам треба вказати правильну адресу електронної пошти", "passwordsent": "Новий пароль був надісланий на адресу електронної пошти, зазначену для \"$1\".\nБудь ласка, ввійдіть до системи після отримання пароля.", - "blocked-mailpassword": "Редагування з вашої IP-адреси заборонено, заблокована також функція відновлення пароля.", - "eauthentsent": "На вказану адресу електронної пошти відправлено лист.\nЩоб отримувати листи надалі, дотримуйтесь викладених там інструкцій для підтвердження того, що ця адреса належить вам.", - "throttled-mailpassword": "Інструкція по відновленню паролю вже була вислана електронною поштою протягом {{PLURAL:$1|1=останньої години|останніх $1 годин}}.\nДля попередження зловживань дозволено надсилати тільки одну інструкцію за {{PLURAL:$1|годину|$1 години|$1 годин}}.", - "mailerror": "Помилка при відправці пошти: $1", + "blocked-mailpassword": "Редагування з вашої IP-адреси заборонено, заблокована також функція відновлення пароля, щоб запобігти зловживанням.", + "eauthentsent": "На вказану адресу електронної пошти відправлено лист підтвердження.\nЩоб отримувати надалі будь-які повідомлення, необхідно підтвердити, що обліковий рахунок належить справді вам, за процедурою, описаною в листі.", + "throttled-mailpassword": "Листа для оновлення пароля вже було надіслано електронною поштою протягом {{PLURAL:$1|1=останньої години|останніх $1 годин}}.\nДля попередження зловживань дозволено надсилати тільки одного листа оновлення пароля за {{PLURAL:$1|годину|$1 години|$1 годин}}.", + "mailerror": "Помилка надсилання пошти: $1", "acct_creation_throttle_hit": "Відвідувачі з вашої IP-адреси вже створили $1 {{PLURAL:$1|обліковий запис|облікових записи|облікових записів}} за останню добу, що є максимумом для цього відрізка часу.\nТаким чином, користувачі з цієї IP-адреси не можуть на цей момент створювати нових облікових записів.", "emailauthenticated": "Вашу адресу електронної пошти було підтверджено на $2 о $3.", - "emailnotauthenticated": "Адресу вашої електронної пошти ще не підтверджено. Жодна лист не буде надіслано для будь-якої з наступних функцій.", - "noemailprefs": "Адресу електронної пошти не вказано, функції вікі роботи з ел. поштою відключені.", - "emailconfirmlink": "Підтвердити адресу вашої електронної пошти", - "invalidemailaddress": "Уведена адреса не може бути прийнята, бо вона не відповідає формату адрес електронної пошти.\nБудь ласка, введіть коректну адресу або залиште поле порожнім.", - "cannotchangeemail": "У цій вікі не можна міняти свою адресу ел. пошти.", - "emaildisabled": "Цей сайт не може надіслати електронні листи.", + "emailnotauthenticated": "Адресу вашої електронної пошти ще не підтверджено. Надсилання листів неможливе у жодній з наступних опцій.", + "noemailprefs": "Вкажіть адресу електронної пошти, щоб уможливити наступні поштові функції вікі.", + "emailconfirmlink": "Підтвердіть адресу вашої електронної пошти", + "invalidemailaddress": "Вказана адреса не може бути прийнята через невідповідний формат.\nБудь ласка, введіть коректну адресу або залиште поле порожнім.", + "cannotchangeemail": "У цій вікі не можна міняти адресу електронної пошти, закріплену за обліковим записом.", + "emaildisabled": "З цього сайту не можна надсилати електронні листи.", "accountcreated": "Обліковий запис створено.", "accountcreatedtext": "Обліковий запис користувача для [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|обговорення]]) був створений.", "createaccount-title": "Створення облікового запису для {{SITENAME}}", - "createaccount-text": "Хтось створив обліковий запис «$2» на сервері проекту {{SITENAME}} ($4) з паролем «$3», зазначивши вашу адресу електронної пошти. Вам слід зайти і змінити пароль.\n\nПроігноруйте дане повідомлення, якщо обліковий запис було створено помилково.", + "createaccount-text": "Хтось створив обліковий запис «$2» на сервері проекту {{SITENAME}} ($4) з паролем «$3», зазначивши вашу адресу електронної пошти. Вам слід зайти і змінити пароль.\n\nІгноруйте дане повідомлення, якщо обліковий запис було створено помилково.", "login-throttled": "Ви зробили надто багато спроб ввійти до системи.\nБудь ласка, зачекайте $1 перед повторною спробою.", "login-abort-generic": "Не вдалося ввійти до системи", "loginlanguagelabel": "Мова: $1", - "suspicious-userlogout": "Ваш запит на завершення сеанса відхилений, оскільки він схожий на запит, відправлений зіпсованим веб-оглядачем або кешуючим проксі-сервером.", - "createacct-another-realname-tip": "Справжнє ім'я є необов'язковим.\nЯкщо ви вирішите надати його, то воно буде використовуватися для присвоєння користувачу авторства до його роботи.", + "suspicious-userlogout": "Ваш запит на завершення сеансу відхилений, оскільки він схожий на запит, відправлений зіпсованим веб-оглядачем або кешуючим проксі-сервером.", + "createacct-another-realname-tip": "Справжнє ім'я є необов'язковим.\nЯкщо ви вирішите надати його, воно буде використовуватись для позначення редагувань та інших дій користувача.", "pt-login": "Увійти", "pt-login-button": "Вхід", "pt-createaccount": "Створити обліковий запис", "pt-userlogout": "Вийти", "php-mail-error-unknown": "Невідома помилка в PHP-функції mail()", - "user-mail-no-addy": "Спроба надсилання електронної пошти без зазначеної адреси електронної пошти.", + "user-mail-no-addy": "Спроба надсилання електронної пошти без зазначення адреси.", "user-mail-no-body": "Спроба надіслати електронного листа з порожнім або надто коротким вмістом.", "changepassword": "Змінити пароль", "resetpass_announce": "Для завершення входу ви повинні встановити новий пароль.", @@ -515,10 +519,10 @@ "oldpassword": "Старий пароль:", "newpassword": "Новий пароль:", "retypenew": "Ще раз введіть новий пароль:", - "resetpass_submit": "Установити пароль і ввійти", + "resetpass_submit": "Встановити пароль і ввійти", "changepassword-success": "Ваш пароль успішно змінено!", "changepassword-throttled": "Ви нещодавно зробили надто багато спроб ввійти до системи.\nБудь ласка, зачекайте $1 перед повторною спробою.", - "resetpass_forbidden": "Пароль не можна змінювати", + "resetpass_forbidden": "Пароль не можна змінити", "resetpass-no-info": "Щоб звертатися безпосередньо до цієї сторінки, вам слід увійти до системи.", "resetpass-submit-loggedin": "Змінити пароль", "resetpass-submit-cancel": "Скасувати", @@ -531,22 +535,22 @@ "resetpass-expired-soft": "Термін дії вашого пароля закінчився, і тепер він повинен бути змінений. Будь ласка, виберіть новий пароль або натисніть \"{{int:resetpass-submit-cancel}}\", щоб змінити його пізніше.", "resetpass-validity-soft": "Ваш пароль є некоректним: $1\n\nБудь ласка, виберіть новий пароль або натисніть «{{int:resetpass-submit-cancel}}», щоб скинути його пізніше.", "passwordreset": "Скинути пароль", - "passwordreset-text-one": "Заповніть цю форму для відновлення пароля.", - "passwordreset-text-many": "{{PLURAL:$1|Заповніть одне з полів для отримання тимчасового паролю через електронну пошту.}}", + "passwordreset-text-one": "Заповніть цю форму, щоб отримати тимчасовий пароль електронною поштою.", + "passwordreset-text-many": "{{PLURAL:$1|Заповніть одне з полів для отримання тимчасового пароля електронною поштою.}}", "passwordreset-legend": "Перевстановити пароль", "passwordreset-disabled": "У цій вікі вимкнена можливість скидання пароля.", - "passwordreset-emaildisabled": "Функції електронної пошти вимкнуто в цій вікі.", + "passwordreset-emaildisabled": "В цій вікі вимкнуто Функції електронної пошти.", "passwordreset-username": "Ім'я користувача:", "passwordreset-domain": "Домен:", "passwordreset-capture": "Продивитись результуючий електронний лист?", - "passwordreset-capture-help": "Якщо Ви встановите відмітку, Вам буде показаний електронний лист (із тимчасовим паролем), який буде відправлений користувачеві.", + "passwordreset-capture-help": "Якщо ви зробите помітку у віконці, вам буде показаний електронний лист (із тимчасовим паролем), який також буде надісланий користувачеві.", "passwordreset-email": "Адреса електронної пошти:", "passwordreset-emailtitle": "Деталі облікового запису на {{SITENAME}}", - "passwordreset-emailtext-ip": "Хтось (імовірно Ви, з IP-адреси $1) попросив нагадати деталі Вашого облікового запису для {{SITENAME}} ($4). З Вашою електронною скринькою пов'язан{{PLURAL:$3|1=ий такий запис|і такі записи}}:\n\n$2\n\n{{PLURAL:$3|1=Цей тимчасовий пароль стане недійсним|Ці тимчасові паролі стануть недійсними}} через $5 {{PLURAL:$5|день|дні|днів}}.\nВи маєте ввійти в систему і вибрати новий пароль. Якщо ж цей запит зробив хтось інший, або Ви пам'ятаєте свій старий пароль і не бажаєте його змінювати, можете просто проігнорувати це повідомлення та продовжувати використовувати старий пароль.", - "passwordreset-emailtext-user": "Користувач $1 з {{SITENAME}} попросив нагадати деталі Вашого облікового запису для {{SITENAME}} ($4). З Вашою електронною скринькою пов'язан{{PLURAL:$3|1=ий такий запис|і такі записи}}:\n\n$2\n\n{{PLURAL:$3|1=Цей тимчасовий пароль|Ці тимчасові паролі}} стануть нечинні через {{PLURAL:$5|день|$5 дні|$5 днів}}.\nВи маєте ввійти в систему і вибрати новий пароль. Якщо ж цей запит зробив хтось інший, або Ви пам'ятаєте свій старий пароль і не бажаєте його змінювати, можете просто проігнорувати це повідомлення та продовжувати використовувати старий пароль.", + "passwordreset-emailtext-ip": "Хтось (імовірно ви, з IP-адреси $1) попросив нагадати деталі вашого облікового запису для {{SITENAME}} ($4). З вашою електронною скринькою пов'язан{{PLURAL:$3|1=ий такий запис|і такі записи}}:\n\n$2\n\n{{PLURAL:$3|1=Цей тимчасовий пароль стане недійсним|Ці тимчасові паролі стануть недійсними}} через $5 {{PLURAL:$5|день|дні|днів}}.\nВи маєте ввійти в систему і вибрати новий пароль. Якщо ж цей запит зробив хтось інший або ви згадали свій старий пароль і не бажаєте його змінювати, можете ігнорувати це повідомлення та продовжувати використовувати старий пароль.", + "passwordreset-emailtext-user": "Користувач $1 з {{SITENAME}} попросив нагадати деталі вашого облікового запису для {{SITENAME}} ($4). З вашою електронною скринькою пов'язан{{PLURAL:$3|1=ий такий запис|і такі записи}}:\n\n$2\n\n{{PLURAL:$3|1=Цей тимчасовий пароль|Ці тимчасові паролі}} стануть нечинні через {{PLURAL:$5|день|$5 дні|$5 днів}}.\nВи маєте ввійти в систему і вибрати новий пароль. Якщо ж цей запит зробив хтось інший, або ви згадали свій старий пароль і не бажаєте його змінювати, можете просто ігнорувати це повідомлення та продовжувати використовувати старий пароль.", "passwordreset-emailelement": "Ім'я користувача: $1\nТимчасовий пароль: $2", - "passwordreset-emailsent": "Електронний лист для відновлення пароля відправлений.", - "passwordreset-emailsent-capture": "Електронний лист скидання паролю було надіслано, як показано нижче.", + "passwordreset-emailsent": "Електронний лист для відновлення пароля надісланий.", + "passwordreset-emailsent-capture": "Електронний лист скидання пароля було надіслано, як показано нижче.", "passwordreset-emailerror-capture": "Електронний лист для відновлення пароля мав бути надісланий, як показано нижче, але його надсилання {{GENDER:$2|користувачеві|користувачці}} $1 не вдалося.", "changeemail": "Змінити адресу електронної пошти", "changeemail-header": "Зміна адреси електронної пошти", @@ -560,12 +564,12 @@ "changeemail-cancel": "Скасувати", "changeemail-throttled": "Ви зробили надто багато спроб ввійти до системи.\nБудь ласка, зачекайте $1 перед повторною спробою.", "resettokens": "Скидання жетонів", - "resettokens-text": "Ви можете скинути жетони, що забезпечують доступ до певних особистих даних, пов'язаних тут із Вашим обліковим записом.\nВам слід це зробити, якщо Ви випадково поділились жетонами з кимось, або якщо Ваш обліковий запис було зламано.", + "resettokens-text": "Ви можете скинути жетони, що забезпечують доступ до певних особистих даних, пов'язаних тут із вашим обліковим записом.\nВам слід це зробити, якщо ви випадково поділились жетонами з кимось, або якщо ваш обліковий запис було зламано.", "resettokens-no-tokens": "Немає жетонів до скидання.", "resettokens-legend": "Скинути жетони", "resettokens-tokens": "Жетони:", "resettokens-token-label": "$1 (поточне значення: $2)", - "resettokens-watchlist-token": "Маркер стрічки новин (Atom/RSS) з [[Special:Watchlist|змін на сторінку у вашому списку спостереження]]", + "resettokens-watchlist-token": "Маркер стрічки новин (Atom/RSS) щодо [[Special:Watchlist|зміни на сторінці з вашого списку спостереження]]", "resettokens-done": "Жетони скинуто.", "resettokens-resetbutton": "Скинути обрані жетони", "bold_sample": "Жирний текст", @@ -574,11 +578,11 @@ "italic_tip": "Курсив", "link_sample": "Назва посилання", "link_tip": "Внутрішнє посилання", - "extlink_sample": "http://www.example.com назва посилання", + "extlink_sample": "назва посилання http://www.example.com", "extlink_tip": "Зовнішнє посилання (не забудьте про префікс http://)", "headline_sample": "Текст заголовка", "headline_tip": "Заголовок 2-го рівня", - "nowiki_sample": "Вставляйте сюди невідформатований текст.", + "nowiki_sample": "Вставити сюди неформатований текст.", "nowiki_tip": "Ігнорувати вікі-форматування", "image_sample": "Example.jpg", "image_tip": "Файл", @@ -594,8 +598,8 @@ "preview": "Попередній перегляд", "showpreview": "Попередній перегляд", "showdiff": "Показати зміни", - "blankarticle": "Попередження: Ви створюєте пусту сторінку.\nЯкщо Ви знову натиснете «{{int:savearticle}}», сторінку буде створено без вмісту.", - "anoneditwarning": "'''Увага''': Ви не увійшли до системи. Ваша IP-адреса буде записана до історії змін цієї сторінки.", + "blankarticle": "'''Попередження:''' Створена вами сторінка порожня.\nЯкщо Ви знову натиснете «{{int:savearticle}}», сторінку буде створено без вмісту.", + "anoneditwarning": "'''Увага''': Ви не увійшли до системи. До історії змін цієї сторінки буде записана ваша IP-адреса.", "anonpreviewwarning": "''Ви не увійшли в систему. Якщо ви виконаєте збереження, то в історію сторінки буде записана ваша IP-адреса.''", "missingsummary": "'''Нагадування''': Ви не дали короткого опису змін.\nНатиснувши кнопку «Зберегти» ще раз, ви збережете зміни без коментаря.", "missingcommenttext": "Будь ласка, введіть нижче ваше повідомлення.", @@ -604,20 +608,20 @@ "subject-preview": "Заголовок буде:", "blockedtitle": "Користувача заблоковано", "blockedtext": "'''Ваш обліковий запис або IP-адреса заблоковані.'''\n\nБлокування виконане адміністратором $1.\nЗазначена наступна причина: ''$2''.\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Блокування виконав: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете надіслати листа адміністратору, якщо ви не зареєстровані або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте ці дані у своїх запитах.", - "autoblockedtext": "Ваша IP-адреса автоматично заблокована у зв'язку з тим, що вона раніше використовувалася кимось із заблокованих користувачів. Адміністратор ($1), що її заблокував, зазначив наступну причину блокування:\n\n:''$2''\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Був заблокований: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете надіслати листа адміністраторові, якщо ви не зареєстровані у проекті або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте його у своїх запитах.", + "autoblockedtext": "Ваша IP-адреса автоматично заблокована у зв'язку з тим, що вона раніше використовувалася кимось із заблокованих користувачів. Адміністратор ($1), що її заблокував, зазначив наступну причину блокування:\n\n:''$2''\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Блокування виконав: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете надіслати листа адміністраторові, якщо ви не зареєстровані у проекті або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте його у своїх запитах.", "blockednoreason": "не вказано причини", "whitelistedittext": "Ви повинні $1 щоб редагувати сторінки.", - "confirmedittext": "Ви повинні підтвердити вашу адресу електронної пошти перед редагуванням сторінок.\nБудь-ласка зазначте і підтвердіть вашу електронну адресу на [[Special:Preferences|сторінці налаштувань]].", + "confirmedittext": "Ви повинні підтвердити вашу адресу електронної пошти перед редагуванням сторінок.\nБудь-ласка вкажіть і підтвердіть вашу електронну адресу на [[Special:Preferences|сторінці налаштувань]].", "nosuchsectiontitle": "Не вдається знайти розділ", "nosuchsectiontext": "Ви намагаєтесь редагувати розділ, якого не існує.\nМожливо, він був перейменований або вилучений, поки ви переглядали сторінку.", "loginreqtitle": "Необхідно ввійти до системи", "loginreqlink": "ввійти в систему", - "loginreqpagetext": "Ви повинні $1, щоб переглянути інші сторінки.", + "loginreqpagetext": "Ви повинні $1, щоб переглядати інші сторінки.", "accmailtitle": "Пароль надіслано.", "accmailtext": "Пароль для користувача [[User talk:$1|$1]], згенерований випадковим чином, надісланий на адресу $2.\nПісля реєстрації в системі ви зможете ''[[Special:ChangePassword|змінити пароль]]''.", "newarticle": "(Нова)", "newarticletext": "Ви перейшли на сторінку, яка поки що не існує.\n\nЩоб створити нову сторінку, наберіть текст у вікні нижче (див. [$1 довідкову статтю], щоб отримати більше інформації).\nЯкщо ви опинились тут помилково, просто натисніть кнопку браузера '''назад'''.", - "anontalkpagetext": "----''Це сторінка обговорення анонімного користувача, який ще не зареєструвався або не скористався зареєстрованим обліковим записом.\nТому ми вимушені використовувати IP-адресу для його ідентифікації.\nОдна IP-адреса може використовуватися декількома користувачами.\nЯкщо ви — анонімний користувач і вважаєте, що отримали коментарі, адресовані не вам, будь ласка [[Special:UserLogin/signup|зареєструйтесь]] або [[Special:UserLogin|увійдіть до системи]], щоб у майбутньому уникнути можливої плутанини з іншими анонімними користувачами.''", + "anontalkpagetext": "----''Це сторінка обговорення анонімного користувача, який ще не зареєструвався або не скористався зареєстрованим обліковим записом.''\nТому ми вимушені використовувати IP-адресу для його ідентифікації.\nОдна IP-адреса може використовуватись кількома користувачами.\nЯкщо ви — анонімний користувач і вважаєте, що отримали коментарі, адресовані не вам, будь ласка [[Special:UserLogin/signup|зареєструйтесь]] або [[Special:UserLogin|увійдіть до системи]], щоб у майбутньому уникнути можливої плутанини з іншими анонімними користувачами.", "noarticletext": "Зараз на цій сторінці нема тексту.\nВи можете [[Special:Search/{{PAGENAME}}|пошукати цю назву]] на інших сторінках,\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пошукати в журналах]\nабо [{{fullurl:{{FULLPAGENAME}}|action=edit}} створити сторінку з такою назвою].", "noarticletext-nopermission": "Зараз на цій сторінці немає тексту.\nВи можете [[Special:Search/{{PAGENAME}}|пошукати цю назву]] на інших сторінках,\nабо [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пошукати пов'язані записи в журналах], але ви не маєте дозволу на створення такої сторінки.", "missing-revision": "Версія #$1 сторінки «{{FULLPAGENAME}}» не існує.\n\nІмовірно, Ви перейшли за застарілим посиланням на вилучену сторінку.\nПодробиці можна дізнатися з [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журналу вилучень].", @@ -628,7 +632,7 @@ "usercssyoucanpreview": "'''Підказка:''' використовуйте кнопку «{{int:showpreview}}», щоб протестувати ваш новий css-файл перед збереженням.", "userjsyoucanpreview": "'''Підказка:''' використовуйте кнопку «{{int:showpreview}}», щоб протестувати ваш новий код JavaScript перед збереженням.", "usercsspreview": "'''Пам'ятайте, що це лише попередній перегляд вашого css-файлу.'''\n'''Його ще не збережено!'''", - "userjspreview": "'''Пам'ятайте, що це тільки попередній перегляд вашого JavaScript-файлу і поки він ще не збережений!'''", + "userjspreview": "'''Пам'ятайте, що це тільки попередній перегляд вашого JavaScript-файлу і він поки-що не збережений!'''", "sitecsspreview": "'''Пам'ятайте, що це тільки попередній перегляд цього CSS.'''\n'''Його ще не збережено!'''", "sitejspreview": "'''Пам'ятайте, що це лише попередній перегляд вашого JavaScript-коду.'''\n'''Його ще не збережено!'''", "userinvalidcssjstitle": "'''Увага:''' тема оформлення «$1» не знайдена.\nПам'ятайте, що користувацькі .css та .js сторінки повинні мати назву, що складається лише з малих літер, наприклад «{{ns:user}}:Хтось/vector.css», а не «{{ns:user}}:Хтось/Vector.css».", @@ -636,46 +640,46 @@ "note": "'''Зауваження:'''", "previewnote": "'''Це лише попередній перегляд.'''\nВаші зміни ще не збережено!", "continue-editing": "Продовжити редагування", - "previewconflict": "Цей попередній перегляд відображає текст з верхнього вікна редагування так, як він буде виглядіти, якщо ви вирішите зберегти його.", - "session_fail_preview": "'''Система не може зберегти ваші редагування, оскільки втрачені дані сеансу. Будь ласка, повторіть вашу спробу.\nЯкщо помилка буде повторюватись, спробуйте [[Special:UserLogout|вийти з системи]] і зайти знову.'''", - "session_fail_preview_html": "Вибачте! Неможливо зберегти ваші зміни через втрату даних HTML-сесії.\n\n''Оскільки {{SITENAME}} дозволяє використовувати чистий HTML, попередній перегляд відключено, щоб попередити JavaScript-атаки.''\n\nЯкщо це доброякісна спроба редагування, будь ласка, спробуйте ще раз. Якщо не вийде знову, - спробуйте [[Special:UserLogout|завершити сеанс роботи]] й ще раз ввійти до системи.", - "token_suffix_mismatch": "'''Ваше редагування було відхилене, оскільки ваша програма не правильно обробляє знаки пунктуації у вікні редагування. Редагування було скасоване для запобігання спотворенню тексту статті.\nПодібні проблеми можуть виникати при використанні анонімізуючих веб-проксі, що містять помилки.'''", - "edit_form_incomplete": "'''Частина даних із форми редагування не досягла сервера. Уважно перевірте чи не пошкоджено ваших правок і спробуйте ще раз.'''", + "previewconflict": "Цей попередній перегляд відображає текст з верхнього вікна редагування так, як він буде виглядати, якщо ви вирішите зберегти його.", + "session_fail_preview": "'''Система не може зберегти ваші редагування, оскільки втрачені дані сеансу. Будь ласка, повторіть вашу спробу.\nЯкщо помилка буде повторюватись, спробуйте [[Special:UserLogout|вийти з системи]] і увійти знову.'''", + "session_fail_preview_html": "Вибачте! Неможливо зберегти ваші зміни через втрату даних HTML-сесії.\n\n''Оскільки {{SITENAME}} дозволяє використовувати чистий HTML, попередній перегляд відключено, щоб попередити JavaScript-атаки.''\n\nЯкщо це легітимна спроба редагування, будь ласка, спробуйте ще раз. Якщо не вийде знову, - спробуйте [[Special:UserLogout|завершити сеанс роботи]] й ще раз ввійти до системи.", + "token_suffix_mismatch": "'''Ваше редагування було відхилене, оскільки ваша програма неправильно обробляє знаки пунктуації у вікні редагування. Редагування було скасоване для запобігання спотворенню тексту статті.\nПодібні проблеми можуть виникати при використанні анонімізуючих веб-проксі, що містять помилки.'''", + "edit_form_incomplete": "'''Частина даних із форми редагування не досягла сервера. Уважно перевірте, чи не пошкоджені ваші правки і спробуйте ще раз.'''", "editing": "Редагування $1", "creating": "Створення $1", "editingsection": "Редагування $1 (розділ)", "editingcomment": "Редагування $1 (новий розділ)", "editconflict": "Конфлікт редагування: $1", - "explainconflict": "Ще хтось змінив цю сторінку з того часу, як ви розпочали її змінювати.\nУ верхньому вікні показано поточний текст сторінки.\nВаші зміни показані в нижньому вікні.\nВам необхідно перенести ваші зміни в існуючий текст.\nЯкщо ви натиснете «{{int:savearticle}}», то буде збережено '''тільки''' текст у верхньому вікні редагування.", + "explainconflict": "Ще хтось змінив цю сторінку з того часу, як ви розпочали її правити.\nУ верхньому вікні показано поточний текст сторінки.\nВаші зміни показані в нижньому вікні.\nВам необхідно перенести ваші зміни в існуючий текст.\nЯкщо ви натиснете «{{int:savearticle}}», то буде збережено '''лише''' текст з верхнього вікна редагування.", "yourtext": "Ваш текст", "storedversion": "Збережена версія", - "nonunicodebrowser": "'''ПОПЕРЕДЖЕННЯ: Ваш [[браузер]] не підтримує [[Юнікод]].''' \nЩоб подолати це обмеження та дозволити Вам безпечно редагувати сторінки, усі не-ASCII символи буде показано їх шістнадцятковими кодами.", - "editingold": "'''ПОПЕРЕДЖЕННЯ: Ви редагуєте застарілу версію даної статті.\nЯкщо ви збережете її, будь-які редагування, зроблені між версіями, будуть втрачені.'''", + "nonunicodebrowser": "'''Попередження: Ваш браузер не підтримує Юнікод.''' \nЩоб подолати це обмеження та дозволити вам безпечно редагувати сторінки, усі не-ASCII символи буде показано їх шістнадцятковими кодами.", + "editingold": "'''Попередження: Ви редагуєте застарілу версію даної статті.\nЯкщо ви збережете її, будь-які редагування, зроблені між версіями, будуть втрачені.'''", "yourdiff": "Відмінності", - "copyrightwarning": "Зверніть увагу, що будь-які додавання і зміни до {{grammar:genitive|{{SITENAME}}}} розглядаються як випущені на умовах ліцензії $2 (див. $1).\nЯкщо ви не бажаєте, щоб написане вами безжалісно редагувалось і розповсюджувалося за бажанням будь-кого, не пишіть тут.
    \nВи також підтверджуєте, що написане вами тут належить вам або взяте з джерела, що є суспільним надбанням чи подібним вільним джерелом.\n'''НЕ ПУБЛІКУЙТЕ ТУТ БЕЗ ДОЗВОЛУ МАТЕРІАЛИ, ЩО ОХОРОНЯЮТЬСЯ АВТОРСЬКИМ ПРАВОМ!'''", - "copyrightwarning2": "Будь ласка, зверніть увагу, що всі внесені вами зміни можуть редагуватися, доповнюватися або вилучатися іншими користувачами.\nЯкщо ви не бажаєте, щоб написане вами безжалісно редагувалось — не пишіть тут.
    \nВи також зобов'язуєтесь, що написане вами тут належить вам або взяте з джерела, що є суспільним надбанням, або подібного вільного джерела (див. $1).
    \n'''НЕ ПУБЛІКУЙТЕ ТУТ БЕЗ ДОЗВОЛУ МАТЕРІАЛИ, ЩО Є ОБ'ЄКТОМ АВТОРСЬКОГО ПРАВА!'''", - "longpageerror": "'''Помилка: Текст, що ви надіслали займає $1 {{PLURAL:$1|кілобайт|кілобайти|кілобайтів}}, що більше за встановлену межу у $2 {{PLURAL:$2|кілобайт|кілобайти|кілобайтів}}.'''\nЙого неможливо зберегти.", - "readonlywarning": "'''ПОПЕРЕДЖЕННЯ: База даних заблокована в зв'язку з процедурами обслуговування,\nтому, на даний момент, ви не можете записати ваші зміни.\nМожливо, вам варто зберегти текст в локальний файл (на своєму диску) й зберегти його пізніше.'''\n\nАдміністратор, що заблокував базу даних, залишив наступне пояснення: $1", + "copyrightwarning": "Зверніть увагу, що будь-які додавання і зміни до {{grammar:genitive|{{SITENAME}}}} розглядаються як випущені на умовах ліцензії $2 (детальніше див. $1).\nЯкщо ви не бажаєте, щоб написане вами безжально редагувалось і розповсюджувалося за бажанням будь-кого, не пишіть тут.
    \nВи також підтверджуєте, що написане вами тут належить вам або взяте з джерела, що є суспільним надбанням чи подібного вільного джерела.\n'''Не публікуйте тут без дозволу матеріали, захищені авторським правом!'''", + "copyrightwarning2": "Будь ласка, зверніть увагу, що всі зміни, внесені вами до {{SITENAME}}, можуть редагуватися, доповнюватися або вилучатися іншими користувачами.\nЯкщо ви не бажаєте, щоб написане вами безжально редагувалось — не пишіть тут.
    \nВи також підтверджуєте, що наведене тут написано вами особисто або запозичено з джерела, яке є суспільним надбанням, або подібного вільного джерела (див. $1).
    \n'''Не публікуйте тут без дозволу матеріали, захищені авторським правом!'''", + "longpageerror": "'''Помилка: Поданий вами текст становить $1 {{PLURAL:$1|кілобайт|кілобайти|кілобайтів}}, що більше за встановлену межу у {{PLURAL:$2|кілобайт|кілобайти|кілобайтів}}.'''\nЙого неможливо зберегти.", + "readonlywarning": "'''Попередження: База даних заблокована на обслуговування, тому, на даний момент, ви не можете записати ваші зміни.\nМожливо, вам варто скопіювати текст у файл на вашому комп'ютері й зберегти його на пізніше.'''\n\nАдміністратор, що заблокував базу даних, залишив наступне пояснення: $1", "protectedpagewarning": "'''Попередження: Ця сторінка була захищена від змін так, що тільки користувачі з правами адміністратора можуть її редагувати.'''\nОстанній запис журналу наведений нижче для довідки:", "semiprotectedpagewarning": "'''Зауваження:''' Ця сторінка захищена так, що її можуть редагувати тільки зареєстровані користувачі.\nОстанній запис журналу наведений нижче для довідки:", "cascadeprotectedwarning": "'''Попередження:''' Цю сторінку можуть редагувати лише користувачі з групи «Адміністратори», оскільки вона включена {{PLURAL:$1|1=до сторінки, для якої|до наступних сторінок, для яких}} активовано каскадний захист:", "titleprotectedwarning": "'''Попередження. Ця сторінка була захищена так, що для її створення потрібні [[Special:ListGroupRights|особливі права]].'''\nОстанній запис журналу наведений нижче для довідки:", "templatesused": "{{PLURAL:$1|1=Шаблон, використаний|Шаблони, використані}} на цій сторінці:", "templatesusedpreview": "{{PLURAL:$1|1=Шаблон, використаний|Шаблони, використані}} у цьому попередньому перегляді:", - "templatesusedsection": "{{PLURAL:$1|1=Шаблон, використаний|Шаблони, використані}} у цій секції:", + "templatesusedsection": "{{PLURAL:$1|1=Шаблон, використаний|Шаблони, використані}} у цьому розділі:", "template-protected": "(захищено)", "template-semiprotected": "(частково захищено)", "hiddencategories": "Ця сторінка належить до $1 {{PLURAL:$1|прихованої категорії|прихованих категорій|прихованих категорій}}:", "edittools": "", "edittools-upload": "-", - "nocreatetext": "На цьому сайті обмежено можливість створення нових сторінок.\nВи можете повернуться назад й змінити існуючу сторінку, [[Special:UserLogin|ввійти в систему, або створити новий обліковий запис]].", + "nocreatetext": "На сайті {{SITENAME}} обмежено можливість створення нових сторінок.\nВи можете повернутьсь назад і змінити існуючу сторінку, [[Special:UserLogin|ввійти в систему, або створити новий обліковий запис]].", "nocreate-loggedin": "У вас нема дозволу створювати нові сторінки.", "sectioneditnotsupported-title": "Редагування окремих розділів не підтримується", "sectioneditnotsupported-text": "На цій сторінці не підтримується редагування окремих розділів", "permissionserrors": "Помилка доступу", "permissionserrorstext": "У вас нема прав на виконання цієї операції з {{PLURAL:$1|1=наступної причини|наступних причин}}:", "permissionserrorstext-withaction": "У вас нема дозволу на $2 з {{PLURAL:$1|1=такої причини|таких причин}}:", - "recreate-moveddeleted-warn": "'''Попередження: ви намагаєтеся створити сторінку, яка раніше вже була вилучена.'''\n\nПеревірте, чи справді вам потрібно знову створювати цю сторінку.\nНижче наведений журнал вилучень і перейменувань:", + "recreate-moveddeleted-warn": "'''Попередження: ви намагаєтеся створити сторінку, яка раніше вже була вилучена.'''\n\nПеревірте, чи справді вам справді потрібно створювати цю сторінку.\nНижче, для зручності, наведений журнал вилучень і перейменувань:", "moveddeleted-notice": "Ця сторінка була вилучена.\nДля довідки нижче наведені відповідні записи з журналів вилучень і перейменувань.", "log-fulllog": "Переглянути весь журнал", "edit-hook-aborted": "Редагування скасоване процедурою-перехоплювачем.\nДодаткові пояснення не наведені.", @@ -686,28 +690,28 @@ "postedit-confirmation-restored": "Сторінка була відновлена.", "postedit-confirmation-saved": "Ваше редагування збережено", "edit-already-exists": "Неможливо створити нову сторінку.\nВона вже існує.", - "defaultmessagetext": "Текст «за замовчування»", - "content-failed-to-parse": "Не вдалось проаналізувати $2 як тип $1: $3", + "defaultmessagetext": "Стандартний текст повідомлення", + "content-failed-to-parse": "Не вдалось ідентифікувати $2 як тип $1 через: $3", "invalid-content-data": "Неприпустимі дані", "content-not-allowed-here": "Вміст «$1» недопустимий на сторінці [[$2]]", "editwarning-warning": "Перехід на іншу сторінку призведе до втрати ваших змін.\nЯкщо ви ввійшли до системи, то ви можете відключити це попередження в розділі \"{{int:prefs-editing}}\" ваших налаштувань.", - "editpage-notsupportedcontentformat-title": "Непідтримуваний формат вмісту", + "editpage-notsupportedcontentformat-title": "Формат вмісту не підтримується", "editpage-notsupportedcontentformat-text": "Формат вмісту $1 не підтримується моделлю вмісту $2.", "content-model-wikitext": "вікітекст", "content-model-text": "звичайний текст", "content-model-javascript": "JavaScript", "content-model-css": "CSS", - "expensive-parserfunction-warning": "Увага: Ця сторінка містить дуже багато викликів ресурсомістких функцій.\n\nКількість викликів не повинна перевищувати $2, зараз потрібно зробити $1 {{PLURAL:$1|виклик|виклики|викликів}}.", + "expensive-parserfunction-warning": "'''Увага:''' Ця сторінка містить дуже багато викликів ресурсомістких функцій.\n\nКількість викликів не повинна перевищувати $2, зараз потрібно зробити $1 {{PLURAL:$1|виклик|виклики|викликів}}.", "expensive-parserfunction-category": "Сторінки з дуже великою кількістю викликів ресурсомістких функцій", - "post-expand-template-inclusion-warning": "Увага: розмір шаблонів для включення занадто великий.\nДеякі шаблони не буде включено.", + "post-expand-template-inclusion-warning": "'''Увага:''' розмір шаблонів для включення занадто великий.\nДеякі шаблони не буде включено.", "post-expand-template-inclusion-category": "Сторінки з перевищеним розміром включених шаблонів", - "post-expand-template-argument-warning": "'''Увага:''' Ця сторінка містить принаймні один аргумент шаблону, який має надто великий розмір для розгортання.\nТакі аргументи були опущені.", + "post-expand-template-argument-warning": "'''Увага:''' Ця сторінка містить принаймні один аргумент шаблону, який має надто великий розмір для розгортання.\nЦі аргументи були проігноровані.", "post-expand-template-argument-category": "Сторінки, які містять пропущені аргументи шаблонів", "parser-template-loop-warning": "Виявлена петля у шаблонах: [[$1]]", "parser-template-recursion-depth-warning": "Перевищене обмеження глибини рекурсії шаблону ($1)", "language-converter-depth-warning": "Перевищене обмеження глибини мовного конвертора ($1)", "node-count-exceeded-category": "Сторінки, на яких перевищено лічильник вузлів", - "node-count-exceeded-category-desc": "Категорія для сторінок, на яких перебільшена кількість вузлів.", + "node-count-exceeded-category-desc": "Категорія для сторінок, на яких перевищена кількість вузлів.", "node-count-exceeded-warning": "Кількість вузлів препроцесора на сторінці перевищила встановлену межу.", "expansion-depth-exceeded-category": "Сторінки, де перевищено глибину розгортання", "expansion-depth-exceeded-category-desc": "Це категорія для сторінок з перевищеною глибиною розкриття.", @@ -717,13 +721,13 @@ "converter-manual-rule-error": "Помилка в ручному правилі перетворення мови", "undo-success": "Редагування може бути скасовано.\nБудь ласка, перевірте порівняння нижче, щоб впевнитись, що це те, що ви хочете зробити, а потім збережіть зміни, щоб закінчити скасування редагування.", "undo-failure": "Неможливо скасувати редагування через несумісність проміжних змін.", - "undo-norev": "Редагування не може бути скасоване, бо воно не існує або було вилучене.", - "undo-nochange": "Схоже, редагування уже було скасовано.", - "undo-summary": "Скасування редагування № $1 користувача [[Special:Contributions/$2|$2]] ([[User talk:$2|обговорення]])", - "undo-summary-username-hidden": "Скасувати перевірку $1 прихованого користувача", + "undo-norev": "Редагування не може бути скасоване, бо його не існує або було вилучено.", + "undo-nochange": "Схоже, редагування вже було скасовано.", + "undo-summary": "Скасування редагування № $1 користувача [[Special:Contribs/$2|$2]] ([[User talk:$2|обговорення]])", + "undo-summary-username-hidden": "Скасувати правку $1, виконану прихованим користувачем", "cantcreateaccounttitle": "Неможливо створити обліковий запис", "cantcreateaccount-text": "Створення облікових записів із цієї IP-адреси ('''$1''') було заблоковане [[User:$3|користувачем $3]].\n\n$3 зазначив таку причину: ''$2''", - "cantcreateaccount-range-text": "Створення облікового запису із IP-адрес у діапазоні '''$1''', який включає вашу IP-адресу ('''$4'''), вже заблоковано користувачем [[User:$3|$3]].\n\nКористувач $3 вказав як причину ''$2''", + "cantcreateaccount-range-text": "Створення облікового запису із IP-адрес у діапазоні '''$1''', який включає вашу IP-адресу ('''$4'''), було заблоковано користувачем [[User:$3|$3]].\n\nКористувач $3 вказав як причину ''$2''", "viewpagelogs": "Показати журнали для цієї сторінки", "nohistory": "Для цієї статті відсутній журнал редагувань.", "currentrev": "Поточна версія", @@ -735,16 +739,16 @@ "currentrevisionlink": "Поточна версія", "cur": "поточн.", "next": "наст.", - "last": "ост.", + "last": "попер.", "page_first": "перша", "page_last": "остання", - "histlegend": "Пояснення: (поточн.) = відмінності від поточної версії,\n(ост.) = відмінності від попередньої версії, '''м''' = незначне редагування", + "histlegend": "Вибір версії: Позначте у круглих віконцях версії для порівняння і натисніть «Enter» або кнопку внизу.\n\nПояснення: (поточн.) = відмінності від поточної версії,\n(ост.) = відмінності від попередньої версії, '''м''' = незначне редагування", "history-fieldset-title": "Переглянути історію", "history-show-deleted": "Тільки вилучені", "histfirst": "найдавніші", "histlast": "найновіші", "historysize": "($1 {{PLURAL:$1|байт|байти|байтів}})", - "historyempty": "(порожньо)", + "historyempty": "(порожня)", "history-feed-title": "Історія редагувань", "history-feed-description": "Історія редагувань цієї сторінки в вікі", "history-feed-item-nocomment": "$1 в $2", @@ -752,7 +756,7 @@ "rev-deleted-comment": "(опис редагування вилучено)", "rev-deleted-user": "(ім'я автора стерто)", "rev-deleted-event": "(запис журналу вилучений)", - "rev-deleted-user-contribs": "[ім'я користувача або IP-адреса вилучені — редагування приховане у внеску]", + "rev-deleted-user-contribs": "[ім'я користувача або IP-адреса вилучені — редагування приховане з внеску]", "rev-deleted-text-permission": "Ця версія сторінки '''вилучена'''.\nМожливо є пояснення в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журналі вилучень].", "rev-suppressed-text-permission": "Цю версію сторінки було приховано.\nДетальніше можна подивитися у [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журналі приховування].", "rev-deleted-text-unhide": "Ця версія сторінки була '''вилучена'''.\nПодробиці наведені у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журналі вилучень].\nВи все ще можете [$1 переглянути цю версію], якщо забажаєте.", @@ -776,11 +780,11 @@ "revdelete-selected-text": "{{PLURAL:$1|Вибрана редакція|Вибрані редакції}} із [[:$2]]:", "revdelete-selected-file": "{{PLURAL:$1|Вибрана версія файлу|Вибрані версії файлу}} із [[:$2]]:", "logdelete-selected": "{{PLURAL:$1|1=Обраний запис|Обрані записи}} журналу:", - "revdelete-text-text": "Видалені версії будуть як і раніше видно в історії сторінки, але їх частини вмісту будуть доступні для учасників.", + "revdelete-text-text": "Видалені версії будуть як і раніше, показані в історії сторінки, але частини їх вмісту будуть недоступні для учасників.", "revdelete-text-file": "Видалені версії файлу будуть як і раніше видно в історії сторінки, але їх частини вмісту будуть доступні для учасників.", - "logdelete-text": "Видалені події в журналі будуть як і раніше видно в журналах, але частини їх вмісту будуть доступні для учасників.", - "revdelete-text-others": "Інші адміністратори на як і раніше будуть мати можливість доступу до прихованого вмісту і зможуть відновити його, якщо не встановлено додаткові обмеження.", - "revdelete-confirm": "Будь ласка, підтвердить, що ви справді бажаєте це здійснити, усвідомлюєте наслідки та робите це згідно з [[{{MediaWiki:Policy-url}}|правилами]].", + "logdelete-text": "Видалені події в журналі будуть як і раніше видно в журналах, але частини їх вмісту будуть недоступні для учасників.", + "revdelete-text-others": "Інші адміністратори, як і раніше, будуть мати можливість доступу до прихованого вмісту і зможуть відновити його, якщо не встановлено додаткові обмеження.", + "revdelete-confirm": "Будь ласка, підтвердіть, що ви справді бажаєте це здійснити, що усвідомлюєте наслідки та робите це згідно з [[{{MediaWiki:Policy-url}}|правилами]].", "revdelete-suppress-text": "Приховування може відбуватися '''лише''' в таких випадках:\n* Потенційно наклепницькі відомості\n* Недоречна особиста інформація\n*: ''домашні адреси, номери телефонів, номер паспорта тощо.''", "revdelete-legend": "Встановити обмеження видимості", "revdelete-hide-text": "Текст версії сторінки", @@ -802,7 +806,7 @@ "logdelete-failure": "'''Не вдалося встановити видимість журналу:'''\n$1", "revdel-restore": "Змінити видимість", "pagehist": "Історія сторінки", - "deletedhist": "Історія вилучень", + "deletedhist": "Історія вилучена", "revdelete-hide-current": "Помилка приховування запису від $2, $1: це поточна версія.\nЇї не можна приховати.", "revdelete-show-no-access": "Помилка показу запису від $2, $1: він позначений як «з обмеженим доступом».\nВи не маєте доступу до нього.", "revdelete-modify-no-access": "Помилка редгування запису від $2, $1: його поначено як \"з обмеженим доступом\".\nВи не маєте доступу до нього.", @@ -810,29 +814,29 @@ "revdelete-no-change": "'''Увага:''' запис від $2, $1 вже має запрошені налаштування видимості.", "revdelete-concurrent-change": "Помилка редагування запису від $2, $1: його стан змінений кимось іншим, поки ви робили свої зміни.\nБудь ласка, перевірте журнал.", "revdelete-only-restricted": "Помилка приховання запису від $2, $1: ви не можете приховати записи від перегляду адміністраторів без одночасного вибору однієї з інших опцій приховання.", - "revdelete-reason-dropdown": "* Типові причини вилучення\n** Порушення авторських прав\n** Недоречна особиста інформація\n** Невідповідне ім'я користувача\n** Потенційно наклепна інформація", + "revdelete-reason-dropdown": "* Типові причини вилучення\n** Порушення авторських прав\n** Недоречні коментарі чи особиста інформація\n** Невідповідне ім'я користувача\n** Потенційно наклепницька інформація", "revdelete-otherreason": "Інша/додаткова причина:", "revdelete-reasonotherlist": "Інша причина", - "revdelete-edit-reasonlist": "Редагувати причини вилучень", + "revdelete-edit-reasonlist": "Редагувати причини вилучення", "revdelete-offender": "Автор версії:", "suppressionlog": "Журнал приховувань", "suppressionlogtext": "Нижче наведено список вилучень та блокувань, включаючи матеріали, приховані від адміністраторів.\nДивіться [[Special:BlockList|список блокувань]] для перегляду поточних блокувань.", - "mergehistory": "Об'єднання історій редагувань", + "mergehistory": "Об'єднати історії редагувань", "mergehistory-header": "Ця сторінка дозволяє вам об'єднати історії редагувань двох різних сторінок.\nПереконайтеся, що ця зміна збереже цілісність історії сторінки.", "mergehistory-box": "Об'єднати історії редагувань двох сторінок:", "mergehistory-from": "Вихідна сторінка:", "mergehistory-into": "Цільова сторінка:", "mergehistory-list": "Історія редагувань, що об'єднується", - "mergehistory-merge": "Наступні версії [[:$1]] можуть бути об'єднані у [[:$2]]. Використайте перемикачі для того, щоб об'єднати тільки вибраний діапазон редагувань. Врахуйте, що при використанні навігаційних посилань дані будуть втрачені.", + "mergehistory-merge": "Наступні версії [[:$1]] можуть бути об'єднані у [[:$2]]. Використайте круглі віконця, щоб об'єднати тільки вибраний діапазон редагувань. \nВрахуйте, що при використанні навігаційних посилань дані будуть втрачені.", "mergehistory-go": "Показати редагування, що об'єднуються", - "mergehistory-submit": "Об'єднати редагування", - "mergehistory-empty": "Не знайдені редагування для об'єднання.", + "mergehistory-submit": "Об'єднати версії", + "mergehistory-empty": "Не знайдено версій для об'єднання.", "mergehistory-success": "$3 {{PLURAL:$3|редагування|редагування|редагувань}} з [[:$1]] успішно перенесені до [[:$2]].", "mergehistory-fail": "Не вдалося здійснити об'єднання історій сторінок, будь ласка, перевірте параметри сторінки й часу.", "mergehistory-fail-toobig": "Не вдалося виконати злиття історії оскільки буде перейменовано більше, ніж ліміт у $1 {{PLURAL:$1|версію|версії|версій}}.", "mergehistory-no-source": "Вихідна сторінка «$1» не існує.", "mergehistory-no-destination": "Цільова сторінка «$1» не існує.", - "mergehistory-invalid-source": "Джерело повинне мати правильний заголовок.", + "mergehistory-invalid-source": "Вихідна сторінка повинна мати правильний заголовок.", "mergehistory-invalid-destination": "Цільова сторінка повинна мати правильний заголовок.", "mergehistory-autocomment": "Редагування з [[:$1]] перенесені до [[:$2]]", "mergehistory-comment": "Редагування [[:$1]] перенесені до [[:$2]]: $3", @@ -878,7 +882,6 @@ "searchprofile-advanced-tooltip": "Шукати в заданих просторах назв", "search-result-size": "$1 ($2 {{PLURAL:$2|слово|слова|слів}})", "search-result-category-size": "{{PLURAL:$1|$1 елемент|$1 елементи|$1 елементів}} ({{PLURAL:$2|$2 підкатегорія|$2 підкатегорії|$2 підкатегорій}}, {{PLURAL:$3|$3 файл|$3 файли|$3 файлів}})", - "search-result-score": "Відповідність: $1 %", "search-redirect": "(перенаправлення $1)", "search-section": "(розділ $1)", "search-file-match": "(збігається із вмістом файлу)", @@ -1287,8 +1290,6 @@ "uploadwarning": "Попередження", "uploadwarning-text": "Будь ласка, змініть наданий нижче опис файлу і спробуйте ще раз.", "savefile": "Зберегти файл", - "uploadedimage": "завантажив «[[$1]]»", - "overwroteimage": "завантажив нову версію «[[$1]]»", "uploaddisabled": "Завантаження заборонене", "copyuploaddisabled": "Завантаження через URL вимкнене.", "uploaddisabledtext": "Можливість завантаження файлів відключена.", @@ -3190,6 +3191,9 @@ "logentry-rights-rights": "$1 {{GENDER:$1|змінив|змінила}} членство в групах для $3 із $4 на $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$1|змінив|змінила}} членство в групах для $3", "logentry-rights-autopromote": "$1 було автоматично переведено із $4 в $5", + "logentry-upload-upload": "$1 {{GENDER:$2|завантажив|завантажила}} $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|завантажив|завантажила}} нову версію $3", + "logentry-upload-revert": "$1 {{GENDER:$2|завантажив|завантажила}} $3", "rightsnone": "(нема)", "feedback-bugornote": "Якщо ви готові описати технічні проблеми в деталях, будь ласка, [$1 повідомте про помилку].\nАбо можете використати форму нижче. Ваш коментар буде додано на сторінку \"[$3 $2]\", разом з іменем користувача.", "feedback-subject": "Тема:", @@ -3292,5 +3296,7 @@ "action-pagelang": "змінити мову сторінки", "log-name-pagelang": "Журнал змін мови", "log-description-pagelang": "Це журнал змін мови сторінок.", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2|змінив|змінила}} мову сторінки для $3 з $4 на $5." + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|змінив|змінила}} мову сторінки для $3 з $4 на $5.", + "default-skin-not-found-row-enabled": "* $1 / $2 (увімкнено)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''вимкнено''')" } diff --git a/languages/i18n/vi.json b/languages/i18n/vi.json index 2394e91946..b8bdf65f4f 100644 --- a/languages/i18n/vi.json +++ b/languages/i18n/vi.json @@ -1253,8 +1253,6 @@ "uploadwarning": "Cảnh báo!", "uploadwarning-text": "Xin hãy chỉnh sửa miêu tả tập tin ở dưới và thử lại.", "savefile": "Lưu tập tin", - "uploadedimage": "đã tải “[[$1]]” lên", - "overwroteimage": "đã tải lên một phiên bản mới của “[[$1]]”", "uploaddisabled": "Chức năng tải lên đã bị khóa.", "copyuploaddisabled": "Chức năng tải lên từ địa chỉ URL đã bị tắt.", "uploaddisabledtext": "Chức năng tải tập tin đã bị tắt.", diff --git a/languages/i18n/wuu.json b/languages/i18n/wuu.json index af523990b0..32dc1d2372 100644 --- a/languages/i18n/wuu.json +++ b/languages/i18n/wuu.json @@ -715,7 +715,6 @@ "searchprofile-advanced-tooltip": "垃拉自定义名字空间里向搜索", "search-result-size": "$1($2字)", "search-result-category-size": "$1个成员($2个儿分类,$3个文件)", - "search-result-score": "相关度:$1%", "search-redirect": "(转戳到 $1)", "search-section": "(段落 $1)", "search-suggest": "你侬是寻:$1", @@ -910,7 +909,6 @@ "windows-nonascii-filename": "箇wiki弗支持文件名用特別個字符。", "uploadwarning": "上载警告", "savefile": "保存文件", - "uploadedimage": "上传 \"[[$1]]\"", "sourcefilename": "源文件:", "destfilename": "目标文件名:", "watchthisupload": "關注箇文件", diff --git a/languages/i18n/yi.json b/languages/i18n/yi.json index 5a8b7e7298..45675e0ac0 100644 --- a/languages/i18n/yi.json +++ b/languages/i18n/yi.json @@ -832,7 +832,6 @@ "searchprofile-advanced-tooltip": "זוכן אין צוגעשטעלטע ָנאָמענטיילן", "search-result-size": "$1 ({{PLURAL:$2|איין ווארט|$2 ווערטער}})", "search-result-category-size": "{{PLURAL:$1|1 מיטגליד|$1 מיטגלידער}} ({{PLURAL:$2|1 אונטער־קאַטעגאריע|$2 אונטער־קאַטעגאריעס}}, {{PLURAL:$3|1 טעקע|$3 טעקעס}})", - "search-result-score": "שייכותדיקייט: $1%", "search-redirect": "(ווײַטערפֿירן $1)", "search-section": "(אפטיילונג $1)", "search-file-match": "(פאסט צו טעקע אינהאלט)", @@ -1235,8 +1234,6 @@ "uploadwarning": "אַרויפֿלאָדן וואָרענונג", "uploadwarning-text": "זײַט אַזוי גוט מאדיפֿיצירן די טעקע באַשרייבונג און פרובירט נאכאַמאָל.", "savefile": "אױפֿהיטן טעקע", - "uploadedimage": "אַרױפֿגעלאָדן \"[[$1]]\"", - "overwroteimage": "אַרויפֿגעלאָדן א נײַע ווערסיע פון \"[[$1]]\"", "uploaddisabled": "אַרויפֿלאָדן טעקעס מבוטל", "copyuploaddisabled": "ארויפלאדן דורך URL אומאקטיווירט", "uploaddisabledtext": "אַרויפֿלאָדן טעקעס נישט דערמעגלעכט.", diff --git a/languages/i18n/zh-hans.json b/languages/i18n/zh-hans.json index 7483d2b1e7..8fd1111b03 100644 --- a/languages/i18n/zh-hans.json +++ b/languages/i18n/zh-hans.json @@ -77,7 +77,8 @@ "아라", "Mywood", "Impersonator 1", - "Duolaimi" + "Duolaimi", + "TianyinLee" ] }, "tog-underline": "链接下划线:", @@ -305,7 +306,7 @@ "mainpage": "首页", "mainpage-description": "首页", "policy-url": "Project:方针", - "portal": "社区专页", + "portal": "社区主页", "portal-url": "Project:社区专页", "privacy": "隐私权政策", "privacypage": "Project:隐私权政策", @@ -334,6 +335,9 @@ "hidetoc": "隐藏", "collapsible-collapse": "折叠", "collapsible-expand": "展开", + "confirmable-confirm": "{{GENDER:$1|你}}确定么?", + "confirmable-yes": "是", + "confirmable-no": "否", "thisisdeleted": "查看或还原$1?", "viewdeleted": "查看$1?", "restorelink": "$1个已被删除的编辑", @@ -418,7 +422,7 @@ "invalidtitle-knownnamespace": "使用名字空间“$2”和文本“$3”的无效标题", "invalidtitle-unknownnamespace": "使用未知名字空间编号$1和文本“$2”的无效标题", "exception-nologin": "未登录", - "exception-nologin-text": "该页面或操作需要你[[Special:Userlogin|登录]]至本Wiki。", + "exception-nologin-text": "请登录以访问此页面或进行操作。", "exception-nologin-text-manual": "查看该页面或进行此操作需要您$1。", "virus-badscanner": "错误的配置:未知的病毒扫描程序:''$1''", "virus-scanfailed": "扫描失败(代码 $1)", @@ -621,7 +625,7 @@ "showdiff": "显示更改", "blankarticle": "警告:您创建的页面是空白的。如果您再次点击“{{int:savearticle}}”,您将真的创建没有任何内容的页面。", "anoneditwarning": "警告:您没有登录。您的IP地址将被记录在该页面的编辑历史中。", - "anonpreviewwarning": "''你没有登录。保存会记录你的IP地址于该页面的编辑历史中。''", + "anonpreviewwarning": "你没有登录。保存会记录你的IP地址于该页面的编辑历史中。", "missingsummary": "'''提示:'''你没有提供编辑摘要。如果你再次点击“{{int:savearticle}}”,你的编辑将不带编辑摘要保存。", "missingcommenttext": "请在下面输入评论。", "missingcommentheader": "'''提示:''' 您还没有为此评论提供一个标题。如果您再次点击“{{int:savearticle}}”,您的编辑将不带标题保存。", @@ -725,16 +729,16 @@ "expensive-parserfunction-category": "页面中有太多耗费的语法功能呼叫", "post-expand-template-inclusion-warning": "'''警告:'''包含模板大小过大。\n一些模板将不会包含。", "post-expand-template-inclusion-category": "模板包含上限已经超过的页面", - "post-expand-template-argument-warning": "'''警告:'''本页面包含至少一个模板参数有过大扩展大小。这些参数会被略过。", + "post-expand-template-argument-warning": "警告:本页面包含至少一个模板参数有过大扩展大小。这些参数会被略过。", "post-expand-template-argument-category": "含有略过模板参数的页面", "parser-template-loop-warning": "检查到模板循环:[[$1]]", "parser-template-recursion-depth-warning": "模板递归深度越限($1)", "language-converter-depth-warning": "字词转换器深度越限($1)", "node-count-exceeded-category": "页面的节点数超出限制", - "node-count-exceeded-category-desc": "节点数溢出页面的分类。", + "node-count-exceeded-category-desc": "超出最高节点数的页面。", "node-count-exceeded-warning": "页面超出了节点数", "expansion-depth-exceeded-category": "扩展深度超出限制的页面", - "expansion-depth-exceeded-category-desc": "这是超出拓展深度页面的分类。", + "expansion-depth-exceeded-category-desc": "页面超出最大扩展深度。", "expansion-depth-exceeded-warning": "页面超过了扩展深度", "parser-unstrip-loop-warning": "检测到回圈", "parser-unstrip-recursion-limit": "递归超过限制 ($1)", @@ -902,7 +906,6 @@ "searchprofile-advanced-tooltip": "在自定义名字空间中搜索", "search-result-size": "$1($2个字)", "search-result-category-size": "$1个成员($2个子分类,$3个文件)", - "search-result-score": "相关度:$1%", "search-redirect": "(重定向自“$1”)", "search-section": "(“$1”段落)", "search-file-match": "(匹配文件内容)", @@ -929,7 +932,7 @@ "preferences": "设置", "mypreferences": "设置", "prefs-edits": "编辑数:", - "prefsnologintext2": "进行用户设置需要您$1。", + "prefsnologintext2": "请登录以更改您的用户设置。", "prefs-skin": "皮肤", "skin-preview": "预览", "datedefault": "默认格式", @@ -1306,8 +1309,6 @@ "uploadwarning": "上传警告", "uploadwarning-text": "请修改下面的文件说明并重试。", "savefile": "保存文件", - "uploadedimage": "上传“[[$1]]”", - "overwroteimage": "上传“[[$1]]”的新版本", "uploaddisabled": "上传己停用。", "copyuploaddisabled": "URL上传已停用。", "uploaddisabledtext": "文件上传已停用。", @@ -1717,9 +1718,9 @@ "index-category-desc": "页面中有__INDEX__魔术字(并且在标记允许的名字空间)且因此被机器人索引但本不应索引的。", "post-expand-template-inclusion-category-desc": "在展开了所有模板后,页面大小大于$wgMaxArticleSize,所以一些模板未展开。", "post-expand-template-argument-category-desc": "展开了模板参数(三对花括号内,例如{{{Foo}}})之后,页面大于$wgMaxArticleSize。", - "expensive-parserfunction-category-desc": "页面包含了太多的高开销函数解析器(例如#ifexist)。参见[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]。", - "broken-file-category-desc": "当页面包含损坏文件连接(连接至嵌入的一个不存在文件)时分类被加入。", - "hidden-category-category-desc": "这是有__HIDDENCAT__的分类,该魔术字阻止分类默认在页面上的分类链接框中显示。", + "expensive-parserfunction-category-desc": "页面包含了太多的高级解析器函数(例如#ifexist)。参见[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]。", + "broken-file-category-desc": "页面包含损坏的文件连接(连接至嵌入的一个不存在文件)。", + "hidden-category-category-desc": "页面中包含__HIDDENCAT__的分类,它阻止分类默认在页面上的分类链接框中显示。", "trackingcategories-nodesc": "没有说明。", "trackingcategories-disabled": "分类被禁用", "mailnologin": "无电子邮件地址", @@ -1756,7 +1757,7 @@ "mywatchlist": "监视列表", "watchlistfor2": "$1的监视列表$2", "nowatchlist": "你的监视列表为空。", - "watchlistanontext": "请$1以查看或编辑您的监视列表。", + "watchlistanontext": "请登录以查看或编辑您的监视列表。", "watchnologin": "未登录", "addwatch": "添加至监视列表", "addedwatchtext": "已将页面“[[:$1]]”加入您的[[Special:Watchlist|监视列表]]。此后本页面及其讨论页的若有更改将在监视列表中显示。", @@ -1820,6 +1821,7 @@ "delete-edit-reasonlist": "编辑删除原因", "delete-toobig": "这个页面有一个十分大量的编辑历史,超过$1个版本。删除此类页面的动作已经被限制,以防止在{{SITENAME}}上的意外扰乱。", "delete-warning-toobig": "这个页面有一个十分大量的编辑历史,超过$1个版本。删除它可能会扰乱{{SITENAME}}的数据库操作;在继续此动作前请小心。", + "delete-cantedit": "您不能删除此页面,因为您没有权限编辑它。", "deleting-backlinks-warning": "'''警告:'''有[[Special:WhatLinksHere/{{FULLPAGENAME}}|其他页面]]链接至或包含您要删除的页面。", "rollback": "回退编辑", "rollback_short": "回退", @@ -1981,7 +1983,7 @@ "autoblockid": "自动封禁#$1", "block": "封禁用户", "unblock": "解封用户", - "blockip": "封禁用户", + "blockip": "封禁{{GENDER:$1|用户}}", "blockip-legend": "封禁用户", "blockiptext": "使用下方的表单来禁止来自特定IP地址或用户名的写访问。\n只有在为了防止破坏,并符合[[{{MediaWiki:Policy-url}}|方针]]的情况下才可采取此行动。\n请在下面输入一个具体的理由(例如引述一个被破坏的页面)。", "ipaddressorusername": "IP地址或用户名:", @@ -2010,7 +2012,7 @@ "ipb-unblock-addr": "解封$1", "ipb-unblock": "解封用户名或IP地址", "ipb-blocklist": "查看现有封禁", - "ipb-blocklist-contribs": "$1的贡献", + "ipb-blocklist-contribs": "{{GENDER:$1|$1}}的贡献", "unblockip": "解封用户", "unblockiptext": "使用下列表单来恢复之前被封禁的IP地址或用户名的写权限。", "ipusubmit": "解除此封禁", @@ -2247,7 +2249,7 @@ "importlogpagetext": "管理性导入在其他wiki上有编辑历史的页面。", "import-logentry-upload": "通过文件上传导入[[$1]]", "import-logentry-upload-detail": "已导入$1个{{PLURAL:$1|版本}}", - "import-logentry-interwiki": "跨wiki$1", + "import-logentry-interwiki": "跨wiki页面$1", "import-logentry-interwiki-detail": "已从$2导入$1个{{PLURAL:$1|版本}}", "javascripttest": "JavaScript测试", "javascripttest-title": "运行$1测试", @@ -3096,6 +3098,9 @@ "logentry-rights-rights": "$1{{GENDER:$2|更改}}$3的用户组自$4至$5", "logentry-rights-rights-legacy": "$1更改$3的用户组", "logentry-rights-autopromote": "$1被自动地{{GENDER:$2|提升}}自$4至$5", + "logentry-upload-upload": "$1{{GENDER:$2|上传了}}$3", + "logentry-upload-overwrite": "$1{{GENDER:$2|上传了}}$3的新版本", + "logentry-upload-revert": "$1{{GENDER:$2|上传了}}$3", "rightsnone": "(无)", "feedback-bugornote": "如果你准备好详细描述一个技术问题,请[$1 报告bug]。或者你可以使用下面的简单表格。你的评论将被添加至页面“[$3 $2]”,附有你的用户名。", "feedback-subject": "主题:", @@ -3198,5 +3203,9 @@ "action-pagelang": "更改页面语言", "log-name-pagelang": "更改语言日志", "log-description-pagelang": "这是页面语言更改的日志。", - "logentry-pagelang-pagelang": "$1{{GENDER:$2|更改}}$3的页面语言:从$4改为$5。" + "logentry-pagelang-pagelang": "$1{{GENDER:$2|更改}}$3的页面语言:从$4改为$5。", + "default-skin-not-found": "天哪!您wiki的默认皮肤($wgDefaultSkin)$1不可用。您的安装版本看起来需要包含以下皮肤。参见MediaWiki官网手册[https://www.mediawiki.org/wiki/Manual:Skin_configuration “皮肤配置”]获取如何启用他们并设置为默认。\n\n$2\n\n; 如果您刚刚安装完了MediaWiki的话:\n: 您可能是从git库安装的,或者使用其他方法直接从源代码安装的。希望如此。尝试通过以下方法从[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org的皮肤存储库]安装一些皮肤:\n:* 下载[https://www.mediawiki.org/wiki/Download/zh-hans 打包安装器],这会预装一些皮肤和扩展。您可在此处复制粘贴skins/。\n:* 通过git直接克隆mediawiki/skins/*存储库中的一个至您的MediaWiki副本的skins/。\n: 做这些事应该不会打扰您的git存储库如果你是MediaWiki开发人员的话。\n\n; 如果您升级了您的MediaWiki的话:\n: MediaWiki 1.24版本起不再自动启用已安装皮肤(参见[https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery 此手册])。您可复制粘贴以下文本至您wiki的LocalSettings.php以启用安装的皮肤:\n\n
    $3
    \n\n; 如果您已经修改了LocalSettings.php:\n: 请再次检查皮肤名以确保不存在错误拼写。", + "default-skin-not-found-no-skins": "天哪!您wiki的默认皮肤($wgDefaultSkin)$1不可用。而且您没有安装任何皮肤。\n\n; 如果您刚刚安装完了MediaWiki的话:\n: 您可能是从git库安装的,或者使用其他方法直接从源代码安装的。希望如此。尝试通过以下方法从[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org的皮肤存储库]安装一些皮肤:\n:* 下载[https://www.mediawiki.org/wiki/Download/zh-hans 打包安装器],这会预装一些皮肤和扩展。您可在此处复制粘贴skins/。\n:* 通过git直接克隆mediawiki/skins/*存储库中的一个至您的MediaWiki副本的skins/。\n: 做这些事应该不会打扰您的git存储库如果你是MediaWiki开发人员的话。参见MediaWiki官网手册[https://www.mediawiki.org/wiki/Manual:Skin_configuration “皮肤配置”]获取如何启用他们并设置为默认。", + "default-skin-not-found-row-enabled": "* $1 / $2(已启用)", + "default-skin-not-found-row-disabled": "* $1 / $2('''已禁用''')" } diff --git a/languages/i18n/zh-hant.json b/languages/i18n/zh-hant.json index 4067d4e56d..a51a673285 100644 --- a/languages/i18n/zh-hant.json +++ b/languages/i18n/zh-hant.json @@ -55,7 +55,9 @@ "Mywood", "Cwek", "Impersonator 1", - "LNDDYL" + "LNDDYL", + "Cathypilot0117", + "NigelSoft" ] }, "tog-underline": "連結底線:", @@ -274,16 +276,16 @@ "aboutpage": "Project:About", "copyright": "除非額外說明,否則本站內容均使用 $1 授權條款。", "copyrightpage": "{{ns:project}}:Copyrights", - "currentevents": "新聞動態", - "currentevents-url": "Project:新聞動態", + "currentevents": "最新事件", + "currentevents-url": "Project:Current events", "disclaimers": "免責聲明", "disclaimerpage": "Project:General disclaimer", "edithelp": "編輯説明", "mainpage": "首頁", "mainpage-description": "首頁", - "policy-url": "Project:方針", - "portal": "社群主頁", - "portal-url": "Project:社群專頁", + "policy-url": "Project:Policy", + "portal": "社群入口", + "portal-url": "Project:Community portal", "privacy": "隱私政策", "privacypage": "Project:Privacy policy", "badaccess": "權限錯誤", @@ -310,6 +312,9 @@ "hidetoc": "隱藏", "collapsible-collapse": "合併", "collapsible-expand": "展開", + "confirmable-confirm": "{{GENDER:$1|您}}確定嗎?", + "confirmable-yes": "是", + "confirmable-no": "否", "thisisdeleted": "檢視或還原 $1 ?", "viewdeleted": "檢視 $1?", "restorelink": "$1 個已刪除的編輯", @@ -394,7 +399,7 @@ "invalidtitle-knownnamespace": "無效的標題,命名空間 \"$2\" 與名稱 \"$3\"", "invalidtitle-unknownnamespace": "無效的標題,不明的命名空間編號 $1 與名稱 \"$2\"", "exception-nologin": "未登入", - "exception-nologin-text": "您需要先 [[Special:Userlogin|登入]] 檢視或者編輯此頁面。", + "exception-nologin-text": "請先登入以檢視或修改", "exception-nologin-text-manual": "請先 $1 以存取此頁面或操作。", "virus-badscanner": "錯誤的設定:不明的病毒掃瞄程式:$1", "virus-scanfailed": "掃瞄失敗 (代碼 $1)", @@ -705,10 +710,10 @@ "parser-template-recursion-depth-warning": "超出樣版遞迴深度限制 ($1)", "language-converter-depth-warning": "已超出語言轉換器深度限制 ($1)", "node-count-exceeded-category": "節點數量超出限制的頁面", - "node-count-exceeded-category-desc": "用來顯示超過節點數量頁面的分類。", + "node-count-exceeded-category-desc": "這個頁面超出最大節點數", "node-count-exceeded-warning": "頁面超出節點數量限制", "expansion-depth-exceeded-category": "展開深度超出限制的頁面", - "expansion-depth-exceeded-category-desc": "這是超出展開深度頁面的分類。", + "expansion-depth-exceeded-category-desc": "頁面超出顯示範圍", "expansion-depth-exceeded-warning": "頁面超出展開深度限制", "parser-unstrip-loop-warning": "偵測到 Unstrip 迴圈", "parser-unstrip-recursion-limit": "Unstrip 遞迴超出限制 ($1)", @@ -876,7 +881,6 @@ "searchprofile-advanced-tooltip": "搜尋自訂命名空間", "search-result-size": "$1 ($2 個字)", "search-result-category-size": "$1 位成員 ($2 個子分類,$3 個檔案)", - "search-result-score": "相關度:$1%", "search-redirect": "(重新導向 $1)", "search-section": "(章節 $1)", "search-file-match": "(符合檔案內容)", @@ -903,7 +907,7 @@ "preferences": "偏好設定", "mypreferences": "偏好設定", "prefs-edits": "編輯次數:", - "prefsnologintext2": "請 $1 以更改您的偏好設定。", + "prefsnologintext2": "請登入以更改您的偏好設定。", "prefs-skin": "外觀", "skin-preview": "預覽", "datedefault": "預設值", @@ -1009,7 +1013,7 @@ "userrights-lookup-user": "管理使用者群組", "userrights-user-editname": "輸入使用者名稱:", "editusergroup": "編輯使用者群組", - "editinguser": "變更使用者 '''[[User:$1|$1]]''' 的使用者權限 $2", + "editinguser": "變更使用者 [[User:$1|$1]] 的使用者權限 $2", "userrights-editusergroup": "編輯使用者群組", "saveusergroups": "儲存使用者群組", "userrights-groupsmember": "所屬群組:", @@ -1127,7 +1131,7 @@ "action-minoredit": "標示此編輯為小修訂", "action-move": "移動此頁面", "action-move-subpages": "移動此頁面與它的子頁面", - "action-move-rootuserpages": "移動使用者根頁面", + "action-move-rootuserpages": "移動根使用者頁面", "action-move-categorypages": "移動分類頁面", "action-movefile": "移動此檔案", "action-upload": "上傳此檔案", @@ -1280,8 +1284,6 @@ "uploadwarning": "上傳警告", "uploadwarning-text": "請修改以下的檔案描述並重試。", "savefile": "儲存檔案", - "uploadedimage": "已上傳 \"[[$1]]\"", - "overwroteimage": "已上傳新版本的 \"[[$1]]\"", "uploaddisabled": "己停用上傳。", "copyuploaddisabled": "己停用使用 URL 上傳。", "uploaddisabledtext": "已停用檔案上傳。", @@ -1689,17 +1691,17 @@ "trackingcategories-desc": "分類收錄準則", "noindex-category-desc": "命名空間允許,且含有魔術字 __NOINDEX__ 未被機器人列入索引的頁面。", "index-category-desc": "命名空間允許,且含有魔術字 __INDEX__ 被機器人列入索引的頁面。", - "post-expand-template-inclusion-category-desc": "展開顯示所有樣版後,頁面大小超出 $wgMaxArticleSize 限制,因此部份樣版將不會顯示。", - "post-expand-template-argument-category-desc": "在展開模樣版參數之後 (有些於三括號中,如 {{{Foo}}}),頁面大小超過$wgMaxArticleSize 設定的限制。", + "post-expand-template-inclusion-category-desc": "當展開所有模組,大小大於$wgMaxArticleSize,因此一些模組尚未展開", + "post-expand-template-argument-category-desc": "展開樣版參數之後 (有些於三括號中,如 {{{Foo}}}),頁面大小超過$wgMaxArticleSize 設定的限制。", "expensive-parserfunction-category-desc": "頁面使用太多消耗系統資源的分析器函數 (如 #ifexist)。\n請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]。", - "broken-file-category-desc": "若該頁面包含損壞的檔案連結則新增分類 (內嵌檔案連結的檔案不存在時)", - "hidden-category-category-desc": "此分類帶有__HIDDENCAT__,它預設防止於頁面分類連接盒中顯示。", + "broken-file-category-desc": "頁面包含損壞的檔案連結 (內嵌檔案連結的檔案不存在時)", + "hidden-category-category-desc": "該分類使用了 __HIDDENCAT__,可預設避免在頁面中顯示該分類的分類連結框。", "trackingcategories-nodesc": "並無說明。", "trackingcategories-disabled": "分類被禁用", "mailnologin": "沒有傳送位址", "mailnologintext": "您必須先 [[Special:UserLogin|登入]]\n並在 [[Special:Preferences|偏好設定]]\n中設定一個有效的電子郵件位址才可以傳送信件給其他使用者。", - "emailuser": "E-mail該使用者", - "emailuser-title-target": "E-mail該{{GENDER:$1|使用者}}", + "emailuser": "Email 此使用者", + "emailuser-title-target": "Email 給此{{GENDER:$1|使用者}}", "emailuser-title-notarget": "E-mail給使用者", "emailpage": "E-mail 給使用者", "emailpagetext": "您可以使用以下表格傳送電子郵件給這位 {{Gender:$1|使用者}}。\n您在 [[Special:Preferences|偏好設定]] 中所輸入的電子郵件位址將會作為郵件的 \"寄件人\",因此該使用者可直接回覆您。", @@ -1723,14 +1725,14 @@ "emailccsubject": "您寄給 $1 的訊息副本:$2", "emailsent": "電子郵件已寄出", "emailsenttext": "您的電子郵件訊息已經寄出。", - "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"E-mail該使用者\" 功能寄給 $2。", + "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"Email 給此使用者\" 功能寄給 $2。", "usermessage-summary": "留給系統訊息。", "usermessage-editor": "系統訊息", "watchlist": "監視清單", "mywatchlist": "監視清單", "watchlistfor2": "$1 的監視清單 $2", "nowatchlist": "您的監視清單沒有任何項目。", - "watchlistanontext": "請 $1 以檢視或編輯您的監視清單。", + "watchlistanontext": "請先登入以檢視或修改在監控表的項目", "watchnologin": "尚未登入", "addwatch": "新增至監視清單", "addedwatchtext": "已於[[Special:Watchlist|您的監視清單]]新增頁面 \"[[:$1]]\"。\n未來對此頁面及其關聯的對話頁面的變更將會在此清單中列出。", @@ -1794,6 +1796,7 @@ "delete-edit-reasonlist": "編輯刪除理由", "delete-toobig": "這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除此類頁面的動作已經被限制,以防止在{{SITENAME}}上的意外擾亂。", "delete-warning-toobig": "這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除它可能會擾亂{{SITENAME}}的資料庫操作;在繼續此動作前請小心。", + "delete-cantedit": "您沒有權限編輯此頁面,您無法刪除。", "deleting-backlinks-warning": "警告:您正要刪除的頁面有[[Special:WhatLinksHere/{{FULLPAGENAME}}|其他頁面]]連結或引用。", "rollback": "還原編輯", "rollback_short": "還原", @@ -1955,7 +1958,7 @@ "autoblockid": "自動查封 #$1", "block": "封鎖使用者", "unblock": "解除封鎖使用者", - "blockip": "封鎖使用者", + "blockip": "封鎖{{GENDER:$1|使用者}}", "blockip-legend": "封鎖使用者", "blockiptext": "填寫以下單據可封鎖特定 IP 位址或使用者名稱的存取權限。\n這個動作應用來避免破壞行為,可根據 [[{{MediaWiki:Policy-url}}|管理政策]]。\n請在下方填寫一個具體的原因 (例如:引述一段破壞頁面的事實)。", "ipaddressorusername": "IP 位址或使用者名稱:", @@ -1966,11 +1969,11 @@ "ipbcreateaccount": "禁止建立帳號", "ipbemailban": "禁止使用者傳送電子郵件", "ipbenableautoblock": "自動封鎖此使用者最後使用的 IP 位址,以及所有之後嘗試編輯使用的 IP 位址", - "ipbsubmit": "封禁該使用者", + "ipbsubmit": "封鎖此使用者", "ipbother": "其它時間:", "ipboptions": "2小時:2 hours,1天:1 day,3天:3 days,1周:1 week,2周:2 weeks,1個月:1 month,3個月:3 months,6個月:6 months,1年:1 year,無限期:infinite", "ipbhidename": "在編輯及清單中隱藏使用者名稱", - "ipbwatchuser": "監視這位使用者的使用者頁面以及其對話頁面", + "ipbwatchuser": "監視這位使用者的使用者頁面及其對話頁面", "ipb-disableusertalk": "避免在封鎖此使用者的期間編輯自己的對話頁面", "ipb-change-block": "使用現有設定重新封鎖使用者", "ipb-confirm": "確認封鎖", @@ -1984,7 +1987,7 @@ "ipb-unblock-addr": "解除封鎖 $1", "ipb-unblock": "解除封鎖使用者名稱或 IP 位址", "ipb-blocklist": "檢視目前的封鎖", - "ipb-blocklist-contribs": "$1的貢獻", + "ipb-blocklist-contribs": "{{GENDER:$1|$1}} 的貢獻", "unblockip": "解除封鎖使用者", "unblockiptext": "填寫以下單據以取消先前封鎖的 IP 位址或使用者名稱。", "ipusubmit": "移除這個封鎖", @@ -2083,7 +2086,7 @@ "movenologintext": "您必須是已註冊的使用者並且 [[Special:UserLogin|登入]] 才可移動頁面。", "movenotallowed": "您沒有權限移動頁面。", "movenotallowedfile": "您沒有權限移動檔案。", - "cant-move-user-page": "您沒有權限移動使用者頁面 (除使用者子頁面外)。", + "cant-move-user-page": "您沒有權限移動使用者頁面 (子頁面除外)。", "cant-move-to-user-page": "您沒有權限移動頁面至使用者頁面 (除使用者子頁面外)。", "cant-move-category-page": "您沒有權限移動分類頁面。", "cant-move-to-category-page": "您沒有權限移動頁面至分類頁面。", @@ -3057,6 +3060,9 @@ "logentry-rights-rights": "$1 {{GENDER:$2|已更改}} $3 的群組成員資格由 $4 成為 $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|已更改}} $3 的群組成員資格", "logentry-rights-autopromote": "$1 已自動{{GENDER:$2|提升}}從 $4 成為 $5", + "logentry-upload-upload": "$1 {{GENDER:$2|已上傳}} $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|上傳了}}新版本的 $3", + "logentry-upload-revert": "$1 {{GENDER:$2|已上傳}} $3", "rightsnone": "(無)", "feedback-bugornote": "如果您準備要詳細描述一個技術問題,請至 [$1 回報問題]。\n或您可以使用以下的簡易表單回報問題,您的使用者名稱與評論將被新增到頁面 \"[$3 $2]\"。", "feedback-subject": "主旨:", @@ -3159,5 +3165,8 @@ "action-pagelang": "更改頁面語言", "log-name-pagelang": "更改語言日誌", "log-description-pagelang": "這是頁面語言更改日誌。", - "logentry-pagelang-pagelang": "$1 {{GENDER:$2|已更改}}頁面 $3 的語言從 $4 到 $5。" + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|已更改}}頁面 $3 的語言從 $4 到 $5。", + "default-skin-not-found": "注意! 此維基預設的介面($wgDefaultSkin), $1目前無法使用.", + "default-skin-not-found-row-enabled": "* $1 / $2 (已開啟)", + "default-skin-not-found-row-disabled": "* $1 / $2 ('''已關閉''')" } diff --git a/languages/messages/MessagesArq.php b/languages/messages/MessagesArq.php index 0fcf660417..15c8142183 100644 --- a/languages/messages/MessagesArq.php +++ b/languages/messages/MessagesArq.php @@ -8,5 +8,12 @@ * */ +$digitTransformTable = array(); + +$separatorTransformTable = array( + '.' => ',', + ',' => '.' +); + $fallback = 'ar'; diff --git a/maintenance/archives/patch-hitcounter.sql b/maintenance/archives/patch-hitcounter.sql index c87c9592e5..2d698f6865 100644 --- a/maintenance/archives/patch-hitcounter.sql +++ b/maintenance/archives/patch-hitcounter.sql @@ -6,4 +6,4 @@ CREATE TABLE /*$wgDBprefix*/hitcounter ( hc_id INTEGER UNSIGNED NOT NULL -) ENGINE=HEAP MAX_ROWS=25000; +) ENGINE=MEMORY MAX_ROWS=25000; diff --git a/maintenance/archives/patch-mimesearch-indexes.sql b/maintenance/archives/patch-mimesearch-indexes.sql index bd348c46c2..8d9426ea77 100644 --- a/maintenance/archives/patch-mimesearch-indexes.sql +++ b/maintenance/archives/patch-mimesearch-indexes.sql @@ -1,4 +1,4 @@ --- Add indexes to the mime types in image for use on Special:MIMEsearch, +-- Add indexes to the MIME types in image for use on Special:MIMEsearch, -- changes a query like -- -- SELECT img_name FROM image WHERE img_major_mime = "image" AND img_minor_mime = "svg"; diff --git a/maintenance/archives/patch-profiling.sql b/maintenance/archives/patch-profiling.sql index 0a0e4e1a58..6ad1622426 100644 --- a/maintenance/archives/patch-profiling.sql +++ b/maintenance/archives/patch-profiling.sql @@ -7,6 +7,6 @@ CREATE TABLE /*_*/profiling ( pf_memory float NOT NULL default 0, pf_name varchar(255) NOT NULL default '', pf_server varchar(30) NOT NULL default '' -) ENGINE=HEAP; +) ENGINE=MEMORY; CREATE UNIQUE INDEX /*i*/pf_name_server ON /*_*/profiling (pf_name, pf_server); \ No newline at end of file diff --git a/maintenance/dev/includes/router.php b/maintenance/dev/includes/router.php index 246d6fc649..0a65e31e9e 100644 --- a/maintenance/dev/includes/router.php +++ b/maintenance/dev/includes/router.php @@ -80,7 +80,7 @@ if ( !$mime ) { } } if ( $mime ) { - # Use custom handling to serve files with a known mime type + # Use custom handling to serve files with a known MIME type # This way we can serve things like .svg files that the built-in # PHP webserver doesn't understand. # ;) Nicely enough we just happen to bundle a mime.types file diff --git a/maintenance/findHooks.php b/maintenance/findHooks.php index 9929cf9b67..074388f68d 100644 --- a/maintenance/findHooks.php +++ b/maintenance/findHooks.php @@ -136,7 +136,7 @@ class FindHooks extends Maintenance { /** * Get the hook documentation, either locally or from MediaWiki.org - * @return array of documented hooks + * @return Array of documented hooks */ private function getHooksFromDoc( $doc ) { if ( $this->hasOption( 'online' ) ) { @@ -148,8 +148,8 @@ class FindHooks extends Maintenance { /** * Get hooks from a local file (for example docs/hooks.txt) - * @param string $doc filename to look in - * @return array Array of documented hooks + * @param string $doc Filename to look in + * @return Array of documented hooks */ private function getHooksFromLocalDoc( $doc ) { $m = array(); @@ -161,7 +161,7 @@ class FindHooks extends Maintenance { /** * Get hooks from www.mediawiki.org using the API - * @return array of documented hooks + * @return Array of documented hooks */ private function getHooksFromOnlineDoc() { // All hooks @@ -199,7 +199,7 @@ class FindHooks extends Maintenance { /** * Get hooks from a PHP file * @param string $file Full filename to the PHP file. - * @return array of hooks found. + * @return Array of hooks found. */ private function getHooksFromFile( $file ) { $content = file_get_contents( $file ); @@ -216,7 +216,7 @@ class FindHooks extends Maintenance { /** * Get hooks from the source code. * @param string $path Directory where the include files can be found - * @return array Array of hooks found. + * @return Array of hooks found. */ private function getHooksFromPath( $path ) { $hooks = array(); @@ -236,7 +236,7 @@ class FindHooks extends Maintenance { /** * Get bad hooks (where the hook name could not be determined) from a PHP file * @param string $file Full filename to the PHP file. - * @return array Array of bad wfRunHooks() lines + * @return Array of bad wfRunHooks() lines */ private function getBadHooksFromFile( $file ) { $content = file_get_contents( $file ); @@ -254,7 +254,7 @@ class FindHooks extends Maintenance { /** * Get bad hooks from the source code. * @param string $path Directory where the include files can be found - * @return array Array of bad wfRunHooks() lines + * @return Array of bad wfRunHooks() lines */ private function getBadHooksFromPath( $path ) { $hooks = array(); diff --git a/maintenance/findMissingFiles.php b/maintenance/findMissingFiles.php new file mode 100644 index 0000000000..8c7169980a --- /dev/null +++ b/maintenance/findMissingFiles.php @@ -0,0 +1,85 @@ +mDescription = 'Find registered files with no corresponding file.'; + $this->addOption( 'start', 'Starting file name', false, true ); + $this->setBatchSize( 200 ); + } + + function execute() { + $lastName = $this->getOption( 'start', '' ); + + $repo = RepoGroup::singleton()->getLocalRepo(); + $dbr = $repo->getSlaveDB(); + $be = $repo->getBackend(); + + do { + $res = $dbr->select( 'image', + 'img_name', + array( "img_name >= " . $dbr->addQuotes( $lastName ) ), + __METHOD__, + array( 'ORDER BY' => 'img_name', 'LIMIT' => $this->mBatchSize ) + ); + + // Check if any of these files are missing... + $pathsByName = array(); + foreach ( $res as $row ) { + $file = $repo->newFile( $row->img_name ); + $pathsByName[$row->img_name] = $file->getPath(); + $lastName = $row->img_name; + } + $be->preloadFileStat( array( 'srcs' => $pathsByName ) ); + foreach ( $pathsByName as $path ) { + if ( $be->fileExists( array( 'src' => $path ) ) === false ) { + $this->output( "$path\n" ); + } + } + + // Find all missing old versions of any of the files in this batch... + if ( count( $pathsByName ) ) { + $ores = $dbr->select( 'oldimage', + array( 'oi_name', 'oi_archive_name' ), + array( 'oi_name' => array_keys( $pathsByName ) ), + __METHOD__ + ); + foreach ( $ores as $row ) { + if ( !strlen( $row->oi_archive_name ) ) { + continue; // broken row + } + $file = $repo->newFromArchiveName( $row->oi_name, $row->oi_archive_name ); + $path = $file->getPath(); + if ( $be->fileExists( array( 'src' => $path ) ) === false ) { + $this->output( "$path\n" ); + } + } + } + } while ( $res->numRows() >= $this->mBatchSize ); + } +} + +$maintClass = 'FindMissingFiles'; +require_once RUN_MAINTENANCE_IF_MAIN; diff --git a/maintenance/interwiki.list b/maintenance/interwiki.list index 8efabef010..0660e55faf 100644 --- a/maintenance/interwiki.list +++ b/maintenance/interwiki.list @@ -45,6 +45,7 @@ rfc|http://www.rfc-editor.org/rfc/rfc$1.txt|0 s23wiki|http://s23.org/wiki/$1|0 seattlewireless|http://seattlewireless.net/$1|0 senseislibrary|http://senseis.xmp.net/?$1|0 +shoutwiki|http://www.shoutwiki.com/wiki/$1|0 sourceforge|http://sourceforge.net/$1|0 sourcewatch|http://www.sourcewatch.org/index.php?title=$1|0 squeak|http://wiki.squeak.org/squeak/$1|0 @@ -54,6 +55,7 @@ tmnet|http://www.technomanifestos.net/?$1|0 theopedia|http://www.theopedia.com/$1|0 twiki|http://twiki.org/cgi-bin/view/$1|0 uea|http://uea.org/vikio/index.php/$1|0 +uncyclopedia|http://en.uncyclopedia.co/wiki/$1|0 unreal|http://wiki.beyondunreal.com/$1|0 usemod|http://www.usemod.com/cgi-bin/wiki.pl?$1|0 webseitzwiki|http://webseitz.fluxent.com/wiki/$1|0 diff --git a/maintenance/interwiki.sql b/maintenance/interwiki.sql index 53559ef30f..aad0cc3b15 100644 --- a/maintenance/interwiki.sql +++ b/maintenance/interwiki.sql @@ -47,6 +47,7 @@ REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local) VALUES ('s23wiki','http://s23.org/wiki/$1',0), ('seattlewireless','http://seattlewireless.net/$1',0), ('senseislibrary','http://senseis.xmp.net/?$1',0), +('shoutwiki','http://www.shoutwiki.com/wiki/$1',0), ('sourceforge','http://sourceforge.net/$1',0), ('sourcewatch','http://www.sourcewatch.org/index.php?title=$1',0), ('squeak','http://wiki.squeak.org/squeak/$1',0), @@ -56,6 +57,7 @@ REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local) VALUES ('theopedia','http://www.theopedia.com/$1',0), ('twiki','http://twiki.org/cgi-bin/view/$1',0), ('uea','http://uea.org/vikio/index.php/$1',0), +('uncyclopedia','http://en.uncyclopedia.co/wiki/$1',0), ('unreal','http://wiki.beyondunreal.com/$1',0), ('usemod','http://www.usemod.com/cgi-bin/wiki.pl?$1',0), ('webseitzwiki','http://webseitz.fluxent.com/wiki/$1',0), diff --git a/maintenance/jsduck/config.json b/maintenance/jsduck/config.json index eed76b6f1c..e97f2923fb 100644 --- a/maintenance/jsduck/config.json +++ b/maintenance/jsduck/config.json @@ -26,6 +26,7 @@ "../../resources/src/jquery/jquery.checkboxShiftClick.js", "../../resources/src/jquery/jquery.client.js", "../../resources/src/jquery/jquery.colorUtil.js", + "../../resources/src/jquery/jquery.confirmable.js", "../../resources/src/jquery/jquery.footHovzer.js", "../../resources/src/jquery/jquery.getAttrs.js", "../../resources/src/jquery/jquery.hidpi.js", diff --git a/maintenance/language/languages.inc b/maintenance/language/languages.inc index 9c9b7ff07c..fb496cbc00 100644 --- a/maintenance/language/languages.inc +++ b/maintenance/language/languages.inc @@ -55,7 +55,7 @@ class Languages { /** @var array Magic words */ protected $mMagicWords; - /** @var array Special page aliases */ + /** @var array Special page aliases */ protected $mSpecialPageAliases; /** diff --git a/maintenance/parse.php b/maintenance/parse.php index 9af57da9f8..638d7c5b2a 100644 --- a/maintenance/parse.php +++ b/maintenance/parse.php @@ -113,7 +113,7 @@ class CLIParser extends Maintenance { * Default title is 'CLIParser', it can be overriden with the option * --title * - * @return Title object + * @return Title */ protected function getTitle() { $title = $this->getOption( 'title' ) diff --git a/maintenance/refreshImageMetadata.php b/maintenance/refreshImageMetadata.php index 8cb23fd528..831118ca7b 100644 --- a/maintenance/refreshImageMetadata.php +++ b/maintenance/refreshImageMetadata.php @@ -70,7 +70,7 @@ class RefreshImageMetadata extends Maintenance { $this->addOption( 'mime', - '(Inefficient!) Only refresh files with this mime type. Can accept wild-card image/*', + '(Inefficient!) Only refresh files with this MIME type. Can accept wild-card image/*', false, true ); diff --git a/maintenance/sql.php b/maintenance/sql.php index c947a4c36f..389b2701e5 100644 --- a/maintenance/sql.php +++ b/maintenance/sql.php @@ -136,7 +136,7 @@ class MwSql extends Maintenance { /** * Print the results, callback for $db->sourceStream() * @param ResultWrapper $res The results object - * @param DatabaseBase $db object + * @param DatabaseBase $db */ public function sqlPrintResult( $res, $db ) { if ( !$res ) { diff --git a/maintenance/sqlite.inc b/maintenance/sqlite.inc index 9729a726bb..43b259806c 100644 --- a/maintenance/sqlite.inc +++ b/maintenance/sqlite.inc @@ -42,7 +42,7 @@ class Sqlite { * Will throw exceptions on SQL errors * @param array|string $files * @throws MWException - * @return string|bool true if no error or error string in case of errors + * @return True if no error or error string in case of errors */ public static function checkSqlSyntax( $files ) { if ( !Sqlite::isPresent() ) { diff --git a/maintenance/tables.sql b/maintenance/tables.sql index 4b9a5e22c1..f181e0fbdc 100644 --- a/maintenance/tables.sql +++ b/maintenance/tables.sql @@ -736,7 +736,7 @@ CREATE UNIQUE INDEX /*i*/ss_row_id ON /*_*/site_stats (ss_row_id); -- CREATE TABLE /*_*/hitcounter ( hc_id int unsigned NOT NULL -) ENGINE=HEAP MAX_ROWS=25000; +) ENGINE=MEMORY MAX_ROWS=25000; -- diff --git a/maintenance/undelete.php b/maintenance/undelete.php index c890c69b6c..adebd277aa 100644 --- a/maintenance/undelete.php +++ b/maintenance/undelete.php @@ -47,7 +47,7 @@ class Undelete extends Maintenance { if ( !$wgUser ) { $this->error( "Invalid username", true ); } - $archive = new PageArchive( $title ); + $archive = new PageArchive( $title, RequestContext::getMain()->getConfig() ); $this->output( "Undeleting " . $title->getPrefixedDBkey() . '...' ); $archive->undelete( array(), $reason ); $this->output( "done\n" ); diff --git a/profileinfo.php b/profileinfo.php index 8120599e02..762af69ccb 100644 --- a/profileinfo.php +++ b/profileinfo.php @@ -163,15 +163,18 @@ if ( isset( $_REQUEST['expand'] ) ) { } } +// @codingStandardsIgnoreStart class profile_point { - var $name; - var $count; - var $time; - var $children; + // @codingStandardsIgnoreEnd - static $totaltime, $totalmemory, $totalcount; + public $name; + public $count; + public $time; + public $children; - function __construct( $name, $count, $time, $memory ) { + public static $totaltime, $totalmemory, $totalcount; + + public function __construct( $name, $count, $time, $memory ) { $this->name = $name; $this->count = $count; $this->time = $time; @@ -179,11 +182,11 @@ class profile_point { $this->children = array(); } - function add_child( $child ) { + public function add_child( $child ) { $this->children[] = $child; } - function display( $expand, $indent = 0.0 ) { + public function display( $expand, $indent = 0.0 ) { usort( $this->children, 'compare_point' ); $ex = isset( $expand[$this->name()] ); @@ -214,6 +217,7 @@ class profile_point { name() ) ) . $extet ?>
    + time() / self::$totaltime * 100 ); ?> memory() / self::$totalmemory * 100 ); ?> count(); ?> @@ -222,6 +226,7 @@ class profile_point { memoryPerCall() / 1024 ), 2 ); ?> time() / self::$totalcount ), 2 ); ?> memory() / self::$totalcount / 1024 ), 2 ); ?> + name; } - function count() { + public function count() { return $this->count; } - function time() { + public function time() { return $this->time; } - function memory() { + public function memory() { return $this->memory; } - function timePerCall() { + public function timePerCall() { + // @codingStandardsIgnoreStart return @( $this->time / $this->count ); + // @codingStandardsIgnoreEnd } - function memoryPerCall() { + public function memoryPerCall() { + // @codingStandardsIgnoreStart return @( $this->memory / $this->count ); + // @codingStandardsIgnoreEnd } - function callsPerRequest() { + public function callsPerRequest() { + // @codingStandardsIgnoreStart return @( $this->count / self::$totalcount ); + // @codingStandardsIgnoreEnd } - function timePerRequest() { + public function timePerRequest() { + // @codingStandardsIgnoreStart return @( $this->time / self::$totalcount ); + // @codingStandardsIgnoreEnd } - function memoryPerRequest() { + public function memoryPerRequest() { + // @codingStandardsIgnoreStart return @( $this->memory / self::$totalcount ); + // @codingStandardsIgnoreEnd } - function fmttime() { + public function fmttime() { return sprintf( '%5.02f', $this->time ); } }; function compare_point( profile_point $a, profile_point $b ) { + // @codingStandardsIgnoreStart global $sort; + // @codingStandardsIgnoreEnd switch ( $sort ) { case 'name': return strcmp( $a->name(), $b->name() ); @@ -342,7 +359,9 @@ if ( isset( $_REQUEST['filter'] ) ) { profile_point::$totalmemory = 0.0; function getEscapedProfileUrl( $_filter = false, $_sort = false, $_expand = false ) { + // @codingStandardsIgnoreStart global $filter, $sort, $expand; + // @codingStandardsIgnoreEnd if ( $_expand === false ) { $_expand = $expand; diff --git a/resources/Resources.php b/resources/Resources.php index d3f8f7d55b..9825ba32bf 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -128,7 +128,7 @@ return array( array( 'resources/lib/jquery/jquery.js' ) ), - 'debugRaw' => false, + 'raw' => true, 'targets' => array( 'desktop', 'mobile' ), ), @@ -191,6 +191,19 @@ return array( 'jquery.colorUtil' => array( 'scripts' => 'resources/src/jquery/jquery.colorUtil.js', ), + 'jquery.confirmable' => array( + 'scripts' => array( + 'resources/src/jquery/jquery.confirmable.js', + 'resources/src/jquery/jquery.confirmable.mediawiki.js', + ), + 'messages' => array( + 'confirmable-confirm', + 'confirmable-yes', + 'confirmable-no', + ), + 'styles' => 'resources/src/jquery/jquery.confirmable.css', + 'dependencies' => 'mediawiki.jqueryMsg', + ), // Use mediawiki.cookie in new code, rather than jquery.cookie. 'jquery.cookie' => array( 'scripts' => 'resources/lib/jquery/jquery.cookie.js', @@ -758,7 +771,7 @@ return array( 'mediawiki' => array( 'scripts' => 'resources/src/mediawiki/mediawiki.js', 'debugScripts' => 'resources/src/mediawiki/mediawiki.log.js', - 'debugRaw' => false, + 'raw' => true, 'targets' => array( 'desktop', 'mobile' ), ), 'mediawiki.api' => array( @@ -798,6 +811,9 @@ return array( 'user.tokens', ), ), + 'mediawiki.content.json' => array( + 'styles' => 'resources/src/mediawiki/mediawiki.content.json.css', + ), 'mediawiki.debug' => array( 'scripts' => array( 'resources/src/mediawiki/mediawiki.debug.js', @@ -862,6 +878,9 @@ return array( ), 'mediawiki.htmlform' => array( 'scripts' => 'resources/src/mediawiki/mediawiki.htmlform.js', + 'dependencies' => array( + 'jquery.mwExtension', + ), 'messages' => array( 'htmlform-chosen-placeholder' ), ), 'mediawiki.icon' => array( diff --git a/resources/lib/oojs-ui/i18n/zh-hans.json b/resources/lib/oojs-ui/i18n/zh-hans.json index 50df67a8b9..02bdafad6a 100644 --- a/resources/lib/oojs-ui/i18n/zh-hans.json +++ b/resources/lib/oojs-ui/i18n/zh-hans.json @@ -15,14 +15,15 @@ "Xiaomingyan", "Yfdyh000", "Zhangjintao", - "乌拉跨氪" + "乌拉跨氪", + "Great Brightstar" ] }, "ooui-outline-control-move-down": "下移项", "ooui-outline-control-move-up": "上移项", "ooui-outline-control-remove": "删除项", "ooui-toolbar-more": "更多", - "ooui-dialog-message-accept": "好", + "ooui-dialog-message-accept": "确定", "ooui-dialog-message-reject": "取消", "ooui-dialog-process-error": "发生一些错误", "ooui-dialog-process-dismiss": "解除", diff --git a/resources/lib/oojs-ui/oojs-ui-agora.css b/resources/lib/oojs-ui/oojs-ui-agora.css index 525304c765..22c307949d 100644 --- a/resources/lib/oojs-ui/oojs-ui-agora.css +++ b/resources/lib/oojs-ui/oojs-ui-agora.css @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.1.0-pre (dd294dc785) + * OOjs UI v0.1.0-pre (0e50d2e336) * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2014 OOjs Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2014-07-30T23:10:53Z + * Date: 2014-08-06T12:56:55Z */ .oo-ui-dialog-content > .oo-ui-window-head, .oo-ui-dialog-content > .oo-ui-window-body, diff --git a/resources/lib/oojs-ui/oojs-ui-apex.css b/resources/lib/oojs-ui/oojs-ui-apex.css index 1267a3c735..c53772e4b9 100644 --- a/resources/lib/oojs-ui/oojs-ui-apex.css +++ b/resources/lib/oojs-ui/oojs-ui-apex.css @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.1.0-pre (dd294dc785) + * OOjs UI v0.1.0-pre (0e50d2e336) * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2014 OOjs Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2014-07-30T23:10:53Z + * Date: 2014-08-06T12:56:55Z */ .oo-ui-dialog-content > .oo-ui-window-head, .oo-ui-dialog-content > .oo-ui-window-body, diff --git a/resources/lib/oojs-ui/oojs-ui.js b/resources/lib/oojs-ui/oojs-ui.js index 737113e8cd..6f63575e3f 100644 --- a/resources/lib/oojs-ui/oojs-ui.js +++ b/resources/lib/oojs-ui/oojs-ui.js @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.1.0-pre (dd294dc785) + * OOjs UI v0.1.0-pre (0e50d2e336) * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2014 OOjs Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2014-07-30T23:10:53Z + * Date: 2014-08-06T12:56:55Z */ ( function ( OO ) { @@ -1114,6 +1114,7 @@ OO.ui.Frame = function OoUiFrame( config ) { // Properties this.loading = null; this.config = config; + this.dir = null; // Initialize this.$element @@ -1287,7 +1288,7 @@ OO.ui.Frame.prototype.load = function () { win = this.$element.prop( 'contentWindow' ); doc = win.document; - // Figure out directionality: + // Cache directionality this.dir = OO.ui.Element.getDir( this.$element ) || 'ltr'; // Initialize contents @@ -1298,7 +1299,7 @@ OO.ui.Frame.prototype.load = function () { doc.write( '' + '' + - '' + + '' + '' + '' ); @@ -1331,6 +1332,15 @@ OO.ui.Frame.prototype.setSize = function ( width, height ) { return this; }; +/** + * Get the directionality of the frame + * + * @return {string} Directionality, 'ltr' or 'rtl' + */ +OO.ui.Frame.prototype.getDir = function () { + return this.dir; +}; + /** * Container for elements. * diff --git a/resources/lib/oojs-ui/oojs-ui.svg.css b/resources/lib/oojs-ui/oojs-ui.svg.css index bffc230ee6..aa5e6ac541 100644 --- a/resources/lib/oojs-ui/oojs-ui.svg.css +++ b/resources/lib/oojs-ui/oojs-ui.svg.css @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.1.0-pre (dd294dc785) + * OOjs UI v0.1.0-pre (0e50d2e336) * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2014 OOjs Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2014-07-30T23:10:53Z + * Date: 2014-08-06T12:56:55Z */ /* Textures */ diff --git a/resources/src/jquery/jquery.confirmable.css b/resources/src/jquery/jquery.confirmable.css new file mode 100644 index 0000000000..de690726f8 --- /dev/null +++ b/resources/src/jquery/jquery.confirmable.css @@ -0,0 +1,28 @@ +.jquery-confirmable-button { + /* Automatically flipped */ + margin-left: 1ex; +} + +.jquery-confirmable-wrapper { + /* Line breaks within the interface text are unpleasant */ + white-space: nowrap; + /* Hiding the original text when it slides to the left */ + overflow: hidden; +} + +.jquery-confirmable-wrapper, +.jquery-confirmable-element, +.jquery-confirmable-interface { + /* We need inline-block to be able to size the elements and calculate their dimensions */ + display: inline-block; + /* inline-block elements in this context align to baseline by default */ + vertical-align: bottom; +} + +.jquery-confirmable-element { + transition: margin 250ms cubic-bezier(0.2, 0.8, 0.2, 0.8); +} + +.jquery-confirmable-interface { + transition: width 250ms cubic-bezier(0.2, 0.8, 0.2, 0.8); +} diff --git a/resources/src/jquery/jquery.confirmable.js b/resources/src/jquery/jquery.confirmable.js new file mode 100644 index 0000000000..4b80d95323 --- /dev/null +++ b/resources/src/jquery/jquery.confirmable.js @@ -0,0 +1,168 @@ +/** + * jQuery confirmable plugin + * + * Released under the MIT License. + * + * @author Bartosz Dziewoński + * + * @class jQuery.plugin.confirmable + */ +( function ( $ ) { + var identity = function ( data ) { + return data; + }; + + /** + * Enable inline confirmation for given clickable element (like `` or `
    - - - - - - - - - -